1 2document.addEventListener('scroll', () => { 3 let search = document.getElementsByClassName('primary-menu__item__search')[0]; 4 let logo = document.getElementsByClassName('primary-menu__item__logo')[0]; 5 if (window.innerHeight < 900 && window.innerWidth > 1090 && window.innerWidth < 1330) { 6 if (window.scrollY >= window.innerHeight - 44) { 7 search.classList.add('scroll-show'); 8 logo.classList.add('scroll-show'); 9 } else { 10 search.classList.remove('scroll-show'); 11 logo.classList.remove('scroll-show'); 12 } 13 } else { 14 search.classList.remove('scroll-show'); 15 logo.classList.remove('scroll-show'); 16 } 17}); 18 19window.addEventListener('resize', () => { 20 let search = document.getElementsByClassName('primary-menu__item__search')[0]; 21 let logo = document.getElementsByClassName('primary-menu__item__logo')[0]; 22 if (window.innerHeight < 900 && window.innerWidth > 1090 && window.innerWidth < 1330) { 23 if (window.scrollY >= window.innerHeight - 44) {
24 search.classList.add('scroll-show'); 25 logo.classList.add('scroll-show'); 26 } else { 27 search.classList.remove('scroll-show'); 28 logo.classList.remove('scroll-show'); 29 } 30 } else { 31 search.classList.remove('scroll-show'); 32 logo.classList.remove('scroll-show'); 33 } 34}); 35
vendor: 42,881 bytes, lines 36-1624
36/*! 37 * jQuery JavaScript Library v3.3.1 38 * https://jquery.com/ 39 * 40 * Includes Sizzle.js 41 * https://sizzlejs.com/ 42 * 43 * Copyright JS Foundation and other contributors 44 * Released under the MIT license 45 * https://jquery.org/license 46 * 47 * Date: 2018-01-20T17:24Z 48 */ 49( function( global, factory ) { 50 51 "use strict"; 52 53 if ( typeof module === "object" && typeof module.exports === "object" ) { 54 55 // For CommonJS and CommonJS-like environments where a proper `window` 56 // is present, execute the factory and get jQuery. 57 // For environments that do not have a `window` with a `document` 58 // (such as Node.js), expose a factory as module.exports. 59 // This accentuates the need for the creation of a real `window`. 60 // e.g. var jQuery = require("jquery")(window); 61 // See ticket #14549 for more info. 62 module.exports = global.document ? 63 factory( global, true ) : 64 function( w ) { 65 if ( !w.document ) { 66 throw new Error( "jQuery requires a window with a document" ); 67 } 68 return factory( w ); 69 }; 70 } else { 71 factory( global ); 72 } 73 74// Pass this if window is not defined yet 75} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { 76 77// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 78// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode 79// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common 80// enough that all such attempts are guarded in a try block. 81"use strict"; 82 83var arr = []; 84 85var document = window.document; 86 87var getProto = Object.getPrototypeOf; 88 89var slice = arr.slice; 90 91var concat = arr.concat; 92 93var push = arr.push; 94 95var indexOf = arr.indexOf; 96 97var class2type = {}; 98 99var toString = class2type.toString; 100 101var hasOwn = class2type.hasOwnProperty; 102 103var fnToString = hasOwn.toString; 104 105var ObjectFunctionString = fnToString.call( Object ); 106 107var support = {}; 108 109var isFunction = function isFunction( obj ) { 110 111 // Support: Chrome <=57, Firefox <=52 112 // In some browsers, typeof returns "function" for HTML <object> elements 113 // (i.e., `typeof document.createElement( "object" ) === "function"`). 114 // We don't want to classify *any* DOM node as a function. 115 return typeof obj === "function" && typeof obj.nodeType !== "number"; 116 }; 117 118 119var isWindow = function isWindow( obj ) { 120 return obj != null && obj === obj.window; 121 }; 122 123 124 125 126 var preservedScriptAttributes = { 127 type: true, 128 src: true, 129 noModule: true 130 }; 131 132 function DOMEval( code, doc, node ) { 133 doc = doc || document; 134 135 var i, 136 script = doc.createElement( "script" ); 137 138 script.text = code; 139 if ( node ) { 140 for ( i in preservedScriptAttributes ) { 141 if ( node[ i ] ) { 142 script[ i ] = node[ i ]; 143 } 144 } 145 } 146 doc.head.appendChild( script ).parentNode.removeChild( script ); 147 } 148 149 150function toType( obj ) { 151 if ( obj == null ) { 152 return obj + ""; 153 } 154 155 // Support: Android <=2.3 only (functionish RegExp) 156 return typeof obj === "object" || typeof obj === "function" ? 157 class2type[ toString.call( obj ) ] || "object" : 158 typeof obj; 159} 160/* global Symbol */ 161// Defining this global in .eslintrc.json would create a danger of using the global 162// unguarded in another place, it seems safer to define global only for this module 163 164 165 166var 167 version = "3.3.1", 168 169 // Define a local copy of jQuery 170 jQuery = function( selector, context ) { 171 172 // The jQuery object is actually just the init constructor 'enhanced' 173 // Need init if jQuery is called (just allow error to be thrown if not included) 174 return new jQuery.fn.init( selector, context ); 175 }, 176 177 // Support: Android <=4.0 only 178 // Make sure we trim BOM and NBSP 179 rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; 180 181jQuery.fn = jQuery.prototype = { 182 183 // The current version of jQuery being used 184 jquery: version, 185 186 constructor: jQuery, 187 188 // The default length of a jQuery object is 0 189 length: 0, 190 191 toArray: function() { 192 return slice.call( this ); 193 }, 194 195 // Get the Nth element in the matched element set OR 196 // Get the whole matched element set as a clean array 197 get: function( num ) { 198 199 // Return all the elements in a clean array 200 if ( num == null ) { 201 return slice.call( this ); 202 } 203 204 // Return just the one element from the set 205 return num < 0 ? this[ num + this.length ] : this[ num ]; 206 }, 207 208 // Take an array of elements and push it onto the stack 209 // (returning the new matched element set) 210 pushStack: function( elems ) { 211 212 // Build a new jQuery matched element set 213 var ret = jQuery.merge( this.constructor(), elems ); 214 215 // Add the old object onto the stack (as a reference) 216 ret.prevObject = this; 217 218 // Return the newly-formed element set 219 return ret; 220 }, 221 222 // Execute a callback for every element in the matched set. 223 each: function( callback ) { 224 return jQuery.each( this, callback ); 225 }, 226 227 map: function( callback ) { 228 return this.pushStack( jQuery.map( this, function( elem, i ) { 229 return callback.call( elem, i, elem ); 230 } ) ); 231 }, 232 233 slice: function() { 234 return this.pushStack( slice.apply( this, arguments ) ); 235 }, 236 237 first: function() { 238 return this.eq( 0 ); 239 }, 240 241 last: function() { 242 return this.eq( -1 ); 243 }, 244 245 eq: function( i ) { 246 var len = this.length, 247 j = +i + ( i < 0 ? len : 0 ); 248 return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); 249 }, 250 251 end: function() { 252 return this.prevObject || this.constructor(); 253 }, 254 255 // For internal use only. 256 // Behaves like an Array's method, not like a jQuery method. 257 push: push, 258 sort: arr.sort, 259 splice: arr.splice 260}; 261 262jQuery.extend = jQuery.fn.extend = function() { 263 var options, name, src, copy, copyIsArray, clone, 264 target = arguments[ 0 ] || {}, 265 i = 1, 266 length = arguments.length, 267 deep = false; 268 269 // Handle a deep copy situation 270 if ( typeof target === "boolean" ) { 271 deep = target; 272 273 // Skip the boolean and the target 274 target = arguments[ i ] || {}; 275 i++; 276 } 277 278 // Handle case when target is a string or something (possible in deep copy) 279 if ( typeof target !== "object" && !isFunction( target ) ) { 280 target = {}; 281 } 282 283 // Extend jQuery itself if only one argument is passed 284 if ( i === length ) { 285 target = this; 286 i--; 287 } 288 289 for ( ; i < length; i++ ) { 290 291 // Only deal with non-null/undefined values 292 if ( ( options = arguments[ i ] ) != null ) { 293 294 // Extend the base object 295 for ( name in options ) { 296 src = target[ name ]; 297 copy = options[ name ]; 298 299 // Prevent never-ending loop 300 if ( target === copy ) { 301 continue; 302 } 303 304 // Recurse if we're merging plain objects or arrays 305 if ( deep && copy && ( jQuery.isPlainObject( copy ) || 306 ( copyIsArray = Array.isArray( copy ) ) ) ) { 307 308 if ( copyIsArray ) { 309 copyIsArray = false; 310 clone = src && Array.isArray( src ) ? src : []; 311 312 } else { 313 clone = src && jQuery.isPlainObject( src ) ? src : {}; 314 } 315 316 // Never move original objects, clone them 317 target[ name ] = jQuery.extend( deep, clone, copy ); 318 319 // Don't bring in undefined values 320 } else if ( copy !== undefined ) { 321 target[ name ] = copy; 322 } 323 } 324 } 325 } 326 327 // Return the modified object 328 return target; 329}; 330 331jQuery.extend( { 332 333 // Unique for each copy of jQuery on the page 334 expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), 335 336 // Assume jQuery is ready without the ready module 337 isReady: true, 338 339 error: function( msg ) { 340 throw new Error( msg ); 341 }, 342 343 noop: function() {}, 344 345 isPlainObject: function( obj ) { 346 var proto, Ctor; 347 348 // Detect obvious negatives 349 // Use toString instead of jQuery.type to catch host objects 350 if ( !obj || toString.call( obj ) !== "[object Object]" ) { 351 return false; 352 } 353 354 proto = getProto( obj ); 355 356 // Objects with no prototype (e.g., `Object.create( null )`) are plain 357 if ( !proto ) { 358 return true; 359 } 360 361 // Objects with prototype are plain iff they were constructed by a global Object function 362 Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; 363 return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; 364 }, 365 366 isEmptyObject: function( obj ) { 367 368 /* eslint-disable no-unused-vars */ 369 // See https://github.com/eslint/eslint/issues/6125 370 var name; 371 372 for ( name in obj ) { 373 return false; 374 } 375 return true; 376 }, 377 378 // Evaluates a script in a global context 379 globalEval: function( code ) { 380 DOMEval( code ); 381 }, 382 383 each: function( obj, callback ) { 384 var length, i = 0; 385 386 if ( isArrayLike( obj ) ) { 387 length = obj.length; 388 for ( ; i < length; i++ ) { 389 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 390 break; 391 } 392 } 393 } else { 394 for ( i in obj ) { 395 if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { 396 break; 397 } 398 } 399 } 400 401 return obj; 402 }, 403 404 // Support: Android <=4.0 only 405 trim: function( text ) { 406 return text == null ? 407 "" : 408 ( text + "" ).replace( rtrim, "" ); 409 }, 410 411 // results is for internal usage only 412 makeArray: function( arr, results ) { 413 var ret = results || []; 414 415 if ( arr != null ) { 416 if ( isArrayLike( Object( arr ) ) ) { 417 jQuery.merge( ret, 418 typeof arr === "string" ? 419 [ arr ] : arr 420 ); 421 } else { 422 push.call( ret, arr ); 423 } 424 } 425 426 return ret; 427 }, 428 429 inArray: function( elem, arr, i ) { 430 return arr == null ? -1 : indexOf.call( arr, elem, i ); 431 }, 432 433 // Support: Android <=4.0 only, PhantomJS 1 only 434 // push.apply(_, arraylike) throws on ancient WebKit 435 merge: function( first, second ) { 436 var len = +second.length, 437 j = 0, 438 i = first.length; 439 440 for ( ; j < len; j++ ) { 441 first[ i++ ] = second[ j ]; 442 } 443 444 first.length = i; 445 446 return first; 447 }, 448 449 grep: function( elems, callback, invert ) { 450 var callbackInverse, 451 matches = [], 452 i = 0, 453 length = elems.length, 454 callbackExpect = !invert; 455 456 // Go through the array, only saving the items 457 // that pass the validator function 458 for ( ; i < length; i++ ) { 459 callbackInverse = !callback( elems[ i ], i ); 460 if ( callbackInverse !== callbackExpect ) { 461 matches.push( elems[ i ] ); 462 } 463 } 464 465 return matches; 466 }, 467 468 // arg is for internal usage only 469 map: function( elems, callback, arg ) { 470 var length, value, 471 i = 0, 472 ret = []; 473 474 // Go through the array, translating each of the items to their new values 475 if ( isArrayLike( elems ) ) { 476 length = elems.length; 477 for ( ; i < length; i++ ) { 478 value = callback( elems[ i ], i, arg ); 479 480 if ( value != null ) { 481 ret.push( value ); 482 } 483 } 484 485 // Go through every key on the object, 486 } else { 487 for ( i in elems ) { 488 value = callback( elems[ i ], i, arg ); 489 490 if ( value != null ) { 491 ret.push( value ); 492 } 493 } 494 } 495 496 // Flatten any nested arrays 497 return concat.apply( [], ret ); 498 }, 499 500 // A global GUID counter for objects 501 guid: 1, 502 503 // jQuery.support is not used in Core but other projects attach their 504 // properties to it so it needs to exist. 505 support: support 506} ); 507 508if ( typeof Symbol === "function" ) { 509 jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; 510} 511 512// Populate the class2type map 513jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), 514function( i, name ) { 515 class2type[ "[object " + name + "]" ] = name.toLowerCase(); 516} ); 517 518function isArrayLike( obj ) { 519 520 // Support: real iOS 8.2 only (not reproducible in simulator) 521 // `in` check used to prevent JIT error (gh-2145) 522 // hasOwn isn't used here due to false negatives 523 // regarding Nodelist length in IE 524 var length = !!obj && "length" in obj && obj.length, 525 type = toType( obj ); 526 527 if ( isFunction( obj ) || isWindow( obj ) ) { 528 return false; 529 } 530 531 return type === "array" || length === 0 || 532 typeof length === "number" && length > 0 && ( length - 1 ) in obj; 533} 534var Sizzle = 535/*! 536 * Sizzle CSS Selector Engine v2.3.3 537 * https://sizzlejs.com/ 538 * 539 * Copyright jQuery Foundation and other contributors 540 * Released under the MIT license 541 * http://jquery.org/license 542 * 543 * Date: 2016-08-08 544 */ 545(function( window ) { 546 547var i, 548 support, 549 Expr, 550 getText, 551 isXML, 552 tokenize, 553 compile, 554 select, 555 outermostContext, 556 sortInput, 557 hasDuplicate, 558 559 // Local document vars 560 setDocument, 561 document, 562 docElem, 563 documentIsHTML, 564 rbuggyQSA, 565 rbuggyMatches, 566 matches, 567 contains, 568 569 // Instance-specific data 570 expando = "sizzle" + 1 * new Date(), 571 preferredDoc = window.document, 572 dirruns = 0, 573 done = 0, 574 classCache = createCache(), 575 tokenCache = createCache(), 576 compilerCache = createCache(), 577 sortOrder = function( a, b ) { 578 if ( a === b ) { 579 hasDuplicate = true; 580 } 581 return 0; 582 }, 583 584 // Instance methods 585 hasOwn = ({}).hasOwnProperty, 586 arr = [], 587 pop = arr.pop, 588 push_native = arr.push, 589 push = arr.push, 590 slice = arr.slice, 591 // Use a stripped-down indexOf as it's faster than native 592 // https://jsperf.com/thor-indexof-vs-for/5 593 indexOf = function( list, elem ) { 594 var i = 0, 595 len = list.length; 596 for ( ; i < len; i++ ) { 597 if ( list[i] === elem ) { 598 return i; 599 } 600 } 601 return -1; 602 }, 603 604 booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", 605 606 // Regular expressions 607 608 // http://www.w3.org/TR/css3-selectors/#whitespace 609 whitespace = "[\\x20\\t\\r\\n\\f]", 610 611 // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier 612 identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", 613 614 // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors 615 attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + 616 // Operator (capture 2) 617 "*([*^$|!~]?=)" + whitespace + 618 // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" 619 "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + 620 "*\\]", 621 622 pseudos = ":(" + identifier + ")(?:\\((" + 623 // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: 624 // 1. quoted (capture 3; capture 4 or capture 5) 625 "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + 626 // 2. simple (capture 6) 627 "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + 628 // 3. anything else (capture 2) 629 ".*" + 630 ")\\)|)", 631 632 // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter 633 rwhitespace = new RegExp( whitespace + "+", "g" ), 634 rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), 635 636 rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), 637 rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), 638 639 rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), 640 641 rpseudo = new RegExp( pseudos ), 642 ridentifier = new RegExp( "^" + identifier + "$" ), 643 644 matchExpr = { 645 "ID": new RegExp( "^#(" + identifier + ")" ), 646 "CLASS": new RegExp( "^\\.(" + identifier + ")" ), 647 "TAG": new RegExp( "^(" + identifier + "|[*])" ), 648 "ATTR": new RegExp( "^" + attributes ), 649 "PSEUDO": new RegExp( "^" + pseudos ), 650 "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + 651 "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + 652 "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), 653 "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), 654 // For use in libraries implementing .is() 655 // We use this for POS matching in `select` 656 "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + 657 whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) 658 }, 659 660 rinputs = /^(?:input|select|textarea|button)$/i, 661 rheader = /^h\d$/i, 662 663 rnative = /^[^{]+\{\s*\[native \w/, 664 665 // Easily-parseable/retrievable ID or TAG or CLASS selectors 666 rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, 667 668 rsibling = /[+~]/, 669 670 // CSS escapes 671 // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters 672 runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), 673 funescape = function( _, escaped, escapedWhitespace ) { 674 var high = "0x" + escaped - 0x10000; 675 // NaN means non-codepoint 676 // Support: Firefox<24 677 // Workaround erroneous numeric interpretation of +"0x" 678 return high !== high || escapedWhitespace ? 679 escaped : 680 high < 0 ? 681 // BMP codepoint 682 String.fromCharCode( high + 0x10000 ) : 683 // Supplemental Plane codepoint (surrogate pair) 684 String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); 685 }, 686 687 // CSS string/identifier serialization 688 // https://drafts.csswg.org/cssom/#common-serializing-idioms 689 rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, 690 fcssescape = function( ch, asCodePoint ) { 691 if ( asCodePoint ) { 692 693 // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER 694 if ( ch === "\0" ) { 695 return "\uFFFD"; 696 } 697 698 // Control characters and (dependent upon position) numbers get escaped as code points 699 return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; 700 } 701 702 // Other potentially-special ASCII characters get backslash-escaped 703 return "\\" + ch; 704 }, 705 706 // Used for iframes 707 // See setDocument() 708 // Removing the function wrapper causes a "Permission Denied" 709 // error in IE 710 unloadHandler = function() { 711 setDocument(); 712 }, 713 714 disabledAncestor = addCombinator( 715 function( elem ) { 716 return elem.disabled === true && ("form" in elem || "label" in elem); 717 }, 718 { dir: "parentNode", next: "legend" } 719 ); 720 721// Optimize for push.apply( _, NodeList ) 722try { 723 push.apply( 724 (arr = slice.call( preferredDoc.childNodes )), 725 preferredDoc.childNodes 726 ); 727 // Support: Android<4.0 728 // Detect silently failing push.apply 729 arr[ preferredDoc.childNodes.length ].nodeType; 730} catch ( e ) { 731 push = { apply: arr.length ? 732 733 // Leverage slice if possible 734 function( target, els ) { 735 push_native.apply( target, slice.call(els) ); 736 } : 737 738 // Support: IE<9 739 // Otherwise append directly 740 function( target, els ) { 741 var j = target.length, 742 i = 0; 743 // Can't trust NodeList.length 744 while ( (target[j++] = els[i++]) ) {} 745 target.length = j - 1; 746 } 747 }; 748} 749 750function Sizzle( selector, context, results, seed ) { 751 var m, i, elem, nid, match, groups, newSelector, 752 newContext = context && context.ownerDocument, 753 754 // nodeType defaults to 9, since context defaults to document 755 nodeType = context ? context.nodeType : 9; 756 757 results = results || []; 758 759 // Return early from calls with invalid selector or context 760 if ( typeof selector !== "string" || !selector || 761 nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { 762 763 return results; 764 } 765 766 // Try to shortcut find operations (as opposed to filters) in HTML documents 767 if ( !seed ) { 768 769 if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { 770 setDocument( context ); 771 } 772 context = context || document; 773 774 if ( documentIsHTML ) { 775 776 // If the selector is sufficiently simple, try using a "get*By*" DOM method 777 // (excepting DocumentFragment context, where the methods don't exist) 778 if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { 779 780 // ID selector 781 if ( (m = match[1]) ) { 782 783 // Document context 784 if ( nodeType === 9 ) { 785 if ( (elem = context.getElementById( m )) ) { 786 787 // Support: IE, Opera, Webkit 788 // TODO: identify versions 789 // getElementById can match elements by name instead of ID 790 if ( elem.id === m ) { 791 results.push( elem ); 792 return results; 793 } 794 } else { 795 return results; 796 } 797 798 // Element context 799 } else { 800 801 // Support: IE, Opera, Webkit 802 // TODO: identify versions 803 // getElementById can match elements by name instead of ID 804 if ( newContext && (elem = newContext.getElementById( m )) && 805 contains( context, elem ) && 806 elem.id === m ) { 807 808 results.push( elem ); 809 return results; 810 } 811 } 812 813 // Type selector 814 } else if ( match[2] ) { 815 push.apply( results, context.getElementsByTagName( selector ) ); 816 return results; 817 818 // Class selector 819 } else if ( (m = match[3]) && support.getElementsByClassName && 820 context.getElementsByClassName ) { 821 822 push.apply( results, context.getElementsByClassName( m ) ); 823 return results; 824 } 825 } 826 827 // Take advantage of querySelectorAll 828 if ( support.qsa && 829 !compilerCache[ selector + " " ] && 830 (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { 831 832 if ( nodeType !== 1 ) { 833 newContext = context; 834 newSelector = selector; 835 836 // qSA looks outside Element context, which is not what we want 837 // Thanks to Andrew Dupont for this workaround technique 838 // Support: IE <=8 839 // Exclude object elements 840 } else if ( context.nodeName.toLowerCase() !== "object" ) { 841 842 // Capture the context ID, setting it first if necessary 843 if ( (nid = context.getAttribute( "id" )) ) { 844 nid = nid.replace( rcssescape, fcssescape ); 845 } else { 846 context.setAttribute( "id", (nid = expando) ); 847 } 848 849 // Prefix every selector in the list 850 groups = tokenize( selector ); 851 i = groups.length; 852 while ( i-- ) { 853 groups[i] = "#" + nid + " " + toSelector( groups[i] ); 854 } 855 newSelector = groups.join( "," ); 856 857 // Expand context for sibling selectors 858 newContext = rsibling.test( selector ) && testContext( context.parentNode ) || 859 context; 860 } 861 862 if ( newSelector ) { 863 try { 864 push.apply( results, 865 newContext.querySelectorAll( newSelector ) 866 ); 867 return results; 868 } catch ( qsaError ) { 869 } finally { 870 if ( nid === expando ) { 871 context.removeAttribute( "id" ); 872 } 873 } 874 } 875 } 876 } 877 } 878 879 // All others 880 return select( selector.replace( rtrim, "$1" ), context, results, seed ); 881} 882 883/** 884 * Create key-value caches of limited size 885 * @returns {function(string, object)} Returns the Object data after storing it on itself with 886 * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) 887 * deleting the oldest entry 888 */ 889function createCache() { 890 var keys = []; 891 892 function cache( key, value ) { 893 // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) 894 if ( keys.push( key + " " ) > Expr.cacheLength ) { 895 // Only keep the most recent entries 896 delete cache[ keys.shift() ]; 897 } 898 return (cache[ key + " " ] = value); 899 } 900 return cache; 901} 902 903/** 904 * Mark a function for special use by Sizzle 905 * @param {Function} fn The function to mark 906 */ 907function markFunction( fn ) { 908 fn[ expando ] = true; 909 return fn; 910} 911 912/** 913 * Support testing using an element 914 * @param {Function} fn Passed the created element and returns a boolean result 915 */ 916function assert( fn ) { 917 var el = document.createElement("fieldset"); 918 919 try { 920 return !!fn( el ); 921 } catch (e) { 922 return false; 923 } finally { 924 // Remove from its parent by default 925 if ( el.parentNode ) { 926 el.parentNode.removeChild( el ); 927 } 928 // release memory in IE 929 el = null; 930 } 931} 932 933/** 934 * Adds the same handler for all of the specified attrs 935 * @param {String} attrs Pipe-separated list of attributes 936 * @param {Function} handler The method that will be applied 937 */ 938function addHandle( attrs, handler ) { 939 var arr = attrs.split("|"), 940 i = arr.length; 941 942 while ( i-- ) { 943 Expr.attrHandle[ arr[i] ] = handler; 944 } 945} 946 947/** 948 * Checks document order of two siblings 949 * @param {Element} a 950 * @param {Element} b 951 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b 952 */ 953function siblingCheck( a, b ) { 954 var cur = b && a, 955 diff = cur && a.nodeType === 1 && b.nodeType === 1 && 956 a.sourceIndex - b.sourceIndex; 957 958 // Use IE sourceIndex if available on both nodes 959 if ( diff ) { 960 return diff; 961 } 962 963 // Check if b follows a 964 if ( cur ) { 965 while ( (cur = cur.nextSibling) ) { 966 if ( cur === b ) { 967 return -1; 968 } 969 } 970 } 971 972 return a ? 1 : -1; 973} 974 975/** 976 * Returns a function to use in pseudos for input types 977 * @param {String} type 978 */ 979function createInputPseudo( type ) { 980 return function( elem ) { 981 var name = elem.nodeName.toLowerCase(); 982 return name === "input" && elem.type === type; 983 }; 984} 985 986/** 987 * Returns a function to use in pseudos for buttons 988 * @param {String} type 989 */ 990function createButtonPseudo( type ) { 991 return function( elem ) { 992 var name = elem.nodeName.toLowerCase(); 993 return (name === "input" || name === "button") && elem.type === type; 994 }; 995} 996 997/** 998 * Returns a function to use in pseudos for :enabled/:disabled 999 * @param {Boolean} disabled true for :disabled; false for :enabled 1000 */ 1001function createDisabledPseudo( disabled ) { 1002 1003 // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable 1004 return function( elem ) { 1005 1006 // Only certain elements can match :enabled or :disabled 1007 // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled 1008 // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled 1009 if ( "form" in elem ) { 1010 1011 // Check for inherited disabledness on relevant non-disabled elements: 1012 // * listed form-associated elements in a disabled fieldset 1013 // https://html.spec.whatwg.org/multipage/forms.html#category-listed 1014 // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled 1015 // * option elements in a disabled optgroup 1016 // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled 1017 // All such elements have a "form" property. 1018 if ( elem.parentNode && elem.disabled === false ) { 1019 1020 // Option elements defer to a parent optgroup if present 1021 if ( "label" in elem ) { 1022 if ( "label" in elem.parentNode ) { 1023 return elem.parentNode.disabled === disabled; 1024 } else { 1025 return elem.disabled === disabled; 1026 } 1027 } 1028 1029 // Support: IE 6 - 11 1030 // Use the isDisabled shortcut property to check for disabled fieldset ancestors 1031 return elem.isDisabled === disabled || 1032 1033 // Where there is no isDisabled, check manually 1034 /* jshint -W018 */ 1035 elem.isDisabled !== !disabled && 1036 disabledAncestor( elem ) === disabled; 1037 } 1038 1039 return elem.disabled === disabled; 1040 1041 // Try to winnow out elements that can't be disabled before trusting the disabled property. 1042 // Some victims get caught in our net (label, legend, menu, track), but it shouldn't 1043 // even exist on them, let alone have a boolean value. 1044 } else if ( "label" in elem ) { 1045 return elem.disabled === disabled; 1046 } 1047 1048 // Remaining elements are neither :enabled nor :disabled 1049 return false; 1050 }; 1051} 1052 1053/** 1054 * Returns a function to use in pseudos for positionals 1055 * @param {Function} fn 1056 */ 1057function createPositionalPseudo( fn ) { 1058 return markFunction(function( argument ) { 1059 argument = +argument; 1060 return markFunction(function( seed, matches ) { 1061 var j, 1062 matchIndexes = fn( [], seed.length, argument ), 1063 i = matchIndexes.length; 1064 1065 // Match elements found at the specified indexes 1066 while ( i-- ) { 1067 if ( seed[ (j = matchIndexes[i]) ] ) { 1068 seed[j] = !(matches[j] = seed[j]); 1069 } 1070 } 1071 }); 1072 }); 1073} 1074 1075/** 1076 * Checks a node for validity as a Sizzle context 1077 * @param {Element|Object=} context 1078 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value 1079 */ 1080function testContext( context ) { 1081 return context && typeof context.getElementsByTagName !== "undefined" && context; 1082} 1083 1084// Expose support vars for convenience 1085support = Sizzle.support = {}; 1086 1087/** 1088 * Detects XML nodes 1089 * @param {Element|Object} elem An element or a document 1090 * @returns {Boolean} True iff elem is a non-HTML XML node 1091 */ 1092isXML = Sizzle.isXML = function( elem ) { 1093 // documentElement is verified for cases where it doesn't yet exist 1094 // (such as loading iframes in IE - #4833) 1095 var documentElement = elem && (elem.ownerDocument || elem).documentElement; 1096 return documentElement ? documentElement.nodeName !== "HTML" : false; 1097}; 1098 1099/** 1100 * Sets document-related variables once based on the current document 1101 * @param {Element|Object} [doc] An element or document object to use to set the document 1102 * @returns {Object} Returns the current document 1103 */ 1104setDocument = Sizzle.setDocument = function( node ) { 1105 var hasCompare, subWindow, 1106 doc = node ? node.ownerDocument || node : preferredDoc; 1107 1108 // Return early if doc is invalid or already selected 1109 if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { 1110 return document; 1111 } 1112 1113 // Update global variables 1114 document = doc; 1115 docElem = document.documentElement; 1116 documentIsHTML = !isXML( document ); 1117 1118 // Support: IE 9-11, Edge 1119 // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) 1120 if ( preferredDoc !== document && 1121 (subWindow = document.defaultView) && subWindow.top !== subWindow ) { 1122 1123 // Support: IE 11, Edge 1124 if ( subWindow.addEventListener ) { 1125 subWindow.addEventListener( "unload", unloadHandler, false ); 1126 1127 // Support: IE 9 - 10 only 1128 } else if ( subWindow.attachEvent ) { 1129 subWindow.attachEvent( "onunload", unloadHandler ); 1130 } 1131 } 1132 1133 /* Attributes 1134 ---------------------------------------------------------------------- */ 1135 1136 // Support: IE<8 1137 // Verify that getAttribute really returns attributes and not properties 1138 // (excepting IE8 booleans) 1139 support.attributes = assert(function( el ) { 1140 el.className = "i"; 1141 return !el.getAttribute("className"); 1142 }); 1143 1144 /* getElement(s)By* 1145 ---------------------------------------------------------------------- */ 1146 1147 // Check if getElementsByTagName("*") returns only elements 1148 support.getElementsByTagName = assert(function( el ) { 1149 el.appendChild( document.createComment("") ); 1150 return !el.getElementsByTagName("*").length; 1151 }); 1152 1153 // Support: IE<9 1154 support.getElementsByClassName = rnative.test( document.getElementsByClassName ); 1155 1156 // Support: IE<10 1157 // Check if getElementById returns elements by name 1158 // The broken getElementById methods don't pick up programmatically-set names, 1159 // so use a roundabout getElementsByName test 1160 support.getById = assert(function( el ) { 1161 docElem.appendChild( el ).id = expando; 1162 return !document.getElementsByName || !document.getElementsByName( expando ).length; 1163 }); 1164 1165 // ID filter and find 1166 if ( support.getById ) { 1167 Expr.filter["ID"] = function( id ) { 1168 var attrId = id.replace( runescape, funescape ); 1169 return function( elem ) { 1170 return elem.getAttribute("id") === attrId; 1171 }; 1172 }; 1173 Expr.find["ID"] = function( id, context ) { 1174 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1175 var elem = context.getElementById( id ); 1176 return elem ? [ elem ] : []; 1177 } 1178 }; 1179 } else { 1180 Expr.filter["ID"] = function( id ) { 1181 var attrId = id.replace( runescape, funescape ); 1182 return function( elem ) { 1183 var node = typeof elem.getAttributeNode !== "undefined" && 1184 elem.getAttributeNode("id"); 1185 return node && node.value === attrId; 1186 }; 1187 }; 1188 1189 // Support: IE 6 - 7 only 1190 // getElementById is not reliable as a find shortcut 1191 Expr.find["ID"] = function( id, context ) { 1192 if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { 1193 var node, i, elems, 1194 elem = context.getElementById( id ); 1195 1196 if ( elem ) { 1197 1198 // Verify the id attribute 1199 node = elem.getAttributeNode("id"); 1200 if ( node && node.value === id ) { 1201 return [ elem ]; 1202 } 1203 1204 // Fall back on getElementsByName 1205 elems = context.getElementsByName( id ); 1206 i = 0; 1207 while ( (elem = elems[i++]) ) { 1208 node = elem.getAttributeNode("id"); 1209 if ( node && node.value === id ) { 1210 return [ elem ]; 1211 } 1212 } 1213 } 1214 1215 return []; 1216 } 1217 }; 1218 } 1219 1220 // Tag 1221 Expr.find["TAG"] = support.getElementsByTagName ? 1222 function( tag, context ) { 1223 if ( typeof context.getElementsByTagName !== "undefined" ) { 1224 return context.getElementsByTagName( tag ); 1225 1226 // DocumentFragment nodes don't have gEBTN 1227 } else if ( support.qsa ) { 1228 return context.querySelectorAll( tag ); 1229 } 1230 } : 1231 1232 function( tag, context ) { 1233 var elem, 1234 tmp = [], 1235 i = 0, 1236 // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too 1237 results = context.getElementsByTagName( tag ); 1238 1239 // Filter out possible comments 1240 if ( tag === "*" ) { 1241 while ( (elem = results[i++]) ) { 1242 if ( elem.nodeType === 1 ) { 1243 tmp.push( elem ); 1244 } 1245 } 1246 1247 return tmp; 1248 } 1249 return results; 1250 }; 1251 1252 // Class 1253 Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { 1254 if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { 1255 return context.getElementsByClassName( className ); 1256 } 1257 }; 1258 1259 /* QSA/matchesSelector 1260 ---------------------------------------------------------------------- */ 1261 1262 // QSA and matchesSelector support 1263 1264 // matchesSelector(:active) reports false when true (IE9/Opera 11.5) 1265 rbuggyMatches = []; 1266 1267 // qSa(:focus) reports false when true (Chrome 21) 1268 // We allow this because of a bug in IE8/9 that throws an error 1269 // whenever `document.activeElement` is accessed on an iframe 1270 // So, we allow :focus to pass through QSA all the time to avoid the IE error 1271 // See https://bugs.jquery.com/ticket/13378 1272 rbuggyQSA = []; 1273 1274 if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { 1275 // Build QSA regex 1276 // Regex strategy adopted from Diego Perini 1277 assert(function( el ) { 1278 // Select is set to empty string on purpose 1279 // This is to test IE's treatment of not explicitly 1280 // setting a boolean content attribute, 1281 // since its presence should be enough 1282 // https://bugs.jquery.com/ticket/12359 1283 docElem.appendChild( el ).innerHTML = "<a id='" + expando + "'></a>" + 1284 "<select id='" + expando + "-\r\\' msallowcapture=''>" + 1285 "<option selected=''></option></select>"; 1286 1287 // Support: IE8, Opera 11-12.16 1288 // Nothing should be selected when empty strings follow ^= or $= or *= 1289 // The test attribute must be unknown in Opera but "safe" for WinRT 1290 // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section 1291 if ( el.querySelectorAll("[msallowcapture^='']").length ) { 1292 rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); 1293 } 1294 1295 // Support: IE8 1296 // Boolean attributes and "value" are not treated correctly 1297 if ( !el.querySelectorAll("[selected]").length ) { 1298 rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); 1299 } 1300 1301 // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ 1302 if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { 1303 rbuggyQSA.push("~="); 1304 } 1305 1306 // Webkit/Opera - :checked should return selected option elements 1307 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 1308 // IE8 throws error here and will not see later tests 1309 if ( !el.querySelectorAll(":checked").length ) { 1310 rbuggyQSA.push(":checked"); 1311 } 1312 1313 // Support: Safari 8+, iOS 8+ 1314 // https://bugs.webkit.org/show_bug.cgi?id=136851 1315 // In-page `selector#id sibling-combinator selector` fails 1316 if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { 1317 rbuggyQSA.push(".#.+[+~]"); 1318 } 1319 }); 1320 1321 assert(function( el ) { 1322 el.innerHTML = "<a href='' disabled='disabled'></a>" + 1323 "<select disabled='disabled'><option/></select>"; 1324 1325 // Support: Windows 8 Native Apps 1326 // The type and name attributes are restricted during .innerHTML assignment 1327 var input = document.createElement("input"); 1328 input.setAttribute( "type", "hidden" ); 1329 el.appendChild( input ).setAttribute( "name", "D" ); 1330 1331 // Support: IE8 1332 // Enforce case-sensitivity of name attribute 1333 if ( el.querySelectorAll("[name=d]").length ) { 1334 rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); 1335 } 1336 1337 // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) 1338 // IE8 throws error here and will not see later tests 1339 if ( el.querySelectorAll(":enabled").length !== 2 ) { 1340 rbuggyQSA.push( ":enabled", ":disabled" ); 1341 } 1342 1343 // Support: IE9-11+ 1344 // IE's :disabled selector does not pick up the children of disabled fieldsets 1345 docElem.appendChild( el ).disabled = true; 1346 if ( el.querySelectorAll(":disabled").length !== 2 ) { 1347 rbuggyQSA.push( ":enabled", ":disabled" ); 1348 } 1349 1350 // Opera 10-11 does not throw on post-comma invalid pseudos 1351 el.querySelectorAll("*,:x"); 1352 rbuggyQSA.push(",.*:"); 1353 }); 1354 } 1355 1356 if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || 1357 docElem.webkitMatchesSelector || 1358 docElem.mozMatchesSelector || 1359 docElem.oMatchesSelector || 1360 docElem.msMatchesSelector) )) ) { 1361 1362 assert(function( el ) { 1363 // Check to see if it's possible to do matchesSelector 1364 // on a disconnected node (IE 9) 1365 support.disconnectedMatch = matches.call( el, "*" ); 1366 1367 // This should fail with an exception 1368 // Gecko does not error, returns false instead 1369 matches.call( el, "[s!='']:x" ); 1370 rbuggyMatches.push( "!=", pseudos ); 1371 }); 1372 } 1373 1374 rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); 1375 rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); 1376 1377 /* Contains 1378 ---------------------------------------------------------------------- */ 1379 hasCompare = rnative.test( docElem.compareDocumentPosition ); 1380 1381 // Element contains another 1382 // Purposefully self-exclusive 1383 // As in, an element does not contain itself 1384 contains = hasCompare || rnative.test( docElem.contains ) ? 1385 function( a, b ) { 1386 var adown = a.nodeType === 9 ? a.documentElement : a, 1387 bup = b && b.parentNode; 1388 return a === bup || !!( bup && bup.nodeType === 1 && ( 1389 adown.contains ? 1390 adown.contains( bup ) : 1391 a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 1392 )); 1393 } : 1394 function( a, b ) { 1395 if ( b ) { 1396 while ( (b = b.parentNode) ) { 1397 if ( b === a ) { 1398 return true; 1399 } 1400 } 1401 } 1402 return false; 1403 }; 1404 1405 /* Sorting 1406 ---------------------------------------------------------------------- */ 1407 1408 // Document order sorting 1409 sortOrder = hasCompare ? 1410 function( a, b ) { 1411 1412 // Flag for duplicate removal 1413 if ( a === b ) { 1414 hasDuplicate = true; 1415 return 0; 1416 } 1417 1418 // Sort on method existence if only one input has compareDocumentPosition 1419 var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; 1420 if ( compare ) { 1421 return compare; 1422 } 1423 1424 // Calculate position if both inputs belong to the same document 1425 compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? 1426 a.compareDocumentPosition( b ) : 1427 1428 // Otherwise we know they are disconnected 1429 1; 1430 1431 // Disconnected nodes 1432 if ( compare & 1 || 1433 (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { 1434 1435 // Choose the first element that is related to our preferred document 1436 if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { 1437 return -1; 1438 } 1439 if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { 1440 return 1; 1441 } 1442 1443 // Maintain original order 1444 return sortInput ? 1445 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1446 0; 1447 } 1448 1449 return compare & 4 ? -1 : 1; 1450 } : 1451 function( a, b ) { 1452 // Exit early if the nodes are identical 1453 if ( a === b ) { 1454 hasDuplicate = true; 1455 return 0; 1456 } 1457 1458 var cur, 1459 i = 0, 1460 aup = a.parentNode, 1461 bup = b.parentNode, 1462 ap = [ a ], 1463 bp = [ b ]; 1464 1465 // Parentless nodes are either documents or disconnected 1466 if ( !aup || !bup ) { 1467 return a === document ? -1 : 1468 b === document ? 1 : 1469 aup ? -1 : 1470 bup ? 1 : 1471 sortInput ? 1472 ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : 1473 0; 1474 1475 // If the nodes are siblings, we can do a quick check 1476 } else if ( aup === bup ) { 1477 return siblingCheck( a, b ); 1478 } 1479 1480 // Otherwise we need full lists of their ancestors for comparison 1481 cur = a; 1482 while ( (cur = cur.parentNode) ) { 1483 ap.unshift( cur ); 1484 } 1485 cur = b; 1486 while ( (cur = cur.parentNode) ) { 1487 bp.unshift( cur ); 1488 } 1489 1490 // Walk down the tree looking for a discrepancy 1491 while ( ap[i] === bp[i] ) { 1492 i++; 1493 } 1494 1495 return i ? 1496 // Do a sibling check if the nodes have a common ancestor 1497 siblingCheck( ap[i], bp[i] ) : 1498 1499 // Otherwise nodes in our document sort first 1500 ap[i] === preferredDoc ? -1 : 1501 bp[i] === preferredDoc ? 1 : 1502 0; 1503 }; 1504 1505 return document; 1506}; 1507 1508Sizzle.matches = function( expr, elements ) { 1509 return Sizzle( expr, null, null, elements ); 1510}; 1511 1512Sizzle.matchesSelector = function( elem, expr ) { 1513 // Set document vars if needed 1514 if ( ( elem.ownerDocument || elem ) !== document ) { 1515 setDocument( elem ); 1516 } 1517 1518 // Make sure that attribute selectors are quoted 1519 expr = expr.replace( rattributeQuotes, "='$1']" ); 1520 1521 if ( support.matchesSelector && documentIsHTML && 1522 !compilerCache[ expr + " " ] && 1523 ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && 1524 ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { 1525 1526 try { 1527 var ret = matches.call( elem, expr ); 1528 1529 // IE 9's matchesSelector returns false on disconnected nodes 1530 if ( ret || support.disconnectedMatch || 1531 // As well, disconnected nodes are said to be in a document 1532 // fragment in IE 9 1533 elem.document && elem.document.nodeType !== 11 ) { 1534 return ret; 1535 } 1536 } catch (e) {} 1537 } 1538 1539 return Sizzle( expr, document, null, [ elem ] ).length > 0; 1540}; 1541 1542Sizzle.contains = function( context, elem ) { 1543 // Set document vars if needed 1544 if ( ( context.ownerDocument || context ) !== document ) { 1545 setDocument( context ); 1546 } 1547 return contains( context, elem ); 1548}; 1549 1550Sizzle.attr = function( elem, name ) { 1551 // Set document vars if needed 1552 if ( ( elem.ownerDocument || elem ) !== document ) { 1553 setDocument( elem ); 1554 } 1555 1556 var fn = Expr.attrHandle[ name.toLowerCase() ], 1557 // Don't get fooled by Object.prototype properties (jQuery #13807) 1558 val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? 1559 fn( elem, name, !documentIsHTML ) : 1560 undefined; 1561 1562 return val !== undefined ? 1563 val : 1564 support.attributes || !documentIsHTML ? 1565 elem.getAttribute( name ) : 1566 (val = elem.getAttributeNode(name)) && val.specified ? 1567 val.value : 1568 null; 1569}; 1570 1571Sizzle.escape = function( sel ) { 1572 return (sel + "").replace( rcssescape, fcssescape ); 1573}; 1574 1575Sizzle.error = function( msg ) { 1576 throw new Error( "Syntax error, unrecognized expression: " + msg ); 1577}; 1578 1579/** 1580 * Document sorting and removing duplicates 1581 * @param {ArrayLike} results 1582 */ 1583Sizzle.uniqueSort = function( results ) { 1584 var elem, 1585 duplicates = [], 1586 j = 0, 1587 i = 0; 1588 1589 // Unless we *know* we can detect duplicates, assume their presence 1590 hasDuplicate = !support.detectDuplicates; 1591 sortInput = !support.sortStable && results.slice( 0 ); 1592 results.sort( sortOrder ); 1593 1594 if ( hasDuplicate ) { 1595 while ( (elem = results[i++]) ) { 1596 if ( elem === results[ i ] ) { 1597 j = duplicates.push( i ); 1598 } 1599 } 1600 while ( j-- ) { 1601 results.splice( duplicates[ j ], 1 ); 1602 } 1603 } 1604 1605 // Clear input after sorting to release objects 1606 // See https://github.com/jquery/sizzle/pull/225 1607 sortInput = null; 1608 1609 return results; 1610}; 1611 1612/** 1613 * Utility function for retrieving the text value of an array of DOM nodes 1614 * @param {Array|Element} elem 1615 */ 1616getText = Sizzle.getText = function( elem ) { 1617 var node, 1618 ret = "", 1619 i = 0, 1620 nodeType = elem.nodeType; 1621 1622 if ( !nodeType ) { 1623 // If no nodeType, this is expected to be an array 1624 while ( (node = elem[i++]) ) {
vendor: 11,976 bytes, lines 1625-2023
1625 // Do not traverse comment nodes 1626 ret += getText( node ); 1627 } 1628 } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { 1629 // Use textContent for elements 1630 // innerText usage removed for consistency of new lines (jQuery #11153) 1631 if ( typeof elem.textContent === "string" ) { 1632 return elem.textContent; 1633 } else { 1634 // Traverse its children 1635 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 1636 ret += getText( elem ); 1637 } 1638 } 1639 } else if ( nodeType === 3 || nodeType === 4 ) { 1640 return elem.nodeValue; 1641 } 1642 // Do not include comment or processing instruction nodes 1643 1644 return ret; 1645}; 1646 1647Expr = Sizzle.selectors = { 1648 1649 // Can be adjusted by the user 1650 cacheLength: 50, 1651 1652 createPseudo: markFunction, 1653 1654 match: matchExpr, 1655 1656 attrHandle: {}, 1657 1658 find: {}, 1659 1660 relative: { 1661 ">": { dir: "parentNode", first: true }, 1662 " ": { dir: "parentNode" }, 1663 "+": { dir: "previousSibling", first: true }, 1664 "~": { dir: "previousSibling" } 1665 }, 1666 1667 preFilter: { 1668 "ATTR": function( match ) { 1669 match[1] = match[1].replace( runescape, funescape ); 1670 1671 // Move the given value to match[3] whether quoted or unquoted 1672 match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); 1673 1674 if ( match[2] === "~=" ) { 1675 match[3] = " " + match[3] + " "; 1676 } 1677 1678 return match.slice( 0, 4 ); 1679 }, 1680 1681 "CHILD": function( match ) { 1682 /* matches from matchExpr["CHILD"] 1683 1 type (only|nth|...) 1684 2 what (child|of-type) 1685 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) 1686 4 xn-component of xn+y argument ([+-]?\d*n|) 1687 5 sign of xn-component 1688 6 x of xn-component 1689 7 sign of y-component 1690 8 y of y-component 1691 */ 1692 match[1] = match[1].toLowerCase(); 1693 1694 if ( match[1].slice( 0, 3 ) === "nth" ) { 1695 // nth-* requires argument 1696 if ( !match[3] ) { 1697 Sizzle.error( match[0] ); 1698 } 1699 1700 // numeric x and y parameters for Expr.filter.CHILD 1701 // remember that false/true cast respectively to 0/1 1702 match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); 1703 match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); 1704 1705 // other types prohibit arguments 1706 } else if ( match[3] ) { 1707 Sizzle.error( match[0] ); 1708 } 1709 1710 return match; 1711 }, 1712 1713 "PSEUDO": function( match ) { 1714 var excess, 1715 unquoted = !match[6] && match[2]; 1716 1717 if ( matchExpr["CHILD"].test( match[0] ) ) { 1718 return null; 1719 } 1720 1721 // Accept quoted arguments as-is 1722 if ( match[3] ) { 1723 match[2] = match[4] || match[5] || ""; 1724 1725 // Strip excess characters from unquoted arguments 1726 } else if ( unquoted && rpseudo.test( unquoted ) && 1727 // Get excess from tokenize (recursively) 1728 (excess = tokenize( unquoted, true )) && 1729 // advance to the next closing parenthesis 1730 (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { 1731 1732 // excess is a negative index 1733 match[0] = match[0].slice( 0, excess ); 1734 match[2] = unquoted.slice( 0, excess ); 1735 } 1736 1737 // Return only captures needed by the pseudo filter method (type and argument) 1738 return match.slice( 0, 3 ); 1739 } 1740 }, 1741 1742 filter: { 1743 1744 "TAG": function( nodeNameSelector ) { 1745 var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); 1746 return nodeNameSelector === "*" ? 1747 function() { return true; } : 1748 function( elem ) { 1749 return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; 1750 }; 1751 }, 1752 1753 "CLASS": function( className ) { 1754 var pattern = classCache[ className + " " ]; 1755 1756 return pattern || 1757 (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && 1758 classCache( className, function( elem ) { 1759 return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); 1760 }); 1761 }, 1762 1763 "ATTR": function( name, operator, check ) { 1764 return function( elem ) { 1765 var result = Sizzle.attr( elem, name ); 1766 1767 if ( result == null ) { 1768 return operator === "!="; 1769 } 1770 if ( !operator ) { 1771 return true; 1772 } 1773 1774 result += ""; 1775 1776 return operator === "=" ? result === check : 1777 operator === "!=" ? result !== check : 1778 operator === "^=" ? check && result.indexOf( check ) === 0 : 1779 operator === "*=" ? check && result.indexOf( check ) > -1 : 1780 operator === "$=" ? check && result.slice( -check.length ) === check : 1781 operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : 1782 operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : 1783 false; 1784 }; 1785 }, 1786 1787 "CHILD": function( type, what, argument, first, last ) { 1788 var simple = type.slice( 0, 3 ) !== "nth", 1789 forward = type.slice( -4 ) !== "last", 1790 ofType = what === "of-type"; 1791 1792 return first === 1 && last === 0 ? 1793 1794 // Shortcut for :nth-*(n) 1795 function( elem ) { 1796 return !!elem.parentNode; 1797 } : 1798 1799 function( elem, context, xml ) { 1800 var cache, uniqueCache, outerCache, node, nodeIndex, start, 1801 dir = simple !== forward ? "nextSibling" : "previousSibling", 1802 parent = elem.parentNode, 1803 name = ofType && elem.nodeName.toLowerCase(), 1804 useCache = !xml && !ofType, 1805 diff = false; 1806 1807 if ( parent ) { 1808 1809 // :(first|last|only)-(child|of-type) 1810 if ( simple ) { 1811 while ( dir ) { 1812 node = elem; 1813 while ( (node = node[ dir ]) ) { 1814 if ( ofType ? 1815 node.nodeName.toLowerCase() === name : 1816 node.nodeType === 1 ) { 1817 1818 return false; 1819 } 1820 } 1821 // Reverse direction for :only-* (if we haven't yet done so) 1822 start = dir = type === "only" && !start && "nextSibling"; 1823 } 1824 return true; 1825 } 1826 1827 start = [ forward ? parent.firstChild : parent.lastChild ]; 1828 1829 // non-xml :nth-child(...) stores cache data on `parent` 1830 if ( forward && useCache ) { 1831 1832 // Seek `elem` from a previously-cached index 1833 1834 // ...in a gzip-friendly way 1835 node = parent; 1836 outerCache = node[ expando ] || (node[ expando ] = {}); 1837 1838 // Support: IE <9 only 1839 // Defend against cloned attroperties (jQuery gh-1709) 1840 uniqueCache = outerCache[ node.uniqueID ] || 1841 (outerCache[ node.uniqueID ] = {}); 1842 1843 cache = uniqueCache[ type ] || []; 1844 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1845 diff = nodeIndex && cache[ 2 ]; 1846 node = nodeIndex && parent.childNodes[ nodeIndex ]; 1847 1848 while ( (node = ++nodeIndex && node && node[ dir ] || 1849 1850 // Fallback to seeking `elem` from the start 1851 (diff = nodeIndex = 0) || start.pop()) ) { 1852 1853 // When found, cache indexes on `parent` and break 1854 if ( node.nodeType === 1 && ++diff && node === elem ) { 1855 uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; 1856 break; 1857 } 1858 } 1859 1860 } else { 1861 // Use previously-cached element index if available 1862 if ( useCache ) { 1863 // ...in a gzip-friendly way 1864 node = elem; 1865 outerCache = node[ expando ] || (node[ expando ] = {}); 1866 1867 // Support: IE <9 only 1868 // Defend against cloned attroperties (jQuery gh-1709) 1869 uniqueCache = outerCache[ node.uniqueID ] || 1870 (outerCache[ node.uniqueID ] = {}); 1871 1872 cache = uniqueCache[ type ] || []; 1873 nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; 1874 diff = nodeIndex; 1875 } 1876 1877 // xml :nth-child(...) 1878 // or :nth-last-child(...) or :nth(-last)?-of-type(...) 1879 if ( diff === false ) { 1880 // Use the same loop as above to seek `elem` from the start 1881 while ( (node = ++nodeIndex && node && node[ dir ] || 1882 (diff = nodeIndex = 0) || start.pop()) ) { 1883 1884 if ( ( ofType ? 1885 node.nodeName.toLowerCase() === name : 1886 node.nodeType === 1 ) && 1887 ++diff ) { 1888 1889 // Cache the index of each encountered element 1890 if ( useCache ) { 1891 outerCache = node[ expando ] || (node[ expando ] = {}); 1892 1893 // Support: IE <9 only 1894 // Defend against cloned attroperties (jQuery gh-1709) 1895 uniqueCache = outerCache[ node.uniqueID ] || 1896 (outerCache[ node.uniqueID ] = {}); 1897 1898 uniqueCache[ type ] = [ dirruns, diff ]; 1899 } 1900 1901 if ( node === elem ) { 1902 break; 1903 } 1904 } 1905 } 1906 } 1907 } 1908 1909 // Incorporate the offset, then check against cycle size 1910 diff -= last; 1911 return diff === first || ( diff % first === 0 && diff / first >= 0 ); 1912 } 1913 }; 1914 }, 1915 1916 "PSEUDO": function( pseudo, argument ) { 1917 // pseudo-class names are case-insensitive 1918 // http://www.w3.org/TR/selectors/#pseudo-classes 1919 // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters 1920 // Remember that setFilters inherits from pseudos 1921 var args, 1922 fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || 1923 Sizzle.error( "unsupported pseudo: " + pseudo ); 1924 1925 // The user may use createPseudo to indicate that 1926 // arguments are needed to create the filter function 1927 // just as Sizzle does 1928 if ( fn[ expando ] ) { 1929 return fn( argument ); 1930 } 1931 1932 // But maintain support for old signatures 1933 if ( fn.length > 1 ) { 1934 args = [ pseudo, pseudo, "", argument ]; 1935 return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? 1936 markFunction(function( seed, matches ) { 1937 var idx, 1938 matched = fn( seed, argument ), 1939 i = matched.length; 1940 while ( i-- ) { 1941 idx = indexOf( seed, matched[i] ); 1942 seed[ idx ] = !( matches[ idx ] = matched[i] ); 1943 } 1944 }) : 1945 function( elem ) { 1946 return fn( elem, 0, args ); 1947 }; 1948 } 1949 1950 return fn; 1951 } 1952 }, 1953 1954 pseudos: { 1955 // Potentially complex pseudos 1956 "not": markFunction(function( selector ) { 1957 // Trim the selector passed to compile 1958 // to avoid treating leading and trailing 1959 // spaces as combinators 1960 var input = [], 1961 results = [], 1962 matcher = compile( selector.replace( rtrim, "$1" ) ); 1963 1964 return matcher[ expando ] ? 1965 markFunction(function( seed, matches, context, xml ) { 1966 var elem, 1967 unmatched = matcher( seed, null, xml, [] ), 1968 i = seed.length; 1969 1970 // Match elements unmatched by `matcher` 1971 while ( i-- ) { 1972 if ( (elem = unmatched[i]) ) { 1973 seed[i] = !(matches[i] = elem); 1974 } 1975 } 1976 }) : 1977 function( elem, context, xml ) { 1978 input[0] = elem; 1979 matcher( input, null, xml, results ); 1980 // Don't keep the element (issue #299) 1981 input[0] = null; 1982 return !results.pop(); 1983 }; 1984 }), 1985 1986 "has": markFunction(function( selector ) { 1987 return function( elem ) { 1988 return Sizzle( selector, elem ).length > 0; 1989 }; 1990 }), 1991 1992 "contains": markFunction(function( text ) { 1993 text = text.replace( runescape, funescape ); 1994 return function( elem ) { 1995 return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; 1996 }; 1997 }), 1998 1999 // "Whether an element is represented by a :lang() selector 2000 // is based solely on the element's language value 2001 // being equal to the identifier C, 2002 // or beginning with the identifier C immediately followed by "-". 2003 // The matching of C against the element's language value is performed case-insensitively. 2004 // The identifier C does not have to be a valid language name." 2005 // http://www.w3.org/TR/selectors/#lang-pseudo 2006 "lang": markFunction( function( lang ) { 2007 // lang value must be a valid identifier 2008 if ( !ridentifier.test(lang || "") ) { 2009 Sizzle.error( "unsupported lang: " + lang ); 2010 } 2011 lang = lang.replace( runescape, funescape ).toLowerCase(); 2012 return function( elem ) { 2013 var elemLang; 2014 do { 2015 if ( (elemLang = documentIsHTML ? 2016 elem.lang : 2017 elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { 2018 2019 elemLang = elemLang.toLowerCase(); 2020 return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; 2021 } 2022 } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); 2023 return false;
vendor: 23,967 bytes, lines 2024-2895
2024 }; 2025 }), 2026 2027 // Miscellaneous 2028 "target": function( elem ) { 2029 var hash = window.location && window.location.hash; 2030 return hash && hash.slice( 1 ) === elem.id; 2031 }, 2032 2033 "root": function( elem ) { 2034 return elem === docElem; 2035 }, 2036 2037 "focus": function( elem ) { 2038 return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); 2039 }, 2040 2041 // Boolean properties 2042 "enabled": createDisabledPseudo( false ), 2043 "disabled": createDisabledPseudo( true ), 2044 2045 "checked": function( elem ) { 2046 // In CSS3, :checked should return both checked and selected elements 2047 // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked 2048 var nodeName = elem.nodeName.toLowerCase(); 2049 return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); 2050 }, 2051 2052 "selected": function( elem ) { 2053 // Accessing this property makes selected-by-default 2054 // options in Safari work properly 2055 if ( elem.parentNode ) { 2056 elem.parentNode.selectedIndex; 2057 } 2058 2059 return elem.selected === true; 2060 }, 2061 2062 // Contents 2063 "empty": function( elem ) { 2064 // http://www.w3.org/TR/selectors/#empty-pseudo 2065 // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), 2066 // but not by others (comment: 8; processing instruction: 7; etc.) 2067 // nodeType < 6 works because attributes (2) do not appear as children 2068 for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { 2069 if ( elem.nodeType < 6 ) { 2070 return false; 2071 } 2072 } 2073 return true; 2074 }, 2075 2076 "parent": function( elem ) { 2077 return !Expr.pseudos["empty"]( elem ); 2078 }, 2079 2080 // Element/input types 2081 "header": function( elem ) { 2082 return rheader.test( elem.nodeName ); 2083 }, 2084 2085 "input": function( elem ) { 2086 return rinputs.test( elem.nodeName ); 2087 }, 2088 2089 "button": function( elem ) { 2090 var name = elem.nodeName.toLowerCase(); 2091 return name === "input" && elem.type === "button" || name === "button"; 2092 }, 2093 2094 "text": function( elem ) { 2095 var attr; 2096 return elem.nodeName.toLowerCase() === "input" && 2097 elem.type === "text" && 2098 2099 // Support: IE<8 2100 // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" 2101 ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); 2102 }, 2103 2104 // Position-in-collection 2105 "first": createPositionalPseudo(function() { 2106 return [ 0 ]; 2107 }), 2108 2109 "last": createPositionalPseudo(function( matchIndexes, length ) { 2110 return [ length - 1 ]; 2111 }), 2112 2113 "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { 2114 return [ argument < 0 ? argument + length : argument ]; 2115 }), 2116 2117 "even": createPositionalPseudo(function( matchIndexes, length ) { 2118 var i = 0; 2119 for ( ; i < length; i += 2 ) { 2120 matchIndexes.push( i ); 2121 } 2122 return matchIndexes; 2123 }), 2124 2125 "odd": createPositionalPseudo(function( matchIndexes, length ) { 2126 var i = 1; 2127 for ( ; i < length; i += 2 ) { 2128 matchIndexes.push( i ); 2129 } 2130 return matchIndexes; 2131 }), 2132 2133 "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { 2134 var i = argument < 0 ? argument + length : argument; 2135 for ( ; --i >= 0; ) { 2136 matchIndexes.push( i ); 2137 } 2138 return matchIndexes; 2139 }), 2140 2141 "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { 2142 var i = argument < 0 ? argument + length : argument; 2143 for ( ; ++i < length; ) { 2144 matchIndexes.push( i ); 2145 } 2146 return matchIndexes; 2147 }) 2148 } 2149}; 2150 2151Expr.pseudos["nth"] = Expr.pseudos["eq"]; 2152 2153// Add button/input type pseudos 2154for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { 2155 Expr.pseudos[ i ] = createInputPseudo( i ); 2156} 2157for ( i in { submit: true, reset: true } ) { 2158 Expr.pseudos[ i ] = createButtonPseudo( i ); 2159} 2160 2161// Easy API for creating new setFilters 2162function setFilters() {} 2163setFilters.prototype = Expr.filters = Expr.pseudos; 2164Expr.setFilters = new setFilters(); 2165 2166tokenize = Sizzle.tokenize = function( selector, parseOnly ) { 2167 var matched, match, tokens, type, 2168 soFar, groups, preFilters, 2169 cached = tokenCache[ selector + " " ]; 2170 2171 if ( cached ) { 2172 return parseOnly ? 0 : cached.slice( 0 ); 2173 } 2174 2175 soFar = selector; 2176 groups = []; 2177 preFilters = Expr.preFilter; 2178 2179 while ( soFar ) { 2180 2181 // Comma and first run 2182 if ( !matched || (match = rcomma.exec( soFar )) ) { 2183 if ( match ) { 2184 // Don't consume trailing commas as valid 2185 soFar = soFar.slice( match[0].length ) || soFar; 2186 } 2187 groups.push( (tokens = []) ); 2188 } 2189 2190 matched = false; 2191 2192 // Combinators 2193 if ( (match = rcombinators.exec( soFar )) ) { 2194 matched = match.shift(); 2195 tokens.push({ 2196 value: matched, 2197 // Cast descendant combinators to space 2198 type: match[0].replace( rtrim, " " ) 2199 }); 2200 soFar = soFar.slice( matched.length ); 2201 } 2202 2203 // Filters 2204 for ( type in Expr.filter ) { 2205 if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || 2206 (match = preFilters[ type ]( match ))) ) { 2207 matched = match.shift(); 2208 tokens.push({ 2209 value: matched, 2210 type: type, 2211 matches: match 2212 }); 2213 soFar = soFar.slice( matched.length ); 2214 } 2215 } 2216 2217 if ( !matched ) { 2218 break; 2219 } 2220 } 2221 2222 // Return the length of the invalid excess 2223 // if we're just parsing 2224 // Otherwise, throw an error or return tokens 2225 return parseOnly ? 2226 soFar.length : 2227 soFar ? 2228 Sizzle.error( selector ) : 2229 // Cache the tokens 2230 tokenCache( selector, groups ).slice( 0 ); 2231}; 2232 2233function toSelector( tokens ) { 2234 var i = 0, 2235 len = tokens.length, 2236 selector = ""; 2237 for ( ; i < len; i++ ) { 2238 selector += tokens[i].value; 2239 } 2240 return selector; 2241} 2242 2243function addCombinator( matcher, combinator, base ) { 2244 var dir = combinator.dir, 2245 skip = combinator.next, 2246 key = skip || dir, 2247 checkNonElements = base && key === "parentNode", 2248 doneName = done++; 2249 2250 return combinator.first ? 2251 // Check against closest ancestor/preceding element 2252 function( elem, context, xml ) { 2253 while ( (elem = elem[ dir ]) ) { 2254 if ( elem.nodeType === 1 || checkNonElements ) { 2255 return matcher( elem, context, xml ); 2256 } 2257 } 2258 return false; 2259 } : 2260 2261 // Check against all ancestor/preceding elements 2262 function( elem, context, xml ) { 2263 var oldCache, uniqueCache, outerCache, 2264 newCache = [ dirruns, doneName ]; 2265 2266 // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching 2267 if ( xml ) { 2268 while ( (elem = elem[ dir ]) ) { 2269 if ( elem.nodeType === 1 || checkNonElements ) { 2270 if ( matcher( elem, context, xml ) ) { 2271 return true; 2272 } 2273 } 2274 } 2275 } else { 2276 while ( (elem = elem[ dir ]) ) { 2277 if ( elem.nodeType === 1 || checkNonElements ) { 2278 outerCache = elem[ expando ] || (elem[ expando ] = {}); 2279 2280 // Support: IE <9 only 2281 // Defend against cloned attroperties (jQuery gh-1709) 2282 uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); 2283 2284 if ( skip && skip === elem.nodeName.toLowerCase() ) { 2285 elem = elem[ dir ] || elem; 2286 } else if ( (oldCache = uniqueCache[ key ]) && 2287 oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { 2288 2289 // Assign to newCache so results back-propagate to previous elements 2290 return (newCache[ 2 ] = oldCache[ 2 ]); 2291 } else { 2292 // Reuse newcache so results back-propagate to previous elements 2293 uniqueCache[ key ] = newCache; 2294 2295 // A match means we're done; a fail means we have to keep checking 2296 if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { 2297 return true; 2298 } 2299 } 2300 } 2301 } 2302 } 2303 return false; 2304 }; 2305} 2306 2307function elementMatcher( matchers ) { 2308 return matchers.length > 1 ? 2309 function( elem, context, xml ) { 2310 var i = matchers.length; 2311 while ( i-- ) { 2312 if ( !matchers[i]( elem, context, xml ) ) { 2313 return false; 2314 } 2315 } 2316 return true; 2317 } : 2318 matchers[0]; 2319} 2320 2321function multipleContexts( selector, contexts, results ) { 2322 var i = 0, 2323 len = contexts.length; 2324 for ( ; i < len; i++ ) { 2325 Sizzle( selector, contexts[i], results ); 2326 } 2327 return results; 2328} 2329 2330function condense( unmatched, map, filter, context, xml ) { 2331 var elem, 2332 newUnmatched = [], 2333 i = 0, 2334 len = unmatched.length, 2335 mapped = map != null; 2336 2337 for ( ; i < len; i++ ) { 2338 if ( (elem = unmatched[i]) ) { 2339 if ( !filter || filter( elem, context, xml ) ) { 2340 newUnmatched.push( elem ); 2341 if ( mapped ) { 2342 map.push( i ); 2343 } 2344 } 2345 } 2346 } 2347 2348 return newUnmatched; 2349} 2350 2351function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { 2352 if ( postFilter && !postFilter[ expando ] ) { 2353 postFilter = setMatcher( postFilter ); 2354 } 2355 if ( postFinder && !postFinder[ expando ] ) { 2356 postFinder = setMatcher( postFinder, postSelector ); 2357 } 2358 return markFunction(function( seed, results, context, xml ) { 2359 var temp, i, elem, 2360 preMap = [], 2361 postMap = [], 2362 preexisting = results.length, 2363 2364 // Get initial elements from seed or context 2365 elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), 2366 2367 // Prefilter to get matcher input, preserving a map for seed-results synchronization 2368 matcherIn = preFilter && ( seed || !selector ) ? 2369 condense( elems, preMap, preFilter, context, xml ) : 2370 elems, 2371 2372 matcherOut = matcher ? 2373 // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, 2374 postFinder || ( seed ? preFilter : preexisting || postFilter ) ? 2375 2376 // ...intermediate processing is necessary 2377 [] : 2378 2379 // ...otherwise use results directly 2380 results : 2381 matcherIn; 2382 2383 // Find primary matches 2384 if ( matcher ) { 2385 matcher( matcherIn, matcherOut, context, xml ); 2386 } 2387 2388 // Apply postFilter 2389 if ( postFilter ) { 2390 temp = condense( matcherOut, postMap ); 2391 postFilter( temp, [], context, xml ); 2392 2393 // Un-match failing elements by moving them back to matcherIn 2394 i = temp.length; 2395 while ( i-- ) { 2396 if ( (elem = temp[i]) ) { 2397 matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); 2398 } 2399 } 2400 } 2401 2402 if ( seed ) { 2403 if ( postFinder || preFilter ) { 2404 if ( postFinder ) { 2405 // Get the final matcherOut by condensing this intermediate into postFinder contexts 2406 temp = []; 2407 i = matcherOut.length; 2408 while ( i-- ) { 2409 if ( (elem = matcherOut[i]) ) { 2410 // Restore matcherIn since elem is not yet a final match 2411 temp.push( (matcherIn[i] = elem) ); 2412 } 2413 } 2414 postFinder( null, (matcherOut = []), temp, xml ); 2415 } 2416 2417 // Move matched elements from seed to results to keep them synchronized 2418 i = matcherOut.length; 2419 while ( i-- ) { 2420 if ( (elem = matcherOut[i]) && 2421 (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { 2422 2423 seed[temp] = !(results[temp] = elem); 2424 } 2425 } 2426 } 2427 2428 // Add elements to results, through postFinder if defined 2429 } else { 2430 matcherOut = condense( 2431 matcherOut === results ? 2432 matcherOut.splice( preexisting, matcherOut.length ) : 2433 matcherOut 2434 ); 2435 if ( postFinder ) { 2436 postFinder( null, results, matcherOut, xml ); 2437 } else { 2438 push.apply( results, matcherOut ); 2439 } 2440 } 2441 }); 2442} 2443 2444function matcherFromTokens( tokens ) { 2445 var checkContext, matcher, j, 2446 len = tokens.length, 2447 leadingRelative = Expr.relative[ tokens[0].type ], 2448 implicitRelative = leadingRelative || Expr.relative[" "], 2449 i = leadingRelative ? 1 : 0, 2450 2451 // The foundational matcher ensures that elements are reachable from top-level context(s) 2452 matchContext = addCombinator( function( elem ) { 2453 return elem === checkContext; 2454 }, implicitRelative, true ), 2455 matchAnyContext = addCombinator( function( elem ) { 2456 return indexOf( checkContext, elem ) > -1; 2457 }, implicitRelative, true ), 2458 matchers = [ function( elem, context, xml ) { 2459 var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( 2460 (checkContext = context).nodeType ? 2461 matchContext( elem, context, xml ) : 2462 matchAnyContext( elem, context, xml ) ); 2463 // Avoid hanging onto element (issue #299) 2464 checkContext = null; 2465 return ret; 2466 } ]; 2467 2468 for ( ; i < len; i++ ) { 2469 if ( (matcher = Expr.relative[ tokens[i].type ]) ) { 2470 matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; 2471 } else { 2472 matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); 2473 2474 // Return special upon seeing a positional matcher 2475 if ( matcher[ expando ] ) { 2476 // Find the next relative operator (if any) for proper handling 2477 j = ++i; 2478 for ( ; j < len; j++ ) { 2479 if ( Expr.relative[ tokens[j].type ] ) { 2480 break; 2481 } 2482 } 2483 return setMatcher( 2484 i > 1 && elementMatcher( matchers ), 2485 i > 1 && toSelector( 2486 // If the preceding token was a descendant combinator, insert an implicit any-element `*` 2487 tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) 2488 ).replace( rtrim, "$1" ), 2489 matcher, 2490 i < j && matcherFromTokens( tokens.slice( i, j ) ), 2491 j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), 2492 j < len && toSelector( tokens ) 2493 ); 2494 } 2495 matchers.push( matcher ); 2496 } 2497 } 2498 2499 return elementMatcher( matchers ); 2500} 2501 2502function matcherFromGroupMatchers( elementMatchers, setMatchers ) { 2503 var bySet = setMatchers.length > 0, 2504 byElement = elementMatchers.length > 0, 2505 superMatcher = function( seed, context, xml, results, outermost ) { 2506 var elem, j, matcher, 2507 matchedCount = 0, 2508 i = "0", 2509 unmatched = seed && [], 2510 setMatched = [], 2511 contextBackup = outermostContext, 2512 // We must always have either seed elements or outermost context 2513 elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), 2514 // Use integer dirruns iff this is the outermost matcher 2515 dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), 2516 len = elems.length; 2517 2518 if ( outermost ) { 2519 outermostContext = context === document || context || outermost; 2520 } 2521 2522 // Add elements passing elementMatchers directly to results 2523 // Support: IE<9, Safari 2524 // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id 2525 for ( ; i !== len && (elem = elems[i]) != null; i++ ) { 2526 if ( byElement && elem ) { 2527 j = 0; 2528 if ( !context && elem.ownerDocument !== document ) { 2529 setDocument( elem ); 2530 xml = !documentIsHTML; 2531 } 2532 while ( (matcher = elementMatchers[j++]) ) { 2533 if ( matcher( elem, context || document, xml) ) { 2534 results.push( elem ); 2535 break; 2536 } 2537 } 2538 if ( outermost ) { 2539 dirruns = dirrunsUnique; 2540 } 2541 } 2542 2543 // Track unmatched elements for set filters 2544 if ( bySet ) { 2545 // They will have gone through all possible matchers 2546 if ( (elem = !matcher && elem) ) { 2547 matchedCount--; 2548 } 2549 2550 // Lengthen the array for every element, matched or not 2551 if ( seed ) { 2552 unmatched.push( elem ); 2553 } 2554 } 2555 } 2556 2557 // `i` is now the count of elements visited above, and adding it to `matchedCount` 2558 // makes the latter nonnegative. 2559 matchedCount += i; 2560 2561 // Apply set filters to unmatched elements 2562 // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` 2563 // equals `i`), unless we didn't visit _any_ elements in the above loop because we have 2564 // no element matchers and no seed. 2565 // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that 2566 // case, which will result in a "00" `matchedCount` that differs from `i` but is also 2567 // numerically zero. 2568 if ( bySet && i !== matchedCount ) { 2569 j = 0; 2570 while ( (matcher = setMatchers[j++]) ) { 2571 matcher( unmatched, setMatched, context, xml ); 2572 } 2573 2574 if ( seed ) { 2575 // Reintegrate element matches to eliminate the need for sorting 2576 if ( matchedCount > 0 ) { 2577 while ( i-- ) { 2578 if ( !(unmatched[i] || setMatched[i]) ) { 2579 setMatched[i] = pop.call( results ); 2580 } 2581 } 2582 } 2583 2584 // Discard index placeholder values to get only actual matches 2585 setMatched = condense( setMatched ); 2586 } 2587 2588 // Add matches to results 2589 push.apply( results, setMatched ); 2590 2591 // Seedless set matches succeeding multiple successful matchers stipulate sorting 2592 if ( outermost && !seed && setMatched.length > 0 && 2593 ( matchedCount + setMatchers.length ) > 1 ) { 2594 2595 Sizzle.uniqueSort( results ); 2596 } 2597 } 2598 2599 // Override manipulation of globals by nested matchers 2600 if ( outermost ) { 2601 dirruns = dirrunsUnique; 2602 outermostContext = contextBackup; 2603 } 2604 2605 return unmatched; 2606 }; 2607 2608 return bySet ? 2609 markFunction( superMatcher ) : 2610 superMatcher; 2611} 2612 2613compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { 2614 var i, 2615 setMatchers = [], 2616 elementMatchers = [], 2617 cached = compilerCache[ selector + " " ]; 2618 2619 if ( !cached ) { 2620 // Generate a function of recursive functions that can be used to check each element 2621 if ( !match ) { 2622 match = tokenize( selector ); 2623 } 2624 i = match.length; 2625 while ( i-- ) { 2626 cached = matcherFromTokens( match[i] ); 2627 if ( cached[ expando ] ) { 2628 setMatchers.push( cached ); 2629 } else { 2630 elementMatchers.push( cached ); 2631 } 2632 } 2633 2634 // Cache the compiled function 2635 cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); 2636 2637 // Save selector and tokenization 2638 cached.selector = selector; 2639 } 2640 return cached; 2641}; 2642 2643/** 2644 * A low-level selection function that works with Sizzle's compiled 2645 * selector functions 2646 * @param {String|Function} selector A selector or a pre-compiled 2647 * selector function built with Sizzle.compile 2648 * @param {Element} context 2649 * @param {Array} [results] 2650 * @param {Array} [seed] A set of elements to match against 2651 */ 2652select = Sizzle.select = function( selector, context, results, seed ) { 2653 var i, tokens, token, type, find, 2654 compiled = typeof selector === "function" && selector, 2655 match = !seed && tokenize( (selector = compiled.selector || selector) ); 2656 2657 results = results || []; 2658 2659 // Try to minimize operations if there is only one selector in the list and no seed 2660 // (the latter of which guarantees us context) 2661 if ( match.length === 1 ) { 2662 2663 // Reduce context if the leading compound selector is an ID 2664 tokens = match[0] = match[0].slice( 0 ); 2665 if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && 2666 context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) { 2667 2668 context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; 2669 if ( !context ) { 2670 return results; 2671 2672 // Precompiled matchers will still verify ancestry, so step up a level 2673 } else if ( compiled ) { 2674 context = context.parentNode; 2675 } 2676 2677 selector = selector.slice( tokens.shift().value.length ); 2678 } 2679 2680 // Fetch a seed set for right-to-left matching 2681 i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; 2682 while ( i-- ) { 2683 token = tokens[i]; 2684 2685 // Abort if we hit a combinator 2686 if ( Expr.relative[ (type = token.type) ] ) { 2687 break; 2688 } 2689 if ( (find = Expr.find[ type ]) ) { 2690 // Search, expanding context for leading sibling combinators 2691 if ( (seed = find( 2692 token.matches[0].replace( runescape, funescape ), 2693 rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context 2694 )) ) { 2695 2696 // If seed is empty or no tokens remain, we can return early 2697 tokens.splice( i, 1 ); 2698 selector = seed.length && toSelector( tokens ); 2699 if ( !selector ) { 2700 push.apply( results, seed ); 2701 return results; 2702 } 2703 2704 break; 2705 } 2706 } 2707 } 2708 } 2709 2710 // Compile and execute a filtering function if one is not provided 2711 // Provide `match` to avoid retokenization if we modified the selector above 2712 ( compiled || compile( selector, match ) )( 2713 seed, 2714 context, 2715 !documentIsHTML, 2716 results, 2717 !context || rsibling.test( selector ) && testContext( context.parentNode ) || context 2718 ); 2719 return results; 2720}; 2721 2722// One-time assignments 2723 2724// Sort stability 2725support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; 2726 2727// Support: Chrome 14-35+ 2728// Always assume duplicates if they aren't passed to the comparison function 2729support.detectDuplicates = !!hasDuplicate; 2730 2731// Initialize against the default document 2732setDocument(); 2733 2734// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) 2735// Detached nodes confoundingly follow *each other* 2736support.sortDetached = assert(function( el ) { 2737 // Should return 1, but returns 4 (following) 2738 return el.compareDocumentPosition( document.createElement("fieldset") ) & 1; 2739}); 2740 2741// Support: IE<8 2742// Prevent attribute/property "interpolation" 2743// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx 2744if ( !assert(function( el ) { 2745 el.innerHTML = "<a href='#'></a>"; 2746 return el.firstChild.getAttribute("href") === "#" ; 2747}) ) { 2748 addHandle( "type|href|height|width", function( elem, name, isXML ) { 2749 if ( !isXML ) { 2750 return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); 2751 } 2752 }); 2753} 2754 2755// Support: IE<9 2756// Use defaultValue in place of getAttribute("value") 2757if ( !support.attributes || !assert(function( el ) { 2758 el.innerHTML = "<input/>"; 2759 el.firstChild.setAttribute( "value", "" ); 2760 return el.firstChild.getAttribute( "value" ) === ""; 2761}) ) { 2762 addHandle( "value", function( elem, name, isXML ) { 2763 if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { 2764 return elem.defaultValue; 2765 } 2766 }); 2767} 2768 2769// Support: IE<9 2770// Use getAttributeNode to fetch booleans when getAttribute lies 2771if ( !assert(function( el ) { 2772 return el.getAttribute("disabled") == null; 2773}) ) { 2774 addHandle( booleans, function( elem, name, isXML ) { 2775 var val; 2776 if ( !isXML ) { 2777 return elem[ name ] === true ? name.toLowerCase() : 2778 (val = elem.getAttributeNode( name )) && val.specified ? 2779 val.value : 2780 null; 2781 } 2782 }); 2783} 2784 2785return Sizzle; 2786 2787})( window ); 2788 2789 2790 2791jQuery.find = Sizzle; 2792jQuery.expr = Sizzle.selectors; 2793 2794// Deprecated 2795jQuery.expr[ ":" ] = jQuery.expr.pseudos; 2796jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; 2797jQuery.text = Sizzle.getText; 2798jQuery.isXMLDoc = Sizzle.isXML; 2799jQuery.contains = Sizzle.contains; 2800jQuery.escapeSelector = Sizzle.escape; 2801 2802 2803 2804 2805var dir = function( elem, dir, until ) { 2806 var matched = [], 2807 truncate = until !== undefined; 2808 2809 while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { 2810 if ( elem.nodeType === 1 ) { 2811 if ( truncate && jQuery( elem ).is( until ) ) { 2812 break; 2813 } 2814 matched.push( elem ); 2815 } 2816 } 2817 return matched; 2818}; 2819 2820 2821var siblings = function( n, elem ) { 2822 var matched = []; 2823 2824 for ( ; n; n = n.nextSibling ) { 2825 if ( n.nodeType === 1 && n !== elem ) { 2826 matched.push( n ); 2827 } 2828 } 2829 2830 return matched; 2831}; 2832 2833 2834var rneedsContext = jQuery.expr.match.needsContext; 2835 2836 2837 2838function nodeName( elem, name ) { 2839 2840 return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); 2841 2842}; 2843var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); 2844 2845 2846 2847// Implement the identical functionality for filter and not 2848function winnow( elements, qualifier, not ) { 2849 if ( isFunction( qualifier ) ) { 2850 return jQuery.grep( elements, function( elem, i ) { 2851 return !!qualifier.call( elem, i, elem ) !== not; 2852 } ); 2853 } 2854 2855 // Single element 2856 if ( qualifier.nodeType ) { 2857 return jQuery.grep( elements, function( elem ) { 2858 return ( elem === qualifier ) !== not; 2859 } ); 2860 } 2861 2862 // Arraylike of elements (jQuery, arguments, Array) 2863 if ( typeof qualifier !== "string" ) { 2864 return jQuery.grep( elements, function( elem ) { 2865 return ( indexOf.call( qualifier, elem ) > -1 ) !== not; 2866 } ); 2867 } 2868 2869 // Filtered directly for both simple and complex selectors 2870 return jQuery.filter( qualifier, elements, not ); 2871} 2872 2873jQuery.filter = function( expr, elems, not ) { 2874 var elem = elems[ 0 ]; 2875 2876 if ( not ) { 2877 expr = ":not(" + expr + ")"; 2878 } 2879 2880 if ( elems.length === 1 && elem.nodeType === 1 ) { 2881 return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; 2882 } 2883 2884 return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { 2885 return elem.nodeType === 1; 2886 } ) ); 2887}; 2888 2889jQuery.fn.extend( { 2890 find: function( selector ) { 2891 var i, ret, 2892 len = this.length, 2893 self = this; 2894 2895 if ( typeof selector !== "string" ) {
vendor: 4,662 bytes, lines 2896-3081
2896 return this.pushStack( jQuery( selector ).filter( function() { 2897 for ( i = 0; i < len; i++ ) { 2898 if ( jQuery.contains( self[ i ], this ) ) { 2899 return true; 2900 } 2901 } 2902 } ) ); 2903 } 2904 2905 ret = this.pushStack( [] ); 2906 2907 for ( i = 0; i < len; i++ ) { 2908 jQuery.find( selector, self[ i ], ret ); 2909 } 2910 2911 return len > 1 ? jQuery.uniqueSort( ret ) : ret; 2912 }, 2913 filter: function( selector ) { 2914 return this.pushStack( winnow( this, selector || [], false ) ); 2915 }, 2916 not: function( selector ) { 2917 return this.pushStack( winnow( this, selector || [], true ) ); 2918 }, 2919 is: function( selector ) { 2920 return !!winnow( 2921 this, 2922 2923 // If this is a positional/relative selector, check membership in the returned set 2924 // so $("p:first").is("p:last") won't return true for a doc with two "p". 2925 typeof selector === "string" && rneedsContext.test( selector ) ? 2926 jQuery( selector ) : 2927 selector || [], 2928 false 2929 ).length; 2930 } 2931} ); 2932 2933 2934// Initialize a jQuery object 2935 2936 2937// A central reference to the root jQuery(document) 2938var rootjQuery, 2939 2940 // A simple way to check for HTML strings 2941 // Prioritize #id over <tag> to avoid XSS via location.hash (#9521) 2942 // Strict HTML recognition (#11290: must start with <) 2943 // Shortcut simple #id case for speed 2944 rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, 2945 2946 init = jQuery.fn.init = function( selector, context, root ) { 2947 var match, elem; 2948 2949 // HANDLE: $(""), $(null), $(undefined), $(false) 2950 if ( !selector ) { 2951 return this; 2952 } 2953 2954 // Method init() accepts an alternate rootjQuery 2955 // so migrate can support jQuery.sub (gh-2101) 2956 root = root || rootjQuery; 2957 2958 // Handle HTML strings 2959 if ( typeof selector === "string" ) { 2960 if ( selector[ 0 ] === "<" && 2961 selector[ selector.length - 1 ] === ">" && 2962 selector.length >= 3 ) { 2963 2964 // Assume that strings that start and end with <> are HTML and skip the regex check 2965 match = [ null, selector, null ]; 2966 2967 } else { 2968 match = rquickExpr.exec( selector ); 2969 } 2970 2971 // Match html or make sure no context is specified for #id 2972 if ( match && ( match[ 1 ] || !context ) ) { 2973 2974 // HANDLE: $(html) -> $(array) 2975 if ( match[ 1 ] ) { 2976 context = context instanceof jQuery ? context[ 0 ] : context; 2977 2978 // Option to run scripts is true for back-compat 2979 // Intentionally let the error be thrown if parseHTML is not present 2980 jQuery.merge( this, jQuery.parseHTML( 2981 match[ 1 ], 2982 context && context.nodeType ? context.ownerDocument || context : document, 2983 true 2984 ) ); 2985 2986 // HANDLE: $(html, props) 2987 if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { 2988 for ( match in context ) { 2989 2990 // Properties of context are called as methods if possible 2991 if ( isFunction( this[ match ] ) ) { 2992 this[ match ]( context[ match ] ); 2993 2994 // ...and otherwise set as attributes 2995 } else { 2996 this.attr( match, context[ match ] ); 2997 } 2998 } 2999 } 3000 3001 return this; 3002 3003 // HANDLE: $(#id) 3004 } else { 3005 elem = document.getElementById( match[ 2 ] ); 3006 3007 if ( elem ) { 3008 3009 // Inject the element directly into the jQuery object 3010 this[ 0 ] = elem; 3011 this.length = 1; 3012 } 3013 return this; 3014 } 3015 3016 // HANDLE: $(expr, $(...)) 3017 } else if ( !context || context.jquery ) { 3018 return ( context || root ).find( selector ); 3019 3020 // HANDLE: $(expr, context) 3021 // (which is just equivalent to: $(context).find(expr) 3022 } else { 3023 return this.constructor( context ).find( selector ); 3024 } 3025 3026 // HANDLE: $(DOMElement) 3027 } else if ( selector.nodeType ) { 3028 this[ 0 ] = selector; 3029 this.length = 1; 3030 return this; 3031 3032 // HANDLE: $(function) 3033 // Shortcut for document ready 3034 } else if ( isFunction( selector ) ) { 3035 return root.ready !== undefined ? 3036 root.ready( selector ) : 3037 3038 // Execute immediately if ready is not present 3039 selector( jQuery ); 3040 } 3041 3042 return jQuery.makeArray( selector, this ); 3043 }; 3044 3045// Give the init function the jQuery prototype for later instantiation 3046init.prototype = jQuery.fn; 3047 3048// Initialize central reference 3049rootjQuery = jQuery( document ); 3050 3051 3052var rparentsprev = /^(?:parents|prev(?:Until|All))/, 3053 3054 // Methods guaranteed to produce a unique set when starting from a unique set 3055 guaranteedUnique = { 3056 children: true, 3057 contents: true, 3058 next: true, 3059 prev: true 3060 }; 3061 3062jQuery.fn.extend( { 3063 has: function( target ) { 3064 var targets = jQuery( target, this ), 3065 l = targets.length; 3066 3067 return this.filter( function() { 3068 var i = 0; 3069 for ( ; i < l; i++ ) { 3070 if ( jQuery.contains( this, targets[ i ] ) ) { 3071 return true; 3072 } 3073 } 3074 } ); 3075 }, 3076 3077 closest: function( selectors, context ) { 3078 var cur, 3079 i = 0, 3080 l = this.length, 3081 matched = [],
vendor: 6,003 bytes, lines 3082-3308
3082 targets = typeof selectors !== "string" && jQuery( selectors ); 3083 3084 // Positional selectors never match, since there's no _selection_ context 3085 if ( !rneedsContext.test( selectors ) ) { 3086 for ( ; i < l; i++ ) { 3087 for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { 3088 3089 // Always skip document fragments 3090 if ( cur.nodeType < 11 && ( targets ? 3091 targets.index( cur ) > -1 : 3092 3093 // Don't pass non-elements to Sizzle 3094 cur.nodeType === 1 && 3095 jQuery.find.matchesSelector( cur, selectors ) ) ) { 3096 3097 matched.push( cur ); 3098 break; 3099 } 3100 } 3101 } 3102 } 3103 3104 return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); 3105 }, 3106 3107 // Determine the position of an element within the set 3108 index: function( elem ) { 3109 3110 // No argument, return index in parent 3111 if ( !elem ) { 3112 return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; 3113 } 3114 3115 // Index in selector 3116 if ( typeof elem === "string" ) { 3117 return indexOf.call( jQuery( elem ), this[ 0 ] ); 3118 } 3119 3120 // Locate the position of the desired element 3121 return indexOf.call( this, 3122 3123 // If it receives a jQuery object, the first element is used 3124 elem.jquery ? elem[ 0 ] : elem 3125 ); 3126 }, 3127 3128 add: function( selector, context ) { 3129 return this.pushStack( 3130 jQuery.uniqueSort( 3131 jQuery.merge( this.get(), jQuery( selector, context ) ) 3132 ) 3133 ); 3134 }, 3135 3136 addBack: function( selector ) { 3137 return this.add( selector == null ? 3138 this.prevObject : this.prevObject.filter( selector ) 3139 ); 3140 } 3141} ); 3142 3143function sibling( cur, dir ) { 3144 while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} 3145 return cur; 3146} 3147 3148jQuery.each( { 3149 parent: function( elem ) { 3150 var parent = elem.parentNode; 3151 return parent && parent.nodeType !== 11 ? parent : null; 3152 }, 3153 parents: function( elem ) { 3154 return dir( elem, "parentNode" ); 3155 }, 3156 parentsUntil: function( elem, i, until ) { 3157 return dir( elem, "parentNode", until ); 3158 }, 3159 next: function( elem ) { 3160 return sibling( elem, "nextSibling" ); 3161 }, 3162 prev: function( elem ) { 3163 return sibling( elem, "previousSibling" ); 3164 }, 3165 nextAll: function( elem ) { 3166 return dir( elem, "nextSibling" ); 3167 }, 3168 prevAll: function( elem ) { 3169 return dir( elem, "previousSibling" ); 3170 }, 3171 nextUntil: function( elem, i, until ) { 3172 return dir( elem, "nextSibling", until ); 3173 }, 3174 prevUntil: function( elem, i, until ) { 3175 return dir( elem, "previousSibling", until ); 3176 }, 3177 siblings: function( elem ) { 3178 return siblings( ( elem.parentNode || {} ).firstChild, elem ); 3179 }, 3180 children: function( elem ) { 3181 return siblings( elem.firstChild ); 3182 }, 3183 contents: function( elem ) { 3184 if ( nodeName( elem, "iframe" ) ) { 3185 return elem.contentDocument; 3186 } 3187 3188 // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only 3189 // Treat the template element as a regular one in browsers that 3190 // don't support it. 3191 if ( nodeName( elem, "template" ) ) { 3192 elem = elem.content || elem; 3193 } 3194 3195 return jQuery.merge( [], elem.childNodes ); 3196 } 3197}, function( name, fn ) { 3198 jQuery.fn[ name ] = function( until, selector ) { 3199 var matched = jQuery.map( this, fn, until ); 3200 3201 if ( name.slice( -5 ) !== "Until" ) { 3202 selector = until; 3203 } 3204 3205 if ( selector && typeof selector === "string" ) { 3206 matched = jQuery.filter( selector, matched ); 3207 } 3208 3209 if ( this.length > 1 ) { 3210 3211 // Remove duplicates 3212 if ( !guaranteedUnique[ name ] ) { 3213 jQuery.uniqueSort( matched ); 3214 } 3215 3216 // Reverse order for parents* and prev-derivatives 3217 if ( rparentsprev.test( name ) ) { 3218 matched.reverse(); 3219 } 3220 } 3221 3222 return this.pushStack( matched ); 3223 }; 3224} ); 3225var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); 3226 3227 3228 3229// Convert String-formatted options into Object-formatted ones 3230function createOptions( options ) { 3231 var object = {}; 3232 jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { 3233 object[ flag ] = true; 3234 } ); 3235 return object; 3236} 3237 3238/* 3239 * Create a callback list using the following parameters: 3240 * 3241 * options: an optional list of space-separated options that will change how 3242 * the callback list behaves or a more traditional option object 3243 * 3244 * By default a callback list will act like an event callback list and can be 3245 * "fired" multiple times. 3246 * 3247 * Possible options: 3248 * 3249 * once: will ensure the callback list can only be fired once (like a Deferred) 3250 * 3251 * memory: will keep track of previous values and will call any callback added 3252 * after the list has been fired right away with the latest "memorized" 3253 * values (like a Deferred) 3254 * 3255 * unique: will ensure a callback can only be added once (no duplicate in the list) 3256 * 3257 * stopOnFalse: interrupt callings when a callback returns false 3258 * 3259 */ 3260jQuery.Callbacks = function( options ) { 3261 3262 // Convert options from String-formatted to Object-formatted if needed 3263 // (we check in cache first) 3264 options = typeof options === "string" ? 3265 createOptions( options ) : 3266 jQuery.extend( {}, options ); 3267 3268 var // Flag to know if list is currently firing 3269 firing, 3270 3271 // Last fire value for non-forgettable lists 3272 memory, 3273 3274 // Flag to know if list was already fired 3275 fired, 3276 3277 // Flag to prevent firing 3278 locked, 3279 3280 // Actual callback list 3281 list = [], 3282 3283 // Queue of execution data for repeatable lists 3284 queue = [], 3285 3286 // Index of currently firing callback (modified by add/remove as needed) 3287 firingIndex = -1, 3288 3289 // Fire callbacks 3290 fire = function() { 3291 3292 // Enforce single-firing 3293 locked = locked || options.once; 3294 3295 // Execute callbacks for all pending executions, 3296 // respecting firingIndex overrides and runtime changes 3297 fired = firing = true; 3298 for ( ; queue.length; firingIndex = -1 ) { 3299 memory = queue.shift(); 3300 while ( ++firingIndex < list.length ) { 3301 3302 // Run callback and check for early termination 3303 if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && 3304 options.stopOnFalse ) { 3305 3306 // Jump to end and forget the data so .add doesn't re-fire 3307 firingIndex = list.length; 3308 memory = false;
vendor: 4,918 bytes, lines 3309-3518
3309 } 3310 } 3311 } 3312 3313 // Forget the data if we're done with it 3314 if ( !options.memory ) { 3315 memory = false; 3316 } 3317 3318 firing = false; 3319 3320 // Clean up if we're done firing for good 3321 if ( locked ) { 3322 3323 // Keep an empty list if we have data for future add calls 3324 if ( memory ) { 3325 list = []; 3326 3327 // Otherwise, this object is spent 3328 } else { 3329 list = ""; 3330 } 3331 } 3332 }, 3333 3334 // Actual Callbacks object 3335 self = { 3336 3337 // Add a callback or a collection of callbacks to the list 3338 add: function() { 3339 if ( list ) { 3340 3341 // If we have memory from a past run, we should fire after adding 3342 if ( memory && !firing ) { 3343 firingIndex = list.length - 1; 3344 queue.push( memory ); 3345 } 3346 3347 ( function add( args ) { 3348 jQuery.each( args, function( _, arg ) { 3349 if ( isFunction( arg ) ) { 3350 if ( !options.unique || !self.has( arg ) ) { 3351 list.push( arg ); 3352 } 3353 } else if ( arg && arg.length && toType( arg ) !== "string" ) { 3354 3355 // Inspect recursively 3356 add( arg ); 3357 } 3358 } ); 3359 } )( arguments ); 3360 3361 if ( memory && !firing ) { 3362 fire(); 3363 } 3364 } 3365 return this; 3366 }, 3367 3368 // Remove a callback from the list 3369 remove: function() { 3370 jQuery.each( arguments, function( _, arg ) { 3371 var index; 3372 while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { 3373 list.splice( index, 1 ); 3374 3375 // Handle firing indexes 3376 if ( index <= firingIndex ) { 3377 firingIndex--; 3378 } 3379 } 3380 } ); 3381 return this; 3382 }, 3383 3384 // Check if a given callback is in the list. 3385 // If no argument is given, return whether or not list has callbacks attached. 3386 has: function( fn ) { 3387 return fn ? 3388 jQuery.inArray( fn, list ) > -1 : 3389 list.length > 0; 3390 }, 3391 3392 // Remove all callbacks from the list 3393 empty: function() { 3394 if ( list ) { 3395 list = []; 3396 } 3397 return this; 3398 }, 3399 3400 // Disable .fire and .add 3401 // Abort any current/pending executions 3402 // Clear all callbacks and values 3403 disable: function() { 3404 locked = queue = []; 3405 list = memory = ""; 3406 return this; 3407 }, 3408 disabled: function() { 3409 return !list; 3410 }, 3411 3412 // Disable .fire 3413 // Also disable .add unless we have memory (since it would have no effect) 3414 // Abort any pending executions 3415 lock: function() { 3416 locked = queue = []; 3417 if ( !memory && !firing ) { 3418 list = memory = ""; 3419 } 3420 return this; 3421 }, 3422 locked: function() { 3423 return !!locked; 3424 }, 3425 3426 // Call all callbacks with the given context and arguments 3427 fireWith: function( context, args ) { 3428 if ( !locked ) { 3429 args = args || []; 3430 args = [ context, args.slice ? args.slice() : args ]; 3431 queue.push( args ); 3432 if ( !firing ) { 3433 fire(); 3434 } 3435 } 3436 return this; 3437 }, 3438 3439 // Call all the callbacks with the given arguments 3440 fire: function() { 3441 self.fireWith( this, arguments ); 3442 return this; 3443 }, 3444 3445 // To know if the callbacks have already been called at least once 3446 fired: function() { 3447 return !!fired; 3448 } 3449 }; 3450 3451 return self; 3452}; 3453 3454 3455function Identity( v ) { 3456 return v; 3457} 3458function Thrower( ex ) { 3459 throw ex; 3460} 3461 3462function adoptValue( value, resolve, reject, noValue ) { 3463 var method; 3464 3465 try { 3466 3467 // Check for promise aspect first to privilege synchronous behavior 3468 if ( value && isFunction( ( method = value.promise ) ) ) { 3469 method.call( value ).done( resolve ).fail( reject ); 3470 3471 // Other thenables 3472 } else if ( value && isFunction( ( method = value.then ) ) ) { 3473 method.call( value, resolve, reject ); 3474 3475 // Other non-thenables 3476 } else { 3477 3478 // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: 3479 // * false: [ value ].slice( 0 ) => resolve( value ) 3480 // * true: [ value ].slice( 1 ) => resolve() 3481 resolve.apply( undefined, [ value ].slice( noValue ) ); 3482 } 3483 3484 // For Promises/A+, convert exceptions into rejections 3485 // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in 3486 // Deferred#then to conditionally suppress rejection. 3487 } catch ( value ) { 3488 3489 // Support: Android 4.0 only 3490 // Strict mode functions invoked without .call/.apply get global-object context 3491 reject.apply( undefined, [ value ] ); 3492 } 3493} 3494 3495jQuery.extend( { 3496 3497 Deferred: function( func ) { 3498 var tuples = [ 3499 3500 // action, add listener, callbacks, 3501 // ... .then handlers, argument index, [final state] 3502 [ "notify", "progress", jQuery.Callbacks( "memory" ), 3503 jQuery.Callbacks( "memory" ), 2 ], 3504 [ "resolve", "done", jQuery.Callbacks( "once memory" ), 3505 jQuery.Callbacks( "once memory" ), 0, "resolved" ], 3506 [ "reject", "fail", jQuery.Callbacks( "once memory" ), 3507 jQuery.Callbacks( "once memory" ), 1, "rejected" ] 3508 ], 3509 state = "pending", 3510 promise = { 3511 state: function() { 3512 return state; 3513 }, 3514 always: function() { 3515 deferred.done( arguments ).fail( arguments ); 3516 return this; 3517 }, 3518 "catch": function( fn ) {
vendor: 15,167 bytes, lines 3519-4110
3519 return promise.then( null, fn ); 3520 }, 3521 3522 // Keep pipe for back-compat 3523 pipe: function( /* fnDone, fnFail, fnProgress */ ) { 3524 var fns = arguments; 3525 3526 return jQuery.Deferred( function( newDefer ) { 3527 jQuery.each( tuples, function( i, tuple ) { 3528 3529 // Map tuples (progress, done, fail) to arguments (done, fail, progress) 3530 var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; 3531 3532 // deferred.progress(function() { bind to newDefer or newDefer.notify }) 3533 // deferred.done(function() { bind to newDefer or newDefer.resolve }) 3534 // deferred.fail(function() { bind to newDefer or newDefer.reject }) 3535 deferred[ tuple[ 1 ] ]( function() { 3536 var returned = fn && fn.apply( this, arguments ); 3537 if ( returned && isFunction( returned.promise ) ) { 3538 returned.promise() 3539 .progress( newDefer.notify ) 3540 .done( newDefer.resolve ) 3541 .fail( newDefer.reject ); 3542 } else { 3543 newDefer[ tuple[ 0 ] + "With" ]( 3544 this, 3545 fn ? [ returned ] : arguments 3546 ); 3547 } 3548 } ); 3549 } ); 3550 fns = null; 3551 } ).promise(); 3552 }, 3553 then: function( onFulfilled, onRejected, onProgress ) { 3554 var maxDepth = 0; 3555 function resolve( depth, deferred, handler, special ) { 3556 return function() { 3557 var that = this, 3558 args = arguments, 3559 mightThrow = function() { 3560 var returned, then; 3561 3562 // Support: Promises/A+ section 2.3.3.3.3 3563 // https://promisesaplus.com/#point-59 3564 // Ignore double-resolution attempts 3565 if ( depth < maxDepth ) { 3566 return; 3567 } 3568 3569 returned = handler.apply( that, args ); 3570 3571 // Support: Promises/A+ section 2.3.1 3572 // https://promisesaplus.com/#point-48 3573 if ( returned === deferred.promise() ) { 3574 throw new TypeError( "Thenable self-resolution" ); 3575 } 3576 3577 // Support: Promises/A+ sections 2.3.3.1, 3.5 3578 // https://promisesaplus.com/#point-54 3579 // https://promisesaplus.com/#point-75 3580 // Retrieve `then` only once 3581 then = returned && 3582 3583 // Support: Promises/A+ section 2.3.4 3584 // https://promisesaplus.com/#point-64 3585 // Only check objects and functions for thenability 3586 ( typeof returned === "object" || 3587 typeof returned === "function" ) && 3588 returned.then; 3589 3590 // Handle a returned thenable 3591 if ( isFunction( then ) ) { 3592 3593 // Special processors (notify) just wait for resolution 3594 if ( special ) { 3595 then.call( 3596 returned, 3597 resolve( maxDepth, deferred, Identity, special ), 3598 resolve( maxDepth, deferred, Thrower, special ) 3599 ); 3600 3601 // Normal processors (resolve) also hook into progress 3602 } else { 3603 3604 // ...and disregard older resolution values 3605 maxDepth++; 3606 3607 then.call( 3608 returned, 3609 resolve( maxDepth, deferred, Identity, special ), 3610 resolve( maxDepth, deferred, Thrower, special ), 3611 resolve( maxDepth, deferred, Identity, 3612 deferred.notifyWith ) 3613 ); 3614 } 3615 3616 // Handle all other returned values 3617 } else { 3618 3619 // Only substitute handlers pass on context 3620 // and multiple values (non-spec behavior) 3621 if ( handler !== Identity ) { 3622 that = undefined; 3623 args = [ returned ]; 3624 } 3625 3626 // Process the value(s) 3627 // Default process is resolve 3628 ( special || deferred.resolveWith )( that, args ); 3629 } 3630 }, 3631 3632 // Only normal processors (resolve) catch and reject exceptions 3633 process = special ? 3634 mightThrow : 3635 function() { 3636 try { 3637 mightThrow(); 3638 } catch ( e ) { 3639 3640 if ( jQuery.Deferred.exceptionHook ) { 3641 jQuery.Deferred.exceptionHook( e, 3642 process.stackTrace ); 3643 } 3644 3645 // Support: Promises/A+ section 2.3.3.3.4.1 3646 // https://promisesaplus.com/#point-61 3647 // Ignore post-resolution exceptions 3648 if ( depth + 1 >= maxDepth ) { 3649 3650 // Only substitute handlers pass on context 3651 // and multiple values (non-spec behavior) 3652 if ( handler !== Thrower ) { 3653 that = undefined; 3654 args = [ e ]; 3655 } 3656 3657 deferred.rejectWith( that, args ); 3658 } 3659 } 3660 }; 3661 3662 // Support: Promises/A+ section 2.3.3.3.1 3663 // https://promisesaplus.com/#point-57 3664 // Re-resolve promises immediately to dodge false rejection from 3665 // subsequent errors 3666 if ( depth ) { 3667 process(); 3668 } else { 3669 3670 // Call an optional hook to record the stack, in case of exception 3671 // since it's otherwise lost when execution goes async 3672 if ( jQuery.Deferred.getStackHook ) { 3673 process.stackTrace = jQuery.Deferred.getStackHook(); 3674 } 3675 window.setTimeout( process ); 3676 } 3677 }; 3678 } 3679 3680 return jQuery.Deferred( function( newDefer ) { 3681 3682 // progress_handlers.add( ... ) 3683 tuples[ 0 ][ 3 ].add( 3684 resolve( 3685 0, 3686 newDefer, 3687 isFunction( onProgress ) ? 3688 onProgress : 3689 Identity, 3690 newDefer.notifyWith 3691 ) 3692 ); 3693 3694 // fulfilled_handlers.add( ... ) 3695 tuples[ 1 ][ 3 ].add( 3696 resolve( 3697 0, 3698 newDefer, 3699 isFunction( onFulfilled ) ? 3700 onFulfilled : 3701 Identity 3702 ) 3703 ); 3704 3705 // rejected_handlers.add( ... ) 3706 tuples[ 2 ][ 3 ].add( 3707 resolve( 3708 0, 3709 newDefer, 3710 isFunction( onRejected ) ? 3711 onRejected : 3712 Thrower 3713 ) 3714 ); 3715 } ).promise(); 3716 }, 3717 3718 // Get a promise for this deferred 3719 // If obj is provided, the promise aspect is added to the object 3720 promise: function( obj ) { 3721 return obj != null ? jQuery.extend( obj, promise ) : promise; 3722 } 3723 }, 3724 deferred = {}; 3725 3726 // Add list-specific methods 3727 jQuery.each( tuples, function( i, tuple ) { 3728 var list = tuple[ 2 ], 3729 stateString = tuple[ 5 ]; 3730 3731 // promise.progress = list.add 3732 // promise.done = list.add 3733 // promise.fail = list.add 3734 promise[ tuple[ 1 ] ] = list.add; 3735 3736 // Handle state 3737 if ( stateString ) { 3738 list.add( 3739 function() { 3740 3741 // state = "resolved" (i.e., fulfilled) 3742 // state = "rejected" 3743 state = stateString; 3744 }, 3745 3746 // rejected_callbacks.disable 3747 // fulfilled_callbacks.disable 3748 tuples[ 3 - i ][ 2 ].disable, 3749 3750 // rejected_handlers.disable 3751 // fulfilled_handlers.disable 3752 tuples[ 3 - i ][ 3 ].disable, 3753 3754 // progress_callbacks.lock 3755 tuples[ 0 ][ 2 ].lock, 3756 3757 // progress_handlers.lock 3758 tuples[ 0 ][ 3 ].lock 3759 ); 3760 } 3761 3762 // progress_handlers.fire 3763 // fulfilled_handlers.fire 3764 // rejected_handlers.fire 3765 list.add( tuple[ 3 ].fire ); 3766 3767 // deferred.notify = function() { deferred.notifyWith(...) } 3768 // deferred.resolve = function() { deferred.resolveWith(...) } 3769 // deferred.reject = function() { deferred.rejectWith(...) } 3770 deferred[ tuple[ 0 ] ] = function() { 3771 deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); 3772 return this; 3773 }; 3774 3775 // deferred.notifyWith = list.fireWith 3776 // deferred.resolveWith = list.fireWith 3777 // deferred.rejectWith = list.fireWith 3778 deferred[ tuple[ 0 ] + "With" ] = list.fireWith; 3779 } ); 3780 3781 // Make the deferred a promise 3782 promise.promise( deferred ); 3783 3784 // Call given func if any 3785 if ( func ) { 3786 func.call( deferred, deferred ); 3787 } 3788 3789 // All done! 3790 return deferred; 3791 }, 3792 3793 // Deferred helper 3794 when: function( singleValue ) { 3795 var 3796 3797 // count of uncompleted subordinates 3798 remaining = arguments.length, 3799 3800 // count of unprocessed arguments 3801 i = remaining, 3802 3803 // subordinate fulfillment data 3804 resolveContexts = Array( i ), 3805 resolveValues = slice.call( arguments ), 3806 3807 // the master Deferred 3808 master = jQuery.Deferred(), 3809 3810 // subordinate callback factory 3811 updateFunc = function( i ) { 3812 return function( value ) { 3813 resolveContexts[ i ] = this; 3814 resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; 3815 if ( !( --remaining ) ) { 3816 master.resolveWith( resolveContexts, resolveValues ); 3817 } 3818 }; 3819 }; 3820 3821 // Single- and empty arguments are adopted like Promise.resolve 3822 if ( remaining <= 1 ) { 3823 adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, 3824 !remaining ); 3825 3826 // Use .then() to unwrap secondary thenables (cf. gh-3000) 3827 if ( master.state() === "pending" || 3828 isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { 3829 3830 return master.then(); 3831 } 3832 } 3833 3834 // Multiple arguments are aggregated like Promise.all array elements 3835 while ( i-- ) { 3836 adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); 3837 } 3838 3839 return master.promise(); 3840 } 3841} ); 3842 3843 3844// These usually indicate a programmer mistake during development, 3845// warn about them ASAP rather than swallowing them by default. 3846var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; 3847 3848jQuery.Deferred.exceptionHook = function( error, stack ) { 3849 3850 // Support: IE 8 - 9 only 3851 // Console exists when dev tools are open, which can happen at any time 3852 if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { 3853 window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); 3854 } 3855}; 3856 3857 3858 3859 3860jQuery.readyException = function( error ) { 3861 window.setTimeout( function() { 3862 throw error; 3863 } ); 3864}; 3865 3866 3867 3868 3869// The deferred used on DOM ready 3870var readyList = jQuery.Deferred(); 3871 3872jQuery.fn.ready = function( fn ) { 3873 3874 readyList 3875 .then( fn ) 3876 3877 // Wrap jQuery.readyException in a function so that the lookup 3878 // happens at the time of error handling instead of callback 3879 // registration. 3880 .catch( function( error ) { 3881 jQuery.readyException( error ); 3882 } ); 3883 3884 return this; 3885}; 3886 3887jQuery.extend( { 3888 3889 // Is the DOM ready to be used? Set to true once it occurs. 3890 isReady: false, 3891 3892 // A counter to track how many items to wait for before 3893 // the ready event fires. See #6781 3894 readyWait: 1, 3895 3896 // Handle when the DOM is ready 3897 ready: function( wait ) { 3898 3899 // Abort if there are pending holds or we're already ready 3900 if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { 3901 return; 3902 } 3903 3904 // Remember that the DOM is ready 3905 jQuery.isReady = true; 3906 3907 // If a normal DOM Ready event fired, decrement, and wait if need be 3908 if ( wait !== true && --jQuery.readyWait > 0 ) { 3909 return; 3910 } 3911 3912 // If there are functions bound, to execute 3913 readyList.resolveWith( document, [ jQuery ] ); 3914 } 3915} ); 3916 3917jQuery.ready.then = readyList.then; 3918 3919// The ready event handler and self cleanup method 3920function completed() { 3921 document.removeEventListener( "DOMContentLoaded", completed ); 3922 window.removeEventListener( "load", completed ); 3923 jQuery.ready(); 3924} 3925 3926// Catch cases where $(document).ready() is called 3927// after the browser event has already occurred. 3928// Support: IE <=9 - 10 only 3929// Older IE sometimes signals "interactive" too soon 3930if ( document.readyState === "complete" || 3931 ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { 3932 3933 // Handle it asynchronously to allow scripts the opportunity to delay ready 3934 window.setTimeout( jQuery.ready ); 3935 3936} else { 3937 3938 // Use the handy event callback 3939 document.addEventListener( "DOMContentLoaded", completed ); 3940 3941 // A fallback to window.onload, that will always work 3942 window.addEventListener( "load", completed ); 3943} 3944 3945 3946 3947 3948// Multifunctional method to get and set values of a collection 3949// The value/s can optionally be executed if it's a function 3950var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { 3951 var i = 0, 3952 len = elems.length, 3953 bulk = key == null; 3954 3955 // Sets many values 3956 if ( toType( key ) === "object" ) { 3957 chainable = true; 3958 for ( i in key ) { 3959 access( elems, fn, i, key[ i ], true, emptyGet, raw ); 3960 } 3961 3962 // Sets one value 3963 } else if ( value !== undefined ) { 3964 chainable = true; 3965 3966 if ( !isFunction( value ) ) { 3967 raw = true; 3968 } 3969 3970 if ( bulk ) { 3971 3972 // Bulk operations run against the entire set 3973 if ( raw ) { 3974 fn.call( elems, value ); 3975 fn = null; 3976 3977 // ...except when executing function values 3978 } else { 3979 bulk = fn; 3980 fn = function( elem, key, value ) { 3981 return bulk.call( jQuery( elem ), value ); 3982 }; 3983 } 3984 } 3985 3986 if ( fn ) { 3987 for ( ; i < len; i++ ) { 3988 fn( 3989 elems[ i ], key, raw ? 3990 value : 3991 value.call( elems[ i ], i, fn( elems[ i ], key ) ) 3992 ); 3993 } 3994 } 3995 } 3996 3997 if ( chainable ) { 3998 return elems; 3999 } 4000 4001 // Gets 4002 if ( bulk ) { 4003 return fn.call( elems ); 4004 } 4005 4006 return len ? fn( elems[ 0 ], key ) : emptyGet; 4007}; 4008 4009 4010// Matches dashed string for camelizing 4011var rmsPrefix = /^-ms-/, 4012 rdashAlpha = /-([a-z])/g; 4013 4014// Used by camelCase as callback to replace() 4015function fcamelCase( all, letter ) { 4016 return letter.toUpperCase(); 4017} 4018 4019// Convert dashed to camelCase; used by the css and data modules 4020// Support: IE <=9 - 11, Edge 12 - 15 4021// Microsoft forgot to hump their vendor prefix (#9572) 4022function camelCase( string ) { 4023 return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); 4024} 4025var acceptData = function( owner ) { 4026 4027 // Accepts only: 4028 // - Node 4029 // - Node.ELEMENT_NODE 4030 // - Node.DOCUMENT_NODE 4031 // - Object 4032 // - Any 4033 return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); 4034}; 4035 4036 4037 4038 4039function Data() { 4040 this.expando = jQuery.expando + Data.uid++; 4041} 4042 4043Data.uid = 1; 4044 4045Data.prototype = { 4046 4047 cache: function( owner ) { 4048 4049 // Check if the owner object already has a cache 4050 var value = owner[ this.expando ]; 4051 4052 // If not, create one 4053 if ( !value ) { 4054 value = {}; 4055 4056 // We can accept data for non-element nodes in modern browsers, 4057 // but we should not, see #8335. 4058 // Always return an empty object. 4059 if ( acceptData( owner ) ) { 4060 4061 // If it is a node unlikely to be stringify-ed or looped over 4062 // use plain assignment 4063 if ( owner.nodeType ) { 4064 owner[ this.expando ] = value; 4065 4066 // Otherwise secure it in a non-enumerable property 4067 // configurable must be true to allow the property to be 4068 // deleted when data is removed 4069 } else { 4070 Object.defineProperty( owner, this.expando, { 4071 value: value, 4072 configurable: true 4073 } ); 4074 } 4075 } 4076 } 4077 4078 return value; 4079 }, 4080 set: function( owner, data, value ) { 4081 var prop, 4082 cache = this.cache( owner ); 4083 4084 // Handle: [ owner, key, value ] args 4085 // Always use camelCase key (gh-2257) 4086 if ( typeof data === "string" ) { 4087 cache[ camelCase( data ) ] = value; 4088 4089 // Handle: [ owner, { properties } ] args 4090 } else { 4091 4092 // Copy the properties one-by-one to the cache object 4093 for ( prop in data ) { 4094 cache[ camelCase( prop ) ] = data[ prop ]; 4095 } 4096 } 4097 return cache; 4098 }, 4099 get: function( owner, key ) { 4100 return key === undefined ? 4101 this.cache( owner ) : 4102 4103 // Always use camelCase key (gh-2257) 4104 owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; 4105 }, 4106 access: function( owner, key, value ) { 4107 4108 // In cases where either: 4109 // 4110 // 1. No key was specified
vendor: 8,694 bytes, lines 4111-4469
4111 // 2. A string key was specified, but no value provided 4112 // 4113 // Take the "read" path and allow the get method to determine 4114 // which value to return, respectively either: 4115 // 4116 // 1. The entire cache object 4117 // 2. The data stored at the key 4118 // 4119 if ( key === undefined || 4120 ( ( key && typeof key === "string" ) && value === undefined ) ) { 4121 4122 return this.get( owner, key ); 4123 } 4124 4125 // When the key is not a string, or both a key and value 4126 // are specified, set or extend (existing objects) with either: 4127 // 4128 // 1. An object of properties 4129 // 2. A key and value 4130 // 4131 this.set( owner, key, value ); 4132 4133 // Since the "set" path can have two possible entry points 4134 // return the expected data based on which path was taken[*] 4135 return value !== undefined ? value : key; 4136 }, 4137 remove: function( owner, key ) { 4138 var i, 4139 cache = owner[ this.expando ]; 4140 4141 if ( cache === undefined ) { 4142 return; 4143 } 4144 4145 if ( key !== undefined ) { 4146 4147 // Support array or space separated string of keys 4148 if ( Array.isArray( key ) ) { 4149 4150 // If key is an array of keys... 4151 // We always set camelCase keys, so remove that. 4152 key = key.map( camelCase ); 4153 } else { 4154 key = camelCase( key ); 4155 4156 // If a key with the spaces exists, use it. 4157 // Otherwise, create an array by matching non-whitespace 4158 key = key in cache ? 4159 [ key ] : 4160 ( key.match( rnothtmlwhite ) || [] ); 4161 } 4162 4163 i = key.length; 4164 4165 while ( i-- ) { 4166 delete cache[ key[ i ] ]; 4167 } 4168 } 4169 4170 // Remove the expando if there's no more data 4171 if ( key === undefined || jQuery.isEmptyObject( cache ) ) { 4172 4173 // Support: Chrome <=35 - 45 4174 // Webkit & Blink performance suffers when deleting properties 4175 // from DOM nodes, so set to undefined instead 4176 // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) 4177 if ( owner.nodeType ) { 4178 owner[ this.expando ] = undefined; 4179 } else { 4180 delete owner[ this.expando ]; 4181 } 4182 } 4183 }, 4184 hasData: function( owner ) { 4185 var cache = owner[ this.expando ]; 4186 return cache !== undefined && !jQuery.isEmptyObject( cache ); 4187 } 4188}; 4189var dataPriv = new Data(); 4190 4191var dataUser = new Data(); 4192 4193 4194 4195// Implementation Summary 4196// 4197// 1. Enforce API surface and semantic compatibility with 1.9.x branch 4198// 2. Improve the module's maintainability by reducing the storage 4199// paths to a single mechanism. 4200// 3. Use the same single mechanism to support "private" and "user" data. 4201// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) 4202// 5. Avoid exposing implementation details on user objects (eg. expando properties) 4203// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 4204 4205var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, 4206 rmultiDash = /[A-Z]/g; 4207 4208function getData( data ) { 4209 if ( data === "true" ) { 4210 return true; 4211 } 4212 4213 if ( data === "false" ) { 4214 return false; 4215 } 4216 4217 if ( data === "null" ) { 4218 return null; 4219 } 4220 4221 // Only convert to a number if it doesn't change the string 4222 if ( data === +data + "" ) { 4223 return +data; 4224 } 4225 4226 if ( rbrace.test( data ) ) { 4227 return JSON.parse( data ); 4228 } 4229 4230 return data; 4231} 4232 4233function dataAttr( elem, key, data ) { 4234 var name; 4235 4236 // If nothing was found internally, try to fetch any 4237 // data from the HTML5 data-* attribute 4238 if ( data === undefined && elem.nodeType === 1 ) { 4239 name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); 4240 data = elem.getAttribute( name ); 4241 4242 if ( typeof data === "string" ) { 4243 try { 4244 data = getData( data ); 4245 } catch ( e ) {} 4246 4247 // Make sure we set the data so it isn't changed later 4248 dataUser.set( elem, key, data ); 4249 } else { 4250 data = undefined; 4251 } 4252 } 4253 return data; 4254} 4255 4256jQuery.extend( { 4257 hasData: function( elem ) { 4258 return dataUser.hasData( elem ) || dataPriv.hasData( elem ); 4259 }, 4260 4261 data: function( elem, name, data ) { 4262 return dataUser.access( elem, name, data ); 4263 }, 4264 4265 removeData: function( elem, name ) { 4266 dataUser.remove( elem, name ); 4267 }, 4268 4269 // TODO: Now that all calls to _data and _removeData have been replaced 4270 // with direct calls to dataPriv methods, these can be deprecated. 4271 _data: function( elem, name, data ) { 4272 return dataPriv.access( elem, name, data ); 4273 }, 4274 4275 _removeData: function( elem, name ) { 4276 dataPriv.remove( elem, name ); 4277 } 4278} ); 4279 4280jQuery.fn.extend( { 4281 data: function( key, value ) { 4282 var i, name, data, 4283 elem = this[ 0 ], 4284 attrs = elem && elem.attributes; 4285 4286 // Gets all values 4287 if ( key === undefined ) { 4288 if ( this.length ) { 4289 data = dataUser.get( elem ); 4290 4291 if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { 4292 i = attrs.length; 4293 while ( i-- ) { 4294 4295 // Support: IE 11 only 4296 // The attrs elements can be null (#14894) 4297 if ( attrs[ i ] ) { 4298 name = attrs[ i ].name; 4299 if ( name.indexOf( "data-" ) === 0 ) { 4300 name = camelCase( name.slice( 5 ) ); 4301 dataAttr( elem, name, data[ name ] ); 4302 } 4303 } 4304 } 4305 dataPriv.set( elem, "hasDataAttrs", true ); 4306 } 4307 } 4308 4309 return data; 4310 } 4311 4312 // Sets multiple values 4313 if ( typeof key === "object" ) { 4314 return this.each( function() { 4315 dataUser.set( this, key ); 4316 } ); 4317 } 4318 4319 return access( this, function( value ) { 4320 var data; 4321 4322 // The calling jQuery object (element matches) is not empty 4323 // (and therefore has an element appears at this[ 0 ]) and the 4324 // `value` parameter was not undefined. An empty jQuery object 4325 // will result in `undefined` for elem = this[ 0 ] which will 4326 // throw an exception if an attempt to read a data cache is made. 4327 if ( elem && value === undefined ) { 4328 4329 // Attempt to get data from the cache 4330 // The key will always be camelCased in Data 4331 data = dataUser.get( elem, key ); 4332 if ( data !== undefined ) { 4333 return data; 4334 } 4335 4336 // Attempt to "discover" the data in 4337 // HTML5 custom data-* attrs 4338 data = dataAttr( elem, key ); 4339 if ( data !== undefined ) { 4340 return data; 4341 } 4342 4343 // We tried really hard, but the data doesn't exist. 4344 return; 4345 } 4346 4347 // Set the data... 4348 this.each( function() { 4349 4350 // We always store the camelCased key 4351 dataUser.set( this, key, value ); 4352 } ); 4353 }, null, value, arguments.length > 1, null, true ); 4354 }, 4355 4356 removeData: function( key ) { 4357 return this.each( function() { 4358 dataUser.remove( this, key ); 4359 } ); 4360 } 4361} ); 4362 4363 4364jQuery.extend( { 4365 queue: function( elem, type, data ) { 4366 var queue; 4367 4368 if ( elem ) { 4369 type = ( type || "fx" ) + "queue"; 4370 queue = dataPriv.get( elem, type ); 4371 4372 // Speed up dequeue by getting out quickly if this is just a lookup 4373 if ( data ) { 4374 if ( !queue || Array.isArray( data ) ) { 4375 queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); 4376 } else { 4377 queue.push( data ); 4378 } 4379 } 4380 return queue || []; 4381 } 4382 }, 4383 4384 dequeue: function( elem, type ) { 4385 type = type || "fx"; 4386 4387 var queue = jQuery.queue( elem, type ), 4388 startLength = queue.length, 4389 fn = queue.shift(), 4390 hooks = jQuery._queueHooks( elem, type ), 4391 next = function() { 4392 jQuery.dequeue( elem, type ); 4393 }; 4394 4395 // If the fx queue is dequeued, always remove the progress sentinel 4396 if ( fn === "inprogress" ) { 4397 fn = queue.shift(); 4398 startLength--; 4399 } 4400 4401 if ( fn ) { 4402 4403 // Add a progress sentinel to prevent the fx queue from being 4404 // automatically dequeued 4405 if ( type === "fx" ) { 4406 queue.unshift( "inprogress" ); 4407 } 4408 4409 // Clear up the last queue stop function 4410 delete hooks.stop; 4411 fn.call( elem, next, hooks ); 4412 } 4413 4414 if ( !startLength && hooks ) { 4415 hooks.empty.fire(); 4416 } 4417 }, 4418 4419 // Not public - generate a queueHooks object, or return the current one 4420 _queueHooks: function( elem, type ) { 4421 var key = type + "queueHooks"; 4422 return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { 4423 empty: jQuery.Callbacks( "once memory" ).add( function() { 4424 dataPriv.remove( elem, [ type + "queue", key ] ); 4425 } ) 4426 } ); 4427 } 4428} ); 4429 4430jQuery.fn.extend( { 4431 queue: function( type, data ) { 4432 var setter = 2; 4433 4434 if ( typeof type !== "string" ) { 4435 data = type; 4436 type = "fx"; 4437 setter--; 4438 } 4439 4440 if ( arguments.length < setter ) { 4441 return jQuery.queue( this[ 0 ], type ); 4442 } 4443 4444 return data === undefined ? 4445 this : 4446 this.each( function() { 4447 var queue = jQuery.queue( this, type, data ); 4448 4449 // Ensure a hooks for this queue 4450 jQuery._queueHooks( this, type ); 4451 4452 if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { 4453 jQuery.dequeue( this, type ); 4454 } 4455 } ); 4456 }, 4457 dequeue: function( type ) { 4458 return this.each( function() { 4459 jQuery.dequeue( this, type ); 4460 } ); 4461 }, 4462 clearQueue: function( type ) { 4463 return this.queue( type || "fx", [] ); 4464 }, 4465 4466 // Get a promise resolved when queues of a certain type 4467 // are emptied (fx is the type by default) 4468 promise: function( type, obj ) { 4469 var tmp,
vendor: 37,137 bytes, lines 4470-5895
4470 count = 1, 4471 defer = jQuery.Deferred(), 4472 elements = this, 4473 i = this.length, 4474 resolve = function() { 4475 if ( !( --count ) ) { 4476 defer.resolveWith( elements, [ elements ] ); 4477 } 4478 }; 4479 4480 if ( typeof type !== "string" ) { 4481 obj = type; 4482 type = undefined; 4483 } 4484 type = type || "fx"; 4485 4486 while ( i-- ) { 4487 tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); 4488 if ( tmp && tmp.empty ) { 4489 count++; 4490 tmp.empty.add( resolve ); 4491 } 4492 } 4493 resolve(); 4494 return defer.promise( obj ); 4495 } 4496} ); 4497var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; 4498 4499var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); 4500 4501 4502var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; 4503 4504var isHiddenWithinTree = function( elem, el ) { 4505 4506 // isHiddenWithinTree might be called from jQuery#filter function; 4507 // in that case, element will be second argument 4508 elem = el || elem; 4509 4510 // Inline style trumps all 4511 return elem.style.display === "none" || 4512 elem.style.display === "" && 4513 4514 // Otherwise, check computed style 4515 // Support: Firefox <=43 - 45 4516 // Disconnected elements can have computed display: none, so first confirm that elem is 4517 // in the document. 4518 jQuery.contains( elem.ownerDocument, elem ) && 4519 4520 jQuery.css( elem, "display" ) === "none"; 4521 }; 4522 4523var swap = function( elem, options, callback, args ) { 4524 var ret, name, 4525 old = {}; 4526 4527 // Remember the old values, and insert the new ones 4528 for ( name in options ) { 4529 old[ name ] = elem.style[ name ]; 4530 elem.style[ name ] = options[ name ]; 4531 } 4532 4533 ret = callback.apply( elem, args || [] ); 4534 4535 // Revert the old values 4536 for ( name in options ) { 4537 elem.style[ name ] = old[ name ]; 4538 } 4539 4540 return ret; 4541}; 4542 4543 4544 4545 4546function adjustCSS( elem, prop, valueParts, tween ) { 4547 var adjusted, scale, 4548 maxIterations = 20, 4549 currentValue = tween ? 4550 function() { 4551 return tween.cur(); 4552 } : 4553 function() { 4554 return jQuery.css( elem, prop, "" ); 4555 }, 4556 initial = currentValue(), 4557 unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), 4558 4559 // Starting value computation is required for potential unit mismatches 4560 initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && 4561 rcssNum.exec( jQuery.css( elem, prop ) ); 4562 4563 if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { 4564 4565 // Support: Firefox <=54 4566 // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) 4567 initial = initial / 2; 4568 4569 // Trust units reported by jQuery.css 4570 unit = unit || initialInUnit[ 3 ]; 4571 4572 // Iteratively approximate from a nonzero starting point 4573 initialInUnit = +initial || 1; 4574 4575 while ( maxIterations-- ) { 4576 4577 // Evaluate and update our best guess (doubling guesses that zero out). 4578 // Finish if the scale equals or crosses 1 (making the old*new product non-positive). 4579 jQuery.style( elem, prop, initialInUnit + unit ); 4580 if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { 4581 maxIterations = 0; 4582 } 4583 initialInUnit = initialInUnit / scale; 4584 4585 } 4586 4587 initialInUnit = initialInUnit * 2; 4588 jQuery.style( elem, prop, initialInUnit + unit ); 4589 4590 // Make sure we update the tween properties later on 4591 valueParts = valueParts || []; 4592 } 4593 4594 if ( valueParts ) { 4595 initialInUnit = +initialInUnit || +initial || 0; 4596 4597 // Apply relative offset (+=/-=) if specified 4598 adjusted = valueParts[ 1 ] ? 4599 initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : 4600 +valueParts[ 2 ]; 4601 if ( tween ) { 4602 tween.unit = unit; 4603 tween.start = initialInUnit; 4604 tween.end = adjusted; 4605 } 4606 } 4607 return adjusted; 4608} 4609 4610 4611var defaultDisplayMap = {}; 4612 4613function getDefaultDisplay( elem ) { 4614 var temp, 4615 doc = elem.ownerDocument, 4616 nodeName = elem.nodeName, 4617 display = defaultDisplayMap[ nodeName ]; 4618 4619 if ( display ) { 4620 return display; 4621 } 4622 4623 temp = doc.body.appendChild( doc.createElement( nodeName ) ); 4624 display = jQuery.css( temp, "display" ); 4625 4626 temp.parentNode.removeChild( temp ); 4627 4628 if ( display === "none" ) { 4629 display = "block"; 4630 } 4631 defaultDisplayMap[ nodeName ] = display; 4632 4633 return display; 4634} 4635 4636function showHide( elements, show ) { 4637 var display, elem, 4638 values = [], 4639 index = 0, 4640 length = elements.length; 4641 4642 // Determine new display value for elements that need to change 4643 for ( ; index < length; index++ ) { 4644 elem = elements[ index ]; 4645 if ( !elem.style ) { 4646 continue; 4647 } 4648 4649 display = elem.style.display; 4650 if ( show ) { 4651 4652 // Since we force visibility upon cascade-hidden elements, an immediate (and slow) 4653 // check is required in this first loop unless we have a nonempty display value (either 4654 // inline or about-to-be-restored) 4655 if ( display === "none" ) { 4656 values[ index ] = dataPriv.get( elem, "display" ) || null; 4657 if ( !values[ index ] ) { 4658 elem.style.display = ""; 4659 } 4660 } 4661 if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { 4662 values[ index ] = getDefaultDisplay( elem ); 4663 } 4664 } else { 4665 if ( display !== "none" ) { 4666 values[ index ] = "none"; 4667 4668 // Remember what we're overwriting 4669 dataPriv.set( elem, "display", display ); 4670 } 4671 } 4672 } 4673 4674 // Set the display of the elements in a second loop to avoid constant reflow 4675 for ( index = 0; index < length; index++ ) { 4676 if ( values[ index ] != null ) { 4677 elements[ index ].style.display = values[ index ]; 4678 } 4679 } 4680 4681 return elements; 4682} 4683 4684jQuery.fn.extend( { 4685 show: function() { 4686 return showHide( this, true ); 4687 }, 4688 hide: function() { 4689 return showHide( this ); 4690 }, 4691 toggle: function( state ) { 4692 if ( typeof state === "boolean" ) { 4693 return state ? this.show() : this.hide(); 4694 } 4695 4696 return this.each( function() { 4697 if ( isHiddenWithinTree( this ) ) { 4698 jQuery( this ).show(); 4699 } else { 4700 jQuery( this ).hide(); 4701 } 4702 } ); 4703 } 4704} ); 4705var rcheckableType = ( /^(?:checkbox|radio)$/i ); 4706 4707var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]+)/i ); 4708 4709var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); 4710 4711 4712 4713// We have to close these tags to support XHTML (#13200) 4714var wrapMap = { 4715 4716 // Support: IE <=9 only 4717 option: [ 1, "<select multiple='multiple'>", "</select>" ], 4718 4719 // XHTML parsers do not magically insert elements in the 4720 // same way that tag soup parsers do. So we cannot shorten 4721 // this by omitting <tbody> or other required elements. 4722 thead: [ 1, "<table>", "</table>" ], 4723 col: [ 2, "<table><colgroup>", "</colgroup></table>" ], 4724 tr: [ 2, "<table><tbody>", "</tbody></table>" ], 4725 td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ], 4726 4727 _default: [ 0, "", "" ] 4728}; 4729 4730// Support: IE <=9 only 4731wrapMap.optgroup = wrapMap.option; 4732 4733wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; 4734wrapMap.th = wrapMap.td; 4735 4736 4737function getAll( context, tag ) { 4738 4739 // Support: IE <=9 - 11 only 4740 // Use typeof to avoid zero-argument method invocation on host objects (#15151) 4741 var ret; 4742 4743 if ( typeof context.getElementsByTagName !== "undefined" ) { 4744 ret = context.getElementsByTagName( tag || "*" ); 4745 4746 } else if ( typeof context.querySelectorAll !== "undefined" ) { 4747 ret = context.querySelectorAll( tag || "*" ); 4748 4749 } else { 4750 ret = []; 4751 } 4752 4753 if ( tag === undefined || tag && nodeName( context, tag ) ) { 4754 return jQuery.merge( [ context ], ret ); 4755 } 4756 4757 return ret; 4758} 4759 4760 4761// Mark scripts as having already been evaluated 4762function setGlobalEval( elems, refElements ) { 4763 var i = 0, 4764 l = elems.length; 4765 4766 for ( ; i < l; i++ ) { 4767 dataPriv.set( 4768 elems[ i ], 4769 "globalEval", 4770 !refElements || dataPriv.get( refElements[ i ], "globalEval" ) 4771 ); 4772 } 4773} 4774 4775 4776var rhtml = /<|&#?\w+;/; 4777 4778function buildFragment( elems, context, scripts, selection, ignored ) { 4779 var elem, tmp, tag, wrap, contains, j, 4780 fragment = context.createDocumentFragment(), 4781 nodes = [], 4782 i = 0, 4783 l = elems.length; 4784 4785 for ( ; i < l; i++ ) { 4786 elem = elems[ i ]; 4787 4788 if ( elem || elem === 0 ) { 4789 4790 // Add nodes directly 4791 if ( toType( elem ) === "object" ) { 4792 4793 // Support: Android <=4.0 only, PhantomJS 1 only 4794 // push.apply(_, arraylike) throws on ancient WebKit 4795 jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); 4796 4797 // Convert non-html into a text node 4798 } else if ( !rhtml.test( elem ) ) { 4799 nodes.push( context.createTextNode( elem ) ); 4800 4801 // Convert html into DOM nodes 4802 } else { 4803 tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); 4804 4805 // Deserialize a standard representation 4806 tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); 4807 wrap = wrapMap[ tag ] || wrapMap._default; 4808 tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; 4809 4810 // Descend through wrappers to the right content 4811 j = wrap[ 0 ]; 4812 while ( j-- ) { 4813 tmp = tmp.lastChild; 4814 } 4815 4816 // Support: Android <=4.0 only, PhantomJS 1 only 4817 // push.apply(_, arraylike) throws on ancient WebKit 4818 jQuery.merge( nodes, tmp.childNodes ); 4819 4820 // Remember the top-level container 4821 tmp = fragment.firstChild; 4822 4823 // Ensure the created nodes are orphaned (#12392) 4824 tmp.textContent = ""; 4825 } 4826 } 4827 } 4828 4829 // Remove wrapper from fragment 4830 fragment.textContent = ""; 4831 4832 i = 0; 4833 while ( ( elem = nodes[ i++ ] ) ) { 4834 4835 // Skip elements already in the context collection (trac-4087) 4836 if ( selection && jQuery.inArray( elem, selection ) > -1 ) { 4837 if ( ignored ) { 4838 ignored.push( elem ); 4839 } 4840 continue; 4841 } 4842 4843 contains = jQuery.contains( elem.ownerDocument, elem ); 4844 4845 // Append to fragment 4846 tmp = getAll( fragment.appendChild( elem ), "script" ); 4847 4848 // Preserve script evaluation history 4849 if ( contains ) { 4850 setGlobalEval( tmp ); 4851 } 4852 4853 // Capture executables 4854 if ( scripts ) { 4855 j = 0; 4856 while ( ( elem = tmp[ j++ ] ) ) { 4857 if ( rscriptType.test( elem.type || "" ) ) { 4858 scripts.push( elem ); 4859 } 4860 } 4861 } 4862 } 4863 4864 return fragment; 4865} 4866 4867 4868( function() { 4869 var fragment = document.createDocumentFragment(), 4870 div = fragment.appendChild( document.createElement( "div" ) ), 4871 input = document.createElement( "input" ); 4872 4873 // Support: Android 4.0 - 4.3 only 4874 // Check state lost if the name is set (#11217) 4875 // Support: Windows Web Apps (WWA) 4876 // `name` and `type` must use .setAttribute for WWA (#14901) 4877 input.setAttribute( "type", "radio" ); 4878 input.setAttribute( "checked", "checked" ); 4879 input.setAttribute( "name", "t" ); 4880 4881 div.appendChild( input ); 4882 4883 // Support: Android <=4.1 only 4884 // Older WebKit doesn't clone checked state correctly in fragments 4885 support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; 4886 4887 // Support: IE <=11 only 4888 // Make sure textarea (and checkbox) defaultValue is properly cloned 4889 div.innerHTML = "<textarea>x</textarea>"; 4890 support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; 4891} )(); 4892var documentElement = document.documentElement; 4893 4894 4895 4896var 4897 rkeyEvent = /^key/, 4898 rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, 4899 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; 4900 4901function returnTrue() { 4902 return true; 4903} 4904 4905function returnFalse() { 4906 return false; 4907} 4908 4909// Support: IE <=9 only 4910// See #13393 for more info 4911function safeActiveElement() { 4912 try { 4913 return document.activeElement; 4914 } catch ( err ) { } 4915} 4916 4917function on( elem, types, selector, data, fn, one ) { 4918 var origFn, type; 4919 4920 // Types can be a map of types/handlers 4921 if ( typeof types === "object" ) { 4922 4923 // ( types-Object, selector, data ) 4924 if ( typeof selector !== "string" ) { 4925 4926 // ( types-Object, data ) 4927 data = data || selector; 4928 selector = undefined; 4929 } 4930 for ( type in types ) { 4931 on( elem, type, selector, data, types[ type ], one ); 4932 } 4933 return elem; 4934 } 4935 4936 if ( data == null && fn == null ) { 4937 4938 // ( types, fn ) 4939 fn = selector; 4940 data = selector = undefined; 4941 } else if ( fn == null ) { 4942 if ( typeof selector === "string" ) { 4943 4944 // ( types, selector, fn ) 4945 fn = data; 4946 data = undefined; 4947 } else { 4948 4949 // ( types, data, fn ) 4950 fn = data; 4951 data = selector; 4952 selector = undefined; 4953 } 4954 } 4955 if ( fn === false ) { 4956 fn = returnFalse; 4957 } else if ( !fn ) { 4958 return elem; 4959 } 4960 4961 if ( one === 1 ) { 4962 origFn = fn; 4963 fn = function( event ) { 4964 4965 // Can use an empty set, since event contains the info 4966 jQuery().off( event ); 4967 return origFn.apply( this, arguments ); 4968 }; 4969 4970 // Use same guid so caller can remove using origFn 4971 fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); 4972 } 4973 return elem.each( function() { 4974 jQuery.event.add( this, types, fn, data, selector ); 4975 } ); 4976} 4977 4978/* 4979 * Helper functions for managing events -- not part of the public interface. 4980 * Props to Dean Edwards' addEvent library for many of the ideas. 4981 */ 4982jQuery.event = { 4983 4984 global: {}, 4985 4986 add: function( elem, types, handler, data, selector ) { 4987 4988 var handleObjIn, eventHandle, tmp, 4989 events, t, handleObj, 4990 special, handlers, type, namespaces, origType, 4991 elemData = dataPriv.get( elem ); 4992 4993 // Don't attach events to noData or text/comment nodes (but allow plain objects) 4994 if ( !elemData ) { 4995 return; 4996 } 4997 4998 // Caller can pass in an object of custom data in lieu of the handler 4999 if ( handler.handler ) { 5000 handleObjIn = handler; 5001 handler = handleObjIn.handler; 5002 selector = handleObjIn.selector; 5003 } 5004 5005 // Ensure that invalid selectors throw exceptions at attach time 5006 // Evaluate against documentElement in case elem is a non-element node (e.g., document) 5007 if ( selector ) { 5008 jQuery.find.matchesSelector( documentElement, selector ); 5009 } 5010 5011 // Make sure that the handler has a unique ID, used to find/remove it later 5012 if ( !handler.guid ) { 5013 handler.guid = jQuery.guid++; 5014 } 5015 5016 // Init the element's event structure and main handler, if this is the first 5017 if ( !( events = elemData.events ) ) { 5018 events = elemData.events = {}; 5019 } 5020 if ( !( eventHandle = elemData.handle ) ) { 5021 eventHandle = elemData.handle = function( e ) { 5022 5023 // Discard the second event of a jQuery.event.trigger() and 5024 // when an event is called after a page has unloaded 5025 return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? 5026 jQuery.event.dispatch.apply( elem, arguments ) : undefined; 5027 }; 5028 } 5029 5030 // Handle multiple events separated by a space 5031 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5032 t = types.length; 5033 while ( t-- ) { 5034 tmp = rtypenamespace.exec( types[ t ] ) || []; 5035 type = origType = tmp[ 1 ]; 5036 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5037 5038 // There *must* be a type, no attaching namespace-only handlers 5039 if ( !type ) { 5040 continue; 5041 } 5042 5043 // If event changes its type, use the special event handlers for the changed type 5044 special = jQuery.event.special[ type ] || {}; 5045 5046 // If selector defined, determine special event api type, otherwise given type 5047 type = ( selector ? special.delegateType : special.bindType ) || type; 5048 5049 // Update special based on newly reset type 5050 special = jQuery.event.special[ type ] || {}; 5051 5052 // handleObj is passed to all event handlers 5053 handleObj = jQuery.extend( { 5054 type: type, 5055 origType: origType, 5056 data: data, 5057 handler: handler, 5058 guid: handler.guid, 5059 selector: selector, 5060 needsContext: selector && jQuery.expr.match.needsContext.test( selector ), 5061 namespace: namespaces.join( "." ) 5062 }, handleObjIn ); 5063 5064 // Init the event handler queue if we're the first 5065 if ( !( handlers = events[ type ] ) ) { 5066 handlers = events[ type ] = []; 5067 handlers.delegateCount = 0; 5068 5069 // Only use addEventListener if the special events handler returns false 5070 if ( !special.setup || 5071 special.setup.call( elem, data, namespaces, eventHandle ) === false ) { 5072 5073 if ( elem.addEventListener ) { 5074 elem.addEventListener( type, eventHandle ); 5075 } 5076 } 5077 } 5078 5079 if ( special.add ) { 5080 special.add.call( elem, handleObj ); 5081 5082 if ( !handleObj.handler.guid ) { 5083 handleObj.handler.guid = handler.guid; 5084 } 5085 } 5086 5087 // Add to the element's handler list, delegates in front 5088 if ( selector ) { 5089 handlers.splice( handlers.delegateCount++, 0, handleObj ); 5090 } else { 5091 handlers.push( handleObj ); 5092 } 5093 5094 // Keep track of which events have ever been used, for event optimization 5095 jQuery.event.global[ type ] = true; 5096 } 5097 5098 }, 5099 5100 // Detach an event or set of events from an element 5101 remove: function( elem, types, handler, selector, mappedTypes ) { 5102 5103 var j, origCount, tmp, 5104 events, t, handleObj, 5105 special, handlers, type, namespaces, origType, 5106 elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); 5107 5108 if ( !elemData || !( events = elemData.events ) ) { 5109 return; 5110 } 5111 5112 // Once for each type.namespace in types; type may be omitted 5113 types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; 5114 t = types.length; 5115 while ( t-- ) { 5116 tmp = rtypenamespace.exec( types[ t ] ) || []; 5117 type = origType = tmp[ 1 ]; 5118 namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); 5119 5120 // Unbind all events (on this namespace, if provided) for the element 5121 if ( !type ) { 5122 for ( type in events ) { 5123 jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); 5124 } 5125 continue; 5126 } 5127 5128 special = jQuery.event.special[ type ] || {}; 5129 type = ( selector ? special.delegateType : special.bindType ) || type; 5130 handlers = events[ type ] || []; 5131 tmp = tmp[ 2 ] && 5132 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); 5133 5134 // Remove matching events 5135 origCount = j = handlers.length; 5136 while ( j-- ) { 5137 handleObj = handlers[ j ]; 5138 5139 if ( ( mappedTypes || origType === handleObj.origType ) && 5140 ( !handler || handler.guid === handleObj.guid ) && 5141 ( !tmp || tmp.test( handleObj.namespace ) ) && 5142 ( !selector || selector === handleObj.selector || 5143 selector === "**" && handleObj.selector ) ) { 5144 handlers.splice( j, 1 ); 5145 5146 if ( handleObj.selector ) { 5147 handlers.delegateCount--; 5148 } 5149 if ( special.remove ) { 5150 special.remove.call( elem, handleObj ); 5151 } 5152 } 5153 } 5154 5155 // Remove generic event handler if we removed something and no more handlers exist 5156 // (avoids potential for endless recursion during removal of special event handlers) 5157 if ( origCount && !handlers.length ) { 5158 if ( !special.teardown || 5159 special.teardown.call( elem, namespaces, elemData.handle ) === false ) { 5160 5161 jQuery.removeEvent( elem, type, elemData.handle ); 5162 } 5163 5164 delete events[ type ]; 5165 } 5166 } 5167 5168 // Remove data and the expando if it's no longer used 5169 if ( jQuery.isEmptyObject( events ) ) { 5170 dataPriv.remove( elem, "handle events" ); 5171 } 5172 }, 5173 5174 dispatch: function( nativeEvent ) { 5175 5176 // Make a writable jQuery.Event from the native event object 5177 var event = jQuery.event.fix( nativeEvent ); 5178 5179 var i, j, ret, matched, handleObj, handlerQueue, 5180 args = new Array( arguments.length ), 5181 handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [], 5182 special = jQuery.event.special[ event.type ] || {}; 5183 5184 // Use the fix-ed jQuery.Event rather than the (read-only) native event 5185 args[ 0 ] = event; 5186 5187 for ( i = 1; i < arguments.length; i++ ) { 5188 args[ i ] = arguments[ i ]; 5189 } 5190 5191 event.delegateTarget = this; 5192 5193 // Call the preDispatch hook for the mapped type, and let it bail if desired 5194 if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { 5195 return; 5196 } 5197 5198 // Determine handlers 5199 handlerQueue = jQuery.event.handlers.call( this, event, handlers ); 5200 5201 // Run delegates first; they may want to stop propagation beneath us 5202 i = 0; 5203 while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { 5204 event.currentTarget = matched.elem; 5205 5206 j = 0; 5207 while ( ( handleObj = matched.handlers[ j++ ] ) && 5208 !event.isImmediatePropagationStopped() ) { 5209 5210 // Triggered event must either 1) have no namespace, or 2) have namespace(s) 5211 // a subset or equal to those in the bound event (both can have no namespace). 5212 if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { 5213 5214 event.handleObj = handleObj; 5215 event.data = handleObj.data; 5216 5217 ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || 5218 handleObj.handler ).apply( matched.elem, args ); 5219 5220 if ( ret !== undefined ) { 5221 if ( ( event.result = ret ) === false ) { 5222 event.preventDefault(); 5223 event.stopPropagation(); 5224 } 5225 } 5226 } 5227 } 5228 } 5229 5230 // Call the postDispatch hook for the mapped type 5231 if ( special.postDispatch ) { 5232 special.postDispatch.call( this, event ); 5233 } 5234 5235 return event.result; 5236 }, 5237 5238 handlers: function( event, handlers ) { 5239 var i, handleObj, sel, matchedHandlers, matchedSelectors, 5240 handlerQueue = [], 5241 delegateCount = handlers.delegateCount, 5242 cur = event.target; 5243 5244 // Find delegate handlers 5245 if ( delegateCount && 5246 5247 // Support: IE <=9 5248 // Black-hole SVG <use> instance trees (trac-13180) 5249 cur.nodeType && 5250 5251 // Support: Firefox <=42 5252 // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) 5253 // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click 5254 // Support: IE 11 only 5255 // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) 5256 !( event.type === "click" && event.button >= 1 ) ) { 5257 5258 for ( ; cur !== this; cur = cur.parentNode || this ) { 5259 5260 // Don't check non-elements (#13208) 5261 // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) 5262 if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { 5263 matchedHandlers = []; 5264 matchedSelectors = {}; 5265 for ( i = 0; i < delegateCount; i++ ) { 5266 handleObj = handlers[ i ]; 5267 5268 // Don't conflict with Object.prototype properties (#13203) 5269 sel = handleObj.selector + " "; 5270 5271 if ( matchedSelectors[ sel ] === undefined ) { 5272 matchedSelectors[ sel ] = handleObj.needsContext ? 5273 jQuery( sel, this ).index( cur ) > -1 : 5274 jQuery.find( sel, this, null, [ cur ] ).length; 5275 } 5276 if ( matchedSelectors[ sel ] ) { 5277 matchedHandlers.push( handleObj ); 5278 } 5279 } 5280 if ( matchedHandlers.length ) { 5281 handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); 5282 } 5283 } 5284 } 5285 } 5286 5287 // Add the remaining (directly-bound) handlers 5288 cur = this; 5289 if ( delegateCount < handlers.length ) { 5290 handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); 5291 } 5292 5293 return handlerQueue; 5294 }, 5295 5296 addProp: function( name, hook ) { 5297 Object.defineProperty( jQuery.Event.prototype, name, { 5298 enumerable: true, 5299 configurable: true, 5300 5301 get: isFunction( hook ) ? 5302 function() { 5303 if ( this.originalEvent ) { 5304 return hook( this.originalEvent ); 5305 } 5306 } : 5307 function() { 5308 if ( this.originalEvent ) { 5309 return this.originalEvent[ name ]; 5310 } 5311 }, 5312 5313 set: function( value ) { 5314 Object.defineProperty( this, name, { 5315 enumerable: true, 5316 configurable: true, 5317 writable: true, 5318 value: value 5319 } ); 5320 } 5321 } ); 5322 }, 5323 5324 fix: function( originalEvent ) { 5325 return originalEvent[ jQuery.expando ] ? 5326 originalEvent : 5327 new jQuery.Event( originalEvent ); 5328 }, 5329 5330 special: { 5331 load: { 5332 5333 // Prevent triggered image.load events from bubbling to window.load 5334 noBubble: true 5335 }, 5336 focus: { 5337 5338 // Fire native event if possible so blur/focus sequence is correct 5339 trigger: function() { 5340 if ( this !== safeActiveElement() && this.focus ) { 5341 this.focus(); 5342 return false; 5343 } 5344 }, 5345 delegateType: "focusin" 5346 }, 5347 blur: { 5348 trigger: function() { 5349 if ( this === safeActiveElement() && this.blur ) { 5350 this.blur(); 5351 return false; 5352 } 5353 }, 5354 delegateType: "focusout" 5355 }, 5356 click: { 5357 5358 // For checkbox, fire native event so checked state will be right 5359 trigger: function() { 5360 if ( this.type === "checkbox" && this.click && nodeName( this, "input" ) ) { 5361 this.click(); 5362 return false; 5363 } 5364 }, 5365 5366 // For cross-browser consistency, don't fire native .click() on links 5367 _default: function( event ) { 5368 return nodeName( event.target, "a" ); 5369 } 5370 }, 5371 5372 beforeunload: { 5373 postDispatch: function( event ) { 5374 5375 // Support: Firefox 20+ 5376 // Firefox doesn't alert if the returnValue field is not set. 5377 if ( event.result !== undefined && event.originalEvent ) { 5378 event.originalEvent.returnValue = event.result; 5379 } 5380 } 5381 } 5382 } 5383}; 5384 5385jQuery.removeEvent = function( elem, type, handle ) { 5386 5387 // This "if" is needed for plain objects 5388 if ( elem.removeEventListener ) { 5389 elem.removeEventListener( type, handle ); 5390 } 5391}; 5392 5393jQuery.Event = function( src, props ) { 5394 5395 // Allow instantiation without the 'new' keyword 5396 if ( !( this instanceof jQuery.Event ) ) { 5397 return new jQuery.Event( src, props ); 5398 } 5399 5400 // Event object 5401 if ( src && src.type ) { 5402 this.originalEvent = src; 5403 this.type = src.type; 5404 5405 // Events bubbling up the document may have been marked as prevented 5406 // by a handler lower down the tree; reflect the correct value. 5407 this.isDefaultPrevented = src.defaultPrevented || 5408 src.defaultPrevented === undefined && 5409 5410 // Support: Android <=2.3 only 5411 src.returnValue === false ? 5412 returnTrue : 5413 returnFalse; 5414 5415 // Create target properties 5416 // Support: Safari <=6 - 7 only 5417 // Target should not be a text node (#504, #13143) 5418 this.target = ( src.target && src.target.nodeType === 3 ) ? 5419 src.target.parentNode : 5420 src.target; 5421 5422 this.currentTarget = src.currentTarget; 5423 this.relatedTarget = src.relatedTarget; 5424 5425 // Event type 5426 } else { 5427 this.type = src; 5428 } 5429 5430 // Put explicitly provided properties onto the event object 5431 if ( props ) { 5432 jQuery.extend( this, props ); 5433 } 5434 5435 // Create a timestamp if incoming event doesn't have one 5436 this.timeStamp = src && src.timeStamp || Date.now(); 5437 5438 // Mark it as fixed 5439 this[ jQuery.expando ] = true; 5440}; 5441 5442// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding 5443// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html 5444jQuery.Event.prototype = { 5445 constructor: jQuery.Event, 5446 isDefaultPrevented: returnFalse, 5447 isPropagationStopped: returnFalse, 5448 isImmediatePropagationStopped: returnFalse, 5449 isSimulated: false, 5450 5451 preventDefault: function() { 5452 var e = this.originalEvent; 5453 5454 this.isDefaultPrevented = returnTrue; 5455 5456 if ( e && !this.isSimulated ) { 5457 e.preventDefault(); 5458 } 5459 }, 5460 stopPropagation: function() { 5461 var e = this.originalEvent; 5462 5463 this.isPropagationStopped = returnTrue; 5464 5465 if ( e && !this.isSimulated ) { 5466 e.stopPropagation(); 5467 } 5468 }, 5469 stopImmediatePropagation: function() { 5470 var e = this.originalEvent; 5471 5472 this.isImmediatePropagationStopped = returnTrue; 5473 5474 if ( e && !this.isSimulated ) { 5475 e.stopImmediatePropagation(); 5476 } 5477 5478 this.stopPropagation(); 5479 } 5480}; 5481 5482// Includes all common event props including KeyEvent and MouseEvent specific props 5483jQuery.each( { 5484 altKey: true, 5485 bubbles: true, 5486 cancelable: true, 5487 changedTouches: true, 5488 ctrlKey: true, 5489 detail: true, 5490 eventPhase: true, 5491 metaKey: true, 5492 pageX: true, 5493 pageY: true, 5494 shiftKey: true, 5495 view: true, 5496 "char": true, 5497 charCode: true, 5498 key: true, 5499 keyCode: true, 5500 button: true, 5501 buttons: true, 5502 clientX: true, 5503 clientY: true, 5504 offsetX: true, 5505 offsetY: true, 5506 pointerId: true, 5507 pointerType: true, 5508 screenX: true, 5509 screenY: true, 5510 targetTouches: true, 5511 toElement: true, 5512 touches: true, 5513 5514 which: function( event ) { 5515 var button = event.button; 5516 5517 // Add which for key events 5518 if ( event.which == null && rkeyEvent.test( event.type ) ) { 5519 return event.charCode != null ? event.charCode : event.keyCode; 5520 } 5521 5522 // Add which for click: 1 === left; 2 === middle; 3 === right 5523 if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { 5524 if ( button & 1 ) { 5525 return 1; 5526 } 5527 5528 if ( button & 2 ) { 5529 return 3; 5530 } 5531 5532 if ( button & 4 ) { 5533 return 2; 5534 } 5535 5536 return 0; 5537 } 5538 5539 return event.which; 5540 } 5541}, jQuery.event.addProp ); 5542 5543// Create mouseenter/leave events using mouseover/out and event-time checks 5544// so that event delegation works in jQuery. 5545// Do the same for pointerenter/pointerleave and pointerover/pointerout 5546// 5547// Support: Safari 7 only 5548// Safari sends mouseenter too often; see: 5549// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 5550// for the description of the bug (it existed in older Chrome versions as well). 5551jQuery.each( { 5552 mouseenter: "mouseover", 5553 mouseleave: "mouseout", 5554 pointerenter: "pointerover", 5555 pointerleave: "pointerout" 5556}, function( orig, fix ) { 5557 jQuery.event.special[ orig ] = { 5558 delegateType: fix, 5559 bindType: fix, 5560 5561 handle: function( event ) { 5562 var ret, 5563 target = this, 5564 related = event.relatedTarget, 5565 handleObj = event.handleObj; 5566 5567 // For mouseenter/leave call the handler if related is outside the target. 5568 // NB: No relatedTarget if the mouse left/entered the browser window 5569 if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { 5570 event.type = handleObj.origType; 5571 ret = handleObj.handler.apply( this, arguments ); 5572 event.type = fix; 5573 } 5574 return ret; 5575 } 5576 }; 5577} ); 5578 5579jQuery.fn.extend( { 5580 5581 on: function( types, selector, data, fn ) { 5582 return on( this, types, selector, data, fn ); 5583 }, 5584 one: function( types, selector, data, fn ) { 5585 return on( this, types, selector, data, fn, 1 ); 5586 }, 5587 off: function( types, selector, fn ) { 5588 var handleObj, type; 5589 if ( types && types.preventDefault && types.handleObj ) { 5590 5591 // ( event ) dispatched jQuery.Event 5592 handleObj = types.handleObj; 5593 jQuery( types.delegateTarget ).off( 5594 handleObj.namespace ? 5595 handleObj.origType + "." + handleObj.namespace : 5596 handleObj.origType, 5597 handleObj.selector, 5598 handleObj.handler 5599 ); 5600 return this; 5601 } 5602 if ( typeof types === "object" ) { 5603 5604 // ( types-object [, selector] ) 5605 for ( type in types ) { 5606 this.off( type, selector, types[ type ] ); 5607 } 5608 return this; 5609 } 5610 if ( selector === false || typeof selector === "function" ) { 5611 5612 // ( types [, fn] ) 5613 fn = selector; 5614 selector = undefined; 5615 } 5616 if ( fn === false ) { 5617 fn = returnFalse; 5618 } 5619 return this.each( function() { 5620 jQuery.event.remove( this, types, fn, selector ); 5621 } ); 5622 } 5623} ); 5624 5625 5626var 5627 5628 /* eslint-disable max-len */ 5629 5630 // See https://github.com/eslint/eslint/issues/3229 5631 rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, 5632 5633 /* eslint-enable */ 5634 5635 // Support: IE <=10 - 11, Edge 12 - 13 only 5636 // In IE/Edge using regex groups here causes severe slowdowns. 5637 // See https://connect.microsoft.com/IE/feedback/details/1736512/ 5638 rnoInnerhtml = /<script|<style|<link/i, 5639 5640 // checked="checked" or checked 5641 rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i, 5642 rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; 5643 5644// Prefer a tbody over its parent table for containing new rows 5645function manipulationTarget( elem, content ) { 5646 if ( nodeName( elem, "table" ) && 5647 nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { 5648 5649 return jQuery( elem ).children( "tbody" )[ 0 ] || elem; 5650 } 5651 5652 return elem; 5653} 5654 5655// Replace/restore the type attribute of script elements for safe DOM manipulation 5656function disableScript( elem ) { 5657 elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; 5658 return elem; 5659} 5660function restoreScript( elem ) { 5661 if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { 5662 elem.type = elem.type.slice( 5 ); 5663 } else { 5664 elem.removeAttribute( "type" ); 5665 } 5666 5667 return elem; 5668} 5669 5670function cloneCopyEvent( src, dest ) { 5671 var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events; 5672 5673 if ( dest.nodeType !== 1 ) { 5674 return; 5675 } 5676 5677 // 1. Copy private data: events, handlers, etc. 5678 if ( dataPriv.hasData( src ) ) { 5679 pdataOld = dataPriv.access( src ); 5680 pdataCur = dataPriv.set( dest, pdataOld ); 5681 events = pdataOld.events; 5682 5683 if ( events ) { 5684 delete pdataCur.handle; 5685 pdataCur.events = {}; 5686 5687 for ( type in events ) { 5688 for ( i = 0, l = events[ type ].length; i < l; i++ ) { 5689 jQuery.event.add( dest, type, events[ type ][ i ] ); 5690 } 5691 } 5692 } 5693 } 5694 5695 // 2. Copy user data 5696 if ( dataUser.hasData( src ) ) { 5697 udataOld = dataUser.access( src ); 5698 udataCur = jQuery.extend( {}, udataOld ); 5699 5700 dataUser.set( dest, udataCur ); 5701 } 5702} 5703 5704// Fix IE bugs, see support tests 5705function fixInput( src, dest ) { 5706 var nodeName = dest.nodeName.toLowerCase(); 5707 5708 // Fails to persist the checked state of a cloned checkbox or radio button. 5709 if ( nodeName === "input" && rcheckableType.test( src.type ) ) { 5710 dest.checked = src.checked; 5711 5712 // Fails to return the selected option to the default selected state when cloning options 5713 } else if ( nodeName === "input" || nodeName === "textarea" ) { 5714 dest.defaultValue = src.defaultValue; 5715 } 5716} 5717 5718function domManip( collection, args, callback, ignored ) { 5719 5720 // Flatten any nested arrays 5721 args = concat.apply( [], args ); 5722 5723 var fragment, first, scripts, hasScripts, node, doc, 5724 i = 0, 5725 l = collection.length, 5726 iNoClone = l - 1, 5727 value = args[ 0 ], 5728 valueIsFunction = isFunction( value ); 5729 5730 // We can't cloneNode fragments that contain checked, in WebKit 5731 if ( valueIsFunction || 5732 ( l > 1 && typeof value === "string" && 5733 !support.checkClone && rchecked.test( value ) ) ) { 5734 return collection.each( function( index ) { 5735 var self = collection.eq( index ); 5736 if ( valueIsFunction ) { 5737 args[ 0 ] = value.call( this, index, self.html() ); 5738 } 5739 domManip( self, args, callback, ignored ); 5740 } ); 5741 } 5742 5743 if ( l ) { 5744 fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); 5745 first = fragment.firstChild; 5746 5747 if ( fragment.childNodes.length === 1 ) { 5748 fragment = first; 5749 } 5750 5751 // Require either new content or an interest in ignored elements to invoke the callback 5752 if ( first || ignored ) { 5753 scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); 5754 hasScripts = scripts.length; 5755 5756 // Use the original fragment for the last item 5757 // instead of the first because it can end up 5758 // being emptied incorrectly in certain situations (#8070). 5759 for ( ; i < l; i++ ) { 5760 node = fragment; 5761 5762 if ( i !== iNoClone ) { 5763 node = jQuery.clone( node, true, true ); 5764 5765 // Keep references to cloned scripts for later restoration 5766 if ( hasScripts ) { 5767 5768 // Support: Android <=4.0 only, PhantomJS 1 only 5769 // push.apply(_, arraylike) throws on ancient WebKit 5770 jQuery.merge( scripts, getAll( node, "script" ) ); 5771 } 5772 } 5773 5774 callback.call( collection[ i ], node, i ); 5775 } 5776 5777 if ( hasScripts ) { 5778 doc = scripts[ scripts.length - 1 ].ownerDocument; 5779 5780 // Reenable scripts 5781 jQuery.map( scripts, restoreScript ); 5782 5783 // Evaluate executable scripts on first document insertion 5784 for ( i = 0; i < hasScripts; i++ ) { 5785 node = scripts[ i ]; 5786 if ( rscriptType.test( node.type || "" ) && 5787 !dataPriv.access( node, "globalEval" ) && 5788 jQuery.contains( doc, node ) ) { 5789 5790 if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { 5791 5792 // Optional AJAX dependency, but won't run scripts if not present 5793 if ( jQuery._evalUrl ) { 5794 jQuery._evalUrl( node.src ); 5795 } 5796 } else { 5797 DOMEval( node.textContent.replace( rcleanScript, "" ), doc, node ); 5798 } 5799 } 5800 } 5801 } 5802 } 5803 } 5804 5805 return collection; 5806} 5807 5808function remove( elem, selector, keepData ) { 5809 var node, 5810 nodes = selector ? jQuery.filter( selector, elem ) : elem, 5811 i = 0; 5812 5813 for ( ; ( node = nodes[ i ] ) != null; i++ ) { 5814 if ( !keepData && node.nodeType === 1 ) { 5815 jQuery.cleanData( getAll( node ) ); 5816 } 5817 5818 if ( node.parentNode ) { 5819 if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { 5820 setGlobalEval( getAll( node, "script" ) ); 5821 } 5822 node.parentNode.removeChild( node ); 5823 } 5824 } 5825 5826 return elem; 5827} 5828 5829jQuery.extend( { 5830 htmlPrefilter: function( html ) { 5831 return html.replace( rxhtmlTag, "<$1></$2>" ); 5832 }, 5833 5834 clone: function( elem, dataAndEvents, deepDataAndEvents ) { 5835 var i, l, srcElements, destElements, 5836 clone = elem.cloneNode( true ), 5837 inPage = jQuery.contains( elem.ownerDocument, elem ); 5838 5839 // Fix IE cloning issues 5840 if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && 5841 !jQuery.isXMLDoc( elem ) ) { 5842 5843 // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 5844 destElements = getAll( clone ); 5845 srcElements = getAll( elem ); 5846 5847 for ( i = 0, l = srcElements.length; i < l; i++ ) { 5848 fixInput( srcElements[ i ], destElements[ i ] ); 5849 } 5850 } 5851 5852 // Copy the events from the original to the clone 5853 if ( dataAndEvents ) { 5854 if ( deepDataAndEvents ) { 5855 srcElements = srcElements || getAll( elem ); 5856 destElements = destElements || getAll( clone ); 5857 5858 for ( i = 0, l = srcElements.length; i < l; i++ ) { 5859 cloneCopyEvent( srcElements[ i ], destElements[ i ] ); 5860 } 5861 } else { 5862 cloneCopyEvent( elem, clone ); 5863 } 5864 } 5865 5866 // Preserve script evaluation history 5867 destElements = getAll( clone, "script" ); 5868 if ( destElements.length > 0 ) { 5869 setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); 5870 } 5871 5872 // Return the cloned set 5873 return clone; 5874 }, 5875 5876 cleanData: function( elems ) { 5877 var data, elem, type, 5878 special = jQuery.event.special, 5879 i = 0; 5880 5881 for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { 5882 if ( acceptData( elem ) ) { 5883 if ( ( data = elem[ dataPriv.expando ] ) ) { 5884 if ( data.events ) { 5885 for ( type in data.events ) { 5886 if ( special[ type ] ) { 5887 jQuery.event.remove( elem, type ); 5888 5889 // This is a shortcut to avoid jQuery.event.remove's overhead 5890 } else { 5891 jQuery.removeEvent( elem, type, data.handle ); 5892 } 5893 } 5894 } 5895
vendor: 1,119 bytes, lines 5896-5940
5896 // Support: Chrome <=35 - 45+ 5897 // Assign undefined instead of using delete, see Data#remove 5898 elem[ dataPriv.expando ] = undefined; 5899 } 5900 if ( elem[ dataUser.expando ] ) { 5901 5902 // Support: Chrome <=35 - 45+ 5903 // Assign undefined instead of using delete, see Data#remove 5904 elem[ dataUser.expando ] = undefined; 5905 } 5906 } 5907 } 5908 } 5909} ); 5910 5911jQuery.fn.extend( { 5912 detach: function( selector ) { 5913 return remove( this, selector, true ); 5914 }, 5915 5916 remove: function( selector ) { 5917 return remove( this, selector ); 5918 }, 5919 5920 text: function( value ) { 5921 return access( this, function( value ) { 5922 return value === undefined ? 5923 jQuery.text( this ) : 5924 this.empty().each( function() { 5925 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 5926 this.textContent = value; 5927 } 5928 } ); 5929 }, null, value, arguments.length ); 5930 }, 5931 5932 append: function() { 5933 return domManip( this, arguments, function( elem ) { 5934 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 5935 var target = manipulationTarget( this, elem ); 5936 target.appendChild( elem ); 5937 } 5938 } ); 5939 }, 5940
vendor: 52,786 bytes, lines 5941-7995
5941 prepend: function() { 5942 return domManip( this, arguments, function( elem ) { 5943 if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { 5944 var target = manipulationTarget( this, elem ); 5945 target.insertBefore( elem, target.firstChild ); 5946 } 5947 } ); 5948 }, 5949 5950 before: function() { 5951 return domManip( this, arguments, function( elem ) { 5952 if ( this.parentNode ) { 5953 this.parentNode.insertBefore( elem, this ); 5954 } 5955 } ); 5956 }, 5957 5958 after: function() { 5959 return domManip( this, arguments, function( elem ) { 5960 if ( this.parentNode ) { 5961 this.parentNode.insertBefore( elem, this.nextSibling ); 5962 } 5963 } ); 5964 }, 5965 5966 empty: function() { 5967 var elem, 5968 i = 0; 5969 5970 for ( ; ( elem = this[ i ] ) != null; i++ ) { 5971 if ( elem.nodeType === 1 ) { 5972 5973 // Prevent memory leaks 5974 jQuery.cleanData( getAll( elem, false ) ); 5975 5976 // Remove any remaining nodes 5977 elem.textContent = ""; 5978 } 5979 } 5980 5981 return this; 5982 }, 5983 5984 clone: function( dataAndEvents, deepDataAndEvents ) { 5985 dataAndEvents = dataAndEvents == null ? false : dataAndEvents; 5986 deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; 5987 5988 return this.map( function() { 5989 return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); 5990 } ); 5991 }, 5992 5993 html: function( value ) { 5994 return access( this, function( value ) { 5995 var elem = this[ 0 ] || {}, 5996 i = 0, 5997 l = this.length; 5998 5999 if ( value === undefined && elem.nodeType === 1 ) { 6000 return elem.innerHTML; 6001 } 6002 6003 // See if we can take a shortcut and just use innerHTML 6004 if ( typeof value === "string" && !rnoInnerhtml.test( value ) && 6005 !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { 6006 6007 value = jQuery.htmlPrefilter( value ); 6008 6009 try { 6010 for ( ; i < l; i++ ) { 6011 elem = this[ i ] || {}; 6012 6013 // Remove element nodes and prevent memory leaks 6014 if ( elem.nodeType === 1 ) { 6015 jQuery.cleanData( getAll( elem, false ) ); 6016 elem.innerHTML = value; 6017 } 6018 } 6019 6020 elem = 0; 6021 6022 // If using innerHTML throws an exception, use the fallback method 6023 } catch ( e ) {} 6024 } 6025 6026 if ( elem ) { 6027 this.empty().append( value ); 6028 } 6029 }, null, value, arguments.length ); 6030 }, 6031 6032 replaceWith: function() { 6033 var ignored = []; 6034 6035 // Make the changes, replacing each non-ignored context element with the new content 6036 return domManip( this, arguments, function( elem ) { 6037 var parent = this.parentNode; 6038 6039 if ( jQuery.inArray( this, ignored ) < 0 ) { 6040 jQuery.cleanData( getAll( this ) ); 6041 if ( parent ) { 6042 parent.replaceChild( elem, this ); 6043 } 6044 } 6045 6046 // Force callback invocation 6047 }, ignored ); 6048 } 6049} ); 6050 6051jQuery.each( { 6052 appendTo: "append", 6053 prependTo: "prepend", 6054 insertBefore: "before", 6055 insertAfter: "after", 6056 replaceAll: "replaceWith" 6057}, function( name, original ) { 6058 jQuery.fn[ name ] = function( selector ) { 6059 var elems, 6060 ret = [], 6061 insert = jQuery( selector ), 6062 last = insert.length - 1, 6063 i = 0; 6064 6065 for ( ; i <= last; i++ ) { 6066 elems = i === last ? this : this.clone( true ); 6067 jQuery( insert[ i ] )[ original ]( elems ); 6068 6069 // Support: Android <=4.0 only, PhantomJS 1 only 6070 // .get() because push.apply(_, arraylike) throws on ancient WebKit 6071 push.apply( ret, elems.get() ); 6072 } 6073 6074 return this.pushStack( ret ); 6075 }; 6076} ); 6077var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); 6078 6079var getStyles = function( elem ) { 6080 6081 // Support: IE <=11 only, Firefox <=30 (#15098, #14150) 6082 // IE throws on elements created in popups 6083 // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" 6084 var view = elem.ownerDocument.defaultView; 6085 6086 if ( !view || !view.opener ) { 6087 view = window; 6088 } 6089 6090 return view.getComputedStyle( elem ); 6091 }; 6092 6093var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); 6094 6095 6096 6097( function() { 6098 6099 // Executing both pixelPosition & boxSizingReliable tests require only one layout 6100 // so they're executed at the same time to save the second computation. 6101 function computeStyleTests() { 6102 6103 // This is a singleton, we need to execute it only once 6104 if ( !div ) { 6105 return; 6106 } 6107 6108 container.style.cssText = "position:absolute;left:-11111px;width:60px;" + 6109 "margin-top:1px;padding:0;border:0"; 6110 div.style.cssText = 6111 "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + 6112 "margin:auto;border:1px;padding:1px;" + 6113 "width:60%;top:1%"; 6114 documentElement.appendChild( container ).appendChild( div ); 6115 6116 var divStyle = window.getComputedStyle( div ); 6117 pixelPositionVal = divStyle.top !== "1%"; 6118 6119 // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 6120 reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; 6121 6122 // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 6123 // Some styles come back with percentage values, even though they shouldn't 6124 div.style.right = "60%"; 6125 pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; 6126 6127 // Support: IE 9 - 11 only 6128 // Detect misreporting of content dimensions for box-sizing:border-box elements 6129 boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; 6130 6131 // Support: IE 9 only 6132 // Detect overflow:scroll screwiness (gh-3699) 6133 div.style.position = "absolute"; 6134 scrollboxSizeVal = div.offsetWidth === 36 || "absolute"; 6135 6136 documentElement.removeChild( container ); 6137 6138 // Nullify the div so it wouldn't be stored in the memory and 6139 // it will also be a sign that checks already performed 6140 div = null; 6141 } 6142 6143 function roundPixelMeasures( measure ) { 6144 return Math.round( parseFloat( measure ) ); 6145 } 6146 6147 var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, 6148 reliableMarginLeftVal, 6149 container = document.createElement( "div" ), 6150 div = document.createElement( "div" ); 6151 6152 // Finish early in limited (non-browser) environments 6153 if ( !div.style ) { 6154 return; 6155 } 6156 6157 // Support: IE <=9 - 11 only 6158 // Style of cloned element affects source element cloned (#8908) 6159 div.style.backgroundClip = "content-box"; 6160 div.cloneNode( true ).style.backgroundClip = ""; 6161 support.clearCloneStyle = div.style.backgroundClip === "content-box"; 6162 6163 jQuery.extend( support, { 6164 boxSizingReliable: function() { 6165 computeStyleTests(); 6166 return boxSizingReliableVal; 6167 }, 6168 pixelBoxStyles: function() { 6169 computeStyleTests(); 6170 return pixelBoxStylesVal; 6171 }, 6172 pixelPosition: function() { 6173 computeStyleTests(); 6174 return pixelPositionVal; 6175 }, 6176 reliableMarginLeft: function() { 6177 computeStyleTests(); 6178 return reliableMarginLeftVal; 6179 }, 6180 scrollboxSize: function() { 6181 computeStyleTests(); 6182 return scrollboxSizeVal; 6183 } 6184 } ); 6185} )(); 6186 6187 6188function curCSS( elem, name, computed ) { 6189 var width, minWidth, maxWidth, ret, 6190 6191 // Support: Firefox 51+ 6192 // Retrieving style before computed somehow 6193 // fixes an issue with getting wrong values 6194 // on detached elements 6195 style = elem.style; 6196 6197 computed = computed || getStyles( elem ); 6198 6199 // getPropertyValue is needed for: 6200 // .css('filter') (IE 9 only, #12537) 6201 // .css('--customProperty) (#3144) 6202 if ( computed ) { 6203 ret = computed.getPropertyValue( name ) || computed[ name ]; 6204 6205 if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) { 6206 ret = jQuery.style( elem, name ); 6207 } 6208 6209 // A tribute to the "awesome hack by Dean Edwards" 6210 // Android Browser returns percentage for some values, 6211 // but width seems to be reliably pixels. 6212 // This is against the CSSOM draft spec: 6213 // https://drafts.csswg.org/cssom/#resolved-values 6214 if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { 6215 6216 // Remember the original values 6217 width = style.width; 6218 minWidth = style.minWidth; 6219 maxWidth = style.maxWidth; 6220 6221 // Put in the new values to get a computed value out 6222 style.minWidth = style.maxWidth = style.width = ret; 6223 ret = computed.width; 6224 6225 // Revert the changed values 6226 style.width = width; 6227 style.minWidth = minWidth; 6228 style.maxWidth = maxWidth; 6229 } 6230 } 6231 6232 return ret !== undefined ? 6233 6234 // Support: IE <=9 - 11 only 6235 // IE returns zIndex value as an integer. 6236 ret + "" : 6237 ret; 6238} 6239 6240 6241function addGetHookIf( conditionFn, hookFn ) { 6242 6243 // Define the hook, we'll check on the first run if it's really needed. 6244 return { 6245 get: function() { 6246 if ( conditionFn() ) { 6247 6248 // Hook not needed (or it's not possible to use it due 6249 // to missing dependency), remove it. 6250 delete this.get; 6251 return; 6252 } 6253 6254 // Hook needed; redefine it so that the support test is not executed again. 6255 return ( this.get = hookFn ).apply( this, arguments ); 6256 } 6257 }; 6258} 6259 6260 6261var 6262 6263 // Swappable if display is none or starts with table 6264 // except "table", "table-cell", or "table-caption" 6265 // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display 6266 rdisplayswap = /^(none|table(?!-c[ea]).+)/, 6267 rcustomProp = /^--/, 6268 cssShow = { position: "absolute", visibility: "hidden", display: "block" }, 6269 cssNormalTransform = { 6270 letterSpacing: "0", 6271 fontWeight: "400" 6272 }, 6273 6274 cssPrefixes = [ "Webkit", "Moz", "ms" ], 6275 emptyStyle = document.createElement( "div" ).style; 6276 6277// Return a css property mapped to a potentially vendor prefixed property 6278function vendorPropName( name ) { 6279 6280 // Shortcut for names that are not vendor prefixed 6281 if ( name in emptyStyle ) { 6282 return name; 6283 } 6284 6285 // Check for vendor prefixed names 6286 var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), 6287 i = cssPrefixes.length; 6288 6289 while ( i-- ) { 6290 name = cssPrefixes[ i ] + capName; 6291 if ( name in emptyStyle ) { 6292 return name; 6293 } 6294 } 6295} 6296 6297// Return a property mapped along what jQuery.cssProps suggests or to 6298// a vendor prefixed property. 6299function finalPropName( name ) { 6300 var ret = jQuery.cssProps[ name ]; 6301 if ( !ret ) { 6302 ret = jQuery.cssProps[ name ] = vendorPropName( name ) || name; 6303 } 6304 return ret; 6305} 6306 6307function setPositiveNumber( elem, value, subtract ) { 6308 6309 // Any relative (+/-) values have already been 6310 // normalized at this point 6311 var matches = rcssNum.exec( value ); 6312 return matches ? 6313 6314 // Guard against undefined "subtract", e.g., when used as in cssHooks 6315 Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : 6316 value; 6317} 6318 6319function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { 6320 var i = dimension === "width" ? 1 : 0, 6321 extra = 0, 6322 delta = 0; 6323 6324 // Adjustment may not be necessary 6325 if ( box === ( isBorderBox ? "border" : "content" ) ) { 6326 return 0; 6327 } 6328 6329 for ( ; i < 4; i += 2 ) { 6330 6331 // Both box models exclude margin 6332 if ( box === "margin" ) { 6333 delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); 6334 } 6335 6336 // If we get here with a content-box, we're seeking "padding" or "border" or "margin" 6337 if ( !isBorderBox ) { 6338 6339 // Add padding 6340 delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6341 6342 // For "border" or "margin", add border 6343 if ( box !== "padding" ) { 6344 delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6345 6346 // But still keep track of it otherwise 6347 } else { 6348 extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6349 } 6350 6351 // If we get here with a border-box (content + padding + border), we're seeking "content" or 6352 // "padding" or "margin" 6353 } else { 6354 6355 // For "content", subtract padding 6356 if ( box === "content" ) { 6357 delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); 6358 } 6359 6360 // For "content" or "padding", subtract border 6361 if ( box !== "margin" ) { 6362 delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); 6363 } 6364 } 6365 } 6366 6367 // Account for positive content-box scroll gutter when requested by providing computedVal 6368 if ( !isBorderBox && computedVal >= 0 ) { 6369 6370 // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border 6371 // Assuming integer scroll gutter, subtract the rest and round down 6372 delta += Math.max( 0, Math.ceil( 6373 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 6374 computedVal - 6375 delta - 6376 extra - 6377 0.5 6378 ) ); 6379 } 6380 6381 return delta; 6382} 6383 6384function getWidthOrHeight( elem, dimension, extra ) { 6385 6386 // Start with computed style 6387 var styles = getStyles( elem ), 6388 val = curCSS( elem, dimension, styles ), 6389 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6390 valueIsBorderBox = isBorderBox; 6391 6392 // Support: Firefox <=54 6393 // Return a confounding non-pixel value or feign ignorance, as appropriate. 6394 if ( rnumnonpx.test( val ) ) { 6395 if ( !extra ) { 6396 return val; 6397 } 6398 val = "auto"; 6399 } 6400 6401 // Check for style in case a browser which returns unreliable values 6402 // for getComputedStyle silently falls back to the reliable elem.style 6403 valueIsBorderBox = valueIsBorderBox && 6404 ( support.boxSizingReliable() || val === elem.style[ dimension ] ); 6405 6406 // Fall back to offsetWidth/offsetHeight when value is "auto" 6407 // This happens for inline elements with no explicit setting (gh-3571) 6408 // Support: Android <=4.1 - 4.3 only 6409 // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) 6410 if ( val === "auto" || 6411 !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) { 6412 6413 val = elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ]; 6414 6415 // offsetWidth/offsetHeight provide border-box values 6416 valueIsBorderBox = true; 6417 } 6418 6419 // Normalize "" and auto 6420 val = parseFloat( val ) || 0; 6421 6422 // Adjust for the element's box model 6423 return ( val + 6424 boxModelAdjustment( 6425 elem, 6426 dimension, 6427 extra || ( isBorderBox ? "border" : "content" ), 6428 valueIsBorderBox, 6429 styles, 6430 6431 // Provide the current computed size to request scroll gutter calculation (gh-3589) 6432 val 6433 ) 6434 ) + "px"; 6435} 6436 6437jQuery.extend( { 6438 6439 // Add in style property hooks for overriding the default 6440 // behavior of getting and setting a style property 6441 cssHooks: { 6442 opacity: { 6443 get: function( elem, computed ) { 6444 if ( computed ) { 6445 6446 // We should always get a number back from opacity 6447 var ret = curCSS( elem, "opacity" ); 6448 return ret === "" ? "1" : ret; 6449 } 6450 } 6451 } 6452 }, 6453 6454 // Don't automatically add "px" to these possibly-unitless properties 6455 cssNumber: { 6456 "animationIterationCount": true, 6457 "columnCount": true, 6458 "fillOpacity": true, 6459 "flexGrow": true, 6460 "flexShrink": true, 6461 "fontWeight": true, 6462 "lineHeight": true, 6463 "opacity": true, 6464 "order": true, 6465 "orphans": true, 6466 "widows": true, 6467 "zIndex": true, 6468 "zoom": true 6469 }, 6470 6471 // Add in properties whose names you wish to fix before 6472 // setting or getting the value 6473 cssProps: {}, 6474 6475 // Get and set the style property on a DOM Node 6476 style: function( elem, name, value, extra ) { 6477 6478 // Don't set styles on text and comment nodes 6479 if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { 6480 return; 6481 } 6482 6483 // Make sure that we're working with the right name 6484 var ret, type, hooks, 6485 origName = camelCase( name ), 6486 isCustomProp = rcustomProp.test( name ), 6487 style = elem.style; 6488 6489 // Make sure that we're working with the right name. We don't 6490 // want to query the value if it is a CSS custom property 6491 // since they are user-defined. 6492 if ( !isCustomProp ) { 6493 name = finalPropName( origName ); 6494 } 6495 6496 // Gets hook for the prefixed version, then unprefixed version 6497 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6498 6499 // Check if we're setting a value 6500 if ( value !== undefined ) { 6501 type = typeof value; 6502 6503 // Convert "+=" or "-=" to relative numbers (#7345) 6504 if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { 6505 value = adjustCSS( elem, name, ret ); 6506 6507 // Fixes bug #9237 6508 type = "number"; 6509 } 6510 6511 // Make sure that null and NaN values aren't set (#7116) 6512 if ( value == null || value !== value ) { 6513 return; 6514 } 6515 6516 // If a number was passed in, add the unit (except for certain CSS properties) 6517 if ( type === "number" ) { 6518 value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); 6519 } 6520 6521 // background-* props affect original clone's values 6522 if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { 6523 style[ name ] = "inherit"; 6524 } 6525 6526 // If a hook was provided, use that value, otherwise just set the specified value 6527 if ( !hooks || !( "set" in hooks ) || 6528 ( value = hooks.set( elem, value, extra ) ) !== undefined ) { 6529 6530 if ( isCustomProp ) { 6531 style.setProperty( name, value ); 6532 } else { 6533 style[ name ] = value; 6534 } 6535 } 6536 6537 } else { 6538 6539 // If a hook was provided get the non-computed value from there 6540 if ( hooks && "get" in hooks && 6541 ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { 6542 6543 return ret; 6544 } 6545 6546 // Otherwise just get the value from the style object 6547 return style[ name ]; 6548 } 6549 }, 6550 6551 css: function( elem, name, extra, styles ) { 6552 var val, num, hooks, 6553 origName = camelCase( name ), 6554 isCustomProp = rcustomProp.test( name ); 6555 6556 // Make sure that we're working with the right name. We don't 6557 // want to modify the value if it is a CSS custom property 6558 // since they are user-defined. 6559 if ( !isCustomProp ) { 6560 name = finalPropName( origName ); 6561 } 6562 6563 // Try prefixed name followed by the unprefixed name 6564 hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; 6565 6566 // If a hook was provided get the computed value from there 6567 if ( hooks && "get" in hooks ) { 6568 val = hooks.get( elem, true, extra ); 6569 } 6570 6571 // Otherwise, if a way to get the computed value exists, use that 6572 if ( val === undefined ) { 6573 val = curCSS( elem, name, styles ); 6574 } 6575 6576 // Convert "normal" to computed value 6577 if ( val === "normal" && name in cssNormalTransform ) { 6578 val = cssNormalTransform[ name ]; 6579 } 6580 6581 // Make numeric if forced or a qualifier was provided and val looks numeric 6582 if ( extra === "" || extra ) { 6583 num = parseFloat( val ); 6584 return extra === true || isFinite( num ) ? num || 0 : val; 6585 } 6586 6587 return val; 6588 } 6589} ); 6590 6591jQuery.each( [ "height", "width" ], function( i, dimension ) { 6592 jQuery.cssHooks[ dimension ] = { 6593 get: function( elem, computed, extra ) { 6594 if ( computed ) { 6595 6596 // Certain elements can have dimension info if we invisibly show them 6597 // but it must have a current display style that would benefit 6598 return rdisplayswap.test( jQuery.css( elem, "display" ) ) && 6599 6600 // Support: Safari 8+ 6601 // Table columns in Safari have non-zero offsetWidth & zero 6602 // getBoundingClientRect().width unless display is changed. 6603 // Support: IE <=11 only 6604 // Running getBoundingClientRect on a disconnected node 6605 // in IE throws an error. 6606 ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? 6607 swap( elem, cssShow, function() { 6608 return getWidthOrHeight( elem, dimension, extra ); 6609 } ) : 6610 getWidthOrHeight( elem, dimension, extra ); 6611 } 6612 }, 6613 6614 set: function( elem, value, extra ) { 6615 var matches, 6616 styles = getStyles( elem ), 6617 isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box", 6618 subtract = extra && boxModelAdjustment( 6619 elem, 6620 dimension, 6621 extra, 6622 isBorderBox, 6623 styles 6624 ); 6625 6626 // Account for unreliable border-box dimensions by comparing offset* to computed and 6627 // faking a content-box to get border and padding (gh-3699) 6628 if ( isBorderBox && support.scrollboxSize() === styles.position ) { 6629 subtract -= Math.ceil( 6630 elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - 6631 parseFloat( styles[ dimension ] ) - 6632 boxModelAdjustment( elem, dimension, "border", false, styles ) - 6633 0.5 6634 ); 6635 } 6636 6637 // Convert to pixels if value adjustment is needed 6638 if ( subtract && ( matches = rcssNum.exec( value ) ) && 6639 ( matches[ 3 ] || "px" ) !== "px" ) { 6640 6641 elem.style[ dimension ] = value; 6642 value = jQuery.css( elem, dimension ); 6643 } 6644 6645 return setPositiveNumber( elem, value, subtract ); 6646 } 6647 }; 6648} ); 6649 6650jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, 6651 function( elem, computed ) { 6652 if ( computed ) { 6653 return ( parseFloat( curCSS( elem, "marginLeft" ) ) || 6654 elem.getBoundingClientRect().left - 6655 swap( elem, { marginLeft: 0 }, function() { 6656 return elem.getBoundingClientRect().left; 6657 } ) 6658 ) + "px"; 6659 } 6660 } 6661); 6662 6663// These hooks are used by animate to expand properties 6664jQuery.each( { 6665 margin: "", 6666 padding: "", 6667 border: "Width" 6668}, function( prefix, suffix ) { 6669 jQuery.cssHooks[ prefix + suffix ] = { 6670 expand: function( value ) { 6671 var i = 0, 6672 expanded = {}, 6673 6674 // Assumes a single number if not a string 6675 parts = typeof value === "string" ? value.split( " " ) : [ value ]; 6676 6677 for ( ; i < 4; i++ ) { 6678 expanded[ prefix + cssExpand[ i ] + suffix ] = 6679 parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; 6680 } 6681 6682 return expanded; 6683 } 6684 }; 6685 6686 if ( prefix !== "margin" ) { 6687 jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; 6688 } 6689} ); 6690 6691jQuery.fn.extend( { 6692 css: function( name, value ) { 6693 return access( this, function( elem, name, value ) { 6694 var styles, len, 6695 map = {}, 6696 i = 0; 6697 6698 if ( Array.isArray( name ) ) { 6699 styles = getStyles( elem ); 6700 len = name.length; 6701 6702 for ( ; i < len; i++ ) { 6703 map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); 6704 } 6705 6706 return map; 6707 } 6708 6709 return value !== undefined ? 6710 jQuery.style( elem, name, value ) : 6711 jQuery.css( elem, name ); 6712 }, name, value, arguments.length > 1 ); 6713 } 6714} ); 6715 6716 6717function Tween( elem, options, prop, end, easing ) { 6718 return new Tween.prototype.init( elem, options, prop, end, easing ); 6719} 6720jQuery.Tween = Tween; 6721 6722Tween.prototype = { 6723 constructor: Tween, 6724 init: function( elem, options, prop, end, easing, unit ) { 6725 this.elem = elem; 6726 this.prop = prop; 6727 this.easing = easing || jQuery.easing._default; 6728 this.options = options; 6729 this.start = this.now = this.cur(); 6730 this.end = end; 6731 this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); 6732 }, 6733 cur: function() { 6734 var hooks = Tween.propHooks[ this.prop ]; 6735 6736 return hooks && hooks.get ? 6737 hooks.get( this ) : 6738 Tween.propHooks._default.get( this ); 6739 }, 6740 run: function( percent ) { 6741 var eased, 6742 hooks = Tween.propHooks[ this.prop ]; 6743 6744 if ( this.options.duration ) { 6745 this.pos = eased = jQuery.easing[ this.easing ]( 6746 percent, this.options.duration * percent, 0, 1, this.options.duration 6747 ); 6748 } else { 6749 this.pos = eased = percent; 6750 } 6751 this.now = ( this.end - this.start ) * eased + this.start; 6752 6753 if ( this.options.step ) { 6754 this.options.step.call( this.elem, this.now, this ); 6755 } 6756 6757 if ( hooks && hooks.set ) { 6758 hooks.set( this ); 6759 } else { 6760 Tween.propHooks._default.set( this ); 6761 } 6762 return this; 6763 } 6764}; 6765 6766Tween.prototype.init.prototype = Tween.prototype; 6767 6768Tween.propHooks = { 6769 _default: { 6770 get: function( tween ) { 6771 var result; 6772 6773 // Use a property on the element directly when it is not a DOM element, 6774 // or when there is no matching style property that exists. 6775 if ( tween.elem.nodeType !== 1 || 6776 tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { 6777 return tween.elem[ tween.prop ]; 6778 } 6779 6780 // Passing an empty string as a 3rd parameter to .css will automatically 6781 // attempt a parseFloat and fallback to a string if the parse fails. 6782 // Simple values such as "10px" are parsed to Float; 6783 // complex values such as "rotate(1rad)" are returned as-is. 6784 result = jQuery.css( tween.elem, tween.prop, "" ); 6785 6786 // Empty strings, null, undefined and "auto" are converted to 0. 6787 return !result || result === "auto" ? 0 : result; 6788 }, 6789 set: function( tween ) { 6790 6791 // Use step hook for back compat. 6792 // Use cssHook if its there. 6793 // Use .style if available and use plain properties where available. 6794 if ( jQuery.fx.step[ tween.prop ] ) { 6795 jQuery.fx.step[ tween.prop ]( tween ); 6796 } else if ( tween.elem.nodeType === 1 && 6797 ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || 6798 jQuery.cssHooks[ tween.prop ] ) ) { 6799 jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); 6800 } else { 6801 tween.elem[ tween.prop ] = tween.now; 6802 } 6803 } 6804 } 6805}; 6806 6807// Support: IE <=9 only 6808// Panic based approach to setting things on disconnected nodes 6809Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { 6810 set: function( tween ) { 6811 if ( tween.elem.nodeType && tween.elem.parentNode ) { 6812 tween.elem[ tween.prop ] = tween.now; 6813 } 6814 } 6815}; 6816 6817jQuery.easing = { 6818 linear: function( p ) { 6819 return p; 6820 }, 6821 swing: function( p ) { 6822 return 0.5 - Math.cos( p * Math.PI ) / 2; 6823 }, 6824 _default: "swing" 6825}; 6826 6827jQuery.fx = Tween.prototype.init; 6828 6829// Back compat <1.8 extension point 6830jQuery.fx.step = {}; 6831 6832 6833 6834 6835var 6836 fxNow, inProgress, 6837 rfxtypes = /^(?:toggle|show|hide)$/, 6838 rrun = /queueHooks$/; 6839 6840function schedule() { 6841 if ( inProgress ) { 6842 if ( document.hidden === false && window.requestAnimationFrame ) { 6843 window.requestAnimationFrame( schedule ); 6844 } else { 6845 window.setTimeout( schedule, jQuery.fx.interval ); 6846 } 6847 6848 jQuery.fx.tick(); 6849 } 6850} 6851 6852// Animations created synchronously will run synchronously 6853function createFxNow() { 6854 window.setTimeout( function() { 6855 fxNow = undefined; 6856 } ); 6857 return ( fxNow = Date.now() ); 6858} 6859 6860// Generate parameters to create a standard animation 6861function genFx( type, includeWidth ) { 6862 var which, 6863 i = 0, 6864 attrs = { height: type }; 6865 6866 // If we include width, step value is 1 to do all cssExpand values, 6867 // otherwise step value is 2 to skip over Left and Right 6868 includeWidth = includeWidth ? 1 : 0; 6869 for ( ; i < 4; i += 2 - includeWidth ) { 6870 which = cssExpand[ i ]; 6871 attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; 6872 } 6873 6874 if ( includeWidth ) { 6875 attrs.opacity = attrs.width = type; 6876 } 6877 6878 return attrs; 6879} 6880 6881function createTween( value, prop, animation ) { 6882 var tween, 6883 collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), 6884 index = 0, 6885 length = collection.length; 6886 for ( ; index < length; index++ ) { 6887 if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { 6888 6889 // We're done with this property 6890 return tween; 6891 } 6892 } 6893} 6894 6895function defaultPrefilter( elem, props, opts ) { 6896 var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, 6897 isBox = "width" in props || "height" in props, 6898 anim = this, 6899 orig = {}, 6900 style = elem.style, 6901 hidden = elem.nodeType && isHiddenWithinTree( elem ), 6902 dataShow = dataPriv.get( elem, "fxshow" ); 6903 6904 // Queue-skipping animations hijack the fx hooks 6905 if ( !opts.queue ) { 6906 hooks = jQuery._queueHooks( elem, "fx" ); 6907 if ( hooks.unqueued == null ) { 6908 hooks.unqueued = 0; 6909 oldfire = hooks.empty.fire; 6910 hooks.empty.fire = function() { 6911 if ( !hooks.unqueued ) { 6912 oldfire(); 6913 } 6914 }; 6915 } 6916 hooks.unqueued++; 6917 6918 anim.always( function() { 6919 6920 // Ensure the complete handler is called before this completes 6921 anim.always( function() { 6922 hooks.unqueued--; 6923 if ( !jQuery.queue( elem, "fx" ).length ) { 6924 hooks.empty.fire(); 6925 } 6926 } ); 6927 } ); 6928 } 6929 6930 // Detect show/hide animations 6931 for ( prop in props ) { 6932 value = props[ prop ]; 6933 if ( rfxtypes.test( value ) ) { 6934 delete props[ prop ]; 6935 toggle = toggle || value === "toggle"; 6936 if ( value === ( hidden ? "hide" : "show" ) ) { 6937 6938 // Pretend to be hidden if this is a "show" and 6939 // there is still data from a stopped show/hide 6940 if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { 6941 hidden = true; 6942 6943 // Ignore all other no-op show/hide data 6944 } else { 6945 continue; 6946 } 6947 } 6948 orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); 6949 } 6950 } 6951 6952 // Bail out if this is a no-op like .hide().hide() 6953 propTween = !jQuery.isEmptyObject( props ); 6954 if ( !propTween && jQuery.isEmptyObject( orig ) ) { 6955 return; 6956 } 6957 6958 // Restrict "overflow" and "display" styles during box animations 6959 if ( isBox && elem.nodeType === 1 ) { 6960 6961 // Support: IE <=9 - 11, Edge 12 - 15 6962 // Record all 3 overflow attributes because IE does not infer the shorthand 6963 // from identically-valued overflowX and overflowY and Edge just mirrors 6964 // the overflowX value there. 6965 opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; 6966 6967 // Identify a display type, preferring old show/hide data over the CSS cascade 6968 restoreDisplay = dataShow && dataShow.display; 6969 if ( restoreDisplay == null ) { 6970 restoreDisplay = dataPriv.get( elem, "display" ); 6971 } 6972 display = jQuery.css( elem, "display" ); 6973 if ( display === "none" ) { 6974 if ( restoreDisplay ) { 6975 display = restoreDisplay; 6976 } else { 6977 6978 // Get nonempty value(s) by temporarily forcing visibility 6979 showHide( [ elem ], true ); 6980 restoreDisplay = elem.style.display || restoreDisplay; 6981 display = jQuery.css( elem, "display" ); 6982 showHide( [ elem ] ); 6983 } 6984 } 6985 6986 // Animate inline elements as inline-block 6987 if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { 6988 if ( jQuery.css( elem, "float" ) === "none" ) { 6989 6990 // Restore the original display value at the end of pure show/hide animations 6991 if ( !propTween ) { 6992 anim.done( function() { 6993 style.display = restoreDisplay; 6994 } ); 6995 if ( restoreDisplay == null ) { 6996 display = style.display; 6997 restoreDisplay = display === "none" ? "" : display; 6998 } 6999 } 7000 style.display = "inline-block"; 7001 } 7002 } 7003 } 7004 7005 if ( opts.overflow ) { 7006 style.overflow = "hidden"; 7007 anim.always( function() { 7008 style.overflow = opts.overflow[ 0 ]; 7009 style.overflowX = opts.overflow[ 1 ]; 7010 style.overflowY = opts.overflow[ 2 ]; 7011 } ); 7012 } 7013 7014 // Implement show/hide animations 7015 propTween = false; 7016 for ( prop in orig ) { 7017 7018 // General show/hide setup for this element animation 7019 if ( !propTween ) { 7020 if ( dataShow ) { 7021 if ( "hidden" in dataShow ) { 7022 hidden = dataShow.hidden; 7023 } 7024 } else { 7025 dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); 7026 } 7027 7028 // Store hidden/visible for toggle so `.stop().toggle()` "reverses" 7029 if ( toggle ) { 7030 dataShow.hidden = !hidden; 7031 } 7032 7033 // Show elements before animating them 7034 if ( hidden ) { 7035 showHide( [ elem ], true ); 7036 } 7037 7038 /* eslint-disable no-loop-func */ 7039 7040 anim.done( function() { 7041 7042 /* eslint-enable no-loop-func */ 7043 7044 // The final step of a "hide" animation is actually hiding the element 7045 if ( !hidden ) { 7046 showHide( [ elem ] ); 7047 } 7048 dataPriv.remove( elem, "fxshow" ); 7049 for ( prop in orig ) { 7050 jQuery.style( elem, prop, orig[ prop ] ); 7051 } 7052 } ); 7053 } 7054 7055 // Per-property setup 7056 propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); 7057 if ( !( prop in dataShow ) ) { 7058 dataShow[ prop ] = propTween.start; 7059 if ( hidden ) { 7060 propTween.end = propTween.start; 7061 propTween.start = 0; 7062 } 7063 } 7064 } 7065} 7066 7067function propFilter( props, specialEasing ) { 7068 var index, name, easing, value, hooks; 7069 7070 // camelCase, specialEasing and expand cssHook pass 7071 for ( index in props ) { 7072 name = camelCase( index ); 7073 easing = specialEasing[ name ]; 7074 value = props[ index ]; 7075 if ( Array.isArray( value ) ) { 7076 easing = value[ 1 ]; 7077 value = props[ index ] = value[ 0 ]; 7078 } 7079 7080 if ( index !== name ) { 7081 props[ name ] = value; 7082 delete props[ index ]; 7083 } 7084 7085 hooks = jQuery.cssHooks[ name ]; 7086 if ( hooks && "expand" in hooks ) { 7087 value = hooks.expand( value ); 7088 delete props[ name ]; 7089 7090 // Not quite $.extend, this won't overwrite existing keys. 7091 // Reusing 'index' because we have the correct "name" 7092 for ( index in value ) { 7093 if ( !( index in props ) ) { 7094 props[ index ] = value[ index ]; 7095 specialEasing[ index ] = easing; 7096 } 7097 } 7098 } else { 7099 specialEasing[ name ] = easing; 7100 } 7101 } 7102} 7103 7104function Animation( elem, properties, options ) { 7105 var result, 7106 stopped, 7107 index = 0, 7108 length = Animation.prefilters.length, 7109 deferred = jQuery.Deferred().always( function() { 7110 7111 // Don't match elem in the :animated selector 7112 delete tick.elem; 7113 } ), 7114 tick = function() { 7115 if ( stopped ) { 7116 return false; 7117 } 7118 var currentTime = fxNow || createFxNow(), 7119 remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), 7120 7121 // Support: Android 2.3 only 7122 // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) 7123 temp = remaining / animation.duration || 0, 7124 percent = 1 - temp, 7125 index = 0, 7126 length = animation.tweens.length; 7127 7128 for ( ; index < length; index++ ) { 7129 animation.tweens[ index ].run( percent ); 7130 } 7131 7132 deferred.notifyWith( elem, [ animation, percent, remaining ] ); 7133 7134 // If there's more to do, yield 7135 if ( percent < 1 && length ) { 7136 return remaining; 7137 } 7138 7139 // If this was an empty animation, synthesize a final progress notification 7140 if ( !length ) { 7141 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7142 } 7143 7144 // Resolve the animation and report its conclusion 7145 deferred.resolveWith( elem, [ animation ] ); 7146 return false; 7147 }, 7148 animation = deferred.promise( { 7149 elem: elem, 7150 props: jQuery.extend( {}, properties ), 7151 opts: jQuery.extend( true, { 7152 specialEasing: {}, 7153 easing: jQuery.easing._default 7154 }, options ), 7155 originalProperties: properties, 7156 originalOptions: options, 7157 startTime: fxNow || createFxNow(), 7158 duration: options.duration, 7159 tweens: [], 7160 createTween: function( prop, end ) { 7161 var tween = jQuery.Tween( elem, animation.opts, prop, end, 7162 animation.opts.specialEasing[ prop ] || animation.opts.easing ); 7163 animation.tweens.push( tween ); 7164 return tween; 7165 }, 7166 stop: function( gotoEnd ) { 7167 var index = 0, 7168 7169 // If we are going to the end, we want to run all the tweens 7170 // otherwise we skip this part 7171 length = gotoEnd ? animation.tweens.length : 0; 7172 if ( stopped ) { 7173 return this; 7174 } 7175 stopped = true; 7176 for ( ; index < length; index++ ) { 7177 animation.tweens[ index ].run( 1 ); 7178 } 7179 7180 // Resolve when we played the last frame; otherwise, reject 7181 if ( gotoEnd ) { 7182 deferred.notifyWith( elem, [ animation, 1, 0 ] ); 7183 deferred.resolveWith( elem, [ animation, gotoEnd ] ); 7184 } else { 7185 deferred.rejectWith( elem, [ animation, gotoEnd ] ); 7186 } 7187 return this; 7188 } 7189 } ), 7190 props = animation.props; 7191 7192 propFilter( props, animation.opts.specialEasing ); 7193 7194 for ( ; index < length; index++ ) { 7195 result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); 7196 if ( result ) { 7197 if ( isFunction( result.stop ) ) { 7198 jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = 7199 result.stop.bind( result ); 7200 } 7201 return result; 7202 } 7203 } 7204 7205 jQuery.map( props, createTween, animation ); 7206 7207 if ( isFunction( animation.opts.start ) ) { 7208 animation.opts.start.call( elem, animation ); 7209 } 7210 7211 // Attach callbacks from options 7212 animation 7213 .progress( animation.opts.progress ) 7214 .done( animation.opts.done, animation.opts.complete ) 7215 .fail( animation.opts.fail ) 7216 .always( animation.opts.always ); 7217 7218 jQuery.fx.timer( 7219 jQuery.extend( tick, { 7220 elem: elem, 7221 anim: animation, 7222 queue: animation.opts.queue 7223 } ) 7224 ); 7225 7226 return animation; 7227} 7228 7229jQuery.Animation = jQuery.extend( Animation, { 7230 7231 tweeners: { 7232 "*": [ function( prop, value ) { 7233 var tween = this.createTween( prop, value ); 7234 adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); 7235 return tween; 7236 } ] 7237 }, 7238 7239 tweener: function( props, callback ) { 7240 if ( isFunction( props ) ) { 7241 callback = props; 7242 props = [ "*" ]; 7243 } else { 7244 props = props.match( rnothtmlwhite ); 7245 } 7246 7247 var prop, 7248 index = 0, 7249 length = props.length; 7250 7251 for ( ; index < length; index++ ) { 7252 prop = props[ index ]; 7253 Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; 7254 Animation.tweeners[ prop ].unshift( callback ); 7255 } 7256 }, 7257 7258 prefilters: [ defaultPrefilter ], 7259 7260 prefilter: function( callback, prepend ) { 7261 if ( prepend ) { 7262 Animation.prefilters.unshift( callback ); 7263 } else { 7264 Animation.prefilters.push( callback ); 7265 } 7266 } 7267} ); 7268 7269jQuery.speed = function( speed, easing, fn ) { 7270 var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { 7271 complete: fn || !fn && easing || 7272 isFunction( speed ) && speed, 7273 duration: speed, 7274 easing: fn && easing || easing && !isFunction( easing ) && easing 7275 }; 7276 7277 // Go to the end state if fx are off 7278 if ( jQuery.fx.off ) { 7279 opt.duration = 0; 7280 7281 } else { 7282 if ( typeof opt.duration !== "number" ) { 7283 if ( opt.duration in jQuery.fx.speeds ) { 7284 opt.duration = jQuery.fx.speeds[ opt.duration ]; 7285 7286 } else { 7287 opt.duration = jQuery.fx.speeds._default; 7288 } 7289 } 7290 } 7291 7292 // Normalize opt.queue - true/undefined/null -> "fx" 7293 if ( opt.queue == null || opt.queue === true ) { 7294 opt.queue = "fx"; 7295 } 7296 7297 // Queueing 7298 opt.old = opt.complete; 7299 7300 opt.complete = function() { 7301 if ( isFunction( opt.old ) ) { 7302 opt.old.call( this ); 7303 } 7304 7305 if ( opt.queue ) { 7306 jQuery.dequeue( this, opt.queue ); 7307 } 7308 }; 7309 7310 return opt; 7311}; 7312 7313jQuery.fn.extend( { 7314 fadeTo: function( speed, to, easing, callback ) { 7315 7316 // Show any hidden elements after setting opacity to 0 7317 return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() 7318 7319 // Animate to the value specified 7320 .end().animate( { opacity: to }, speed, easing, callback ); 7321 }, 7322 animate: function( prop, speed, easing, callback ) { 7323 var empty = jQuery.isEmptyObject( prop ), 7324 optall = jQuery.speed( speed, easing, callback ), 7325 doAnimation = function() { 7326 7327 // Operate on a copy of prop so per-property easing won't be lost 7328 var anim = Animation( this, jQuery.extend( {}, prop ), optall ); 7329 7330 // Empty animations, or finishing resolves immediately 7331 if ( empty || dataPriv.get( this, "finish" ) ) { 7332 anim.stop( true ); 7333 } 7334 }; 7335 doAnimation.finish = doAnimation; 7336 7337 return empty || optall.queue === false ? 7338 this.each( doAnimation ) : 7339 this.queue( optall.queue, doAnimation ); 7340 }, 7341 stop: function( type, clearQueue, gotoEnd ) { 7342 var stopQueue = function( hooks ) { 7343 var stop = hooks.stop; 7344 delete hooks.stop; 7345 stop( gotoEnd ); 7346 }; 7347 7348 if ( typeof type !== "string" ) { 7349 gotoEnd = clearQueue; 7350 clearQueue = type; 7351 type = undefined; 7352 } 7353 if ( clearQueue && type !== false ) { 7354 this.queue( type || "fx", [] ); 7355 } 7356 7357 return this.each( function() { 7358 var dequeue = true, 7359 index = type != null && type + "queueHooks", 7360 timers = jQuery.timers, 7361 data = dataPriv.get( this ); 7362 7363 if ( index ) { 7364 if ( data[ index ] && data[ index ].stop ) { 7365 stopQueue( data[ index ] ); 7366 } 7367 } else { 7368 for ( index in data ) { 7369 if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { 7370 stopQueue( data[ index ] ); 7371 } 7372 } 7373 } 7374 7375 for ( index = timers.length; index--; ) { 7376 if ( timers[ index ].elem === this && 7377 ( type == null || timers[ index ].queue === type ) ) { 7378 7379 timers[ index ].anim.stop( gotoEnd ); 7380 dequeue = false; 7381 timers.splice( index, 1 ); 7382 } 7383 } 7384 7385 // Start the next in the queue if the last step wasn't forced. 7386 // Timers currently will call their complete callbacks, which 7387 // will dequeue but only if they were gotoEnd. 7388 if ( dequeue || !gotoEnd ) { 7389 jQuery.dequeue( this, type ); 7390 } 7391 } ); 7392 }, 7393 finish: function( type ) { 7394 if ( type !== false ) { 7395 type = type || "fx"; 7396 } 7397 return this.each( function() { 7398 var index, 7399 data = dataPriv.get( this ), 7400 queue = data[ type + "queue" ], 7401 hooks = data[ type + "queueHooks" ], 7402 timers = jQuery.timers, 7403 length = queue ? queue.length : 0; 7404 7405 // Enable finishing flag on private data 7406 data.finish = true; 7407 7408 // Empty the queue first 7409 jQuery.queue( this, type, [] ); 7410 7411 if ( hooks && hooks.stop ) { 7412 hooks.stop.call( this, true ); 7413 } 7414 7415 // Look for any active animations, and finish them 7416 for ( index = timers.length; index--; ) { 7417 if ( timers[ index ].elem === this && timers[ index ].queue === type ) { 7418 timers[ index ].anim.stop( true ); 7419 timers.splice( index, 1 ); 7420 } 7421 } 7422 7423 // Look for any animations in the old queue and finish them 7424 for ( index = 0; index < length; index++ ) { 7425 if ( queue[ index ] && queue[ index ].finish ) { 7426 queue[ index ].finish.call( this ); 7427 } 7428 } 7429 7430 // Turn off finishing flag 7431 delete data.finish; 7432 } ); 7433 } 7434} ); 7435 7436jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) { 7437 var cssFn = jQuery.fn[ name ]; 7438 jQuery.fn[ name ] = function( speed, easing, callback ) { 7439 return speed == null || typeof speed === "boolean" ? 7440 cssFn.apply( this, arguments ) : 7441 this.animate( genFx( name, true ), speed, easing, callback ); 7442 }; 7443} ); 7444 7445// Generate shortcuts for custom animations 7446jQuery.each( { 7447 slideDown: genFx( "show" ), 7448 slideUp: genFx( "hide" ), 7449 slideToggle: genFx( "toggle" ), 7450 fadeIn: { opacity: "show" }, 7451 fadeOut: { opacity: "hide" }, 7452 fadeToggle: { opacity: "toggle" } 7453}, function( name, props ) { 7454 jQuery.fn[ name ] = function( speed, easing, callback ) { 7455 return this.animate( props, speed, easing, callback ); 7456 }; 7457} ); 7458 7459jQuery.timers = []; 7460jQuery.fx.tick = function() { 7461 var timer, 7462 i = 0, 7463 timers = jQuery.timers; 7464 7465 fxNow = Date.now(); 7466 7467 for ( ; i < timers.length; i++ ) { 7468 timer = timers[ i ]; 7469 7470 // Run the timer and safely remove it when done (allowing for external removal) 7471 if ( !timer() && timers[ i ] === timer ) { 7472 timers.splice( i--, 1 ); 7473 } 7474 } 7475 7476 if ( !timers.length ) { 7477 jQuery.fx.stop(); 7478 } 7479 fxNow = undefined; 7480}; 7481 7482jQuery.fx.timer = function( timer ) { 7483 jQuery.timers.push( timer ); 7484 jQuery.fx.start(); 7485}; 7486 7487jQuery.fx.interval = 13; 7488jQuery.fx.start = function() { 7489 if ( inProgress ) { 7490 return; 7491 } 7492 7493 inProgress = true; 7494 schedule(); 7495}; 7496 7497jQuery.fx.stop = function() { 7498 inProgress = null; 7499}; 7500 7501jQuery.fx.speeds = { 7502 slow: 600, 7503 fast: 200, 7504 7505 // Default speed 7506 _default: 400 7507}; 7508 7509 7510// Based off of the plugin by Clint Helfers, with permission. 7511// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ 7512jQuery.fn.delay = function( time, type ) { 7513 time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; 7514 type = type || "fx"; 7515 7516 return this.queue( type, function( next, hooks ) { 7517 var timeout = window.setTimeout( next, time ); 7518 hooks.stop = function() { 7519 window.clearTimeout( timeout ); 7520 }; 7521 } ); 7522}; 7523 7524 7525( function() { 7526 var input = document.createElement( "input" ), 7527 select = document.createElement( "select" ), 7528 opt = select.appendChild( document.createElement( "option" ) ); 7529 7530 input.type = "checkbox"; 7531 7532 // Support: Android <=4.3 only 7533 // Default value for a checkbox should be "on" 7534 support.checkOn = input.value !== ""; 7535 7536 // Support: IE <=11 only 7537 // Must access selectedIndex to make default options select 7538 support.optSelected = opt.selected; 7539 7540 // Support: IE <=11 only 7541 // An input loses its value after becoming a radio 7542 input = document.createElement( "input" ); 7543 input.value = "t"; 7544 input.type = "radio"; 7545 support.radioValue = input.value === "t"; 7546} )(); 7547 7548 7549var boolHook, 7550 attrHandle = jQuery.expr.attrHandle; 7551 7552jQuery.fn.extend( { 7553 attr: function( name, value ) { 7554 return access( this, jQuery.attr, name, value, arguments.length > 1 ); 7555 }, 7556 7557 removeAttr: function( name ) { 7558 return this.each( function() { 7559 jQuery.removeAttr( this, name ); 7560 } ); 7561 } 7562} ); 7563 7564jQuery.extend( { 7565 attr: function( elem, name, value ) { 7566 var ret, hooks, 7567 nType = elem.nodeType; 7568 7569 // Don't get/set attributes on text, comment and attribute nodes 7570 if ( nType === 3 || nType === 8 || nType === 2 ) { 7571 return; 7572 } 7573 7574 // Fallback to prop when attributes are not supported 7575 if ( typeof elem.getAttribute === "undefined" ) { 7576 return jQuery.prop( elem, name, value ); 7577 } 7578 7579 // Attribute hooks are determined by the lowercase version 7580 // Grab necessary hook if one is defined 7581 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 7582 hooks = jQuery.attrHooks[ name.toLowerCase() ] || 7583 ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); 7584 } 7585 7586 if ( value !== undefined ) { 7587 if ( value === null ) { 7588 jQuery.removeAttr( elem, name ); 7589 return; 7590 } 7591 7592 if ( hooks && "set" in hooks && 7593 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 7594 return ret; 7595 } 7596 7597 elem.setAttribute( name, value + "" ); 7598 return value; 7599 } 7600 7601 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 7602 return ret; 7603 } 7604 7605 ret = jQuery.find.attr( elem, name ); 7606 7607 // Non-existent attributes return null, we normalize to undefined 7608 return ret == null ? undefined : ret; 7609 }, 7610 7611 attrHooks: { 7612 type: { 7613 set: function( elem, value ) { 7614 if ( !support.radioValue && value === "radio" && 7615 nodeName( elem, "input" ) ) { 7616 var val = elem.value; 7617 elem.setAttribute( "type", value ); 7618 if ( val ) { 7619 elem.value = val; 7620 } 7621 return value; 7622 } 7623 } 7624 } 7625 }, 7626 7627 removeAttr: function( elem, value ) { 7628 var name, 7629 i = 0, 7630 7631 // Attribute names can contain non-HTML whitespace characters 7632 // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 7633 attrNames = value && value.match( rnothtmlwhite ); 7634 7635 if ( attrNames && elem.nodeType === 1 ) { 7636 while ( ( name = attrNames[ i++ ] ) ) { 7637 elem.removeAttribute( name ); 7638 } 7639 } 7640 } 7641} ); 7642 7643// Hooks for boolean attributes 7644boolHook = { 7645 set: function( elem, value, name ) { 7646 if ( value === false ) { 7647 7648 // Remove boolean attributes when set to false 7649 jQuery.removeAttr( elem, name ); 7650 } else { 7651 elem.setAttribute( name, name ); 7652 } 7653 return name; 7654 } 7655}; 7656 7657jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) { 7658 var getter = attrHandle[ name ] || jQuery.find.attr; 7659 7660 attrHandle[ name ] = function( elem, name, isXML ) { 7661 var ret, handle, 7662 lowercaseName = name.toLowerCase(); 7663 7664 if ( !isXML ) { 7665 7666 // Avoid an infinite loop by temporarily removing this function from the getter 7667 handle = attrHandle[ lowercaseName ]; 7668 attrHandle[ lowercaseName ] = ret; 7669 ret = getter( elem, name, isXML ) != null ? 7670 lowercaseName : 7671 null; 7672 attrHandle[ lowercaseName ] = handle; 7673 } 7674 return ret; 7675 }; 7676} ); 7677 7678 7679 7680 7681var rfocusable = /^(?:input|select|textarea|button)$/i, 7682 rclickable = /^(?:a|area)$/i; 7683 7684jQuery.fn.extend( { 7685 prop: function( name, value ) { 7686 return access( this, jQuery.prop, name, value, arguments.length > 1 ); 7687 }, 7688 7689 removeProp: function( name ) { 7690 return this.each( function() { 7691 delete this[ jQuery.propFix[ name ] || name ]; 7692 } ); 7693 } 7694} ); 7695 7696jQuery.extend( { 7697 prop: function( elem, name, value ) { 7698 var ret, hooks, 7699 nType = elem.nodeType; 7700 7701 // Don't get/set properties on text, comment and attribute nodes 7702 if ( nType === 3 || nType === 8 || nType === 2 ) { 7703 return; 7704 } 7705 7706 if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { 7707 7708 // Fix name and attach hooks 7709 name = jQuery.propFix[ name ] || name; 7710 hooks = jQuery.propHooks[ name ]; 7711 } 7712 7713 if ( value !== undefined ) { 7714 if ( hooks && "set" in hooks && 7715 ( ret = hooks.set( elem, value, name ) ) !== undefined ) { 7716 return ret; 7717 } 7718 7719 return ( elem[ name ] = value ); 7720 } 7721 7722 if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { 7723 return ret; 7724 } 7725 7726 return elem[ name ]; 7727 }, 7728 7729 propHooks: { 7730 tabIndex: { 7731 get: function( elem ) { 7732 7733 // Support: IE <=9 - 11 only 7734 // elem.tabIndex doesn't always return the 7735 // correct value when it hasn't been explicitly set 7736 // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ 7737 // Use proper attribute retrieval(#12072) 7738 var tabindex = jQuery.find.attr( elem, "tabindex" ); 7739 7740 if ( tabindex ) { 7741 return parseInt( tabindex, 10 ); 7742 } 7743 7744 if ( 7745 rfocusable.test( elem.nodeName ) || 7746 rclickable.test( elem.nodeName ) && 7747 elem.href 7748 ) { 7749 return 0; 7750 } 7751 7752 return -1; 7753 } 7754 } 7755 }, 7756 7757 propFix: { 7758 "for": "htmlFor", 7759 "class": "className" 7760 } 7761} ); 7762 7763// Support: IE <=11 only 7764// Accessing the selectedIndex property 7765// forces the browser to respect setting selected 7766// on the option 7767// The getter ensures a default option is selected 7768// when in an optgroup 7769// eslint rule "no-unused-expressions" is disabled for this code 7770// since it considers such accessions noop 7771if ( !support.optSelected ) { 7772 jQuery.propHooks.selected = { 7773 get: function( elem ) { 7774 7775 /* eslint no-unused-expressions: "off" */ 7776 7777 var parent = elem.parentNode; 7778 if ( parent && parent.parentNode ) { 7779 parent.parentNode.selectedIndex; 7780 } 7781 return null; 7782 }, 7783 set: function( elem ) { 7784 7785 /* eslint no-unused-expressions: "off" */ 7786 7787 var parent = elem.parentNode; 7788 if ( parent ) { 7789 parent.selectedIndex; 7790 7791 if ( parent.parentNode ) { 7792 parent.parentNode.selectedIndex; 7793 } 7794 } 7795 } 7796 }; 7797} 7798 7799jQuery.each( [ 7800 "tabIndex", 7801 "readOnly", 7802 "maxLength", 7803 "cellSpacing", 7804 "cellPadding", 7805 "rowSpan", 7806 "colSpan", 7807 "useMap", 7808 "frameBorder", 7809 "contentEditable" 7810], function() { 7811 jQuery.propFix[ this.toLowerCase() ] = this; 7812} ); 7813 7814 7815 7816 7817 // Strip and collapse whitespace according to HTML spec 7818 // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace 7819 function stripAndCollapse( value ) { 7820 var tokens = value.match( rnothtmlwhite ) || []; 7821 return tokens.join( " " ); 7822 } 7823 7824 7825function getClass( elem ) { 7826 return elem.getAttribute && elem.getAttribute( "class" ) || ""; 7827} 7828 7829function classesToArray( value ) { 7830 if ( Array.isArray( value ) ) { 7831 return value; 7832 } 7833 if ( typeof value === "string" ) { 7834 return value.match( rnothtmlwhite ) || []; 7835 } 7836 return []; 7837} 7838 7839jQuery.fn.extend( { 7840 addClass: function( value ) { 7841 var classes, elem, cur, curValue, clazz, j, finalValue, 7842 i = 0; 7843 7844 if ( isFunction( value ) ) { 7845 return this.each( function( j ) { 7846 jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); 7847 } ); 7848 } 7849 7850 classes = classesToArray( value ); 7851 7852 if ( classes.length ) { 7853 while ( ( elem = this[ i++ ] ) ) { 7854 curValue = getClass( elem ); 7855 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 7856 7857 if ( cur ) { 7858 j = 0; 7859 while ( ( clazz = classes[ j++ ] ) ) { 7860 if ( cur.indexOf( " " + clazz + " " ) < 0 ) { 7861 cur += clazz + " "; 7862 } 7863 } 7864 7865 // Only assign if different to avoid unneeded rendering. 7866 finalValue = stripAndCollapse( cur ); 7867 if ( curValue !== finalValue ) { 7868 elem.setAttribute( "class", finalValue ); 7869 } 7870 } 7871 } 7872 } 7873 7874 return this; 7875 }, 7876 7877 removeClass: function( value ) { 7878 var classes, elem, cur, curValue, clazz, j, finalValue, 7879 i = 0; 7880 7881 if ( isFunction( value ) ) { 7882 return this.each( function( j ) { 7883 jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); 7884 } ); 7885 } 7886 7887 if ( !arguments.length ) { 7888 return this.attr( "class", "" ); 7889 } 7890 7891 classes = classesToArray( value ); 7892 7893 if ( classes.length ) { 7894 while ( ( elem = this[ i++ ] ) ) { 7895 curValue = getClass( elem ); 7896 7897 // This expression is here for better compressibility (see addClass) 7898 cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); 7899 7900 if ( cur ) { 7901 j = 0; 7902 while ( ( clazz = classes[ j++ ] ) ) { 7903 7904 // Remove *all* instances 7905 while ( cur.indexOf( " " + clazz + " " ) > -1 ) { 7906 cur = cur.replace( " " + clazz + " ", " " ); 7907 } 7908 } 7909 7910 // Only assign if different to avoid unneeded rendering. 7911 finalValue = stripAndCollapse( cur ); 7912 if ( curValue !== finalValue ) { 7913 elem.setAttribute( "class", finalValue ); 7914 } 7915 } 7916 } 7917 } 7918 7919 return this; 7920 }, 7921 7922 toggleClass: function( value, stateVal ) { 7923 var type = typeof value, 7924 isValidValue = type === "string" || Array.isArray( value ); 7925 7926 if ( typeof stateVal === "boolean" && isValidValue ) { 7927 return stateVal ? this.addClass( value ) : this.removeClass( value ); 7928 } 7929 7930 if ( isFunction( value ) ) { 7931 return this.each( function( i ) { 7932 jQuery( this ).toggleClass( 7933 value.call( this, i, getClass( this ), stateVal ), 7934 stateVal 7935 ); 7936 } ); 7937 } 7938 7939 return this.each( function() { 7940 var className, i, self, classNames; 7941 7942 if ( isValidValue ) { 7943 7944 // Toggle individual class names 7945 i = 0; 7946 self = jQuery( this ); 7947 classNames = classesToArray( value ); 7948 7949 while ( ( className = classNames[ i++ ] ) ) { 7950 7951 // Check each className given, space separated list 7952 if ( self.hasClass( className ) ) { 7953 self.removeClass( className ); 7954 } else { 7955 self.addClass( className ); 7956 } 7957 } 7958 7959 // Toggle whole class name 7960 } else if ( value === undefined || type === "boolean" ) { 7961 className = getClass( this ); 7962 if ( className ) { 7963 7964 // Store className if set 7965 dataPriv.set( this, "__className__", className ); 7966 } 7967 7968 // If the element has a class name or if we're passed `false`, 7969 // then remove the whole classname (if there was one, the above saved it). 7970 // Otherwise bring back whatever was previously saved (if anything), 7971 // falling back to the empty string if nothing was stored. 7972 if ( this.setAttribute ) { 7973 this.setAttribute( "class", 7974 className || value === false ? 7975 "" : 7976 dataPriv.get( this, "__className__" ) || "" 7977 ); 7978 } 7979 } 7980 } ); 7981 }, 7982 7983 hasClass: function( selector ) { 7984 var className, elem, 7985 i = 0; 7986 7987 className = " " + selector + " "; 7988 while ( ( elem = this[ i++ ] ) ) { 7989 if ( elem.nodeType === 1 && 7990 ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { 7991 return true; 7992 } 7993 } 7994 7995 return false;
vendor: 5,544 bytes, lines 7996-8231
7996 } 7997} ); 7998 7999 8000 8001 8002var rreturn = /\r/g; 8003 8004jQuery.fn.extend( { 8005 val: function( value ) { 8006 var hooks, ret, valueIsFunction, 8007 elem = this[ 0 ]; 8008 8009 if ( !arguments.length ) { 8010 if ( elem ) { 8011 hooks = jQuery.valHooks[ elem.type ] || 8012 jQuery.valHooks[ elem.nodeName.toLowerCase() ]; 8013 8014 if ( hooks && 8015 "get" in hooks && 8016 ( ret = hooks.get( elem, "value" ) ) !== undefined 8017 ) { 8018 return ret; 8019 } 8020 8021 ret = elem.value; 8022 8023 // Handle most common string cases 8024 if ( typeof ret === "string" ) { 8025 return ret.replace( rreturn, "" ); 8026 } 8027 8028 // Handle cases where value is null/undef or number 8029 return ret == null ? "" : ret; 8030 } 8031 8032 return; 8033 } 8034 8035 valueIsFunction = isFunction( value ); 8036 8037 return this.each( function( i ) { 8038 var val; 8039 8040 if ( this.nodeType !== 1 ) { 8041 return; 8042 } 8043 8044 if ( valueIsFunction ) { 8045 val = value.call( this, i, jQuery( this ).val() ); 8046 } else { 8047 val = value; 8048 } 8049 8050 // Treat null/undefined as ""; convert numbers to string 8051 if ( val == null ) { 8052 val = ""; 8053 8054 } else if ( typeof val === "number" ) { 8055 val += ""; 8056 8057 } else if ( Array.isArray( val ) ) { 8058 val = jQuery.map( val, function( value ) { 8059 return value == null ? "" : value + ""; 8060 } ); 8061 } 8062 8063 hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; 8064 8065 // If set returns undefined, fall back to normal setting 8066 if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { 8067 this.value = val; 8068 } 8069 } ); 8070 } 8071} ); 8072 8073jQuery.extend( { 8074 valHooks: { 8075 option: { 8076 get: function( elem ) { 8077 8078 var val = jQuery.find.attr( elem, "value" ); 8079 return val != null ? 8080 val : 8081 8082 // Support: IE <=10 - 11 only 8083 // option.text throws exceptions (#14686, #14858) 8084 // Strip and collapse whitespace 8085 // https://html.spec.whatwg.org/#strip-and-collapse-whitespace 8086 stripAndCollapse( jQuery.text( elem ) ); 8087 } 8088 }, 8089 select: { 8090 get: function( elem ) { 8091 var value, option, i, 8092 options = elem.options, 8093 index = elem.selectedIndex, 8094 one = elem.type === "select-one", 8095 values = one ? null : [], 8096 max = one ? index + 1 : options.length; 8097 8098 if ( index < 0 ) { 8099 i = max; 8100 8101 } else { 8102 i = one ? index : 0; 8103 } 8104 8105 // Loop through all the selected options 8106 for ( ; i < max; i++ ) { 8107 option = options[ i ]; 8108 8109 // Support: IE <=9 only 8110 // IE8-9 doesn't update selected after form reset (#2551) 8111 if ( ( option.selected || i === index ) && 8112 8113 // Don't return options that are disabled or in a disabled optgroup 8114 !option.disabled && 8115 ( !option.parentNode.disabled || 8116 !nodeName( option.parentNode, "optgroup" ) ) ) { 8117 8118 // Get the specific value for the option 8119 value = jQuery( option ).val(); 8120 8121 // We don't need an array for one selects 8122 if ( one ) { 8123 return value; 8124 } 8125 8126 // Multi-Selects return an array 8127 values.push( value ); 8128 } 8129 } 8130 8131 return values; 8132 }, 8133 8134 set: function( elem, value ) { 8135 var optionSet, option, 8136 options = elem.options, 8137 values = jQuery.makeArray( value ), 8138 i = options.length; 8139 8140 while ( i-- ) { 8141 option = options[ i ]; 8142 8143 /* eslint-disable no-cond-assign */ 8144 8145 if ( option.selected = 8146 jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 8147 ) { 8148 optionSet = true; 8149 } 8150 8151 /* eslint-enable no-cond-assign */ 8152 } 8153 8154 // Force browsers to behave consistently when non-matching value is set 8155 if ( !optionSet ) { 8156 elem.selectedIndex = -1; 8157 } 8158 return values; 8159 } 8160 } 8161 } 8162} ); 8163 8164// Radios and checkboxes getter/setter 8165jQuery.each( [ "radio", "checkbox" ], function() { 8166 jQuery.valHooks[ this ] = { 8167 set: function( elem, value ) { 8168 if ( Array.isArray( value ) ) { 8169 return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); 8170 } 8171 } 8172 }; 8173 if ( !support.checkOn ) { 8174 jQuery.valHooks[ this ].get = function( elem ) { 8175 return elem.getAttribute( "value" ) === null ? "on" : elem.value; 8176 }; 8177 } 8178} ); 8179 8180 8181 8182 8183// Return jQuery for attributes-only inclusion 8184 8185 8186support.focusin = "onfocusin" in window; 8187 8188 8189var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, 8190 stopPropagationCallback = function( e ) { 8191 e.stopPropagation(); 8192 }; 8193 8194jQuery.extend( jQuery.event, { 8195 8196 trigger: function( event, data, elem, onlyHandlers ) { 8197 8198 var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, 8199 eventPath = [ elem || document ], 8200 type = hasOwn.call( event, "type" ) ? event.type : event, 8201 namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; 8202 8203 cur = lastElement = tmp = elem = elem || document; 8204 8205 // Don't do events on text and comment nodes 8206 if ( elem.nodeType === 3 || elem.nodeType === 8 ) { 8207 return; 8208 } 8209 8210 // focus/blur morphs to focusin/out; ensure we're not firing them right now 8211 if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { 8212 return; 8213 } 8214 8215 if ( type.indexOf( "." ) > -1 ) { 8216 8217 // Namespaced trigger; create a regexp to match event type in handle() 8218 namespaces = type.split( "." ); 8219 type = namespaces.shift(); 8220 namespaces.sort(); 8221 } 8222 ontype = type.indexOf( ":" ) < 0 && "on" + type; 8223 8224 // Caller can pass in a jQuery.Event object, Object, or just an event type string 8225 event = event[ jQuery.expando ] ? 8226 event : 8227 new jQuery.Event( type, typeof event === "object" && event ); 8228 8229 // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) 8230 event.isTrigger = onlyHandlers ? 2 : 3; 8231 event.namespace = namespaces.join( "." );
vendor: 32,532 bytes, lines 8232-9503
8232 event.rnamespace = event.namespace ? 8233 new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : 8234 null; 8235 8236 // Clean up the event in case it is being reused 8237 event.result = undefined; 8238 if ( !event.target ) { 8239 event.target = elem; 8240 } 8241 8242 // Clone any incoming data and prepend the event, creating the handler arg list 8243 data = data == null ? 8244 [ event ] : 8245 jQuery.makeArray( data, [ event ] ); 8246 8247 // Allow special events to draw outside the lines 8248 special = jQuery.event.special[ type ] || {}; 8249 if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { 8250 return; 8251 } 8252 8253 // Determine event propagation path in advance, per W3C events spec (#9951) 8254 // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) 8255 if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { 8256 8257 bubbleType = special.delegateType || type; 8258 if ( !rfocusMorph.test( bubbleType + type ) ) { 8259 cur = cur.parentNode; 8260 } 8261 for ( ; cur; cur = cur.parentNode ) { 8262 eventPath.push( cur ); 8263 tmp = cur; 8264 } 8265 8266 // Only add window if we got to document (e.g., not plain obj or detached DOM) 8267 if ( tmp === ( elem.ownerDocument || document ) ) { 8268 eventPath.push( tmp.defaultView || tmp.parentWindow || window ); 8269 } 8270 } 8271 8272 // Fire handlers on the event path 8273 i = 0; 8274 while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { 8275 lastElement = cur; 8276 event.type = i > 1 ? 8277 bubbleType : 8278 special.bindType || type; 8279 8280 // jQuery handler 8281 handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] && 8282 dataPriv.get( cur, "handle" ); 8283 if ( handle ) { 8284 handle.apply( cur, data ); 8285 } 8286 8287 // Native handler 8288 handle = ontype && cur[ ontype ]; 8289 if ( handle && handle.apply && acceptData( cur ) ) { 8290 event.result = handle.apply( cur, data ); 8291 if ( event.result === false ) { 8292 event.preventDefault(); 8293 } 8294 } 8295 } 8296 event.type = type; 8297 8298 // If nobody prevented the default action, do it now 8299 if ( !onlyHandlers && !event.isDefaultPrevented() ) { 8300 8301 if ( ( !special._default || 8302 special._default.apply( eventPath.pop(), data ) === false ) && 8303 acceptData( elem ) ) { 8304 8305 // Call a native DOM method on the target with the same name as the event. 8306 // Don't do default actions on window, that's where global variables be (#6170) 8307 if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { 8308 8309 // Don't re-trigger an onFOO event when we call its FOO() method 8310 tmp = elem[ ontype ]; 8311 8312 if ( tmp ) { 8313 elem[ ontype ] = null; 8314 } 8315 8316 // Prevent re-triggering of the same event, since we already bubbled it above 8317 jQuery.event.triggered = type; 8318 8319 if ( event.isPropagationStopped() ) { 8320 lastElement.addEventListener( type, stopPropagationCallback ); 8321 } 8322 8323 elem[ type ](); 8324 8325 if ( event.isPropagationStopped() ) { 8326 lastElement.removeEventListener( type, stopPropagationCallback ); 8327 } 8328 8329 jQuery.event.triggered = undefined; 8330 8331 if ( tmp ) { 8332 elem[ ontype ] = tmp; 8333 } 8334 } 8335 } 8336 } 8337 8338 return event.result; 8339 }, 8340 8341 // Piggyback on a donor event to simulate a different one 8342 // Used only for `focus(in | out)` events 8343 simulate: function( type, elem, event ) { 8344 var e = jQuery.extend( 8345 new jQuery.Event(), 8346 event, 8347 { 8348 type: type, 8349 isSimulated: true 8350 } 8351 ); 8352 8353 jQuery.event.trigger( e, null, elem ); 8354 } 8355 8356} ); 8357 8358jQuery.fn.extend( { 8359 8360 trigger: function( type, data ) { 8361 return this.each( function() { 8362 jQuery.event.trigger( type, data, this ); 8363 } ); 8364 }, 8365 triggerHandler: function( type, data ) { 8366 var elem = this[ 0 ]; 8367 if ( elem ) { 8368 return jQuery.event.trigger( type, data, elem, true ); 8369 } 8370 } 8371} ); 8372 8373 8374// Support: Firefox <=44 8375// Firefox doesn't have focus(in | out) events 8376// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 8377// 8378// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 8379// focus(in | out) events fire after focus & blur events, 8380// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order 8381// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 8382if ( !support.focusin ) { 8383 jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { 8384 8385 // Attach a single capturing handler on the document while someone wants focusin/focusout 8386 var handler = function( event ) { 8387 jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); 8388 }; 8389 8390 jQuery.event.special[ fix ] = { 8391 setup: function() { 8392 var doc = this.ownerDocument || this, 8393 attaches = dataPriv.access( doc, fix ); 8394 8395 if ( !attaches ) { 8396 doc.addEventListener( orig, handler, true ); 8397 } 8398 dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); 8399 }, 8400 teardown: function() { 8401 var doc = this.ownerDocument || this, 8402 attaches = dataPriv.access( doc, fix ) - 1; 8403 8404 if ( !attaches ) { 8405 doc.removeEventListener( orig, handler, true ); 8406 dataPriv.remove( doc, fix ); 8407 8408 } else { 8409 dataPriv.access( doc, fix, attaches ); 8410 } 8411 } 8412 }; 8413 } ); 8414} 8415var location = window.location; 8416 8417var nonce = Date.now(); 8418 8419var rquery = ( /\?/ ); 8420 8421 8422 8423// Cross-browser xml parsing 8424jQuery.parseXML = function( data ) { 8425 var xml; 8426 if ( !data || typeof data !== "string" ) { 8427 return null; 8428 } 8429 8430 // Support: IE 9 - 11 only 8431 // IE throws on parseFromString with invalid input. 8432 try { 8433 xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); 8434 } catch ( e ) { 8435 xml = undefined; 8436 } 8437 8438 if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { 8439 jQuery.error( "Invalid XML: " + data ); 8440 } 8441 return xml; 8442}; 8443 8444 8445var 8446 rbracket = /\[\]$/, 8447 rCRLF = /\r?\n/g, 8448 rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, 8449 rsubmittable = /^(?:input|select|textarea|keygen)/i; 8450 8451function buildParams( prefix, obj, traditional, add ) { 8452 var name; 8453 8454 if ( Array.isArray( obj ) ) { 8455 8456 // Serialize array item. 8457 jQuery.each( obj, function( i, v ) { 8458 if ( traditional || rbracket.test( prefix ) ) { 8459 8460 // Treat each array item as a scalar. 8461 add( prefix, v ); 8462 8463 } else { 8464 8465 // Item is non-scalar (array or object), encode its numeric index. 8466 buildParams( 8467 prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", 8468 v, 8469 traditional, 8470 add 8471 ); 8472 } 8473 } ); 8474 8475 } else if ( !traditional && toType( obj ) === "object" ) { 8476 8477 // Serialize object item. 8478 for ( name in obj ) { 8479 buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); 8480 } 8481 8482 } else { 8483 8484 // Serialize scalar item. 8485 add( prefix, obj ); 8486 } 8487} 8488 8489// Serialize an array of form elements or a set of 8490// key/values into a query string 8491jQuery.param = function( a, traditional ) { 8492 var prefix, 8493 s = [], 8494 add = function( key, valueOrFunction ) { 8495 8496 // If value is a function, invoke it and use its return value 8497 var value = isFunction( valueOrFunction ) ? 8498 valueOrFunction() : 8499 valueOrFunction; 8500 8501 s[ s.length ] = encodeURIComponent( key ) + "=" + 8502 encodeURIComponent( value == null ? "" : value ); 8503 }; 8504 8505 // If an array was passed in, assume that it is an array of form elements. 8506 if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { 8507 8508 // Serialize the form elements 8509 jQuery.each( a, function() { 8510 add( this.name, this.value ); 8511 } ); 8512 8513 } else { 8514 8515 // If traditional, encode the "old" way (the way 1.3.2 or older 8516 // did it), otherwise encode params recursively. 8517 for ( prefix in a ) { 8518 buildParams( prefix, a[ prefix ], traditional, add ); 8519 } 8520 } 8521 8522 // Return the resulting serialization 8523 return s.join( "&" ); 8524}; 8525 8526jQuery.fn.extend( { 8527 serialize: function() { 8528 return jQuery.param( this.serializeArray() ); 8529 }, 8530 serializeArray: function() { 8531 return this.map( function() { 8532 8533 // Can add propHook for "elements" to filter or add form elements 8534 var elements = jQuery.prop( this, "elements" ); 8535 return elements ? jQuery.makeArray( elements ) : this; 8536 } ) 8537 .filter( function() { 8538 var type = this.type; 8539 8540 // Use .is( ":disabled" ) so that fieldset[disabled] works 8541 return this.name && !jQuery( this ).is( ":disabled" ) && 8542 rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && 8543 ( this.checked || !rcheckableType.test( type ) ); 8544 } ) 8545 .map( function( i, elem ) { 8546 var val = jQuery( this ).val(); 8547 8548 if ( val == null ) { 8549 return null; 8550 } 8551 8552 if ( Array.isArray( val ) ) { 8553 return jQuery.map( val, function( val ) { 8554 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8555 } ); 8556 } 8557 8558 return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; 8559 } ).get(); 8560 } 8561} ); 8562 8563 8564var 8565 r20 = /%20/g, 8566 rhash = /#.*$/, 8567 rantiCache = /([?&])_=[^&]*/, 8568 rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, 8569 8570 // #7653, #8125, #8152: local protocol detection 8571 rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, 8572 rnoContent = /^(?:GET|HEAD)$/, 8573 rprotocol = /^\/\//, 8574 8575 /* Prefilters 8576 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) 8577 * 2) These are called: 8578 * - BEFORE asking for a transport 8579 * - AFTER param serialization (s.data is a string if s.processData is true) 8580 * 3) key is the dataType 8581 * 4) the catchall symbol "*" can be used 8582 * 5) execution will start with transport dataType and THEN continue down to "*" if needed 8583 */ 8584 prefilters = {}, 8585 8586 /* Transports bindings 8587 * 1) key is the dataType 8588 * 2) the catchall symbol "*" can be used 8589 * 3) selection will start with transport dataType and THEN go to "*" if needed 8590 */ 8591 transports = {}, 8592 8593 // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression 8594 allTypes = "*/".concat( "*" ), 8595 8596 // Anchor tag for parsing the document origin 8597 originAnchor = document.createElement( "a" ); 8598 originAnchor.href = location.href; 8599 8600// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport 8601function addToPrefiltersOrTransports( structure ) { 8602 8603 // dataTypeExpression is optional and defaults to "*" 8604 return function( dataTypeExpression, func ) { 8605 8606 if ( typeof dataTypeExpression !== "string" ) { 8607 func = dataTypeExpression; 8608 dataTypeExpression = "*"; 8609 } 8610 8611 var dataType, 8612 i = 0, 8613 dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; 8614 8615 if ( isFunction( func ) ) { 8616 8617 // For each dataType in the dataTypeExpression 8618 while ( ( dataType = dataTypes[ i++ ] ) ) { 8619 8620 // Prepend if requested 8621 if ( dataType[ 0 ] === "+" ) { 8622 dataType = dataType.slice( 1 ) || "*"; 8623 ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); 8624 8625 // Otherwise append 8626 } else { 8627 ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); 8628 } 8629 } 8630 } 8631 }; 8632} 8633 8634// Base inspection function for prefilters and transports 8635function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { 8636 8637 var inspected = {}, 8638 seekingTransport = ( structure === transports ); 8639 8640 function inspect( dataType ) { 8641 var selected; 8642 inspected[ dataType ] = true; 8643 jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { 8644 var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); 8645 if ( typeof dataTypeOrTransport === "string" && 8646 !seekingTransport && !inspected[ dataTypeOrTransport ] ) { 8647 8648 options.dataTypes.unshift( dataTypeOrTransport ); 8649 inspect( dataTypeOrTransport ); 8650 return false; 8651 } else if ( seekingTransport ) { 8652 return !( selected = dataTypeOrTransport ); 8653 } 8654 } ); 8655 return selected; 8656 } 8657 8658 return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); 8659} 8660 8661// A special extend for ajax options 8662// that takes "flat" options (not to be deep extended) 8663// Fixes #9887 8664function ajaxExtend( target, src ) { 8665 var key, deep, 8666 flatOptions = jQuery.ajaxSettings.flatOptions || {}; 8667 8668 for ( key in src ) { 8669 if ( src[ key ] !== undefined ) { 8670 ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; 8671 } 8672 } 8673 if ( deep ) { 8674 jQuery.extend( true, target, deep ); 8675 } 8676 8677 return target; 8678} 8679 8680/* Handles responses to an ajax request: 8681 * - finds the right dataType (mediates between content-type and expected dataType) 8682 * - returns the corresponding response 8683 */ 8684function ajaxHandleResponses( s, jqXHR, responses ) { 8685 8686 var ct, type, finalDataType, firstDataType, 8687 contents = s.contents, 8688 dataTypes = s.dataTypes; 8689 8690 // Remove auto dataType and get content-type in the process 8691 while ( dataTypes[ 0 ] === "*" ) { 8692 dataTypes.shift(); 8693 if ( ct === undefined ) { 8694 ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); 8695 } 8696 } 8697 8698 // Check if we're dealing with a known content-type 8699 if ( ct ) { 8700 for ( type in contents ) { 8701 if ( contents[ type ] && contents[ type ].test( ct ) ) { 8702 dataTypes.unshift( type ); 8703 break; 8704 } 8705 } 8706 } 8707 8708 // Check to see if we have a response for the expected dataType 8709 if ( dataTypes[ 0 ] in responses ) { 8710 finalDataType = dataTypes[ 0 ]; 8711 } else { 8712 8713 // Try convertible dataTypes 8714 for ( type in responses ) { 8715 if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { 8716 finalDataType = type; 8717 break; 8718 } 8719 if ( !firstDataType ) { 8720 firstDataType = type; 8721 } 8722 } 8723 8724 // Or just use first one 8725 finalDataType = finalDataType || firstDataType; 8726 } 8727 8728 // If we found a dataType 8729 // We add the dataType to the list if needed 8730 // and return the corresponding response 8731 if ( finalDataType ) { 8732 if ( finalDataType !== dataTypes[ 0 ] ) { 8733 dataTypes.unshift( finalDataType ); 8734 } 8735 return responses[ finalDataType ]; 8736 } 8737} 8738 8739/* Chain conversions given the request and the original response 8740 * Also sets the responseXXX fields on the jqXHR instance 8741 */ 8742function ajaxConvert( s, response, jqXHR, isSuccess ) { 8743 var conv2, current, conv, tmp, prev, 8744 converters = {}, 8745 8746 // Work with a copy of dataTypes in case we need to modify it for conversion 8747 dataTypes = s.dataTypes.slice(); 8748 8749 // Create converters map with lowercased keys 8750 if ( dataTypes[ 1 ] ) { 8751 for ( conv in s.converters ) { 8752 converters[ conv.toLowerCase() ] = s.converters[ conv ]; 8753 } 8754 } 8755 8756 current = dataTypes.shift(); 8757 8758 // Convert to each sequential dataType 8759 while ( current ) { 8760 8761 if ( s.responseFields[ current ] ) { 8762 jqXHR[ s.responseFields[ current ] ] = response; 8763 } 8764 8765 // Apply the dataFilter if provided 8766 if ( !prev && isSuccess && s.dataFilter ) { 8767 response = s.dataFilter( response, s.dataType ); 8768 } 8769 8770 prev = current; 8771 current = dataTypes.shift(); 8772 8773 if ( current ) { 8774 8775 // There's only work to do if current dataType is non-auto 8776 if ( current === "*" ) { 8777 8778 current = prev; 8779 8780 // Convert response if prev dataType is non-auto and differs from current 8781 } else if ( prev !== "*" && prev !== current ) { 8782 8783 // Seek a direct converter 8784 conv = converters[ prev + " " + current ] || converters[ "* " + current ]; 8785 8786 // If none found, seek a pair 8787 if ( !conv ) { 8788 for ( conv2 in converters ) { 8789 8790 // If conv2 outputs current 8791 tmp = conv2.split( " " ); 8792 if ( tmp[ 1 ] === current ) { 8793 8794 // If prev can be converted to accepted input 8795 conv = converters[ prev + " " + tmp[ 0 ] ] || 8796 converters[ "* " + tmp[ 0 ] ]; 8797 if ( conv ) { 8798 8799 // Condense equivalence converters 8800 if ( conv === true ) { 8801 conv = converters[ conv2 ]; 8802 8803 // Otherwise, insert the intermediate dataType 8804 } else if ( converters[ conv2 ] !== true ) { 8805 current = tmp[ 0 ]; 8806 dataTypes.unshift( tmp[ 1 ] ); 8807 } 8808 break; 8809 } 8810 } 8811 } 8812 } 8813 8814 // Apply converter (if not an equivalence) 8815 if ( conv !== true ) { 8816 8817 // Unless errors are allowed to bubble, catch and return them 8818 if ( conv && s.throws ) { 8819 response = conv( response ); 8820 } else { 8821 try { 8822 response = conv( response ); 8823 } catch ( e ) { 8824 return { 8825 state: "parsererror", 8826 error: conv ? e : "No conversion from " + prev + " to " + current 8827 }; 8828 } 8829 } 8830 } 8831 } 8832 } 8833 } 8834 8835 return { state: "success", data: response }; 8836} 8837 8838jQuery.extend( { 8839 8840 // Counter for holding the number of active queries 8841 active: 0, 8842 8843 // Last-Modified header cache for next request 8844 lastModified: {}, 8845 etag: {}, 8846 8847 ajaxSettings: { 8848 url: location.href, 8849 type: "GET", 8850 isLocal: rlocalProtocol.test( location.protocol ), 8851 global: true, 8852 processData: true, 8853 async: true, 8854 contentType: "application/x-www-form-urlencoded; charset=UTF-8", 8855 8856 /* 8857 timeout: 0, 8858 data: null, 8859 dataType: null, 8860 username: null, 8861 password: null, 8862 cache: null, 8863 throws: false, 8864 traditional: false, 8865 headers: {}, 8866 */ 8867 8868 accepts: { 8869 "*": allTypes, 8870 text: "text/plain", 8871 html: "text/html", 8872 xml: "application/xml, text/xml", 8873 json: "application/json, text/javascript" 8874 }, 8875 8876 contents: { 8877 xml: /\bxml\b/, 8878 html: /\bhtml/, 8879 json: /\bjson\b/ 8880 }, 8881 8882 responseFields: { 8883 xml: "responseXML", 8884 text: "responseText", 8885 json: "responseJSON" 8886 }, 8887 8888 // Data converters 8889 // Keys separate source (or catchall "*") and destination types with a single space 8890 converters: { 8891 8892 // Convert anything to text 8893 "* text": String, 8894 8895 // Text to html (true = no transformation) 8896 "text html": true, 8897 8898 // Evaluate text as a json expression 8899 "text json": JSON.parse, 8900 8901 // Parse text as xml 8902 "text xml": jQuery.parseXML 8903 }, 8904 8905 // For options that shouldn't be deep extended: 8906 // you can add your own custom options here if 8907 // and when you create one that shouldn't be 8908 // deep extended (see ajaxExtend) 8909 flatOptions: { 8910 url: true, 8911 context: true 8912 } 8913 }, 8914 8915 // Creates a full fledged settings object into target 8916 // with both ajaxSettings and settings fields. 8917 // If target is omitted, writes into ajaxSettings. 8918 ajaxSetup: function( target, settings ) { 8919 return settings ? 8920 8921 // Building a settings object 8922 ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : 8923 8924 // Extending ajaxSettings 8925 ajaxExtend( jQuery.ajaxSettings, target ); 8926 }, 8927 8928 ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), 8929 ajaxTransport: addToPrefiltersOrTransports( transports ), 8930 8931 // Main method 8932 ajax: function( url, options ) { 8933 8934 // If url is an object, simulate pre-1.5 signature 8935 if ( typeof url === "object" ) { 8936 options = url; 8937 url = undefined; 8938 } 8939 8940 // Force options to be an object 8941 options = options || {}; 8942 8943 var transport, 8944 8945 // URL without anti-cache param 8946 cacheURL, 8947 8948 // Response headers 8949 responseHeadersString, 8950 responseHeaders, 8951 8952 // timeout handle 8953 timeoutTimer, 8954 8955 // Url cleanup var 8956 urlAnchor, 8957 8958 // Request state (becomes false upon send and true upon completion) 8959 completed, 8960 8961 // To know if global events are to be dispatched 8962 fireGlobals, 8963 8964 // Loop variable 8965 i, 8966 8967 // uncached part of the url 8968 uncached, 8969 8970 // Create the final options object 8971 s = jQuery.ajaxSetup( {}, options ), 8972 8973 // Callbacks context 8974 callbackContext = s.context || s, 8975 8976 // Context for global events is callbackContext if it is a DOM node or jQuery collection 8977 globalEventContext = s.context && 8978 ( callbackContext.nodeType || callbackContext.jquery ) ? 8979 jQuery( callbackContext ) : 8980 jQuery.event, 8981 8982 // Deferreds 8983 deferred = jQuery.Deferred(), 8984 completeDeferred = jQuery.Callbacks( "once memory" ), 8985 8986 // Status-dependent callbacks 8987 statusCode = s.statusCode || {}, 8988 8989 // Headers (they are sent all at once) 8990 requestHeaders = {}, 8991 requestHeadersNames = {}, 8992 8993 // Default abort message 8994 strAbort = "canceled", 8995 8996 // Fake xhr 8997 jqXHR = { 8998 readyState: 0, 8999 9000 // Builds headers hashtable if needed 9001 getResponseHeader: function( key ) { 9002 var match; 9003 if ( completed ) { 9004 if ( !responseHeaders ) { 9005 responseHeaders = {}; 9006 while ( ( match = rheaders.exec( responseHeadersString ) ) ) { 9007 responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ]; 9008 } 9009 } 9010 match = responseHeaders[ key.toLowerCase() ]; 9011 } 9012 return match == null ? null : match; 9013 }, 9014 9015 // Raw string 9016 getAllResponseHeaders: function() { 9017 return completed ? responseHeadersString : null; 9018 }, 9019 9020 // Caches the header 9021 setRequestHeader: function( name, value ) { 9022 if ( completed == null ) { 9023 name = requestHeadersNames[ name.toLowerCase() ] = 9024 requestHeadersNames[ name.toLowerCase() ] || name; 9025 requestHeaders[ name ] = value; 9026 } 9027 return this; 9028 }, 9029 9030 // Overrides response content-type header 9031 overrideMimeType: function( type ) { 9032 if ( completed == null ) { 9033 s.mimeType = type; 9034 } 9035 return this; 9036 }, 9037 9038 // Status-dependent callbacks 9039 statusCode: function( map ) { 9040 var code; 9041 if ( map ) { 9042 if ( completed ) { 9043 9044 // Execute the appropriate callbacks 9045 jqXHR.always( map[ jqXHR.status ] ); 9046 } else { 9047 9048 // Lazy-add the new callbacks in a way that preserves old ones 9049 for ( code in map ) { 9050 statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; 9051 } 9052 } 9053 } 9054 return this; 9055 }, 9056 9057 // Cancel the request 9058 abort: function( statusText ) { 9059 var finalText = statusText || strAbort; 9060 if ( transport ) { 9061 transport.abort( finalText ); 9062 } 9063 done( 0, finalText ); 9064 return this; 9065 } 9066 }; 9067 9068 // Attach deferreds 9069 deferred.promise( jqXHR ); 9070 9071 // Add protocol if not provided (prefilters might expect it) 9072 // Handle falsy url in the settings object (#10093: consistency with old signature) 9073 // We also use the url parameter if available 9074 s.url = ( ( url || s.url || location.href ) + "" ) 9075 .replace( rprotocol, location.protocol + "//" ); 9076 9077 // Alias method option to type as per ticket #12004 9078 s.type = options.method || options.type || s.method || s.type; 9079 9080 // Extract dataTypes list 9081 s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; 9082 9083 // A cross-domain request is in order when the origin doesn't match the current origin. 9084 if ( s.crossDomain == null ) { 9085 urlAnchor = document.createElement( "a" ); 9086 9087 // Support: IE <=8 - 11, Edge 12 - 15 9088 // IE throws exception on accessing the href property if url is malformed, 9089 // e.g. http://example.com:80x/ 9090 try { 9091 urlAnchor.href = s.url; 9092 9093 // Support: IE <=8 - 11 only 9094 // Anchor's host property isn't correctly set when s.url is relative 9095 urlAnchor.href = urlAnchor.href; 9096 s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== 9097 urlAnchor.protocol + "//" + urlAnchor.host; 9098 } catch ( e ) { 9099 9100 // If there is an error parsing the URL, assume it is crossDomain, 9101 // it can be rejected by the transport if it is invalid 9102 s.crossDomain = true; 9103 } 9104 } 9105 9106 // Convert data if not already a string 9107 if ( s.data && s.processData && typeof s.data !== "string" ) { 9108 s.data = jQuery.param( s.data, s.traditional ); 9109 } 9110 9111 // Apply prefilters 9112 inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); 9113 9114 // If request was aborted inside a prefilter, stop there 9115 if ( completed ) { 9116 return jqXHR; 9117 } 9118 9119 // We can fire global events as of now if asked to 9120 // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) 9121 fireGlobals = jQuery.event && s.global; 9122 9123 // Watch for a new set of requests 9124 if ( fireGlobals && jQuery.active++ === 0 ) { 9125 jQuery.event.trigger( "ajaxStart" ); 9126 } 9127 9128 // Uppercase the type 9129 s.type = s.type.toUpperCase(); 9130 9131 // Determine if request has content 9132 s.hasContent = !rnoContent.test( s.type ); 9133 9134 // Save the URL in case we're toying with the If-Modified-Since 9135 // and/or If-None-Match header later on 9136 // Remove hash to simplify url manipulation 9137 cacheURL = s.url.replace( rhash, "" ); 9138 9139 // More options handling for requests with no content 9140 if ( !s.hasContent ) { 9141 9142 // Remember the hash so we can put it back 9143 uncached = s.url.slice( cacheURL.length ); 9144 9145 // If data is available and should be processed, append data to url 9146 if ( s.data && ( s.processData || typeof s.data === "string" ) ) { 9147 cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; 9148 9149 // #9682: remove data so that it's not used in an eventual retry 9150 delete s.data; 9151 } 9152 9153 // Add or update anti-cache param if needed 9154 if ( s.cache === false ) { 9155 cacheURL = cacheURL.replace( rantiCache, "$1" ); 9156 uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce++ ) + uncached; 9157 } 9158 9159 // Put hash and anti-cache on the URL that will be requested (gh-1732) 9160 s.url = cacheURL + uncached; 9161 9162 // Change '%20' to '+' if this is encoded form body content (gh-2658) 9163 } else if ( s.data && s.processData && 9164 ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { 9165 s.data = s.data.replace( r20, "+" ); 9166 } 9167 9168 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9169 if ( s.ifModified ) { 9170 if ( jQuery.lastModified[ cacheURL ] ) { 9171 jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); 9172 } 9173 if ( jQuery.etag[ cacheURL ] ) { 9174 jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); 9175 } 9176 } 9177 9178 // Set the correct header, if data is being sent 9179 if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { 9180 jqXHR.setRequestHeader( "Content-Type", s.contentType ); 9181 } 9182 9183 // Set the Accepts header for the server, depending on the dataType 9184 jqXHR.setRequestHeader( 9185 "Accept", 9186 s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? 9187 s.accepts[ s.dataTypes[ 0 ] ] + 9188 ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : 9189 s.accepts[ "*" ] 9190 ); 9191 9192 // Check for headers option 9193 for ( i in s.headers ) { 9194 jqXHR.setRequestHeader( i, s.headers[ i ] ); 9195 } 9196 9197 // Allow custom headers/mimetypes and early abort 9198 if ( s.beforeSend && 9199 ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { 9200 9201 // Abort if not done already and return 9202 return jqXHR.abort(); 9203 } 9204 9205 // Aborting is no longer a cancellation 9206 strAbort = "abort"; 9207 9208 // Install callbacks on deferreds 9209 completeDeferred.add( s.complete ); 9210 jqXHR.done( s.success ); 9211 jqXHR.fail( s.error ); 9212 9213 // Get transport 9214 transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); 9215 9216 // If no transport, we auto-abort 9217 if ( !transport ) { 9218 done( -1, "No Transport" ); 9219 } else { 9220 jqXHR.readyState = 1; 9221 9222 // Send global event 9223 if ( fireGlobals ) { 9224 globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); 9225 } 9226 9227 // If request was aborted inside ajaxSend, stop there 9228 if ( completed ) { 9229 return jqXHR; 9230 } 9231 9232 // Timeout 9233 if ( s.async && s.timeout > 0 ) { 9234 timeoutTimer = window.setTimeout( function() { 9235 jqXHR.abort( "timeout" ); 9236 }, s.timeout ); 9237 } 9238 9239 try { 9240 completed = false; 9241 transport.send( requestHeaders, done ); 9242 } catch ( e ) { 9243 9244 // Rethrow post-completion exceptions 9245 if ( completed ) { 9246 throw e; 9247 } 9248 9249 // Propagate others as results 9250 done( -1, e ); 9251 } 9252 } 9253 9254 // Callback for when everything is done 9255 function done( status, nativeStatusText, responses, headers ) { 9256 var isSuccess, success, error, response, modified, 9257 statusText = nativeStatusText; 9258 9259 // Ignore repeat invocations 9260 if ( completed ) { 9261 return; 9262 } 9263 9264 completed = true; 9265 9266 // Clear timeout if it exists 9267 if ( timeoutTimer ) { 9268 window.clearTimeout( timeoutTimer ); 9269 } 9270 9271 // Dereference transport for early garbage collection 9272 // (no matter how long the jqXHR object will be used) 9273 transport = undefined; 9274 9275 // Cache response headers 9276 responseHeadersString = headers || ""; 9277 9278 // Set readyState 9279 jqXHR.readyState = status > 0 ? 4 : 0; 9280 9281 // Determine if successful 9282 isSuccess = status >= 200 && status < 300 || status === 304; 9283 9284 // Get response data 9285 if ( responses ) { 9286 response = ajaxHandleResponses( s, jqXHR, responses ); 9287 } 9288 9289 // Convert no matter what (that way responseXXX fields are always set) 9290 response = ajaxConvert( s, response, jqXHR, isSuccess ); 9291 9292 // If successful, handle type chaining 9293 if ( isSuccess ) { 9294 9295 // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. 9296 if ( s.ifModified ) { 9297 modified = jqXHR.getResponseHeader( "Last-Modified" ); 9298 if ( modified ) { 9299 jQuery.lastModified[ cacheURL ] = modified; 9300 } 9301 modified = jqXHR.getResponseHeader( "etag" ); 9302 if ( modified ) { 9303 jQuery.etag[ cacheURL ] = modified; 9304 } 9305 } 9306 9307 // if no content 9308 if ( status === 204 || s.type === "HEAD" ) { 9309 statusText = "nocontent"; 9310 9311 // if not modified 9312 } else if ( status === 304 ) { 9313 statusText = "notmodified"; 9314 9315 // If we have data, let's convert it 9316 } else { 9317 statusText = response.state; 9318 success = response.data; 9319 error = response.error; 9320 isSuccess = !error; 9321 } 9322 } else { 9323 9324 // Extract error from statusText and normalize for non-aborts 9325 error = statusText; 9326 if ( status || !statusText ) { 9327 statusText = "error"; 9328 if ( status < 0 ) { 9329 status = 0; 9330 } 9331 } 9332 } 9333 9334 // Set data for the fake xhr object 9335 jqXHR.status = status; 9336 jqXHR.statusText = ( nativeStatusText || statusText ) + ""; 9337 9338 // Success/Error 9339 if ( isSuccess ) { 9340 deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); 9341 } else { 9342 deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); 9343 } 9344 9345 // Status-dependent callbacks 9346 jqXHR.statusCode( statusCode ); 9347 statusCode = undefined; 9348 9349 if ( fireGlobals ) { 9350 globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", 9351 [ jqXHR, s, isSuccess ? success : error ] ); 9352 } 9353 9354 // Complete 9355 completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); 9356 9357 if ( fireGlobals ) { 9358 globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); 9359 9360 // Handle the global AJAX counter 9361 if ( !( --jQuery.active ) ) { 9362 jQuery.event.trigger( "ajaxStop" ); 9363 } 9364 } 9365 } 9366 9367 return jqXHR; 9368 }, 9369 9370 getJSON: function( url, data, callback ) { 9371 return jQuery.get( url, data, callback, "json" ); 9372 }, 9373 9374 getScript: function( url, callback ) { 9375 return jQuery.get( url, undefined, callback, "script" ); 9376 } 9377} ); 9378 9379jQuery.each( [ "get", "post" ], function( i, method ) { 9380 jQuery[ method ] = function( url, data, callback, type ) { 9381 9382 // Shift arguments if data argument was omitted 9383 if ( isFunction( data ) ) { 9384 type = type || callback; 9385 callback = data; 9386 data = undefined; 9387 } 9388 9389 // The url can be an options object (which then must have .url) 9390 return jQuery.ajax( jQuery.extend( { 9391 url: url, 9392 type: method, 9393 dataType: type, 9394 data: data, 9395 success: callback 9396 }, jQuery.isPlainObject( url ) && url ) ); 9397 }; 9398} ); 9399 9400 9401jQuery._evalUrl = function( url ) { 9402 return jQuery.ajax( { 9403 url: url, 9404 9405 // Make this explicit, since user can override this through ajaxSetup (#11264) 9406 type: "GET", 9407 dataType: "script", 9408 cache: true, 9409 async: false, 9410 global: false, 9411 "throws": true 9412 } ); 9413}; 9414 9415 9416jQuery.fn.extend( { 9417 wrapAll: function( html ) { 9418 var wrap; 9419 9420 if ( this[ 0 ] ) { 9421 if ( isFunction( html ) ) { 9422 html = html.call( this[ 0 ] ); 9423 } 9424 9425 // The elements to wrap the target around 9426 wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); 9427 9428 if ( this[ 0 ].parentNode ) { 9429 wrap.insertBefore( this[ 0 ] ); 9430 } 9431 9432 wrap.map( function() { 9433 var elem = this; 9434 9435 while ( elem.firstElementChild ) { 9436 elem = elem.firstElementChild; 9437 } 9438 9439 return elem; 9440 } ).append( this ); 9441 } 9442 9443 return this; 9444 }, 9445 9446 wrapInner: function( html ) { 9447 if ( isFunction( html ) ) { 9448 return this.each( function( i ) { 9449 jQuery( this ).wrapInner( html.call( this, i ) ); 9450 } ); 9451 } 9452 9453 return this.each( function() { 9454 var self = jQuery( this ), 9455 contents = self.contents(); 9456 9457 if ( contents.length ) { 9458 contents.wrapAll( html ); 9459 9460 } else { 9461 self.append( html ); 9462 } 9463 } ); 9464 }, 9465 9466 wrap: function( html ) { 9467 var htmlIsFunction = isFunction( html ); 9468 9469 return this.each( function( i ) { 9470 jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); 9471 } ); 9472 }, 9473 9474 unwrap: function( selector ) { 9475 this.parent( selector ).not( "body" ).each( function() { 9476 jQuery( this ).replaceWith( this.childNodes ); 9477 } ); 9478 return this; 9479 } 9480} ); 9481 9482 9483jQuery.expr.pseudos.hidden = function( elem ) { 9484 return !jQuery.expr.pseudos.visible( elem ); 9485}; 9486jQuery.expr.pseudos.visible = function( elem ) { 9487 return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); 9488}; 9489 9490 9491 9492 9493jQuery.ajaxSettings.xhr = function() { 9494 try { 9495 return new window.XMLHttpRequest(); 9496 } catch ( e ) {} 9497}; 9498 9499var xhrSuccessStatus = { 9500 9501 // File protocol always yields status code 0, assume 200 9502 0: 200, 9503
vendor: 1,240 bytes, lines 9504-9546
9504 // Support: IE <=9 only 9505 // #1450: sometimes IE returns 1223 when it should be 204 9506 1223: 204 9507 }, 9508 xhrSupported = jQuery.ajaxSettings.xhr(); 9509 9510support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); 9511support.ajax = xhrSupported = !!xhrSupported; 9512 9513jQuery.ajaxTransport( function( options ) { 9514 var callback, errorCallback; 9515 9516 // Cross domain only allowed if supported through XMLHttpRequest 9517 if ( support.cors || xhrSupported && !options.crossDomain ) { 9518 return { 9519 send: function( headers, complete ) { 9520 var i, 9521 xhr = options.xhr(); 9522 9523 xhr.open( 9524 options.type, 9525 options.url, 9526 options.async, 9527 options.username, 9528 options.password 9529 ); 9530 9531 // Apply custom fields if provided 9532 if ( options.xhrFields ) { 9533 for ( i in options.xhrFields ) { 9534 xhr[ i ] = options.xhrFields[ i ]; 9535 } 9536 } 9537 9538 // Override mime type if needed 9539 if ( options.mimeType && xhr.overrideMimeType ) { 9540 xhr.overrideMimeType( options.mimeType ); 9541 } 9542 9543 // X-Requested-With header 9544 // For cross-domain requests, seeing as conditions for a preflight are 9545 // akin to a jigsaw puzzle, we simply never set it to be sure. 9546 // (it can always be set on a per-request basis or even using ajaxSetup)
vendor: 5,627 bytes, lines 9547-9768
9547 // For same-domain requests, won't change header if already provided. 9548 if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { 9549 headers[ "X-Requested-With" ] = "XMLHttpRequest"; 9550 } 9551 9552 // Set headers 9553 for ( i in headers ) { 9554 xhr.setRequestHeader( i, headers[ i ] ); 9555 } 9556 9557 // Callback 9558 callback = function( type ) { 9559 return function() { 9560 if ( callback ) { 9561 callback = errorCallback = xhr.onload = 9562 xhr.onerror = xhr.onabort = xhr.ontimeout = 9563 xhr.onreadystatechange = null; 9564 9565 if ( type === "abort" ) { 9566 xhr.abort(); 9567 } else if ( type === "error" ) { 9568 9569 // Support: IE <=9 only 9570 // On a manual native abort, IE9 throws 9571 // errors on any property access that is not readyState 9572 if ( typeof xhr.status !== "number" ) { 9573 complete( 0, "error" ); 9574 } else { 9575 complete( 9576 9577 // File: protocol always yields status 0; see #8605, #14207 9578 xhr.status, 9579 xhr.statusText 9580 ); 9581 } 9582 } else { 9583 complete( 9584 xhrSuccessStatus[ xhr.status ] || xhr.status, 9585 xhr.statusText, 9586 9587 // Support: IE <=9 only 9588 // IE9 has no XHR2 but throws on binary (trac-11426) 9589 // For XHR2 non-text, let the caller handle it (gh-2498) 9590 ( xhr.responseType || "text" ) !== "text" || 9591 typeof xhr.responseText !== "string" ? 9592 { binary: xhr.response } : 9593 { text: xhr.responseText }, 9594 xhr.getAllResponseHeaders() 9595 ); 9596 } 9597 } 9598 }; 9599 }; 9600 9601 // Listen to events 9602 xhr.onload = callback(); 9603 errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); 9604 9605 // Support: IE 9 only 9606 // Use onreadystatechange to replace onabort 9607 // to handle uncaught aborts 9608 if ( xhr.onabort !== undefined ) { 9609 xhr.onabort = errorCallback; 9610 } else { 9611 xhr.onreadystatechange = function() { 9612 9613 // Check readyState before timeout as it changes 9614 if ( xhr.readyState === 4 ) { 9615 9616 // Allow onerror to be called first, 9617 // but that will not handle a native abort 9618 // Also, save errorCallback to a variable 9619 // as xhr.onerror cannot be accessed 9620 window.setTimeout( function() { 9621 if ( callback ) { 9622 errorCallback(); 9623 } 9624 } ); 9625 } 9626 }; 9627 } 9628 9629 // Create the abort callback 9630 callback = callback( "abort" ); 9631 9632 try { 9633 9634 // Do send the request (this may raise an exception) 9635 xhr.send( options.hasContent && options.data || null ); 9636 } catch ( e ) { 9637 9638 // #14683: Only rethrow if this hasn't been notified as an error yet 9639 if ( callback ) { 9640 throw e; 9641 } 9642 } 9643 }, 9644 9645 abort: function() { 9646 if ( callback ) { 9647 callback(); 9648 } 9649 } 9650 }; 9651 } 9652} ); 9653 9654 9655 9656 9657// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) 9658jQuery.ajaxPrefilter( function( s ) { 9659 if ( s.crossDomain ) { 9660 s.contents.script = false; 9661 } 9662} ); 9663 9664// Install script dataType 9665jQuery.ajaxSetup( { 9666 accepts: { 9667 script: "text/javascript, application/javascript, " + 9668 "application/ecmascript, application/x-ecmascript" 9669 }, 9670 contents: { 9671 script: /\b(?:java|ecma)script\b/ 9672 }, 9673 converters: { 9674 "text script": function( text ) { 9675 jQuery.globalEval( text ); 9676 return text; 9677 } 9678 } 9679} ); 9680 9681// Handle cache's special case and crossDomain 9682jQuery.ajaxPrefilter( "script", function( s ) { 9683 if ( s.cache === undefined ) { 9684 s.cache = false; 9685 } 9686 if ( s.crossDomain ) { 9687 s.type = "GET"; 9688 } 9689} ); 9690 9691// Bind script tag hack transport 9692jQuery.ajaxTransport( "script", function( s ) { 9693 9694 // This transport only deals with cross domain requests 9695 if ( s.crossDomain ) { 9696 var script, callback; 9697 return { 9698 send: function( _, complete ) { 9699 script = jQuery( "<script>" ).prop( { 9700 charset: s.scriptCharset, 9701 src: s.url 9702 } ).on( 9703 "load error", 9704 callback = function( evt ) { 9705 script.remove(); 9706 callback = null; 9707 if ( evt ) { 9708 complete( evt.type === "error" ? 404 : 200, evt.type ); 9709 } 9710 } 9711 ); 9712 9713 // Use native DOM manipulation to avoid our domManip AJAX trickery 9714 document.head.appendChild( script[ 0 ] ); 9715 }, 9716 abort: function() { 9717 if ( callback ) { 9718 callback(); 9719 } 9720 } 9721 }; 9722 } 9723} ); 9724 9725 9726 9727 9728var oldCallbacks = [], 9729 rjsonp = /(=)\?(?=&|$)|\?\?/; 9730 9731// Default jsonp settings 9732jQuery.ajaxSetup( { 9733 jsonp: "callback", 9734 jsonpCallback: function() { 9735 var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) ); 9736 this[ callback ] = true; 9737 return callback; 9738 } 9739} ); 9740 9741// Detect, normalize options and install callbacks for jsonp requests 9742jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) { 9743 9744 var callbackName, overwritten, responseContainer, 9745 jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ? 9746 "url" : 9747 typeof s.data === "string" && 9748 ( s.contentType || "" ) 9749 .indexOf( "application/x-www-form-urlencoded" ) === 0 && 9750 rjsonp.test( s.data ) && "data" 9751 ); 9752 9753 // Handle iff the expected data type is "jsonp" or we have a parameter to set 9754 if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) { 9755 9756 // Get callback name, remembering preexisting value associated with it 9757 callbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ? 9758 s.jsonpCallback() : 9759 s.jsonpCallback; 9760 9761 // Insert callback into url or form data 9762 if ( jsonProp ) { 9763 s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName ); 9764 } else if ( s.jsonp !== false ) { 9765 s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName; 9766 } 9767 9768 // Use data converter to retrieve json after script execution
vendor: 2,987 bytes, lines 9769-9878
9769 s.converters[ "script json" ] = function() { 9770 if ( !responseContainer ) { 9771 jQuery.error( callbackName + " was not called" ); 9772 } 9773 return responseContainer[ 0 ]; 9774 }; 9775 9776 // Force json dataType 9777 s.dataTypes[ 0 ] = "json"; 9778 9779 // Install callback 9780 overwritten = window[ callbackName ]; 9781 window[ callbackName ] = function() { 9782 responseContainer = arguments; 9783 }; 9784 9785 // Clean-up function (fires after converters) 9786 jqXHR.always( function() { 9787 9788 // If previous value didn't exist - remove it 9789 if ( overwritten === undefined ) { 9790 jQuery( window ).removeProp( callbackName ); 9791 9792 // Otherwise restore preexisting value 9793 } else { 9794 window[ callbackName ] = overwritten; 9795 } 9796 9797 // Save back as free 9798 if ( s[ callbackName ] ) { 9799 9800 // Make sure that re-using the options doesn't screw things around 9801 s.jsonpCallback = originalSettings.jsonpCallback; 9802 9803 // Save the callback name for future use 9804 oldCallbacks.push( callbackName ); 9805 } 9806 9807 // Call if it was a function and we have a response 9808 if ( responseContainer && isFunction( overwritten ) ) { 9809 overwritten( responseContainer[ 0 ] ); 9810 } 9811 9812 responseContainer = overwritten = undefined; 9813 } ); 9814 9815 // Delegate to script 9816 return "script"; 9817 } 9818} ); 9819 9820 9821 9822 9823// Support: Safari 8 only 9824// In Safari 8 documents created via document.implementation.createHTMLDocument 9825// collapse sibling forms: the second one becomes a child of the first one. 9826// Because of that, this security measure has to be disabled in Safari 8. 9827// https://bugs.webkit.org/show_bug.cgi?id=137337 9828support.createHTMLDocument = ( function() { 9829 var body = document.implementation.createHTMLDocument( "" ).body; 9830 body.innerHTML = "<form></form><form></form>"; 9831 return body.childNodes.length === 2; 9832} )(); 9833 9834 9835// Argument "data" should be string of html 9836// context (optional): If specified, the fragment will be created in this context, 9837// defaults to document 9838// keepScripts (optional): If true, will include scripts passed in the html string 9839jQuery.parseHTML = function( data, context, keepScripts ) { 9840 if ( typeof data !== "string" ) { 9841 return []; 9842 } 9843 if ( typeof context === "boolean" ) { 9844 keepScripts = context; 9845 context = false; 9846 } 9847 9848 var base, parsed, scripts; 9849 9850 if ( !context ) { 9851 9852 // Stop scripts or inline event handlers from being executed immediately 9853 // by using document.implementation 9854 if ( support.createHTMLDocument ) { 9855 context = document.implementation.createHTMLDocument( "" ); 9856 9857 // Set the base href for the created document 9858 // so any parsed elements with URLs 9859 // are based on the document's URL (gh-2965) 9860 base = context.createElement( "base" ); 9861 base.href = document.location.href; 9862 context.head.appendChild( base ); 9863 } else { 9864 context = document; 9865 } 9866 } 9867 9868 parsed = rsingleTag.exec( data ); 9869 scripts = !keepScripts && []; 9870 9871 // Single tag 9872 if ( parsed ) { 9873 return [ context.createElement( parsed[ 1 ] ) ]; 9874 } 9875 9876 parsed = buildFragment( [ data ], context, scripts ); 9877 9878 if ( scripts && scripts.length ) {
vendor: 14,511 bytes, lines 9879-10399
9879 jQuery( scripts ).remove(); 9880 } 9881 9882 return jQuery.merge( [], parsed.childNodes ); 9883}; 9884 9885 9886/** 9887 * Load a url into a page 9888 */ 9889jQuery.fn.load = function( url, params, callback ) { 9890 var selector, type, response, 9891 self = this, 9892 off = url.indexOf( " " ); 9893 9894 if ( off > -1 ) { 9895 selector = stripAndCollapse( url.slice( off ) ); 9896 url = url.slice( 0, off ); 9897 } 9898 9899 // If it's a function 9900 if ( isFunction( params ) ) { 9901 9902 // We assume that it's the callback 9903 callback = params; 9904 params = undefined; 9905 9906 // Otherwise, build a param string 9907 } else if ( params && typeof params === "object" ) { 9908 type = "POST"; 9909 } 9910 9911 // If we have elements to modify, make the request 9912 if ( self.length > 0 ) { 9913 jQuery.ajax( { 9914 url: url, 9915 9916 // If "type" variable is undefined, then "GET" method will be used. 9917 // Make value of this field explicit since 9918 // user can override it through ajaxSetup method 9919 type: type || "GET", 9920 dataType: "html", 9921 data: params 9922 } ).done( function( responseText ) { 9923 9924 // Save response for use in complete callback 9925 response = arguments; 9926 9927 self.html( selector ? 9928 9929 // If a selector was specified, locate the right elements in a dummy div 9930 // Exclude scripts to avoid IE 'Permission Denied' errors 9931 jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) : 9932 9933 // Otherwise use the full result 9934 responseText ); 9935 9936 // If the request succeeds, this function gets "data", "status", "jqXHR" 9937 // but they are ignored because response was set above. 9938 // If it fails, this function gets "jqXHR", "status", "error" 9939 } ).always( callback && function( jqXHR, status ) { 9940 self.each( function() { 9941 callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] ); 9942 } ); 9943 } ); 9944 } 9945 9946 return this; 9947}; 9948 9949 9950 9951 9952// Attach a bunch of functions for handling common AJAX events 9953jQuery.each( [ 9954 "ajaxStart", 9955 "ajaxStop", 9956 "ajaxComplete", 9957 "ajaxError", 9958 "ajaxSuccess", 9959 "ajaxSend" 9960], function( i, type ) { 9961 jQuery.fn[ type ] = function( fn ) { 9962 return this.on( type, fn ); 9963 }; 9964} ); 9965 9966 9967 9968 9969jQuery.expr.pseudos.animated = function( elem ) { 9970 return jQuery.grep( jQuery.timers, function( fn ) { 9971 return elem === fn.elem; 9972 } ).length; 9973}; 9974 9975 9976 9977 9978jQuery.offset = { 9979 setOffset: function( elem, options, i ) { 9980 var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition, 9981 position = jQuery.css( elem, "position" ), 9982 curElem = jQuery( elem ), 9983 props = {}; 9984 9985 // Set position first, in-case top/left are set even on static elem 9986 if ( position === "static" ) { 9987 elem.style.position = "relative"; 9988 } 9989 9990 curOffset = curElem.offset(); 9991 curCSSTop = jQuery.css( elem, "top" ); 9992 curCSSLeft = jQuery.css( elem, "left" ); 9993 calculatePosition = ( position === "absolute" || position === "fixed" ) && 9994 ( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1; 9995 9996 // Need to be able to calculate position if either 9997 // top or left is auto and position is either absolute or fixed 9998 if ( calculatePosition ) { 9999 curPosition = curElem.position(); 10000 curTop = curPosition.top; 10001 curLeft = curPosition.left; 10002 10003 } else { 10004 curTop = parseFloat( curCSSTop ) || 0; 10005 curLeft = parseFloat( curCSSLeft ) || 0; 10006 } 10007 10008 if ( isFunction( options ) ) { 10009 10010 // Use jQuery.extend here to allow modification of coordinates argument (gh-1848) 10011 options = options.call( elem, i, jQuery.extend( {}, curOffset ) ); 10012 } 10013 10014 if ( options.top != null ) { 10015 props.top = ( options.top - curOffset.top ) + curTop; 10016 } 10017 if ( options.left != null ) { 10018 props.left = ( options.left - curOffset.left ) + curLeft; 10019 } 10020 10021 if ( "using" in options ) { 10022 options.using.call( elem, props ); 10023 10024 } else { 10025 curElem.css( props ); 10026 } 10027 } 10028}; 10029 10030jQuery.fn.extend( { 10031 10032 // offset() relates an element's border box to the document origin 10033 offset: function( options ) { 10034 10035 // Preserve chaining for setter 10036 if ( arguments.length ) { 10037 return options === undefined ? 10038 this : 10039 this.each( function( i ) { 10040 jQuery.offset.setOffset( this, options, i ); 10041 } ); 10042 } 10043 10044 var rect, win, 10045 elem = this[ 0 ]; 10046 10047 if ( !elem ) { 10048 return; 10049 } 10050 10051 // Return zeros for disconnected and hidden (display: none) elements (gh-2310) 10052 // Support: IE <=11 only 10053 // Running getBoundingClientRect on a 10054 // disconnected node in IE throws an error 10055 if ( !elem.getClientRects().length ) { 10056 return { top: 0, left: 0 }; 10057 } 10058 10059 // Get document-relative position by adding viewport scroll to viewport-relative gBCR 10060 rect = elem.getBoundingClientRect(); 10061 win = elem.ownerDocument.defaultView; 10062 return { 10063 top: rect.top + win.pageYOffset, 10064 left: rect.left + win.pageXOffset 10065 }; 10066 }, 10067 10068 // position() relates an element's margin box to its offset parent's padding box 10069 // This corresponds to the behavior of CSS absolute positioning 10070 position: function() { 10071 if ( !this[ 0 ] ) { 10072 return; 10073 } 10074 10075 var offsetParent, offset, doc, 10076 elem = this[ 0 ], 10077 parentOffset = { top: 0, left: 0 }; 10078 10079 // position:fixed elements are offset from the viewport, which itself always has zero offset 10080 if ( jQuery.css( elem, "position" ) === "fixed" ) { 10081 10082 // Assume position:fixed implies availability of getBoundingClientRect 10083 offset = elem.getBoundingClientRect(); 10084 10085 } else { 10086 offset = this.offset(); 10087 10088 // Account for the *real* offset parent, which can be the document or its root element 10089 // when a statically positioned element is identified 10090 doc = elem.ownerDocument; 10091 offsetParent = elem.offsetParent || doc.documentElement; 10092 while ( offsetParent && 10093 ( offsetParent === doc.body || offsetParent === doc.documentElement ) && 10094 jQuery.css( offsetParent, "position" ) === "static" ) { 10095 10096 offsetParent = offsetParent.parentNode; 10097 } 10098 if ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) { 10099 10100 // Incorporate borders into its offset, since they are outside its content origin 10101 parentOffset = jQuery( offsetParent ).offset(); 10102 parentOffset.top += jQuery.css( offsetParent, "borderTopWidth", true ); 10103 parentOffset.left += jQuery.css( offsetParent, "borderLeftWidth", true ); 10104 } 10105 } 10106 10107 // Subtract parent offsets and element margins 10108 return { 10109 top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ), 10110 left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true ) 10111 }; 10112 }, 10113 10114 // This method will return documentElement in the following cases: 10115 // 1) For the element inside the iframe without offsetParent, this method will return 10116 // documentElement of the parent window 10117 // 2) For the hidden or detached element 10118 // 3) For body or html element, i.e. in case of the html node - it will return itself 10119 // 10120 // but those exceptions were never presented as a real life use-cases 10121 // and might be considered as more preferable results. 10122 // 10123 // This logic, however, is not guaranteed and can change at any point in the future 10124 offsetParent: function() { 10125 return this.map( function() { 10126 var offsetParent = this.offsetParent; 10127 10128 while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) { 10129 offsetParent = offsetParent.offsetParent; 10130 } 10131 10132 return offsetParent || documentElement; 10133 } ); 10134 } 10135} ); 10136 10137// Create scrollLeft and scrollTop methods 10138jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) { 10139 var top = "pageYOffset" === prop; 10140 10141 jQuery.fn[ method ] = function( val ) { 10142 return access( this, function( elem, method, val ) { 10143 10144 // Coalesce documents and windows 10145 var win; 10146 if ( isWindow( elem ) ) { 10147 win = elem; 10148 } else if ( elem.nodeType === 9 ) { 10149 win = elem.defaultView; 10150 } 10151 10152 if ( val === undefined ) { 10153 return win ? win[ prop ] : elem[ method ]; 10154 } 10155 10156 if ( win ) { 10157 win.scrollTo( 10158 !top ? val : win.pageXOffset, 10159 top ? val : win.pageYOffset 10160 ); 10161 10162 } else { 10163 elem[ method ] = val; 10164 } 10165 }, method, val, arguments.length ); 10166 }; 10167} ); 10168 10169// Support: Safari <=7 - 9.1, Chrome <=37 - 49 10170// Add the top/left cssHooks using jQuery.fn.position 10171// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084 10172// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347 10173// getComputedStyle returns percent when specified for top/left/bottom/right; 10174// rather than make the css module depend on the offset module, just check for it here 10175jQuery.each( [ "top", "left" ], function( i, prop ) { 10176 jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition, 10177 function( elem, computed ) { 10178 if ( computed ) { 10179 computed = curCSS( elem, prop ); 10180 10181 // If curCSS returns percentage, fallback to offset 10182 return rnumnonpx.test( computed ) ? 10183 jQuery( elem ).position()[ prop ] + "px" : 10184 computed; 10185 } 10186 } 10187 ); 10188} ); 10189 10190 10191// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods 10192jQuery.each( { Height: "height", Width: "width" }, function( name, type ) { 10193 jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, 10194 function( defaultExtra, funcName ) { 10195 10196 // Margin is only for outerHeight, outerWidth 10197 jQuery.fn[ funcName ] = function( margin, value ) { 10198 var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ), 10199 extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" ); 10200 10201 return access( this, function( elem, type, value ) { 10202 var doc; 10203 10204 if ( isWindow( elem ) ) { 10205 10206 // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729) 10207 return funcName.indexOf( "outer" ) === 0 ? 10208 elem[ "inner" + name ] : 10209 elem.document.documentElement[ "client" + name ]; 10210 } 10211 10212 // Get document width or height 10213 if ( elem.nodeType === 9 ) { 10214 doc = elem.documentElement; 10215 10216 // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], 10217 // whichever is greatest 10218 return Math.max( 10219 elem.body[ "scroll" + name ], doc[ "scroll" + name ], 10220 elem.body[ "offset" + name ], doc[ "offset" + name ], 10221 doc[ "client" + name ] 10222 ); 10223 } 10224 10225 return value === undefined ? 10226 10227 // Get width or height on the element, requesting but not forcing parseFloat 10228 jQuery.css( elem, type, extra ) : 10229 10230 // Set width or height on the element 10231 jQuery.style( elem, type, value, extra ); 10232 }, type, chainable ? margin : undefined, chainable ); 10233 }; 10234 } ); 10235} ); 10236 10237 10238jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " + 10239 "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " + 10240 "change select submit keydown keypress keyup contextmenu" ).split( " " ), 10241 function( i, name ) { 10242 10243 // Handle event binding 10244 jQuery.fn[ name ] = function( data, fn ) { 10245 return arguments.length > 0 ? 10246 this.on( name, null, data, fn ) : 10247 this.trigger( name ); 10248 }; 10249} ); 10250 10251jQuery.fn.extend( { 10252 hover: function( fnOver, fnOut ) { 10253 return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver ); 10254 } 10255} ); 10256 10257 10258 10259 10260jQuery.fn.extend( { 10261 10262 bind: function( types, data, fn ) { 10263 return this.on( types, null, data, fn ); 10264 }, 10265 unbind: function( types, fn ) { 10266 return this.off( types, null, fn ); 10267 }, 10268 10269 delegate: function( selector, types, data, fn ) { 10270 return this.on( types, selector, data, fn ); 10271 }, 10272 undelegate: function( selector, types, fn ) { 10273 10274 // ( namespace ) or ( selector, types [, fn] ) 10275 return arguments.length === 1 ? 10276 this.off( selector, "**" ) : 10277 this.off( types, selector || "**", fn ); 10278 } 10279} ); 10280 10281// Bind a function to a context, optionally partially applying any 10282// arguments. 10283// jQuery.proxy is deprecated to promote standards (specifically Function#bind) 10284// However, it is not slated for removal any time soon 10285jQuery.proxy = function( fn, context ) { 10286 var tmp, args, proxy; 10287 10288 if ( typeof context === "string" ) { 10289 tmp = fn[ context ]; 10290 context = fn; 10291 fn = tmp; 10292 } 10293 10294 // Quick check to determine if target is callable, in the spec 10295 // this throws a TypeError, but we will just return undefined. 10296 if ( !isFunction( fn ) ) { 10297 return undefined; 10298 } 10299 10300 // Simulated bind 10301 args = slice.call( arguments, 2 ); 10302 proxy = function() { 10303 return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); 10304 }; 10305 10306 // Set the guid of unique handler to the same of original handler, so it can be removed 10307 proxy.guid = fn.guid = fn.guid || jQuery.guid++; 10308 10309 return proxy; 10310}; 10311 10312jQuery.holdReady = function( hold ) { 10313 if ( hold ) { 10314 jQuery.readyWait++; 10315 } else { 10316 jQuery.ready( true ); 10317 } 10318}; 10319jQuery.isArray = Array.isArray; 10320jQuery.parseJSON = JSON.parse; 10321jQuery.nodeName = nodeName; 10322jQuery.isFunction = isFunction; 10323jQuery.isWindow = isWindow; 10324jQuery.camelCase = camelCase; 10325jQuery.type = toType; 10326 10327jQuery.now = Date.now; 10328 10329jQuery.isNumeric = function( obj ) { 10330 10331 // As of jQuery 3.0, isNumeric is limited to 10332 // strings and numbers (primitives or objects) 10333 // that can be coerced to finite numbers (gh-2662) 10334 var type = jQuery.type( obj ); 10335 return ( type === "number" || type === "string" ) && 10336 10337 // parseFloat NaNs numeric-cast false positives ("") 10338 // ...but misinterprets leading-number strings, particularly hex literals ("0x...") 10339 // subtraction forces infinities to NaN 10340 !isNaN( obj - parseFloat( obj ) ); 10341}; 10342 10343 10344 10345 10346// Register as a named AMD module, since jQuery can be concatenated with other 10347// files that may use define, but not via a proper concatenation script that 10348// understands anonymous AMD modules. A named AMD is safest and most robust 10349// way to register. Lowercase jquery is used because AMD module names are 10350// derived from file names, and jQuery is normally delivered in a lowercase 10351// file name. Do this after creating the global so that if an AMD module wants 10352// to call noConflict to hide this version of jQuery, it will work. 10353 10354// Note that for maximum portability, libraries that are not jQuery should 10355// declare themselves as anonymous modules, and avoid setting a global if an 10356// AMD loader is present. jQuery is a special case. For more information, see 10357// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon 10358 10359if ( typeof define === "function" && define.amd ) { 10360 define( "jquery", [], function() { 10361 return jQuery; 10362 } ); 10363} 10364 10365 10366 10367 10368var 10369 10370 // Map over jQuery in case of overwrite 10371 _jQuery = window.jQuery, 10372 10373 // Map over the $ in case of overwrite 10374 _$ = window.$; 10375 10376jQuery.noConflict = function( deep ) { 10377 if ( window.$ === jQuery ) { 10378 window.$ = _$; 10379 } 10380 10381 if ( deep && window.jQuery === jQuery ) { 10382 window.jQuery = _jQuery; 10383 } 10384 10385 return jQuery; 10386}; 10387 10388// Expose jQuery and $ identifiers, even in AMD 10389// (#7102#comment:10, https://github.com/jquery/jquery/pull/557) 10390// and CommonJS for browser emulators (#13566) 10391if ( !noGlobal ) { 10392 window.jQuery = window.$ = jQuery; 10393} 10394 10395 10396 10397 10398return jQuery; 10399} );
10400 10401/* 10402 Copyright (C) Federico Zivolo 2018 10403 Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT). 10404 */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}
vendor: 18,627 bytes, line 10404
10404function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll|overlay)/.test(r+s+p)?e:n(o(e))}function r(e){return 11===e?re:10===e?pe:re||pe}function p(e){if(!e)return document.documentElement;for(var o=r(10)?document.body:null,n=e.offsetParent;n===o&&e.nextElementSibling;)n=(e=e.nextElementSibling).offsetParent;var i=n&&n.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(n.nodeName)&&'static'===t(n,'position')?p(n):n:e?e.ownerDocument.documentElement:document.documentElement}function s(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||p(e.firstElementChild)===e)}function d(e){return null===e.parentNode?e:d(e.parentNode)}function a(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,n=o?e:t,i=o?t:e,r=document.createRange();r.setStart(n,0),r.setEnd(i,0);var l=r.commonAncestorContainer;if(e!==l&&t!==l||n.contains(i))return s(l)?l:p(l);var f=d(e);return f.host?a(f.host,t):a(e,d(t).host)}function l(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',n=e.nodeName;if('BODY'===n||'HTML'===n){var i=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||i;return r[o]}return e[o]}function f(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],n=l(t,'top'),i=l(t,'left'),r=o?-1:1;return e.top+=n*r,e.bottom+=n*r,e.left+=i*r,e.right+=i*r,e}function m(e,t){var o='x'===t?'Left':'Top',n='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+n+'Width'],10)}function h(e,t,o,n){return J(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],r(10)?parseInt(o['offset'+e])+parseInt(n['margin'+('Height'===e?'Top':'Left')])+parseInt(n['margin'+('Height'===e?'Bottom':'Right')]):0)}function c(e){var t=e.body,o=e.documentElement,n=r(10)&&getComputedStyle(o);return{height:h('Height',t,o,n),width:h('Width',t,o,n)}}function g(e){return le({},e,{right:e.left+e.width,bottom:e.top+e.height})}function u(e){var o={};try{if(r(10)){o=e.getBoundingClientRect();var n=l(e,'top'),i=l(e,'left');o.top+=n,o.left+=i,o.bottom+=n,o.right+=i}else o=e.getBoundingClientRect()}catch(t){}var p={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},s='HTML'===e.nodeName?c(e.ownerDocument):{},d=s.width||e.clientWidth||p.right-p.left,a=s.height||e.clientHeight||p.bottom-p.top,f=e.offsetWidth-d,h=e.offsetHeight-a;if(f||h){var u=t(e);f-=m(u,'x'),h-=m(u,'y'),p.width-=f,p.height-=h}return g(p)}function b(e,o){var i=2<arguments.length&&void 0!==arguments[2]&&arguments[2],p=r(10),s='HTML'===o.nodeName,d=u(e),a=u(o),l=n(e),m=t(o),h=parseFloat(m.borderTopWidth,10),c=parseFloat(m.borderLeftWidth,10);i&&s&&(a.top=J(a.top,0),a.left=J(a.left,0));var b=g({top:d.top-a.top-h,left:d.left-a.left-c,width:d.width,height:d.height});if(b.marginTop=0,b.marginLeft=0,!p&&s){var y=parseFloat(m.marginTop,10),w=parseFloat(m.marginLeft,10);b.top-=h-y,b.bottom-=h-y,b.left-=c-w,b.right-=c-w,b.marginTop=y,b.marginLeft=w}return(p&&!i?o.contains(l):o===l&&'BODY'!==l.nodeName)&&(b=f(b,o)),b}function y(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=e.ownerDocument.documentElement,n=b(e,o),i=J(o.clientWidth,window.innerWidth||0),r=J(o.clientHeight,window.innerHeight||0),p=t?0:l(o),s=t?0:l(o,'left'),d={top:p-n.top+n.marginTop,left:s-n.left+n.marginLeft,width:i,height:r};return g(d)}function w(e){var n=e.nodeName;return'BODY'===n||'HTML'===n?!1:'fixed'===t(e,'position')||w(o(e))}function E(e){if(!e||!e.parentElement||r())return document.documentElement;for(var o=e.parentElement;o&&'none'===t(o,'transform');)o=o.parentElement;return o||document.documentElement}function v(e,t,i,r){var p=4<arguments.length&&void 0!==arguments[4]&&arguments[4],s={top:0,left:0},d=p?E(e):a(e,t);if('viewport'===r)s=y(d,p);else{var l;'scrollParent'===r?(l=n(o(t)),'BODY'===l.nodeName&&(l=e.ownerDocument.documentElement)):'window'===r?l=e.ownerDocument.documentElement:l=r;var f=b(l,d,p);if('HTML'===l.nodeName&&!w(d)){var m=c(e.ownerDocument),h=m.height,g=m.width;s.top+=f.top-f.marginTop,s.bottom=h+f.top,s.left+=f.left-f.marginLeft,s.right=g+f.left}else s=f}i=i||0;var u='number'==typeof i;return s.left+=u?i:i.left||0,s.top+=u?i:i.top||0,s.right-=u?i:i.right||0,s.bottom-=u?i:i.bottom||0,s}function x(e){var t=e.width,o=e.height;return t*o}function O(e,t,o,n,i){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=v(o,n,r,i),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return le({key:e},s[e],{area:x(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,n=e.height;return t>=o.clientWidth&&n>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function L(e,t,o){var n=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null,i=n?E(t):a(t,o);return b(o,i,n)}function S(e){var t=getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),n=parseFloat(t.marginLeft)+parseFloat(t.marginRight),i={width:e.offsetWidth+n,height:e.offsetHeight+o};return i}function T(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function D(e,t,o){o=o.split('-')[0];var n=S(e),i={width:n.width,height:n.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return i[p]=t[p]+t[d]/2-n[d]/2,i[s]=o===s?t[s]-n[a]:t[T(s)],i}function C(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function N(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var n=C(e,function(e){return e[t]===o});return e.indexOf(n)}function P(t,o,n){var i=void 0===n?t:t.slice(0,N(t,'name',n));return i.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var n=t['function']||t.fn;t.enabled&&e(n)&&(o.offsets.popper=g(o.offsets.popper),o.offsets.reference=g(o.offsets.reference),o=n(o,t))}),o}function k(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=L(this.state,this.popper,this.reference,this.options.positionFixed),e.placement=O(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.positionFixed=this.options.positionFixed,e.offsets.popper=D(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position=this.options.positionFixed?'fixed':'absolute',e=P(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function W(e,t){return e.some(function(e){var o=e.name,n=e.enabled;return n&&o===t})}function H(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function B(){return this.state.isDestroyed=!0,W(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.position='',this.popper.style.top='',this.popper.style.left='',this.popper.style.right='',this.popper.style.bottom='',this.popper.style.willChange='',this.popper.style[H('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function A(e){var t=e.ownerDocument;return t?t.defaultView:window}function M(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||M(n(p.parentNode),t,o,i),i.push(p)}function F(e,t,o,i){o.updateBound=i,A(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return M(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=F(this.reference,this.options,this.state,this.scheduleUpdate))}function R(e,t){return A(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function U(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=R(this.reference,this.state))}function Y(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function j(e,t){Object.keys(t).forEach(function(o){var n='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&Y(t[o])&&(n='px'),e.style[o]=t[o]+n})}function K(e,t){Object.keys(t).forEach(function(o){var n=t[o];!1===n?e.removeAttribute(o):e.setAttribute(o,t[o])})}function q(e,t,o){var n=C(e,function(e){var o=e.name;return o===t}),i=!!n&&e.some(function(e){return e.name===o&&e.enabled&&e.order<n.order});if(!i){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return i}function G(e){return'end'===e?'start':'start'===e?'end':e}function V(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=me.indexOf(e),n=me.slice(o+1).concat(me.slice(0,o));return t?n.reverse():n}function z(e,t,o,n){var i=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+i[1],p=i[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=n;}var d=g(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?J(document.documentElement.clientHeight,window.innerHeight||0):J(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function _(e,t,o,n){var i=[0,0],r=-1!==['right','left'].indexOf(n),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(C(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,n){var i=(1===n?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return z(e,i,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,n){Y(o)&&(i[t]+=o*('-'===e[n-1]?-1:1))})}),i}function X(e,t){var o,n=t.offset,i=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=i.split('-')[0];return o=Y(+n)?[+n,0]:_(n,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}for(var Q=Math.min,Z=Math.round,$=Math.floor,J=Math.max,ee='undefined'!=typeof window&&'undefined'!=typeof document,te=['Edge','Trident','Firefox'],oe=0,ne=0;ne<te.length;ne+=1)if(ee&&0<=navigator.userAgent.indexOf(te[ne])){oe=1;break}var i=ee&&window.Promise,ie=i?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},oe))}},re=ee&&!!(window.MSInputMethodContext&&document.documentMode),pe=ee&&/MSIE 10/.test(navigator.userAgent),se=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},de=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,n){return o&&e(t.prototype,o),n&&e(t,n),t}}(),ae=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},le=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var n in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},fe=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],me=fe.slice(3),he={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},ce=function(){function t(o,n){var i=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};se(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(i.update)},this.update=ie(this.update.bind(this)),this.options=le({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=n&&n.jquery?n[0]:n,this.options.modifiers={},Object.keys(le({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){i.options.modifiers[e]=le({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return le({name:e},i.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(i.reference,i.popper,i.options,t,i.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return de(t,[{key:'update',value:function(){return k.call(this)}},{key:'destroy',value:function(){return B.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return U.call(this)}}]),t}();return ce.Utils=('undefined'==typeof window?global:window).PopperUtils,ce.placements=fe,ce.Defaults={placement:'bottom',positionFixed:!1,eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],n=t.split('-')[1];if(n){var i=e.offsets,r=i.reference,p=i.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:ae({},d,r[d]),end:ae({},d,r[d]+r[a]-p[a])};e.offsets.popper=le({},p,l[n])}return e}},offset:{order:200,enabled:!0,fn:X,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||p(e.instance.popper);e.instance.reference===o&&(o=p(o));var n=H('transform'),i=e.instance.popper.style,r=i.top,s=i.left,d=i[n];i.top='',i.left='',i[n]='';var a=v(e.instance.popper,e.instance.reference,t.padding,o,e.positionFixed);i.top=r,i.left=s,i[n]=d,t.boundaries=a;var l=t.priority,f=e.offsets.popper,m={primary:function(e){var o=f[e];return f[e]<a[e]&&!t.escapeWithReference&&(o=J(f[e],a[e])),ae({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=f[o];return f[e]>a[e]&&!t.escapeWithReference&&(n=Q(f[o],a[e]-('right'===e?f.width:f.height))),ae({},o,n)}};return l.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';f=le({},f,m[t](e))}),e.offsets.popper=f,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,n=t.reference,i=e.placement.split('-')[0],r=$,p=-1!==['top','bottom'].indexOf(i),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(n[d])&&(e.offsets.popper[d]=r(n[d])-o[a]),o[d]>r(n[s])&&(e.offsets.popper[d]=r(n[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var n;if(!q(e.instance.modifiers,'arrow','keepTogether'))return e;var i=o.element;if('string'==typeof i){if(i=e.instance.popper.querySelector(i),!i)return e;}else if(!e.instance.popper.contains(i))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',c=a?'bottom':'right',u=S(i)[l];d[c]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[c]-u)),d[m]+u>s[c]&&(e.offsets.popper[m]+=d[m]+u-s[c]),e.offsets.popper=g(e.offsets.popper);var b=d[m]+d[l]/2-u/2,y=t(e.instance.popper),w=parseFloat(y['margin'+f],10),E=parseFloat(y['border'+f+'Width'],10),v=b-e.offsets.popper[m]-w-E;return v=J(Q(s[l]-u,v),0),e.arrowElement=i,e.offsets.arrow=(n={},ae(n,m,Z(v)),ae(n,h,''),n),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(W(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=v(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement,e.positionFixed),n=e.placement.split('-')[0],i=T(n),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case he.FLIP:p=[n,i];break;case he.CLOCKWISE:p=V(n);break;case he.COUNTERCLOCKWISE:p=V(n,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(n!==s||p.length===d+1)return e;n=e.placement.split('-')[0],i=T(n);var a=e.offsets.popper,l=e.offsets.reference,f=$,m='left'===n&&f(a.right)>f(l.left)||'right'===n&&f(a.left)<f(l.right)||'top'===n&&f(a.bottom)>f(l.top)||'bottom'===n&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===n&&h||'right'===n&&c||'top'===n&&g||'bottom'===n&&u,y=-1!==['top','bottom'].indexOf(n),w=!!t.flipVariations&&(y&&'start'===r&&h||y&&'end'===r&&c||!y&&'start'===r&&g||!y&&'end'===r&&u);(m||b||w)&&(e.flipped=!0,(m||b)&&(n=p[d+1]),w&&(r=G(r)),e.placement=n+(r?'-'+r:''),e.offsets.popper=le({},e.offsets.popper,D(e.instance.popper,e.offsets.reference,e.placement)),e=P(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],n=e.offsets,i=n.popper,r=n.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return i[p?'left':'top']=r[o]-(s?i[p?'width':'height']:0),e.placement=T(t),e.offsets.popper=g(i),e}},hide:{order:800,enabled:!0,fn:function(e){if(!q(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=C(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,n=t.y,i=e.offsets.popper,r=C(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;
10404void 0!==r&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===r?t.gpuAcceleration:r,l=p(e.instance.popper),f=u(l),m={position:i.position},h={left:$(i.left),top:Z(i.top),bottom:Z(i.bottom),right:$(i.right)},c='bottom'===o?'top':'bottom',g='right'===n?'left':'right',b=H('transform');if(d='bottom'==c?'HTML'===l.nodeName?-l.clientHeight+h.bottom:-f.height+h.bottom:h.top,s='right'==g?'HTML'===l.nodeName?-l.clientWidth+h.right:-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[g]=0,m.willChange='transform';else{var y='bottom'==c?-1:1,w='right'==g?-1:1;m[c]=d*y,m[g]=s*w,m.willChange=c+', '+g}var E={"x-placement":e.placement};return e.attributes=le({},E,e.attributes),e.styles=le({},m,e.styles),e.arrowStyles=le({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return j(e.instance.popper,e.styles),K(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&j(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,n,i){var r=L(i,t,e,o.positionFixed),p=O(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),j(t,{position:o.positionFixed?'fixed':'absolute'}),o},gpuAcceleration:void 0}}},ce}); 10405//# sourceMappingURL=popper.min.js.map 10406 10407/** 10408 * -------------------------------------------------------------------------- 10409 * Bootstrap (v4.0.0-alpha.6): index.js 10410 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 10411 * -------------------------------------------------------------------------- 10412 */ 10413(function ($) { 10414 if (typeof $ === 'undefined') { 10415 throw new TypeError('Bootstrap\'s JavaScript requires jQuery. jQuery must be included before Bootstrap\'s JavaScript.'); 10416 } 10417 10418 var version = $.fn.jquery.split(' ')[0].split('.'); 10419 var minMajor = 1; 10420 var ltMajor = 2; 10421 var minMinor = 9; 10422 var minPatch = 1; 10423 var maxMajor = 4; 10424 10425 if (version[0] < ltMajor && version[1] < minMinor || version[0] === minMajor && version[1] === minMinor && version[2] < minPatch || version[0] >= maxMajor) { 10426 throw new Error('Bootstrap\'s JavaScript requires at least jQuery v1.9.1 but less than v4.0.0'); 10427 } 10428})($); 10429//# sourceMappingURL=index.js.map 10430/** 10431 * -------------------------------------------------------------------------- 10432 * Bootstrap (v4.0.0): util.js 10433 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 10434 * -------------------------------------------------------------------------- 10435 */ 10436var Util = function ($) { 10437 /** 10438 * ------------------------------------------------------------------------ 10439 * Private TransitionEnd Helpers 10440 * ------------------------------------------------------------------------ 10441 */ 10442 var transition = false; 10443 var MAX_UID = 1000000; // Shoutout AngusCroll (https://goo.gl/pxwQGp) 10444 10445 function toType(obj) { 10446 return {}.toString.call(obj).match(/\s([a-zA-Z]+)/)[1].toLowerCase(); 10447 } 10448 10449 function getSpecialTransitionEndEvent() { 10450 return { 10451 bindType: transition.end, 10452 delegateType: transition.end, 10453 handle: function handle(event) { 10454 if ($(event.target).is(this)) { 10455 return event.handleObj.handler.apply(this, arguments); // eslint-disable-line prefer-rest-params 10456 } 10457 10458 return undefined; // eslint-disable-line no-undefined 10459 } 10460 }; 10461 } 10462 10463 function transitionEndTest() { 10464 if (typeof window !== 'undefined' && window.QUnit) { 10465 return false; 10466 } 10467 10468 return { 10469 end: 'transitionend' 10470 }; 10471 } 10472 10473 function transitionEndEmulator(duration) { 10474 var _this = this; 10475 10476 var called = false; 10477 $(this).one(Util.TRANSITION_END, function () { 10478 called = true; 10479 }); 10480 setTimeout(function () { 10481 if (!called) { 10482 Util.triggerTransitionEnd(_this); 10483 } 10484 }, duration); 10485 return this; 10486 } 10487 10488 function setTransitionEndSupport() { 10489 transition = transitionEndTest(); 10490 $.fn.emulateTransitionEnd = transitionEndEmulator; 10491 10492 if (Util.supportsTransitionEnd()) { 10493 $.event.special[Util.TRANSITION_END] = getSpecialTransitionEndEvent(); 10494 } 10495 } 10496 10497 function escapeId(selector) { 10498 // We escape IDs in case of special selectors (selector = '#myId:something') 10499 // $.escapeSelector does not exist in jQuery < 3 10500 selector = typeof $.escapeSelector === 'function' ? $.escapeSelector(selector).substr(1) : selector.replace(/(:|\.|\[|\]|,|=|@)/g, '\\$1'); 10501 return selector; 10502 } 10503 /** 10504 * -------------------------------------------------------------------------- 10505 * Public Util Api 10506 * -------------------------------------------------------------------------- 10507 */ 10508 10509 10510 var Util = { 10511 TRANSITION_END: 'bsTransitionEnd', 10512 getUID: function getUID(prefix) { 10513 do { 10514 // eslint-disable-next-line no-bitwise 10515 prefix += ~~(Math.random() * MAX_UID); // "~~" acts like a faster Math.floor() here 10516 } while (document.getElementById(prefix)); 10517 10518 return prefix; 10519 }, 10520 getSelectorFromElement: function getSelectorFromElement(element) { 10521 var selector = element.getAttribute('data-target'); 10522 10523 if (!selector || selector === '#') { 10524 selector = element.getAttribute('href') || ''; 10525 } // If it's an ID 10526 10527 10528 if (selector.charAt(0) === '#') { 10529 selector = escapeId(selector); 10530 } 10531
10532 try { 10533 var $selector = $(document).find(selector); 10534 return $selector.length > 0 ? selector : null; 10535 } catch (err) { 10536 return null; 10537 } 10538 }, 10539 reflow: function reflow(element) { 10540 return element.offsetHeight; 10541 }, 10542 triggerTransitionEnd: function triggerTransitionEnd(element) { 10543 $(element).trigger(transition.end); 10544 }, 10545 supportsTransitionEnd: function supportsTransitionEnd() { 10546 return Boolean(transition); 10547 }, 10548 isElement: function isElement(obj) { 10549 return (obj[0] || obj).nodeType; 10550 }, 10551 typeCheckConfig: function typeCheckConfig(componentName, config, configTypes) { 10552 for (var property in configTypes) { 10553 if (Object.prototype.hasOwnProperty.call(configTypes, property)) { 10554 var expectedTypes = configTypes[property]; 10555 var value = config[property]; 10556 var valueType = value && Util.isElement(value) ? 'element' : toType(value); 10557 10558 if (!new RegExp(expectedTypes).test(valueType)) { 10559 throw new Error(componentName.toUpperCase() + ": " + ("Option \"" + property + "\" provided type \"" + valueType + "\" ") + ("but expected type \"" + expectedTypes + "\".")); 10560 } 10561 } 10562 } 10563 } 10564 }; 10565 setTransitionEndSupport(); 10566 return Util; 10567}($); 10568//# sourceMappingURL=util.js.map 10569function _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); } } 10570 10571function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 10572 10573/** 10574 * -------------------------------------------------------------------------- 10575 * Bootstrap (v4.0.0): button.js 10576 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 10577 * -------------------------------------------------------------------------- 10578 */ 10579var Button = function ($) { 10580 /** 10581 * ------------------------------------------------------------------------ 10582 * Constants 10583 * ------------------------------------------------------------------------ 10584 */ 10585 var NAME = 'button'; 10586 var VERSION = '4.0.0'; 10587 var DATA_KEY = 'bs.button'; 10588 var EVENT_KEY = "." + DATA_KEY; 10589 var DATA_API_KEY = '.data-api'; 10590 var JQUERY_NO_CONFLICT = $.fn[NAME]; 10591 var ClassName = { 10592 ACTIVE: 'active', 10593 BUTTON: 'btn', 10594 FOCUS: 'focus' 10595 }; 10596 var Selector = { 10597 DATA_TOGGLE_CARROT: '[data-toggle^="button"]', 10598 DATA_TOGGLE: '[data-toggle="buttons"]', 10599 INPUT: 'input', 10600 ACTIVE: '.active', 10601 BUTTON: '.btn' 10602 }; 10603 var Event = { 10604 CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, 10605 FOCUS_BLUR_DATA_API: "focus" + EVENT_KEY + DATA_API_KEY + " " + ("blur" + EVENT_KEY + DATA_API_KEY) 10606 /** 10607 * ------------------------------------------------------------------------ 10608 * Class Definition 10609 * ------------------------------------------------------------------------ 10610 */ 10611 10612 }; 10613 10614 var Button = 10615 /*#__PURE__*/ 10616 function () { 10617 function Button(element) { 10618 this._element = element; 10619 } // Getters 10620 10621 10622 var _proto = Button.prototype; 10623 10624 // Public 10625 _proto.toggle = function toggle() { 10626 var triggerChangeEvent = true; 10627 var addAriaPressed = true; 10628 var rootElement = $(this._element).closest(Selector.DATA_TOGGLE)[0]; 10629 10630 if (rootElement) { 10631 var input = $(this._element).find(Selector.INPUT)[0]; 10632 10633 if (input) { 10634 if (input.type === 'radio') { 10635 if (input.checked && $(this._element).hasClass(ClassName.ACTIVE)) { 10636 triggerChangeEvent = false; 10637 } else { 10638 var activeElement = $(rootElement).find(Selector.ACTIVE)[0]; 10639 10640 if (activeElement) { 10641 $(activeElement).removeClass(ClassName.ACTIVE); 10642 } 10643 } 10644 } 10645 10646 if (triggerChangeEvent) { 10647 if (input.hasAttribute('disabled') || rootElement.hasAttribute('disabled') || input.classList.contains('disabled') || rootElement.classList.contains('disabled')) { 10648 return; 10649 } 10650 10651 input.checked = !$(this._element).hasClass(ClassName.ACTIVE); 10652 $(input).trigger('change'); 10653 } 10654 10655 input.focus(); 10656 addAriaPressed = false;
vendor: 4,587 bytes, lines 10657-10801
10657 } 10658 } 10659 10660 if (addAriaPressed) { 10661 this._element.setAttribute('aria-pressed', !$(this._element).hasClass(ClassName.ACTIVE)); 10662 } 10663 10664 if (triggerChangeEvent) { 10665 $(this._element).toggleClass(ClassName.ACTIVE); 10666 } 10667 }; 10668 10669 _proto.dispose = function dispose() { 10670 $.removeData(this._element, DATA_KEY); 10671 this._element = null; 10672 }; // Static 10673 10674 10675 Button._jQueryInterface = function _jQueryInterface(config) { 10676 return this.each(function () { 10677 var data = $(this).data(DATA_KEY); 10678 10679 if (!data) { 10680 data = new Button(this); 10681 $(this).data(DATA_KEY, data); 10682 } 10683 10684 if (config === 'toggle') { 10685 data[config](); 10686 } 10687 }); 10688 }; 10689 10690 _createClass(Button, null, [{ 10691 key: "VERSION", 10692 get: function get() { 10693 return VERSION; 10694 } 10695 }]); 10696 10697 return Button; 10698 }(); 10699 /** 10700 * ------------------------------------------------------------------------ 10701 * Data Api implementation 10702 * ------------------------------------------------------------------------ 10703 */ 10704 10705 10706 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) { 10707 event.preventDefault(); 10708 var button = event.target; 10709 10710 if (!$(button).hasClass(ClassName.BUTTON)) { 10711 button = $(button).closest(Selector.BUTTON); 10712 } 10713 10714 Button._jQueryInterface.call($(button), 'toggle'); 10715 }).on(Event.FOCUS_BLUR_DATA_API, Selector.DATA_TOGGLE_CARROT, function (event) { 10716 var button = $(event.target).closest(Selector.BUTTON)[0]; 10717 $(button).toggleClass(ClassName.FOCUS, /^focus(in)?$/.test(event.type)); 10718 }); 10719 /** 10720 * ------------------------------------------------------------------------ 10721 * jQuery 10722 * ------------------------------------------------------------------------ 10723 */ 10724 10725 $.fn[NAME] = Button._jQueryInterface; 10726 $.fn[NAME].Constructor = Button; 10727 10728 $.fn[NAME].noConflict = function () { 10729 $.fn[NAME] = JQUERY_NO_CONFLICT; 10730 return Button._jQueryInterface; 10731 }; 10732 10733 return Button; 10734}($); 10735//# sourceMappingURL=button.js.map 10736function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 10737 10738function _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); } } 10739 10740function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 10741 10742/** 10743 * -------------------------------------------------------------------------- 10744 * Bootstrap (v4.0.0): collapse.js 10745 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 10746 * -------------------------------------------------------------------------- 10747 */ 10748var Collapse = function ($) { 10749 /** 10750 * ------------------------------------------------------------------------ 10751 * Constants 10752 * ------------------------------------------------------------------------ 10753 */ 10754 var NAME = 'collapse'; 10755 var VERSION = '4.0.0'; 10756 var DATA_KEY = 'bs.collapse'; 10757 var EVENT_KEY = "." + DATA_KEY; 10758 var DATA_API_KEY = '.data-api'; 10759 var JQUERY_NO_CONFLICT = $.fn[NAME]; 10760 var TRANSITION_DURATION = 600; 10761 var Default = { 10762 toggle: true, 10763 parent: '' 10764 }; 10765 var DefaultType = { 10766 toggle: 'boolean', 10767 parent: '(string|element)' 10768 }; 10769 var Event = { 10770 SHOW: "show" + EVENT_KEY, 10771 SHOWN: "shown" + EVENT_KEY, 10772 HIDE: "hide" + EVENT_KEY, 10773 HIDDEN: "hidden" + EVENT_KEY, 10774 CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY 10775 }; 10776 var ClassName = { 10777 SHOW: 'show', 10778 COLLAPSE: 'collapse', 10779 COLLAPSING: 'collapsing', 10780 COLLAPSED: 'collapsed' 10781 }; 10782 var Dimension = { 10783 WIDTH: 'width', 10784 HEIGHT: 'height' 10785 }; 10786 var Selector = { 10787 ACTIVES: '.show, .collapsing', 10788 DATA_TOGGLE: '[data-toggle="collapse"]' 10789 /** 10790 * ------------------------------------------------------------------------ 10791 * Class Definition 10792 * ------------------------------------------------------------------------ 10793 */ 10794 10795 }; 10796 10797 var Collapse = 10798 /*#__PURE__*/ 10799 function () { 10800 function Collapse(element, config) { 10801 this._isTransitioning = false;
10802 this._element = element; 10803 this._config = this._getConfig(config); 10804 this._triggerArray = $.makeArray($("[data-toggle=\"collapse\"][href=\"#" + element.id + "\"]," + ("[data-toggle=\"collapse\"][data-target=\"#" + element.id + "\"]"))); 10805 var tabToggles = $(Selector.DATA_TOGGLE); 10806 10807 for (var i = 0; i < tabToggles.length; i++) { 10808 var elem = tabToggles[i]; 10809 var selector = Util.getSelectorFromElement(elem); 10810 10811 if (selector !== null && $(selector).filter(element).length > 0) { 10812 this._selector = selector; 10813 10814 this._triggerArray.push(elem); 10815 } 10816 } 10817 10818 this._parent = this._config.parent ? this._getParent() : null; 10819 10820 if (!this._config.parent) { 10821 this._addAriaAndCollapsedClass(this._element, this._triggerArray); 10822 } 10823 10824 if (this._config.toggle) { 10825 this.toggle(); 10826 } 10827 } // Getters 10828 10829 10830 var _proto = Collapse.prototype; 10831 10832 // Public 10833 _proto.toggle = function toggle() { 10834 if ($(this._element).hasClass(ClassName.SHOW)) { 10835 this.hide(); 10836 } else { 10837 this.show(); 10838 } 10839 }; 10840 10841 _proto.show = function show() { 10842 var _this = this; 10843 10844 if (this._isTransitioning || $(this._element).hasClass(ClassName.SHOW)) { 10845 return; 10846 } 10847 10848 var actives; 10849 var activesData; 10850 10851 if (this._parent) { 10852 actives = $.makeArray($(this._parent).find(Selector.ACTIVES).filter("[data-parent=\"" + this._config.parent + "\"]")); 10853 10854 if (actives.length === 0) { 10855 actives = null; 10856 } 10857 } 10858 10859 if (actives) { 10860 activesData = $(actives).not(this._selector).data(DATA_KEY); 10861 10862 if (activesData && activesData._isTransitioning) { 10863 return; 10864 } 10865 } 10866 10867 var startEvent = $.Event(Event.SHOW); 10868 $(this._element).trigger(startEvent); 10869 10870 if (startEvent.isDefaultPrevented()) { 10871 return; 10872 } 10873 10874 if (actives) { 10875 Collapse._jQueryInterface.call($(actives).not(this._selector), 'hide'); 10876 10877 if (!activesData) { 10878 $(actives).data(DATA_KEY, null); 10879 } 10880 } 10881 10882 var dimension = this._getDimension(); 10883 10884 $(this._element).removeClass(ClassName.COLLAPSE).addClass(ClassName.COLLAPSING); 10885 this._element.style[dimension] = 0; 10886 10887 if (this._triggerArray.length > 0) { 10888 $(this._triggerArray).removeClass(ClassName.COLLAPSED).attr('aria-expanded', true); 10889 } 10890 10891 this.setTransitioning(true); 10892 10893 var complete = function complete() { 10894 $(_this._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).addClass(ClassName.SHOW); 10895 _this._element.style[dimension] = ''; 10896 10897 _this.setTransitioning(false); 10898 10899 $(_this._element).trigger(Event.SHOWN); 10900 }; 10901 10902 if (!Util.supportsTransitionEnd()) { 10903 complete(); 10904 return; 10905 } 10906 10907 var capitalizedDimension = dimension[0].toUpperCase() + dimension.slice(1); 10908 var scrollSize = "scroll" + capitalizedDimension; 10909 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION); 10910 this._element.style[dimension] = this._element[scrollSize] + "px"; 10911 }; 10912 10913 _proto.hide = function hide() { 10914 var _this2 = this; 10915 10916 if (this._isTransitioning || !$(this._element).hasClass(ClassName.SHOW)) { 10917 return; 10918 } 10919 10920 var startEvent = $.Event(Event.HIDE); 10921 $(this._element).trigger(startEvent); 10922 10923 if (startEvent.isDefaultPrevented()) { 10924 return; 10925 } 10926 10927 var dimension = this._getDimension(); 10928 10929 this._element.style[dimension] = this._element.getBoundingClientRect()[dimension] + "px"; 10930 Util.reflow(this._element); 10931 $(this._element).addClass(ClassName.COLLAPSING).removeClass(ClassName.COLLAPSE).removeClass(ClassName.SHOW); 10932 10933 if (this._triggerArray.length > 0) { 10934 for (var i = 0; i < this._triggerArray.length; i++) { 10935 var trigger = this._triggerArray[i]; 10936 var selector = Util.getSelectorFromElement(trigger); 10937 10938 if (selector !== null) { 10939 var $elem = $(selector); 10940 10941 if (!$elem.hasClass(ClassName.SHOW)) { 10942 $(trigger).addClass(ClassName.COLLAPSED).attr('aria-expanded', false); 10943 } 10944 } 10945 } 10946 } 10947 10948 this.setTransitioning(true); 10949 10950 var complete = function complete() { 10951 _this2.setTransitioning(false); 10952 10953 $(_this2._element).removeClass(ClassName.COLLAPSING).addClass(ClassName.COLLAPSE).trigger(Event.HIDDEN); 10954 }; 10955 10956 this._element.style[dimension] = ''; 10957 10958 if (!Util.supportsTransitionEnd()) { 10959 complete(); 10960 return; 10961 } 10962 10963 $(this._element).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION); 10964 }; 10965 10966 _proto.setTransitioning = function setTransitioning(isTransitioning) { 10967 this._isTransitioning = isTransitioning; 10968 }; 10969 10970 _proto.dispose = function dispose() { 10971 $.removeData(this._element, DATA_KEY); 10972 this._config = null; 10973 this._parent = null; 10974 this._element = null; 10975 this._triggerArray = null; 10976 this._isTransitioning = null; 10977 }; // Private 10978 10979 10980 _proto._getConfig = function _getConfig(config) { 10981 config = _extends({}, Default, config); 10982 config.toggle = Boolean(config.toggle); // Coerce string values 10983 10984 Util.typeCheckConfig(NAME, config, DefaultType); 10985 return config; 10986 }; 10987 10988 _proto._getDimension = function _getDimension() { 10989 var hasWidth = $(this._element).hasClass(Dimension.WIDTH); 10990 return hasWidth ? Dimension.WIDTH : Dimension.HEIGHT; 10991 }; 10992 10993 _proto._getParent = function _getParent() { 10994 var _this3 = this; 10995 10996 var parent = null; 10997 10998 if (Util.isElement(this._config.parent)) { 10999 parent = this._config.parent; // It's a jQuery object 11000 11001 if (typeof this._config.parent.jquery !== 'undefined') { 11002 parent = this._config.parent[0]; 11003 } 11004 } else { 11005 parent = $(this._config.parent)[0]; 11006 } 11007 11008 var selector = "[data-toggle=\"collapse\"][data-parent=\"" + this._config.parent + "\"]"; 11009 $(parent).find(selector).each(function (i, element) { 11010 _this3._addAriaAndCollapsedClass(Collapse._getTargetFromElement(element), [element]); 11011 }); 11012 return parent; 11013 }; 11014 11015 _proto._addAriaAndCollapsedClass = function _addAriaAndCollapsedClass(element, triggerArray) { 11016 if (element) { 11017 var isOpen = $(element).hasClass(ClassName.SHOW); 11018 11019 if (triggerArray.length > 0) { 11020 $(triggerArray).toggleClass(ClassName.COLLAPSED, !isOpen).attr('aria-expanded', isOpen); 11021 } 11022 } 11023 }; // Static 11024 11025 11026 Collapse._getTargetFromElement = function _getTargetFromElement(element) { 11027 var selector = Util.getSelectorFromElement(element); 11028 return selector ? $(selector)[0] : null; 11029 }; 11030 11031 Collapse._jQueryInterface = function _jQueryInterface(config) { 11032 return this.each(function () { 11033 var $this = $(this); 11034 var data = $this.data(DATA_KEY); 11035 11036 var _config = _extends({}, Default, $this.data(), typeof config === 'object' && config); 11037 11038 if (!data && _config.toggle && /show|hide/.test(config)) { 11039 _config.toggle = false;
11040 } 11041 11042 if (!data) { 11043 data = new Collapse(this, _config); 11044 $this.data(DATA_KEY, data); 11045 } 11046 11047 if (typeof config === 'string') { 11048 if (typeof data[config] === 'undefined') { 11049 throw new TypeError("No method named \"" + config + "\""); 11050 } 11051 11052 data[config](); 11053 } 11054 }); 11055 }; 11056 11057 _createClass(Collapse, null, [{ 11058 key: "VERSION", 11059 get: function get() { 11060 return VERSION; 11061 } 11062 }, { 11063 key: "Default", 11064 get: function get() { 11065 return Default; 11066 } 11067 }]); 11068 11069 return Collapse; 11070 }(); 11071 /** 11072 * ------------------------------------------------------------------------ 11073 * Data Api implementation 11074 * ------------------------------------------------------------------------ 11075 */ 11076 11077 11078 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { 11079 // preventDefault only for <a> elements (which change the URL) not inside the collapsible element 11080 if (event.currentTarget.tagName === 'A') { 11081 event.preventDefault(); 11082 } 11083 11084 var $trigger = $(this); 11085 var selector = Util.getSelectorFromElement(this); 11086 $(selector).each(function () { 11087 var $target = $(this); 11088 var data = $target.data(DATA_KEY); 11089 var config = data ? 'toggle' : $trigger.data(); 11090 11091 Collapse._jQueryInterface.call($target, config); 11092 }); 11093 }); 11094 /** 11095 * ------------------------------------------------------------------------ 11096 * jQuery 11097 * ------------------------------------------------------------------------ 11098 */ 11099 11100 $.fn[NAME] = Collapse._jQueryInterface; 11101 $.fn[NAME].Constructor = Collapse; 11102 11103 $.fn[NAME].noConflict = function () { 11104 $.fn[NAME] = JQUERY_NO_CONFLICT; 11105 return Collapse._jQueryInterface; 11106 }; 11107 11108 return Collapse; 11109}($); 11110//# sourceMappingURL=collapse.js.map 11111function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 11112 11113function _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); } } 11114 11115function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 11116 11117/** 11118 * -------------------------------------------------------------------------- 11119 * Bootstrap (v4.0.0): tooltip.js 11120 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 11121 * -------------------------------------------------------------------------- 11122 */ 11123var Tooltip = function ($) { 11124 /** 11125 * ------------------------------------------------------------------------ 11126 * Constants 11127 * ------------------------------------------------------------------------ 11128 */ 11129 var NAME = 'tooltip'; 11130 var VERSION = '4.0.0'; 11131 var DATA_KEY = 'bs.tooltip'; 11132 var EVENT_KEY = "." + DATA_KEY; 11133 var JQUERY_NO_CONFLICT = $.fn[NAME]; 11134 var TRANSITION_DURATION = 150; 11135 var CLASS_PREFIX = 'bs-tooltip'; 11136 var BSCLS_PREFIX_REGEX = new RegExp("(^|\\s)" + CLASS_PREFIX + "\\S+", 'g'); 11137 var DefaultType = { 11138 animation: 'boolean', 11139 template: 'string', 11140 title: '(string|element|function)', 11141 trigger: 'string', 11142 delay: '(number|object)', 11143 html: 'boolean', 11144 selector: '(string|boolean)', 11145 placement: '(string|function)', 11146 offset: '(number|string)', 11147 container: '(string|element|boolean)', 11148 fallbackPlacement: '(string|array)', 11149 boundary: '(string|element)' 11150 }; 11151 var AttachmentMap = { 11152 AUTO: 'auto', 11153 TOP: 'top', 11154 RIGHT: 'right', 11155 BOTTOM: 'bottom', 11156 LEFT: 'left' 11157 }; 11158 var Default = { 11159 animation: true, 11160 template: '<div class="tooltip" role="tooltip">' + '<div class="arrow"></div>' + '<div class="tooltip-inner"></div></div>', 11161 trigger: 'hover focus', 11162 title: '', 11163 delay: 0, 11164 html: false, 11165 selector: false, 11166 placement: 'top', 11167 offset: 0, 11168 container: false, 11169 fallbackPlacement: 'flip', 11170 boundary: 'scrollParent' 11171 }; 11172 var HoverState = { 11173 SHOW: 'show', 11174 OUT: 'out' 11175 }; 11176 var Event = { 11177 HIDE: "hide" + EVENT_KEY, 11178 HIDDEN: "hidden" + EVENT_KEY, 11179 SHOW: "show" + EVENT_KEY, 11180 SHOWN: "shown" + EVENT_KEY, 11181 INSERTED: "inserted" + EVENT_KEY, 11182 CLICK: "click" + EVENT_KEY, 11183 FOCUSIN: "focusin" + EVENT_KEY, 11184 FOCUSOUT: "focusout" + EVENT_KEY, 11185 MOUSEENTER: "mouseenter" + EVENT_KEY, 11186 MOUSELEAVE: "mouseleave" + EVENT_KEY 11187 }; 11188 var ClassName = { 11189 FADE: 'fade', 11190 SHOW: 'show' 11191 }; 11192 var Selector = { 11193 TOOLTIP: '.tooltip', 11194 TOOLTIP_INNER: '.tooltip-inner', 11195 ARROW: '.arrow' 11196 }; 11197 var Trigger = { 11198 HOVER: 'hover', 11199 FOCUS: 'focus', 11200 CLICK: 'click', 11201 MANUAL: 'manual' 11202 /** 11203 * ------------------------------------------------------------------------ 11204 * Class Definition 11205 * ------------------------------------------------------------------------ 11206 */ 11207 11208 }; 11209 11210 var Tooltip = 11211 /*#__PURE__*/ 11212 function () { 11213 function Tooltip(element, config) { 11214 /** 11215 * Check for Popper dependency 11216 * Popper - https://popper.js.org 11217 */ 11218 if (typeof Popper === 'undefined') { 11219 throw new TypeError('Bootstrap tooltips require Popper.js (https://popper.js.org)'); 11220 } // private 11221 11222 11223 this._isEnabled = true; 11224 this._timeout = 0; 11225 this._hoverState = ''; 11226 this._activeTrigger = {}; 11227 this._popper = null; // Protected 11228 11229 this.element = element; 11230 this.config = this._getConfig(config); 11231 this.tip = null; 11232 11233 this._setListeners(); 11234 } // Getters 11235 11236 11237 var _proto = Tooltip.prototype; 11238 11239 // Public 11240 _proto.enable = function enable() { 11241 this._isEnabled = true; 11242 }; 11243 11244 _proto.disable = function disable() { 11245 this._isEnabled = false;
11246 }; 11247 11248 _proto.toggleEnabled = function toggleEnabled() { 11249 this._isEnabled = !this._isEnabled; 11250 }; 11251 11252 _proto.toggle = function toggle(event) { 11253 if (!this._isEnabled) { 11254 return; 11255 } 11256 11257 if (event) { 11258 var dataKey = this.constructor.DATA_KEY; 11259 var context = $(event.currentTarget).data(dataKey); 11260 11261 if (!context) { 11262 context = new this.constructor(event.currentTarget, this._getDelegateConfig()); 11263 $(event.currentTarget).data(dataKey, context); 11264 } 11265 11266 context._activeTrigger.click = !context._activeTrigger.click; 11267 11268 if (context._isWithActiveTrigger()) { 11269 context._enter(null, context); 11270 } else { 11271 context._leave(null, context); 11272 } 11273 } else { 11274 if ($(this.getTipElement()).hasClass(ClassName.SHOW)) { 11275 this._leave(null, this); 11276 11277 return; 11278 } 11279 11280 this._enter(null, this); 11281 } 11282 }; 11283 11284 _proto.dispose = function dispose() { 11285 clearTimeout(this._timeout); 11286 $.removeData(this.element, this.constructor.DATA_KEY); 11287 $(this.element).off(this.constructor.EVENT_KEY); 11288 $(this.element).closest('.modal').off('hide.bs.modal'); 11289 11290 if (this.tip) { 11291 $(this.tip).remove(); 11292 } 11293 11294 this._isEnabled = null; 11295 this._timeout = null; 11296 this._hoverState = null; 11297 this._activeTrigger = null; 11298 11299 if (this._popper !== null) { 11300 this._popper.destroy(); 11301 } 11302 11303 this._popper = null; 11304 this.element = null; 11305 this.config = null; 11306 this.tip = null; 11307 }; 11308 11309 _proto.show = function show() { 11310 var _this = this; 11311 11312 if ($(this.element).css('display') === 'none') { 11313 throw new Error('Please use show on visible elements'); 11314 } 11315 11316 var showEvent = $.Event(this.constructor.Event.SHOW); 11317 11318 if (this.isWithContent() && this._isEnabled) { 11319 $(this.element).trigger(showEvent); 11320 var isInTheDom = $.contains(this.element.ownerDocument.documentElement, this.element); 11321 11322 if (showEvent.isDefaultPrevented() || !isInTheDom) { 11323 return; 11324 } 11325 11326 var tip = this.getTipElement(); 11327 var tipId = Util.getUID(this.constructor.NAME);
11328 tip.setAttribute('id', tipId); 11329 this.element.setAttribute('aria-describedby', tipId); 11330 this.setContent(); 11331 11332 if (this.config.animation) { 11333 $(tip).addClass(ClassName.FADE); 11334 } 11335 11336 var placement = typeof this.config.placement === 'function' ? this.config.placement.call(this, tip, this.element) : this.config.placement; 11337 11338 var attachment = this._getAttachment(placement); 11339 11340 this.addAttachmentClass(attachment); 11341 var container = this.config.container === false ? document.body : $(this.config.container); 11342 $(tip).data(this.constructor.DATA_KEY, this); 11343 11344 if (!$.contains(this.element.ownerDocument.documentElement, this.tip)) { 11345 $(tip).appendTo(container); 11346 } 11347 11348 $(this.element).trigger(this.constructor.Event.INSERTED); 11349 this._popper = new Popper(this.element, tip, { 11350 placement: attachment, 11351 modifiers: { 11352 offset: { 11353 offset: this.config.offset 11354 }, 11355 flip: { 11356 behavior: this.config.fallbackPlacement 11357 }, 11358 arrow: { 11359 element: Selector.ARROW 11360 }, 11361 preventOverflow: { 11362 boundariesElement: this.config.boundary 11363 } 11364 }, 11365 onCreate: function onCreate(data) { 11366 if (data.originalPlacement !== data.placement) { 11367 _this._handlePopperPlacementChange(data); 11368 } 11369 }, 11370 onUpdate: function onUpdate(data) { 11371 _this._handlePopperPlacementChange(data); 11372 } 11373 }); 11374 $(tip).addClass(ClassName.SHOW); // If this is a touch-enabled device we add extra 11375 // empty mouseover listeners to the body's immediate children; 11376 // only needed because of broken event delegation on iOS 11377 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 11378 11379 if ('ontouchstart' in document.documentElement) { 11380 $('body').children().on('mouseover', null, $.noop); 11381 } 11382 11383 var complete = function complete() { 11384 if (_this.config.animation) { 11385 _this._fixTransition(); 11386 } 11387 11388 var prevHoverState = _this._hoverState; 11389 _this._hoverState = null; 11390 $(_this.element).trigger(_this.constructor.Event.SHOWN); 11391 11392 if (prevHoverState === HoverState.OUT) { 11393 _this._leave(null, _this); 11394 } 11395 }; 11396 11397 if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) { 11398 $(this.tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(Tooltip._TRANSITION_DURATION); 11399 } else { 11400 complete(); 11401 } 11402 } 11403 }; 11404 11405 _proto.hide = function hide(callback) { 11406 var _this2 = this; 11407 11408 var tip = this.getTipElement(); 11409 var hideEvent = $.Event(this.constructor.Event.HIDE); 11410 11411 var complete = function complete() { 11412 if (_this2._hoverState !== HoverState.SHOW && tip.parentNode) { 11413 tip.parentNode.removeChild(tip); 11414 } 11415 11416 _this2._cleanTipClass(); 11417 11418 _this2.element.removeAttribute('aria-describedby'); 11419 11420 $(_this2.element).trigger(_this2.constructor.Event.HIDDEN); 11421 11422 if (_this2._popper !== null) { 11423 _this2._popper.destroy(); 11424 } 11425 11426 if (callback) { 11427 callback(); 11428 } 11429 }; 11430 11431 $(this.element).trigger(hideEvent); 11432 11433 if (hideEvent.isDefaultPrevented()) { 11434 return; 11435 } 11436 11437 $(tip).removeClass(ClassName.SHOW); // If this is a touch-enabled device we remove the extra 11438 // empty mouseover listeners we added for iOS support 11439 11440 if ('ontouchstart' in document.documentElement) { 11441 $('body').children().off('mouseover', null, $.noop); 11442 } 11443 11444 this._activeTrigger[Trigger.CLICK] = false; 11445 this._activeTrigger[Trigger.FOCUS] = false; 11446 this._activeTrigger[Trigger.HOVER] = false; 11447 11448 if (Util.supportsTransitionEnd() && $(this.tip).hasClass(ClassName.FADE)) { 11449 $(tip).one(Util.TRANSITION_END, complete).emulateTransitionEnd(TRANSITION_DURATION); 11450 } else { 11451 complete(); 11452 } 11453 11454 this._hoverState = ''; 11455 }; 11456
11457 _proto.update = function update() { 11458 if (this._popper !== null) { 11459 this._popper.scheduleUpdate(); 11460 } 11461 }; // Protected 11462 11463 11464 _proto.isWithContent = function isWithContent() { 11465 return Boolean(this.getTitle()); 11466 }; 11467 11468 _proto.addAttachmentClass = function addAttachmentClass(attachment) { 11469 $(this.getTipElement()).addClass(CLASS_PREFIX + "-" + attachment); 11470 }; 11471 11472 _proto.getTipElement = function getTipElement() { 11473 this.tip = this.tip || $(this.config.template)[0]; 11474 return this.tip; 11475 }; 11476 11477 _proto.setContent = function setContent() { 11478 var $tip = $(this.getTipElement()); 11479 this.setElementContent($tip.find(Selector.TOOLTIP_INNER), this.getTitle()); 11480 $tip.removeClass(ClassName.FADE + " " + ClassName.SHOW); 11481 }; 11482 11483 _proto.setElementContent = function setElementContent($element, content) { 11484 var html = this.config.html; 11485 11486 if (typeof content === 'object' && (content.nodeType || content.jquery)) { 11487 // Content is a DOM node or a jQuery 11488 if (html) { 11489 if (!$(content).parent().is($element)) { 11490 $element.empty().append(content); 11491 } 11492 } else { 11493 $element.text($(content).text()); 11494 } 11495 } else { 11496 $element[html ? 'html' : 'text'](content); 11497 } 11498 }; 11499 11500 _proto.getTitle = function getTitle() { 11501 var title = this.element.getAttribute('data-original-title'); 11502 11503 if (!title) { 11504 title = typeof this.config.title === 'function' ? this.config.title.call(this.element) : this.config.title; 11505 } 11506 11507 return title; 11508 }; // Private 11509 11510 11511 _proto._getAttachment = function _getAttachment(placement) { 11512 return AttachmentMap[placement.toUpperCase()]; 11513 }; 11514 11515 _proto._setListeners = function _setListeners() { 11516 var _this3 = this; 11517 11518 var triggers = this.config.trigger.split(' '); 11519 triggers.forEach(function (trigger) { 11520 if (trigger === 'click') { 11521 $(_this3.element).on(_this3.constructor.Event.CLICK, _this3.config.selector, function (event) { 11522 return _this3.toggle(event); 11523 }); 11524 } else if (trigger !== Trigger.MANUAL) { 11525 var eventIn = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSEENTER : _this3.constructor.Event.FOCUSIN; 11526 var eventOut = trigger === Trigger.HOVER ? _this3.constructor.Event.MOUSELEAVE : _this3.constructor.Event.FOCUSOUT; 11527 $(_this3.element).on(eventIn, _this3.config.selector, function (event) { 11528 return _this3._enter(event); 11529 }).on(eventOut, _this3.config.selector, function (event) { 11530 return _this3._leave(event); 11531 }); 11532 } 11533 11534 $(_this3.element).closest('.modal').on('hide.bs.modal', function () { 11535 return _this3.hide(); 11536 }); 11537 }); 11538 11539 if (this.config.selector) { 11540 this.config = _extends({}, this.config, { 11541 trigger: 'manual', 11542 selector: '' 11543 }); 11544 } else { 11545 this._fixTitle(); 11546 } 11547 }; 11548 11549 _proto._fixTitle = function _fixTitle() { 11550 var titleType = typeof this.element.getAttribute('data-original-title'); 11551 11552 if (this.element.getAttribute('title') || titleType !== 'string') { 11553 this.element.setAttribute('data-original-title', this.element.getAttribute('title') || ''); 11554 this.element.setAttribute('title', ''); 11555 } 11556 }; 11557 11558 _proto._enter = function _enter(event, context) { 11559 var dataKey = this.constructor.DATA_KEY; 11560 context = context || $(event.currentTarget).data(dataKey); 11561 11562 if (!context) { 11563 context = new this.constructor(event.currentTarget, this._getDelegateConfig()); 11564 $(event.currentTarget).data(dataKey, context); 11565 } 11566 11567 if (event) { 11568 context._activeTrigger[event.type === 'focusin' ? Trigger.FOCUS : Trigger.HOVER] = true; 11569 } 11570 11571 if ($(context.getTipElement()).hasClass(ClassName.SHOW) || context._hoverState === HoverState.SHOW) { 11572 context._hoverState = HoverState.SHOW; 11573 return; 11574 } 11575 11576 clearTimeout(context._timeout); 11577 context._hoverState = HoverState.SHOW; 11578 11579 if (!context.config.delay || !context.config.delay.show) { 11580 context.show(); 11581 return; 11582 } 11583 11584 context._timeout = setTimeout(function () { 11585 if (context._hoverState === HoverState.SHOW) { 11586 context.show(); 11587 } 11588 }, context.config.delay.show); 11589 }; 11590 11591 _proto._leave = function _leave(event, context) { 11592 var dataKey = this.constructor.DATA_KEY; 11593 context = context || $(event.currentTarget).data(dataKey); 11594 11595 if (!context) { 11596 context = new this.constructor(event.currentTarget, this._getDelegateConfig()); 11597 $(event.currentTarget).data(dataKey, context); 11598 } 11599 11600 if (event) { 11601 context._activeTrigger[event.type === 'focusout' ? Trigger.FOCUS : Trigger.HOVER] = false;
vendor: 8,286 bytes, lines 11602-11889
11602 } 11603 11604 if (context._isWithActiveTrigger()) { 11605 return; 11606 } 11607 11608 clearTimeout(context._timeout); 11609 context._hoverState = HoverState.OUT; 11610 11611 if (!context.config.delay || !context.config.delay.hide) { 11612 context.hide(); 11613 return; 11614 } 11615 11616 context._timeout = setTimeout(function () { 11617 if (context._hoverState === HoverState.OUT) { 11618 context.hide(); 11619 } 11620 }, context.config.delay.hide); 11621 }; 11622 11623 _proto._isWithActiveTrigger = function _isWithActiveTrigger() { 11624 for (var trigger in this._activeTrigger) { 11625 if (this._activeTrigger[trigger]) { 11626 return true; 11627 } 11628 } 11629 11630 return false; 11631 }; 11632 11633 _proto._getConfig = function _getConfig(config) { 11634 config = _extends({}, this.constructor.Default, $(this.element).data(), config); 11635 11636 if (typeof config.delay === 'number') { 11637 config.delay = { 11638 show: config.delay, 11639 hide: config.delay 11640 }; 11641 } 11642 11643 if (typeof config.title === 'number') { 11644 config.title = config.title.toString(); 11645 } 11646 11647 if (typeof config.content === 'number') { 11648 config.content = config.content.toString(); 11649 } 11650 11651 Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); 11652 return config; 11653 }; 11654 11655 _proto._getDelegateConfig = function _getDelegateConfig() { 11656 var config = {}; 11657 11658 if (this.config) { 11659 for (var key in this.config) { 11660 if (this.constructor.Default[key] !== this.config[key]) { 11661 config[key] = this.config[key]; 11662 } 11663 } 11664 } 11665 11666 return config; 11667 }; 11668 11669 _proto._cleanTipClass = function _cleanTipClass() { 11670 var $tip = $(this.getTipElement()); 11671 var tabClass = $tip.attr('class').match(BSCLS_PREFIX_REGEX); 11672 11673 if (tabClass !== null && tabClass.length > 0) { 11674 $tip.removeClass(tabClass.join('')); 11675 } 11676 }; 11677 11678 _proto._handlePopperPlacementChange = function _handlePopperPlacementChange(data) { 11679 this._cleanTipClass(); 11680 11681 this.addAttachmentClass(this._getAttachment(data.placement)); 11682 }; 11683 11684 _proto._fixTransition = function _fixTransition() { 11685 var tip = this.getTipElement(); 11686 var initConfigAnimation = this.config.animation; 11687 11688 if (tip.getAttribute('x-placement') !== null) { 11689 return; 11690 } 11691 11692 $(tip).removeClass(ClassName.FADE); 11693 this.config.animation = false; 11694 this.hide(); 11695 this.show(); 11696 this.config.animation = initConfigAnimation; 11697 }; // Static 11698 11699 11700 Tooltip._jQueryInterface = function _jQueryInterface(config) { 11701 return this.each(function () { 11702 var data = $(this).data(DATA_KEY); 11703 11704 var _config = typeof config === 'object' && config; 11705 11706 if (!data && /dispose|hide/.test(config)) { 11707 return; 11708 } 11709 11710 if (!data) { 11711 data = new Tooltip(this, _config); 11712 $(this).data(DATA_KEY, data); 11713 } 11714 11715 if (typeof config === 'string') { 11716 if (typeof data[config] === 'undefined') { 11717 throw new TypeError("No method named \"" + config + "\""); 11718 } 11719 11720 data[config](); 11721 } 11722 }); 11723 }; 11724 11725 _createClass(Tooltip, null, [{ 11726 key: "VERSION", 11727 get: function get() { 11728 return VERSION; 11729 } 11730 }, { 11731 key: "Default", 11732 get: function get() { 11733 return Default; 11734 } 11735 }, { 11736 key: "NAME", 11737 get: function get() { 11738 return NAME; 11739 } 11740 }, { 11741 key: "DATA_KEY", 11742 get: function get() { 11743 return DATA_KEY; 11744 } 11745 }, { 11746 key: "Event", 11747 get: function get() { 11748 return Event; 11749 } 11750 }, { 11751 key: "EVENT_KEY", 11752 get: function get() { 11753 return EVENT_KEY; 11754 } 11755 }, { 11756 key: "DefaultType", 11757 get: function get() { 11758 return DefaultType; 11759 } 11760 }]); 11761 11762 return Tooltip; 11763 }(); 11764 /** 11765 * ------------------------------------------------------------------------ 11766 * jQuery 11767 * ------------------------------------------------------------------------ 11768 */ 11769 11770 11771 $.fn[NAME] = Tooltip._jQueryInterface; 11772 $.fn[NAME].Constructor = Tooltip; 11773 11774 $.fn[NAME].noConflict = function () { 11775 $.fn[NAME] = JQUERY_NO_CONFLICT; 11776 return Tooltip._jQueryInterface; 11777 }; 11778 11779 return Tooltip; 11780}($, Popper); 11781//# sourceMappingURL=tooltip.js.map 11782function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 11783 11784function _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); } } 11785 11786function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 11787 11788/** 11789 * -------------------------------------------------------------------------- 11790 * Bootstrap (v4.0.0): dropdown.js 11791 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 11792 * -------------------------------------------------------------------------- 11793 */ 11794var Dropdown = function ($) { 11795 /** 11796 * ------------------------------------------------------------------------ 11797 * Constants 11798 * ------------------------------------------------------------------------ 11799 */ 11800 var NAME = 'dropdown'; 11801 var VERSION = '4.0.0'; 11802 var DATA_KEY = 'bs.dropdown'; 11803 var EVENT_KEY = "." + DATA_KEY; 11804 var DATA_API_KEY = '.data-api'; 11805 var JQUERY_NO_CONFLICT = $.fn[NAME]; 11806 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key 11807 11808 var SPACE_KEYCODE = 32; // KeyboardEvent.which value for space key 11809 11810 var TAB_KEYCODE = 9; // KeyboardEvent.which value for tab key 11811 11812 var ARROW_UP_KEYCODE = 38; // KeyboardEvent.which value for up arrow key 11813 11814 var ARROW_DOWN_KEYCODE = 40; // KeyboardEvent.which value for down arrow key 11815 11816 var RIGHT_MOUSE_BUTTON_WHICH = 3; // MouseEvent.which value for the right button (assuming a right-handed mouse) 11817 11818 var REGEXP_KEYDOWN = new RegExp(ARROW_UP_KEYCODE + "|" + ARROW_DOWN_KEYCODE + "|" + ESCAPE_KEYCODE); 11819 var Event = { 11820 HIDE: "hide" + EVENT_KEY, 11821 HIDDEN: "hidden" + EVENT_KEY, 11822 SHOW: "show" + EVENT_KEY, 11823 SHOWN: "shown" + EVENT_KEY, 11824 CLICK: "click" + EVENT_KEY, 11825 CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY, 11826 KEYDOWN_DATA_API: "keydown" + EVENT_KEY + DATA_API_KEY, 11827 KEYUP_DATA_API: "keyup" + EVENT_KEY + DATA_API_KEY 11828 }; 11829 var ClassName = { 11830 DISABLED: 'disabled', 11831 SHOW: 'show', 11832 DROPUP: 'dropup', 11833 DROPRIGHT: 'dropright', 11834 DROPLEFT: 'dropleft', 11835 MENURIGHT: 'dropdown-menu-right', 11836 MENULEFT: 'dropdown-menu-left', 11837 POSITION_STATIC: 'position-static' 11838 }; 11839 var Selector = { 11840 DATA_TOGGLE: '[data-toggle="dropdown"]', 11841 FORM_CHILD: '.dropdown form', 11842 MENU: '.dropdown-menu', 11843 NAVBAR_NAV: '.navbar-nav', 11844 VISIBLE_ITEMS: '.dropdown-menu .dropdown-item:not(.disabled)' 11845 }; 11846 var AttachmentMap = { 11847 TOP: 'top-start', 11848 TOPEND: 'top-end', 11849 BOTTOM: 'bottom-start', 11850 BOTTOMEND: 'bottom-end', 11851 RIGHT: 'right-start', 11852 RIGHTEND: 'right-end', 11853 LEFT: 'left-start', 11854 LEFTEND: 'left-end' 11855 }; 11856 var Default = { 11857 offset: 0, 11858 flip: true, 11859 boundary: 'scrollParent' 11860 }; 11861 var DefaultType = { 11862 offset: '(number|string|function)', 11863 flip: 'boolean', 11864 boundary: '(string|element)' 11865 /** 11866 * ------------------------------------------------------------------------ 11867 * Class Definition 11868 * ------------------------------------------------------------------------ 11869 */ 11870 11871 }; 11872 11873 var Dropdown = 11874 /*#__PURE__*/ 11875 function () { 11876 function Dropdown(element, config) { 11877 this._element = element; 11878 this._popper = null; 11879 this._config = this._getConfig(config); 11880 this._menu = this._getMenuElement(); 11881 this._inNavbar = this._detectNavbar(); 11882 11883 this._addEventListeners(); 11884 } // Getters 11885 11886 11887 var _proto = Dropdown.prototype; 11888 11889 // Public
11890 _proto.toggle = function toggle() { 11891 if (this._element.disabled || $(this._element).hasClass(ClassName.DISABLED)) { 11892 return; 11893 } 11894 11895 var parent = Dropdown._getParentFromElement(this._element); 11896 11897 var isActive = $(this._menu).hasClass(ClassName.SHOW); 11898 11899 Dropdown._clearMenus(); 11900 11901 if (isActive) { 11902 return; 11903 } 11904 11905 var relatedTarget = { 11906 relatedTarget: this._element 11907 }; 11908 var showEvent = $.Event(Event.SHOW, relatedTarget); 11909 $(parent).trigger(showEvent); 11910 11911 if (showEvent.isDefaultPrevented()) { 11912 return; 11913 } // Disable totally Popper.js for Dropdown in Navbar 11914 11915 11916 if (!this._inNavbar) { 11917 /** 11918 * Check for Popper dependency 11919 * Popper - https://popper.js.org 11920 */ 11921 if (typeof Popper === 'undefined') { 11922 throw new TypeError('Bootstrap dropdown require Popper.js (https://popper.js.org)'); 11923 } 11924 11925 var element = this._element; // For dropup with alignment we use the parent as popper container 11926 11927 if ($(parent).hasClass(ClassName.DROPUP)) { 11928 if ($(this._menu).hasClass(ClassName.MENULEFT) || $(this._menu).hasClass(ClassName.MENURIGHT)) { 11929 element = parent; 11930 } 11931 } // If boundary is not `scrollParent`, then set position to `static` 11932 // to allow the menu to "escape" the scroll parent's boundaries 11933 // https://github.com/twbs/bootstrap/issues/24251 11934 11935 11936 if (this._config.boundary !== 'scrollParent') { 11937 $(parent).addClass(ClassName.POSITION_STATIC); 11938 } 11939 11940 this._popper = new Popper(element, this._menu, this._getPopperConfig()); 11941 } // If this is a touch-enabled device we add extra 11942 // empty mouseover listeners to the body's immediate children; 11943 // only needed because of broken event delegation on iOS 11944 // https://www.quirksmode.org/blog/archives/2014/02/mouse_event_bub.html 11945 11946 11947 if ('ontouchstart' in document.documentElement && $(parent).closest(Selector.NAVBAR_NAV).length === 0) { 11948 $('body').children().on('mouseover', null, $.noop); 11949 } 11950 11951 this._element.focus(); 11952 11953 this._element.setAttribute('aria-expanded', true); 11954 11955 $(this._menu).toggleClass(ClassName.SHOW); 11956 $(parent).toggleClass(ClassName.SHOW).trigger($.Event(Event.SHOWN, relatedTarget)); 11957 }; 11958 11959 _proto.dispose = function dispose() { 11960 $.removeData(this._element, DATA_KEY); 11961 $(this._element).off(EVENT_KEY); 11962 this._element = null; 11963 this._menu = null; 11964 11965 if (this._popper !== null) { 11966 this._popper.destroy(); 11967 11968 this._popper = null; 11969 } 11970 }; 11971 11972 _proto.update = function update() { 11973 this._inNavbar = this._detectNavbar(); 11974 11975 if (this._popper !== null) { 11976 this._popper.scheduleUpdate(); 11977 } 11978 }; // Private 11979 11980 11981 _proto._addEventListeners = function _addEventListeners() { 11982 var _this = this; 11983 11984 $(this._element).on(Event.CLICK, function (event) { 11985 event.preventDefault(); 11986 event.stopPropagation(); 11987 11988 _this.toggle(); 11989 }); 11990 }; 11991 11992 _proto._getConfig = function _getConfig(config) { 11993 config = _extends({}, this.constructor.Default, $(this._element).data(), config); 11994 Util.typeCheckConfig(NAME, config, this.constructor.DefaultType); 11995 return config; 11996 }; 11997 11998 _proto._getMenuElement = function _getMenuElement() { 11999 if (!this._menu) { 12000 var parent = Dropdown._getParentFromElement(this._element); 12001 12002 this._menu = $(parent).find(Selector.MENU)[0]; 12003 } 12004 12005 return this._menu; 12006 }; 12007 12008 _proto._getPlacement = function _getPlacement() { 12009 var $parentDropdown = $(this._element).parent(); 12010 var placement = AttachmentMap.BOTTOM; // Handle dropup 12011 12012 if ($parentDropdown.hasClass(ClassName.DROPUP)) { 12013 placement = AttachmentMap.TOP; 12014 12015 if ($(this._menu).hasClass(ClassName.MENURIGHT)) { 12016 placement = AttachmentMap.TOPEND; 12017 } 12018 } else if ($parentDropdown.hasClass(ClassName.DROPRIGHT)) { 12019 placement = AttachmentMap.RIGHT; 12020 } else if ($parentDropdown.hasClass(ClassName.DROPLEFT)) { 12021 placement = AttachmentMap.LEFT; 12022 } else if ($(this._menu).hasClass(ClassName.MENURIGHT)) { 12023 placement = AttachmentMap.BOTTOMEND; 12024 } 12025 12026 return placement; 12027 }; 12028 12029 _proto._detectNavbar = function _detectNavbar() { 12030 return $(this._element).closest('.navbar').length > 0; 12031 }; 12032 12033 _proto._getPopperConfig = function _getPopperConfig() { 12034 var _this2 = this; 12035 12036 var offsetConf = {}; 12037 12038 if (typeof this._config.offset === 'function') { 12039 offsetConf.fn = function (data) { 12040 data.offsets = _extends({}, data.offsets, _this2._config.offset(data.offsets) || {}); 12041 return data; 12042 }; 12043 } else { 12044 offsetConf.offset = this._config.offset; 12045 } 12046 12047 var popperConfig = { 12048 placement: this._getPlacement(), 12049 modifiers: { 12050 offset: offsetConf, 12051 flip: { 12052 enabled: this._config.flip 12053 }, 12054 preventOverflow: {
12055 boundariesElement: this._config.boundary 12056 } 12057 } 12058 }; 12059 return popperConfig; 12060 }; // Static 12061 12062 12063 Dropdown._jQueryInterface = function _jQueryInterface(config) { 12064 return this.each(function () { 12065 var data = $(this).data(DATA_KEY); 12066 12067 var _config = typeof config === 'object' ? config : null; 12068 12069 if (!data) { 12070 data = new Dropdown(this, _config); 12071 $(this).data(DATA_KEY, data); 12072 } 12073 12074 if (typeof config === 'string') { 12075 if (typeof data[config] === 'undefined') { 12076 throw new TypeError("No method named \"" + config + "\""); 12077 } 12078 12079 data[config](); 12080 } 12081 }); 12082 }; 12083 12084 Dropdown._clearMenus = function _clearMenus(event) { 12085 if (event && (event.which === RIGHT_MOUSE_BUTTON_WHICH || event.type === 'keyup' && event.which !== TAB_KEYCODE)) { 12086 return; 12087 } 12088 12089 var toggles = $.makeArray($(Selector.DATA_TOGGLE)); 12090 12091 for (var i = 0; i < toggles.length; i++) { 12092 var parent = Dropdown._getParentFromElement(toggles[i]); 12093 12094 var context = $(toggles[i]).data(DATA_KEY); 12095 var relatedTarget = { 12096 relatedTarget: toggles[i] 12097 }; 12098 12099 if (!context) { 12100 continue; 12101 } 12102 12103 var dropdownMenu = context._menu; 12104 12105 if (!$(parent).hasClass(ClassName.SHOW)) { 12106 continue; 12107 } 12108 12109 if (event && (event.type === 'click' && /input|textarea/i.test(event.target.tagName) || event.type === 'keyup' && event.which === TAB_KEYCODE) && $.contains(parent, event.target)) { 12110 continue; 12111 } 12112 12113 var hideEvent = $.Event(Event.HIDE, relatedTarget); 12114 $(parent).trigger(hideEvent); 12115 12116 if (hideEvent.isDefaultPrevented()) { 12117 continue; 12118 } // If this is a touch-enabled device we remove the extra 12119 // empty mouseover listeners we added for iOS support 12120 12121 12122 if ('ontouchstart' in document.documentElement) { 12123 $('body').children().off('mouseover', null, $.noop); 12124 } 12125 12126 toggles[i].setAttribute('aria-expanded', 'false'); 12127 $(dropdownMenu).removeClass(ClassName.SHOW); 12128 $(parent).removeClass(ClassName.SHOW).trigger($.Event(Event.HIDDEN, relatedTarget)); 12129 } 12130 }; 12131 12132 Dropdown._getParentFromElement = function _getParentFromElement(element) { 12133 var parent; 12134 var selector = Util.getSelectorFromElement(element); 12135 12136 if (selector) { 12137 parent = $(selector)[0]; 12138 } 12139 12140 return parent || element.parentNode; 12141 }; // eslint-disable-next-line complexity 12142 12143 12144 Dropdown._dataApiKeydownHandler = function _dataApiKeydownHandler(event) { 12145 // If not input/textarea: 12146 // - And not a key in REGEXP_KEYDOWN => not a dropdown command 12147 // If input/textarea: 12148 // - If space key => not a dropdown command 12149 // - If key is other than escape 12150 // - If key is not up or down => not a dropdown command 12151 // - If trigger inside the menu => not a dropdown command 12152 if (/input|textarea/i.test(event.target.tagName) ? event.which === SPACE_KEYCODE || event.which !== ESCAPE_KEYCODE && (event.which !== ARROW_DOWN_KEYCODE && event.which !== ARROW_UP_KEYCODE || $(event.target).closest(Selector.MENU).length) : !REGEXP_KEYDOWN.test(event.which)) { 12153 return; 12154 } 12155 12156 event.preventDefault(); 12157 event.stopPropagation(); 12158 12159 if (this.disabled || $(this).hasClass(ClassName.DISABLED)) { 12160 return; 12161 } 12162 12163 var parent = Dropdown._getParentFromElement(this); 12164 12165 var isActive = $(parent).hasClass(ClassName.SHOW); 12166 12167 if (!isActive && (event.which !== ESCAPE_KEYCODE || event.which !== SPACE_KEYCODE) || isActive && (event.which === ESCAPE_KEYCODE || event.which === SPACE_KEYCODE)) { 12168 if (event.which === ESCAPE_KEYCODE) { 12169 var toggle = $(parent).find(Selector.DATA_TOGGLE)[0]; 12170 $(toggle).trigger('focus'); 12171 } 12172 12173 $(this).trigger('click'); 12174 return; 12175 } 12176 12177 var items = $(parent).find(Selector.VISIBLE_ITEMS).get(); 12178 12179 if (items.length === 0) { 12180 return; 12181 } 12182 12183 var index = items.indexOf(event.target); 12184 12185 if (event.which === ARROW_UP_KEYCODE && index > 0) { 12186 // Up 12187 index--; 12188 } 12189 12190 if (event.which === ARROW_DOWN_KEYCODE && index < items.length - 1) { 12191 // Down 12192 index++; 12193 } 12194 12195 if (index < 0) { 12196 index = 0; 12197 } 12198 12199 items[index].focus(); 12200 }; 12201 12202 _createClass(Dropdown, null, [{ 12203 key: "VERSION", 12204 get: function get() { 12205 return VERSION; 12206 } 12207 }, {
12208 key: "Default", 12209 get: function get() { 12210 return Default; 12211 } 12212 }, { 12213 key: "DefaultType", 12214 get: function get() { 12215 return DefaultType; 12216 } 12217 }]); 12218 12219 return Dropdown; 12220 }(); 12221 /** 12222 * ------------------------------------------------------------------------ 12223 * Data Api implementation 12224 * ------------------------------------------------------------------------ 12225 */ 12226 12227 12228 $(document).on(Event.KEYDOWN_DATA_API, Selector.DATA_TOGGLE, Dropdown._dataApiKeydownHandler).on(Event.KEYDOWN_DATA_API, Selector.MENU, Dropdown._dataApiKeydownHandler).on(Event.CLICK_DATA_API + " " + Event.KEYUP_DATA_API, Dropdown._clearMenus).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { 12229 event.preventDefault(); 12230 event.stopPropagation(); 12231 12232 Dropdown._jQueryInterface.call($(this), 'toggle'); 12233 }).on(Event.CLICK_DATA_API, Selector.FORM_CHILD, function (e) { 12234 e.stopPropagation(); 12235 }); 12236 /** 12237 * ------------------------------------------------------------------------ 12238 * jQuery 12239 * ------------------------------------------------------------------------ 12240 */ 12241 12242 $.fn[NAME] = Dropdown._jQueryInterface; 12243 $.fn[NAME].Constructor = Dropdown; 12244 12245 $.fn[NAME].noConflict = function () { 12246 $.fn[NAME] = JQUERY_NO_CONFLICT; 12247 return Dropdown._jQueryInterface; 12248 }; 12249 12250 return Dropdown; 12251}($, Popper); 12252//# sourceMappingURL=dropdown.js.map 12253function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } 12254 12255function _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); } } 12256 12257function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } 12258 12259/** 12260 * -------------------------------------------------------------------------- 12261 * Bootstrap (v4.0.0): modal.js 12262 * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) 12263 * -------------------------------------------------------------------------- 12264 */ 12265var Modal = function ($) { 12266 /** 12267 * ------------------------------------------------------------------------ 12268 * Constants 12269 * ------------------------------------------------------------------------ 12270 */ 12271 var NAME = 'modal'; 12272 var VERSION = '4.0.0'; 12273 var DATA_KEY = 'bs.modal'; 12274 var EVENT_KEY = "." + DATA_KEY; 12275 var DATA_API_KEY = '.data-api'; 12276 var JQUERY_NO_CONFLICT = $.fn[NAME]; 12277 var TRANSITION_DURATION = 300; 12278 var BACKDROP_TRANSITION_DURATION = 150; 12279 var ESCAPE_KEYCODE = 27; // KeyboardEvent.which value for Escape (Esc) key 12280 12281 var Default = { 12282 backdrop: true, 12283 keyboard: true, 12284 focus: true, 12285 show: true 12286 }; 12287 var DefaultType = { 12288 backdrop: '(boolean|string)', 12289 keyboard: 'boolean', 12290 focus: 'boolean', 12291 show: 'boolean' 12292 }; 12293 var Event = { 12294 HIDE: "hide" + EVENT_KEY, 12295 HIDDEN: "hidden" + EVENT_KEY, 12296 SHOW: "show" + EVENT_KEY, 12297 SHOWN: "shown" + EVENT_KEY, 12298 FOCUSIN: "focusin" + EVENT_KEY, 12299 RESIZE: "resize" + EVENT_KEY, 12300 CLICK_DISMISS: "click.dismiss" + EVENT_KEY, 12301 KEYDOWN_DISMISS: "keydown.dismiss" + EVENT_KEY, 12302 MOUSEUP_DISMISS: "mouseup.dismiss" + EVENT_KEY, 12303 MOUSEDOWN_DISMISS: "mousedown.dismiss" + EVENT_KEY, 12304 CLICK_DATA_API: "click" + EVENT_KEY + DATA_API_KEY 12305 }; 12306 var ClassName = { 12307 SCROLLBAR_MEASURER: 'modal-scrollbar-measure', 12308 BACKDROP: 'modal-backdrop', 12309 OPEN: 'modal-open', 12310 FADE: 'fade', 12311 SHOW: 'show' 12312 }; 12313 var Selector = { 12314 DIALOG: '.modal-dialog', 12315 DATA_TOGGLE: '[data-toggle="modal"]', 12316 DATA_DISMISS: '[data-dismiss="modal"]', 12317 FIXED_CONTENT: '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top', 12318 STICKY_CONTENT: '.sticky-top', 12319 NAVBAR_TOGGLER: '.navbar-toggler' 12320 /** 12321 * ------------------------------------------------------------------------ 12322 * Class Definition 12323 * ------------------------------------------------------------------------ 12324 */ 12325 12326 }; 12327 12328 var Modal = 12329 /*#__PURE__*/ 12330 function () { 12331 function Modal(element, config) { 12332 this._config = this._getConfig(config); 12333 this._element = element; 12334 this._dialog = $(element).find(Selector.DIALOG)[0]; 12335 this._backdrop = null; 12336 this._isShown = false;
12337 this._isBodyOverflowing = false; 12338 this._ignoreBackdropClick = false; 12339 this._originalBodyPadding = 0; 12340 this._scrollbarWidth = 0; 12341 } // Getters 12342 12343 12344 var _proto = Modal.prototype; 12345 12346 // Public 12347 _proto.toggle = function toggle(relatedTarget) { 12348 return this._isShown ? this.hide() : this.show(relatedTarget); 12349 }; 12350 12351 _proto.show = function show(relatedTarget) { 12352 var _this = this; 12353 12354 if (this._isTransitioning || this._isShown) { 12355 return; 12356 } 12357 12358 if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { 12359 this._isTransitioning = true; 12360 } 12361 12362 var showEvent = $.Event(Event.SHOW, { 12363 relatedTarget: relatedTarget 12364 }); 12365 $(this._element).trigger(showEvent); 12366 12367 if (this._isShown || showEvent.isDefaultPrevented()) { 12368 return; 12369 } 12370 12371 this._isShown = true; 12372 12373 this._checkScrollbar(); 12374 12375 this._setScrollbar(); 12376 12377 this._adjustDialog(); 12378 12379 $(document.body).addClass(ClassName.OPEN); 12380 12381 this._setEscapeEvent(); 12382 12383 this._setResizeEvent(); 12384 12385 $(this._element).on(Event.CLICK_DISMISS, Selector.DATA_DISMISS, function (event) { 12386 return _this.hide(event); 12387 }); 12388 $(this._dialog).on(Event.MOUSEDOWN_DISMISS, function () { 12389 $(_this._element).one(Event.MOUSEUP_DISMISS, function (event) { 12390 if ($(event.target).is(_this._element)) { 12391 _this._ignoreBackdropClick = true; 12392 } 12393 }); 12394 }); 12395 12396 this._showBackdrop(function () { 12397 return _this._showElement(relatedTarget); 12398 }); 12399 }; 12400 12401 _proto.hide = function hide(event) { 12402 var _this2 = this; 12403 12404 if (event) { 12405 event.preventDefault(); 12406 } 12407 12408 if (this._isTransitioning || !this._isShown) { 12409 return; 12410 } 12411 12412 var hideEvent = $.Event(Event.HIDE); 12413 $(this._element).trigger(hideEvent); 12414 12415 if (!this._isShown || hideEvent.isDefaultPrevented()) { 12416 return; 12417 } 12418 12419 this._isShown = false; 12420 var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); 12421 12422 if (transition) { 12423 this._isTransitioning = true; 12424 } 12425 12426 this._setEscapeEvent(); 12427 12428 this._setResizeEvent(); 12429 12430 $(document).off(Event.FOCUSIN); 12431 $(this._element).removeClass(ClassName.SHOW); 12432 $(this._element).off(Event.CLICK_DISMISS); 12433 $(this._dialog).off(Event.MOUSEDOWN_DISMISS); 12434 12435 if (transition) { 12436 $(this._element).one(Util.TRANSITION_END, function (event) { 12437 return _this2._hideModal(event); 12438 }).emulateTransitionEnd(TRANSITION_DURATION); 12439 } else { 12440 this._hideModal(); 12441 } 12442 }; 12443 12444 _proto.dispose = function dispose() { 12445 $.removeData(this._element, DATA_KEY); 12446 $(window, document, this._element, this._backdrop).off(EVENT_KEY); 12447 this._config = null; 12448 this._element = null; 12449 this._dialog = null; 12450 this._backdrop = null; 12451 this._isShown = null; 12452 this._isBodyOverflowing = null; 12453 this._ignoreBackdropClick = null; 12454 this._scrollbarWidth = null; 12455 }; 12456 12457 _proto.handleUpdate = function handleUpdate() { 12458 this._adjustDialog(); 12459 }; // Private 12460 12461 12462 _proto._getConfig = function _getConfig(config) { 12463 config = _extends({}, Default, config); 12464 Util.typeCheckConfig(NAME, config, DefaultType); 12465 return config; 12466 }; 12467 12468 _proto._showElement = function _showElement(relatedTarget) { 12469 var _this3 = this; 12470 12471 var transition = Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE); 12472 12473 if (!this._element.parentNode || this._element.parentNode.nodeType !== Node.ELEMENT_NODE) { 12474 // Don't move modal's DOM position 12475 document.body.appendChild(this._element); 12476 } 12477 12478 this._element.style.display = 'block'; 12479 12480 this._element.removeAttribute('aria-hidden'); 12481 12482 this._element.scrollTop = 0; 12483 12484 if (transition) { 12485 Util.reflow(this._element); 12486 } 12487 12488 $(this._element).addClass(ClassName.SHOW); 12489 12490 if (this._config.focus) { 12491 this._enforceFocus(); 12492 } 12493 12494 var shownEvent = $.Event(Event.SHOWN, { 12495 relatedTarget: relatedTarget 12496 }); 12497 12498 var transitionComplete = function transitionComplete() { 12499 if (_this3._config.focus) { 12500 _this3._element.focus(); 12501 } 12502 12503 _this3._isTransitioning = false;
12504 $(_this3._element).trigger(shownEvent); 12505 }; 12506 12507 if (transition) { 12508 $(this._dialog).one(Util.TRANSITION_END, transitionComplete).emulateTransitionEnd(TRANSITION_DURATION); 12509 } else { 12510 transitionComplete(); 12511 } 12512 }; 12513 12514 _proto._enforceFocus = function _enforceFocus() { 12515 var _this4 = this; 12516 12517 $(document).off(Event.FOCUSIN) // Guard against infinite focus loop 12518 .on(Event.FOCUSIN, function (event) { 12519 if (document !== event.target && _this4._element !== event.target && $(_this4._element).has(event.target).length === 0) { 12520 _this4._element.focus(); 12521 } 12522 }); 12523 }; 12524 12525 _proto._setEscapeEvent = function _setEscapeEvent() { 12526 var _this5 = this; 12527 12528 if (this._isShown && this._config.keyboard) { 12529 $(this._element).on(Event.KEYDOWN_DISMISS, function (event) { 12530 if (event.which === ESCAPE_KEYCODE) { 12531 event.preventDefault(); 12532 12533 _this5.hide(); 12534 } 12535 }); 12536 } else if (!this._isShown) { 12537 $(this._element).off(Event.KEYDOWN_DISMISS); 12538 } 12539 }; 12540 12541 _proto._setResizeEvent = function _setResizeEvent() { 12542 var _this6 = this; 12543 12544 if (this._isShown) { 12545 $(window).on(Event.RESIZE, function (event) { 12546 return _this6.handleUpdate(event); 12547 }); 12548 } else { 12549 $(window).off(Event.RESIZE); 12550 } 12551 }; 12552 12553 _proto._hideModal = function _hideModal() { 12554 var _this7 = this; 12555 12556 this._element.style.display = 'none'; 12557 12558 this._element.setAttribute('aria-hidden', true); 12559 12560 this._isTransitioning = false; 12561 12562 this._showBackdrop(function () { 12563 $(document.body).removeClass(ClassName.OPEN); 12564 12565 _this7._resetAdjustments(); 12566 12567 _this7._resetScrollbar(); 12568 12569 $(_this7._element).trigger(Event.HIDDEN); 12570 }); 12571 }; 12572 12573 _proto._removeBackdrop = function _removeBackdrop() { 12574 if (this._backdrop) { 12575 $(this._backdrop).remove(); 12576 this._backdrop = null; 12577 } 12578 }; 12579 12580 _proto._showBackdrop = function _showBackdrop(callback) { 12581 var _this8 = this; 12582 12583 var animate = $(this._element).hasClass(ClassName.FADE) ? ClassName.FADE : ''; 12584 12585 if (this._isShown && this._config.backdrop) { 12586 var doAnimate = Util.supportsTransitionEnd() && animate; 12587 this._backdrop = document.createElement('div'); 12588 this._backdrop.className = ClassName.BACKDROP; 12589 12590 if (animate) { 12591 $(this._backdrop).addClass(animate); 12592 } 12593 12594 $(this._backdrop).appendTo(document.body); 12595 $(this._element).on(Event.CLICK_DISMISS, function (event) { 12596 if (_this8._ignoreBackdropClick) { 12597 _this8._ignoreBackdropClick = false; 12598 return; 12599 } 12600 12601 if (event.target !== event.currentTarget) { 12602 return; 12603 } 12604 12605 if (_this8._config.backdrop === 'static') { 12606 _this8._element.focus(); 12607 } else { 12608 _this8.hide(); 12609 } 12610 }); 12611 12612 if (doAnimate) { 12613 Util.reflow(this._backdrop); 12614 } 12615 12616 $(this._backdrop).addClass(ClassName.SHOW); 12617 12618 if (!callback) { 12619 return; 12620 } 12621 12622 if (!doAnimate) { 12623 callback(); 12624 return; 12625 } 12626 12627 $(this._backdrop).one(Util.TRANSITION_END, callback).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION); 12628 } else if (!this._isShown && this._backdrop) { 12629 $(this._backdrop).removeClass(ClassName.SHOW); 12630 12631 var callbackRemove = function callbackRemove() { 12632 _this8._removeBackdrop(); 12633 12634 if (callback) { 12635 callback(); 12636 } 12637 }; 12638 12639 if (Util.supportsTransitionEnd() && $(this._element).hasClass(ClassName.FADE)) { 12640 $(this._backdrop).one(Util.TRANSITION_END, callbackRemove).emulateTransitionEnd(BACKDROP_TRANSITION_DURATION); 12641 } else { 12642 callbackRemove(); 12643 } 12644 } else if (callback) { 12645 callback(); 12646 } 12647 }; // ---------------------------------------------------------------------- 12648 // the following methods are used to handle overflowing modals 12649 // todo (fat): these should probably be refactored out of modal.js 12650 // ---------------------------------------------------------------------- 12651 12652
12653 _proto._adjustDialog = function _adjustDialog() { 12654 var isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight; 12655 12656 if (!this._isBodyOverflowing && isModalOverflowing) { 12657 this._element.style.paddingLeft = this._scrollbarWidth + "px"; 12658 } 12659 12660 if (this._isBodyOverflowing && !isModalOverflowing) { 12661 this._element.style.paddingRight = this._scrollbarWidth + "px"; 12662 } 12663 }; 12664 12665 _proto._resetAdjustments = function _resetAdjustments() { 12666 this._element.style.paddingLeft = ''; 12667 this._element.style.paddingRight = ''; 12668 }; 12669 12670 _proto._checkScrollbar = function _checkScrollbar() { 12671 var rect = document.body.getBoundingClientRect(); 12672 this._isBodyOverflowing = rect.left + rect.right < window.innerWidth; 12673 this._scrollbarWidth = this._getScrollbarWidth(); 12674 }; 12675 12676 _proto._setScrollbar = function _setScrollbar() { 12677 var _this9 = this; 12678 12679 if (this._isBodyOverflowing) { 12680 // Note: DOMNode.style.paddingRight returns the actual value or '' if not set 12681 // while $(DOMNode).css('padding-right') returns the calculated value or 0 if not set 12682 // Adjust fixed content padding 12683 $(Selector.FIXED_CONTENT).each(function (index, element) { 12684 var actualPadding = $(element)[0].style.paddingRight; 12685 var calculatedPadding = $(element).css('padding-right'); 12686 $(element).data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + _this9._scrollbarWidth + "px"); 12687 }); // Adjust sticky content margin 12688 12689 $(Selector.STICKY_CONTENT).each(function (index, element) { 12690 var actualMargin = $(element)[0].style.marginRight; 12691 var calculatedMargin = $(element).css('margin-right'); 12692 $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) - _this9._scrollbarWidth + "px"); 12693 }); // Adjust navbar-toggler margin 12694 12695 $(Selector.NAVBAR_TOGGLER).each(function (index, element) { 12696 var actualMargin = $(element)[0].style.marginRight; 12697 var calculatedMargin = $(element).css('margin-right'); 12698 $(element).data('margin-right', actualMargin).css('margin-right', parseFloat(calculatedMargin) + _this9._scrollbarWidth + "px"); 12699 }); // Adjust body padding 12700 12701 var actualPadding = document.body.style.paddingRight; 12702 var calculatedPadding = $('body').css('padding-right'); 12703 $('body').data('padding-right', actualPadding).css('padding-right', parseFloat(calculatedPadding) + this._scrollbarWidth + "px"); 12704 } 12705 }; 12706 12707 _proto._resetScrollbar = function _resetScrollbar() { 12708 // Restore fixed content padding 12709 $(Selector.FIXED_CONTENT).each(function (index, element) { 12710 var padding = $(element).data('padding-right'); 12711 12712 if (typeof padding !== 'undefined') { 12713 $(element).css('padding-right', padding).removeData('padding-right'); 12714 } 12715 }); // Restore sticky content and navbar-toggler margin 12716 12717 $(Selector.STICKY_CONTENT + ", " + Selector.NAVBAR_TOGGLER).each(function (index, element) { 12718 var margin = $(element).data('margin-right'); 12719 12720 if (typeof margin !== 'undefined') { 12721 $(element).css('margin-right', margin).removeData('margin-right'); 12722 } 12723 }); // Restore body padding 12724 12725 var padding = $('body').data('padding-right'); 12726 12727 if (typeof padding !== 'undefined') { 12728 $('body').css('padding-right', padding).removeData('padding-right'); 12729 } 12730 }; 12731 12732 _proto._getScrollbarWidth = function _getScrollbarWidth() { 12733 // thx d.walsh 12734 var scrollDiv = document.createElement('div'); 12735 scrollDiv.className = ClassName.SCROLLBAR_MEASURER; 12736 document.body.appendChild(scrollDiv); 12737 var scrollbarWidth = scrollDiv.getBoundingClientRect().width - scrollDiv.clientWidth; 12738 document.body.removeChild(scrollDiv); 12739 return scrollbarWidth; 12740 }; // Static 12741 12742 12743 Modal._jQueryInterface = function _jQueryInterface(config, relatedTarget) { 12744 return this.each(function () { 12745 var data = $(this).data(DATA_KEY); 12746 12747 var _config = _extends({}, Modal.Default, $(this).data(), typeof config === 'object' && config); 12748 12749 if (!data) { 12750 data = new Modal(this, _config); 12751 $(this).data(DATA_KEY, data); 12752 } 12753 12754 if (typeof config === 'string') { 12755 if (typeof data[config] === 'undefined') {
12756 throw new TypeError("No method named \"" + config + "\""); 12757 } 12758 12759 data[config](relatedTarget); 12760 } else if (_config.show) { 12761 data.show(relatedTarget); 12762 } 12763 }); 12764 }; 12765 12766 _createClass(Modal, null, [{ 12767 key: "VERSION", 12768 get: function get() { 12769 return VERSION; 12770 } 12771 }, { 12772 key: "Default", 12773 get: function get() { 12774 return Default; 12775 } 12776 }]); 12777 12778 return Modal; 12779 }(); 12780 /** 12781 * ------------------------------------------------------------------------ 12782 * Data Api implementation 12783 * ------------------------------------------------------------------------ 12784 */ 12785 12786 12787 $(document).on(Event.CLICK_DATA_API, Selector.DATA_TOGGLE, function (event) { 12788 var _this10 = this; 12789 12790 var target; 12791 var selector = Util.getSelectorFromElement(this); 12792 12793 if (selector) { 12794 target = $(selector)[0]; 12795 } 12796 12797 var config = $(target).data(DATA_KEY) ? 'toggle' : _extends({}, $(target).data(), $(this).data()); 12798 12799 if (this.tagName === 'A' || this.tagName === 'AREA') { 12800 event.preventDefault(); 12801 } 12802 12803 var $target = $(target).one(Event.SHOW, function (showEvent) { 12804 if (showEvent.isDefaultPrevented()) { 12805 // Only register focus restorer if modal will actually get shown 12806 return; 12807 } 12808 12809 $target.one(Event.HIDDEN, function () { 12810 if ($(_this10).is(':visible')) { 12811 _this10.focus(); 12812 } 12813 }); 12814 }); 12815 12816 Modal._jQueryInterface.call($(target), config, this); 12817 }); 12818 /** 12819 * ------------------------------------------------------------------------ 12820 * jQuery 12821 * ------------------------------------------------------------------------ 12822 */ 12823 12824 $.fn[NAME] = Modal._jQueryInterface; 12825 $.fn[NAME].Constructor = Modal; 12826 12827 $.fn[NAME].noConflict = function () { 12828 $.fn[NAME] = JQUERY_NO_CONFLICT; 12829 return Modal._jQueryInterface; 12830 }; 12831 12832 return Modal; 12833}($); 12834//# sourceMappingURL=modal.js.map 12835//! moment.js 12836 12837;(function (global, factory) { 12838 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 12839 typeof define === 'function' && define.amd ? define(factory) : 12840 global.moment = factory()
vendor: 56,293 bytes, lines 12840-14600
12840 12841}(this, (function () { 'use strict'; 12842 12843 var hookCallback; 12844 12845 function hooks () { 12846 return hookCallback.apply(null, arguments); 12847 } 12848 12849 // This is done to register the method called with moment() 12850 // without creating circular dependencies. 12851 function setHookCallback (callback) { 12852 hookCallback = callback; 12853 } 12854 12855 function isArray(input) { 12856 return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; 12857 } 12858 12859 function isObject(input) { 12860 // IE8 will treat undefined and null as object if it wasn't for 12861 // input != null 12862 return input != null && Object.prototype.toString.call(input) === '[object Object]'; 12863 } 12864 12865 function isObjectEmpty(obj) { 12866 if (Object.getOwnPropertyNames) { 12867 return (Object.getOwnPropertyNames(obj).length === 0); 12868 } else { 12869 var k; 12870 for (k in obj) { 12871 if (obj.hasOwnProperty(k)) { 12872 return false; 12873 } 12874 } 12875 return true; 12876 } 12877 } 12878 12879 function isUndefined(input) { 12880 return input === void 0; 12881 } 12882 12883 function isNumber(input) { 12884 return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; 12885 } 12886 12887 function isDate(input) { 12888 return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; 12889 } 12890 12891 function map(arr, fn) { 12892 var res = [], i; 12893 for (i = 0; i < arr.length; ++i) { 12894 res.push(fn(arr[i], i)); 12895 } 12896 return res; 12897 } 12898 12899 function hasOwnProp(a, b) { 12900 return Object.prototype.hasOwnProperty.call(a, b); 12901 } 12902 12903 function extend(a, b) { 12904 for (var i in b) { 12905 if (hasOwnProp(b, i)) { 12906 a[i] = b[i]; 12907 } 12908 } 12909 12910 if (hasOwnProp(b, 'toString')) { 12911 a.toString = b.toString; 12912 } 12913 12914 if (hasOwnProp(b, 'valueOf')) { 12915 a.valueOf = b.valueOf; 12916 } 12917 12918 return a; 12919 } 12920 12921 function createUTC (input, format, locale, strict) { 12922 return createLocalOrUTC(input, format, locale, strict, true).utc(); 12923 } 12924 12925 function defaultParsingFlags() { 12926 // We need to deep clone this object. 12927 return { 12928 empty : false, 12929 unusedTokens : [], 12930 unusedInput : [], 12931 overflow : -2, 12932 charsLeftOver : 0, 12933 nullInput : false, 12934 invalidMonth : null, 12935 invalidFormat : false, 12936 userInvalidated : false, 12937 iso : false, 12938 parsedDateParts : [], 12939 meridiem : null, 12940 rfc2822 : false, 12941 weekdayMismatch : false 12942 }; 12943 } 12944 12945 function getParsingFlags(m) { 12946 if (m._pf == null) { 12947 m._pf = defaultParsingFlags(); 12948 } 12949 return m._pf; 12950 } 12951 12952 var some; 12953 if (Array.prototype.some) { 12954 some = Array.prototype.some; 12955 } else { 12956 some = function (fun) { 12957 var t = Object(this); 12958 var len = t.length >>> 0; 12959 12960 for (var i = 0; i < len; i++) { 12961 if (i in t && fun.call(this, t[i], i, t)) { 12962 return true; 12963 } 12964 } 12965 12966 return false; 12967 }; 12968 } 12969 12970 function isValid(m) { 12971 if (m._isValid == null) { 12972 var flags = getParsingFlags(m); 12973 var parsedParts = some.call(flags.parsedDateParts, function (i) { 12974 return i != null; 12975 }); 12976 var isNowValid = !isNaN(m._d.getTime()) && 12977 flags.overflow < 0 && 12978 !flags.empty && 12979 !flags.invalidMonth && 12980 !flags.invalidWeekday && 12981 !flags.weekdayMismatch && 12982 !flags.nullInput && 12983 !flags.invalidFormat && 12984 !flags.userInvalidated && 12985 (!flags.meridiem || (flags.meridiem && parsedParts)); 12986 12987 if (m._strict) { 12988 isNowValid = isNowValid && 12989 flags.charsLeftOver === 0 && 12990 flags.unusedTokens.length === 0 && 12991 flags.bigHour === undefined; 12992 } 12993 12994 if (Object.isFrozen == null || !Object.isFrozen(m)) { 12995 m._isValid = isNowValid; 12996 } 12997 else { 12998 return isNowValid; 12999 } 13000 } 13001 return m._isValid; 13002 } 13003 13004 function createInvalid (flags) { 13005 var m = createUTC(NaN); 13006 if (flags != null) { 13007 extend(getParsingFlags(m), flags); 13008 } 13009 else { 13010 getParsingFlags(m).userInvalidated = true; 13011 } 13012 13013 return m; 13014 } 13015 13016 // Plugins that add properties should also add the key here (null value), 13017 // so we can properly clone ourselves. 13018 var momentProperties = hooks.momentProperties = []; 13019 13020 function copyConfig(to, from) { 13021 var i, prop, val; 13022 13023 if (!isUndefined(from._isAMomentObject)) { 13024 to._isAMomentObject = from._isAMomentObject; 13025 } 13026 if (!isUndefined(from._i)) { 13027 to._i = from._i; 13028 } 13029 if (!isUndefined(from._f)) { 13030 to._f = from._f; 13031 } 13032 if (!isUndefined(from._l)) { 13033 to._l = from._l; 13034 } 13035 if (!isUndefined(from._strict)) { 13036 to._strict = from._strict; 13037 } 13038 if (!isUndefined(from._tzm)) { 13039 to._tzm = from._tzm; 13040 } 13041 if (!isUndefined(from._isUTC)) { 13042 to._isUTC = from._isUTC; 13043 } 13044 if (!isUndefined(from._offset)) { 13045 to._offset = from._offset; 13046 } 13047 if (!isUndefined(from._pf)) { 13048 to._pf = getParsingFlags(from); 13049 } 13050 if (!isUndefined(from._locale)) { 13051 to._locale = from._locale; 13052 } 13053 13054 if (momentProperties.length > 0) { 13055 for (i = 0; i < momentProperties.length; i++) { 13056 prop = momentProperties[i]; 13057 val = from[prop]; 13058 if (!isUndefined(val)) { 13059 to[prop] = val; 13060 } 13061 } 13062 } 13063 13064 return to; 13065 } 13066 13067 var updateInProgress = false; 13068 13069 // Moment prototype object 13070 function Moment(config) { 13071 copyConfig(this, config); 13072 this._d = new Date(config._d != null ? config._d.getTime() : NaN); 13073 if (!this.isValid()) { 13074 this._d = new Date(NaN); 13075 } 13076 // Prevent infinite loop in case updateOffset creates new moment 13077 // objects. 13078 if (updateInProgress === false) { 13079 updateInProgress = true; 13080 hooks.updateOffset(this); 13081 updateInProgress = false; 13082 } 13083 } 13084 13085 function isMoment (obj) { 13086 return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); 13087 } 13088 13089 function absFloor (number) { 13090 if (number < 0) { 13091 // -0 -> 0 13092 return Math.ceil(number) || 0; 13093 } else { 13094 return Math.floor(number); 13095 } 13096 } 13097 13098 function toInt(argumentForCoercion) { 13099 var coercedNumber = +argumentForCoercion, 13100 value = 0; 13101 13102 if (coercedNumber !== 0 && isFinite(coercedNumber)) { 13103 value = absFloor(coercedNumber); 13104 } 13105 13106 return value; 13107 } 13108 13109 // compare two arrays, return the number of differences 13110 function compareArrays(array1, array2, dontConvert) { 13111 var len = Math.min(array1.length, array2.length), 13112 lengthDiff = Math.abs(array1.length - array2.length), 13113 diffs = 0, 13114 i; 13115 for (i = 0; i < len; i++) { 13116 if ((dontConvert && array1[i] !== array2[i]) || 13117 (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { 13118 diffs++; 13119 } 13120 } 13121 return diffs + lengthDiff; 13122 } 13123 13124 function warn(msg) { 13125 if (hooks.suppressDeprecationWarnings === false && 13126 (typeof console !== 'undefined') && console.warn) { 13127 console.warn('Deprecation warning: ' + msg); 13128 } 13129 } 13130 13131 function deprecate(msg, fn) { 13132 var firstTime = true; 13133 13134 return extend(function () { 13135 if (hooks.deprecationHandler != null) { 13136 hooks.deprecationHandler(null, msg); 13137 } 13138 if (firstTime) { 13139 var args = []; 13140 var arg; 13141 for (var i = 0; i < arguments.length; i++) { 13142 arg = ''; 13143 if (typeof arguments[i] === 'object') { 13144 arg += '\n[' + i + '] '; 13145 for (var key in arguments[0]) { 13146 arg += key + ': ' + arguments[0][key] + ', '; 13147 } 13148 arg = arg.slice(0, -2); // Remove trailing comma and space 13149 } else { 13150 arg = arguments[i]; 13151 } 13152 args.push(arg); 13153 } 13154 warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); 13155 firstTime = false; 13156 } 13157 return fn.apply(this, arguments); 13158 }, fn); 13159 } 13160 13161 var deprecations = {}; 13162 13163 function deprecateSimple(name, msg) { 13164 if (hooks.deprecationHandler != null) { 13165 hooks.deprecationHandler(name, msg); 13166 } 13167 if (!deprecations[name]) { 13168 warn(msg); 13169 deprecations[name] = true; 13170 } 13171 } 13172 13173 hooks.suppressDeprecationWarnings = false; 13174 hooks.deprecationHandler = null; 13175 13176 function isFunction(input) { 13177 return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; 13178 } 13179 13180 function set (config) { 13181 var prop, i; 13182 for (i in config) { 13183 prop = config[i]; 13184 if (isFunction(prop)) { 13185 this[i] = prop; 13186 } else { 13187 this['_' + i] = prop; 13188 } 13189 } 13190 this._config = config; 13191 // Lenient ordinal parsing accepts just a number in addition to 13192 // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. 13193 // TODO: Remove "ordinalParse" fallback in next major release. 13194 this._dayOfMonthOrdinalParseLenient = new RegExp( 13195 (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + 13196 '|' + (/\d{1,2}/).source); 13197 } 13198 13199 function mergeConfigs(parentConfig, childConfig) { 13200 var res = extend({}, parentConfig), prop; 13201 for (prop in childConfig) { 13202 if (hasOwnProp(childConfig, prop)) { 13203 if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { 13204 res[prop] = {}; 13205 extend(res[prop], parentConfig[prop]); 13206 extend(res[prop], childConfig[prop]); 13207 } else if (childConfig[prop] != null) { 13208 res[prop] = childConfig[prop]; 13209 } else { 13210 delete res[prop]; 13211 } 13212 } 13213 } 13214 for (prop in parentConfig) { 13215 if (hasOwnProp(parentConfig, prop) && 13216 !hasOwnProp(childConfig, prop) && 13217 isObject(parentConfig[prop])) { 13218 // make sure changes to properties don't modify parent config 13219 res[prop] = extend({}, res[prop]); 13220 } 13221 } 13222 return res; 13223 } 13224 13225 function Locale(config) { 13226 if (config != null) { 13227 this.set(config); 13228 } 13229 } 13230 13231 var keys; 13232 13233 if (Object.keys) { 13234 keys = Object.keys; 13235 } else { 13236 keys = function (obj) { 13237 var i, res = []; 13238 for (i in obj) { 13239 if (hasOwnProp(obj, i)) { 13240 res.push(i); 13241 } 13242 } 13243 return res; 13244 }; 13245 } 13246 13247 var defaultCalendar = { 13248 sameDay : '[Today at] LT', 13249 nextDay : '[Tomorrow at] LT', 13250 nextWeek : 'dddd [at] LT', 13251 lastDay : '[Yesterday at] LT', 13252 lastWeek : '[Last] dddd [at] LT', 13253 sameElse : 'L' 13254 }; 13255 13256 function calendar (key, mom, now) { 13257 var output = this._calendar[key] || this._calendar['sameElse']; 13258 return isFunction(output) ? output.call(mom, now) : output; 13259 } 13260 13261 var defaultLongDateFormat = { 13262 LTS : 'h:mm:ss A', 13263 LT : 'h:mm A', 13264 L : 'MM/DD/YYYY', 13265 LL : 'MMMM D, YYYY', 13266 LLL : 'MMMM D, YYYY h:mm A', 13267 LLLL : 'dddd, MMMM D, YYYY h:mm A' 13268 }; 13269 13270 function longDateFormat (key) { 13271 var format = this._longDateFormat[key], 13272 formatUpper = this._longDateFormat[key.toUpperCase()]; 13273 13274 if (format || !formatUpper) { 13275 return format; 13276 } 13277 13278 this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { 13279 return val.slice(1); 13280 }); 13281 13282 return this._longDateFormat[key]; 13283 } 13284 13285 var defaultInvalidDate = 'Invalid date'; 13286 13287 function invalidDate () { 13288 return this._invalidDate; 13289 } 13290 13291 var defaultOrdinal = '%d'; 13292 var defaultDayOfMonthOrdinalParse = /\d{1,2}/; 13293 13294 function ordinal (number) { 13295 return this._ordinal.replace('%d', number); 13296 } 13297 13298 var defaultRelativeTime = { 13299 future : 'in %s', 13300 past : '%s ago', 13301 s : 'a few seconds', 13302 ss : '%d seconds', 13303 m : 'a minute', 13304 mm : '%d minutes', 13305 h : 'an hour', 13306 hh : '%d hours', 13307 d : 'a day', 13308 dd : '%d days', 13309 M : 'a month', 13310 MM : '%d months', 13311 y : 'a year', 13312 yy : '%d years' 13313 }; 13314 13315 function relativeTime (number, withoutSuffix, string, isFuture) { 13316 var output = this._relativeTime[string]; 13317 return (isFunction(output)) ? 13318 output(number, withoutSuffix, string, isFuture) : 13319 output.replace(/%d/i, number); 13320 } 13321 13322 function pastFuture (diff, output) { 13323 var format = this._relativeTime[diff > 0 ? 'future' : 'past']; 13324 return isFunction(format) ? format(output) : format.replace(/%s/i, output); 13325 } 13326 13327 var aliases = {}; 13328 13329 function addUnitAlias (unit, shorthand) { 13330 var lowerCase = unit.toLowerCase(); 13331 aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; 13332 } 13333 13334 function normalizeUnits(units) { 13335 return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; 13336 } 13337 13338 function normalizeObjectUnits(inputObject) { 13339 var normalizedInput = {}, 13340 normalizedProp, 13341 prop; 13342 13343 for (prop in inputObject) { 13344 if (hasOwnProp(inputObject, prop)) { 13345 normalizedProp = normalizeUnits(prop); 13346 if (normalizedProp) { 13347 normalizedInput[normalizedProp] = inputObject[prop]; 13348 } 13349 } 13350 } 13351 13352 return normalizedInput; 13353 } 13354 13355 var priorities = {}; 13356 13357 function addUnitPriority(unit, priority) { 13358 priorities[unit] = priority; 13359 } 13360 13361 function getPrioritizedUnits(unitsObj) { 13362 var units = []; 13363 for (var u in unitsObj) { 13364 units.push({unit: u, priority: priorities[u]}); 13365 } 13366 units.sort(function (a, b) { 13367 return a.priority - b.priority; 13368 }); 13369 return units; 13370 } 13371 13372 function zeroFill(number, targetLength, forceSign) { 13373 var absNumber = '' + Math.abs(number), 13374 zerosToFill = targetLength - absNumber.length, 13375 sign = number >= 0; 13376 return (sign ? (forceSign ? '+' : '') : '-') + 13377 Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; 13378 } 13379 13380 var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; 13381 13382 var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; 13383 13384 var formatFunctions = {}; 13385 13386 var formatTokenFunctions = {}; 13387 13388 // token: 'M' 13389 // padded: ['MM', 2] 13390 // ordinal: 'Mo' 13391 // callback: function () { this.month() + 1 } 13392 function addFormatToken (token, padded, ordinal, callback) { 13393 var func = callback; 13394 if (typeof callback === 'string') { 13395 func = function () { 13396 return this[callback](); 13397 }; 13398 } 13399 if (token) { 13400 formatTokenFunctions[token] = func; 13401 } 13402 if (padded) { 13403 formatTokenFunctions[padded[0]] = function () { 13404 return zeroFill(func.apply(this, arguments), padded[1], padded[2]); 13405 }; 13406 } 13407 if (ordinal) { 13408 formatTokenFunctions[ordinal] = function () { 13409 return this.localeData().ordinal(func.apply(this, arguments), token); 13410 }; 13411 } 13412 } 13413 13414 function removeFormattingTokens(input) { 13415 if (input.match(/\[[\s\S]/)) { 13416 return input.replace(/^\[|\]$/g, ''); 13417 } 13418 return input.replace(/\\/g, ''); 13419 } 13420 13421 function makeFormatFunction(format) { 13422 var array = format.match(formattingTokens), i, length; 13423 13424 for (i = 0, length = array.length; i < length; i++) { 13425 if (formatTokenFunctions[array[i]]) { 13426 array[i] = formatTokenFunctions[array[i]]; 13427 } else { 13428 array[i] = removeFormattingTokens(array[i]); 13429 } 13430 } 13431 13432 return function (mom) { 13433 var output = '', i; 13434 for (i = 0; i < length; i++) { 13435 output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; 13436 } 13437 return output; 13438 }; 13439 } 13440 13441 // format date using native date object 13442 function formatMoment(m, format) { 13443 if (!m.isValid()) { 13444 return m.localeData().invalidDate(); 13445 } 13446 13447 format = expandFormat(format, m.localeData()); 13448 formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); 13449 13450 return formatFunctions[format](m); 13451 } 13452 13453 function expandFormat(format, locale) { 13454 var i = 5; 13455 13456 function replaceLongDateFormatTokens(input) { 13457 return locale.longDateFormat(input) || input; 13458 } 13459 13460 localFormattingTokens.lastIndex = 0; 13461 while (i >= 0 && localFormattingTokens.test(format)) { 13462 format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); 13463 localFormattingTokens.lastIndex = 0; 13464 i -= 1; 13465 } 13466 13467 return format; 13468 } 13469 13470 var match1 = /\d/; // 0 - 9 13471 var match2 = /\d\d/; // 00 - 99 13472 var match3 = /\d{3}/; // 000 - 999 13473 var match4 = /\d{4}/; // 0000 - 9999 13474 var match6 = /[+-]?\d{6}/; // -999999 - 999999 13475 var match1to2 = /\d\d?/; // 0 - 99 13476 var match3to4 = /\d\d\d\d?/; // 999 - 9999 13477 var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 13478 var match1to3 = /\d{1,3}/; // 0 - 999 13479 var match1to4 = /\d{1,4}/; // 0 - 9999 13480 var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 13481 13482 var matchUnsigned = /\d+/; // 0 - inf 13483 var matchSigned = /[+-]?\d+/; // -inf - inf 13484 13485 var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z 13486 var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z 13487 13488 var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 13489 13490 // any word (or two) characters or numbers including two/three word month in arabic. 13491 // includes scottish gaelic two word and hyphenated months 13492 var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; 13493 13494 var regexes = {}; 13495 13496 function addRegexToken (token, regex, strictRegex) { 13497 regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { 13498 return (isStrict && strictRegex) ? strictRegex : regex; 13499 }; 13500 } 13501 13502 function getParseRegexForToken (token, config) { 13503 if (!hasOwnProp(regexes, token)) { 13504 return new RegExp(unescapeFormat(token)); 13505 } 13506 13507 return regexes[token](config._strict, config._locale); 13508 } 13509 13510 // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript 13511 function unescapeFormat(s) { 13512 return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { 13513 return p1 || p2 || p3 || p4; 13514 })); 13515 } 13516 13517 function regexEscape(s) { 13518 return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); 13519 } 13520 13521 var tokens = {}; 13522 13523 function addParseToken (token, callback) { 13524 var i, func = callback; 13525 if (typeof token === 'string') { 13526 token = [token]; 13527 } 13528 if (isNumber(callback)) { 13529 func = function (input, array) { 13530 array[callback] = toInt(input); 13531 }; 13532 } 13533 for (i = 0; i < token.length; i++) { 13534 tokens[token[i]] = func; 13535 } 13536 } 13537 13538 function addWeekParseToken (token, callback) { 13539 addParseToken(token, function (input, array, config, token) { 13540 config._w = config._w || {}; 13541 callback(input, config._w, config, token); 13542 }); 13543 } 13544 13545 function addTimeToArrayFromToken(token, input, config) { 13546 if (input != null && hasOwnProp(tokens, token)) { 13547 tokens[token](input, config._a, config, token); 13548 } 13549 } 13550 13551 var YEAR = 0; 13552 var MONTH = 1; 13553 var DATE = 2; 13554 var HOUR = 3; 13555 var MINUTE = 4; 13556 var SECOND = 5; 13557 var MILLISECOND = 6; 13558 var WEEK = 7; 13559 var WEEKDAY = 8; 13560 13561 // FORMATTING 13562 13563 addFormatToken('Y', 0, 0, function () { 13564 var y = this.year(); 13565 return y <= 9999 ? '' + y : '+' + y; 13566 }); 13567 13568 addFormatToken(0, ['YY', 2], 0, function () { 13569 return this.year() % 100; 13570 }); 13571 13572 addFormatToken(0, ['YYYY', 4], 0, 'year'); 13573 addFormatToken(0, ['YYYYY', 5], 0, 'year'); 13574 addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); 13575 13576 // ALIASES 13577 13578 addUnitAlias('year', 'y'); 13579 13580 // PRIORITIES 13581 13582 addUnitPriority('year', 1); 13583 13584 // PARSING 13585 13586 addRegexToken('Y', matchSigned); 13587 addRegexToken('YY', match1to2, match2); 13588 addRegexToken('YYYY', match1to4, match4); 13589 addRegexToken('YYYYY', match1to6, match6); 13590 addRegexToken('YYYYYY', match1to6, match6); 13591 13592 addParseToken(['YYYYY', 'YYYYYY'], YEAR); 13593 addParseToken('YYYY', function (input, array) { 13594 array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); 13595 }); 13596 addParseToken('YY', function (input, array) { 13597 array[YEAR] = hooks.parseTwoDigitYear(input); 13598 }); 13599 addParseToken('Y', function (input, array) { 13600 array[YEAR] = parseInt(input, 10); 13601 }); 13602 13603 // HELPERS 13604 13605 function daysInYear(year) { 13606 return isLeapYear(year) ? 366 : 365; 13607 } 13608 13609 function isLeapYear(year) { 13610 return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; 13611 } 13612 13613 // HOOKS 13614 13615 hooks.parseTwoDigitYear = function (input) { 13616 return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); 13617 }; 13618 13619 // MOMENTS 13620 13621 var getSetYear = makeGetSet('FullYear', true); 13622 13623 function getIsLeapYear () { 13624 return isLeapYear(this.year()); 13625 } 13626 13627 function makeGetSet (unit, keepTime) { 13628 return function (value) { 13629 if (value != null) { 13630 set$1(this, unit, value); 13631 hooks.updateOffset(this, keepTime); 13632 return this; 13633 } else { 13634 return get(this, unit); 13635 } 13636 }; 13637 } 13638 13639 function get (mom, unit) { 13640 return mom.isValid() ? 13641 mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; 13642 } 13643 13644 function set$1 (mom, unit, value) { 13645 if (mom.isValid() && !isNaN(value)) { 13646 if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { 13647 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); 13648 } 13649 else { 13650 mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); 13651 } 13652 } 13653 } 13654 13655 // MOMENTS 13656 13657 function stringGet (units) { 13658 units = normalizeUnits(units); 13659 if (isFunction(this[units])) { 13660 return this[units](); 13661 } 13662 return this; 13663 } 13664 13665 13666 function stringSet (units, value) { 13667 if (typeof units === 'object') { 13668 units = normalizeObjectUnits(units); 13669 var prioritized = getPrioritizedUnits(units); 13670 for (var i = 0; i < prioritized.length; i++) { 13671 this[prioritized[i].unit](units[prioritized[i].unit]); 13672 } 13673 } else { 13674 units = normalizeUnits(units); 13675 if (isFunction(this[units])) { 13676 return this[units](value); 13677 } 13678 } 13679 return this; 13680 } 13681 13682 function mod(n, x) { 13683 return ((n % x) + x) % x; 13684 } 13685 13686 var indexOf; 13687 13688 if (Array.prototype.indexOf) { 13689 indexOf = Array.prototype.indexOf; 13690 } else { 13691 indexOf = function (o) { 13692 // I know 13693 var i; 13694 for (i = 0; i < this.length; ++i) { 13695 if (this[i] === o) { 13696 return i; 13697 } 13698 } 13699 return -1; 13700 }; 13701 } 13702 13703 function daysInMonth(year, month) { 13704 if (isNaN(year) || isNaN(month)) { 13705 return NaN; 13706 } 13707 var modMonth = mod(month, 12); 13708 year += (month - modMonth) / 12; 13709 return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); 13710 } 13711 13712 // FORMATTING 13713 13714 addFormatToken('M', ['MM', 2], 'Mo', function () { 13715 return this.month() + 1; 13716 }); 13717 13718 addFormatToken('MMM', 0, 0, function (format) { 13719 return this.localeData().monthsShort(this, format); 13720 }); 13721 13722 addFormatToken('MMMM', 0, 0, function (format) { 13723 return this.localeData().months(this, format); 13724 }); 13725 13726 // ALIASES 13727 13728 addUnitAlias('month', 'M'); 13729 13730 // PRIORITY 13731 13732 addUnitPriority('month', 8); 13733 13734 // PARSING 13735 13736 addRegexToken('M', match1to2); 13737 addRegexToken('MM', match1to2, match2); 13738 addRegexToken('MMM', function (isStrict, locale) { 13739 return locale.monthsShortRegex(isStrict); 13740 }); 13741 addRegexToken('MMMM', function (isStrict, locale) { 13742 return locale.monthsRegex(isStrict); 13743 }); 13744 13745 addParseToken(['M', 'MM'], function (input, array) { 13746 array[MONTH] = toInt(input) - 1; 13747 }); 13748 13749 addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { 13750 var month = config._locale.monthsParse(input, token, config._strict); 13751 // if we didn't find a month name, mark the date as invalid. 13752 if (month != null) { 13753 array[MONTH] = month; 13754 } else { 13755 getParsingFlags(config).invalidMonth = input; 13756 } 13757 }); 13758 13759 // LOCALES 13760 13761 var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; 13762 var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); 13763 function localeMonths (m, format) { 13764 if (!m) { 13765 return isArray(this._months) ? this._months : 13766 this._months['standalone']; 13767 } 13768 return isArray(this._months) ? this._months[m.month()] : 13769 this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; 13770 } 13771 13772 var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); 13773 function localeMonthsShort (m, format) { 13774 if (!m) { 13775 return isArray(this._monthsShort) ? this._monthsShort : 13776 this._monthsShort['standalone']; 13777 } 13778 return isArray(this._monthsShort) ? this._monthsShort[m.month()] : 13779 this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; 13780 } 13781 13782 function handleStrictParse(monthName, format, strict) { 13783 var i, ii, mom, llc = monthName.toLocaleLowerCase(); 13784 if (!this._monthsParse) { 13785 // this is not used 13786 this._monthsParse = []; 13787 this._longMonthsParse = []; 13788 this._shortMonthsParse = []; 13789 for (i = 0; i < 12; ++i) { 13790 mom = createUTC([2000, i]); 13791 this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); 13792 this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); 13793 } 13794 } 13795 13796 if (strict) { 13797 if (format === 'MMM') { 13798 ii = indexOf.call(this._shortMonthsParse, llc); 13799 return ii !== -1 ? ii : null; 13800 } else { 13801 ii = indexOf.call(this._longMonthsParse, llc); 13802 return ii !== -1 ? ii : null; 13803 } 13804 } else { 13805 if (format === 'MMM') { 13806 ii = indexOf.call(this._shortMonthsParse, llc); 13807 if (ii !== -1) { 13808 return ii; 13809 } 13810 ii = indexOf.call(this._longMonthsParse, llc); 13811 return ii !== -1 ? ii : null; 13812 } else { 13813 ii = indexOf.call(this._longMonthsParse, llc); 13814 if (ii !== -1) { 13815 return ii; 13816 } 13817 ii = indexOf.call(this._shortMonthsParse, llc); 13818 return ii !== -1 ? ii : null; 13819 } 13820 } 13821 } 13822 13823 function localeMonthsParse (monthName, format, strict) { 13824 var i, mom, regex; 13825 13826 if (this._monthsParseExact) { 13827 return handleStrictParse.call(this, monthName, format, strict); 13828 } 13829 13830 if (!this._monthsParse) { 13831 this._monthsParse = []; 13832 this._longMonthsParse = []; 13833 this._shortMonthsParse = []; 13834 } 13835 13836 // TODO: add sorting 13837 // Sorting makes sure if one month (or abbr) is a prefix of another 13838 // see sorting in computeMonthsParse 13839 for (i = 0; i < 12; i++) { 13840 // make the regex if we don't have it already 13841 mom = createUTC([2000, i]); 13842 if (strict && !this._longMonthsParse[i]) { 13843 this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); 13844 this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); 13845 } 13846 if (!strict && !this._monthsParse[i]) { 13847 regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); 13848 this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); 13849 } 13850 // test the regex 13851 if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { 13852 return i; 13853 } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { 13854 return i; 13855 } else if (!strict && this._monthsParse[i].test(monthName)) { 13856 return i; 13857 } 13858 } 13859 } 13860 13861 // MOMENTS 13862 13863 function setMonth (mom, value) { 13864 var dayOfMonth; 13865 13866 if (!mom.isValid()) { 13867 // No op 13868 return mom; 13869 } 13870 13871 if (typeof value === 'string') { 13872 if (/^\d+$/.test(value)) { 13873 value = toInt(value); 13874 } else { 13875 value = mom.localeData().monthsParse(value); 13876 // TODO: Another silent failure? 13877 if (!isNumber(value)) { 13878 return mom; 13879 } 13880 } 13881 } 13882 13883 dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); 13884 mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); 13885 return mom; 13886 } 13887 13888 function getSetMonth (value) { 13889 if (value != null) { 13890 setMonth(this, value); 13891 hooks.updateOffset(this, true); 13892 return this; 13893 } else { 13894 return get(this, 'Month'); 13895 } 13896 } 13897 13898 function getDaysInMonth () { 13899 return daysInMonth(this.year(), this.month()); 13900 } 13901 13902 var defaultMonthsShortRegex = matchWord; 13903 function monthsShortRegex (isStrict) { 13904 if (this._monthsParseExact) { 13905 if (!hasOwnProp(this, '_monthsRegex')) { 13906 computeMonthsParse.call(this); 13907 } 13908 if (isStrict) { 13909 return this._monthsShortStrictRegex; 13910 } else { 13911 return this._monthsShortRegex; 13912 } 13913 } else { 13914 if (!hasOwnProp(this, '_monthsShortRegex')) { 13915 this._monthsShortRegex = defaultMonthsShortRegex; 13916 } 13917 return this._monthsShortStrictRegex && isStrict ? 13918 this._monthsShortStrictRegex : this._monthsShortRegex; 13919 } 13920 } 13921 13922 var defaultMonthsRegex = matchWord; 13923 function monthsRegex (isStrict) { 13924 if (this._monthsParseExact) { 13925 if (!hasOwnProp(this, '_monthsRegex')) { 13926 computeMonthsParse.call(this); 13927 } 13928 if (isStrict) { 13929 return this._monthsStrictRegex; 13930 } else { 13931 return this._monthsRegex; 13932 } 13933 } else { 13934 if (!hasOwnProp(this, '_monthsRegex')) { 13935 this._monthsRegex = defaultMonthsRegex; 13936 } 13937 return this._monthsStrictRegex && isStrict ? 13938 this._monthsStrictRegex : this._monthsRegex; 13939 } 13940 } 13941 13942 function computeMonthsParse () { 13943 function cmpLenRev(a, b) { 13944 return b.length - a.length; 13945 } 13946 13947 var shortPieces = [], longPieces = [], mixedPieces = [], 13948 i, mom; 13949 for (i = 0; i < 12; i++) { 13950 // make the regex if we don't have it already 13951 mom = createUTC([2000, i]); 13952 shortPieces.push(this.monthsShort(mom, '')); 13953 longPieces.push(this.months(mom, '')); 13954 mixedPieces.push(this.months(mom, '')); 13955 mixedPieces.push(this.monthsShort(mom, '')); 13956 } 13957 // Sorting makes sure if one month (or abbr) is a prefix of another it 13958 // will match the longer piece. 13959 shortPieces.sort(cmpLenRev); 13960 longPieces.sort(cmpLenRev); 13961 mixedPieces.sort(cmpLenRev); 13962 for (i = 0; i < 12; i++) { 13963 shortPieces[i] = regexEscape(shortPieces[i]); 13964 longPieces[i] = regexEscape(longPieces[i]); 13965 } 13966 for (i = 0; i < 24; i++) { 13967 mixedPieces[i] = regexEscape(mixedPieces[i]); 13968 } 13969 13970 this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 13971 this._monthsShortRegex = this._monthsRegex; 13972 this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); 13973 this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); 13974 } 13975 13976 function createDate (y, m, d, h, M, s, ms) { 13977 // can't just apply() to create a date: 13978 // https://stackoverflow.com/q/181348 13979 var date; 13980 // the date constructor remaps years 0-99 to 1900-1999 13981 if (y < 100 && y >= 0) { 13982 // preserve leap years using a full 400 year cycle, then reset 13983 date = new Date(y + 400, m, d, h, M, s, ms); 13984 if (isFinite(date.getFullYear())) { 13985 date.setFullYear(y); 13986 } 13987 } else { 13988 date = new Date(y, m, d, h, M, s, ms); 13989 } 13990 13991 return date; 13992 } 13993 13994 function createUTCDate (y) { 13995 var date; 13996 // the Date.UTC function remaps years 0-99 to 1900-1999 13997 if (y < 100 && y >= 0) { 13998 var args = Array.prototype.slice.call(arguments); 13999 // preserve leap years using a full 400 year cycle, then reset 14000 args[0] = y + 400; 14001 date = new Date(Date.UTC.apply(null, args)); 14002 if (isFinite(date.getUTCFullYear())) { 14003 date.setUTCFullYear(y); 14004 } 14005 } else { 14006 date = new Date(Date.UTC.apply(null, arguments)); 14007 } 14008 14009 return date; 14010 } 14011 14012 // start-of-first-week - start-of-year 14013 function firstWeekOffset(year, dow, doy) { 14014 var // first-week day -- which january is always in the first week (4 for iso, 1 for other) 14015 fwd = 7 + dow - doy, 14016 // first-week day local weekday -- which local weekday is fwd 14017 fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; 14018 14019 return -fwdlw + fwd - 1; 14020 } 14021 14022 // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday 14023 function dayOfYearFromWeeks(year, week, weekday, dow, doy) { 14024 var localWeekday = (7 + weekday - dow) % 7, 14025 weekOffset = firstWeekOffset(year, dow, doy), 14026 dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, 14027 resYear, resDayOfYear; 14028 14029 if (dayOfYear <= 0) { 14030 resYear = year - 1; 14031 resDayOfYear = daysInYear(resYear) + dayOfYear; 14032 } else if (dayOfYear > daysInYear(year)) { 14033 resYear = year + 1; 14034 resDayOfYear = dayOfYear - daysInYear(year); 14035 } else { 14036 resYear = year; 14037 resDayOfYear = dayOfYear; 14038 } 14039 14040 return { 14041 year: resYear, 14042 dayOfYear: resDayOfYear 14043 }; 14044 } 14045 14046 function weekOfYear(mom, dow, doy) { 14047 var weekOffset = firstWeekOffset(mom.year(), dow, doy), 14048 week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, 14049 resWeek, resYear; 14050 14051 if (week < 1) { 14052 resYear = mom.year() - 1; 14053 resWeek = week + weeksInYear(resYear, dow, doy); 14054 } else if (week > weeksInYear(mom.year(), dow, doy)) { 14055 resWeek = week - weeksInYear(mom.year(), dow, doy); 14056 resYear = mom.year() + 1; 14057 } else { 14058 resYear = mom.year(); 14059 resWeek = week; 14060 } 14061 14062 return { 14063 week: resWeek, 14064 year: resYear 14065 }; 14066 } 14067 14068 function weeksInYear(year, dow, doy) { 14069 var weekOffset = firstWeekOffset(year, dow, doy), 14070 weekOffsetNext = firstWeekOffset(year + 1, dow, doy); 14071 return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; 14072 } 14073 14074 // FORMATTING 14075 14076 addFormatToken('w', ['ww', 2], 'wo', 'week'); 14077 addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); 14078 14079 // ALIASES 14080 14081 addUnitAlias('week', 'w'); 14082 addUnitAlias('isoWeek', 'W'); 14083 14084 // PRIORITIES 14085 14086 addUnitPriority('week', 5); 14087 addUnitPriority('isoWeek', 5); 14088 14089 // PARSING 14090 14091 addRegexToken('w', match1to2); 14092 addRegexToken('ww', match1to2, match2); 14093 addRegexToken('W', match1to2); 14094 addRegexToken('WW', match1to2, match2); 14095 14096 addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { 14097 week[token.substr(0, 1)] = toInt(input); 14098 }); 14099 14100 // HELPERS 14101 14102 // LOCALES 14103 14104 function localeWeek (mom) { 14105 return weekOfYear(mom, this._week.dow, this._week.doy).week; 14106 } 14107 14108 var defaultLocaleWeek = { 14109 dow : 0, // Sunday is the first day of the week. 14110 doy : 6 // The week that contains Jan 6th is the first week of the year. 14111 }; 14112 14113 function localeFirstDayOfWeek () { 14114 return this._week.dow; 14115 } 14116 14117 function localeFirstDayOfYear () { 14118 return this._week.doy; 14119 } 14120 14121 // MOMENTS 14122 14123 function getSetWeek (input) { 14124 var week = this.localeData().week(this); 14125 return input == null ? week : this.add((input - week) * 7, 'd'); 14126 } 14127 14128 function getSetISOWeek (input) { 14129 var week = weekOfYear(this, 1, 4).week; 14130 return input == null ? week : this.add((input - week) * 7, 'd'); 14131 } 14132 14133 // FORMATTING 14134 14135 addFormatToken('d', 0, 'do', 'day'); 14136 14137 addFormatToken('dd', 0, 0, function (format) { 14138 return this.localeData().weekdaysMin(this, format); 14139 }); 14140 14141 addFormatToken('ddd', 0, 0, function (format) { 14142 return this.localeData().weekdaysShort(this, format); 14143 }); 14144 14145 addFormatToken('dddd', 0, 0, function (format) { 14146 return this.localeData().weekdays(this, format); 14147 }); 14148 14149 addFormatToken('e', 0, 0, 'weekday'); 14150 addFormatToken('E', 0, 0, 'isoWeekday'); 14151 14152 // ALIASES 14153 14154 addUnitAlias('day', 'd'); 14155 addUnitAlias('weekday', 'e'); 14156 addUnitAlias('isoWeekday', 'E'); 14157 14158 // PRIORITY 14159 addUnitPriority('day', 11); 14160 addUnitPriority('weekday', 11); 14161 addUnitPriority('isoWeekday', 11); 14162 14163 // PARSING 14164 14165 addRegexToken('d', match1to2); 14166 addRegexToken('e', match1to2); 14167 addRegexToken('E', match1to2); 14168 addRegexToken('dd', function (isStrict, locale) { 14169 return locale.weekdaysMinRegex(isStrict); 14170 }); 14171 addRegexToken('ddd', function (isStrict, locale) { 14172 return locale.weekdaysShortRegex(isStrict); 14173 }); 14174 addRegexToken('dddd', function (isStrict, locale) { 14175 return locale.weekdaysRegex(isStrict); 14176 }); 14177 14178 addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { 14179 var weekday = config._locale.weekdaysParse(input, token, config._strict); 14180 // if we didn't get a weekday name, mark the date as invalid 14181 if (weekday != null) { 14182 week.d = weekday; 14183 } else { 14184 getParsingFlags(config).invalidWeekday = input; 14185 } 14186 }); 14187 14188 addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { 14189 week[token] = toInt(input); 14190 }); 14191 14192 // HELPERS 14193 14194 function parseWeekday(input, locale) { 14195 if (typeof input !== 'string') { 14196 return input; 14197 } 14198 14199 if (!isNaN(input)) { 14200 return parseInt(input, 10); 14201 } 14202 14203 input = locale.weekdaysParse(input); 14204 if (typeof input === 'number') { 14205 return input; 14206 } 14207 14208 return null; 14209 } 14210 14211 function parseIsoWeekday(input, locale) { 14212 if (typeof input === 'string') { 14213 return locale.weekdaysParse(input) % 7 || 7; 14214 } 14215 return isNaN(input) ? null : input; 14216 } 14217 14218 // LOCALES 14219 function shiftWeekdays (ws, n) { 14220 return ws.slice(n, 7).concat(ws.slice(0, n)); 14221 } 14222 14223 var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); 14224 function localeWeekdays (m, format) { 14225 var weekdays = isArray(this._weekdays) ? this._weekdays : 14226 this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone']; 14227 return (m === true) ? shiftWeekdays(weekdays, this._week.dow) 14228 : (m) ? weekdays[m.day()] : weekdays; 14229 } 14230 14231 var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); 14232 function localeWeekdaysShort (m) { 14233 return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow) 14234 : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; 14235 } 14236 14237 var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); 14238 function localeWeekdaysMin (m) { 14239 return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow) 14240 : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; 14241 } 14242 14243 function handleStrictParse$1(weekdayName, format, strict) { 14244 var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); 14245 if (!this._weekdaysParse) { 14246 this._weekdaysParse = []; 14247 this._shortWeekdaysParse = []; 14248 this._minWeekdaysParse = []; 14249 14250 for (i = 0; i < 7; ++i) { 14251 mom = createUTC([2000, 1]).day(i); 14252 this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); 14253 this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); 14254 this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); 14255 } 14256 } 14257 14258 if (strict) { 14259 if (format === 'dddd') { 14260 ii = indexOf.call(this._weekdaysParse, llc); 14261 return ii !== -1 ? ii : null; 14262 } else if (format === 'ddd') { 14263 ii = indexOf.call(this._shortWeekdaysParse, llc); 14264 return ii !== -1 ? ii : null; 14265 } else { 14266 ii = indexOf.call(this._minWeekdaysParse, llc); 14267 return ii !== -1 ? ii : null; 14268 } 14269 } else { 14270 if (format === 'dddd') { 14271 ii = indexOf.call(this._weekdaysParse, llc); 14272 if (ii !== -1) { 14273 return ii; 14274 } 14275 ii = indexOf.call(this._shortWeekdaysParse, llc); 14276 if (ii !== -1) { 14277 return ii; 14278 } 14279 ii = indexOf.call(this._minWeekdaysParse, llc); 14280 return ii !== -1 ? ii : null; 14281 } else if (format === 'ddd') { 14282 ii = indexOf.call(this._shortWeekdaysParse, llc); 14283 if (ii !== -1) { 14284 return ii; 14285 } 14286 ii = indexOf.call(this._weekdaysParse, llc); 14287 if (ii !== -1) { 14288 return ii; 14289 } 14290 ii = indexOf.call(this._minWeekdaysParse, llc); 14291 return ii !== -1 ? ii : null; 14292 } else { 14293 ii = indexOf.call(this._minWeekdaysParse, llc); 14294 if (ii !== -1) { 14295 return ii; 14296 } 14297 ii = indexOf.call(this._weekdaysParse, llc); 14298 if (ii !== -1) { 14299 return ii; 14300 } 14301 ii = indexOf.call(this._shortWeekdaysParse, llc); 14302 return ii !== -1 ? ii : null; 14303 } 14304 } 14305 } 14306 14307 function localeWeekdaysParse (weekdayName, format, strict) { 14308 var i, mom, regex; 14309 14310 if (this._weekdaysParseExact) { 14311 return handleStrictParse$1.call(this, weekdayName, format, strict); 14312 } 14313 14314 if (!this._weekdaysParse) { 14315 this._weekdaysParse = []; 14316 this._minWeekdaysParse = []; 14317 this._shortWeekdaysParse = []; 14318 this._fullWeekdaysParse = []; 14319 } 14320 14321 for (i = 0; i < 7; i++) { 14322 // make the regex if we don't have it already 14323 14324 mom = createUTC([2000, 1]).day(i); 14325 if (strict && !this._fullWeekdaysParse[i]) { 14326 this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); 14327 this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); 14328 this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); 14329 } 14330 if (!this._weekdaysParse[i]) { 14331 regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); 14332 this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); 14333 } 14334 // test the regex 14335 if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { 14336 return i; 14337 } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { 14338 return i; 14339 } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { 14340 return i; 14341 } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { 14342 return i; 14343 } 14344 } 14345 } 14346 14347 // MOMENTS 14348 14349 function getSetDayOfWeek (input) { 14350 if (!this.isValid()) { 14351 return input != null ? this : NaN; 14352 } 14353 var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); 14354 if (input != null) { 14355 input = parseWeekday(input, this.localeData()); 14356 return this.add(input - day, 'd'); 14357 } else { 14358 return day; 14359 } 14360 } 14361 14362 function getSetLocaleDayOfWeek (input) { 14363 if (!this.isValid()) { 14364 return input != null ? this : NaN; 14365 } 14366 var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; 14367 return input == null ? weekday : this.add(input - weekday, 'd'); 14368 } 14369 14370 function getSetISODayOfWeek (input) { 14371 if (!this.isValid()) { 14372 return input != null ? this : NaN; 14373 } 14374 14375 // behaves the same as moment#day except 14376 // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) 14377 // as a setter, sunday should belong to the previous week. 14378 14379 if (input != null) { 14380 var weekday = parseIsoWeekday(input, this.localeData()); 14381 return this.day(this.day() % 7 ? weekday : weekday - 7); 14382 } else { 14383 return this.day() || 7; 14384 } 14385 } 14386 14387 var defaultWeekdaysRegex = matchWord; 14388 function weekdaysRegex (isStrict) { 14389 if (this._weekdaysParseExact) { 14390 if (!hasOwnProp(this, '_weekdaysRegex')) { 14391 computeWeekdaysParse.call(this); 14392 } 14393 if (isStrict) { 14394 return this._weekdaysStrictRegex; 14395 } else { 14396 return this._weekdaysRegex; 14397 } 14398 } else { 14399 if (!hasOwnProp(this, '_weekdaysRegex')) { 14400 this._weekdaysRegex = defaultWeekdaysRegex; 14401 } 14402 return this._weekdaysStrictRegex && isStrict ? 14403 this._weekdaysStrictRegex : this._weekdaysRegex; 14404 } 14405 } 14406 14407 var defaultWeekdaysShortRegex = matchWord; 14408 function weekdaysShortRegex (isStrict) { 14409 if (this._weekdaysParseExact) { 14410 if (!hasOwnProp(this, '_weekdaysRegex')) { 14411 computeWeekdaysParse.call(this); 14412 } 14413 if (isStrict) { 14414 return this._weekdaysShortStrictRegex; 14415 } else { 14416 return this._weekdaysShortRegex; 14417 } 14418 } else { 14419 if (!hasOwnProp(this, '_weekdaysShortRegex')) { 14420 this._weekdaysShortRegex = defaultWeekdaysShortRegex; 14421 } 14422 return this._weekdaysShortStrictRegex && isStrict ? 14423 this._weekdaysShortStrictRegex : this._weekdaysShortRegex; 14424 } 14425 } 14426 14427 var defaultWeekdaysMinRegex = matchWord; 14428 function weekdaysMinRegex (isStrict) { 14429 if (this._weekdaysParseExact) { 14430 if (!hasOwnProp(this, '_weekdaysRegex')) { 14431 computeWeekdaysParse.call(this); 14432 } 14433 if (isStrict) { 14434 return this._weekdaysMinStrictRegex; 14435 } else { 14436 return this._weekdaysMinRegex; 14437 } 14438 } else { 14439 if (!hasOwnProp(this, '_weekdaysMinRegex')) { 14440 this._weekdaysMinRegex = defaultWeekdaysMinRegex; 14441 } 14442 return this._weekdaysMinStrictRegex && isStrict ? 14443 this._weekdaysMinStrictRegex : this._weekdaysMinRegex; 14444 } 14445 } 14446 14447 14448 function computeWeekdaysParse () { 14449 function cmpLenRev(a, b) { 14450 return b.length - a.length; 14451 } 14452 14453 var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], 14454 i, mom, minp, shortp, longp; 14455 for (i = 0; i < 7; i++) { 14456 // make the regex if we don't have it already 14457 mom = createUTC([2000, 1]).day(i); 14458 minp = this.weekdaysMin(mom, ''); 14459 shortp = this.weekdaysShort(mom, ''); 14460 longp = this.weekdays(mom, ''); 14461 minPieces.push(minp); 14462 shortPieces.push(shortp); 14463 longPieces.push(longp); 14464 mixedPieces.push(minp); 14465 mixedPieces.push(shortp); 14466 mixedPieces.push(longp); 14467 } 14468 // Sorting makes sure if one weekday (or abbr) is a prefix of another it 14469 // will match the longer piece. 14470 minPieces.sort(cmpLenRev); 14471 shortPieces.sort(cmpLenRev); 14472 longPieces.sort(cmpLenRev); 14473 mixedPieces.sort(cmpLenRev); 14474 for (i = 0; i < 7; i++) { 14475 shortPieces[i] = regexEscape(shortPieces[i]); 14476 longPieces[i] = regexEscape(longPieces[i]); 14477 mixedPieces[i] = regexEscape(mixedPieces[i]); 14478 } 14479 14480 this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); 14481 this._weekdaysShortRegex = this._weekdaysRegex; 14482 this._weekdaysMinRegex = this._weekdaysRegex; 14483 14484 this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); 14485 this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); 14486 this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); 14487 } 14488 14489 // FORMATTING 14490 14491 function hFormat() { 14492 return this.hours() % 12 || 12; 14493 } 14494 14495 function kFormat() { 14496 return this.hours() || 24; 14497 } 14498 14499 addFormatToken('H', ['HH', 2], 0, 'hour'); 14500 addFormatToken('h', ['hh', 2], 0, hFormat); 14501 addFormatToken('k', ['kk', 2], 0, kFormat); 14502 14503 addFormatToken('hmm', 0, 0, function () { 14504 return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); 14505 }); 14506 14507 addFormatToken('hmmss', 0, 0, function () { 14508 return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + 14509 zeroFill(this.seconds(), 2); 14510 }); 14511 14512 addFormatToken('Hmm', 0, 0, function () { 14513 return '' + this.hours() + zeroFill(this.minutes(), 2); 14514 }); 14515 14516 addFormatToken('Hmmss', 0, 0, function () { 14517 return '' + this.hours() + zeroFill(this.minutes(), 2) + 14518 zeroFill(this.seconds(), 2); 14519 }); 14520 14521 function meridiem (token, lowercase) { 14522 addFormatToken(token, 0, 0, function () { 14523 return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); 14524 }); 14525 } 14526 14527 meridiem('a', true); 14528 meridiem('A', false); 14529 14530 // ALIASES 14531 14532 addUnitAlias('hour', 'h'); 14533 14534 // PRIORITY 14535 addUnitPriority('hour', 13); 14536 14537 // PARSING 14538 14539 function matchMeridiem (isStrict, locale) { 14540 return locale._meridiemParse; 14541 } 14542 14543 addRegexToken('a', matchMeridiem); 14544 addRegexToken('A', matchMeridiem); 14545 addRegexToken('H', match1to2); 14546 addRegexToken('h', match1to2); 14547 addRegexToken('k', match1to2); 14548 addRegexToken('HH', match1to2, match2); 14549 addRegexToken('hh', match1to2, match2); 14550 addRegexToken('kk', match1to2, match2); 14551 14552 addRegexToken('hmm', match3to4); 14553 addRegexToken('hmmss', match5to6); 14554 addRegexToken('Hmm', match3to4); 14555 addRegexToken('Hmmss', match5to6); 14556 14557 addParseToken(['H', 'HH'], HOUR); 14558 addParseToken(['k', 'kk'], function (input, array, config) { 14559 var kInput = toInt(input); 14560 array[HOUR] = kInput === 24 ? 0 : kInput; 14561 }); 14562 addParseToken(['a', 'A'], function (input, array, config) { 14563 config._isPm = config._locale.isPM(input); 14564 config._meridiem = input; 14565 }); 14566 addParseToken(['h', 'hh'], function (input, array, config) { 14567 array[HOUR] = toInt(input); 14568 getParsingFlags(config).bigHour = true; 14569 }); 14570 addParseToken('hmm', function (input, array, config) { 14571 var pos = input.length - 2; 14572 array[HOUR] = toInt(input.substr(0, pos)); 14573 array[MINUTE] = toInt(input.substr(pos)); 14574 getParsingFlags(config).bigHour = true; 14575 }); 14576 addParseToken('hmmss', function (input, array, config) { 14577 var pos1 = input.length - 4; 14578 var pos2 = input.length - 2; 14579 array[HOUR] = toInt(input.substr(0, pos1)); 14580 array[MINUTE] = toInt(input.substr(pos1, 2)); 14581 array[SECOND] = toInt(input.substr(pos2)); 14582 getParsingFlags(config).bigHour = true; 14583 }); 14584 addParseToken('Hmm', function (input, array, config) { 14585 var pos = input.length - 2; 14586 array[HOUR] = toInt(input.substr(0, pos)); 14587 array[MINUTE] = toInt(input.substr(pos)); 14588 }); 14589 addParseToken('Hmmss', function (input, array, config) { 14590 var pos1 = input.length - 4; 14591 var pos2 = input.length - 2; 14592 array[HOUR] = toInt(input.substr(0, pos1)); 14593 array[MINUTE] = toInt(input.substr(pos1, 2)); 14594 array[SECOND] = toInt(input.substr(pos2)); 14595 }); 14596 14597 // LOCALES 14598 14599 function localeIsPM (input) { 14600 // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing str
vendor: 11,105 bytes, lines 14600-14916
14600ings like arrays 14601 // Using charAt should be more compatible. 14602 return ((input + '').toLowerCase().charAt(0) === 'p'); 14603 } 14604 14605 var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; 14606 function localeMeridiem (hours, minutes, isLower) { 14607 if (hours > 11) { 14608 return isLower ? 'pm' : 'PM'; 14609 } else { 14610 return isLower ? 'am' : 'AM'; 14611 } 14612 } 14613 14614 14615 // MOMENTS 14616 14617 // Setting the hour should keep the time, because the user explicitly 14618 // specified which hour they want. So trying to maintain the same hour (in 14619 // a new timezone) makes sense. Adding/subtracting hours does not follow 14620 // this rule. 14621 var getSetHour = makeGetSet('Hours', true); 14622 14623 var baseConfig = { 14624 calendar: defaultCalendar, 14625 longDateFormat: defaultLongDateFormat, 14626 invalidDate: defaultInvalidDate, 14627 ordinal: defaultOrdinal, 14628 dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, 14629 relativeTime: defaultRelativeTime, 14630 14631 months: defaultLocaleMonths, 14632 monthsShort: defaultLocaleMonthsShort, 14633 14634 week: defaultLocaleWeek, 14635 14636 weekdays: defaultLocaleWeekdays, 14637 weekdaysMin: defaultLocaleWeekdaysMin, 14638 weekdaysShort: defaultLocaleWeekdaysShort, 14639 14640 meridiemParse: defaultLocaleMeridiemParse 14641 }; 14642 14643 // internal storage for locale config files 14644 var locales = {}; 14645 var localeFamilies = {}; 14646 var globalLocale; 14647 14648 function normalizeLocale(key) { 14649 return key ? key.toLowerCase().replace('_', '-') : key; 14650 } 14651 14652 // pick the locale from the array 14653 // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each 14654 // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root 14655 function chooseLocale(names) { 14656 var i = 0, j, next, locale, split; 14657 14658 while (i < names.length) { 14659 split = normalizeLocale(names[i]).split('-'); 14660 j = split.length; 14661 next = normalizeLocale(names[i + 1]); 14662 next = next ? next.split('-') : null; 14663 while (j > 0) { 14664 locale = loadLocale(split.slice(0, j).join('-')); 14665 if (locale) { 14666 return locale; 14667 } 14668 if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { 14669 //the next array item is better than a shallower substring of this one 14670 break; 14671 } 14672 j--; 14673 } 14674 i++; 14675 } 14676 return globalLocale; 14677 } 14678 14679 function loadLocale(name) { 14680 var oldLocale = null; 14681 // TODO: Find a better way to register and load all the locales in Node 14682 if (!locales[name] && (typeof module !== 'undefined') && 14683 module && module.exports) { 14684 try { 14685 oldLocale = globalLocale._abbr; 14686 var aliasedRequire = require; 14687 aliasedRequire('./locale/' + name); 14688 getSetGlobalLocale(oldLocale); 14689 } catch (e) {} 14690 } 14691 return locales[name]; 14692 } 14693 14694 // This function will load locale and then set the global locale. If 14695 // no arguments are passed in, it will simply return the current global 14696 // locale key. 14697 function getSetGlobalLocale (key, values) { 14698 var data; 14699 if (key) { 14700 if (isUndefined(values)) { 14701 data = getLocale(key); 14702 } 14703 else { 14704 data = defineLocale(key, values); 14705 } 14706 14707 if (data) { 14708 // moment.duration._locale = moment._locale = data; 14709 globalLocale = data; 14710 } 14711 else { 14712 if ((typeof console !== 'undefined') && console.warn) { 14713 //warn user if arguments are passed but the locale could not be set 14714 console.warn('Locale ' + key + ' not found. Did you forget to load it?'); 14715 } 14716 } 14717 } 14718 14719 return globalLocale._abbr; 14720 } 14721 14722 function defineLocale (name, config) { 14723 if (config !== null) { 14724 var locale, parentConfig = baseConfig; 14725 config.abbr = name; 14726 if (locales[name] != null) { 14727 deprecateSimple('defineLocaleOverride', 14728 'use moment.updateLocale(localeName, config) to change ' + 14729 'an existing locale. moment.defineLocale(localeName, ' + 14730 'config) should only be used for creating a new locale ' + 14731 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); 14732 parentConfig = locales[name]._config; 14733 } else if (config.parentLocale != null) { 14734 if (locales[config.parentLocale] != null) { 14735 parentConfig = locales[config.parentLocale]._config; 14736 } else { 14737 locale = loadLocale(config.parentLocale); 14738 if (locale != null) { 14739 parentConfig = locale._config; 14740 } else { 14741 if (!localeFamilies[config.parentLocale]) { 14742 localeFamilies[config.parentLocale] = []; 14743 } 14744 localeFamilies[config.parentLocale].push({ 14745 name: name, 14746 config: config 14747 }); 14748 return null; 14749 } 14750 } 14751 } 14752 locales[name] = new Locale(mergeConfigs(parentConfig, config)); 14753 14754 if (localeFamilies[name]) { 14755 localeFamilies[name].forEach(function (x) { 14756 defineLocale(x.name, x.config); 14757 }); 14758 } 14759 14760 // backwards compat for now: also set the locale 14761 // make sure we set the locale AFTER all child locales have been 14762 // created, so we won't end up with the child locale set. 14763 getSetGlobalLocale(name); 14764 14765 14766 return locales[name]; 14767 } else { 14768 // useful for testing 14769 delete locales[name]; 14770 return null; 14771 } 14772 } 14773 14774 function updateLocale(name, config) { 14775 if (config != null) { 14776 var locale, tmpLocale, parentConfig = baseConfig; 14777 // MERGE 14778 tmpLocale = loadLocale(name); 14779 if (tmpLocale != null) { 14780 parentConfig = tmpLocale._config; 14781 } 14782 config = mergeConfigs(parentConfig, config); 14783 locale = new Locale(config); 14784 locale.parentLocale = locales[name]; 14785 locales[name] = locale; 14786 14787 // backwards compat for now: also set the locale 14788 getSetGlobalLocale(name); 14789 } else { 14790 // pass null for config to unupdate, useful for tests 14791 if (locales[name] != null) { 14792 if (locales[name].parentLocale != null) { 14793 locales[name] = locales[name].parentLocale; 14794 } else if (locales[name] != null) { 14795 delete locales[name]; 14796 } 14797 } 14798 } 14799 return locales[name]; 14800 } 14801 14802 // returns locale data 14803 function getLocale (key) { 14804 var locale; 14805 14806 if (key && key._locale && key._locale._abbr) { 14807 key = key._locale._abbr; 14808 } 14809 14810 if (!key) { 14811 return globalLocale; 14812 } 14813 14814 if (!isArray(key)) { 14815 //short-circuit everything else 14816 locale = loadLocale(key); 14817 if (locale) { 14818 return locale; 14819 } 14820 key = [key]; 14821 } 14822 14823 return chooseLocale(key); 14824 } 14825 14826 function listLocales() { 14827 return keys(locales); 14828 } 14829 14830 function checkOverflow (m) { 14831 var overflow; 14832 var a = m._a; 14833 14834 if (a && getParsingFlags(m).overflow === -2) { 14835 overflow = 14836 a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : 14837 a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : 14838 a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : 14839 a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : 14840 a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : 14841 a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : 14842 -1; 14843 14844 if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { 14845 overflow = DATE; 14846 } 14847 if (getParsingFlags(m)._overflowWeeks && overflow === -1) { 14848 overflow = WEEK; 14849 } 14850 if (getParsingFlags(m)._overflowWeekday && overflow === -1) { 14851 overflow = WEEKDAY; 14852 } 14853 14854 getParsingFlags(m).overflow = overflow; 14855 } 14856 14857 return m; 14858 } 14859 14860 // Pick the first defined of two or three arguments. 14861 function defaults(a, b, c) { 14862 if (a != null) { 14863 return a; 14864 } 14865 if (b != null) { 14866 return b; 14867 } 14868 return c; 14869 } 14870 14871 function currentDateArray(config) { 14872 // hooks is actually the exported moment object 14873 var nowValue = new Date(hooks.now()); 14874 if (config._useUTC) { 14875 return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; 14876 } 14877 return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; 14878 } 14879 14880 // convert an array to a date. 14881 // the array should mirror the parameters below 14882 // note: all values past the year are optional and will default to the lowest possible value. 14883 // [year, month, day , hour, minute, second, millisecond] 14884 function configFromArray (config) { 14885 var i, date, input = [], currentDate, expectedWeekday, yearToUse; 14886 14887 if (config._d) { 14888 return; 14889 } 14890 14891 currentDate = currentDateArray(config); 14892 14893 //compute day of the year from weeks and weekdays 14894 if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { 14895 dayOfYearFromWeekInfo(config); 14896 } 14897 14898 //if the day of the year is set, figure out what it is 14899 if (config._dayOfYear != null) { 14900 yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); 14901 14902 if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { 14903 getParsingFlags(config)._overflowDayOfYear = true; 14904 } 14905 14906 date = createUTCDate(yearToUse, 0, config._dayOfYear); 14907 config._a[MONTH] = date.getUTCMonth(); 14908 config._a[DATE] = date.getUTCDate(); 14909 } 14910 14911 // Default to current date. 14912 // * if no year, month, day of month are given, default to today 14913 // * if day of month is given, default month and year 14914 // * if month is given, default only year 14915 // * if year is given, don't default anything 14916 for (i = 0; i < 3 && config._a[i] == null; ++i) {
vendor: 83,307 bytes, lines 14917-17438
14917 config._a[i] = input[i] = currentDate[i]; 14918 } 14919 14920 // Zero out whatever was not defaulted, including time 14921 for (; i < 7; i++) { 14922 config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; 14923 } 14924 14925 // Check for 24:00:00.000 14926 if (config._a[HOUR] === 24 && 14927 config._a[MINUTE] === 0 && 14928 config._a[SECOND] === 0 && 14929 config._a[MILLISECOND] === 0) { 14930 config._nextDay = true; 14931 config._a[HOUR] = 0; 14932 } 14933 14934 config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); 14935 expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); 14936 14937 // Apply timezone offset from input. The actual utcOffset can be changed 14938 // with parseZone. 14939 if (config._tzm != null) { 14940 config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); 14941 } 14942 14943 if (config._nextDay) { 14944 config._a[HOUR] = 24; 14945 } 14946 14947 // check for mismatching day of week 14948 if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { 14949 getParsingFlags(config).weekdayMismatch = true; 14950 } 14951 } 14952 14953 function dayOfYearFromWeekInfo(config) { 14954 var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; 14955 14956 w = config._w; 14957 if (w.GG != null || w.W != null || w.E != null) { 14958 dow = 1; 14959 doy = 4; 14960 14961 // TODO: We need to take the current isoWeekYear, but that depends on 14962 // how we interpret now (local, utc, fixed offset). So create 14963 // a now version of current config (take local/utc/offset flags, and 14964 // create now). 14965 weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); 14966 week = defaults(w.W, 1); 14967 weekday = defaults(w.E, 1); 14968 if (weekday < 1 || weekday > 7) { 14969 weekdayOverflow = true; 14970 } 14971 } else { 14972 dow = config._locale._week.dow; 14973 doy = config._locale._week.doy; 14974 14975 var curWeek = weekOfYear(createLocal(), dow, doy); 14976 14977 weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); 14978 14979 // Default to current week. 14980 week = defaults(w.w, curWeek.week); 14981 14982 if (w.d != null) { 14983 // weekday -- low day numbers are considered next week 14984 weekday = w.d; 14985 if (weekday < 0 || weekday > 6) { 14986 weekdayOverflow = true; 14987 } 14988 } else if (w.e != null) { 14989 // local weekday -- counting starts from beginning of week 14990 weekday = w.e + dow; 14991 if (w.e < 0 || w.e > 6) { 14992 weekdayOverflow = true; 14993 } 14994 } else { 14995 // default to beginning of week 14996 weekday = dow; 14997 } 14998 } 14999 if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { 15000 getParsingFlags(config)._overflowWeeks = true; 15001 } else if (weekdayOverflow != null) { 15002 getParsingFlags(config)._overflowWeekday = true; 15003 } else { 15004 temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); 15005 config._a[YEAR] = temp.year; 15006 config._dayOfYear = temp.dayOfYear; 15007 } 15008 } 15009 15010 // iso 8601 regex 15011 // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) 15012 var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; 15013 var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; 15014 15015 var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; 15016 15017 var isoDates = [ 15018 ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], 15019 ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], 15020 ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], 15021 ['GGGG-[W]WW', /\d{4}-W\d\d/, false], 15022 ['YYYY-DDD', /\d{4}-\d{3}/], 15023 ['YYYY-MM', /\d{4}-\d\d/, false], 15024 ['YYYYYYMMDD', /[+-]\d{10}/], 15025 ['YYYYMMDD', /\d{8}/], 15026 // YYYYMM is NOT allowed by the standard 15027 ['GGGG[W]WWE', /\d{4}W\d{3}/], 15028 ['GGGG[W]WW', /\d{4}W\d{2}/, false], 15029 ['YYYYDDD', /\d{7}/] 15030 ]; 15031 15032 // iso time formats and regexes 15033 var isoTimes = [ 15034 ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], 15035 ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], 15036 ['HH:mm:ss', /\d\d:\d\d:\d\d/], 15037 ['HH:mm', /\d\d:\d\d/], 15038 ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], 15039 ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], 15040 ['HHmmss', /\d\d\d\d\d\d/], 15041 ['HHmm', /\d\d\d\d/], 15042 ['HH', /\d\d/] 15043 ]; 15044 15045 var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; 15046 15047 // date from iso format 15048 function configFromISO(config) { 15049 var i, l, 15050 string = config._i, 15051 match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), 15052 allowTime, dateFormat, timeFormat, tzFormat; 15053 15054 if (match) { 15055 getParsingFlags(config).iso = true; 15056 15057 for (i = 0, l = isoDates.length; i < l; i++) { 15058 if (isoDates[i][1].exec(match[1])) { 15059 dateFormat = isoDates[i][0]; 15060 allowTime = isoDates[i][2] !== false; 15061 break; 15062 } 15063 } 15064 if (dateFormat == null) { 15065 config._isValid = false; 15066 return; 15067 } 15068 if (match[3]) { 15069 for (i = 0, l = isoTimes.length; i < l; i++) { 15070 if (isoTimes[i][1].exec(match[3])) { 15071 // match[2] should be 'T' or space 15072 timeFormat = (match[2] || ' ') + isoTimes[i][0]; 15073 break; 15074 } 15075 } 15076 if (timeFormat == null) { 15077 config._isValid = false; 15078 return; 15079 } 15080 } 15081 if (!allowTime && timeFormat != null) { 15082 config._isValid = false; 15083 return; 15084 } 15085 if (match[4]) { 15086 if (tzRegex.exec(match[4])) { 15087 tzFormat = 'Z'; 15088 } else { 15089 config._isValid = false; 15090 return; 15091 } 15092 } 15093 config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); 15094 configFromStringAndFormat(config); 15095 } else { 15096 config._isValid = false; 15097 } 15098 } 15099 15100 // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 15101 var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; 15102 15103 function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { 15104 var result = [ 15105 untruncateYear(yearStr), 15106 defaultLocaleMonthsShort.indexOf(monthStr), 15107 parseInt(dayStr, 10), 15108 parseInt(hourStr, 10), 15109 parseInt(minuteStr, 10) 15110 ]; 15111 15112 if (secondStr) { 15113 result.push(parseInt(secondStr, 10)); 15114 } 15115 15116 return result; 15117 } 15118 15119 function untruncateYear(yearStr) { 15120 var year = parseInt(yearStr, 10); 15121 if (year <= 49) { 15122 return 2000 + year; 15123 } else if (year <= 999) { 15124 return 1900 + year; 15125 } 15126 return year; 15127 } 15128 15129 function preprocessRFC2822(s) { 15130 // Remove comments and folding whitespace and replace multiple-spaces with a single space 15131 return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); 15132 } 15133 15134 function checkWeekday(weekdayStr, parsedInput, config) { 15135 if (weekdayStr) { 15136 // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. 15137 var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), 15138 weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); 15139 if (weekdayProvided !== weekdayActual) { 15140 getParsingFlags(config).weekdayMismatch = true; 15141 config._isValid = false; 15142 return false; 15143 } 15144 } 15145 return true; 15146 } 15147 15148 var obsOffsets = { 15149 UT: 0, 15150 GMT: 0, 15151 EDT: -4 * 60, 15152 EST: -5 * 60, 15153 CDT: -5 * 60, 15154 CST: -6 * 60, 15155 MDT: -6 * 60, 15156 MST: -7 * 60, 15157 PDT: -7 * 60, 15158 PST: -8 * 60 15159 }; 15160 15161 function calculateOffset(obsOffset, militaryOffset, numOffset) { 15162 if (obsOffset) { 15163 return obsOffsets[obsOffset]; 15164 } else if (militaryOffset) { 15165 // the only allowed military tz is Z 15166 return 0; 15167 } else { 15168 var hm = parseInt(numOffset, 10); 15169 var m = hm % 100, h = (hm - m) / 100; 15170 return h * 60 + m; 15171 } 15172 } 15173 15174 // date and time from ref 2822 format 15175 function configFromRFC2822(config) { 15176 var match = rfc2822.exec(preprocessRFC2822(config._i)); 15177 if (match) { 15178 var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); 15179 if (!checkWeekday(match[1], parsedArray, config)) { 15180 return; 15181 } 15182 15183 config._a = parsedArray; 15184 config._tzm = calculateOffset(match[8], match[9], match[10]); 15185 15186 config._d = createUTCDate.apply(null, config._a); 15187 config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); 15188 15189 getParsingFlags(config).rfc2822 = true; 15190 } else { 15191 config._isValid = false; 15192 } 15193 } 15194 15195 // date from iso format or fallback 15196 function configFromString(config) { 15197 var matched = aspNetJsonRegex.exec(config._i); 15198 15199 if (matched !== null) { 15200 config._d = new Date(+matched[1]); 15201 return; 15202 } 15203 15204 configFromISO(config); 15205 if (config._isValid === false) { 15206 delete config._isValid; 15207 } else { 15208 return; 15209 } 15210 15211 configFromRFC2822(config); 15212 if (config._isValid === false) { 15213 delete config._isValid; 15214 } else { 15215 return; 15216 } 15217 15218 // Final attempt, use Input Fallback 15219 hooks.createFromInputFallback(config); 15220 } 15221 15222 hooks.createFromInputFallback = deprecate( 15223 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 15224 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 15225 'discouraged and will be removed in an upcoming major release. Please refer to ' + 15226 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', 15227 function (config) { 15228 config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); 15229 } 15230 ); 15231 15232 // constant that refers to the ISO standard 15233 hooks.ISO_8601 = function () {}; 15234 15235 // constant that refers to the RFC 2822 form 15236 hooks.RFC_2822 = function () {}; 15237 15238 // date from string and format string 15239 function configFromStringAndFormat(config) { 15240 // TODO: Move this to another part of the creation flow to prevent circular deps 15241 if (config._f === hooks.ISO_8601) { 15242 configFromISO(config); 15243 return; 15244 } 15245 if (config._f === hooks.RFC_2822) { 15246 configFromRFC2822(config); 15247 return; 15248 } 15249 config._a = []; 15250 getParsingFlags(config).empty = true; 15251 15252 // This array is used to make a Date, either with `new Date` or `Date.UTC` 15253 var string = '' + config._i, 15254 i, parsedInput, tokens, token, skipped, 15255 stringLength = string.length, 15256 totalParsedInputLength = 0; 15257 15258 tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; 15259 15260 for (i = 0; i < tokens.length; i++) { 15261 token = tokens[i]; 15262 parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; 15263 // console.log('token', token, 'parsedInput', parsedInput, 15264 // 'regex', getParseRegexForToken(token, config)); 15265 if (parsedInput) { 15266 skipped = string.substr(0, string.indexOf(parsedInput)); 15267 if (skipped.length > 0) { 15268 getParsingFlags(config).unusedInput.push(skipped); 15269 } 15270 string = string.slice(string.indexOf(parsedInput) + parsedInput.length); 15271 totalParsedInputLength += parsedInput.length; 15272 } 15273 // don't parse if it's not a known token 15274 if (formatTokenFunctions[token]) { 15275 if (parsedInput) { 15276 getParsingFlags(config).empty = false; 15277 } 15278 else { 15279 getParsingFlags(config).unusedTokens.push(token); 15280 } 15281 addTimeToArrayFromToken(token, parsedInput, config); 15282 } 15283 else if (config._strict && !parsedInput) { 15284 getParsingFlags(config).unusedTokens.push(token); 15285 } 15286 } 15287 15288 // add remaining unparsed input length to the string 15289 getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; 15290 if (string.length > 0) { 15291 getParsingFlags(config).unusedInput.push(string); 15292 } 15293 15294 // clear _12h flag if hour is <= 12 15295 if (config._a[HOUR] <= 12 && 15296 getParsingFlags(config).bigHour === true && 15297 config._a[HOUR] > 0) { 15298 getParsingFlags(config).bigHour = undefined; 15299 } 15300 15301 getParsingFlags(config).parsedDateParts = config._a.slice(0); 15302 getParsingFlags(config).meridiem = config._meridiem; 15303 // handle meridiem 15304 config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); 15305 15306 configFromArray(config); 15307 checkOverflow(config); 15308 } 15309 15310 15311 function meridiemFixWrap (locale, hour, meridiem) { 15312 var isPm; 15313 15314 if (meridiem == null) { 15315 // nothing to do 15316 return hour; 15317 } 15318 if (locale.meridiemHour != null) { 15319 return locale.meridiemHour(hour, meridiem); 15320 } else if (locale.isPM != null) { 15321 // Fallback 15322 isPm = locale.isPM(meridiem); 15323 if (isPm && hour < 12) { 15324 hour += 12; 15325 } 15326 if (!isPm && hour === 12) { 15327 hour = 0; 15328 } 15329 return hour; 15330 } else { 15331 // this is not supposed to happen 15332 return hour; 15333 } 15334 } 15335 15336 // date from string and array of format strings 15337 function configFromStringAndArray(config) { 15338 var tempConfig, 15339 bestMoment, 15340 15341 scoreToBeat, 15342 i, 15343 currentScore; 15344 15345 if (config._f.length === 0) { 15346 getParsingFlags(config).invalidFormat = true; 15347 config._d = new Date(NaN); 15348 return; 15349 } 15350 15351 for (i = 0; i < config._f.length; i++) { 15352 currentScore = 0; 15353 tempConfig = copyConfig({}, config); 15354 if (config._useUTC != null) { 15355 tempConfig._useUTC = config._useUTC; 15356 } 15357 tempConfig._f = config._f[i]; 15358 configFromStringAndFormat(tempConfig); 15359 15360 if (!isValid(tempConfig)) { 15361 continue; 15362 } 15363 15364 // if there is any input that was not parsed add a penalty for that format 15365 currentScore += getParsingFlags(tempConfig).charsLeftOver; 15366 15367 //or tokens 15368 currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; 15369 15370 getParsingFlags(tempConfig).score = currentScore; 15371 15372 if (scoreToBeat == null || currentScore < scoreToBeat) { 15373 scoreToBeat = currentScore; 15374 bestMoment = tempConfig; 15375 } 15376 } 15377 15378 extend(config, bestMoment || tempConfig); 15379 } 15380 15381 function configFromObject(config) { 15382 if (config._d) { 15383 return; 15384 } 15385 15386 var i = normalizeObjectUnits(config._i); 15387 config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { 15388 return obj && parseInt(obj, 10); 15389 }); 15390 15391 configFromArray(config); 15392 } 15393 15394 function createFromConfig (config) { 15395 var res = new Moment(checkOverflow(prepareConfig(config))); 15396 if (res._nextDay) { 15397 // Adding is smart enough around DST 15398 res.add(1, 'd'); 15399 res._nextDay = undefined; 15400 } 15401 15402 return res; 15403 } 15404 15405 function prepareConfig (config) { 15406 var input = config._i, 15407 format = config._f; 15408 15409 config._locale = config._locale || getLocale(config._l); 15410 15411 if (input === null || (format === undefined && input === '')) { 15412 return createInvalid({nullInput: true}); 15413 } 15414 15415 if (typeof input === 'string') { 15416 config._i = input = config._locale.preparse(input); 15417 } 15418 15419 if (isMoment(input)) { 15420 return new Moment(checkOverflow(input)); 15421 } else if (isDate(input)) { 15422 config._d = input; 15423 } else if (isArray(format)) { 15424 configFromStringAndArray(config); 15425 } else if (format) { 15426 configFromStringAndFormat(config); 15427 } else { 15428 configFromInput(config); 15429 } 15430 15431 if (!isValid(config)) { 15432 config._d = null; 15433 } 15434 15435 return config; 15436 } 15437 15438 function configFromInput(config) { 15439 var input = config._i; 15440 if (isUndefined(input)) { 15441 config._d = new Date(hooks.now()); 15442 } else if (isDate(input)) { 15443 config._d = new Date(input.valueOf()); 15444 } else if (typeof input === 'string') { 15445 configFromString(config); 15446 } else if (isArray(input)) { 15447 config._a = map(input.slice(0), function (obj) { 15448 return parseInt(obj, 10); 15449 }); 15450 configFromArray(config); 15451 } else if (isObject(input)) { 15452 configFromObject(config); 15453 } else if (isNumber(input)) { 15454 // from milliseconds 15455 config._d = new Date(input); 15456 } else { 15457 hooks.createFromInputFallback(config); 15458 } 15459 } 15460 15461 function createLocalOrUTC (input, format, locale, strict, isUTC) { 15462 var c = {}; 15463 15464 if (locale === true || locale === false) { 15465 strict = locale; 15466 locale = undefined; 15467 } 15468 15469 if ((isObject(input) && isObjectEmpty(input)) || 15470 (isArray(input) && input.length === 0)) { 15471 input = undefined; 15472 } 15473 // object construction must be done this way. 15474 // https://github.com/moment/moment/issues/1423 15475 c._isAMomentObject = true; 15476 c._useUTC = c._isUTC = isUTC; 15477 c._l = locale; 15478 c._i = input; 15479 c._f = format; 15480 c._strict = strict; 15481 15482 return createFromConfig(c); 15483 } 15484 15485 function createLocal (input, format, locale, strict) { 15486 return createLocalOrUTC(input, format, locale, strict, false); 15487 } 15488 15489 var prototypeMin = deprecate( 15490 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', 15491 function () { 15492 var other = createLocal.apply(null, arguments); 15493 if (this.isValid() && other.isValid()) { 15494 return other < this ? this : other; 15495 } else { 15496 return createInvalid(); 15497 } 15498 } 15499 ); 15500 15501 var prototypeMax = deprecate( 15502 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', 15503 function () { 15504 var other = createLocal.apply(null, arguments); 15505 if (this.isValid() && other.isValid()) { 15506 return other > this ? this : other; 15507 } else { 15508 return createInvalid(); 15509 } 15510 } 15511 ); 15512 15513 // Pick a moment m from moments so that m[fn](other) is true for all 15514 // other. This relies on the function fn to be transitive. 15515 // 15516 // moments should either be an array of moment objects or an array, whose 15517 // first element is an array of moment objects. 15518 function pickBy(fn, moments) { 15519 var res, i; 15520 if (moments.length === 1 && isArray(moments[0])) { 15521 moments = moments[0]; 15522 } 15523 if (!moments.length) { 15524 return createLocal(); 15525 } 15526 res = moments[0]; 15527 for (i = 1; i < moments.length; ++i) { 15528 if (!moments[i].isValid() || moments[i][fn](res)) { 15529 res = moments[i]; 15530 } 15531 } 15532 return res; 15533 } 15534 15535 // TODO: Use [].sort instead? 15536 function min () { 15537 var args = [].slice.call(arguments, 0); 15538 15539 return pickBy('isBefore', args); 15540 } 15541 15542 function max () { 15543 var args = [].slice.call(arguments, 0); 15544 15545 return pickBy('isAfter', args); 15546 } 15547 15548 var now = function () { 15549 return Date.now ? Date.now() : +(new Date()); 15550 }; 15551 15552 var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; 15553 15554 function isDurationValid(m) { 15555 for (var key in m) { 15556 if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { 15557 return false; 15558 } 15559 } 15560 15561 var unitHasDecimal = false; 15562 for (var i = 0; i < ordering.length; ++i) { 15563 if (m[ordering[i]]) { 15564 if (unitHasDecimal) { 15565 return false; // only allow non-integers for smallest unit 15566 } 15567 if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { 15568 unitHasDecimal = true; 15569 } 15570 } 15571 } 15572 15573 return true; 15574 } 15575 15576 function isValid$1() { 15577 return this._isValid; 15578 } 15579 15580 function createInvalid$1() { 15581 return createDuration(NaN); 15582 } 15583 15584 function Duration (duration) { 15585 var normalizedInput = normalizeObjectUnits(duration), 15586 years = normalizedInput.year || 0, 15587 quarters = normalizedInput.quarter || 0, 15588 months = normalizedInput.month || 0, 15589 weeks = normalizedInput.week || normalizedInput.isoWeek || 0, 15590 days = normalizedInput.day || 0, 15591 hours = normalizedInput.hour || 0, 15592 minutes = normalizedInput.minute || 0, 15593 seconds = normalizedInput.second || 0, 15594 milliseconds = normalizedInput.millisecond || 0; 15595 15596 this._isValid = isDurationValid(normalizedInput); 15597 15598 // representation for dateAddRemove 15599 this._milliseconds = +milliseconds + 15600 seconds * 1e3 + // 1000 15601 minutes * 6e4 + // 1000 * 60 15602 hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 15603 // Because of dateAddRemove treats 24 hours as different from a 15604 // day when working around DST, we need to store them separately 15605 this._days = +days + 15606 weeks * 7; 15607 // It is impossible to translate months into days without knowing 15608 // which months you are are talking about, so we have to store 15609 // it separately. 15610 this._months = +months + 15611 quarters * 3 + 15612 years * 12; 15613 15614 this._data = {}; 15615 15616 this._locale = getLocale(); 15617 15618 this._bubble(); 15619 } 15620 15621 function isDuration (obj) { 15622 return obj instanceof Duration; 15623 } 15624 15625 function absRound (number) { 15626 if (number < 0) { 15627 return Math.round(-1 * number) * -1; 15628 } else { 15629 return Math.round(number); 15630 } 15631 } 15632 15633 // FORMATTING 15634 15635 function offset (token, separator) { 15636 addFormatToken(token, 0, 0, function () { 15637 var offset = this.utcOffset(); 15638 var sign = '+'; 15639 if (offset < 0) { 15640 offset = -offset; 15641 sign = '-'; 15642 } 15643 return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); 15644 }); 15645 } 15646 15647 offset('Z', ':'); 15648 offset('ZZ', ''); 15649 15650 // PARSING 15651 15652 addRegexToken('Z', matchShortOffset); 15653 addRegexToken('ZZ', matchShortOffset); 15654 addParseToken(['Z', 'ZZ'], function (input, array, config) { 15655 config._useUTC = true; 15656 config._tzm = offsetFromString(matchShortOffset, input); 15657 }); 15658 15659 // HELPERS 15660 15661 // timezone chunker 15662 // '+10:00' > ['10', '00'] 15663 // '-1530' > ['-15', '30'] 15664 var chunkOffset = /([\+\-]|\d\d)/gi; 15665 15666 function offsetFromString(matcher, string) { 15667 var matches = (string || '').match(matcher); 15668 15669 if (matches === null) { 15670 return null; 15671 } 15672 15673 var chunk = matches[matches.length - 1] || []; 15674 var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; 15675 var minutes = +(parts[1] * 60) + toInt(parts[2]); 15676 15677 return minutes === 0 ? 15678 0 : 15679 parts[0] === '+' ? minutes : -minutes; 15680 } 15681 15682 // Return a moment from input, that is local/utc/zone equivalent to model. 15683 function cloneWithOffset(input, model) { 15684 var res, diff; 15685 if (model._isUTC) { 15686 res = model.clone(); 15687 diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); 15688 // Use low-level api, because this fn is low-level api. 15689 res._d.setTime(res._d.valueOf() + diff); 15690 hooks.updateOffset(res, false); 15691 return res; 15692 } else { 15693 return createLocal(input).local(); 15694 } 15695 } 15696 15697 function getDateOffset (m) { 15698 // On Firefox.24 Date#getTimezoneOffset returns a floating point. 15699 // https://github.com/moment/moment/pull/1871 15700 return -Math.round(m._d.getTimezoneOffset() / 15) * 15; 15701 } 15702 15703 // HOOKS 15704 15705 // This function will be called whenever a moment is mutated. 15706 // It is intended to keep the offset in sync with the timezone. 15707 hooks.updateOffset = function () {}; 15708 15709 // MOMENTS 15710 15711 // keepLocalTime = true means only change the timezone, without 15712 // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> 15713 // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset 15714 // +0200, so we adjust the time as needed, to be valid. 15715 // 15716 // Keeping the time actually adds/subtracts (one hour) 15717 // from the actual represented time. That is why we call updateOffset 15718 // a second time. In case it wants us to change the offset again 15719 // _changeInProgress == true case, then we have to adjust, because 15720 // there is no such time in the given timezone. 15721 function getSetOffset (input, keepLocalTime, keepMinutes) { 15722 var offset = this._offset || 0, 15723 localAdjust; 15724 if (!this.isValid()) { 15725 return input != null ? this : NaN; 15726 } 15727 if (input != null) { 15728 if (typeof input === 'string') { 15729 input = offsetFromString(matchShortOffset, input); 15730 if (input === null) { 15731 return this; 15732 } 15733 } else if (Math.abs(input) < 16 && !keepMinutes) { 15734 input = input * 60; 15735 } 15736 if (!this._isUTC && keepLocalTime) { 15737 localAdjust = getDateOffset(this); 15738 } 15739 this._offset = input; 15740 this._isUTC = true; 15741 if (localAdjust != null) { 15742 this.add(localAdjust, 'm'); 15743 } 15744 if (offset !== input) { 15745 if (!keepLocalTime || this._changeInProgress) { 15746 addSubtract(this, createDuration(input - offset, 'm'), 1, false); 15747 } else if (!this._changeInProgress) { 15748 this._changeInProgress = true; 15749 hooks.updateOffset(this, true); 15750 this._changeInProgress = null; 15751 } 15752 } 15753 return this; 15754 } else { 15755 return this._isUTC ? offset : getDateOffset(this); 15756 } 15757 } 15758 15759 function getSetZone (input, keepLocalTime) { 15760 if (input != null) { 15761 if (typeof input !== 'string') { 15762 input = -input; 15763 } 15764 15765 this.utcOffset(input, keepLocalTime); 15766 15767 return this; 15768 } else { 15769 return -this.utcOffset(); 15770 } 15771 } 15772 15773 function setOffsetToUTC (keepLocalTime) { 15774 return this.utcOffset(0, keepLocalTime); 15775 } 15776 15777 function setOffsetToLocal (keepLocalTime) { 15778 if (this._isUTC) { 15779 this.utcOffset(0, keepLocalTime); 15780 this._isUTC = false; 15781 15782 if (keepLocalTime) { 15783 this.subtract(getDateOffset(this), 'm'); 15784 } 15785 } 15786 return this; 15787 } 15788 15789 function setOffsetToParsedOffset () { 15790 if (this._tzm != null) { 15791 this.utcOffset(this._tzm, false, true); 15792 } else if (typeof this._i === 'string') { 15793 var tZone = offsetFromString(matchOffset, this._i); 15794 if (tZone != null) { 15795 this.utcOffset(tZone); 15796 } 15797 else { 15798 this.utcOffset(0, true); 15799 } 15800 } 15801 return this; 15802 } 15803 15804 function hasAlignedHourOffset (input) { 15805 if (!this.isValid()) { 15806 return false; 15807 } 15808 input = input ? createLocal(input).utcOffset() : 0; 15809 15810 return (this.utcOffset() - input) % 60 === 0; 15811 } 15812 15813 function isDaylightSavingTime () { 15814 return ( 15815 this.utcOffset() > this.clone().month(0).utcOffset() || 15816 this.utcOffset() > this.clone().month(5).utcOffset() 15817 ); 15818 } 15819 15820 function isDaylightSavingTimeShifted () { 15821 if (!isUndefined(this._isDSTShifted)) { 15822 return this._isDSTShifted; 15823 } 15824 15825 var c = {}; 15826 15827 copyConfig(c, this); 15828 c = prepareConfig(c); 15829 15830 if (c._a) { 15831 var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); 15832 this._isDSTShifted = this.isValid() && 15833 compareArrays(c._a, other.toArray()) > 0; 15834 } else { 15835 this._isDSTShifted = false; 15836 } 15837 15838 return this._isDSTShifted; 15839 } 15840 15841 function isLocal () { 15842 return this.isValid() ? !this._isUTC : false; 15843 } 15844 15845 function isUtcOffset () { 15846 return this.isValid() ? this._isUTC : false; 15847 } 15848 15849 function isUtc () { 15850 return this.isValid() ? this._isUTC && this._offset === 0 : false; 15851 } 15852 15853 // ASP.NET json date format regex 15854 var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; 15855 15856 // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html 15857 // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere 15858 // and further modified to allow for strings containing both week and day 15859 var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; 15860 15861 function createDuration (input, key) { 15862 var duration = input, 15863 // matching against regexp is expensive, do it on demand 15864 match = null, 15865 sign, 15866 ret, 15867 diffRes; 15868 15869 if (isDuration(input)) { 15870 duration = { 15871 ms : input._milliseconds, 15872 d : input._days, 15873 M : input._months 15874 }; 15875 } else if (isNumber(input)) { 15876 duration = {}; 15877 if (key) { 15878 duration[key] = input; 15879 } else { 15880 duration.milliseconds = input; 15881 } 15882 } else if (!!(match = aspNetRegex.exec(input))) { 15883 sign = (match[1] === '-') ? -1 : 1; 15884 duration = { 15885 y : 0, 15886 d : toInt(match[DATE]) * sign, 15887 h : toInt(match[HOUR]) * sign, 15888 m : toInt(match[MINUTE]) * sign, 15889 s : toInt(match[SECOND]) * sign, 15890 ms : toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match 15891 }; 15892 } else if (!!(match = isoRegex.exec(input))) { 15893 sign = (match[1] === '-') ? -1 : 1; 15894 duration = { 15895 y : parseIso(match[2], sign), 15896 M : parseIso(match[3], sign), 15897 w : parseIso(match[4], sign), 15898 d : parseIso(match[5], sign), 15899 h : parseIso(match[6], sign), 15900 m : parseIso(match[7], sign), 15901 s : parseIso(match[8], sign) 15902 }; 15903 } else if (duration == null) {// checks for null or undefined 15904 duration = {}; 15905 } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { 15906 diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); 15907 15908 duration = {}; 15909 duration.ms = diffRes.milliseconds; 15910 duration.M = diffRes.months; 15911 } 15912 15913 ret = new Duration(duration); 15914 15915 if (isDuration(input) && hasOwnProp(input, '_locale')) { 15916 ret._locale = input._locale; 15917 } 15918 15919 return ret; 15920 } 15921 15922 createDuration.fn = Duration.prototype; 15923 createDuration.invalid = createInvalid$1; 15924 15925 function parseIso (inp, sign) { 15926 // We'd normally use ~~inp for this, but unfortunately it also 15927 // converts floats to ints. 15928 // inp may be undefined, so careful calling replace on it. 15929 var res = inp && parseFloat(inp.replace(',', '.')); 15930 // apply sign while we're at it 15931 return (isNaN(res) ? 0 : res) * sign; 15932 } 15933 15934 function positiveMomentsDifference(base, other) { 15935 var res = {}; 15936 15937 res.months = other.month() - base.month() + 15938 (other.year() - base.year()) * 12; 15939 if (base.clone().add(res.months, 'M').isAfter(other)) { 15940 --res.months; 15941 } 15942 15943 res.milliseconds = +other - +(base.clone().add(res.months, 'M')); 15944 15945 return res; 15946 } 15947 15948 function momentsDifference(base, other) { 15949 var res; 15950 if (!(base.isValid() && other.isValid())) { 15951 return {milliseconds: 0, months: 0}; 15952 } 15953 15954 other = cloneWithOffset(other, base); 15955 if (base.isBefore(other)) { 15956 res = positiveMomentsDifference(base, other); 15957 } else { 15958 res = positiveMomentsDifference(other, base); 15959 res.milliseconds = -res.milliseconds; 15960 res.months = -res.months; 15961 } 15962 15963 return res; 15964 } 15965 15966 // TODO: remove 'name' arg after deprecation is removed 15967 function createAdder(direction, name) { 15968 return function (val, period) { 15969 var dur, tmp; 15970 //invert the arguments, but complain about it 15971 if (period !== null && !isNaN(+period)) { 15972 deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 15973 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); 15974 tmp = val; val = period; period = tmp; 15975 } 15976 15977 val = typeof val === 'string' ? +val : val; 15978 dur = createDuration(val, period); 15979 addSubtract(this, dur, direction); 15980 return this; 15981 }; 15982 } 15983 15984 function addSubtract (mom, duration, isAdding, updateOffset) { 15985 var milliseconds = duration._milliseconds, 15986 days = absRound(duration._days), 15987 months = absRound(duration._months); 15988 15989 if (!mom.isValid()) { 15990 // No op 15991 return; 15992 } 15993 15994 updateOffset = updateOffset == null ? true : updateOffset; 15995 15996 if (months) { 15997 setMonth(mom, get(mom, 'Month') + months * isAdding); 15998 } 15999 if (days) { 16000 set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); 16001 } 16002 if (milliseconds) { 16003 mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); 16004 } 16005 if (updateOffset) { 16006 hooks.updateOffset(mom, days || months); 16007 } 16008 } 16009 16010 var add = createAdder(1, 'add'); 16011 var subtract = createAdder(-1, 'subtract'); 16012 16013 function getCalendarFormat(myMoment, now) { 16014 var diff = myMoment.diff(now, 'days', true); 16015 return diff < -6 ? 'sameElse' : 16016 diff < -1 ? 'lastWeek' : 16017 diff < 0 ? 'lastDay' : 16018 diff < 1 ? 'sameDay' : 16019 diff < 2 ? 'nextDay' : 16020 diff < 7 ? 'nextWeek' : 'sameElse'; 16021 } 16022 16023 function calendar$1 (time, formats) { 16024 // We want to compare the start of today, vs this. 16025 // Getting start-of-today depends on whether we're local/utc/offset or not. 16026 var now = time || createLocal(), 16027 sod = cloneWithOffset(now, this).startOf('day'), 16028 format = hooks.calendarFormat(this, sod) || 'sameElse'; 16029 16030 var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); 16031 16032 return this.format(output || this.localeData().calendar(format, this, createLocal(now))); 16033 } 16034 16035 function clone () { 16036 return new Moment(this); 16037 } 16038 16039 function isAfter (input, units) { 16040 var localInput = isMoment(input) ? input : createLocal(input); 16041 if (!(this.isValid() && localInput.isValid())) { 16042 return false; 16043 } 16044 units = normalizeUnits(units) || 'millisecond'; 16045 if (units === 'millisecond') { 16046 return this.valueOf() > localInput.valueOf(); 16047 } else { 16048 return localInput.valueOf() < this.clone().startOf(units).valueOf(); 16049 } 16050 } 16051 16052 function isBefore (input, units) { 16053 var localInput = isMoment(input) ? input : createLocal(input); 16054 if (!(this.isValid() && localInput.isValid())) { 16055 return false; 16056 } 16057 units = normalizeUnits(units) || 'millisecond'; 16058 if (units === 'millisecond') { 16059 return this.valueOf() < localInput.valueOf(); 16060 } else { 16061 return this.clone().endOf(units).valueOf() < localInput.valueOf(); 16062 } 16063 } 16064 16065 function isBetween (from, to, units, inclusivity) { 16066 var localFrom = isMoment(from) ? from : createLocal(from), 16067 localTo = isMoment(to) ? to : createLocal(to); 16068 if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { 16069 return false; 16070 } 16071 inclusivity = inclusivity || '()'; 16072 return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && 16073 (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); 16074 } 16075 16076 function isSame (input, units) { 16077 var localInput = isMoment(input) ? input : createLocal(input), 16078 inputMs; 16079 if (!(this.isValid() && localInput.isValid())) { 16080 return false; 16081 } 16082 units = normalizeUnits(units) || 'millisecond'; 16083 if (units === 'millisecond') { 16084 return this.valueOf() === localInput.valueOf(); 16085 } else { 16086 inputMs = localInput.valueOf(); 16087 return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); 16088 } 16089 } 16090 16091 function isSameOrAfter (input, units) { 16092 return this.isSame(input, units) || this.isAfter(input, units); 16093 } 16094 16095 function isSameOrBefore (input, units) { 16096 return this.isSame(input, units) || this.isBefore(input, units); 16097 } 16098 16099 function diff (input, units, asFloat) { 16100 var that, 16101 zoneDelta, 16102 output; 16103 16104 if (!this.isValid()) { 16105 return NaN; 16106 } 16107 16108 that = cloneWithOffset(input, this); 16109 16110 if (!that.isValid()) { 16111 return NaN; 16112 } 16113 16114 zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; 16115 16116 units = normalizeUnits(units); 16117 16118 switch (units) { 16119 case 'year': output = monthDiff(this, that) / 12; break; 16120 case 'month': output = monthDiff(this, that); break; 16121 case 'quarter': output = monthDiff(this, that) / 3; break; 16122 case 'second': output = (this - that) / 1e3; break; // 1000 16123 case 'minute': output = (this - that) / 6e4; break; // 1000 * 60 16124 case 'hour': output = (this - that) / 36e5; break; // 1000 * 60 * 60 16125 case 'day': output = (this - that - zoneDelta) / 864e5; break; // 1000 * 60 * 60 * 24, negate dst 16126 case 'week': output = (this - that - zoneDelta) / 6048e5; break; // 1000 * 60 * 60 * 24 * 7, negate dst 16127 default: output = this - that; 16128 } 16129 16130 return asFloat ? output : absFloor(output); 16131 } 16132 16133 function monthDiff (a, b) { 16134 // difference in months 16135 var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), 16136 // b is in (anchor - 1 month, anchor + 1 month) 16137 anchor = a.clone().add(wholeMonthDiff, 'months'), 16138 anchor2, adjust; 16139 16140 if (b - anchor < 0) { 16141 anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); 16142 // linear across the month 16143 adjust = (b - anchor) / (anchor - anchor2); 16144 } else { 16145 anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); 16146 // linear across the month 16147 adjust = (b - anchor) / (anchor2 - anchor); 16148 } 16149 16150 //check for negative zero, return zero if negative zero 16151 return -(wholeMonthDiff + adjust) || 0; 16152 } 16153 16154 hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; 16155 hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; 16156 16157 function toString () { 16158 return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); 16159 } 16160 16161 function toISOString(keepOffset) { 16162 if (!this.isValid()) { 16163 return null; 16164 } 16165 var utc = keepOffset !== true; 16166 var m = utc ? this.clone().utc() : this; 16167 if (m.year() < 0 || m.year() > 9999) { 16168 return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); 16169 } 16170 if (isFunction(Date.prototype.toISOString)) { 16171 // native implementation is ~50x faster, use it when we can 16172 if (utc) { 16173 return this.toDate().toISOString(); 16174 } else { 16175 return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); 16176 } 16177 } 16178 return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); 16179 } 16180 16181 /** 16182 * Return a human readable representation of a moment that can 16183 * also be evaluated to get a new moment which is the same 16184 * 16185 * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects 16186 */ 16187 function inspect () { 16188 if (!this.isValid()) { 16189 return 'moment.invalid(/* ' + this._i + ' */)'; 16190 } 16191 var func = 'moment'; 16192 var zone = ''; 16193 if (!this.isLocal()) { 16194 func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; 16195 zone = 'Z'; 16196 } 16197 var prefix = '[' + func + '("]'; 16198 var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; 16199 var datetime = '-MM-DD[T]HH:mm:ss.SSS'; 16200 var suffix = zone + '[")]'; 16201 16202 return this.format(prefix + year + datetime + suffix); 16203 } 16204 16205 function format (inputString) { 16206 if (!inputString) { 16207 inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; 16208 } 16209 var output = formatMoment(this, inputString); 16210 return this.localeData().postformat(output); 16211 } 16212 16213 function from (time, withoutSuffix) { 16214 if (this.isValid() && 16215 ((isMoment(time) && time.isValid()) || 16216 createLocal(time).isValid())) { 16217 return createDuration({to: this, from: time}).locale(this.locale()).humanize(!withoutSuffix); 16218 } else { 16219 return this.localeData().invalidDate(); 16220 } 16221 } 16222 16223 function fromNow (withoutSuffix) { 16224 return this.from(createLocal(), withoutSuffix); 16225 } 16226 16227 function to (time, withoutSuffix) { 16228 if (this.isValid() && 16229 ((isMoment(time) && time.isValid()) || 16230 createLocal(time).isValid())) { 16231 return createDuration({from: this, to: time}).locale(this.locale()).humanize(!withoutSuffix); 16232 } else { 16233 return this.localeData().invalidDate(); 16234 } 16235 } 16236 16237 function toNow (withoutSuffix) { 16238 return this.to(createLocal(), withoutSuffix); 16239 } 16240 16241 // If passed a locale key, it will set the locale for this 16242 // instance. Otherwise, it will return the locale configuration 16243 // variables for this instance. 16244 function locale (key) { 16245 var newLocaleData; 16246 16247 if (key === undefined) { 16248 return this._locale._abbr; 16249 } else { 16250 newLocaleData = getLocale(key); 16251 if (newLocaleData != null) { 16252 this._locale = newLocaleData; 16253 } 16254 return this; 16255 } 16256 } 16257 16258 var lang = deprecate( 16259 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', 16260 function (key) { 16261 if (key === undefined) { 16262 return this.localeData(); 16263 } else { 16264 return this.locale(key); 16265 } 16266 } 16267 ); 16268 16269 function localeData () { 16270 return this._locale; 16271 } 16272 16273 var MS_PER_SECOND = 1000; 16274 var MS_PER_MINUTE = 60 * MS_PER_SECOND; 16275 var MS_PER_HOUR = 60 * MS_PER_MINUTE; 16276 var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; 16277 16278 // actual modulo - handles negative numbers (for dates before 1970): 16279 function mod$1(dividend, divisor) { 16280 return (dividend % divisor + divisor) % divisor; 16281 } 16282 16283 function localStartOfDate(y, m, d) { 16284 // the date constructor remaps years 0-99 to 1900-1999 16285 if (y < 100 && y >= 0) { 16286 // preserve leap years using a full 400 year cycle, then reset 16287 return new Date(y + 400, m, d) - MS_PER_400_YEARS; 16288 } else { 16289 return new Date(y, m, d).valueOf(); 16290 } 16291 } 16292 16293 function utcStartOfDate(y, m, d) { 16294 // Date.UTC remaps years 0-99 to 1900-1999 16295 if (y < 100 && y >= 0) { 16296 // preserve leap years using a full 400 year cycle, then reset 16297 return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; 16298 } else { 16299 return Date.UTC(y, m, d); 16300 } 16301 } 16302 16303 function startOf (units) { 16304 var time; 16305 units = normalizeUnits(units); 16306 if (units === undefined || units === 'millisecond' || !this.isValid()) { 16307 return this; 16308 } 16309 16310 var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 16311 16312 switch (units) { 16313 case 'year': 16314 time = startOfDate(this.year(), 0, 1); 16315 break; 16316 case 'quarter': 16317 time = startOfDate(this.year(), this.month() - this.month() % 3, 1); 16318 break; 16319 case 'month': 16320 time = startOfDate(this.year(), this.month(), 1); 16321 break; 16322 case 'week': 16323 time = startOfDate(this.year(), this.month(), this.date() - this.weekday()); 16324 break; 16325 case 'isoWeek': 16326 time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); 16327 break; 16328 case 'day': 16329 case 'date': 16330 time = startOfDate(this.year(), this.month(), this.date()); 16331 break; 16332 case 'hour': 16333 time = this._d.valueOf(); 16334 time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR); 16335 break; 16336 case 'minute': 16337 time = this._d.valueOf(); 16338 time -= mod$1(time, MS_PER_MINUTE); 16339 break; 16340 case 'second': 16341 time = this._d.valueOf(); 16342 time -= mod$1(time, MS_PER_SECOND); 16343 break; 16344 } 16345 16346 this._d.setTime(time); 16347 hooks.updateOffset(this, true); 16348 return this; 16349 } 16350 16351 function endOf (units) { 16352 var time; 16353 units = normalizeUnits(units); 16354 if (units === undefined || units === 'millisecond' || !this.isValid()) { 16355 return this; 16356 } 16357 16358 var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; 16359 16360 switch (units) { 16361 case 'year': 16362 time = startOfDate(this.year() + 1, 0, 1) - 1; 16363 break; 16364 case 'quarter': 16365 time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; 16366 break; 16367 case 'month': 16368 time = startOfDate(this.year(), this.month() + 1, 1) - 1; 16369 break; 16370 case 'week': 16371 time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; 16372 break; 16373 case 'isoWeek': 16374 time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; 16375 break; 16376 case 'day': 16377 case 'date': 16378 time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; 16379 break; 16380 case 'hour': 16381 time = this._d.valueOf(); 16382 time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1; 16383 break; 16384 case 'minute': 16385 time = this._d.valueOf(); 16386 time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; 16387 break; 16388 case 'second': 16389 time = this._d.valueOf(); 16390 time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; 16391 break; 16392 } 16393 16394 this._d.setTime(time); 16395 hooks.updateOffset(this, true); 16396 return this; 16397 } 16398 16399 function valueOf () { 16400 return this._d.valueOf() - ((this._offset || 0) * 60000); 16401 } 16402 16403 function unix () { 16404 return Math.floor(this.valueOf() / 1000); 16405 } 16406 16407 function toDate () { 16408 return new Date(this.valueOf()); 16409 } 16410 16411 function toArray () { 16412 var m = this; 16413 return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; 16414 } 16415 16416 function toObject () { 16417 var m = this; 16418 return { 16419 years: m.year(), 16420 months: m.month(), 16421 date: m.date(), 16422 hours: m.hours(), 16423 minutes: m.minutes(), 16424 seconds: m.seconds(), 16425 milliseconds: m.milliseconds() 16426 }; 16427 } 16428 16429 function toJSON () { 16430 // new Date(NaN).toJSON() === null 16431 return this.isValid() ? this.toISOString() : null; 16432 } 16433 16434 function isValid$2 () { 16435 return isValid(this); 16436 } 16437 16438 function parsingFlags () { 16439 return extend({}, getParsingFlags(this)); 16440 } 16441 16442 function invalidAt () { 16443 return getParsingFlags(this).overflow; 16444 } 16445 16446 function creationData() { 16447 return { 16448 input: this._i, 16449 format: this._f, 16450 locale: this._locale, 16451 isUTC: this._isUTC, 16452 strict: this._strict 16453 }; 16454 } 16455 16456 // FORMATTING 16457 16458 addFormatToken(0, ['gg', 2], 0, function () { 16459 return this.weekYear() % 100; 16460 }); 16461 16462 addFormatToken(0, ['GG', 2], 0, function () { 16463 return this.isoWeekYear() % 100; 16464 }); 16465 16466 function addWeekYearFormatToken (token, getter) { 16467 addFormatToken(0, [token, token.length], 0, getter); 16468 } 16469 16470 addWeekYearFormatToken('gggg', 'weekYear'); 16471 addWeekYearFormatToken('ggggg', 'weekYear'); 16472 addWeekYearFormatToken('GGGG', 'isoWeekYear'); 16473 addWeekYearFormatToken('GGGGG', 'isoWeekYear'); 16474 16475 // ALIASES 16476 16477 addUnitAlias('weekYear', 'gg'); 16478 addUnitAlias('isoWeekYear', 'GG'); 16479 16480 // PRIORITY 16481 16482 addUnitPriority('weekYear', 1); 16483 addUnitPriority('isoWeekYear', 1); 16484 16485 16486 // PARSING 16487 16488 addRegexToken('G', matchSigned); 16489 addRegexToken('g', matchSigned); 16490 addRegexToken('GG', match1to2, match2); 16491 addRegexToken('gg', match1to2, match2); 16492 addRegexToken('GGGG', match1to4, match4); 16493 addRegexToken('gggg', match1to4, match4); 16494 addRegexToken('GGGGG', match1to6, match6); 16495 addRegexToken('ggggg', match1to6, match6); 16496 16497 addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { 16498 week[token.substr(0, 2)] = toInt(input); 16499 }); 16500 16501 addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { 16502 week[token] = hooks.parseTwoDigitYear(input); 16503 }); 16504 16505 // MOMENTS 16506 16507 function getSetWeekYear (input) { 16508 return getSetWeekYearHelper.call(this, 16509 input, 16510 this.week(), 16511 this.weekday(), 16512 this.localeData()._week.dow, 16513 this.localeData()._week.doy); 16514 } 16515 16516 function getSetISOWeekYear (input) { 16517 return getSetWeekYearHelper.call(this, 16518 input, this.isoWeek(), this.isoWeekday(), 1, 4); 16519 } 16520 16521 function getISOWeeksInYear () { 16522 return weeksInYear(this.year(), 1, 4); 16523 } 16524 16525 function getWeeksInYear () { 16526 var weekInfo = this.localeData()._week; 16527 return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); 16528 } 16529 16530 function getSetWeekYearHelper(input, week, weekday, dow, doy) { 16531 var weeksTarget; 16532 if (input == null) { 16533 return weekOfYear(this, dow, doy).year; 16534 } else { 16535 weeksTarget = weeksInYear(input, dow, doy); 16536 if (week > weeksTarget) { 16537 week = weeksTarget; 16538 } 16539 return setWeekAll.call(this, input, week, weekday, dow, doy); 16540 } 16541 } 16542 16543 function setWeekAll(weekYear, week, weekday, dow, doy) { 16544 var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), 16545 date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); 16546 16547 this.year(date.getUTCFullYear()); 16548 this.month(date.getUTCMonth()); 16549 this.date(date.getUTCDate()); 16550 return this; 16551 } 16552 16553 // FORMATTING 16554 16555 addFormatToken('Q', 0, 'Qo', 'quarter'); 16556 16557 // ALIASES 16558 16559 addUnitAlias('quarter', 'Q'); 16560 16561 // PRIORITY 16562 16563 addUnitPriority('quarter', 7); 16564 16565 // PARSING 16566 16567 addRegexToken('Q', match1); 16568 addParseToken('Q', function (input, array) { 16569 array[MONTH] = (toInt(input) - 1) * 3; 16570 }); 16571 16572 // MOMENTS 16573 16574 function getSetQuarter (input) { 16575 return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); 16576 } 16577 16578 // FORMATTING 16579 16580 addFormatToken('D', ['DD', 2], 'Do', 'date'); 16581 16582 // ALIASES 16583 16584 addUnitAlias('date', 'D'); 16585 16586 // PRIORITY 16587 addUnitPriority('date', 9); 16588 16589 // PARSING 16590 16591 addRegexToken('D', match1to2); 16592 addRegexToken('DD', match1to2, match2); 16593 addRegexToken('Do', function (isStrict, locale) { 16594 // TODO: Remove "ordinalParse" fallback in next major release. 16595 return isStrict ? 16596 (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : 16597 locale._dayOfMonthOrdinalParseLenient; 16598 }); 16599 16600 addParseToken(['D', 'DD'], DATE); 16601 addParseToken('Do', function (input, array) { 16602 array[DATE] = toInt(input.match(match1to2)[0]); 16603 }); 16604 16605 // MOMENTS 16606 16607 var getSetDayOfMonth = makeGetSet('Date', true); 16608 16609 // FORMATTING 16610 16611 addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); 16612 16613 // ALIASES 16614 16615 addUnitAlias('dayOfYear', 'DDD'); 16616 16617 // PRIORITY 16618 addUnitPriority('dayOfYear', 4); 16619 16620 // PARSING 16621 16622 addRegexToken('DDD', match1to3); 16623 addRegexToken('DDDD', match3); 16624 addParseToken(['DDD', 'DDDD'], function (input, array, config) { 16625 config._dayOfYear = toInt(input); 16626 }); 16627 16628 // HELPERS 16629 16630 // MOMENTS 16631 16632 function getSetDayOfYear (input) { 16633 var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; 16634 return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); 16635 } 16636 16637 // FORMATTING 16638 16639 addFormatToken('m', ['mm', 2], 0, 'minute'); 16640 16641 // ALIASES 16642 16643 addUnitAlias('minute', 'm'); 16644 16645 // PRIORITY 16646 16647 addUnitPriority('minute', 14); 16648 16649 // PARSING 16650 16651 addRegexToken('m', match1to2); 16652 addRegexToken('mm', match1to2, match2); 16653 addParseToken(['m', 'mm'], MINUTE); 16654 16655 // MOMENTS 16656 16657 var getSetMinute = makeGetSet('Minutes', false); 16658 16659 // FORMATTING 16660 16661 addFormatToken('s', ['ss', 2], 0, 'second'); 16662 16663 // ALIASES 16664 16665 addUnitAlias('second', 's'); 16666 16667 // PRIORITY 16668 16669 addUnitPriority('second', 15); 16670 16671 // PARSING 16672 16673 addRegexToken('s', match1to2); 16674 addRegexToken('ss', match1to2, match2); 16675 addParseToken(['s', 'ss'], SECOND); 16676 16677 // MOMENTS 16678 16679 var getSetSecond = makeGetSet('Seconds', false); 16680 16681 // FORMATTING 16682 16683 addFormatToken('S', 0, 0, function () { 16684 return ~~(this.millisecond() / 100); 16685 }); 16686 16687 addFormatToken(0, ['SS', 2], 0, function () { 16688 return ~~(this.millisecond() / 10); 16689 }); 16690 16691 addFormatToken(0, ['SSS', 3], 0, 'millisecond'); 16692 addFormatToken(0, ['SSSS', 4], 0, function () { 16693 return this.millisecond() * 10; 16694 }); 16695 addFormatToken(0, ['SSSSS', 5], 0, function () { 16696 return this.millisecond() * 100; 16697 }); 16698 addFormatToken(0, ['SSSSSS', 6], 0, function () { 16699 return this.millisecond() * 1000; 16700 }); 16701 addFormatToken(0, ['SSSSSSS', 7], 0, function () { 16702 return this.millisecond() * 10000; 16703 }); 16704 addFormatToken(0, ['SSSSSSSS', 8], 0, function () { 16705 return this.millisecond() * 100000; 16706 }); 16707 addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { 16708 return this.millisecond() * 1000000; 16709 }); 16710 16711 16712 // ALIASES 16713 16714 addUnitAlias('millisecond', 'ms'); 16715 16716 // PRIORITY 16717 16718 addUnitPriority('millisecond', 16); 16719 16720 // PARSING 16721 16722 addRegexToken('S', match1to3, match1); 16723 addRegexToken('SS', match1to3, match2); 16724 addRegexToken('SSS', match1to3, match3); 16725 16726 var token; 16727 for (token = 'SSSS'; token.length <= 9; token += 'S') { 16728 addRegexToken(token, matchUnsigned); 16729 } 16730 16731 function parseMs(input, array) { 16732 array[MILLISECOND] = toInt(('0.' + input) * 1000); 16733 } 16734 16735 for (token = 'S'; token.length <= 9; token += 'S') { 16736 addParseToken(token, parseMs); 16737 } 16738 // MOMENTS 16739 16740 var getSetMillisecond = makeGetSet('Milliseconds', false); 16741 16742 // FORMATTING 16743 16744 addFormatToken('z', 0, 0, 'zoneAbbr'); 16745 addFormatToken('zz', 0, 0, 'zoneName'); 16746 16747 // MOMENTS 16748 16749 function getZoneAbbr () { 16750 return this._isUTC ? 'UTC' : ''; 16751 } 16752 16753 function getZoneName () { 16754 return this._isUTC ? 'Coordinated Universal Time' : ''; 16755 } 16756 16757 var proto = Moment.prototype; 16758 16759 proto.add = add; 16760 proto.calendar = calendar$1; 16761 proto.clone = clone; 16762 proto.diff = diff; 16763 proto.endOf = endOf; 16764 proto.format = format; 16765 proto.from = from; 16766 proto.fromNow = fromNow; 16767 proto.to = to; 16768 proto.toNow = toNow; 16769 proto.get = stringGet; 16770 proto.invalidAt = invalidAt; 16771 proto.isAfter = isAfter; 16772 proto.isBefore = isBefore; 16773 proto.isBetween = isBetween; 16774 proto.isSame = isSame; 16775 proto.isSameOrAfter = isSameOrAfter; 16776 proto.isSameOrBefore = isSameOrBefore; 16777 proto.isValid = isValid$2; 16778 proto.lang = lang; 16779 proto.locale = locale; 16780 proto.localeData = localeData; 16781 proto.max = prototypeMax; 16782 proto.min = prototypeMin; 16783 proto.parsingFlags = parsingFlags; 16784 proto.set = stringSet; 16785 proto.startOf = startOf; 16786 proto.subtract = subtract; 16787 proto.toArray = toArray; 16788 proto.toObject = toObject; 16789 proto.toDate = toDate; 16790 proto.toISOString = toISOString; 16791 proto.inspect = inspect; 16792 proto.toJSON = toJSON; 16793 proto.toString = toString; 16794 proto.unix = unix; 16795 proto.valueOf = valueOf; 16796 proto.creationData = creationData; 16797 proto.year = getSetYear; 16798 proto.isLeapYear = getIsLeapYear; 16799 proto.weekYear = getSetWeekYear; 16800 proto.isoWeekYear = getSetISOWeekYear; 16801 proto.quarter = proto.quarters = getSetQuarter; 16802 proto.month = getSetMonth; 16803 proto.daysInMonth = getDaysInMonth; 16804 proto.week = proto.weeks = getSetWeek; 16805 proto.isoWeek = proto.isoWeeks = getSetISOWeek; 16806 proto.weeksInYear = getWeeksInYear; 16807 proto.isoWeeksInYear = getISOWeeksInYear; 16808 proto.date = getSetDayOfMonth; 16809 proto.day = proto.days = getSetDayOfWeek; 16810 proto.weekday = getSetLocaleDayOfWeek; 16811 proto.isoWeekday = getSetISODayOfWeek; 16812 proto.dayOfYear = getSetDayOfYear; 16813 proto.hour = proto.hours = getSetHour; 16814 proto.minute = proto.minutes = getSetMinute; 16815 proto.second = proto.seconds = getSetSecond; 16816 proto.millisecond = proto.milliseconds = getSetMillisecond; 16817 proto.utcOffset = getSetOffset; 16818 proto.utc = setOffsetToUTC; 16819 proto.local = setOffsetToLocal; 16820 proto.parseZone = setOffsetToParsedOffset; 16821 proto.hasAlignedHourOffset = hasAlignedHourOffset; 16822 proto.isDST = isDaylightSavingTime; 16823 proto.isLocal = isLocal; 16824 proto.isUtcOffset = isUtcOffset; 16825 proto.isUtc = isUtc; 16826 proto.isUTC = isUtc; 16827 proto.zoneAbbr = getZoneAbbr; 16828 proto.zoneName = getZoneName; 16829 proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); 16830 proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); 16831 proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); 16832 proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); 16833 proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); 16834 16835 function createUnix (input) { 16836 return createLocal(input * 1000); 16837 } 16838 16839 function createInZone () { 16840 return createLocal.apply(null, arguments).parseZone(); 16841 } 16842 16843 function preParsePostFormat (string) { 16844 return string; 16845 } 16846 16847 var proto$1 = Locale.prototype; 16848 16849 proto$1.calendar = calendar; 16850 proto$1.longDateFormat = longDateFormat; 16851 proto$1.invalidDate = invalidDate; 16852 proto$1.ordinal = ordinal; 16853 proto$1.preparse = preParsePostFormat; 16854 proto$1.postformat = preParsePostFormat; 16855 proto$1.relativeTime = relativeTime; 16856 proto$1.pastFuture = pastFuture; 16857 proto$1.set = set; 16858 16859 proto$1.months = localeMonths; 16860 proto$1.monthsShort = localeMonthsShort; 16861 proto$1.monthsParse = localeMonthsParse; 16862 proto$1.monthsRegex = monthsRegex; 16863 proto$1.monthsShortRegex = monthsShortRegex; 16864 proto$1.week = localeWeek; 16865 proto$1.firstDayOfYear = localeFirstDayOfYear; 16866 proto$1.firstDayOfWeek = localeFirstDayOfWeek; 16867 16868 proto$1.weekdays = localeWeekdays; 16869 proto$1.weekdaysMin = localeWeekdaysMin; 16870 proto$1.weekdaysShort = localeWeekdaysShort; 16871 proto$1.weekdaysParse = localeWeekdaysParse; 16872 16873 proto$1.weekdaysRegex = weekdaysRegex; 16874 proto$1.weekdaysShortRegex = weekdaysShortRegex; 16875 proto$1.weekdaysMinRegex = weekdaysMinRegex; 16876 16877 proto$1.isPM = localeIsPM; 16878 proto$1.meridiem = localeMeridiem; 16879 16880 function get$1 (format, index, field, setter) { 16881 var locale = getLocale(); 16882 var utc = createUTC().set(setter, index); 16883 return locale[field](utc, format); 16884 } 16885 16886 function listMonthsImpl (format, index, field) { 16887 if (isNumber(format)) { 16888 index = format; 16889 format = undefined; 16890 } 16891 16892 format = format || ''; 16893 16894 if (index != null) { 16895 return get$1(format, index, field, 'month'); 16896 } 16897 16898 var i; 16899 var out = []; 16900 for (i = 0; i < 12; i++) { 16901 out[i] = get$1(format, i, field, 'month'); 16902 } 16903 return out; 16904 } 16905 16906 // () 16907 // (5) 16908 // (fmt, 5) 16909 // (fmt) 16910 // (true) 16911 // (true, 5) 16912 // (true, fmt, 5) 16913 // (true, fmt) 16914 function listWeekdaysImpl (localeSorted, format, index, field) { 16915 if (typeof localeSorted === 'boolean') { 16916 if (isNumber(format)) { 16917 index = format; 16918 format = undefined; 16919 } 16920 16921 format = format || ''; 16922 } else { 16923 format = localeSorted; 16924 index = format; 16925 localeSorted = false; 16926 16927 if (isNumber(format)) { 16928 index = format; 16929 format = undefined; 16930 } 16931 16932 format = format || ''; 16933 } 16934 16935 var locale = getLocale(), 16936 shift = localeSorted ? locale._week.dow : 0; 16937 16938 if (index != null) { 16939 return get$1(format, (index + shift) % 7, field, 'day'); 16940 } 16941 16942 var i; 16943 var out = []; 16944 for (i = 0; i < 7; i++) { 16945 out[i] = get$1(format, (i + shift) % 7, field, 'day'); 16946 } 16947 return out; 16948 } 16949 16950 function listMonths (format, index) { 16951 return listMonthsImpl(format, index, 'months'); 16952 } 16953 16954 function listMonthsShort (format, index) { 16955 return listMonthsImpl(format, index, 'monthsShort'); 16956 } 16957 16958 function listWeekdays (localeSorted, format, index) { 16959 return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); 16960 } 16961 16962 function listWeekdaysShort (localeSorted, format, index) { 16963 return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); 16964 } 16965 16966 function listWeekdaysMin (localeSorted, format, index) { 16967 return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); 16968 } 16969 16970 getSetGlobalLocale('en', { 16971 dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, 16972 ordinal : function (number) { 16973 var b = number % 10, 16974 output = (toInt(number % 100 / 10) === 1) ? 'th' : 16975 (b === 1) ? 'st' : 16976 (b === 2) ? 'nd' : 16977 (b === 3) ? 'rd' : 'th'; 16978 return number + output; 16979 } 16980 }); 16981 16982 // Side effect imports 16983 16984 hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); 16985 hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); 16986 16987 var mathAbs = Math.abs; 16988 16989 function abs () { 16990 var data = this._data; 16991 16992 this._milliseconds = mathAbs(this._milliseconds); 16993 this._days = mathAbs(this._days); 16994 this._months = mathAbs(this._months); 16995 16996 data.milliseconds = mathAbs(data.milliseconds); 16997 data.seconds = mathAbs(data.seconds); 16998 data.minutes = mathAbs(data.minutes); 16999 data.hours = mathAbs(data.hours); 17000 data.months = mathAbs(data.months); 17001 data.years = mathAbs(data.years); 17002 17003 return this; 17004 } 17005 17006 function addSubtract$1 (duration, input, value, direction) { 17007 var other = createDuration(input, value); 17008 17009 duration._milliseconds += direction * other._milliseconds; 17010 duration._days += direction * other._days; 17011 duration._months += direction * other._months; 17012 17013 return duration._bubble(); 17014 } 17015 17016 // supports only 2.0-style add(1, 's') or add(duration) 17017 function add$1 (input, value) { 17018 return addSubtract$1(this, input, value, 1); 17019 } 17020 17021 // supports only 2.0-style subtract(1, 's') or subtract(duration) 17022 function subtract$1 (input, value) { 17023 return addSubtract$1(this, input, value, -1); 17024 } 17025 17026 function absCeil (number) { 17027 if (number < 0) { 17028 return Math.floor(number); 17029 } else { 17030 return Math.ceil(number); 17031 } 17032 } 17033 17034 function bubble () { 17035 var milliseconds = this._milliseconds; 17036 var days = this._days; 17037 var months = this._months; 17038 var data = this._data; 17039 var seconds, minutes, hours, years, monthsFromDays; 17040 17041 // if we have a mix of positive and negative values, bubble down first 17042 // check: https://github.com/moment/moment/issues/2166 17043 if (!((milliseconds >= 0 && days >= 0 && months >= 0) || 17044 (milliseconds <= 0 && days <= 0 && months <= 0))) { 17045 milliseconds += absCeil(monthsToDays(months) + days) * 864e5; 17046 days = 0; 17047 months = 0; 17048 } 17049 17050 // The following code bubbles up values, see the tests for 17051 // examples of what that means. 17052 data.milliseconds = milliseconds % 1000; 17053 17054 seconds = absFloor(milliseconds / 1000); 17055 data.seconds = seconds % 60; 17056 17057 minutes = absFloor(seconds / 60); 17058 data.minutes = minutes % 60; 17059 17060 hours = absFloor(minutes / 60); 17061 data.hours = hours % 24; 17062 17063 days += absFloor(hours / 24); 17064 17065 // convert days to months 17066 monthsFromDays = absFloor(daysToMonths(days)); 17067 months += monthsFromDays; 17068 days -= absCeil(monthsToDays(monthsFromDays)); 17069 17070 // 12 months -> 1 year 17071 years = absFloor(months / 12); 17072 months %= 12; 17073 17074 data.days = days; 17075 data.months = months; 17076 data.years = years; 17077 17078 return this; 17079 } 17080 17081 function daysToMonths (days) { 17082 // 400 years have 146097 days (taking into account leap year rules) 17083 // 400 years have 12 months === 4800 17084 return days * 4800 / 146097; 17085 } 17086 17087 function monthsToDays (months) { 17088 // the reverse of daysToMonths 17089 return months * 146097 / 4800; 17090 } 17091 17092 function as (units) { 17093 if (!this.isValid()) { 17094 return NaN; 17095 } 17096 var days; 17097 var months; 17098 var milliseconds = this._milliseconds; 17099 17100 units = normalizeUnits(units); 17101 17102 if (units === 'month' || units === 'quarter' || units === 'year') { 17103 days = this._days + milliseconds / 864e5; 17104 months = this._months + daysToMonths(days); 17105 switch (units) { 17106 case 'month': return months; 17107 case 'quarter': return months / 3; 17108 case 'year': return months / 12; 17109 } 17110 } else { 17111 // handle milliseconds separately because of floating point math errors (issue #1867) 17112 days = this._days + Math.round(monthsToDays(this._months)); 17113 switch (units) { 17114 case 'week' : return days / 7 + milliseconds / 6048e5; 17115 case 'day' : return days + milliseconds / 864e5; 17116 case 'hour' : return days * 24 + milliseconds / 36e5; 17117 case 'minute' : return days * 1440 + milliseconds / 6e4; 17118 case 'second' : return days * 86400 + milliseconds / 1000; 17119 // Math.floor prevents floating point math errors here 17120 case 'millisecond': return Math.floor(days * 864e5) + milliseconds; 17121 default: throw new Error('Unknown unit ' + units); 17122 } 17123 } 17124 } 17125 17126 // TODO: Use this.as('ms')? 17127 function valueOf$1 () { 17128 if (!this.isValid()) { 17129 return NaN; 17130 } 17131 return ( 17132 this._milliseconds + 17133 this._days * 864e5 + 17134 (this._months % 12) * 2592e6 + 17135 toInt(this._months / 12) * 31536e6 17136 ); 17137 } 17138 17139 function makeAs (alias) { 17140 return function () { 17141 return this.as(alias); 17142 }; 17143 } 17144 17145 var asMilliseconds = makeAs('ms'); 17146 var asSeconds = makeAs('s'); 17147 var asMinutes = makeAs('m'); 17148 var asHours = makeAs('h'); 17149 var asDays = makeAs('d'); 17150 var asWeeks = makeAs('w'); 17151 var asMonths = makeAs('M'); 17152 var asQuarters = makeAs('Q'); 17153 var asYears = makeAs('y'); 17154 17155 function clone$1 () { 17156 return createDuration(this); 17157 } 17158 17159 function get$2 (units) { 17160 units = normalizeUnits(units); 17161 return this.isValid() ? this[units + 's']() : NaN; 17162 } 17163 17164 function makeGetter(name) { 17165 return function () { 17166 return this.isValid() ? this._data[name] : NaN; 17167 }; 17168 } 17169 17170 var milliseconds = makeGetter('milliseconds'); 17171 var seconds = makeGetter('seconds'); 17172 var minutes = makeGetter('minutes'); 17173 var hours = makeGetter('hours'); 17174 var days = makeGetter('days'); 17175 var months = makeGetter('months'); 17176 var years = makeGetter('years'); 17177 17178 function weeks () { 17179 return absFloor(this.days() / 7); 17180 } 17181 17182 var round = Math.round; 17183 var thresholds = { 17184 ss: 44, // a few seconds to seconds 17185 s : 45, // seconds to minute 17186 m : 45, // minutes to hour 17187 h : 22, // hours to day 17188 d : 26, // days to month 17189 M : 11 // months to year 17190 }; 17191 17192 // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize 17193 function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { 17194 return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); 17195 } 17196 17197 function relativeTime$1 (posNegDuration, withoutSuffix, locale) { 17198 var duration = createDuration(posNegDuration).abs(); 17199 var seconds = round(duration.as('s')); 17200 var minutes = round(duration.as('m')); 17201 var hours = round(duration.as('h')); 17202 var days = round(duration.as('d')); 17203 var months = round(duration.as('M')); 17204 var years = round(duration.as('y')); 17205 17206 var a = seconds <= thresholds.ss && ['s', seconds] || 17207 seconds < thresholds.s && ['ss', seconds] || 17208 minutes <= 1 && ['m'] || 17209 minutes < thresholds.m && ['mm', minutes] || 17210 hours <= 1 && ['h'] || 17211 hours < thresholds.h && ['hh', hours] || 17212 days <= 1 && ['d'] || 17213 days < thresholds.d && ['dd', days] || 17214 months <= 1 && ['M'] || 17215 months < thresholds.M && ['MM', months] || 17216 years <= 1 && ['y'] || ['yy', years]; 17217 17218 a[2] = withoutSuffix; 17219 a[3] = +posNegDuration > 0; 17220 a[4] = locale; 17221 return substituteTimeAgo.apply(null, a); 17222 } 17223 17224 // This function allows you to set the rounding function for relative time strings 17225 function getSetRelativeTimeRounding (roundingFunction) { 17226 if (roundingFunction === undefined) { 17227 return round; 17228 } 17229 if (typeof(roundingFunction) === 'function') { 17230 round = roundingFunction; 17231 return true; 17232 } 17233 return false; 17234 } 17235 17236 // This function allows you to set a threshold for relative time strings 17237 function getSetRelativeTimeThreshold (threshold, limit) { 17238 if (thresholds[threshold] === undefined) { 17239 return false; 17240 } 17241 if (limit === undefined) { 17242 return thresholds[threshold]; 17243 } 17244 thresholds[threshold] = limit; 17245 if (threshold === 's') { 17246 thresholds.ss = limit - 1; 17247 } 17248 return true; 17249 } 17250 17251 function humanize (withSuffix) { 17252 if (!this.isValid()) { 17253 return this.localeData().invalidDate(); 17254 } 17255 17256 var locale = this.localeData(); 17257 var output = relativeTime$1(this, !withSuffix, locale); 17258 17259 if (withSuffix) { 17260 output = locale.pastFuture(+this, output); 17261 } 17262 17263 return locale.postformat(output); 17264 } 17265 17266 var abs$1 = Math.abs; 17267 17268 function sign(x) { 17269 return ((x > 0) - (x < 0)) || +x; 17270 } 17271 17272 function toISOString$1() { 17273 // for ISO strings we do not use the normal bubbling rules: 17274 // * milliseconds bubble up until they become hours 17275 // * days do not bubble at all 17276 // * months bubble up until they become years 17277 // This is because there is no context-free conversion between hours and days 17278 // (think of clock changes) 17279 // and also not between days and months (28-31 days per month) 17280 if (!this.isValid()) { 17281 return this.localeData().invalidDate(); 17282 } 17283 17284 var seconds = abs$1(this._milliseconds) / 1000; 17285 var days = abs$1(this._days); 17286 var months = abs$1(this._months); 17287 var minutes, hours, years; 17288 17289 // 3600 seconds -> 60 minutes -> 1 hour 17290 minutes = absFloor(seconds / 60); 17291 hours = absFloor(minutes / 60); 17292 seconds %= 60; 17293 minutes %= 60; 17294 17295 // 12 months -> 1 year 17296 years = absFloor(months / 12); 17297 months %= 12; 17298 17299 17300 // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js 17301 var Y = years; 17302 var M = months; 17303 var D = days; 17304 var h = hours; 17305 var m = minutes; 17306 var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; 17307 var total = this.asSeconds(); 17308 17309 if (!total) { 17310 // this is the same as C#'s (Noda) and python (isodate)... 17311 // but not other JS (goog.date) 17312 return 'P0D'; 17313 } 17314 17315 var totalSign = total < 0 ? '-' : ''; 17316 var ymSign = sign(this._months) !== sign(total) ? '-' : ''; 17317 var daysSign = sign(this._days) !== sign(total) ? '-' : ''; 17318 var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; 17319 17320 return totalSign + 'P' + 17321 (Y ? ymSign + Y + 'Y' : '') + 17322 (M ? ymSign + M + 'M' : '') + 17323 (D ? daysSign + D + 'D' : '') + 17324 ((h || m || s) ? 'T' : '') + 17325 (h ? hmsSign + h + 'H' : '') + 17326 (m ? hmsSign + m + 'M' : '') + 17327 (s ? hmsSign + s + 'S' : ''); 17328 } 17329 17330 var proto$2 = Duration.prototype; 17331 17332 proto$2.isValid = isValid$1; 17333 proto$2.abs = abs; 17334 proto$2.add = add$1; 17335 proto$2.subtract = subtract$1; 17336 proto$2.as = as; 17337 proto$2.asMilliseconds = asMilliseconds; 17338 proto$2.asSeconds = asSeconds; 17339 proto$2.asMinutes = asMinutes; 17340 proto$2.asHours = asHours; 17341 proto$2.asDays = asDays; 17342 proto$2.asWeeks = asWeeks; 17343 proto$2.asMonths = asMonths; 17344 proto$2.asQuarters = asQuarters; 17345 proto$2.asYears = asYears; 17346 proto$2.valueOf = valueOf$1; 17347 proto$2._bubble = bubble; 17348 proto$2.clone = clone$1; 17349 proto$2.get = get$2; 17350 proto$2.milliseconds = milliseconds; 17351 proto$2.seconds = seconds; 17352 proto$2.minutes = minutes; 17353 proto$2.hours = hours; 17354 proto$2.days = days; 17355 proto$2.weeks = weeks; 17356 proto$2.months = months; 17357 proto$2.years = years; 17358 proto$2.humanize = humanize; 17359 proto$2.toISOString = toISOString$1; 17360 proto$2.toString = toISOString$1; 17361 proto$2.toJSON = toISOString$1; 17362 proto$2.locale = locale; 17363 proto$2.localeData = localeData; 17364 17365 proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); 17366 proto$2.lang = lang; 17367 17368 // Side effect imports 17369 17370 // FORMATTING 17371 17372 addFormatToken('X', 0, 0, 'unix'); 17373 addFormatToken('x', 0, 0, 'valueOf'); 17374 17375 // PARSING 17376 17377 addRegexToken('x', matchSigned); 17378 addRegexToken('X', matchTimestamp); 17379 addParseToken('X', function (input, array, config) { 17380 config._d = new Date(parseFloat(input, 10) * 1000); 17381 }); 17382 addParseToken('x', function (input, array, config) { 17383 config._d = new Date(toInt(input)); 17384 }); 17385 17386 // Side effect imports 17387 17388 17389 hooks.version = '2.24.0'; 17390 17391 setHookCallback(createLocal); 17392 17393 hooks.fn = proto; 17394 hooks.min = min; 17395 hooks.max = max; 17396 hooks.now = now; 17397 hooks.utc = createUTC; 17398 hooks.unix = createUnix; 17399 hooks.months = listMonths; 17400 hooks.isDate = isDate; 17401 hooks.locale = getSetGlobalLocale; 17402 hooks.invalid = createInvalid; 17403 hooks.duration = createDuration; 17404 hooks.isMoment = isMoment; 17405 hooks.weekdays = listWeekdays; 17406 hooks.parseZone = createInZone; 17407 hooks.localeData = getLocale; 17408 hooks.isDuration = isDuration; 17409 hooks.monthsShort = listMonthsShort; 17410 hooks.weekdaysMin = listWeekdaysMin; 17411 hooks.defineLocale = defineLocale; 17412 hooks.updateLocale = updateLocale; 17413 hooks.locales = listLocales; 17414 hooks.weekdaysShort = listWeekdaysShort; 17415 hooks.normalizeUnits = normalizeUnits; 17416 hooks.relativeTimeRounding = getSetRelativeTimeRounding; 17417 hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; 17418 hooks.calendarFormat = getCalendarFormat; 17419 hooks.prototype = proto; 17420 17421 // currently HTML5 input type only supports 24-hour formats 17422 hooks.HTML5_FMT = { 17423 DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" /> 17424 DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" /> 17425 DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" /> 17426 DATE: 'YYYY-MM-DD', // <input type="date" /> 17427 TIME: 'HH:mm', // <input type="time" /> 17428 TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" /> 17429 TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" /> 17430 WEEK: 'GGGG-[W]WW', // <input type="week" /> 17431 MONTH: 'YYYY-MM' // <input type="month" /> 17432 }; 17433 17434 return hooks; 17435 17436}))); 17437 17438/
17438/! moment.js locale configuration 17439 17440;(function (global, factory) { 17441 typeof exports === 'object' && typeof module !== 'undefined' 17442 && typeof require === 'function' ? factory(require('../moment')) : 17443 typeof define === 'function' && define.amd ? define(['../moment'], factory) : 17444 factory(global.moment) 17445}(this, (function (moment) { 'use strict'; 17446 17447 17448 var fr = moment.defineLocale('fr', { 17449 months : 'janvier_février_mars_avril_mai_juin_juillet_août_septembre_octobre_novembre_décembre'.split('_'), 17450 monthsShort : 'janv._févr._mars_avr._mai_juin_juil._août_sept._oct._nov._déc.'.split('_'), 17451 monthsParseExact : true, 17452 weekdays : 'dimanche_lundi_mardi_mercredi_jeudi_vendredi_samedi'.split('_'), 17453 weekdaysShort : 'dim._lun._mar._mer._jeu._ven._sam.'.split('_'), 17454 weekdaysMin : 'di_lu_ma_me_je_ve_sa'.split('_'), 17455 weekdaysParseExact : true, 17456 longDateFormat : { 17457 LT : 'HH:mm', 17458 LTS : 'HH:mm:ss', 17459 L : 'DD/MM/YYYY', 17460 LL : 'D MMMM YYYY', 17461 LLL : 'D MMMM YYYY HH:mm', 17462 LLLL : 'dddd D MMMM YYYY HH:mm' 17463 }, 17464 calendar : { 17465 sameDay : '[Aujourdâhui à ] LT', 17466 nextDay : '[Demain à ] LT', 17467 nextWeek : 'dddd [à ] LT', 17468 lastDay : '[Hier à ] LT', 17469 lastWeek : 'dddd [dernier à ] LT', 17470 sameElse : 'L' 17471 }, 17472 relativeTime : { 17473 future : 'dans %s', 17474 past : 'il y a %s', 17475 s : 'quelques secondes', 17476 ss : '%d secondes', 17477 m : 'une minute', 17478 mm : '%d minutes', 17479 h : 'une heure', 17480 hh : '%d heures', 17481 d : 'un jour', 17482 dd : '%d jours', 17483 M : 'un mois', 17484 MM : '%d mois', 17485 y : 'un an', 17486 yy : '%d ans' 17487 }, 17488 dayOfMonthOrdinalParse: /\d{1,2}(er|)/, 17489 ordinal : function (number, period) { 17490 switch (period) { 17491 // TODO: Return 'e' when day of month > 1. Move this case inside 17492 // block for masculine words below. 17493 // See https://github.com/moment/moment/issues/3375 17494 case 'D': 17495 return number + (number === 1 ? 'er' : ''); 17496 17497 // Words with masculine grammatical gender: mois, trimestre, jour 17498 default: 17499 case 'M': 17500 case 'Q': 17501 case 'DDD': 17502 case 'd': 17503 return number + (number === 1 ? 'er' : 'e'); 17504 17505 // Words with feminine grammatical gender: semaine 17506 case 'w': 17507 case 'W': 17508 return number + (number === 1 ? 're' : 'e'); 17509 } 17510 }, 17511 week : { 17512 dow : 1, // Monday is the first day of the week. 17513 doy : 4 // The week that contains Jan 4th is the first week of the year. 17514 } 17515 }); 17516 17517 return fr;
vendor: 7,387 bytes, lines 17518-17725
17518 17519}))); 17520 17521/*! 17522 * Datepicker v1.0.4 17523 * https://fengyuanchen.github.io/datepicker 17524 * 17525 * Copyright 2014-present Chen Fengyuan 17526 * Released under the MIT license 17527 * 17528 * Date: 2019-01-06T02:42:36.188Z 17529 */ 17530 17531(function (global, factory) { 17532 typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) : 17533 typeof define === 'function' && define.amd ? define(['jquery'], factory) : 17534 (global = global || self, factory(global.jQuery)); 17535}(this, function ($) { 'use strict'; 17536 17537 $ = $ && $.hasOwnProperty('default') ? $['default'] : $; 17538 17539 function _classCallCheck(instance, Constructor) { 17540 if (!(instance instanceof Constructor)) { 17541 throw new TypeError("Cannot call a class as a function"); 17542 } 17543 } 17544 17545 function _defineProperties(target, props) { 17546 for (var i = 0; i < props.length; i++) { 17547 var descriptor = props[i]; 17548 descriptor.enumerable = descriptor.enumerable || false; 17549 descriptor.configurable = true; 17550 if ("value" in descriptor) descriptor.writable = true; 17551 Object.defineProperty(target, descriptor.key, descriptor); 17552 } 17553 } 17554 17555 function _createClass(Constructor, protoProps, staticProps) { 17556 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 17557 if (staticProps) _defineProperties(Constructor, staticProps); 17558 return Constructor; 17559 } 17560 17561 var DEFAULTS = { 17562 // Show the datepicker automatically when initialized 17563 autoShow: false, 17564 // Hide the datepicker automatically when picked 17565 autoHide: false, 17566 // Pick the initial date automatically when initialized 17567 autoPick: false, 17568 // Enable inline mode 17569 inline: false, 17570 // A element (or selector) for putting the datepicker 17571 container: null, 17572 // A element (or selector) for triggering the datepicker 17573 trigger: null, 17574 // The ISO language code (built-in: en-US) 17575 language: '', 17576 // The date string format 17577 format: 'mm/dd/yyyy', 17578 // The initial date 17579 date: null, 17580 // The start view date 17581 startDate: null, 17582 // The end view date 17583 endDate: null, 17584 // The start view when initialized 17585 startView: 0, 17586 // 0 for days, 1 for months, 2 for years 17587 // The start day of the week 17588 // 0 for Sunday, 1 for Monday, 2 for Tuesday, 3 for Wednesday, 17589 // 4 for Thursday, 5 for Friday, 6 for Saturday 17590 weekStart: 0, 17591 // Show year before month on the datepicker header 17592 yearFirst: false, 17593 // A string suffix to the year number. 17594 yearSuffix: '', 17595 // Days' name of the week. 17596 days: ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'], 17597 // Shorter days' name 17598 daysShort: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'], 17599 // Shortest days' name 17600 daysMin: ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'], 17601 // Months' name 17602 months: ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'], 17603 // Shorter months' name 17604 monthsShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], 17605 // A element tag for each item of years, months and days 17606 itemTag: 'li', 17607 // A class (CSS) for muted date item 17608 mutedClass: 'muted', 17609 // A class (CSS) for picked date item 17610 pickedClass: 'picked', 17611 // A class (CSS) for disabled date item 17612 disabledClass: 'disabled', 17613 // A class (CSS) for highlight date item 17614 highlightedClass: 'highlighted', 17615 // The template of the datepicker 17616 template: '<div class="datepicker-container">' + '<div class="datepicker-panel" data-view="years picker">' + '<ul>' + '<li data-view="years prev">‹</li>' + '<li data-view="years current"></li>' + '<li data-view="years next">›</li>' + '</ul>' + '<ul data-view="years"></ul>' + '</div>' + '<div class="datepicker-panel" data-view="months picker">' + '<ul>' + '<li data-view="year prev">‹</li>' + '<li data-view="year current"></li>' + '<li data-view="year next">›</li>' + '</ul>' + '<ul data-view="months"></ul>' + '</div>' + '<div class="datepicker-panel" data-view="days picker">' + '<ul>' + '<li data-view="month prev">‹</li>' + '<li data-view="month current"></li>' + '<li data-view="month next">›</li>' + '</ul>' + '<ul data-view="week"></ul>' + '<ul data-view="days"></ul>' + '</div>' + '</div>', 17617 // The offset top or bottom of the datepicker from the element 17618 offset: 10, 17619 // The `z-index` of the datepicker 17620 zIndex: 1000, 17621 // Filter each date item (return `false` to disable a date item) 17622 filter: null, 17623 // Event shortcuts 17624 show: null, 17625 hide: null, 17626 pick: null 17627 }; 17628 17629 var WINDOW = typeof window !== 'undefined' ? window : {}; 17630 var NAMESPACE = 'datepicker'; 17631 var EVENT_CLICK = "click.".concat(NAMESPACE); 17632 var EVENT_FOCUS = "focus.".concat(NAMESPACE); 17633 var EVENT_HIDE = "hide.".concat(NAMESPACE); 17634 var EVENT_KEYUP = "keyup.".concat(NAMESPACE); 17635 var EVENT_PICK = "pick.".concat(NAMESPACE); 17636 var EVENT_RESIZE = "resize.".concat(NAMESPACE); 17637 var EVENT_SCROLL = "scroll.".concat(NAMESPACE); 17638 var EVENT_SHOW = "show.".concat(NAMESPACE); 17639 var CLASS_HIDE = "".concat(NAMESPACE, "-hide"); 17640 var LANGUAGES = {}; 17641 var VIEWS = { 17642 DAYS: 0, 17643 MONTHS: 1, 17644 YEARS: 2 17645 }; 17646 17647 var toString = Object.prototype.toString; 17648 function typeOf(obj) { 17649 return toString.call(obj).slice(8, -1).toLowerCase(); 17650 } 17651 function isString(value) { 17652 return typeof value === 'string'; 17653 } 17654 var isNaN = Number.isNaN || WINDOW.isNaN; 17655 function isNumber(value) { 17656 return typeof value === 'number' && !isNaN(value); 17657 } 17658 function isUndefined(value) { 17659 return typeof value === 'undefined'; 17660 } 17661 function isDate(value) { 17662 return typeOf(value) === 'date' && !isNaN(value.getTime()); 17663 } 17664 function proxy(fn, context) { 17665 for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { 17666 args[_key - 2] = arguments[_key]; 17667 } 17668 17669 return function () { 17670 for (var _len2 = arguments.length, args2 = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { 17671 args2[_key2] = arguments[_key2]; 17672 } 17673 17674 return fn.apply(context, args.concat(args2)); 17675 }; 17676 } 17677 function selectorOf(view) { 17678 return "[data-view=\"".concat(view, "\"]"); 17679 } 17680 function isLeapYear(year) { 17681 return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0; 17682 } 17683 function getDaysInMonth(year, month) { 17684 return [31, isLeapYear(year) ? 29 : 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month]; 17685 } 17686 function getMinDay(year, month, day) { 17687 return Math.min(day, getDaysInMonth(year, month)); 17688 } 17689 var formatParts = /(y|m|d)+/g; 17690 function parseFormat(format) { 17691 var source = String(format).toLowerCase(); 17692 var parts = source.match(formatParts); 17693 17694 if (!parts || parts.length === 0) { 17695 throw new Error('Invalid date format.'); 17696 } 17697 17698 format = { 17699 source: source, 17700 parts: parts 17701 }; 17702 $.each(parts, function (i, part) { 17703 switch (part) { 17704 case 'dd': 17705 case 'd': 17706 format.hasDay = true; 17707 break; 17708 17709 case 'mm': 17710 case 'm': 17711 format.hasMonth = true; 17712 break; 17713 17714 case 'yyyy': 17715 case 'yy': 17716 format.hasYear = true; 17717 break; 17718 17719 default: 17720 } 17721 }); 17722 return format; 17723 } 17724 function getScrollParent(element) { 17725 var includeHidden = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
vendor: 19,618 bytes, lines 17726-18433
17726 var $element = $(element); 17727 var position = $element.css('position'); 17728 var excludeStaticParent = position === 'absolute'; 17729 var overflowRegex = includeHidden ? /auto|scroll|hidden/ : /auto|scroll/; 17730 var scrollParent = $element.parents().filter(function (index, parent) { 17731 var $parent = $(parent); 17732 17733 if (excludeStaticParent && $parent.css('position') === 'static') { 17734 return false; 17735 } 17736 17737 return overflowRegex.test($parent.css('overflow') + $parent.css('overflow-y') + $parent.css('overflow-x')); 17738 }).eq(0); 17739 return position === 'fixed' || !scrollParent.length ? $(element.ownerDocument || document) : scrollParent; 17740 } 17741 /** 17742 * Add leading zeroes to the given value 17743 * @param {number} value - The value to add. 17744 * @param {number} [length=1] - The expected value length. 17745 * @returns {string} Returns converted value. 17746 */ 17747 17748 function addLeadingZero(value) { 17749 var length = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1; 17750 var str = String(Math.abs(value)); 17751 var i = str.length; 17752 var result = ''; 17753 17754 if (value < 0) { 17755 result += '-'; 17756 } 17757 17758 while (i < length) { 17759 i += 1; 17760 result += '0'; 17761 } 17762 17763 return result + str; 17764 } 17765 17766 var REGEXP_DIGITS = /\d+/g; 17767 var methods = { 17768 // Show the datepicker 17769 show: function show() { 17770 if (!this.built) { 17771 this.build(); 17772 } 17773 17774 if (this.shown) { 17775 return; 17776 } 17777 17778 if (this.trigger(EVENT_SHOW).isDefaultPrevented()) { 17779 return; 17780 } 17781 17782 this.shown = true; 17783 this.$picker.removeClass(CLASS_HIDE).on(EVENT_CLICK, $.proxy(this.click, this)); 17784 this.showView(this.options.startView); 17785 17786 if (!this.inline) { 17787 this.$scrollParent.on(EVENT_SCROLL, $.proxy(this.place, this)); 17788 $(window).on(EVENT_RESIZE, this.onResize = proxy(this.place, this)); 17789 $(document).on(EVENT_CLICK, this.onGlobalClick = proxy(this.globalClick, this)); 17790 $(document).on(EVENT_KEYUP, this.onGlobalKeyup = proxy(this.globalKeyup, this)); 17791 this.place(); 17792 } 17793 }, 17794 // Hide the datepicker 17795 hide: function hide() { 17796 if (!this.shown) { 17797 return; 17798 } 17799 17800 if (this.trigger(EVENT_HIDE).isDefaultPrevented()) { 17801 return; 17802 } 17803 17804 this.shown = false; 17805 this.$picker.addClass(CLASS_HIDE).off(EVENT_CLICK, this.click); 17806 17807 if (!this.inline) { 17808 this.$scrollParent.off(EVENT_SCROLL, this.place); 17809 $(window).off(EVENT_RESIZE, this.onResize); 17810 $(document).off(EVENT_CLICK, this.onGlobalClick); 17811 $(document).off(EVENT_KEYUP, this.onGlobalKeyup); 17812 } 17813 }, 17814 toggle: function toggle() { 17815 if (this.shown) { 17816 this.hide(); 17817 } else { 17818 this.show(); 17819 } 17820 }, 17821 // Update the datepicker with the current input value 17822 update: function update() { 17823 var value = this.getValue(); 17824 17825 if (value === this.oldValue) { 17826 return; 17827 } 17828 17829 this.setDate(value, true); 17830 this.oldValue = value; 17831 }, 17832 17833 /** 17834 * Pick the current date to the element 17835 * 17836 * @param {String} _view (private) 17837 */ 17838 pick: function pick(_view) { 17839 var $this = this.$element; 17840 var date = this.date; 17841 17842 if (this.trigger(EVENT_PICK, { 17843 view: _view || '', 17844 date: date 17845 }).isDefaultPrevented()) { 17846 return; 17847 } 17848 17849 date = this.formatDate(this.date); 17850 this.setValue(date); 17851 17852 if (this.isInput) { 17853 $this.trigger('input'); 17854 $this.trigger('change'); 17855 } 17856 }, 17857 // Reset the datepicker 17858 reset: function reset() { 17859 this.setDate(this.initialDate, true); 17860 this.setValue(this.initialValue); 17861 17862 if (this.shown) { 17863 this.showView(this.options.startView); 17864 } 17865 }, 17866 17867 /** 17868 * Get the month name with given argument or the current date 17869 * 17870 * @param {Number} month (optional) 17871 * @param {Boolean} shortForm (optional) 17872 * @return {String} (month name) 17873 */ 17874 getMonthName: function getMonthName(month, shortForm) { 17875 var options = this.options; 17876 var monthsShort = options.monthsShort; 17877 var months = options.months; 17878 17879 if ($.isNumeric(month)) { 17880 month = Number(month); 17881 } else if (isUndefined(shortForm)) { 17882 shortForm = month; 17883 } 17884 17885 if (shortForm === true) { 17886 months = monthsShort; 17887 } 17888 17889 return months[isNumber(month) ? month : this.date.getMonth()]; 17890 }, 17891 17892 /** 17893 * Get the day name with given argument or the current date 17894 * 17895 * @param {Number} day (optional) 17896 * @param {Boolean} shortForm (optional) 17897 * @param {Boolean} min (optional) 17898 * @return {String} (day name) 17899 */ 17900 getDayName: function getDayName(day, shortForm, min) { 17901 var options = this.options; 17902 var days = options.days; 17903 17904 if ($.isNumeric(day)) { 17905 day = Number(day); 17906 } else { 17907 if (isUndefined(min)) { 17908 min = shortForm; 17909 } 17910 17911 if (isUndefined(shortForm)) { 17912 shortForm = day; 17913 } 17914 } 17915 17916 if (min) { 17917 days = options.daysMin; 17918 } else if (shortForm) { 17919 days = options.daysShort; 17920 } 17921 17922 return days[isNumber(day) ? day : this.date.getDay()]; 17923 }, 17924 17925 /** 17926 * Get the current date 17927 * 17928 * @param {Boolean} formatted (optional) 17929 * @return {Date|String} (date) 17930 */ 17931 getDate: function getDate(formatted) { 17932 var date = this.date; 17933 return formatted ? this.formatDate(date) : new Date(date); 17934 }, 17935 17936 /** 17937 * Set the current date with a new date 17938 * 17939 * @param {Date} date 17940 * @param {Boolean} _updated (private) 17941 */ 17942 setDate: function setDate(date, _updated) { 17943 var filter = this.options.filter; 17944 17945 if (isDate(date) || isString(date)) { 17946 date = this.parseDate(date); 17947 17948 if ($.isFunction(filter) && filter.call(this.$element, date, 'day') === false) { 17949 return; 17950 } 17951 17952 this.date = date; 17953 this.viewDate = new Date(date); 17954 17955 if (!_updated) { 17956 this.pick(); 17957 } 17958 17959 if (this.built) { 17960 this.render(); 17961 } 17962 } 17963 }, 17964 17965 /** 17966 * Set the start view date with a new date 17967 * 17968 * @param {Date|string|null} date 17969 */ 17970 setStartDate: function setStartDate(date) { 17971 if (isDate(date) || isString(date)) { 17972 this.startDate = this.parseDate(date); 17973 } else { 17974 this.startDate = null; 17975 } 17976 17977 if (this.built) { 17978 this.render(); 17979 } 17980 }, 17981 17982 /** 17983 * Set the end view date with a new date 17984 * 17985 * @param {Date|string|null} date 17986 */ 17987 setEndDate: function setEndDate(date) { 17988 if (isDate(date) || isString(date)) { 17989 this.endDate = this.parseDate(date); 17990 } else { 17991 this.endDate = null; 17992 } 17993 17994 if (this.built) { 17995 this.render(); 17996 } 17997 }, 17998 17999 /** 18000 * Parse a date string with the set date format 18001 * 18002 * @param {String} date 18003 * @return {Date} (parsed date) 18004 */ 18005 parseDate: function parseDate(date) { 18006 var format = this.format; 18007 var parts = []; 18008 18009 if (!isDate(date)) { 18010 if (isString(date)) { 18011 parts = date.match(REGEXP_DIGITS) || []; 18012 } 18013 18014 date = date ? new Date(date) : new Date(); 18015 18016 if (!isDate(date)) { 18017 date = new Date(); 18018 } 18019 18020 if (parts.length === format.parts.length) { 18021 $.each(parts, function (i, part) { 18022 var value = parseInt(part, 10); 18023 18024 switch (format.parts[i]) { 18025 case 'dd': 18026 case 'd': 18027 date.setDate(value); 18028 break; 18029 18030 case 'mm': 18031 case 'm': 18032 date.setMonth(value - 1); 18033 break; 18034 18035 case 'yy': 18036 date.setFullYear(2000 + value); 18037 break; 18038 18039 case 'yyyy': 18040 // Converts 2-digit year to 2000+ 18041 date.setFullYear(part.length === 2 ? 2000 + value : value); 18042 break; 18043 18044 default: 18045 } 18046 }); 18047 } 18048 } // Ignore hours, minutes, seconds and milliseconds to avoid side effect (#192) 18049 18050 18051 return new Date(date.getFullYear(), date.getMonth(), date.getDate()); 18052 }, 18053 18054 /** 18055 * Format a date object to a string with the set date format 18056 * 18057 * @param {Date} date 18058 * @return {String} (formatted date) 18059 */ 18060 formatDate: function formatDate(date) { 18061 var format = this.format; 18062 var formatted = ''; 18063 18064 if (isDate(date)) { 18065 var year = date.getFullYear(); 18066 var month = date.getMonth(); 18067 var day = date.getDate(); 18068 var values = { 18069 d: day, 18070 dd: addLeadingZero(day, 2), 18071 m: month + 1, 18072 mm: addLeadingZero(month + 1, 2), 18073 yy: String(year).substring(2), 18074 yyyy: addLeadingZero(year, 4) 18075 }; 18076 formatted = format.source; 18077 $.each(format.parts, function (i, part) { 18078 formatted = formatted.replace(part, values[part]); 18079 }); 18080 } 18081 18082 return formatted; 18083 }, 18084 // Destroy the datepicker and remove the instance from the target element 18085 destroy: function destroy() { 18086 this.unbind(); 18087 this.unbuild(); 18088 this.$element.removeData(NAMESPACE); 18089 } 18090 }; 18091 18092 var handlers = { 18093 click: function click(e) { 18094 var $target = $(e.target); 18095 var options = this.options, 18096 date = this.date, 18097 viewDate = this.viewDate, 18098 format = this.format; 18099 e.stopPropagation(); 18100 e.preventDefault(); 18101 18102 if ($target.hasClass('disabled')) { 18103 return; 18104 } 18105 18106 var view = $target.data('view'); 18107 var viewYear = viewDate.getFullYear(); 18108 var viewMonth = viewDate.getMonth(); 18109 var viewDay = viewDate.getDate(); 18110 18111 switch (view) { 18112 case 'years prev': 18113 case 'years next': 18114 { 18115 viewYear = view === 'years prev' ? viewYear - 10 : viewYear + 10; 18116 viewDate.setFullYear(viewYear); 18117 viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18118 this.renderYears(); 18119 break; 18120 } 18121 18122 case 'year prev': 18123 case 'year next': 18124 viewYear = view === 'year prev' ? viewYear - 1 : viewYear + 1; 18125 viewDate.setFullYear(viewYear); 18126 viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18127 this.renderMonths(); 18128 break; 18129 18130 case 'year current': 18131 if (format.hasYear) { 18132 this.showView(VIEWS.YEARS); 18133 } 18134 18135 break; 18136 18137 case 'year picked': 18138 if (format.hasMonth) { 18139 this.showView(VIEWS.MONTHS); 18140 } else { 18141 $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass); 18142 this.hideView(); 18143 } 18144 18145 this.pick('year'); 18146 break; 18147 18148 case 'year': 18149 viewYear = parseInt($target.text(), 10); 18150 date.setFullYear(viewYear); 18151 date.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18152 viewDate.setFullYear(viewYear); 18153 viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18154 18155 if (format.hasMonth) { 18156 this.showView(VIEWS.MONTHS); 18157 } else { 18158 $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass); 18159 this.hideView(); 18160 } 18161 18162 this.pick('year'); 18163 break; 18164 18165 case 'month prev': 18166 case 'month next': 18167 viewMonth = view === 'month prev' ? viewMonth - 1 : viewMonth + 1; 18168 18169 if (viewMonth < 0) { 18170 viewYear -= 1; 18171 viewMonth += 12; 18172 } else if (viewMonth > 11) { 18173 viewYear += 1; 18174 viewMonth -= 12; 18175 } 18176 18177 viewDate.setFullYear(viewYear); 18178 viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18179 viewDate.setMonth(viewMonth); 18180 this.renderDays(); 18181 break; 18182 18183 case 'month current': 18184 if (format.hasMonth) { 18185 this.showView(VIEWS.MONTHS); 18186 } 18187 18188 break; 18189 18190 case 'month picked': 18191 if (format.hasDay) { 18192 this.showView(VIEWS.DAYS); 18193 } else { 18194 $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass); 18195 this.hideView(); 18196 } 18197 18198 this.pick('month'); 18199 break; 18200 18201 case 'month': 18202 viewMonth = $.inArray($target.text(), options.monthsShort); 18203 date.setFullYear(viewYear); // Set date before month to avoid month changing (#195) 18204 18205 date.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18206 date.setMonth(viewMonth); 18207 viewDate.setFullYear(viewYear); 18208 viewDate.setDate(getMinDay(viewYear, viewMonth, viewDay)); 18209 viewDate.setMonth(viewMonth); 18210 18211 if (format.hasDay) { 18212 this.showView(VIEWS.DAYS); 18213 } else { 18214 $target.addClass(options.pickedClass).siblings().removeClass(options.pickedClass); 18215 this.hideView(); 18216 } 18217 18218 this.pick('month'); 18219 break; 18220 18221 case 'day prev': 18222 case 'day next': 18223 case 'day': 18224 if (view === 'day prev') { 18225 viewMonth -= 1; 18226 } else if (view === 'day next') { 18227 viewMonth += 1; 18228 } 18229 18230 viewDay = parseInt($target.text(), 10); 18231 date.setFullYear(viewYear); 18232 date.setMonth(viewMonth); 18233 date.setDate(viewDay); 18234 viewDate.setFullYear(viewYear); 18235 viewDate.setMonth(viewMonth); 18236 viewDate.setDate(viewDay); 18237 this.renderDays(); 18238 18239 if (view === 'day') { 18240 this.hideView(); 18241 } 18242 18243 this.pick('day'); 18244 break; 18245 18246 case 'day picked': 18247 this.hideView(); 18248 this.pick('day'); 18249 break; 18250 18251 default: 18252 } 18253 }, 18254 globalClick: function globalClick(_ref) { 18255 var target = _ref.target; 18256 var element = this.element, 18257 $trigger = this.$trigger; 18258 var trigger = $trigger[0]; 18259 var hidden = true; 18260 18261 while (target !== document) { 18262 if (target === trigger || target === element) { 18263 hidden = false; 18264 break; 18265 } 18266 18267 target = target.parentNode; 18268 } 18269 18270 if (hidden) { 18271 this.hide(); 18272 } 18273 }, 18274 keyup: function keyup() { 18275 this.update(); 18276 }, 18277 globalKeyup: function globalKeyup(_ref2) { 18278 var target = _ref2.target, 18279 key = _ref2.key, 18280 keyCode = _ref2.keyCode; 18281 18282 if (this.isInput && target !== this.element && this.shown && (key === 'Tab' || keyCode === 9)) { 18283 this.hide(); 18284 } 18285 } 18286 }; 18287 18288 var render = { 18289 render: function render() { 18290 this.renderYears(); 18291 this.renderMonths(); 18292 this.renderDays(); 18293 }, 18294 renderWeek: function renderWeek() { 18295 var _this = this; 18296 18297 var items = []; 18298 var _this$options = this.options, 18299 weekStart = _this$options.weekStart, 18300 daysMin = _this$options.daysMin; 18301 weekStart = parseInt(weekStart, 10) % 7; 18302 daysMin = daysMin.slice(weekStart).concat(daysMin.slice(0, weekStart)); 18303 $.each(daysMin, function (i, day) { 18304 items.push(_this.createItem({ 18305 text: day 18306 })); 18307 }); 18308 this.$week.html(items.join('')); 18309 }, 18310 renderYears: function renderYears() { 18311 var options = this.options, 18312 startDate = this.startDate, 18313 endDate = this.endDate; 18314 var disabledClass = options.disabledClass, 18315 filter = options.filter, 18316 yearSuffix = options.yearSuffix; 18317 var viewYear = this.viewDate.getFullYear(); 18318 var now = new Date(); 18319 var thisYear = now.getFullYear(); 18320 var year = this.date.getFullYear(); 18321 var start = -5; 18322 var end = 6; 18323 var items = []; 18324 var prevDisabled = false; 18325 var nextDisabled = false; 18326 var i; 18327 18328 for (i = start; i <= end; i += 1) { 18329 var date = new Date(viewYear + i, 1, 1); 18330 var disabled = false; 18331 18332 if (startDate) { 18333 disabled = date.getFullYear() < startDate.getFullYear(); 18334 18335 if (i === start) { 18336 prevDisabled = disabled; 18337 } 18338 } 18339 18340 if (!disabled && endDate) { 18341 disabled = date.getFullYear() > endDate.getFullYear(); 18342 18343 if (i === end) { 18344 nextDisabled = disabled; 18345 } 18346 } 18347 18348 if (!disabled && filter) { 18349 disabled = filter.call(this.$element, date, 'year') === false; 18350 } 18351 18352 var picked = viewYear + i === year; 18353 var view = picked ? 'year picked' : 'year'; 18354 items.push(this.createItem({ 18355 picked: picked, 18356 disabled: disabled, 18357 text: viewYear + i, 18358 view: disabled ? 'year disabled' : view, 18359 highlighted: date.getFullYear() === thisYear 18360 })); 18361 } 18362 18363 this.$yearsPrev.toggleClass(disabledClass, prevDisabled); 18364 this.$yearsNext.toggleClass(disabledClass, nextDisabled); 18365 this.$yearsCurrent.toggleClass(disabledClass, true).html("".concat(viewYear + start + yearSuffix, " - ").concat(viewYear + end).concat(yearSuffix)); 18366 this.$years.html(items.join('')); 18367 }, 18368 renderMonths: function renderMonths() { 18369 var options = this.options, 18370 startDate = this.startDate, 18371 endDate = this.endDate, 18372 viewDate = this.viewDate; 18373 var disabledClass = options.disabledClass || ''; 18374 var months = options.monthsShort; 18375 var filter = $.isFunction(options.filter) && options.filter; 18376 var viewYear = viewDate.getFullYear(); 18377 var now = new Date(); 18378 var thisYear = now.getFullYear(); 18379 var thisMonth = now.getMonth(); 18380 var year = this.date.getFullYear(); 18381 var month = this.date.getMonth(); 18382 var items = []; 18383 var prevDisabled = false; 18384 var nextDisabled = false; 18385 var i; 18386 18387 for (i = 0; i <= 11; i += 1) { 18388 var date = new Date(viewYear, i, 1); 18389 var disabled = false; 18390 18391 if (startDate) { 18392 prevDisabled = date.getFullYear() === startDate.getFullYear(); 18393 disabled = prevDisabled && date.getMonth() < startDate.getMonth(); 18394 } 18395 18396 if (!disabled && endDate) { 18397 nextDisabled = date.getFullYear() === endDate.getFullYear(); 18398 disabled = nextDisabled && date.getMonth() > endDate.getMonth(); 18399 } 18400 18401 if (!disabled && filter) { 18402 disabled = filter.call(this.$element, date, 'month') === false; 18403 } 18404 18405 var picked = viewYear === year && i === month; 18406 var view = picked ? 'month picked' : 'month'; 18407 items.push(this.createItem({ 18408 disabled: disabled, 18409 picked: picked, 18410 highlighted: viewYear === thisYear && date.getMonth() === thisMonth, 18411 index: i, 18412 text: months[i], 18413 view: disabled ? 'month disabled' : view 18414 })); 18415 } 18416 18417 this.$yearPrev.toggleClass(disabledClass, prevDisabled); 18418 this.$yearNext.toggleClass(disabledClass, nextDisabled); 18419 this.$yearCurrent.toggleClass(disabledClass, prevDisabled && nextDisabled).html(viewYear + options.yearSuffix || ''); 18420 this.$months.html(items.join('')); 18421 }, 18422 renderDays: function renderDays() { 18423 var $element = this.$element, 18424 options = this.options, 18425 startDate = this.startDate, 18426 endDate = this.endDate, 18427 viewDate = this.viewDate, 18428 currentDate = this.date; 18429 var disabledClass = options.disabledClass, 18430 filter = options.filter, 18431 months = options.months, 18432 weekStart = options.weekStart, 18433 yearSuffix = options.yearSuffix;
vendor: 5,549 bytes, lines 18434-18596
18434 var viewYear = viewDate.getFullYear(); 18435 var viewMonth = viewDate.getMonth(); 18436 var now = new Date(); 18437 var thisYear = now.getFullYear(); 18438 var thisMonth = now.getMonth(); 18439 var thisDay = now.getDate(); 18440 var year = currentDate.getFullYear(); 18441 var month = currentDate.getMonth(); 18442 var day = currentDate.getDate(); 18443 var length; 18444 var i; 18445 var n; // Days of prev month 18446 // ----------------------------------------------------------------------- 18447 18448 var prevItems = []; 18449 var prevViewYear = viewYear; 18450 var prevViewMonth = viewMonth; 18451 var prevDisabled = false; 18452 18453 if (viewMonth === 0) { 18454 prevViewYear -= 1; 18455 prevViewMonth = 11; 18456 } else { 18457 prevViewMonth -= 1; 18458 } // The length of the days of prev month 18459 18460 18461 length = getDaysInMonth(prevViewYear, prevViewMonth); // The first day of current month 18462 18463 var firstDay = new Date(viewYear, viewMonth, 1); // The visible length of the days of prev month 18464 // [0,1,2,3,4,5,6] - [0,1,2,3,4,5,6] => [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6] 18465 18466 n = firstDay.getDay() - parseInt(weekStart, 10) % 7; // [-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6] => [1,2,3,4,5,6,7] 18467 18468 if (n <= 0) { 18469 n += 7; 18470 } 18471 18472 if (startDate) { 18473 prevDisabled = firstDay.getTime() <= startDate.getTime(); 18474 } 18475 18476 for (i = length - (n - 1); i <= length; i += 1) { 18477 var prevViewDate = new Date(prevViewYear, prevViewMonth, i); 18478 var disabled = false; 18479 18480 if (startDate) { 18481 disabled = prevViewDate.getTime() < startDate.getTime(); 18482 } 18483 18484 if (!disabled && filter) { 18485 disabled = filter.call($element, prevViewDate, 'day') === false; 18486 } 18487 18488 prevItems.push(this.createItem({ 18489 disabled: disabled, 18490 highlighted: prevViewYear === thisYear && prevViewMonth === thisMonth && prevViewDate.getDate() === thisDay, 18491 muted: true, 18492 picked: prevViewYear === year && prevViewMonth === month && i === day, 18493 text: i, 18494 view: 'day prev' 18495 })); 18496 } // Days of next month 18497 // ----------------------------------------------------------------------- 18498 18499 18500 var nextItems = []; 18501 var nextViewYear = viewYear; 18502 var nextViewMonth = viewMonth; 18503 var nextDisabled = false; 18504 18505 if (viewMonth === 11) { 18506 nextViewYear += 1; 18507 nextViewMonth = 0; 18508 } else { 18509 nextViewMonth += 1; 18510 } // The length of the days of current month 18511 18512 18513 length = getDaysInMonth(viewYear, viewMonth); // The visible length of next month (42 means 6 rows and 7 columns) 18514 18515 n = 42 - (prevItems.length + length); // The last day of current month 18516 18517 var lastDate = new Date(viewYear, viewMonth, length); 18518 18519 if (endDate) { 18520 nextDisabled = lastDate.getTime() >= endDate.getTime(); 18521 } 18522 18523 for (i = 1; i <= n; i += 1) { 18524 var date = new Date(nextViewYear, nextViewMonth, i); 18525 var picked = nextViewYear === year && nextViewMonth === month && i === day; 18526 var _disabled = false; 18527 18528 if (endDate) { 18529 _disabled = date.getTime() > endDate.getTime(); 18530 } 18531 18532 if (!_disabled && filter) { 18533 _disabled = filter.call($element, date, 'day') === false; 18534 } 18535 18536 nextItems.push(this.createItem({ 18537 disabled: _disabled, 18538 picked: picked, 18539 highlighted: nextViewYear === thisYear && nextViewMonth === thisMonth && date.getDate() === thisDay, 18540 muted: true, 18541 text: i, 18542 view: 'day next' 18543 })); 18544 } // Days of current month 18545 // ----------------------------------------------------------------------- 18546 18547 18548 var items = []; 18549 18550 for (i = 1; i <= length; i += 1) { 18551 var _date = new Date(viewYear, viewMonth, i); 18552 18553 var _disabled2 = false; 18554 18555 if (startDate) { 18556 _disabled2 = _date.getTime() < startDate.getTime(); 18557 } 18558 18559 if (!_disabled2 && endDate) { 18560 _disabled2 = _date.getTime() > endDate.getTime(); 18561 } 18562 18563 if (!_disabled2 && filter) { 18564 _disabled2 = filter.call($element, _date, 'day') === false; 18565 } 18566 18567 var _picked = viewYear === year && viewMonth === month && i === day; 18568 18569 var view = _picked ? 'day picked' : 'day'; 18570 items.push(this.createItem({ 18571 disabled: _disabled2, 18572 picked: _picked, 18573 highlighted: viewYear === thisYear && viewMonth === thisMonth && _date.getDate() === thisDay, 18574 text: i, 18575 view: _disabled2 ? 'day disabled' : view 18576 })); 18577 } // Render days picker 18578 // ----------------------------------------------------------------------- 18579 18580 18581 this.$monthPrev.toggleClass(disabledClass, prevDisabled); 18582 this.$monthNext.toggleClass(disabledClass, nextDisabled); 18583 this.$monthCurrent.toggleClass(disabledClass, prevDisabled && nextDisabled).html(options.yearFirst ? "".concat(viewYear + yearSuffix, " ").concat(months[viewMonth]) : "".concat(months[viewMonth], " ").concat(viewYear).concat(yearSuffix)); 18584 this.$days.html(prevItems.join('') + items.join('') + nextItems.join('')); 18585 } 18586 }; 18587 18588 var CLASS_TOP_LEFT = "".concat(NAMESPACE, "-top-left"); 18589 var CLASS_TOP_RIGHT = "".concat(NAMESPACE, "-top-right"); 18590 var CLASS_BOTTOM_LEFT = "".concat(NAMESPACE, "-bottom-left"); 18591 var CLASS_BOTTOM_RIGHT = "".concat(NAMESPACE, "-bottom-right"); 18592 var CLASS_PLACEMENTS = [CLASS_TOP_LEFT, CLASS_TOP_RIGHT, CLASS_BOTTOM_LEFT, CLASS_BOTTOM_RIGHT].join(' '); 18593 18594 var Datepicker = 18595 /*#__PURE__*/ 18596
vendor: 12,282 bytes, lines 18596-19018
18596function () { 18597 function Datepicker(element) { 18598 var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; 18599 18600 _classCallCheck(this, Datepicker); 18601 18602 this.$element = $(element); 18603 this.element = element; 18604 this.options = $.extend({}, DEFAULTS, LANGUAGES[options.language], $.isPlainObject(options) && options); 18605 this.$scrollParent = getScrollParent(element, true); 18606 this.built = false; 18607 this.shown = false; 18608 this.isInput = false; 18609 this.inline = false; 18610 this.initialValue = ''; 18611 this.initialDate = null; 18612 this.startDate = null; 18613 this.endDate = null; 18614 this.init(); 18615 } 18616 18617 _createClass(Datepicker, [{ 18618 key: "init", 18619 value: function init() { 18620 var $this = this.$element, 18621 options = this.options; 18622 var startDate = options.startDate, 18623 endDate = options.endDate, 18624 date = options.date; 18625 this.$trigger = $(options.trigger); 18626 this.isInput = $this.is('input') || $this.is('textarea'); 18627 this.inline = options.inline && (options.container || !this.isInput); 18628 this.format = parseFormat(options.format); 18629 var initialValue = this.getValue(); 18630 this.initialValue = initialValue; 18631 this.oldValue = initialValue; 18632 date = this.parseDate(date || initialValue); 18633 18634 if (startDate) { 18635 startDate = this.parseDate(startDate); 18636 18637 if (date.getTime() < startDate.getTime()) { 18638 date = new Date(startDate); 18639 } 18640 18641 this.startDate = startDate; 18642 } 18643 18644 if (endDate) { 18645 endDate = this.parseDate(endDate); 18646 18647 if (startDate && endDate.getTime() < startDate.getTime()) { 18648 endDate = new Date(startDate); 18649 } 18650 18651 if (date.getTime() > endDate.getTime()) { 18652 date = new Date(endDate); 18653 } 18654 18655 this.endDate = endDate; 18656 } 18657 18658 this.date = date; 18659 this.viewDate = new Date(date); 18660 this.initialDate = new Date(this.date); 18661 this.bind(); 18662 18663 if (options.autoShow || this.inline) { 18664 this.show(); 18665 } 18666 18667 if (options.autoPick) { 18668 this.pick(); 18669 } 18670 } 18671 }, { 18672 key: "build", 18673 value: function build() { 18674 if (this.built) { 18675 return; 18676 } 18677 18678 this.built = true; 18679 var $this = this.$element, 18680 options = this.options; 18681 var $picker = $(options.template); 18682 this.$picker = $picker; 18683 this.$week = $picker.find(selectorOf('week')); // Years view 18684 18685 this.$yearsPicker = $picker.find(selectorOf('years picker')); 18686 this.$yearsPrev = $picker.find(selectorOf('years prev')); 18687 this.$yearsNext = $picker.find(selectorOf('years next')); 18688 this.$yearsCurrent = $picker.find(selectorOf('years current')); 18689 this.$years = $picker.find(selectorOf('years')); // Months view 18690 18691 this.$monthsPicker = $picker.find(selectorOf('months picker')); 18692 this.$yearPrev = $picker.find(selectorOf('year prev')); 18693 this.$yearNext = $picker.find(selectorOf('year next')); 18694 this.$yearCurrent = $picker.find(selectorOf('year current')); 18695 this.$months = $picker.find(selectorOf('months')); // Days view 18696 18697 this.$daysPicker = $picker.find(selectorOf('days picker')); 18698 this.$monthPrev = $picker.find(selectorOf('month prev')); 18699 this.$monthNext = $picker.find(selectorOf('month next')); 18700 this.$monthCurrent = $picker.find(selectorOf('month current')); 18701 this.$days = $picker.find(selectorOf('days')); 18702 18703 if (this.inline) { 18704 $(options.container || $this).append($picker.addClass("".concat(NAMESPACE, "-inline"))); 18705 } else { 18706 $(document.body).append($picker.addClass("".concat(NAMESPACE, "-dropdown"))); 18707 $picker.addClass(CLASS_HIDE).css({ 18708 zIndex: parseInt(options.zIndex, 10) 18709 }); 18710 } 18711 18712 this.renderWeek(); 18713 } 18714 }, { 18715 key: "unbuild", 18716 value: function unbuild() { 18717 if (!this.built) { 18718 return; 18719 } 18720 18721 this.built = false; 18722 this.$picker.remove(); 18723 } 18724 }, { 18725 key: "bind", 18726 value: function bind() { 18727 var options = this.options, 18728 $this = this.$element; 18729 18730 if ($.isFunction(options.show)) { 18731 $this.on(EVENT_SHOW, options.show); 18732 } 18733 18734 if ($.isFunction(options.hide)) { 18735 $this.on(EVENT_HIDE, options.hide); 18736 } 18737 18738 if ($.isFunction(options.pick)) { 18739 $this.on(EVENT_PICK, options.pick); 18740 } 18741 18742 if (this.isInput) { 18743 $this.on(EVENT_KEYUP, $.proxy(this.keyup, this)); 18744 } 18745 18746 if (!this.inline) { 18747 if (options.trigger) { 18748 this.$trigger.on(EVENT_CLICK, $.proxy(this.toggle, this)); 18749 } else if (this.isInput) { 18750 $this.on(EVENT_FOCUS, $.proxy(this.show, this)); 18751 } else { 18752 $this.on(EVENT_CLICK, $.proxy(this.show, this)); 18753 } 18754 } 18755 } 18756 }, { 18757 key: "unbind", 18758 value: function unbind() { 18759 var $this = this.$element, 18760 options = this.options; 18761 18762 if ($.isFunction(options.show)) { 18763 $this.off(EVENT_SHOW, options.show); 18764 } 18765 18766 if ($.isFunction(options.hide)) { 18767 $this.off(EVENT_HIDE, options.hide); 18768 } 18769 18770 if ($.isFunction(options.pick)) { 18771 $this.off(EVENT_PICK, options.pick); 18772 } 18773 18774 if (this.isInput) { 18775 $this.off(EVENT_KEYUP, this.keyup); 18776 } 18777 18778 if (!this.inline) { 18779 if (options.trigger) { 18780 this.$trigger.off(EVENT_CLICK, this.toggle); 18781 } else if (this.isInput) { 18782 $this.off(EVENT_FOCUS, this.show); 18783 } else { 18784 $this.off(EVENT_CLICK, this.show); 18785 } 18786 } 18787 } 18788 }, { 18789 key: "showView", 18790 value: function showView(view) { 18791 var $yearsPicker = this.$yearsPicker, 18792 $monthsPicker = this.$monthsPicker, 18793 $daysPicker = this.$daysPicker, 18794 format = this.format; 18795 18796 if (format.hasYear || format.hasMonth || format.hasDay) { 18797 switch (Number(view)) { 18798 case VIEWS.YEARS: 18799 $monthsPicker.addClass(CLASS_HIDE); 18800 $daysPicker.addClass(CLASS_HIDE); 18801 18802 if (format.hasYear) { 18803 this.renderYears(); 18804 $yearsPicker.removeClass(CLASS_HIDE); 18805 this.place(); 18806 } else { 18807 this.showView(VIEWS.DAYS); 18808 } 18809 18810 break; 18811 18812 case VIEWS.MONTHS: 18813 $yearsPicker.addClass(CLASS_HIDE); 18814 $daysPicker.addClass(CLASS_HIDE); 18815 18816 if (format.hasMonth) { 18817 this.renderMonths(); 18818 $monthsPicker.removeClass(CLASS_HIDE); 18819 this.place(); 18820 } else { 18821 this.showView(VIEWS.YEARS); 18822 } 18823 18824 break; 18825 // case VIEWS.DAYS: 18826 18827 default: 18828 $yearsPicker.addClass(CLASS_HIDE); 18829 $monthsPicker.addClass(CLASS_HIDE); 18830 18831 if (format.hasDay) { 18832 this.renderDays(); 18833 $daysPicker.removeClass(CLASS_HIDE); 18834 this.place(); 18835 } else { 18836 this.showView(VIEWS.MONTHS); 18837 } 18838 18839 } 18840 } 18841 } 18842 }, { 18843 key: "hideView", 18844 value: function hideView() { 18845 if (!this.inline && this.options.autoHide) { 18846 this.hide(); 18847 } 18848 } 18849 }, { 18850 key: "place", 18851 value: function place() { 18852 if (this.inline) { 18853 return; 18854 } 18855 18856 var $this = this.$element, 18857 options = this.options, 18858 $picker = this.$picker; 18859 var containerWidth = $(document).outerWidth(); 18860 var containerHeight = $(document).outerHeight(); 18861 var elementWidth = $this.outerWidth(); 18862 var elementHeight = $this.outerHeight(); 18863 var width = $picker.width(); 18864 var height = $picker.height(); 18865 18866 var _$this$offset = $this.offset(), 18867 left = _$this$offset.left, 18868 top = _$this$offset.top; 18869 18870 var offset = parseFloat(options.offset); 18871 var placement = CLASS_TOP_LEFT; 18872 18873 if (isNaN(offset)) { 18874 offset = 10; 18875 } 18876 18877 if (top > height && top + elementHeight + height > containerHeight) { 18878 top -= height + offset; 18879 placement = CLASS_BOTTOM_LEFT; 18880 } else { 18881 top += elementHeight + offset; 18882 } 18883 18884 if (left + width > containerWidth) { 18885 left += elementWidth - width; 18886 placement = placement.replace('left', 'right'); 18887 } 18888 18889 $picker.removeClass(CLASS_PLACEMENTS).addClass(placement).css({ 18890 top: top, 18891 left: left 18892 }); 18893 } // A shortcut for triggering custom events 18894 18895 }, { 18896 key: "trigger", 18897 value: function trigger(type, data) { 18898 var e = $.Event(type, data); 18899 this.$element.trigger(e); 18900 return e; 18901 } 18902 }, { 18903 key: "createItem", 18904 value: function createItem(data) { 18905 var options = this.options; 18906 var itemTag = options.itemTag; 18907 var item = { 18908 text: '', 18909 view: '', 18910 muted: false, 18911 picked: false, 18912 disabled: false, 18913 highlighted: false 18914 }; 18915 var classes = []; 18916 $.extend(item, data); 18917 18918 if (item.muted) { 18919 classes.push(options.mutedClass); 18920 } 18921 18922 if (item.highlighted) { 18923 classes.push(options.highlightedClass); 18924 } 18925 18926 if (item.picked) { 18927 classes.push(options.pickedClass); 18928 } 18929 18930 if (item.disabled) { 18931 classes.push(options.disabledClass); 18932 } 18933 18934 return "<".concat(itemTag, " class=\"").concat(classes.join(' '), "\" data-view=\"").concat(item.view, "\">").concat(item.text, "</").concat(itemTag, ">"); 18935 } 18936 }, { 18937 key: "getValue", 18938 value: function getValue() { 18939 var $this = this.$element; 18940 return this.isInput ? $this.val() : $this.text(); 18941 } 18942 }, { 18943 key: "setValue", 18944 value: function setValue() { 18945 var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; 18946 var $this = this.$element; 18947 18948 if (this.isInput) { 18949 $this.val(value); 18950 } else if (!this.inline || this.options.container) { 18951 $this.text(value); 18952 } 18953 } 18954 }], [{ 18955 key: "setDefaults", 18956 value: function setDefaults() { 18957 var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; 18958 $.extend(DEFAULTS, LANGUAGES[options.language], $.isPlainObject(options) && options); 18959 } 18960 }]); 18961 18962 return Datepicker; 18963 }(); 18964 18965 if ($.extend) { 18966 $.extend(Datepicker.prototype, render, handlers, methods); 18967 } 18968 18969 if ($.fn) { 18970 var AnotherDatepicker = $.fn.datepicker; 18971 18972 $.fn.datepicker = function jQueryDatepicker(option) { 18973 for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { 18974 args[_key - 1] = arguments[_key]; 18975 } 18976 18977 var result; 18978 this.each(function (i, element) { 18979 var $element = $(element); 18980 var isDestroy = option === 'destroy'; 18981 var datepicker = $element.data(NAMESPACE); 18982 18983 if (!datepicker) { 18984 if (isDestroy) { 18985 return; 18986 } 18987 18988 var options = $.extend({}, $element.data(), $.isPlainObject(option) && option); 18989 datepicker = new Datepicker(element, options); 18990 $element.data(NAMESPACE, datepicker); 18991 } 18992 18993 if (isString(option)) { 18994 var fn = datepicker[option]; 18995 18996 if ($.isFunction(fn)) { 18997 result = fn.apply(datepicker, args); 18998 18999 if (isDestroy) { 19000 $element.removeData(NAMESPACE); 19001 } 19002 } 19003 } 19004 }); 19005 return !isUndefined(result) ? result : this; 19006 }; 19007 19008 $.fn.datepicker.Constructor = Datepicker; 19009 $.fn.datepicker.languages = LANGUAGES; 19010 $.fn.datepicker.setDefaults = Datepicker.setDefaults; 19011 19012 $.fn.datepicker.noConflict = function noConflict() { 19013 $.fn.datepicker = AnotherDatepicker; 19014 return this; 19015 }; 19016 } 19017 19018}))
19018; 19019 19020/* 19021 textfill 19022 @name jquery.textfill.js 19023 @author Russ Painter (GeekyMonkey) 19024 @author Yu-Jie Lin 19025 @author Alexandre Dantas 19026 @version 0.6.2 19027 @date 2018-02-24 19028 @copyright (c) 2009 19029 @license MIT License 19030 @homepage https://github.com/jquery-textfill/jquery-textfill 19031 @example http://jquery-textfill.github.io/jquery-textfill/index.html 19032*/ 19033(function(k){k.fn.textfill=function(q){function e(){a.debug&&"undefined"!=typeof console&&"undefined"!=typeof console.debug&&console.debug.apply(console,arguments)}function n(b,a,f,l,m,g){function c(a,b){var c=" / ";a>b?c=" > ":a==b&&(c=" = ");return c}e("[TextFill] "+b+" { font-size: "+a.css("font-size")+",Height: "+a.height()+"px "+c(a.height(),f)+f+"px,Width: "+a.width()+c(a.width(),l)+l+",minFontPixels: "+m+"px, maxFontPixels: "+g+"px }")}function p(a,c,f,l,e,g,h,d){for(n(a,c,e,g,h,d);h<Math.floor(d)- 190341;){var b=Math.floor((h+d)/2);c.css("font-size",b);var k=f.call(c);if(k<=l){if(h=b,k==l)break}else d=b;n(a,c,e,g,h,d)}c.css("font-size",d);f.call(c)<=l&&(h=d,n(a+"* ",c,e,g,h,d));return h}var a=k.extend({debug:!1,maxFontPixels:40,minFontPixels:4,innerTag:"span",widthOnly:!1,success:null,fail:null,complete:null,explicitWidth:null,explicitHeight:null,changeLineHeight:!1,truncateOnFail:!1,allowOverflow:!1},q);e("[TextFill] Start Debug");this.each(function(){var b=k(a.innerTag+":first",this);e("[TextFill] Inner text: "+ 19035b.text());e("[TextFill] All options: ",a);e("[TextFill] Maximum sizes: { Height: "+c+"px, Width: "+f+"px }");if(b.is(":visible")){var c=a.explicitHeight||k(this).height(),f=a.explicitWidth||k(this).width(),l=b.css("font-size"),m=parseFloat(b.css("line-height"))/parseFloat(l),g=a.minFontPixels,h=0>=a.maxFontPixels?c:a.maxFontPixels,d=void 0;a.widthOnly?b.css("white-space","nowrap"):d=p("Height",b,k.fn.height,c,c,f,g,h);g=p("Width",b,k.fn.width,f,c,f,g,h);a.widthOnly?(b.css({"font-size":g}),a.changeLineHeight&& 19036b.parent().css("line-height",m*g+"px")):(d=Math.min(d,g),b.css("font-size",d),a.changeLineHeight&&b.parent().css("line-height",m*d+"px"));e("[TextFill] Finished { Old font-size: "+l+", New font-size: "+b.css("font-size")+" }");b.width()>f&&!a.allowOverflow||b.height()>c&&!a.widthOnly&&!a.allowOverflow?(b.css("font-size",l),a.fail&&a.fail(this),e("[TextFill] Failure { Current Width: "+b.width()+", Maximum Width: "+f+", Current Height: "+b.height()+", Maximum Height: "+c+" }")):a.success&&a.success(this)}else a.fail&& 19037a.fail(this),e("[TextFill] Failure { Current Width: "+b.width()+", Maximum Width: "+f+", Current Height: "+b.height()+", Maximum Height: "+c+" }")});a.complete&&a.complete(this);e("[TextFill] End Debug");return this}})(function(){return"undefined"!==typeof module&&module.exports?require("jquery"):window.jQuery}()); 19038 19039/*! 19040 * JavaScript Cookie v2.2.0 19041 * https://github.com/js-cookie/js-cookie 19042 * 19043 * Copyright 2006, 2015 Klaus Hartl & Fagner Brack 19044 * Released under the MIT license 19045 */ 19046;(function (factory) { 19047 var registeredInModuleLoader; 19048 if (typeof define === 'function' && define.amd) { 19049 define(factory); 19050 registeredInModuleLoader = true; 19051 } 19052 if (typeof exports === 'object') { 19053 module.exports = factory(); 19054 registeredInModuleLoader = true; 19055 } 19056 if (!registeredInModuleLoader) { 19057 var OldCookies = window.Cookies; 19058 var api = window.Cookies = factory(); 19059 api.noConflict = function () { 19060 window.Cookies = OldCookies; 19061 return api; 19062 }; 19063 } 19064}(function () { 19065 function extend () { 19066 var i = 0; 19067 var result = {}; 19068 for (; i < arguments.length; i++) { 19069 var attributes = arguments[ i ]; 19070 for (var key in attributes) { 19071 result[key] = attributes[key]; 19072 } 19073 } 19074 return result; 19075 } 19076 19077 function decode (s) { 19078 return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent); 19079 } 19080 19081 function init (converter) { 19082 function api() {} 19083
19084 function set (key, value, attributes) { 19085 if (typeof document === 'undefined') { 19086 return; 19087 } 19088 19089 attributes = extend({ 19090 path: '/' 19091 }, api.defaults, attributes); 19092 19093 if (typeof attributes.expires === 'number') { 19094 attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5); 19095 } 19096 19097 // We're using "expires" because "max-age" is not supported by IE 19098 attributes.expires = attributes.expires ? attributes.expires.toUTCString() : ''; 19099 19100 try { 19101 var result = JSON.stringify(value); 19102 if (/^[\{\[]/.test(result)) { 19103 value = result; 19104 } 19105 } catch (e) {} 19106 19107 value = converter.write ? 19108 converter.write(value, key) : 19109 encodeURIComponent(String(value)) 19110 .replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent); 19111 19112 key = encodeURIComponent(String(key)) 19113 .replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent) 19114 .replace(/[\(\)]/g, escape); 19115 19116 var stringifiedAttributes = ''; 19117 for (var attributeName in attributes) { 19118 if (!attributes[attributeName]) { 19119 continue; 19120 } 19121 stringifiedAttributes += '; ' + attributeName; 19122 if (attributes[attributeName] === true) { 19123 continue; 19124 } 19125 19126 // Considers RFC 6265 section 5.2: 19127 // ... 19128 // 3. If the remaining unparsed-attributes contains a %x3B (";") 19129 // character: 19130 // Consume the characters of the unparsed-attributes up to, 19131 // not including, the first %x3B (";") character. 19132 // ... 19133 stringifiedAttributes += '=' + attributes[attributeName].split(';')[0]; 19134 } 19135 19136 return (document.cookie = key + '=' + value + stringifiedAttributes); 19137 } 19138 19139 function get (key, json) { 19140 if (typeof document === 'undefined') { 19141 return; 19142 } 19143 19144 var jar = {}; 19145 // To prevent the for loop in the first place assign an empty array 19146 // in case there are no cookies at all. 19147 var cookies = document.cookie ? document.cookie.split('; ') : []; 19148 var i = 0; 19149 19150 for (; i < cookies.length; i++) { 19151 var parts = cookies[i].split('='); 19152 var cookie = parts.slice(1).join('='); 19153 19154 if (!json && cookie.charAt(0) === '"') { 19155 cookie = cookie.slice(1, -1); 19156 } 19157 19158 try { 19159 var name = decode(parts[0]); 19160 cookie = (converter.read || converter)(cookie, name) || 19161 decode(cookie); 19162 19163 if (json) { 19164 try { 19165 cookie = JSON.parse(cookie); 19166 } catch (e) {} 19167 } 19168 19169 jar[name] = cookie; 19170 19171 if (key === name) { 19172 break; 19173 } 19174 } catch (e) {} 19175 } 19176 19177 return key ? jar[key] : jar; 19178 } 19179 19180 api.set = set; 19181 api.get = function (key) { 19182 return get(key, false /* read as raw */); 19183 }; 19184 api.getJSON = function (key) { 19185 return get(key, true /* read as json */); 19186 }; 19187 api.remove = function (key, attributes) { 19188 set(key, '', extend(attributes, { 19189 expires: -1 19190 })); 19191 }; 19192 19193 api.defaults = {}; 19194 19195 api.withConverter = init; 19196 19197 return api; 19198 } 19199 19200 return init(function () {}); 19201})); 19202 19203// Ajoute un bouton mute/unmute sur le Jumbotron 19204const jumboo = document.querySelector("#header_jumbotron"); 19205if (jumboo) { 19206 const video = jumboo.querySelector("video"); 19207 if (video) { 19208 const muteButton = jumboo.querySelector(".mute-button"); 19209 // Fonction de basculement mute/unmute 19210 muteButton.addEventListener("click", (e) => { 19211 e.preventDefault(); 19212 e.stopPropagation(); 19213 19214 // Bascule l'état mute de la vidéo 19215 video.muted = !video.muted; 19216 19217 // Sélectionne les icônes 19218 const muteIcon = muteButton.querySelector(".mute-icon"); 19219 const unmuteIcon = muteButton.querySelector(".unmute-icon"); 19220 19221 // Bascule les classes 'active' pour afficher l'icône appropriée 19222 if (video.muted) { 19223 muteIcon.classList.add("active"); 19224 unmuteIcon.classList.remove("active"); 19225 } else { 19226 muteIcon.classList.remove("active"); 19227 unmuteIcon.classList.add("active"); 19228 } 19229 19230 // Ajoute la classe d'animation 19231 muteButton.classList.add("animate-icon"); 19232 19233 // Supprime la classe d'animation après la fin de l'animation 19234 muteButton.addEventListener("transitionend", () => { 19235 muteButton.classList.remove("animate-icon"); 19236 }, { once: true }); 19237 }); 19238 } 19239} 19240 19241// Open share container in news 19242function openShare() { 19243 const shareContainer = document.querySelector(".news-share .news-share-container"); 19244 shareContainer.classList.toggle("hidden"); 19245} 19246 19247 19248/** 19249 * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.6.0 19250 * Copyright (C) 2015 Oliver Nightingale 19251 * MIT Licensed 19252 * @license 19253 */ 19254!function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.6.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");
19254n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(e<i.idx)return this.list=new t.Vector.Node(e,n,i),this.length++;for(var r=i,o=i.next;void 0!=o;){if(e<o.idx)return r.next=new t.Vector.Node(e,n,o),this.length++;r=o,o=o.next}return r.next=new t.Vector.Node(e,n,o),this.length++},t.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var t,e=this.list,n=0;e;)t=e.val,n+=t*t,e=e.next;return this._magnitude=Math.sqrt(n)},t.Vector.prototype.dot=function(t){for(var e=this.list,n=t.list,i=0;e&&n;)e.idx<n.idx?e=e.next:e.idx>n.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t<arguments.length;t++)e=arguments[t],~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e);this.length=this.elements.length},t.SortedSet.prototype.toArray=function(){return this.elements.slice()},t.SortedSet.prototype.map=function(t,e){return this.elements.map(t,e)},t.SortedSet.prototype.forEach=function(t,e){return this.elements.forEach(t,e)},t.SortedSet.prototype.indexOf=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;
19254a[i]!==h[r]?a[i]<h[r]?i++:a[i]>h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},r=new t.SortedSet,o=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=o,t.SortedSet.prototype.add.apply(r,o)},this),this.documentStore.set(o,r),t.SortedSet.prototype.add.apply(this.corpusTokens,r.toArray());for(var s=0;s<r.length;s++){var a=r.elements[s],h=this._fields.reduce(function(t,e){var n=i[e.name].length;if(!n)return t;var r=i[e.name].filter(function(t){return t===a}).length;return t+r/n*e.boost},0);this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),p=Object.keys(f),d=p.length,v=0;d>v;v++)l.add(f[p[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1
19254);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),p=new RegExp(u),d=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+r+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=d,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=m,a=g,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=p,a.test(i)&&(n=i,a=S,h=w,u=x,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return!1;e=e[t.charAt(n)]}return!0},t.TokenStore.prototype.getNode=function(t){if(!t)return{};for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return{};e=e[t.charAt(n)]}return e},t.TokenStore.prototype.get=function(t,e){return this.getNode(t,e).docs||{}},t.TokenStore.prototype.count=function(t,e){return Object.keys(this.get(t,e)).length},t.TokenStore.prototype.remove=function(t,e){if(t){for(var n=this.root,i=0;i<t.length;i++){if(!(t.charAt(i)in n))return;n=n[t.charAt(i)]}delete n.docs[e]}},t.TokenStore.prototype.expand=function(t,e){var n=this.getNode(t),i=n.docs||{},e=e||[];
19254return Object.keys(i).length&&e.push(t),Object.keys(n).forEach(function(n){"docs"!==n&&e.concat(this.expand(t+n,e))},this),e},t.TokenStore.prototype.toJSON=function(){return{root:this.root,length:this.length}},function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.lunr=e()}(this,function(){return t})}(); 19255!function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'<button class="slick-prev" aria-label="Previous" type="button">Previous</button>',nextArrow:'<button class="slick-next" aria-label="Next" type="button">Next</button>',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('<button type="button" />').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(t),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(t).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=e++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}}()).prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&"object"==typeof t&&t.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots){for(o.$slider.addClass("slick-dotted"),t=i("<ul />").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("<li />").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('<div class="slick-track"/>').appendTo(e.$slider):e.$slides.wrapAll('<div class="slick-track"/>').parent(),e.$list=e.$slideTrack.wrap('<div class="slick-list"/>').parent(),e.$slideTrack.css("opacity",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.o
vendor: 3,442 bytes, line 19255
19255ptions.rows>1){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;i<s;i++){var d=document.createElement("div");for(e=0;e<l.options.rows;e++){var a=document.createElement("div");for(t=0;t<l.options.slidesPerRow;t++){var c=i*r+(e*l.options.slidesPerRow+t);n.get(c)&&a.appendChild(n.get(c))}d.appendChild(a)}o.appendChild(d)}l.$slider.empty().append(o),l.$slider.children().children().children().css({width:100/l.options.slidesPerRow+"%",display:"inline-block"})}},e.prototype.checkResponsive=function(e,t){var o,s,n,r=this,l=!1,d=r.$slider.width(),a=window.innerWidth||i(window).width();if("window"===r.respondTo?n=a:"slider"===r.respondTo?n=d:"min"===r.respondTo&&(n=Math.min(a,d)),r.options.responsive&&r.options.responsive.length&&null!==r.options.responsive){s=null;for(o in r.breakpoints)r.breakpoints.hasOwnProperty(o)&&(!1===r.originalSettings.mobileFirst?n<r.breakpoints[o]&&(s=r.breakpoints[o]):n>r.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t;if(e=this.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var o in e){if(i<e[o]){i=t;break}t=e[o]}return i},e.prototype.cleanUpEvents=function(){var e=this;e.options.dots&&null!==e.$dots&&(i("li",e.$dots).off("click.slick",e.changeSlide).off("mouseenter.slick",i.proxy(e.interrupt,e,!0)).off("mouseleave.slick",i.proxy(e.interrupt,e,!1)),!0===e.options.accessibility&&e.$dots.off("keydown.slick",e.keyHandler)),e.$slider.off("focus.slick blur.slick"),!0===e.options.arrows&&e.slideCount>e.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.
19255slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>1&&((i=e.$slides.children().children()).removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(":focus"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else if(!0===i.options.centerMode)o=i.slideCount;else if(i.options.asNavFor)for(;e<i.slideCount;)++o,e=t+i.options.slidesToScroll,t+=i.options.slidesToScroll<=i.options.slidesToShow?i.options.slidesToScroll:i.options.slidesToShow;else o=1+Math.ceil((i.slideCount-i.options.slidesToShow)/i.options.slidesToScroll);return o-1},e.prototype.getLeft=function(i){var e,t,o,s,n=this,r=0;return n.slideOffset=0,t=n.$slides.first().outerHeight(!0),!0===n.options.infinite?(n.slideCount>n.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t<i;)s.push(t),t=o+e.options.slidesToScroll,o+=e.options.slidesToScroll<=e.options.slidesToShow?e.options.slidesToScroll:e.options.slidesToShow;return s},e.prototype.getSlick=function(){return this},e.prototype.getSlideCount=function(){var e,t,o=this;return t=!0===o.options.centerMode?o.slideWidth*Math.floor(o.options.slidesToShow/2):0,!0===o.options.swipeToSlide?(o.$slideTrack.find(".slick-slide").each(function(s,n){if(n.offsetLeft-t+i(n).outerWidth()/2>-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr("data-slick-index")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:"index",index:
19255parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&i<e.slideCount});e.$slides.add(e.$slideTrack.find(".slick-cloned")).attr({"aria-hidden":"true",tabindex:"-1"}).find("a, input, button, select").attr({tabindex:"-1"}),null!==e.$dots&&(e.$slides.not(e.$slideTrack.find(".slick-cloned")).each(function(t){var s=o.indexOf(t);i(this).attr({role:"tabpanel",id:"slick-slide"+e.instanceUid+t,tabindex:-1}),-1!==s&&i(this).attr({"aria-describedby":"slick-slide-control"+e.instanceUid+s})}),e.$dots.attr("role","tablist").find("li").each(function(s){var n=o[s];i(this).attr({role:"presentation"}),i(this).find("button").first().attr({role:"tab",id:"slick-slide-control"+e.instanceUid+s,"aria-controls":"slick-slide"+e.instanceUid+n,"aria-label":s+1+" of "+t,"aria-selected":null,tabindex:"-1"})}).eq(e.currentSlide).find("button").attr({"aria-selected":"true",tabindex:"0"}).end());for(var s=e.currentSlide,n=s+e.options.slidesToShow;s<n;s++)e.$slides.eq(s).attr("tabindex",0);e.activateADA()},e.prototype.initArrowEvents=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on("keydown.slick",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"}
19255,e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?"next":"previous"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||n.$slider.attr("data-sizes"),r=document.createElement("img");r.onload=function(){e.animate({opacity:0}
vendor: 5,619 bytes, line 19255
19255,100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),n.$slider.trigger("lazyLoaded",[n,e,t])})},r.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),n.$slider.trigger("lazyLoadError",[n,e,t])},r.src=t})}var t,o,s,n=this;if(!0===n.options.centerMode?!0===n.options.infinite?s=(o=n.currentSlide+(n.options.slidesToShow/2+1))+n.options.slidesToShow+2:(o=Math.max(0,n.currentSlide-(n.options.slidesToShow/2+1)),s=n.options.slidesToShow/2+1+2+n.currentSlide):(o=n.options.infinite?n.options.slidesToShow+n.currentSlide:n.currentSlide,s=Math.ceil(o+n.options.slidesToShow),!0===n.options.fade&&(o>0&&o--,s<=n.slideCount&&s++)),t=n.$slider.find(".slick-slide").slice(o,s),"anticipated"===n.options.lazyLoad)for(var r=o-1,l=s,d=n.$slider.find(".slick-slide"),a=0;a<n.options.slidesToScroll;a++)r<0&&(r=n.slideCount-1),t=(t=t.add(d.eq(r))).add(d.eq(l)),r--,l++;e(t),n.slideCount<=n.options.slidesToShow?e(n.$slider.find(".slick-slide")):n.currentSlide>=n.slideCount-n.options.slidesToShow?e(n.$slider.find(".slick-cloned").slice(0,n.options.slidesToShow)):0===n.currentSlide&&e(n.$slider.find(".slick-cloned").slice(-1*n.options.slidesToShow))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;t.unslicked||(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange&&i(t.$slides.get(t.currentSlide)).attr("tabindex",0).focus()))},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),(r=document.createElement("img")).onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if(i="boolean"==typeof i?!0===(e=i)?0:o.slideCount-1:!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};
19255!0===o.options.rtl&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}
19255):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":void 0!==arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?"top":"left","top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-i<n.options.slidesToShow?t.slice(o-(n.options.slidesToShow-s),o+s).addClass("slick-active").attr("aria-hidden","false"):t.slice(o,o+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"));"ondemand"!==n.options.lazyLoad&&"anticipated"!==n.options.lazyLoad||n.lazyLoad()},e.prototype.setupInfinite=function(){var e,t,o,s=this;if(!0===s.options.fade&&(s.options.centerMode=!1),!0===s.options.infinite&&!1===s.options.fade&&(t=null,s.slideCount>s.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;e<o+s.slideCount;e+=1)t=e,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t+s.slideCount).appendTo(s.$slideTrack).addClass("slick-cloned");s.$slideTrack.find(".slick-cloned").find("[id]").each(function(){i(this).attr("id","")})}},e.prototype.interrupt=function(i){var e=this;i||e.autoPlay(),e.interrupted=i},e.prototype.selectHandler=function(e){var t=this,o=i(e.target).is(".slick-slide")?i(e.target):i(e.target).parents(".slick-slide"),s=parseInt(o.attr("data-slick-index"));s||(s=0),t.slideCount<=t.options.slidesToShow?t.slideHandler(s,!1,!0):t.slideHandler(s)},e.prototype.slideHandler=function(i,e,t){var o,s,n,r,l,d=null,a=this;if(e=e||!1,!(!0===a.animating&&!0===a.options.waitForAnimate||!0===a.options.fade&&a.currentSlide===i))if(!1===e&&a.asNavFor(i),o=i,d=a.getLeft(o),r=a.getLeft(a.currentSlide),a.currentLeft=null===a.swipeLeft?r:a.swipeLeft,!1===a.options.infinite&&!1===a.options.centerMode&&(i<0||i>a.getDotCount()*a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else{if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+
19255o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=(l=a.getNavTarget()).slick("getSlick")).slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),(o=Math.round(180*t/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?"left":"right":o<=360&&o>=315?!1===s.options.rtl?"left":"right":o>=135&&o<=225?!1===s.options.rtl?"right":"left":!0===s.options.verticalSwiping?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf("mouse")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")}
19255,e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===i.currentSlide?(i.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i<r;i++)if("object"==typeof s||void 0===s?o[i].slick=new e(o[i],s):t=o[i].slick[s].apply(o[i].slick,n),void 0!==t)return t;return o}}); 19256 19257/** 19258 * vis.js 19259 * https://github.com/almende/vis 19260 * 19261 * A dynamic, browser-based visualization library. 19262 * 19263 * @version 4.20.1-SNAPSHOT 19264 * @date 2017-10-12 19265 * 19266 * @license 19267 * Copyright (C) 2011-2017 Almende B.V, http://almende.com 19268 * 19269 * Vis.js is dual licensed under both 19270 * 19271 * * The Apache 2.0 License 19272 * http://www.apache.org/licenses/LICENSE-2.0 19273 * 19274 * and 19275 * 19276 * * The MIT License 19277 * http://opensource.org/licenses/MIT 19278 * 19279 * Vis.js may be distributed under either license. 19280 */ 19281"use strict";!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.vis=e():t.vis=e()}(this,function(){return function(t){function e(o){if(i[o])return i[o].exports;var n=i[o]={i:o,l:!1,exports:{}};return t[o].call(n.exports,n,n.exports,e),n.l=!0,n.exports}var i={};return e.m=t,e.c=i,e.d=function(t,i,o){e.o(t,i)||Object.defineProperty(t,i,{configurable:!1,enumerable:!0,get:o})},e.n=function(t){var i=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(i,"a",i),i},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=123)}([function(t,e,i){e.__esModule=!0,e.default=function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}},function(t,e,i){e.__esModule=!0;var o=i(169),n=function(t){return t&&t.__esModule?t:{default:t}}(o);e.default=function(){function t(t,e){for(var i=0;i<e.length;i++){var o=e[i];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),(0,n.default)(t,o.key,o)}}return function(e,i,o){return i&&t(e.prototype,i),o&&t(e,o),e}}()},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e,i,o){var n=!1;!0===o&&(n=null===e[i]&&void 0!==t[i]),n?delete t[i]:t[i]=e[i]}var s=i(77),r=o(s),a=i(29),h=o(a),d=i(8),l=o(d),u=i(6),c=o(u),p=i(9),f=i(157);e.isNumber=function(t){return t instanceof Number||"number"==typeof t},e.recursiveDOMDelete=function(t){if(t)for(;!0===t.hasChildNodes();)e.recursiveDOMDelete(t.firstChild),t.removeChild(t.firstChild)},e.giveRange=function(t,e,i,o){if(e==t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)},e.isString=function(t){return t instanceof String||"string"==typeof t},e.isDate=function(t){if(t instanceof Date)return!0;if(e.isString(t)){if(m.exec(t))return!0;if(!isNaN(Date.parse(t)))return!0}return!1},e.randomUUID=function(){return f.v4()},e.assignAllKeys=function(t,e){for(var i in t)t.hasOwnProperty(i)&&"object"!==(0,c.default)(t[i])&&(t[i]=e)},e.fillIfDefined=function(t,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];for(var s in t)void 0!==i[s]&&(null===i[s]||"object"!==(0,c.default)(i[s])?n(t,i,s,o):"object"===(0,c.default)(t[s])&&e.fillIfDefined(t[s],i[s],o))},e.extend=function(t,e){for(var i=1;i<arguments.length;i++){var o=arguments[i];for(var n in o)o.hasOwnProperty(n)&&(t[n]=o[n])}return t}
19281,e.selectiveExtend=function(t,e,i){if(!Array.isArray(t))throw new Error("Array with property names expected as first argument");for(var o=2;o<arguments.length;o++)for(var n=arguments[o],s=0;s<t.length;s++){var r=t[s];n&&n.hasOwnProperty(r)&&(e[r]=n[r])}return e},e.selectiveDeepExtend=function(t,i,o){var s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r=0;r<t.length;r++){var a=t[r];if(o.hasOwnProperty(a))if(o[a]&&o[a].constructor===Object)void 0===i[a]&&(i[a]={}),i[a].constructor===Object?e.deepExtend(i[a],o[a],!1,s):n(i,o,a,s);else{if(Array.isArray(o[a]))throw new TypeError("Arrays are not supported by deepExtend");n(i,o,a,s)}}return i},e.selectiveNotDeepExtend=function(t,i,o){var s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(Array.isArray(o))throw new TypeError("Arrays are not supported by deepExtend");for(var r in o)if(o.hasOwnProperty(r)&&-1===t.indexOf(r))if(o[r]&&o[r].constructor===Object)void 0===i[r]&&(i[r]={}),i[r].constructor===Object?e.deepExtend(i[r],o[r]):n(i,o,r,s);else if(Array.isArray(o[r])){i[r]=[];for(var a=0;a<o[r].length;a++)i[r].push(o[r][a])}else n(i,o,r,s);return i},e.deepExtend=function(t,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=arguments.length>3&&void 0!==arguments[3]&&arguments[3];for(var r in i)if(i.hasOwnProperty(r)||!0===o)if(i[r]&&i[r].constructor===Object)void 0===t[r]&&(t[r]={}),t[r].constructor===Object?e.deepExtend(t[r],i[r],o):n(t,i,r,s);else if(Array.isArray(i[r])){t[r]=[];for(var a=0;a<i[r].length;a++)t[r].push(i[r][a])}else n(t,i,r,s);return t},e.equalArray=function(t,e){if(t.length!=e.length)return!1;for(var i=0,o=t.length;i<o;i++)if(t[i]!=e[i])return!1;return!0},e.convert=function(t,i){var o;if(void 0!==t){if(null===t)return null;if(!i)return t;if("string"!=typeof i&&!(i instanceof String))throw new Error("Type must be a string");switch(i){case"boolean":case"Boolean":return Boolean(t);case"number":case"Number":return e.isString(t)&&!isNaN(Date.parse(t))?p(t).valueOf():Number(t.valueOf());case"string":case"String":return String(t);case"Date":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return new Date(t.valueOf());if(p.isMoment(t))return new Date(t.valueOf());if(e.isString(t))return o=m.exec(t),o?new Date(Number(o[1])):p(new Date(t)).toDate();throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"Moment":if(e.isNumber(t))return p(t);if(t instanceof Date)return p(t.valueOf());if(p.isMoment(t))return p(t);if(e.isString(t))return o=m.exec(t),p(o?Number(o[1]):t);throw new Error("Cannot convert object of type "+e.getType(t)+" to type Date");case"ISODate":if(e.isNumber(t))return new Date(t);if(t instanceof Date)return t.toISOString();if(p.isMoment(t))return t.toDate().toISOString();if(e.isString(t))return o=m.exec(t),o?new Date(Number(o[1])).toISOString():p(t).format();throw new Error("Cannot convert object of type "+e.getType(t)+" to type ISODate");case"ASPDate":if(e.isNumber(t))return"/Date("+t+")/";if(t instanceof Date)return"/Date("+t.valueOf()+")/";if(e.isString(t)){o=m.exec(t);return"/Date("+(o?new Date(Number(o[1])).valueOf():new Date(t).valueOf())+")/"}throw new Error("Cannot convert object of type "+e.getType(t)+" to type ASPDate");default:throw new Error('Unknown type "'+i+'"')}}};var m=/^\/?Date\((\-?\d+)/i;e.getType=function(t){var e=void 0===t?"undefined":(0,c.default)(t);return"object"==e?null===t?"null":t instanceof Boolean?"Boolean":t instanceof Number?"Number":t instanceof String?"String":Array.isArray(t)?"Array":t instanceof Date?"Date":"Object":"number"==e?"Number":"boolean"==e?"Boolean":"string"==e?"String":void 0===e?"undefined":e},e.copyAndExtendArray=function(t,e){for(var i=[],o=0;o<t.length;o++)i.push(t[o]);return i.push(e),i},e.copyArray=function(t){for(var e=[],i=0;i<t.length;i++)e.push(t[i]);return e},e.getAbsoluteLeft=function(t){return t.getBoundingClientRect().left},e.getAbsoluteRight=function(t){return t.getBoundingClientRect().right},e.getAbsoluteTop=function(t){return t.getBoundingClientRect().top},e.addClassName=function(t,e){var i=t.className.split(" "),o=e.split(" ");i=i.concat(o.filter(function(t){return i.indexOf(t)<0})),t.className=i.join(" ")},e.removeClassName=function(t,e){var i=t.className.split(" "),o=e.split(" ");i=i.filter(function(t){return o.indexOf(t)<0}),t.className=i.join(" ")},e.forEach=function(t,e){var i,o;if(Array.isArray(t))for(i=0,o=t.length;i<o;i++)e(t[i],i,t);else for(i in t)t.hasOwnProperty(i)&&e(t[i],i,t)},e.toArray=function(t){var e=[];for(var i in t)t.hasOwnProperty(i)&&e.push(t[i]);return e}
19281,e.updateProperty=function(t,e,i){return t[e]!==i&&(t[e]=i,!0)},e.throttle=function(t){var e=!1;return function(){e||(e=!0,requestAnimationFrame(function(){e=!1,t()}))}},e.addEventListener=function(t,e,i,o){t.addEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.addEventListener(e,i,o)):t.attachEvent("on"+e,i)},e.removeEventListener=function(t,e,i,o){t.removeEventListener?(void 0===o&&(o=!1),"mousewheel"===e&&navigator.userAgent.indexOf("Firefox")>=0&&(e="DOMMouseScroll"),t.removeEventListener(e,i,o)):t.detachEvent("on"+e,i)},e.preventDefault=function(t){t||(t=window.event),t.preventDefault?t.preventDefault():t.returnValue=!1},e.getTarget=function(t){t||(t=window.event);var e;return t.target?e=t.target:t.srcElement&&(e=t.srcElement),void 0!=e.nodeType&&3==e.nodeType&&(e=e.parentNode),e},e.hasParent=function(t,e){for(var i=t;i;){if(i===e)return!0;i=i.parentNode}return!1},e.option={},e.option.asBoolean=function(t,e){return"function"==typeof t&&(t=t()),null!=t?0!=t:e||null},e.option.asNumber=function(t,e){return"function"==typeof t&&(t=t()),null!=t?Number(t)||e||null:e||null},e.option.asString=function(t,e){return"function"==typeof t&&(t=t()),null!=t?String(t):e||null},e.option.asSize=function(t,i){return"function"==typeof t&&(t=t()),e.isString(t)?t:e.isNumber(t)?t+"px":i||null},e.option.asElement=function(t,e){return"function"==typeof t&&(t=t()),t||e||null},e.hexToRGB=function(t){var e=/^#?([a-f\d])([a-f\d])([a-f\d])$/i;t=t.replace(e,function(t,e,i,o){return e+e+i+i+o+o});var i=/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(t);return i?{r:parseInt(i[1],16),g:parseInt(i[2],16),b:parseInt(i[3],16)}:null},e.overrideOpacity=function(t,i){var o;return-1!=t.indexOf("rgba")?t:-1!=t.indexOf("rgb")?(o=t.substr(t.indexOf("(")+1).replace(")","").split(","),"rgba("+o[0]+","+o[1]+","+o[2]+","+i+")"):(o=e.hexToRGB(t),null==o?t:"rgba("+o.r+","+o.g+","+o.b+","+i+")")},e.RGBToHex=function(t,e,i){return"#"+((1<<24)+(t<<16)+(e<<8)+i).toString(16).slice(1)},e.parseColor=function(t){var i;if(!0===e.isString(t)){if(!0===e.isValidRGB(t)){var o=t.substr(4).substr(0,t.length-5).split(",").map(function(t){return parseInt(t)});t=e.RGBToHex(o[0],o[1],o[2])}if(!0===e.isValidHex(t)){var n=e.hexToHSV(t),s={h:n.h,s:.8*n.s,v:Math.min(1,1.02*n.v)},r={h:n.h,s:Math.min(1,1.25*n.s),v:.8*n.v},a=e.HSVToHex(r.h,r.s,r.v),h=e.HSVToHex(s.h,s.s,s.v);i={background:t,border:a,highlight:{background:h,border:a},hover:{background:h,border:a}}}else i={background:t,border:t,highlight:{background:t,border:t},hover:{background:t,border:t}}}else i={},i.background=t.background||void 0,i.border=t.border||void 0,e.isString(t.highlight)?i.highlight={border:t.highlight,background:t.highlight}:(i.highlight={},i.highlight.background=t.highlight&&t.highlight.background||void 0,i.highlight.border=t.highlight&&t.highlight.border||void 0),e.isString(t.hover)?i.hover={border:t.hover,background:t.hover}:(i.hover={},i.hover.background=t.hover&&t.hover.background||void 0,i.hover.border=t.hover&&t.hover.border||void 0);return i},e.RGBToHSV=function(t,e,i){t/=255,e/=255,i/=255;var o=Math.min(t,Math.min(e,i)),n=Math.max(t,Math.max(e,i));if(o==n)return{h:0,s:0,v:o};var s=t==o?e-i:i==o?t-e:i-t;return{h:60*((t==o?3:i==o?1:5)-s/(n-o))/360,s:(n-o)/n,v:n}};var v={split:function(t){var e={};return t.split(";").forEach(function(t){if(""!=t.trim()){var i=t.split(":"),o=i[0].trim(),n=i[1].trim();e[o]=n}}),e},join:function(t){return(0,l.default)(t).map(function(e){return e+": "+t[e]}).join("; ")}};e.addCssText=function(t,i){var o=v.split(t.style.cssText),n=v.split(i),s=e.extend(o,n);t.style.cssText=v.join(s)},e.removeCssText=function(t,e){var i=v.split(t.style.cssText),o=v.split(e);for(var n in o)o.hasOwnProperty(n)&&delete i[n];t.style.cssText=v.join(i)},e.HSVToRGB=function(t,e,i){var o,n,s,r=Math.floor(6*t),a=6*t-r,h=i*(1-e),d=i*(1-a*e),l=i*(1-(1-a)*e);switch(r%6){case 0:o=i,n=l,s=h;break;case 1:o=d,n=i,s=h;break;case 2:o=h,n=i,s=l;break;case 3:o=h,n=d,s=i;break;case 4:o=l,n=h,s=i;break;case 5:o=i,n=h,s=d}return{r:Math.floor(255*o),g:Math.floor(255*n),b:Math.floor(255*s)}},e.HSVToHex=function(t,i,o){var n=e.HSVToRGB(t,i,o);return e.RGBToHex(n.r,n.g,n.b)},e.hexToHSV=function(t){var i=e.hexToRGB(t);return e.RGBToHSV(i.r,i.g,i.b)},e.isValidHex=function(t){return/(^#[0-9A-F]{6}$)|(^#[0-9A-F]{3}$)/i.test(t)},e.isValidRGB=function(t){return t=t.replace(" ",""),/rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)/i.test(t)},e.isValidRGBA=function(t){return t=t.replace(" ",""),/rgba\((\d{1,3}),(\d{1,3}),(\d{1,3}),(.{1,3})\)/i.test(t)},e.selectiveBridgeObject=function(t,i){if(null!==i&&"object"===(void 0===i?"undefined":(0,c.default)(i))){for(var o=(0,h.default)(i),n=0;n<t.length;n++)i.hasOwnProperty(t[n])&&"object"==(0,c.default)(i[t[n]])&&(o[t[n]]=e.bridgeObject(i[t[n]]));return o}return null},e.bridgeObject=function(t){if(null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))){var i=(0,h.default)(t);if(t instanceof Element)i=t;else{i=(0,h.default)(t);for(var o in t)t.hasOwnProperty(o)&&"object"==(0,c.default)(t[o])&&
19281(i[o]=e.bridgeObject(t[o]))}return i}return null},e.insertSort=function(t,e){for(var i=0;i<t.length;i++){for(var o=t[i],n=i;n>0&&e(o,t[n-1])<0;n--)t[n]=t[n-1];t[n]=o}return t},e.mergeOptions=function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=function(t){return null!==t&&void 0!==t},s=function(t){return null!==t&&"object"===(void 0===t?"undefined":(0,c.default)(t))};if(!s(t))throw new Error("Parameter mergeTarget must be an object");if(!s(e))throw new Error("Parameter options must be an object");if(!n(i))throw new Error("Parameter option must have a value");if(!s(o))throw new Error("Parameter globalOptions must be an object");var r=e[i],a=s(o)&&!function(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}(o),d=a?o[i]:void 0,l=d?d.enabled:void 0;if(void 0!==r){if("boolean"==typeof r)return s(t[i])||(t[i]={}),void(t[i].enabled=r);if(null===r&&!s(t[i])){if(!n(d))return;t[i]=(0,h.default)(d)}if(s(r)){var u=!0;void 0!==r.enabled?u=r.enabled:void 0!==l&&(u=d.enabled),function(t,e,i){s(t[i])||(t[i]={});var o=e[i],n=t[i];for(var r in o)o.hasOwnProperty(r)&&(n[r]=o[r])}(t,e,i),t[i].enabled=u}}},e.binarySearchCustom=function(t,e,i,o){for(var n=0,s=0,r=t.length-1;s<=r&&n<1e4;){var a=Math.floor((s+r)/2),h=t[a],d=void 0===o?h[i]:h[i][o],l=e(d);if(0==l)return a;-1==l?s=a+1:r=a-1,n++}return-1},e.binarySearchValue=function(t,e,i,o,n){var s,r,a,h,d=0,l=0,u=t.length-1;for(n=void 0!=n?n:function(t,e){return t==e?0:t<e?-1:1};l<=u&&d<1e4;){if(h=Math.floor(.5*(u+l)),s=t[Math.max(0,h-1)][i],r=t[h][i],a=t[Math.min(t.length-1,h+1)][i],0==n(r,e))return h;if(n(s,e)<0&&n(r,e)>0)return"before"==o?Math.max(0,h-1):h;if(n(r,e)<0&&n(a,e)>0)return"before"==o?h:Math.min(t.length-1,h+1);n(r,e)<0?l=h+1:u=h-1,d++}return-1},e.easingFunctions={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return t*(2-t)},easeInOutQuad:function(t){return t<.5?2*t*t:(4-2*t)*t-1},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return--t*t*t+1},easeInOutCubic:function(t){return t<.5?4*t*t*t:(t-1)*(2*t-2)*(2*t-2)+1},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return 1- --t*t*t*t},easeInOutQuart:function(t){return t<.5?8*t*t*t*t:1-8*--t*t*t*t},easeInQuint:function(t){return t*t*t*t*t},easeOutQuint:function(t){return 1+--t*t*t*t*t},easeInOutQuint:function(t){return t<.5?16*t*t*t*t*t:1+16*--t*t*t*t*t}},e.getScrollBarWidth=function(){var t=document.createElement("p");t.style.width="100%",t.style.height="200px";var e=document.createElement("div");e.style.position="absolute",e.style.top="0px",e.style.left="0px",e.style.visibility="hidden",e.style.width="200px",e.style.height="150px",e.style.overflow="hidden",e.appendChild(t),document.body.appendChild(e);var i=t.offsetWidth;e.style.overflow="scroll";var o=t.offsetWidth;return i==o&&(o=e.clientWidth),document.body.removeChild(e),i-o},e.topMost=function(t,e){var i=void 0;Array.isArray(e)||(e=[e]);var o=!0,n=!1,s=void 0;try{for(var a,h=(0,r.default)(t);!(o=(a=h.next()).done);o=!0){var d=a.value;if(d){i=d[e[0]];for(var l=1;l<e.length;l++)i&&(i=i[e[l]]);if(void 0!==i)break}}}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}},function(t,e,i){t.exports={default:i(194),__esModule:!0}},function(t,e,i){e.__esModule=!0;var o=i(6),n=function(t){return t&&t.__esModule?t:{default:t}}(o);e.default=function(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!==(void 0===e?"undefined":(0,n.default)(e))&&"function"!=typeof e?t:e}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(196),s=o(n),r=i(29),a=o(r),h=i(6),d=o(h);e.default=function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+(void 0===e?"undefined":(0,d.default)(e)));t.prototype=(0,a.default)(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(s.default?(0,s.default)(t,e):t.__proto__=e)}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(142),s=o(n),r=i(144),a=o(r),h="function"==typeof a.default&&"symbol"==typeof s.default?function(t){return typeof t}:function(t){return t&&"function"==typeof a.default&&t.constructor===a.default&&t!==a.default.prototype?"symbol":typeof t};e.default="function"==typeof a.default&&"symbol"===h(s.default)?function(t){return void 0===t?"undefined":h(t)}:function(t){return t&&"function"==typeof a.default&&t.constructor===a.default&&t!==a.default.prototype?"symbol":void 0===t?"undefined":h(t)}},function(t,e){var i=t.exports={version:"2.5.1"};"number"==typeof __e&&(__e=i)}
19281,function(t,e,i){t.exports={default:i(140),__esModule:!0}},function(t,e,i){t.exports="undefined"!=typeof window&&window.moment||i(154)},function(t,e,i){function o(){var t=function(){};return{on:t,off:t,destroy:t,emit:t,get:function(e){return{set:t}}}}if("undefined"!=typeof window){var n=i(175),s=window.Hammer||i(176);t.exports=n(s,{preventDefault:"mouse"})}else t.exports=function(){return o()}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){if(t&&!Array.isArray(t)&&(e=t,t=null),this._options=e||{},this._data={},this.length=0,this._fieldId=this._options.fieldId||"id",this._type={},this._options.type)for(var i=(0,l.default)(this._options.type),o=0,n=i.length;o<n;o++){var s=i[o],r=this._options.type[s];this._type[s]="Date"==r||"ISODate"==r||"ASPDate"==r?"Date":r}this._subscribers={},t&&this.add(t),this.setOptions(e)}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(8),l=o(d),u=i(2),c=i(43);n.prototype.setOptions=function(t){t&&void 0!==t.queue&&(!1===t.queue?this._queue&&(this._queue.destroy(),delete this._queue):(this._queue||(this._queue=c.extend(this,{replace:["add","update","remove"]})),"object"===(0,h.default)(t.queue)&&this._queue.setOptions(t.queue)))},n.prototype.on=function(t,e){var i=this._subscribers[t];i||(i=[],this._subscribers[t]=i),i.push({callback:e})},n.prototype.off=function(t,e){var i=this._subscribers[t];i&&(this._subscribers[t]=i.filter(function(t){return t.callback!=e}))},n.prototype._trigger=function(t,e,i){if("*"==t)throw new Error("Cannot trigger event *");var o=[];t in this._subscribers&&(o=o.concat(this._subscribers[t])),"*"in this._subscribers&&(o=o.concat(this._subscribers["*"]));for(var n=0,s=o.length;n<s;n++){var r=o[n];r.callback&&r.callback(t,e,i||null)}},n.prototype.add=function(t,e){var i,o=[],n=this;if(Array.isArray(t))for(var s=0,r=t.length;s<r;s++)i=n._addItem(t[s]),o.push(i);else{if(!t||"object"!==(void 0===t?"undefined":(0,h.default)(t)))throw new Error("Unknown dataType");i=n._addItem(t),o.push(i)}return o.length&&this._trigger("add",{items:o},e),o},n.prototype.update=function(t,e){var i=[],o=[],n=[],s=[],r=this,a=r._fieldId,d=function(t){var e=t[a];if(r._data[e]){var h=u.extend({},r._data[e]);e=r._updateItem(t),o.push(e),s.push(t),n.push(h)}else e=r._addItem(t),i.push(e)};if(Array.isArray(t))for(var l=0,c=t.length;l<c;l++)t[l]&&"object"===(0,h.default)(t[l])?d(t[l]):console.warn("Ignoring input item, which is not an object at index "+l);else{if(!t||"object"!==(void 0===t?"undefined":(0,h.default)(t)))throw new Error("Unknown dataType");d(t)}if(i.length&&this._trigger("add",{items:i},e),o.length){var p={items:o,oldData:n,data:s};this._trigger("update",p,e)}return i.concat(o)},n.prototype.get=function(t){var e,i,o,n=this,s=u.getType(arguments[0]);"String"==s||"Number"==s?(e=arguments[0],o=arguments[1]):"Array"==s?(i=arguments[0],o=arguments[1]):o=arguments[0];var r;if(o&&o.returnType){r=-1==["Array","Object"].indexOf(o.returnType)?"Array":o.returnType}else r="Array";var a,h,d,c,p,f=o&&o.type||this._options.type,m=o&&o.filter,v=[];if(void 0!=e)(a=n._getItem(e,f))&&m&&!m(a)&&(a=null);else if(void 0!=i)for(c=0,p=i.length;c<p;c++)a=n._getItem(i[c],f),m&&!m(a)||v.push(a);else for(h=(0,l.default)(this._data),c=0,p=h.length;c<p;c++)d=h[c],a=n._getItem(d,f),m&&!m(a)||v.push(a);if(o&&o.order&&void 0==e&&this._sort(v,o.order),o&&o.fields){var g=o.fields;if(void 0!=e)a=this._filterFields(a,g);else for(c=0,p=v.length;c<p;c++)v[c]=this._filterFields(v[c],g)}if("Object"==r){var y,b={};for(c=0,p=v.length;c<p;c++)y=v[c],b[y.id]=y;return b}return void 0!=e?a:v},n.prototype.getIds=function(t){var e,i,o,n,s,r=this._data,a=t&&t.filter,h=t&&t.order,d=t&&t.type||this._options.type,u=(0,l.default)(r),c=[];if(a)if(h){for(s=[],e=0,i=u.length;e<i;e++)o=u[e],n=this._getItem(o,d),a(n)&&s.push(n);for(this._sort(s,h),e=0,i=s.length;e<i;e++)c.push(s[e][this._fieldId])}else for(e=0,i=u.length;e<i;e++)o=u[e],n=this._getItem(o,d),a(n)&&c.push(n[this._fieldId]);else if(h){for(s=[],e=0,i=u.length;e<i;e++)o=u[e],s.push(r[o]);for(this._sort(s,h),e=0,i=s.length;e<i;e++)c.push(s[e][this._fieldId])}else for(e=0,i=u.length;e<i;e++)o=u[e],n=r[o],c.push(n[this._fieldId]);return c},n.prototype.getDataSet=function(){return this},n.prototype.forEach=function(t,e){var i,o,n,s,r=e&&e.filter,a=e&&e.type||this._options.type,h=this._data,d=(0,l.default)(h);if(e&&e.order){var u=this.get(e);for(i=0,o=u.length;i<o;i++)n=u[i],s=n[this._fieldId],t(n,s)}else for(i=0,o=d.length;i<o;i++)s=d[i],n=this._getItem(s,a),r&&!r(n)||t(n,s)},n.prototype.map=function(t,e){var i,o,n,s,r=e&&e.filter,a=e&&e.type||this._options.type,h=[],d=this._data,u=(0,l.default)(d);for(i=0,o=u.length;i<o;i++)n=u[i],s=this._getItem(n,a),r&&!r(s)||h.push(t(s,n));return e&&e.order&&this._sort(h,e.order),h},n.prototype._filterFields=function(t,e){if(!t)return t;var i,o,n={},s=(0,l.default)(t),r=s.length;if(Array.isArray(e))for(i=0;i<r;
19281i++)o=s[i],-1!=e.indexOf(o)&&(n[o]=t[o]);else for(i=0;i<r;i++)o=s[i],e.hasOwnProperty(o)&&(n[e[o]]=t[o]);return n},n.prototype._sort=function(t,e){if(u.isString(e)){var i=e;t.sort(function(t,e){var o=t[i],n=e[i];return o>n?1:o<n?-1:0})}else{if("function"!=typeof e)throw new TypeError("Order must be a function or a string");t.sort(e)}},n.prototype.remove=function(t,e){var i,o,n,s,r=[],a=[],h=[];for(h=Array.isArray(t)?t:[t],i=0,o=h.length;i<o;i++)(s=this._remove(h[i]))&&void 0!=(n=s[this._fieldId])&&(r.push(n),a.push(s));return r.length&&this._trigger("remove",{items:r,oldData:a},e),r},n.prototype._remove=function(t){var e,i;return u.isNumber(t)||u.isString(t)?i=t:t&&"object"===(void 0===t?"undefined":(0,h.default)(t))&&(i=t[this._fieldId]),void 0!==i&&this._data[i]?(e=this._data[i],delete this._data[i],this.length--,e):null},n.prototype.clear=function(t){var e,i,o=(0,l.default)(this._data),n=[];for(e=0,i=o.length;e<i;e++)n.push(this._data[o[e]]);return this._data={},this.length=0,this._trigger("remove",{items:o,oldData:n},t),o},n.prototype.max=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e<i;e++){var a=n[e],h=o[a],d=h[t];null!=d&&(!s||d>r)&&(s=h,r=d)}return s},n.prototype.min=function(t){var e,i,o=this._data,n=(0,l.default)(o),s=null,r=null;for(e=0,i=n.length;e<i;e++){var a=n[e],h=o[a],d=h[t];null!=d&&(!s||d<r)&&(s=h,r=d)}return s},n.prototype.distinct=function(t){var e,i,o,n=this._data,s=(0,l.default)(n),r=[],a=this._options.type&&this._options.type[t]||null,h=0;for(e=0,o=s.length;e<o;e++){var d=s[e],c=n[d],p=c[t],f=!1;for(i=0;i<h;i++)if(r[i]==p){f=!0;break}f||void 0===p||(r[h]=p,h++)}if(a)for(e=0,o=r.length;e<o;e++)r[e]=u.convert(r[e],a);return r},n.prototype._addItem=function(t){var e=t[this._fieldId];if(void 0!=e){if(this._data[e])throw new Error("Cannot add item: item with id "+e+" already exists")}else e=u.randomUUID(),t[this._fieldId]=e;var i,o,n={},s=(0,l.default)(t);for(i=0,o=s.length;i<o;i++){var r=s[i],a=this._type[r];n[r]=u.convert(t[r],a)}return this._data[e]=n,this.length++,e},n.prototype._getItem=function(t,e){var i,o,n,s,r=this._data[t];if(!r)return null;var a={},h=(0,l.default)(r);if(e)for(n=0,s=h.length;n<s;n++)i=h[n],o=r[i],a[i]=u.convert(o,e[i]);else for(n=0,s=h.length;n<s;n++)i=h[n],o=r[i],a[i]=o;return a[this._fieldId]||(a[this._fieldId]=r.id),a},n.prototype._updateItem=function(t){var e=t[this._fieldId];if(void 0==e)throw new Error("Cannot update item: item has no id (item: "+(0,r.default)(t)+")");var i=this._data[e];if(!i)throw new Error("Cannot update item: no item with id "+e+" found");for(var o=(0,l.default)(t),n=0,s=o.length;n<s;n++){var a=o[n],h=this._type[a];i[a]=u.convert(t[a],h)}return e},t.exports=n},function(t,e,i){function o(t,e){this._data=null,this._ids={},this.length=0,this._options=e||{},this._fieldId="id",this._subscribers={};var i=this;this.listener=function(){i._onEvent.apply(i,arguments)},this.setData(t)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(11);o.prototype.setData=function(t){var e,i,o,n,s;if(this._data){for(this._data.off&&this._data.off("*",this.listener),e=this._data.getIds({filter:this._options&&this._options.filter}),s=[],o=0,n=e.length;o<n;o++)s.push(this._data._data[e[o]]);this._ids={},this.length=0,this._trigger("remove",{items:e,oldData:s})}if(this._data=t,this._data){for(this._fieldId=this._options.fieldId||this._data&&this._data.options&&this._data.options.fieldId||"id",e=this._data.getIds({filter:this._options&&this._options.filter}),o=0,n=e.length;o<n;o++)i=e[o],this._ids[i]=!0;this.length=e.length,this._trigger("add",{items:e}),this._data.on&&this._data.on("*",this.listener)}},o.prototype.refresh=function(){var t,e,i,o=this._data.getIds({filter:this._options&&this._options.filter}),n=(0,s.default)(this._ids),r={},a=[],h=[],d=[];for(e=0,i=o.length;e<i;e++)t=o[e],r[t]=!0,this._ids[t]||(a.push(t),this._ids[t]=!0);for(e=0,i=n.length;e<i;e++)t=n[e],r[t]||(h.push(t),d.push(this._data._data[t]),delete this._ids[t]);this.length+=a.length-h.length,a.length&&this._trigger("add",{items:a}),h.length&&this._trigger("remove",{items:h,oldData:d})},o.prototype.get=function(t){var e,i,o,n=this,s=r.getType(arguments[0]);"String"==s||"Number"==s||"Array"==s?(e=arguments[0],i=arguments[1],o=arguments[2]):(i=arguments[0],o=arguments[1]);var a=r.extend({},this._options,i);this._options.filter&&i&&i.filter&&(a.filter=function(t){return n._options.filter(t)&&i.filter(t)});var h=[];return void 0!=e&&h.push(e),h.push(a),h.push(o),this._data&&this._data.get.apply(this._data,h)},o.prototype.getIds=function(t){var e;if(this._data){var i,o=this._options.filter;i=t&&t.filter?o?function(e){return o(e)&&t.filter(e)}:t.filter:o,e=this._data.getIds({filter:i,order:t&&t.order})}else e=[];return e},o.prototype.map=function(t,e){var i=[];if(this._data){var o,n=this._options.filter;o=e&&e.filter?n?function(t){return n(t)&&e.filter(t)}:e.filter:n,i=this._data.map(t,{filter:o,order:e&&e.order})}else i=[];return i},o.prototype.getDataSet=function(){for(var t=this;t instanceof o;)t=t._data;return t||null}
19281,o.prototype._onEvent=function(t,e,i){var o,n,s,r,a=e&&e.items,h=[],d=[],l=[],u=[],c=[],p=[];if(a&&this._data){switch(t){case"add":for(o=0,n=a.length;o<n;o++)s=a[o],(r=this.get(s))&&(this._ids[s]=!0,h.push(s));break;case"update":for(o=0,n=a.length;o<n;o++)s=a[o],r=this.get(s),r?this._ids[s]?(d.push(s),c.push(e.data[o]),u.push(e.oldData[o])):(this._ids[s]=!0,h.push(s)):this._ids[s]&&(delete this._ids[s],l.push(s),p.push(e.oldData[o]));break;case"remove":for(o=0,n=a.length;o<n;o++)s=a[o],this._ids[s]&&(delete this._ids[s],l.push(s),p.push(e.oldData[o]))}this.length+=h.length-l.length,h.length&&this._trigger("add",{items:h},i),d.length&&this._trigger("update",{items:d,oldData:u,data:c},i),l.length&&this._trigger("remove",{items:l,oldData:p},i)}},o.prototype.on=a.prototype.on,o.prototype.off=a.prototype.off,o.prototype._trigger=a.prototype._trigger,o.prototype.subscribe=o.prototype.on,o.prototype.unsubscribe=o.prototype.off,t.exports=o},function(t,e,i){var o=i(57)("wks"),n=i(40),s=i(18).Symbol,r="function"==typeof s;(t.exports=function(t){return o[t]||(o[t]=r&&s[t]||(r?s:n)("Symbol."+t))}).store=o},function(t,e,i){e.prepareElements=function(t){for(var e in t)t.hasOwnProperty(e)&&(t[e].redundant=t[e].used,t[e].used=[])},e.cleanupElements=function(t){for(var e in t)if(t.hasOwnProperty(e)&&t[e].redundant){for(var i=0;i<t[e].redundant.length;i++)t[e].redundant[i].parentNode.removeChild(t[e].redundant[i]);t[e].redundant=[]}},e.resetElements=function(t){e.prepareElements(t),e.cleanupElements(t),e.prepareElements(t)},e.getSVGElement=function(t,e,i){var o;return e.hasOwnProperty(t)?e[t].redundant.length>0?(o=e[t].redundant[0],e[t].redundant.shift()):(o=document.createElementNS("http://www.w3.org/2000/svg",t),i.appendChild(o)):(o=document.createElementNS("http://www.w3.org/2000/svg",t),e[t]={used:[],redundant:[]},i.appendChild(o)),e[t].used.push(o),o},e.getDOMElement=function(t,e,i,o){var n;return e.hasOwnProperty(t)?e[t].redundant.length>0?(n=e[t].redundant[0],e[t].redundant.shift()):(n=document.createElement(t),void 0!==o?i.insertBefore(n,o):i.appendChild(n)):(n=document.createElement(t),e[t]={used:[],redundant:[]},void 0!==o?i.insertBefore(n,o):i.appendChild(n)),e[t].used.push(n),n},e.drawPoint=function(t,i,o,n,s,r){var a;if("circle"==o.style?(a=e.getSVGElement("circle",n,s),a.setAttributeNS(null,"cx",t),a.setAttributeNS(null,"cy",i),a.setAttributeNS(null,"r",.5*o.size)):(a=e.getSVGElement("rect",n,s),a.setAttributeNS(null,"x",t-.5*o.size),a.setAttributeNS(null,"y",i-.5*o.size),a.setAttributeNS(null,"width",o.size),a.setAttributeNS(null,"height",o.size)),void 0!==o.styles&&a.setAttributeNS(null,"style",o.styles),a.setAttributeNS(null,"class",o.className+" vis-point"),r){var h=e.getSVGElement("text",n,s);r.xOffset&&(t+=r.xOffset),r.yOffset&&(i+=r.yOffset),r.content&&(h.textContent=r.content),r.className&&h.setAttributeNS(null,"class",r.className+" vis-label"),h.setAttributeNS(null,"x",t),h.setAttributeNS(null,"y",i)}return a},e.drawBar=function(t,i,o,n,s,r,a,h){if(0!=n){n<0&&(n*=-1,i-=n);var d=e.getSVGElement("rect",r,a);d.setAttributeNS(null,"x",t-.5*o),d.setAttributeNS(null,"y",i),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",n),d.setAttributeNS(null,"class",s),h&&d.setAttributeNS(null,"style",h)}}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.printStyle=void 0;var n=i(19),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=!1,v=void 0,g="background: #FFeeee; color: #dd0000",y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"validate",value:function(e,i,o){m=!1,v=i;var n=i;return void 0!==o&&(n=i[o]),t.parse(e,n,[]),m}},{key:"parse",value:function(e,i,o){for(var n in e)e.hasOwnProperty(n)&&t.check(n,e,i,o)}},{key:"check",value:function(e,i,o,n){if(void 0===o[e]&&void 0===o.__any__)return void t.getSuggestion(e,o,n);var s=e,r=!0;void 0===o[e]&&void 0!==o.__any__&&(s="__any__",r="object"===t.getType(i[e]));var a=o[s];r&&void 0!==a.__type__&&(a=a.__type__),t.checkFields(e,i,o,s,a,n)}},{key:"checkFields",value:function(e,i,o,n,s,r){var a=function(i){console.log("%c"+i+t.printLocation(r,e),g)},h=t.getType(i[e]),l=s[h];void 0!==l?"array"===t.getType(l)&&-1===l.indexOf(i[e])?(a('Invalid option detected in "'+e+'". Allowed values are:'+t.print(l)+' not "'+i[e]+'". '),m=!0):"object"===h&&"__any__"!==n&&(r=f.copyAndExtendArray(r,e),t.parse(i[e],o[n],r)):void 0===s.any&&(a('Invalid type received for "'+e+'". Expected: '+t.print((0,d.default)(s))+". Received ["+h+'] "'+i[e]+'"'),m=!0)}},{key:"getType",value:function(t){var e=void 0===t?"undefined":(0,a.default)(t);return"object"===e?null===t?"null":t instanceof Boolean?"boolean":t instanceof Number?"number":t instanceof String?"string":Array.isArray(t)?"array":t instanceof Date?"date":void 0!==t.nodeType?"dom":!0===t._isAMomentObject?"moment":"object":"number"===e?"number":"boolean"===e?"boolean":"string"===e?"string":void 0===e?"undefined":e}},{key:"getSuggestion",value:function(e,i,o){var n=t.findInOptions(e,i,o,!1),s=t.findInOptions(e,v,[],!0),r=void 0 19282 ;r=void 0!==n.indexMatch?" in "+t.printLocation(n.path,e,"")+'Perhaps it was incomplete? Did
19282you mean: "'+n.indexMatch+'"?\n\n':s.distance<=4&&n.distance>s.distance?" in "+t.printLocation(n.path,e,"")+"Perhaps it was misplaced? Matching option found at: "+t.printLocation(s.path,s.closestMatch,""):n.distance<=8?'. Did you mean "'+n.closestMatch+'"?'+t.printLocation(n.path,e):". Did you mean one of these: "+t.print((0,d.default)(i))+t.printLocation(o,e),console.log('%cUnknown option detected: "'+e+'"'+r,g),m=!0}},{key:"findInOptions",value:function(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=1e9,r="",a=[],h=e.toLowerCase(),d=void 0;for(var l in i){var u=void 0;if(void 0!==i[l].__type__&&!0===n){var c=t.findInOptions(e,i[l],f.copyAndExtendArray(o,l));s>c.distance&&(r=c.closestMatch,a=c.path,s=c.distance,d=c.indexMatch)}else-1!==l.toLowerCase().indexOf(h)&&(d=l),u=t.levenshteinDistance(e,l),s>u&&(r=l,a=f.copyArray(o),s=u)}return{closestMatch:r,path:a,distance:s,indexMatch:d}}},{key:"printLocation",value:function(t,e){for(var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"Problem value found at: \n",o="\n\n"+i+"options = {\n",n=0;n<t.length;n++){for(var s=0;s<n+1;s++)o+=" ";o+=t[n]+": {\n"}for(var r=0;r<t.length+1;r++)o+=" ";o+=e+"\n";for(var a=0;a<t.length+1;a++){for(var h=0;h<t.length-a;h++)o+=" ";o+="}\n"}return o+"\n\n"}},{key:"print",value:function(t){return(0,s.default)(t).replace(/(\")|(\[)|(\])|(,"__type__")/g,"").replace(/(\,)/g,", ")}},{key:"levenshteinDistance",value:function(t,e){if(0===t.length)return e.length;if(0===e.length)return t.length;var i,o=[];for(i=0;i<=e.length;i++)o[i]=[i];var n;for(n=0;n<=t.length;n++)o[0][n]=n;for(i=1;i<=e.length;i++)for(n=1;n<=t.length;n++)e.charAt(i-1)==t.charAt(n-1)?o[i][n]=o[i-1][n-1]:o[i][n]=Math.min(o[i-1][n-1]+1,Math.min(o[i][n-1]+1,o[i-1][n]+1));return o[e.length][t.length]}}]),t}();e.default=y,e.printStyle=g},function(t,e,i){function o(t,e){this.options=null,this.props=null}var n=i(2);o.prototype.setOptions=function(t){t&&n.extend(this.options,t)},o.prototype.redraw=function(){return!1},o.prototype.destroy=function(){},o.prototype._isResized=function(){var t=this.props._previousWidth!==this.props.width||this.props._previousHeight!==this.props.height;return this.props._previousWidth=this.props.width,this.props._previousHeight=this.props.height,t},t.exports=o},function(t,e,i){var o=i(18),n=i(7),s=i(80),r=i(26),a=function(t,e,i){var h,d,l,u=t&a.F,c=t&a.G,p=t&a.S,f=t&a.P,m=t&a.B,v=t&a.W,g=c?n:n[e]||(n[e]={}),y=g.prototype,b=c?o:p?o[e]:(o[e]||{}).prototype;c&&(i=e);for(h in i)(d=!u&&b&&void 0!==b[h])&&h in g||(l=d?b[h]:i[h],g[h]=c&&"function"!=typeof b[h]?i[h]:m&&d?s(l,o):v&&b[h]==l?function(t){var e=function(e,i,o){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,i)}return new t(e,i,o)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(l):f&&"function"==typeof l?s(Function.call,l):l,f&&((g.virtual||(g.virtual={}))[h]=l,t&a.R&&y&&!y[h]&&r(y,h,l)))};a.F=1,a.G=2,a.S=4,a.P=8,a.B=16,a.W=32,a.U=64,a.R=128,t.exports=a},function(t,e){var i=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=i)},function(t,e,i){t.exports={default:i(160),__esModule:!0}},function(t,e,i){var o=i(27),n=i(81),s=i(53),r=Object.defineProperty;e.f=i(21)?Object.defineProperty:function(t,e,i){if(o(t),e=s(e,!0),o(i),n)try{return r(t,e,i)}catch(t){}if("get"in i||"set"in i)throw TypeError("Accessors not supported!");return"value"in i&&(t[e]=i.value),t}},function(t,e,i){t.exports=!i(28)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e){var i={}.hasOwnProperty;t.exports=function(t,e){return i.call(t,e)}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e,i,o){(0,a.default)(this,t),this.body=i,this.labelModule=o,this.setOptions(e),this.top=void 0,this.left=void 0,this.height=void 0,this.width=void 0,this.radius=void 0,this.margin=void 0,this.refreshNeeded=!0,this.boundingBox={top:0,left:0,right:0,bottom:0}}return(0,d.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"_setMargins",value:function(t){this.margin={},this.options.margin&&("object"==(0,s.default)(this.options.margin)?(this.margin.top=this.options.margin.top,this.margin.right=this.options.margin.right,this.margin.bottom=this.options.margin.bottom,this.margin.left
19282=this.options.margin.left):(this.margin.top=this.options.margin,this.margin.right=this.options.margin,this.margin.bottom=this.options.margin,this.margin.left=this.options.margin)),t.adjustSizes(this.margin)}},{key:"_distanceToBorder",value:function(t,e){var i=this.options.borderWidth;return this.resize(t),Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}},{key:"enableShadow",value:function(t,e){e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}},{key:"enableBorderDashes",value:function(t,e){if(!1!==e.borderDashes)if(void 0!==t.setLineDash){var i=e.borderDashes;!0===i&&(i=[5,15]),t.setLineDash(i)}else console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."),this.options.shapeProperties.borderDashes=!1,e.borderDashes=!1}},{key:"disableBorderDashes",value:function(t,e){!1!==e.borderDashes&&(void 0!==t.setLineDash?t.setLineDash([0]):(console.warn("setLineDash is not supported in this browser. The dashed borders cannot be used."),this.options.shapeProperties.borderDashes=!1,e.borderDashes=!1))}},{key:"needsRefresh",value:function(t,e){return!0===this.refreshNeeded?(this.refreshNeeded=!1,!0):void 0===this.width||this.labelModule.differentState(t,e)}},{key:"initContextForDraw",value:function(t,e){var i=e.borderWidth/this.body.view.scale;t.lineWidth=Math.min(this.width,i),t.strokeStyle=e.borderColor,t.fillStyle=e.color}},{key:"performStroke",value:function(t,e){var i=e.borderWidth/this.body.view.scale;t.save(),i>0&&(this.enableBorderDashes(t,e),t.stroke(),this.disableBorderDashes(t,e)),t.restore()}},{key:"performFill",value:function(t,e){this.enableShadow(t,e),t.fill(),this.disableShadow(t,e),this.performStroke(t,e)}},{key:"_addBoundingBoxMargin",value:function(t){this.boundingBox.left-=t,this.boundingBox.top-=t,this.boundingBox.bottom+=t,this.boundingBox.right+=t}},{key:"_updateBoundingBox",value:function(t,e,i,o,n){void 0!==i&&this.resize(i,o,n),this.left=t-this.width/2,this.top=e-this.height/2,this.boundingBox.left=this.left,this.boundingBox.top=this.top,this.boundingBox.bottom=this.top+this.height,this.boundingBox.right=this.left+this.width}},{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n)}},{key:"getDimensionsFromLabel",value:function(t,e,i){this.textSize=this.labelModule.getTextSize(t,e,i);var o=this.textSize.width,n=this.textSize.height;return 0===o&&(o=14,n=14),{width:o,height:n}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover,o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{size:this.options.size};if(this.needsRefresh(e,i)){this.labelModule.getTextSize(t,e,i);var n=2*o.size;this.width=n,this.height=n,this.radius=.5*this.width}}},{key:"_drawShape",value:function(t,e,i,o,n,s,r,a){if(this.resize(t,s,r,a),this.left=o-this.width/2,this.top=n-this.height/2,this.initContextForDraw(t,a),t[e](o,n,a.size),this.performFill(t,a),void 0!==this.options.label){this.labelModule.calculateLabelSize(t,s,r,o,n,"hanging");var h=n+.5*this.height+.5*this.labelModule.size.height;this.labelModule.draw(t,o,h,s,r,"hanging")}this.updateBoundingBox(o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height))}}]),e}(m.default);e.default=v}
19282,function(t,e,i){var o=i(78),n=i(51);t.exports=function(t){return o(n(t))}},function(t,e,i){var o=i(20),n=i(39);t.exports=i(21)?function(t,e,i){return o.f(t,e,n(1,i))}:function(t,e,i){return t[e]=i,t}},function(t,e,i){var o=i(32);t.exports=function(t){if(!o(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e,i){t.exports={default:i(138),__esModule:!0}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}e.__esModule=!0;var n=i(188),s=o(n),r=i(77),a=o(r);e.default=function(){function t(t,e){var i=[],o=!0,n=!1,s=void 0;try{for(var r,h=(0,a.default)(t);!(o=(r=h.next()).done)&&(i.push(r.value),!e||i.length!==e);o=!0);}catch(t){n=!0,s=t}finally{try{!o&&h.return&&h.return()}finally{if(n)throw s}}return i}return function(e,i){if(Array.isArray(e))return e;if((0,s.default)(Object(e)))return t(e,i);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}()},function(t,e){t.exports={}},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e,i){var o=i(84),n=i(58);t.exports=Object.keys||function(t){return o(t,n)}},function(t,e,i){function o(t,e,i){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0,this.z=void 0!==i?i:0}o.subtract=function(t,e){var i=new o;return i.x=t.x-e.x,i.y=t.y-e.y,i.z=t.z-e.z,i},o.add=function(t,e){var i=new o;return i.x=t.x+e.x,i.y=t.y+e.y,i.z=t.z+e.z,i},o.avg=function(t,e){return new o((t.x+e.x)/2,(t.y+e.y)/2,(t.z+e.z)/2)},o.crossProduct=function(t,e){var i=new o;return i.x=t.y*e.z-t.z*e.y,i.y=t.z*e.x-t.x*e.z,i.z=t.x*e.y-t.y*e.x,i},o.prototype.length=function(){return Math.sqrt(this.x*this.x+this.y*this.y+this.z*this.z)},t.exports=o},function(t,e,i){var o,n,s;!function(i,r){n=[],o=r,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(0,function(){function t(t){var e,i=t&&t.preventDefault||!1,o=t&&t.container||window,n={},s={keydown:{},keyup:{}},r={};for(e=97;e<=122;e++)r[String.fromCharCode(e)]={code:e-97+65,shift:!1};for(e=65;e<=90;e++)r[String.fromCharCode(e)]={code:e,shift:!0};for(e=0;e<=9;e++)r[""+e]={code:48+e,shift:!1};for(e=1;e<=12;e++)r["F"+e]={code:111+e,shift:!1};for(e=0;e<=9;e++)r["num"+e]={code:96+e,shift:!1};r["num*"]={code:106,shift:!1},r["num+"]={code:107,shift:!1},r["num-"]={code:109,shift:!1},r["num/"]={code:111,shift:!1},r["num."]={code:110,shift:!1},r.left={code:37,shift:!1},r.up={code:38,shift:!1},r.right={code:39,shift:!1},r.down={code:40,shift:!1},r.space={code:32,shift:!1},r.enter={code:13,shift:!1},r.shift={code:16,shift:void 0},r.esc={code:27,shift:!1},r.backspace={code:8,shift:!1},r.tab={code:9,shift:!1},r.ctrl={code:17,shift:!1},r.alt={code:18,shift:!1},r.delete={code:46,shift:!1},r.pageup={code:33,shift:!1},r.pagedown={code:34,shift:!1},r["="]={code:187,shift:!1},r["-"]={code:189,shift:!1},r["]"]={code:221,shift:!1},r["["]={code:219,shift:!1};var a=function(t){d(t,"keydown")},h=function(t){d(t,"keyup")},d=function(t,e){if(void 0!==s[e][t.keyCode]){for(var o=s[e][t.keyCode],n=0;n<o.length;n++)void 0===o[n].shift?o[n].fn(t):1==o[n].shift&&1==t.shiftKey?o[n].fn(t):0==o[n].shift&&0==t.shiftKey&&o[n].fn(t);1==i&&t.preventDefault()}};return n.bind=function(t,e,i){if(void 0===i&&(i="keydown"),void 0===r[t])throw new Error("unsupported key: "+t);void 0===s[i][r[t].code]&&(s[i][r[t].code]=[]),s[i][r[t].code].push({fn:e,shift:r[t].shift})},n.bindAll=function(t,e){void 0===e&&(e="keydown");for(var i in r)r.hasOwnProperty(i)&&n.bind(i,t,e)},n.getKey=function(t){for(var e in r)if(r.hasOwnProperty(e)){if(1==t.shiftKey&&1==r[e].shift&&t.keyCode==r[e].code)return e;if(0==t.shiftKey&&0==r[e].shift&&t.keyCode==r[e].code)return e;if(t.keyCode==r[e].code&&"shift"==e)return e}return"unknown key, currently not supported"},n.unbind=function(t,e,i){if(void 0===i&&(i="keydown"),void 0===r[t])throw new Error("unsupported key: "+t);if(void 0!==e){var o=[],n=s[i][r[t].code];if(void 0!==n)for(var a=0;a<n.length;a++)n[a].fn==e&&n[a].shift==r[t].shift||o.push(s[i][r[t].code][a]);s[i][r[t].code]=o}else s[i][r[t].code]=[]},n.reset=function(){s={keydown:{},keyup:{}}},n.destroy=function(){s={keydown:{},keyup:{}},o.removeEventListener("keydown",a,!0),o.removeEventListener("keyup",h,!0)},o.addEventListener("keydown",a,!0),o.addEventListener("keyup",h,!0),n}return t})}
19282,function(t,e,i){e.convertHiddenOptions=function(t,i,o){if(o&&!Array.isArray(o))return e.convertHiddenOptions(t,i,[o]);if(i.hiddenDates=[],o&&1==Array.isArray(o)){for(var n=0;n<o.length;n++)if(void 0===o[n].repeat){var s={};s.start=t(o[n].start).toDate().valueOf(),s.end=t(o[n].end).toDate().valueOf(),i.hiddenDates.push(s)}i.hiddenDates.sort(function(t,e){return t.start-e.start})}},e.updateHiddenDates=function(t,i,o){if(o&&!Array.isArray(o))return e.updateHiddenDates(t,i,[o]);if(o&&void 0!==i.domProps.centerContainer.width){e.convertHiddenOptions(t,i,o);for(var n=t(i.range.start),s=t(i.range.end),r=i.range.end-i.range.start,a=r/i.domProps.centerContainer.width,h=0;h<o.length;h++)if(void 0!==o[h].repeat){var d=t(o[h].start),l=t(o[h].end);if("Invalid Date"==d._d)throw new Error("Supplied start date is not valid: "+o[h].start);if("Invalid Date"==l._d)throw new Error("Supplied end date is not valid: "+o[h].end);var u=l-d;if(u>=4*a){var c=0,p=s.clone();switch(o[h].repeat){case"daily":d.day()!=l.day()&&(c=1),d.dayOfYear(n.dayOfYear()),d.year(n.year()),d.subtract(7,"days"),l.dayOfYear(n.dayOfYear()),l.year(n.year()),l.subtract(7-c,"days"),p.add(1,"weeks");break;case"weekly":var f=l.diff(d,"days"),m=d.day();d.date(n.date()),d.month(n.month()),d.year(n.year()),l=d.clone(),d.day(m),l.day(m),l.add(f,"days"),d.subtract(1,"weeks"),l.subtract(1,"weeks"),p.add(1,"weeks");break;case"monthly":d.month()!=l.month()&&(c=1),d.month(n.month()),d.year(n.year()),d.subtract(1,"months"),l.month(n.month()),l.year(n.year()),l.subtract(1,"months"),l.add(c,"months"),p.add(1,"months");break;case"yearly":d.year()!=l.year()&&(c=1),d.year(n.year()),d.subtract(1,"years"),l.year(n.year()),l.subtract(1,"years"),l.add(c,"years"),p.add(1,"years");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}for(;d<p;)switch(i.hiddenDates.push({start:d.valueOf(),end:l.valueOf()}),o[h].repeat){case"daily":d.add(1,"days"),l.add(1,"days");break;case"weekly":d.add(1,"weeks"),l.add(1,"weeks");break;case"monthly":d.add(1,"months"),l.add(1,"months");break;case"yearly":d.add(1,"y"),l.add(1,"y");break;default:return void console.log("Wrong repeat format, allowed are: daily, weekly, monthly, yearly. Given:",o[h].repeat)}i.hiddenDates.push({start:d.valueOf(),end:l.valueOf()})}}e.removeDuplicates(i);var v=e.isHidden(i.range.start,i.hiddenDates),g=e.isHidden(i.range.end,i.hiddenDates),y=i.range.start,b=i.range.end;1==v.hidden&&(y=1==i.range.startToFront?v.startDate-1:v.endDate+1),1==g.hidden&&(b=1==i.range.endToFront?g.startDate-1:g.endDate+1),1!=v.hidden&&1!=g.hidden||i.range._applyRange(y,b)}},e.removeDuplicates=function(t){for(var e=t.hiddenDates,i=[],o=0;o<e.length;o++)for(var n=0;n<e.length;n++)o!=n&&1!=e[n].remove&&1!=e[o].remove&&(e[n].start>=e[o].start&&e[n].end<=e[o].end?e[n].remove=!0:e[n].start>=e[o].start&&e[n].start<=e[o].end?(e[o].end=e[n].end,e[n].remove=!0):e[n].end>=e[o].start&&e[n].end<=e[o].end&&(e[o].start=e[n].start,e[n].remove=!0));for(o=0;o<e.length;o++)!0!==e[o].remove&&i.push(e[o]);t.hiddenDates=i,t.hiddenDates.sort(function(t,e){return t.start-e.start})},e.printDates=function(t){for(var e=0;e<t.length;e++)console.log(e,new Date(t[e].start),new Date(t[e].end),t[e].start,t[e].end,t[e].remove)},e.stepOverHiddenDates=function(t,e,i){for(var o=!1,n=e.current.valueOf(),s=0;s<e.hiddenDates.length;s++){var r=e.hiddenDates[s].start,a=e.hiddenDates[s].end;if(n>=r&&n<a){o=!0;break}}if(1==o&&n<e._end.valueOf()&&n!=i){var h=t(i),d=t(a);h.year()!=d.year()?e.switchedYear=!0:h.month()!=d.month()?e.switchedMonth=!0:h.dayOfYear()!=d.dayOfYear()&&(e.switchedDay=!0),e.current=d}},e.toScreen=function(t,i,o){var n;if(0==t.body.hiddenDates.length)return n=t.range.conversion(o),(i.valueOf()-n.offset)*n.scale;var s=e.isHidden(i,t.body.hiddenDates);1==s.hidden&&(i=s.startDate);var r=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end);if(i<t.range.start){n=t.range.conversion(o,r);var a=e.getHiddenDurationBeforeStart(t.body.hiddenDates,i,n.offset);return i=t.options.moment(i).toDate().valueOf(),i+=a,-(n.offset-i.valueOf())*n.scale}if(i>t.range.end){var h={start:t.range.start,end:i};return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,h,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale}return i=e.correctTimeForHidden(t.options.moment,t.body.hiddenDates,t.range,i),n=t.range.conversion(o,r),(i.valueOf()-n.offset)*n.scale},e.toTime=function(t,i,o){if(0==t.body.hiddenDates.length){var n=t.range.conversion(o);return new Date(i/n.scale+n.offset)}var s=e.getHiddenDurationBetween(t.body.hiddenDates,t.range.start,t.range.end),r=t.range.end-t.range.start-s,a=r*i/o,h=e.getAccumulatedHiddenDuration(t.body.hiddenDates,t.range,a);return new Date(h+a+t.range.start)}
19282,e.getHiddenDurationBetween=function(t,e,i){for(var o=0,n=0;n<t.length;n++){var s=t[n].start,r=t[n].end;s>=e&&r<i&&(o+=r-s)}return o},e.getHiddenDurationBeforeStart=function(t,e,i){for(var o=0,n=0;n<t.length;n++){var s=t[n].start,r=t[n].end;s>=e&&r<=i&&(o+=r-s)}return o},e.correctTimeForHidden=function(t,i,o,n){return n=t(n).toDate().valueOf(),n-=e.getHiddenDurationBefore(t,i,o,n)},e.getHiddenDurationBefore=function(t,e,i,o){var n=0;o=t(o).toDate().valueOf();for(var s=0;s<e.length;s++){var r=e[s].start,a=e[s].end;r>=i.start&&a<i.end&&o>=a&&(n+=a-r)}return n},e.getAccumulatedHiddenDuration=function(t,e,i){for(var o=0,n=0,s=e.start,r=0;r<t.length;r++){var a=t[r].start,h=t[r].end;if(a>=e.start&&h<e.end){if(n+=a-s,s=h,n>=i)break;o+=h-a}}return o},e.snapAwayFromHidden=function(t,i,o,n){var s=e.isHidden(i,t);return 1==s.hidden?o<0?1==n?s.startDate-(s.endDate-i)-1:s.startDate-1:1==n?s.endDate+(i-s.startDate)+1:s.endDate+1:i},e.isHidden=function(t,e){for(var i=0;i<e.length;i++){var o=e[i].start,n=e[i].end;if(t>=o&&t<n)return{hidden:!0,startDate:o,endDate:n}}return{hidden:!1,startDate:o,endDate:n}}},function(t,e,i){e.onTouch=function(t,e){e.inputHandler=function(t){t.isFirst&&e(t)},t.on("hammer.input",e.inputHandler)},e.onRelease=function(t,e){return e.inputHandler=function(t){t.isFinal&&e(t)},t.on("hammer.input",e.inputHandler)},e.offTouch=function(t,e){t.off("hammer.input",e.inputHandler)},e.offRelease=e.offTouch,e.disablePreventDefaultVertically=function(t){return t.getTouchAction=function(){return["pan-y"]},t}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e,i){this.id=null,this.parent=null,this.data=t,this.dom=null,this.conversion=e||{},this.options=i||{},this.selected=!1,this.displayed=!1,this.groupShowing=!0,this.dirty=!0,this.top=null,this.right=null,this.left=null,this.width=null,this.height=null,this.editable=null,this._updateEditStatus()}var s=i(6),r=o(s),a=i(8),h=o(a),d=i(10),l=i(2),u=i(9);n.prototype.stack=!0,n.prototype.select=function(){this.selected=!0,this.dirty=!0,this.displayed&&this.redraw()},n.prototype.unselect=function(){this.selected=!1,this.dirty=!0,this.displayed&&this.redraw()},n.prototype.setData=function(t){void 0!=t.group&&this.data.group!=t.group&&null!=this.parent&&this.parent.itemSet._moveToGroup(this,t.group),this.parent&&(this.parent.stackDirty=!0),void 0!=t.subgroup&&this.data.subgroup!=t.subgroup&&null!=this.parent&&this.parent.changeSubgroup(this,this.data.subgroup,t.subgroup),this.data=t,this._updateEditStatus(),this.dirty=!0,this.displayed&&this.redraw()},n.prototype.setParent=function(t){this.displayed?(this.hide(),this.parent=t,this.parent&&this.show()):this.parent=t},n.prototype.isVisible=function(t){return!1},n.prototype.show=function(){return!1},n.prototype.hide=function(){return!1},n.prototype.redraw=function(){},n.prototype.repositionX=function(){},n.prototype.repositionY=function(){},n.prototype._repaintDragCenter=function(){if(this.selected&&this.options.editable.updateTime&&!this.dom.dragCenter){var t=this,e=document.createElement("div");e.className="vis-drag-center",e.dragCenterItem=this;var i=new d(e);i.on("tap",function(e){t.parent.itemSet.body.emitter.emit("click",{event:e,item:t.id})}),i.on("doubletap",function(e){e.stopPropagation(),t.parent.itemSet._onUpdateItem(t),t.parent.itemSet.body.emitter.emit("doubleClick",{event:e,item:t.id})}),this.dom.box?this.dom.dragLeft?this.dom.box.insertBefore(e,this.dom.dragLeft):this.dom.box.appendChild(e):this.dom.point&&this.dom.point.appendChild(e),this.dom.dragCenter=e}else!this.selected&&this.dom.dragCenter&&(this.dom.dragCenter.parentNode&&this.dom.dragCenter.parentNode.removeChild(this.dom.dragCenter),this.dom.dragCenter=null)},n.prototype._repaintDeleteButton=function(t){var e=(this.options.editable.overrideItems||null==this.editable)&&this.options.editable.remove||!this.options.editable.overrideItems&&null!=this.editable&&this.editable.remove;if(this.selected&&e&&!this.dom.deleteButton){var i=this,o=document.createElement("div");this.options.rtl?o.className="vis-delete-rtl":o.className="vis-delete",o.title="Delete this item",new d(o).on("tap",function(t){t.stopPropagation(),i.parent.removeFromDataSet(i)}),t.appendChild(o),this.dom.deleteButton=o}else!this.selected&&this.dom.deleteButton&&(this.dom.deleteButton.parentNode&&this.dom.deleteButton.parentNode.removeChild(this.dom.deleteButton),this.dom.deleteButton=null)},n.prototype._repaintOnItemUpdateTimeTooltip=function(t){if(this.options.tooltipOnItemUpdateTime){var e=(this.options.editable.updateTime||!0===this.data.editable)&&!1!==this.data.editable;if(this.selected&&e&&!this.dom.onItemUpdateTimeTooltip){var i=document.createElement("div");i.className="vis-onUpdateTime-tooltip",t.appendChild(i),this.dom.onItemUpdateTimeTooltip=i}else!this.selected&&this.dom.onItemUpdateTimeTooltip&&(this.dom.onItemUpdateTimeTooltip.parentNode&&this.dom.onItemUpdateTimeTooltip.parentNode.removeChild(this.dom.onItemUpdateTimeTooltip),this.dom.onItemUpdateTimeTooltip=null);if(this.dom.onItemUpdateTimeTooltip){this.dom.onItemUpdateTimeTooltip.style.visibility=this.parent.itemSet.touchParams.itemIsDragging?"visible":"hidden",this.options.rtl?this.dom.onItemUpdateTimeTooltip.style.right=this.dom.content.style.right:this.dom.onItemUpdateTimeTooltip.style.left=this.dom.content.style.left;var o,n=this.parent.itemSet.body.domProps.scrollTop;o="top"==this.options.orientation.item?this.top:this.parent.height-this.top-this.height;o+this.parent.top-50<-n?(this.dom.onItemUpdateTimeTooltip.style.bottom="",this.dom.onItemUpdateTimeTooltip.style.top=this.height+2+"px"):(this.dom.onItemUpdateTimeTooltip.style.top="",this.dom.onItemUpdateTimeTooltip.style.bottom=this.height+2+"px");var s,r;this.options.tooltipOnItemUpdateTime&&this.options.tooltipOnItemUpdateTime.template?(r=this.options.tooltipOnItemUpdateTime.template.bind(this),s=r(this.data)):(s="start: "+u(this.data.start).format("MM/DD/YYYY hh:mm"),this.data.end&&(s+="<br> end: "+u(this.data.end).format("MM/DD/YYYY hh:mm"))),this.dom.onItemUpdateTimeTooltip.innerHTML=s}}},n.prototype._updateContents=function(t){var e,i,o,n,s=this.parent.itemSet.itemsData.get(this.id
19282),r=this.dom.box||this.dom.point,a=r.getElementsByClassName("vis-item-visible-frame")[0];if(this.options.visibleFrameTemplate?(n=this.options.visibleFrameTemplate.bind(this),o=n(s,r)):o="",a)if(o instanceof Object&&!(o instanceof Element))n(s,a);else if(this._contentToString(this.itemVisibleFrameContent)!==this._contentToString(o)){if(o instanceof Element)a.innerHTML="",a.appendChild(o);else if(void 0!=o)a.innerHTML=o;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.itemVisibleFrameContent=o}if(this.options.template?(i=this.options.template.bind(this),e=i(s,t,this.data)):e=this.data.content,e instanceof Object&&!(e instanceof Element))i(s,t);else if(this._contentToString(this.content)!==this._contentToString(e)){if(e instanceof Element)t.innerHTML="",t.appendChild(e);else if(void 0!=e)t.innerHTML=e;else if("background"!=this.data.type||void 0!==this.data.content)throw new Error('Property "content" missing in item '+this.id);this.content=e}},n.prototype._updateDataAttributes=function(t){if(this.options.dataAttributes&&this.options.dataAttributes.length>0){var e=[];if(Array.isArray(this.options.dataAttributes))e=this.options.dataAttributes;else{if("all"!=this.options.dataAttributes)return;e=(0,h.default)(this.data)}for(var i=0;i<e.length;i++){var o=e[i],n=this.data[o];null!=n?t.setAttribute("data-"+o,n):t.removeAttribute("data-"+o)}}},n.prototype._updateStyle=function(t){this.style&&(l.removeCssText(t,this.style),this.style=null),this.data.style&&(l.addCssText(t,this.data.style),this.style=this.data.style)},n.prototype._contentToString=function(t){return"string"==typeof t?t:t&&"outerHTML"in t?t.outerHTML:t},n.prototype._updateEditStatus=function(){this.options&&("boolean"==typeof this.options.editable?this.editable={updateTime:this.options.editable,updateGroup:this.options.editable,remove:this.options.editable}:"object"===(0,r.default)(this.options.editable)&&(this.editable={},l.selectiveExtend(["updateTime","updateGroup","remove"],this.editable,this.options.editable))),this.options&&this.options.editable&&!0===this.options.editable.overrideItems||this.data&&("boolean"==typeof this.data.editable?this.editable={updateTime:this.data.editable,updateGroup:this.data.editable,remove:this.data.editable}:"object"===(0,r.default)(this.data.editable)&&(this.editable={},l.selectiveExtend(["updateTime","updateGroup","remove"],this.editable,this.data.editable)))},n.prototype.getWidthLeft=function(){return 0},n.prototype.getWidthRight=function(){return 0},n.prototype.getTitle=function(){return this.data.title},t.exports=n},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var i=0,o=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++i+o).toString(36))}},function(t,e,i){var o=i(51);t.exports=function(t){return Object(o(t))}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,i){function o(t){this.delay=null,this.max=1/0,this._queue=[],this._timeout=null,this._extended=null,this.setOptions(t)}o.prototype.setOptions=function(t){t&&void 0!==t.delay&&(this.delay=t.delay),t&&void 0!==t.max&&(this.max=t.max),this._flushIfNeeded()},o.extend=function(t,e){var i=new o(e);if(void 0!==t.flush)throw new Error("Target object already has a property flush");t.flush=function(){i.flush()};var n=[{name:"flush",original:void 0}];if(e&&e.replace)for(var s=0;s<e.replace.length;s++){var r=e.replace[s];n.push({name:r,original:t[r]}),i.replace(t,r)}return i._extended={object:t,methods:n},i},o.prototype.destroy=function(){if(this.flush(),this._extended){for(var t=this._extended.object,e=this._extended.methods,i=0;i<e.length;i++){var o=e[i];o.original?t[o.name]=o.original:delete t[o.name]}this._extended=null}},o.prototype.replace=function(t,e){var i=this,o=t[e];if(!o)throw new Error("Method "+e+" undefined");t[e]=function(){for(var t=[],e=0;e<arguments.length;e++)t[e]=arguments[e];i.queue({args:t,fn:o,context:this})}},o.prototype.queue=function(t){"function"==typeof t?this._queue.push({fn:t}):this._queue.push(t),this._flushIfNeeded()},o.prototype._flushIfNeeded=function(){if(this._queue.length>this.max&&this.flush(),clearTimeout(this._timeout),this.queue.length>0&&"number"==typeof this.delay){var t=this;this._timeout=setTimeout(function(){t.flush()},this.delay)}},o.prototype.flush=function(){for(;this._queue.length>0;){var t=this._queue.shift();t.fn.apply(t.context||t.fn,t.args||[])}},t.exports=o},function(t,e){function i(t){if(t)return o(t)}function o(t){for(var e in i.prototype)t[e]=i.prototype[e];return t}t.exports=i,i.prototype.on=i.prototype.addEventListener=function(t,e){return this._callbacks=this._callbacks||{},(this._callbacks[t]=this._callbacks[t]||[]).push(e),this},i.prototype.once=function(t,e){function i(){o.off(t,i),e.apply(this,arguments)}var o=this;return this._callbacks=this._callbacks||{},i.fn=e,this.on(t,i),this},i.prototype.off=i.prototype.removeListener=i.prototype.removeAllListeners=i.prototype.removeEventListener=function(t,e){if(this._callbacks=this._callbacks||{},0==arguments.length)return this._callbacks={},this;var i=this._callbacks[t];if(!i)return this;if(1==arguments.length)return delete this._callbacks[t],this;for(var o,n=0;n<i.length;n++)if((o=i[n])===e||o.fn===e){i.splice(n,1);break}return this},i.prototype.emit=function(t){this._callbacks=this._callbacks||{};
19282var e=[].slice.call(arguments,1),i=this._callbacks[t];if(i){i=i.slice(0);for(var o=0,n=i.length;o<n;++o)i[o].apply(this,e)}return this},i.prototype.listeners=function(t){return this._callbacks=this._callbacks||{},this._callbacks[t]||[]},i.prototype.hasListeners=function(t){return!!this.listeners(t).length}},function(t,e,i){function o(t,e){this.dom={foreground:null,lines:[],majorTexts:[],minorTexts:[],redundant:{lines:[],majorTexts:[],minorTexts:[]}},this.props={range:{start:0,end:0,minimumStep:0},lineTop:0},this.defaultOptions={orientation:{axis:"bottom"},showMinorLabels:!0,showMajorLabels:!0,maxMinorChars:7,format:h.FORMAT,moment:l,timeAxis:null},this.options=r.extend({},this.defaultOptions),this.body=t,this._create(),this.setOptions(e)}var n=i(6),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(16),h=i(66),d=i(36),l=i(9);o.prototype=new a,o.prototype.setOptions=function(t){t&&(r.selectiveExtend(["showMinorLabels","showMajorLabels","maxMinorChars","hiddenDates","timeAxis","moment","rtl"],this.options,t),r.selectiveDeepExtend(["format"],this.options,t),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.axis=t.orientation:"object"===(0,s.default)(t.orientation)&&"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis)),"locale"in t&&("function"==typeof l.locale?l.locale(t.locale):l.lang(t.locale)))},o.prototype._create=function(){this.dom.foreground=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.foreground.className="vis-time-axis vis-foreground",this.dom.background.className="vis-time-axis vis-background"},o.prototype.destroy=function(){this.dom.foreground.parentNode&&this.dom.foreground.parentNode.removeChild(this.dom.foreground),this.dom.background.parentNode&&this.dom.background.parentNode.removeChild(this.dom.background),this.body=null},o.prototype.redraw=function(){var t=this.props,e=this.dom.foreground,i=this.dom.background,o="top"==this.options.orientation.axis?this.body.dom.top:this.body.dom.bottom,n=e.parentNode!==o;this._calculateCharSize() 19283;var s=this.options.showMinorLabels&&"none"!==this.options.orientation.axis,r=this.options.showMajorLabels&&"none"!==this.options.orientation.axis;t.minorLabelHeight=s?t.minorCharHeight:0,t.majorLabelHeight=r?t.majorCharHeight:0,t.height=t.minorLabelHeight+t.majorLabelHeight,t.width=e.offsetWidth,t.minorLineHeight=this.body.domProps.root.height-t.majorLabelHeight-("top"==this.options.orientation.axis?this.body.domProps.bottom.height:this.body.domProps.top.height),t.minorLineWidth=1,t.majorLineHeight=t.minorLineHeight+t.majorLabelHeight,t.majorLineWidth=1;var a=e.nextSibling,h=i.nextSibling;return e.parentNode&&e.parentNode.removeChild(e),i.parentNode&&i.parentNode.removeChild(i),e.style.height=this.props.height+"px",this._repaintLabels(),a?o.insertBefore(e,a):o.appendChild(e),h?this.body.dom.backgroundVertical.insertBefore(i,h):this.body.dom.backgroundVertical.appendChild(i),this._isResized()||n},o.prototype._repaintLabels=function(){var t=this.options.orientation.axis,e=r.convert(this.body.range.start,"Number"),i=r.convert(this.body.range.end,"Number"),o=this.body.util.toTime((this.props.minorCharWidth||10)*this.options.maxMinorChars).valueOf(),n=o-d.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this.body.range,o);n-=this.body.util.toTime(0).valueOf();var s=new h(new Date(e),new Date(i),n,this.body.hiddenDates,this.options);s.setMoment(this.options.moment),this.options.format&&s.setFormat(this.options.format),this.options.timeAxis&&s.setScale(this.options.timeAxis),this.step=s;var a=this.dom;a.redundant.lines=a.lines,a.redundant.majorTexts=a.majorTexts,a.redundant.minorTexts=a.minorTexts,a.lines=[],a.majorTexts=[],a.minorTexts=[];var l,c,p,f,m,v,g,y,b,_=0,w=void 0,x=0;for(s.start(),l=s.getCurrent(),p=this.body.util.toScreen(l);s.hasNext()&&x<1e3;){switch(x++,f=s.isMajor(),b=s.getClassName(),y=s.getLabelMinor(),l,c=p,s.next(),l=s.getCurrent(),s.isMajor(),p=this.body.util.toScreen(l),v=_,_=p-c,s.scale){case"week":m=!0;break;default:m=_>=.4*v}if(this.options.showMinorLabels&&m){var k=this._repaintMinorText(c,y,t,b);k.style.width=_+"px"}f&&this.options.showMajorLabels?(c>0&&(void 0==w&&(w=c),k=this._repaintMajorText(c,s.getLabelMajor(),t,b)),g=this._repaintMajorLine(c,_,t,b)):m?g=this._repaintMinorLine(c,_,t,b):g&&(g.style.width=parseInt(g.style.width)+_+"px")}if(1e3!==x||u||(console.warn("Something is wrong with the Timeline scale. Limited drawing of grid lines to 1000 lines."),u=!0),this.options.showMajorLabels){var S=this.body.util.toTime(0),D=s.getLabelMajor(S),M=D.length*(this.props.majorCharWidth||10)+10;(void 0==w||M<w)&&this._repaintMajorText(0,D,t,b)}r.forEach(this.dom.redundant,function(t){for(;t.length;){var e=t.pop();e&&e.parentNode&&e.parentNode.removeChild(e)}})}
19283,o.prototype._repaintMinorText=function(t,e,i,o){var n=this.dom.redundant.minorTexts.shift();if(!n){var s=document.createTextNode("");n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return this.dom.minorTexts.push(n),n.innerHTML=e,n.style.top="top"==i?this.props.majorLabelHeight+"px":"0",this.options.rtl?(n.style.left="",n.style.right=t+"px"):n.style.left=t+"px",n.className="vis-text vis-minor "+o,n},o.prototype._repaintMajorText=function(t,e,i,o){var n=this.dom.redundant.majorTexts.shift();if(!n){var s=document.createElement("div");n=document.createElement("div"),n.appendChild(s),this.dom.foreground.appendChild(n)}return n.childNodes[0].innerHTML=e,n.className="vis-text vis-major "+o,n.style.top="top"==i?"0":this.props.minorLabelHeight+"px",this.options.rtl?(n.style.left="",n.style.right=t+"px"):n.style.left=t+"px",this.dom.majorTexts.push(n),n},o.prototype._repaintMinorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return n.style.top="top"==i?s.majorLabelHeight+"px":this.body.domProps.top.height+"px",n.style.height=s.minorLineHeight+"px",this.options.rtl?(n.style.left="",n.style.right=t-s.minorLineWidth/2+"px",n.className="vis-grid vis-vertical-rtl vis-minor "+o):(n.style.left=t-s.minorLineWidth/2+"px",n.className="vis-grid vis-vertical vis-minor "+o),n.style.width=e+"px",n},o.prototype._repaintMajorLine=function(t,e,i,o){var n=this.dom.redundant.lines.shift();n||(n=document.createElement("div"),this.dom.background.appendChild(n)),this.dom.lines.push(n);var s=this.props;return n.style.top="top"==i?"0":this.body.domProps.top.height+"px",this.options.rtl?(n.style.left="",n.style.right=t-s.majorLineWidth/2+"px",n.className="vis-grid vis-vertical-rtl vis-major "+o):(n.style.left=t-s.majorLineWidth/2+"px",n.className="vis-grid vis-vertical vis-major "+o),n.style.height=s.majorLineHeight+"px",n.style.width=e+"px",n},o.prototype._calculateCharSize=function(){this.dom.measureCharMinor||(this.dom.measureCharMinor=document.createElement("DIV"),this.dom.measureCharMinor.className="vis-text vis-minor vis-measure",this.dom.measureCharMinor.style.position="absolute",this.dom.measureCharMinor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMinor)),this.props.minorCharHeight=this.dom.measureCharMinor.clientHeight,this.props.minorCharWidth=this.dom.measureCharMinor.clientWidth,this.dom.measureCharMajor||(this.dom.measureCharMajor=document.createElement("DIV"),this.dom.measureCharMajor.className="vis-text vis-major vis-measure",this.dom.measureCharMajor.style.position="absolute",this.dom.measureCharMajor.appendChild(document.createTextNode("0")),this.dom.foreground.appendChild(this.dom.measureCharMajor)),this.props.majorCharHeight=this.dom.measureCharMajor.clientHeight,this.props.majorCharWidth=this.dom.measureCharMajor.clientWidth};var u=!1;t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={moment:a,locales:h,locale:"en",id:void 0,title:void 0},this.options=s.extend({},this.defaultOptions),e&&e.time?this.customTime=e.time:this.customTime=new Date,this.eventParams={},this.setOptions(e),this._create()}var n=i(10),s=i(2),r=i(16),a=i(9),h=i(98);o.prototype=new r,o.prototype.setOptions=function(t){t&&s.selectiveExtend(["moment","locale","locales","id"],this.options,t)},o.prototype._create=function(){function t(t){this.body.range._onMouseWheel(t)}var e=document.createElement("div");e["custom-time"]=this,e.className="vis-custom-time "+(this.options.id||""),e.style.position="absolute",e.style.top="0px",e.style.height="100%",this.bar=e;var i=document.createElement("div");i.style.position="relative",i.style.top="0px",i.style.left="-10px",i.style.height="100%",i.style.width="20px",i.addEventListener?(i.addEventListener("mousewheel",t.bind(this),!1),i.addEventListener("DOMMouseScroll",t.bind(this),!1)):i.attachEvent("onmousewheel",t.bind(this)),e.appendChild(i),this.hammer=new n(i),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:n.DIRECTION_HORIZONTAL})},o.prototype.destroy=function(){this.hide(),this.hammer.destroy(),this.hammer=null,this.body=null},o.prototype.redraw=function(){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar));var e=this.body.util.toScreen(this.customTime),i=this.options.locales[this.options.locale];i||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),i=this.options.locales.en);var o=this.options.title;return void 0===o?(o=i.time+": "+this.options.moment(this.customTime).format("dddd, MMMM Do YYYY, H:mm:ss"),o=o.charAt(0).toUpperCase()+o.substring(1)):"function"==typeof o&&(o=o.call(this.customTime)),this.bar.style.left=e+"px",this.bar.title=o,!1},o.prototype.hide=function(){this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar)},o.prototype.setCustomTime=function(t){this.customTime=s.convert(t,"Date"),this.redraw()},o.prototype.getCustomTime=function(){return new Date(this.customTime.valueOf())},o.prototype.setCustomTitle=function(t){this.options.title=t}
19283,o.prototype._onDragStart=function(t){this.eventParams.dragging=!0,this.eventParams.customTime=this.customTime,t.stopPropagation()},o.prototype._onDrag=function(t){if(this.eventParams.dragging){var e=this.body.util.toScreen(this.eventParams.customTime)+t.deltaX,i=this.body.util.toTime(e);this.setCustomTime(i),this.body.emitter.emit("timechange",{id:this.options.id,time:new Date(this.customTime.valueOf()),event:t}),t.stopPropagation()}},o.prototype._onDragEnd=function(t){this.eventParams.dragging&&(this.body.emitter.emit("timechanged",{id:this.options.id,time:new Date(this.customTime.valueOf()),event:t}),t.stopPropagation())},o.customTimeFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("custom-time"))return e["custom-time"];e=e.parentNode}return null},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(117).default,l=i(48).default,u=i(193).default,c=i(200).default,p=i(201).default,f=i(202).default,m=i(203).default,v=i(204).default,g=i(205).default,y=i(206).default,b=i(207).default,_=i(208).default,w=i(209).default,x=i(210).default,k=i(211).default,S=i(212).default,D=i(213).default,M=i(15),C=M.printStyle,O=function(){function t(e,i,o,n,r,a){(0,s.default)(this,t),this.options=h.bridgeObject(r),this.globalOptions=r,this.defaultOptions=a,this.body=i,this.edges=[],this.id=void 0,this.imagelist=o,this.grouplist=n,this.x=void 0,this.y=void 0,this.baseSize=this.options.size,this.baseFontSize=this.options.font.size,this.predefinedPosition=!1,this.selected=!1,this.hover=!1,this.labelModule=new d(this.body,this.options,!1),this.setOptions(e)}return(0,a.default)(t,[{key:"attachEdge",value:function(t){-1===this.edges.indexOf(t)&&this.edges.push(t)}},{key:"detachEdge",value:function(t){var e=this.edges.indexOf(t);-1!=e&&this.edges.splice(e,1)}},{key:"setOptions",value:function(e){var i=this.options.shape;if(e){if(void 0!==e.id&&(this.id=e.id),void 0===this.id)throw new Error("Node must have an id");t.checkMass(e,this.id),void 0!==e.x&&(null===e.x?(this.x=void 0,this.predefinedPosition=!1):(this.x=parseInt(e.x),this.predefinedPosition=!0)),void 0!==e.y&&(null===e.y?(this.y=void 0,this.predefinedPosition=!1):(this.y=parseInt(e.y),this.predefinedPosition=!0)),void 0!==e.size&&(this.baseSize=e.size),void 0!==e.value&&(e.value=parseFloat(e.value)),t.parseOptions(this.options,e,!0,this.globalOptions,this.grouplist);var o=[e,this.options,this.defaultOptions];return this.chooser=l.choosify("node",o),this._load_images(),this.updateLabelModule(e),this.updateShape(i),void 0!==e.hidden||void 0!==e.physics}}},{key:"_load_images",value:function(){if("circularImage"===this.options.shape||"image"===this.options.shape){if(void 0===this.options.image)throw new Error("Option image must be defined for node type '"+this.options.shape+"'");if(void 0===this.imagelist)throw new Error("Internal Error: No images provided");if("string"==typeof this.options.image)this.imageObj=this.imagelist.load(this.options.image,this.options.brokenImage,this.id);else{if(void 0===this.options.image.unselected)throw new Error("No unselected image provided");this.imageObj=this.imagelist.load(this.options.image.unselected,this.options.brokenImage,this.id),void 0!==this.options.image.selected?this.imageObjAlt=this.imagelist.load(this.options.image.selected,this.options.brokenImage,this.id):this.imageObjAlt=void 0}}}},{key:"getFormattingValues",value:function(){var t={color:this.options.color.background,borderWidth:this.options.borderWidth,borderColor:this.options.color.border,size:this.options.size,borderDashes:this.options.shapeProperties.borderDashes,borderRadius:this.options.shapeProperties.borderRadius,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y};return this.selected||this.hover?!0===this.chooser?this.selected?(t.borderWidth*=2,t.color=this.options.color.highlight.background,t.borderColor=this.options.color.highlight.border,t.shadow=this.options.shadow.enabled):this.hover&&(t.color=this.options.color.hover.background,t.borderColor=this.options.color.hover.border,t.shadow=this.options.shadow.enabled):"function"==typeof this.chooser&&(this.chooser(t,this.options.id,this.selected,this.hover),!1===t.shadow&&(t.shadowColor===this.options.shadow.color&&t.shadowSize===this.options.shadow.size&&t.shadowX===this.options.shadow.x&&t.shadowY===this.options.shadow.y||(t.shadow=!0))):t.shadow=this.options.shadow.enabled,t}},{key:"updateLabelModule",value:function(e){void 0!==this.options.label&&null!==this.options.label||(this.options.label=""),t.updateGroupOptions(this.options,e,this.grouplist);var i=this.grouplist.get(this.options.group,!1),o=[e,this.options,i,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,o),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateShape",value:function(t){if(t===this.options.shape&&this.shape)this.shape.setOptions(this.options,this.imageObj,this.imageObjAlt);else switch(this.options.shape){case"box":this.shape=new u(this.options,this.body,this.labelModule);break;case"circle":this.shape=new c(this.options,this.body,this.labelModule);break;case"circularImage":this.shape=new p(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"database":this.shape=new f(this.options,this.body,this.labelModule);break;case"diamond":this.shape=new m(this.options,this.body,this.labelModule);break;case"dot":this.shape=new v(this.options,this.body,this.labelModule);break;case"ellipse":this.shape=new g(this.options,this.body,this.labelModule);break;case"icon":this.shape=new y(this.options,this.body,this.labelModule);break;case"image":this.shape=new b(this.options,this.body,this.labelModule,this.imageObj,this.imageObjAlt);break;case"square":this.shape=new _(this.options,this.body,this.labelModule);break;case"hexagon":this.shape=new w(this.options,this.body,this.labelModule);break;case"star":this.shape=new x(this.options,this.body,this.labelModule);break;case"text":this.shape=new k(this.options,this.body,this.labelModule);break;case"triangle":this.shape=new S(this.options,this.body,this.labelModule);break;case"triangleDown":this.shape=new D(this.options,this.body,this.labelModule);break;default:this.shape=new g(this.options,this.body,this.labelModule)}this.needsRefresh()}},{key:"select",value:function(){this.selected=!0,this.needsRefresh()}},{key:"unselect",value:function(){this.selected=!1,this.needsRefresh()}},{key:"needsRefresh",value:function(){this.shape.refreshNeeded=!0}},{key:"getTitle",value:function(){return this.options.title}},{key:"distanceToBorder",value:function(t,e){return this.shape.distanceToBorder(t,e)}},{key:"isFixed",value:function(){return this.options.fixed.x&&this.options.fixed.y}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}},{key:"getLabelSize",value:function(){return this.labelModule.size()}}
19283,{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.size=this.options.scaling.min+o*n}else this.options.size=this.baseSize,this.options.font.size=this.baseFontSize;this.updateLabelModule()}},{key:"draw",value:function(t){var e=this.getFormattingValues();this.shape.draw(t,this.x,this.y,this.selected,this.hover,e)}},{key:"updateBoundingBox",value:function(t){this.shape.updateBoundingBox(this.x,this.y,t)}},{key:"resize",value:function(t){var e=this.getFormattingValues();this.shape.resize(t,this.selected,this.hover,e)}},{key:"getItemsOnPoint",value:function(t){var e=[];return this.labelModule.visible()&&l.pointInRect(this.labelModule.getSize(),t)&&e.push({nodeId:this.id,labelId:0}),l.pointInRect(this.shape.boundingBox,t)&&e.push({nodeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){return this.shape.left<t.right&&this.shape.left+this.shape.width>t.left&&this.shape.top<t.bottom&&this.shape.top+this.shape.height>t.top}},{key:"isBoundingBoxOverlappingWith",value:function(t){return this.shape.boundingBox.left<t.right&&this.shape.boundingBox.right>t.left&&this.shape.boundingBox.top<t.bottom&&this.shape.boundingBox.bottom>t.top}}],[{key:"updateGroupOptions",value:function(t,e,i){if(void 0!==i){var o=t.group;if(void 0!==e&&void 0!==e.group&&o!==e.group)throw new Error("updateGroupOptions: group values in options don't match.");if("number"==typeof o||"string"==typeof o&&""!=o){var n=i.get(o);h.selectiveNotDeepExtend(["font"],t,n),t.color=h.parseColor(t.color)}}}},{key:"parseOptions",value:function(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2],n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},s=arguments[4],r=["color","fixed","shadow"];if(h.selectiveNotDeepExtend(r,e,i,o),t.checkMass(i),h.mergeOptions(e,i,"shadow",n),void 0!==i.color&&null!==i.color){var a=h.parseColor(i.color);h.fillIfDefined(e.color,a)}else!0===o&&null===i.color&&(e.color=h.bridgeObject(n.color));void 0!==i.fixed&&null!==i.fixed&&("boolean"==typeof i.fixed?(e.fixed.x=i.fixed,e.fixed.y=i.fixed):(void 0!==i.fixed.x&&"boolean"==typeof i.fixed.x&&(e.fixed.x=i.fixed.x),void 0!==i.fixed.y&&"boolean"==typeof i.fixed.y&&(e.fixed.y=i.fixed.y))),!0===o&&null===i.font&&(e.font=h.bridgeObject(n.font)),t.updateGroupOptions(e,i,s),void 0!==i.scaling&&h.mergeOptions(e.scaling,i.scaling,"label",n.scaling)}},{key:"checkMass",value:function(t,e){if(void 0!==t.mass&&t.mass<=0){var i="";void 0!==e&&(i=" in node id: "+e),console.log("%cNegative or zero mass disallowed"+i+", setting mass to 1.",C),t.mass=1}}}]),t}();e.default=O},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(6),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=function(){function t(){(0,a.default)(this,t)}return(0,d.default)(t,null,[{key:"choosify",value:function(t,e){var i=["node","edge","label"],o=!0,n=l.topMost(e,"chosen");if("boolean"==typeof n)o=n;else if("object"===(void 0===n?"undefined":(0,s.default)(n))){if(-1===i.indexOf(t))throw new Error("choosify: subOption '"+t+"' should be one of '"+i.join("', '")+"'");var r=l.topMost(e,["chosen",t]);"boolean"!=typeof r&&"function"!=typeof r||(o=r)}return o}},{key:"pointInRect",value:function(t,e,i){if(t.width<=0||t.height<=0)return!1;if(void 0!==i){var o={x:e.x-i.x,y:e.y-i.y};if(0!==i.angle){var n=-i.angle;e={x:Math.cos(n)*o.x-Math.sin(n)*o.y,y:Math.sin(n)*o.x+Math.cos(n)*o.y}}else e=o}var s=t.x+t.width,r=t.y+t.width;return t.left<e.x&&s>e.x&&t.top<e.y&&r>e.y}},{key:"isValidLabel",value:function(t){return"string"==typeof t&&""!==t}}]),t}();e.default=u},function(t,e,i){i(125);for(var o=i(18),n=i(26),s=i(31),r=i(13)("toStringTag"),a="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),h=0;h<a.length;h++){var d=a[h],l=o[d],u=l&&l.prototype;u&&!u[r]&&n(u,r,d),s[d]=s.Array}},function(t,e){var i={}.toString;t.exports=function(t){return i.call(t).slice(8,-1)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on "+t);return t}},function(t,e){t.exports=!0}
19283,function(t,e,i){var o=i(32);t.exports=function(t,e){if(!o(t))return t;var i,n;if(e&&"function"==typeof(i=t.toString)&&!o(n=i.call(t)))return n;if("function"==typeof(i=t.valueOf)&&!o(n=i.call(t)))return n;if(!e&&"function"==typeof(i=t.toString)&&!o(n=i.call(t)))return n;throw TypeError("Can't convert object to primitive value")}},function(t,e,i){var o=i(27),n=i(130),s=i(58),r=i(56)("IE_PROTO"),a=function(){},h=function(){var t,e=i(82)("iframe"),o=s.length;for(e.style.display="none",i(134).appendChild(e),e.src="javascript:",t=e.contentWindow.document,t.open(),t.write("<script>document.F=Object<\/script>"),t.close(),h=t.F;o--;)delete h.prototype[s[o]];return h()};t.exports=Object.create||function(t,e){var i;return null!==t?(a.prototype=o(t),i=new a,a.prototype=null,i[r]=t):i=h(),void 0===e?i:n(i,e)}},function(t,e){var i=Math.ceil,o=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?o:i)(t)}},function(t,e,i){var o=i(57)("keys"),n=i(40);t.exports=function(t){return o[t]||(o[t]=n(t))}},function(t,e,i){var o=i(18),n=o["__core-js_shared__"]||(o["__core-js_shared__"]={});t.exports=function(t){return n[t]||(n[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,i){var o=i(20).f,n=i(22),s=i(13)("toStringTag");t.exports=function(t,e,i){t&&!n(t=i?t:t.prototype,s)&&o(t,s,{configurable:!0,value:e})}},function(t,e,i){var o=i(135)(!0);i(79)(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,i=this._i;return i>=e.length?{value:void 0,done:!0}:(t=o(e,i),this._i+=t.length,{value:t,done:!1})})},function(t,e,i){e.f=i(13)},function(t,e,i){var o=i(18),n=i(7),s=i(52),r=i(61),a=i(20).f;t.exports=function(t){var e=n.Symbol||(n.Symbol=s?{}:o.Symbol||{});"_"==t.charAt(0)||t in e||a(e,t,{value:r.f(t)})}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){var i=p().hours(0).minutes(0).seconds(0).milliseconds(0),o=i.clone().add(-3,"days").valueOf(),n=i.clone().add(3,"days").valueOf();this.millisecondsPerPixelCache=void 0,void 0===e?(this.start=o,this.end=n):(this.start=e.start||o,this.end=e.end||n),this.rolling=!1,this.body=t,this.deltaDifference=0,this.scaleOffset=0,this.startToFront=!1,this.endToFront=!0,this.defaultOptions={rtl:!1,start:null,end:null,moment:p,direction:"horizontal",moveable:!0,zoomable:!0,min:null,max:null,zoomMin:10,zoomMax:31536e10,rollingMode:{follow:!1,offset:.5}},this.options=c.extend({},this.defaultOptions),this.props={touch:{}},this.animationTimer=null,this.body.emitter.on("panstart",this._onDragStart.bind(this)),this.body.emitter.on("panmove",this._onDrag.bind(this)),this.body.emitter.on("panend",this._onDragEnd.bind(this)),this.body.emitter.on("mousewheel",this._onMouseWheel.bind(this)),this.body.emitter.on("touch",this._onTouch.bind(this)),this.body.emitter.on("pinch",this._onPinch.bind(this)),this.body.dom.rollingModeBtn.addEventListener("click",this.startRolling.bind(this)),this.setOptions(e)}function s(t){if("horizontal"!=t&&"vertical"!=t)throw new TypeError('Unknown direction "'+t+'". Choose "horizontal" or "vertical".')}var r=i(8),a=o(r),h=i(19),d=o(h),l=i(6),u=o(l),c=i(2),p=i(9),f=i(16),m=i(36);n.prototype=new f,n.prototype.setOptions=function(t){if(t){var e=["animation","direction","min","max","zoomMin","zoomMax","moveable","zoomable","moment","activate","hiddenDates","zoomKey","rtl","showCurrentTime","rollingMode","horizontalScroll"];c.selectiveExtend(e,this.options,t),t.rollingMode&&t.rollingMode.follow&&this.startRolling(),("start"in t||"end"in t)&&this.setRange(t.start,t.end)}},n.prototype.startRolling=function(){function t(){e.stopRolling(),e.rolling=!0;var i=e.end-e.start,o=c.convert(new Date,"Date").valueOf(),n=o-i*e.options.rollingMode.offset,s=o+i*(1-e.options.rollingMode.offset),r={animation:!1};e.setRange(n,s,r),i=1/e.conversion(e.body.domProps.center.width).scale/10,i<30&&(i=30),i>1e3&&(i=1e3),e.body.dom.rollingModeBtn.style.visibility="hidden",e.currentTimeTimer=setTimeout(t,i)}var e=this;t()},n.prototype.stopRolling=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),this.rolling=!1,this.body.dom.rollingModeBtn.style.visibility="visible")}
19283,n.prototype.setRange=function(t,e,i,o,n){i||(i={}),!0!==i.byUser&&(i.byUser=!1);var s=this,r=void 0!=t?c.convert(t,"Date").valueOf():null,h=void 0!=e?c.convert(e,"Date").valueOf():null;if(this._cancelAnimation(),this.millisecondsPerPixelCache=void 0,i.animation){var l=this.start,p=this.end,f="object"===(0,u.default)(i.animation)&&"duration"in i.animation?i.animation.duration:500,v="object"===(0,u.default)(i.animation)&&"easingFunction"in i.animation?i.animation.easingFunction:"easeInOutQuad",g=c.easingFunctions[v];if(!g)throw new Error("Unknown easing function "+(0,d.default)(v)+". Choose from: "+(0,a.default)(c.easingFunctions).join(", "));var y=(new Date).valueOf(),b=!1;return function t(){if(!s.props.touch.dragging){var e=(new Date).valueOf(),a=e-y,d=g(a/f),u=a>f,c=u||null===r?r:l+(r-l)*d,v=u||null===h?h:p+(h-p)*d;_=s._applyRange(c,v),m.updateHiddenDates(s.options.moment,s.body,s.options.hiddenDates),b=b||_;var w={start:new Date(s.start),end:new Date(s.end),byUser:i.byUser,event:i.event};if(n&&n(d,_,u),_&&s.body.emitter.emit("rangechange",w),u){if(b&&(s.body.emitter.emit("rangechanged",w),o))return o()}else s.animationTimer=setTimeout(t,20)}}()}var _=this._applyRange(r,h);if(m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),_){var w={start:new Date(this.start),end:new Date(this.end),byUser:i.byUser,event:i.event};if(this.body.emitter.emit("rangechange",w),clearTimeout(s.timeoutID),s.timeoutID=setTimeout(function(){s.body.emitter.emit("rangechanged",w)},200),o)return o()}},n.prototype.getMillisecondsPerPixel=function(){return void 0===this.millisecondsPerPixelCache&&(this.millisecondsPerPixelCache=(this.end-this.start)/this.body.dom.center.clientWidth),this.millisecondsPerPixelCache},n.prototype._cancelAnimation=function(){this.animationTimer&&(clearTimeout(this.animationTimer),this.animationTimer=null)},n.prototype._applyRange=function(t,e){var i,o=null!=t?c.convert(t,"Date").valueOf():this.start,n=null!=e?c.convert(e,"Date").valueOf():this.end,s=null!=this.options.max?c.convert(this.options.max,"Date").valueOf():null,r=null!=this.options.min?c.convert(this.options.min,"Date").valueOf():null;if(isNaN(o)||null===o)throw new Error('Invalid start "'+t+'"');if(isNaN(n)||null===n)throw new Error('Invalid end "'+e+'"');if(n<o&&(n=o),null!==r&&o<r&&(i=r-o,o+=i,n+=i,null!=s&&n>s&&(n=s)),null!==s&&n>s&&(i=n-s,o-=i,n-=i,null!=r&&o<r&&(o=r)),null!==this.options.zoomMin){var a=parseFloat(this.options.zoomMin);if(a<0&&(a=0),n-o<a){this.end-this.start===a&&o>=this.start-.5&&n<=this.end?(o=this.start,n=this.end):(i=a-(n-o),o-=i/2,n+=i/2)}}if(null!==this.options.zoomMax){var h=parseFloat(this.options.zoomMax);h<0&&(h=0),n-o>h&&(this.end-this.start===h&&o<this.start&&n>this.end?(o=this.start,n=this.end):(i=n-o-h,o+=i/2,n-=i/2))}var d=this.start!=o||this.end!=n;return o>=this.start&&o<=this.end||n>=this.start&&n<=this.end||this.start>=o&&this.start<=n||this.end>=o&&this.end<=n||this.body.emitter.emit("checkRangedItems"),this.start=o,this.end=n,d},n.prototype.getRange=function(){return{start:this.start,end:this.end}},n.prototype.conversion=function(t,e){return n.conversion(this.start,this.end,t,e)},n.conversion=function(t,e,i,o){return void 0===o&&(o=0),0!=i&&e-t!=0?{offset:t,scale:i/(e-t-o)}:{offset:0,scale:1}},n.prototype._onDragStart=function(t){this.deltaDifference=0,this.previousDelta=0,this.options.moveable&&this._isInsideRange(t)&&this.props.touch.allowDragging&&(this.stopRolling(),this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.dragging=!0,this.body.dom.root&&(this.body.dom.root.style.cursor="move"))},n.prototype._onDrag=function(t){if(t&&this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging){var e=this.options.direction;s(e);var i="horizontal"==e?t.deltaX:t.deltaY;i-=this.deltaDifference;var o=this.props.touch.end-this.props.touch.start;o-=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end);var n,r="horizontal"==e?this.body.domProps.center.width:this.body.domProps.center.height;n=this.options.rtl?i/r*o:-i/r*o;var a=this.props.touch.start+n,h=this.props.touch.end+n,d=m.snapAwayFromHidden(this.body.hiddenDates,a,this.previousDelta-i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,this.previousDelta-i,!0);
19283if(d!=a||l!=h)return this.deltaDifference+=i,this.props.touch.start=d,this.props.touch.end=l,void this._onDrag(t);this.previousDelta=i,this._applyRange(a,h);var u=new Date(this.start),c=new Date(this.end);this.body.emitter.emit("rangechange",{start:u,end:c,byUser:!0,event:t}),this.body.emitter.emit("panmove")}},n.prototype._onDragEnd=function(t){this.props.touch.dragging&&this.options.moveable&&this.props.touch.allowDragging&&(this.props.touch.dragging=!1,this.body.dom.root&&(this.body.dom.root.style.cursor="auto"),this.body.emitter.emit("rangechanged",{start:new Date(this.start),end:new Date(this.end),byUser:!0,event:t}))},n.prototype._onMouseWheel=function(t){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),!(this.options.zoomKey&&!t[this.options.zoomKey]&&this.options.zoomable||!this.options.zoomable&&this.options.moveable)&&this.options.zoomable&&this.options.moveable&&this._isInsideRange(t)&&e){var i;i=e<0?1-e/5:1/(1+e/5);var o;if(this.rolling)o=this.start+(this.end-this.start)*this.options.rollingMode.offset;else{var n=this.getPointer({x:t.clientX,y:t.clientY},this.body.dom.center);o=this._pointerToDate(n)}this.zoom(i,o,e,t),t.preventDefault()}},n.prototype._onTouch=function(t){this.props.touch.start=this.start,this.props.touch.end=this.end,this.props.touch.allowDragging=!0,this.props.touch.center=null,this.scaleOffset=0,this.deltaDifference=0,c.preventDefault(t)},n.prototype._onPinch=function(t){if(this.options.zoomable&&this.options.moveable){c.preventDefault(t),this.props.touch.allowDragging=!1,this.props.touch.center||(this.props.touch.center=this.getPointer(t.center,this.body.dom.center)),this.stopRolling();var e=1/(t.scale+this.scaleOffset),i=this._pointerToDate(this.props.touch.center),o=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),n=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,i),s=o-n,r=i-n+(this.props.touch.start-(i-n))*e,a=i+s+(this.props.touch.end-(i+s))*e;this.startToFront=1-e<=0,this.endToFront=e-1<=0;var h=m.snapAwayFromHidden(this.body.hiddenDates,r,1-e,!0),d=m.snapAwayFromHidden(this.body.hiddenDates,a,e-1,!0);h==r&&d==a||(this.props.touch.start=h,this.props.touch.end=d,this.scaleOffset=1-t.scale,r=h,a=d);var l={animation:!1,byUser:!0,event:t};this.setRange(r,a,l),this.startToFront=!1,this.endToFront=!0}},n.prototype._isInsideRange=function(t){var e,i=t.center?t.center.x:t.clientX;e=this.options.rtl?i-c.getAbsoluteLeft(this.body.dom.centerContainer):c.getAbsoluteRight(this.body.dom.centerContainer)-i;var o=this.body.util.toTime(e);return o>=this.start&&o<=this.end},n.prototype._pointerToDate=function(t){var e,i=this.options.direction;if(s(i),"horizontal"==i)return this.body.util.toTime(t.x).valueOf();var o=this.body.domProps.center.height;return e=this.conversion(o),t.y/e.scale+e.offset},n.prototype.getPointer=function(t,e){return this.options.rtl?{x:c.getAbsoluteRight(e)-t.x,y:t.y-c.getAbsoluteTop(e)}:{x:t.x-c.getAbsoluteLeft(e),y:t.y-c.getAbsoluteTop(e)}},n.prototype.zoom=function(t,e,i,o){null==e&&(e=(this.start+this.end)/2);var n=m.getHiddenDurationBetween(this.body.hiddenDates,this.start,this.end),s=m.getHiddenDurationBefore(this.options.moment,this.body.hiddenDates,this,e),r=n-s,a=e-s+(this.start-(e-s))*t,h=e+r+(this.end-(e+r))*t;this.startToFront=!(i>0),this.endToFront=!(-i>0) 19284;var d=m.snapAwayFromHidden(this.body.hiddenDates,a,i,!0),l=m.snapAwayFromHidden(this.body.hiddenDates,h,-i,!0);d==a&&l==h||(a=d,h=l);var u={animation:!1,byUser:!0,event:o};this.setRange(a,h,u),this.startToFront=!1,this.endToFront=!0},n.prototype.move=function(t){var e=this.end-this.start,i=this.start+e*t,o=this.end+e*t;this.start=i,this.end=o},n.prototype.moveTo=function(t){var e=(this.start+this.end)/2,i=e-t,o=this.start-i,n=this.end-i,s={animation:!1,byUser:!0,event:null};this.setRange(o,n,s)},t.exports=n},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){}var s=i(19),r=o(s),a=i(6),h=o(a),d=i(44),l=i(10),u=i(37),c=i(2),p=i(45),f=i(97),m=i(36),v=i(46);d(n.prototype),n.prototype._create=function(t){function e(t){this.isActive()&&this.emit
19284("mousewheel",t);var e=0,i=0;if("detail"in t&&(i=-1*t.detail),"wheelDelta"in t&&(i=t.wheelDelta),"wheelDeltaY"in t&&(i=t.wheelDeltaY),"wheelDeltaX"in t&&(e=-1*t.wheelDeltaX),"axis"in t&&t.axis===t.HORIZONTAL_AXIS&&(e=-1*i,i=0),"deltaY"in t&&(i=-1*t.deltaY),"deltaX"in t&&(e=t.deltaX),this.options.zoomKey&&!t[this.options.zoomKey])if(t.preventDefault(),this.options.verticalScroll&&Math.abs(i)>=Math.abs(e)){var o=this.props.scrollTop,n=o+i;this.isActive()&&(this._setScrollTop(n),this._redraw(),this.emit("scroll",t))}else if(this.options.horizontalScroll){var s=Math.abs(e)>=Math.abs(i)?e:i,r=s/120*(this.range.end-this.range.start)/20,a=this.range.start+r,h=this.range.end+r,d={animation:!1,byUser:!0,event:t};this.range.setRange(a,h,d)}}function i(t){if(s.options.verticalScroll&&(t.preventDefault(),s.isActive())){var e=-t.target.scrollTop;s._setScrollTop(e),s._redraw(),s.emit("scrollSide",t)}}function o(t){if(t.preventDefault&&t.preventDefault(),!(!t.target.className.indexOf("vis")>-1||a))return t.dataTransfer.dropEffect="move",a=!0,!1}function n(t){t.preventDefault&&t.preventDefault(),t.stopPropagation&&t.stopPropagation();try{var e=JSON.parse(t.dataTransfer.getData("text"));if(!e||!e.content)return}catch(t){return!1}return a=!1,t.center={x:t.clientX,y:t.clientY},"item"!==e.target?s.itemSet._onAddItem(t):s.itemSet._onDropObjectOnItem(t),s.emit("drop",s.getEventProperties(t)),!1}this.dom={},this.dom.container=t,this.dom.root=document.createElement("div"),this.dom.background=document.createElement("div"),this.dom.backgroundVertical=document.createElement("div"),this.dom.backgroundHorizontal=document.createElement("div"),this.dom.centerContainer=document.createElement("div"),this.dom.leftContainer=document.createElement("div"),this.dom.rightContainer=document.createElement("div"),this.dom.center=document.createElement("div"),this.dom.left=document.createElement("div"),this.dom.right=document.createElement("div"),this.dom.top=document.createElement("div"),this.dom.bottom=document.createElement("div"),this.dom.shadowTop=document.createElement("div"),this.dom.shadowBottom=document.createElement("div"),this.dom.shadowTopLeft=document.createElement("div"),this.dom.shadowBottomLeft=document.createElement("div"),this.dom.shadowTopRight=document.createElement("div"),this.dom.shadowBottomRight=document.createElement("div"),this.dom.rollingModeBtn=document.createElement("div"),this.dom.root.className="vis-timeline",this.dom.background.className="vis-panel vis-background",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical",this.dom.backgroundHorizontal.className="vis-panel vis-background vis-horizontal",this.dom.centerContainer.className="vis-panel vis-center",this.dom.leftContainer.className="vis-panel vis-left",this.dom.rightContainer.className="vis-panel vis-right",this.dom.top.className="vis-panel vis-top",this.dom.bottom.className="vis-panel vis-bottom",this.dom.left.className="vis-content",this.dom.center.className="vis-content",this.dom.right.className="vis-content",this.dom.shadowTop.className="vis-shadow vis-top",this.dom.shadowBottom.className="vis-shadow vis-bottom",this.dom.shadowTopLeft.className="vis-shadow vis-top",this.dom.shadowBottomLeft.className="vis-shadow vis-bottom",this.dom.shadowTopRight.className="vis-shadow vis-top",this.dom.shadowBottomRight.className="vis-shadow vis-bottom",this.dom.rollingModeBtn.className="vis-rolling-mode-btn",this.dom.root.appendChild(this.dom.background),this.dom.root.appendChild(this.dom.backgroundVertical),this.dom.root.appendChild(this.dom.backgroundHorizontal),this.dom.root.appendChild(this.dom.centerContainer),this.dom.root.appendChild(this.dom.leftContainer),this.dom.root.appendChild(this.dom.rightContainer),this.dom.root.appendChild(this.dom.top),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.bottom),this.dom.root.appendChild(this.dom.rollingModeBtn),this.dom.centerContainer.appendChild(this.dom.center),this.dom.leftContainer.appendChild(this.dom.left),this.dom.rightContainer.appendChild(this.dom.right),this.dom.centerContainer.appendChild(this.dom.shadowTop),this.dom.centerContainer.appendChild(this.dom.shadowBottom),this.dom.leftContainer.appendChild(this.dom.shadowTopLeft),this.dom.leftContainer.appendChild(this.dom.shadowBottomLeft),this.dom.rightContainer.appendChild(this.dom.shadowTopRight),this.dom.rightContainer.appendChild(this.dom.shadowBottomRight),this.props={root:{},background:{},centerContainer:{},leftContainer:{},rightContainer:{},center:{},left:{},right:{},top:{},bottom:{},border:{},scrollTop:0,scrollTopMin:0},this.on("rangechange",function(){!0===this.initialDrawDone&&this._redraw()}.bind(this)),this.on("rangechanged",function(){this.initialRangeChangeDone||(this.initialRangeChangeDone=!0)}.bind(this)),this.on("touch",this._onTouch.bind(this)),this.on("panmove",this._onDrag.bind(this));var s=this;this._origRedraw=this._redraw.bind(this),this._redraw=c.throttle(this._origRedraw),this.on("_change",function(t){s.itemSet&&s.itemSet.initialItemSetDrawn&&t&&1==t.queue?s._redraw():s._origRedraw()}),this.hammer=new l(this.dom.root);var r=this.hammer.get("pinch").set({enable:!0});u.disablePreventDefaultVertically(r),this.hammer.get("pan").set({threshold:5,direction:l.DIRECTION_HORIZONTAL}),this.listeners={},["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){var e=function(e){s.isActive()&&s.emit(t,e)};s.hammer.on(t,e),s.listeners[t]=e}),u.onTouch(this.hammer,function(t){s.emit("touch",t)}.bind(this)),u.onRelease(this.hammer,function(t){s.emit("release",t)}.bind(this)),this.dom.centerContainer.addEventListener?(this.dom.centerContainer.addEventListener("mousewheel",e.bind(this),!1),this.dom.centerContainer.addEventListener("DOMMouseScroll",e.bind(this),!1)):this.dom.centerContainer.attachEvent("onmousewheel",e.bind(this)),this.dom.left.parentNode.addEventListener("scroll",i.bind(this)),this.dom.right.parentNode.addEventListener("scroll",i.bind(this));var a=!1;if(this.dom.center.addEventListener("dragover",o.bind(this),!1),this.dom.center.addEventListener("drop",n.bind(this),!1),this.customTimes=[],this.touch={},this.redrawCount=0,this.initialDrawDone=!1,this.initialRangeChangeDone=!1,!t)throw new Error("No container provided");t.appendChild(this.dom.root)},n.prototype.setOptions=function(t){if(t){var e=["width","height","minHeight","maxHeight","autoResize","start","end","clickToUse","dataAttributes","hiddenDates","locale","locales","moment","rtl","zoomKey","horizontalScroll","verticalScroll"];if(c.selectiveExtend(e,this.options,t),this.dom.rollingModeBtn.style.visibility="hidden",this.options.rtl&&(this.dom.container.style.direction="rtl",this.dom.backgroundVertical.className="vis-panel vis-background vis-vertical-rtl"),this.options.verticalScroll&&(this.options.rtl?this.dom.rightContainer.className="vis-panel vis-right vis-vertical-scroll":this.dom.leftContainer.className="vis-panel vis-left vis-vertical-scroll"),"object"!==(0,h.default)(this.options.orientation)&&(this.options.orientation={item:void 0,axis:void 0}),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation={item:t.orientation,axis:t.orientation}:"object"===(0,h.default)(t.orientation)&&("item"in t.orientation&&(this.options.orientation.item=t.orientation.item),"axis"in t.orientation&&(this.options.orientation.axis=t.orientation.axis))
19284),"both"===this.options.orientation.axis){if(!this.timeAxis2){var i=this.timeAxis2=new p(this.body);i.setOptions=function(t){var e=t?c.extend({},t):{};e.orientation="top",p.prototype.setOptions.call(i,e)},this.components.push(i)}}else if(this.timeAxis2){var o=this.components.indexOf(this.timeAxis2);-1!==o&&this.components.splice(o,1),this.timeAxis2.destroy(),this.timeAxis2=null}if("function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),"hiddenDates"in this.options&&m.convertHiddenOptions(this.options.moment,this.body,this.options.hiddenDates),"clickToUse"in t&&(t.clickToUse?this.activator||(this.activator=new f(this.dom.root)):this.activator&&(this.activator.destroy(),delete this.activator)),"showCustomTime"in t)throw new Error("Option `showCustomTime` is deprecated. Create a custom time bar via timeline.addCustomTime(time [, id])");this._initAutoResize()}if(this.components.forEach(function(e){return e.setOptions(t)}),"configure"in t){this.configurator||(this.configurator=this._createConfigurator()),this.configurator.setOptions(t.configure);var n=c.deepExtend({},this.options);this.components.forEach(function(t){c.deepExtend(n,t.options)}),this.configurator.setModuleOptions({global:n})}this._redraw()},n.prototype.isActive=function(){return!this.activator||this.activator.active},n.prototype.destroy=function(){this.setItems(null),this.setGroups(null),this.off(),this._stopAutoResize(),this.dom.root.parentNode&&this.dom.root.parentNode.removeChild(this.dom.root),this.dom=null,this.activator&&(this.activator.destroy(),delete this.activator);for(var t in this.listeners)this.listeners.hasOwnProperty(t)&&delete this.listeners[t];this.listeners=null,this.hammer=null,this.components.forEach(function(t){return t.destroy()}),this.body=null},n.prototype.setCustomTime=function(t,e){var i=this.customTimes.filter(function(t){return e===t.options.id});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));i.length>0&&i[0].setCustomTime(t)},n.prototype.getCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));return e[0].getCustomTime()},n.prototype.setCustomTimeTitle=function(t,e){var i=this.customTimes.filter(function(t){return t.options.id===e});if(0===i.length)throw new Error("No custom time bar found with id "+(0,r.default)(e));if(i.length>0)return i[0].setCustomTitle(t)},n.prototype.getEventProperties=function(t){return{event:t}},n.prototype.addCustomTime=function(t,e){var i=void 0!==t?c.convert(t,"Date").valueOf():new Date;if(this.customTimes.some(function(t){return t.options.id===e}))throw new Error("A custom time with id "+(0,r.default)(e)+" already exists");var o=new v(this.body,c.extend({},this.options,{time:i,id:e}));return this.customTimes.push(o),this.components.push(o),this._redraw(),e},n.prototype.removeCustomTime=function(t){var e=this.customTimes.filter(function(e){return e.options.id===t});if(0===e.length)throw new Error("No custom time bar found with id "+(0,r.default)(t));e.forEach(function(t){this.customTimes.splice(this.customTimes.indexOf(t),1),this.components.splice(this.components.indexOf(t),1),t.destroy()}.bind(this))},n.prototype.getVisibleItems=function(){return this.itemSet&&this.itemSet.getVisibleItems()||[]},n.prototype.fit=function(t,e){var i=this.getDataRange();if(null!==i.min||null!==i.max){var o=i.max-i.min,n=new Date(i.min.valueOf()-.01*o),s=new Date(i.max.valueOf()+.01*o),r=!t||void 0===t.animation||t.animation;this.range.setRange(n,s,{animation:r},e)}},n.prototype.getDataRange=function(){throw new Error("Cannot invoke abstract method getDataRange")},n.prototype.setWindow=function(t,e,i,o){"function"==typeof arguments[2]&&(o=arguments[2],i={});var n,s;1==arguments.length?(s=arguments[0],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n})):2==arguments.length&&"function"==typeof arguments[1]?(s=arguments[0],o=arguments[1],n=void 0===s.animation||s.animation,this.range.setRange(s.start,s.end,{animation:n},o)):(n=!i||void 0===i.animation||i.animation,this.range.setRange(t,e,{animation:n},o))}
19284,n.prototype.moveTo=function(t,e,i){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.range.end-this.range.start,n=c.convert(t,"Date").valueOf(),s=n-o/2,r=n+o/2,a=!e||void 0===e.animation||e.animation;this.range.setRange(s,r,{animation:a},i)},n.prototype.getWindow=function(){var t=this.range.getRange();return{start:new Date(t.start),end:new Date(t.end)}},n.prototype.zoomIn=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=r/(1+t),h=(r-a)/2,d=n+h,l=s-h;this.setWindow(d,l,e,i)}},n.prototype.zoomOut=function(t,e,i){if(!(!t||t<0||t>1)){"function"==typeof arguments[1]&&(i=arguments[1],e={});var o=this.getWindow(),n=o.start.valueOf(),s=o.end.valueOf(),r=s-n,a=n-r*t/2,h=s+r*t/2;this.setWindow(a,h,e,i)}},n.prototype.redraw=function(){this._redraw()},n.prototype._redraw=function(){this.redrawCount++;var t=!1,e=this.options,i=this.props,o=this.dom;if(o&&o.container&&0!=o.root.offsetWidth){m.updateHiddenDates(this.options.moment,this.body,this.options.hiddenDates),"top"==e.orientation?(c.addClassName(o.root,"vis-top"),c.removeClassName(o.root,"vis-bottom")):(c.removeClassName(o.root,"vis-top"),c.addClassName(o.root,"vis-bottom")),o.root.style.maxHeight=c.option.asSize(e.maxHeight,""),o.root.style.minHeight=c.option.asSize(e.minHeight,""),o.root.style.width=c.option.asSize(e.width,""),i.border.left=(o.centerContainer.offsetWidth-o.centerContainer.clientWidth)/2,i.border.right=i.border.left,i.border.top=(o.centerContainer.offsetHeight-o.centerContainer.clientHeight)/2,i.border.bottom=i.border.top,i.borderRootHeight=o.root.offsetHeight-o.root.clientHeight,i.borderRootWidth=o.root.offsetWidth-o.root.clientWidth,0===o.centerContainer.clientHeight&&(i.border.left=i.border.top,i.border.right=i.border.left),0===o.root.clientHeight&&(i.borderRootWidth=i.borderRootHeight),i.center.height=o.center.offsetHeight,i.left.height=o.left.offsetHeight,i.right.height=o.right.offsetHeight,i.top.height=o.top.clientHeight||-i.border.top,i.bottom.height=o.bottom.clientHeight||-i.border.bottom;var n=Math.max(i.left.height,i.center.height,i.right.height),s=i.top.height+n+i.bottom.height+i.borderRootHeight+i.border.top+i.border.bottom;o.root.style.height=c.option.asSize(e.height,s+"px"),i.root.height=o.root.offsetHeight,i.background.height=i.root.height-i.borderRootHeight;var r=i.root.height-i.top.height-i.bottom.height-i.borderRootHeight;i.centerContainer.height=r,i.leftContainer.height=r,i.rightContainer.height=i.leftContainer.height,i.root.width=o.root.offsetWidth,i.background.width=i.root.width-i.borderRootWidth,this.initialDrawDone||(i.scrollbarWidth=c.getScrollBarWidth()),e.verticalScroll?e.rtl?(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth+i.scrollbarWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth+i.scrollbarWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right):(i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right),this._setDOM();var a=this._updateScrollTop();"top"!=e.orientation.item&&(a+=Math.max(i.centerContainer.height-i.center.height-i.border.top-i.border.bottom,0)),o.center.style.top=a+"px";var h=0==i.scrollTop?"hidden":"",d=i.scrollTop==i.scrollTopMin?"hidden":"";o.shadowTop.style.visibility=h,o.shadowBottom.style.visibility=d,o.shadowTopLeft.style.visibility=h,o.shadowBottomLeft.style.visibility=d,o.shadowTopRight.style.visibility=h,o.shadowBottomRight.style.visibility=d,e.verticalScroll&&(o.rightContainer.className="vis-panel vis-right vis-vertical-scroll",o.leftContainer.className="vis-panel vis-left vis-vertical-scroll",o.shadowTopRight.style.visibility="hidden",o.shadowBottomRight.style.visibility="hidden",o.shadowTopLeft.style.visibility="hidden",o.shadowBottomLeft.style.visibility="hidden",o.left.style.top="0px",o.right.style.top="0px"),(!e.verticalScroll||i.center.height<i.centerContainer.height)&&(o.left.style.top=a+"px",o.right.style.top=a+"px",o.rightContainer.className=o.rightContainer.className.replace(new RegExp("(?:^|\\s)vis-vertical-scroll(?:\\
19284s|$)")," "),o.leftContainer.className=o.leftContainer.className.replace(new RegExp("(?:^|\\s)vis-vertical-scroll(?:\\s|$)")," "),i.left.width=o.leftContainer.clientWidth||-i.border.left,i.right.width=o.rightContainer.clientWidth||-i.border.right,this._setDOM());var u=i.center.height>i.centerContainer.height;this.hammer.get("pan").set({direction:u?l.DIRECTION_ALL:l.DIRECTION_HORIZONTAL}),this.components.forEach(function(e){t=e.redraw()||t});if(t){if(this.redrawCount<5)return void this.body.emitter.emit("_change");console.log("WARNING: infinite loop in redraw?")}else this.redrawCount=0;this.body.emitter.emit("changed")}},n.prototype._setDOM=function(){var t=this.props,e=this.dom;t.leftContainer.width=t.left.width,t.rightContainer.width=t.right.width;var i=t.root.width-t.left.width-t.right.width-t.borderRootWidth;t.center.width=i,t.centerContainer.width=i,t.top.width=i,t.bottom.width=i,e.background.style.height=t.background.height+"px",e.backgroundVertical.style.height=t.background.height+"px",e.backgroundHorizontal.style.height=t.centerContainer.height+"px",e.centerContainer.style.height=t.centerContainer.height+"px",e.leftContainer.style.height=t.leftContainer.height+"px",e.rightContainer.style.height=t.rightContainer.height+"px",e.background.style.width=t.background.width+"px",e.backgroundVertical.style.width=t.centerContainer.width+"px",e.backgroundHorizontal.style.width=t.background.width+"px",e.centerContainer.style.width=t.center.width+"px",e.top.style.width=t.top.width+"px",e.bottom.style.width=t.bottom.width+"px",e.background.style.left="0",e.background.style.top="0",e.backgroundVertical.style.left=t.left.width+t.border.left+"px",e.backgroundVertical.style.top="0",e.backgroundHorizontal.style.left="0",e.backgroundHorizontal.style.top=t.top.height+"px",e.centerContainer.style.left=t.left.width+"px",e.centerContainer.style.top=t.top.height+"px",e.leftContainer.style.left="0",e.leftContainer.style.top=t.top.height+"px",e.rightContainer.style.left=t.left.width+t.center.width+"px",e.rightContainer.style.top=t.top.height+"px",e.top.style.left=t.left.width+"px",e.top.style.top="0",e.bottom.style.left=t.left.width+"px",e.bottom.style.top=t.top.height+t.centerContainer.height+"px",e.center.style.left="0",e.left.style.left="0",e.right.style.left="0"},n.prototype.repaint=function(){throw new Error("Function repaint is deprecated. Use redraw instead.")},n.prototype.setCurrentTime=function(t){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");this.currentTime.setCurrentTime(t)},n.prototype.getCurrentTime=function(){if(!this.currentTime)throw new Error("Option showCurrentTime must be true");return this.currentTime.getCurrentTime()},n.prototype._toTime=function(t){return m.toTime(this,t,this.props.center.width)},n.prototype._toGlobalTime=function(t){return m.toTime(this,t,this.props.root.width)},n.prototype._toScreen=function(t){return m.toScreen(this,t,this.props.center.width)},n.prototype._toGlobalScreen=function(t){return m.toScreen(this,t,this.props.root.width)},n.prototype._initAutoResize=function(){1==this.options.autoResize?this._startAutoResize():this._stopAutoResize()},n.prototype._startAutoResize=function(){var t=this;this._stopAutoResize(),this._onResize=function(){if(1!=t.options.autoResize)return void t._stopAutoResize();t.dom.root&&(t.dom.root.offsetWidth==t.props.lastWidth&&t.dom.root.offsetHeight==t.props.lastHeight||(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight,t.props.scrollbarWidth=c.getScrollBarWidth(),t.body.emitter.emit("_change")))},c.addEventListener(window,"resize",this._onResize),t.dom.root&&(t.props.lastWidth=t.dom.root.offsetWidth,t.props.lastHeight=t.dom.root.offsetHeight),this.watchTimer=setInterval(this._onResize,1e3)},n.prototype._stopAutoResize=function(){this.watchTimer&&(clearInterval(this.watchTimer),this.watchTimer=void 0),this._onResize&&(c.removeEventListener(window,"resize",this._onResize),this._onResize=null)},n.prototype._onTouch=function(t){this.touch.allowDragging=!0,this.touch.initialScrollTop=this.props.scrollTop},n.prototype._onPinch=function(t){this.touch.allowDragging=!1},n.prototype._onDrag=function(t){if(t&&this.touch.allowDragging){var e=t.deltaY,i=this._getScrollTop(),o=this._setScrollTop(this.touch.initialScrollTop+e);this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),o!=i&&this.emit
19284("verticalDrag")}},n.prototype._setScrollTop=function(t){return this.props.scrollTop=t,this._updateScrollTop(),this.props.scrollTop},n.prototype._updateScrollTop=function(){var t=Math.min(this.props.centerContainer.height-this.props.center.height,0);return t!=this.props.scrollTopMin&&("top"!=this.options.orientation.item&&(this.props.scrollTop+=t-this.props.scrollTopMin),this.props.scrollTopMin=t),this.props.scrollTop>0&&(this.props.scrollTop=0),this.props.scrollTop<t&&(this.props.scrollTop=t),this.options.verticalScroll&&(this.dom.left.parentNode.scrollTop=-this.props.scrollTop,this.dom.right.parentNode.scrollTop=-this.props.scrollTop),this.props.scrollTop},n.prototype._getScrollTop=function(){return this.props.scrollTop},n.prototype._createConfigurator=function(){throw new Error("Cannot invoke abstract method _createConfigurator")},t.exports=n},function(t,e,i){function o(t,e,i,s,r){this.moment=n,this.current=this.moment(),this._start=this.moment(),this._end=this.moment(),this.autoScale=!0,this.scale="day",this.step=1,this.setRange(t,e,i),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,Array.isArray(s)?this.hiddenDates=s:this.hiddenDates=void 0!=s?[s]:[],this.format=o.FORMAT,this.options=r||{}}var n=i(9),s=i(36),r=i(2);o.FORMAT={minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",week:"w",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",week:"MMMM YYYY",month:"YYYY",year:""}},o.prototype.setMoment=function(t){this.moment=t,this.current=this.moment(this.current.valueOf()),this._start=this.moment(this._start.valueOf()),this._end=this.moment(this._end.valueOf())},o.prototype.setFormat=function(t){var e=r.deepExtend({},o.FORMAT);this.format=r.deepExtend(e,t)},o.prototype.setRange=function(t,e,i){if(!(t instanceof Date&&e instanceof Date))throw"No legal start or end date in method setRange";this._start=void 0!=t?this.moment(t.valueOf()):new Date,this._end=void 0!=e?this.moment(e.valueOf()):new Date,this.autoScale&&this.setMinimumStep(i)},o.prototype.start=function(){this.current=this._start.clone(),this.roundToMinor()},o.prototype.roundToMinor=function(){switch("week"==this.scale&&this.current.weekday(0),this.scale){case"year":this.current.year(this.step*Math.floor(this.current.year()/this.step)),this.current.month(0);case"month":this.current.date(1);case"week":case"day":case"weekday":this.current.hours(0);case"hour":this.current.minutes(0);case"minute":this.current.seconds(0);case"second":this.current.milliseconds(0)}if(1!=this.step)switch(this.scale){case"millisecond":this.current.subtract(this.current.milliseconds()%this.step,"milliseconds");break;case"second":this.current.subtract(this.current.seconds()%this.step,"seconds");break;case"minute":this.current.subtract(this.current.minutes()%this.step,"minutes");break;case"hour":this.current.subtract(this.current.hours()%this.step,"hours");break;case"weekday":case"day":this.current.subtract((this.current.date()-1)%this.step,"day");break;case"week":this.current.subtract(this.current.week()%this.step,"week");break;case"month":this.current.subtract(this.current.month()%this.step,"month");break;case"year":this.current.subtract(this.current.year()%this.step,"year")}},o.prototype.hasNext=function(){return this.current.valueOf()<=this._end.valueOf()},o.prototype.next=function(){var t=this.current.valueOf();switch(this.scale){case"millisecond":this.current.add(this.step,"millisecond");break;case"second":this.current.add(this.step,"second");break;case"minute":this.current.add(this.step,"minute");break;case"hour":this.current.add(this.step,"hour"),this.current.month()<6?this.current.subtract(this.current.hours()%this.step,"hour"):this.current.hours()%this.step!=0&&this.current.add(this.step-this.current.hours()%this.step,"hour");break;case"weekday":case"day":this.current.add(this.step,"day");break;case"week":if(0!==this.current.weekday())this.current.weekday(0),this.current.add(this.step,"week");else if(!1===this.options.showMajorLabels)this.current.add(this.step,"week");else{var e=this.current.clone();e.add(1,"week"),e.isSame(this.current,"month")?this.current.add(this.step,"week"):(this.current.add(this.step,"week"),this.current.date(1))}break;case"month":this.current.add(this.step,"month");break;case"year":this.current.add(this.step,"year")}if(1!=this.step)switch(this.scale){case"millisecond":this.current.milliseconds()>0&&this.current.milliseconds()<this.step&&this.current.milliseconds(0);break;case"second":this.current.seconds()>0&&this.current.seconds()<this.step&&this.current.seconds(0);break;case"minute":this.current.minutes()>0&&this.current.minutes()<this.step&&this.current.minutes(0);break;case"hour":this.current.hours()>0&&this.current.hours()<this.step&&this.current.hours(0);break;case"weekday":case"day":this.current.date()<this.step+1&&this.current.date(1);break;case"week":this.current.week()<this.step&&this.current.week(1);break;case"month":this.current.month()<this.step&&this.current.month(0)}this.current.valueOf()==t&&(this.current=this._end.clone()),this.switchedDay=!1,this.switchedMonth=!1,this.switchedYear=!1,s.stepOverHiddenDates(this.moment,this,t)},o.prototype.getCurrent=function(){return this.current},o.prototype.setScale=function(t){t&&"string"==typeof t.scale&&(this.scale=t.scale,this.step=t.step>0?t.step:1,this.autoScale=!1)},o.prototype.setAutoScale=function(t){this.autoScale=t},o.prototype.setMinimumStep=function(t){if(void 0!=t){31104e9>t&&(this.scale="year",this.step=1e3),15552e9>t&&(this.scale="year",this.step=500),31104e8>t&&(this.scale="year",this.step=100),15552e8>t&&(this.scale="year",this.step=50),31104e7>t&&(this.scale="year",this.step=10),15552e7>t&&(this.scale="year",this.step=5),31104e6>t&&(this.scale="year",this.step=1),7776e6>t&&(this.scale="month",this.step=3),2592e6>t&&(this.scale="month",this.step=1),432e6>t&&(this.scale="day",this.step=5),1728e5>t&&(this.scale="day",this.step=2),864e5>t&&(this.scale="day",this.step=1),432e5>t&&(this.scale="weekday",this.step=1),144e5>t&&(this.scale="hour",this.step=4),36e5>t&&(this.scale="hour",this.step=1),9e5>t&&(this.scale="minute",this.step=15),6e5>t&&(this.scale="minute",this.step=10),3e5>t&&(this.scale="minute",this.step=5),6e4>t&&(this.scale="minute",this.step=1),15e3>t&&(this.scale="second",this.step=15),1e4>t&&(this.scale="second",this.step=10),5e3>t&&(this.scale="second",this.step=5),1e3>t&&(this.scale="second",this.step=1),200>t&&(this.scale="millisecond",this.step=200),100>t&&(this.scale="millisecond",this.step=100),50>t&&(this.scale="millisecond",this.step=50),10>t&&(this.scale="millisecond",this.step=10),5>t&&(this.scale="millisecond",this.step=5),1>t&&(this.scale="millisecond",this.step=1)}}
19284,o.snap=function(t,e,i){var o=n(t);if("year"==e){var s=o.year()+Math.round(o.month()/12);o.year(Math.round(s/i)*i),o.month(0),o.date(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("month"==e)o.date()>15?(o.date(1),o.add(1,"month")):o.date(1),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("week"==e)o.weekday()>2?(o.weekday(0),o.add(1,"week")):o.weekday(0),o.hours(0),o.minutes(0),o.seconds(0),o.milliseconds(0);else if("day"==e){switch(i){case 5:case 2:o.hours(24*Math.round(o.hours()/24));break;default:o.hours(12*Math.round(o.hours()/12))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("weekday"==e){switch(i){case 5:case 2:o.hours(12*Math.round(o.hours()/12));break;default:o.hours(6*Math.round(o.hours()/6))}o.minutes(0),o.seconds(0),o.milliseconds(0)}else if("hour"==e){switch(i){case 4:o.minutes(60*Math.round(o.minutes()/60));break;default:o.minutes(30*Math.round(o.minutes()/30))}o.seconds(0),o.milliseconds(0)}else if("minute"==e){switch(i){case 15:case 10:o.minutes(5*Math.round(o.minutes()/5)),o.seconds(0);break;case 5:o.seconds(60*Math.round(o.seconds()/60));break;default:o.seconds(30*Math.round(o.seconds()/30))}o.milliseconds(0)}else if("second"==e)switch(i){case 15:case 10:o.seconds(5*Math.round(o.seconds()/5)),o.milliseconds(0);break;case 5:o.milliseconds(1e3*Math.round(o.milliseconds()/1e3));break;default:o.milliseconds(500*Math.round(o.milliseconds()/500))}else if("millisecond"==e){var r=i>5?i/2:1;o.milliseconds(Math.round(o.milliseconds()/r)*r)}return o},o.prototype.isMajor=function(){if(1==this.switchedYear)switch(this.scale){case"year":case"month":case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedMonth)switch(this.scale){case"week":case"weekday":case"day":case"hour":case"minute":case"second":case"millisecond":return!0;default:return!1}else if(1==this.switchedDay)switch(this.scale){case"millisecond":case"second":case"minute":case"hour":return!0;default:return!1}var t=this.moment(this.current);switch(this.scale){case"millisecond":return 0==t.milliseconds();case"second":return 0==t.seconds();case"minute":return 0==t.hours()&&0==t.minutes();case"hour":return 0==t.hours();case"weekday":case"day":case"week":return 1==t.date();case"month":return 0==t.month();case"year":default:return!1}},o.prototype.getLabelMinor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.minorLabels)return this.format.minorLabels(t,this.scale,this.step);var e=this.format.minorLabels[this.scale];switch(this.scale){case"week":if(this.isMajor()&&0!==t.weekday())return"";default:return e&&e.length>0?this.moment(t).format(e):""}},o.prototype.getLabelMajor=function(t){if(void 0==t&&(t=this.current),t instanceof Date&&(t=this.moment(t)),"function"==typeof this.format.majorLabels)return this.format.majorLabels(t,this.scale,this.step);var e=this.format.majorLabels[this.scale];return e&&e.length>0?this.moment(t).format(e):""},o.prototype.getClassName=function(){function t(t){return t/a%2==0?" vis-even":" vis-odd"}function e(t){return t.isSame(new Date,"day")?" vis-today":t.isSame(n().add(1,"day"),"day")?" vis-tomorrow":t.isSame(n().add(-1,"day"),"day")?" vis-yesterday":""}function i(t){return t.isSame(new Date,"week")?" vis-current-week":""}function o(t){return t.isSame(new Date,"month")?" vis-current-month":""}var n=this.moment,s=this.moment(this.current),r=s.locale?s.locale("en"):s.lang("en"),a=this.step,h=[];switch(this.scale){case"millisecond":h.push(e(r)),h.push(t(r.milliseconds()));break;case"second":h.push(e(r)),h.push(t(r.seconds()));break;case"minute":h.push(e(r)),h.push(t(r.minutes()));break;case"hour":h.push("vis-h"+r.hours()+(4==this.step?"-h"+(r.hours()+4):"")),h.push(e(r)),h.push(t(r.hours()));break;case"weekday":h.push("vis-"+r.format("dddd").toLowerCase()),h.push(e(r)),h.push(i(r)),h.push(t(r.date()));break;case"day":h.push("vis-day"+r.date()),h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(e(r)),h.push(o(r)),h.push(this.step<=2?e(r):""),h.push(this.step<=2?"vis-"
19284+r.format("dddd").toLowerCase():""), 19285 h.push(t(r.date()-1));break;case"week":h.push("vis-week"+r.format("w")),h.push(i(r)),h.push(t(r.week()));break;case"month":h.push("vis-"+r.format("MMMM").toLowerCase()),h.push(o(r)),h.push(t(r.month()));break;case"year":h.push("vis-year"+r.year()),h.push(function(t){return t.isSame(new Date,"year")?" vis-current-year":""}(r)),h.push(t(r.year()))}return h.filter(String).join(" ")},t.exports=o},function(t,e,i){function o(t,e){this.body=t,this.defaultOptions={rtl:!1,showCurrentTime:!0,moment:r,locales:a,locale:"en"},this.options=n.extend({},this.defaultOptions),this.offset=0,this._create(),this.setOptions(e)}var n=i(2),s=i(16),r=i(9),a=i(98);o.prototype=new s,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-current-time",t.style.position="absolute",t.style.top="0px",t.style.height="100%",this.bar=t},o.prototype.destroy=function(){this.options.showCurrentTime=!1,this.redraw(),this.body=null},o.prototype.setOptions=function(t){t&&n.selectiveExtend(["rtl","showCurrentTime","moment","locale","locales"],this.options,t)},o.prototype.redraw=function(){if(this.options.showCurrentTime){var t=this.body.dom.backgroundVertical;this.bar.parentNode!=t&&(this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),t.appendChild(this.bar),this.start());var e=this.options.moment((new Date).valueOf()+this.offset),i=this.body.util.toScreen(e),o=this.options.locales[this.options.locale];o||(this.warned||(console.log("WARNING: options.locales['"+this.options.locale+"'] not found. See http://visjs.org/docs/timeline/#Localization"),this.warned=!0),o=this.options.locales.en);var n=o.current+" "+o.time+": "+e.format("dddd, MMMM Do YYYY, H:mm:ss");n=n.charAt(0).toUpperCase()+n.substring(1),this.options.rtl?this.bar.style.right=i+"px":this.bar.style.left=i+"px",this.bar.title=n}else this.bar.parentNode&&this.bar.parentNode.removeChild(this.bar),this.stop();return!1},o.prototype.start=function(){function t(){e.stop();var i=e.body.range.conversion(e.body.domProps.center.width).scale,o=1/i/10;o<30&&(o=30),o>1e3&&(o=1e3),e.redraw(),e.body.emitter.emit("currentTimeTick"),e.currentTimeTimer=setTimeout(t,o)}var e=this;t()},o.prototype.stop=function(){void 0!==this.currentTimeTimer&&(clearTimeout(this.currentTimeTimer),delete this.currentTimeTimer)},o.prototype.setCurrentTime=function(t){var e=n.convert(t,"Date").valueOf(),i=(new Date).valueOf();this.offset=e-i,this.redraw()},o.prototype.getCurrentTime=function(){return new Date((new Date).valueOf()+this.offset)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.groupId=t,this.subgroups={},this.subgroupStack={},this.subgroupStackAll=!1,this.doInnerStack=!1,this.subgroupIndex=0,this.subgroupOrderer=e&&e.subgroupOrder,this.itemSet=i,this.isVisible=null,this.stackDirty=!0,e&&e.nestedGroups&&(this.nestedGroups=e.nestedGroups,0==e.showNested?this.showNested=!1:this.showNested=!0),e&&e.subgroupStack)if("boolean"==typeof e.subgroupStack)this.doInnerStack=e.subgroupStack,this.subgroupStackAll=e.subgroupStack;else for(var o in e.subgroupStack)this.subgroupStack[o]=e.subgroupStack[o],this.doInnerStack=this.doInnerStack||e.subgroupStack[o];this.nestedInGroup=null,this.dom={},this.props={label:{width:0,height:0}},this.className=null,this.items={},this.visibleItems=[],this.itemsInRange=[],this.orderedItems={byStart:[],byEnd:[]},this.checkRangedItems=!1;var n=this;this.itemSet.body.emitter.on("checkRangedItems",function(){n.checkRangedItems=!0}),this._create(),this.setData(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(100);o.prototype._create=function(){var t=document.createElement("div");this.itemSet.options.groupEditable.order?t.className="vis-label draggable":t.className="vis-label",this.dom.label=t;var e=document.createElement("div");e.className="vis-inner",t.appendChild(e),this.dom.inner=e;var i=document.createElement("div");i.className="vis-group",i["timeline-group"]=this,this.dom.foreground=i,this.dom.background=document.createElement("div"),this.dom.background.className="vis-group",this.dom.axis=document.createElement("div"),this.dom.axis.className="vis-group",this.dom.marker=document.createElement("div"),this.dom.marker.style.visibility="hidden",this.dom.marker.style.position="absolute",this.dom.marker.innerHTML="",this.dom.background.appendChild(this.dom.marker)},o.prototype.setData=function(t){var e,i;if(this.itemSet.options&&this.itemSet.options.groupTemplate?(i=this.itemSet.options.groupTemplate.bind(this),e=i(t,this.dom.inner)):e=t&&t.content,e instanceof Element){for(this.dom.inner.appendChild(e);this.dom.inner.firstChild;)this.dom.inner.removeChild(this.dom.inner.firstChild);this.dom.inner.appendChild(e)}else e instanceof Object?i(t,this.dom.inner):this.dom.inner.innerHTML=void 0!==e&&null!==e?e:this.groupId||"";if(this.dom.label.title=t&&t.title||"",this.dom.inner.firstChild?r.removeClassName(this.dom.inner,"vis-hidden"):r.addClassName(this.dom.inner,"vis-hidden"),t&&t.nestedGroups){this.nestedGroups&&this.nestedGroups==t.nestedGroups||(this.nestedGroups=t.nestedGroups),void 0===t.showNested&&void 0!==this.showNested||(0==t.showNested?this.showNested=!1:this.showNested=!0),r.addClassName(this.dom.label,"vis-nesting-group");var o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed";this.showNested?(r.removeClassName(this.dom.label,o),r.addClassName(this.dom.label,"expanded")):(r.removeClassName(this.dom.label,"expanded"),r.addClassName(this.dom.label,o))}else this.nestedGroups&&(this.nestedGroups=null,o=this.itemSet.options.rtl?"collapsed-rtl":"collapsed",r.removeClassName(this.dom.label,o),r.removeClassName(this.dom.label,"expanded"),r.removeClassName(this.dom.label,"vis-nesting-group"));t&&t.nestedInGroup&&(r.addClassName(this.dom.label,"vis-nested-group"),this.itemSet.options&&this.itemSet.options.rtl?this.dom.inner.style.paddingRight="30px":this.dom.inner.style.paddingLeft="30px");var n=t&&t.className||null;n!=this.className&&(this.className&&(r.removeClassName(this.dom.label,this.className),r.removeClassName(this.dom.foreground,this.className),r.removeClassName(this.dom.background,this.className),r.removeClassName(this.dom.axis,this.className)),r.addClassName(this.dom.label,n),r.addClassName(this.dom.foreground,n),r.addClassName(this.dom.background,n),r.addClassName(this.dom.axis,n),this.className=n),this.style&&(r.removeCssText(this.dom.label,this.style),this.style=null),t&&t.style&&(r.addCssText(this.dom.label,t.style),this.style=t.style)},o.prototype.getLabelWidth=function(){return this.props.label.width}
19285,o.prototype._didMarkerHeightChange=function(){var t=this.dom.marker.clientHeight;if(t!=this.lastMarkerHeight){this.lastMarkerHeight=t;var e={},i=0;r.forEach(this.items,function(t,o){if(t.dirty=!0,t.displayed){e[o]=t.redraw(!0),i=e[o].length}});if(i>0)for(var o=0;o<i;o++)r.forEach(e,function(t){t[o]()});return!0}},o.prototype._calculateGroupSizeAndPosition=function(){var t=this.dom.foreground.offsetTop,e=this.dom.foreground.offsetLeft,i=this.dom.foreground.offsetWidth;this.top=t,this.right=e,this.width=i},o.prototype._redrawItems=function(t,e,i,o){if(t||this.stackDirty||this.isVisible&&!e){var n={},s=null;if("function"==typeof this.itemSet.options.order){var h=this,d={},l=0;if(r.forEach(this.items,function(t,e){t.displayed||(d[e]=t.redraw(!0),l=d[e].length,h.visibleItems.push(t))}),l>0)for(var u=0;u<l;u++)r.forEach(d,function(t){t[u]()});if(r.forEach(this.items,function(t){t.repositionX(!1)}),this.doInnerStack&&this.itemSet.options.stackSubgroups){for(s in this.subgroups)n[s]=this.subgroups[s].items.slice().sort(function(t,e){return h.itemSet.options.order(t.data,e.data)});a.stackSubgroupsWithInnerStack(n,i,this.subgroups)}else{var c=this.orderedItems.byStart.slice().sort(function(t,e){return h.itemSet.options.order(t.data,e.data)});a.stack(c,i,!0)}this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,o)}else if(this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,o),this.itemSet.options.stack)if(this.doInnerStack&&this.itemSet.options.stackSubgroups){for(s in this.subgroups)n[s]=this.subgroups[s].items;a.stackSubgroupsWithInnerStack(n,i,this.subgroups)}else a.stack(this.visibleItems,i,!0);else a.nostack(this.visibleItems,i,this.subgroups,this.itemSet.options.stackSubgroups);this.stackDirty=!1}},o.prototype._didResize=function(t,e){t=r.updateProperty(this,"height",e)||t;var i=this.dom.inner.clientWidth,o=this.dom.inner.clientHeight;return t=r.updateProperty(this.props.label,"width",i)||t,t=r.updateProperty(this.props.label,"height",o)||t},o.prototype._applyGroupHeight=function(t){this.dom.background.style.height=t+"px",this.dom.foreground.style.height=t+"px",this.dom.label.style.height=t+"px"},o.prototype._updateItemsVerticalPosition=function(t){for(var e=0,i=this.visibleItems.length;e<i;e++){var o=this.visibleItems[e];o.repositionY(t),this.isVisible||"__background__"==this.groupId||o.displayed&&o.hide()}},o.prototype.redraw=function(t,e,i,o){var n,s=!1,r=this.isVisible,a=[function(){i=this._didMarkerHeightChange.bind(this)}.bind(this),this._updateSubGroupHeights.bind(this,e),this._calculateGroupSizeAndPosition.bind(this),function(){this.isVisible=this._isGroupVisible.bind(this)(t,e)}.bind(this),function(){this._redrawItems.bind(this)(i,r,e,t)}.bind(this),this._updateSubgroupsSizes.bind(this),function(){n=this._calculateHeight.bind(this)(e)}.bind(this),this._calculateGroupSizeAndPosition.bind(this),function(){s=this._didResize.bind(this)(s,n)}.bind(this),function(){this._applyGroupHeight.bind(this)(n)}.bind(this),function(){this._updateItemsVerticalPosition.bind(this)(e)}.bind(this),function(){return!this.isVisible&&this.height&&(s=!1),s}];if(o)return a;var h;return a.forEach(function(t){h=t()}),h},o.prototype._updateSubGroupHeights=function(t){if((0,s.default)(this.subgroups).length>0){var e=this;this.resetSubgroups(),r.forEach(this.visibleItems,function(i){void 0!==i.data.subgroup&&(e.subgroups[i.data.subgroup].height=Math.max(e.subgroups[i.data.subgroup].height,i.height+t.item.vertical),e.subgroups[i.data.subgroup].visible=!0)})}},o.prototype._isGroupVisible=function(t,e){return this.top<=t.body.domProps.centerContainer.height-t.body.domProps.scrollTop+e.axis&&this.top+this.height+e.axis>=-t.body.domProps.scrollTop},o.prototype._calculateHeight=function(t){var e,i=this.visibleItems;if(i.length>0){var o=i[0].top,n=i[0].top+i[0].height;if(r.forEach(i,function(t){o=Math.min(o,t.top),n=Math.max(n,t.top+t.height)}),o>t.axis){var s=o-t.axis;n-=s,r.forEach(i,function(t){t.top-=s})}e=n+t.item.vertical/2}else e=0;return e=Math.max(e,this.props.label.height)},o.prototype.show=function(){this.dom.label.parentNode||this.itemSet.dom.labelSet.appendChild(this.dom.label),this.dom.foreground.parentNode||this.itemSet.dom.foreground.appendChild(this.dom.foreground),this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background),this.dom.axis.parentNode||this.itemSet.dom.axis.appendChild(this.dom.axis)},o.prototype.hide=function(){var t=this.dom.label;t.parentNode&&t.parentNode.removeChild(t);var e=this.dom.foreground;e.parentNode&&e.parentNode.removeChild(e);var i=this.dom.background;i.parentNode&&i.parentNode.removeChild(i);var o=this.dom.axis;o.parentNode&&o.parentNode.removeChild(o)},o.prototype.add=function(t){if(this.items[t.id]=t,t.setParent(this),this.stackDirty=!0,void 0!==t.data.subgroup&&(this._addToSubgroup(t),this.orderSubgroups()),-1==this.visibleItems.indexOf(t)){var e=this.itemSet.body.range;this._checkIfVisible(t,this.visibleItems,e)}},o.prototype._addToSubgroup=function(t,e){e=e||t.data.subgroup,void 0!=e&&void 0===this.subgroups[e]&&(this.subgroups[e]={height:0,top:0,start:t.data.start,end:t.data.end||t.data.start,visible:!1,index:this.subgroupIndex,items:[],stack:this.subgroupStackAll||this.subgroupStack[e]||!1},this.subgroupIndex++),new Date(t.data.start)<new Date(this.subgroups[e].start)&&(this.subgroups[e].start=t.data.start);var i=t.data.end||t.data.start;new Date(i)>new Date(this.subgroups[e].end)&&(this.subgroups[e].end=i),this.subgroups[e].items.push(t)},o.prototype._updateSubgroupsSizes=function(){var t=this;if(t.subgroups)for(var e in t.subgroups){var i=t.subgroups[e].items[0].data.end||t.subgroups[e].items[0].data.start,o=t.subgroups[e].items[0].data.start,n=i-1;
19285t.subgroups[e].items.forEach(function(t){new Date(t.data.start)<new Date(o)&&(o=t.data.start);var e=t.data.end||t.data.start;new Date(e)>new Date(n)&&(n=e)}),t.subgroups[e].start=o,t.subgroups[e].end=new Date(n-1)}},o.prototype.orderSubgroups=function(){if(void 0!==this.subgroupOrderer){var t,e=[];if("string"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push({subgroup:t,sortField:this.subgroups[t].items[0].data[this.subgroupOrderer]});e.sort(function(t,e){return t.sortField-e.sortField})}else if("function"==typeof this.subgroupOrderer){for(t in this.subgroups)e.push(this.subgroups[t].items[0].data);e.sort(this.subgroupOrderer)}if(e.length>0)for(var i=0;i<e.length;i++)this.subgroups[e[i].subgroup].index=i}},o.prototype.resetSubgroups=function(){for(var t in this.subgroups)this.subgroups.hasOwnProperty(t)&&(this.subgroups[t].visible=!1,this.subgroups[t].height=0)},o.prototype.remove=function(t){delete this.items[t.id],t.setParent(null),this.stackDirty=!0;var e=this.visibleItems.indexOf(t);-1!=e&&this.visibleItems.splice(e,1),void 0!==t.data.subgroup&&(this._removeFromSubgroup(t),this.orderSubgroups())},o.prototype._removeFromSubgroup=function(t,e){if(void 0!=(e=e||t.data.subgroup)){var i=this.subgroups[e];if(i){var o=i.items.indexOf(t);o>=0&&(i.items.splice(o,1),i.items.length?this._updateSubgroupsSizes():delete this.subgroups[e])}}},o.prototype.removeFromDataSet=function(t){this.itemSet.removeItem(t.id)},o.prototype.order=function(){for(var t=r.toArray(this.items),e=[],i=[],o=0;o<t.length;o++)void 0!==t[o].data.end&&i.push(t[o]),e.push(t[o]);this.orderedItems={byStart:e,byEnd:i},a.orderByStart(this.orderedItems.byStart),a.orderByEnd(this.orderedItems.byEnd)},o.prototype._updateItemsInRange=function(t,e,i){var o=[],n={},s=(i.end-i.start)/4,a=i.start-s,h=i.end+s,d=function(t){return t<a?-1:t<=h?0:1};if(e.length>0)for(var l=0;l<e.length;l++)this._checkIfVisibleWithReference(e[l],o,n,i);var u=r.binarySearchCustom(t.byStart,d,"data","start");if(this._traceVisible(u,t.byStart,o,n,function(t){return t.data.start<a||t.data.start>h}),1==this.checkRangedItems)for(this.checkRangedItems=!1,l=0;l<t.byEnd.length;l++)this._checkIfVisibleWithReference(t.byEnd[l],o,n,i);else{var c=r.binarySearchCustom(t.byEnd,d,"data","end");this._traceVisible(c,t.byEnd,o,n,function(t){return t.data.end<a||t.data.end>h})}var p={},f=0;for(l=0;l<o.length;l++){var m=o[l];if(!m.displayed){p[l]=m.redraw(!0),f=p[l].length}}if(f>0)for(var v=0;v<f;v++)r.forEach(p,function(t){t[v]()});for(l=0;l<o.length;l++)o[l].repositionX();return o},o.prototype._traceVisible=function(t,e,i,o,n){if(-1!=t){var s,r;for(s=t;s>=0&&(r=e[s],!n(r));s--)void 0===o[r.id]&&(o[r.id]=!0,i.push(r));for(s=t+1;s<e.length&&(r=e[s],!n(r));s++)void 0===o[r.id]&&(o[r.id]=!0,i.push(r))}},o.prototype._checkIfVisible=function(t,e,i){t.isVisible(i)?(t.displayed||t.show(),t.repositionX(),e.push(t)):t.displayed&&t.hide()},o.prototype._checkIfVisibleWithReference=function(t,e,i,o){t.isVisible(o)?void 0===i[t.id]&&(i[t.id]=!0,e.push(t)):t.displayed&&t.hide()},o.prototype.changeSubgroup=function(t,e,i){this._removeFromSubgroup(t,e),this._addToSubgroup(t,i),this.orderSubgroups()},t.exports=o},function(t,e,i){function o(t,e,i){r.call(this,t,e,i),this.width=0,this.height=0,this.top=0,this.left=0}var n=i(29),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(68);o.prototype=(0,s.default)(r.prototype),o.prototype.redraw=function(t,e,i){this.visibleItems=this._updateItemsInRange(this.orderedItems,this.visibleItems,t),this.width=this.dom.background.offsetWidth,this.dom.background.style.height="0";for(var o=0,n=this.visibleItems.length;o<n;o++){this.visibleItems[o].repositionY(e)}return!1},o.prototype.show=function(){this.dom.background.parentNode||this.itemSet.dom.background.appendChild(this.dom.background)},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,this.options=i,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.baseClassName="vis-item vis-range",o.prototype.isVisible=function(t){return this.data.start<t.end&&this.data.end>t.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.visibleFrame=document.createElement("div"),this.dom.visibleFrame.className="vis-item-visible-frame",this.dom.box.appendChild(this.dom.visibleFrame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className=this.baseClassName+e,this.dom.content.style.maxWidth="none"}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.frame).overflow,{content:{width:this.dom.content.offsetWidth},box:{height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=t.box.height,this.dom.content.style.maxWidth="",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDeleteButton(this.dom.box),this._repaintDragCenter(),this._repaintDragLeft(),this._repaintDragRight()},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;
19285return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom.box;t.parentNode&&t.parentNode.removeChild(t),this.displayed=!1}},o.prototype.repositionX=function(t){var e,i,o=this.parent.width,n=this.conversion.toScreen(this.data.start),s=this.conversion.toScreen(this.data.end),r=void 0===this.data.align?this.options.align:this.data.align;!1===this.data.limitSize||void 0!==t&&!0!==t||(n<-o&&(n=-o),s>2*o&&(s=2*o));var a=Math.max(s-n+.5,1);switch(this.overflow?(this.options.rtl?this.right=n:this.left=n,this.width=a+this.props.content.width,i=this.props.content.width):(this.options.rtl?this.right=n:this.left=n,this.width=a,i=Math.min(s-n,this.props.content.width)),this.options.rtl?this.dom.box.style.right=this.right+"px":this.dom.box.style.left=this.left+"px",this.dom.box.style.width=a+"px",r){case"left":this.options.rtl?this.dom.content.style.right="0":this.dom.content.style.left="0";break;case"right":this.options.rtl?this.dom.content.style.right=Math.max(a-i,0)+"px":this.dom.content.style.left=Math.max(a-i,0)+"px";break;case"center":this.options.rtl?this.dom.content.style.right=Math.max((a-i)/2,0)+"px":this.dom.content.style.left=Math.max((a-i)/2,0)+"px";break;default:e=this.overflow?s>0?Math.max(-n,0):-i:n<0?-n:0,this.options.rtl?this.dom.content.style.right=e+"px":(this.dom.content.style.left=e+"px",this.dom.content.style.width="calc(100% - "+e+"px)")}},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype._repaintDragLeft=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragLeft){var t=document.createElement("div");t.className="vis-drag-left",t.dragLeftItem=this,this.dom.box.appendChild(t),this.dom.dragLeft=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragLeft||(this.dom.dragLeft.parentNode&&this.dom.dragLeft.parentNode.removeChild(this.dom.dragLeft),this.dom.dragLeft=null)},o.prototype._repaintDragRight=function(){if((this.selected||this.options.itemsAlwaysDraggable.range)&&this.options.editable.updateTime&&!this.dom.dragRight){var t=document.createElement("div");t.className="vis-drag-right",t.dragRightItem=this,this.dom.box.appendChild(t),this.dom.dragRight=t}else this.selected||this.options.itemsAlwaysDraggable.range||!this.dom.dragRight||(this.dom.dragRight.parentNode&&this.dom.dragRight.parentNode.removeChild(this.dom.dragRight),this.dom.dragRight=null)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(179).default,f=function(){function t(e,i,o){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:1;(0,d.default)(this,t),this.parent=e,this.changedOptions=[],this.container=i,this.allowCreation=!1,this.options={},this.initialized=!1,this.popupCounter=0,this.defaultOptions={enabled:!1,filter:!0,container:void 0,showButton:!0},c.extend(this.options,this.defaultOptions),this.configureOptions=o,this.moduleOptions={},this.domElements=[],this.popupDiv={},this.popupLimit=5,this.popupHistory={},this.colorPicker=new p(n),this.wrapper=void 0}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){this.popupHistory={},this._removePopup();var e=!0;"string"==typeof t?this.options.filter=t:t instanceof Array?this.options.filter=t.join():"object"===(void 0===t?"undefined":(0,a.default)(t))?(void 0!==t.container&&(this.options.container=t.container),void 0!==t.filter&&(this.options.filter=t.filter),void 0!==t.showButton&&(this.options.showButton=t.showButton),void 0!==t.enabled&&(e=t.enabled)):"boolean"==typeof t?(this.options.filter=!0,e=t):"function"==typeof t&&(this.options.filter=t,e=!0),!1===this.options.filter&&(e=!1),this.options.enabled=e}this._clean()}},{key:"setModuleOptions",value:function(t){this.moduleOptions=t,!0===this.options.enabled&&(this._clean(),void 0!==this.options.container&&(this.container=this.options.container),this._create())}},{key:"_create",value:function(){var t=this;this._clean(),this.changedOptions=[];var e=this.options.filter,i=0,o=!1;for(var n in this.configureOptions)this.configureOptions.hasOwnProperty(n)&&(this.allowCreation=!1,o=!1,"function"==typeof e?(o=e(n,[]),o=o||this._handleObject(this.configureOptions[n],[n],!0)):!0!==e&&-1===e.indexOf(n)||(o=!0),!1!==o&&(this.allowCreation=!0,i>0&&this._makeItem([]),this._makeHeader(n),this._handleObject(this.configureOptions[n],[n])),i++);if(!0===this.options.showButton){var s=document.createElement("div");s.className="vis-configuration vis-config-button",s.innerHTML="generate options",s.onclick=function(){t._printOptions()},s.onmouseover=function(){s.className="vis-configuration vis-config-button hover"},s.onmouseout=function(){s.className="vis-configuration vis-config-button"},this.optionsContainer=document.createElement("div"),this.optionsContainer.className="vis-configuration vis-config-option-container",this.domElements.push(this.optionsContainer),this.domElements.push(s)}this._push()}},{key:"_push",value:function(){this.wrapper=document.createElement("div"),this.wrapper.className="vis-configuration-wrapper",this.container.appendChild(this.wrapper);for(var t=0;t<this.domElements.length;t++)this.wrapper.appendChild(this.domElements[t]);this._showPopupIfNeeded()}},{key:"_clean",value:function(){for(var t=0;t<this.domElements.length;t++)this.wrapper.removeChild(this.domElements[t]);void 0!==this.wrapper&&(this.container.removeChild(this.wrapper),this.wrapper=void 0),this.domElements=[],this._removePopup()}},{key:"_getValue",value:function(t){for(var e=this.moduleOptions,i=0;i<t.length;i++){if(void 0===e[t[i]]){e=void 0;break}e=e[t[i]]}return e}},{key:"_makeItem",value:function(t){if(!0===this.allowCreation){var e=document.createElement("div");e.className="vis-configuration vis-config-item vis-config-s"+t.length;for(var i=arguments.length,o=Array(i>1?i-1:0),n=1;n<i;n++)o[n-1]=arguments[n];return o.forEach(function(t){e.appendChild(t)}),this.domElements.push(e),this.domElements.length}return 0}},{key:"_makeHeader",value:function(t){var e=document.createElement("div");e.className="vis-configuration vis-config-header",e.innerHTML=t,this._makeItem([],e)}},{key:"_makeLabel",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=document.createElement("div");return o.className="vis-configuration vis-config-label vis-config-s"+e.length,o.innerHTML=!0===i?"<i><b>"+t+":</b></i>":t+":",o}}
19285,{key:"_makeDropdown",value:function(t,e,i){var o=document.createElement("select");o.className="vis-configuration vis-config-select";var n=0;void 0!==e&&-1!==t.indexOf(e)&&(n=t.indexOf(e));for(var s=0;s<t.length;s++){var r=document.createElement("option");r.value=t[s],s===n&&(r.selected="selected"),r.innerHTML=t[s],o.appendChild(r)}var a=this;o.onchange=function(){a._update(this.value,i)};var h=this._makeLabel(i[i.length-1],i);this._makeItem(i,h,o)}},{key:"_makeRange",value:function(t,e,i){var o=t[0],n=t[1],s=t[2],r=t[3],a=document.createElement("input");a.className="vis-configuration vis-config-range";try{a.type="range",a.min=n,a.max=s}catch(t){}a.step=r;var h="",d=0;if(void 0!==e){e<0&&1.2*e<n?(a.min=Math.ceil(1.2*e),d=a.min,h="range increased"):e/1.2<n&&(a.min=Math.ceil(e/1.2),d=a.min,h="range increased"),1.2*e>s&&1!==s&&(a.max=Math.ceil(1.2*e),d=a.max,h="range increased"),a.value=e}else a.value=o;var l=document.createElement("input");l.className="vis-configuration vis-config-rangeinput",l.value=a.value;var u=this;a.onchange=function(){l.value=this.value,u._update(Number(this.value),i)},a.oninput=function(){l.value=this.value};var c=this._makeLabel(i[i.length-1],i),p=this._makeItem(i,c,a,l);""!==h&&this.popupHistory[p]!==d&&(this.popupHistory[p]=d,this._setupPopup(h,p))}},{key:"_setupPopup",value:function(t,e){var i=this;if(!0===this.initialized&&!0===this.allowCreation&&this.popupCounter<this.popupLimit){var o=document.createElement("div");o.id="vis-configuration-popup",o.className="vis-configuration-popup",o.innerHTML=t,o.onclick=function(){i._removePopup()},this.popupCounter+=1,this.popupDiv={html:o,index:e}}}},{key:"_removePopup",value:function(){void 0!==this.popupDiv.html&&(this.popupDiv.html.parentNode.removeChild(this.popupDiv.html),clearTimeout(this.popupDiv.hideTimeout),clearTimeout(this.popupDiv.deleteTimeout),this.popupDiv={})}},{key:"_showPopupIfNeeded",value:function(){var t=this;if(void 0!==this.popupDiv.html){var e=this.domElements[this.popupDiv.index],i=e.getBoundingClientRect();this.popupDiv.html.style.left=i.left+"px",this.popupDiv.html.style.top=i.top-30+"px",document.body.appendChild(this.popupDiv.html),this.popupDiv.hideTimeout=setTimeout(function(){t.popupDiv.html.style.opacity=0},1500),this.popupDiv.deleteTimeout=setTimeout(function(){t._removePopup()},1800)}}},{key:"_makeCheckbox",value:function(t,e,i){var o=document.createElement("input");o.type="checkbox",o.className="vis-configuration vis-config-checkbox",o.checked=t,void 0!==e&&(o.checked=e,e!==t&&("object"===(void 0===t?"undefined":(0,a.default)(t))?e!==t.enabled&&this.changedOptions.push({path:i,value:e}):this.changedOptions.push({path:i,value:e})));var n=this;o.onchange=function(){n._update(this.checked,i)};var s=this._makeLabel(i[i.length-1],i);this._makeItem(i,s,o)}},{key:"_makeTextInput",value:function(t,e,i){var o=document.createElement("input");o.type="text",o.className="vis-configuration vis-config-text",o.value=e,e!==t&&this.changedOptions.push({path:i,value:e});var n=this;o.onchange=function(){n._update(this.value,i)};var s=this._makeLabel(i[i.length-1],i);this._makeItem(i,s,o)}},{key:"_makeColorField",value:function(t,e,i){var o=this,n=t[1],s=document.createElement("div");e=void 0===e?n:e,"none"!==e?(s.className="vis-configuration vis-config-colorBlock",s.style.backgroundColor=e):s.className="vis-configuration vis-config-colorBlock none",e=void 0===e?n:e,s.onclick=function(){o._showColorPicker(e,s,i)};var r=this._makeLabel(i[i.length-1],i);this._makeItem(i,r,s)}},{key:"_showColorPicker",value:function(t,e,i){var o=this;e.onclick=function(){},this.colorPicker.insertTo(e),this.colorPicker.show(),this.colorPicker.setColor(t),this.colorPicker.setUpdateCallback(function(t){var n="rgba("+t.r+","+t.g+","+t.b+","+t.a+")";e.style.backgroundColor=n,o._update(n,i)}),this.colorPicker.setCloseCallback(function(){e.onclick=function(){o._showColorPicker(t,e,i)}})}},{key:"_handleObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=!1,n=this.options.filter,s=!1;for(var r in t)if(t.hasOwnProperty(r)){o=!0;var a=t[r],h=c.copyAndExtendArray(e,r);if("function"==typeof n&&!1===(o=n(r,e))&&!(a instanceof Array)&&"string"!=typeof a&&"boolean"!=typeof a&&a instanceof Object&&(this.allowCreation=!1,o=this._handleObject(a,h,!0),this.allowCreation=!1===i),!1!==o){s=!0;var d=this._getValue(h);if(a instanceof Array)this._handleArray(a,d,h);else if("string"==typeof a)this._makeTextInput(a,d,h);else if("boolean"==typeof a)this._makeCheckbox(a,d,h);else if(a instanceof Object){var l=!0;if(-1!==e.indexOf("physics")&&this.moduleOptions.physics.solver!==r&&(l=!1),!0===l)if(void 0!==a.enabled){var u=c.
19285copyAndExtendArray(h,"enabled"),p=this._getValue(u);if(!0===p){var f=this._makeLabel(r,h,!0);this._makeItem(h,f),s=this._handleObject(a,h)||s}else this._makeCheckbox(a,p,h)}else{var m=this._makeLabel(r,h,!0);this._makeItem(h,m),s=this._handleObject(a,h)||s}}else console.error("dont know how to handle",a,r,h)}}return s}},{key:"_handleArray",value:function(t,e,i){"string"==typeof t[0]&&"color"===t[0]?(this._makeColorField(t,e,i),t[1]!==e&&this.changedOptions.push({path:i,value:e})):"string"==typeof t[0]?(this._makeDropdown(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:e})):"number"==typeof t[0]&&(this._makeRange(t,e,i),t[0]!==e&&this.changedOptions.push({path:i,value:Number(e)}))}},{key:"_update",value:function(t,e){var i=this._constructOptions(t,e);this.parent.body&&this.parent.body.emitter&&this.parent.body.emitter.emit&&this.parent.body.emitter.emit("configChange",i),this.initialized=!0,this.parent.setOptions(i)}},{key:"_constructOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},o=i;t="true"===t||t,t="false"!==t&&t;for(var n=0;n<e.length;n++)"global"!==e[n]&&(void 0===o[e[n]]&&(o[e[n]]={}),n!==e.length-1?o=o[e[n]]:o[e[n]]=t);return i}},{key:"_printOptions",value:function(){var t=this.getOptions();this.optionsContainer.innerHTML="<pre>var options = "+(0,s.default)(t,null,2)+"</pre>"}},{key:"getOptions",value:function(){for(var t={},e=0;e<this.changedOptions.length;e++)this._constructOptions(this.changedOptions[e].value,this.changedOptions[e].path,t);return t}}]),t}();e.default=f},function(t,e,i){function o(t,e){}function n(t,e){return e=void 0===e?{}:e,{style:e.style||t.options.drawPoints.style, 19286 styles:e.styles||t.options.drawPoints.styles,size:e.size||t.options.drawPoints.size,className:e.className||t.className}}function s(t,e){var i=void 0;return t.options&&t.options.drawPoints&&t.options.drawPoints.onRender&&"function"==typeof t.options.drawPoints.onRender&&(i=t.options.drawPoints.onRender),e.group.options&&e.group.options.drawPoints&&e.group.options.drawPoints.onRender&&"function"==typeof e.group.options.drawPoints.onRender&&(i=e.group.options.drawPoints.onRender),i}var r=i(6),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(14);o.draw=function(t,e,i,o){o=o||0;for(var r=s(i,e),d=0;d<t.length;d++)if(r){var l=r(t[d],e);!0!==l&&"object"!==(void 0===l?"undefined":(0,a.default)(l))||h.drawPoint(t[d].screen_x+o,t[d].screen_y,n(e,l),i.svgElements,i.svg,t[d].label)}else h.drawPoint(t[d].screen_x+o,t[d].screen_y,n(e),i.svgElements,i.svg,t[d].label)},o.drawIcon=function(t,e,i,o,s,r){var a=.5*s,d=h.getSVGElement("rect",r.svgElements,r.svg);d.setAttributeNS(null,"x",e),d.setAttributeNS(null,"y",i-a),d.setAttributeNS(null,"width",o),d.setAttributeNS(null,"height",2*a),d.setAttributeNS(null,"class","vis-outline"),h.drawPoint(e+.5*o,i,n(t),r.svgElements,r.svg)},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n.labelOffset=0,n.selected=!1,n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"setOptions",value:function(t,e,i){this.options=t,void 0===e&&void 0===i||this.setImages(e,i)}},{key:"setImages",value:function(t,e){e&&this.selected?(this.imageObj=e,this.imageObjAlt=t):(this.imageObj=t,this.imageObjAlt=e)}},{key:"switchImages",value:function(t){var e=t&&!this.selected||!t&&this.selected;if(this.selected=t,void 0!==this.imageObjAlt&&e){var i=this.imageObj;this.imageObj=this.imageObjAlt,this.imageObjAlt=i}}},{key:"_resizeImage",value:function(){var t,e;if(!1===this.options.shapeProperties.useImageSize){var i=1,o=1;this.imageObj.width&&this.imageObj.height&&(this.imageObj.width>this.imageObj.height?i=this.imageObj.width/this.imageObj.height:o=this.imageObj.height/this.imageObj.width),t=2*this.options.size*i,e=2*this.options.size*o}else t=this.imageObj.width,e=this.imageObj.height;this.width=t,this.height=e,this.radius=.5*this.width}}
19286,{key:"_drawRawCircle",value:function(t,e,i,o){this.initContextForDraw(t,o),t.circle(e,i,o.size),this.performFill(t,o)}},{key:"_drawImageAtPosition",value:function(t,e){if(0!=this.imageObj.width){t.globalAlpha=1,this.enableShadow(t,e);var i=1;!0===this.options.shapeProperties.interpolation&&(i=this.imageObj.width/this.width/this.body.view.scale),this.imageObj.drawImageAtPosition(t,i,this.left,this.top,this.width,this.height),this.disableShadow(t,e)}}},{key:"_drawImageLabel",value:function(t,e,i,o,n){var s,r=0;if(void 0!==this.height){r=.5*this.height;var a=this.labelModule.getTextSize(t,o,n);a.lineCount>=1&&(r+=a.height/2)}s=i+r,this.options.label&&(this.labelOffset=r),this.labelModule.draw(t,e,s,o,n,"hanging")}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(6),a=o(r),h=i(29),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(117).default,v=i(48).default,g=i(215).default,y=i(217).default,b=i(218).default,_=i(219).default,w=function(){function t(e,i,o,n){if((0,u.default)(this,t),void 0===i)throw new Error("No body provided");this.options=f.bridgeObject(o),this.globalOptions=o,this.defaultOptions=n,this.body=i,this.id=void 0,this.fromId=void 0,this.toId=void 0,this.selected=!1,this.hover=!1,this.labelDirty=!0,this.baseWidth=this.options.width,this.baseFontSize=this.options.font.size,this.from=void 0,this.to=void 0,this.edgeType=void 0,this.connected=!1,this.labelModule=new m(this.body,this.options,!0),this.setOptions(e)}return(0,p.default)(t,[{key:"setOptions",value:function(e){if(e){t.parseOptions(this.options,e,!0,this.globalOptions),void 0!==e.id&&(this.id=e.id),void 0!==e.from&&(this.fromId=e.from),void 0!==e.to&&(this.toId=e.to),void 0!==e.title&&(this.title=e.title),void 0!==e.value&&(e.value=parseFloat(e.value));var i=[e,this.options,this.defaultOptions];this.chooser=v.choosify("edge",i),this.updateLabelModule(e);var o=this.updateEdgeType();return this._setInteractionWidths(),this.connect(),void 0===e.hidden&&void 0===e.physics||(o=!0),o}}},{key:"getFormattingValues",value:function(){var t=!0===this.options.arrows.to||!0===this.options.arrows.to.enabled,e=!0===this.options.arrows.from||!0===this.options.arrows.from.enabled,i=!0===this.options.arrows.middle||!0===this.options.arrows.middle.enabled,o=this.options.color.inherit,n={toArrow:t,toArrowScale:this.options.arrows.to.scaleFactor,toArrowType:this.options.arrows.to.type,middleArrow:i,middleArrowScale:this.options.arrows.middle.scaleFactor,middleArrowType:this.options.arrows.middle.type,fromArrow:e,fromArrowScale:this.options.arrows.from.scaleFactor,fromArrowType:this.options.arrows.from.type,arrowStrikethrough:this.options.arrowStrikethrough,color:o?void 0:this.options.color.color,inheritsColor:o,opacity:this.options.color.opacity,hidden:this.options.hidden,length:this.options.length,shadow:this.options.shadow.enabled,shadowColor:this.options.shadow.color,shadowSize:this.options.shadow.size,shadowX:this.options.shadow.x,shadowY:this.options.shadow.y,dashes:this.options.dashes,width:this.options.width};if(this.selected||this.hover)if(!0===this.chooser){if(this.selected){var s=this.options.selectionWidth;"function"==typeof s?n.width=s(n.width):"number"==typeof s&&(n.width+=s),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.highlight,n.shadow=this.options.shadow.enabled}else if(this.hover){var r=this.options.hoverWidth;"function"==typeof r?n.width=r(n.width):"number"==typeof r&&(n.width+=r),n.width=Math.max(n.width,.3/this.body.view.scale),n.color=this.options.color.hover,n.shadow=this.options.shadow.enabled}}else"function"==typeof this.chooser&&(this.chooser(n,this.options.id,this.selected,this.hover),void 0!==n.color&&(n.inheritsColor=!1),!1===n.shadow&&(n.shadowColor===this.options.shadow.color&&n.shadowSize===this.options.shadow.size&&n.shadowX===this.options.shadow.x&&n.shadowY===this.options.shadow.y||(n.shadow=!0)));else n.shadow=this.options.shadow.enabled,n.width=Math.max(n.width,.3/this.body.view.scale);return n}},{key:"updateLabelModule",value:function(t){var e=[t,this.options,this.globalOptions,this.defaultOptions];this.labelModule.update(this.options,e),void 0!==this.labelModule.baseSize&&(this.baseFontSize=this.labelModule.baseSize)}},{key:"updateEdgeType",value:function(){var t=this.options.smooth,e=!1,i=!0;return void 0!==this.edgeType&&((this.edgeType instanceof y&&!0===t.enabled&&"dynamic"===t.type||this.edgeType instanceof g&&!0===t.enabled&&"cubicBezier"===t.type||this.edgeType instanceof b&&!0===t.enabled&&"dynamic"!==t.type&&"cubicBezier"!==t.type||this.edgeType instanceof _&&!1===t.type.enabled)&&(i=!1),!0===i&&(e=this.cleanup())),!0===i?!0===t.enabled?"dynamic"===t.type?(e=!0,this.edgeType=new y(this.options,this.body,this.labelModule)):"cubicBezier"===t.type?this.edgeType=new g(this.options,this.body,this.labelModule):this.edgeType=new b(this.options,this.body,this.labelModule):this.edgeType=new _(this.options,this.body,this.labelModule):this.edgeType.setOptions(this.options),e}},{key:"connect",value:function(){this.disconnect(),this.from=this.body.nodes[this.fromId]||void 0,this.to=this.body.nodes[this.toId]||void 0,this.connected=void 0!==this.from&&void 0!==this.to,!0===this.connected?(this.from.attachEdge(this),this.to.attachEdge(this)):(this.from&&this.from.detachEdge(this),this.to&&this.to.detachEdge(this)),this.edgeType.connect()}},{key:"disconnect",value:function(){this.from&&(this.from.detachEdge(this),this.from=void 0),this.to&&(this.to.detachEdge(this),this.to=void 0),this.connected=!1}},{key:"getTitle",value:function(){return this.title}},{key:"isSelected",value:function(){return this.selected}},{key:"getValue",value:function(){return this.options.value}}
19286,{key:"setValueRange",value:function(t,e,i){if(void 0!==this.options.value){var o=this.options.scaling.customScalingFunction(t,e,i,this.options.value),n=this.options.scaling.max-this.options.scaling.min;if(!0===this.options.scaling.label.enabled){var s=this.options.scaling.label.max-this.options.scaling.label.min;this.options.font.size=this.options.scaling.label.min+o*s}this.options.width=this.options.scaling.min+o*n}else this.options.width=this.baseWidth,this.options.font.size=this.baseFontSize;this._setInteractionWidths(),this.updateLabelModule()}},{key:"_setInteractionWidths",value:function(){"function"==typeof this.options.hoverWidth?this.edgeType.hoverWidth=this.options.hoverWidth(this.options.width):this.edgeType.hoverWidth=this.options.hoverWidth+this.options.width,"function"==typeof this.options.selectionWidth?this.edgeType.selectionWidth=this.options.selectionWidth(this.options.width):this.edgeType.selectionWidth=this.options.selectionWidth+this.options.width}},{key:"draw",value:function(t){var e=this.getFormattingValues();if(!e.hidden){var i=this.edgeType.getViaNode(),o={};this.edgeType.fromPoint=this.edgeType.from,this.edgeType.toPoint=this.edgeType.to,e.fromArrow&&(o.from=this.edgeType.getArrowData(t,"from",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.fromPoint=o.from.core)),e.toArrow&&(o.to=this.edgeType.getArrowData(t,"to",i,this.selected,this.hover,e),!1===e.arrowStrikethrough&&(this.edgeType.toPoint=o.to.core)),e.middleArrow&&(o.middle=this.edgeType.getArrowData(t,"middle",i,this.selected,this.hover,e)),this.edgeType.drawLine(t,e,this.selected,this.hover,i),this.drawArrows(t,o,e),this.drawLabel(t,i)}}},{key:"drawArrows",value:function(t,e,i){i.fromArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.from),i.middleArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.middle),i.toArrow&&this.edgeType.drawArrowHead(t,i,this.selected,this.hover,e.to)}},{key:"drawLabel",value:function(t,e){if(void 0!==this.options.label){var i=this.from,o=this.to;if(this.labelModule.differentState(this.selected,this.hover)&&this.labelModule.getTextSize(t,this.selected,this.hover),i.id!=o.id){this.labelModule.pointToSelf=!1;var n=this.edgeType.getPoint(.5,e);t.save();var s=this._getRotation(t);0!=s.angle&&(t.translate(s.x,s.y),t.rotate(s.angle)),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover),t.restore()}else{this.labelModule.pointToSelf=!0;var r,a,h=this.options.selfReferenceSize;i.shape.width>i.shape.height?(r=i.x+.5*i.shape.width,a=i.y-h):(r=i.x+h,a=i.y-.5*i.shape.height),n=this._pointOnCircle(r,a,h,.125),this.labelModule.draw(t,n.x,n.y,this.selected,this.hover)}}}},{key:"getItemsOnPoint",value:function(t){var e=[];if(this.labelModule.visible()){var i=this._getRotation();v.pointInRect(this.labelModule.getSize(),t,i)&&e.push({edgeId:this.id,labelId:0})}var o={left:t.x,top:t.y};return this.isOverlappingWith(o)&&e.push({edgeId:this.id}),e}},{key:"isOverlappingWith",value:function(t){if(this.connected){var e=this.from.x,i=this.from.y,o=this.to.x,n=this.to.y,s=t.left,r=t.top;return this.edgeType.getDistanceToEdge(e,i,o,n,s,r)<10}return!1}},{key:"_getRotation",value:function(t){var e=this.edgeType.getViaNode(),i=this.edgeType.getPoint(.5,e);void 0!==t&&this.labelModule.calculateLabelSize(t,this.selected,this.hover,i.x,i.y);var o={x:i.x,y:this.labelModule.size.yLine,angle:0};if(!this.labelModule.visible())return o;if("horizontal"===this.options.font.align)return o;var n=this.from.y-this.to.y,s=this.from.x-this.to.x,r=Math.atan2(n,s);return(r<-1&&s<0||r>0&&s<0)&&(r+=Math.PI),o.angle=r,o}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"select",value:function(){this.selected=!0}},{key:"unselect",value:function(){this.selected=!1}},{key:"cleanup",value:function(){return this.edgeType.cleanup()}},{key:"remove",value:function(){this.cleanup(),this.disconnect(),delete this.body.edges[this.id]}},{key:"endPointsValid",value:function(){return void 0!==this.body.nodes[this.fromId]&&void 0!==this.body.nodes[this.toId]}}],[{key:"parseOptions",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{},n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=["arrowStrikethrough","id","from","hidden","hoverWidth","labelHighlightBold","length","line","opacity","physics","scaling","selectionWidth","selfReferenceSize","to","title","value","width","font","chosen","widthConstraint"];if(f.selectiveDeepExtend(r,t,e,i),v.isValidLabel(e.label)?t.label=e.label:t.label=void 0,f.mergeOptions(t,e,"smooth",o),f.mergeOptions(t,e,"shadow",o),void 0!==e.dashes&&null!==e.dashes?t.dashes=e.dashes:!0===i&&null===e.dashes&&(t.dashes=(0,d.default)(o.dashes)),void 0!==e.scaling&&null!==e.scaling?(void 0!==e.scaling.min&&(t.scaling.min=e.scaling.min),void 0!==e.scaling.max&&(t.scaling.max=e.scaling.max),f.mergeOptions(t.scaling,e.scaling,"label",o.scaling)):!0===i&&null===e.scaling&&(t.scaling=(0,d.default)(o.scaling)),void 0!==e.arrows&&null!==e.arrows)if("string"==typeof e.arrows){var h=e.arrows.toLowerCase();t.arrows.to.enabled=-1!=h.indexOf("to"),t.arrows.middle.enabled=-1!=h.indexOf("middle"),t.arrows.from.enabled=-1!=h.indexOf("from")}else{if("object"!==(0,a.default)(e.arrows))throw new Error("The arrow newOptions can only be an object or a string. Refer to the documentation. You used:"+(0,s.default)(e.arrows));f.mergeOptions(t.arrows,e.arrows,"to",o.arrows),f.mergeOptions(t.arrows,e.arrows,"middle",o.arrows),f.mergeOptions(t.arrows,e.arrows,"from",o.arrows)}else!0===i&&null===e.arrows&&(t.arrows=(0,d.default)(o.arrows));if(void 0!==e.color&&null!==e.color){var l=e.color,u=t.color;if(n)f.deepExtend(u,o.color,!1,i);else for(var c in u)u.hasOwnProperty(c)&&delete u[c];if(f.isString(u))u.color=u,u.highlight=u,u.hover=u,u.inherit=!1,void 0===l.opacity&&(u.opacity=1);else{var p=!1;void 0!==l.color&&(u.color=l.color,p=!0),void 0!==l.highlight&&(u.highlight=l.highlight,p=!0),void 0!==l.hover&&(u.hover=l.hover,p=!0),void 0!==l.inherit&&(u.inherit=l.inherit),void 0!==l.opacity&&(u.opacity=Math.min(1,Math.max(0,l.opacity))),!0===p?u.inherit=!1:void 0===u.inherit&&(u.inherit="from")}}else!0===i&&null===e.color&&(t.color=f.bridgeObject(o.color));!0===i&&null===e.font&&(t.font=f.bridgeObject(o.font))}}]),t}();e.default=w}
19286,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_findBorderPositionBezier",value:function(t,e){var i,o,n,s,r,a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this._getViaCoordinates(),h=0,d=0,l=1,u=this.to,c=!1;for(t.id===this.from.id&&(u=this.from,c=!0);d<=l&&h<10;){var p=.5*(d+l);if(i=this.getPoint(p,a),o=Math.atan2(u.y-i.y,u.x-i.x),n=u.distanceToBorder(e,o),s=Math.sqrt(Math.pow(i.x-u.x,2)+Math.pow(i.y-u.y,2)),r=n-s,Math.abs(r)<.2)break;r<0?!1===c?d=p:l=p:!1===c?l=p:d=p,h++}return i.t=p,i}},{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r){var a=1e9,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=t,f=e;for(d=1;d<10;d++)l=.1*d,u=Math.pow(1-l,2)*t+2*l*(1-l)*r.x+Math.pow(l,2)*i,c=Math.pow(1-l,2)*e+2*l*(1-l)*r.y+Math.pow(l,2)*o,d>0&&(h=this._getDistanceToLine(p,f,u,c,n,s),a=h<a?h:a),p=u,f=c;return a}},{key:"_bezierCurve",value:function(t,e,i,o){var n=void 0!==i&&void 0!==i.x,s=void 0!==o&&void 0!==o.x;t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),n&&s?t.bezierCurveTo(i.x,i.y,o.x,o.y,this.toPoint.x,this.toPoint.y):n?t.quadraticCurveTo(i.x,i.y,this.toPoint.x,this.toPoint.y):t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t)}return(0,a.default)(t,null,[{key:"getRange",value:function(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;a<i.length;a++)e=t[i[a]],s>e.shape.boundingBox.left&&(s=e.shape.boundingBox.left),r<e.shape.boundingBox.right&&(r=e.shape.boundingBox.right),o>e.shape.boundingBox.top&&(o=e.shape.boundingBox.top),n<e.shape.boundingBox.bottom&&(n=e.shape.boundingBox.bottom);return 1e9===s&&-1e9===r&&1e9===o&&-1e9===n&&(o=0,n=0,s=0,r=0),{minX:s,maxX:r,minY:o,maxY:n}}},{key:"getRangeCore",value:function(t){var e,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=1e9,n=-1e9,s=1e9,r=-1e9;if(i.length>0)for(var a=0;a<i.length;a++)e=t[i[a]],s>e.x&&(s=e.x),r<e.x&&(r=e.x),o>e.y&&(o=e.y),n<e.y&&(n=e.y);return 1e9===s&&-1e9===r&&1e9===o&&-1e9===n&&(o=0,n=0,s=0,r=0),{minX:s,maxX:r,minY:o,maxY:n}}},{key:"findCenter",value:function(t){return{x:.5*(t.maxX+t.minX),y:.5*(t.maxY+t.minY)}}},{key:"cloneOptions",value:function(t,e){var i={};return void 0===e||"node"===e?(h.deepExtend(i,t.options,!0),i.x=t.x,i.y=t.y,i.amountOfConnections=t.edges.length):h.deepExtend(i,t.options,!0),i}}]),t}();e.default=d},function(t,e,i){t.exports={default:i(124),__esModule:!0}},function(t,e,i){var o=i(50);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==o(t)?t.split(""):Object(t)}},function(t,e,i){var o=i(52),n=i(17),s=i(83),r=i(26),a=i(22),h=i(31),d=i(129),l=i(59),u=i(85),c=i(13)("iterator"),p=!([].keys&&"next"in[].keys()),f=function(){return this};t.exports=function(t,e,i,m,v,g,y){d(i,e,m);var b,_,w,x=function(t){if(!p&&t in M)return M[t];switch(t){case"keys":case"values":return function(){return new i(this,t)}}return function(){return new i(this,t)}},k=e+" Iterator",S="values"==v,D=!1,M=t.prototype,C=M[c]||M["@@iterator"]||v&&M[v],O=C||x(v),E=v?S?x("entries"):O:void 0,T="Array"==e?M.entries||C:C;if(T&&(w=u(T.call(new t)))!==Object.prototype&&w.next&&(l(w,k,!0),o||a(w,c)||r(w,c,f)),S&&C&&"values"!==C.name&&(D=!0,O=function(){return C.call(this)}),o&&!y||!p&&!D&&M[c]||r(M,c,O),h[e]=O,h[k]=f,v)if(b={values:S?O:x("values"),keys:g?O:x("keys"),entries:E},y)for(_ in b)_ in M||s(M,_,b[_]);else n(n.P+n.F*(p||D),e,b);return b}},function(t,e,i){var o=i(128);
19286t.exports=function(t,e,i){if(o(t),void 0===e)return t;switch(i){case 1:return function(i){return t.call(e,i)};case 2:return function(i,o){return t.call(e,i,o)};case 3:return function(i,o,n){return t.call(e,i,o,n)}}return function(){return t.apply(e,arguments)}}},function(t,e,i){t.exports=!i(21)&&!i(28)(function(){return 7!=Object.defineProperty(i(82)("div"),"a",{get:function(){return 7}}).a})},function(t,e,i){var o=i(32),n=i(18).document,s=o(n)&&o(n.createElement);t.exports=function(t){return s?n.createElement(t):{}}},function(t,e,i){t.exports=i(26)},function(t,e,i){var o=i(22),n=i(25),s=i(131)(!1),r=i(56)("IE_PROTO");t.exports=function(t,e){var i,a=n(t),h=0,d=[];for(i in a)i!=r&&o(a,i)&&d.push(i);for(;e.length>h;)o(a,i=e[h++])&&(~s(d,i)||d.push(i));return d}},function(t,e,i){var o=i(22),n=i(41),s=i(56)("IE_PROTO"),r=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=n(t),o(t,s)?t[s]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?r:null}},function(t,e,i){var o=i(50),n=i(13)("toStringTag"),s="Arguments"==o(function(){return arguments}()),r=function(t,e){try{return t[e]}catch(t){}};t.exports=function(t){var e,i,a;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(i=r(e=Object(t),n))?i:s?o(e):"Object"==(a=o(e))&&"function"==typeof e.callee?"Arguments":a}},function(t,e,i){var o=i(17),n=i(7),s=i(28);t.exports=function(t,e){var i=(n.Object||{})[t]||Object[t],r={};r[t]=e(i),o(o.S+o.F*s(function(){i(1)}),"Object",r)}},function(t,e,i){var o=i(84),n=i(58).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return o(t,n)}},function(t,e,i){var o=i(42),n=i(39),s=i(25),r=i(53),a=i(22),h=i(81),d=Object.getOwnPropertyDescriptor;e.f=i(21)?d:function(t,e){if(t=s(t),e=r(e,!0),h)try{return d(t,e)}catch(t){}if(a(t,e))return n(!o.f.call(t,e),t[e])}},function(t,e,i){t.exports={default:i(162),__esModule:!0}},function(t,e,i){function o(t,e){this.x=void 0!==t?t:0,this.y=void 0!==e?e:0}t.exports=o},function(t,e,i){function o(t,e){if(void 0===t)throw new Error("No container element defined");if(this.container=t,this.visible=!e||void 0==e.visible||e.visible,this.visible){this.frame=document.createElement("DIV"),this.frame.style.width="100%",this.frame.style.position="relative",this.container.appendChild(this.frame),this.frame.prev=document.createElement("INPUT"),this.frame.prev.type="BUTTON",this.frame.prev.value="Prev",this.frame.appendChild(this.frame.prev),this.frame.play=document.createElement("INPUT"),this.frame.play.type="BUTTON",this.frame.play.value="Play",this.frame.appendChild(this.frame.play),this.frame.next=document.createElement("INPUT"),this.frame.next.type="BUTTON",this.frame.next.value="Next",this.frame.appendChild(this.frame.next),this.frame.bar=document.createElement("INPUT"),this.frame.bar.type="BUTTON",this.frame.bar.style.position="absolute",this.frame.bar.style.border="1px solid red",this.frame.bar.style.width="100px",this.frame.bar.style.height="6px",this.frame.bar.style.borderRadius="2px",this.frame.bar.style.MozBorderRadius="2px",this.frame.bar.style.border="1px solid #7F7F7F",this.frame.bar.style.backgroundColor="#E5E5E5",this.frame.appendChild(this.frame.bar),this.frame.slide=document.createElement("INPUT"),this.frame.slide.type="BUTTON",this.frame.slide.style.margin="0px",this.frame.slide.value=" ",this.frame.slide.style.position="relative",this.frame.slide.style.left="-100px",this.frame.appendChild(this.frame.slide);var i=this;this.frame.slide.onmousedown=function(t){i._onMouseDown(t)},this.frame.prev.onclick=function(t){i.prev(t)},this.frame.play.onclick=function(t){i.togglePlay(t)},this.frame.next.onclick=function(t){i.next(t)}}this.onChangeCallback=void 0,this.values=[],this.index=void 0,this.playTimeout=void 0,this.playInterval=1e3,this.playLoop=!0}var n=i(2);o.prototype.prev=function(){var t=this.getIndex();t>0&&(t--,this.setIndex(t))},o.prototype.next=function(){var t=this.getIndex();t<this.values.length-1&&(t++,this.setIndex(t))},o.prototype.playNext=function(){var t=new Date,e=this.getIndex();e<this.values.length-1?(e++,this.setIndex(e)):this.playLoop&&(e=0,this.setIndex(e));var i=new Date,o=i-t,n=Math.max(this.playInterval-o,0),s=this;this.playTimeout=setTimeout(function(){s.playNext()},n)},o.prototype.togglePlay=function(){void 0===this.playTimeout?this.play():this.stop()},o.prototype.play=function(){this.playTimeout||(this.playNext(),this.frame&&(this.frame.play.value="Stop"))},o.prototype.stop=function(){clearInterval(this.playTimeout),this.playTimeout=void 0,this.frame&&(this.frame.play.value="Play")},o.prototype.setOnChangeCallback=function(t){this.onChangeCallback=t},o.prototype.setPlayInterval=function(t){this.playInterval=t},o.prototype.getPlayInterval=function(){return this.playInterval},o.prototype.setPlayLoop=function(t){this.playLoop=t},o.prototype.onChange=function(){void 0!==this.onChangeCallback&&this.onChangeCallback()},o.prototype.redraw=function(){if(this.frame){this.frame.bar.style.top=this.frame.clientHeight/2-this.frame.bar.offsetHeight/2+"px",this.frame.bar.style.width=this.frame.clientWidth-this.frame.prev.clientWidth-this.frame.play.clientWidth-this.frame.next.clientWidth-30+"px";var t=this.indexToLeft(this.index);this.frame.slide.style.left=t+"px"}},o.prototype.setValues=function(t){this.values=t,this.values.length>0?this.setIndex(0):this.index=void 0},o.prototype.setIndex=function(t){if(!(t<this.values.length))throw new Error("Index out of range");this.index=t,this.redraw(),this.onChange()},o.prototype.getIndex=function(){return this.index},o.prototype.get=function(){return this.values[this.index]},o.prototype._onMouseDown=function(t){if(t.which?1===t.which:1===t.button){this.startClientX=t.clientX,this.startSlideX=parseFloat(this.frame.slide.style.left),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},n.addEventListener(document,"mousemove",this.onmousemove),n.addEventListener(document,"mouseup",this.onmouseup),n.preventDefault(t)}},o.prototype.leftToIndex=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10,i=t-3,o=Math.round(i/e*(this.values.length-1));return o<0&&(o=0),o>this.values.length-1&&(o=this.values.length-1),o},o.prototype.indexToLeft=function(t){var e=parseFloat(this.frame.bar.style.width)-this.frame.slide.clientWidth-10;return t/(this.values.length-1)*e+3},o.prototype._onMouseMove=function(t){var e=t.clientX-this.startClientX,i=this.startSlideX+e,o=this.leftToIndex(i);this.setIndex(o),n.preventDefault()},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",n.removeEventListener(document,"mousemove",this.onmousemove),n.removeEventListener(document,"mouseup",this.onmouseup),n.preventDefault()},t.exports=o}
19286,function(t,e,i){function o(t,e,i,o){this._start=0,this._end=0,this._step=1,this.prettyStep=!0,this.precision=5,this._current=0,this.setRange(t,e,i,o)}o.prototype.isNumeric=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},o.prototype.setRange=function(t,e,i,o){if(!this.isNumeric(t))throw new Error("Parameter 'start' is not numeric; value: "+t);if(!this.isNumeric(e))throw new Error("Parameter 'end' is not numeric; value: "+t);if(!this.isNumeric(i))throw new Error("Parameter 'step' is not numeric; value: "+t);this._start=t||0,this._end=e||0,this.setStep(i,o)},o.prototype.setStep=function(t,e){void 0===t||t<=0||(void 0!==e&&(this.prettyStep=e),!0===this.prettyStep?this._step=o.calculatePrettyStep(t):this._step=t)},o.calculatePrettyStep=function(t){var e=function(t){return Math.log(t)/Math.LN10},i=Math.pow(10,Math.round(e(t))),o=2*Math.pow(10,Math.round(e(t/2))),n=5*Math.pow(10,Math.round(e(t/5))),s=i;return Math.abs(o-t)<=Math.abs(s-t)&&(s=o),Math.abs(n-t)<=Math.abs(s-t)&&(s=n),s<=0&&(s=1),s},o.prototype.getCurrent=function(){return parseFloat(this._current.toPrecision(this.precision))},o.prototype.getStep=function(){return this._step},o.prototype.start=function(t){void 0===t&&(t=!1),this._current=this._start-this._start%this._step,t&&this.getCurrent()<this._start&&this.next()},o.prototype.next=function(){this._current+=this._step},o.prototype.end=function(){return this._current>this._end},t.exports=o},function(t,e,i){function o(t){for(var e in t)if(t.hasOwnProperty(e))return!1;return!0}function n(t){return void 0===t||""===t||"string"!=typeof t?t:t.charAt(0).toUpperCase()+t.slice(1)}function s(t,e){return void 0===t||""===t?e:t+n(e)}function r(t,e,i,o){for(var n,r,a=0;a<i.length;++a)n=i[a],r=s(o,n),e[r]=t[n]}function a(t,e,i,o){for(var n,r,a=0;a<i.length;++a)n=i[a],void 0!==t[n]&&(r=s(o,n),e[r]=t[n])}function h(t,e){if(void 0===t||o(t))throw new Error("No DEFAULTS passed");if(void 0===e)throw new Error("No dst passed");C=t,r(t,e,D),r(t,e,M,"default"),l(t,e),e.margin=10,e.showGrayBottom=!1,e.showTooltip=!1,e.onclick_callback=null,e.eye=new x(0,0,-1)}function d(t,e){if(void 0!==t){if(void 0===e)throw new Error("No dst passed");if(void 0===C||o(C))throw new Error("DEFAULTS not set for module Settings");a(t,e,D),a(t,e,M,"default"),l(t,e)}}function l(t,e){void 0!==t.backgroundColor&&m(t.backgroundColor,e),v(t.dataColor,e),f(t.style,e),u(t.showLegend,e),g(t.cameraPosition,e),void 0!==t.tooltip&&(e.showTooltip=t.tooltip),void 0!=t.onclick&&(e.onclick_callback=t.onclick),void 0!==t.tooltipStyle&&_.selectiveDeepExtend(["tooltipStyle"],e,t)}function u(t,e){if(void 0===t){if(void 0===C.showLegend){var i=e.style===k.DOTCOLOR||e.style===k.DOTSIZE;e.showLegend=i}}else e.showLegend=t}function c(t){var e=S[t];return void 0===e?-1:e}function p(t){var e=!1;for(var i in k)if(k[i]===t){e=!0;break}return e}function f(t,e){if(void 0!==t){var i;if("string"==typeof t){if(-1===(i=c(t)))throw new Error("Style '"+t+"' is invalid")}else{if(!p(t))throw new Error("Style '"+t+"' is invalid");i=t}e.style=i}}function m(t,e){var i="white",o="gray",n=1;if("string"==typeof t)i=t,o="none",n=0;else{if("object"!==(void 0===t?"undefined":(0,b.default)(t)))throw new Error("Unsupported type of backgroundColor");void 0!==t.fill&&(i=t.fill),void 0!==t.stroke&&(o=t.stroke),void 0!==t.strokeWidth&&(n=t.strokeWidth)}e.frame.style.backgroundColor=i,e.frame.style.borderColor=o,e.frame.style.borderWidth=n+"px",e.frame.style.borderStyle="solid"}function v(t,e){void 0!==t&&(void 0===e.dataColor&&(e.dataColor={}),"string"==typeof t?(e.dataColor.fill=t,e.dataColor.stroke=t):(t.fill&&(e.dataColor.fill=t.fill),t.stroke&&(e.dataColor.stroke=t.stroke),void 0!==t.strokeWidth&&(e.dataColor.strokeWidth=t.strokeWidth)))}function g(t,e){var i=t;void 0!==i&&(void 0===e.camera&&(e.camera=new w),e.camera.setArmRotation(i.horizontal,i.vertical),e.camera.setArmLength(i.distance))}var y=i(6),b=function(t){return t&&t.__esModule?t:{default:t}}(y),_=i(2),w=i(95),x=i(34),k={BAR:0,BARCOLOR:1,BARSIZE:2,DOT:3,DOTLINE:4,DOTCOLOR:5,DOTSIZE:6,GRID:7,LINE:8,SURFACE:9},S={dot:k.DOT,"dot-line":k.DOTLINE,"dot-color":k.DOTCOLOR,"dot-size":k.DOTSIZE,line:k.LINE,grid:k.GRID,surface:k.SURFACE,bar:k.BAR,"bar-color":k.BARCOLOR,"bar-size":k.BARSIZE},D=["width","height","filterLabel","legendLabel","xLabel","yLabel","zLabel","xValueLabel","yValueLabel","zValueLabel","showXAxis","showYAxis","showZAxis","showGrid","showPerspective","showShadow","keepAspectRatio","verticalRatio","dotSizeRatio","dotSizeMinFraction","dotSizeMaxFraction","showAnimationControls","animationInterval","animationPreload","animationAutoStart","axisColor","gridColor","xCenter","yCenter"],M=["xBarWidth","yBarWidth","valueMin","valueMax","xMin","xMax","xStep","yMin","yMax","yStep","zMin","zMax","zStep"],C=void 0;
19286t.exports.STYLE=k,t.exports.setDefaults=h,t.exports.setOptions=d,t.exports.setCameraPosition=g},function(t,e,i){function o(){this.armLocation=new r,this.armRotation={},this.armRotation.horizontal=0,this.armRotation.vertical=0,this.armLength=1.7,this.cameraOffset=new r,this.offsetMultiplier=.6,this.cameraLocation=new r,this.cameraRotation=new r(.5*Math.PI,0,0),this.calculateCameraOrientation()}var n=i(165),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(34);o.prototype.setOffset=function(t,e){var i=Math.abs,o=s.default,n=this.offsetMultiplier,r=this.armLength*n;i(t)>r&&(t=o(t)*r),i(e)>r&&(e=o(e)*r),this.cameraOffset.x=t,this.cameraOffset.y=e,this.calculateCameraOrientation()},o.prototype.getOffset=function(){return this.cameraOffset},o.prototype.setArmLocation=function(t,e,i){this.armLocation.x=t,this.armLocation.y=e,this.armLocation.z=i,this.calculateCameraOrientation()},o.prototype.setArmRotation=function(t,e){void 0!==t&&(this.armRotation.horizontal=t),void 0!==e&&(this.armRotation.vertical=e,this.armRotation.vertical<0&&(this.armRotation.vertical=0),this.armRotation.vertical>.5*Math.PI&&(this.armRotation.vertical=.5*Math.PI)),void 0===t&&void 0===e||this.calculateCameraOrientation()},o.prototype.getArmRotation=function(){var t={};return t.horizontal=this.armRotation.horizontal,t.vertical=this.armRotation.vertical,t},o.prototype.setArmLength=function(t){void 0!==t&&(this.armLength=t,this.armLength<.71&&(this.armLength=.71),this.armLength>5&&(this.armLength=5),this.setOffset(this.cameraOffset.x,this.cameraOffset.y),this.calculateCameraOrientation())}, 19287 o.prototype.getArmLength=function(){return this.armLength},o.prototype.getCameraLocation=function(){return this.cameraLocation},o.prototype.getCameraRotation=function(){return this.cameraRotation},o.prototype.calculateCameraOrientation=function(){this.cameraLocation.x=this.armLocation.x-this.armLength*Math.sin(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.y=this.armLocation.y-this.armLength*Math.cos(this.armRotation.horizontal)*Math.cos(this.armRotation.vertical),this.cameraLocation.z=this.armLocation.z+this.armLength*Math.sin(this.armRotation.vertical),this.cameraRotation.x=Math.PI/2-this.armRotation.vertical,this.cameraRotation.y=0,this.cameraRotation.z=-this.armRotation.horizontal;var t=this.cameraRotation.x,e=this.cameraRotation.z,i=this.cameraOffset.x,o=this.cameraOffset.y,n=Math.sin,s=Math.cos;this.cameraLocation.x=this.cameraLocation.x+i*s(e)+o*-n(e)*s(t),this.cameraLocation.y=this.cameraLocation.y+i*n(e)+o*s(e)*s(t),this.cameraLocation.z=this.cameraLocation.z+o*n(t)},t.exports=o},function(t,e,i){function o(t,e,i){this.dataGroup=t,this.column=e,this.graph=i,this.index=void 0,this.value=void 0,this.values=t.getDistinctValues(this.column),this.values.length>0&&this.selectValue(0),this.dataPoints=[],this.loaded=!1,this.onLoadCallback=void 0,i.animationPreload?(this.loaded=!1,this.loadInBackground()):this.loaded=!0}var n=i(12);o.prototype.isLoaded=function(){return this.loaded},o.prototype.getLoadedProgress=function(){for(var t=this.values.length,e=0;this.dataPoints[e];)e++;return Math.round(e/t*100)},o.prototype.getLabel=function(){return this.graph.filterLabel},o.prototype.getColumn=function(){return this.column},o.prototype.getSelectedValue=function(){if(void 0!==this.index)return this.values[this.index]},o.prototype.getValues=function(){return this.values},o.prototype.getValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");return this.values[t]},o.prototype._getDataPoints=function(t){if(void 0===t&&(t=this.index),void 0===t)return[];var e;if(this.dataPoints[t])e=this.dataPoints[t];else{var i={};i.column=this.column,i.value=this.values[t];var o=new n(this.dataGroup.getDataSet(),{filter:function(t){return t[i.column]==i.value}}).get();e=this.dataGroup._getDataPoints(o),this.dataPoints[t]=e}return e},o.prototype.setOnLoadCallback=function(t){this.onLoadCallback=t},o.prototype.selectValue=function(t){if(t>=this.values.length)throw new Error("Index out of range");this.index=t,this.value=this.values[t]}
19287,o.prototype.loadInBackground=function(t){void 0===t&&(t=0);var e=this.graph.frame;if(t<this.values.length){void 0===e.progress&&(e.progress=document.createElement("DIV"),e.progress.style.position="absolute",e.progress.style.color="gray",e.appendChild(e.progress));var i=this.getLoadedProgress();e.progress.innerHTML="Loading animation... "+i+"%",e.progress.style.bottom="60px",e.progress.style.left="10px";var o=this;setTimeout(function(){o.loadInBackground(t+1)},10),this.loaded=!1}else this.loaded=!0,void 0!==e.progress&&(e.removeChild(e.progress),e.progress=void 0),this.onLoadCallback&&this.onLoadCallback()},t.exports=o},function(t,e,i){function o(t){this.active=!1,this.dom={container:t},this.dom.overlay=document.createElement("div"),this.dom.overlay.className="vis-overlay",this.dom.container.appendChild(this.dom.overlay),this.hammer=a(this.dom.overlay),this.hammer.on("tap",this._onTapOverlay.bind(this));var e=this;["tap","doubletap","press","pinch","pan","panstart","panmove","panend"].forEach(function(t){e.hammer.on(t,function(t){t.stopPropagation()})}),document&&document.body&&(this.onClick=function(i){n(i.target,t)||e.deactivate()},document.body.addEventListener("click",this.onClick)),void 0!==this.keycharm&&this.keycharm.destroy(),this.keycharm=s(),this.escListener=this.deactivate.bind(this)}function n(t,e){for(;t;){if(t===e)return!0;t=t.parentNode}return!1}var s=i(35),r=i(44),a=i(10),h=i(2);r(o.prototype),o.current=null,o.prototype.destroy=function(){this.deactivate(),this.dom.overlay.parentNode.removeChild(this.dom.overlay),this.onClick&&document.body.removeEventListener("click",this.onClick),this.hammer.destroy(),this.hammer=null},o.prototype.activate=function(){o.current&&o.current.deactivate(),o.current=this,this.active=!0,this.dom.overlay.style.display="none",h.addClassName(this.dom.container,"vis-active"),this.emit("change"),this.emit("activate"),this.keycharm.bind("esc",this.escListener)},o.prototype.deactivate=function(){this.active=!1,this.dom.overlay.style.display="",h.removeClassName(this.dom.container,"vis-active"),this.keycharm.unbind("esc",this.escListener),this.emit("change"),this.emit("deactivate")},o.prototype._onTapOverlay=function(t){this.activate(),t.stopPropagation()},t.exports=o},function(t,e,i){e.en={current:"current",time:"time"},e.en_EN=e.en,e.en_US=e.en,e.it={current:"attuale",time:"tempo"},e.it_IT=e.it,e.it_CH=e.it,e.nl={current:"huidige",time:"tijd"},e.nl_NL=e.nl,e.nl_BE=e.nl,e.de={current:"Aktuelle",time:"Zeit"},e.de_DE=e.de,e.fr={current:"actuel",time:"heure"},e.fr_FR=e.fr,e.fr_CA=e.fr,e.fr_BE=e.fr,e.es={current:"corriente",time:"hora"},e.es_ES=e.es},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(t,e){this.body=t,this.defaultOptions={type:null,orientation:{item:"bottom"},align:"auto",stack:!0,stackSubgroups:!0,groupOrderSwap:function(t,e,i){var o=e.order;e.order=t.order,t.order=o},groupOrder:"order",selectable:!0,multiselect:!1,itemsAlwaysDraggable:{item:!1,range:!1},editable:{updateTime:!1,updateGroup:!1,add:!1,remove:!1,overrideItems:!1},groupEditable:{order:!1,add:!1,remove:!1},snap:p.snap,onDropObjectOnItem:function(t,e,i){i(e)},onAdd:function(t,e){e(t)},onUpdate:function(t,e){e(t)},onMove:function(t,e){e(t)},onRemove:function(t,e){e(t)},onMoving:function(t,e){e(t)},onAddGroup:function(t,e){e(t)},onMoveGroup:function(t,e){e(t)},onRemoveGroup:function(t,e){e(t)},margin:{item:{horizontal:10,vertical:10},axis:20},showTooltips:!0,tooltip:{followMouse:!1,overflowMethod:"flip"},tooltipOnItemUpdateTime:!1},this.options=l.extend({},this.defaultOptions),this.options.rtl=e.rtl,this.itemOptions={type:{start:"Date",end:"Date"}},this.conversion={toScreen:t.util.toScreen,toTime:t.util.toTime},this.dom={},this.props={},this.hammer=null;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e,o){i._onAdd(e.items)},update:function(t,e,o){i._onUpdate(e.items)},remove:function(t,e,o){i._onRemove(e.items)}},this.groupListeners={add:function(t,e,o){if(i._onAddGroups(e.items),i.groupsData&&i.groupsData.length>0){var n=i.groupsData.getDataSet();
19287n.get().forEach(function(t){if(t.nestedGroups){0!=t.showNested&&(t.showNested=!0);var e=[];t.nestedGroups.forEach(function(i){var o=n.get(i);o&&(o.nestedInGroup=t.id,0==t.showNested&&(o.visible=!1),e=e.concat(o))}),n.update(e,o)}})}},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.groups={},this.groupIds=[],this.selection=[],this.popup=null,this.touchParams={},this.groupTouchParams={},this._create(),this.setOptions(e)}var s=i(29),r=o(s),a=i(6),h=o(a),d=i(10),l=i(2),u=i(11),c=i(12),p=i(66),f=i(16),m=i(68),v=i(69),g=i(101),y=i(102),b=i(70),_=i(103),w=i(104).default,x="__ungrouped__",k="__background__";n.prototype=new f,n.types={background:_,box:g,range:b,point:y},n.prototype._create=function(){var t=document.createElement("div");t.className="vis-itemset",t["timeline-itemset"]=this,this.dom.frame=t;var e=document.createElement("div");e.className="vis-background",t.appendChild(e),this.dom.background=e;var i=document.createElement("div");i.className="vis-foreground",t.appendChild(i),this.dom.foreground=i;var o=document.createElement("div");o.className="vis-axis",this.dom.axis=o;var n=document.createElement("div");n.className="vis-labelset",this.dom.labelSet=n,this._updateUngrouped();var s=new v(k,null,this);s.show(),this.groups[k]=s,this.hammer=new d(this.body.dom.centerContainer),this.hammer.on("hammer.input",function(t){t.isFirst&&this._onTouch(t)}.bind(this)),this.hammer.on("panstart",this._onDragStart.bind(this)),this.hammer.on("panmove",this._onDrag.bind(this)),this.hammer.on("panend",this._onDragEnd.bind(this)),this.hammer.get("pan").set({threshold:5,direction:d.DIRECTION_HORIZONTAL}),this.hammer.on("tap",this._onSelectItem.bind(this)),this.hammer.on("press",this._onMultiSelectItem.bind(this)),this.hammer.on("doubletap",this._onAddItem.bind(this)),this.options.rtl?this.groupHammer=new d(this.body.dom.rightContainer):this.groupHammer=new d(this.body.dom.leftContainer),this.groupHammer.on("tap",this._onGroupClick.bind(this)),this.groupHammer.on("panstart",this._onGroupDragStart.bind(this)),this.groupHammer.on("panmove",this._onGroupDrag.bind(this)),this.groupHammer.on("panend",this._onGroupDragEnd.bind(this)),this.groupHammer.get("pan").set({threshold:5,direction:d.DIRECTION_VERTICAL}),this.body.dom.centerContainer.addEventListener("mouseover",this._onMouseOver.bind(this)),this.body.dom.centerContainer.addEventListener("mouseout",this._onMouseOut.bind(this)),this.body.dom.centerContainer.addEventListener("mousemove",this._onMouseMove.bind(this)),this.body.dom.centerContainer.addEventListener("contextmenu",this._onDragEnd.bind(this)),this.body.dom.centerContainer.addEventListener("mousewheel",this._onMouseWheel.bind(this)),this.show()},n.prototype.setOptions=function(t){if(t){var e=["type","rtl","align","order","stack","stackSubgroups","selectable","multiselect","multiselectPerGroup","groupOrder","dataAttributes","template","groupTemplate","visibleFrameTemplate","hide","snap","groupOrderSwap","showTooltips","tooltip","tooltipOnItemUpdateTime"];l.selectiveExtend(e,this.options,t),"itemsAlwaysDraggable"in t&&("boolean"==typeof t.itemsAlwaysDraggable?(this.options.itemsAlwaysDraggable.item=t.itemsAlwaysDraggable,this.options.itemsAlwaysDraggable.range=!1):"object"===(0,h.default)(t.itemsAlwaysDraggable)&&(l.selectiveExtend(["item","range"],this.options.itemsAlwaysDraggable,t.itemsAlwaysDraggable),this.options.itemsAlwaysDraggable.item||(this.options.itemsAlwaysDraggable.range=!1))),"orientation"in t&&("string"==typeof t.orientation?this.options.orientation.item="top"===t.orientation?"top":"bottom":"object"===(0,h.default)(t.orientation)&&"item"in t.orientation&&(this.options.orientation.item=t.orientation.item)),"margin"in t&&("number"==typeof t.margin?(this.options.margin.axis=t.margin,this.options.margin.item.horizontal=t.margin,this.options.margin.item.vertical=t.margin):"object"===(0,h.default)(t.margin)&&(l.selectiveExtend(["axis"],this.options.margin,t.margin),"item"in t.margin&&("number"==typeof t.margin.item?(this.options.margin.item.horizontal=t.margin.item,this.options.margin.item.vertical=t.margin.item):"object"===(0,h.default)(t.margin.item)&&l.selectiveExtend(["horizontal","vertical"],this.options.margin.item,t.margin.item)))),"editable"in t&&("boolean"==typeof t.editable?(this.options.editable.updateTime=t.editable,this.options.editable.updateGroup=t.editable,this.options.editable.add=t.editable,this.options.editable.remove=t.editable,this.options.editable.overrideItems=!1):"object"===(0,h.default)(t.editable)&&l.selectiveExtend(["updateTime","updateGroup","add","remove","overrideItems"],this.options.editable,t.editable)),"groupEditable"in t&&("boolean"==typeof t.groupEditable?(this.options.groupEditable.order=t.groupEditable,this.options.groupEditable.add=t.groupEditable,this.options.groupEditable.remove=t.groupEditable):"object"===(0,h.default)(t.groupEditable)&&l.selectiveExtend(["order","add","remove"],this.options.groupEditable,t.groupEditable));["onDropObjectOnItem","onAdd","onUpdate","onRemove","onMove","onMoving","onAddGroup","onMoveGroup","onRemoveGroup"].forEach(function(e){var i=t[e];if(i){if(!(i instanceof Function))throw new Error("option "+e+" must be a function "+e+"(item, callback)");this.options[e]=i}}.bind(this)),this.markDirty()}},n.prototype.markDirty=function(t){this.groupIds=[],t&&t.refreshItems&&l.forEach(this.items,function(t){t.dirty=!0,t.displayed&&t.redraw()})},n.prototype.destroy=function(){this.hide(),this.setItems(null),this.setGroups(null),this.hammer=null,this.body=null,this.conversion=null},n.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.axis.parentNode&&this.dom.axis.parentNode.removeChild(this.dom.axis),this.dom.labelSet.parentNode&&this.dom.labelSet.parentNode.removeChild(this.dom.labelSet)},n.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame),this.dom.axis.parentNode||this.body.dom.backgroundVertical.appendChild(this.dom.axis),this.dom.labelSet.parentNode||(this.options.rtl?this.body.dom.right.appendChild(this.dom.labelSet):this.body.dom.left.appendChild(this.dom.labelSet))},n.prototype.setSelection=function(t){var e,i,o,n;for(void 0==t&&(t=[]),Array.isArray(t)||(t=[t]),e=0,i=this.selection.length;e<i;e++)o=this.selection[e],(n=this.items[o])&&n.unselect();for(this.selection=[],e=0,i=t.length;e<i;
19287e++)o=t[e],(n=this.items[o])&&(this.selection.push(o),n.select())},n.prototype.getSelection=function(){return this.selection.concat([])},n.prototype.getVisibleItems=function(){var t,e,i=this.body.range.getRange();this.options.rtl?(t=this.body.util.toScreen(i.start),e=this.body.util.toScreen(i.end)):(e=this.body.util.toScreen(i.start),t=this.body.util.toScreen(i.end));var o=[];for(var n in this.groups)if(this.groups.hasOwnProperty(n))for(var s=this.groups[n],r=s.isVisible?s.visibleItems:[],a=0;a<r.length;a++){var h=r[a];this.options.rtl?h.right<e&&h.right+h.width>t&&o.push(h.id):h.left<t&&h.left+h.width>e&&o.push(h.id)}return o},n.prototype._deselect=function(t){for(var e=this.selection,i=0,o=e.length;i<o;i++)if(e[i]==t){e.splice(i,1);break}},n.prototype.redraw=function(){var t=this.options.margin,e=this.body.range,i=l.option.asSize,o=this.options,n=o.orientation.item,s=!1,r=this.dom.frame;this.props.top=this.body.domProps.top.height+this.body.domProps.border.top,this.options.rtl?this.props.right=this.body.domProps.right.width+this.body.domProps.border.right:this.props.left=this.body.domProps.left.width+this.body.domProps.border.left,r.className="vis-itemset",s=this._orderGroups()||s;var a=e.end-e.start,h=a!=this.lastVisibleInterval||this.props.width!=this.props.lastWidth,d=e.start!=this.lastRangeStart,u=o.stack!=this.lastStack,c=o.stackSubgroups!=this.lastStackSubgroups,p=h||d||u||c;this.lastVisibleInterval=a,this.lastRangeStart=e.start,this.lastStack=o.stack,this.lastStackSubgroups=o.stackSubgroups,this.props.lastWidth=this.props.width;var f=this._firstGroup(),m={item:t.item,axis:t.axis},v={item:t.item,axis:t.item.vertical/2},g=0,y=t.axis+t.item.vertical;this.groups[k].redraw(e,v,p);var b={},_=0;if(l.forEach(this.groups,function(t,i){if(i!==k){var o=t==f?m:v;b[i]=t.redraw(e,o,p,!0),_=b[i].length}}),_>0){for(var w={},x=0;x<_;x++)l.forEach(b,function(t,e){w[e]=t[x]()});l.forEach(this.groups,function(t,e){if(e!==k){var i=w[e];s=i||s,g+=t.height}}),g=Math.max(g,y)}return g=Math.max(g,y),r.style.height=i(g),this.props.width=r.offsetWidth,this.props.height=g,this.dom.axis.style.top=i("top"==n?this.body.domProps.top.height+this.body.domProps.border.top:this.body.domProps.top.height+this.body.domProps.centerContainer.height),this.options.rtl?this.dom.axis.style.right="0":this.dom.axis.style.left="0",this.initialItemSetDrawn=!0,s=this._isResized()||s},n.prototype._firstGroup=function(){var t="top"==this.options.orientation.item?0:this.groupIds.length-1,e=this.groupIds[t];return this.groups[e]||this.groups[x]||null},n.prototype._updateUngrouped=function(){var t,e,i=this.groups[x];if(this.groupsData){if(i){i.hide(),delete this.groups[x];for(e in this.items)if(this.items.hasOwnProperty(e)){t=this.items[e],t.parent&&t.parent.remove(t);var o=this._getGroupId(t.data),n=this.groups[o];n&&n.add(t)||t.hide()}}}else if(!i){i=new m(null,null,this),this.groups[x]=i;for(e in this.items)this.items.hasOwnProperty(e)&&(t=this.items[e],i.add(t));i.show()}},n.prototype.getLabelSet=function(){return this.dom.labelSet},n.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(l.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;l.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e),this._updateUngrouped()}this.body.emitter.emit("_change",{queue:!0})},n.prototype.getItems=function(){return this.itemsData},n.prototype.setGroups=function(t){var e,i=this;if(this.groupsData&&(l.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null,this._onRemoveGroups(e)),t){if(!(t instanceof u||t instanceof c))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var o=this.groupsData;this.groupsData instanceof c&&(o=this.groupsData.getDataSet()),o.get().forEac
19287h(function(t){t.nestedGroups&&t.nestedGroups.forEach(function(e){var i=o.get(e);i.nestedInGroup=t.id,0==t.showNested&&(i.visible=!1),o.update(i)})});var n=this.id;l.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}this._updateUngrouped(),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype.getGroups=function(){return this.groupsData},n.prototype.removeItem=function(t){var e=this.itemsData.get(t),i=this.itemsData.getDataSet();e&&this.options.onRemove(e,function(e){e&&i.remove(t)})},n.prototype._getType=function(t){return t.type||this.options.type||(t.end?"range":"box")},n.prototype._getGroupId=function(t){return"background"==this._getType(t)&&void 0==t.group?k:this.groupsData?t.group:x},n.prototype._onUpdate=function(t){var e=this;t.forEach(function(t){var i,o=e.itemsData.get(t,e.itemOptions),s=e.items[t],r=o?e._getType(o):null,a=n.types[r];if(s&&(a&&s instanceof a?e._updateItem(s,o):(i=s.selected,e._removeItem(s),s=null)),!s&&o){if(!a)throw"rangeoverflow"==r?new TypeError('Item type "rangeoverflow" is deprecated. Use css styling instead: .vis-item.vis-range .vis-item-content {overflow: visible;}'):new TypeError('Unknown item type "'+r+'"');s=new a(o,e.conversion,e.options),s.id=t,e._addItem(s),i&&(this.selection.push(t),s.select())}}.bind(this)),this._order(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onAdd=n.prototype._onUpdate,n.prototype._onRemove=function(t){var e=0,i=this;t.forEach(function(t){var o=i.items[t];o&&(e++,i._removeItem(o))}),e&&(this._order(),this.body.emitter.emit("_change",{queue:!0}))},n.prototype._order=function(){l.forEach(this.groups,function(t){t.order()})},n.prototype._onUpdateGroups=function(t){this._onAddGroups(t)},n.prototype._onAddGroups=function(t){var e=this;t.forEach(function(t){var i=e.groupsData.get(t),o=e.groups[t];if(o)o.setData(i);else{if(t==x||t==k)throw new Error("Illegal group id. "+t+" is a reserved id.");var n=(0,r.default)(e.options);l.extend(n,{height:null}),o=new m(t,i,e),e.groups[t]=o;for(var s in e.items)if(e.items.hasOwnProperty(s)){var a=e.items[s];a.data.group==t&&o.add(a)}o.order(),o.show()}}),this.body.emitter.emit("_change",{queue:!0})},n.prototype._onRemoveGroups=function(t){var e=this.groups;t.forEach(function(t){var i=e[t];i&&(i.hide(),delete e[t])}),this.markDirty(),this.body.emitter.emit("_change",{queue:!0})},n.prototype._orderGroups=function(){if(this.groupsData){var t=this.groupsData.getIds({order:this.options.groupOrder});t=this._orderNestedGroups(t);var e=!l.equalArray(t,this.groupIds);if(e){var i=this.groups;t.forEach(function(t){i[t].hide()}),t.forEach(function(t){i[t].show()}),this.groupIds=t}return e}return!1},n.prototype._orderNestedGroups=function(t){var e=[];return t.forEach(function(t){var i=this.groupsData.get(t);if(i.nestedInGroup||e.push(t),i.nestedGroups){var o=this.groupsData.get({filter:function(e){return e.nestedInGroup==t},order:this.options.groupOrder}),n=o.map(function(t){return t.id});e=e.concat(n)}},this),e},n.prototype._addItem=function(t){this.items[t.id]=t;var e=this._getGroupId(t.data),i=this.groups[e];i?i&&i.data&&i.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1,i&&i.add(t)},n.prototype._updateItem=function(t,e){t.setData(e);var i=this._getGroupId(t.data),o=this.groups[i];o?o&&o.data&&o.data.showNested&&(t.groupShowing=!0):t.groupShowing=!1},n.prototype._removeItem=function(t){t.hide(),delete this.items[t.id];var e=this.selection.indexOf(t.id);-1!=e&&this.selection.splice(e,1),t.parent&&t.parent.remove(t)},n.prototype._constructByEndArray=function(t){for(var e=[],i=0;i<t.length;i++)t[i]instanceof b&&e.push(t[i]);return e},n.prototype._onTouch=function(t){this.touchParams.item=this.itemFromTarget(t),this.touchParams.dragLeftItem=t.target.dragLeftItem||!1,this.touchParams.dragRightItem=t.target.dragRightItem||!1,this.touchParams.itemProps=null},n.prototype._getGroupIndex=function(t){for(var e=0;e<this.groupIds.length;e++)if(t==this.groupIds[e])return e},n.prototype._onDragStart=function(t){if(!this.touchParams.itemIsDragging){var e,i=this.touchParams.item||null,o=this;if(i&&(i.selected||this.options.itemsAlwaysDraggable.item)){if(this.options.editable.overrideItems&&!this.options.editable.updateTime&&!this.options.editable.updateGroup)return;if(null!=i.editable&&!i.editable.updateTime&&!i.editable.updateGroup&&!this.options.editable.overrideItems)return;var n=this.touchParams.dragLeftItem,s=this.touchParams.dragRightItem;if(this.touchParams.itemIsDragging=!0,this.touchParams.selectedItem=i,n)e={item:n,initialX:t.center.x,dragLeft:!0,data:this._cloneItemData(i.data)},this.touchParams.itemProps=[e];else if(s)e={item:s,initialX:t.center.x,dragRight:!0,data:this._cloneItemData(i.data)},this.touchParams.itemProps=[e];else if(this.options.editable.add&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey))this._onDragStartAddItem(t);else{this.groupIds.length<1&&this.redraw();var r=this._getGroupIndex(i.data.group),a=this.options.itemsAlwaysDraggable.item&&!i.selected?[i.id]:this.getSelection();this.touchParams.itemProps=a.map(function(e){var i=o.items[e],n=o._getGroupIndex(i.data.group);return{item:i,initialX:t.center.x,groupOffset:r-n,data:this._cloneItemData(i.data)}}.bind(this))}t.stopPropagation()}else this.options.editable.add&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey)&&this._onDragStartAddItem(t)}},n.prototype._onDragStartAddItem=function(t){var e,i,o=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x+10):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e-10);var n=this.body.util.toTime(i),s=this.body.util.getScale(),r=this.body.util.getStep(),a=o?o(n,s,r):n,h=a,d={type:"range",start:a,end:h,content:"new item"},u=l.randomUUID();d[this.itemsData._fieldId]=u;var c=this.groupFromTarget(t);c&&(d.group=c.groupId);var p=new b(d,this.conversion,this.options);p.id=u,p.data=this._cloneItemData(d),this._addItem(p),this.touchParams.selectedItem=p;var f={item:p,initialX:t.center.x,data:p.data};this.options.rtl?f.dragLeft=!0:f.dragRight=!0,this.touchParams.itemProps=[f],t.stopPropagation()},n.prototype._onDrag=function(t){if(this.touchParams.itemProps){t.stopPropagation();var e,i=this,o=this.options.snap||null;e=this.options.rtl?this.body.dom.root.offsetLeft+this.body.domProps.right.width:this.body.dom.root.offsetLeft+this.body.domProps.left.width;var n=this.body.util.getScale(),s=this.body.util.getStep(),r=this.touchParams.selectedItem,a=(this.options.editable.overrideItems||null==r.editable)&&this.options.editable.updateGroup||!this.options.editable.overrideItems&&null!=r.editable&&r.editable.updateGroup,h=null;if(a&&r&&void 0!=r.data.group){var d=i.groupFromTarget(t);d&&(h=this._getGroupIndex(d.groupId))}this.touchParams.itemProps.forEach(function(d){var u,c,p,f,m,v=i.body.util.toTime(t.center.x-e),g=i.body.util.toTime(d.initialX-e);u=this.options.rtl?-(v-g):v-g;var y=this._cloneItemData(d.item.data);if(null==d.item.editable||d.item.editable.updateTime||d.item.editable.updateGroup||i.options.editable.overrideItems){if((this.options.editable.overrideItems||null==r.editable)&&this.options.editable.updateTime||!this.options.editable.overrideItems&&null!=r.editable&&r.editable.updateTime)if(d.dragLeft)this.options.rtl?void 0!=y.end&&(p=l.convert(d.data.end,"Date"),m=new Date(p.valueOf()+u),y.end=o?o(m,n,s):m):void 0!=y.start&&(c=l.convert(d.data.start,"Date"),f=new Date(c.valueOf()+u),y.start=o?o(f,n,s):f);else if(d.dragRight)this.options.rtl?void 0!=y.start&&(c=l.convert(d.data.start,"Date"),f=new Date(c.valueOf()+u),y.start=o?o(f,n,s):f):void 0!=y.end&&(p=l.convert(d.data.end,"Date"),m=new Date(p.valueOf()+u),y.end=o?o(m,n,s):m);else if(void 0!=y.start)if(c=l.convert(d.data.start,"Date").valueOf(),f=new Date(c+u),void 0!=y.end){p=l.convert(d.data.end,"Date");var b=p.valueOf()-c.valueOf();y.start=o?o(f,n,s):f,y.end=new Date(y.start.valueOf()+b)}else y.start=o?o(f,n,s):f;if(a&&!d.dragLeft&&!d.dragRight&&null!=h&&void 0!=y.group){var _=h-d.groupOffset;_=Math.max(0,_),_=Math.min(i.groupIds.length-1,_),y.group=i.groupIds[_]}y=this._cloneItemData(y),i.options.onMoving(y,function(t){t&&d.item.setData(this._cloneItemData(t,"Date"))}.bind(this))}}.bind(this)),this.body.emitter.emit("_change")}},n.prototype._moveToGroup=function(t,e){var i=this.groups[e];if(i&&i.groupId!=t.data.group){var o=t.parent;o.remove(t),o.order(),t.data.group=i.groupId,i.add(t),i.order()}},n.prototype._onDragEnd=function(t){if(this.touchParams.itemIsDragging=!1,this.touchParams.itemProps){t.stopPropagation();var e=this,i=this.itemsData.getDataSet(),o=this.touchParams.itemProps;this.touchParams.itemProps=null,o.forEach(function(t){var o=t.item.id;if(null!=e.itemsData.get(o,e.itemOptions)){var n=this._cloneItemData(t.item.data);e.options.onMove(n,function(n){n?(n[i._fieldId]=o,i.update(n)):(t.item.setData(t.data),e.body.emitter.emit("_change"))})}else e.options.onAdd(t.item.data,function(i){e._removeItem(t.item),i&&e.itemsData.getDataSet().add(i),e.body.emitter.emit("_change")})}.bind(this))}},n.prototype._onGroupClick=function(t){var e=this.groupFromTarget(t);if(e&&e.nestedGroups){var i=this.groupsData.getDataSet(),o=i.get(e.groupId);void 0==o.showNested&&(o.showNested=!0),o.showNested=!o.showNested;var n=i.get(e.nestedGroups).map(function(t){return t.visible=o.showNested,t});if(i.update(n.concat(o)),o.showNested)l.removeClassName(e.dom.label,"collapsed"),l.addClassName(e.dom.label,"expanded");else{l.removeClassName(e.dom.label,"expanded");var s=this.options.rtl?"collapsed-rtl":"collapsed";l.addClassName(e.dom.label,s)}}},n.prototype._onGroupDragStart=function(t){this.options.groupEditable.order&&(this.groupTouchParams.group=this.groupFromTarget(t),this.groupTouchParams.group&&(t.stopPropagation(),this.groupTouchParams.originalOrder=this.groupsData.getIds({order:this.options.groupOrder})))},n.prototype._onGroupDrag=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this.groupsData;this.groupsData instanceof c&&(e=this.groupsData.getDataSet());var i=this.groupFromTarget(t);if(i&&i.height!=this.groupTouchParams.group.height){var o=i.top<this.groupTouchParams.group.top,n=t.center?t.center.y:t.clientY,s=l.getAbsoluteTop(i.dom.foreground),r=this.groupTouchParams.group.height;if(o){if(s+r<n)return}else{if(s+i.height-r>n)return}}if(i&&i!=this.groupTouchParams.group){var a=e.get(i.groupId),h=e.get(this.groupTouchParams.group.groupId);h&&a&&(this.options.groupOrderSwap(h,a,e),e.update(h),e.update(a));var d=e.getIds({order:this.options.groupOrder});if(!l.equalArray(d,this.groupTouchParams.originalOrder))for(var u=this.groupTouchParams.originalOrder,p=this.groupTouchParams.group.groupId,f=Math.min(u.length,d.length),m=0,v=0,g=0;m<f;){for(;m+v<f&&m+g<f&&d[m+v]==u[m+g];)m++;if(m+v>=f)break;
19287if(d[m+v]==p)v=1;else if(u[m+g]==p)g=1;else{var y=d.indexOf(u[m+g]),b=e.get(d[m+v]),_=e.get(u[m+g]);this.options.groupOrderSwap(b,_,e),e.update(b),e.update(_);var w=d[m+v];d[m+v]=u[m+g],d[y]=w,m++}}}}},n.prototype._onGroupDragEnd=function(t){if(this.options.groupEditable.order&&this.groupTouchParams.group){t.stopPropagation();var e=this,i=e.groupTouchParams.group.groupId,o=e.groupsData.getDataSet(),n=l.extend({},o.get(i));e.options.onMoveGroup(n,function(t){if(t)t[o._fieldId]=i,o.update(t);else{var n=o.getIds({order:e.options.groupOrder});if(!l.equalArray(n,e.groupTouchParams.originalOrder))for(var s=e.groupTouchParams.originalOrder,r=Math.min(s.length,n.length),a=0;a<r;){for(;a<r&&n[a]==s[a];)a++;if(a>=r)break;var h=n.indexOf(s[a]),d=o.get(n[a]),u=o.get(s[a]);e.options.groupOrderSwap(d,u,o),o.update(d),o.update(u);var c=n[a];n[a]=s[a],n[h]=c,a++}}}),e.body.emitter.emit("groupDragged",{groupId:i})}},n.prototype._onSelectItem=function(t){if(this.options.selectable){var e=t.srcEvent&&(t.srcEvent.ctrlKey||t.srcEvent.metaKey),i=t.srcEvent&&t.srcEvent.shiftKey;if(e||i)return void this._onMultiSelectItem(t);var o=this.getSelection(),n=this.itemFromTarget(t),s=n?[n.id]:[];this.setSelection(s);var r=this.getSelection();(r.length>0||o.length>0)&&this.body.emitter.emit("select",{items:r,event:t})}},n.prototype._onMouseOver=function(t){var e=this.itemFromTarget(t);if(e){if(e!==this.itemFromRelatedTarget(t)){var i=e.getTitle();if(this.options.showTooltips&&i){null==this.popup&&(this.popup=new w(this.body.dom.root,this.options.tooltip.overflowMethod||"flip")),this.popup.setText(i);var o=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(o)+o.offsetLeft,t.clientY-l.getAbsoluteTop(o)+o.offsetTop),this.popup.show()}else null!=this.popup&&this.popup.hide();this.body.emitter.emit("itemover",{item:e.id,event:t})}}},n.prototype._onMouseOut=function(t){var e=this.itemFromTarget(t);if(e){e!==this.itemFromRelatedTarget(t)&&(null!=this.popup&&this.popup.hide(),this.body.emitter.emit("itemout",{item:e.id,event:t}))}},n.prototype._onMouseMove=function(t){if(this.itemFromTarget(t)&&this.options.showTooltips&&this.options.tooltip.followMouse&&this.popup&&!this.popup.hidden){var e=this.body.dom.centerContainer;this.popup.setPosition(t.clientX-l.getAbsoluteLeft(e)+e.offsetLeft,t.clientY-l.getAbsoluteTop(e)+e.offsetTop),this.popup.show()}},n.prototype._onMouseWheel=function(t){this.touchParams.itemIsDragging&&this._onDragEnd(t)},n.prototype._onUpdateItem=function(t){if(this.options.selectable&&this.options.editable.add){var e=this;if(t){var i=e.itemsData.get(t.id);this.options.onUpdate(i,function(t){t&&e.itemsData.getDataSet().update(t)})}}},n.prototype._onDropObjectOnItem=function(t){var e=this.itemFromTarget(t),i=JSON.parse(t.dataTransfer.getData("text"));this.options.onDropObjectOnItem(i,e)},n.prototype._onAddItem=function(t){if(this.options.selectable&&this.options.editable.add){var e,i,o=this,n=this.options.snap||null;this.options.rtl?(e=l.getAbsoluteRight(this.dom.frame),i=e-t.center.x):(e=l.getAbsoluteLeft(this.dom.frame),i=t.center.x-e);var s,r,a=this.body.util.toTime(i),h=this.body.util.getScale(),d=this.body.util.getStep();"drop"==t.type?(r=JSON.parse(t.dataTransfer.getData("text")),r.content=r.content?r.content:"new item",r.start=r.start?r.start:n?n(a,h,d):a,r.type=r.type||"box",r[this.itemsData._fieldId]=r.id||l.randomUUID(),"range"!=r.type||r.end||(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s)):(r={start:n?n(a,h,d):a,content:"new item"},r[this.itemsData._fieldId]=l.randomUUID(),"range"===this.options.type&&(s=this.body.util.toTime(i+this.props.width/5),r.end=n?n(s,h,d):s));var u=this.groupFromTarget(t);u&&(r.group=u.groupId),r=this._cloneItemData(r),this.options.onAdd(r,function(e){e&&(o.itemsData.getDataSet().add(e),"drop"==t.type&&o.setSelection([e.id]))})}},n.prototype._onMultiSelectItem=function(t){if(this.options.selectable){var e=this.itemFromTarget(t);if(e){ 19288 var i=this.options.multiselect?this.getSelection():[];if((t.srcEvent&&t.srcEvent.shiftKey||!1)&&this.options.multiselect){var o=this.itemsData.get(e.id).group,s=void 0;this.options.multiselectPerGroup&&i.length>0&&(s=this.itemsData.get(i[0]).group),this.options.multiselectPerGroup&&void 0!=s&&s!=o||i.push(e.id);var r=n._getItemRange(this.itemsData.get(i,this.itemOptions));if(!this.options.multiselectPerGroup||s==o){i=[];for(var a in this.items)if(this.items.hasOwnProperty(a)){var h=this.items[a],d=h.data.start,l=void 0!==h.data.end?h.data.end:d;!(d>=r.min&&l<=r.max)||this.options.multiselectPerGroup&&s!=this.itemsData.get(h.id).group||h instanceof _||i.push(h.id)}}}else{var u=i.indexOf(e.id);-1==u?i.push(e.id):i.splice(u,1)}this.setSelection(i),this.body.emitter.emit("select",{items:this.getSelection(),event:t})}}},n._getItemRange=function(t){var e=null,i=null;return t.forEach(function(t){(null==i||t.start<i)&&(i=t.start),void 0!=t.end?(null==e||t.end>e)&&(e=t.end):(null==e||t.start>e)&&(e=t.start)}),{min:i,max:e}},n.prototype.itemFromElement=function(t){for(var e=t;e;){if(e.hasOwnProperty("timeline-item"))return e["timeline-item"];e=e.parentNode}return null},n.prototype.itemFromTarget=function(t){return this.itemFromElement(t.target)},n.prototype.itemFromRelatedTarget=function(t){return this.itemFromElement(t.relatedTarget)},n.prototype.groupFromTarget=function(t){var e=t.center?t.center.y:t.clientY,i=this.groupIds;i.length<=0&&this.groupsData&&(i=this.groupsData.getIds({order:this.options.groupOrder}));for(var o=0;o<i.length;o++){var n=i[o],s=this.groups[n],r=s.dom.foreground,a=l.getAbsoluteTop(r);if(e>a&&e<a+r.offsetHeight)return s;if("top"===this.options.orientation.item){if(o===this.groupIds.length-1&&e>a)return s}else if(0===o&&e<a+r.offset)return s}return null},n.itemSetFromTarget=function(t){for(var e=t.target;e;){if(e.hasOwnProperty("timeline-itemset"))return e["timeline-itemset"];e=e.parentNode}return null},n.prototype._cloneItemData=function(t,e){var i=l.extend({},t);return e||(e=this.itemsData.getDataSet()._options.type),void 0!=i.start&&(i.start=l.convert(i.start,e&&e.start||"Date")),void 0!=i.end&&(i.end=l.convert(i.end,e&&e.end||"Date")),i},t.exports=n}
19288,function(t,e,i){e.orderByStart=function(t){t.sort(function(t,e){return t.data.start-e.data.start})},e.orderByEnd=function(t){t.sort(function(t,e){return("end"in t.data?t.data.end:t.data.start)-("end"in e.data?e.data.end:e.data.start)})},e.stack=function(t,i,o){if(o)for(var n=0;n<t.length;n++)t[n].top=null;for(var n=0;n<t.length;n++){var s=t[n];if(s.stack&&null===s.top){s.top=i.axis;do{for(var r=null,a=0,h=t.length;a<h;a++){var d=t[a];if(null!==d.top&&d!==s&&d.stack&&e.collision(s,d,i.item,d.options.rtl)){r=d;break}}null!=r&&(s.top=r.top+r.height+i.item.vertical)}while(r)}}},e.substack=function(t,i,o){for(var n=0;n<t.length;n++)t[n].top=null;var s=o.height;for(n=0;n<t.length;n++){var r=t[n];if(r.stack&&null===r.top){r.top=r.baseTop;do{for(var a=null,h=0,d=t.length;h<d;h++){var l=t[h];if(null!==l.top&&l!==r&&e.collision(r,l,i.item,l.options.rtl)){a=l;break}}null!=a&&(r.top=a.top+a.height+i.item.vertical),r.top+r.height>s&&(s=r.top+r.height)}while(a)}}o.height=s-o.top+.5*i.item.vertical},e.nostack=function(t,i,o,n){for(var s=0;s<t.length;s++)if(void 0==t[s].data.subgroup)t[s].top=i.item.vertical;else if(void 0!==t[s].data.subgroup&&n){var r=0;for(var a in o)o.hasOwnProperty(a)&&1==o[a].visible&&o[a].index<o[t[s].data.subgroup].index&&(r+=o[a].height,o[t[s].data.subgroup].top=r);t[s].top=r+.5*i.item.vertical}n||e.stackSubgroups(t,i,o)},e.stackSubgroups=function(t,i,o){for(var n in o)if(o.hasOwnProperty(n)){o[n].top=0;do{var s=null;for(var r in o)if(null!==o[r].top&&r!==n&&o[n].index>o[r].index&&e.collisionByTimes(o[n],o[r])){s=o[r];break}null!=s&&(o[n].top=s.top+s.height)}while(s)}for(var a=0;a<t.length;a++)void 0!==t[a].data.subgroup&&(t[a].top=o[t[a].data.subgroup].top+.5*i.item.vertical)},e.stackSubgroupsWithInnerStack=function(t,i,o){var n=!1,s=[];for(var r in o)o[r].hasOwnProperty("index")?s[o[r].index]=r:s.push(r);for(var a=0;a<s.length;a++)if(r=s[a],o.hasOwnProperty(r)){n=n||o[r].stack,o[r].top=0;for(var h in o)o[h].visible&&o[r].index>o[h].index&&(o[r].top+=o[h].height);for(var d=t[r],l=0;l<d.length;l++)void 0!==d[l].data.subgroup&&(d[l].top=o[d[l].data.subgroup].top+.5*i.item.vertical,o[r].stack&&(d[l].baseTop=d[l].top));n&&o[r].stack&&e.substack(t[r],i,o[r])}},e.collision=function(t,e,i,o){return o?t.right-i.horizontal+.001<e.right+e.width&&t.right+t.width+i.horizontal-.001>e.right&&t.top-i.vertical+.001<e.top+e.height&&t.top+t.height+i.vertical-.001>e.top:t.left-i.horizontal+.001<e.left+e.width&&t.left+t.width+i.horizontal-.001>e.left&&t.top-i.vertical+.001<e.top+e.height&&t.top+t.height+i.vertical-.001>e.top},e.collisionByTimes=function(t,e){return t.start<=e.start&&t.end>=e.start&&t.top<e.top+e.height&&t.top+t.height>e.top||e.start<=t.start&&e.end>=t.start&&e.top<t.top+t.height&&e.top+e.height>t.top}},function(t,e,i){function o(t,e,i){if(this.props={dot:{width:0,height:0},line:{width:0,height:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.options.align,i=this.width*t.getMillisecondsPerPixel();return"right"==e?this.data.start.getTime()>t.start&&this.data.start.getTime()-i<t.end:"left"==e?this.data.start.getTime()+i>t.start&&this.data.start.getTime()<t.end:this.data.start.getTime()+i/2>t.start&&this.data.start.getTime()-i/2<t.end},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("DIV"),this.dom.content=document.createElement("DIV"),this.dom.content.className="vis-item-content",this.dom.box.appendChild(this.dom.content),this.dom.line=document.createElement("DIV"),this.dom.line.className="vis-line",this.dom.dot=document.createElement("DIV"),this.dom.dot.className="vis-dot",this.dom.box["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.box)}if(!this.dom.line.parentNode){var e=this.parent.dom.background;if(!e)throw new Error("Cannot redraw item: parent has no background container element");e.appendChild(this.dom.line)}if(!this.dom.dot.parentNode){var i=this.parent.dom.axis;
19288if(!e)throw new Error("Cannot redraw item: parent has no axis container element");i.appendChild(this.dom.dot)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.box),this._updateStyle(this.dom.box);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.box.className="vis-item vis-box"+e,this.dom.line.className="vis-item vis-line"+e,this.dom.dot.className="vis-item vis-dot"+e}},o.prototype._getDomComponentsSizes=function(){return{previous:{right:this.dom.box.style.right,left:this.dom.box.style.left},dot:{height:this.dom.dot.offsetHeight,width:this.dom.dot.offsetWidth},line:{width:this.dom.line.offsetWidth},box:{width:this.dom.box.offsetWidth,height:this.dom.box.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.options.rtl?this.dom.box.style.right="0px":this.dom.box.style.left="0px",this.props.dot.height=t.dot.height,this.props.dot.width=t.dot.width,this.props.line.width=t.line.width,this.width=t.box.width,this.height=t.box.height,this.options.rtl?this.dom.box.style.right=t.previous.right:this.dom.box.style.left=t.previous.left,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.box),this._repaintDragCenter(),this._repaintDeleteButton(this.dom.box)},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){if(this.displayed){var t=this.dom;t.box.parentNode&&t.box.parentNode.removeChild(t.box),t.line.parentNode&&t.line.parentNode.removeChild(t.line),t.dot.parentNode&&t.dot.parentNode.removeChild(t.dot),this.displayed=!1}},o.prototype.repositionX=function(){var t=this.conversion.toScreen(this.data.start),e=this.options.align;"right"==e?this.options.rtl?(this.right=t-this.width,this.dom.box.style.right=this.right+"px",this.dom.line.style.right=t-this.props.line.width+"px",this.dom.dot.style.right=t-this.props.line.width/2-this.props.dot.width/2+"px"):(this.left=t-this.width,this.dom.box.style.left=this.left+"px",this.dom.line.style.left=t-this.props.line.width+"px",this.dom.dot.style.left=t-this.props.line.width/2-this.props.dot.width/2+"px"):"left"==e?this.options.rtl?(this.right=t,this.dom.box.style.right=this.right+"px",this.dom.line.style.right=t+"px",this.dom.dot.style.right=t+this.props.line.width/2-this.props.dot.width/2+"px"):(this.left=t,this.dom.box.style.left=this.left+"px",this.dom.line.style.left=t+"px",this.dom.dot.style.left=t+this.props.line.width/2-this.props.dot.width/2+"px"):this.options.rtl?(this.right=t-this.width/2,this.dom.box.style.right=this.right+"px",this.dom.line.style.right=t-this.props.line.width+"px",this.dom.dot.style.right=t-this.props.dot.width/2+"px"):(this.left=t-this.width/2,this.dom.box.style.left=this.left+"px",this.dom.line.style.left=t-this.props.line.width/2+"px",this.dom.dot.style.left=t-this.props.dot.width/2+"px")},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.box,i=this.dom.line,o=this.dom.dot;if("top"==t)e.style.top=(this.top||0)+"px",i.style.top="0",i.style.height=this.parent.top+this.top+1+"px",i.style.bottom="";else{var n=this.parent.itemSet.props.height,s=n-this.parent.top-this.parent.height+this.top;e.style.top=(this.parent.height-this.top-this.height||0)+"px",i.style.top=n-s+"px",i.style.bottom="0"}o.style.top=-this.props.dot.height/2+"px"},o.prototype.getWidthLeft=function(){return this.width/2},o.prototype.getWidthRight=function(){return this.width/2},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={dot:{top:0,width:0,height:0},content:{height:0,marginLeft:0,marginRight:0}},this.options=i,t&&void 0==t.start)throw new Error('Property "start" missing in item '+t);n.call(this,t,e,i)}var n=i(38);o.prototype=new n(null,null,null),o.prototype.isVisible=function(t){var e=this.width*t.getMillisecondsPerPixel();return this.data.start.getTime()+e>t.start&&this.data.start<t.end},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.point=document.createElement("div"),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.point.a
19288ppendChild(this.dom.content),this.dom.dot=document.createElement("div"),this.dom.point.appendChild(this.dom.dot),this.dom.point["timeline-item"]=this,this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.point.parentNode){var t=this.parent.dom.foreground;if(!t)throw new Error("Cannot redraw item: parent has no foreground container element");t.appendChild(this.dom.point)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.point),this._updateStyle(this.dom.point);var t=this.editable.updateTime||this.editable.updateGroup,e=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"")+(t?" vis-editable":" vis-readonly");this.dom.point.className="vis-item vis-point"+e,this.dom.dot.className="vis-item vis-dot"+e}},o.prototype._getDomComponentsSizes=function(){return{dot:{width:this.dom.dot.offsetWidth,height:this.dom.dot.offsetHeight},content:{width:this.dom.content.offsetWidth,height:this.dom.content.offsetHeight},point:{width:this.dom.point.offsetWidth,height:this.dom.point.offsetHeight}}},o.prototype._updateDomComponentsSizes=function(t){this.props.dot.width=t.dot.width,this.props.dot.height=t.dot.height,this.props.content.height=t.content.height,this.options.rtl?this.dom.content.style.marginRight=2*this.props.dot.width+"px":this.dom.content.style.marginLeft=2*this.props.dot.width+"px",this.width=t.point.width,this.height=t.point.height,this.dom.dot.style.top=(this.height-this.props.dot.height)/2+"px",this.options.rtl?this.dom.dot.style.right=this.props.dot.width/2+"px":this.dom.dot.style.left=this.props.dot.width/2+"px",this.dirty=!1},o.prototype._repaintDomAdditionals=function(){this._repaintOnItemUpdateTimeTooltip(this.dom.point),this._repaintDragCenter(),this._repaintDeleteButton(this.dom.point)},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;return i.forEach(function(t){o=t()}),o},o.prototype.show=function(){this.displayed||this.redraw()},o.prototype.hide=function(){this.displayed&&(this.dom.point.parentNode&&this.dom.point.parentNode.removeChild(this.dom.point),this.displayed=!1)},o.prototype.repositionX=function(){var t=this.conversion.toScreen(this.data.start);this.options.rtl?(this.right=t-this.props.dot.width,this.dom.point.style.right=this.right+"px"):(this.left=t-this.props.dot.width,this.dom.point.style.left=this.left+"px")},o.prototype.repositionY=function(){var t=this.options.orientation.item,e=this.dom.point;e.style.top="top"==t?this.top+"px":this.parent.height-this.top-this.height+"px"},o.prototype.getWidthLeft=function(){return this.props.dot.width},o.prototype.getWidthRight=function(){return this.props.dot.width},t.exports=o},function(t,e,i){function o(t,e,i){if(this.props={content:{width:0}},this.overflow=!1,t){if(void 0==t.start)throw new Error('Property "start" missing in item '+t.id);if(void 0==t.end)throw new Error('Property "end" missing in item '+t.id)}n.call(this,t,e,i)}var n=i(38),s=i(69),r=i(70);o.prototype=new n(null,null,null),o.prototype.baseClassName="vis-item vis-background",o.prototype.stack=!1,o.prototype.isVisible=function(t){return this.data.start<t.end&&this.data.end>t.start},o.prototype._createDomElement=function(){this.dom||(this.dom={},this.dom.box=document.createElement("div"),this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-item-overflow",this.dom.box.appendChild(this.dom.frame),this.dom.content=document.createElement("div"),this.dom.content.className="vis-item-content",this.dom.frame.appendChild(this.dom.content),this.dirty=!0)},o.prototype._appendDomElement=function(){if(!this.parent)throw new Error("Cannot redraw item: no parent attached");if(!this.dom.box.parentNode){var t=this.parent.dom.background;if(!t)throw new Error("Cannot redraw item: parent has no background container element");t.appendChild(this.dom.box)}this.displayed=!0},o.prototype._updateDirtyDomComponents=function(){if(this.dirty){this._updateContents(this.dom.content),this._updateDataAttributes(this.dom.content),this._updateStyle(this.dom.box);var t=(this.data.className?" "+this.data.className:"")+(this.selected?" vis-selected":"");this.dom.box.className=this.baseClassName+t}},o.prototype._getDomComponentsSizes=function(){return this.overflow="hidden"!==window.getComputedStyle(this.dom.content).overflow,{content:{width:this.dom.content.offsetWidth}}},o.prototype._updateDomComponentsSizes=function(t){this.props.content.width=t.content.width,this.height=0,this.dirty=!1},o.prototype._repaintDomAdditionals=function(){},o.prototype.redraw=function(t){var e,i=[this._createDomElement.bind(this),this._appendDomElement.bind(this),this._updateDirtyDomComponents.bind(this),function(){this.dirty&&(e=this._getDomComponentsSizes.bind(this)())}.bind(this),function(){this.dirty&&this._updateDomComponentsSizes.bind(this)(e)}.bind(this),this._repaintDomAdditionals.bind(this)];if(t)return i;var o;
19288return i.forEach(function(t){o=t()}),o},o.prototype.show=r.prototype.show,o.prototype.hide=r.prototype.hide,o.prototype.repositionX=r.prototype.repositionX,o.prototype.repositionY=function(t){var e,i=this.options.orientation.item;if(void 0!==this.data.subgroup){var o=this.data.subgroup;this.dom.box.style.height=this.parent.subgroups[o].height+"px",this.dom.box.style.top="top"==i?this.parent.top+this.parent.subgroups[o].top+"px":this.parent.top+this.parent.height-this.parent.subgroups[o].top-this.parent.subgroups[o].height+"px",this.dom.box.style.bottom=""}else this.parent instanceof s?(e=Math.max(this.parent.height,this.parent.itemSet.body.domProps.center.height,this.parent.itemSet.body.domProps.centerContainer.height),this.dom.box.style.bottom="bottom"==i?"0":"",this.dom.box.style.top="top"==i?"0":""):(e=this.parent.height,this.dom.box.style.top=this.parent.top+"px",this.dom.box.style.bottom="");this.dom.box.style.height=e+"px"},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i){(0,s.default)(this,t),this.container=e,this.overflowMethod=i||"cap",this.x=0,this.y=0,this.padding=5,this.hidden=!1,this.frame=document.createElement("div"),this.frame.className="vis-tooltip",this.container.appendChild(this.frame)}return(0,a.default)(t,[{key:"setPosition",value:function(t,e){this.x=parseInt(t),this.y=parseInt(e)}},{key:"setText",value:function(t){t instanceof Element?(this.frame.innerHTML="",this.frame.appendChild(t)):this.frame.innerHTML=t}},{key:"show",value:function(t){if(void 0===t&&(t=!0),!0===t){var e=this.frame.clientHeight,i=this.frame.clientWidth,o=this.frame.parentNode.clientHeight,n=this.frame.parentNode.clientWidth,s=0,r=0;if("flip"==this.overflowMethod){var a=!1,h=!0;this.y-e<this.padding&&(h=!1),this.x+i>n-this.padding&&(a=!0),s=a?this.x-i:this.x,r=h?this.y-e:this.y}else r=this.y-e,r+e+this.padding>o&&(r=o-e-this.padding),r<this.padding&&(r=this.padding),s=this.x,s+i+this.padding>n&&(s=n-i-this.padding),s<this.padding&&(s=this.padding);this.frame.style.left=s+"px",this.frame.style.top=r+"px",this.frame.style.visibility="visible",this.hidden=!1}else this.hide()}},{key:"hide",value:function(){this.hidden=!0,this.frame.style.left="0",this.frame.style.top="0",this.frame.style.visibility="hidden"}},{key:"destroy",value:function(){this.frame.parentNode.removeChild(this.frame)}}]),t}();e.default=h},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r="object",a={configure:{enabled:{boolean:n},filter:{boolean:n,function:"function"},container:{dom:"dom"},__type__:{object:r,boolean:n,function:"function"}},align:{string:o},rtl:{boolean:n,undefined:"undefined"},rollingMode:{follow:{boolean:n},offset:{number:s,undefined:"undefined"},__type__:{object:r}},verticalScroll:{boolean:n,undefined:"undefined"},horizontalScroll:{boolean:n,undefined:"undefined"},autoResize:{boolean:n},throttleRedraw:{number:s},clickToUse:{boolean:n},dataAttributes:{string:o,array:"array"},editable:{add:{boolean:n,undefined:"undefined"},remove:{boolean:n,undefined:"undefined"},updateGroup:{boolean:n,undefined:"undefined"},updateTime:{boolean:n,undefined:"undefined"},overrideItems:{boolean:n,undefined:"undefined"},__type__:{boolean:n,object:r}},end:{number:s,date:"date",string:o,moment:"moment"},format:{minorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},week:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r,function:"function"}},majorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},week:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r,function:"function"}},__type__:{object:r}},moment:{function:"function"},groupOrder:{string:o,function:"function"},groupEditable:{add:{boolean:n,undefined:"undefined"},remove:{boolean:n,undefined:"undefined"},order:{boolean:n,undefined:"undefined"},__type__:{boolean:n,object:r}},groupOrderSwap:{function:"function"},height:{string:o,number:s},hiddenDates:{start:{date:"date",number:s,string:o,moment:"moment"},end:{date:"date",number:s,string:o,moment:"moment"},repeat:{string:o},__type__:{object:r,array:"array"}},itemsAlwaysDraggable:{item:{boolean:n,undefined:"undefined"},range:{boolean:n,undefined:"undefined"},__type__:{boolean:n,object:r}},limitSize:{boolean:n},locale:{string:o},locales:{__any__:{any:"any"},__type__:{object:r}},margin:{axis:{number:s},item:{horizontal:{number:s,undefined:"undefined"},vertical:{number:s,undefined:"undefined"},__type__:{object:r,number:s}},__type__:{object:r,number:s}},max:{date:"date",number:s,string:o,moment:"moment"},maxHeight:{number:s,string:o},maxMinorChars:{number:s},min:{date:"date",number:s,string:o,moment:"moment"},minHeight:{number:s,string:o},moveable:{boolean:n},multiselect:{boolean:n},multiselectPerGroup:{boolean:n},onAdd:{function:"function"},onDropObjectOnItem:{function:"function"},onUpdate:{function:"function"},onMove:{function:"function"},onMoving:{function:"function"},onRemove:{function:"function"},onAddGroup:{function:"function"},onMoveGroup:{function:"function"},onRemoveGroup:{function:"function"},onInitialDrawComplete:{function:"function"},order:{function:"function"},orientation:{axis:{string:o,undefined:"undefined"},item:{string:o,undefined:"undefined"},__type__:{string:o,object:r}},selectable:{boolean:n},showCurrentTime:{boolean:n},showMajorLabels:{boolean:n},showMinorLabels:{boolean:n},stack:{boolean:n},stackSubgroups:{boolean:n},snap:{function:"function",null:"null"},start:{date:"date",number:s,string:o,moment:"moment"},template:{function:"function"},groupTemplate:{function:"function"},visibleFrameTemplate:{string:o,function:"function"},showTooltips:{boolean:n},tooltip:{followMouse:{boolean:n},overflowMethod:{string:["cap","flip"]},__type__:{object:r}},tooltipOnItemUpdateTime:{template:{function:"function"},__type__:{boolean:n,object:r}},timeAxis:{scale:{string:o,undefined:"undefined"},step:{number:s,undefined:"undefined"},__type__:{object:r}},type:{string:o},width:{string:o,number:s},zoomable:{boolean:n},zoomKey:{string:["ctrlKey","altKey","metaKey",""]},zoomMax:{number:s},zoomMin:{number:s},__type__:{object:r}},h={global:{align:["center","left","right"],direction:!1,autoResize:!0,clickToUse:!1,editable:{add:!1,remove:!1,updateGroup:!1,updateTime:!1},end:"",format:{minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",week:"w",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",week:"MMMM YYYY",month:"YYYY",year:""}},groupsDraggable:!1,height:"",locale:"",margin:{axis:[20,0,100,1],item:{horizontal:[10,0,100,1],vertical:[10,0,100,1]}},max:"",maxHeight:"",maxMinorChars:[7,0,20,1],min:"",minHeight:"",moveable:!1,multiselect:!1,multiselectPerGroup:!1,orientation:{axis:["both","bottom","top"],item:["bottom","top"]},selectable:!0,showCurrentTime:!1,showMajorLabels:!0,showMinorLabels:!0,stack:!0,stackSubgroups:!0,start:"",showTooltips:!0,tooltip:{followMouse:!1,overflowMethod:"flip"},tooltipOnItemUpdateTime:!1,type:["box","point","range","background"],width:"100%",zoomable:!0,zoomKey:["ctrlKey","altKey","metaKey",""],zoomMax:[31536e10,10,31536e10,1],zoomMin:[10,10,31536e10,1]}};e.allOptions=a,e.configureOptions=h}
vendor: 5,713 bytes, line 19288
19288,function(t,e,i){function o(t,e){this.id=r.randomUUID(),this.body=t,this.defaultOptions={yAxisOrientation:"left",defaultGroup:"default",sort:!0,sampling:!0,stack:!1,graphHeight:"400px",shaded:{enabled:!1,orientation:"bottom"},style:"line",barChart:{width:50,sideBySide:!1,align:"center"},interpolation:{enabled:!0,parametrization:"centripetal",alpha:.5},drawPoints:{enabled:!0,size:6,style:"square"},dataAxis:{},legend:{},groups:{visibility:{}}},this.options=r.extend({},this.defaultOptions),this.dom={},this.props={},this.hammer=null,this.groups={},this.abortedGraphUpdate=!1,this.updateSVGheight=!1,this.updateSVGheightOnResize=!1,this.forceGraphUpdate=!0;var i=this;this.itemsData=null,this.groupsData=null,this.itemListeners={add:function(t,e,o){i._onAdd(e.items)},update:function(t,e,o){i._onUpdate(e.items)},remove:function(t,e,o){i._onRemove(e.items)}},this.groupListeners={add:function(t,e,o){i._onAddGroups(e.items)},update:function(t,e,o){i._onUpdateGroups(e.items)},remove:function(t,e,o){i._onRemoveGroups(e.items)}},this.items={},this.selection=[],this.lastStart=this.body.range.start,this.touchParams={},this.svgElements={},this.setOptions(e),this.groupsUsingDefaultStyles=[0],this.body.emitter.on("rangechanged",function(){i.lastStart=i.body.range.start,i.svg.style.left=r.option.asSize(-i.props.width),i.forceGraphUpdate=!0,i.redraw.call(i)}),this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups}}var n=i(6),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(14),h=i(11),d=i(12),l=i(16),u=i(107),c=i(109),p=i(112),f=i(110),m=i(111),v=i(72);o.prototype=new l,o.prototype._create=function(){var t=document.createElement("div");t.className="vis-line-graph",this.dom.frame=t,this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="relative",this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",this.svg.style.display="block",t.appendChild(this.svg),this.options.dataAxis.orientation="left",this.yAxisLeft=new u(this.body,this.options.dataAxis,this.svg,this.options.groups),this.options.dataAxis.orientation="right",this.yAxisRight=new u(this.body,this.options.dataAxis,this.svg,this.options.groups),delete this.options.dataAxis.orientation,this.legendLeft=new p(this.body,this.options.legend,"left",this.options.groups),this.legendRight=new p(this.body,this.options.legend,"right",this.options.groups),this.show()},o.prototype.setOptions=function(t){if(t){var e=["sampling","defaultGroup","stack","height","graphHeight","yAxisOrientation","style","barChart","dataAxis","sort","groups"];void 0===t.graphHeight&&void 0!==t.height?(this.updateSVGheight=!0,this.updateSVGheightOnResize=!0):void 0!==this.body.domProps.centerContainer.height&&void 0!==t.graphHeight&&parseInt((t.graphHeight+"").replace("px",""))<this.body.domProps.centerContainer.height&&(this.updateSVGheight=!0),r.selectiveDeepExtend(e,this.options,t),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),r.mergeOptions(this.options,t,"legend"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5)),this.yAxisLeft&&void 0!==t.dataAxis&&(this.yAxisLeft.setOptions(this.options.dataAxis),this.yAxisRight.setOptions(this.options.dataAxis)),this.legendLeft&&void 0!==t.legend&&(this.legendLeft.setOptions(this.options.legend),this.legendRight.setOptions(this.options.legend)),this.groups.hasOwnProperty("__ungrouped__")&&this.groups.__ungrouped__.setOptions(t)}this.dom.frame&&(this.forceGraphUpdate=!0,this.body.emitter.emit("_change",{queue:!0}))},o.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},o.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},o.prototype.setItems=function(t){var e,i=this,o=this.itemsData;if(t){if(!(t instanceof h||t instanceof d))throw new TypeError("Data must be an instance of DataSet or DataView");this.itemsData=t}else this.itemsData=null;if(o&&(r.forEach(this.itemListeners,function(t,e){o.off(e,t)}),e=o.getIds(),this._onRemove(e)),this.itemsData){var n=this.id;r.forEach(this.itemListeners,function(t,e){i.itemsData.on(e,t,n)}),e=this.itemsData.getIds(),this._onAdd(e)}},o.prototype.setGroups=function(t){var e,i=this;if(this.groupsData){r.forEach(this.groupListeners,function(t,e){i.groupsData.off(e,t)}),e=this.groupsData.getIds(),this.groupsData=null;for(var o=0;o<e.length;o++)this._removeGroup(e[o])}if(t){if(!(t instanceof h||t instanceof d))throw new TypeError("Data must be an instance of DataSet or DataView");this.groupsData=t}else this.groupsData=null;if(this.groupsData){var n=this.id;r.forEach(this.groupListeners,function(t,e){i.groupsData.on(e,t,n)}),e=this.groupsData.getIds(),this._onAddGroups(e)}},o.prototype._onUpdate=function(t){this._updateAllGroupData(t)},o.prototype._onAdd=function(t){this._onUpdate(t)},o.prototype._onRemove=function(t){this._onUpdate(t)},o.prototype._onUpdateGroups=function(t){this._updateAllGroupData(null,t)},o.prototype._onAddGroups=function(t){this._onUpdateGroups(t)},o.prototype._onRemoveGroups=function(t){for(var e=0;e<t.length;e++)this._removeGroup(t[e]);this.forceGraphUpdate=!0,this.body.emitter.emit("_change",{queue:!0})},o.prototype._removeGroup=function(t){this.groups.hasOwnProperty(t)&&("right"==this.groups[t].options.yAxisOr
19288ientation?(this.yAxisRight.removeGroup(t),this.legendRight.removeGroup(t),this.legendRight.redraw()):(this.yAxisLeft.removeGroup(t),this.legendLeft.removeGroup(t),this.legendLeft.redraw()),delete this.groups[t])},o.prototype._updateGroup=function(t,e){this.groups.hasOwnProperty(e)?(this.groups[e].update(t),"right"==this.groups[e].options.yAxisOrientation?(this.yAxisRight.updateGroup(e,this.groups[e]),this.legendRight.updateGroup(e,this.groups[e]),this.yAxisLeft.removeGroup(e),this.legendLeft.removeGroup(e)):(this.yAxisLeft.updateGroup(e,this.groups[e]),this.legendLeft.updateGroup(e,this.groups[e]),this.yAxisRight.removeGroup(e),this.legendRight.removeGroup(e))):(this.groups[e]=new c(t,e,this.options,this.groupsUsingDefaultStyles),"right"==this.groups[e].options.yAxisOrientation?(this.yAxisRight.addGroup(e,this.groups[e]),this.legendRight.addGroup(e,this.groups[e])):(this.yAxisLeft.addGroup(e,this.groups[e]),this.legendLeft.addGroup(e,this.groups[e]))),this.legendLeft.redraw(),this.legendRight.redraw()},o.prototype._updateAllGroupData=function(t,e){if(null!=this.itemsData){var i={},o=this.itemsData.get(),n=this.itemsData._fieldId,s={};t&&t.map(function(t){s[t]=t});for(var a={},h=0;h<o.length;h++){var d=o[h],l=d.group;null!==l&&void 0!==l||(l="__ungrouped__"),a.hasOwnProperty(l)?a[l]++:a[l]=1}var u={};if(!e&&t)for(l in this.groups)if(this.groups.hasOwnProperty(l)){v=this.groups[l];var c=v.getItems();i[l]=c.filter(function(t){return u[t[n]]=t[n],t[n]!==s[t[n]]});var p=a[l];a[l]-=i[l].length,i[l].length<p&&(i[l][p-1]={})}for(h=0;h<o.length;h++)if(d=o[h],l=d.group,null!==l&&void 0!==l||(l="__ungrouped__"),e||!t||d[n]===s[d[n]]||!u.hasOwnProperty(d[n])){i.hasOwnProperty(l)||(i[l]=new Array(a[l]));var f=r.bridgeObject(d);f.x=r.convert(d.x,"Date"),f.end=r.convert(d.end,"Date"),f.orginalY=d.y,f.y=Number(d.y), 19289 f[n]=d[n];var m=i[l].length-a[l]--;i[l][m]=f}for(l in this.groups)this.groups.hasOwnProperty(l)&&(i.hasOwnProperty(l)||(i[l]=new Array(0)));for(l in i)if(i.hasOwnProperty(l))if(0==i[l].length)this.groups.hasOwnProperty(l)&&this._removeGroup(l);else{var v=void 0;void 0!=this.groupsData&&(v=this.groupsData.get(l)),void 0==v&&(v={id:l,content:this.options.defaultGroup+l}),this._updateGroup(v,l),this.groups[l].setItems(i[l])}this.forceGraphUpdate=!0,this.body.emitter.emit("_change",{queue:!0})}},o.prototype.redraw=function(){var t=!1;this.props.width=this.dom.frame.offsetWidth,this.props.height=this.body.domProps.centerContainer.height-this.body.domProps.border.top-this.body.domProps.border.bottom,t=this._isResized()||t;var e=this.body.range.end-this.body.range.start,i=e!=this.lastVisibleInterval;if(this.lastVisibleInterval=e,1==t&&(this.svg.style.width=r.option.asSize(3*this.props.width),this.svg.style.left=r.option.asSize(-this.props.width),-1==(this.options.height+"").indexOf("%")&&1!=this.updateSVGheightOnResize||(this.updateSVGheight=!0)),1==this.updateSVGheight?(this.options.graphHeight!=this.props.height+"px"&&(this.options.graphHeight=this.props.height+"px",this.svg.style.height=this.props.height+"px"),this.updateSVGheight=!1):this.svg.style.height=(""+this.options.graphHeight).replace("px","")+"px",1==t||1==i||1==this.abortedGraphUpdate||1==this.forceGraphUpdate)t=this._updateGraph()||t,this.forceGraphUpdate=!1;else if(0!=this.lastStart){var o=this.body.range.start-this.lastStart,n=this.body.range.end-this.body.range.start;if(0!=this.props.width){var s=this.props.width/n,a=o*s;this.svg.style.left=-this.props.width-a+"px"}}return this.legendLeft.redraw(),this.legendRight.redraw(),t},o.prototype._getSortedGroupIds=function(){var t=[];for(var e in this.groups)if(this.groups.hasOwnProperty(e)){var i=this.groups[e];1!=i.visible||void 0!==this.options.groups.visibility[e]&&1!=this.options.groups.visibility[e]||t.push({id:e,zIndex:i.options.zIndex})}r.insertSort(t,function(t,e){var i=t.zIndex,o=e.zIndex;return void 0===i&&(i=0),void 0===o&&(o=0),i==o?0:i<o?-1:1});for(var o=new Array(t.length),n=0;n<t.length;n++)o[n]=t[n].id;return o},o.prototype._updateGraph=function(){if(a.prepareElements(this.svgElements),0!=this.props.width&&null!=this.itemsData){var t,e,i={},o=this.body.util.toGlobalTime(-this.body.domProps.root.width),n=this.body.util.toGlobalTime(2*this.body.domProps.root.width),s=this._getSortedGroupIds();if(s.length>0){var r={};
vendor: 5,085 bytes, line 19289
19289for(this._getRelevantData(s,r,o,n),this._applySampling(s,r),e=0;e<s.length;e++)this._convertXcoordinates(r[s[e]]);if(this._getYRanges(s,r,i),1==this._updateYAxis(s,i))return a.cleanupElements(this.svgElements),this.abortedGraphUpdate=!0,!0;this.abortedGraphUpdate=!1;var h=void 0;for(e=0;e<s.length;e++)t=this.groups[s[e]],!0===this.options.stack&&"line"===this.options.style&&(void 0!=t.options.excludeFromStacking&&t.options.excludeFromStacking||(void 0!=h&&(this._stack(r[t.id],r[h.id]),1==t.options.shaded.enabled&&"group"!==t.options.shaded.orientation&&("top"==t.options.shaded.orientation&&"group"!==h.options.shaded.orientation?(h.options.shaded.orientation="group",h.options.shaded.groupId=t.id):(t.options.shaded.orientation="group",t.options.shaded.groupId=h.id))),h=t)),this._convertYcoordinates(r[s[e]],t);var d={};for(e=0;e<s.length;e++)if(t=this.groups[s[e]],"line"===t.options.style&&1==t.options.shaded.enabled){var l=r[s[e]];if(null==l||0==l.length)continue;if(d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(l,t)),"group"===t.options.shaded.orientation){var u=t.options.shaded.groupId;if(-1===s.indexOf(u)){console.log(t.id+": Unknown shading group target given:"+u);continue}d.hasOwnProperty(u)||(d[u]=m.calcPath(r[u],this.groups[u])),m.drawShading(d[s[e]],t,d[u],this.framework)}else m.drawShading(d[s[e]],t,void 0,this.framework)}for(f.draw(s,r,this.framework),e=0;e<s.length;e++)if(t=this.groups[s[e]],r[s[e]].length>0)switch(t.options.style){case"line":d.hasOwnProperty(s[e])||(d[s[e]]=m.calcPath(r[s[e]],t)),m.draw(d[s[e]],t,this.framework);case"point":case"points":"point"!=t.options.style&&"points"!=t.options.style&&1!=t.options.drawPoints.enabled||v.draw(r[s[e]],t,this.framework)}}}return a.cleanupElements(this.svgElements),!1},o.prototype._stack=function(t,e){var i,o,n,s,r;i=0;for(var a=0;a<t.length;a++){s=void 0,r=void 0;for(var h=i;h<e.length;h++){if(e[h].x===t[a].x){s=e[h],r=e[h],i=h;break}if(e[h].x>t[a].x){r=e[h],s=0==h?r:e[h-1],i=h;break}}void 0===r&&(s=e[e.length-1],r=e[e.length-1]),o=r.x-s.x,n=r.y-s.y,t[a].y=0==o?t[a].orginalY+r.y:t[a].orginalY+n/o*(t[a].x-s.x)+s.y}},o.prototype._getRelevantData=function(t,e,i,o){var n,s,a,h;if(t.length>0)for(s=0;s<t.length;s++){n=this.groups[t[s]];var d=n.getItems();if(1==n.options.sort){var l=function(t,e){return t.getTime()==e.getTime()?0:t<e?-1:1},u=Math.max(0,r.binarySearchValue(d,i,"x","before",l)),c=Math.min(d.length,r.binarySearchValue(d,o,"x","after",l)+1);c<=0&&(c=d.length);var p=new Array(c-u);for(a=u;a<c;a++)h=n.itemsData[a],p[a-u]=h;e[t[s]]=p}else e[t[s]]=n.itemsData}},o.prototype._applySampling=function(t,e){var i;if(t.length>0)for(var o=0;o<t.length;o++)if(i=this.groups[t[o]],1==i.options.sampling){var n=e[t[o]];if(n.length>0){var s=1,r=n.length,a=this.body.util.toGlobalScreen(n[n.length-1].x)-this.body.util.toGlobalScreen(n[0].x),h=r/a;s=Math.min(Math.ceil(.2*r),Math.max(1,Math.round(h)));for(var d=new Array(r),l=0;l<r;l+=s){var u=Math.round(l/s);d[u]=n[l]}e[t[o]]=d.splice(0,Math.round(r/s))}}},o.prototype._getYRanges=function(t,e,i){var o,n,s,r,a=[],h=[];if(t.length>0){for(s=0;s<t.length;s++)o=e[t[s]],r=this.groups[t[s]].options,o.length>0&&(n=this.groups[t[s]],!0===r.stack&&"bar"===r.style?"left"===r.yAxisOrientation?a=a.concat(o):h=h.concat(o):i[t[s]]=n.getYRange(o,t[s]));f.getStackedYRange(a,i,t,"__barStackLeft","left"),f.getStackedYRange(h,i,t,"__barStackRight","right")}},o.prototype._updateYAxis=function(t,e){var i,o,n=!1,s=!1,r=!1,a=1e9,h=1e9,d=-1e9,l=-1e9;if(t.length>0){for(var u=0;u<t.length;u++){var c=this.groups[t[u]];c&&"right"!=c.options.yAxisOrientation?(s=!0,a=1e9,d=-1e9):c&&c.options.yAxisOrientation&&(r=!0,h=1e9,l=-1e9)}for(u=0;u<t.length;u++)e.hasOwnProperty(t[u])&&!0!==e[t[u]].ignore&&(i=e[t[u]].min,o=e[t[u]].max,"right"!=e[t[u]].yAxisOrientation?(s=!0,a=a>i?i:a,d=d<o?o:d):(r=!0,h=h>i?i:h,l=l<o?o:l));1==s&&this.yAxisLeft.setRange(a,d),1==r&&this.yAxisRight.setRange(h,l)}n=this._toggleAxisVisiblity(s,this.yAxisLeft)||n,n=this._toggleAxisVisiblity(r,this.yAxisRight)||n,1==r&&1==s?(this.yAxisLeft.drawIcons=!0,this.yAxisRight.drawIcons=!0):(this.yAxisLeft.drawIcons=!1,this.yAxisRight.drawIcons=!1),this.yAxisRight.master=!s,this.yAxisRight.masterAxis=this.yAxisLeft,0==this.yAxisRight.master?(this.yAxisLeft.lineOffset=1==r?this.yAxisRight.width:0,n=this.yAxisLeft.redraw()||n,n=this.yAxisRight.redraw()||n):n=this.yAxisRight.redraw()||n;var p=["__barStackLeft","__barStackRight","__lineStackLeft","__lineStackRight"];for(u=0;u<p.length;u++)-1!=t.indexOf(p[u])&&t.splice(t.indexOf(p[u]),1);return n},o.prototype._toggleAxisVisiblity=function(t,e){var i=!1;return 0==t?e.dom.frame.parentNode&&0==e.hidden&&(e.hide(),i=!0):e.dom.frame.parentNode||1!=e.hidden||(e.show(),i=!0),i},o.prototype._convertXcoordinates=function(t){for(var e=this.body.util.toScreen,i=0;i<t.length;i++)t[i].screen_x=e(t[i].x)+this.props.width,t[i].screen_y=t[i].y,void 0!=t[i].end?t[i].screen_end=e(t[i].end)+this.props.width:t[i].screen_end=void 0},o.prototype._convertYcoordinates=function(t,e){var i=this.yAxisLeft,o=Number(this.svg.style.height.replace("px",""));
19289"right"==e.options.yAxisOrientation&&(i=this.yAxisRight);for(var n=0;n<t.length;n++)t[n].screen_y=Math.round(i.convertValue(t[n].y));e.setZeroPosition(Math.min(o,i.convertValue(0)))},t.exports=o},function(t,e,i){function o(t,e,i,o){this.id=r.randomUUID(),this.body=t,this.defaultOptions={orientation:"left",showMinorLabels:!0,showMajorLabels:!0,icons:!1,majorLinesOffset:7,minorLinesOffset:4,labelOffsetX:10,labelOffsetY:2,iconWidth:20,width:"40px",visible:!0,alignZeros:!0,left:{range:{min:void 0,max:void 0},format:function(t){return""+parseFloat(t.toPrecision(3))},title:{text:void 0,style:void 0}},right:{range:{min:void 0,max:void 0},format:function(t){return""+parseFloat(t.toPrecision(3))},title:{text:void 0,style:void 0}}},this.linegraphOptions=o,this.linegraphSVG=i,this.props={},this.DOMelements={lines:{},labels:{},title:{}},this.dom={},this.scale=void 0,this.range={start:0,end:0},this.options=r.extend({},this.defaultOptions),this.conversionFactor=1,this.setOptions(e),this.width=Number((""+this.options.width).replace("px","")),this.minWidth=this.width,this.height=this.linegraphSVG.getBoundingClientRect().height,this.hidden=!1,this.stepPixels=25,this.zeroCrossing=-1,this.amountOfSteps=-1,this.lineOffset=0,this.master=!0,this.masterAxis=null,this.svgElements={},this.iconsRemoved=!1,this.groups={},this.amountOfGroups=0,this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups};var n=this;this.body.emitter.on("verticalDrag",function(){n.dom.lineContainer.style.top=n.body.domProps.scrollTop+"px"})}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(14),h=i(16),d=i(108);o.prototype=new h,o.prototype.addGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1},o.prototype.updateGroup=function(t,e){this.groups.hasOwnProperty(t)||(this.amountOfGroups+=1),this.groups[t]=e},o.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},o.prototype.setOptions=function(t){if(t){var e=!1;this.options.orientation!=t.orientation&&void 0!==t.orientation&&(e=!0);var i=["orientation","showMinorLabels","showMajorLabels","icons","majorLinesOffset","minorLinesOffset","labelOffsetX","labelOffsetY","iconWidth","width","visible","left","right","alignZeros"];r.selectiveDeepExtend(i,this.options,t),this.minWidth=Number((""+this.options.width).replace("px","")),!0===e&&this.dom.frame&&(this.hide(),this.show())}},o.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.style.width=this.options.width,this.dom.frame.style.height=this.height,this.dom.lineContainer=document.createElement("div"),this.dom.lineContainer.style.width="100%",this.dom.lineContainer.style.height=this.height,this.dom.lineContainer.style.position="relative",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.height="100%",this.svg.style.width="100%",this.svg.style.display="block",this.dom.frame.appendChild(this.svg)},o.prototype._redrawGroupIcons=function(){a.prepareElements(this.svgElements);var t,e=this.options.iconWidth,i=11.5;t="left"===this.options.orientation?4:this.width-e-4;var o=(0,s.default)(this.groups);o.sort(function(t,e){return t<e?-1:1});for(var n=0;n<o.length;n++){var r=o[n];!0!==this.groups[r].visible||void 0!==this.linegraphOptions.visibility[r]&&!0!==this.linegraphOptions.visibility[r]||(this.groups[r].getLegend(e,15,this.framework,t,i),i+=19)}a.cleanupElements(this.svgElements),this.iconsRemoved=!1},o.prototype._cleanupIcons=function(){!1===this.iconsRemoved&&(a.prepareElements(this.svgElements),a.cleanupElements(this.svgElements),this.iconsRemoved=!0)},o.prototype.show=function(){this.hidden=!1,this.dom.frame.parentNode||("left"===this.options.orientation?this.body.dom.left.appendChild(this.dom.frame):this.body.dom.right.appendChild(this.dom.frame)),this.dom.lineContainer.parentNode||this.body.dom.backgroundHorizontal.appendChild(this.dom.lineContainer)},o.prototype.hide=function(){this.hidden=!0,this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame),this.dom.lineContainer.parentNode&&this.dom.lineContainer.parentNode.removeChild(this.dom.lineContainer)},o.prototype.setRange=function(t,e){this.range.start=t,this.range.end=e},o.prototype.redraw=function(){var t=!1,e=0;this.dom.lineContainer.style.top=this.body.domProps.scrollTop+"px";for(var i in this.groups)this.groups.hasOwnProperty(i)&&(!0!==this.groups[i].visible||void 0!==this.linegraphOptions.visibility[i]&&!0!==this.linegraphOptions.visibility[i]||e++);if(0===this.amountOfGroups||0===e)this.hide();else{this.show(),this.height=Number(this.linegraphSVG.style.height.replace("px","")),this.dom.lineContainer.style.height=this.height+"px",this.width=!0===this.options.visible?Number((""+this.options.width).replace("px","")):0;var o=this.props,n=this.dom.frame;n.className="vis-data-axis",this._calculateCharSize();var s=this.options.orientation,r=this.options.showMinorLabels,a=this.options.showMajorLabels;o.minorLabelHeight=r?o.minorCharHeight:0,o.majorLabelHeight=a?o.majorCharHeight:0,o.minorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.minorLinesOffset,o.minorLineHeight=1,o.majorLineWidth=this.body.dom.backgroundHorizontal.offsetWidth-this.lineOffset-this.width+2*this.options.majorLinesOffset,o.majorLineHeight=1,"left"===s?(n.style.top="0",n.style.left="0",n.style.bottom="",n.style.width=this.width+"px",n.style.height=this.height+"px",this.props.width=this.body.domProps.left.width,this.props.height=this.body.domProps.left.height):(n.style.top="",n.style.bottom="0",n.style.left="0",n.style.width=this.width+"px",n.style.height=this.height+"px",this.props.width=this.body.domProps.right.width,this.props.height=this.body.domProps.right.height),t=this._redrawLabels(),t=this._isResized()||t,!0===this.options.icons?this._redrawGroupIcons():this._cleanupIcons(),this._redrawTitle(s)}return t},o.prototype._redrawLabels=function(){var t=this,e=!1;a.prepareElements(this.DOMelements.lines),a.prepareElements(this.DOMelements.labels);var i=this.options.orientation,o=void 0!=this.options[i].range?this.options[i].range:{},n=!0;void 0!=o.max&&(this.range.end=o.max,n=!1);var s=!0;void 0!=o.min&&(this.range.start=o.min,s=!1),this.scale=new d(this.range.start,this.range.end,s,n,this.dom.frame.offsetHeight,this.props.majorCharHeight,this.options.alignZeros,this.options[i].format),!1===this.master&&void 0!=this.masterAxis&&this.scale.followScale(this.masterAxis.scale),this.maxLabelSize=0,this.scale.getLines().forEac
19289h(function(e){var o=e.y,n=e.major;t.options.showMinorLabels&&!1===n&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-minor",t.props.minorCharHeight),n&&o>=0&&t._redrawLabel(o-2,e.val,i,"vis-y-axis vis-major",t.props.majorCharHeight),!0===t.master&&(n?t._redrawLine(o,i,"vis-grid vis-horizontal vis-major",t.options.majorLinesOffset,t.props.majorLineWidth):t._redrawLine(o,i,"vis-grid vis-horizontal vis-minor",t.options.minorLinesOffset,t.props.minorLineWidth))});var r=0;void 0!==this.options[i].title&&void 0!==this.options[i].title.text&&(r=this.props.titleCharHeight);var h=!0===this.options.icons?Math.max(this.options.iconWidth,r)+this.options.labelOffsetX+15:r+this.options.labelOffsetX+15;return this.maxLabelSize>this.width-h&&!0===this.options.visible?(this.width=this.maxLabelSize+h,this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):this.maxLabelSize<this.width-h&&!0===this.options.visible&&this.width>this.minWidth?(this.width=Math.max(this.minWidth,this.maxLabelSize+h),this.options.width=this.width+"px",a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),this.redraw(),e=!0):(a.cleanupElements(this.DOMelements.lines),a.cleanupElements(this.DOMelements.labels),e=!1),e},o.prototype.convertValue=function(t){return this.scale.convertValue(t)},o.prototype.screenToValue=function(t){return this.scale.screenToValue(t)},o.prototype._redrawLabel=function(t,e,i,o,n){var s=a.getDOMElement("div",this.DOMelements.labels,this.dom.frame);s.className=o,s.innerHTML=e,"left"===i?(s.style.left="-"+this.options.labelOffsetX+"px",s.style.textAlign="right"):(s.style.right="-"+this.options.labelOffsetX+"px",s.style.textAlign="left"),s.style.top=t-.5*n+this.options.labelOffsetY+"px",e+="";var r=Math.max(this.props.majorCharWidth,this.props.minorCharWidth);this.maxLabelSize<e.length*r&&(this.maxLabelSize=e.length*r)},o.prototype._redrawLine=function(t,e,i,o,n){if(!0===this.master){var s=a.getDOMElement("div",this.DOMelements.lines,this.dom.lineContainer);s.className=i,s.innerHTML="","left"===e?s.style.left=this.width-o+"px":s.style.right=this.width-o+"px",s.style.width=n+"px",s.style.top=t+"px"}},o.prototype._redrawTitle=function(t){if(a.prepareElements(this.DOMelements.title),void 0!==this.options[t].title&&void 0!==this.options[t].title.text){var e=a.getDOMElement("div",this.DOMelements.title,this.dom.frame);e.className="vis-y-axis vis-title vis-"+t,e.innerHTML=this.options[t].title.text,void 0!==this.options[t].title.style&&r.addCssText(e,this.options[t].title.style),"left"===t?e.style.left=this.props.titleCharHeight+"px":e.style.right=this.props.titleCharHeight+"px",e.style.width=this.height+"px"}a.cleanupElements(this.DOMelements.title)},o.prototype._calculateCharSize=function(){if(!("minorCharHeight"in this.props)){var t=document.createTextNode("0"),e=document.createElement("div");e.className="vis-y-axis vis-minor vis-measure",e.appendChild(t),this.dom.frame.appendChild(e),this.props.minorCharHeight=e.clientHeight,this.props.minorCharWidth=e.clientWidth,this.dom.frame.removeChild(e)}if(!("majorCharHeight"in this.props)){var i=document.createTextNode("0"),o=document.createElement("div");o.className="vis-y-axis vis-major vis-measure",o.appendChild(i),this.dom.frame.appendChild(o),this.props.majorCharHeight=o.clientHeight,this.props.majorCharWidth=o.clientWidth,this.dom.frame.removeChild(o)}if(!("titleCharHeight"in this.props)){var n=document.createTextNode("0"),s=document.createElement("div");s.className="vis-y-axis vis-title vis-measure",s.appendChild(n),this.dom.frame.appendChild(s),this.props.titleCharHeight=s.clientHeight,this.props.titleCharWidth=s.clientWidth,this.dom.frame.removeChild(s)}},t.exports=o},function(t,e,i){function o(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]&&arguments[6],a=arguments.length>7&&void 0!==arguments[7]&&arguments[7];if(this.majorSteps=[1,2,5,10],this.minorSteps=[.25,.5,1,2],this.customLines=null,this.containerHeight=n,this.majorCharHeight=s,this._start=t,this._end=e,this.scale=1,this.minorStepIdx=-1,this.magnitudefactor=1,this.determineScale(),this.zeroAlign=r,this.autoScaleStart=i,this.autoScaleEnd=o,this.formattingFunction=a,i||o){var h=this,d=function(t){var e=t-t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx]);return t%(h.magnitudefactor*h.minorSteps[h.minorStepIdx])>h.magnitudefactor*h.minorSteps[h.minorStepIdx]*.5?e+h.magnitudefactor*h.minorSteps[h.minorStepIdx]:e};i&&(this._start-=2*this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._start=d(this._start)),o&&(this._end+=this.magnitudefactor*this.minorSteps[this.minorStepIdx],this._end=d(this._end)),this.determineScale()}}o.prototype.setCharHeight=function(t){this.majorCharHeight=t},o.prototype.setHeight=function(t){this.containerHeight=t},o.prototype.determineScale=function(){var t=this._end-this._start;this.scale=this.containerHeight/t;var e=this.majorCharHeight/this.scale,i=t>0?Math.round(Math.log(t)/Math.LN10):0;this.minorStepIdx=-1,this.magnitudefactor=Math.pow(10,i);var o=0;i<0&&(o=i);for(var n=!1,s=o;Math.abs(s)<=Math.abs(i);s++){this.magnitudefactor=Math.pow(10,s);for(var r=0;r<this.minorSteps.length;r++){if(this.magnitudefactor*this.minorSteps[r]>=e){n=!0,this.minorStepIdx=r;break}}if(!0===n)break}},o.prototype.is_major=function(t){return t%(this.magnitudefactor*this.majorSteps[this.minorStepIdx])==0},o.prototype.getStep=function(){return this.magnitudefactor*this.minorSteps[this.minorStepIdx]},o.prototype.getFirstMajor=function(){var t=this.magnitudefactor*this.majorSteps[this.minorStepIdx];return this.convertValue(this._start+(t-this._start%t)%t)},o.prototype.formatValue=function(t){var e=t.toPrecision(5);return"function"==typeof this.formattingFunction&&(e=this.formattingFunction(t)),"number"==typeof e?""+e:"string"==typeof e?e:t.toPrecision(5)},o.prototype.getLines=function(){for(var t=[],e=this.getStep(),i=(e-this._start%e)%e,o=this._start+i;this._end-o>1e-5;o+=e)o!=this._start&&t.push({major:this.is_major(o),y:this.convertValue(o),val:this.formatValue(o)});return t},o.prototype.followScale=function(t){var e=this.minorStepIdx,i=this._start,o=this._end,n=this,s=function(){n.magnitudefactor*=2},r=function(){n.magnitudefactor/=2};t.minorStepIdx<=1&&this.minorStepIdx<=1||t.minorStepIdx>1&&this.minorStepIdx>1||(t.minorStepIdx<this.minorStepIdx?(this.minorStepIdx=1,2==e?s():(s(),s())):(this.minorStepIdx=2,1==e?r():(r(),r())));for(var a=t.convertValue(0),h=t.getStep()*t.scale,d=!1,l=0;
19289!d&&l++<5;){this.scale=h/(this.minorSteps[this.minorStepIdx]*this.magnitudefactor);var u=this.containerHeight/this.scale;this._start=i,this._end=this._start+u;var c=this._end*this.scale,p=this.magnitudefactor*this.majorSteps[this.minorStepIdx],f=this.getFirstMajor()-t.getFirstMajor();if(this.zeroAlign){var m=a-c;this._end+=m/this.scale,this._start=this._end-u}else this.autoScaleStart?(this._start-=f/this.scale,this._end=this._start+u):(this._start+=p-f/this.scale,this._end=this._start+u);if(!this.autoScaleEnd&&this._end>o+1e-5)r(),d=!1;else{if(!this.autoScaleStart&&this._start<i-1e-5){if(!(this.zeroAlign&&i>=0)){r(),d=!1;continue}console.warn("Can't adhere to given 'min' range, due to zeroalign")}this.autoScaleStart&&this.autoScaleEnd&&u<o-i?(s(),d=!1):d=!0}}},o.prototype.convertValue=function(t){return this.containerHeight-(t-this._start)*this.scale},o.prototype.screenToValue=function(t){return(this.containerHeight-t)/this.scale+this._start},t.exports=o},function(t,e,i){function o(t,e,i,o){this.id=e;var n=["sampling","style","sort","yAxisOrientation","barChart","drawPoints","shaded","interpolation","zIndex","excludeFromStacking","excludeFromLegend"];this.options=r.selectiveBridgeObject(n,i),this.usingDefaultStyle=void 0===t.className,this.groupsUsingDefaultStyles=o,this.zeroPosition=0,this.update(t),1==this.usingDefaultStyle&&(this.groupsUsingDefaultStyles[0]+=1),this.itemsData=[],this.visible=void 0===t.visible||t.visible}var n=i(6),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(110),h=i(111),d=i(72);o.prototype.setItems=function(t){null!=t?(this.itemsData=t,1==this.options.sort&&r.insertSort(this.itemsData,function(t,e){return t.x>e.x?1:-1})):this.itemsData=[]},o.prototype.getItems=function(){return this.itemsData},o.prototype.setZeroPosition=function(t){this.zeroPosition=t},o.prototype.setOptions=function(t){if(void 0!==t){var e=["sampling","style","sort","yAxisOrientation","barChart","zIndex","excludeFromStacking","excludeFromLegend"];r.selectiveDeepExtend(e,this.options,t),"function"==typeof t.drawPoints&&(t.drawPoints={onRender:t.drawPoints}),r.mergeOptions(this.options,t,"interpolation"),r.mergeOptions(this.options,t,"drawPoints"),r.mergeOptions(this.options,t,"shaded"),t.interpolation&&"object"==(0,s.default)(t.interpolation)&&t.interpolation.parametrization&&("uniform"==t.interpolation.parametrization?this.options.interpolation.alpha=0:"chordal"==t.interpolation.parametrization?this.options.interpolation.alpha=1:(this.options.interpolation.parametrization="centripetal",this.options.interpolation.alpha=.5))}},o.prototype.update=function(t){this.group=t,this.content=t.content||"graph",this.className=t.className||this.className||"vis-graph-group"+this.groupsUsingDefaultStyles[0]%10,this.visible=void 0===t.visible||t.visible,this.style=t.style,this.setOptions(t.options)},o.prototype.getLegend=function(t,e,i,o,n){if(void 0==i||null==i){i={svg:document.createElementNS("http://www.w3.org/2000/svg","svg"),svgElements:{},options:this.options,groups:[this]}}switch(void 0!=o&&null!=o||(o=0),void 0!=n&&null!=n||(n=.5*e),this.options.style){case"line":h.drawIcon(this,o,n,t,e,i);break;case"points":case"point":d.drawIcon(this,o,n,t,e,i);break;case"bar":a.drawIcon(this,o,n,t,e,i)}return{icon:i.svg,label:this.content,orientation:this.options.yAxisOr
19289ientation}},o.prototype.getYRange=function(t){for(var e=t[0].y,i=t[0].y,o=0;o<t.length;o++)e=e>t[o].y?t[o].y:e,i=i<t[o].y?t[o].y:i;return{min:e,max:i,yAxisOrientation:this.options.yAxisOrientation}},t.exports=o},function(t,e,i){function o(t,e){}var n=i(14),s=i(72);o.drawIcon=function(t,e,i,o,s,r){var a=.5*s,h=n.getSVGElement("rect",r.svgElements,r.svg);h.setAttributeNS(null,"x",e),h.setAttributeNS(null,"y",i-a),h.setAttributeNS(null,"width",o),h.setAttributeNS(null,"height",2*a),h.setAttributeNS(null,"class","vis-outline");var d=Math.round(.3*o),l=t.options.barChart.width,u=l/d,c=Math.round(.4*s),p=Math.round(.75*s),f=Math.round((o-2*d)/3);if(n.drawBar(e+.5*d+f,i+a-c-1,d,c,t.className+" vis-bar",r.svgElements,r.svg,t.style),n.drawBar(e+1.5*d+f+2,i+a-p-1,d,p,t.className+" vis-bar",r.svgElements,r.svg,t.style),1==t.options.drawPoints.enabled){var m={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size/u,className:t.className};n.drawPoint(e+.5*d+f,i+a-c-1,m,r.svgElements,r.svg),n.drawPoint(e+1.5*d+f+2,i+a-p-1,m,r.svgElements,r.svg)}},o.draw=function(t,e,i){var r,a,h,d,l,u,c=[],p={},f=0;for(l=0;l<t.length;l++)if(d=i.groups[t[l]],"bar"===d.options.style&&!0===d.visible&&(void 0===i.options.groups.visibility[t[l]]||!0===i.options.groups.visibility[t[l]]))for(u=0;u<e[t[l]].length;u++)c.push({screen_x:e[t[l]][u].screen_x,screen_end:e[t[l]][u].screen_end,screen_y:e[t[l]][u].screen_y,x:e[t[l]][u].x,end:e[t[l]][u].end,y:e[t[l]][u].y,groupId:t[l],label:e[t[l]][u].label}),f+=1;if(0!==f)for(c.sort(function(t,e){return t.screen_x===e.screen_x?t.groupId<e.groupId?-1:1:t.screen_x-e.screen_x}),o._getDataIntersections(p,c),l=0;l<c.length;l++){d=i.groups[c[l].groupId];var m=void 0!=d.options.barChart.minWidth?d.options.barChart.minWidth:.1*d.options.barChart.width;a=c[l].screen_x;var v=0;if(void 0===p[a])l+1<c.length&&(r=Math.abs(c[l+1].screen_x-a)),h=o._getSafeDrawData(r,d,m);else{var g=l+(p[a].amount-p[a].resolved);g<c.length&&(r=Math.abs(c[g].screen_x-a)),h=o._getSafeDrawData(r,d,m),p[a].resolved+=1,!0===d.options.stack&&!0!==d.options.excludeFromStacking?c[l].screen_y<d.zeroPosition?(v=p[a].accumulatedNegative,p[a].accumulatedNegative+=d.zeroPosition-c[l].screen_y):(v=p[a].accumulatedPositive,p[a].accumulatedPositive+=d.zeroPosition-c[l].screen_y):!0===d.options.barChart.sideBySide&&(h.width=h.width/p[a].amount,h.offset+=p[a].resolved*h.width-.5*h.width*(p[a].amount+1))}var y=h.width,b=c[l].screen_x;if(void 0!=c[l].screen_end?(y=c[l].screen_end-c[l].screen_x,b+=.5*y):b+=h.offset,n.drawBar(b,c[l].screen_y-v,y,d.zeroPosition-c[l].screen_y,d.className+" vis-bar",i.svgElements,i.svg,d.style),!0===d.options.drawPoints.enabled){var _={screen_x:c[l].screen_x,screen_y:c[l].screen_y-v,x:c[l].x,y:c[l].y,groupId:c[l].groupId,label:c[l].label};s.draw([_],d,i,h.offset)}}},o._getDataIntersections=function(t,e){for(var i,o=0;o<e.length;o++)o+1<e.length&&(i=Math.abs(e[o+1].screen_x-e[o].screen_x)),o>0&&(i=Math.min(i,Math.abs(e[o-1].screen_x-e[o].screen_x))),0===i&&(void 0===t[e[o].screen_x]&&(t[e[o].screen_x]={amount:0,resolved:0,accumulatedPositive:0,accumulatedNegative:0}),t[e[o].screen_x].amount+=1)},o._getSafeDrawData=function(t,e,i){var o,n;return t<e.options.barChart.width&&t>0?(o=t<i?i:t,n=0,"left"===e.options.barChart.align?n-=.5*t:"right"===e.options.barChart.align&&(n+=.5*t)):(o=e.options.barChart.width,n=0,"left"===e.options.barChart.align?n-=.5*e.options.barChart.width:"right"===e.options.barChart.align&&(n+=.5*e.options.barChart.width)),{width:o,offset:n}},o.getStackedYRange=function(t,e,i,n,s){if(t.length>0){t.sort(function(t,e){return t.screen_x===e.screen_x?t.groupId<e.groupId?-1:1:t.screen_x-e.screen_x});var r={};o._getDataIntersections(r,t),e[n]=o._getStackedYRange(r,t),e[n].yAxisOrientation=s,i.push(n)}},o._getStackedYRange=function(t,e){for(var i,o=e[0].screen_y,n=e[0].screen_y,s=0;s<e.length;s++)i=e[s].screen_x,void 0===t[i]?(o=o>e[s].screen_y?e[s].screen_y:o,n=n<e[s].screen_y?e[s].screen_y:n):e[s].screen_y<0?t[i].accumulatedNegative+=e[s].screen_y:t[i].accumulatedPositive+=e[s].screen_y;for(var r in t)t.hasOwnProperty(r)&&(o=o>t[r].accumulatedNegative?t[r].accumulatedNegative:o,o=o>t[r].accumulatedPositive?t[r].accumulatedPositive:o,n=n<t[r].accumulatedNegative?t[r].accumulatedNegative:n,n=n<t[r].accumulatedPositive?t[r].accumulatedPositive:n);return{min:o,max:n}},t.exports=o}
19289,function(t,e,i){function o(t,e){}var n=i(14);o.calcPath=function(t,e){if(null!=t&&t.length>0){return 1==e.options.interpolation.enabled?o._catmullRom(t,e):o._linear(t)}},o.drawIcon=function(t,e,i,o,s,r){var a,h,d=.5*s,l=n.getSVGElement("rect",r.svgElements,r.svg);if(l.setAttributeNS(null,"x",e),l.setAttributeNS(null,"y",i-d),l.setAttributeNS(null,"width",o),l.setAttributeNS(null,"height",2*d),l.setAttributeNS(null,"class","vis-outline"),a=n.getSVGElement("path",r.svgElements,r.svg),a.setAttributeNS(null,"class",t.className),void 0!==t.style&&a.setAttributeNS(null,"style",t.style),a.setAttributeNS(null,"d","M"+e+","+i+" L"+(e+o)+","+i),1==t.options.shaded.enabled&&(h=n.getSVGElement("path",r.svgElements,r.svg),"top"==t.options.shaded.orientation?h.setAttributeNS(null,"d","M"+e+", "+(i-d)+"L"+e+","+i+" L"+(e+o)+","+i+" L"+(e+o)+","+(i-d)):h.setAttributeNS(null,"d","M"+e+","+i+" L"+e+","+(i+d)+" L"+(e+o)+","+(i+d)+"L"+(e+o)+","+i),h.setAttributeNS(null,"class",t.className+" vis-icon-fill"),void 0!==t.options.shaded.style&&""!==t.options.shaded.style&&h.setAttributeNS(null,"style",t.options.shaded.style)),1==t.options.drawPoints.enabled){var u={style:t.options.drawPoints.style,styles:t.options.drawPoints.styles,size:t.options.drawPoints.size,className:t.className};n.drawPoint(e+.5*o,i,u,r.svgElements,r.svg)}},o.drawShading=function(t,e,i,o){if(1==e.options.shaded.enabled){var s=Number(o.svg.style.height.replace("px","")),r=n.getSVGElement("path",o.svgElements,o.svg),a="L";1==e.options.interpolation.enabled&&(a="C");var h,d=0;d="top"==e.options.shaded.orientation?0:"bottom"==e.options.shaded.orientation?s:Math.min(Math.max(0,e.zeroPosition),s),h="group"==e.options.shaded.orientation&&null!=i&&void 0!=i?"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" L"+i[i.length-1][0]+","+i[i.length-1][1]+" "+this.serializePath(i,a,!0)+i[0][0]+","+i[0][1]+" Z":"M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,a,!1)+" V"+d+" H"+t[0][0]+" Z",r.setAttributeNS(null,"class",e.className+" vis-fill"),void 0!==e.options.shaded.style&&r.setAttributeNS(null,"style",e.options.shaded.style),r.setAttributeNS(null,"d",h)}},o.draw=function(t,e,i){if(null!=t&&void 0!=t){var o=n.getSVGElement("path",i.svgElements,i.svg);o.setAttributeNS(null,"class",e.className),void 0!==e.style&&o.setAttributeNS(null,"style",e.style);var s="L";1==e.options.interpolation.enabled&&(s="C"),o.setAttributeNS(null,"d","M"+t[0][0]+","+t[0][1]+" "+this.serializePath(t,s,!1))}},o.serializePath=function(t,e,i){if(t.length<2)return"";var o,n=e;if(i)for(o=t.length-2;o>0;o--)n+=t[o][0]+","+t[o][1]+" ";else for(o=1;o<t.length;o++)n+=t[o][0]+","+t[o][1]+" ";return n},o._catmullRomUniform=function(t){var e,i,o,n,s,r,a=[];a.push([Math.round(t[0].screen_x),Math.round(t[0].screen_y)]);for(var h=t.length,d=0;d<h-1;d++)e=0==d?t[0]:t[d-1],i=t[d],o=t[d+1],n=d+2<h?t[d+2]:o,s={screen_x:(-e.screen_x+6*i.screen_x+o.screen_x)*(1/6),screen_y:(-e.screen_y+6*i.screen_y+o.screen_y)*(1/6)},r={screen_x:(i.screen_x+6*o.screen_x-n.screen_x)*(1/6),screen_y:(i.screen_y+6*o.screen_y-n.screen_y)*(1/6)},a.push([s.screen_x,s.screen_y]),a.push([r.screen_x,r.screen_y]),a.push([o.screen_x,o.screen_y]);return a},o._catmullRom=function(t,e){var i=e.options.interpolation.alpha;if(0==i||void 0===i)return this._catmullRomUniform(t);var o,n,s,r,a,h,d,l,u,c,p,f,m,v,g,y,b,_,w,x=[];x.push([Math.round(t[0].screen_x),Math.round(t[0].screen_y)]);for(var k=t.length,S=0;S<k-1;S++)o=0==S?t[0]:t[S-1],n=t[S],s=t[S+1],r=S+2<k?t[S+2]:s, 19290 d=Math.sqrt(Math.pow(o.screen_x-n.screen_x,2)+Math.pow(o.screen_y-n.screen_y,2)),l=Math.sqrt(Math.pow(n.screen_x-s.screen_x,2)+Math.pow(n.screen_y-s.screen_y,2)),u=Math.sqrt(Math.pow(s.screen_x-r.screen_x,2)+Math.pow(s.screen_y-r.screen_y,2)),v=Math.pow(u,i),y=Math.pow(u,2*i),g=Math.pow(l,i),b=Math.pow(l,2*i),w=Math.pow(d,i),_=Math.pow(d,2*i),c=2*_+3*w*g+b,p=2*y+3*v*g+b,f=3*w*(w+g),f>0&&(f=1/f),m=3*v*(v+g),m>0&&(m=1/m),a={screen_x:(-b*o.screen_x+c*n.screen_x+_*s.screen_x)*f,screen_y:(-b*o.screen_y+c*n.screen_y+_*s.screen_y)*f},h={screen_x:(y*n.screen_x+p*s.screen_x-b*r.screen_x)*m,screen_y:(y*n.screen_y+p*s.screen_y-b*r.screen_y)*m},0==a.screen_x&&0==a.screen_y&&(a=n),0==h.screen_x&&0==h.screen_y&&(h=s),x.push([a.screen_x,a.screen_y]),x.push([h.screen_x,h.screen_y]),x.push([s.screen_x,s.screen_y]);return x},o._linear=function(t){for(var e=[],i=0;i<t.length;i++)e.push([t[i].screen_x,t[i].screen_y]);return e},t.exports=o}
vendor: 10,001 bytes, line 19290
19290,function(t,e,i){function o(t,e,i,o){this.body=t,this.defaultOptions={enabled:!1,icons:!0,iconSize:20,iconSpacing:6,left:{visible:!0,position:"top-left"},right:{visible:!0,position:"top-right"}},this.side=i,this.options=r.extend({},this.defaultOptions),this.linegraphOptions=o,this.svgElements={},this.dom={},this.groups={},this.amountOfGroups=0,this._create(),this.framework={svg:this.svg,svgElements:this.svgElements,options:this.options,groups:this.groups},this.setOptions(e)}var n=i(8),s=function(t){return t&&t.__esModule?t:{default:t}}(n),r=i(2),a=i(14),h=i(16);o.prototype=new h,o.prototype.clear=function(){this.groups={},this.amountOfGroups=0},o.prototype.addGroup=function(t,e){1!=e.options.excludeFromLegend&&(this.groups.hasOwnProperty(t)||(this.groups[t]=e),this.amountOfGroups+=1)},o.prototype.updateGroup=function(t,e){this.groups[t]=e},o.prototype.removeGroup=function(t){this.groups.hasOwnProperty(t)&&(delete this.groups[t],this.amountOfGroups-=1)},o.prototype._create=function(){this.dom.frame=document.createElement("div"),this.dom.frame.className="vis-legend",this.dom.frame.style.position="absolute",this.dom.frame.style.top="10px",this.dom.frame.style.display="block",this.dom.textArea=document.createElement("div"),this.dom.textArea.className="vis-legend-text",this.dom.textArea.style.position="relative",this.dom.textArea.style.top="0px",this.svg=document.createElementNS("http://www.w3.org/2000/svg","svg"),this.svg.style.position="absolute",this.svg.style.top="0px",this.svg.style.width=this.options.iconSize+5+"px",this.svg.style.height="100%",this.dom.frame.appendChild(this.svg),this.dom.frame.appendChild(this.dom.textArea)},o.prototype.hide=function(){this.dom.frame.parentNode&&this.dom.frame.parentNode.removeChild(this.dom.frame)},o.prototype.show=function(){this.dom.frame.parentNode||this.body.dom.center.appendChild(this.dom.frame)},o.prototype.setOptions=function(t){var e=["enabled","orientation","icons","left","right"];r.selectiveDeepExtend(e,this.options,t)},o.prototype.redraw=function(){var t=0,e=(0,s.default)(this.groups);e.sort(function(t,e){return t<e?-1:1});for(var i=0;i<e.length;i++){var o=e[i];1!=this.groups[o].visible||void 0!==this.linegraphOptions.visibility[o]&&1!=this.linegraphOptions.visibility[o]||t++}if(0==this.options[this.side].visible||0==this.amountOfGroups||0==this.options.enabled||0==t)this.hide();else{if(this.show(),"top-left"==this.options[this.side].position||"bottom-left"==this.options[this.side].position?(this.dom.frame.style.left="4px",this.dom.frame.style.textAlign="left",this.dom.textArea.style.textAlign="left",this.dom.textArea.style.left=this.options.iconSize+15+"px",this.dom.textArea.style.right="",this.svg.style.left="0px",this.svg.style.right=""):(this.dom.frame.style.right="4px",this.dom.frame.style.textAlign="right",this.dom.textArea.style.textAlign="right",this.dom.textArea.style.right=this.options.iconSize+15+"px",this.dom.textArea.style.left="",this.svg.style.right="0px",this.svg.style.left=""),"top-left"==this.options[this.side].position||"top-right"==this.options[this.side].position)this.dom.frame.style.top=4-Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.bottom="";else{var n=this.body.domProps.center.height-this.body.domProps.centerContainer.height;this.dom.frame.style.bottom=4+n+Number(this.body.dom.center.style.top.replace("px",""))+"px",this.dom.frame.style.top=""}0==this.options.icons?(this.dom.frame.style.width=this.dom.textArea.offsetWidth+10+"px",this.dom.textArea.style.right="",this.dom.textArea.style.left="",this.svg.style.width="0px"):(this.dom.frame.style.width=this.options.iconSize+15+this.dom.textArea.offsetWidth+10+"px",this.drawLegendIcons());var r="";for(i=0;i<e.length;i++)o=e[i],1!=this.groups[o].visible||void 0!==this.linegraphOptions.visibility[o]&&1!=this.linegraphOptions.visibility[o]||(r+=this.groups[o].content+"<br />");this.dom.textArea.innerHTML=r,this.dom.textArea.style.lineHeight=.75*this.options.iconSize+this.options.iconSpacing+"px"}},o.prototype.drawLegendIcons=function(){if(this.dom.frame.parentNode){var t=(0,s.default)(this.groups);t.sort(function(t,e){return t<e?-1:1}),a.resetElements(this.svgElements);var e=window.getComputedStyle(this.dom.frame).paddingTop,i=Number(e.replace("px","")),o=i,n=this.options.iconSize,r=.75*this.options.iconSize,h=i+.5*r+3;this.svg.style.width=n+5+i+"px";for(var d=0;d<t.length;d++){var l=t[d];1!=this.groups[l].visible||void 0!==this.linegraphOptions.visibility[l]&&1!=this.linegraphOptions.visibility[l]||(this.groups[l].getLegend(n,r,this.framework,o,h),h+=r+this.options.iconSpacing)}}},t.exports=o},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r="object",a={configure:{enabled:{boolean:n},filter:{boolean:n,function:"function"},container:{dom:"dom"},__type__:{object:r,boolean:n,function:"function"}},yAxisOrientation:{string:["left","right"]},defaultGroup:{string:o},sort:{boolean:n},sampling:{boolean:n},stack:{boolean:n},graphHeight:{string:o,number:s},shaded:{enabled:{boolean:n},orientation:{string:["bottom","top","zero","group"]},groupId:{object:r},__type__:{boolean:n,object:r}},style:{string:["line","bar","points"]},barChart:{width:{number:s},minWidth:{number:s},sideBySide:{boolean:n},align:{string:["left","center","right"]},__type__:{object:r}},interpolation:{enabled:{boolean:n},parametrization:{string:["centripetal","chordal","uniform"]},alpha:{number:s},__type__:{object:r,boolean:n}},drawPoints:{enabled:{boolean:n},onRender:{function:"function"},size:{number:s},style:{string:["square","circle"]},__type__:{object:r,boolean:n,function:"function"}},dataAxis:{showMinorLabels:{boolean:n},showMajorLabels:{boolean:n},icons:{boolean:n},width:{string:o,number:s},visible:{boolean:n},alignZeros:{boolean:n},left:{range:{min:{number:s,undefined:"undefined"},max:{number:s,undefined:"undefined"},__type__:{object:r}},format:{function:"function"},title:{text:{string:o,number:s,undefined:"undefined"},style:{string:o,undefined:"undefined"},__type__:{object:r}},__type__:{object:r}},right:{range:{min:{number:s,undefined:"undefined"},max:{number:s,undefined:"undefined"},__type__:{object:r}},format:{function:"function"},title:{text:{string:o,number:s,undefined:"undefined"},style:{string:o,undefined:"undefined"},__type__:{object:r}},__type__:{object:r}},__type__:{object:r}},legend:{enabled:{boolean:n},icons:{boolean:n},left:{visible:{boolean:n},position:{string:["top-right","bottom-right","top-left","bottom-left"]},__type__:{object:r}},right:{visible:{boolean:n},position:{string:["top-right","bottom-right","top-left","bottom-left"]},__type__:{object:r}},__type__:{object:r,boolean:n}},groups:{visibility:{any:"any"},__type__:{object:r}},autoResize:{boolean:n},throttleRedraw:{number:s},clickToUse:{boolean:n},end:{number:s,date:"date",string:o,moment:"moment"},format:{minorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r}},majorLabels:{millisecond:{string:o,undefined:"undefined"},second:{string:o,undefined:"undefined"},minute:{string:o,undefined:"undefined"},hour:{string:o,undefined:"undefined"},weekday:{string:o,undefined:"undefined"},day:{string:o,undefined:"undefined"},month:{string:o,undefined:"undefined"},year:{string:o,undefined:"undefined"},__type__:{object:r}},__type__:{object:r}},moment:{function:"function"},height:{string:o,number:s},hiddenDates:{start:{date:"date",number:s,string:o,moment:"moment"},end:{date:"date",number:s,string:o,moment:"moment"},repeat:{string:o},__type__:{object:r,array:"array"}},locale:{string:o},locales:{__any__:{any:"any"},__type__:{object:r}},max:{date:"date",number:s,string:o,moment:"moment"},maxHeight:{number:s,string:o},maxMinorChars:{number:s},min:{date:"date",number:s,string:o,moment:"moment"},minHeight:{number:s,string:o},moveable:{boolean:n},multiselect:{boolean:n},orientation:{string:o},showCurrentTime:{boolean:n},showMajorLabels:{boolean:n},showMinorLabels:{boolean:n},start:{date:"date",number:s,string:o,moment:"moment"},timeAxis:{scale:{string:o,undefined:"undefined"},step:{number:s,undefined:"undefined"},__type__:{object:r}},width:{string:o,number:s},zoomable:{boolean:n},zoomKey:{string:["ctrlKey","altKey","metaKey",""]},zoomMax:{number:s},zoomMin:{number:s},zIndex:{number:s},__type__:{object:r}},h={global:{sort:!0,sampling:!0,stack:!1,shaded:{enabled:!1,orientation:["zero","top","bottom","group"]},style:["line","bar","points"],barChart:{width:[50,5,100,5],minWidth:[50,5,100,5],sideBySide:!1,align:["left","center","right"]},interpolation:{enabled:!0,parametrization:["centripetal","chordal","uniform"]},drawPoints:{enabled:!0,size:[6,2,30,1],style:["square","circle"]},dataAxis:{showMinorLabels:!0,showMajorLabels:!0,icons:!1,width:[40,0,200,1],visible:!0,alignZeros:!0,left:{title:{text:"",style:""}},right:{title:{text:"",style:""}}},legend:{enabled:!1,icons:!0,left:{visible:!0,position:["top-right","bottom-right","top-left","bottom-left"]},right:{visible:!0,position:["top-right","bottom-right","top-left","bottom-left"]}},autoResize:!0,clickToUse:!1,end:"",format:{minorLabels:{millisecond:"SSS",second:"s",minute:"HH:mm",hour:"HH:mm",weekday:"ddd D",day:"D",month:"MMM",year:"YYYY"},majorLabels:{millisecond:"HH:mm:ss",second:"D MMMM HH:mm",minute:"ddd D MMMM",hour:"ddd D MMMM",weekday:"MMMM YYYY",day:"MMMM YYYY",month:"YYYY",year:""}},height:"",locale:"",max:"",maxHeight:"",maxMinorChars:[7,0,20,1],min:"",minHeight:"",moveable:!0,orientation:["both","bottom","top"],showCurrentTime:!1,showMajorLabels:!0,showMinorLabels:!0,start:"",width:"100%",zoomable:!0,zoomKey:["ctrlKey","altKey","metaKey",""],zoomMax:[31536e10,10,31536e10,1],zoomMin:[10,10,31536e10,1],zIndex:0}};e.allOptions=a,e.configureOptions=h}
19290,function(t,e,i){function o(t){return R=t,f()}function n(){A=0,z=R.charAt(0)}function s(){A++,z=R.charAt(A)}function r(){return R.charAt(A+1)}function a(t){return B.test(t)}function h(t,e){if(t||(t={}),e)for(var i in e)e.hasOwnProperty(i)&&(t[i]=e[i]);return t}function d(t,e,i){for(var o=e.split("."),n=t;o.length;){var s=o.shift();o.length?(n[s]||(n[s]={}),n=n[s]):n[s]=i}}function l(t,e){for(var i,o,n=null,s=[t],r=t;r.parent;)s.push(r.parent),r=r.parent;if(r.nodes)for(i=0,o=r.nodes.length;i<o;i++)if(e.id===r.nodes[i].id){n=r.nodes[i];break}for(n||(n={id:e.id},t.node&&(n.attr=h(n.attr,t.node))),i=s.length-1;i>=0;i--){var a=s[i];a.nodes||(a.nodes=[]),-1===a.nodes.indexOf(n)&&a.nodes.push(n)}e.attr&&(n.attr=h(n.attr,e.attr))}function u(t,e){if(t.edges||(t.edges=[]),t.edges.push(e),t.edge){var i=h({},t.edge);e.attr=h(i,e.attr)}}function c(t,e,i,o,n){var s={from:e,to:i,type:o};return t.edge&&(s.attr=h({},t.edge)),s.attr=h(s.attr||{},n),s}function p(){for(F=I.NULL,L="";" "===z||"\t"===z||"\n"===z||"\r"===z;)s();do{var t=!1;if("#"===z){for(var e=A-1;" "===R.charAt(e)||"\t"===R.charAt(e);)e--;if("\n"===R.charAt(e)||""===R.charAt(e)){for(;""!=z&&"\n"!=z;)s();t=!0}}if("/"===z&&"/"===r()){for(;""!=z&&"\n"!=z;)s();t=!0}if("/"===z&&"*"===r()){for(;""!=z;){if("*"===z&&"/"===r()){s(),s();break}s()}t=!0}for(;" "===z||"\t"===z||"\n"===z||"\r"===z;)s()}while(t);if(""===z)return void(F=I.DELIMITER);var i=z+r();if(N[i])return F=I.DELIMITER,L=i,s(),void s();if(N[z])return F=I.DELIMITER,L=z,void s();if(a(z)||"-"===z){for(L+=z,s();a(z);)L+=z,s();return"false"===L?L=!1:"true"===L?L=!0:isNaN(Number(L))||(L=Number(L)),void(F=I.IDENTIFIER)}if('"'===z){for(s();""!=z&&('"'!=z||'"'===z&&'"'===r());)'"'===z?(L+=z,s()):"\\"===z&&"n"===r()?(L+="\n",s()):L+=z,s();if('"'!=z)throw x('End of string " expected');return s(),void(F=I.IDENTIFIER)}for(F=I.UNKNOWN;""!=z;)L+=z,s();throw new SyntaxError('Syntax error in part "'+k(L,30)+'"')}function f(){var t={};if(n(),p(),"strict"===L&&(t.strict=!0,p()),"graph"!==L&&"digraph"!==L||(t.type=L,p()),F===I.IDENTIFIER&&(t.id=L,p()),"{"!=L)throw x("Angle bracket { expected");if(p(),m(t),"}"!=L)throw x("Angle bracket } expected");if(p(),""!==L)throw x("End of file expected");return p(),delete t.node,delete t.edge,delete t.graph,t}function m(t){for(;""!==L&&"}"!=L;)v(t),";"===L&&p()}function v(t){var e=g(t);if(e)return void _(t,e);if(!y(t)){if(F!=I.IDENTIFIER)throw x("Identifier expected");var i=L;if(p(),"="===L){if(p(),F!=I.IDENTIFIER)throw x("Identifier expected");t[i]=L,p()}else b(t,i)}}function g(t){var e=null;if("subgraph"===L&&(e={},e.type="subgraph",p(),F===I.IDENTIFIER&&(e.id=L,p())),"{"===L){if(p(),e||(e={}),e.parent=t,e.node=t.node,e.edge=t.edge,e.graph=t.graph,m(e),"}"!=L)throw x("Angle bracket } expected");p(),delete e.node,delete e.edge,delete e.graph,delete e.parent,t.subgraphs||(t.subgraphs=[]),t.subgraphs.push(e)}return e}function y(t){return"node"===L?(p(),t.node=w(),"node"):"edge"===L?(p(),t.edge=w(),"edge"):"graph"===L?(p(),t.graph=w(),"graph"):null}function b(t,e){var i={id:e},o=w();o&&(i.attr=o),l(t,i),_(t,e)}function _(t,e){for(;"->"===L||"--"===L;){var i,o=L;p();var n=g(t);if(n)i=n;else{if(F!=I.IDENTIFIER)throw x("Identifier or subgraph expected");i=L,l(t,{id:i}),p()}u(t,c(t,e,i,o,w())),e=i}}function w(){for(var t=null,e={dashed:!0,solid:!1,dotted:[1,5]};"["===L;){for(p(),t={};""!==L&&"]"!=L;){if(F!=I.IDENTIFIER)throw x("Attribute name expected");var i=L;if(p(),"="!=L)throw x("Equal sign = expected");if(p(),F!=I.IDENTIFIER)throw x("Attribute value expected");var o=L;"style"===i&&(o=e[o]),d(t,i,o),p(),","==L&&p()}if("]"!=L)throw x("Bracket ] expected");p()}return t}function x(t){return new SyntaxError(t+', got "'+k(L,30)+'" (char '+A+")")}function k(t,e){return t.length<=e?t:t.substr(0,27)+"..."}function S(t,e,i){Array.isArray(t)?t.forEach(function(t){Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}):Array.isArray(e)?e.forEach(function(e){i(t,e)}):i(t,e)}function D(t,e,i){for(var o=e.split("."),n=o.pop(),s=t,r=0;r<o.length;r++){var a=o[r];a in s||(s[a]={}),s=s[a]}return s[n]=i,t}function M(t,e){var i={};for(var o in t)if(t.hasOwnProperty(o)){var n=e[o];
19290Array.isArray(n)?n.forEach(function(e){D(i,e,t[o])}):"string"==typeof n?D(i,n,t[o]):D(i,o,t[o])}return i}function C(t){var e=o(t),i={nodes:[],edges:[],options:{}};if(e.nodes&&e.nodes.forEach(function(t){var e={id:t.id,label:String(t.label||t.id)};h(e,M(t.attr,T)),e.image&&(e.shape="image"),i.nodes.push(e)}),e.edges){var n=function(t){var e={from:t.from,to:t.to};return h(e,M(t.attr,P)),e.arrows="->"===t.type?"to":void 0,e};e.edges.forEach(function(t){var e,o;e=t.from instanceof Object?t.from.nodes:{id:t.from},o=t.to instanceof Object?t.to.nodes:{id:t.to},t.from instanceof Object&&t.from.edges&&t.from.edges.forEach(function(t){var e=n(t);i.edges.push(e)}),S(e,o,function(e,o){var s=c(i,e.id,o.id,t.type,t.attr),r=n(s);i.edges.push(r)}),t.to instanceof Object&&t.to.edges&&t.to.edges.forEach(function(t){var e=n(t);i.edges.push(e)})})}return e.attr&&(i.options=e.attr),i}var O=i(29),E=function(t){return t&&t.__esModule?t:{default:t}}(O),T={fontsize:"font.size",fontcolor:"font.color",labelfontcolor:"font.color",fontname:"font.face",color:["color.border","color.background"],fillcolor:"color.background",tooltip:"title",labeltooltip:"title"},P=(0,E.default)(T);P.color="color.color",P.style="dashes";var I={NULL:0,DELIMITER:1,IDENTIFIER:2,UNKNOWN:3},N={"{":!0,"}":!0,"[":!0,"]":!0,";
19290":!0,"=":!0,",":!0,"->":!0,"--":!0},R="",A=0,z="",L="",F=I.NULL,B=/[a-zA-Z_0-9.:#]/;e.parseDOT=o,e.DOTToGraph=C},function(t,e,i){function o(t,e){var i=[],o=[],n={edges:{inheritColor:!1},nodes:{fixed:!1,parseColor:!1}};void 0!==e&&(void 0!==e.fixed&&(n.nodes.fixed=e.fixed),void 0!==e.parseColor&&(n.nodes.parseColor=e.parseColor),void 0!==e.inheritColor&&(n.edges.inheritColor=e.inheritColor));for(var s=t.edges,r=t.nodes,a=0;a<s.length;a++){var h={},d=s[a];h.id=d.id,h.from=d.source,h.to=d.target,h.attributes=d.attributes,h.label=d.label,h.title=void 0!==d.attributes?d.attributes.title:void 0,"Directed"===d.type&&(h.arrows="to"),d.color&&!1===n.inheritColor&&(h.color=d.color),i.push(h)}for(var l=0;l<r.length;l++){var u={},c=r[l];u.id=c.id,u.attributes=c.attributes,u.x=c.x,u.y=c.y,u.label=c.label,u.title=void 0!==c.attributes?c.attributes.title:c.title,!0===n.nodes.parseColor?u.color=c.color:u.color=void 0!==c.color?{background:c.color,border:c.color,highlight:{background:c.color,border:c.color},hover:{background:c.color,border:c.color}}:void 0,u.size=c.size,u.fixed=n.nodes.fixed&&void 0!==c.x&&void 0!==c.y,o.push(u)}return{nodes:o,edges:i}}e.parseGephi=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(185),d=o(h),l=function(){function t(e){(0,s.default)(this,t),this.images={},this.imageBroken={},this.callback=e}return(0,a.default)(t,[{key:"_tryloadBrokenUrl",value:function(t,e,i){if(void 0!==t&&void 0!==i){if(void 0===e)return void console.warn("No broken url image defined");i.onerror=function(){console.error("Could not load brokenImage:",e)},i.image.src=e}}},{key:"_redrawWithImage",value:function(t){this.callback&&this.callback(t)}},{key:"load",value:function(t,e){var i=this,o=this.images[t];if(o)return o;var n=new d.default;return this.images[t]=n,n.image.onload=function(){i._fixImageCoordinates(n.image),n.init(),i._redrawWithImage(n)},n.image.onerror=function(){console.error("Could not load image:",t),i._tryloadBrokenUrl(t,e,n)},n.image.src=t,n}},{key:"_fixImageCoordinates",value:function(t){0===t.width&&(document.body.appendChild(t),t.width=t.offsetWidth,t.height=t.offsetHeight,document.body.removeChild(t))}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(48).default,f=i(191).default,m=["bold","ital","boldital","mono"],v=function(){function t(e,i){var o=arguments.length>2&&void 0!==arguments[2]&&arguments[2];(0,d.default)(this,t),this.body=e,this.pointToSelf=!1,this.baseSize=void 0,this.fontOptions={},this.setOptions(i),this.size={top:0,left:0,width:0,height:0,yLine:0},this.isEdgeLabel=o}return(0,u.default)(t,[{key:"setOptions",value:function(t){if(this.elementOptions=t,this.initFontOptions(t.font),p.isValidLabel(t.label)?this.labelDirty=!0:t.label="",void 0!==t.font&&null!==t.font)if("string"==typeof t.font)this.baseSize=this.fontOptions.size;else if("object"===(0,a.default)(t.font)){var e=t.font.size;void 0!==e&&(this.baseSize=e)}}},{key:"initFontOptions",value:function(e){var i=this;if(c.forEach(m,function(t){i.fontOptions[t]={}}),t.parseFontString(this.fontOptions,e))return void(this.fontOptions.vadjust=0);c.forEach(e,function(t,e){void 0!==t&&null!==t&&"object"!==(void 0===t?"undefined":(0,a.default)(t))&&(i.fontOptions[e]=t)})}},{key:"constrain",value:function(t){var e={constrainWidth:!1,maxWdt:-1,minWdt:-1,constrainHeight:!1,minHgt:-1,valign:"middle"},i=c.topMost(t,"widthConstraint");if("number"==typeof i)e.maxWdt=Number(i),e.minWdt=Number(i);else if("object"===(void 0===i?"undefined":(0,a.default)(i))){var o=c.topMost(t,["widthConstraint","maximum"]);"number"==typeof o&&(e.maxWdt=Number(o));var n=c.topMost(t,["widthConstraint","minimum"]);"number"==typeof n&&(e.minWdt=Number(n))}var s=c.topMost(t,"heightConstraint");if("number"==typeof s)e.minHgt=Number(s);else if("object"===(void 0===s?"undefined":(0,a.default)(s))){var r=c.topMost(t,["heightConstraint","minimum"]);"number"==typeof r&&(e.minHgt=Number(r));var h=c.topMost(t,["heightConstraint","valign"]);"string"==typeof h&&("top"!==h&&"bottom"!==h||(e.valign=h))}return e}},{key:"update",value:function(t,e){this.setOptions(t,!0),this.prop
19290agateFonts(e),c.deepExtend(this.fontOptions,this.constrain(e)),this.fontOptions.chooser=p.choosify("label",e)}},{key:"adjustSizes",value:function(t){var e=t?t.right+t.left:0;this.fontOptions.constrainWidth&&(this.fontOptions.maxWdt-=e,this.fontOptions.minWdt-=e);var i=t?t.top+t.bottom:0;this.fontOptions.constrainHeight&&(this.fontOptions.minHgt-=i)}},{key:"addFontOptionsToPile",value:function(t,e){for(var i=0;i<e.length;++i)this.addFontToPile(t,e[i])}},{key:"addFontToPile",value:function(t,e){if(void 0!==e&&void 0!==e.font&&null!==e.font){var i=e.font;t.push(i)}}},{key:"getBasicOptions",value:function(e){for(var i={},o=0;o<e.length;++o){var n=e[o],s={};t.parseFontString(s,n)&&(n=s),c.forEach(n,function(t,e){void 0!==t&&(i.hasOwnProperty(e)||(-1!==m.indexOf(e)?i[e]={}:i[e]=t))})}return i}},{key:"getFontOption",value:function(e,i,o){for(var n=void 0,s=0;s<e.length;++s){var r=e[s];if(r.hasOwnProperty(i)){if(void 0===(n=r[i])||null===n)continue;var a={};if(t.parseFontString(a,n)&&(n=a),n.hasOwnProperty(o))return n[o]}}if(this.fontOptions.hasOwnProperty(o))return this.fontOptions[o];throw new Error("Did not find value for multi-font for property: '"+o+"'")}},{key:"getFontOptions",value:function(t,e){for(var i={},o=["color","size","face","mod","vadjust"],n=0;n<o.length;++n){var s=o[n];i[s]=this.getFontOption(t,e,s)}return i}},{key:"propagateFonts",value:function(t){var e=this,i=[];this.addFontOptionsToPile(i,t),this.fontOptions=this.getBasicOptions(i);for(var o=0;o<m.length;++o)!function(t){var o=m[t],n=e.fontOptions[o],s=e.getFontOptions(i,o);c.forEach(s,function(t,e){n[e]=t}),n.size=Number(n.size),n.vadjust=Number(n.vadjust)}(o)}},{key:"draw",value:function(t,e,i,o,n){var s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";if(void 0!==this.elementOptions.label){var r=this.fontOptions.size*this.body.view.scale;this.elementOptions.label&&r<this.elementOptions.scaling.label.drawThreshold-1||(r>=this.elementOptions.scaling.label.maxVisible&&(r=Number(this.elementOptions.scaling.label.maxVisible)/this.body.view.scale),this.calculateLabelSize(t,o,n,e,i,s),this._drawBackground(t),this._drawText(t,e,this.size.yLine,s,r))}}},{key:"_drawBackground",value:function(t){if(void 0!==this.fontOptions.background&&"none"!==this.fontOptions.background){t.fillStyle=this.fontOptions.background;var e=this.getSize();t.fillRect(e.left,e.top,e.width,e.height)}}},{key:"_drawText",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"middle",n=arguments[4],r=this._setAlignment(t,e,i,o),a=(0,s.default)(r,2);e=a[0],i=a[1],t.textAlign="left",e-=this.size.width/2,this.fontOptions.valign&&this.size.height>this.size.labelHeight&&("top"===this.fontOptions.valign&&(i-=(this.size.height-this.size.labelHeight)/2),"bottom"===this.fontOptions.valign&&(i+=(this.size.height-this.size.labelHeight)/2));for(var h=0;h<this.lineCount;h++){var d=this.lines[h];if(d&&d.blocks){var l=0;this.isEdgeLabel||"center"===this.fontOptions.align?l+=(this.size.width-d.width)/2:"right"===this.fontOptions.align&&(l+=this.size.width-d.width);for(var u=0;u<d.blocks.length;u++){var c=d.blocks[u];t.font=c.font;var p=this._getColor(c.color,n,c.strokeColor),f=(0,s.default)(p,2),m=f[0],v=f[1];c.strokeWidth>0&&(t.lineWidth=c.strokeWidth,t.strokeStyle=v,t.lineJoin="round"),t.fillStyle=m,c.strokeWidth>0&&t.strokeText(c.text,e+l,i+c.vadjust),t.fillText(c.text,e+l,i+c.vadjust),l+=c.width}i+=d.height}}}},{key:"_setAlignment",value:function(t,e,i,o){if(this.isEdgeLabel&&"horizontal"!==this.fontOptions.align&&!1===this.pointToSelf){e=0,i=0;"top"===this.fontOptions.align?(t.textBaseline="alphabetic",i-=4):"bottom"===this.fontOptions.align?(t.textBaseline="hanging",i+=4):t.textBaseline="middle"}else t.textBaseline=o;return[e,i]}},{key:"_getColor",value:function(t,e,i){var o=t||"#000000",n=i||"#ffffff";if(e<=this.elementOptions.scaling.label.drawThreshold){var s=Math.max(0,Math.min(1,1-(this.elementOptions.scaling.label.drawThreshold-e)));o=c.overrideOpacity(o,s),n=c.overrideOpacity(n,s)}return[o,n]}},{key:"getTextSize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return this._processLabel(t,e,i),{width:this.size.width,height:this.size.height,lineCount:this.lineCount}}},{key:"getSize",value:function(){var t=this.size.left,e=this.size.top-1;if(this.isEdgeLabel){var i=.5*-this.size.width;switch(this.fontOptions.align){case"middle":t=i,e=.5*-this.size.height;break;case"top":t=i,e=-(this.size.height+2);break;case"bottom":t=i,e=2}}return{left:t,top:e,width:this.size.width,height:this.size.height}}}
19290,{key:"calculateLabelSize",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:0,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:0,s=arguments.length>5&&void 0!==arguments[5]?arguments[5]:"middle";this._processLabel(t,e,i),this.size.left=o-.5*this.size.width,this.size.top=n-.5*this.size.height,this.size.yLine=n+.5*(1-this.lineCount)*this.fontOptions.size,"hanging"===s&&(this.size.top+=.5*this.fontOptions.size,this.size.top+=4,this.size.yLine+=4)}},{key:"getFormattingValues",value:function(t,e,i,o){var n=function(t,e,i){return"normal"===e?"mod"===i?"":t[i]:void 0!==t[e][i]?t[e][i]:t[i]},s={color:n(this.fontOptions,o,"color"),size:n(this.fontOptions,o,"size"),face:n(this.fontOptions,o,"face"),mod:n(this.fontOptions,o,"mod"),vadjust:n(this.fontOptions,o,"vadjust"),strokeWidth:this.fontOptions.strokeWidth,strokeColor:this.fontOptions.strokeColor};(e||i)&&("normal"===o&&!0===this.fontOptions.chooser&&this.elementOptions.labelHighlightBold?s.mod="bold":"function"==typeof this.fontOptions.chooser&&this.fontOptions.chooser(s,this.elementOptions.id,e,i));var r="";return void 0!==s.mod&&""!==s.mod&&(r+=s.mod+" "),r+=s.size+"px "+s.face,t.font=r.replace(/"/g,""),s.font=t.font,s.height=s.size,s}},{key:"differentState",value:function(t,e){return t!==this.selectedState||e!==this.hoverState}},{key:"_processLabelText",value:function(t,e,i,o){return new f(t,this,e,i).process(o)}},{key:"_processLabel",value:function(t,e,i){if(!1!==this.labelDirty||this.differentState(e,i)){var o=this._processLabelText(t,e,i,this.elementOptions.label);this.fontOptions.minWdt>0&&o.width<this.fontOptions.minWdt&&(o.width=this.fontOptions.minWdt),this.size.labelHeight=o.height,this.fontOptions.minHgt>0&&o.height<this.fontOptions.minHgt&&(o.height=this.fontOptions.minHgt),this.lines=o.lines,this.lineCount=o.lines.length,this.size.width=o.width,this.size.height=o.height,this.selectedState=e,this.hoverState=i,this.labelDirty=!1}}},{key:"visible",value:function(){return 0!==this.size.width&&0!==this.size.height&&void 0!==this.elementOptions.label&&!(this.fontOptions.size*this.body.view.scale<this.elementOptions.scaling.label.drawThreshold-1)}}],[{key:"parseFontString",value:function(t,e){if(!e||"string"!=typeof e)return!1;var i=e.split(" ");return t.size=i[0].replace("px",""),t.face=i[1],t.color=i[2],!0}}]),t}();e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(2),u=i(119).default,c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=i,this.labelModule=o,this.options={},this.setOptions(e),this.colorDirty=!0,this.color={},this.selectionWidth=2,this.hoverWidth=1.5,this.fromPoint=this.from,this.toPoint=this.to}
19290return(0,d.default)(t,[{key:"connect",value:function(){this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to]}},{key:"cleanup",value:function(){return!1}},{key:"setOptions",value:function(t){this.options=t,this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to],this.id=this.options.id}},{key:"drawLine",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.lineWidth=e.width,!1!==e.dashes?this._drawDashedLine(t,e,n):this._drawLine(t,e,n)}},{key:"_drawLine",value:function(t,e,i,o,n){if(this.from!=this.to)this._line(t,e,i,o,n);else{var r=this._getCircleData(t),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2];this._circle(t,e,h,d,l)}}},{key:"_drawDashedLine",value:function(t,e,i,o,n){t.lineCap="round";var r=[5,5];if(!0===Array.isArray(e.dashes)&&(r=e.dashes),void 0!==t.setLineDash){if(t.save(),t.setLineDash(r),t.lineDashOffset=0,this.from!=this.to)this._line(t,e,i);else{var a=this._getCircleData(t),h=(0,s.default)(a,3),d=h[0],l=h[1],u=h[2];this._circle(t,e,d,l,u)}t.setLineDash([0]),t.lineDashOffset=0,t.restore()}else{if(this.from!=this.to)t.dashedLine(this.from.x,this.from.y,this.to.x,this.to.y,r);else{var c=this._getCircleData(t),p=(0,s.default)(c,3),f=p[0],m=p[1],v=p[2];this._circle(t,e,f,m,v)}this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}}},{key:"findBorderPosition",value:function(t,e,i){return this.from!=this.to?this._findBorderPosition(t,e,i):this._findBorderPositionCircle(t,e,i)}},{key:"findBorderPositions",value:function(t){var e={},i={};if(this.from!=this.to)e=this._findBorderPosition(this.from,t),i=this._findBorderPosition(this.to,t);else{var o=this._getCircleData(t).slice(0,2),n=(0,s.default)(o,2),r=n[0],a=n[1];e=this._findBorderPositionCircle(this.from,t,{x:r,y:a,low:.25,high:.6,direction:-1}),i=this._findBorderPositionCircle(this.from,t,{x:r,y:a,low:.6,high:.8,direction:1})}return{from:e,to:i}}},{key:"_getCircleData",value:function(t){var e=void 0,i=void 0,o=this.from,n=this.options.selfReferenceSize;return void 0!==t&&void 0===o.shape.width&&o.shape.resize(t),o.shape.width>o.shape.height?(e=o.x+.5*o.shape.width,i=o.y-n):(e=o.x+n,i=o.y-.5*o.shape.height),[e,i,n]}},{key:"_pointOnCircle",value:function(t,e,i,o){var n=2*o*Math.PI;return{x:t+i*Math.cos(n),y:e-i*Math.sin(n)}}},{key:"_findBorderPositionCircle",value:function(t,e,i){for(var o=i.x,n=i.y,s=i.low,r=i.high,a=i.direction,h=0,d=this.options.selfReferenceSize,l=void 0,u=void 0,c=void 0,p=void 0,f=void 0,m=.5*(s+r);s<=r&&h<10&&(m=.5*(s+r),l=this._pointOnCircle(o,n,d,m),u=Math.atan2(t.y-l.y,t.x-l.x),c=t.distanceToBorder(e,u),p=Math.sqrt(Math.pow(l.x-t.x,2)+Math.pow(l.y-t.y,2)),f=c-p,!(Math.abs(f)<.05));)f>0?a>0?s=m:r=m:a>0?r=m:s=m,h++;return l.t=m,l}},{key:"getLineWidth",value:function(t,e){return!0===t?Math.max(this.selectionWidth,.3/this.body.view.scale):!0===e?Math.max(this.hoverWidth,.3/this.body.view.scale):Math.max(this.options.width,.3/this.body.view.scale)}},{key:"getColor",value:function(t,e,i,o){if(!1!==e.inheritsColor){if("both"===e.inheritsColor&&this.from.id!==this.to.id){var n=t.createLinearGradient(this.from.x,this.from.y,this.to.x,this.to.y),s=void 0,r=void 0;return s=this.from.options.color.highlight.border,r=this.to.options.color.highlight.border,!1===this.from.selected&&!1===this.to.selected?(s=l.overrideOpacity(this.from.options.color.border,e.opacity),r=l.overrideOpacity(this.to.options.color.border,e.opacity)):!0===this.from.selected&&!1===this.to.selected?r=this.to.options.color.border:!1===this.from.selected&&!0===this.to.selected&&(s=this.from.options.color.border),n.addColorStop(0,s),n.addColorStop(1,r),n}return"to"===e.inheritsColor?l.overrideOpacity(this.to.options.color.border,e.opacity):l.overrideOpacity(this.from.options.color.border,e.opacity)}return l.overrideOpacity(e.color,e.opacity)}},{key:"_circle", 19291 value:function(t,e,i,o,n){this.enableShadow(t,e),t.beginPath(),t.arc(i,o,n,0,2*Math.PI,!1),t.stroke(),this.disableShadow(t,e)}},{key:"getDistanceToEdge",value:function(t,e,i,o,n,r,a,h){var d=0;if(this.from!=this.to)d=this._getDistanceToEdge(t,e,i,o,n,r,a);else{var l=this._getCircleData(void 0),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2],m=c-n,v=p-r;d=Math.abs(Math.sqrt(m*m+v*v)-f)}return d}}
19291,{key:"_getDistanceToLine",value:function(t,e,i,o,n,s){var r=i-t,a=o-e,h=r*r+a*a,d=((n-t)*r+(s-e)*a)/h;d>1?d=1:d<0&&(d=0);var l=t+d*r,u=e+d*a,c=l-n,p=u-s;return Math.sqrt(c*c+p*p)}},{key:"getArrowData",value:function(t,e,i,o,n,r){var a=void 0,h=void 0,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=r.width;if("from"===e?(d=this.from,l=this.to,u=.1,c=r.fromArrowScale,p=r.fromArrowType):"to"===e?(d=this.to,l=this.from,u=-.1,c=r.toArrowScale,p=r.toArrowType):(d=this.to,l=this.from,c=r.middleArrowScale,p=r.middleArrowType),d!=l)if("middle"!==e)if(!0===this.options.smooth.enabled){h=this.findBorderPosition(d,t,{via:i});var m=this.getPoint(Math.max(0,Math.min(1,h.t+u)),i);a=Math.atan2(h.y-m.y,h.x-m.x)}else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.findBorderPosition(d,t);else a=Math.atan2(d.y-l.y,d.x-l.x),h=this.getPoint(.5,i);else{var v=this._getCircleData(t),g=(0,s.default)(v,3),y=g[0],b=g[1],_=g[2];"from"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.25,high:.6,direction:-1}),a=-2*h.t*Math.PI+1.5*Math.PI+.1*Math.PI):"to"===e?(h=this.findBorderPosition(this.from,t,{x:y,y:b,low:.6,high:1,direction:1}),a=-2*h.t*Math.PI+1.5*Math.PI-1.1*Math.PI):(h=this._pointOnCircle(y,b,_,.175),a=3.9269908169872414)}"middle"===e&&c<0&&(f*=-1);var w=15*c+3*f;return{point:h,core:{x:h.x-.9*w*Math.cos(a),y:h.y-.9*w*Math.sin(a)},angle:a,length:w,type:p}}},{key:"drawArrowHead",value:function(t,e,i,o,n){t.strokeStyle=this.getColor(t,e,i,o),t.fillStyle=t.strokeStyle,t.lineWidth=e.width,u.draw(t,n),this.enableShadow(t,e),t.fill(),this.disableShadow(t,e)}},{key:"enableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor=e.shadowColor,t.shadowBlur=e.shadowSize,t.shadowOffsetX=e.shadowX,t.shadowOffsetY=e.shadowY)}},{key:"disableShadow",value:function(t,e){!0===e.shadow&&(t.shadowColor="rgba(0,0,0,0)",t.shadowBlur=0,t.shadowOffsetX=0,t.shadowOffsetY=0)}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"transform",value:function(t,e){t instanceof Array||(t=[t]);for(var i=e.point.x,o=e.point.y,n=e.angle,s=e.length,r=0;r<t.length;++r){var a=t[r],h=a.x*Math.cos(n)-a.y*Math.sin(n),d=a.x*Math.sin(n)+a.y*Math.cos(n);a.x=i+s*h,a.y=o+s*d}}},{key:"drawPath",value:function(t,e){t.beginPath(),t.moveTo(e[0].x,e[0].y);for(var i=1;i<e.length;++i)t.lineTo(e[i].x,e[i].y);t.closePath()}}]),t}(),m=function(t){function e(){return(0,u.default)(this,e),(0,a.default)(this,(e.__proto__||(0,s.default)(e)).apply(this,arguments))}return(0,d.default)(e,t),(0,p.default)(e,null,[{key:"draw",value:function(t,e){var i=[{x:0,y:0},{x:-1,y:.3},{x:-.9,y:0},{x:-1,y:-.3}];f.transform(i,e),f.drawPath(t,i)}}]),e}(f),v=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"draw",value:function(t,e){var i={x:-.4,y:0};f.transform(i,e),t.circle(i.x,i.y,.4*e.length)}}]),t}(),g=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"draw",value:function(t,e){var i=[{x:0,y:.5},{x:0,y:-.5},{x:-.15,y:-.5},{x:-.15,y:.5}];f.transform(i,e),f.drawPath(t,i)}}]),t}(),y=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,null,[{key:"draw",value:function(t,e){var i;switch(e.type&&(i=e.type.toLowerCase()),i){case"circle":v.draw(t,e);break;case"bar":g.draw(t,e);break;case"arrow":default:m.draw(t,e)}}}]),t}();e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.barnesHutTree,this.setOptions(o),this.randomSeed=5}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t,this.thetaInversed=1/this.options.theta,this.overlapAvoidanceFactor=1-Math.max(0,Math.min(1,this.options.avoidOverlap))}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"solve",value:function(){if(0!==this.options.gravitationalConstant&&this.physicsBody.physicsNodeIndices.length>0){var t=void 0,e=this.body.nodes,i=this.physicsBody.physicsNodeIndices,o=i.length,n=this._formBarnesHutTree(e,i);this.barnesHutTree=n;for(var s=0;s<o;s++)t=e[i[s]],t.options.mass>0&&this._getForceContributions(n.root,t)}}},{key:"_getForceContributions",value:function(t,e){this._getForceContribution(t.children.NW,e),this._getForceContribution(t.children.NE,e),this._getForceContribution(t.children.SW,e),this._getForceContribution(t.children.SE,e)}},{key:"_getForceContribution",value:function(t,e){if(t.childrenCount>0){var i=void 0,o=void 0,n=void 0;i=t.centerOfMass.x-e.x,o=t.centerOfMass.y-e.y,n=Math.sqrt(i*i+o*o),n*t.calcSize>this.thetaInversed?this._calculateForces(n,i,o,e,t):4===t.childrenCount?this._getForceContributions(t,e):t.children.data.id!=e.id&&this._calculateForces(n,i,o,e,t)}}}
19291,{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1,e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=this.options.gravitationalConstant*n.mass*o.options.mass/Math.pow(t,3),r=e*s,a=i*s;this.physicsBody.forces[o.id].x+=r,this.physicsBody.forces[o.id].y+=a}},{key:"_formBarnesHutTree",value:function(t,e){for(var i=void 0,o=e.length,n=t[e[0]].x,s=t[e[0]].y,r=t[e[0]].x,a=t[e[0]].y,h=1;h<o;h++){var d=t[e[h]],l=d.x,u=d.y;d.options.mass>0&&(l<n&&(n=l),l>r&&(r=l),u<s&&(s=u),u>a&&(a=u))}var c=Math.abs(r-n)-Math.abs(a-s);c>0?(s-=.5*c,a+=.5*c):(n+=.5*c,r-=.5*c);var p=Math.max(1e-5,Math.abs(r-n)),f=.5*p,m=.5*(n+r),v=.5*(s+a),g={root:{centerOfMass:{x:0,y:0},mass:0,range:{minX:m-f,maxX:m+f,minY:v-f,maxY:v+f},size:p,calcSize:1/p,children:{data:null},maxWidth:0,level:0,childrenCount:4}};this._splitBranch(g.root);for(var y=0;y<o;y++)i=t[e[y]],i.options.mass>0&&this._placeInTree(g.root,i);return g}},{key:"_updateBranchMass",value:function(t,e){var i=t.centerOfMass,o=t.mass+e.options.mass,n=1/o;i.x=i.x*t.mass+e.x*e.options.mass,i.x*=n,i.y=i.y*t.mass+e.y*e.options.mass,i.y*=n,t.mass=o;var s=Math.max(Math.max(e.height,e.radius),e.width);t.maxWidth=t.maxWidth<s?s:t.maxWidth}},{key:"_placeInTree",value:function(t,e,i){1==i&&void 0!==i||this._updateBranchMass(t,e);var o=t.children.NW.range,n=void 0;n=o.maxX>e.x?o.maxY>e.y?"NW":"SW":o.maxY>e.y?"NE":"SE",this._placeInRegion(t,e,n)}},{key:"_placeInRegion",value:function(t,e,i){var o=t.children[i];switch(o.childrenCount){case 0:o.children.data=e,o.childrenCount=1,this._updateBranchMass(o,e);break;case 1:o.children.data.x===e.x&&o.children.data.y===e.y?(e.x+=this.seededRandom(),e.y+=this.seededRandom()):(this._splitBranch(o),this._placeInTree(o,e));break;case 4:this._placeInTree(o,e)}}},{key:"_splitBranch",value:function(t){var e=null;1===t.childrenCount&&(e=t.children.data,t.mass=0,t.centerOfMass.x=0,t.centerOfMass.y=0),t.childrenCount=4,t.children.data=null,this._insertRegion(t,"NW"),this._insertRegion(t,"NE"),this._insertRegion(t,"SW"),this._insertRegion(t,"SE"),null!=e&&this._placeInTree(t,e)}},{key:"_insertRegion",value:function(t,e){var i=void 0,o=void 0,n=void 0,s=void 0,r=.5*t.size;switch(e){case"NW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY,s=t.range.minY+r;break;case"NE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY,s=t.range.minY+r;break;case"SW":i=t.range.minX,o=t.range.minX+r,n=t.range.minY+r,s=t.range.maxY;break;case"SE":i=t.range.minX+r,o=t.range.maxX,n=t.range.minY+r,s=t.range.maxY}t.children[e]={centerOfMass:{x:0,y:0},mass:0,range:{minX:i,maxX:o,minY:n,maxY:s},size:.5*t.size,calcSize:2*t.calcSize,children:{data:null},maxWidth:0,level:t.level+1,childrenCount:0}}},{key:"_debug",value:function(t,e){void 0!==this.barnesHutTree&&(t.lineWidth=1,this._drawBranch(this.barnesHutTree.root,t,e))}},{key:"_drawBranch",value:function(t,e,i){void 0===i&&(i="#FF0000"),4===t.childrenCount&&(this._drawBranch(t.children.NW,e),this._drawBranch(t.children.NE,e),this._drawBranch(t.children.SE,e),this._drawBranch(t.children.SW,e)),e.strokeStyle=i,e.beginPath(),e.moveTo(t.range.minX,t.range.minY),e.lineTo(t.range.maxX,t.range.minY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.minY),e.lineTo(t.range.maxX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.maxX,t.range.maxY),e.lineTo(t.range.minX,t.range.maxY),e.stroke(),e.beginPath(),e.moveTo(t.range.minX,t.range.maxY),e.lineTo(t.range.minX,t.range.minY),e.stroke()}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=void 0,o=void 0,n=this.body.nodes,s=this.physicsBody.physicsNodeIndices,r=this.physicsBody.forces,a=0;a<s.length;a++){o=n[s[a]],t=-o.x,e=-o.y,i=Math.sqrt(t*t+e*e),this._calculateForces(i,t,e,r,o)}}}
19291,{key:"_calculateForces",value:function(t,e,i,o,n){var s=0===t?0:this.options.centralGravity/t;o[n.id].x=e*s,o[n.id].y=i*s}}]),t}();e.default=h},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r="object",a=["arrow","circle","bar"],h={configure:{enabled:{boolean:n},filter:{boolean:n,string:o,array:"array",function:"function"},container:{dom:"dom"},showButton:{boolean:n},__type__:{object:r,boolean:n,string:o,array:"array",function:"function"}},edges:{arrows:{to:{enabled:{boolean:n},scaleFactor:{number:s},type:{string:a},__type__:{object:r,boolean:n}},middle:{enabled:{boolean:n},scaleFactor:{number:s},type:{string:a},__type__:{object:r,boolean:n}},from:{enabled:{boolean:n},scaleFactor:{number:s},type:{string:a},__type__:{object:r,boolean:n}},__type__:{string:["from","to","middle"],object:r}},arrowStrikethrough:{boolean:n},chosen:{label:{boolean:n,function:"function"},edge:{boolean:n,function:"function"},__type__:{object:r,boolean:n}},color:{color:{string:o},highlight:{string:o},hover:{string:o},inherit:{string:["from","to","both"],boolean:n},opacity:{number:s},__type__:{object:r,string:o}},dashes:{boolean:n,array:"array"},font:{color:{string:o},size:{number:s},face:{string:o},background:{string:o},strokeWidth:{number:s},strokeColor:{string:o},align:{string:["horizontal","top","middle","bottom"]},vadjust:{number:s},multi:{boolean:n,string:o},bold:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},boldital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},ital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},mono:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},__type__:{object:r,string:o}},hidden:{boolean:n},hoverWidth:{function:"function",number:s},label:{string:o,undefined:"undefined"},labelHighlightBold:{boolean:n},length:{number:s,undefined:"undefined"},physics:{boolean:n},scaling:{min:{number:s},max:{number:s},label:{enabled:{boolean:n},min:{number:s},max:{number:s},maxVisible:{number:s},drawThreshold:{number:s},__type__:{object:r,boolean:n}},customScalingFunction:{function:"function"},__type__:{object:r}},selectionWidth:{function:"function",number:s},selfReferenceSize:{number:s},shadow:{enabled:{boolean:n},color:{string:o},size:{number:s},x:{number:s},y:{number:s},__type__:{object:r,boolean:n}},smooth:{enabled:{boolean:n},type:{string:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"]},roundness:{number:s},forceDirection:{string:["horizontal","vertical","none"],boolean:n},__type__:{object:r,boolean:n}},title:{string:o,undefined:"undefined"},width:{number:s},widthConstraint:{maximum:{number:s},__type__:{object:r,boolean:n,number:s}},value:{number:s,undefined:"undefined"},__type__:{object:r}},groups:{useDefaultGroups:{boolean:n},__any__:"get from nodes, will be overwritten below",__type__:{object:r}},interaction:{dragNodes:{boolean:n},dragView:{boolean:n},hideEdgesOnDrag:{boolean:n},hideNodesOnDrag:{boolean:n},hover:{boolean:n},keyboard:{enabled:{boolean:n},speed:{x:{number:s},y:{number:s},zoom:{number:s},__type__:{object:r}},bindToWindow:{boolean:n},__type__:{object:r,boolean:n}},multiselect:{boolean:n},navigationButtons:{boolean:n},selectable:{boolean:n},selectConnectedEdges:{boolean:n},hoverConnectedEdges:{boolean:n},tooltipDelay:{number:s},zoomView:{boolean:n},__type__:{object:r}},layout:{randomSeed:{undefined:"undefined",number:s},improvedLayout:{boolean:n},hierarchical:{enabled:{boolean:n},levelSeparation:{number:s},nodeSpacing:{number:s},treeSpacing:{number:s},blockShifting:{boolean:n},edgeMinimization:{boolean:n},parentCentralization:{boolean:n},direction:{string:["UD","DU","LR","RL"]},sortMethod:{string:["hubsize","directed"]},__type__:{object:r,boolean:n}},__type__:{object:r}},manipulation:{enabled:{boolean:n},initiallyActive:{boolean:n},addNode:{boolean:n,function:"function"},addEdge:{boolean:n,function:"function"},editNode:{function:"function"},editEdge:{editWithoutDrag:{function:"function"},__type__:{object:r,boolean:n,function:"function"}},deleteNode:{boolean:n,function:"function"},deleteEdge:{boolean:n,function:"function"},controlNodeStyle:"get from nodes, will be overwritten below",__type__:{object:r,boolean:n}},nodes:{borderWidth:{number:s},borderWidthSelected:{number:s,undefined:"undefined"},brokenImage:{string:o,undefined:"undefined"},chosen:{label:{boolean:n,function:"function"},node:{boolean:n,function:"function"},__type__:{object:r,boolean:n}},color:{border:{string:o},background:{string:o},highlight:{border:{string:o},background:{string:o},__type__:{object:r,string:o}},hover:{border:{string:o},background:{string:o},__type__:{object:r,string:o}},__type__:{object:r,string:o}},fixed:{x:{boolean:n},y:{boolean:n},__type__:{object:r,boolean:n}},font:{align:{string:o},color:{string:o},size:{number:s},face:{string:o},background:{string:o},strokeWidth:{number:s},strokeColor:{string:o},vadjust:{number:s},multi:{boolean:n,string:o},bold:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},boldital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},ital:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},mono:{color:{string:o},size:{number:s},face:{string:o},mod:{string:o},vadjust:{number:s},__type__:{object:r,string:o}},__type__:{object:r,string:o}},group:{string:o,number:s,undefined:"undefined"},heightConstraint:{minimum:{number:s}
vendor: 4,145 bytes, line 19291
19291,valign:{string:o},__type__:{object:r,boolean:n,number:s}},hidden:{boolean:n},icon:{face:{string:o},code:{string:o},size:{number:s},color:{string:o},__type__:{object:r}},id:{string:o,number:s},image:{selected:{string:o,undefined:"undefined"},unselected:{string:o,undefined:"undefined"},__type__:{object:r,string:o}},label:{string:o,undefined:"undefined"},labelHighlightBold:{boolean:n},level:{number:s,undefined:"undefined"},margin:{top:{number:s},right:{number:s},bottom:{number:s},left:{number:s},__type__:{object:r,number:s}},mass:{number:s},physics:{boolean:n},scaling:{min:{number:s},max:{number:s},label:{enabled:{boolean:n},min:{number:s},max:{number:s},maxVisible:{number:s},drawThreshold:{number:s},__type__:{object:r,boolean:n}},customScalingFunction:{function:"function"},__type__:{object:r}},shadow:{enabled:{boolean:n},color:{string:o},size:{number:s},x:{number:s},y:{number:s},__type__:{object:r,boolean:n}},shape:{string:["ellipse","circle","database","box","text","image","circularImage","diamond","dot","star","triangle","triangleDown","square","icon","hexagon"]},shapeProperties:{borderDashes:{boolean:n,array:"array"},borderRadius:{number:s},interpolation:{boolean:n},useImageSize:{boolean:n},useBorderWithImage:{boolean:n},__type__:{object:r}},size:{number:s},title:{string:o,dom:"dom",undefined:"undefined"},value:{number:s,undefined:"undefined"},widthConstraint:{minimum:{number:s},maximum:{number:s},__type__:{object:r,boolean:n,number:s}},x:{number:s},y:{number:s},__type__:{object:r}},physics:{enabled:{boolean:n},barnesHut:{gravitationalConstant:{number:s},centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},damping:{number:s},avoidOverlap:{number:s},__type__:{object:r}},forceAtlas2Based:{gravitationalConstant:{number:s},centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},damping:{number:s},avoidOverlap:{number:s},__type__:{object:r}},repulsion:{centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},nodeDistance:{number:s},damping:{number:s},__type__:{object:r}},hierarchicalRepulsion:{centralGravity:{number:s},springLength:{number:s},springConstant:{number:s},nodeDistance:{number:s},damping:{number:s},__type__:{object:r}},maxVelocity:{number:s},minVelocity:{number:s},solver:{string:["barnesHut","repulsion","hierarchicalRepulsion","forceAtlas2Based"]},stabilization:{enabled:{boolean:n},iterations:{number:s},updateInterval:{number:s},onlyDynamicEdges:{boolean:n},fit:{boolean:n},__type__:{object:r,boolean:n}},timestep:{number:s},adaptiveTimestep:{boolean:n},__type__:{object:r,boolean:n}},autoResize:{boolean:n},clickToUse:{boolean:n},locale:{string:o},locales:{__any__:{any:"any"},__type__:{object:r}},height:{string:o},width:{string:o},__type__:{object:r}};h.groups.__any__=h.nodes,h.manipulation.controlNodeStyle=h.nodes;var d={nodes:{borderWidth:[1,0,10,1],borderWidthSelected:[2,0,10,1],color:{border:["color","#2B7CE9"],background:["color","#97C2FC"],highlight:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]},hover:{border:["color","#2B7CE9"],background:["color","#D2E5FF"]}},fixed:{x:!1,y:!1},font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[0,0,50,1],strokeColor:["color","#ffffff"]},hidden:!1,labelHighlightBold:!0,physics:!0,scaling:{min:[10,0,200,1],max:[30,0,200,1],label:{enabled:!1,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},shape:["ellipse","box","circle","database","diamond","dot","square","star","text","triangle","triangleDown","hexagon"],shapeProperties:{borderDashes:!1,borderRadius:[6,0,20,1],interpolation:!0,useImageSize:!1},size:[25,0,200,1]},edges:{arrows:{to:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},middle:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"},from:{enabled:!1,scaleFactor:[1,0,3,.05],type:"arrow"}},arrowStrikethrough:!0,color:{color:["color","#848484"],highlight:["color","#848484"],hover:["color","#848484"],inherit:["from","to","both",!0,!1],opacity:[1,0,1,.05]}
19291,dashes:!1,font:{color:["color","#343434"],size:[14,0,100,1],face:["arial","verdana","tahoma"],background:["color","none"],strokeWidth:[2,0,50,1],strokeColor:["color","#ffffff"],align:["horizontal","top","middle","bottom"]},hidden:!1,hoverWidth:[1.5,0,5,.1],labelHighlightBold:!0,physics:!0,scaling:{min:[1,0,100,1],max:[15,0,100,1],label:{enabled:!0,min:[14,0,200,1],max:[30,0,200,1],maxVisible:[30,0,200,1],drawThreshold:[5,0,20,1]}},selectionWidth:[1.5,0,5,.1],selfReferenceSize:[20,0,200,1],shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:[10,0,20,1],x:[5,-30,30,1],y:[5,-30,30,1]},smooth:{enabled:!0,type:["dynamic","continuous","discrete","diagonalCross","straightCross","horizontal","vertical","curvedCW","curvedCCW","cubicBezier"],forceDirection:["horizontal","vertical","none"],roundness:[.5,0,1,.05]},width:[1,0,30,1]},layout:{hierarchical:{enabled:!1,levelSeparation:[150,20,500,5],nodeSpacing:[100,20,500,5],treeSpacing:[200,20,500,5],blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:["UD","DU","LR","RL"],sortMethod:["hubsize","directed"]}},interaction:{dragNodes:!0,dragView:!0,hideEdgesOnDrag:!1,hideNodesOnDrag:!1,hover:!1,keyboard:{enabled:!1,speed:{x:[10,0,40,1],y:[10,0,40,1],zoom:[.02,0,.1,.005]},bindToWindow:!0},multiselect:!1,navigationButtons:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0,tooltipDelay:[300,0,1e3,25],zoomView:!0},manipulation:{enabled:!1,initiallyActive:!1},physics:{enabled:!0,barnesHut:{gravitationalConstant:[-2e3,-3e4,0,50],centralGravity:[.3,0,10,.05],springLength:[95,0,500,5],springConstant:[.04,0,1.2,.005],damping:[.09,0,1,.01],avoidOverlap:[0,0,1,.01]},forceAtlas2Based:{gravitationalConstant:[-50,-500,0,1],centralGravity:[.01,0,1,.005],springLength:[95,0,500,5],springConstant:[.08,0,1.2,.005],damping:[.4,0,1,.01],avoidOverlap:[0,0,1,.01]},repulsion:{centralGravity:[.2,0,10,.05],springLength:[200,0,500,5],springConstant:[.05,0,1.2,.005],nodeDistance:[100,0,500,5],damping:[.09,0,1,.01]},hierarchicalRepulsion:{centralGravity:[.2,0,10,.05],springLength:[100,0,500,5],springConstant:[.01,0,1.2,.005],nodeDistance:[120,0,500,5],damping:[.09,0,1,.01]},maxVelocity:[50,0,150,1],minVelocity:[.1,.01,.5,.01],solver:["barnesHut","forceAtlas2Based","repulsion","hierarchicalRepulsion"],timestep:[.5,.01,1,.01]}};e.allOptions=h,e.configureOptions=d},function(t,e,i){var o=i(2);o.extend(e,i(159)),o.extend(e,i(177)),o.extend(e,i(181))},function(t,e,i){i(49),i(60),t.exports=i(136)},function(t,e,i){var o=i(126),n=i(127),s=i(31),r=i(25);t.exports=i(79)(Array,"Array",function(t,e){this._t=r(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,i=this._i++;return!t||i>=t.length?(this._t=void 0,n(1)):"keys"==e?n(0,i):"values"==e?n(0,t[i]):n(0,[i,t[i]])},"values"),s.Arguments=s.Array,o("keys"),o("values"),o("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,i){var o=i(54),n=i(39),s=i(59),r={};i(26)(r,i(13)("iterator"),function(){return this}),t.exports=function(t,e,i){t.prototype=o(r,{next:n(1,i)}),s(t,e+" Iterator")}},function(t,e,i){var o=i(20),n=i(27),s=i(33);t.exports=i(21)?Object.defineProperties:function(t,e){n(t);for(var i,r=s(e),a=r.length,h=0;a>h;)o.f(t,i=r[h++],e[i]);return t}},function(t,e,i){var o=i(25),n=i(132),s=i(133);t.exports=function(t){return function(e,i,r){var a,h=o(e),d=n(h.length),l=s(r,d);if(t&&i!=i){for(;d>l;)if((a=h[l++])!=a)return!0}else for(;d>l;l++)if((t||l in h)&&h[l]===i)return t||l||0;return!t&&-1}}},function(t,e,i){var o=i(55),n=Math.min;t.exports=function(t){return t>0?n(o(t),9007199254740991):0}},function(t,e,i){var o=i(55),n=Math.max,s=Math.min;t.exports=function(t,e){return t=o(t),t<0?n(t+e,0):s(t,e)}},function(t,e,i){var o=i(18).document;t.exports=o&&o.documentElement},function(t,e,i){var o=i(55),n=i(51);t.exports=function(t){return function(e,i){var s,r,a=String(n(e)),h=o(i),d=a.length;return h<0||h>=d?t?"":void 0:(s=a.charCodeAt(h),s<55296||s>
vendor: 4,170 bytes, line 19291
1929156319||h+1===d||(r=a.charCodeAt(h+1))<56320||r>57343?t?a.charAt(h):s:t?a.slice(h,h+2):r-56320+(s-55296<<10)+65536)}}},function(t,e,i){var o=i(27),n=i(137);t.exports=i(7).getIterator=function(t){var e=n(t);if("function"!=typeof e)throw TypeError(t+" is not iterable!");return o(e.call(t))}},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).getIteratorMethod=function(t){if(void 0!=t)return t[n]||t["@@iterator"]||s[o(t)]}},function(t,e,i){i(139);var o=i(7).Object;t.exports=function(t,e){return o.create(t,e)}},function(t,e,i){var o=i(17);o(o.S,"Object",{create:i(54)})},function(t,e,i){i(141),t.exports=i(7).Object.keys},function(t,e,i){var o=i(41),n=i(33);i(87)("keys",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(143),__esModule:!0}},function(t,e,i){i(60),i(49),t.exports=i(61).f("iterator")},function(t,e,i){t.exports={default:i(145),__esModule:!0}},function(t,e,i){i(146),i(151),i(152),i(153),t.exports=i(7).Symbol},function(t,e,i){var o=i(18),n=i(22),s=i(21),r=i(17),a=i(83),h=i(147).KEY,d=i(28),l=i(57),u=i(59),c=i(40),p=i(13),f=i(61),m=i(62),v=i(148),g=i(149),y=i(27),b=i(25),_=i(53),w=i(39),x=i(54),k=i(150),S=i(89),D=i(20),M=i(33),C=S.f,O=D.f,E=k.f,T=o.Symbol,P=o.JSON,I=P&&P.stringify,N=p("_hidden"),R=p("toPrimitive"),A={}.propertyIsEnumerable,z=l("symbol-registry"),L=l("symbols"),F=l("op-symbols"),B=Object.prototype,j="function"==typeof T,H=o.QObject,W=!H||!H.prototype||!H.prototype.findChild,Y=s&&d(function(){return 7!=x(O({},"a",{get:function(){return O(this,"a",{value:7}).a}})).a})?function(t,e,i){var o=C(B,e);o&&delete B[e],O(t,e,i),o&&t!==B&&O(B,e,o)}:O,G=function(t){var e=L[t]=x(T.prototype);return e._k=t,e},V=j&&"symbol"==typeof T.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof T},U=function(t,e,i){return t===B&&U(F,e,i),y(t),e=_(e,!0),y(i),n(L,e)?(i.enumerable?(n(t,N)&&t[N][e]&&(t[N][e]=!1),i=x(i,{enumerable:w(0,!1)})):(n(t,N)||O(t,N,w(1,{})),t[N][e]=!0),Y(t,e,i)):O(t,e,i)},q=function(t,e){y(t);for(var i,o=v(e=b(e)),n=0,s=o.length;s>n;)U(t,i=o[n++],e[i]);return t},X=function(t,e){return void 0===e?x(t):q(x(t),e)},Z=function(t){var e=A.call(this,t=_(t,!0));return!(this===B&&n(L,t)&&!n(F,t))&&(!(e||!n(this,t)||!n(L,t)||n(this,N)&&this[N][t])||e)},K=function(t,e){if(t=b(t),e=_(e,!0),t!==B||!n(L,e)||n(F,e)){var i=C(t,e);return!i||!n(L,e)||n(t,N)&&t[N][e]||(i.enumerable=!0),i}},J=function(t){for(var e,i=E(b(t)),o=[],s=0;i.length>s;)n(L,e=i[s++])||e==N||e==h||o.push(e);return o},$=function(t){for(var e,i=t===B,o=E(i?F:b(t)),s=[],r=0;o.length>r;)!n(L,e=o[r++])||i&&!n(B,e)||s.push(L[e]);return s};j||(T=function(){if(this instanceof T)throw TypeError("Symbol is not a constructor!");var t=c(arguments.length>0?arguments[0]:void 0),e=function(i){this===B&&e.call(F,i),n(this,N)&&n(this[N],t)&&(this[N][t]=!1),Y(this,t,w(1,i))};return s&&W&&Y(B,t,{configurable:!0,set:e}),G(t)},a(T.prototype,"toString",function(){return this._k}),S.f=K,D.f=U,i(88).f=k.f=J,i(42).f=Z,i(63).f=$,s&&!i(52)&&a(B,"propertyIsEnumerable",Z,!0),f.f=function(t){return G(p(t))}),r(r.G+r.W+r.F*!j,{Symbol:T});for(var Q="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Q.length>tt;)p(Q[tt++]);for(var et=M(p.store),it=0;et.length>it;)m(et[it++]);r(r.S+r.F*!j,"Symbol",{for:function(t){return n(z,t+="")?z[t]:z[t]=T(t)},keyFor:function(t){if(!V(t))throw TypeError(t+" is not a symbol!");for(var e in z)if(z[e]===t)return e},useSetter:function(){W=!0},useSimple:function(){W=!1}}),r(r.S+r.F*!j,"Object",{create:X,defineProperty:U,defineProperties:q,getOwnPropertyDescriptor:K,getOwnPropertyNames:J,getOwnPropertySymbols:$}),P&&r(r.S+r.F*(!j||d(function(){var t=T();return"[null]"!=I([t])||"{}"!=I({a:t})||"{}"!=I(Object(t))})),"JSON",{stringify:function(t){if(void 0!==t&&!V(t)){for(var e,i,o=[t],n=1;arguments.length>n;)o.push(arguments[n++]);return e=o[1],"function"==typeof e&&(i=e),!i&&g(e)||(e=function(t,e){if(i&&(e=i.call(this,t,e)),!V(e))return e}),o[1]=e,I.apply(P,o)}}}),T.prototype[R]||i(26)(T.prototype,R,T.prototype.valueOf),u(T,"Symbol"),u(Math,"Math",!0),u(o.JSON,"JSON",!0)}
vendor: 24,237 bytes, lines 19291-19292
19291,function(t,e,i){var o=i(40)("meta"),n=i(32),s=i(22),r=i(20).f,a=0,h=Object.isExtensible||function(){return!0},d=!i(28)(function(){return h(Object.preventExtensions({}))}),l=function(t){r(t,o,{value:{i:"O"+ ++a,w:{}}})},u=function(t,e){if(!n(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!s(t,o)){if(!h(t))return"F";if(!e)return"E";l(t)}return t[o].i},c=function(t,e){if(!s(t,o)){if(!h(t))return!0;if(!e)return!1;l(t)}return t[o].w},p=function(t){return d&&f.NEED&&h(t)&&!s(t,o)&&l(t),t},f=t.exports={KEY:o,NEED:!1,fastKey:u,getWeak:c,onFreeze:p}},function(t,e,i){var o=i(33),n=i(63),s=i(42);t.exports=function(t){var e=o(t),i=n.f;if(i)for(var r,a=i(t),h=s.f,d=0;a.length>d;)h.call(t,r=a[d++])&&e.push(r);return e}},function(t,e,i){var o=i(50);t.exports=Array.isArray||function(t){return"Array"==o(t)}},function(t,e,i){var o=i(25),n=i(88).f,s={}.toString,r="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],a=function(t){try{return n(t)}catch(t){return r.slice()}};t.exports.f=function(t){return r&&"[object Window]"==s.call(t)?a(t):n(o(t))}},function(t,e){},function(t,e,i){i(62)("asyncIterator")},function(t,e,i){i(62)("observable")},function(t,e,i){(function(t){!function(e,i){t.exports=i()}(0,function(){function e(){return Co.apply(null,arguments)}function i(t){return t instanceof Array||"[object Array]"===Object.prototype.toString.call(t)}function o(t){return null!=t&&"[object Object]"===Object.prototype.toString.call(t)}function n(t){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(t).length;var e;for(e in t)if(t.hasOwnProperty(e))return!1;return!0}function s(t){return void 0===t}function r(t){return"number"==typeof t||"[object Number]"===Object.prototype.toString.call(t)}function a(t){return t instanceof Date||"[object Date]"===Object.prototype.toString.call(t)}function h(t,e){var i,o=[];for(i=0;i<t.length;++i)o.push(e(t[i],i));return o}function d(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function l(t,e){for(var i in e)d(e,i)&&(t[i]=e[i]);return d(e,"toString")&&(t.toString=e.toString),d(e,"valueOf")&&(t.valueOf=e.valueOf),t}function u(t,e,i,o){return Se(t,e,i,o,!0).utc()}function c(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function p(t){return null==t._pf&&(t._pf=c()),t._pf}function f(t){if(null==t._isValid){var e=p(t),i=Oo.call(e.parsedDateParts,function(t){return null!=t}),o=!isNaN(t._d.getTime())&&e.overflow<0&&!e.empty&&!e.invalidMonth&&!e.invalidWeekday&&!e.weekdayMismatch&&!e.nullInput&&!e.invalidFormat&&!e.userInvalidated&&(!e.meridiem||e.meridiem&&i);if(t._strict&&(o=o&&0===e.charsLeftOver&&0===e.unusedTokens.length&&void 0===e.bigHour),null!=Object.isFrozen&&Object.isFrozen(t))return o;t._isValid=o}return t._isValid}function m(t){var e=u(NaN);return null!=t?l(p(e),t):p(e).userInvalidated=!0,e}function v(t,e){var i,o,n;if(s(e._isAMomentObject)||(t._isAMomentObject=e._isAMomentObject),s(e._i)||(t._i=e._i),s(e._f)||(t._f=e._f),s(e._l)||(t._l=e._l),s(e._strict)||(t._strict=e._strict),s(e._tzm)||(t._tzm=e._tzm),s(e._isUTC)||(t._isUTC=e._isUTC),s(e._offset)||(t._offset=e._offset),s(e._pf)||(t._pf=p(e)),s(e._locale)||(t._locale=e._locale),Eo.length>0)for(i=0;i<Eo.length;i++)o=Eo[i],n=e[o],s(n)||(t[o]=n);return t}function g(t){v(this,t),this._d=new Date(null!=t._d?t._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===To&&(To=!0,e.updateOffset(this),To=!1)}function y(t){return t instanceof g||null!=t&&null!=t._isAMomentObject}function b(t){return t<0?Math.ceil(t)||0:Math.floor(t)}function _(t){var e=+t,i=0;return 0!==e&&isFinite(e)&&(i=b(e)),i}function w(t,e,i){var o,n=Math.min(t.length,e.length),s=Math.abs(t.length-e.length),r=0;for(o=0;o<n;o++)(i&&t[o]!==e[o]||!i&&_(t[o])!==_(e[o]))&&r++;return r+s}function x(t){!1===e.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+t)}function k(t,i){var o=!0;return l(function(){if(null!=e.deprecationHandler&&e.deprecationHandler(null,t),o){for(var n,s=[],r=0;r<arguments.length;r++){if(n="","object"==typeof arguments[r]){n+="\n["+r+"] " 19292;for(var a in arguments[0])n+=a+": "+arguments[0][a]+", ";n=n.slice(0,-2)}else n=arguments[r];s.push(n)}x(t+"\nArguments: "+Array.prototype.slice.call(s).join("")+"\n"+(new Error).stack),o=!1}return i.apply(this,arguments)},i)}function S(t,i){null!=e.deprecationHandler&&e.deprecationHandler(t,i),Po[t]||(x(i),Po[t]=!0)}function D(t){return t instanceof Function||"[object Function]"===Object.prototype.toString.call(t)}function M(t){var e,i;for(i in t)e=t[i],D(e)?this[i]=e:this["_"+i]=e;this._config=t,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function C(t,e){var i,n=l({},t);for(i in e)d(e,i)&&(o(t[i])&&o(e[i])?(n[i]={},l(n[i],t[i]),l(n[i],e[i])):null!=e[i]?n[i]=e[i]:delete n[i]);for(i in t)d(t,i)&&!d(e,i)&&o(t[i])&&(n[i]=l({},n[i]));return n}function O(t){null!=t&&this.set(t)}function E(t,e,i){var o=this._calendar[t]||this._calendar.sameElse;return D(o)?o.call(e,i):o}function T(t){var e=this._longDateFormat[t],i=this._longDateFormat[t.toUpperCase()];return e||!i?e:(this._longDateFormat[t]=i.replace(/MMMM|MM|DD|dddd/g,function(t){return t.slice(1)}),this._longDateFormat[t])}function P(){return this._invalidDate}function I(t){return this._ordinal.replace("%d",t)}function N(t,e,i,o){var n=this._relativeTime[i];return D(n)?n(t,e,i,o):n.replace(/%d/i,t)}function R(t,e){var i=this._relativeTime[t>0?"future":"past"];return D(i)?i(e):i.replace(/%s/i,e)}function A(t,e){var i=t.toLowerCase();Lo[i]=Lo[i+"s"]=Lo[e]=t}function z(t){return"string"==typeof t?Lo[t]||Lo[t.toLowerCase()]:void 0}function L(t){var e,i,o={};for(i in t)d(t,i)&&(e=z(i))&&(o[e]=t[i]);return o}function F(t,e){Fo[t]=e}function B(t){var e=[];for(var i in t)e.push({unit:i,priority:Fo[i]});return e.sort(function(t,e){return t.priority-e.priority}),e}function j(t,e,i){var o=""+Math.abs(t),n=e-o.length;return(t>=0?i?"+":"":"-")+Math.pow(10,Math.max(0,n)).toString().substr(1)+o}function H(t,e,i,o){var n=o;"string"==typeof o&&(n=function(){return this[o]()}),t&&(Wo[t]=n),e&&(Wo[e[0]]=function(){return j(n.apply(this,arguments),e[1],e[2])}),i&&(Wo[i]=function(){return this.localeData().ordinal(n.apply(this,arguments),t)})}function W(t){return t.match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"")}function Y(t){var e,i,o=t.match(Bo);for(e=0,i=o.length;e<i;e++)Wo[o[e]]?o[e]=Wo[o[e]]:o[e]=W(o[e]);return function(e){var n,s="";for(n=0;n<i;n++)s+=D(o[n])?o[n].call(e,t):o[n];return s}}function G(t,e){return t.isValid()?(e=V(e,t.localeData()),Ho[e]=Ho[e]||Y(e),Ho[e](t)):t.localeData().invalidDate()}function V(t,e){function i(t){return e.longDateFormat(t)||t}var o=5;for(jo.lastIndex=0;o>=0&&jo.test(t);)t=t.replace(jo,i),jo.lastIndex=0,o-=1;return t}function U(t,e,i){an[t]=D(e)?e:function(t,o){return t&&i?i:e}}function q(t,e){return d(an,t)?an[t](e._strict,e._locale):new RegExp(X(t))}function X(t){return Z(t.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(t,e,i,o,n){return e||i||o||n}))}function Z(t){return t.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function K(t,e){var i,o=e;for("string"==typeof t&&(t=[t]),r(e)&&(o=function(t,i){i[e]=_(t)}),i=0;i<t.length;i++)hn[t[i]]=o}function J(t,e){K(t,function(t,i,o,n){o._w=o._w||{},e(t,o._w,o,n)})}function $(t,e,i){null!=e&&d(hn,t)&&hn[t](e,i._a,i,t)}function Q(t){return tt(t)?366:365}function tt(t){return t%4==0&&t%100!=0||t%400==0}function et(){return tt(this.year())}function it(t,i){return function(o){return null!=o?(nt(this,t,o),e.updateOffset(this,i),this):ot(this,t)}}function ot(t,e){return t.isValid()?t._d["get"+(t._isUTC?"UTC":"")+e]():NaN}function nt(t,e,i){t.isValid()&&!isNaN(i)&&("FullYear"===e&&tt(t.year())?t._d["set"+(t._isUTC?"UTC":"")+e](i,t.month(),ht(i,t.month())):t._d["set"+(t._isUTC?"UTC":"")+e](i))}function st(t){return t=z(t),D(this[t])?this[t]():this}function rt(t,e){if("object"==typeof t){t=L(t);for(var i=B(t),o=0;o<i.length;o++)this[i[o].unit](t[i[o].unit])}else if(t=z(t),D(this[t]))return this[t](e);return this}function at(t,e){return(t%e+e)%e}function ht(t,e){if(isNaN(t)||isNaN(e))return NaN;var i=at(e,12);return t+=(e-i)/12,1===i?tt(t)?29:28:31-i%7%2}function dt(t,e){return t?i(this._months)?this._months[t.month()]:this._months[(this._months.isFormat||_n).test(e)?"format":"standalone"][t.month()]:i(this._months)?this._months:this._months.standalone}function lt(t,e){return t?i(this._monthsShort)?this._monthsShort[t.month()]:this._monthsShort[_n.test(e)?"format":"standalone"][t.month()]:i(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function ut(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],o=0;o<12;++o)s=u([2e3,o]),this._shortMonthsParse[o]=this.monthsShort(s,"").toLocaleLowerCase(),this._longMonthsParse[o]=this.months(s,"").toLocaleLowerCase();return i?"MMM"===e?(n=yn.call(this._shortMonthsParse,r),-1!==n?n:null):(n=yn.call(this._longMonthsParse,r),-1!==n?n:null):"MMM"===e?-1!==(n=yn.call(this._shortMonthsParse,r))?n:(n=yn.call(this._longMonthsParse,r),-1!==n?n:null):-1!==(n=yn.call(this._longMonthsParse,r))?n:(n=yn.call(this._shortMonthsParse,r),-1!==n?n:null)}function ct(t,e,i){var o,n,s;if(this._monthsParseExact)return ut.call(this,t,e,i);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),o=0;o<12;o++){if(n=u([2e3,o]),i&&!this._longMonthsParse[o]&&(this._longMonthsParse[o]=new RegExp("^"+this.months(n,"").replace(".","")+"$","i"),this._shortMonthsParse[o]=new RegExp("^"+this.monthsShort(n,"").replace(".","")+"$","i")),i||this._monthsParse[o]||(s="^"+this.months(n,"")+"|^"+this.monthsShort(n,""),this._monthsParse[o]=new RegExp(s.replace(".",""),"i")),i&&"MMMM"===e&&this._longMonthsParse[o].test(t))return o;if(i&&"MMM"===e&&this._shortMonthsParse[o].test(t))return o;if(!i&&this._monthsParse[o].test(t))return o}}function pt(t,e){var i;if(!t.isValid())return t;if("string"==typeof e)if(/^\d+$/.test(e))e=_(e);else if(e=t.localeData().monthsParse(e),!r(e))return t;return i=Math.min(t.date(),ht(t.year(),e)),t._d["set"+(t._isUTC?"UTC":"")+"Month"](e,i),t}function ft(t){return null!=t?(pt(this,t),e.updateOffset(this,!0),this):ot(this,"Month")}function mt(){return ht(this.year(),this.month())}function vt(t){return this._monthsParseExact?(d(this,"_monthsRegex")||yt.call(this),t?this._monthsShortStrictRegex:this._monthsShortRegex):(d(this,"_monthsShortRegex")||(this._monthsShortRegex=kn),this._monthsShortStrictRegex&&t?this._monthsShortStrictRegex:this._monthsShortRegex)}function gt(t){return this._monthsParseExact?(d(this,"_monthsRegex")||yt.call(this),t?this._monthsStrictRegex:this._monthsRegex):(d(this,"_monthsRegex")||(this._monthsRegex=Sn),this._monthsStrictRegex&&t?this._monthsStrictRegex:this._monthsRegex)}function yt(){function t(t,e){return e.length-t.length}var e,i,o=[],n=[],s=[];for(e=0;e<12;e++)i=u([2e3,e]),o.push(this.monthsShort(i,"")),n.push(this.months(i,"")),s.push(this.months(i,"")),s.push(this.monthsShort(i,""));for(o.sort(t),n.sort(t),s.sort(t),e=0;e<12;e++)o[e]=Z(o[e]),n[e]=Z(n[e]);for(e=0;e<24;e++)s[e]=Z(s[e]);this._monthsRegex=new RegExp("^("+s.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+n.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+o.join("|")+")","i")}function bt(t,e,i,o,n,s,r){var a=new Date(t,e,i,o,n,s,r);return t<100&&t>=0&&isFinite(a.getFullYear())&&a.setFullYear(t),a}function _t(t){var e=new Date(Date.UTC.apply(null,arguments));return t<100&&t>=0&&isFinite(e.getUTCFullYear())&&e.setUTCFullYear(t),e}function wt(t,e,i){var o=7+e-i;return-(7+_t(t,0,o).getUTCDay()-e)%7+o-1}function xt(t,e,i,o,n){var s,r,a=(7+i-o)%7,h=wt(t,o,n),d=1+7*(e-1)+a+h;return d<=0?(s=t-1,r=Q(s)+d):d>Q(t)?(s=t+1,r=d-Q(t)):(s=t,r=d),{year:s,dayOfYear:r}}function kt(t,e,i){var o,n,s=wt(t.year(),e,i),r=Math.floor((t.dayOfYear()-s-1)/7)+1;return r<1?(n=t.year()-1,o=r+St(n,e,i)):r>St(t.year(),e,i)?(o=r-St(t.year(),e,i),n=t.year()+1):(n=t.year(),o=r),{week:o,year:n}}function St(t,e,i){var o=wt(t,e,i),n=wt(t+1,e,i);return(Q(t)-o+n)/7}function Dt(t){return kt(t,this._week.dow,this._week.doy).week}function Mt(){return this._week.dow}function Ct(){return this._week.doy}function Ot(t){var e=this.localeData().week(this);return null==t?e:this.add(7*(t-e),"d")}function Et(t){var e=kt(this,1,4).week;return null==t?e:this.add(7*(t-e),"d")}function Tt(t,e){return"string"!=typeof t?t:isNaN(t)?(t=e.weekdaysParse(t),"number"==typeof t?t:null):parseInt(t,10)}function Pt(t,e){return"string"==typeof t?e.weekdaysParse(t)%7||7:isNaN(t)?null:t}function It(t,e){return t?i(this._weekdays)?this._weekdays[t.day()]:this._weekdays[this._weekdays.isFormat.test(e)?"format":"standalone"][t.day()]:i(this._weekdays)?this._weekdays:this._weekdays.standalone}function Nt(t){return t?this._weekdaysShort[t.day()]:this._weekdaysShort}function Rt(t){return t?this._weekdaysMin[t.day()]:this._weekdaysMin}function At(t,e,i){var o,n,s,r=t.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],o=0;o<7;++o)s=u([2e3,1]).day(o),this._minWeekdaysParse[o]=this.weekdaysMin(s,"").toLocaleLowerCase(),this._shortWeekdaysParse[o]=this.weekdaysShort(s,"").toLocaleLowerCase(),this._weekdaysParse[o]=this.weekdays(s,"").toLocaleLowerCase();return i?"dddd"===e?(n=yn.call(this._weekdaysParse,r),-1!==n?n:null):"ddd"===e?(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null):(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"dddd"===e?-1!==(n=yn.call(this._weekdaysParse,r))?n:-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):"ddd"===e?-1!==(n=yn.call(this._shortWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._minWeekdaysParse,r),-1!==n?n:null):-1!==(n=yn.call(this._minWeekdaysParse,r))?n:-1!==(n=yn.call(this._weekdaysParse,r))?n:(n=yn.call(this._shortWeekdaysParse,r),-1!==n?n:null)}function zt(t,e,i){var o,n,s;if(this._weekdaysParseExact)return At.call(this,t,e,i);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),o=0;o<7;o++){if(n=u([2e3,1]).day(o),i&&!this._fullWeekdaysParse[o]&&(this._fullWeekdaysParse[o]=new RegExp("^"+this.weekdays(n,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[o]=new RegExp("^"+this.weekdaysShort(n,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[o]=new RegExp("^"+this.weekdaysMin(n,"").replace(".",".?")+"$","i")),this._weekdaysParse[o]||(s="^"+this.weekdays(n,"")+"|^"+this.weekdaysShort(n,"")+"|^"+this.weekdaysMin(n,""),this._weekdaysParse[o]=new RegExp(s.replace(".",""),"i")),i&&"dddd"===e&&this._fullWeekdaysParse[o].test(t))return o;if(i&&"ddd"===e&&this._shortWeekdaysParse[o].test(t))return o;if(i&&"dd"===e&&this._minWeekdaysParse[o].test(t))return o;if(!i&&this._weekdaysParse[o].test(t))return o}}function Lt(t){if(!this.isValid())return null!=t?this:NaN;var e=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=t?(t=Tt(t,this.localeData()),this.add(t-e,"d")):e}function Ft(t){if(!this.isValid())return null!=t?this:NaN;var e=(this.day()+7-this.localeData()._week.dow)%7;return null==t?e:this.add(t-e,"d")}function Bt(t){if(!this.isValid())return null!=t?this:NaN;if(null!=t){var e=Pt(t,this.localeData());return this.day(this.day()%7?e:e-7)}return this.day()||7}function jt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysStrictRegex:this._weekdaysRegex):(d(this,"_weekdaysRegex")||(this._weekdaysRegex=En),this._weekdaysStrictRegex&&t?this._weekdaysStrictRegex:this._weekdaysRegex)}function Ht(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(d(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=Tn),this._weekdaysShortStrictRegex&&t?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Wt(t){return this._weekdaysParseExact?(d(this,"_weekdaysRegex")||Yt.call(this),t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(d(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Pn),this._weekdaysMinStrictRegex&&t?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Yt(){function t(t,e){return e.length-t.length}var e,i,o,n,s,r=[],a=[],h=[],d=[];for(e=0;e<7;e++)i=u([2e3,1]).day(e),o=this.weekdaysMin(i,""),n=this.weekdaysShort(i,""),s=this.weekdays(i,""),r.push(o),a.push(n),h.push(s),d.push(o),d.push(n),d.push(s);for(r.sort(t),a.sort(t),h.sort(t),d.sort(t),e=0;e<7;e++)a[e]=Z(a[e]),h[e]=Z(h[e]),d[e]=Z(d[e]);this._weekdaysRegex=new RegExp("^("+d.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+a.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+r.join("|")+")","i")}function Gt(){return this.hours()%12||12}function Vt(){return this.hours()||24}function Ut(t,e){H(t,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),e)})}function qt(t,e){return e._meridiemParse}function Xt(t){return"p"===(t+"").toLowerCase().charAt(0)}function Zt(t,e,i){return t>11?i?"pm":"PM":i?"am":"AM"}function Kt(t){return t?t.toLowerCase().replace("_","-"):t}function Jt(t){for(var e,i,o,n,s=0;s<t.length;){for(n=Kt(t[s]).split("-"),e=n.length,i=Kt(t[s+1]),i=i?i.split("-"):null;e>0;){if(o=$t(n.slice(0,e).join("-")))return o;if(i&&i.length>=e&&w(n,i,!0)>=e-1)break;e--}s++}return null}function $t(e){var i=null;if(!zn[e]&&void 0!==t&&t&&t.exports)try{i=In._abbr;!function(){var t=new Error('Cannot find module "./locale"');throw t.code="MODULE_NOT_FOUND",t}(),Qt(i)}catch(t){}return zn[e]}function Qt(t,e){var i;return t&&(i=s(e)?ie(t):te(t,e))&&(In=i),In._abbr}function te(t,e){if(null!==e){var i=An;if(e.abbr=t,null!=zn[t])S("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),i=zn[t]._config;else if(null!=e.parentLocale){if(null==zn[e.parentLocale])return Ln[e.parentLocale]||(Ln[e.parentLocale]=[]),Ln[e.parentLocale].push({name:t,config:e}),null;i=zn[e.parentLocale]._config}return zn[t]=new O(C(i,e)),Ln[t]&&Ln[t].forEach(function(t){te(t.name,t.config)}),Qt(t),zn[t]}return delete zn[t],null}function ee(t,e){if(null!=e){var i,o=An;null!=zn[t]&&(o=zn[t]._config),e=C(o,e),i=new O(e),i.parentLocale=zn[t],zn[t]=i,Qt(t)}else null!=zn[t]&&(null!=zn[t].parentLocale?zn[t]=zn[t].parentLocale:null!=zn[t]&&delete zn[t]);return zn[t]}function ie(t){var e;if(t&&t._locale&&t._locale._abbr&&(t=t._locale._abbr),!t)return In;if(!i(t)){if(e=$t(t))return e;t=[t]}return Jt(t)}function oe(){return Io(zn)}function ne(t){var e,i=t._a;return i&&-2===p(t).overflow&&(e=i[ln]<0||i[ln]>11?ln:i[un]<1||i[un]>ht(i[dn],i[ln])?un:i[cn]<0||i[cn]>24||24===i[cn]&&(0!==i[pn]||0!==i[fn]||0!==i[mn])?cn:i[pn]<0||i[pn]>59?pn:i[fn]<0||i[fn]>59?fn:i[mn]<0||i[mn]>999?mn:-1,p(t)._overflowDayOfYear&&(e<dn||e>un)&&(e=un),p(t)._overflowWeeks&&-1===e&&(e=vn),p(t)._overflowWeekday&&-1===e&&(e=gn),p(t).overflow=e),t}function se(t,e,i){return null!=t?t:null!=e?e:i}function re(t){var i=new Date(e.now());return t._useUTC?[i.getUTCFullYear(),i.getUTCMonth(),i.getUTCDate()]:[i.getFullYear(),i.getMonth(),i.getDate()]}function ae(t){var e,i,o,n,s=[];if(!t._d){for(o=re(t),t._w&&null==t._a[un]&&null==t._a[ln]&&he(t),null!=t._dayOfYear&&(n=se(t._a[dn],o[dn]),(t._dayOfYear>Q(n)||0===t._dayOfYear)&&(p(t)._overflowDayOfYear=!0),i=_t(n,0,t._dayOfYear),t._a[ln]=i.getUTCMonth(),t._a[un]=i.getUTCDate()),e=0;e<3&&null==t._a[e];++e)t._a[e]=s[e]=o[e];for(;e<7;e++)t._a[e]=s[e]=null==t._a[e]?2===e?1:0:t._a[e];24===t._a[cn]&&0===t._a[pn]&&0===t._a[fn]&&0===t._a[mn]&&(t._nextDay=!0,t._a[cn]=0),t._d=(t._useUTC?_t:bt).apply(null,s),null!=t._tzm&&t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),t._nextDay&&(t._a[cn]=24),t._w&&void 0!==t._w.d&&t._w.d!==t._d.getDay()&&(p(t).weekdayMismatch=!0)}}function he(t){var e,i,o,n,s,r,a,h;if(e=t._w,null!=e.GG||null!=e.W||null!=e.E)s=1,r=4,i=se(e.GG,t._a[dn],kt(De(),1,4).year),o=se(e.W,1),((n=se(e.E,1))<1||n>7)&&(h=!0);else{s=t._locale._week.dow,r=t._locale._week.doy;var d=kt(De(),s,r);i=se(e.gg,t._a[dn],d.year),o=se(e.w,d.week),null!=e.d?((n=e.d)<0||n>6)&&(h=!0):null!=e.e?(n=e.e+s,(e.e<0||e.e>6)&&(h=!0)):n=s}o<1||o>St(i,s,r)?p(t)._overflowWeeks=!0:null!=h?p(t)._overflowWeekday=!0:(a=xt(i,o,n,s,r),t._a[dn]=a.year,t._dayOfYear=a.dayOfYear)}function de(t){var e,i,o,n,s,r,a=t._i,h=Fn.exec(a)||Bn.exec(a);if(h){for(p(t).iso=!0,e=0,i=Hn.length;e<i;e++)if(Hn[e][1].exec(h[1])){n=Hn[e][0],o=!1!==Hn[e][2];break}if(null==n)return void(t._isValid=!1);if(h[3]){for(e=0,i=Wn.length;e<i;e++)if(Wn[e][1].exec(h[3])){s=(h[2]||" ")+Wn[e][0];break}if(null==s)return void(t._isValid=!1)}if(!o&&null!=s)return void(t._isValid=!1);if(h[4]){if(!jn.exec(h[4]))return void(t._isValid=!1);r="Z"}t._f=n+(s||"")+(r||""),ge(t)}else t._isValid=!1}function le(t,e,i,o,n,s){var r=[ue(t),xn.indexOf(e),parseInt(i,10),parseInt(o,10),parseInt(n,10)];return s&&r.push(parseInt(s,10)),r}function ue(t){var e=parseInt(t,10);return e<=49?2e3+e:e<=999?1900+e:e}function ce(t){return t.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").trim()}function pe(t,e,i){if(t){if(Cn.indexOf(t)!==new Date(e[0],e[1],e[2]).getDay())return p(i).weekdayMismatch=!0,i._isValid=!1,!1}return!0}function fe(t,e,i){if(t)return Vn[t];if(e)return 0;var o=parseInt(i,10),n=o%100;return(o-n)/100*60+n}function me(t){var e=Gn.exec(ce(t._i));if(e){var i=le(e[4],e[3],e[2],e[5],e[6],e[7]);if(!pe(e[1],i,t))return;t._a=i,t._tzm=fe(e[8],e[9],e[10]),t._d=_t.apply(null,t._a),t._d.setUTCMinutes(t._d.getUTCMinutes()-t._tzm),p(t).rfc2822=!0}else t._isValid=!1}function ve(t){var i=Yn.exec(t._i);if(null!==i)return void(t._d=new Date(+i[1]));de(t),!1===t._isValid&&(delete t._isValid,me(t),!1===t._isValid&&(delete t._isValid,e.createFromInputFallback(t)))}function ge(t){if(t._f===e.ISO_8601)return void de(t);if(t._f===e.RFC_2822)return void me(t);t._a=[],p(t).empty=!0;var i,o,n,s,r,a=""+t._i,h=a.length,d=0;for(n=V(t._f,t._locale).match(Bo)||[],i=0;i<n.length;i++)s=n[i],o=(a.match(q(s,t))||[])[0],o&&(r=a.substr(0,a.indexOf(o)),r.length>0&&p(t).unusedInput.push(r),a=a.slice(a.indexOf(o)+o.length),d+=o.length),Wo[s]?(o?p(t).empty=!1:p(t).unusedTokens.push(s),$(s,o,t)):t._strict&&!o&&p(t).unusedTokens.push(s);p(t).charsLeftOver=h-d,a.length>0&&p(t).unusedInput.push(a),t._a[cn]<=12&&!0===p(t).bigHour&&t._a[cn]>0&&(p(t).bigHour=void 0),p(t).parsedDateParts=t._a.slice(0),p(t).meridiem=t._meridiem,t._a[cn]=ye(t._locale,t._a[cn],t._meridiem),ae(t),ne(t)}function ye(t,e,i){var o;return null==i?e:null!=t.meridiemHour?t.meridiemHour(e,i):null!=t.isPM?(o=t.isPM(i),o&&e<12&&(e+=12),o||12!==e||(e=0),e):e}function be(t){var e,i,o,n,s;if(0===t._f.length)return p(t).invalidFormat=!0,void(t._d=new Date(NaN));for(n=0;n<t._f.length;n++)s=0,e=v({},t),null!=t._useUTC&&(e._useUTC=t._useUTC),e._f=t._f[n],ge(e),f(e)&&(s+=p(e).charsLeftOver,s+=10*p(e).unusedTokens.length,p(e).score=s,(null==o||s<o)&&(o=s,i=e));l(t,i||e)}function _e(t){if(!t._d){var e=L(t._i);t._a=h([e.year,e.month,e.day||e.date,e.hour,e.minute,e.second,e.millisecond],function(t){return t&&parseInt(t,10)}),ae(t)}}function we(t){var e=new g(ne(xe(t)));return e._nextDay&&(e.add(1,"d"),e._nextDay=void 0),e}function xe(t){var e=t._i,o=t._f;return t._locale=t._locale||ie(t._l),null===e||void 0===o&&""===e?m({nullInput:!0}):("string"==typeof e&&(t._i=e=t._locale.preparse(e)),y(e)?new g(ne(e)):(a(e)?t._d=e:i(o)?be(t):o?ge(t):ke(t),f(t)||(t._d=null),t))}function ke(t){var n=t._i;s(n)?t._d=new Date(e.now()):a(n)?t._d=new Date(n.valueOf()):"string"==typeof n?ve(t):i(n)?(t._a=h(n.slice(0),function(t){return parseInt(t,10)}
vendor: 7,183 bytes, line 19292
19292),ae(t)):o(n)?_e(t):r(n)?t._d=new Date(n):e.createFromInputFallback(t)}function Se(t,e,s,r,a){var h={};return!0!==s&&!1!==s||(r=s,s=void 0),(o(t)&&n(t)||i(t)&&0===t.length)&&(t=void 0),h._isAMomentObject=!0,h._useUTC=h._isUTC=a,h._l=s,h._i=t,h._f=e,h._strict=r,we(h)}function De(t,e,i,o){return Se(t,e,i,o,!1)}function Me(t,e){var o,n;if(1===e.length&&i(e[0])&&(e=e[0]),!e.length)return De();for(o=e[0],n=1;n<e.length;++n)e[n].isValid()&&!e[n][t](o)||(o=e[n]);return o}function Ce(){return Me("isBefore",[].slice.call(arguments,0))}function Oe(){return Me("isAfter",[].slice.call(arguments,0))}function Ee(t){for(var e in t)if(-1===yn.call(Zn,e)||null!=t[e]&&isNaN(t[e]))return!1;for(var i=!1,o=0;o<Zn.length;++o)if(t[Zn[o]]){if(i)return!1;parseFloat(t[Zn[o]])!==_(t[Zn[o]])&&(i=!0)}return!0}function Te(){return this._isValid}function Pe(){return Ke(NaN)}function Ie(t){var e=L(t),i=e.year||0,o=e.quarter||0,n=e.month||0,s=e.week||0,r=e.day||0,a=e.hour||0,h=e.minute||0,d=e.second||0,l=e.millisecond||0;this._isValid=Ee(e),this._milliseconds=+l+1e3*d+6e4*h+1e3*a*60*60,this._days=+r+7*s,this._months=+n+3*o+12*i,this._data={},this._locale=ie(),this._bubble()}function Ne(t){return t instanceof Ie}function Re(t){return t<0?-1*Math.round(-1*t):Math.round(t)}function Ae(t,e){H(t,0,0,function(){var t=this.utcOffset(),i="+";return t<0&&(t=-t,i="-"),i+j(~~(t/60),2)+e+j(~~t%60,2)})}function ze(t,e){var i=(e||"").match(t);if(null===i)return null;var o=i[i.length-1]||[],n=(o+"").match(Kn)||["-",0,0],s=60*n[1]+_(n[2]);return 0===s?0:"+"===n[0]?s:-s}function Le(t,i){var o,n;return i._isUTC?(o=i.clone(),n=(y(t)||a(t)?t.valueOf():De(t).valueOf())-o.valueOf(),o._d.setTime(o._d.valueOf()+n),e.updateOffset(o,!1),o):De(t).local()}function Fe(t){return 15*-Math.round(t._d.getTimezoneOffset()/15)}function Be(t,i,o){var n,s=this._offset||0;if(!this.isValid())return null!=t?this:NaN;if(null!=t){if("string"==typeof t){if(null===(t=ze(nn,t)))return this}else Math.abs(t)<16&&!o&&(t*=60);return!this._isUTC&&i&&(n=Fe(this)),this._offset=t,this._isUTC=!0,null!=n&&this.add(n,"m"),s!==t&&(!i||this._changeInProgress?ei(this,Ke(t-s,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,e.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?s:Fe(this)}function je(t,e){return null!=t?("string"!=typeof t&&(t=-t),this.utcOffset(t,e),this):-this.utcOffset()}function He(t){return this.utcOffset(0,t)}function We(t){return this._isUTC&&(this.utcOffset(0,t),this._isUTC=!1,t&&this.subtract(Fe(this),"m")),this}function Ye(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var t=ze(on,this._i);null!=t?this.utcOffset(t):this.utcOffset(0,!0)}return this}function Ge(t){return!!this.isValid()&&(t=t?De(t).utcOffset():0,(this.utcOffset()-t)%60==0)}function Ve(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ue(){if(!s(this._isDSTShifted))return this._isDSTShifted;var t={};if(v(t,this),t=xe(t),t._a){var e=t._isUTC?u(t._a):De(t._a);this._isDSTShifted=this.isValid()&&w(t._a,e.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function qe(){return!!this.isValid()&&!this._isUTC}function Xe(){return!!this.isValid()&&this._isUTC}function Ze(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Ke(t,e){var i,o,n,s=t,a=null;return Ne(t)?s={ms:t._milliseconds,d:t._days,M:t._months}:r(t)?(s={},e?s[e]=t:s.milliseconds=t):(a=Jn.exec(t))?(i="-"===a[1]?-1:1,s={y:0,d:_(a[un])*i,h:_(a[cn])*i,m:_(a[pn])*i,s:_(a[fn])*i,ms:_(Re(1e3*a[mn]))*i}):(a=$n.exec(t))?(i="-"===a[1]?-1:(a[1],1),s={y:Je(a[2],i),M:Je(a[3],i),w:Je(a[4],i),d:Je(a[5],i),h:Je(a[6],i),m:Je(a[7],i),s:Je(a[8],i)}):null==s?s={}:"object"==typeof s&&("from"in s||"to"in s)&&(n=Qe(De(s.from),De(s.to)),s={},s.ms=n.milliseconds,s.M=n.months),o=new Ie(s),Ne(t)&&d(t,"_locale")&&(o._locale=t._locale),o}function Je(t,e){var i=t&&parseFloat(t.replace(",","."));return(isNaN(i)?0:i)*e}function $e(t,e){var i={milliseconds:0,months:0};return i.months=e.month()-t.month()+12*(e.year()-t.year()),t.clone().add(i.months,"M").isAfter(e)&&--i.months,i.milliseconds=+e-+t.clone().add(i.months,"M"),i}function Qe(t,e){var i;return t.isValid()&&e.isValid()?(e=Le(e,t),t.isBefore(e)?i=$e(t,e):(i=$e(e,t),i.milliseconds=-i.milliseconds,i.months=-i.months),i):{milliseconds:0,months:0}}function ti(t,e){return function(i,o){var n,s;return null===o||isNaN(+o)||(S(e,"moment()."+e+"(period, number) is deprecated. Please use moment()."+e+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),s=i,i=o,o=s),i="string"==typeof i?+i:i,n=Ke(i,o),ei(this,n,t),this}}function ei(t,i,o,n){var s=i._milliseconds,r=Re(i._days),a=Re(i._months);t.isValid()&&(n=null==n||n,a&&pt(t,ot(t,"Month")+a*o),r&&nt(t,"Date",ot(t,"Date")+r*o),s&&t._d.setTime(t._d.valueOf()+s*o),n&&e.updateOffset(t,r||a))}function ii(t,e){var i=t.diff(e,"days",!0);return i<-6?"sameElse":i<-1?"lastWeek":i<0?"lastDay":i<1?"sameDay":i<2?"nextDay":i<7?"nextWeek":"sameElse"}function oi(t,i){var o=t||De(),n=Le(o,this).startOf("day"),s=e.calendarFormat(this,n)||"sameElse",r=i&&(D(i[s])?i[s].call(this,o):i[s]);return this.format(r||this.localeData().calendar(s,this,De(o)))}function ni(){return new g(this)}function si(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()>i.valueOf():i.valueOf()<this.clone().startOf(e).valueOf())}function ri(t,e){var i=y(t)?t:De(t);return!(!this.isValid()||!i.isValid())&&(e=z(s(e)?"millisecond":e),"millisecond"===e?this.valueOf()<i.valueOf():this.clone().endOf(e).valueOf()<i.valueOf())}function ai(t,e,i,o){return o=o||"()",("("===o[0]?this.isAfter(t,i):!this.isBefore(t,i))&&(")"===o[1]?this.isBefore(e,i):!this.isAfter(e,i))}function hi(t,e){var i,o=y(t)?t:De(t);return!(!this.isValid()||!o.isValid())&&(e=z(e||"millisecond"),"millisecond"===e?this.valueOf()===o.valueOf():(i=o.valueOf(),this.clone().startOf(e).valueOf()<=i&&i<=this.clone().endOf(e).valueOf()))}function di(t,e){return this.isSame(t,e)||this.isAfter(t,e)}function li(t,e){return this.isSame(t,e)||this.isBefore(t,e)}function ui(t,e,i){var o,n,s;if(!this.isValid())return NaN;if(o=Le(t,this),!o.isValid())return NaN;switch(n=6e4*(o.utcOffset()-this.utcOffset()),e=z(e)){case"year":s=ci(this,o)/12;break;case"month":s=ci(this,o);break;case"quarter":s=ci(this,o)/3;break;case"second":s=(this-o)/1e3;break;case"minute":s=(this-o)/6e4;break;case"hour":s=(this-o)/36e5;break;case"day":s=(this-o-n)/864e5;break;case"week":s=(this-o-n)/6048e5;break;default:s=this-o}return i?s:b(s)}function ci(t,e){var i,o,n=12*(e.year()-t.year())+(e.month()-t.month()),s=t.clone().add(n,"months");return e-s<0?(i=t.clone().add(n-1,"months"),o=(e-s)/(s-i)):(i=t.clone().add(n+1,"months"),o=(e-s)/(i-s)),-(n+o)||0}function pi(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function fi(){if(!this.isValid())return null;var t=this.clone().utc();return t.year()<0||t.year()>9999?G(t,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):D(Date.prototype.toISOString)?this.toDate().toISOString():G(t,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}
vendor: 5,843 bytes, lines 19292-19293
19292function mi(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var t="moment",e="";this.isLocal()||(t=0===this.utcOffset()?"moment.utc":"moment.parseZone",e="Z");var i="["+t+'("]',o=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",n=e+'[")]';return this.format(i+o+"-MM-DD[T]HH:mm:ss.SSS"+n)}function vi(t){t||(t=this.isUtc()?e.defaultFormatUtc:e.defaultFormat);var i=G(this,t);return this.localeData().postformat(i)}function gi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({to:this,from:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function yi(t){return this.from(De(),t)}function bi(t,e){return this.isValid()&&(y(t)&&t.isValid()||De(t).isValid())?Ke({from:this,to:t}).locale(this.locale()).humanize(!e):this.localeData().invalidDate()}function _i(t){return this.to(De(),t)}function wi(t){var e;return void 0===t?this._locale._abbr:(e=ie(t),null!=e&&(this._locale=e),this)}function xi(){return this._locale}function ki(t){switch(t=z(t)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===t&&this.weekday(0),"isoWeek"===t&&this.isoWeekday(1),"quarter"===t&&this.month(3*Math.floor(this.month()/3)),this}function Si(t){return void 0===(t=z(t))||"millisecond"===t?this:("date"===t&&(t="day"),this.startOf(t).add(1,"isoWeek"===t?"week":t).subtract(1,"ms"))}function Di(){return this._d.valueOf()-6e4*(this._offset||0)}function Mi(){return Math.floor(this.valueOf()/1e3)}function Ci(){return new Date(this.valueOf())}function Oi(){var t=this;return[t.year(),t.month(),t.date(),t.hour(),t.minute(),t.second(),t.millisecond()]}function Ei(){var t=this;return{years:t.year(),months:t.month(),date:t.date(),hours:t.hours(),minutes:t.minutes(),seconds:t.seconds(),milliseconds:t.milliseconds()}}function Ti(){return this.isValid()?this.toISOString():null}function Pi(){return f(this)}function Ii(){return l({},p(this))}function Ni(){return p(this).overflow}function Ri(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Ai(t,e){H(0,[t,t.length],0,e)}function zi(t){return ji.call(this,t,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Li(t){return ji.call(this,t,this.isoWeek(),this.isoWeekday(),1,4)}function Fi(){return St(this.year(),1,4)}function Bi(){var t=this.localeData()._week;return St(this.year(),t.dow,t.doy)}function ji(t,e,i,o,n){var s;return null==t?kt(this,o,n).year:(s=St(t,o,n),e>s&&(e=s),Hi.call(this,t,e,i,o,n))}function Hi(t,e,i,o,n){var s=xt(t,e,i,o,n),r=_t(s.year,0,s.dayOfYear);return this.year(r.getUTCFullYear()),this.month(r.getUTCMonth()),this.date(r.getUTCDate()),this}function Wi(t){return null==t?Math.ceil((this.month()+1)/3):this.month(3*(t-1)+this.month()%3)}function Yi(t){var e=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==t?e:this.add(t-e,"d")}function Gi(t,e){e[mn]=_(1e3*("0."+t))}function Vi(){return this._isUTC?"UTC":""}function Ui(){return this._isUTC?"Coordinated Universal Time":""}function qi(t){return De(1e3*t)}function Xi(){return De.apply(null,arguments).parseZone()}function Zi(t){return t}function Ki(t,e,i,o){var n=ie(),s=u().set(o,e);return n[i](s,t)}function Ji(t,e,i){if(r(t)&&(e=t,t=void 0),t=t||"",null!=e)return Ki(t,e,i,"month");var o,n=[];for(o=0;o<12;o++)n[o]=Ki(t,o,i,"month");return n}function $i(t,e,i,o){"boolean"==typeof t?(r(e)&&(i=e,e=void 0),e=e||""):(e=t,i=e,t=!1,r(e)&&(i=e,e=void 0),e=e||"");var n=ie(),s=t?n._week.dow:0;if(null!=i)return Ki(e,(i+s)%7,o,"day");var a,h=[];for(a=0;a<7;a++)h[a]=Ki(e,(a+s)%7,o,"day");return h}function Qi(t,e){return Ji(t,e,"months")}function to(t,e){return Ji(t,e,"monthsShort")}function eo(t,e,i){return $i(t,e,i,"weekdays")}function io(t,e,i){return $i(t,e,i,"weekdaysShort")}function oo(t,e,i){return $i(t,e,i,"weekdaysMin")}function no(){var t=this._data;return this._milliseconds=ds(this._milliseconds),this._days=ds(this._days),this._months=ds(this._months),t.milliseconds=ds(t.milliseconds),t.seconds=ds(t.seconds),t.minutes=ds(t.minutes),t.hours=ds(t.hours),t.months=ds(t.months),t.years=ds(t.years),this}function so(t,e,i,o){var n=Ke(e,i);return t._milliseconds+=o*n._milliseconds,t._days+=o*n._days,t._months+=o*n._months,t._bubble()}function ro(t,e){return so(this,t,e,1)}function ao(t,e){return so(this,t,e,-1)}function ho(t){return t<0?Math.floor(t):Math.ceil(t)}function lo(){var t,e,i,o,n,s=this._milliseconds,r=this._days,a=this._months,h=this._data;return s>=0&&r>=0&&a>=0||s<=0&&r<=0&&a<=0||(s+=864e5*ho(co(a)+r),r=0,a=0),h.milliseconds=s%1e3,t=b(s/1e3),h.seconds=t%60,e=b(t/60),h.minutes=e%60,i=b(e/60),h.hours=i%24,r+=b(i/24),n=b(uo(r)),a+=n, 19293 r-=ho(co(n)),o=b(a/12),a%=12,h.days=r,h.months=a,h.years=o,this}function uo(t){return 4800*t/146097}function co(t){return 146097*t/4800}function po(t){if(!this.isValid())return NaN;var e,i,o=this._milliseconds;if("month"===(t=z(t))||"year"===t)return e=this._days+o/864e5,i=this._months+uo(e),"month"===t?i:i/12;switch(e=this._days+Math.round(co(this._months)),t){case"week":return e/7+o/6048e5;case"day":return e+o/864e5;case"hour":return 24*e+o/36e5;case"minute":return 1440*e+o/6e4;case"second":return 86400*e+o/1e3;case"millisecond":return Math.floor(864e5*e)+o;default:throw new Error("Unknown unit "+t)}}function fo(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*_(this._months/12):NaN}function mo(t){return function(){return this.as(t)}}function vo(){return Ke(this)}function go(t){return t=z(t),this.isValid()?this[t+"s"]():NaN}function yo(t){return function(){return this.isValid()?this._data[t]:NaN}}function bo(){return b(this.days()/7)}
vendor: 4,500 bytes, line 19293
19293function _o(t,e,i,o,n){return n.relativeTime(e||1,!!i,t,o)}function wo(t,e,i){var o=Ke(t).abs(),n=Ds(o.as("s")),s=Ds(o.as("m")),r=Ds(o.as("h")),a=Ds(o.as("d")),h=Ds(o.as("M")),d=Ds(o.as("y")),l=n<=Ms.ss&&["s",n]||n<Ms.s&&["ss",n]||s<=1&&["m"]||s<Ms.m&&["mm",s]||r<=1&&["h"]||r<Ms.h&&["hh",r]||a<=1&&["d"]||a<Ms.d&&["dd",a]||h<=1&&["M"]||h<Ms.M&&["MM",h]||d<=1&&["y"]||["yy",d];return l[2]=e,l[3]=+t>0,l[4]=i,_o.apply(null,l)}function xo(t){return void 0===t?Ds:"function"==typeof t&&(Ds=t,!0)}function ko(t,e){return void 0!==Ms[t]&&(void 0===e?Ms[t]:(Ms[t]=e,"s"===t&&(Ms.ss=e-1),!0))}function So(t){if(!this.isValid())return this.localeData().invalidDate();var e=this.localeData(),i=wo(this,!t,e);return t&&(i=e.pastFuture(+this,i)),e.postformat(i)}function Do(t){return(t>0)-(t<0)||+t}function Mo(){if(!this.isValid())return this.localeData().invalidDate();var t,e,i,o=Cs(this._milliseconds)/1e3,n=Cs(this._days),s=Cs(this._months);t=b(o/60),e=b(t/60),o%=60,t%=60,i=b(s/12),s%=12;var r=i,a=s,h=n,d=e,l=t,u=o?o.toFixed(3).replace(/\.?0+$/,""):"",c=this.asSeconds();if(!c)return"P0D";var p=c<0?"-":"",f=Do(this._months)!==Do(c)?"-":"",m=Do(this._days)!==Do(c)?"-":"",v=Do(this._milliseconds)!==Do(c)?"-":"";return p+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(h?m+h+"D":"")+(d||l||u?"T":"")+(d?v+d+"H":"")+(l?v+l+"M":"")+(u?v+u+"S":"")}var Co,Oo;Oo=Array.prototype.some?Array.prototype.some:function(t){for(var e=Object(this),i=e.length>>>0,o=0;o<i;o++)if(o in e&&t.call(this,e[o],o,e))return!0;return!1};var Eo=e.momentProperties=[],To=!1,Po={};e.suppressDeprecationWarnings=!1,e.deprecationHandler=null;var Io;Io=Object.keys?Object.keys:function(t){var e,i=[];for(e in t)d(t,e)&&i.push(e);return i};var No={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Ro={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Ao=/\d{1,2}/,zo={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Lo={},Fo={},Bo=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,jo=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ho={},Wo={},Yo=/\d/,Go=/\d\d/,Vo=/\d{3}/,Uo=/\d{4}/,qo=/[+-]?\d{6}/,Xo=/\d\d?/,Zo=/\d\d\d\d?/,Ko=/\d\d\d\d\d\d?/,Jo=/\d{1,3}/,$o=/\d{1,4}/,Qo=/[+-]?\d{1,6}/,tn=/\d+/,en=/[+-]?\d+/,on=/Z|[+-]\d\d:?\d\d/gi,nn=/Z|[+-]\d\d(?::?\d\d)?/gi,sn=/[+-]?\d+(\.\d{1,3})?/,rn=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,an={},hn={},dn=0,ln=1,un=2,cn=3,pn=4,fn=5,mn=6,vn=7,gn=8;H("Y",0,0,function(){var t=this.year();return t<=9999?""+t:"+"+t}),H(0,["YY",2],0,function(){return this.year()%100}),H(0,["YYYY",4],0,"year"),H(0,["YYYYY",5],0,"year"),H(0,["YYYYYY",6,!0],0,"year"),A("year","y"),F("year",1),U("Y",en),U("YY",Xo,Go),U("YYYY",$o,Uo),U("YYYYY",Qo,qo),U("YYYYYY",Qo,qo),K(["YYYYY","YYYYYY"],dn),K("YYYY",function(t,i){i[dn]=2===t.length?e.parseTwoDigitYear(t):_(t)}),K("YY",function(t,i){i[dn]=e.parseTwoDigitYear(t)}),K("Y",function(t,e){e[dn]=parseInt(t,10)}),e.parseTwoDigitYear=function(t){return _(t)+(_(t)>68?1900:2e3)};var yn,bn=it("FullYear",!0);yn=Array.prototype.indexOf?Array.prototype.indexOf:function(t){var e;for(e=0;e<this.length;++e)if(this[e]===t)return e;return-1},H("M",["MM",2],"Mo",function(){return this.month()+1}),H("MMM",0,0,function(t){return this.localeData().monthsShort(this,t)}),H("MMMM",0,0,function(t){return this.localeData().months(this,t)}),A("month","M"),F("month",8),U("M",Xo),U("MM",Xo,Go),U("MMM",function(t,e){return e.monthsShortRegex(t)}),U("MMMM",function(t,e){return e.monthsRegex(t)}),K(["M","MM"],function(t,e){e[ln]=_(t)-1}),K(["MMM","MMMM"],function(t,e,i,o){var n=i._locale.monthsParse(t,o,i._strict);null!=n?e[ln]=n:p(i).invalidMonth=t});var _n=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,wn="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),xn="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),kn=rn,Sn=rn;H("w",["ww",2],"wo","week"),H("W",["WW",2],"Wo","isoWeek"),A("week","w"),A("isoWeek","W"),F("week",5),F("isoWeek",5),U("w",Xo),U("ww",Xo,Go),U("W",Xo),U("WW",Xo,Go),J(["w","ww","W","WW"],function(t,e,
vendor: 4,762 bytes, line 19293
19293i,o){e[o.substr(0,1)]=_(t)});var Dn={dow:0,doy:6};H("d",0,"do","day"),H("dd",0,0,function(t){return this.localeData().weekdaysMin(this,t)}),H("ddd",0,0,function(t){return this.localeData().weekdaysShort(this,t)}),H("dddd",0,0,function(t){return this.localeData().weekdays(this,t)}),H("e",0,0,"weekday"),H("E",0,0,"isoWeekday"),A("day","d"),A("weekday","e"),A("isoWeekday","E"),F("day",11),F("weekday",11),F("isoWeekday",11),U("d",Xo),U("e",Xo),U("E",Xo),U("dd",function(t,e){return e.weekdaysMinRegex(t)}),U("ddd",function(t,e){return e.weekdaysShortRegex(t)}),U("dddd",function(t,e){return e.weekdaysRegex(t)}),J(["dd","ddd","dddd"],function(t,e,i,o){var n=i._locale.weekdaysParse(t,o,i._strict);null!=n?e.d=n:p(i).invalidWeekday=t}),J(["d","e","E"],function(t,e,i,o){e[o]=_(t)});var Mn="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),Cn="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),On="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),En=rn,Tn=rn,Pn=rn;H("H",["HH",2],0,"hour"),H("h",["hh",2],0,Gt),H("k",["kk",2],0,Vt),H("hmm",0,0,function(){return""+Gt.apply(this)+j(this.minutes(),2)}),H("hmmss",0,0,function(){return""+Gt.apply(this)+j(this.minutes(),2)+j(this.seconds(),2)}),H("Hmm",0,0,function(){return""+this.hours()+j(this.minutes(),2)}),H("Hmmss",0,0,function(){return""+this.hours()+j(this.minutes(),2)+j(this.seconds(),2)}),Ut("a",!0),Ut("A",!1),A("hour","h"),F("hour",13),U("a",qt),U("A",qt),U("H",Xo),U("h",Xo),U("k",Xo),U("HH",Xo,Go),U("hh",Xo,Go),U("kk",Xo,Go),U("hmm",Zo),U("hmmss",Ko),U("Hmm",Zo),U("Hmmss",Ko),K(["H","HH"],cn),K(["k","kk"],function(t,e,i){var o=_(t);e[cn]=24===o?0:o}),K(["a","A"],function(t,e,i){i._isPm=i._locale.isPM(t),i._meridiem=t}),K(["h","hh"],function(t,e,i){e[cn]=_(t),p(i).bigHour=!0}),K("hmm",function(t,e,i){var o=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o)),p(i).bigHour=!0}),K("hmmss",function(t,e,i){var o=t.length-4,n=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o,2)),e[fn]=_(t.substr(n)),p(i).bigHour=!0}),K("Hmm",function(t,e,i){var o=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o))}),K("Hmmss",function(t,e,i){var o=t.length-4,n=t.length-2;e[cn]=_(t.substr(0,o)),e[pn]=_(t.substr(o,2)),e[fn]=_(t.substr(n))});var In,Nn=/[ap]\.?m?\.?/i,Rn=it("Hours",!0),An={calendar:No,longDateFormat:Ro,invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:Ao,relativeTime:zo,months:wn,monthsShort:xn,week:Dn,weekdays:Mn,weekdaysMin:On,weekdaysShort:Cn,meridiemParse:Nn},zn={},Ln={},Fn=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Bn=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,jn=/Z|[+-]\d\d(?::?\d\d)?/,Hn=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Wn=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Yn=/^\/?Date\((\-?\d+)/i,Gn=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/,Vn={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};e.createFromInputFallback=k("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(t){t._d=new Date(t._i+(t._useUTC?" UTC":""))}),e.ISO_8601=function(){},e.RFC_2822=function(){};var Un=k("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=De.apply(null,arguments);return this.isValid()&&t.isValid()?t<this?this:t:m()}),qn=k("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var t=De.apply(null,arguments);return this.isValid()&&t.isValid()?t>this?this:t:m()}),Xn=function(){return Date.now?Date.now():+new Date},Zn=["year","quarter","month","week","day","hour","minute","second","millisecond"];Ae("Z",":"),Ae("ZZ",""),U("Z",nn),U("ZZ",nn),K(["Z","ZZ"],function(t,e,
vendor: 6,040 bytes, line 19293
19293i){i._useUTC=!0,i._tzm=ze(nn,t)});var Kn=/([\+\-]|\d\d)/gi;e.updateOffset=function(){};var Jn=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,$n=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;Ke.fn=Ie.prototype,Ke.invalid=Pe;var Qn=ti(1,"add"),ts=ti(-1,"subtract");e.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",e.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var es=k("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(t){return void 0===t?this.localeData():this.locale(t)});H(0,["gg",2],0,function(){return this.weekYear()%100}),H(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Ai("gggg","weekYear"),Ai("ggggg","weekYear"),Ai("GGGG","isoWeekYear"),Ai("GGGGG","isoWeekYear"),A("weekYear","gg"),A("isoWeekYear","GG"),F("weekYear",1),F("isoWeekYear",1),U("G",en),U("g",en),U("GG",Xo,Go),U("gg",Xo,Go),U("GGGG",$o,Uo),U("gggg",$o,Uo),U("GGGGG",Qo,qo),U("ggggg",Qo,qo),J(["gggg","ggggg","GGGG","GGGGG"],function(t,e,i,o){e[o.substr(0,2)]=_(t)}),J(["gg","GG"],function(t,i,o,n){i[n]=e.parseTwoDigitYear(t)}),H("Q",0,"Qo","quarter"),A("quarter","Q"),F("quarter",7),U("Q",Yo),K("Q",function(t,e){e[ln]=3*(_(t)-1)}),H("D",["DD",2],"Do","date"),A("date","D"),F("date",9),U("D",Xo),U("DD",Xo,Go),U("Do",function(t,e){return t?e._dayOfMonthOrdinalParse||e._ordinalParse:e._dayOfMonthOrdinalParseLenient}),K(["D","DD"],un),K("Do",function(t,e){e[un]=_(t.match(Xo)[0],10)});var is=it("Date",!0);H("DDD",["DDDD",3],"DDDo","dayOfYear"),A("dayOfYear","DDD"),F("dayOfYear",4),U("DDD",Jo),U("DDDD",Vo),K(["DDD","DDDD"],function(t,e,i){i._dayOfYear=_(t)}),H("m",["mm",2],0,"minute"),A("minute","m"),F("minute",14),U("m",Xo),U("mm",Xo,Go),K(["m","mm"],pn);var os=it("Minutes",!1);H("s",["ss",2],0,"second"),A("second","s"),F("second",15),U("s",Xo),U("ss",Xo,Go),K(["s","ss"],fn);var ns=it("Seconds",!1);H("S",0,0,function(){return~~(this.millisecond()/100)}),H(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),H(0,["SSS",3],0,"millisecond"),H(0,["SSSS",4],0,function(){return 10*this.millisecond()}),H(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),H(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),H(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),H(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),H(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),A("millisecond","ms"),F("millisecond",16),U("S",Jo,Yo),U("SS",Jo,Go),U("SSS",Jo,Vo);var ss;for(ss="SSSS";ss.length<=9;ss+="S")U(ss,tn);for(ss="S";ss.length<=9;ss+="S")K(ss,Gi);var rs=it("Milliseconds",!1);H("z",0,0,"zoneAbbr"),H("zz",0,0,"zoneName");var as=g.prototype;as.add=Qn,as.calendar=oi,as.clone=ni,as.diff=ui,as.endOf=Si,as.format=vi,as.from=gi,as.fromNow=yi,as.to=bi,as.toNow=_i,as.get=st,as.invalidAt=Ni,as.isAfter=si,as.isBefore=ri,as.isBetween=ai,as.isSame=hi,as.isSameOrAfter=di,as.isSameOrBefore=li,as.isValid=Pi,as.lang=es,as.locale=wi,as.localeData=xi,as.max=qn,as.min=Un,as.parsingFlags=Ii,as.set=rt,as.startOf=ki,as.subtract=ts,as.toArray=Oi,as.toObject=Ei,as.toDate=Ci,as.toISOString=fi,as.inspect=mi,as.toJSON=Ti,as.toString=pi,as.unix=Mi,as.valueOf=Di,as.creationData=Ri,as.year=bn,as.isLeapYear=et,as.weekYear=zi,as.isoWeekYear=Li,as.quarter=as.quarters=Wi,as.month=ft,as.daysInMonth=mt,as.week=as.weeks=Ot,as.isoWeek=as.isoWeeks=Et,as.weeksInYear=Bi,as.isoWeeksInYear=Fi,as.date=is,as.day=as.days=Lt,as.weekday=Ft,as.isoWeekday=Bt,as.dayOfYear=Yi,as.hour=as.hours=Rn,as.minute=as.minutes=os,as.second=as.seconds=ns,as.millisecond=as.milliseconds=rs,as.utcOffset=Be,as.utc=He,as.local=We,as.parseZone=Ye,as.hasAlignedHourOffset=Ge,as.isDST=Ve,as.isLocal=qe,as.isUtcOffset=Xe,as.isUtc=Ze,as.isUTC=Ze,as.zoneAbbr=Vi,as.zoneName=Ui,as.dates=k("dates accessor is deprecated. Use date instead.",is),as.months=k("months accessor is deprecated. Use month instead",ft),as.years=k("years accessor is deprecated. Use year instead",bn),as.zone=k("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",je),as.isDSTShifted=k("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ue);var hs=O.prototype;hs.calendar=E,hs.longDateFormat=T,hs.invalidDate=P,hs.ordinal=I,hs.preparse=Zi,hs.postformat=Zi,hs.relativeTime=N,hs.pastFuture=R,hs.set=M,hs.months=dt,hs.monthsShort=lt,hs.monthsParse=ct,hs.monthsRegex=gt,hs.monthsShortRegex=vt,hs.week=Dt,hs.firstDayOfYear=Ct,hs.firstDayOfWeek=Mt,hs.weekdays=It,hs.weekdaysMin=Rt,hs.weekdaysShort=Nt,hs.weekdaysParse=zt,hs.weekdaysRegex=jt,hs.weekdaysShortRegex=Ht,hs.weekdaysMinRegex=Wt,hs.isPM=Xt,hs.meridiem=Zt,Qt("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(t){var e=t%10;return t+(1===_(t%100/10)?"th":1===e?"st":2===e?"nd":3===e?"rd":"th")}}),e.lang=k("moment.lang is deprecated. Use moment.locale instead.",Qt),e.langData=k("moment.langData is deprecated. Use moment.localeData instead.",ie);var ds=Math.abs,ls=mo("ms"),us=mo("s"),cs=mo("m"),ps=mo("h"),fs=mo("d"),ms=mo("w"),vs=mo("M"),gs=mo("y"),ys=yo("milliseconds"),bs=yo("seconds"),_s=yo("minutes"),ws=yo("hours"),xs=yo("days"),ks=yo("months"),Ss=yo("years"),Ds=Math.round,Ms={ss:44,s:45,m:45,h:22,d:26,M:11},Cs=Math.abs,Os=Ie.prototype;return Os.isValid=Te,Os.abs=no,Os.add=ro,Os.subtract=ao,Os.as=po,Os.asMilliseconds=ls,Os.asSeconds=us,Os.asMinutes=cs,Os.asHours=ps,Os.asDays=fs,Os.asWeeks=ms,Os.asMonths=vs,Os.asYears=gs,Os.valueOf=fo,Os._bubble=lo,Os.clone=vo,Os.get=go,Os.milliseconds=ys,Os.seconds=bs,Os.minutes=_s,Os.hours=ws,Os.days=xs,Os.weeks=bo,Os.months=ks,Os.years=Ss,Os.humanize=So,Os.toISOString=Mo,Os.toString=Mo,Os.toJSON=Mo,Os.locale=wi,Os.localeData=xi,Os.toIsoString=k("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",Mo),Os.lang=es,H("X",0,0,"unix"),H("x",0,0,"valueOf"),U("x",en),U("X",sn),K("X",function(t,e,
19293i){i._d=new Date(1e3*parseFloat(t,10))}),K("x",function(t,e,i){i._d=new Date(_(t))}),e.version="2.19.1",function(t){Co=t}(De),e.fn=as,e.min=Ce,e.max=Oe,e.now=Xn,e.utc=u,e.unix=qi,e.months=Qi,e.isDate=a,e.locale=Qt,e.invalid=m,e.duration=Ke,e.isMoment=y,e.weekdays=eo,e.parseZone=Xi,e.localeData=ie,e.isDuration=Ne,e.monthsShort=to,e.weekdaysMin=oo,e.defineLocale=te,e.updateLocale=ee,e.locales=oe,e.weekdaysShort=io,e.normalizeUnits=z,e.relativeTimeRounding=xo,e.relativeTimeThreshold=ko,e.calendarFormat=ii,e.prototype=as,e})}).call(e,i(155)(t))},function(t,e){t.exports=function(t){return t.webpackPolyfill||(t.deprecate=function(){},t.paths=[],t.children||(t.children=[]),Object.defineProperty(t,"loaded",{enumerable:!0,get:function(){return t.l}}),Object.defineProperty(t,"id",{enumerable:!0,get:function(){return t.i}}),t.webpackPolyfill=1),t}},function(t,e){function i(t){throw new Error("Cannot find module '"+t+"'.")}i.keys=function(){return[]},i.resolve=i,t.exports=i,i.id=156},function(t,e,i){(function(e){function i(t,e,i){var o=e&&i||0,n=0;for(e=e||[],t.toLowerCase().replace(/[0-9a-f]{2}/g,function(t){n<16&&(e[o+n++]=u[t])});n<16;)e[o+n++]=0;return e}function o(t,e){var i=e||0,o=l;return o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+"-"+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]+o[t[i++]]}function n(t,e,i){var n=e&&i||0,s=e||[];t=t||{};var r=void 0!==t.clockseq?t.clockseq:m,a=void 0!==t.msecs?t.msecs:(new Date).getTime(),h=void 0!==t.nsecs?t.nsecs:g+1,d=a-v+(h-g)/1e4;if(d<0&&void 0===t.clockseq&&(r=r+1&16383),(d<0||a>v)&&void 0===t.nsecs&&(h=0),h>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");v=a,g=h,m=r,a+=122192928e5;var l=(1e4*(268435455&a)+h)%4294967296;s[n++]=l>>>24&255,s[n++]=l>>>16&255,s[n++]=l>>>8&255,s[n++]=255&l;var u=a/4294967296*1e4&268435455;s[n++]=u>>>8&255,s[n++]=255&u,s[n++]=u>>>24&15|16,s[n++]=u>>>16&255,s[n++]=r>>>8|128,s[n++]=255&r;for(var c=t.node||f,p=0;p<6;p++)s[n+p]=c[p];return e||o(s)}function s(t,e,i){var n=e&&i||0;"string"==typeof t&&(e="binary"==t?new Array(16):null,t=null),t=t||{};var s=t.random||(t.rng||r)();if(s[6]=15&s[6]|64,s[8]=63&s[8]|128,e)for(var a=0;a<16;a++)e[n+a]=s[a];return e||o(s)}var r,a="undefined"!=typeof window?window:void 0!==e?e:null;if(a&&a.crypto&&crypto.getRandomValues){var h=new Uint8Array(16);r=function(){return crypto.getRandomValues(h),h}}if(!r){var d=new Array(16);r=function(){for(var t,e=0;e<16;e++)0==(3&e)&&(t=4294967296*Math.random()),d[e]=t>>>((3&e)<<3)&255;return d}}for(var l=[],u={},c=0;c<256;c++)l[c]=(c+256).toString(16).substr(1),u[l[c]]=c;var p=r(),f=[1|p[0],p[1],p[2],p[3],p[4],p[5]],m=16383&(p[6]<<8|p[7]),v=0,g=0,y=s;y.v1=n,y.v4=s,y.parse=i,y.unparse=o,t.exports=y}).call(e,i(158))},function(t,e){var i;i=function(){return this}();try{i=i||Function("return this")()||(0,eval)("this")}catch(t){"object"==typeof window&&(i=window)}t.exports=i},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Graph3d=i(161),e.graph3d={Camera:i(95),Filter:i(96),Point2d:i(91),Point3d:i(34),Slider:i(92),StepNumber:i(93)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){var o=i(7),n=o.JSON||(o.JSON={stringify:JSON.stringify});t.exports=function(t){return n.stringify.apply(n,arguments)}},function(t,e,i){function o(t,e,i){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.containerElement=t,this.dataGroup=new _,this.dataPoints=null,this.create(),f.setDefaults(o.DEFAULTS,this),this.colX=void 0,this.colY=void 0,this.colZ=void 0,this.colValue=void 0,this.setOptions(i),this.setData(e)}function n(t){return"clientX"in t?t.clientX:t.targetTouches[0]&&t.targetTouches[0].clientX||0}function s(t){return"clientY"in t?t.clientY:t.targetTouches[0]&&t.targetTouches[0].clientY||0}var r=i(90),a=function(t){return t&&t.__esModule?t:{default:t}}(r),h=i(44),d=i(2),l=i(34),u=i(91),c=i(92),p=i(93),f=i(94),m=i(15).default,v=i(15),g=v.printStyle,y=i(172),b=y.allOptions,_=i(173);o.STYLE=f.STYLE;o.DEFAULTS={width:"400px",height:"400px",filterLabel:"time",legendLabel:"value",xLabel:"x",yLabel:"y",zLabel:"z",xValueLabel:function(t){return t},yValueLabel:function(t){return t},zValueLabel:function(t){return t},showXAxis:!0,showYAxis:!0,showZAxis:!0,showGrid:!0,showPerspective:!0,showShadow:!1,keepAspectRatio:!0,verticalRatio:.5,dotSizeRatio:.02,dotSizeMinFraction:.5,dotSizeMaxFraction:2.5,showAnimationControls:void 0,animationInterval:1e3,animationPreload:!1,animationAutoStart:void 0,axisColor:"#4D4D4D",gridColor:"#D3D3D3",xCenter:"55%",yCenter:"50%",style:o.STYLE.DOT,tooltip:!1,tooltipStyle:{content:{padding:"10px",border:"1px solid #4d4d4d",color:"#1a1a1a",background:"rgba(255,255,255,0.7)",borderRadius:"2px",boxShadow:"5px 5px 10px rgba(128,128,128,0.5)"},line:{height:"40px",width:"0",borderLeft:"1px solid #4d4d4d"},dot:{height:"0",width:"0",border:"5px solid #4d4d4d",borderRadius:"5px"}},dataColor:{fill:"#7DC1FF",stroke:"#3267D2",strokeWidth:1},cameraPosition:{horizontal:1,vertical:.5,distance:1.7},showLegend:void 0,backgroundColor:void 0,xBarWidth:void 0,yBarWidth:void 0,valueMin:void 0,valueMax:void 0,xMin:void 0,xMax:void 0,xStep:void 0,yMin:void 0,yMax:void 0,yStep:void 0,zMin:void 0,zMax:void 0,z
19293Step:void 0},h(o.prototype),o.prototype._setScale=function(){this.scale=new l(1/this.xRange.range(),1/this.yRange.range(),1/this.zRange.range()),this.keepAspectRatio&&(this.scale.x<this.scale.y?this.scale.y=this.scale.x:this.scale.x=this.scale.y),this.scale.z*=this.verticalRatio,void 0!==this.valueRange&&(this.scale.value=1/this.valueRange.range());var t=this.xRange.center()*this.scale.x,e=this.yRange.center()*this.scale.y,i=this.zRange.center()*this.scale.z;this.camera.setArmLocation(t,e,i)},o.prototype._convert3Dto2D=function(t){var e=this._convertPointToTranslation(t);return this._convertTranslationToScreen(e)},o.prototype._convertPointToTranslation=function(t){var e=this.camera.getCameraLocation(),i=this.camera.getCameraRotation(),o=t.x*this.scale.x,n=t.y*this.scale.y,s=t.z*this.scale.z,r=e.x,a=e.y,h=e.z,d=Math.sin(i.x),u=Math.cos(i.x),c=Math.sin(i.y),p=Math.cos(i.y),f=Math.sin(i.z),m=Math.cos(i.z);return new l(p*(f*(n-a)+m*(o-r))-c*(s-h),d*(p*(s-h)+c*(f*(n-a)+m*(o-r)))+u*(m*(n-a)-f*(o-r)),u*(p*(s-h)+c*(f*(n-a)+m*(o-r)))-d*(m*(n-a)-f*(o-r)))},o.prototype._convertTranslationToScreen=function(t){var e,i,o=this.eye.x,n=this.eye.y,s=this.eye.z,r=t.x,a=t.y,h=t.z;return this.showPerspective?(e=s/h*(r-o),i=s/h*(a-n)):(e=r*(-s/this.camera.getArmLength()),i=a*(-s/this.camera.getArmLength())),new u(this.currentXCenter+e*this.frame.canvas.clientWidth,this.currentYCenter-i*this.frame.canvas.clientWidth)},o.prototype._calcTranslations=function(t){for(var e=0;e<t.length;e++){var i=t[e];i.trans=this._convertPointToTranslation(i.point),i.screen=this._convertTranslationToScreen(i.trans);var o=this._convertPointToTranslation(i.bottom);i.dist=this.showPerspective?o.length():-o.z}var n=function(t,e){return e.dist-t.dist};t.sort(n)},o.prototype._initializeRanges=function(){var t=this.dataGroup;this.xRange=t.xRange,this.yRange=t.yRange,this.zRange=t.zRange,this.valueRange=t.valueRange,this.xStep=t.xStep,this.yStep=t.yStep,this.zStep=t.zStep,this.xBarWidth=t.xBarWidth,this.yBarWidth=t.yBarWidth,this.colX=t.colX,this.colY=t.colY,this.colZ=t.colZ,this.colValue=t.colValue,this._setScale()},o.prototype.getDataPoints=function(t){for(var e=[],i=0;i<t.length;i++){var o=new l;o.x=t[i][this.colX]||0,o.y=t[i][this.colY]||0,o.z=t[i][this.colZ]||0,o.data=t[i],void 0!==this.colValue&&(o.value=t[i][this.colValue]||0);var n={};n.point=o,n.bottom=new l(o.x,o.y,this.zRange.min),n.trans=void 0,n.screen=void 0,e.push(n)}return e},o.prototype._getDataPoints=function(t){var e,i,n,s,r=[];if(this.style===o.STYLE.GRID||this.style===o.STYLE.SURFACE){var a=this.dataGroup.getDistinctValues(this.colX,t),h=this.dataGroup.getDistinctValues(this.colY,t);r=this.getDataPoints(t);var d=[];for(n=0;n<r.length;n++){s=r[n];var l=a.indexOf(s.point.x),u=h.indexOf(s.point.y);void 0===d[l]&&(d[l]=[]),d[l][u]=s}for(e=0;e<d.length;e++)for(i=0;i<d[e].length;i++)d[e][i]&&(d[e][i].pointRight=e<d.length-1?d[e+1][i]:void 0,d[e][i].pointTop=i<d[e].length-1?d[e][i+1]:void 0,d[e][i].pointCross=e<d.length-1&&i<d[e].length-1?d[e+1][i+1]:void 0)}else if(this._checkValueField(t),r=this.getDataPoints(t),this.style===o.STYLE.LINE)for(n=0;n<r.length;n++)n>0&&(r[n-1].pointNext=r[n]);return r},o.prototype.create=function(){for(;this.containerElement.hasChildNodes();)this.containerElement.removeChild(this.containerElement.firstChild);this.frame=document.createElement("div"),this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas);var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t),this.frame.filter=document.createElement("div"),this.frame.filter.style.position="absolute",this.frame.filter.style.bottom="0px",this.frame.filter.style.left="0px",this.frame.filter.style.width="100%",this.frame.appendChild(this.frame.filter);var e=this,i=function(t){e._onMouseDown(t)},o=function(t){e._onTouchStart(t)},n=function(t){e._onWheel(t)},s=function(t){e._onTooltip(t)},r=function(t){e._onClick(t)};d.addEventListener(this.frame.canvas,"mousedown",i),d.addEventListener(this.frame.canvas,"touchstart",o),d.addEventListener(this.frame.canvas,"mousewheel",n),d.addEventListener(this.frame.canvas,"mousemove",s),d.addEventListener(this.frame.canvas,"click",r),this.containerElement.appendChild(this.frame)},o.prototype._setSize=function(t,e){this.frame.style.width=t,this.frame.style.height=e,this._resizeCanvas()},o.prototype._resizeCanvas=function(){this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=this.frame.canvas.clientWidth,this.frame.canvas.height=this.frame.canvas.clientHeight,this.frame.filter.style.width=this.frame.canvas.clientWidth-20+"px"},o.prototype.animationStart=function(){if(this.animationAutoStart&&this.dataGroup.dataFilter){if(!this.frame.filter||!this.frame.filter.slider)throw new Error("No animation available");this.frame.filter.slider.play()}},o.prototype.animationStop=function(){this.frame.filter&&this.frame.filter.slider&&this.frame.filter.slider.stop()},o.prototype._resizeCenter=function(){"%"===this.xCenter.charAt(this.xCenter.length-1)?this.currentXCenter=parseFloat(this.xCenter)/100*this.frame.canvas.clientWidth:this.currentXCenter=parseFloat(this.xCenter),"%"===this.yCenter.charAt(this.yCenter.length-1)?this.currentYCenter=parseFloat(this.yCenter)/100*(this.frame.canvas.clientHeight-this.frame.filter.clientHeight):this.currentYCenter=parseFloat(this.yCenter)},o.prototype.getCameraPosition=function(){var t=this.camera.getArmRotation();return t.distance=this.camera.getArmLength(),t},o.prototype._readData=function(t){this.dataPoints=this.dataGroup.initializeData(this,t,this.style),this._initializeRanges(),this._redrawFilter()},o.prototype.setData=function(t){void 0!==t&&null!==t&&(this._readData(t),this.redraw(),this.animationStart())},o.prototype.setOptions=function(t){if(void 0!==t){!0===m.validate(t,b)&&console.log("%cErrors have been found in the supplied options object.",g),this.animationStop(),f.setOptions(t,this),this.setPointDrawingMethod(),this._setSize(this.width,this.height),this.setData(this.dataGroup.getDataTable()),this.animationStart()}},o.prototype.setPointDrawingMethod=function(){var t=void 0;switch(this.style){case o.STYLE.BAR:t=o.prototype._redrawBarGraphPoint;break;case o.STYLE.BARCOLOR:t=o.prototype._redrawBarColorGraphPoint;break;case o.STYLE.BARSIZE:t=o.prototype._redrawBarSizeGraphPoint;break;case o.STYLE.DOT:t=o.prototype._redrawDotGraphPoint;break;case o.STYLE.DOTLINE:t=o.prototype._redrawDotLineGraphPoint;break;case o.STYLE.DOTCOLOR:t=o.prototype._redrawDotColorGraphPoint;break;case o.STYLE.DOTSIZE:t=o.prototype._redrawDotSizeGraphPoint;break;case o.STYLE.SURFACE:t=o.prototype._redrawSurfaceGraphPoint;break;
19293case o.STYLE.GRID:t=o.prototype._redrawGridGraphPoint;break;case o.STYLE.LINE:t=o.prototype._redrawLineGraphPoint;break;default:throw new Error("Can not determine point drawing method for graph style '"+this.style+"'")}this._pointDrawingMethod=t},o.prototype.redraw=function(){if(void 0===this.dataPoints)throw new Error("Graph data not initialized");this._resizeCanvas(),this._resizeCenter(),this._redrawSlider(),this._redrawClear(),this._redrawAxis(),this._redrawDataGraph(),this._redrawInfo(),this._redrawLegend()},o.prototype._getContext=function(){var t=this.frame.canvas,e=t.getContext("2d");return e.lineJoin="round",e.lineCap="round",e},o.prototype._redrawClear=function(){var t=this.frame.canvas;t.getContext("2d").clearRect(0,0,t.width,t.height)},o.prototype._dotSize=function(){return this.frame.clientWidth*this.dotSizeRatio},o.prototype._getLegendWidth=function(){var t;if(this.style===o.STYLE.DOTSIZE){t=this._dotSize()*this.dotSizeMaxFraction}else t=this.style===o.STYLE.BARSIZE?this.xBarWidth:20;return t},o.prototype._redrawLegend=function(){if(!0===this.showLegend&&this.style!==o.STYLE.LINE&&this.style!==o.STYLE.BARSIZE){var t=this.style===o.STYLE.BARSIZE||this.style===o.STYLE.DOTSIZE,e=this.style===o.STYLE.DOTSIZE||this.style===o.STYLE.DOTCOLOR||this.style===o.STYLE.BARCOLOR,i=Math.max(.25*this.frame.clientHeight,100),n=this.margin,s=this._getLegendWidth(),r=this.frame.clientWidth-this.margin,a=r-s,h=n+i,d=this._getContext();if(d.lineWidth=1,d.font="14px arial",!1===t){var l,c=i;for(l=0;l<c;l++){var f=(l-0)/(c-0),m=240*f,v=this._hsv2rgb(m,1,1);d.strokeStyle=v,d.beginPath(),d.moveTo(a,n+l),d.lineTo(r,n+l),d.stroke()}d.strokeStyle=this.axisColor,d.strokeRect(a,n,s,i)}else{var g;this.style===o.STYLE.DOTSIZE?g=s*(this.dotSizeMinFraction/this.dotSizeMaxFraction):(this.style,o.STYLE.BARSIZE),d.strokeStyle=this.axisColor,d.fillStyle=this.dataColor.fill,d.beginPath(),d.moveTo(a,n),d.lineTo(r,n),d.lineTo(a+g,h),d.lineTo(a,h),d.closePath(),d.fill(),d.stroke()}var y=e?this.valueRange.min:this.zRange.min,b=e?this.valueRange.max:this.zRange.max,_=new p(y,b,(b-y)/5,!0);_.start(!0);for(var w,x;!_.end();)l=h-(_.getCurrent()-y)/(b-y)*i,w=new u(a-5,l),x=new u(a,l),this._line(d,w,x),d.textAlign="right",d.textBaseline="middle",d.fillStyle=this.axisColor,d.fillText(_.getCurrent(),a-10,l),_.next();d.textAlign="right",d.textBaseline="top";var k=this.legendLabel;d.fillText(k,r,h+this.margin)}},o.prototype._redrawFilter=function(){var t=this.dataGroup.dataFilter,e=this.frame.filter;if(e.innerHTML="",!t)return void(e.slider=void 0);var i={visible:this.showAnimationControls},o=new c(e,i);e.slider=o,e.style.padding="10px",o.setValues(t.values),o.setPlayInterval(this.animationInterval);var n=this,s=function(){var t=n.dataGroup.dataFilter,e=o.getIndex();t.selectValue(e),n.dataPoints=t._getDataPoints(),n.redraw()};o.setOnChangeCallback(s)},o.prototype._redrawSlider=function(){void 0!==this.frame.filter.slider&&this.frame.filter.slider.redraw()},o.prototype._redrawInfo=function(){var t=this.dataGroup.getInfo();if(void 0!==t){var e=this._getContext();e.font="14px arial",e.lineStyle="gray",e.fillStyle="gray",e.textAlign="left",e.textBaseline="top";var i=this.margin,o=this.margin;e.fillText(t,i,o)}},o.prototype._line=function(t,e,i,o){void 0!==o&&(t.strokeStyle=o),t.beginPath(),t.moveTo(e.x,e.y),t.lineTo(i.x,i.y),t.stroke()},o.prototype.drawAxisLabelX=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e) 19294;Math.cos(2*o)>0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)<0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelY=function(t,e,i,o,n){void 0===n&&(n=0);var s=this._convert3Dto2D(e);Math.cos(2*o)<0?(t.textAlign="center",t.textBaseline="top",s.y+=n):Math.sin(2*o)>0?(t.textAlign="right",t.textBaseline="middle"):(t.textAlign="left",t.textBaseline="middle"),t.fillStyle=this.axisColor,t.fillText(i,s.x,s.y)},o.prototype.drawAxisLabelZ=function(t,e,i,o){void 0===o&&(o=0);var n=this._convert3Dto2D(e);t.textAlign="right",t.textBaseline="middle",t.fillStyle=this.axisColor,t.fillText(i,n.x-o,n.y)}
19294,o.prototype._line3d=function(t,e,i,o){var n=this._convert3Dto2D(e),s=this._convert3Dto2D(i);this._line(t,n,s,o)},o.prototype._redrawAxis=function(){var t,e,i,o,n,s,r,a,h,d,c,f=this._getContext();f.font=24/this.camera.getArmLength()+"px arial";var m,v=.025/this.scale.x,g=.025/this.scale.y,y=5/this.camera.getArmLength(),b=this.camera.getArmRotation().horizontal,_=new u(Math.cos(b),Math.sin(b)),w=this.xRange,x=this.yRange,k=this.zRange;for(f.lineWidth=1,o=void 0===this.defaultXStep,i=new p(w.min,w.max,this.xStep,o),i.start(!0);!i.end();){var S=i.getCurrent();if(this.showGrid?(t=new l(S,x.min,k.min),e=new l(S,x.max,k.min),this._line3d(f,t,e,this.gridColor)):this.showXAxis&&(t=new l(S,x.min,k.min),e=new l(S,x.min+v,k.min),this._line3d(f,t,e,this.axisColor),t=new l(S,x.max,k.min),e=new l(S,x.max-v,k.min),this._line3d(f,t,e,this.axisColor)),this.showXAxis){r=_.x>0?x.min:x.max,m=new l(S,r,k.min);var D=" "+this.xValueLabel(S)+" ";this.drawAxisLabelX(f,m,D,b,y)}i.next()}for(f.lineWidth=1,o=void 0===this.defaultYStep,i=new p(x.min,x.max,this.yStep,o),i.start(!0);!i.end();){var M=i.getCurrent();if(this.showGrid?(t=new l(w.min,M,k.min),e=new l(w.max,M,k.min),this._line3d(f,t,e,this.gridColor)):this.showYAxis&&(t=new l(w.min,M,k.min),e=new l(w.min+g,M,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,M,k.min),e=new l(w.max-g,M,k.min),this._line3d(f,t,e,this.axisColor)),this.showYAxis){s=_.y>0?w.min:w.max,m=new l(s,M,k.min);var C=" "+this.yValueLabel(M)+" ";this.drawAxisLabelY(f,m,C,b,y)}i.next()}if(this.showZAxis){for(f.lineWidth=1,o=void 0===this.defaultZStep,i=new p(k.min,k.max,this.zStep,o),i.start(!0),s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max;!i.end();){var O=i.getCurrent(),E=new l(s,r,O),T=this._convert3Dto2D(E);e=new u(T.x-y,T.y),this._line(f,T,e,this.axisColor);var P=this.zValueLabel(O)+" ";this.drawAxisLabelZ(f,E,P,5),i.next()}f.lineWidth=1,t=new l(s,r,k.min),e=new l(s,r,k.max),this._line3d(f,t,e,this.axisColor)}if(this.showXAxis){var I,N;f.lineWidth=1,I=new l(w.min,x.min,k.min),N=new l(w.max,x.min,k.min),this._line3d(f,I,N,this.axisColor),I=new l(w.min,x.max,k.min),N=new l(w.max,x.max,k.min),this._line3d(f,I,N,this.axisColor)}this.showYAxis&&(f.lineWidth=1,t=new l(w.min,x.min,k.min),e=new l(w.min,x.max,k.min),this._line3d(f,t,e,this.axisColor),t=new l(w.max,x.min,k.min),e=new l(w.max,x.max,k.min),this._line3d(f,t,e,this.axisColor));var R=this.xLabel;R.length>0&&this.showXAxis&&(c=.1/this.scale.y,s=(w.max+3*w.min)/4,r=_.x>0?x.min-c:x.max+c,n=new l(s,r,k.min),this.drawAxisLabelX(f,n,R,b));var A=this.yLabel;A.length>0&&this.showYAxis&&(d=.1/this.scale.x,s=_.y>0?w.min-d:w.max+d,r=(x.max+3*x.min)/4,n=new l(s,r,k.min),this.drawAxisLabelY(f,n,A,b));var z=this.zLabel;z.length>0&&this.showZAxis&&(h=30,s=_.x>0?w.min:w.max,r=_.y<0?x.min:x.max,a=(k.max+3*k.min)/4,n=new l(s,r,a),this.drawAxisLabelZ(f,n,z,h))},o.prototype._hsv2rgb=function(t,e,i){var o,n,s,r,a,h;switch(r=i*e,a=Math.floor(t/60),h=r*(1-Math.abs(t/60%2-1)),a){case 0:o=r,n=h,s=0;break;case 1:o=h,n=r,s=0;break;case 2:o=0,n=r,s=h;break;case 3:o=0,n=h,s=r;break;case 4:o=h,n=0,s=r;break;case 5:o=r,n=0,s=h;break;default:o=0,n=0,s=0}return"RGB("+parseInt(255*o)+","+parseInt(255*n)+","+parseInt(255*s)+")"},o.prototype._getStrokeWidth=function(t){return void 0!==t?this.showPerspective?1/-t.trans.z*this.dataColor.strokeWidth:-this.eye.z/this.camera.getArmLength()*this.dataColor.strokeWidth:this.dataColor.strokeWidth},o.prototype._redrawBar=function(t,e,i,o,n,s){var r,a=this,h=e.point,d=this.zRange.min,u=[{point:new l(h.x-i,h.y-o,h.z)},{point:new l(h.x+i,h.y-o,h.z)},{point:new l(h.x+i,h.y+o,h.z)},{point:new l(h.x-i,h.y+o,h.z)}],c=[{point:new l(h.x-i,h.y-o,d)},{point:new l(h.x+i,h.y-o,d)},{point:new l(h.x+i,h.y+o,d)},{point:new l(h.x-i,h.y+o,d)}];u.forEach(function(t){t.screen=a._convert3Dto2D(t.point)}),c.forEach(function(t){t.screen=a._convert3Dto2D(t.point)});var p=[{corners:u,center:l.avg(c[0].point,c[2].point)},{corners:[u[0],u[1],c[1],c[0]],center:l.avg(c[1].point,c[0].point)},{corners:[u[1],u[2],c[2],c[1]],center:l.avg(c[2].point,c[1].point)},{corners:[u[2],u[3],c[3],c[2]],center:l.avg(c[3].point,c[2].point)},{corners:[u[3],u[0],c[0],c[3]],center:l.avg(c[0].point,c[3].point)}];e.surfaces=p;for(var f=0;f<p.length;f++){r=p[f];var m=this._convertPointToTranslation(r.center);r.dist=this.showPerspective?m.length():-m.z}p.sort(function(t,e){var i=e.dist-t.dist;
19294return i||(t.corners===u?1:e.corners===u?-1:0)}),t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=s,t.fillStyle=n;for(var v=2;v<p.length;v++)r=p[v],this._polygon(t,r.corners)},o.prototype._polygon=function(t,e,i,o){if(!(e.length<2)){void 0!==i&&(t.fillStyle=i),void 0!==o&&(t.strokeStyle=o),t.beginPath(),t.moveTo(e[0].screen.x,e[0].screen.y);for(var n=1;n<e.length;++n){var s=e[n];t.lineTo(s.screen.x,s.screen.y)}t.closePath(),t.fill(),t.stroke()}},o.prototype._drawCircle=function(t,e,i,o,n){var s=this._calcRadius(e,n);t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=o,t.fillStyle=i,t.beginPath(),t.arc(e.screen.x,e.screen.y,s,0,2*Math.PI,!0),t.fill(),t.stroke()},o.prototype._getColorsRegular=function(t){var e=240*(1-(t.point.z-this.zRange.min)*this.scale.z/this.verticalRatio);return{fill:this._hsv2rgb(e,1,1),border:this._hsv2rgb(e,1,.8)}},o.prototype._getColorsColor=function(t){var e,i;if("string"==typeof t.point.value)e=t.point.value,i=t.point.value;else{var o=240*(1-(t.point.value-this.valueRange.min)*this.scale.value);e=this._hsv2rgb(o,1,1),i=this._hsv2rgb(o,1,.8)}return{fill:e,border:i}
19294},o.prototype._getColorsSize=function(){return{fill:this.dataColor.fill,border:this.dataColor.stroke}},o.prototype._calcRadius=function(t,e){void 0===e&&(e=this._dotSize());var i;return i=this.showPerspective?e/-t.trans.z:e*(-this.eye.z/this.camera.getArmLength()),i<0&&(i=0),i},o.prototype._redrawBarGraphPoint=function(t,e){var i=this.xBarWidth/2,o=this.yBarWidth/2,n=this._getColorsRegular(e);this._redrawBar(t,e,i,o,n.fill,n.border)},o.prototype._redrawBarColorGraphPoint=function(t,e){var i=this.xBarWidth/2,o=this.yBarWidth/2,n=this._getColorsColor(e);this._redrawBar(t,e,i,o,n.fill,n.border)},o.prototype._redrawBarSizeGraphPoint=function(t,e){var i=(e.point.value-this.valueRange.min)/this.valueRange.range(),o=this.xBarWidth/2*(.8*i+.2),n=this.yBarWidth/2*(.8*i+.2),s=this._getColorsSize();this._redrawBar(t,e,o,n,s.fill,s.border)},o.prototype._redrawDotGraphPoint=function(t,e){var i=this._getColorsRegular(e);this._drawCircle(t,e,i.fill,i.border)},o.prototype._redrawDotLineGraphPoint=function(t,e){var i=this._convert3Dto2D(e.bottom);t.lineWidth=1,this._line(t,i,e.screen,this.gridColor),this._redrawDotGraphPoint(t,e)},o.prototype._redrawDotColorGraphPoint=function(t,e){var i=this._getColorsColor(e);this._drawCircle(t,e,i.fill,i.border)},o.prototype._redrawDotSizeGraphPoint=function(t,e){var i=this._dotSize(),o=(e.point.value-this.valueRange.min)/this.valueRange.range(),n=i*this.dotSizeMinFraction,s=i*this.dotSizeMaxFraction-n,r=n+s*o,a=this._getColorsSize();this._drawCircle(t,e,a.fill,a.border,r)},o.prototype._redrawSurfaceGraphPoint=function(t,e){var i=e.pointRight,o=e.pointTop,n=e.pointCross;if(void 0!==e&&void 0!==i&&void 0!==o&&void 0!==n){var s,r,a=!0;if(this.showGrayBottom||this.showShadow){var h=l.subtract(n.trans,e.trans),d=l.subtract(o.trans,i.trans),u=l.crossProduct(h,d),c=u.length();a=u.z>0}if(a){var p,f=(e.point.z+i.point.z+o.point.z+n.point.z)/4,m=240*(1-(f-this.zRange.min)*this.scale.z/this.verticalRatio);this.showShadow?(p=Math.min(1+u.x/c/2,1),s=this._hsv2rgb(m,1,p),r=s):(p=1,s=this._hsv2rgb(m,1,p),r=this.axisColor)}else s="gray",r=this.axisColor;t.lineWidth=this._getStrokeWidth(e);var v=[e,i,n,o];this._polygon(t,v,s,r)}},o.prototype._drawGridLine=function(t,e,i){if(void 0!==e&&void 0!==i){var o=(e.point.z+i.point.z)/2,n=240*(1-(o-this.zRange.min)*this.scale.z/this.verticalRatio);t.lineWidth=2*this._getStrokeWidth(e),t.strokeStyle=this._hsv2rgb(n,1,1),this._line(t,e.screen,i.screen)}},o.prototype._redrawGridGraphPoint=function(t,e){this._drawGridLine(t,e,e.pointRight),this._drawGridLine(t,e,e.pointTop)},o.prototype._redrawLineGraphPoint=function(t,e){void 0!==e.pointNext&&(t.lineWidth=this._getStrokeWidth(e),t.strokeStyle=this.dataColor.stroke,this._line(t,e.screen,e.pointNext.screen))},o.prototype._redrawDataGraph=function(){var t,e=this._getContext();if(!(void 0===this.dataPoints||this.dataPoints.length<=0))for(this._calcTranslations(this.dataPoints),t=0;t<this.dataPoints.length;t++){var i=this.dataPoints[t];this._pointDrawingMethod.call(this,e,i)}},o.prototype._storeMousePosition=function(t){this.startMouseX=n(t),this.startMouseY=s(t),this._startCameraOffset=this.camera.getOffset()},o.prototype._onMouseDown=function(t){if(t=t||window.event,this.leftButtonDown&&this._onMouseUp(t),this.leftButtonDown=t.which?1===t.which:1===t.button,this.leftButtonDown||this.touchDown){this._storeMousePosition(t),this.startStart=new Date(this.start),this.startEnd=new Date(this.end),this.startArmRotation=this.camera.getArmRotation(),this.frame.style.cursor="move";var e=this;this.onmousemove=function(t){e._onMouseMove(t)},this.onmouseup=function(t){e._onMouseUp(t)},d.addEventListener(document,"mousemove",e.onmousemove),d.addEventListener(document,"mouseup",e.onmouseup),d.preventDefault(t)}},o.prototype._onMouseMove=function(t){this.moving=!0,t=t||window.event;var e=parseFloat(n(t))-this.startMouseX,i=parseFloat(s(t))-this.startMouseY;if(t&&!0===t.ctrlKey){var o=.5*this.frame.clientWidth,r=.5*this.frame.clientHeight,a=(this._startCameraOffset.x||0)-e/o*this.camera.armLength*.8,h=(this._startCameraOffset.y||0)+i/r*this.camera.armLength*.8;this.camera.setOffset(a,h),this._storeMousePosition(t)}else{var l=this.startArmRotation.horizontal+e/200,u=this.startArmRotation.vertical+i/200,c=Math.sin(4/360*2*Math.PI);Math.abs(Math.sin(l))<c&&(l=Math.round(l/Math.PI)*Math.PI-.001),Math.abs(Math.cos(l))<c&&(l=(Math.round(l/Math.PI-.5)+.5)*Math.PI-.001),Math.abs(Math.sin(u))<c&&(u=Math.round(u/Math.PI)*Math.PI),Math.abs(Math.cos(u))<c&&(u=(Math.round(u/Math.PI-.5)+.5)*Math.PI),this.camera.setArmRotation(l,u)}this.redraw();var p=this.getCameraPosition();
19294this.emit("cameraPositionChange",p),d.preventDefault(t)},o.prototype._onMouseUp=function(t){this.frame.style.cursor="auto",this.leftButtonDown=!1,d.removeEventListener(document,"mousemove",this.onmousemove),d.removeEventListener(document,"mouseup",this.onmouseup),d.preventDefault(t)},o.prototype._onClick=function(t){if(this.onclick_callback){if(this.moving)this.moving=!1;else{var e=this.frame.getBoundingClientRect(),i=n(t)-e.left,o=s(t)-e.top,r=this._dataPointFromXY(i,o);r&&this.onclick_callback(r.point.data)}d.preventDefault(t)}},o.prototype._onTooltip=function(t){var e=this.frame.getBoundingClientRect(),i=n(t)-e.left,o=s(t)-e.top;if(this.showTooltip){if(this.tooltipTimeout&&clearTimeout(this.tooltipTimeout),this.leftButtonDown)return void this._hideTooltip();if(this.tooltip&&this.tooltip.dataPoint){var r=this._dataPointFromXY(i,o);r!==this.tooltip.dataPoint&&(r?this._showTooltip(r):this._hideTooltip())}else{var a=this;this.tooltipTimeout=setTimeout(function(){a.tooltipTimeout=null;var t=a._dataPointFromXY(i,o);t&&a._showTooltip(t)},300)}}},o.prototype._onTouchStart=function(t){this.touchDown=!0;var e=this;this.ontouchmove=function(t){e._onTouchMove(t)},this.ontouchend=function(t){e._onTouchEnd(t)},d.addEventListener(document,"touchmove",e.ontouchmove),d.addEventListener(document,"touchend",e.ontouchend),this._onMouseDown(t)},o.prototype._onTouchMove=function(t){this._onMouseMove(t)},o.prototype._onTouchEnd=function(t){this.touchDown=!1,d.removeEventListener(document,"touchmove",this.ontouchmove),d.removeEventListener(document,"touchend",this.ontouchend),this._onMouseUp(t)},o.prototype._onWheel=function(t){t||(t=window.event);var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),e){var i=this.camera.getArmLength(),o=i*(1-e/10);this.camera.setArmLength(o),this.redraw(),this._hideTooltip()}var n=this.getCameraPosition();this.emit("cameraPositionChange",n),d.preventDefault(t)},o.prototype._insideTriangle=function(t,e){function i(t){return t>0?1:t<0?-1:0}var o=e[0],n=e[1],s=e[2],r=i((n.x-o.x)*(t.y-o.y)-(n.y-o.y)*(t.x-o.x)),a=i((s.x-n.x)*(t.y-n.y)-(s.y-n.y)*(t.x-n.x)),h=i((o.x-s.x)*(t.y-s.y)-(o.y-s.y)*(t.x-s.x));return!(0!=r&&0!=a&&r!=a||0!=a&&0!=h&&a!=h||0!=r&&0!=h&&r!=h)},o.prototype._dataPointFromXY=function(t,e){var i,n=null,s=null,r=null,a=new u(t,e);if(this.style===o.STYLE.BAR||this.style===o.STYLE.BARCOLOR||this.style===o.STYLE.BARSIZE)for(i=this.dataPoints.length-1;i>=0;i--){n=this.dataPoints[i];var h=n.surfaces;if(h)for(var d=h.length-1;d>=0;d--){var l=h[d],c=l.corners,p=[c[0].screen,c[1].screen,c[2].screen],f=[c[2].screen,c[3].screen,c[0].screen];if(this._insideTriangle(a,p)||this._insideTriangle(a,f))return n}}else for(i=0;i<this.dataPoints.length;i++){n=this.dataPoints[i];var m=n.screen;if(m){var v=Math.abs(t-m.x),g=Math.abs(e-m.y),y=Math.sqrt(v*v+g*g);(null===r||y<r)&&y<100&&(r=y,s=n)}}return s},o.prototype.hasBars=function(t){return t==o.STYLE.BAR||t==o.STYLE.BARCOLOR||t==o.STYLE.BARSIZE},o.prototype._showTooltip=function(t){var e,i,o;this.tooltip?(e=this.tooltip.dom.content,i=this.tooltip.dom.line,o=this.tooltip.dom.dot):(e=document.createElement("div"),(0,a.default)(e.style,{},this.tooltipStyle.content),e.style.position="absolute",i=document.createElement("div"),(0,a.default)(i.style,{},this.tooltipStyle.line),i.style.position="absolute",o=document.createElement("div"),(0,a.default)(o.style,{},this.tooltipStyle.dot),o.style.position="absolute",this.tooltip={dataPoint:null,dom:{content:e,line:i,dot:o}}),this._hideTooltip(),this.tooltip.dataPoint=t,"function"==typeof this.showTooltip?e.innerHTML=this.showTooltip(t.point):e.innerHTML="<table><tr><td>"+this.xLabel+":</td><td>"+t.point.x+"</td></tr><tr><td>"+this.yLabel+":</td><td>"+t.point.y+"</td></tr><tr><td>"+this.zLabel+":</td><td>"+t.point.z+"</td></tr></table>",e.style.left="0",e.style.top="0",this.frame.appendChild(e),this.frame.appendChild(i),this.frame.appendChild(o);var n=e.offsetWidth,s=e.offsetHeight,r=i.offsetHeight,h=o.offsetWidth,d=o.offsetHeight,l=t.screen.x-n/2;l=Math.min(Math.max(l,10),this.frame.clientWidth-10-n),i.style.left=t.screen.x+"px",i.style.top=t.screen.y-r+"px",e.style.left=l+"px",e.style.top=t.screen.y-r-s+"px",o.style.left=t.screen.x-h
19294/2+"px",o.style.top=t.screen.y-d/2+"px"},o.prototype._hideTooltip=function(){if(this.tooltip){this.tooltip.dataPoint=null;for(var t in this.tooltip.dom)if(this.tooltip.dom.hasOwnProperty(t)){var e=this.tooltip.dom[t];e&&e.parentNode&&e.parentNode.removeChild(e)}}},o.prototype.setCameraPosition=function(t){f.setCameraPosition(t,this),this.redraw()},o.prototype.setSize=function(t,e){this._setSize(t,e),this.redraw()},t.exports=o},function(t,e,i){i(163),t.exports=i(7).Object.assign},function(t,e,i){var o=i(17);o(o.S+o.F,"Object",{assign:i(164)})},function(t,e,i){var o=i(33),n=i(63),s=i(42),r=i(41),a=i(78),h=Object.assign;t.exports=!h||i(28)(function(){var t={},e={},i=Symbol(),o="abcdefghijklmnopqrst";return t[i]=7,o.split("").forEach(function(t){e[t]=t}),7!=h({},t)[i]||Object.keys(h({},e)).join("")!=o})?function(t,e){for(var i=r(t),h=arguments.length,d=1,l=n.f,u=s.f;h>d;)for(var c,p=a(arguments[d++]),f=l?o(p).concat(l(p)):o(p),m=f.length,v=0;m>v;)u.call(p,c=f[v++])&&(i[c]=p[c]);return i}:h},function(t,e,i){t.exports={default:i(166),__esModule:!0}},function(t,e,i){i(167),t.exports=i(7).Math.sign},function(t,e,i){var o=i(17);o(o.S,"Math",{sign:i(168)})},function(t,e){t.exports=Math.sign||function(t){return 0==(t=+t)||t!=t?t:t<0?-1:1}},function(t,e,i){t.exports={default:i(170),__esModule:!0}},function(t,e,i){i(171);var o=i(7).Object;t.exports=function(t,e,i){return o.defineProperty(t,e,i)}},function(t,e,i){var o=i(17);o(o.S+o.F*!i(21),"Object",{defineProperty:i(20).f})},function(t,e,i){Object.defineProperty(e,"__esModule",{value:!0});var o="string",n="boolean",s="number",r={fill:{string:o},stroke:{string:o},strokeWidth:{number:s},__type__:{string:o,object:"object",undefined:"undefined"}},a={animationAutoStart:{boolean:n,undefined:"undefined"},animationInterval:{number:s},animationPreload:{boolean:n},axisColor:{string:o},backgroundColor:r,xBarWidth:{number:s,undefined:"undefined"},yBarWidth:{number:s,undefined:"undefined"},cameraPosition:{distance:{number:s},horizontal:{number:s},vertical:{number:s},__type__:{object:"object"}},xCenter:{string:o},yCenter:{string:o},dataColor:r,dotSizeMinFraction:{number:s},dotSizeMaxFraction:{number:s},dotSizeRatio:{number:s},filterLabel:{string:o},gridColor:{string:o},onclick:{function:"function"},keepAspectRatio:{boolean:n},xLabel:{string:o},yLabel:{string:o},zLabel:{string:o},legendLabel:{string:o},xMin:{number:s,undefined:"undefined"},yMin:{number:s,undefined:"undefined"},zMin:{number:s,undefined:"undefined"},xMax:{number:s,undefined:"undefined"},yMax:{number:s,undefined:"undefined"},zMax:{number:s,undefined:"undefined"},showAnimationControls:{boolean:n,undefined:"undefined"},showGrid:{boolean:n},showLegend:{boolean:n,undefined:"undefined"},showPerspective:{boolean:n},showShadow:{boolean:n},showXAxis:{boolean:n},showYAxis:{boolean:n},showZAxis:{boolean:n},xStep:{number:s,undefined:"undefined"},yStep:{number:s,undefined:"undefined"},zStep:{number:s,undefined:"undefined"},style:{number:s,string:["bar","bar-color","bar-size","dot","dot-line","dot-color","dot-size","line","grid","surface"]},tooltip:{boolean:n,function:"function"},tooltipStyle:{content:{color:{string:o},background:{string:o},border:{string:o},borderRadius:{string:o},boxShadow:{string:o},padding:{string:o},__type__:{object:"object"}},line:{borderLeft:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},dot:{border:{string:o},borderRadius:{string:o},height:{string:o},width:{string:o},__type__:{object:"object"}},__type__:{object:"object"}},xValueLabel:{function:"function"},yValueLabel:{function:"function"},zValueLabel:{function:"function"},valueMax:{number:s,undefined:"undefined"},valueMin:{number:s,undefined:"undefined"},verticalRatio:{number:s},height:{string:o},width:{string:o},__type__:{object:"object"}};e.allOptions=a},function(t,e,i){function o(){this.dataTable=null}var n=i(11),s=i(12),r=i(174),a=i(96),h=i(94),d=i(34);o.prototype.initializeData=function(t,e,i){if(void 0!==e){Array.isArray(e)&&(e=new n(e));var o;if(!(e instanceof n||e instanceof s))throw new Error("Array, DataSet, or DataView expected");if(o=e.get(),0!=o.length){this.style=i,this.dataSet&&this.dataSet.off("*",this._onChange),this.dataSet=e,this.dataTable=o;var r=this;this._onChange=function(){t.setData(r.dataSet)},this.dataSet.on("*",this._onChange),this.colX="x",this.colY="y",this.colZ="z";var h=t.hasBars(i);if(h&&(void 0!==t.defaultXBarWidth?this.xBarWidth=t.defaultXBarWidth:this.xBarWidth=this.getSmallestDifference(o,this.colX)||1,void 0!==t.defaultYBarWidth?this.yBarWidth=t.defaultYBarWidth:this.yBarWidth=this.getSmallestDifference(o,this.colY)||
192941),this._initializeRange(o,this.colX,t,h),this._initializeRange(o,this.colY,t,h),this._initializeRange(o,this.colZ,t,!1),o[0].hasOwnProperty("style")){this.colValue="style";var d=this.getColumnRange(o,this.colValue);this._setRangeDefaults(d,t.defaultValueMin,t.defaultValueMax),this.valueRange=d}this.getDataTable()[0].hasOwnProperty("filter")&&void 0===this.dataFilter&&(this.dataFilter=new a(this,"filter",t),this.dataFilter.setOnLoadCallback(function(){t.redraw()}));return this.dataFilter?this.dataFilter._getDataPoints():this._getDataPoints(this.getDataTable())}}},o.prototype._collectRangeSettings=function(t,e){if(-1==["x","y","z"].indexOf(t))throw new Error("Column '"+t+"' invalid");var i=t.toUpperCase();return{barWidth:this[t+"BarWidth"],min:e["default"+i+"Min"],max:e["default"+i+"Max"],step:e["default"+i+"Step"],range_label:t+"Range",step_label:t+"Step"}},o.prototype._initializeRange=function(t,e,i,o){var n=this._collectRangeSettings(e,i),s=this.getColumnRange(t,e);o&&"z"!=e&&s.expand(n.barWidth/2),this._setRangeDefaults(s,n.min,n.max),this[n.range_label]=s,this[n.step_label]=void 0!==n.step?n.step:s.range()/5},o.prototype.getDistinctValues=function(t,e){void 0===e&&(e=this.dataTable);for(var i=[],o=0;o<e.length;o++){var n=e[o][t]||0;-1===i.indexOf(n)&&i.push(n)}return i.sort(function(t,e){return t-e})},o.prototype.getSmallestDifference=function(t,e){for(var i=this.getDistinctValues(t,e),o=null,n=1;n<i.length;n++){var s=i[n]-i[n-1];(null==o||o>s)&&(o=s)}return o},o.prototype.getColumnRange=function(t,e){for(var i=new r,o=0;o<t.length;o++){var n=t[o][e];i.adjust(n)}return i},o.prototype.getNumberOfRows=function(){return this.dataTable.length},o.prototype._setRangeDefaults=function(t,e,i){void 0!==e&&(t.min=e),void 0!==i&&(t.max=i),t.max<=t.min&&(t.max=t.min+1)},o.prototype.getDataTable=function(){return this.dataTable},o.prototype.getDataSet=function(){return this.dataSet},o.prototype.getDataPoints=function(t){for(var e=[],i=0;i<t.length;i++){var o=new d;o.x=t[i][this.colX]||0,o.y=t[i][this.colY]||0,o.z=t[i][this.colZ]||0,o.data=t[i],void 0!==this.colValue&&(o.value=t[i][this.colValue]||0);var n={};n.point=o,n.bottom=new d(o.x,o.y,this.zRange.min),n.trans=void 0,n.screen=void 0,e.push(n)}return e},o.prototype.initDataAsMatrix=function(t){var e,i,o,n,s=this.getDistinctValues(this.colX,t),r=this.getDistinctValues(this.colY,t),a=this.getDataPoints(t),h=[];for(o=0;o<a.length;o++){n=a[o];var d=s.indexOf(n.point.x),l=r.indexOf(n.point.y);void 0===h[d]&&(h[d]=[]),h[d][l]=n}for(e=0;e<h.length;e++)for(i=0;i<h[e].length;i++)h[e][i]&&(h[e][i].pointRight=e<h.length-1?h[e+1][i]:void 0,h[e][i].pointTop=i<h[e].length-1?h[e][i+1]:void 0,h[e][i].pointCross=e<h.length-1&&i<h[e].length-1?h[e+1][i+1]:void 0);return a},o.prototype.getInfo=function(){var t=this.dataFilter;if(t)return t.getLabel()+": "+t.getSelectedValue()},o.prototype.reload=function(){this.dataTable&&this.setData(this.dataTable)},o.prototype._getDataPoints=function(t){var e=[];if(this.style===h.STYLE.GRID||this.style===h.STYLE.SURFACE)e=this.initDataAsMatrix(t);else if(this._checkValueField(t),e=this.getDataPoints(t),this.style===h.STYLE.LINE)for(var i=0;i<e.length;i++)i>0&&(e[i-1].pointNext=e[i]);return e},o.prototype._checkValueField=function(t){if(this.style===h.STYLE.BARCOLOR||this.style===h.STYLE.BARSIZE||this.style===h.STYLE.DOTCOLOR||this.style===h.STYLE.DOTSIZE){if(void 0===this.colValue)throw new Error("Expected data to have field 'style' for graph style '"+this.style+"'");if(void 0===t[0][this.colValue])throw new Error("Expected data to have field '"+this.colValue+"' for graph style '"+this.style+"'")}},t.exports=o},function(t,e,i){function o(){this.min=void 0,this.max=void 0}o.prototype.adjust=function(t){void 0!==t&&((void 0===this.min||this.min>t)&&(this.min=t),(void 0===this.max||this.max<t)&&(this.max=t))},o.prototype.combine=function(t){this.add(t.min),this.add(t.max)},o.prototype.expand=function(t){if(void 0!==t){var e=this.min-t,i=this.max+t;if(e>i)throw new Error("Passed expansion value makes range invalid");this.min=e,this.max=i}},o.prototype.range=function(){return this.max-this.min},o.prototype.center=function(){return(this.min+this.max)/2},t.exports=o}
19294,function(t,e,i){var o,n,s;!function(i){n=[],o=i,void 0!==(s="function"==typeof o?o.apply(e,n):o)&&(t.exports=s)}(function(){var t=null;return function e(i,o){function n(t){return t.match(/[^ ]+/g)}function s(e){if("hammer.input"!==e.type){if(e.srcEvent._handled||(e.srcEvent._handled={}),e.srcEvent._handled[e.type])return;e.srcEvent._handled[e.type]=!0}var i=!1;e.stopPropagation=function(){i=!0};var o=e.srcEvent.stopPropagation.bind(e.srcEvent);"function"==typeof o&&(e.srcEvent.stopPropagation=function(){o(),e.stopPropagation()}),e.firstTarget=t;for(var n=t;n&&!i;){var s=n.hammer;if(s)for(var r,a=0;a<s.length;a++)if(r=s[a]._handlers[e.type])for(var h=0;h<r.length&&!i;h++)r[h](e);n=n.parentNode}}var r=o||{preventDefault:!1};if(i.Manager){var a=i,h=function(t,i){var o=Object.create(r);return i&&a.assign(o,i),e(new a(t,o),o)};return a.assign(h,a),h.Manager=function(t,i){var o=Object.create(r);return i&&a.assign(o,i),e(new a.Manager(t,o),o)},h}var d=Object.create(i),l=i.element;return l.hammer||(l.hammer=[]),l.hammer.push(d),i.on("hammer.input",function(e){!0!==r.preventDefault&&r.preventDefault!==e.pointerType||e.preventDefault(),e.isFirst&&(t=e.target)}),d._handlers={},d.on=function(t,e){return n(t).forEach(function(t){var o=d._handlers[t];o||(d._handlers[t]=o=[],i.on(t,s)),o.push(e)}),d},d.off=function(t,e){return n(t).forEach(function(t){var o=d._handlers[t];o&&(o=e?o.filter(function(t){return t!==e}):[],o.length>0?d._handlers[t]=o:(i.off(t,s),delete d._handlers[t]))}),d},d.emit=function(e,o){t=o.target,i.emit(e,o)},d.destroy=function(){var t=i.element.hammer,e=t.indexOf(d);-1!==e&&t.splice(e,1),t.length||delete i.element.hammer,d._handlers={},i.destroy()},d}})},function(t,e,i){var o;!function(n,s,r,a){function h(t,e,i){return setTimeout(p(t,i),e)}function d(t,e,i){return!!Array.isArray(t)&&(l(t,i[e],i),!0)}function l(t,e,i){var o;if(t)if(t.forEach)t.forEach(e,i);else if(t.length!==a)for(o=0;o<t.length;)e.call(i,t[o],o,t),o++;else for(o in t)t.hasOwnProperty(o)&&e.call(i,t[o],o,t)}function u(t,e,i){var o="DEPRECATED METHOD: "+e+"\n"+i+" AT \n";return function(){var e=new Error("get-stack-trace"),i=e&&e.stack?e.stack.replace(/^[^\(]+?[\n$]/gm,"").replace(/^\s+at\s+/gm,"").replace(/^Object.<anonymous>\s*\(/gm,"{anonymous}()@"):"Unknown Stack Trace",s=n.console&&(n.console.warn||n.console.log);return s&&s.call(n.console,o,i),t.apply(this,arguments)}}function c(t,e,i){var o,n=e.prototype;o=t.prototype=Object.create(n),o.constructor=t,o._super=n,i&&ft(o,i)}function p(t,e){return function(){return t.apply(e,arguments)}}function f(t,e){return typeof t==gt?t.apply(e?e[0]||a:a,e):t}function m(t,e){return t===a?e:t}function v(t,e,i){l(_(e),function(e){t.addEventListener(e,i,!1)})}function g(t,e,i){l(_(e),function(e){t.removeEventListener(e,i,!1)})}function y(t,e){for(;t;){if(t==e)return!0;t=t.parentNode}return!1}function b(t,e){return t.indexOf(e)>-1}function _(t){return t.trim().split(/\s+/g)}function w(t,e,i){if(t.indexOf&&!i)return t.indexOf(e);for(var o=0;o<t.length;){if(i&&t[o][i]==e||!i&&t[o]===e)return o;o++}return-1}function x(t){return Array.prototype.slice.call(t,0)}function k(t,e,i){for(var o=[],n=[],s=0;s<t.length;){var r=e?t[s][e]:t[s];w(n,r)<0&&o.push(t[s]),n[s]=r,s++}return i&&(o=e?o.sort(function(t,i){return t[e]>i[e]}):o.sort()),o}function S(t,e){for(var i,o,n=e[0].toUpperCase()+e.slice(1),s=0;s<mt.length;){if(i=mt[s],(o=i?i+n:e)in t)return o;s++}return a}function D(){return kt++}function M(t){var e=t.ownerDocument||t;return e.defaultView||e.parentWindow||n}function C(t,e){var i=this;this.manager=t,this.callback=e,this.element=t.element,this.target=t.options.inputTarget,this.domHandler=function(e){f(t.options.enable,[t])&&i.handler(e)},this.init()}function O(t){var e=t.options.inputClass;return new(e||(Mt?W:Ct?V:Dt?q:H))(t,E)}function E(t,e,i){var o=i.pointers.length,n=i.changedPointers.length,s=e&Et&&o-n==0,r=e&(Pt|It)&&o-n==0;i.isFirst=!!s,i.isFinal=!!r,s&&(t.session={}),i.eventType=e,T(t,i),t.emit("hammer.input",i),t.recognize(i),t.session.prevInput=i}function T(t,e){var i=t.session,o=e.pointers,n=o.length;i.firstInput||(i.firstInput=N(e)),n>1&&!i.firstMultiple?i.firstMultiple=N(e):1===n&&(i.firstMultiple=!1);var s=i.firstInput,r=i.firstMultiple,a=r?r.center:s.center,h=e.center=R(o);e.timeStamp=_t(),e.deltaTime=e.timeStamp-s.timeStamp,e.angle=F(a,h),e.distance=L(a,h),P(i,e),e.offsetDirection=z(e.deltaX,e.deltaY);var d=A(e.deltaTime,e.deltaX,e.deltaY);e.overallVelocityX=d.x,e.overallVelocityY=d.y,e.overallVelocity=bt(d.x)>bt(d.y)?d.x:d.y,e.scale=r?j(r.pointers,o):1,e.rotation=r?B(r.pointers,o):0,e.maxPointers=i.prevInput?e.pointers.length>i.prevInput.maxPointers?e.pointers.length:i.prevInput.maxPointers:e.pointers.length,I(i,e);var l=t.element;y(e.srcEvent.target,l)&&(l=e.srcEvent.target),e.target=l}function P(t,e){var i=e.center,o=t.offsetDelta||{},n=t.prevDelta||{},s=t.prevInput||{};e.eventType!==Et&&s.eventType!==Pt||(n=t.prevDelta={x:s.deltaX||0,y:s.deltaY||0},o=t.offsetDelta={x:i.x,y:i.y}),e.deltaX=n.x+(i.x-o.x),e.deltaY=n.y+(i.y-o.y)}function I(t,e){var i,o,n,s,r=t.lastInterval||e,h=e.timeStamp-r.timeStamp;if(e.eventType!=It&&(h>Ot||r.velocity===a)){var d=e.deltaX-r.deltaX,l=e.deltaY-r.deltaY,u=A(h,d,l);o=u.x,n=u.y,i=bt(u.x)>bt(u.y)?u.x:u.y,s=z(d,l),t.lastInterval=e}else i=r.velocity,o=r.velocityX,n=r.velocityY,s=r.direction;e.velocity=i,e.velocityX=o,e.velocityY=n,e.direction=s}function N(t){for(var e=[],i=0;i<t.pointers.length;)e[i]={clientX:yt(t.pointers[i].clientX),clientY:yt(t.pointers[i].clientY)},i++;return{timeStamp:_t(),pointers:e,center:R(e),deltaX:t.deltaX,deltaY:t.deltaY}}function R(t){var e=t.length;if(1===e)return{x:yt(t[0].clientX),y:yt(t[0].clientY)};for(var i=0,o=0,n=0;n<e;)i+=t[n].clientX,o+=t[n].clientY,n++;return{x:yt(i/e),y:yt(o/e)}}function A(t,e,i){return{x:e/t||0,y:i/t||0}}function z(t,e){return t===e?Nt:bt(t)>=bt(e)?t<0?Rt:At:e<0?zt:Lt}function L(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return Math.sqrt(o*o+n*n)}function F(t,e,i){i||(i=Ht);var o=e[i[0]]-t[i[0]],n=e[i[1]]-t[i[1]];return 180*Math.atan2(n,o)/Math.PI}function B(t,e){return F(e[1],e[0],Wt)+F(t[1],t[0],Wt)}function j(t,e){return L(e[0],e[1],Wt)/L(t[0],t[1],Wt)}function H(){this.evEl=Gt,this.evWin=Vt,this.pressed=!1,C.apply(this,arguments)}function W(){this.evEl=Xt,this.evWin=Zt,C.apply(this,arguments),this.store=this.manager.session.pointerEvents=[]}function Y(){this.evTarget=Jt,this.evWin=$t,this.started=!1,C.apply(this,arguments)}function G(t,e){var i=x(t.touches),o=x(t.changedTouches);return e&(Pt|It)&&(i=k(i.concat(o),"identifier",!0)),[i,o]}function V(){this.evTarget=te,this.targetIds={},C.apply(this,arguments)}function U(t,e){var i=x(t.touches),o=this.targetIds;if(e&(Et|Tt)&&1===i.length)return o[i[0].identifier]=!0,[i,i];var n,s,r=x(t.changedTouches),a=[],h=this.target;if(s=i.filter(function(t){return y(t.target,h)}),e===Et)for(n=0;n<s.length;)o[s[n].identifier]=!0,n++;for(n=0;n<r.length;)o[r[n].identifier]&&a.push(r[n]),e&(Pt|It)&&delete o[r[n].identifier],n++;return a.length?[k(s.concat(a),"identifier",!0),a]:void 0}function q(){C.apply(this,arguments);var t=p(this.handler,this);this.touch=new V(this.manager,t),this.mouse=new H(this.manager,t),this.primaryTouch=null,this.lastTouches=[]}function X(t,e){t&Et?(this.primaryTouch=e.changedPointers[0].identifier,Z.call(this,e)):t&(Pt|It)&&Z.call(this,e)}function Z(t){var e=t.changedPointers[0];if(e.identifier===this.primaryTouch){var i={x:e.clientX,y:e.clientY};this.lastTouches.push(i);var o=this.lastTouches,n=function(){var t=o.indexOf(i);t>-1&&o.splice(t,1)};setTimeout(n,ee)}}function K(t){for(var e=t.srcEvent.clientX,i=t.srcEvent.clientY,o=0;o<this.lastTouches.length;
vendor: 11,001 bytes, lines 19294-19295
19294o++){var n=this.lastTouches[o],s=Math.abs(e-n.x),r=Math.abs(i-n.y);if(s<=ie&&r<=ie)return!0}return!1}function J(t,e){this.manager=t,this.set(e)}function $(t){if(b(t,ae))return ae;var e=b(t,he),i=b(t,de);return e&&i?ae:e||i?e?he:de:b(t,re)?re:se}function Q(t){this.options=ft({},this.defaults,t||{}),this.id=D(),this.manager=null,this.options.enable=m(this.options.enable,!0),this.state=ue,this.simultaneous={},this.requireFail=[]} 19295 function tt(t){return t&ve?"cancel":t&fe?"end":t&pe?"move":t&ce?"start":""}function et(t){return t==Lt?"down":t==zt?"up":t==Rt?"left":t==At?"right":""}function it(t,e){var i=e.manager;return i?i.get(t):t}function ot(){Q.apply(this,arguments)}function nt(){ot.apply(this,arguments),this.pX=null,this.pY=null}function st(){ot.apply(this,arguments)}function rt(){Q.apply(this,arguments),this._timer=null,this._input=null}function at(){ot.apply(this,arguments)}function ht(){ot.apply(this,arguments)}function dt(){Q.apply(this,arguments),this.pTime=!1,this.pCenter=!1,this._timer=null,this._input=null,this.count=0}function lt(t,e){return e=e||{},e.recognizers=m(e.recognizers,lt.defaults.preset),new ut(t,e)}function ut(t,e){this.options=ft({},lt.defaults,e||{}),this.options.inputTarget=this.options.inputTarget||t,this.handlers={},this.session={},this.recognizers=[],this.oldCssProps={},this.element=t,this.input=O(this),this.touchAction=new J(this,this.options.touchAction),ct(this,!0),l(this.options.recognizers,function(t){var e=this.add(new t[0](t[1]));t[2]&&e.recognizeWith(t[2]),t[3]&&e.requireFailure(t[3])},this)}function ct(t,e){var i=t.element;if(i.style){var o;l(t.options.cssProps,function(n,s){o=S(i.style,s),e?(t.oldCssProps[o]=i.style[o],i.style[o]=n):i.style[o]=t.oldCssProps[o]||""}),e||(t.oldCssProps={})}}function pt(t,e){var i=s.createEvent("Event");i.initEvent(t,!0,!0),i.gesture=e,e.target.dispatchEvent(i)}var ft,mt=["","webkit","Moz","MS","ms","o"],vt=s.createElement("div"),gt="function",yt=Math.round,bt=Math.abs,_t=Date.now;ft="function"!=typeof Object.assign?function(t){if(t===a||null===t)throw new TypeError("Cannot convert undefined or null to object");for(var e=Object(t),i=1;i<arguments.length;i++){var o=arguments[i];if(o!==a&&null!==o)for(var n in o)o.hasOwnProperty(n)&&(e[n]=o[n])}return e}:Object.assign;var wt=u(function(t,e,i){for(var o=Object.keys(e),n=0;n<o.length;)(!i||i&&t[o[n]]===a)&&(t[o[n]]=e[o[n]]),n++;return t},"extend","Use `assign`."),xt=u(function(t,e){return wt(t,e,!0)},"merge","Use `assign`."),kt=1,St=/mobile|tablet|ip(ad|hone|od)|android/i,Dt="ontouchstart"in n,Mt=S(n,"PointerEvent")!==a,Ct=Dt&&St.test(navigator.userAgent),Ot=25,Et=1,Tt=2,Pt=4,It=8,Nt=1,Rt=2,At=4,zt=8,Lt=16,Ft=Rt|At,Bt=zt|Lt,jt=Ft|Bt,Ht=["x","y"],Wt=["clientX","clientY"];C.prototype={handler:function(){},init:function(){this.evEl&&v(this.element,this.evEl,this.domHandler),this.evTarget&&v(this.target,this.evTarget,this.domHandler),this.evWin&&v(M(this.element),this.evWin,this.domHandler)},destroy:function(){this.evEl&&g(this.element,this.evEl,this.domHandler),this.evTarget&&g(this.target,this.evTarget,this.domHandler),this.evWin&&g(M(this.element),this.evWin,this.domHandler)}};var Yt={mousedown:Et,mousemove:Tt,mouseup:Pt},Gt="mousedown",Vt="mousemove mouseup";c(H,C,{handler:function(t){var e=Yt[t.type];e&Et&&0===t.button&&(this.pressed=!0),e&Tt&&1!==t.which&&(e=Pt),this.pressed&&(e&Pt&&(this.pressed=!1),this.callback(this.manager,e,{pointers:[t],changedPointers:[t],pointerType:"mouse",srcEvent:t}))}});var Ut={pointerdown:Et,pointermove:Tt,pointerup:Pt,pointercancel:It,pointerout:It},qt={2:"touch",3:"pen",4:"mouse",5:"kinect"},Xt="pointerdown",Zt="pointermove pointerup pointercancel";n.MSPointerEvent&&!n.PointerEvent&&(Xt="MSPointerDown",Zt="MSPointerMove MSPointerUp MSPointerCancel"),c(W,C,{handler:function(t){var e=this.store,i=!1,o=t.type.toLowerCase().replace("ms",""),n=Ut[o],s=qt[t.pointerType]||t.pointerType,r="touch"==s,a=w(e,t.pointerId,"pointerId");n&Et&&(0===t.button||r)?a<0&&(e.push(t),a=e.length-1):n&(Pt|It)&&(i=!0),a<0||(e[a]=t,this.callback(this.manager,n,{pointers:e,changedPointers:[t],pointerType:s,srcEvent:t}),i&&e.splice(a,1))}});var Kt={touchstart:Et,touchmove:Tt,touchend:Pt,touchcancel:It},Jt="touchstart",$t="touchstart touchmove touchend touchcancel";c(Y,C,{handler:function(t){var e=Kt[t.type];if(e===Et&&(this.started=!0),this.started){var i=G.call(this,t,e);e&(Pt|It)&&i[0].length-i[1].length==0&&(this.started=!1),this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:"touch",srcEvent:t})}}});var Qt={touchstart:Et,touchmove:Tt,touchend:Pt,touchcancel:It},te="touchstart touchmove touchend touchcancel";c(V,C,{handler:function(t){var e=Qt[t.type],i=U.call(this,t,e);i&&this.callback(this.manager,e,{pointers:i[0],changedPointers:i[1],pointerType:"touch",srcEvent:t})}});var ee=2500,ie=25;c(q,C,{handler:function(t,e,i){var o="touch"==i.pointerType,n="mouse"==i.pointerType;if(!(n&&i.sourceCapabilities&&i.sourceCapabilities.firesTouchEvents)){if(o)X.call(this,e,i);else if(n&&K.call(this,i))return;this.callback(t,e,i)}},destroy:function(){this.touch.destroy(),this.mouse.destroy()}});var oe=S(vt.style,"touchAction"),ne=oe!==a,se="auto",re="manipulation",ae="none",he="pan-x",de="pan-y",le=function(){if(!ne)return!1;var t={},e=n.CSS&&n.CSS.supports;return["auto","manipulation","pan-y","pan-x","pan-x pan-y","none"].forEach(function(i){t[i]=!e||n.CSS.supports("touch-action",i)}),t}();J.prototype={set:function(t){"compute"==t&&(t=this.compute()),ne&&this.manager.element.style&&le[t]&&(this.manager.element.style[oe]=t),this.actions=t.toLowerCase().trim()},update:function(){this.set(this.manager.options.touchAction)},compute:function(){var t=[];return l(this.manager.recognizers,function(e){f(e.options.enable,[e])&&(t=t.concat(e.getTouchAction()))}),$(t.join(" "))},preventDefaults:function(t){var e=t.srcEvent,i=t.offsetDirection;if(this.manager.session.prevented)return void e.preventDefault();var o=this.actions,n=b(o,ae)&&!le[ae],s=b(o,de)&&!le[de],r=b(o,he)&&!le[he];if(n){var a=1===t.pointers.length,h=t.distance<2,d=t.deltaTime<250;if(a&&h&&d)return}return r&&s?void 0:n||s&&i&Ft||r&&i&Bt?this.preventSrc(e):void 0},preventSrc:function(t){this.manager.session.prevented=!0,t.preventDefault()}};var ue=1,ce=2,pe=4,fe=8,me=fe,ve=16;Q.prototype={defaults:{},set:function(t){return ft(this.options,t),this.manager&&this.manager.touchAction.update(),this},recognizeWith:function(t){if(d(t,"recognizeWith",this))return this;var e=this.simultaneous;return t=it(t,this),e[t.id]||(e[t.id]=t,t.recognizeWith(this)),this},dropRecognizeWith:function(t){return d(t,"dropRecognizeWith",this)?this:(t=it(t,this),delete this.simultaneous[t.id],this)},requireFailure:function(t){if(d(t,"requireFailure",this))return this;var e=this.requireFail;return t=it(t,this),-1===w(e,t)&&(e.push(t),t.requireFailure(this)),this},dropRequireFailure:function(t){if(d(t,"dropRequireFailure",this))return this;t=it(t,this);var e=w(this.requireFail,t);return e>-1&&this.requireFail.splice(e,1),this},hasRequireFailures:function(){return this.requireFail.length>0},canRecognizeWith:function(t){return!!this.simultaneous[t.id]},emit:function(t){function e(e){i.manager.emit(e,t)}var i=this,o=this.state;o<fe&&e(i.options.event+tt(o)),e(i.options.event),t.additionalEvent&&e(t.additionalEvent),o>=fe&&e(i.options.event+tt(o))},tryEmit:function(t){if(this.canEmit())return this.emit(t);this.state=32},canEmit:function(){for(var t=0;t<this.requireFail.length;){if(!(this.requireFail[t].state&(32|ue)))return!1;t++}return!0},recognize:function(t){var e=ft({},t);if(!f(this.options.enable,[this,e]))return this.reset(),void(this.state=32);this.state&(me|ve|32)&&(this.state=ue),this.state=this.process(e),this.state&(ce|pe|fe|ve)&&this.tryEmit(e)},process:function(t){},getTouchAction:function(){},reset:function(){}},c(ot,Q,{defaults:{pointers:1},attrTest:function(t){var e=this.options.pointers;return 0===e||t.pointers.length===e},process:function(t){var e=this.state,i=t.eventType,o=e&(ce|pe),n=this.attrTest(t);return o&&(i&It||!n)?e|ve:o||n?i&Pt?e|fe:e&ce?e|pe:ce:32}}),c(nt,ot,{defaults:{event:"pan",threshold:10,pointers:1,direction:jt},getTouchAction:function(){var t=this.options.direction,e=[];return t&Ft&&e.push(de),t&Bt&&e.push(he),e},directionTest:function(t){var e=this.options,i=!0,o=t.distance,n=t.direction,s=t.deltaX,r=t.deltaY;return n&e.direction||(e.direction&Ft?(n=0===s?Nt:s<0?Rt:At,i=s!=this.pX,o=Math.abs(t.deltaX)):(n=0===r?Nt:r<0?zt:Lt,i=r!=this.pY,o=Math.abs(t.deltaY))),t.direction=n,i&&o>e.threshold&&n&e.direction},attrTest:function(t){return ot.prototype.attrTest.call(this,t)&&(this.state&ce||!(this.state&ce)&&this.directionTest(t))},emit:function(t){this.pX=t.deltaX,this.pY=t.deltaY;var e=et(t.direction);e&&(t.additionalEvent=this.options.event+e),this._super.emit.call(this,t)}}),c(st,ot,{defaults:{event:"pinch",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.scale-1)>this.options.threshold||this.state&ce)},emit:function(t){if(1!==t.scale){var e=t.scale<1?"in":"out";t.additionalEvent=this.options.event+e}this._super.emit.call(this,t)}}),c(rt,Q,{defaults:{event:"press",pointers:1,time:251,threshold:9},getTouchAction:function(){return[se]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distance<e.threshold,n=t.deltaTime>e.time;if(this._input=t,!o||!i||t.eventType&(Pt|It)&&!n)this.reset();else if(t.eventType&Et)this.reset(),this._timer=h(function(){this.state=me,this.tryEmit()},e.time,this);else if(t.eventType&Pt)return me;return 32},reset:function(){clearTimeout(this._timer)},emit:function(t){this.state===me&&(t&&t.eventType&Pt?this.manager.emit(this.options.event+"up",t):(this._input.timeStamp=_t(),this.manager.emit(this.options.event,this._input)))}}),c(at,ot,{defaults:{event:"rotate",threshold:0,pointers:2},getTouchAction:function(){return[ae]},attrTest:function(t){return this._super.attrTest.call(this,t)&&(Math.abs(t.rotation)>this.options.threshold||this.state&ce)}}),c(ht,ot,{defaults:{event:"swipe",threshold:10,velocity:.3,direction:Ft|Bt,pointers:1},getTouchAction:function(){return nt.prototype.getTouchAction.call(this)},attrTest:function(t){var e,i=this.options.direction;return i&(Ft|Bt)?e=t.overallVelocity:i&Ft?e=t.overallVelocityX:i&Bt&&(e=t.overallVelocityY),this._super.attrTest.call(this,t)&&i&t.offsetDirection&&t.distance>this.options.threshold&&t.maxPointers==this.options.pointers&&bt(e)>this.options.velocity&&t.eventType&Pt},emit:function(t){var e=et(t.offsetDirection);e&&this.manager.emit(this.options.event+e,t),this.manager.emit(this.options.event,t)}}),c(dt,Q,{defaults:{event:"tap",pointers:1,taps:1,interval:300,time:250,threshold:9,posThreshold:10},getTouchAction:function(){return[re]},process:function(t){var e=this.options,i=t.pointers.length===e.pointers,o=t.distance<e.threshold,n=t.deltaTime<e.time;if(this.reset(),t.eventType&Et&&0===this.count)return this.failTimeout();
19295if(o&&n&&i){if(t.eventType!=Pt)return this.failTimeout();var s=!this.pTime||t.timeStamp-this.pTime<e.interval,r=!this.pCenter||L(this.pCenter,t.center)<e.posThreshold;this.pTime=t.timeStamp,this.pCenter=t.center,r&&s?this.count+=1:this.count=1,this._input=t;if(0===this.count%e.taps)return this.hasRequireFailures()?(this._timer=h(function(){this.state=me,this.tryEmit()},e.interval,this),ce):me}return 32},failTimeout:function(){return this._timer=h(function(){this.state=32},this.options.interval,this),32},reset:function(){clearTimeout(this._timer)},emit:function(){this.state==me&&(this._input.tapCount=this.count,this.manager.emit(this.options.event,this._input))}}),lt.VERSION="2.0.7",lt.defaults={domEvents:!1,touchAction:"compute",enable:!0,inputTarget:null,inputClass:null,preset:[[at,{enable:!1}],[st,{enable:!1},["rotate"]],[ht,{direction:Ft}],[nt,{direction:Ft},["swipe"]],[dt],[dt,{event:"doubletap",taps:2},["tap"]],[rt]],cssProps:{userSelect:"none",touchSelect:"none",touchCallout:"none",contentZooming:"none",userDrag:"none",tapHighlightColor:"rgba(0,0,0,0)"}};ut.prototype={set:function(t){return ft(this.options,t),t.touchAction&&this.touchAction.update(),t.inputTarget&&(this.input.destroy(),this.input.target=t.inputTarget,this.input.init()),this},stop:function(t){this.session.stopped=t?2:1},recognize:function(t){var e=this.session;if(!e.stopped){this.touchAction.preventDefaults(t);var i,o=this.recognizers,n=e.curRecognizer;(!n||n&&n.state&me)&&(n=e.curRecognizer=null);for(var s=0;s<o.length;)i=o[s],2===e.stopped||n&&i!=n&&!i.canRecognizeWith(n)?i.reset():i.recognize(t),!n&&i.state&(ce|pe|fe)&&(n=e.curRecognizer=i),s++}},get:function(t){if(t instanceof Q)return t;for(var e=this.recognizers,i=0;i<e.length;i++)if(e[i].options.event==t)return e[i];return null},add:function(t){if(d(t,"add",this))return this;var e=this.get(t.options.event);return e&&this.remove(e),this.recognizers.push(t),t.manager=this,this.touchAction.update(),t},remove:function(t){if(d(t,"remove",this))return this;if(t=this.get(t)){var e=this.recognizers,i=w(e,t);-1!==i&&(e.splice(i,1),this.touchAction.update())}return this},on:function(t,e){if(t!==a&&e!==a){var i=this.handlers;return l(_(t),function(t){i[t]=i[t]||[],i[t].push(e)}),this}},off:function(t,e){if(t!==a){var i=this.handlers;return l(_(t),function(t){e?i[t]&&i[t].splice(w(i[t],e),1):delete i[t]}),this}},emit:function(t,e){this.options.domEvents&&pt(t,e);var i=this.handlers[t]&&this.handlers[t].slice();if(i&&i.length){e.type=t,e.preventDefault=function(){e.srcEvent.preventDefault()};for(var o=0;o<i.length;)i[o](e),o++}},destroy:function(){this.element&&ct(this,!1),this.handlers={},this.session={},this.input.destroy(),this.element=null}},ft(lt,{INPUT_START:Et,INPUT_MOVE:Tt,INPUT_END:Pt,INPUT_CANCEL:It,STATE_POSSIBLE:ue,STATE_BEGAN:ce,STATE_CHANGED:pe,STATE_ENDED:fe,STATE_RECOGNIZED:me,STATE_CANCELLED:ve,STATE_FAILED:32,DIRECTION_NONE:Nt,DIRECTION_LEFT:Rt,DIRECTION_RIGHT:At,DIRECTION_UP:zt,DIRECTION_DOWN:Lt,DIRECTION_HORIZONTAL:Ft,DIRECTION_VERTICAL:Bt,DIRECTION_ALL:jt,Manager:ut,Input:C,TouchAction:J,TouchInput:V,MouseInput:H,PointerEventInput:W,TouchMouseInput:q,SingleTouchInput:Y,Recognizer:Q,AttrRecognizer:ot,Tap:dt,Pan:nt,Swipe:ht,Pinch:st,Rotate:at,Press:rt,on:v,off:g,each:l,merge:xt,extend:wt,assign:ft,inherit:c,bindFn:p,prefixed:S}),(void 0!==n?n:"undefined"!=typeof self?self:{}).Hammer=lt,(o=function(){return lt}.call(e,i,e,t))!==a&&(t.exports=o)}(window,document)},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Timeline=i(178),e.Graph2d=i(180),e.timeline={Core:i(65),DateUtil:i(36),Range:i(64),stack:i(100),TimeStep:i(66),components:{items:{Item:i(38),BackgroundItem:i(103),BoxItem:i(101),PointItem:i(102),RangeItem:i(70)},BackgroundGroup:i(69),Component:i(16),CurrentTime:i(67),CustomTime:i(46),DataAxis:i(107),DataScale:i(108),GraphGroup:i(109),Group:i(68),ItemSet:i(99),Legend:i(112),LineGraph:i(106),TimeAxis:i(45)}},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i,n){if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");if(!(Array.isArray(i)||i instanceof d||i instanceof l)&&i instanceof Object){var s=n;n=i,i=s}n&&n.throttleRedraw&&console.warn('Timeline option "throttleRedraw" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.');var r=this;if(this.defaultOptions={start:null,end:null,autoResize:!0,orientation:{axis:"bottom",item:"bottom"},moment:a,width:null,height:null,maxHeight:null,minHeight:null},this.options=h.deepExtend({},this.defaultOptions),this._create(t),!n||n&&void 0===n.rtl){this.dom.root.style.visibility="hidden";for(var c,m=this.dom.root;!c&&m;)c=window.getComputedStyle(m,null).direction,m=m.parentElement;this.options.rtl=c&&"rtl"==c.toLowerCase()}else this.options.rtl=n.rtl;this.options.rollingMode=n&&n.rollingMode,this.options.onInitialDrawComplete=n&&n.onInitialDrawComplete,this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{getScale:function(){return r.timeAxis.step.scale},getStep:function(){return r.timeAxis.step.step},toScreen:r._toScreen.bind(r),toGlobalScreen:r._toGlobalScreen.bind(r),toT
19295ime:r._toTime.bind(r),toGlobalTime:r._toGlobalTime.bind(r)}},this.range=new u(this.body,this.options),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new p(this.body,this.options),this.timeAxis2=null,this.components.push(this.timeAxis),this.currentTime=new f(this.body,this.options),this.components.push(this.currentTime),this.itemSet=new v(this.body,this.options),this.components.push(this.itemSet),this.itemsData=null,this.groupsData=null,this.dom.root.onclick=function(t){r.emit("click",r.getEventProperties(t))},this.dom.root.ondblclick=function(t){r.emit("doubleClick",r.getEventProperties(t))},this.dom.root.oncontextmenu=function(t){r.emit("contextmenu",r.getEventProperties(t))},this.dom.root.onmouseover=function(t){r.emit("mouseOver",r.getEventProperties(t))},window.PointerEvent?(this.dom.root.onpointerdown=function(t){r.emit("mouseDown",r.getEventProperties(t))},this.dom.root.onpointermove=function(t){r.emit("mouseMove",r.getEventProperties(t))},this.dom.root.onpointerup=function(t){r.emit("mouseUp",r.getEventProperties(t))}):(this.dom.root.onmousemove=function(t){r.emit("mouseMove",r.getEventProperties(t))},this.dom.root.onmousedown=function(t){r.emit("mouseDown",r.getEventProperties(t))},this.dom.root.onmouseup=function(t){r.emit("mouseUp",r.getEventProperties(t))}),this.initialFitDone=!1,this.on("changed",function(){if(null!=this.itemsData&&!this.options.rollingMode){if(!r.initialFitDone)if(r.initialFitDone=!0,void 0!=r.options.start||void 0!=r.options.end){if(void 0==r.options.start||void 0==r.options.end)var t=r.getItemRange();var e=void 0!=r.options.start?r.options.start:t.min,i=void 0!=r.options.end?r.options.end:t.max;r.setWindow(e,i,{animation:!1})}else r.fit({animation:!1});!r.initialDrawDone&&r.initialRangeChangeDone&&(r.initialDrawDone=!0,r.dom.root.style.visibility="visible",r.options.onInitialDrawComplete&&setTimeout(function(){return r.options.onInitialDrawComplete()},0))}}),n&&this.setOptions(n),i&&this.setGroups(i),e&&this.setItems(e),this._redraw()}function n(t){return h.convert(t.data.start,"Date").valueOf()}function s(t){var e=void 0!=t.data.end?t.data.end:t.data.start;return h.convert(e,"Date").valueOf()}function r(t,e){var i=t.props.leftContainer.height,o=t.props.left.height,n=e.parent,s=n.top,r=!0,a=t.timeAxis.options.orientation.axis,h=function(){return"bottom"==a?n.height-e.top-e.height:e.top},d=-1*t._getScrollTop(),l=s+h(),u=e.height;return l<d?s+i<=s+h()+u&&(s+=h()-t.itemSet.options.margin.item.vertical):l+u>d+i?s+=h()+u-i+t.itemSet.options.margin.item.vertical:r=!1,s=Math.min(s,o-i),{shouldScroll:r,scrollOffset:s,itemTop:l}}var a=i(9),h=i(2),d=i(11),l=i(12),u=i(64),c=i(65),p=i(45),f=i(67),m=i(46),v=i(99),g=i(15).printStyle,y=i(105).allOptions,b=i(105).configureOptions,_=i(71).default,w=i(15).default;o.prototype=new c,o.prototype._createConfigurator=function(){return new _(this,this.dom.container,b)},o.prototype.redraw=function(){this.itemSet&&this.itemSet.markDirty({refreshItems:!0}),this._redraw()},o.prototype.setOptions=function(t){if(!0===w.validate(t,y)&&console.log("%cErrors have been found in the supplied options object.",g),c.prototype.setOptions.call(this,t),"type"in t&&t.type!==this.options.type){this.options.type=t.type;var e=this.itemsData;if(e){var i=this.getSelection();this.setItems(null),this.setItems(e),this.setSelection(i)}}},o.prototype.setItems=function(t){var e;e=t?t instanceof d||t instanceof l?t:new d(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.itemSet&&this.itemSet.setItems(e)},o.prototype.setGroups=function(t){var e;if(t){var i=function(t){return!1!==t.visible};e=t instanceof d||t instanceof l?new l(t,{filter:i}):new d(t.filter(i))}else e=null;this.groupsData=e,this.itemSet.setGroups(e)},o.prototype.setData=function(t){t&&t.groups&&this.setGroups(t.groups),t&&t.items&&this.setItems(t.items)},o.prototype.setSelection=function(t,e){this.itemSet&&this.itemSet.setSelection(t),e&&e.focus&&this.focus(t,e)},o.prototype.getSelection=function(){return this.itemSet&&this.itemSet.getSelection()||[]},o.prototype.focus=function(t,e){if(this.itemsData&&void 0!=t){var i=Array.isArray(t)?t:[t],o=this.itemsData.getDataSet().get(i,{type:{start:"Date",end:"Date"}}),n=null,s=null;
19295if(o.forEach(function(t){var e=t.start.valueOf(),i="end"in t?t.end.valueOf():t.start.valueOf();(null===n||e<n)&&(n=e),(null===s||i>s)&&(s=i)}),null!==n&&null!==s){var a=this,h=this.itemSet.items[i[0]],d=-1*this._getScrollTop(),l=null,u=function(t,e,i){var o=r(a,h);if(l||(l=o),l.itemTop!=o.itemTop||l.shouldScroll){l.itemTop!=o.itemTop&&o.shouldScroll&&(l=o,d=-1*a._getScrollTop());var n=d,s=l.scrollOffset,u=i?s:n+(s-n)*t;a._setScrollTop(-u),e||a._redraw()}},c=function(){var t=r(a,h);t.shouldScroll&&t.itemTop!=l.itemTop&&(a._setScrollTop(-t.scrollOffset),a._redraw())},p=function(){c(),setTimeout(c,100)},f=(n+s)/2,m=Math.max(this.range.end-this.range.start,1.1*(s-n)),v=!e||void 0===e.animation||e.animation;v||(l={shouldScroll:!1,scrollOffset:-1,itemTop:-1}),this.range.setRange(f-m/2,f+m/2,{animation:v},p,u)}}},o.prototype.fit=function(t,e){var i,o=!t||void 0===t.animation||t.animation,n=this.itemsData&&this.itemsData.getDataSet();1===n.length&&void 0===n.get()[0].end?(i=this.getDataRange(),this.moveTo(i.min.valueOf(),{animation:o},e)):(i=this.getItemRange(),this.range.setRange(i.min,i.max,{animation:o},e))},o.prototype.getItemRange=function(){var t=this.getDataRange(),e=null!==t.min?t.min.valueOf():null,i=null!==t.max?t.max.valueOf():null,o=null,r=null;if(null!=e&&null!=i){var a=i-e;a<=0&&(a=10);var d=a/this.props.center.width,l={},u=0;h.forEach(this.itemSet.items,function(t,e){if(t.groupShowing){l[e]=t.redraw(!0),u=l[e].length}});if(u>0)for(var c=0;c<u;c++)h.forEach(l,function(t){t[c]()});if(h.forEach(this.itemSet.items,function(t){var a,h,l=n(t),u=s(t);this.options.rtl?(a=l-(t.getWidthRight()+10)*d,h=u+(t.getWidthLeft()+10)*d):(a=l-(t.getWidthLeft()+10)*d,h=u+(t.getWidthRight()+10)*d),a<e&&(e=a,o=t),h>i&&(i=h,r=t)}.bind(this)),o&&r){var p=o.getWidthLeft()+10,f=r.getWidthRight()+10,m=this.props.center.width-p-f;m>0&&(this.options.rtl?(e=n(o)-f*a/m,i=s(r)+p*a/m):(e=n(o)-p*a/m,i=s(r)+f*a/m))}}return{min:null!=e?new Date(e):null,max:null!=i?new Date(i):null}},o.prototype.getDataRange=function(){var t=null,e=null,i=this.itemsData&&this.itemsData.getDataSet();return i&&i.forEach(function(i){var o=h.convert(i.start,"Date").valueOf(),n=h.convert(void 0!=i.end?i.end:i.start,"Date").valueOf();(null===t||o<t)&&(t=o),(null===e||n>e)&&(e=n)}),{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e,i=t.center?t.center.x:t.clientX,o=t.center?t.center.y:t.clientY;e=this.options.rtl?h.getAbsoluteRight(this.dom.centerContainer)-i:i-h.getAbsoluteLeft(this.dom.centerContainer);var n=o-h.getAbsoluteTop(this.dom.centerContainer),s=this.itemSet.itemFromTarget(t),r=this.itemSet.groupFromTarget(t),a=m.customTimeFromTarget(t),d=this.itemSet.options.snap||null,l=this.body.util.getScale(),u=this.body.util.getStep(),c=this._toTime(e),p=d?d(c,l,u):c,f=h.getTarget(t),v=null;return null!=s?v="item":null!=a?v="custom-time":h.hasParent(f,this.timeAxis.dom.foreground)?v="axis":this.timeAxis2&&h.hasParent(f,this.timeAxis2.dom.foreground)?v="axis":h.hasParent(f,this.itemSet.dom.labelSet)?v="group-label":h.hasParent(f,this.currentTime.bar)?v="current-time":h.hasParent(f,this.dom.center)&&(v="background"),{event:t,item:s?s.id:null,group:r?r.groupId:null,what:v,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:e,y:n,time:c,snappedTime:p}},o.prototype.toggleRollingMode=function(){this.range.rolling?this.range.stopRolling():(void 0==this.options.rollingMode&&this.setOptions(this.options),this.range.startRolling())},t.exports=o},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(19),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(10),u=i(37),c=i(2),p=function(){function t(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;(0,a.default)(this,t),this.pixelRatio=e,this.generated=!1,this.centerCoordinates={x:144.5,y:144.5},this.r=289*.49,this.color={r:255,g:255,b:255,a:1},this.hueCircle=void 0,this.initialColor={r:255,g:255,b:255,a:1},this.previousColor=void 0,this.applied=!1,this.updateCallback=function(){},this.closeCallback=function(){},this._create()}return(0,d.default)(t,[{key:"insertTo",value:function(t){void 0!==this.hammer&&(this.hammer.destroy(),this.hammer=void 0),this.container=t,this.container.appendChild(this.frame),this._bindHammer(),this._setSize()}},{key:"setUpdateCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker update callback is not a function.");this.updateCallback=t}},{key:"setCloseCallback",value:function(t){if("function"!=typeof t)throw new Error("Function attempted to set as colorPicker closing callback is not a function.");this.closeCallback=t}},{key:"_isColorString",value:function(t){var e={black:"#000000",navy:"#000080",dar
19295kblue:"#00008B",mediumblue:"#0000CD",blue:"#0000FF",darkgreen:"#006400",green:"#008000",teal:"#008080",darkcyan:"#008B8B",deepskyblue:"#00BFFF",darkturquoise:"#00CED1",mediumspringgreen:"#00FA9A",lime:"#00FF00",springgreen:"#00FF7F",aqua:"#00FFFF",cyan:"#00FFFF",midnightblue:"#191970",dodgerblue:"#1E90FF",lightseagreen:"#20B2AA",forestgreen:"#228B22",seagreen:"#2E8B57",darkslategray:"#2F4F4F",limegreen:"#32CD32",mediumseagreen:"#3CB371",turquoise:"#40E0D0",royalblue:"#4169E1",steelblue:"#4682B4",darkslateblue:"#483D8B",mediumturquoise:"#48D1CC",indigo:"#4B0082",darkolivegreen:"#556B2F",cadetblue:"#5F9EA0",cornflowerblue:"#6495ED",mediumaquamarine:"#66CDAA",dimgray:"#696969",slateblue:"#6A5ACD",olivedrab:"#6B8E23",slategray:"#708090",lightslategray:"#778899",mediumslateblue:"#7B68EE",lawngreen:"#7CFC00",chartreuse:"#7FFF00",aquamarine:"#7FFFD4",maroon:"#800000",purple:"#800080",olive:"#808000",gray:"#808080",skyblue:"#87CEEB",lightskyblue:"#87CEFA",blueviolet:"#8A2BE2",darkred:"#8B0000",darkmagenta:"#8B008B",saddlebrown:"#8B4513",darkseagreen:"#8FBC8F",lightgreen:"#90EE90",mediumpurple:"#9370D8",darkviolet:"#9400D3",palegreen:"#98FB98",darkorchid:"#9932CC",yellowgreen:"#9ACD32",sienna:"#A0522D",brown:"#A52A2A",darkgray:"#A9A9A9",lightblue:"#ADD8E6",greenyellow:"#ADFF2F",paleturquoise:"#AFEEEE",lightsteelblue:"#B0C4DE",powderblue:"#B0E0E6",firebrick:"#B22222",darkgoldenrod:"#B8860B",mediumorchid:"#BA55D3",rosybrown:"#BC8F8F",darkkhaki:"#BDB76B",silver:"#C0C0C0",mediumvioletred:"#C71585",indianred:"#CD5C5C",peru:"#CD853F",chocolate:"#D2691E",tan:"#D2B48C",lightgrey:"#D3D3D3",palevioletred:"#D87093",thistle:"#D8BFD8",orchid:"#DA70D6",goldenrod:"#DAA520",crimson:"#DC143C",gainsboro:"#DCDCDC",plum:"#DDA0DD",burlywood:"#DEB887",lightcyan:"#E0FFFF",lavender:"#E6E6FA",darksalmon:"#E9967A",violet:"#EE82EE",palegoldenrod:"#EEE8AA",lightcoral:"#F08080",khaki:"#F0E68C",aliceblue:"#F0F8FF",honeydew:"#F0FFF0",azure:"#F0FFFF",sandybrown:"#F4A460",wheat:"#F5DEB3",beige:"#F5F5DC",whitesmoke:"#F5F5F5",mintcream:"#F5FFFA",ghostwhite:"#F8F8FF",salmon:"#FA8072",antiquewhite:"#FAEBD7",linen:"#FAF0E6",lightgoldenrodyellow:"#FAFAD2",oldlace:"#FDF5E6",red:"#FF0000",fuchsia:"#FF00FF",magenta:"#FF00FF",deeppink:"#FF1493",orangered:"#FF4500",tomato:"#FF6347",hotpink:"#FF69B4",coral:"#FF7F50",darkorange:"#FF8C00",lightsalmon:"#FFA07A",orange:"#FFA500",lightpink:"#FFB6C1",pink:"#FFC0CB",gold:"#FFD700",peachpuff:"#FFDAB9",navajowhite:"#FFDEAD",moccasin:"#FFE4B5",bisque:"#FFE4C4",mistyrose:"#FFE4E1",blanchedalmond:"#FFEBCD",papayawhip:"#FFEFD5",lavenderblush:"#FFF0F5",seashell:"#FFF5EE",cornsilk:"#FFF8DC",lemonchiffon:"#FFFACD",floralwhite:"#FFFAF0",snow:"#FFFAFA",yellow:"#FFFF00",lightyellow:"#FFFFE0",ivory:"#FFFFF0",white:"#FFFFFF"};if("string"==typeof t)return e[t]}},{key:"setColor",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if("none"!==t){var i=void 0,o=this._isColorString(t);if(void 0!==o&&(t=o),!0===c.isString(t)){if(!0===c.isValidRGB(t)){var n=t.substr(4).substr(0,t.length-5).split(",");i={r:n[0],g:n[1],b:n[2],a:1}}else if(!0===c.isValidRGBA(t)){var r=t.substr(5).substr(0,t.length-6).split(",");i={r:r[0],g:r[1],b:r[2],a:r[3]}}else if(!0===c.isValidHex(t)){var a=c.hexToRGB(t);i={r:a.r,g:a.g,b:a.b,a:1}}}else if(t instanceof Object&&void 0!==t.r&&void 0!==t.g&&void 0!==t.b){var h=void 0!==t.a?t.a:"1.0";i={r:t.r,g:t.g,b:t.b,a:h}}if(void 0===i)throw new Error("Unknown color passed to the colorPicker. Supported are strings: rgb, hex, rgba. Object: rgb ({r:r,g:g,b:b,[a:a]}). Supplied: "+(0,s.default)(t));this._setColor(i,e)}}},{key:"show",value:function(){void 0!==this.closeCallback&&(this.closeCallback(),this.closeCallback=void 0),this.applied=!1,this.frame.style.display="block",this._generateHueCircle()}},{key:"_hide",value:function(){var t=this;!0===(!(arguments.length>0&&void 0!==arguments[0])||arguments[0])&&(this.previousColor=c.extend({},this.color)),!0===this.applied&&this.updateCallback(this.initialColor),this.frame.style.display="none",setTimeout(function(){void 0!==t.closeCallback&&(t.closeCallback(),t.closeCallback=void 0)}
19295,0)}},{key:"_save",value:function(){this.updateCallback(this.color),this.applied=!1,this._hide()}},{key:"_apply",value:function(){this.applied=!0,this.updateCallback(this.color),this._updatePicker(this.color)}},{key:"_loadLast",value:function(){void 0!==this.previousColor?this.setColor(this.previousColor,!1):alert("There is no last color to load...")}},{key:"_setColor",value:function(t){!0===(!(arguments.length>1&&void 0!==arguments[1])||arguments[1])&&(this.initialColor=c.extend({},t)),this.color=t;var e=c.RGBToHSV(t.r,t.g,t.b),i=2*Math.PI,o=this.r*e.s,n=this.centerCoordinates.x+o*Math.sin(i*e.h),s=this.centerCoordinates.y+o*Math.cos(i*e.h);this.colorPickerSelector.style.left=n-.5*this.colorPickerSelector.clientWidth+"px",this.colorPickerSelector.style.top=s-.5*this.colorPickerSelector.clientHeight+"px",this._updatePicker(t)}},{key:"_setOpacity",value:function(t){this.color.a=t/100,this._updatePicker(this.color)}},{key:"_setBrightness",value:function(t){var e=c.RGBToHSV(this.color.r,this.color.g,this.color.b);e.v=t/100;var i=c.HSVToRGB(e.h,e.s,e.v);i.a=this.color.a,this.color=i,this._updatePicker()}},{key:"_updatePicker",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.color,e=c.RGBToHSV(t.r,t.g,t.b),i=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(i.webkitBackingStorePixelRatio||i.mozBackingStorePixelRatio||i.msBackingStorePixelRatio||i.oBackingStorePixelRatio||i.backingStorePixelRatio||1)),i.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var o=this.colorPickerCanvas.clientWidth,n=this.colorPickerCanvas.clientHeight;i.clearRect(0,0,o,n),i.putImageData(this.hueCircle,0,0),i.fillStyle="rgba(0,0,0,"+(1-e.v)+")",i.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),i.fill(),this.brightnessRange.value=100*e.v,this.opacityRange.value=100*t.a,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}},{key:"_setSize",value:function(){this.colorPickerCanvas.style.width="100%",this.colorPickerCanvas.style.height="100%",this.colorPickerCanvas.width=289*this.pixelRatio,this.colorPickerCanvas.height=289*this.pixelRatio}},{key:"_create",value:function(){if(this.frame=document.createElement("div"),this.frame.className="vis-color-picker",this.colorPickerDiv=document.createElement("div"),this.colorPickerSelector=document.createElement("div"),this.colorPickerSelector.className="vis-selector",this.colorPickerDiv.appendChild(this.colorPickerSelector),this.colorPickerCanvas=document.createElement("canvas"),this.colorPickerDiv.appendChild(this.colorPickerCanvas),this.colorPickerCanvas.getContext){var t=this.colorPickerCanvas.getContext("2d") 19296 ;this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1),this.colorPickerCanvas.getContext("2d").setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}else{var e=document.createElement("DIV");e.style.color="red",e.style.fontWeight="bold",e.style.padding="10px",e.innerHTML="Error: your browser does not support HTML canvas",this.colorPickerCanvas.appendChild(e)}this.colorPickerDiv.className="vis-color",this.opacityDiv=document.createElement("div"),this.opacityDiv.className="vis-opacity",this.brightnessDiv=document.createElement("div"),this.brightnessDiv.className="vis-brightness",this.arrowDiv=document.createElement("div"),this.arrowDiv.className="vis-arrow",this.opacityRange=document.createElement("input");try{this.opacityRange.type="range",this.opacityRange.min="0",this.opacityRange.max="100"}catch(t){}this.opacityRange.value="100",this.opacityRange.className="vis-range",this.brightnessRange=document.createElement("input");try{this.brightnessRange.type="range",this.brightnessRange.min="0",this.brightnessRange.max="100"}catch(t){}this.brightnessRange.value="100",this.brightnessRange.className="vis-range",this.opacityDiv.appendChild(this.opacityRange),this.brightnessDiv.appendChild(this.brightnessRange);var i=this;this.opacityRange.onchange=function(){i._setOpacity(this.value)},this.opacityRange.oninput=function(){i._setOpacity(this.value)},this.brightnessRange.onchange=function(){i._setBrightness(this.value)},this.brightnessRange.oninput=function(){i._setBrightness(this.value)},this.brightnessLabel=document.createElement("div"),this.brightnessLabel.className="vis-label vis-brightness",this.brightnessLabel.
19296innerHTML="brightness:",this.opacityLabel=document.createElement("div"),this.opacityLabel.className="vis-label vis-opacity",this.opacityLabel.innerHTML="opacity:",this.newColorDiv=document.createElement("div"),this.newColorDiv.className="vis-new-color",this.newColorDiv.innerHTML="new",this.initialColorDiv=document.createElement("div"),this.initialColorDiv.className="vis-initial-color",this.initialColorDiv.innerHTML="initial",this.cancelButton=document.createElement("div"),this.cancelButton.className="vis-button vis-cancel",this.cancelButton.innerHTML="cancel",this.cancelButton.onclick=this._hide.bind(this,!1),this.applyButton=document.createElement("div"),this.applyButton.className="vis-button vis-apply",this.applyButton.innerHTML="apply",this.applyButton.onclick=this._apply.bind(this),this.saveButton=document.createElement("div"),this.saveButton.className="vis-button vis-save",this.saveButton.innerHTML="save",this.saveButton.onclick=this._save.bind(this),this.loadButton=document.createElement("div"),this.loadButton.className="vis-button vis-load",this.loadButton.innerHTML="load last",this.loadButton.onclick=this._loadLast.bind(this),this.frame.appendChild(this.colorPickerDiv),this.frame.appendChild(this.arrowDiv),this.frame.appendChild(this.brightnessLabel),this.frame.appendChild(this.brightnessDiv),this.frame.appendChild(this.opacityLabel),this.frame.appendChild(this.opacityDiv),this.frame.appendChild(this.newColorDiv),this.frame.appendChild(this.initialColorDiv),this.frame.appendChild(this.cancelButton),this.frame.appendChild(this.applyButton),this.frame.appendChild(this.saveButton),this.frame.appendChild(this.loadButton)}},{key:"_bindHammer",value:function(){var t=this;this.drag={},this.pinch={},this.hammer=new l(this.colorPickerCanvas),this.hammer.get("pinch").set({enable:!0}),u.onTouch(this.hammer,function(e){t._moveSelector(e)}),this.hammer.on("tap",function(e){t._moveSelector(e)}),this.hammer.on("panstart",function(e){t._moveSelector(e)}),this.hammer.on("panmove",function(e){t._moveSelector(e)}),this.hammer.on("panend",function(e){t._moveSelector(e)})}},{key:"_generateHueCircle",value:function(){if(!1===this.generated){var t=this.colorPickerCanvas.getContext("2d");void 0===this.pixelRation&&(this.pixelRatio=(window.devicePixelRatio||1)/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)),t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0);var e=this.colorPickerCanvas.clientWidth,i=this.colorPickerCanvas.clientHeight;t.clearRect(0,0,e,i);var o=void 0,n=void 0,s=void 0,r=void 0;this.centerCoordinates={x:.5*e,y:.5*i},this.r=.49*e;var a=2*Math.PI/360,h=1/this.r,d=void 0;for(s=0;s<360;s++)for(r=0;r<this.r;r++)o=this.centerCoordinates.x+r*Math.sin(a*s),n=this.centerCoordinates.y+r*Math.cos(a*s),d=c.HSVToRGB(s*(1/360),r*h,1),t.fillStyle="rgb("+d.r+","+d.g+","+d.b+")",t.fillRect(o-.5,n-.5,2,2);t.strokeStyle="rgba(0,0,0,1)",t.circle(this.centerCoordinates.x,this.centerCoordinates.y,this.r),t.stroke(),this.hueCircle=t.getImageData(0,0,e,i)}this.generated=!0}},{key:"_moveSelector",value:function(t){var e=this.colorPickerDiv.getBoundingClientRect(),i=t.center.x-e.left,o=t.center.y-e.top,n=.5*this.colorPickerDiv.clientHeight,s=.5*this.colorPickerDiv.clientWidth,r=i-s,a=o-n,h=Math.atan2(r,a),d=.98*Math.min(Math.sqrt(r*r+a*a),s),l=Math.cos(h)*d+n,u=Math.sin(h)*d+s;this.colorPickerSelector.style.top=l-.5*this.colorPickerSelector.clientHeight+"px",this.colorPickerSelector.style.left=u-.5*this.colorPickerSelector.clientWidth+"px";var p=h/(2*Math.PI);p=p<0?p+1:p;var f=d/this.r,m=c.RGBToHSV(this.color.r,this.color.g,this.color.b);m.h=p,m.s=f;var v=c.HSVToRGB(m.h,m.s,m.v);v.a=this.color.a,this.color=v,this.initialColorDiv.style.backgroundColor="rgba("+this.initialColor.r+","+this.initialColor.g+","+this.initialColor.b+","+this.initialColor.a+")",this.newColorDiv.style.backgroundColor="rgba("+this.color.r+","+this.color.g+","+this.color.b+","+this.color.a+")"}}]),t}();e.default=p},function(t,e,i){function o(t,e,i,o){if(!(Array.isArray(i)||i instanceof r||i instanceof a)&&i instanceof Object){var d=o;o=i,i=d}o&&o.throttleRedraw&&console.warn('Graph2d option "throttleRedraw" is DEPRICATED and no longer supported. It will be removed in the next MAJOR release.');var c=this;this.defaultOptions={start:null,end:null,autoResize:!0,orientation:{axis:"bottom",item:"bottom"},moment:n,width:null,height:null,maxHeight:null,minHeight:null},this.options=s.deepExtend({},this.defaultOptions),this._create(t),this.components=[],this.body={dom:this.dom,domProps:this.props,emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this)},hiddenDates:[],util:{toScreen:c._toScreen.bind(c),toGlobalScreen:c._toGlobalScreen.bind(c),toTime:c._toTime.bind(c),toGlobalTime:c._toGlobalTime.bind(c)}},this.range=new h(this.body),this.components.push(this.range),this.body.range=this.range,this.timeAxis=new l(this.body),this.components.push(this.timeAxis),this.currentTime=new u(this.body),this.components.push(this.currentTime),this.linegraph=new p(this.body),this.components.push(this.linegraph),this.itemsData=null,this.groupsData=null,this.on("tap",function(t){c.emit("click",c.getEventProperties(t))}),this.on("doubletap",function(t){c.emit("doubleClick",c.getEventProperties(t))}),this.dom.root.oncontextmenu=function(t){c.emit("contextmenu",c.getEventProperties(t))},o&&this.setOptions(o),i&&this.setGroups(i),e&&this.setItems(e),this._redraw()}var n=i(9),s=i(2),r=i(11),a=i(12),h=i(64),d=i(65),l=i(45),u=i(67),c=i(46),p=i(106),f=i(15).printStyle,m=i(113).allOptions,v=i(113).configureOptions,g=i(71).default,y=i(15).default;o.prototype=new d,o.prototype.setOptions=function(t){!0===y.validate(t,m)&&console.log("%cErrors have been found in the supplied options object.",f),d.prototype.setOptions.call(this,t)},o.prototype.setItems=function(t){var e,i=null==this.itemsData;if(e=t?t instanceof r||t instanceof a?t:new r(t,{type:{start:"Date",end:"Date"}}):null,this.itemsData=e,this.linegraph&&this.linegraph.setItems(e),i)if(void 0!=this.options.start||void 0!=this.options.end){var o=void 0!=this.options.start?this.options.start:null,n=void 0!=this.options.end?this.options.end:null;this.setWindow(o,n,{animation:!1})}else this.fit({animation:!1})},o.prototype.setGroups=function(t){var e;e=t?t instanceof r||t instanceof a?t:new r(t):null,this.groupsData=e,this.linegraph.setGroups(e)}
19296,o.prototype.getLegend=function(t,e,i){return void 0===e&&(e=15),void 0===i&&(i=15),void 0!==this.linegraph.groups[t]?this.linegraph.groups[t].getLegend(e,i):"cannot find group:'"+t+"'"},o.prototype.isGroupVisible=function(t){return void 0!==this.linegraph.groups[t]&&(this.linegraph.groups[t].visible&&(void 0===this.linegraph.options.groups.visibility[t]||1==this.linegraph.options.groups.visibility[t]))},o.prototype.getDataRange=function(){var t=null,e=null;for(var i in this.linegraph.groups)if(this.linegraph.groups.hasOwnProperty(i)&&1==this.linegraph.groups[i].visible)for(var o=0;o<this.linegraph.groups[i].itemsData.length;o++){var n=this.linegraph.groups[i].itemsData[o],r=s.convert(n.x,"Date").valueOf();t=null==t?r:t>r?r:t,e=null==e?r:e<r?r:e}return{min:null!=t?new Date(t):null,max:null!=e?new Date(e):null}},o.prototype.getEventProperties=function(t){var e=t.center?t.center.x:t.clientX,i=t.center?t.center.y:t.clientY,o=e-s.getAbsoluteLeft(this.dom.centerContainer),n=i-s.getAbsoluteTop(this.dom.centerContainer),r=this._toTime(o),a=c.customTimeFromTarget(t),h=s.getTarget(t),d=null;s.hasParent(h,this.timeAxis.dom.foreground)?d="axis":this.timeAxis2&&s.hasParent(h,this.timeAxis2.dom.foreground)?d="axis":s.hasParent(h,this.linegraph.yAxisLeft.dom.frame)?d="data-axis":s.hasParent(h,this.linegraph.yAxisRight.dom.frame)?d="data-axis":s.hasParent(h,this.linegraph.legendLeft.dom.frame)?d="legend":s.hasParent(h,this.linegraph.legendRight.dom.frame)?d="legend":null!=a?d="custom-time":s.hasParent(h,this.currentTime.bar)?d="current-time":s.hasParent(h,this.dom.center)&&(d="background");var l=[],u=this.linegraph.yAxisLeft,p=this.linegraph.yAxisRight;return!u.hidden&&this.itemsData.length>0&&l.push(u.screenToValue(n)),!p.hidden&&this.itemsData.length>0&&l.push(p.screenToValue(n)),{event:t,what:d,pageX:t.srcEvent?t.srcEvent.pageX:t.pageX,pageY:t.srcEvent?t.srcEvent.pageY:t.pageY,x:o,y:n,time:r,value:l}},o.prototype._createConfigurator=function(){return new g(this,this.dom.container,v)},t.exports=o},function(t,e,i){e.util=i(2),e.DOMutil=i(14),e.DataSet=i(11),e.DataView=i(12),e.Queue=i(43),e.Network=i(182),e.network={Images:i(116),dotparser:i(114),gephiParser:i(115),allOptions:i(122)},e.network.convertDot=function(t){return e.network.dotparser.DOTToGraph(t)},e.network.convertGephi=function(t,i){return e.network.gephiParser.parseGephi(t,i)},e.moment=i(9),e.Hammer=i(10),e.keycharm=i(35)},function(t,e,i){function o(t,e,i){var n=this;if(!(this instanceof o))throw new SyntaxError("Constructor must be called with the new operator");this.options={},this.defaultOptions={locale:"en",locales:d,clickToUse:!1},s.extend(this.options,this.defaultOptions),this.body={container:t,nodes:{},nodeIndices:[],edges:{},edgeIndices:[],emitter:{on:this.on.bind(this),off:this.off.bind(this),emit:this.emit.bind(this),once:this.once.bind(this)},eventListeners:{onTap:function(){},onTouch:function(){},onDoubleTap:function(){},onHold:function(){},onDragStart:function(){},onDrag:function(){},onDragEnd:function(){},onMouseWheel:function(){},onPinch:function(){},onMouseMove:function(){},onRelease:function(){},onContext:function(){}},data:{nodes:null,edges:null},functions:{createNode:function(){},createEdge:function(){},getPointer:function(){}},modules:{},view:{scale:1,translation:{x:0,y:0}}},this.bindEventListeners(),this.images=new l(function(){return n.body.emitter.emit("_requestRedraw")}),this.groups=new u,this.canvas=new g(this.body),this.selectionHandler=new _(this.body,this.canvas),this.interactionHandler=new b(this.body,this.canvas,this.selectionHandler),this.view=new y(this.body,this.canvas),this.renderer=new v(this.body,this.canvas),this.physics=new f(this.body),this.layoutEngine=new w(this.body),this.clustering=new m(this.body),this.manipulation=new x(this.body,this.canvas,this.selectionHandler),this.nodesHandler=new c(this.body,this.images,this.groups,this.layoutEngine),this.edgesHandler=new p(this.body,this.images,this.groups),this.body.modules.kamadaKawai=new T(this.body,150,.05),this.body.modules.clustering=this.clustering,this.canvas._create(),this.setOptions(i),this.setData(e)}i(183);var n=i(44),s=i(2),r=i(114),a=i(115),h=i(97),d=i(184),l=i(116).default,u=i(186).default,c=i(187).default,p=i(214).default,f=i(220).default,m=i(227).default,v=i(229).default,g=i(230).default,y=i(231).default,b=i(232).default,_=i(234).default,w=i(235).default,x=i(237).default,k=i(71).default,S=i(15).default,D=i(15),M=D.printStyle,C=i(122),O=C.allOptions,E=C.configureOptions,T=i(238).default;n(o.prototype),o.prototype.setOptions=function(t){var e=this;if(void 0!==t){!0===S.validate(t,O)&&console.log("%cErrors have been found in the supplied options object.",M);var i=["locale","locales","clickToUse"];if(s.selectiveDeepExtend(i,this.options,t),t=this.layoutEngine.setOptions(t.layout,t),this.canvas.setOptions(t),this.groups.setOptions(t.groups),this.nodesHandler.setOptions(t.nodes),this.edgesHandler.setOptions(t.edges),this.physics.setOptions(t.physics),this.manipulation.setOptions(t.manipulation,t,this.options),this.interactionHandler.setOptions(t.interaction),this.renderer.setOptions(t.interaction),this.selectionHandler.setOptions(t.interaction),void 0!==t.groups&&this.body.emitter.emit("refreshNodes"),"configure"in t&&(this.configurator||(this.configurator=new k(this,this.body.container,E,this.canvas.pixelRatio)),this.configurator.setOptions(t.configure)),this.configurator&&!0===this.configurator.options.enabled){var o={nodes:{},edges:{},layout:{},interaction:{},manipulation:{},physics:{},global:{}};s.deepExtend(o.nodes,this.nodesHandler.options),s.deepExtend(o.edges,this.edgesHandler.options),s.deepExtend(o.layout,this.layoutEngine.options),s.deepExtend(o.interaction,this.selectionHandler.options),s.deepExtend(o.interaction,this.renderer.options),s.deepExtend(o.interaction,this.interactionHandler.options),s.deepExtend(o.manipulation,this.manipulation.options),s.deepExtend(o.physics,this.physics.options),s.deepExtend(o.global,this.canvas.options),s.deepExtend(o.global,this.options),this.configurator.setModuleOptions(o)}void 0!==t.clickToUse?!0===t.clickToUse?void 0===this.activator&&(this.activator=new h(this.canvas.frame),this.activator.on("change",function(){e.body.emitter.emit("activate")})):(void 0!==this.activator&&(this.activator.destroy(),delete this.activator),this.body.emitter.emit("activate")):this.body.emitter.emit("activate"),this.canvas.setSize(),this.body.emitter.emit("startSimulation")}},o.prototype._updateVisibleIndices=function(){var t=this.body.nodes,e=this.body.edges;this.body.nodeIndices=[],this.body.edgeIndices=[];for(var i in t)t.hasOwnProperty(i)&&(this.clustering._isClusteredNode(i)||!1!==t[i].options.hidden||this.body.nodeIndices.push(t[i].id));for(var o in e)if(e.hasOwnProperty(o)){var n=e[o],s=t[n.fromId],r=t[n.toId],a=void 0!==s&&void 0!==r,h=!this.clustering._isClusteredEdge(o)&&!1===n.options.hidden&&a&&!1===s.options.hidden&&!1===r.options.hidden;h&&this.body.edgeIndices.push(n.id)}},o.prototype.bindEventListeners=function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.edgesHandler._updateState(),t.body.emitter.emit("_dataUpdated")}),this.body.emitter.on("_dataUpdated",function(){t.clustering._updateState(),t._updateVisibleIndices(),t._updateV
19296alueRange(t.body.nodes),t._updateValueRange(t.body.edges),t.body.emitter.emit("startSimulation"),t.body.emitter.emit("_requestRedraw")})},o.prototype.setData=function(t){if(this.body.emitter.emit("resetPhysics"),this.body.emitter.emit("_resetData"),this.selectionHandler.unselectAll(),t&&t.dot&&(t.nodes||t.edges))throw new SyntaxError('Data must contain either parameter "dot" or parameter pair "nodes" and "edges", but not both.');if(this.setOptions(t&&t.options),t&&t.dot){console.log("The dot property has been deprecated. Please use the static convertDot method to convert DOT into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertDot(dotString);");var e=r.DOTToGraph(t.dot);return void this.setData(e)}if(t&&t.gephi){console.log("The gephi property has been deprecated. Please use the static convertGephi method to convert gephi into vis.network format and use the normal data format with nodes and edges. This converter is used like this: var data = vis.network.convertGephi(gephiJson);");var i=a.parseGephi(t.gephi);return void this.setData(i)}this.nodesHandler.setData(t&&t.nodes,!0),this.edgesHandler.setData(t&&t.edges,!0),this.body.emitter.emit("_dataChanged"),this.body.emitter.emit("_dataLoaded"),this.body.emitter.emit("initPhysics")},o.prototype.destroy=function(){this.body.emitter.emit("destroy"),this.body.emitter.off(),this.off(),delete this.groups,delete this.canvas,delete this.selectionHandler,delete this.interactionHandler,delete this.view,delete this.renderer,delete this.physics,delete this.layoutEngine,delete this.clustering,delete this.manipulation,delete this.nodesHandler,delete this.edgesHandler,delete this.configurator,delete this.images;for(var t in this.body.nodes)this.body.nodes.hasOwnProperty(t)&&delete this.body.nodes[t];for(var e in this.body.edges)this.body.edges.hasOwnProperty(e)&&delete this.body.edges[e];s.recursiveDOMDelete(this.body.container)},o.prototype._updateValueRange=function(t){var e,i=void 0,o=void 0,n=0;for(e in t)if(t.hasOwnProperty(e)){var s=t[e].getValue();void 0!==s&&(i=void 0===i?s:Math.min(s,i),o=void 0===o?s:Math.max(s,o),n+=s)}if(void 0!==i&&void 0!==o)for(e in t)t.hasOwnProperty(e)&&t[e].setValueRange(i,o,n)},o.prototype.isActive=function(){return!this.activator||this.activator.active},o.prototype.setSize=function(){return this.canvas.setSize.apply(this.canvas,arguments)},o.prototype.canvasToDOM=function(){return this.canvas.canvasToDOM.apply(this.canvas,arguments)},o.prototype.DOMtoCanvas=function(){return this.canvas.DOMtoCanvas.apply(this.canvas,arguments)},o.prototype.findNode=function(){return this.clustering.findNode.apply(this.clustering,arguments)},o.prototype.isCluster=function(){return this.clustering.isCluster.apply(this.clustering,arguments)},o.prototype.openCluster=function(){return this.clustering.openCluster.apply(this.clustering,arguments)}
19296,o.prototype.cluster=function(){return this.clustering.cluster.apply(this.clustering,arguments)},o.prototype.getNodesInCluster=function(){return this.clustering.getNodesInCluster.apply(this.clustering,arguments)},o.prototype.clusterByConnection=function(){return this.clustering.clusterByConnection.apply(this.clustering,arguments)},o.prototype.clusterByHubsize=function(){return this.clustering.clusterByHubsize.apply(this.clustering,arguments)},o.prototype.clusterOutliers=function(){return this.clustering.clusterOutliers.apply(this.clustering,arguments)},o.prototype.getSeed=function(){return this.layoutEngine.getSeed.apply(this.layoutEngine,arguments)},o.prototype.enableEditMode=function(){return this.manipulation.enableEditMode.apply(this.manipulation,arguments)},o.prototype.disableEditMode=function(){return this.manipulation.disableEditMode.apply(this.manipulation,arguments)},o.prototype.addNodeMode=function(){return this.manipulation.addNodeMode.apply(this.manipulation,arguments)},o.prototype.editNode=function(){return this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.editNodeMode=function(){return console.log("Deprecated: Please use editNode instead of editNodeMode."),this.manipulation.editNode.apply(this.manipulation,arguments)},o.prototype.addEdgeMode=function(){return this.manipulation.addEdgeMode.apply(this.manipulation,arguments)},o.prototype.editEdgeMode=function(){return this.manipulation.editEdgeMode.apply(this.manipulation,arguments)},o.prototype.deleteSelected=function(){return this.manipulation.deleteSelected.apply(this.manipulation,arguments)},o.prototype.getPositions=function(){return this.nodesHandler.getPositions.apply(this.nodesHandler,arguments)},o.prototype.storePositions=function(){return this.nodesHandler.storePositions.apply(this.nodesHandler,arguments)},o.prototype.moveNode=function(){return this.nodesHandler.moveNode.apply(this.nodesHandler,arguments)},o.prototype.getBoundingBox=function(){return this.nodesHandler.getBoundingBox.apply(this.nodesHandler,arguments)},o.prototype.getConnectedNodes=function(t){return void 0!==this.body.nodes[t]?this.nodesHandler.getConnectedNodes.apply(this.nodesHandler,arguments):this.edgesHandler.getConnectedNodes.apply(this.edgesHandler,arguments)},o.prototype.getConnectedEdges=function(){return this.nodesHandler.getConnectedEdges.apply(this.nodesHandler,arguments)},o.prototype.startSimulation=function(){return this.physics.startSimulation.apply(this.physics,arguments)},o.prototype.stopSimulation=function(){return this.physics.stopSimulation.apply(this.physics,arguments)},o.prototype.stabilize=function(){return this.physics.stabilize.apply(this.physics,arguments)},o.prototype.getSelection=function(){return this.selectionHandler.getSelection.apply(this.selectionHandler,arguments)},o.prototype.setSelection=function(){return this.selectionHandler.setSelection.apply(this.selectionHandler,arguments)},o.prototype.getSelectedNodes=function(){return this.selectionHandler.getSelectedNodes.apply(this.selectionHandler,arguments)},o.prototype.getSelectedEdges=function(){return this.selectionHandler.getSelectedEdges.apply(this.selectionHandler,arguments)},o.prototype.getNodeAt=function(){var t=this.selectionHandler.getNodeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.getEdgeAt=function(){var t=this.selectionHandler.getEdgeAt.apply(this.selectionHandler,arguments);return void 0!==t&&void 0!==t.id?t.id:t},o.prototype.selectNodes=function(){return this.selectionHandler.selectNodes.apply(this.selectionHandler,arguments)},o.prototype.selectEdges=function(){return this.selectionHandler.selectEdges.apply(this.selectionHandler,arguments)},o.prototype.unselectAll=function(){this.selectionHandler.unselectAll.apply(this.selectionHandler,arguments),this.redraw()},o.prototype.redraw=function(){return this.renderer.redraw.apply(this.renderer,arguments)},o.prototype.getScale=function(){return this.view.getScale.apply(this.view,arguments)},o.prototype.getViewPosition=function(){return this.view.getViewPosition.apply(this.view,arguments)},o.prototype.fit=function(){return this.view.fit.apply(this.view,arguments)},o.prototype.moveTo=function(){return this.view.moveTo.apply(this.view,arguments)}
19296,o.prototype.focus=function(){return this.view.focus.apply(this.view,arguments)},o.prototype.releaseNode=function(){return this.view.releaseNode.apply(this.view,arguments)},o.prototype.getOptionsFromConfigurator=function(){var t={};return this.configurator&&(t=this.configurator.getOptions.apply(this.configurator)),t},t.exports=o},function(t,e,i){"undefined"!=typeof CanvasRenderingContext2D&&(CanvasRenderingContext2D.prototype.circle=function(t,e,i){this.beginPath(),this.arc(t,e,i,0,2*Math.PI,!1),this.closePath()},CanvasRenderingContext2D.prototype.square=function(t,e,i){this.beginPath(),this.rect(t-i,e-i,2*i,2*i),this.closePath()},CanvasRenderingContext2D.prototype.triangle=function(t,e,i){this.beginPath(),i*=1.15,e+=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e-(r-s)),this.lineTo(t+n,e+s),this.lineTo(t-n,e+s),this.lineTo(t,e-(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.triangleDown=function(t,e,i){this.beginPath(),i*=1.15,e-=.275*i;var o=2*i,n=o/2,s=Math.sqrt(3)/6*o,r=Math.sqrt(o*o-n*n);this.moveTo(t,e+(r-s)),this.lineTo(t+n,e-s),this.lineTo(t-n,e-s),this.lineTo(t,e+(r-s)),this.closePath()},CanvasRenderingContext2D.prototype.star=function(t,e,i){this.beginPath(),i*=.82,e+=.1*i;for(var o=0;o<10;o++){var n=o%2==0?1.3*i:.5*i;this.lineTo(t+n*Math.sin(2*o*Math.PI/10),e-n*Math.cos(2*o*Math.PI/10))}this.closePath()},CanvasRenderingContext2D.prototype.diamond=function(t,e,i){this.beginPath(),this.lineTo(t,e+i),this.lineTo(t+i,e),this.lineTo(t,e-i),this.lineTo(t-i,e),this.closePath()},CanvasRenderingContext2D.prototype.roundRect=function(t,e,i,o,n){var s=Math.PI/180;i-2*n<0&&(n=i/2),o-2*n<0&&(n=o/2),this.beginPath(),this.moveTo(t+n,e),this.lineTo(t+i-n,e),this.arc(t+i-n,e+n,n,270*s,360*s,!1),this.lineTo(t+i,e+o-n),this.arc(t+i-n,e+o-n,n,0,90*s,!1),this.lineTo(t+n,e+o),this.arc(t+n,e+o-n,n,90*s,180*s,!1),this.lineTo(t,e+n),this.arc(t+n,e+n,n,180*s,270*s,!1),this.closePath()},CanvasRenderingContext2D.prototype.ellipse_vis=function(t,e,i,o){var n=i/2*.5522848,s=o/2*.5522848,r=t+i,a=e+o,h=t+i/2,d=e+o/2;this.beginPath(),this.moveTo(t,d),this.bezierCurveTo(t,d-s,h-n,e,h,e),this.bezierCurveTo(h+n,e,r,d-s,r,d),this.bezierCurveTo(r,d+s,h+n,a,h,a),this.bezierCurveTo(h-n,a,t,d+s,t,d),this.closePath()},CanvasRenderingContext2D.prototype.database=function(t,e,i,o){var n=i,s=o*(1/3),r=n/2*.5522848,a=s/2*.5522848,h=t+n,d=e+s,l=t+n/2,u=e+s/2,c=e+(o-s/2),p=e+o;this.beginPath(),this.moveTo(h,u),this.bezierCurveTo(h,u+a,l+r,d,l,d),this.bezierCurveTo(l-r,d,t,u+a,t,u),this.bezierCurveTo(t,u-a,l-r,e,l,e),this.bezierCurveTo(l+r,e,h,u-a,h,u),this.lineTo(h,c),this.bezierCurveTo(h,c+a,l+r,p,l,p),this.bezierCurveTo(l-r,p,t,c+a,t,c),this.lineTo(t,u)},CanvasRenderingContext2D.prototype.dashedLine=function(t,e,i,o,n){this.beginPath(),this.moveTo(t,e);for(var s=n.length,r=i-t,a=o-e,h=a/r,d=Math.sqrt(r*r+a*a),l=0,u=!0,c=0,p=n[0];d>=.1;)p=n[l++%s],p>d&&(p=d),c=Math.sqrt(p*p/(1+h*h)),c=r<0?-c:c,t+=c,e+=h*c,!0===u?this.lineTo(t,e):this.moveTo(t,e),d-=p,u=!u},CanvasRenderingContext2D.prototype.hexagon=function(t,e,i){this.beginPath();var o=2*Math.PI/6;this.moveTo(t+i,e);for(var n=1;n<6;n++)this.lineTo(t+i*Math.cos(o*n),e+i*Math.sin(o*n));this.closePath()})},function(t,e,i){e.en={edit:"Edit",del:"Delete selected",back:"Back",addNode:"Add Node",addEdge:"Add Edge",editNode:"Edit Node",editEdge:"Edit Edge",addDescription:"Click in an empty space to place a new node.",edgeDescription:"Click on a node and drag the edge to another node to connect them.",editEdgeDescription:"Click on the control points and drag them to a node to connect to it.",createEdgeError:"Cannot link edges to a cluster.",deleteClusterError:"Clusters cannot be deleted.",editClusterError:"Clusters cannot be edited."},e.en_EN=e.en,e.en_US=e.en,e.de={edit:"Editieren",del:"Lösche Auswahl",back:"Zurück",addNode:"Knoten hinzufügen",addEdge:"Kante hinzufügen",editNode:"Knoten editieren",editEdge:"Kante editieren",addDescription:"Klicke auf eine freie Stelle, um einen neuen Knoten zu plazieren.",edgeDescription:"Klicke auf einen Knoten und ziehe die Kante zu einem anderen Knoten, um diese zu verbinden.",editEdgeDescription:"Klicke auf die Verbindungspunkte und ziehe diese auf einen Knoten, um sie zu verbinden.",createEdgeError:"Es ist nicht möglich, Kanten mit Clustern zu verbinden.",deleteClusterError:"Cluster können nicht gelÃ
19296¶scht werden.",editClusterError:"Cluster können nicht editiert werden."},e.de_DE=e.de,e.es={edit:"Editar",del:"Eliminar selección",back:"ÃÂtras",addNode:"Añadir nodo",addEdge:"Añadir arista",editNode:"Editar nodo",editEdge:"Editar arista",addDescription:"Haga clic en un lugar vacÃÂo para colocar un nuevo nodo.",edgeDescription:"Haga clic en un nodo y arrastre la arista hacia otro nodo para conectarlos.",editEdgeDescription:"Haga clic en un punto de control y arrastrelo a un nodo para conectarlo.",createEdgeError:"No se puede conectar una arista a un grupo.",deleteClusterError:"No es posible eliminar grupos.",editClusterError:"No es posible editar grupos."},e.es_ES=e.es,e.it={edit:"Modifica",del:"Cancella la selezione",back:"Indietro",addNode:"Aggiungi un nodo",addEdge:"Aggiungi un vertice",editNode:"Modifica il nodo",editEdge:"Modifica il vertice",addDescription:"Clicca per aggiungere un nuovo nodo",edgeDescription:"Clicca su un nodo e trascinalo ad un altro nodo per connetterli.",editEdgeDescription:"Clicca sui Punti di controllo e trascinali ad un nodo per connetterli.",createEdgeError:"Non si possono collegare vertici ad un cluster",deleteClusterError:"I cluster non possono essere cancellati",editClusterError:"I clusters non possono essere modificati."},e.it_IT=e.it,e.nl={edit:"Wijzigen",del:"Selectie verwijderen",back:"Terug",addNode:"Node toevoegen",addEdge:"Link toevoegen",editNode:"Node wijzigen",editEdge:"Link wijzigen",addDescription:"Klik op een leeg gebied om een nieuwe node te maken.",edgeDescription:"Klik op een node en sleep de link naar een andere node om ze te verbinden.",editEdgeDescription:"Klik op de verbindingspunten en sleep ze naar een node om daarmee te verbinden.",createEdgeError:"Kan geen link maken naar een cluster.",deleteClusterError:"Clusters kunnen niet worden verwijderd.",editClusterError:"Clusters kunnen niet worden aangepast."},e.nl_NL=e.nl,e.nl_BE=e.nl,e["pt-br"]={edit:"Editar",del:"Remover selecionado",back:"Voltar",addNode:"Adicionar nó",addEdge:"Adicionar aresta",editNode:"Editar nó",editEdge:"Editar aresta",addDescription:"Clique em um espaço em branco para adicionar um novo nó",edgeDescription:"Clique em um nó e arraste a aresta até outro nó para conectá-los",editEdgeDescription:"Clique nos pontos de controle e os arraste para um nó para conectá-los",createEdgeError:"Não foi possÃÂvel linkar arestas a um cluster.",deleteClusterError:"Clusters não puderam ser removidos.",editClusterError:"Clusters não puderam ser editados."},e["pt-BR"]=e["pt-br"],e.pt_BR=e["pt-br"],e.pt_br=e["pt-br"],e.ru={edit:"à õôðúÃâøÃâ¬Ã¾Ã²Ã°ÃâÃÅ",del:"ãôðûøÃâÊòÃâ¹Ã±Ãâ¬Ã°Ã½Ã½Ã¾Ãµ",back:"ÃÂð÷ðô",addNode:"ÃâþñðòøÃâÃÅ ÃÆÃ·ÃµÃ»",addEdge:"ÃâþñðòøÃâÃÅ Ãâ¬ÃµÃ±Ãâ¬Ã¾",editNode:"à õôðúÃâøÃâ¬Ã¾Ã²Ã°ÃâÃÅ ÃÆÃ·ÃµÃ»",editEdge:"à õôðúÃâøÃâ¬Ã¾Ã²Ã°ÃâÃÅ Ãâ¬ÃµÃ±Ãâ¬Ã¾",addDescription:"ÚûøúýøÃâõ ò ÃÂòþñþôýþõ üõÃÂÃâþ, Ãâ¡ÃâþñÃ⹠ôþñðòøÃâÊýþòÃâ¹Ã¹ ÃÆÃ·ÃµÃ».",edgeDescription:"ÚûøúýøÃâõ ýð ÃÆÃ·ÃµÃ» ø ÿÃâ¬Ã¾ÃâÃÂýøÃâõ Ãâ¬ÃµÃ±Ãâ¬Ã¾ ú ôÃâ¬ÃÆÃ³Ã¾ÃÂ¼ÃÆ ÃÆÃ·ÃÂ»ÃÆ, Ãâ¡ÃâþñÃâ¹ ÃÂþõôøýøÃâÊøÃâ¦.",editEdgeDescription:"ÚûøúýøÃâõ ýð úþýÃâÃâ¬Ã¾Ã»ÃÅýÃâ¹Ãµ ÃâþÃâ¡ÃºÃ¸ ø ÿõÃâ¬ÃµÃâðÃâ°Ã¸Ãâõ øÃ⦠ò ÃÆÃ·ÃµÃ», Ãâ¡ÃâþñÃ⹠ÿþôúûÎÃâ¡Ã¸ÃâÃÅÃÂàú ýõÃÂ¼ÃÆ.",createEdgeError:"ÃÂõòþ÷üþöýþ ÃÂþõôøýøÃâÃÅ Ãâ¬ÃµÃ±Ãâ¬Ã° ò úûðÃÂÃâõÃâ¬.",deleteClusterError:"ÚûðÃÂÃâõÃâ¬Ã⹠ýõ üþÃÂ³ÃÆÃâ ñÃâ¹ÃâÃÅ ÃÆÃ´Ã°Ã»ÃµÃ½Ãâ¹",editClusterError:"ÚûðÃÂÃâõÃâ¬Ã⹠ýõôþÃÂÃâÃÆÃ¿Ã½Ã⹠ôûàÃâ¬ÃµÃ´Ã°ÃºÃâøÃâ¬Ã¾Ã²Ã°Ã½Ã¸ÃÂ."},e.ru_RU=e.ru,e.cn={edit:"ç¼âè¾â",del:"Ã¥Ë Ã©â¢Â¤Ã©â¬â°Ã¥Â®Å¡",back:"è¿âÃ¥âºÅ¾",addNode:"æ·»åŠèŠâçâ¹",addEdge:"æ·»åŠè¿žæŽ¥çº¿",editNode:"ç¼âè¾âèŠâçâ¹",editEdge:"ç¼âè¾â连接线",addDescription:"Ã¥Ââ¢Ã¥â¡Â»Ã§Â©ÂºÃ§â¢Â½Ã¥Â¤âæâ¾ç½®æâ°èŠâçâ¹ãâ¬â",edgeDescription:"Ã¥Ââ¢Ã¥â¡Â»Ã¦Å¸Â个èŠâçâ¹å¹¶å°â 该连接线æâ¹â动å˰å¦ä¸â¬Ã¤Â¸ÂªÃ¨Å âçâ¹ä»¥è¿žæŽ¥å®ÆÃ
19296¤Â»Â¬Ã£â¬â",editEdgeDescription:"Ã¥Ââ¢Ã¥â¡Â»Ã¦Å½Â§Ã¥Ë¶èŠâçâ¹å¹¶å°â å®ÆÃ¤Â»Â¬Ã¦â¹âå˰èŠâçâ¹ä¸Šè¿žæŽ¥ãâ¬â",createEdgeError:"æâ æ³â¢Ã¥Â°â 连接线连接å˰群éâºâ ãâ¬â",deleteClusterError:"æâ æ³â¢Ã¥Ë éâ¢Â¤Ã§Â¾Â¤Ã©âºâ ãâ¬â",editClusterError:"æâ æ³â¢Ã§Â¼âè¾â群éâºâ ãâ¬â"},e.zh_CN=e.cn},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t),this.NUM_ITERATIONS=4,this.image=new Image,this.canvas=document.createElement("canvas")}return(0,a.default)(t,[{key:"init",value:function(){if(!this.initialized()){this.src=this.image.src;var t=this.image.width,e=this.image.height;this.width=t,this.height=e;var i=Math.floor(e/2),o=Math.floor(e/4),n=Math.floor(e/8),s=Math.floor(e/16),r=Math.floor(t/2),a=Math.floor(t/4),h=Math.floor(t/8),d=Math.floor(t/16);this.canvas.width=3*a,this.canvas.height=i,this.coordinates=[[0,0,r,i],[r,0,a,o],[r,o,h,n],[5*h,o,d,s]],this._fillMipMap()}}},{key:"initialized",value:function(){return void 0!==this.coordinates}},{key:"_fillMipMap",value:function(){var t=this.canvas.getContext("2d"),e=this.coordinates[0];t.drawImage(this.image,e[0],e[1],e[2],e[3]);for(var i=1;i<this.NUM_ITERATIONS;i++){var o=this.coordinates[i-1],n=this.coordinates[i];t.drawImage(this.canvas,o[0],o[1],o[2],o[3],n[0],n[1],n[2],n[3])}}},{key:"drawImageAtPosition",value:function(t,e,i,o,n,s){if(this.initialized())if(e>2){e*=.5;for(var r=0;e>2&&r<this.NUM_ITERATIONS;)e*=.5,r+=1;r>=this.NUM_ITERATIONS&&(r=this.NUM_ITERATIONS-1);var a=this.coordinates[r];t.drawImage(this.canvas,a[0],a[1],a[2],a[3],i,o,n,s)}else t.drawImage(this.image,i,o,n,s)}}]),t}();e.default=h},function(t,e,i){ 19297 function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=function(){function t(){(0,s.default)(this,t),this.clear(),this.defaultIndex=0,this.groupsArray=[],this.groupIndex=0,this.defaultGroups=[{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},{border:"#FFA500",background:"#FFFF00",highlight:{border:"#FFA500",background:"#FFFFA3"},hover:{border:"#FFA500",background:"#FFFFA3"}},{border:"#FA0A10",background:"#FB7E81",highlight:{border:"#FA0A10",background:"#FFAFB1"},hover:{border:"#FA0A10",background:"#FFAFB1"}},{border:"#41A906",background:"#7BE141",highlight:{border:"#41A906",background:"#A1EC76"},hover:{border:"#41A906",background:"#A1EC76"}},{border:"#E129F0",background:"#EB7DF4",highlight:{border:"#E129F0",background:"#F0B3F5"},hover:{border:"#E129F0",background:"#F0B3F5"}},{border:"#7C29F0",background:"#AD85E4",highlight:{border:"#7C29F0",background:"#D3BDF0"},hover:{border:"#7C29F0",background:"#D3BDF0"}},{border:"#C37F00",background:"#FFA807",highlight:{border:"#C37F00",background:"#FFCA66"},hover:{border:"#C37F00",background:"#FFCA66"}},{border:"#4220FB",background:"#6E6EFD",highlight:{border:"#4220FB",background:"#9B9BFD"},hover:{border:"#4220FB",background:"#9B9BFD"}},{border:"#FD5A77",background:"#FFC0CB",highlight:{border:"#FD5A77",background:"#FFD1D9"},hover:{border:"#FD5A77",background:"#FFD1D9"}},{border:"#4AD63A",background:"#C2FABC",highlight:{border:"#4AD63A",background:"#E6FFE3"},hover:{border:"#4AD63A",background:"#E6FFE3"}},{border:"#990000",background:"#EE0000",highlight:{border:"#BB0000",background:"#FF3333"},hover:{border:"#BB0000",background:"#FF3333"}},{border:"#FF6000",background:"#FF6000",highlight:{border:"#FF6000",background:"#FF6000"},hover:{border:"#FF6000",background:"#FF6000"}},{border:"#97C2FC",background:"#2B7CE9",highlight:{border:"#D2E5FF",background:"#2B7CE9"},hover:{border:"#D2E5FF",background:"#2B7CE9"}},{border:"#399605",background:"#255C03",highlight:{border:"#399605",background:"#255C03"},hover:{border:"#399605",background:"#255C03"}},{border:"#B70054",background:"#FF007E",highlight:{border:"#B70054",background:"#FF007E"},hover:{border:"#B70054",background:"#FF007E"}},{border:"#AD85E4",background:"#7C29F0",highlight:{border:"#D3BDF0",background:"#7C29F0"},hover:{border:"#D3BDF0",background:"#7C29F0"}},{border:"#4557FA",background:"#000EA1",highlight:{border:"#6E6EFD",background:"#000EA1"},hover:{border:"#6E6EFD",background:"#000EA1"}},{border:"#FFC0CB",background:"#FD5A77",highlight:{border:"#FFD1D9",background:"#FD5A77"},hover:{border:"#FFD1D9",background:"#FD5A77"}},{border:"#C2FABC",background:"#74D66A",highlight:{border:"#E6FFE3",background:"#74D66A"},hover:{border:"#E6FFE3",background:"#74D66A"}},{border:"#EE0000",background:"#990000",highlight:{border:"#FF3333",background:"#BB0000"},hover:{border:"#FF3333",background:"#BB0000"}}],this.options={},this.defaultOptions={useDefaultGroups:!0},h.extend(this.options,this.defaultOptions)}return(0,a.default)(t,[{key:"setOptions",value:function(t){var e=["useDefaultGroups"];if(void 0!==t)for(var i in t)if(t.hasOwnProperty(i)&&-1===e.indexOf(i)){var o=t[i];this.add(i,o)}}},{key:"clear",value:function(){this.groups={},this.groupsArray=[]}},{key:"get",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.groups[t];if(void 0===i&&e)if(!1===this.options.useDefaultGroups&&this.groupsArray.length>0){var o=this.groupIndex%this.groupsArray.length;this.groupIndex++,i={},i.color=this.groups[this.groupsArray[o]],this.groups[t]=i}else{var n=this.defaultIndex%this.defaultGroups.length;this.defaultIndex++,i={},i.color=this.defaultGroups[n],this.groups[t]=i}return i}},{key:"add",value:function(t,e){return this.groups[t]=e,this.groupsArray.push(t),e}}]),t}();e.default=d}
19297,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(47).default,c=function(){function t(e,i,o,n){var r=this;if((0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.layoutEngine=n,this.body.functions.createNode=this.create.bind(this),this.nodesListeners={add:function(t,e){r.add(e.items)},update:function(t,e){r.update(e.items,e.data,e.oldData)},remove:function(t,e){r.remove(e.items)}},this.defaultOptions={borderWidth:1,borderWidthSelected:2,brokenImage:void 0,color:{border:"#2B7CE9",background:"#97C2FC",highlight:{border:"#2B7CE9",background:"#D2E5FF"},hover:{border:"#2B7CE9",background:"#D2E5FF"}},fixed:{x:!1,y:!1},font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:0,strokeColor:"#ffffff",align:"center",vadjust:0,multi:!1,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"monospace",vadjust:2}},group:void 0,hidden:!1,icon:{face:"FontAwesome",code:void 0,size:50,color:"#2B7CE9"},image:void 0,label:void 0,labelHighlightBold:!0,level:void 0,margin:{top:5,right:5,bottom:5,left:5},mass:1,physics:!0,scaling:{min:10,max:30,label:{enabled:!1,min:14,max:30,maxVisible:30,drawThreshold:5},customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},shape:"ellipse",shapeProperties:{borderDashes:!1,borderRadius:6,interpolation:!0,useImageSize:!1,useBorderWithImage:!1},size:25,title:void 0,value:void 0,x:void 0,y:void 0},this.defaultOptions.mass<=0)throw"Internal error: mass in defaultOptions of NodesHandler may not be zero or negative";this.options=h.bridgeObject(this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("refreshNodes",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.nodesListeners,function(e,i){t.body.data.nodes&&t.body.data.nodes.off(i,e)}),delete t.body.functions.createNode,delete t.nodesListeners.add,delete t.nodesListeners.update,delete t.nodesListeners.remove,delete t.nodesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){if(u.parseOptions(this.options,t),void 0!==t.shape)for(var e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&this.body.nodes[e].updateShape();if(void 0!==t.font)for(var i in this.body.nodes)this.body.nodes.hasOwnProperty(i)&&(this.body.nodes[i].updateLabelModule(),this.body.nodes[i].needsRefresh());if(void 0!==t.size)for(var o in this.body.nodes)this.body.nodes.hasOwnProperty(o)&&this.body.nodes[o].needsRefresh();void 0===t.hidden&&void 0===t.physics||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.data.nodes;if(t instanceof d||t instanceof l)this.body.data.nodes=t;else if(Array.isArray(t))this.body.data.nodes=new d,this.body.data.nodes.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.nodes=new d}if(i&&h.forEach(this.nodesListeners,function(t,e){i.off(e,t)}),this.body.nodes={},this.body.data.nodes){var o=this;h.forEach(this.nodesListeners,function(t,e){o.body.data.nodes.on(e,t)});var n=this.body.data.nodes.getIds();this.add(n,!0)}!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=[],n=0;n<t.length;n++){i=t[n];var s=this.body.data.nodes.get(i),r=this.create(s);o.push(r),this.body.nodes[i]=r}this.layoutEngine.positionInitially(o),!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"update",value:function(t,e,i){for(var o=this.body.nodes,n=!1,s=0;s<t.length;s++){var r=t[s],a=o[r],h=e[s];void 0!==a?a.setOptions(h)&&(n=!0):(n=!0,a=this.create(h),o[r]=a)}n||void 0===i||(n=e.some(function(t,e){var o=i[e];return o&&o.level!==t.level})),!0===n?this.body.emitter.emit("_dataChanged"):this.body.emitter.emit("_dataUpdated")}},{key:"remove",value:function(t){for(var e=this.body.nodes,i=0;i<t.length;i++){delete e[t[i]]}this.body.emitter.emit("_dataChanged")}},{key:"create",value:function(t){return new(arguments.length>1&&void 0!==arguments[1]?arguments[1]:u)(t,this.body,this.images,this.groups,this.options,this.defaultOptions)}},{key:"refresh",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];h.forEach(this.body.nodes,function(i,o){var n=t.body.data.nodes.get(o);void 0!==n&&(!0===e&&i.setOptions({x:null,y:null}),i.setOptions({fixed:!1}),i.setOptions(n))})}},{key:"getPositions",value:function(t){var e={};if(void 0!==t){if(!0===Array.isArray(t)){for(var i=0;i<t.length;i++)if(void 0!==this.body.nodes[t[i]]){var o=this.body.nodes[t[i]];e[t[i]]={x:Math.round(o.x),y:Math.round(o.y)}}}else if(void 0!==this.body.nodes[t]){var n=this.body.nodes[t];e[t]={x:Math.round(n.x),y:Math.round(n.y)}}}else for(var s=0;s<this.body.nodeIndices.length;s++){var r=this.body.nodes[this.body.nodeIndices[s]];e[this.body.nodeIndices[s]]={x:Math.round(r.x),y:Math.round(r.y)}}return e}},{key:"storePositions",value:function(){var t=[],e=this.body.data.nodes.getDataSet();for(var i in e._data)if(e._data.hasOwnProperty(i)){var o=this.body.nodes[i];e._data[i].x==Math.round(o.x)&&e._data[i].y==Math.round(o.y)||t.pu
19297sh({id:o.id,x:Math.round(o.x),y:Math.round(o.y)})}e.update(t)}},{key:"getBoundingBox",value:function(t){if(void 0!==this.body.nodes[t])return this.body.nodes[t].shape.boundingBox}},{key:"getConnectedNodes",value:function(t,e){var i=[];if(void 0!==this.body.nodes[t])for(var o=this.body.nodes[t],n={},s=0;s<o.edges.length;s++){var r=o.edges[s];"to"!==e&&r.toId==o.id?void 0===n[r.fromId]&&(i.push(r.fromId),n[r.fromId]=!0):"from"!==e&&r.fromId==o.id&&void 0===n[r.toId]&&(i.push(r.toId),n[r.toId]=!0)}return i}},{key:"getConnectedEdges",value:function(t){var e=[];if(void 0!==this.body.nodes[t])for(var i=this.body.nodes[t],o=0;o<i.edges.length;o++)e.push(i.edges[o].id);else console.log("NodeId provided for getConnectedEdges does not exist. Provided: ",t);return e}},{key:"moveNode",value:function(t,e,i){var o=this;void 0!==this.body.nodes[t]?(this.body.nodes[t].x=Number(e),this.body.nodes[t].y=Number(i),setTimeout(function(){o.body.emitter.emit("startSimulation")},0)):console.log("Node id supplied to moveNode does not exist. Provided: ",t)}}]),t}();e.default=c},function(t,e,i){t.exports={default:i(189),__esModule:!0}},function(t,e,i){i(49),i(60),t.exports=i(190)},function(t,e,i){var o=i(86),n=i(13)("iterator"),s=i(31);t.exports=i(7).isIterable=function(t){var e=Object(t);return void 0!==e[n]||"@@iterator"in e||s.hasOwnProperty(o(e))}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(192).default,d=i(48).default,l=function(){function t(e,i,o,n){var r=this;(0,s.default)(this,t),this.ctx=e,this.parent=i;var a=function(t,i){if(void 0===t)return 0;var s=r.parent.getFormattingValues(e,o,n,i),a=0;if(""!==t){a=r.ctx.measureText(t).width}return{width:a,values:s}};this.lines=new h(a)}return(0,a.default)(t,[{key:"process",value:function(t){if(!d.isValidLabel(t))return this.lines.finalize();var e=this.parent.fontOptions;t=t.replace(/\r\n/g,"\n"),t=t.replace(/\r/g,"\n");var i=String(t).split("\n"),o=i.length;if(e.multi)for(var n=0;n<o;n++){var s=this.splitBlocks(i[n],e.multi);if(void 0!==s)if(0!==s.length){if(e.maxWdt>0)for(var r=0;r<s.length;r++){var a=s[r].mod,h=s[r].text;this.splitStringIntoLines(h,a,!0)}else for(var l=0;l<s.length;l++){var u=s[l].mod,c=s[l].text;this.lines.append(c,u)}this.lines.newLine()}else this.lines.newLine("")}else if(e.maxWdt>0)for(var p=0;p<o;p++)this.splitStringIntoLines(i[p]);else for(var f=0;f<o;f++)this.lines.newLine(i[f]);return this.lines.finalize()}},{key:"decodeMarkupSystem",value:function(t){var e="none";return"markdown"===t||"md"===t?e="markdown":!0!==t&&"html"!==t||(e="html"),e}},{key:"splitHtmlBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position<t.length;){var o=t.charAt(i.position);/[ \t]/.test(o)?i.mono?i.add(o):i.spacing=!0:/</.test(o)?i.mono||i.bold||!/<b>/.test(t.substr(i.position,3))?i.mono||i.ital||!/<i>/.test(t.substr(i.position,3))?!i.mono&&/<code>/.test(t.substr(i.position,6))?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono"),i.position+=5):!i.mono&&"bold"===i.mod()&&/<\/b>/.test(t.substr(i.position,4))?(i.emitBlock(),i.bold=!1,i.modStack.shift(),i.position+=3):!i.mono&&"ital"===i.mod()&&/<\/i>/.test(t.substr(i.position,4))?(i.emitBlock(),i.ital=!1,i.modStack.shift(),i.position+=3):"mono"===i.mod()&&/<\/code>/.test(t.substr(i.position,7))?(i.emitBlock(),i.mono=!1,i.modStack.shift(),i.position+=6):i.add(o):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital"),i.position+=2):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold"),i.position+=2):/&/.test(o)?/</.test(t.substr(i.position,4))?(i.add("<"),i.position+=3):/&/.test(t.substr(i.position,5))?(i.add("&"),i.position+=4):i.add("&"):i.add(o),i.position++}return i.emitBlock(),e}},{key:"splitMarkdownBlocks",value:function(t){var e=[],i={bold:!1,ital:!1,mono:!1,beginable:!0,spacing:!1,position:0,buffer:"",modStack:[]};for(i.mod=function(){return 0===this.modStack.length?"normal":this.modStack[0]},i.modName=function(){return 0===this.modStack.length?"normal":"mono"===this.modStack[0]?"mono":i.bold&&i.ital?"boldital":i.bold?"bold":i.ital?"ital":void 0},i.emitBlock=function(){arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.spacing&&(this.add(" "),this.spacing=!1),this.buffer.length>0&&(e.push({text:this.buffer,mod:this.modName()}),this.buffer="")},i.add=function(t){" "===t&&(i.spacing=!0),i.spacing&&(this.buffer+=" ",this.spacing=!1)," "!=t&&(this.buffer+=t)};i.position<t.length;){var o=t.charAt(i.position);/[ \t]/.test(o)?(i.mono?i.add(o):i.spacing=!0,i.beginable=!0):/\\/.test(o)?i.position<t.length+1&&(i.position++,o=t.charAt(i.position),/ \t/.test(o)?i.spacing=!0:(i.add(o),i.beginable=!1)):i.mono||i.bold||!i.beginable&&!i.spacing||!/\*/.test(o)?i.mono||i.ital||!i.beginable&&!i.spacing||!/\_/.test(o)?!i.mono&&(i.beginable||i.spacing)&&/`/.test(o)?(i.emitBlock(),i.mono=!0,i.modStack.unshift("mono")):!i.mono&&"bold"===i.mod()&&/\*/.test(o)?i.position===t.length-1||/[.,_` \t\n]/.test(t.charAt(i.position+1))?(i.emitBlock(),i.bold=!1,i.modStack.shift()):i.add(o):!i.mono&&"ital"===i.mod()&&/\_/.test(o)?i.position===t.length-1||/[.,*` \t\n]/.test(t.charAt(i.position+1))?(i.emitBlock(),i.ital=!1,i.modStack.shift()):i.add(o):i.mono&&"mono"===i.mod()&&/`/.test(o)?i.position===t.length-1||/[.,*_ \t\n]/.test(t.charAt(i.position+1))?(i.emitBlock(),i.mono=!1,i.modStack.shift()):i.add(o):(i.add(o),i.beginable=!1):(i.emitBlock(),i.ital=!0,i.modStack.unshift("ital")):(i.emitBlock(),i.bold=!0,i.modStack.unshift("bold")),i.position++}return i.emitBlock(),e}}
19297,{key:"splitBlocks",value:function(t,e){var i=this.decodeMarkupSystem(e);return"none"===i?[{text:t,mod:"normal"}]:"markdown"===i?this.splitMarkdownBlocks(t):"html"===i?this.splitHtmlBlocks(t):void 0}},{key:"overMaxWidth",value:function(t){var e=this.ctx.measureText(t).width;return this.lines.curWidth()+e>this.parent.fontOptions.maxWdt}},{key:"getLongestFit",value:function(t){for(var e="",i=0;i<t.length;){var o=""===e?"":" ",n=e+o+t[i];if(this.overMaxWidth(n))break;e=n,i++}return i}},{key:"getLongestFitWord",value:function(t){for(var e=0;e<t.length&&!this.overMaxWidth(t.slice(0,e));)e++;return e}},{key:"splitStringIntoLines",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal",i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];t=t.replace(/^( +)/g,"$1\r"),t=t.replace(/([^\r][^ ]*)( +)/g,"$1\r$2\r");for(var o=t.split("\r");o.length>0;){var n=this.getLongestFit(o);if(0===n){var s=o[0],r=this.getLongestFitWord(s);this.lines.newLine(s.slice(0,r),e),o[0]=s.slice(r)}else{var a=n;" "===o[n-1]?n--:" "===o[a]&&a++;var h=o.slice(0,n).join("");n==o.length&&i?this.lines.append(h,e):this.lines.newLine(h,e),o=o.slice(a)}}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(90),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=function(){function t(e){(0,a.default)(this,t),this.measureText=e,this.current=0,this.width=0,this.height=0,this.lines=[]}return(0,d.default)(t,[{key:"_add",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"normal";void 0===this.lines[t]&&(this.lines[t]={width:0,height:0,blocks:[]});var o=e;void 0!==e&&""!==e||(o=" ");var n=this.measureText(o,i),r=(0,s.default)({},n.values);r.text=e,r.width=n.width,r.mod=i,void 0!==e&&""!==e||(r.width=0),this.lines[t].blocks.push(r),this.lines[t].width+=r.width}},{key:"curWidth",value:function(){var t=this.lines[this.current];return void 0===t?0:t.width}},{key:"append",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e)}},{key:"newLine",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"normal";this._add(this.current,t,e),this.current++}},{key:"determineLineHeights",value:function(){for(var t=0;t<this.lines.length;t++){var e=this.lines[t],i=0;if(void 0!==e.blocks)for(var o=0;o<e.blocks.length;o++){var n=e.blocks[o];i<n.height&&(i=n.height)}e.height=i}}},{key:"determineLabelSize",value:function(){for(var t=0,e=0,i=0;i<this.lines.length;i++){var o=this.lines[i];o.width>t&&(t=o.width),e+=o.height}this.width=t,this.height=e}},{key:"removeEmptyBlocks",value:function(){for(var t=[],e=0;e<this.lines.length;e++){var i=this.lines[e];if(0!==i.blocks.length&&(e!==this.lines.length-1||0!==i.width)){var o={};(0,s.default)(o,i),o.blocks=[];for(var n=void 0,r=[],a=0;a<i.blocks.length;a++){var h=i.blocks[a];0!==h.width?r.push(h):void 0===n&&(n=h)}0===r.length&&void 0!==n&&r.push(n),o.blocks=r,t.push(o)}}return t}},{key:"finalize",value:function(){this.determineLineHeights(),this.determineLabelSize();var t=this.removeEmptyBlocks();return{width:this.width,height:this.height,lines:t}}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.width=o.width+this.margin.right+this.margin.left,this.height=o.height+this.margin.top+this.margin.bottom,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.roundRect(this.left,this.top,this.width,this.height,s.borderRadius),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}}
19297,{key:"updateBoundingBox",value:function(t,e,i,o,n){this._updateBoundingBox(t,e,i,o,n);var s=this.options.shapeProperties.borderRadius;this._addBoundingBoxMargin(s)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=this.options.borderWidth;return Math.min(Math.abs(this.width/2/Math.cos(e)),Math.abs(this.height/2/Math.sin(e)))+i}}]),e}(m.default);e.default=v},function(t,e,i){i(195),t.exports=i(7).Object.getPrototypeOf},function(t,e,i){var o=i(41),n=i(85);i(87)("getPrototypeOf",function(){return function(t){return n(o(t))}})},function(t,e,i){t.exports={default:i(197),__esModule:!0}},function(t,e,i){i(198),t.exports=i(7).Object.setPrototypeOf},function(t,e,i){var o=i(17);o(o.S,"Object",{setPrototypeOf:i(199).set})},function(t,e,i){var o=i(32),n=i(27),s=function(t,e){if(n(t),!o(e)&&null!==e)throw TypeError(e+": can't set as prototype!")};t.exports={set:Object.setPrototypeOf||("__proto__"in{}?function(t,e,o){try{o=i(80)(Function.call,i(89).f(Object.prototype,"__proto__").set,2),o(t,[]),e=!(t instanceof Array)}catch(t){e=!0}return function(t,i){return s(t,i),e?t.__proto__=i:o(t,i),t}}({},!1):void 0),check:s}},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=Math.max(o.width+this.margin.right+this.margin.left,o.height+this.margin.top+this.margin.bottom);this.options.size=n/2,this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),this.updateBoundingBox(e,i),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,i,o,n)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,this.height=o,void(this.radius=.5*this.width)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,this._drawRawCircle(t,e,i,s),t.save(),t.clip(),this._drawImageAtPosition(t,s),t.restore(),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.boundingBox.top=e-this.options.size,this.boundingBox.left=t-this.options.size,this.boundingBox.right=t+this.options.size,this.boundingBox.bottom=e+this.options.size,this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),.5*this.width}}]),e}(m.default);e.default=v}
19297,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i),n=o.width+this.margin.right+this.margin.left;this.width=n,this.height=n,this.radius=this.width/2}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.initContextForDraw(t,s),t.database(e-this.width/2,i-this.height/2,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"diamond",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"circle",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this.resize(t),this.options.size}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(this.needsRefresh(e,i)){var o=this.getDimensionsFromLabel(t,e,i);this.height=2*o.height,this.width=o.width+o.height,this.radius=.5*this.width}}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-.5*this.width,this.top=i-.5*this.height,this.initContextForDraw(t,s),t.ellipse_vis(this.left,this.top,this.width,this.height),this.performFill(t,s),this.updateBoundingBox(e,i,t,o,n),this.labelModule.draw(t,e,i,o,n)}},{key:"distanceToBorder",value:function(t,e){this.resize(t);var i=.5*this.width,o=.5*this.height,n=Math.sin(e)*i,s=Math.cos(e)*o;return i*o/Math.sqrt(n*n+s*s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.iconSize={width:Number(this.options.icon.size),height:Number(this.options.icon.size)},this.width=this.iconSize.width+this.margin.right+this.margin.left,this.height=this.iconSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}}
19297,{key:"draw",value:function(t,e,i,o,n,s){if(this.resize(t,o,n),this.options.icon.size=this.options.icon.size||50,this.left=e-this.width/2,this.top=i-this.height/2,this._icon(t,e,i,o,n,s),void 0!==this.options.label){this.labelModule.draw(t,this.left+this.iconSize.width/2+this.margin.left,i+this.height/2+5,o)}this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){if(this.boundingBox.top=e-.5*this.options.icon.size,this.boundingBox.left=t-.5*this.options.icon.size,this.boundingBox.right=t+.5*this.options.icon.size,this.boundingBox.bottom=e+.5*this.options.icon.size,void 0!==this.options.label&&this.labelModule.size.width>0){this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelModule.size.height+5)}}},{key:"_icon",value:function(t,e,i,o,n,s){var r=Number(this.options.icon.size);void 0!==this.options.icon.code?(t.font=(o?"bold ":"")+r+"px "+this.options.icon.face,t.fillStyle=this.options.icon.color||"black",t.textAlign="center",t.textBaseline="middle",this.enableShadow(t,s),t.fillText(this.options.icon.code,e,i),this.disableShadow(t,s)):console.error("When using the icon shape, you need to define the code in the icon options object. This can be done per node or globally.")}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(73),m=o(f),v=function(t){function e(t,i,o,n,r){(0,a.default)(this,e);var h=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return h.setImages(n,r),h}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.selected,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:this.hover;if(void 0===this.imageObj.src||void 0===this.imageObj.width||void 0===this.imageObj.height){var o=2*this.options.size;return this.width=o,void(this.height=o)}this.needsRefresh(e,i)&&this._resizeImage()}},{key:"draw",value:function(t,e,i,o,n,s){if(this.switchImages(o),this.resize(),this.left=e-this.width/2,this.top=i-this.height/2,!0===this.options.shapeProperties.useBorderWithImage){var r=this.options.borderWidth,a=this.options.borderWidthSelected||2*this.options.borderWidth,h=(o?a:r)/this.body.view.scale;t.lineWidth=Math.min(this.width,h),t.beginPath(),t.strokeStyle=o?this.options.color.highlight.border:n?this.options.color.hover.border:this.options.color.border,t.fillStyle=o?this.options.color.highlight.background:n?this.options.color.hover.background:this.options.color.background,t.rect(this.left-.5*t.lineWidth,this.top-.5*t.lineWidth,this.width+t.lineWidth,this.height+t.lineWidth),t.fill(),this.performStroke(t,s),t.closePath()}this._drawImageAtPosition(t,s),this._drawImageLabel(t,e,i,o,n),this.updateBoundingBox(e,i)}},{key:"updateBoundingBox",value:function(t,e){this.resize(),this._updateBoundingBox(t,e),void 0!==this.options.label&&this.labelModule.size.width>0&&(this.boundingBox.left=Math.min(this.boundingBox.left,this.labelModule.size.left),this.boundingBox.right=Math.max(this.boundingBox.right,this.labelModule.size.left+this.labelModule.size.width),this.boundingBox.bottom=Math.max(this.boundingBox.bottom,this.boundingBox.bottom+this.labelOffset))}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)} 19298}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,
19298i,o,n,s){this._drawShape(t,"square",2,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"hexagon",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"star",4,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(23),m=o(f),v=function(t){function e(t,i,o){(0,a.default)(this,e);var n=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o));return n._setMargins(o),n}return(0,p.default)(e,t),(0,d.default)(e,[{key:"resize",value:function(t,e,i){this.needsRefresh(e,i)&&(this.textSize=this.labelModule.getTextSize(t,e,i),this.width=this.textSize.width+this.margin.right+this.margin.left,this.height=this.textSize.height+this.margin.top+this.margin.bottom,this.radius=.5*this.width)}},{key:"draw",value:function(t,e,i,o,n,s){this.resize(t,o,n),this.left=e-this.width/2,this.top=i-this.height/2,this.enableShadow(t,s),this.labelModule.draw(t,this.left+this.textSize.width/2+this.margin.left,this.top+this.textSize.height/2+this.margin.top,o,n),this.disableShadow(t,s),this.updateBoundingBox(e,i,t,o,n)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangle",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(24),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"draw",value:function(t,e,i,o,n,s){this._drawShape(t,"triangleDown",3,e,i,o,n,s)}},{key:"distanceToBorder",value:function(t,e){return this._distanceToBorder(t,e)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(11),l=i(12),u=i(74).default,c=function(){function t(e,i,o){var n=this;(0,s.default)(this,t),this.body=e,this.images=i,this.groups=o,this.body.functions.createEdge=this.create.bind(this),this.edgesListeners={add:function(t,e){n.add(e.items)},update:function(t,e){n.update(e.items)},remove:function(t,e){n.remove(e.items)}},this.options={},this.defaultOptions={arrows:{to:{enabled:!1,scaleFactor:1,type:"arrow"},middle:{enabled:!1,scaleFactor:1,type:"arrow"},from:{enabled:!1,scaleFactor:1,type:"arrow"}},arrowStrikethrough:!0,color:{color:"#848484",highlight:"#848484",hover:"#848484",inherit:"from",opacity:1},dashes:!1,font:{color:"#343434",size:14,face:"arial",background:"none",strokeWidth:2,strokeColor:"#ffffff",align:"horizontal",multi:!1,vadjust:0,bold:{mod:"bold"},boldital:{mod:"bold italic"},ital:{mod:"italic"},mono:{mod:"",size:15,face:"courier new",vadjust:2}},hidden:!1,hoverWidth:1.5,label:void 0,labelHighlightBold:!0,length:void 0,physics:!0,scaling:{min:1,max:15,label:{enabled:!0,min:14,max:30,maxVisible:30,drawThreshold:5}
19298,customScalingFunction:function(t,e,i,o){if(e===t)return.5;var n=1/(e-t);return Math.max(0,(o-t)*n)}},selectionWidth:1.5,selfReferenceSize:20,shadow:{enabled:!1,color:"rgba(0,0,0,0.5)",size:10,x:5,y:5},smooth:{enabled:!0,type:"dynamic",forceDirection:"none",roundness:.5},title:void 0,width:1,value:void 0},h.deepExtend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_forceDisableDynamicCurves",function(e){var i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];"dynamic"===e&&(e="continuous");var o=!1;for(var n in t.body.edges)if(t.body.edges.hasOwnProperty(n)){var s=t.body.edges[n],r=t.body.data.edges._data[n];if(void 0!==r){var a=r.smooth;void 0!==a&&!0===a.enabled&&"dynamic"===a.type&&(void 0===e?s.setOptions({smooth:!1}):s.setOptions({smooth:{type:e}}),o=!0)}}!0===i&&!0===o&&t.body.emitter.emit("_dataChanged")}),this.body.emitter.on("_dataUpdated",function(){t.reconnectEdges()}),this.body.emitter.on("refreshEdges",this.refresh.bind(this)),this.body.emitter.on("refresh",this.refresh.bind(this)),this.body.emitter.on("destroy",function(){h.forEach(t.edgesListeners,function(e,i){t.body.data.edges&&t.body.data.edges.off(i,e)}),delete t.body.functions.createEdge,delete t.edgesListeners.add,delete t.edgesListeners.update,delete t.edgesListeners.remove,delete t.edgesListeners})}},{key:"setOptions",value:function(t){if(void 0!==t){u.parseOptions(this.options,t,!0,this.defaultOptions,!0);var e=!1;if(void 0!==t.smooth)for(var i in this.body.edges)this.body.edges.hasOwnProperty(i)&&(e=this.body.edges[i].updateEdgeType()||e);if(void 0!==t.font)for(var o in this.body.edges)this.body.edges.hasOwnProperty(o)&&this.body.edges[o].updateLabelModule();void 0===t.hidden&&void 0===t.physics&&!0!==e||this.body.emitter.emit("_dataChanged")}}},{key:"setData",value:function(t){var e=this,i=arguments.length>1&&void 0!==arguments[1]&&arguments[1],o=this.body.data.edges;if(t instanceof d||t instanceof l)this.body.data.edges=t;else if(Array.isArray(t))this.body.data.edges=new d,this.body.data.edges.add(t);else{if(t)throw new TypeError("Array or DataSet expected");this.body.data.edges=new d}if(o&&h.forEach(this.edgesListeners,function(t,e){o.off(e,t)}),this.body.edges={},this.body.data.edges){h.forEach(this.edgesListeners,function(t,i){e.body.data.edges.on(i,t)});var n=this.body.data.edges.getIds();this.add(n,!0)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===i&&this.body.emitter.emit("_dataChanged")}},{key:"add",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.edges,o=this.body.data.edges,n=0;n<t.length;n++){var s=t[n],r=i[s];r&&r.disconnect();var a=o.get(s,{showInternalIds:!0});i[s]=this.create(a)}this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),!1===e&&this.body.emitter.emit("_dataChanged")}},{key:"update",value:function(t){for(var e=this.body.edges,i=this.body.data.edges,o=!1,n=0;n<t.length;n++){var s=t[n],r=i.get(s),a=e[s];void 0!==a?(a.disconnect(),o=a.setOptions(r)||o,a.connect()):(this.body.edges[s]=this.create(r),o=!0)}!0===o?(this.body.emitter.emit("_adjustEdgesForHierarchicalLayout"),this.body.emitter.emit("_dataChanged")):this.body.emitter.emit("_dataUpdated")}},{key:"remove",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(0!==t.length){var i=this.body.edges;h.forEach(t,function(t){var e=i[t];void 0!==e&&e.remove()}),e&&this.body.emitter.emit("_dataChanged")}}},{key:"refresh",value:function(){var t=this;h.forEach(this.body.edges,function(e,i){var o=t.body.data.edges._data[i];void 0!==o&&e.setOptions(o)})}},{key:"create",value:function(t){return new u(t,this.body,this.options,this.defaultOptions)}},{key:"reconnectEdges",value:function(){var t,e=this.body.nodes,i=this.body.edges;for(t in e)e.hasOwnProperty(t)&&(e[t].edges=[]);for(t in i)if(i.hasOwnProperty(t)){var o=i[t];o.from=null,o.to=null,o.connect()}}},{key:"getConnectedNodes",value:function(t){var e=[];if(void 0!==this.body.edges[t]){var i=this.body.edges[t];void 0!==i.fromId&&e.push(i.fromId),void 0!==i.toId&&e.push(i.toId)}return e}},{key:"_updateState",value:function(){this._addMissingEdges(),this._removeInvalidEdges()}},{key:"_removeInvalidEdges",value:function(){var t=this,e=[];h.forEach(this.body.edges,function(i,o){var n=t.body.nodes[i.toId],s=t.body.nodes[i.fromId];void 0!==n&&!0===n.isCluster||void 0!==s&&!0===s.isCluster||void 0!==n&&void 0!==s||e.push(o)}),this.remove(e,!1)}},{key:"_addMissingEdges",value:function(){var t=this.body.edges,e=this.body.data.edges,i=[];e.forEach(function(e,o){void 0===t[o]&&i.push(o)}),this.add(i,!0)}}]),t}();e.default=c}
19298,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(216),g=o(v),y=function(t){function e(t,i,o){return(0,d.default)(this,e),(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o))}return(0,m.default)(e,t),(0,u.default)(e,[{key:"_line",value:function(t,e,i){var o=i[0],n=i[1];this._bezierCurve(t,e,o,n)}},{key:"_getViaCoordinates",value:function(){var t=this.from.x-this.to.x,e=this.from.y-this.to.y,i=void 0,o=void 0,n=void 0,s=void 0,r=this.options.smooth.roundness;return(Math.abs(t)>Math.abs(e)||!0===this.options.smooth.forceDirection||"horizontal"===this.options.smooth.forceDirection)&&"vertical"!==this.options.smooth.forceDirection?(o=this.from.y,s=this.to.y,i=this.from.x-r*t,n=this.to.x+r*t):(o=this.from.y-r*e,s=this.to.y+r*e,i=this.from.x,n=this.to.x),[{x:i,y:o},{x:n,y:s}]}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,r){var a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates(),h=(0,s.default)(a,2),d=h[0],l=h[1];return this._getDistanceToBezierEdge(t,e,i,o,n,r,d,l)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=(0,s.default)(e,2),o=i[0],n=i[1],r=t,a=[];return a[0]=Math.pow(1-r,3),a[1]=3*r*Math.pow(1-r,2),a[2]=3*Math.pow(r,2)*(1-r),a[3]=Math.pow(r,3),{x:a[0]*this.fromPoint.x+a[1]*o.x+a[2]*n.x+a[3]*this.toPoint.x,y:a[0]*this.fromPoint.y+a[1]*o.y+a[2]*n.y+a[3]*this.toPoint.y}}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_getDistanceToBezierEdge",value:function(t,e,i,o,n,s,r,a){var h=1e9,d=void 0,l=void 0,u=void 0,c=void 0,p=void 0,f=t,m=e,v=[0,0,0,0];for(l=1;l<10;l++)u=.1*l,v[0]=Math.pow(1-u,3),v[1]=3*u*Math.pow(1-u,2),v[2]=3*Math.pow(u,2)*(1-u),v[3]=Math.pow(u,3),c=v[0]*t+v[1]*r.x+v[2]*a.x+v[3]*i,p=v[0]*e+v[1]*r.y+v[2]*a.y+v[3]*o,l>0&&(d=this._getDistanceToLine(f,m,c,p,n,s),h=d<h?d:h),f=c,m=p;return h}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(3),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(4),p=o(c),f=i(5),m=o(f),v=i(75),g=o(v),y=function(t){function e(t,i,o){(0,d.default)(this,e);var n=(0,p.default)(this,(e.__proto__||(0,a.default)(e)).call(this,t,i,o));return n._boundFunction=function(){n.positionBezierNode()},n.body.emitter.on("_repositionBezierNodes",n._boundFunction),n}return(0,m.default)(e,t),(0,u.default)(e,[{key:"setOptions",value:function(t){var e=!1;this.options.physics!==t.physics&&(e=!0),this.options=t,this.id=this.options.id,this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to],this.setupSupportNode(),this.connect(),!0===e&&(this.via.setOptions({physics:this.options.physics}),this.positionBezierNode())}},{key:"connect",value:function(){this.from=this.body.nodes[this.options.from],this.to=this.body.nodes[this.options.to],void 0===this.from||void 0===this.to||!1===this.options.physics?this.via.setOptions({physics:!1}):this.from.id===this.to.id?this.via.setOptions({physics:!1}):this.via.setOptions({physics:!0})}},{key:"cleanup",value:function(){return this.body.emitter.off("_repositionBezierNodes",this._boundFunction),void 0!==this.via&&(delete this.body.nodes[this.via.id],this.via=void 0,!0)}},{key:"setupSupportNode",value:function(){if(void 0===this.via){var t="edgeId:"+this.id,e=this.body.functions.createNode({id:t,shape:"circle",physics:!0,hidden:!0});this.body.nodes[t]=e,this.via=e,this.via.parentEdgeId=this.id,this.positionBezierNode()}}},{key:"positionBezierNode",value:function(){void 0!==this.via&&void 0!==this.from&&void 0!==this.to?(this.via.x=.5*(this.from.x+this.to.x),this.via.y=.5*(this.from.y+this.to.y)
19298):void 0!==this.via&&(this.via.x=0,this.via.y=0)}},{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this.via}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.via,i=t,o=void 0,n=void 0;if(this.from===this.to){var r=this._getCircleData(this.from),a=(0,s.default)(r,3),h=a[0],d=a[1],l=a[2],u=2*Math.PI*(1-i);o=h+l*Math.sin(u),n=d+l-l*(1-Math.cos(u))}else o=Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,n=Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y;return{x:o,y:n}}},{key:"_findBorderPosition",value:function(t,e){return this._findBorderPositionBezier(t,e,this.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToBezierEdge(t,e,i,o,n,s,this.via)}}]),e}(g.default);e.default=y},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(75),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e,i){this._bezierCurve(t,e,i)}},{key:"getViaNode",value:function(){return this._getViaCoordinates()}},{key:"_getViaCoordinates",value:function(){var t=void 0,e=void 0,i=this.options.smooth.roundness,o=this.options.smooth.type,n=Math.abs(this.from.x-this.to.x),s=Math.abs(this.from.y-this.to.y);if("discrete"===o||"diagonalCross"===o){var r=void 0,a=void 0;r=a=n<=s?i*s:i*n,this.from.x>this.to.x&&(r=-r),this.from.y>=this.to.y&&(a=-a),t=this.from.x+r,e=this.from.y+a,"discrete"===o&&(n<=s?t=n<i*s?this.from.x:t:e=s<i*n?this.from.y:e)}else if("straightCross"===o){var h=(1-i)*n,d=(1-i)*s;n<=s?(h=0,this.from.y<this.to.y&&(d=-d)):(this.from.x<this.to.x&&(h=-h),d=0),t=this.to.x+h,e=this.to.y+d}else if("horizontal"===o){var l=(1-i)*n;this.from.x<this.to.x&&(l=-l),t=this.to.x+l,e=this.from.y}else if("vertical"===o){var u=(1-i)*s;this.from.y<this.to.y&&(u=-u),t=this.from.x,e=this.to.y+u}else if("curvedCW"===o){n=this.to.x-this.from.x,s=this.from.y-this.to.y;var c=Math.sqrt(n*n+s*s),p=Math.PI,f=Math.atan2(s,n),m=(f+(.5*i+.5)*p)%(2*p);t=this.from.x+(.5*i+.5)*c*Math.sin(m),e=this.from.y+(.5*i+.5)*c*Math.cos(m)}else if("curvedCCW"===o){n=this.to.x-this.from.x,s=this.from.y-this.to.y;var v=Math.sqrt(n*n+s*s),g=Math.PI,y=Math.atan2(s,n),b=(y+(.5*-i+.5)*g)%(2*g);t=this.from.x+(.5*i+.5)*v*Math.sin(b),e=this.from.y+(.5*i+.5)*v*Math.cos(b)}else{var _=void 0,w=void 0;_=w=n<=s?i*s:i*n,this.from.x>this.to.x&&(_=-_),this.from.y>=this.to.y&&(w=-w),t=this.from.x+_,e=this.from.y+w,n<=s?t=this.from.x<=this.to.x?this.to.x<t?this.to.x:t:this.to.x>t?this.to.x:t:e=this.from.y>=this.to.y?this.to.y>e?this.to.y:e:this.to.y<e?this.to.y:e}return{x:t,y:e}}},{key:"_findBorderPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this._findBorderPositionBezier(t,e,i.via)}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){var r=arguments.length>6&&void 0!==arguments[6]?arguments[6]:this._getViaCoordinates();return this._getDistanceToBezierEdge(t,e,i,o,n,s,r)}},{key:"getPoint",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this._getViaCoordinates(),i=t;return{x:Math.pow(1-i,2)*this.fromPoint.x+2*i*(1-i)*e.x+Math.pow(i,2)*this.toPoint.x,y:Math.pow(1-i,2)*this.fromPoint.y+2*i*(1-i)*e.y+Math.pow(i,2)*this.toPoint.y}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(118),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_line",value:function(t,e){t.beginPath(),t.moveTo(this.fromPoint.x,this.fromPoint.y),t.lineTo(this.toPoint.x,this.toPoint.y),this.enableShadow(t,e),t.stroke(),this.disableShadow(t,e)}},{key:"getViaNode",value:function(){}},{key:"getPoint",value:function(t){return{x:(1-t)*this.fromPoint.x+t*this.toPoint.x,y:(1-t)*this.fromPoint.y+t*this.toPoint.y}}},{key:"_findBorderPosition",value:function(t,e){var i=this.to,o=this.from;
19298t.id===this.from.id&&(i=this.from,o=this.to);var n=Math.atan2(i.y-o.y,i.x-o.x),s=i.x-o.x,r=i.y-o.y,a=Math.sqrt(s*s+r*r),h=t.distanceToBorder(e,n),d=(a-h)/a,l={};return l.x=(1-d)*o.x+d*i.x,l.y=(1-d)*o.y+d*i.y,l}},{key:"_getDistanceToEdge",value:function(t,e,i,o,n,s){return this._getDistanceToLine(t,e,i,o,n,s)}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(120).default,u=i(221).default,c=i(222).default,p=i(223).default,f=i(224).default,m=i(121).default,v=i(225).default,g=i(226).default,y=i(2),b=i(119).default,_=function(){function t(e){(0,a.default)(this,t),this.body=e,this.physicsBody={physicsNodeIndices:[],physicsEdgeIndices:[],forces:{},velocities:{}},this.physicsEnabled=!0,this.simulationInterval=1e3/60,this.requiresTimeout=!0,this.previousStates={},this.referenceState={},this.freezeCache={},this.renderTimer=void 0,this.adaptiveTimestep=!1,this.adaptiveTimestepEnabled=!1,this.adaptiveCounter=0,this.adaptiveInterval=3,this.stabilized=!1,this.startedStabilization=!1,this.stabilizationIterations=0,this.ready=!1,this.options={},this.defaultOptions={enabled:!0,barnesHut:{theta:.5,gravitationalConstant:-2e3,centralGravity:.3,springLength:95,springConstant:.04,damping:.09,avoidOverlap:0},forceAtlas2Based:{theta:.5,gravitationalConstant:-50,centralGravity:.01,springConstant:.08,springLength:100,damping:.4,avoidOverlap:0},repulsion:{centralGravity:.2,springLength:200,springConstant:.05,nodeDistance:100,damping:.09,avoidOverlap:0},hierarchicalRepulsion:{centralGravity:0,springLength:100,springConstant:.01,nodeDistance:120,damping:.09},maxVelocity:50,minVelocity:.75,solver:"barnesHut",stabilization:{enabled:!0,iterations:1e3,updateInterval:50,onlyDynamicEdges:!1,fit:!0},timestep:.5,adaptiveTimestep:!0},y.extend(this.options,this.defaultOptions),this.timestep=.5,this.layoutFailed=!1,this.bindEventListeners()}return(0,d.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("initPhysics",function(){t.initPhysics()}),this.body.emitter.on("_layoutFailed",function(){t.layoutFailed=!0}),this.body.emitter.on("resetPhysics",function(){t.stopSimulation(),t.ready=!1}),this.body.emitter.on("disablePhysics",function(){t.physicsEnabled=!1,t.stopSimulation()}),this.body.emitter.on("restorePhysics",function(){t.setOptions(t.options),!0===t.ready&&t.startSimulation()}),this.body.emitter.on("startSimulation",function(){!0===t.ready&&t.startSimulation()}),this.body.emitter.on("stopSimulation",function(){t.stopSimulation()}),this.body.emitter.on("destroy",function(){t.stopSimulation(!1),t.body.emitter.off()}),this.body.emitter.on("_dataChanged",function(){t.updatePhysicsData()})}},{key:"setOptions",value:function(t){void 0!==t&&(!1===t?(this.options.enabled=!1,this.physicsEnabled=!1,this.stopSimulation()):!0===t?(this.options.enabled=!0,this.physicsEnabled=!0,this.startSimulation()):(this.physicsEnabled=!0,y.selectiveNotDeepExtend(["stabilization"],this.options,t),y.mergeOptions(this.options,t,"stabilization"),void 0===t.enabled&&(this.options.enabled=!0),!1===this.options.enabled&&(this.physicsEnabled=!1,this.stopSimulation()),this.timestep=this.options.timestep)),this.init()}},{key:"init",value:function(){var t;"forceAtlas2Based"===this.options.solver?(t=this.options.forceAtlas2Based,this.nodesSolver=new v(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new g(this.body,this.physicsBody,t)):"repulsion"===this.options.solver?(t=this.options.repulsion,this.nodesSolver=new u(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):"hierarchicalRepulsion"===this.options.solver?(t=this.options.hierarchicalRepulsion,this.nodesSolver=new c(this.body,this.physicsBody,t),this.edgesSolver=new f(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)):(t=this.options.barnesHut,this.nodesSolver=new l(this.body,this.physicsBody,t),this.edgesSolver=new p(this.body,this.physicsBody,t),this.gravitySolver=new m(this.body,this.physicsBody,t)),this.modelOptions=t}},{key:"initPhysics",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?!0===this.options.stabilization.enabled?this.stabilize():(this.stabilized=!1,this.ready=!0,this.body.emitter.emit("fit",{},this.layoutFailed),this.startSimulation()):(this.ready=!0,this.body.emitter.emit("fit"))}},{key:"startSimulation",value:function(){!0===this.physicsEnabled&&!0===this.options.enabled?(this.stabilized=!1,this.adaptiveTimestep=!1,this.body.emitter.emit("_resizeNodes"),void 0===this.viewFunction&&(this.viewFunction=this.simulationStep.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))):this.body.emitter.emit("_redraw")}},{key:"stopSimulation",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0];this.stabilized=!0,!0===t&&this._emitStabilized(),void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.viewFunction=void 0,!0===t&&this.body.emitter.emit("_stopRendering"))}},{key:"simulationStep",value:function(){var t=Date.now();this.physicsTick(),(Date.now()-t<.4*this.simulationInterval||!0===this.runDoubleSpeed)&&!1===this.stabilized&&(this.physicsTick(),this.runDoubleSpeed=!0),!0===this.stabilized&&this.stopSimulation()}},{key:"_emitStabilized",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.stabilizationIterations;(this.stabilizationIterations>1||!0===this.startedStabilization)&&setTimeout(function(){t.body.emitter.emit("stabilized",{iterations:e}),t.startedStabilization=!1,t.stabilizationIterations=0},0)}},{key:"physicsStep",value:function(){this.gravitySolver.solve(),this.nodesSolver.solve(),this.edgesSolver.solve(),this.moveNodes()}}
19298,{key:"adjustTimeStep",value:function(){!0===this._evaluateStepQuality()?this.timestep=1.2*this.timestep:this.timestep/1.2<this.options.timestep?this.timestep=this.options.timestep:(this.adaptiveCounter=-1,this.timestep=Math.max(this.options.timestep,this.timestep/1.2))}},{key:"physicsTick",value:function(){if(this._startStabilizing(),!0!==this.stabilized){if(!0===this.adaptiveTimestep&&!0===this.adaptiveTimestepEnabled){this.adaptiveCounter%this.adaptiveInterval==0?(this.timestep=2*this.timestep,this.physicsStep(),this.revert(),this.timestep=.5*this.timestep,this.physicsStep(),this.physicsStep(),this.adjustTimeStep()):this.physicsStep(),this.adaptiveCounter+=1}else this.timestep=this.options.timestep,this.physicsStep();!0===this.stabilized&&this.revert(),this.stabilizationIterations++}}},{key:"updatePhysicsData",value:function(){this.physicsBody.forces={},this.physicsBody.physicsNodeIndices=[],this.physicsBody.physicsEdgeIndices=[];var t=this.body.nodes,e=this.body.edges;for(var i in t)t.hasOwnProperty(i)&&!0===t[i].options.physics&&this.physicsBody.physicsNodeIndices.push(t[i].id);for(var o in e)e.hasOwnProperty(o)&&!0===e[o].options.physics&&this.physicsBody.physicsEdgeIndices.push(e[o].id);for(var n=0;n<this.physicsBody.physicsNodeIndices.length;n++){var s=this.physicsBody.physicsNodeIndices[n];this.physicsBody.forces[s]={x:0,y:0},void 0===this.physicsBody.velocities[s]&&(this.physicsBody.velocities[s]={x:0,y:0})}for(var r in this.physicsBody.velocities)void 0===t[r]&&delete this.physicsBody.velocities[r]}},{key:"revert",value:function(){var t=(0,s.default)(this.previousStates),e=this.body.nodes,i=this.physicsBody.velocities;this.referenceState={};for(var o=0;o<t.length;o++){var n=t[o];void 0!==e[n]?!0===e[n].options.physics&&(this.referenceState[n]={positions:{x:e[n].x,y:e[n].y}},i[n].x=this.previousStates[n].vx,i[n].y=this.previousStates[n].vy,e[n].x=this.previousStates[n].x,e[n].y=this.previousStates[n].y):delete this.previousStates[n]}}},{key:"_evaluateStepQuality",value:function(){var t=void 0,e=void 0,i=this.body.nodes,o=this.referenceState;for(var n in this.referenceState)if(this.referenceState.hasOwnProperty(n)&&void 0!==i[n]&&(t=i[n].x-o[n].positions.x,e=i[n].y-o[n].positions.y,Math.sqrt(Math.pow(t,2)+Math.pow(e,2))>.3))return!1;return!0}},{key:"moveNodes",value:function(){for(var t=this.physicsBody.physicsNodeIndices,e=0,i=0,o=0;o<t.length;o++){var n=t[o],s=this._performStep(n);e=Math.max(e,s),i+=s}this.adaptiveTimestepEnabled=i/t.length<5,this.stabilized=e<this.options.minVelocity}},{key:"calculateComponentVelocity",value:function(t,e,i){t+=(e-this.modelOptions.damping*t)/i*this.timestep;var o=this.options.maxVelocity||1e9;return Math.abs(t)>o&&(t=t>0?o:-o),t}},{key:"_performStep",value:function(t){var e=this.body.nodes[t],i=this.physicsBody.forces[t],o=this.physicsBody.velocities[t];return this.previousStates[t]={x:e.x,y:e.y,vx:o.x,vy:o.y},!1===e.options.fixed.x?(o.x=this.calculateComponentVelocity(o.x,i.x,e.options.mass),e.x+=o.x*this.timestep):(i.x=0,o.x=0),!1===e.options.fixed.y?(o.y=this.calculateComponentVelocity(o.y,i.y,e.options.mass),e.y+=o.y*this.timestep):(i.y=0,o.y=0),Math.sqrt(Math.pow(o.x,2)+Math.pow(o.y,2))}},{key:"_freezeNodes",value:function(){var t=this.body.nodes;for(var e in t)if(t.hasOwnProperty(e)&&t[e].x&&t[e].y){var i=t[e].options.fixed;this.freezeCache[e]={x:i.x,y:i.y},i.x=!0,i.y=!0}}},{key:"_restoreFrozenNodes",value:function(){var t=this.body.nodes;for(var e in t)t.hasOwnProperty(e)&&void 0!==this.freezeCache[e]&&(t[e].options.fixed.x=this.freezeCache[e].x,t[e].options.fixed.y=this.freezeCache[e].y);this.freezeCache={}}},{key:"stabilize",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.stabilization.iterations;if("number"!=typeof e&&(e=this.options.stabilization.iterations,console.log("The stabilize method needs a numeric amount of iterations. Switching to default: ",e)),0===this.physicsBody.physicsNodeIndices.length)return void(this.ready=!0);this.adaptiveTimestep=this.options.adaptiveTimestep,this.body.emitter.emit("_resizeNodes"),this.stopSimulation(),this.stabilized=!1,this.body.emitter.emit("_blockRedraw"),this.targetIterations=e,!0===this.options.stabilization.onlyDynamicEdges&&this._freezeNodes(),this.stabilizationIterations=0,setTimeout(function(){return t._stabilizationBatch()},0)}},{key:"_startStabilizing",value:function(){return!0!==this.startedStabilization&&(this.body.emitter.emit("startStabilizing"),this.startedStabilization=!0,!0)}},{key:"_stabilizationBatch",value:function(){var t=this,e=function(){return!1===t.stabilized&&t.stabilizationIterations<t.targetIterations},i=function(){t.body.emitter.emit("stabilizationProgress",{iterations:t.stabilizationIterations,total:t.targetIterations})};this._startStabilizing()&&i();for(var o=0;e()&&o<this.options.stabilization.updateInterval;)this.physicsTick(),o++;i(),e()?setTimeout(this._stabilizationBatch.bind(this),0):this._finalizeStabilization()}},{key:"_finalizeStabilization",value:function(){this.body.emitter.emit("_allowRedraw"),!0===this.options.stabilization.fit&&this.body.emitter.emit("fit"),!0===this.options.stabilization.onlyDynamicEdges&&this._restoreFrozenNodes(),this.body.emitter.emit("stabilizationIterationsDone"),this.body.emitter.emit("_requestRedraw"),!0===this.stabilized?this._emitStabilized():this.startSimulation(),this.ready=!0}},{key:"_drawForces",value:function(t){for(var e=0;e<this.physicsBody.physicsNodeIndices.length;e++){var i=this.physicsBody.physicsNodeIndices[e],o=this.body.nodes[i],n=this.physicsBody.forces[i],s=Math.sqrt(Math.pow(n.x,2)+Math.pow(n.x,2)),r=Math.min(Math.max(5,s),15),a=3*r,h=y.HSVToHex((180-180*Math.min(1,Math.max(0,.03*s)))/360,1,1),d={x:o.x+20*n.x,y:o.y+20*n.y};t.lineWidth=r,t.strokeStyle=h,t.beginPath(),t.moveTo(o.x,o.y),t.lineTo(d.x,d.y),t.stroke();var l=Math.atan2(n.y,n.x);t.fillStyle=h,b.draw(t,{type:"arrow",point:d,angle:l,length:a}),t.fill()}}}]),t}();e.default=_}
19298,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t,e,i,o,n,s,r,a,h=this.body.nodes,d=this.physicsBody.physicsNodeIndices,l=this.physicsBody.forces,u=this.options.nodeDistance,c=-2/3/u,p=0;p<d.length-1;p++){r=h[d[p]];for(var f=p+1;f<d.length;f++)a=h[d[f]],t=a.x-r.x,e=a.y-r.y,i=Math.sqrt(t*t+e*e),0===i&&(i=.1*Math.random(),t=i),i<2*u&&(s=i<.5*u?1:c*i+4/3,s/=i,o=t*s,n=e*s,l[r.id].x-=o,l[r.id].y-=n,l[a.id].x+=o,l[a.id].y+=n)}}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){var t,e,i,o,n,s,r,a,h,d,l=this.body.nodes,u=this.physicsBody.physicsNodeIndices,c=this.physicsBody.forces,p=this.options.nodeDistance;for(h=0;h<u.length-1;h++)for(r=l[u[h]],d=h+1;d<u.length;d++)if(a=l[u[d]],r.level===a.level){t=a.x-r.x,e=a.y-r.y,i=Math.sqrt(t*t+e*e) 19299 ;s=i<p?-Math.pow(.05*i,2)+Math.pow(.05*p,2):0,0===i?i=.01:s/=i,o=t*s,n=e*s,c[r.id].x-=o,c[r.id].y-=n,c[a.id].x+=o,c[a.id].y+=n}}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t=void 0,e=void 0,i=this.physicsBody.physicsEdgeIndices,o=this.body.edges,n=void 0,s=void 0,r=void 0,a=0;a<i.length;a++)e=o[i[a]],!0===e.connected&&e.toId!==e.fromId&&void 0!==this.body.nodes[e.toId]&&void 0!==this.body.nodes[e.fromId]&&(void 0!==e.edgeType.via?(t=void 0===e.options.length?this.options.springLength:e.options.length,n=e.to,s=e.edgeType.via,r=e.from,this._calculateSpringForce(n,s,.5*t),this._calculateSpringForce(s,r,.5*t)):(t=void 0===e.options.length?1.5*this.options.springLength:e.options.length,this._calculateSpringForce(e.from,e.to,t)))}},{key:"_calculateSpringForce",value:function(t,e,i){var o=t.x-e.x,n=t.y-e.y,s=Math.max(Math.sqrt(o*o+n*n),.01),r=this.options.springConstant*(i-s)/s,a=o*r,h=n*r;void 0!==this.physicsBody.forces[t.id]&&(this.physicsBody.forces[t.id].x+=a,this.physicsBody.forces[t.id].y+=h),void 0!==this.physicsBody.forces[e.id]&&(this.physicsBody.forces[e.id].x-=a,this.physicsBody.forces[e.id].y-=h)}}]),t}();e.default=h},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.physicsBody=i,this.setOptions(o)}return(0,a.default)(t,[{key:"setOptions",value:function(t){this.options=t}},{key:"solve",value:function(){for(var t,e,i,o,n,s,r,a,h=this.body.edges,d=this.physicsBody.physicsEdgeIndices,l=this.physicsBody.physicsNodeIndices,u=this.physicsBody.forces,c=0;c<l.length;c++){var p=l[c];u[p].springFx=0,u[p].springFy=0}for(var f=0;f<d.length;f++)e=h[d[f]],!0===e.connected&&(t=void 0===e.options.length?this.options.springLength:e.options.length,i=e.from.x-e.to.x,o=e.from.y-e.to.y,a=Math.sqrt(i*i+o*o),a=0===a?.01:a,r=this.options.springConstant*(t-a)/a,n=i*r,s=o*r,e.to.level!=e.from.level?(void 0!==u[e.toId]&&(u[e.toId].springFx-=n,u[e.toId].springFy-=s),void 0!==u[e.fromId]&&(u[e.fromId].springFx+=n,u[e.fromId].springFy+=s)):(void 0!==u[e.toId]&&(u[e.toId].x-=.5*n,u[e.toId].y-=.5*s),void 0!==u[e.fromId]&&(u[e.fromId].x+=.5*n,u[e.fromId].y+=.5*s)));r=1;for(var m,v,g=0;g<l.length;g++){var y=l[g];m=Math.min(r,Math.max(-r,u[y].springFx)),v=Math.min(r,Math.max(-r,u[y].springFy)),u[y].x+=m,u[y].y+=v}for(var b=0,_=0,w=0;w<l.length;w++){var x=l[w];b+=u[x].x,_+=u[x].y}for(var k=b/l.length,S=_/l.length,D=0;D<l.length;D++){var M=l[D];u[M].x-=k,u[M].y-=S}}}]),t}();e.default=h}
19299,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(120),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_calculateForces",value:function(t,e,i,o,n){0===t&&(t=.1*Math.random(),e=t),this.overlapAvoidanceFactor<1&&o.shape.radius&&(t=Math.max(.1+this.overlapAvoidanceFactor*o.shape.radius,t-o.shape.radius));var s=o.edges.length+1,r=this.options.gravitationalConstant*n.mass*o.options.mass*s/Math.pow(t,2),a=e*r,h=i*r;this.physicsBody.forces[o.id].x+=a,this.physicsBody.forces[o.id].y+=h}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(121),m=o(f),v=function(t){function e(t,i,o){return(0,a.default)(this,e),(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o))}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_calculateForces",value:function(t,e,i,o,n){if(t>0){var s=n.edges.length+1,r=this.options.centralGravity*s*n.options.mass;o[n.id].x=e*r,o[n.id].y=i*r}}}]),e}(m.default);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(6),a=o(r),h=i(0),d=o(h),l=i(1),u=o(l),c=i(2),p=i(76).default,f=i(228).default,m=i(74).default,v=i(47).default,g=function(){function t(e){var i=this;(0,d.default)(this,t),this.body=e,this.clusteredNodes={},this.clusteredEdges={},this.options={},this.defaultOptions={},c.extend(this.options,this.defaultOptions),this.body.emitter.on("_resetData",function(){i.clusteredNodes={},i.clusteredEdges={}})}return(0,u.default)(t,[{key:"clusterByHubsize",value:function(t,e){void 0===t?t=this._getHubSize():"object"===(void 0===t?"undefined":(0,a.default)(t))&&(e=this._checkOptions(t),t=this._getHubSize());for(var i=[],o=0;o<this.body.nodeIndices.length;o++){var n=this.body.nodes[this.body.nodeIndices[o]];n.edges.length>=t&&i.push(n.id)}for(var s=0;s<i.length;s++)this.clusterByConnection(i[s],e,!0);this.body.emitter.emit("_dataChanged")}},{key:"cluster",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(void 0===e.joinCondition)throw new Error("Cannot call clusterByNodeData without a joinCondition function in the options.");e=this._checkOptions(e);var o={},n={};c.forEach(this.body.nodes,function(i,s){var r=p.cloneOptions(i);!0===e.joinCondition(r)&&(o[s]=i,c.forEach(i.edges,function(e){void 0===t.clusteredEdges[e.id]&&(n[e.id]=e)}))}),this._cluster(o,n,e,i)}},{key:"clusterByEdgeCount",value:function(t,e){var i=this,o=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];e=this._checkOptions(e);for(var n=[],r={},a=void 0,h=void 0,d=void 0,l=0;l<this.body.nodeIndices.length;l++){var u,c,f;!function(o){var l={},m={},v=i.body.nodeIndices[o],g=i.body.nodes[v];if(void 0===r[v]){d=0,h=[];for(var y=0;y<g.edges.length;y++)a=g.edges[y],void 0===i.clusteredEdges[a.id]&&(a.toId!==a.fromId&&d++,h.push(a));if(d===t){u=function(t){if(void 0===e.joinCondition||null===e.joinCondition)return!0;var i=p.cloneOptions(t);return e.joinCondition(i)};for(var b=!0,_=0;_<h.length;_++){a=h[_];var w=i._getConnectedId(a,v);if(!u(g)){b=!1;break}m[a.id]=a,l[v]=g,l[w]=i.body.nodes[w],r[v]=!0}if((0,s.default)(l).length>0&&(0,s.default)(m).length>0&&!0===b)if(c=function(){for(var t=0;t<n.length;++t)for(var e in l)if(void 0!==n[t].nodes[e])return n[t]},void 0!==(f=c())){for(var x in l)void 0===f.nodes[x]&&(f.nodes[x]=l[x]);for(var k in m)void 0===f.edges[k]&&(f.edges[k]=m[k])}else n.push({nodes:l,edges:m})}}}(l)}for(var l=0;l<n.length;l++)this._cluster(n[l].nodes,n[l].edges,e,!1);!0===o&&this.body.emitter.emit("_dataChanged")}},{key:"clusterOutliers",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(1,t,e)}},{key:"clusterBridges",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];this.clusterByEdgeCount(2,t,e)}},{key:"clusterByConnection",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No nodeId supplied to clusterByConnection!");if(void 0===this.body.nodes[t])throw new Error("The nodeId given to clusterByConnection does not exist!");var o=this.body.nodes[t];e=this._checkOptions(e,o),void 0===e.clusterNodeProperties.x&&(e.clusterNodeProperties.x=o.x),void 0===e.clusterNodeProperties.y&&(e.clusterNodeProperties.y=o.y),void 0===e.clusterNodeProperties.fixed&&(e.clusterNodeProperties.fixed={},e.clusterNodeProperties.fixed.x=o.options.fixed.x,e.clusterNodeProperties.fixed.y=o.options.fixed.y);var n={},r={},a=o.id,h=p.cloneOptions(o);n[a]=o;for(var d=0;d<o.edges.length;d++){var l=o.edges[d];if(void 0===this.clusteredEdges[l.id]){var u=this._getConnectedId(l,a);if(void 0===this.clusteredNodes[u])if(u!==a)if(void 0===e.joinCondition)r[l.id]=l,n[u]=this.body.nodes[u];else{var c=p.cloneOptions(this.body.nodes[u]);!0===e.joinCondition(h,c)&&(r[l.id]=l,n[u]=this.body.nodes[u])}else r[l.id]=l}}var f=(0,s.default)(n).map(function(t){return n[t].id});for(m in n)if(n.hasOwnProperty(m))for(var m=n[m],v=0;v<m.edges.length;v++){var g=m.edges[v];f.indexOf(this._getConnectedId(g,m.id))>-1&&(r[g.id]=g)}this._cluster(n,r,e,i)}}
19299,{key:"_createClusterEdges",value:function(t,e,i,o){for(var n=void 0,r=void 0,a=void 0,h=void 0,d=void 0,l=void 0,u=(0,s.default)(t),c=[],p=0;p<u.length;p++){r=u[p],a=t[r];for(var f=0;f<a.edges.length;f++)n=a.edges[f],void 0===this.clusteredEdges[n.id]&&(n.toId==n.fromId?e[n.id]=n:n.toId==r?(h=i.id,d=n.fromId,l=d):(h=n.toId,d=i.id,l=h),void 0===t[l]&&c.push({edge:n,fromId:d,toId:h}))}for(var m=[],v=0;v<c.length;v++){var g=c[v],y=g.edge,b=function(t){for(var e=0;e<m.length;e++){var i=m[e],o=t.fromId===i.fromId&&t.toId===i.toId,n=t.fromId===i.toId&&t.toId===i.fromId;if(o||n)return i}return null}(g);null===b?(b=this._createClusteredEdge(g.fromId,g.toId,y,o),m.push(b)):b.clusteringEdgeReplacingIds.push(y.id),this.body.edges[y.id].edgeReplacedById=b.id,this._backupEdgeOptions(y),y.setOptions({physics:!1})}}},{key:"_checkOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return void 0===t.clusterEdgeProperties&&(t.clusterEdgeProperties={}),void 0===t.clusterNodeProperties&&(t.clusterNodeProperties={}),t}},{key:"_cluster",value:function(t,e,i){var o=!(arguments.length>3&&void 0!==arguments[3])||arguments[3];if(0!=(0,s.default)(t).length&&(1!=(0,s.default)(t).length||1==i.clusterNodeProperties.allowSingleNodeCluster)){for(var n in t)if(t.hasOwnProperty(n)&&void 0!==this.clusteredNodes[n])return;var r=c.deepExtend({},i.clusterNodeProperties);if(void 0!==i.processProperties){var a=[];for(var h in t)if(t.hasOwnProperty(h)){var d=p.cloneOptions(t[h]);a.push(d)}var l=[];for(var u in e)if(e.hasOwnProperty(u)&&"clusterEdge:"!==u.substr(0,12)){var m=p.cloneOptions(e[u],"edge");l.push(m)}if(!(r=i.processProperties(r,a,l)))throw new Error("The processProperties function does not return properties!")}void 0===r.id&&(r.id="cluster:"+c.randomUUID());var v=r.id;void 0===r.label&&(r.label="cluster");var g=void 0;void 0===r.x&&(g=this._getClusterPosition(t),r.x=g.x),void 0===r.y&&(void 0===g&&(g=this._getClusterPosition(t)),r.y=g.y),r.id=v;var y=this.body.functions.createNode(r,f);y.containedNodes=t,y.containedEdges=e,y.clusterEdgeProperties=i.clusterEdgeProperties,this.body.nodes[r.id]=y,this._clusterEdges(t,e,r,i.clusterEdgeProperties),r.id=void 0,!0===o&&this.body.emitter.emit("_dataChanged")}}},{key:"_backupEdgeOptions",value:function(t){void 0===this.clusteredEdges[t.id]&&(this.clusteredEdges[t.id]={physics:t.options.physics})}},{key:"_restoreEdge",value:function(t){var e=this.clusteredEdges[t.id];void 0!==e&&(t.setOptions({physics:e.physics}),delete this.clusteredEdges[t.id])}},{key:"isCluster",value:function(t){return void 0!==this.body.nodes[t]?!0===this.body.nodes[t].isCluster:(console.log("Node does not exist."),!1)}},{key:"_getClusterPosition",value:function(t){for(var e=(0,s.default)(t),i=t[e[0]].x,o=t[e[0]].x,n=t[e[0]].y,r=t[e[0]].y,a=void 0,h=1;h<e.length;h++)a=t[e[h]],i=a.x<i?a.x:i,o=a.x>o?a.x:o,n=a.y<n?a.y:n,r=a.y>r?a.y:r;return{x:.5*(i+o),y:.5*(n+r)}}},{key:"openCluster",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0===t)throw new Error("No clusterNodeId supplied to openCluster.");var o=this.body.nodes[t];if(void 0===o)throw new Error("The clusterNodeId supplied to openCluster does not exist.");if(!0!==o.isCluster||void 0===o.containedNodes||void 0===o.containedEdges)throw new Error("The node:"+t+" is not a valid cluster.");var n=this.findNode(t),s=n.indexOf(t)-1;if(s>=0){var r=n[s];return this.body.nodes[r]._openChildCluster(t),delete this.body.nodes[t],void(!0===i&&this.body.emitter.emit("_dataChanged"))}var a=o.containedNodes,h=o.containedEdges;if(void 0!==e&&void 0!==e.releaseFunction&&"function"==typeof e.releaseFunction){var d={},l={x:o.x,y:o.y};for(var u in a)if(a.hasOwnProperty(u)){var p=this.body.nodes[u];d[u]={x:p.x,y:p.y}}var f=e.releaseFunction(l,d);for(var m in a)if(a.hasOwnProperty(m)){var v=this.body.nodes[m];void 0!==f[m]&&(v.x=void 0===f[m].x?o.x:f[m].x,v.y=void 0===f[m].y?o.y:f[m].y)}}else c.forEach(a,function(t){!1===t.options.fixed.x&&(t.x=o.x),!1===t.options.fixed.y&&(t.y=o.y)});for(var g in a)if(a.hasOwnProperty(g)){var y=this.body.nodes[g];y.vx=o.vx,y.vy=o.vy,y.setOptions({physics:!0}),delete this.clusteredNodes[g]}for(var b=[],_=0;_<o.edges.length;_++)b.push(o.edges[_]);for(var w=0;w<b.length;w++){for(var x=b[w],k=this._getConnectedId(x,t),S=this.clusteredNodes[k],D=0;D<x.clusteringEdgeReplacingIds.length;D++){var M=x.clusteringEdgeReplacingIds[D],C=this.body.edges[M];if(void 0!==C)if(void 0!==S){var O=this.body.nodes[S.clusterId];O.containedEdges[C.id]=C,delete h[C.id];var E=C.fromId,T=C.toId;C.toId==k?T=S.clusterId:E=S.clusterId,this._createClusteredEdge(E,T,C,O.clusterEdgeProperties,{hidden:!1,physics:!0})}else this._restoreEdge(C)}x.remove()}for(var P in h)h.hasOwnProperty(P)&&this._restoreEdge(h[P]);delete this.body.nodes[t],!0===i&&this.body.emitter.emit("_dataChanged")}},{key:"getNodesInCluster",value:function(t){var e=[];
19299if(!0===this.isCluster(t)){var i=this.body.nodes[t].containedNodes;for(var o in i)i.hasOwnProperty(o)&&e.push(this.body.nodes[o].id)}return e}},{key:"findNode",value:function(t){for(var e=[],i=0,o=void 0;void 0!==this.clusteredNodes[t]&&i<100;){if(void 0===(o=this.body.nodes[t]))return[];e.push(o.id),t=this.clusteredNodes[t].clusterId,i++}return void 0===(o=this.body.nodes[t])?[]:(e.push(o.id),e.reverse(),e)}},{key:"updateClusteredNode",value:function(t,e){if(void 0===t)throw new Error("No clusteredNodeId supplied to updateClusteredNode.");if(void 0===e)throw new Error("No newOptions supplied to updateClusteredNode.");if(void 0===this.body.nodes[t])throw new Error("The clusteredNodeId supplied to updateClusteredNode does not exist.");this.body.nodes[t].setOptions(e),this.body.emitter.emit("_dataChanged")}},{key:"updateEdge",value:function(t,e){if(void 0===t)throw new Error("No startEdgeId supplied to updateEdge.");if(void 0===e)throw new Error("No newOptions supplied to updateEdge.");if(void 0===this.body.edges[t])throw new Error("The startEdgeId supplied to updateEdge does not exist.");for(var i=this.getClusteredEdges(t),o=0;o<i.length;o++){this.body.edges[i[o]].setOptions(e)}this.body.emitter.emit("_dataChanged")}},{key:"getClusteredEdges",value:function(t){for(var e=[],i=0;void 0!==t&&void 0!==this.body.edges[t]&&i<100;)e.push(this.body.edges[t].id),t=this.body.edges[t].edgeReplacedById,i++;return e.reverse(),e}},{key:"getBaseEdge",value:function(t){return this.getBaseEdges(t)[0]}},{key:"getBaseEdges",value:function(t){for(var e=[t],i=[],o=[],n=0;e.length>0&&n<100;){var s=e.pop();if(void 0!==s){var r=this.body.edges[s];if(void 0!==r){n++;var a=r.clusteringEdgeReplacingIds;if(void 0===a)o.push(s);else for(var h=0;h<a.length;++h){var d=a[h];-1===e.indexOf(a)&&-1===i.indexOf(a)&&e.push(d)}i.push(s)}}}return o}},{key:"_getConnectedId",value:function(t,e){return t.toId!=e?t.toId:(t.fromId,t.fromId)}},{key:"_getHubSize",value:function(){for(var t=0,e=0,i=0,o=0,n=0;n<this.body.nodeIndices.length;n++){var s=this.body.nodes[this.body.nodeIndices[n]];s.edges.length>o&&(o=s.edges.length),t+=s.edges.length,e+=Math.pow(s.edges.length,2),i+=1}t/=i,e/=i;var r=e-Math.pow(t,2),a=Math.sqrt(r),h=Math.floor(t+2*a);return h>o&&(h=o),h}},{key:"_createClusteredEdge",value:function(t,e,i,o,n){var s=p.cloneOptions(i,"edge");c.deepExtend(s,o),s.from=t,s.to=e,s.id="clusterEdge:"+c.randomUUID(),void 0!==n&&c.deepExtend(s,n);var r=this.body.functions.createEdge(s);return r.clusteringEdgeReplacingIds=[i.id],r.connect(),this.body.edges[r.id]=r,r}},{key:"_clusterEdges",value:function(t,e,i,o){if(e instanceof m){var n=e,s={};s[n.id]=n,e=s}if(t instanceof v){var r=t,a={};a[r.id]=r,t=a}if(void 0===i||null===i)throw new Error("_clusterEdges: parameter clusterNode required");void 0===o&&(o=i.clusterEdgeProperties),this._createClusterEdges(t,e,i,o);for(var h in e)if(e.hasOwnProperty(h)&&void 0!==this.body.edges[h]){var d=this.body.edges[h];this._backupEdgeOptions(d),d.setOptions({physics:!1})}for(var l in t)t.hasOwnProperty(l)&&(this.clusteredNodes[l]={clusterId:i.id,node:this.body.nodes[l]},this.body.nodes[l].setOptions({physics:!1}))}},{key:"_getClusterNodeForNode",value:function(t){if(void 0!==t){var e=this.clusteredNodes[t];if(void 0!==e){var i=e.clusterId;if(void 0!==i)return this.body.nodes[i]}}}},{key:"_filter",value:function(t,e){var i=[];return c.forEach(t,function(t){e(t)&&i.push(t)}),i}},{key:"_updateState",value:function(){var t=this,e=void 0,i=[],o=[],n=function(e){c.forEach(t.body.nodes,function(t){!0===t.isCluster&&e(t)})};for(e in this.clusteredNodes)if(this.clusteredNodes.hasOwnProperty(e)){var r=this.body.nodes[e];void 0===r&&i.push(e)}n(function(t){for(var e=0;e<i.length;e++)delete t.containedNodes[i[e]]});for(var a=0;a<i.length;a++)delete this.clusteredNodes[i[a]];c.forEach(this.clusteredEdges,function(e){var i=t.body.edges[e];void 0!==i&&i.endPointsValid()||o.push(e)}),n(function(t){c.forEach(t.containedEdges,function(t,e){t.endPointsValid()||-1!==o.indexOf(e)||o.push(e)})}),c.forEach(this.body.edges,function(e,i){var n=!0,s=e.clusteringEdgeReplacingIds;if(void 0!==s){var r=0;
19299c.forEach(s,function(e){var i=t.body.edges[e];void 0!==i&&i.endPointsValid()&&(r+=1)}),n=r>0}e.endPointsValid()&&n||o.push(i)}),n(function(e){c.forEach(o,function(i){delete e.containedEdges[i],c.forEach(e.edges,function(n,s){if(n.id===i)return void(e.edges[s]=null);n.clusteringEdgeReplacingIds=t._filter(n.clusteringEdgeReplacingIds,function(t){return-1===o.indexOf(t)})}),e.edges=t._filter(e.edges,function(t){return null!==t})})}),c.forEach(o,function(e){delete t.clusteredEdges[e]}),c.forEach(o,function(e){delete t.body.edges[e]});var h=(0,s.default)(this.body.edges);c.forEach(h,function(e){var i=t.body.edges[e],o=t._isClusteredNode(i.fromId)||t._isClusteredNode(i.toId);if(o!==t._isClusteredEdge(i.id)){if(!o)throw new Error("remove edge from clustering not implemented!");var n=t._getClusterNodeForNode(i.fromId);void 0!==n&&t._clusterEdges(t.body.nodes[i.fromId],i,n);var s=t._getClusterNodeForNode(i.toId);void 0!==s&&t._clusterEdges(t.body.nodes[i.toId],i,s)}});for(var d=!1,l=!0;l;)!function(){var e=[];n(function(t){var i=(0,s.default)(t.containedNodes).length,o=!0===t.options.allowSingleNodeCluster;(o&&i<1||!o&&i<2)&&e.push(t.id)});for(var i=0;i<e.length;++i)t.openCluster(e[i],{},!1);l=e.length>0,d=d||l}();d&&this._updateState()}},{key:"_isClusteredNode",value:function(t){return void 0!==this.clusteredNodes[t]}},{key:"_isClusteredEdge",value:function(t){return void 0!==this.clusteredEdges[t]}}]),t}();e.default=g},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(3),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(4),u=o(l),c=i(5),p=o(c),f=i(2),m=i(47).default,v=function(t){function e(t,i,o,n,r,h){(0,a.default)(this,e);var d=(0,u.default)(this,(e.__proto__||(0,s.default)(e)).call(this,t,i,o,n,r,h));return d.isCluster=!0,d.containedNodes={},d.containedEdges={},d}return(0,p.default)(e,t),(0,d.default)(e,[{key:"_openChildCluster",value:function(t){var e=this,i=this.body.nodes[t];
19299if(void 0===this.containedNodes[t])throw new Error("node with id: "+t+" not in current cluster");if(!i.isCluster)throw new Error("node with id: "+t+" is not a cluster");delete this.containedNodes[t],f.forEach(i.edges,function(t){delete e.containedEdges[t.id]}),f.forEach(i.containedNodes,function(t,i){e.containedNodes[i]=t}),i.containedNodes={},f.forEach(i.containedEdges,function(t,i){e.containedEdges[i]=t}),i.containedEdges={},f.forEach(i.edges,function(t){f.forEach(e.edges,function(i){var o=i.clusteringEdgeReplacingIds.indexOf(t.id);-1!==o&&(f.forEach(t.clusteringEdgeReplacingIds,function(t){i.clusteringEdgeReplacingIds.push(t),e.body.edges[t].edgeReplacedById=i.id}),i.clusteringEdgeReplacingIds.splice(o,1))})}),i.edges=[]}}]),e}(m);e.default=v},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}function n(){var t;void 0!==window&&(t=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame),window.requestAnimationFrame=void 0===t?function(t){t()}:t}Object.defineProperty(e,"__esModule",{value:!0});var s=i(0),r=o(s),a=i(1),h=o(a),d=i(2),l=function(){function t(e,i){(0,r.default)(this,t),n(),this.body=e,this.canvas=i,this.redrawRequested=!1,this.renderTimer=void 0,this.requiresTimeout=!0,this.renderingActive=!1,this.renderRequests=0,this.allowRedraw=!0,this.dragging=!1,this.options={},this.defaultOptions={hideEdgesOnDrag:!1,hideNodesOnDrag:!1},d.extend(this.options,this.defaultOptions),this._determineBrowserMethod(),this.bindEventListeners()}return(0,h.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("dragStart",function(){t.dragging=!0}),this.body.emitter.on("dragEnd",function(){t.dragging=!1}),this.body.emitter.on("_resizeNodes",function(){t._resizeNodes()}),this.body.emitter.on("_redraw",function(){!1===t.renderingActive&&t._redraw()}),this.body.emitter.on("_blockRedraw",function(){t.allowRedraw=!1}),this.body.emitter.on("_allowRedraw",function(){t.allowRedraw=!0,t.redrawRequested=!1}),this.body.emitter.on("_requestRedraw",this._requestRedraw.bind(this)),this.body.emitter.on("_startRendering",function(){t.renderRequests+=1,t.renderingActive=!0,t._startRendering()}),this.body.emitter.on("_stopRendering",function(){t.renderRequests-=1,t.renderingActive=t.renderRequests>0,t.renderTimer=void 0}),this.body.emitter.on("destroy",function(){t.renderRequests=0,t.allowRedraw=!1,t.renderingActive=!1,!0===t.requiresTimeout?clearTimeout(t.renderTimer):window.cancelAnimationFrame(t.renderTimer),t.body.emitter.off()})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag"];d.selectiveDeepExtend(e,this.options,t)}}},{key:"_requestNextFrame",value:function(t,e){if("undefined"!=typeof window){var i=void 0,o=window;return!0===this.requiresTimeout?i=o.setTimeout(t,e):o.requestAnimationFrame&&(i=o.requestAnimationFrame(t)),i}}},{key:"_startRendering",value:function(){!0===this.renderingActive&&void 0===this.renderTimer&&(this.renderTimer=this._requestNextFrame(this._renderStep.bind(this),this.simulationInterval))}},{key:"_renderStep",value:function(){!0===this.renderingActive&&(this.renderTimer=void 0,!0===this.requiresTimeout&&this._startRendering(),this._redraw(),!1===this.requiresTimeout&&this._startRendering())}},{key:"redraw",value:function(){this.body.emitter.emit("setSize"),this._redraw()}},{key:"_requestRedraw",value:function(){var t=this;!0!==this.redrawRequested&&!1===this.renderingActive&&!0===this.allowRedraw&&(this.redrawRequested=!0,this._requestNextFrame(function(){t._redraw(!1)},0))}},{key:"_redraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!0===this.allowRedraw){this.body.emitter.emit("initRedraw"),this.redrawRequested=!1,0!==this.canvas.frame.canvas.width&&0!==this.canvas.frame.canvas.height||this.canvas.setSize(),this.canvas.setTransform();var e=this.canvas.getContext(),i=this.canvas.frame.canvas.clientWidth,o=this.canvas.frame.canvas.clientHeight;if(e.clearRect(0,0,i,o),0===this.canvas.frame.clientWidth)return;e.save(),e.translate(this.body.view.translation.x,this.body.view.translation.y),e.scale(this.body.view.scale,this.body.view.scale),e.beginPath(),this.body.emitter.emit("beforeDrawing",e),e.closePath(),!1===t&&(!1===this.dragging||!0===this.dragging&&!1===this.options.hideEdgesOnDrag)&&this._drawEdges(e),(!1===this.dragging||!0===this.dragging&&!1===this.options.hideNodesOnDrag)&&this._drawNodes(e,t),e.beginPath(),this.body.emitter.emit("afterDrawing",e),e.closePath(),e.restore(
19299),!0===t&&e.clearRect(0,0,i,o)}}},{key:"_resizeNodes",value:function(){this.canvas.setTransform();var t=this.canvas.getContext();t.save(),t.translate(this.body.view.translation.x,this.body.view.translation.y),t.scale(this.body.view.scale,this.body.view.scale);var e=this.body.nodes,i=void 0;for(var o in e)e.hasOwnProperty(o)&&(i=e[o],i.resize(t),i.updateBoundingBox(t,i.selected));t.restore()}},{key:"_drawNodes",value:function(t){for(var e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.body.nodes,o=this.body.nodeIndices,n=void 0,s=[],r=this.canvas.DOMtoCanvas({x:-20,y:-20}),a=this.canvas.DOMtoCanvas({x:this.canvas.frame.canvas.clientWidth+20,y:this.canvas.frame.canvas.clientHeight+20}),h={top:r.y,left:r.x,bottom:a.y,right:a.x},d=0;d<o.length;d++)n=i[o[d]],n.isSelected()?s.push(o[d]):!0===e?n.draw(t):!0===n.isBoundingBoxOverlappingWith(h)?n.draw(t):n.updateBoundingBox(t,n.selected);for(var l=0;l<s.length;l++)n=i[s[l]],n.draw(t)}},{key:"_drawEdges",value:function(t){for(var e=this.body.edges,i=this.body.edgeIndices,o=void 0,n=0;n<i.length;n++)o=e[i[n]],!0===o.connected&&o.draw(t)}},{key:"_determineBrowserMethod",value:function(){if("undefined"!=typeof window){var t=navigator.userAgent.toLowerCase();this.requiresTimeout=!1,-1!=t.indexOf("msie 9.0")?this.requiresTimeout=!0:-1!=t.indexOf("safari")&&t.indexOf("chrome")<=-1&&(this.requiresTimeout=!0)}else this.requiresTimeout=!0}}]),t}();e.default=l},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(2),u=function(){function t(e){(0,s.default)(this,t),this.body=e,this.pixelRatio=1,this.resizeTimer=void 0,this.resizeFunction=this._onResize.bind(this),this.cameraState={},this.initialized=!1,this.canvasViewCenter={},this.options={},this.defaultOptions={autoResize:!0,height:"100%",width:"100%"},l.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.once("resize",function(e){0!==e.width&&(t.body.view.translation.x=.5*e.width),0!==e.height&&(t.body.view.translation.y=.5*e.height)}),this.body.emitter.on("setSize",this.setSize.bind(this)),this.body.emitter.on("destroy",function(){t.hammerFrame.destroy(),t.hammer.destroy(),t._cleanUp()})}},{key:"setOptions",value:function(t){var e=this;if(void 0!==t){var i=["width","height","autoResize"];l.selectiveDeepExtend(i,this.options,t)}!0===this.options.autoResize&&(this._cleanUp(),this.resizeTimer=setInterval(function(){!0===e.setSize()&&e.body.emitter.emit("_requestRedraw")},1e3),this.resizeFunction=this._onResize.bind(this),l.addEventListener(window,"resize",this.resizeFunction))}},{key:"_cleanUp",value:function(){void 0!==this.resizeTimer&&clearInterval(this.resizeTimer),l.removeEventListener(window,"resize",this.resizeFunction),this.resizeFunction=void 0}},{key:"_onResize",value:function(){this.setSize(),this.body.emitter.emit("_redraw")}},{key:"_getCameraState",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.pixelRatio;!0===this.initialized&&(this.cameraState.previousWidth=this.frame.canvas.width/t,this.cameraState.previousHeight=this.frame.canvas.height/t,this.cameraState.scale=this.body.view.scale,this.cameraState.position=this.DOMtoCanvas({x:.5*this.frame.canvas.width/t,y:.5*this.frame.canvas.height/t}))}},{key:"_setCameraState",value:function(){if(void 0!==this.cameraState.scale&&0!==this.frame.canvas.clientWidth&&0!==this.frame.canvas.clientHeight&&0!==this.pixelRatio&&this.cameraState.previousWidth>0){var t=this.frame.canvas.width/this.pixelRatio/this.cameraState.previousWidth,e=this.frame.canvas.height/this.pixelRatio/this.cameraState.previousHeight,i=this.cameraState.scale;1!=t&&1!=e?i=.5*this.cameraState.scale*(t+e):1!=t?i=this.cameraState.scale*t:1!=e&&(i=this.cameraState.scale*e),this.body.view.scale=i;var o=this.DOMtoCanvas({x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight}),n={x:o.x-this.cameraState.position.x,y:o.y-this.cameraState.position.y};this.body.view.translation.x+=n.x*this.body.view.scale,this.body.view.translation.y+=n.y*this.body.view.scale}}},{key:"_prepareValue",value:function(t){if("number"==typeof t)return t+"px";if("string"==typeof t){if(-1!==t.indexOf("%")||-1!==t.indexOf("px"))return t;if(-1===t.indexOf("%"))return t+"px"}throw new Error("Could not use the value supplied for width or height:"+t)}},{key:"_create",value:function(){for(;this.body.container.hasChildNodes();)this.body.container.removeChild(this.body.container.firstChild);if(this.frame=document.createElement("div"),this.frame.className="vis-network",this.frame.style.position="relative",this.frame.style.overflow="hidden",this.frame.tabIndex=900,this.frame.canvas=document.createElement("canvas"),this.frame.canvas.style.position="relative",this.frame.appendChild(this.frame.canvas),this.frame.canvas.getContext)this._setPixelRatio(),this.setTransform();else{var t=document.createElement("DIV");t.style.color="red",t.style.fontWeight="bold",t.style.padding="10px",t.innerHTML="Error: your browser does not support HTML canvas",this.frame.canvas.appendChild(t)}this.body.container.appendChild(this.frame),this.body.view.scale=1,this.body.view.translation={x:.5*this.frame.canvas.clientWidth,y:.5*this.frame.canvas.clientHeight},this._bindHammer()}},{key:"_bindHammer",value:function(){var t=this;void 0!==this.hammer&&this.hammer.destroy(),this.drag={},this.pinch={},this.hammer=new h(this.frame.canvas),this.hammer.get("pinch").set({enable:!0}),this.hammer.get("pan").set({threshold:5,direction:h.DIRECTION_ALL}),d.onTouch(this.hammer,function(e){t.body.eventListeners.onTouch(e)}),this.hammer.on("tap",function(e){t.body.eventListeners.onTap(e)}),this.hammer.on("doubletap",function(e){t.body.eventListeners.onDoubleTap(e)}),this.hammer.on("press",function(e){t.body.eventListeners.onHold(e)}),this.hammer.on("panstart",function(e){t.body.eventListeners.onDragStart(e)}),this.hammer.on("panmove",function(e){t.body.eventListeners.onDrag(e)}),this.hammer.on("panend",function(e){t.body.eventListeners.onDragEnd(e)}),this.hammer.on("pinch",function(e){t.body.eventListeners.onPinch(e)}),this.frame.canvas.addEventListener("mousewheel",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("DOMMouseScroll",function(e){t.body.eventListeners.onMouseWheel(e)}),this.frame.canvas.addEventListener("mousemove",function(e){t.body.eventListeners.onMouseMove(e)}),this.frame.canvas.addEventListener("contextmenu",function(e){t.body.eventListeners.onContext(e)}
19299),this.hammerFrame=new h(this.frame),d.onRelease(this.hammerFrame,function(e){t.body.eventListeners.onRelease(e)})}},{key:"setSize",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.options.width,e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.height;t=this._prepareValue(t),e=this._prepareValue(e);var i=!1,o=this.frame.canvas.width,n=this.frame.canvas.height,s=this.pixelRatio;if(this._setPixelRatio(),t!=this.options.width||e!=this.options.height||this.frame.style.width!=t||this.frame.style.height!=e)this._getCameraState(s),this.frame.style.width=t,this.frame.style.height=e,this.frame.canvas.style.width="100%",this.frame.canvas.style.height="100%",this.frame.canvas.width=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),this.frame.canvas.height=Math.round(this.frame.canvas.clientHeight*this.pixelRatio),this.options.width=t,this.options.height=e,this.canvasViewCenter={x:.5*this.frame.clientWidth,y:.5*this.frame.clientHeight},i=!0;else{var r=Math.round(this.frame.canvas.clientWidth*this.pixelRatio),a=Math.round(this.frame.canvas.clientHeight*this.pixelRatio);this.frame.canvas.width===r&&this.frame.canvas.height===a||this._getCameraState(s), 19300 this.frame.canvas.width!==r&&(this.frame.canvas.width=r,i=!0),this.frame.canvas.height!==a&&(this.frame.canvas.height=a,i=!0)}return!0===i&&(this.body.emitter.emit("resize",{width:Math.round(this.frame.canvas.width/this.pixelRatio),height:Math.round(this.frame.canvas.height/this.pixelRatio),oldWidth:Math.round(o/this.pixelRatio),oldHeight:Math.round(n/this.pixelRatio)}),this._setCameraState()),this.initialized=!0,i}},{key:"getContext",value:function(){return this.frame.canvas.getContext("2d")}},{key:"_determinePixelRatio",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");var e=1;return"undefined"!=typeof window&&(e=window.devicePixelRatio||1),e/(t.webkitBackingStorePixelRatio||t.mozBackingStorePixelRatio||t.msBackingStorePixelRatio||t.oBackingStorePixelRatio||t.backingStorePixelRatio||1)}},{key:"_setPixelRatio",value:function(){this.pixelRatio=this._determinePixelRatio()}},{key:"setTransform",value:function(){var t=this.getContext();if(void 0===t)throw new Error("Could not get canvax context");t.setTransform(this.pixelRatio,0,0,this.pixelRatio,0,0)}},{key:"_XconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.x)/this.body.view.scale}},{key:"_XconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.x}},{key:"_YconvertDOMtoCanvas",value:function(t){return(t-this.body.view.translation.y)/this.body.view.scale}},{key:"_YconvertCanvasToDOM",value:function(t){return t*this.body.view.scale+this.body.view.translation.y}},{key:"canvasToDOM",value:function(t){return{x:this._XconvertCanvasToDOM(t.x),y:this._YconvertCanvasToDOM(t.y)}}},{key:"DOMtoCanvas",value:function(t){return{x:this._XconvertDOMtoCanvas(t.x),y:this._YconvertDOMtoCanvas(t.y)}}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(76).default,l=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.animationSpeed=1/this.renderRefreshRate,this.animationEasingFunction="easeInOutQuint",this.easingTime=0,this.sourceScale=0,this.targetScale=0,this.sourceTranslation=0,this.targetTranslation=0,this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0,this.touchTime=0,this.viewFunction=void 0,this.body.emitter.on("fit",this.fit.bind(this)),this.body.emitter.on("animationFinished",function(){o.body.emitter.emit("_stopRendering")}),this.body.emitter.on("unlockNode",this.releaseNode.bind(this))}return(0,a.default)(t,[{key:"setOptions",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.options=t}},{key:"fit",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{nodes:[]},e=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=void 0,o=void 0;if(void 0!==t.nodes&&0!==t.nodes.length||(t.nodes=this.body.nodeIndices),!0===e){var n=0;for(var s in this.body.nodes)if(this.body.nodes.hasOwnProperty(s)){var r=this.body.nodes[s];!0===r.predefinedPosition&&(n+=1)}if(n>.5*this.body.nodeIndices.length)return void this.fit(t,!1);i=d.getRange(this.body.nodes,t.nodes);o=12.662/(this.body.nodeIndices.length+7.4147)+.0964822;o*=Math.min(this.canvas.frame.canvas.clientWidth/600,this.canvas.frame.canvas.clientHeight/600)}else{this.body.emitter.emit("_resizeNodes"),i=d.getRange(this.body.nodes,t.nodes);var a=1.1*Math.abs(i.maxX-i.minX),h=1.1*Math.abs(i.maxY-i.minY),l=this.canvas.frame.canvas.clientWidth/a,u=this.canvas.frame.canvas.clientHeight/h;o=l<=u?l:u}o>1?o=1:0===o&&(o=1);var c=d.findCenter(i),p={position:c,scale:o,animation:t.animation};this.moveTo(p)}},{key:"focus",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(void 0!==this.body.nodes[t]){var i={x:this.body.nodes[t].x,y:this.body.nodes[t].y};e.position=i,e.lockedOnNode=t,this.moveTo(e)}else console.log("Node: "+t+" cannot be found.")}},{key:"moveTo",value:function(t){if(void 0===t)return void(t={});void 0===t.offset&&(t.offset={x:0,y:0}),void 0===t.offset.x&&(t.offset.x=0),void 0===t.offset.y&&(t.offset.y=0),void 0===t.scale&&(t.scale=this.body.view.scale),void 0===t.position&&(t.position=this.getViewPosition()),void 0===t.animation&&(t.animation={duration:0}),!1===t.animation&&(t.animation={duration:0}),!0===t.animation&&(t.animation={}),void 0===t.animation.duration&&(t.animation.duration=1e3),void 0===t.animation.easingFunction&&(t.animation.easingFunction="easeInOutQuad"),this.animateView(t)}},{key:"animateView",value:function(t){if(void 0!==t){this.animationEasingFunction=t.animation.easingFunction,this.releaseNode(),!0===t.locked&&(this.lockedOnNodeId=t.lockedOnNode,this.lockedOnNodeOffset=t.offset),0!=this.easingTime&&this._transitionRedraw(!0),this.sourceScale=this.body.view.scale,this.sourceTranslation=this.body.view.translation,this.targetScale=t.scale,this.body.view.scale=this.targetScale;var e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.position.x,y:e.y-t.position.y};this.targetTranslation={x:this.sourceTranslation.x+i.x*this.targetScale+t.offset.x,y:this.sourceTranslation.y+i.y*this.targetScale+t.offset.y},0===t.animation.duration?void 0!=this.lockedOnNodeId?(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)):(this.body.view.scale=this.targetScale,this.body.view.translation=this.targetTranslation,this.body.emitter.emit("_requestRedraw")):(this.animationSpeed=1/(60*t.animation.duration*.001)||1/60,this.animationEasingFunction=t.animation.easingFunction,this.viewFunction=this._transitionRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction),this.body.emitter.emit("_startRendering"))}}},{key:"_lockedRedraw",value:function(){var t={x:this.body.nodes[this.lockedOnNodeId].x,y:this.body.nodes[this.lockedOnNodeId].y},e=this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight}),i={x:e.x-t.x,y:e.y-t.y},o=this.body.view.translation,n={x:o.x+i.x*this.body.view.scale+this.lockedOnNodeOffset.x,y:o.y+i.y*this.body.view.scale+this.lockedOnNodeOffset.y};this.body.view.translation=n}},{key:"releaseNode",value:function(){void 0!==this.lockedOnNodeId&&void 0!==this.viewFunction&&(this.body.emitter.off("initRedraw",this.viewFunction),this.lockedOnNodeId=void 0,this.lockedOnNodeOffset=void 0)}},{key:"_transitionRedraw",value:function(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];this.easingTime+=this.animationSpeed,this.easingTime=!0===t?1:this.easingTime;var e=h.easingFunctions[this.animationEasingFunction](this.easingTime);this.body.view.scale=this.sourceScale+(this.targetScale-this.sourceScale)*e,this.body.view.translation={x:this.sourceTranslation.x+(this.targetTranslation.x-this.sourceTranslation.x)*e,y:this.sourceTranslation.y+(this.targetTranslation.y-this.sourceTranslation.y)*e},this.easingTime>=1&&(this.body.emitter.off("initRedraw",this.viewFunction),this.easingTime=0,void 0!=this.lockedOnNodeId&&(this.viewFunction=this._lockedRedraw.bind(this),this.body.emitter.on("initRedraw",this.viewFunction)),this.body.emitter.emit("animationFinished"))}},{key:"getScale",value:function(){return this.body.view.scale}},{key:"getViewPosition",value:function(){return this.canvas.DOMtoCanvas({x:.5*this.canvas.frame.canvas.clientWidth,y:.5*this.canvas.frame.canvas.clientHeight})}}]),t}();e.default=l}
19300,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(2),d=i(233).default,l=i(104).default,u=function(){function t(e,i,o){(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.navigationHandler=new d(e,i),this.body.eventListeners.onTap=this.onTap.bind(this),this.body.eventListeners.onTouch=this.onTouch.bind(this),this.body.eventListeners.onDoubleTap=this.onDoubleTap.bind(this),this.body.eventListeners.onHold=this.onHold.bind(this),this.body.eventListeners.onDragStart=this.onDragStart.bind(this),this.body.eventListeners.onDrag=this.onDrag.bind(this),this.body.eventListeners.onDragEnd=this.onDragEnd.bind(this),this.body.eventListeners.onMouseWheel=this.onMouseWheel.bind(this),this.body.eventListeners.onPinch=this.onPinch.bind(this),this.body.eventListeners.onMouseMove=this.onMouseMove.bind(this),this.body.eventListeners.onRelease=this.onRelease.bind(this),this.body.eventListeners.onContext=this.onContext.bind(this),this.touchTime=0,this.drag={},this.pinch={},this.popup=void 0,this.popupObj=void 0,this.popupTimer=void 0,this.body.functions.getPointer=this.getPointer.bind(this),this.options={},this.defaultOptions={dragNodes:!0,dragView:!0,hover:!1,keyboard:{enabled:!1,speed:{x:10,y:10,zoom:.02},bindToWindow:!0},navigationButtons:!1,tooltipDelay:300,zoomView:!0},h.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,a.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("destroy",function(){clearTimeout(t.popupTimer),delete t.body.functions.getPointer})}},{key:"setOptions",value:function(t){if(void 0!==t){var e=["hideEdgesOnDrag","hideNodesOnDrag","keyboard","multiselect","selectable","selectConnectedEdges"];h.selectiveNotDeepExtend(e,this.options,t),h.mergeOptions(this.options,t,"keyboard"),t.tooltip&&(h.extend(this.options.tooltip,t.tooltip),t.tooltip.color&&(this.options.tooltip.color=h.parseColor(t.tooltip.color)))}this.navigationHandler.setOptions(this.options)}},{key:"getPointer",value:function(t){return{x:t.x-h.getAbsoluteLeft(this.canvas.frame.canvas),y:t.y-h.getAbsoluteTop(this.canvas.frame.canvas)}}},{key:"onTouch",value:function(t){(new Date).valueOf()-this.touchTime>50&&(this.drag.pointer=this.getPointer(t.center),this.drag.pinched=!1,this.pinch.scale=this.body.view.scale,this.touchTime=(new Date).valueOf())}},{key:"onTap",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect&&(t.changedPointers[0].ctrlKey||t.changedPointers[0].metaKey);this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e)}},{key:"onDoubleTap",value:function(t){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("doubleClick",t,e)}},{key:"onHold",value:function(t){var e=this.getPointer(t.center),i=this.selectionHandler.options.multiselect;this.checkSelectionChanges(e,t,i),this.selectionHandler._generateClickEvent("click",t,e),this.selectionHandler._generateClickEvent("hold",t,e)}},{key:"onRelease",value:function(t){if((new Date).valueOf()-this.touchTime>10){var e=this.getPointer(t.center);this.selectionHandler._generateClickEvent("release",t,e),this.touchTime=(new Date).valueOf()}}},{key:"onContext",value:function(t){var e=this.getPointer({x:t.clientX,y:t.clientY});this.selectionHandler._generateClickEvent("oncontext",t,e)}},{key:"checkSelectionChanges",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.selectionHandler.getSelection(),n=!1;n=!0===i?this.selectionHandler.selectAdditionalOnPoint(t):this.selectionHandler.selectOnPoint(t);var s=this.selectionHandler.getSelection(),r=this._determineDifference(o,s),a=this._determineDifference(s,o);r.edges.length>0&&(this.selectionHandler._generateClickEvent("deselectEdge",e,t,o),n=!0),r.nodes.length>0&&(this.selectionHandler._generateClickEvent("deselectNode",e,t,o),n=!0),a.nodes.length>0&&(this.selectionHandler._generateClickEvent("selectNode",e,t),n=!0),a.edges.length>0&&(this.selectionHandler._generateClickEvent("selectEdge",e,t),n=!0),!0===n&&this.selectionHandler._generateClickEvent("select",e,t)}},{key:"_determineDifference",value:function(t,e){var i=function(t,e){for(var i=[],o=0;o<t.length;o++){var n=t[o];-1===e.indexOf(n)&&i.push(n)}return i};return{nodes:i(t.nodes,e.nodes),edges:i(t.edges,e.edges)}}},{key:"onDragStart",value:function(t){void 0===this.drag.pointer&&this.onTouch(t);var e=this.selectionHandler.getNodeAt(this.drag.pointer);if(this.drag.dragging=!0,this.drag.selection=[],this.drag.translation=h.extend({},this.body.view.translation),this.drag.nodeId=void 0,void 0!==e&&!0===this.options.dragNodes){this.drag.nodeId=e.id,!1===e.isSelected()&&(this.selectionHandler.unselectAll(),this.selectionHandler.selectObject(e)),this.selectionHandler._generateClickEvent("dragStart",t,this.drag.pointer);var i=this.selectionHandler.selectionObj.nodes;for(var o in i)if(i.hasOwnProperty(o)){var n=i[o],s={id:n.id,node:n,x:n.x,y:n.y,xFixed:n.options.fixed.x,yFixed:n.options.fixed.y};n.options.fixed.x=!0,n.options.fixed.y=!0,this.drag.selection.push(s)}}else this.selectionHandler._generateClickEvent("dragStart",t,this.drag.pointer,void 0,!0)}},{key:"onDrag",value:function(t){var e=this;if(!0!==this.drag.pinched){this.body.emitter.emit("unlockNode");var i=this.getPointer(t.center),o=this.drag.selection;if(o&&o.length&&!0===this.options.dragNodes){this.selectionHandler._generateClickEvent("dragging",t,i);var n=i.x-this.drag.pointer.x,s=i.y-this.drag.pointer.y;o.forEach(function(t){var i=t.node;!1===t.xFixed&&(i.x=e.canvas._XconvertDOMtoCanvas(e.canvas._XconvertCanvasToDOM(t.x)+n)),!1===t.yFixed&&(i.y=e.canvas._YconvertDOMtoCanvas(e.canvas._YconvertCanvasToDOM(t.y)+s))}),this.body.emitter.emit("startSimulation")}else if(!0===this.options.dragView){if(this.selectionHandler._generateClickEvent("dragging",t,i,void 0,!0),void 0===this.drag.pointer)return void this.onDragStart(t);var r=i.x-this.drag.pointer.x,a=i.y-this.drag.pointer.y;this.body.view.translation={x:this.drag.translation.x+r,y:this.drag.translation.y+a},this.body.emitter.emit("_requestRedraw")}}}},{key:"onDragEnd",value:function(t){this.drag.dragging=!1;var e=this.drag.selection;
19300e&&e.length?(e.forEach(function(t){t.node.options.fixed.x=t.xFixed,t.node.options.fixed.y=t.yFixed}),this.selectionHandler._generateClickEvent("dragEnd",t,this.getPointer(t.center)),this.body.emitter.emit("startSimulation")):(this.selectionHandler._generateClickEvent("dragEnd",t,this.getPointer(t.center),void 0,!0),this.body.emitter.emit("_requestRedraw"))}},{key:"onPinch",value:function(t){var e=this.getPointer(t.center);this.drag.pinched=!0,void 0===this.pinch.scale&&(this.pinch.scale=1);var i=this.pinch.scale*t.scale;this.zoom(i,e)}},{key:"zoom",value:function(t,e){if(!0===this.options.zoomView){var i=this.body.view.scale;t<1e-5&&(t=1e-5),t>10&&(t=10);var o=void 0;void 0!==this.drag&&!0===this.drag.dragging&&(o=this.canvas.DOMtoCanvas(this.drag.pointer));var n=this.body.view.translation,s=t/i,r=(1-s)*e.x+n.x*s,a=(1-s)*e.y+n.y*s;if(this.body.view.scale=t,this.body.view.translation={x:r,y:a},void 0!=o){var h=this.canvas.canvasToDOM(o);this.drag.pointer.x=h.x,this.drag.pointer.y=h.y}this.body.emitter.emit("_requestRedraw"),i<t?this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:e}):this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:e})}}},{key:"onMouseWheel",value:function(t){if(!0===this.options.zoomView){var e=0;if(t.wheelDelta?e=t.wheelDelta/120:t.detail&&(e=-t.detail/3),0!==e){var i=this.body.view.scale,o=e/10;e<0&&(o/=1-o),i*=1+o;var n=this.getPointer({x:t.clientX,y:t.clientY});this.zoom(i,n)}t.preventDefault()}}},{key:"onMouseMove",value:function(t){var e=this,i=this.getPointer({x:t.clientX,y:t.clientY}),o=!1;void 0!==this.popup&&(!1===this.popup.hidden&&this._checkHidePopup(i),!1===this.popup.hidden&&(o=!0,this.popup.setPosition(i.x+3,i.y-5),this.popup.show())),!1===this.options.keyboard.bindToWindow&&!0===this.options.keyboard.enabled&&this.canvas.frame.focus(),!1===o&&(void 0!==this.popupTimer&&(clearInterval(this.popupTimer),this.popupTimer=void 0),this.drag.dragging||(this.popupTimer=setTimeout(function(){return e._checkShowPopup(i)},this.options.tooltipDelay))),!0===this.options.hover&&this.selectionHandler.hoverObject(t,i)}},{key:"_checkShowPopup",value:function(t){var e=this.canvas._XconvertDOMtoCanvas(t.x),i=this.canvas._YconvertDOMtoCanvas(t.y),o={left:e,top:i,right:e,bottom:i},n=void 0===this.popupObj?void 0:this.popupObj.id,s=!1,r="node";if(void 0===this.popupObj){for(var a=this.body.nodeIndices,h=this.body.nodes,d=void 0,u=[],c=0;c<a.length;c++)d=h[a[c]],!0===d.isOverlappingWith(o)&&void 0!==d.getTitle()&&u.push(a[c]);u.length>0&&(this.popupObj=h[u[u.length-1]],s=!0)}if(void 0===this.popupObj&&!1===s){for(var p=this.body.edgeIndices,f=this.body.edges,m=void 0,v=[],g=0;g<p.length;g++)m=f[p[g]],!0===m.isOverlappingWith(o)&&!0===m.connected&&void 0!==m.getTitle()&&v.push(p[g]);v.length>0&&(this.popupObj=f[v[v.length-1]],r="edge")}void 0!==this.popupObj?this.popupObj.id!==n&&(void 0===this.popup&&(this.popup=new l(this.canvas.frame)),this.popup.popupTargetType=r,this.popup.popupTargetId=this.popupObj.id,this.popup.setPosition(t.x+3,t.y-5),this.popup.setText(this.popupObj.getTitle()),this.popup.show(),this.body.emitter.emit("showPopup",this.popupObj.id)):void 0!==this.popup&&(this.popup.hide(),this.body.emitter.emit("hidePopup"))}},{key:"_checkHidePopup",value:function(t){var e=this.selectionHandler._pointerToPositionObject(t),i=!1;if("node"===this.popup.popupTargetType){if(void 0!==this.body.nodes[this.popup.popupTargetId]&&!0===(i=this.body.nodes[this.popup.popupTargetId].isOverlappingWith(e))){var o=this.selectionHandler.getNodeAt(t);i=void 0!==o&&o.id===this.popup.popupTargetId}}else void 0===this.selectionHandler.getNodeAt(t)&&void 0!==this.body.edges[this.popup.popupTargetId]&&(i=this.body.edges[this.popup.popupTargetId].isOverlappingWith(e));!1===i&&(this.popupObj=void 0,this.popup.hide(),this.body.emitter.emit("hidePopup"))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(10),d=i(37),l=i(35),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.iconsCreated=!1,this.navigationHammer
19300s=[],this.boundFunctions={},this.touchTime=0,this.activated=!1,this.body.emitter.on("activate",function(){o.activated=!0,o.configureKeyboardBindings()}),this.body.emitter.on("deactivate",function(){o.activated=!1,o.configureKeyboardBindings()}),this.body.emitter.on("destroy",function(){void 0!==o.keycharm&&o.keycharm.destroy()}),this.options={}}return(0,a.default)(t,[{key:"setOptions",value:function(t){void 0!==t&&(this.options=t,this.create())}},{key:"create",value:function(){!0===this.options.navigationButtons?!1===this.iconsCreated&&this.loadNavigationElements():!0===this.iconsCreated&&this.cleanNavigation(),this.configureKeyboardBindings()}},{key:"cleanNavigation",value:function(){if(0!=this.navigationHammers.length){for(var t=0;t<this.navigationHammers.length;t++)this.navigationHammers[t].destroy();this.navigationHammers=[]}this.navigationDOM&&this.navigationDOM.wrapper&&this.navigationDOM.wrapper.parentNode&&this.navigationDOM.wrapper.parentNode.removeChild(this.navigationDOM.wrapper),this.iconsCreated=!1}},{key:"loadNavigationElements",value:function(){var t=this;this.cleanNavigation(),this.navigationDOM={};var e=["up","down","left","right","zoomIn","zoomOut","zoomExtends"],i=["_moveUp","_moveDown","_moveLeft","_moveRight","_zoomIn","_zoomOut","_fit"];this.navigationDOM.wrapper=document.createElement("div"),this.navigationDOM.wrapper.className="vis-navigation",this.canvas.frame.appendChild(this.navigationDOM.wrapper);for(var o=0;o<e.length;o++){this.navigationDOM[e[o]]=document.createElement("div"),this.navigationDOM[e[o]].className="vis-button vis-"+e[o],this.navigationDOM.wrapper.appendChild(this.navigationDOM[e[o]]);var n=new h(this.navigationDOM[e[o]]);"_fit"===i[o]?d.onTouch(n,this._fit.bind(this)):d.onTouch(n,this.bindToRedraw.bind(this,i[o])),this.navigationHammers.push(n)}var s=new h(this.canvas.frame);d.onRelease(s,function(){t._stopMovement()}),this.navigationHammers.push(s),this.iconsCreated=!0}},{key:"bindToRedraw",value:function(t){void 0===this.boundFunctions[t]&&(this.boundFunctions[t]=this[t].bind(this),this.body.emitter.on("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_startRendering"))}},{key:"unbindFromRedraw",value:function(t){void 0!==this.boundFunctions[t]&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"),delete this.boundFunctions[t])}},{key:"_fit",value:function(){(new Date).valueOf()-this.touchTime>700&&(this.body.emitter.emit("fit",{duration:700}),this.touchTime=(new Date).valueOf())}},{key:"_stopMovement",value:function(){for(var t in this.boundFunctions)this.boundFunctions.hasOwnProperty(t)&&(this.body.emitter.off("initRedraw",this.boundFunctions[t]),this.body.emitter.emit("_stopRendering"));this.boundFunctions={}}},{key:"_moveUp",value:function(){this.body.view.translation.y+=this.options.keyboard.speed.y}},{key:"_moveDown",value:function(){this.body.view.translation.y-=this.options.keyboard.speed.y}},{key:"_moveLeft",value:function(){this.body.view.translation.x+=this.options.keyboard.speed.x}},{key:"_moveRight",value:function(){this.body.view.translation.x-=this.options.keyboard.speed.x}},{key:"_zoomIn",value:function(){var t=this.body.view.scale,e=this.body.view.scale*(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"+",scale:this.body.view.scale,pointer:null})}},{key:"_zoomOut",value:function(){var t=this.body.view.scale,e=this.body.view.scale/(1+this.options.keyboard.speed.zoom),i=this.body.view.translation,o=e/t,n=(1-o)*this.canvas.canvasViewCenter.x+i.x*o,s=(1-o)*this.canvas.canvasViewCenter.y+i.y*o;this.body.view.scale=e,this.body.view.translation={x:n,y:s},this.body.emitter.emit("zoom",{direction:"-",scale:this.body.view.scale,pointer:null})}},{key:"configureKeyboardBindings",value:function(){var t=this;void 0!==this.keycharm&&this.keycharm.destroy(),!0===this.options.keyboard.enabled&&(!0===this.options.keyboard.bindToWindow?this.keycharm=l({container:window,preventDefault:!0}):this.keycharm=l({container:this.canvas.frame,preventDefault:!0}),this.keycharm.reset(),!0===this.activated&&(this.keycharm.bind("up",function(){t.b
19300indToRedraw("_moveUp")},"keydown"),this.keycharm.bind("down",function(){t.bindToRedraw("_moveDown")},"keydown"),this.keycharm.bind("left",function(){t.bindToRedraw("_moveLeft")},"keydown"),this.keycharm.bind("right",function(){t.bindToRedraw("_moveRight")},"keydown"),this.keycharm.bind("=",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num+",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("num-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("-",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("[",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("]",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pageup",function(){t.bindToRedraw("_zoomIn")},"keydown"),this.keycharm.bind("pagedown",function(){t.bindToRedraw("_zoomOut")},"keydown"),this.keycharm.bind("up",function(){t.unbindFromRedraw("_moveUp")},"keyup"),this.keycharm.bind("down",function(){t.unbindFromRedraw("_moveDown")},"keyup"),this.keycharm.bind("left",function(){t.unbindFromRedraw("_moveLeft")},"keyup"),this.keycharm.bind("right",function(){t.unbindFromRedraw("_moveRight")},"keyup"),this.keycharm.bind("=",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num+",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("num-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("-",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("[",function(){t.unbindFromRedraw("_zoomOut")},"keyup"),this.keycharm.bind("]",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pageup",function(){t.unbindFromRedraw("_zoomIn")},"keyup"),this.keycharm.bind("pagedown",function(){t.unbindFromRedraw("_zoomOut")},"keyup")))}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=i(47).default,d=i(74).default,l=i(2),u=function(){function t(e,i){var o=this;(0,s.default)(this,t),this.body=e,this.canvas=i,this.selectionObj={nodes:[],edges:[]},this.hoverObj={nodes:{},edges:{}},this.options={},this.defaultOptions={multiselect:!1,selectable:!0,selectConnectedEdges:!0,hoverConnectedEdges:!0},l.extend(this.options,this.defaultOptions),this.body.emitter.on("_dataChanged",function(){o.updateSelection()})}return(0,a.default)(t,[{key:"setOptions",value:function(t){if(void 0!==t){var e=["multiselect","hoverConnectedEdges","selectable","selectConnectedEdges"];l.selectiveDeepExtend(e,this.options,t)}}},{key:"selectOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);this.unselectAll(),void 0!==i&&(e=this.selectObject(i)),this.body.emitter.emit("_requestRedraw")}return e}},{key:"selectAdditionalOnPoint",value:function(t){var e=!1;if(!0===this.options.selectable){var i=this.getNodeAt(t)||this.getEdgeAt(t);void 0!==i&&(e=!0,!0===i.isSelected()?this.deselectObject(i):this.selectObject(i),this.body.emitter.emit("_requestRedraw"))}return e}},{key:"_initBaseEvent",value:function(t,e){var i={};return i.pointer={DOM:{x:e.x,y:e.y},canvas:this.canvas.DOMtoCanvas(e)},i.event=t,i}},{key:"_generateClickEvent",value:function(t,e,i,o){var n=arguments.length>4&&void 0!==arguments[4]&&arguments[4],s=this._initBaseEvent(e,i);if(!0===n)s.nodes=[],s.edges=[];else{var r=this.getSelection();s.nodes=r.nodes,s.edges=r.edges}void 0!==o&&(s.previousSelection=o),"click"==t&&(s.items=this.getClickedItems(i)),this.body.emitter.emit(t,s)}},{key:"selectObject",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.options.selectConnectedEdges;return void 0!==t&&(t instanceof h&&!0===e&&this._selectConnectedEdges(t),t.select(),this._addToSelection(t),!0)}},{key:"deselectObject",value:function(t){!0===t.isSelected()&&(t.selected=!1,this._removeFromSelection(t))}},{key:"_getAllNodesOverlappingWith",value:function(t){for(var e=[],i=this.body.nodes,o=0;o<this.body.nodeIndices.length;o++){var n=this.body.nodeIndices[o];i[n].isOverlappingWith(t)&&e.push(n)}return e}},{key:"_pointerToPositionObject",value:function(t){var e=this.canvas.DOMtoCanvas(t);return{left:e.x-1,top:e.y+1,right:e.x+1,bottom:e.y-1}}},{key:"getNodeAt",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this._pointerToPositionObject(t),o=this._getAllNodesOverlappingWith(i);return o.length>0?!0===e?this.body.nodes[o[o.length-1]]:o[o.length-1]:void 0}},{key:"_getEdgesOverlappingWith",value:function(t,e){for(var i=this.body.edges,o=0;o<this.body.edgeIndices.length;o++){var n=this.body.edgeIndices[o];i[n].isOverlappingWith(t)&&e.push(n)}}},{key:"_getAllEdgesOverlappingWith",value:function(t){var e=[];return this._getEdgesOverlappingWith(t,e),e}},{key:"getEdgeAt",value:function(t){for(var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=this.canvas.DOMtoCanvas(t),o=10,n=null,s=this.body.edges,r=0;r<this.body.edgeIndices.length;r++){var a=this.body.edgeIndices[r],h=s[a];if(h.connected){var d=h.from.x,l=h.from.y,u=h.to.x,c=h.to.y,p=h.edgeType.getDistanceToEdge(d,l,u,c,i.x,i.y);p<o&&(n=a,o=p)}}return null!==n?!0===e?this.body.edges[n]:n:void 0}},{key:"_addToSelection",value:function(t){t instanceof h?this.selectionObj.nodes[t.id]=t:this.selectionObj.edges[t.id]=t}},{key:"_addToHover",value:function(t){t instanceof h?this.hoverObj.nodes[t.id]=t:this.hoverObj.edges[t.id]=t}},{key:"_removeFromSelection",value:function(t){t instanceof h?(delete this.selectionObj.nodes[t.id],this._unselectConnectedEdges(t)):delete this.selectionObj.edges[t.id]}},{key:"unselectAll",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].unselect();for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&this.selectionObj.edges[e].unselect();this.selectionObj={nodes:{},edges:{}}}},{key:"_getSelectedNodeCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedNode",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return this.selectionObj.nodes[t]}},{key:"_getSelectedEdge",value:function(){for(var t in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(t))return this.selectionObj.edges[t]}},{key:"_getSelectedEdgeCount",value:function(){var t=0;for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(t+=1);return t}},{key:"_getSelectedObjectCount",value:function(){var t=0;for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&(t+=1);for(var i in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(i)&&(t+=1);return t}},{key:"_selectionIsEmpty",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t))return!1;for(var e in this.selectionObj.edges)if(this.selectionObj.edges.hasOwnProperty(e))return!1;return!0}},{key:"_clusterInSelection",value:function(){for(var t in this.selectionObj.nodes)if(this.selectionObj.nodes.hasOwnProperty(t)&&this.selectionObj.nodes[t].clusterSize>1)return!0;return!1}},{key:"_selectConnectedEdges",value:function(t){for(var e=0;e<t.edges.length;e++){var i=t.edges[e];i.select(),this._addToSelection(i)}}},{key:"_hoverConnectedEdges",value:function(t){for(var e=0;e<t.edges.length;e++){var i=t.edges[e];i.hover=!0,this._addToHover(i)}}},{key:"_unselectConnectedEdges",value:function(t){for(var e=0;e<t.edges.length;e++){var i=t.edges[e];i.unselect(),this._removeFromSelection(i)}}}
19300,{key:"emitBlurEvent",value:function(t,e,i){var o=this._initBaseEvent(t,e);!0===i.hover&&(i.hover=!1,i instanceof h?(o.node=i.id,this.body.emitter.emit("blurNode",o)):(o.edge=i.id,this.body.emitter.emit("blurEdge",o)))}},{key:"emitHoverEvent",value:function(t,e,i){var o=this._initBaseEvent(t,e),n=!1;return!1===i.hover&&(i.hover=!0,this._addToHover(i),n=!0,i instanceof h?(o.node=i.id,this.body.emitter.emit("hoverNode",o)):(o.edge=i.id,this.body.emitter.emit("hoverEdge",o))),n}},{key:"hoverObject",value:function(t,e){var i=this.getNodeAt(e);void 0===i&&(i=this.getEdgeAt(e));var o=!1;for(var n in this.hoverObj.nodes)this.hoverObj.nodes.hasOwnProperty(n)&&(void 0===i||i instanceof h&&i.id!=n||i instanceof d)&&(this.emitBlurEvent(t,e,this.hoverObj.nodes[n]),delete this.hoverObj.nodes[n],o=!0);for(var s in this.hoverObj.edges)this.hoverObj.edges.hasOwnProperty(s)&&(!0===o?(this.hoverObj.edges[s].hover=!1,delete this.hoverObj.edges[s]):(void 0===i||i instanceof d&&i.id!=s||i instanceof h&&!i.hover)&&(this.emitBlurEvent(t,e,this.hoverObj.edges[s]),delete this.hoverObj.edges[s],o=!0));void 0!==i&&(o=o||this.emitHoverEvent(t,e,i),i instanceof h&&!0===this.options.hoverConnectedEdges&&this._hoverConnectedEdges(i)),!0===o&&this.body.emitter.emit("_requestRedraw")}},{key:"getSelection",value:function(){return{nodes:this.getSelectedNodes(),edges:this.getSelectedEdges()}}},{key:"getSelectedNodes",value:function(){var t=[];if(!0===this.options.selectable)for(var e in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(e)&&t.push(this.selectionObj.nodes[e].id);return t}},{key:"getSelectedEdges",value:function(){var t=[];if(!0===this.options.selectable)for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&t.push(this.selectionObj.edges[e].id);return t}},{key:"setSelection",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=void 0,o=void 0;if(!t||!t.nodes&&!t.edges)throw"Selection must be an object with nodes and/or edges properties" 19301 ;if((e.unselectAll||void 0===e.unselectAll)&&this.unselectAll(),t.nodes)for(i=0;i<t.nodes.length;i++){o=t.nodes[i];var n=this.body.nodes[o];
19301if(!n)throw new RangeError('Node with id "'+o+'" not found');this.selectObject(n,e.highlightEdges)}if(t.edges)for(i=0;i<t.edges.length;i++){o=t.edges[i];var s=this.body.edges[o];if(!s)throw new RangeError('Edge with id "'+o+'" not found');this.selectObject(s)}this.body.emitter.emit("_requestRedraw")}},{key:"selectNodes",value:function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({nodes:t},{highlightEdges:e})}},{key:"selectEdges",value:function(t){if(!t||void 0===t.length)throw"Selection must be an array with ids";this.setSelection({edges:t})}},{key:"updateSelection",value:function(){for(var t in this.selectionObj.nodes)this.selectionObj.nodes.hasOwnProperty(t)&&(this.body.nodes.hasOwnProperty(t)||delete this.selectionObj.nodes[t]);for(var e in this.selectionObj.edges)this.selectionObj.edges.hasOwnProperty(e)&&(this.body.edges.hasOwnProperty(e)||delete this.selectionObj.edges[e])}},{key:"getClickedItems",value:function(t){for(var e=this.canvas.DOMtoCanvas(t),i=[],o=this.body.nodeIndices,n=this.body.nodes,s=o.length-1;s>=0;s--){var r=n[o[s]],a=r.getItemsOnPoint(e);i.push.apply(i,a)}for(var h=this.body.edgeIndices,d=this.body.edges,l=h.length-1;l>=0;l--){var u=d[h[l]],c=u.getItemsOnPoint(e);i.push.apply(i,c)}return i}}]),t}();e.default=u},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(6),a=o(r),h=i(8),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(76).default,v=i(236),g=v.HorizontalStrategy,y=v.VerticalStrategy,b=function(){function t(){(0,u.default)(this,t),this.childrenReference={},this.parentReference={},this.trees={},this.distributionOrdering={},this.levels={},this.distributionIndex={},this.isTree=!1,this.treeIndex=-1}return(0,p.default)(t,[{key:"addRelation",value:function(t,e){void 0===this.childrenReference[t]&&(this.childrenReference[t]=[]),this.childrenReference[t].push(e),void 0===this.parentReference[e]&&(this.parentReference[e]=[]),this.parentReference[e].push(t)}},{key:"checkIfTree",value:function(){for(var t in this.parentReference)if(this.parentReference[t].length>1)return void(this.isTree=!1);this.isTree=!0}},{key:"numTrees",value:function(){return this.treeIndex+1}},{key:"setTreeIndex",value:function(t,e){void 0!==e&&void 0===this.trees[t.id]&&(this.trees[t.id]=e,this.treeIndex=Math.max(e,this.treeIndex))}},{key:"ensureLevel",value:function(t){void 0===this.levels[t]&&(this.levels[t]=0)}},{key:"getMaxLevel",value:function(t){var e=this,i={};return function t(o){if(void 0!==i[o])return i[o];var n=e.levels[o];if(e.childrenReference[o]){var s=e.childrenReference[o];if(s.length>0)for(var r=0;r<s.length;r++)n=Math.max(n,t(s[r]))}return i[o]=n,n}(t)}},{key:"levelDownstream",value:function(t,e){void 0===this.levels[e.id]&&(void 0===this.levels[t.id]&&(this.levels[t.id]=0),this.levels[e.id]=this.levels[t.id]+1)}},{key:"setMinLevelToZero",value:function(t){var e=1e9;for(var i in t)t.hasOwnProperty(i)&&void 0!==this.levels[i]&&(e=Math.min(this.levels[i],e));for(var o in t)t.hasOwnProperty(o)&&void 0!==this.levels[o]&&(this.levels[o]-=e)}},{key:"getTreeSize",value:function(t,e){var i=1e9,o=-1e9,n=1e9,s=-1e9;for(var r in this.trees)if(this.trees.hasOwnProperty(r)&&this.trees[r]===e){var a=t[r];i=Math.min(a.x,i),o=Math.max(a.x,o),n=Math.min(a.y,n),s=Math.max(a.y,s)}return{min_x:i,max_x:o,min_y:n,max_y:s}}},{key:"hasSameParent",value:function(t,e){var i=this.parentReference[t.id],o=this.parentReference[e.id];if(void 0===i||void 0===o)return!1;for(var n=0;n<i.length;n++)for(var s=0;s<o.length;s++)if(i[n]==o[s])return!0;return!1}},{key:"inSameSubNetwork",value:function(t,e){return this.trees[t.id]===this.trees[e.id]}},{key:"getLevels",value:function(){return(0,d.default)(this.distributionOrdering)}},{key:"addToOrdering",value:function(t,e){void 0===this.distributionOrdering[e]&&(this.distributionOrdering[e]=[]);var i=!1,o=this.distributionOrdering[e];for(var n in o)if(o[n]===t){i=!0;break}i||(this.distributionOrdering[e].push(t),this.distributionIndex[t.id]=this.distributionOrdering[e].length-1)}}]),t}(),_=function(){function t(e){(0,u.default)(this,t),this.body=e,this.initialRandomSeed=Math.round(1e6*Math.random()),this.randomSeed=this.initialRandomSeed,this.setPhysics=!1,this.options={},this.optionsBackup={physics:{}},this.defaultOptions={randomSeed:void 0,improvedLayout:!0,hierarchical:{enabled:!1,levelSeparation:150,nodeSpacing:100,treeSpacing:200,blockShifting:!0,edgeMinimization:!0,parentCentralization:!0,direction:"UD",sortMethod:"hubsize"}},f.extend(this.options,this.defaultOptions),this.bindEventListeners()}return(0,p.default)(t,[{key:"bindEventListeners",value:function(){var t=this;this.body.emitter.on("_dataChanged",function(){t.setupHierarchicalLayout()}),this.body.emitter.on("_dataLoaded",function(){t.layoutNetwork()}),this.body.emitter.on("_resetHierarchicalLayout",function(){t.setupHierarchicalLayout()}),this.body.emitter.on("_adjustEdgesForHierarchicalLayout",function(){if(!0===t.options.hierarchical.enabled){var e=t.direction.curveType();t.body.emitter.emit("_forceDisableDynamicCurves",e,!1)}})}},{key:"setOptions",value:function(t,e){if(void 0!==t){var i=this.options.hierarchical,o=i.enabled;if(f.selectiveDeepExtend(["randomSeed","improvedLayout"],this.options,t),f.mergeOptions(this.options,t,"hierarchical"),void 0!==t.randomSeed&&(this.initialRandomSeed=t.randomSeed),!0===i.enabled)return!0===o&&this.body.emitter.emit("refresh",!0),"RL"===i.direction||"DU"===i.direction?i.levelSeparation>0&&(i.levelSeparation*=-1):i.levelSeparation<0&&(i.levelSeparation*=-1),this.setDirectionStrategy(),this.body.emitter.emit("_resetHierarchicalLayout"),this.adaptAllOptionsForHierarchicalLayout(e);if(!0===o)return this.body.emitter.emit("refresh"),f.deepExtend(e,this.optionsBackup)}return e}},{key:"adaptAllOptionsForHierarchicalLayout",value:function(t){if(!0===this.options.hierarchical.enabled){var e=this.optionsBackup.physics;void 0===t.physics||!0===t.physics?(t.physics={enabled:void 0===e.enabled||e.enabled,solver:"hierarchicalRepulsion"},e.enabled=void 0===e.enabled||e.enabled,e.solver=e.solver||"barnesHut"):"object"===(0,a.default)(t.physics)?(e.enabled=void 0===t.physics.enabled||t.physics.enabled,e.solver=t.physics.solver||"barnesHut",t.physics.solver="hierarchicalRepulsion"):!1!==t.physics&&(e.solver="barnesHut",t.physics={solver:"hierarchicalRepulsion"});var i=this.direction.curveType();if(void 0===t.edges)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges={smooth:!1};else if(void 0===t.edges.smooth)this.optionsBackup.edges={smooth:{enabled:!0,type:"dynamic"}},t.edges.smooth=!1;else if("boolean"==typeof t.edges.smooth)this.optionsBackup.edges={smooth:t.edges.smooth},t.edges.smooth={enabled:t.edges.smooth,type:i};else{var o=t.edges.smooth;void 0!==o.type&&"dynamic"!==o.type&&(i=o.type),this.optionsBackup.edges={smooth:void 0===o.enabled||o.enabled,type:void 0===o.type?"dynamic":o.type,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection},t.edges.smooth={enabled:void 0===o.enabled||o.enabled,type:i,roundness:void 0===o.roundness?.5:o.roundness,forceDirection:void 0!==o.forceDirection&&o.forceDirection}}this.body.emitter.emit("_forceDisableDynamicCurves",i)}return t}},{key:"seededRandom",value:function(){var t=1e4*Math.sin(this.randomSeed++);return t-Math.floor(t)}},{key:"positionInitially",value:function(t){if(!0!==this.options.hierarchical.enabled){this.randomSeed=this.initialRandomSeed;for(var e=t.length+50,i=0;i<t.length;i++){var o=t[i],n=2*Math.PI*this.seededRandom();void 0===o.x&&(o.x=e*Math.cos(n)),void 0===o.y&&(o.y=e*Math.sin(n))}}}},{key:"layoutNetwork",value:function(){if(!0!==this.options.hierarchical.enabled&&!0===this.options.improvedLayout){for(var t=this.body.nodeIndices,e=0,i=0;i<t.length;i++){!0===this.body.nodes[t[i]].predefinedPosition&&(e+=1)}if(e<.5*t.length){var o=0,n={clusterNodeProperties:{shape:"ellipse",label:"",group:"",font:{multi:!1}},clusterEdgeProperties:{label:"",font:{multi:!1},smooth:{enabled:!1}}};if(t.length>150){for(var s=t.length;t.length>150&&o<=10;){o+=1;var r=t.length;o%3==0?this.body.modules.clustering.clusterBridges(n):this.body.modules.clustering.clusterOutliers(n);if(r==t.length&&o%3!=0)return this._declusterAll(),this.body.emitter.emit("_layoutFailed"),void console.info("This network could not be positioned by this version of the improved layout algorithm. Please disable improvedLayout for better performance.")}this.body.modules.kamadaKawai.setOptions({springLength:Math.max(150,2*s)})}o>10&&console.info("The clustering didn't succeed within the amount of interations allowed, progressing with partial result."),this.body.modules.kamadaKawai.solve(t,this.body.edgeIndices,!0),this._shiftToCenter();for(var a=0;a<t.length;a++){var h=this.body.nodes[t[a]];!1===h.predefinedPosition&&(h.x+=70*(.5-this.seededRandom()),h.y+=70*(.5-this.seededRandom()))}this._declusterAll(),this.body.emitter.emit("_repositionBezierNodes")}}}},{key:"_shiftToCenter",value:function(){for(var t=m.getRangeCore(this.body.nodes,this.body.nodeIndices),e=m.findCenter(t),i=0;i<this.body.nodeIndices.length;i++){var o=this.body.nodes[this.body.nodeIndices[i]];o.x-=e.x,o.y-=e.y}}},{key:"_declusterAll",value:function(){for(var t=!0;!0===t;){t=!1;for(var e=0;e<this.body.nodeIndices.length;e++)!0===this.body.nodes[this.body.nodeIndices[e]].isCluster&&(t=!0,this.body.modules.clustering.openCluster(this.body.nodeIndices[e],{},!1));!0===t&&this.body.emitter.emit("_dataChanged")}}},{key:"getSeed",value:function(){return this.initialRandomSeed}},{key:"setupHierarchicalLayout",value:function(){if(!0===this.options.hierarchical.enabled&&this.body.nodeIndices.length>0){var t=void 0,e=void 0,i=!1,o=!1;this.lastNodeOnLevel={},this.hierarchical=new b;for(e in this.body.nodes)this.body.nodes.hasOwnProperty(e)&&(t=this.body.nodes[e],void 0!==t.options.level?(i=!0,this.hierarchical.levels[e]=t.options.level):o=!0);if(!0===o&&!0===i)throw new Error("To use the hierarchical layout, nodes require either no predefined levels or levels have to be defined for all nodes.");if(!0===o){var n=this.options.hierarchical.sortMethod;"hubsize"===n?this._determineLevelsByHubsize():"directed"===n?this._determineLevelsDirected():"custom"===n&&this._determineLevelsCustomCallback()}for(var s in this.body.nodes)this.body.nodes.hasOwnProperty(s)&&this.hierarchical.ensureLevel(s);var r=this._getDistribution();this._generateMap(),this._placeNodesByHierarchy(r),this._condenseHierarchy(),this._shiftToCenter()}}},{key:"_condenseHierarchy",value:function(){var t=this,e=!1,i={},o=function(e,i){var o=t.hierarchical.trees;for(var n in o)o.hasOwnProperty(n)&&o[n]===e&&t.direction.shift(n,i)},n=function(){for(var e=[],i=0;i<t.hierarchical.numTrees();i++)e.push(t.direction.getTreeSize(i));return e},r=function e(i,o){if(!o[i.id]&&(o[i.id]=!0,t.hierarchical.childrenReference[i.id])){var n=t.hierarchical.childrenReference[i.id];if(n.length>0)for(var s=0;s<n.length;s++)e(t.body.nodes[n[s]],o)}},a=function(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1e9,o=1e9,n=1e9,r=1e9,a=-1e9;for(var h in e)if(e.hasOwnProperty(h)){var d=t.body.nodes[h],l=t.hierarchical.levels[d.id],u=t.direction.getPosition(d),c=t._getSpaceAroundNode(d,e),p=(0,s.default)(c,2),f=p[0],m=p[1];o=Math.min(f,o),n=Math.min(m,n),l<=i&&(r=Math.min(u,r),a=Math.max(u,a))}return[r,a,o,n]},h=function(e,i){var o=t.hierarchical.getMaxLevel(e.id),n=t.hierarchical.getMaxLevel(i.id);return Math.min(o,n)},d=function(e,i,o){for(var n=t.hierarchical,s=0;s<i.length;s++){var r=i[s],a=n.distributionOrdering[r];if(a.length>1)for(var h=0;h<a.length-1;h++){var d=a[h],l=a[h+1];n.hasSameParent(d,l)&&n.inSameSubNetwork(d,l)&&e(d,l,o)}}},l=function(i,o){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],s=t.direction.getPosition(i),d=t.direction.getPosition(o),l=Math.abs(d-s),u=t.options.hierarchical.nodeSpacing;if(l>u){var c={},p={};
19301r(i,c),r(o,p);var f=h(i,o),m=a(c,f),v=a(p,f),g=m[1],y=v[0],b=v[2];if(Math.abs(g-y)>u){var _=g-y+u;_<-b+u&&(_=-b+u),_<0&&(t._shiftBlock(o.id,_),e=!0,!0===n&&t._centerParent(o))}}},u=function(o,n){for(var h=n.id,d=n.edges,l=t.hierarchical.levels[n.id],u=t.options.hierarchical.levelSeparation*t.options.hierarchical.levelSeparation,c={},p=[],f=0;f<d.length;f++){var m=d[f];if(m.toId!=m.fromId){var v=m.toId==h?m.from:m.to;c[d[f].id]=v,t.hierarchical.levels[v.id]<l&&p.push(m)}}var g=function(e,i){for(var o=0,n=0;n<i.length;n++)if(void 0!==c[i[n].id]){var s=t.direction.getPosition(c[i[n].id])-e;o+=s/Math.sqrt(s*s+u)}return o},y=function(e,i){for(var o=0,n=0;n<i.length;n++)if(void 0!==c[i[n].id]){var s=t.direction.getPosition(c[i[n].id])-e;o-=u*Math.pow(s*s+u,-1.5)}return o},b=function(e,i){for(var o=t.direction.getPosition(n),s={},r=0;r<e;r++){var a=g(o,i),h=y(o,i);if(o-=Math.max(-40,Math.min(40,Math.round(a/h))),void 0!==s[o])break;s[o]=r}return o},_=b(o,p);!function(o){var s=t.direction.getPosition(n);if(void 0===i[n.id]){var h={};r(n,h),i[n.id]=h}var d=a(i[n.id]),l=d[2],u=d[3],c=o-s,p=0;c>0?p=Math.min(c,u-t.options.hierarchical.nodeSpacing):c<0&&(p=-Math.min(-c,l-t.options.hierarchical.nodeSpacing)),0!=p&&(t._shiftBlock(n.id,p),e=!0)}(_),_=b(o,d),function(i){var o=t.direction.getPosition(n),r=t._getSpaceAroundNode(n),a=(0,s.default)(r,2),h=a[0],d=a[1],l=i-o,u=o;l>0?u=Math.min(o+(d-t.options.hierarchical.nodeSpacing),i):l<0&&(u=Math.max(o-(h-t.options.hierarchical.nodeSpacing),i)),u!==o&&(t.direction.setPosition(n,u),e=!0)}(_)};!0===this.options.hierarchical.blockShifting&&(function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n<i&&(e=!1,d(l,o,!0),!0===e);n++);}(5),function(){for(var e in t.body.nodes)t.body.nodes.hasOwnProperty(e)&&t._centerParent(t.body.nodes[e])}()),!0===this.options.hierarchical.edgeMinimization&&function(i){var o=t.hierarchical.getLevels();o=o.reverse();for(var n=0;n<i;n++){e=!1;for(var s=0;s<o.length;s++)for(var r=o[s],a=t.hierarchical.distributionOrdering[r],h=0;h<a.length;h++)u(1e3,a[h]);if(!0!==e)break}}(20),!0===this.options.hierarchical.parentCentralization&&function(){var e=t.hierarchical.getLevels();e=e.reverse();for(var i=0;i<e.length;i++)for(var o=e[i],n=t.hierarchical.distributionOrdering[o],s=0;s<n.length;s++)t._centerParent(n[s])}(),function(){for(var e=n(),i=0,s=0;s<e.length-1;s++){i+=e[s].max-e[s+1].min+t.options.hierarchical.treeSpacing,o(s+1,i)}}()}},{key:"_getSpaceAroundNode",value:function(t,e){var i=!0;void 0===e&&(i=!1);var o=this.hierarchical.levels[t.id];if(void 0!==o){var n=this.hierarchical.distributionIndex[t.id],s=this.direction.getPosition(t),r=this.hierarchical.distributionOrdering[o],a=1e9,h=1e9;if(0!==n){var d=r[n-1];if(!0===i&&void 0===e[d.id]||!1===i){a=s-this.direction.getPosition(d)}}if(n!=r.length-1){var l=r[n+1];if(!0===i&&void 0===e[l.id]||!1===i){var u=this.direction.getPosition(l);h=Math.min(h,u-s)}}return[a,h]}return[0,0]}},{key:"_centerParent",value:function(t){if(this.hierarchical.parentReference[t.id])for(var e=this.hierarchical.parentReference[t.id],i=0;i<e.length;i++){var o=e[i],n=this.body.nodes[o],r=this.hierarchical.childrenReference[o];if(void 0!==r){var a=this._getCenterPosition(r),h=this.direction.getPosition(n),d=this._getSpaceAroundNode(n),l=(0,s.default)(d,2),u=l[0],c=l[1],p=h-a;(p<0&&Math.abs(p)<c-this.options.hierarchical.nodeSpacing||p>0&&Math.abs(p)<u-this.options.hierarchical.nodeSpacing)&&this.direction.setPosition(n,a)}}}},{key:"_placeNodesByHierarchy",value:function(t){this.positionedNodes={};for(var e in t)if(t.hasOwnProperty(e)){var i=(0,d.default)(t[e]);i=this._indexArrayToNodes(i),this.direction.sort(i);for(var o=0,n=0;n<i.length;n++){var s=i[n];if(void 0===this.positionedNodes[s.id]){var r=this.options.hierarchical.nodeSpacing,a=r*o;o>0&&(a=this.direction.getPosition(i[n-1])+r),this.direction.setPosition(s,a,e),this._validatePositionAndContinue(s,e,a),o++}}}}},{key:"_placeBranchNodes",value:function(t,e){var i=this.hierarchical.childrenReference[t];if(void 0!==i){for(var o=[],n=0;n<i.length;n++)o.push(this.body.nodes[i[n]]);this.direction.sort(o);for(var s=0;s<o.length;s++){var r=o[s],a=this.hierarchical.levels[r.id];if(!(a>e&&void 0===this.positionedNodes[r.id]))return;var h=this.options.hierarchical.nodeSpacing,d=void 0;d=0===s?this.direction.getPosition(this.body.nodes[t]):this.direction.getPosition(o[s-1])+h,this.direction.setPosition(r,d,a),this._val
19301idatePositionAndContinue(r,a,d)}var l=this._getCenterPosition(o);this.direction.setPosition(this.body.nodes[t],l,e)}}},{key:"_validatePositionAndContinue",value:function(t,e,i){if(this.hierarchical.isTree){if(void 0!==this.lastNodeOnLevel[e]){var o=this.direction.getPosition(this.body.nodes[this.lastNodeOnLevel[e]]);if(i-o<this.options.hierarchical.nodeSpacing){var n=o+this.options.hierarchical.nodeSpacing-i,s=this._findCommonParent(this.lastNodeOnLevel[e],t.id);this._shiftBlock(s.withChild,n)}}this.lastNodeOnLevel[e]=t.id,this.positionedNodes[t.id]=!0,this._placeBranchNodes(t.id,e)}}},{key:"_indexArrayToNodes",value:function(t){for(var e=[],i=0;i<t.length;i++)e.push(this.body.nodes[t[i]]);return e}},{key:"_getDistribution",value:function(){var t={},e=void 0,i=void 0;for(e in this.body.nodes)if(this.body.nodes.hasOwnProperty(e)){i=this.body.nodes[e];var o=void 0===this.hierarchical.levels[e]?0:this.hierarchical.levels[e];this.direction.fix(i,o),void 0===t[o]&&(t[o]={}),t[o][e]=i}return t}},{key:"_getActiveEdges",value:function(t){var e=this,i=[];return f.forEach(t.edges,function(t){-1!==e.body.edgeIndices.indexOf(t.id)&&i.push(t)}),i}},{key:"_getHubSizes",value:function(){var t=this,e={},i=this.body.nodeIndices;f.forEach(i,function(i){var o=t.body.nodes[i],n=t._getActiveEdges(o).length;e[n]=!0});var o=[];return f.forEach(e,function(t){o.push(Number(t))}),o.sort(function(t,e){return e-t}),o}},{key:"_determineLevelsByHubsize",value:function(){for(var t=this,e=function(e,i){t.hierarchical.levelDownstream(e,i)},i=this._getHubSizes(),o=0;o<i.length;++o){if("break"===function(o){var n=i[o];if(0===n)return"break";f.forEach(t.body.nodeIndices,function(i){var o=t.body.nodes[i];n===t._getActiveEdges(o).length&&t._crawlNetwork(e,i)})}(o))break}}},{key:"_determineLevelsCustomCallback",value:function(){var t=this,e=function(e,i,o){var n=t.hierarchical.levels[e.id];void 0===n&&(n=t.hierarchical.levels[e.id]=1e5);var s=(m.cloneOptions(e,"node"),m.cloneOptions(i,"node"),void m.cloneOptions(o,"edge"));t.hierarchical.levels[i.id]=n+s};this._crawlNetwork(e),this.hierarchical.setMinLevelToZero(this.body.nodes)}},{key:"_determineLevelsDirected",value:function(){var t=this,e=function(e){return f.forEach(t.body.edges,function(t){if(t.toId===e.fromId&&t.fromId===e.toId)return!0}),!1},i=function(i,o,n){var s=t.hierarchical.levels[i.id],r=t.hierarchical.levels[o.id];e(n)&&void 0!==s&&void 0!==r||(void 0===s&&(s=t.hierarchical.levels[i.id]=1e4),n.toId==o.id?t.hierarchical.levels[o.id]=s+1:t.hierarchical.levels[o.id]=s-1)};this._crawlNetwork(i),this.hierarchical.setMinLevelToZero(this.body.nodes)}},{key:"_generateMap",value:function(){var t=this,e=function(e,i){t.hierarchical.levels[i.id]>t.hierarchical.levels[e.id]&&t.hierarchical.addRelation(e.id,i.id)};this._crawlNetwork(e),this.hierarchical.checkIfTree()}},{key:"_crawlNetwork",value:function(){var t=this,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},i=arguments[1],o={},n=function i(n,s){if(void 0===o[n.id]){t.hierarchical.setTreeIndex(n,s),o[n.id]=!0;for(var r=void 0,a=t._getActiveEdges(n),h=0;h<a.length;h++){var d=a[h];!0===d.connected&&(r=d.toId==n.id?d.from:d.to,n.id!=r.id&&(e(n,r,d),i(r,s)))}}};if(void 0===i)for(var s=0,r=0;r<this.body.nodeIndices.length;r++){var a=this.body.nodeIndices[r];if(void 0===o[a]){var h=this.body.nodes[a];n(h,s),s+=1}}else{var d=this.body.nodes[i];if(void 0===d)return void console.error("Node not found:",i);n(d)}}},{key:"_shiftBlock",value:function(t,e){var i=this,o={};!function t(n){if(!o[n]){o[n]=!0,i.direction.shift(n,e);var s=i.hierarchical.childrenReference[n];if(void 0!==s)for(var r=0;r<s.length;r++)t(s[r])}}(t)}},{key:"_findCommonParent",value:function(t,e){var i=this,o={};return function t(e,o){var n=i.hierarchical.parentReference[o];if(void 0!==n)for(var s=0;s<n.length;s++){var r=n[s];e[r]=!0,t(e,r)}}(o,t),function t(e,o){var n=i.hierarchical.parentReference[o];if(void 0!==n)for(var s=0;s<n.length;s++){var r=n[s];if(void 0!==e[r])return{foundParent:r,withChild:o};var a=t(e,r);if(null!==a.foundParent)return a}return{foundParent:null,withChild:o}}(o,e)}},{key:"setDirectionStrategy",value:function(){var t="UD"===this.options.hierarchical.direction||"DU"===this.options.hierarchical.direction;this.direction=t?new y(this):new g(this)}},{key:"_getCenterPosition",value:function(t){for(var e=1e9,i=-1e9,o=0;o<t.length;o++){var n=void 0;if(void 0!==t[o].id)n=t[o];else{var s=t[o];n=this.body.nodes[s]}
19301var r=this.direction.getPosition(n);e=Math.min(e,r),i=Math.max(i,r)}return.5*(e+i)}}]),t}();e.default=_},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0}),e.VerticalStrategy=e.HorizontalStrategy=void 0;var n=i(3),s=o(n),r=i(4),a=o(r),h=i(5),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=function(){function t(){(0,u.default)(this,t)}return(0,p.default)(t,[{key:"abstract",value:function(){throw new Error("Can't instantiate abstract class!")}},{key:"fake_use",value:function(){}},{key:"curveType",value:function(){return this.abstract()}},{key:"getPosition",value:function(t){return this.fake_use(t),this.abstract()}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;this.fake_use(t,e,i),this.abstract()}},{key:"getTreeSize",value:function(t){return this.fake_use(t),this.abstract()}},{key:"sort",value:function(t){this.fake_use(t),this.abstract()}},{key:"fix",value:function(t,e){this.fake_use(t,e),this.abstract()}},{key:"shift",value:function(t,e){this.fake_use(t,e),this.abstract()}}]),t}(),m=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"horizontal"}},{key:"getPosition",value:function(t){return t.x}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.x=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_x,max:e.max_x}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.x||void 0===e.x?0:t.x-e.x})}},{key:"fix",value:function(t,e){t.y=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.y=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].x+=e}}]),e}(f),v=function(t){function e(t){(0,u.default)(this,e);var i=(0,a.default)(this,(e.__proto__||(0,s.default)(e)).call(this));return i.layout=t,i}return(0,d.default)(e,t),(0,p.default)(e,[{key:"curveType",value:function(){return"vertical"}},{key:"getPosition",value:function(t){return t.y}},{key:"setPosition",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:void 0;void 0!==i&&this.layout.hierarchical.addToOrdering(t,i),t.y=e}},{key:"getTreeSize",value:function(t){var e=this.layout.hierarchical.getTreeSize(this.layout.body.nodes,t);return{min:e.min_y,max:e.max_y}}},{key:"sort",value:function(t){t.sort(function(t,e){return void 0===t.y||void 0===e.y?0:t.y-e.y})}},{key:"fix",value:function(t,e){t.x=this.layout.options.hierarchical.levelSeparation*e,t.options.fixed.x=!0}},{key:"shift",value:function(t,e){this.layout.body.nodes[t].y+=e}}]),e}(f);e.HorizontalStrategy=v,e.VerticalStrategy=m},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(8),s=o(n),r=i(19),a=o(r),h=i(6),d=o(h),l=i(0),u=o(l),c=i(1),p=o(c),f=i(2),m=i(10),v=i(37),g=function(){function t(e,i,o){var n=this;(0,u.default)(this,t),this.body=e,this.canvas=i,this.selectionHandler=o,this.editMode=!1,this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0,this.manipulationHammers=[],this.temporaryUIFunctions={},this.temporaryEventFunctions=[],this.touchTime=0,this.temporaryIds={nodes:[],edges:[]},this.guiEnabled=!1,this.inMode=!1,this.selectedControlNode=void 0,this.options={},this.defaultOptions={enabled:!1,initiallyActive:!1,addNode:!0,addEdge:!0,editNode:void 0,editEdge:!0,deleteNode:!0,deleteEdge:!0,controlNodeStyle:{shape:"dot",size:6,color:{background:"#ff0000",border:"#3c3c3c",highlight:{background:"#07f968",border:"#3c3c3c"}},borderWidth:2,borderWidthSelected:2}},f.extend(this.options,this.defaultOptions),this.body.emitter.on("destroy",function(){n._clean()}),this.body.emitter.on("_dataChanged",this._restore.bind(this)),this.body.emitter.on("_resetData",this._restore.bind(this))}return(0,p.default)(t,[{key:"_restore",value:function(){!1!==this.inMode&&(!0===this.options.initiallyActive?this.enableEditMode():this.disableEditMode())}}
19301,{key:"setOptions",value:function(t,e,i){void 0!==e&&(void 0!==e.locale?this.options.locale=e.locale:this.options.locale=i.locale,void 0!==e.locales?this.options.locales=e.locales:this.options.locales=i.locales),void 0!==t&&("boolean"==typeof t?this.options.enabled=t:(this.options.enabled=!0,f.deepExtend(this.options,t)),!0===this.options.initiallyActive&&(this.editMode=!0),this._setup())}},{key:"toggleEditMode",value:function(){!0===this.editMode?this.disableEditMode():this.enableEditMode()}},{key:"enableEditMode",value:function(){this.editMode=!0,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="block",this.closeDiv.style.display="block",this.editModeDiv.style.display="none",this.showManipulatorToolbar())}},{key:"disableEditMode",value:function(){this.editMode=!1,this._clean(),!0===this.guiEnabled&&(this.manipulationDiv.style.display="none",this.closeDiv.style.display="none",this.editModeDiv.style.display="block",this._createEditButton())}},{key:"showManipulatorToolbar",value:function(){if(this._clean(),this.manipulationDOM={},!0===this.guiEnabled){this.editMode=!0,this.manipulationDiv.style.display="block",this.closeDiv.style.display="block";var t=this.selectionHandler._getSelectedNodeCount(),e=this.selectionHandler._getSelectedEdgeCount(),i=t+e,o=this.options.locales[this.options.locale],n=!1;!1!==this.options.addNode&&(this._createAddNodeButton(o),n=!0),!1!==this.options.addEdge&&(!0===n?this._createSeperator(1):n=!0,this._createAddEdgeButton(o)),1===t&&"function"==typeof this.options.editNode?(!0===n?this._createSeperator(2):n=!0,this._createEditNodeButton(o)):1===e&&0===t&&!1!==this.options.editEdge&&(!0===n?this._createSeperator(3):n=!0,this._createEditEdgeButton(o)),0!==i&&(t>0&&!1!==this.options.deleteNode?(!0===n&&this._createSeperator(4),this._createDeleteButton(o)):0===t&&!1!==this.options.deleteEdge&&(!0===n&&this._createSeperator(4),this._createDeleteButton(o))),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this)),this._temporaryBindEvent("select",this.showManipulatorToolbar.bind(this))}this.body.emitter.emit("_redraw")}},{key:"addNodeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addNode",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.addDescription||this.options.locales.en.addDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindEvent("click",this._performAddNode.bind(this))}},{key:"editNode",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean();var e=this.selectionHandler._getSelectedNode();if(void 0!==e){if(this.inMode="editNode","function"!=typeof this.options.editNode)throw new Error("No function has been configured to handle the editing of nodes.");if(!0!==e.isCluster){var i=f.deepExtend({},e.options,!1);if(i.x=e.x,i.y=e.y,2!==this.options.editNode.length)throw new Error("The function for edit does not support two arguments (data, callback)");this.options.editNode(i,function(e){null!==e&&void 0!==e&&"editNode"===t.inMode&&t.body.data.nodes.getDataSet().update(e),t.showManipulatorToolbar()})}else alert(this.options.locales[this.options.locale].editClusterError||this.options.locales.en.editClusterError)}else this.showManipulatorToolbar()}},{key:"addEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="addEdge",!0===this.guiEnabled){var t=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(t),this._createSeperator(),this._createDescription(t.edgeDescription||this.options.locales.en.edgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}this._temporaryBindUI("onTouch",this._handleConnect.bind(this)),this._temporaryBindUI("onDragEnd",this._finishConnect.bind(this)),this._temporaryBindUI("onDrag",this._dragControlNode.bind(this)),this._temporaryBindUI("onRelease",this._finishConnect.bind(this)),this._temporaryBindUI("onDragStart",this._dragStartEdge.bind(this)),this._temporaryBindUI("onHold",function(){})}},{key:"editEdgeMode",value:function(){if(!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="editEdge","object"===(0,d.default)(this.options.editEdge)&&"function"==typeof this.options.editEdge.editWithoutDrag&&(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId)){var t=this.body.edges[this.edgeBeingEditedId];return void this._performEditEdge(t.from,t.to)}if(!0===this.guiEnabled){var e=this.options.locales[this.options.locale];this.manipulationDOM={},this._createBackButton(e),this._createSeperator(),this._createDescription(e.editEdgeDescription||this.options.locales.en.editEdgeDescription),this._bindHammerToDiv(this.closeDiv,this.toggleEditMode.bind(this))}if(this.edgeBeingEditedId=this.selectionHandler.getSelectedEdges()[0],void 0!==this.edgeBeingEditedId){var i=this.body.edges[this.edgeBeingEditedId],o=this._getNewTargetNode(i.from.x,i.from.y),n=this._getNewTargetNode(i.to.x,i.to.y);this.temporaryIds.nodes.push(o.id),this.temporaryIds.nodes.push(n.id),this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id),this.body.nodes[n.id]=n,this.body.nodeIndices.push(n.id),this._temporaryBindUI("onTouch",this._controlNodeTouch.bind(this)),this._temporaryBindUI("onTap",function(){}),this._temporaryBindUI("onHold",function(){}),this._temporaryBindUI("onDragStart",this._controlNodeDragStart.bind(this)),this._temporaryBindUI("onDrag",this._controlNodeDrag.bind(this)),this._temporaryBindUI("onDragEnd",this._controlNodeDragEnd.bind(this)),this._temporaryBindUI("onMouseMove",function(){}),this._temporaryBindEvent("beforeDrawing",function(t){var e=i.edgeType.findBorderPositions(t);!1===o.selected&&(o.x=e.from.x,o.y=e.from.y),!1===n.selected&&(n.x=e.to.x,n.y=e.to.y)}),this.body.emitter.emit("_redraw")}else this.showManipulatorToolbar()}},{key:"deleteSelected",value:function(){var t=this;!0!==this.editMode&&this.enableEditMode(),this._clean(),this.inMode="delete";var e=this.selectionHandler.getSelectedNodes(),i=this.selectionHandler.getSelectedEdges(),o=void 0;if(e.length>0){for(var n=0;n<e.length;n++)if(!0===this.body.nodes[e[n]].isCluster)return void alert(this.options.locales[this.options.locale].deleteClusterError||this.options.locales.en.deleteClusterError);"function"==typeof this.options.deleteNode&&(o=this.options.deleteNode)}else i.length>0&&"function"==typeof this.options.deleteEdge&&(o=this.options.deleteEdge);if("function"==typeof o){var s={nodes:e,edges:i} 19302 ;if(2!==o.length)throw new Error("The function for delete does not support two arguments (data, callback)");o(s,function(e){null!==e&&void 0!==e&&"delete"===t.inMode?(t.body.data.edges.getDataSet().remove(e.edges),t.body.data.nodes.getDataSet().remove(e.nodes),t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar()):(t.body.emitter.emit("startSimulation"),t.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().remove(i),this.body.data.nodes.getDataSet().remove(e),this.body.emitter.emit("startSimulation"),this.showManipulatorToolbar()}},{key:"_setup",value:function(){!0===this.options.enabled?(this.guiEnabled=!0,this._createWrappers(),!1===this.editMode?this._createEditButton():this.showManipulatorToolbar()):(this._removeManipulationDOM(),this.guiEnabled=!1)}},{key:"_createWrappers",value:function(){void 0===this.manipulationDiv&&(this.manipulationDiv=document.createElement("div"),this.manipulationDiv.className="vis-manipulation",!0===this.editMode?this.manipulationDiv.style.display="block":this.manipulationDiv.style.display="none",this.canvas.frame.appendChild(this.manipulationDiv)),void 0===this.editModeDiv&&(this.editModeDiv=document.createElement("div"),this.editModeDiv.className="vis-edit-mode",!0===this.editMode?this.editModeDiv.style.display="none":this.editModeDiv.style.display="block",this.canvas.frame.appendChild(this.editModeDiv)),void 0===this.closeDiv&&(this.closeDiv=document.createElement("div"),this.closeDiv.className="vis-close",this.closeDiv.style.display=this.manipulationDiv.style.display,this.canvas.frame.appendChild(this.closeDiv))}},{key:"_getNewTargetNode",value:function(t,e){var i=f.deepExtend({},this.options.controlNodeStyle);i.id="targetNode"+f.randomUUID(),i.hidden=!1,i.physics=!1,i.x=t,i.y=e;var o=this.body.functions.createNode(i);return o.shape.boundingBox={left:t,right:t,top:e,bottom:e},o}},{key:"_createEditButton",value:function(){this._clean(),this.manipulationDOM={},f.recursiveDOMDelete(this.editModeDiv);var t=this.options.locales[this.options.locale],e=this._createButton("editMode","vis-button vis-edit vis-edit-mode",t.edit||this.options.locales.en.edit);this.editModeDiv.appendChild(e),this._bindHammerToDiv(e,this.toggleEditMode.bind(this))}},{key:"_clean",value:function(){this.inMode=!1,!0===this.guiEnabled&&(f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.manipulationDiv),this._cleanManipulatorHammers()),this._cleanupTemporaryNodesAndEdges(),this._unbindTemporaryUIs(),this._unbindTemporaryEvents(),this.body.emitter.emit("restorePhysics")}},{key:"_cleanManipulatorHammers",value:function(){if(0!=this.manipulationHammer
19302s.length){for(var t=0;t<this.manipulationHammers.length;t++)this.manipulationHammers[t].destroy();this.manipulationHammers=[]}}},{key:"_removeManipulationDOM",value:function(){this._clean(),f.recursiveDOMDelete(this.manipulationDiv),f.recursiveDOMDelete(this.editModeDiv),f.recursiveDOMDelete(this.closeDiv),this.manipulationDiv&&this.canvas.frame.removeChild(this.manipulationDiv),this.editModeDiv&&this.canvas.frame.removeChild(this.editModeDiv),this.closeDiv&&this.canvas.frame.removeChild(this.closeDiv),this.manipulationDiv=void 0,this.editModeDiv=void 0,this.closeDiv=void 0}},{key:"_createSeperator",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;this.manipulationDOM["seperatorLineDiv"+t]=document.createElement("div"),this.manipulationDOM["seperatorLineDiv"+t].className="vis-separator-line",this.manipulationDiv.appendChild(this.manipulationDOM["seperatorLineDiv"+t])}},{key:"_createAddNodeButton",value:function(t){var e=this._createButton("addNode","vis-button vis-add",t.addNode||this.options.locales.en.addNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addNodeMode.bind(this))}},{key:"_createAddEdgeButton",value:function(t){var e=this._createButton("addEdge","vis-button vis-connect",t.addEdge||this.options.locales.en.addEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.addEdgeMode.bind(this))}},{key:"_createEditNodeButton",value:function(t){var e=this._createButton("editNode","vis-button vis-edit",t.editNode||this.options.locales.en.editNode);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editNode.bind(this))}},{key:"_createEditEdgeButton",value:function(t){var e=this._createButton("editEdge","vis-button vis-edit",t.editEdge||this.options.locales.en.editEdge);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.editEdgeMode.bind(this))}},{key:"_createDeleteButton",value:function(t){var e;e=this.options.rtl?"vis-button vis-delete-rtl":"vis-button vis-delete";var i=this._createButton("delete",e,t.del||this.options.locales.en.del);this.manipulationDiv.appendChild(i),this._bindHammerToDiv(i,this.deleteSelected.bind(this))}},{key:"_createBackButton",value:function(t){var e=this._createButton("back","vis-button vis-back",t.back||this.options.locales.en.back);this.manipulationDiv.appendChild(e),this._bindHammerToDiv(e,this.showManipulatorToolbar.bind(this))}},{key:"_createButton",value:function(t,e,i){var o=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"vis-label";return this.manipulationDOM[t+"Div"]=document.createElement("div"),this.manipulationDOM[t+"Div"].className=e,this.manipulationDOM[t+"Label"]=document.createElement("div"),this.manipulationDOM[t+"Label"].className=o,this.manipulationDOM[t+"Label"].innerHTML=i,this.manipulationDOM[t+"Div"].appendChild(this.manipulationDOM[t+"Label"]),this.manipulationDOM[t+"Div"]}},{key:"_createDescription",value:function(t){this.manipulationDiv.appendChild(this._createButton("description","vis-button vis-none",t))}},{key:"_temporaryBindEvent",value:function(t,e){this.temporaryEventFunctions.push({event:t,boundFunction:e}),this.body.emitter.on(t,e)}},{key:"_temporaryBindUI",value:function(t,e){if(void 0===this.body.eventListeners[t])throw new Error("This UI function does not exist. Typo? You tried: "+t+" possible are: "+(0,a.default)((0,s.default)(this.body.eventListeners)));this.temporaryUIFunctions[t]=this.body.eventListeners[t],this.body.eventListeners[t]=e}},{key:"_unbindTemporaryUIs",value:function(){for(var t in this.temporaryUIFunctions)this.temporaryUIFunctions.hasOwnProperty(t)&&(this.body.eventListeners[t]=this.temporaryUIFunctions[t],delete this.temporaryUIFunctions[t]);this.temporaryUIFunctions={}}},{key:"_unbindTemporaryEvents",value:function(){for(var t=0;t<this.temporaryEventFunctions.length;t++){var e=this.temporaryEventFunctions[t].event,i=this.temporaryEventFunctions[t].boundFunction;this.body.emitter.off(e,i)}this.temporaryEventFunctions=[]}},{key:"_bindHammerToDiv",value:function(t,e){var i=new m(t,{});v.onTouch(i,e),this.manipulationHammers.push(i)}},{key:"_cleanupTemporaryNodesAndEdges",value:function(){for(var t=0;t<this.temporaryIds.edges.length;t++){this.body.edges[this.temporaryIds.edges[t]].disconnect(),delete this.body.edges[this.temporaryIds.edges[t]];var e=this.body.edgeIndices.indexOf(this.temporaryIds.edges[t]);-1!==e&&this.body.edgeIndices.splice(e,1)}for(var i=0;i<this.temporaryIds.nodes.length;i++){delete this.body.nodes[this.temporaryIds.nodes[i]];var o=this.body.nodeIndices.indexOf(this.temporaryIds.nodes[i]);-1!==o&&this.body.nodeIndices.splice(o,1)}this.temporaryIds={nodes:[],edges:[]}}},{key:"_controlNodeTouch",value:function(t){this.selectionHandler.unselectAll(),this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation)}},{key:"_controlNodeDragStart",value:function(t){var e=this.lastTouch,i=this.selectionHandler._pointerToPositionObject(e),o=this.body.nodes[this.temporaryIds.nodes[0]],n=this.body.nodes[this.temporaryIds.nodes[1]],s=this.body.edges[this.edgeBeingEditedId];this.selectedControlNode=void 0;var r=o.isOverlappingWith(i),a=n.isOverlappingWith(i);!0===r?(this.selectedControlNode=o,s.edgeType.from=o):!0===a&&(this.selectedControlNode=n,s.edgeType.to=n),void 0!==this.selectedControlNode&&this.selectionHandler.selectObject(this.selectedControlNode),this.body.emitter.emit("_redraw")}},{key:"_controlNodeDrag",value:function(t){this.body.emitter.emit("disablePhysics");var e=this.body.functions.getPointer(t.center),i=this.canvas.DOMtoCanvas(e);if(void 0!==this.selectedControlNode)this.selectedControlNode.x=i.x,this.selectedControlNode.y=i.y;else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}this.body.emitter.emit("_redraw")}},{key:"_controlNodeDragEnd",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=this.body.edges[this.edgeBeingEditedId];if(void 0!==this.selectedControlNode){this.selectionHandler.unselectAll();for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;
19302r--)if(n[r]!==this.selectedControlNode.id){s=this.body.nodes[n[r]];break}if(void 0!==s&&void 0!==this.selectedControlNode)if(!0===s.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var a=this.body.nodes[this.temporaryIds.nodes[0]];this.selectedControlNode.id===a.id?this._performEditEdge(s.id,o.to.id):this._performEditEdge(o.from.id,s.id)}else o.updateEdgeType(),this.body.emitter.emit("restorePhysics");this.body.emitter.emit("_redraw")}}},{key:"_handleConnect",value:function(t){if((new Date).valueOf()-this.touchTime>100){this.lastTouch=this.body.functions.getPointer(t.center),this.lastTouch.translation=f.extend({},this.body.view.translation);var e=this.lastTouch,i=this.selectionHandler.getNodeAt(e);if(void 0!==i)if(!0===i.isCluster)alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError);else{var o=this._getNewTargetNode(i.x,i.y);this.body.nodes[o.id]=o,this.body.nodeIndices.push(o.id);var n=this.body.functions.createEdge({id:"connectionEdge"+f.randomUUID(),from:i.id,to:o.id,physics:!1,smooth:{enabled:!0,type:"continuous",roundness:.5}});this.body.edges[n.id]=n,this.body.edgeIndices.push(n.id),this.temporaryIds.nodes.push(o.id),this.temporaryIds.edges.push(n.id)}this.touchTime=(new Date).valueOf()}}},{key:"_dragControlNode",value:function(t){var e=this.body.functions.getPointer(t.center);if(void 0!==this.temporaryIds.nodes[0]){var i=this.body.nodes[this.temporaryIds.nodes[0]];i.x=this.canvas._XconvertDOMtoCanvas(e.x),i.y=this.canvas._YconvertDOMtoCanvas(e.y),this.body.emitter.emit("_redraw")}else{var o=e.x-this.lastTouch.x,n=e.y-this.lastTouch.y;this.body.view.translation={x:this.lastTouch.translation.x+o,y:this.lastTouch.translation.y+n}}}},{key:"_finishConnect",value:function(t){var e=this.body.functions.getPointer(t.center),i=this.selectionHandler._pointerToPositionObject(e),o=void 0;void 0!==this.temporaryIds.edges[0]&&(o=this.body.edges[this.temporaryIds.edges[0]].fromId);for(var n=this.selectionHandler._getAllNodesOverlappingWith(i),s=void 0,r=n.length-1;r>=0;r--)if(-1===this.temporaryIds.nodes.indexOf(n[r])){s=this.body.nodes[n[r]];break}this._cleanupTemporaryNodesAndEdges(),void 0!==s&&(!0===s.isCluster?alert(this.options.locales[this.options.locale].createEdgeError||this.options.locales.en.createEdgeError):void 0!==this.body.nodes[o]&&void 0!==this.body.nodes[s.id]&&this._performAddEdge(o,s.id)),this.body.emitter.emit("_redraw")}},{key:"_dragStartEdge",value:function(t){var e=this.lastTouch;this.selectionHandler._generateClickEvent("dragStart",t,e,void 0,!0)}},{key:"_performAddNode",value:function(t){var e=this,i={id:f.randomUUID(),x:t.pointer.canvas.x,y:t.pointer.canvas.y,label:"new"};if("function"==typeof this.options.addNode){if(2!==this.options.addNode.length)throw this.showManipulatorToolbar(),new Error("The function for add does not support two arguments (data,callback)");this.options.addNode(i,function(t){null!==t&&void 0!==t&&"addNode"===e.inMode&&(e.body.data.nodes.getDataSet().add(t),e.showManipulatorToolbar())})}else this.body.data.nodes.getDataSet().add(i),this.showManipulatorToolbar()}},{key:"_performAddEdge",value:function(t,e){var i=this,o={from:t,to:e};if("function"==typeof this.options.addEdge){if(2!==this.options.addEdge.length)throw new Error("The function for connect does not support two arguments (data,callback)");this.options.addEdge(o,function(t){null!==t&&void 0!==t&&"addEdge"===i.inMode&&(i.body.data.edges.getDataSet().add(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().add(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}},{key:"_performEditEdge",value:function(t,e){var i=this,o={id:this.edgeBeingEditedId,from:t,to:e,label:this.body.data.edges._data[this.edgeBeingEditedId].label},n=this.options.editEdge;if("object"===(void 0===n?"undefined":(0,d.default)(n))&&(n=n.editWithoutDrag),"function"==typeof n){if(2!==n.length)throw new Error("The function for edit does not support two arguments (data, callback)");n(o,function(t){null===t||void 0===t||"editEdge"!==i.inMode?(i.body.edges[o.id].updateEdgeType(),i.body.emitter.emit("_redraw"),i.showManipulatorToolbar()):(i.body.data.edges.getDataSet().update(t),i.selectionHandler.unselectAll(),i.showManipulatorToolbar())})}else this.body.data.edges.getDataSet().update(o),this.selectionHandler.unselectAll(),this.showManipulatorToolbar()}}]),t}();e.default=g}
19302,function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(30),s=o(n),r=i(0),a=o(r),h=i(1),d=o(h),l=i(239),u=o(l),c=function(){function t(e,i,o){(0,a.default)(this,t),this.body=e,this.springLength=i,this.springConstant=o,this.distanceSolver=new u.default}return(0,d.default)(t,[{key:"setOptions",value:function(t){t&&(t.springLength&&(this.springLength=t.springLength),t.springConstant&&(this.springConstant=t.springConstant))}},{key:"solve",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]&&arguments[2],o=this.distanceSolver.getDistances(this.body,t,e);this._createL_matrix(o),this._createK_matrix(o),this._createE_matrix();for(var n=0,r=Math.max(1e3,Math.min(10*this.body.nodeIndices.length,6e3)),a=1e9,h=0,d=0,l=0,u=0,c=0;a>.01&&n<r;){n+=1;var p=this._getHighestEnergyNode(i),f=(0,s.default)(p,4);for(h=f[0],a=f[1],d=f[2],l=f[3],u=a,c=0;u>1&&c<5;){c+=1,this._moveNode(h,d,l);var m=this._getEnergy(h),v=(0,s.default)(m,3);u=v[0],d=v[1],l=v[2]}}}},{key:"_getHighestEnergyNode",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=0,n=e[0],r=0,a=0,h=0;h<e.length;h++){var d=e[h];if(!1===i[d].predefinedPosition||!0===i[d].isCluster&&!0===t||!0===i[d].options.fixed.x||!0===i[d].options.fixed.y){var l=this._getEnergy(d),u=(0,s.default)(l,3),c=u[0],p=u[1],f=u[2];o<c&&(o=c,n=d,r=p,a=f)}}return[n,o,r,a]}},{key:"_getEnergy",value:function(t){var e=(0,s.default)(this.E_sums[t],2),i=e[0],o=e[1];return[Math.sqrt(Math.pow(i,2)+Math.pow(o,2)),i,o]}},{key:"_moveNode",value:function(t,e,i){for(var o=this.body.nodeIndices,n=this.body.nodes,s=0,r=0,a=0,h=n[t].x,d=n[t].y,l=this.K_matrix[t],u=this.L_matrix[t],c=0;c<o.length;c++){var p=o[c];if(p!==t){var f=n[p].x,m=n[p].y,v=l[p],g=u[p],y=1/Math.pow(Math.pow(h-f,2)+Math.pow(d-m,2),1.5);s+=v*(1-g*Math.pow(d-m,2)*y),r+=v*(g*(h-f)*(d-m)*y),a+=v*(1-g*Math.pow(h-f,2)*y)}}var b=s,_=r,w=e,x=a,k=i,S=(w/b+k/_)/(_/b-x/_),D=-(_*S+w)/b;n[t].x+=D,n[t].y+=S,this._updateE_matrix(t)}},{key:"_createL_matrix",value:function(t){var e=this.body.nodeIndices,i=this.springLength;this.L_matrix=[];for(var o=0;o<e.length;o++){this.L_matrix[e[o]]={};for(var n=0;n<e.length;n++)this.L_matrix[e[o]][e[n]]=i*t[e[o]][e[n]]}}},{key:"_createK_matrix",value:function(t){var e=this.body.nodeIndices,i=this.springConstant;this.K_matrix=[];for(var o=0;o<e.length;o++){this.K_matrix[e[o]]={};for(var n=0;n<e.length;n++)this.K_matrix[e[o]][e[n]]=i*Math.pow(t[e[o]][e[n]],-2)}}},{key:"_createE_matrix",value:function(){var t=this.body.nodeIndices,e=this.body.nodes;this.E_matrix={},this.E_sums={};for(var i=0;i<t.length;i++)this.E_matrix[t[i]]=[];for(var o=0;o<t.length;o++){for(var n=t[o],s=e[n].x,r=e[n].y,a=0,h=0,d=o;d<t.length;d++){var l=t[d];if(l!==n){var u=e[l].x,c=e[l].y,p=1/Math.sqrt(Math.pow(s-u,2)+Math.pow(r-c,2));this.E_matrix[n][d]=[this.K_matrix[n][l]*(s-u-this.L_matrix[n][l]*(s-u)*p),this.K_matrix[n][l]*(r-c-this.L_matrix[n][l]*(r-c)*p)],this.E_matrix[l][o]=this.E_matrix[n][d],a+=this.E_matrix[n][d][0],h+=this.E_matrix[n][d][1]}}this.E_sums[n]=[a,h]}}},{key:"_updateE_matrix",value:function(t){for(var e=this.body.nodeIndices,i=this.body.nodes,o=this.E_matrix[t],n=this.K_matrix[t],s=this.L_matrix[t],r=i[t].x,a=i[t].y,h=0,d=0,l=0;l<e.length;l++){var u=e[l];if(u!==t){var c=o[l],p=c[0],f=c[1],m=i[u].x,v=i[u].y,g=1/Math.sqrt(Math.pow(r-m,2)+Math.pow(a-v,2)),y=n[u]*(r-m-s[u]*(r-m)*g),b=n[u]*(a-v-s[u]*(a-v)*g);o[l]=[y,b],h+=y,d+=b;var _=this.E_sums[u];_[0]+=y-p,_[1]+=b-f}}this.E_sums[t]=[h,d]}}]),t}();e.default=c},function(t,e,i){function o(t){return t&&t.__esModule?t:{default:t}}Object.defineProperty(e,"__esModule",{value:!0});var n=i(0),s=o(n),r=i(1),a=o(r),h=function(){function t(){(0,s.default)(this,t)}return(0,a.default)(t,[{key:"getDistances",value:function(t,e,i){for(var o={},n=t.edges,s=0;s<e.length;s++){var r=e[s],a={};o[r]=a;for(var h=0;h<e.length;h++)a[e[h]]=s==h?0:1e9}for(var d=0;d<i.length;d++){var l=n[i[d]];!0===l.connected&&void 0!==o[l.fromId]&&void 0!==o[l.toId]&&(o[l.fromId][l.toId]=1,o[l.toId][l.fromId]=1)}for(var u=e.length,c=0;c<u;c++)for(var p=e[c],f=o[p],m=0;m<u-1;m++)for(var v=e[m],g=o[v],y=m+1;y<u;y++){var b=e[y],_=o[b],w=Math.min(g[b],g[p]+f[b]);g[b]=w,_[v]=w}return o}}]),t}();e.default=h}])}); 19303//# sourceMappingURL=vis.map 19304(function(root,factory){if(typeof define==="function"&&define.amd){define(factory)}else if(typeof exports==="object"){module.exports=factory()}else{factory()(root.lunr)}})(this,function(){return function(lunr){lunr.stemmerSupport={Among:function(s,substring_i,result,method){this.toCharArray=function(s){var sLength=s.length,charArr=new Array(sLength);for(var i=0;i<sLength;i++)charArr[i]=s.charCodeAt(i);return charArr};if(!s&&s!=""||!substring_i&&substring_i!=0||!result)throw"Bad Among initialisation: s:"+s+", substring_i: "+substring_i+", result: "+result;this.s_size=s.length;this.s=this.toCharArray(s);this.substring_i=substring_i;this.result=result;this.method=method},SnowballProgram:function(){var current;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(word){current=word;this.cursor=0;this.limit=word.length;this.limit_backward=0;this.bra=this.cursor;this.ket=this.limit},getCurrent:function(){var result=current;current=null;return result},in_grouping:function(s,min,max){if(this.cursor<this.limit){var ch=current.charCodeAt(this.cursor);if(ch<=max&&ch>=min){ch-=min;if(s[ch>>3]&1<<(ch&7)){this.cursor++;return true}}}return false},in_grouping_b:function(s,min,max){if(this.cursor>this.limit_backward){var ch=current.charCodeAt(this.cursor-1);if(ch<=max&&ch>=min){ch-=min;if(s[ch>>3]&1<<(ch&7)){this.cursor--;return true}}}return false},out_grouping:function(s,min,max){if(this.cursor<this.limit){var ch=current.charCodeAt(this.cursor);if(ch>max||ch<min){this.cursor++;return true}ch-=min;if(!(s[ch>>3]&1<<(ch&7))){this.cursor++;return true}}return false},out_grouping_b:function(s,min,max){if(this.cursor>this.limit_backward){var ch=current.charCodeAt(this.cursor-1);if(ch>max||ch<min){this.cursor--;return true}ch-=min;if(!(s[ch>>3]&1<<(ch&7))){this.cursor--;return true}}return false},eq_s:function(s_size,s){if(this.limit-this.cursor<s_size)return false;for(var i=0;i<s_size;i++)if(current.charCodeAt(this.cursor+i)!=s.charCodeAt(i))return false;this.cursor+=s_size;return true},eq_s_b:function(s_size,s){if(this.cursor-this.limit_backward<s_size)return false;for(var i=0;i<s_size;i++)if(current.charCodeAt(this.cursor-s_size+i)!=s.charCodeAt(i))return false;this.cursor-=s_size;return true},find_among:function(v,v_size){var i=0,j=v_size,c=this.cursor,l=this.limit,common_i=0,common_j=0,first_key_inspected=false;while(true){var k=i+(j-i>>1),diff=0,common=common_i<common_j?common_i:common_j,w=v[k];for(var i2=common;i2<w.s_size;i2++){if(c+common==l){diff=-1;break}diff=current.charCodeAt(c+common)-w.s[i2];if(diff)break;common++}if(diff<0){j=k;common_j=common}else{i=k;common_i=common}if(j-i<=1){if(i>0||j==i||first_key_inspected)break;first_key_inspected=true}}while(true){var w=v[i];if(common_i>=w.s_size){this.cursor=c+w.s_size;if(!w.method)return w.result;var res=w.method();this.cursor=c+w.s_size;if(res)return w.result}i=w.substring_i;if(i<0)return 0}},find_among_b:function(v,v_size){var i=0,j=v_size,c=this.cursor,lb=this.limit_backward,common_i=0,common_j=0,first_key_inspected=false;while(true){var k=i+(j-i>>1),diff=0,common=common_i<common_j?common_i:common_j,w=v[k];for(var i2=w.s_size-1-common;i2>=0;i2--){if(c-common==lb){diff=-1;break}diff=current.charCodeAt(c-1-common)-w.s[i2];if(diff)break;common++}if(diff<0){j=k;common_j=common}else{i=k;common_i=common}if(j-i<=1){if(i>0||j==i||first_key_inspected)break;first_key_inspected=true}}while(true){var w=v[i];if(common_i>=w.s_size){this.cursor=c-w.s_size;if(!w.method)return w.result;var res=w.method();this.cursor=c-w.s_size;if(res)return w.result}i=w.substring_i;if(i<0)return 0}}
19304,replace_s:function(c_bra,c_ket,s){var adjustment=s.length-(c_ket-c_bra),left=current.substring(0,c_bra),right=current.substring(c_ket);current=left+s+right;this.limit+=adjustment;if(this.cursor>=c_ket)this.cursor+=adjustment;else if(this.cursor>c_bra)this.cursor=c_bra;return adjustment},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>current.length)throw"faulty slice operation"},slice_from:function(s){this.slice_check();this.replace_s(this.bra,this.ket,s)},slice_del:function(){this.slice_from("")},insert:function(c_bra,c_ket,s){var adjustment=this.replace_s(c_bra,c_ket,s);if(c_bra<=this.bra)this.bra+=adjustment;if(c_bra<=this.ket)this.ket+=adjustment},slice_to:function(){this.slice_check();return current.substring(this.bra,this.ket)},eq_v_b:function(s){return this.eq_s_b(s.length,s)}}}}}}); 19305 19306(function (global, factory) { 19307 typeof exports === 'object' && typeof module !== 'undefined' ? factory(require('jquery')) : 19308 typeof define === 'function' && define.amd ? define(['jquery'], factory) : 19309 (factory(global.jQuery)); 19310}(this, (function ($) { 19311 'use strict'; 19312 19313 $.fn.datepicker.languages['fr-FR'] = { 19314 format: 'dd/mm/yyyy', 19315 days: ['Dimanche', 'Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi'], 19316 daysShort: ['Dim', 'Lun', 'Mar', 'Mer', 'Jeu', 'Ven', 'Sam'], 19317 daysMin: ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'], 19318 weekStart: 1, 19319 months: ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Aout', 'Septembre', 'Octobre', 'Novembre', 'Décembre'], 19320 monthsShort: ['Jan', 'Fev', 'Mar', 'Avr', 'Mai', 'Jun', 'Jui', 'Aou', 'Sep', 'Oct', 'Nov', 'Dec'] 19321 }; 19322}))); 19323 19324(function(root,factory){if(typeof define==="function"&&define.amd){define(factory)}else if(typeof exports==="object"){module.exports=factory()}else{factory()(root.lunr)}})(this,function(){return function(lunr){if("undefined"===typeof lunr){throw new Error("Lunr is not present. Please include / require Lunr before this script.")}if("undefined"===typeof lunr.stemmerSupport){throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.")}lunr.fr=function(){this.pipeline.reset();this.pipeline.add(lunr.fr.stopWordFilter,lunr.fr.stemmer)};lunr.fr.stemmer=function(){var Among=lunr.stemmerSupport.Among,SnowballProgram=lunr.stemmerSupport.SnowballProgram,st=new function FrenchStemmer(){var a_0=[new Among("col",-1,-1),new Among("par",-1,-1),new Among("tap",-1,-1)],a_1=[new Among("",-1,4),new Among("I",0,1),new Among("U",0,2),new Among("Y",0,3)],a_2=[new Among("iqU",-1,3),new Among("abl",-1,3),new Among("Ièr",-1,4),new Among("ièr",-1,4),new Among("eus",-1,2),new Among("iv",-1,1)],a_3=[new Among("ic",-1,2),new Among("abil",-1,1),new Among("iv",-1,3)],a_4=[new Among("iqUe",-1,1),new Among("atrice",-1,2),new Among("ance",-1,1),new Among("ence",-1,5),new Among("logie",-1,3),new Among("able",-1,1),new Among("isme",-1,1),new Among("euse",-1,11),new Among("iste",-1,1),new Among("ive",-1,8),new Among("if",-1,8),new Among("usion",-1,4),new Among("ation",-1,2),new Among("ution",-1,4),new Among("ateur",-1,2),new Among("iqUes",-1,1),new Among("atrices",-1,2),new Among("ances",-1,1),new Among("ences",-1,5),new Among("logies",-1,3),new Among("ables",-1,1),new Among("ismes",-1,1),new Among("euses",-1,11),new Among("istes",-1,1),new Among("ives",-1,8),new Among("ifs",-1,8),new Among("usions",-1,4),new Among("ations",-1,2),new Among("utions",-1,4),new Among("ateurs",-1,2),new Among("ments",-1,15),new Among("ements",30,6),new Among("issements",31,12),new Among("ités",-1,7),new Among("ment",-1,15),new Among("ement",34,6),new Among("issement",35,12),new Among("amment",34,13),new Among("emment",34,14),new Among("aux",-1,10),new Among("eaux",39,9),new Among("eux",-1,1),new Among("ité",-1,7)],a_5=[new Among("ira",-1,1),new Among("ie",-1,1),new Among("isse",-1,1),new Among("issante",-1,1),new Among("i",-1,1),new Among("irai",4,1),new Among("ir",-1,1),new Among("iras",-1,1),new Among("ies",-1,1),new Among("îmes",-1,1),new Among("isses",-1,1),new Among("issantes",-1,1),new Among("îtes",-1,1),new Among("is",-1,1),new Among("irais",13,1),new Among("issais",13,1),new Among("irions",-1,1),new Among("issions",-1,1),new Among("irons",-1,1),new Among("issons",-1,1),new Among("issants",-1,1),new Among("it",-1,1),new Among("irait",21,1),new Among("issait",21,1),new Among("issant",-1,1),new Among("iraIent",-1,1),new Among("issaIent",-1,1),new Among("irent",-1,1),new Among("issent",-1,1),new Among("iront",-1,1),new Among("ît",-1,1),new Among("iriez",-1,1),new Among("issiez",-1,1),new Among("irez",-1,1),new Among("issez",-1,1)],a_6=[new Among("a",-1,3),new Among("era",0,2),new Among("asse",-1,3),new Among("ante",-1,3),new Among("ée",-1,2),new Among("ai",-1,3),new Among("erai",5,2),new Among("er",-1,2),new Among("as",-1,3),new Among("eras",8,2),new Among("âmes",-1,3),new Among("asses",-1,3),new Among("antes",-1,3),new Among("âtes",-1,3),new Among("ées",-1,2),new Among("ais",-1,3),new Among("erais",15,2),new Among("ions",-1,1),new Among("erions",17,2),new Among("assions",17,3),new Among("erons",-1,2),new Among("ants",-1,3),new Among("és",-1,2),new Among("ait",-1,3),new Among("erait",23,2),new Among("ant",-1,3),new Among("aIent",-1,3),new Among("eraIent",26,2),new Among("èrent",-1,2),new Among("assent",-1,3),new Among("eront",-1,2),new Among("ât",-1,3),new Among("ez",-1,2),new Among("iez",32,2),new Among("eriez",33,2),new Among("assiez",33,3),new Among("erez",32,2),new Among("é",-1,2)],a_7=[new Among("e",-1,3),new Among("Ière",0,2),new Among("ière",0,2),new Among("ion",-1,1),new Among("Ier",-1,2),new Among("ier",-1,2),new Among("ë",-1,4)],a_8=[new Among("ell",-1,-1),new Among("eill",-1,-1),new Among("enn",-1,-1),new Among("onn",-1,-1),new Among("ett",-1,-1)],g_v=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],g_keep_with_s=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],I_p2,I_p1,I_pV,sbp=new SnowballProgram;this.setCurrent=function(word){sbp.setCurrent(word)};this.getCurrent=function(){return sbp.getCurrent()};
19324function habr1(c1,c2,v_1){if(sbp.eq_s(1,c1)){sbp.ket=sbp.cursor;if(sbp.in_grouping(g_v,97,251)){sbp.slice_from(c2);sbp.cursor=v_1;return true}}return false}function habr2(c1,c2,v_1){if(sbp.eq_s(1,c1)){sbp.ket=sbp.cursor;sbp.slice_from(c2);sbp.cursor=v_1;return true}return false}function r_prelude(){var v_1,v_2;while(true){v_1=sbp.cursor;if(sbp.in_grouping(g_v,97,251)){sbp.bra=sbp.cursor;v_2=sbp.cursor;if(habr1("u","U",v_1))continue;sbp.cursor=v_2;if(habr1("i","I",v_1))continue;sbp.cursor=v_2;if(habr2("y","Y",v_1))continue}sbp.cursor=v_1;sbp.bra=v_1;if(!habr1("y","Y",v_1)){sbp.cursor=v_1;if(sbp.eq_s(1,"q")){sbp.bra=sbp.cursor;if(habr2("u","U",v_1))continue}sbp.cursor=v_1;if(v_1>=sbp.limit)return;sbp.cursor++}}}function habr3(){while(!sbp.in_grouping(g_v,97,251)){if(sbp.cursor>=sbp.limit)return true;sbp.cursor++}while(!sbp.out_grouping(g_v,97,251)){if(sbp.cursor>=sbp.limit)return true;sbp.cursor++}return false}function r_mark_regions(){var v_1=sbp.cursor;I_pV=sbp.limit;I_p1=I_pV;I_p2=I_pV;if(sbp.in_grouping(g_v,97,251)&&sbp.in_grouping(g_v,97,251)&&sbp.cursor<sbp.limit)sbp.cursor++;else{sbp.cursor=v_1;if(!sbp.find_among(a_0,3)){sbp.cursor=v_1;do{if(sbp.cursor>=sbp.limit){sbp.cursor=I_pV;break}sbp.cursor++}while(!sbp.in_grouping(g_v,97,251))}}I_pV=sbp.cursor;sbp.cursor=v_1;if(!habr3()){I_p1=sbp.cursor;if(!habr3())I_p2=sbp.cursor}}function r_postlude(){var among_var,v_1;while(true){v_1=sbp.cursor;sbp.bra=v_1;among_var=sbp.find_among(a_1,4);if(!among_var)break;sbp.ket=sbp.cursor;switch(among_var){case 1:sbp.slice_from("i");break;case 2:sbp.slice_from("u");break;case 3:sbp.slice_from("y");break;case 4:if(sbp.cursor>=sbp.limit)return;sbp.cursor++;break}}}function r_RV(){return I_pV<=sbp.cursor}function r_R1(){return I_p1<=sbp.cursor}function r_R2(){return I_p2<=sbp.cursor}function r_standard_suffix(){var among_var,v_1;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_4,43);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(!r_R2())return false;sbp.slice_del();break;case 2:if(!r_R2())return false;sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"ic")){sbp.bra=sbp.cursor;if(!r_R2())sbp.slice_from("iqU");else sbp.slice_del()}break;case 3:if(!r_R2())return false;sbp.slice_from("log");break;case 4:if(!r_R2())return false;sbp.slice_from("u");break;case 5:if(!r_R2())return false;sbp.slice_from("ent");break;case 6:if(!r_RV())return false;sbp.slice_del();sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_2,6);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(r_R2()){sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"at")){sbp.bra=sbp.cursor;if(r_R2())sbp.slice_del()}}break;case 2:if(r_R2())sbp.slice_del();else if(r_R1())sbp.slice_from("eux");break;case 3:if(r_R2())sbp.slice_del();break;case 4:if(r_RV())sbp.slice_from("i");break}}break;case 7:if(!r_R2())return false;sbp.slice_del();sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_3,3);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(r_R2())sbp.slice_del();else sbp.slice_from("abl");break;case 2:if(r_R2())sbp.slice_del();else sbp.slice_from("iqU");break;case 3:if(r_R2())sbp.slice_del();break}}break;case 8:if(!r_R2())return false;sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"at")){sbp.bra=sbp.cursor;if(r_R2()){sbp.slice_del();sbp.ket=sbp.cursor;if(sbp.eq_s_b(2,"ic")){sbp.bra=sbp.cursor;if(r_R2())sbp.slice_del();else sbp.slice_from("iqU");break}}}break;case 9:sbp.slice_from("eau");break;case 10:if(!r_R1())return false;sbp.slice_from("al");break;case 11:if(r_R2())sbp.slice_del();else if(!r_R1())return false;else sbp.slice_from("eux");break;case 12:if(!r_R1()||!sbp.out_grouping_b(g_v,97,251))return false;sbp.slice_del();break;case 13:if(r_RV())sbp.slice_from("ant");return false;case 14:if(r_RV())sbp.slice_from("ent");return false;case 15:v_1=sbp.limit-sbp.cursor;if(sbp.in_grouping_b(g_v,97,251)&&r_RV()){sbp.cursor=sbp.limit-v_1;sbp.slice_del()}return false}return true}return false}function r_i_verb_suffix(){var among_var,v_1;if(sbp.cursor<I_pV)return false;v_1=sbp.limit_backward;sbp.limit_backward=I_pV;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_5,35);if(!among_var){sbp.limit_backward=v_1;return false}sbp.bra=sbp.cursor;if(among_var==1){if(!sbp.out_grouping_b(g_v,97,251)){sbp.limit_backward=v_1;return false}sbp.slice_del()}sbp.limit_backward=v_1;return true}function r_verb_suffix(){var among_var,v_2,v_3;if(sbp.cursor<I_pV)return false;v_2=sbp.limit_backward;sbp.limit_backward=I_pV;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_6,38);if(!among_var){sbp.limit_backward=v_2;return false}sbp.bra=sbp.cursor;switch(among_var){case 1:if(!r_R2()){sbp.limit_backward=v_2;return false}sbp.slice_del();break;case 2:sbp.slice_del();break;case 3:sbp.slice_del();v_3=sbp.limit-sbp.cursor;sbp.ket=sbp.cursor;if(sbp.eq_s_b(1,"e")){sbp.bra=sbp.cursor;sbp.slice_del()}else sbp.cursor=sbp.limit-v_3;break}sbp.limit_backward=v_2;return true}function r_residual_suffix(){var among_var,v_1=sbp.limit-sbp.cursor,v_2,v_4,v_5;sbp.ket=sbp.cursor;if(sbp.eq_s_b(1,"s")){sbp.bra=sbp.cursor;v_2=sbp.limit-sbp.cursor;if(sbp.out_grouping_b(g_keep_with_s,97,232)){sbp.cursor=sbp.limit-v_2;sbp.slice_del()}else sbp.cursor=sbp.limit-v_1}else sbp.cursor=sbp.limit-v_1;if(sbp.cursor>=I_pV){v_4=sbp.limit_backward;sbp.limit_backward=I_pV;sbp.ket=sbp.cursor;among_var=sbp.find_among_b(a_7,7);if(among_var){sbp.bra=sbp.cursor;switch(among_var){case 1:if(r_R2()){v_5=sbp.limit-sbp.cursor;
19324if(!sbp.eq_s_b(1,"s")){sbp.cursor=sbp.limit-v_5;if(!sbp.eq_s_b(1,"t"))break}sbp.slice_del()}break;case 2:sbp.slice_from("i");break;case 3:sbp.slice_del();break;case 4:if(sbp.eq_s_b(2,"gu"))sbp.slice_del();break}}sbp.limit_backward=v_4}}function r_un_double(){var v_1=sbp.limit-sbp.cursor;if(sbp.find_among_b(a_8,5)){sbp.cursor=sbp.limit-v_1;sbp.ket=sbp.cursor;if(sbp.cursor>sbp.limit_backward){sbp.cursor--;sbp.bra=sbp.cursor;sbp.slice_del()}}}function r_un_accent(){var v_1,v_2=1;while(sbp.out_grouping_b(g_v,97,251))v_2--;if(v_2<=0){sbp.ket=sbp.cursor;v_1=sbp.limit-sbp.cursor;if(!sbp.eq_s_b(1,"é")){sbp.cursor=sbp.limit-v_1;if(!sbp.eq_s_b(1,"è"))return}sbp.bra=sbp.cursor;sbp.slice_from("e")}}function habr5(){if(!r_standard_suffix()){sbp.cursor=sbp.limit;if(!r_i_verb_suffix()){sbp.cursor=sbp.limit;if(!r_verb_suffix()){sbp.cursor=sbp.limit;r_residual_suffix();return}}}sbp.cursor=sbp.limit;sbp.ket=sbp.cursor;if(sbp.eq_s_b(1,"Y")){sbp.bra=sbp.cursor;sbp.slice_from("i")}else{sbp.cursor=sbp.limit;if(sbp.eq_s_b(1,"ç")){sbp.bra=sbp.cursor;sbp.slice_from("c")}}}this.stem=function(){var v_1=sbp.cursor;r_prelude();sbp.cursor=v_1;r_mark_regions();sbp.limit_backward=v_1;sbp.cursor=sbp.limit;habr5();sbp.cursor=sbp.limit;r_un_double();sbp.cursor=sbp.limit;r_un_accent();sbp.cursor=sbp.limit_backward;r_postlude();return true}};return function(word){st.setCurrent(word);st.stem();return st.getCurrent()}}();lunr.Pipeline.registerFunction(lunr.fr.stemmer,"stemmer-fr");lunr.fr.stopWordFilter=function(token){if(lunr.fr.stopWordFilter.stopWords.indexOf(token)===-1){return token}};lunr.fr.stopWordFilter.stopWords=new lunr.SortedSet;lunr.fr.stopWordFilter.stopWords.length=164;lunr.fr.stopWordFilter.stopWords.elements=" ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ");lunr.Pipeline.registerFunction(lunr.fr.stopWordFilter,"stopWordFilter-fr")}}); 19325 19326(function ($) { 19327 'use strict'; 19328 19329 window.dataLayer = window.dataLayer || []; 19330 window.dataLayer.push({ 19331 event: 'jQueryLoaded' 19332 }); 19333 19334 $.fn.cfDatepicker = $.fn.datepicker.noConflict(); 19335 19336 if (window.static) { 19337 document.querySelectorAll('.searchbox__form__input').forEach(function (searchField) { 19338 autocomplete(searchField, [ 19339 'Appels à projets générique', 19340 'Appel à projets spécifique', 19341 'Appels à projets & investissements dâavenir', 19342 'Projets financés', 19343 ]); 19344 }); 19345 } 19346 19347 if (typeof(NodeList.prototype.forEach)!==typeof(alert)) { 19348 NodeList.prototype.forEach=Array.prototype.forEach; 19349 } 19350 19351 document.querySelectorAll('.tag-download').forEach(function (tag) { 19352 tag.addEventListener('click', function () { 19353 this.parentElement.parentElement.classList.toggle('hide'); 19354 }); 19355 }); 19356 19357 let $body = $('body'); 19358 $body.on('change', '.sites-select__select', function () { 19359 location.assign(this.selectedOptions[0].value); 19360 }); 19361 19362 // Gestion des catégories dans la FAQ 19363 let $checkboxes = $('.form-checkbox-styled'); 19364 if ($checkboxes.length) { 19365 var categories = []; 19366 var categoriesHtml = []; 19367 var cpt = 1; 19368 $('.card .categories .tag-type').each(function () { 19369 var html = ''; 19370 if ($.inArray($(this).html(), categories) === -1) { 19371 html = '<label for="checkbox' + cpt + '" class="tag-input-checkbox">'; 19372 html += '<input type="checkbox" id="checkbox' + cpt + '" name="type2">'; 19373 html += '<div class="tag-input-checkbox__bg"></div>'; 19374 html += '<span>' + $(this).html() + '</span>'; 19375 html += '</label>'; 19376 19377 categories.push($(this).html()); 19378 categoriesHtml.push(html); 19379 cpt++; 19380 } 19381 }); 19382 19383 $checkboxes.html(categoriesHtml); 19384 19385 // Gestion de l'affichage des questions grâce au filtre des catégories 19386 $body.on('click', '.tag-input-checkbox', function (e) { 19387 var category = ''; 19388 var filter = false;
19389 let $checkbox = $('.tag-input-checkbox'); 19390 $checkbox.each(function () { 19391 if ($(this).find('input').prop('checked')) { 19392 filter = true; 19393 } 19394 }); 19395 if (filter) { 19396 $checkbox.each(function () { 19397 category = $(this).find('span').html(); 19398 if ($(this).find('input').prop('checked')) { 19399 $('.card').each(function () { 19400 if ($(this).find('.categories .tag-type').html() === category) { 19401 $(this).show(); 19402 } 19403 }); 19404 } else { 19405 $('.card').each(function () { 19406 if ($(this).find('.categories .tag-type').html() === category) { 19407 $(this).hide(); 19408 } 19409 }); 19410 } 19411 }); 19412 } else { 19413 $('.card').each(function () { 19414 $(this).show(); 19415 }); 19416 } 19417 }); 19418 } 19419})(jQuery); 19420 19421function autocomplete(input, arr) { 19422 let currentFocus, 19423 $itemlist = [], 19424 $results = jQuery(input).closest('.search-form').parent().find('.search-results'), 19425 $form = jQuery(input).closest('form'), 19426 closeTimeout = null; 19427 19428 let addActive = function (x) { 19429 if (!x) return false; 19430 19431 removeActive(x); 19432 19433 if (currentFocus >= x.length) currentFocus = 0; 19434 if (currentFocus < 0) currentFocus = (x.length - 1); 19435 19436 x[currentFocus].classList.add('hover'); 19437 }; 19438 19439 let removeActive = function(x) { 19440 for (let i = 0; i < x.length; i++) { 19441 x[i].classList.remove('hover'); 19442 } 19443 }; 19444 19445 let closeAllLists = function() { 19446 if (closeTimeout) { 19447 window.clearTimeout(closeTimeout); 19448 closeTimeout = null; 19449 } 19450 if ($itemlist.length) { 19451 $itemlist.each(function () { 19452 this.parentNode && this.parentNode.removeChild(this); 19453 }); 19454 } 19455 $itemlist = []; 19456 $results.hide(); 19457 }; 19458 19459 input.setChoices = function(choices) { 19460 currentFocus = -1; 19461 closeAllLists(); 19462 if (choices.length === 0) { 19463 return; 19464 } 19465 a = document.createElement('UL'); 19466 a.setAttribute('class', 'autocomplete-items'); 19467 $itemlist = $(a); 19468 19469 let container = this.parentNode.parentNode; 19470 19471 $results.append(a); 19472 $results.show(); 19473 19474 let val = input.value; 19475 let $tmp = $('<p></p>'); 19476 jQuery.each(choices, function (term, termIndex) { 19477 let startIndex = parseInt(term.toUpperCase().indexOf(val.toUpperCase())); 19478 19479 if (startIndex > -1) { 19480 b = document.createElement('LI'); 19481 c = document.createElement('A'); 19482 19483 c.innerHTML = $tmp.text(term.substr(0, startIndex)).html(); 19484 c.innerHTML += "<strong>" + $tmp.text(term.substr(startIndex, val.length)).html() + "</strong>"; 19485 c.innerHTML += $tmp.text(term.substr(startIndex + val.length)).html(); 19486 c.innerHTML += "<span class=\"count\">(" + $tmp.text(termIndex).html() + ")</span>"; 19487 b.choice = term; 19488 19489 b.addEventListener('click', function () { 19490 input.value = this.choice; 19491 closeAllLists(); 19492 if ($form.length) { 19493 $form[0].submit(); 19494 } 19495 }); 19496 19497 c.addEventListener('click', function () { 19498 this.parentNode.click(); 19499 }); 19500 19501 b.appendChild(c); 19502 a.appendChild(b); 19503 } 19504 }); 19505 }; 19506 19507 if (window.static) { 19508 input.addEventListener('input', function () { 19509 let a, b, c, i, val = this.value; 19510 closeAllLists(); 19511 19512 if (!val) { 19513 return false; 19514 } 19515 19516 this.setChoices(arr); 19517 }); 19518 } 19519 19520 input.addEventListener('keydown', function (e) { 19521 let x = $itemlist[0]; 19522 19523 if (x) x = x.childNodes; 19524 else return; 19525 19526 if (e.keyCode === 40) { 19527 currentFocus++; 19528 addActive(x); 19529 } else if (e.keyCode === 38) { 19530 currentFocus--; 19531 addActive(x); 19532 } else if (e.keyCode === 13) { 19533 if (currentFocus > -1) { 19534 if (x) x[currentFocus].click(); 19535 } 19536 } else if (e.keyCode === 27) { 19537 closeAllLists(); 19538 } 19539 }); 19540 19541 let $close = $form.next('.search-close'); 19542 if ($close.length > 0) { 19543 $close.on('click', function () { 19544 input.value = ''; 19545 closeAllLists(); 19546 }); 19547 } else { 19548 jQuery(input).on('blur', function () { 19549 closeTimeout = window.setTimeout(function() { 19550 closeTimeout = null; 19551 closeAllLists(); 19552 }, 200); 19553 }); 19554 } 19555 input.setChoices(arr); 19556} 19557 19558(function ($) { 19559 'use strict'; 19560
19561 let contactFormToggle = document.getElementById('jsContactFormToggleButton'); 19562 if (contactFormToggle) { 19563 contactFormToggle.addEventListener('click', function (event) { 19564 event.preventDefault(); 19565 this.parentNode.classList.add('d-none'); 19566 updateContactForm(); 19567 return false; 19568 }); 19569 } 19570 let $contactFormSelect = $('.jsContactFormToggleSelect'); 19571 if ($contactFormSelect) { 19572 $contactFormSelect.on('change', function (event) { 19573 if ($('#jsContactFormToggleButton').parent().hasClass('d-none')) { 19574 updateContactForm(); 19575 } 19576 return false; 19577 }); 19578 } 19579 19580 function updateContactForm() { 19581 var cid = $contactFormSelect.val(), 19582 label = $contactFormSelect.find('option:selected').text(); 19583 19584 $('.jsContactFormToggleArea > div').removeClass('show'); 19585 $('.jsContactFormToggleArea').find('#c' + cid).addClass('show'); 19586 $('.jsContactFormToggleArea .show .input-hidden-subject input').val(label); 19587 } 19588 19589 $.urlParam = function (name) { 19590 var results = new RegExp('[?&]' + name + '=([^&]*)').exec(location.search) 19591 if (results == null) { 19592 return null; 19593 } else { 19594 return results[1] || 0; 19595 } 19596 }; 19597 19598 if ($.urlParam('realFormId')) { 19599 var realFormId = $.urlParam('realFormId'); 19600 $contactFormSelect.val(realFormId); 19601 $('#c' + realFormId).show(); 19602 $('.jsContactFormToggleSelectArea').hide(); 19603 $('#jsContactFormToggleButton').hide(); 19604 } 19605 19606 $('.card.appel').on('click', '.infos, .close_content, .container-img, .text_content', function() { 19607 let parents = $(this).parents('.card'); 19608 let content = parents.find('.content'); 19609 let cardHeader = parents.find('.card-header'); 19610 let main_content = content.find('.main_content'); 19611 let abstract = content.find('.abstract'); 19612 let close_content = parents.find('.close_content'); 19613 let infos = parents.find('.infos'); 19614 cardHeader.toggleClass('d-none'); 19615 let padding = cardHeader.hasClass('d-none') ? "35px" : "0px" 19616 abstract.css({'padding-top': padding, 'padding-top': padding}) 19617 abstract.toggleClass('d-none'); 19618 main_content.toggleClass('d-none'); 19619 close_content.toggleClass('d-none') 19620 infos.toggleClass('d-none'); 19621 }); 19622 19623})(jQuery); 19624 19625/*global FaqSearch*/ 19626 19627document.addEventListener("DOMContentLoaded", function (event) { 19628 new FaqSearch("fr"); 19629}); 19630 19631/*global lunr*/ 19632 19633var FaqSearch = function (lang, options) { 19634 if (document.getElementById("faq-search-form")) { 19635 this.init(lang, options); 19636 } 19637}; 19638 19639FaqSearch.prototype = { 19640 19641 init: function (lang, options) { 19642 var self = this; 19643 this.lang = lang; 19644 if (options === undefined) { 19645 options = {"titleBoost": 3, "threshold": undefined}; 19646 } 19647 this.titleBoost = options.titleBoost; 19648 if (this.lang == "fr") { 19649 this.idx = lunr(function () { 19650 this.use(lunr.fr); 19651 this.field('title', {boost: this.titleBoost}); 19652 this.field('body'); 19653 }); 19654 } else if (this.lang == "en") { 19655 this.idx = lunr(function () { 19656 this.field('title', {boost: this.titleBoost}); 19657 this.field('body'); 19658 }); 19659 } else { 19660 return null; 19661 } 19662 this.threshold = options.threshold; 19663 this.groups = []; 19664 this.index(); 19665 19666 // Form 19667 this.value = ""; 19668 document.getElementById("faq-search-form").addEventListener("submit", function (event) { 19669 event.preventDefault(); 19670 }); 19671 this.input = document.getElementById("faq-search-input"); 19672 this.input.addEventListener("keyup", function (event) { 19673 window.clearTimeout(self.timer); 19674 var val = event.target.value; 19675 if (val.length == 0) { 19676 self.reset(); 19677 } else if (val.length > 3) { 19678 self.value = val; 19679 self.timer = window.setTimeout(self.search.bind(self), 350); 19680 } 19681 }); 19682 return null; 19683 }, 19684 19685 index: function () { 19686 var groupsConteneur = document.getElementsByClassName("groupeQuestionsLunr"); 19687 for (var c = 0; c < groupsConteneur.length; c++) { 19688 var groupObj = groupsConteneur[c].getElementsByClassName("inner")[0]; 19689 var group = { 19690 id: groupObj.getAttribute("id"), 19691 questions: {}, 19692 results: {}, 19693 obj: groupObj 19694 }; 19695 var questions = groupsConteneur[c].getElementsByClassName("QuestionsLunr")[0].getElementsByClassName("inner"); 19696 for (var q = 0; q < questions.length; q++) { 19697 var questionObj = questions[q]; 19698 var question = { 19699 id: questionObj.getAttribute("id"), 19700 title: questionObj.getElementsByTagName("h2")[0].textContent.replace(/"/g, ""), 19701 body: questionObj.getElementsByClassName("ce-textpic")[0].textContent.replace(/"/g, "") 19702 }; 19703 this.idx.add(question); 19704 question.obj = questionObj; 19705 group.questions[question.id] = question; 19706 } 19707 this.groups.push(group); 19708 } 19709 }, 19710 19711 search: function () { 19712 this.reset(); 19713 if (this.value === "") { 19714 return null; 19715 } 19716 // console.log("search", this.value); 19717 var results = this.idx.search(this.value); 19718 for (var i = 0; i < results.length; i++) { 19719 var result = results[i]; 19720 if (this.threshold === undefined || result.score > this.threshold) { 19721 for (var g = 0; g < this.groups.length; g++) { 19722 var group = this.groups[g]; 19723 if (group.questions[result.ref] !== undefined) { 19724 group.results[result.ref] = result; 19725 break; 19726 } 19727 } 19728 } 19729 } 19730 this.hide(); 19731 this.value = ""; 19732 return null; 19733 }, 19734 19735 hide: function () { 19736 for (var g = 0; g < this.groups.length; g++) { 19737 var group = this.groups[g]; 19738 if (Object.keys(group.results).length === 0) { 19739 group.obj.style.display = "none"; 19740 } 19741 for (var question in group.questions) { 19742 if (group.results[question] === undefined) { 19743 group.questions[question].obj.style.display = "none"; 19744 } 19745 } 19746 } 19747 }, 19748 19749 reset: function () { 19750 for (var g = 0; g < this.groups.length; g++) { 19751 var group = this.groups[g]; 19752 group.obj.style.display = "block"; 19753 group.results = {}; 19754 for (var question in group.questions) { 19755 group.questions[question].obj.style.display = "block"; 19756 } 19757 } 19758 } 19759 19760}; 19761 19762/* global TimelineSearch...*/ 19763 19764document.addEventListener("DOMContentLoaded", function (event) { 19765 $('.timeline').each(function() { 19766 new TimelineSearch(this._timelineBig, jQuery('html').attr('lang')); 19767 }); 19768}); 19769 19770/*global lunr*/ 19771 19772var TimelineSearch = function (timelineBig, lang, options) { 19773 if (document.getElementById("timeline-search-form")) { 19774 this.init(timelineBig, lang, options); 19775 } 19776}; 19777 19778TimelineSearch.prototype = { 19779 init: function (timelineBig, lang, options) { 19780 var self = this; 19781 this.timelineBig = timelineBig; 19782 this.lang = lang; 19783 if (options === undefined) { 19784 options = {"titleBoost": 3, "threshold": undefined}; 19785 } 19786 this.titleBoost = options.titleBoost; 19787 if (this.lang === "fr") { 19788 this.idx = lunr(function () { 19789 this.use(lunr.fr); 19790 this.field('title', {boost: self.titleBoost}); 19791 this.field('body'); 19792 }); 19793 } else if (this.lang === "en") { 19794 this.idx = lunr(function () { 19795 this.field('title', {boost: self.titleBoost}); 19796 this.field('body'); 19797 }); 19798 } else { 19799 return null; 19800 } 19801 this.threshold = options.threshold; 19802 this.items = []; 19803 this.index(); 19804 this.results = []; 19805 19806 // Form 19807 this.value = ""; 19808 document.getElementById("timeline-search-input").addEventListener("submit", function (event) { 19809 event.preventDefault(); 19810 }); 19811 this.input = document.getElementById("timeline-search-input"); 19812 this.input.addEventListener("keyup", function (event) { 19813 window.clearTimeout(self.timer); 19814 let val = event.target.value; 19815 if (val.length === 0) { 19816 self.reset(); 19817 } else if (val.length > 3) { 19818 self.value = val; 19819 self.timer = window.setTimeout(self.search.bind(self), 350); 19820 } 19821 }); 19822 return null; 19823 }, 19824 19825 index: function () { 19826 let itemsConteneur = document.getElementsByClassName('timeline__mobile'); 19827 let items = itemsConteneur[0].getElementsByClassName('timeline-item'); 19828 19829 for (let i = 0; i < items.length; i++) { 19830 let itemObj = items[i]; 19831 let item = { 19832 id: itemObj.getAttribute('data-uid'), 19833 title: itemObj.getElementsByClassName('timeline-item__content-title')[0].textContent.replace(/"/g, ""), 19834 body: '' 19835 }; 19836 19837 if (itemObj.getElementsByClassName('timeline-item__content-desc').length) { 19838 item.body = itemObj.getElementsByClassName('timeline-item__content-desc')[0].textContent.replace(/"/g, ""); 19839 } 19840 19841 this.idx.add(item); 19842 item.obj = itemObj; 19843 this.items[item.id] = item; 19844 } 19845 }, 19846 19847 search: function () { 19848 this.reset(); 19849 if (this.value === "") { 19850 return null; 19851 } 19852 19853 let results = this.idx.search(this.value); 19854 for (let i = 0; i < results.length; i++) { 19855 let result = results[i]; 19856 if (this.threshold === undefined || result.score > this.threshold) { 19857 for (let j = 0; j < this.items.length; j++) { 19858 if (this.items[result.ref] !== undefined) { 19859 this.results[result.ref] = result; 19860 break; 19861 } 19862 } 19863 } 19864 } 19865 this.hide(); 19866 this.value = ""; 19867 return null; 19868 }, 19869 19870 hide: function () { 19871 let firstId = null; 19872 for (let item in this.items) { 19873 if (this.results[item] !== undefined && firstId === null) { 19874 firstId = this.items[item].id; 19875 } 19876 19877 if (this.results[item] === undefined) { 19878 this.items[item].obj.classList.add('textfilter'); 19879 this.items[item].obj.classList.add('hide'); 19880 } 19881 } 19882 this.timelineBig.setData(); 19883 this.timelineBig.vars.timeline.focus(firstId); 19884 }, 19885 19886 reset: function () { 19887 this.results = {}; 19888 for (let item in this.items) { 19889 this.items[item].obj.classList.remove('textfilter'); 19890 19891 if (!this.items[item].obj.classList.contains('checkboxfilter')) { 19892 this.items[item].obj.classList.remove('hide'); 19893 } 19894 } 19895 this.timelineBig.setData(); 19896 } 19897}; 19898 19899(function ($) { 19900 'use strict'; 19901 19902 $('#header_jumbotron').on('click', function(event) { 19903 if (!$(this).attr('href').length) { 19904 event.preventDefault(); 19905 if (window.innerHeight < 900 && window.innerWidth > 1090 && window.innerWidth < 1330) { 19906 $('html, body').animate({ 19907 scrollTop: $('.main-header__nav').offset().top 19908 }, 400); 19909 } else if (window.innerWidth > 1330) { 19910 $('html, body').animate({ 19911 scrollTop: $('.main-header__nav').offset().top - $('.main-header').height() 19912 }, 400); 19913 } else { 19914 $('html, body').animate({ 19915 scrollTop: $('#c6272').offset().top - $('.main-header').height() 19916 }, 400); 19917 } 19918 } 19919 }); 19920 19921 let $body = $('body'); 19922 let menu = { 19923 vars: { 19924 $mainHeader: null, 19925 $primaryMenu: null, 19926 $primaryMenuLinks: null, 19927 $submenuLinks: null, 19928 $closeLinks: null, 19929 $menuWrapper: null, 19930 $searchbox: null, 19931 submenuOpenClass: 'is-open-submenu', 19932 primaryActiveClass: 'is-active-menu', 19933 submenuActiveClass: 'is-active-submenu', 19934 searchboxActiveClass: 'is-active-searchbox' 19935 }, 19936 init: function () { 19937 this.vars.$mainHeader = $('.main-header'); 19938 this.vars.$primaryMenu = $('.main-header__nav .primary-menu'); 19939 this.vars.$primaryMenuLinks = $('.main-header__nav .primary-menu__link[data-submenu]'); 19940 this.vars.$submenuLinks = this.vars.$primaryMenu.find('a[data-submenu], button[data-submenu]'); 19941 this.vars.$closeLinks = this.vars.$primaryMenu.find('.close-submenu[data-close-submenu], .submenu__breadcrumbs__prev[data-close-submenu]'); 19942 this.vars.$mainmenuLinks = this.vars.$primaryMenu.find('[data-mainmenu]'); 19943 this.vars.$menuWrapper = this.vars.$primaryMenu.closest('.main-header__nav'); 19944 this.vars.$mobileWrapper = this.vars.$mainHeader.find('.main-header__navbar-mobile'); 19945 19946 this.vars.$searchbox = $('.main-header__searchbox .searchbox'); 19947 19948 this.multilevel(); 19949 this.sitesSelect(); 19950 this.hamburger(); 19951 this.searchbox(); 19952 }, 19953 sitesSelect: function () { 19954 let $siteSelect = $('.sites-select__select'); 19955 19956 $siteSelect.on('change', function () { 19957 window.location.href = this.value; 19958 }) 19959 }, 19960 hamburger: function () { 19961 let self = this; 19962 19963 this.vars.$mainHeader.find('.hamburger').on('click', function (e) { 19964 e.preventDefault(); 19965 e.stopPropagation(); 19966 19967 $body.toggleClass('is-menu'); 19968 if ($body.hasClass('is-menu')) { 19969 if (window.matchMedia('(min-width: 1090px)').matches) { 19970 $('html').click(function (e) { 19971 if ($(e.target).closest('.main-header').length === 0) { 19972 $('body').removeClass('is-menu'); 19973 $(this).unbind(e); 19974 self.multilevelClose(); 19975 } 19976 }) 19977 } 19978 } else { 19979 $('html').unbind(); 19980 self.multilevelClose(); 19981 } 19982 }); 19983 }, 19984 multilevel: function () { 19985 let self = this; 19986 19987 self.vars.$primaryMenuLinks.on('click', function (e) { 19988 e.preventDefault(); 19989 19990 let $body = $('body'), 19991 $this = $(this), 19992 $parent = $this.closest('li.primary-menu__item'), 19993 targetSubmenu = $this.data('submenu'); 19994 19995 if ($parent.hasClass(self.vars.primaryActiveClass)) { 19996 //if clicked menu is active - close it 19997 self.multilevelClose(); 19998 } else { 19999 if (!$body.hasClass('is-menu')) { 20000 $body.addClass('is-menu'); 20001 } 20002 20003 self.vars.$primaryMenu.find('.' + self.vars.primaryActiveClass).removeClass(self.vars.primaryActiveClass); 20004 self.vars.$primaryMenu.find('.' + self.vars.submenuActiveClass).removeClass(self.vars.submenuActiveClass); 20005 20006 $parent.addClass(self.vars.primaryActiveClass); 20007 $parent.find('.submenu__menu[data-submenu="' + targetSubmenu + '"]').addClass(self.vars.submenuActiveClass); 20008 } 20009 20010 if (window.matchMedia('(min-width: 1090px)').matches) { 20011 $('html, body').animate({ 20012 scrollTop: $('.main-header__nav'
20012).offset().top - $('.main-header').height() 20013 }, 250); 20014 } 20015 }); 20016 20017 self.vars.$submenuLinks.on('click', function () { 20018 let $this = $(this), 20019 $parent = $this.closest('li.primary-menu__item'), 20020 targetSubmenu = $this.data('submenu'); 20021 20022 $parent.find('.' + self.vars.submenuActiveClass).removeClass(self.vars.submenuActiveClass); 20023 $parent.find('.submenu__menu[data-submenu="' + targetSubmenu + '"]').addClass(self.vars.submenuActiveClass); 20024 20025 if (!self.vars.$menuWrapper.hasClass(self.vars.submenuOpenClass)) { 20026 self.vars.$menuWrapper.addClass(self.vars.submenuOpenClass); 20027 } 20028 20029 if (window.matchMedia('(min-width: 1090px)').matches) { 20030 $('html, body').animate({ 20031 scrollTop: $('.main-header__nav').offset().top - $('.main-header').height() 20032 }, 250); 20033 } 20034 }); 20035 20036 self.vars.$closeLinks.on('click', function () { 20037 self.multilevelClose(); 20038 }); 20039 20040 self.vars.$mainmenuLinks.on('click', function () { 20041 self.vars.$menuWrapper.removeClass(self.vars.submenuOpenClass); 20042 self.vars.$primaryMenu.find('.' + self.vars.primaryActiveClass).removeClass(self.vars.primaryActiveClass); 20043 self.vars.$primaryMenu.find('.' + self.vars.submenuActiveClass).removeClass(self.vars.submenuActiveClass); 20044 }); 20045 }, 20046 multilevelClose: function () { 20047 this.vars.$menuWrapper.removeClass(this.vars.submenuOpenClass); 20048 this.vars.$primaryMenu.find('.' + this.vars.primaryActiveClass).removeClass(this.vars.primaryActiveClass); 20049 this.vars.$primaryMenu.find('.' + this.vars.submenuActiveClass).removeClass(this.vars.submenuActiveClass); 20050 20051 if (this.vars.$mobileWrapper.filter(':hidden').length > 0) { 20052 $body.removeClass('is-menu'); 20053 } 20054 }, 20055 searchboxClose: function () { 20056 this.vars.$mainHeader.removeClass(this.vars.searchboxActiveClass); 20057 $body.removeClass('is-searchbox'); 20058 }, 20059 searchbox: function () { 20060 let self = this; 20061 20062 self.vars.$mainHeader.find('.open-searchbox').on('click', function () { 20063 self.multilevelClose(); 20064 self.vars.$mainHeader.toggleClass(self.vars.searchboxActiveClass); 20065 self.vars.$mainHeader.find('.tx-solr-q').focus(); 20066 20067 if (self.vars.$mainHeader.hasClass(self.vars.searchboxActiveClass)) { 20068 $body.addClass('is-searchbox'); 20069 } else { 20070 self.searchboxClose(); 20071 } 20072 }); 20073 20074 self.vars.$primaryMenu.find('.open-searchbox').on('click', function () { 20075 self.multilevelClose(); 20076 self.vars.$mainHeader.toggleClass(self.vars.searchboxActiveClass); 20077 self.vars.$mainHeader.find('.tx-solr-q').focus(); 20078 20079 if (self.vars.$mainHeader.hasClass(self.vars.searchboxActiveClass)) { 20080 $body.addClass('is-searchbox'); 20081 } else { 20082 self.searchboxClose(); 20083 } 20084 }); 20085 20086 self.vars.$mainHeader.find('.close-searchbox').on('click', function () { 20087 self.searchboxClose(); 20088 }); 20089 } 20090 }; 20091 20092 $('.open-inner-menu').click(function () { 20093 let $wrapper = $(this).closest('.inner-menu'), 20094 $content = $wrapper.find('.inner-menu__more'); 20095 20096 if ($wrapper.hasClass('is-active')) { 20097 $content.css({"max-height": ""}); 20098 $wrapper.removeClass('is-active'); 20099 } else { 20100 $wrapper.addClass('is-active'); 20101 $content.css({"max-height": $content[0].scrollHeight}); 20102 } 20103 }); 20104 20105 let $areaParent = $('.homepage-area'); 20106 if ($areaParent.length) { 20107 $('.homepage-area__nav button[data-target]').on('click', function () {
20108 let $this = $(this), 20109 target = $this.data('target'); 20110 20111 $areaParent.find('.is-active').removeClass('is-active'); 20112 $areaParent.find('#' + target).addClass('is-active'); 20113 $this.parent().addClass('is-active'); 20114 }); 20115 } 20116 20117 menu.init(); 20118})(jQuery); 20119 20120jQuery(document).ready(function () { 20121 20122 let manageDateRangeErrors = function($filter) { 20123 let $container = $filter.closest('.newsSearchDateRangeContainer'); 20124 let $all = $container 20125 .add($container.find('input')) 20126 .add($container.closest('form-group')) 20127 .add($container.find('form-control')); 20128 var fM = $container.find('.input-from.input-month').val(); 20129 var fY = $container.find('.input-from.input-year').val(); 20130 var tM = $container.find('.input-to.input-month').val(); 20131 var tY = $container.find('.input-to.input-year').val(); 20132 if ((fM && fY && tM && tY) && ( 20133 (fY === tY) && (fM > tM) 20134 || (fY > tY)) 20135 ) { 20136 $all.addClass('is-invalid'); 20137 } else { 20138 $all.removeClass('is-invalid'); 20139 } 20140 }; 20141 20142 $('.newssearch-date-filter').each(function () { 20143 let dateFilter = this, $dateFilter = $(this); 20144 let options = { 20145 format: 'MM-YYYY', 20146 autoHide: true 20147 }; 20148 if ($('html')[0].lang === 'fr') { 20149 options.language = 'fr-FR'; 20150 } 20151 $dateFilter.cfDatepicker(options); 20152 let $inputMonth = $dateFilter.parent().find('.input-month'), 20153 $inputYear = $dateFilter.parent().find('.input-year'); 20154 dateFilter.addEventListener('change', function(event) { 20155 var value = this.value; 20156 value = value.split('-'); 20157 $inputMonth.val(value[0]); 20158 $inputYear.val(value[1]); 20159 manageDateRangeErrors($dateFilter); 20160 20161 }); 20162 $(this).on('pick.datepicker', function (event) { 20163 var month = (event.date.getUTCMonth() > 8) ? event.date.getUTCMonth() + 1 : "0" + eval(event.date.getUTCMonth() + 1); 20164 $inputMonth.val(month); 20165 $inputYear.val(event.date.getUTCFullYear()); 20166 manageDateRangeErrors($dateFilter); 20167 }); 20168 }); 20169 20170 $('.input-date-range-reset a').on('click', function(ev) { 20171 ev.preventDefault(); 20172 $(this).closest('.input-date-range-reset').parent().find('.newssearch-date-filter').each(function() { 20173 $(this).data('datepicker').reset(); 20174 }); 20175 $(this).closest('.input-date-range-reset').parent().find('.input-month,.input-year').val(''); 20176 $(this).closest('.input-date-range-reset').parent().find('.newsSearchDateRangeContainer').removeClass('is-invalid'); 20177 }) 20178}); 20179jQuery(document).ready(function () { 20180 let req = false; 20181 20182 let makeFilters = function() { 20183 let filters = [ 20184 'type:tx_news_domain_model_news' 20185 ], 20186 $period = jQuery('.news-period'), 20187 $categories = jQuery('.news-category:checked'); 20188 if (!$period.hasClass('is-invalid')) { 20189 let fM = $period.find('.input-from.input-month').val(); 20190 let fY = $period.find('.input-from.input-year').val(); 20191 let tM = $period.find('.input-to.input-month').val(); 20192 let tY = $period.find('.input-to.input-year').val(); 20193 if ((fM && fY) || (tM && tY)) { 20194 let range = ['*', '*']; 20195 if (fM && fY) { 20196 range[0] = new Date(parseInt(tY), parseInt(tM)).toISOString(); 20197 } 20198 if (tM && tY) { 20199 range[1] = new Date(parseInt(tY), parseInt(tM) + 1, 1, 0, 0, 0, -1).toISOString(); 20200 } 20201 filters.push('publication_dateS:[' + range.join(' TO ') + ']'); 20202 } 20203 } 20204 if ($categories.length > 0) { 20205 let categories = []; 20206 for (let index = 0; index < $categories.length; index++) { 20207 categories.push('category_stringM:"' + jQuery($categories[index]).data('title') + '"'); 20208 } 20209 filters.push(categories.join(' OR ')); 20210 } 20211 return filters; 20212 }; 20213 20214 let search = function() { 20215 if (req) { 20216 req.abort(); 20217 req = null; 20218 if (typeof(this.setChoices) !== 'undefined') { 20219 this.setChoices([]); 20220 } 20221 } 20222 if (this.value.length < 3) { 20223 if (typeof(this.setChoices) !== 'undefined') { 20224 this.setChoices([]); 20225 } 20226 return; 20227 } 20228 let input = this; 20229 let $form = jQuery('.main-header__searchbox .search-form'); 20230 if ($form.length > 0) { 20231 let filters = makeFilters(); 20232 filters = (filters.length > 0) ? JSON.stringify(filters) : ''; 20233 req = jQuery.ajax({ 20234 url: $form.data('url'), 20235 dataType: 'json', 20236 data: { 20237 filters: filters, 20238 termLowercase: this.value.toLowerCase(), 20239 termOriginal: this.value, 20240 L: $form.find('input[name="L"]').val() 20241 }, 20242 success: function (data) { 20243 req = false;
20244 if (typeof (input.setChoices) === 'undefined') { 20245 autocomplete(input, data); 20246 } else { 20247 input.setChoices(data); 20248 } 20249 } 20250 }); 20251 } 20252 }; 20253 jQuery('.news-keyword').on('input', search) 20254 .on('keydown', function(e) { 20255 if ((e.keyCode === 40) && (jQuery(this).closest('.search-form').parent().find('.search-results:hidden').length > 0)) { 20256 search.apply(this); 20257 } 20258 }); 20259}); 20260 20261(function ($) { 20262 'use strict'; 20263 20264 let popup = $('.popup'); 20265 if (popup.length) { 20266 let cookie = Cookies.getJSON('cookie_consent_settings_set'); 20267 let isCookie = false; 20268 let isTutorial = popup.hasClass('tutorial'); 20269 20270 if (typeof cookie === 'undefined') { 20271 popup.addClass('on'); 20272 } 20273 20274 let closePopup = function () { 20275 popup.addClass('close'); 20276 20277 setTimeout(function () { 20278 popup.removeClass('on close'); 20279 }, 300); 20280 }; 20281 20282 let showPopup = function (t, name) { 20283 t.closest('.popup__slide').find('.popup__content').removeClass('on'); 20284 t.closest('.popup__slide').find('.popup__content[data-name="' + name + '"]').addClass('on'); 20285 }; 20286 20287 if (isTutorial) { 20288 let popupSlider = popup.find('.popup__slider').slick({ 20289 centerMode: true, 20290 centerPadding: '120px', 20291 dots: true, 20292 draggable: false, 20293 infinite: false, 20294 slidesToScroll: 1, 20295 slidesToShow: 1, 20296 swipe: false, 20297 responsive: [ 20298 { 20299 breakpoint: 992, 20300 settings: { 20301 centerPadding: '0px' 20302 } 20303 } 20304 ] 20305 }); 20306 20307 if (typeof cookie === 'undefined') { 20308 popup.find('.slick-arrow').addClass('slick-disabled'); 20309 popup.find('.slick-arrow').attr('disabled', 'disabled'); 20310 popup.find('.slick-dots').addClass('slick-disabled'); 20311 } 20312 20313 popupSlider.on('afterChange', function (e, slick) { 20314 if ($(window).width() > 800) { 20315 popup.find('.popup__slider .slick-list').removeClass('moveUp'); 20316 } 20317 20318 if (slick.currentSlide >= 1) { 20319 popupSlider.slick('slickSetOption', 'draggable', true, false); 20320 popupSlider.slick('slickSetOption', 'swipe', true, false); 20321 } 20322 20323 if (slick.currentSlide >= 1) { 20324 $('.popup__btn-close').addClass('visible'); 20325 } else if (!isCookie) { 20326 $('.popup__btn-close').removeClass('visible'); 20327 } 20328 }); 20329 20330 popupSlider.on('beforeChange', function (e, slick, currentSlide, nextSlide) { 20331 if ($(window).width() > 800) { 20332 popup.find('.popup__slider .slick-list').addClass('moveUp'); 20333 } 20334 20335 if (slick.currentSlide + 2 === slick.slideCount && nextSlide > currentSlide) { 20336 popup.find('.popup__slider .slick-next').addClass('slick-hide'); 20337 } else { 20338 popup.find('.popup__slider .slick-next').removeClass('slick-hide'); 20339 } 20340 }); 20341 } 20342 20343 $('[data-show="disable-cookie"]').on('click', function(e) { 20344 e.preventDefault(); 20345 $('#consent_performance').prop('checked', false); 20346 $('#consent_analytics').prop('checked', false); 20347 // $('[data-show="cookies-settings"]').trigger('click'); 20348 Cookies.set('cookie_consent_settings_custom', 0); 20349 $('.popup-action-save').trigger('click'); 20350 return false; 20351 }); 20352 20353 popup.find('[class*="popup-action"]').on('click', function (e) { 20354 e.preventDefault(); 20355 20356 let card = $(this).attr('data-show'); 20357 let t = $(this); 20358 20359 let isCloseButton = t.hasClass('popup-action-close'); 20360 let isSaveButton = t.hasClass('popup-action-save'); 20361 let isSaveAllButton = t.hasClass('popup-action-save-all');
20362 let isPass = t.hasClass('popup-action-pass'); 20363 20364 if (typeof card !== 'undefined') { 20365 showPopup(t, card); 20366 } 20367 20368 if (isCloseButton) { 20369 closePopup(); 20370 } 20371 20372 if (isSaveButton || isSaveAllButton || isPass) { 20373 if(isPass) { 20374 Cookies.set('cookie_consent_settings_set', 1); 20375 } 20376 20377 if (!isTutorial) { 20378 closePopup(); 20379 } else { 20380 popup.find('.popup__slider').slick('slickNext'); 20381 popup.find('.slick-arrow').removeClass('slick-disabled'); 20382 popup.find('.slick-arrow').removeAttr('disabled'); 20383 popup.find('.slick-dots').removeClass('slick-disabled'); 20384 } 20385 20386 $('.popup__btn-close').addClass('visible'); 20387 isCookie = true; 20388 } 20389 20390 if (isTutorial) { 20391 if (card === 'cookies-settings') { 20392 popup.find('.slick-arrow').addClass('slick-hide'); 20393 popup.find('.slick-arrow').attr('disabled', 'disabled'); 20394 popup.find('.slick-dots').addClass('slick-hide'); 20395 } else { 20396 popup.find('.slick-arrow').removeClass('slick-hide'); 20397 popup.find('.slick-arrow').removeAttr('disabled'); 20398 popup.find('.slick-dots').removeClass('slick-hide'); 20399 } 20400 } 20401 }); 20402 20403 window.addEventListener('load', function() { 20404 if (window.doNotTrack == "1" || navigator.doNotTrack == "yes" || navigator.doNotTrack == "1" || navigator.msDoNotTrack == "1") { 20405 popup.find('.blocked').show(); 20406 } else { 20407 if (!window.google_tag_manager) { 20408 popup.find('.blocked').show(); 20409 } else { 20410 popup.find('.unblocked').show(); 20411 } 20412 } 20413 }, false); 20414 } 20415})(jQuery); 20416 20417(function ($) { 20418 'use strict'; 20419 20420 let $heroSlider = $('.hero-slider'), 20421 $heroSliderItems = $heroSlider.children(); 20422 20423 if ($heroSlider.length && $heroSliderItems.length > 1) { 20424 $heroSlider.slick({ 20425 arrows: false, 20426 autoplay: true, 20427 autoplaySpeed: 5000, 20428 dots: true, 20429 fade: true, 20430 mobileFirst: true, 20431 slidesToScroll: 1, 20432 slidesToShow: 1, 20433 speed: 800 20434 }); 20435 } 20436 20437 let $retroSlider = $('.retro-slider'); 20438 let $retroSliderItems = $retroSlider.children(); 20439 20440 if ($retroSlider.length && $retroSliderItems.length > 1) { 20441 $retroSlider.slick({ 20442 arrows: true, 20443 autoplay: false, 20444 dots: false, 20445 fade: false, 20446 mobileFirst: false, 20447 slidesToScroll: 1, 20448 slidesToShow: 6, 20449 infinite: false, 20450 speed: 800, 20451 responsive: [ 20452 { 20453 breakpoint: 1200, 20454 settings: { 20455 slidesToShow: 5, 20456 } 20457 }, 20458 { 20459 breakpoint: 1100, 20460 settings: { 20461 slidesToShow: 4, 20462 } 20463 }, 20464 { 20465 breakpoint: 600, 20466 settings: { 20467 slidesToShow: 3, 20468 } 20469 }, 20470 { 20471 breakpoint: 450, 20472 settings: { 20473 slidesToShow: 2, 20474 } 20475 }, 20476 ] 20477 }); 20478 20479 $('.retro-slider__item:first-of-type()').addClass('retro-active'); 20480 $('.retro-slider__item').on('click', function() { 20481 $('.retro-active').removeClass('retro-active'); 20482 $(this).addClass('retro-active'); 20483 $('.retro-item').animate({ 20484 opacity: 0 20485 }, 400); 20486 20487 setTimeout(() => { 20488 $('.retro-item').css('display', 'none'); 20489 $($(this).data('href')).css('display', 'flex'); 20490 $($(this).data('href')).animate({ 20491 opacity: 1 20492 }, 400); 20493 }, 400); 20494 }); 20495 } 20496 20497 20498 let $tileSlider = $('.news-tiles, .partners-grid, .sidebar-box__inner, .numbers__grid'); 20499 if ($tileSlider.length) { 20500 let tileSlickOn = function () { 20501 $tileSlider.each(function () {
20502 let $this = $(this); 20503 20504 if ($this.closest('.minimalistic').length < 1 && !$this.hasClass('slick-initialized')) { 20505 $this.slick({ 20506 slidesToShow: 1, 20507 slidesToScroll: 1, 20508 dots: true, 20509 arrows: false, 20510 mobileFirst: true, 20511 responsive: [ 20512 { 20513 breakpoint: 1090 20514 }, 20515 { 20516 breakpoint: 576, 20517 settings: { 20518 slidesToShow: 2, 20519 slidesToScroll: 2 20520 } 20521 } 20522 ] 20523 }); 20524 } 20525 }); 20526 $tileSlider = $('.news-tiles, .partners-grid, .sidebar-box__inner, .numbers__grid'); 20527 }; 20528 20529 let tileSlickOff = function () { 20530 $tileSlider.each(function () { 20531 let $this = $(this); 20532 20533 if ($this.hasClass('slick-initialized')) { 20534 $this.slick('unslick'); 20535 } 20536 }); 20537 $tileSlider = $('.news-tiles, .partners-grid, .sidebar-box__inner, .numbers__grid'); 20538 }; 20539 20540 if (window.innerWidth <= 1090) { 20541 tileSlickOn() 20542 } 20543 20544 $(window).on('resize', function (e) { 20545 if (e.target.innerWidth <= 1090) { 20546 tileSlickOn(); 20547 } else { 20548 tileSlickOff(); 20549 } 20550 }); 20551 } 20552 20553 // Désactiver le hover sur les cartes sans teaser 20554 document.querySelectorAll('.news-tile__url').forEach(function(card) { 20555 var hoverText = card.querySelector('.news-tile__hover-content'); 20556 if (!hoverText || !hoverText.innerText.trim()) { 20557 var hoverLayer = card.querySelector('.news-tile__hover'); 20558 if (hoverLayer) hoverLayer.style.display = 'none'; 20559 } 20560 }); 20561 20562 let funded_projects_slick = $('.funded_projects_slick'); 20563 if(funded_projects_slick.closest('.minimalistic').length < 1 && !funded_projects_slick.hasClass('slick-initialized')){ 20564 /* funded_projects_slick.slick({ 20565 slidesToShow: 1, 20566 slidesToScroll: 1, 20567 dots: true, 20568 arrows: false, 20569 mobileFirst: true, 20570 }); */ 20571 } 20572 20573 let $flashSlider = $('.flash-info__slider'); 20574 if ($flashSlider.length) { 20575 if ($flashSlider.find('> div').length > 1) { 20576 $flashSlider.closest('.flash-info__content').addClass('with-buttons'); 20577 } 20578 20579 $flashSlider.slick({ 20580 adaptiveHeight: true, 20581 arrows: true, 20582 autoplay: true, 20583 autoplaySpeed: 5000, 20584 dots: false, 20585 mobileFirst: true, 20586 slidesToShow: 1, 20587 slidesToScroll: 1 20588 }) 20589 .on('setPosition', function (event, slick) { 20590 slick.$slides.css('height', slick.$slideTrack.height() + 'px'); 20591 }); 20592 } 20593 20594 let $resume_funded__slider = $('.resume_funded__slider'); 20595 if ($resume_funded__slider.length) { 20596 20597 $resume_funded__slider.slick({ 20598 adaptiveHeight: true, 20599 arrows: true, 20600 autoplay: false, 20601 autoplaySpeed: 5000, 20602 dots: false, 20603 mobileFirst: true, 20604 slidesToShow: 1, 20605 slidesToScroll: 1 20606 }) 20607 .on('setPosition', function (event, slick) { 20608 //slick.$slides.css('height', slick.$slideTrack.height() + 'px'); 20609 }); 20610 } 20611 20612 let section_appels_ouverts = $('#section_appels_ouverts'); 20613 $(document).ready(function() { 20614 $('.svg-loading').on('load', function() { 20615 let item = $(this); 20616 let titleData = $(this).attr('name'); 20617 let content = item.contents(); 20618 let color = item.data('color');
20619 if(this && this.getSVGDocument()) { 20620 let svg = this.getSVGDocument(); 20621 var title = document.createElementNS("http://www.w3.org/2000/svg", "title"); 20622 title.textContent = titleData; 20623 if(svg !== null) { 20624 var firchild = svg.firstChild; 20625 svg.children[0].appendChild(title); 20626 let paths = svg.getElementsByTagName("path"); 20627 let rect = svg.getElementsByTagName("rect"); 20628 let polygons = svg.getElementsByTagName("polygon"); 20629 20630 var allitems = []; 20631 allitems = Array.prototype.concat.apply(allitems, paths); 20632 allitems = Array.prototype.concat.apply(allitems, rect); 20633 allitems = Array.prototype.concat.apply(allitems, polygons); 20634 20635 for(let i = 0; i < paths.length; i++) { 20636 let path = allitems[i] 20637 path.setAttribute("fill", color) 20638 } 20639 } 20640 } 20641 }); 20642 $('.svg-loading').trigger('load'); 20643 }); 20644 if(section_appels_ouverts.length) { 20645 20646 $('[data-toggle="tooltip"]').tooltip(); 20647 20648 let screen_width = window.innerWidth; 20649 if(screen_width < 992) { 20650 initAppels(); 20651 $('#slick-arrow-appels').removeClass('d-none') 20652 } else { 20653 //$('#section_appels_ouverts').slick('unslick') 20654 } 20655 function initAppels() { 20656 $('#section_appels_ouverts').slick({ 20657 adaptiveHeight: true, 20658 arrows: true, 20659 autoplay: false, 20660 autoplaySpeed: 5000, 20661 dots: false, 20662 mobileFirst: true, 20663 slidesToShow: 1, 20664 slidesToScroll: 1, 20665 respondTo: 'slider', 20666 prevArrow: $('.prev-slick'), 20667 nextArrow: $('.next-slick'), 20668 }); 20669 $('#section_appels_ouverts').find('.card.appel').css({'min-height': 'inherit', 'display': 'flex'}) 20670 $('[data-load-more="open_calls"]').addClass('d-none') 20671 } 20672 function destroyAppels() { 20673 $('#section_appels_ouverts').slick('unslick') 20674 } 20675 } 20676 20677 20678 20679 let $twitterSlider = $('.tx-cw-twitter'); 20680 if ($twitterSlider.length) { 20681 let twitterSlickOn = function() { 20682 $twitterSlider.slick({ 20683 slidesToShow: 1, 20684 slidesToScroll: 1, 20685 dots: true, 20686 arrows: false, 20687 mobileFirst: true, 20688 adaptiveHeight: true, 20689 responsive: [ 20690 { 20691 breakpoint: 1090 20692 }, 20693 { 20694 breakpoint: 768, 20695 settings: { 20696 slidesToShow: 3, 20697 slidesToScroll: 3 20698 } 20699 }, 20700 { 20701 breakpoint: 480, 20702 settings: { 20703 slidesToShow: 2, 20704 slidesToScroll: 2, 20705 adaptiveHeight: false 20706 } 20707 } 20708 ] 20709 }); 20710 $twitterSlider = $('.tx-cw-twitter'); 20711 }; 20712 20713 let twitterSlickOff = function () { 20714 $twitterSlider.each(function () { 20715 let $this = $(this); 20716 20717 if ($this.hasClass('slick-initialized')) { 20718 $this.slick('unslick'); 20719 } 20720 }); 20721 $twitterSlider = $('.tx-cw-twitter'); 20722 }; 20723 20724 if (window.innerWidth <= 1090) { 20725 twitterSlickOn() 20726 } 20727 20728 $(window).on('resize', function (e) { 20729 if (e.target.innerWidth <= 1090) { 20730 twitterSlickOn(); 20731 } else { 20732 twitterSlickOff(); 20733 } 20734 }); 20735 } 20736 20737 $('.hero-slider__item').on('click', function() { 20738 window.location.assign($(this).find('.hero-slider__item__more a').attr('href')); 20739 }); 20740 20741 $('.hero-slider__item__content').on('click', function() { 20742 window.location.assign($(this).find('.hero-slider__item__more a').attr('href')); 20743 }); 20744 20745 if($('[data-search]').length > 0) { 20746 let hidden_child = $('.page-grid__content.section-search .card.appel:nth-child(1n+9)'); 20747 hidden_child.attr('data-init', 'false') 20748 } 20749 20750 20751 $('[data-search]').on('keyup', function() { 20752 let count_results = filterInput('.page-grid__content.section-search', '.card.appel', $(this).val()); 20753 $('#count_results').text(count_results) 20754 }); 20755 20756 function filterInput(parentTarget, childTarget, value) { 20757 let results = $(parentTarget); 20758 let normalized = value.toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); 20759 if (normalized.includes(' ')) { 20760 let explode = normalized.split(' ') 20761 normalized = explode[0]; 20762 } 20763 if(value.length > 3) { 20764 let count = results.length; 20765 $.each(results.find(childTarget), function() { 20766 let card = $(this); 20767 let init = card.attr('data-init'); 20768 if(value === "" && init === "true") { 20769 card.addClass('d-flex').removeClass('d-none') 20770 count++; 20771 } else { 20772 let show = filterCard(card, normalized); 20773 if(show) { 20774 card.addClass('d-flex').removeClass('d-none').attr('data-init', 'true') 20775 count++; 20776 } 20777 else { 20778 count--; 20779 card.addClass('d-none').removeClass('d-flex') 20780 } 20781 } 20782 }); 20783 return results.find(childTarget+':visible').length; 20784 } else { 20785 let count = results.length; 20786 $.each(results.find(childTarget), function() { 20787 let card = $(this); 20788 let init = card.attr('data-init'); 20789 if(init === "true") { 20790 card.addClass('d-flex').removeClass('d-none') 20791 count++; 20792 } 20793 }); 20794 } 20795 return results.find(childTarget).length; 20796 } 20797 20798 function filterCard(htmlElement, value) { 20799 let result = false;
20800 if(htmlElement.children().length > 0) { 20801 $.each(htmlElement.children(), function() { 20802 let children = $(this); 20803 let text = children.text().trim().toLowerCase().normalize('NFD').replace(/[\u0300-\u036f]/g, ''); 20804 if ((text.includes(value))) { 20805 result = true; 20806 return false; 20807 } else { 20808 result = filterCard(children, value); 20809 } 20810 }); 20811 } 20812 return result; 20813 } 20814 20815 $('[data-load-more]').on('click', function () { 20816 let count = load_more(".page-grid__content.section-search", '.card.appel', 4); 20817 if(count === 0) $(this).remove(); 20818 }); 20819 20820 function load_more(parent, children, nbToShow) { 20821 let parentRow = $(parent); 20822 let notVisible = children+'[data-init="false"]'; 20823 let childrenItem = parentRow.find(notVisible); 20824 let toShow = childrenItem.slice(0,nbToShow); 20825 $.each(toShow, function (key, element) { 20826 $(element).addClass('d-flex').css('display', 'flex').attr('data-init', 'true') 20827 }); 20828 return parentRow.find(notVisible).length; 20829 } 20830 20831 $('[data-action="quickSearch"], [data-action="quickSearch"] .overlayCircle').on("click", function() { 20832 console.log('click'); 20833 let value = $(this).attr('data-action-value'); 20834 let facet = $(this).attr('data-action-facet'); 20835 let link = $('[data-facet-name="'+ facet +'"][data-facet-value="'+ value +'"]'); 20836 if(link.length > 0) { 20837 let tag = link.find('a') 20838 let href = tag.attr('href') 20839 window.location.href = href; 20840 return true; 20841 } 20842 }); 20843 20844 if($('#archive-newsletter').length > 0) { 20845 let hidden_child = $('#archive-newsletter .single-newsletter:nth-child(1n+9)'); 20846 hidden_child.attr('data-init', 'false') 20847 $('[data-load-more]').unbind('click').on('click', function () { 20848 let count = load_more("#archive-newsletter", '.single-newsletter', 4); 20849 if(count === 0) $(this).remove(); 20850 }); 20851 } 20852 20853})(jQuery); 20854 20855/* 20856 Auto font resize 20857 */ 20858jQuery(document).ready(function () { 20859 var changeFontSize = function () { 20860 $('.hero-fit-text').textfill({ 20861 innerTag: 'p', 20862 maxFontPixels: 30 20863 }); 20864 }; 20865 20866 changeFontSize(); 20867 $(window).on('resize', function () { 20868 changeFontSize(); 20869 }); 20870}); 20871 20872jQuery(document).ready(function ($) { 20873 let $timelineSmall = $('.timeline-small'); 20874 20875 if ($timelineSmall.length) { 20876 let currentDateFull = new Date().toJSON().slice(0, 10); 20877 let currentDate = new Date(currentDateFull); 20878 20879 let taskInProjectPosition = function (task) { 20880 let $projects = task.closest('.timeline-small').find('.timeline-small-header .project'); 20881 let positionInContent = null; 20882 20883 $projects.each(function () { 20884 let $project = $(this); 20885 if ($project.attr('data-start') && $project.attr('data-end')) { 20886 let projectStart = new Date($project.attr('data-start')); 20887 let projectEnd = new Date($project.attr('data-end')); 20888 let taskDate = new Date(task.attr('data-date')); 20889 20890 if (taskDate >= projectStart && taskDate <= projectEnd) { 20891 let outerWidth = $project.outerWidth(); 20892 let $next = $project.next('div'); 20893 while ($next.hasClass('project-skip')) { 20894 $next = $next.next('div'); 20895 } 20896 let positionStart = $project.position().left + outerWidth / 2; 20897 let positionEnd = null; 20898 20899 if ($next.length) { 20900 positionEnd = $next.position().left + outerWidth / 2; 20901 } 20902 20903 let positionInPercentage = Math.round(((taskDate - projectStart) / (projectEnd - projectStart)) * 100); 20904 20905 positionInContent = positionEnd !== null ? Math.round((positionEnd - positionStart) * positionInPercentage / 100) + positionStart : positionStart; 20906 } 20907 } 20908 }); 20909 20910 return positionInContent; 20911 }; 20912 20913 $timelineSmall.each(function () { 20914 let $timeline = $(this); 20915 20916 let $projects = $timeline.find('.timeline-small-header .project'); 20917 let $tasks = $timeline.find('.timeline-small-content'); 20918 let taskHeight = null; 20919 let tasksLines = []; 20920 20921 let taskTopPosition = function (taskLeftPosition, taskWidthEl) { 20922 for (let key = 0; key < tasksLines.length; key++) { 20923 if (tasksLines[key] < taskLeftPosition) { 20924 tasksLines[key] = taskLeftPosition + taskWidthEl + 30; 20925 return key; 20926 } 20927 } 20928 20929 let nextKey = tasksLines.length; 20930 tasksLines.push(taskLeftPosition + taskWidthEl + 30); 20931 return nextKey; 20932 }; 20933 20934 $tasks.find('.task').each(function () { 20935 let $task = $(this); 20936 20937 if (new Date($task.attr('data-date')) > currentDate) { 20938 $task.addClass('task-incoming'); 20939 } else { 20940 $task.addClass('task-done'); 20941 } 20942 20943 $task.clone().appendTo($projects.first().find('.tasks')); 20944 }); 20945 20946 let initTasks = function () { 20947 let timelineWidth = $timeline.width(); 20948 tasksLines = []; 20949 20950 $tasks.find('.task').each(function () { 20951 let $task = $(this); 20952 20953 if ($(window).width() > 768) { 20954 let taskWidthEl = $task.outerWidth(); 20955 let taskLeftPosition = taskInProjectPosition($task) - (taskWidthEl / 2); 20956 20957 if (taskHeight === null) { 20958 taskHeight = $task.outerHeight() + 20; 20959 } 20960 20961 if ((taskLeftPosition + taskWidthEl) > timelineWidth) { 20962 $task.find('.task-line').css('left', (taskWidthEl / 2) + ((taskLeftPosition + taskWidthEl) - timelineWidth) + 'px'); 20963 taskLeftPosition = timelineWidth - taskWidthEl; 20964 } 20965 20966 if (taskLeftPosition < 0) { 20967 $task.find('.task-line').css('left', (taskWidthEl / 2) + taskLeftPosition + 'px'); 20968 taskLeftPosition = 0; 20969 } 20970 20971 let numberOfLine = taskTopPosition(taskLeftPosition, taskWidthEl); 20972 20973 $task.css('left', taskLeftPosition + 'px'); 20974 $task.css('top', numberOfLine * taskHeight + 'px'); 20975 $task.attr('data-line', numberOfLine); 20976 } 20977 }); 20978 20979 if ($(window).width() > 768) { 20980 $tasks.find('.task').each(function () { 20981 $(this).css('zIndex', (tasksLines.length - parseInt($(this).attr('data-line'))) + 1); 20982 }); 20983 20984 $timeline.find('.timeline-small-content').height((Object.keys(tasksLines).length * taskHeight) + 10); 20985 } 20986 }; 20987 20988 initTasks(); 20989 $timeline.removeClass('load'); 20990 20991 let resizeTimer; 20992 $(window).on('resize', function () { 20993 clearTimeout(resizeTimer); 20994 20995 resizeTimer = setTimeout(function () { 20996 initTasks(); 20997 }, 250); 20998 20999 }); 21000 }); 21001 } 21002}); 21003 21004(function ($) { 21005 'use strict'; 21006 21007 $('.timeline').each(function() { 21008 let $timelineBig = $(this); 21009 this._timelineBig = { 21010 vars: { 21011 data: null, 21012 el: document.getElementById('visualization'), 21013 highlight: false, 21014 timeline: null, 21015 wrapper: $(this) 21016 }, 21017 customOrder: function (a, b) { 21018 let result = a.start - b.start; 21019 return result !== 0 ? result : (a.end - b.end); 21020 }, 21021 prepareData: function () { 21022 let self = this; 21023 self.vars.highlight = self.vars.wrapper.hasClass('highlight-generic'); 21024 let items = this.setData(); 21025 21026 let configuredHeight = this.vars.el.hasAttribute('data-height') ? parseInt(this.vars.el.attributes.getNamedItem('data-height').value) : 0; 21027 let options = { 21028 height: Math.max(isNaN(configuredHeight) ? 0 : configuredHeight, 600), //px 21029 locale: $('html').attr('lang'), 21030 order: this.customOrder, 21031 showCurrentTime: true, 21032 horizontalScroll: true, 21033 verticalScroll: true, 21034 selectable: false, 21035 type: 'range', 21036 start: new Date(), 21037 end: new Date(), 21038 orientation: { 21039 axis: 'top', 21040 item: 'top' 21041 }, 21042 zoomMin: 1000 * 60 * 60 * 24 * 31 * 12, // one week in milliseconds 21043 zoomMax: 1000 * 60 * 60 * 24 * 31 * 12, // one year in milliseconds 21044 template: function (item) { // (item, element, data) 21045 let style = ''; 21046 if (item.typeClass === 'generic') { 21047 let height = parseInt($('.timeline__mobile').data('generic-height')); 21048 if (height > 0) { 21049 style = ' style="height: ' + height + 'em;"'; 21050 } 21051 } 21052 return '<div class="item-type-' + item.typeClass + '" id="item' + item.id + '"' + style + '>' + item.html + '</div>'; 21053 } 21054 }; 21055 let groups = [ 21056 { 21057 id: 1, 21058 content: '' 21059 }, 21060 { 21061 id: 2, 21062 content: '' 21063 } 21064 ]; 21065 21066 self.vars.timeline = self.vars.highlight ? new vis.Timeline(self.vars.el, items, groups, options) : new vis.Timeline(self.vars.el, items, options); 21067 }, 21068 setData: function () { 21069 let self = this; 21070 let data = []; 21071 21072 self.vars.wrapper.find('.timeline-item').each(function () {
21073 let $this = $(this); 21074 21075 let item = { 21076 id: $this.data('uid'), 21077 start: $this.data('start'), 21078 end: $this.data('end'), 21079 typeClass: $this.data('type') + ($this.hasClass('timeline-item-early') ? ' early' : ''), 21080 className: $this.data('type') + ($this.hasClass('filter-search-hide') ? ' hide' : ''), 21081 html: $this.find('.timeline-item__content').html(), 21082 title: $this.find('.timeline-item__content').html(), 21083 limitSize: false 21084 }; 21085 21086 if (self.vars.highlight) { 21087 item.group = $this.data('type') === 'generic' ? 1 : 2; 21088 } 21089 21090 if (self.vars.data !== null) { 21091 if ($this.hasClass('hide')) { 21092 self.vars.data.remove(item); 21093 } else if (self.vars.data.get(item.id) === null) { 21094 self.vars.data.add(item); 21095 } 21096 } else { 21097 data.push(item); 21098 } 21099 }); 21100 21101 if (self.vars.data === null) { 21102 self.vars.data = new vis.DataSet(data, {fieldId: 'id', type: {start: 'ISODate', end: 'ISODate'}}); 21103 } 21104 21105 return self.vars.data; 21106 }, 21107 init: function () { 21108 this.prepareData(); 21109 } 21110 }; 21111 21112 let timelineFilterChange = function (el, manual) { 21113 let $this = manual === true ? el : $(this); 21114 21115 let section = $this.closest('.section-timeline'); 21116 let sectionCheckedElements = section.find('.timeline__filter input:checked').map(function () { 21117 return this.id; 21118 }).get(); 21119 21120 let items = section.find('.timeline__mobile .timeline-item'); 21121 21122 items.addClass('hide checkboxfilter'); 21123 21124 if (sectionCheckedElements.length < 1) { 21125 items.removeClass('checkboxfilter'); 21126 items.filter(':not(.textfilter)').removeClass('hide'); 21127 } else { 21128 sectionCheckedElements.forEach(function (el) { 21129 items.filter('[data-type="' + el + '"]').removeClass('checkboxfilter'); 21130 items.filter('[data-type="' + el + '"]:not(.textfilter)').removeClass('hide'); 21131 }); 21132 } 21133 21134 $timelineBig[0]._timelineBig.setData(); 21135 }; 21136 21137 setTimeout(function () { 21138 $(document).on('change', '.timeline__filter input[type="checkbox"]', timelineFilterChange); 21139 }, 100); 21140 21141 this._timelineBig.init(); 21142 (function() { 21143 let generic = [], other = []; 21144 $timelineBig.find('.timeline-item').not('.timeline-item-early').each(function() { 21145 let type = $(this).data('type'); 21146 if (type === 'generic') { 21147 generic.push(this); 21148 if (generic.length > 1) { 21149 $(generic.shift()).removeClass('show'); 21150 } 21151 } else { 21152 other.push(this); 21153 if (other.length > 3) { 21154 $(other.shift()).removeClass('show'); 21155 } 21156 } 21157 }); 21158 $(generic.concat(other)).addClass('show'); 21159 })(); 21160 21161 $(document).on('click touch', '.timeline__date-text', function () { 21162 $(this).prev().trigger('click'); 21163 }); 21164 }); 21165})(jQuery); 21166 21167//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImpxdWVyeS5qcyIsInBvcHBlci5taW4uanMiLCJpbmRleC5qcyIsInV0aWwuanMiLCJidXR0b24uanMiLCJjb2xsYXBzZS5qcyIsInRvb2x0aXAuanMiLCJkcm9wZG93bi5qcyIsIm1vZGFsLmpzIiwibW9tZW50LmpzIiwiZnIuanMiLCJkYXRlcGlja2VyLmpzIiwianF1ZXJ5LnRleHRmaWxsLm1pbi5qcyIsImpzLmNvb2tpZS5qcyIsImx1bnIubWluLmpzIiwic2xpY2subWluLmpzIiwidmlzLm1pbi5qcyIsImFmdGVyL2x1bnIuc3RlbW1lci5zdXBwb3J0Lm1pbi5qcyIsImRhdGVwaWNrZXIuZnItRlIuanMiLCJsdW5yLmZyLm1pbi5qcyIsIm1haW4uanMiLCJhdXRvY29tcGxldGUuanMiLCJjb250YWN0LmpzIiwibHVuci5mYXEtc2VhcmNoLXVzYWdlLmpzIiwibHVuci5mYXEtc2VhcmNoLmpzIiwibHVuci50aW1lbGluZS1zZWFyY2gtdXNhZ2UuanMiLCJsdW5yLnRpbWVsaW5lLXNlYXJjaC5qcyIsIm1lbnUuanMiLCJuZXdzLmpzIiwicG9wdXAuanMiLCJzbGlkZXJzLmpzIiwidGltZWxpbmUtc21hbGwuanMiLCJ0aW1lbGluZS5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB
21167Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7
21167QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD
21167QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB
21167QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1blVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMxSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3RLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUN0WEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFD
21167QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzlwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDdGRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3JrQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB
21167QUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNB
21167O0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUMxL0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQzE5
21167Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ25LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ05BO0FBQ0E7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDOUNBO0FBQ0E7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNqQkE7QUFDQTtBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM5RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ3hJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNoSUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQy9LQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUM1SUE
211677QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQ2pKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FDbklBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJmaWxlIjoibWFpbi5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8qIVxuICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjFcbiAqIGh0dHBzOi8vanF1ZXJ5LmNvbS9cbiAqXG4gKiBJbmNsdWRlcyBTaXp6bGUuanNcbiAqIGh0dHBzOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WlxuICovXG4oIGZ1bmN0aW9uKCBnbG9iYWwsIGZhY3RvcnkgKSB7XG5cblx0XCJ1c2Ugc3RyaWN0XCI7XG5cblx0aWYgKCB0eXBlb2YgbW9kdWxlID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBtb2R1bGUuZXhwb3J0cyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIEZvciBDb21tb25KUyBhbmQgQ29tbW9uSlMtbGlrZSBlbnZpcm9ubWVud
21167HMgd2hlcmUgYSBwcm9wZXIgYHdpbmRvd2Bcblx0XHQvLyBpcyBwcmVzZW50LCBleGVjdXRlIHRoZSBmYWN0b3J5IGFuZCBnZXQgalF1ZXJ5LlxuXHRcdC8vIEZvciBlbnZpcm9ubWVudHMgdGhhdCBkbyBub3QgaGF2ZSBhIGB3aW5kb3dgIHdpdGggYSBgZG9jdW1lbnRgXG5cdFx0Ly8gKHN1Y2ggYXMgTm9kZS5qcyksIGV4cG9zZSBhIGZhY3RvcnkgYXMgbW9kdWxlLmV4cG9ydHMuXG5cdFx0Ly8gVGhpcyBhY2NlbnR1YXRlcyB0aGUgbmVlZCBmb3IgdGhlIGNyZWF0aW9uIG9mIGEgcmVhbCBgd2luZG93YC5cblx0XHQvLyBlLmcuIHZhciBqUXVlcnkgPSByZXF1aXJlKFwianF1ZXJ5XCIpKHdpbmRvdyk7XG5cdFx0Ly8gU2VlIHRpY2tldCAjMTQ1NDkgZm9yIG1vcmUgaW5mby5cblx0XHRtb2R1bGUuZXhwb3J0cyA9IGdsb2JhbC5kb2N1bWVudCA/XG5cdFx0XHRmYWN0b3J5KCBnbG9iYWwsIHRydWUgKSA6XG5cdFx0XHRmdW5jdGlvbiggdyApIHtcblx0XHRcdFx0aWYgKCAhdy5kb2N1bWVudCApIHtcblx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoIFwialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudFwiICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIGZhY3RvcnkoIHcgKTtcblx0XHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0ZmFjdG9yeSggZ2xvYmFsICk7XG5cdH1cblxuLy8gUGFzcyB0aGlzIGlmIHdpbmRvdyBpcyBub3QgZGVmaW5lZCB5ZXRcbn0gKSggdHlwZW9mIHdpbmRvdyAhPT0gXCJ1bmRlZmluZWRcIiA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCB3aW5kb3csIG5vR2xvYmFsICkge1xuXG4vLyBFZGdlIDw9IDEyIC0gMTMrLCBGaXJlZm94IDw9MTggLSA0NSssIElFIDEwIC0gMTEsIFNhZmFyaSA1LjEgLSA5KywgaU9TIDYgLSA5LjFcbi8vIHRocm93IGV4Y2VwdGlvbnMgd2hlbiBub24tc3RyaWN0IGNvZGUgKGUuZy4sIEFTUC5ORVQgNC41KSBhY2Nlc3NlcyBzdHJpY3QgbW9kZVxuLy8gYXJndW1lbnRzLmNhbGxlZS5jYWxsZXIgKHRyYWMtMTMzMzUpLiBCdXQgYXMgb2YgalF1ZXJ5IDMuMCAoMjAxNiksIHN0cmljdCBtb2RlIHNob3VsZCBiZSBjb21tb25cbi8vIGVub3VnaCB0aGF0IGFsbCBzdWNoIGF0dGVtcHRzIGFyZSBndWFyZGVkIGluIGEgdHJ5IGJsb2NrLlxuXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciBhcnIgPSBbXTtcblxudmFyIGRvY3VtZW50ID0gd2luZG93LmRvY3VtZW50O1xuXG52YXIgZ2V0UHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2Y7XG5cbnZhciBzbGljZSA9IGFyci5zbGljZTtcblxudmFyIGNvbmNhdCA9IGFyci5jb25jYXQ7XG5cbnZhciBwdXNoID0gYXJyLnB1c2g7XG5cbnZhciBpbmRleE9mID0gYXJyLmluZGV4T2Y7XG5cbnZhciBjbGFzczJ0eXBlID0ge307XG5cbnZhciB0b1N0cmluZyA9IGNsYXNzMnR5cGUudG9TdHJpbmc7XG5cbnZhciBoYXNPd24gPSBjbGFzczJ0eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZm5Ub1N0cmluZyA9IGhhc093bi50b1N0cmluZztcblxudmFyIE9iamVjdEZ1bmN0aW9uU3RyaW5nID0gZm5Ub1N0cmluZy5jYWxsKCBPYmplY3QgKTtcblxudmFyIHN1cHBvcnQgPSB7fTtcblxudmFyIGlzRnVuY3Rpb24gPSBmdW5jdGlvbiBpc0Z1bmN0aW9uKCBvYmogKSB7XG5cbiAgICAgIC8vIFN1cHBvcnQ6IENocm9tZSA8PTU3LCBGaXJlZm94IDw9NTJcbiAgICAgIC8vIEluIHNvbWUgYnJvd3NlcnMsIHR5cGVvZiByZXR1cm5zIFwiZnVuY3Rpb25cIiBmb3IgSFRNTCA8b2JqZWN0PiBlbGVtZW50c1xuICAgICAgLy8gKGkuZS4sIGB0eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvYmplY3RcIiApID09PSBcImZ1bmN0aW9uXCJgKS5cbiAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gY2xhc3NpZnkgKmFueSogRE9NIG5vZGUgYXMgYSBmdW5jdGlvbi5cbiAgICAgIHJldHVybiB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgJiYgdHlwZW9mIG9iai5ub2RlVHlwZSAhPT0gXCJudW1iZXJcIjtcbiAgfTtcblxuXG52YXIgaXNXaW5kb3cgPSBmdW5jdGlvbiBpc1dpbmRvdyggb2JqICkge1xuXHRcdHJldHVybiBvYmogIT0gbnVsbCAmJiBvYmogPT09IG9iai53aW5kb3c7XG5cdH07XG5cblxuXG5cblx0dmFyIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgPSB7XG5cdFx0dHlwZTogdHJ1ZSxcblx0XHRzcmM6IHRydWUsXG5cdFx0bm9Nb2R1bGU6IHRydWVcblx0fTtcblxuXHRmdW5jdGlvbiBET01FdmFsKCBjb2RlLCBkb2MsIG5vZGUgKSB7XG5cdFx0ZG9jID0gZG9jIHx8IGRvY3VtZW50O1xuXG5cdFx0dmFyIGksXG5cdFx0XHRzY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXG5cdFx0c2NyaXB0LnRleHQgPSBjb2RlO1xuXHRcdGlmICggbm9kZSApIHtcblx0XHRcdGZvciAoIGkgaW4gcHJlc2VydmVkU2NyaXB0QXR0cmlidXRlcyApIHtcblx0XHRcdFx0aWYgKCBub2RlWyBpIF0gKSB7XG5cdFx0XHRcdFx0c2NyaXB0WyBpIF0gPSBub2RlWyBpIF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZG9jLmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHR9XG5cblxuZnVuY3Rpb24gdG9UeXBlKCBvYmogKSB7XG5cdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0cmV0dXJuIG9iaiArIFwiXCI7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHkgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0cmV0dXJuIHR5cGVvZiBvYmogPT09IFwib2JqZWN0XCIgfHwgdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiID9cblx0XHRjbGFzczJ0eXBlWyB0b1N0cmluZy5jYWxsKCBvYmogKSBdIHx8IFwib2JqZWN0XCIgOlxuXHRcdHR5cGVvZiBvYmo7XG59XG4vKiBnbG9iYWwgU3ltYm9sICovXG4vLyBEZWZpbmluZyB0aGlzIGdsb2JhbCBpbiAuZXNsaW50cmMuanNvbiB3b3VsZCBjcmVhdGUgYSBkYW5nZXIgb2YgdXNpbmcgdGhlIGdsb2JhbFxuLy8gdW5ndWFyZGVkIGluIGFub3RoZXIgcGxhY2UsIGl0IHNlZW1zIHNhZmVyIHRvIGRlZmluZSBnbG9iYWwgb25seSBmb3IgdGhpcyBtb2R1bGVcblxuXG5cbnZhclxuXHR2ZXJzaW9uID0gXCIzLjMuMVwiLFxuXG5cdC8vIERlZmluZSBhIGxvY2FsIGNvcHkgb2YgalF1ZXJ5XG5cdGpRdWVyeSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblxuXHRcdC8vIFRoZSBqUXVlcnkgb2JqZWN0IGlzIGFjdHVhbGx5IGp1c3QgdGhlIGluaXQgY29uc3RydWN0b3IgJ2VuaGFuY2VkJ1xuXHRcdC8vIE5lZWQgaW5pdCBpZiBqUXVlcnkgaXMgY2FsbGVkIChqdXN0IGFsbG93IGVycm9yIHRvIGJlIHRocm93biBpZiBub3QgaW5jbHVkZWQpXG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuZm4uaW5pdCggc2
21167VsZWN0b3IsIGNvbnRleHQgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nO1xuXG5qUXVlcnkuZm4gPSBqUXVlcnkucHJvdG90eXBlID0ge1xuXG5cdC8vIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgalF1ZXJ5IGJlaW5nIHVzZWRcblx0anF1ZXJ5OiB2ZXJzaW9uLFxuXG5cdGNvbnN0cnVjdG9yOiBqUXVlcnksXG5cblx0Ly8gVGhlIGRlZmF1bHQgbGVuZ3RoIG9mIGEgalF1ZXJ5IG9iamVjdCBpcyAwXG5cdGxlbmd0aDogMCxcblxuXHR0b0FycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHR9LFxuXG5cdC8vIEdldCB0aGUgTnRoIGVsZW1lbnQgaW4gdGhlIG1hdGNoZWQgZWxlbWVudCBzZXQgT1Jcblx0Ly8gR2V0IHRoZSB3aG9sZSBtYXRjaGVkIGVsZW1lbnQgc2V0IGFzIGEgY2xlYW4gYXJyYXlcblx0Z2V0OiBmdW5jdGlvbiggbnVtICkge1xuXG5cdFx0Ly8gUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgaW4gYSBjbGVhbiBhcnJheVxuXHRcdGlmICggbnVtID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gc2xpY2UuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiBqdXN0IHRoZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBzZXRcblx0XHRyZXR1cm4gbnVtIDwgMCA/IHRoaXNbIG51bSArIHRoaXMubGVuZ3RoIF0gOiB0aGlzWyBudW0gXTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhaXNGdW5jdGlvbiggdGFyZ2V0ICkgKSB7XG5cdFx0dGFyZ2V0ID0ge307XG5cdH1cblxuXHQvLyBFeHRlbmQgalF1ZXJ5IGl0c2VsZiBpZiBvbmx5IG9uZSBhcmd1bWVudCBpcyBwYXNzZWRcblx0aWYgKCBpID09PSBsZW5ndGggKSB7XG5cdFx0dGFyZ2V0ID0gdGhpcztcblx0XHRpLS07XG5cdH1cblxuXHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblxuXHRcdC8vIE9ubHkgZGVhbCB3aXRoIG5vbi1udWxsL3VuZGVmaW5lZCB2YWx1ZXNcblx0XHRpZiAoICggb3B0aW9ucyA9IGFyZ3VtZW50c1sgaSBdICkgIT0gbnVsbCApIHtcblxuXHRcdFx0Ly8gRXh0ZW5kIHRoZSBiYXNlIG9iamVjdFxuXHRcdFx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdFx0XHRzcmMgPSB0YXJnZXRbIG5hbWUgXTtcblx0XHRcdFx0Y29weSA9IG9wdGlvbnNbIG5hbWUgXTtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG5ldmVyLWVuZGluZyBsb29wXG5cdFx0XHRcdGlmICggdGFyZ2V0ID09PSBjb3B5ICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUmVjdXJzZSBpZiB3ZSdyZSBtZXJnaW5nIHBsYWluIG9iamVjdHMgb3IgYXJyYXlzXG5cdFx0XHRcdGlmICggZGVlcCAmJi
21167Bjb3B5ICYmICggalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvcHkgKSB8fFxuXHRcdFx0XHRcdCggY29weUlzQXJyYXkgPSBBcnJheS5pc0FycmF5KCBjb3B5ICkgKSApICkge1xuXG5cdFx0XHRcdFx0aWYgKCBjb3B5SXNBcnJheSApIHtcblx0XHRcdFx0XHRcdGNvcHlJc0FycmF5ID0gZmFsc2U7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBBcnJheS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIHByb3RvLCBDdG9yO1xuXG5cdFx0Ly8gRGV0ZWN0IG9idmlvdXMgbmVnYXRpdmVzXG5cdFx0Ly8gVXNlIHRvU3RyaW5nIGluc3RlYWQgb2YgalF1ZXJ5LnR5cGUgdG8gY2F0Y2ggaG9zdCBvYmplY3RzXG5cdFx0aWYgKCAhb2JqIHx8IHRvU3RyaW5nLmNhbGwoIG9iaiApICE9PSBcIltvYmplY3QgT2JqZWN0XVwiICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHByb3RvID0gZ2V0UHJvdG8oIG9iaiApO1xuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIG5vI
21167HByb3RvdHlwZSAoZS5nLiwgYE9iamVjdC5jcmVhdGUoIG51bGwgKWApIGFyZSBwbGFpblxuXHRcdGlmICggIXByb3RvICkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gT2JqZWN0cyB3aXRoIHByb3RvdHlwZSBhcmUgcGxhaW4gaWZmIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSBhIGdsb2JhbCBPYmplY3QgZnVuY3Rpb25cblx0XHRDdG9yID0gaGFzT3duLmNhbGwoIHByb3RvLCBcImNvbnN0cnVjdG9yXCIgKSAmJiBwcm90by5jb25zdHJ1Y3Rvcjtcblx0XHRyZXR1cm4gdHlwZW9mIEN0b3IgPT09IFwiZnVuY3Rpb25cIiAmJiBmblRvU3RyaW5nLmNhbGwoIEN0b3IgKSA9PT0gT2JqZWN0RnVuY3Rpb25TdHJpbmc7XG5cdH0sXG5cblx0aXNFbXB0eU9iamVjdDogZnVuY3Rpb24oIG9iaiApIHtcblxuXHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG5cdFx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lc2xpbnQvZXNsaW50L2lzc3Vlcy82MTI1XG5cdFx0dmFyIG5hbWU7XG5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0RE9NRXZhbCggY29kZSApO1xuXHR9LFxuXG5cdGVhY2g6IGZ1bmN0aW9uKCBvYmosIGNhbGxiYWNrICkge1xuXHRcdHZhciBsZW5ndGgsIGkgPSAwO1xuXG5cdFx0aWYgKCBpc0FycmF
211675TGlrZSggb2JqICkgKSB7XG5cdFx0XHRsZW5ndGggPSBvYmoubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2suY2FsbCggb2JqWyBpIF0sIGksIG9ialsgaSBdICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoIGkgaW4gb2JqICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBvYmo7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cblxuLy8gUG9wdWxhdGUgdGhlIGNsYXNzMnR5cGUgbWFwXG5qUXVlcnkuZWFjaCggXCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbFwiLnNwbGl0KCBcIiBcIiApLFxuZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdGNsYXNzMnR5cGVbIFwiW29iamVjdCBcIiArIG5hbWUgKyBcIl1cIiBdID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xufSApO1xuXG5mdW5jdGlvbiBpc0FycmF
211675TGlrZSggb2JqICkge1xuXG5cdC8vIFN1cHBvcnQ6IHJlYWwgaU9TIDguMiBvbmx5IChub3QgcmVwcm9kdWNpYmxlIGluIHNpbXVsYXRvcilcblx0Ly8gYGluYCBjaGVjayB1c2VkIHRvIHByZXZlbnQgSklUIGVycm9yIChnaC0yMTQ1KVxuXHQvLyBoYXNPd24gaXNuJ3QgdXNlZCBoZXJlIGR1ZSB0byBmYWxzZSBuZWdhdGl2ZXNcblx0Ly8gcmVnYXJkaW5nIE5vZGVsaXN0IGxlbmd0aCBpbiBJRVxuXHR2YXIgbGVuZ3RoID0gISFvYmogJiYgXCJsZW5ndGhcIiBpbiBvYmogJiYgb2JqLmxlbmd0aCxcblx0XHR0eXBlID0gdG9UeXBlKCBvYmogKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIG9iaiApIHx8IGlzV2luZG93KCBvYmogKSApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXR1cm4gdHlwZSA9PT0gXCJhcnJheVwiIHx8IGxlbmd0aCA9PT0gMCB8fFxuXHRcdHR5cGVvZiBsZW5ndGggPT09IFwibnVtYmVyXCIgJiYgbGVuZ3RoID4gMCAmJiAoIGxlbmd0aCAtIDEgKSBpbiBvYmo7XG59XG52YXIgU2l6emxlID1cbi8qIVxuICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy4zXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9yc1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKiBodHRwOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxNi0wOC0wOFxuICovXG4oZnVuY3Rpb24oIHdpbmRvdyApIHtcblxudmFyIGksXG5cdHN1cHBvcnQsXG5cdEV4cHIsXG5cdGdldFRleHQsXG5cdGlzWE1MLFxuXHR0b2tlbml6ZSxcblx0Y29tcGlsZSxcblx0c2VsZWN0LFxuXHRvdXRlcm1vc3RDb250ZXh0LFxuXHRzb3J0SW5wdXQsXG5cdGhhc0R1cGxpY2F0ZSxcblxuXHQvLyBMb2NhbCBkb2N1bWVudCB2YXJzXG5cdHNldERvY3VtZW50LFxuXHRkb2N1bWVudCxcblx0ZG9jRWxlbSxcblx0ZG9jdW1lbnRJc0hUTUwsXG5cdHJidWdneVFTQSxcblx0cmJ1Z2d5TWF0Y2hlcyxcblx0bWF0Y2hlcyxcblx0Y29udGFpbnMsXG5cblx0Ly8gSW5zdGFuY2Utc3BlY2lmaWMgZGF0YVxuXHRleHBhbmRvID0gXCJzaXp6bGVcIiArIDEgKiBuZXcgRGF0ZSgpLFxuXHRwcmVmZXJyZWREb2MgPSB3aW5kb3cuZG9jdW1lbnQsXG5cdGRpcnJ1bnMgPSAwLFxuXHRkb25lID0gMCxcblx0Y2xhc3NDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHRva2VuQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHRjb21waWxlckNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0c29ydE9yZGVyID0gZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHR9XG5cdFx0cmV0dXJuIDA7XG5cdH0sXG5cblx0Ly8gSW5zdGFuY2UgbWV0aG9kc1xuXHRoYXNPd24gPSAoe30pLmhhc093blByb3BlcnR5LFxuXHRhcnIgPSBbXSxcblx0cG9wID0gYXJyLnBvcCxcblx0cHVzaF9uYXRpdmUgPSBhcnIucHVzaCxcblx0cHVzaCA9IGFyci5wdXNoLFxuXHRzbGljZSA9IGFyci5zbGljZSxcblx0Ly8gVXNlIGEgc3RyaXBwZWQtZG93biBpbmRleE9mIGFzIGl0J3MgZmFzdGVyIHRoYW4gbmF0aXZlXG5cdC8vIGh0dHBzOi8vanNwZXJmLmNvbS90aG9yLWluZGV4b2YtdnMtZm9yLzVcblx0aW5kZXhPZiA9IGZ1bmN0aW9uKCBsaXN0LCBlbGVtICkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdGxlbiA9IGxpc3QubGVuZ3RoO1xuXHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0aWYgKCBsaXN0W2ldID09PSBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIC0xO1xuXHR9LFxuXG5cdGJvb2xlYW5zID0gXCJjaGVja2VkfHNlbGVjdGVkfGFzeW5jfGF1dG9mb2N1c3xhdXRvcGxheXxjb250cm9sc3xkZWZlcnxkaXNhYmxlZHxoaWRkZW58aXNtYXB8bG9vcHxtdWx0aXBsZXxvcGVufHJlYWRvbmx5fHJlcXVpcmVkfHNjb3BlZFwiLFxuXG5cdC8vIFJlZ3VsYXIgZXhwcmVzc2lvbnNcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLXNlbGVjdG9ycy8jd2hpdGVzcGFjZVxuXHR3aGl0ZXNwYWNlID0gXCJbXFxcXHgyMFxcXFx0XFxcXHJcXFxcblxcXFxmXVwiLFxuXG5cdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCN2YWx1ZS1kZWYtaWRlbnRpZmllclxuXHRpZGVudGlmaWVyID0gXCIoPzpcXFxcXFxcXC58W1xcXFx3LV18W15cXDAtXFxcXHhhMF0pK1wiLFxuXG5cdC8vIEF0dHJpYnV0ZSBzZWxlY3RvcnM6IGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jYXR0cmlidXRlLXNlbGVjdG9yc1xuXHRhdHRyaWJ1dGVzID0gXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIE9wZXJhdG9yIChjYXB0dXJlIDIpXG5cdFx0XCIqKFsqXiR8IX5dPz0pXCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBcIkF0dHJpYnV0ZSB2YWx1ZXMgbXVzdCBiZSBDU1MgaWRlbnRpZmllcnMgW2NhcHR1cmUgNV0gb3Igc3RyaW5ncyBbY2FwdHVyZSAzIG9yIGNhcHR1cmUgNF1cIlxuXHRcdFwiKig/OicoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcInwoXCIgKyBpZGVudGlmaWVyICsgXCIpKXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcIipcXFxcXVwiLFxuXG5cdHBzZXVkb3MgPSBcIjooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XFxcXCgoXCIgK1xuXHRcdC8vIFRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHNlbGVjdG9ycyBuZWVkaW5nIHRva2VuaXplIGluIHRoZSBwcmVGaWx0ZXIsIHByZWZlciBhcmd1bWVudHM6XG5cdFx0Ly8gMS4gcXVvdGVkIChjYXB0dXJlIDM7IGNhcHR1cmUgNCBvciBjYXB0dXJlIDUpXG5cdFx0XCIoJygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwiKXxcIiArXG5cdFx0Ly8gMi4gc2ltcGxlIChjYXB0dXJlIDYpXG5cdFx0XCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFwoKVtcXFxcXV18XCIgKyBhdHRyaWJ1dGVzICsgXCIpKil8XCIgK1xuXHRcdC8vIDMuIGFueXRoaW5nIGVsc2UgKGNhcHR1cmUgMilcblx0XHRcIi4qXCIgK1xuXHRcdFwiKVxcXFwpfClcIixcblxuXHQvLyBMZWFkaW5nIGFuZCBub24tZXNjYXBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBjYXB0dXJpbmcgc29tZSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXJzIHByZWNlZGluZyB0aGUgbGF0dGVyXG5cdHJ3aGl0ZXNwYWNlID0gbmV3IFJlZ0V4cCggd2hpdGVzcGFjZSArIFwiK1wiLCBcImdcIiApLFxuXHRydHJpbSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiK3woKD86XnxbXlxcXFxcXFxcXSkoPzpcXFxcXFxcXC4pKilcIiArIH
21167doaXRlc3BhY2UgKyBcIiskXCIsIFwiZ1wiICksXG5cblx0cmNvbW1hID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqLFwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cdHJjb21iaW5hdG9ycyA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKihbPit+XXxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXG5cdHJhdHRyaWJ1dGVRdW90ZXMgPSBuZXcgUmVnRXhwKCBcIj1cIiArIHdoaXRlc3BhY2UgKyBcIiooW15cXFxcXSdcXFwiXSo/KVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFxdXCIsIFwiZ1wiICksXG5cblx0cnBzZXVkbyA9IG5ldyBSZWdFeHAoIHBzZXVkb3MgKSxcblx0cmlkZW50aWZpZXIgPSBuZXcgUmVnRXhwKCBcIl5cIiArIGlkZW50aWZpZXIgKyBcIiRcIiApLFxuXG5cdG1hdGNoRXhwciA9IHtcblx0XHRcIklEXCI6IG5ldyBSZWdFeHAoIFwiXiMoXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIkNMQVNTXCI6IG5ldyBSZWdFeHAoIFwiXlxcXFwuKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJUQUdcIjogbmV3IFJlZ0V4cCggXCJeKFwiICsgaWRlbnRpZmllciArIFwifFsqXSlcIiApLFxuXHRcdFwiQVRUUlwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIGF0dHJpYnV0ZXMgKSxcblx0XHRcIlBTRVVET1wiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHBzZXVkb3MgKSxcblx0XHRcIkNISUxEXCI6IG5ldyBSZWdFeHAoIFwiXjoob25seXxmaXJzdHxsYXN0fG50aHxudGgtbGFzdCktKGNoaWxkfG9mLXR5cGUpKD86XFxcXChcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKGV2ZW58b2RkfCgoWystXXwpKFxcXFxkKilufClcIiArIHdoaXRlc3BhY2UgKyBcIiooPzooWystXXwpXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihcXFxcZCspfCkpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KVwiLCBcImlcIiApLFxuXHRcdFwiYm9vbFwiOiBuZXcgUmVnRXhwKCBcIl4oPzpcIiArIGJvb2xlYW5zICsgXCIpJFwiLCBcImlcIiApLFxuXHRcdC8vIEZvciB1c2UgaW4gbGlicmFyaWVzIGltcGxlbWVudGluZyAuaXMoKVxuXHRcdC8vIFdlIHVzZSB0aGlzIGZvciBQT1MgbWF0Y2hpbmcgaW4gYHNlbGVjdGBcblx0XHRcIm5lZWRzQ29udGV4dFwiOiBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcXFwoXCIgK1xuXHRcdFx0d2hpdGVzcGFjZSArIFwiKigoPzotXFxcXGQpP1xcXFxkKilcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpKD89W14tXXwkKVwiLCBcImlcIiApXG5cdH0sXG5cblx0cmlucHV0cyA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksXG5cdHJoZWFkZXIgPSAvXmhcXGQkL2ksXG5cblx0cm5hdGl2ZSA9IC9eW157XStcXHtcXHMqXFxbbmF0aXZlIFxcdy8sXG5cblx0Ly8gRWFzaWx5LXBhcnNlYWJsZS9yZXRyaWV2YWJsZSBJRCBvciBUQUcgb3IgQ0xBU1Mgc2VsZWN0b3JzXG5cdHJxdWlja0V4cHIgPSAvXig/OiMoW1xcdy1dKyl8KFxcdyspfFxcLihbXFx3LV0rKSkkLyxcblxuXHRyc2libGluZyA9IC9bK35dLyxcblxuXHQvLyBDU1MgZXNjYXBlc1xuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjZXNjYXBlZC1jaGFyYWN0ZXJzXG5cdHJ1bmVzY2FwZSA9IG5ldyBSZWdFeHAoIFwiXFxcXFxcXFwoW1xcXFxkYS1mXXsxLDZ9XCIgKyB3aGl0ZXNwYWNlICsgXCI/fChcIiArIHdoaXRlc3BhY2UgKyBcIil8LilcIiwgXCJpZ1wiICksXG5cdGZ1bmVzY2FwZSA9IGZ1bmN0aW9uKCBfLCBlc2NhcGVkLCBlc2NhcGVkV2hpdGVzcGFjZSApIHtcblx0XHR2YXIgaGlnaCA9IFwiMHhcIiArIGVzY2FwZWQgLSAweDEwMDAwO1xuXHRcdC8vIE5hTiBtZWFucyBub24tY29kZXBvaW50XG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyNFxuXHRcdC8vIFdvcmthcm91bmQgZXJyb25lb3VzIG51bWVyaWMgaW50ZXJwcmV0YXRpb24gb2YgK1wiMHhcIlxuXHRcdHJldHVybiBoaWdoICE9PSBoaWdoIHx8IGVzY2FwZWRXaGl0ZXNwYWNlID9cblx0XHRcdGVzY2FwZWQgOlxuXHRcdFx0aGlnaCA8IDAgP1xuXHRcdFx0XHQvLyBCTVAgY29kZXBvaW50XG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggKyAweDEwMDAwICkgOlxuXHRcdFx0XHQvLyBTdXBwbGVtZW50YWwgUGxhbmUgY29kZXBvaW50IChzdXJyb2dhdGUgcGFpcilcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCA+PiAxMCB8IDB4RDgwMCwgaGlnaCAmIDB4M0ZGIHwgMHhEQzAwICk7XG5cdH0sXG5cblx0Ly8gQ1NTIHN0cmluZy9pZGVudGlmaWVyIHNlcmlhbGl6YXRpb25cblx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNjb21tb24tc2VyaWFsaXppbmctaWRpb21zXG5cdHJjc3Nlc2NhcGUgPSAvKFtcXDAtXFx4MWZcXHg3Zl18Xi0/XFxkKXxeLSR8W15cXDAtXFx4MWZcXHg3Zi1cXHVGRkZGXFx3LV0vZyxcblx0ZmNzc2VzY2FwZSA9IGZ1bmN0aW9uKCBjaCwgYXNDb2RlUG9pbnQgKSB7XG5cdFx0aWYgKCBhc0NvZGVQb2ludCApIHtcblxuXHRcdFx0Ly8gVSswMDAwIE5VTEwgYmVjb21lcyBVK0ZGRkQgUkVQTEFDRU1FTlQgQ0hBUkFDVEVSXG5cdFx0XHRpZiAoIGNoID09PSBcIlxcMFwiICkge1xuXHRcdFx0XHRyZXR1cm4gXCJcXHVGRkZEXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnRyb2wgY2hhcmFjdGVycyBhbmQgKGRlcGVuZGVudCB1cG9uIHBvc2l0aW9uKSBudW1iZXJzIGdldCBlc2NhcGVkIGFzIGNvZGUgcG9pbnRzXG5cdFx0XHRyZXR1cm4gY2guc2xpY2UoIDAsIC0xICkgKyBcIlxcXFxcIiArIGNoLmNoYXJDb2RlQXQoIGNoLmxlbmd0aCAtIDEgKS50b1N0cmluZyggMTYgKSArIFwiIFwiO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyIHBvdGVudGlhbGx5LXNwZWNpYWwgQVNDSUkgY2hhcmFjdGVycyBnZXQgYmFja3NsYXNoLWVzY2FwZWRcblx0XHRyZXR1cm4gXCJcXFxcXCIgKyBjaDtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fSxcblxuXHRkaXNhYmxlZEFuY2VzdG9yID0gYWRkQ29tYmluYXRvcihcblx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybi
21167BlbGVtLmRpc2FibGVkID09PSB0cnVlICYmIChcImZvcm1cIiBpbiBlbGVtIHx8IFwibGFiZWxcIiBpbiBlbGVtKTtcblx0XHR9LFxuXHRcdHsgZGlyOiBcInBhcmVudE5vZGVcIiwgbmV4dDogXCJsZWdlbmRcIiB9XG5cdCk7XG5cbi8vIE9wdGltaXplIGZvciBwdXNoLmFwcGx5KCBfLCBOb2RlTGlzdCApXG50cnkge1xuXHRwdXNoLmFwcGx5KFxuXHRcdChhcnIgPSBzbGljZS5jYWxsKCBwcmVmZXJyZWREb2MuY2hpbGROb2RlcyApKSxcblx0XHRwcmVmZXJyZWREb2MuY2hpbGROb2Rlc1xuXHQpO1xuXHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMFxuXHQvLyBEZXRlY3Qgc2lsZW50bHkgZmFpbGluZyBwdXNoLmFwcGx5XG5cdGFyclsgcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMubGVuZ3RoIF0ubm9kZVR5cGU7XG59IGNhdGNoICggZSApIHtcblx0cHVzaCA9IHsgYXBwbHk6IGFyci5sZW5ndGggP1xuXG5cdFx0Ly8gTGV2ZXJhZ2Ugc2xpY2UgaWYgcG9zc2libGVcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHRwdXNoX25hdGl2ZS5hcHBseSggdGFyZ2V0LCBzbGljZS5jYWxsKGVscykgKTtcblx0XHR9IDpcblxuXHRcdC8vIFN1cHBvcnQ6IElFPDlcblx0XHQvLyBPdGhlcndpc2UgYXBwZW5kIGRpcmVjdGx5XG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0dmFyIGogPSB0YXJnZXQubGVuZ3RoLFxuXHRcdFx0XHRpID0gMDtcblx0XHRcdC8vIENhbid0IHRydXN0IE5vZGVMaXN0Lmxlbmd0aFxuXHRcdFx0d2hpbGUgKCAodGFyZ2V0W2orK10gPSBlbHNbaSsrXSkgKSB7fVxuXHRcdFx0dGFyZ2V0Lmxlbmd0aCA9IGogLSAxO1xuXHRcdH1cblx0fTtcbn1cblxuZnVuY3Rpb24gU2l6emxlKCBzZWxlY3RvciwgY29udGV4dCwgcmVzdWx0cywgc2VlZCApIHtcblx0dmFyIG0sIGksIGVsZW0sIG5pZCwgbWF0Y2gsIGdyb3VwcywgbmV3U2VsZWN0b3IsXG5cdFx0bmV3Q29udGV4dCA9IGNvbnRleHQgJiYgY29udGV4dC5vd25lckRvY3VtZW50LFxuXG5cdFx0Ly8gbm9kZVR5cGUgZGVmYXVsdHMgdG8gOSwgc2luY2UgY29udGV4dCBkZWZhdWx0cyB0byBkb2N1bWVudFxuXHRcdG5vZGVUeXBlID0gY29udGV4dCA/IGNvbnRleHQubm9kZVR5cGUgOiA5O1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFJldHVybiBlYXJseSBmcm9tIGNhbGxzIHdpdGggaW52YWxpZCBzZWxlY3RvciBvciBjb250ZXh0XG5cdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiIHx8ICFzZWxlY3RvciB8fFxuXHRcdG5vZGVUeXBlICE9PSAxICYmIG5vZGVUeXBlICE9PSA5ICYmIG5vZGVUeXBlICE9PSAxMSApIHtcblxuXHRcdHJldHVybiByZXN1bHRzO1xuXHR9XG5cblx0Ly8gVHJ5IHRvIHNob3J0Y3V0IGZpbmQgb3BlcmF0aW9ucyAoYXMgb3Bwb3NlZCB0byBmaWx0ZXJzKSBpbiBIVE1MIGRvY3VtZW50c1xuXHRpZiAoICFzZWVkICkge1xuXG5cdFx0aWYgKCAoIGNvbnRleHQgPyBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCA6IHByZWZlcnJlZERvYyApICE9PSBkb2N1bWVudCApIHtcblx0XHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdFx0fVxuXHRcdGNvbnRleHQgPSBjb250ZXh0IHx8IGRvY3VtZW50O1xuXG5cdFx0aWYgKCBkb2N1bWVudElzSFRNTCApIHtcblxuXHRcdFx0Ly8gSWYgdGhlIHNlbGVjdG9yIGlzIHN1ZmZpY2llbnRseSBzaW1wbGUsIHRyeSB1c2luZyBhIFwiZ2V0KkJ5KlwiIERPTSBtZXRob2Rcblx0XHRcdC8vIChleGNlcHRpbmcgRG9jdW1lbnRGcmFnbWVudCBjb250ZXh0LCB3aGVyZSB0aGUgbWV0aG9kcyBkb24ndCBleGlzdClcblx0XHRcdGlmICggbm9kZVR5cGUgIT09IDExICYmIChtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0Ly8gSUQgc2VsZWN0b3Jcblx0XHRcdFx0aWYgKCAobSA9IG1hdGNoWzFdKSApIHtcblxuXHRcdFx0XHRcdC8vIERvY3VtZW50IGNvbnRleHRcblx0XHRcdFx0XHRpZiAoIG5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIG0gKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdFx0Ly8gVE9ETzogaWRlbnRpZnkgdmVyc2lvbnNcblx0XHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0XHRpZiAoIGVsZW0uaWQgPT09IG0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRWxlbWVudCBjb250ZXh0XG5cdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUsIE9wZXJhLCBXZWJraXRcblx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHQvLyBnZXRFbGVtZW50QnlJZCBjYW4gbWF0Y2ggZWxlbWVudHMgYnkgbmFtZSBpbnN0ZWFkIG9mIElEXG5cdFx0XHRcdFx0XHRpZiAoIG5ld0NvbnRleHQgJiYgKGVsZW0gPSBuZXdDb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICYmXG5cdFx0XHRcdFx0XHRcdGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICkgJiZcblx0XHRcdFx0XHRcdFx0ZWxlbS5pZCA9PT0gbSApIHtcblxuXHRcdFx0XHRcdFx0XHRyZXN1bHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFR5cGUgc2VsZWN0b3Jcblx0XHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbMl0gKSB7XG5cdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cywgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggc2VsZWN0b3IgKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXG5cdFx0XHRcdC8vIENsYXNzIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIChtID0gbWF0Y2hbM10pICYmIHN1cHBvcnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSAmJlxuXHRcdFx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSApIHtcblxuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggbSApICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVGFrZSBhZHZhbnRhZ2Ugb2YgcXVlcnlTZWxlY3RvckFsbFxuXHRcdFx0aWYgKCBzdXBwb3J0LnFzYSAmJlxuXHRcdFx0XHQhY29tcGlsZXJDYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdICYmXG5cdFx0XHRcdCghcmJ1Z2d5UVNBIHx8ICFyYnVnZ3lRU0EudGVzdCggc2VsZWN0b3IgKSkgKSB7XG5cblx0XHRcdFx0aWYgKCBub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gY29udGV4dDtcblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG5cdFx0XHRcdC8vIHFTQSBsb29rcyBvdXRzaWRlIEVsZW1lbnQgY29udGV4dCwgd2hpY2ggaXMgbm90IHdoYXQgd2Ugd2FudFxuXHRcdFx0XHQvLyBUaGFua3MgdG8gQW5kcmV3IER1cG9udCBmb3IgdGhpcyB3b3JrYXJvdW5kIHRlY2huaXF1ZVxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PThcblx0XHRcdFx0Ly8gRXhjbHVkZSBvYmplY3QgZWxlbWVudHNcblx0XHRcdFx0fSBlbHNlIGlmICggY29udGV4dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICE9PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2FwdHVyZSB0aGUgY29udGV4dCBJRCwgc2V0dGluZyBpdCBmaXJzdCBpZiBuZWNlc3Nhcnlcblx0XHRcdFx0XHRpZiAoIChuaWQgPSBjb250ZXh0LmdldEF0dHJpYnV0ZSggXCJpZFwiICkpICkge1xuXHRcdFx0XHRcdFx0bmlkID0gbmlkLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29udGV4dC5zZXRBdHRyaWJ1dGUoIFwiaWRcIiwgKG5pZCA9IGV4cGFuZG8pICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJlZml4IGV2ZXJ5IHNlbGVjdG9yIGluIHRoZSBsaXN0XG5cdFx0XHRcdFx0Z3JvdXBzID0gdG9rZW5pemUoIHNlbGVjdG9yICk7XG5cdFx0XHRcdFx0aSA9IGdyb3Vwcy5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBcIiNcIiArIG5pZCArIFwiIFwiICsgdG9TZWxlY3RvciggZ3JvdXBzW2ldICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdG5ld1NlbGVjdG9yID0gZ3JvdXBzLmpvaW4oIFwiLFwiICk7XG5cblx0XHRcdFx0XHQvLyBFeHBhbmQgY29udGV4dCBmb3Igc2libGluZyBzZWxlY3RvcnNcblx0XHRcdFx0XHRuZXdDb250ZXh0ID0gcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHxcblx0XHRcdFx0XHRcdGNvbnRleHQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIG5ld1NlbGVjdG9yICkge1xuXHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLFxuXHRcdFx0XHRcdFx0XHRuZXdDb250ZXh0LnF1
21167ZXJ5U2VsZWN0b3JBbGwoIG5ld1NlbGVjdG9yIClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9IGNhdGNoICggcXNhRXJyb3IgKSB7XG5cdFx0XHRcdFx0fSBmaW5hbGx5IHtcblx0XHRcdFx0XHRcdGlmICggbmlkID09PSBleHBhbmRvICkge1xuXHRcdFx0XHRcdFx0XHRjb250ZXh0LnJlbW92ZUF0dHJpYnV0ZSggXCJpZFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWxsIG90aGVyc1xuXHRyZXR1cm4gc2VsZWN0KCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUga2V5LXZhbHVlIGNhY2hlcyBvZiBsaW1pdGVkIHNpemVcbiAqIEByZXR1cm5zIHtmdW5jdGlvbihzdHJpbmcsIG9iamVjdCl9IFJldHVybnMgdGhlIE9iamVjdCBkYXRhIGFmdGVyIHN0b3JpbmcgaXQgb24gaXRzZWxmIHdpdGhcbiAqXHRwcm9wZXJ0eSBuYW1lIHRoZSAoc3BhY2Utc3VmZml4ZWQpIHN0cmluZyBhbmQgKGlmIHRoZSBjYWNoZSBpcyBsYXJnZXIgdGhhbiBFeHByLmNhY2hlTGVuZ3RoKVxuICpcdGRlbGV0aW5nIHRoZSBvbGRlc3QgZW50cnlcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQ2FjaGUoKSB7XG5cdHZhciBrZXlzID0gW107XG5cblx0ZnVuY3Rpb24gY2FjaGUoIGtleSwgdmFsdWUgKSB7XG5cdFx0Ly8gVXNlIChrZXkgKyBcIiBcIikgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGggbmF0aXZlIHByb3RvdHlwZSBwcm9wZXJ0aWVzIChzZWUgSXNzdWUgIzE1Nylcblx0XHRpZiAoIGtleXMucHVzaCgga2V5ICsgXCIgXCIgKSA+IEV4cHIuY2FjaGVMZW5ndGggKSB7XG5cdFx0XHQvLyBPbmx5IGtlZXAgdGhlIG1vc3QgcmVjZW50IGVudHJpZXNcblx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5cy5zaGlmdCgpIF07XG5cdFx0fVxuXHRcdHJldHVybiAoY2FjaGVbIGtleSArIFwiIFwiIF0gPSB2YWx1ZSk7XG5cdH1cblx0cmV0dXJuIGNhY2hlO1xufVxuXG4vKipcbiAqIE1hcmsgYSBmdW5jdGlvbiBmb3Igc3BlY2lhbCB1c2UgYnkgU2l6emxlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gbWFya1xuICovXG5mdW5jdGlvbiBtYXJrRnVuY3Rpb24oIGZuICkge1xuXHRmblsgZXhwYW5kbyBdID0gdHJ1ZTtcblx0cmV0dXJuIGZuO1xufVxuXG4vKipcbiAqIFN1cHBvcnQgdGVzdGluZyB1c2luZyBhbiBlbGVtZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBQYXNzZWQgdGhlIGNyZWF0ZWQgZWxlbWVudCBhbmQgcmV0dXJucyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJmaWVsZHNldFwiKTtcblxuXHR0cnkge1xuXHRcdHJldHVybiAhIWZuKCBlbCApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZWwucGFyZW50Tm9kZSApIHtcblx0XHRcdGVsLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIGVsICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZWwgPSBudWxsO1xuXHR9XG59XG5cbi8qKlxuICogQWRkcyB0aGUgc2FtZSBoYW5kbGVyIGZvciBhbGwgb2YgdGhlIHNwZWNpZmllZCBhdHRyc1xuICogQHBhcmFtIHtTdHJpbmd9IGF0dHJzIFBpcGUtc2VwYXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gaGFuZGxlciBUaGUgbWV0aG9kIHRoYXQgd2lsbCBiZSBhcHBsaWVkXG4gKi9cbmZ1bmN0aW9uIGFkZEhhbmRsZSggYXR0cnMsIGhhbmRsZXIgKSB7XG5cdHZhciBhcnIgPSBhdHRycy5zcGxpdChcInxcIiksXG5cdFx0aSA9IGFyci5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0RXhwci5hdHRySGFuZGxlWyBhcnJbaV0gXSA9IGhhbmRsZXI7XG5cdH1cbn1cblxuLyoqXG4gKiBDaGVja3MgZG9jdW1lbnQgb3JkZXIgb2YgdHdvIHNpYmxpbmdzXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGFcbiAqIEBwYXJhbSB7RWxlbWVudH0gYlxuICogQHJldHVybnMge051bWJlcn0gUmV0dXJucyBsZXNzIHRoYW4gMCBpZiBhIHByZWNlZGVzIGIsIGdyZWF0ZXIgdGhhbiAwIGlmIGEgZm9sbG93cyBiXG4gKi9cbmZ1bmN0aW9uIHNpYmxpbmdDaGVjayggYSwgYiApIHtcblx0dmFyIGN1ciA9IGIgJiYgYSxcblx0XHRkaWZmID0gY3VyICYmIGEubm9kZVR5cGUgPT09IDEgJiYgYi5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0YS5zb3VyY2VJbmRleCAtIGIuc291cmNlSW5kZXg7XG5cblx0Ly8gVXNlIElFIHNvdXJjZUluZGV4IGlmIGF2YWlsYWJsZSBvbiBib3RoIG5vZGVzXG5cdGlmICggZGlmZiApIHtcblx0XHRyZXR1cm4gZGlmZjtcblx0fVxuXG5cdC8vIENoZWNrIGlmIGIgZm9sbG93cyBhXG5cdGlmICggY3VyICkge1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5uZXh0U2libGluZykgKSB7XG5cdFx0XHRpZiAoIGN1ciA9PT0gYiApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBhID8gMSA6IC0xO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgaW5wdXQgdHlwZXNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUlucHV0UHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBidXR0b25zXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVCdXR0b25Qc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gKG5hbWUgPT09IFwiaW5wdXRcIiB8fCBuYW1lID09PSBcImJ1dHRvblwiKSAmJiBlbGVtLnR5cGUgPT09IHR5cGU7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1
21167ZG9zIGZvciA6ZW5hYmxlZC86ZGlzYWJsZWRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gZGlzYWJsZWQgdHJ1ZSBmb3IgOmRpc2FibGVkOyBmYWxzZSBmb3IgOmVuYWJsZWRcbiAqL1xuZnVuY3Rpb24gY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGRpc2FibGVkICkge1xuXG5cdC8vIEtub3duIDpkaXNhYmxlZCBmYWxzZSBwb3NpdGl2ZXM6IGZpZWxkc2V0W2Rpc2FibGVkXSA+IGxlZ2VuZDpudGgtb2YtdHlwZShuKzIpIDpjYW4tZGlzYWJsZVxuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBPbmx5IGNlcnRhaW4gZWxlbWVudHMgY2FuIG1hdGNoIDplbmFibGVkIG9yIDpkaXNhYmxlZFxuXHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3NjcmlwdGluZy5odG1sI3NlbGVjdG9yLWVuYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1kaXNhYmxlZFxuXHRcdGlmICggXCJmb3JtXCIgaW4gZWxlbSApIHtcblxuXHRcdFx0Ly8gQ2hlY2sgZm9yIGluaGVyaXRlZCBkaXNhYmxlZG5lc3Mgb24gcmVsZXZhbnQgbm9uLWRpc2FibGVkIGVsZW1lbnRzOlxuXHRcdFx0Ly8gKiBsaXN0ZWQgZm9ybS1hc3NvY2lhdGVkIGVsZW1lbnRzIGluIGEgZGlzYWJsZWQgZmllbGRzZXRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjYXRlZ29yeS1saXN0ZWRcblx0XHRcdC8vICAgaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvZm9ybXMuaHRtbCNjb25jZXB0LWZlLWRpc2FibGVkXG5cdFx0XHQvLyAqIG9wdGlvbiBlbGVtZW50cyBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1vcHRpb24tZGlzYWJsZWRcblx0XHRcdC8vIEFsbCBzdWNoIGVsZW1lbnRzIGhhdmUgYSBcImZvcm1cIiBwcm9wZXJ0eS5cblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdC8vIE9wdGlvbiBlbGVtZW50cyBkZWZlciB0byBhIHBhcmVudCBvcHRncm91cCBpZiBwcmVzZW50XG5cdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRcdFx0aWYgKCBcImxhYmVsXCIgaW4gZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0ucGFyZW50Tm9kZS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA2IC0gMTFcblx0XHRcdFx0Ly8gVXNlIHRoZSBpc0Rpc2FibGVkIHNob3J0Y3V0IHByb3BlcnR5IHRvIGNoZWNrIGZvciBkaXNhYmxlZCBmaWVsZHNldCBhbmNlc3RvcnNcblx0XHRcdFx0cmV0dXJuIGVsZW0uaXNEaXNhYmxlZCA9PT0gZGlzYWJsZWQgfHxcblxuXHRcdFx0XHRcdC8vIFdoZXJlIHRoZXJlIGlzIG5vIGlzRGlzYWJsZWQsIGNoZWNrIG1hbnVhbGx5XG5cdFx0XHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRcdFx0ZWxlbS5pc0Rpc2FibGVkICE9PSAhZGlzYWJsZWQgJiZcblx0XHRcdFx0XHRcdGRpc2FibGVkQW5jZXN0b3IoIGVsZW0gKSA9PT0gZGlzYWJsZWQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblxuXHRcdC8vIFRyeSB0byB3aW5ub3cgb3V0IGVsZW1lbnRzIHRoYXQgY2FuJ3QgYmUgZGlzYWJsZWQgYmVmb3JlIHRydXN0aW5nIHRoZSBkaXNhYmxlZCBwcm9wZXJ0eS5cblx0XHQvLyBTb21lIHZpY3RpbXMgZ2V0IGNhdWdodCBpbiBvdXIgbmV0IChsYWJlbCwgbGVnZW5kLCBtZW51LCB0cmFjayksIGJ1dCBpdCBzaG91bGRuJ3Rcblx0XHQvLyBldmVuIGV4aXN0IG9uIHRoZW0sIGxldCBhbG9uZSBoYXZlIGEgYm9vbGVhbiB2YWx1ZS5cblx0XHR9IGVsc2UgaWYgKCBcImxhYmVsXCIgaW4gZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtLmRpc2FibGVkID09PSBkaXNhYmxlZDtcblx0XHR9XG5cblx0XHQvLyBSZW1haW5pbmcgZWxlbWVudHMgYXJlIG5laXRoZXIgOmVuYWJsZWQgbm9yIDpkaXNhYmxlZFxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0Vs
21167ZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgc3ViV2luZG93LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCBwcmVmZXJyZWREb2MgIT09IGRvY3VtZW50ICYmXG5cdFx0KHN1YldpbmRvdyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3KSAmJiBzdWJXaW5kb3cudG9wICE9PSBzdWJXaW5kb3cgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSAxMSwgRWRnZVxuXHRcdGlmICggc3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRzdWJXaW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggc3ViV2luZG93LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0c3ViV2luZG93LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5jbGFzc05hbWUgPSBcImlcIjtcblx0XHRyZXR1cm4gIWVsLmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRlbC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlQ29tbWVudChcIlwiKSApO1xuXHRcdHJldHVybiAhZWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbW1hdGljYWxseS1zZXQgbmFtZXMsXG5cdC8vIHNvIHVzZSBhIHJvdW5kYWJvdXQgZ2V0RWxlbWVudHNCeU5hbWUgdGVzdFxuXHRzdXBwb3J0LmdldEJ5SWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaWQgPSBleHBhbmRvO1xuXHRcdHJldHVybiAhZG9jdW1lbnQuZ2V0RWxlbWVudHNCeU5hbWUgfHwgIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lKCBleHBhbmRvICkubGVuZ3RoO1xuXHR9KTtcblxuXHQvLyBJRCBmaWx0ZXIgYW5kIGZpbmRcblx0aWYgKCBzdXBwb3J0LmdldEJ5SWQgKSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoXCJpZFwiKSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gZWxlbSA/IFsgZWxlbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gIGZ1bmN0aW9uKCBpZCApIHtcblx0XHRcdHZhciBhdHRySWQgPSBpZC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZU5vZGUgIT09IFwidW5kZWZpbmVkXCIgJiZcblx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0cmV0dXJuIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gYXR0cklkO1xuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDcgb25seVxuXHRcdC8vIGdldEVsZW1lbnRCeUlkIGlzIG5vdCByZWxpYWJsZSBhcyBhIGZpbmQgc2hvcnRjdXRcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBub2RlLCBpLCBlbGVtcyxcblx0XHRcdFx0XHRlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblxuXHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHQvLyBWZXJpZnkgdGhlIGl
21167kIGF0dHJpYnV0ZVxuXHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gWyBlbGVtIF07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gRmFsbCBiYWNrIG9uIGdldEVsZW1lbnRzQnlOYW1lXG5cdFx0XHRcdFx0ZWxlbXMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlOYW1lKCBpZCApO1xuXHRcdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtc1tpKytdKSApIHtcblx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoXCJpZFwiKTtcblx0XHRcdFx0XHRcdGlmICggbm9kZSAmJiBub2RlLnZhbHVlID09PSBpZCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBbXTtcblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0Ly8gVGFnXG5cdEV4cHIuZmluZFtcIlRBR1wiXSA9IHN1cHBvcnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgP1xuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnICk7XG5cblx0XHRcdC8vIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgZG9uJ3QgaGF2ZSBnRUJUTlxuXHRcdFx0fSBlbHNlIGlmICggc3VwcG9ydC5xc2EgKSB7XG5cdFx0XHRcdHJldHVybiBjb250ZXh0LnF1
21167ZXJ5U2VsZWN0b3JBbGwoIHRhZyApO1xuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0ZnVuY3Rpb24oIHRhZywgY29udGV4dCApIHtcblx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHR0bXAgPSBbXSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdC8vIEJ5IGhhcHB5IGNvaW5jaWRlbmNlLCBhIChicm9rZW4pIGdFQlROIGFwcGVhcnMgb24gRG9jdW1lbnRGcmFnbWVudCBub2RlcyB0b29cblx0XHRcdFx0cmVzdWx0cyA9IGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBGaWx0ZXIgb3V0IHBvc3NpYmxlIGNvbW1lbnRzXG5cdFx0XHRpZiAoIHRhZyA9PT0gXCIqXCIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdFx0XHRcdHRtcC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHRtcDtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdH07XG5cblx0Ly8gQ2xhc3Ncblx0RXhwci5maW5kW1wiQ0xBU1NcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiYgZnVuY3Rpb24oIGNsYXNzTmFtZSwgY29udGV4dCApIHtcblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRyZXR1cm4gY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCBjbGFzc05hbWUgKTtcblx0XHR9XG5cdH07XG5cblx0LyogUVNBL21hdGNoZXNTZWxlY3RvclxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gUVNBIGFuZCBtYXRjaGVzU2VsZWN0b3Igc3VwcG9ydFxuXG5cdC8vIG1hdGNoZXNTZWxlY3Rvcig6YWN0aXZlKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoSUU5L09wZXJhIDExLjUpXG5cdHJidWdneU1hdGNoZXMgPSBbXTtcblxuXHQvLyBxU2EoOmZvY3VzKSByZXBvcnRzIGZhbHNlIHdoZW4gdHJ1ZSAoQ2hyb21lIDIxKVxuXHQvLyBXZSBhbGxvdyB0aGlzIGJlY2F1c2Ugb2YgYSBidWcgaW4gSUU4LzkgdGhhdCB0aHJvd3MgYW4gZXJyb3Jcblx0Ly8gd2hlbmV2ZXIgYGRvY3VtZW50LmFjdGl2ZUVsZW1lbnRgIGlzIGFjY2Vzc2VkIG9uIGFuIGlmcmFtZVxuXHQvLyBTbywgd2UgYWxsb3cgOmZvY3VzIHRvIHBhc3MgdGhyb3VnaCBRU0EgYWxsIHRoZSB0aW1lIHRvIGF2b2lkIHRoZSBJRSBlcnJvclxuXHQvLyBTZWUgaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gU2VsZWN0IGlzIHNldCB0byBlbXB0eSBzdHJpbmcgb24gcHVycG9zZVxuXHRcdFx0Ly8gVGhpcyBpcyB0byB0ZXN0IElFJ3MgdHJlYXRtZW50IG9mIG5vdCBleHBsaWNpdGx5XG5cdFx0XHQvLyBzZXR0aW5nIGEgYm9vbGVhbiBjb250ZW50IGF0dHJpYnV0ZSxcblx0XHRcdC8vIHNpbmNlIGl0cyBwcmVzZW5jZSBzaG91bGQgYmUgZW5vdWdoXG5cdFx0XHQvLyBodHRwczovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuaW5uZXJIVE1MID0gXCI8YSBpZD0nXCIgKyBleHBhbmRvICsgXCInPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBpZD0nXCIgKyBleHBhbmRvICsgXCItXFxyXFxcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+XCIgK1xuXHRcdFx0XHRcIjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+XCI7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOCwgT3BlcmEgMTEtMTIuMTZcblx0XHRcdC8vIE5vdGhpbmcgc2hvdWxkIGJlIHNlbGVjdGVkIHdoZW4gZW1wdHkgc3RyaW5ncyBmb2xsb3cgXj0gb3IgJD0gb3IgKj1cblx0XHRcdC8vIFRoZSB0ZXN0IGF0dHJpYnV0ZSBtdXN0IGJlIHVua25vd24gaW4gT3BlcmEgYnV0IFwic2FmZVwiIGZvciBXaW5SVFxuXHRcdFx0Ly8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbXNhbGxvd2NhcHR1cmVePScnXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlsqXiRdPVwiICsgd2hpdGVzcGFjZSArIFwiKig/OicnfFxcXCJcXFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gQm9vbGVhbiBhdHRyaWJ1dGVzIGFuZCBcInZhbHVlXCIgYXJlIG5vdCB0cmVhdGVkIGNvcnJlY3RseVxuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbChcIltzZWxlY3RlZF1cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJcXFxcW1wiICsgd2hpdGVzcGFjZSArIFwiKig/OnZhbHVlfFwiICsgYm9vbGVhbnMgKyBcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWU8MjksIEFuZHJvaWQ8NC40LCBTYWZhcmk8Ny4wKywgaU9TPDcuMCssIFBoYW50b21KUzwxLjkuOCtcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6Y2hlY2tlZFwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwiOmNoZWNrZWRcIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA4KywgaU9TIDgrXG5cdFx0XHQvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM2ODUxXG5cdFx0XHQvLyBJbi1wYWdlIGBzZWxlY3RvciNpZCBzaWJsaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcImEjXCIgKyBleHBhbmRvICsgXCIrKlwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIi4jLitbK35dXCIpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdGVsLmlubmVySFRNTCA9IFwiPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT5cIiArXG5cdFx0XHRcdFwiPHNlbGVjdCBkaXNhYmxlZD0nZGlzYWJsZWQnPjxvcHRpb24vPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBXaW5kb3dzIDggTmF0aXZlIEFwcHNcblx0XHRcdC8vIFRoZSB0eXBlIGFuZCBuYW1lIGF0dHJpYnV0ZXMgYXJlIHJlc3RyaWN0ZWQgZHVyaW5nIC5pbm5lckhUTUwgYXNzaWdubWVudFxuXHRcdFx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlucHV0XCIpO1xuXHRcdFx0aW5wdXQuc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgXCJoaWRkZW5cIiApO1xuXHRcdFx0ZWwuYXBwZW5kQ2hpbGQoIGlucHV0ICkuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJEXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU4XG5cdFx0XHQvLyBFbmZvcmNlIGNhc2Utc2Vuc2l0aXZpdHkgb2YgbmFtZSBhdHRyaWJ1dGVcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjplbmFibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBJRSdzIDpkaXNhYmxlZCBzZWxlY3RvciBkb2VzIG5vdCBwaWNrIHVwIHRoZSBjaGlsZHJlbiBvZiBkaXNhYmxlZCBmaWVsZHNldHNcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGVsICkuZGlzYWJsZWQgPSB0cnVlO1xuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmRpc2FibGVkXCIpLmxlbmd0aCAhPT0gMiApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiOmVuYWJsZWRcIiwgXCI6ZGlzYWJsZWRcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPcGVyYSAxMC0xMSBkb2VzIG5vdCB0aHJvdyBvbiBwb3N0LWNvbW1hIGludmFsaWQgcHNldWRvc1xuXHRcdFx0ZWwucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRcdFx0Ly8gQ2hlY2sgdG8gc2VlIGlmIGl0J3MgcG9zc2libGUgdG8gZG8gbWF0Y2hlc1NlbGVjdG9yXG5cdFx0XHQvLyBvbiBhIGRpc2Nvbm5lY3RlZCBub2RlIChJRSA5KVxuXHRcdFx0c3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCA9IG1hdGNoZXMuY2FsbCggZWwsIFwiKlwiICk7XG5cblx0XHRcdC8vIFRoaXMgc2hvdWxkIGZhaWwgd2l0aCBhbiBleGNlcHRpb25cblx0XHRcdC8vIEdlY2tvIGRvZXMgbm90IGVycm9yLCByZXR1cm5zIGZhbHNlIGluc3RlYWRcblx0XHRcdG1hdGNoZXMuY2FsbCggZWwsIFwiW3MhPScnXTp4XCIgKTtcblx0XHRcdHJidWdneU1hdGNoZXMucHVzaCggXCIhPVwiLCBwc2V1ZG9zICk7XG5cdFx0fSk7XG5cdH1cblxuXHRyYnVnZ3lRU0EgPSByYnVnZ3lRU0EubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneVFTQS5qb2luKFwifFwiKSApO1xuXHRyYnVnZ3lNYXRjaGVzID0gcmJ1Z2d5TWF0Y2hlcy5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5TWF0Y2hlcy5qb2luKFwifFwiKSApO1xuXG5cdC8qIENvbnRhaW5zXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblx0aGFzQ29tcGFyZSA9IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiApO1xuXG5cdC8vIEVsZW1lbnQgY29udGFpbnMgYW5vdGhlclxuXHQvLyBQdXJwb3NlZnVsbHkgc2VsZi1leGNsdXNpdmVcblx0Ly8gQXMgaW4sIGFuIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbiBpdHNlbGZcblx0Y29udGFpbnMgPSBoYXNDb21wYXJlIHx8IHJuYXRpdmUudGVzdCggZG9jRWxlbS5jb250YWlucyApID9cblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdHZhciBhZG93biA9IGEubm9kZVR5cGUgPT09IDkgPyBhLmRvY3VtZW50RWxlbWVudCA6IGEsXG5cdFx0XHRcdGJ1cCA9IGIgJiYgYi5wYXJlbnROb2RlO1xuXHRcdFx0cmV0dXJuIGEgPT09IGJ1cCB8fCAhISggYnVwICYmIGJ1cC5ub2RlVHlwZSA9PT0gMSAmJiAoXG5cdFx0XHRcdGFkb3duLmNvbnRhaW5zID9cblx0XHRcdFx0XHRhZG93bi5jb250YWlucyggYnVwICkgOlxuXHRcdFx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gJiYgYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYnVwICkgJiAxNlxuXHRcdFx0KSk7XG5cdFx0fSA6XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHRpZiAoIGIgKSB7XG5cdFx0XHRcdHdoaWxlICggKGIgPSBiLnBhcmVudE5vZGUpICkge1xuXHRcdFx0XHRcdGlmICggYiA9PT0gYSApIHtcblx0XHRcdFx0XHRcdHJldHVybi
21167B0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG5cblx0LyogU29ydGluZ1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gRG9jdW1lbnQgb3JkZXIgc29ydGluZ1xuXHRzb3J0T3JkZXIgPSBoYXNDb21wYXJlID9cblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cblx0XHQvLyBGbGFnIGZvciBkdXBsaWNhdGUgcmVtb3ZhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHQvLyBTb3J0IG9uIG1ldGhvZCBleGlzdGVuY2UgaWYgb25seSBvbmUgaW5wdXQgaGFzIGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uXG5cdFx0dmFyIGNvbXBhcmUgPSAhYS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAtICFiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO1xuXHRcdGlmICggY29tcGFyZSApIHtcblx0XHRcdHJldHVybiBjb21wYXJlO1xuXHRcdH1cblxuXHRcdC8vIENhbGN1bGF0ZSBwb3NpdGlvbiBpZiBib3RoIGlucHV0cyBiZWxvbmcgdG8gdGhlIHNhbWUgZG9jdW1lbnRcblx0XHRjb21wYXJlID0gKCBhLm93bmVyRG9jdW1lbnQgfHwgYSApID09PSAoIGIub3duZXJEb2N1bWVudCB8fCBiICkgP1xuXHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYiApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHdlIGtub3cgdGhleSBhcmUgZGlzY29ubmVjdGVkXG5cdFx0XHQxO1xuXG5cdFx0Ly8gRGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0aWYgKCBjb21wYXJlICYgMSB8fFxuXHRcdFx0KCFzdXBwb3J0LnNvcnREZXRhY2hlZCAmJiBiLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBhICkgPT09IGNvbXBhcmUpICkge1xuXG5cdFx0XHQvLyBDaG9vc2UgdGhlIGZpcnN0IGVsZW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIG91ciBwcmVmZXJyZWQgZG9jdW1lbnRcblx0XHRcdGlmICggYSA9PT0gZG9jdW1lbnQgfHwgYS5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBhKSApIHtcblx0XHRcdFx0cmV0dXJuIC0xO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBiID09PSBkb2N1bWVudCB8fCBiLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGIpICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFpbnRhaW4gb3JpZ2luYWwgb3JkZXJcblx0XHRcdHJldHVybiBzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbXBhcmUgJiA0ID8gLTEgOiAxO1xuXHR9IDpcblx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0Ly8gRXhpdCBlYXJseSBpZiB0aGUgbm9kZXMgYXJlIGlkZW50aWNhbFxuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHR2YXIgY3VyLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdXAgPSBhLnBhcmVudE5vZGUsXG5cdFx0XHRidXAgPSBiLnBhcmVudE5vZGUsXG5cdFx0XHRhcCA9IFsgYSBdLFxuXHRcdFx0YnAgPSBbIGIgXTtcblxuXHRcdC8vIFBhcmVudGxlc3Mgbm9kZXMgYXJlIGVpdGhlciBkb2N1bWVudHMgb3IgZGlzY29ubmVjdGVkXG5cdFx0aWYgKCAhYXVwIHx8ICFidXAgKSB7XG5cdFx0XHRyZXR1cm4gYSA9PT0gZG9jdW1lbnQgPyAtMSA6XG5cdFx0XHRcdGIgPT09IGRvY3VtZW50ID8gMSA6XG5cdFx0XHRcdGF1cCA/IC0xIDpcblx0XHRcdFx0YnVwID8gMSA6XG5cdFx0XHRcdHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblxuXHRcdC8vIElmIHRoZSBub2RlcyBhcmUgc2libGluZ3MsIHdlIGNhbiBkbyBhIHF1aWNrIGNoZWNrXG5cdFx0fSBlbHNlIGlmICggYXVwID09PSBidXAgKSB7XG5cdFx0XHRyZXR1cm4gc2libGluZ0NoZWNrKCBhLCBiICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlIHdlIG5lZWQgZnVsbCBsaXN0cyBvZiB0aGVpciBhbmNlc3RvcnMgZm9yIGNvbXBhcmlzb25cblx0XHRjdXIgPSBhO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGFwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblx0XHRjdXIgPSBiO1xuXHRcdHdoaWxlICggKGN1ciA9IGN1ci5wYXJlbnROb2RlKSApIHtcblx0XHRcdGJwLnVuc2hpZnQoIGN1ciApO1xuXHRcdH1cblxuXHRcdC8vIFdhbGsgZG93biB0aGUgdHJlZSBsb29raW5nIGZvciBhIGRpc2NyZXBhbmN5XG5cdFx0d2hpbGUgKCBhcFtpXSA9PT0gYnBbaV0gKSB7XG5cdFx0XHRpKys7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGkgP1xuXHRcdFx0Ly8gRG8gYSBzaWJsaW5nIGNoZWNrIGlmIHRoZSBub2RlcyBoYXZlIGEgY29tbW9uIGFuY2VzdG9yXG5cdFx0XHRzaWJsaW5nQ2hlY2soIGFwW2ldLCBicFtpXSApIDpcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIG5vZGVzIGluIG91ciBkb2N1bWVudCBzb3J0IGZpcnN0XG5cdFx0XHRhcFtpXSA9PT0gcHJlZmVycmVkRG9jID8gLTEgOlxuXHRcdFx0YnBbaV0gPT09IHByZWZlcnJlZERvYyA/IDEgOlxuXHRcdFx0MDtcblx0fTtcblxuXHRyZXR1cm4gZG9jdW1lbnQ7XG59O1xuXG5TaXp6bGUubWF0Y2hlcyA9IGZ1bmN0aW9uKCBleHByLCBlbGVtZW50cyApIHtcblx0cmV0dXJuIFNpenpsZSggZXhwciwgbnVsbCwgbnVsbCwgZWxlbWVudHMgKTtcbn07XG5cblNpenpsZS5tYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbiggZWxlbSwgZXhwciApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0Ly8gTWFrZSBzdXJlIHRoYXQgYXR0cmlidXRlIHNlbGVjdG9ycyBhcmUgcXVvdGVkXG5cdGV4cHIgPSBleHByLnJlcGxhY2UoIHJhdHRyaWJ1dGVRdW90ZXMsIFwiPSckMSddXCIgKTtcblxuXHRpZiAoIHN1cHBvcnQubWF0Y2hlc1NlbGVjdG9yICYmIGRvY3VtZW50SXNIVE1MICYmXG5cdFx0IWNvbXBpbGVyQ2FjaGVbIGV4cHIgKyBcIiBcIiBdICYmXG5cdFx0KCAhcmJ1Z2d5TWF0Y2hlcyB8fCAhcmJ1Z2d5TWF0Y2hlcy50ZXN0KCBleHByICkgKSAmJlxuXHRcdCggIXJidWdneVFTQSAgICAgfHwgIXJidWdneVFTQS50ZXN0KCBleHByICkgKSApIHtcblxuXHRcdHRyeSB7XG5cdFx0XHR2YXIgcmV0ID0gbWF0Y2hlcy5jYWxsKCBlbGVtLCBleHByICk7XG5cblx0XHRcdC8vIElFIDkncyBtYXRjaGVzU2VsZWN0b3IgcmV0dXJucyBmYWxzZSBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRcdGlmICggcmV0IHx8IHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggfHxcblx0XHRcdFx0XHQvLyBBcyB3ZWxsLCBkaXNjb25uZWN0ZWQgbm9kZXMgYXJlIHNhaWQgdG8gYmUgaW4gYSBkb2N1bWVudFxuXHRcdFx0XHRcdC8vIGZyYWdtZW50IGluIElFIDlcblx0XHRcdFx0XHRlbGVtLmRvY3VtZW50ICYmIGVsZW0uZG9jdW1lbnQubm9kZVR5cGUgIT09IDExICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHt9XG5cdH1cblxuXHRyZXR1cm4gU2l6emxlKCBleHByLCBkb2
21167N1bWVudCwgbnVsbCwgWyBlbGVtIF0gKS5sZW5ndGggPiAwO1xufTtcblxuU2l6emxlLmNvbnRhaW5zID0gZnVuY3Rpb24oIGNvbnRleHQsIGVsZW0gKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGNvbnRleHQgKTtcblx0fVxuXHRyZXR1cm4gY29udGFpbnMoIGNvbnRleHQsIGVsZW0gKTtcbn07XG5cblNpenpsZS5hdHRyID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdHZhciBmbiA9IEV4cHIuYXR0ckhhbmRsZVsgbmFtZS50b0xvd2VyQ2FzZSgpIF0sXG5cdFx0Ly8gRG9uJ3QgZ2V0IGZvb2xlZCBieSBPYmplY3QucHJvdG90eXBlIHByb3BlcnRpZXMgKGpRdWVyeSAjMTM4MDcpXG5cdFx0dmFsID0gZm4gJiYgaGFzT3duLmNhbGwoIEV4cHIuYXR0ckhhbmRsZSwgbmFtZS50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0Zm4oIGVsZW0sIG5hbWUsICFkb2N1bWVudElzSFRNTCApIDpcblx0XHRcdHVuZGVmaW5lZDtcblxuXHRyZXR1cm4gdmFsICE9PSB1bmRlZmluZWQgP1xuXHRcdHZhbCA6XG5cdFx0c3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApIDpcblx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUobmFtZSkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xufTtcblxuU2l6emxlLmVzY2FwZSA9IGZ1bmN0aW9uKCBzZWwgKSB7XG5cdHJldHVybiAoc2VsICsgXCJcIikucmVwbGFjZSggcmNzc2VzY2FwZSwgZmNzc2VzY2FwZSApO1xufTtcblxuU2l6emxlLmVycm9yID0gZnVuY3Rpb24oIG1zZyApIHtcblx0dGhyb3cgbmV3IEVycm9yKCBcIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246IFwiICsgbXNnICk7XG59O1xuXG4vKipcbiAqIERvY3VtZW50IHNvcnRpbmcgYW5kIHJlbW92aW5nIGR1cGxpY2F0ZXNcbiAqIEBwYXJhbSB7QXJyYXlMaWtlfSByZXN1bHRzXG4gKi9cblNpenpsZS51bmlxdWVTb3J0ID0gZnVuY3Rpb24oIHJlc3VsdHMgKSB7XG5cdHZhciBlbGVtLFxuXHRcdGR1cGxpY2F0ZXMgPSBbXSxcblx0XHRqID0gMCxcblx0XHRpID0gMDtcblxuXHQvLyBVbmxlc3Mgd2UgKmtub3cqIHdlIGNhbiBkZXRlY3QgZHVwbGljYXRlcywgYXNzdW1lIHRoZWlyIHByZXNlbmNlXG5cdGhhc0R1cGxpY2F0ZSA9ICFzdXBwb3J0LmRldGVjdER1cGxpY2F0ZXM7XG5cdHNvcnRJbnB1dCA9ICFzdXBwb3J0LnNvcnRTdGFibGUgJiYgcmVzdWx0cy5zbGljZSggMCApO1xuXHRyZXN1bHRzLnNvcnQoIHNvcnRPcmRlciApO1xuXG5cdGlmICggaGFzRHVwbGljYXRlICkge1xuXHRcdHdoaWxlICggKGVsZW0gPSByZXN1bHRzW2krK10pICkge1xuXHRcdFx0aWYgKCBlbGVtID09PSByZXN1bHRzWyBpIF0gKSB7XG5cdFx0XHRcdGogPSBkdXBsaWNhdGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRyZXN1bHRzLnNwbGljZSggZHVwbGljYXRlc1sgaiBdLCAxICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2xlYXIgaW5wdXQgYWZ0ZXIgc29ydGluZyB0byByZWxlYXNlIG9iamVjdHNcblx0Ly8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvc2l6emxlL3B1bGwvMjI1XG5cdHNvcnRJbnB1dCA9IG51bGw7XG5cblx0cmV0dXJuIHJlc3VsdHM7XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHJldHJpZXZpbmcgdGhlIHRleHQgdmFsdWUgb2YgYW4gYXJyYXkgb2YgRE9NIG5vZGVzXG4gKiBAcGFyYW0ge0FycmF5fEVsZW1lbnR9IGVsZW1cbiAqL1xuZ2V0VGV4dCA9IFNpenpsZS5nZXRUZXh0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHZhciBub2RlLFxuXHRcdHJldCA9IFwiXCIsXG5cdFx0aSA9IDAsXG5cdFx0bm9kZVR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdGlmICggIW5vZGVUeXBlICkge1xuXHRcdC8vIElmIG5vIG5vZGVUeXBlLCB0aGlzIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5XG5cdFx0d2hpbGUgKCAobm9kZSA9IGVsZW1baSsrXSkgKSB7XG5cdFx0XHQvLyBEbyBub3QgdHJhdmVyc2UgY29tbWVudCBub2Rlc1xuXHRcdFx0cmV0ICs9IGdldFRleHQoIG5vZGUgKTtcblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAxIHx8IG5vZGVUeXBlID09PSA5IHx8IG5vZGVUeXBlID09PSAxMSApIHtcblx0XHQvLyBVc2UgdGV4dENvbnRlbnQgZm9yIGVsZW1lbnRzXG5cdFx0Ly8gaW5uZXJUZXh0IHVzYWdlIHJlbW92ZWQgZm9yIGNvbnNpc3RlbmN5IG9mIG5ldyBsaW5lcyAoalF1ZXJ5ICMxMTE1Mylcblx0XHRpZiAoIHR5cGVvZiBlbGVtLnRleHRDb250ZW50ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0udGV4dENvbnRlbnQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFRyYXZlcnNlIGl0cyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdHJldCArPSBnZXRUZXh0KCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMyB8fCBub2RlVHlwZSA9PT0gNCApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVmFsdWU7XG5cdH1cblx0Ly8gRG8gbm90IGluY2x1ZGUgY29tbWVudCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIG5vZGVzXG5cblx0cmV0dXJuIHJldDtcbn07XG5cbkV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzID0ge1xuXG5cdC8vIENhbiBiZSBhZGp1c3RlZCBieSB0aGUgdXNlclxuXHRjYWNoZUxlbmd0aDogNTAsXG5cblx0Y3JlYXRlUHNldWRvOiBtYXJrRnVuY3Rpb24sXG5cblx0bWF0Y2g6IG1hdGNoRXhwcixcblxuXHRhdHRySGFuZGxlOiB7fSxcblxuXHRmaW5kOiB7fSxcblxuXHRyZWxhdGl2ZToge1xuXHRcdFwiPlwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCIgXCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiB9LFxuXHRcdFwiK1wiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIn5cIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIgfVxuXHR9LFxuXG5cdHByZUZpbHRlcjoge1xuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdC8vIE1vdmUgdGhlIGdpdmVuIHZhbHVlIHRvIG1hdGNoWzNdIHdoZXRoZXIgcXVvdGVkIG9yIHVucXVvdGVkXG5cdFx0XHRtYXRjaFszXSA9ICggbWF0Y2hbM10gfHwgbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIiApLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cblx0XHRcdGlmICggbWF0Y2hbMl0gPT09IFwifj1cIiApIHtcblx0XHRcdFx0bWF0Y2hbM10gPSBcIiBcIiArIG1hdGNoWzNdICsgXCIgXCI7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
21167BtYXRjaC5zbGljZSggMCwgNCApO1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdC8qIG1hdGNoZXMgZnJvbSBtYXRjaEV4cHJbXCJDSElMRFwiXVxuXHRcdFx0XHQxIHR5cGUgKG9ubHl8bnRofC4uLilcblx0XHRcdFx0MiB3aGF0IChjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHQzIGFyZ3VtZW50IChldmVufG9kZHxcXGQqfFxcZCpuKFsrLV1cXGQrKT98Li4uKVxuXHRcdFx0XHQ0IHhuLWNvbXBvbmVudCBvZiB4bit5IGFyZ3VtZW50IChbKy1dP1xcZCpufClcblx0XHRcdFx0NSBzaWduIG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ2IHggb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDcgc2lnbiBvZiB5LWNvbXBvbmVudFxuXHRcdFx0XHQ4IHkgb2YgeS1jb21wb25lbnRcblx0XHRcdCovXG5cdFx0XHRtYXRjaFsxXSA9IG1hdGNoWzFdLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRcdGlmICggbWF0Y2hbMV0uc2xpY2UoIDAsIDMgKSA9PT0gXCJudGhcIiApIHtcblx0XHRcdFx0Ly8gbnRoLSogcmVxdWlyZXMgYXJndW1lbnRcblx0XHRcdFx0aWYgKCAhbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gbnVtZXJpYyB4IGFuZCB5IHBhcmFtZXRlcnMgZm9yIEV4cHIuZmlsdGVyLkNISUxEXG5cdFx0XHRcdC8vIHJlbWVtYmVyIHRoYXQgZmFsc2UvdHJ1ZSBjYXN0IHJlc3BlY3RpdmVseSB0byAwLzFcblx0XHRcdFx0bWF0Y2hbNF0gPSArKCBtYXRjaFs0XSA/IG1hdGNoWzVdICsgKG1hdGNoWzZdIHx8IDEpIDogMiAqICggbWF0Y2hbM10gPT09IFwiZXZlblwiIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICkgKTtcblx0XHRcdFx0bWF0Y2hbNV0gPSArKCAoIG1hdGNoWzddICsgbWF0Y2hbOF0gKSB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApO1xuXG5cdFx0XHQvLyBvdGhlciB0eXBlcyBwcm9oaWJpdCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBtYXRjaDtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0dmFyIGV4Y2Vzcyxcblx0XHRcdFx0dW5xdW90ZWQgPSAhbWF0Y2hbNl0gJiYgbWF0Y2hbMl07XG5cblx0XHRcdGlmICggbWF0Y2hFeHByW1wiQ0hJTERcIl0udGVzdCggbWF0Y2hbMF0gKSApIHtcblx0XHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFjY2VwdCBxdW90ZWQgYXJndW1lbnRzIGFzLWlzXG5cdFx0XHRpZiAoIG1hdGNoWzNdICkge1xuXHRcdFx0XHRtYXRjaFsyXSA9IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCI7XG5cblx0XHRcdC8vIFN0cmlwIGV4Y2VzcyBjaGFyYWN0ZXJzIGZyb20gdW5xdW90ZWQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCB1bnF1b3RlZCAmJiBycHNldWRvLnRlc3QoIHVucXVvdGVkICkgJiZcblx0XHRcdFx0Ly8gR2V0IGV4Y2VzcyBmcm9tIHRva2VuaXplIChyZWN1cnNpdmVseSlcblx0XHRcdFx0KGV4Y2VzcyA9IHRva2VuaXplKCB1bnF1b3RlZCwgdHJ1ZSApKSAmJlxuXHRcdFx0XHQvLyBhZHZhbmNlIHRvIHRoZSBuZXh0IGNsb3NpbmcgcGFyZW50aGVzaXNcblx0XHRcdFx0KGV4Y2VzcyA9IHVucXVvdGVkLmluZGV4T2YoIFwiKVwiLCB1bnF1b3RlZC5sZW5ndGggLSBleGNlc3MgKSAtIHVucXVvdGVkLmxlbmd0aCkgKSB7XG5cblx0XHRcdFx0Ly8gZXhjZXNzIGlzIGEgbmVnYXRpdmUgaW5kZXhcblx0XHRcdFx0bWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHRcdG1hdGNoWzJdID0gdW5xdW90ZWQuc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXR1cm4gb25seSBjYXB0dXJlcyBuZWVkZWQgYnkgdGhlIHBzZXVkbyBmaWx0ZXIgbWV0aG9kICh0eXBlIGFuZCBhcmd1bWVudClcblx0XHRcdHJldHVybiBtYXRjaC5zbGljZSggMCwgMyApO1xuXHRcdH1cblx0fSxcblxuXHRmaWx0ZXI6IHtcblxuXHRcdFwiVEFHXCI6IGZ1bmN0aW9uKCBub2RlTmFtZVNlbGVjdG9yICkge1xuXHRcdFx0dmFyIG5vZGVOYW1lID0gbm9kZU5hbWVTZWxlY3Rvci5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbm9kZU5hbWVTZWxlY3RvciA9PT0gXCIqXCIgP1xuXHRcdFx0XHRmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0gOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5vZGVOYW1lO1xuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNMQVNTXCI6IGZ1bmN0aW9uKCBjbGFzc05hbWUgKSB7XG5cdFx0XHR2YXIgcGF0dGVybiA9IGNsYXNzQ2FjaGVbIGNsYXNzTmFtZSArIFwiIFwiIF07XG5cblx0XHRcdHJldHVybiBwYXR0ZXJuIHx8XG5cdFx0XHRcdChwYXR0ZXJuID0gbmV3IFJlZ0V4cCggXCIoXnxcIiArIHdoaXRlc3BhY2UgKyBcIilcIiArIGNsYXNzTmFtZSArIFwiKFwiICsgd2hpdGVzcGFjZSArIFwifCQpXCIgKSkgJiZcblx0XHRcdFx0Y2xhc3NDYWNoZSggY2xhc3NOYW1lLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGF0dGVybi50ZXN0KCB0eXBlb2YgZWxlbS5jbGFzc05hbWUgPT09IFwic3RyaW5nXCIgJiYgZWxlbS5jbGFzc05hbWUgfHwgdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlICE9PSBcInVuZGVmaW5lZFwiICYmIGVsZW0uZ2V0QXR0cmlidXRlKFwiY2xhc3NcIikgfHwgXCJcIiApO1xuXHRcdFx0XHR9KTtcblx0XHR9LFxuXG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBuYW1lLCBvcGVyYXRvciwgY2hlY2sgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBTaXp6bGUuYXR0ciggZWxlbSwgbmFtZSApO1xuXG5cdFx0XHRcdGlmICggcmVzdWx0ID09IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIiE9XCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCAhb3BlcmF0b3IgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHQgKz0gXCJcIjtcblxuXHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiPVwiID8gcmVzdWx0ID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiIT1cIiA/IHJlc3VsdCAhPT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIl49XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA9PT0gMCA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiKj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiQ9XCIgPyBjaGVjayAmJiByZXN1bHQuc2xpY2UoIC1jaGVjay5sZW5ndGggKSA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIn49XCIgPyAoIFwiIFwiICsgcmVzdWx0LnJlcGxhY2UoIHJ3aGl0ZXNwYWNlLCBcIiBcIiApICsgXCIgXCIgKS5pbmRleE9mKCBjaGVjayApID4gLTEgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcInw9XCIgPyByZXN1bHQgPT09IGNoZWNrIHx8IHJlc3VsdC5zbGljZSggMCwgY2hlY2subGVuZ3RoICsgMSApID09PSBjaGVjayArIFwiLVwiIDpcblx0XHRcdFx0XHRmYWxzZTtcblx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIHR5cGUsIHdoYXQsIGFyZ3VtZW50LCBmaXJzdCwgbGFzdCApIHtcblx0XHRcdHZhciBzaW1wbGUgPSB0eXBlLnNsaWNlKCAwLCAzICkgIT09IFwibnRoXCIsXG5cdFx0XHRcdGZvcndhcmQgPSB0eXBlLnNsaWNlKCAtNCApICE9PSBcImxhc3RcIixcblx0XHRcdFx0b2ZUeXBlID0gd2hhdCA9PT0gXCJvZi10eXBlXCI7XG5cblx0XHRcdHJldHVybi
21167BmaXJzdCA9PT0gMSAmJiBsYXN0ID09PSAwID9cblxuXHRcdFx0XHQvLyBTaG9ydGN1dCBmb3IgOm50aC0qKG4pXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiAhIWVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdFx0fSA6XG5cblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgY2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLCBub2RlLCBub2RlSW5kZXgsIHN0YXJ0LFxuXHRcdFx0XHRcdFx0ZGlyID0gc2ltcGxlICE9PSBmb3J3YXJkID8gXCJuZXh0U2libGluZ1wiIDogXCJwcmV2aW91c1NpYmxpbmdcIixcblx0XHRcdFx0XHRcdHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZSxcblx0XHRcdFx0XHRcdG5hbWUgPSBvZlR5cGUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLFxuXHRcdFx0XHRcdFx0dXNlQ2FjaGUgPSAheG1sICYmICFvZlR5cGUsXG5cdFx0XHRcdFx0XHRkaWZmID0gZmFsc2U7XG5cblx0XHRcdFx0XHRpZiAoIHBhcmVudCApIHtcblxuXHRcdFx0XHRcdFx0Ly8gOihmaXJzdHxsYXN0fG9ubHkpLShjaGlsZHxvZi10eXBlKVxuXHRcdFx0XHRcdFx0aWYgKCBzaW1wbGUgKSB7XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggZGlyICkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSBub2RlWyBkaXIgXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHQvLyBSZXZlcnNlIGRpcmVjdGlvbiBmb3IgOm9ubHktKiAoaWYgd2UgaGF2ZW4ndCB5ZXQgZG9uZSBzbylcblx0XHRcdFx0XHRcdFx0XHRzdGFydCA9IGRpciA9IHR5cGUgPT09IFwib25seVwiICYmICFzdGFydCAmJiBcIm5leHRTaWJsaW5nXCI7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHN0YXJ0ID0gWyBmb3J3YXJkID8gcGFyZW50LmZpcnN0Q2hpbGQgOiBwYXJlbnQubGFzdENoaWxkIF07XG5cblx0XHRcdFx0XHRcdC8vIG5vbi14bWwgOm50aC1jaGlsZCguLi4pIHN0b3JlcyBjYWNoZSBkYXRhIG9uIGBwYXJlbnRgXG5cdFx0XHRcdFx0XHRpZiAoIGZvcndhcmQgJiYgdXNlQ2FjaGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU2VlayBgZWxlbWAgZnJvbSBhIHByZXZpb3VzbHktY2FjaGVkIGluZGV4XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRub2RlID0gcGFyZW50O1xuXHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4ICYmIGNhY2hlWyAyIF07XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBub2RlSW5kZXggJiYgcGFyZW50LmNoaWxkTm9kZXNbIG5vZGVJbmRleCBdO1xuXG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBGYWxsYmFjayB0byBzZWVraW5nIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gV2hlbiBmb3VuZCwgY2FjaGUgaW5kZXhlcyBvbiBgcGFyZW50YCBhbmQgYnJlYWtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUubm9kZVR5cGUgPT09IDEgJiYgKytkaWZmICYmIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBub2RlSW5kZXgsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHQvLyBVc2UgcHJldmlvdXNseS1jYWNoZWQgZWxlbWVudCBpbmRleCBpZiBhdmFpbGFibGVcblx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0XHRkaWZmID0gbm9kZUluZGV4O1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8geG1sIDpudGgtY2hpbGQoLi4uKVxuXHRcdFx0XHRcdFx0XHQvLyBvciA6bnRoLWxhc3QtY2hpbGQoLi4uKSBvciA6bnRoKC1sYXN0KT8tb2YtdHlwZSguLi4pXG5cdFx0XHRcdFx0XHRcdGlmICggZGlmZiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gVXNlIHRoZSBzYW1lIGxvb3AgYXMgYWJvdmUgdG8gc2VlayBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmICggKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0KytkaWZmICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIENhY2hlIHRoZSBpbmRleCBvZiBlYWNoIGVuY291bnRlcmVkIGVsZW1lbnRcblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCB1c2VDYWNoZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgdHlwZSBdID0gWyBkaXJydW5zLCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIG5vZGUgPT09IGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gSW5jb3Jwb3JhdGUgdGhlIG9mZnNldCwgdGhlbiBjaGVjayBhZ2FpbnN0IGN5Y2xlIHNpemVcblx0XHRcdFx0XHRcdGRpZmYgLT0gbGFzdDtcblx0XHRcdFx0XHRcdHJldHVybi
21167BkaWZmID09PSBmaXJzdCB8fCAoIGRpZmYgJSBmaXJzdCA9PT0gMCAmJiBkaWZmIC8gZmlyc3QgPj0gMCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJQU0VVRE9cIjogZnVuY3Rpb24oIHBzZXVkbywgYXJndW1lbnQgKSB7XG5cdFx0XHQvLyBwc2V1ZG8tY2xhc3MgbmFtZXMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jcHNldWRvLWNsYXNzZXNcblx0XHRcdC8vIFByaW9yaXRpemUgYnkgY2FzZSBzZW5zaXRpdml0eSBpbiBjYXNlIGN1c3RvbSBwc2V1ZG9zIGFyZSBhZGRlZCB3aXRoIHVwcGVyY2FzZSBsZXR0ZXJzXG5cdFx0XHQvLyBSZW1lbWJlciB0aGF0IHNldEZpbHRlcnMgaW5oZXJpdHMgZnJvbSBwc2V1ZG9zXG5cdFx0XHR2YXIgYXJncyxcblx0XHRcdFx0Zm4gPSBFeHByLnBzZXVkb3NbIHBzZXVkbyBdIHx8IEV4cHIuc2V0RmlsdGVyc1sgcHNldWRvLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBwc2V1ZG86IFwiICsgcHNldWRvICk7XG5cblx0XHRcdC8vIFRoZSB1c2VyIG1heSB1c2UgY3JlYXRlUHNldWRvIHRvIGluZGljYXRlIHRoYXRcblx0XHRcdC8vIGFyZ3VtZW50cyBhcmUgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgZmlsdGVyIGZ1bmN0aW9uXG5cdFx0XHQvLyBqdXN0IGFzIFNpenpsZSBkb2VzXG5cdFx0XHRpZiAoIGZuWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdHJldHVybiBmbiggYXJndW1lbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQnV0IG1haW50YWluIHN1cHBvcnQgZm9yIG9sZCBzaWduYXR1cmVzXG5cdFx0XHRpZiAoIGZuLmxlbmd0aCA+IDEgKSB7XG5cdFx0XHRcdGFyZ3MgPSBbIHBzZXVkbywgcHNldWRvLCBcIlwiLCBhcmd1bWVudCBdO1xuXHRcdFx0XHRyZXR1cm4gRXhwci5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KCBwc2V1ZG8udG9Mb3dlckNhc2UoKSApID9cblx0XHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHRcdFx0XHR2YXIgaWR4LFxuXHRcdFx0XHRcdFx0XHRtYXRjaGVkID0gZm4oIHNlZWQsIGFyZ3VtZW50ICksXG5cdFx0XHRcdFx0XHRcdGkgPSBtYXRjaGVkLmxlbmd0aDtcblx0XHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0XHRpZHggPSBpbmRleE9mKCBzZWVkLCBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHRcdHNlZWRbIGlkeCBdID0gISggbWF0Y2hlc1sgaWR4IF0gPSBtYXRjaGVkW2ldICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSkgOlxuXHRcdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZuKCBlbGVtLCAwLCBhcmdzICk7XG5cdFx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGZuO1xuXHRcdH1cblx0fSxcblxuXHRwc2V1ZG9zOiB7XG5cdFx0Ly8gUG90ZW50aWFsbHkgY29tcGxleCBwc2V1ZG9zXG5cdFx0XCJub3RcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdC8vIFRyaW0gdGhlIHNlbGVjdG9yIHBhc3NlZCB0byBjb21waWxlXG5cdFx0XHQvLyB0byBhdm9pZCB0cmVhdGluZyBsZWFkaW5nIGFuZCB0cmFpbGluZ1xuXHRcdFx0Ly8gc3BhY2VzIGFzIGNvbWJpbmF0b3JzXG5cdFx0XHR2YXIgaW5wdXQgPSBbXSxcblx0XHRcdFx0cmVzdWx0cyA9IFtdLFxuXHRcdFx0XHRtYXRjaGVyID0gY29tcGlsZSggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApICk7XG5cblx0XHRcdHJldHVybiBtYXRjaGVyWyBleHBhbmRvIF0gP1xuXHRcdFx0XHRtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMsIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0XHRcdHVubWF0Y2hlZCA9IG1hdGNoZXIoIHNlZWQsIG51bGwsIHhtbCwgW10gKSxcblx0XHRcdFx0XHRcdGkgPSBzZWVkLmxlbmd0aDtcblxuXHRcdFx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIHVubWF0Y2hlZCBieSBgbWF0Y2hlcmBcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0XHRcdFx0XHRzZWVkW2ldID0gIShtYXRjaGVzW2ldID0gZWxlbSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBlbGVtO1xuXHRcdFx0XHRcdG1hdGNoZXIoIGlucHV0LCBudWxsLCB4bWwsIHJlc3VsdHMgKTtcblx0XHRcdFx0XHQvLyBEb24ndCBrZWVwIHRoZSBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0XHRcdGlucHV0WzBdID0gbnVsbDtcblx0XHRcdFx0XHRyZXR1cm4gIXJlc3VsdHMucG9wKCk7XG5cdFx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImhhc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gU2l6emxlKCBzZWxlY3RvciwgZWxlbSApLmxlbmd0aCA+IDA7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJjb250YWluc1wiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHR0ZXh0ID0gdGV4dC5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLnRleHRDb250ZW50IHx8IGVsZW0uaW5uZXJUZXh0IHx8IGdldFRleHQoIGVsZW0gKSApLmluZGV4T2YoIHRleHQgKSA+IC0xO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIFwiV2hldGhlciBhbiBlbGVtZW50IGlzIHJlcHJlc2VudGVkIGJ5IGEgOmxhbmcoKSBzZWxlY3RvclxuXHRcdC8vIGlzIGJhc2VkIHNvbGVseSBvbiB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlXG5cdFx0Ly8gYmVpbmcgZXF1YWwgdG8gdGhlIGlkZW50aWZpZXIgQyxcblx0XHQvLyBvciBiZWdpbm5pbmcgd2l0aCB0aGUgaWRlbnRpZmllciBDIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IFwiLVwiLlxuXHRcdC8vIFRoZSBtYXRjaGluZyBvZiBDIGFnYWluc3QgdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZSBpcyBwZXJmb3JtZWQgY2FzZS1pbnNlbnNpdGl2ZWx5LlxuXHRcdC8vIFRoZSBpZGVudGlmaWVyIEMgZG9lcyBub3QgaGF2ZSB0byBiZSBhIHZhbGlkIGxhbmd1YWdlIG5hbWUuXCJcblx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2xhbmctcHNldWRvXG5cdFx0XCJsYW5nXCI6IG1hcmtGdW5jdGlvbiggZnVuY3Rpb24oIGxhbmcgKSB7XG5cdFx0XHQvLyBsYW5nIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyXG5cdFx0XHRpZiAoICFyaWRlbnRpZmllci50ZXN0KGxhbmcgfHwgXCJcIikgKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggXCJ1bnN1cHBvcnRlZCBsYW5nOiBcIiArIGxhbmcgKTtcblx0XHRcdH1cblx0XHRcdGxhbmcgPSBsYW5nLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybi
21167BmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIGVsZW1MYW5nO1xuXHRcdFx0XHRkbyB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbUxhbmcgPSBkb2N1bWVudElzSFRNTCA/XG5cdFx0XHRcdFx0XHRlbGVtLmxhbmcgOlxuXHRcdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoXCJ4bWw6bGFuZ1wiKSB8fCBlbGVtLmdldEF0dHJpYnV0ZShcImxhbmdcIikpICkge1xuXG5cdFx0XHRcdFx0XHRlbGVtTGFuZyA9IGVsZW1MYW5nLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbUxhbmcgPT09IGxhbmcgfHwgZWxlbUxhbmcuaW5kZXhPZiggbGFuZyArIFwiLVwiICkgPT09IDA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IHdoaWxlICggKGVsZW0gPSBlbGVtLnBhcmVudE5vZGUpICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdC8vIE1pc2NlbGxhbmVvdXNcblx0XHRcInRhcmdldFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBoYXNoID0gd2luZG93LmxvY2F0aW9uICYmIHdpbmRvdy5sb2NhdGlvbi5oYXNoO1xuXHRcdFx0cmV0dXJuIGhhc2ggJiYgaGFzaC5zbGljZSggMSApID09PSBlbGVtLmlkO1xuXHRcdH0sXG5cblx0XHRcInJvb3RcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jRWxlbTtcblx0XHR9LFxuXG5cdFx0XCJmb2N1c1wiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50ICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkgJiYgISEoZWxlbS50eXBlIHx8IGVsZW0uaHJlZiB8fCB+ZWxlbS50YWJJbmRleCk7XG5cdFx0fSxcblxuXHRcdC8vIEJvb2xlYW4gcHJvcGVydGllc1xuXHRcdFwiZW5hYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggZmFsc2UgKSxcblx0XHRcImRpc2FibGVkXCI6IGNyZWF0ZURpc2FibGVkUHNldWRvKCB0cnVlICksXG5cblx0XHRcImNoZWNrZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBJbiBDU1MzLCA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIGJvdGggY2hlY2tlZCBhbmQgc2VsZWN0ZWQgZWxlbWVudHNcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMTEvUkVDLWNzczMtc2VsZWN0b3JzLTIwMTEwOTI5LyNjaG
21167Vja2VkXG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gKG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgISFlbGVtLmNoZWNrZWQpIHx8IChub2RlTmFtZSA9PT0gXCJvcHRpb25cIiAmJiAhIWVsZW0uc2VsZWN0ZWQpO1xuXHRcdH0sXG5cblx0XHRcInNlbGVjdGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gQWNjZXNzaW5nIHRoaXMgcHJvcGVydHkgbWFrZXMgc2VsZWN0ZWQtYnktZGVmYXVsdFxuXHRcdFx0Ly8gb3B0aW9ucyBpbiBTYWZhcmkgd29yayBwcm9wZXJseVxuXHRcdFx0aWYgKCBlbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGVsZW0ucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5zZWxlY3RlZCA9PT0gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0Ly8gQ29udGVudHNcblx0XHRcImVtcHR5XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNlbXB0eS1wc2V1ZG9cblx0XHRcdC8vIDplbXB0eSBpcyBuZWdhdGVkIGJ5IGVsZW1lbnQgKDEpIG9yIGNvbnRlbnQgbm9kZXMgKHRleHQ6IDM7IGNkYXRhOiA0OyBlbnRpdHkgcmVmOiA1KSxcblx0XHRcdC8vICAgYnV0IG5vdCBieSBvdGhlcnMgKGNvbW1lbnQ6IDg7IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246IDc7IGV0Yy4pXG5cdFx0XHQvLyBub2RlVHlwZSA8IDYgd29ya3MgYmVjYXVzZSBhdHRyaWJ1dGVzICgyKSBkbyBub3QgYXBwZWFyIGFzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlIDwgNiApIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0sXG5cblx0XHRcInBhcmVudFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAhRXhwci5wc2V1ZG9zW1wiZW1wdHlcIl0oIGVsZW0gKTtcblx0XHR9LFxuXG5cdFx0Ly8gRWxlbWVudC9pbnB1dCB0eXBlc1xuXHRcdFwiaGVhZGVyXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJoZWFkZXIudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImlucHV0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIHJpbnB1dHMudGVzdCggZWxlbS5ub2RlTmFtZSApO1xuXHRcdH0sXG5cblx0XHRcImJ1dHRvblwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5hbWUgPT09IFwiaW5wdXRcIiAmJiBlbGVtLnR5cGUgPT09IFwiYnV0dG9uXCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIjtcblx0XHR9LFxuXG5cdFx0XCJ0ZXh0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGF0dHI7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBcImlucHV0XCIgJiZcblx0XHRcdFx0ZWxlbS50eXBlID09PSBcInRleHRcIiAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFPDhcblx0XHRcdFx0Ly8gTmV3IEhUTUw1IGF0dHJpYnV0ZSB2YWx1ZXMgKGUuZy4sIFwic2VhcmNoXCIpIGFwcGVhciB3aXRoIGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCJcblx0XHRcdFx0KCAoYXR0ciA9IGVsZW0uZ2V0QXR0cmlidXRlKFwidHlwZVwiKSkgPT0gbnVsbCB8fCBhdHRyLnRvTG93ZXJDYXNlKCkgPT09IFwidGV4dFwiICk7XG5cdFx0fSxcblxuXHRcdC8vIFBvc2l0aW9uLWluLWNvbGxlY3Rpb25cblx0XHRcImZpcnN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4gWyAwIF07XG5cdFx0fSksXG5cblx0XHRcImxhc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gWyBsZW5ndGggLSAxIF07XG5cdFx0fSksXG5cblx0XHRcImVxXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHJldHVybiBbIGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQgXTtcblx0XHR9KSxcblxuXHRcdFwiZXZlblwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwib2RkXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAxO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJsdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7IC0taSA+PSAwOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImd0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgKytpIDwgbGVuZ3RoOyApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybi
21167BtYXRjaEluZGV4ZXM7XG5cdFx0fSlcblx0fVxufTtcblxuRXhwci5wc2V1ZG9zW1wibnRoXCJdID0gRXhwci5wc2V1ZG9zW1wiZXFcIl07XG5cbi8vIEFkZCBidXR0b24vaW5wdXQgdHlwZSBwc2V1ZG9zXG5mb3IgKCBpIGluIHsgcmFkaW86IHRydWUsIGNoZWNrYm94OiB0cnVlLCBmaWxlOiB0cnVlLCBwYXNzd29yZDogdHJ1ZSwgaW1hZ2U6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVJbnB1dFBzZXVkbyggaSApO1xufVxuZm9yICggaSBpbiB7IHN1Ym1pdDogdHJ1ZSwgcmVzZXQ6IHRydWUgfSApIHtcblx0RXhwci5wc2V1ZG9zWyBpIF0gPSBjcmVhdGVCdXR0b25Qc2V1ZG8oIGkgKTtcbn1cblxuLy8gRWFzeSBBUEkgZm9yIGNyZWF0aW5nIG5ldyBzZXRGaWx0ZXJzXG5mdW5jdGlvbiBzZXRGaWx0ZXJzKCkge31cbnNldEZpbHRlcnMucHJvdG90eXBlID0gRXhwci5maWx0ZXJzID0gRXhwci5wc2V1ZG9zO1xuRXhwci5zZXRGaWx0ZXJzID0gbmV3IHNldEZpbHRlcnMoKTtcblxudG9rZW5pemUgPSBTaXp6bGUudG9rZW5pemUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIHBhcnNlT25seSApIHtcblx0dmFyIG1hdGNoZWQsIG1hdGNoLCB0b2tlbnMsIHR5cGUsXG5cdFx0c29GYXIsIGdyb3VwcywgcHJlRmlsdGVycyxcblx0XHRjYWNoZWQgPSB0b2tlbkNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCBjYWNoZWQgKSB7XG5cdFx0cmV0dXJuIHBhcnNlT25seSA/IDAgOiBjYWNoZWQuc2xpY2UoIDAgKTtcblx0fVxuXG5cdHNvRmFyID0gc2VsZWN0b3I7XG5cdGdyb3VwcyA9IFtdO1xuXHRwcmVGaWx0ZXJzID0gRXhwci5wcmVGaWx0ZXI7XG5cblx0d2hpbGUgKCBzb0ZhciApIHtcblxuXHRcdC8vIENvbW1hIGFuZCBmaXJzdCBydW5cblx0XHRpZiAoICFtYXRjaGVkIHx8IChtYXRjaCA9IHJjb21tYS5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdGlmICggbWF0Y2ggKSB7XG5cdFx0XHRcdC8vIERvbid0IGNvbnN1bWUgdHJhaWxpbmcgY29tbWFzIGFzIHZhbGlkXG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoWzBdLmxlbmd0aCApIHx8IHNvRmFyO1xuXHRcdFx0fVxuXHRcdFx0Z3JvdXBzLnB1c2goICh0b2tlbnMgPSBbXSkgKTtcblx0XHR9XG5cblx0XHRtYXRjaGVkID0gZmFsc2U7XG5cblx0XHQvLyBDb21iaW5hdG9yc1xuXHRcdGlmICggKG1hdGNoID0gcmNvbWJpbmF0b3JzLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHQvLyBDYXN0IGRlc2NlbmRhbnQgY29tYmluYXRvcnMgdG8gc3BhY2Vcblx0XHRcdFx0dHlwZTogbWF0Y2hbMF0ucmVwbGFjZSggcnRyaW0sIFwiIFwiIClcblx0XHRcdH0pO1xuXHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGaWx0ZXJzXG5cdFx0Zm9yICggdHlwZSBpbiBFeHByLmZpbHRlciApIHtcblx0XHRcdGlmICggKG1hdGNoID0gbWF0Y2hFeHByWyB0eXBlIF0uZXhlYyggc29GYXIgKSkgJiYgKCFwcmVGaWx0ZXJzWyB0eXBlIF0gfHxcblx0XHRcdFx0KG1hdGNoID0gcHJlRmlsdGVyc1sgdHlwZSBdKCBtYXRjaCApKSkgKSB7XG5cdFx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0XHR0b2tlbnMucHVzaCh7XG5cdFx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0XHRtYXRjaGVzOiBtYXRjaFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hlZC5sZW5ndGggKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoICFtYXRjaGVkICkge1xuXHRcdFx0YnJlYWs7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIGludmFsaWQgZXhjZXNzXG5cdC8vIGlmIHdlJ3JlIGp1c3QgcGFyc2luZ1xuXHQvLyBPdGhlcndpc2UsIHRocm93IGFuIGVycm9yIG9yIHJldHVybiB0b2tlbnNcblx0cmV0dXJuIHBhcnNlT25seSA/XG5cdFx0c29GYXIubGVuZ3RoIDpcblx0XHRzb0ZhciA/XG5cdFx0XHRTaXp6bGUuZXJyb3IoIHNlbGVjdG9yICkgOlxuXHRcdFx0Ly8gQ2FjaGUgdGhlIHRva2Vuc1xuXHRcdFx0dG9rZW5DYWNoZSggc2VsZWN0b3IsIGdyb3VwcyApLnNsaWNlKCAwICk7XG59O1xuXG5mdW5jdGlvbiB0b1NlbGVjdG9yKCB0b2tlbnMgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdHNlbGVjdG9yID0gXCJcIjtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0c2VsZWN0b3IgKz0gdG9rZW5zW2ldLnZhbHVlO1xuXHR9XG5cdHJldHVybiBzZWxlY3Rvcjtcbn1cblxuZnVuY3Rpb24gYWRkQ29tYmluYXRvciggbWF0Y2hlciwgY29tYmluYXRvciwgYmFzZSApIHtcblx0dmFyIGRpciA9IGNvbWJpbmF0b3IuZGlyLFxuXHRcdHNraXAgPSBjb21iaW5hdG9yLm5leHQsXG5cdFx0a2V5ID0gc2tpcCB8fCBkaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYga2V5ID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5
21167hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggc2tpcCAmJiBza2lwID09PSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdGVsZW0gPSBlbGVtWyBkaXIgXSB8fCBlbGVtO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGtleSBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsga2V5IF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlI
21167HJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybi
21167BzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgP
21167SBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0Y29udGV4dC5ub2RlVHlwZSA9PT0gOSAmJiBkb2N1bWVudElzSFRNTCAmJiBFeHByLnJlbGF0aXZlWyB0b2tlbnNbMV0udHlwZSBdICkge1xuXG5cdFx0XHRjb250ZXh0ID0gKCBFeHByLmZpbmRbXCJJRFwiXSggdG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKHJ1bmVzY2FwZSwgZnVuZXNjYXBlKSwgY29udGV4dCApIHx8IFtdIClbMF07XG5cdFx0XHRpZiAoICFjb250ZXh0ICkge1xuXHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0Ly8gUHJlY29tcGlsZWQgbWF0Y2hlcnMgd2lsbCBzdGlsbCB2ZXJpZnkgYW5jZXN0cnksIHNvIHN0ZXAgdXAgYSBsZXZlbFxuXHRcdFx0fSBlbHNlIGlmICggY29tcGlsZWQgKSB7XG5cdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cblx0XHRcdHNlbGVjdG9yID0gc2VsZWN0b3Iuc2xpY2UoIHRva2Vucy5zaGlmdCgpLnZhbHVlLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZldGNoIGEgc2VlZCBzZXQgZm9yIHJpZ2h0LXRvLWxlZnQgbWF0Y2hpbmdcblx0XHRpID0gbWF0Y2hFeHByW1wibmVlZHNDb250ZXh0XCJdLnRlc3QoIHNlbGVjdG9yICkgPyAwIDogdG9rZW5zLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdHRva2VuID0gdG9rZW5zW2ldO1xuXG5cdFx0XHQvLyBBYm9ydCBpZiB3ZSBoaXQgYSBjb21iaW5hdG9yXG5cdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbICh0eXBlID0gdG9rZW4udHlwZSkgXSApIHtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIChmaW5kID0gRXhwci5maW5kWyB0eXBlIF0pICkge1xuXHRcdFx0XHQvLyBTZWFyY2gsIGV4cGFuZGluZyBjb250ZXh0IGZvciBsZWFkaW5nIHNpYmxpbmcgY29tYmluYXRvcnNcblx0XHRcdFx0aWYgKCAoc2VlZCA9IGZpbmQoXG5cdFx0XHRcdFx0dG9rZW4ubWF0Y2hlc1swXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLFxuXHRcdFx0XHRcdHJzaWJsaW5nLnRlc3QoIHRva2Vuc1swXS50eXBlICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8IGNvbnRleHRcblx0XHRcdFx0KSkgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiBzZWVkIGlzIGVtcHR5IG9yIG5vIHRva2VucyByZW1haW4sIHdlIGNhbiByZXR1cm4gZWFybHlcblx0XHRcdFx0XHR0b2tlbnMuc3BsaWNlKCBpLCAxICk7XG5cdFx0XHRcdFx0c2VsZWN0b3IgPSBzZWVkLmxlbmd0aCAmJi
21167B0b1NlbGVjdG9yKCB0b2tlbnMgKTtcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNlZWQgKTtcblx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ29tcGlsZSBhbmQgZXhlY3V0ZSBhIGZpbHRlcmluZyBmdW5jdGlvbiBpZiBvbmUgaXMgbm90IHByb3ZpZGVkXG5cdC8vIFByb3ZpZGUgYG1hdGNoYCB0byBhdm9pZCByZXRva2VuaXphdGlvbiBpZiB3ZSBtb2RpZmllZCB0aGUgc2VsZWN0b3IgYWJvdmVcblx0KCBjb21waWxlZCB8fCBjb21waWxlKCBzZWxlY3RvciwgbWF0Y2ggKSApKFxuXHRcdHNlZWQsXG5cdFx0Y29udGV4dCxcblx0XHQhZG9jdW1lbnRJc0hUTUwsXG5cdFx0cmVzdWx0cyxcblx0XHQhY29udGV4dCB8fCByc2libGluZy50ZXN0KCBzZWxlY3RvciApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdCk7XG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLy8gT25lLXRpbWUgYXNzaWdubWVudHNcblxuLy8gU29ydCBzdGFiaWxpdHlcbnN1cHBvcnQuc29ydFN0YWJsZSA9IGV4cGFuZG8uc3BsaXQoXCJcIikuc29ydCggc29ydE9yZGVyICkuam9pbihcIlwiKSA9PT0gZXhwYW5kbztcblxuLy8gU3VwcG9ydDogQ2hyb21lIDE0LTM1K1xuLy8gQWx3YXlzIGFzc3VtZSBkdXBsaWNhdGVzIGlmIHRoZXkgYXJlbid0IHBhc3NlZCB0byB0aGUgY29tcGFyaXNvbiBmdW5jdGlvblxuc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzID0gISFoYXNEdXBsaWNhdGU7XG5cbi8vIEluaXRpYWxpemUgYWdhaW5zdCB0aGUgZGVmYXVsdCBkb2N1bWVudFxuc2V0RG9jdW1lbnQoKTtcblxuLy8gU3VwcG9ydDogV2Via2l0PDUzNy4zMiAtIFNhZmFyaSA2LjAuMy9DaHJvbWUgMjUgKGZpeGVkIGluIENocm9tZSAyNylcbi8vIERldGFjaGVkIG5vZGVzIGNvbmZvdW5kaW5nbHkgZm9sbG93ICplYWNoIG90aGVyKlxuc3VwcG9ydC5zb3J0RGV0YWNoZWQgPSBhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGVsLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvbXM1MzY0MjklMjhWUy44NSUyOS5hc3B4XG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JyMnPjwvYT5cIjtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKSA9PT0gXCIjXCIgO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggXCJ0eXBlfGhyZWZ8aGVpZ2h0fHdpZHRoXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSwgbmFtZS50b0xvd2VyQ2FzZSgpID09PSBcInR5cGVcIiA/IDEgOiAyICk7XG5cdFx0fVxuXHR9KTtcbn1cblxuLy8gU3VwcG9ydDogSUU8OVxuLy8gVXNlIGRlZmF1bHRWYWx1ZSBpbiBwbGFjZSBvZiBnZXRBdHRyaWJ1dGUoXCJ2YWx1ZVwiKVxuaWYgKCAhc3VwcG9ydC5hdHRyaWJ1dGVzIHx8ICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRlbC5pbm5lckhUTUwgPSBcIjxpbnB1dC8+XCI7XG5cdGVsLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCBcInZhbHVlXCIsIFwiXCIgKTtcblx0cmV0dXJuIGVsLmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdHJldHVybiBlbC5nZXRBdHRyaWJ1dGUoXCJkaXNhYmxlZFwiKSA9PSBudWxsO1xufSkgKSB7XG5cdGFkZEhhbmRsZSggYm9vbGVhbnMsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgdmFsO1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW1bIG5hbWUgXSA9PT0gdHJ1ZSA/IG5hbWUudG9Mb3dlckNhc2UoKSA6XG5cdFx0XHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZSggbmFtZSApKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0XHR2YWwudmFsdWUgOlxuXHRcdFx0XHRudWxsO1xuXHRcdH1cblx0fSk7XG59XG5cbnJldHVybiBTaXp6bGU7XG5cbn0pKCB3aW5kb3cgKTtcblxuXG5cbmpRdWVyeS5maW5kID0gU2l6emxlO1xualF1ZXJ5LmV4cHIgPSBTaXp6bGUuc2VsZWN0b3JzO1xuXG4vLyBEZXByZWNhdGVkXG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5qUXVlcnkuZXNjYXBlU2VsZWN0b3IgPSBTaXp6bGUuZXNjYXBlO1xuXG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybi
21167BtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG5cblxuZnVuY3Rpb24gbm9kZU5hbWUoIGVsZW0sIG5hbWUgKSB7XG5cbiAgcmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cbn07XG52YXIgcnNpbmdsZVRhZyA9ICggL148KFthLXpdW15cXC9cXDA+OlxceDIwXFx0XFxyXFxuXFxmXSopW1xceDIwXFx0XFxyXFxuXFxmXSpcXC8/Pig/OjxcXC9cXDE+fCkkL2kgKTtcblxuXG5cbi8vIEltcGxlbWVudCB0aGUgaWRlbnRpY2FsIGZ1bmN0aW9uYWxpdHkgZm9yIGZpbHRlciBhbmQgbm90XG5mdW5jdGlvbiB3aW5ub3coIGVsZW1lbnRzLCBxdWFsaWZpZXIsIG5vdCApIHtcblx0aWYgKCBpc0Z1bmN0aW9uKCBxdWFsaWZpZXIgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiAhIXF1YWxpZmllci5jYWxsKCBlbGVtLCBpLCBlbGVtICkgIT09IG5vdDtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBTaW5nbGUgZWxlbWVudFxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gQXJyYXlsaWtlIG9mIGVsZW1lbnRzIChqUXVlcnksIGFyZ3VtZW50cywgQXJyYXkpXG5cdGlmICggdHlwZW9mIHF1YWxpZmllciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGluZGV4T2YuY2FsbCggcXVhbGlmaWVyLCBlbGVtICkgPiAtMSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gRmlsdGVyZWQgZGlyZWN0bHkgZm9yIGJvdGggc2ltcGxlIGFuZCBjb21wbGV4IHNlbGVjdG9yc1xuXHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG59XG5cbmpRdWVyeS5maWx0ZXIgPSBmdW5jdGlvbiggZXhwciwgZWxlbXMsIG5vdCApIHtcblx0dmFyIGVsZW0gPSBlbGVtc1sgMCBdO1xuXG5cdGlmICggbm90ICkge1xuXHRcdGV4cHIgPSBcIjpub3QoXCIgKyBleHByICsgXCIpXCI7XG5cdH1cblxuXHRpZiAoIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdHJldHVybiBqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW107XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlcyggZXhwciwgalF1ZXJ5LmdyZXAoIGVsZW1zLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0fSApICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZpbmQ6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgaSwgcmV0LFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRzZWxmID0gdGhpcztcblxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkoIHNlbGVjdG9yICkuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRpZiAoIGpRdWVyeS5jb250YWlucyggc2VsZlsgaSBdLCB0aGlzICkgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0gKSApO1xuXHRcdH1cblxuXHRcdHJldCA9IHRoaXMucHVzaFN0YWNrKCBbXSApO1xuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbGVuID4gMSA/IGpRdWVyeS51bmlxdWVTb3J0KCByZXQgKSA6IHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHQvLyBTaG9ydGN1dCBzaW1wbGUgI2lkIGNhc2UgZm9yIHNwZWVkXG5cdHJxdWlja0V4cHIgP
21167SAvXig/OlxccyooPFtcXHdcXFddKz4pW14+XSp8IyhbXFx3LV0rKSkkLyxcblxuXHRpbml0ID0galF1ZXJ5LmZuLmluaXQgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJvb3QgKSB7XG5cdFx0dmFyIG1hdGNoLCBlbGVtO1xuXG5cdFx0Ly8gSEFORExFOiAkKFwiXCIpLCAkKG51bGwpLCAkKHVuZGVmaW5lZCksICQoZmFsc2UpXG5cdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cblx0XHQvLyBNZXRob2QgaW5pdCgpIGFjY2VwdHMgYW4gYWx0ZXJuYXRlIHJvb3RqUXVlcnlcblx0XHQvLyBzbyBtaWdyYXRlIGNhbiBzdXBwb3J0IGpRdWVyeS5zdWIgKGdoLTIxMDEpXG5cdFx0cm9vdCA9IHJvb3QgfHwgcm9vdGpRdWVyeTtcblxuXHRcdC8vIEhhbmRsZSBIVE1MIHN0cmluZ3Ncblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGlmICggc2VsZWN0b3JbIDAgXSA9PT0gXCI8XCIgJiZcblx0XHRcdFx0c2VsZWN0b3JbIHNlbGVjdG9yLmxlbmd0aCAtIDEgXSA9PT0gXCI+XCIgJiZcblx0XHRcdFx0c2VsZWN0b3IubGVuZ3RoID49IDMgKSB7XG5cblx0XHRcdFx0Ly8gQXNzdW1lIHRoYXQgc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgd2l0aCA8PiBhcmUgSFRNTCBhbmQgc2tpcCB0aGUgcmVnZXggY2hlY2tcblx0XHRcdFx0bWF0Y2ggPSBbIG51bGwsIHNlbGVjdG9yLCBudWxsIF07XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG1hdGNoID0gcnF1aWNrRXhwci5leGVjKCBzZWxlY3RvciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYXRjaCBodG1sIG9yIG1ha2Ugc3VyZSBubyBjb250ZXh0IGlzIHNwZWNpZmllZCBmb3IgI2lkXG5cdFx0XHRpZiAoIG1hdGNoICYmICggbWF0Y2hbIDEgXSB8fCAhY29udGV4dCApICkge1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJChodG1sKSAtPiAkKGFycmF5KVxuXHRcdFx0XHRpZiAoIG1hdGNoWyAxIF0gKSB7XG5cdFx0XHRcdFx0Y29udGV4dCA9IGNvbnRleHQgaW5zdGFuY2VvZiBqUXVlcnkgPyBjb250ZXh0WyAwIF0gOiBjb250ZXh0O1xuXG5cdFx0XHRcdFx0Ly8gT3B0aW9uIHRvIHJ1biBzY3JpcHRzIGlzIHRydWUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdFx0Ly8gSW50ZW50aW9uYWxseSBsZXQgdGhlIGVycm9yIGJlIHRocm93biBpZiBwYXJzZUhUTUwgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHRoaXMsIGpRdWVyeS5wYXJzZUhUTUwoXG5cdFx0XHRcdFx0XHRtYXRjaFsgMSBdLFxuXHRcdFx0XHRcdFx0Y29udGV4dCAmJiBjb250ZXh0Lm5vZGVUeXBlID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBkb2N1bWVudCxcblx0XHRcdFx0XHRcdHRydWVcblx0XHRcdFx0XHQpICk7XG5cblx0XHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCwgcHJvcHMpXG5cdFx0XHRcdFx0aWYgKCByc2luZ2xlVGFnLnRlc3QoIG1hdGNoWyAxIF0gKSAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggY29udGV4dCApICkge1xuXHRcdFx0XHRcdFx0Zm9yICggbWF0Y2ggaW4gY29udGV4dCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBQcm9wZXJ0aWVzIG9mIGNvbnRleHQgYXJlIGNhbGxlZCBhcyBtZXRob2RzIGlmIHBvc3NpYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhpc1sgbWF0Y2ggXSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXNbIG1hdGNoIF0oIGNvbnRleHRbIG1hdGNoIF0gKTtcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgb3RoZXJ3aXNlIHNldCBhcyBhdHRyaWJ1dGVzXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5hdHRyKCBtYXRjaCwgY29udGV4dFsgbWF0Y2ggXSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHRcdFx0Ly8gSEFORExFOiAkKCNpZClcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRlbGVtID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIG1hdGNoWyAyIF0gKTtcblxuXHRcdFx0XHRcdGlmICggZWxlbSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSW5qZWN0IHRoZSBlbGVtZW50IGRpcmVjdGx5IGludG8gdGhlIGpRdWVyeSBvYmplY3Rcblx0XHRcdFx0XHRcdHRoaXNbIDAgXSA9IGVsZW07XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCAkKC4uLikpXG5cdFx0XHR9IGVsc2UgaWYgKCAhY29udGV4dCB8fCBjb250ZXh0LmpxdWVyeSApIHtcblx0XHRcdFx0cmV0dXJuICggY29udGV4dCB8fCByb290ICkuZmluZCggc2VsZWN0b3IgKTtcblxuXHRcdFx0Ly8gSEFORExFOiAkKGV4cHIsIGNvbnRleHQpXG5cdFx0XHQvLyAod2hpY2ggaXMganVzdCBlcXVpdmFsZW50IHRvOiAkKGNvbnRleHQpLmZpbmQoZXhwcilcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdG9yKCBjb250ZXh0ICkuZmluZCggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdC8vIEhBTkRMRTogJChET01FbGVtZW50KVxuXHRcdH0gZWxzZSBpZiAoIHNlbGVjdG9yLm5vZGVUeXBlICkge1xuXHRcdFx0dGhpc1sgMCBdID0gc2VsZWN0b3I7XG5cdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdC8vIEhBTkRMRTogJChmdW5jdGlvbilcblx0XHQvLyBTaG9ydGN1dCBmb3IgZG9jdW1lbnQgcmVhZHlcblx0XHR9IGVsc2UgaWYgKCBpc0Z1bmN0aW9uKCBzZWxlY3RvciApICkge1xuXHRcdFx0cmV0dXJuIHJvb3QucmVhZHkgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHJvb3QucmVhZHkoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIEV4ZWN1dGUgaW1tZWRpYXRlbHkgaWYgcmVhZHkgaXMgbm90IHByZXNlbnRcblx0XHRcdFx0c2VsZWN0b3IoIGpRdWVyeSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBqUXVlcnkubWFrZUFycmF5KCBzZWxlY3RvciwgdGhpcyApO1xuXHR9O1xuXG4vLyBHaXZlIHRoZSBpbml0IGZ1bmN0aW9uIHRoZSBqUXVlcnkgcHJvdG90eXBlIGZvciBsYXRlciBpbnN0YW50aWF0aW9uXG5pbml0LnByb3RvdHlwZSA9IGpRdWVyeS5mbjtcblxuLy8gSW5pdGlhbGl6ZSBjZW50cmFsIHJlZmVyZW5jZVxucm9vdGpRdWVyeSA9IGpRdWVyeSggZG9jdW1lbnQgKTtcblxuXG52YXIgcnBhcmVudHNwcmV2ID0gL14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sXG5cblx0Ly8gTWV0aG9kcyBndWFyYW50ZWVkIHRvIHByb2R1Y2UgYSB1bmlxdWUgc2V0IHdoZW4gc3RhcnRpbmcgZnJvbSBhIHVuaXF1ZSBzZXRcblx0Z3VhcmFudGVlZFVuaXF1ZSA9IHtcblx0XHRjaGlsZHJlbjogdHJ1ZSxcblx0XHRjb250ZW50czogdHJ1ZSxcblx0XHRuZXh0OiB0cnVlLFxuXHRcdHByZXY6IHRydWVcblx0fTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRoYXM6IGZ1bmN0aW9uKCB0YXJnZXQgKSB7XG5cdFx0dmFyIHRhcmdldHMgPSBqUXVlcnkoIHRhcmdldCwgdGhpcyApLFxuXHRcdFx0bCA9IHRhcmdldHMubGVuZ3RoO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpID0gMDtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHRoaXMsIHRhcmdldHNbIGkgXSApICkge1xuXHRcdFx0XHRcdHJldHVybi
21167B0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGNsb3Nlc3Q6IGZ1bmN0aW9uKCBzZWxlY3RvcnMsIGNvbnRleHQgKSB7XG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0bCA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0bWF0Y2hlZCA9IFtdLFxuXHRcdFx0dGFyZ2V0cyA9IHR5cGVvZiBzZWxlY3RvcnMgIT09IFwic3RyaW5nXCIgJiYgalF1ZXJ5KCBzZWxlY3RvcnMgKTtcblxuXHRcdC8vIFBvc2l0aW9uYWwgc2VsZWN0b3JzIG5ldmVyIG1hdGNoLCBzaW5jZSB0aGVyZSdzIG5vIF9zZWxlY3Rpb25fIGNvbnRleHRcblx0XHRpZiAoICFybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9ycyApICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmb3IgKCBjdXIgPSB0aGlzWyBpIF07IGN1ciAmJiBjdXIgIT09IGNvbnRleHQ7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXG5cdFx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPCAxMSAmJiAoIHRhcmdldHMgP1xuXHRcdFx0XHRcdFx0dGFyZ2V0cy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IHBhc3Mgbm9uLWVsZW1lbnRzIHRvIFNpenpsZVxuXHRcdFx0XHRcdFx0Y3VyLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0XHRtYXRjaGVkLnB1c2goIGN1ciApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkLmxlbmd0aCA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApIDogbWF0Y2hlZCApO1xuXHR9LFxuXG5cdC8vIERldGVybWluZSB0aGUgcG9zaXRpb24gb2YgYW4gZWxlbWVudCB3aXRoaW4gdGhlIHNldFxuXHRpbmRleDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBObyBhcmd1bWVudCwgcmV0dXJuIGluZGV4IGluIHBhcmVudFxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCB0aGlzWyAwIF0gJiYgdGhpc1sgMCBdLnBhcmVudE5vZGUgKSA/IHRoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoIDogLTE7XG5cdFx0fVxuXG5cdFx0Ly8gSW5kZXggaW4gc2VsZWN0b3Jcblx0XHRpZiAoIHR5cGVvZiBlbGVtID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cmV0dXJuIGluZGV4T2YuY2FsbCggalF1ZXJ5KCBlbGVtICksIHRoaXNbIDAgXSApO1xuXHRcdH1cblxuXHRcdC8vIExvY2F0ZSB0aGUgcG9zaXRpb24gb2YgdGhlIGRlc2lyZWQgZWxlbWVudFxuXHRcdHJldHVybiBpbmRleE9mLmNhbGwoIHRoaXMsXG5cblx0XHRcdC8vIElmIGl0IHJlY2VpdmVzIGEgalF1ZXJ5IG9iamVjdCwgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdXNlZFxuXHRcdFx0ZWxlbS5qcXVlcnkgPyBlbGVtWyAwIF0gOiBlbGVtXG5cdFx0KTtcblx0fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBzZWxlY3RvciwgY29udGV4dCApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soXG5cdFx0XHRqUXVlcnkudW5pcXVlU29ydChcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLmdldCgpLCBqUXVlcnkoIHNlbGVjdG9yLCBjb250ZXh0ICkgKVxuXHRcdFx0KVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkQmFjazogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLmFkZCggc2VsZWN0b3IgPT0gbnVsbCA/XG5cdFx0XHR0aGlzLnByZXZPYmplY3QgOiB0aGlzLnByZXZPYmplY3QuZmlsdGVyKCBzZWxlY3RvciApXG5cdFx0KTtcblx0fVxufSApO1xuXG5mdW5jdGlvbiBzaWJsaW5nKCBjdXIsIGRpciApIHtcblx0d2hpbGUgKCAoIGN1ciA9IGN1clsgZGlyIF0gKSAmJiBjdXIubm9kZVR5cGUgIT09IDEgKSB7fVxuXHRyZXR1cm4gY3VyO1xufVxuXG5qUXVlcnkuZWFjaCgge1xuXHRwYXJlbnQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0cmV0dXJuIHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgIT09IDExID8gcGFyZW50IDogbnVsbDtcblx0fSxcblx0cGFyZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIgKTtcblx0fSxcblx0cGFyZW50c1VudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwYXJlbnROb2RlXCIsIHVudGlsICk7XG5cdH0sXG5cdG5leHQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcIm5leHRTaWJsaW5nXCIgKTtcblx0fSxcblx0cHJldjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmcoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dEFsbDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXZBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicHJldmlvdXNTaWJsaW5nXCIgKTtcblx0fSxcblx0bmV4dFVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJuZXh0U2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRwcmV2VW50aWw6IGZ1bmN0aW9uKCBlbGVtLCBpLCB1bnRpbCApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZX
21167Zpb3VzU2libGluZ1wiLCB1bnRpbCApO1xuXHR9LFxuXHRzaWJsaW5nczogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIHNpYmxpbmdzKCAoIGVsZW0ucGFyZW50Tm9kZSB8fCB7fSApLmZpcnN0Q2hpbGQsIGVsZW0gKTtcblx0fSxcblx0Y2hpbGRyZW46IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggZWxlbS5maXJzdENoaWxkICk7XG5cdH0sXG5cdGNvbnRlbnRzOiBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJpZnJhbWVcIiApICkge1xuICAgICAgICAgICAgcmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3VwcG9ydDogSUUgOSAtIDExIG9ubHksIGlPUyA3IG9ubHksIEFuZHJvaWQgQnJvd3NlciA8PTQuMyBvbmx5XG4gICAgICAgIC8vIFRyZWF0IHRoZSB0ZW1wbGF0ZSBlbGVtZW50IGFzIGEgcmVndWxhciBvbmUgaW4gYnJvd3NlcnMgdGhhdFxuICAgICAgICAvLyBkb24ndCBzdXBwb3J0IGl0LlxuICAgICAgICBpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRlbXBsYXRlXCIgKSApIHtcbiAgICAgICAgICAgIGVsZW0gPSBlbGVtLmNvbnRlbnQgfHwgZWxlbTtcbiAgICAgICAgfVxuXG4gICAgICAgI
vendor: 12,571 bytes, line 21167
21167HJldHVybiBqUXVlcnkubWVyZ2UoIFtdLCBlbGVtLmNoaWxkTm9kZXMgKTtcblx0fVxufSwgZnVuY3Rpb24oIG5hbWUsIGZuICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCB1bnRpbCwgc2VsZWN0b3IgKSB7XG5cdFx0dmFyIG1hdGNoZWQgPSBqUXVlcnkubWFwKCB0aGlzLCBmbiwgdW50aWwgKTtcblxuXHRcdGlmICggbmFtZS5zbGljZSggLTUgKSAhPT0gXCJVbnRpbFwiICkge1xuXHRcdFx0c2VsZWN0b3IgPSB1bnRpbDtcblx0XHR9XG5cblx0XHRpZiAoIHNlbGVjdG9yICYmIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdG1hdGNoZWQgPSBqUXVlcnkuZmlsdGVyKCBzZWxlY3RvciwgbWF0Y2hlZCApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpcy5sZW5ndGggPiAxICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgZHVwbGljYXRlc1xuXHRcdFx0aWYgKCAhZ3VhcmFudGVlZFVuaXF1ZVsgbmFtZSBdICkge1xuXHRcdFx0XHRqUXVlcnkudW5pcXVlU29ydCggbWF0Y2hlZCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXZlcnNlIG9yZGVyIGZvciBwYXJlbnRzKiBhbmQgcHJldi1kZXJpdmF0aXZlc1xuXHRcdFx0aWYgKCBycGFyZW50c3ByZXYudGVzdCggbmFtZSApICkge1xuXHRcdFx0XHRtYXRjaGVkLnJldmVyc2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIG1hdGNoZWQgKTtcblx0fTtcbn0gKTtcbnZhciBybm90aHRtbHdoaXRlID0gKCAvW15cXHgyMFxcdFxcclxcblxcZl0rL2cgKTtcblxuXG5cbi8vIENvbnZlcnQgU3RyaW5nLWZvcm1hdHRlZCBvcHRpb25zIGludG8gT2JqZWN0LWZvcm1hdHRlZCBvbmVzXG5mdW5jdGlvbiBjcmVhdGVPcHRpb25zKCBvcHRpb25zICkge1xuXHR2YXIgb2JqZWN0ID0ge307XG5cdGpRdWVyeS5lYWNoKCBvcHRpb25zLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10sIGZ1bmN0aW9uKCBfLCBmbGFnICkge1xuXHRcdG9iamVjdFsgZmxhZyBdID0gdHJ1ZTtcblx0fSApO1xuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vKlxuICogQ3JlYXRlIGEgY2FsbGJhY2sgbGlzdCB1c2luZyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6XG4gKlxuICpcdG9wdGlvbnM6IGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3BhY2Utc2VwYXJhdGVkIG9wdGlvbnMgdGhhdCB3aWxsIGNoYW5nZSBob3dcbiAqXHRcdFx0dGhlIGNhbGxiYWNrIGxpc3QgYmVoYXZlcyBvciBhIG1vcmUgdHJhZGl0aW9uYWwgb3B0aW9uIG9iamVjdFxuICpcbiAqIEJ5IGRlZmF1bHQgYSBjYWxsYmFjayBsaXN0IHdpbGwgYWN0IGxpa2UgYW4gZXZlbnQgY2FsbGJhY2sgbGlzdCBhbmQgY2FuIGJlXG4gKiBcImZpcmVkXCIgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogUG9zc2libGUgb3B0aW9uczpcbiAqXG4gKlx0b25jZTpcdFx0XHR3aWxsIGVuc3VyZSB0aGUgY2FsbGJhY2sgbGlzdCBjYW4gb25seSBiZSBmaXJlZCBvbmNlIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdG1lbW9yeTpcdFx0XHR3aWxsIGtlZXAgdHJhY2sgb2YgcHJldmlvdXMgdmFsdWVzIGFuZCB3aWxsIGNhbGwgYW55IGNhbGxiYWNrIGFkZGVkXG4gKlx0XHRcdFx0XHRhZnRlciB0aGUgbGlzdCBoYXMgYmVlbiBmaXJlZCByaWdodCBhd2F5IHdpdGggdGhlIGxhdGVzdCBcIm1lbW9yaXplZFwiXG4gKlx0XHRcdFx0XHR2YWx1ZXMgKGxpa2UgYSBEZWZlcnJlZClcbiAqXG4gKlx0dW5pcXVlOlx0XHRcdHdpbGwgZW5zdXJlIGEgY2FsbGJhY2sgY2FuIG9ubHkgYmUgYWRkZWQgb25jZSAobm8gZHVwbGljYXRlIGluIHRoZSBsaXN0KVxuICpcbiAqXHRzdG9wT25GYWxzZTpcdGludGVycnVwdCBjYWxsaW5ncyB3aGVuIGEgY2FsbGJhY2sgcmV0dXJucyBmYWxzZVxuICpcbiAqL1xualF1ZXJ5LkNhbGxiYWNrcyA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdC8vIENvbnZlcnQgb3B0aW9ucyBmcm9tIFN0cmluZy1mb3JtYXR0ZWQgdG8gT2JqZWN0LWZvcm1hdHRlZCBpZiBuZWVkZWRcblx0Ly8gKHdlIGNoZWNrIGluIGNhY2hlIGZpcnN0KVxuXHRvcHRpb25zID0gdHlwZW9mIG9wdGlvbnMgPT09IFwic3RyaW5nXCIgP1xuXHRcdGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSA6XG5cdFx0alF1ZXJ5LmV4dGVuZCgge30sIG9wdGlvbnMgKTtcblxuXHR2YXIgLy8gRmxhZyB0byBrbm93IGlmIGxpc3QgaXMgY3VycmVudGx5IGZpcmluZ1xuXHRcdGZpcmluZyxcblxuXHRcdC8vIExhc3QgZmlyZSB2YWx1ZSBmb3Igbm9uLWZvcmdldHRhYmxlIGxpc3RzXG5cdFx0bWVtb3J5LFxuXG5cdFx0Ly8gRmxhZyB0byBrbm93IGlmIGxpc3Qgd2FzIGFscmVhZHkgZmlyZWRcblx0XHRmaXJlZCxcblxuXHRcdC8vIEZsYWcgdG8gcHJldmVudCBmaXJpbmdcblx0XHRsb2NrZWQsXG5cblx0XHQvLyBBY3R1YWwgY2FsbGJhY2sgbGlzdFxuXHRcdGxpc3QgPSBbXSxcblxuXHRcdC8vIFF1ZXVlIG9mIGV4ZWN1dGlvbiBkYXRhIGZvciByZXBlYXRhYmxlIGxpc3RzXG5cdFx0cXVldWUgPSBbXSxcblxuXHRcdC8vIEluZGV4IG9mIGN1cnJlbnRseSBmaXJpbmcgY2FsbGJhY2sgKG1vZGlmaWVkIGJ5IGFkZC9yZW1vdmUgYXMgbmVlZGVkKVxuXHRcdGZpcmluZ0luZGV4ID0gLTEsXG5cblx0XHQvLyBGaXJlIGNhbGxiYWNrc1xuXHRcdGZpcmUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRW5mb3JjZSBzaW5nbGUtZmlyaW5nXG5cdFx0XHRsb2NrZWQgPSBsb2NrZWQgfHwgb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoICFvcHRpb25zLnVuaXF1ZSB8fCAhc2VsZi5oYXMoIGFyZyApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0bGlzdC5wdXNoKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGFyZyAmJiBhcmcubGVuZ3RoICYmIHRvVHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IG1lbW9yeSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0bG9ja2VkOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhbG9ja2VkO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2FsbCBhbGwgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGNvbnRleHQgYW5kIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZVdpdGg6IGZ1bmN0aW9uKCBjb250ZXh0LCBhcmdzICkge1xuXHRcdFx0XHRpZiAoICFsb2NrZWQgKSB7XG5cdFx0XHRcdFx0YXJncyA9IGFyZ3MgfHwgW107XG5cdFx0XHRcdFx0YXJncyA9IFsgY29udGV4dCwgYXJncy5zbGljZSA/IGFyZ3Muc2xpY2UoKSA6IGFyZ3MgXTtcblx0XHRcdFx0XHRxdWV1ZS5wdXNoKCBhcmdzICk7XG5cdFx0XHRcdFx0aWYgKCAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIHRoZSBjYWxsYmFja3Mgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzXG5cdFx0XHRmaXJlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0c2VsZi5maXJlV2l0aCggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gVG8ga25vdyBpZiB0aGUgY2FsbGJhY2tzIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhdCBsZWFzdCBvbmNlXG5cdFx0XHRmaXJlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWZpcmVkO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0cmV0dXJuIHNlbGY7XG59O1xuXG5cbmZ1bmN0aW9uIElkZW50aXR5KCB2ICkge1xuXHRyZXR1cm4gdjtcbn1cbmZ1bmN0aW9uIFRocm93ZXIoIGV4ICkge1xuXHR0aHJvdyBleDtcbn1cblxuZnVuY3Rpb24gYWRvcHRWYWx1ZSggdmFsdWUsIHJlc29sdmUsIHJlamVjdCwgbm9WYWx1ZSApIHtcblx0dmFyIG1ldGhvZDtcblxuXHR0cnkge1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIHByb21pc2UgYXNwZWN0IGZpcnN0IHRvIHByaXZpbGVnZSBzeW5jaHJvbm91cyBiZWhhdmlvclxuXHRcdGlmICggdmFsdWUgJiYgaXNGdW5jdGlvbiggKCBtZXRob2QgPSB2YWx1ZS5wcm9taXNlICkgKSApIHtcblx0XHRcdG1ldGhvZC5jYWxsKCB2YWx1ZSApLmRvbmUoIHJlc29sdmUgKS5mYWlsKCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIHRoZW5hYmxlc1xuXHRcdH0gZWxzZSBpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUudGhlbiApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUsIHJlc29sdmUsIHJlamVjdCApO1xuXG5cdFx0Ly8gT3RoZXIgbm9uLXRoZW5hYmxlc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvbnRyb2wgYHJlc29sdmVgIGFyZ3VtZW50cyBieSBsZXR0aW5nIEFycmF5I3NsaWNlIGNhc3QgYm9vbGVhbiBgbm9WYWx1ZWAgdG8gaW50ZWdlcjpcblx0XHRcdC8vICogZmFsc2U6IFsgdmFsdWUgXS5zbGljZSggMCApID0+IHJlc29sdmUoIHZhbHVlIClcblx0XHRcdC8vICogdHJ1ZTogWyB2YWx1ZSBdLnNsaWNlKCAxICkgPT4gcmVzb2x2ZSgpXG5cdFx0XHRyZXNvbHZlLmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXS5zbGljZSggbm9WYWx1ZSApICk7XG5cdFx0fVxuXG5cdC8vIEZvciBQcm9taXNlcy9BKywgY29udmVydCBleGNlcHRpb25zIGludG8gcmVqZWN0aW9uc1xuXHQvLyBTaW5jZSBqUXVlcnkud2hlbiBkb2Vzbid0IHVud3JhcCB0aGVuYWJsZXMsIHdlIGNhbiBza2lwIHRoZSBleHRyYSBjaGVja3MgYXBwZWFyaW5nIGluXG5cdC8vIERlZmVycmVkI3RoZW4gdG8gY29uZGl0aW9uYWxseSBzdXBwcmVzcyByZWplY3Rpb24uXG5cdH0gY2F0Y2ggKCB2YWx1ZSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIG9ubHlcblx0XHQvLyBTdHJpY3QgbW9kZSBmdW5jdGlvbnMgaW52b2tlZCB3aXRob3V0IC5jYWxsLy5hcHBseSBnZXQgZ2xvYmFsLW9iamVjdCBjb250ZXh0XG5cdFx0cmVqZWN0LmFwcGx5KCB1bmRlZmluZWQsIFsgdmFsdWUgXSApO1xuXHR9XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHREZWZlcnJlZDogZnVuY3Rpb24oIGZ1bmMgKSB7XG5cdFx0dmFyIHR1cGxlcyA9IFtcblxuXHRcdFx0XHQvLyBhY3Rpb24sIGFkZCBsaXN0ZW5lciwgY2FsbGJhY2tzLFxuXHRcdFx0XHQvLyAuLi4gLnRoZW4gaGFuZGxlcnMsIGFyZ3VtZW50IGluZGV4LCBbZmluYWwgc3RhdGVdXG5cdFx0XHRcdFsgXCJub3RpZnlcIiwgXCJwcm9ncmVzc1wiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLCAyIF0sXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMCwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCAxLCBcInJlamVjdGVkXCIgXVxuXHRcdFx0XSxcblx0XHRcdHN0YXRlID0gXCJwZW5kaW5nXCIsXG5cdFx0XHRwcm9taXNlID0ge1xuXHRcdFx0XHRzdGF0ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRhbHdheXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGRlZmVycmVkLmRvbmUoIGFyZ3VtZW50cyApLmZhaWwoIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRcImNhdGNoXCI6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKCBudWxsLCBmbiApO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRcdFx0cGlwZTogZnVuY3Rpb24oIC8qIGZuRG9uZSwgZm5GYWlsLCBmblByb2dyZXNzICovICkge1xuXHRcdFx0XHRcdHZhciBmbnMgPSBhcmd1bWVudHM7XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbigg
21167aSwgdHVwbGUgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gTWFwIHR1cGxlcyAocHJvZ3Jlc3MsIGRvbmUsIGZhaWwpIHRvIGFyZ3VtZW50cyAoZG9uZSwgZmFpbCwgcHJvZ3Jlc3MpXG5cdFx0XHRcdFx0XHRcdHZhciBmbiA9IGlzRnVuY3Rpb24oIGZuc1sgdHVwbGVbIDQgXSBdICkgJiYgZm5zWyB0dXBsZVsgNCBdIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQucHJvZ3Jlc3MoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIubm90aWZ5IH0pXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLmRvbmUoZnVuY3Rpb24oKSB7IGJpbmQgdG8gbmV3RGVmZXIgb3IgbmV3RGVmZXIucmVzb2x2ZSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5mYWlsKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlamVjdCB9KVxuXHRcdFx0XHRcdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDEgXSBdKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQgPSBmbiAmJiBmbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCAmJiBpc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRmbiA/IFsgcmV0dXJuZWQgXSA6IGFyZ3VtZW50c1xuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdGZucyA9IG51bGw7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhlbjogZnVuY3Rpb24oIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkLCBvblByb2dyZXNzICkge1xuXHRcdFx0XHRcdHZhciBtYXhEZXB0aCA9IDA7XG5cdFx0XHRcdFx0ZnVuY3Rpb24gcmVzb2x2ZSggZGVwdGgsIGRlZmVycmVkLCBoYW5kbGVyLCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgdGhhdCA9IHRoaXMsXG5cdFx0XHRcdFx0XHRcdFx0YXJncyA9IGFyZ3VtZW50cyxcblx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93ID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmV0dXJuZWQsIHRoZW47XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjMuMy4zXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01OVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIGRvdWJsZS1yZXNvbHV0aW9uIGF0dGVtcHRzXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoIDwgbWF4RGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQgPSBoYW5kbGVyLmFwcGx5KCB0aGF0LCBhcmdzICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjFcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTQ4XG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkID09PSBkZWZlcnJlZC5wcm9taXNlKCkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRocm93IG5ldyBUeXBlRXJyb3IoIFwiVGhlbmFibGUgc2VsZi1yZXNvbHV0aW9uXCIgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbnMgMi4zLjMuMSwgMy41XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01NFxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNzVcblx0XHRcdFx0XHRcdFx0XHRcdC8vIFJldHJpZXZlIGB0aGVuYCBvbmx5IG9uY2Vcblx0XHRcdFx0XHRcdFx0XHRcdHRoZW4gPSByZXR1cm5lZCAmJlxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb24gMi4zLjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBjaGVjayBvYmplY3RzIGFuZCBmdW5jdGlvbnMgZm9yIHRoZW5hYmlsaXR5XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggdHlwZW9mIHJldHVybmVkID09PSBcIm9iamVjdFwiIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHJldHVybmVkID09PSBcImZ1bmN0aW9uXCIgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC50aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYSByZXR1cm5lZCB0aGVuYWJsZVxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCB0aGVuICkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3BlY2lhbCBwcm9jZXNzb3JzIChub3RpZnkpIGp1c3Qgd2FpdCBmb3IgcmVzb2x1dGlvblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWwgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlbi5jYWxsKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtYXhEZXB0aCwgZGVmZXJyZWQsIFRocm93ZXIsIHNwZWNpYWwgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gTm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGFsc28gaG9vayBpbnRvIHByb2dyZXNzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyAuLi5hbmQgZGlzcmVnYXJkIG9sZGVyIHJlc29sdXRpb24gdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWF4RGVwdGgrKztcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsICksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXNvbHZlKCBtY
21167XhEZXB0aCwgZGVmZXJyZWQsIElkZW50aXR5LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIEhhbmRsZSBhbGwgb3RoZXIgcmV0dXJuZWQgdmFsdWVzXG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggaGFuZGxlciAhPT0gSWRlbnRpdHkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dGhhdCA9IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyByZXR1cm5lZCBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gUHJvY2VzcyB0aGUgdmFsdWUocylcblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRGVmYXVsdCBwcm9jZXNzIGlzIHJlc29sdmVcblx0XHRcdFx0XHRcdFx0XHRcdFx0KCBzcGVjaWFsIHx8IGRlZmVycmVkLnJlc29sdmVXaXRoICkoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBub3JtYWwgcHJvY2Vzc29ycyAocmVzb2x2ZSkgY2F0Y2ggYW5kIHJlamVjdCBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcyA9IHNwZWNpYWwgP1xuXHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRtaWdodFRocm93KCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rKCBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRwcm9jZXNzLnN0YWNrVHJhY2UgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuNC4xXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNjFcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBJZ25vcmUgcG9zdC1yZXNvbHV0aW9uIGV4Y2VwdGlvbnNcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICsgMSA+PSBtYXhEZXB0aCApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gT25seSBzdWJzdGl0dXRlIGhhbmRsZXJzIHBhc3Mgb24gY29udGV4dFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gYW5kIG11bHRpcGxlIHZhbHVlcyAobm9uLXNwZWMgYmVoYXZpb3IpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IFRocm93ZXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBbIGUgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggdGhhdCwgYXJncyApO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuMVxuXHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC01N1xuXHRcdFx0XHRcdFx0XHQvLyBSZS1yZXNvbHZlIHByb21pc2VzIGltbWVkaWF0ZWx5IHRvIGRvZGdlIGZhbHNlIHJlamVjdGlvbiBmcm9tXG5cdFx0XHRcdFx0XHRcdC8vIHN1YnNlcXVlbnQgZXJyb3JzXG5cdFx0XHRcdFx0XHRcdGlmICggZGVwdGggKSB7XG5cdFx0XHRcdFx0XHRcdFx0cHJvY2VzcygpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ2FsbCBhbiBvcHRpb25hbCBob29rIHRvIHJlY29yZCB0aGUgc3RhY2ssIGluIGNhc2Ugb2YgZXhjZXB0aW9uXG5cdFx0XHRcdFx0XHRcdFx0Ly8gc2luY2UgaXQncyBvdGhlcndpc2UgbG9zdCB3aGVuIGV4ZWN1dGlvbiBnb2VzIGFzeW5jXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuRGVmZXJyZWQuZ2V0U3RhY2tIb29rICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNl
vendor: 4,913 bytes, line 21167
21167ID0galF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggcHJvY2VzcyApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblxuXHRcdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblByb2dyZXNzICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25Qcm9ncmVzcyA6XG5cdFx0XHRcdFx0XHRcdFx0XHRJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlci5ub3RpZnlXaXRoXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5hZGQoIC4uLiApXG5cdFx0XHRcdFx0XHR0dXBsZXNbIDEgXVsgMyBdLmFkZChcblx0XHRcdFx0XHRcdFx0cmVzb2x2ZShcblx0XHRcdFx0XHRcdFx0XHQwLFxuXHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyLFxuXHRcdFx0XHRcdFx0XHRcdGlzRnVuY3Rpb24oIG9uRnVsZmlsbGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25GdWxmaWxsZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHlcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAyIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvblJlamVjdGVkICkgP1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZWplY3RlZCA6XG5cdFx0XHRcdFx0XHRcdFx0XHRUaHJvd2VyXG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fSApLnByb21pc2UoKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBHZXQgYSBwcm9taXNlIGZvciB0aGlzIGRlZmVycmVkXG5cdFx0XHRcdC8vIElmIG9iaiBpcyBwcm92aWRlZCwgdGhlIHByb21pc2UgYXNwZWN0IGlzIGFkZGVkIHRvIHRoZSBvYmplY3Rcblx0XHRcdFx0cHJvbWlzZTogZnVuY3Rpb24oIG9iaiApIHtcblx0XHRcdFx0XHRyZXR1cm4gb2JqICE9IG51bGwgPyBqUXVlcnkuZXh0ZW5kKCBvYmosIHByb21pc2UgKSA6IHByb21pc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWZlcnJlZCA9IHt9O1xuXG5cdFx0Ly8gQWRkIGxpc3Qtc3BlY2lmaWMgbWV0aG9kc1xuXHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdHZhciBsaXN0ID0gdHVwbGVbIDIgXSxcblx0XHRcdFx0c3RhdGVTdHJpbmcgPSB0dXBsZVsgNSBdO1xuXG5cdFx0XHQvLyBwcm9taXNlLnByb2dyZXNzID0gbGlzdC5hZGRcblx0XHRcdC8vIHByb21pc2UuZG9uZSA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmZhaWwgPSBsaXN0LmFkZFxuXHRcdFx0cHJvbWlzZVsgdHVwbGVbIDEgXSBdID0gbGlzdC5hZGQ7XG5cblx0XHRcdC8vIEhhbmRsZSBzdGF0ZVxuXHRcdFx0aWYgKCBzdGF0ZVN0cmluZyApIHtcblx0XHRcdFx0bGlzdC5hZGQoXG5cdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIHN0YXRlID0gXCJyZXNvbHZlZFwiIChpLmUuLCBmdWxmaWxsZWQpXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVqZWN0ZWRcIlxuXHRcdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblx0XHRcdFx0XHR9LFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfY2FsbGJhY2tzLmRpc2FibGVcblx0XHRcdFx0XHR0dXBsZXNbIDMgLSBpIF1bIDIgXS5kaXNhYmxlLFxuXG5cdFx0XHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdC8vIGZ1bGZpbGxlZF9oYW5kbGVycy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAzIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2NhbGxiYWNrcy5sb2NrXG5cdFx0XHRcdFx0dHVwbGVzWyAwIF1bIDIgXS5sb2NrLFxuXG5cdFx0XHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0ubG9ja1xuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBwcm9ncmVzc19oYW5kbGVycy5maXJlXG5cdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gcmVqZWN0ZWRfaGFuZGxlcnMuZmlyZVxuXHRcdFx0bGlzdC5hZGQoIHR1cGxlWyAzIF0uZmlyZSApO1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnkgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQubm90aWZ5V2l0aCguLi4pIH1cblx0XHRcdC8vIGRlZmVycmVkLnJlc29sdmUgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVzb2x2ZVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3QgPSBmdW5jdGlvbigpIHsgZGVmZXJyZWQucmVqZWN0V2l0aCguLi4pIH1cblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKCB0aGlzID09PSBkZWZlcnJlZCA/IHVuZGVmaW5lZCA6IHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH07XG5cblx0XHRcdC8vIGRlZmVycmVkLm5vdGlmeVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlV2l0aCA9IGxpc3QuZmlyZVdpdGhcblx0XHRcdC8vIGRlZmVycmVkLnJlamVjdFdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSArIFwiV2l0aFwiIF0gPSBsaXN0LmZpcmVXaXRoO1xuXHRcdH0gKTtcblxuXHRcdC8vIE1ha2UgdGhlIGRlZmVycmVkIGEgcHJvbWlzZVxuXHRcdHByb21pc2UucHJvbWlzZSggZGVmZXJyZWQgKTtcblxuXHRcdC8vIENhbGwgZ2l2ZW4gZnVuYyBpZiBhbnlcblx0XHRpZiAoIGZ1bmMgKSB7XG5cdFx0XHRmdW5jLmNhbGwoIGRlZmVycmVkLCBkZWZlcnJlZCApO1xuXHRcdH1cblxuXHRcdC8vIEFsbCBkb25lIVxuXHRcdHJldHVybiBkZWZlcnJlZDtcblx0fSxcblxuXHQvLyBEZWZlcnJlZCBoZWxwZXJcblx0d2hlbjogZnVuY3Rpb24oIHNpbmdsZVZhbHVlICkge1xuXHRcdHZhclxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bmNvbXBsZXRlZCBzdWJvcmRpbmF0ZXNcblx0XHRcdHJlbWFpbmluZyA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cblx0XHRcdC8vIGNvdW50IG9mIHVucHJvY2Vzc2VkIGFyZ3VtZW50c1xuXHRcdFx0aSA9IHJlbWFpbmluZyxcblxuXHRcdFx0Ly8gc3Vib3JkaW5hdGUgZnVsZmlsbG1lbnQgZGF0YVxuXHRcdFx0cmVzb2x2ZUNvbnRleHRzID0gQXJyYXkoIGkgKSxcblx0XHRcdHJlc29sdmVWYWx1ZXMgPSBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSxcblxuXHRcdFx0Ly8gdGhlI
21167G1hc3RlciBEZWZlcnJlZFxuXHRcdFx0bWFzdGVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGNhbGxiYWNrIGZhY3Rvcnlcblx0XHRcdHVwZGF0ZUZ1bmMgPSBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXNvbHZlQ29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0cmVzb2x2ZVZhbHVlc1sgaSBdID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSA6IHZhbHVlO1xuXHRcdFx0XHRcdGlmICggISggLS1yZW1haW5pbmcgKSApIHtcblx0XHRcdFx0XHRcdG1hc3Rlci5yZXNvbHZlV2l0aCggcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0fTtcblxuXHRcdC8vIFNpbmdsZS0gYW5kIGVtcHR5IGFyZ3VtZW50cyBhcmUgYWRvcHRlZCBsaWtlIFByb21pc2UucmVzb2x2ZVxuXHRcdGlmICggcmVtYWluaW5nIDw9IDEgKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCBzaW5nbGVWYWx1ZSwgbWFzdGVyLmRvbmUoIHVwZGF0ZUZ1bmMoIGkgKSApLnJlc29sdmUsIG1hc3Rlci5yZWplY3QsXG5cdFx0XHRcdCFyZW1haW5pbmcgKTtcblxuXHRcdFx0Ly8gVXNlIC50aGVuKCkgdG8gdW53cmFwIHNlY29uZGFyeSB0aGVuYWJsZXMgKGNmLiBnaC0zMDAwKVxuXHRcdFx0aWYgKCBtYXN0ZXIuc3RhdGUoKSA9PT0gXCJwZW5kaW5nXCIgfHxcblx0XHRcdFx0aXNGdW5jdGlvbiggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIHJlc29sdmVWYWx1ZXNbIGkgXS50aGVuICkgKSB7XG5cblx0XHRcdFx0cmV0dXJuIG1hc3Rlci50aGVuKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gTXVsdGlwbGUgYXJndW1lbnRzIGFyZSBhZ2dyZWdhdGVkIGxpa2UgUHJvbWlzZS5hbGwgYXJyYXkgZWxlbWVudHNcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGFkb3B0VmFsdWUoIHJlc29sdmVWYWx1ZXNbIGkgXSwgdXBkYXRlRnVuYyggaSApLCBtYXN0ZXIucmVqZWN0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hc3Rlci5wcm9taXNlKCk7XG5cdH1cbn0gKTtcblxuXG4vLyBUaGVzZSB1c3VhbGx5IGluZGljYXRlIGEgcHJvZ3JhbW1lciBtaXN0YWtlIGR1cmluZyBkZXZlbG9wbWVudCxcbi8vIHdhcm4gYWJvdXQgdGhlbSBBU0FQIHJhdGhlciB0aGFuIHN3YWxsb3dpbmcgdGhlbSBieSBkZWZhdWx0LlxudmFyIHJlcnJvck5hbWVzID0gL14oRXZhbHxJbnRlcm5hbHxSYW5nZXxSZWZlcmVuY2V8U3ludGF4fFR5cGV8VVJJKUVycm9yJC87XG5cbmpRdWVyeS5EZWZlcnJlZC5leGNlcHRpb25Ib29rID0gZnVuY3Rpb24oIGVycm9yLCBzdGFjayApIHtcblxuXHQvLyBTdXBwb3J0OiBJRSA4IC0gOSBvbmx5XG5cdC8vIENvbnNvbGUgZXhpc3RzIHdoZW4gZGV2IHRvb2xzIGFyZSBvcGVuLCB3aGljaCBjYW4gaGFwcGVuIGF0IGFueSB0aW1lXG5cdGlmICggd2luZG93LmNvbnNvbGUgJiYgd2luZG93LmNvbnNvbGUud2FybiAmJiBlcnJvciAmJiByZXJyb3JOYW1lcy50ZXN0KCBlcnJvci5uYW1lICkgKSB7XG5cdFx0d2luZG93LmNvbnNvbGUud2FybiggXCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiBcIiArIGVycm9yLm1lc3NhZ2UsIGVycm9yLnN0YWNrLCBzdGFjayApO1xuXHR9XG59O1xuXG5cblxuXG5qUXVlcnkucmVhZHlFeGNlcHRpb24gPSBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHR0aHJvdyBlcnJvcjtcblx0fSApO1xufTtcblxuXG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0ID0galF1ZXJ5LkRlZmVycmVkKCk7XG5cbmpRdWVyeS5mbi5yZWFkeSA9IGZ1bmN0aW9uKCBmbiApIHtcblxuXHRyZWFkeUxpc3Rcblx0XHQudGhlbiggZm4gKVxuXG5cdFx0Ly8gV3JhcCBqUXVlcnkucmVhZHlFeGNlcHRpb24gaW4gYSBmdW5jdGlvbiBzbyB0aGF0IHRoZSBsb29rdXBcblx0XHQvLyBoYXBwZW5zIGF0IHRoZSB0aW1lIG9mIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgY2FsbGJhY2tcblx0XHQvLyByZWdpc3RyYXRpb24uXG5cdFx0LmNhdGNoKCBmdW5jdGlvbiggZXJyb3IgKSB7XG5cdFx0XHRqUXVlcnkucmVhZHlFeGNlcHRpb24oIGVycm9yICk7XG5cdFx0fSApO1xuXG5cdHJldHVybiB0aGlzO1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIElzIHRoZSBET00gcmVhZHkgdG8gYmUgdXNlZD8gU2V0IHRvIHRydWUgb25jZSBpdCBvY2N1cnMuXG5cdGlzUmVhZHk6IGZhbHNlLFxuXG5cdC8vIEEgY291bnRlciB0byB0cmFjayBob3cgbWFueSBpdGVtcyB0byB3YWl0IGZvciBiZWZvcmVcblx0Ly8gdGhlIHJlYWR5IGV2ZW50IGZpcmVzLiBTZWUgIzY3ODFcblx0cmVhZHlXYWl0OiAxLFxuXG5cdC8vIEhhbmRsZSB3aGVuIHRoZSBET00gaXMgcmVhZHlcblx0cmVhZHk6IGZ1bmN0aW9uKCB3YWl0ICkge1xuXG5cdFx0Ly8gQWJvcnQgaWYgdGhlcmUgYXJlIHBlbmRpbmcgaG9sZHMgb3Igd2UncmUgYWxyZWFkeSByZWFkeVxuXHRcdGlmICggd2FpdCA9PT0gdHJ1ZSA/IC0talF1ZXJ5LnJlYWR5V2FpdCA6IGpRdWVyeS5pc1JlYWR5ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJlbWVtYmVyIHRoYXQgdGhlIERPTSBpcyByZWFkeVxuXHRcdGpRdWVyeS5pc1JlYWR5ID0gdHJ1ZTtcblxuXHRcdC8vIElmIGEgbm9ybWFsIERPTSBSZWFkeSBldmVudCBmaXJlZCwgZGVjcmVtZW50LCBhbmQgd2FpdCBpZiBuZWVkIGJlXG5cdFx0aWYgKCB3YWl0ICE9PSB0cnVlICYmIC0talF1ZXJ5LnJlYWR5V2FpdCA+IDAgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gSWYgdGhlcmUgYXJlIGZ1bmN0aW9ucyBib3VuZCwgdG8gZXhlY3V0ZVxuXHRcdHJlYWR5TGlzdC5yZXNvbHZlV2l0aCggZG9jdW1lbnQsIFsgalF1ZXJ5IF0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkucmVhZHkudGhlbiA9IHJlYWR5TGlzdC50aGVuO1xuXG4vLyBUaGUgcmVhZHkgZXZlbnQgaGFuZGxlciBhbmQgc2VsZiBjbGVhbnVwIG1ldGhvZFxuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG4vLyBDYXRjaCBjYXNlcyB3aGVyZSAkKGRvY3VtZW50KS5yZWFkeSgpIGlzIGNhbGxlZFxuLy8gYWZ0ZXIgdGhlIGJyb3dzZXIgZXZlbnQgaGFzIGFscmVhZHkgb2NjdXJyZWQuXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMCBvbmx5XG4vLyBPbGRlciBJRSBzb21ldGltZXMgc2lnbmFscyBcImludGVyYWN0aXZlXCIgdG9vIHNvb25cbmlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdCggZG9jdW1lbnQucmVhZHlTdGF0ZSAhPT0gXCJsb2FkaW5nXCIgJiYgIWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbCApICkge1xuXG5cdC8vIEhhbmRsZSBpdCBhc3luY2hyb25vdXNseSB0byBhbGxvdyBzY3JpcHRzIHRoZSBvcHBvcnR1bml0eSB0byBkZWxheSByZWFkeVxuXHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cbn0gZWxzZSB7XG5cblx0Ly8gVXNlIHRoZSBoYW5keSBldmVudCBjYWxsYmFja1xuXHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0Ly8gQSBmYWxsYmFjayB0byB3aW5kb3cub25sb2FkLCB0aGF0IHdpbGwgYWx3YXlzIHdvcmtcblx0d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwibG9h
21167ZFwiLCBjb21wbGV0ZWQgKTtcbn1cblxuXG5cblxuLy8gTXVsdGlmdW5jdGlvbmFsIG1ldGhvZCB0byBnZXQgYW5kIHNldCB2YWx1ZXMgb2YgYSBjb2xsZWN0aW9uXG4vLyBUaGUgdmFsdWUvcyBjYW4gb3B0aW9uYWxseSBiZSBleGVjdXRlZCBpZiBpdCdzIGEgZnVuY3Rpb25cbnZhciBhY2Nlc3MgPSBmdW5jdGlvbiggZWxlbXMsIGZuLCBrZXksIHZhbHVlLCBjaGFpbmFibGUsIGVtcHR5R2V0LCByYXcgKSB7XG5cdHZhciBpID0gMCxcblx0XHRsZW4gPSBlbGVtcy5sZW5ndGgsXG5cdFx0YnVsayA9IGtleSA9PSBudWxsO1xuXG5cdC8vIFNldHMgbWFueSB2YWx1ZXNcblx0aWYgKCB0b1R5cGUoIGtleSApID09PSBcIm9iamVjdFwiICkge1xuXHRcdGNoYWluYWJsZSA9IHRydWU7XG5cdFx0Zm9yICggaSBpbiBrZXkgKSB7XG5cdFx0XHRhY2Nlc3MoIGVsZW1zLCBmbiwgaSwga2V5WyBpIF0sIHRydWUsIGVtcHR5R2V0LCByYXcgKTtcblx0XHR9XG5cblx0Ly8gU2V0cyBvbmUgdmFsdWVcblx0fSBlbHNlIGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXG5cdFx0aWYgKCAhaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJhdyA9IHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCBidWxrICkge1xuXG5cdFx0XHQvLyBCdWxrIG9wZXJhdGlvbnMgcnVuIGFnYWluc3QgdGhlIGVudGlyZSBzZXRcblx0XHRcdGlmICggcmF3ICkge1xuXHRcdFx0XHRmbi5jYWxsKCBlbGVtcywgdmFsdWUgKTtcblx0XHRcdFx0Zm4gPSBudWxsO1xuXG5cdFx0XHQvLyAuLi5leGNlcHQgd2hlbiBleGVjdXRpbmcgZnVuY3Rpb24gdmFsdWVzXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWxrID0gZm47XG5cdFx0XHRcdGZuID0gZnVuY3Rpb24oIGVsZW0sIGtleSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGJ1bGsuY2FsbCggalF1ZXJ5KCBlbGVtICksIHZhbHVlICk7XG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRmbihcblx0XHRcdFx0XHRlbGVtc1sgaSBdLCBrZXksIHJhdyA/XG5cdFx0XHRcdFx0dmFsdWUgOlxuXHRcdFx0XHRcdHZhbHVlLmNhbGwoIGVsZW1zWyBpIF0sIGksIGZuKCBlbGVtc1sgaSBdLCBrZXkgKSApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0aWYgKCBjaGFpbmFibGUgKSB7XG5cdFx0cmV0dXJuIGVsZW1zO1xuXHR9XG5cblx0Ly8gR2V0c1xuXHRpZiAoIGJ1bGsgKSB7XG5cdFx0cmV0dXJuIGZuLmNhbGwoIGVsZW1zICk7XG5cdH1cblxuXHRyZXR1cm4gbGVuID8gZm4oIGVsZW1zWyAwIF0sIGtleSApIDogZW1wdHlHZXQ7XG59O1xuXG5cbi8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xudmFyIHJtc1ByZWZpeCA9IC9eLW1zLS8sXG5cdHJkYXNoQWxwaGEgPSAvLShbYS16XSkvZztcblxuLy8gVXNlZCBieSBjYW1lbENhc2UgYXMgY2FsbGJhY2sgdG8gcmVwbGFjZSgpXG5mdW5jdGlvbiBmY2FtZWxDYXNlKCBhbGwsIGxldHRlciApIHtcblx0cmV0dXJuIGxldHRlci50b1VwcGVyQ2FzZSgpO1xufVxuXG4vLyBDb252ZXJ0IGRhc2hlZCB0byBjYW1lbENhc2U7IHVzZWQgYnkgdGhlIGNzcyBhbmQgZGF0YSBtb2R1bGVzXG4vLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG4vLyBNaWNyb3NvZnQgZm9yZ290IHRvIGh1bXAgdGhlaXIgdmVuZG9yIHByZWZpeCAoIzk1NzIpXG5mdW5jdGlvbiBjYW1lbENhc2UoIHN0cmluZyApIHtcblx0cmV0dXJuIHN0cmluZy5yZXBsYWNlKCBybXNQcmVmaXgsIFwibXMtXCIgKS5yZXBsYWNlKCByZGFzaEFscGhhLCBmY2FtZWxDYXNlICk7XG59XG52YXIgYWNjZXB0RGF0YSA9IGZ1bmN0aW9uKCBvd25lciApIHtcblxuXHQvLyBBY2NlcHRzIG9ubHk6XG5cdC8vICAtIE5vZGVcblx0Ly8gICAgLSBOb2RlLkVMRU1FTlRfTk9ERVxuXHQvLyAgICAtIE5vZGUuRE9DVU1FTlRfTk9ERVxuXHQvLyAgLSBPYmplY3Rcblx0Ly8gICAgLSBBbnlcblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBDaGVjayBpZiB0aGUgb3duZXIgb2JqZWN0IGFscmVhZHkgaGFzIGEgY2FjaGVcblx0XHR2YXIgdmFsdWUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHQvLyBJZiBub3QsIGNyZWF0ZSBvbmVcblx0XHRpZiAoICF2YWx1ZSApIHtcblx0XHRcdHZhbHVlID0ge307XG5cblx0XHRcdC8vIFdlIGNhbiBhY2NlcHQgZGF0YSBmb3Igbm9uLWVsZW1lbnQgbm9kZXMgaW4gbW9kZXJuIGJyb3dzZXJzLFxuXHRcdFx0Ly8gYnV0IHdlIHNob3VsZCBub3QsIHNlZSAjODMzNS5cblx0XHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBvd25lciApICkge1xuXG5cdFx0XHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHRcdFx0Ly8gdXNlIHBsYWluIGFzc2lnbm1lbnRcblx0XHRcdFx0aWYgKCBvd25lci5ub2RlVHlwZSApIHtcblx0XHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2Ugc2VjdXJlIGl0IGluIGEgbm9uLWVudW1lcmFibGUgcHJvcGVydHlcblx0XHRcdFx0Ly8gY29uZmlndXJhYmxlIG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHRcdFx0Ly8gZGVsZXRlZCB3aGVuIGRhdGEgaXMgcmVtb3ZlZFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggb3duZXIsIHRoaXMuZXhwYW5kbywge1xuXHRcdFx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9LFxuXHRzZXQ6IGZ1bmN0aW9uKCBvd25lciwgZGF0YSwgdmFsdWUgKSB7XG5cdFx0dmFyIHByb3AsXG5cdFx0XHRjYWNoZSA9IHRoaXMuY2FjaGUoIG93bmVyICk7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIGtleSwgdmFsdWUg
21167XSBhcmdzXG5cdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBkYXRhICkgXSA9IHZhbHVlO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCB7IHByb3BlcnRpZXMgfSBdIGFyZ3Ncblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb3B5IHRoZSBwcm9wZXJ0aWVzIG9uZS1ieS1vbmUgdG8gdGhlIGNhY2hlIG9iamVjdFxuXHRcdFx0Zm9yICggcHJvcCBpbiBkYXRhICkge1xuXHRcdFx0XHRjYWNoZVsgY2FtZWxDYXNlKCBwcm9wICkgXSA9IGRhdGFbIHByb3AgXTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIGNhY2hlO1xuXHR9LFxuXHRnZXQ6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzLmNhY2hlKCBvd25lciApIDpcblxuXHRcdFx0Ly8gQWx3YXlzIHVzZSBjYW1lbENhc2Uga2V5IChnaC0yMjU3KVxuXHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdICYmIG93bmVyWyB0aGlzLmV4cGFuZG8gXVsgY2FtZWxDYXNlKCBrZXkgKSBdO1xuXHR9LFxuXHRhY2Nlc3M6IGZ1bmN0aW9uKCBvd25lciwga2V5LCB2YWx1ZSApIHtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0cmV0dXJuIHRoaXMuZ2V0KCBvd25lciwga2V5ICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2hlbiB0aGUga2V5IGlzIG5vdCBhIHN0cmluZywgb3IgYm90aCBhIGtleSBhbmQgdmFsdWVcblx0XHQvLyBhcmUgc3BlY2lmaWVkLCBzZXQgb3IgZXh0ZW5kIChleGlzdGluZyBvYmplY3RzKSB3aXRoIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gQW4gb2JqZWN0IG9mIHByb3BlcnRpZXNcblx0XHQvLyAgIDIuIEEga2V5IGFuZCB2YWx1ZVxuXHRcdC8vXG5cdFx0dGhpcy5zZXQoIG93bmVyLCBrZXksIHZhbHVlICk7XG5cblx0XHQvLyBTaW5jZSB0aGUgXCJzZXRcIiBwYXRoIGNhbiBoYXZlIHR3byBwb3NzaWJsZSBlbnRyeSBwb2ludHNcblx0XHQvLyByZXR1cm4gdGhlIGV4cGVjdGVkIGRhdGEgYmFzZWQgb24gd2hpY2ggcGF0aCB3YXMgdGFrZW5bKl1cblx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoga2V5O1xuXHR9LFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBvd25lciwga2V5ICkge1xuXHRcdHZhciBpLFxuXHRcdFx0Y2FjaGUgPSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cblx0XHRpZiAoIGNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBrZXkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydCBhcnJheSBvciBzcGFjZSBzZXBhcmF0ZWQgc3RyaW5nIG9mIGtleXNcblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSgga2V5ICkgKSB7XG5cblx0XHRcdFx0Ly8gSWYga2V5IGlzIGFuIGFycmF5IG9mIGtleXMuLi5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHNldCBjYW1lbENhc2Uga2V5cywgc28gcmVtb3ZlIHRoYXQuXG5cdFx0XHRcdGtleSA9IGtleS5tYXAoIGNhbWVsQ2FzZSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0a2V5ID0gY2FtZWxDYXNlKCBrZXkgKTtcblxuXHRcdFx0XHQvLyBJZiBhIGtleSB3aXRoIHRoZSBzcGFjZXMgZXhpc3RzLCB1c2UgaXQuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgY3JlYXRlIGFuIGFycmF5IGJ5IG1hdGNoaW5nIG5vbi13aGl0ZXNwYWNlXG5cdFx0XHRcdGtleSA9IGtleSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0WyBrZXkgXSA6XG5cdFx0XHRcdFx0KCBrZXkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpID0ga2V5Lmxlbmd0aDtcblxuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGRlbGV0ZSBjYWNoZVsga2V5WyBpIF0gXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgdGhlIGV4cGFuZG8gaWYgdGhlcmUncyBubyBtb3JlIGRhdGFcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8IGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBjYWNoZSApICkge1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1XG5cdFx0XHQvLyBXZWJraXQgJiBCbGluayBwZXJmb3JtYW5jZSBzdWZmZXJzIHdoZW4gZGVsZXRpbmcgcHJvcGVydGllc1xuXHRcdFx0Ly8gZnJvbSBET00gbm9kZXMsIHNvIHNldCB0byB1bmRlZmluZWQgaW5zdGVhZFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3IChidWcgcmVzdHJpY3RlZClcblx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRlbGV0ZSBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXHRoYXNEYXRhOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cdFx0dmFyIGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdHJldHVybiBjYWNoZSAhPT0gdW5kZWZpbmVkICYmICFqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKTtcblx0fVxufTtcbnZhciBkYXRhUHJpdiA9IG5ldyBEYXRhKCk7XG5cbnZhciBkYXRhVXNlciA9IG5ldyBEYXRhKCk7XG5cblxuXG4vL1x0SW1wbGVtZW50YXRpb24gU3VtbWFyeVxuLy9cbi8vXHQxLiBFbmZvcmNlIEFQSSBzdXJmYWNlIGFuZCBzZW1hbnRpYyBjb21wYXRpYmlsaXR5IHdpdGggMS45LnggYnJhbmNoXG4vL1x0Mi4gSW1wcm92ZSB0aGUgbW9kdWxlJ3MgbWFpbnRhaW5hYmlsaXR5IGJ5IHJlZHVjaW5nIHRoZSBzdG9yYWdlXG4vL1x0XHRwYXRocyB0byBhIHNpbmdsZSBtZWNoYW5pc20uXG4vL1x0My4gVXNlIHRoZSBzYW1lIHNpbmdsZSBtZWNoYW5pc20gdG8gc3VwcG9ydCBcInByaXZhdGVcIiBhbmQgXCJ1c2VyXCIgZGF0YS5cbi8vXHQ0LiBfTmV2ZXJfIGV4cG9zZSBcInByaXZhdGVcIiBkYXRhIHRvIHVzZXIgY29kZSAoVE9ETzogRHJvcCBfZGF0YSwgX3JlbW92ZURhdGEpXG4vL1x0NS4gQXZvaWQgZXhwb3NpbmcgaW1wbGVtZW50YXRpb24gZGV0YWlscyBvb
21167iB1c2VyIG9iamVjdHMgKGVnLiBleHBhbmRvIHByb3BlcnRpZXMpXG4vL1x0Ni4gUHJvdmlkZSBhIGNsZWFyIHBhdGggZm9yIGltcGxlbWVudGF0aW9uIHVwZ3JhZGUgdG8gV2Vha01hcCBpbiAyMDE0XG5cbnZhciByYnJhY2UgPSAvXig/Olxce1tcXHdcXFddKlxcfXxcXFtbXFx3XFxXXSpcXF0pJC8sXG5cdHJtdWx0aURhc2ggPSAvW0EtWl0vZztcblxuZnVuY3Rpb24gZ2V0RGF0YSggZGF0YSApIHtcblx0aWYgKCBkYXRhID09PSBcInRydWVcIiApIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJmYWxzZVwiICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGlmICggZGF0YSA9PT0gXCJudWxsXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBPbmx5IGNvbnZlcnQgdG8gYSBudW1iZXIgaWYgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIHN0cmluZ1xuXHRpZiAoIGRhdGEgPT09ICtkYXRhICsgXCJcIiApIHtcblx0XHRyZXR1cm4gK2RhdGE7XG5cdH1cblxuXHRpZiAoIHJicmFjZS50ZXN0KCBkYXRhICkgKSB7XG5cdFx0cmV0dXJuIEpTT04ucGFyc2UoIGRhdGEgKTtcblx0fVxuXG5cdHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBkYXRhQXR0ciggZWxlbSwga2V5LCBkYXRhICkge1xuXHR2YXIgbmFtZTtcblxuXHQvLyBJZiBub3RoaW5nIHdhcyBmb3VuZCBpbnRlcm5hbGx5LCB0cnkgdG8gZmV0Y2ggYW55XG5cdC8vIGRhdGEgZnJvbSB0aGUgSFRNTDUgZGF0YS0qIGF0dHJpYnV0ZVxuXHRpZiAoIGRhdGEgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdG5hbWUgPSBcImRhdGEtXCIgKyBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCk7XG5cdFx0ZGF0YSA9IGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICk7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0ZGF0YSA9IGdldERhdGEoIGRhdGEgKTtcblx0XHRcdH0gY2F0Y2ggKCBlICkge31cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHdlIHNldCB0aGUgZGF0YSBzbyBpdCBpc24ndCBjaGFuZ2VkIGxhdGVyXG5cdFx0XHRkYXRhVXNlci5zZXQoIGVsZW0sIGtleSwgZGF0YSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gZGF0YTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXHRoYXNEYXRhOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuaGFzRGF0YSggZWxlbSApIHx8IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKTtcblx0fSxcblxuXHRkYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVVzZXIuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0cmVtb3ZlRGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUgKSB7XG5cdFx0ZGF0YVVzZXIucmVtb3ZlKCBlbGVtLCBuYW1lICk7XG5cdH0sXG5cblx0Ly8gVE9ETzogTm93IHRoYXQgYWxsIGNhbGxzIHRvIF9kYXRhIGFuZCBfcmVtb3ZlRGF0YSBoYXZlIGJlZW4gcmVwbGFjZWRcblx0Ly8gd2l0aCBkaXJlY3QgY2FsbHMgdG8gZGF0YVByaXYgbWV0aG9kcywgdGhlc2UgY2FuIGJlIGRlcHJlY2F0ZWQuXG5cdF9kYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBuYW1lLCBkYXRhICk7XG5cdH0sXG5cblx0X3JlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZGF0YTogZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIGksIG5hbWUsIGRhdGEsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0YXR0cnMgPSBlbGVtICYmIGVsZW0uYXR0cmlidXRlcztcblxuXHRcdC8vIEdldHMgYWxsIHZhbHVlc1xuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHRoaXMubGVuZ3RoICkge1xuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmICFkYXRhUHJpdi5nZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIgKSApIHtcblx0XHRcdFx0XHRpID0gYXR0cnMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSAxMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBUaGUgYXR0cnMgZWxlbWVudHMgY2FuIGJlIG51bGwgKCMxNDg5NClcblx0XHRcdFx0XHRcdGlmICggYXR0cnNbIGkgXSApIHtcblx0XHRcdFx0XHRcdFx0bmFtZSA9IGF0dHJzWyBpIF0ubmFtZTtcblx0XHRcdFx0XHRcdFx0aWYgKCBuYW1lLmluZGV4T2YoIFwiZGF0YS1cIiApID09PSAwICkge1xuXHRcdFx0XHRcdFx0XHRcdG5hbWUgPSBjYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhO1xuXG5cdFx0XHQvLyBUaGUgY2FsbGluZyBqUXVlcnkgb2JqZWN0IChlbGVtZW50IG1hdGNoZXMpIGlzIG5vdCBlbXB0eVxuXHRcdFx0Ly8gKGFuZCB0aGVyZWZvcmUgaGFzIGFuIGVsZW1lbnQgYXBwZWFycyBhdCB0aGlzWyAwIF0pIGFuZCB0aGVcblx0XHRcdC8vIGB2YWx1ZWAgcGFyYW1ldGVyIHdhcyBub3QgdW5kZWZpbmVkLiBBbiBlbXB0eSBqUXVlcnkgb2JqZWN0XG5cdFx0XHQvLyB3aWxsIHJlc3VsdCBpbiBgdW5kZWZpbmVkYCBmb3IgZWxlbSA9IHRoaXNbIDAgXSB3aGljaCB3aWxsXG5cdFx0XHQvLyB0aHJvdyBhbiBleGNlcHRpb24gaWYgYW4gYXR0ZW1wdCB0byByZWFkIGEgZGF0YSBjYWNoZSBpcyBtYWRlLlxuXHRcdFx0aWYgKCBlbGVtICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyBUaGUga2V5IHdpbGwgYWx3YXlzIGJlIGNhbWVsQ2FzZWQgaW4gRGF0YVxuXHRcdFx0XHRkYXRhID0gZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBdHRlbXB0IHRvIFwiZGlzY292ZXJcIiB0aGUgZGF0YSBpblxuXHRcdFx0XHQvLyBIVE1MNSBjdXN0b20gZGF0YS0qIGF0dHJzXG5cdFx0XHRcdGRhdGEgPSBkYXRhQXR0ciggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybi
21167BkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gV2UgdHJpZWQgcmVhbGx5IGhhcmQsIGJ1dCB0aGUgZGF0YSBkb2Vzbid0IGV4aXN0LlxuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNldCB0aGUgZGF0YS4uLlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBXZSBhbHdheXMgc3RvcmUgdGhlIGNhbWVsQ2FzZWQga2V5XG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywga2V5LCB2YWx1ZSApO1xuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IEFycmF5LmlzQXJyYXkoIGRhdGEgKSApIHtcblx0XHRcdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgdHlwZSwgalF1ZXJ5Lm1ha2VBcnJheSggZGF0YSApICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0cXVldWUucHVzaCggZGF0YSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcXVldWUgfHwgW107XG5cdFx0fVxuXHR9LFxuXG5cdGRlcXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggZWxlbSwgdHlwZSApLFxuXHRcdFx0c3RhcnRMZW5ndGggPSBxdWV1ZS5sZW5ndGgsXG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCksXG5cdFx0XHRob29rcyA9IGpRdWVyeS5fcXVldWVIb29rcyggZWxlbSwgdHlwZSApLFxuXHRcdFx0bmV4dCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggZWxlbSwgdHlwZSApO1xuXHRcdFx0fTtcblxuXHRcdC8vIElmIHRoZSBmeCBxdWV1ZSBpcyBkZXF1ZXVlZCwgYWx3YXlzIHJlbW92ZSB0aGUgcHJvZ3Jlc3Mgc2VudGluZWxcblx0XHRpZiAoIGZuID09PSBcImlucHJvZ3Jlc3NcIiApIHtcblx0XHRcdGZuID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdHN0YXJ0TGVuZ3RoLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBmbiApIHtcblxuXHRcdFx0Ly8gQWRkIGEgcHJvZ3Jlc3Mgc2VudGluZWwgdG8gcHJldmVudCB0aGUgZnggcXVldWUgZnJvbSBiZWluZ1xuXHRcdFx0Ly8gYXV0b21hdGljYWxseSBkZXF1ZXVlZFxuXHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgKSB7XG5cdFx0XHRcdHF1ZXVlLnVuc2hpZnQoIFwiaW5wcm9ncmVzc1wiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENsZWFyIHVwIHRoZSBsYXN0IHF1ZXVlIHN0b3AgZnVuY3Rpb25cblx0XHRcdGRlbGV0ZSBob29rcy5zdG9wO1xuXHRcdFx0Zm4uY2FsbCggZWxlbSwgbmV4dCwgaG9va3MgKTtcblx0XHR9XG5cblx0XHRpZiAoICFzdGFydExlbmd0aCAmJiBob29rcyApIHtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gTm90IHB1YmxpYyAtIGdlbmVyYXRlIGEgcXVldWVIb29rcyBvYmplY3QsIG9yIHJldHVybiB0aGUgY3VycmVudCBvbmVcblx0X3F1ZXVlSG9va3M6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlICkge1xuXHRcdHZhciBrZXkgPSB0eXBlICsgXCJxdWV1ZUhvb2tzXCI7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmdldCggZWxlbSwga2V5ICkgfHwgZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBrZXksIHtcblx0XHRcdGVtcHR5OiBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKS5hZGQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFsgdHlwZSArIFwicXVldWVcIiwga2V5IF0gKTtcblx0XHRcdH0gKVxuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgc2V0dGVyID0gMjtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRkYXRhID0gdHlwZTtcblx0XHRcdHR5cGUgPSBcImZ4XCI7XG5cdFx0XHRzZXR0ZXItLTtcblx0XHR9XG5cblx0XHRpZiAoIGFyZ3VtZW50cy5sZW5ndGggPCBzZXR0ZXIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnF1ZXVlKCB0aGlzWyAwIF0sIHR5cGUgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdHRoaXMgOlxuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIHF1ZXVlID0galF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBkYXRhICk7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIGEgaG9va3MgZm9yIHRoaXMgcXVldWVcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCB0aGlzLCB0eXBlICk7XG5cblx0XHRcdFx0aWYgKCB0eXBlID09PSBcImZ4XCIgJiYgcXVldWVbIDAgXSAhPT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIHR5cGUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHR9LFxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0fSApO1xuXHR9LFxuXHRjbGVhclF1ZXVlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdH0sXG5cblx0Ly8gR2V0IGEgcHJvbWlzZSByZXNvbHZlZCB3aGVuIHF1ZXVlcyBvZiBhIGNlcnRhaW4gdHlwZVxuXHQvLyBhcmUgZW1wdGllZCAoZnggaXMgdGhlIHR5cGUgYnkgZGVmYXVsdClcblx0cHJvbWlzZTogZnVuY3Rpb24oIHR5cGUsIG9iaiApIHtcblx0XHR2YXIgdG1wLFxuXHRcdFx0Y291bnQgPSAxLFxuXHRcdFx0ZGVmZXIgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGVsZW1lbnRzID0gdGhpcyxcblx0XHRcdGkgPSB0aGlzLmxlbmd0aCxcblx0XHRcdHJlc29sdmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhKCAtLWNvdW50ICkgKSB7XG5cdFx0XHRcdFx0ZGVmZXIucmVzb2x2ZVdpdGgoIGVsZW1lbnRzLCBbIGVsZW1lbnRzIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRvYmogPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0bXAgPSBkYXRhUHJpdi5nZXQoIGVsZW1lbnRzWyBpIF0sIHR5cGUgKyBcInF1ZXVlSG9va3NcIiApO1xuXHRcdFx0aWYgKCB0bXAgJiYgdG1wLmVtcHR5ICkge1xuXHRcdFx0XHRjb3VudCsrO1xuXHRcdFx0XHR0bXAuZW1wdHkuYWRkKCByZXNvbHZlICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJlc29sdmUoKTtcblx0XHRyZXR1cm4gZGVmZXIucHJvbWlzZSggb2JqICk7XG5cdH1cbn0gKTtcbnZhciBwbnVtID0gKCAvWystXT8oPzpcXGQqXFwufClcXGQrKD86W2VFXVsrLV0/XFxkK3wpLyApLnNvdXJjZTtcblxudmFyIHJjc3NOdW0gPSBuZXcgUmVnRXhwKCBcIl4oPzooWystXSk9fCkoXCIgKyBwbnVtICsgXCIpKFthLXolXSopJFwiLCBcImlcIiApO1xuXG5cbnZhciBjc3NFeHBhbmQgPSBbIFwiVG9wXCIsIFwiUmlnaHRcIiwgXCJCb3R0b21cIiwgXCJMZWZ0XCIgXTtcblxudmFyIGlzSGlkZGVuV2l0aGluVHJlZSA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuV2l0aGluVHJlZSBtaWdodCBiZSBjYWxsZWQgZnJvbSBqUXVlcnkjZmlsdGVyIGZ1bmN0aW9uO1xuXHRcdC8vIGluIHRoYXQgY2FzZSwgZWxlbWVudCB3aWxsIGJlIHNlY29uZCBhcmd1bWVudFxuXHRcdGVsZW0gPSBlbCB8fCBlbGVtO1xuXG5cdFx0Ly8gSW5saW5lIHN0eWxlIHRydW1wcyBhbGxcblx0XHRyZXR1cm4gZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fFxuXHRcdFx0ZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmXG5cblx0XHRcdC8vIE90aGVyd2lzZSwgY2hlY2sgY29tcHV0ZWQgc3R5bGVcblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MyAtIDQ1XG5cdFx0XHQvLyBEaXNjb25uZWN0ZWQgZWxlbWVudHMgY2FuIGhhdmUgY29tcHV0ZWQgZGlzcGxheTogbm9uZSwgc28gZmlyc3QgY29uZmlybSB0aGF0IGVsZW0gaXNcblx0XHRcdC8vIGluIHRoZSBkb2N1bWVudC5cblx0XHRcdGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgJiZcblxuXHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSA9PT0gXCJub25lXCI7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF0
211677XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCwgc2NhbGUsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uY3VyKCk7XG5cdFx0XHR9IDpcblx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5LmNzcyggZWxlbSwgcHJvcCwgXCJcIiApO1xuXHRcdFx0fSxcblx0XHRpbml0aWFsID0gY3VycmVudFZhbHVlKCksXG5cdFx0dW5pdCA9IHZhbHVlUGFydHMgJiYgdmFsdWVQYXJ0c1sgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApLFxuXG5cdFx0Ly8gU3RhcnRpbmcgdmFsdWUgY29tcHV0YXRpb24gaXMgcmVxdWlyZWQgZm9yIHBvdGVudGlhbCB1bml0IG1pc21hdGNoZXNcblx0XHRpbml0aWFsSW5Vbml0ID0gKCBqUXVlcnkuY3NzTnVtYmVyWyBwcm9wIF0gfHwgdW5pdCAhPT0gXCJweFwiICYmICtpbml0aWFsICkgJiZcblx0XHRcdHJjc3NOdW0uZXhlYyggalF1ZXJ5LmNzcyggZWxlbSwgcHJvcCApICk7XG5cblx0aWYgKCBpbml0aWFsSW5Vbml0ICYmIGluaXRpYWxJblVuaXRbIDMgXSAhPT0gdW5pdCApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHRcdC8vIEhhbHZlIHRoZSBpdGVyYXRpb24gdGFyZ2V0IHZhbHVlIHRvIHByZXZlbnQgaW50ZXJmZXJlbmNlIGZyb20gQ1NTIHVwcGVyIGJvdW5kcyAoZ2gtMjE0NClcblx0XHRpbml0aWFsID0gaW5pdGlhbCAvIDI7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdHdoaWxlICggbWF4SXRlcmF0aW9ucy0tICkge1xuXG5cdFx0XHQvLyBFdmFsdWF0ZSBhbmQgdXBkYXRlIG91ciBiZXN0IGd1ZXNzIChkb3VibGluZyBndWVzc2VzIHRoYXQgemVybyBvdXQpLlxuXHRcdFx0Ly8gRmluaXNoIGlmIHRoZSBzY2FsZSBlcXVhbHMgb3IgY3Jvc3NlcyAxIChtYWtpbmcgdGhlIG9sZCpuZXcgcHJvZHVjdCBub24tcG9zaXRpdmUpLlxuXHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXHRcdFx0aWYgKCAoIDEgLSBzY2FsZSApICogKCAxIC0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCB8fCAwLjUgKSApIDw9IDAgKSB7XG5cdFx0XHRcdG1heEl0ZXJhdGlvbnMgPSAwO1xuXHRcdFx0fVxuXHRcdFx0aW5pdGlhbEluVW5pdCA9IGluaXRpYWxJblVuaXQgLyBzY2FsZTtcblxuXHRcdH1cblxuXHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0ICogMjtcblx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBNYWtlIHN1cmUgd2UgdXBkYXRlIHRoZSB0d2VlbiBwcm9wZXJ0aWVzIGxhdGVyIG9uXG5cdFx0dmFsdWVQYXJ0cyA9IHZhbHVlUGFydHMgfHwgW107XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxuXG5cbnZhciBkZWZhdWx0RGlzcGxheU1hcCA9IHt9O1xuXG5mdW5jdGlvbiBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApIHtcblx0dmFyIHRlbXAsXG5cdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50LFxuXHRcdG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZSxcblx0XHRkaXNwbGF5ID0gZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF07XG5cblx0aWYgKCBkaXNwbGF5ICkge1xuXHRcdHJldHVybiBkaXNwbGF5O1xuXHR9XG5cblx0dGVtcCA9IGRvYy5ib2R5LmFwcGVuZENoaWxkKCBkb2MuY3JlYXRlRWxlbWVudCggbm9kZU5hbWUgKSApO1xuXHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggdGVtcCwgXCJkaXNwbGF5XCIgKTtcblxuXHR0ZW1wLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRlbXAgKTtcblxuXHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdGRpc3BsYXkgPSBcImJsb2NrXCI7XG5cdH1cblx0ZGVmYXVsdERpc3BsYXlNYXBbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXG5cdHJldHVybiBkaXNwbGF5O1xufVxuXG5mdW5jdGlvbiBzaG93SGlkZSggZWxlbWVudHMsIHNob3cgKSB7XG5cdHZhciBkaXNwbGF5LCBlbGVtLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Ly8gRGV0ZXJtaW5lIG5ldyBkaXNwbGF5IHZhbHVlIGZvciBlbGVtZW50cyB0aGF0IG5lZWQgdG8gY2hhbmdlXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0ZWxlbSA9IGVsZW1lbnRzWyBpbmRleCBdO1xuXHRcdGlmICggIWVsZW0uc3R5bGUgKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gU2luY2Ugd2UgZm9yY2UgdmlzaWJpbGl0eSB1cG9uIGNhc2NhZGUtaGlkZGVuIGVsZW1lbnRzLCBhbiBpbW1lZGlhdGUgKGFuZCBzbG93KVxuXHRcdFx0Ly8gY2hlY2sgaXMgcmVxdWlyZWQgaW4gdGhpcyBmaXJzdCBsb29wIHVubGVzcyB3ZSBoYXZlIGEgbm9uZW1wdHkgZGlzcGxheSB2YWx1ZSAoZWl0aGVyXG5cdFx0XHQvLyBpbmxpbmUgb3IgYWJvdXQtdG8tYmUtcmVzdG9yZWQpXG5cdFx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4I
21167F0gPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZGlzcGxheVwiICkgfHwgbnVsbDtcblx0XHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICkge1xuXHRcdFx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGlmICggZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIlwiICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBnZXREZWZhdWx0RGlzcGxheSggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiICkge1xuXHRcdFx0XHR2YWx1ZXNbIGluZGV4IF0gPSBcIm5vbmVcIjtcblxuXHRcdFx0XHQvLyBSZW1lbWJlciB3aGF0IHdlJ3JlIG92ZXJ3cml0aW5nXG5cdFx0XHRcdGRhdGFQcml2LnNldCggZWxlbSwgXCJkaXNwbGF5XCIsIGRpc3BsYXkgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBTZXQgdGhlIGRpc3BsYXkgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3AgdG8gYXZvaWQgY29uc3RhbnQgcmVmbG93XG5cdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCB2YWx1ZXNbIGluZGV4IF0gIT0gbnVsbCApIHtcblx0XHRcdGVsZW1lbnRzWyBpbmRleCBdLnN0eWxlLmRpc3BsYXkgPSB2YWx1ZXNbIGluZGV4IF07XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW1lbnRzO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNob3c6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBzaG93SGlkZSggdGhpcywgdHJ1ZSApO1xuXHR9LFxuXHRoaWRlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMgKTtcblx0fSxcblx0dG9nZ2xlOiBmdW5jdGlvbiggc3RhdGUgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGUgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdFx0cmV0dXJuIHN0YXRlID8gdGhpcy5zaG93KCkgOiB0aGlzLmhpZGUoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggaXNIaWRkZW5XaXRoaW5UcmVlKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcbnZhciByY2hlY2thYmxlVHlwZSA9ICggL14oPzpjaGVja2JveHxyYWRpbykkL2kgKTtcblxudmFyIHJ0YWdOYW1lID0gKCAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSspL2kgKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8Xm1vZHVsZSR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0b3B0aW9uOiBbIDEsIFwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPlwiLCBcIjwvc2VsZWN0PlwiIF0sXG5cblx0Ly8gWEhUTUwgcGFyc2VycyBkbyBub3QgbWFnaWNhbGx5IGluc2VydCBlbGVtZW50cyBpbiB0aGVcblx0Ly8gc2FtZSB3YXkgdGhhdCB0YWcgc291cCBwYXJzZXJzIGRvLiBTbyB3ZSBjYW5ub3Qgc2hvcnRlblxuXHQvLyB0aGlzIGJ5IG9taXR0aW5nIDx0Ym9keT4gb3Igb3RoZXIgcmVxdWlyZWQgZWxlbWVudHMuXG5cdHRoZWFkOiBbIDEsIFwiPHRhYmxlPlwiLCBcIjwvdGFibGU+XCIgXSxcblx0Y29sOiBbIDIsIFwiPHRhYmxlPjxjb2xncm91cD5cIiwgXCI8L2NvbGdyb3VwPjwvdGFibGU+XCIgXSxcblx0dHI6IFsgMiwgXCI8dGFibGU+PHRib2R5PlwiLCBcIjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXHR0ZDogWyAzLCBcIjx0YWJsZT48dGJvZHk+PHRyPlwiLCBcIjwvdHI+PC90Ym9keT48L3RhYmxlPlwiIF0sXG5cblx0X2RlZmF1bHQ6IFsgMCwgXCJcIiwgXCJcIiBdXG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxud3JhcE1hcC5vcHRncm91cCA9IHdyYXBNYXAub3B0aW9uO1xuXG53cmFwTWFwLnRib2R5ID0gd3JhcE1hcC50Zm9vdCA9IHdyYXBNYXAuY29sZ3JvdXAgPSB3cmFwTWFwLmNhcHRpb24gPSB3cmFwTWFwLnRoZWFkO1xud3JhcE1hcC50aCA9IHdyYXBNYXAudGQ7XG5cblxuZnVuY3Rpb24gZ2V0QWxsKCBjb250ZXh0LCB0YWcgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBVc2UgdHlwZW9mIHRvIGF2b2lkIHplcm8tYXJndW1lbnQgbWV0aG9kIGludm9jYXRpb24gb24gaG9zdCBvYmplY3RzICgjMTUxNTEpXG5cdHZhciByZXQ7XG5cblx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgfHwgXCIqXCIgKTtcblxuXHR9IGVsc2UgaWYgKCB0eXBlb2YgY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsICE9PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdHJldCA9IGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIHtcblx0XHRyZXQgPSBbXTtcblx0fVxuXG5cdGlmICggdGFnID09PSB1bmRlZmluZWQgfHwgdGFnICYmIG5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSApIHtcblx0XHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICk7XG5cdH1cblxuXHRyZXR1cm4gcmV0O1xufVxuXG5cbi8vIE1hcmsgc2NyaXB0cyBhcyBoYXZpbmcgYWxyZWFkeSBiZWVuIGV2YWx1YXRlZFxuZnVuY3Rpb24gc2V0R2xvYmFsRXZhbCggZWxlbXMsIHJlZkVsZW1lbnRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bCA9IGVsZW1zLmxlbmd0aDtcblxuXHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0ZGF0YVByaXYuc2V0KFxuXHRcdFx0ZWxlbXNbIGkgXSxcblx0XHRcdFwiZ2xvYmFsRXZhbFwiLFxuXHRcdFx0IXJlZkVsZW1lbnRzIHx8IGRhdGFQcml2LmdldCggcmVmRWxlbWVudHNbIGkgXSwgXCJnbG9iYWxFdmFsXCIgKVxuXHRcdCk7XG5cdH1cbn1cblxuXG52YXIgcmh0bWwgPSAvPHwmIz9cXHcrOy87XG5cbmZ1bmN0aW9uIGJ1aWxkRnJhZ21lbnQoIGVsZW1zLCBjb250ZXh0LCBzY3JpcHRzLCBzZWxlY3Rpb24sIGlnbm9yZWQgKSB7XG5cdHZhciBlbGVtLCB0bXAsIHRhZywgd3JhcCwgY29udGFpbnMsIGosXG5cdFx0ZnJhZ21lbnQgPSBjb250ZXh0LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRub2RlcyA9IFtdLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGVsZW0gPSBlbGVtc1sgaSBdO1xuXG5cdFx0aWYgKCBlbGVtIHx8IGVsZW0gPT09IDAgKSB7XG5cblx0XHRcdC8vIEFkZCBub2RlcyBkaXJlY3RseVxuXHRcdFx0aWYgKCB0b1R5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O
211671xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIG9ubHlcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTWFrZSBzdXJlIHRleHRhcmVhIChhbmQgY2hlY2tib3gpIGRlZmF1bHRWYWx1ZSBpcyBwcm9wZXJseSBjbG9uZWRcblx0ZGl2LmlubmVySFRNTCA9IFwiPHRleHRhcmVhPng8L3RleHRhcmVhPlwiO1xuXHRzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkID0gISFkaXYuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmRlZmF1bHRWYWx1ZTtcbn0gKSgpO1xudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbnZhclxuXHRya2V5RXZlbnQgPSAvXmtleS8sXG5cdHJtb3VzZUV2ZW50ID0gL14oPzptb3VzZXxwb2ludGVyfGNvbn
21167RleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLFxuXHRydHlwZW5hbWVzcGFjZSA9IC9eKFteLl0qKSg/OlxcLiguKyl8KS87XG5cbmZ1bmN0aW9uIHJldHVyblRydWUoKSB7XG5cdHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZXR1cm5GYWxzZSgpIHtcblx0cmV0dXJuIGZhbHNlO1xufVxuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gU2VlICMxMzM5MyBmb3IgbW9yZSBpbmZvXG5mdW5jdGlvbiBzYWZlQWN0aXZlRWxlbWVudCgpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblx0fSBjYXRjaCAoIGVyciApIHsgfVxufVxuXG5mdW5jdGlvbiBvbiggZWxlbSwgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgb25lICkge1xuXHR2YXIgb3JpZ0ZuLCB0eXBlO1xuXG5cdC8vIFR5cGVzIGNhbiBiZSBhIG1hcCBvZiB0eXBlcy9oYW5kbGVyc1xuXHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vICggdHlwZXMtT2JqZWN0LCBzZWxlY3RvciwgZGF0YSApXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtT2JqZWN0LCBkYXRhIClcblx0XHRcdGRhdGEgPSBkYXRhIHx8IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRvbiggZWxlbSwgdHlwZSwgc2VsZWN0b3IsIGRhdGEsIHR5cGVzWyB0eXBlIF0sIG9uZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggZGF0YSA9PSBudWxsICYmIGZuID09IG51bGwgKSB7XG5cblx0XHQvLyAoIHR5cGVzLCBmbiApXG5cdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRkYXRhID0gc2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdH0gZWxzZSBpZiAoIGZuID09IG51bGwgKSB7XG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMsIHNlbGVjdG9yLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vICggdHlwZXMsIGRhdGEsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHR9IGVsc2UgaWYgKCAhZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIG9uZSA9PT0gMSApIHtcblx0XHRvcmlnRm4gPSBmbjtcblx0XHRmbiA9IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0Ly8gQ2FuIHVzZSBhbiBlbXB0eSBzZXQsIHNpbmNlIGV2ZW50IGNvbnRhaW5zIHRoZSBpbmZvXG5cdFx0XHRqUXVlcnkoKS5vZmYoIGV2ZW50ICk7XG5cdFx0XHRyZXR1cm4gb3JpZ0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9O1xuXG5cdFx0Ly8gVXNlIHNhbWUgZ3VpZCBzbyBjYWxsZXIgY2FuIHJlbW92ZSB1c2luZyBvcmlnRm5cblx0XHRmbi5ndWlkID0gb3JpZ0ZuLmd1aWQgfHwgKCBvcmlnRm4uZ3VpZCA9IGpRdWVyeS5ndWlkKysgKTtcblx0fVxuXHRyZXR1cm4gZWxlbS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRqUXVlcnkuZXZlbnQuYWRkKCB0aGlzLCB0eXBlcywgZm4sIGRhdGEsIHNlbGVjdG9yICk7XG5cdH0gKTtcbn1cblxuLypcbiAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIG1hbmFnaW5nIGV2ZW50cyAtLSBub3QgcGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS5cbiAqIFByb3BzIHRvIERlYW4gRWR3YXJkcycgYWRkRXZlbnQgbGlicmFyeSBmb3IgbWFueSBvZiB0aGUgaWRlYXMuXG4gKi9cbmpRdWVyeS5ldmVudCA9IHtcblxuXHRnbG9iYWw6IHt9LFxuXG5cdGFkZDogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBkYXRhLCBzZWxlY3RvciApIHtcblxuXHRcdHZhciBoYW5kbGVPYmpJbiwgZXZlbnRIYW5kbGUsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdC8vIERvbid0IGF0dGFjaCBldmVudHMgdG8gbm9EYXRhIG9yIHRleHQvY29tbWVudCBub2RlcyAoYnV0IGFsbG93IHBsYWluIG9iamVjdHMpXG5cdFx0aWYgKCAhZWxlbURhdGEgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGFuIG9iamVjdCBvZiBjdXN0b20gZGF0YSBpbiBsaWV1IG9mIHRoZSBoYW5kbGVyXG5cdFx0aWYgKCBoYW5kbGVyLmhhbmRsZXIgKSB7XG5cdFx0XHRoYW5kbGVPYmpJbiA9IGhhbmRsZXI7XG5cdFx0XHRoYW5kbGVyID0gaGFuZGxlT2JqSW4uaGFuZGxlcjtcblx0XHRcdHNlbGVjdG9yID0gaGFuZGxlT2JqSW4uc2VsZWN0b3I7XG5cdFx0fVxuXG5cdFx0Ly8gRW5zdXJlIHRoYXQgaW52YWxpZCBzZWxlY3RvcnMgdGhyb3cgZXhjZXB0aW9ucyBhdCBhdHRhY2ggdGltZVxuXHRcdC8vIEV2YWx1YXRlIGFnYWluc3QgZG9jdW1lbnRFbGVtZW50IGluIGNhc2UgZWxlbSBpcyBhIG5vbi1lbGVtZW50IG5vZGUgKGUuZy4sIGRvY3VtZW50KVxuXHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGRvY3VtZW50RWxlbWVudCwgc2VsZWN0b3IgKTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVGhlcmUgKm11c3QqIGJlIGEgdHlwZSwgbm8gYXR0YWNoaW5nIG5hbWVzcGFjZS1vbmx
211675IGhhbmRsZXJzXG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgZXZlbnQgY2hhbmdlcyBpdHMgdHlwZSwgdXNlIHRoZSBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgY2hhbmdlZCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gSWYgc2VsZWN0b3IgZGVmaW5lZCwgZGV0ZXJtaW5lIHNwZWNpYWwgZXZlbnQgYXBpIHR5cGUsIG90aGVyd2lzZSBnaXZlbiB0eXBlXG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cblx0XHRcdC8vIFVwZGF0ZSBzcGVjaWFsIGJhc2VkIG9uIG5ld2x5IHJlc2V0IHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBoYW5kbGVPYmogaXMgcGFzc2VkIHRvIGFsbCBldmVudCBoYW5kbGVyc1xuXHRcdFx0aGFuZGxlT2JqID0galF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRvcmlnVHlwZTogb3JpZ1R5cGUsXG5cdFx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRcdGhhbmRsZXI6IGhhbmRsZXIsXG5cdFx0XHRcdGd1aWQ6IGhhbmRsZXIuZ3VpZCxcblx0XHRcdFx0c2VsZWN0b3I6IHNlbGVjdG9yLFxuXHRcdFx0XHRuZWVkc0NvbnRleHQ6IHNlbGVjdG9yICYmIGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvciApLFxuXHRcdFx0XHRuYW1lc3BhY2U6IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKVxuXHRcdFx0fSwgaGFuZGxlT2JqSW4gKTtcblxuXHRcdFx0Ly8gSW5pdCB0aGUgZXZlbnQgaGFuZGxlciBxdWV1ZSBpZiB3ZSdyZSB0aGUgZmlyc3Rcblx0XHRcdGlmICggISggaGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSApICkge1xuXHRcdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdID0gW107XG5cdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQgPSAwO1xuXG5cdFx0XHRcdC8vIE9ubHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgaWYgdGhlIHNwZWNpYWwgZXZlbnRzIGhhbmRsZXIgcmV0dXJucyBmYWxzZVxuXHRcdFx0XHRpZiAoICFzcGVjaWFsLnNldHVwIHx8XG5cdFx0XHRcdFx0c3BlY2lhbC5zZXR1cC5jYWxsKCBlbGVtLCBkYXRhLCBuYW1lc3BhY2VzLCBldmVudEhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGlmICggZWxlbS5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5hZGRFdmVudExpc3RlbmVyKCB0eXBlLCBldmVudEhhbmRsZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHNwZWNpYWwuYWRkICkge1xuXHRcdFx0XHRzcGVjaWFsLmFkZC5jYWxsKCBlbGVtLCBoYW5kbGVPYmogKTtcblxuXHRcdFx0XHRpZiAoICFoYW5kbGVPYmouaGFuZGxlci5ndWlkICkge1xuXHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyLmd1aWQgPSBoYW5kbGVyLmd1aWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHRvIHRoZSBlbGVtZW50J3MgaGFuZGxlciBsaXN0LCBkZWxlZ2F0ZXMgaW4gZnJvbnRcblx0XHRcdGlmICggc2VsZWN0b3IgKSB7XG5cdFx0XHRcdGhhbmRsZXJzLnNwbGljZSggaGFuZGxlcnMuZGVsZWdhdGVDb3VudCsrLCAwLCBoYW5kbGVPYmogKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBLZWVwIHRyYWNrIG9mIHdoaWNoIGV2ZW50cyBoYXZlIGV2ZXIgYmVlbiB1c2VkLCBmb3IgZXZlbnQgb3B0aW1pemF0aW9uXG5cdFx0XHRqUXVlcnkuZXZlbnQuZ2xvYmFsWyB0eXBlIF0gPSB0cnVlO1xuXHRcdH1cblxuXHR9LFxuXG5cdC8vIERldGFjaCBhbiBldmVudCBvciBzZXQgb2YgZXZlbnRzIGZyb20gYW4gZWxlbWVudFxuXHRyZW1vdmU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgc2VsZWN0b3IsIG1hcHBlZF
21167R5cGVzICkge1xuXG5cdFx0dmFyIGosIG9yaWdDb3VudCwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2Lmhhc0RhdGEoIGVsZW0gKSAmJiBkYXRhUHJpdi5nZXQoIGVsZW0gKTtcblxuXHRcdGlmICggIWVsZW1EYXRhIHx8ICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE9uY2UgZm9yIGVhY2ggdHlwZS5uYW1lc3BhY2UgaW4gdHlwZXM7IHR5cGUgbWF5IGJlIG9taXR0ZWRcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cdFx0dCA9IHR5cGVzLmxlbmd0aDtcblx0XHR3aGlsZSAoIHQtLSApIHtcblx0XHRcdHRtcCA9IHJ0eXBlbmFtZXNwYWNlLmV4ZWMoIHR5cGVzWyB0IF0gKSB8fCBbXTtcblx0XHRcdHR5cGUgPSBvcmlnVHlwZSA9IHRtcFsgMSBdO1xuXHRcdFx0bmFtZXNwYWNlcyA9ICggdG1wWyAyIF0gfHwgXCJcIiApLnNwbGl0KCBcIi5cIiApLnNvcnQoKTtcblxuXHRcdFx0Ly8gVW5iaW5kIGFsbCBldmVudHMgKG9uIHRoaXMgbmFtZXNwYWNlLCBpZiBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50XG5cdFx0XHRpZiAoICF0eXBlICkge1xuXHRcdFx0XHRmb3IgKCB0eXBlIGluIGV2ZW50cyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICsgdHlwZXNbIHQgXSwgaGFuZGxlciwgc2VsZWN0b3IsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0XHR0eXBlID0gKCBzZWxlY3RvciA/IHNwZWNpYWwuZGVsZWdhdGVUeXBlIDogc3BlY2lhbC5iaW5kVHlwZSApIHx8IHR5cGU7XG5cdFx0XHRoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdIHx8IFtdO1xuXHRcdFx0dG1wID0gdG1wWyAyIF0gJiZcblx0XHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICk7XG5cblx0XHRcdC8vIFJlbW92ZSBtYXRjaGluZyBldmVudHNcblx0XHRcdG9yaWdDb3VudCA9IGogPSBoYW5kbGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdFx0aGFuZGxlT2JqID0gaGFuZGxlcnNbIGogXTtcblxuXHRcdFx0XHRpZiAoICggbWFwcGVkVHlwZXMgfHwgb3JpZ1R5cGUgPT09IGhhbmRsZU9iai5vcmlnVHlwZSApICYmXG5cdFx0XHRcdFx0KCAhaGFuZGxlciB8fCBoYW5kbGVyLmd1aWQgPT09IGhhbmRsZU9iai5ndWlkICkgJiZcblx0XHRcdFx0XHQoICF0bXAgfHwgdG1wLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApICYmXG5cdFx0XHRcdFx0KCAhc2VsZWN0b3IgfHwgc2VsZWN0b3IgPT09IGhhbmRsZU9iai5zZWxlY3RvciB8fFxuXHRcdFx0XHRcdFx0c2VsZWN0b3IgPT09IFwiKipcIiAmJiBoYW5kbGVPYmouc2VsZWN0b3IgKSApIHtcblx0XHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGosIDEgKTtcblxuXHRcdFx0XHRcdGlmICggaGFuZGxlT2JqLnNlbGVjdG9yICkge1xuXHRcdFx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudC0tO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIHNwZWNpYWwucmVtb3ZlICkge1xuXHRcdFx0XHRcdFx0c3BlY2lhbC5yZW1vdmUuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlbW92ZSBnZW5lcmljIGV2ZW50IGhhbmRsZXIgaWYgd2UgcmVtb3ZlZCBzb21ldGhpbmcgYW5kIG5vIG1vcmUgaGFuZGxlcnMgZXhpc3Rcblx0XHRcdC8vIChhdm9pZHMgcG90ZW50aWFsIGZvciBlbmRsZXNzIHJlY3Vyc2lvbiBkdXJpbmcgcmVtb3ZhbCBvZiBzcGVjaWFsIGV2ZW50IGhhbmRsZXJzKVxuXHRcdFx0aWYgKCBvcmlnQ291bnQgJiYgIWhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC50ZWFyZG93biB8fFxuXHRcdFx0XHRcdHNwZWNpYWwudGVhcmRvd24uY2FsbCggZWxlbSwgbmFtZXNwYWNlcywgZWxlbURhdGEuaGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBlbGVtRGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlbGV0ZSBldmVudHNbIHR5cGUgXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBSZW1vdmUgZGF0YSBhbmQgdGhlIGV4cGFuZG8gaWYgaXQncyBubyBsb25nZXIgdXNlZFxuXHRcdGlmICggalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGV2ZW50cyApICkge1xuXHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImhhbmRsZSBldmVudHNcIiApO1xuXHRcdH1cblx0fSxcblxuXHRkaXNwYXRjaDogZnVuY3Rpb24oIG5hdGl2ZUV2ZW50ICkge1xuXG5cdFx0Ly8gTWFrZSBhIHdyaXRhYmxlIGpRdWVyeS5FdmVudCBmcm9tIHRoZSBuYXRpdmUgZXZlbnQgb2JqZWN0XG5cdFx0dmFyIGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggbmF0aXZlRXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaiwgaGFuZGxlclF1ZXVlLFxuXHRcdFx0YXJncyA9IG5ldyBBcnJheSggYXJndW1lbnRzLmxlbmd0aCApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblxuXHRcdGZvciAoIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrICkge1xuXHRcdFx0YXJnc1sgaSBdID0gYXJndW1lbnRzWyBpIF07XG5cdFx0fVxuXG5cdFx0ZXZlbnQuZGVsZWdhdGVUYXJnZXQgPSB0aGlzO1xuXG5cdFx0Ly8gQ2FsbCB0aGUgcHJlRGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlLCBhbmQgbGV0IGl0IGJhaWwgaWYgZGVzaXJlZFxuXHRcdGlmICggc3BlY2lhbC5wcmVEaXNwYXRjaCAmJi
21167BzcGVjaWFsLnByZURpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBoYW5kbGVyc1xuXHRcdGhhbmRsZXJRdWV1ZSA9IGpRdWVyeS5ldmVudC5oYW5kbGVycy5jYWxsKCB0aGlzLCBldmVudCwgaGFuZGxlcnMgKTtcblxuXHRcdC8vIFJ1biBkZWxlZ2F0ZXMgZmlyc3Q7IHRoZXkgbWF5IHdhbnQgdG8gc3RvcCBwcm9wYWdhdGlvbiBiZW5lYXRoIHVzXG5cdFx0aSA9IDA7XG5cdFx0d2hpbGUgKCAoIG1hdGNoZWQgPSBoYW5kbGVyUXVldWVbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRldmVudC5jdXJyZW50VGFyZ2V0ID0gbWF0Y2hlZC5lbGVtO1xuXG5cdFx0XHRqID0gMDtcblx0XHRcdHdoaWxlICggKCBoYW5kbGVPYmogPSBtYXRjaGVkLmhhbmRsZXJzWyBqKysgXSApICYmXG5cdFx0XHRcdCFldmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXG5cdFx0XHRcdC8vIFRyaWdnZXJlZCBldmVudCBtdXN0IGVpdGhlciAxKSBoYXZlIG5vIG5hbWVzcGFjZSwgb3IgMikgaGF2ZSBuYW1lc3BhY2Uocylcblx0XHRcdFx0Ly8gYSBzdWJzZXQgb3IgZXF1YWwgdG8gdGhvc2UgaW4gdGhlIGJvdW5kIGV2ZW50IChib3RoIGNhbiBoYXZlIG5vIG5hbWVzcGFjZSkuXG5cdFx0XHRcdGlmICggIWV2ZW50LnJuYW1lc3BhY2UgfHwgZXZlbnQucm5hbWVzcGFjZS50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSB7XG5cblx0XHRcdFx0XHRldmVudC5oYW5kbGVPYmogPSBoYW5kbGVPYmo7XG5cdFx0XHRcdFx0ZXZlbnQuZGF0YSA9IGhhbmRsZU9iai5kYXRhO1xuXG5cdFx0XHRcdFx0cmV0ID0gKCAoIGpRdWVyeS5ldmVudC5zcGVjaWFsWyBoYW5kbGVPYmoub3JpZ1R5cGUgXSB8fCB7fSApLmhhbmRsZSB8fFxuXHRcdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIgKS5hcHBseSggbWF0Y2hlZC5lbGVtLCBhcmdzICk7XG5cblx0XHRcdFx0XHRpZiAoIHJldCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoIGV2ZW50LnJlc3VsdCA9IHJldCApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0XHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbCB0aGUgcG9zdERpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZVxuXHRcdGlmICggc3BlY2lhbC5wb3N0RGlzcGF0Y2ggKSB7XG5cdFx0XHRzcGVjaWFsLnBvc3REaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0aGFuZGxlcnM6IGZ1bmN0aW9uKCBldmVudCwgaGFuZGxlcnMgKSB7XG5cdFx0dmFyIGksIGhhbmRsZU9iaiwgc2VsLCBtYXRjaGVkSGFuZGxlcnMsIG1hdGNoZWRTZWxlY3RvcnMsXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gRmluZCBkZWxlZ2F0ZSBoYW5kbGVyc1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTlcblx0XHRcdC8vIEJsYWNrLWhvbGUgU1ZHIDx1c2U+IGluc3RhbmNlIHRyZWVzICh0cmFjLTEzMTgwKVxuXHRcdFx0Y3VyLm5vZGVUeXBlICYmXG5cblx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00MlxuXHRcdFx0Ly8gU3VwcHJlc3Mgc3BlYy12aW9sYXRpbmcgY2xpY2tzIGluZGljYXRpbmcgYSBub24tcHJpbWFyeSBwb2ludGVyIGJ1dHRvbiAodHJhYy0zODYxKVxuXHRcdFx0Ly8gaHR0cHM6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnQtdHlwZS1jbGlja1xuXHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0Ly8gLi4uYnV0IG5vdCBhcnJvdyBrZXkgXCJjbGlja3NcIiBvZiByYWRpbyBpbnB1dHMsIHdoaWNoIGNhbiBoYXZlIGBidXR0b25gIC0xIChnaC0yMzQzKVxuXHRcdFx0ISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGV2ZW50LmJ1dHRvbiA+PSAxICkgKSB7XG5cblx0XHRcdGZvciAoIDsgY3VyICE9PSB0aGlzOyBjdXIgPSBjdXIucGFyZW50Tm9kZSB8fCB0aGlzICkge1xuXG5cdFx0XHRcdC8vIERvbid0IGNoZWNrIG5vbi1lbGVtZW50cyAoIzEzMjA4KVxuXHRcdFx0XHQvLyBEb24ndCBwcm9jZXNzIGNsaWNrcyBvbiBkaXNhYmxlZCBlbGVtZW50cyAoIzY5MTEsICM4MTY1LCAjMTEzODIsICMxMTc2NClcblx0XHRcdFx0aWYgKCBjdXIubm9kZVR5cGUgPT09IDEgJiYgISggZXZlbnQudHlwZSA9PT0gXCJjbGlja1wiICYmIGN1ci5kaXNhYmxlZCA9PT0gdHJ1ZSApICkge1xuXHRcdFx0XHRcdG1hdGNoZWRIYW5kbGVycyA9IFtdO1xuXHRcdFx0XHRcdG1hdGNoZWRTZWxlY3RvcnMgPSB7fTtcblx0XHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGRlbGVnYXRlQ291bnQ7IGkrKyApIHtcblx0XHRcdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBpIF07XG5cblx0XHRcdFx0XHRcdC8vIERvbid0IGNvbmZsaWN0IHdpdGggT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzICgjMTMyMDMpXG5cdFx0XHRcdFx0XHRzZWwgPSBoYW5kbGVPYmouc2VsZWN0b3IgKyBcIiBcIjtcblxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSA9IGhhbmRsZU9iai5uZWVkc0NvbnRleHQgP1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeSggc2VsLCB0aGlzICkuaW5kZXgoIGN1ciApID4gLTEgOlxuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5maW5kKCBzZWwsIHRoaXMsIG51bGwsIFsgY3VyIF0gKS5sZW5ndGg7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZWRTZWxlY3RvcnNbIHNlbCBdICkge1xuXHRcdFx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGlmICggbWF0Y2hlZEhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZWRIYW5kbGVycyB9ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQWRkIHRoZSByZW1haW5pbmcgKGRpcmVjdGx5LWJvdW5kKSBoYW5kbGVyc1xuXHRcdGN1ciA9IHRoaXM7XG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50IDwgaGFuZGxlcnMubGVuZ3RoICkge1xuXHRcdFx0aGFuZGxlclF1ZXVlLnB1c2goIHsgZWxlbTogY3VyLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHRhZGRQcm9wOiBmdW5jdGlvbiggbmFtZSwgaG9vayApIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIGpRdWVyeS5FdmVudC5wcm90b3R5cGUsIG5hbW
21167UsIHtcblx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRjb25maWd1cmFibGU6IHRydWUsXG5cblx0XHRcdGdldDogaXNGdW5jdGlvbiggaG9vayApID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBob29rKCB0aGlzLm9yaWdpbmFsRXZlbnQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gOlxuXHRcdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFsgbmFtZSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgbmFtZSwge1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHdyaXRhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB2YWx1ZVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGZpeDogZnVuY3Rpb24oIG9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0cmV0dXJuIG9yaWdpbmFsRXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0b3JpZ2luYWxFdmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCBvcmlnaW5hbEV2ZW50ICk7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgbm9kZU5hbWUoIHRoaXMsIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHRoaXMuY2xpY2soKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdC8vIEZvciBjcm9zcy1icm93c2VyIGNvbnNpc3RlbmN5LCBkb24ndCBmaXJlIG5hdGl2ZSAuY2xpY2soKSBvbiBsaW5rc1xuXHRcdFx0X2RlZmF1bHQ6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdFx0cmV0dXJuIG5vZGVOYW1lKCBldmVudC50YXJnZXQsIFwiYVwiICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdGJlZm9yZXVubG9hZDoge1xuXHRcdFx0cG9zdERpc3BhdGNoOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveCAyMCtcblx0XHRcdFx0Ly8gRmlyZWZveCBkb2Vzbid0IGFsZXJ0IGlmIHRoZSByZXR1cm5WYWx1ZSBmaWVsZCBpcyBub3Qgc2V0LlxuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIGV2ZW50Lm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0ZXZlbnQub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZSA9IGV2ZW50LnJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LnJlbW92ZUV2ZW50ID0gZnVuY3Rpb24oIGVsZW0sIHR5cGUsIGhhbmRsZSApIHtcblxuXHQvLyBUaGlzIFwiaWZcIiBpcyBuZWVkZWQgZm9yIHBsYWluIG9iamVjdHNcblx0aWYgKCBlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0ZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBoYW5kbGUgKTtcblx0fVxufTtcblxualF1ZXJ5LkV2ZW50ID0gZnVuY3Rpb24oIHNyYywgcHJvcHMgKSB7XG5cblx0Ly8gQWxsb3cgaW5zdGFudGlhdGlvbiB3aXRob3V0IHRoZSAnbmV3JyBrZXl3b3JkXG5cdGlmICggISggdGhpcyBpbnN0YW5jZW9mIGpRdWVyeS5FdmVudCApICkge1xuXHRcdHJldHVybiBuZXcgalF1ZXJ5LkV2ZW50KCBzcmMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBFdmVudCBvYmplY3Rcblx0aWYgKCBzcmMgJiYgc3JjLnR5cGUgKSB7XG5cdFx0dGhpcy5vcmlnaW5hbEV2ZW50ID0gc3JjO1xuXHRcdHRoaXMudHlwZSA9IHNyYy50eXBlO1xuXG5cdFx0Ly8gRXZlbnRzIGJ1YmJsaW5nIHVwIHRoZSBkb2N1bWVudCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBhcyBwcmV2ZW50ZWRcblx0XHQvLyBieSBhIGhhbmRsZXIgbG93ZXIgZG93biB0aGUgdHJlZTsgcmVmbGVjdCB0aGUgY29ycmVjdCB2YWx1ZS5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHNyYy5kZWZhdWx0UHJldmVudGVkIHx8XG5cdFx0XHRcdHNyYy5kZWZhdWx0UHJldmVudGVkID09PSB1bmRlZmluZWQgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9Mi4zIG9ubHlcblx0XHRcdFx0c3JjLnJldHVyblZhbHVlID09PSBmYWxzZSA/XG5cdFx0XHRyZXR1cm5UcnVlIDpcblx0XHRcdHJldHVybkZhbHNlO1xuXG5cdFx0Ly8gQ3JlYXRlIHRhcmdldCBwcm9wZXJ0aWVzXG5cdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDw9NiAtIDcgb25seVxuXHRcdC8vIFRhcmdldCBzaG91bGQgbm90IGJlIGEgdGV4dCBub2RlICgjNTA0LCAjMTMxNDMpXG5cdFx0dGhpcy50YXJnZXQgPSAoIHNyYy50YXJnZXQgJiYgc3JjLnRhcmdldC5ub2RlVHlwZSA9PT0gMyApID9cblx0XHRcdHNyYy50YXJnZXQucGFyZW50Tm9kZSA6XG5cdFx0XHRzcmMudGFyZ2V0O1xuXG5cdFx0dGhpcy5jdXJyZW50VGFyZ2V0ID0gc3JjLmN1cnJlbnRUYXJnZXQ7XG5cdFx0dGhpcy5yZWxhdGVkVGFyZ2V0ID0gc3JjLnJlbGF0ZWRUYXJnZXQ7XG5cblx0Ly8gRXZlbnQgdHlwZVxuXHR9IGVsc2Uge1xuXHRcdHRoaXMudHlwZSA9IHNyYztcblx0fVxuXG5cdC8vIFB1dCBleHBsaWNpdGx5IHByb3ZpZGVkIHByb3BlcnRpZXMgb250byB0aGUgZXZlbnQgb2JqZWN0XG5cdGlmICggcHJvcHMgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdGhpcywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIENyZWF0ZSBhIHRpbWVzdGFtcCBpZiBpbmNvbWluZyBldmVudCBkb2Vzbid0IGhhdmUgb25lXG5cdHRoaXMudGltZVN0YW1wID0gc3JjICYmIHNyYy50aW1l
21167U3RhbXAgfHwgRGF0ZS5ub3coKTtcblxuXHQvLyBNYXJrIGl0IGFzIGZpeGVkXG5cdHRoaXNbIGpRdWVyeS5leHBhbmRvIF0gPSB0cnVlO1xufTtcblxuLy8galF1ZXJ5LkV2ZW50IGlzIGJhc2VkIG9uIERPTTMgRXZlbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgRUNNQVNjcmlwdCBMYW5ndWFnZSBCaW5kaW5nXG4vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIEluY2x1ZGVzIGFsbCBjb21tb24gZXZlbnQgcHJvcHMgaW5jbHVkaW5nIEtleUV2ZW50IGFuZCBNb3VzZUV2ZW50IHNwZWNpZmljIHByb3BzXG5qUXVlcnkuZWFjaCgge1xuXHRhbHRLZXk6IHRydWUsXG5cdGJ1YmJsZXM6IHRydWUsXG5cdGNhbmNlbGFibG
21167U6IHRydWUsXG5cdGNoYW5nZWRUb3VjaGVzOiB0cnVlLFxuXHRjdHJsS2V5OiB0cnVlLFxuXHRkZXRhaWw6IHRydWUsXG5cdGV2ZW50UGhhc2U6IHRydWUsXG5cdG1ldGFLZXk6IHRydWUsXG5cdHBhZ2VYOiB0cnVlLFxuXHRwYWdlWTogdHJ1ZSxcblx0c2hpZnRLZXk6IHRydWUsXG5cdHZpZXc6IHRydWUsXG5cdFwiY2hhclwiOiB0cnVlLFxuXHRjaGFyQ29kZTogdHJ1ZSxcblx0a2V5OiB0cnVlLFxuXHRrZXlDb2RlOiB0cnVlLFxuXHRidXR0b246IHRydWUsXG5cdGJ1dHRvbnM6IHRydWUsXG5cdGNsaWVudFg6IHRydWUsXG5cdGNsaWVudFk6IHRydWUsXG5cdG9mZnNldFg6IHRydWUsXG5cdG9mZnNldFk6IHRydWUsXG5cdHBvaW50ZXJJZDogdHJ1ZSxcblx0cG9pbnRlclR5cGU6IHRydWUsXG5cdHNjcmVlblg6IHRydWUsXG5cdHNjcmVlblk6IHRydWUsXG5cdHRhcmdldFRvdWNoZXM6IHRydWUsXG5cdHRvRWxlbWVudDogdHJ1ZSxcblx0dG91Y2hlczogdHJ1ZSxcblxuXHR3aGljaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdHZhciBidXR0b24gPSBldmVudC5idXR0b247XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGtleSBldmVudHNcblx0XHRpZiAoIGV2ZW50LndoaWNoID09IG51bGwgJiYgcmtleUV2ZW50LnRlc3QoIGV2ZW50LnR5cGUgKSApIHtcblx0XHRcdHJldHVybiBldmVudC5jaGFyQ29kZSAhPSBudWxsID8gZXZlbnQuY2hhckNvZGUgOiBldmVudC5rZXlDb2RlO1xuXHRcdH1cblxuXHRcdC8vIEFkZCB3aGljaCBmb3IgY2xpY2s6IDEgPT09IGxlZnQ7IDIgPT09IG1pZGRsZTsgMyA9PT0gcmlnaHRcblx0XHRpZiAoICFldmVudC53aGljaCAmJiBidXR0b24gIT09IHVuZGVmaW5lZCAmJiBybW91c2VFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDEgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDIgKSB7XG5cdFx0XHRcdHJldHVybiAzO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGJ1dHRvbiAmIDQgKSB7XG5cdFx0XHRcdHJldHVybiAyO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQud2hpY2g7XG5cdH1cbn0sIGpRdWVyeS5ldmVudC5hZGRQcm9wICk7XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD00NzAyNThcbi8vIGZvciB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGJ1ZyAoaXQgZXhpc3RlZCBpbiBvbGRlciBDaHJvbWUgdmVyc2lvbnMgYXMgd2VsbCkuXG5qUXVlcnkuZWFjaCgge1xuXHRtb3VzZWVudGVyOiBcIm1vdXNlb3ZlclwiLFxuXHRtb3VzZWxlYXZlOiBcIm1vdXNlb3V0XCIsXG5cdHBvaW50ZXJlbnRlcjogXCJwb2ludGVyb3ZlclwiLFxuXHRwb2ludGVybGVhdmU6IFwicG9pbnRlcm91dFwiXG59LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgb3JpZyBdID0ge1xuXHRcdGRlbGVnYXRlVHlwZTogZml4LFxuXHRcdGJpbmRUeXBlOiBmaXgsXG5cblx0XHRoYW5kbGU6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdHZhciByZXQsXG5cdFx0XHRcdHRhcmdldCA9IHRoaXMsXG5cdFx0XHRcdHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0LFxuXHRcdFx0XHRoYW5kbGVPYmogPSBldmVudC5oYW5kbGVPYmo7XG5cblx0XHRcdC8vIEZvciBtb3VzZWVudGVyL2xlYXZlIGNhbGwgdGhlIGhhbmRsZXIgaWYgcmVsYXRlZCBpcyBvdXRzaWRlIHRoZSB0YXJnZXQuXG5cdFx0XHQvLyBOQjogTm8gcmVsYXRlZFRhcmdldCBpZiB0aGUgbW91c2UgbGVmdC9lbnRlcmVkIHRoZSBicm93c2VyIHdpbmRvd1xuXHRcdFx0aWYgKCAhcmVsYXRlZCB8fCAoIHJlbGF0ZWQgIT09IHRhcmdldCAmJiAhalF1ZXJ5LmNvbnRhaW5zKCB0YXJnZXQsIHJlbGF0ZWQgKSApICkge1xuXHRcdFx0XHRldmVudC50eXBlID0gaGFuZGxlT2JqLm9yaWdUeXBlO1xuXHRcdFx0XHRyZXQgPSBoYW5kbGVPYmouaGFuZGxlci5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdGV2ZW50LnR5cGUgPSBmaXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdG9uOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0b25lOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gb24oIHRoaXMsIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIDEgKTtcblx0fSxcblx0b2ZmOiBmdW5jdGlvbiggdHlwZXMsIHNlbGVjdG9yLCBmbiApIHtcblx0XHR2YXIgaGFuZGxlT2JqLCB0eXBlO1xuXHRcdGlmICggdHlwZXMgJiYgdHlwZXMucHJldmVudERlZmF1bHQgJiYgdHlwZXMuaGFuZGxlT2JqICkge1xuXG5cdFx0XHQvLyAoIGV2ZW50ICkgIGRpc3BhdGNoZWQgalF1ZXJ5LkV2ZW50XG5cdFx0XHRoYW5kbGVPYmogPSB0eXBlcy5oYW5kbGVPYmo7XG5cdFx0XHRqUXVlcnkoIHR5cGVzLmRlbGVnYXRlVGFyZ2V0ICkub2ZmKFxuXHRcdFx0XHRoYW5kbGVPYmoubmFtZXNwYWNlID9cblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUgKyBcIi5cIiArIGhhbmRsZU9iai5uYW1lc3BhY2UgOlxuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSxcblx0XHRcdFx0aGFuZGxlT2JqLnNlbGVjdG9yLFxuXHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlclxuXHRcdFx0KTtcblx0XHRcdHJldHVybi
21167B0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHR5cGVvZiB0eXBlcyA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1vYmplY3QgWywgc2VsZWN0b3JdIClcblx0XHRcdGZvciAoIHR5cGUgaW4gdHlwZXMgKSB7XG5cdFx0XHRcdHRoaXMub2ZmKCB0eXBlLCBzZWxlY3RvciwgdHlwZXNbIHR5cGUgXSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggc2VsZWN0b3IgPT09IGZhbHNlIHx8IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzIFssIGZuXSApXG5cdFx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCB0aGlzLCB0eXBlcywgZm4sIHNlbGVjdG9yICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cblxudmFyXG5cblx0LyogZXNsaW50LWRpc2FibGUgbWF4LWxlbiAqL1xuXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvMzIyOVxuXHRyeGh0bWxUYWcgPSAvPCg/IWFyZWF8YnJ8Y29sfGVtYmVkfGhyfGltZ3xpbnB1dHxsaW5rfG1ldGF8cGFyYW0pKChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopW14+XSopXFwvPi9naSxcblxuXHQvKiBlc2xpbnQtZW5hYmxlICovXG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMCAtIDExLCBFZGdlIDEyIC0gMTMgb25seVxuXHQvLyBJbiBJRS9FZGdlIHVzaW5nIHJlZ2V4IGdyb3VwcyBoZXJlIGNhdXNlcyBzZXZlcmUgc2xvd2Rvd25zLlxuXHQvLyBTZWUgaHR0cHM6Ly9jb25uZWN0Lm1pY3Jvc29mdC5jb20vSUUvZmVlZGJhY2svZGV0YWlscy8xNzM2NTEyL1xuXHRybm9Jbm5lcmh0bWwgPSAvPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxcblxuXHQvLyBjaGVja2VkPVwiY2hlY2tlZFwiIG9yIGNoZWNrZWRcblx0cmNoZWNrZWQgPSAvY2hlY2tlZFxccyooPzpbXj1dfD1cXHMqLmNoZWNrZWQuKS9pLFxuXHRyY2xlYW5TY3JpcHQgPSAvXlxccyo8ISg/OlxcW0NEQVRBXFxbfC0tKXwoPzpcXF1cXF18LS0pPlxccyokL2c7XG5cbi8vIFByZWZlciBhIHRib2R5IG92ZXIgaXRzIHBhcmVudCB0YWJsZSBmb3IgY29udGFpbmluZyBuZXcgcm93c1xuZnVuY3Rpb24gbWFuaXB1bGF0aW9uVGFyZ2V0KCBlbGVtLCBjb250ZW50ICkge1xuXHRpZiAoIG5vZGVOYW1lKCBlbGVtLCBcInRhYmxlXCIgKSAmJlxuXHRcdG5vZGVOYW1lKCBjb250ZW50Lm5vZGVUeXBlICE9PSAxMSA/IGNvbnRlbnQgOiBjb250ZW50LmZpcnN0Q2hpbGQsIFwidHJcIiApICkge1xuXG5cdFx0cmV0dXJuIGpRdWVyeSggZWxlbSApLmNoaWxkcmVuKCBcInRib2R5XCIgKVsgMCBdIHx8IGVsZW07XG5cdH1cblxuXHRyZXR1cm4gZWxlbTtcbn1cblxuLy8gUmVwbGFjZS9yZXN0b3JlIHRoZSB0eXBlIGF0dHJpYnV0ZSBvZiBzY3JpcHQgZWxlbWVudHMgZm9yIHNhZmUgRE9NIG1hbmlwdWxhdGlvblxuZnVuY3Rpb24gZGlzYWJsZVNjcmlwdCggZWxlbSApIHtcblx0ZWxlbS50eXBlID0gKCBlbGVtLmdldEF0dHJpYnV0ZSggXCJ0eXBlXCIgKSAhPT0gbnVsbCApICsgXCIvXCIgKyBlbGVtLnR5cGU7XG5cdHJldHVybiBlbGVtO1xufVxuZnVuY3Rpb24gcmVzdG9yZVNjcmlwdCggZWxlbSApIHtcblx0aWYgKCAoIGVsZW0udHlwZSB8fCBcIlwiICkuc2xpY2UoIDAsIDUgKSA9PT0gXCJ0cnVlL1wiICkge1xuXHRcdGVsZW0udHlwZSA9IGVsZW0udHlwZS5zbGljZSggNSApO1xuXHR9IGVsc2Uge1xuXHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBcInR5cGVcIiApO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmZ1bmN0aW9uIGNsb25lQ29weUV2ZW50KCBzcmMsIGRlc3QgKSB7XG5cdHZhciBpLCBsLCB0eXBlLCBwZGF0YU9sZCwgcGRhdGFDdXIsIHVkYXRhT2xkLCB1ZGF0YUN1ciwgZXZlbnRzO1xuXG5cdGlmICggZGVzdC5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyAxLiBDb3B5IHByaXZhdGUgZGF0YTogZXZlbnRzLCBoYW5kbGVycywgZXRjLlxuXHRpZiAoIGRhdGFQcml2Lmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHBkYXRhT2xkID0gZGF0YVByaXYuYWNjZXNzKCBzcmMgKTtcblx0XHRwZGF0YUN1ciA9IGRhdGFQcml2LnNldCggZGVzdCwgcGRhdGFPbGQgKTtcblx0XHRldmVudHMgPSBwZGF0YU9sZC5ldmVudHM7XG5cblx0XHRpZiAoIGV2ZW50cyApIHtcblx0XHRcdGRlbGV0ZSBwZGF0YUN1ci5oYW5kbGU7XG5cdFx0XHRwZGF0YUN1ci5ldmVudHMgPSB7fTtcblxuXHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gZXZlbnRzWyB0eXBlIF0ubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5hZGQoIGRlc3QsIHR5cGUsIGV2ZW50c1sgdHlwZSBdWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIDIuIENvcHkgdXNlciBkYXRhXG5cdGlmICggZGF0YVVzZXIuaGFzRGF0YSggc3JjICkgKSB7XG5cdFx0dWRhdGFPbGQgPSBkYXRhVXNlci5hY2Nlc3MoIHNyYyApO1xuXHRcdHVkYXRhQ3VyID0galF1ZXJ5LmV4dGVuZCgge30sIHVkYXRhT2xkICk7XG5cblx0XHRkYXRhVXNlci5zZXQoIGRlc3QsIHVkYXRhQ3VyICk7XG5cdH1cbn1cblxuLy8gRml4IElFIGJ1Z3MsIHNlZSBzdXBwb3J0IHRlc3RzXG5mdW5jdGlvbiBmaXhJbnB1dCggc3JjLCBkZXN0ICkge1xuXHR2YXIgbm9kZU5hbWUgPSBkZXN0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0Ly8gRmFpbHMgdG8gcGVyc2lzdCB0aGUgY2hlY2tlZCBzdGF0ZSBvZiBhIGNsb25lZCBjaGVja2JveCBvciByYWRpbyBidXR0b24uXG5cdGlmICggbm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiByY2hlY2thYmxlVHlwZS50ZXN0KCBzcmMudHlwZSApICkge1xuXHRcdGRlc3QuY2hlY2tlZCA9IHNyYy5jaGVja2VkO1xuXG5cdC8vIEZhaWxzIHRvIHJldHVybi
21167B0aGUgc2VsZWN0ZWQgb3B0aW9uIHRvIHRoZSBkZWZhdWx0IHNlbGVjdGVkIHN0YXRlIHdoZW4gY2xvbmluZyBvcHRpb25zXG5cdH0gZWxzZSBpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgfHwgbm9kZU5hbWUgPT09IFwidGV4dGFyZWFcIiApIHtcblx0XHRkZXN0LmRlZmF1bHRWYWx1ZSA9IHNyYy5kZWZhdWx0VmFsdWU7XG5cdH1cbn1cblxuZnVuY3Rpb24gZG9tTWFuaXAoIGNvbGxlY3Rpb24sIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICkge1xuXG5cdC8vIEZsYXR0ZW4gYW55IG5lc3RlZCBhcnJheXNcblx0YXJncyA9IGNvbmNhdC5hcHBseSggW10sIGFyZ3MgKTtcblxuXHR2YXIgZnJhZ21lbnQsIGZpcnN0LCBzY3JpcHRzLCBoYXNTY3JpcHRzLCBub2RlLCBkb2MsXG5cdFx0aSA9IDAsXG5cdFx0bCA9IGNvbGxlY3Rpb24ubGVuZ3RoLFxuXHRcdGlOb0Nsb25lID0gbCAtIDEsXG5cdFx0dmFsdWUgPSBhcmdzWyAwIF0sXG5cdFx0dmFsdWVJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gfHxcblx0XHRcdCggbCA+IDEgJiYgdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzdXBwb3J0LmNoZWNrQ2xvbmUgJiYgcmNoZWNrZWQudGVzdCggdmFsdWUgKSApICkge1xuXHRcdHJldHVybiBjb2xsZWN0aW9uLmVhY2goIGZ1bmN0aW9uKCBpbmRleCApIHtcblx0XHRcdHZhciBzZWxmID0gY29sbGVjdGlvbi5lcSggaW5kZXggKTtcblx0XHRcdGlmICggdmFsdWVJc0Z1bmN0aW9uICkge1xuXHRcdFx0XHRhcmdzWyAwIF0gPSB2YWx1ZS5jYWxsKCB0aGlzLCBpbmRleCwgc2VsZi5odG1sKCkgKTtcblx0XHRcdH1cblx0XHRcdGRvbU1hbmlwKCBzZWxmLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApO1xuXHRcdH0gKTtcblx0fVxuXG5cdGlmICggbCApIHtcblx0XHRmcmFnbWVudCA9IGJ1aWxkRnJhZ21lbnQoIGFyZ3MsIGNvbGxlY3Rpb25bIDAgXS5vd25lckRvY3VtZW50LCBmYWxzZSwgY29sbGVjdGlvbiwgaWdub3JlZCApO1xuXHRcdGZpcnN0ID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdGlmICggZnJhZ21lbnQuY2hpbGROb2Rlcy5sZW5ndGggPT09IDEgKSB7XG5cdFx0XHRmcmFnbWVudCA9IGZpcnN0O1xuXHRcdH1cblxuXHRcdC8vIFJlcXVpcmUgZWl0aGVyIG5ldyBjb250ZW50IG9yIGFuIGludGVyZXN0IGluIGlnbm9yZWQgZWxlbWVudHMgdG8gaW52b2tlIHRoZSBjYWxsYmFja1xuXHRcdGlmICggZmlyc3QgfHwgaWdub3JlZCApIHtcblx0XHRcdHNjcmlwdHMgPSBqUXVlcnkubWFwKCBnZXRBbGwoIGZyYWdtZW50LCBcInNjcmlwdFwiICksIGRpc2FibGVTY3JpcHQgKTtcblx0XHRcdGhhc1NjcmlwdHMgPSBzY3JpcHRzLmxlbmd0aDtcblxuXHRcdFx0Ly8gVXNlIHRoZSBvcmlnaW5hbCBmcmFnbWVudCBmb3IgdGhlIGxhc3QgaXRlbVxuXHRcdFx0Ly8gaW5zdGVhZCBvZiB0aGUgZmlyc3QgYmVjYXVzZSBpdCBjYW4gZW5kIHVwXG5cdFx0XHQvLyBiZWluZyBlbXB0aWVkIGluY29ycmVjdGx5IGluIGNlcnRhaW4gc2l0dWF0aW9ucyAoIzgwNzApLlxuXHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRub2RlID0gZnJhZ21lbnQ7XG5cblx0XHRcdFx0aWYgKCBpICE9PSBpTm9DbG9uZSApIHtcblx0XHRcdFx0XHRub2RlID0galF1ZXJ5LmNsb25lKCBub2RlLCB0cnVlLCB0cnVlICk7XG5cblx0XHRcdFx0XHQvLyBLZWVwIHJlZmVyZW5jZXMgdG8gY2xvbmVkIHNjcmlwdHMgZm9yIGxhdGVyIHJlc3RvcmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0XHRcdGpRdWVyeS5tZXJnZSggc2NyaXB0cywgZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjYWxsYmFjay5jYWxsKCBjb2xsZWN0aW9uWyBpIF0sIG5vZGUsIGkgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBoYXNTY3JpcHRzICkge1xuXHRcdFx0XHRkb2MgPSBzY3JpcHRzWyBzY3JpcHRzLmxlbmd0aCAtIDEgXS5vd25lckRvY3VtZW50O1xuXG5cdFx0XHRcdC8vIFJlZW5hYmxlIHNjcmlwdHNcblx0XHRcdFx0alF1ZXJ5Lm1hcCggc2NyaXB0cywgcmVzdG9yZVNjcmlwdCApO1xuXG5cdFx0XHRcdC8vIEV2YWx1YXRlIGV4ZWN1dGFibGUgc2NyaXB0cyBvbiBmaXJzdCBkb2N1bWVudCBpbnNlcnRpb25cblx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBoYXNTY3JpcHRzOyBpKysgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IHNjcmlwdHNbIGkgXTtcblx0XHRcdFx0XHRpZiAoIHJzY3JpcHRUeXBlLnRlc3QoIG5vZGUudHlwZSB8fCBcIlwiICkgJiZcblx0XHRcdFx0XHRcdCFkYXRhUHJpdi5hY2Nlc3MoIG5vZGUsIFwiZ2xvYmFsRXZhbFwiICkgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5jb250YWlucyggZG9jLCBub2RlICkgKSB7XG5cblx0XHRcdFx0XHRcdGlmICggbm9kZS5zcmMgJiYgKCBub2RlLnR5cGUgfHwgXCJcIiApLnRvTG93ZXJDYXNlKCkgICE9PSBcIm1vZHVsZVwiICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE9wdGlvbmFsIEFKQVggZGVwZW5kZW5jeSwgYnV0IHdvbid0IHJ1biBzY3JpcHRzIGlmIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5Ll9ldmFsVXJsICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5fZXZhbFVybCggbm9kZS5zcmMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0RE9NRXZhbCggbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKCByY2xlYW5TY3JpcHQsIFwiXCIgKSwgZG9jLCBub2RlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwczovL2pzcGVyZi5jb20vZ2V0YWxsLXZzLXNpenpsZS8yXG5cdFx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lICk7XG5cdFx0XHRzcmNFbGVtZW50cyA9IGdldEFsbCggZWxlbSApO1xuXG5cdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zml4SW5wdXQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29weSB0aGUgZXZlbnRzIGZyb20gdGhlIG9yaWdpbmFsIHRvIHRoZSBjbG9uZVxuXHRcdGlmICggZGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdGlmICggZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRcdHNyY0VsZW1lbnRzID0gc3JjRWxlbWVudHMgfHwgZ2V0QWxsKCBlbGVtICk7XG5cdFx0XHRcdGRlc3RFbGVtZW50cyA9IGRlc3RFbGVtZW50cyB8fCBnZXRBbGwoIGNsb25lICk7XG5cblx0XHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIHNyY0VsZW1lbnRzWyBpIF0sIGRlc3RFbGVtZW50c1sgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lQ29weUV2ZW50KCBlbGVtLCBjbG9uZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRkZXN0RWxlbWVudHMgPSBnZXRBbGwoIGNsb25lLCBcInNjcmlwdFwiICk7XG5cdFx0aWYgKCBkZXN0RWxlbWVudHMubGVuZ3RoID4gMCApIHtcblx0XHRcdHNldEdsb2JhbEV2YWwoIGRlc3RFbGVtZW50cywgIWluUGFnZSAmJiBnZXRBbGwoIGVsZW0sIFwic2NyaXB0XCIgKSApO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybi
21167B0aGUgY2xvbmVkIHNldFxuXHRcdHJldHVybiBjbG9uZTtcblx0fSxcblxuXHRjbGVhbkRhdGE6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblx0XHR2YXIgZGF0YSwgZWxlbSwgdHlwZSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbCxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSBlbGVtc1sgaSBdICkgIT09IHVuZGVmaW5lZDsgaSsrICkge1xuXHRcdFx0aWYgKCBhY2NlcHREYXRhKCBlbGVtICkgKSB7XG5cdFx0XHRcdGlmICggKCBkYXRhID0gZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdICkgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdGZvciAoIHR5cGUgaW4gZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggc3BlY2lhbFsgdHlwZSBdICkge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0XHRcdFx0XHQvLyBUaGlzIGlzIGEgc2hvcnRjdXQgdG8gYXZvaWQgalF1ZXJ5LmV2ZW50LnJlbW92ZSdzIG92ZXJoZWFkXG5cdFx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LnJlbW92ZUV2ZW50KCBlbGVtLCB0eXBlLCBkYXRhLmhhbmRsZSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKCBlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gKSB7XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0zNSAtIDQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6
21167IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seSwgUGhhbnRvbUpTIDEgb25seVxuXHRcdFx0Ly8gLmdldCgpIGJlY2F1c2UgcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0cHVzaC5hcHBseSggcmV0LCBlbGVtcy5nZXQoKSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggcmV0ICk7XG5cdH07XG59ICk7XG52YXIgcm51bW5vbnB4ID0gbmV3IFJlZ0V4cCggXCJeKFwiICsgcG51bSArIFwiKSg/IXB4KVthLXolXSskXCIsIFwiaVwiICk7XG5cbnZhciBnZXRTdHlsZXMgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seSwgRmlyZWZveCA8PTMwICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciByYm94U3R5bGUgPSBuZXcgUmVnRXhwKCBjc3NFeHBhbmQuam9pbiggXCJ8XCIgKSwgXCJpXCIgKTtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXG5cdFx0Ly8gVGhpcyBpcyBh
21167IHNpbmdsZXRvbiwgd2UgbmVlZCB0byBleGVjdXRlIGl0IG9ubHkgb25jZVxuXHRcdGlmICggIWRpdiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb250YWluZXIuc3R5bGUuY3NzVGV4dCA9IFwicG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O1wiICtcblx0XHRcdFwibWFyZ2luLXRvcDoxcHg7cGFkZGluZzowO2JvcmRlcjowXCI7XG5cdFx0ZGl2LnN0eWxlLmNzc1RleHQgPVxuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7XCIgK1xuXHRcdFx0XCJtYXJnaW46YXV0bztib3JkZXI6MXB4O3BhZGRpbmc6MXB4O1wiICtcblx0XHRcdFwid2lkdGg6NjAlO3RvcDoxJVwiO1xuXHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblxuXHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gNDRcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSByb3VuZFBpeGVsTWVhc3VyZXMoIGRpdlN0eWxlLm1hcmdpbkxlZnQgKSA9PT0gMTI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBTYWZhcmkgPD05LjEgLSAxMC4xLCBpT1MgPD03LjAgLSA5LjNcblx0XHQvLyBTb21lIHN0eWxlcyBjb21lIGJhY2sgd2l0aCBwZXJjZW50YWdlIHZhbHVlcywgZXZlbiB0aG91Z2ggdGhleSBzaG91bGRuJ3Rcblx0XHRkaXYuc3R5bGUucmlnaHQgPSBcIjYwJVwiO1xuXHRcdHBpeGVsQm94U3R5bGVzVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5yaWdodCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdFx0Ly8gRGV0ZWN0IG1pc3JlcG9ydGluZyBvZiBjb250ZW50IGRpbWVuc2lvbnMgZm9yIGJveC1zaXppbmc6Ym9yZGVyLWJveCBlbGVtZW50c1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS53aWR0aCApID09PSAzNjtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgb25seVxuXHRcdC8vIERldGVjdCBvdmVyZmxvdzpzY3JvbGwgc2NyZXdpbmVzcyAoZ2gtMzY5OSlcblx0XHRkaXYuc3R5bGUucG9zaXRpb24gPSBcImFic29sdXRlXCI7XG5cdFx0c2Nyb2xsYm94U2l6ZVZhbCA9IGRpdi5vZmZzZXRXaWR0aCA9PT0gMzYgfHwgXCJhYnNvbHV0ZVwiO1xuXG5cdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblxuXHRcdC8vIE51bGxpZnkgdGhlIGRpdiBzbyBpdCB3b3VsZG4ndCBiZSBzdG9yZWQgaW4gdGhlIG1lbW9yeSBhbmRcblx0XHQvLyBpdCB3aWxsIGFsc28gYmUgYSBzaWduIHRoYXQgY2hlY2tzIGFscmVhZHkgcGVyZm9ybWVkXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxuXG5cdGZ1bmN0aW9uIHJvdW5kUGl4ZWxNZWFzdXJlcyggbWVhc3VyZSApIHtcblx0XHRyZXR1cm4gTWF0aC5yb3VuZCggcGFyc2VGbG9hdCggbWVhc3VyZSApICk7XG5cdH1cblxuXHR2YXIgcGl4ZWxQb3NpdGlvblZhbCwgYm94U2l6aW5nUmVsaWFibGVWYWwsIHNjcm9sbGJveFNpemVWYWwsIHBpeGVsQm94U3R5bGVzVmFsLFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdFZhbCxcblx0XHRjb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICksXG5cdFx0ZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApO1xuXG5cdC8vIEZpbmlzaCBlYXJseSBpbiBsaW1pdGVkIChub24tYnJvd3NlcikgZW52aXJvbm1lbnRzXG5cdGlmICggIWRpdi5zdHlsZSApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdC8vIFN0eWxlIG9mIGNsb25lZCBlbGVtZW50IGFmZmVjdHMgc291cmNlIGVsZW1lbnQgY2xvbmVkICgjODkwOClcblx0ZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJjb250ZW50LWJveFwiO1xuXHRkaXYuY2xvbmVOb2RlKCB0cnVlICkuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcIlwiO1xuXHRzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSA9IGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9PT0gXCJjb250ZW50LWJveFwiO1xuXG5cdGpRdWVyeS5leHRlbmQoIHN1cHBvcnQsIHtcblx0XHRib3hTaXppbmdSZWxpYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxCb3hTdHlsZXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbEJveFN0eWxlc1ZhbDtcblx0XHR9LFxuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcmVsaWFibGVNYXJnaW5MZWZ0VmFsO1xuXHRcdH0sXG5cdFx0c2Nyb2xsYm94U2l6ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHNjcm9sbGJveFNpemVWYWw7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveCA1MStcblx0XHQvLyBSZXRyaWV2aW5nIHN0eWxlIGJlZm9yZSBjb21wdXRlZCBzb21laG93XG5cdFx0Ly8gZml4ZXMgYW4gaXNzdWUgd2l0aCBnZXR0aW5nIHdyb25nIHZhbHVlc1xuXHRcdC8vIG9uIGRldGFjaGVkIGVsZW1lbnRzXG5cdFx0c3R5bGUgPSBlbGVtLnN0eWxlO1xuXG5cdGNvbXB1dGVkID0gY29tcHV0ZWQgfHwgZ2V0U3R5bGVzKCBlbGVtICk7XG5cblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBuZWVkZWQgZm9yOlxuXHQvLyAgIC5jc3MoJ2ZpbHRlcicpIChJRSA5IG9ubHksICMxMjUzNylcblx0Ly8gICAuY3NzKCctLWN1c3RvbVByb3BlcnR5KSAoIzMxNDQpXG5cdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0cmV0ID0gY29tcHV0ZWQuZ2V0UHJvcGVydHlWYWx1ZSggbmFtZSApIHx8IGNvbXB1dGVkWyBuYW1lIF0
211677XG5cblx0XHRpZiAoIHJldCA9PT0gXCJcIiAmJiAhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKSApIHtcblx0XHRcdHJldCA9IGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwczovL2RyYWZ0cy5jc3N3Zy5vcmcvY3Nzb20vI3Jlc29sdmVkLXZhbHVlc1xuXHRcdGlmICggIXN1cHBvcnQucGl4ZWxCb3hTdHlsZXMoKSAmJiBybnVtbm9ucHgudGVzdCggcmV0ICkgJiYgcmJveFN0eWxlLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0Ly8gUmVtZW1iZXIgdGhlIG9yaWdpbmFsIHZhbHVlc1xuXHRcdFx0d2lkdGggPSBzdHlsZS53aWR0aDtcblx0XHRcdG1pbldpZHRoID0gc3R5bGUubWluV2lkdGg7XG5cdFx0XHRtYXhXaWR0aCA9IHN0eWxlLm1heFdpZHRoO1xuXG5cdFx0XHQvLyBQdXQgaW4gdGhlIG5ldyB2YWx1ZXMgdG8gZ2V0IGEgY29tcHV0ZWQgdmFsdWUgb3V0XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IHN0eWxlLm1heFdpZHRoID0gc3R5bGUud2lkdGggPSByZXQ7XG5cdFx0XHRyZXQgPSBjb21wdXRlZC53aWR0aDtcblxuXHRcdFx0Ly8gUmV2ZXJ0IHRoZSBjaGFuZ2VkIHZhbHVlc1xuXHRcdFx0c3R5bGUud2lkdGggPSB3aWR0aDtcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gbWluV2lkdGg7XG5cdFx0XHRzdHlsZS5tYXhXaWR0aCA9IG1heFdpZHRoO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXQgIT09IHVuZGVmaW5lZCA/XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSBvbmx5XG5cdFx0Ly8gSUUgcmV0dXJucyB6SW5kZXggdmFsdWUgYXMgYW4gaW50ZWdlci5cblx0XHRyZXQgKyBcIlwiIDpcblx0XHRyZXQ7XG59XG5cblxuZnVuY3Rpb24gYWRkR2V0SG9va0lmKCBjb25kaXRpb25GbiwgaG9va0ZuICkge1xuXG5cdC8vIERlZmluZSB0aGUgaG9vaywgd2UnbGwgY2hlY2sgb24gdGhlIGZpcnN0IHJ1biBpZiBpdCdzIHJlYWxseSBuZWVkZWQuXG5cdHJldHVybiB7XG5cdFx0Z2V0OiBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggY29uZGl0aW9uRm4oKSApIHtcblxuXHRcdFx0XHQvLyBIb29rIG5vdCBuZWVkZWQgKG9yIGl0J3Mgbm90IHBvc3NpYmxlIHRvIHVzZSBpdCBkdWVcblx0XHRcdFx0Ly8gdG8gbWlzc2luZyBkZXBlbmRlbmN5KSwgcmVtb3ZlIGl0LlxuXHRcdFx0XHRkZWxldGUgdGhpcy5nZXQ7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSG9vayBuZWVkZWQ7IHJlZGVmaW5lIGl0IHNvIHRoYXQgdGhlIHN1cHBvcnQgdGVzdCBpcyBub3QgZXhlY3V0ZWQgYWdhaW4uXG5cdFx0XHRyZXR1cm4gKCB0aGlzLmdldCA9IGhvb2tGbiApLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHR9XG5cdH07XG59XG5cblxudmFyXG5cblx0Ly8gU3dhcHBhYmxlIGlmIGRpc3BsYXkgaXMgbm9uZSBvciBzdGFydHMgd2l0aCB0YWJsZVxuXHQvLyBleGNlcHQgXCJ0YWJsZVwiLCBcInRhYmxlLWNlbGxcIiwgb3IgXCJ0YWJsZS1jYXB0aW9uXCJcblx0Ly8gU2VlIGhlcmUgZm9yIGRpc3BsYXkgdmFsdWVzOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0NTUy9kaXNwbGF5XG5cdHJkaXNwbGF5c3dhcCA9IC9eKG5vbmV8dGFibGUoPyEtY1tlYV0pLispLyxcblx0cmN1c3RvbVByb3AgPSAvXi0tLyxcblx0Y3NzU2hvdyA9IHsgcG9zaXRpb246IFwiYWJzb2x1dGVcIiwgdmlzaWJpbGl0eTogXCJoaWRkZW5cIiwgZGlzcGxheTogXCJibG9ja1wiIH0sXG5cdGNzc05vcm1hbFRyYW5zZm9ybSA9IHtcblx0XHRsZXR0ZXJTcGFjaW5nOiBcIjBcIixcblx0XHRmb250V2VpZ2h0OiBcIjQwMFwiXG5cdH0sXG5cblx0Y3NzUHJlZml4ZXMgPSBbIFwiV2Via2l0XCIsIFwiTW96XCIsIFwibXNcIiBdLFxuXHRlbXB0eVN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLnN0eWxlO1xuXG4vLyBSZXR1cm4gYSBjc3MgcHJvcGVydHkgbWFwcGVkIHRvIGEgcG90ZW50aWFsbHkgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5XG5mdW5jdGlvbiB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHtcblxuXHQvLyBTaG9ydGN1dCBmb3IgbmFtZXMgdGhhdCBhcmUgbm90IHZlbmRvciBwcmVmaXhlZFxuXHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRyZXR1cm4gbmFtZTtcblx0fVxuXG5cdC8vIENoZWNrIGZvciB2ZW5kb3IgcHJlZml4ZWQgbmFtZXNcblx0dmFyIGNhcE5hbWUgPSBuYW1lWyAwIF0udG9VcHBlckNhc2UoKSArIG5hbWUuc2xpY2UoIDEgKSxcblx0XHRpID0gY3NzUHJlZml4ZXMubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdG5hbWUgPSBjc3NQcmVmaXhlc1sgaSBdICsgY2FwTmFtZTtcblx0XHRpZiAoIG5hbWUgaW4gZW1wdHlTdHlsZSApIHtcblx0XHRcdHJldHVybiBuYW1lO1xuXHRcdH1cblx0fVxufVxuXG4vLyBSZXR1cm4gYSBwcm9wZXJ0eSBtYXBwZWQgYWxvbmcgd2hhdCBqUXVlcnkuY3NzUHJvcHMgc3VnZ2VzdHMgb3IgdG9cbi8vIGEgdmVuZG9yIHByZWZpeGVkIHByb3BlcnR5LlxuZnVuY3Rpb24gZmluYWxQcm9wTmFtZSggbmFtZSApIHtcblx0dmFyIHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdO1xuXHRpZiAoICFyZXQgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LmNzc1Byb3BzWyBuYW1lIF0gPSB2ZW5kb3JQcm9wTmFtZSggbmFtZSApIHx8IG5hbWU7XG5cdH1cblx0cmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApIHtcblxuXHQvLyBBbnkgcmVsYXRpdmUgKCsvLSkgdmFsdWVzIGhhdmUgYWxyZWFkeSBiZWVuXG5cdC8vIG5vcm1hbGl6ZWQgYXQgdGhpcyBwb2ludFxuXHR2YXIgbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKTtcblx0cmV0dXJuIG1hdGNoZXMgP1xuXG5cdFx0Ly8gR3VhcmQgYWdhaW5zdCB1bmRlZmluZWQgXCJzdWJ0cmFjdFwiLCBlLmcuLCB3aGVuIHVzZWQgYXMgaW4gY3NzSG9va3Ncblx0XHRNYXRoLm1heCggMCwgbWF0Y2hlc1sgMiBdIC0gKCBzdWJ0cmFjdCB8fCAwICkgKSArICggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApIDpcblx0XHR2YWx1ZTtcbn1cblxuZnVuY3Rpb24gYm94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIGJveCwgaXNCb3JkZXJCb3gsIHN0eWxlcywgY29tcHV0ZWRWYWwgKSB7XG5cdHZhciBpID0gZGltZW5zaW9uID09PSBcIndpZHRoXCIgPyAxIDogMCxcblx0XHRleHRyYSA9IDAsXG5cdFx0ZGVsdGEgPSAwO1xuXG5cdC8vIEFkanVzdG1lbnQgbWF5IG5vdCBiZSBuZWNlc3Nhcnlcblx0aWYgKCBib3ggPT09ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSApIHtcblx0XHRyZXR1cm4gMDtcblx0fVxuXG5cdGZvciAoIDsgaSA8IDQ7IGkgKz
211670gMiApIHtcblxuXHRcdC8vIEJvdGggYm94IG1vZGVscyBleGNsdWRlIG1hcmdpblxuXHRcdGlmICggYm94ID09PSBcIm1hcmdpblwiICkge1xuXHRcdFx0ZGVsdGEgKz0galF1ZXJ5LmNzcyggZWxlbSwgYm94ICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBjb250ZW50LWJveCwgd2UncmUgc2Vla2luZyBcInBhZGRpbmdcIiBvciBcImJvcmRlclwiIG9yIFwibWFyZ2luXCJcblx0XHRpZiAoICFpc0JvcmRlckJveCApIHtcblxuXHRcdFx0Ly8gQWRkIHBhZGRpbmdcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBGb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiLCBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGJveCAhPT0gXCJwYWRkaW5nXCIgKSB7XG5cdFx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cblx0XHRcdC8vIEJ1dCBzdGlsbCBrZWVwIHRyYWNrIG9mIGl0IG90aGVyd2lzZVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZXh0cmEgKz0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdC8vIElmIHdlIGdldCBoZXJlIHdpdGggYSBib3JkZXItYm94IChjb250ZW50ICsgcGFkZGluZyArIGJvcmRlciksIHdlJ3JlIHNlZWtpbmcgXCJjb250ZW50XCIgb3Jcblx0XHQvLyBcInBhZGRpbmdcIiBvciBcIm1hcmdpblwiXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiLCBzdWJ0cmFjdCBwYWRkaW5nXG5cdFx0XHRpZiAoIGJveCA9PT0gXCJjb250ZW50XCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGb3IgXCJjb250ZW50XCIgb3IgXCJwYWRkaW5nXCIsIHN1YnRyYWN0IGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwibWFyZ2luXCIgKSB7XG5cdFx0XHRcdGRlbHRhIC09IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQWNjb3VudCBmb3IgcG9zaXRpdmUgY29udGVudC1ib3ggc2Nyb2xsIGd1dHRlciB3aGVuIHJlcXVlc3RlZCBieSBwcm92aWRpbmcgY29tcHV0ZWRWYWxcblx0aWYgKCAhaXNCb3JkZXJCb3ggJiYgY29tcHV0ZWRWYWwgPj0gMCApIHtcblxuXHRcdC8vIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBpcyBhIHJvdW5kZWQgc3VtIG9mIGNvbnRlbnQsIHBhZGRpbmcsIHNjcm9sbCBndXR0ZXIsIGFuZCBib3JkZXJcblx0XHQvLyBBc3N1bWluZyBpbnRlZ2VyIHNjcm9sbCBndXR0ZXIsIHN1YnRyYWN0IHRoZSByZXN0IGFuZCByb3VuZCBkb3duXG5cdFx0ZGVsdGEgKz0gTWF0aC5tYXgoIDAsIE1hdGguY2VpbChcblx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRjb21wdXRlZFZhbCAtXG5cdFx0XHRkZWx0YSAtXG5cdFx0XHRleHRyYSAtXG5cdFx0XHQwLjVcblx0XHQpICk7XG5cdH1cblxuXHRyZXR1cm4gZGVsdGE7XG59XG5cbmZ1bmN0aW9uIGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBjb21wdXRlZCBzdHlsZVxuXHR2YXIgc3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBkaW1lbnNpb24sIHN0eWxlcyApLFxuXHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gaXNCb3JkZXJCb3g7XG5cblx0Ly8gU3VwcG9ydDogRmlyZWZveCA8PTU0XG5cdC8vIFJldHVybiBhIGNvbmZvdW5kaW5nIG5vbi1waXhlbCB2YWx1ZSBvciBmZWlnbiBpZ25vcmFuY2UsIGFzIGFwcHJvcHJpYXRlLlxuXHRpZiAoIHJudW1ub25weC50ZXN0KCB2YWwgKSApIHtcblx0XHRpZiAoICFleHRyYSApIHtcblx0XHRcdHJldHVybiB2YWw7XG5cdFx0fVxuXHRcdHZhbCA9IFwiYXV0b1wiO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHN0eWxlIGluIGNhc2UgYSBicm93c2VyIHdoaWNoIHJldHVybnMgdW5yZWxpYWJsZSB2YWx1ZXNcblx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHR2YWx1ZUlzQm9yZGVyQm94ID0gdmFsdWVJc0JvcmRlckJveCAmJlxuXHRcdCggc3VwcG9ydC5ib3hTaXppbmdSZWxpYWJsZSgpIHx8IHZhbCA9PT0gZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gKTtcblxuXHQvLyBGYWxsIGJhY2sgdG8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHdoZW4gdmFsdWUgaXMgXCJhdXRvXCJcblx0Ly8gVGhpcyBoYXBwZW5zIGZvciBpbmxpbmUgZWxlbWVudHMgd2l0aCBubyBleHBsaWNpdCBzZXR0aW5nIChnaC0zNTcxKVxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4xIC0gNC4zIG9ubHlcblx0Ly8gQWxzbyB1c2Ugb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IGZvciBtaXNyZXBvcnRlZCBpbmxpbmUgZGltZW5zaW9ucyAoZ2gtMzYwMilcblx0aWYgKCB2YWwgPT09IFwiYXV0b1wiIHx8XG5cdFx0IXBhcnNlRmxvYXQoIHZhbCApICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiLCBmYWxzZSwgc3R5bGVzICkgPT09IFwiaW5saW5lXCIgKSB7XG5cblx0XHR2YWwgPSBlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF07XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgcHJvdmlkZSBib3JkZXItYm94IHZhbHVlc1xuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlO1xuXHR9XG5cblx0Ly8gTm9ybWFsaXplIFwiXCIgYW5kIGF1dG9cblx0dmFsID0gcGFyc2VGbG9hdCggdmFsICkgfHwgMDtcblxuXHQvLyBBZGp1c3QgZm9yIHRoZSBlbGVtZW50J3MgYm94IG1vZGVsXG5cdHJldHVybiAoIHZhbCArXG5cdFx0Ym94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0ZWxlbSxcblx0XHRcdGRpbWVuc2lvbixcblx0XHRcdGV4dHJhIHx8ICggaXNCb3JkZXJCb3ggPyBcImJvcmRlclwiIDogXCJjb250ZW50XCIgKSxcblx0XHRcdHZhbHVlSXNCb3JkZXJCb3gsXG5cdFx0XHRzdHlsZXMsXG5cblx0XHRcdC8vIFByb3ZpZGUgdGhlIGN1cnJlbnQgY29tcHV0ZWQgc2l6ZSB0byByZXF1
21167ZXN0IHNjcm9sbCBndXR0ZXIgY2FsY3VsYXRpb24gKGdoLTM1ODkpXG5cdFx0XHR2YWxcblx0XHQpXG5cdCkgKyBcInB4XCI7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKSxcblx0XHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIHF1ZXJ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0cyBob29rIGZvciB0aGUgcHJlZml4ZWQgdmVyc2lvbiwgdGhlbiB1bnByZWZpeGVkIHZlcnNpb25cblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIENoZWNrIGlmIHdlJ3JlIHNldHRpbmcgYSB2YWx1ZVxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRcdC8vIENvbnZlcnQgXCIrPVwiIG9yIFwiLT1cIiB0byByZWxhdGl2ZSBudW1iZXJzICgjNzM0NSlcblx0XHRcdGlmICggdHlwZSA9PT0gXCJzdHJpbmdcIiAmJiAoIHJldCA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmIHJldFsgMSBdICkge1xuXHRcdFx0XHR2YWx1ZSA9IGFkanVzdENTUyggZWxlbSwgbmFtZSwgcmV0ICk7XG5cblx0XHRcdFx0Ly8gRml4ZXMgYnVnICM5MjM3XG5cdFx0XHRcdHR5cGUgPSBcIm51bWJlclwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWtlIHN1cmUgdGhhdCBudWxsIGFuZCBOYU4gdmFsdWVzIGFyZW4ndCBzZXQgKCM3MTE2KVxuXHRcdFx0aWYgKCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlICE9PSB2YWx1ZSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIG51bWJlciB3YXMgcGFzc2VkIGluLCBhZGQgdGhlIHVuaXQgKGV4Y2VwdCBmb3IgY2VydGFpbiBDU1MgcHJvcGVydGllcylcblx0XHRcdGlmICggdHlwZSA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsdWUgKz0gcmV0ICYmIHJldFsgMyBdIHx8ICggalF1ZXJ5LmNzc051bWJlclsgb3JpZ05hbWUgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gYmFja2dyb3VuZC0qIHByb3BzIGFmZmVjdCBvcmlnaW5hbCBjbG9uZSdzIHZhbHVlc1xuXHRcdFx0aWYgKCAhc3VwcG9ydC5jbGVhckNsb25lU3R5bGUgJiYgdmFsdWUgPT09IFwiXCIgJiYgbmFtZS5pbmRleE9mKCBcImJhY2tncm91bmRcIiApID09PSAwICkge1xuXHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gXCJpbmhlcml0XCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQsIHVzZSB0aGF0IHZhbHVlLCBvdGhlcndpc2UganVzdCBzZXQgdGhlIHNwZWNpZmllZCB2YWx1ZVxuXHRcdFx0aWYgKCAhaG9va3MgfHwgISggXCJzZXRcIiBpbiBob29rcyApIHx8XG5cdFx0XHRcdCggdmFsdWUgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBleHRyYSApICkgIT09IHVuZGVmaW5lZCApIHtcblxuXHRcdFx0XHRpZiAoIGlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdFx0XHRzdHlsZS5zZXRQcm9wZXJ0eSggbmFtZSwgdmFsdWUgKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdHlsZVsgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybi
21167BzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGNhbWVsQ2FzZSggbmFtZSApLFxuXHRcdFx0aXNDdXN0b21Qcm9wID0gcmN1c3RvbVByb3AudGVzdCggbmFtZSApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgd2UncmUgd29ya2luZyB3aXRoIHRoZSByaWdodCBuYW1lLiBXZSBkb24ndFxuXHRcdC8vIHdhbnQgdG8gbW9kaWZ5IHRoZSB2YWx1ZSBpZiBpdCBpcyBhIENTUyBjdXN0b20gcHJvcGVydHlcblx0XHQvLyBzaW5jZSB0aGV5IGFyZSB1c2VyLWRlZmluZWQuXG5cdFx0aWYgKCAhaXNDdXN0b21Qcm9wICkge1xuXHRcdFx0bmFtZSA9IGZpbmFsUHJvcE5hbWUoIG9yaWdOYW1lICk7XG5cdFx0fVxuXG5cdFx0Ly8gVHJ5IHByZWZpeGVkIG5hbWUgZm9sbG93ZWQgYnkgdGhlIHVucHJlZml4ZWQgbmFtZVxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWwgPSBob29rcy5nZXQoIGVsZW0sIHRydWUsIGV4dHJhICk7XG5cdFx0fVxuXG5cdFx0Ly8gT3RoZXJ3aXNlLCBpZiBhIHdheSB0byBnZXQgdGhlIGNvbXB1dGVkIHZhbHVlIGV4aXN0cywgdXNlIHRoYXRcblx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dmFsID0gY3VyQ1NTKCBlbGVtLCBuYW1lLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IFwibm9ybWFsXCIgdG8gY29tcHV0ZWQgdmFsdWVcblx0XHRpZiAoIHZhbCA9PT0gXCJub3JtYWxcIiAmJiBuYW1lIGluIGNzc05vcm1hbFRyYW5zZm9ybSApIHtcblx0XHRcdHZhbCA9IGNzc05vcm1hbFRyYW5zZm9ybVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIE1ha2UgbnVtZXJpYyBpZiBmb3JjZWQgb3IgYSBxdWFsaWZpZXIgd2FzIHByb3ZpZGVkIGFuZCB2YWwgbG9va3MgbnVtZXJpY1xuXHRcdGlmICggZXh0cmEgPT09IFwiXCIgfHwgZXh0cmEgKSB7XG5cdFx0XHRudW0gPSBwYXJzZUZsb2F0KCB2YWwgKTtcblx0XHRcdHJldHVybiBleHRyYSA9PT0gdHJ1ZSB8fCBpc0Zpbml0ZSggbnVtICkgPyBudW0gfHwgMCA6IHZhbDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiaGVpZ2h0XCIsIFwid2lkdGhcIiBdLCBmdW5jdGlvbiggaSwgZGltZW5zaW9uICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIGRpbWVuc2lvbiBdID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkLCBleHRyYSApIHtcblx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0Ly8gQ2VydGFpbiBlbGVtZW50cyBjYW4gaGF2ZSBkaW1lbnNpb24gaW5mbyBpZiB3ZSBpbnZpc2libHkgc2hvdyB0aGVtXG5cdFx0XHRcdC8vIGJ1dCBpdCBtdXN0IGhhdmUgYSBjdXJyZW50IGRpc3BsYXkgc3R5bGUgdGhhdCB3b3VsZCBiZW5lZml0XG5cdFx0XHRcdHJldHVybiByZGlzcGxheXN3YXAudGVzdCggalF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKSApICYmXG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCtcblx0XHRcdFx0XHQvLyBUYWJsZSBjb2x1bW5zIGluIFNhZmFyaSBoYXZlIG5vbi16ZXJvIG9mZnNldFdpZHRoICYgemVyb1xuXHRcdFx0XHRcdC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIHVubGVzcyBkaXNwbGF5IGlzIGNoYW5nZWQuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0XHRcdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYSBkaXNjb25uZWN0ZWQgbm9kZVxuXHRcdFx0XHRcdC8vIGluIElFIHRocm93cyBhbiBlcnJvci5cblx0XHRcdFx0XHQoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoIHx8ICFlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoICkgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICk7XG5cdFx0XHRcdFx0XHR9ICkgOlxuXHRcdFx0XHRcdFx0Z2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSB7XG5cdFx0XHR2YXIgbWF0Y2hlcyxcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICksXG5cdFx0XHRcdGlzQm9yZGVyQm94ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBib3hNb2RlbEFkanVzdG1lbnQoXG5cdFx0XHRcdFx0ZWxlbSxcblx0XHRcdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0aXNCb3JkZXJCb3gsXG5cdFx0XHRcdFx0c3R5bGVzXG5cdFx0XHRcdCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHVucmVsaWFibGUgYm9yZGVyLWJveCBkaW1lbnNpb25zIGJ5IGNvbXBhcmluZyBvZmZzZXQqIHRvIGNvbXB1dGVkIGFuZFxuXHRcdFx0Ly8gZmFraW5nIGEgY29udGVudC1ib3ggdG8gZ2V0IGJvcmRlciBhbmQgcGFkZGluZyAoZ2gtMzY5OSlcblx0XHRcdGlmICggaXNCb3JkZXJCb3ggJiYgc3VwcG9ydC5zY3JvbGxib3hTaXplKCkgPT09IHN0eWxlcy5wb3NpdGlvbiApIHtcblx0XHRcdFx0c3VidHJhY3QgLT0gTWF0aC5jZWlsKFxuXHRcdFx0XHRcdGVsZW1bIFwib2Zmc2V0XCIgKyBkaW1lbnNpb25bIDAgXS50b1VwcGVyQ2FzZSgpICsgZGltZW5zaW9uLnNsaWNlKCAxICkgXSAtXG5cdFx0XHRcdFx0cGFyc2VGbG9hdCggc3R5bGVzWyBkaW1lbnNpb24gXSApIC1cblx0XHRcdFx0XHRib3hNb2RlbEFkanVzdG1lbnQoIGVsZW0sIGRpbWVuc2lvbiwgXCJib3JkZXJcIiwgZmFsc2UsIHN0eWxlcyApIC1cblx0XHRcdFx0XHQwLjVcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBkaW1lbnNpb24gXSA9IHZhbHVlO1xuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5jc3MoIGVsZW0sIGRpbWVuc2lvbiApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gc2V0UG9zaXRpdmVOdW1iZXIoIGVsZW0sIHZhbHVlLCBzdWJ0cmFjdCApO1xuXHRcdH1cblx0fTtcbn0gKTtcblxualF1ZXJ5LmNzc0hvb2tzLm1hcmdpbkxlZnQgPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucmVsaWFibGVNYXJnaW5MZWZ0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiAoIHBhcnNlRmxvYXQoIGN1ckNTUyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIgKSApIHx8XG5cdFx0XHRcdGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtXG5cdFx0XHRcdFx0c3dhcCggZWxlbSwgeyBtYXJnaW5MZWZ0OiAwIH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDtcblx0XHRcdFx0XHR9IClcblx0XHRcdFx0KSArIFwicHhcIjtcblx0XHR9XG5cdH1cbik7XG5cbi8vIFRoZXNlIGhvb2tzIGFyZSB1c2VkIGJ5IGFuaW1hdGUgdG8gZXhwYW5kIHByb3BlcnRpZXNcbmpRdWVyeS5lYWNoKCB7XG5cdG1hcmdpbjogXCJcIixcblx0cGFkZGluZzogXCJcIixcblx0Ym9yZGVyOiBcIldpZHRoXCJcbn0sIGZ1bmN0aW9uKCBwcmVmaXgsIHN1ZmZpeCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcmVmaXggKyBzdWZmaXggXSA9IHtcblx0XHRleHBhbmQ6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBpID0gMCxcblx0XHRcdFx0ZXhwYW5kZWQgPSB7fSxcblxuXHRcdFx0XHQvLyBBc3N1bWVzIGEgc2luZ2xlIG51bWJlciBpZiBub3QgYSBzdHJpbmdcblx0XHRcdFx0cGFydHMgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZS
211675zcGxpdCggXCIgXCIgKSA6IFsgdmFsdWUgXTtcblxuXHRcdFx0Zm9yICggOyBpIDwgNDsgaSsrICkge1xuXHRcdFx0XHRleHBhbmRlZFsgcHJlZml4ICsgY3NzRXhwYW5kWyBpIF0gKyBzdWZmaXggXSA9XG5cdFx0XHRcdFx0cGFydHNbIGkgXSB8fCBwYXJ0c1sgaSAtIDIgXSB8fCBwYXJ0c1sgMCBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZXhwYW5kZWQ7XG5cdFx0fVxuXHR9O1xuXG5cdGlmICggcHJlZml4ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0uc2V0ID0gc2V0UG9zaXRpdmVOdW1iZXI7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRjc3M6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgc3R5bGVzLCBsZW4sXG5cdFx0XHRcdG1hcCA9IHt9LFxuXHRcdFx0XHRpID0gMDtcblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCBuYW1lICkgKSB7XG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApO1xuXHRcdFx0XHRsZW4gPSBuYW1lLmxlbmd0aDtcblxuXHRcdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0XHRtYXBbIG5hbWVbIGkgXSBdID0galF1ZXJ5LmNzcyggZWxlbSwgbmFtZVsgaSBdLCBmYWxzZSwgc3R5bGVzICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gbWFwO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdmFsdWUgIT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgbmFtZSwgdmFsdWUgKSA6XG5cdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIG5hbWUgKTtcblx0XHR9LCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fVxufSApO1xuXG5cbmZ1bmN0aW9uIFR3ZWVuKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZyApIHtcblx0cmV0dXJuIG5ldyBUd2Vlbi5wcm90b3R5cGUuaW5pdCggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKTtcbn1cbmpRdWVyeS5Ud2VlbiA9IFR3ZWVuO1xuXG5Ud2Vlbi5wcm90b3R5cGUgPSB7XG5cdGNvbnN0cnVjdG9yOiBUd2Vlbixcblx0aW5pdDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nLCB1bml0ICkge1xuXHRcdHRoaXMuZWxlbSA9IGVsZW07XG5cdFx0dGhpcy5wcm9wID0gcHJvcDtcblx0XHR0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0O1xuXHRcdHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7XG5cdFx0dGhpcy5zdGFydCA9IHRoaXMubm93ID0gdGhpcy5jdXIoKTtcblx0XHR0aGlzLmVuZCA9IGVuZDtcblx0XHR0aGlzLnVuaXQgPSB1bml0IHx8ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdID8gXCJcIiA6IFwicHhcIiApO1xuXHR9LFxuXHRjdXI6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRyZXR1cm4gaG9va3MgJiYgaG9va3MuZ2V0ID9cblx0XHRcdGhvb2tzLmdldCggdGhpcyApIDpcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5nZXQoIHRoaXMgKTtcblx0fSxcblx0cnVuOiBmdW5jdGlvbiggcGVyY2VudCApIHtcblx0XHR2YXIgZWFzZWQsXG5cdFx0XHRob29rcyA9IFR3ZWVuLnByb3BIb29rc1sgdGhpcy5wcm9wIF07XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5kdXJhdGlvbiApIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBqUXVlcnkuZWFzaW5nWyB0aGlzLmVhc2luZyBdKFxuXHRcdFx0XHRwZXJjZW50LCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKiBwZXJjZW50LCAwLCAxLCB0aGlzLm9wdGlvbnMuZHVyYXRpb25cblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucG9zID0gZWFzZWQgPSBwZXJjZW50O1xuXHRcdH1cblx0XHR0aGlzLm5vdyA9ICggdGhpcy5lbmQgLSB0aGlzLnN0YXJ0ICkgKiBlYXNlZCArIHRoaXMuc3RhcnQ7XG5cblx0XHRpZiAoIHRoaXMub3B0aW9ucy5zdGVwICkge1xuXHRcdFx0dGhpcy5vcHRpb25zLnN0ZXAuY2FsbCggdGhpcy5lbGVtLCB0aGlzLm5vdywgdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgaG9va3Muc2V0ICkge1xuXHRcdFx0aG9va3Muc2V0KCB0aGlzICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdFR3ZWVuLnByb3BIb29rcy5fZGVmYXVsdC5zZXQoIHRoaXMgKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn07XG5cblR3ZWVuLnByb3RvdHlwZS5pbml0LnByb3RvdHlwZSA9IFR3ZWVuLnByb3RvdHlwZTtcblxuVHdlZW4ucHJvcEhvb2tzID0ge1xuXHRfZGVmYXVsdDoge1xuXHRcdGdldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdFx0dmFyIHJlc3VsdDtcblxuXHRcdFx0Ly8gVXNlIGEgcHJvcGVydHkgb24gdGhlIGVsZW1lbnQgZGlyZWN0bHkgd2hlbiBpdCBpcyBub3QgYSBET00gZWxlbWVudCxcblx0XHRcdC8vIG9yIHdoZW4gdGhlcmUgaXMgbm8gbWF0Y2hpbmcgc3R5bGUgcHJvcGVydHkgdGhhdCBleGlzdHMuXG5cdFx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgIT09IDEgfHxcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdICE9IG51bGwgJiYgdHdlZW4uZWxlbS5zdHlsZVsgdHdlZW4ucHJvcCBdID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiB0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF07XG5cdFx0XHR9XG5cblx0XHRcdC8vIFBhc3NpbmcgYW4gZW1wdHkgc3RyaW5nIGFzIGEgM3JkIHBhcmFtZXRlciB0byAuY3NzIHdpbGwgYXV0b21hdGljYWxseVxuXHRcdFx0Ly8gYXR0ZW1wdCBhIHBhcnNlRmxvYXQgYW5kIGZhbGxiYWNrIHRvIGEgc3RyaW5nIGlmIHRoZSBwYXJzZSBmYWlscy5cblx0XHRcdC8vIFNpbXBsZSB2YWx1ZXMgc3VjaCBhcyBcIjEwcHhcIiBhcmUgcGFyc2VkIHRvIEZsb2F0O1xuXHRcdFx0Ly8gY29tcGxleCB2YWx1ZXMgc3VjaCBhcyBcInJvdGF0ZSgxcmFkKVwiIGFyZSByZXR1cm5lZCBhcy1pcy5cblx0XHRcdHJlc3VsdCA9IGpRdWVyeS5jc3MoIHR3ZWVuLmVsZW0sIHR3ZWVuLnByb3AsIFwiXCIgKTtcblxuXHRcdFx0Ly8gRW1wdHkgc3RyaW5ncywgbnVsbCwgdW5kZWZpbmVkIGFuZCBcImF1dG9cIiBhcmUgY29udmVydGVkIHRvIDAuXG5cdFx0XHRyZXR1cm4gIXJlc3VsdCB8fCByZXN1bHQgPT09IFwiYXV0b1wiID8gMCA6IHJlc3VsdDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXG5cdFx0XHQvLyBVc2Ugc3RlcCBob29rIGZvciBiYWNrIGNvbXBhdC5cblx0XHRcdC8vIFVzZSBjc3NIb29rIGlmIGl0cyB0aGVyZS5cblx0XHRcdC8vIFVzZSAuc3R5bGUgaWYgYXZhaWxhYmxlIGFuZCB1c2UgcGxhaW4gcHJvcGVydGllcyB3aGVyZSBhdmFpbGFibGUuXG5cdFx0XHRpZiAoIGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS5meC5zdGVwWyB0d2Vlbi5wcm9wIF0oIHR3ZWVuICk7XG5cdFx0XHR9IGVsc2UgaWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggdHdlZW4uZWxlbS5zdHlsZVsgalF1ZXJ5LmNzc1Byb3BzWyB0d2Vlbi5wcm9wIF0gXSAhPSBudWxsIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LmNzc0hvb2tzWyB0d2Vlbi5wcm9wIF0gKSApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCB0d2Vlbi5ub3cgKyB0d2Vlbi51bml0ICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG4vLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuLy8gUGFuaWMgYmFzZWQgYXBwcm9hY2ggdG8gc2V0dGluZyB0aGluZ3Mgb24gZGlzY29ubmVjdGVkIG5vZGVzXG5Ud2Vlbi5wcm9wSG9va3Muc2Nyb2xsVG9wID0gVHdlZW4ucHJv
21167cEhvb2tzLnNjcm9sbExlZnQgPSB7XG5cdHNldDogZnVuY3Rpb24oIHR3ZWVuICkge1xuXHRcdGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSAmJiB0d2Vlbi5lbGVtLnBhcmVudE5vZGUgKSB7XG5cdFx0XHR0d2Vlbi5lbGVtWyB0d2Vlbi5wcm9wIF0gPSB0d2Vlbi5ub3c7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZWFzaW5nID0ge1xuXHRsaW5lYXI6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiBwO1xuXHR9LFxuXHRzd2luZzogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIDAuNSAtIE1hdGguY29zKCBwICogTWF0aC5QSSApIC8gMjtcblx0fSxcblx0X2RlZmF1bHQ6IFwic3dpbmdcIlxufTtcblxualF1ZXJ5LmZ4ID0gVHdlZW4ucHJvdG90eXBlLmluaXQ7XG5cbi8vIEJhY2sgY29tcGF0IDwxLjggZXh0ZW5zaW9uIHBvaW50XG5qUXVlcnkuZnguc3RlcCA9IHt9O1xuXG5cblxuXG52YXJcblx0ZnhOb3csIGluUHJvZ3Jlc3MsXG5cdHJmeHR5cGVzID0gL14oPzp0b2dnbGV8c2hvd3xoaWRlKSQvLFxuXHRycnVuID0gL3F1ZXVlSG9va3MkLztcblxuZnVuY3Rpb24gc2NoZWR1bGUoKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRpZiAoIGRvY3VtZW50LmhpZGRlbiA9PT0gZmFsc2UgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSApIHtcblx0XHRcdHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIHNjaGVkdWxlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBzY2hlZHVsZSwgalF1ZXJ5LmZ4LmludGVydmFsICk7XG5cdFx0fVxuXG5cdFx0alF1ZXJ5LmZ4LnRpY2soKTtcblx0fVxufVxuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0gRGF0ZS5ub3coKSApO1xufVxuXG4vLyBHZW5lcmF0ZSBwYXJhbWV0ZXJzIHRvIGNyZWF0ZSBhIHN0YW5kYXJkIGFuaW1hdGlvblxuZnVuY3Rpb24gZ2VuRngoIHR5cGUsIGluY2x1ZGVXaWR0aCApIHtcblx0dmFyIHdoaWNoLFxuXHRcdGkgPSAwLFxuXHRcdGF0dHJzID0geyBoZWlnaHQ6IHR5cGUgfTtcblxuXHQvLyBJZiB3ZSBpbmNsdWRlIHdpZHRoLCBzdGVwIHZhbHVlIGlzIDEgdG8gZG8gYWxsIGNzc0V4cGFuZCB2YWx1ZXMsXG5cdC8vIG90aGVyd2lzZSBzdGVwIHZhbHVlIGlzIDIgdG8gc2tpcCBvdmVyIExlZnQgYW5kIFJpZ2h0XG5cdGluY2x1ZGVXaWR0aCA9IGluY2x1ZGVXaWR0aCA/IDEgOiAwO1xuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0dmFyIHByb3AsIHZhbHVlLCB0b2dnbGUsIGhvb2tzLCBvbGRmaXJlLCBwcm9wVHdlZW4sIHJlc3RvcmVEaXNwbGF5LCBkaXNwbGF5LFxuXHRcdGlzQm94ID0gXCJ3aWR0aFwiIGluIHByb3BzIHx8IFwiaGVpZ2h0XCIgaW4gcHJvcHMsXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuV2l0aGluVHJlZSggZWxlbSApLFxuXHRcdGRhdGFTaG93ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cblx0Ly8gUXVldWUtc2tpcHBpbmcgYW5pbWF0aW9ucyBoaWphY2sgdGhlIGZ4IGhvb2tzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIERldGVjdCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRmb3IgKCBwcm9wIGluIHByb3BzICkge1xuXHRcdHZhbHVlID0gcHJvcHNbIHByb3AgXTtcblx0XHRpZiAoIHJmeHR5cGVzLnRlc3QoIHZhbHVlICkgKSB7XG5cdFx0XHRkZWxldGUgcHJvcHNbIHByb3AgXTtcblx0XHRcdHRvZ2dsZSA9IHRvZ2dsZSB8fCB2YWx1ZSA9PT0gXCJ0b2dnbGVcIjtcblx0XHRcdGlmICggdmFsdWUgPT09ICggaGlkZGVuID8gXCJoaWRlXCIgOiBcInNob3dcIiApICkge1xuXG5cdFx0XHRcdC8vIFByZXRlbmQgdG8gYmUgaGlkZGVuIGlmIHRoaXMgaXMgYSBcInNob3dcIiBhbmRcblx0XHRcdFx0Ly8gdGhlcmUgaXMgc3RpbGwgZGF0YSBmcm9tIGEgc3RvcHBlZCBzaG93L2hpZGVcblx0XHRcdFx0aWYgKCB2YWx1ZSA9PT0gXCJzaG93XCIgJiYgZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdGhpZGRlbiA9IHRydWU7XG5cblx0XHRcdFx0Ly8gSWdub3JlIGFsbCBvdGhlciBuby1vcCBzaG93L2hpZGUgZGF0YVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRvcmlnWyBwcm9wIF0gPSBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdIHx8IGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIEJhaWwgb3V0IGlmIHRoaXMgaXMgYSBuby1vcCBsaWtlIC5oaWRlKCkuaGlkZSgpXG5cdHByb3BUd2VlbiA9ICFqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcHMgKTtcblx0aWYgKCAhcHJvcFR3ZWVuICYmIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBvcmlnICkgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gUmVzdHJpY3QgXCJvdmVyZmxvd1wiIGFuZCBcImRpc3BsYXlcIiBzdHlsZXMgZHVyaW5nIGJveCBhbmltYXRpb25zXG5cdGlmICggaXNCb3ggJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFIGRvZXMgbm90IGluZmVyIHRoZSBzaG9ydGhhbmRcblx0XHQvLyBmcm9tIGlkZW50aWNhbGx5LXZhbHVlZCBvdmVyZmxvd1ggYW5kIG92ZXJmbG93WSBhbmQgRWRnZSBqdXN0IG1pcnJvcnNcblx0XHQvLyB0aGUgb3ZlcmZsb3dYIHZhbHVlIHRoZXJlLlxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gSWRlbnRpZnkgYSBkaXNwbGF5IHR5cGUsIHByZWZlcnJpbmcgb2xkIHNob3cvaGlkZSBkYXRhIG92ZXIgdGhlIENTUyBjYXNjYWRlXG5cdFx0cmVzdG9yZURpc3BsYXkgPSBkYXRhU2hvdyAmJiBkYXRhU2hvdy5kaXNwbGF5O1xuXHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdH1cblx0XHRkaXNwbGF5ID0galF1ZXJ5LmNzcyggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSApIHtcblx0XHRcdFx0ZGlzcGxheSA9IHJlc3RvcmVEaXNwbGF5O1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBHZXQgbm9uZW1wdHkgdmFsdWUocykgYnkgdGVtcG9yYXJpbHkgZm9yY2luZyB2aXNpYmlsaXR5XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSwgdHJ1ZSApO1xuXHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheSB8fCByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0XHRcdHNob3dIaWRlKCBbIGVsZW0gXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFuaW1hdGUgaW5saW5lIGVsZW1lbnRzIGFzIGlubGluZS1ibG9ja1xuXHRcdGlmICggZGlzcGxheSA9PT0gXCJpbmxpbmVcIiB8fCBkaXNwbGF5ID09PSBcImlubGluZS1ibG9ja1wiICYmIHJlc3RvcmVEaXNwbGF5ICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblxuXHRcdFx0XHQvLyBSZXN0b3JlIHRoZSBvcmlnaW5hbCBkaXNwbGF5IHZhbHVlIGF0IHRoZSBlbmQgb2YgcHVyZSBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRcdFx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRcdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0aWYgKCByZXN0b3JlRGlzcGxheSA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0ZGlzcGxheSA9IHN0eWxlLmRpc3BsYXk7XG5cdFx0XHRcdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID8gXCJcIiA6IGRpc3BsYXk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gSW1wbGVtZW50IHNob3cvaGlkZSBhbmltYXRpb25zXG5cdHByb3BUd2VlbiA9IGZ
21167hbHNlO1xuXHRmb3IgKCBwcm9wIGluIG9yaWcgKSB7XG5cblx0XHQvLyBHZW5lcmFsIHNob3cvaGlkZSBzZXR1cCBmb3IgdGhpcyBlbGVtZW50IGFuaW1hdGlvblxuXHRcdGlmICggIXByb3BUd2VlbiApIHtcblx0XHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRcdGlmICggXCJoaWRkZW5cIiBpbiBkYXRhU2hvdyApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSBkYXRhU2hvdy5oaWRkZW47XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGFTaG93ID0gZGF0YVByaXYuYWNjZXNzKCBlbGVtLCBcImZ4c2hvd1wiLCB7IGRpc3BsYXk6IHJlc3RvcmVEaXNwbGF5IH0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RvcmUgaGlkZGVuL3Zpc2libGUgZm9yIHRvZ2dsZSBzbyBgLnN0b3AoKS50b2dnbGUoKWAgXCJyZXZlcnNlc1wiXG5cdFx0XHRpZiAoIHRvZ2dsZSApIHtcblx0XHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2hvdyBlbGVtZW50cyBiZWZvcmUgYW5pbWF0aW5nIHRoZW1cblx0XHRcdGlmICggaGlkZGVuICkge1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdH1cblxuXHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG5cblx0XHRcdFx0Ly8gVGhlIGZpbmFsIHN0ZXAgb2YgYSBcImhpZGVcIiBhbmltYXRpb24gaXMgYWN0dWFsbHkgaGlkaW5nIHRoZSBlbGVtZW50XG5cdFx0XHRcdGlmICggIWhpZGRlbiApIHtcblx0XHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgb3JpZ1sgcHJvcCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHQvLyBQZXItcHJvcGVydHkgc2V0dXBcblx0XHRwcm9wVHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblx0XHRpZiAoICEoIHByb3AgaW4gZGF0YVNob3cgKSApIHtcblx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0cHJvcFR3ZWVuLmVuZCA9IHByb3BUd2Vlbi5zdGFydDtcblx0XHRcdFx0cHJvcFR3ZWVuLnN0YXJ0ID0gMDtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gcHJvcEZpbHRlciggcHJvcHMsIHNwZWNpYWxFYXNpbmcgKSB7XG5cdHZhciBpbmRleCwgbmFtZSwgZWFzaW5nLCB2YWx1ZSwgaG9va3M7XG5cblx0Ly8gY2FtZWxDYXNlLCBzcGVjaWFsRWFzaW5nIGFuZCBleHBhbmQgY3NzSG9vayBwYXNzXG5cdGZvciAoIGluZGV4IGluIHByb3BzICkge1xuXHRcdG5hbWUgPSBjYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0ZWFzaW5nID0gdmFsdWVbIDEgXTtcblx0XHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF0gPSB2YWx1ZVsgMCBdO1xuXHRcdH1cblxuXHRcdGlmICggaW5kZXggIT09IG5hbWUgKSB7XG5cdFx0XHRwcm9wc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRkZWxldGUgcHJvcHNbIGluZGV4IF07XG5cdFx0fVxuXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXTtcblx0XHRpZiAoIGhvb2tzICYmIFwiZXhwYW5kXCIgaW4gaG9va3MgKSB7XG5cdFx0XHR2YWx1ZSA9IGhvb2tzLmV4cGFuZCggdmFsdWUgKTtcblx0XHRcdGRlbGV0ZSBwcm9wc1sgbmFtZSBdO1xuXG5cdFx0XHQvLyBOb3QgcXVpdGUgJC5leHRlbmQsIHRoaXMgd29uJ3Qgb3ZlcndyaXRlIGV4aXN0aW5nIGtleXMuXG5cdFx0XHQvLyBSZXVzaW5nICdpbmRleCcgYmVjYXVzZSB3ZSBoYXZlIHRoZSBjb3JyZWN0IFwibmFtZVwiXG5cdFx0XHRmb3IgKCBpbmRleCBpbiB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhKCBpbmRleCBpbiBwcm9wcyApICkge1xuXHRcdFx0XHRcdHByb3BzWyBpbmRleCBdID0gdmFsdWVbIGluZGV4IF07XG5cdFx0XHRcdFx0c3BlY2lhbEVhc2luZ1sgaW5kZXggXSA9IGVhc2luZztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRzcGVjaWFsRWFzaW5nWyBuYW1lIF0gPSBlYXNpbmc7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIEFuaW1hdGlvbiggZWxlbSwgcHJvcGVydGllcywgb3B0aW9ucyApIHtcblx0dmFyIHJlc3VsdCxcblx0XHRzdG9wcGVkLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBBbmltYXRpb24ucHJlZmlsdGVycy5sZW5ndGgsXG5cdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBEb24ndCBtYXRjaCBlbGVtIGluIHRoZSA6YW5pbWF0ZWQgc2VsZWN0b3Jcblx0XHRcdGRlbGV0ZSB0aWNrLmVsZW07XG5cdFx0fSApLFxuXHRcdHRpY2sgPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdFx0dmFyIGN1cnJlbnRUaW1lID0gZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdFx0cmVtYWluaW5nID0gTWF0aC5tYXgoIDAsIGFuaW1hdGlvbi5zdGFydFRpbWUgKyBhbmltYXRpb24uZHVyYXRpb24gLSBjdXJyZW50VGltZSApLFxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zIG9ubHlcblx0XHRcdFx0Ly8gQXJjaGFpYyBjcmFzaCBidWcgd29uJ3QgYWxsb3cgdXMgdG8gdXNlIGAxIC0gKCAwLjUgfHwgMCApYCAoIzEyNDk3KVxuXHRcdFx0XHR0ZW1wID0gcmVtYWluaW5nIC8gYW5pbWF0aW9uLmR1cmF0aW9uIHx8IDAsXG5cdFx0XHRcdHBlcmNlbnQgPSAxIC0gdGVtcCxcblx0XHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0XHRsZW5ndGggPSBhbmltYXRpb24udHdlZW5zLmxlbmd0aDtcblxuXHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdC8vIElmIHRoZXJlJ3MgbW9yZSB0byBkbywgeWllbGRcblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiB0aGlzIHdhcyBhbiBlbXB0eSBhbmltYXRpb24sIHN5bnRoZXNpemUgYSBmaW5hbCBwcm9ncmVzcyBub3RpZmljYXRpb25cblx0XHRcdGlmICggIWxlbmd0aCApIHtcblx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO
211671xuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZXNvbHZlIHRoZSBhbmltYXRpb24gYW5kIHJlcG9ydCBpdHMgY29uY2x1c2lvblxuXHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9LFxuXHRcdGFuaW1hdGlvbiA9IGRlZmVycmVkLnByb21pc2UoIHtcblx0XHRcdGVsZW06IGVsZW0sXG5cdFx0XHRwcm9wczogalF1ZXJ5LmV4dGVuZCgge30sIHByb3BlcnRpZXMgKSxcblx0XHRcdG9wdHM6IGpRdWVyeS5leHRlbmQoIHRydWUsIHtcblx0XHRcdFx0c3BlY2lhbEVhc2luZzoge30sXG5cdFx0XHRcdGVhc2luZzogalF1ZXJ5LmVhc2luZy5fZGVmYXVsdFxuXHRcdFx0fSwgb3B0aW9ucyApLFxuXHRcdFx0b3JpZ2luYWxQcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLFxuXHRcdFx0b3JpZ2luYWxPcHRpb25zOiBvcHRpb25zLFxuXHRcdFx0c3RhcnRUaW1lOiBmeE5vdyB8fCBjcmVhdGVGeE5vdygpLFxuXHRcdFx0ZHVyYXRpb246IG9wdGlvbnMuZHVyYXRpb24sXG5cdFx0XHR0d2VlbnM6IFtdLFxuXHRcdFx0Y3JlYXRlVHdlZW46IGZ1bmN0aW9uKCBwcm9wLCBlbmQgKSB7XG5cdFx0XHRcdHZhciB0d2VlbiA9IGpRdWVyeS5Ud2VlbiggZWxlbSwgYW5pbWF0aW9uLm9wdHMsIHByb3AsIGVuZCxcblx0XHRcdFx0XHRcdGFuaW1hdGlvbi5vcHRzLnNwZWNpYWxFYXNpbmdbIHByb3AgXSB8fCBhbmltYXRpb24ub3B0cy5lYXNpbmcgKTtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVucy5wdXNoKCB0d2VlbiApO1xuXHRcdFx0XHRyZXR1cm4gdHdlZW47XG5cdFx0XHR9LFxuXHRcdFx0c3RvcDogZnVuY3Rpb24oIGdvdG9FbmQgKSB7XG5cdFx0XHRcdHZhciBpbmRleCA9IDAsXG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBhcmUgZ29pbmcgdG8gdGhlIGVuZCwgd2Ugd2FudCB0byBydW4gYWxsIHRoZSB0d2VlbnNcblx0XHRcdFx0XHQvLyBvdGhlcndpc2Ugd2Ugc2tpcCB0aGlzIHBhcnRcblx0XHRcdFx0XHRsZW5ndGggPSBnb3RvRW5kID8gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGggOiAwO1xuXHRcdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdFx0c3RvcHBlZCA9IHRydWU7XG5cdFx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRyZXN1bHQgPSBBbmltYXRpb24ucHJlZmlsdGVyc1sgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIGVsZW0sIHByb3BzLCBhbmltYXRpb24ub3B0cyApO1xuXHRcdGlmICggcmVzdWx0ICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCByZXN1bHQuc3RvcCApICkge1xuXHRcdFx0XHRqUXVlcnkuX3F1ZXVlSG9va3MoIGFuaW1hdGlvbi5lbGVtLCBhbmltYXRpb24ub3B0cy5xdWV1ZSApLnN0b3AgPVxuXHRcdFx0XHRcdHJlc3VsdC5zdG9wLmJpbmQoIHJlc3VsdCApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRqUXVlcnkubWFwKCBwcm9wcywgY3JlYXRlVHdlZW4sIGFuaW1hdGlvbiApO1xuXG5cdGlmICggaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdC8vIEF0dGFjaCBjYWxsYmFja3MgZnJvbSBvcHRpb25zXG5cdGFuaW1hdGlvblxuXHRcdC5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0cmV0dXJuIGFuaW1hdGlvbjtcbn1cblxualF1ZXJ5LkFuaW1hdGlvbiA9IGpRdWVyeS5leHRlbmQoIEFuaW1hdGlvbiwge1xuXG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBwcm9wcyApICkge1xuXHRcdFx0Y2FsbGJhY2sgPSBwcm9wcztcblx0XHRcdHByb3BzID0gWyBcIipcIiBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9wcyA9IHByb3BzLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0cHJvcCA9IHByb3BzWyBpbmRleCBdO1xuXHRcdFx0QW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gPSBBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXSB8fCBbXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9LFxuXG5cdHByZWZpbHRlcnM6IFsgZGVmYXVsdFByZWZpbHRlciBdLFxuXG5cdHByZWZpbHRlcjogZnVuY3Rpb24oIGNhbGxiYWNrLCBwcmVwZW5kICkge1xuXHRcdGlmICggcHJlcGVuZCApIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnVuc2hpZnQoIGNhbGxiYWNrICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdEFuaW1hdGlvbi5wcmVmaWx0ZXJzLnB1c2goIGNhbGxiYWNrICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbmpRdWVyeS5zcGVlZCA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBmbiApIHtcblx0dmFyIG9wdCA9IHNwZWVkICYmIHR5cGVvZiBzcGVlZCA9PT0gXCJvYmplY3RcIiA/IGpRdWVyeS5leHRlbmQoIHt9LCBzcGVlZCApIDoge1xuXHRcdGNvbXBsZXRlOiBmbiB8fCAhZm4gJiYgZWFzaW5nIHx8XG5cdFx0XHRpc0Z1bmN0aW9uKCBzcGVlZCApICYmIHNwZWVkLFxuXHRcdGR1cmF0aW9uOiBzcGVlZCxcblx0XHRlYXNpbmc6IGZuICYmIGVhc2luZyB8fCBlYXNpbmcgJiYgIWlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdC8vIEdvIHRvIHRoZSBlbmQgc3RhdGUgaWYgZnggYXJlIG9mZlxuXHRpZiAoIGpRdWVyeS5meC5vZmYgKSB7XG5cdFx0b3B0LmR1cmF0aW9uID0gMDtcblxuXHR9IGVsc2Uge1xuXHRcdGlmICggdHlwZW9mIG9wdC5kdXJhdGlvbiAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdGlmICggb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgKSB7XG5cdFx0XHRcdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5zcGVlZHNbIG9wdC5kdXJhdGlvbiBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O
211671xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0Lm9sZCApICkge1xuXHRcdFx0b3B0Lm9sZC5jYWxsKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHQucXVldWUgKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgb3B0LnF1ZXVlICk7XG5cdFx0fVxuXHR9O1xuXG5cdHJldHVybiBvcHQ7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGZhZGVUbzogZnVuY3Rpb24oIHNwZWVkLCB0bywgZWFzaW5nLCBjYWxsYmFjayApIHtcblxuXHRcdC8vIFNob3cgYW55IGhpZGRlbiBlbGVtZW50cyBhZnRlciBzZXR0aW5nIG9wYWNpdHkgdG8gMFxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggaXNIaWRkZW5XaXRoaW5UcmVlICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlI
21167HF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0gRGF0ZS5ub3coKTtcblxuXHRmb3IgKCA7IGkgPCB0aW1lcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0dGltZXIgPSB0aW1lcnNbIGkgXTtcblxuXHRcdC8vIFJ1biB0aGUgdGltZXIgYW5kIHNhZmVseSByZW1vdmUgaXQgd2hlbiBkb25lIChhbGxvd2luZyBmb3IgZXh0ZXJuYWwgcmVtb3ZhbClcblx0XHRpZiAoICF0aW1lcigpICYmIHRpbWVyc1sgaSBdID09PSB0aW1lciApIHtcblx0XHRcdHRpbWVycy5zcGxpY2UoIGktLSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdGlmICggIXRpbWVycy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmZ4LnN0b3AoKTtcblx0fVxuXHRmeE5vdyA9IHVuZGVmaW5lZDtcbn07XG5cbmpRdWVyeS5meC50aW1lciA9IGZ1bmN0aW9uKCB0aW1lciApIHtcblx0alF1ZXJ5LnRpbWVycy5wdXNoKCB0aW1lciApO1xuXHRqUXVlcnkuZnguc3RhcnQoKTtcbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggaW5Qcm9ncmVzcyApIHtcblx0XHRyZXR1cm47XG5cdH1cblxuXHRpblByb2dyZXNzID0gdHJ1ZTtcblx0c2NoZWR1bGUoKTtcbn07XG5cbmpRdWVyeS5meC5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdGluUHJvZ3Jlc3MgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDEwMDMyNDAxNDc0Ny9odHRwOi8vYmxpbmRzaWduYWxzLmNvbS9pbmRleC5waHAvMjAwOS8wNy9qcXVlcnktZGVsYXkvXG5qUXVlcnkuZm4uZGVsYXkgPSBmdW5jdGlvbiggdGltZSwgdHlwZSApIHtcblx0dGltZSA9IGpRdWVyeS5meCA/IGpRdWVyeS5meC5zcGVlZHNbIHRpbWUgXSB8fCB0aW1lIDogdGltZTtcblx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXG5cdHJldHVybiB0aGlzLnF1ZXVlKCB0eXBlLCBmdW5jdGlvbiggbmV4dCwgaG9va3MgKSB7XG5cdFx0dmFyIHRpbWVvdXQgPSB3aW5kb3cuc2V0VGltZW91dCggbmV4dCwgdGltZSApO1xuXHRcdGhvb2tzLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXQgKTtcblx0XHR9O1xuXHR9ICk7XG59O1xuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApLFxuXHRcdHNlbGVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwic2VsZWN0XCIgKSxcblx0XHRvcHQgPSBzZWxlY3QuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib3B0aW9uXCIgKSApO1xuXG5cdGlucHV0LnR5cGUgPSBcImNoZWNrYm94XCI7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMyBvbmx5XG5cdC8vIERlZmF1bHQgdmFsdWUgZm9yIGEgY2hlY2tib3ggc2hvdWxkIGJlIFwib25cIlxuXHRzdXBwb3J0LmNoZWNrT24gPSBpbnB1dC52YWx1ZSAhPT0gXCJcIjtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gTXVzdCBhY2Nlc3Mgc2VsZWN0ZWRJbmRleCB0byBtYWtlIGRlZmF1bHQgb3B0aW9ucyBzZWxlY3Rcblx0c3VwcG9ydC5vcHRTZWxlY3RlZCA9IG9wdC5zZWxlY3RlZDtcblxuXHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcblx0Ly8gQW4gaW5wdXQgbG9zZXMgaXRzIHZhbHVlIGFmdGVyIGJlY29taW5nIGEgcmFkaW9cblx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblx0aW5wdXQudmFsdWUgPSBcInRcIjtcblx0aW5wdXQudHlwZSA9IFwicmFkaW9cIjtcblx0c3VwcG9ydC5yYWRpb1ZhbHVlID0gaW5wdXQudmFsdWUgPT09IFwidFwiO1xufSApKCk7XG5cblxudmFyIGJvb2xIb29rLF
21167xuXHRhdHRySGFuZGxlID0galF1ZXJ5LmV4cHIuYXR0ckhhbmRsZTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LmF0dHIsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIHRoaXMsIG5hbWUgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHRhdHRyOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgdmFsdWUgKSB7XG5cdFx0dmFyIHJldCwgaG9va3MsXG5cdFx0XHRuVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0XHQvLyBEb24ndCBnZXQvc2V0IGF0dHJpYnV0ZXMgb24gdGV4dCwgY29tbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzXG5cdFx0aWYgKCBuVHlwZSA9PT0gMyB8fCBuVHlwZSA9PT0gOCB8fCBuVHlwZSA9PT0gMiApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBGYWxsYmFjayB0byBwcm9wIHdoZW4gYXR0cmlidXRlcyBhcmUgbm90IHN1cHBvcnRlZFxuXHRcdGlmICggdHlwZW9mIGVsZW0uZ2V0QXR0cmlidXRlID09PSBcInVuZGVmaW5lZFwiICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5wcm9wKCBlbGVtLCBuYW1lLCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdC8vIEF0dHJpYnV0ZSBob29rcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgbG93ZXJjYXNlIHZlcnNpb25cblx0XHQvLyBHcmFiIG5lY2Vzc2FyeSBob29rIGlmIG9uZSBpcyBkZWZpbmVkXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUudG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdCggalF1ZXJ5LmV4cHIubWF0Y2guYm9vbC50ZXN0KCBuYW1lICkgPyBib29sSG9vayA6IHVuZGVmaW5lZCApO1xuXHRcdH1cblxuXHRcdGlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdGlmICggdmFsdWUgPT09IG51bGwgKSB7XG5cdFx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCBlbGVtLCBuYW1lICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIHZhbHVlICsgXCJcIiApO1xuXHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdC8vIE5vbi1leGlzdGVudCBhdHRyaWJ1dGVzIHJldHVybiBudWxsLCB3ZSBub3JtYWxpemUgdG8gdW5kZWZpbmVkXG5cdFx0cmV0dXJuIHJldCA9PSBudWxsID8gdW5kZWZpbmVkIDogcmV0O1xuXHR9LFxuXG5cdGF0dHJIb29rczoge1xuXHRcdHR5cGU6IHtcblx0XHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0XHRpZiAoICFzdXBwb3J0LnJhZGlvVmFsdWUgJiYgdmFsdWUgPT09IFwicmFkaW9cIiAmJlxuXHRcdFx0XHRcdG5vZGVOYW1lKCBlbGVtLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR2YXIgdmFsID0gZWxlbS52YWx1ZTtcblx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIHZhbHVlICk7XG5cdFx0XHRcdFx0aWYgKCB2YWwgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnZhbHVlID0gdmFsO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdHZhciBuYW1lLFxuXHRcdFx0aSA9IDAsXG5cblx0XHRcdC8vIEF0dHJpYnV0ZSBuYW1lcyBjYW4gY29udGFpbiBub24tSFRNTCB3aGl0ZXNwYWNlIGNoYXJhY3RlcnNcblx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI2F0dHJpYnV0ZXMtMlxuXHRcdFx0YXR0ck5hbWVzID0gdmFsdWUgJiYgdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKTtcblxuXHRcdGlmICggYXR0ck5hbWVzICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHR3aGlsZSAoICggbmFtZSA9IGF0dHJOYW1lc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcblxualF1ZXJ5LmVhY2goIGpRdWVyeS5leHByLm1hdGNoLmJvb2wuc291cmNlLm1hdGNoKCAvXFx3Ky9nICksIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgZ2V0dGVyID0gYXR0ckhhbmRsZVsgbmFtZSBdIHx8IGpRdWVyeS5maW5kLmF0dHI7XG5cblx0YXR0ckhhbmRsZVsgbmFtZSBdID0gZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciByZXQsIGhhbmRsZSxcblx0XHRcdGxvd2VyY2FzZU5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cblx0XHRpZiAoICFpc1hNTCApIHtcblxuXHRcdFx0Ly8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcCBieSB0ZW1wb3JhcmlseSByZW1vdmluZyB0aGlzIGZ1bmN0aW9uIGZyb20gdGhlIGdldHRlclxuXHRcdFx0aGFuZGxlID0gYXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdO1xuXHRcdFx0YXR0ckhhbmRsZVsgbG93ZXJjYXNlTmFtZSBdID0gcmV0O1xuXHRcdFx0cmV0ID0gZ2V0dGVyKCBlbGVtLCBuYW1lLCBpc1hNTCApICE9IG51bGwgP1xuXHRcdFx0XHRsb3dlcmNhc2VOYW1lIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF0
211677XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdFx0XHQvLyBlbGVtLnRhYkluZGV4IGRvZXNuJ3QgYWx3YXlzIHJldHVybiB0aGVcblx0XHRcdFx0Ly8gY29ycmVjdCB2YWx1ZSB3aGVuIGl0IGhhc24ndCBiZWVuIGV4cGxpY2l0bHkgc2V0XG5cdFx0XHRcdC8vIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE0MTExNjIzMzM0Ny9odHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRpZiAoIHRhYmluZGV4ICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXJzZUludCggdGFiaW5kZXgsIDEwICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRyY2xpY2thYmxlLnRlc3QoIGVsZW0ubm9kZU5hbWUgKSAmJlxuXHRcdFx0XHRcdGVsZW0uaHJlZlxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuLy8gZXNsaW50IHJ1bGUgXCJuby11bnVzZWQtZXhwcmVzc2lvbnNcIiBpcyBkaXNhYmxlZCBmb3IgdGhpcyBjb2RlXG4vLyBzaW5jZSBpdCBjb25zaWRlcnMgc3VjaCBhY2Nlc3Npb25zIG5vb3BcbmlmICggIXN1cHBvcnQub3B0U2VsZWN0ZWQgKSB7XG5cdGpRdWVyeS5wcm9wSG9va3Muc2VsZWN0ZWQgPSB7XG5cdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0LyogZXNsaW50IG5vLXVudXNlZC1leHByZXNzaW9uczogXCJvZmZcIiAqL1xuXG5cdFx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0aWYgKCBwYXJlbnQgJiYgcGFyZW50LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9LFxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG5cdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlIGFjY29yZGluZyB0byBIVE1MIHNwZWNcblx0Ly8gaHR0cHM6Ly9pbmZyYS5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS1hc2NpaS13aGl0ZXNwYWNlXG5cdGZ1bmN0aW9uIHN0cmlwQW5kQ29sbGFwc2UoIHZhbHVlICkge1xuXHRcdHZhciB0b2tlbnMgPSB2YWx1ZS
211675tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXHRcdHJldHVybiB0b2tlbnMuam9pbiggXCIgXCIgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmZ1bmN0aW9uIGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApIHtcblx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXHRpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0fVxuXHRyZXR1cm4gW107XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5hZGRDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXHRcdFx0XHRjdXIgPSBlbGVtLm5vZGVUeXBlID09PSAxICYmICggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBjdXJWYWx1ZSApICsgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHJlbW92ZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkucmVtb3ZlQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hdHRyKCBcImNsYXNzXCIsIFwiXCIgKTtcblx0XHR9XG5cblx0XHRjbGFzc2VzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRpZiAoIGNsYXNzZXMubGVuZ3RoICkge1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlICphbGwqIGluc3RhbmNlc1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdFx0Y3VyID0gY3VyLnJlcGxhY2UoIFwiIFwiICsgY2xhenogKyBcIiBcIiwgXCIgXCIgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBzdHJpcEFuZENvbGxhcHNlKCBjdXIgKTtcblx0XHRcdFx0XHRpZiAoIGN1clZhbHVlICE9PSBmaW5hbFZhbHVlICkge1xuXHRcdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiwgZmluYWxWYWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9LFxuXG5cdHRvZ2dsZUNsYXNzOiBmdW5jdGlvbiggdmFsdWUsIHN0YXRlVmFsICkge1xuXHRcdHZhciB0eXBlID0gdHlwZW9mIHZhbHVlLFxuXHRcdFx0aXNWYWxpZFZhbHVlID0gdHlwZSA9PT0gXCJzdHJpbmdcIiB8fCBBcnJheS5pc0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc3RhdGVWYWwgPT09IFwiYm9vbGVhblwiICYmIGlzVmFsaWRWYWx1ZSApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS50b2dnbGVDbGFzcyhcblx0XHRcdFx0XHR2YWx1ZS
211675jYWxsKCB0aGlzLCBpLCBnZXRDbGFzcyggdGhpcyApLCBzdGF0ZVZhbCApLFxuXHRcdFx0XHRcdHN0YXRlVmFsXG5cdFx0XHRcdCk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgY2xhc3NOYW1lLCBpLCBzZWxmLCBjbGFzc05hbWVzO1xuXG5cdFx0XHRpZiAoIGlzVmFsaWRWYWx1ZSApIHtcblxuXHRcdFx0XHQvLyBUb2dnbGUgaW5kaXZpZHVhbCBjbGFzcyBuYW1lc1xuXHRcdFx0XHRpID0gMDtcblx0XHRcdFx0c2VsZiA9IGpRdWVyeSggdGhpcyApO1xuXHRcdFx0XHRjbGFzc05hbWVzID0gY2xhc3Nlc1RvQXJyYXkoIHZhbHVlICk7XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBzdHJpcEFuZENvbGxhcHNlKCBnZXRDbGFzcyggZWxlbSApICkgKyBcIiBcIiApLmluZGV4T2YoIGNsYXNzTmFtZSApID4gLTEgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBycmV0dXJuID0gL1xcci9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCB2YWx1ZUlzRnVuY3Rpb24sXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdO1xuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIGVsZW0udHlwZSBdIHx8XG5cdFx0XHRcdFx0alF1ZXJ5LnZhbEhvb2tzWyBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0XHRpZiAoIGhvb2tzICYmXG5cdFx0XHRcdFx0XCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBcInZhbHVlXCIgKSApICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldCA9IGVsZW0udmFsdWU7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIG1vc3QgY29tbW9uIHN0cmluZyBjYXNlc1xuXHRcdFx0XHRpZiAoIHR5cGVvZiByZXQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHJldC5yZXBsYWNlKCBycmV0dXJuLCBcIlwiICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBIYW5kbGUgY2FzZXMgd2hlcmUgdmFsdWUgaXMgbnVsbC91bmRlZiBvciBudW1iZXJcblx0XHRcdFx0cmV0dXJuIHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdHZhciB2YWw7XG5cblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSAhPT0gMSApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz
211670gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggdmFsICkgKSB7XG5cdFx0XHRcdHZhbCA9IGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICsgXCJcIjtcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXG5cdFx0XHRob29rcyA9IGpRdWVyeS52YWxIb29rc1sgdGhpcy50eXBlIF0gfHwgalF1ZXJ5LnZhbEhvb2tzWyB0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgXTtcblxuXHRcdFx0Ly8gSWYgc2V0IHJldHVybnMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbm9ybWFsIHNldHRpbmdcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fCBob29rcy5zZXQoIHRoaXMsIHZhbCwgXCJ2YWx1ZVwiICkgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0dGhpcy52YWx1ZSA9IHZhbDtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXHR2YWxIb29rczoge1xuXHRcdG9wdGlvbjoge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSApIHtcblxuXHRcdFx0XHR2YXIgdmFsID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ2YWx1ZVwiICk7XG5cdFx0XHRcdHJldHVybiB2YWwgIT0gbnVsbCA/XG5cdFx0XHRcdFx0dmFsIDpcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSBvbmx5XG5cdFx0XHRcdFx0Ly8gb3B0aW9uLnRleHQgdGhyb3dzIGV4Y2VwdGlvbnMgKCMxNDY4NiwgIzE0ODU4KVxuXHRcdFx0XHRcdC8vIFN0cmlwIGFuZCBjb2xsYXBzZSB3aGl0ZXNwYWNlXG5cdFx0XHRcdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy8jc3RyaXAtYW5kLWNvbGxhcHNlLXdoaXRlc3BhY2Vcblx0XHRcdFx0XHRzdHJpcEFuZENvbGxhcHNlKCBqUXVlcnkudGV4dCggZWxlbSApICk7XG5cdFx0XHR9XG5cdFx0fSxcblx0XHRzZWxlY3Q6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciB2YWx1ZSwgb3B0aW9uLCBpLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0aW5kZXggPSBlbGVtLnNlbGVjdGVkSW5kZXgsXG5cdFx0XHRcdFx0b25lID0gZWxlbS50eXBlID09PSBcInNlbGVjdC1vbmVcIixcblx0XHRcdFx0XHR2YWx1ZXMgPSBvbmUgPyBudWxsIDogW10sXG5cdFx0XHRcdFx0bWF4ID0gb25lID8gaW5kZXggKyAxIDogb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0aWYgKCBpbmRleCA8IDAgKSB7XG5cdFx0XHRcdFx0aSA9IG1heDtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGkgPSBvbmUgPyBpbmRleCA6IDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBMb29wIHRocm91Z2ggYWxsIHRoZSBzZWxlY3RlZCBvcHRpb25zXG5cdFx0XHRcdGZvciAoIDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0Ly8gSUU4LTkgZG9lc24ndCB1cGRhdGUgc2VsZWN0ZWQgYWZ0ZXIgZm9ybSByZXNldCAoIzI1NTEpXG5cdFx0XHRcdFx0aWYgKCAoIG9wdGlvbi5zZWxlY3RlZCB8fCBpID09PSBpbmRleCApICYmXG5cblx0XHRcdFx0XHRcdFx0Ly8gRG9uJ3QgcmV0dXJuIG9wdGlvbnMgdGhhdCBhcmUgZGlzYWJsZWQgb3IgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0XHRcdFx0XHQhb3B0aW9uLmRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRcdCggIW9wdGlvbi5wYXJlbnROb2RlLmRpc2FibGVkIHx8XG5cdFx0XHRcdFx0XHRcdFx0IW5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXG5cdFx0XHRcdFx0LyogZXNsaW50LWRpc2FibGUgbm8tY29uZC1hc3NpZ24gKi9cblxuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0LyogZXNsaW50LWVuYWJsZSBuby1jb25kLWFzc2lnbiAqL1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIEFycmF
211675LmlzQXJyYXkoIHZhbHVlICkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0uY2hlY2tlZCA9IGpRdWVyeS5pbkFycmF5KCBqUXVlcnkoIGVsZW0gKS52YWwoKSwgdmFsdWUgKSA+IC0xICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXHRpZiAoICFzdXBwb3J0LmNoZWNrT24gKSB7XG5cdFx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0uZ2V0ID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiApID09PSBudWxsID8gXCJvblwiIDogZWxlbS52YWx1ZTtcblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFJldHVybiBqUXVlcnkgZm9yIGF0dHJpYnV0ZXMtb25seSBpbmNsdXNpb25cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG52YXIgcmZvY3VzTW9ycGggPSAvXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sXG5cdHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrID0gZnVuY3Rpb24oIGUgKSB7XG5cdFx0ZS5zdG9wUHJvcGFnYXRpb24oKTtcblx0fTtcblxualF1ZXJ5LmV4dGVuZCggalF1ZXJ5LmV2ZW50LCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIGV2ZW50LCBkYXRhLCBlbGVtLCBvbmx5SGFuZGxlcnMgKSB7XG5cblx0XHR2YXIgaSwgY3VyLCB0bXAsIGJ1YmJsZVR5cGUsIG9udHlwZSwgaGFuZGxlLCBzcGVjaWFsLCBsYXN0RWxlbWVudCxcblx0XHRcdGV2ZW50UGF0aCA9IFsgZWxlbSB8fCBkb2N1bWVudCBdLFxuXHRcdFx0dHlwZSA9IGhhc093bi5jYWxsKCBldmVudCwgXCJ0eXBlXCIgKSA/IGV2ZW50LnR5cGUgOiBldmVudCxcblx0XHRcdG5hbWVzcGFjZXMgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwibmFtZXNwYWNlXCIgKSA/IGV2ZW50Lm5hbWVzcGFjZS5zcGxpdCggXCIuXCIgKSA6IFtdO1xuXG5cdFx0Y3VyID0gbGFzdEVsZW1lbnQgPSB0bXAgPSBlbGVtID0gZWxlbSB8fCBkb2N1bWVudDtcblxuXHRcdC8vIERvbid0IGRvIGV2ZW50cyBvbiB0ZXh0IGFuZCBjb21tZW50IG5vZGVzXG5cdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAzIHx8IGVsZW0ubm9kZVR5cGUgPT09IDggKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gZm9jdXMvYmx1ciBtb3JwaHMgdG8gZm9jdXNpbi9vdXQ7IGVuc3VyZSB3ZSdyZSBub3QgZmlyaW5nIHRoZW0gcmlnaHQgbm93XG5cdFx0aWYgKCByZm9jdXNNb3JwaC50ZXN0KCB0eXBlICsgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCApICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZS5pbmRleE9mKCBcIi5cIiApID4gLTEgKSB7XG5cblx0XHRcdC8vIE5hbWVzcGFjZWQgdHJpZ2dlcjsgY3JlYXRlIGEgcmVnZXhwIHRvIG1hdGNoIGV2ZW50IHR5cGUgaW4gaGFuZGxlKClcblx0XHRcdG5hbWVzcGFjZXMgPSB0eXBlLnNwbGl0KCBcIi5cIiApO1xuXHRcdFx0dHlwZSA9IG5hbWVzcGFjZXMuc2hpZnQoKTtcblx0XHRcdG5hbWVzcGFjZXMuc29ydCgpO1xuXHRcdH1cblx0XHRvbnR5cGUgPSB0eXBlLmluZGV4T2YoIFwiOlwiICkgPCAwICYmIFwib25cIiArIHR5cGU7XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYSBqUXVlcnkuRXZlbnQgb2JqZWN0LCBPYmplY3QsIG9yIGp1c3QgYW4gZXZlbnQgdHlwZSBzdHJpbmdcblx0XHRldmVudCA9IGV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdGV2ZW50IDpcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoIHR5cGUsIHR5cGVvZiBldmVudCA9PT0gXCJvYmplY3RcIiAmJiBldmVudCApO1xuXG5cdFx0Ly8gVHJpZ2dlciBiaXRtYXNrOiAmIDEgZm9yIG5hdGl2ZSBoYW5kbGVyczsgJiAyIGZvciBqUXVlcnkgKGFsd2F5cyB0cnVlKVxuXHRcdGV2ZW50LmlzVHJpZ2dlciA9IG9ubHlIYW5kbGVycyA/IDIgOiAzO1xuXHRcdGV2ZW50Lm5hbWVzcGFjZSA9IG5hbWVzcGFjZXMuam9pbiggXCIuXCIgKTtcblx0XHRldmVudC5ybmFtZXNwYWNlID0gZXZlbnQubmFtZXNwYWNlID9cblx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApIDpcblx0XHRcdG51bGw7XG5cblx0XHQvLyBDbGVhbiB1cCB0aGUgZXZlbnQgaW4gY2FzZSBpdCBpcyBiZWluZyByZXVzZWRcblx0XHRldmVudC5yZXN1bHQgPSB1bmRlZmluZWQ7XG5cdFx0aWYgKCAhZXZlbnQudGFyZ2V0ICkge1xuXHRcdFx0ZXZlbnQudGFyZ2V0ID0gZWxlbTtcblx0XHR9XG5cblx0XHQvLyBDbG9uZSBhbnkgaW5jb21pbmcgZGF0YSBhbmQgcHJlcGVuZCB0aGUgZXZlbnQsIGNyZWF0aW5nIHRoZSBoYW5kbGVyIGFyZyBsaXN0XG5cdFx0ZGF0YSA9IGRhdGEgPT0gbnVsbCA/XG5cdFx0XHRbIGV2ZW50IF0gOlxuXHRcdFx0alF1ZXJ5Lm1ha2VBcnJheSggZGF0YSwgWyBldmVudCBdICk7XG5cblx0XHQvLyBBbGxvdyBzcGVjaWFsIGV2ZW50cyB0byBkcmF3IG91dHNpZGUgdGhlIGxpbmVzXG5cdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmIHNwZWNpYWwudHJpZ2dlciAmJiBzcGVjaWFsLnRyaWdnZXIuYXBwbHkoIGVsZW0sIGRhdGEgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGV2ZW50IHByb3BhZ2F0aW9uIHBhdGggaW4gYWR2YW5jZSwgcGVyIFczQyBldmVudHMgc3BlYyAoIzk5NTEpXG5cdFx0Ly8gQnViYmxlIHVwIHRvIGRvY3VtZW50LCB0aGVuIHRvIHdpbmRvdzsgd2F0Y2ggZm9yIGEgZ2xvYmFsIG93bmVyRG9jdW1lbnQgdmFyICgjOTcyNClcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIXNwZWNpYWwubm9CdWJibGUgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHd
21167oaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRsYXN0RWxlbWVudCA9IGN1cjtcblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZXZlbnQuXG5cdFx0XHRcdC8vIERvbid0IGRvIGRlZmF1bHQgYWN0aW9ucyBvbiB3aW5kb3csIHRoYXQncyB3aGVyZSBnbG9iYWwgdmFyaWFibGVzIGJlICgjNjE3MClcblx0XHRcdFx0aWYgKCBvbnR5cGUgJiYgaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb24ndCByZS10cmlnZ2VyIGFuIG9uRk9PIGV2ZW50IHdoZW4gd2UgY2FsbCBpdHMgRk9PKCkgbWV0aG9kXG5cdFx0XHRcdFx0dG1wID0gZWxlbVsgb250eXBlIF07XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gbnVsbDtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBQcmV2ZW50IHJlLXRyaWdnZXJpbmcgb2YgdGhlIHNhbWUgZXZlbnQsIHNpbmNlIHdlIGFscmVhZHkgYnViYmxlZCBpdCBhYm92ZVxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB0eXBlO1xuXG5cdFx0XHRcdFx0aWYgKCBldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0XHRcdFx0bGFzdEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgc3RvcFByb3BhZ2F0aW9uQ2FsbGJhY2sgKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0XHRcdGlmICggdG1wICkge1xuXHRcdFx0XHRcdFx0ZWxlbVsgb250eXBlIF0gPSB0bXA7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHQvLyBQaWdneWJhY2sgb24gYSBkb25vciBldmVudCB0byBzaW11bGF0ZSBhIGRpZmZlcmVudCBvbmVcblx0Ly8gVXNlZCBvbmx5IGZvciBgZm9jdXMoaW4gfCBvdXQpYCBldmVudHNcblx0c2ltdWxhdGU6IGZ1bmN0aW9uKCB0eXBlLCBlbGVtLCBldmVudCApIHtcblx0XHR2YXIgZSA9IGpRdWVyeS5leHRlbmQoXG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCksXG5cdFx0XHRldmVudCxcblx0XHRcdHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0aXNTaW11bGF0ZWQ6IHRydWVcblx0XHRcdH1cblx0XHQpO1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIGUsIG51bGwsIGVsZW0gKTtcblx0fVxuXG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCB0aGlzICk7XG5cdFx0fSApO1xuXHR9LFxuXHR0cmlnZ2VySGFuZGxlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF07XG5cdFx0aWYgKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5ldmVudC50cmlnZ2VyKCB0eXBlLCBkYXRhLCBlbGVtLCB0cnVlICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cblxuLy8gU3VwcG9ydDogRmlyZWZveCA8PTQ0XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96
21167aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSA8PTQ4IC0gNDksIFNhZmFyaSA8PTkuMCAtIDkuMVxuLy8gZm9jdXMoaW4gfCBvdXQpIGV2ZW50cyBmaXJlIGFmdGVyIGZvY3VzICYgYmx1ciBldmVudHMsXG4vLyB3aGljaCBpcyBzcGVjIHZpb2xhdGlvbiAtIGh0dHA6Ly93d3cudzMub3JnL1RSL0RPTS1MZXZlbC0zLUV2ZW50cy8jZXZlbnRzLWZvY3VzZXZlbnQtZXZlbnQtb3JkZXJcbi8vIFJlbGF0ZWQgdGlja2V0IC0gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IERhdGUubm93KCk7XG5cbnZhciBycXVlcnkgPSAoIC9cXD8vICk7XG5cblxuXG4vLyBDcm9zcy1icm93c2VyIHhtbCBwYXJzaW5nXG5qUXVlcnkucGFyc2VYTUwgPSBmdW5jdGlvbiggZGF0YSApIHtcblx0dmFyIHhtbDtcblx0aWYgKCAhZGF0YSB8fCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5XG5cdC8vIElFIHRocm93cyBvbiBwYXJzZUZyb21TdHJpbmcgd2l0aCBpbnZhbGlkIGlucHV0LlxuXHR0cnkge1xuXHRcdHhtbCA9ICggbmV3IHdpbmRvdy5ET01QYXJzZXIoKSApLnBhcnNlRnJvbVN0cmluZyggZGF0YSwgXCJ0ZXh0L3htbFwiICk7XG5cdH0gY2F0Y2ggKCBlICkge1xuXHRcdHhtbCA9IHVuZGVmaW5lZDtcblx0fVxuXG5cdGlmICggIXhtbCB8fCB4bWwuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIFwicGFyc2VyZXJyb3JcIiApLmxlbmd0aCApIHtcblx0XHRqUXVlcnkuZXJyb3IoIFwiSW52YWxpZCBYTUw6IFwiICsgZGF0YSApO1xuXHR9XG5cdHJldHVybiB4bWw7XG59O1xuXG5cbnZhclxuXHRyYnJhY2tldCA9IC9cXFtcXF0kLyxcblx0ckNSTEYgPSAvXFxyP1xcbi9nLFxuXHRyc3VibWl0dGVyVHlwZXMgPSAvXig/OnN1Ym1pdHxidXR0b258aW1hZ2V8cmVzZXR8ZmlsZSkkL2ksXG5cdHJzdWJtaXR0YWJsZSA9IC9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtcblxuZnVuY3Rpb24gYnVpbGRQYXJhbXMoIHByZWZpeCwgb2JqLCB0cmFkaXRpb25hbCwgYWRkICkge1xuXHR2YXIgbmFtZTtcblxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIGFycmF5IGl0ZW0uXG5cdFx0alF1ZXJ5LmVhY2goIG9iaiwgZnVuY3Rpb24oIGksIHYgKSB7XG5cdFx0XHRpZiAoIHRyYWRpdGlvbmFsIHx8IHJicmFja2V0LnRlc3QoIHByZWZpeCApICkge1xuXG5cdFx0XHRcdC8vIFRyZWF0IGVhY2ggYXJyYXkgaXRlbSBhcyBhIHNjYWxhci5cblx0XHRcdFx0YWRkKCBwcmVmaXgsIHYgKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBJdGVtIGlzIG5vbi1zY2FsYXIgKGFycmF5IG9yIG9iamVjdCksIGVuY29kZSBpdHMgbnVtZXJpYyBpbmRleC5cblx0XHRcdFx0YnVpbGRQYXJhbXMoXG5cdFx0XHRcdFx0cHJlZml4ICsgXCJbXCIgKyAoIHR5cGVvZiB2ID09PSBcIm9iamVjdFwiICYmIHYgIT0gbnVsbCA/IGkgOiBcIlwiICkgKyBcIl1cIixcblx0XHRcdFx0XHR2LFxuXHRcdFx0XHRcdHRyYWRpdGlvbmFsLFxuXHRcdFx0XHRcdGFkZFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gKTtcblxuXHR9IGVsc2UgaWYgKCAhdHJhZGl0aW9uYWwgJiYgdG9UeXBlKCBvYmogKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBvYmplY3QgaXRlbS5cblx0XHRmb3IgKCBuYW1lIGluIG9iaiApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXggKyBcIltcIiArIG5hbWUgKyBcIl1cIiwgb2JqWyBuYW1lIF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBzY2FsYXIgaXRlbS5cblx0XHRhZGQoIHByZWZpeCwgb2JqICk7XG5cdH1cbn1cblxuLy8gU2VyaWFsaXplIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMgb3IgYSBzZXQgb2Zcbi8vIGtleS92YWx1ZXMgaW50byBhIHF1ZXJ5IHN0cmluZ1xualF1ZXJ5LnBhcmFtID0gZnVuY3Rpb24oIGEsIHRyYWRpdGlvbmFsICkge1xuXHR2YXIgcHJlZml4LFxuXHRcdHMgPSBbXSxcblx0XHRhZGQgPSBmdW5jdGlvbigga2V5LCB2YWx1ZU9yRnVuY3Rpb24gKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgdXNlIGl0cyByZXR1cm4gdmFsdWVcblx0XHRcdHZhciB2YWx1ZSA9IGlzRnVuY3Rpb24oIHZhbHVlT3JGdW5jdGlvbiApID9cblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uKCkgOlxuXHRcdFx0XHR2YWx1ZU9yRnVuY3Rpb247XG5cblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgK1xuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHR9O1xuXG5cdC8vIElmIGFuIGFycmF5IHdhcyBwYXNzZWQgaW4sIGFzc3VtZSB0aGF0IGl0IGlzIGFuIGFycmF5IG9mIGZvcm0gZWxlbWVudHMuXG5cdGlmICggQXJyYXkuaXNBcnJheSggYSApIHx8ICggYS5qcXVlcnkgJiYgIWpRdWVyeS5pc1BsYWluT2JqZWN0KCBhICkgKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSB0aGUgZm9ybSBlbGVtZW50c1xuXHRcdGpRdWVyeS5lYWNoKCBhLCBmdW5jdGlvbigpIHtcblx0XHRcdGFkZCggdGhpcy5uYW1lLCB0aGlzLnZhbHVlICk7XG5cdFx0fSApO1xuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBJZiB0cmFkaXRpb25hbCwgZW5jb2RlIHRoZSBcIm9sZFwiIHdheSAodGhlIHdheSAxLjMuMiBvciBvbGRlclxuXHRcdC8vIGRpZCBpdCksIG90aGVyd2lzZSBlbmNvZGUgcGFyYW1zIHJlY3Vyc2l2ZWx5LlxuXHRcdGZvciAoIHByZWZpeCBpbiBhICkge1xuXHRcdFx0YnVpbGRQYXJhbXMoIHByZWZpeCwgYVsgcHJlZml4IF0sIHRyYWRpdGlvbmFsLCBhZGQgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIHJlc3VsdGluZyBzZXJpYWxpemF0aW9uXG5cdHJldHVybi
21167BzLmpvaW4oIFwiJlwiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdGlmICggdmFsID09IG51bGwgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHRyZXR1cm4galF1ZXJ5Lm1hcCggdmFsLCBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHsgbmFtZTogZWxlbS5uYW1lLCB2YWx1ZTogdmFsLnJlcGxhY2UoIHJDUkxGLCBcIlxcclxcblwiICkgfTtcblx0XHR9ICkuZ2V0KCk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cjIwID0gLyUyMC9nLFxuXHRyaGFzaCA9IC8jLiokLyxcblx0cmFudGlDYWNoZSA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhV
21167HlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybi
21167B0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHRcdC8vIFRoZXJlJ3Mgb25seSB3b3JrIHRvIGRvIGlmIGN1cnJlbnQgZGF0YVR5cGUgaXMgbm9uLWF1dG9cblx0XHRcdGlmICggY3VycmVudCA9PT0gXCIqXCIgKSB7XG5cblx0XHRcdFx0Y3VycmVudCA9IHByZXY7XG5cblx0XHRcdC8vIENvbnZlcnQgcmVzcG9uc2UgaWYgcHJldiBkYXRhVHlwZSBpcyBub24tYXV0byBhbmQgZGlmZmVycyBmcm9tIGN1cnJlbnRcblx0XHRcdH0gZWxzZSBpZiAoIHByZXYgIT09IFwiKlwiICYmIHByZXYgIT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0Ly8gU2VlayBhIGRpcmVjdCBjb252ZXJ0ZXJcblx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIGN1cnJlbnQgXSB8fCBjb252ZXJ0ZXJzWyBcIiogXCIgKyBjdXJyZW50IF07XG5cblx0XHRcdFx0Ly8gSWYgbm9uZSBmb3VuZCwgc2VlayBhIHBhaXJcblx0XHRcdFx0aWYgKCAhY29udiApIHtcblx0XHRcdFx0XHRmb3IgKCBjb252MiBpbiBjb252ZXJ0ZXJzICkge1xuXG5cdFx0XHRcdFx0XHQvLyBJZiBjb252MiBvdXRwdXRzIGN1cnJlbnRcblx0XHRcdFx0XHRcdHRtcCA9IGNvbnYyLnNwbGl0KCBcIiBcIiApO1xuXHRcdFx0XHRcdFx0aWYgKCB0bXBbIDEgXSA9PT0gY3VycmVudCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBJZiBwcmV2IGNhbiBiZSBjb252ZXJ0ZWQgdG8gYWNjZXB0ZWQgaW5wdXRcblx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIHByZXYgKyBcIiBcIiArIHRtcFsgMCBdIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRjb252ZXJ0ZXJzWyBcIiogXCIgKyB0bXBbIDAgXSBdO1xuXHRcdFx0XHRcdFx0XHRpZiAoIGNvbnYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBDb25kZW5zZSBlcXVpdmFsZW5jZSBjb252ZXJ0ZXJzXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjb252ID09PSB0cnVlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29udiA9IGNvbnZlcnRlcnNbIGNvbnYyIF07XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgaW50ZXJtZWRpYXRlIGRhdGFUeXBlXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggY29udmVydGVyc1sgY29udjIgXSAhPT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGN1cnJlbnQgPSB0bXBbIDAgXTtcblx0XHRcdFx0XHRcdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0bXBbIDEgXSApO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEFwcGx5IGNvbnZlcnRlciAoaWYgbm90IGFuIGVxdWl2YWxlbmNlKVxuXHRcdFx0XHRpZiAoIGNvbnYgIT09IHRydWUgKSB7XG5cblx0XHRcdFx0XHQvLyBVbmxlc3MgZXJyb3JzIGFyZSBhbGxvd2VkIHRvIGJ1YmJsZSwgY2F0Y2ggYW5kIHJldHVybiB0aGVtXG5cdFx0XHRcdFx0aWYgKCBjb252ICYmIHMudGhyb3dzICkge1xuXHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0XHRyZXNwb25zZSA9IGNvbnYoIHJlc3BvbnNlICk7XG5cdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0ZTogXCJwYXJzZXJlcnJvclwiLFxuXHRcdFx0XHRcdFx0XHRcdGVycm9yOiBjb252ID8gZSA6IFwiTm8gY29udmVyc2lvbiBmcm9tIFwiICsgcHJldiArIFwiIHRvIFwiICsgY3VycmVudFxuXHRcdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybi
21167B7IHN0YXRlOiBcInN1Y2Nlc3NcIiwgZGF0YTogcmVzcG9uc2UgfTtcbn1cblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIENvdW50ZXIgZm9yIGhvbGRpbmcgdGhlIG51bWJlciBvZiBhY3RpdmUgcXVlcmllc1xuXHRhY3RpdmU6IDAsXG5cblx0Ly8gTGFzdC1Nb2RpZmllZCBoZWFkZXIgY2FjaGUgZm9yIG5leHQgcmVxdWVzdFxuXHRsYXN0TW9kaWZpZWQ6IHt9LFxuXHRldGFnOiB7fSxcblxuXHRhamF4U2V0dGluZ3M6IHtcblx0XHR1cmw6IGxvY2F0aW9uLmhyZWYsXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRpc0xvY2FsOiBybG9jYWxQcm90b2NvbC50ZXN0KCBsb2NhdGlvbi5wcm90b2NvbCApLFxuXHRcdGdsb2JhbDogdHJ1ZSxcblx0XHRwcm9jZXNzRGF0YTogdHJ1ZSxcblx0XHRhc3luYzogdHJ1ZSxcblx0XHRjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7IGNoYXJzZXQ9VVRGLThcIixcblxuXHRcdC8qXG5cdFx0dGltZW91dDogMCxcblx0XHRkYXRhOiBudWxsLFxuXHRcdGRhdGFUeXBlOiBudWxsLFxuXHRcdHVzZXJuYW1lOiBudWxsLFxuXHRcdHBhc3N3b3JkOiBudWxsLFxuXHRcdGNhY2hlOiBudWxsLFxuXHRcdHRocm93czogZmFsc2UsXG5cdFx0dHJhZGl0aW9uYWw6IGZhbHNlLFxuXHRcdGhlYWRlcnM6IHt9LFxuXHRcdCovXG5cblx0XHRhY2NlcHRzOiB7XG5cdFx0XHRcIipcIjogYWxsVHlwZXMsXG5cdFx0XHR0ZXh0OiBcInRleHQvcGxhaW5cIixcblx0XHRcdGh0bWw6IFwidGV4dC9odG1sXCIsXG5cdFx0XHR4bWw6IFwiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbFwiLFxuXHRcdFx0anNvbjogXCJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHRcIlxuXHRcdH0sXG5cblx0XHRjb250ZW50czoge1xuXHRcdFx0eG1sOiAvXFxieG1sXFxiLyxcblx0XHRcdGh0bWw6IC9cXGJodG1sLyxcblx0XHRcdGpzb246IC9cXGJqc29uXFxiL1xuXHRcdH0sXG5cblx0XHRyZXNwb25zZUZpZWxkczoge1xuXHRcdFx0eG1sOiBcInJlc3BvbnNlWE1MXCIsXG5cdFx0XHR0ZXh0OiBcInJlc3BvbnNlVGV4dFwiLFxuXHRcdFx0anNvbjogXCJyZXNwb25zZUpTT05cIlxuXHRcdH0sXG5cblx0XHQvLyBEYXRhIGNvbnZlcnRlcnNcblx0XHQvLyBLZXlzIHNlcGFyYXRlIHNvdXJjZSAob3IgY2F0Y2hhbGwgXCIqXCIpIGFuZCBkZXN0aW5hdGlvbiB0eXBlcyB3aXRoIGEgc2luZ2xlIHNwYWNlXG5cdFx0Y29udmVydGVyczoge1xuXG5cdFx0XHQvLyBDb252ZXJ0IGFueXRoaW5nIHRvIHRleHRcblx0XHRcdFwiKiB0ZXh0XCI6IFN0cmluZyxcblxuXHRcdFx0Ly8gVGV4dCB0byBodG1sICh0cnVlID0gbm8gdHJhbnNmb3JtYXRpb24pXG5cdFx0XHRcInRleHQgaHRtbFwiOiB0cnVlLFxuXG5cdFx0XHQvLyBFdmFsdWF0ZSB0ZXh0IGFzIGEganNvbiBleHByZXNzaW9uXG5cdFx0XHRcInRleHQganNvblwiOiBKU09OLnBhcnNlLFxuXG5cdFx0XHQvLyBQYXJzZSB0ZXh0IGFzIHhtbFxuXHRcdFx0XCJ0ZXh0IHhtbFwiOiBqUXVlcnkucGFyc2VYTUxcblx0XHR9LFxuXG5cdFx0Ly8gRm9yIG9wdGlvbnMgdGhhdCBzaG91bGRuJ3QgYmUgZGVlcCBleHRlbmRlZDpcblx0XHQvLyB5b3UgY2FuIGFkZCB5b3VyIG93biBjdXN0b20gb3B0aW9ucyBoZXJlIGlmXG5cdFx0Ly8gYW5kIHdoZW4geW91IGNyZWF0ZSBvbmUgdGhhdCBzaG91bGRuJ3QgYmVcblx0XHQvLyBkZWVwIGV4dGVuZGVkIChzZWUgYWpheEV4dGVuZClcblx0XHRmbGF0T3B0aW9uczoge1xuXHRcdFx0dXJsOiB0cnVlLFxuXHRcdFx0Y29udGV4dDogdHJ1ZVxuXHRcdH1cblx0fSxcblxuXHQvLyBDcmVhdGVzIGEgZnVsbCBmbGVkZ2VkIHNldHRpbmdzIG9iamVjdCBpbnRvIHRhcmdldFxuXHQvLyB3aXRoIGJvdGggYWpheFNldHRpbmdzIGFuZCBzZXR0aW5ncyBmaWVsZHMuXG5cdC8vIElmIHRhcmdldCBpcyBvbWl0dGVkLCB3cml0ZXMgaW50byBhamF4U2V0dGluZ3MuXG5cdGFqYXhTZXR1cDogZnVuY3Rpb24oIHRhcmdldCwgc2V0dGluZ3MgKSB7XG5cdFx0cmV0dXJuIHNldHRpbmdzID9cblxuXHRcdFx0Ly8gQnVpbGRpbmcgYSBzZXR0aW5ncyBvYmplY3Rcblx0XHRcdGFqYXhFeHRlbmQoIGFqYXhFeHRlbmQoIHRhcmdldCwgalF1ZXJ5LmFqYXhTZXR0aW5ncyApLCBzZXR0aW5ncyApIDpcblxuXHRcdFx0Ly8gRXh0ZW5kaW5nIGFqYXhTZXR0aW5nc1xuXHRcdFx0YWpheEV4dGVuZCggalF1ZXJ5LmFqYXhTZXR0aW5ncywgdGFyZ2V0ICk7XG5cdH0sXG5cblx0YWpheFByZWZpbHRlcjogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzICksXG5cdGFqYXhUcmFuc3BvcnQ6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cyApLFxuXG5cdC8vIE1haW4gbWV0aG9kXG5cdGFqYXg6IGZ1bmN0aW9uKCB1cmwsIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBJZiB1cmwgaXMgYW4gb2JqZWN0LCBzaW11bGF0ZSBwcmUtMS41IHNpZ25hdHVyZVxuXHRcdGlmICggdHlwZW9mIHVybCA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdG9wdGlvbnMgPSB1cmw7XG5cdFx0XHR1cmwgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gRm9yY2Ugb3B0aW9ucyB0byBiZSBhbiBvYmplY3Rcblx0XHRvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuXHRcdHZhciB0cmFuc3BvcnQsXG5cblx0XHRcdC8vIFVSTCB3aXRob3V0IGFudGktY2FjaGUgcGFyYW1cblx0XHRcdGNhY2hlVVJMLFxuXG5cdFx0XHQvLyBSZXNwb25zZSBoZWFkZXJzXG5cdFx0XHRyZXNwb25zZUhlYWRlcnNTdHJpbmcsXG5cdFx0XHRyZXNwb25zZUhlYWRlcnMsXG5cblx0XHRcdC8vIHRpbWVvdXQgaGFuZGxlXG5cdFx0XHR0aW1lb3V0VGltZXIsXG5cblx0XHRcdC8vIFVybCBjbGVhbnVwIHZhclxuXHRcdFx0dXJsQW5jaG9yLFxuXG5cdFx0XHQvLyBSZXF1ZXN0IHN0YXRlIChiZWNvbWVzIGZhbHNlIHVwb24gc2VuZCBhbmQgdHJ1ZSB1cG9uIGNvbXBsZXRpb24pXG5cdFx0XHRjb21wbGV0ZWQsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIHVuY2FjaGVkIHBhcnQgb2YgdGhlIHVybFxuXHRcdFx0dW5jYWNoZWQsXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1
21167ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIERlZmF1bHQgYWJvcnQgbWVzc2FnZVxuXHRcdFx0c3RyQWJvcnQgPSBcImNhbmNlbGVkXCIsXG5cblx0XHRcdC8vIEZha2UgeGhyXG5cdFx0XHRqcVhIUiA9IHtcblx0XHRcdFx0cmVhZHlTdGF0ZTogMCxcblxuXHRcdFx0XHQvLyBCdWlsZHMgaGVhZGVycyBoYXNodGFibGUgaWYgbmVlZGVkXG5cdFx0XHRcdGdldFJlc3BvbnNlSGVhZGVyOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdFx0XHRcdHZhciBtYXRjaDtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGNvbXBsZXRlZCA/IHJlc3BvbnNlSGVhZGVyc1N0cmluZyA6IG51bGw7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gQ2FjaGVzIHRoZSBoZWFkZXJcblx0XHRcdFx0c2V0UmVxdWVzdEhlYWRlcjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0XHRcdGlmICggY29tcGxldGVkID09IG51bGwgKSB7XG5cdFx0XHRcdFx0XHRuYW1lID0gcmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gPVxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fCBuYW1lO1xuXHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBPdmVycmlkZXMgcmVzcG9uc2UgY29udGVudC10eXBlIGhlYWRlclxuXHRcdFx0XHRvdmVycmlkZU1pbWVUeXBlOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBFeGVjdXRlIHRoZSBhcHByb3ByaWF0ZSBjYWxsYmFja3Ncblx0XHRcdFx0XHRcdFx0anFYSFIuYWx3YXlzKCBtYXBbIGpxWEhSLnN0YXR1cyBdICk7XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdC8vIExhenktYWRkIHRoZSBuZXcgY2FsbGJhY2tzIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdGZvciAoIGNvZGUgaW4gbWFwICkge1xuXHRcdFx0XHRcdFx0XHRcdHN0YXR1c0NvZGVbIGNvZGUgXSA9IFsgc3RhdHVzQ29kZVsgY29kZSBdLCBtYXBbIGNvZGUgXSBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhbmNlbCB0aGUgcmVxdWVzdFxuXHRcdFx0XHRhYm9ydDogZnVuY3Rpb24oIHN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0dmFyIGZpbmFsVGV4dCA9IHN0YXR1c1RleHQgfHwgc3RyQWJvcnQ7XG5cdFx0XHRcdFx0aWYgKCB0cmFuc3BvcnQgKSB7XG5cdFx0XHRcdFx0XHR0cmFuc3BvcnQuYWJvcnQoIGZpbmFsVGV4dCApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkb25lKCAwLCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0fTtcblxuXHRcdC8vIEF0dGFjaCBkZWZlcnJlZHNcblx0XHRkZWZlcnJlZC5wcm9taXNlKCBqcVhIUiApO1xuXG5cdFx0Ly8gQWRkIHByb3RvY29sIGlmIG5vdCBwcm92aWRlZCAocHJlZmlsdGVycyBtaWdodCBleHBlY3QgaXQpXG5cdFx0Ly8gSGFuZGxlIGZhbHN5IHVybCBpbiB0aGUgc2V0dGluZ3Mgb2JqZWN0ICgjMTAwOTM6IGNvbnNpc3RlbmN5IHdpdGggb2xkIHNpZ25hdHVyZSlcblx0XHQvLyBXZSBhbHNvIHVzZSB0aGUgdXJsIHBhcmFtZXRlciBpZiBhdmFpbGFibGVcblx0XHRzLnVybCA9ICggKCB1cmwgfHwgcy51cmwgfHwgbG9jYXRpb24uaHJlZiApICsgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9ICggcy5kYXRhV
21167HlwZSB8fCBcIipcIiApLnRvTG93ZXJDYXNlKCkubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbIFwiXCIgXTtcblxuXHRcdC8vIEEgY3Jvc3MtZG9tYWluIHJlcXVlc3QgaXMgaW4gb3JkZXIgd2hlbiB0aGUgb3JpZ2luIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgb3JpZ2luLlxuXHRcdGlmICggcy5jcm9zc0RvbWFpbiA9PSBudWxsICkge1xuXHRcdFx0dXJsQW5jaG9yID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJhXCIgKTtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEsIEVkZ2UgMTIgLSAxNVxuXHRcdFx0Ly8gSUUgdGhyb3dzIGV4Y2VwdGlvbiBvbiBhY2Nlc3NpbmcgdGhlIGhyZWYgcHJvcGVydHkgaWYgdXJsIGlzIG1hbGZvcm1lZCxcblx0XHRcdC8vIGUuZy4gaHR0cDovL2V4YW1wbGUuY29tOjgweC9cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gcy51cmw7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IC0gMTEgb25seVxuXHRcdFx0XHQvLyBBbmNob3IncyBob3N0IHByb3BlcnR5IGlzbid0IGNvcnJlY3RseSBzZXQgd2hlbiBzLnVybCBpcyByZWxhdGl2ZVxuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHVybEFuY2hvci5ocmVmO1xuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gb3JpZ2luQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgb3JpZ2luQW5jaG9yLmhvc3QgIT09XG5cdFx0XHRcdFx0dXJsQW5jaG9yLnByb3RvY29sICsgXCIvL1wiICsgdXJsQW5jaG9yLmhvc3Q7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBVUkwsIGFzc3VtZSBpdCBpcyBjcm9zc0RvbWFpbixcblx0XHRcdFx0Ly8gaXQgY2FuIGJlIHJlamVjdGVkIGJ5IHRoZSB0cmFuc3BvcnQgaWYgaXQgaXMgaW52YWxpZFxuXHRcdFx0XHRzLmNyb3NzRG9tYWluID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb252ZXJ0IGRhdGEgaWYgbm90IGFscmVhZHkgYSBzdHJpbmdcblx0XHRpZiAoIHMuZGF0YSAmJiBzLnByb2Nlc3NEYXRhICYmIHR5cGVvZiBzLmRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRzLmRhdGEgPSBqUXVlcnkucGFyYW0oIHMuZGF0YSwgcy50cmFkaXRpb25hbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHByZWZpbHRlcnNcblx0XHRpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGEgcHJlZmlsdGVyLCBzdG9wIHRoZXJlXG5cdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0fVxuXG5cdFx0Ly8gV2UgY2FuIGZpcmUgZ2xvYmFsIGV2ZW50cyBhcyBvZiBub3cgaWYgYXNrZWQgdG9cblx0XHQvLyBEb24ndCBmaXJlIGV2ZW50cyBpZiBqUXVlcnkuZXZlbnQgaXMgdW5kZWZpbmVkIGluIGFuIEFNRC11c2FnZSBzY2VuYXJpbyAoIzE1MTE4KVxuXHRcdGZpcmVHbG9iYWxzID0galF1ZXJ5LmV2ZW50ICYmIHMuZ2xvYmFsO1xuXG5cdFx0Ly8gV2F0Y2ggZm9yIGEgbmV3IHNldCBvZiByZXF1ZXN0c1xuXHRcdGlmICggZmlyZUdsb2JhbHMgJiYgalF1ZXJ5LmFjdGl2ZSsrID09PSAwICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0YXJ0XCIgKTtcblx0XHR9XG5cblx0XHQvLyBVcHBlcmNhc2UgdGhlIHR5cGVcblx0XHRzLnR5cGUgPSBzLnR5cGUudG9VcHBlckNhc2UoKTtcblxuXHRcdC8vIERldGVybWluZSBpZiByZXF1ZXN0IGhhcyBjb250ZW50XG5cdFx0cy5oYXNDb250ZW50ID0gIXJub0NvbnRlbnQudGVzdCggcy50eXBlICk7XG5cblx0XHQvLyBTYXZlIHRoZSBVUkwgaW4gY2FzZSB3ZSdyZSB0b3lpbmcgd2l0aCB0aGUgSWYtTW9kaWZpZWQtU2luY2Vcblx0XHQvLyBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIgbGF0ZXIgb25cblx0XHQvLyBSZW1vdmUgaGFzaCB0byBzaW1wbGlmeSB1cmwgbWFuaXB1bGF0aW9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybC5yZXBsYWNlKCByaGFzaCwgXCJcIiApO1xuXG5cdFx0Ly8gTW9yZSBvcHRpb25zIGhhbmRsaW5nIGZvciByZXF1ZXN0cyB3aXRoIG5vIGNvbnRlbnRcblx0XHRpZiAoICFzLmhhc0NvbnRlbnQgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBoYXNoIHNvIHdlIGNhbiBwdXQgaXQgYmFja1xuXHRcdFx0dW5jYWNoZWQgPSBzLnVybC5zbGljZSggY2FjaGVVUkwubGVuZ3RoICk7XG5cblx0XHRcdC8vIElmIGRhdGEgaXMgYXZhaWxhYmxlIGFuZCBzaG91bGQgYmUgcHJvY2Vzc2VkLCBhcHBlbmQgZGF0YSB0byB1cmxcblx0XHRcdGlmICggcy5kYXRhICYmICggcy5wcm9jZXNzRGF0YSB8fCB0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICkgKSB7XG5cdFx0XHRcdGNhY2hlVVJMICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGE7XG5cblx0XHRcdFx0Ly8gIzk2ODI6IHJlbW92ZSBkYXRhIHNvIHRoYXQgaXQncyBub3QgdXNlZCBpbiBhbiBldmVudHVhbCByZXRyeVxuXHRcdFx0XHRkZWxldGUgcy5kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb3IgdXBkYXRlIGFudGktY2FjaGUgcGFyYW0gaWYgbmVlZGVkXG5cdFx0XHRpZiAoIHMuY2FjaGUgPT09IGZhbHNlICkge1xuXHRcdFx0XHRjYWNoZVVSTCA9IGNhY2hlVVJMLnJlcGxhY2UoIHJhbnRpQ2FjaGUsIFwiJDFcIiApO1xuXHRcdFx0XHR1bmNhY2hlZCA9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyAoIG5vbmNlKysgKSArIHVuY2FjaGVkO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQdXQgaGFzaCBhbmQgYW50aS1jYWNoZSBvbiB0aGUgVVJMIHRoYXQgd2lsbCBiZSByZXF1ZXN0ZWQgKGdoLTE3MzIpXG5cdFx0XHRzLnVybCA9IGNhY2hlVVJMICsgdW5jYWNoZWQ7XG5cblx0XHQvLyBDaGFuZ2UgJyUyMCcgdG8gJysnIGlmIHRoaXMgaXMgZW5jb2RlZCBmb3JtIGJvZHkgY29udGVudCAoZ2gtMjY1OClcblx0XHR9IGVsc2UgaWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJlxuXHRcdFx0KCBzLmNvbnRlbn
21167RUeXBlIHx8IFwiXCIgKS5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgKSB7XG5cdFx0XHRzLmRhdGEgPSBzLmRhdGEucmVwbGFjZSggcjIwLCBcIitcIiApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBjb21wbGV0ZWQgKSApIHtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgbm90IGRvbmUgYWxyZWFkeSBhbmQgcmV0dXJuXG5cdFx0XHRyZXR1cm4ganFYSFIuYWJvcnQoKTtcblx0XHR9XG5cblx0XHQvLyBBYm9ydGluZyBpcyBubyBsb25nZXIgYSBjYW5jZWxsYXRpb25cblx0XHRzdHJBYm9ydCA9IFwiYWJvcnRcIjtcblxuXHRcdC8vIEluc3RhbGwgY2FsbGJhY2tzIG9uIGRlZmVycmVkc1xuXHRcdGNvbXBsZXRlRGVmZXJyZWQuYWRkKCBzLmNvbXBsZXRlICk7XG5cdFx0anFYSFIuZG9uZSggcy5zdWNjZXNzICk7XG5cdFx0anFYSFIuZmFpbCggcy5lcnJvciApO1xuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRyZXR1cm4ganFYSFI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRpbWVvdXRcblx0XHRcdGlmICggcy5hc3luYyAmJiBzLnRpbWVvdXQgPiAwICkge1xuXHRcdFx0XHR0aW1lb3V0VGltZXIgPSB3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0anFYSFIuYWJvcnQoIFwidGltZW91dFwiICk7XG5cdFx0XHRcdH0sIHMudGltZW91dCApO1xuXHRcdFx0fVxuXG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb21wbGV0ZWQgPSBmYWxzZTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBSZXRocm93IHBvc3QtY29tcGxldGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgb3RoZXJzIGFzIHJlc3VsdHNcblx0XHRcdFx0ZG9uZSggLTEsIGUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsYmFjayBmb3Igd2hlbiBldmVyeXRoaW5nIGlzIGRvbmVcblx0XHRmdW5jdGlvbiBkb25lKCBzdGF0dXMsIG5hdGl2ZVN0YXR1c1RleHQsIHJlc3BvbnNlcywgaGVhZGVycyApIHtcblx0XHRcdHZhciBpc1N1Y2Nlc3MsIHN1Y2Nlc3MsIGVycm9yLCByZXNwb25zZSwgbW9kaWZpZWQsXG5cdFx0XHRcdHN0YXR1c1RleHQgPSBuYXRpdmVTdGF0dXNUZXh0O1xuXG5cdFx0XHQvLyBJZ25vcmUgcmVwZWF0IGludm9jYXRpb25zXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRjb21wbGV0ZWQgPSB0cnVlO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW
211671lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybi
21167BqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBkYXRhICkgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBjYWxsYmFjaztcblx0XHRcdGNhbGxiYWNrID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gVGhlIHVybCBjYW4gYmUgYW4gb3B0aW9ucyBvYmplY3QgKHdoaWNoIHRoZW4gbXVzdCBoYXZlIC51cmwpXG5cdFx0cmV0dXJuIGpRdWVyeS5hamF4KCBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHR1cmw6IHVybCxcblx0XHRcdHR5cGU6IG1ldGhvZCxcblx0XHRcdGRhdGFUeXBlOiB0eXBlLFxuXHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdHN1Y2Nlc3M6IGNhbGxiYWNrXG5cdFx0fSwgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIHVybCApICYmIHVybCApICk7XG5cdH07XG59ICk7XG5cblxualF1ZXJ5Ll9ldmFsVXJsID0gZnVuY3Rpb24oIHVybCApIHtcblx0cmV0dXJuIGpRdWVyeS5hamF4KCB7XG5cdFx0dXJsOiB1cmwsXG5cblx0XHQvLyBNYWtlIHRoaXMgZXhwbGljaXQsIHNpbmNlIHVzZXIgY2FuIG92ZXJyaWRlIHRoaXMgdGhyb3VnaCBhamF4U2V0dXAgKCMxMTI2NClcblx0XHR0eXBlOiBcIkdFVFwiLFxuXHRcdGRhdGFUeXBlOiBcInNjcmlwdFwiLFxuXHRcdGNhY2hlOiB0cnVlLFxuXHRcdGFzeW5jOiBmYWxzZSxcblx0XHRnbG9iYWw6IGZhbHNlLFxuXHRcdFwidGhyb3dzXCI6IHRydWVcblx0fSApO1xufTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHdyYXBBbGw6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciB3cmFwO1xuXG5cdFx0aWYgKCB0aGlzWyAwIF0gKSB7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdFx0aHRtbCA9IGh0bWwuY2FsbCggdGhpc1sgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRoZSBlbGVtZW50cyB0byB3cmFwIHRoZSB0YXJnZXQgYXJvdW5kXG5cdFx0XHR3cmFwID0galF1ZXJ5KCBodG1sLCB0aGlzWyAwIF0ub3duZXJEb2N1bWVudCApLmVxKCAwICkuY2xvbmUoIHRydWUgKTtcblxuXHRcdFx0aWYgKCB0aGlzWyAwIF0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0d3JhcC5pbnNlcnRCZWZvcmUoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHR3cmFwLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gdGhpcztcblxuXHRcdFx0XHR3aGlsZSAoIGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQgKSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGVsZW0uZmlyc3RFbGVtZW50Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gZWxlbTtcblx0XHRcdH0gKS5hcHBlbmQoIHRoaXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR3cmFwSW5uZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggaHRtbCApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBJbm5lciggaHRtbC5jYWxsKCB0aGlzLCBpICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBzZWxmID0galF1ZXJ5KCB0aGlzICksXG5cdFx0XHRcdGNvbnRlbnRzID0gc2VsZi5jb250ZW50cygpO1xuXG5cdFx0XHRpZiAoIGNvbnRlbnRzLmxlbmd0aCApIHtcblx0XHRcdFx0Y29udGVudHMud3JhcEFsbCggaHRtbCApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRzZWxmLmFwcGVuZCggaHRtbCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHR3cmFwOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgaHRtbElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCBodG1sICk7XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLndyYXBBbGwoIGh0bWxJc0Z1bmN0aW9uID8gaHRtbC5jYWxsKCB0aGlzLCBpICkgOiBodG1sICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdHVud3JhcDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHRoaXMucGFyZW50KCBzZWxlY3RvciApLm5vdCggXCJib2R5XCIgKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeSggdGhpcyApLnJlcGxhY2VXaXRoKCB0aGlzLmNoaWxkTm9kZXMgKTtcblx0XHR9ICk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmhpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gIWpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSggZWxlbSApO1xufTtcbmpRdWVyeS5leHByLnBzZXVkb3MudmlzaWJsZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4gISEoIGVsZW0ub2Zmc2V0V2lkdGggfHwgZWxlbS5vZmZzZXRIZWlnaHQgfHwgZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCApO1xufTtcblxuXG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHQvLyAjMTQ1MDogc29tZXRpbWVzIElFIHJldHVybnMgMTIyMyB3aGVuIGl0IHNob3VsZCBiZSAyMDRcblx0XHQxMjIzOiAyMDRcblx0fSxcblx0eGhyU3VwcG9ydGVkID0galF1ZXJ5LmFqYXhTZXR0aW5ncy54aHI
21167oKTtcblxuc3VwcG9ydC5jb3JzID0gISF4aHJTdXBwb3J0ZWQgJiYgKCBcIndpdGhDcmVkZW50aWFsc1wiIGluIHhoclN1cHBvcnRlZCApO1xuc3VwcG9ydC5hamF4ID0geGhyU3VwcG9ydGVkID0gISF4aHJTdXBwb3J0ZWQ7XG5cbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBmdW5jdGlvbiggb3B0aW9ucyApIHtcblx0dmFyIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrO1xuXG5cdC8vIENyb3NzIGRvbWFpbiBvbmx5IGFsbG93ZWQgaWYgc3VwcG9ydGVkIHRocm91Z2ggWE1MSHR0cFJlcXVlc3Rcblx0aWYgKCBzdXBwb3J0LmNvcnMgfHwgeGhyU3VwcG9ydGVkICYmICFvcHRpb25zLmNyb3NzRG9tYWluICkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggaGVhZGVycywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHZhciBpLFxuXHRcdFx0XHRcdHhociA9IG9wdGlvbnMueGhyKCk7XG5cblx0XHRcdFx0eGhyLm9wZW4oXG5cdFx0XHRcdFx0b3B0aW9ucy50eXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMudXJsLFxuXHRcdFx0XHRcdG9wdGlvbnMuYXN5bmMsXG5cdFx0XHRcdFx0b3B0aW9ucy51c2VybmFtZSxcblx0XHRcdFx0XHRvcHRpb25zLnBhc3N3b3JkXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gQXBwbHkgY3VzdG9tIGZpZWxkcyBpZiBwcm92aWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdGZvciAoIGkgaW4gb3B0aW9ucy54aHJGaWVsZHMgKSB7XG5cdFx0XHRcdFx0XHR4aHJbIGkgXSA9IG9wdGlvbnMueGhyRmllbGRzWyBpIF07XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGUgbWltZSB0eXBlIGlmIG5lZWRlZFxuXHRcdFx0XHRpZiAoIG9wdGlvbnMubWltZVR5cGUgJiYgeGhyLm92ZXJyaWRlTWltZVR5cGUgKSB7XG5cdFx0XHRcdFx0eGhyLm92ZXJyaWRlTWltZVR5cGUoIG9wdGlvbnMubWltZVR5cGUgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFgtUmVxdWVzdGVkLVdpdGggaGVhZGVyXG5cdFx0XHRcdC8vIEZvciBjcm9zcy1kb21haW4gcmVxdWVzdHMsIHNlZWluZyBhcyBjb25kaXRpb25zIGZvciBhIHByZWZsaWdodCBhcmVcblx0XHRcdFx0Ly8gYWtpbiB0byBhIGppZ3NhdyBwdXp6bGUsIHdlIHNpbXBseSBuZXZlciBzZXQgaXQgdG8gYmUgc3VyZS5cblx0XHRcdFx0Ly8gKGl0IGNhbiBhbHdheXMgYmUgc2V0IG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMgb3IgZXZlbiB1c2luZyBhamF4U2V0dXApXG5cdFx0XHRcdC8vIEZvciBzYW1lLWRvbWFpbiByZXF1ZXN0cywgd29uJ3QgY2hhbmdlIGhlYWRlciBpZiBhbHJlYWR5IHByb3ZpZGVkLlxuXHRcdFx0XHRpZiAoICFvcHRpb25zLmNyb3NzRG9tYWluICYmICFoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdICkge1xuXHRcdFx0XHRcdGhlYWRlcnNbIFwiWC1SZXF1ZXN0ZWQtV2l0aFwiIF0gPSBcIlhNTEh0dHBSZXF1
21167ZXN0XCI7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTZXQgaGVhZGVyc1xuXHRcdFx0XHRmb3IgKCBpIGluIGhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0eGhyLnNldFJlcXVlc3RIZWFkZXIoIGksIGhlYWRlcnNbIGkgXSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRjYWxsYmFjayA9IGVycm9yQ2FsbGJhY2sgPSB4aHIub25sb2FkID1cblx0XHRcdFx0XHRcdFx0XHR4aHIub25lcnJvciA9IHhoci5vbmFib3J0ID0geGhyLm9udGltZW91dCA9XG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDtcblxuXHRcdFx0XHRcdFx0XHRpZiAoIHR5cGUgPT09IFwiYWJvcnRcIiApIHtcblx0XHRcdFx0XHRcdFx0XHR4aHIuYWJvcnQoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmICggdHlwZSA9PT0gXCJlcnJvclwiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0geGhyLm9udGltZW91dCA9IGNhbGxiYWNrKCBcImVycm9yXCIgKTtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHRcdFx0Ly8gVXNlIG9ucmVhZHlzdGF0ZWNoYW5nZSB0byByZXBsYWNlIG9uYWJvcnRcblx0XHRcdFx0Ly8gdG8gaGFuZGxlIHVuY2F1Z2h0IGFib3J0c1xuXHRcdFx0XHRpZiAoIHhoci5vbmFib3J0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0eGhyLm9uYWJvcnQgPSBlcnJvckNhbGxiYWNrO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHRcdFx0Ly8gQ2hlY2sgcmVhZHlTdGF0ZSBiZWZvcmUgdGltZW91dCBhcyBpdCBjaGFuZ2VzXG5cdFx0XHRcdFx0XHRpZiAoIHhoci5yZWFkeVN0YXRlID09PSA0ICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFsbG93IG9uZXJyb3IgdG8gYmUgY2FsbGVkIGZpcnN0LFxuXHRcdFx0XHRcdFx0XHQvLyBidXQgdGhhdCB3aWxsIG5vdCBoYW5kbGUgYSBuYXRpdmUgYWJvcnRcblx0XHRcdFx0XHRcdFx0Ly8gQWxzbywgc2F2ZSBlcnJvckNhbGxiYWNrIHRvIGEgdmFyaWFibGVcblx0XHRcdFx0XHRcdFx0Ly8gYXMgeGhyLm9uZXJyb3IgY2Fubm90IGJlIGFjY2Vzc2VkXG5cdFx0XHRcdFx0XHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0ZXJyb3JDYWxsYmFjaygpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBDcmVhdGUgdGhlIGFib3J0IGNhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gY2FsbGJhY2soIFwiYWJvcnRcIiApO1xuXG5cdFx0XHRcdHRyeSB7XG5cblx0XHRcdFx0XHQvLyBEbyBzZW5kIHRoZSByZXF1ZXN0ICh0aGlzIG1heSByYWlzZSBhbiBleGNlcHRpb24pXG5cdFx0XHRcdFx0eGhyLnNlbmQoIG9wdGlvbnMuaGFzQ29udGVudCAmJiBvcHRpb25zLmRhdGEgfHwgbnVsbCApO1xuXHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdC8vICMxNDY4MzogT25seSByZXRocm93IGlmIHRoaXMgaGFzbid0IGJlZW4gbm90aWZpZWQgYXMgYW4gZXJyb3IgeWV0XG5cdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdHRocm93IGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gUHJldmVudCBhdXRvLWV4ZWN1dGlvbiBvZiBzY3JpcHRzIHdoZW4gbm8gZXhwbGljaXQgZGF0YVR5cGUgd2FzIHByb3ZpZGVkIChTZWUgZ2gtMjQzMilcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMuY29udGVudHMuc2NyaXB0ID0gZmFsc2U7XG5cdH1cbn0gKTtcblxuLy8gSW5zdGFsbCBzY3JpcHQgZGF0YVR5cGVcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0YWNjZXB0czoge1xuXHRcdHNjcmlwdDogXCJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIFwiICtcblx0XHRcdFwiYXBwbGljYXRpb24vZWNtYXNjcmlwdCwgYXBwbGljYXRpb24veC1lY21hc2NyaXB0XCJcblx0fSxcblx0Y29udGVudHM6IHtcblx0XHRzY3JpcHQ6IC9cXGIoPzpqYXZhfGVjbWEpc2NyaXB0XFxiL1xuXHR9LFxuXHRjb252ZXJ0ZXJzOiB7XG5cdFx0XCJ0ZXh0IHNjcmlwdFwiOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCB0ZXh0ICk7XG5cdFx0XHRyZXR1cm4gdGV4dDtcblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSGFuZGxlIGNhY2hlJ3Mgc3BlY2lhbCBjYXNlIGFuZCBjcm9zc0RvbWFpblxualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXHRpZiAoIHMuY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRzLmNhY2hlID0gZmFsc2U7XG5cdH1cblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHMudHlwZSA9IFwiR0VUXCI7XG5cdH1cbn0gKTtcblxuLy8gQmluZCBzY3JpcHQgdGFnIGhhY2sgdHJhbnNwb3J0XG5qUXVlcnkuYWpheFRyYW5zcG9ydCggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cblx0Ly8gVGhpcyB0cmFuc3BvcnQgb25seSBkZWFscyB3aXRoIGNyb3NzIGRvbWFpbiByZXF1
21167ZXN0c1xuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0dmFyIHNjcmlwdCwgY2FsbGJhY2s7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHNlbmQ6IGZ1bmN0aW9uKCBfLCBjb21wbGV0ZSApIHtcblx0XHRcdFx0c2NyaXB0ID0galF1ZXJ5KCBcIjxzY3JpcHQ+XCIgKS5wcm9wKCB7XG5cdFx0XHRcdFx0Y2hhcnNldDogcy5zY3JpcHRDaGFyc2V0LFxuXHRcdFx0XHRcdHNyYzogcy51cmxcblx0XHRcdFx0fSApLm9uKFxuXHRcdFx0XHRcdFwibG9hZCBlcnJvclwiLFxuXHRcdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIGV2dCApIHtcblx0XHRcdFx0XHRcdHNjcmlwdC5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0gbnVsbDtcblx0XHRcdFx0XHRcdGlmICggZXZ0ICkge1xuXHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggZXZ0LnR5cGUgPT09IFwiZXJyb3JcIiA/IDQwNCA6IDIwMCwgZXZ0LnR5cGUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Ly8gVXNlIG5hdGl2ZSBET00gbWFuaXB1bGF0aW9uIHRvIGF2b2lkIG91ciBkb21NYW5pcCBBSkFYIHRyaWNrZXJ5XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdFsgMCBdICk7XG5cdFx0XHR9LFxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbnZhciBvbGRDYWxsYmFja3MgPSBbXSxcblx0cmpzb25wID0gLyg9KVxcPyg/PSZ8JCl8XFw/XFw/LztcblxuLy8gRGVmYXVsdCBqc29ucCBzZXR0aW5nc1xualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRqc29ucDogXCJjYWxsYmFja1wiLFxuXHRqc29ucENhbGxiYWNrOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgY2FsbGJhY2sgPSBvbGRDYWxsYmFja3MucG9wKCkgfHwgKCBqUXVlcnkuZXhwYW5kbyArIFwiX1wiICsgKCBub25jZSsrICkgKTtcblx0XHR0aGlzWyBjYWxsYmFjayBdID0gdHJ1ZTtcblx0XHRyZXR1cm4gY2FsbGJhY2s7XG5cdH1cbn0gKTtcblxuLy8gRGV0ZWN0LCBub3JtYWxpemUgb3B0aW9ucyBhbmQgaW5zdGFsbCBjYWxsYmFja3MgZm9yIGpzb25wIHJlcXVlc3RzXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJqc29uIGpzb25wXCIsIGZ1bmN0aW9uKCBzLCBvcmlnaW5hbFNldHRpbmdzLCBqcVhIUiApIHtcblxuXHR2YXIgY2FsbGJhY2tOYW1lLCBvdmVyd3JpdHRlbiwgcmVzcG9uc2VDb250YWluZXIsXG5cdFx0anNvblByb3AgPSBzLmpzb25wICE9PSBmYWxzZSAmJiAoIHJqc29ucC50ZXN0KCBzLnVybCApID9cblx0XHRcdFwidXJsXCIgOlxuXHRcdFx0dHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQoIHMuY29udGVudFR5cGUgfHwgXCJcIiApXG5cdFx0XHRcdFx0LmluZGV4T2YoIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIgKSA9PT0gMCAmJlxuXHRcdFx0XHRyanNvbnAudGVzdCggcy5kYXRhICkgJiYgXCJkYXRhXCJcblx0XHQpO1xuXG5cdC8vIEhhbmRsZSBpZmYgdGhlIGV4cGVjdGVkIGRhdGEgdHlwZSBpcyBcImpzb25wXCIgb3Igd2UgaGF2ZSBhIHBhcmFtZXRlciB0byBzZXRcblx0aWYgKCBqc29uUHJvcCB8fCBzLmRhdGFUeXBlc1sgMCBdID09PSBcImpzb25wXCIgKSB7XG5cblx0XHQvLyBHZXQgY2FsbGJhY2sgbmFtZSwgcmVtZW1iZXJpbmcgcHJlZXhpc3RpbmcgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIGl0XG5cdFx0Y2FsbGJhY2tOYW1lID0gcy5qc29ucENhbGxiYWNrID0gaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGlzRnVuY3Rpb24oIG92ZXJ3cml0dGVuICkgKSB7XG5cdFx0XHRcdG92ZXJ3cml0dGVuKCByZXNwb25zZUNvbnRhaW5lclsgMCBdICk7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gb3ZlcndyaXR0ZW4gPSB1bmRlZmluZWQ7XG5cdFx0fSApO1xuXG5cdFx0Ly8gRGVsZWdhdGUgdG8gc2NyaXB0XG5cdFx0cmV0dXJuIFwic2NyaXB0XCI7XG5cdH1cbn0gKTtcblxuXG5cblxuLy8gU3VwcG9ydDogU2FmYXJpIDggb25seVxuLy8gSW4gU2FmYXJpIDggZG9jdW1lbnRzIGNyZWF0ZWQgdmlhIGRvY3VtZW50LmltcGxlbWVudGF0aW9uLm
21167NyZWF0ZUhUTUxEb2N1bWVudFxuLy8gY29sbGFwc2Ugc2libGluZyBmb3JtczogdGhlIHNlY29uZCBvbmUgYmVjb21lcyBhIGNoaWxkIG9mIHRoZSBmaXJzdCBvbmUuXG4vLyBCZWNhdXNlIG9mIHRoYXQsIHRoaXMgc2VjdXJpdHkgbWVhc3VyZSBoYXMgdG8gYmUgZGlzYWJsZWQgaW4gU2FmYXJpIDguXG4vLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MzM3XG5zdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCA9ICggZnVuY3Rpb24oKSB7XG5cdHZhciBib2R5ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICkuYm9keTtcblx0Ym9keS5pbm5lckhUTUwgPSBcIjxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+XCI7XG5cdHJldHVybiBib2R5LmNoaWxkTm9kZXMubGVuZ3RoID09PSAyO1xufSApKCk7XG5cblxuLy8gQXJndW1lbnQgXCJkYXRhXCIgc2hvdWxkIGJlIHN0cmluZyBvZiBodG1sXG4vLyBjb250ZXh0IChvcHRpb25hbCk6IElmIHNwZWNpZmllZCwgdGhlIGZyYWdtZW50IHdpbGwgYmUgY3JlYXRlZCBpbiB0aGlzIGNvbnRleHQsXG4vLyBkZWZhdWx0cyB0byBkb2N1bWVudFxuLy8ga2VlcFNjcmlwdHMgKG9wdGlvbmFsKTogSWYgdHJ1ZSwgd2lsbCBpbmNsdWRlIHNjcmlwdHMgcGFzc2VkIGluIHRoZSBodG1sIHN0cmluZ1xualF1ZXJ5LnBhcnNlSFRNTCA9IGZ1bmN0aW9uKCBkYXRhLCBjb250ZXh0LCBrZWVwU2NyaXB0cyApIHtcblx0aWYgKCB0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXG5cdHZhciBiYXNlLCBwYXJzZWQsIHNjcmlwdHM7XG5cblx0aWYgKCAhY29udGV4dCApIHtcblxuXHRcdC8vIFN0b3Agc2NyaXB0cyBvciBpbmxpbmUgZXZlbnQgaGFuZGxlcnMgZnJvbSBiZWluZyBleGVjdXRlZCBpbW1lZGlhdGVseVxuXHRcdC8vIGJ5IHVzaW5nIGRvY3VtZW50LmltcGxlbWVudGF0aW9uXG5cdFx0aWYgKCBzdXBwb3J0LmNyZWF0ZUhUTUxEb2N1bWVudCApIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIFwiXCIgKTtcblxuXHRcdFx0Ly8gU2V0IHRoZSBiYXNlIGhyZWYgZm9yIHRoZSBjcmVhdGVkIGRvY3VtZW50XG5cdFx0XHQvLyBzbyBhbnkgcGFyc2VkIGVsZW1lbnRzIHdpdGggVVJMc1xuXHRcdFx0Ly8gYXJlIGJhc2VkIG9uIHRoZSBkb2N1bWVudCdzIFVSTCAoZ2gtMjk2NSlcblx0XHRcdGJhc2UgPSBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiYmFzZVwiICk7XG5cdFx0XHRiYXNlLmhyZWYgPSBkb2N1bWVudC5sb2NhdGlvbi5ocmVmO1xuXHRcdFx0Y29udGV4dC5oZWFkLmFwcGVuZENoaWxkKCBiYXNlICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnRleHQgPSBkb2N1bWVudDtcblx0XHR9XG5cdH1cblxuXHRwYXJzZWQgPSByc2luZ2xlVGFnLmV4ZWMoIGRhdGEgKTtcblx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLyoqXG4gKiBMb2FkIGEgdXJsIGludG8gYSBwYWdlXG4gKi9cbmpRdWVyeS5mbi5sb2FkID0gZnVuY3Rpb24oIHVybCwgcGFyYW1zLCBjYWxsYmFjayApIHtcblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0gc3RyaXBBbmRDb2xsYXBzZSggdXJsLnNsaWNlKCBvZmYgKSApO1xuXHRcdHVybCA9IHVybC5zbGljZSggMCwgb2ZmICk7XG5cdH1cblxuXHQvLyBJZiBpdCdzIGEgZnVuY3Rpb25cblx0aWYgKCBpc0Z1bmN0aW9uKCBwYXJhbXMgKSApIHtcblxuXHRcdC8vIFdlIGFzc3VtZSB0aGF0IGl0J3MgdGhlIGNhbGxiYWNrXG5cdFx0Y2FsbGJhY2sgPSBwYXJhbXM7XG5cdFx0cGFyYW1zID0gdW5kZWZpbmVkO1xuXG5cdC8vIE90aGVyd2lzZSwgYnVpbGQgYSBwYXJhbSBzdHJpbmdcblx0fSBlbHNlIGlmICggcGFyYW1zICYmIHR5cGVvZiBwYXJhbXMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0dHlwZSA9IFwiUE9TVFwiO1xuXHR9XG5cblx0Ly8gSWYgd2UgaGF2ZSBlbGVtZW50cyB0byBtb2RpZnksIG1ha2UgdGhlIHJlcXVlc3Rcblx0aWYgKCBzZWxmLmxlbmd0aCA+IDAgKSB7XG5cdFx0alF1ZXJ5LmFqYXgoIHtcblx0XHRcdHVybDogdXJsLFxuXG5cdFx0XHQvLyBJZiBcInR5cGVcIiB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZW4gXCJHRVRcIiBtZXRob2Qgd2lsbCBiZSB1c2VkLlxuXHRcdFx0Ly8gTWFrZSB2YWx1ZSBvZiB0aGlzIGZpZWxkIGV4cGxpY2l0IHNpbmNlXG5cdFx0XHQvLyB1c2VyIGNhbiBvdmVycmlkZSBpdCB0aHJvdWdoIGFqYXhTZXR1cCBtZXRob2Rcblx0XHRcdHR5cGU6IHR5cGUgfHwgXCJHRVRcIixcblx0XHRcdGRhdGFUeXBlOiBcImh0bWxcIixcblx0XHRcdGRhdGE6IHBhcmFtc1xuXHRcdH0gKS5kb25lKCBmdW5jdGlvbiggcmVzcG9uc2VUZXh0ICkge1xuXG5cdFx0XHQvLyBTYXZlIHJlc3BvbnNlIGZvciB1c2UgaW4gY29tcGxldGUgY2FsbGJhY2tcblx0XHRcdHJlc3BvbnNlID0gYXJndW1lbnRzO1xuXG5cdFx0XHRzZWxmLmh0bWwoIHNlbGVjdG9yID9cblxuXHRcdFx0XHQvLyBJZiBhIHNlbGVjdG9yIHdhcyBzcGVjaWZpZWQsIGxvY2F0ZSB0aGUgcmlnaHQgZWxlbWVudHMgaW4gYSBkdW1teSBkaXZcblx0XHRcdFx0Ly8gRXhjbHVkZSBzY3JpcHRzIHRvIGF2b2lkIElFICdQZXJtaXNzaW9uIERlbmllZCcgZXJyb3JzXG5cdFx0XHRcdGpRdWVyeSggXCI8ZGl2PlwiICkuYXBwZW5kKCBqUXVlcnkucGFyc2VIVE1MKCByZXNwb25zZVRleHQgKSApLmZpbmQoIHNlbGVjdG9yICkgOlxuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSB1c2UgdGhlIGZ1bGwgcmVzdWx0XG5cdFx0XHRcdHJlc3BvbnNlVGV4dCApO1xuXG5cdFx0Ly8gSWYgdGhlIHJlcXVlc3Qgc3VjY2VlZHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImRhdGFcIiwgXCJzdGF0dXNcIiwgXCJqcVhIUlwiXG5cdFx0Ly8gYnV0IHRoZXkgYXJlIGlnbm9yZWQgYmVjYXVzZSByZXNwb25zZSB3YXMgc2V0IGFib3ZlLlxuXHRcdC8vIElmIGl0IGZhaWxzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJqcVhIUlwiLCBcInN0YXR1c1wiLCBcImVycm9yXCJcblx0XHR9ICkuYWx3YXlzKCBjYWxsYmFjayAmJiBmdW5jdGlvbigganFYSF
21167IsIHN0YXR1cyApIHtcblx0XHRcdHNlbGYuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGNhbGxiYWNrLmFwcGx5KCB0aGlzLCByZXNwb25zZSB8fCBbIGpxWEhSLnJlc3BvbnNlVGV4dCwgc3RhdHVzLCBqcVhIUiBdICk7XG5cdFx0XHR9ICk7XG5cdFx0fSApO1xuXHR9XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5cblxuXG4vLyBBdHRhY2ggYSBidW5jaCBvZiBmdW5jdGlvbnMgZm9yIGhhbmRsaW5nIGNvbW1vbiBBSkFYIGV2ZW50c1xualF1ZXJ5LmVhY2goIFtcblx0XCJhamF4U3RhcnRcIixcblx0XCJhamF4U3RvcFwiLFxuXHRcImFqYXhDb21wbGV0ZVwiLFxuXHRcImFqYXhFcnJvclwiLFxuXHRcImFqYXhTdWNjZXNzXCIsXG5cdFwiYWpheFNlbmRcIlxuXSwgZnVuY3Rpb24oIGksIHR5cGUgKSB7XG5cdGpRdWVyeS5mblsgdHlwZSBdID0gZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiB0aGlzLm9uKCB0eXBlLCBmbiApO1xuXHR9O1xufSApO1xuXG5cblxuXG5qUXVlcnkuZXhwci5wc2V1ZG9zLmFuaW1hdGVkID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdHJldHVybiBqUXVlcnkuZ3JlcCggalF1ZXJ5LnRpbWVycywgZnVuY3Rpb24oIGZuICkge1xuXHRcdHJldHVybiBlbGVtID09PSBmbi5lbGVtO1xuXHR9ICkubGVuZ3RoO1xufTtcblxuXG5cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gP
21167SBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBvcHRpb25zICkgKSB7XG5cblx0XHRcdC8vIFVzZSBqUXVlcnkuZXh0ZW5kIGhlcmUgdG8gYWxsb3cgbW9kaWZpY2F0aW9uIG9mIGNvb3JkaW5hdGVzIGFyZ3VtZW50IChnaC0xODQ4KVxuXHRcdFx0b3B0aW9ucyA9IG9wdGlvbnMuY2FsbCggZWxlbSwgaSwgalF1ZXJ5LmV4dGVuZCgge30sIGN1ck9mZnNldCApICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBvcHRpb25zLnRvcCAhPSBudWxsICkge1xuXHRcdFx0cHJvcHMudG9wID0gKCBvcHRpb25zLnRvcCAtIGN1ck9mZnNldC50b3AgKSArIGN1clRvcDtcblx0XHR9XG5cdFx0aWYgKCBvcHRpb25zLmxlZnQgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLmxlZnQgPSAoIG9wdGlvbnMubGVmdCAtIGN1ck9mZnNldC5sZWZ0ICkgKyBjdXJMZWZ0O1xuXHRcdH1cblxuXHRcdGlmICggXCJ1c2luZ1wiIGluIG9wdGlvbnMgKSB7XG5cdFx0XHRvcHRpb25zLnVzaW5nLmNhbGwoIGVsZW0sIHByb3BzICk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y3VyRWxlbS5jc3MoIHByb3BzICk7XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gb2Zmc2V0KCkgcmVsYXRlcyBhbiBlbGVtZW50J3MgYm9yZGVyIGJveCB0byB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9mZnNldDogZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cblx0XHQvLyBQcmVzZXJ2ZSBjaGFpbmluZyBmb3Igc2V0dGVyXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRcdHRoaXMgOlxuXHRcdFx0XHR0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRcdGpRdWVyeS5vZmZzZXQuc2V0T2Zmc2V0KCB0aGlzLCBvcHRpb25zLCBpICk7XG5cdFx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHR2YXIgcmVjdCwgd2luLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWVsZW0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHplcm9zIGZvciBkaXNjb25uZWN0ZWQgYW5kIGhpZGRlbiAoZGlzcGxheTogbm9uZSkgZWxlbWVudHMgKGdoLTIzMTApXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdFx0Ly8gUnVubmluZyBnZXRCb3VuZGluZ0NsaWVudFJlY3Qgb24gYVxuXHRcdC8vIGRpc2Nvbm5lY3RlZCBub2RlIGluIElFIHRocm93cyBhbiBlcnJvclxuXHRcdGlmICggIWVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKSB7XG5cdFx0XHRyZXR1cm4geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblx0XHR9XG5cblx0XHQvLyBHZXQgZG9jdW1lbnQtcmVsYXRpdmUgcG9zaXRpb24gYnkgYWRkaW5nIHZpZXdwb3J0IHNjcm9sbCB0byB2aWV3cG9ydC1yZWxhdGl2ZSBnQkNSXG5cdFx0cmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cdFx0d2luID0gZWxlbS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IHJlY3QudG9wICsgd2luLnBhZ2VZT2Zmc2V0LFxuXHRcdFx0bGVmdDogcmVjdC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0XG5cdFx0fTtcblx0fSxcblxuXHQvLyBwb3NpdGlvbigpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIG1hcmdpbiBib3ggdG8gaXRzIG9mZnNldCBwYXJlbnQncyBwYWRkaW5nIGJveFxuXHQvLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiZWhhdmlvciBvZiBDU1MgYWJzb2x1dGUgcG9zaXRpb25pbmdcblx0cG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggIXRoaXNbIDAgXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgb2Zmc2V0UGFyZW50LCBvZmZzZXQsIGRvYyxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gcG9zaXRpb246Zml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHRoZSB2aWV3cG9ydCwgd2hpY2ggaXRzZWxmIGFsd2F5cyBoYXMgemVybyBvZmZzZXRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBwb3NpdGlvbjpmaXhlZCBpbXBsaWVzIGF2YWlsYWJpbGl0eSBvZiBnZXRCb3VuZGluZ0NsaWVudFJlY3Rcblx0XHRcdG9mZnNldCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0b2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTtcblxuXHRcdFx0Ly8gQWNjb3VudCBmb3IgdGhlICpyZWFsKiBvZmZzZXQgcGFyZW50LCB3aGljaCBjYW4gYmUgdGhlIGRvY3VtZW50IG9yIGl0cyByb290IGVsZW1lbnRcblx0XHRcdC8vIHdoZW4gYSBzdGF0aWNhbGx5IHBvc2l0aW9uZWQgZWxlbWVudCBpcyBpZGVudGlmaWVkXG5cdFx0XHRkb2MgPSBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSBlbGVtLm9mZnNldFBhcmVudCB8fCBkb2MuZG9jdW1lbnRFbGVtZW50O1xuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiZcblx0XHRcdFx0KCBvZmZzZXRQYXJlbnQgPT09IGRvYy5ib2R5IHx8IG9mZnNldFBhcmVudCA9PT0gZG9jLmRvY3VtZW50RWxlbWVudCApICYmXG5cdFx0XHRcdGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJwb3NpdGlvblwiICkgPT09IFwic3RhdGljXCIgKSB7XG5cblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50LnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIG9mZnNldFBhcmVudCAmJiBvZmZzZXRQYXJlbnQgIT09IGVsZW0gJiYgb2Zmc2V0UGFyZW50Lm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdC8vIEluY29ycG9yYXRlIGJvcmRlcnMgaW50byBpdHMgb2Zmc2V0LCBzaW5jZSB0aGV5IGFyZSBvdXRzaWRlIGl0cyBjb250ZW50IG9yaWdpblxuXHRcdFx0XHRwYXJlbnRPZmZzZXQgPSBqUXVlcnkoIG9mZnNldFBhcmVudCApLm9mZnNldCgpO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQudG9wICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJUb3BXaWR0aFwiLCB0cnVlICk7XG5cdFx0XHRcdHBhcmVudE9mZnNldC5sZWZ0ICs9IGpRdWVyeS5jc3MoIG9mZnNldFBhcmVudCwgXCJib3JkZXJMZWZ0V2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFN1YnRyYWN0IHBhcmVudCBvZmZzZXRzIGFuZCBlbGVtZW50IG1hcmdpbnNcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiBvZmZzZXQudG9wIC0gcGFyZW50T2Zmc2V0LnRvcCAtIGpRdWVyeS5jc3MoIGVsZW0sIFwibWFyZ2luVG9wXCIsIHRydWUgKSxcblx0XHRcdGxlZnQ6IG9mZnNldC5sZWZ0IC0gcGFyZW50T2Zmc2V0LmxlZnQgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiwgdHJ1ZSApXG5cdFx0fTtcblx0fSxcblxuXHQvLyBUaGlzIG1ldGhvZCB3aWxsIHJldHVybi
21167Bkb2N1bWVudEVsZW1lbnQgaW4gdGhlIGZvbGxvd2luZyBjYXNlczpcblx0Ly8gMSkgRm9yIHRoZSBlbGVtZW50IGluc2lkZSB0aGUgaWZyYW1lIHdpdGhvdXQgb2Zmc2V0UGFyZW50LCB0aGlzIG1ldGhvZCB3aWxsIHJldHVyblxuXHQvLyAgICBkb2N1bWVudEVsZW1lbnQgb2YgdGhlIHBhcmVudCB3aW5kb3dcblx0Ly8gMikgRm9yIHRoZSBoaWRkZW4gb3IgZGV0YWNoZWQgZWxlbWVudFxuXHQvLyAzKSBGb3IgYm9keSBvciBodG1sIGVsZW1lbnQsIGkuZS4gaW4gY2FzZSBvZiB0aGUgaHRtbCBub2RlIC0gaXQgd2lsbCByZXR1cm4gaXRzZWxmXG5cdC8vXG5cdC8vIGJ1dCB0aG9zZSBleGNlcHRpb25zIHdlcmUgbmV2ZXIgcHJlc2VudGVkIGFzIGEgcmVhbCBsaWZlIHVzZS1jYXNlc1xuXHQvLyBhbmQgbWlnaHQgYmUgY29uc2lkZXJlZCBhcyBtb3JlIHByZWZlcmFibGUgcmVzdWx0cy5cblx0Ly9cblx0Ly8gVGhpcyBsb2dpYywgaG93ZXZlciwgaXMgbm90IGd1YXJhbnRlZWQgYW5kIGNhbiBjaGFuZ2UgYXQgYW55IHBvaW50IGluIHRoZSBmdXR1cmVcblx0b2Zmc2V0UGFyZW50OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIG9mZnNldFBhcmVudCA9IHRoaXMub2Zmc2V0UGFyZW50O1xuXG5cdFx0XHR3aGlsZSAoIG9mZnNldFBhcmVudCAmJiBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXHRcdFx0XHRvZmZzZXRQYXJlbnQgPSBvZmZzZXRQYXJlbnQub2Zmc2V0UGFyZW50O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gb2Zmc2V0UGFyZW50IHx8IGRvY3VtZW50RWxlbWVudDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuLy8gQ3JlYXRlIHNjcm9sbExlZnQgYW5kIHNjcm9sbFRvcCBtZXRob2RzXG5qUXVlcnkuZWFjaCggeyBzY3JvbGxMZWZ0OiBcInBhZ2VYT2Zmc2V0XCIsIHNjcm9sbFRvcDogXCJwYWdlWU9mZnNldFwiIH0sIGZ1bmN0aW9uKCBtZXRob2QsIHByb3AgKSB7XG5cdHZhciB0b3AgPSBcInBhZ2VZT2Zmc2V0XCIgPT09IHByb3A7XG5cblx0alF1ZXJ5LmZuWyBtZXRob2QgXSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG1ldGhvZCwgdmFsICkge1xuXG5cdFx0XHQvLyBDb2FsZXNjZSBkb2N1bWVudHMgYW5kIHdpbmRvd3Ncblx0XHRcdHZhciB3aW47XG5cdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cdFx0XHRcdHdpbiA9IGVsZW07XG5cdFx0XHR9IGVsc2UgaWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtLmRlZmF1bHRWaWV3O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHZhbCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gd2luID8gd2luWyBwcm9wIF0gOiBlbGVtWyBtZXRob2QgXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB3aW4gKSB7XG5cdFx0XHRcdHdpbi5zY3JvbGxUbyhcblx0XHRcdFx0XHQhdG9wID8gdmFsIDogd2luLnBhZ2VYT2Zmc2V0LFxuXHRcdFx0XHRcdHRvcCA/IHZhbCA6IHdpbi5wYWdlWU9mZnNldFxuXHRcdFx0XHQpO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtWyBtZXRob2QgXSA9IHZhbDtcblx0XHRcdH1cblx0XHR9LCBtZXRob2QsIHZhbCwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9O1xufSApO1xuXG4vLyBTdXBwb3J0OiBTYWZhcmkgPD03IC0gOS4xLCBDaHJvbWUgPD0zNyAtIDQ5XG4vLyBBZGQgdGhlIHRvcC9sZWZ0IGNzc0hvb2tzIHVzaW5nIGpRdWVyeS5mbi5wb3NpdGlvblxuLy8gV2Via2l0IGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTI5MDg0XG4vLyBCbGluayBidWc6IGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTU4OTM0N1xuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggaXNXaW5kb3coIGVsZW0gKSApIHtcblxuXHRcdFx0XHRcdC8vICQoIHdpbmRvdyApLm91dGVyV2lkdGgvSGVpZ2h0IHJldHVybi
21167B3L2ggaW5jbHVkaW5nIHNjcm9sbGJhcnMgKGdoLTE3MjkpXG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmNOYW1lLmluZGV4T2YoIFwib3V0ZXJcIiApID09PSAwID9cblx0XHRcdFx0XHRcdGVsZW1bIFwiaW5uZXJcIiArIG5hbWUgXSA6XG5cdFx0XHRcdFx0XHRlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCByZXNpemUgc2Nyb2xsIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuLy8gYXJndW1lbnRzLlxuLy8galF1ZXJ5LnByb3h5IGlzIGRlcHJlY2F0ZWQgdG8gcHJvbW90ZSBzdGFuZGFyZHMgKHNwZWNpZmljYWxseSBGdW5jdGlvbiNiaW5kKVxuLy8gSG93ZXZlciwgaXQgaXMgbm90IHNsYXRlZCBmb3IgcmVtb3ZhbCBhbnkgdGltZSBzb29uXG5qUXVlcnkucHJveHkgPSBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdHZhciB0bXAsIGFyZ3MsIHByb3h5O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRjb250ZXh0ID0gZm47XG5cdFx0Zm4gPSB0bXA7XG5cdH1cblxuXHQvLyBRdWljayBjaGVjayB0byBkZXRlcm1pbmUgaWYgdGFyZ2V0IGlzIGNhbGxhYmxlLCBpbiB0aGUgc3BlY1xuXHQvLyB0aGlzIHRocm93cyBhIFR5cGVFcnJvciwgYnV0IHdlIHdpbGwganVzdCByZXR1cm4gdW5kZWZpbmVkLlxuXHRpZiAoICFpc0Z1bmN0aW9uKCBmbiApICkge1xuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHQvLyBTaW11bGF0ZWQgYmluZFxuXHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdHByb3h5ID0gZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGZuLmFwcGx5KCBjb250ZXh0IHx8IHRoaXMsIGFyZ3MuY29uY2F0KCBzbGljZS5jYWxsKCBhcmd1bWVudHMgKSApICk7XG5cdH07XG5cblx0Ly8gU2V0IHRoZSBndWlkIG9mIHVuaXF1ZSBoYW5kbGVyIHRvIHRoZSBzYW1lIG9mIG9yaWdpbmFsIGhhbmRsZXIsIHNvIGl0IGNhbiBiZSByZW1vdmVkXG5cdHByb3h5Lmd1aWQgPSBmbi5ndWlkID0gZm4uZ3VpZCB8fCBqUXVlcnkuZ3VpZCsrO1xuXG5cdHJldHVybi
21167Bwcm94eTtcbn07XG5cbmpRdWVyeS5ob2xkUmVhZHkgPSBmdW5jdGlvbiggaG9sZCApIHtcblx0aWYgKCBob2xkICkge1xuXHRcdGpRdWVyeS5yZWFkeVdhaXQrKztcblx0fSBlbHNlIHtcblx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0fVxufTtcbmpRdWVyeS5pc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcbmpRdWVyeS5wYXJzZUpTT04gPSBKU09OLnBhcnNlO1xualF1ZXJ5Lm5vZGVOYW1lID0gbm9kZU5hbWU7XG5qUXVlcnkuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5qUXVlcnkuaXNXaW5kb3cgPSBpc1dpbmRvdztcbmpRdWVyeS5jYW1lbENhc2UgPSBjYW1lbENhc2U7XG5qUXVlcnkudHlwZSA9IHRvVHlwZTtcblxualF1ZXJ5Lm5vdyA9IERhdGUubm93O1xuXG5qUXVlcnkuaXNOdW1lcmljID0gZnVuY3Rpb24oIG9iaiApIHtcblxuXHQvLyBBcyBvZiBqUXVlcnkgMy4wLCBpc051bWVyaWMgaXMgbGltaXRlZCB0b1xuXHQvLyBzdHJpbmdzIGFuZCBudW1iZXJzIChwcmltaXRpdmVzIG9yIG9iamVjdHMpXG5cdC8vIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gZmluaXRlIG51bWJlcnMgKGdoLTI2NjIpXG5cdHZhciB0eXBlID0galF1ZXJ5LnR5cGUoIG9iaiApO1xuXHRyZXR1cm4gKCB0eXBlID09PSBcIm51bWJlclwiIHx8IHR5cGUgPT09IFwic3RyaW5nXCIgKSAmJlxuXG5cdFx0Ly8gcGFyc2VGbG9hdCBOYU5zIG51bWVyaWMtY2FzdCBmYWxzZSBwb3NpdGl2ZXMgKFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdCFpc05hTiggb2JqIC0gcGFyc2VGbG9hdCggb2JqICkgKTtcbn07XG5cblxuXG5cbi8vIFJlZ2lzdGVyIGFzIGEgbmFtZWQgQU1EIG1vZHVsZSwgc2luY2UgalF1ZXJ5IGNhbiBiZSBjb25jYXRlbmF0ZWQgd2l0aCBvdGhlclxuLy8gZmlsZXMgdGhhdCBtYXkgdXNlIGRlZmluZSwgYnV0IG5vdCB2aWEgYSBwcm9wZXIgY29uY2F0ZW5hdGlvbiBzY3JpcHQgdGhhdFxuLy8gdW5kZXJzdGFuZHMgYW5vbnltb3VzIEFNRCBtb2R1bGVzLiBBIG5hbWVkIEFNRCBpcyBzYWZlc3QgYW5kIG1vc3Qgcm9idXN0XG4vLyB3YXkgdG8gcmVnaXN0ZXIuIExvd2VyY2FzZSBqcXVlcnkgaXMgdXNlZCBiZWNhdXNlIEFNRCBtb2R1bGUgbmFtZXMgYXJlXG4vLyBkZXJpdmVkIGZyb20gZmlsZSBuYW1lcywgYW5kIGpRdWVyeSBpcyBub3JtYWxseSBkZWxpdmVyZWQgaW4gYSBsb3dlcmNhc2Vcbi8vIGZpbGUgbmFtZS4gRG8gdGhpcyBhZnRlciBjcmVhdGluZyB0aGUgZ2xvYmFsIHNvIHRoYXQgaWYgYW4gQU1EIG1vZHVsZSB3YW50c1xuLy8gdG8gY2FsbCBub0NvbmZsaWN0IHRvIGhpZGUgdGhpcyB2ZXJzaW9uIG9mIGpRdWVyeSwgaXQgd2lsbCB3b3JrLlxuXG4vLyBOb3RlIHRoYXQgZm9yIG1heGltdW0gcG9ydGFiaWxpdHksIGxpYnJhcmllcyB0aGF0IGFyZSBub3QgalF1ZXJ5IHNob3VsZFxuLy8gZGVjbGFyZSB0aGVtc2VsdmVzIGFzIGFub255bW91cyBtb2R1bGVzLCBhbmQgYXZvaWQgc2V0dGluZyBhIGdsb2JhbCBpZiBhblxuLy8gQU1EIGxvYWRlciBpcyBwcmVzZW50LiBqUXVlcnkgaXMgYSBzcGVjaWFsIGNhc2UuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWVcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9qcmJ1cmtlL3JlcXVpcmVqcy93aWtpL1VwZGF0aW5nLWV4aXN0aW5nLWxpYnJhcmllcyN3aWtpLWFub25cblxuaWYgKCB0eXBlb2YgZGVmaW5lID09PSBcImZ1bmN0aW9uXCIgJiYgZGVmaW5lLmFtZCApIHtcblx0ZGVmaW5lKCBcImpxdWVyeVwiLCBbXSwgZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeTtcblx0fSApO1xufVxuXG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5cblxuXG5yZXR1cm4galF1ZXJ5O1xufSApO1xuIiwiLypcbiBDb3B5cmlnaHQgKEMpIEZlZGVyaWNvIFppdm9sbyAyMDE4XG4gRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlIChsaWNlbnNlIHRlcm1zIGFyZSBhdCBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUKS5cbiAqLyhmdW5jdGlvbihlLHQpeydvYmplY3QnPT10eXBlb2YgZXhwb3J0cyYmJ3VuZGVmaW5lZCchPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOidmdW5jdGlvbic9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKHQpOmUuUG9wcGVyPXQoKX0pKHRoaXMsZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7ZnVuY3Rpb24gZShlKXtyZXR1cm4gZSYmJ1tvYmplY3QgRnVuY3Rpb25dJz09PXt9LnRvU3RyaW5nLmNhbGwoZSl9ZnVuY3Rpb24gdChlLHQpe2lmKDEhPT1lLm5vZGVUeXBlKXJldHVybltdO3ZhciBvPWdldENvbXB1dGVkU3R5bGUoZSxudWxsKTtyZXR1cm4gdD9vW3RdOm99ZnVuY3Rpb24gbyhlKXtyZXR1cm4nSFRNTCc9PT1lLm5vZGVOYW1lP2U6ZS5wYXJlbnROb2RlfHxlLmhvc3R9ZnVuY3Rpb24gbihlKXtpZighZSlyZXR1cm4gZG9jdW1lbnQuYm9keTtzd2l0Y2goZS5ub2RlTmFtZSl7Y2FzZSdIVE1MJzpjYXNlJ0JPRFknOnJldHVybi
21167BlLm93bmVyRG9jdW1lbnQuYm9keTtjYXNlJyNkb2N1bWVudCc6cmV0dXJuIGUuYm9keTt9dmFyIGk9dChlKSxyPWkub3ZlcmZsb3cscD1pLm92ZXJmbG93WCxzPWkub3ZlcmZsb3dZO3JldHVybiAvKGF1dG98c2Nyb2xsfG92ZXJsYXkpLy50ZXN0KHIrcytwKT9lOm4obyhlKSl9ZnVuY3Rpb24gcihlKXtyZXR1cm4gMTE9PT1lP3JlOjEwPT09ZT9wZTpyZXx8cGV9ZnVuY3Rpb24gcChlKXtpZighZSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Zvcih2YXIgbz1yKDEwKT9kb2N1bWVudC5ib2R5Om51bGwsbj1lLm9mZnNldFBhcmVudDtuPT09byYmZS5uZXh0RWxlbWVudFNpYmxpbmc7KW49KGU9ZS5uZXh0RWxlbWVudFNpYmxpbmcpLm9mZnNldFBhcmVudDt2YXIgaT1uJiZuLm5vZGVOYW1lO3JldHVybiBpJiYnQk9EWSchPT1pJiYnSFRNTCchPT1pPy0xIT09WydURCcsJ1RBQkxFJ10uaW5kZXhPZihuLm5vZGVOYW1lKSYmJ3N0YXRpYyc9PT10KG4sJ3Bvc2l0aW9uJyk/cChuKTpuOmU/ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR9ZnVuY3Rpb24gcyhlKXt2YXIgdD1lLm5vZGVOYW1lO3JldHVybidCT0RZJyE9PXQmJignSFRNTCc9PT10fHxwKGUuZmlyc3RFbGVtZW50Q2hpbGQpPT09ZSl9ZnVuY3Rpb24gZChlKXtyZXR1cm4gbnVsbD09PWUucGFyZW50Tm9kZT9lOmQoZS5wYXJlbnROb2RlKX1mdW5jdGlvbiBhKGUsdCl7aWYoIWV8fCFlLm5vZGVUeXBlfHwhdHx8IXQubm9kZVR5cGUpcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDt2YXIgbz1lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpJk5vZGUuRE9DVU1FTlRfUE9TSVRJT05fRk9MTE9XSU5HLG49bz9lOnQsaT1vP3Q6ZSxyPWRvY3VtZW50LmNyZWF0ZVJhbmdlKCk7ci5zZXRTdGFydChuLDApLHIuc2V0RW5kKGksMCk7dmFyIGw9ci5jb21tb25BbmNlc3RvckNvbnRhaW5lcjtpZihlIT09bCYmdCE9PWx8fG4uY29udGFpbnMoaSkpcmV0dXJuIHMobCk/bDpwKGwpO3ZhciBmPWQoZSk7cmV0dXJuIGYuaG9zdD9hKGYuaG9zdCx0KTphKGUsZCh0KS5ob3N0KX1mdW5jdGlvbiBsKGUpe3ZhciB0PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTondG9wJyxvPSd0b3AnPT09dD8nc2Nyb2xsVG9wJzonc2Nyb2xsTGVmdCcsbj1lLm5vZGVOYW1lO2lmKCdCT0RZJz09PW58fCdIVE1MJz09PW4pe3ZhciBpPWUub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQscj1lLm93bmVyRG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudHx8aTtyZXR1cm4gcltvXX1yZXR1cm4gZVtvXX1mdW5jdGlvbiBmKGUsdCl7dmFyIG89Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxuPWwodCwndG9wJyksaT1sKHQsJ2xlZnQnKSxyPW8/LTE6MTtyZXR1cm4gZS50b3ArPW4qcixlLmJvdHRvbSs9bipyLGUubGVmdCs9aSpyLGUucmlnaHQrPWkqcixlfWZ1bmN0aW9uIG0oZSx0KXt2YXIgbz0neCc9PT10PydMZWZ0JzonVG9wJyxuPSdMZWZ0Jz09bz8nUmlnaHQnOidCb3R0b20nO3JldHVybiBwYXJzZUZsb2F0KGVbJ2JvcmRlcicrbysnV2lkdGgnXSwxMCkrcGFyc2VGbG9hdChlWydib3JkZXInK24rJ1dpZHRoJ10sMTApfWZ1bmN0aW9uIGgoZSx0LG8sbil7cmV0dXJuIEoodFsnb2Zmc2V0JytlXSx0WydzY3JvbGwnK2VdLG9bJ2NsaWVudCcrZV0sb1snb2Zmc2V0JytlXSxvWydzY3JvbGwnK2VdLHIoMTApP3BhcnNlSW50KG9bJ29mZnNldCcrZV0pK3BhcnNlSW50KG5bJ21hcmdpbicrKCdIZWlnaHQnPT09ZT8nVG9wJzonTGVmdCcpXSkrcGFyc2VJbnQoblsnbWFyZ2luJysoJ0hlaWdodCc9PT1lPydCb3R0b20nOidSaWdodCcpXSk6MCl9ZnVuY3Rpb24gYyhlKXt2YXIgdD1lLmJvZHksbz1lLmRvY3VtZW50RWxlbWVudCxuPXIoMTApJiZnZXRDb21wdXRlZFN0eWxlKG8pO3JldHVybntoZWlnaHQ6aCgnSGVpZ2h0Jyx0LG8sbiksd2lkdGg6aCgnV2lkdGgnLHQsbyxuKX19ZnVuY3Rpb24gZyhlKXtyZXR1cm4gbGUoe30sZSx7cmlnaHQ6ZS5sZWZ0K2Uud2lkdGgsYm90dG9tOmUudG9wK2UuaGVpZ2h0fSl9ZnVuY3Rpb24gdShlKXt2YXIgbz17fTt0cnl7aWYocigxMCkpe289ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgbj1sKGUsJ3RvcCcpLGk9bChlLCdsZWZ0Jyk7by50b3ArPW4sby5sZWZ0Kz1pLG8uYm90dG9tKz1uLG8ucmlnaHQrPWl9ZWxzZSBvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y2F0Y2godCl7fXZhciBwPXtsZWZ0Om8ubGVmdCx0b3A6by50b3Asd2lkdGg6by5yaWdodC1vLmxlZnQsaGVpZ2h0Om8uYm90dG9tLW8udG9wfSxzPSdIVE1MJz09PWUubm9kZU5hbWU/YyhlLm93bmVyRG9jdW1lbnQpOnt9LGQ9cy53aWR0aHx8ZS5jbGllbnRXaWR0aHx8cC5yaWdodC1wLmxlZnQsYT1zLmhlaWdodHx8ZS5jbGllbnRIZWlnaHR8fHAuYm90dG9tLXAudG9wLGY9ZS5vZmZzZXRXaWR0aC1kLGg9ZS5vZmZzZXRIZWlnaHQtYTtpZihmfHxoKXt2YXIgdT10KGUpO2YtPW0odSwneCcpLGgtPW0odSwneScpLHAud2lkdGgtPWYscC5oZWlnaHQtPWh9cmV0dXJuIGcocCl9ZnVuY3Rpb24gYihlLG8pe3ZhciBpPTI8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0scD1yKDEwKSxzPSdIVE1MJz09PW8ubm9kZU5hbWUsZD11KGUpLGE9dShvKSxsPW4oZSksbT10KG8pLGg9cGFyc2VGbG9hdChtLmJvcmRlclRvcFdpZHRoLDEwKSxjPXBhcnNlRmxvYXQobS5ib3JkZXJMZWZ0V2lkdGgsMTApO2kmJnMmJihhLnRvcD1KKGEudG9wLDApLGEubGVmdD1KKGEubGVmdCwwKSk7dmFyIGI9Zyh7dG9wOmQudG9wLWEudG9wLWgsbGVmdDpkLmxlZnQtYS5sZWZ0LWMsd2lkdGg6ZC53aWR0aCxoZWlnaHQ6ZC5oZWlnaHR9KTtpZihiLm1hcmdpblRvcD0wLGIubWFyZ2luTGVmdD0wLCFwJiZzKXt2YXIgeT1wYXJzZUZsb2F0KG0ubWFyZ2luVG9wLDEwKSx3PXBhcnNlRmxvYXQobS5tYXJnaW5MZWZ0LDEwKTtiLnRvcC09aC15LGIuYm90dG9tLT1oLXksYi5sZWZ0LT1jLXcsYi5yaWdodC09Yy13LGIubWFyZ2luVG9wPXksYi5tYXJnaW5MZWZ0PXd9cmV0dXJuKHAmJiFpP28uY29udGFpbnMobCk6bz09PWwmJidCT0RZJyE9PWwubm9kZU5hbWUpJiYoYj1mKGIsbykpLGJ9ZnVuY3Rpb24geShlKXt2YXIgdD0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLG89ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxuPWIoZSxvKSxpPUooby5jbGllbnRXaWR0aCx3aW5kb3cuaW5uZXJXaWR0aHx8MCkscj1KKG8uY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8MCkscD10PzA6bChvKSxzPXQ/MDpsKG8sJ2xlZnQnKSxkPXt0b3A6cC1uLnRvcCtuLm1hcmdpblRvcCxsZWZ0OnMtbi5sZWZ0K24ubWFyZ2luTGVmdCx3aWR0aDppLGhlaWdodDpyfTtyZXR1cm4gZyhkKX1mdW5jdGlvbiB3
21167KGUpe3ZhciBuPWUubm9kZU5hbWU7cmV0dXJuJ0JPRFknPT09bnx8J0hUTUwnPT09bj8hMTonZml4ZWQnPT09dChlLCdwb3NpdGlvbicpfHx3KG8oZSkpfWZ1bmN0aW9uIEUoZSl7aWYoIWV8fCFlLnBhcmVudEVsZW1lbnR8fHIoKSlyZXR1cm4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O2Zvcih2YXIgbz1lLnBhcmVudEVsZW1lbnQ7byYmJ25vbmUnPT09dChvLCd0cmFuc2Zvcm0nKTspbz1vLnBhcmVudEVsZW1lbnQ7cmV0dXJuIG98fGRvY3VtZW50LmRvY3VtZW50RWxlbWVudH1mdW5jdGlvbiB2KGUsdCxpLHIpe3ZhciBwPTQ8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzRdJiZhcmd1bWVudHNbNF0scz17dG9wOjAsbGVmdDowfSxkPXA/RShlKTphKGUsdCk7aWYoJ3ZpZXdwb3J0Jz09PXIpcz15KGQscCk7ZWxzZXt2YXIgbDsnc2Nyb2xsUGFyZW50Jz09PXI/KGw9bihvKHQpKSwnQk9EWSc9PT1sLm5vZGVOYW1lJiYobD1lLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk6J3dpbmRvdyc9PT1yP2w9ZS5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudDpsPXI7dmFyIGY9YihsLGQscCk7aWYoJ0hUTUwnPT09bC5ub2RlTmFtZSYmIXcoZCkpe3ZhciBtPWMoZS5vd25lckRvY3VtZW50KSxoPW0uaGVpZ2h0LGc9bS53aWR0aDtzLnRvcCs9Zi50b3AtZi5tYXJnaW5Ub3Ascy5ib3R0b209aCtmLnRvcCxzLmxlZnQrPWYubGVmdC1mLm1hcmdpbkxlZnQscy5yaWdodD1nK2YubGVmdH1lbHNlIHM9Zn1pPWl8fDA7dmFyIHU9J251bWJlcic9PXR5cGVvZiBpO3JldHVybiBzLmxlZnQrPXU/aTppLmxlZnR8fDAscy50b3ArPXU/aTppLnRvcHx8MCxzLnJpZ2h0LT11P2k6aS5yaWdodHx8MCxzLmJvdHRvbS09dT9pOmkuYm90dG9tfHwwLHN9ZnVuY3Rpb24geChlKXt2YXIgdD1lLndpZHRoLG89ZS5oZWlnaHQ7cmV0dXJuIHQqb31mdW5jdGlvbiBPKGUsdCxvLG4saSl7dmFyIHI9NTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbNV0/YXJndW1lbnRzWzVdOjA7aWYoLTE9PT1lLmluZGV4T2YoJ2F1dG8nKSlyZXR1cm4gZTt2YXIgcD12KG8sbixyLGkpLHM9e3RvcDp7d2lkdGg6cC53aWR0aCxoZWlnaHQ6dC50b3AtcC50b3B9LHJpZ2h0Ont3aWR0aDpwLnJpZ2h0LXQucmlnaHQsaGVpZ2h0OnAuaGVpZ2h0fSxib3R0b206e3dpZHRoOnAud2lkdGgsaGVpZ2h0OnAuYm90dG9tLXQuYm90dG9tfSxsZWZ0Ont3aWR0aDp0LmxlZnQtcC5sZWZ0LGhlaWdodDpwLmhlaWdodH19LGQ9T2JqZWN0LmtleXMocykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBsZSh7a2V5OmV9LHNbZV0se2FyZWE6eChzW2VdKX0pfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiB0LmFyZWEtZS5hcmVhfSksYT1kLmZpbHRlcihmdW5jdGlvbihlKXt2YXIgdD1lLndpZHRoLG49ZS5oZWlnaHQ7cmV0dXJuIHQ+PW8uY2xpZW50V2lkdGgmJm4+PW8uY2xpZW50SGVpZ2h0fSksbD0wPGEubGVuZ3RoP2FbMF0ua2V5OmRbMF0ua2V5LGY9ZS5zcGxpdCgnLScpWzFdO3JldHVybiBsKyhmPyctJytmOicnKX1mdW5jdGlvbiBMKGUsdCxvKXt2YXIgbj0zPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106bnVsbCxpPW4/RSh0KTphKHQsbyk7cmV0dXJuIGIobyxpLG4pfWZ1bmN0aW9uIFMoZSl7dmFyIHQ9Z2V0Q29tcHV0ZWRTdHlsZShlKSxvPXBhcnNlRmxvYXQodC5tYXJnaW5Ub3ApK3BhcnNlRmxvYXQodC5tYXJnaW5Cb3R0b20pLG49cGFyc2VGbG9hdCh0Lm1hcmdpbkxlZnQpK3BhcnNlRmxvYXQodC5tYXJnaW5SaWdodCksaT17d2lkdGg6ZS5vZmZzZXRXaWR0aCtuLGhlaWdodDplLm9mZnNldEhlaWdodCtvfTtyZXR1cm4gaX1mdW5jdGlvbiBUKGUpe3ZhciB0PXtsZWZ0OidyaWdodCcscmlnaHQ6J2xlZnQnLGJvdHRvbTondG9wJyx0b3A6J2JvdHRvbSd9O3JldHVybiBlLnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLGZ1bmN0aW9uKGUpe3JldHVybiB0W2VdfSl9ZnVuY3Rpb24gRChlLHQsbyl7bz1vLnNwbGl0KCctJylbMF07dmFyIG49UyhlKSxpPXt3aWR0aDpuLndpZHRoLGhlaWdodDpuLmhlaWdodH0scj0tMSE9PVsncmlnaHQnLCdsZWZ0J10uaW5kZXhPZihvKSxwPXI/J3RvcCc6J2xlZnQnLHM9cj8nbGVmdCc6J3RvcCcsZD1yPydoZWlnaHQnOid3aWR0aCcsYT1yPyd3aWR0aCc6J2hlaWdodCc7cmV0dXJuIGlbcF09dFtwXSt0W2RdLzItbltkXS8yLGlbc109bz09PXM/dFtzXS1uW2FdOnRbVChzKV0saX1mdW5jdGlvbiBDKGUsdCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maW5kP2UuZmluZCh0KTplLmZpbHRlcih0KVswXX1mdW5jdGlvbiBOKGUsdCxvKXtpZihBcnJheS5wcm90b3R5cGUuZmluZEluZGV4KXJldHVybiBlLmZpbmRJbmRleChmdW5jdGlvbihlKXtyZXR1cm4gZVt0XT09PW99KTt2YXIgbj1DKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGVbdF09PT1vfSk7cmV0dXJuIGUuaW5kZXhPZihuKX1mdW5jdGlvbiBQKHQsbyxuKXt2YXIgaT12b2lkIDA9PT1uP3Q6dC5zbGljZSgwLE4odCwnbmFtZScsbikpO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7dFsnZnVuY3Rpb24nXSYmY29uc29sZS53YXJuKCdgbW9kaWZpZXIuZnVuY3Rpb25gIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbW9kaWZpZXIuZm5gIScpO3ZhciBuPXRbJ2Z1bmN0aW9uJ118fHQuZm47dC5lbmFibGVkJiZlKG4pJiYoby5vZmZzZXRzLnBvcHBlcj1nKG8ub2Zmc2V0cy5wb3BwZXIpLG8ub2Zmc2V0cy5yZWZlcmVuY2U9ZyhvLm9mZnNldHMucmVmZXJlbmNlKSxvPW4obyx0KSl9KSxvfWZ1bmN0aW9uIGsoKXtpZighdGhpcy5zdGF0ZS5pc0Rlc3Ryb3llZCl7dmFyIGU9e2luc3RhbmNlOnRoaXMsc3R5bGVzOnt9LGFycm93U3R5bGVzOnt9LGF0dHJpYnV0ZXM6e30sZmxpcHBlZDohMSxvZmZzZXRzOnt9fTtlLm9mZnNldHMucmVmZXJlbmNlPUwodGhpcy5zdGF0ZSx0aGlzLnBvcHBlcix0aGlzLnJlZmVyZW5jZSx0aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCksZS5wbGFjZW1lbnQ9Tyh0aGlzLm9wdGlvbnMucGxhY2VtZW50LGUub2Zmc2V0cy5yZWZlcmVuY2UsdGhpcy5wb3BwZXIsdGhpcy5yZWZlcmVuY2UsdGhpcy5vcHRpb25zLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LHRoaXMub3B0aW9ucy5tb2RpZmllcnMuZmxpcC5wYWRkaW5nKSxlLm9yaWdpbmFsUGxhY2VtZW50PWUucGxhY2VtZW50LGUucG9zaXRpb25GaXhlZD10aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZCxlLm9mZnNldHMucG9wcGVyPUQodGhpcy5wb3BwZXIsZS5vZmZzZXRzLnJlZmVyZW5jZSxlLnBsYWNlbWVudCksZS5vZmZzZXRzLnBvcHBlci5wb3NpdGlvbj10aGlzLm9wdGlvbnMucG9zaXRpb25GaXhlZD8nZml4ZWQnOidhYnNvbHV0ZScsZT1QKHRoaXMubW9kaWZpZXJzLGUpLHRoaXMuc3RhdGUuaXNDcmVhdGVkP3RoaXMub3B0aW9ucy5vblVwZGF0ZShlKToodGhpcy5zdGF0ZS5pc0NyZWF0ZWQ9ITAsdGhpcy5vcHRpb25zLm9uQ3JlYXRlKGUpKX19ZnVuY3Rpb24gVyhlLHQpe3JldHVybiBlLnNvbWUoZnVuY3Rpb24oZSl7dmFyIG89ZS5uYW1lLG49ZS5lbmFibGVkO3JldHVybiBuJiZvPT09dH0pfWZ1bmN0aW9uIEgoZSl7Zm9yKHZhciB0PVshMSwnbXMnLCdXZWJraXQnLCdNb3onLCdPJ10sbz1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj0wO248dC5sZW5ndGg7bisrKXt2YXIgaT10W25dLHI9aT8nJytpK286ZTtpZigndW5kZWZpbmVkJyE9dHlwZW9mIGRvY3VtZW50LmJvZHkuc3R5bGVbcl0pcmV0dXJuIHJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gQigpe3JldHVybiB0aGlzLnN0YXRlLmlzRGVzdHJveWVkPSEwLFcodGhpcy5tb2RpZmllcnMsJ2FwcGx5U3R5bGUnKSYmKHRoaXMucG9wcGVyLnJlbW92ZUF0dHJpYnV0ZSgneC1wbGFjZW1lbnQnKSx0aGlzLnBvcHBlci5zdHlsZS5wb3NpdGlvbj0nJyx0aGlzLnBvcHBlci5zdHlsZS50b3A9JycsdGhpcy5wb3BwZXIuc3R5bGUubGVmdD0nJyx0aGlzLnBvcHBlci5zdHlsZS5yaWdodD0nJyx0aGlzLnBvcHBlci5zdHlsZS5ib3R0b209JycsdGhpcy5wb3BwZXIuc3R5bGUud2lsbENoYW5nZT0nJyx0aGlzLnBvcHBlci5zdHlsZVtIKCd0cmFuc2Zvcm0nKV09JycpLHRoaXMuZGlzYWJsZUV2ZW50TGlzdGVuZXJzKCksdGhpcy5vcHRpb25zLnJlbW92ZU9uRGVzdHJveSYmdGhpcy5wb3BwZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLnBvcHBlciksdGhpc31mdW5jdGlvbiBBKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudDtyZXR1cm4gdD90LmRlZmF1bHRWaWV3OndpbmRvd31mdW5jdGlvbiBNKGUsdCxvLGkpe3ZhciByPSdCT0RZJz09PWUubm9kZU5hbWUscD1yP2
21167Uub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldzplO3AuYWRkRXZlbnRMaXN0ZW5lcih0LG8se3Bhc3NpdmU6ITB9KSxyfHxNKG4ocC5wYXJlbnROb2RlKSx0LG8saSksaS5wdXNoKHApfWZ1bmN0aW9uIEYoZSx0LG8saSl7by51cGRhdGVCb3VuZD1pLEEoZSkuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJyxvLnVwZGF0ZUJvdW5kLHtwYXNzaXZlOiEwfSk7dmFyIHI9bihlKTtyZXR1cm4gTShyLCdzY3JvbGwnLG8udXBkYXRlQm91bmQsby5zY3JvbGxQYXJlbnRzKSxvLnNjcm9sbEVsZW1lbnQ9cixvLmV2ZW50c0VuYWJsZWQ9ITAsb31mdW5jdGlvbiBJKCl7dGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkfHwodGhpcy5zdGF0ZT1GKHRoaXMucmVmZXJlbmNlLHRoaXMub3B0aW9ucyx0aGlzLnN0YXRlLHRoaXMuc2NoZWR1bGVVcGRhdGUpKX1mdW5jdGlvbiBSKGUsdCl7cmV0dXJuIEEoZSkucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJyx0LnVwZGF0ZUJvdW5kKSx0LnNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbihlKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsdC51cGRhdGVCb3VuZCl9KSx0LnVwZGF0ZUJvdW5kPW51bGwsdC5zY3JvbGxQYXJlbnRzPVtdLHQuc2Nyb2xsRWxlbWVudD1udWxsLHQuZXZlbnRzRW5hYmxlZD0hMSx0fWZ1bmN0aW9uIFUoKXt0aGlzLnN0YXRlLmV2ZW50c0VuYWJsZWQmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLnNjaGVkdWxlVXBkYXRlKSx0aGlzLnN0YXRlPVIodGhpcy5yZWZlcmVuY2UsdGhpcy5zdGF0ZSkpfWZ1bmN0aW9uIFkoZSl7cmV0dXJuJychPT1lJiYhaXNOYU4ocGFyc2VGbG9hdChlKSkmJmlzRmluaXRlKGUpfWZ1bmN0aW9uIGooZSx0KXtPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG8pe3ZhciBuPScnOy0xIT09Wyd3aWR0aCcsJ2hlaWdodCcsJ3RvcCcsJ3JpZ2h0JywnYm90dG9tJywnbGVmdCddLmluZGV4T2YobykmJlkodFtvXSkmJihuPSdweCcpLGUuc3R5bGVbb109dFtvXStufSl9ZnVuY3Rpb24gSyhlLHQpe09iamVjdC5rZXlzKHQpLmZvckVhY2goZnVuY3Rpb24obyl7dmFyIG49dFtvXTshMT09PW4/ZS5yZW1vdmVBdHRyaWJ1dGUobyk6ZS5zZXRBdHRyaWJ1dGUobyx0W29dKX0pfWZ1bmN0aW9uIHEoZSx0LG8pe3ZhciBuPUMoZSxmdW5jdGlvbihlKXt2YXIgbz1lLm5hbWU7cmV0dXJuIG89PT10fSksaT0hIW4mJmUuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lPT09byYmZS5lbmFibGVkJiZlLm9yZGVyPG4ub3JkZXJ9KTtpZighaSl7dmFyIHI9J2AnK3QrJ2AnO2NvbnNvbGUud2FybignYCcrbysnYCcrJyBtb2RpZmllciBpcyByZXF1aXJlZCBieSAnK3IrJyBtb2RpZmllciBpbiBvcmRlciB0byB3b3JrLCBiZSBzdXJlIHRvIGluY2x1ZGUgaXQgYmVmb3JlICcrcisnIScpfXJldHVybiBpfWZ1bmN0aW9uIEcoZSl7cmV0dXJuJ2VuZCc9PT1lPydzdGFydCc6J3N0YXJ0Jz09PWU/J2VuZCc6ZX1mdW5jdGlvbiBWKGUpe3ZhciB0PTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0sbz1tZS5pbmRleE9mKGUpLG49bWUuc2xpY2UobysxKS5jb25jYXQobWUuc2xpY2UoMCxvKSk7cmV0dXJuIHQ/bi5yZXZlcnNlKCk6bn1mdW5jdGlvbiB6KGUsdCxvLG4pe3ZhciBpPWUubWF0Y2goLygoPzpcXC18XFwrKT9cXGQqXFwuP1xcZCopKC4qKS8pLHI9K2lbMV0scD1pWzJdO2lmKCFyKXJldHVybiBlO2lmKDA9PT1wLmluZGV4T2YoJyUnKSl7dmFyIHM7c3dpdGNoKHApe2Nhc2UnJXAnOnM9bzticmVhaztjYXNlJyUnOmNhc2UnJXInOmRlZmF1bHQ6cz1uO312YXIgZD1nKHMpO3JldHVybiBkW3RdLzEwMCpyfWlmKCd2aCc9PT1wfHwndncnPT09cCl7dmFyIGE7cmV0dXJuIGE9J3ZoJz09PXA/Sihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0LHdpbmRvdy5pbm5lckhlaWdodHx8MCk6Sihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsd2luZG93LmlubmVyV2lkdGh8fDApLGEvMTAwKnJ9cmV0dXJuIHJ9ZnVuY3Rpb24gXyhlLHQsbyxuKXt2YXIgaT1bMCwwXSxyPS0xIT09WydyaWdodCcsJ2xlZnQnXS5pbmRleE9mKG4pLHA9ZS5zcGxpdCgvKFxcK3xcXC0pLykubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRyaW0oKX0pLHM9cC5pbmRleE9mKEMocCxmdW5jdGlvbihlKXtyZXR1cm4tMSE9PWUuc2VhcmNoKC8sfFxccy8pfSkpO3Bbc10mJi0xPT09cFtzXS5pbmRleE9mKCcsJykmJmNvbnNvbGUud2FybignT2Zmc2V0cyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2UocykgYXJlIGRlcHJlY2F0ZWQsIHVzZSBhIGNvbW1hICgsKSBpbnN0ZWFkLicpO3ZhciBkPS9cXHMqLFxccyp8XFxzKy8sYT0tMT09PXM/W3BdOltwLnNsaWNlKDAscykuY29uY2F0KFtwW3NdLnNwbGl0KGQpWzBdXSksW3Bbc10uc3BsaXQoZClbMV1dLmNvbmNhdChwLnNsaWNlKHMrMSkpXTtyZXR1cm4gYT1hLm1hcChmdW5jdGlvbihlLG4pe3ZhciBpPSgxPT09bj8hcjpyKT8naGVpZ2h0Jzond2lkdGgnLHA9ITE7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuJyc9PT1lW2UubGVuZ3RoLTFdJiYtMSE9PVsnKycsJy0nXS5pbmRleE9mKHQpPyhlW2UubGVuZ3RoLTFdPXQscD0hMCxlKTpwPyhlW2UubGVuZ3RoLTFdKz10LHA9ITEsZSk6ZS5jb25jYXQodCl9LFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHooZSxpLHQsbyl9KX0pLGEuZm9yRWFjaChmdW5jdGlvbihlLHQpe2UuZm9yRWFjaChmdW5jdGlvbihvLG4pe1kobykmJihpW3RdKz1vKignLSc9PT1lW24tMV0/LTE6MSkpfSl9KSxpfWZ1bmN0aW9uIFgoZSx0KXt2YXIgbyxuPXQub2Zmc2V0LGk9ZS5wbGFjZW1lbnQscj1lLm9mZnNldHMscD1yLnBvcHBlcixzPXIucmVmZXJlbmNlLGQ9aS5zcGxpdCgnLScpWzBdO3JldHVybiBvPVkoK24pP1srbiwwXTpfKG4scCxzLGQpLCdsZWZ0Jz09PWQ/KHAudG9wKz1vWzBdLHAubGVmdC09b1sxXSk6J3JpZ2h0Jz09PWQ/KHAudG9wKz1vWzBdLHAubGVmdCs9b1sxXSk6J3RvcCc9PT1kPyhwLmxlZnQrPW9bMF0scC50b3AtPW9bMV0pOidib3R0b20nPT09ZCYmKHAubGVmdCs9b1swXSxwLnRvcCs9b1sxXSksZS5wb3BwZXI9cCxlfWZvcih2YXIgUT1NYXRoLm1pbixaPU1h
21167dGgucm91bmQsJD1NYXRoLmZsb29yLEo9TWF0aC5tYXgsZWU9J3VuZGVmaW5lZCchPXR5cGVvZiB3aW5kb3cmJid1bmRlZmluZWQnIT10eXBlb2YgZG9jdW1lbnQsdGU9WydFZGdlJywnVHJpZGVudCcsJ0ZpcmVmb3gnXSxvZT0wLG5lPTA7bmU8dGUubGVuZ3RoO25lKz0xKWlmKGVlJiYwPD1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YodGVbbmVdKSl7b2U9MTticmVha312YXIgaT1lZSYmd2luZG93LlByb21pc2UsaWU9aT9mdW5jdGlvbihlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCx3aW5kb3cuUHJvbWlzZS5yZXNvbHZlKCkudGhlbihmdW5jdGlvbigpe3Q9ITEsZSgpfSkpfX06ZnVuY3Rpb24oZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsc2V0VGltZW91dChmdW5jdGlvbigpe3Q9ITEsZSgpfSxvZSkpfX0scmU9ZWUmJiEhKHdpbmRvdy5NU0lucHV0TWV0aG9kQ29udGV4dCYmZG9jdW1lbnQuZG9jdW1lbnRNb2RlKSxwZT1lZSYmL01TSUUgMTAvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCksc2U9ZnVuY3Rpb24oZSx0KXtpZighKGUgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCdDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb24nKX0sZGU9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUsdCl7Zm9yKHZhciBvLG49MDtuPHQubGVuZ3RoO24rKylvPXRbbl0sby5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsJ3ZhbHVlJ2luIG8mJihvLndyaXRhYmxlPSEwKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxvLmtleSxvKX1yZXR1cm4gZnVuY3Rpb24odCxvLG4pe3JldHVybiBvJiZlKHQucHJvdG90eXBlLG8pLG4mJmUodCxuKSx0fX0oKSxhZT1mdW5jdGlvbihlLHQsbyl7cmV0dXJuIHQgaW4gZT9PYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHt2YWx1ZTpvLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6ZVt0XT1vLGV9LGxlPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxvPTE7bzxhcmd1bWVudHMubGVuZ3RoO28rKylmb3IodmFyIG4gaW4gdD1hcmd1bWVudHNbb10sdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxuKSYmKGVbbl09dFtuXSk7cmV0dXJuIGV9LGZlPVsnYXV0by1zdGFydCcsJ2F1dG8nLCdhdXRvLWVuZCcsJ3RvcC1zdGFydCcsJ3RvcCcsJ3RvcC1lbmQnLCdyaWdodC1zdGFydCcsJ3JpZ2h0JywncmlnaHQtZW5kJywnYm90dG9tLWVuZCcsJ2JvdHRvbScsJ2JvdHRvbS1zdGFydCcsJ2xlZnQtZW5kJywnbGVmdCcsJ2xlZnQtc3RhcnQnXSxtZT1mZS5zbGljZSgzKSxoZT17RkxJUDonZmxpcCcsQ0xPQ0tXSVNFOidjbG9ja3dpc2UnLENPVU5URVJDTE9DS1dJU0U6J2NvdW50ZXJjbG9ja3dpc2UnfSxjZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQobyxuKXt2YXIgaT10aGlzLHI9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnt9O3NlKHRoaXMsdCksdGhpcy5zY2hlZHVsZVVwZGF0ZT1mdW5jdGlvbigpe3JldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoaS51cGRhdGUpfSx0aGlzLnVwZGF0ZT1pZSh0aGlzLnVwZGF0ZS5iaW5kKHRoaXMpKSx0aGlzLm9wdGlvbnM9bGUoe30sdC5EZWZhdWx0cyxyKSx0aGlzLnN0YXRlPXtpc0Rlc3Ryb3llZDohMSxpc0NyZWF0ZWQ6ITEsc2Nyb2xsUGFyZW50czpbXX0sdGhpcy5yZWZlcmVuY2U9byYmby5qcXVlcnk/b1swXTpvLHRoaXMucG9wcGVyPW4mJm4uanF1ZXJ5P25bMF06bix0aGlzLm9wdGlvbnMubW9kaWZpZXJzPXt9LE9iamVjdC5rZXlzKGxlKHt9LHQuRGVmYXVsdHMubW9kaWZpZXJzLHIubW9kaWZpZXJzKSkuZm9yRWFjaChmdW5jdGlvbihlKXtpLm9wdGlvbnMubW9kaWZpZXJzW2VdPWxlKHt9LHQuRGVmYXVsdHMubW9kaWZpZXJzW2VdfHx7fSxyLm1vZGlmaWVycz9yLm1vZGlmaWVyc1tlXTp7fSl9KSx0aGlzLm1vZGlmaWVycz1PYmplY3Qua2V5cyh0aGlzLm9wdGlvbnMubW9kaWZpZXJzKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGxlKHtuYW1lOmV9LGkub3B0aW9ucy5tb2RpZmllcnNbZV0pfSkuc29ydChmdW5jdGlvbihlLHQpe3JldHVybiBlLm9yZGVyLXQub3JkZXJ9KSx0aGlzLm1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuZW5hYmxlZCYmZSh0Lm9uTG9hZCkmJnQub25Mb2FkKGkucmVmZXJlbmNlLGkucG9wcGVyLGkub3B0aW9ucyx0LGkuc3RhdGUpfSksdGhpcy51cGRhdGUoKTt2YXIgcD10aGlzLm9wdGlvbnMuZXZlbnRzRW5hYmxlZDtwJiZ0aGlzLmVuYWJsZUV2ZW50TGlzdGVuZXJzKCksdGhpcy5zdGF0ZS5ldmVudHNFbmFibGVkPXB9cmV0dXJuIGRlKHQsW3trZXk6J3VwZGF0ZScsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gay5jYWxsKHRoaXMpfX0se2tleTonZGVzdHJveScsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gQi5jYWxsKHRoaXMpfX0se2tleTonZW5hYmxlRXZlbnRMaXN0ZW5lcnMnLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIEkuY2FsbCh0aGlzKX19LHtrZXk6J2Rpc2FibGVFdmVudExpc3RlbmVycycsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gVS5jYWxsKHRoaXMpfX1dKSx0fSgpO3JldHVybiBjZS5VdGlscz0oJ3VuZGVmaW5lZCc9PXR5cGVvZiB3aW5kb3c/Z2xvYmFsOndpbmRvdykuUG9wcGVyVXRpbHMsY2UucGxhY2VtZW50cz1mZSxjZS5EZWZhdWx0cz17cGxhY2VtZW50Oidib3R0b20nLHBvc2l0aW9uRml4ZWQ6ITEsZXZlbnRzRW5hYmxlZDohMCxyZW1vdmVPbkRlc3Ryb3k6ITEsb25DcmVhdGU6ZnVuY3Rpb24oKXt9LG9uVXBkYXRlOmZ1bmN0aW9uKCl7fSxtb2RpZmllcnM6e3NoaWZ0OntvcmRlcjoxMDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXt2YXIgdD1lLnBsYWNlbWVudCxvPXQuc3BsaXQoJy0nKVswXSxuPXQuc3BsaXQoJy0nKVsxXTtpZihuKXt2YXIgaT1lLm9mZnNldHMscj1pLnJlZmVyZW5jZSxwPWkucG9wcGVyLHM9LTEhPT1bJ2JvdHRvbScsJ3RvcCddLmluZGV4T2YobyksZD1zPydsZWZ0JzondG9wJyxhPXM/J3dpZHRoJzonaGVpZ2h0JyxsPXtzdGFydDphZSh7fSxkLHJbZF0pLGVuZDphZSh7fSxkLHJbZF0rclthXS1wW2FdKX07ZS5vZmZzZXRzLnBvcHBlcj1sZSh7fSxwLGxbbl0pfXJldHVybi
21167BlfX0sb2Zmc2V0OntvcmRlcjoyMDAsZW5hYmxlZDohMCxmbjpYLG9mZnNldDowfSxwcmV2ZW50T3ZlcmZsb3c6e29yZGVyOjMwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7dmFyIG89dC5ib3VuZGFyaWVzRWxlbWVudHx8cChlLmluc3RhbmNlLnBvcHBlcik7ZS5pbnN0YW5jZS5yZWZlcmVuY2U9PT1vJiYobz1wKG8pKTt2YXIgbj1IKCd0cmFuc2Zvcm0nKSxpPWUuaW5zdGFuY2UucG9wcGVyLnN0eWxlLHI9aS50b3Ascz1pLmxlZnQsZD1pW25dO2kudG9wPScnLGkubGVmdD0nJyxpW25dPScnO3ZhciBhPXYoZS5pbnN0YW5jZS5wb3BwZXIsZS5pbnN0YW5jZS5yZWZlcmVuY2UsdC5wYWRkaW5nLG8sZS5wb3NpdGlvbkZpeGVkKTtpLnRvcD1yLGkubGVmdD1zLGlbbl09ZCx0LmJvdW5kYXJpZXM9YTt2YXIgbD10LnByaW9yaXR5LGY9ZS5vZmZzZXRzLnBvcHBlcixtPXtwcmltYXJ5OmZ1bmN0aW9uKGUpe3ZhciBvPWZbZV07cmV0dXJuIGZbZV08YVtlXSYmIXQuZXNjYXBlV2l0aFJlZmVyZW5jZSYmKG89SihmW2VdLGFbZV0pKSxhZSh7fSxlLG8pfSxzZWNvbmRhcnk6ZnVuY3Rpb24oZSl7dmFyIG89J3JpZ2h0Jz09PWU/J2xlZnQnOid0b3AnLG49ZltvXTtyZXR1cm4gZltlXT5hW2VdJiYhdC5lc2NhcGVXaXRoUmVmZXJlbmNlJiYobj1RKGZbb10sYVtlXS0oJ3JpZ2h0Jz09PWU/Zi53aWR0aDpmLmhlaWdodCkpKSxhZSh7fSxvLG4pfX07cmV0dXJuIGwuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD0tMT09PVsnbGVmdCcsJ3RvcCddLmluZGV4T2YoZSk/J3NlY29uZGFyeSc6J3ByaW1hcnknO2Y9bGUoe30sZixtW3RdKGUpKX0pLGUub2Zmc2V0cy5wb3BwZXI9ZixlfSxwcmlvcml0eTpbJ2xlZnQnLCdyaWdodCcsJ3RvcCcsJ2JvdHRvbSddLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDonc2Nyb2xsUGFyZW50J30sa2VlcFRvZ2V0aGVyOntvcmRlcjo0MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXt2YXIgdD1lLm9mZnNldHMsbz10LnBvcHBlcixuPXQucmVmZXJlbmNlLGk9ZS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXSxyPSQscD0tMSE9PVsndG9wJywnYm90dG9tJ10uaW5kZXhPZihpKSxzPXA/J3JpZ2h0JzonYm90dG9tJyxkPXA/J2xlZnQnOid0b3AnLGE9cD8nd2lkdGgnOidoZWlnaHQnO3JldHVybiBvW3NdPHIobltkXSkmJihlLm9mZnNldHMucG9wcGVyW2RdPXIobltkXSktb1thXSksb1tkXT5yKG5bc10pJiYoZS5vZmZzZXRzLnBvcHBlcltkXT1yKG5bc10pKSxlfX0sYXJyb3c6e29yZGVyOjUwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsbyl7dmFyIG47aWYoIXEoZS5pbnN0YW5jZS5tb2RpZmllcnMsJ2Fycm93Jywna2VlcFRvZ2V0aGVyJykpcmV0dXJuIGU7dmFyIGk9by5lbGVtZW50O2lmKCdzdHJpbmcnPT10eXBlb2YgaSl7aWYoaT1lLmluc3RhbmNlLnBvcHBlci5xdWVyeVNlbGVjdG9yKGkpLCFpKXJldHVybiBlO31lbHNlIGlmKCFlLmluc3RhbmNlLnBvcHBlci5jb250YWlucyhpKSlyZXR1cm4gY29uc29sZS53YXJuKCdXQVJOSU5HOiBgYXJyb3cuZWxlbWVudGAgbXVzdCBiZSBjaGlsZCBvZiBpdHMgcG9wcGVyIGVsZW1lbnQhJyksZTt2YXIgcj1lLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdLHA9ZS5vZmZzZXRzLHM9cC5wb3BwZXIsZD1wLnJlZmVyZW5jZSxhPS0xIT09WydsZWZ0JywncmlnaHQnXS5pbmRleE9mKHIpLGw9YT8naGVpZ2h0Jzond2lkdGgnLGY9YT8nVG9wJzonTGVmdCcsbT1mLnRvTG93ZXJDYXNlKCksaD1hPydsZWZ0JzondG9wJyxjPWE/J2JvdHRvbSc6J3JpZ2h0Jyx1PVMoaSlbbF07ZFtjXS11PHNbbV0mJihlLm9mZnNldHMucG9wcGVyW21dLT1zW21dLShkW2NdLXUpKSxkW21dK3U+c1tjXSYmKGUub2Zmc2V0cy5wb3BwZXJbbV0rPWRbbV0rdS1zW2NdKSxlLm9mZnNldHMucG9wcGVyPWcoZS5vZmZzZXRzLnBvcHBlcik7dmFyIGI9ZFttXStkW2xdLzItdS8yLHk9dChlLmluc3RhbmNlLnBvcHBlciksdz1wYXJzZUZsb2F0KHlbJ21hcmdpbicrZl0sMTApLEU9cGFyc2VGbG9hdCh5Wydib3JkZXInK2YrJ1dpZHRoJ10sMTApLHY9Yi1lLm9mZnNldHMucG9wcGVyW21dLXctRTtyZXR1cm4gdj1KKFEoc1tsXS11LHYpLDApLGUuYXJyb3dFbGVtZW50PWksZS5vZmZzZXRzLmFycm93PShuPXt9LGFlKG4sbSxaKHYpKSxhZShuLGgsJycpLG4pLGV9LGVsZW1lbnQ6J1t4LWFycm93XSd9LGZsaXA6e29yZGVyOjYwMCxlbmFibGVkOiEwLGZuOmZ1bmN0aW9uKGUsdCl7aWYoVyhlLmluc3RhbmNlLm1vZGlmaWVycywnaW5uZXInKSlyZXR1cm4gZTtpZihlLmZsaXBwZWQmJmUucGxhY2VtZW50PT09ZS5vcmlnaW5hbFBsYWNlbWVudClyZXR1cm4gZTt2YXIgbz12KGUuaW5zdGFuY2UucG9wcGVyLGUuaW5zdGFuY2UucmVmZXJlbmNlLHQucGFkZGluZyx0LmJvdW5kYXJpZXNFbGVtZW50LGUucG9zaXRpb25GaXhlZCksbj1lLnBsYWNlbWVudC5zcGxpdCgnLScpWzBdLGk9VChuKSxyPWUucGxhY2VtZW50LnNwbGl0KCctJylbMV18fCcnLHA9W107c3dpdGNoKHQuYmVoYXZpb3Ipe2Nhc2UgaGUuRkxJUDpwPVtuLGldO2JyZWFrO2Nhc2UgaGUuQ0xPQ0tXSVNFOnA9VihuKTticmVhaztjYXNlIGhlLkNPVU5URVJDTE9DS1dJU0U6cD1WKG4sITApO2JyZWFrO2RlZmF1bHQ6cD10LmJlaGF2aW9yO31yZXR1cm4gcC5mb3JFYWNoKGZ1bmN0aW9uKHMsZCl7aWYobiE9PXN8fHAubGVuZ3RoPT09ZCsxKXJldHVybiBlO249ZS5wbGFjZW1lbnQuc3BsaXQoJy0nKVswXSxpPVQobik7dmFyIGE9ZS5vZmZzZXRzLnBvcHBlcixsPWUub2Zmc2V0cy5yZWZlcmVuY2UsZj0kLG09J2xlZnQnPT09biYmZihhLnJpZ2h0KT5mKGwubGVmdCl8fCdyaWdodCc9PT1uJiZmKGEubGVmdCk8ZihsLnJpZ2h0KXx8J3RvcCc9PT1uJiZmKGEuYm90dG9tKT5mKGwudG9wKXx8J2JvdHRvbSc9PT1uJiZmKGEudG9wKTxmKGwuYm90dG9tKSxoPWYoYS5sZWZ0KTxmKG8ubGVmdCksYz1mKGEucmlnaHQpPmYoby5yaWdodCksZz1mKGEudG9wKTxmKG8udG9wKSx1PWYoYS5ib3R0b20pPmYoby5ib3R0b20pLGI9J2xlZnQnPT09biYmaHx8J3JpZ2h0Jz09PW4mJmN8fCd0b3AnPT09biYmZ3x8J2JvdHRvbSc9PT1uJiZ1LHk9LTEhPT1bJ3RvcCcsJ2JvdHRvbSddLmluZGV4T2Yobiksdz0hIXQuZmxpcFZhcmlhdGlvbnMmJih5JiYnc3RhcnQnPT09ciYmaHx8eSYmJ2VuZCc9PT1yJiZjfHwheSYmJ3N0YXJ0Jz09PXImJmd8fCF5JiYnZW5kJz09PXImJnUpOyhtfHxifHx3KSYmKGUuZmxpcHBlZD0hMCwobXx8YikmJihuPXBbZCsxXSksdyYmKHI9RyhyKSksZS5wbGFjZW1lbnQ9bisocj8nLScrcjonJyksZS5vZmZzZXRzLnBvcHBlcj1sZSh7fSxlLm9mZnNldHMucG9wcGVyLEQoZS5pbnN0YW5jZS5wb3BwZXIsZS5vZmZzZXRzLnJlZmVyZW5jZSxlLnBsYWNlbWVudCkpLGU9UChlLmluc3RhbmNlLm1vZGlmaWVycyxlLCdmbGlwJykpfSksZX0sYmVoYXZpb3I6J2ZsaXAnLHBhZGRpbmc6NSxib3VuZGFyaWVzRWxlbWVudDondmlld3BvcnQnfSxpbm5lcjp7b3JkZXI6NzAwLGVuYWJsZWQ6ITEsZm46ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wbGFjZW1lbnQsbz10LnNwbGl0KCctJylbMF0sbj1lLm9mZnNldHMsaT1uLnBvcHBlcixyPW4ucmVmZXJlbmNlLHA9LTEhPT1bJ2xlZnQnLCdyaWdodCddLmluZGV4T2Yobykscz0tMT09PVsndG9wJywnbGVmdCddLmluZGV4T2Yobyk7cmV0dXJuIGlbcD8nbGVmdCc6J3RvcCddPXJbb10tKHM/aVtwPyd3aWR0aCc6J2hlaWdodCddOjApLGUucGxhY2VtZW50PVQodCksZS5vZmZzZXRzLnBvcHBlcj1nKGkpLGV9fSxoaWRlOntvcmRlcjo4MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXtpZighcS
21167hlLmluc3RhbmNlLm1vZGlmaWVycywnaGlkZScsJ3ByZXZlbnRPdmVyZmxvdycpKXJldHVybiBlO3ZhciB0PWUub2Zmc2V0cy5yZWZlcmVuY2Usbz1DKGUuaW5zdGFuY2UubW9kaWZpZXJzLGZ1bmN0aW9uKGUpe3JldHVybidwcmV2ZW50T3ZlcmZsb3cnPT09ZS5uYW1lfSkuYm91bmRhcmllcztpZih0LmJvdHRvbTxvLnRvcHx8dC5sZWZ0Pm8ucmlnaHR8fHQudG9wPm8uYm90dG9tfHx0LnJpZ2h0PG8ubGVmdCl7aWYoITA9PT1lLmhpZGUpcmV0dXJuIGU7ZS5oaWRlPSEwLGUuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddPScnfWVsc2V7aWYoITE9PT1lLmhpZGUpcmV0dXJuIGU7ZS5oaWRlPSExLGUuYXR0cmlidXRlc1sneC1vdXQtb2YtYm91bmRhcmllcyddPSExfXJldHVybiBlfX0sY29tcHV0ZVN0eWxlOntvcmRlcjo4NTAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlLHQpe3ZhciBvPXQueCxuPXQueSxpPWUub2Zmc2V0cy5wb3BwZXIscj1DKGUuaW5zdGFuY2UubW9kaWZpZXJzLGZ1bmN0aW9uKGUpe3JldHVybidhcHBseVN0eWxlJz09PWUubmFtZX0pLmdwdUFjY2VsZXJhdGlvbjt2b2lkIDAhPT1yJiZjb25zb2xlLndhcm4oJ1dBUk5JTkc6IGBncHVBY2NlbGVyYXRpb25gIG9wdGlvbiBtb3ZlZCB0byBgY29tcHV0ZVN0eWxlYCBtb2RpZmllciBhbmQgd2lsbCBub3QgYmUgc3VwcG9ydGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiBQb3BwZXIuanMhJyk7dmFyIHMsZCxhPXZvaWQgMD09PXI/dC5ncHVBY2NlbGVyYXRpb246cixsPXAoZS5pbnN0YW5jZS5wb3BwZXIpLGY9dShsKSxtPXtwb3NpdGlvbjppLnBvc2l0aW9ufSxoPXtsZWZ0OiQoaS5sZWZ0KSx0b3A6WihpLnRvcCksYm90dG9tOlooaS5ib3R0b20pLHJpZ2h0OiQoaS5yaWdodCl9LGM9J2JvdHRvbSc9PT1vPyd0b3AnOidib3R0b20nLGc9J3JpZ2h0Jz09PW4/J2xlZnQnOidyaWdodCcsYj1IKCd0cmFuc2Zvcm0nKTtpZihkPSdib3R0b20nPT1jPydIVE1MJz09PWwubm9kZU5hbWU/LWwuY2xpZW50SGVpZ2h0K2guYm90dG9tOi1mLmhlaWdodCtoLmJvdHRvbTpoLnRvcCxzPSdyaWdodCc9PWc/J0hUTUwnPT09bC5ub2RlTmFtZT8tbC5jbGllbnRXaWR0aCtoLnJpZ2h0Oi1mLndpZHRoK2gucmlnaHQ6aC5sZWZ0LGEmJmIpbVtiXT0ndHJhbnNsYXRlM2QoJytzKydweCwgJytkKydweCwgMCknLG1bY109MCxtW2ddPTAsbS53aWxsQ2hhbmdlPSd0cmFuc2Zvcm0nO2Vsc2V7dmFyIHk9J2JvdHRvbSc9PWM/LTE6MSx3PSdyaWdodCc9PWc/LTE6MTttW2NdPWQqeSxtW2ddPXMqdyxtLndpbGxDaGFuZ2U9YysnLCAnK2d9dmFyIEU9e1wieC1wbGFjZW1lbnRcIjplLnBsYWNlbWVudH07cmV0dXJuIGUuYXR0cmlidXRlcz1sZSh7fSxFLGUuYXR0cmlidXRlcyksZS5zdHlsZXM9bGUoe30sbSxlLnN0eWxlcyksZS5hcnJvd1N0eWxlcz1sZSh7fSxlLm9mZnNldHMuYXJyb3csZS5hcnJvd1N0eWxlcyksZX0sZ3B1QWNjZWxlcmF0aW9uOiEwLHg6J2JvdHRvbScseToncmlnaHQnfSxhcHBseVN0eWxlOntvcmRlcjo5MDAsZW5hYmxlZDohMCxmbjpmdW5jdGlvbihlKXtyZXR1cm4gaihlLmluc3RhbmNlLnBvcHBlcixlLnN0eWxlcyksSyhlLmluc3RhbmNlLnBvcHBlcixlLmF0dHJpYnV0ZXMpLGUuYXJyb3dFbGVtZW50JiZPYmplY3Qua2V5cyhlLmFycm93U3R5bGVzKS5sZW5ndGgmJmooZS5hcnJvd0VsZW1lbnQsZS5hcnJvd1N0eWxlcyksZX0sb25Mb2FkOmZ1bmN0aW9uKGUsdCxvLG4saSl7dmFyIHI9TChpLHQsZSxvLnBvc2l0aW9uRml4ZWQpLHA9TyhvLnBsYWNlbWVudCxyLHQsZSxvLm1vZGlmaWVycy5mbGlwLmJvdW5kYXJpZXNFbGVtZW50LG8ubW9kaWZpZXJzLmZsaXAucGFkZGluZyk7cmV0dXJuIHQuc2V0QXR0cmlidXRlKCd4LXBsYWNlbWVudCcscCksaih0LHtwb3NpdGlvbjpvLnBvc2l0aW9uRml4ZWQ/J2ZpeGVkJzonYWJzb2x1dGUnfSksb30sZ3B1QWNjZWxlcmF0aW9uOnZvaWQgMH19fSxjZX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9cG9wcGVyLm1pbi5qcy5tYXBcbiIsIi8qKlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIEJvb3RzdHJhcCAodjQuMC4wLWFscGhhLjYpOiBpbmRleC5qc1xuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYXN0ZXIvTElDRU5TRSlcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKi9cbihmdW5jdGlvbiAoJCkge1xuICBpZiAodHlwZW9mICQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGpRdWVyeS4galF1ZXJ5IG11c3QgYmUgaW5jbHVkZWQgYmVmb3JlIEJvb3RzdHJhcFxcJ3MgSmF2YVNjcmlwdC4nKTtcbiAgfVxuXG4gIHZhciB2ZXJzaW9uID0gJC5mbi5qcXVlcnkuc3BsaXQoJyAnKVswXS5zcGxpdCgnLicpO1xuICB2YXIgbWluTWFqb3IgPSAxO1xuICB2YXIgbHRNYWpvciA9IDI7XG4gIHZhciBtaW5NaW5vciA9IDk7XG4gIHZhciBtaW5QYXRjaCA9IDE7XG4gIHZhciBtYXhNYWpvciA9IDQ7XG5cbiAgaWYgKHZlcnNpb25bMF0gPCBsdE1ham9yICYmIHZlcnNpb25bMV0gPCBtaW5NaW5vciB8fCB2ZXJzaW9uWzBdID09PSBtaW5NYWpvciAmJiB2ZXJzaW9uWzFdID09PSBtaW5NaW5vciAmJiB2ZXJzaW9uWzJdIDwgbWluUGF0Y2ggfHwgdmVyc2lvblswXSA+PSBtYXhNYWpvcikge1xuICAgIHRocm93IG5ldyBFcnJvcignQm9vdHN0cmFwXFwncyBKYXZhU2NyaXB0IHJlcXVpcmVzIGF0IGxlYXN0IGpRdWVyeSB2MS45LjEgYnV0IGxlc3MgdGhhbiB2NC4wLjAnKTtcbiAgfVxufSkoJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleC5qcy5tYXAiLCIvKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IHV0aWwuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG52YXIgVXRpbCA9IGZ1bmN0aW9uICgkKSB7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogUHJpdmF0ZSBUcmFuc2l0aW9uRW5kIEhlbHBlcnNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgdHJhbnNpdGlvbiA9IGZhbHNlO1xuICB2YXIgTUFYX1VJRCA9IDEwMDAwMDA7IC8vIFNob3V0b3V0IEFuZ3VzQ3JvbGwgKGh0dHBzOi8vZ29vLmdsL3B4d1FHcClcblxuICBmdW5jdGlvbiB0b1R5cGUob2JqKSB7XG4gICAgcmV0dXJuIHt9LnRvU3RyaW5nLmNhbGwob2JqKS5tYXRjaCgvXFxzKFthLXpBLVpdKykvKVsxXS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U3BlY2lhbFRyYW5zaXRpb25FbmRFdmVudCgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgYmluZFR5cGU6IHRyYW5zaXRpb24uZW5kLFxuICAgICAgZGVsZWdhdGVUeXBlOiB0cmFuc2l0aW9uLmVuZCxcbiAgICAgIGhhbmRsZTogZnVuY3Rpb24gaGFuZGxlKGV2ZW50KSB7XG4gICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXModGhpcykpIHtcbiAgICAgICAgICByZXR1cm4gZXZlbnQuaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgICAgfVxuXG4gICAgICAgI
21167HJldHVybiB1bmRlZmluZWQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZpbmVkXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRUZXN0KCkge1xuICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuUVVuaXQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgZW5kOiAndHJhbnNpdGlvbmVuZCdcbiAgICB9O1xuICB9XG5cbiAgZnVuY3Rpb24gdHJhbnNpdGlvbkVuZEVtdWxhdG9yKGR1cmF0aW9uKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBjYWxsZWQgPSBmYWxzZTtcbiAgICAkKHRoaXMpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoKSB7XG4gICAgICBjYWxsZWQgPSB0cnVlO1xuICAgIH0pO1xuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKCFjYWxsZWQpIHtcbiAgICAgICAgVXRpbC50cmlnZ2VyVHJhbnNpdGlvbkVuZChfdGhpcyk7XG4gICAgICB9XG4gICAgfSwgZHVyYXRpb24pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VHJhbnNpdGlvbkVuZFN1cHBvcnQoKSB7XG4gICAgdHJhbnNpdGlvbiA9IHRyYW5zaXRpb25FbmRUZXN0KCk7XG4gICAgJC5mbi5lbXVsYXRlVHJhbnNpdGlvbkVuZCA9IHRyYW5zaXRpb25FbmRFbXVsYXRvcjtcblxuICAgIGlmIChVdGlsLnN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpKSB7XG4gICAgICAkLmV2ZW50LnNwZWNpYWxbVXRpbC5UUkFOU0lUSU9OX0VORF0gPSBnZXRTcGVjaWFsVHJhbnNpdGlvbkVuZEV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZXNjYXBlSWQoc2VsZWN0b3IpIHtcbiAgICAvLyBXZSBlc2NhcGUgSURzIGluIGNhc2Ugb2Ygc3BlY2lhbCBzZWxlY3RvcnMgKHNlbGVjdG9yID0gJyNteUlkOnNvbWV0aGluZycpXG4gICAgLy8gJC5lc2NhcGVTZWxlY3RvciBkb2VzIG5vdCBleGlzdCBpbiBqUXVlcnkgPCAzXG4gICAgc2VsZWN0b3IgPSB0eXBlb2YgJC5lc2NhcGVTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJyA/ICQuZXNjYXBlU2VsZWN0b3Ioc2VsZWN0b3IpLnN1YnN0cigxKSA6IHNlbGVjdG9yLnJlcGxhY2UoLyg6fFxcLnxcXFt8XFxdfCx8PXxAKS9nLCAnXFxcXCQxJyk7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBQdWJsaWMgVXRpbCBBcGlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICB2YXIgVXRpbCA9IHtcbiAgICBUUkFOU0lUSU9OX0VORDogJ2JzVHJhbnNpdGlvbkVuZCcsXG4gICAgZ2V0VUlEOiBmdW5jdGlvbiBnZXRVSUQocHJlZml4KSB7XG4gICAgICBkbyB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1iaXR3aXNlXG4gICAgICAgIHByZWZpeCArPSB+fihNYXRoLnJhbmRvbSgpICogTUFYX1VJRCk7IC8vIFwifn5cIiBhY3RzIGxpa2UgYSBmYXN0ZXIgTWF0aC5mbG9vcigpIGhlcmVcbiAgICAgIH0gd2hpbGUgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHByZWZpeCkpO1xuXG4gICAgICByZXR1cm4gcHJlZml4O1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudDogZnVuY3Rpb24gZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2Y
21167XIgc2VsZWN0b3IgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS10YXJnZXQnKTtcblxuICAgICAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgICAgIHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSB8fCAnJztcbiAgICAgIH0gLy8gSWYgaXQncyBhbiBJRFxuXG5cbiAgICAgIGlmIChzZWxlY3Rvci5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgICBzZWxlY3RvciA9IGVzY2FwZUlkKHNlbGVjdG9yKTtcbiAgICAgIH1cblxuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyICRzZWxlY3RvciA9ICQoZG9jdW1lbnQpLmZpbmQoc2VsZWN0b3IpO1xuICAgICAgICByZXR1cm4gJHNlbGVjdG9yLmxlbmd0aCA+IDAgPyBzZWxlY3RvciA6IG51bGw7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfSxcbiAgICByZWZsb3c6IGZ1bmN0aW9uIHJlZmxvdyhlbGVtZW50KSB7XG4gICAgICByZXR1cm4gZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgfSxcbiAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gdHJpZ2dlclRyYW5zaXRpb25FbmQoZWxlbWVudCkge1xuICAgICAgJChlbGVtZW50KS50cmlnZ2VyKHRyYW5zaXRpb24uZW5kKTtcbiAgICB9LFxuICAgIHN1cHBvcnRzVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24gc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odHJhbnNpdGlvbik7XG4gICAgfSxcbiAgICBpc0VsZW1lbnQ6IGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICAgIHJldHVybiAob2JqWzBdIHx8IG9iaikubm9kZVR5cGU7XG4gICAgfSxcbiAgICB0eXBlQ2hlY2tDb25maWc6IGZ1bmN0aW9uIHR5cGVDaGVja0NvbmZpZyhjb21wb25lbnROYW1lLCBjb25maWcsIGNvbmZpZ1R5cGVzKSB7XG4gICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBjb25maWdUeXBlcykge1xuICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGNvbmZpZ1R5cGVzLCBwcm9wZXJ0eSkpIHtcbiAgICAgICAgICB2Y
21167XIgZXhwZWN0ZWRUeXBlcyA9IGNvbmZpZ1R5cGVzW3Byb3BlcnR5XTtcbiAgICAgICAgICB2YXIgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgICAgIHZhciB2YWx1ZVR5cGUgPSB2YWx1ZSAmJiBVdGlsLmlzRWxlbWVudCh2YWx1ZSkgPyAnZWxlbWVudCcgOiB0b1R5cGUodmFsdWUpO1xuXG4gICAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvbXBvbmVudE5hbWUudG9VcHBlckNhc2UoKSArIFwiOiBcIiArIChcIk9wdGlvbiBcXFwiXCIgKyBwcm9wZXJ0eSArIFwiXFxcIiBwcm92aWRlZCB0eXBlIFxcXCJcIiArIHZhbHVlVHlwZSArIFwiXFxcIiBcIikgKyAoXCJidXQgZXhwZWN0ZWQgdHlwZSBcXFwiXCIgKyBleHBlY3RlZFR5cGVzICsgXCJcXFwiLlwiKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBzZXRUcmFuc2l0aW9uRW5kU3VwcG9ydCgpO1xuICByZXR1cm4gVXRpbDtcbn0oJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD11dGlsLmpzLm1hcCIsImZ1bmN0aW9uIF9kZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgeyB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOyBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7IGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTsgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTsgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci
211675rZXksIGRlc2NyaXB0b3IpOyB9IH1cblxuZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgeyBpZiAocHJvdG9Qcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IucHJvdG90eXBlLCBwcm90b1Byb3BzKTsgaWYgKHN0YXRpY1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpOyByZXR1cm4gQ29uc3RydWN0b3I7IH1cblxuLyoqXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQm9vdHN0cmFwICh2NC4wLjApOiBidXR0b24uanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG52YXIgQnV0dG9uID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdidXR0b24nO1xuICB2YXIgVkVSU0lPTiA9ICc0LjAuMCc7XG4gIHZhciBEQVRBX0tFWSA9ICdicy5idXR0b24nO1xuICB2YXIgRVZFTlRfS0VZID0gXCIuXCIgKyBEQVRBX0tFWTtcbiAgdmFyIERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICB2YXIgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltOQU1FXTtcbiAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICBBQ1RJVkU6ICdhY3RpdmUnLFxuICAgIEJVVFRPTjogJ2J0bicsXG4gICAgRk9DVVM6ICdmb2N1cydcbiAgfTtcbiAgdmFyIFNlbGVjdG9yID0ge1xuICAgIERBVEFfVE9HR0xFX0NBUlJPVDogJ1tkYXRhLXRvZ2dsZV49XCJidXR0b25cIl0nLFxuICAgIERBVEFfVE9HR0xFOiAnW2RhdGEtdG9nZ2xlPVwiYnV0dG9uc1wiXScsXG4gICAgSU5QVVQ6ICdpbnB1dCcsXG4gICAgQUNUSVZFOiAnLmFjdGl2ZScsXG4gICAgQlVUVE9OOiAnLmJ0bidcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVksXG4gICAgRk9DVVNfQkxVUl9EQVRBX0FQSTogXCJmb2N1c1wiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZICsgXCIgXCIgKyAoXCJibHVyXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVkpXG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gIH07XG5cbiAgdmFyIEJ1dHRvbiA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIEJ1dHRvbihlbGVtZW50KSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICB9IC8vIEdldHRlcnNcblxuXG4gICAgdmFyIF9wcm90byA9IEJ1dHRvbi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgdmFyIHRyaWdnZXJDaGFuZ2VFdmVudCA9IHRydWU7XG4gICAgICB2Y
21167XIgYWRkQXJpYVByZXNzZWQgPSB0cnVlO1xuICAgICAgdmFyIHJvb3RFbGVtZW50ID0gJCh0aGlzLl9lbGVtZW50KS5jbG9zZXN0KFNlbGVjdG9yLkRBVEFfVE9HR0xFKVswXTtcblxuICAgICAgaWYgKHJvb3RFbGVtZW50KSB7XG4gICAgICAgIHZhciBpbnB1dCA9ICQodGhpcy5fZWxlbWVudCkuZmluZChTZWxlY3Rvci5JTlBVVClbMF07XG5cbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgaWYgKGlucHV0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGVja2VkICYmICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSkpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckNoYW5nZUV2ZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9ICQocm9vdEVsZW1lbnQpLmZpbmQoU2VsZWN0b3IuQUNUSVZFKVswXTtcblxuICAgICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCkge1xuICAgICAgICAgICAgICAgICQoYWN0aXZlRWxlbWVudCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpIHx8IHJvb3RFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSB8fCBpbnB1dC5jbGFzc0xpc3QuY29udGFpbnMoJ2Rpc2FibGVkJykgfHwgcm9vdEVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKCdkaXNhYmxlZCcpKSB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaW5wdXQuY2hlY2tlZCA9ICEkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5BQ1RJVkUpO1xuICAgICAgICAgICAgJChpbnB1dCkudHJpZ2dlcignY2hhbmdlJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaW5wdXQuZm9jdXMoKTtcbiAgICAgICAgICBhZGRBcmlhUHJlc3NlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChhZGRBcmlhUHJlc3NlZCkge1xuICAgICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1wcmVzc2VkJywgISQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHJpZ2dlckNoYW5nZUV2ZW50KSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkudG9nZ2xlQ2xhc3MoQ2xhc3NOYW1lLkFDVElWRSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgQnV0dG9uLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBkYXRhID0gJCh0aGlzKS5kYXRhKERBVEFfS0VZKTtcblxuICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICBkYXRhID0gbmV3IEJ1dHRvbih0aGlzKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZyA9PT0gJ3RvZ2dsZScpIHtcbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhCdXR0b24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBCdXR0b247XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEVfQ0FSUk9ULCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHZhciBidXR0b24gPSBldmVudC50YXJnZXQ7XG5cbiAgICBpZiAoISQoYnV0dG9uKS5oYXNDbGFzcyhDbGFzc05hbWUuQlVUVE9OKSkge1xuICAgICAgYnV0dG9uID0gJChidXR0b24pLmNsb3Nlc3QoU2VsZWN0b3IuQlVUVE9OKTtcbiAgICB9XG5cbiAgICBCdXR0b24uX2pRdWVyeUludGVyZmFjZS5jYWxsKCQoYnV0dG9uKSwgJ3RvZ2dsZScpO1xuICB9KS5vbihFdmVudC5GT0NVU19CTFVSX0RBVEFfQVBJLCBTZWxlY3Rvci5EQVRBX1RPR0dMRV9DQVJST1QsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBidXR0b24gPSAkKGV2ZW50LnRhcmdldCkuY2xvc2VzdChTZWxlY3Rvci5CVVRUT04pWzBdO1xuICAgICQoYnV0dG9uKS50b2dnbGVDbGFzcyhDbGFzc05hbWUuRk9DVVMsIC9eZm9jdXMoaW4pPyQvLnRlc3QoZXZlbnQudHlwZSkpO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICQuZm5bTkFNRV0gPSBCdXR0b24uX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IEJ1dHRvbjtcblxuICAkLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICByZXR1cm4gQnV0dG9uLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgcmV0dXJuIEJ1dHRvbjt
21167cbn0oJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1idXR0b24uanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IGNvbGxhcHNlLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xudmFyIENvbGxhcHNlID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdjb2xsYXBzZSc7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLmNvbGxhcHNlJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBUUkFOU0lUSU9OX0RVUkFUSU9OID0gNjAwO1xuICB2YXIgRGVmYXVsdCA9IHtcbiAgICB0b2dnbGU6IHRydWUsXG4gICAgcGFyZW50OiAnJ1xuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUgPSB7XG4gICAgdG9nZ2xlOiAnYm9vbGVhbicsXG4gICAgcGFyZW50OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIFNIT1c6IFwic2hvd1wiICsgRVZFTlRfS0VZLFxuICAgIFNIT1dOOiBcInNob3duXCIgKyBFVkVOVF9LRVksXG4gICAgSElERTogXCJoaWRlXCIgKyBFVkVOVF9LRVksXG4gICAgSElEREVOOiBcImhpZGRlblwiICsgRVZFTlRfS0VZLFxuICAgIENMSUNLX0RBVEFfQVBJOiBcImNsaWNrXCIgKyBFVkVOVF9LRVkgKyBEQVRBX0FQSV9LRVlcbiAgfTtcbiAgdmFyIENsYXNzTmFtZSA9IHtcbiAgICBTSE9XOiAnc2hvdycsXG4gICAgQ09MTEFQU0U6ICdjb2xsYXBzZScsXG4gICAgQ09MTEFQU0lORzogJ2NvbGxhcHNpbmcnLFxuICAgIENPTExBUFNFRDogJ2NvbGxhcHNlZCdcbiAgfTtcbiAgdmFyIERpbWVuc2lvbiA9IHtcbiAgICBXSURUSDogJ3dpZHRoJyxcbiAgICBIRUlHSFQ6ICdoZWlnaHQnXG4gIH07XG4gIHZhciBTZWxlY3RvciA9IHtcbiAgICBBQ1RJVkVTOiAnLnNob3csIC5jb2xsYXBzaW5nJyxcbiAgICBEQVRBX1RPR0dMRTogJ1tkYXRhLXRvZ2dsZT1cImNvbGxhcHNlXCJdJ1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICB9O1xuXG4gIHZhciBDb2xsYXBzZSA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIENvbGxhcHNlKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuX2NvbmZpZyA9IHRoaXMuX2dldENvbmZpZyhjb25maWcpO1xuICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gJC5tYWtlQXJyYXkoJChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtocmVmPVxcXCIjXCIgKyBlbGVtZW50LmlkICsgXCJcXFwiXSxcIiArIChcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXRhcmdldD1cXFwiI1wiICsgZWxlbWVudC5pZCArIFwiXFxcIl1cIikpKTtcbiAgICAgIHZhciB0YWJUb2dnbGVzID0gJChTZWxlY3Rvci5EQVRBX1RPR0dMRSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGFiVG9nZ2xlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2Y
21167XIgZWxlbSA9IHRhYlRvZ2dsZXNbaV07XG4gICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtKTtcblxuICAgICAgICBpZiAoc2VsZWN0b3IgIT09IG51bGwgJiYgJChzZWxlY3RvcikuZmlsdGVyKGVsZW1lbnQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICB0aGlzLl9zZWxlY3RvciA9IHNlbGVjdG9yO1xuXG4gICAgICAgICAgdGhpcy5fdHJpZ2dlckFycmF5LnB1c2goZWxlbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fcGFyZW50ID0gdGhpcy5fY29uZmlnLnBhcmVudCA/IHRoaXMuX2dldFBhcmVudCgpIDogbnVsbDtcblxuICAgICAgaWYgKCF0aGlzLl9jb25maWcucGFyZW50KSB7XG4gICAgICAgIHRoaXMuX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyh0aGlzLl9lbGVtZW50LCB0aGlzLl90cmlnZ2VyQXJyYXkpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5fY29uZmlnLnRvZ2dsZSkge1xuICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgfVxuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gQ29sbGFwc2UucHJvdG90eXBlO1xuXG4gICAgLy8gUHVibGljXG4gICAgX3Byb3RvLnRvZ2dsZSA9IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICgkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uc2hvdyA9IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICB2Y
21167XIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGFjdGl2ZXM7XG4gICAgICB2YXIgYWN0aXZlc0RhdGE7XG5cbiAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHtcbiAgICAgICAgYWN0aXZlcyA9ICQubWFrZUFycmF5KCQodGhpcy5fcGFyZW50KS5maW5kKFNlbGVjdG9yLkFDVElWRVMpLmZpbHRlcihcIltkYXRhLXBhcmVudD1cXFwiXCIgKyB0aGlzLl9jb25maWcucGFyZW50ICsgXCJcXFwiXVwiKSk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgYWN0aXZlcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFjdGl2ZXMpIHtcbiAgICAgICAgYWN0aXZlc0RhdGEgPSAkKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvcikuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZXNEYXRhICYmIGFjdGl2ZXNEYXRhLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIHN0YXJ0RXZlbnQgPSAkLkV2ZW50KEV2ZW50LlNIT1cpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHN0YXJ0RXZlbnQpO1xuXG4gICAgICBpZiAoc3RhcnRFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChhY3RpdmVzKSB7XG4gICAgICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UuY2FsbCgkKGFjdGl2ZXMpLm5vdCh0aGlzLl9zZWxlY3RvciksICdoaWRlJyk7XG5cbiAgICAgICAgaWYgKCFhY3RpdmVzRGF0YSkge1xuICAgICAgICAgICQoYWN0aXZlcykuZGF0YShEQVRBX0tFWSwgbnVsbCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdmFyIGRpbWVuc2lvbiA9IHRoaXMuX2dldERpbWVuc2lvbigpO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNJTkcpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtkaW1lbnNpb25dID0gMDtcblxuICAgICAgaWYgKHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICQodGhpcy5fdHJpZ2dlckFycmF5KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0VEKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0VHJhbnNpdGlvbmluZyh0cnVlKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICQoX3RoaXMuX2VsZW1lbnQpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTSU5HKS5hZGRDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0UpLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcbiAgICAgICAgX3RoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9ICcnO1xuXG4gICAgICAgIF90aGlzLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuXG4gICAgICAgICQoX3RoaXMuX2VsZW1lbnQpLnRyaWdnZXIoRXZlbnQuU0hPV04pO1xuICAgICAgfTtcblxuICAgICAgaWYgKCFVdGlsLnN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNhcGl0YWxpemVkRGltZW5zaW9uID0gZGltZW5zaW9uWzBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoMSk7XG4gICAgICB2Y
21167XIgc2Nyb2xsU2l6ZSA9IFwic2Nyb2xsXCIgKyBjYXBpdGFsaXplZERpbWVuc2lvbjtcbiAgICAgICQodGhpcy5fZWxlbWVudCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNvbXBsZXRlKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChUUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnRbc2Nyb2xsU2l6ZV0gKyBcInB4XCI7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICEkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5TSE9XKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBzdGFydEV2ZW50ID0gJC5FdmVudChFdmVudC5ISURFKTtcbiAgICAgICQodGhpcy5fZWxlbWVudCkudHJpZ2dlcihzdGFydEV2ZW50KTtcblxuICAgICAgaWYgKHN0YXJ0RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgZGltZW5zaW9uID0gdGhpcy5fZ2V0RGltZW5zaW9uKCk7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbZGltZW5zaW9uXSA9IHRoaXMuX2VsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZGltZW5zaW9uXSArIFwicHhcIjtcbiAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS5hZGRDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgIGlmICh0aGlzLl90cmlnZ2VyQXJyYXkubGVuZ3RoID4gMCkge1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3RyaWdnZXJBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy5fdHJpZ2dlckFycmF5W2ldO1xuICAgICAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudCh0cmlnZ2VyKTtcblxuICAgICAgICAgIGlmIChzZWxlY3RvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyICRlbGVtID0gJChzZWxlY3Rvcik7XG5cbiAgICAgICAgICAgIGlmICghJGVsZW0uaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpKSB7XG4gICAgICAgICAgICAgICQodHJpZ2dlcikuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFRCkuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zZXRUcmFuc2l0aW9uaW5nKHRydWUpO1xuXG4gICAgICB2Y
21167XIgY29tcGxldGUgPSBmdW5jdGlvbiBjb21wbGV0ZSgpIHtcbiAgICAgICAgX3RoaXMyLnNldFRyYW5zaXRpb25pbmcoZmFsc2UpO1xuXG4gICAgICAgICQoX3RoaXMyLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuQ09MTEFQU0lORykuYWRkQ2xhc3MoQ2xhc3NOYW1lLkNPTExBUFNFKS50cmlnZ2VyKEV2ZW50LkhJRERFTik7XG4gICAgICB9O1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlW2RpbWVuc2lvbl0gPSAnJztcblxuICAgICAgaWYgKCFVdGlsLnN1cHBvcnRzVHJhbnNpdGlvbkVuZCgpKSB7XG4gICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0VHJhbnNpdGlvbmluZyA9IGZ1bmN0aW9uIHNldFRyYW5zaXRpb25pbmcoaXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBpc1RyYW5zaXRpb25pbmc7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBudWxsO1xuICAgICAgdGhpcy5fdHJpZ2dlckFycmF5ID0gbnVsbDtcbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IG51bGw7XG4gICAgfTsgLy8gUHJpdmF0ZVxuXG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCwgY29uZmlnKTtcbiAgICAgIGNvbmZpZy50b2dnbGUgPSBCb29sZWFuKGNvbmZpZy50b2dnbGUpOyAvLyBDb2VyY2Ugc3RyaW5nIHZhbHVlc1xuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0RGltZW5zaW9uID0gZnVuY3Rpb24gX2dldERpbWVuc2lvbigpIHtcbiAgICAgIHZhciBoYXNXaWR0aCA9ICQodGhpcy5fZWxlbWVudCkuaGFzQ2xhc3MoRGltZW5zaW9uLldJRFRIKTtcbiAgICAgIHJldHVybiBoYXNXaWR0aCA/IERpbWVuc2lvbi5XSURUSCA6IERpbWVuc2lvbi5IRUlHSFQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZ2V0UGFyZW50ID0gZnVuY3Rpb24gX2dldFBhcmVudCgpIHtcbiAgICAgIHZhciBfdGhpczMgPSB0aGlzO1xuXG4gICAgICB2Y
21167XIgcGFyZW50ID0gbnVsbDtcblxuICAgICAgaWYgKFV0aWwuaXNFbGVtZW50KHRoaXMuX2NvbmZpZy5wYXJlbnQpKSB7XG4gICAgICAgIHBhcmVudCA9IHRoaXMuX2NvbmZpZy5wYXJlbnQ7IC8vIEl0J3MgYSBqUXVlcnkgb2JqZWN0XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcucGFyZW50LmpxdWVyeSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICBwYXJlbnQgPSB0aGlzLl9jb25maWcucGFyZW50WzBdO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJlbnQgPSAkKHRoaXMuX2NvbmZpZy5wYXJlbnQpWzBdO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2VsZWN0b3IgPSBcIltkYXRhLXRvZ2dsZT1cXFwiY29sbGFwc2VcXFwiXVtkYXRhLXBhcmVudD1cXFwiXCIgKyB0aGlzLl9jb25maWcucGFyZW50ICsgXCJcXFwiXVwiO1xuICAgICAgJChwYXJlbnQpLmZpbmQoc2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKGksIGVsZW1lbnQpIHtcbiAgICAgICAgX3RoaXMzLl9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoQ29sbGFwc2UuX2dldFRhcmdldEZyb21FbGVtZW50KGVsZW1lbnQpLCBbZWxlbWVudF0pO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcGFyZW50O1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2FkZEFyaWFBbmRDb2xsYXBzZWRDbGFzcyA9IGZ1bmN0aW9uIF9hZGRBcmlhQW5kQ29sbGFwc2VkQ2xhc3MoZWxlbWVudCwgdHJpZ2dlckFycmF5KSB7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICB2YXIgaXNPcGVuID0gJChlbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgICAgaWYgKHRyaWdnZXJBcnJheS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgJCh0cmlnZ2VyQXJyYXkpLnRvZ2dsZUNsYXNzKENsYXNzTmFtZS5DT0xMQVBTRUQsICFpc09wZW4pLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBpc09wZW4pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTsgLy8gU3RhdGljXG5cblxuICAgIENvbGxhcHNlLl9nZXRUYXJnZXRGcm9tRWxlbWVudCA9IGZ1bmN0aW9uIF9nZXRUYXJnZXRGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICB2Y
21167XIgc2VsZWN0b3IgPSBVdGlsLmdldFNlbGVjdG9yRnJvbUVsZW1lbnQoZWxlbWVudCk7XG4gICAgICByZXR1cm4gc2VsZWN0b3IgPyAkKHNlbGVjdG9yKVswXSA6IG51bGw7XG4gICAgfTtcblxuICAgIENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2UgPSBmdW5jdGlvbiBfalF1ZXJ5SW50ZXJmYWNlKGNvbmZpZykge1xuICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIHZhciBkYXRhID0gJHRoaXMuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSBfZXh0ZW5kcyh7fSwgRGVmYXVsdCwgJHRoaXMuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcpO1xuXG4gICAgICAgIGlmICghZGF0YSAmJiBfY29uZmlnLnRvZ2dsZSAmJiAvc2hvd3xoaWRlLy50ZXN0KGNvbmZpZykpIHtcbiAgICAgICAgICBfY29uZmlnLnRvZ2dsZSA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBDb2xsYXBzZSh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkdGhpcy5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoQ29sbGFwc2UsIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIENvbGxhcHNlO1xuICB9KCk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogRGF0YSBBcGkgaW1wbGVtZW50YXRpb25cbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJChkb2N1bWVudCkub24oRXZlbnQuQ0xJQ0tfREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAvLyBwcmV2ZW50RGVmYXVsdCBvbmx5IGZvciA8YT4gZWxlbWVudHMgKHdoaWNoIGNoYW5nZSB0aGUgVVJMKSBub3QgaW5zaWRlIHRoZSBjb2xsYXBzaWJsZSBlbGVtZW50XG4gICAgaWYgKGV2ZW50LmN1cnJlbnRUYXJnZXQudGFnTmFtZSA9PT0gJ0EnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdHJpZ2dlciA9ICQodGhpcyk7XG4gICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuICAgICQoc2VsZWN0b3IpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgdmFyICR0YXJnZXQgPSAkKHRoaXMpO1xuICAgICAgdmFyIGRhdGEgPSAkdGFyZ2V0LmRhdGEoREFUQV9LRVkpO1xuICAgICAgdmFyIGNvbmZpZyA9IGRhdGEgPyAndG9nZ2xlJyA6ICR0cmlnZ2VyLmRhdGEoKTtcblxuICAgICAgQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZS5jYWxsKCR0YXJnZXQsIGNvbmZpZyk7XG4gICAgfSk7XG4gIH0pO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIGpRdWVyeVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cbiAgJC5mbltOQU1FXSA9IENvbGxhcHNlLl9qUXVlcnlJbnRlcmZhY2U7XG4gICQuZm5bTkFNRV0uQ29uc3RydWN0b3IgPSBDb2xsYXBzZTtcblxuICAkLmZuW05BTUVdLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG4gICAgJC5mbltOQU1FXSA9IEpRVUVSWV9OT19DT05GTElDVDtcbiAgICByZXR1cm4gQ29sbGFwc2UuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICByZXR1cm4gQ29sbGFwc2U7XG59KCQpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9Y29sbGFwc2UuanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci
211675jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IHRvb2x0aXAuanNcbiAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICovXG52YXIgVG9vbHRpcCA9IGZ1bmN0aW9uICgkKSB7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQ29uc3RhbnRzXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cbiAgdmFyIE5BTUUgPSAndG9vbHRpcCc7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLnRvb2x0aXAnO1xuICB2YXIgRVZFTlRfS0VZID0gXCIuXCIgKyBEQVRBX0tFWTtcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBUUkFOU0lUSU9OX0RVUkFUSU9OID0gMTUwO1xuICB2YXIgQ0xBU1NfUFJFRklYID0gJ2JzLXRvb2x0aXAnO1xuICB2YXIgQlNDTFNfUFJFRklYX1JFR0VYID0gbmV3IFJlZ0V4cChcIihefFxcXFxzKVwiICsgQ0xBU1NfUFJFRklYICsgXCJcXFxcUytcIiwgJ2cnKTtcbiAgdmFyIERlZmF1bHRUeXBlID0ge1xuICAgIGFuaW1hdGlvbjogJ2Jvb2xlYW4nLFxuICAgIHRlbXBsYXRlOiAnc3RyaW5nJyxcbiAgICB0aXRsZTogJyhzdHJpbmd8ZWxlbWVudHxmdW5jdGlvbiknLFxuICAgIHRyaWdnZXI6ICdzdHJpbmcnLFxuICAgIGRlbGF5OiAnKG51bWJlcnxvYmplY3QpJyxcbiAgICBodG1sOiAnYm9vbGVhbicsXG4gICAgc2VsZWN0b3I6ICcoc3RyaW5nfGJvb2xlYW4pJyxcbiAgICBwbGFjZW1lbnQ6ICcoc3RyaW5nfGZ1bmN0aW9uKScsXG4gICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmcpJyxcbiAgICBjb250YWluZXI6ICcoc3RyaW5nfGVsZW1lbnR8Ym9vbGVhbiknLFxuICAgIGZhbGxiYWNrUGxhY2VtZW50OiAnKHN0cmluZ3xhcnJheSknLFxuICAgIGJvdW5kYXJ5OiAnKHN0cmluZ3xlbGVtZW50KSdcbiAgfTtcbiAgdmFyIEF0dGFjaG1lbnRNYXAgPSB7XG4gICAgQVVUTzogJ2F1dG8nLFxuICAgIFRPUDogJ3RvcCcsXG4gICAgUklHSFQ6ICdyaWdodCcsXG4gICAgQk9UVE9NOiAnYm90dG9tJyxcbiAgICBMRUZUOiAnbGVmdCdcbiAgfTtcbiAgdmFyIERlZmF1bHQgPSB7XG4gICAgYW5pbWF0aW9uOiB0cnVlLFxuICAgIHRlbXBsYXRlOiAnPGRpdiBjbGFzcz1cInRvb2x0aXBcIiByb2xlPVwidG9vbHRpcFwiPicgKyAnPGRpdiBjbGFzcz1cImFycm93XCI+PC9kaXY+JyArICc8ZGl2IGNsYXNzPVwidG9vbHRpcC1pbm5lclwiPjwvZGl2PjwvZGl2PicsXG4gICAgdHJpZ2dlcjogJ2hvdmVyIGZvY3VzJyxcbiAgICB0aXRsZTogJycsXG4gICAgZGVsYXk6IDAsXG4gICAgaHRtbDogZmFsc2UsXG4gICAgc2VsZWN0b3I6IGZhbHNlLFxuICAgIHBsYWNlbWVudDogJ3RvcCcsXG4gICAgb2Zmc2V0OiAwLFxuICAgIGNvbnRhaW5lcjogZmFsc2UsXG4gICAgZmFsbGJhY2tQbGFjZW1lbnQ6ICdmbGlwJyxcbiAgICBib3VuZGFyeTogJ3Njcm9sbFBhcmVudCdcbiAgfTtcbiAgdmFyIEhvdmVyU3RhdGUgPSB7XG4gICAgU0hPVzogJ3Nob3cnLFxuICAgIE9VVDogJ291dCdcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgIElOU0VSVEVEOiBcImluc2VydGVkXCIgKyBFVkVOVF9LRVksXG4gICAgQ0xJQ0s6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSxcbiAgICBGT0NVU0lOOiBcImZvY3VzaW5cIiArIEVWRU5UX0tFWSxcbiAgICBGT0NVU09VVDogXCJmb2N1c291dFwiICsgRVZFTlRfS0VZLFxuICAgIE1PVVNFRU5URVI6IFwibW91c2VlbnRlclwiICsgRVZFTlRfS0VZLFxuICAgIE1PVVNFTEVBVkU6IFwibW91c2VsZWF2ZVwiICsgRVZFTlRfS0VZXG4gIH07XG4gIHZhciBDbGFzc05hbWUgPSB7XG4gICAgRkFERTogJ2ZhZGUnLFxuICAgIFNIT1c6ICdzaG93J1xuICB9O1xuICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgVE9PTFRJUDogJy50b29sdGlwJyxcbiAgICBUT09MVElQX0lOTkVSOiAnLnRvb2x0aXAtaW5uZXInLFxuICAgIEFSUk9XOiAnLmFycm93J1xuICB9O1xuICB2YXIgVHJpZ2dlciA9IHtcbiAgICBIT1ZFUjogJ2hvdmVyJyxcbiAgICBGT0NVUzogJ2ZvY3VzJyxcbiAgICBDTElDSzogJ2NsaWNrJyxcbiAgICBNQU5VQUw6ICdtYW51YWwnXG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gIH07XG5cbiAgdmFyIFRvb2x0aXAgPVxuICAvKiNfX1BVUkVfXyovXG4gIGZ1bmN0aW9uICgpIHtcbiAgICBmdW5jdGlvbiBUb29sdGlwKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgLyoqXG4gICAgICAgKiBDaGVjayBmb3IgUG9wcGVyIGRlcGVuZGVuY3lcbiAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICovXG4gICAgICBpZiAodHlwZW9mIFBvcHBlciA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwIHRvb2x0aXBzIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICB9IC8vIHByaXZhdGVcblxuXG4gICAgICB0aGlzLl9pc0VuYWJsZWQgPSB0cnVlO1xuICAgICAgdGhpcy5fdGltZW91dCA9IDA7XG4gICAgICB0aGlzLl9ob3ZlclN0YXRlID0gJyc7XG4gICAgICB0aGlzLl9hY3RpdmVUcmlnZ2VyID0ge307XG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsOyAvLyBQcm90ZWN0ZWRcblxuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMuY29uZmlnID0gdGh
21167pcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLnRpcCA9IG51bGw7XG5cbiAgICAgIHRoaXMuX3NldExpc3RlbmVycygpO1xuICAgIH0gLy8gR2V0dGVyc1xuXG5cbiAgICB2YXIgX3Byb3RvID0gVG9vbHRpcC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8uZW5hYmxlID0gZnVuY3Rpb24gZW5hYmxlKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmRpc2FibGUgPSBmdW5jdGlvbiBkaXNhYmxlKCkge1xuICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGVFbmFibGVkID0gZnVuY3Rpb24gdG9nZ2xlRW5hYmxlZCgpIHtcbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9ICF0aGlzLl9pc0VuYWJsZWQ7XG4gICAgfTtcblxuICAgIF9wcm90by50b2dnbGUgPSBmdW5jdGlvbiB0b2dnbGUoZXZlbnQpIHtcbiAgICAgIGlmICghdGhpcy5faXNFbmFibGVkKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGV4dCA9IG5ldyB0aGlzLmNvbnN0cnVjdG9yKGV2ZW50LmN1cnJlbnRUYXJnZXQsIHRoaXMuX2dldERlbGVnYXRlQ29uZmlnKCkpO1xuICAgICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXIuY2xpY2sgPSAhY29udGV4dC5fYWN0aXZlVHJpZ2dlci5jbGljaztcblxuICAgICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgICAgY29udGV4dC5fZW50ZXIobnVsbCwgY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5fbGVhdmUobnVsbCwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgkKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVykpIHtcbiAgICAgICAgICB0aGlzLl9sZWF2ZShudWxsLCB0aGlzKTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2VudGVyKG51bGwsIHRoaXMpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCk7XG4gICAgICAkLnJlbW92ZURhdGEodGhpcy5lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZKTtcbiAgICAgICQodGhpcy5lbGVtZW50KS5vZmYodGhpcy5jb25zdHJ1Y3Rvci5FVkVOVF9LRVkpO1xuICAgICAgJCh0aGlzLmVsZW1lbnQpLmNsb3Nlc3QoJy5tb2RhbCcpLm9mZignaGlkZS5icy5tb2RhbCcpO1xuXG4gICAgICBpZiAodGhpcy50aXApIHtcbiAgICAgICAgJCh0aGlzLnRpcCkucmVtb3ZlKCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IG51bGw7XG4gICAgICB0aGlzLl90aW1lb3V0ID0gbnVsbDtcbiAgICAgIHRoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgdGhpcy5fYWN0aXZlVHJpZ2dlciA9IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLl9wb3BwZXIgIT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fcG9wcGVyID0gbnVsbDtcbiAgICAgIHRoaXMuZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICB0aGlzLnRpcCA9IG51bGw7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICgkKHRoaXMuZWxlbWVudCkuY3NzKCdkaXNwbGF5J
21167ykgPT09ICdub25lJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSB1c2Ugc2hvdyBvbiB2aXNpYmxlIGVsZW1lbnRzJyk7XG4gICAgICB9XG5cbiAgICAgIHZhciBzaG93RXZlbnQgPSAkLkV2ZW50KHRoaXMuY29uc3RydWN0b3IuRXZlbnQuU0hPVyk7XG5cbiAgICAgIGlmICh0aGlzLmlzV2l0aENvbnRlbnQoKSAmJiB0aGlzLl9pc0VuYWJsZWQpIHtcbiAgICAgICAgJCh0aGlzLmVsZW1lbnQpLnRyaWdnZXIoc2hvd0V2ZW50KTtcbiAgICAgICAgdmFyIGlzSW5UaGVEb20gPSAkLmNvbnRhaW5zKHRoaXMuZWxlbWVudC5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgdGhpcy5lbGVtZW50KTtcblxuICAgICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpIHx8ICFpc0luVGhlRG9tKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgICB2YXIgdGlwSWQgPSBVdGlsLmdldFVJRCh0aGlzLmNvbnN0cnVjdG9yLk5BTUUpO1xuICAgICAgICB0aXAuc2V0QXR0cmlidXRlKCdpZCcsIHRpcElkKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIHRpcElkKTtcbiAgICAgICAgdGhpcy5zZXRDb250ZW50KCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmFuaW1hdGlvbikge1xuICAgICAgICAgICQodGlwKS5hZGRDbGFzcyhDbGFzc05hbWUuRkFERSk7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgcGxhY2VtZW50ID0gdHlwZW9mIHRoaXMuY29uZmlnLnBsYWNlbWVudCA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMuY29uZmlnLnBsYWNlbWVudC5jYWxsKHRoaXMsIHRpcCwgdGhpcy5lbGVtZW50KSA6IHRoaXMuY29uZmlnLnBsYWNlbWVudDtcblxuICAgICAgICB2YXIgYXR0YWNobWVudCA9IHRoaXMuX2dldEF0dGFjaG1lbnQocGxhY2VtZW50KTtcblxuICAgICAgICB0aGlzLmFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KTtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9IHRoaXMuY29uZmlnLmNvbnRhaW5lciA9PT0gZmFsc2UgPyBkb2N1bWVudC5ib2R5IDogJCh0aGlzLmNvbmZpZy5jb250YWluZXIpO1xuICAgICAgICAkKHRpcCkuZGF0YSh0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcblxuICAgICAgICBpZiAoISQuY29udGFpbnModGhpcy5lbGVtZW50Lm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB0aGlzLnRpcCkpIHtcbiAgICAgICAgICAkKHRpcCkuYXBwZW5kVG8oY29udGFpbmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgICQodGhpcy5lbGVtZW50KS50cmlnZ2VyKHRoaXMuY29uc3RydWN0b3IuRXZlbnQuSU5TRVJURUQpO1xuICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKHRoaXMuZWxlbWVudCwgdGlwLCB7XG4gICAgICAgICAgcGxhY2VtZW50OiBhdHRhY2htZW50LFxuICAgICAgICAgIG1vZGlmaWVyczoge1xuICAgICAgICAgICAgb2Zmc2V0OiB7XG4gICAgICAgICAgICAgIG9mZnNldDogdGhpcy5jb25maWcub2Zmc2V0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmxpcDoge1xuICAgICAgICAgICAgICBiZWhhdmlvcjogdGhpcy5jb25maWcuZmFsbGJhY2tQbGFjZW1lbnRcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhcnJvdzoge1xuICAgICAgICAgICAgICBlbGVtZW50OiBTZWxlY3Rvci5BUlJPV1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHByZXZlbnRPdmVyZmxvdzoge1xuICAgICAgICAgICAgICBib3VuZGFyaWVzRWxlbWVudDogdGhpcy5jb25maWcuYm91bmRhcnlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uQ3JlYXRlOiBmdW5jdGlvbiBvbkNyZWF0ZShkYXRhKSB7XG4gICAgICAgICAgICBpZiAoZGF0YS5vcmlnaW5hbFBsYWNlbWVudCAhPT0gZGF0YS5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgICAgX3RoaXMuX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG9uVXBkYXRlOiBmdW5jdGlvbiBvblVwZGF0ZShkYXRhKSB7XG4gICAgICAgICAgICBfdGhpcy5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICQodGlwKS5hZGRDbGFzcyhDbGFzc05hbWUuU0hPVyk7IC8vIElmIHRoaXMgaXMgYSB0b3VjaC1lbmFibGVkIGRldmljZSB3ZSBhZGQgZXh0cmFcbiAgICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgICAgLy8gb25seSBuZWVkZWQgYmVjYXVzZSBvZiBicm9rZW4gZXZlbnQgZGVsZWdhdGlvbiBvbiBpT1NcbiAgICAgICAgLy8gaHR0cHM6Ly93d3cucXVpcmtzbW9kZS5vcmcvYmxvZy9hcmNoaXZlcy8yMDE0LzAyL21vdXNlX2V2ZW50X2J1Yi5odG1sXG5cbiAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICQoJ2JvZHknKS5jaGlsZHJlbigpLm9uKCdtb3VzZW92ZXInLCBudWxsLCAkLm5vb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgICAgaWYgKF90aGlzLmNvbmZpZy5hbmltYXRpb24pIHtcbiAgICAgICAgICAgIF90aGlzLl9maXhUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIHByZXZIb3ZlclN0YXRlID0gX3RoaXMuX2hvdmVyU3RhdGU7XG4gICAgICAgICAgX3RoaXMuX2hvdmVyU3RhdGUgPSBudWxsO1xuICAgICAgICAgICQoX3RoaXMuZWxlbWVudCkudHJpZ2dlcihfdGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5TSE9XTik7XG5cbiAgICAgICAgICBpZiAocHJldkhvdmVyU3RhdGUgPT09IEhvdmVyU3RhdGUuT1VUKSB7XG4gICAgICAgICAgICBfdGhpcy5fbGVhdmUobnVsbCwgX3RoaXMpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMudGlwKS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSkpIHtcbiAgICAgICAgICAkKHRoaXMudGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRvb2x0aXAuX1RSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLmhpZGUgPSBmdW5jdGlvbiBoaWRlKGNhbGxiYWNrKSB7XG4gICAgICB2Y
21167XIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIHRpcCA9IHRoaXMuZ2V0VGlwRWxlbWVudCgpO1xuICAgICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQodGhpcy5jb25zdHJ1Y3Rvci5FdmVudC5ISURFKTtcblxuICAgICAgdmFyIGNvbXBsZXRlID0gZnVuY3Rpb24gY29tcGxldGUoKSB7XG4gICAgICAgIGlmIChfdGhpczIuX2hvdmVyU3RhdGUgIT09IEhvdmVyU3RhdGUuU0hPVyAmJiB0aXAucGFyZW50Tm9kZSkge1xuICAgICAgICAgIHRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRpcCk7XG4gICAgICAgIH1cblxuICAgICAgICBfdGhpczIuX2NsZWFuVGlwQ2xhc3MoKTtcblxuICAgICAgICBfdGhpczIuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknKTtcblxuICAgICAgICAkKF90aGlzMi5lbGVtZW50KS50cmlnZ2VyKF90aGlzMi5jb25zdHJ1Y3Rvci5FdmVudC5ISURERU4pO1xuXG4gICAgICAgIGlmIChfdGhpczIuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICAgIF90aGlzMi5fcG9wcGVyLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgICQodGhpcy5lbGVtZW50KS50cmlnZ2VyKGhpZGVFdmVudCk7XG5cbiAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkKHRpcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpOyAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB3ZSBhZGRlZCBmb3IgaU9TIHN1cHBvcnRcblxuICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAkKCdib2R5JykuY2hpbGRyZW4oKS5vZmYoJ21vdXNlb3ZlcicsIG51bGwsICQubm9vcCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5DTElDS10gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5GT0NVU10gPSBmYWxzZTtcbiAgICAgIHRoaXMuX2FjdGl2ZVRyaWdnZXJbVHJpZ2dlci5IT1ZFUl0gPSBmYWxzZTtcblxuICAgICAgaWYgKFV0aWwuc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkgJiYgJCh0aGlzLnRpcCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkZBREUpKSB7XG4gICAgICAgICQodGlwKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29tcGxldGUoKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5faG92ZXJTdGF0ZSA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8udXBkYXRlID0gZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuc2NoZWR1bGVVcGRhdGUoKTtcbiAgICAgIH1cbiAgICB9OyAvLyBQcm90ZWN0ZWRcblxuXG4gICAgX3Byb3RvLmlzV2l0aENvbnRlbnQgPSBmdW5jdGlvbiBpc1dpdGhDb250ZW50KCkge1xuICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5nZXRUaXRsZSgpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmFkZEF0dGFjaG1lbnRDbGFzcyA9IGZ1bmN0aW9uIGFkZEF0dGFjaG1lbnRDbGFzcyhhdHRhY2htZW50KSB7XG4gICAgICAkKHRoaXMuZ2V0VGlwRWxlbWVudCgpKS5hZGRDbGFzcyhDTEFTU19QUkVGSVggKyBcIi1cIiArIGF0dGFjaG1lbnQpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uZ2V0VGlwRWxlbWVudCA9IGZ1bmN0aW9uIGdldFRpcEVsZW1lbnQoKSB7XG4gICAgICB0aGlzLnRpcCA9IHRoaXMudGlwIHx8ICQodGhpcy5jb25maWcudGVtcGxhdGUpWzBdO1xuICAgICAgcmV0dXJuIHRoaXMudGlwO1xuICAgIH07XG5cbiAgICBfcHJvdG8uc2V0Q29udGVudCA9IGZ1bmN0aW9uIHNldENvbnRlbnQoKSB7XG4gICAgICB2Y
21167XIgJHRpcCA9ICQodGhpcy5nZXRUaXBFbGVtZW50KCkpO1xuICAgICAgdGhpcy5zZXRFbGVtZW50Q29udGVudCgkdGlwLmZpbmQoU2VsZWN0b3IuVE9PTFRJUF9JTk5FUiksIHRoaXMuZ2V0VGl0bGUoKSk7XG4gICAgICAkdGlwLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5GQURFICsgXCIgXCIgKyBDbGFzc05hbWUuU0hPVyk7XG4gICAgfTtcblxuICAgIF9wcm90by5zZXRFbGVtZW50Q29udGVudCA9IGZ1bmN0aW9uIHNldEVsZW1lbnRDb250ZW50KCRlbGVtZW50LCBjb250ZW50KSB7XG4gICAgICB2YXIgaHRtbCA9IHRoaXMuY29uZmlnLmh0bWw7XG5cbiAgICAgIGlmICh0eXBlb2YgY29udGVudCA9PT0gJ29iamVjdCcgJiYgKGNvbnRlbnQubm9kZVR5cGUgfHwgY29udGVudC5qcXVlcnkpKSB7XG4gICAgICAgIC8vIENvbnRlbnQgaXMgYSBET00gbm9kZSBvciBhIGpRdWVyeVxuICAgICAgICBpZiAoaHRtbCkge1xuICAgICAgICAgIGlmICghJChjb250ZW50KS5wYXJlbnQoKS5pcygkZWxlbWVudCkpIHtcbiAgICAgICAgICAgICRlbGVtZW50LmVtcHR5KCkuYXBwZW5kKGNvbnRlbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAkZWxlbWVudC50ZXh0KCQoY29udGVudCkudGV4dCgpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJGVsZW1lbnRbaHRtbCA/ICdodG1sJyA6ICd0ZXh0J10oY29udGVudCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5nZXRUaXRsZSA9IGZ1bmN0aW9uIGdldFRpdGxlKCkge1xuICAgICAgdmFyIHRpdGxlID0gdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAoIXRpdGxlKSB7XG4gICAgICAgIHRpdGxlID0gdHlwZW9mIHRoaXMuY29uZmlnLnRpdGxlID09PSAnZnVuY3Rpb24nID8gdGhpcy5jb25maWcudGl0bGUuY2FsbCh0aGlzLmVsZW1lbnQpIDogdGhpcy5jb25maWcudGl0bGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aXRsZTtcbiAgICB9OyAvLyBQcml2YXRlXG5cblxuICAgIF9wcm90by5fZ2V0QXR0YWNobWVudCA9IGZ1bmN0aW9uIF9nZXRBdHRhY2htZW50KHBsYWNlbWVudCkge1xuICAgICAgcmV0dXJuIEF0dGFjaG1lbnRNYXBbcGxhY2VtZW50LnRvVXBwZXJDYXNlKCldO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3NldExpc3RlbmVycyA9IGZ1bmN0aW9uIF9zZXRMaXN0ZW5lcnMoKSB7XG4gICAgICB2Y
21167XIgX3RoaXMzID0gdGhpcztcblxuICAgICAgdmFyIHRyaWdnZXJzID0gdGhpcy5jb25maWcudHJpZ2dlci5zcGxpdCgnICcpO1xuICAgICAgdHJpZ2dlcnMuZm9yRWFjaChmdW5jdGlvbiAodHJpZ2dlcikge1xuICAgICAgICBpZiAodHJpZ2dlciA9PT0gJ2NsaWNrJykge1xuICAgICAgICAgICQoX3RoaXMzLmVsZW1lbnQpLm9uKF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5DTElDSywgX3RoaXMzLmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLnRvZ2dsZShldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlciAhPT0gVHJpZ2dlci5NQU5VQUwpIHtcbiAgICAgICAgICB2YXIgZXZlbnRJbiA9IHRyaWdnZXIgPT09IFRyaWdnZXIuSE9WRVIgPyBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VFTlRFUiA6IF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU0lOO1xuICAgICAgICAgIHZhciBldmVudE91dCA9IHRyaWdnZXIgPT09IFRyaWdnZXIuSE9WRVIgPyBfdGhpczMuY29uc3RydWN0b3IuRXZlbnQuTU9VU0VMRUFWRSA6IF90aGlzMy5jb25zdHJ1Y3Rvci5FdmVudC5GT0NVU09VVDtcbiAgICAgICAgICAkKF90aGlzMy5lbGVtZW50KS5vbihldmVudEluLCBfdGhpczMuY29uZmlnLnNlbGVjdG9yLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBfdGhpczMuX2VudGVyKGV2ZW50KTtcbiAgICAgICAgICB9KS5vbihldmVudE91dCwgX3RoaXMzLmNvbmZpZy5zZWxlY3RvciwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICByZXR1cm4gX3RoaXMzLl9sZWF2ZShldmVudCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAkKF90aGlzMy5lbGVtZW50KS5jbG9zZXN0KCcubW9kYWwnKS5vbignaGlkZS5icy5tb2RhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMzLmhpZGUoKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLnNlbGVjdG9yKSB7XG4gICAgICAgIHRoaXMuY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uZmlnLCB7XG4gICAgICAgICAgdHJpZ2dlcjogJ21hbnVhbCcsXG4gICAgICAgICAgc2VsZWN0b3I6ICcnXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fZml4VGl0bGUoKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUaXRsZSA9IGZ1bmN0aW9uIF9maXhUaXRsZSgpIHtcbiAgICAgIHZhciB0aXRsZVR5cGUgPSB0eXBlb2YgdGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1vcmlnaW5hbC10aXRsZScpO1xuXG4gICAgICBpZiAodGhpcy5lbGVtZW50LmdldEF0dHJpYnV0ZSgndGl0bGUnKSB8fCB0aXRsZVR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtb3JpZ2luYWwtdGl0bGUnLCB0aGlzLmVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0aXRsZScpIHx8ICcnKTtcbiAgICAgICAgdGhpcy5lbGVtZW50LnNldEF0dHJpYnV0ZSgndGl0bGUnLCAnJyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW50ZXIgPSBmdW5jdGlvbiBfZW50ZXIoZXZlbnQsIGNvbnRleHQpIHtcbiAgICAgIHZhciBkYXRhS2V5ID0gdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWTtcbiAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8ICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5KTtcblxuICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgIGNvbnRleHQgPSBuZXcgdGhpcy5jb25zdHJ1Y3RvcihldmVudC5jdXJyZW50VGFyZ2V0LCB0aGlzLl9nZXREZWxlZ2F0ZUNvbmZpZygpKTtcbiAgICAgICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS5kYXRhKGRhdGFLZXksIGNvbnRleHQpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgY29udGV4dC5fYWN0aXZlVHJpZ2dlcltldmVudC50eXBlID09PSAnZm9jdXNpbicgPyBUcmlnZ2VyLkZPQ1VTIDogVHJpZ2dlci5IT1ZFUl0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoJChjb250ZXh0LmdldFRpcEVsZW1lbnQoKSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpIHx8IGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhvdmVyU3RhdGUuU0hPVykge1xuICAgICAgICBjb250ZXh0Ll9ob3ZlclN0YXRlID0gSG92ZXJTdGF0ZS5TSE9XO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNsZWFyVGltZW91dChjb250ZXh0Ll90aW1lb3V0KTtcbiAgICAgIGNvbnRleHQuX2hvdmVyU3RhdGUgPSBIb3ZlclN0YXRlLlNIT1c7XG5cbiAgICAgIGlmICghY29udGV4dC5jb25maWcuZGVsYXkgfHwgIWNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpIHtcbiAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29udGV4dC5fdGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAoY29udGV4dC5faG92ZXJTdGF0ZSA9PT0gSG92ZXJTdGF0ZS5TSE9XKSB7XG4gICAgICAgICAgY29udGV4dC5zaG93KCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LnNob3cpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2xlYXZlID0gZnVuY3Rpb24gX2xlYXZlKGV2ZW50LCBjb250ZXh0KSB7XG4gICAgICB2Y
21167XIgZGF0YUtleSA9IHRoaXMuY29uc3RydWN0b3IuREFUQV9LRVk7XG4gICAgICBjb250ZXh0ID0gY29udGV4dCB8fCAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLmRhdGEoZGF0YUtleSk7XG5cbiAgICAgIGlmICghY29udGV4dCkge1xuICAgICAgICBjb250ZXh0ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoZXZlbnQuY3VycmVudFRhcmdldCwgdGhpcy5fZ2V0RGVsZWdhdGVDb25maWcoKSk7XG4gICAgICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuZGF0YShkYXRhS2V5LCBjb250ZXh0KTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgIGNvbnRleHQuX2FjdGl2ZVRyaWdnZXJbZXZlbnQudHlwZSA9PT0gJ2ZvY3Vzb3V0JyA/IFRyaWdnZXIuRk9DVVMgOiBUcmlnZ2VyLkhPVkVSXSA9IGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBpZiAoY29udGV4dC5faXNXaXRoQWN0aXZlVHJpZ2dlcigpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2xlYXJUaW1lb3V0KGNvbnRleHQuX3RpbWVvdXQpO1xuICAgICAgY29udGV4dC5faG92ZXJTdGF0ZSA9IEhvdmVyU3RhdGUuT1VUO1xuXG4gICAgICBpZiAoIWNvbnRleHQuY29uZmlnLmRlbGF5IHx8ICFjb250ZXh0LmNvbmZpZy5kZWxheS5oaWRlKSB7XG4gICAgICAgIGNvbnRleHQuaGlkZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuX3RpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKGNvbnRleHQuX2hvdmVyU3RhdGUgPT09IEhvdmVyU3RhdGUuT1VUKSB7XG4gICAgICAgICAgY29udGV4dC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGNvbnRleHQuY29uZmlnLmRlbGF5LmhpZGUpO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2lzV2l0aEFjdGl2ZVRyaWdnZXIgPSBmdW5jdGlvbiBfaXNXaXRoQWN0aXZlVHJpZ2dlcigpIHtcbiAgICAgIGZvciAodmFyIHRyaWdnZXIgaW4gdGhpcy5fYWN0aXZlVHJpZ2dlcikge1xuICAgICAgICBpZiAodGhpcy5fYWN0aXZlVHJpZ2dlclt0cmlnZ2VyXSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdCwgJCh0aGlzLmVsZW1lbnQpLmRhdGEoKSwgY29uZmlnKTtcblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuZGVsYXkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGNvbmZpZy5kZWxheSA9IHtcbiAgICAgICAgICBzaG93OiBjb25maWcuZGVsYXksXG4gICAgICAgICAgaGlkZTogY29uZmlnLmRlbGF5XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgY29uZmlnLnRpdGxlID09PSAnbnVtYmVyJykge1xuICAgICAgICBjb25maWcudGl0bGUgPSBjb25maWcudGl0bGUudG9TdHJpbmcoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHR5cGVvZiBjb25maWcuY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgY29uZmlnLmNvbnRlbnQgPSBjb25maWcuY29udGVudC50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpO1xuICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXREZWxlZ2F0ZUNvbmZpZyA9IGZ1bmN0aW9uIF9nZXREZWxlZ2F0ZUNvbmZpZygpIHtcbiAgICAgIHZhciBjb25maWcgPSB7fTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiB0aGlzLmNvbmZpZykge1xuICAgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLkRlZmF1bHRba2V5XSAhPT0gdGhpcy5jb25maWdba2V5XSkge1xuICAgICAgICAgICAgY29uZmlnW2tleV0gPSB0aGlzLmNvbmZpZ1trZXldO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2NsZWFuVGlwQ2xhc3MgPSBmdW5jdGlvbiBfY2xlYW5UaXBDbGFzcygpIHtcbiAgICAgIHZhciAkdGlwID0gJCh0aGlzLmdldFRpcEVsZW1lbnQoKSk7XG4gICAgICB2Y
21167XIgdGFiQ2xhc3MgPSAkdGlwLmF0dHIoJ2NsYXNzJykubWF0Y2goQlNDTFNfUFJFRklYX1JFR0VYKTtcblxuICAgICAgaWYgKHRhYkNsYXNzICE9PSBudWxsICYmIHRhYkNsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgJHRpcC5yZW1vdmVDbGFzcyh0YWJDbGFzcy5qb2luKCcnKSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5faGFuZGxlUG9wcGVyUGxhY2VtZW50Q2hhbmdlID0gZnVuY3Rpb24gX2hhbmRsZVBvcHBlclBsYWNlbWVudENoYW5nZShkYXRhKSB7XG4gICAgICB0aGlzLl9jbGVhblRpcENsYXNzKCk7XG5cbiAgICAgIHRoaXMuYWRkQXR0YWNobWVudENsYXNzKHRoaXMuX2dldEF0dGFjaG1lbnQoZGF0YS5wbGFjZW1lbnQpKTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9maXhUcmFuc2l0aW9uID0gZnVuY3Rpb24gX2ZpeFRyYW5zaXRpb24oKSB7XG4gICAgICB2YXIgdGlwID0gdGhpcy5nZXRUaXBFbGVtZW50KCk7XG4gICAgICB2YXIgaW5pdENvbmZpZ0FuaW1hdGlvbiA9IHRoaXMuY29uZmlnLmFuaW1hdGlvbjtcblxuICAgICAgaWYgKHRpcC5nZXRBdHRyaWJ1dGUoJ3gtcGxhY2VtZW50JykgIT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkKHRpcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLkZBREUpO1xuICAgICAgdGhpcy5jb25maWcuYW5pbWF0aW9uID0gZmFsc2U7XG4gICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgdGhpcy5jb25maWcuYW5pbWF0aW9uID0gaW5pdENvbmZpZ0FuaW1hdGlvbjtcbiAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgVG9vbHRpcC5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
21167XIgZGF0YSA9ICQodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWc7XG5cbiAgICAgICAgaWYgKCFkYXRhICYmIC9kaXNwb3NlfGhpZGUvLnRlc3QoY29uZmlnKSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgVG9vbHRpcCh0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhUb29sdGlwLCBudWxsLCBbe1xuICAgICAga2V5OiBcIlZFUlNJT05cIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJOQU1FXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIE5BTUU7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRBVEFfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERBVEFfS0VZO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJFdmVudFwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBFdmVudDtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRVZFTlRfS0VZXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIEVWRU5UX0tFWTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiRGVmYXVsdFR5cGVcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdFR5cGU7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIFRvb2x0aXA7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgJC5mbltOQU1FXSA9IFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IFRvb2x0aXA7XG5cbiAgJC5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgcmV0dXJuIFRvb2x0aXAuX2pRdWVyeUludGVyZmFjZTtcbiAgfTtcblxuICByZXR1cm4gVG9vbHRpcDtcbn0oJCwgUG9wcGVyKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXRvb2x0aXAuanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci
211675jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IGRyb3Bkb3duLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xudmFyIERyb3Bkb3duID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdkcm9wZG93bic7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLmRyb3Bkb3duJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBFU0NBUEVfS0VZQ09ERSA9IDI3OyAvLyBLZXlib2FyZEV2ZW50LndoaWNoIHZhbHVlIGZvciBFc2NhcGUgKEVzYykga2V5XG5cbiAgdmFyIFNQQUNFX0tFWUNPREUgPSAzMjsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3Igc3BhY2Uga2V5XG5cbiAgdmFyIFRBQl9LRVlDT0RFID0gOTsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgdGFiIGtleVxuXG4gIHZhciBBUlJPV19VUF9LRVlDT0RFID0gMzg7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIHVwIGFycm93IGtleVxuXG4gIHZhciBBUlJPV19ET1dOX0tFWUNPREUgPSA0MDsgLy8gS2V5Ym9hcmRFdmVudC53aGljaCB2YWx1ZSBmb3IgZG93biBhcnJvdyBrZXlcblxuICB2YXIgUklHSFRfTU9VU0VfQlVUVE9OX1dISUNIID0gMzsgLy8gTW91c2VFdmVudC53aGljaCB2YWx1ZSBmb3IgdGhlIHJpZ2h0IGJ1dHRvbiAoYXNzdW1pbmcgYSByaWdodC1oYW5kZWQgbW91c2UpXG5cbiAgdmFyIFJFR0VYUF9LRVlET1dOID0gbmV3IFJlZ0V4cChBUlJPV19VUF9LRVlDT0RFICsgXCJ8XCIgKyBBUlJPV19ET1dOX0tFWUNPREUgKyBcInxcIiArIEVTQ0FQRV9LRVlDT0RFKTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgIENMSUNLOiBcImNsaWNrXCIgKyBFVkVOVF9LRVksXG4gICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICBLRVlET1dOX0RBVEFfQVBJOiBcImtleWRvd25cIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWSxcbiAgICBLRVlVUF9EQVRBX0FQSTogXCJrZXl1cFwiICsgRVZFTlRfS0VZICsgREFUQV9BUElfS0VZXG4gIH07XG4gIHZhciBDbGFzc05hbWUgPSB7XG4gICAgRElTQUJMRUQ6ICdkaXNhYmxlZCcsXG4gICAgU0hPVzogJ3Nob3cnLFxuICAgIERST1BVUDogJ2Ryb3B1cCcsXG4gICAgRFJPUFJJR0hUOiAnZHJvcHJpZ2h0JyxcbiAgICBEUk9QTEVGVDogJ2Ryb3BsZWZ0JyxcbiAgICBNRU5VUklHSFQ6ICdkcm9wZG93bi1tZW51LXJpZ2h0JyxcbiAgICBNRU5VTEVGVDogJ2Ryb3Bkb3duLW1lbnUtbGVmdCcsXG4gICAgUE9TSVRJT05fU1RBVElDOiAncG9zaXRpb24tc3RhdGljJ1xuICB9O1xuICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJkcm9wZG93blwiXScsXG4gICAgRk9STV9DSElMRDogJy5kcm9wZG93biBmb3JtJyxcbiAgICBNRU5VOiAnLmRyb3Bkb3duLW1lbnUnLFxuICAgIE5BVkJBUl9OQVY6ICcubmF2YmFyLW5hdicsXG4gICAgVklTSUJMRV9JVEVNUzogJy5kcm9wZG93bi1tZW51IC5kcm9wZG93bi1pdGVtOm5vdCguZGlzYWJsZWQpJ1xuICB9O1xuICB2YXIgQXR0YWNobWVudE1hcCA9IHtcbiAgICBUT1A6ICd0b3Atc3RhcnQnLFxuICAgIFRPUEVORDogJ3RvcC1lbmQnLFxuICAgIEJPVFRPTTogJ2JvdHRvbS1zdGFydCcsXG4gICAgQk9UVE9NRU5EOiAnYm90dG9tLWVuZCcsXG4gICAgUklHSFQ6ICdyaWdodC1zdGFydCcsXG4gICAgUklHSFRFTkQ6ICdyaWdodC1lbmQnLFxuICAgIExFRlQ6ICdsZWZ0LXN0YXJ0JyxcbiAgICBMRUZURU5EOiAnbGVmdC1lbmQnXG4gIH07XG4gIHZhciBEZWZhdWx0ID0ge1xuICAgIG9mZnNldDogMCxcbiAgICBmbGlwOiB0cnVlLFxuICAgIGJvdW5kYXJ5OiAnc2Nyb2xsUGFyZW50J1xuICB9O1xuICB2YXIgRGVmYXVsdFR5cGUgPSB7XG4gICAgb2Zmc2V0OiAnKG51bWJlcnxzdHJpbmd8ZnVuY3Rpb24pJyxcbiAgICBmbGlwOiAnYm9vbGVhbicsXG4gICAgYm91bmRhcnk6ICcoc3RyaW5nfGVsZW1lbnQpJ1xuICAgIC8qKlxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqIENsYXNzIERlZmluaXRpb25cbiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAgKi9cblxuICB9O1xuXG4gIHZhciBEcm9wZG93biA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERyb3Bkb3duKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgdGhpcy5fZWxlbWVudCA9IGVsZW1lbnQ7XG4gICAgICB0aGlzLl9wb3BwZXIgPSBudWxsO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGh
21167pcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9tZW51ID0gdGhpcy5fZ2V0TWVudUVsZW1lbnQoKTtcbiAgICAgIHRoaXMuX2luTmF2YmFyID0gdGhpcy5fZGV0ZWN0TmF2YmFyKCk7XG5cbiAgICAgIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJzKCk7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgIHZhciBfcHJvdG8gPSBEcm9wZG93bi5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKCkge1xuICAgICAgaWYgKHRoaXMuX2VsZW1lbnQuZGlzYWJsZWQgfHwgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRElTQUJMRUQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIHBhcmVudCA9IERyb3Bkb3duLl9nZXRQYXJlbnRGcm9tRWxlbWVudCh0aGlzLl9lbGVtZW50KTtcblxuICAgICAgdmFyIGlzQWN0aXZlID0gJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgIERyb3Bkb3duLl9jbGVhck1lbnVzKCk7XG5cbiAgICAgIGlmIChpc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciByZWxhdGVkVGFyZ2V0ID0ge1xuICAgICAgICByZWxhdGVkVGFyZ2V0OiB0aGlzLl9lbGVtZW50XG4gICAgICB9O1xuICAgICAgdmFyIHNob3dFdmVudCA9ICQuRXZlbnQoRXZlbnQuU0hPVywgcmVsYXRlZFRhcmdldCk7XG4gICAgICAkKHBhcmVudCkudHJpZ2dlcihzaG93RXZlbnQpO1xuXG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gRGlzYWJsZSB0b3RhbGx5IFBvcHBlci5qcyBmb3IgRHJvcGRvd24gaW4gTmF2YmFyXG5cblxuICAgICAgaWYgKCF0aGlzLl9pbk5hdmJhcikge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ2hlY2sgZm9yIFBvcHBlciBkZXBlbmRlbmN5XG4gICAgICAgICAqIFBvcHBlciAtIGh0dHBzOi8vcG9wcGVyLmpzLm9yZ1xuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHR5cGVvZiBQb3BwZXIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQm9vdHN0cmFwIGRyb3Bkb3duIHJlcXVpcmUgUG9wcGVyLmpzIChodHRwczovL3BvcHBlci5qcy5vcmcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQ7IC8vIEZvciBkcm9wdXAgd2l0aCBhbGlnbm1lbnQgd2UgdXNlIHRoZSBwYXJlbnQgYXMgcG9wcGVyIGNvbnRhaW5lclxuXG4gICAgICAgIGlmICgkKHBhcmVudCkuaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BVUCkpIHtcbiAgICAgICAgICBpZiAoJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDbGFzc05hbWUuTUVOVUxFRlQpIHx8ICQodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLk1FTlVSSUdIVCkpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBwYXJlbnQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IC8vIElmIGJvdW5kYXJ5IGlzIG5vdCBgc2Nyb2xsUGFyZW50YCwgdGhlbiBzZXQgcG9zaXRpb24gdG8gYHN0YXRpY2BcbiAgICAgICAgLy8gdG8gYWxsb3cgdGhlIG1lbnUgdG8gXCJlc2NhcGVcIiB0aGUgc2Nyb2xsIHBhcmVudCdzIGJvdW5kYXJpZXNcbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8yNDI1MVxuXG5cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5ib3VuZGFyeSAhPT0gJ3Njcm9sbFBhcmVudCcpIHtcbiAgICAgICAgICAkKHBhcmVudCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLlBPU0lUSU9OX1NUQVRJQyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9wb3BwZXIgPSBuZXcgUG9wcGVyKGVsZW1lbnQsIHRoaXMuX21lbnUsIHRoaXMuX2dldFBvcHBlckNvbmZpZygpKTtcbiAgICAgIH0gLy8gSWYgdGhpcyBpcyBhIHRvdWNoLWVuYWJsZWQgZGV2aWNlIHdlIGFkZCBleHRyYVxuICAgICAgLy8gZW1wdHkgbW91c2VvdmVyIGxpc3RlbmVycyB0byB0aGUgYm9keSdzIGltbWVkaWF0ZSBjaGlsZHJlbjtcbiAgICAgIC8vIG9ubHkgbmVlZGVkIGJlY2F1c2Ugb2YgYnJva2VuIGV2ZW50IGRlbGVnYXRpb24gb24gaU9TXG4gICAgICAvLyBodHRwczovL3d3dy5xdWlya3Ntb2RlLm9yZy9ibG9nL2FyY2hpdmVzLzIwMTQvMDIvbW91c2VfZXZlbnRfYnViLmh0bWxcblxuXG4gICAgICBpZiAoJ29udG91Y2hzdGFydCcgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50ICYmICQocGFyZW50KS5jbG9zZXN0KFNlbGVjdG9yLk5BVkJBUl9OQVYpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAkKCdib2R5JykuY2hpbGRyZW4oKS5vbignbW91c2VvdmVyJywgbnVsbCwgJC5ub29wKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fZWxlbWVudC5mb2N1cygpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAkKHRoaXMuX21lbnUpLnRvZ2dsZUNsYXNzKENsYXNzTmFtZS5TSE9XKTtcbiAgICAgICQocGFyZW50KS50b2dnbGVDbGFzcyhDbGFzc05hbWUuU0hPVykudHJpZ2dlcigkLkV2ZW50KEV2ZW50LlNIT1dOLCByZWxhdGVkVGFyZ2V0KSk7XG4gICAgfTtcblxuICAgIF9wcm90by5kaXNwb3NlID0gZnVuY3Rpb24gZGlzcG9zZSgpIHtcbiAgICAgICQucmVtb3ZlRGF0YSh0aGlzLl9lbGVtZW50LCBEQVRBX0tFWSk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9mZihFVkVOVF9LRVkpO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9tZW51ID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMuX3BvcHBlciAhPT0gbnVsbCkge1xuICAgICAgICB0aGlzLl9wb3BwZXIuZGVzdHJveSgpO1xuXG4gICAgICAgIHRoaXMuX3BvcHBlciA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by51cGRhdGUgPSBmdW5jdGlvbiB1cGRhdGUoKSB7XG4gICAgICB0aGlzLl9pbk5hdmJhciA9IHRoaXMuX2RldGVjdE5hdmJhcigpO1xuXG4gICAgICBpZiAodGhpcy5fcG9wcGVyICE9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX3BvcHBlci5zY2hlZHVsZVVwZGF0ZSgpO1xuICAgICAgfVxuICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgX3Byb3RvLl9hZGRFdmVudExpc3RlbmVycyA9IGZ1bmN0aW9uIF9hZGRFdmVudExpc3RlbmVycygpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICQodGhpcy5fZWxlbWVudCkub24oRXZlbnQuQ0xJQ0ssIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICBfdGhpcy50b2dnbGUoKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldENvbmZpZyA9IGZ1bmN0aW9uIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSBfZXh0ZW5kcyh7fSwgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LCAkKHRoaXMuX2VsZW1lbnQpLmRhdGEoKSwgY29uZmlnKTtcbiAgICAgIFV0aWwudHlwZUNoZWNrQ29uZmlnKE5BTUUsIGNvbmZpZywgdGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0VHlwZSk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldE1lbnVFbGVtZW50ID0gZnVuY3Rpb24gX2dldE1lbnVFbGVtZW50KCkge1xuICAgICAgaWYgKCF0aGlzLl9tZW51KSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcy5fZWxlbWVudCk7XG5cbiAgICAgICAgdGhpcy5fbWVudSA9ICQocGFyZW50KS5maW5kKFNlbGVjdG9yLk1FTlUpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5fbWVudTtcbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRQbGFjZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGxhY2VtZW50KCkge1xuICAgICAgdmFyICRwYXJlbnREcm9wZG93biA9ICQodGhpcy5fZWxlbWVudCkucGFyZW50KCk7XG4gICAgICB2Y
21167XIgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5CT1RUT007IC8vIEhhbmRsZSBkcm9wdXBcblxuICAgICAgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDbGFzc05hbWUuRFJPUFVQKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlRPUDtcblxuICAgICAgICBpZiAoJCh0aGlzLl9tZW51KS5oYXNDbGFzcyhDbGFzc05hbWUuTUVOVVJJR0hUKSkge1xuICAgICAgICAgIHBsYWNlbWVudCA9IEF0dGFjaG1lbnRNYXAuVE9QRU5EO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKCRwYXJlbnREcm9wZG93bi5oYXNDbGFzcyhDbGFzc05hbWUuRFJPUFJJR0hUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLlJJR0hUO1xuICAgICAgfSBlbHNlIGlmICgkcGFyZW50RHJvcGRvd24uaGFzQ2xhc3MoQ2xhc3NOYW1lLkRST1BMRUZUKSkge1xuICAgICAgICBwbGFjZW1lbnQgPSBBdHRhY2htZW50TWFwLkxFRlQ7XG4gICAgICB9IGVsc2UgaWYgKCQodGhpcy5fbWVudSkuaGFzQ2xhc3MoQ2xhc3NOYW1lLk1FTlVSSUdIVCkpIHtcbiAgICAgICAgcGxhY2VtZW50ID0gQXR0YWNobWVudE1hcC5CT1RUT01FTkQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBwbGFjZW1lbnQ7XG4gICAgfTtcblxuICAgIF9wcm90by5fZGV0ZWN0TmF2YmFyID0gZnVuY3Rpb24gX2RldGVjdE5hdmJhcigpIHtcbiAgICAgIHJldHVybiAkKHRoaXMuX2VsZW1lbnQpLmNsb3Nlc3QoJy5uYXZiYXInKS5sZW5ndGggPiAwO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2dldFBvcHBlckNvbmZpZyA9IGZ1bmN0aW9uIF9nZXRQb3BwZXJDb25maWcoKSB7XG4gICAgICB2Y
21167XIgX3RoaXMyID0gdGhpcztcblxuICAgICAgdmFyIG9mZnNldENvbmYgPSB7fTtcblxuICAgICAgaWYgKHR5cGVvZiB0aGlzLl9jb25maWcub2Zmc2V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIG9mZnNldENvbmYuZm4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgIGRhdGEub2Zmc2V0cyA9IF9leHRlbmRzKHt9LCBkYXRhLm9mZnNldHMsIF90aGlzMi5fY29uZmlnLm9mZnNldChkYXRhLm9mZnNldHMpIHx8IHt9KTtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9mZnNldENvbmYub2Zmc2V0ID0gdGhpcy5fY29uZmlnLm9mZnNldDtcbiAgICAgIH1cblxuICAgICAgdmFyIHBvcHBlckNvbmZpZyA9IHtcbiAgICAgICAgcGxhY2VtZW50OiB0aGlzLl9nZXRQbGFjZW1lbnQoKSxcbiAgICAgICAgbW9kaWZpZXJzOiB7XG4gICAgICAgICAgb2Zmc2V0OiBvZmZzZXRDb25mLFxuICAgICAgICAgIGZsaXA6IHtcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRoaXMuX2NvbmZpZy5mbGlwXG4gICAgICAgICAgfSxcbiAgICAgICAgICBwcmV2ZW50T3ZlcmZsb3c6IHtcbiAgICAgICAgICAgIGJvdW5kYXJpZXNFbGVtZW50OiB0aGlzLl9jb25maWcuYm91bmRhcnlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gcG9wcGVyQ29uZmlnO1xuICAgIH07IC8vIFN0YXRpY1xuXG5cbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlID0gZnVuY3Rpb24gX2pRdWVyeUludGVyZmFjZShjb25maWcpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2Y
21167XIgZGF0YSA9ICQodGhpcykuZGF0YShEQVRBX0tFWSk7XG5cbiAgICAgICAgdmFyIF9jb25maWcgPSB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGw7XG5cbiAgICAgICAgaWYgKCFkYXRhKSB7XG4gICAgICAgICAgZGF0YSA9IG5ldyBEcm9wZG93bih0aGlzLCBfY29uZmlnKTtcbiAgICAgICAgICAkKHRoaXMpLmRhdGEoREFUQV9LRVksIGRhdGEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiTm8gbWV0aG9kIG5hbWVkIFxcXCJcIiArIGNvbmZpZyArIFwiXFxcIlwiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkYXRhW2NvbmZpZ10oKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIERyb3Bkb3duLl9jbGVhck1lbnVzID0gZnVuY3Rpb24gX2NsZWFyTWVudXMoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudCAmJiAoZXZlbnQud2hpY2ggPT09IFJJR0hUX01PVVNFX0JVVFRPTl9XSElDSCB8fCBldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LndoaWNoICE9PSBUQUJfS0VZQ09ERSkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2YXIgdG9nZ2xlcyA9ICQubWFrZUFycmF5KCQoU2VsZWN0b3IuREFUQV9UT0dHTEUpKTtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b2dnbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodG9nZ2xlc1tpXSk7XG5cbiAgICAgICAgdmFyIGNvbnRleHQgPSAkKHRvZ2dsZXNbaV0pLmRhdGEoREFUQV9LRVkpO1xuICAgICAgICB2Y
21167XIgcmVsYXRlZFRhcmdldCA9IHtcbiAgICAgICAgICByZWxhdGVkVGFyZ2V0OiB0b2dnbGVzW2ldXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFjb250ZXh0KSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZHJvcGRvd25NZW51ID0gY29udGV4dC5fbWVudTtcblxuICAgICAgICBpZiAoISQocGFyZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChldmVudCAmJiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJyAmJiAvaW5wdXR8dGV4dGFyZWEvaS50ZXN0KGV2ZW50LnRhcmdldC50YWdOYW1lKSB8fCBldmVudC50eXBlID09PSAna2V5dXAnICYmIGV2ZW50LndoaWNoID09PSBUQUJfS0VZQ09ERSkgJiYgJC5jb250YWlucyhwYXJlbnQsIGV2ZW50LnRhcmdldCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBoaWRlRXZlbnQgPSAkLkV2ZW50KEV2ZW50LkhJREUsIHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICAkKHBhcmVudCkudHJpZ2dlcihoaWRlRXZlbnQpO1xuXG4gICAgICAgIGlmIChoaWRlRXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSAvLyBJZiB0aGlzIGlzIGEgdG91Y2gtZW5hYmxlZCBkZXZpY2Ugd2UgcmVtb3ZlIHRoZSBleHRyYVxuICAgICAgICAvLyBlbXB0eSBtb3VzZW92ZXIgbGlzdGVuZXJzIHdlIGFkZGVkIGZvciBpT1Mgc3VwcG9ydFxuXG5cbiAgICAgICAgaWYgKCdvbnRvdWNoc3RhcnQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgICAgICQoJ2JvZHknKS5jaGlsZHJlbigpLm9mZignbW91c2VvdmVyJywgbnVsbCwgJC5ub29wKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRvZ2dsZXNbaV0uc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgICQoZHJvcGRvd25NZW51KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAgICQocGFyZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVykudHJpZ2dlcigkLkV2ZW50KEV2ZW50LkhJRERFTiwgcmVsYXRlZFRhcmdldCkpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQgPSBmdW5jdGlvbiBfZ2V0UGFyZW50RnJvbUVsZW1lbnQoZWxlbWVudCkge1xuICAgICAgdmFyIHBhcmVudDtcbiAgICAgIHZhciBzZWxlY3RvciA9IFV0aWwuZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KTtcblxuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHBhcmVudCA9ICQoc2VsZWN0b3IpWzBdO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcGFyZW50IHx8IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICB9OyAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuXG5cbiAgICBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyID0gZnVuY3Rpb24gX2RhdGFBcGlLZXlkb3duSGFuZGxlcihldmVudCkge1xuICAgICAgLy8gSWYgbm90IGlucHV0L3RleHRhcmVhOlxuICAgICAgLy8gIC0gQW5kIG5vdCBhIGtleSBpbiBSRUdFWFBfS0VZRE9XTiA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyBJZiBpbnB1dC90ZXh0YXJlYTpcbiAgICAgIC8vICAtIElmIHNwYWNlIGtleSA9PiBub3QgYSBkcm9wZG93biBjb21tYW5kXG4gICAgICAvLyAgLSBJZiBrZXkgaXMgb3RoZXIgdGhhbiBlc2NhcGVcbiAgICAgIC8vICAgIC0gSWYga2V5IGlzIG5vdCB1cCBvciBkb3duID0+IG5vdCBhIGRyb3Bkb3duIGNvbW1hbmRcbiAgICAgIC8vICAgIC0gSWYgdHJpZ2dlciBpbnNpZGUgdGhlIG1lbnUgPT4gbm90IGEgZHJvcGRvd24gY29tbWFuZFxuICAgICAgaWYgKC9pbnB1dHx0ZXh0YXJlYS9pLnRlc3QoZXZlbnQudGFyZ2V0LnRhZ05hbWUpID8gZXZlbnQud2hpY2ggPT09IFNQQUNFX0tFWUNPREUgfHwgZXZlbnQud2hpY2ggIT09IEVTQ0FQRV9LRVlDT0RFICYmIChldmVudC53aGljaCAhPT0gQVJST1dfRE9XTl9LRVlDT0RFICYmIGV2ZW50LndoaWNoICE9PSBBUlJPV19VUF9LRVlDT0RFIHx8ICQoZXZlbnQudGFyZ2V0KS5jbG9zZXN0KFNlbGVjdG9yLk1FTlUpLmxlbmd0aCkgOiAhUkVHRVhQX0tFWURPV04udGVzdChldmVudC53aGljaCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgIGlmICh0aGlzLmRpc2FibGVkIHx8ICQodGhpcykuaGFzQ2xhc3MoQ2xhc3NOYW1lLkRJU0FCTEVEKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHZhciBwYXJlbnQgPSBEcm9wZG93bi5fZ2V0UGFyZW50RnJvbUVsZW1lbnQodGhpcyk7XG5cbiAgICAgIHZhciBpc0FjdGl2ZSA9ICQocGFyZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG5cbiAgICAgIGlmICghaXNBY3RpdmUgJiYgKGV2ZW50LndoaWNoICE9PSBFU0NBUEVfS0VZQ09ERSB8fCBldmVudC53aGljaCAhPT0gU1BBQ0VfS0VZQ09ERSkgfHwgaXNBY3RpdmUgJiYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSB8fCBldmVudC53aGljaCA9PT0gU1BBQ0VfS0VZQ09ERSkpIHtcbiAgICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBFU0NBUEVfS0VZQ09ERSkge1xuICAgICAgICAgIHZhciB0b2dnbGUgPSAkKHBhcmVudCkuZmluZChTZWxlY3Rvci5EQVRBX1RPR0dMRSlbMF07XG4gICAgICAgICAgJCh0b2dnbGUpLnRyaWdnZXIoJ2ZvY3VzJyk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGl0ZW1zID0gJChwYXJlbnQpLmZpbmQoU2VsZWN0b3IuVklTSUJMRV9JVEVNUykuZ2V0KCk7XG5cbiAgICAgIGlmIChpdGVtcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2Y
21167XIgaW5kZXggPSBpdGVtcy5pbmRleE9mKGV2ZW50LnRhcmdldCk7XG5cbiAgICAgIGlmIChldmVudC53aGljaCA9PT0gQVJST1dfVVBfS0VZQ09ERSAmJiBpbmRleCA+IDApIHtcbiAgICAgICAgLy8gVXBcbiAgICAgICAgaW5kZXgtLTtcbiAgICAgIH1cblxuICAgICAgaWYgKGV2ZW50LndoaWNoID09PSBBUlJPV19ET1dOX0tFWUNPREUgJiYgaW5kZXggPCBpdGVtcy5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIERvd25cbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKGluZGV4IDwgMCkge1xuICAgICAgICBpbmRleCA9IDA7XG4gICAgICB9XG5cbiAgICAgIGl0ZW1zW2luZGV4XS5mb2N1cygpO1xuICAgIH07XG5cbiAgICBfY3JlYXRlQ2xhc3MoRHJvcGRvd24sIG51bGwsIFt7XG4gICAgICBrZXk6IFwiVkVSU0lPTlwiLFxuICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQoKSB7XG4gICAgICAgIHJldHVybiBWRVJTSU9OO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJEZWZhdWx0XCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRUeXBlXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgICAgfVxuICAgIH1dKTtcblxuICAgIHJldHVybiBEcm9wZG93bjtcbiAgfSgpO1xuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIERhdGEgQXBpIGltcGxlbWVudGF0aW9uXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gICQoZG9jdW1lbnQpLm9uKEV2ZW50LktFWURPV05fREFUQV9BUEksIFNlbGVjdG9yLkRBVEFfVE9HR0xFLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5LRVlET1dOX0RBVEFfQVBJLCBTZWxlY3Rvci5NRU5VLCBEcm9wZG93bi5fZGF0YUFwaUtleWRvd25IYW5kbGVyKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSArIFwiIFwiICsgRXZlbnQuS0VZVVBfREFUQV9BUEksIERyb3Bkb3duLl9jbGVhck1lbnVzKS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlLmNhbGwoJCh0aGlzKSwgJ3RvZ2dsZScpO1xuICB9KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuRk9STV9DSElMRCwgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICB9KTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBqUXVlcnlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gICQuZm5bTkFNRV0gPSBEcm9wZG93bi5falF1ZXJ5SW50ZXJmYWNlO1xuICAkLmZuW05BTUVdLkNvbnN0cnVjdG9yID0gRHJvcGRvd247XG5cbiAgJC5mbltOQU1FXS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gKCkge1xuICAgICQuZm5bTkFNRV0gPSBKUVVFUllfTk9fQ09ORkxJQ1Q7XG4gICAgcmV0dXJuIERyb3Bkb3duLl9qUXVlcnlJbnRlcmZhY2U7XG4gIH07XG5cbiAgcmV0dXJuIERyb3Bkb3duO1xufSgkLCBQb3BwZXIpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZHJvcGRvd24uanMubWFwIiwiZnVuY3Rpb24gX2V4dGVuZHMoKSB7IF9leHRlbmRzID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiAodGFyZ2V0KSB7IGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7IHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaV07IGZvciAodmFyIGtleSBpbiBzb3VyY2UpIHsgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsgfSB9IH0gcmV0dXJuIHRhcmdldDsgfTsgcmV0dXJuIF9leHRlbmRzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH1cblxuZnVuY3Rpb24gX2RlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykgeyBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7IHZhciBkZXNjcmlwdG9yID0gcHJvcHNbaV07IGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTsgZGVzY3JpcHRvci
211675jb25maWd1cmFibGUgPSB0cnVlOyBpZiAoXCJ2YWx1ZVwiIGluIGRlc2NyaXB0b3IpIGRlc2NyaXB0b3Iud3JpdGFibGUgPSB0cnVlOyBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7IH0gfVxuXG5mdW5jdGlvbiBfY3JlYXRlQ2xhc3MoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7IGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpOyBpZiAoc3RhdGljUHJvcHMpIF9kZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7IHJldHVybiBDb25zdHJ1Y3RvcjsgfVxuXG4vKipcbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBCb290c3RyYXAgKHY0LjAuMCk6IG1vZGFsLmpzXG4gKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqL1xudmFyIE1vZGFsID0gZnVuY3Rpb24gKCQpIHtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBDb25zdGFudHNcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuICB2YXIgTkFNRSA9ICdtb2RhbCc7XG4gIHZhciBWRVJTSU9OID0gJzQuMC4wJztcbiAgdmFyIERBVEFfS0VZID0gJ2JzLm1vZGFsJztcbiAgdmFyIEVWRU5UX0tFWSA9IFwiLlwiICsgREFUQV9LRVk7XG4gIHZhciBEQVRBX0FQSV9LRVkgPSAnLmRhdGEtYXBpJztcbiAgdmFyIEpRVUVSWV9OT19DT05GTElDVCA9ICQuZm5bTkFNRV07XG4gIHZhciBUUkFOU0lUSU9OX0RVUkFUSU9OID0gMzAwO1xuICB2YXIgQkFDS0RST1BfVFJBTlNJVElPTl9EVVJBVElPTiA9IDE1MDtcbiAgdmFyIEVTQ0FQRV9LRVlDT0RFID0gMjc7IC8vIEtleWJvYXJkRXZlbnQud2hpY2ggdmFsdWUgZm9yIEVzY2FwZSAoRXNjKSBrZXlcblxuICB2YXIgRGVmYXVsdCA9IHtcbiAgICBiYWNrZHJvcDogdHJ1ZSxcbiAgICBrZXlib2FyZDogdHJ1ZSxcbiAgICBmb2N1czogdHJ1ZSxcbiAgICBzaG93OiB0cnVlXG4gIH07XG4gIHZhciBEZWZhdWx0VHlwZSA9IHtcbiAgICBiYWNrZHJvcDogJyhib29sZWFufHN0cmluZyknLFxuICAgIGtleWJvYXJkOiAnYm9vbGVhbicsXG4gICAgZm9jdXM6ICdib29sZWFuJyxcbiAgICBzaG93OiAnYm9vbGVhbidcbiAgfTtcbiAgdmFyIEV2ZW50ID0ge1xuICAgIEhJREU6IFwiaGlkZVwiICsgRVZFTlRfS0VZLFxuICAgIEhJRERFTjogXCJoaWRkZW5cIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XOiBcInNob3dcIiArIEVWRU5UX0tFWSxcbiAgICBTSE9XTjogXCJzaG93blwiICsgRVZFTlRfS0VZLFxuICAgIEZPQ1VTSU46IFwiZm9jdXNpblwiICsgRVZFTlRfS0VZLFxuICAgIFJFU0laRTogXCJyZXNpemVcIiArIEVWRU5UX0tFWSxcbiAgICBDTElDS19ESVNNSVNTOiBcImNsaWNrLmRpc21pc3NcIiArIEVWRU5UX0tFWSxcbiAgICBLRVlET1dOX0RJU01JU1M6IFwia2V5ZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVksXG4gICAgTU9VU0VVUF9ESVNNSVNTOiBcIm1vdXNldXAuZGlzbWlzc1wiICsgRVZFTlRfS0VZLFxuICAgIE1PVVNFRE9XTl9ESVNNSVNTOiBcIm1vdXNlZG93bi5kaXNtaXNzXCIgKyBFVkVOVF9LRVksXG4gICAgQ0xJQ0tfREFUQV9BUEk6IFwiY2xpY2tcIiArIEVWRU5UX0tFWSArIERBVEFfQVBJX0tFWVxuICB9O1xuICB2YXIgQ2xhc3NOYW1lID0ge1xuICAgIFNDUk9MTEJBUl9NRUFTVVJFUjogJ21vZGFsLXNjcm9sbGJhci1tZWFzdXJlJyxcbiAgICBCQUNLRFJPUDogJ21vZGFsLWJhY2tkcm9wJyxcbiAgICBPUEVOOiAnbW9kYWwtb3BlbicsXG4gICAgRkFERTogJ2ZhZGUnLFxuICAgIFNIT1c6ICdzaG93J1xuICB9O1xuICB2YXIgU2VsZWN0b3IgPSB7XG4gICAgRElBTE9HOiAnLm1vZGFsLWRpYWxvZycsXG4gICAgREFUQV9UT0dHTEU6ICdbZGF0YS10b2dnbGU9XCJtb2RhbFwiXScsXG4gICAgREFUQV9ESVNNSVNTOiAnW2RhdGEtZGlzbWlzcz1cIm1vZGFsXCJdJyxcbiAgICBGSVhFRF9DT05URU5UOiAnLmZpeGVkLXRvcCwgLmZpeGVkLWJvdHRvbSwgLmlzLWZpeGVkLCAuc3RpY2t5LXRvcCcsXG4gICAgU1RJQ0tZX0NPTlRFTlQ6ICcuc3RpY2t5LXRvcCcsXG4gICAgTkFWQkFSX1RPR0dMRVI6ICcubmF2YmFyLXRvZ2dsZXInXG4gICAgLyoqXG4gICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgICogQ2xhc3MgRGVmaW5pdGlvblxuICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgICAqL1xuXG4gIH07XG5cbiAgdmFyIE1vZGFsID1cbiAgLyojX19QVVJFX18qL1xuICBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gTW9kYWwoZWxlbWVudCwgY29uZmlnKSB7XG4gICAgICB0aGlzLl9jb25maWcgPSB0aGlzLl9nZXRDb25maWcoY29uZmlnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fZGlhbG9nID0gJChlbGVtZW50KS5maW5kKFNlbGVjdG9yLkRJQUxPRylbMF07XG4gICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB0aGlzLl9pc1Nob3duID0gZmFsc2U7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IGZhbHNlO1xuICAgICAgdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IGZhbHNlO1xuICAgICAgdGhpcy5fb3JpZ2luYWxCb2R5UGFkZGluZyA9IDA7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IDA7XG4gICAgfSAvLyBHZXR0ZXJzXG5cblxuICAgI
21167HZhciBfcHJvdG8gPSBNb2RhbC5wcm90b3R5cGU7XG5cbiAgICAvLyBQdWJsaWNcbiAgICBfcHJvdG8udG9nZ2xlID0gZnVuY3Rpb24gdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgfTtcblxuICAgIF9wcm90by5zaG93ID0gZnVuY3Rpb24gc2hvdyhyZWxhdGVkVGFyZ2V0KSB7XG4gICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8IHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKSkge1xuICAgICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgc2hvd0V2ZW50ID0gJC5FdmVudChFdmVudC5TSE9XLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS50cmlnZ2VyKHNob3dFdmVudCk7XG5cbiAgICAgIGlmICh0aGlzLl9pc1Nob3duIHx8IHNob3dFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSB0cnVlO1xuXG4gICAgICB0aGlzLl9jaGVja1Njcm9sbGJhcigpO1xuXG4gICAgICB0aGlzLl9zZXRTY3JvbGxiYXIoKTtcblxuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG5cbiAgICAgICQoZG9jdW1lbnQuYm9keSkuYWRkQ2xhc3MoQ2xhc3NOYW1lLk9QRU4pO1xuXG4gICAgICB0aGlzLl9zZXRFc2NhcGVFdmVudCgpO1xuXG4gICAgICB0aGlzLl9zZXRSZXNpemVFdmVudCgpO1xuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uKEV2ZW50LkNMSUNLX0RJU01JU1MsIFNlbGVjdG9yLkRBVEFfRElTTUlTUywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIHJldHVybiBfdGhpcy5oaWRlKGV2ZW50KTtcbiAgICAgIH0pO1xuICAgICAgJCh0aGlzLl9kaWFsb2cpLm9uKEV2ZW50Lk1PVVNFRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoX3RoaXMuX2VsZW1lbnQpLm9uZShFdmVudC5NT1VTRVVQX0RJU01JU1MsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgIGlmICgkKGV2ZW50LnRhcmdldCkuaXMoX3RoaXMuX2VsZW1lbnQpKSB7XG4gICAgICAgICAgICBfdGhpcy5faWdub3JlQmFja2Ryb3BDbGljayA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gX3RoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5oaWRlID0gZnVuY3Rpb24gaGlkZShldmVudCkge1xuICAgICAgdmFyIF90aGlzMiA9IHRoaXM7XG5cbiAgICAgIGlmIChldmVudCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNUcmFuc2l0aW9uaW5nIHx8ICF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgdmFyIGhpZGVFdmVudCA9ICQuRXZlbnQoRXZlbnQuSElERSk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLnRyaWdnZXIoaGlkZUV2ZW50KTtcblxuICAgICAgaWYgKCF0aGlzLl9pc1Nob3duIHx8IGhpZGVFdmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2lzU2hvd24gPSBmYWxzZTtcbiAgICAgIHZhciB0cmFuc2l0aW9uID0gVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5fc2V0RXNjYXBlRXZlbnQoKTtcblxuICAgICAgdGhpcy5fc2V0UmVzaXplRXZlbnQoKTtcblxuICAgICAgJChkb2N1bWVudCkub2ZmKEV2ZW50LkZPQ1VTSU4pO1xuICAgICAgJCh0aGlzLl9lbGVtZW50KS5yZW1vdmVDbGFzcyhDbGFzc05hbWUuU0hPVyk7XG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLm9mZihFdmVudC5DTElDS19ESVNNSVNTKTtcbiAgICAgICQodGhpcy5fZGlhbG9nKS5vZmYoRXZlbnQuTU9VU0VET1dOX0RJU01JU1MpO1xuXG4gICAgICBpZiAodHJhbnNpdGlvbikge1xuICAgICAgICAkKHRoaXMuX2VsZW1lbnQpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICByZXR1cm4gX3RoaXMyLl9oaWRlTW9kYWwoZXZlbnQpO1xuICAgICAgICB9KS5lbXVsYXRlVHJhbnNpdGlvbkVuZChUUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2hpZGVNb2RhbCgpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBfcHJvdG8uZGlzcG9zZSA9IGZ1bmN0aW9uIGRpc3Bvc2UoKSB7XG4gICAgICAkLnJlbW92ZURhdGEodGhpcy5fZWxlbWVudCwgREFUQV9LRVkpO1xuICAgICAgJCh3aW5kb3csIGRvY3VtZW50LCB0aGlzLl9lbGVtZW50LCB0aGlzLl9iYWNrZHJvcCkub2ZmKEVWRU5UX0tFWSk7XG4gICAgICB0aGlzLl9jb25maWcgPSBudWxsO1xuICAgICAgdGhpcy5fZWxlbWVudCA9IG51bGw7XG4gICAgICB0aGlzLl9kaWFsb2cgPSBudWxsO1xuICAgICAgdGhpcy5fYmFja2Ryb3AgPSBudWxsO1xuICAgICAgdGhpcy5faXNTaG93biA9IG51bGw7XG4gICAgICB0aGlzLl9pc0JvZHlPdmVyZmxvd2luZyA9IG51bGw7XG4gICAgICB0aGlzLl9pZ25vcmVCYWNrZHJvcENsaWNrID0gbnVsbDtcbiAgICAgIHRoaXMuX3Njcm9sbGJhcldpZHRoID0gbnVsbDtcbiAgICB9O1xuXG4gICAgX3Byb3RvLmhhbmRsZVVwZGF0ZSA9IGZ1bmN0aW9uIGhhbmRsZVVwZGF0ZSgpIHtcbiAgICAgIHRoaXMuX2FkanVzdERpYWxvZygpO1xuICAgIH07IC8vIFByaXZhdGVcblxuXG4gICAgX3Byb3RvLl9nZXRDb25maWcgPSBmdW5jdGlvbiBfZ2V0Q29uZmlnKGNvbmZpZykge1xuICAgICAgY29uZmlnID0gX2V4dGVuZHMoe30sIERlZmF1bHQsIGNvbmZpZyk7XG4gICAgICBVdGlsLnR5cGVDaGVja0NvbmZpZyhOQU1FLCBjb25maWcsIERlZmF1bHRUeXBlKTtcbiAgICAgIHJldHVybi
21167Bjb25maWc7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2hvd0VsZW1lbnQgPSBmdW5jdGlvbiBfc2hvd0VsZW1lbnQocmVsYXRlZFRhcmdldCkge1xuICAgICAgdmFyIF90aGlzMyA9IHRoaXM7XG5cbiAgICAgIHZhciB0cmFuc2l0aW9uID0gVXRpbC5zdXBwb3J0c1RyYW5zaXRpb25FbmQoKSAmJiAkKHRoaXMuX2VsZW1lbnQpLmhhc0NsYXNzKENsYXNzTmFtZS5GQURFKTtcblxuICAgICAgaWYgKCF0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUgfHwgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgICAvLyBEb24ndCBtb3ZlIG1vZGFsJ3MgRE9NIHBvc2l0aW9uXG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuXG4gICAgICB0aGlzLl9lbGVtZW50LnNjcm9sbFRvcCA9IDA7XG5cbiAgICAgIGlmICh0cmFuc2l0aW9uKSB7XG4gICAgICAgIFV0aWwucmVmbG93KHRoaXMuX2VsZW1lbnQpO1xuICAgICAgfVxuXG4gICAgICAkKHRoaXMuX2VsZW1lbnQpLmFkZENsYXNzKENsYXNzTmFtZS5TSE9XKTtcblxuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5mb2N1cykge1xuICAgICAgICB0aGlzLl9lbmZvcmNlRm9jdXMoKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHNob3duRXZlbnQgPSAkLkV2ZW50KEV2ZW50LlNIT1dOLCB7XG4gICAgICAgIHJlbGF0ZWRUYXJnZXQ6IHJlbGF0ZWRUYXJnZXRcbiAgICAgIH0pO1xuXG4gICAgICB2Y
21167XIgdHJhbnNpdGlvbkNvbXBsZXRlID0gZnVuY3Rpb24gdHJhbnNpdGlvbkNvbXBsZXRlKCkge1xuICAgICAgICBpZiAoX3RoaXMzLl9jb25maWcuZm9jdXMpIHtcbiAgICAgICAgICBfdGhpczMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgICQoX3RoaXMzLl9lbGVtZW50KS50cmlnZ2VyKHNob3duRXZlbnQpO1xuICAgICAgfTtcblxuICAgICAgaWYgKHRyYW5zaXRpb24pIHtcbiAgICAgICAgJCh0aGlzLl9kaWFsb2cpLm9uZShVdGlsLlRSQU5TSVRJT05fRU5ELCB0cmFuc2l0aW9uQ29tcGxldGUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKFRSQU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJhbnNpdGlvbkNvbXBsZXRlKCk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fZW5mb3JjZUZvY3VzID0gZnVuY3Rpb24gX2VuZm9yY2VGb2N1cygpIHtcbiAgICAgIHZhciBfdGhpczQgPSB0aGlzO1xuXG4gICAgICAkKGRvY3VtZW50KS5vZmYoRXZlbnQuRk9DVVNJTikgLy8gR3VhcmQgYWdhaW5zdCBpbmZpbml0ZSBmb2N1cyBsb29wXG4gICAgICAub24oRXZlbnQuRk9DVVNJTiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGlmIChkb2N1bWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmIF90aGlzNC5fZWxlbWVudCAhPT0gZXZlbnQudGFyZ2V0ICYmICQoX3RoaXM0Ll9lbGVtZW50KS5oYXMoZXZlbnQudGFyZ2V0KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBfdGhpczQuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0RXNjYXBlRXZlbnQgPSBmdW5jdGlvbiBfc2V0RXNjYXBlRXZlbnQoKSB7XG4gICAgICB2Y
21167XIgX3RoaXM1ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gJiYgdGhpcy5fY29uZmlnLmtleWJvYXJkKSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub24oRXZlbnQuS0VZRE9XTl9ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoZXZlbnQud2hpY2ggPT09IEVTQ0FQRV9LRVlDT0RFKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBfdGhpczUuaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKCF0aGlzLl9pc1Nob3duKSB7XG4gICAgICAgICQodGhpcy5fZWxlbWVudCkub2ZmKEV2ZW50LktFWURPV05fRElTTUlTUyk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0UmVzaXplRXZlbnQgPSBmdW5jdGlvbiBfc2V0UmVzaXplRXZlbnQoKSB7XG4gICAgICB2YXIgX3RoaXM2ID0gdGhpcztcblxuICAgICAgaWYgKHRoaXMuX2lzU2hvd24pIHtcbiAgICAgICAgJCh3aW5kb3cpLm9uKEV2ZW50LlJFU0laRSwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIF90aGlzNi5oYW5kbGVVcGRhdGUoZXZlbnQpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICQod2luZG93KS5vZmYoRXZlbnQuUkVTSVpFKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9oaWRlTW9kYWwgPSBmdW5jdGlvbiBfaGlkZU1vZGFsKCkge1xuICAgICAgdmFyIF90aGlzNyA9IHRoaXM7XG5cbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcblxuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgdHJ1ZSk7XG5cbiAgICAgIHRoaXMuX2lzVHJhbnNpdGlvbmluZyA9IGZhbHNlO1xuXG4gICAgICB0aGlzLl9zaG93QmFja2Ryb3AoZnVuY3Rpb24gKCkge1xuICAgICAgICAkKGRvY3VtZW50LmJvZHkpLnJlbW92ZUNsYXNzKENsYXNzTmFtZS5PUEVOKTtcblxuICAgICAgICBfdGhpczcuX3Jlc2V0QWRqdXN0bWVudHMoKTtcblxuICAgICAgICBfdGhpczcuX3Jlc2V0U2Nyb2xsYmFyKCk7XG5cbiAgICAgICAgJChfdGhpczcuX2VsZW1lbnQpLnRyaWdnZXIoRXZlbnQuSElEREVOKTtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX3JlbW92ZUJhY2tkcm9wID0gZnVuY3Rpb24gX3JlbW92ZUJhY2tkcm9wKCkge1xuICAgICAgaWYgKHRoaXMuX2JhY2tkcm9wKSB7XG4gICAgICAgICQodGhpcy5fYmFja2Ryb3ApLnJlbW92ZSgpO1xuICAgICAgICB0aGlzLl9iYWNrZHJvcCA9IG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIF9wcm90by5fc2hvd0JhY2tkcm9wID0gZnVuY3Rpb24gX3Nob3dCYWNrZHJvcChjYWxsYmFjaykge1xuICAgICAgdmFyIF90aGlzOCA9IHRoaXM7XG5cbiAgICAgIHZhciBhbmltYXRlID0gJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSkgPyBDbGFzc05hbWUuRkFERSA6ICcnO1xuXG4gICAgICBpZiAodGhpcy5faXNTaG93biAmJiB0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgdmFyIGRvQW5pbWF0ZSA9IFV0aWwuc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkgJiYgYW5pbWF0ZTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgICAgdGhpcy5fYmFja2Ryb3AuY2xhc3NOYW1lID0gQ2xhc3NOYW1lLkJBQ0tEUk9QO1xuXG4gICAgICAgIGlmIChhbmltYXRlKSB7XG4gICAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkuYWRkQ2xhc3MoYW5pbWF0ZSk7XG4gICAgICAgIH1cblxuICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5hcHBlbmRUbyhkb2N1bWVudC5ib2R5KTtcbiAgICAgICAgJCh0aGlzLl9lbGVtZW50KS5vbihFdmVudC5DTElDS19ESVNNSVNTLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoX3RoaXM4Ll9pZ25vcmVCYWNrZHJvcENsaWNrKSB7XG4gICAgICAgICAgICBfdGhpczguX2lnbm9yZUJhY2tkcm9wQ2xpY2sgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ICE9PSBldmVudC5jdXJyZW50VGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKF90aGlzOC5fY29uZmlnLmJhY2tkcm9wID09PSAnc3RhdGljJykge1xuICAgICAgICAgICAgX3RoaXM4Ll9lbGVtZW50LmZvY3VzKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF90aGlzOC5oaWRlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZG9BbmltYXRlKSB7XG4gICAgICAgICAgVXRpbC5yZWZsb3codGhpcy5fYmFja2Ryb3ApO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkuYWRkQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIGlmICghY2FsbGJhY2spIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRvQW5pbWF0ZSkge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkub25lKFV0aWwuVFJBTlNJVElPTl9FTkQsIGNhbGxiYWNrKS5lbXVsYXRlVHJhbnNpdGlvbkVuZChCQUNLRFJPUF9UUkFOU0lUSU9OX0RVUkFUSU9OKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRoaXMuX2lzU2hvd24gJiYgdGhpcy5fYmFja2Ryb3ApIHtcbiAgICAgICAgJCh0aGlzLl9iYWNrZHJvcCkucmVtb3ZlQ2xhc3MoQ2xhc3NOYW1lLlNIT1cpO1xuXG4gICAgICAgIHZhciBjYWxsYmFja1JlbW92ZSA9IGZ1bmN0aW9uIGNhbGxiYWNrUmVtb3ZlKCkge1xuICAgICAgICAgIF90aGlzOC5fcmVtb3ZlQmFja2Ryb3AoKTtcblxuICAgICAgICAgIGlmIChjYWxsYmFjaykge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKFV0aWwuc3VwcG9ydHNUcmFuc2l0aW9uRW5kKCkgJiYgJCh0aGlzLl9lbGVtZW50KS5oYXNDbGFzcyhDbGFzc05hbWUuRkFERSkpIHtcbiAgICAgICAgICAkKHRoaXMuX2JhY2tkcm9wKS5vbmUoVXRpbC5UUkFOU0lUSU9OX0VORCwgY2FsbGJhY2tSZW1vdmUpLmVtdWxhdGVUcmFuc2l0aW9uRW5kKEJBQ0tEUk9QX1RS
21167QU5TSVRJT05fRFVSQVRJT04pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNhbGxiYWNrUmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2spIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9OyAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gdGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGhhbmRsZSBvdmVyZmxvd2luZyBtb2RhbHNcbiAgICAvLyB0b2RvIChmYXQpOiB0aGVzZSBzaG91bGQgcHJvYmFibHkgYmUgcmVmYWN0b3JlZCBvdXQgb2YgbW9kYWwuanNcbiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgIF9wcm90by5fYWRqdXN0RGlhbG9nID0gZnVuY3Rpb24gX2FkanVzdERpYWxvZygpIHtcbiAgICAgIHZhciBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG5cbiAgICAgIGlmICghdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgJiYgaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzQm9keU92ZXJmbG93aW5nICYmICFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5wYWRkaW5nUmlnaHQgPSB0aGlzLl9zY3JvbGxiYXJXaWR0aCArIFwicHhcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldEFkanVzdG1lbnRzID0gZnVuY3Rpb24gX3Jlc2V0QWRqdXN0bWVudHMoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdMZWZ0ID0gJyc7XG4gICAgICB0aGlzLl9lbGVtZW50LnN0eWxlLnBhZGRpbmdSaWdodCA9ICcnO1xuICAgIH07XG5cbiAgICBfcHJvdG8uX2NoZWNrU2Nyb2xsYmFyID0gZnVuY3Rpb24gX2NoZWNrU2Nyb2xsYmFyKCkge1xuICAgICAgdmFyIHJlY3QgPSBkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgdGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcgPSByZWN0LmxlZnQgKyByZWN0LnJpZ2h0IDwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgICB0aGlzLl9zY3JvbGxiYXJXaWR0aCA9IHRoaXMuX2dldFNjcm9sbGJhcldpZHRoKCk7XG4gICAgfTtcblxuICAgIF9wcm90by5fc2V0U2Nyb2xsYmFyID0gZnVuY3Rpb24gX3NldFNjcm9sbGJhcigpIHtcbiAgICAgIHZhciBfdGhpczkgPSB0aGlzO1xuXG4gICAgICBpZiAodGhpcy5faXNCb2R5T3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgLy8gTm90ZTogRE9NTm9kZS5zdHlsZS5wYWRkaW5nUmlnaHQgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlIG9yICcnIGlmIG5vdCBzZXRcbiAgICAgICAgLy8gICB3aGlsZSAkKERPTU5vZGUpLmNzcygncGFkZGluZy1yaWdodCcpIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgdmFsdWUgb3IgMCBpZiBub3Qgc2V0XG4gICAgICAgIC8vIEFkanVzdCBmaXhlZCBjb250ZW50IHBhZGRpbmdcbiAgICAgICAgJChTZWxlY3Rvci5GSVhFRF9DT05URU5UKS5lYWNoKGZ1bmN0aW9uIChpbmRleCwgZWxlbWVudCkge1xuICAgICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gJChlbGVtZW50KVswXS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRQYWRkaW5nID0gJChlbGVtZW50KS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgICAkKGVsZW1lbnQpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIF90aGlzOS5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IHN0aWNreSBjb250ZW50IG1hcmdpblxuXG4gICAgICAgICQoU2VsZWN0b3IuU1RJQ0tZX0NPTlRFTlQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9ICQoZWxlbWVudClbMF0uc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRNYXJnaW4gPSAkKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJChlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnLCBhY3R1YWxNYXJnaW4pLmNzcygnbWFyZ2luLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkTWFyZ2luKSAtIF90aGlzOS5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IG5hdmJhci10b2dnbGVyIG1hcmdpblxuXG4gICAgICAgICQoU2VsZWN0b3IuTkFWQkFSX1RPR0dMRVIpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgICAgdmFyIGFjdHVhbE1hcmdpbiA9ICQoZWxlbWVudClbMF0uc3R5bGUubWFyZ2luUmlnaHQ7XG4gICAgICAgICAgdmFyIGNhbGN1bGF0ZWRNYXJnaW4gPSAkKGVsZW1lbnQpLmNzcygnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgICAgJChlbGVtZW50KS5kYXRhKCdtYXJnaW4tcmlnaHQnLCBhY3R1YWxNYXJnaW4pLmNzcygnbWFyZ2luLXJpZ2h0JywgcGFyc2VGbG9hdChjYWxjdWxhdGVkTWFyZ2luKSArIF90aGlzOS5fc2Nyb2xsYmFyV2lkdGggKyBcInB4XCIpO1xuICAgICAgICB9KTsgLy8gQWRqdXN0IGJvZHkgcGFkZGluZ1xuXG4gICAgICAgIHZhciBhY3R1YWxQYWRkaW5nID0gZG9jdW1lbnQuYm9keS5zdHlsZS5wYWRkaW5nUmlnaHQ7XG4gICAgICAgIHZhciBjYWxjdWxhdGVkUGFkZGluZyA9ICQoJ2JvZHknKS5jc3MoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgICAgJCgnYm9keScpLmRhdGEoJ3BhZGRpbmctcmlnaHQnLCBhY3R1YWxQYWRkaW5nKS5jc3MoJ3BhZGRpbmctcmlnaHQnLCBwYXJzZUZsb2F0KGNhbGN1bGF0ZWRQYWRkaW5nKSArIHRoaXMuX3Njcm9sbGJhcldpZHRoICsgXCJweFwiKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9yZXNldFNjcm9sbGJhciA9IGZ1bmN0aW9uIF9yZXNldFNjcm9sbGJhcigpIHtcbiAgICAgIC8vIFJlc3RvcmUgZml4ZWQgY29udGVudCBwYWRkaW5nXG4gICAgICAkKFNlbGVjdG9yLkZJWEVEX0NPTlRFTlQpLmVhY2goZnVuY3Rpb24gKGluZGV4LCBlbGVtZW50KSB7XG4gICAgICAgI
21167HZhciBwYWRkaW5nID0gJChlbGVtZW50KS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBwYWRkaW5nICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICQoZWxlbWVudCkuY3NzKCdwYWRkaW5nLXJpZ2h0JywgcGFkZGluZykucmVtb3ZlRGF0YSgncGFkZGluZy1yaWdodCcpO1xuICAgICAgICB9XG4gICAgICB9KTsgLy8gUmVzdG9yZSBzdGlja3kgY29udGVudCBhbmQgbmF2YmFyLXRvZ2dsZXIgbWFyZ2luXG5cbiAgICAgICQoU2VsZWN0b3IuU1RJQ0tZX0NPTlRFTlQgKyBcIiwgXCIgKyBTZWxlY3Rvci5OQVZCQVJfVE9HR0xFUikuZWFjaChmdW5jdGlvbiAoaW5kZXgsIGVsZW1lbnQpIHtcbiAgICAgICAgdmFyIG1hcmdpbiA9ICQoZWxlbWVudCkuZGF0YSgnbWFyZ2luLXJpZ2h0Jyk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBtYXJnaW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgJChlbGVtZW50KS5jc3MoJ21hcmdpbi1yaWdodCcsIG1hcmdpbikucmVtb3ZlRGF0YSgnbWFyZ2luLXJpZ2h0Jyk7XG4gICAgICAgIH1cbiAgICAgIH0pOyAvLyBSZXN0b3JlIGJvZHkgcGFkZGluZ1xuXG4gICAgICB2YXIgcGFkZGluZyA9ICQoJ2JvZHknKS5kYXRhKCdwYWRkaW5nLXJpZ2h0Jyk7XG5cbiAgICAgIGlmICh0eXBlb2YgcGFkZGluZyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgJCgnYm9keScpLmNzcygncGFkZGluZy1yaWdodCcsIHBhZGRpbmcpLnJlbW92ZURhdGEoJ3BhZGRpbmctcmlnaHQnKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgX3Byb3RvLl9nZXRTY3JvbGxiYXJXaWR0aCA9IGZ1bmN0aW9uIF9nZXRTY3JvbGxiYXJXaWR0aCgpIHtcbiAgICAgIC8vIHRoeCBkLndhbHNoXG4gICAgICB2Y
21167XIgc2Nyb2xsRGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICBzY3JvbGxEaXYuY2xhc3NOYW1lID0gQ2xhc3NOYW1lLlNDUk9MTEJBUl9NRUFTVVJFUjtcbiAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICAgIHZhciBzY3JvbGxiYXJXaWR0aCA9IHNjcm9sbERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCAtIHNjcm9sbERpdi5jbGllbnRXaWR0aDtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoc2Nyb2xsRGl2KTtcbiAgICAgIHJldHVybiBzY3JvbGxiYXJXaWR0aDtcbiAgICB9OyAvLyBTdGF0aWNcblxuXG4gICAgTW9kYWwuX2pRdWVyeUludGVyZmFjZSA9IGZ1bmN0aW9uIF9qUXVlcnlJbnRlcmZhY2UoY29uZmlnLCByZWxhdGVkVGFyZ2V0KSB7XG4gICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGRhdGEgPSAkKHRoaXMpLmRhdGEoREFUQV9LRVkpO1xuXG4gICAgICAgIHZhciBfY29uZmlnID0gX2V4dGVuZHMoe30sIE1vZGFsLkRlZmF1bHQsICQodGhpcykuZGF0YSgpLCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyAmJiBjb25maWcpO1xuXG4gICAgICAgIGlmICghZGF0YSkge1xuICAgICAgICAgIGRhdGEgPSBuZXcgTW9kYWwodGhpcywgX2NvbmZpZyk7XG4gICAgICAgICAgJCh0aGlzKS5kYXRhKERBVEFfS0VZLCBkYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtjb25maWddID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIk5vIG1ldGhvZCBuYW1lZCBcXFwiXCIgKyBjb25maWcgKyBcIlxcXCJcIik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGF0YVtjb25maWddKHJlbGF0ZWRUYXJnZXQpO1xuICAgICAgICB9IGVsc2UgaWYgKF9jb25maWcuc2hvdykge1xuICAgICAgICAgIGRhdGEuc2hvdyhyZWxhdGVkVGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfTtcblxuICAgIF9jcmVhdGVDbGFzcyhNb2RhbCwgbnVsbCwgW3tcbiAgICAgIGtleTogXCJWRVJTSU9OXCIsXG4gICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgcmV0dXJuIFZFUlNJT047XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcIkRlZmF1bHRcIixcbiAgICAgIGdldDogZnVuY3Rpb24gZ2V0KCkge1xuICAgICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gTW9kYWw7XG4gIH0oKTtcbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBEYXRhIEFwaSBpbXBsZW1lbnRhdGlvblxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAkKGRvY3VtZW50KS5vbihFdmVudC5DTElDS19EQVRBX0FQSSwgU2VsZWN0b3IuREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHZhciBfdGhpczEwID0gdGhpcztcblxuICAgIHZhciB0YXJnZXQ7XG4gICAgdmFyIHNlbGVjdG9yID0gVXRpbC5nZXRTZWxlY3RvckZyb21FbGVtZW50KHRoaXMpO1xuXG4gICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICB0YXJnZXQgPSAkKHNlbGVjdG9yKVswXTtcbiAgICB9XG5cbiAgICB2YXIgY29uZmlnID0gJCh0YXJnZXQpLmRhdGEoREFUQV9LRVkpID8gJ3RvZ2dsZScgOiBfZXh0ZW5kcyh7fSwgJCh0YXJnZXQpLmRhdGEoKSwgJCh0aGlzKS5kYXRhKCkpO1xuXG4gICAgaWYgKHRoaXMudGFnTmFtZSA9PT0gJ0EnIHx8IHRoaXMudGFnTmFtZSA9PT0gJ0FSRUEnKSB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cblxuICAgIHZhciAkdGFyZ2V0ID0gJCh0YXJnZXQpLm9uZShFdmVudC5TSE9XLCBmdW5jdGlvbiAoc2hvd0V2ZW50KSB7XG4gICAgICBpZiAoc2hvd0V2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG4gICAgICAgIC8vIE9ubHkgcmVnaXN0ZXIgZm9jdXMgcmVzdG9yZXIgaWYgbW9kYWwgd2lsbCBhY3R1YWxseSBnZXQgc2hvd25cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkdGFyZ2V0Lm9uZShFdmVudC5ISURERU4sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQoX3RoaXMxMCkuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICBfdGhpczEwLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgTW9kYWwuX2pRdWVyeUludGVyZmFjZS5jYWxsKCQodGFyZ2V0KSwgY29uZmlnLCB0aGlzKTtcbiAgfSk7XG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogalF1ZXJ5XG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICAkLmZuW05BTUVdID0gTW9kYWwuX2pRdWVyeUludGVyZmFjZTtcbiAgJC5mbltOQU1FXS5Db25zdHJ1Y3RvciA9IE1vZGFsO1xuXG4gICQuZm5bTkFNRV0ubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgICAkLmZuW05BTUVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgIHJldHVybiBNb2RhbC5falF1ZXJ5SW50ZXJmYWNlO1xuICB9O1xuXG4gIHJldHVybiBNb2RhbDtcbn0oJCk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RhbC5qcy5tYXAiLCIvLyEgbW9tZW50LmpzXG5cbjsoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICAgIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAgIGdsb2JhbC5tb21lbnQgPSBmYWN0b3J5KClcbn0odGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIGhvb2tDYWxsYmFjaztcblxuICAgIGZ1bmN0aW9uIGhvb2tzICgpIHtcbiAgICAgICAgcmV0dXJuIGhvb2tDYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgIH1cblxuICAgIC8vIFRoaXMgaXMgZG9uZSB0byByZWdpc3RlciB0aGUgbWV0aG9kIGNhbGxlZCB3aXRoIG1vbWVudCgpXG4gICAgLy8gd2l0aG91dCBjcmVhdGluZyBjaXJjdWxhciBkZXBlbmRlbmNpZXMuXG4gICAgZnVuY3Rpb24gc2V0SG9va0NhbGxiYWNrIChjYWxsYmFjaykge1xuICAgICAgICBob29rQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FycmF
211675KGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIEFycmF5IHx8IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3QoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IHdpbGwgdHJlYXQgdW5kZWZpbmVkIGFuZCBudWxsIGFzIG9iamVjdCBpZiBpdCB3YXNuJ3QgZm9yXG4gICAgICAgIC8vIGlucHV0ICE9IG51bGxcbiAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmopIHtcbiAgICAgICAgaWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKSB7XG4gICAgICAgICAgICByZXR1cm4gKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG9iaikubGVuZ3RoID09PSAwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBrO1xuICAgICAgICAgICAgZm9yIChrIGluIG9iaikge1xuICAgICAgICAgICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoaykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVbmRlZmluZWQoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSB2b2lkIDA7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNOdW1iZXIoaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNEYXRlKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGUgfHwgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1hcChhcnIsIGZuKSB7XG4gICAgICAgIHZhciByZXMgPSBbXSwgaTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgcmVzLnB1c2goZm4oYXJyW2ldLCBpKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNPd25Qcm9wKGEsIGIpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChhLCBiKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBleHRlbmQoYSwgYikge1xuICAgICAgICBmb3IgKHZhciBpIGluIGIpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGIsIGkpKSB7XG4gICAgICAgICAgICAgICAgYVtpXSA9IGJbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndG9TdHJpbmcnKSkge1xuICAgICAgICAgICAgYS50b1N0cmluZyA9IGIudG9TdHJpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcChiLCAndmFsdWVPZicpKSB7XG4gICAgICAgICAgICBhLnZhbHVlT2YgPSBiLnZhbHVlT2Y7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0KSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbE9yVVRDKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCB0cnVlKS51dGMoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZhdWx0UGFyc2luZ0ZsYWdzKCkge1xuICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZXAgY2xvbmUgdGhpcyBvYmplY3QuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbXB0eSAgICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVudXNlZFRva2VucyAgICA6IFtdLFxuICAgICAgICAgICAgdW51c2VkSW5wdXQgICAgIDogW10sXG4gICAgICAgICAgICBvdmVyZmxvdyAgICAgICAgOiAtMixcbiAgICAgICAgICAgIGNoYXJzTGVmdE92ZXIgICA6IDAsXG4gICAgICAgICAgICBudWxsSW5wdXQgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGludmFsaWRNb250aCAgICA6IG51bGwsXG4gICAgICAgICAgICBpbnZhbGlkRm9ybWF0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHVzZXJJbnZhbGlkYXRlZCA6IGZhbHNlLFxuICAgICAgICAgICAgaXNvICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICBwYXJzZWREYXRlUGFydHMgOiBbXSxcbiAgICAgICAgICAgIG1lcmlkaWVtICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICByZmMyODIyICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHdlZWtkYXlNaXNtYXRjaCA6IGZhbHNlXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2luZ0ZsYWdzKG0pIHtcbiAgICAgICAgaWYgKG0uX3BmID09IG51bGwpIHtcbiAgICAgICAgICAgIG0uX3BmID0gZGVmYXVsdFBhcnNpbmdGbGFncygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBtLl9wZjtcbiAgICB9XG5cbiAgICB2YXIgc29tZTtcbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLnNvbWUpIHtcbiAgICAgICAgc29tZSA9IEFycmF5LnByb3RvdHlwZS5zb21lO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHNvbWUgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgICAgICAgICB2Y
21167XIgdCA9IE9iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBsZW4gPSB0Lmxlbmd0aCA+Pj4gMDtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHQgJiYgZnVuLmNhbGwodGhpcywgdFtpXSwgaSwgdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZChtKSB7XG4gICAgICAgIGlmIChtLl9pc1ZhbGlkID09IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBmbGFncyA9IGdldFBhcnNpbmdGbGFncyhtKTtcbiAgICAgICAgICAgIHZhciBwYXJzZWRQYXJ0cyA9IHNvbWUuY2FsbChmbGFncy5wYXJzZWREYXRlUGFydHMsIGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGkgIT0gbnVsbDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdmFyIGlzTm93VmFsaWQgPSAhaXNOYU4obS5fZC5nZXRUaW1lKCkpICYmXG4gICAgICAgICAgICAgICAgZmxhZ3Mub3ZlcmZsb3cgPCAwICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmVtcHR5ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRNb250aCAmJlxuICAgICAgICAgICAgICAgICFmbGFncy5pbnZhbGlkV2Vla2RheSAmJlxuICAgICAgICAgICAgICAgICFmbGFncy53ZWVrZGF5TWlzbWF0Y2ggJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MubnVsbElucHV0ICYmXG4gICAgICAgICAgICAgICAgIWZsYWdzLmludmFsaWRGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhZmxhZ3MudXNlckludmFsaWRhdGVkICYmXG4gICAgICAgICAgICAgICAgKCFmbGFncy5tZXJpZGllbSB8fCAoZmxhZ3MubWVyaWRpZW0gJiYgcGFyc2VkUGFydHMpKTtcblxuICAgICAgICAgICAgaWYgKG0uX3N0cmljdCkge1xuICAgICAgICAgICAgICAgIGlzTm93VmFsaWQgPSBpc05vd1ZhbGlkICYmXG4gICAgICAgICAgICAgICAgICAgIGZsYWdzLmNoYXJzTGVmdE92ZXIgPT09IDAgJiZcbiAgICAgICAgICAgICAgICAgICAgZmxhZ3MudW51c2VkVG9rZW5zLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICBmbGFncy5iaWdIb3VyID09PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4gPT0gbnVsbCB8fCAhT2JqZWN0LmlzRnJvemVuKG0pKSB7XG4gICAgICAgICAgICAgICAgbS5faXNWYWxpZCA9IGlzTm93VmFsaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNOb3dWYWxpZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbS5faXNWYWxpZDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVJbnZhbGlkIChmbGFncykge1xuICAgICAgICB2Y
21167XIgbSA9IGNyZWF0ZVVUQyhOYU4pO1xuICAgICAgICBpZiAoZmxhZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAgZXh0ZW5kKGdldFBhcnNpbmdGbGFncyhtKSwgZmxhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKG0pLnVzZXJJbnZhbGlkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9XG5cbiAgICAvLyBQbHVnaW5zIHRoYXQgYWRkIHByb3BlcnRpZXMgc2hvdWxkIGFsc28gYWRkIHRoZSBrZXkgaGVyZSAobnVsbCB2YWx1ZSksXG4gICAgLy8gc28gd2UgY2FuIHByb3Blcmx5IGNsb25lIG91cnNlbHZlcy5cbiAgICB2YXIgbW9tZW50UHJvcGVydGllcyA9IGhvb2tzLm1vbWVudFByb3BlcnRpZXMgPSBbXTtcblxuICAgIGZ1bmN0aW9uIGNvcHlDb25maWcodG8sIGZyb20pIHtcbiAgICAgICAgdmFyIGksIHByb3AsIHZhbDtcblxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzQU1vbWVudE9iamVjdCkpIHtcbiAgICAgICAgICAgIHRvLl9pc0FNb21lbnRPYmplY3QgPSBmcm9tLl9pc0FNb21lbnRPYmplY3Q7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9pKSkge1xuICAgICAgICAgICAgdG8uX2kgPSBmcm9tLl9pO1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fZikpIHtcbiAgICAgICAgICAgIHRvLl9mID0gZnJvbS5fZjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2wpKSB7XG4gICAgICAgICAgICB0by5fbCA9IGZyb20uX2w7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9zdHJpY3QpKSB7XG4gICAgICAgICAgICB0by5fc3RyaWN0ID0gZnJvbS5fc3RyaWN0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fdHptKSkge1xuICAgICAgICAgICAgdG8uX3R6bSA9IGZyb20uX3R6bTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKGZyb20uX2lzVVRDKSkge1xuICAgICAgICAgICAgdG8uX2lzVVRDID0gZnJvbS5faXNVVEM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9vZmZzZXQpKSB7XG4gICAgICAgICAgICB0by5fb2Zmc2V0ID0gZnJvbS5fb2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIGlmICghaXNVbmRlZmluZWQoZnJvbS5fcGYpKSB7XG4gICAgICAgICAgICB0by5fcGYgPSBnZXRQYXJzaW5nRmxhZ3MoZnJvbSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpc1VuZGVmaW5lZChmcm9tLl9sb2NhbGUpKSB7XG4gICAgICAgICAgICB0by5fbG9jYWxlID0gZnJvbS5fbG9jYWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1vbWVudFByb3BlcnRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG1vbWVudFByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9wID0gbW9tZW50UHJvcGVydGllc1tpXTtcbiAgICAgICAgICAgICAgICB2YWwgPSBmcm9tW3Byb3BdO1xuICAgICAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodmFsKSkge1xuICAgICAgICAgICAgICAgICAgICB0b1twcm9wXSA9IHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdG87XG4gICAgfVxuXG4gICAgdmFyIHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAgIC8vIE1vbWVudCBwcm90b3R5cGUgb2JqZWN0XG4gICAgZnVuY3Rpb24gTW9tZW50KGNvbmZpZykge1xuICAgICAgICBjb3B5Q29uZmlnKHRoaXMsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMuX2QgPSBuZXcgRGF0ZShjb25maWcuX2QgIT0gbnVsbCA/IGNvbmZpZy5fZC5nZXRUaW1lKCkgOiBOYU4pO1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICB0aGlzLl9kID0gbmV3IERhdGUoTmFOKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBQcmV2ZW50IGluZmluaXRlIGxvb3AgaW4gY2FzZSB1cGRhdGVPZmZzZXQgY3JlYXRlcyBuZXcgbW9tZW50XG4gICAgICAgIC8vIG9iamVjdHMuXG4gICAgICAgIGlmICh1cGRhdGVJblByb2dyZXNzID09PSBmYWxzZSkge1xuICAgICAgICAgICAgdXBkYXRlSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcyk7XG4gICAgICAgICAgICB1cGRhdGVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc01vbWVudCAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogaW5zdGFuY2VvZiBNb21lbnQgfHwgKG9iaiAhPSBudWxsICYmIG9iai5faXNBTW9tZW50T2JqZWN0ICE9IG51bGwpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic0Zsb29yIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIC8vIC0wIC0+IDBcbiAgICAgICAgICAgIHJldHVybiBNYXRoLmNlaWwobnVtYmVyKSB8fCAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSW50KGFyZ3VtZW50Rm9yQ29lcmNpb24pIHtcbiAgICAgICAgdmFyIGNvZXJjZWROdW1iZXIgPSArYXJndW1lbnRGb3JDb2VyY2lvbixcbiAgICAgICAgICAgIHZhbHVlID0gMDtcblxuICAgICAgICBpZiAoY29lcmNlZE51bWJlciAhPT0gMCAmJiBpc0Zpbml0ZShjb2VyY2VkTnVtYmVyKSkge1xuICAgICAgICAgICAgdmFsdWUgPSBhYnNGbG9vcihjb2VyY2VkTnVtYmVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICAvLyBjb21wYXJlIHR3byBhcnJheXMsIHJldHVybiB0aGUgbnVtYmVyIG9mIGRpZmZlcmVuY2VzXG4gICAgZnVuY3Rpb24gY29tcGFyZUFycmF5cyhhcnJheTEsIGFycmF5MiwgZG9udENvbnZlcnQpIHtcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKGFycmF5MS5sZW5ndGgsIGFycmF5Mi5sZW5ndGgpLFxuICAgICAgICAgICAgbGVuZ3RoRGlmZiA9IE1hdGguYWJzKGFycmF5MS5sZW5ndGggLSBhcnJheTIubGVuZ3RoKSxcbiAgICAgICAgICAgIGRpZmZzID0gMCxcbiAgICAgICAgICAgIGk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKChkb250Q29udmVydCAmJi
21167BhcnJheTFbaV0gIT09IGFycmF5MltpXSkgfHxcbiAgICAgICAgICAgICAgICAoIWRvbnRDb252ZXJ0ICYmIHRvSW50KGFycmF5MVtpXSkgIT09IHRvSW50KGFycmF5MltpXSkpKSB7XG4gICAgICAgICAgICAgICAgZGlmZnMrKztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlmZnMgKyBsZW5ndGhEaWZmO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdhcm4obXNnKSB7XG4gICAgICAgIGlmIChob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPT09IGZhbHNlICYmXG4gICAgICAgICAgICAgICAgKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCdEZXByZWNhdGlvbiB3YXJuaW5nOiAnICsgbXNnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZShtc2csIGZuKSB7XG4gICAgICAgIHZhciBmaXJzdFRpbWUgPSB0cnVlO1xuXG4gICAgICAgIHJldHVybiBleHRlbmQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKGhvb2tzLmRlcHJlY2F0aW9uSGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsIG1zZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZmlyc3RUaW1lKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgYXJnO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZyA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyArPSAnXFxuWycgKyBpICsgJ10gJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBhcmd1bWVudHNbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcgKz0ga2V5ICsgJzogJyArIGFyZ3VtZW50c1swXVtrZXldICsgJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZy5zbGljZSgwLCAtMik7IC8vIFJlbW92ZSB0cmFpbGluZyBjb21tYSBhbmQgc3BhY2VcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhcmdzLnB1c2goYXJnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgd2Fybihtc2cgKyAnXFxuQXJndW1lbnRzOiAnICsgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJncykuam9pbignJykgKyAnXFxuJyArIChuZXcgRXJyb3IoKSkuc3RhY2spO1xuICAgICAgICAgICAgICAgIGZpcnN0VGltZSA9IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH0sIGZuKTtcbiAgICB9XG5cbiAgICB2YXIgZGVwcmVjYXRpb25zID0ge307XG5cbiAgICBmdW5jdGlvbiBkZXByZWNhdGVTaW1wbGUobmFtZSwgbXNnKSB7XG4gICAgICAgIGlmIChob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgaG9va3MuZGVwcmVjYXRpb25IYW5kbGVyKG5hbWUsIG1zZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFkZXByZWNhdGlvbnNbbmFtZV0pIHtcbiAgICAgICAgICAgIHdhcm4obXNnKTtcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uc1tuYW1lXSA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob29rcy5zdXBwcmVzc0RlcHJlY2F0aW9uV2FybmluZ3MgPSBmYWxzZTtcbiAgICBob29rcy5kZXByZWNhdGlvbkhhbmRsZXIgPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBGdW5jdGlvbiB8fCBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoaW5wdXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldCAoY29uZmlnKSB7XG4gICAgICAgIHZhciBwcm9wLCBpO1xuICAgICAgICBmb3IgKGkgaW4gY29uZmlnKSB7XG4gICAgICAgICAgICBwcm9wID0gY29uZmlnW2ldO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ocHJvcCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2ldID0gcHJvcDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpc1snXycgKyBpXSA9IHByb3A7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnO1xuICAgICAgICAvLyBMZW5pZW50IG9yZGluYWwgcGFyc2luZyBhY2NlcHRzIGp1c3QgYSBudW1iZXIgaW4gYWRkaXRpb24gdG9cbiAgICAgICAgLy8gbnVtYmVyICsgKHBvc3NpYmx5KSBzdHVmZiBjb21pbmcgZnJvbSBfZGF5T2ZNb250aE9yZGluYWxQYXJzZS5cbiAgICAgICAgLy8gVE9ETzogUmVtb3ZlIFwib3JkaW5hbFBhcnNlXCIgZmFsbGJhY2sgaW4gbmV4dCBtYWpvciByZWxlYXNlLlxuICAgICAgICB0aGlzLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudCA9IG5ldyBSZWdFeHAoXG4gICAgICAgICAgICAodGhpcy5fZGF5T2ZNb250aE9yZGluYWxQYXJzZS5zb3VyY2UgfHwgdGhpcy5fb3JkaW5hbFBhcnNlLnNvdXJjZSkgK1xuICAgICAgICAgICAgICAgICd8JyArICgvXFxkezEsMn0vKS5zb3VyY2UpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNoaWxkQ29uZmlnKSB7XG4gICAgICAgIHZhciByZXMgPSBleHRlbmQoe30sIHBhcmVudENvbmZpZyksIHByb3A7XG4gICAgICAgIGZvciAocHJvcCBpbiBjaGlsZENvbmZpZykge1xuICAgICAgICAgICAgaWYgKGhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkgJiYgaXNPYmplY3QoY2hpbGRDb25maWdbcHJvcF0pKSB7XG4gICAgICAgICAgICAgICAgICAgI
21167HJlc1twcm9wXSA9IHt9O1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBwYXJlbnRDb25maWdbcHJvcF0pO1xuICAgICAgICAgICAgICAgICAgICBleHRlbmQocmVzW3Byb3BdLCBjaGlsZENvbmZpZ1twcm9wXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaGlsZENvbmZpZ1twcm9wXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc1twcm9wXSA9IGNoaWxkQ29uZmlnW3Byb3BdO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByZXNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAocHJvcCBpbiBwYXJlbnRDb25maWcpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKHBhcmVudENvbmZpZywgcHJvcCkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWhhc093blByb3AoY2hpbGRDb25maWcsIHByb3ApICYmXG4gICAgICAgICAgICAgICAgICAgIGlzT2JqZWN0KHBhcmVudENvbmZpZ1twcm9wXSkpIHtcbiAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgY2hhbmdlcyB0byBwcm9wZXJ0aWVzIGRvbid0IG1vZGlmeSBwYXJlbnQgY29uZmlnXG4gICAgICAgICAgICAgICAgcmVzW3Byb3BdID0gZXh0ZW5kKHt9LCByZXNbcHJvcF0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gTG9jYWxlKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuc2V0KGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIga2V5cztcblxuICAgIGlmIChPYmplY3Qua2V5cykge1xuICAgICAgICBrZXlzID0gT2JqZWN0LmtleXM7XG4gICAgfSBlbHNlIHtcbiAgICAgICAga2V5cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICAgICAgICAgIHZhciBpLCByZXMgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSBpbiBvYmopIHtcbiAgICAgICAgICAgICAgICBpZiAoaGFzT3duUHJvcChvYmosIGkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRDYWxlbmRhciA9IHtcbiAgICAgICAgc2FtZURheSA6ICdbVG9kYXkgYXRdIExUJyxcbiAgICAgICAgbmV4dERheSA6ICdbVG9tb3Jyb3cgYXRdIExUJyxcbiAgICAgICAgbmV4dFdlZWsgOiAnZGRkZCBbYXRdIExUJyxcbiAgICAgICAgbGFzdERheSA6ICdbWWVzdGVyZGF5IGF0XSBMVCcsXG4gICAgICAgIGxhc3RXZWVrIDogJ1tMYXN0XSBkZGRkIFthdF0gTFQnLFxuICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciAoa2V5LCBtb20sIG5vdykge1xuICAgICAgICB2Y
21167XIgb3V0cHV0ID0gdGhpcy5fY2FsZW5kYXJba2V5XSB8fCB0aGlzLl9jYWxlbmRhclsnc2FtZUVsc2UnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24ob3V0cHV0KSA/IG91dHB1dC5jYWxsKG1vbSwgbm93KSA6IG91dHB1dDtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvbmdEYXRlRm9ybWF0ID0ge1xuICAgICAgICBMVFMgIDogJ2g6bW06c3MgQScsXG4gICAgICAgIExUICAgOiAnaDptbSBBJyxcbiAgICAgICAgTCAgICA6ICdNTS9ERC9ZWVlZJyxcbiAgICAgICAgTEwgICA6ICdNTU1NIEQsIFlZWVknLFxuICAgICAgICBMTEwgIDogJ01NTU0gRCwgWVlZWSBoOm1tIEEnLFxuICAgICAgICBMTExMIDogJ2RkZGQsIE1NTU0gRCwgWVlZWSBoOm1tIEEnXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvbmdEYXRlRm9ybWF0IChrZXkpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0sXG4gICAgICAgICAgICBmb3JtYXRVcHBlciA9IHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleS50b1VwcGVyQ2FzZSgpXTtcblxuICAgICAgICBpZiAoZm9ybWF0IHx8ICFmb3JtYXRVcHBlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV0gPSBmb3JtYXRVcHBlci5yZXBsYWNlKC9NTU1NfE1NfEREfGRkZGQvZywgZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zbGljZSgxKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xvbmdEYXRlRm9ybWF0W2tleV07XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRJbnZhbGlkRGF0ZSA9ICdJbnZhbGlkIGRhdGUnO1xuXG4gICAgZnVuY3Rpb24gaW52YWxpZERhdGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52YWxpZERhdGU7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRPcmRpbmFsID0gJyVkJztcbiAgICB2YXIgZGVmYXVsdERheU9mTW9udGhPcmRpbmFsUGFyc2UgPSAvXFxkezEsMn0vO1xuXG4gICAgZnVuY3Rpb24gb3JkaW5hbCAobnVtYmVyKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9vcmRpbmFsLnJlcGxhY2UoJyVkJywgbnVtYmVyKTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFJlbGF0aXZlVGltZSA9IHtcbiAgICAgICAgZnV0dXJlIDogJ2luICVzJyxcbiAgICAgICAgcGFzdCAgIDogJyVzIGFnbycsXG4gICAgICAgIHMgIDogJ2EgZmV3IHNlY29uZHMnLFxuICAgICAgICBzcyA6ICclZCBzZWNvbmRzJyxcbiAgICAgICAgbSAgOiAnYSBtaW51dGUnLFxuICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgaCAgOiAnYW4gaG91cicsXG4gICAgICAgIGhoIDogJyVkIGhvdXJzJyxcbiAgICAgICAgZCAgOiAnYSBkYXknLFxuICAgICAgICBkZCA6ICclZCBkYXlzJyxcbiAgICAgICAgTSAgOiAnYSBtb250aCcsXG4gICAgICAgIE1NIDogJyVkIG1vbnRocycsXG4gICAgICAgIHkgIDogJ2EgeWVhcicsXG4gICAgICAgIHl5IDogJyVkIHllYXJzJ1xuICAgIH07XG5cbiAgICBmdW5jdGlvbiByZWxhdGl2ZVRpbWUgKG51bWJlciwgd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSkge1xuICAgICAgICB2Y
21167XIgb3V0cHV0ID0gdGhpcy5fcmVsYXRpdmVUaW1lW3N0cmluZ107XG4gICAgICAgIHJldHVybiAoaXNGdW5jdGlvbihvdXRwdXQpKSA/XG4gICAgICAgICAgICBvdXRwdXQobnVtYmVyLCB3aXRob3V0U3VmZml4LCBzdHJpbmcsIGlzRnV0dXJlKSA6XG4gICAgICAgICAgICBvdXRwdXQucmVwbGFjZSgvJWQvaSwgbnVtYmVyKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXN0RnV0dXJlIChkaWZmLCBvdXRwdXQpIHtcbiAgICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuX3JlbGF0aXZlVGltZVtkaWZmID4gMCA/ICdmdXR1cmUnIDogJ3Bhc3QnXTtcbiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24oZm9ybWF0KSA/IGZvcm1hdChvdXRwdXQpIDogZm9ybWF0LnJlcGxhY2UoLyVzL2ksIG91dHB1dCk7XG4gICAgfVxuXG4gICAgdmFyIGFsaWFzZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFVuaXRBbGlhcyAodW5pdCwgc2hvcnRoYW5kKSB7XG4gICAgICAgIHZhciBsb3dlckNhc2UgPSB1bml0LnRvTG93ZXJDYXNlKCk7XG4gICAgICAgIGFsaWFzZXNbbG93ZXJDYXNlXSA9IGFsaWFzZXNbbG93ZXJDYXNlICsgJ3MnXSA9IGFsaWFzZXNbc2hvcnRoYW5kXSA9IHVuaXQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplVW5pdHModW5pdHMpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB1bml0cyA9PT0gJ3N0cmluZycgPyBhbGlhc2VzW3VuaXRzXSB8fCBhbGlhc2VzW3VuaXRzLnRvTG93ZXJDYXNlKCldIDogdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZU9iamVjdFVuaXRzKGlucHV0T2JqZWN0KSB7XG4gICAgICAgIHZhciBub3JtYWxpemVkSW5wdXQgPSB7fSxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wLFxuICAgICAgICAgICAgcHJvcDtcblxuICAgICAgICBmb3IgKHByb3AgaW4gaW5wdXRPYmplY3QpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wKGlucHV0T2JqZWN0LCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm9wID0gbm9ybWFsaXplVW5pdHMocHJvcCk7XG4gICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQcm9wKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dFtub3JtYWxpemVkUHJvcF0gPSBpbnB1dE9iamVjdFtwcm9wXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0O1xuICAgIH1cblxuICAgIHZhciBwcmlvcml0aWVzID0ge307XG5cbiAgICBmdW5jdGlvbiBhZGRVbml0UHJpb3JpdHkodW5pdCwgcHJpb3JpdHkpIHtcbiAgICAgICAgcHJpb3JpdGllc1t1bml0XSA9IHByaW9yaXR5O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFByaW9yaXRpemVkVW5pdHModW5pdHNPYmopIHtcbiAgICAgICAgdmFyIHVuaXRzID0gW107XG4gICAgICAgIGZvciAodmFyIHUgaW4gdW5pdHNPYmopIHtcbiAgICAgICAgICAgIHVuaXRzLnB1c2goe3VuaXQ6IHUsIHByaW9yaXR5OiBwcmlvcml0aWVzW3VdfSk7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMuc29ydChmdW5jdGlvbiAoYSwgYikge1xuICAgICAgICAgICAgcmV0dXJuIGEucHJpb3JpdHkgLSBiLnByaW9yaXR5O1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHVuaXRzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHplcm9GaWxsKG51bWJlciwgdGFyZ2V0TGVuZ3RoLCBmb3JjZVNpZ24pIHtcbiAgICAgICAgdmFyIGFic051bWJlciA9ICcnICsgTWF0aC5hYnMobnVtYmVyKSxcbiAgICAgICAgICAgIHplcm9zVG9GaWxsID0gdGFyZ2V0TGVuZ3RoIC0gYWJzTnVtYmVyLmxlbmd0aCxcbiAgICAgICAgICAgIHNpZ24gPSBudW1iZXIgPj0gMDtcbiAgICAgICAgcmV0dXJuIChzaWduID8gKGZvcmNlU2lnbiA/ICcrJyA6ICcnKSA6ICctJykgK1xuICAgICAgICAgICAgTWF0aC5wb3coMTAsIE1hdGgubWF4KDAsIHplcm9zVG9GaWxsKSkudG9TdHJpbmcoKS5zdWJzdHIoMSkgKyBhYnNOdW1iZXI7XG4gICAgfVxuXG4gICAgdmFyIGZvcm1hdHRpbmdUb2tlbnMgPSAvKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nO1xuXG4gICAgdmFyIGxvY2FsRm9ybWF0dGluZ1Rva2VucyA9IC8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2c7XG5cbiAgICB2YXIgZm9ybWF0RnVuY3Rpb25zID0ge307XG5cbiAgICB2YXIgZm9ybWF0VG9rZW5GdW5jdGlvbnMgPSB7fTtcblxuICAgIC8vIHRva2VuOiAgICAnTSdcbiAgICAvLyBwYWRkZWQ6ICAgWydNTScsIDJdXG4gICAgLy8gb3JkaW5hbDogICdNbydcbiAgICAvLyBjYWxsYmFjazogZnVuY3Rpb24gKCkgeyB0aGlzLm1vbnRoKCkgKyAxIH1cbiAgICBmdW5jdGlvbiBhZGRGb3JtYXRUb2tlbiAodG9rZW4sIHBhZGRlZCwgb3JkaW5hbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGZ1bmMgPSBjYWxsYmFjaztcbiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2FsbGJhY2tdKCk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0b2tlbikge1xuICAgICAgICAgICAgZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dID0gZnVuYztcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFkZGVkKSB7XG4gICAgICAgICAgICBmb3JtYXRUb2tlbkZ1bmN0aW9uc1twYWRkZWRbMF1dID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6ZXJvRmlsbChmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHBhZGRlZFsxXSwgcGFkZGVkWzJdKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9yZGluYWwpIHtcbiAgICAgICAgICAgIGZvcm1hdFRva2VuRnVuY3Rpb25zW29yZGluYWxdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgI
21167HJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5vcmRpbmFsKGZ1bmMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdG9rZW4pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoaW5wdXQpIHtcbiAgICAgICAgaWYgKGlucHV0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXlxcW3xcXF0kL2csICcnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvXFxcXC9nLCAnJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCkge1xuICAgICAgICB2YXIgYXJyYXkgPSBmb3JtYXQubWF0Y2goZm9ybWF0dGluZ1Rva2VucyksIGksIGxlbmd0aDtcblxuICAgICAgICBmb3IgKGkgPSAwLCBsZW5ndGggPSBhcnJheS5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGZvcm1hdFRva2VuRnVuY3Rpb25zW2FycmF5W2ldXSkge1xuICAgICAgICAgICAgICAgIGFycmF5W2ldID0gZm9ybWF0VG9rZW5GdW5jdGlvbnNbYXJyYXlbaV1dO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBhcnJheVtpXSA9IHJlbW92ZUZvcm1hdHRpbmdUb2tlbnMoYXJyYXlbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChtb20pIHtcbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSAnJywgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIG91dHB1dCArPSBpc0Z1bmN0aW9uKGFycmF5W2ldKSA/IGFycmF5W2ldLmNhbGwobW9tLCBmb3JtYXQpIDogYXJyYXlbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIGZvcm1hdCBkYXRlIHVzaW5nIG5hdGl2ZSBkYXRlIG9iamVjdFxuICAgIGZ1bmN0aW9uIGZvcm1hdE1vbWVudChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIG0ubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmb3JtYXQgPSBleHBhbmRGb3JtYXQoZm9ybWF0LCBtLmxvY2FsZURhdGEoKSk7XG4gICAgICAgIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdID0gZm9ybWF0RnVuY3Rpb25zW2Zvcm1hdF0gfHwgbWFrZUZvcm1hdEZ1bmN0aW9uKGZvcm1hdCk7XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdEZ1bmN0aW9uc1tmb3JtYXRdKG0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGV4cGFuZEZvcm1hdChmb3JtYXQsIGxvY2FsZSkge1xuICAgICAgICB2Y
21167XIgaSA9IDU7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKGlucHV0KSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLmxvbmdEYXRlRm9ybWF0KGlucHV0KSB8fCBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICB3aGlsZSAoaSA+PSAwICYmIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy50ZXN0KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdC5yZXBsYWNlKGxvY2FsRm9ybWF0dGluZ1Rva2VucywgcmVwbGFjZUxvbmdEYXRlRm9ybWF0VG9rZW5zKTtcbiAgICAgICAgICAgIGxvY2FsRm9ybWF0dGluZ1Rva2Vucy5sYXN0SW5kZXggPSAwO1xuICAgICAgICAgICAgaSAtPSAxO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZvcm1hdDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2gxICAgICAgICAgPSAvXFxkLzsgICAgICAgICAgICAvLyAgICAgICAwIC0gOVxuICAgIHZhciBtYXRjaDIgICAgICAgICA9IC9cXGRcXGQvOyAgICAgICAgICAvLyAgICAgIDAwIC0gOTlcbiAgICB2YXIgbWF0Y2gzICAgICAgICAgPSAvXFxkezN9LzsgICAgICAgICAvLyAgICAgMDAwIC0gOTk5XG4gICAgdmFyIG1hdGNoNCAgICAgICAgID0gL1xcZHs0fS87ICAgICAgICAgLy8gICAgMDAwMCAtIDk5OTlcbiAgICB2YXIgbWF0Y2g2ICAgICAgICAgPSAvWystXT9cXGR7Nn0vOyAgICAvLyAtOTk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMiAgICAgID0gL1xcZFxcZD8vOyAgICAgICAgIC8vICAgICAgIDAgLSA5OVxuICAgIHZhciBtYXRjaDN0bzQgICAgICA9IC9cXGRcXGRcXGRcXGQ/LzsgICAgIC8vICAgICA5OTkgLSA5OTk5XG4gICAgdmFyIG1hdGNoNXRvNiAgICAgID0gL1xcZFxcZFxcZFxcZFxcZFxcZD8vOyAvLyAgIDk5OTk5IC0gOTk5OTk5XG4gICAgdmFyIG1hdGNoMXRvMyAgICAgID0gL1xcZHsxLDN9LzsgICAgICAgLy8gICAgICAgMCAtIDk5OVxuICAgIHZhciBtYXRjaDF0bzQgICAgICA9IC9cXGR7MSw0fS87ICAgICAgIC8vICAgICAgIDAgLSA5OTk5XG4gICAgdmFyIG1hdGNoMXRvNiAgICAgID0gL1srLV0/XFxkezEsNn0vOyAgLy8gLTk5OTk5OSAtIDk5OTk5OVxuXG4gICAgdmFyIG1hdGNoVW5zaWduZWQgID0gL1xcZCsvOyAgICAgICAgICAgLy8gICAgICAgMCAtIGluZlxuICAgIHZhciBtYXRjaFNpZ25lZCAgICA9IC9bKy1dP1xcZCsvOyAgICAgIC8vICAgIC1pbmYgLSBpbmZcblxuICAgIHZhciBtYXRjaE9mZnNldCAgICA9IC9afFsrLV1cXGRcXGQ6P1xcZFxcZC9naTsgLy8gKzAwOjAwIC0wMDowMCArMDAwMCAtMDAwMCBvciBaXG4gICAgdmFyIG1hdGNoU2hvcnRPZmZzZXQgPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy9naTsgLy8gKzAwIC0wMCArMDA6MDAgLTAwOjAwICswMDAwIC0wMDAwIG9yIFpcblxuICAgI
21167HZhciBtYXRjaFRpbWVzdGFtcCA9IC9bKy1dP1xcZCsoXFwuXFxkezEsM30pPy87IC8vIDEyMzQ1Njc4OSAxMjM0NTY3ODkuMTIzXG5cbiAgICAvLyBhbnkgd29yZCAob3IgdHdvKSBjaGFyYWN0ZXJzIG9yIG51bWJlcnMgaW5jbHVkaW5nIHR3by90aHJlZSB3b3JkIG1vbnRoIGluIGFyYWJpYy5cbiAgICAvLyBpbmNsdWRlcyBzY290dGlzaCBnYWVsaWMgdHdvIHdvcmQgYW5kIGh5cGhlbmF0ZWQgbW9udGhzXG4gICAgdmFyIG1hdGNoV29yZCA9IC9bMC05XXswLDI1Nn1bJ2EtelxcdTAwQTAtXFx1MDVGRlxcdTA3MDAtXFx1RDdGRlxcdUY5MDAtXFx1RkRDRlxcdUZERjAtXFx1RkYwN1xcdUZGMTAtXFx1RkZFRl17MSwyNTZ9fFtcXHUwNjAwLVxcdTA2RkZcXC9dezEsMjU2fShcXHMqP1tcXHUwNjAwLVxcdTA2RkZdezEsMjU2fSl7MSwyfS9pO1xuXG4gICAgdmFyIHJlZ2V4ZXMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFJlZ2V4VG9rZW4gKHRva2VuLCByZWdleCwgc3RyaWN0UmVnZXgpIHtcbiAgICAgICAgcmVnZXhlc1t0b2tlbl0gPSBpc0Z1bmN0aW9uKHJlZ2V4KSA/IHJlZ2V4IDogZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGVEYXRhKSB7XG4gICAgICAgICAgICByZXR1cm4gKGlzU3RyaWN0ICYmIHN0cmljdFJlZ2V4KSA/IHN0cmljdFJlZ2V4IDogcmVnZXg7XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0UGFyc2VSZWdleEZvclRva2VuICh0b2tlbiwgY29uZmlnKSB7XG4gICAgICAgIGlmICghaGFzT3duUHJvcChyZWdleGVzLCB0b2tlbikpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUmVnRXhwKHVuZXNjYXBlRm9ybWF0KHRva2VuKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVnZXhlc1t0b2tlbl0oY29uZmlnLl9zdHJpY3QsIGNvbmZpZy5fbG9jYWxlKTtcbiAgICB9XG5cbiAgICAvLyBDb2RlIGZyb20gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8zNTYxNDkzL2lzLXRoZXJlLWEtcmVnZXhwLWVzY2FwZS1mdW5jdGlvbi1pbi1qYXZhc2NyaXB0XG4gICAgZnVuY3Rpb24gdW5lc2NhcGVGb3JtYXQocykge1xuICAgICAgICByZXR1cm4gcmVnZXhFc2NhcGUocy5yZXBsYWNlKCdcXFxcJywgJycpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZywgZnVuY3Rpb24gKG1hdGNoZWQsIHAxLCBwMiwgcDMsIHA0KSB7XG4gICAgICAgICAgICByZXR1cm4gcDEgfHwgcDIgfHwgcDMgfHwgcDQ7XG4gICAgICAgIH0pKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZWdleEVzY2FwZShzKSB7XG4gICAgICAgIHJldHVybiBzLnJlcGxhY2UoL1stXFwvXFxcXF4kKis/LigpfFtcXF17fV0vZywgJ1xcXFwkJicpO1xuICAgIH1cblxuICAgIHZhciB0b2tlbnMgPSB7fTtcblxuICAgIGZ1bmN0aW9uIGFkZFBhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICB2Y
21167XIgaSwgZnVuYyA9IGNhbGxiYWNrO1xuICAgICAgICBpZiAodHlwZW9mIHRva2VuID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdG9rZW4gPSBbdG9rZW5dO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc051bWJlcihjYWxsYmFjaykpIHtcbiAgICAgICAgICAgIGZ1bmMgPSBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgICAgICAgICAgYXJyYXlbY2FsbGJhY2tdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdG9rZW4ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHRva2Vuc1t0b2tlbltpXV0gPSBmdW5jO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkV2Vla1BhcnNlVG9rZW4gKHRva2VuLCBjYWxsYmFjaykge1xuICAgICAgICBhZGRQYXJzZVRva2VuKHRva2VuLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgICAgICBjb25maWcuX3cgPSBjb25maWcuX3cgfHwge307XG4gICAgICAgICAgICBjYWxsYmFjayhpbnB1dCwgY29uZmlnLl93LCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWRkVGltZVRvQXJyYXlGcm9tVG9rZW4odG9rZW4sIGlucHV0LCBjb25maWcpIHtcbiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwgJiYgaGFzT3duUHJvcCh0b2tlbnMsIHRva2VuKSkge1xuICAgICAgICAgICAgdG9rZW5zW3Rva2VuXShpbnB1dCwgY29uZmlnLl9hLCBjb25maWcsIHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBZRUFSID0gMDtcbiAgICB2YXIgTU9OVEggPSAxO1xuICAgIHZhciBEQVRFID0gMjtcbiAgICB2YXIgSE9VUiA9IDM7XG4gICAgdmFyIE1JTlVURSA9IDQ7XG4gICAgdmFyIFNFQ09ORCA9IDU7XG4gICAgdmFyIE1JTExJU0VDT05EID0gNjtcbiAgICB2YXIgV0VFSyA9IDc7XG4gICAgdmFyIFdFRUtEQVkgPSA4O1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1knLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB5ID0gdGhpcy55ZWFyKCk7XG4gICAgICAgIHJldHVybiB5IDw9IDk5OTkgPyAnJyArIHkgOiAnKycgKyB5O1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWScsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnllYXIoKSAlIDEwMDtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnWVlZWScsICAgNF0sICAgICAgIDAsICd5ZWFyJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydZWVlZWScsICA1XSwgICAgICAgMCwgJ3llYXInKTtcbiAgICBhZGRGb3JtYXRUb2tlbigwLCBbJ1lZWVlZWScsIDYsIHRydWVdLCAwLCAneWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd5ZWFyJywgJ3knKTtcblxuICAgIC8vIFBSSU9SSVRJRVNcblxuICAgIGFkZFVuaXRQcmlvcml0eSgneWVhcicsIDEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWScsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdZWVlZJywgICBtYXRjaDF0bzQsIG1hdGNoNCk7XG4gICAgYWRkUmVnZXhUb2tlbignWVlZWVknLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1lZWVlZWScsIG1hdGNoMXRvNiwgbWF0Y2g2KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydZWVlZWScsICdZWVlZWVknXSwgWUVBUik7XG4gICAgYWRkUGFyc2VUb2tlbignWVlZWScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXkpIHtcbiAgICAgICAgYXJyYXlbWUVBUl0gPSBpbnB1dC5sZW5ndGggPT09IDIgPyBob29rcy5wYXJzZVR3b0RpZ2l0WWVhcihpbnB1dCkgOiB0b0ludChpbnB1dCk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignWVknLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1knLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W1lFQVJdID0gcGFyc2VJbnQoaW5wdXQsIDEwKTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIGRheXNJblllYXIoeWVhcikge1xuICAgICAgICByZXR1cm4gaXNMZWFwWWVhcih5ZWFyKSA/IDM2NiA6IDM2NTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICAgICAgcmV0dXJuICh5ZWFyICUgNCA9PT0gMCAmJiB5ZWFyICUgMTAwICE9PSAwKSB8fCB5ZWFyICUgNDAwID09PSAwO1xuICAgIH1cblxuICAgIC8vIEhPT0tTXG5cbiAgICBob29rcy5wYXJzZVR3b0RpZ2l0WWVhciA9IGZ1bmN0aW9uIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gdG9JbnQoaW5wdXQpICsgKHRvSW50KGlucHV0KSA+IDY4ID8gMTkwMCA6IDIwMDApO1xuICAgIH07XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0WWVhciA9IG1ha2VHZXRTZXQoJ0Z1bGxZZWFyJywgdHJ1ZSk7XG5cbiAgICBmdW5jdGlvbiBnZXRJc0xlYXBZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzTGVhcFllYXIodGhpcy55ZWFyKCkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXRTZXQgKHVuaXQsIGtlZXBUaW1lKSB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgc2V0JDEodGhpcywgdW5pdCwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCBrZWVwVGltZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBnZXQodGhpcywgdW5pdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0IChtb20sIHVuaXQpIHtcbiAgICAgICAgcmV0dXJuIG1vbS5pc1ZhbGlkKCkgP1xuICAgICAgICAgICAgbW9tLl9kWydnZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKCkgOiBOYU47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0JDEgKG1vbSwgdW5pdCwgdmFsdWUpIHtcbiAgICAgICAgaWYgKG1vbS5pc1ZhbGlkKCkgJiYgIWlzTmFOKHZhbHVlKSkge1xuICAgICAgICAgICAgaWYgKHVuaXQgPT09ICdGdWxsWWVhcicgJiYgaXNMZWFwWWVhcihtb20ueWVhcigpKSAmJiBtb20ubW9udGgoKSA9PT0gMSAmJi
21167Btb20uZGF0ZSgpID09PSAyOSkge1xuICAgICAgICAgICAgICAgIG1vbS5fZFsnc2V0JyArIChtb20uX2lzVVRDID8gJ1VUQycgOiAnJykgKyB1bml0XSh2YWx1ZSwgbW9tLm1vbnRoKCksIGRheXNJbk1vbnRoKHZhbHVlLCBtb20ubW9udGgoKSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArIHVuaXRdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIHN0cmluZ0dldCAodW5pdHMpIHtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmIChpc0Z1bmN0aW9uKHRoaXNbdW5pdHNdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBzdHJpbmdTZXQgKHVuaXRzLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIHVuaXRzID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgdW5pdHMgPSBub3JtYWxpemVPYmplY3RVbml0cyh1bml0cyk7XG4gICAgICAgICAgICB2YXIgcHJpb3JpdGl6ZWQgPSBnZXRQcmlvcml0aXplZFVuaXRzKHVuaXRzKTtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpb3JpdGl6ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzW3ByaW9yaXRpemVkW2ldLnVuaXRdKHVuaXRzW3ByaW9yaXRpemVkW2ldLnVuaXRdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24odGhpc1t1bml0c10pKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXNbdW5pdHNdKHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtb2QobiwgeCkge1xuICAgICAgICByZXR1cm4gKChuICUgeCkgKyB4KSAlIHg7XG4gICAgfVxuXG4gICAgdmFyIGluZGV4T2Y7XG5cbiAgICBpZiAoQXJyYXkucHJvdG90eXBlLmluZGV4T2YpIHtcbiAgICAgICAgaW5kZXhPZiA9IEFycmF5LnByb3RvdHlwZS5pbmRleE9mO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGluZGV4T2YgPSBmdW5jdGlvbiAobykge1xuICAgICAgICAgICAgLy8gSSBrbm93XG4gICAgICAgICAgICB2Y
21167XIgaTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbaV0gPT09IG8pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgICAgIGlmIChpc05hTih5ZWFyKSB8fCBpc05hTihtb250aCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG1vZE1vbnRoID0gbW9kKG1vbnRoLCAxMik7XG4gICAgICAgIHllYXIgKz0gKG1vbnRoIC0gbW9kTW9udGgpIC8gMTI7XG4gICAgICAgIHJldHVybiBtb2RNb250aCA9PT0gMSA/IChpc0xlYXBZZWFyKHllYXIpID8gMjkgOiAyOCkgOiAoMzEgLSBtb2RNb250aCAlIDcgJSAyKTtcbiAgICB9XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignTScsIFsnTU0nLCAyXSwgJ01vJywgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb250aCgpICsgMTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdNTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ01NTU0nLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbW9udGgnLCAnTScpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnbW9udGgnLCA4KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ00nLCAgICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ01NJywgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NJywgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignTU1NTScsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiBsb2NhbGUubW9udGhzUmVnZXgoaXNTdHJpY3QpO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ00nLCAnTU0nXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNT05USF0gPSB0b0ludChpbnB1dCkgLSAxO1xuICAgIH0pO1xuXG4gICAgYWRkUGFyc2VUb2tlbihbJ01NTScsICdNTU1NJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZywgdG9rZW4pIHtcbiAgICAgICAgdmFyIG1vbnRoID0gY29uZmlnLl9sb2NhbGUubW9udGhzUGFyc2UoaW5wdXQsIHRva2VuLCBjb25maWcuX3N0cmljdCk7XG4gICAgICAgIC8vIGlmIHdlIGRpZG4ndCBmaW5kIGEgbW9udGggbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkLlxuICAgICAgICBpZiAobW9udGggIT0gbnVsbCkge1xuICAgICAgICAgICAgYXJyYXlbTU9OVEhdID0gbW9udGg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkTW9udGggPSBpbnB1dDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgdmFyIE1PTlRIU19JTl9GT1JNQVQgPSAvRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy87XG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNb250aHMgPSAnSmFudWFyeV9GZWJydWFyeV9NYXJjaF9BcHJpbF9NYXlfSnVuZV9KdWx5X0F1Z3VzdF9TZXB0ZW1iZXJfT2N0b2Jlcl9Ob3ZlbWJlcl9EZWNlbWJlcicuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHMgKG0sIGZvcm1hdCkge1xuICAgICAgICBpZiAoIW0pIHtcbiAgICAgICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHMgOlxuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1snc3RhbmRhbG9uZSddO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc0FycmF5KHRoaXMuX21vbnRocykgPyB0aGlzLl9tb250aHNbbS5tb250aCgpXSA6XG4gICAgICAgICAgICB0aGlzLl9tb250aHNbKHRoaXMuX21vbnRocy5pc0Zvcm1hdCB8fCBNT05USFNfSU5fRk9STUFUKS50ZXN0KGZvcm1hdCkgPyAnZm9ybWF0JyA6ICdzdGFuZGFsb25lJ11bbS5tb250aCgpXTtcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZU1vbnRoc1Nob3J0ID0gJ0phbl9GZWJfTWFyX0Fwcl9NYXlfSnVuX0p1bF9BdWdfU2VwX09jdF9Ob3ZfRGVjJy5zcGxpdCgnXycpO1xuICAgIGZ1bmN0aW9uIGxvY2FsZU1vbnRoc1Nob3J0IChtLCBmb3JtYXQpIHtcbiAgICAgICAgaWYgKCFtKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydCA6XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRbJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXNBcnJheSh0aGlzLl9tb250aHNTaG9ydCkgPyB0aGlzLl9tb250aHNTaG9ydFttLm1vbnRoKCldIDpcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0W01PTlRIU19JTl9GT1JNQVQudGVzdChmb3JtYXQpID8gJ2Zvcm1hdCcgOiAnc3RhbmRhbG9uZSddW20ubW9udGgoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2Y
21167XIgaSwgaWksIG1vbSwgbGxjID0gbW9udGhOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fbW9udGhzUGFyc2UpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgbm90IHVzZWRcbiAgICAgICAgICAgIHRoaXMuX21vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3Nob3J0TW9udGhzUGFyc2UgPSBbXTtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMjsgKytpKSB7XG4gICAgICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2hvcnRNb250aHNQYXJzZVtpXSA9IHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0gPSB0aGlzLm1vbnRocyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ01NTScpIHtcbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9sb25nTW9udGhzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9zaG9ydE1vbnRoc1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbGVNb250aHNQYXJzZSAobW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCkge1xuICAgICAgICB2Y
21167XIgaSwgbW9tLCByZWdleDtcblxuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZVN0cmljdFBhcnNlLmNhbGwodGhpcywgbW9udGhOYW1lLCBmb3JtYXQsIHN0cmljdCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuX21vbnRoc1BhcnNlKSB7XG4gICAgICAgICAgICB0aGlzLl9tb250aHNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbG9uZ01vbnRoc1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlID0gW107XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiBhZGQgc29ydGluZ1xuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyXG4gICAgICAgIC8vIHNlZSBzb3J0aW5nIGluIGNvbXB1dGVNb250aHNQYXJzZVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG4gICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIGldKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvbmdNb250aHNQYXJzZVtpXSA9IG5ldyBSZWdFeHAoJ14nICsgdGhpcy5tb250aHMobW9tLCAnJykucmVwbGFjZSgnLicsICcnKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW2ldID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpLnJlcGxhY2UoJy4nLCAnJykgKyAnJCcsICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXN0cmljdCAmJiAhdGhpcy5fbW9udGhzUGFyc2VbaV0pIHtcbiAgICAgICAgICAgICAgICByZWdleCA9ICdeJyArIHRoaXMubW9udGhzKG1vbSwgJycpICsgJ3xeJyArIHRoaXMubW9udGhzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKHJlZ2V4LnJlcGxhY2UoJy4nLCAnJyksICdpJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyB0ZXN0IHRoZSByZWdleFxuICAgICAgICAgICAgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU1NJyAmJiB0aGlzLl9sb25nTW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdNTU0nICYmIHRoaXMuX3Nob3J0TW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJpY3QgJiYgdGhpcy5fbW9udGhzUGFyc2VbaV0udGVzdChtb250aE5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBzZXRNb250aCAobW9tLCB2YWx1ZSkge1xuICAgICAgICB2Y
21167XIgZGF5T2ZNb250aDtcblxuICAgICAgICBpZiAoIW1vbS5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIC8vIE5vIG9wXG4gICAgICAgICAgICByZXR1cm4gbW9tO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmICgvXlxcZCskLy50ZXN0KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHZhbHVlID0gdG9JbnQodmFsdWUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IG1vbS5sb2NhbGVEYXRhKCkubW9udGhzUGFyc2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IEFub3RoZXIgc2lsZW50IGZhaWx1cmU/XG4gICAgICAgICAgICAgICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkYXlPZk1vbnRoID0gTWF0aC5taW4obW9tLmRhdGUoKSwgZGF5c0luTW9udGgobW9tLnllYXIoKSwgdmFsdWUpKTtcbiAgICAgICAgbW9tLl9kWydzZXQnICsgKG1vbS5faXNVVEMgPyAnVVRDJyA6ICcnKSArICdNb250aCddKHZhbHVlLCBkYXlPZk1vbnRoKTtcbiAgICAgICAgcmV0dXJuIG1vbTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRNb250aCAodmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHNldE1vbnRoKHRoaXMsIHZhbHVlKTtcbiAgICAgICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGdldCh0aGlzLCAnTW9udGgnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoICgpIHtcbiAgICAgICAgcmV0dXJuIGRheXNJbk1vbnRoKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TW9udGhzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNTaG9ydFJlZ2V4IChpc1N0cmljdCkge1xuICAgICAgICBpZiAodGhpcy5fbW9udGhzUGFyc2VFeGFjdCkge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVNb250aHNQYXJzZS5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzU3RyaWN0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXg7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzU2hvcnRSZWdleCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRSZWdleCA9IGRlZmF1bHRNb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggJiYgaXNTdHJpY3QgP1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXggOiB0aGlzLl9tb250aHNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRNb250aHNSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiBtb250aHNSZWdleCAoaXNTdHJpY3QpIHtcbiAgICAgICAgaWYgKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX21vbnRoc1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICBjb21wdXRlTW9udGhzUGFyc2UuY2FsbCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc1N0cmljdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb250aHNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfbW9udGhzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX21vbnRoc1JlZ2V4ID0gZGVmYXVsdE1vbnRoc1JlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21vbnRoc1N0cmljdFJlZ2V4ICYmIGlzU3RyaWN0ID9cbiAgICAgICAgICAgICAgICB0aGlzLl9tb250aHNTdHJpY3RSZWdleCA6IHRoaXMuX21vbnRoc1JlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY29tcHV0ZU1vbnRoc1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHNob3J0UGllY2VzID0gW10sIGxvbmdQaWVjZXMgPSBbXSwgbWl4ZWRQaWVjZXMgPSBbXSxcbiAgICAgICAgICAgIGksIG1vbTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCBpXSk7XG4gICAgICAgICAgICBzaG9ydFBpZWNlcy5wdXNoKHRoaXMubW9udGhzU2hvcnQobW9tLCAnJykpO1xuICAgICAgICAgICAgbG9uZ1BpZWNlcy5wdXNoKHRoaXMubW9udGhzKG1vbSwgJycpKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzLnB1c2godGhpcy5tb250aHMobW9tLCAnJykpO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaCh0aGlzLm1vbnRoc1Nob3J0KG1vbSwgJycpKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTb3J0aW5nIG1ha2VzIHN1cmUgaWYgb25lIG1vbnRoIChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTI7IGkrKykge1xuICAgICAgICAgICAgc2hvcnRQaWVjZXNbaV0gPSByZWdleEVzY2FwZShzaG9ydFBpZWNlc1tpXSk7XG4gICAgICAgICAgICBsb25nUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobG9uZ1BpZWNlc1tpXSk7XG4gICAgICAgI
21167H1cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDI0OyBpKyspIHtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbW9udGhzUmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaXhlZFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX21vbnRoc1Nob3J0UmVnZXggPSB0aGlzLl9tb250aHNSZWdleDtcbiAgICAgICAgdGhpcy5fbW9udGhzU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBsb25nUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIHNob3J0UGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVEYXRlICh5LCBtLCBkLCBoLCBNLCBzLCBtcykge1xuICAgICAgICAvLyBjYW4ndCBqdXN0IGFwcGx5KCkgdG8gY3JlYXRlIGEgZGF0ZTpcbiAgICAgICAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzE4MTM0OFxuICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkLCBoLCBNLCBzLCBtcyk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoeSwgbSwgZCwgaCwgTSwgcywgbXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlVVRDRGF0ZSAoeSkge1xuICAgICAgICB2Y
21167XIgZGF0ZTtcbiAgICAgICAgLy8gdGhlIERhdGUuVVRDIGZ1bmN0aW9uIHJlbWFwcyB5ZWFycyAwLTk5IHRvIDE5MDAtMTk5OVxuICAgICAgICBpZiAoeSA8IDEwMCAmJiB5ID49IDApIHtcbiAgICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTtcbiAgICAgICAgICAgIC8vIHByZXNlcnZlIGxlYXAgeWVhcnMgdXNpbmcgYSBmdWxsIDQwMCB5ZWFyIGN5Y2xlLCB0aGVuIHJlc2V0XG4gICAgICAgICAgICBhcmdzWzBdID0geSArIDQwMDtcbiAgICAgICAgICAgIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLCBhcmdzKSk7XG4gICAgICAgICAgICBpZiAoaXNGaW5pdGUoZGF0ZS5nZXRVVENGdWxsWWVhcigpKSkge1xuICAgICAgICAgICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoeSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoRGF0ZS5VVEMuYXBwbHkobnVsbCwgYXJndW1lbnRzKSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICB9XG5cbiAgICAvLyBzdGFydC1vZi1maXJzdC13ZWVrIC0gc3RhcnQtb2YteWVhclxuICAgIGZ1bmN0aW9uIGZpcnN0V2Vla09mZnNldCh5ZWFyLCBkb3csIGRveSkge1xuICAgICAgICB2YXIgLy8gZmlyc3Qtd2VlayBkYXkgLS0gd2hpY2ggamFudWFyeSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IHdlZWsgKDQgZm9yIGlzbywgMSBmb3Igb3RoZXIpXG4gICAgICAgICAgICBmd2QgPSA3ICsgZG93IC0gZG95LFxuICAgICAgICAgICAgLy8gZmlyc3Qtd2VlayBkYXkgbG9jYWwgd2Vla2RheSAtLSB3aGljaCBsb2NhbCB3ZWVrZGF5IGlzIGZ3ZFxuICAgICAgICAgICAgZndkbHcgPSAoNyArIGNyZWF0ZVVUQ0RhdGUoeWVhciwgMCwgZndkKS5nZXRVVENEYXkoKSAtIGRvdykgJSA3O1xuXG4gICAgICAgIHJldHVybiAtZndkbHcgKyBmd2QgLSAxO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT193ZWVrX2RhdGUjQ2FsY3VsYXRpbmdfYV9kYXRlX2dpdmVuX3RoZV95ZWFyLjJDX3dlZWtfbnVtYmVyX2FuZF93ZWVrZGF5XG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtzKHllYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95KSB7XG4gICAgICAgIHZhciBsb2NhbFdlZWtkYXkgPSAoNyArIHdlZWtkYXkgLSBkb3cpICUgNyxcbiAgICAgICAgICAgIHdlZWtPZmZzZXQgPSBmaXJzdFdlZWtPZmZzZXQoeWVhciwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF5T2ZZZWFyID0gMSArIDcgKiAod2VlayAtIDEpICsgbG9jYWxXZWVrZGF5ICsgd2Vla09mZnNldCxcbiAgICAgICAgICAgIHJlc1llYXIsIHJlc0RheU9mWWVhcjtcblxuICAgICAgICBpZiAoZGF5T2ZZZWFyIDw9IDApIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyIC0gMTtcbiAgICAgICAgICAgIHJlc0RheU9mWWVhciA9IGRheXNJblllYXIocmVzWWVhcikgKyBkYXlPZlllYXI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyKSkge1xuICAgICAgICAgICAgcmVzWWVhciA9IHllYXIgKyAxO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyIC0gZGF5c0luWWVhcih5ZWFyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSB5ZWFyO1xuICAgICAgICAgICAgcmVzRGF5T2ZZZWFyID0gZGF5T2ZZZWFyO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHllYXI6IHJlc1llYXIsXG4gICAgICAgICAgICBkYXlPZlllYXI6IHJlc0RheU9mWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtPZlllYXIobW9tLCBkb3csIGRveSkge1xuICAgICAgICB2Y
21167XIgd2Vla09mZnNldCA9IGZpcnN0V2Vla09mZnNldChtb20ueWVhcigpLCBkb3csIGRveSksXG4gICAgICAgICAgICB3ZWVrID0gTWF0aC5mbG9vcigobW9tLmRheU9mWWVhcigpIC0gd2Vla09mZnNldCAtIDEpIC8gNykgKyAxLFxuICAgICAgICAgICAgcmVzV2VlaywgcmVzWWVhcjtcblxuICAgICAgICBpZiAod2VlayA8IDEpIHtcbiAgICAgICAgICAgIHJlc1llYXIgPSBtb20ueWVhcigpIC0gMTtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrICsgd2Vla3NJblllYXIocmVzWWVhciwgZG93LCBkb3kpO1xuICAgICAgICB9IGVsc2UgaWYgKHdlZWsgPiB3ZWVrc0luWWVhcihtb20ueWVhcigpLCBkb3csIGRveSkpIHtcbiAgICAgICAgICAgIHJlc1dlZWsgPSB3ZWVrIC0gd2Vla3NJblllYXIobW9tLnllYXIoKSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCkgKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzWWVhciA9IG1vbS55ZWFyKCk7XG4gICAgICAgICAgICByZXNXZWVrID0gd2VlaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3ZWVrOiByZXNXZWVrLFxuICAgICAgICAgICAgeWVhcjogcmVzWWVhclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHdlZWtzSW5ZZWFyKHllYXIsIGRvdywgZG95KSB7XG4gICAgICAgIHZhciB3ZWVrT2Zmc2V0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIsIGRvdywgZG95KSxcbiAgICAgICAgICAgIHdlZWtPZmZzZXROZXh0ID0gZmlyc3RXZWVrT2Zmc2V0KHllYXIgKyAxLCBkb3csIGRveSk7XG4gICAgICAgIHJldHVybiAoZGF5c0luWWVhcih5ZWFyKSAtIHdlZWtPZmZzZXQgKyB3ZWVrT2Zmc2V0TmV4dCkgLyA3O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd3JywgWyd3dycsIDJdLCAnd28nLCAnd2VlaycpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdXJywgWydXVycsIDJdLCAnV28nLCAnaXNvV2VlaycpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrJywgJ3cnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWsnLCAnVycpO1xuXG4gICAgLy8gUFJJT1JJVElFU1xuXG4gICAgYWRkVW5pdFByaW9yaXR5KCd3ZWVrJywgNSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrJywgNSk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCd3JywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignd3cnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignVycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1dXJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWyd3JywgJ3d3JywgJ1cnLCAnV1cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDEpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIC8vIExPQ0FMRVNcblxuICAgIGZ1bmN0aW9uIGxvY2FsZVdlZWsgKG1vbSkge1xuICAgICAgICByZXR1cm4gd2Vla09mWWVhcihtb20sIHRoaXMuX3dlZWsuZG93LCB0aGlzLl93ZWVrLmRveSkud2VlaztcbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdExvY2FsZVdlZWsgPSB7XG4gICAgICAgIGRvdyA6IDAsIC8vIFN1bmRheSBpcyB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrLlxuICAgICAgICBkb3kgOiA2ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA2dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZXZWVrICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxvY2FsZUZpcnN0RGF5T2ZZZWFyICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWsuZG95O1xuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gdGhpcy5sb2NhbGVEYXRhKCkud2Vlayh0aGlzKTtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09IG51bGwgPyB3ZWVrIDogdGhpcy5hZGQoKGlucHV0IC0gd2VlaykgKiA3LCAnZCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldElTT1dlZWsgKGlucHV0KSB7XG4gICAgICAgIHZhciB3ZWVrID0gd2Vla09mWWVhcih0aGlzLCAxLCA0KS53ZWVrO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWsgOiB0aGlzLmFkZCgoaW5wdXQgLSB3ZWVrKSAqIDcsICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2QnLCAwLCAnZG8nLCAnZGF5Jyk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignZGQnLCAwLCAwLCBmdW5jdGlvbiAoZm9ybWF0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c01pbih0aGlzLCBmb3JtYXQpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2RkZCcsIDAsIDAsIGZ1bmN0aW9uIChmb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzU2hvcnQodGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdkZGRkJywgMCwgMCwgZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcywgZm9ybWF0KTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdlJywgMCwgMCwgJ3dlZWtkYXknKTtcbiAgICBhZGRGb3JtYXRUb2tlbignRScsIDAsIDAsICdpc29XZWVrZGF5Jyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RheScsICdkJyk7XG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrZGF5JywgJ2UnKTtcbiAgICBhZGRVbml0QWxpYXMoJ2lzb1dlZWtkYXknLCAnRScpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RheScsIDExKTtcbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtkYXknLCAxMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrZGF5JywgMTEpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignZCcsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignRScsICAgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignZGQnLCAgIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgI
21167HJldHVybiBsb2NhbGUud2Vla2RheXNNaW5SZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkJywgICBmdW5jdGlvbiAoaXNTdHJpY3QsIGxvY2FsZSkge1xuICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzU2hvcnRSZWdleChpc1N0cmljdCk7XG4gICAgfSk7XG4gICAgYWRkUmVnZXhUb2tlbignZGRkZCcsICAgZnVuY3Rpb24gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS53ZWVrZGF5c1JlZ2V4KGlzU3RyaWN0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZGQnLCAnZGRkJywgJ2RkZGQnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHZhciB3ZWVrZGF5ID0gY29uZmlnLl9sb2NhbGUud2Vla2RheXNQYXJzZShpbnB1dCwgdG9rZW4sIGNvbmZpZy5fc3RyaWN0KTtcbiAgICAgICAgLy8gaWYgd2UgZGlkbid0IGdldCBhIHdlZWtkYXkgbmFtZSwgbWFyayB0aGUgZGF0ZSBhcyBpbnZhbGlkXG4gICAgICAgIGlmICh3ZWVrZGF5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHdlZWsuZCA9IHdlZWtkYXk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5pbnZhbGlkV2Vla2RheSA9IGlucHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBhZGRXZWVrUGFyc2VUb2tlbihbJ2QnLCAnZScsICdFJ10sIGZ1bmN0aW9uIChpbnB1dCwgd2VlaywgY29uZmlnLCB0b2tlbikge1xuICAgICAgICB3ZWVrW3Rva2VuXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIC8vIEhFTFBFUlNcblxuICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzTmFOKGlucHV0KSkge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnNlSW50KGlucHV0LCAxMCk7XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dCA9IGxvY2FsZS53ZWVrZGF5c1BhcnNlKGlucHV0KTtcbiAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvV2Vla2RheShpbnB1dCwgbG9jYWxlKSB7XG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlLndlZWtkYXlzUGFyc2UoaW5wdXQpICUgNyB8fCA3O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpc05hTihpbnB1dCkgPyBudWxsIDogaW5wdXQ7XG4gICAgfVxuXG4gICAgLy8gTE9DQUxFU1xuICAgIGZ1bmN0aW9uIHNoaWZ0V2Vla2RheXMgKHdzLCBuKSB7XG4gICAgICAgIHJldHVybiB3cy5zbGljZShuLCA3KS5jb25jYXQod3Muc2xpY2UoMCwgbikpO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXMgPSAnU3VuZGF5X01vbmRheV9UdWVzZGF5X1dlZG5lc2RheV9UaHVyc2RheV9GcmlkYXlfU2F0dXJkYXknLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXMgKG0sIGZvcm1hdCkge1xuICAgICAgICB2Y
21167XIgd2Vla2RheXMgPSBpc0FycmF5KHRoaXMuX3dlZWtkYXlzKSA/IHRoaXMuX3dlZWtkYXlzIDpcbiAgICAgICAgICAgIHRoaXMuX3dlZWtkYXlzWyhtICYmIG0gIT09IHRydWUgJiYgdGhpcy5fd2Vla2RheXMuaXNGb3JtYXQudGVzdChmb3JtYXQpKSA/ICdmb3JtYXQnIDogJ3N0YW5kYWxvbmUnXTtcbiAgICAgICAgcmV0dXJuIChtID09PSB0cnVlKSA/IHNoaWZ0V2Vla2RheXMod2Vla2RheXMsIHRoaXMuX3dlZWsuZG93KVxuICAgICAgICAgICAgOiAobSkgPyB3ZWVrZGF5c1ttLmRheSgpXSA6IHdlZWtkYXlzO1xuICAgIH1cblxuICAgIHZhciBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCA9ICdTdW5fTW9uX1R1ZV9XZWRfVGh1X0ZyaV9TYXQnLnNwbGl0KCdfJyk7XG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNTaG9ydCAobSkge1xuICAgICAgICByZXR1cm4gKG0gPT09IHRydWUpID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c1Nob3J0LCB0aGlzLl93ZWVrLmRvdylcbiAgICAgICAgICAgIDogKG0pID8gdGhpcy5fd2Vla2RheXNTaG9ydFttLmRheSgpXSA6IHRoaXMuX3dlZWtkYXlzU2hvcnQ7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVXZWVrZGF5c01pbiA9ICdTdV9Nb19UdV9XZV9UaF9Gcl9TYScuc3BsaXQoJ18nKTtcbiAgICBmdW5jdGlvbiBsb2NhbGVXZWVrZGF5c01pbiAobSkge1xuICAgICAgICByZXR1cm4gKG0gPT09IHRydWUpID8gc2hpZnRXZWVrZGF5cyh0aGlzLl93ZWVrZGF5c01pbiwgdGhpcy5fd2Vlay5kb3cpXG4gICAgICAgICAgICA6IChtKSA/IHRoaXMuX3dlZWtkYXlzTWluW20uZGF5KCldIDogdGhpcy5fd2Vla2RheXNNaW47XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaGFuZGxlU3RyaWN0UGFyc2UkMSh3ZWVrZGF5TmFtZSwgZm9ybWF0LCBzdHJpY3QpIHtcbiAgICAgICAgdmFyIGksIGlpLCBtb20sIGxsYyA9IHdlZWtkYXlOYW1lLnRvTG9jYWxlTG93ZXJDYXNlKCk7XG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9taW5XZWVrZGF5c1BhcnNlID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyArK2kpIHtcbiAgICAgICAgICAgICAgICBtb20gPSBjcmVhdGVVVEMoWzIwMDAsIDFdKS5kYXkoaSk7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXSA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykudG9Mb2NhbGVMb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gdGhpcy53ZWVrZGF5cyhtb20sICcnKS50b0xvY2FsZUxvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0cmljdCkge1xuICAgICAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2RkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGlpICE9PSAtMSA/IGlpIDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChmb3JtYXQgPT09ICdkZGRkJykge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICBpZiAoaWkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpaTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdkZGQnKSB7XG4gICAgICAgICAgICAgICAgaWkgPSBpbmRleE9mLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIGlmIChpaSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpaSA9IGluZGV4T2YuY2FsbCh0aGlzLl9taW5XZWVrZGF5c1BhcnNlLCBsbGMpO1xuICAgICAgICAgICAgICAgIHJldHVybiBpaSAhPT0gLTEgPyBpaSA6IG51bGw7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UsIGxsYyk7XG4gICAgICAgICAgICAgICAgaWYgKGlpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlpID0gaW5kZXhPZi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSwgbGxjKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gaWkgIT09IC0xID8gaWkgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbG9jYWxlV2Vla2RheXNQYXJzZSAod2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KSB7XG4gICAgICAgI
21167HZhciBpLCBtb20sIHJlZ2V4O1xuXG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVTdHJpY3RQYXJzZSQxLmNhbGwodGhpcywgd2Vla2RheU5hbWUsIGZvcm1hdCwgc3RyaWN0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZSkge1xuICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fbWluV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlID0gW107XG4gICAgICAgICAgICB0aGlzLl9mdWxsV2Vla2RheXNQYXJzZSA9IFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgLy8gbWFrZSB0aGUgcmVnZXggaWYgd2UgZG9uJ3QgaGF2ZSBpdCBhbHJlYWR5XG5cbiAgICAgICAgICAgIG1vbSA9IGNyZWF0ZVVUQyhbMjAwMCwgMV0pLmRheShpKTtcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgIXRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlW2ldKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXMobW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNTaG9ydChtb20sICcnKS5yZXBsYWNlKCcuJywgJ1xcXFwuPycpICsgJyQnLCAnaScpO1xuICAgICAgICAgICAgICAgIHRoaXMuX21pbldlZWtkYXlzUGFyc2VbaV0gPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMud2Vla2RheXNNaW4obW9tLCAnJykucmVwbGFjZSgnLicsICdcXFxcLj8nKSArICckJywgJ2knKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5fd2Vla2RheXNQYXJzZVtpXSkge1xuICAgICAgICAgICAgICAgIHJlZ2V4ID0gJ14nICsgdGhpcy53ZWVrZGF5cyhtb20sICcnKSArICd8XicgKyB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJykgKyAnfF4nICsgdGhpcy53ZWVrZGF5c01pbihtb20sICcnKTtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1BhcnNlW2ldID0gbmV3IFJlZ0V4cChyZWdleC5yZXBsYWNlKCcuJywgJycpLCAnaScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gdGVzdCB0aGUgcmVnZXhcbiAgICAgICAgICAgIGlmIChzdHJpY3QgJiYgZm9ybWF0ID09PSAnZGRkZCcgJiYgdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyaWN0ICYmIGZvcm1hdCA9PT0gJ2RkZCcgJiYgdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW2ldLnRlc3Qod2Vla2RheU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmljdCAmJiBmb3JtYXQgPT09ICdkZCcgJiYgdGhpcy5fbWluV2Vla2RheXNQYXJzZVtpXS50ZXN0KHdlZWtkYXlOYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyaWN0ICYmIHRoaXMuX3dlZWtkYXlzUGFyc2VbaV0udGVzdCh3ZWVrZGF5TmFtZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE1PTUVOVFNcblxuICAgIGZ1bmN0aW9uIGdldFNldERheU9mV2VlayAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGwgPyB0aGlzIDogTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXkgPSB0aGlzLl9pc1VUQyA/IHRoaXMuX2QuZ2V0VVRDRGF5KCkgOiB0aGlzLl9kLmdldERheSgpO1xuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaW5wdXQgPSBwYXJzZVdlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZChpbnB1dCAtIGRheSwgJ2QnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBkYXk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRTZXRMb2NhbGVEYXlPZldlZWsgKGlucHV0KSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICB2Y
21167XIgd2Vla2RheSA9ICh0aGlzLmRheSgpICsgNyAtIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdykgJSA3O1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IHdlZWtkYXkgOiB0aGlzLmFkZChpbnB1dCAtIHdlZWtkYXksICdkJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPRGF5T2ZXZWVrIChpbnB1dCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5wdXQgIT0gbnVsbCA/IHRoaXMgOiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBiZWhhdmVzIHRoZSBzYW1lIGFzIG1vbWVudCNkYXkgZXhjZXB0XG4gICAgICAgIC8vIGFzIGEgZ2V0dGVyLCByZXR1cm5zIDcgaW5zdGVhZCBvZiAwICgxLTcgcmFuZ2UgaW5zdGVhZCBvZiAwLTYpXG4gICAgICAgIC8vIGFzIGEgc2V0dGVyLCBzdW5kYXkgc2hvdWxkIGJlbG9uZyB0byB0aGUgcHJldmlvdXMgd2Vlay5cblxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgdmFyIHdlZWtkYXkgPSBwYXJzZUlzb1dlZWtkYXkoaW5wdXQsIHRoaXMubG9jYWxlRGF0YSgpKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmRheSh0aGlzLmRheSgpICUgNyA/IHdlZWtkYXkgOiB3ZWVrZGF5IC0gNyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5kYXkoKSB8fCA3O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c1JlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c1JlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1JlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgZGVmYXVsdFdlZWtkYXlzU2hvcnRSZWdleCA9IG1hdGNoV29yZDtcbiAgICBmdW5jdGlvbiB3ZWVrZGF5c1Nob3J0UmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wKHRoaXMsICdfd2Vla2RheXNTaG9ydFJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXggPSBkZWZhdWx0V2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4IDogdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRXZWVrZGF5c01pblJlZ2V4ID0gbWF0Y2hXb3JkO1xuICAgIGZ1bmN0aW9uIHdlZWtkYXlzTWluUmVnZXggKGlzU3RyaWN0KSB7XG4gICAgICAgIGlmICh0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpIHtcbiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcCh0aGlzLCAnX3dlZWtkYXlzUmVnZXgnKSkge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVXZWVrZGF5c1BhcnNlLmNhbGwodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNTdHJpY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoIWhhc093blByb3AodGhpcywgJ193ZWVrZGF5c01pblJlZ2V4JykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93ZWVrZGF5c01pblJlZ2V4ID0gZGVmYXVsdFdlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCAmJiBpc1N0cmljdCA/XG4gICAgICAgICAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCA6IHRoaXMuX3dlZWtkYXlzTWluUmVnZXg7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIGZ1bmN0aW9uIGNvbXB1dGVXZWVrZGF5c1BhcnNlICgpIHtcbiAgICAgICAgZnVuY3Rpb24gY21wTGVuUmV2KGEsIGIpIHtcbiAgICAgICAgICAgIHJldHVybiBiLmxlbmd0aCAtIGEubGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG1pblBpZWNlcyA9IFtdLCBzaG9ydFBpZWNlcyA9IFtdLCBsb25nUGllY2VzID0gW10sIG1peGVkUGllY2VzID0gW10sXG4gICAgICAgICAgICBpLCBtb20sIG1pbnAsIHNob3J0cCwgbG9uZ3A7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHtcbiAgICAgICAgICAgIC8vIG1ha2UgdGhlIHJlZ2V4IGlmIHdlIGRvbid0IGhhdmUgaXQgYWxyZWFkeVxuICAgICAgICAgICAgbW9tID0gY3JlYXRlVVRDKFsyMDAwLCAxXSkuZGF5KGkpO1xuICAgICAgICAgICAgbWlucCA9IHRoaXMud2Vla2RheXNNaW4obW9tLCAnJyk7XG4gICAgICAgICAgICBzaG9ydHAgPSB0aGlzLndlZWtkYXlzU2hvcnQobW9tLCAnJyk7XG4gICAgICAgICAgICBsb25ncCA9IHRoaXMud2Vla2RheXMobW9tLCAnJyk7XG4gICAgICAgICAgICBtaW5QaWVjZXMucHVzaChtaW5wKTtcbiAgICAgICAgICAgI
21167HNob3J0UGllY2VzLnB1c2goc2hvcnRwKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgICAgICBtaXhlZFBpZWNlcy5wdXNoKG1pbnApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChzaG9ydHApO1xuICAgICAgICAgICAgbWl4ZWRQaWVjZXMucHVzaChsb25ncCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU29ydGluZyBtYWtlcyBzdXJlIGlmIG9uZSB3ZWVrZGF5IChvciBhYmJyKSBpcyBhIHByZWZpeCBvZiBhbm90aGVyIGl0XG4gICAgICAgIC8vIHdpbGwgbWF0Y2ggdGhlIGxvbmdlciBwaWVjZS5cbiAgICAgICAgbWluUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgc2hvcnRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBsb25nUGllY2VzLnNvcnQoY21wTGVuUmV2KTtcbiAgICAgICAgbWl4ZWRQaWVjZXMuc29ydChjbXBMZW5SZXYpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7XG4gICAgICAgICAgICBzaG9ydFBpZWNlc1tpXSA9IHJlZ2V4RXNjYXBlKHNob3J0UGllY2VzW2ldKTtcbiAgICAgICAgICAgIGxvbmdQaWVjZXNbaV0gPSByZWdleEVzY2FwZShsb25nUGllY2VzW2ldKTtcbiAgICAgICAgICAgIG1peGVkUGllY2VzW2ldID0gcmVnZXhFc2NhcGUobWl4ZWRQaWVjZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIG1peGVkUGllY2VzLmpvaW4oJ3wnKSArICcpJywgJ2knKTtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4ID0gdGhpcy5fd2Vla2RheXNSZWdleDtcbiAgICAgICAgdGhpcy5fd2Vla2RheXNNaW5SZWdleCA9IHRoaXMuX3dlZWtkYXlzUmVnZXg7XG5cbiAgICAgICAgdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCA9IG5ldyBSZWdFeHAoJ14oJyArIGxvbmdQaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgICAgICB0aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBzaG9ydFBpZWNlcy5qb2luKCd8JykgKyAnKScsICdpJyk7XG4gICAgICAgIHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXggPSBuZXcgUmVnRXhwKCdeKCcgKyBtaW5QaWVjZXMuam9pbignfCcpICsgJyknLCAnaScpO1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIGhGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhvdXJzKCkgJSAxMiB8fCAxMjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBrRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5ob3VycygpIHx8IDI0O1xuICAgIH1cblxuICAgIGFkZEZvcm1hdFRva2VuKCdIJywgWydISCcsIDJdLCAwLCAnaG91cicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCdoJywgWydoaCcsIDJdLCAwLCBoRm9ybWF0KTtcbiAgICBhZGRGb3JtYXRUb2tlbignaycsIFsna2snLCAyXSwgMCwga0Zvcm1hdCk7XG5cbiAgICBhZGRGb3JtYXRUb2tlbignaG1tJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ2htbXNzJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gJycgKyBoRm9ybWF0LmFwcGx5KHRoaXMpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW0nLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiAnJyArIHRoaXMuaG91cnMoKSArIHplcm9GaWxsKHRoaXMubWludXRlcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKCdIbW1zcycsIDAsIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuICcnICsgdGhpcy5ob3VycygpICsgemVyb0ZpbGwodGhpcy5taW51dGVzKCksIDIpICtcbiAgICAgICAgICAgIHplcm9GaWxsKHRoaXMuc2Vjb25kcygpLCAyKTtcbiAgICB9KTtcblxuICAgIGZ1bmN0aW9uIG1lcmlkaWVtICh0b2tlbiwgbG93ZXJjYXNlKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKHRva2VuLCAwLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkubWVyaWRpZW0odGhpcy5ob3VycygpLCB0aGlzLm1pbnV0ZXMoKSwgbG93ZXJjYXNlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVyaWRpZW0oJ2EnLCB0cnVlKTtcbiAgICBtZXJpZGllbSgnQScsIGZhbHNlKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnaG91cicsICdoJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnaG91cicsIDEzKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGZ1bmN0aW9uIG1hdGNoTWVyaWRpZW0gKGlzU3RyaWN0LCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5fbWVyaWRpZW1QYXJzZTtcbiAgICB9XG5cbiAgICBhZGRSZWdleFRva2VuKCdhJywgIG1hdGNoTWVyaWRpZW0pO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0EnLCAgbWF0Y2hNZXJpZGllbSk7XG4gICAgYWRkUmVnZXhUb2tlbignSCcsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2gnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdrJywgIG1hdGNoMXRvMik7XG4gICAgYWRkUmVnZXhUb2tlbignSEgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignaGgnLCBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbigna2snLCBtYXRjaDF0bzIsIG1hdGNoMik7XG5cbiAgICBhZGRSZWdleFRva2VuKCdobW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2htbXNzJywgbWF0Y2g1dG82KTtcbiAgICBhZGRSZWdleFRva2VuKCdIbW0nLCBtYXRjaDN0bzQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0htbXNzJywgbWF0Y2g1dG82KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydIJywgJ0hIJ10sIEhPVVIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydrJywgJ2trJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2Y
21167XIga0lucHV0ID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBhcnJheVtIT1VSXSA9IGtJbnB1dCA9PT0gMjQgPyAwIDoga0lucHV0O1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oWydhJywgJ0EnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5faXNQbSA9IGNvbmZpZy5fbG9jYWxlLmlzUE0oaW5wdXQpO1xuICAgICAgICBjb25maWcuX21lcmlkaWVtID0gaW5wdXQ7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbihbJ2gnLCAnaGgnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW0nLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvcyA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvcykpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvcykpO1xuICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5iaWdIb3VyID0gdHJ1ZTtcbiAgICB9KTtcbiAgICBhZGRQYXJzZVRva2VuKCdobW1zcycsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2YXIgcG9zMSA9IGlucHV0Lmxlbmd0aCAtIDQ7XG4gICAgICAgIHZhciBwb3MyID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zMSkpO1xuICAgICAgICBhcnJheVtNSU5VVEVdID0gdG9JbnQoaW5wdXQuc3Vic3RyKHBvczEsIDIpKTtcbiAgICAgICAgYXJyYXlbU0VDT05EXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MyKSk7XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmJpZ0hvdXIgPSB0cnVlO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0htbScsIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgcG9zID0gaW5wdXQubGVuZ3RoIC0gMjtcbiAgICAgICAgYXJyYXlbSE9VUl0gPSB0b0ludChpbnB1dC5zdWJzdHIoMCwgcG9zKSk7XG4gICAgICAgIGFycmF5W01JTlVURV0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zKSk7XG4gICAgfSk7XG4gICAgYWRkUGFyc2VUb2tlbignSG1tc3MnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgdmFyIHBvczEgPSBpbnB1dC5sZW5ndGggLSA0O1xuICAgICAgICB2YXIgcG9zMiA9IGlucHV0Lmxlbmd0aCAtIDI7XG4gICAgICAgIGFycmF5W0hPVVJdID0gdG9JbnQoaW5wdXQuc3Vic3RyKDAsIHBvczEpKTtcbiAgICAgICAgYXJyYXlbTUlOVVRFXSA9IHRvSW50KGlucHV0LnN1YnN0cihwb3MxLCAyKSk7XG4gICAgICAgIGFycmF5W1NFQ09ORF0gPSB0b0ludChpbnB1dC5zdWJzdHIocG9zMikpO1xuICAgIH0pO1xuXG4gICAgLy8gTE9DQUxFU1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlSXNQTSAoaW5wdXQpIHtcbiAgICAgICAgLy8gSUU4IFF1aXJrcyBNb2RlICYgSUU3IFN0YW5kYXJkcyBNb2RlIGRvIG5vdCBhbGxvdyBhY2Nlc3Npbmcgc3RyaW5ncyBsaWtlIGFycmF5c1xuICAgICAgICAvLyBVc2luZyBjaGFyQXQgc2hvdWxkIGJlIG1vcmUgY29tcGF0aWJsZS5cbiAgICAgICAgcmV0dXJuICgoaW5wdXQgKyAnJykudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCkgPT09ICdwJyk7XG4gICAgfVxuXG4gICAgdmFyIGRlZmF1bHRMb2NhbGVNZXJpZGllbVBhcnNlID0gL1thcF1cXC4/bT9cXC4/L2k7XG4gICAgZnVuY3Rpb24gbG9jYWxlTWVyaWRpZW0gKGhvdXJzLCBtaW51dGVzLCBpc0xvd2VyKSB7XG4gICAgICAgIGlmIChob3VycyA+IDExKSB7XG4gICAgICAgICAgICByZXR1cm4gaXNMb3dlciA/ICdwbScgOiAnUE0nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGlzTG93ZXIgPyAnYW0nIDogJ0FNJztcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8gU2V0dGluZyB0aGUgaG91ciBzaG91bGQga2VlcCB0aGUgdGltZSwgYmVjYXVzZSB0aGUgdXNlciBleHBsaWNpdGx5XG4gICAgLy8gc3BlY2lmaWVkIHdoaWNoIGhvdXIgdGhleSB3YW50LiBTbyB0cnlpbmcgdG8gbWFpbnRhaW4gdGhlIHNhbWUgaG91ciAoaW5cbiAgICAvLyBhIG5ldyB0aW1lem9uZSkgbWFrZXMgc2Vuc2UuIEFkZGluZy9zdWJ0cmFjdGluZyBob3VycyBkb2VzIG5vdCBmb2xsb3dcbiAgICAvLyB0aGlzIHJ1bGUuXG4gICAgdmFyIGdldFNldEhvdXIgPSBtYWtlR2V0U2V0KCdIb3VycycsIHRydWUpO1xuXG4gICAgdmFyIGJhc2VDb25maWcgPSB7XG4gICAgICAgIGNhbGVuZGFyOiBkZWZhdWx0Q2FsZW5kYXIsXG4gICAgICAgIGxvbmdEYXRlRm9ybWF0OiBkZWZhdWx0TG9uZ0RhdGVGb3JtYXQsXG4gICAgICAgIGludmFsaWREYXRlOiBkZWZhdWx0SW52YWxpZERhdGUsXG4gICAgICAgIG9yZGluYWw6IGRlZmF1bHRPcmRpbmFsLFxuICAgICAgICBkYXlPZk1vbnRoT3JkaW5hbFBhcnNlOiBkZWZhdWx0RGF5T2ZNb250aE9yZGluYWxQYXJzZSxcbiAgICAgICAgcmVsYXRpdmVUaW1lOiBkZWZhdWx0UmVsYXRpdmVUaW1lLFxuXG4gICAgICAgIG1vbnRoczogZGVmYXVsdExvY2FsZU1vbnRocyxcbiAgICAgICAgbW9udGhzU2hvcnQ6IGRlZmF1bHRMb2NhbGVNb250aHNTaG9ydCxcblxuICAgICAgICB3ZWVrOiBkZWZhdWx0TG9jYWxlV2VlayxcblxuICAgICAgICB3ZWVrZGF5czogZGVmYXVsdExvY2FsZVdlZWtkYXlzLFxuICAgICAgICB3ZWVrZGF5c01pbjogZGVmYXVsdExvY2FsZVdlZWtkYXlzTWluLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0OiBkZWZhdWx0TG9jYWxlV2Vla2RheXNTaG9ydCxcblxuICAgICAgICBtZXJpZGllbVBhcnNlOiBkZWZhdWx0TG9jYWxlTWVyaWRpZW1QYXJzZVxuICAgIH07XG5cbiAgICAvLyBpbnRlcm5hbCBzdG9yYWdlIGZvciBsb2NhbGUgY29uZmlnIGZpbGVzXG4gICAgdmFyIGxvY2FsZXMgPSB7fTtcbiAgICB2YXIgbG9jYWxlRmFtaWxpZXMgPSB7fTtcbiAgICB2YXIgZ2xvYmFsTG9jYWxlO1xuXG4gICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGtleSkge1xuICAgICAgICByZXR1cm4ga2V5ID8ga2V5LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgnXycsICctJykgOiBrZXk7XG4gICAgfVxuXG4gICAgLy8gcGljayB0aGUgbG9jYWxlIGZyb20gdGhlIGFycmF5XG4gICAgLy8gdHJ5IFsnZW4tYXUnLCAnZW4tZ2InXSBhcyAnZW4tYXUnLCAnZW4tZ2InLCAnZW4nLCBhcyBpbiBtb3ZlIHRocm91Z2ggdGhlIGxpc3QgdHJ5aW5nIGVhY2hcbiAgICAvLyBzdWJzdHJpbmcgZnJvbSBtb3N0IHNwZWNpZmljIHRvIGxlYXN0LCBidXQgbW92ZSB0byB0aGUgbmV4dCBhcnJheSBpdGVtIGlmIGl0J3MgYSBtb3JlIHNwZWNpZmljIHZhcmlhbnQgdGhhbiB0aGUgY3VycmVudCByb290XG4gICAgZnVuY3Rpb24gY2hvb3NlTG9jYWxlKG5hbWVzKSB7XG4gICAgICAgIHZhciBpID0gMCwgaiwgbmV4dCwgbG9jYWxlLCBzcGxpdDtcblxuICAgICAgICB3aGlsZSAoaSA8IG5hbWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgc3BsaXQgPSBub3JtYWxpemVMb2NhbGUobmFtZXNbaV0pLnNwbGl0KCctJyk7XG4gICAgICAgICAgICBqID0gc3BsaXQubGVuZ3RoO1xuICAgICAgICAgICAgbmV4dCA9IG5vcm1hbGl6ZUxvY2FsZShuYW1lc1tpICsgMV0pO1xuICAgICAgICAgICAgbmV4dCA9IG5leHQgPyBuZXh0LnNwbGl0KCctJykgOiBudWxsO1xuICAgICAgICAgICAgd2hpbGUgKGogPiAwKSB7XG4gICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShzcGxpdC5zbGljZSgwLCBqKS5qb2luKCctJykpO1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5leHQgJiYgbmV4dC5sZW5ndGggPj0gaiAmJiBjb21wYXJlQXJyYXlzKHNwbGl0LCBuZXh0LCB0cnVlKSA+PSBqIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAvL3RoZSBuZXh0IGFycmF5IGl0ZW0gaXMgYmV0dGVyIHR
21167oYW4gYSBzaGFsbG93ZXIgc3Vic3RyaW5nIG9mIHRoaXMgb25lXG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBqLS07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpKys7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2FkTG9jYWxlKG5hbWUpIHtcbiAgICAgICAgdmFyIG9sZExvY2FsZSA9IG51bGw7XG4gICAgICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIHJlZ2lzdGVyIGFuZCBsb2FkIGFsbCB0aGUgbG9jYWxlcyBpbiBOb2RlXG4gICAgICAgIGlmICghbG9jYWxlc1tuYW1lXSAmJiAodHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcpICYmXG4gICAgICAgICAgICAgICAgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG9sZExvY2FsZSA9IGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICAgICAgICAgICAgICB2YXIgYWxpYXNlZFJlcXVpcmUgPSByZXF1aXJlO1xuICAgICAgICAgICAgICAgIGFsaWFzZWRSZXF1aXJlKCcuL2xvY2FsZS8nICsgbmFtZSk7XG4gICAgICAgICAgICAgICAgZ2V0U2V0R2xvYmFsTG9jYWxlKG9sZExvY2FsZSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7fVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGVzW25hbWVdO1xuICAgIH1cblxuICAgIC8vIFRoaXMgZnVuY3Rpb24gd2lsbCBsb2FkIGxvY2FsZSBhbmQgdGhlbiBzZXQgdGhlIGdsb2JhbCBsb2NhbGUuICBJZlxuICAgIC8vIG5vIGFyZ3VtZW50cyBhcmUgcGFzc2VkIGluLCBpdCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGN1cnJlbnQgZ2xvYmFsXG4gICAgLy8gbG9jYWxlIGtleS5cbiAgICBmdW5jdGlvbiBnZXRTZXRHbG9iYWxMb2NhbGUgKGtleSwgdmFsdWVzKSB7XG4gICAgICAgIHZhciBkYXRhO1xuICAgICAgICBpZiAoa2V5KSB7XG4gICAgICAgICAgICBpZiAoaXNVbmRlZmluZWQodmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBnZXRMb2NhbGUoa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBkZWZpbmVMb2NhbGUoa2V5LCB2YWx1ZXMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIG1vbWVudC5kdXJhdGlvbi5fbG9jYWxlID0gbW9tZW50Ll9sb2NhbGUgPSBkYXRhO1xuICAgICAgICAgICAgICAgIGdsb2JhbExvY2FsZSA9IGRhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoKHR5cGVvZiBjb25zb2xlICE9PSAgJ3VuZGVmaW5lZCcpICYmIGNvbnNvbGUud2Fybikge1xuICAgICAgICAgICAgICAgICAgICAvL3dhcm4gdXNlciBpZiBhcmd1bWVudHMgYXJlIHBhc3NlZCBidXQgdGhlIGxvY2FsZSBjb3VsZCBub3QgYmUgc2V0XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignTG9jYWxlICcgKyBrZXkgKyAgJyBub3QgZm91bmQuIERpZCB5b3UgZm9yZ2V0IHRvIGxvYWQgaXQ/Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZS5fYWJicjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkZWZpbmVMb2NhbGUgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnICE9PSBudWxsKSB7XG4gICAgICAgICAgICB2Y
21167XIgbG9jYWxlLCBwYXJlbnRDb25maWcgPSBiYXNlQ29uZmlnO1xuICAgICAgICAgICAgY29uZmlnLmFiYnIgPSBuYW1lO1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZSgnZGVmaW5lTG9jYWxlT3ZlcnJpZGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBtb21lbnQudXBkYXRlTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgdG8gY2hhbmdlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ2FuIGV4aXN0aW5nIGxvY2FsZS4gbW9tZW50LmRlZmluZUxvY2FsZShsb2NhbGVOYW1lLCAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdjb25maWcpIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIGNyZWF0aW5nIGEgbmV3IGxvY2FsZSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdTZWUgaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9kZWZpbmUtbG9jYWxlLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IGxvY2FsZXNbbmFtZV0uX2NvbmZpZztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29uZmlnLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgaWYgKGxvY2FsZXNbY29uZmlnLnBhcmVudExvY2FsZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGVzW2NvbmZpZy5wYXJlbnRMb2NhbGVdLl9jb25maWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxlID0gbG9hZExvY2FsZShjb25maWcucGFyZW50TG9jYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRDb25maWcgPSBsb2NhbGUuX2NvbmZpZztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tjb25maWcucGFyZW50TG9jYWxlXSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlRmFtaWxpZXNbY29uZmlnLnBhcmVudExvY2FsZV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBuZXcgTG9jYWxlKG1lcmdlQ29uZmlncyhwYXJlbnRDb25maWcsIGNvbmZpZykpO1xuXG4gICAgICAgICAgICBpZiAobG9jYWxlRmFtaWxpZXNbbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBsb2NhbGVGYW1pbGllc1tuYW1lXS5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlZmluZUxvY2FsZSh4Lm5hbWUsIHguY29uZmlnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugc2V0IHRoZSBsb2NhbGUgQUZURVIgYWxsIGNoaWxkIGxvY2FsZXMgaGF2ZSBiZWVuXG4gICAgICAgICAgICAvLyBjcmVhdGVkLCBzbyB3ZSB3b24ndCBlbmQgdXAgd2l0aCB0aGUgY2hpbGQgbG9jYWxlIHNldC5cbiAgICAgICAgICAgIGdldFNldEdsb2JhbExvY2FsZShuYW1lKTtcblxuXG4gICAgICAgICAgICByZXR1cm4gbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHVzZWZ1bCBmb3IgdGVzdGluZ1xuICAgICAgICAgICAgZGVsZXRlIGxvY2FsZXNbbmFtZV07XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUxvY2FsZShuYW1lLCBjb25maWcpIHtcbiAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICB2Y
21167XIgbG9jYWxlLCB0bXBMb2NhbGUsIHBhcmVudENvbmZpZyA9IGJhc2VDb25maWc7XG4gICAgICAgICAgICAvLyBNRVJHRVxuICAgICAgICAgICAgdG1wTG9jYWxlID0gbG9hZExvY2FsZShuYW1lKTtcbiAgICAgICAgICAgIGlmICh0bXBMb2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHBhcmVudENvbmZpZyA9IHRtcExvY2FsZS5fY29uZmlnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uZmlnID0gbWVyZ2VDb25maWdzKHBhcmVudENvbmZpZywgY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZSA9IG5ldyBMb2NhbGUoY29uZmlnKTtcbiAgICAgICAgICAgIGxvY2FsZS5wYXJlbnRMb2NhbGUgPSBsb2NhbGVzW25hbWVdO1xuICAgICAgICAgICAgbG9jYWxlc1tuYW1lXSA9IGxvY2FsZTtcblxuICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdCBmb3Igbm93OiBhbHNvIHNldCB0aGUgbG9jYWxlXG4gICAgICAgICAgICBnZXRTZXRHbG9iYWxMb2NhbGUobmFtZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBwYXNzIG51bGwgZm9yIGNvbmZpZyB0byB1bnVwZGF0ZSwgdXNlZnVsIGZvciB0ZXN0c1xuICAgICAgICAgICAgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmIChsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZXNbbmFtZV0gPSBsb2NhbGVzW25hbWVdLnBhcmVudExvY2FsZTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxvY2FsZXNbbmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbG9jYWxlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxvY2FsZXNbbmFtZV07XG4gICAgfVxuXG4gICAgLy8gcmV0dXJucyBsb2NhbGUgZGF0YVxuICAgIGZ1bmN0aW9uIGdldExvY2FsZSAoa2V5KSB7XG4gICAgICAgIHZhciBsb2NhbGU7XG5cbiAgICAgICAgaWYgKGtleSAmJiBrZXkuX2xvY2FsZSAmJiBrZXkuX2xvY2FsZS5fYWJicikge1xuICAgICAgICAgICAga2V5ID0ga2V5Ll9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGdsb2JhbExvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghaXNBcnJheShrZXkpKSB7XG4gICAgICAgICAgICAvL3Nob3J0LWNpcmN1aXQgZXZlcnl0aGluZyBlbHNlXG4gICAgICAgICAgICBsb2NhbGUgPSBsb2FkTG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobG9jYWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGtleSA9IFtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNob29zZUxvY2FsZShrZXkpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RMb2NhbGVzKCkge1xuICAgICAgICByZXR1cm4ga2V5cyhsb2NhbGVzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja092ZXJmbG93IChtKSB7XG4gICAgICAgIHZhciBvdmVyZmxvdztcbiAgICAgICAgdmFyIGEgPSBtLl9hO1xuXG4gICAgICAgIGlmIChhICYmIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9PT0gLTIpIHtcbiAgICAgICAgICAgIG92ZXJmbG93ID1cbiAgICAgICAgICAgICAgICBhW
2116701PTlRIXSAgICAgICA8IDAgfHwgYVtNT05USF0gICAgICAgPiAxMSAgPyBNT05USCA6XG4gICAgICAgICAgICAgICAgYVtEQVRFXSAgICAgICAgPCAxIHx8IGFbREFURV0gICAgICAgID4gZGF5c0luTW9udGgoYVtZRUFSXSwgYVtNT05USF0pID8gREFURSA6XG4gICAgICAgICAgICAgICAgYVtIT1VSXSAgICAgICAgPCAwIHx8IGFbSE9VUl0gICAgICAgID4gMjQgfHwgKGFbSE9VUl0gPT09IDI0ICYmIChhW01JTlVURV0gIT09IDAgfHwgYVtTRUNPTkRdICE9PSAwIHx8IGFbTUlMTElTRUNPTkRdICE9PSAwKSkgPyBIT1VSIDpcbiAgICAgICAgICAgICAgICBhW01JTlVURV0gICAgICA8IDAgfHwgYVtNSU5VVEVdICAgICAgPiA1OSAgPyBNSU5VVEUgOlxuICAgICAgICAgICAgICAgIGFbU0VDT05EXSAgICAgIDwgMCB8fCBhW1NFQ09ORF0gICAgICA+IDU5ICA/IFNFQ09ORCA6XG4gICAgICAgICAgICAgICAgYVtNSUxMSVNFQ09ORF0gPCAwIHx8IGFbTUlMTElTRUNPTkRdID4gOTk5ID8gTUlMTElTRUNPTkQgOlxuICAgICAgICAgICAgICAgIC0xO1xuXG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd0RheU9mWWVhciAmJiAob3ZlcmZsb3cgPCBZRUFSIHx8IG92ZXJmbG93ID4gREFURSkpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IERBVEU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZ2V0UGFyc2luZ0ZsYWdzKG0pLl9vdmVyZmxvd1dlZWtzICYmIG92ZXJmbG93ID09PSAtMSkge1xuICAgICAgICAgICAgICAgIG92ZXJmbG93ID0gV0VFSztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChnZXRQYXJzaW5nRmxhZ3MobSkuX292ZXJmbG93V2Vla2RheSAmJiBvdmVyZmxvdyA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBvdmVyZmxvdyA9IFdFRUtEQVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhtKS5vdmVyZmxvdyA9IG92ZXJmbG93O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG07XG4gICAgfVxuXG4gICAgLy8gUGljayB0aGUgZmlyc3QgZGVmaW5lZCBvZiB0d28gb3IgdGhyZWUgYXJndW1lbnRzLlxuICAgIGZ1bmN0aW9uIGRlZmF1bHRzKGEsIGIsIGMpIHtcbiAgICAgICAgaWYgKGEgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3VycmVudERhdGVBcnJheShjb25maWcpIHtcbiAgICAgICAgLy8gaG9va3MgaXMgYWN0dWFsbHkgdGhlIGV4cG9ydGVkIG1vbWVudCBvYmplY3RcbiAgICAgICAgdmFyIG5vd1ZhbHVlID0gbmV3IERhdGUoaG9va3Mubm93KCkpO1xuICAgICAgICBpZiAoY29uZmlnLl91c2VVVEMpIHtcbiAgICAgICAgICAgIHJldHVybiBbbm93VmFsdWUuZ2V0VVRDRnVsbFllYXIoKSwgbm93VmFsdWUuZ2V0VVRDTW9udGgoKSwgbm93VmFsdWUuZ2V0VVRDRGF0ZSgpXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW25vd1ZhbHVlLmdldEZ1bGxZZWFyKCksIG5vd1ZhbHVlLmdldE1vbnRoKCksIG5vd1ZhbHVlLmdldERhdGUoKV07XG4gICAgfVxuXG4gICAgLy8gY29udmVydCBhbiBhcnJheSB0byBhIGRhdGUuXG4gICAgLy8gdGhlIGFycmF5IHNob3VsZCBtaXJyb3IgdGhlIHBhcmFtZXRlcnMgYmVsb3dcbiAgICAvLyBub3RlOiBhbGwgdmFsdWVzIHBhc3QgdGhlIHllYXIgYXJlIG9wdGlvbmFsIGFuZCB3aWxsIGRlZmF1bHQgdG8gdGhlIGxvd2VzdCBwb3NzaWJsZSB2YWx1ZS5cbiAgICAvLyBbeWVhciwgbW9udGgsIGRheSAsIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZF1cbiAgICBmdW5jdGlvbiBjb25maWdGcm9tQXJyYXkgKGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgaSwgZGF0ZSwgaW5wdXQgPSBbXSwgY3VycmVudERhdGUsIGV4cGVjdGVkV2Vla2RheSwgeWVhclRvVXNlO1xuXG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnREYXRlID0gY3VycmVudERhdGVBcnJheShjb25maWcpO1xuXG4gICAgICAgIC8vY29tcHV0ZSBkYXkgb2YgdGhlIHllYXIgZnJvbSB3ZWVrcyBhbmQgd2Vla2RheXNcbiAgICAgICAgaWYgKGNvbmZpZy5fdyAmJiBjb25maWcuX2FbREFURV0gPT0gbnVsbCAmJiBjb25maWcuX2FbTU9OVEhdID09IG51bGwpIHtcbiAgICAgICAgICAgIGRheU9mWWVhckZyb21XZWVrSW5mbyhjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9pZiB0aGUgZGF5IG9mIHRoZSB5ZWFyIGlzIHNldCwgZmlndXJlIG91dCB3aGF0IGl0IGlzXG4gICAgICAgIGlmIChjb25maWcuX2RheU9mWWVhciAhPSBudWxsKSB7XG4gICAgICAgICAgICB5ZWFyVG9Vc2UgPSBkZWZhdWx0cyhjb25maWcuX2FbWUVBUl0sIGN1cnJlbnREYXRlW1lFQVJdKTtcblxuICAgICAgICAgICAgaWYgKGNvbmZpZy5fZGF5T2ZZZWFyID4gZGF5c0luWWVhcih5ZWFyVG9Vc2UpIHx8IGNvbmZpZy5fZGF5T2ZZZWFyID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuX292ZXJmbG93RGF5T2ZZZWFyID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoeWVhclRvVXNlLCAwLCBjb25maWcuX2RheU9mWWVhcik7XG4gICAgICAgICAgICBjb25maWcuX2FbTU9OVEhdID0gZGF0ZS5nZXRVVENNb250aCgpO1xuICAgICAgICAgICAgY29uZmlnLl9hW0RBVEVdID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0IHRvIGN1cnJlbnQgZGF0ZS5cbiAgICAgICAgLy8gKiBpZiBubyB5ZWFyLCBtb250aCwgZGF5IG9mIG1vbnRoIGFyZSBnaXZlbiwgZGVmYXVsdCB0byB0b2RheVxuICAgICAgICAvLyAqIGlmIGRheSBvZiBtb250aCBpcyBnaXZlbiwgZGVmYXVsdCBtb250aCBhbmQgeWVhclxuICAgICAgICAvLyAqIGlmIG1vbnRoIGlzIGdpdmVuLCBkZWZhdWx0IG9ubHkgeWVhclxuICAgICAgICAvLyAqIGlmIHllYXIgaXMgZ2l2ZW4sIGRvbid0IGRlZmF1bHQgYW55dGhpbmdcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDMgJiYgY29uZmlnLl9hW2ldID09IG51bGw7ICsraSkge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSBjdXJyZW50RGF0ZVtpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFplcm8gb3V0IHdoYXRldmVyIHdhcyBub3QgZGVmYXVsdGVkLCBpbmNsdWRpbmcgdGltZVxuICAgICAgICBmb3IgKDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgY29uZmlnLl9hW2ldID0gaW5wdXRbaV0gPSAoY29uZmlnLl9hW2ldID09IG51bGwpID8gKGkgPT09IDIgPyAxIDogMCkgOiBjb25maWcuX2FbaV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayBmb3IgMjQ6MDA6MDAuMDAwXG4gICAgICAgIGlmIChjb25maWcuX2FbSE9VUl0gPT09IDI0ICYmXG4gICAgICAgICAgICAgICAgY29uZmlnLl9hW01JTlVURV0gPT09IDAgJiZcbiAgICAgICAgICAgICAgICBjb25maWcuX2FbU0VDT05EXSA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGNvbmZpZy5fYVtNSUxMSVNFQ09ORF0gPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5fbmV4dERheSA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2FbSE9VUl0gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnLl9kID0gKGNvbmZpZy5fdXNlVVRDID8gY3JlYXRlVVRDRGF0ZSA6IGNyZWF0ZURhdGUpLmFwcGx5KG51bGwsIGlucHV0KTtcbiAgICAgICAgZXhwZWN0ZWRXZWVrZGF5ID0gY29uZmlnLl91c2VVVEMgPyBjb25maWcuX2QuZ2V0VVRDRGF5KCkgOiBjb25maWcuX2QuZ2V0RGF5KCk7XG5cbiAgICAgICAgLy8gQXBwbHkgdGltZXpvbmUgb2Zmc2V0IGZyb20gaW5wdXQuIFRoZSBhY3R1YWwgdXRjT2Zmc2V0IGNhbiBiZSBjaGFuZ2VkXG4gICAgICAgIC8vIHdpdGggcGFyc2Vab25lLlxuICAgICAgICBpZiAoY29uZmlnLl90em0gIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuX25leHREYXkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYVtIT1VSXSA9IDI0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2hlY2sgZm9yIG1pc21hdGNoaW5nIGRheSBvZiB3ZWVrXG4gICAgICAgIGlmIChjb25maWcuX3cgJiYgdHlwZW9mIGNvbmZpZy5fdy5kICE9PSAndW5kZWZpbmVkJyAmJiBjb25maWcuX3cuZCAhPT0gZXhwZWN0ZWRXZWVrZGF5KSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS53ZWVrZGF5TWlzbWF0Y2ggPSB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGF5T2ZZZWFyRnJvbVdlZWtJbmZvKGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgdywgd2Vla1llYXIsIHdlZWssIHdlZWtkYXksIGRvdywgZG95LCB0ZW1wLCB3ZWVrZGF5T3ZlcmZsb3c7XG5cbiAgICAgICAgdyA9IGNvbmZpZy5fdztcbiAgICAgICAgaWYgKHcuR0cgIT0gbnVsbCB8fCB3LlcgIT0gbnVsbCB8fCB3LkUgIT0gbnVsbCkge1xuICAgICAgICAgICAgZG93ID0gMTtcbiAgICAgICAgICAgIGRveSA9IDQ7XG5cbiAgICAgICAgICAgIC8vIFRPRE86IFdlIG5lZWQgdG8gdGFrZSB0aGUgY3VycmVudCBpc29XZWVrWWVhciwgYnV0IHRoYXQgZGVwZW5kcyBvblxuICAgICAgICAgICAgLy8gaG93IHdlIGludGVycHJldCBub3cgKGxvY2FsLCB1dGMsIGZpeGVkIG9mZnNldCkuIFNvIGNyZWF0ZVxuICAgICAgICAgICAgLy8gYSBub3cgdmVyc2lvbiBvZiBjdXJyZW50IGNvbmZpZyAodGFrZSBsb2NhbC91dGMvb2Zmc2V0IGZsYWdzLCBhbmRcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBub3cpLlxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LkdHLCBjb25maWcuX2FbWUVBUl0sIHdlZWtPZlllYXIoY3JlYXRlTG9jYWwoKSwgMSwgNCkueWVhcik7XG4gICAgICAgICAgICB3ZWVrID0gZGVmYXVsdHMody5XLCAxKTtcbiAgICAgICAgICAgIHdlZWtkYXkgPSBkZWZhdWx0cyh3LkUsIDEpO1xuICAgICAgICAgICAgaWYgKHdlZWtkYXkgPCAxIHx8IHdlZWtkYXkgPiA3KSB7XG4gICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRvdyA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRvdztcbiAgICAgICAgICAgIGRveSA9IGNvbmZpZy5fbG9jYWxlLl93ZWVrLmRveTtcblxuICAgICAgICAgICAgdmFyIGN1cldlZWsgPSB3ZWVrT2ZZZWFyKGNyZWF0ZUxvY2FsKCksIGRvdywgZG95KTtcblxuICAgICAgICAgICAgd2Vla1llYXIgPSBkZWZhdWx0cyh3LmdnLCBjb25maWcuX2FbWUVBUl0sIGN1cldlZWsueWVhcik7XG5cbiAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY3VycmVudCB3ZWVrLlxuICAgICAgICAgICAgd2VlayA9IGRlZmF1bHRzKHcudywgY3VyV2Vlay53ZWVrKTtcblxuICAgICAgICAgICAgaWYgKHcuZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gd2Vla2RheSAtLSBsb3cgZGF5IG51bWJlcnMgYXJlIGNvbnNpZGVyZWQgbmV4dCB3ZWVrXG4gICAgICAgICAgICAgICAgd2Vla2RheSA9IHcuZDtcbiAgICAgICAgICAgICAgICBpZiAod2Vla2RheSA8IDAgfHwgd2Vla2RheSA+IDYpIHtcbiAgICAgICAgICAgICAgICAgICAgd2Vla2RheU92ZXJmbG93ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHcuZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gbG9jYWwgd2Vla2RheSAtLSBjb3VudGluZyBzdGFydHMgZnJvbSBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSB3LmUgKyBkb3c7XG4gICAgICAgICAgICAgICAgaWYgKHcuZSA8IDAgfHwgdy5lID4gNikge1xuICAgICAgICAgICAgICAgICAgICB3ZWVrZGF5T3ZlcmZsb3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBiZWdpbm5pbmcgb2Ygd2Vla1xuICAgICAgICAgICAgICAgIHdlZWtkYXkgPSBkb3c7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHdlZWsgPCAxIHx8IHdlZWsgPiB3ZWVrc0luWWVhcih3ZWVrWWVhciwgZG93LCBkb3kpKSB7XG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS5fb3ZlcmZsb3dXZWVrcyA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAod2Vla2RheU92ZXJmbG93ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLl9vdmVyZmxvd1dlZWtkYXkgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGVtcCA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpO1xuICAgICAgICAgICAgY29uZmlnLl9hW1lFQVJdID0gdGVtcC55ZWFyO1xuICAgICAgICAgICAgY29uZmlnLl9kYXlPZlllYXIgPSB0ZW1wLmRheU9mWWVhcjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGlzbyA4NjAxIHJlZ2V4XG4gICAgLy8gMDAwMC0wMC0wMCAwMDAwLVcwMCBvciAwMDAwLVcwMC0wICsgVCArIDAwIG9yIDAwOjAwIG9yIDAwOjAwOjAwIG9yIDAwOjAwOjAwLjAwMCArICswMDowMCBvciArMDAwMCBvciArMDApXG4gICAgdmFyIGV4dGVuZGVkSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pLSg/OlxcZFxcZC1cXGRcXGR8V1xcZFxcZC1cXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzo6XFxkXFxkKD86OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC87XG4gICAgdmFyIGJhc2ljSXNvUmVnZXggPSAvXlxccyooKD86WystXVxcZHs2fXxcXGR7NH0pKD86XFxkXFxkXFxkXFxkfFdcXGRcXGRcXGR8V1xcZFxcZHxcXGRcXGRcXGR8XFxkXFxkKSkoPzooVHwgKShcXGRcXGQoPzpcXGRcXGQoPzpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvO1xuXG4gICAgdmFyIHR6UmVnZXggPSAvWnxbKy1dXFxkXFxkKD86Oj9cXGRcXGQpPy87XG5cbiAgICB2YXIgaXNvRGF0ZXMgPSBbXG4gICAgICAgIFsnWVlZWVlZLU1NLUREJywgL1srLV1cXGR7Nn0tXFxkXFxkLVxcZFxcZC9dLFxuICAgICAgICBbJ1lZWVktTU0tREQnLCAvXFxkezR9LVxcZFxcZC1cXGRcXGQvXSxcbiAgICAgICAgWydHR0dHLVtXXVdXLUUnLCAvXFxkezR9LVdcXGRcXGQtXFxkL10sXG4gICAgICAgIFsnR0dHRy1bV11XVycsIC9cXGR7NH0tV1xcZFxcZC8sIGZhbHNlXSxcbiAgICAgICAgWydZWVlZLURERCcsIC9cXGR7NH0tXFxkezN9L10sXG4gICAgICAgIFsnWVlZWS1NTScsIC9cXGR7NH0tXFxkXFxkLywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlZWU1NREQnLCAvWystXVxcZHsxMH0vXSxcbiAgICAgICAgWydZWVlZTU1ERCcsIC9cXGR7OH0vXSxcbiAgICAgICAgLy8gWVlZWU1NIGlzIE5PVCBhbGxvd2VkIGJ5IHRoZSBzdGFuZGFyZFxuICAgICAgICBbJ0dHR0dbV11XV0UnLCAvXFxkezR9V1xcZHszfS9dLFxuICAgICAgICBbJ0dHR0dbV11XVycsIC9cXGR7NH1XXFxkezJ9LywgZmFsc2VdLFxuICAgICAgICBbJ1lZWVlEREQnLCAvXFxkezd9L11cbiAgICBdO1xuXG4gICAgLy8gaXNvIHRpbWUgZm9ybWF0cyBhbmQgcmVnZXhlc1xuICAgIHZhciBpc29UaW1lcyA9IFtcbiAgICAgICAgWydISDptbTpzcy5TU1NTJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzLFNTU1MnLCAvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIOm1tOnNzJywgL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sXG4gICAgICAgIFsnSEg6bW0nLCAvXFxkXFxkOlxcZFxcZC9dLFxuICAgICAgICBbJ0hIbW1zcy5TU1NTJywgL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxcbiAgICAgICAgWydISG1tc3MsU1NTUycsIC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFxuICAgICAgICBbJ0hIbW1zcycsIC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxcbiAgICAgICAgWydISG1tJywgL1xcZFxcZFxcZFxcZC9dLFxuICAgICAgICBbJ0hIJywgL1xcZFxcZC9dXG4gICAgXTtcblxuICAgI
21167HZhciBhc3BOZXRKc29uUmVnZXggPSAvXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pO1xuXG4gICAgLy8gZGF0ZSBmcm9tIGlzbyBmb3JtYXRcbiAgICBmdW5jdGlvbiBjb25maWdGcm9tSVNPKGNvbmZpZykge1xuICAgICAgICB2YXIgaSwgbCxcbiAgICAgICAgICAgIHN0cmluZyA9IGNvbmZpZy5faSxcbiAgICAgICAgICAgIG1hdGNoID0gZXh0ZW5kZWRJc29SZWdleC5leGVjKHN0cmluZykgfHwgYmFzaWNJc29SZWdleC5leGVjKHN0cmluZyksXG4gICAgICAgICAgICBhbGxvd1RpbWUsIGRhdGVGb3JtYXQsIHRpbWVGb3JtYXQsIHR6Rm9ybWF0O1xuXG4gICAgICAgIGlmIChtYXRjaCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaXNvID0gdHJ1ZTtcblxuICAgICAgICAgICAgZm9yIChpID0gMCwgbCA9IGlzb0RhdGVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc29EYXRlc1tpXVsxXS5leGVjKG1hdGNoWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICBkYXRlRm9ybWF0ID0gaXNvRGF0ZXNbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGFsbG93VGltZSA9IGlzb0RhdGVzW2ldWzJdICE9PSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGRhdGVGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZy5faXNWYWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChtYXRjaFszXSkge1xuICAgICAgICAgICAgICAgIGZvciAoaSA9IDAsIGwgPSBpc29UaW1lcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzb1RpbWVzW2ldWzFdLmV4ZWMobWF0Y2hbM10pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXRjaFsyXSBzaG91bGQgYmUgJ1QnIG9yIHNwYWNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lRm9ybWF0ID0gKG1hdGNoWzJdIHx8ICcgJykgKyBpc29UaW1lc1tpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aW1lRm9ybWF0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWFsbG93VGltZSAmJiB0aW1lRm9ybWF0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobWF0Y2hbNF0pIHtcbiAgICAgICAgICAgICAgICBpZiAodHpSZWdleC5leGVjKG1hdGNoWzRdKSkge1xuICAgICAgICAgICAgICAgICAgICB0ekZvcm1hdCA9ICdaJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZy5fZiA9IGRhdGVGb3JtYXQgKyAodGltZUZvcm1hdCB8fCAnJykgKyAodHpGb3JtYXQgfHwgJycpO1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uZmlnLl9pc1ZhbGlkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSRkMgMjgyMiByZWdleDogRm9yIGRldGFpbHMgc2VlIGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyODIyI3NlY3Rpb24tMy4zXG4gICAgdmFyIHJmYzI4MjIgPSAvXig/OihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pLD9cXHMpPyhcXGR7MSwyfSlcXHMoSmFufEZlYnxNYXJ8QXByfE1heXxKdW58SnVsfEF1Z3xTZXB8T2N0fE5vdnxEZWMpXFxzKFxcZHsyLDR9KVxccyhcXGRcXGQpOihcXGRcXGQpKD86OihcXGRcXGQpKT9cXHMoPzooVVR8R01UfFtFQ01QXVtTRF1UKXwoW1p6XSl8KFsrLV1cXGR7NH0pKSQvO1xuXG4gICAgZnVuY3Rpb24gZXh0cmFjdEZyb21SRkMyODIyU3RyaW5ncyh5ZWFyU3RyLCBtb250aFN0ciwgZGF5U3RyLCBob3VyU3RyLCBtaW51dGVTdHIsIHNlY29uZFN0cikge1xuICAgICAgICB2Y
21167XIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgdW50cnVuY2F0ZVllYXIoeWVhclN0ciksXG4gICAgICAgICAgICBkZWZhdWx0TG9jYWxlTW9udGhzU2hvcnQuaW5kZXhPZihtb250aFN0ciksXG4gICAgICAgICAgICBwYXJzZUludChkYXlTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KGhvdXJTdHIsIDEwKSxcbiAgICAgICAgICAgIHBhcnNlSW50KG1pbnV0ZVN0ciwgMTApXG4gICAgICAgIF07XG5cbiAgICAgICAgaWYgKHNlY29uZFN0cikge1xuICAgICAgICAgICAgcmVzdWx0LnB1c2gocGFyc2VJbnQoc2Vjb25kU3RyLCAxMCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB1bnRydW5jYXRlWWVhcih5ZWFyU3RyKSB7XG4gICAgICAgIHZhciB5ZWFyID0gcGFyc2VJbnQoeWVhclN0ciwgMTApO1xuICAgICAgICBpZiAoeWVhciA8PSA0OSkge1xuICAgICAgICAgICAgcmV0dXJuIDIwMDAgKyB5ZWFyO1xuICAgICAgICB9IGVsc2UgaWYgKHllYXIgPD0gOTk5KSB7XG4gICAgICAgICAgICByZXR1cm4gMTkwMCArIHllYXI7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJlcHJvY2Vzc1JGQzI4MjIocykge1xuICAgICAgICAvLyBSZW1vdmUgY29tbWVudHMgYW5kIGZvbGRpbmcgd2hpdGVzcGFjZSBhbmQgcmVwbGFjZSBtdWx0aXBsZS1zcGFjZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKC9cXChbXildKlxcKXxbXFxuXFx0XS9nLCAnICcpLnJlcGxhY2UoLyhcXHNcXHMrKS9nLCAnICcpLnJlcGxhY2UoL15cXHNcXHMqLywgJycpLnJlcGxhY2UoL1xcc1xccyokLywgJycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNoZWNrV2Vla2RheSh3ZWVrZGF5U3RyLCBwYXJzZWRJbnB1dCwgY29uZmlnKSB7XG4gICAgICAgIGlmICh3ZWVrZGF5U3RyKSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBSZXBsYWNlIHRoZSB2YW5pbGxhIEpTIERhdGUgb2JqZWN0IHdpdGggYW4gaW5kZXBlbnRlbnQgZGF5LW9mLXdlZWsgY2hlY2suXG4gICAgICAgICAgICB2Y
21167XIgd2Vla2RheVByb3ZpZGVkID0gZGVmYXVsdExvY2FsZVdlZWtkYXlzU2hvcnQuaW5kZXhPZih3ZWVrZGF5U3RyKSxcbiAgICAgICAgICAgICAgICB3ZWVrZGF5QWN0dWFsID0gbmV3IERhdGUocGFyc2VkSW5wdXRbMF0sIHBhcnNlZElucHV0WzFdLCBwYXJzZWRJbnB1dFsyXSkuZ2V0RGF5KCk7XG4gICAgICAgICAgICBpZiAod2Vla2RheVByb3ZpZGVkICE9PSB3ZWVrZGF5QWN0dWFsKSB7XG4gICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykud2Vla2RheU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIG9ic09mZnNldHMgPSB7XG4gICAgICAgIFVUOiAwLFxuICAgICAgICBHTVQ6IDAsXG4gICAgICAgIEVEVDogLTQgKiA2MCxcbiAgICAgICAgRVNUOiAtNSAqIDYwLFxuICAgICAgICBDRFQ6IC01ICogNjAsXG4gICAgICAgIENTVDogLTYgKiA2MCxcbiAgICAgICAgTURUOiAtNiAqIDYwLFxuICAgICAgICBNU1Q6IC03ICogNjAsXG4gICAgICAgIFBEVDogLTcgKiA2MCxcbiAgICAgICAgUFNUOiAtOCAqIDYwXG4gICAgfTtcblxuICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZU9mZnNldChvYnNPZmZzZXQsIG1pbGl0YXJ5T2Zmc2V0LCBudW1PZmZzZXQpIHtcbiAgICAgICAgaWYgKG9ic09mZnNldCkge1xuICAgICAgICAgICAgcmV0dXJuIG9ic09mZnNldHNbb2JzT2Zmc2V0XTtcbiAgICAgICAgfSBlbHNlIGlmIChtaWxpdGFyeU9mZnNldCkge1xuICAgICAgICAgICAgLy8gdGhlIG9ubHkgYWxsb3dlZCBtaWxpdGFyeSB0eiBpcyBaXG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHZhciBobSA9IHBhcnNlSW50KG51bU9mZnNldCwgMTApO1xuICAgICAgICAgICAgdmFyIG0gPSBobSAlIDEwMCwgaCA9IChobSAtIG0pIC8gMTAwO1xuICAgICAgICAgICAgcmV0dXJuIGggKiA2MCArIG07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBkYXRlIGFuZCB0aW1lIGZyb20gcmVmIDI4MjIgZm9ybWF0XG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKSB7XG4gICAgICAgIHZhciBtYXRjaCA9IHJmYzI4MjIuZXhlYyhwcmVwcm9jZXNzUkZDMjgyMihjb25maWcuX2kpKTtcbiAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICB2Y
21167XIgcGFyc2VkQXJyYXkgPSBleHRyYWN0RnJvbVJGQzI4MjJTdHJpbmdzKG1hdGNoWzRdLCBtYXRjaFszXSwgbWF0Y2hbMl0sIG1hdGNoWzVdLCBtYXRjaFs2XSwgbWF0Y2hbN10pO1xuICAgICAgICAgICAgaWYgKCFjaGVja1dlZWtkYXkobWF0Y2hbMV0sIHBhcnNlZEFycmF5LCBjb25maWcpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25maWcuX2EgPSBwYXJzZWRBcnJheTtcbiAgICAgICAgICAgIGNvbmZpZy5fdHptID0gY2FsY3VsYXRlT2Zmc2V0KG1hdGNoWzhdLCBtYXRjaFs5XSwgbWF0Y2hbMTBdKTtcblxuICAgICAgICAgICAgY29uZmlnLl9kID0gY3JlYXRlVVRDRGF0ZS5hcHBseShudWxsLCBjb25maWcuX2EpO1xuICAgICAgICAgICAgY29uZmlnLl9kLnNldFVUQ01pbnV0ZXMoY29uZmlnLl9kLmdldFVUQ01pbnV0ZXMoKSAtIGNvbmZpZy5fdHptKTtcblxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykucmZjMjgyMiA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25maWcuX2lzVmFsaWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBpc28gZm9ybWF0IG9yIGZhbGxiYWNrXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZyhjb25maWcpIHtcbiAgICAgICAgdmFyIG1hdGNoZWQgPSBhc3BOZXRKc29uUmVnZXguZXhlYyhjb25maWcuX2kpO1xuXG4gICAgICAgIGlmIChtYXRjaGVkICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZSgrbWF0Y2hlZFsxXSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgIGlmIChjb25maWcuX2lzVmFsaWQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBkZWxldGUgY29uZmlnLl9pc1ZhbGlkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uZmlnRnJvbVJGQzI4MjIoY29uZmlnKTtcbiAgICAgICAgaWYgKGNvbmZpZy5faXNWYWxpZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuX2lzVmFsaWQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGaW5hbCBhdHRlbXB0LCB1c2UgSW5wdXQgRmFsbGJhY2tcbiAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICB9XG5cbiAgICBob29rcy5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ3ZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCAnICtcbiAgICAgICAgJ3doaWNoIGlzIG5vdCByZWxpYWJsZSBhY3Jvc3MgYWxsIGJyb3dzZXJzIGFuZCB2ZXJzaW9ucy4gTm9uIFJGQzI4MjIvSVNPIGRhdGUgZm9ybWF0cyBhcmUgJyArXG4gICAgICAgICdkaXNjb3VyYWdlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIG1ham9yIHJlbGVhc2UuIFBsZWFzZSByZWZlciB0byAnICtcbiAgICAgICAgJ2h0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby4nLFxuICAgICAgICBmdW5jdGlvbiAoY29uZmlnKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShjb25maWcuX2kgKyAoY29uZmlnLl91c2VVVEMgPyAnIFVUQycgOiAnJykpO1xuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIGNvbnN0YW50IHRoYXQgcmVmZXJzIHRvIHRoZSBJU08gc3RhbmRhcmRcbiAgICBob29rcy5JU09fODYwMSA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gY29uc3RhbnQgdGhhdCByZWZlcnMgdG8gdGhlIFJGQyAyODIyIGZvcm1cbiAgICBob29rcy5SRkNfMjgyMiA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gZGF0ZSBmcm9tIHN0cmluZyBhbmQgZm9ybWF0IHN0cmluZ1xuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21TdHJpbmdBbmRGb3JtYXQoY29uZmlnKSB7XG4gICAgICAgIC8vIFRPRE86IE1vdmUgdGhpcyB0byBhbm90aGVyIHBhcnQgb2YgdGhlIGNyZWF0aW9uIGZsb3cgdG8gcHJldmVudCBjaXJjdWxhciBkZXBzXG4gICAgICAgIGlmIChjb25maWcuX2YgPT09IGhvb2tzLklTT184NjAxKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tSVNPKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZy5fZiA9PT0gaG9va3MuUkZDXzI4MjIpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21SRkMyODIyKGNvbmZpZyk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uZmlnLl9hID0gW107XG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gdHJ1ZTtcblxuICAgICAgICAvLyBUaGlzIGFycmF5IGlzIHVzZWQgdG8gbWFrZSBhIERhdGUsIGVpdGhlciB3aXRoIGBuZXcgRGF0ZWAgb3IgYERhdGUuVVRDYFxuICAgICAgICB2Y
21167XIgc3RyaW5nID0gJycgKyBjb25maWcuX2ksXG4gICAgICAgICAgICBpLCBwYXJzZWRJbnB1dCwgdG9rZW5zLCB0b2tlbiwgc2tpcHBlZCxcbiAgICAgICAgICAgIHN0cmluZ0xlbmd0aCA9IHN0cmluZy5sZW5ndGgsXG4gICAgICAgICAgICB0b3RhbFBhcnNlZElucHV0TGVuZ3RoID0gMDtcblxuICAgICAgICB0b2tlbnMgPSBleHBhbmRGb3JtYXQoY29uZmlnLl9mLCBjb25maWcuX2xvY2FsZSkubWF0Y2goZm9ybWF0dGluZ1Rva2VucykgfHwgW107XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdG9rZW4gPSB0b2tlbnNbaV07XG4gICAgICAgICAgICBwYXJzZWRJbnB1dCA9IChzdHJpbmcubWF0Y2goZ2V0UGFyc2VSZWdleEZvclRva2VuKHRva2VuLCBjb25maWcpKSB8fCBbXSlbMF07XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndG9rZW4nLCB0b2tlbiwgJ3BhcnNlZElucHV0JywgcGFyc2VkSW5wdXQsXG4gICAgICAgICAgICAvLyAgICAgICAgICdyZWdleCcsIGdldFBhcnNlUmVnZXhGb3JUb2tlbih0b2tlbiwgY29uZmlnKSk7XG4gICAgICAgICAgICBpZiAocGFyc2VkSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBza2lwcGVkID0gc3RyaW5nLnN1YnN0cigwLCBzdHJpbmcuaW5kZXhPZihwYXJzZWRJbnB1dCkpO1xuICAgICAgICAgICAgICAgIGlmIChza2lwcGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChza2lwcGVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgc3RyaW5nID0gc3RyaW5nLnNsaWNlKHN0cmluZy5pbmRleE9mKHBhcnNlZElucHV0KSArIHBhcnNlZElucHV0Lmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgdG90YWxQYXJzZWRJbnB1dExlbmd0aCArPSBwYXJzZWRJbnB1dC5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBkb24ndCBwYXJzZSBpZiBpdCdzIG5vdCBhIGtub3duIHRva2VuXG4gICAgICAgICAgICBpZiAoZm9ybWF0VG9rZW5GdW5jdGlvbnNbdG9rZW5dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlZElucHV0KSB7XG4gICAgICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLmVtcHR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3MoY29uZmlnKS51bnVzZWRUb2tlbnMucHVzaCh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGFkZFRpbWVUb0FycmF5RnJvbVRva2VuKHRva2VuLCBwYXJzZWRJbnB1dCwgY29uZmlnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGNvbmZpZy5fc3RyaWN0ICYmICFwYXJzZWRJbnB1dCkge1xuICAgICAgICAgICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnVudXNlZFRva2Vucy5wdXNoKHRva2VuKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCByZW1haW5pbmcgdW5wYXJzZWQgaW5wdXQgbGVuZ3RoIHRvIHRoZSBzdHJpbmdcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuY2hhcnNMZWZ0T3ZlciA9IHN0cmluZ0xlbmd0aCAtIHRvdGFsUGFyc2VkSW5wdXRMZW5ndGg7XG4gICAgICAgIGlmIChzdHJpbmcubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykudW51c2VkSW5wdXQucHVzaChzdHJpbmcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY2xlYXIgXzEyaCBmbGFnIGlmIGhvdXIgaXMgPD0gMTJcbiAgICAgICAgaWYgKGNvbmZpZy5fYVtIT1VSXSA8PSAxMiAmJlxuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9PT0gdHJ1ZSAmJlxuICAgICAgICAgICAgY29uZmlnLl9hW0hPVVJdID4gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuYmlnSG91ciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGdldFBhcnNpbmdGbGFncyhjb25maWcpLnBhcnNlZERhdGVQYXJ0cyA9IGNvbmZpZy5fYS5zbGljZSgwKTtcbiAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykubWVyaWRpZW0gPSBjb25maWcuX21lcmlkaWVtO1xuICAgICAgICAvLyBoYW5kbGUgbWVyaWRpZW1cbiAgICAgICAgY29uZmlnLl9hW0hPVVJdID0gbWVyaWRpZW1GaXhXcmFwKGNvbmZpZy5fbG9jYWxlLCBjb25maWcuX2FbSE9VUl0sIGNvbmZpZy5fbWVyaWRpZW0pO1xuXG4gICAgICAgIGNvbmZpZ0Zyb21BcnJheShjb25maWcpO1xuICAgICAgICBjaGVja092ZXJmbG93KGNvbmZpZyk7XG4gICAgfVxuXG5cbiAgICBmdW5jdGlvbiBtZXJpZGllbUZpeFdyYXAgKGxvY2FsZSwgaG91ciwgbWVyaWRpZW0pIHtcbiAgICAgICAgdmFyIGlzUG07XG5cbiAgICAgICAgaWYgKG1lcmlkaWVtID09IG51bGwpIHtcbiAgICAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG9cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbGUubWVyaWRpZW1Ib3VyICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbGUubWVyaWRpZW1Ib3VyKGhvdXIsIG1lcmlkaWVtKTtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGUuaXNQTSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBGYWxsYmFja1xuICAgICAgICAgICAgaXNQbSA9IGxvY2FsZS5pc1BNKG1lcmlkaWVtKTtcbiAgICAgICAgICAgIGlmIChpc1BtICYmIGhvdXIgPCAxMikge1xuICAgICAgICAgICAgICAgIGhvdXIgKz0gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzUG0gJiYgaG91ciA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICBob3VyID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBob3VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBub3Qgc3VwcG9zZWQgdG8gaGFwcGVuXG4gICAgICAgICAgICByZXR1cm4gaG91cjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGRhdGUgZnJvbSBzdHJpbmcgYW5kIGFycmF5IG9mIGZvcm1hdCBzdHJpbmdzXG4gICAgZnVuY3Rpb24gY29uZmlnRnJvbVN0cmluZ0FuZEFycmF5KGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgdGVtcENvbmZpZyxcbiAgICAgICAgICAgIGJlc3RNb21lbnQsXG5cbiAgICAgICAgICAgIHNjb3JlVG9CZWF0LFxuICAgICAgICAgICAgaSxcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZTtcblxuICAgICAgICBpZiAoY29uZmlnLl9mLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgZ2V0UGFyc2luZ0ZsYWdzKGNvbmZpZykuaW52YWxpZEZvcm1hdCA9IHRydWU7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShOYU4pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvbmZpZy5fZi5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgY3VycmVudFNjb3JlID0gMDtcbiAgICAgICAgICAgIHRlbXBDb25maWcgPSBjb3B5Q29uZmlnKHt9LCBjb25maWcpO1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5fdXNlVVRDICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0ZW1wQ29uZmlnLl91c2VVVEMgPSBjb25maWcuX3VzZVVUQztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRlbXBDb25maWcuX2YgPSBjb25maWcuX2ZbaV07XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nQW5kRm9ybWF0KHRlbXBDb25maWcpO1xuXG4gICAgICAgICAgICBpZiAoIWlzVmFsaWQodGVtcENvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW55IGlucHV0IHRoYXQgd2FzIG5vdCBwYXJzZWQgYWRkIGEgcGVuYWx0eSBmb3IgdGhhdCBmb3JtYXRcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuY2hhcnNMZWZ0T3ZlcjtcblxuICAgICAgICAgICAgLy9vciB0b2tlbnNcbiAgICAgICAgICAgIGN1cnJlbnRTY29yZSArPSBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykudW51c2VkVG9rZW5zLmxlbmd0aCAqIDEwO1xuXG4gICAgICAgICAgICBnZXRQYXJzaW5nRmxhZ3ModGVtcENvbmZpZykuc2NvcmUgPSBjdXJyZW50U2NvcmU7XG5cbiAgICAgICAgICAgIGlmIChzY29yZVRvQmVhdCA9PSBudWxsIHx8IGN1cnJlbnRTY29yZSA8IHNjb3JlVG9CZWF0KSB7XG4gICAgICAgICAgICAgICAgc2NvcmVUb0JlYXQgPSBjdXJyZW50U2NvcmU7XG4gICAgICAgICAgICAgICAgYmVzdE1vbWVudCA9IHRlbXBDb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBleHRlbmQoY29uZmlnLCBiZXN0TW9tZW50IHx8IHRlbXBDb25maWcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21PYmplY3QoY29uZmlnKSB7XG4gICAgICAgIGlmIChjb25maWcuX2QpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBpID0gbm9ybWFsaXplT2JqZWN0VW5pdHMoY29uZmlnLl9pKTtcbiAgICAgICAgY29uZmlnLl9hID0gbWFwKFtpLnllYXIsIGkubW9udGgsIGkuZGF5IHx8IGkuZGF0ZSwgaS5ob3VyLCBpLm1pbnV0ZSwgaS5zZWNvbmQsIGkubWlsbGlzZWNvbmRdLCBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgICAgICByZXR1cm4gb2JqICYmIHBhcnNlSW50KG9iaiwgMTApO1xuICAgICAgICB9KTtcblxuICAgICAgICBjb25maWdGcm9tQXJyYXkoY29uZmlnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVGcm9tQ29uZmlnIChjb25maWcpIHtcbiAgICAgICAgdmFyIHJlcyA9IG5ldyBNb21lbnQoY2hlY2tPdmVyZmxvdyhwcmVwYXJlQ29uZmlnKGNvbmZpZykpKTtcbiAgICAgICAgaWYgKHJlcy5fbmV4dERheSkge1xuICAgICAgICAgICAgLy8gQWRkaW5nIGlzIHNtYXJ0IGVub3VnaCBhcm91bmQgRFNUXG4gICAgICAgICAgICByZXMuYWRkKDEsICdkJyk7XG4gICAgICAgICAgICByZXMuX25leHREYXkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZXBhcmVDb25maWcgKGNvbmZpZykge1xuICAgICAgICB2Y
21167XIgaW5wdXQgPSBjb25maWcuX2ksXG4gICAgICAgICAgICBmb3JtYXQgPSBjb25maWcuX2Y7XG5cbiAgICAgICAgY29uZmlnLl9sb2NhbGUgPSBjb25maWcuX2xvY2FsZSB8fCBnZXRMb2NhbGUoY29uZmlnLl9sKTtcblxuICAgICAgICBpZiAoaW5wdXQgPT09IG51bGwgfHwgKGZvcm1hdCA9PT0gdW5kZWZpbmVkICYmIGlucHV0ID09PSAnJykpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKHtudWxsSW5wdXQ6IHRydWV9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWcuX2kgPSBpbnB1dCA9IGNvbmZpZy5fbG9jYWxlLnByZXBhcnNlKGlucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc01vbWVudChpbnB1dCkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTW9tZW50KGNoZWNrT3ZlcmZsb3coaW5wdXQpKTtcbiAgICAgICAgfSBlbHNlIGlmIChpc0RhdGUoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBpbnB1dDtcbiAgICAgICAgfSBlbHNlIGlmIChpc0FycmF5KGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21TdHJpbmdBbmRBcnJheShjb25maWcpO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCkge1xuICAgICAgICAgICAgY29uZmlnRnJvbVN0cmluZ0FuZEZvcm1hdChjb25maWcpO1xuICAgICAgICB9ICBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFpc1ZhbGlkKGNvbmZpZykpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNvbmZpZ0Zyb21JbnB1dChjb25maWcpIHtcbiAgICAgICAgdmFyIGlucHV0ID0gY29uZmlnLl9pO1xuICAgICAgICBpZiAoaXNVbmRlZmluZWQoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWcuX2QgPSBuZXcgRGF0ZShob29rcy5ub3coKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNEYXRlKGlucHV0KSkge1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQudmFsdWVPZigpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tU3RyaW5nKGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5fYSA9IG1hcChpbnB1dC5zbGljZSgwKSwgZnVuY3Rpb24gKG9iaikge1xuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUludChvYmosIDEwKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uZmlnRnJvbUFycmF5KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNPYmplY3QoaW5wdXQpKSB7XG4gICAgICAgICAgICBjb25maWdGcm9tT2JqZWN0KGNvbmZpZyk7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICAvLyBmcm9tIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUoaW5wdXQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaG9va3MuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2soY29uZmlnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUxvY2FsT3JVVEMgKGlucHV0LCBmb3JtYXQsIGxvY2FsZSwgc3RyaWN0LCBpc1VUQykge1xuICAgICAgICB2Y
21167XIgYyA9IHt9O1xuXG4gICAgICAgIGlmIChsb2NhbGUgPT09IHRydWUgfHwgbG9jYWxlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgc3RyaWN0ID0gbG9jYWxlO1xuICAgICAgICAgICAgbG9jYWxlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKChpc09iamVjdChpbnB1dCkgJiYgaXNPYmplY3RFbXB0eShpbnB1dCkpIHx8XG4gICAgICAgICAgICAgICAgKGlzQXJyYXkoaW5wdXQpICYmIGlucHV0Lmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgIGlucHV0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9iamVjdCBjb25zdHJ1Y3Rpb24gbXVzdCBiZSBkb25lIHRoaXMgd2F5LlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMTQyM1xuICAgICAgICBjLl9pc0FNb21lbnRPYmplY3QgPSB0cnVlO1xuICAgICAgICBjLl91c2VVVEMgPSBjLl9pc1VUQyA9IGlzVVRDO1xuICAgICAgICBjLl9sID0gbG9jYWxlO1xuICAgICAgICBjLl9pID0gaW5wdXQ7XG4gICAgICAgIGMuX2YgPSBmb3JtYXQ7XG4gICAgICAgIGMuX3N0cmljdCA9IHN0cmljdDtcblxuICAgICAgICByZXR1cm4gY3JlYXRlRnJvbUNvbmZpZyhjKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjcmVhdGVMb2NhbCAoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QpIHtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUxvY2FsT3JVVEMoaW5wdXQsIGZvcm1hdCwgbG9jYWxlLCBzdHJpY3QsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJvdG90eXBlTWluID0gZGVwcmVjYXRlKFxuICAgICAgICAnbW9tZW50KCkubWluIGlzIGRlcHJlY2F0ZWQsIHVzZSBtb21lbnQubWF4IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvbWluLW1heC8nLFxuICAgICAgICBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2Y
21167XIgb3RoZXIgPSBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdGhlciA8IHRoaXMgPyB0aGlzIDogb3RoZXI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVJbnZhbGlkKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgdmFyIHByb3RvdHlwZU1heCA9IGRlcHJlY2F0ZShcbiAgICAgICAgJ21vbWVudCgpLm1heCBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1pbiBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlTG9jYWwuYXBwbHkobnVsbCwgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJiBvdGhlci5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3RoZXIgPiB0aGlzID8gdGhpcyA6IG90aGVyO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlSW52YWxpZCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vIFBpY2sgYSBtb21lbnQgbSBmcm9tIG1vbWVudHMgc28gdGhhdCBtW2ZuXShvdGhlcikgaXMgdHJ1ZSBmb3IgYWxsXG4gICAgLy8gb3RoZXIuIFRoaXMgcmVsaWVzIG9uIHRoZSBmdW5jdGlvbiBmbiB0byBiZSB0cmFuc2l0aXZlLlxuICAgIC8vXG4gICAgLy8gbW9tZW50cyBzaG91bGQgZWl0aGVyIGJlIGFuIGFycmF5IG9mIG1vbWVudCBvYmplY3RzIG9yIGFuIGFycmF5LCB3aG9zZVxuICAgIC8vIGZpcnN0IGVsZW1lbnQgaXMgYW4gYXJyYXkgb2YgbW9tZW50IG9iamVjdHMuXG4gICAgZnVuY3Rpb24gcGlja0J5KGZuLCBtb21lbnRzKSB7XG4gICAgICAgIHZhciByZXMsIGk7XG4gICAgICAgIGlmIChtb21lbnRzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG1vbWVudHNbMF0pKSB7XG4gICAgICAgICAgICBtb21lbnRzID0gbW9tZW50c1swXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIW1vbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlTG9jYWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXMgPSBtb21lbnRzWzBdO1xuICAgICAgICBmb3IgKGkgPSAxOyBpIDwgbW9tZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKCFtb21lbnRzW2ldLmlzVmFsaWQoKSB8fCBtb21lbnRzW2ldW2ZuXShyZXMpKSB7XG4gICAgICAgICAgICAgICAgcmVzID0gbW9tZW50c1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSBbXS5zb3J0IGluc3RlYWQ/XG4gICAgZnVuY3Rpb24gbWluICgpIHtcbiAgICAgICAgdmFyIGFyZ3MgPSBbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7XG5cbiAgICAgICAgcmV0dXJuIHBpY2tCeSgnaXNCZWZvcmUnLCBhcmdzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBtYXggKCkge1xuICAgICAgICB2Y
21167XIgYXJncyA9IFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTtcblxuICAgICAgICByZXR1cm4gcGlja0J5KCdpc0FmdGVyJywgYXJncyk7XG4gICAgfVxuXG4gICAgdmFyIG5vdyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIERhdGUubm93ID8gRGF0ZS5ub3coKSA6ICsobmV3IERhdGUoKSk7XG4gICAgfTtcblxuICAgIHZhciBvcmRlcmluZyA9IFsneWVhcicsICdxdWFydGVyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5JywgJ2hvdXInLCAnbWludXRlJywgJ3NlY29uZCcsICdtaWxsaXNlY29uZCddO1xuXG4gICAgZnVuY3Rpb24gaXNEdXJhdGlvblZhbGlkKG0pIHtcbiAgICAgICAgZm9yICh2YXIga2V5IGluIG0pIHtcbiAgICAgICAgICAgIGlmICghKGluZGV4T2YuY2FsbChvcmRlcmluZywga2V5KSAhPT0gLTEgJiYgKG1ba2V5XSA9PSBudWxsIHx8ICFpc05hTihtW2tleV0pKSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgdW5pdEhhc0RlY2ltYWwgPSBmYWxzZTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlcmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgaWYgKG1bb3JkZXJpbmdbaV1dKSB7XG4gICAgICAgICAgICAgICAgaWYgKHVuaXRIYXNEZWNpbWFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gb25seSBhbGxvdyBub24taW50ZWdlcnMgZm9yIHNtYWxsZXN0IHVuaXRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobVtvcmRlcmluZ1tpXV0pICE9PSB0b0ludChtW29yZGVyaW5nW2ldXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdW5pdEhhc0RlY2ltYWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzVmFsaWQkMSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVmFsaWQ7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlSW52YWxpZCQxKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oTmFOKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBEdXJhdGlvbiAoZHVyYXRpb24pIHtcbiAgICAgICAgdmFyIG5vcm1hbGl6ZWRJbnB1dCA9IG5vcm1hbGl6ZU9iamVjdFVuaXRzKGR1cmF0aW9uKSxcbiAgICAgICAgICAgIHllYXJzID0gbm9ybWFsaXplZElucHV0LnllYXIgfHwgMCxcbiAgICAgICAgICAgIHF1YXJ0ZXJzID0gbm9ybWFsaXplZElucHV0LnF1YXJ0ZXIgfHwgMCxcbiAgICAgICAgICAgIG1vbnRocyA9IG5vcm1hbGl6ZWRJbnB1dC5tb250aCB8fCAwLFxuICAgICAgICAgICAgd2Vla3MgPSBub3JtYWxpemVkSW5wdXQud2VlayB8fCBub3JtYWxpemVkSW5wdXQuaXNvV2VlayB8fCAwLFxuICAgICAgICAgICAgZGF5cyA9IG5vcm1hbGl6ZWRJbnB1dC5kYXkgfHwgMCxcbiAgICAgICAgICAgIGhvdXJzID0gbm9ybWFsaXplZElucHV0LmhvdXIgfHwgMCxcbiAgICAgICAgICAgIG1pbnV0ZXMgPSBub3JtYWxpemVkSW5wdXQubWludXRlIHx8IDAsXG4gICAgICAgICAgICBzZWNvbmRzID0gbm9ybWFsaXplZElucHV0LnNlY29uZCB8fCAwLFxuICAgICAgICAgICAgbWlsbGlzZWNvbmRzID0gbm9ybWFsaXplZElucHV0Lm1pbGxpc2Vjb25kIHx8IDA7XG5cbiAgICAgICAgdGhpcy5faXNWYWxpZCA9IGlzRHVyYXRpb25WYWxpZChub3JtYWxpemVkSW5wdXQpO1xuXG4gICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIGZvciBkYXRlQWRkUmVtb3ZlXG4gICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyA9ICttaWxsaXNlY29uZHMgK1xuICAgICAgICAgICAgc2Vjb25kcyAqIDFlMyArIC8vIDEwMDBcbiAgICAgICAgICAgIG1pbnV0ZXMgKiA2ZTQgKyAvLyAxMDAwICogNjBcbiAgICAgICAgICAgIGhvdXJzICogMTAwMCAqIDYwICogNjA7IC8vdXNpbmcgMTAwMCAqIDYwICogNjAgaW5zdGVhZCBvZiAzNmU1IHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGVycm9ycyBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjk3OFxuICAgICAgICAvLyBCZWNhdXNlIG9mIGRhdGVBZGRSZW1vdmUgdHJlYXRzIDI0IGhvdXJzIGFzIGRpZmZlcmVudCBmcm9tIGFcbiAgICAgICAgLy8gZGF5IHdoZW4gd29ya2luZyBhcm91bmQgRFNULCB3ZSBuZWVkIHRvIHN0b3JlIHRoZW0gc2VwYXJhdGVseVxuICAgICAgICB0aGlzLl9kYXlzID0gK2RheXMgK1xuICAgICAgICAgICAgd2Vla3MgKiA3O1xuICAgICAgICAvLyBJdCBpcyBpbXBvc3NpYmxlIHRvIHRyYW5zbGF0ZSBtb250aHMgaW50byBkYXlzIHdpdGhvdXQga25vd2luZ1xuICAgICAgICAvLyB3aGljaCBtb250aHMgeW91IGFyZSBhcmUgdGFsa2luZyBhYm91dCwgc28gd2UgaGF2ZSB0byBzdG9yZVxuICAgICAgICAvLyBpdCBzZXBhcmF0ZWx5LlxuICAgICAgICB0aGlzLl9tb250aHMgPSArbW9udGhzICtcbiAgICAgICAgICAgIHF1YXJ0ZXJzICogMyArXG4gICAgICAgICAgICB5ZWFycyAqIDEyO1xuXG4gICAgICAgIHRoaXMuX2RhdGEgPSB7fTtcblxuICAgICAgICB0aGlzLl9sb2NhbGUgPSBnZXRMb2NhbGUoKTtcblxuICAgICAgICB0aGlzLl9idWJibGUoKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0R1cmF0aW9uIChvYmopIHtcbiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIER1cmF0aW9uO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFic1JvdW5kIChudW1iZXIpIHtcbiAgICAgICAgaWYgKG51bWJlciA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKC0xICogbnVtYmVyKSAqIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQobnVtYmVyKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGZ1bmN0aW9uIG9mZnNldCAodG9rZW4sIHNlcGFyYXRvcikge1xuICAgICAgICBhZGRGb3JtYXRUb2tlbih0b2tlbiwgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMudXRjT2Zmc2V0KCk7XG4gICAgICAgICAgICB2Y
21167XIgc2lnbiA9ICcrJztcbiAgICAgICAgICAgIGlmIChvZmZzZXQgPCAwKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0ID0gLW9mZnNldDtcbiAgICAgICAgICAgICAgICBzaWduID0gJy0nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNpZ24gKyB6ZXJvRmlsbCh+fihvZmZzZXQgLyA2MCksIDIpICsgc2VwYXJhdG9yICsgemVyb0ZpbGwofn4ob2Zmc2V0KSAlIDYwLCAyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb2Zmc2V0KCdaJywgJzonKTtcbiAgICBvZmZzZXQoJ1paJywgJycpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignWicsICBtYXRjaFNob3J0T2Zmc2V0KTtcbiAgICBhZGRSZWdleFRva2VuKCdaWicsIG1hdGNoU2hvcnRPZmZzZXQpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydaJywgJ1paJ10sIGZ1bmN0aW9uIChpbnB1dCwgYXJyYXksIGNvbmZpZykge1xuICAgICAgICBjb25maWcuX3VzZVVUQyA9IHRydWU7XG4gICAgICAgIGNvbmZpZy5fdHptID0gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaFNob3J0T2Zmc2V0LCBpbnB1dCk7XG4gICAgfSk7XG5cbiAgICAvLyBIRUxQRVJTXG5cbiAgICAvLyB0aW1lem9uZSBjaHVua2VyXG4gICAgLy8gJysxMDowMCcgPiBbJzEwJywgICcwMCddXG4gICAgLy8gJy0xNTMwJyAgPiBbJy0xNScsICczMCddXG4gICAgdmFyIGNodW5rT2Zmc2V0ID0gLyhbXFwrXFwtXXxcXGRcXGQpL2dpO1xuXG4gICAgZnVuY3Rpb24gb2Zmc2V0RnJvbVN0cmluZyhtYXRjaGVyLCBzdHJpbmcpIHtcbiAgICAgICAgdmFyIG1hdGNoZXMgPSAoc3RyaW5nIHx8ICcnKS5tYXRjaChtYXRjaGVyKTtcblxuICAgICAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgY2h1bmsgICA9IG1hdGNoZXNbbWF0Y2hlcy5sZW5ndGggLSAxXSB8fCBbXTtcbiAgICAgICAgdmFyIHBhcnRzICAgPSAoY2h1bmsgKyAnJykubWF0Y2goY2h1bmtPZmZzZXQpIHx8IFsnLScsIDAsIDBdO1xuICAgICAgICB2YXIgbWludXRlcyA9ICsocGFydHNbMV0gKiA2MCkgKyB0b0ludChwYXJ0c1syXSk7XG5cbiAgICAgICAgcmV0dXJuIG1pbnV0ZXMgPT09IDAgP1xuICAgICAgICAgIDAgOlxuICAgICAgICAgIHBhcnRzWzBdID09PSAnKycgPyBtaW51dGVzIDogLW1pbnV0ZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGEgbW9tZW50IGZyb20gaW5wdXQsIHRoYXQgaXMgbG9jYWwvdXRjL3pvbmUgZXF1aXZhbGVudCB0byBtb2RlbC5cbiAgICBmdW5jdGlvbiBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIG1vZGVsKSB7XG4gICAgICAgIHZhciByZXMsIGRpZmY7XG4gICAgICAgIGlmIChtb2RlbC5faXNVVEMpIHtcbiAgICAgICAgICAgIHJlcyA9IG1vZGVsLmNsb25lKCk7XG4gICAgICAgICAgICBkaWZmID0gKGlzTW9tZW50KGlucHV0KSB8fCBpc0RhdGUoaW5wdXQpID8gaW5wdXQudmFsdWVPZigpIDogY3JlYXRlTG9jYWwoaW5wdXQpLnZhbHVlT2YoKSkgLSByZXMudmFsdWVPZigpO1xuICAgICAgICAgICAgLy8gVXNlIGxvdy1sZXZlbCBhcGksIGJlY2F1c2UgdGhpcyBmbiBpcyBsb3ctbGV2ZWwgYXBpLlxuICAgICAgICAgICAgcmVzLl9kLnNldFRpbWUocmVzLl9kLnZhbHVlT2YoKSArIGRpZmYpO1xuICAgICAgICAgICAgaG9va3MudXBkYXRlT2Zmc2V0KHJlcywgZmFsc2UpO1xuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVMb2NhbChpbnB1dCkubG9jYWwoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldERhdGVPZmZzZXQgKG0pIHtcbiAgICAgICAgLy8gT24gRmlyZWZveC4yNCBEYXRlI2dldFRpbWV6b25lT2Zmc2V0IHJldHVybnMgYSBmbG9hdGluZyBwb2ludC5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvcHVsbC8xODcxXG4gICAgICAgIHJldHVybiAtTWF0aC5yb3VuZChtLl9kLmdldFRpbWV6b25lT2Zmc2V0KCkgLyAxNSkgKiAxNTtcbiAgICB9XG5cbiAgICAvLyBIT09LU1xuXG4gICAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIG1vbWVudCBpcyBtdXRhdGVkLlxuICAgIC8vIEl0IGlzIGludGVuZGVkIHRvIGtlZXAgdGhlIG9mZnNldCBpbiBzeW5jIHdpdGggdGhlIHRpbWV6b25lLlxuICAgIGhvb2tzLnVwZGF0ZU9mZnNldCA9IGZ1bmN0aW9uICgpIHt9O1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgLy8ga2VlcExvY2FsVGltZSA9IHRydWUgbWVhbnMgb25seSBjaGFuZ2UgdGhlIHRpbWV6b25lLCB3aXRob3V0XG4gICAgLy8gYWZmZWN0aW5nIHRoZSBsb2NhbCBob3VyLiBTbyA1OjMxOjI2ICswMzAwIC0tW3V0Y09mZnNldCgyLCB0cnVlKV0tLT5cbiAgICAvLyA1OjMxOjI2ICswMjAwIEl0IGlzIHBvc3NpYmxlIHRoYXQgNTozMToyNiBkb2Vzbid0IGV4aXN0IHdpdGggb2Zmc2V0XG4gICAgLy8gKzAyMDAsIHNvIHdlIGFkanVzdCB0aGUgdGltZSBhcyBuZWVkZWQsIHRvIGJlIHZhbGlkLlxuICAgIC8vXG4gICAgLy8gS2VlcGluZyB0aGUgdGltZSBhY3R1YWxseSBhZGRzL3N1YnRyYWN0cyAob25lIGhvdXIpXG4gICAgLy8gZnJvbSB0aGUgYWN0dWFsIHJlcHJlc2VudGVkIHRpbWUuIFRoYXQgaXMgd2h5IHdlIGNhbGwgdXBkYXRlT2Zmc2V0XG4gICAgLy8gYSBzZWNvbmQgdGltZS4gSW4gY2FzZSBpdCB3YW50cyB1cyB0byBjaGFuZ2UgdGhlIG9mZnNldCBhZ2FpblxuICAgIC8vIF9jaGFuZ2VJblByb2dyZXNzID09IHRydWUgY2FzZSwgdGhlbiB3ZSBoYXZlIHRvIGFkanVzdCwgYmVjYXVzZVxuICAgIC8vIHRoZXJlIGlzIG5vIHN1Y2ggdGltZSBpbiB0aGUgZ2l2ZW4gdGltZXpvbmUuXG4gICAgZnVuY3Rpb24gZ2V0U2V0T2Zmc2V0IChpbnB1dCwga2VlcExvY2FsVGltZSwga2VlcE1pbnV0ZXMpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX29mZnNldCB8fCAwLFxuICAgICAgICAgICAgbG9jYWxBZGp1c3Q7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsID8gdGhpcyA6IE5hTjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbnB1dCA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hTaG9ydE9mZnNldCwgaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKE1hdGguYWJzKGlucHV0KSA8IDE2ICYmICFrZWVwTWludXRlcykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gaW5wdXQgKiA2MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghdGhpcy5faXNVVEMgJiYga2VlcExvY2FsVGltZSkge1xuICAgICAgICAgICAgICAgIGxvY2FsQWRqdXN0ID0gZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX29mZnNldCA9IGlucHV0O1xuICAgICAgICAgICAgdGhpcy5faXNVVEMgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKGxvY2FsQWRqdXN0ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFkZChsb2NhbEFkanVzdCwgJ20nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvZmZzZXQgIT09IGlucHV0KSB7XG4gICAgICAgICAgICAgICAgaWYgKCFrZWVwTG9jYWxUaW1lIHx8IHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgYWRkU3VidHJhY3QodGhpcywgY3JlYXRlRHVyYXRpb24oaW5wdXQgLSBvZmZzZXQsICdtJyksIDEsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLl9jaGFuZ2VJblByb2dyZXNzKSB7XG4gICAgICAgICAgICAgICAgICAgI
21167HRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3MgPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gb2Zmc2V0IDogZ2V0RGF0ZU9mZnNldCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFpvbmUgKGlucHV0LCBrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGlucHV0ID0gLWlucHV0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldChpbnB1dCwga2VlcExvY2FsVGltZSk7XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIC10aGlzLnV0Y09mZnNldCgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0T2Zmc2V0VG9VVEMgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsIGtlZXBMb2NhbFRpbWUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvTG9jYWwgKGtlZXBMb2NhbFRpbWUpIHtcbiAgICAgICAgaWYgKHRoaXMuX2lzVVRDKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCBrZWVwTG9jYWxUaW1lKTtcbiAgICAgICAgICAgIHRoaXMuX2lzVVRDID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChrZWVwTG9jYWxUaW1lKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdWJ0cmFjdChnZXREYXRlT2Zmc2V0KHRoaXMpLCAnbScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0ICgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3R6bSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5faSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHZhciB0Wm9uZSA9IG9mZnNldEZyb21TdHJpbmcobWF0Y2hPZmZzZXQsIHRoaXMuX2kpO1xuICAgICAgICAgICAgaWYgKHRab25lICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCh0Wm9uZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnV0Y09mZnNldCgwLCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBoYXNBbGlnbmVkSG91ck9mZnNldCAoaW5wdXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGlucHV0ID0gaW5wdXQgPyBjcmVhdGVMb2NhbChpbnB1dCkudXRjT2Zmc2V0KCkgOiAwO1xuXG4gICAgICAgIHJldHVybiAodGhpcy51dGNPZmZzZXQoKSAtIGlucHV0KSAlIDYwID09PSAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzRGF5bGlnaHRTYXZpbmdUaW1lICgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoMCkudXRjT2Zmc2V0KCkgfHxcbiAgICAgICAgICAgIHRoaXMudXRjT2Zmc2V0KCkgPiB0aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0RheWxpZ2h0U2F2aW5nVGltZVNoaWZ0ZWQgKCkge1xuICAgICAgICBpZiAoIWlzVW5kZWZpbmVkKHRoaXMuX2lzRFNUU2hpZnRlZCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgYyA9IHt9O1xuXG4gICAgICAgIGNvcHlDb25maWcoYywgdGhpcyk7XG4gICAgICAgIGMgPSBwcmVwYXJlQ29uZmlnKGMpO1xuXG4gICAgICAgIGlmIChjLl9hKSB7XG4gICAgICAgICAgICB2YXIgb3RoZXIgPSBjLl9pc1VUQyA/IGNyZWF0ZVVUQyhjLl9hKSA6IGNyZWF0ZUxvY2FsKGMuX2EpO1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gdGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICBjb21wYXJlQXJyYXlzKGMuX2EsIG90aGVyLnRvQXJyYXkoKSkgPiAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5faXNEU1RTaGlmdGVkID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTG9jYWwgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyAhdGhpcy5faXNVVEMgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1V0Y09mZnNldCAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMuX2lzVVRDIDogZmFsc2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNVdGMgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzLl9pc1VUQyAmJiB0aGlzLl9vZmZzZXQgPT09IDAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBBU1AuTkVUIGpzb24gZGF0ZSBmb3JtYXQgcmVnZXhcbiAgICB2YXIgYXNwTmV0UmVnZXggPSAvXihcXC18XFwrKT8oPzooXFxkKilbLiBdKT8oXFxkKylcXDooXFxkKykoPzpcXDooXFxkKykoXFwuXFxkKik/KT8kLztcblxuICAgIC8vIGZyb20gaHR0cDovL2RvY3MuY2xvc3VyZS1saWJyYXJ5Lmdvb2dsZWNvZGUuY29tL2dpdC9jbG9zdXJlX2dvb2dfZGF0ZV9kYXRlLmpzLnNvdXJjZS5odG1sXG4gICAgLy8gc29tZXdoYXQgbW9yZSBpbiBsaW5lIHdpdGggNC40LjMuMiAyMDA0IHNwZWMsIGJ1dCBhbGxvd3MgZGVjaW1hbCBhbnl3aGVyZVxuICAgIC8vIGFuZCBmdXJ0aGVyIG1vZGlmaWVkIHRvIGFsbG93IGZvciBzdHJpbmdzIGNvbnRhaW5pbmcgYm90aCB3ZWVrIGFuZCBkYXlcbiAgICB2YXIgaXNvUmVnZXggPSAvXigtfFxcKyk/UCg/OihbLStdP1swLTksLl0qKVkpPyg/OihbLStdP1swLTksLl0qKU0pPyg/OihbLStdP1swLTksLl0qKVcpPyg/OihbLStdP1swLTksLl0qKUQpPyg/OlQoPzooWy0rXT9bMC05LC5dKilIKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilTKT8pPyQvO1xuXG4gICAgZnVuY3Rpb24gY3JlYXRlRHVyYXRpb24gKGlucHV0LCBrZXkpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gaW5wdXQsXG4gICAgICAgICAgICAvLyBtYXRjaGluZyBhZ2FpbnN0IHJlZ2V4cCBpcyBleHBlbnNpdmUsIGRvIGl0IG9uIGRlbWFuZFxuICAgICAgICAgICAgbWF0Y2ggPSBudWxsLFxuICAgICAgICAgICAgc2lnbixcbiAgICAgICAgICAgIHJldCxcbiAgICAgICAgICAgIGRpZmZSZXM7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICBtcyA6IGlucHV0Ll9taWxsaXNlY29uZHMsXG4gICAgICAgICAgICAgICAgZCAgOiBpbnB1dC5fZGF5cyxcbiAgICAgICAgICAgICAgICBNICA6IGlucHV0Ll9tb250aHNcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoaW5wdXQpKSB7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgaWYgKGtleSkge1xuICAgICAgICAgICAgICAgIGR1cmF0aW9uW2tleV0gPSBpbnB1dDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHVyYXRpb24ubWlsbGlzZWNvbmRzID0gaW5wdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBhc3BOZXRSZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5ICA6IDAsXG4gICAgICAgICAgICAgICAgZCAgOiB0b0ludChtYXRjaFtEQVRFXSkgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIGggIDogdG9JbnQobWF0Y2hbSE9VUl0pICAgICAgICAgICAgICAgICAgICAgICAgICogc2lnbixcbiAgICAgICAgICAgICAgICBtICA6IHRvSW50KG1hdGNoW01JTlVURV0pICAgICAgICAgICAgICAgICAgICAgICAqIHNpZ24sXG4gICAgICAgICAgICAgICAgcyAgOiB0b0ludChtYXRjaFtTRUNPTkRdKSAgICAgICAgICAgICAgICAgICAgICAgKiBzaWduLFxuICAgICAgICAgICAgICAgIG1zIDogdG9JbnQoYWJzUm91bmQobWF0Y2hbTUlMTElTRUNPTkRdICogMTAwMCkpICogc2lnbiAvLyB0aGUgbWlsbGlzZWNvbmQgZGVjaW1hbCBwb2ludCBpcyBpbmNsdWRlZCBpbiB0aGUgbWF0Y2hcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSBpZiAoISEobWF0Y2ggPSBpc29SZWdleC5leGVjKGlucHV0KSkpIHtcbiAgICAgICAgICAgIHNpZ24gPSAobWF0Y2hbMV0gPT09ICctJykgPyAtMSA6IDE7XG4gICAgICAgICAgICBkdXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICB5IDogcGFyc2VJc28obWF0Y2hbMl0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIE0gOiBwYXJzZUlzbyhtYXRjaFszXSwgc2lnbiksXG4gICAgICAgICAgICAgICAgdyA6IHBhcnNlSXNvKG1hdGNoWzRdLCBzaWduKSxcbiAgICAgICAgICAgICAgICBkIDogcGFyc2VJc28obWF0Y2hbNV0sIHNpZ24pLFxuICAgICAgICAgICAgICAgIGggOiBwYXJzZUlzbyhtYXRjaFs2XSwgc2lnbiksXG4gICAgICAgICAgICAgICAgbSA6IHBhcnNlSXNvKG1hdGNoWzddLCBzaWduKSxcbiAgICAgICAgICAgICAgICBzIDogcGFyc2VJc28obWF0Y2hbOF0sIHNpZ24pXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uID09IG51bGwpIHsvLyBjaGVja3MgZm9yIG51bGwgb3IgdW5kZWZpbmVkXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBkdXJhdGlvbiA9PT0gJ29iamVjdCcgJiYgKCdmcm9tJyBpbiBkdXJhdGlvbiB8fCAndG8nIGluIGR1cmF0aW9uKSkge1xuICAgICAgICAgICAgZGlmZlJlcyA9IG1vbWVudHNEaWZmZXJlbmNlKGNyZWF0ZUxvY2FsKGR1cmF0aW9uLmZyb20pLCBjcmVhdGVMb2NhbChkdXJhdGlvbi50bykpO1xuXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHt9O1xuICAgICAgICAgICAgZHVyYXRpb24ubXMgPSBkaWZmUmVzLm1pbGxpc2Vjb25kcztcbiAgICAgICAgICAgIGR1cmF0aW9uLk0gPSBkaWZmUmVzLm1vbnRocztcbiAgICAgICAgfVxuXG4gICAgICAgI
21167HJldCA9IG5ldyBEdXJhdGlvbihkdXJhdGlvbik7XG5cbiAgICAgICAgaWYgKGlzRHVyYXRpb24oaW5wdXQpICYmIGhhc093blByb3AoaW5wdXQsICdfbG9jYWxlJykpIHtcbiAgICAgICAgICAgIHJldC5fbG9jYWxlID0gaW5wdXQuX2xvY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuXG4gICAgY3JlYXRlRHVyYXRpb24uZm4gPSBEdXJhdGlvbi5wcm90b3R5cGU7XG4gICAgY3JlYXRlRHVyYXRpb24uaW52YWxpZCA9IGNyZWF0ZUludmFsaWQkMTtcblxuICAgIGZ1bmN0aW9uIHBhcnNlSXNvIChpbnAsIHNpZ24pIHtcbiAgICAgICAgLy8gV2UnZCBub3JtYWxseSB1c2Ugfn5pbnAgZm9yIHRoaXMsIGJ1dCB1bmZvcnR1bmF0ZWx5IGl0IGFsc29cbiAgICAgICAgLy8gY29udmVydHMgZmxvYXRzIHRvIGludHMuXG4gICAgICAgIC8vIGlucCBtYXkgYmUgdW5kZWZpbmVkLCBzbyBjYXJlZnVsIGNhbGxpbmcgcmVwbGFjZSBvbiBpdC5cbiAgICAgICAgdmFyIHJlcyA9IGlucCAmJiBwYXJzZUZsb2F0KGlucC5yZXBsYWNlKCcsJywgJy4nKSk7XG4gICAgICAgIC8vIGFwcGx5IHNpZ24gd2hpbGUgd2UncmUgYXQgaXRcbiAgICAgICAgcmV0dXJuIChpc05hTihyZXMpID8gMCA6IHJlcykgKiBzaWduO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpIHtcbiAgICAgICAgdmFyIHJlcyA9IHt9O1xuXG4gICAgICAgIHJlcy5tb250aHMgPSBvdGhlci5tb250aCgpIC0gYmFzZS5tb250aCgpICtcbiAgICAgICAgICAgIChvdGhlci55ZWFyKCkgLSBiYXNlLnllYXIoKSkgKiAxMjtcbiAgICAgICAgaWYgKGJhc2UuY2xvbmUoKS5hZGQocmVzLm1vbnRocywgJ00nKS5pc0FmdGVyKG90aGVyKSkge1xuICAgICAgICAgICAgLS1yZXMubW9udGhzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzLm1pbGxpc2Vjb25kcyA9ICtvdGhlciAtICsoYmFzZS5jbG9uZSgpLmFkZChyZXMubW9udGhzLCAnTScpKTtcblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbWVudHNEaWZmZXJlbmNlKGJhc2UsIG90aGVyKSB7XG4gICAgICAgIHZhciByZXM7XG4gICAgICAgIGlmICghKGJhc2UuaXNWYWxpZCgpICYmIG90aGVyLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiB7bWlsbGlzZWNvbmRzOiAwLCBtb250aHM6IDB9O1xuICAgICAgICB9XG5cbiAgICAgICAgb3RoZXIgPSBjbG9uZVdpdGhPZmZzZXQob3RoZXIsIGJhc2UpO1xuICAgICAgICBpZiAoYmFzZS5pc0JlZm9yZShvdGhlcikpIHtcbiAgICAgICAgICAgIHJlcyA9IHBvc2l0aXZlTW9tZW50c0RpZmZlcmVuY2UoYmFzZSwgb3RoZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzID0gcG9zaXRpdmVNb21lbnRzRGlmZmVyZW5jZShvdGhlciwgYmFzZSk7XG4gICAgICAgICAgICByZXMubWlsbGlzZWNvbmRzID0gLXJlcy5taWxsaXNlY29uZHM7XG4gICAgICAgICAgICByZXMubW9udGhzID0gLXJlcy5tb250aHM7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzO1xuICAgIH1cblxuICAgIC8vIFRPRE86IHJlbW92ZSAnbmFtZScgYXJnIGFmdGVyIGRlcHJlY2F0aW9uIGlzIHJlbW92ZWRcbiAgICBmdW5jdGlvbiBjcmVhdGVBZGRlcihkaXJlY3Rpb24sIG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2YWwsIHBlcmlvZCkge1xuICAgICAgICAgICAgdmFyIGR1ciwgdG1wO1xuICAgICAgICAgICAgLy9pbnZlcnQgdGhlIGFyZ3VtZW50cywgYnV0IGNvbXBsYWluIGFib3V0IGl0XG4gICAgICAgICAgICBpZiAocGVyaW9kICE9PSBudWxsICYmICFpc05hTigrcGVyaW9kKSkge1xuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZVNpbXBsZShuYW1lLCAnbW9tZW50KCkuJyArIG5hbWUgICsgJyhwZXJpb2QsIG51bWJlcikgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBtb21lbnQoKS4nICsgbmFtZSArICcobnVtYmVyLCBwZXJpb2QpLiAnICtcbiAgICAgICAgICAgICAgICAnU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvYWRkLWludmVydGVkLXBhcmFtLyBmb3IgbW9yZSBpbmZvLicpO1xuICAgICAgICAgICAgICAgIHRtcCA9IHZhbDsgdmFsID0gcGVyaW9kOyBwZXJpb2QgPSB0bXA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhbCA9IHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnID8gK3ZhbCA6IHZhbDtcbiAgICAgICAgICAgIGR1ciA9IGNyZWF0ZUR1cmF0aW9uKHZhbCwgcGVyaW9kKTtcbiAgICAgICAgICAgIGFkZFN1YnRyYWN0KHRoaXMsIGR1ciwgZGlyZWN0aW9uKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZFN1YnRyYWN0IChtb20sIGR1cmF0aW9uLCBpc0FkZGluZywgdXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgIHZhciBtaWxsaXNlY29uZHMgPSBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzLFxuICAgICAgICAgICAgZGF5cyA9IGFic1JvdW5kKGR1cmF0aW9uLl9kYXlzKSxcbiAgICAgICAgICAgIG1vbnRocyA9IGFic1JvdW5kKGR1cmF0aW9uLl9tb250aHMpO1xuXG4gICAgICAgIGlmICghbW9tLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgLy8gTm8gb3BcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldCA9PSBudWxsID8gdHJ1ZSA6IHVwZGF0ZU9mZnNldDtcblxuICAgICAgICBpZiAobW9udGhzKSB7XG4gICAgICAgICAgICBzZXRNb250aChtb20sIGdldChtb20sICdNb250aCcpICsgbW9udGhzICogaXNBZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzKSB7XG4gICAgICAgICAgICBzZXQkMShtb20sICdEYXRlJywgZ2V0KG1vbSwgJ0RhdGUnKSArIGRheXMgKiBpc0FkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1pbGxpc2Vjb25kcykge1xuICAgICAgICAgICAgbW9tLl9kLnNldFRpbWUobW9tLl9kLnZhbHVlT2YoKSArIG1pbGxpc2Vjb25kcyAqIGlzQWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlT2Zmc2V0KSB7XG4gICAgICAgICAgICBob29rcy51cGRhdGVPZmZzZXQobW9tLCBkYXlzIHx8IG1vbnRocyk7XG4gICAgICAgI
21167H1cbiAgICB9XG5cbiAgICB2YXIgYWRkICAgICAgPSBjcmVhdGVBZGRlcigxLCAnYWRkJyk7XG4gICAgdmFyIHN1YnRyYWN0ID0gY3JlYXRlQWRkZXIoLTEsICdzdWJ0cmFjdCcpO1xuXG4gICAgZnVuY3Rpb24gZ2V0Q2FsZW5kYXJGb3JtYXQobXlNb21lbnQsIG5vdykge1xuICAgICAgICB2YXIgZGlmZiA9IG15TW9tZW50LmRpZmYobm93LCAnZGF5cycsIHRydWUpO1xuICAgICAgICByZXR1cm4gZGlmZiA8IC02ID8gJ3NhbWVFbHNlJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IC0xID8gJ2xhc3RXZWVrJyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDAgPyAnbGFzdERheScgOlxuICAgICAgICAgICAgICAgIGRpZmYgPCAxID8gJ3NhbWVEYXknIDpcbiAgICAgICAgICAgICAgICBkaWZmIDwgMiA/ICduZXh0RGF5JyA6XG4gICAgICAgICAgICAgICAgZGlmZiA8IDcgPyAnbmV4dFdlZWsnIDogJ3NhbWVFbHNlJztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjYWxlbmRhciQxICh0aW1lLCBmb3JtYXRzKSB7XG4gICAgICAgIC8vIFdlIHdhbnQgdG8gY29tcGFyZSB0aGUgc3RhcnQgb2YgdG9kYXksIHZzIHRoaXMuXG4gICAgICAgIC8vIEdldHRpbmcgc3RhcnQtb2YtdG9kYXkgZGVwZW5kcyBvbiB3aGV0aGVyIHdlJ3JlIGxvY2FsL3V0Yy9vZmZzZXQgb3Igbm90LlxuICAgICAgICB2YXIgbm93ID0gdGltZSB8fCBjcmVhdGVMb2NhbCgpLFxuICAgICAgICAgICAgc29kID0gY2xvbmVXaXRoT2Zmc2V0KG5vdywgdGhpcykuc3RhcnRPZignZGF5JyksXG4gICAgICAgICAgICBmb3JtYXQgPSBob29rcy5jYWxlbmRhckZvcm1hdCh0aGlzLCBzb2QpIHx8ICdzYW1lRWxzZSc7XG5cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdHMgJiYgKGlzRnVuY3Rpb24oZm9ybWF0c1tmb3JtYXRdKSA/IGZvcm1hdHNbZm9ybWF0XS5jYWxsKHRoaXMsIG5vdykgOiBmb3JtYXRzW2Zvcm1hdF0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdChvdXRwdXQgfHwgdGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIoZm9ybWF0LCB0aGlzLCBjcmVhdGVMb2NhbChub3cpKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY2xvbmUgKCkge1xuICAgICAgICByZXR1cm4gbmV3IE1vbWVudCh0aGlzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0FmdGVyIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KTtcbiAgICAgICAgaWYgKCEodGhpcy5pc1ZhbGlkKCkgJiYgbG9jYWxJbnB1dC5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cykgfHwgJ21pbGxpc2Vjb25kJztcbiAgICAgICAgaWYgKHVuaXRzID09PSAnbWlsbGlzZWNvbmQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy52YWx1ZU9mKCkgPiBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbElucHV0LnZhbHVlT2YoKSA8IHRoaXMuY2xvbmUoKS5zdGFydE9mKHVuaXRzKS52YWx1ZU9mKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc0JlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHZhciBsb2NhbElucHV0ID0gaXNNb21lbnQoaW5wdXQpID8gaW5wdXQgOiBjcmVhdGVMb2NhbChpbnB1dCk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpIDwgbG9jYWxJbnB1dC52YWx1ZU9mKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmVuZE9mKHVuaXRzKS52YWx1ZU9mKCkgPCBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzQmV0d2VlbiAoZnJvbSwgdG8sIHVuaXRzLCBpbmNsdXNpdml0eSkge1xuICAgICAgICB2Y
21167XIgbG9jYWxGcm9tID0gaXNNb21lbnQoZnJvbSkgPyBmcm9tIDogY3JlYXRlTG9jYWwoZnJvbSksXG4gICAgICAgICAgICBsb2NhbFRvID0gaXNNb21lbnQodG8pID8gdG8gOiBjcmVhdGVMb2NhbCh0byk7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsRnJvbS5pc1ZhbGlkKCkgJiYgbG9jYWxUby5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaW5jbHVzaXZpdHkgPSBpbmNsdXNpdml0eSB8fCAnKCknO1xuICAgICAgICByZXR1cm4gKGluY2x1c2l2aXR5WzBdID09PSAnKCcgPyB0aGlzLmlzQWZ0ZXIobG9jYWxGcm9tLCB1bml0cykgOiAhdGhpcy5pc0JlZm9yZShsb2NhbEZyb20sIHVuaXRzKSkgJiZcbiAgICAgICAgICAgIChpbmNsdXNpdml0eVsxXSA9PT0gJyknID8gdGhpcy5pc0JlZm9yZShsb2NhbFRvLCB1bml0cykgOiAhdGhpcy5pc0FmdGVyKGxvY2FsVG8sIHVuaXRzKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNTYW1lIChpbnB1dCwgdW5pdHMpIHtcbiAgICAgICAgdmFyIGxvY2FsSW5wdXQgPSBpc01vbWVudChpbnB1dCkgPyBpbnB1dCA6IGNyZWF0ZUxvY2FsKGlucHV0KSxcbiAgICAgICAgICAgIGlucHV0TXM7XG4gICAgICAgIGlmICghKHRoaXMuaXNWYWxpZCgpICYmIGxvY2FsSW5wdXQuaXNWYWxpZCgpKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpIHx8ICdtaWxsaXNlY29uZCc7XG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21pbGxpc2Vjb25kJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWVPZigpID09PSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlucHV0TXMgPSBsb2NhbElucHV0LnZhbHVlT2YoKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKCkuc3RhcnRPZih1bml0cykudmFsdWVPZigpIDw9IGlucHV0TXMgJiYgaW5wdXRNcyA8PSB0aGlzLmNsb25lKCkuZW5kT2YodW5pdHMpLnZhbHVlT2YoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzU2FtZU9yQWZ0ZXIgKGlucHV0LCB1bml0cykge1xuICAgICAgICByZXR1cm4gdGhpcy5pc1NhbW
21167UoaW5wdXQsIHVuaXRzKSB8fCB0aGlzLmlzQWZ0ZXIoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpc1NhbWVPckJlZm9yZSAoaW5wdXQsIHVuaXRzKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzU2FtZShpbnB1dCwgdW5pdHMpIHx8IHRoaXMuaXNCZWZvcmUoaW5wdXQsIHVuaXRzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBkaWZmIChpbnB1dCwgdW5pdHMsIGFzRmxvYXQpIHtcbiAgICAgICAgdmFyIHRoYXQsXG4gICAgICAgICAgICB6b25lRGVsdGEsXG4gICAgICAgICAgICBvdXRwdXQ7XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoYXQgPSBjbG9uZVdpdGhPZmZzZXQoaW5wdXQsIHRoaXMpO1xuXG4gICAgICAgIGlmICghdGhhdC5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cblxuICAgICAgICB6b25lRGVsdGEgPSAodGhhdC51dGNPZmZzZXQoKSAtIHRoaXMudXRjT2Zmc2V0KCkpICogNmU0O1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOiBvdXRwdXQgPSBtb250aERpZmYodGhpcywgdGhhdCkgLyAxMjsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6IG91dHB1dCA9IG1vbnRoRGlmZih0aGlzLCB0aGF0KTsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzogb3V0cHV0ID0gbW9udGhEaWZmKHRoaXMsIHRoYXQpIC8gMzsgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQpIC8gMWUzOyBicmVhazsgLy8gMTAwMFxuICAgICAgICAgICAgY2FzZSAnbWludXRlJzogb3V0cHV0ID0gKHRoaXMgLSB0aGF0KSAvIDZlNDsgYnJlYWs7IC8vIDEwMDAgKiA2MFxuICAgICAgICAgICAgY2FzZSAnaG91cic6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCkgLyAzNmU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjBcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6IG91dHB1dCA9ICh0aGlzIC0gdGhhdCAtIHpvbmVEZWx0YSkgLyA4NjRlNTsgYnJlYWs7IC8vIDEwMDAgKiA2MCAqIDYwICogMjQsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOiBvdXRwdXQgPSAodGhpcyAtIHRoYXQgLSB6b25lRGVsdGEpIC8gNjA0OGU1OyBicmVhazsgLy8gMTAwMCAqIDYwICogNjAgKiAyNCAqIDcsIG5lZ2F0ZSBkc3RcbiAgICAgICAgICAgIGRlZmF1bHQ6IG91dHB1dCA9IHRoaXMgLSB0aGF0O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGFzRmxvYXQgPyBvdXRwdXQgOiBhYnNGbG9vcihvdXRwdXQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1vbnRoRGlmZiAoYSwgYikge1xuICAgICAgICAvLyBkaWZmZXJlbmNlIGluIG1vbnRoc1xuICAgICAgICB2Y
21167XIgd2hvbGVNb250aERpZmYgPSAoKGIueWVhcigpIC0gYS55ZWFyKCkpICogMTIpICsgKGIubW9udGgoKSAtIGEubW9udGgoKSksXG4gICAgICAgICAgICAvLyBiIGlzIGluIChhbmNob3IgLSAxIG1vbnRoLCBhbmNob3IgKyAxIG1vbnRoKVxuICAgICAgICAgICAgYW5jaG9yID0gYS5jbG9uZSgpLmFkZCh3aG9sZU1vbnRoRGlmZiwgJ21vbnRocycpLFxuICAgICAgICAgICAgYW5jaG9yMiwgYWRqdXN0O1xuXG4gICAgICAgIGlmIChiIC0gYW5jaG9yIDwgMCkge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgLSAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvciAtIGFuY2hvcjIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYW5jaG9yMiA9IGEuY2xvbmUoKS5hZGQod2hvbGVNb250aERpZmYgKyAxLCAnbW9udGhzJyk7XG4gICAgICAgICAgICAvLyBsaW5lYXIgYWNyb3NzIHRoZSBtb250aFxuICAgICAgICAgICAgYWRqdXN0ID0gKGIgLSBhbmNob3IpIC8gKGFuY2hvcjIgLSBhbmNob3IpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy9jaGVjayBmb3IgbmVnYXRpdmUgemVybywgcmV0dXJuIHplcm8gaWYgbmVnYXRpdmUgemVyb1xuICAgICAgICByZXR1cm4gLSh3aG9sZU1vbnRoRGlmZiArIGFkanVzdCkgfHwgMDtcbiAgICB9XG5cbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0ID0gJ1lZWVktTU0tRERUSEg6bW06c3NaJztcbiAgICBob29rcy5kZWZhdWx0Rm9ybWF0VXRjID0gJ1lZWVktTU0tRERUSEg6bW06c3NbWl0nO1xuXG4gICAgZnVuY3Rpb24gdG9TdHJpbmcgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSgpLmxvY2FsZSgnZW4nKS5mb3JtYXQoJ2RkZCBNTU0gREQgWVlZWSBISDptbTpzcyBbR01UXVpaJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9JU09TdHJpbmc
21167oa2VlcE9mZnNldCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgdXRjID0ga2VlcE9mZnNldCAhPT0gdHJ1ZTtcbiAgICAgICAgdmFyIG0gPSB1dGMgPyB0aGlzLmNsb25lKCkudXRjKCkgOiB0aGlzO1xuICAgICAgICBpZiAobS55ZWFyKCkgPCAwIHx8IG0ueWVhcigpID4gOTk5OSkge1xuICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE1vbWVudChtLCB1dGMgPyAnWVlZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZWVktTU0tRERbVF1ISDptbTpzcy5TU1NaJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlzRnVuY3Rpb24oRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcpKSB7XG4gICAgICAgICAgICAvLyBuYXRpdmUgaW1wbGVtZW50YXRpb24gaXMgfjUweCBmYXN0ZXIsIHVzZSBpdCB3aGVuIHdlIGNhblxuICAgICAgICAgICAgaWYgKHV0Yykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSArIHRoaXMudXRjT2Zmc2V0KCkgKiA2MCAqIDEwMDApLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgnWicsIGZvcm1hdE1vbWVudChtLCAnWicpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZm9ybWF0TW9tZW50KG0sIHV0YyA/ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTW1pdJyA6ICdZWVlZLU1NLUREW1RdSEg6bW06c3MuU1NTWicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGEgbW9tZW50IHRoYXQgY2FuXG4gICAgICogYWxzbyBiZSBldmFsdWF0ZWQgdG8gZ2V0IGEgbmV3IG1vbWVudCB3aGljaCBpcyB0aGUgc2FtZVxuICAgICAqXG4gICAgICogQGxpbmsgaHR0cHM6Ly9ub2RlanMub3JnL2Rpc3QvbGF0ZXN0L2RvY3MvYXBpL3V0aWwuaHRtbCN1dGlsX2N1c3RvbV9pbnNwZWN0X2Z1bmN0aW9uX29uX29iamVjdHNcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuICdtb21lbnQuaW52YWxpZCgvKiAnICsgdGhpcy5faSArICcgKi8pJztcbiAgICAgICAgfVxuICAgICAgICB2Y
21167XIgZnVuYyA9ICdtb21lbnQnO1xuICAgICAgICB2YXIgem9uZSA9ICcnO1xuICAgICAgICBpZiAoIXRoaXMuaXNMb2NhbCgpKSB7XG4gICAgICAgICAgICBmdW5jID0gdGhpcy51dGNPZmZzZXQoKSA9PT0gMCA/ICdtb21lbnQudXRjJyA6ICdtb21lbnQucGFyc2Vab25lJztcbiAgICAgICAgICAgIHpvbmUgPSAnWic7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHByZWZpeCA9ICdbJyArIGZ1bmMgKyAnKFwiXSc7XG4gICAgICAgIHZhciB5ZWFyID0gKDAgPD0gdGhpcy55ZWFyKCkgJiYgdGhpcy55ZWFyKCkgPD0gOTk5OSkgPyAnWVlZWScgOiAnWVlZWVlZJztcbiAgICAgICAgdmFyIGRhdGV0aW1lID0gJy1NTS1ERFtUXUhIOm1tOnNzLlNTUyc7XG4gICAgICAgIHZhciBzdWZmaXggPSB6b25lICsgJ1tcIildJztcblxuICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXQocHJlZml4ICsgeWVhciArIGRhdGV0aW1lICsgc3VmZml4KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBmb3JtYXQgKGlucHV0U3RyaW5nKSB7XG4gICAgICAgIGlmICghaW5wdXRTdHJpbmcpIHtcbiAgICAgICAgICAgIGlucHV0U3RyaW5nID0gdGhpcy5pc1V0YygpID8gaG9va3MuZGVmYXVsdEZvcm1hdFV0YyA6IGhvb2tzLmRlZmF1bHRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIG91dHB1dCA9IGZvcm1hdE1vbWVudCh0aGlzLCBpbnB1dFN0cmluZyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5wb3N0Zm9ybWF0KG91dHB1dCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbSAodGltZSwgd2l0aG91dFN1ZmZpeCkge1xuICAgICAgICBpZiAodGhpcy5pc1ZhbGlkKCkgJiZcbiAgICAgICAgICAgICAgICAoKGlzTW9tZW50KHRpbWUpICYmIHRpbWUuaXNWYWxpZCgpKSB8fFxuICAgICAgICAgICAgICAgICBjcmVhdGVMb2NhbCh0aW1lKS5pc1ZhbGlkKCkpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24oe3RvOiB0aGlzLCBmcm9tOiB0aW1lfSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCF3aXRob3V0U3VmZml4KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZnJvbU5vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy5mcm9tKGNyZWF0ZUxvY2FsKCksIHdpdGhvdXRTdWZmaXgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvICh0aW1lLCB3aXRob3V0U3VmZml4KSB7XG4gICAgICAgIGlmICh0aGlzLmlzVmFsaWQoKSAmJlxuICAgICAgICAgICAgICAgICgoaXNNb21lbnQodGltZSkgJiYgdGltZS5pc1ZhbGlkKCkpIHx8XG4gICAgICAgICAgICAgICAgIGNyZWF0ZUxvY2FsKHRpbWUpLmlzVmFsaWQoKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbih7ZnJvbTogdGhpcywgdG86IHRpbWV9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIXdpdGhvdXRTdWZmaXgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b05vdyAod2l0aG91dFN1ZmZpeCkge1xuICAgICAgICByZXR1cm4gdGhpcy50byhjcmVhdGVMb2NhbCgpLCB3aXRob3V0U3VmZml4KTtcbiAgICB9XG5cbiAgICAvLyBJZiBwYXNzZWQgYSBsb2NhbGUga2V5LCBpdCB3aWxsIHNldCB0aGUgbG9jYWxlIGZvciB0aGlzXG4gICAgLy8gaW5zdGFuY2UuICBPdGhlcndpc2UsIGl0IHdpbGwgcmV0dXJuIHRoZSBsb2NhbGUgY29uZmlndXJhdGlvblxuICAgIC8vIHZhcmlhYmxlcyBmb3IgdGhpcyBpbnN0YW5jZS5cbiAgICBmdW5jdGlvbiBsb2NhbGUgKGtleSkge1xuICAgICAgICB2Y
21167XIgbmV3TG9jYWxlRGF0YTtcblxuICAgICAgICBpZiAoa2V5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGUuX2FiYnI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdMb2NhbGVEYXRhID0gZ2V0TG9jYWxlKGtleSk7XG4gICAgICAgICAgICBpZiAobmV3TG9jYWxlRGF0YSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gbmV3TG9jYWxlRGF0YTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGxhbmcgPSBkZXByZWNhdGUoXG4gICAgICAgICdtb21lbnQoKS5sYW5nKCkgaXMgZGVwcmVjYXRlZC4gSW5zdGVhZCwgdXNlIG1vbWVudCgpLmxvY2FsZURhdGEoKSB0byBnZXQgdGhlIGxhbmd1YWdlIGNvbmZpZ3VyYXRpb24uIFVzZSBtb21lbnQoKS5sb2NhbGUoKSB0byBjaGFuZ2UgbGFuZ3VhZ2VzLicsXG4gICAgICAgIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgICAgIGlmIChrZXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxlKGtleSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgZnVuY3Rpb24gbG9jYWxlRGF0YSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gICAgfVxuXG4gICAgdmFyIE1TX1BFUl9TRUNPTkQgPSAxMDAwO1xuICAgIHZhciBNU19QRVJfTUlOVVRFID0gNjAgKiBNU19QRVJfU0VDT05EO1xuICAgIHZhciBNU19QRVJfSE9VUiA9IDYwICogTVNfUEVSX01JTlVURTtcbiAgICB2YXIgTVNfUEVSXzQwMF9ZRUFSUyA9ICgzNjUgKiA0MDAgKyA5NykgKiAyNCAqIE1TX1BFUl9IT1VSO1xuXG4gICAgLy8gYWN0dWFsIG1vZHVsbyAtIGhhbmRsZXMgbmVnYXRpdmUgbnVtYmVycyAoZm9yIGRhdGVzIGJlZm9yZSAxOTcwKTpcbiAgICBmdW5jdGlvbiBtb2QkMShkaXZpZGVuZCwgZGl2aXNvcikge1xuICAgICAgICByZXR1cm4gKGRpdmlkZW5kICUgZGl2aXNvciArIGRpdmlzb3IpICUgZGl2aXNvcjtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsb2NhbFN0YXJ0T2ZEYXRlKHksIG0sIGQpIHtcbiAgICAgICAgLy8gdGhlIGRhdGUgY29uc3RydWN0b3IgcmVtYXBzIHllYXJzIDAtOTkgdG8gMTkwMC0xOTk5XG4gICAgICAgIGlmICh5IDwgMTAwICYmIHkgPj0gMCkge1xuICAgICAgICAgICAgLy8gcHJlc2VydmUgbGVhcCB5ZWFycyB1c2luZyBhIGZ1bGwgNDAwIHllYXIgY3ljbGUsIHRoZW4gcmVzZXRcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5ICsgNDAwLCBtLCBkKSAtIE1TX1BFUl80MDBfWUVBUlM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoeSwgbSwgZCkudmFsdWVPZigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdXRjU3RhcnRPZkRhdGUoeSwgbSwgZCkge1xuICAgICAgICAvLyBEYXRlLlVUQyByZW1hcHMgeWVhcnMgMC05OSB0byAxOTAwLTE5OTlcbiAgICAgICAgaWYgKHkgPCAxMDAgJiYgeSA+PSAwKSB7XG4gICAgICAgICAgICAvLyBwcmVzZXJ2ZSBsZWFwIHllYXJzIHVzaW5nIGEgZnVsbCA0MDAgeWVhciBjeWNsZSwgdGhlbiByZXNldFxuICAgICAgICAgICAgcmV0dXJuIERhdGUuVVRDKHkgKyA0MDAsIG0sIGQpIC0gTVNfUEVSXzQwMF9ZRUFSUztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLlVUQyh5LCBtLCBkKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0YXJ0T2YgKHVuaXRzKSB7XG4gICAgICAgIHZhciB0aW1lO1xuICAgICAgICB1bml0cyA9IG5vcm1hbGl6ZVVuaXRzKHVuaXRzKTtcbiAgICAgICAgaWYgKHVuaXRzID09PSB1bmRlZmluZWQgfHwgdW5pdHMgPT09ICdtaWxsaXNlY29uZCcgfHwgIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBzdGFydE9mRGF0ZSA9IHRoaXMuX2lzVVRDID8gdXRjU3RhcnRPZkRhdGUgOiBsb2NhbFN0YXJ0T2ZEYXRlO1xuXG4gICAgICAgIHN3aXRjaCAodW5pdHMpIHtcbiAgICAgICAgICAgIGNhc2UgJ3llYXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgMCwgMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSAtIHRoaXMubW9udGgoKSAlIDMsIDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbW9udGgnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCAxKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtIHRoaXMud2Vla2RheSgpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2RheSc6XG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnaG91cic6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgIHRpbWUgLT0gbW9kJDEodGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksIE1TX1BFUl9IT1VSKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ21pbnV0ZSc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHRoaXMuX2QudmFsdWVPZigpO1xuICAgICAgICAgICAgICAgI
21167HRpbWUgLT0gbW9kJDEodGltZSwgTVNfUEVSX01JTlVURSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lIC09IG1vZCQxKHRpbWUsIE1TX1BFUl9TRUNPTkQpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fZC5zZXRUaW1lKHRpbWUpO1xuICAgICAgICBob29rcy51cGRhdGVPZmZzZXQodGhpcywgdHJ1ZSk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGVuZE9mICh1bml0cykge1xuICAgICAgICB2YXIgdGltZTtcbiAgICAgICAgdW5pdHMgPSBub3JtYWxpemVVbml0cyh1bml0cyk7XG4gICAgICAgIGlmICh1bml0cyA9PT0gdW5kZWZpbmVkIHx8IHVuaXRzID09PSAnbWlsbGlzZWNvbmQnIHx8ICF0aGlzLmlzVmFsaWQoKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgc3RhcnRPZkRhdGUgPSB0aGlzLl9pc1VUQyA/IHV0Y1N0YXJ0T2ZEYXRlIDogbG9jYWxTdGFydE9mRGF0ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICBjYXNlICd5ZWFyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCkgKyAxLCAwLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdxdWFydGVyJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSAtIHRoaXMubW9udGgoKSAlIDMgKyAzLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgICAgICAgdGltZSA9IHN0YXJ0T2ZEYXRlKHRoaXMueWVhcigpLCB0aGlzLm1vbnRoKCkgKyAxLCAxKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3ZWVrJzpcbiAgICAgICAgICAgICAgICB0aW1lID0gc3RhcnRPZkRhdGUodGhpcy55ZWFyKCksIHRoaXMubW9udGgoKSwgdGhpcy5kYXRlKCkgLSB0aGlzLndlZWtkYXkoKSArIDcpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2lzb1dlZWsnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSAtICh0aGlzLmlzb1dlZWtkYXkoKSAtIDEpICsgNykgLSAxO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnZGF5JzpcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSBzdGFydE9mRGF0ZSh0aGlzLnllYXIoKSwgdGhpcy5tb250aCgpLCB0aGlzLmRhdGUoKSArIDEpIC0gMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvdXInOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9IT1VSIC0gbW9kJDEodGltZSArICh0aGlzLl9pc1VUQyA/IDAgOiB0aGlzLnV0Y09mZnNldCgpICogTVNfUEVSX01JTlVURSksIE1TX1BFUl9IT1VSKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdtaW51dGUnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9NSU5VVEUgLSBtb2QkMSh0aW1lLCBNU19QRVJfTUlOVVRFKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdzZWNvbmQnOlxuICAgICAgICAgICAgICAgIHRpbWUgPSB0aGlzLl9kLnZhbHVlT2YoKTtcbiAgICAgICAgICAgICAgICB0aW1lICs9IE1TX1BFUl9TRUNPTkQgLSBtb2QkMSh0aW1lLCBNU19QRVJfU0VDT05EKSAtIDE7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9kLnNldFRpbWUodGltZSk7XG4gICAgICAgIGhvb2tzLnVwZGF0ZU9mZnNldCh0aGlzLCB0cnVlKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdmFsdWVPZiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9kLnZhbHVlT2YoKSAtICgodGhpcy5fb2Zmc2V0IHx8IDApICogNjAwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVuaXggKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvRGF0ZSAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZSh0aGlzLnZhbHVlT2YoKSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9BcnJheSAoKSB7XG4gICAgICAgIHZhciBtID0gdGhpcztcbiAgICAgICAgcmV0dXJuIFttLnllYXIoKSwgbS5tb250aCgpLCBtLmRhdGUoKSwgbS5ob3VyKCksIG0ubWludXRlKCksIG0uc2Vjb25kKCksIG0ubWlsbGlzZWNvbmQoKV07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdG9PYmplY3QgKCkge1xuICAgICAgICB2Y
21167XIgbSA9IHRoaXM7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB5ZWFyczogbS55ZWFyKCksXG4gICAgICAgICAgICBtb250aHM6IG0ubW9udGgoKSxcbiAgICAgICAgICAgIGRhdGU6IG0uZGF0ZSgpLFxuICAgICAgICAgICAgaG91cnM6IG0uaG91cnMoKSxcbiAgICAgICAgICAgIG1pbnV0ZXM6IG0ubWludXRlcygpLFxuICAgICAgICAgICAgc2Vjb25kczogbS5zZWNvbmRzKCksXG4gICAgICAgICAgICBtaWxsaXNlY29uZHM6IG0ubWlsbGlzZWNvbmRzKClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiB0b0pTT04gKCkge1xuICAgICAgICAvLyBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgICAgIHJldHVybiB0aGlzLmlzVmFsaWQoKSA/IHRoaXMudG9JU09TdHJpbmcoKSA6IG51bGw7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gaXNWYWxpZCQyICgpIHtcbiAgICAgICAgcmV0dXJuIGlzVmFsaWQodGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcGFyc2luZ0ZsYWdzICgpIHtcbiAgICAgICAgcmV0dXJuIGV4dGVuZCh7fSwgZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbnZhbGlkQXQgKCkge1xuICAgICAgICByZXR1cm4gZ2V0UGFyc2luZ0ZsYWdzKHRoaXMpLm92ZXJmbG93O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0aW9uRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlucHV0OiB0aGlzLl9pLFxuICAgICAgICAgICAgZm9ybWF0OiB0aGlzLl9mLFxuICAgICAgICAgICAgbG9jYWxlOiB0aGlzLl9sb2NhbGUsXG4gICAgICAgICAgICBpc1VUQzogdGhpcy5faXNVVEMsXG4gICAgICAgICAgICBzdHJpY3Q6IHRoaXMuX3N0cmljdFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnZ2cnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy53ZWVrWWVhcigpICUgMTAwO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydHRycsIDJdLCAwLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzb1dlZWtZZWFyKCkgJSAxMDA7XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBhZGRXZWVrWWVhckZvcm1hdFRva2VuICh0b2tlbiwgZ2V0dGVyKSB7XG4gICAgICAgIGFkZEZvcm1hdFRva2VuKDAsIFt0b2tlbiwgdG9rZW4ubGVuZ3RoXSwgMCwgZ2V0dGVyKTtcbiAgICB9XG5cbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdnZ2dnJywgICAgICd3ZWVrWWVhcicpO1xuICAgIGFkZFdlZWtZZWFyRm9ybWF0VG9rZW4oJ2dnZ2dnJywgICAgJ3dlZWtZZWFyJyk7XG4gICAgYWRkV2Vla1llYXJGb3JtYXRUb2tlbignR0dHRycsICAnaXNvV2Vla1llYXInKTtcbiAgICBhZGRXZWVrWWVhckZvcm1hdFRva2VuKCdHR0dHRycsICdpc29XZWVrWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCd3ZWVrWWVhcicsICdnZycpO1xuICAgIGFkZFVuaXRBbGlhcygnaXNvV2Vla1llYXInLCAnR0cnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3dlZWtZZWFyJywgMSk7XG4gICAgYWRkVW5pdFByaW9yaXR5KCdpc29XZWVrWWVhcicsIDEpO1xuXG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdHJywgICAgICBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignZycsICAgICAgbWF0Y2hTaWduZWQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ0dHJywgICAgIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdnZycsICAgICBtYXRjaDF0bzIsIG1hdGNoMik7XG4gICAgYWRkUmVnZXhUb2tlbignR0dHRycsICAgbWF0Y2gxdG80LCBtYXRjaDQpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ2dnZ2cnLCAgIG1hdGNoMXRvNCwgbWF0Y2g0KTtcbiAgICBhZGRSZWdleFRva2VuKCdHR0dHRycsICBtYXRjaDF0bzYsIG1hdGNoNik7XG4gICAgYWRkUmVnZXhUb2tlbignZ2dnZ2cnLCAgbWF0Y2gxdG82LCBtYXRjaDYpO1xuXG4gICAgYWRkV2Vla1BhcnNlVG9rZW4oWydnZ2dnJywgJ2dnZ2dnJywgJ0dHR0cnLCAnR0dHR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW4uc3Vic3RyKDAsIDIpXSA9IHRvSW50KGlucHV0KTtcbiAgICB9KTtcblxuICAgIGFkZFdlZWtQYXJzZVRva2VuKFsnZ2cnLCAnR0cnXSwgZnVuY3Rpb24gKGlucHV0LCB3ZWVrLCBjb25maWcsIHRva2VuKSB7XG4gICAgICAgIHdlZWtbdG9rZW5dID0gaG9va3MucGFyc2VUd29EaWdpdFllYXIoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0V2Vla1llYXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrKCksXG4gICAgICAgICAgICAgICAgdGhpcy53ZWVrZGF5KCksXG4gICAgICAgICAgICAgICAgdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWsuZG93LFxuICAgICAgICAgICAgICAgIHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRveSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0U2V0SVNPV2Vla1llYXIgKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBnZXRTZXRXZWVrWWVhckhlbHBlci5jYWxsKHRoaXMsXG4gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMuaXNvV2VlaygpLCB0aGlzLmlzb1dlZWtkYXkoKSwgMSwgNCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0SVNPV2Vla3NJblllYXIgKCkge1xuICAgICAgICByZXR1cm4gd2Vla3NJblllYXIodGhpcy55ZWFyKCksIDEsIDQpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFdlZWtzSW5ZZWFyICgpIHtcbiAgICAgICAgdmFyIHdlZWtJbmZvID0gdGhpcy5sb2NhbGVEYXRhKCkuX3dlZWs7XG4gICAgICAgIHJldHVybiB3ZWVrc0luWWVhcih0aGlzLnllYXIoKSwgd2Vla0luZm8uZG93LCB3ZWVrSW5mby5kb3kpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFNldFdlZWtZZWFySGVscGVyKGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2Y
21167XIgd2Vla3NUYXJnZXQ7XG4gICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gd2Vla09mWWVhcih0aGlzLCBkb3csIGRveSkueWVhcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdlZWtzVGFyZ2V0ID0gd2Vla3NJblllYXIoaW5wdXQsIGRvdywgZG95KTtcbiAgICAgICAgICAgIGlmICh3ZWVrID4gd2Vla3NUYXJnZXQpIHtcbiAgICAgICAgICAgICAgICB3ZWVrID0gd2Vla3NUYXJnZXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gc2V0V2Vla0FsbC5jYWxsKHRoaXMsIGlucHV0LCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRXZWVrQWxsKHdlZWtZZWFyLCB3ZWVrLCB3ZWVrZGF5LCBkb3csIGRveSkge1xuICAgICAgICB2YXIgZGF5T2ZZZWFyRGF0YSA9IGRheU9mWWVhckZyb21XZWVrcyh3ZWVrWWVhciwgd2Vlaywgd2Vla2RheSwgZG93LCBkb3kpLFxuICAgICAgICAgICAgZGF0ZSA9IGNyZWF0ZVVUQ0RhdGUoZGF5T2ZZZWFyRGF0YS55ZWFyLCAwLCBkYXlPZlllYXJEYXRhLmRheU9mWWVhcik7XG5cbiAgICAgICAgdGhpcy55ZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSk7XG4gICAgICAgIHRoaXMubW9udGgoZGF0ZS5nZXRVVENNb250aCgpKTtcbiAgICAgICAgdGhpcy5kYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1EnLCAwLCAnUW8nLCAncXVhcnRlcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdxdWFydGVyJywgJ1EnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ3F1YXJ0ZXInLCA3KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ1EnLCBtYXRjaDEpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ1EnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5KSB7XG4gICAgICAgIGFycmF5W01PTlRIXSA9ICh0b0ludChpbnB1dCkgLSAxKSAqIDM7XG4gICAgfSk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICBmdW5jdGlvbiBnZXRTZXRRdWFydGVyIChpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IE1hdGguY2VpbCgodGhpcy5tb250aCgpICsgMSkgLyAzKSA6IHRoaXMubW9udGgoKGlucHV0IC0gMSkgKiAzICsgdGhpcy5tb250aCgpICUgMyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ0QnLCBbJ0REJywgMl0sICdEbycsICdkYXRlJyk7XG5cbiAgICAvLyBBTElBU0VTXG5cbiAgICBhZGRVbml0QWxpYXMoJ2RhdGUnLCAnRCcpO1xuXG4gICAgLy8gUFJJT1JJVFlcbiAgICBhZGRVbml0UHJpb3JpdHkoJ2RhdGUnLCA5KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ0QnLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdERCcsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRSZWdleFRva2VuKCdEbycsIGZ1bmN0aW9uIChpc1N0cmljdCwgbG9jYWxlKSB7XG4gICAgICAgIC8vIFRPRE86IFJlbW92ZSBcIm9yZGluYWxQYXJzZVwiIGZhbGxiYWNrIGluIG5leHQgbWFqb3IgcmVsZWFzZS5cbiAgICAgICAgcmV0dXJuIGlzU3RyaWN0ID9cbiAgICAgICAgICAobG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlIHx8IGxvY2FsZS5fb3JkaW5hbFBhcnNlKSA6XG4gICAgICAgICAgbG9jYWxlLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudDtcbiAgICB9KTtcblxuICAgIGFkZFBhcnNlVG9rZW4oWydEJywgJ0REJ10sIERBVEUpO1xuICAgIGFkZFBhcnNlVG9rZW4oJ0RvJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtEQVRFXSA9IHRvSW50KGlucHV0Lm1hdGNoKG1hdGNoMXRvMilbMF0pO1xuICAgIH0pO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldERheU9mTW9udGggPSBtYWtlR2V0U2V0KCdEYXRlJywgdHJ1ZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbignREREJywgWydEREREJywgM10sICdERERvJywgJ2RheU9mWWVhcicpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdkYXlPZlllYXInLCAnREREJyk7XG5cbiAgICAvLyBQUklPUklUWVxuICAgIGFkZFVuaXRQcmlvcml0eSgnZGF5T2ZZZWFyJywgNCk7XG5cbiAgICAvLyBQQVJTSU5HXG5cbiAgICBhZGRSZWdleFRva2VuKCdEREQnLCAgbWF0Y2gxdG8zKTtcbiAgICBhZGRSZWdleFRva2VuKCdEREREJywgbWF0Y2gzKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnREREJywgJ0REREQnXSwgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZGF5T2ZZZWFyID0gdG9JbnQoaW5wdXQpO1xuICAgIH0pO1xuXG4gICAgLy8gSEVMUEVSU1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0U2V0RGF5T2ZZZWFyIChpbnB1dCkge1xuICAgICAgICB2Y
21167XIgZGF5T2ZZZWFyID0gTWF0aC5yb3VuZCgodGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ2RheScpIC0gdGhpcy5jbG9uZSgpLnN0YXJ0T2YoJ3llYXInKSkgLyA4NjRlNSkgKyAxO1xuICAgICAgICByZXR1cm4gaW5wdXQgPT0gbnVsbCA/IGRheU9mWWVhciA6IHRoaXMuYWRkKChpbnB1dCAtIGRheU9mWWVhciksICdkJyk7XG4gICAgfVxuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ20nLCBbJ21tJywgMl0sIDAsICdtaW51dGUnKTtcblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWludXRlJywgJ20nKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbnV0ZScsIDE0KTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ20nLCAgbWF0Y2gxdG8yKTtcbiAgICBhZGRSZWdleFRva2VuKCdtbScsIG1hdGNoMXRvMiwgbWF0Y2gyKTtcbiAgICBhZGRQYXJzZVRva2VuKFsnbScsICdtbSddLCBNSU5VVEUpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgdmFyIGdldFNldE1pbnV0ZSA9IG1ha2VHZXRTZXQoJ01pbnV0ZXMnLCBmYWxzZSk7XG5cbiAgICAvLyBGT1JNQVRUSU5HXG5cbiAgICBhZGRGb3JtYXRUb2tlbigncycsIFsnc3MnLCAyXSwgMCwgJ3NlY29uZCcpO1xuXG4gICAgLy8gQUxJQVNFU1xuXG4gICAgYWRkVW5pdEFsaWFzKCdzZWNvbmQnLCAncycpO1xuXG4gICAgLy8gUFJJT1JJVFlcblxuICAgIGFkZFVuaXRQcmlvcml0eSgnc2Vjb25kJywgMTUpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbigncycsICBtYXRjaDF0bzIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ3NzJywgbWF0Y2gxdG8yLCBtYXRjaDIpO1xuICAgIGFkZFBhcnNlVG9rZW4oWydzJywgJ3NzJ10sIFNFQ09ORCk7XG5cbiAgICAvLyBNT01FTlRTXG5cbiAgICB2YXIgZ2V0U2V0U2Vjb25kID0gbWFrZUdldFNldCgnU2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCdTJywgMCwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTAwKTtcbiAgICB9KTtcblxuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1MnLCAyXSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gfn4odGhpcy5taWxsaXNlY29uZCgpIC8gMTApO1xuICAgIH0pO1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1MnLCAzXSwgMCwgJ21pbGxpc2Vjb25kJyk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTJywgNF0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1MnLCA1XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTJywgNl0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDA7XG4gICAgfSk7XG4gICAgYWRkRm9ybWF0VG9rZW4oMCwgWydTU1NTU1NTJywgN10sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1MnLCA4XSwgMCwgZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taWxsaXNlY29uZCgpICogMTAwMDAwO1xuICAgIH0pO1xuICAgIGFkZEZvcm1hdFRva2VuKDAsIFsnU1NTU1NTU1NTJywgOV0sIDAsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWlsbGlzZWNvbmQoKSAqIDEwMDAwMDA7XG4gICAgfSk7XG5cblxuICAgIC8vIEFMSUFTRVNcblxuICAgIGFkZFVuaXRBbGlhcygnbWlsbGlzZWNvbmQnLCAnbXMnKTtcblxuICAgIC8vIFBSSU9SSVRZXG5cbiAgICBhZGRVbml0UHJpb3JpdHkoJ21pbGxpc2Vjb25kJywgMTYpO1xuXG4gICAgLy8gUEFSU0lOR1xuXG4gICAgYWRkUmVnZXhUb2tlbignUycsICAgIG1hdGNoMXRvMywgbWF0Y2gxKTtcbiAgICBhZGRSZWdleFRva2VuKCdTUycsICAgbWF0Y2gxdG8zLCBtYXRjaDIpO1xuICAgIGFkZFJlZ2V4VG9rZW4oJ1NTUycsICBtYXRjaDF0bzMsIG1hdGNoMyk7XG5cbiAgICB2YXIgdG9rZW47XG4gICAgZm9yICh0b2tlbiA9ICdTU1NTJzsgdG9rZW4ubGVuZ3RoIDw9IDk7IHRva2VuICs9ICdTJykge1xuICAgICAgICBhZGRSZWdleFRva2VuKHRva2VuLCBtYXRjaFVuc2lnbmVkKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBwYXJzZU1zKGlucHV0LCBhcnJheSkge1xuICAgICAgICBhcnJheVtNSUxMSVNFQ09ORF0gPSB0b0ludCgoJzAuJyArIGlucHV0KSAqIDEwMDApO1xuICAgIH1cblxuICAgIGZvciAodG9rZW4gPSAnUyc7IHRva2VuLmxlbmd0aCA8PSA5OyB0b2tlbiArPSAnUycpIHtcbiAgICAgICAgYWRkUGFyc2VUb2tlbih0b2tlbiwgcGFyc2VNcyk7XG4gICAgfVxuICAgIC8vIE1PTUVOVFNcblxuICAgIHZhciBnZXRTZXRNaWxsaXNlY29uZCA9IG1ha2VHZXRTZXQoJ01pbGxpc2Vjb25kcycsIGZhbHNlKTtcblxuICAgIC8vIEZPUk1BVFRJTkdcblxuICAgIGFkZEZvcm1hdFRva2VuKCd6JywgIDAsIDAsICd6b25lQWJicicpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd6eicsIDAsIDAsICd6b25lTmFtZScpO1xuXG4gICAgLy8gTU9NRU5UU1xuXG4gICAgZnVuY3Rpb24gZ2V0Wm9uZUFiYnIgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5faXNVVEMgPyAnVVRDJyA6ICcnO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFpvbmVOYW1lICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lzVVRDID8gJ0Nvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lJyA6ICcnO1xuICAgIH1cblxuICAgIHZhciBwcm90byA9IE1vbWVudC5wcm90b3R5cGU7XG5cbiAgICBwcm90by5hZGQgICAgICAgICAgICAgICA9IGFkZDtcbiAgICBwcm90by5jYWxlbmRhciAgICAgICAgICA9IGNhbGVuZGFyJDE7XG4gICAgcHJvdG8uY2xvbmUgICAgICAgICAgICAgPSBjbG9uZTtcbiAgICBwcm90by5kaWZmICAgICAgICAgICAgICA9IGRpZmY7XG4gICAgcHJvdG8uZW5kT2YgICAgICAgICAgICAgPSBlbmRPZjtcbiAgICBwcm90by5mb3JtYXQgICAgICAgICAgICA9IGZvcm1hdDtcbiAgICBwcm90by5mcm9tICAgICAgICAgICAgICA9IGZyb207XG4gICAgcHJvdG8uZnJvbU5vdyAgICAgICAgICAgPSBmcm9tTm93O1xuICAgIHByb3RvLnRvICAgICAgICAgICAgICAgID0gdG87XG4gICAgcHJvdG8udG9Ob3cgICAgICAgICAgICAgPSB0b05vdztcbiAgICBwcm90by5nZXQgICAgICAgICAgICAgICA9IHN0cmluZ0dldDtcbiAgICBwcm90by5pbnZhbGlkQXQgICAgICAgICA9IGludmFsaWRBdDtcbiAgICBwcm90by5pc0FmdGVyICAgICAgICAgICA9IGlzQWZ0ZXI7XG4gICAgcHJvdG8uaXNCZWZvcmUgICAgICAgICAgPSBpc0JlZm9yZTtcbiAgICBwcm90by5pc0JldHdlZW4gICAgICAgICA9IGlzQmV0d2VlbjtcbiAgICBwcm90by5pc1NhbW
21167UgICAgICAgICAgICA9IGlzU2FtZTtcbiAgICBwcm90by5pc1NhbWVPckFmdGVyICAgICA9IGlzU2FtZU9yQWZ0ZXI7XG4gICAgcHJvdG8uaXNTYW1lT3JCZWZvcmUgICAgPSBpc1NhbWVPckJlZm9yZTtcbiAgICBwcm90by5pc1ZhbGlkICAgICAgICAgICA9IGlzVmFsaWQkMjtcbiAgICBwcm90by5sYW5nICAgICAgICAgICAgICA9IGxhbmc7XG4gICAgcHJvdG8ubG9jYWxlICAgICAgICAgICAgPSBsb2NhbGU7XG4gICAgcHJvdG8ubG9jYWxlRGF0YSAgICAgICAgPSBsb2NhbGVEYXRhO1xuICAgIHByb3RvLm1heCAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWF4O1xuICAgIHByb3RvLm1pbiAgICAgICAgICAgICAgID0gcHJvdG90eXBlTWluO1xuICAgIHByb3RvLnBhcnNpbmdGbGFncyAgICAgID0gcGFyc2luZ0ZsYWdzO1xuICAgIHByb3RvLnNldCAgICAgICAgICAgICAgID0gc3RyaW5nU2V0O1xuICAgIHByb3RvLnN0YXJ0T2YgICAgICAgICAgID0gc3RhcnRPZjtcbiAgICBwcm90by5zdWJ0cmFjdCAgICAgICAgICA9IHN1YnRyYWN0O1xuICAgIHByb3RvLnRvQXJyYXkgICAgICAgICAgID0gdG9BcnJheTtcbiAgICBwcm90by50b09iamVjdCAgICAgICAgICA9IHRvT2JqZWN0O1xuICAgIHByb3RvLnRvRGF0ZSAgICAgICAgICAgID0gdG9EYXRlO1xuICAgIHByb3RvLnRvSVNPU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmc7XG4gICAgcHJvdG8uaW5zcGVjdCAgICAgICAgICAgPSBpbnNwZWN0O1xuICAgIHByb3RvLnRvSlNPTiAgICAgICAgICAgID0gdG9KU09OO1xuICAgIHByb3RvLnRvU3RyaW5nICAgICAgICAgID0gdG9TdHJpbmc7XG4gICAgcHJvdG8udW5peCAgICAgICAgICAgICAgPSB1bml4O1xuICAgIHByb3RvLnZhbHVlT2YgICAgICAgICAgID0gdmFsdWVPZjtcbiAgICBwcm90by5jcmVhdGlvbkRhdGEgICAgICA9IGNyZWF0aW9uRGF0YTtcbiAgICBwcm90by55ZWFyICAgICAgID0gZ2V0U2V0WWVhcjtcbiAgICBwcm90by5pc0xlYXBZZWFyID0gZ2V0SXNMZWFwWWVhcjtcbiAgICBwcm90by53ZWVrWWVhciAgICA9IGdldFNldFdlZWtZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtZZWFyID0gZ2V0U2V0SVNPV2Vla1llYXI7XG4gICAgcHJvdG8ucXVhcnRlciA9IHByb3RvLnF1YXJ0ZXJzID0gZ2V0U2V0UXVhcnRlcjtcbiAgICBwcm90by5tb250aCAgICAgICA9IGdldFNldE1vbnRoO1xuICAgIHByb3RvLmRheXNJbk1vbnRoID0gZ2V0RGF5c0luTW9udGg7XG4gICAgcHJvdG8ud2VlayAgICAgICAgICAgPSBwcm90by53ZWVrcyAgICAgICAgPSBnZXRTZXRXZWVrO1xuICAgIHByb3RvLmlzb1dlZWsgICAgICAgID0gcHJvdG8uaXNvV2Vla3MgICAgID0gZ2V0U2V0SVNPV2VlaztcbiAgICBwcm90by53ZWVrc0luWWVhciAgICA9IGdldFdlZWtzSW5ZZWFyO1xuICAgIHByb3RvLmlzb1dlZWtzSW5ZZWFyID0gZ2V0SVNPV2Vla3NJblllYXI7XG4gICAgcHJvdG8uZGF0ZSAgICAgICA9IGdldFNldERheU9mTW9udGg7XG4gICAgcHJvdG8uZGF5ICAgICAgICA9IHByb3RvLmRheXMgICAgICAgICAgICAgPSBnZXRTZXREYXlPZldlZWs7XG4gICAgcHJvdG8ud2Vla2RheSAgICA9IGdldFNldExvY2FsZURheU9mV2VlaztcbiAgICBwcm90by5pc29XZWVrZGF5ID0gZ2V0U2V0SVNPRGF5T2ZXZWVrO1xuICAgIHByb3RvLmRheU9mWWVhciAgPSBnZXRTZXREYXlPZlllYXI7XG4gICAgcHJvdG8uaG91ciA9IHByb3RvLmhvdXJzID0gZ2V0U2V0SG91cjtcbiAgICBwcm90by5taW51dGUgPSBwcm90by5taW51dGVzID0gZ2V0U2V0TWludXRlO1xuICAgIHByb3RvLnNlY29uZCA9IHByb3RvLnNlY29uZHMgPSBnZXRTZXRTZWNvbmQ7XG4gICAgcHJvdG8ubWlsbGlzZWNvbmQgPSBwcm90by5taWxsaXNlY29uZHMgPSBnZXRTZXRNaWxsaXNlY29uZDtcbiAgICBwcm90by51dGNPZmZzZXQgICAgICAgICAgICA9IGdldFNldE9mZnNldDtcbiAgICBwcm90by51dGMgICAgICAgICAgICAgICAgICA9IHNldE9mZnNldFRvVVRDO1xuICAgIHByb3RvLmxvY2FsICAgICAgICAgICAgICAgID0gc2V0T2Zmc2V0VG9Mb2NhbDtcbiAgICBwcm90by5wYXJzZVpvbmUgICAgICAgICAgICA9IHNldE9mZnNldFRvUGFyc2VkT2Zmc2V0O1xuICAgIHByb3RvLmhhc0FsaWduZWRIb3VyT2Zmc2V0ID0gaGFzQWxpZ25lZEhvdXJPZmZzZXQ7XG4gICAgcHJvdG8uaXNEU1QgICAgICAgICAgICAgICAgPSBpc0RheWxpZ2h0U2F2aW5nVGltZTtcbiAgICBwcm90by5pc0xvY2FsICAgICAgICAgICAgICA9IGlzTG9jYWw7XG4gICAgcHJvdG8uaXNVdGNPZmZzZXQgICAgICAgICAgPSBpc1V0Y09mZnNldDtcbiAgICBwcm90by5pc1V0YyAgICAgICAgICAgICAgICA9IGlzVXRjO1xuICAgIHByb3RvLmlzVVRDICAgICAgICAgICAgICAgID0gaXNVdGM7XG4gICAgcHJvdG8uem9uZUFiYnIgPSBnZXRab25lQWJicjtcbiAgICBwcm90by56b25lTmFtZSA9IGdldFpvbmVOYW1lO1xuICAgIHByb3RvLmRhdGVzICA9IGRlcHJlY2F0ZSgnZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC4nLCBnZXRTZXREYXlPZk1vbnRoKTtcbiAgICBwcm90by5tb250aHMgPSBkZXByZWNhdGUoJ21vbnRocyBhY2Nlc3NvciBpcyBkZXByZWNhdGVkLiBVc2UgbW9udGggaW5zdGVhZCcsIGdldFNldE1vbnRoKTtcbiAgICBwcm90by55ZWFycyAgPSBkZXByZWNhdGUoJ3llYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWQnLCBnZXRTZXRZZWFyKTtcbiAgICBwcm90by56b25lICAgPSBkZXByZWNhdGUoJ21vbWVudCgpLnpvbmUgaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudCgpLnV0Y09mZnNldCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL3pvbmUvJywgZ2V0U2V0Wm9uZSk7XG4gICAgcHJvdG8uaXNEU1RTaGlmdGVkID0gZGVwcmVjYXRlKCdpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uJywgaXNEYXlsaWdodFNhdmluZ1RpbWVTaGlmdGVkKTtcblxuICAgIGZ1bmN0aW9uIGNyZWF0ZVVuaXggKGlucHV0KSB7XG4gICAgICAgI
21167HJldHVybiBjcmVhdGVMb2NhbChpbnB1dCAqIDEwMDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNyZWF0ZUluWm9uZSAoKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVMb2NhbC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhcnNlWm9uZSgpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHByZVBhcnNlUG9zdEZvcm1hdCAoc3RyaW5nKSB7XG4gICAgICAgIHJldHVybiBzdHJpbmc7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDEgPSBMb2NhbGUucHJvdG90eXBlO1xuXG4gICAgcHJvdG8kMS5jYWxlbmRhciAgICAgICAgPSBjYWxlbmRhcjtcbiAgICBwcm90byQxLmxvbmdEYXRlRm9ybWF0ICA9IGxvbmdEYXRlRm9ybWF0O1xuICAgIHByb3RvJDEuaW52YWxpZERhdGUgICAgID0gaW52YWxpZERhdGU7XG4gICAgcHJvdG8kMS5vcmRpbmFsICAgICAgICAgPSBvcmRpbmFsO1xuICAgIHByb3RvJDEucHJlcGFyc2UgICAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucG9zdGZvcm1hdCAgICAgID0gcHJlUGFyc2VQb3N0Rm9ybWF0O1xuICAgIHByb3RvJDEucmVsYXRpdmVUaW1lICAgID0gcmVsYXRpdmVUaW1lO1xuICAgIHByb3RvJDEucGFzdEZ1dHVyZSAgICAgID0gcGFzdEZ1dHVyZTtcbiAgICBwcm90byQxLnNldCAgICAgICAgICAgICA9IHNldDtcblxuICAgIHByb3RvJDEubW9udGhzICAgICAgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzO1xuICAgIHByb3RvJDEubW9udGhzU2hvcnQgICAgICAgPSAgICAgICAgbG9jYWxlTW9udGhzU2hvcnQ7XG4gICAgcHJvdG8kMS5tb250aHNQYXJzZSAgICAgICA9ICAgICAgICBsb2NhbGVNb250aHNQYXJzZTtcbiAgICBwcm90byQxLm1vbnRoc1JlZ2V4ICAgICAgID0gbW9udGhzUmVnZXg7XG4gICAgcHJvdG8kMS5tb250aHNTaG9ydFJlZ2V4ICA9IG1vbnRoc1Nob3J0UmVnZXg7XG4gICAgcHJvdG8kMS53ZWVrID0gbG9jYWxlV2VlaztcbiAgICBwcm90byQxLmZpcnN0RGF5T2ZZZWFyID0gbG9jYWxlRmlyc3REYXlPZlllYXI7XG4gICAgcHJvdG8kMS5maXJzdERheU9mV2VlayA9IGxvY2FsZUZpcnN0RGF5T2ZXZWVrO1xuXG4gICAgcHJvdG8kMS53ZWVrZGF5cyAgICAgICA9ICAgICAgICBsb2NhbGVXZWVrZGF5cztcbiAgICBwcm90byQxLndlZWtkYXlzTWluICAgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzTWluO1xuICAgIHByb3RvJDEud2Vla2RheXNTaG9ydCAgPSAgICAgICAgbG9jYWxlV2Vla2RheXNTaG9ydDtcbiAgICBwcm90byQxLndlZWtkYXlzUGFyc2UgID0gICAgICAgIGxvY2FsZVdlZWtkYXlzUGFyc2U7XG5cbiAgICBwcm90byQxLndlZWtkYXlzUmVnZXggICAgICAgPSAgICAgICAgd2Vla2RheXNSZWdleDtcbiAgICBwcm90byQxLndlZWtkYXlzU2hvcnRSZWdleCAgPSAgICAgICAgd2Vla2RheXNTaG9ydFJlZ2V4O1xuICAgIHByb3RvJDEud2Vla2RheXNNaW5SZWdleCAgICA9ICAgICAgICB3ZWVrZGF5c01pblJlZ2V4O1xuXG4gICAgcHJvdG8kMS5pc1BNID0gbG9jYWxlSXNQTTtcbiAgICBwcm90byQxLm1lcmlkaWVtID0gbG9jYWxlTWVyaWRpZW07XG5cbiAgICBmdW5jdGlvbiBnZXQkMSAoZm9ybWF0LCBpbmRleCwgZmllbGQsIHNldHRlcikge1xuICAgICAgICB2Y
21167XIgbG9jYWxlID0gZ2V0TG9jYWxlKCk7XG4gICAgICAgIHZhciB1dGMgPSBjcmVhdGVVVEMoKS5zZXQoc2V0dGVyLCBpbmRleCk7XG4gICAgICAgIHJldHVybiBsb2NhbGVbZmllbGRdKHV0YywgZm9ybWF0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzSW1wbCAoZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9ybWF0ID0gZm9ybWF0IHx8ICcnO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCBpbmRleCwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDEyOyBpKyspIHtcbiAgICAgICAgICAgIG91dFtpXSA9IGdldCQxKGZvcm1hdCwgaSwgZmllbGQsICdtb250aCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQ7XG4gICAgfVxuXG4gICAgLy8gKClcbiAgICAvLyAoNSlcbiAgICAvLyAoZm10LCA1KVxuICAgIC8vIChmbXQpXG4gICAgLy8gKHRydWUpXG4gICAgLy8gKHRydWUsIDUpXG4gICAgLy8gKHRydWUsIGZtdCwgNSlcbiAgICAvLyAodHJ1ZSwgZm10KVxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c0ltcGwgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgZmllbGQpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVTb3J0ZWQgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgaWYgKGlzTnVtYmVyKGZvcm1hdCkpIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IGZvcm1hdDtcbiAgICAgICAgICAgICAgICBmb3JtYXQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdCB8fCAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZvcm1hdCA9IGxvY2FsZVNvcnRlZDtcbiAgICAgICAgICAgIGluZGV4ID0gZm9ybWF0O1xuICAgICAgICAgICAgbG9jYWxlU29ydGVkID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGlmIChpc051bWJlcihmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBmb3JtYXQ7XG4gICAgICAgICAgICAgICAgZm9ybWF0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXQgfHwgJyc7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgbG9jYWxlID0gZ2V0TG9jYWxlKCksXG4gICAgICAgICAgICBzaGlmdCA9IGxvY2FsZVNvcnRlZCA/IGxvY2FsZS5fd2Vlay5kb3cgOiAwO1xuXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gZ2V0JDEoZm9ybWF0LCAoaW5kZXggKyBzaGlmdCkgJSA3LCBmaWVsZCwgJ2RheScpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIGk7XG4gICAgICAgIHZhciBvdXQgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IDc7IGkrKykge1xuICAgICAgICAgICAgb3V0W2ldID0gZ2V0JDEoZm9ybWF0LCAoaSArIHNoaWZ0KSAlIDcsIGZpZWxkLCAnZGF5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0TW9udGhzIChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzJyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbGlzdE1vbnRoc1Nob3J0IChmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0TW9udGhzSW1wbChmb3JtYXQsIGluZGV4LCAnbW9udGhzU2hvcnQnKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBsaXN0V2Vla2RheXMgKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCkge1xuICAgICAgICByZXR1cm4gbGlzdFdlZWtkYXlzSW1wbChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgsICd3ZWVrZGF5cycpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c1Nob3J0IChsb2NhbGVTb3J0ZWQsIGZvcm1hdCwgaW5kZXgpIHtcbiAgICAgICAgcmV0dXJuIGxpc3RXZWVrZGF5c0ltcGwobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4LCAnd2Vla2RheXNTaG9ydCcpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGxpc3RXZWVrZGF5c01pbiAobG9jYWxlU29ydGVkLCBmb3JtYXQsIGluZGV4KSB7XG4gICAgICAgIHJldHVybiBsaXN0V2Vla2RheXNJbXBsKGxvY2FsZVNvcnRlZCwgZm9ybWF0LCBpbmRleCwgJ3dlZWtkYXlzTWluJyk7XG4gICAgfVxuXG4gICAgZ2V0U2V0R2xvYmFsTG9jYWxlKCdlbicsIHtcbiAgICAgICAgZGF5T2ZNb250aE9yZGluYWxQYXJzZTogL1xcZHsxLDJ9KHRofHN0fG5kfHJkKS8sXG4gICAgICAgIG9yZGluYWwgOiBmdW5jdGlvbiAobnVtYmVyKSB7XG4gICAgICAgICAgICB2Y
21167XIgYiA9IG51bWJlciAlIDEwLFxuICAgICAgICAgICAgICAgIG91dHB1dCA9ICh0b0ludChudW1iZXIgJSAxMDAgLyAxMCkgPT09IDEpID8gJ3RoJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDEpID8gJ3N0JyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDIpID8gJ25kJyA6XG4gICAgICAgICAgICAgICAgKGIgPT09IDMpID8gJ3JkJyA6ICd0aCc7XG4gICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgb3V0cHV0O1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBTaWRlIGVmZmVjdCBpbXBvcnRzXG5cbiAgICBob29rcy5sYW5nID0gZGVwcmVjYXRlKCdtb21lbnQubGFuZyBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZSBpbnN0ZWFkLicsIGdldFNldEdsb2JhbExvY2FsZSk7XG4gICAgaG9va3MubGFuZ0RhdGEgPSBkZXByZWNhdGUoJ21vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC4nLCBnZXRMb2NhbGUpO1xuXG4gICAgdmFyIG1hdGhBYnMgPSBNYXRoLmFicztcblxuICAgIGZ1bmN0aW9uIGFicyAoKSB7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgICA9IHRoaXMuX2RhdGE7XG5cbiAgICAgICAgdGhpcy5fbWlsbGlzZWNvbmRzID0gbWF0aEFicyh0aGlzLl9taWxsaXNlY29uZHMpO1xuICAgICAgICB0aGlzLl9kYXlzICAgICAgICAgPSBtYXRoQWJzKHRoaXMuX2RheXMpO1xuICAgICAgICB0aGlzLl9tb250aHMgICAgICAgPSBtYXRoQWJzKHRoaXMuX21vbnRocyk7XG5cbiAgICAgICAgZGF0YS5taWxsaXNlY29uZHMgID0gbWF0aEFicyhkYXRhLm1pbGxpc2Vjb25kcyk7XG4gICAgICAgIGRhdGEuc2Vjb25kcyAgICAgICA9IG1hdGhBYnMoZGF0YS5zZWNvbmRzKTtcbiAgICAgICAgZGF0YS5taW51dGVzICAgICAgID0gbWF0aEFicyhkYXRhLm1pbnV0ZXMpO1xuICAgICAgICBkYXRhLmhvdXJzICAgICAgICAgPSBtYXRoQWJzKGRhdGEuaG91cnMpO1xuICAgICAgICBkYXRhLm1vbnRocyAgICAgICAgPSBtYXRoQWJzKGRhdGEubW9udGhzKTtcbiAgICAgICAgZGF0YS55ZWFycyAgICAgICAgID0gbWF0aEFicyhkYXRhLnllYXJzKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRTdWJ0cmFjdCQxIChkdXJhdGlvbiwgaW5wdXQsIHZhbHVlLCBkaXJlY3Rpb24pIHtcbiAgICAgICAgdmFyIG90aGVyID0gY3JlYXRlRHVyYXRpb24oaW5wdXQsIHZhbHVlKTtcblxuICAgICAgICBkdXJhdGlvbi5fbWlsbGlzZWNvbmRzICs9IGRpcmVjdGlvbiAqIG90aGVyLl9taWxsaXNlY29uZHM7XG4gICAgICAgIGR1cmF0aW9uLl9kYXlzICAgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX2RheXM7XG4gICAgICAgIGR1cmF0aW9uLl9tb250aHMgICAgICAgKz0gZGlyZWN0aW9uICogb3RoZXIuX21vbnRocztcblxuICAgICAgICByZXR1cm4gZHVyYXRpb24uX2J1YmJsZSgpO1xuICAgIH1cblxuICAgIC8vIHN1cHBvcnRzIG9ubHkgMi4wLXN0eWxlIGFkZCgxLCAncycpIG9yIGFkZChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBhZGQkMSAoaW5wdXQsIHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBhZGRTdWJ0cmFjdCQxKHRoaXMsIGlucHV0LCB2YWx1ZSwgMSk7XG4gICAgfVxuXG4gICAgLy8gc3VwcG9ydHMgb25seSAyLjAtc3R5bGUgc3VidHJhY3QoMSwgJ3MnKSBvciBzdWJ0cmFjdChkdXJhdGlvbilcbiAgICBmdW5jdGlvbiBzdWJ0cmFjdCQxIChpbnB1dCwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGFkZFN1YnRyYWN0JDEodGhpcywgaW5wdXQsIHZhbHVlLCAtMSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYWJzQ2VpbCAobnVtYmVyKSB7XG4gICAgICAgIGlmIChudW1iZXIgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihudW1iZXIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIE1hdGguY2VpbChudW1iZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gYnViYmxlICgpIHtcbiAgICAgICAgdmFyIG1pbGxpc2Vjb25kcyA9IHRoaXMuX21pbGxpc2Vjb25kcztcbiAgICAgICAgdmFyIGRheXMgICAgICAgICA9IHRoaXMuX2RheXM7XG4gICAgICAgIHZhciBtb250aHMgICAgICAgPSB0aGlzLl9tb250aHM7XG4gICAgICAgIHZhciBkYXRhICAgICAgICAgPSB0aGlzLl9kYXRhO1xuICAgICAgICB2Y
21167XIgc2Vjb25kcywgbWludXRlcywgaG91cnMsIHllYXJzLCBtb250aHNGcm9tRGF5cztcblxuICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgbWl4IG9mIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB2YWx1ZXMsIGJ1YmJsZSBkb3duIGZpcnN0XG4gICAgICAgIC8vIGNoZWNrOiBodHRwczovL2dpdGh1Yi5jb20vbW9tZW50L21vbWVudC9pc3N1ZXMvMjE2NlxuICAgICAgICBpZiAoISgobWlsbGlzZWNvbmRzID49IDAgJiYgZGF5cyA+PSAwICYmIG1vbnRocyA+PSAwKSB8fFxuICAgICAgICAgICAgICAgIChtaWxsaXNlY29uZHMgPD0gMCAmJiBkYXlzIDw9IDAgJiYgbW9udGhzIDw9IDApKSkge1xuICAgICAgICAgICAgbWlsbGlzZWNvbmRzICs9IGFic0NlaWwobW9udGhzVG9EYXlzKG1vbnRocykgKyBkYXlzKSAqIDg2NGU1O1xuICAgICAgICAgICAgZGF5cyA9IDA7XG4gICAgICAgICAgICBtb250aHMgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBjb2RlIGJ1YmJsZXMgdXAgdmFsdWVzLCBzZWUgdGhlIHRlc3RzIGZvclxuICAgICAgICAvLyBleGFtcGxlcyBvZiB3aGF0IHRoYXQgbWVhbnMuXG4gICAgICAgIGRhdGEubWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmRzICUgMTAwMDtcblxuICAgICAgICBzZWNvbmRzICAgICAgICAgICA9IGFic0Zsb29yKG1pbGxpc2Vjb25kcyAvIDEwMDApO1xuICAgICAgICBkYXRhLnNlY29uZHMgICAgICA9IHNlY29uZHMgJSA2MDtcblxuICAgICAgICBtaW51dGVzICAgICAgICAgICA9IGFic0Zsb29yKHNlY29uZHMgLyA2MCk7XG4gICAgICAgIGRhdGEubWludXRlcyAgICAgID0gbWludXRlcyAlIDYwO1xuXG4gICAgICAgIGhvdXJzICAgICAgICAgICAgID0gYWJzRmxvb3IobWludXRlcyAvIDYwKTtcbiAgICAgICAgZGF0YS5ob3VycyAgICAgICAgPSBob3VycyAlIDI0O1xuXG4gICAgICAgIGRheXMgKz0gYWJzRmxvb3IoaG91cnMgLyAyNCk7XG5cbiAgICAgICAgLy8gY29udmVydCBkYXlzIHRvIG1vbnRoc1xuICAgICAgICBtb250aHNGcm9tRGF5cyA9IGFic0Zsb29yKGRheXNUb01vbnRocyhkYXlzKSk7XG4gICAgICAgIG1vbnRocyArPSBtb250aHNGcm9tRGF5cztcbiAgICAgICAgZGF5cyAtPSBhYnNDZWlsKG1vbnRoc1RvRGF5cyhtb250aHNGcm9tRGF5cykpO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgPSBhYnNGbG9vcihtb250aHMgLyAxMik7XG4gICAgICAgIG1vbnRocyAlPSAxMjtcblxuICAgICAgICBkYXRhLmRheXMgICA9IGRheXM7XG4gICAgICAgIGRhdGEubW9udGhzID0gbW9udGhzO1xuICAgICAgICBkYXRhLnllYXJzICA9IHllYXJzO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRheXNUb01vbnRocyAoZGF5cykge1xuICAgICAgICAvLyA0MDAgeWVhcnMgaGF2ZSAxNDYwOTcgZGF5cyAodGFraW5nIGludG8gYWNjb3VudCBsZWFwIHllYXIgcnVsZXMpXG4gICAgICAgIC8vIDQwMCB5ZWFycyBoYXZlIDEyIG1vbnRocyA9PT0gNDgwMFxuICAgICAgICByZXR1cm4gZGF5cyAqIDQ4MDAgLyAxNDYwOTc7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbW9udGhzVG9EYXlzIChtb250aHMpIHtcbiAgICAgICAgLy8gdGhlIHJldmVyc2Ugb2YgZGF5c1RvTW9udGhzXG4gICAgICAgIHJldHVybiBtb250aHMgKiAxNDYwOTcgLyA0ODAwO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFzICh1bml0cykge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIHZhciBkYXlzO1xuICAgICAgICB2Y
21167XIgbW9udGhzO1xuICAgICAgICB2YXIgbWlsbGlzZWNvbmRzID0gdGhpcy5fbWlsbGlzZWNvbmRzO1xuXG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuXG4gICAgICAgIGlmICh1bml0cyA9PT0gJ21vbnRoJyB8fCB1bml0cyA9PT0gJ3F1YXJ0ZXInIHx8IHVuaXRzID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIGRheXMgPSB0aGlzLl9kYXlzICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICBtb250aHMgPSB0aGlzLl9tb250aHMgKyBkYXlzVG9Nb250aHMoZGF5cyk7XG4gICAgICAgICAgICBzd2l0Y2ggKHVuaXRzKSB7XG4gICAgICAgICAgICAgICAgY2FzZSAnbW9udGgnOiAgIHJldHVybiBtb250aHM7XG4gICAgICAgICAgICAgICAgY2FzZSAncXVhcnRlcic6IHJldHVybiBtb250aHMgLyAzO1xuICAgICAgICAgICAgICAgIGNhc2UgJ3llYXInOiAgICByZXR1cm4gbW9udGhzIC8gMTI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBoYW5kbGUgbWlsbGlzZWNvbmRzIHNlcGFyYXRlbHkgYmVjYXVzZSBvZiBmbG9hdGluZyBwb2ludCBtYXRoIGVycm9ycyAoaXNzdWUgIzE4NjcpXG4gICAgICAgICAgICBkYXlzID0gdGhpcy5fZGF5cyArIE1hdGgucm91bmQobW9udGhzVG9EYXlzKHRoaXMuX21vbnRocykpO1xuICAgICAgICAgICAgc3dpdGNoICh1bml0cykge1xuICAgICAgICAgICAgICAgIGNhc2UgJ3dlZWsnICAgOiByZXR1cm4gZGF5cyAvIDcgICAgICsgbWlsbGlzZWNvbmRzIC8gNjA0OGU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RheScgICAgOiByZXR1cm4gZGF5cyAgICAgICAgICsgbWlsbGlzZWNvbmRzIC8gODY0ZTU7XG4gICAgICAgICAgICAgICAgY2FzZSAnaG91cicgICA6IHJldHVybiBkYXlzICogMjQgICAgKyBtaWxsaXNlY29uZHMgLyAzNmU1O1xuICAgICAgICAgICAgICAgIGNhc2UgJ21pbnV0ZScgOiByZXR1cm4gZGF5cyAqIDE0NDAgICsgbWlsbGlzZWNvbmRzIC8gNmU0O1xuICAgICAgICAgICAgICAgIGNhc2UgJ3NlY29uZCcgOiByZXR1cm4gZGF5cyAqIDg2NDAwICsgbWlsbGlzZWNvbmRzIC8gMTAwMDtcbiAgICAgICAgICAgICAgICAvLyBNYXRoLmZsb29yIHByZXZlbnRzIGZsb2F0aW5nIHBvaW50IG1hdGggZXJyb3JzIGhlcmVcbiAgICAgICAgICAgICAgICBjYXNlICdtaWxsaXNlY29uZCc6IHJldHVybiBNYXRoLmZsb29yKGRheXMgKiA4NjRlNSkgKyBtaWxsaXNlY29uZHM7XG4gICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIHVuaXQgJyArIHVuaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRPRE86IFVzZSB0aGlzLmFzKCdtcycpP1xuICAgIGZ1bmN0aW9uIHZhbHVlT2YkMSAoKSB7XG4gICAgICAgIGlmICghdGhpcy5pc1ZhbGlkKCkpIHtcbiAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuX21pbGxpc2Vjb25kcyArXG4gICAgICAgICAgICB0aGlzLl9kYXlzICogODY0ZTUgK1xuICAgICAgICAgICAgKHRoaXMuX21vbnRocyAlIDEyKSAqIDI1OTJlNiArXG4gICAgICAgICAgICB0b0ludCh0aGlzLl9tb250aHMgLyAxMikgKiAzMTUzNmU2XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gbWFrZUFzIChhbGlhcykge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXMoYWxpYXMpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHZhciBhc01pbGxpc2Vjb25kcyA9IG1ha2VBcygnbXMnKTtcbiAgICB2YXIgYXNTZWNvbmRzICAgICAgPSBtYWtlQXMoJ3MnKTtcbiAgICB2YXIgYXNNaW51dGVzICAgICAgPSBtYWtlQXMoJ20nKTtcbiAgICB2YXIgYXNIb3VycyAgICAgICAgPSBtYWtlQXMoJ2gnKTtcbiAgICB2YXIgYXNEYXlzICAgICAgICAgPSBtYWtlQXMoJ2QnKTtcbiAgICB2YXIgYXNXZWVrcyAgICAgICAgPSBtYWtlQXMoJ3cnKTtcbiAgICB2YXIgYXNNb250aHMgICAgICAgPSBtYWtlQXMoJ00nKTtcbiAgICB2YXIgYXNRdWFydGVycyAgICAgPSBtYWtlQXMoJ1EnKTtcbiAgICB2YXIgYXNZZWFycyAgICAgICAgPSBtYWtlQXMoJ3knKTtcblxuICAgIGZ1bmN0aW9uIGNsb25lJDEgKCkge1xuICAgICAgICByZXR1cm4gY3JlYXRlRHVyYXRpb24odGhpcyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0JDIgKHVuaXRzKSB7XG4gICAgICAgIHVuaXRzID0gbm9ybWFsaXplVW5pdHModW5pdHMpO1xuICAgICAgICByZXR1cm4gdGhpcy5pc1ZhbGlkKCkgPyB0aGlzW3VuaXRzICsgJ3MnXSgpIDogTmFOO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG1ha2VHZXR0ZXIobmFtZSkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNWYWxpZCgpID8gdGhpcy5fZGF0YVtuYW1lXSA6IE5hTjtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWFrZUdldHRlcignbWlsbGlzZWNvbmRzJyk7XG4gICAgdmFyIHNlY29uZHMgICAgICA9IG1ha2VHZXR0ZXIoJ3NlY29uZHMnKTtcbiAgICB2YXIgbWludXRlcyAgICAgID0gbWFrZUdldHRlcignbWludXRlcycpO1xuICAgIHZhciBob3VycyAgICAgICAgPSBtYWtlR2V0dGVyKCdob3VycycpO1xuICAgIHZhciBkYXlzICAgICAgICAgPSBtYWtlR2V0dGVyKCdkYXlzJyk7XG4gICAgdmFyIG1vbnRocyAgICAgICA9IG1ha2VHZXR0ZXIoJ21vbnRocycpO1xuICAgIHZhciB5ZWFycyAgICAgICAgPSBtYWtlR2V0dGVyKCd5ZWFycycpO1xuXG4gICAgZnVuY3Rpb24gd2Vla3MgKCkge1xuICAgICAgICByZXR1cm4gYWJzRmxvb3IodGhpcy5kYXlzKCkgLyA3KTtcbiAgICB9XG5cbiAgICB2YXIgcm91bmQgPSBNYXRoLnJvdW5kO1xuICAgIHZhciB0aHJlc2hvbGRzID0ge1xuICAgICAgICBzczogNDQsICAgICAgICAgLy8gYSBmZXcgc2Vjb25kcyB0byBzZWNvbmRzXG4gICAgICAgIHMgOiA0NSwgICAgICAgICAvLyBzZWNvbmRzIHRvIG1pbnV0ZVxuICAgICAgICBtIDogNDUsICAgICAgICAgLy8gbWludXRlcyB0byBob3VyXG4gICAgICAgIGggOiAyMiwgICAgICAgICAvLyBob3VycyB0byBkYXlcbiAgICAgICAgZCA6IDI2LCAgICAgICAgIC8vIGRheXMgdG8gbW9udGhcbiAgICAgICAgTSA6IDExICAgICAgICAgIC8vIG1vbnRocyB0byB5ZWFyXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbiBmb3IgbW9tZW50LmZuLmZyb20sIG1vbWVudC5mbi5mcm9tTm93LCBhbmQgbW9tZW50LmR1cmF0aW9uLmZuLmh1bWFuaXplXG4gICAgZnVuY3Rpb24gc3Vic3RpdHV0ZVRpbWVBZ28oc3RyaW5nLCBudW1iZXIsIHdpdGhvdXRTdWZmaXgsIGlzRnV0dXJlLCBsb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsZS5yZWxhdGl2ZVRpbWUobnVtYmVyIHx8IDEsICEhd2l0aG91dFN1ZmZpeCwgc3RyaW5nLCBpc0Z1dHVyZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcmVsYXRpdmVUaW
211671lJDEgKHBvc05lZ0R1cmF0aW9uLCB3aXRob3V0U3VmZml4LCBsb2NhbGUpIHtcbiAgICAgICAgdmFyIGR1cmF0aW9uID0gY3JlYXRlRHVyYXRpb24ocG9zTmVnRHVyYXRpb24pLmFicygpO1xuICAgICAgICB2YXIgc2Vjb25kcyAgPSByb3VuZChkdXJhdGlvbi5hcygncycpKTtcbiAgICAgICAgdmFyIG1pbnV0ZXMgID0gcm91bmQoZHVyYXRpb24uYXMoJ20nKSk7XG4gICAgICAgIHZhciBob3VycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCdoJykpO1xuICAgICAgICB2YXIgZGF5cyAgICAgPSByb3VuZChkdXJhdGlvbi5hcygnZCcpKTtcbiAgICAgICAgdmFyIG1vbnRocyAgID0gcm91bmQoZHVyYXRpb24uYXMoJ00nKSk7XG4gICAgICAgIHZhciB5ZWFycyAgICA9IHJvdW5kKGR1cmF0aW9uLmFzKCd5JykpO1xuXG4gICAgICAgIHZhciBhID0gc2Vjb25kcyA8PSB0aHJlc2hvbGRzLnNzICYmIFsncycsIHNlY29uZHNdICB8fFxuICAgICAgICAgICAgICAgIHNlY29uZHMgPCB0aHJlc2hvbGRzLnMgICAmJiBbJ3NzJywgc2Vjb25kc10gfHxcbiAgICAgICAgICAgICAgICBtaW51dGVzIDw9IDEgICAgICAgICAgICAgJiYgWydtJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbWludXRlcyA8IHRocmVzaG9sZHMubSAgICYmIFsnbW0nLCBtaW51dGVzXSB8fFxuICAgICAgICAgICAgICAgIGhvdXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ2gnXSAgICAgICAgICAgfHxcbiAgICAgICAgICAgICAgICBob3VycyAgIDwgdGhyZXNob2xkcy5oICAgJiYgWydoaCcsIGhvdXJzXSAgIHx8XG4gICAgICAgICAgICAgICAgZGF5cyAgICA8PSAxICAgICAgICAgICAgICYmIFsnZCddICAgICAgICAgICB8fFxuICAgICAgICAgICAgICAgIGRheXMgICAgPCB0aHJlc2hvbGRzLmQgICAmJiBbJ2RkJywgZGF5c10gICAgfHxcbiAgICAgICAgICAgICAgICBtb250aHMgIDw9IDEgICAgICAgICAgICAgJiYgWydNJ10gICAgICAgICAgIHx8XG4gICAgICAgICAgICAgICAgbW9udGhzICA8IHRocmVzaG9sZHMuTSAgICYmIFsnTU0nLCBtb250aHNdICB8fFxuICAgICAgICAgICAgICAgIHllYXJzICAgPD0gMSAgICAgICAgICAgICAmJiBbJ3knXSAgICAgICAgICAgfHwgWyd5eScsIHllYXJzXTtcblxuICAgICAgICBhWzJdID0gd2l0aG91dFN1ZmZpeDtcbiAgICAgICAgYVszXSA9ICtwb3NOZWdEdXJhdGlvbiA+IDA7XG4gICAgICAgIGFbNF0gPSBsb2NhbGU7XG4gICAgICAgIHJldHVybiBzdWJzdGl0dXRlVGltZUFnby5hcHBseShudWxsLCBhKTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IHRoZSByb3VuZGluZyBmdW5jdGlvbiBmb3IgcmVsYXRpdmUgdGltZSBzdHJpbmdzXG4gICAgZnVuY3Rpb24gZ2V0U2V0UmVsYXRpdmVUaW1lUm91bmRpbmcgKHJvdW5kaW5nRnVuY3Rpb24pIHtcbiAgICAgICAgaWYgKHJvdW5kaW5nRnVuY3Rpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHJvdW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2Yocm91bmRpbmdGdW5jdGlvbikgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJvdW5kID0gcm91bmRpbmdGdW5jdGlvbjtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gc2V0IGEgdGhyZXNob2xkIGZvciByZWxhdGl2ZSB0aW1lIHN0cmluZ3NcbiAgICBmdW5jdGlvbiBnZXRTZXRSZWxhdGl2ZVRpbWVUaHJlc2hvbGQgKHRocmVzaG9sZCwgbGltaXQpIHtcbiAgICAgICAgaWYgKHRocmVzaG9sZHNbdGhyZXNob2xkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB0aHJlc2hvbGRzW3RocmVzaG9sZF07XG4gICAgICAgIH1cbiAgICAgICAgdGhyZXNob2xkc1t0aHJlc2hvbGRdID0gbGltaXQ7XG4gICAgICAgIGlmICh0aHJlc2hvbGQgPT09ICdzJykge1xuICAgICAgICAgICAgdGhyZXNob2xkcy5zcyA9IGxpbWl0IC0gMTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBodW1hbml6ZSAod2l0aFN1ZmZpeCkge1xuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBsb2NhbGUgPSB0aGlzLmxvY2FsZURhdGEoKTtcbiAgICAgICAgdmFyIG91dHB1dCA9IHJlbGF0aXZlVGltZSQxKHRoaXMsICF3aXRoU3VmZml4LCBsb2NhbGUpO1xuXG4gICAgICAgIGlmICh3aXRoU3VmZml4KSB7XG4gICAgICAgICAgICBvdXRwdXQgPSBsb2NhbGUucGFzdEZ1dHVyZSgrdGhpcywgb3V0cHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBsb2NhbGUucG9zdGZvcm1hdChvdXRwdXQpO1xuICAgIH1cblxuICAgIHZhciBhYnMkMSA9IE1hdGguYWJzO1xuXG4gICAgZnVuY3Rpb24gc2lnbih4KSB7XG4gICAgICAgIHJldHVybiAoKHggPiAwKSAtICh4IDwgMCkpIHx8ICt4O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHRvSVNPU3RyaW5nJDEoKSB7XG4gICAgICAgIC8vIGZvciBJU08gc3RyaW5ncyB3ZSBkbyBub3QgdXNlIHRoZSBub3JtYWwgYnViYmxpbmcgcnVsZXM6XG4gICAgICAgIC8vICAqIG1pbGxpc2Vjb25kcyBidWJibGUgdXAgdW50aWwgdGhleSBiZWNvbWUgaG91cnNcbiAgICAgICAgLy8gICogZGF5cyBkbyBub3QgYnViYmxlIGF0IGFsbFxuICAgICAgICAvLyAgKiBtb250aHMgYnViYmxlIHVwIHVudGlsIHRoZXkgYmVjb21lIHllYXJzXG4gICAgICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB0aGVyZSBpcyBubyBjb250ZXh0LWZyZWUgY29udmVyc2lvbiBiZXR3ZWVuIGhvdXJzIGFuZCBkYXlzXG4gICAgICAgIC8vICh0aGluayBvZiBjbG9jayBjaGFuZ2VzKVxuICAgICAgICAvLyBhbmQgYWxzbyBub3QgYmV0d2VlbiBkYXlzIGFuZCBtb250aHMgKDI4LTMxIGRheXMgcGVyIG1vbnRoKVxuICAgICAgICBpZiAoIXRoaXMuaXNWYWxpZCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgI
21167HZhciBzZWNvbmRzID0gYWJzJDEodGhpcy5fbWlsbGlzZWNvbmRzKSAvIDEwMDA7XG4gICAgICAgIHZhciBkYXlzICAgICAgICAgPSBhYnMkMSh0aGlzLl9kYXlzKTtcbiAgICAgICAgdmFyIG1vbnRocyAgICAgICA9IGFicyQxKHRoaXMuX21vbnRocyk7XG4gICAgICAgIHZhciBtaW51dGVzLCBob3VycywgeWVhcnM7XG5cbiAgICAgICAgLy8gMzYwMCBzZWNvbmRzIC0+IDYwIG1pbnV0ZXMgLT4gMSBob3VyXG4gICAgICAgIG1pbnV0ZXMgICAgICAgICAgID0gYWJzRmxvb3Ioc2Vjb25kcyAvIDYwKTtcbiAgICAgICAgaG91cnMgICAgICAgICAgICAgPSBhYnNGbG9vcihtaW51dGVzIC8gNjApO1xuICAgICAgICBzZWNvbmRzICU9IDYwO1xuICAgICAgICBtaW51dGVzICU9IDYwO1xuXG4gICAgICAgIC8vIDEyIG1vbnRocyAtPiAxIHllYXJcbiAgICAgICAgeWVhcnMgID0gYWJzRmxvb3IobW9udGhzIC8gMTIpO1xuICAgICAgICBtb250aHMgJT0gMTI7XG5cblxuICAgICAgICAvLyBpbnNwaXJlZCBieSBodHRwczovL2dpdGh1Yi5jb20vZG9yZGlsbGUvbW9tZW50LWlzb2R1cmF0aW9uL2Jsb2IvbWFzdGVyL21vbWVudC5pc29kdXJhdGlvbi5qc1xuICAgICAgICB2YXIgWSA9IHllYXJzO1xuICAgICAgICB2YXIgTSA9IG1vbnRocztcbiAgICAgICAgdmFyIEQgPSBkYXlzO1xuICAgICAgICB2YXIgaCA9IGhvdXJzO1xuICAgICAgICB2YXIgbSA9IG1pbnV0ZXM7XG4gICAgICAgIHZhciBzID0gc2Vjb25kcyA/IHNlY29uZHMudG9GaXhlZCgzKS5yZXBsYWNlKC9cXC4/MCskLywgJycpIDogJyc7XG4gICAgICAgIHZhciB0b3RhbCA9IHRoaXMuYXNTZWNvbmRzKCk7XG5cbiAgICAgICAgaWYgKCF0b3RhbCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgc2FtZSBhcyBDIydzIChOb2RhKSBhbmQgcHl0aG9uIChpc29kYXRlKS4uLlxuICAgICAgICAgICAgLy8gYnV0IG5vdCBvdGhlciBKUyAoZ29vZy5kYXRlKVxuICAgICAgICAgICAgcmV0dXJuICdQMEQnO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHRvdGFsU2lnbiA9IHRvdGFsIDwgMCA/ICctJyA6ICcnO1xuICAgICAgICB2Y
21167XIgeW1TaWduID0gc2lnbih0aGlzLl9tb250aHMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgZGF5c1NpZ24gPSBzaWduKHRoaXMuX2RheXMpICE9PSBzaWduKHRvdGFsKSA/ICctJyA6ICcnO1xuICAgICAgICB2YXIgaG1zU2lnbiA9IHNpZ24odGhpcy5fbWlsbGlzZWNvbmRzKSAhPT0gc2lnbih0b3RhbCkgPyAnLScgOiAnJztcblxuICAgICAgICByZXR1cm4gdG90YWxTaWduICsgJ1AnICtcbiAgICAgICAgICAgIChZID8geW1TaWduICsgWSArICdZJyA6ICcnKSArXG4gICAgICAgICAgICAoTSA/IHltU2lnbiArIE0gKyAnTScgOiAnJykgK1xuICAgICAgICAgICAgKEQgPyBkYXlzU2lnbiArIEQgKyAnRCcgOiAnJykgK1xuICAgICAgICAgICAgKChoIHx8IG0gfHwgcykgPyAnVCcgOiAnJykgK1xuICAgICAgICAgICAgKGggPyBobXNTaWduICsgaCArICdIJyA6ICcnKSArXG4gICAgICAgICAgICAobSA/IGhtc1NpZ24gKyBtICsgJ00nIDogJycpICtcbiAgICAgICAgICAgIChzID8gaG1zU2lnbiArIHMgKyAnUycgOiAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHByb3RvJDIgPSBEdXJhdGlvbi5wcm90b3R5cGU7XG5cbiAgICBwcm90byQyLmlzVmFsaWQgICAgICAgID0gaXNWYWxpZCQxO1xuICAgIHByb3RvJDIuYWJzICAgICAgICAgICAgPSBhYnM7XG4gICAgcHJvdG8kMi5hZGQgICAgICAgICAgICA9IGFkZCQxO1xuICAgIHByb3RvJDIuc3VidHJhY3QgICAgICAgPSBzdWJ0cmFjdCQxO1xuICAgIHByb3RvJDIuYXMgICAgICAgICAgICAgPSBhcztcbiAgICBwcm90byQyLmFzTWlsbGlzZWNvbmRzID0gYXNNaWxsaXNlY29uZHM7XG4gICAgcHJvdG8kMi5hc1NlY29uZHMgICAgICA9IGFzU2Vjb25kcztcbiAgICBwcm90byQyLmFzTWludXRlcyAgICAgID0gYXNNaW51dGVzO1xuICAgIHByb3RvJDIuYXNIb3VycyAgICAgICAgPSBhc0hvdXJzO1xuICAgIHByb3RvJDIuYXNEYXlzICAgICAgICAgPSBhc0RheXM7XG4gICAgcHJvdG8kMi5hc1dlZWtzICAgICAgICA9IGFzV2Vla3M7XG4gICAgcHJvdG8kMi5hc01vbnRocyAgICAgICA9IGFzTW9udGhzO1xuICAgIHByb3RvJDIuYXNRdWFydGVycyAgICAgPSBhc1F1YXJ0ZXJzO1xuICAgIHByb3RvJDIuYXNZZWFycyAgICAgICAgPSBhc1llYXJzO1xuICAgIHByb3RvJDIudmFsdWVPZiAgICAgICAgPSB2YWx1ZU9mJDE7XG4gICAgcHJvdG8kMi5fYnViYmxlICAgICAgICA9IGJ1YmJsZTtcbiAgICBwcm90byQyLmNsb25lICAgICAgICAgID0gY2xvbmUkMTtcbiAgICBwcm90byQyLmdldCAgICAgICAgICAgID0gZ2V0JDI7XG4gICAgcHJvdG8kMi5taWxsaXNlY29uZHMgICA9IG1pbGxpc2Vjb25kcztcbiAgICBwcm90byQyLnNlY29uZHMgICAgICAgID0gc2Vjb25kcztcbiAgICBwcm90byQyLm1pbnV0ZXMgICAgICAgID0gbWludXRlcztcbiAgICBwcm90byQyLmhvdXJzICAgICAgICAgID0gaG91cnM7XG4gICAgcHJvdG8kMi5kYXlzICAgICAgICAgICA9IGRheXM7XG4gICAgcHJvdG8kMi53ZWVrcyAgICAgICAgICA9IHdlZWtzO1xuICAgIHByb3RvJDIubW9udGhzICAgICAgICAgPSBtb250aHM7XG4gICAgcHJvdG8kMi55ZWFycyAgICAgICAgICA9IHllYXJzO1xuICAgIHByb3RvJDIuaHVtYW5pemUgICAgICAgPSBodW1hbml6ZTtcbiAgICBwcm90byQyLnRvSVNPU3RyaW5nICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvU3RyaW5nICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLnRvSlNPTiAgICAgICAgID0gdG9JU09TdHJpbmckMTtcbiAgICBwcm90byQyLmxvY2FsZSAgICAgICAgID0gbG9jYWxlO1xuICAgIHByb3RvJDIubG9jYWxlRGF0YSAgICAgPSBsb2NhbGVEYXRhO1xuXG4gICAgcHJvdG8kMi50b0lzb1N0cmluZyA9IGRlcHJlY2F0ZSgndG9Jc29TdHJpbmcoKSBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIHRvSVNPU3RyaW5nKCkgaW5zdGVhZCAobm90aWNlIHRoZSBjYXBpdGFscyknLCB0b0lTT1N0cmluZyQxKTtcbiAgICBwcm90byQyLmxhbmcgPSBsYW5nO1xuXG4gICAgLy8gU2lkZSBlZmZlY3QgaW1wb3J0c1xuXG4gICAgLy8gRk9STUFUVElOR1xuXG4gICAgYWRkRm9ybWF0VG9rZW4oJ1gnLCAwLCAwLCAndW5peCcpO1xuICAgIGFkZEZvcm1hdFRva2VuKCd4JywgMCwgMCwgJ3ZhbHVlT2YnKTtcblxuICAgIC8vIFBBUlNJTkdcblxuICAgIGFkZFJlZ2V4VG9rZW4oJ3gnLCBtYXRjaFNpZ25lZCk7XG4gICAgYWRkUmVnZXhUb2tlbignWCcsIG1hdGNoVGltZXN0YW1wKTtcbiAgICBhZGRQYXJzZVRva2VuKCdYJywgZnVuY3Rpb24gKGlucHV0LCBhcnJheSwgY29uZmlnKSB7XG4gICAgICAgIGNvbmZpZy5fZCA9IG5ldyBEYXRlKHBhcnNlRmxvYXQoaW5wdXQsIDEwKSAqIDEwMDApO1xuICAgIH0pO1xuICAgIGFkZFBhcnNlVG9rZW4oJ3gnLCBmdW5jdGlvbiAoaW5wdXQsIGFycmF5LCBjb25maWcpIHtcbiAgICAgICAgY29uZmlnLl9kID0gbmV3IERhdGUodG9JbnQoaW5wdXQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNpZGUgZWZmZWN0IGltcG9ydHNcblxuXG4gICAgaG9va3MudmVyc2lvbiA9ICcyLjI0LjAnO1xuXG4gICAgc2V0SG9va0NhbGxiYWNrKGNyZWF0ZUxvY2FsKTtcblxuICAgIGhvb2tzLmZuICAgICAgICAgICAgICAgICAgICA9IHByb3RvO1xuICAgIGhvb2tzLm1pbiAgICAgICAgICAgICAgICAgICA9IG1pbjtcbiAgICBob29rcy5tYXggICAgICAgICAgICAgICAgICAgPSBtYXg7XG4gICAgaG9va3Mubm93ICAgICAgICAgICAgICAgICAgID0gbm93O1xuICAgIGhvb2tzLnV0YyAgICAgICAgICAgICAgICAgICA9IGNyZWF0ZVVUQztcbiAgICBob29rcy51bml4ICAgICAgICAgICAgICAgICAgPSBjcmVhdGVVbml4O1xuICAgIGhvb2tzLm1vbnRocyAgICAgICAgICAgICAgICA9IGxpc3RNb250aHM7XG4gICAgaG9va3MuaXNEYXRlICAgICAgICAgICAgICAgID0gaXNEYXRlO1xuICAgIGhvb2tzLmxvY2FsZSAgICAgICAgICAgICAgICA9IGdldFNldEdsb2JhbExvY2FsZTtcbiAgICBob29rcy5pbnZhbGlkICAgICAgICAgICAgICAgPSBjcmVhdGVJbnZhbGlkO1xuICAgIGhvb2tzLmR1cmF0aW9uICAgICAgICAgICAgICA9IGNyZWF0ZUR1cmF0aW9uO1xuICAgIGhvb2tzLmlzTW9tZW50ICAgICAgICAgICAgICA9IGlzTW9tZW50O1xuICAgIGhvb2tzLndlZWtkYXlzICAgICAgICAgICAgICA9IGxpc3RXZWVrZGF5cztcbiAgICBob29rcy5wYXJzZVpvbmUgICAgICAgICAgICAgPSBjcmVhdGVJblpvbmU7XG4gICAgaG9va3MubG9jYWxlRGF0YSAgICAgICAgICAgID0gZ2V0TG9jYWxlO1xuICAgIGhvb2tzLmlzRHVyYXRpb24gICAgICAgICAgICA9IGlzRHVyYXRpb247XG4gICAgaG9va3MubW9udGhzU2hvcnQgICAgICAgICAgID0gbGlzdE1vbnRoc1Nob3J0O1xuICAgIGhvb2tzLndlZWtkYXlzTWluICAgICAgICAgICA9IGxpc3RXZWVrZGF5c01pbjtcbiAgICBob29rcy5kZWZpbmVMb2NhbGUgICAgICAgICAgPSBkZWZpbmVMb2NhbGU7XG4gICAgaG9va3MudXBkYXRlTG9jYWxlICAgICAgICAgID0gdXBkYXRlTG9jYWxlO1xuICAgIGhvb2tzLmxvY2FsZXMgICAgICAgICAgICAgICA9IGxpc3RMb2NhbGVzO1xuICAgIGhvb2tzLndlZWtkYXlzU2hvcnQgICAgICAgICA9IGxpc3RXZWVrZGF5c1Nob3J0O1xuICAgIGhvb2tzLm5vcm1hbGl6ZVVuaXRzICAgICAgICA9IG5vcm1hbGl6ZVVuaXRzO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVJvdW5kaW5nICA9IGdldFNldFJlbGF0aXZlVGltZVJvdW5kaW5nO1xuICAgIGhvb2tzLnJlbGF0aXZlVGltZVRocmVzaG9sZCA9IGdldFNldFJlbGF0aXZlVGltZVRocmVzaG9sZDtcbiAgICBob29rcy5jYWxlbmRhckZvcm1hdCAgICAgICAgPSBnZXRDYWxlbmRhckZvcm1hdDtcbiAgICBob29rcy5wcm90b3R5cGUgICAgICAgICAgICAgPSBwcm90bztcblxuICAgIC8vIGN1cnJlbnRseSBIVE1MNSBpbnB1dCB0eXBlIG9ubHkgc3VwcG9ydHMgMjQtaG91ciBmb3JtYXRzXG4gICAgaG9va3MuSFRNTDVfRk1UID0ge1xuICAgICAgICBEQVRFVElNRV9MT0NBTDogJ1lZWVktTU0tRERUSEg6bW0nLCAgICAgICAgICAgICAvLyA8aW5wdXQgdHlwZT1cImRhdGV0aW1lLWxvY2FsXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfU0VDT05EUzogJ1lZWVktTU0tRERUSEg6bW06c3MnLCAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgREFURVRJTUVfTE9DQUxfTVM6ICdZWVlZLU1NLUREVEhIOm1tOnNzLlNTUycsICAgLy8gPGlucHV0IHR5cGU9XCJkYXRldGltZS1sb2NhbFwiIHN0ZXA9XCIwLjAwMVwiIC8+XG4gICAgICAgIERBVEU6ICdZWVlZLU1NLUREJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwiZGF0ZVwiIC8+XG4gICAgICAgIFRJTUU6ICdISDptbScsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIC8+XG4gICAgICAgIFRJTUVfU0VDT05EUzogJ0hIOm1tOnNzJywgICAgICAgICAgICAgICAgICAgICAgIC8vIDxpbnB1dCB0eXBlPVwidGltZVwiIHN0ZXA9XCIxXCIgLz5cbiAgICAgICAgVElNRV9NUzogJ0hIOm1tOnNzLlNTUycsICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ0aW1lXCIgc3RlcD1cIjAuMDAxXCIgLz5cbiAgICAgICAgV0VFSzogJ0dHR0ctW1ddV1cnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJ3ZWVrXCIgLz5cbiAgICAgICAgTU9OVEg6ICdZWVlZLU1NJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPGlucHV0IHR5cGU9XCJtb250aFwiIC8+XG4gICAgfTtcblxuICAgI
21167HJldHVybiBob29rcztcblxufSkpKTtcbiIsIi8vISBtb21lbnQuanMgbG9jYWxlIGNvbmZpZ3VyYXRpb25cblxuOyhmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAmJiB0eXBlb2YgcmVxdWlyZSA9PT0gJ2Z1bmN0aW9uJyA/IGZhY3RvcnkocmVxdWlyZSgnLi4vbW9tZW50JykpIDpcbiAgIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL21vbWVudCddLCBmYWN0b3J5KSA6XG4gICBmYWN0b3J5KGdsb2JhbC5tb21lbnQpXG59KHRoaXMsIChmdW5jdGlvbiAobW9tZW50KSB7ICd1c2Ugc3RyaWN0JztcblxuXG4gICAgdmFyIGZyID0gbW9tZW50LmRlZmluZUxvY2FsZSgnZnInLCB7XG4gICAgICAgIG1vbnRocyA6ICdqYW52aWVyX2bDqXZyaWVyX21hcnNfYXZyaWxfbWFpX2p1aW5fanVpbGxldF9hb8O7dF9zZXB0ZW1icmVfb2N0b2JyZV9ub3ZlbWJyZV9kw6ljZW1icmUnLnNwbGl0KCdfJyksXG4gICAgICAgIG1vbnRoc1Nob3J0IDogJ2phbnYuX2bDqXZyLl9tYXJzX2F2ci5fbWFpX2p1aW5fanVpbC5fYW/Du3Rfc2VwdC5fb2N0Ll9ub3YuX2TDqWMuJy5zcGxpdCgnXycpLFxuICAgICAgICBtb250aHNQYXJzZUV4YWN0IDogdHJ1ZSxcbiAgICAgICAgd2Vla2RheXMgOiAnZGltYW5jaGVfbHVuZGlfbWFyZGlfbWVyY3JlZGlfamV1ZGlfdmVuZHJlZGlfc2FtZWRpJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1Nob3J0IDogJ2RpbS5fbHVuLl9tYXIuX21lci5famV1Ll92ZW4uX3NhbS4nLnNwbGl0KCdfJyksXG4gICAgICAgIHdlZWtkYXlzTWluIDogJ2RpX2x1X21hX21lX2plX3ZlX3NhJy5zcGxpdCgnXycpLFxuICAgICAgICB3ZWVrZGF5c1BhcnNlRXhhY3QgOiB0cnVlLFxuICAgICAgICBsb25nRGF0ZUZvcm1hdCA6IHtcbiAgICAgICAgICAgIExUIDogJ0hIOm1tJyxcbiAgICAgICAgICAgIExUUyA6ICdISDptbTpzcycsXG4gICAgICAgICAgICBMIDogJ0REL01NL1lZWVknLFxuICAgICAgICAgICAgTEwgOiAnRCBNTU1NIFlZWVknLFxuICAgICAgICAgICAgTExMIDogJ0QgTU1NTSBZWVlZIEhIOm1tJyxcbiAgICAgICAgICAgIExMTEwgOiAnZGRkZCBEIE1NTU0gWVlZWSBISDptbSdcbiAgICAgICAgfSxcbiAgICAgICAgY2FsZW5kYXIgOiB7XG4gICAgICAgICAgICBzYW1lRGF5IDogJ1tBdWpvdXJk4oCZaHVpIMOgXSBMVCcsXG4gICAgICAgICAgICBuZXh0RGF5IDogJ1tEZW1haW4gw6BdIExUJyxcbiAgICAgICAgICAgIG5leHRXZWVrIDogJ2RkZGQgW8OgXSBMVCcsXG4gICAgICAgICAgICBsYXN0RGF5IDogJ1tIaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBsYXN0V2VlayA6ICdkZGRkIFtkZXJuaWVyIMOgXSBMVCcsXG4gICAgICAgICAgICBzYW1lRWxzZSA6ICdMJ1xuICAgICAgICB9LFxuICAgICAgICByZWxhdGl2ZVRpbWUgOiB7XG4gICAgICAgICAgICBmdXR1cmUgOiAnZGFucyAlcycsXG4gICAgICAgICAgICBwYXN0IDogJ2lsIHkgYSAlcycsXG4gICAgICAgICAgICBzIDogJ3F1ZWxxdWVzIHNlY29uZGVzJyxcbiAgICAgICAgICAgIHNzIDogJyVkIHNlY29uZGVzJyxcbiAgICAgICAgICAgIG0gOiAndW5lIG1pbnV0ZScsXG4gICAgICAgICAgICBtbSA6ICclZCBtaW51dGVzJyxcbiAgICAgICAgICAgIGggOiAndW5lIGhldXJlJyxcbiAgICAgICAgICAgIGhoIDogJyVkIGhldXJlcycsXG4gICAgICAgICAgICBkIDogJ3VuIGpvdXInLFxuICAgICAgICAgICAgZGQgOiAnJWQgam91cnMnLFxuICAgICAgICAgICAgTSA6ICd1biBtb2lzJyxcbiAgICAgICAgICAgIE1NIDogJyVkIG1vaXMnLFxuICAgICAgICAgICAgeSA6ICd1biBhbicsXG4gICAgICAgICAgICB5eSA6ICclZCBhbnMnXG4gICAgICAgIH0sXG4gICAgICAgIGRheU9mTW9udGhPcmRpbmFsUGFyc2U6IC9cXGR7MSwyfShlcnwpLyxcbiAgICAgICAgb3JkaW5hbCA6IGZ1bmN0aW9uIChudW1iZXIsIHBlcmlvZCkge1xuICAgICAgICAgICAgc3dpdGNoIChwZXJpb2QpIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXR1cm4gJ2UnIHdoZW4gZGF5IG9mIG1vbnRoID4gMS4gTW92ZSB0aGlzIGNhc2UgaW5zaWRlXG4gICAgICAgICAgICAgICAgLy8gYmxvY2sgZm9yIG1hc2N1bGluZSB3b3JkcyBiZWxvdy5cbiAgICAgICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL21vbWVudC9tb21lbnQvaXNzdWVzLzMzNzVcbiAgICAgICAgICAgICAgICBjYXNlICdEJzpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlciArIChudW1iZXIgPT09IDEgPyAnZXInIDogJycpO1xuXG4gICAgICAgICAgICAgICAgLy8gV29yZHMgd2l0aCBtYXNjdWxpbmUgZ3JhbW1hdGljYWwgZ2VuZGVyOiBtb2lzLCB0cmltZXN0cmUsIGpvdXJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIGNhc2UgJ00nOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1EnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ0RERCc6XG4gICAgICAgICAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudW1iZXIgKyAobnVtYmVyID09PSAxID8gJ2VyJyA6ICdlJyk7XG5cbiAgICAgICAgICAgICAgICAvLyBXb3JkcyB3aXRoIGZlbWluaW5lIGdyYW1tYXRpY2FsIGdlbmRlcjogc2VtYWluZVxuICAgICAgICAgICAgICAgIGNhc2UgJ3cnOlxuICAgICAgICAgICAgICAgIGNhc2UgJ1cnOlxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyICsgKG51bWJlciA9PT0gMSA/ICdyZScgOiAnZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB3ZWVrIDoge1xuICAgICAgICAgICAgZG93IDogMSwgLy8gTW9uZGF5IGlzIHRoZSBmaXJzdCBkYXkgb2YgdGhlIHdlZWsuXG4gICAgICAgICAgICBkb3kgOiA0ICAvLyBUaGUgd2VlayB0aGF0IGNvbnRhaW5zIEphbiA0dGggaXMgdGhlIGZpcnN0IHdlZWsgb2YgdGhlIHllYXIuXG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBmcjtcblxufSkpKTtcbiIsIi8qIVxuICogRGF0ZXBpY2tlciB2MS4wLjRcbiAqIGh0dHBzOi8vZmVuZ3l1YW5jaGVuLmdpdGh1Yi5pby9kYXRlcGlja2VyXG4gKlxuICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBDaGVuIEZlbmd5dWFuXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE5LTAxLTA2V
21167DAyOjQyOjM2LjE4OFpcbiAqL1xuXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBmYWN0b3J5KHJlcXVpcmUoJ2pxdWVyeScpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJ2pxdWVyeSddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwualF1ZXJ5KSk7XG59KHRoaXMsIGZ1bmN0aW9uICgkKSB7ICd1c2Ugc3RyaWN0JztcblxuICAkID0gJCAmJiAkLmhhc093blByb3BlcnR5KCdkZWZhdWx0JykgPyAkWydkZWZhdWx0J10gOiAkO1xuXG4gIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBfZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci
2116753cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gX2NyZWF0ZUNsYXNzKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBfZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgX2RlZmluZVByb3BlcnRpZXMoQ29uc3RydWN0b3IsIHN0YXRpY1Byb3BzKTtcbiAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gIH1cblxuICB2YXIgREVGQVVMVFMgPSB7XG4gICAgLy8gU2hvdyB0aGUgZGF0ZXBpY2tlciBhdXRvbWF0aWNhbGx5IHdoZW4gaW5pdGlhbGl6ZWRcbiAgICBhdXRvU2hvdzogZmFsc2UsXG4gICAgLy8gSGlkZSB0aGUgZGF0ZXBpY2tlciBhdXRvbWF0aWNhbGx5IHdoZW4gcGlja2VkXG4gICAgYXV0b0hpZGU6IGZhbHNlLFxuICAgIC8vIFBpY2sgdGhlIGluaXRpYWwgZGF0ZSBhdXRvbWF0aWNhbGx5IHdoZW4gaW5pdGlhbGl6ZWRcbiAgICBhdXRvUGljazogZmFsc2UsXG4gICAgLy8gRW5hYmxlIGlubGluZSBtb2RlXG4gICAgaW5saW5lOiBmYWxzZSxcbiAgICAvLyBBIGVsZW1lbnQgKG9yIHNlbGVjdG9yKSBmb3IgcHV0dGluZyB0aGUgZGF0ZXBpY2tlclxuICAgIGNvbnRhaW5lcjogbnVsbCxcbiAgICAvLyBBIGVsZW1lbnQgKG9yIHNlbGVjdG9yKSBmb3IgdHJpZ2dlcmluZyB0aGUgZGF0ZXBpY2tlclxuICAgIHRyaWdnZXI6IG51bGwsXG4gICAgLy8gVGhlIElTTyBsYW5ndWFnZSBjb2RlIChidWlsdC1pbjogZW4tVVMpXG4gICAgbGFuZ3VhZ2U6ICcnLFxuICAgIC8vIFRoZSBkYXRlIHN0cmluZyBmb3JtYXRcbiAgICBmb3JtYXQ6ICdtbS9kZC95eXl5JyxcbiAgICAvLyBUaGUgaW5pdGlhbCBkYXRlXG4gICAgZGF0ZTogbnVsbCxcbiAgICAvLyBUaGUgc3RhcnQgdmlldyBkYXRlXG4gICAgc3RhcnREYXRlOiBudWxsLFxuICAgIC8vIFRoZSBlbmQgdmlldyBkYXRlXG4gICAgZW5kRGF0ZTogbnVsbCxcbiAgICAvLyBUaGUgc3RhcnQgdmlldyB3aGVuIGluaXRpYWxpemVkXG4gICAgc3RhcnRWaWV3OiAwLFxuICAgIC8vIDAgZm9yIGRheXMsIDEgZm9yIG1vbnRocywgMiBmb3IgeWVhcnNcbiAgICAvLyBUaGUgc3RhcnQgZGF5IG9mIHRoZSB3ZWVrXG4gICAgLy8gMCBmb3IgU3VuZGF5LCAxIGZvciBNb25kYXksIDIgZm9yIFR1ZXNkYXksIDMgZm9yIFdlZG5lc2RheSxcbiAgICAvLyA0IGZvciBUaHVyc2RheSwgNSBmb3IgRnJpZGF5LCA2IGZvciBTYXR1cmRheVxuICAgIHdlZWtTdGFydDogMCxcbiAgICAvLyBTaG93IHllYXIgYmVmb3JlIG1vbnRoIG9uIHRoZSBkYXRlcGlja2VyIGhlYWRlclxuICAgIHllYXJGaXJzdDogZmFsc2UsXG4gICAgLy8gQSBzdHJpbmcgc3VmZml4IHRvIHRoZSB5ZWFyIG51bWJlci5cbiAgICB5ZWFyU3VmZml4OiAnJyxcbiAgICAvLyBEYXlzJyBuYW1lIG9mIHRoZSB3ZWVrLlxuICAgIGRheXM6IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSxcbiAgICAvLyBTaG9ydGVyIGRheXMnIG5hbWVcbiAgICBkYXlzU2hvcnQ6IFsnU3VuJywgJ01vbicsICdUdWUnLCAnV2VkJywgJ1RodScsICdGcmknLCAnU2F0J10sXG4gICAgLy8gU2hvcnRlc3QgZGF5cycgbmFtZVxuICAgIGRheXNNaW46IFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXSxcbiAgICAvLyBNb250aHMnIG5hbWVcbiAgICBtb250aHM6IFsnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLCAnT2N0b2JlcicsICdOb3ZlbWJlcicsICdEZWNlbWJlciddLFxuICAgIC8vIFNob3J0ZXIgbW9udGhzJyBuYW1lXG4gICAgbW9udGhzU2hvcnQ6IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEZWMnXSxcbiAgICAvLyBBIGVsZW1lbnQgdGFnIGZvciBlYWNoIGl0ZW0gb2YgeWVhcnMsIG1vbnRocyBhbmQgZGF5c1xuICAgIGl0ZW1UYWc6ICdsaScsXG4gICAgLy8gQSBjbGFzcyAoQ1NTKSBmb3IgbXV0ZWQgZGF0ZSBpdGVtXG4gICAgbXV0ZWRDbGFzczogJ211dGVkJyxcbiAgICAvLyBBIGNsYXNzIChDU1MpIGZvciBwaWNrZWQgZGF0ZSBpdGVtXG4gICAgcGlja2VkQ2xhc3M6ICdwaWNrZWQnLFxuICAgIC8vIEEgY2xhc3MgKENTUykgZm9yIGRpc2FibGVkIGRhdGUgaXRlbVxuICAgIGRpc2FibGVkQ2xhc3M6ICdkaXNhYmxlZCcsXG4gICAgLy8gQSBjbGFzcyAoQ1NTKSBmb3IgaGlnaGxpZ2h0IGRhdGUgaXRlbVxuICAgIGhpZ2hsaWdodGVkQ2xhc3M6ICdoaWdobGlnaHRlZCcsXG4gICAgLy8gVGhlIHRlbXBsYXRlIG9mIHRoZSBkYXRlcGlja2VyXG4gICAgdGVtcGxhdGU6ICc8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1jb250YWluZXJcIj4nICsgJzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXBhbmVsXCIgZGF0YS12aWV3PVwieWVhcnMgcGlja2VyXCI+JyArICc8dWw+JyArICc8bGkgZGF0YS12aWV3PVwieWVhcnMgcHJldlwiPiZsc2FxdW87PC9saT4nICsgJzxsaSBkYXRhLXZpZXc9XCJ5ZWFycyBjdXJyZW50XCI+PC9saT4nICsgJzxsaSBkYXRhLXZpZXc9XCJ5ZWFycyBuZXh0XCI+JnJzYXF1bzs8L2xpPicgKyAnPC91bD4nICsgJzx1bCBkYXRhLXZpZXc9XCJ5ZWFyc1wiPjwvdWw+JyArICc8L2Rpdj4nICsgJzxkaXYgY2xhc3M9XCJkYXRlcGlja2VyLXBhbmVsXCIgZGF0YS12aWV3PVwibW9udGhzIHBpY2tlclwiPicgKyAnPHVsPicgKyAnPGxpIGRhdGEtdmlldz1cInllYXIgcHJldlwiPiZsc2FxdW87PC9saT4nICsgJzxsaSBkYXRhLXZpZXc9XCJ5ZWFyIGN1cnJlbnRcIj48L2xpPicgKyAnPGxpIGRhdGEtdmlldz1cInllYXIgbmV4dFwiPiZyc2FxdW87PC9saT4nICsgJzwvdWw+JyArICc8dWwgZGF0YS12aWV3PVwibW9udGhzXCI+PC91bD4nICsgJzwvZGl2PicgKyAnPGRpdiBjbGFzcz1cImRhdGVwaWNrZXItcGFuZWxcIiBkYXRhLXZpZXc9XCJkYXlzIHBpY2tlclwiPicgKyAnPHVsPicgKyAnPGxpIGRhdGEtdmlldz1cIm1vbnRoIHByZXZcIj4mbHNhcXVvOzwvbGk+JyArICc8bGkgZGF0YS12aWV3PVwibW9udGggY3VycmVudFwiPjwvbGk+JyArICc8bGkgZGF0YS12aWV3PVwibW9udGggbmV4dFwiPiZyc2FxdW87PC9saT4nICsgJzwvdWw+JyArICc8dWwgZGF0YS12aWV3PVwid2Vla1wiPjwvdWw+JyArICc8dWwgZGF0YS12aWV3PVwiZGF5c1wiPjwvdWw+JyArICc8L2Rpdj4nICsgJzwvZGl2PicsXG4gICAgLy8gVGhlIG9mZnNldCB0b3Agb3IgYm90dG9tIG9mIHRoZSBkYXRlcGlja2VyIGZyb20gdGhlIGVsZW1lbnRcbiAgICBvZmZzZXQ6IDEwLFxuICAgIC8vIFRoZSBgei1pbmRleGAgb2YgdGhlIGRhdGVwaWNrZXJcbiAgICB6SW5kZXg6IDEwMDAsXG4gICAgLy8gRmlsdGVyIGVhY2ggZGF0ZSBpdGVtIChyZXR1cm4gYGZhbHNlYCB0byBkaXNhYmxlIGEgZGF0ZSBpdGVtKVxuICAgIGZpbHRlcjogbnVsbCxcbiAgICAvLyBFdmVudCBzaG9ydGN1dHNcbiAgICBzaG93OiBudWxsLFxuICAgIGhpZGU6IG51bGwsXG4gICAgcGljazogbnVsbFxuICB9O1xuXG4gIHZhciBXSU5ET1cgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHt9O1xuICB2YXIgTkFNRVNQQUNFID0gJ2RhdGVwaWNrZXInO1xuICB2YXIgRVZFTlRfQ0xJQ0sgPSBcImNsaWNrLlwiLmNvbmNhdChOQU1FU1BBQ0UpO1xuICB2YXIgRVZFTlRfRk9DVVMgPSBcImZvY3VzLlwiLmNvbmNhdChOQU1FU1BBQ0UpO1xuICB2YXIgRVZFTlRfSElERSA9IFwiaGlkZS5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIEVWRU5UX0tFWVVQID0gXCJrZXl1cC5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIEVWRU5UX1BJQ0sgPSBcInBpY2suXCIuY29uY2F0KE5BTUVTUEFDRSk7XG4gIHZhciBFVkVOVF9SRVNJWkUgPSBcInJlc2l6ZS5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIEVWRU5UX1NDUk9MTCA9IFwic2Nyb2xsLlwiLmNvbmNhdChOQU1FU1BBQ0UpO1xuICB2YXIgRVZFTlRfU0hPVyA9IFwic2hvdy5cIi5jb25jYXQoTkFNRVNQQUNFKTtcbiAgdmFyIENMQVNTX0hJREUgPSBcIlwiLmNvbmNhdChOQU1FU1BBQ0UsIFwiLWhpZGVcIik7XG4gIHZhciBMQU5HVUFHRVMgPSB7fTtcbiAgdmFyIFZJRVdTID0ge1xuICAgIERBWVM6IDAsXG4gICAgTU9OVEhTOiAxLFxuICAgIFlFQVJTOiAyXG4gIH07XG5cbiAgdmFyIHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgZnVuY3Rpb24gdHlwZU9mKG9iaikge1xuICAgIHJldHVybi
21167B0b1N0cmluZy5jYWxsKG9iaikuc2xpY2UoOCwgLTEpLnRvTG93ZXJDYXNlKCk7XG4gIH1cbiAgZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgfVxuICB2YXIgaXNOYU4gPSBOdW1iZXIuaXNOYU4gfHwgV0lORE9XLmlzTmFOO1xuICBmdW5jdGlvbiBpc051bWJlcih2YWx1ZSkge1xuICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmICFpc05hTih2YWx1ZSk7XG4gIH1cbiAgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgfVxuICBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZU9mKHZhbHVlKSA9PT0gJ2RhdGUnICYmICFpc05hTih2YWx1ZS5nZXRUaW1lKCkpO1xuICB9XG4gIGZ1bmN0aW9uIHByb3h5KGZuLCBjb250ZXh0KSB7XG4gICAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDIgPyBfbGVuIC0gMiA6IDApLCBfa2V5ID0gMjsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgICAgYXJnc1tfa2V5IC0gMl0gPSBhcmd1bWVudHNbX2tleV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICAgIGZvciAodmFyIF9sZW4yID0gYXJndW1lbnRzLmxlbmd0aCwgYXJnczIgPSBuZXcgQXJyYXkoX2xlbjIpLCBfa2V5MiA9IDA7IF9rZXkyIDwgX2xlbjI7IF9rZXkyKyspIHtcbiAgICAgICAgYXJnczJbX2tleTJdID0gYXJndW1lbnRzW19rZXkyXTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MuY29uY2F0KGFyZ3MyKSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBzZWxlY3Rvck9mKHZpZXcpIHtcbiAgICByZXR1cm4gXCJbZGF0YS12aWV3PVxcXCJcIi5jb25jYXQodmlldywgXCJcXFwiXVwiKTtcbiAgfVxuICBmdW5jdGlvbiBpc0xlYXBZZWFyKHllYXIpIHtcbiAgICByZXR1cm4geWVhciAlIDQgPT09IDAgJiYgeWVhciAlIDEwMCAhPT0gMCB8fCB5ZWFyICUgNDAwID09PSAwO1xuICB9XG4gIGZ1bmN0aW9uIGdldERheXNJbk1vbnRoKHllYXIsIG1vbnRoKSB7XG4gICAgcmV0dXJuIFszMSwgaXNMZWFwWWVhcih5ZWFyKSA/IDI5IDogMjgsIDMxLCAzMCwgMzEsIDMwLCAzMSwgMzEsIDMwLCAzMSwgMzAsIDMxXVttb250aF07XG4gIH1cbiAgZnVuY3Rpb24gZ2V0TWluRGF5KHllYXIsIG1vbnRoLCBkYXkpIHtcbiAgICByZXR1cm4gTWF0aC5taW4oZGF5LCBnZXREYXlzSW5Nb250aCh5ZWFyLCBtb250aCkpO1xuICB9XG4gIHZhciBmb3JtYXRQYXJ0cyA9IC8oeXxtfGQpKy9nO1xuICBmdW5jdGlvbiBwYXJzZUZvcm1hdChmb3JtYXQpIHtcbiAgICB2YXIgc291cmNlID0gU3RyaW5nKGZvcm1hdCkudG9Mb3dlckNhc2UoKTtcbiAgICB2YXIgcGFydHMgPSBzb3VyY2UubWF0Y2goZm9ybWF0UGFydHMpO1xuXG4gICAgaWYgKCFwYXJ0cyB8fCBwYXJ0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBkYXRlIGZvcm1hdC4nKTtcbiAgICB9XG5cbiAgICBmb3JtYXQgPSB7XG4gICAgICBzb3VyY2U6IHNvdXJjZSxcbiAgICAgIHBhcnRzOiBwYXJ0c1xuICAgIH07XG4gICAgJC5lYWNoKHBhcnRzLCBmdW5jdGlvbiAoaSwgcGFydCkge1xuICAgICAgc3dpdGNoIChwYXJ0KSB7XG4gICAgICAgIGNhc2UgJ2RkJzpcbiAgICAgICAgY2FzZSAnZCc6XG4gICAgICAgICAgZm9ybWF0Lmhhc0RheSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICBmb3JtYXQuaGFzTW9udGggPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3l5eXknOlxuICAgICAgICBjYXNlICd5eSc6XG4gICAgICAgICAgZm9ybWF0Lmhhc1llYXIgPSB0cnVlO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZvcm1hdDtcbiAgfVxuICBmdW5jdGlvbiBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCkge1xuICAgIHZhciBpbmNsdWRlSGlkZGVuID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiBmYWxzZTtcbiAgICB2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgIHZhciBwb3NpdGlvbiA9ICRlbGVtZW50LmNzcygncG9zaXRpb24nKTtcbiAgICB2YXIgZXhjbHVkZVN0YXRpY1BhcmVudCA9IHBvc2l0aW9uID09PSAnYWJzb2x1dGUnO1xuICAgIHZhciBvdmVyZmxvd1JlZ2V4ID0gaW5jbHVkZUhpZGRlbiA/IC9hdXRvfHNjcm9sbHxoaWRkZW4vIDogL2F1dG98c2Nyb2xsLztcbiAgICB2YXIgc2Nyb2xsUGFyZW50ID0gJGVsZW1lbnQucGFyZW50cygpLmZpbHRlcihmdW5jdGlvbiAoaW5kZXgsIHBhcmVudCkge1xuICAgICAgdmFyICRwYXJlbnQgPSAkKHBhcmVudCk7XG5cbiAgICAgIGlmIChleGNsdWRlU3RhdGljUGFyZW50ICYmICRwYXJlbnQuY3NzKCdwb3NpdGlvbicpID09PSAnc3RhdGljJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdmVyZmxvd1JlZ2V4LnRlc3QoJHBhcmVudC5jc3MoJ292ZXJmbG93JykgKyAkcGFyZW50LmNzcygnb3ZlcmZsb3cteScpICsgJHBhcmVudC5jc3MoJ292ZXJmbG93LXgnKSk7XG4gICAgfSkuZXEoMCk7XG4gICAgcmV0dXJuIHBvc2l0aW9uID09PSAnZml4ZWQnIHx8ICFzY3JvbGxQYXJlbnQubGVuZ3RoID8gJChlbGVtZW50Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpIDogc2Nyb2xsUGFyZW50O1xuICB9XG4gIC8qKlxuICAgKiBBZGQgbGVhZGluZyB6ZXJvZXMgdG8gdGhlIGdpdmVuIHZhbHVlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBhZGQuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPTFdIC0gVGhlIGV4cGVjdGVkIHZhbHVlIGxlbmd0aC5cbiAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyBjb252ZXJ0ZWQgdmFsdWUuXG4gICAqL1xuXG4gIGZ1bmN0aW9uIGFkZExlYWRpbmdaZXJvKHZhbHVlKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogMTtcbiAgICB2YXIgc3RyI
21167D0gU3RyaW5nKE1hdGguYWJzKHZhbHVlKSk7XG4gICAgdmFyIGkgPSBzdHIubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSAnJztcblxuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHJlc3VsdCArPSAnLSc7XG4gICAgfVxuXG4gICAgd2hpbGUgKGkgPCBsZW5ndGgpIHtcbiAgICAgIGkgKz0gMTtcbiAgICAgIHJlc3VsdCArPSAnMCc7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdCArIHN0cjtcbiAgfVxuXG4gIHZhciBSRUdFWFBfRElHSVRTID0gL1xcZCsvZztcbiAgdmFyIG1ldGhvZHMgPSB7XG4gICAgLy8gU2hvdyB0aGUgZGF0ZXBpY2tlclxuICAgIHNob3c6IGZ1bmN0aW9uIHNob3coKSB7XG4gICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgdGhpcy5idWlsZCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5zaG93bikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIoRVZFTlRfU0hPVykuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3duID0gdHJ1ZTtcbiAgICAgIHRoaXMuJHBpY2tlci5yZW1vdmVDbGFzcyhDTEFTU19ISURFKS5vbihFVkVOVF9DTElDSywgJC5wcm94eSh0aGlzLmNsaWNrLCB0aGlzKSk7XG4gICAgICB0aGlzLnNob3dWaWV3KHRoaXMub3B0aW9ucy5zdGFydFZpZXcpO1xuXG4gICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgIHRoaXMuJHNjcm9sbFBhcmVudC5vbihFVkVOVF9TQ1JPTEwsICQucHJveHkodGhpcy5wbGFjZSwgdGhpcykpO1xuICAgICAgICAkKHdpbmRvdykub24oRVZFTlRfUkVTSVpFLCB0aGlzLm9uUmVzaXplID0gcHJveHkodGhpcy5wbGFjZSwgdGhpcykpO1xuICAgICAgICAkKGRvY3VtZW50KS5vbihFVkVOVF9DTElDSywgdGhpcy5vbkdsb2JhbENsaWNrID0gcHJveHkodGhpcy5nbG9iYWxDbGljaywgdGhpcykpO1xuICAgICAgICAkKGRvY3VtZW50KS5vbihFVkVOVF9LRVlVUCwgdGhpcy5vbkdsb2JhbEtleXVwID0gcHJveHkodGhpcy5nbG9iYWxLZXl1cCwgdGhpcykpO1xuICAgICAgICB0aGlzLnBsYWNlKCk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBIaWRlIHRoZSBkYXRlcGlja2VyXG4gICAgaGlkZTogZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAgIGlmICghdGhpcy5zaG93bikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIoRVZFTlRfSElERSkuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNob3duID0gZmFsc2U7XG4gICAgICB0aGlzLiRwaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSkub2ZmKEVWRU5UX0NMSUNLLCB0aGlzLmNsaWNrKTtcblxuICAgICAgaWYgKCF0aGlzLmlubGluZSkge1xuICAgICAgICB0aGlzLiRzY3JvbGxQYXJlbnQub2ZmKEVWRU5UX1NDUk9MTCwgdGhpcy5wbGFjZSk7XG4gICAgICAgICQod2luZG93KS5vZmYoRVZFTlRfUkVTSVpFLCB0aGlzLm9uUmVzaXplKTtcbiAgICAgICAgJChkb2N1bWVudCkub2ZmKEVWRU5UX0NMSUNLLCB0aGlzLm9uR2xvYmFsQ2xpY2spO1xuICAgICAgICAkKGRvY3VtZW50KS5vZmYoRVZFTlRfS0VZVVAsIHRoaXMub25HbG9iYWxLZXl1cCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB0b2dnbGU6IGZ1bmN0aW9uIHRvZ2dsZSgpIHtcbiAgICAgIGlmICh0aGlzLnNob3duKSB7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICB9XG4gICAgfSxcbiAgICAvLyBVcGRhdGUgdGhlIGRhdGVwaWNrZXIgd2l0aCB0aGUgY3VycmVudCBpbnB1dCB2YWx1ZVxuICAgIHVwZGF0ZTogZnVuY3Rpb24gdXBkYXRlKCkge1xuICAgICAgdmFyIHZhbHVlID0gdGhpcy5nZXRWYWx1ZSgpO1xuXG4gICAgICBpZiAodmFsdWUgPT09IHRoaXMub2xkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnNldERhdGUodmFsdWUsIHRydWUpO1xuICAgICAgdGhpcy5vbGRWYWx1ZSA9IHZhbHVlO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQaWNrIHRoZSBjdXJyZW50IGRhdGUgdG8gdGhlIGVsZW1lbnRcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBfdmlldyAocHJpdmF0ZSlcbiAgICAgKi9cbiAgICBwaWNrOiBmdW5jdGlvbiBwaWNrKF92aWV3KSB7XG4gICAgICB2Y
21167XIgJHRoaXMgPSB0aGlzLiRlbGVtZW50O1xuICAgICAgdmFyIGRhdGUgPSB0aGlzLmRhdGU7XG5cbiAgICAgIGlmICh0aGlzLnRyaWdnZXIoRVZFTlRfUElDSywge1xuICAgICAgICB2aWV3OiBfdmlldyB8fCAnJyxcbiAgICAgICAgZGF0ZTogZGF0ZVxuICAgICAgfSkuaXNEZWZhdWx0UHJldmVudGVkKCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkYXRlID0gdGhpcy5mb3JtYXREYXRlKHRoaXMuZGF0ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlKGRhdGUpO1xuXG4gICAgICBpZiAodGhpcy5pc0lucHV0KSB7XG4gICAgICAgICR0aGlzLnRyaWdnZXIoJ2lucHV0Jyk7XG4gICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZScpO1xuICAgICAgfVxuICAgIH0sXG4gICAgLy8gUmVzZXQgdGhlIGRhdGVwaWNrZXJcbiAgICByZXNldDogZnVuY3Rpb24gcmVzZXQoKSB7XG4gICAgICB0aGlzLnNldERhdGUodGhpcy5pbml0aWFsRGF0ZSwgdHJ1ZSk7XG4gICAgICB0aGlzLnNldFZhbHVlKHRoaXMuaW5pdGlhbFZhbHVlKTtcblxuICAgICAgaWYgKHRoaXMuc2hvd24pIHtcbiAgICAgICAgdGhpcy5zaG93Vmlldyh0aGlzLm9wdGlvbnMuc3RhcnRWaWV3KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBtb250aCBuYW1lIHdpdGggZ2l2ZW4gYXJndW1lbnQgb3IgdGhlIGN1cnJlbnQgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IG1vbnRoIChvcHRpb25hbClcbiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IHNob3J0Rm9ybSAob3B0aW9uYWwpXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAobW9udGggbmFtZSlcbiAgICAgKi9cbiAgICBnZXRNb250aE5hbWU6IGZ1bmN0aW9uIGdldE1vbnRoTmFtZShtb250aCwgc2hvcnRGb3JtKSB7XG4gICAgICB2Y
21167XIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcbiAgICAgIHZhciBtb250aHNTaG9ydCA9IG9wdGlvbnMubW9udGhzU2hvcnQ7XG4gICAgICB2YXIgbW9udGhzID0gb3B0aW9ucy5tb250aHM7XG5cbiAgICAgIGlmICgkLmlzTnVtZXJpYyhtb250aCkpIHtcbiAgICAgICAgbW9udGggPSBOdW1iZXIobW9udGgpO1xuICAgICAgfSBlbHNlIGlmIChpc1VuZGVmaW5lZChzaG9ydEZvcm0pKSB7XG4gICAgICAgIHNob3J0Rm9ybSA9IG1vbnRoO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hvcnRGb3JtID09PSB0cnVlKSB7XG4gICAgICAgIG1vbnRocyA9IG1vbnRoc1Nob3J0O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbW9udGhzW2lzTnVtYmVyKG1vbnRoKSA/IG1vbnRoIDogdGhpcy5kYXRlLmdldE1vbnRoKCldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGRheSBuYW1lIHdpdGggZ2l2ZW4gYXJndW1lbnQgb3IgdGhlIGN1cnJlbnQgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtOdW1iZXJ9IGRheSAob3B0aW9uYWwpXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBzaG9ydEZvcm0gKG9wdGlvbmFsKVxuICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gbWluIChvcHRpb25hbClcbiAgICAgKiBAcmV0dXJuIHtTdHJpbmd9IChkYXkgbmFtZSlcbiAgICAgKi9cbiAgICBnZXREYXlOYW1lOiBmdW5jdGlvbiBnZXREYXlOYW1lKGRheSwgc2hvcnRGb3JtLCBtaW4pIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgdmFyIGRheXMgPSBvcHRpb25zLmRheXM7XG5cbiAgICAgIGlmICgkLmlzTnVtZXJpYyhkYXkpKSB7XG4gICAgICAgIGRheSA9IE51bWJlcihkYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGlzVW5kZWZpbmVkKG1pbikpIHtcbiAgICAgICAgICBtaW4gPSBzaG9ydEZvcm07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNVbmRlZmluZWQoc2hvcnRGb3JtKSkge1xuICAgICAgICAgIHNob3J0Rm9ybSA9IGRheTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAobWluKSB7XG4gICAgICAgIGRheXMgP
21167SBvcHRpb25zLmRheXNNaW47XG4gICAgICB9IGVsc2UgaWYgKHNob3J0Rm9ybSkge1xuICAgICAgICBkYXlzID0gb3B0aW9ucy5kYXlzU2hvcnQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXlzW2lzTnVtYmVyKGRheSkgPyBkYXkgOiB0aGlzLmRhdGUuZ2V0RGF5KCldO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGN1cnJlbnQgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBmb3JtYXR0ZWQgKG9wdGlvbmFsKVxuICAgICAqIEByZXR1cm4ge0RhdGV8U3RyaW5nfSAoZGF0ZSlcbiAgICAgKi9cbiAgICBnZXREYXRlOiBmdW5jdGlvbiBnZXREYXRlKGZvcm1hdHRlZCkge1xuICAgICAgdmFyIGRhdGUgPSB0aGlzLmRhdGU7XG4gICAgICByZXR1cm4gZm9ybWF0dGVkID8gdGhpcy5mb3JtYXREYXRlKGRhdGUpIDogbmV3IERhdGUoZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgY3VycmVudCBkYXRlIHdpdGggYSBuZXcgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gICAgICogQHBhcmFtIHtCb29sZWFufSBfdXBkYXRlZCAocHJpdmF0ZSlcbiAgICAgKi9cbiAgICBzZXREYXRlOiBmdW5jdGlvbiBzZXREYXRlKGRhdGUsIF91cGRhdGVkKSB7XG4gICAgICB2YXIgZmlsdGVyID0gdGhpcy5vcHRpb25zLmZpbHRlcjtcblxuICAgICAgaWYgKGlzRGF0ZShkYXRlKSB8fCBpc1N0cmluZyhkYXRlKSkge1xuICAgICAgICBkYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG5cbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihmaWx0ZXIpICYmIGZpbHRlci5jYWxsKHRoaXMuJGVsZW1lbnQsIGRhdGUsICdkYXknKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRhdGUgPSBkYXRlO1xuICAgICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUoZGF0ZSk7XG5cbiAgICAgICAgaWYgKCFfdXBkYXRlZCkge1xuICAgICAgICAgIHRoaXMucGljaygpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYnVpbHQpIHtcbiAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFNldCB0aGUgc3RhcnQgdmlldyBkYXRlIHdpdGggYSBuZXcgZGF0ZVxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfHN0cmluZ3xudWxsfSBkYXRlXG4gICAgICovXG4gICAgc2V0U3RhcnREYXRlOiBmdW5jdGlvbiBzZXRTdGFydERhdGUoZGF0ZSkge1xuICAgICAgaWYgKGlzRGF0ZShkYXRlKSB8fCBpc1N0cmluZyhkYXRlKSkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKGRhdGUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zdGFydERhdGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5idWlsdCkge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBTZXQgdGhlIGVuZCB2aWV3IGRhdGUgd2l0aCBhIG5ldyBkYXRlXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge0RhdGV8c3RyaW5nfG51bGx9IGRhdGVcbiAgICAgKi9cbiAgICBzZXRFbmREYXRlOiBmdW5jdGlvbiBzZXRFbmREYXRlKGRhdGUpIHtcbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkgfHwgaXNTdHJpbmcoZGF0ZSkpIHtcbiAgICAgICAgdGhpcy5lbmREYXRlID0gdGhpcy5wYXJzZURhdGUoZGF0ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5idWlsdCkge1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSBhIGRhdGUgc3RyaW5nIHdpdGggdGhlIHNldCBkYXRlIGZvcm1hdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IGRhdGVcbiAgICAgKiBAcmV0dXJuIHtEYXRlfSAocGFyc2VkIGRhdGUpXG4gICAgICovXG4gICAgcGFyc2VEYXRlOiBmdW5jdGlvbiBwYXJzZURhdGUoZGF0ZSkge1xuICAgICAgdmFyIGZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgICAgdmFyIHBhcnRzID0gW107XG5cbiAgICAgIGlmICghaXNEYXRlKGRhdGUpKSB7XG4gICAgICAgIGlmIChpc1N0cmluZyhkYXRlKSkge1xuICAgICAgICAgIHBhcnRzID0gZGF0ZS5tYXRjaChSRUdFWFBfRElHSVRTKSB8fCBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRhdGUgPSBkYXRlID8gbmV3IERhdGUoZGF0ZSkgOiBuZXcgRGF0ZSgpO1xuXG4gICAgICAgIGlmICghaXNEYXRlKGRhdGUpKSB7XG4gICAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocGFydHMubGVuZ3RoID09PSBmb3JtYXQucGFydHMubGVuZ3RoKSB7XG4gICAgICAgICAgJC5lYWNoKHBhcnRzLCBmdW5jdGlvbiAoaSwgcGFydCkge1xuICAgICAgICAgICAgdmFyIHZhbHVlID0gcGFyc2VJbnQocGFydCwgMTApO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdC5wYXJ0c1tpXSkge1xuICAgICAgICAgICAgICBjYXNlICdkZCc6XG4gICAgICAgICAgICAgIGNhc2UgJ2QnOlxuICAgICAgICAgICAgICAgIGRhdGUuc2V0RGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAnbW0nOlxuICAgICAgICAgICAgICBjYXNlICdtJzpcbiAgICAgICAgICAgICAgICBkYXRlLnNldE1vbnRoKHZhbHVlIC0gMSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgY2FzZSAneXknOlxuICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoMjAwMCArIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICBjYXNlICd5eXl5JzpcbiAgICAgICAgICAgICAgICAvLyBDb252ZXJ0cyAyLWRpZ2l0IHllYXIgdG8gMjAwMCtcbiAgICAgICAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHBhcnQubGVuZ3RoID09PSAyID8gMjAwMCArIHZhbHVlIDogdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgI
21167H1cbiAgICAgIH0gLy8gSWdub3JlIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzIGFuZCBtaWxsaXNlY29uZHMgdG8gYXZvaWQgc2lkZSBlZmZlY3QgKCMxOTIpXG5cblxuICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZvcm1hdCBhIGRhdGUgb2JqZWN0IHRvIGEgc3RyaW5nIHdpdGggdGhlIHNldCBkYXRlIGZvcm1hdFxuICAgICAqXG4gICAgICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gICAgICogQHJldHVybiB7U3RyaW5nfSAoZm9ybWF0dGVkIGRhdGUpXG4gICAgICovXG4gICAgZm9ybWF0RGF0ZTogZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlKSB7XG4gICAgICB2YXIgZm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG4gICAgICB2YXIgZm9ybWF0dGVkID0gJyc7XG5cbiAgICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgICAgdmFyIHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgIHZhciBtb250aCA9IGRhdGUuZ2V0TW9udGgoKTtcbiAgICAgICAgdmFyIGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgICB2YXIgdmFsdWVzID0ge1xuICAgICAgICAgIGQ6IGRheSxcbiAgICAgICAgICBkZDogYWRkTGVhZGluZ1plcm8oZGF5LCAyKSxcbiAgICAgICAgICBtOiBtb250aCArIDEsXG4gICAgICAgICAgbW06IGFkZExlYWRpbmdaZXJvKG1vbnRoICsgMSwgMiksXG4gICAgICAgICAgeXk6IFN0cmluZyh5ZWFyKS5zdWJzdHJpbmcoMiksXG4gICAgICAgICAgeXl5eTogYWRkTGVhZGluZ1plcm8oeWVhciwgNClcbiAgICAgICAgfTtcbiAgICAgICAgZm9ybWF0dGVkID0gZm9ybWF0LnNvdXJjZTtcbiAgICAgICAgJC5lYWNoKGZvcm1hdC5wYXJ0cywgZnVuY3Rpb24gKGksIHBhcnQpIHtcbiAgICAgICAgICBmb3JtYXR0ZWQgPSBmb3JtYXR0ZWQucmVwbGFjZShwYXJ0LCB2YWx1ZXNbcGFydF0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGZvcm1hdHRlZDtcbiAgICB9LFxuICAgIC8vIERlc3Ryb3kgdGhlIGRhdGVwaWNrZXIgYW5kIHJlbW92ZSB0aGUgaW5zdGFuY2UgZnJvbSB0aGUgdGFyZ2V0IGVsZW1lbnRcbiAgICBkZXN0cm95OiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICAgIHRoaXMudW5idWlsZCgpO1xuICAgICAgdGhpcy4kZWxlbWVudC5yZW1vdmVEYXRhKE5BTUVTUEFDRSk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBoYW5kbGVycyA9IHtcbiAgICBjbGljazogZnVuY3Rpb24gY2xpY2soZSkge1xuICAgICAgdmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIGRhdGUgPSB0aGlzLmRhdGUsXG4gICAgICAgICAgdmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlLFxuICAgICAgICAgIGZvcm1hdCA9IHRoaXMuZm9ybWF0O1xuICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKCR0YXJnZXQuaGFzQ2xhc3MoJ2Rpc2FibGVkJykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB2Y
21167XIgdmlldyA9ICR0YXJnZXQuZGF0YSgndmlldycpO1xuICAgICAgdmFyIHZpZXdZZWFyID0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciB2aWV3TW9udGggPSB2aWV3RGF0ZS5nZXRNb250aCgpO1xuICAgICAgdmFyIHZpZXdEYXkgPSB2aWV3RGF0ZS5nZXREYXRlKCk7XG5cbiAgICAgIHN3aXRjaCAodmlldykge1xuICAgICAgICBjYXNlICd5ZWFycyBwcmV2JzpcbiAgICAgICAgY2FzZSAneWVhcnMgbmV4dCc6XG4gICAgICAgICAge1xuICAgICAgICAgICAgdmlld1llYXIgPSB2aWV3ID09PSAneWVhcnMgcHJldicgPyB2aWV3WWVhciAtIDEwIDogdmlld1llYXIgKyAxMDtcbiAgICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICAgIHZpZXdEYXRlLnNldERhdGUoZ2V0TWluRGF5KHZpZXdZZWFyLCB2aWV3TW9udGgsIHZpZXdEYXkpKTtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyWWVhcnMoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cblxuICAgICAgICBjYXNlICd5ZWFyIHByZXYnOlxuICAgICAgICBjYXNlICd5ZWFyIG5leHQnOlxuICAgICAgICAgIHZpZXdZZWFyID0gdmlldyA9PT0gJ3llYXIgcHJldicgPyB2aWV3WWVhciAtIDEgOiB2aWV3WWVhciArIDE7XG4gICAgICAgICAgdmlld0RhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldERhdGUoZ2V0TWluRGF5KHZpZXdZZWFyLCB2aWV3TW9udGgsIHZpZXdEYXkpKTtcbiAgICAgICAgICB0aGlzLnJlbmRlck1vbnRocygpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3llYXIgY3VycmVudCc6XG4gICAgICAgICAgaWYgKGZvcm1hdC5oYXNZZWFyKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLllFQVJTKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICd5ZWFyIHBpY2tlZCc6XG4gICAgICAgICAgaWYgKGZvcm1hdC5oYXNNb250aCkge1xuICAgICAgICAgICAgdGhpcy5zaG93VmlldyhWSUVXUy5NT05USFMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkdGFyZ2V0LmFkZENsYXNzKG9wdGlvbnMucGlja2VkQ2xhc3MpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3Mob3B0aW9ucy5waWNrZWRDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLmhpZGVWaWV3KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5waWNrKCd5ZWFyJyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAneWVhcic6XG4gICAgICAgICAgdmlld1llYXIgPSBwYXJzZUludCgk
21167dGFyZ2V0LnRleHQoKSwgMTApO1xuICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIGRhdGUuc2V0RGF0ZShnZXRNaW5EYXkodmlld1llYXIsIHZpZXdNb250aCwgdmlld0RheSkpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICB2aWV3RGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG5cbiAgICAgICAgICBpZiAoZm9ybWF0Lmhhc01vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLk1PTlRIUyk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0YXJnZXQuYWRkQ2xhc3Mob3B0aW9ucy5waWNrZWRDbGFzcykuc2libGluZ3MoKS5yZW1vdmVDbGFzcyhvcHRpb25zLnBpY2tlZENsYXNzKTtcbiAgICAgICAgICAgIHRoaXMuaGlkZVZpZXcoKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnBpY2soJ3llYXInKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtb250aCBwcmV2JzpcbiAgICAgICAgY2FzZSAnbW9udGggbmV4dCc6XG4gICAgICAgICAgdmlld01vbnRoID0gdmlldyA9PT0gJ21vbnRoIHByZXYnID8gdmlld01vbnRoIC0gMSA6IHZpZXdNb250aCArIDE7XG5cbiAgICAgICAgICBpZiAodmlld01vbnRoIDwgMCkge1xuICAgICAgICAgICAgdmlld1llYXIgLT0gMTtcbiAgICAgICAgICAgIHZpZXdNb250aCArPSAxMjtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpZXdNb250aCA+IDExKSB7XG4gICAgICAgICAgICB2aWV3WWVhciArPSAxO1xuICAgICAgICAgICAgdmlld01vbnRoIC09IDEyO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICB2aWV3RGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0TW9udGgodmlld01vbnRoKTtcbiAgICAgICAgICB0aGlzLnJlbmRlckRheXMoKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtb250aCBjdXJyZW50JzpcbiAgICAgICAgICBpZiAoZm9ybWF0Lmhhc01vbnRoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLk1PTlRIUyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnbW9udGggcGlja2VkJzpcbiAgICAgICAgICBpZiAoZm9ybWF0Lmhhc0RheSkge1xuICAgICAgICAgICAgdGhpcy5zaG93VmlldyhWSUVXUy5EQVlTKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHRhcmdldC5hZGRDbGFzcyhvcHRpb25zLnBpY2tlZENsYXNzKS5zaWJsaW5ncygpLnJlbW92ZUNsYXNzKG9wdGlvbnMucGlja2VkQ2xhc3MpO1xuICAgICAgICAgICAgdGhpcy5oaWRlVmlldygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucGljaygnbW9udGgnKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdtb250aCc6XG4gICAgICAgICAgdmlld01vbnRoID0gJC5pbkFycmF5KCR0YXJnZXQudGV4dCgpLCBvcHRpb25zLm1vbnRoc1Nob3J0KTtcbiAgICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTsgLy8gU2V0IGRhdGUgYmVmb3JlIG1vbnRoIHRvIGF2b2lkIG1vbnRoIGNoYW5naW5nICgjMTk1KVxuXG4gICAgICAgICAgZGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG4gICAgICAgICAgZGF0ZS5zZXRNb250aCh2aWV3TW9udGgpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldEZ1bGxZZWFyKHZpZXdZZWFyKTtcbiAgICAgICAgICB2aWV3RGF0ZS5zZXREYXRlKGdldE1pbkRheSh2aWV3WWVhciwgdmlld01vbnRoLCB2aWV3RGF5KSk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0TW9udGgodmlld01vbnRoKTtcblxuICAgICAgICAgIGlmIChmb3JtYXQuaGFzRGF5KSB7XG4gICAgICAgICAgICB0aGlzLnNob3dWaWV3KFZJRVdTLkRBWVMpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkdGFyZ2V0LmFkZENsYXNzKG9wdGlvbnMucGlja2VkQ2xhc3MpLnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3Mob3B0aW9ucy5waWNrZWRDbGFzcyk7XG4gICAgICAgICAgICB0aGlzLmhpZGVWaWV3KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5waWNrKCdtb250aCcpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2RheSBwcmV2JzpcbiAgICAgICAgY2FzZSAnZGF5IG5leHQnOlxuICAgICAgICBjYXNlICdkYXknOlxuICAgICAgICAgIGlmICh2aWV3ID09PSAnZGF5IHByZXYnKSB7XG4gICAgICAgICAgICB2aWV3TW9udGggLT0gMTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHZpZXcgPT09ICdkYXkgbmV4dCcpIHtcbiAgICAgICAgICAgIHZpZXdNb250aCArPSAxO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZpZXdEYXkgPSBwYXJzZUludCgk
21167dGFyZ2V0LnRleHQoKSwgMTApO1xuICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIGRhdGUuc2V0TW9udGgodmlld01vbnRoKTtcbiAgICAgICAgICBkYXRlLnNldERhdGUodmlld0RheSk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0RnVsbFllYXIodmlld1llYXIpO1xuICAgICAgICAgIHZpZXdEYXRlLnNldE1vbnRoKHZpZXdNb250aCk7XG4gICAgICAgICAgdmlld0RhdGUuc2V0RGF0ZSh2aWV3RGF5KTtcbiAgICAgICAgICB0aGlzLnJlbmRlckRheXMoKTtcblxuICAgICAgICAgIGlmICh2aWV3ID09PSAnZGF5Jykge1xuICAgICAgICAgICAgdGhpcy5oaWRlVmlldygpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMucGljaygnZGF5Jyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZGF5IHBpY2tlZCc6XG4gICAgICAgICAgdGhpcy5oaWRlVmlldygpO1xuICAgICAgICAgIHRoaXMucGljaygnZGF5Jyk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgIH1cbiAgICB9LFxuICAgIGdsb2JhbENsaWNrOiBmdW5jdGlvbiBnbG9iYWxDbGljayhfcmVmKSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gX3JlZi50YXJnZXQ7XG4gICAgICB2YXIgZWxlbWVudCA9IHRoaXMuZWxlbWVudCxcbiAgICAgICAgICAkdHJpZ2dlciA9IHRoaXMuJHRyaWdnZXI7XG4gICAgICB2YXIgdHJpZ2dlciA9ICR0cmlnZ2VyWzBdO1xuICAgICAgdmFyIGhpZGRlbiA9IHRydWU7XG5cbiAgICAgIHdoaWxlICh0YXJnZXQgIT09IGRvY3VtZW50KSB7XG4gICAgICAgIGlmICh0YXJnZXQgPT09IHRyaWdnZXIgfHwgdGFyZ2V0ID09PSBlbGVtZW50KSB7XG4gICAgICAgICAgaGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGFyZW50Tm9kZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGhpZGRlbikge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGtleXVwOiBmdW5jdGlvbiBrZXl1cCgpIHtcbiAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfSxcbiAgICBnbG9iYWxLZXl1cDogZnVuY3Rpb24gZ2xvYmFsS2V5dXAoX3JlZjIpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBfcmVmMi50YXJnZXQsXG4gICAgICAgICAga2V5ID0gX3JlZjIua2V5LFxuICAgICAgICAgIGtleUNvZGUgPSBfcmVmMi5rZXlDb2RlO1xuXG4gICAgICBpZiAodGhpcy5pc0lucHV0ICYmIHRhcmdldCAhPT0gdGhpcy5lbGVtZW50ICYmIHRoaXMuc2hvd24gJiYgKGtleSA9PT0gJ1RhYicgfHwga2V5Q29kZSA9PT0gOSkpIHtcbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciByZW5kZXIgPSB7XG4gICAgcmVuZGVyOiBmdW5jdGlvbiByZW5kZXIoKSB7XG4gICAgICB0aGlzLnJlbmRlclllYXJzKCk7XG4gICAgICB0aGlzLnJlbmRlck1vbnRocygpO1xuICAgICAgdGhpcy5yZW5kZXJEYXlzKCk7XG4gICAgfSxcbiAgICByZW5kZXJXZWVrOiBmdW5jdGlvbiByZW5kZXJXZWVrKCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB2Y
21167XIgX3RoaXMkb3B0aW9ucyA9IHRoaXMub3B0aW9ucyxcbiAgICAgICAgICB3ZWVrU3RhcnQgPSBfdGhpcyRvcHRpb25zLndlZWtTdGFydCxcbiAgICAgICAgICBkYXlzTWluID0gX3RoaXMkb3B0aW9ucy5kYXlzTWluO1xuICAgICAgd2Vla1N0YXJ0ID0gcGFyc2VJbnQod2Vla1N0YXJ0LCAxMCkgJSA3O1xuICAgICAgZGF5c01pbiA9IGRheXNNaW4uc2xpY2Uod2Vla1N0YXJ0KS5jb25jYXQoZGF5c01pbi5zbGljZSgwLCB3ZWVrU3RhcnQpKTtcbiAgICAgICQuZWFjaChkYXlzTWluLCBmdW5jdGlvbiAoaSwgZGF5KSB7XG4gICAgICAgIGl0ZW1zLnB1c2goX3RoaXMuY3JlYXRlSXRlbSh7XG4gICAgICAgICAgdGV4dDogZGF5XG4gICAgICAgIH0pKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy4kd2Vlay5odG1sKGl0ZW1zLmpvaW4oJycpKTtcbiAgICB9LFxuICAgIHJlbmRlclllYXJzOiBmdW5jdGlvbiByZW5kZXJZZWFycygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmVuZERhdGU7XG4gICAgICB2YXIgZGlzYWJsZWRDbGFzcyA9IG9wdGlvbnMuZGlzYWJsZWRDbGFzcyxcbiAgICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcixcbiAgICAgICAgICB5ZWFyU3VmZml4ID0gb3B0aW9ucy55ZWFyU3VmZml4O1xuICAgICAgdmFyIHZpZXdZZWFyID0gdGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgdmFyIG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICB2Y
21167XIgdGhpc1llYXIgPSBub3cuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciB5ZWFyID0gdGhpcy5kYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgc3RhcnQgPSAtNTtcbiAgICAgIHZhciBlbmQgPSA2O1xuICAgICAgdmFyIGl0ZW1zID0gW107XG4gICAgICB2YXIgcHJldkRpc2FibGVkID0gZmFsc2U7XG4gICAgICB2YXIgbmV4dERpc2FibGVkID0gZmFsc2U7XG4gICAgICB2YXIgaTtcblxuICAgICAgZm9yIChpID0gc3RhcnQ7IGkgPD0gZW5kOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2aWV3WWVhciArIGksIDEsIDEpO1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPCBzdGFydERhdGUuZ2V0RnVsbFllYXIoKTtcblxuICAgICAgICAgIGlmIChpID09PSBzdGFydCkge1xuICAgICAgICAgICAgcHJldkRpc2FibGVkID0gZGlzYWJsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBlbmREYXRlKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPiBlbmREYXRlLmdldEZ1bGxZZWFyKCk7XG5cbiAgICAgICAgICBpZiAoaSA9PT0gZW5kKSB7XG4gICAgICAgICAgICBuZXh0RGlzYWJsZWQgPSBkaXNhYmxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWRpc2FibGVkICYmIGZpbHRlcikge1xuICAgICAgICAgIGRpc2FibGVkID0gZmlsdGVyLmNhbGwodGhpcy4kZWxlbWVudCwgZGF0ZSwgJ3llYXInKSA9PT0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2Y
21167XIgcGlja2VkID0gdmlld1llYXIgKyBpID09PSB5ZWFyO1xuICAgICAgICB2YXIgdmlldyA9IHBpY2tlZCA/ICd5ZWFyIHBpY2tlZCcgOiAneWVhcic7XG4gICAgICAgIGl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBwaWNrZWQ6IHBpY2tlZCxcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgdGV4dDogdmlld1llYXIgKyBpLFxuICAgICAgICAgIHZpZXc6IGRpc2FibGVkID8gJ3llYXIgZGlzYWJsZWQnIDogdmlldyxcbiAgICAgICAgICBoaWdobGlnaHRlZDogZGF0ZS5nZXRGdWxsWWVhcigpID09PSB0aGlzWWVhclxuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJHllYXJzUHJldi50b2dnbGVDbGFzcyhkaXNhYmxlZENsYXNzLCBwcmV2RGlzYWJsZWQpO1xuICAgICAgdGhpcy4keWVhcnNOZXh0LnRvZ2dsZUNsYXNzKGRpc2FibGVkQ2xhc3MsIG5leHREaXNhYmxlZCk7XG4gICAgICB0aGlzLiR5ZWFyc0N1cnJlbnQudG9nZ2xlQ2xhc3MoZGlzYWJsZWRDbGFzcywgdHJ1ZSkuaHRtbChcIlwiLmNvbmNhdCh2aWV3WWVhciArIHN0YXJ0ICsgeWVhclN1ZmZpeCwgXCIgLSBcIikuY29uY2F0KHZpZXdZZWFyICsgZW5kKS5jb25jYXQoeWVhclN1ZmZpeCkpO1xuICAgICAgdGhpcy4keWVhcnMuaHRtbChpdGVtcy5qb2luKCcnKSk7XG4gICAgfSxcbiAgICByZW5kZXJNb250aHM6IGZ1bmN0aW9uIHJlbmRlck1vbnRocygpIHtcbiAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmVuZERhdGUsXG4gICAgICAgICAgdmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlO1xuICAgICAgdmFyIGRpc2FibGVkQ2xhc3MgPSBvcHRpb25zLmRpc2FibGVkQ2xhc3MgfHwgJyc7XG4gICAgICB2Y
21167XIgbW9udGhzID0gb3B0aW9ucy5tb250aHNTaG9ydDtcbiAgICAgIHZhciBmaWx0ZXIgPSAkLmlzRnVuY3Rpb24ob3B0aW9ucy5maWx0ZXIpICYmIG9wdGlvbnMuZmlsdGVyO1xuICAgICAgdmFyIHZpZXdZZWFyID0gdmlld0RhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgdmFyIHRoaXNZZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgdGhpc01vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICB2YXIgeWVhciA9IHRoaXMuZGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgdmFyIG1vbnRoID0gdGhpcy5kYXRlLmdldE1vbnRoKCk7XG4gICAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICAgIHZhciBwcmV2RGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHZhciBuZXh0RGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHZhciBpO1xuXG4gICAgICBmb3IgKGkgPSAwOyBpIDw9IDExOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSh2aWV3WWVhciwgaSwgMSk7XG4gICAgICAgIHZhciBkaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChzdGFydERhdGUpIHtcbiAgICAgICAgICBwcmV2RGlzYWJsZWQgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPT09IHN0YXJ0RGF0ZS5nZXRGdWxsWWVhcigpO1xuICAgICAgICAgIGRpc2FibGVkID0gcHJldkRpc2FibGVkICYmIGRhdGUuZ2V0TW9udGgoKSA8IHN0YXJ0RGF0ZS5nZXRNb250aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBlbmREYXRlKSB7XG4gICAgICAgICAgbmV4dERpc2FibGVkID0gZGF0ZS5nZXRGdWxsWWVhcigpID09PSBlbmREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICAgICAgZGlzYWJsZWQgPSBuZXh0RGlzYWJsZWQgJiYgZGF0ZS5nZXRNb250aCgpID4gZW5kRGF0ZS5nZXRNb250aCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFkaXNhYmxlZCAmJiBmaWx0ZXIpIHtcbiAgICAgICAgICBkaXNhYmxlZCA9IGZpbHRlci5jYWxsKHRoaXMuJGVsZW1lbnQsIGRhdGUsICdtb250aCcpID09PSBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBwaWNrZWQgPSB2aWV3WWVhciA9PT0geWVhciAmJiBpID09PSBtb250aDtcbiAgICAgICAgdmFyIHZpZXcgPSBwaWNrZWQgPyAnbW9udGggcGlja2VkJyA6ICdtb250aCc7XG4gICAgICAgIGl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgcGlja2VkOiBwaWNrZWQsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWQ6IHZpZXdZZWFyID09PSB0aGlzWWVhciAmJiBkYXRlLmdldE1vbnRoKCkgPT09IHRoaXNNb250aCxcbiAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICB0ZXh0OiBtb250aHNbaV0sXG4gICAgICAgICAgdmlldzogZGlzYWJsZWQgPyAnbW9udGggZGlzYWJsZWQnIDogdmlld1xuICAgICAgICB9KSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJHllYXJQcmV2LnRvZ2dsZUNsYXNzKGRpc2FibGVkQ2xhc3MsIHByZXZEaXNhYmxlZCk7XG4gICAgICB0aGlzLiR5ZWFyTmV4dC50b2dnbGVDbGFzcyhkaXNhYmxlZENsYXNzLCBuZXh0RGlzYWJsZWQpO1xuICAgICAgdGhpcy4keWVhckN1cnJlbnQudG9nZ2xlQ2xhc3MoZGlzYWJsZWRDbGFzcywgcHJldkRpc2FibGVkICYmIG5leHREaXNhYmxlZCkuaHRtbCh2aWV3WWVhciArIG9wdGlvbnMueWVhclN1ZmZpeCB8fCAnJyk7XG4gICAgICB0aGlzLiRtb250aHMuaHRtbChpdGVtcy5qb2luKCcnKSk7XG4gICAgfSxcbiAgICByZW5kZXJEYXlzOiBmdW5jdGlvbiByZW5kZXJEYXlzKCkge1xuICAgICAgdmFyICRlbGVtZW50ID0gdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMuc3RhcnREYXRlLFxuICAgICAgICAgIGVuZERhdGUgPSB0aGlzLmVuZERhdGUsXG4gICAgICAgICAgdmlld0RhdGUgPSB0aGlzLnZpZXdEYXRlLFxuICAgICAgICAgIGN1cnJlbnREYXRlID0gdGhpcy5kYXRlO1xuICAgICAgdmFyIGRpc2FibGVkQ2xhc3MgPSBvcHRpb25zLmRpc2FibGVkQ2xhc3MsXG4gICAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXIsXG4gICAgICAgICAgbW9udGhzID0gb3B0aW9ucy5tb250aHMsXG4gICAgICAgICAgd2Vla1N0YXJ0ID0gb3B0aW9ucy53ZWVrU3RhcnQsXG4gICAgICAgICAgeWVhclN1ZmZpeCA9IG9wdGlvbnMueWVhclN1ZmZpeDtcbiAgICAgIHZhciB2aWV3WWVhciA9IHZpZXdEYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2Y
21167XIgdmlld01vbnRoID0gdmlld0RhdGUuZ2V0TW9udGgoKTtcbiAgICAgIHZhciBub3cgPSBuZXcgRGF0ZSgpO1xuICAgICAgdmFyIHRoaXNZZWFyID0gbm93LmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgdGhpc01vbnRoID0gbm93LmdldE1vbnRoKCk7XG4gICAgICB2YXIgdGhpc0RheSA9IG5vdy5nZXREYXRlKCk7XG4gICAgICB2YXIgeWVhciA9IGN1cnJlbnREYXRlLmdldEZ1bGxZZWFyKCk7XG4gICAgICB2YXIgbW9udGggPSBjdXJyZW50RGF0ZS5nZXRNb250aCgpO1xuICAgICAgdmFyIGRheSA9IGN1cnJlbnREYXRlLmdldERhdGUoKTtcbiAgICAgIHZhciBsZW5ndGg7XG4gICAgICB2YXIgaTtcbiAgICAgIHZhciBuOyAvLyBEYXlzIG9mIHByZXYgbW9udGhcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAgIHZhciBwcmV2SXRlbXMgPSBbXTtcbiAgICAgIHZhciBwcmV2Vmlld1llYXIgPSB2aWV3WWVhcjtcbiAgICAgIHZhciBwcmV2Vmlld01vbnRoID0gdmlld01vbnRoO1xuICAgICAgdmFyIHByZXZEaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodmlld01vbnRoID09PSAwKSB7XG4gICAgICAgIHByZXZWaWV3WWVhciAtPSAxO1xuICAgICAgICBwcmV2Vmlld01vbnRoID0gMTE7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmV2Vmlld01vbnRoIC09IDE7XG4gICAgICB9IC8vIFRoZSBsZW5ndGggb2YgdGhlIGRheXMgb2YgcHJldiBtb250aFxuXG5cbiAgICAgIGxlbmd0aCA9IGdldERheXNJbk1vbnRoKHByZXZWaWV3WWVhciwgcHJldlZpZXdNb250aCk7IC8vIFRoZSBmaXJzdCBkYXkgb2YgY3VycmVudCBtb250aFxuXG4gICAgICB2Y
21167XIgZmlyc3REYXkgPSBuZXcgRGF0ZSh2aWV3WWVhciwgdmlld01vbnRoLCAxKTsgLy8gVGhlIHZpc2libGUgbGVuZ3RoIG9mIHRoZSBkYXlzIG9mIHByZXYgbW9udGhcbiAgICAgIC8vIFswLDEsMiwzLDQsNSw2XSAtIFswLDEsMiwzLDQsNSw2XSA9PiBbLTYsLTUsLTQsLTMsLTIsLTEsMCwxLDIsMyw0LDUsNl1cblxuICAgICAgbiA9IGZpcnN0RGF5LmdldERheSgpIC0gcGFyc2VJbnQod2Vla1N0YXJ0LCAxMCkgJSA3OyAvLyBbLTYsLTUsLTQsLTMsLTIsLTEsMCwxLDIsMyw0LDUsNl0gPT4gWzEsMiwzLDQsNSw2LDddXG5cbiAgICAgIGlmIChuIDw9IDApIHtcbiAgICAgICAgbiArPSA3O1xuICAgICAgfVxuXG4gICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgIHByZXZEaXNhYmxlZCA9IGZpcnN0RGF5LmdldFRpbWUoKSA8PSBzdGFydERhdGUuZ2V0VGltZSgpO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGkgPSBsZW5ndGggLSAobiAtIDEpOyBpIDw9IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHZhciBwcmV2Vmlld0RhdGUgPSBuZXcgRGF0ZShwcmV2Vmlld1llYXIsIHByZXZWaWV3TW9udGgsIGkpO1xuICAgICAgICB2YXIgZGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBwcmV2Vmlld0RhdGUuZ2V0VGltZSgpIDwgc3RhcnREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZGlzYWJsZWQgJiYgZmlsdGVyKSB7XG4gICAgICAgICAgZGlzYWJsZWQgPSBmaWx0ZXIuY2FsbCgkZWxlbWVudCwgcHJldlZpZXdEYXRlLCAnZGF5JykgPT09IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJldkl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBkaXNhYmxlZDogZGlzYWJsZWQsXG4gICAgICAgICAgaGlnaGxpZ2h0ZWQ6IHByZXZWaWV3WWVhciA9PT0gdGhpc1llYXIgJiYgcHJldlZpZXdNb250aCA9PT0gdGhpc01vbnRoICYmIHByZXZWaWV3RGF0ZS5nZXREYXRlKCkgPT09IHRoaXNEYXksXG4gICAgICAgICAgbXV0ZWQ6IHRydWUsXG4gICAgICAgICAgcGlja2VkOiBwcmV2Vmlld1llYXIgPT09IHllYXIgJiYgcHJldlZpZXdNb250aCA9PT0gbW9udGggJiYgaSA9PT0gZGF5LFxuICAgICAgICAgIHRleHQ6IGksXG4gICAgICAgICAgdmlldzogJ2RheSBwcmV2J1xuICAgICAgICB9KSk7XG4gICAgICB9IC8vIERheXMgb2YgbmV4dCBtb250aFxuICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXG4gICAgICB2Y
21167XIgbmV4dEl0ZW1zID0gW107XG4gICAgICB2YXIgbmV4dFZpZXdZZWFyID0gdmlld1llYXI7XG4gICAgICB2YXIgbmV4dFZpZXdNb250aCA9IHZpZXdNb250aDtcbiAgICAgIHZhciBuZXh0RGlzYWJsZWQgPSBmYWxzZTtcblxuICAgICAgaWYgKHZpZXdNb250aCA9PT0gMTEpIHtcbiAgICAgICAgbmV4dFZpZXdZZWFyICs9IDE7XG4gICAgICAgIG5leHRWaWV3TW9udGggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV4dFZpZXdNb250aCArPSAxO1xuICAgICAgfSAvLyBUaGUgbGVuZ3RoIG9mIHRoZSBkYXlzIG9mIGN1cnJlbnQgbW9udGhcblxuXG4gICAgICBsZW5ndGggPSBnZXREYXlzSW5Nb250aCh2aWV3WWVhciwgdmlld01vbnRoKTsgLy8gVGhlIHZpc2libGUgbGVuZ3RoIG9mIG5leHQgbW9udGggKDQyIG1lYW5zIDYgcm93cyBhbmQgNyBjb2x1bW5zKVxuXG4gICAgICBuID0gNDIgLSAocHJldkl0ZW1zLmxlbmd0aCArIGxlbmd0aCk7IC8vIFRoZSBsYXN0IGRheSBvZiBjdXJyZW50IG1vbnRoXG5cbiAgICAgIHZhciBsYXN0RGF0ZSA9IG5ldyBEYXRlKHZpZXdZZWFyLCB2aWV3TW9udGgsIGxlbmd0aCk7XG5cbiAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgIG5leHREaXNhYmxlZCA9IGxhc3REYXRlLmdldFRpbWUoKSA+PSBlbmREYXRlLmdldFRpbWUoKTtcbiAgICAgIH1cblxuICAgICAgZm9yIChpID0gMTsgaSA8PSBuOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShuZXh0Vmlld1llYXIsIG5leHRWaWV3TW9udGgsIGkpO1xuICAgICAgICB2Y
21167XIgcGlja2VkID0gbmV4dFZpZXdZZWFyID09PSB5ZWFyICYmIG5leHRWaWV3TW9udGggPT09IG1vbnRoICYmIGkgPT09IGRheTtcbiAgICAgICAgdmFyIF9kaXNhYmxlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgX2Rpc2FibGVkID0gZGF0ZS5nZXRUaW1lKCkgPiBlbmREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2Rpc2FibGVkICYmIGZpbHRlcikge1xuICAgICAgICAgIF9kaXNhYmxlZCA9IGZpbHRlci5jYWxsKCRlbGVtZW50LCBkYXRlLCAnZGF5JykgPT09IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgbmV4dEl0ZW1zLnB1c2godGhpcy5jcmVhdGVJdGVtKHtcbiAgICAgICAgICBkaXNhYmxlZDogX2Rpc2FibGVkLFxuICAgICAgICAgIHBpY2tlZDogcGlja2VkLFxuICAgICAgICAgIGhpZ2hsaWdodGVkOiBuZXh0Vmlld1llYXIgPT09IHRoaXNZZWFyICYmIG5leHRWaWV3TW9udGggPT09IHRoaXNNb250aCAmJiBkYXRlLmdldERhdGUoKSA9PT0gdGhpc0RheSxcbiAgICAgICAgICBtdXRlZDogdHJ1ZSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIHZpZXc6ICdkYXkgbmV4dCdcbiAgICAgICAgfSkpO1xuICAgICAgfSAvLyBEYXlzIG9mIGN1cnJlbnQgbW9udGhcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgdmFyIGl0ZW1zID0gW107XG5cbiAgICAgIGZvciAoaSA9IDE7IGkgPD0gbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgdmFyIF9kYXRlID0gbmV3IERhdGUodmlld1llYXIsIHZpZXdNb250aCwgaSk7XG5cbiAgICAgICAgdmFyIF9kaXNhYmxlZDIgPSBmYWxzZTtcblxuICAgICAgICBpZiAoc3RhcnREYXRlKSB7XG4gICAgICAgICAgX2Rpc2FibGVkMiA9IF9kYXRlLmdldFRpbWUoKSA8IHN0YXJ0RGF0ZS5nZXRUaW1lKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV9kaXNhYmxlZDIgJiYgZW5kRGF0ZSkge1xuICAgICAgICAgIF9kaXNhYmxlZDIgPSBfZGF0ZS5nZXRUaW1lKCkgPiBlbmREYXRlLmdldFRpbWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghX2Rpc2FibGVkMiAmJiBmaWx0ZXIpIHtcbiAgICAgICAgICBfZGlzYWJsZWQyID0gZmlsdGVyLmNhbGwoJGVsZW1lbnQsIF9kYXRlLCAnZGF5JykgPT09IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIF9waWNrZWQgPSB2aWV3WWVhciA9PT0geWVhciAmJiB2aWV3TW9udGggPT09IG1vbnRoICYmIGkgPT09IGRheTtcblxuICAgICAgICB2Y
21167XIgdmlldyA9IF9waWNrZWQgPyAnZGF5IHBpY2tlZCcgOiAnZGF5JztcbiAgICAgICAgaXRlbXMucHVzaCh0aGlzLmNyZWF0ZUl0ZW0oe1xuICAgICAgICAgIGRpc2FibGVkOiBfZGlzYWJsZWQyLFxuICAgICAgICAgIHBpY2tlZDogX3BpY2tlZCxcbiAgICAgICAgICBoaWdobGlnaHRlZDogdmlld1llYXIgPT09IHRoaXNZZWFyICYmIHZpZXdNb250aCA9PT0gdGhpc01vbnRoICYmIF9kYXRlLmdldERhdGUoKSA9PT0gdGhpc0RheSxcbiAgICAgICAgICB0ZXh0OiBpLFxuICAgICAgICAgIHZpZXc6IF9kaXNhYmxlZDIgPyAnZGF5IGRpc2FibGVkJyA6IHZpZXdcbiAgICAgICAgfSkpO1xuICAgICAgfSAvLyBSZW5kZXIgZGF5cyBwaWNrZXJcbiAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblxuICAgICAgdGhpcy4kbW9udGhQcmV2LnRvZ2dsZUNsYXNzKGRpc2FibGVkQ2xhc3MsIHByZXZEaXNhYmxlZCk7XG4gICAgICB0aGlzLiRtb250aE5leHQudG9nZ2xlQ2xhc3MoZGlzYWJsZWRDbGFzcywgbmV4dERpc2FibGVkKTtcbiAgICAgIHRoaXMuJG1vbnRoQ3VycmVudC50b2dnbGVDbGFzcyhkaXNhYmxlZENsYXNzLCBwcmV2RGlzYWJsZWQgJiYgbmV4dERpc2FibGVkKS5odG1sKG9wdGlvbnMueWVhckZpcnN0ID8gXCJcIi5jb25jYXQodmlld1llYXIgKyB5ZWFyU3VmZml4LCBcIiBcIikuY29uY2F0KG1vbnRoc1t2aWV3TW9udGhdKSA6IFwiXCIuY29uY2F0KG1vbnRoc1t2aWV3TW9udGhdLCBcIiBcIikuY29uY2F0KHZpZXdZZWFyKS5jb25jYXQoeWVhclN1ZmZpeCkpO1xuICAgICAgdGhpcy4kZGF5cy5odG1sKHByZXZJdGVtcy5qb2luKCcnKSArIGl0ZW1zLmpvaW4oJycpICsgbmV4dEl0ZW1zLmpvaW4oJycpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIENMQVNTX1RPUF9MRUZUID0gXCJcIi5jb25jYXQoTkFNRVNQQUNFLCBcIi10b3AtbGVmdFwiKTtcbiAgdmFyIENMQVNTX1RPUF9SSUdIVCA9IFwiXCIuY29uY2F0KE5BTUVTUEFDRSwgXCItdG9wLXJpZ2h0XCIpO1xuICB2YXIgQ0xBU1NfQk9UVE9NX0xFRlQgPSBcIlwiLmNvbmNhdChOQU1FU1BBQ0UsIFwiLWJvdHRvbS1sZWZ0XCIpO1xuICB2YXIgQ0xBU1NfQk9UVE9NX1JJR0hUID0gXCJcIi5jb25jYXQoTkFNRVNQQUNFLCBcIi1ib3R0b20tcmlnaHRcIik7XG4gIHZhciBDTEFTU19QTEFDRU1FTlRTID0gW0NMQVNTX1RPUF9MRUZULCBDTEFTU19UT1BfUklHSFQsIENMQVNTX0JPVFRPTV9MRUZULCBDTEFTU19CT1RUT01fUklHSFRdLmpvaW4oJyAnKTtcblxuICB2YXIgRGF0ZXBpY2tlciA9XG4gIC8qI19fUFVSRV9fKi9cbiAgZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIERhdGVwaWNrZXIoZWxlbWVudCkge1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IHt9O1xuXG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgRGF0ZXBpY2tlcik7XG5cbiAgICAgIHRoaXMuJGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBERUZBVUxUUywgTEFOR1VBR0VTW29wdGlvbnMubGFuZ3VhZ2VdLCAkLmlzUGxhaW5PYmplY3Qob3B0aW9ucykgJiYgb3B0aW9ucyk7XG4gICAgICB0aGlzLiRzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCwgdHJ1ZSk7XG4gICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNob3duID0gZmFsc2U7XG4gICAgICB0aGlzLmlzSW5wdXQgPSBmYWxzZTtcbiAgICAgIHRoaXMuaW5saW5lID0gZmFsc2U7XG4gICAgICB0aGlzLmluaXRpYWxWYWx1ZSA9ICcnO1xuICAgICAgdGhpcy5pbml0aWFsRGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLnN0YXJ0RGF0ZSA9IG51bGw7XG4gICAgICB0aGlzLmVuZERhdGUgPSBudWxsO1xuICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgX2NyZWF0ZUNsYXNzKERhdGVwaWNrZXIsIFt7XG4gICAgICBrZXk6IFwiaW5pdFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9IHRoaXMuJGVsZW1lbnQsXG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2Y
21167XIgc3RhcnREYXRlID0gb3B0aW9ucy5zdGFydERhdGUsXG4gICAgICAgICAgICBlbmREYXRlID0gb3B0aW9ucy5lbmREYXRlLFxuICAgICAgICAgICAgZGF0ZSA9IG9wdGlvbnMuZGF0ZTtcbiAgICAgICAgdGhpcy4kdHJpZ2dlciA9ICQob3B0aW9ucy50cmlnZ2VyKTtcbiAgICAgICAgdGhpcy5pc0lucHV0ID0gJHRoaXMuaXMoJ2lucHV0JykgfHwgJHRoaXMuaXMoJ3RleHRhcmVhJyk7XG4gICAgICAgIHRoaXMuaW5saW5lID0gb3B0aW9ucy5pbmxpbmUgJiYgKG9wdGlvbnMuY29udGFpbmVyIHx8ICF0aGlzLmlzSW5wdXQpO1xuICAgICAgICB0aGlzLmZvcm1hdCA9IHBhcnNlRm9ybWF0KG9wdGlvbnMuZm9ybWF0KTtcbiAgICAgICAgdmFyIGluaXRpYWxWYWx1ZSA9IHRoaXMuZ2V0VmFsdWUoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIHRoaXMub2xkVmFsdWUgPSBpbml0aWFsVmFsdWU7XG4gICAgICAgIGRhdGUgPSB0aGlzLnBhcnNlRGF0ZShkYXRlIHx8IGluaXRpYWxWYWx1ZSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0RGF0ZSkge1xuICAgICAgICAgIHN0YXJ0RGF0ZSA9IHRoaXMucGFyc2VEYXRlKHN0YXJ0RGF0ZSk7XG5cbiAgICAgICAgICBpZiAoZGF0ZS5nZXRUaW1lKCkgPCBzdGFydERhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoc3RhcnREYXRlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IHN0YXJ0RGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChlbmREYXRlKSB7XG4gICAgICAgICAgZW5kRGF0ZSA9IHRoaXMucGFyc2VEYXRlKGVuZERhdGUpO1xuXG4gICAgICAgICAgaWYgKHN0YXJ0RGF0ZSAmJiBlbmREYXRlLmdldFRpbWUoKSA8IHN0YXJ0RGF0ZS5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgIGVuZERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkYXRlLmdldFRpbWUoKSA+IGVuZERhdGUuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICBkYXRlID0gbmV3IERhdGUoZW5kRGF0ZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5lbmREYXRlID0gZW5kRGF0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gICAgICAgIHRoaXMudmlld0RhdGUgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICAgICAgdGhpcy5pbml0aWFsRGF0ZSA9IG5ldyBEYXRlKHRoaXMuZGF0ZSk7XG4gICAgICAgIHRoaXMuYmluZCgpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmF1dG9TaG93IHx8IHRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgdGhpcy5zaG93KCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3B0aW9ucy5hdXRvUGljaykge1xuICAgICAgICAgIHRoaXMucGljaygpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImJ1aWxkXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gYnVpbGQoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWx0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5idWlsdCA9IHRydWU7XG4gICAgICAgIHZhciAkdGhpcyA9IHRoaXMuJGVsZW1lbnQsXG4gICAgICAgICAgICBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2Y
21167XIgJHBpY2tlciA9ICQob3B0aW9ucy50ZW1wbGF0ZSk7XG4gICAgICAgIHRoaXMuJHBpY2tlciA9ICRwaWNrZXI7XG4gICAgICAgIHRoaXMuJHdlZWsgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignd2VlaycpKTsgLy8gWWVhcnMgdmlld1xuXG4gICAgICAgIHRoaXMuJHllYXJzUGlja2VyID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ3llYXJzIHBpY2tlcicpKTtcbiAgICAgICAgdGhpcy4keWVhcnNQcmV2ID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ3llYXJzIHByZXYnKSk7XG4gICAgICAgIHRoaXMuJHllYXJzTmV4dCA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCd5ZWFycyBuZXh0JykpO1xuICAgICAgICB0aGlzLiR5ZWFyc0N1cnJlbnQgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZigneWVhcnMgY3VycmVudCcpKTtcbiAgICAgICAgdGhpcy4keWVhcnMgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZigneWVhcnMnKSk7IC8vIE1vbnRocyB2aWV3XG5cbiAgICAgICAgdGhpcy4kbW9udGhzUGlja2VyID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ21vbnRocyBwaWNrZXInKSk7XG4gICAgICAgIHRoaXMuJHllYXJQcmV2ID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ3llYXIgcHJldicpKTtcbiAgICAgICAgdGhpcy4keWVhck5leHQgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZigneWVhciBuZXh0JykpO1xuICAgICAgICB0aGlzLiR5ZWFyQ3VycmVudCA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCd5ZWFyIGN1cnJlbnQnKSk7XG4gICAgICAgIHRoaXMuJG1vbnRocyA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCdtb250aHMnKSk7IC8vIERheXMgdmlld1xuXG4gICAgICAgIHRoaXMuJGRheXNQaWNrZXIgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignZGF5cyBwaWNrZXInKSk7XG4gICAgICAgIHRoaXMuJG1vbnRoUHJldiA9ICRwaWNrZXIuZmluZChzZWxlY3Rvck9mKCdtb250aCBwcmV2JykpO1xuICAgICAgICB0aGlzLiRtb250aE5leHQgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignbW9udGggbmV4dCcpKTtcbiAgICAgICAgdGhpcy4kbW9udGhDdXJyZW50ID0gJHBpY2tlci5maW5kKHNlbGVjdG9yT2YoJ21vbnRoIGN1cnJlbnQnKSk7XG4gICAgICAgIHRoaXMuJGRheXMgPSAkcGlja2VyLmZpbmQoc2VsZWN0b3JPZignZGF5cycpKTtcblxuICAgICAgICBpZiAodGhpcy5pbmxpbmUpIHtcbiAgICAgICAgICAkKG9wdGlvbnMuY29udGFpbmVyIHx8ICR0aGlzKS5hcHBlbmQoJHBpY2tlci5hZGRDbGFzcyhcIlwiLmNvbmNhdChOQU1FU1BBQ0UsIFwiLWlubGluZVwiKSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICQoZG9jdW1lbnQuYm9keSkuYXBwZW5kKCRwaWNrZXIuYWRkQ2xhc3MoXCJcIi5jb25jYXQoTkFNRVNQQUNFLCBcIi1kcm9wZG93blwiKSkpO1xuICAgICAgICAgICRwaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSkuY3NzKHtcbiAgICAgICAgICAgIHpJbmRleDogcGFyc2VJbnQob3B0aW9ucy56SW5kZXgsIDEwKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5yZW5kZXJXZWVrKCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInVuYnVpbGRcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB1bmJ1aWxkKCkge1xuICAgICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJHBpY2tlci5yZW1vdmUoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwiYmluZFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGJpbmQoKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zLFxuICAgICAgICAgICAgJHRoaXMgPSB0aGlzLiRlbGVtZW50O1xuXG4gICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5zaG93KSkge1xuICAgICAgICAgICR0aGlzLm9uKEVWRU5UX1NIT1csIG9wdGlvbnMuc2hvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdGlvbnMuaGlkZSkpIHtcbiAgICAgICAgICAkdGhpcy5vbihFVkVOVF9ISURFLCBvcHRpb25zLmhpZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRpb25zLnBpY2spKSB7XG4gICAgICAgICAgJHRoaXMub24oRVZFTlRfUElDSywgb3B0aW9ucy5waWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzSW5wdXQpIHtcbiAgICAgICAgICAkdGhpcy5vbihFVkVOVF9LRVlVUCwgJC5wcm94eSh0aGlzLmtleXVwLCB0aGlzKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMudHJpZ2dlcikge1xuICAgICAgICAgICAgdGhpcy4kdHJpZ2dlci5vbihFVkVOVF9DTElDSywgJC5wcm94eSh0aGlzLnRvZ2dsZSwgdGhpcykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0lucHV0KSB7XG4gICAgICAgICAgICAkdGhpcy5vbihFVkVOVF9GT0NVUywgJC5wcm94eSh0aGlzLnNob3csIHRoaXMpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHRoaXMub24oRVZFTlRfQ0xJQ0ssICQucHJveHkodGhpcy5zaG93LCB0aGlzKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInVuYmluZFwiLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIHVuYmluZCgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cbiAgICAgICAgaWYgKCQuaXNGdW5jdGlvbihvcHRpb25zLnNob3cpKSB7XG4gICAgICAgICAgJHRoaXMub2ZmKEVWRU5UX1NIT1csIG9wdGlvbnMuc2hvdyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKG9wdGlvbnMuaGlkZSkpIHtcbiAgICAgICAgICAkdGhpcy5vZmYoRVZFTlRfSElERSwgb3B0aW9ucy5oaWRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgkLmlzRnVuY3Rpb24ob3B0aW9ucy5waWNrKSkge1xuICAgICAgICAgICR0aGlzLm9mZihFVkVOVF9QSUNLLCBvcHRpb25zLnBpY2spO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNJbnB1dCkge1xuICAgICAgICAgICR0aGlzLm9mZihFVkVOVF9LRVlVUCwgdGhpcy5rZXl1cCk7XG4gICAgICAgI
21167H1cblxuICAgICAgICBpZiAoIXRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgaWYgKG9wdGlvbnMudHJpZ2dlcikge1xuICAgICAgICAgICAgdGhpcy4kdHJpZ2dlci5vZmYoRVZFTlRfQ0xJQ0ssIHRoaXMudG9nZ2xlKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbnB1dCkge1xuICAgICAgICAgICAgJHRoaXMub2ZmKEVWRU5UX0ZPQ1VTLCB0aGlzLnNob3cpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkdGhpcy5vZmYoRVZFTlRfQ0xJQ0ssIHRoaXMuc2hvdyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcInNob3dWaWV3XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gc2hvd1ZpZXcodmlldykge1xuICAgICAgICB2YXIgJHllYXJzUGlja2VyID0gdGhpcy4keWVhcnNQaWNrZXIsXG4gICAgICAgICAgICAkbW9udGhzUGlja2VyID0gdGhpcy4kbW9udGhzUGlja2VyLFxuICAgICAgICAgICAgJGRheXNQaWNrZXIgPSB0aGlzLiRkYXlzUGlja2VyLFxuICAgICAgICAgICAgZm9ybWF0ID0gdGhpcy5mb3JtYXQ7XG5cbiAgICAgICAgaWYgKGZvcm1hdC5oYXNZZWFyIHx8IGZvcm1hdC5oYXNNb250aCB8fCBmb3JtYXQuaGFzRGF5KSB7XG4gICAgICAgICAgc3dpdGNoIChOdW1iZXIodmlldykpIHtcbiAgICAgICAgICAgIGNhc2UgVklFV1MuWUVBUlM6XG4gICAgICAgICAgICAgICRtb250aHNQaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSk7XG4gICAgICAgICAgICAgICRkYXlzUGlja2VyLmFkZENsYXNzKENMQVNTX0hJREUpO1xuXG4gICAgICAgICAgICAgIGlmIChmb3JtYXQuaGFzWWVhcikge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyWWVhcnMoKTtcbiAgICAgICAgICAgICAgICAkeWVhcnNQaWNrZXIucmVtb3ZlQ2xhc3MoQ0xBU1NfSElERSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ZpZXcoVklFV1MuREFZUyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBWSUVXUy5NT05USFM6XG4gICAgICAgICAgICAgICR5ZWFyc1BpY2tlci5hZGRDbGFzcyhDTEFTU19ISURFKTtcbiAgICAgICAgICAgICAgJGRheXNQaWNrZXIuYWRkQ2xhc3MoQ0xBU1NfSElERSk7XG5cbiAgICAgICAgICAgICAgaWYgKGZvcm1hdC5oYXNNb250aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTW9udGhzKCk7XG4gICAgICAgICAgICAgICAgJG1vbnRoc1BpY2tlci5yZW1vdmVDbGFzcyhDTEFTU19ISURFKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93VmlldyhWSUVXUy5ZRUFSUyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIC8vIGNhc2UgVklFV1MuREFZUzpcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgJHllYXJzUGlja2VyLmFkZENsYXNzKENMQVNTX0hJREUpO1xuICAgICAgICAgICAgICAkbW9udGhzUGlja2VyLmFkZENsYXNzKENMQVNTX0hJREUpO1xuXG4gICAgICAgICAgICAgIGlmIChmb3JtYXQuaGFzRGF5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJEYXlzKCk7XG4gICAgICAgICAgICAgICAgJGRheXNQaWNrZXIucmVtb3ZlQ2xhc3MoQ0xBU1NfSElERSk7XG4gICAgICAgICAgICAgICAgdGhpcy5wbGFjZSgpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd1ZpZXcoVklFV1MuTU9OVEhTKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImhpZGVWaWV3XCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gaGlkZVZpZXcoKSB7XG4gICAgICAgIGlmICghdGhpcy5pbmxpbmUgJiYgdGhpcy5vcHRpb25zLmF1dG9IaWRlKSB7XG4gICAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwicGxhY2VcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBwbGFjZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW5saW5lKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyICR0aGlzID0gdGhpcy4kZWxlbWVudCxcbiAgICAgICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgICAgICAkcGlja2VyID0gdGhpcy4kcGlja2VyO1xuICAgICAgICB2Y
21167XIgY29udGFpbmVyV2lkdGggPSAkKGRvY3VtZW50KS5vdXRlcldpZHRoKCk7XG4gICAgICAgIHZhciBjb250YWluZXJIZWlnaHQgPSAkKGRvY3VtZW50KS5vdXRlckhlaWdodCgpO1xuICAgICAgICB2YXIgZWxlbWVudFdpZHRoID0gJHRoaXMub3V0ZXJXaWR0aCgpO1xuICAgICAgICB2YXIgZWxlbWVudEhlaWdodCA9ICR0aGlzLm91dGVySGVpZ2h0KCk7XG4gICAgICAgIHZhciB3aWR0aCA9ICRwaWNrZXIud2lkdGgoKTtcbiAgICAgICAgdmFyIGhlaWdodCA9ICRwaWNrZXIuaGVpZ2h0KCk7XG5cbiAgICAgICAgdmFyIF8kdGhpcyRvZmZzZXQgPSAkdGhpcy5vZmZzZXQoKSxcbiAgICAgICAgICAgIGxlZnQgPSBfJHRoaXMkb2Zmc2V0LmxlZnQsXG4gICAgICAgICAgICB0b3AgPSBfJHRoaXMkb2Zmc2V0LnRvcDtcblxuICAgICAgICB2YXIgb2Zmc2V0ID0gcGFyc2VGbG9hdChvcHRpb25zLm9mZnNldCk7XG4gICAgICAgIHZhciBwbGFjZW1lbnQgPSBDTEFTU19UT1BfTEVGVDtcblxuICAgICAgICBpZiAoaXNOYU4ob2Zmc2V0KSkge1xuICAgICAgICAgIG9mZnNldCA9IDEwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvcCA+IGhlaWdodCAmJiB0b3AgKyBlbGVtZW50SGVpZ2h0ICsgaGVpZ2h0ID4gY29udGFpbmVySGVpZ2h0KSB7XG4gICAgICAgICAgdG9wIC09IGhlaWdodCArIG9mZnNldDtcbiAgICAgICAgICBwbGFjZW1lbnQgPSBDTEFTU19CT1RUT01fTEVGVDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0b3AgKz0gZWxlbWVudEhlaWdodCArIG9mZnNldDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsZWZ0ICsgd2lkdGggPiBjb250YWluZXJXaWR0aCkge1xuICAgICAgICAgIGxlZnQgKz0gZWxlbWVudFdpZHRoIC0gd2lkdGg7XG4gICAgICAgICAgcGxhY2VtZW50ID0gcGxhY2VtZW50LnJlcGxhY2UoJ2xlZnQnLCAncmlnaHQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRwaWNrZXIucmVtb3ZlQ2xhc3MoQ0xBU1NfUExBQ0VNRU5UUykuYWRkQ2xhc3MocGxhY2VtZW50KS5jc3Moe1xuICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgIGxlZnQ6IGxlZnRcbiAgICAgICAgfSk7XG4gICAgICB9IC8vIEEgc2hvcnRjdXQgZm9yIHRyaWdnZXJpbmcgY3VzdG9tIGV2ZW50c1xuXG4gICAgfSwge1xuICAgICAga2V5OiBcInRyaWdnZXJcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiB0cmlnZ2VyKHR5cGUsIGRhdGEpIHtcbiAgICAgICAgdmFyIGUgPSAkLkV2ZW50KHR5cGUsIGRhdGEpO1xuICAgICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoZSk7XG4gICAgICAgIHJldHVybiBlO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogXCJjcmVhdGVJdGVtXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gY3JlYXRlSXRlbShkYXRhKSB7XG4gICAgICAgIHZhciBvcHRpb25zID0gdGhpcy5vcHRpb25zO1xuICAgICAgICB2Y
21167XIgaXRlbVRhZyA9IG9wdGlvbnMuaXRlbVRhZztcbiAgICAgICAgdmFyIGl0ZW0gPSB7XG4gICAgICAgICAgdGV4dDogJycsXG4gICAgICAgICAgdmlldzogJycsXG4gICAgICAgICAgbXV0ZWQ6IGZhbHNlLFxuICAgICAgICAgIHBpY2tlZDogZmFsc2UsXG4gICAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgICAgIGhpZ2hsaWdodGVkOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgICB2YXIgY2xhc3NlcyA9IFtdO1xuICAgICAgICAkLmV4dGVuZChpdGVtLCBkYXRhKTtcblxuICAgICAgICBpZiAoaXRlbS5tdXRlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChvcHRpb25zLm11dGVkQ2xhc3MpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZW0uaGlnaGxpZ2h0ZWQpIHtcbiAgICAgICAgICBjbGFzc2VzLnB1c2gob3B0aW9ucy5oaWdobGlnaHRlZENsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLnBpY2tlZCkge1xuICAgICAgICAgIGNsYXNzZXMucHVzaChvcHRpb25zLnBpY2tlZENsYXNzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpdGVtLmRpc2FibGVkKSB7XG4gICAgICAgICAgY2xhc3Nlcy5wdXNoKG9wdGlvbnMuZGlzYWJsZWRDbGFzcyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gXCI8XCIuY29uY2F0KGl0ZW1UYWcsIFwiIGNsYXNzPVxcXCJcIikuY29uY2F0KGNsYXNzZXMuam9pbignICcpLCBcIlxcXCIgZGF0YS12aWV3PVxcXCJcIikuY29uY2F0KGl0ZW0udmlldywgXCJcXFwiPlwiKS5jb25jYXQoaXRlbS50ZXh0LCBcIjwvXCIpLmNvbmNhdChpdGVtVGFnLCBcIj5cIik7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiBcImdldFZhbHVlXCIsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VmFsdWUoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9IHRoaXMuJGVsZW1lbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLmlzSW5wdXQgP
21167yAkdGhpcy52YWwoKSA6ICR0aGlzLnRleHQoKTtcbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6IFwic2V0VmFsdWVcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRWYWx1ZSgpIHtcbiAgICAgICAgdmFyIHZhbHVlID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnJztcbiAgICAgICAgdmFyICR0aGlzID0gdGhpcy4kZWxlbWVudDtcblxuICAgICAgICBpZiAodGhpcy5pc0lucHV0KSB7XG4gICAgICAgICAgJHRoaXMudmFsKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5pbmxpbmUgfHwgdGhpcy5vcHRpb25zLmNvbnRhaW5lcikge1xuICAgICAgICAgICR0aGlzLnRleHQodmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfV0sIFt7XG4gICAgICBrZXk6IFwic2V0RGVmYXVsdHNcIixcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXREZWZhdWx0cygpIHtcbiAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6IHt9O1xuICAgICAgICAkLmV4dGVuZChERUZBVUxUUywgTEFOR1VBR0VTW29wdGlvbnMubGFuZ3VhZ2VdLCAkLmlzUGxhaW5PYmplY3Qob3B0aW9ucykgJiYgb3B0aW9ucyk7XG4gICAgICB9XG4gICAgfV0pO1xuXG4gICAgcmV0dXJuIERhdGVwaWNrZXI7XG4gIH0oKTtcblxuICBpZiAoJC5leHRlbmQpIHtcbiAgICAkLmV4dGVuZChEYXRlcGlja2VyLnByb3RvdHlwZSwgcmVuZGVyLCBoYW5kbGVycywgbWV0aG9kcyk7XG4gIH1cblxuICBpZiAoJC5mbikge1xuICAgIHZhciBBbm90aGVyRGF0ZXBpY2tlciA9ICQuZm4uZGF0ZXBpY2tlcjtcblxuICAgICQuZm4uZGF0ZXBpY2tlciA9IGZ1bmN0aW9uIGpRdWVyeURhdGVwaWNrZXIob3B0aW9uKSB7XG4gICAgICBmb3IgKHZhciBfbGVuID0gYXJndW1lbnRzLmxlbmd0aCwgYXJncyA9IG5ldyBBcnJheShfbGVuID4gMSA/IF9sZW4gLSAxIDogMCksIF9rZXkgPSAxOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICAgICAgfVxuXG4gICAgICB2Y
21167XIgcmVzdWx0O1xuICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uIChpLCBlbGVtZW50KSB7XG4gICAgICAgIHZhciAkZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHZhciBpc0Rlc3Ryb3kgPSBvcHRpb24gPT09ICdkZXN0cm95JztcbiAgICAgICAgdmFyIGRhdGVwaWNrZXIgPSAkZWxlbWVudC5kYXRhKE5BTUVTUEFDRSk7XG5cbiAgICAgICAgaWYgKCFkYXRlcGlja2VyKSB7XG4gICAgICAgICAgaWYgKGlzRGVzdHJveSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHZhciBvcHRpb25zID0gJC5leHRlbmQoe30sICRlbGVtZW50LmRhdGEoKSwgJC5pc1BsYWluT2JqZWN0KG9wdGlvbikgJiYgb3B0aW9uKTtcbiAgICAgICAgICBkYXRlcGlja2VyID0gbmV3IERhdGVwaWNrZXIoZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgICAgJGVsZW1lbnQuZGF0YShOQU1FU1BBQ0UsIGRhdGVwaWNrZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzU3RyaW5nKG9wdGlvbikpIHtcbiAgICAgICAgICB2YXIgZm4gPSBkYXRlcGlja2VyW29wdGlvbl07XG5cbiAgICAgICAgICBpZiAoJC5pc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gZm4uYXBwbHkoZGF0ZXBpY2tlciwgYXJncyk7XG5cbiAgICAgICAgICAgIGlmIChpc0Rlc3Ryb3kpIHtcbiAgICAgICAgICAgICAgJGVsZW1lbnQucmVtb3ZlRGF0YShOQU1FU1BBQ0UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gIWlzVW5kZWZpbmVkKHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzO1xuICAgIH07XG5cbiAgICAkLmZuLmRhdGVwaWNrZXIuQ29uc3RydWN0b3IgPSBEYXRlcGlja2VyO1xuICAgICQuZm4uZGF0ZXBpY2tlci5sYW5ndWFnZXMgPSBMQU5HVUFHRVM7XG4gICAgJC5mbi5kYXRlcGlja2VyLnNldERlZmF1bHRzID0gRGF0ZXBpY2tlci5zZXREZWZhdWx0cztcblxuICAgICQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0ID0gZnVuY3Rpb24gbm9Db25mbGljdCgpIHtcbiAgICAgICQuZm4uZGF0ZXBpY2tlciA9IEFub3RoZXJEYXRlcGlja2VyO1xuICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfTtcbiAgfVxuXG59KSk7XG4iLCIvKlxuICB0ZXh0ZmlsbFxuIEBuYW1lICAgICAganF1ZXJ5LnRleHRmaWxsLmpzXG4gQGF1dGhvciAgICBSdXNzIFBhaW50ZXIgKEdlZWt5TW9ua2V5KVxuIEBhdXRob3IgICAgWXUtSmllIExpblxuIEBhdXRob3IgICAgQWxleGFuZHJlIERhbnRhc1xuIEB2ZXJzaW9uICAgMC42LjJcbiBAZGF0ZSAgICAgIDIwMTgtMDItMjRcbiBAY29weXJpZ2h0IChjKSAyMDA5XG4gQGxpY2Vuc2UgICBNSVQgTGljZW5zZVxuIEBob21lcGFnZSAgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS10ZXh0ZmlsbC9qcXVlcnktdGV4dGZpbGxcbiBAZXhhbXBsZSAgIGh0dHA6Ly9qcXVlcnktdGV4dGZpbGwuZ2l0aHViLmlvL2pxdWVyeS10ZXh0ZmlsbC9pbmRleC5odG1sXG4qL1xuKGZ1bmN0aW9uKGspe2suZm4udGV4dGZpbGw9ZnVuY3Rpb24ocSl7ZnVuY3Rpb24gZSgpe2EuZGVidWcmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBjb25zb2xlJiZcInVuZGVmaW5lZFwiIT10eXBlb2YgY29uc29sZS5kZWJ1ZyYmY29uc29sZS5kZWJ1Zy5hcHBseShjb25zb2xlLGFyZ3VtZW50cyl9ZnVuY3Rpb24gbihiLGEsZixsLG0sZyl7ZnVuY3Rpb24gYyhhLGIpe3ZhciBjPVwiIC8gXCI7YT5iP2M9XCIgPiBcIjphPT1iJiYoYz1cIiA9IFwiKTtyZXR1cm4gY31lKFwiW1RleHRGaWxsXSBcIitiK1wiIHsgZm9udC1zaXplOiBcIithLmNzcyhcImZvbnQtc2l6ZVwiKStcIixIZWlnaHQ6IFwiK2EuaGVpZ2h0KCkrXCJweCBcIitjKGEuaGVpZ2h0KCksZikrZitcInB4LFdpZHRoOiBcIithLndpZHRoKCkrYyhhLndpZHRoKCksbCkrbCtcIixtaW5Gb250UGl4ZWxzOiBcIittK1wicHgsIG1heEZvbnRQaXhlbHM6IFwiK2crXCJweCB9XCIpfWZ1bmN0aW9uIHAoYSxjLGYsbCxlLGcsaCxkKXtmb3IobihhLGMsZSxnLGgsZCk7aDxNYXRoLmZsb29yKGQpLVxuMTspe3ZhciBiPU1hdGguZmxvb3IoKGgrZCkvMik7Yy5jc3MoXCJmb250LXNpemVcIixiKTt2YXIgaz1mLmNhbGwoYyk7aWYoazw9bCl7aWYoaD1iLGs9PWwpYnJlYWt9ZWxzZSBkPWI7bihhLGMsZSxnLGgsZCl9Yy5jc3MoXCJmb250LXNpemVcIixkKTtmLmNhbGwoYyk8PWwmJihoPWQsbihhK1wiKiBcIixjLGUsZyxoLGQpKTtyZXR1cm4gaH12YXIgYT1rLmV4dGVuZCh7ZGVidWc6ITEsbWF4Rm9udFBpeGVsczo0MCxtaW5Gb250UGl4ZWxzOjQsaW5uZXJUYWc6XCJzcGFuXCIsd2lkdGhPbmx5OiExLHN1Y2Nlc3M6bnVsbCxmYWlsOm51bGwsY29tcGxldGU6bnVsbCxleHBsaWNpdFdpZHRoOm51bGwsZXhwbGljaXRIZWlnaHQ6bnVsbCxjaGFuZ2VMaW5lSGVpZ2h0OiExLHRydW5jYXRlT25GYWlsOiExLGFsbG93T3ZlcmZsb3c6ITF9LHEpO2UoXCJbVGV4dEZpbGxdIFN0YXJ0IERlYnVnXCIpO3RoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBiPWsoYS5pbm5lclRhZytcIjpmaXJzdFwiLHRoaXMpO2UoXCJbVGV4dEZpbGxdIElubmVyIHRleHQ6IFwiK1xuYi50ZXh0KCkpO2UoXCJbVGV4dEZpbGxdIEFsbCBvcHRpb25zOiBcIixhKTtlKFwiW1RleHRGaWxsXSBNYXhpbXVtIHNpemVzOiB7IEhlaWdodDogXCIrYytcInB4LCBXaWR0aDogXCIrZitcInB4IH1cIik7aWYoYi5pcyhcIjp2aXNpYmxlXCIpKXt2YXIgYz1hLmV4cGxpY2l0SGVpZ2h0fHxrKHRoaXMpLmhlaWdodCgpLGY9YS5leHBsaWNpdFdpZHRofHxrKHRoaXMpLndpZHRoKCksbD1iLmNzcyhcImZvbnQtc2l6ZVwiKSxtPXBhcnNlRmxvYXQoYi5jc3MoXCJsaW5lLWhlaWdodFwiKSkvcGFyc2VGbG9hdChsKSxnPWEubWluRm9udFBpeGVscyxoPTA+PWEubWF4Rm9udFBpeGVscz9jOmEubWF4Rm9udFBpeGVscyxkPXZvaWQgMDthLndpZHRoT25seT9iLmNzcyhcIndoaXRlLXNwYWNlXCIsXCJub3dyYXBcIik6ZD1wKFwiSGVpZ2h0XCIsYixrLmZuLmhlaWdodCxjLGMsZixnLGgpO2c9cChcIldpZHRoXCIsYixrLmZuLndpZHRoLGYsYyxmLGcsaCk7YS53aWR0aE9ubHk/KGIuY3NzKHtcImZvbnQtc2l6ZVwiOmd9KSxhLmNoYW5nZUxpbmVIZWlnaHQmJlxuYi5wYXJlbnQoKS5jc3MoXCJsaW5lLWhlaWdodFwiLG0qZytcInB4XCIpKTooZD1NYXRoLm1pbihkLGcpLGIuY3NzKFwiZm9udC1zaXplXCIsZCksYS5jaGFuZ2VMaW5lSGVpZ2h0JiZiLnBhcmVudCgpLmNzcyhcImxpbmUtaGVpZ2h0XCIsbSpkK1wicHhcIikpO2UoXCJbVGV4dEZpbGxdIEZpbmlzaGVkIHsgT2xkIGZvbnQtc2l6ZTogXCIrbCtcIiwgTmV3IGZvbnQtc2l6ZTogXCIrYi5jc3MoXCJmb250LXNpemVcIikrXCIgfVwiKTtiLndpZHRoKCk+ZiYmIWEuYWxsb3dPdmVyZmxvd3x8Yi5oZWlnaHQoKT5jJiYhYS53aWR0aE9ubHkmJiFhLmFsbG93T3ZlcmZsb3c/KGIuY3NzKFwiZm9udC1zaXplXCIsbCksYS5mYWlsJiZhLmZhaWwodGhpcyksZShcIltUZXh0RmlsbF0gRmFpbHVy
21167ZSB7IEN1cnJlbnQgV2lkdGg6IFwiK2Iud2lkdGgoKStcIiwgTWF4aW11bSBXaWR0aDogXCIrZitcIiwgQ3VycmVudCBIZWlnaHQ6IFwiK2IuaGVpZ2h0KCkrXCIsIE1heGltdW0gSGVpZ2h0OiBcIitjK1wiIH1cIikpOmEuc3VjY2VzcyYmYS5zdWNjZXNzKHRoaXMpfWVsc2UgYS5mYWlsJiZcbmEuZmFpbCh0aGlzKSxlKFwiW1RleHRGaWxsXSBGYWlsdXJlIHsgQ3VycmVudCBXaWR0aDogXCIrYi53aWR0aCgpK1wiLCBNYXhpbXVtIFdpZHRoOiBcIitmK1wiLCBDdXJyZW50IEhlaWdodDogXCIrYi5oZWlnaHQoKStcIiwgTWF4aW11bSBIZWlnaHQ6IFwiK2MrXCIgfVwiKX0pO2EuY29tcGxldGUmJmEuY29tcGxldGUodGhpcyk7ZShcIltUZXh0RmlsbF0gRW5kIERlYnVnXCIpO3JldHVybiB0aGlzfX0pKGZ1bmN0aW9uKCl7cmV0dXJuXCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJm1vZHVsZS5leHBvcnRzP3JlcXVpcmUoXCJqcXVlcnlcIik6d2luZG93LmpRdWVyeX0oKSk7XG4iLCIvKiFcbiAqIEphdmFTY3JpcHQgQ29va2llIHYyLjIuMFxuICogaHR0cHM6Ly9naXRodWIuY29tL2pzLWNvb2tpZS9qcy1jb29raWVcbiAqXG4gKiBDb3B5cmlnaHQgMjAwNiwgMjAxNSBLbGF1cyBIYXJ0bCAmIEZhZ25lciBCcmFja1xuICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBsaWNlbnNlXG4gKi9cbjsoZnVuY3Rpb24gKGZhY3RvcnkpIHtcblx0dmFyIHJlZ2lzdGVyZWRJbk1vZHVsZUxvYWRlcjtcblx0aWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuXHRcdGRlZmluZShmYWN0b3J5KTtcblx0XHRyZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXIgPSB0cnVlO1xuXHR9XG5cdGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcblx0XHRtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcblx0XHRyZWdpc3RlcmVkSW5Nb2R1bGVMb2FkZXIgPSB0cnVlO1xuXHR9XG5cdGlmICghcmVnaXN0ZXJlZEluTW9kdWxlTG9hZGVyKSB7XG5cdFx0dmFyIE9sZENvb2tpZXMgPSB3aW5kb3cuQ29va2llcztcblx0XHR2YXIgYXBpID0gd2luZG93LkNvb2tpZXMgPSBmYWN0b3J5KCk7XG5cdFx0YXBpLm5vQ29uZmxpY3QgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHR3aW5kb3cuQ29va2llcyA9IE9sZENvb2tpZXM7XG5cdFx0XHRyZXR1cm4gYXBpO1xuXHRcdH07XG5cdH1cbn0oZnVuY3Rpb24gKCkge1xuXHRmdW5jdGlvbiBleHRlbmQgKCkge1xuXHRcdHZhciBpID0gMDtcblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0Zm9yICg7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdHZhciBhdHRyaWJ1dGVzID0gYXJndW1lbnRzWyBpIF07XG5cdFx0XHRmb3IgKHZhciBrZXkgaW4gYXR0cmlidXRlcykge1xuXHRcdFx0XHRyZXN1bHRba2V5XSA9IGF0dHJpYnV0ZXNba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZ1bmN0aW9uIGRlY29kZSAocykge1xuXHRcdHJldHVybiBzLnJlcGxhY2UoLyglWzAtOUEtWl17Mn0pKy9nLCBkZWNvZGVVUklDb21wb25lbnQpO1xuXHR9XG5cblx0ZnVuY3Rpb24gaW5pdCAoY29udmVydGVyKSB7XG5cdFx0ZnVuY3Rpb24gYXBpKCkge31cblxuXHRcdGZ1bmN0aW9uIHNldCAoa2V5LCB2YWx1ZSwgYXR0cmlidXRlcykge1xuXHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRhdHRyaWJ1dGVzID0gZXh0ZW5kKHtcblx0XHRcdFx0cGF0aDogJy8nXG5cdFx0XHR9LCBhcGkuZGVmYXVsdHMsIGF0dHJpYnV0ZXMpO1xuXG5cdFx0XHRpZiAodHlwZW9mIGF0dHJpYnV0ZXMuZXhwaXJlcyA9PT0gJ251bWJlcicpIHtcblx0XHRcdFx0YXR0cmlidXRlcy5leHBpcmVzID0gbmV3IERhdGUobmV3IERhdGUoKSAqIDEgKyBhdHRyaWJ1dGVzLmV4cGlyZXMgKiA4NjRlKzUpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZSdyZSB1c2luZyBcImV4cGlyZXNcIiBiZWNhdXNlIFwibWF4LWFnZVwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgSUVcblx0XHRcdGF0dHJpYnV0ZXMuZXhwaXJlcyA9IGF0dHJpYnV0ZXMuZXhwaXJlcyA/IGF0dHJpYnV0ZXMuZXhwaXJlcy50b1VUQ1N0cmluZygpIDogJyc7XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHZhciByZXN1bHQgPSBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG5cdFx0XHRcdGlmICgvXltcXHtcXFtdLy50ZXN0KHJlc3VsdCkpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fSBjYXRjaCAoZSkge31cblxuXHRcdFx0dmFsdWUgPSBjb252ZXJ0ZXIud3JpdGUgP1xuXHRcdFx0XHRjb252ZXJ0ZXIud3JpdGUodmFsdWUsIGtleSkgOlxuXHRcdFx0XHRlbmNvZGVVUklDb21wb25lbnQoU3RyaW5nKHZhbHVlKSlcblx0XHRcdFx0XHQucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnwzQXwzQ3wzRXwzRHwyRnwzRnw0MHw1Qnw1RHw1RXw2MHw3Qnw3RHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KTtcblxuXHRcdFx0a2V5ID0gZW5jb2RlVVJJQ29tcG9uZW50KFN0cmluZyhrZXkpKVxuXHRcdFx0XHQucmVwbGFjZSgvJSgyM3wyNHwyNnwyQnw1RXw2MHw3QykvZywgZGVjb2RlVVJJQ29tcG9uZW50KVxuXHRcdFx0XHQucmVwbGFjZSgvW1xcKFxcKV0vZywgZXNjYXBlKTtcblxuXHRcdFx0dmFyIHN0cmluZ2lmaWVkQXR0cmlidXRlcyA9ICcnO1xuXHRcdFx0Zm9yICh2YXIgYXR0cmlidXRlTmFtZSBpbiBhdHRyaWJ1dGVzKSB7XG5cdFx0XHRcdGlmICghYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0cmluZ2lmaWVkQXR0cmlidXRlcyArPSAnOyAnICsgYXR0cmlidXRlTmFtZTtcblx0XHRcdFx0aWYgKGF0dHJpYnV0ZXNbYXR0cmlidXRlTmFtZV0gPT09IHRydWUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENvbnNpZGVycyBSRkMgNjI2NSBzZWN0aW9uIDUuMjpcblx0XHRcdFx0Ly8gLi4uXG5cdFx0XHRcdC8vIDMuICBJZiB0aGUgcmVtYWluaW5nIHVucGFyc2VkLWF0dHJpYnV0ZXMgY29udGFpbnMgYSAleDNCIChcIjtcIilcblx0XHRcdFx0Ly8gICAgIGNoYXJhY3Rlcjpcblx0XHRcdFx0Ly8gQ29uc3VtZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5wYXJzZWQtYXR0cmlidXRlcyB1cCB0byxcblx0XHRcdFx0Ly8gbm90IGluY2x1ZGluZywgdGhlIGZpcnN0ICV4M0IgKFwiO1wiKSBjaGFyYWN0ZXIuXG5cdFx0XHRcdC8vIC4uLlxuXHRcdFx0XHRzdHJpbmdpZmllZEF0dHJpYnV0ZXMgKz0gJz0nICsgYXR0cmlidXRlc1thdHRyaWJ1dGVOYW1lXS5zcGxpdCgnOycpWzBdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKGRvY3VtZW50LmNvb2tpZSA9IGtleSArICc9JyArIHZhbHVlICsgc3RyaW5naWZpZWRBdHRyaWJ1dGVzKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBnZXQgKGtleSwganNvbikge1xuXHRcdFx0aWYgKHR5cGVvZiBkb2N1bWVudCA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHR2YXIgamFyID0ge307XG5cdFx0XHQvLyBUbyBwcmV2ZW50IHRoZSBmb3IgbG9vcCBpbiB0aGUgZmlyc3QgcGxhY2UgYXNzaWduIGFuIGVtcHR5IGFycmF5XG5cdFx0XHQvLyBpbiBjYXNlIHRoZXJlIGFyZSBubyBjb29raWVzIGF0IGFsbC5cblx0XHRcdHZhciBjb29raWVzID0gZG9jdW1lbnQuY29va2llID8gZG9jdW1lbnQuY29va2llLnNwbGl0KCc7ICcpIDogW107XG5cdFx0XHR2YXIgaSA9IDA7XG5cblx0XHRcdGZvciAoOyBpIDwgY29va2llcy5sZW5ndGg7IGkrKykge1xuXHRcdFx0XHR2YXIgcGFydHMgPSBjb29raWVzW2ldLnNwbGl0KCc9Jyk7XG5cdFx0XHRcdHZhciBjb29raWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKCc9Jyk7XG5cblx0XHRcdFx0aWYgKCFqc29uICYmIGNvb2tpZS5jaGFyQXQoMCkgPT09ICdcIicpIHtcblx0XHRcdFx0XHRjb29raWUgPSBjb29raWUuc2xpY2UoMSwgLTEpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHR2YXIgbmFtZSA9IGRlY29kZShwYXJ0c1swXSk7XG5cdFx0XHRcdFx0Y29va2llID0gKGNvbnZlcnRlci5yZWFkIHx8IGNvbnZlcnRlcikoY29va2llLCBuYW1lKSB8fFxuXHRcdFx0XHRcdFx0ZGVjb2RlKGNvb2tpZSk7XG5cblx0XHRcdFx0XHRpZiAoanNvbikge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0Y29va2llID0gSlNPTi5wYXJzZShjb29raWUpO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoZSkge31cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRqYXJbbmFtZV0gPSBjb29raWU7XG5cblx0XHRcdFx0XHRpZiAoa2V5ID09PSBuYW1lKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHt9XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybi
21167BrZXkgPyBqYXJba2V5XSA6IGphcjtcblx0XHR9XG5cblx0XHRhcGkuc2V0ID0gc2V0O1xuXHRcdGFwaS5nZXQgPSBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gZ2V0KGtleSwgZmFsc2UgLyogcmVhZCBhcyByYXcgKi8pO1xuXHRcdH07XG5cdFx0YXBpLmdldEpTT04gPSBmdW5jdGlvbiAoa2V5KSB7XG5cdFx0XHRyZXR1cm4gZ2V0KGtleSwgdHJ1ZSAvKiByZWFkIGFzIGpzb24gKi8pO1xuXHRcdH07XG5cdFx0YXBpLnJlbW92ZSA9IGZ1bmN0aW9uIChrZXksIGF0dHJpYnV0ZXMpIHtcblx0XHRcdHNldChrZXksICcnLCBleHRlbmQoYXR0cmlidXRlcywge1xuXHRcdFx0XHRleHBpcmVzOiAtMVxuXHRcdFx0fSkpO1xuXHRcdH07XG5cblx0XHRhcGkuZGVmYXVsdHMgPSB7fTtcblxuXHRcdGFwaS53aXRoQ29udmVydGVyID0gaW5pdDtcblxuXHRcdHJldHVybiBhcGk7XG5cdH1cblxuXHRyZXR1cm4gaW5pdChmdW5jdGlvbiAoKSB7fSk7XG59KSk7XG4iLCIvKipcbiAqIGx1bnIgLSBodHRwOi8vbHVucmpzLmNvbSAtIEEgYml0IGxpa2UgU29sciwgYnV0IG11Y2ggc21hbGxlciBhbmQgbm90IGFzIGJyaWdodCAtIDAuNi4wXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTUgT2xpdmVyIE5pZ2h0aW5nYWxlXG4gKiBNSVQgTGljZW5zZWRcbiAqIEBsaWNlbnNlXG4gKi9cbiFmdW5jdGlvbigpe3ZhciB0PWZ1bmN0aW9uKGUpe3ZhciBuPW5ldyB0LkluZGV4O3JldHVybiBuLnBpcGVsaW5lLmFkZCh0LnRyaW1tZXIsdC5zdG9wV29yZEZpbHRlcix0LnN0ZW1tZXIpLGUmJmUuY2FsbChuLG4pLG59O3QudmVyc2lvbj1cIjAuNi4wXCIsdC51dGlscz17fSx0LnV0aWxzLndhcm49ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3QuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oZSl9fSh0aGlzKSx0LnV0aWxzLmFzU3RyaW5nPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10fHxudWxsPT09dD9cIlwiOnQudG9TdHJpbmcoKX0sdC5FdmVudEVtaXR0ZXI9ZnVuY3Rpb24oKXt0aGlzLmV2ZW50cz17fX0sdC5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyPWZ1bmN0aW9uKCl7dmFyIHQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSxlPXQucG9wKCksbj10O2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcihcImxhc3QgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uXCIpO24uZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLmhhc0hhbmRsZXIodCl8fCh0aGlzLmV2ZW50c1t0XT1bXSksdGhpcy5ldmVudHNbdF0ucHVzaChlKX0sdGhpcyl9LHQuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVMaXN0ZW5lcj1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaGFzSGFuZGxlcih0KSl7dmFyIG49dGhpcy5ldmVudHNbdF0uaW5kZXhPZihlKTt0aGlzLmV2ZW50c1t0XS5zcGxpY2UobiwxKSx0aGlzLmV2ZW50c1t0XS5sZW5ndGh8fGRlbGV0ZSB0aGlzLmV2ZW50c1t0XX19LHQuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0PWZ1bmN0aW9uKHQpe2lmKHRoaXMuaGFzSGFuZGxlcih0KSl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3RoaXMuZXZlbnRzW3RdLmZvckVhY2goZnVuY3Rpb24odCl7dC5hcHBseSh2b2lkIDAsZSl9KX19LHQuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5oYXNIYW5kbGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuZXZlbnRzfSx0LnRva2VuaXplcj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCYmbnVsbCE9ZSYmdm9pZCAwIT1lP0FycmF5LmlzQXJyYXkoZSk/ZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHQudXRpbHMuYXNTdHJpbmcoZSkudG9Mb3dlckNhc2UoKX0pOmUudG9TdHJpbmcoKS50cmltKCkudG9Mb3dlckNhc2UoKS5zcGxpdCh0LnRva2VuaXplci5zZXBlcmF0b3IpOltdfSx0LnRva2VuaXplci5zZXBlcmF0b3I9L1tcXHNcXC1dKy8sdC5QaXBlbGluZT1mdW5jdGlvbigpe3RoaXMuX3N0YWNrPVtdfSx0LlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnM9e30sdC5QaXBlbGluZS5yZWdpc3RlckZ1bmN0aW9uPWZ1bmN0aW9uKGUsbil7biBpbiB0aGlzLnJlZ2lzdGVyZWRGdW5jdGlvbnMmJnQudXRpbHMud2FybihcIk92ZXJ3cml0aW5nIGV4aXN0aW5nIHJlZ2lzdGVyZWQgZnVuY3Rpb246IFwiK24pLGUubGFiZWw9bix0LlBpcGVsaW5lLnJlZ2lzdGVyZWRGdW5jdGlvbnNbZS5sYWJlbF09ZX0sdC5QaXBlbGluZS53YXJuSWZGdW5jdGlvbk5vdFJlZ2lzdGVyZWQ9ZnVuY3Rpb24oZSl7dmFyIG49ZS5sYWJlbCYmZS5sYWJlbCBpbiB0aGlzLnJlZ2lzdGVyZWRGdW5jdGlvbnM7bnx8dC51dGlscy53YXJuKFwiRnVuY3Rpb24gaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBwaXBlbGluZS4gVGhpcyBtYXkgY2F1c2UgcHJvYmxlbXMgd2hlbiBzZXJpYWxpc2luZyB0aGUgaW5kZXguXFxuXCIsZSl9LHQuUGlwZWxpbmUubG9hZD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdC5QaXBlbGluZTtyZXR1cm4gZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBpPXQuUGlwZWxpbmUucmVnaXN0ZXJlZEZ1bmN0aW9uc1tlXTtpZighaSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgbG9hZCB1bi1yZWdpc3RlcmVkIGZ1bmN0aW9uOiBcIitlKTtuLmFkZChpKX0pLG59LHQuUGlwZWxpbmUucHJvdG90eXBlLmFkZD1mdW5jdGlvbigpe3ZhciBlPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3QuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKGUpLHRoaXMuX3N0YWNrLnB1c2goZSl9LHRoaXMpfSx0LlBpcGVsaW5lLnByb3RvdHlwZS5hZnRlcj1mdW5jdGlvbihlLG4pe3QuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKG4pO3ZhciBpPXRoaXMuX3N0YWNrLmluZGV4T2YoZSk7aWYoLTE9PWkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZXhpc3RpbmdGblwiKTtpKz0xLHRoaXMuX3N0YWNrLnNwbGljZShpLDAsbil9LHQuUGlwZWxpbmUucHJvdG90eXBlLmJlZm9yZT1mdW5jdGlvbihlLG4pe3QuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKG4pO3ZhciBpPXRoaXMuX3N0YWNrLmluZGV4T2YoZSk7aWYoLTE9PWkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgZXhpc3RpbmdGblwiKTt0aGlzLl9zdGFjay5zcGxpY2UoaSwwLG4pfSx0LlBpcGVsaW5lLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc3RhY2suaW5kZXhPZih0KTstMSE9ZSYmdGhpcy5fc3RhY2suc3BsaWNlKGUsMSl9LHQuUGlwZWxpbmUucHJvdG90eXBlLnJ1bj1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj10Lmxlbmd0aCxpPXRoaXMuX3N0YWNrLmxlbmd0aCxyPTA7bj5yO3IrKyl7Zm9yKHZhciBvPXRbcl0scz0wO2k+cyYmKG89dGhpcy5fc3RhY2tbc10obyxyLHQpLHZvaWQgMCE9PW8mJlwiXCIhPT1vKTtzKyspO3ZvaWQgMCE9PW8mJlwiXCIhPT1vJiZlLnB1c2gobyl9cmV0dXJuIGV9LHQuUGlwZWxpbmUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5fc3RhY2s9W119LHQuUGlwZWxpbmUucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGFjay5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIHQuUGlwZWxpbmUud2FybklmRnVuY3Rpb25Ob3RSZWdpc3RlcmVkKGUpLGUubGFiZWx9KX0sdC5WZWN0b3I9ZnVuY3Rpb24oKXt0aGlzLl9tYWduaXR1ZGU9b
21167nVsbCx0aGlzLmxpc3Q9dm9pZCAwLHRoaXMubGVuZ3RoPTB9LHQuVmVjdG9yLk5vZGU9ZnVuY3Rpb24odCxlLG4pe3RoaXMuaWR4PXQsdGhpcy52YWw9ZSx0aGlzLm5leHQ9bn0sdC5WZWN0b3IucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihlLG4pe3RoaXMuX21hZ25pdHVkZT12b2lkIDA7dmFyIGk9dGhpcy5saXN0O2lmKCFpKXJldHVybiB0aGlzLmxpc3Q9bmV3IHQuVmVjdG9yLk5vZGUoZSxuLGkpLHRoaXMubGVuZ3RoKys7aWYoZTxpLmlkeClyZXR1cm4gdGhpcy5saXN0PW5ldyB0LlZlY3Rvci5Ob2RlKGUsbixpKSx0aGlzLmxlbmd0aCsrO2Zvcih2YXIgcj1pLG89aS5uZXh0O3ZvaWQgMCE9bzspe2lmKGU8by5pZHgpcmV0dXJuIHIubmV4dD1uZXcgdC5WZWN0b3IuTm9kZShlLG4sbyksdGhpcy5sZW5ndGgrKztyPW8sbz1vLm5leHR9cmV0dXJuIHIubmV4dD1uZXcgdC5WZWN0b3IuTm9kZShlLG4sbyksdGhpcy5sZW5ndGgrK30sdC5WZWN0b3IucHJvdG90eXBlLm1hZ25pdHVkZT1mdW5jdGlvbigpe2lmKHRoaXMuX21hZ25pdHVkZSlyZXR1cm4gdGhpcy5fbWFnbml0dWRlO2Zvcih2YXIgdCxlPXRoaXMubGlzdCxuPTA7ZTspdD1lLnZhbCxuKz10KnQsZT1lLm5leHQ7cmV0dXJuIHRoaXMuX21hZ25pdHVkZT1NYXRoLnNxcnQobil9LHQuVmVjdG9yLnByb3RvdHlwZS5kb3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMubGlzdCxuPXQubGlzdCxpPTA7ZSYmbjspZS5pZHg8bi5pZHg/ZT1lLm5leHQ6ZS5pZHg+bi5pZHg/bj1uLm5leHQ6KGkrPWUudmFsKm4udmFsLGU9ZS5uZXh0LG49bi5uZXh0KTtyZXR1cm4gaX0sdC5WZWN0b3IucHJvdG90eXBlLnNpbWlsYXJpdHk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZG90KHQpLyh0aGlzLm1hZ25pdHVkZSgpKnQubWFnbml0dWRlKCkpfSx0LlNvcnRlZFNldD1mdW5jdGlvbigpe3RoaXMubGVuZ3RoPTAsdGhpcy5lbGVtZW50cz1bXX0sdC5Tb3J0ZWRTZXQubG9hZD1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdGhpcztyZXR1cm4gZS5lbGVtZW50cz10LGUubGVuZ3RoPXQubGVuZ3RoLGV9LHQuU29ydGVkU2V0LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oKXt2YXIgdCxlO2Zvcih0PTA7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyllPWFyZ3VtZW50c1t0XSx+dGhpcy5pbmRleE9mKGUpfHx0aGlzLmVsZW1lbnRzLnNwbGljZSh0aGlzLmxvY2F0aW9uRm9yKGUpLDAsZSk7dGhpcy5sZW5ndGg9dGhpcy5lbGVtZW50cy5sZW5ndGh9LHQuU29ydGVkU2V0LnByb3RvdHlwZS50b0FycmF5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHMuc2xpY2UoKX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLm1hcD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsZW1lbnRzLm1hcCh0LGUpfSx0LlNvcnRlZFNldC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmVsZW1lbnRzLmZvckVhY2godCxlKX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLmluZGV4T2Y9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTAsbj10aGlzLmVsZW1lbnRzLmxlbmd0aCxpPW4tZSxyPWUrTWF0aC5mbG9vcihpLzIpLG89dGhpcy5lbGVtZW50c1tyXTtpPjE7KXtpZihvPT09dClyZXR1cm4gcjt0Pm8mJihlPXIpLG8+dCYmKG49ciksaT1uLWUscj1lK01hdGguZmxvb3IoaS8yKSxvPXRoaXMuZWxlbWVudHNbcl19cmV0dXJuIG89PT10P3I6LTF9LHQuU29ydGVkU2V0LnByb3RvdHlwZS5sb2NhdGlvbkZvcj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MCxuPXRoaXMuZWxlbWVudHMubGVuZ3RoLGk9bi1lLHI9ZStNYXRoLmZsb29yKGkvMiksbz10aGlzLmVsZW1lbnRzW3JdO2k+MTspdD5vJiYoZT1yKSxvPnQmJihuPXIpLGk9bi1lLHI9ZStNYXRoLmZsb29yKGkvMiksbz10aGlzLmVsZW1lbnRzW3JdO3JldHVybiBvPnQ/cjp0Pm8/cisxOnZvaWQgMH0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbihlKXtmb3IodmFyIG49bmV3IHQuU29ydGVkU2V0LGk9MCxyPTAsbz10aGlzLmxlbmd0aCxzPWUubGVuZ3RoLGE9dGhpcy5lbGVtZW50cyxoPWUuZWxlbWVudHM7Oyl7aWYoaT5vLTF8fHI+cy0xKWJyZWFrO2FbaV0hPT1oW3JdP2FbaV08aFtyXT9pKys6YVtpXT5oW3JdJiZyKys6KG4uYWRkKGFbaV0pLGkrKyxyKyspfXJldHVybiBufSx0LlNvcnRlZFNldC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXt2YXIgZT1uZXcgdC5Tb3J0ZWRTZXQ7cmV0dXJuIGUuZWxlbWVudHM9dGhpcy50b0FycmF5KCksZS5sZW5ndGg9ZS5lbGVtZW50cy5sZW5ndGgsZX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLnVuaW9uPWZ1bmN0aW9uKHQpe3ZhciBlLG4saTtyZXR1cm4gdGhpcy5sZW5ndGg+PXQubGVuZ3RoPyhlPXRoaXMsbj10KTooZT10LG49dGhpcyksaT1lLmNsb25lKCksaS5hZGQuYXBwbHkoaSxuLnRvQXJyYXkoKSksaX0sdC5Tb3J0ZWRTZXQucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRvQXJyYXkoKX0sdC5JbmRleD1mdW5jdGlvbigpe3RoaXMuX2ZpZWxkcz1bXSx0aGlzLl9yZWY9XCJpZFwiLHRoaXMucGlwZWxpbmU9bmV3IHQuUGlwZWxpbmUsdGhpcy5kb2N1bWVudFN0b3JlPW5ldyB0LlN0b3JlLHRoaXMudG9rZW5TdG9yZT1uZXcgdC5Ub2tlblN0b3JlLHRoaXMuY29ycHVzVG9rZW5zPW5ldyB0LlNvcnRlZFNldCx0aGlzLmV2ZW50RW1pdHRlcj1uZXcgdC5FdmVudEVtaXR0ZXIsdGhpcy5faWRmQ2FjaGU9e30sdGhpcy5vbihcImFkZFwiLFwicmVtb3ZlXCIsXCJ1cGRhdGVcIixmdW5jdGlvbigpe3RoaXMuX2lkZkNhY2hlPXt9fS5iaW5kKHRoaXMpKX0sdC5JbmRleC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3JldHVybiB0aGlzLmV2ZW50RW1pdHRlci5hZGRMaXN0ZW5lci5hcHBseSh0aGlzLmV2ZW50RW1pdHRlcix0KX0sdC5JbmRleC5wcm90b3R5cGUub2ZmPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyKHQsZSl9LHQuSW5kZXgubG9hZD1mdW5jdGlvbihlKXtlLnZlcnNpb24hPT10LnZlcnNpb24mJnQudXRpbHMud2FybihcInZlcnNpb24gbWlzbWF0Y2g6IGN1cnJlbnQgXCIrdC52ZXJzaW9uK1wiIGltcG9ydGluZyBcIitlLnZlcnNpb24pO3ZhciBuPW5ldyB0aGlzO3JldHVybiBuLl9maWVsZHM9ZS5maWVsZHMsbi5fcmVmPWUucmVmLG4uZG9jdW1lbnRTdG9yZT10LlN0b3JlLmxvYWQoZS5kb2N1bWVudFN0b3JlKSxuLnRva2VuU3RvcmU9dC5Ub2tlblN0b3JlLmxvYWQoZS50b2tlblN0b3JlKSxuLmNvcnB1c1Rva2Vucz10LlNvcnRlZFNldC5sb2FkKGUuY29ycHVzVG9rZW5zKSxuLnBpcGVsaW5lPXQuUGlwZWxpbmUubG9hZChlLnBpcGVsaW5lKSxufSx0LkluZGV4LnByb3RvdHlwZS5maWVsZD1mdW5jdGlvbih0LGUpe3ZhciBlPWV8fHt9LG49e25hbWU6dCxib29zdDplLmJvb3N0fHwxfTtyZXR1cm4gdGhpcy5fZmllbGRzLnB1c2gobiksdGhpc30sdC5JbmRleC5wcm90b3R5cGUucmVmPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZWY9dCx0aGlzfSx0LkluZGV4LnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSxuKXt2YXIgaT17fS
21167xyPW5ldyB0LlNvcnRlZFNldCxvPWVbdGhpcy5fcmVmXSxuPXZvaWQgMD09PW4/ITA6bjt0aGlzLl9maWVsZHMuZm9yRWFjaChmdW5jdGlvbihuKXt2YXIgbz10aGlzLnBpcGVsaW5lLnJ1bih0LnRva2VuaXplcihlW24ubmFtZV0pKTtpW24ubmFtZV09byx0LlNvcnRlZFNldC5wcm90b3R5cGUuYWRkLmFwcGx5KHIsbyl9LHRoaXMpLHRoaXMuZG9jdW1lbnRTdG9yZS5zZXQobyxyKSx0LlNvcnRlZFNldC5wcm90b3R5cGUuYWRkLmFwcGx5KHRoaXMuY29ycHVzVG9rZW5zLHIudG9BcnJheSgpKTtmb3IodmFyIHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIGE9ci5lbGVtZW50c1tzXSxoPXRoaXMuX2ZpZWxkcy5yZWR1Y2UoZnVuY3Rpb24odCxlKXt2YXIgbj1pW2UubmFtZV0ubGVuZ3RoO2lmKCFuKXJldHVybiB0O3ZhciByPWlbZS5uYW1lXS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQ9PT1hfSkubGVuZ3RoO3JldHVybiB0K3IvbiplLmJvb3N0fSwwKTt0aGlzLnRva2VuU3RvcmUuYWRkKGEse3JlZjpvLHRmOmh9KX1uJiZ0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwiYWRkXCIsZSx0aGlzKX0sdC5JbmRleC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dFt0aGlzLl9yZWZdLGU9dm9pZCAwPT09ZT8hMDplO2lmKHRoaXMuZG9jdW1lbnRTdG9yZS5oYXMobikpe3ZhciBpPXRoaXMuZG9jdW1lbnRTdG9yZS5nZXQobik7dGhpcy5kb2N1bWVudFN0b3JlLnJlbW92ZShuKSxpLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy50b2tlblN0b3JlLnJlbW92ZSh0LG4pfSx0aGlzKSxlJiZ0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwicmVtb3ZlXCIsdCx0aGlzKX19LHQuSW5kZXgucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBlPXZvaWQgMD09PWU/ITA6ZTt0aGlzLnJlbW92ZSh0LCExKSx0aGlzLmFkZCh0LCExKSxlJiZ0aGlzLmV2ZW50RW1pdHRlci5lbWl0KFwidXBkYXRlXCIsdCx0aGlzKX0sdC5JbmRleC5wcm90b3R5cGUuaWRmPWZ1bmN0aW9uKHQpe3ZhciBlPVwiQFwiK3Q7aWYoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuX2lkZkNhY2hlLGUpKXJldHVybiB0aGlzLl9pZGZDYWNoZVtlXTt2YXIgbj10aGlzLnRva2VuU3RvcmUuY291bnQodCksaT0xO3JldHVybiBuPjAmJihpPTErTWF0aC5sb2codGhpcy5kb2N1bWVudFN0b3JlLmxlbmd0aC9uKSksdGhpcy5faWRmQ2FjaGVbZV09aX0sdC5JbmRleC5wcm90b3R5cGUuc2VhcmNoPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXMucGlwZWxpbmUucnVuKHQudG9rZW5pemVyKGUpKSxpPW5ldyB0LlZlY3RvcixyPVtdLG89dGhpcy5fZmllbGRzLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0K2UuYm9vc3R9LDApLHM9bi5zb21lKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnRva2VuU3RvcmUuaGFzKHQpfSx0aGlzKTtpZighcylyZXR1cm5bXTtuLmZvckVhY2goZnVuY3Rpb24oZSxuLHMpe3ZhciBhPTEvcy5sZW5ndGgqdGhpcy5fZmllbGRzLmxlbmd0aCpvLGg9dGhpcyx1PXRoaXMudG9rZW5TdG9yZS5leHBhbmQoZSkucmVkdWNlKGZ1bmN0aW9uKG4scil7dmFyIG89aC5jb3JwdXNUb2tlbnMuaW5kZXhPZihyKSxzPWguaWRmKHIpLHU9MSxsPW5ldyB0LlNvcnRlZFNldDtpZihyIT09ZSl7dmFyIGM9TWF0aC5tYXgoMyxyLmxlbmd0aC1lLmxlbmd0aCk7dT0xL01hdGgubG9nKGMpfW8+LTEmJmkuaW5zZXJ0KG8sYSpzKnUpO2Zvcih2YXIgZj1oLnRva2VuU3RvcmUuZ2V0KHIpLHA9T2JqZWN0LmtleXMoZiksZD1wLmxlbmd0aCx2PTA7ZD52O3YrKylsLmFkZChmW3Bbdl1dLnJlZik7cmV0dXJuIG4udW5pb24obCl9LG5ldyB0LlNvcnRlZFNldCk7ci5wdXNoKHUpfSx0aGlzKTt2YXIgYT1yLnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0LmludGVyc2VjdChlKX0pO3JldHVybiBhLm1hcChmdW5jdGlvbih0KXtyZXR1cm57cmVmOnQsc2NvcmU6aS5zaW1pbGFyaXR5KHRoaXMuZG9jdW1lbnRWZWN0b3IodCkpfX0sdGhpcykuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLnNjb3JlLXQuc2NvcmV9KX0sdC5JbmRleC5wcm90b3R5cGUuZG9jdW1lbnRWZWN0b3I9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPXRoaXMuZG9jdW1lbnRTdG9yZS5nZXQoZSksaT1uLmxlbmd0aCxyPW5ldyB0LlZlY3RvcixvPTA7aT5vO28rKyl7dmFyIHM9bi5lbGVtZW50c1tvXSxhPXRoaXMudG9rZW5TdG9yZS5nZXQocylbZV0udGYsaD10aGlzLmlkZihzKTtyLmluc2VydCh0aGlzLmNvcnB1c1Rva2Vucy5pbmRleE9mKHMpLGEqaCl9cmV0dXJuIHJ9LHQuSW5kZXgucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt2ZXJzaW9uOnQudmVyc2lvbixmaWVsZHM6dGhpcy5fZmllbGRzLHJlZjp0aGlzLl9yZWYsZG9jdW1lbnRTdG9yZTp0aGlzLmRvY3VtZW50U3RvcmUudG9KU09OKCksdG9rZW5TdG9yZTp0aGlzLnRva2VuU3RvcmUudG9KU09OKCksY29ycHVzVG9rZW5zOnRoaXMuY29ycHVzVG9rZW5zLnRvSlNPTigpLHBpcGVsaW5lOnRoaXMucGlwZWxpbmUudG9KU09OKCl9fSx0LkluZGV4LnByb3RvdHlwZS51c2U9ZnVuY3Rpb24odCl7dmFyIGU9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO2UudW5zaGlmdCh0aGlzKSx0LmFwcGx5KHRoaXMsZSl9LHQuU3RvcmU9ZnVuY3Rpb24oKXt0aGlzLnN0b3JlPXt9LHRoaXMubGVuZ3RoPTB9LHQuU3RvcmUubG9hZD1mdW5jdGlvbihlKXt2YXIgbj1uZXcgdGhpcztyZXR1cm4gbi5sZW5ndGg9ZS5sZW5ndGgsbi5zdG9yZT1PYmplY3Qua2V5cyhlLnN0b3JlKS5yZWR1Y2UoZnVuY3Rpb24obixpKXtyZXR1cm4gbltpXT10LlNvcnRlZFNldC5sb2FkKGUuc3RvcmVbaV0pLG59LHt9KSxufSx0LlN0b3JlLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt0aGlzLmhhcyh0KXx8dGhpcy5sZW5ndGgrKyx0aGlzLnN0b3JlW3RdPWV9LHQuU3RvcmUucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zdG9yZVt0XX0sdC5TdG9yZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0IGluIHRoaXMuc3RvcmV9LHQuU3RvcmUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXt0aGlzLmhhcyh0KSYmKGRlbGV0ZSB0aGlzLnN0b3JlW3RdLHRoaXMubGVuZ3RoLS0pfSx0LlN0b3JlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57c3RvcmU6dGhpcy5zdG9yZSxsZW5ndGg6dGhpcy5sZW5ndGh9fSx0LnN0ZW1tZXI9ZnVuY3Rpb24oKXt2YXIgdD17YXRpb25hbDpcImF0ZVwiLHRpb25hbDpcInRpb25cIixlbmNpOlwiZW5jZVwiLGFuY2k6XCJhbmNlXCIsaXplcjpcIml6ZVwiLGJsaTpcImJsZVwiLGFsbGk6XCJhbFwiLGVudGxpOlwiZW50XCIsZWxpOlwiZVwiLG91c2xpOlwib3VzXCIsaXphdGlvbjpcIml6ZVwiLGF0aW9uOlwiYXRlXCIsYXRvcjpcImF0ZVwiLGFsaXNtOlwiYWxcIixpdmVuZXNzOlwiaXZlXCIsZnVsbmVzczpcImZ1bFwiLG91c25lc3M6XCJvdXNcIixhbGl0aTpcImFsXCIsaXZpdGk6XCJpdmVcIixiaWxpdGk6XCJibGVcIixsb2dpOlwibG9nXCJ9LGU9e2ljYXRlOlwiaWNcIixhdGl2ZTpcIlwiLGFsaXplOlwiYWxcIixpY2l0aTpcImljXCIsaWNhbDpcImljXCIsZnVsOlwiXCIsbmVzczpcIlwifSxuPVwiW15hZWlvdV1cIixpPVwiW2FlaW91eV1cIixyPW4rXCJbXmFlaW91eV0qXCIsbz1pK1wiW2FlaW91XSpcIixzPVwiXihcIityK1wiKT9cIitvK3IsYT1cIl4oXCIrcitcIik/XCIrbytyK1wiKFwiK28rXCIpPyRcIixoPVwiXihcIityK1wiKT9cIitvK3IrbytyLHU9XCJeKFwiK3IrXCIpP1wiK2ksbD1uZXcgUmVnRXhwKHMpLGM9bmV3IFJlZ0V4cChoKSxmPW5ldyBSZWdFeHAoYSkscD1uZXcgUmVnRXhwKHUpLGQ9L14oLis/KShzc3xpKWVzJC8sdj0vXiguKz8pKFtec10pcyQvLG09L14oLis/KWVlZCQvLGc9L14oLis/KShlZHxpbmcpJC8seT0vLiQvLFM9LyhhdHxibHxpeikkLyx3PW5ldyBSZWdFeHAoXCIoW15hZWlvdXlsc3pdKVxcXFwxJFwiKSx4PW5ldyBSZWdFeHAoXCJeXCIrcitpK1wiW15hZWlvdXd4eV0kXCIpLGs9L14oLis/W15hZWlvdV0peSQvLGI9L14oLis/KShhdGlvbmFsfHRpb25hbHxlbmNpfGFuY2l8aXplcnxibGl8YWxsaXxlbnRsaXxlbGl8b3VzbGl8aXphdGlvbnxhdGlvbnxhdG9yfGFsaXNtfGl2ZW5lc3N8ZnVsbmVzc3xvdXNuZXNzfGFsaXRpfGl2aXRpfGJpbGl0aXxsb2dpKSQvLEU9L14oLis/KShpY2F0ZXxhdGl2ZXxhbGl6ZXxpY2l0aXxpY2FsfGZ1bHxuZXNzKSQvLF89L14oLis/KShhbHxhbmNlfGVuY2V8ZXJ8aWN8YWJsZXxpYmxlfGFudHxlbWVudHxtZW50fGVudHxvdXxpc218YXRlfGl0aXxvdXN8aXZlfGl6ZSkkLyxGPS9eKC4rPykoc3x0KShpb24pJC8sTz0vXiguKz8pZSQvLFA9L2xsJC8sTj1uZXcgUmVnRXhwKFwiXl
21167wiK3IraStcIlteYWVpb3V3eHldJFwiKSxUPWZ1bmN0aW9uKG4pe3ZhciBpLHIsbyxzLGEsaCx1O2lmKG4ubGVuZ3RoPDMpcmV0dXJuIG47aWYobz1uLnN1YnN0cigwLDEpLFwieVwiPT1vJiYobj1vLnRvVXBwZXJDYXNlKCkrbi5zdWJzdHIoMSkpLHM9ZCxhPXYscy50ZXN0KG4pP249bi5yZXBsYWNlKHMsXCIkMSQyXCIpOmEudGVzdChuKSYmKG49bi5yZXBsYWNlKGEsXCIkMSQyXCIpKSxzPW0sYT1nLHMudGVzdChuKSl7dmFyIFQ9cy5leGVjKG4pO3M9bCxzLnRlc3QoVFsxXSkmJihzPXksbj1uLnJlcGxhY2UocyxcIlwiKSl9ZWxzZSBpZihhLnRlc3Qobikpe3ZhciBUPWEuZXhlYyhuKTtpPVRbMV0sYT1wLGEudGVzdChpKSYmKG49aSxhPVMsaD13LHU9eCxhLnRlc3Qobik/bis9XCJlXCI6aC50ZXN0KG4pPyhzPXksbj1uLnJlcGxhY2UocyxcIlwiKSk6dS50ZXN0KG4pJiYobis9XCJlXCIpKX1pZihzPWsscy50ZXN0KG4pKXt2YXIgVD1zLmV4ZWMobik7aT1UWzFdLG49aStcImlcIn1pZihzPWIscy50ZXN0KG4pKXt2YXIgVD1zLmV4ZWMobik7aT1UWzFdLHI9VFsyXSxzPWwscy50ZXN0KGkpJiYobj1pK3Rbcl0pfWlmKHM9RSxzLnRlc3Qobikpe3ZhciBUPXMuZXhlYyhuKTtpPVRbMV0scj1UWzJdLHM9bCxzLnRlc3QoaSkmJihuPWkrZVtyXSl9aWYocz1fLGE9RixzLnRlc3Qobikpe3ZhciBUPXMuZXhlYyhuKTtpPVRbMV0scz1jLHMudGVzdChpKSYmKG49aSl9ZWxzZSBpZihhLnRlc3Qobikpe3ZhciBUPWEuZXhlYyhuKTtpPVRbMV0rVFsyXSxhPWMsYS50ZXN0KGkpJiYobj1pKX1pZihzPU8scy50ZXN0KG4pKXt2YXIgVD1zLmV4ZWMobik7aT1UWzFdLHM9YyxhPWYsaD1OLChzLnRlc3QoaSl8fGEudGVzdChpKSYmIWgudGVzdChpKSkmJihuPWkpfXJldHVybiBzPVAsYT1jLHMudGVzdChuKSYmYS50ZXN0KG4pJiYocz15LG49bi5yZXBsYWNlKHMsXCJcIikpLFwieVwiPT1vJiYobj1vLnRvTG93ZXJDYXNlKCkrbi5zdWJzdHIoMSkpLG59O3JldHVybiBUfSgpLHQuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbih0LnN0ZW1tZXIsXCJzdGVtbWVyXCIpLHQuZ2VuZXJhdGVTdG9wV29yZEZpbHRlcj1mdW5jdGlvbih0KXt2YXIgZT10LnJlZHVjZShmdW5jdGlvbih0LGUpe3JldHVybiB0W2VdPWUsdH0se30pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdCYmZVt0XSE9PXQ/dDp2b2lkIDB9fSx0LnN0b3BXb3JkRmlsdGVyPXQuZ2VuZXJhdGVTdG9wV29yZEZpbHRlcihbXCJhXCIsXCJhYmxlXCIsXCJhYm91dFwiLFwiYWNyb3NzXCIsXCJhZnRlclwiLFwiYWxsXCIsXCJhbG1vc3RcIixcImFsc29cIixcImFtXCIsXCJhbW9uZ1wiLFwiYW5cIixcImFuZFwiLFwiYW55XCIsXCJhcmVcIixcImFzXCIsXCJhdFwiLFwiYmVcIixcImJlY2F1c2VcIixcImJlZW5cIixcImJ1dFwiLFwiYnlcIixcImNhblwiLFwiY2Fubm90XCIsXCJjb3VsZFwiLFwiZGVhclwiLFwiZGlkXCIsXCJkb1wiLFwiZG9lc1wiLFwiZWl0aGVyXCIsXCJlbHNlXCIsXCJldmVyXCIsXCJldmVyeVwiLFwiZm9yXCIsXCJmcm9tXCIsXCJnZXRcIixcImdvdFwiLFwiaGFkXCIsXCJoYXNcIixcImhhdmVcIixcImhlXCIsXCJoZXJcIixcImhlcnNcIixcImhpbVwiLFwiaGlzXCIsXCJob3dcIixcImhvd2V2ZXJcIixcImlcIixcImlmXCIsXCJpblwiLFwiaW50b1wiLFwiaXNcIixcIml0XCIsXCJpdHNcIixcImp1c3RcIixcImxlYXN0XCIsXCJsZXRcIixcImxpa2VcIixcImxpa2VseVwiLFwibWF5XCIsXCJtZVwiLFwibWlnaHRcIixcIm1vc3RcIixcIm11c3RcIixcIm15XCIsXCJuZWl0aGVyXCIsXCJub1wiLFwibm9yXCIsXCJub3RcIixcIm9mXCIsXCJvZmZcIixcIm9mdGVuXCIsXCJvblwiLFwib25seVwiLFwib3JcIixcIm90aGVyXCIsXCJvdXJcIixcIm93blwiLFwicmF0aGVyXCIsXCJzYWlkXCIsXCJzYXlcIixcInNheXNcIixcInNoZVwiLFwic2hvdWxkXCIsXCJzaW5jZVwiLFwic29cIixcInNvbWVcIixcInRoYW5cIixcInRoYXRcIixcInRoZVwiLFwidGhlaXJcIixcInRoZW1cIixcInRoZW5cIixcInRoZXJlXCIsXCJ0aGVzZVwiLFwidGhleVwiLFwidGhpc1wiLFwidGlzXCIsXCJ0b1wiLFwidG9vXCIsXCJ0d2FzXCIsXCJ1c1wiLFwid2FudHNcIixcIndhc1wiLFwid2VcIixcIndlcmVcIixcIndoYXRcIixcIndoZW5cIixcIndoZXJlXCIsXCJ3aGljaFwiLFwid2hpbGVcIixcIndob1wiLFwid2hvbVwiLFwid2h5XCIsXCJ3aWxsXCIsXCJ3aXRoXCIsXCJ3b3VsZFwiLFwieWV0XCIsXCJ5b3VcIixcInlvdXJcIl0pLHQuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbih0LnN0b3BXb3JkRmlsdGVyLFwic3RvcFdvcmRGaWx0ZXJcIiksdC50cmltbWVyPWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlcGxhY2UoL15cXFcrLyxcIlwiKS5yZXBsYWNlKC9cXFcrJC8sXCJcIil9LHQuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbih0LnRyaW1tZXIsXCJ0cmltbWVyXCIpLHQuVG9rZW5TdG9yZT1mdW5jdGlvbigpe3RoaXMucm9vdD17ZG9jczp7fX0sdGhpcy5sZW5ndGg9MH0sdC5Ub2tlblN0b3JlLmxvYWQ9ZnVuY3Rpb24odCl7dmFyIGU9bmV3IHRoaXM7cmV0dXJuIGUucm9vdD10LnJvb3QsZS5sZW5ndGg9dC5sZW5ndGgsZX0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBuPW58fHRoaXMucm9vdCxpPXQuY2hhckF0KDApLHI9dC5zbGljZSgxKTtyZXR1cm4gaSBpbiBufHwobltpXT17ZG9jczp7fX0pLDA9PT1yLmxlbmd0aD8obltpXS5kb2NzW2UucmVmXT1lLHZvaWQodGhpcy5sZW5ndGgrPTEpKTp0aGlzLmFkZChyLGUsbltpXSl9LHQuVG9rZW5TdG9yZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybiExO2Zvcih2YXIgZT10aGlzLnJvb3Qsbj0wO248dC5sZW5ndGg7bisrKXtpZighZVt0LmNoYXJBdChuKV0pcmV0dXJuITE7ZT1lW3QuY2hhckF0KG4pXX1yZXR1cm4hMH0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS5nZXROb2RlPWZ1bmN0aW9uKHQpe2lmKCF0KXJldHVybnt9O2Zvcih2YXIgZT10aGlzLnJvb3Qsbj0wO248dC5sZW5ndGg7bisrKXtpZighZVt0LmNoYXJBdChuKV0pcmV0dXJue307ZT1lW3QuY2hhckF0KG4pXX1yZXR1cm4gZX0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5nZXROb2RlKHQsZSkuZG9jc3x8e319LHQuVG9rZW5TdG9yZS5wcm90b3R5cGUuY291bnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5nZXQodCxlKSkubGVuZ3RofSx0LlRva2VuU3RvcmUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0LGUpe2lmKHQpe2Zvcih2YXIgbj10aGlzLnJvb3QsaT0wO2k8dC5sZW5ndGg7aSsrKXtpZighKHQuY2hhckF0KGkpaW4gbikpcmV0dXJuO249blt0LmN
21167oYXJBdChpKV19ZGVsZXRlIG4uZG9jc1tlXX19LHQuVG9rZW5TdG9yZS5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5nZXROb2RlKHQpLGk9bi5kb2NzfHx7fSxlPWV8fFtdO3JldHVybiBPYmplY3Qua2V5cyhpKS5sZW5ndGgmJmUucHVzaCh0KSxPYmplY3Qua2V5cyhuKS5mb3JFYWNoKGZ1bmN0aW9uKG4pe1wiZG9jc1wiIT09biYmZS5jb25jYXQodGhpcy5leHBhbmQodCtuLGUpKX0sdGhpcyksZX0sdC5Ub2tlblN0b3JlLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXtyZXR1cm57cm9vdDp0aGlzLnJvb3QsbGVuZ3RoOnRoaXMubGVuZ3RofX0sZnVuY3Rpb24odCxlKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKGUpOlwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP21vZHVsZS5leHBvcnRzPWUoKTp0Lmx1bnI9ZSgpfSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KX0oKTsiLCIhZnVuY3Rpb24oaSl7XCJ1c2Ugc3RyaWN0XCI7XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXCJqcXVlcnlcIl0saSk6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIGV4cG9ydHM/bW9kdWxlLmV4cG9ydHM9aShyZXF1aXJlKFwianF1ZXJ5XCIpKTppKGpRdWVyeSl9KGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO3ZhciBlPXdpbmRvdy5TbGlja3x8e307KGU9ZnVuY3Rpb24oKXt2YXIgZT0wO3JldHVybiBmdW5jdGlvbih0LG8pe3ZhciBzLG49dGhpcztuLmRlZmF1bHRzPXthY2Nlc3NpYmlsaXR5OiEwLGFkYXB0aXZlSGVpZ2h0OiExLGFwcGVuZEFycm93czppKHQpLGFwcGVuZERvdHM6aSh0KSxhcnJvd3M6ITAsYXNOYXZGb3I6bnVsbCxwcmV2QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1wcmV2XCIgYXJpYS1sYWJlbD1cIlByZXZpb3VzXCIgdHlwZT1cImJ1dHRvblwiPlByZXZpb3VzPC9idXR0b24+JyxuZXh0QXJyb3c6JzxidXR0b24gY2xhc3M9XCJzbGljay1uZXh0XCIgYXJpYS1sYWJlbD1cIk5leHRcIiB0eXBlPVwiYnV0dG9uXCI+TmV4dDwvYnV0dG9uPicsYXV0b3BsYXk6ITEsYXV0b3BsYXlTcGVlZDozZTMsY2VudGVyTW9kZTohMSxjZW50ZXJQYWRkaW5nOlwiNTBweFwiLGNzc0Vhc2U6XCJlYXNlXCIsY3VzdG9tUGFnaW5nOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGkoJzxidXR0b24gdHlwZT1cImJ1dHRvblwiIC8+JykudGV4dCh0KzEpfSxkb3RzOiExLGRvdHNDbGFzczpcInNsaWNrLWRvdHNcIixkcmFnZ2FibGU6ITAsZWFzaW5nOlwibGluZWFyXCIsZWRnZUZyaWN0aW9uOi4zNSxmYWRlOiExLGZvY3VzT25TZWxlY3Q6ITEsZm9jdXNPbkNoYW5nZTohMSxpbmZpbml0ZTohMCxpbml0aWFsU2xpZGU6MCxsYXp5TG9hZDpcIm9uZGVtYW5kXCIsbW9iaWxlRmlyc3Q6ITEscGF1c2VPbkhvdmVyOiEwLHBhdXNlT25Gb2N1czohMCxwYXVzZU9uRG90c0hvdmVyOiExLHJlc3BvbmRUbzpcIndpbmRvd1wiLHJlc3BvbnNpdmU6bnVsbCxyb3dzOjEscnRsOiExLHNsaWRlOlwiXCIsc2xpZGVzUGVyUm93OjEsc2xpZGVzVG9TaG93OjEsc2xpZGVzVG9TY3JvbGw6MSxzcGVlZDo1MDAsc3dpcGU6ITAsc3dpcGVUb1NsaWRlOiExLHRvdWNoTW92ZTohMCx0b3VjaFRocmVzaG9sZDo1LHVzZUNTUzohMCx1c2VUcmFuc2Zvcm06ITAsdmFyaWFibGVXaWR0aDohMSx2ZXJ0aWNhbDohMSx2ZXJ0aWNhbFN3aXBpbmc6ITEsd2FpdEZvckFuaW1hdGU6ITAsekluZGV4OjFlM30sbi5pbml0aWFscz17YW5pbWF0aW5nOiExLGRyYWdnaW5nOiExLGF1dG9QbGF5VGltZXI6bnVsbCxjdXJyZW50RGlyZWN0aW9uOjAsY3VycmVudExlZnQ6bnVsbCxjdXJyZW50U2xpZGU6MCxkaXJlY3Rpb246MSwkZG90czpudWxsLGxpc3RXaWR0aDpudWxsLGxpc3RIZWlnaHQ6bnVsbCxsb2FkSW5kZXg6MCwkbmV4dEFycm93Om51bGwsJHByZXZBcnJvdzpudWxsLHNjcm9sbGluZzohMSxzbGlkZUNvdW50Om51bGwsc2xpZGVXaWR0aDpudWxsLCRzbGlkZVRyYWNrOm51bGwsJHNsaWRlczpudWxsLHNsaWRpbmc6ITEsc2xpZGVPZmZzZXQ6MCxzd2lwZUxlZnQ6bnVsbCxzd2lwaW5nOiExLCRsaXN0Om51bGwsdG91Y2hPYmplY3Q6e30sdHJhbnNmb3Jtc0VuYWJsZWQ6ITEsdW5zbGlja2VkOiExfSxpLmV4dGVuZChuLG4uaW5pdGlhbHMpLG4uYWN0aXZlQnJlYWtwb2ludD1udWxsLG4uYW5pbVR5cGU9bnVsbCxuLmFuaW1Qcm9wPW51bGwsbi5icmVha3BvaW50cz1bXSxuLmJyZWFrcG9pbnRTZXR0aW5ncz1bXSxuLmNzc1RyYW5zaXRpb25zPSExLG4uZm9jdXNzZWQ9ITEsbi5pbnRlcnJ1cHRlZD0hMSxuLmhpZGRlbj1cImhpZGRlblwiLG4ucGF1c2VkPSEwLG4ucG9zaXRpb25Qcm9wPW51bGwsbi5yZXNwb25kVG89bnVsbCxuLnJvd0NvdW50PTEsbi5zaG91bGRDbGljaz0hMCxuLiRzbGlkZXI9aSh0KSxuLiRzbGlkZXNDYWNoZT1udWxsLG4udHJhbnNmb3JtVHlwZT1udWxsLG4udHJhbnNpdGlvblR5cGU9bnVsbCxuLnZpc2liaWxpdHlDaGFuZ2U9XCJ2aXNpYmlsaXR5Y2hhbmdlXCIsbi53aW5kb3dXaWR0aD0wLG4ud2luZG93VGltZXI9bnVsbCxzPWkodCkuZGF0YShcInNsaWNrXCIpfHx7fSxuLm9wdGlvbnM9aS5leHRlbmQoe30sbi5kZWZhdWx0cyxvLHMpLG4uY3VycmVudFNsaWRlPW4ub3B0aW9ucy5pbml0aWFsU2xpZGUsbi5vcmlnaW5hbFNldHRpbmdzPW4ub3B0aW9ucyx2b2lkIDAhPT1kb2N1bWVudC5tb3pIaWRkZW4/KG4uaGlkZGVuPVwibW96SGlkZGVuXCIsbi52aXNpYmlsaXR5Q2hhbmdlPVwibW96dmlzaWJpbGl0eWNoYW5nZVwiKTp2b2lkIDAhPT1kb2N1bWVudC53ZWJraXRIaWRkZW4mJihuLmhpZGRlbj1cIndlYmtpdEhpZGRlblwiLG4udmlzaWJpbGl0eUNoYW5nZT1cIndlYmtpdHZpc2liaWxpdHljaGFuZ2VcIiksbi5hdXRvUGxheT1pLnByb3h5KG4uYXV0b1BsYXksbiksbi5hdXRvUGxheUNsZWFyPWkucHJveHkobi5hdXRvUGxheUNsZWFyLG4pLG4uYXV0b1BsYXlJdGVyYXRvcj1pLnByb3h5KG4uYXV0b1BsYXlJdGVyYXRvcixuKSxuLmNoYW5nZVNsaWRlPWkucHJveHkobi5jaGFuZ2VTbGlkZSxuKSxuLmNsaWNrSGFuZGxlcj1pLnByb3h5KG4uY2xpY2tIYW5kbGVyLG4pLG4uc2VsZWN0SGFuZGxlcj1pLnByb3h5KG4uc2VsZWN0SGFuZGxlcixuKSxuLnNldFBvc2l0aW9uPWkucHJveHkobi5zZXRQb3NpdGlvbixuKSxuLnN3aXBlSGFuZGxlcj1pLnByb3h5KG4uc3dpcGVIYW5kbGVyLG4pLG4uZHJhZ0hhbmRsZXI9aS5wcm94eShuLmRyYWdIYW5kbGVyLG4pLG4ua2V5SGFuZGxlcj1pLnByb3h5KG4ua2V5SGFuZGxlcixuKSxuLmluc3RhbmNlVWlkPWUrKyxuLmh0bWxFeHByPS9eKD86XFxzKig8W1xcd1xcV10rPilbXj
211675dKikkLyxuLnJlZ2lzdGVyQnJlYWtwb2ludHMoKSxuLmluaXQoITApfX0oKSkucHJvdG90eXBlLmFjdGl2YXRlQURBPWZ1bmN0aW9uKCl7dGhpcy4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWFjdGl2ZVwiKS5hdHRyKHtcImFyaWEtaGlkZGVuXCI6XCJmYWxzZVwifSkuZmluZChcImEsIGlucHV0LCBidXR0b24sIHNlbGVjdFwiKS5hdHRyKHt0YWJpbmRleDpcIjBcIn0pfSxlLnByb3RvdHlwZS5hZGRTbGlkZT1lLnByb3RvdHlwZS5zbGlja0FkZD1mdW5jdGlvbihlLHQsbyl7dmFyIHM9dGhpcztpZihcImJvb2xlYW5cIj09dHlwZW9mIHQpbz10LHQ9bnVsbDtlbHNlIGlmKHQ8MHx8dD49cy5zbGlkZUNvdW50KXJldHVybiExO3MudW5sb2FkKCksXCJudW1iZXJcIj09dHlwZW9mIHQ/MD09PXQmJjA9PT1zLiRzbGlkZXMubGVuZ3RoP2koZSkuYXBwZW5kVG8ocy4kc2xpZGVUcmFjayk6bz9pKGUpLmluc2VydEJlZm9yZShzLiRzbGlkZXMuZXEodCkpOmkoZSkuaW5zZXJ0QWZ0ZXIocy4kc2xpZGVzLmVxKHQpKTohMD09PW8/aShlKS5wcmVwZW5kVG8ocy4kc2xpZGVUcmFjayk6aShlKS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKSxzLiRzbGlkZXM9cy4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLHMuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxzLiRzbGlkZVRyYWNrLmFwcGVuZChzLiRzbGlkZXMpLHMuJHNsaWRlcy5lYWNoKGZ1bmN0aW9uKGUsdCl7aSh0KS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLGUpfSkscy4kc2xpZGVzQ2FjaGU9cy4kc2xpZGVzLHMucmVpbml0KCl9LGUucHJvdG90eXBlLmFuaW1hdGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2lmKDE9PT1pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYhMD09PWkub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmITE9PT1pLm9wdGlvbnMudmVydGljYWwpe3ZhciBlPWkuJHNsaWRlcy5lcShpLmN1cnJlbnRTbGlkZSkub3V0ZXJIZWlnaHQoITApO2kuJGxpc3QuYW5pbWF0ZSh7aGVpZ2h0OmV9LGkub3B0aW9ucy5zcGVlZCl9fSxlLnByb3RvdHlwZS5hbmltYXRlU2xpZGU9ZnVuY3Rpb24oZSx0KXt2YXIgbz17fSxzPXRoaXM7cy5hbmltYXRlSGVpZ2h0KCksITA9PT1zLm9wdGlvbnMucnRsJiYhMT09PXMub3B0aW9ucy52ZXJ0aWNhbCYmKGU9LWUpLCExPT09cy50cmFuc2Zvcm1zRW5hYmxlZD8hMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9zLiRzbGlkZVRyYWNrLmFuaW1hdGUoe2xlZnQ6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6cy4kc2xpZGVUcmFjay5hbmltYXRlKHt0b3A6ZX0scy5vcHRpb25zLnNwZWVkLHMub3B0aW9ucy5lYXNpbmcsdCk6ITE9PT1zLmNzc1RyYW5zaXRpb25zPyghMD09PXMub3B0aW9ucy5ydGwmJihzLmN1cnJlbnRMZWZ0PS1zLmN1cnJlbnRMZWZ0KSxpKHthbmltU3RhcnQ6cy5jdXJyZW50TGVmdH0pLmFuaW1hdGUoe2FuaW1TdGFydDplfSx7ZHVyYXRpb246cy5vcHRpb25zLnNwZWVkLGVhc2luZzpzLm9wdGlvbnMuZWFzaW5nLHN0ZXA6ZnVuY3Rpb24oaSl7aT1NYXRoLmNlaWwoaSksITE9PT1zLm9wdGlvbnMudmVydGljYWw/KG9bcy5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIraStcInB4LCAwcHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpOihvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlKDBweCxcIitpK1wicHgpXCIscy4kc2xpZGVUcmFjay5jc3MobykpfSxjb21wbGV0ZTpmdW5jdGlvbigpe3QmJnQuY2FsbCgpfX0pKToocy5hcHBseVRyYW5zaXRpb24oKSxlPU1hdGguY2VpbChlKSwhMT09PXMub3B0aW9ucy52ZXJ0aWNhbD9vW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoXCIrZStcInB4LCAwcHgsIDBweClcIjpvW3MuYW5pbVR5cGVdPVwidHJhbnNsYXRlM2QoMHB4LFwiK2UrXCJweCwgMHB4KVwiLHMuJHNsaWRlVHJhY2suY3NzKG8pLHQmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmRpc2FibGVUcmFuc2l0aW9uKCksdC5jYWxsKCl9LHMub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5nZXROYXZUYXJnZXQ9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS5vcHRpb25zLmFzTmF2Rm9yO3JldHVybiB0JiZudWxsIT09dCYmKHQ9aSh0KS5ub3QoZS4kc2xpZGVyKSksdH0sZS5wcm90b3R5cGUuYXNOYXZGb3I9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5nZXROYXZUYXJnZXQoKTtudWxsIT09dCYmXCJvYmplY3RcIj09dHlwZW9mIHQmJnQuZWFjaChmdW5jdGlvbigpe3ZhciB0PWkodGhpcykuc2xpY2soXCJnZXRTbGlja1wiKTt0LnVuc2xpY2tlZHx8dC5zbGlkZUhhbmRsZXIoZSwhMCl9KX0sZS5wcm90b3R5cGUuYXBwbHlUcmFuc2l0aW9uPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXMsdD17fTshMT09PWUub3B0aW9ucy5mYWRlP3RbZS50cmFuc2l0aW9uVHlwZV09ZS50cmFuc2Zvcm1UeXBlK1wiIFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlOnRbZS50cmFuc2l0aW9uVHlwZV09XCJvcGFjaXR5IFwiK2Uub3B0aW9ucy5zcGVlZCtcIm1zIFwiK2Uub3B0aW9ucy5jc3NFYXNlLCExPT09ZS5vcHRpb25zLmZhZGU/ZS4kc2xpZGVUcmFjay5jc3ModCk6ZS4kc2xpZGVzLmVxKGkpLmNzcyh0KX0sZS5wcm90b3R5cGUuYXV0b1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXlDbGVhcigpLGkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS5hdXRvUGxheVRpbWVyPXNldEludGVydmFsKGkuYXV0b1BsYXlJdGVyYXRvcixpLm9wdGlvbnMuYXV0b3BsYXlTcGVlZCkpfSxlLnByb3RvdHlwZS5hdXRvUGxheUNsZWFyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5VGltZXImJmNsZWFySW50ZXJ2YWwoaS5hdXRvUGxheVRpbWVyKX0sZS5wcm90b3R5cGUuYXV0b1BsYXlJdGVyYXRvcj1mdW5jdGlvbigpe3ZhciBpPXRoaXMsZT1pLmN1cnJlbnRTbGlkZStpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw7aS5wYXVzZWR8fGkuaW50ZXJydXB0ZWR8fGkuZm9jdXNzZWR8fCghMT09PWkub3B0aW9ucy5pbmZpbml0ZSYmKDE9PT1pLmRpcmVjdGlvbiYmaS5jdXJyZW50U2xpZGUrMT09PWkuc2xpZGVDb3VudC0xP2kuZGlyZWN0aW9uPTA6MD09PWkuZGlyZWN0aW9uJiYoZT1pLmN1cnJlbnRTbGlkZS1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsaS5jdXJyZW50U2xpZGUtMT09MCYmKGkuZGlyZWN0aW9uPTEpKSksaS5zbGlkZUhhbmRsZXIoZSkpfSxlLnByb3RvdHlwZS5idWlsZEFycm93cz1mdW5jdGlvbigpe3ZhciBlPXR
21167oaXM7ITA9PT1lLm9wdGlvbnMuYXJyb3dzJiYoZS4kcHJldkFycm93PWkoZS5vcHRpb25zLnByZXZBcnJvdykuYWRkQ2xhc3MoXCJzbGljay1hcnJvd1wiKSxlLiRuZXh0QXJyb3c9aShlLm9wdGlvbnMubmV4dEFycm93KS5hZGRDbGFzcyhcInNsaWNrLWFycm93XCIpLGUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93PyhlLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1oaWRkZW5cIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuIHRhYmluZGV4XCIpLGUuJG5leHRBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWhpZGRlblwiKS5yZW1vdmVBdHRyKFwiYXJpYS1oaWRkZW4gdGFiaW5kZXhcIiksZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5wcmV2QXJyb3cpJiZlLiRwcmV2QXJyb3cucHJlcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLGUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMubmV4dEFycm93KSYmZS4kbmV4dEFycm93LmFwcGVuZFRvKGUub3B0aW9ucy5hcHBlbmRBcnJvd3MpLCEwIT09ZS5vcHRpb25zLmluZmluaXRlJiZlLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSk6ZS4kcHJldkFycm93LmFkZChlLiRuZXh0QXJyb3cpLmFkZENsYXNzKFwic2xpY2staGlkZGVuXCIpLmF0dHIoe1wiYXJpYS1kaXNhYmxlZFwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pKX0sZS5wcm90b3R5cGUuYnVpbGREb3RzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvPXRoaXM7aWYoITA9PT1vLm9wdGlvbnMuZG90cyl7Zm9yKG8uJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLWRvdHRlZFwiKSx0PWkoXCI8dWwgLz5cIikuYWRkQ2xhc3Moby5vcHRpb25zLmRvdHNDbGFzcyksZT0wO2U8PW8uZ2V0RG90Q291bnQoKTtlKz0xKXQuYXBwZW5kKGkoXCI8bGkgLz5cIikuYXBwZW5kKG8ub3B0aW9ucy5jdXN0b21QYWdpbmcuY2FsbCh0aGlzLG8sZSkpKTtvLiRkb3RzPXQuYXBwZW5kVG8oby5vcHRpb25zLmFwcGVuZERvdHMpLG8uJGRvdHMuZmluZChcImxpXCIpLmZpcnN0KCkuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIil9fSxlLnByb3RvdHlwZS5idWlsZE91dD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlci5jaGlsZHJlbihlLm9wdGlvbnMuc2xpZGUrXCI6bm90KC5zbGljay1jbG9uZWQpXCIpLmFkZENsYXNzKFwic2xpY2stc2xpZGVcIiksZS5zbGlkZUNvdW50PWUuJHNsaWRlcy5sZW5ndGgsZS4kc2xpZGVzLmVhY2goZnVuY3Rpb24oZSx0KXtpKHQpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsZSkuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiLGkodCkuYXR0cihcInN0eWxlXCIpfHxcIlwiKX0pLGUuJHNsaWRlci5hZGRDbGFzcyhcInNsaWNrLXNsaWRlclwiKSxlLiRzbGlkZVRyYWNrPTA9PT1lLnNsaWRlQ291bnQ/aSgnPGRpdiBjbGFzcz1cInNsaWNrLXRyYWNrXCIvPicpLmFwcGVuZFRvKGUuJHNsaWRlcik6ZS4kc2xpZGVzLndyYXBBbGwoJzxkaXYgY2xhc3M9XCJzbGljay10cmFja1wiLz4nKS5wYXJlbnQoKSxlLiRsaXN0PWUuJHNsaWRlVHJhY2sud3JhcCgnPGRpdiBjbGFzcz1cInNsaWNrLWxpc3RcIi8+JykucGFyZW50KCksZS4kc2xpZGVUcmFjay5jc3MoXCJvcGFjaXR5XCIsMCksITAhPT1lLm9wdGlvbnMuY2VudGVyTW9kZSYmITAhPT1lLm9wdGlvbnMuc3dpcGVUb1NsaWRlfHwoZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPTEpLGkoXCJpbWdbZGF0YS1sYXp5XVwiLGUuJHNsaWRlcikubm90KFwiW3NyY11cIikuYWRkQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLmJ1aWxkRG90cygpLGUudXBkYXRlRG90cygpLGUuc2V0U2xpZGVDbGFzc2VzKFwibnVtYmVyXCI9PXR5cGVvZiBlLmN1cnJlbnRTbGlkZT9lLmN1cnJlbnRTbGlkZTowKSwhMD09PWUub3B0aW9ucy5kcmFnZ2FibGUmJmUuJGxpc3QuYWRkQ2xhc3MoXCJkcmFnZ2FibGVcIil9LGUucHJvdG90eXBlLmJ1aWxkUm93cz1mdW5jdGlvbigpe3ZhciBpLGUsdCxvLHMsbixyLGw9dGhpcztpZihvPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPWwuJHNsaWRlci5jaGlsZHJlbigpLGwub3B0aW9ucy5yb3dzPjEpe2ZvcihyPWwub3B0aW9ucy5zbGlkZXNQZXJSb3cqbC5vcHRpb25zLnJvd3Mscz1NYXRoLmNlaWwobi5sZW5ndGgvciksaT0wO2k8cztpKyspe3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7Zm9yKGU9MDtlPGwub3B0aW9ucy5yb3dzO2UrKyl7dmFyIGE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtmb3IodD0wO3Q8bC5vcHRpb25zLnNsaWRlc1BlclJvdzt0Kyspe3ZhciBjPWkqcisoZSpsLm9wdGlvbnMuc2xpZGVzUGVyUm93K3QpO24uZ2V0KGMpJiZhLmFwcGVuZENoaWxkKG4uZ2V0KGMpKX1kLmFwcGVuZENoaWxkKGEpfW8uYXBwZW5kQ2hpbGQoZCl9bC4kc2xpZGVyLmVtcHR5KCkuYXBwZW5kKG8pLGwuJHNsaWRlci5jaGlsZHJlbigpLmNoaWxkcmVuKCkuY2hpbGRyZW4oKS5jc3Moe3dpZHRoOjEwMC9sLm9wdGlvbnMuc2xpZGVzUGVyUm93K1wiJVwiLGRpc3BsYXk6XCJpbmxpbmUtYmxvY2tcIn0pfX0sZS5wcm90b3R5cGUuY2hlY2tSZXNwb25zaXZlPWZ1bmN0aW9uKGUsdCl7dmFyIG8scyxuLHI9dGhpcyxsPSExLGQ9ci4kc2xpZGVyLndpZHRoKCksYT13aW5kb3cuaW5uZXJXaWR0aHx8aSh3aW5kb3cpLndpZHRoKCk7aWYoXCJ3aW5kb3dcIj09PXIucmVzcG9uZFRvP249YTpcInNsaWRlclwiPT09ci5yZXNwb25kVG8/bj1kOlwibWluXCI9PT1yLnJlc3BvbmRUbyYmKG49TWF0aC5taW4oYSxkKSksci5vcHRpb25zLnJlc3BvbnNpdmUmJnIub3B0aW9ucy5yZXNwb25zaXZlLmxlbmd0aCYmbnVsbCE9PXIub3B0aW9ucy5yZXNwb25zaXZlKXtzPW51bGw7Zm9yKG8gaW4gci5icmVha3BvaW50cylyLmJyZWFrcG9pbnRzLmhhc093blByb3BlcnR5KG8pJiYoITE9PT1yLm9yaWdpbmFsU2V0dGluZ3MubW9iaWxlRmlyc3Q/bjxyLmJyZWFrcG9pbnRzW29dJiYocz1yLmJyZWFrcG9pbnRzW29dKTpuPnIuYnJlYWtwb2ludHNbb10mJihzPXIuYnJlYWtwb2ludHNbb10pKTtudWxsIT09cz9udWxsIT09ci5hY3RpdmVCcmVha3BvaW50PyhzIT09ci5hY3RpdmVCcmVha3BvaW50fHx0KSYmKH
21167IuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6KHIuYWN0aXZlQnJlYWtwb2ludD1zLFwidW5zbGlja1wiPT09ci5icmVha3BvaW50U2V0dGluZ3Nbc10/ci51bnNsaWNrKHMpOihyLm9wdGlvbnM9aS5leHRlbmQoe30sci5vcmlnaW5hbFNldHRpbmdzLHIuYnJlYWtwb2ludFNldHRpbmdzW3NdKSwhMD09PWUmJihyLmN1cnJlbnRTbGlkZT1yLm9wdGlvbnMuaW5pdGlhbFNsaWRlKSxyLnJlZnJlc2goZSkpLGw9cyk6bnVsbCE9PXIuYWN0aXZlQnJlYWtwb2ludCYmKHIuYWN0aXZlQnJlYWtwb2ludD1udWxsLHIub3B0aW9ucz1yLm9yaWdpbmFsU2V0dGluZ3MsITA9PT1lJiYoci5jdXJyZW50U2xpZGU9ci5vcHRpb25zLmluaXRpYWxTbGlkZSksci5yZWZyZXNoKGUpLGw9cyksZXx8ITE9PT1sfHxyLiRzbGlkZXIudHJpZ2dlcihcImJyZWFrcG9pbnRcIixbcixsXSl9fSxlLnByb3RvdHlwZS5jaGFuZ2VTbGlkZT1mdW5jdGlvbihlLHQpe3ZhciBvLHMsbixyPXRoaXMsbD1pKGUuY3VycmVudFRhcmdldCk7c3dpdGNoKGwuaXMoXCJhXCIpJiZlLnByZXZlbnREZWZhdWx0KCksbC5pcyhcImxpXCIpfHwobD1sLmNsb3Nlc3QoXCJsaVwiKSksbj1yLnNsaWRlQ291bnQlci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsIT0wLG89bj8wOihyLnNsaWRlQ291bnQtci5jdXJyZW50U2xpZGUpJXIub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxlLmRhdGEubWVzc2FnZSl7Y2FzZVwicHJldmlvdXNcIjpzPTA9PT1vP3Iub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDpyLm9wdGlvbnMuc2xpZGVzVG9TaG93LW8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlLXMsITEsdCk7YnJlYWs7Y2FzZVwibmV4dFwiOnM9MD09PW8/ci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOm8sci5zbGlkZUNvdW50PnIub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnIuc2xpZGVIYW5kbGVyKHIuY3VycmVudFNsaWRlK3MsITEsdCk7YnJlYWs7Y2FzZVwiaW5kZXhcIjp2YXIgZD0wPT09ZS5kYXRhLmluZGV4PzA6ZS5kYXRhLmluZGV4fHxsLmluZGV4KCkqci5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO3Iuc2xpZGVIYW5kbGVyKHIuY2hlY2tOYXZpZ2FibGUoZCksITEsdCksbC5jaGlsZHJlbigpLnRyaWdnZXIoXCJmb2N1c1wiKTticmVhaztkZWZhdWx0OnJldHVybn19LGUucHJvdG90eXBlLmNoZWNrTmF2aWdhYmxlPWZ1bmN0aW9uKGkpe3ZhciBlLHQ7aWYoZT10aGlzLmdldE5hdmlnYWJsZUluZGV4ZXMoKSx0PTAsaT5lW2UubGVuZ3RoLTFdKWk9ZVtlLmxlbmd0aC0xXTtlbHNlIGZvcih2YXIgbyBpbiBlKXtpZihpPGVbb10pe2k9dDticmVha310PWVbb119cmV0dXJuIGl9LGUucHJvdG90eXBlLmNsZWFuVXBFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Uub3B0aW9ucy5kb3RzJiZudWxsIT09ZS4kZG90cyYmKGkoXCJsaVwiLGUuJGRvdHMpLm9mZihcImNsaWNrLnNsaWNrXCIsZS5jaGFuZ2VTbGlkZSkub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLm9mZihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRkb3RzLm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSxlLiRzbGlkZXIub2ZmKFwiZm9jdXMuc2xpY2sgYmx1ci5zbGlja1wiKSwhMD09PWUub3B0aW9ucy5hcnJvd3MmJmUuc2xpZGVDb3VudD5lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS4kcHJldkFycm93JiZlLiRwcmV2QXJyb3cub2ZmKFwiY2xpY2suc2xpY2tcIixlLmNoYW5nZVNsaWRlKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiLGUuY2hhbmdlU2xpZGUpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihlLiRwcmV2QXJyb3cmJmUuJHByZXZBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSxlLiRuZXh0QXJyb3cmJmUuJG5leHRBcnJvdy5vZmYoXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSkpLGUuJGxpc3Qub2ZmKFwidG91Y2hzdGFydC5zbGljayBtb3VzZWRvd24uc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJ0b3VjaG1vdmUuc2xpY2sgbW91c2Vtb3ZlLnNsaWNrXCIsZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub2ZmKFwidG91Y2hlbmQuc2xpY2sgbW91c2V1cC5zbGlja1wiLGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9mZihcInRvdWNoY2FuY2VsLnNsaWNrIG1vdXNlbGVhdmUuc2xpY2tcIixlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vZmYoXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vZmYoZS52aXNpYmlsaXR5Q2hhbmdlLGUudmlzaWJpbGl0eSksZS5jbGVhblVwU2xpZGVFdmVudHMoKSwhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5JiZlLiRsaXN0Lm9mZihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vZmYoXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9mZihcIm9yaWVudGF0aW9uY2hhbmdlLnNsaWNrLnNsaWNrLVwiK2UuaW5zdGFuY2VVaWQsZS5vcmllbnRhdGlvbkNoYW5nZSksaSh3aW5kb3cpLm9mZihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUucmVzaXplKSxpKFwiW2RyYWdnYWJsZSE9dHJ1ZV1cIixlLiRzbGlkZVRyYWNrKS5vZmYoXCJkcmFnc3RhcnRcIixlLnByZXZlbnREZWZhdWx0KSxpKHdpbmRvdykub2ZmKFwibG9h
21167ZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pfSxlLnByb3RvdHlwZS5jbGVhblVwU2xpZGVFdmVudHM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuJGxpc3Qub2ZmKFwibW91c2VlbnRlci5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMCkpLGUuJGxpc3Qub2ZmKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpfSxlLnByb3RvdHlwZS5jbGVhblVwUm93cz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcztlLm9wdGlvbnMucm93cz4xJiYoKGk9ZS4kc2xpZGVzLmNoaWxkcmVuKCkuY2hpbGRyZW4oKSkucmVtb3ZlQXR0cihcInN0eWxlXCIpLGUuJHNsaWRlci5lbXB0eSgpLmFwcGVuZChpKSl9LGUucHJvdG90eXBlLmNsaWNrSGFuZGxlcj1mdW5jdGlvbihpKXshMT09PXRoaXMuc2hvdWxkQ2xpY2smJihpLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGkuc3RvcFByb3BhZ2F0aW9uKCksaS5wcmV2ZW50RGVmYXVsdCgpKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuYXV0b1BsYXlDbGVhcigpLHQudG91Y2hPYmplY3Q9e30sdC5jbGVhblVwRXZlbnRzKCksaShcIi5zbGljay1jbG9uZWRcIix0LiRzbGlkZXIpLmRldGFjaCgpLHQuJGRvdHMmJnQuJGRvdHMucmVtb3ZlKCksdC4kcHJldkFycm93JiZ0LiRwcmV2QXJyb3cubGVuZ3RoJiYodC4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLnByZXZBcnJvdykmJnQuJHByZXZBcnJvdy5yZW1vdmUoKSksdC4kbmV4dEFycm93JiZ0LiRuZXh0QXJyb3cubGVuZ3RoJiYodC4kbmV4dEFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWQgc2xpY2stYXJyb3cgc2xpY2staGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJhcmlhLWhpZGRlbiBhcmlhLWRpc2FibGVkIHRhYmluZGV4XCIpLmNzcyhcImRpc3BsYXlcIixcIlwiKSx0Lmh0bWxFeHByLnRlc3QodC5vcHRpb25zLm5leHRBcnJvdykmJnQuJG5leHRBcnJvdy5yZW1vdmUoKSksdC4kc2xpZGVzJiYodC4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLWNlbnRlciBzbGljay12aXNpYmxlIHNsaWNrLWN1cnJlbnRcIikucmVtb3ZlQXR0cihcImFyaWEtaGlkZGVuXCIpLnJlbW92ZUF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJzdHlsZVwiLGkodGhpcykuZGF0YShcIm9yaWdpbmFsU3R5bGluZ1wiKSl9KSx0LiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSkuZGV0YWNoKCksdC4kc2xpZGVUcmFjay5kZXRhY2goKSx0LiRsaXN0LmRldGFjaCgpLHQuJHNsaWRlci5hcHBlbmQodC4kc2xpZGVzKSksdC5jbGVhblVwUm93cygpLHQuJHNsaWRlci5yZW1vdmVDbGFzcyhcInNsaWNrLXNsaWRlclwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKSx0LiRzbGlkZXIucmVtb3ZlQ2xhc3MoXCJzbGljay1kb3R0ZWRcIiksdC51bnNsaWNrZWQ9ITAsZXx8dC4kc2xpZGVyLnRyaWdnZXIoXCJkZXN0cm95XCIsW3RdKX0sZS5wcm90b3R5cGUuZGlzYWJsZVRyYW5zaXRpb249ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcyx0PXt9O3RbZS50cmFuc2l0aW9uVHlwZV09XCJcIiwhMT09PWUub3B0aW9ucy5mYWRlP2UuJHNsaWRlVHJhY2suY3NzKHQpOmUuJHNsaWRlcy5lcShpKS5jc3ModCl9LGUucHJvdG90eXBlLmZhZGVTbGlkZT1mdW5jdGlvbihpLGUpe3ZhciB0PXRoaXM7ITE9PT10LmNzc1RyYW5zaXRpb25zPyh0LiRzbGlkZXMuZXEoaSkuY3NzKHt6SW5kZXg6dC5vcHRpb25zLnpJbmRleH0pLHQuJHNsaWRlcy5lcShpKS5hbmltYXRlKHtvcGFjaXR5OjF9LHQub3B0aW9ucy5zcGVlZCx0Lm9wdGlvbnMuZWFzaW5nLGUpKToodC5hcHBseVRyYW5zaXRpb24oaSksdC4kc2xpZGVzLmVxKGkpLmNzcyh7b3BhY2l0eToxLHpJbmRleDp0Lm9wdGlvbnMuekluZGV4fSksZSYmc2V0VGltZW91dChmdW5jdGlvbigpe3QuZGlzYWJsZVRyYW5zaXRpb24oaSksZS5jYWxsKCl9LHQub3B0aW9ucy5zcGVlZCkpfSxlLnByb3RvdHlwZS5mYWRlU2xpZGVPdXQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpczshMT09PWUuY3NzVHJhbnNpdGlvbnM/ZS4kc2xpZGVzLmVxKGkpLmFuaW1hdGUoe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSxlLm9wdGlvbnMuc3BlZWQsZS5vcHRpb25zLmVhc2luZyk6KGUuYXBwbHlUcmFuc2l0aW9uKGkpLGUuJHNsaWRlcy5lcShpKS5jc3Moe29wYWNpdHk6MCx6SW5kZXg6ZS5vcHRpb25zLnpJbmRleC0yfSkpfSxlLnByb3RvdHlwZS5maWx0ZXJTbGlkZXM9ZS5wcm90b3R5cGUuc2xpY2tGaWx0ZXI9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztudWxsIT09aSYmKGUuJHNsaWRlc0NhY2hlPWUuJHNsaWRlcyxlLnVubG9hZCgpLGUuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxlLiRzbGlkZXNDYWNoZS5maWx0ZXIoaSkuYXBwZW5kVG8oZS4kc2xpZGVUcmFjayksZS5yZWluaXQoKSl9LGUucHJvdG90eXBlLmZvY3VzSGFuZGxlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVyLm9mZihcImZvY3VzLnNsaWNrIGJsdXIuc2xpY2tcIikub24oXCJmb2N1cy5zbGljayBibHVyLnNsaWNrXCIsXCIqXCIsZnVuY3Rpb24odCl7dC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTt2YXIgbz1pKHRoaXMpO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtlLm9wdGlvbnMucGF1c2VPbkZvY3VzJiYoZS5mb2N1c3NlZD1vLmlzKFwiOmZvY3VzXCIpLGUuYXV0b1BsYXkoKSl9LDApfSl9LGUucHJvdG90eXBlLmdldEN1cnJlbnQ9ZS5wcm90b3R5cGUuc2xpY2tDdXJyZW50U2xpZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdXJyZW50U2xpZGV9LGUucHJvdG90eXBlLmdldERvdENvdW50PWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPTAsdD0wLG89MDtpZighMD09PWkub3B0aW9ucy5pbmZpbml0ZSlpZihpLnNsaWRlQ291bnQ8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cpKytvO2Vsc2UgZm9yKDtlPGkuc2xpZGVDb3VudDspKytvLGU9dCtpLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwsdCs9aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsPD1pLm9wdGlvbnMuc2xpZGVzVG9TaG93P2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDppLm9wdGlvbnMuc2xpZGVzVG9TaG93O2Vsc2UgaWYoITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSlvPWkuc2xpZGVDb3VudDtlbHNlIGlmKGkub3B0aW9ucy5hc05hdkZvcilmb3IoO2U8aS5zbGlkZUNvdW50OykrK28sZT10K2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCx0Kz1pLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw8PWkub3B0aW9ucy5zbGlkZXNUb1Nob3c/aS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsOmkub3B0aW9ucy5zbGlkZXNUb1Nob3c7ZWxzZSBvPTErTWF0aC5jZWlsKChpLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdykvaS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKTtyZXR1cm4gby0xfSxlLnByb3RvdHlwZS5nZXRMZWZ0PWZ1bmN0aW9uKGkpe3ZhciBlLHQsbyxzLG49dGhpcyxyPTA7cmV0dXJuIG4uc2xpZGVPZmZzZXQ9MCx0PW4uJHNsaWRlcy5maXJzdCgpLm91dGVySGVpZ2h0KCEwKSwhMD09PW4ub3B0aW9ucy5pbmZpbml0ZT8obi5zbGlkZUNvdW50Pm4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVXaWR0aCpuLm9wdGlvbnMuc2xpZGVzVG9TaG93Ki0xLHM9LTEsITA9PT1uLm9wdGlvbnMudmVydGljYWwmJiEwPT09bi5vcHRpb25zLmNlbn
21167Rlck1vZGUmJigyPT09bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9zPS0xLjU6MT09PW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cmJihzPS0yKSkscj10Km4ub3B0aW9ucy5zbGlkZXNUb1Nob3cqcyksbi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCE9MCYmaStuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw+bi5zbGlkZUNvdW50JiZuLnNsaWRlQ291bnQ+bi5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGk+bi5zbGlkZUNvdW50PyhuLnNsaWRlT2Zmc2V0PShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKm4uc2xpZGVXaWR0aCotMSxyPShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LShpLW4uc2xpZGVDb3VudCkpKnQqLTEpOihuLnNsaWRlT2Zmc2V0PW4uc2xpZGVDb3VudCVuLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwqbi5zbGlkZVdpZHRoKi0xLHI9bi5zbGlkZUNvdW50JW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCp0Ki0xKSkpOmkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdz5uLnNsaWRlQ291bnQmJihuLnNsaWRlT2Zmc2V0PShpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3ctbi5zbGlkZUNvdW50KSpuLnNsaWRlV2lkdGgscj0oaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93LW4uc2xpZGVDb3VudCkqdCksbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYobi5zbGlkZU9mZnNldD0wLHI9MCksITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmbi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P24uc2xpZGVPZmZzZXQ9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdykvMi1uLnNsaWRlV2lkdGgqbi5zbGlkZUNvdW50LzI6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmITA9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi5zbGlkZU9mZnNldCs9bi5zbGlkZVdpZHRoKk1hdGguZmxvb3Iobi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKS1uLnNsaWRlV2lkdGg6ITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZSYmKG4uc2xpZGVPZmZzZXQ9MCxuLnNsaWRlT2Zmc2V0Kz1uLnNsaWRlV2lkdGgqTWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpKSxlPSExPT09bi5vcHRpb25zLnZlcnRpY2FsP2kqbi5zbGlkZVdpZHRoKi0xK24uc2xpZGVPZmZzZXQ6aSp0Ki0xK3IsITA9PT1uLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmKG89bi5zbGlkZUNvdW50PD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93fHwhMT09PW4ub3B0aW9ucy5pbmZpbml0ZT9uLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkpOm4uJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikuZXEoaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLCEwPT09bi5vcHRpb25zLmNlbnRlck1vZGUmJihvPW4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvd3x8ITE9PT1uLm9wdGlvbnMuaW5maW5pdGU/bi4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5lcShpKTpuLiRzbGlkZVRyYWNrLmNoaWxkcmVuKFwiLnNsaWNrLXNsaWRlXCIpLmVxKGkrbi5vcHRpb25zLnNsaWRlc1RvU2hvdysxKSxlPSEwPT09bi5vcHRpb25zLnJ0bD9vWzBdPy0xKihuLiRzbGlkZVRyYWNrLndpZHRoKCktb1swXS5vZmZzZXRMZWZ0LW8ud2lkdGgoKSk6MDpvWzBdPy0xKm9bMF0ub2Zmc2V0TGVmdDowLGUrPShuLiRsaXN0LndpZHRoKCktby5vdXRlcldpZHRoKCkpLzIpKSxlfSxlLnByb3RvdHlwZS5nZXRPcHRpb249ZS5wcm90b3R5cGUuc2xpY2tHZXRPcHRpb249ZnVuY3Rpb24oaSl7cmV0dXJuIHRoaXMub3B0aW9uc1tpXX0sZS5wcm90b3R5cGUuZ2V0TmF2aWdhYmxlSW5kZXhlcz1mdW5jdGlvbigpe3ZhciBpLGU9dGhpcyx0PTAsbz0wLHM9W107Zm9yKCExPT09ZS5vcHRpb25zLmluZmluaXRlP2k9ZS5zbGlkZUNvdW50Oih0PS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxvPS0xKmUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCxpPTIqZS5zbGlkZUNvdW50KTt0PGk7KXMucHVzaCh0KSx0PW8rZS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsLG8rPWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbDw9ZS5vcHRpb25zLnNsaWRlc1RvU2hvdz9lLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6ZS5vcHRpb25zLnNsaWRlc1RvU2hvdztyZXR1cm4gc30sZS5wcm90b3R5cGUuZ2V0U2xpY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuZ2V0U2xpZGVDb3VudD1mdW5jdGlvbigpe3ZhciBlLHQsbz10aGlzO3JldHVybiB0PSEwPT09by5vcHRpb25zLmNlbnRlck1vZGU/by5zbGlkZVdpZHRoKk1hdGguZmxvb3Ioby5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKTowLCEwPT09by5vcHRpb25zLnN3aXBlVG9TbGlkZT8oby4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLmVhY2goZnVuY3Rpb24ocyxuKXtpZihuLm9mZnNldExlZnQtdCtpKG4pLm91dGVyV2lkdGgoKS8yPi0xKm8uc3dpcGVMZWZ0KXJldHVybiBlPW4sITF9KSxNYXRoLmFicyhpKGUpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIpLW8uY3VycmVudFNsaWRlKXx8MSk6by5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsfSxlLnByb3RvdHlwZS5nb1RvPWUucHJvdG90eXBlLnNsaWNrR29Ubz1mdW5jdGlvbihpLGUpe3RoaXMuY2hhbmdlU2xpZGUoe2R
21167hdGE6e21lc3NhZ2U6XCJpbmRleFwiLGluZGV4OnBhcnNlSW50KGkpfX0sZSl9LGUucHJvdG90eXBlLmluaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztpKHQuJHNsaWRlcikuaGFzQ2xhc3MoXCJzbGljay1pbml0aWFsaXplZFwiKXx8KGkodC4kc2xpZGVyKS5hZGRDbGFzcyhcInNsaWNrLWluaXRpYWxpemVkXCIpLHQuYnVpbGRSb3dzKCksdC5idWlsZE91dCgpLHQuc2V0UHJvcHMoKSx0LnN0YXJ0TG9hZCgpLHQubG9hZFNsaWRlcigpLHQuaW5pdGlhbGl6ZUV2ZW50cygpLHQudXBkYXRlQXJyb3dzKCksdC51cGRhdGVEb3RzKCksdC5jaGVja1Jlc3BvbnNpdmUoITApLHQuZm9jdXNIYW5kbGVyKCkpLGUmJnQuJHNsaWRlci50cmlnZ2VyKFwiaW5pdFwiLFt0XSksITA9PT10Lm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmdC5pbml0QURBKCksdC5vcHRpb25zLmF1dG9wbGF5JiYodC5wYXVzZWQ9ITEsdC5hdXRvUGxheSgpKX0sZS5wcm90b3R5cGUuaW5pdEFEQT1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1NYXRoLmNlaWwoZS5zbGlkZUNvdW50L2Uub3B0aW9ucy5zbGlkZXNUb1Nob3cpLG89ZS5nZXROYXZpZ2FibGVJbmRleGVzKCkuZmlsdGVyKGZ1bmN0aW9uKGkpe3JldHVybiBpPj0wJiZpPGUuc2xpZGVDb3VudH0pO2UuJHNsaWRlcy5hZGQoZS4kc2xpZGVUcmFjay5maW5kKFwiLnNsaWNrLWNsb25lZFwiKSkuYXR0cih7XCJhcmlhLWhpZGRlblwiOlwidHJ1ZVwiLHRhYmluZGV4OlwiLTFcIn0pLmZpbmQoXCJhLCBpbnB1dCwgYnV0dG9uLCBzZWxlY3RcIikuYXR0cih7dGFiaW5kZXg6XCItMVwifSksbnVsbCE9PWUuJGRvdHMmJihlLiRzbGlkZXMubm90KGUuJHNsaWRlVHJhY2suZmluZChcIi5zbGljay1jbG9uZWRcIikpLmVhY2goZnVuY3Rpb24odCl7dmFyIHM9by5pbmRleE9mKHQpO2kodGhpcykuYXR0cih7cm9sZTpcInRhYnBhbmVsXCIsaWQ6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrdCx0YWJpbmRleDotMX0pLC0xIT09cyYmaSh0aGlzKS5hdHRyKHtcImFyaWEtZGVzY3JpYmVkYnlcIjpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3N9KX0pLGUuJGRvdHMuYXR0cihcInJvbGVcIixcInRhYmxpc3RcIikuZmluZChcImxpXCIpLmVhY2goZnVuY3Rpb24ocyl7dmFyIG49b1tzXTtpKHRoaXMpLmF0dHIoe3JvbGU6XCJwcmVzZW50YXRpb25cIn0pLGkodGhpcykuZmluZChcImJ1dHRvblwiKS5maXJzdCgpLmF0dHIoe3JvbGU6XCJ0YWJcIixpZDpcInNsaWNrLXNsaWRlLWNvbnRyb2xcIitlLmluc3RhbmNlVWlkK3MsXCJhcmlhLWNvbnRyb2xzXCI6XCJzbGljay1zbGlkZVwiK2UuaW5zdGFuY2VVaWQrbixcImFyaWEtbGFiZWxcIjpzKzErXCIgb2YgXCIrdCxcImFyaWEtc2VsZWN0ZWRcIjpudWxsLHRhYmluZGV4OlwiLTFcIn0pfSkuZXEoZS5jdXJyZW50U2xpZGUpLmZpbmQoXCJidXR0b25cIikuYXR0cih7XCJhcmlhLXNlbGVjdGVkXCI6XCJ0cnVlXCIsdGFiaW5kZXg6XCIwXCJ9KS5lbmQoKSk7Zm9yKHZhciBzPWUuY3VycmVudFNsaWRlLG49cytlLm9wdGlvbnMuc2xpZGVzVG9TaG93O3M8bjtzKyspZS4kc2xpZGVzLmVxKHMpLmF0dHIoXCJ0YWJpbmRleFwiLDApO2UuYWN0aXZhdGVBREEoKX0sZS5wcm90b3R5cGUuaW5pdEFycm93RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93Lm9mZihcImNsaWNrLnNsaWNrXCIpLm9uKFwiY2xpY2suc2xpY2tcIix7bWVzc2FnZTpcInByZXZpb3VzXCJ9LGkuY2hhbmdlU2xpZGUpLGkuJG5leHRBcnJvdy5vZmYoXCJjbGljay5zbGlja1wiKS5vbihcImNsaWNrLnNsaWNrXCIse21lc3NhZ2U6XCJuZXh0XCJ9LGkuY2hhbmdlU2xpZGUpLCEwPT09aS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJihpLiRwcmV2QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSxpLiRuZXh0QXJyb3cub24oXCJrZXlkb3duLnNsaWNrXCIsaS5rZXlIYW5kbGVyKSkpfSxlLnByb3RvdHlwZS5pbml0RG90RXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczshMD09PWUub3B0aW9ucy5kb3RzJiYoaShcImxpXCIsZS4kZG90cykub24oXCJjbGljay5zbGlja1wiLHttZXNzYWdlOlwiaW5kZXhcIn0sZS5jaGFuZ2VTbGlkZSksITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS4kZG90cy5vbihcImtleWRvd24uc2xpY2tcIixlLmtleUhhbmRsZXIpKSwhMD09PWUub3B0aW9ucy5kb3RzJiYhMD09PWUub3B0aW9ucy5wYXVzZU9uRG90c0hvdmVyJiZpKFwibGlcIixlLiRkb3RzKS5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKS5vbihcIm1vdXNlbGVhdmUuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITEpKX0sZS5wcm90b3R5cGUuaW5pdFNsaWRlRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztlLm9wdGlvbnMucGF1c2VPbkhvdmVyJiYoZS4kbGlzdC5vbihcIm1vdXNlZW50ZXIuc2xpY2tcIixpLnByb3h5KGUuaW50ZXJydXB0LGUsITApKSxlLiRsaXN0Lm9uKFwibW91c2VsZWF2ZS5zbGlja1wiLGkucHJveHkoZS5pbnRlcnJ1cHQsZSwhMSkpKX0sZS5wcm90b3R5cGUuaW5pdGlhbGl6ZUV2ZW50cz1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5pbml0QXJyb3dFdmVudHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmluaXRTbGlkZUV2ZW50cygpLGUuJGxpc3Qub24oXCJ0b3VjaHN0YXJ0LnNsaWNrIG1vdXNlZG93bi5zbGlja1wiLHthY3Rpb246XCJzdGFydFwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNobW92ZS5zbGljayBtb3VzZW1vdmUuc2xpY2tcIix7YWN0aW9uOlwibW92ZVwifSxlLnN3aXBlSGFuZGxlciksZS4kbGlzdC5vbihcInRvdWNoZW5kLnNsaWNrIG1vdXNldXAuc2xpY2tcIix7YWN0aW9uOlwiZW5kXCJ9LGUuc3dpcGVIYW5kbGVyKSxlLiRsaXN0Lm9uKFwidG91Y2hjYW5jZWwuc2xpY2sgbW91c2VsZWF2ZS5zbGlja1wiLHthY3Rpb246XCJlbmRcIn0sZS5zd2lwZUhhbmRsZXIpLGUuJGxpc3Qub24oXCJjbGljay5zbGlja1wiLGUuY2xpY2tIYW5kbGVyKSxpKGRvY3VtZW50KS5vbihlLnZpc2liaWxpdHlDaGFuZ2UsaS5wcm94eShlLnZpc2liaWxpdHksZSkpLCEwPT09ZS5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJmUuJGxpc3Qub24oXCJrZXlkb3duLnNsaWNrXCIsZS5rZXlIYW5kbGVyKSwhMD09PWUub3B0aW9ucy5mb2N1c09uU2VsZWN0JiZpKGUuJHNsaWRlVHJhY2spLmN
21167oaWxkcmVuKCkub24oXCJjbGljay5zbGlja1wiLGUuc2VsZWN0SGFuZGxlciksaSh3aW5kb3cpLm9uKFwib3JpZW50YXRpb25jaGFuZ2Uuc2xpY2suc2xpY2stXCIrZS5pbnN0YW5jZVVpZCxpLnByb3h5KGUub3JpZW50YXRpb25DaGFuZ2UsZSkpLGkod2luZG93KS5vbihcInJlc2l6ZS5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGkucHJveHkoZS5yZXNpemUsZSkpLGkoXCJbZHJhZ2dhYmxlIT10cnVlXVwiLGUuJHNsaWRlVHJhY2spLm9uKFwiZHJhZ3N0YXJ0XCIsZS5wcmV2ZW50RGVmYXVsdCksaSh3aW5kb3cpLm9uKFwibG9hZC5zbGljay5zbGljay1cIitlLmluc3RhbmNlVWlkLGUuc2V0UG9zaXRpb24pLGkoZS5zZXRQb3NpdGlvbil9LGUucHJvdG90eXBlLmluaXRVST1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmKGkuJHByZXZBcnJvdy5zaG93KCksaS4kbmV4dEFycm93LnNob3coKSksITA9PT1pLm9wdGlvbnMuZG90cyYmaS5zbGlkZUNvdW50Pmkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJmkuJGRvdHMuc2hvdygpfSxlLnByb3RvdHlwZS5rZXlIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aS50YXJnZXQudGFnTmFtZS5tYXRjaChcIlRFWFRBUkVBfElOUFVUfFNFTEVDVFwiKXx8KDM3PT09aS5rZXlDb2RlJiYhMD09PWUub3B0aW9ucy5hY2Nlc3NpYmlsaXR5P2UuY2hhbmdlU2xpZGUoe2RhdGE6e21lc3NhZ2U6ITA9PT1lLm9wdGlvbnMucnRsP1wibmV4dFwiOlwicHJldmlvdXNcIn19KTozOT09PWkua2V5Q29kZSYmITA9PT1lLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSYmZS5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTohMD09PWUub3B0aW9ucy5ydGw/XCJwcmV2aW91c1wiOlwibmV4dFwifX0pKX0sZS5wcm90b3R5cGUubGF6eUxvYWQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKGUpe2koXCJpbWdbZGF0YS1sYXp5XVwiLGUpLmVhY2goZnVuY3Rpb24oKXt2YXIgZT1pKHRoaXMpLHQ9aSh0aGlzKS5hdHRyKFwiZGF0YS1sYXp5XCIpLG89aSh0aGlzKS5hdHRyKFwiZGF0YS1zcmNzZXRcIikscz1pKHRoaXMpLmF0dHIoXCJkYXRhLXNpemVzXCIpfHxuLiRzbGlkZXIuYXR0cihcImRhdGEtc2l6ZXNcIikscj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpO3Iub25sb2FkPWZ1bmN0aW9uKCl7ZS5hbmltYXRlKHtvcGFjaXR5OjB9LDEwMCxmdW5jdGlvbigpe28mJihlLmF0dHIoXCJzcmNzZXRcIixvKSxzJiZlLmF0dHIoXCJzaXplc1wiLHMpKSxlLmF0dHIoXCJzcmNcIix0KS5hbmltYXRlKHtvcGFjaXR5OjF9LDIwMCxmdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0pLG4uJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtuLGUsdF0pfSl9LHIub25lcnJvcj1mdW5jdGlvbigpe2UucmVtb3ZlQXR0cihcImRhdGEtbGF6eVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWxvYWRpbmdcIikuYWRkQ2xhc3MoXCJzbGljay1sYXp5bG9hZC1lcnJvclwiKSxuLiRzbGlkZXIudHJpZ2dlcihcImxhenlMb2FkRXJyb3JcIixbbixlLHRdKX0sci5zcmM9dH0pfXZhciB0LG8scyxuPXRoaXM7aWYoITA9PT1uLm9wdGlvbnMuY2VudGVyTW9kZT8hMD09PW4ub3B0aW9ucy5pbmZpbml0ZT9zPShvPW4uY3VycmVudFNsaWRlKyhuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpK24ub3B0aW9ucy5zbGlkZXNUb1Nob3crMjoobz1NYXRoLm1heCgwLG4uY3VycmVudFNsaWRlLShuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIrMSkpLHM9bi5vcHRpb25zLnNsaWRlc1RvU2hvdy8yKzErMituLmN1cnJlbnRTbGlkZSk6KG89bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3crbi5jdXJyZW50U2xpZGU6bi5jdXJyZW50U2xpZGUscz1NYXRoLmNlaWwobytuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSwhMD09PW4ub3B0aW9ucy5mYWRlJiYobz4wJiZvLS0sczw9bi5zbGlkZUNvdW50JiZzKyspKSx0PW4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpLnNsaWNlKG8scyksXCJhbnRpY2lwYXRlZFwiPT09bi5vcHRpb25zLmxhenlMb2FkKWZvcih2YXIgcj1vLTEsbD1zLGQ9bi4kc2xpZGVyLmZpbmQoXCIuc2xpY2stc2xpZGVcIiksYT0wO2E8bi5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsO2ErKylyPDAmJihyPW4uc2xpZGVDb3VudC0xKSx0PSh0PXQuYWRkKGQuZXEocikpKS5hZGQoZC5lcShsKSksci0tLGwrKztlKHQpLG4uc2xpZGVDb3VudDw9bi5vcHRpb25zLnNsaWRlc1RvU2hvdz9lKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLXNsaWRlXCIpKTpuLmN1cnJlbnRTbGlkZT49bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/ZShuLiRzbGlkZXIuZmluZChcIi5zbGljay1jbG9uZWRcIikuc2xpY2UoMCxuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSk6MD09PW4uY3VycmVudFNsaWRlJiZlKG4uJHNsaWRlci5maW5kKFwiLnNsaWNrLWNsb25lZFwiKS5zbGljZSgtMSpuLm9wdGlvbnMuc2xpZGVzVG9TaG93KSl9LGUucHJvdG90eXBlLmxvYWRTbGlkZXI9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuc2V0UG9zaXRpb24oKSxpLiRzbGlkZVRyYWNrLmNzcyh7b3BhY2l0eToxfSksaS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSxpLmluaXRVSSgpLFwicHJvZ3Jlc3NpdmVcIj09PWkub3B0aW9ucy5sYXp5TG9hZCYmaS5wcm9ncmVzc2l2ZUxhenlMb2FkKCl9LGUucHJvdG90eXBlLm5leHQ9ZS5wcm90b3R5cGUuc2xpY2tOZXh0PWZ1bmN0aW9uKCl7dGhpcy5jaGFuZ2VTbGlkZSh7ZGF0YTp7bWVzc2FnZTpcIm5leHRcIn19KX0sZS5wcm90b3R5cGUub3JpZW50YXRpb25DaGFuZ2U9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuY2hlY2tSZXNwb25zaXZlKCksaS5zZXRQb3NpdGlvbigpfSxlLnByb3RvdHlwZS5wYXVzZT1lLnByb3RvdHlwZS5zbGlja1BhdXNlPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLmF1dG9QbGF5Q2xlYXIoKSxpLnBhdXNlZD0hMH0sZS5wcm90b3R5cGUucGxheT1lLnByb3RvdHlwZS5zbGlja1BsYXk9ZnVuY3Rpb24oKXt2YXIgaT10aGlzO2kuYXV0b1BsYXkoKSxpLm9wdGlvbnMuYXV0b3BsYXk9ITAsaS5wYXVzZWQ9ITEsaS5mb2N1c3NlZD0hMSxpLmludGVycnVwdGVkPSExfSxlLnByb3RvdHlwZS5wb3N0U2xpZGU9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0LnVuc2xpY2tlZHx8KHQuJHNsaWRlci50cmlnZ2VyKFwiYWZ0ZXJDaGFuZ2VcIixbdCxlXSksdC5hbmltYXRpbmc9ITEsdC5zbGlkZUNvdW50PnQub3B0aW9ucy5zbGlkZXNUb1Nob3cmJnQuc2V0UG9zaXRpb24oKSx0LnN3aXBlTGVmdD1udWxsLHQub3B0aW9ucy5hdXRvcGxheSYmdC5hdXRvUGxheSgpLCEwPT09dC5vcHRpb25zLmFjY2Vzc2liaWxpdHkmJih0LmluaXRBREEoKSx0Lm9wdGlvbnMuZm9jdXNPbkNoYW5nZSYmaSh0LiRzbGlkZXMuZ2V0KHQuY3VycmVudFNsaWRlKSkuYXR0cihcInRhYmluZGV4XCIsMCkuZm9jdXMoKSkpfSxlLnByb3RvdHlwZS5wcmV2PWUucHJvdG90eXBlLnNsaWNrUHJldj1mdW5jdGlvbigpe3RoaXMuY2hhbmdlU2xpZGUoe2R
21167hdGE6e21lc3NhZ2U6XCJwcmV2aW91c1wifX0pfSxlLnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbihpKXtpLnByZXZlbnREZWZhdWx0KCl9LGUucHJvdG90eXBlLnByb2dyZXNzaXZlTGF6eUxvYWQ9ZnVuY3Rpb24oZSl7ZT1lfHwxO3ZhciB0LG8scyxuLHIsbD10aGlzLGQ9aShcImltZ1tkYXRhLWxhenldXCIsbC4kc2xpZGVyKTtkLmxlbmd0aD8odD1kLmZpcnN0KCksbz10LmF0dHIoXCJkYXRhLWxhenlcIikscz10LmF0dHIoXCJkYXRhLXNyY3NldFwiKSxuPXQuYXR0cihcImRhdGEtc2l6ZXNcIil8fGwuJHNsaWRlci5hdHRyKFwiZGF0YS1zaXplc1wiKSwocj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW1nXCIpKS5vbmxvYWQ9ZnVuY3Rpb24oKXtzJiYodC5hdHRyKFwic3Jjc2V0XCIscyksbiYmdC5hdHRyKFwic2l6ZXNcIixuKSksdC5hdHRyKFwic3JjXCIsbykucmVtb3ZlQXR0cihcImRhdGEtbGF6eSBkYXRhLXNyY3NldCBkYXRhLXNpemVzXCIpLnJlbW92ZUNsYXNzKFwic2xpY2stbG9hZGluZ1wiKSwhMD09PWwub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCYmbC5zZXRQb3NpdGlvbigpLGwuJHNsaWRlci50cmlnZ2VyKFwibGF6eUxvYWRlZFwiLFtsLHQsb10pLGwucHJvZ3Jlc3NpdmVMYXp5TG9hZCgpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtlPDM/c2V0VGltZW91dChmdW5jdGlvbigpe2wucHJvZ3Jlc3NpdmVMYXp5TG9hZChlKzEpfSw1MDApOih0LnJlbW92ZUF0dHIoXCJkYXRhLWxhenlcIikucmVtb3ZlQ2xhc3MoXCJzbGljay1sb2FkaW5nXCIpLmFkZENsYXNzKFwic2xpY2stbGF6eWxvYWQtZXJyb3JcIiksbC4kc2xpZGVyLnRyaWdnZXIoXCJsYXp5TG9hZEVycm9yXCIsW2wsdCxvXSksbC5wcm9ncmVzc2l2ZUxhenlMb2FkKCkpfSxyLnNyYz1vKTpsLiRzbGlkZXIudHJpZ2dlcihcImFsbEltYWdlc0xvYWRlZFwiLFtsXSl9LGUucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oZSl7dmFyIHQsbyxzPXRoaXM7bz1zLnNsaWRlQ291bnQtcy5vcHRpb25zLnNsaWRlc1RvU2hvdywhcy5vcHRpb25zLmluZmluaXRlJiZzLmN1cnJlbnRTbGlkZT5vJiYocy5jdXJyZW50U2xpZGU9bykscy5zbGlkZUNvdW50PD1zLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYocy5jdXJyZW50U2xpZGU9MCksdD1zLmN1cnJlbnRTbGlkZSxzLmRlc3Ryb3koITApLGkuZXh0ZW5kKHMscy5pbml0aWFscyx7Y3VycmVudFNsaWRlOnR9KSxzLmluaXQoKSxlfHxzLmNoYW5nZVNsaWRlKHtkYXRhOnttZXNzYWdlOlwiaW5kZXhcIixpbmRleDp0fX0sITEpfSxlLnByb3RvdHlwZS5yZWdpc3RlckJyZWFrcG9pbnRzPWZ1bmN0aW9uKCl7dmFyIGUsdCxvLHM9dGhpcyxuPXMub3B0aW9ucy5yZXNwb25zaXZlfHxudWxsO2lmKFwiYXJyYXlcIj09PWkudHlwZShuKSYmbi5sZW5ndGgpe3MucmVzcG9uZFRvPXMub3B0aW9ucy5yZXNwb25kVG98fFwid2luZG93XCI7Zm9yKGUgaW4gbilpZihvPXMuYnJlYWtwb2ludHMubGVuZ3RoLTEsbi5oYXNPd25Qcm9wZXJ0eShlKSl7Zm9yKHQ9bltlXS5icmVha3BvaW50O28+PTA7KXMuYnJlYWtwb2ludHNbb10mJnMuYnJlYWtwb2ludHNbb109PT10JiZzLmJyZWFrcG9pbnRzLnNwbGljZShvLDEpLG8tLTtzLmJyZWFrcG9pbnRzLnB1c2godCkscy5icmVha3BvaW50U2V0dGluZ3NbdF09bltlXS5zZXR0aW5nc31zLmJyZWFrcG9pbnRzLnNvcnQoZnVuY3Rpb24oaSxlKXtyZXR1cm4gcy5vcHRpb25zLm1vYmlsZUZpcnN0P2ktZTplLWl9KX19LGUucHJvdG90eXBlLnJlaW5pdD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS4kc2xpZGVzPWUuJHNsaWRlVHJhY2suY2hpbGRyZW4oZS5vcHRpb25zLnNsaWRlKS5hZGRDbGFzcyhcInNsaWNrLXNsaWRlXCIpLGUuc2xpZGVDb3VudD1lLiRzbGlkZXMubGVuZ3RoLGUuY3VycmVudFNsaWRlPj1lLnNsaWRlQ291bnQmJjAhPT1lLmN1cnJlbnRTbGlkZSYmKGUuY3VycmVudFNsaWRlPWUuY3VycmVudFNsaWRlLWUub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCksZS5zbGlkZUNvdW50PD1lLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoZS5jdXJyZW50U2xpZGU9MCksZS5yZWdpc3RlckJyZWFrcG9pbnRzKCksZS5zZXRQcm9wcygpLGUuc2V0dXBJbmZpbml0ZSgpLGUuYnVpbGRBcnJvd3MoKSxlLnVwZGF0ZUFycm93cygpLGUuaW5pdEFycm93RXZlbnRzKCksZS5idWlsZERvdHMoKSxlLnVwZGF0ZURvdHMoKSxlLmluaXREb3RFdmVudHMoKSxlLmNsZWFuVXBTbGlkZUV2ZW50cygpLGUuaW5pdFNsaWRlRXZlbnRzKCksZS5jaGVja1Jlc3BvbnNpdmUoITEsITApLCEwPT09ZS5vcHRpb25zLmZvY3VzT25TZWxlY3QmJmkoZS4kc2xpZGVUcmFjaykuY2hpbGRyZW4oKS5vbihcImNsaWNrLnNsaWNrXCIsZS5zZWxlY3RIYW5kbGVyKSxlLnNldFNsaWRlQ2xhc3NlcyhcIm51bWJlclwiPT10eXBlb2YgZS5jdXJyZW50U2xpZGU/ZS5jdXJyZW50U2xpZGU6MCksZS5zZXRQb3NpdGlvbigpLGUuZm9jdXNIYW5kbGVyKCksZS5wYXVzZWQ9IWUub3B0aW9ucy5hdXRvcGxheSxlLmF1dG9QbGF5KCksZS4kc2xpZGVyLnRyaWdnZXIoXCJyZUluaXRcIixbZV0pfSxlLnByb3RvdHlwZS5yZXNpemU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2kod2luZG93KS53aWR0aCgpIT09ZS53aW5kb3dXaWR0aCYmKGNsZWFyVGltZW91dChlLndpbmRvd0RlbGF5KSxlLndpbmRvd0RlbGF5PXdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS53aW5kb3dXaWR0aD1pKHdpbmRvdykud2lkdGgoKSxlLmNoZWNrUmVzcG9uc2l2ZSgpLGUudW5zbGlja2VkfHxlLnNldFBvc2l0aW9uKCl9LDUwKSl9LGUucHJvdG90eXBlLnJlbW92ZVNsaWRlPWUucHJvdG90eXBlLnNsaWNrUmVtb3ZlPWZ1bmN0aW9uKGksZSx0KXt2YXIgbz10aGlzO2lmKGk9XCJib29sZWFuXCI9PXR5cGVvZiBpPyEwPT09KGU9aSk/MDpvLnNsaWRlQ291bnQtMTohMD09PWU/LS1pOmksby5zbGlkZUNvdW50PDF8fGk8MHx8aT5vLnNsaWRlQ291bnQtMSlyZXR1cm4hMTtvLnVubG9hZCgpLCEwPT09dD9vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKCkucmVtb3ZlKCk6by4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmVxKGkpLnJlbW92ZSgpLG8uJHNsaWRlcz1vLiRzbGlkZVRyYWNrLmNoaWxkcmVuKHRoaXMub3B0aW9ucy5zbGlkZSksby4kc2xpZGVUcmFjay5jaGlsZHJlbih0aGlzLm9wdGlvbnMuc2xpZGUpLmRldGFjaCgpLG8uJHNsaWRlVHJhY2suYXBwZW5kKG8uJHNsaWRlcyksby4kc2xpZGVzQ2FjaGU9by4kc2xpZGVzLG8ucmVpbml0KCl9LGUucHJvdG90eXBlLnNldENTUz1mdW5jdGlvbihpKXt2YXIgZSx0LG89dGhpcyxzPXt9OyEwPT09by5vcHRpb25zLnJ0bCYmKGk9LWkpLGU9XCJsZWZ0XCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIix0PVwidG9wXCI9PW8ucG9zaXRpb25Qcm9wP01hdGguY2VpbChpKStcInB4XCI6XCIwcHhcIixzW28ucG9zaXRpb25Qcm9wXT1pLCExPT09by50cmFuc2Zvcm1zRW5hYmxlZD9vLiRzbGlkZVRyYWNrLmNzcyhzKToocz17fSwhMT09PW8uY3NzVHJhbnNpdGlvbnM/KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUoXCIrZStcIiwgXCIrdCtcIilcIixvLiRzbGlkZVRyYWNrLmNzcyhzKSk6KHNbby5hbmltVHlwZV09XCJ0cmFuc2xhdGUzZChcIitlK1wiLCBcIit0K1wiLCAwcHgpXCIsby4kc2xpZGVUcmFjay5jc3MocykpKX0sZS5wcm90b3R5cGUuc2V0RGltZW5zaW9ucz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7ITE9PT1pLm9wdGlvbnMudmVydGljYWw/ITA9PT1pLm9wdGlvbnMuY2VudGVyTW9kZSYmaS4kbGlzdC5jc3Moe3BhZGRpbmc6XCIwcHggXCIraS5vcHRpb25zLmNlbn
21167RlclBhZGRpbmd9KTooaS4kbGlzdC5oZWlnaHQoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkub3B0aW9ucy5zbGlkZXNUb1Nob3cpLCEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJmkuJGxpc3QuY3NzKHtwYWRkaW5nOmkub3B0aW9ucy5jZW50ZXJQYWRkaW5nK1wiIDBweFwifSkpLGkubGlzdFdpZHRoPWkuJGxpc3Qud2lkdGgoKSxpLmxpc3RIZWlnaHQ9aS4kbGlzdC5oZWlnaHQoKSwhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCYmITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD8oaS5zbGlkZVdpZHRoPU1hdGguY2VpbChpLmxpc3RXaWR0aC9pLm9wdGlvbnMuc2xpZGVzVG9TaG93KSxpLiRzbGlkZVRyYWNrLndpZHRoKE1hdGguY2VpbChpLnNsaWRlV2lkdGgqaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS5sZW5ndGgpKSk6ITA9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aD9pLiRzbGlkZVRyYWNrLndpZHRoKDVlMyppLnNsaWRlQ291bnQpOihpLnNsaWRlV2lkdGg9TWF0aC5jZWlsKGkubGlzdFdpZHRoKSxpLiRzbGlkZVRyYWNrLmhlaWdodChNYXRoLmNlaWwoaS4kc2xpZGVzLmZpcnN0KCkub3V0ZXJIZWlnaHQoITApKmkuJHNsaWRlVHJhY2suY2hpbGRyZW4oXCIuc2xpY2stc2xpZGVcIikubGVuZ3RoKSkpO3ZhciBlPWkuJHNsaWRlcy5maXJzdCgpLm91dGVyV2lkdGgoITApLWkuJHNsaWRlcy5maXJzdCgpLndpZHRoKCk7ITE9PT1pLm9wdGlvbnMudmFyaWFibGVXaWR0aCYmaS4kc2xpZGVUcmFjay5jaGlsZHJlbihcIi5zbGljay1zbGlkZVwiKS53aWR0aChpLnNsaWRlV2lkdGgtZSl9LGUucHJvdG90eXBlLnNldEZhZGU9ZnVuY3Rpb24oKXt2YXIgZSx0PXRoaXM7dC4kc2xpZGVzLmVhY2goZnVuY3Rpb24obyxzKXtlPXQuc2xpZGVXaWR0aCpvKi0xLCEwPT09dC5vcHRpb25zLnJ0bD9pKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLHJpZ2h0OmUsdG9wOjAsekluZGV4OnQub3B0aW9ucy56SW5kZXgtMixvcGFjaXR5OjB9KTppKHMpLmNzcyh7cG9zaXRpb246XCJyZWxhdGl2ZVwiLGxlZnQ6ZSx0b3A6MCx6SW5kZXg6dC5vcHRpb25zLnpJbmRleC0yLG9wYWNpdHk6MH0pfSksdC4kc2xpZGVzLmVxKHQuY3VycmVudFNsaWRlKS5jc3Moe3pJbmRleDp0Lm9wdGlvbnMuekluZGV4LTEsb3BhY2l0eToxfSl9LGUucHJvdG90eXBlLnNldEhlaWdodD1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aWYoMT09PWkub3B0aW9ucy5zbGlkZXNUb1Nob3cmJiEwPT09aS5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0JiYhMT09PWkub3B0aW9ucy52ZXJ0aWNhbCl7dmFyIGU9aS4kc2xpZGVzLmVxKGkuY3VycmVudFNsaWRlKS5vdXRlckhlaWdodCghMCk7aS4kbGlzdC5jc3MoXCJoZWlnaHRcIixlKX19LGUucHJvdG90eXBlLnNldE9wdGlvbj1lLnByb3RvdHlwZS5zbGlja1NldE9wdGlvbj1mdW5jdGlvbigpe3ZhciBlLHQsbyxzLG4scj10aGlzLGw9ITE7aWYoXCJvYmplY3RcIj09PWkudHlwZShhcmd1bWVudHNbMF0pPyhvPWFyZ3VtZW50c1swXSxsPWFyZ3VtZW50c1sxXSxuPVwibXVsdGlwbGVcIik6XCJzdHJpbmdcIj09PWkudHlwZShhcmd1bWVudHNbMF0pJiYobz1hcmd1bWVudHNbMF0scz1hcmd1bWVudHNbMV0sbD1hcmd1bWVudHNbMl0sXCJyZXNwb25zaXZlXCI9PT1hcmd1bWVudHNbMF0mJlwiYXJyYXlcIj09PWkudHlwZShhcmd1bWVudHNbMV0pP249XCJyZXNwb25zaXZlXCI6dm9pZCAwIT09YXJndW1lbnRzWzFdJiYobj1cInNpbmdsZVwiKSksXCJzaW5nbGVcIj09PW4pci5vcHRpb25zW29dPXM7ZWxzZSBpZihcIm11bHRpcGxlXCI9PT1uKWkuZWFjaChvLGZ1bmN0aW9uKGksZSl7ci5vcHRpb25zW2ldPWV9KTtlbHNlIGlmKFwicmVzcG9uc2l2ZVwiPT09bilmb3IodCBpbiBzKWlmKFwiYXJyYXlcIiE9PWkudHlwZShyLm9wdGlvbnMucmVzcG9uc2l2ZSkpci5vcHRpb25zLnJlc3BvbnNpdmU9W3NbdF1dO2Vsc2V7Zm9yKGU9ci5vcHRpb25zLnJlc3BvbnNpdmUubGVuZ3RoLTE7ZT49MDspci5vcHRpb25zLnJlc3BvbnNpdmVbZV0uYnJlYWtwb2ludD09PXNbdF0uYnJlYWtwb2ludCYmci5vcHRpb25zLnJlc3BvbnNpdmUuc3BsaWNlKGUsMSksZS0tO3Iub3B0aW9ucy5yZXNwb25zaXZlLnB1c2goc1t0XSl9bCYmKHIudW5sb2FkKCksci5yZWluaXQoKSl9LGUucHJvdG90eXBlLnNldFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztpLnNldERpbWVuc2lvbnMoKSxpLnNldEhlaWdodCgpLCExPT09aS5vcHRpb25zLmZhZGU/aS5zZXRDU1MoaS5nZXRMZWZ0KGkuY3VycmVudFNsaWRlKSk6aS5zZXRGYWRlKCksaS4kc2xpZGVyLnRyaWdnZXIoXCJzZXRQb3NpdGlvblwiLFtpXSl9LGUucHJvdG90eXBlLnNldFByb3BzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcyxlPWRvY3VtZW50LmJvZHkuc3R5bGU7aS5wb3NpdGlvblByb3A9ITA9PT1pLm9wdGlvbnMudmVydGljYWw/XCJ0b3BcIjpcImxlZnRcIixcInRvcFwiPT09aS5wb3NpdGlvblByb3A/aS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stdmVydGljYWxcIik6aS4kc2xpZGVyLnJlbW92ZUNsYXNzKFwic2xpY2stdmVydGljYWxcIiksdm9pZCAwPT09ZS5XZWJraXRUcmFuc2l0aW9uJiZ2b2lkIDA9PT1lLk1velRyYW5zaXRpb24mJnZvaWQgMD09PWUubXNUcmFuc2l0aW9ufHwhMD09PWkub3B0aW9ucy51c2VDU1MmJihpLmNzc1RyYW5zaXRpb25zPSEwKSxpLm9wdGlvbnMuZmFkZSYmKFwibnVtYmVyXCI9PXR5cGVvZiBpLm9wdGlvbnMuekluZGV4P2kub3B0aW9ucy56SW5kZXg8MyYmKGkub3B0aW9ucy56SW5kZXg9Myk6aS5vcHRpb25zLnpJbmRleD1pLmRlZmF1bHRzLnpJbmRleCksdm9pZCAwIT09ZS5PVHJhbnNmb3JtJiYoaS5hbmltVHlwZT1cIk9UcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItby10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiT1RyYW5zaXRpb25cIix2b2lkIDA9PT1lLnBlcnNwZWN0aXZlUHJvcGVydHkmJnZvaWQgMD09PWUud2Via2l0UGVyc3BlY3RpdmUmJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS5Nb3pUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwiTW96VHJhbnNmb3JtXCIsaS50cmFuc2Zvcm1UeXBlPVwiLW1vei10cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwiTW96VHJhbnNpdGlvblwiLHZvaWQgMD09PWUucGVyc3BlY3RpdmVQcm9wZXJ0eSYmdm9pZCAwPT09ZS5Nb3pQZXJzcGVjdGl2ZSYmKGkuYW5pbVR5cGU9ITEpKSx2b2lkIDAhPT1lLndlYmtpdFRyYW5zZm9ybSYmKGkuYW5pbVR5cGU9XCJ3ZWJraXRUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItd2Via2l0LXRyYW5zZm9ybVwiLGkudHJhbnNpdGlvblR5cGU9XCJ3ZWJraXRUcmFuc2l0aW9uXCIsdm9pZCAwPT09ZS5wZXJzcGVjdGl2ZVByb3BlcnR5JiZ2b2lkIDA9PT1lLndlYmtpdFBlcnNwZWN0aXZlJiYoaS5hbmltVHlwZT0hMSkpLHZvaWQgMCE9PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPVwibXNUcmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCItbXMtdHJhbnNmb3JtXCIsaS50cmFuc2l0aW9uVHlwZT1cIm1zVHJhbnNpdGlvblwiLHZvaWQgMD09PWUubXNUcmFuc2Zvcm0mJihpLmFuaW1UeXBlPSExKSksdm9pZCAwIT09ZS50cmFuc2Zvcm0mJiExIT09aS5hbmltVHlwZSYmKGkuYW5pbVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zZm9ybVR5cGU9XCJ0cmFuc2Zvcm1cIixpLnRyYW5zaXRpb25UeXBlPVwidHJhbnNpdGlvblwiKSxpLnRyYW5zZm9ybXNFbmFibGVkPWkub3B0aW9ucy51c2VUcmFuc2Zvcm0mJm51bGwhPT1pLmFuaW1UeXBlJiYhMSE9PWkuYW5pbVR5cGV9LGUucHJvdG90eXBlLnNldFNsaWRlQ2xhc3Nlcz1mdW5jdGlvbihpKXt2YXIgZSx0LG8scyxuPXRoaXM7aWYodD1uLiRzbGlkZXIuZmluZChcIi5zbGljay1zbGlkZVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZSBzbGljay1jZW50ZXIgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIiksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY3VycmVudFwiKSwhMD09PW4ub3B0aW9ucy5jZW50ZXJNb2RlKXt2YXIgcj1uLm9wdGlvbnMuc2xpZGVzVG9TaG93JTI9PTA/MTowO2U9TWF0aC5mbG9vcihuLm9wdGlvbnMuc2xpZGVzVG9TaG93LzIpLCEwPT09bi5vcHRpb25zLmluZmluaXRlJiYoaT49ZSYmaTw9bi5zbGlkZUNvdW50LTEtZT9uLiRzbGlkZXMuc2xpY2UoaS1lK3IsaStlKzEpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIik6KG89bi5vcHRpb25zLnNsaWRlc1RvU2hvdytpLHQuc2xpY2Uoby1lKzErcixvK2UrMikuYWRk
21167Q2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSksMD09PWk/dC5lcSh0Lmxlbmd0aC0xLW4ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpOmk9PT1uLnNsaWRlQ291bnQtMSYmdC5lcShuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWNlbnRlclwiKSksbi4kc2xpZGVzLmVxKGkpLmFkZENsYXNzKFwic2xpY2stY2VudGVyXCIpfWVsc2UgaT49MCYmaTw9bi5zbGlkZUNvdW50LW4ub3B0aW9ucy5zbGlkZXNUb1Nob3c/bi4kc2xpZGVzLnNsaWNlKGksaStuLm9wdGlvbnMuc2xpZGVzVG9TaG93KS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQubGVuZ3RoPD1uLm9wdGlvbnMuc2xpZGVzVG9TaG93P3QuYWRkQ2xhc3MoXCJzbGljay1hY3RpdmVcIikuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKToocz1uLnNsaWRlQ291bnQlbi5vcHRpb25zLnNsaWRlc1RvU2hvdyxvPSEwPT09bi5vcHRpb25zLmluZmluaXRlP24ub3B0aW9ucy5zbGlkZXNUb1Nob3craTppLG4ub3B0aW9ucy5zbGlkZXNUb1Nob3c9PW4ub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCYmbi5zbGlkZUNvdW50LWk8bi5vcHRpb25zLnNsaWRlc1RvU2hvdz90LnNsaWNlKG8tKG4ub3B0aW9ucy5zbGlkZXNUb1Nob3ctcyksbytzKS5hZGRDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpOnQuc2xpY2UobyxvK24ub3B0aW9ucy5zbGlkZXNUb1Nob3cpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwiZmFsc2VcIikpO1wib25kZW1hbmRcIiE9PW4ub3B0aW9ucy5sYXp5TG9hZCYmXCJhbnRpY2lwYXRlZFwiIT09bi5vcHRpb25zLmxhenlMb2FkfHxuLmxhenlMb2FkKCl9LGUucHJvdG90eXBlLnNldHVwSW5maW5pdGU9ZnVuY3Rpb24oKXt2YXIgZSx0LG8scz10aGlzO2lmKCEwPT09cy5vcHRpb25zLmZhZGUmJihzLm9wdGlvbnMuY2VudGVyTW9kZT0hMSksITA9PT1zLm9wdGlvbnMuaW5maW5pdGUmJiExPT09cy5vcHRpb25zLmZhZGUmJih0PW51bGwscy5zbGlkZUNvdW50PnMub3B0aW9ucy5zbGlkZXNUb1Nob3cpKXtmb3Iobz0hMD09PXMub3B0aW9ucy5jZW50ZXJNb2RlP3Mub3B0aW9ucy5zbGlkZXNUb1Nob3crMTpzLm9wdGlvbnMuc2xpZGVzVG9TaG93LGU9cy5zbGlkZUNvdW50O2U+cy5zbGlkZUNvdW50LW87ZS09MSl0PWUtMSxpKHMuJHNsaWRlc1t0XSkuY2xvbmUoITApLmF0dHIoXCJpZFwiLFwiXCIpLmF0dHIoXCJkYXRhLXNsaWNrLWluZGV4XCIsdC1zLnNsaWRlQ291bnQpLnByZXBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtmb3IoZT0wO2U8bytzLnNsaWRlQ291bnQ7ZSs9MSl0PWUsaShzLiRzbGlkZXNbdF0pLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKS5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiLHQrcy5zbGlkZUNvdW50KS5hcHBlbmRUbyhzLiRzbGlkZVRyYWNrKS5hZGRDbGFzcyhcInNsaWNrLWNsb25lZFwiKTtzLiRzbGlkZVRyYWNrLmZpbmQoXCIuc2xpY2stY2xvbmVkXCIpLmZpbmQoXCJbaWRdXCIpLmVhY2goZnVuY3Rpb24oKXtpKHRoaXMpLmF0dHIoXCJpZFwiLFwiXCIpfSl9fSxlLnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24oaSl7dmFyIGU9dGhpcztpfHxlLmF1dG9QbGF5KCksZS5pbnRlcnJ1cHRlZD1pfSxlLnByb3RvdHlwZS5zZWxlY3RIYW5kbGVyPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbz1pKGUudGFyZ2V0KS5pcyhcIi5zbGljay1zbGlkZVwiKT9pKGUudGFyZ2V0KTppKGUudGFyZ2V0KS5wYXJlbnRzKFwiLnNsaWNrLXNsaWRlXCIpLHM9cGFyc2VJbnQoby5hdHRyKFwiZGF0YS1zbGljay1pbmRleFwiKSk7c3x8KHM9MCksdC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93P3Quc2xpZGVIYW5kbGVyKHMsITEsITApOnQuc2xpZGVIYW5kbGVyKHMpfSxlLnByb3RvdHlwZS5zbGlkZUhhbmRsZXI9ZnVuY3Rpb24oaSxlLHQpe3ZhciBvLHMsbixyLGwsZD1udWxsLGE9dGhpcztpZihlPWV8fCExLCEoITA9PT1hLmFuaW1hdGluZyYmITA9PT1hLm9wdGlvbnMud2FpdEZvckFuaW1hdGV8fCEwPT09YS5vcHRpb25zLmZhZGUmJmEuY3VycmVudFNsaWRlPT09aSkpaWYoITE9PT1lJiZhLmFzTmF2Rm9yKGkpLG89aSxkPWEuZ2V0TGVmdChvKSxyPWEuZ2V0TGVmdChhLmN1cnJlbnRTbGlkZSksYS5jdXJyZW50TGVmdD1udWxsPT09YS5zd2lwZUxlZnQ/cjphLnN3aXBlTGVmdCwhMT09PWEub3B0aW9ucy5pbmZpbml0ZSYmITE9PT1hLm9wdGlvbnMuY2VudGVyTW9kZSYmKGk8MHx8aT5hLmdldERvdENvdW50KCkqYS5vcHRpb25zLnNsaWRlc1RvU2Nyb2xsKSkhMT09PWEub3B0aW9ucy5mYWRlJiYobz1hLmN1cnJlbnRTbGlkZSwhMCE9PXQ/YS5hbmltYXRlU2xpZGUocixmdW5jdGlvbigpe2EucG9zdFNsaWRlKG8pfSk6YS5wb3N0U2xpZGUobykpO2Vsc2UgaWYoITE9PT1hLm9wdGlvbnMuaW5maW5pdGUmJiEwPT09YS5vcHRpb25zLmNlbnRlck1vZGUmJihpPDB8fGk+YS5zbGlkZUNvdW50LWEub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpITE9PT1hLm9wdGlvbnMuZmFkZSYmKG89YS5jdXJyZW50U2xpZGUsITAhPT10P2EuYW5pbWF0ZVNsaWRlKHIsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShvKX0pOmEucG9zdFNsaWRlKG8pKTtlbHNle2lmKGEub3B0aW9ucy5hdXRvcGxheSYmY2xlYXJJbnRlcnZhbChhLmF1dG9QbGF5VGltZXIpLHM9bzwwP2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/YS5zbGlkZUNvdW50LWEuc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGw6YS5zbGlkZUNvdW50K286bz49YS5zbGlkZUNvdW50P2Euc2xpZGVDb3VudCVhLm9wdGlvbnMuc2xpZGVzVG9TY3JvbGwhPTA/MDpvLWEuc2xpZGVDb3VudDpvLGEuYW5pbWF0aW5nPSEwLGEuJHNsaWRlci50cmlnZ2VyKFwiYmVmb3JlQ2hhbmdlXCIsW2EsYS5jdXJyZW50U2xpZGUsc10pLG49YS5jdXJyZW50U2xpZGUsYS5jdXJyZW50U2xpZGU9cyxhLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS5vcHRpb25zLmFzTmF2Rm9yJiYobD0obD1hLmdldE5hdlRhcmdldCgpKS5zbGljayhcImdldFNsaWNrXCIpKS5zbGlkZUNvdW50PD1sLm9wdGlvbnMuc2xpZGVzVG9TaG93JiZsLnNldFNsaWRlQ2xhc3NlcyhhLmN1cnJlbnRTbGlkZSksYS51cGRhdGVEb3RzKCksYS51cGRhdGVBcnJvd3MoKSwhMD09PWEub3B0aW9ucy5mYWRlKXJldHVybiEwIT09dD8oYS5mYWRlU2xpZGVPdXQobiksYS5mYWRlU2xpZGUocyxmdW5jdGlvbigpe2EucG9zdFNsaWRlKHMpfSkpOmEucG9zdFNsaWRlKHMpLHZvaWQgYS5hbmltYXRlSGVpZ2h0KCk7ITAhPT10P2EuYW5pbWF0ZVNsaWRlKGQsZnVuY3Rpb24oKXthLnBvc3RTbGlkZShzKX0pOmEucG9zdFNsaWRlKHMpfX0sZS5wcm90b3R5cGUuc3RhcnRMb2FkPWZ1bmN0aW9uKCl7dmFyIGk9dGhpczshMD09PWkub3B0aW9ucy5hcnJvd3MmJmkuc2xpZGVDb3VudD5pLm9wdGlvbnMuc2xpZGVzVG9TaG93JiYoaS4kcHJldkFycm93LmhpZGUoKSxpLiRuZXh0QXJyb3cuaGl
21167kZSgpKSwhMD09PWkub3B0aW9ucy5kb3RzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmaS4kZG90cy5oaWRlKCksaS4kc2xpZGVyLmFkZENsYXNzKFwic2xpY2stbG9hZGluZ1wiKX0sZS5wcm90b3R5cGUuc3dpcGVEaXJlY3Rpb249ZnVuY3Rpb24oKXt2YXIgaSxlLHQsbyxzPXRoaXM7cmV0dXJuIGk9cy50b3VjaE9iamVjdC5zdGFydFgtcy50b3VjaE9iamVjdC5jdXJYLGU9cy50b3VjaE9iamVjdC5zdGFydFktcy50b3VjaE9iamVjdC5jdXJZLHQ9TWF0aC5hdGFuMihlLGkpLChvPU1hdGgucm91bmQoMTgwKnQvTWF0aC5QSSkpPDAmJihvPTM2MC1NYXRoLmFicyhvKSksbzw9NDUmJm8+PTA/ITE9PT1zLm9wdGlvbnMucnRsP1wibGVmdFwiOlwicmlnaHRcIjpvPD0zNjAmJm8+PTMxNT8hMT09PXMub3B0aW9ucy5ydGw/XCJsZWZ0XCI6XCJyaWdodFwiOm8+PTEzNSYmbzw9MjI1PyExPT09cy5vcHRpb25zLnJ0bD9cInJpZ2h0XCI6XCJsZWZ0XCI6ITA9PT1zLm9wdGlvbnMudmVydGljYWxTd2lwaW5nP28+PTM1JiZvPD0xMzU/XCJkb3duXCI6XCJ1cFwiOlwidmVydGljYWxcIn0sZS5wcm90b3R5cGUuc3dpcGVFbmQ9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvPXRoaXM7aWYoby5kcmFnZ2luZz0hMSxvLnN3aXBpbmc9ITEsby5zY3JvbGxpbmcpcmV0dXJuIG8uc2Nyb2xsaW5nPSExLCExO2lmKG8uaW50ZXJydXB0ZWQ9ITEsby5zaG91bGRDbGljaz0hKG8udG91Y2hPYmplY3Quc3dpcGVMZW5ndGg+MTApLHZvaWQgMD09PW8udG91Y2hPYmplY3QuY3VyWClyZXR1cm4hMTtpZighMD09PW8udG91Y2hPYmplY3QuZWRnZUhpdCYmby4kc2xpZGVyLnRyaWdnZXIoXCJlZGdlXCIsW28sby5zd2lwZURpcmVjdGlvbigpXSksby50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD49by50b3VjaE9iamVjdC5taW5Td2lwZSl7c3dpdGNoKHQ9by5zd2lwZURpcmVjdGlvbigpKXtjYXNlXCJsZWZ0XCI6Y2FzZVwiZG93blwiOmU9by5vcHRpb25zLnN3aXBlVG9TbGlkZT9vLmNoZWNrTmF2aWdhYmxlKG8uY3VycmVudFNsaWRlK28uZ2V0U2xpZGVDb3VudCgpKTpvLmN1cnJlbnRTbGlkZStvLmdldFNsaWRlQ291bnQoKSxvLmN1cnJlbnREaXJlY3Rpb249MDticmVhaztjYXNlXCJyaWdodFwiOmNhc2VcInVwXCI6ZT1vLm9wdGlvbnMuc3dpcGVUb1NsaWRlP28uY2hlY2tOYXZpZ2FibGUoby5jdXJyZW50U2xpZGUtby5nZXRTbGlkZUNvdW50KCkpOm8uY3VycmVudFNsaWRlLW8uZ2V0U2xpZGVDb3VudCgpLG8uY3VycmVudERpcmVjdGlvbj0xfVwidmVydGljYWxcIiE9dCYmKG8uc2xpZGVIYW5kbGVyKGUpLG8udG91Y2hPYmplY3Q9e30sby4kc2xpZGVyLnRyaWdnZXIoXCJzd2lwZVwiLFtvLHRdKSl9ZWxzZSBvLnRvdWNoT2JqZWN0LnN0YXJ0WCE9PW8udG91Y2hPYmplY3QuY3VyWCYmKG8uc2xpZGVIYW5kbGVyKG8uY3VycmVudFNsaWRlKSxvLnRvdWNoT2JqZWN0PXt9KX0sZS5wcm90b3R5cGUuc3dpcGVIYW5kbGVyPWZ1bmN0aW9uKGkpe3ZhciBlPXRoaXM7aWYoISghMT09PWUub3B0aW9ucy5zd2lwZXx8XCJvbnRvdWNoZW5kXCJpbiBkb2N1bWVudCYmITE9PT1lLm9wdGlvbnMuc3dpcGV8fCExPT09ZS5vcHRpb25zLmRyYWdnYWJsZSYmLTEhPT1pLnR5cGUuaW5kZXhPZihcIm1vdXNlXCIpKSlzd2l0Y2goZS50b3VjaE9iamVjdC5maW5nZXJDb3VudD1pLm9yaWdpbmFsRXZlbnQmJnZvaWQgMCE9PWkub3JpZ2luYWxFdmVudC50b3VjaGVzP2kub3JpZ2luYWxFdmVudC50b3VjaGVzLmxlbmd0aDoxLGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0V2lkdGgvZS5vcHRpb25zLnRvdWNoVGhyZXNob2xkLCEwPT09ZS5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGUudG91Y2hPYmplY3QubWluU3dpcGU9ZS5saXN0SGVpZ2h0L2Uub3B0aW9ucy50b3VjaFRocmVzaG9sZCksaS5kYXRhLmFjdGlvbil7Y2FzZVwic3RhcnRcIjplLnN3aXBlU3RhcnQoaSk7YnJlYWs7Y2FzZVwibW92ZVwiOmUuc3dpcGVNb3ZlKGkpO2JyZWFrO2Nhc2VcImVuZFwiOmUuc3dpcGVFbmQoaSl9fSxlLnByb3RvdHlwZS5zd2lwZU1vdmU9ZnVuY3Rpb24oaSl7dmFyIGUsdCxvLHMsbixyLGw9dGhpcztyZXR1cm4gbj12b2lkIDAhPT1pLm9yaWdpbmFsRXZlbnQ/aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXM6bnVsbCwhKCFsLmRyYWdnaW5nfHxsLnNjcm9sbGluZ3x8biYmMSE9PW4ubGVuZ3RoKSYmKGU9bC5nZXRMZWZ0KGwuY3VycmVudFNsaWRlKSxsLnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09bj9uWzBdLnBhZ2VYOmkuY2xpZW50WCxsLnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09bj9uWzBdLnBhZ2VZOmkuY2xpZW50WSxsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPU1hdGgucm91bmQoTWF0aC5zcXJ0KE1hdGgucG93KGwudG91Y2hPYmplY3QuY3VyWC1sLnRvdWNoT2JqZWN0LnN0YXJ0WCwyKSkpLHI9TWF0aC5yb3VuZChNYXRoLnNxcnQoTWF0aC5wb3cobC50b3VjaE9iamVjdC5jdXJZLWwudG91Y2hPYmplY3Quc3RhcnRZLDIpKSksIWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJiFsLnN3aXBpbmcmJnI+ND8obC5zY3JvbGxpbmc9ITAsITEpOighMD09PWwub3B0aW9ucy52ZXJ0aWNhbFN3aXBpbmcmJihsLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoPXIpLHQ9bC5zd2lwZURpcmVjdGlvbigpLHZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmbC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aD40JiYobC5zd2lwaW5nPSEwLGkucHJldmVudERlZmF1bHQoKSkscz0oITE9PT1sLm9wdGlvbnMucnRsPzE6LTEpKihsLnRvdWNoT2JqZWN0LmN1clg+bC50b3VjaE9iamVjdC5zdGFydFg/MTotMSksITA9PT1sLm9wdGlvbnMudmVydGljYWxTd2lwaW5nJiYocz1sLnRvdWNoT2JqZWN0LmN1clk+bC50b3VjaE9iamVjdC5zdGFydFk/MTotMSksbz1sLnRvdWNoT2JqZWN0LnN3aXBlTGVuZ3RoLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMSwhMT09PWwub3B0aW9ucy5pbmZpbml0ZSYmKDA9PT1sLmN1cnJlbnRTbGlkZSYmXCJyaWdodFwiPT09dHx8bC5jdXJyZW50U2xpZGU+PWwuZ2V0RG90Q291bnQoKSYmXCJsZWZ0XCI9PT10KSYmKG89bC50b3VjaE9iamVjdC5zd2lwZUxlbmd0aCpsLm9wdGlvbnMuZWRnZUZyaWN0aW9uLGwudG91Y2hPYmplY3QuZWRnZUhpdD0hMCksITE9PT1sLm9wdGlvbnMudmVydGljYWw/bC5zd2lwZUxlZnQ9ZStvKnM6bC5zd2lwZUxlZnQ9ZStvKihsLiRsaXN0LmhlaWdodCgpL2wubGlzdFdpZHRoKSpzLCEwPT09bC5vcHRpb25zLnZlcnRpY2FsU3dpcGluZyYmKGwuc3dpcGVMZWZ0PWUrbypzKSwhMCE9PWwub3B0aW9ucy5mYWRlJiYhMSE9PWwub3B0aW9ucy50b3VjaE1vdmUmJighMD09PWwuYW5pbWF0aW5nPyhsLnN3aXBlTGVmdD1udWxsLCExKTp2b2lkIGwuc2V0Q1NTKGwuc3dpcGVMZWZ0KSkpKX0sZS5wcm90b3R5cGUuc3dpcGVTdGFydD1mdW5jdGlvbihpKXt2YXIgZSx0PXRoaXM7aWYodC5pbnRlcnJ1cHRlZD0hMCwxIT09dC50b3VjaE9iamVjdC5maW5nZXJDb3VudHx8dC5zbGlkZUNvdW50PD10Lm9wdGlvbnMuc2xpZGVzVG9TaG93KXJldHVybi
21167B0LnRvdWNoT2JqZWN0PXt9LCExO3ZvaWQgMCE9PWkub3JpZ2luYWxFdmVudCYmdm9pZCAwIT09aS5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihlPWkub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSx0LnRvdWNoT2JqZWN0LnN0YXJ0WD10LnRvdWNoT2JqZWN0LmN1clg9dm9pZCAwIT09ZT9lLnBhZ2VYOmkuY2xpZW50WCx0LnRvdWNoT2JqZWN0LnN0YXJ0WT10LnRvdWNoT2JqZWN0LmN1clk9dm9pZCAwIT09ZT9lLnBhZ2VZOmkuY2xpZW50WSx0LmRyYWdnaW5nPSEwfSxlLnByb3RvdHlwZS51bmZpbHRlclNsaWRlcz1lLnByb3RvdHlwZS5zbGlja1VuZmlsdGVyPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztudWxsIT09aS4kc2xpZGVzQ2FjaGUmJihpLnVubG9hZCgpLGkuJHNsaWRlVHJhY2suY2hpbGRyZW4odGhpcy5vcHRpb25zLnNsaWRlKS5kZXRhY2goKSxpLiRzbGlkZXNDYWNoZS5hcHBlbmRUbyhpLiRzbGlkZVRyYWNrKSxpLnJlaW5pdCgpKX0sZS5wcm90b3R5cGUudW5sb2FkPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpKFwiLnNsaWNrLWNsb25lZFwiLGUuJHNsaWRlcikucmVtb3ZlKCksZS4kZG90cyYmZS4kZG90cy5yZW1vdmUoKSxlLiRwcmV2QXJyb3cmJmUuaHRtbEV4cHIudGVzdChlLm9wdGlvbnMucHJldkFycm93KSYmZS4kcHJldkFycm93LnJlbW92ZSgpLGUuJG5leHRBcnJvdyYmZS5odG1sRXhwci50ZXN0KGUub3B0aW9ucy5uZXh0QXJyb3cpJiZlLiRuZXh0QXJyb3cucmVtb3ZlKCksZS4kc2xpZGVzLnJlbW92ZUNsYXNzKFwic2xpY2stc2xpZGUgc2xpY2stYWN0aXZlIHNsaWNrLXZpc2libGUgc2xpY2stY3VycmVudFwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIikuY3NzKFwid2lkdGhcIixcIlwiKX0sZS5wcm90b3R5cGUudW5zbGljaz1mdW5jdGlvbihpKXt2YXIgZT10aGlzO2UuJHNsaWRlci50cmlnZ2VyKFwidW5zbGlja1wiLFtlLGldKSxlLmRlc3Ryb3koKX0sZS5wcm90b3R5cGUudXBkYXRlQXJyb3dzPWZ1bmN0aW9uKCl7dmFyIGk9dGhpcztNYXRoLmZsb29yKGkub3B0aW9ucy5zbGlkZXNUb1Nob3cvMiksITA9PT1pLm9wdGlvbnMuYXJyb3dzJiZpLnNsaWRlQ291bnQ+aS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmIWkub3B0aW9ucy5pbmZpbml0ZSYmKGkuJHByZXZBcnJvdy5yZW1vdmVDbGFzcyhcInNsaWNrLWRpc2FibGVkXCIpLmF0dHIoXCJhcmlhLWRpc2FibGVkXCIsXCJmYWxzZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIiksMD09PWkuY3VycmVudFNsaWRlPyhpLiRwcmV2QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRuZXh0QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpOmkuY3VycmVudFNsaWRlPj1pLnNsaWRlQ291bnQtaS5vcHRpb25zLnNsaWRlc1RvU2hvdyYmITE9PT1pLm9wdGlvbnMuY2VudGVyTW9kZT8oaS4kbmV4dEFycm93LmFkZENsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcInRydWVcIiksaS4kcHJldkFycm93LnJlbW92ZUNsYXNzKFwic2xpY2stZGlzYWJsZWRcIikuYXR0cihcImFyaWEtZGlzYWJsZWRcIixcImZhbHNlXCIpKTppLmN1cnJlbnRTbGlkZT49aS5zbGlkZUNvdW50LTEmJiEwPT09aS5vcHRpb25zLmNlbnRlck1vZGUmJihpLiRuZXh0QXJyb3cuYWRkQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwidHJ1ZVwiKSxpLiRwcmV2QXJyb3cucmVtb3ZlQ2xhc3MoXCJzbGljay1kaXNhYmxlZFwiKS5hdHRyKFwiYXJpYS1kaXNhYmxlZFwiLFwiZmFsc2VcIikpKX0sZS5wcm90b3R5cGUudXBkYXRlRG90cz1mdW5jdGlvbigpe3ZhciBpPXRoaXM7bnVsbCE9PWkuJGRvdHMmJihpLiRkb3RzLmZpbmQoXCJsaVwiKS5yZW1vdmVDbGFzcyhcInNsaWNrLWFjdGl2ZVwiKS5lbmQoKSxpLiRkb3RzLmZpbmQoXCJsaVwiKS5lcShNYXRoLmZsb29yKGkuY3VycmVudFNsaWRlL2kub3B0aW9ucy5zbGlkZXNUb1Njcm9sbCkpLmFkZENsYXNzKFwic2xpY2stYWN0aXZlXCIpKX0sZS5wcm90b3R5cGUudmlzaWJpbGl0eT1mdW5jdGlvbigpe3ZhciBpPXRoaXM7aS5vcHRpb25zLmF1dG9wbGF5JiYoZG9jdW1lbnRbaS5oaWRkZW5dP2kuaW50ZXJydXB0ZWQ9ITA6aS5pbnRlcnJ1cHRlZD0hMSl9LGkuZm4uc2xpY2s9ZnVuY3Rpb24oKXt2YXIgaSx0LG89dGhpcyxzPWFyZ3VtZW50c1swXSxuPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxyPW8ubGVuZ3RoO2ZvcihpPTA7aTxyO2krKylpZihcIm9iamVjdFwiPT10eXBlb2Ygc3x8dm9pZCAwPT09cz9vW2ldLnNsaWNrPW5ldyBlKG9baV0scyk6dD1vW2ldLnNsaWNrW3NdLmFwcGx5KG9baV0uc2xpY2ssbiksdm9pZCAwIT09dClyZXR1cm4gdDtyZXR1cm4gb319KTtcbiIsIi8qKlxuICogdmlzLmpzXG4gKiBodHRwczovL2dpdGh1Yi5jb20vYWxtZW5kZS92aXNcbiAqXG4gKiBBIGR5bmFtaWMsIGJyb3dzZXItYmFzZWQgdmlzdWFsaXphdGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB2ZXJzaW9uIDQuMjAuMS1TTkFQU0hPVFxuICogQGRhdGUgICAgMjAxNy0xMC0xMlxuICpcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgKEMpIDIwMTEtMjAxNyBBbG1lbmRlIEIuViwgaHR0cDovL2FsbWVuZGUuY29tXG4gKlxuICogVmlzLmpzIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgYm90aFxuICpcbiAqICogVGhlIEFwYWNoZSAyLjAgTGljZW5zZVxuICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBhbmRcbiAqXG4gKiAqIFRoZSBNSVQgTGljZW5zZVxuICogICBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogVmlzLmpzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBlaXRoZXIgbGljZW5zZS5cbiAqL1xuXCJ1c2Ugc3RyaWN0XCI7IWZ1bmN0aW9uKHQsZSl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9ZSgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoW10sZSk6XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy52aXM9ZSgpOnQudmlzPWUoKX0odGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG8pe2lmKGlbb10pcmV0dXJuIGlbb10uZXhwb3J0czt2YXIgbj1pW29dPXtpOm8sbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gdFtvXS5jYWxsKG4uZXhwb3J0cyxuLG4uZXhwb3J0cyxlKSxuLmw9ITAsbi5leHBvcnRzfXZhciBpPXt9O3JldHVybiBlLm09dCxlLmM9aSxlLmQ9ZnVuY3Rpb24odCxpLG8pe2Uubyh0LGkpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6b30pfSxlLm49ZnVuY3Rpb24odCl7dmFyIGk9dCYmdC5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIHQuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gdH07cmV0dXJuIGUuZChpLFwiYVwiLGkpLGl9LGUubz1mdW5jdGlvbih0LGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxlKX0sZS5wPVwiXCIsZShlLnM9MTIzKX0oW2Z1bmN0aW9uKHQsZSxpKXtlLl9fZXNNb2R1bGU9ITAsZS5kZWZhdWx0PWZ1bmN0aW9uKHQsZSl7aWYoISh0IGluc3RhbmNlb2YgZSkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKX19LGZ1bmN0aW9uKHQsZSxpKXtlLl9fZXNNb2R1bGU9ITA7dmFyIG89aSgxNjkpLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShvKTtlLmRlZmF1bHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5lbnVtZXJhYmxlPW8uZW51bWVyYWJsZXx8ITEsby5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gbyYmKG8ud3JpdGFibGU9ITApLCgwLG4uZGVmYXVsdCkodCxvLmtleSxvKX19cmV0dXJuIGZ1bmN0aW9uKGUsaSxvKXtyZXR1cm4gaSYmdChlLnByb3RvdHlwZSxpKSxvJiZ0KGUsbyksZX19KCl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1mdW5jdGlvbiBuKHQsZSxpLG8pe3ZhciBuPSExOyEwPT09byYmKG49bnVsbD09PWVbaV0mJnZvaWQgMCE9PXRbaV0pLG4/ZGVsZXRlIHRbaV06dFtpXT1lW2ldfXZhciBzPWkoNzcpLHI9byhzKSxhPWkoMjkpLGg9byhhKSxkPWkoOCksbD1vKGQpLHU9aSg2KSxjPW8odSkscD1pKDkpLGY9aSgxNTcpO2UuaXNOdW1iZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBOdW1iZXJ8fFwibnVtYmVyXCI9PXR5cGVvZiB0fSxlLnJlY3Vyc2l2ZURPTURlbGV0ZT1mdW5jdGlvbih0KXtpZih0KWZvcig7ITA9PT10Lmhhc0NoaWxkTm9kZXMoKTspZS5yZWN1cnNpdmVET01EZWxldGUodC5maXJzdENoaWxkKSx0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCl9LGUuZ2l2ZVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKGU9PXQpcmV0dXJuLjU7dmFyIG49MS8oZS10KTtyZXR1cm4gTWF0aC5tYXgoMCwoby10KSpuKX0sZS5pc1N0cmluZz1mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIFN0cmluZ3x8XCJzdHJpbmdcIj09dHlwZW9mIHR9LGUuaXNEYXRlPWZ1bmN0aW9uKHQpe2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiEwO2lmKGUuaXNTdHJpbmcodCkpe2lmKG0uZXhlYyh0KSlyZXR1cm4hMDtpZighaXNOYU4oRGF0ZS5wYXJzZSh0KSkpcmV0dXJuITB9cmV0dXJuITF9LGUucmFuZG9tVVVJRD1mdW5jdGlvbigpe3JldHVybiBmLnY0KCl9LGUuYXNzaWduQWxsS2V5cz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJlwib2JqZWN0XCIhPT0oMCxjLmRlZmF1bHQpKHRbaV0pJiYodFtpXT1lKX0sZS5maWxsSWZEZWZpbmVkPWZ1bmN0aW9uKHQsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtmb3IodmFyIHMgaW4gdCl2b2lkIDAhPT1pW3NdJiYobnVsbD09PWlbc118fFwib2JqZWN0XCIhPT0oMCxjLmRlZmF1bHQpKGlbc10pP24odCxpLHMsbyk6XCJvYmplY3RcIj09PSgwLGMuZGVmYXVsdCkodFtzXSkmJmUuZmlsbElmRGVmaW5lZCh0W3NdLGlbc10sbykpfSxlLmV4dGVuZD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0xO2k8YXJndW1lbnRzLmxlbmd0aDtpKyspe3ZhciBvPWFyZ3VtZW50c1tpXTtmb3IodmFyIG4gaW4gbylvLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1vW25dKX1yZXR1cm4gdH0sZS5zZWxlY3RpdmVFeHRlbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKCFBcnJheS5pc0FycmF
211675KHQpKXRocm93IG5ldyBFcnJvcihcIkFycmF5IHdpdGggcHJvcGVydHkgbmFtZXMgZXhwZWN0ZWQgYXMgZmlyc3QgYXJndW1lbnRcIik7Zm9yKHZhciBvPTI7bzxhcmd1bWVudHMubGVuZ3RoO28rKylmb3IodmFyIG49YXJndW1lbnRzW29dLHM9MDtzPHQubGVuZ3RoO3MrKyl7dmFyIHI9dFtzXTtuJiZuLmhhc093blByb3BlcnR5KHIpJiYoZVtyXT1uW3JdKX1yZXR1cm4gZX0sZS5zZWxlY3RpdmVEZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kXCIpO2Zvcih2YXIgcj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYT10W3JdO2lmKG8uaGFzT3duUHJvcGVydHkoYSkpaWYob1thXSYmb1thXS5jb25zdHJ1Y3Rvcj09PU9iamVjdCl2b2lkIDA9PT1pW2FdJiYoaVthXT17fSksaVthXS5jb25zdHJ1Y3Rvcj09PU9iamVjdD9lLmRlZXBFeHRlbmQoaVthXSxvW2FdLCExLHMpOm4oaSxvLGEscyk7ZWxzZXtpZihBcnJheS5pc0FycmF5KG9bYV0pKXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgZGVlcEV4dGVuZFwiKTtuKGksbyxhLHMpfX1yZXR1cm4gaX0sZS5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSxvKXt2YXIgcz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXSYmYXJndW1lbnRzWzNdO2lmKEFycmF5LmlzQXJyYXkobykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkFycmF5cyBhcmUgbm90IHN1cHBvcnRlZCBieSBkZWVwRXh0ZW5kXCIpO2Zvcih2YXIgciBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkocikmJi0xPT09dC5pbmRleE9mKHIpKWlmKG9bcl0mJm9bcl0uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09aVtyXSYmKGlbcl09e30pLGlbcl0uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKGlbcl0sb1tyXSk6bihpLG8scixzKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkob1tyXSkpe2lbcl09W107Zm9yKHZhciBhPTA7YTxvW3JdLmxlbmd0aDthKyspaVtyXS5wdXNoKG9bcl1bYV0pfWVsc2UgbihpLG8scixzKTtyZXR1cm4gaX0sZS5kZWVwRXh0ZW5kPWZ1bmN0aW9uKHQsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxzPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM107Zm9yKHZhciByIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShyKXx8ITA9PT1vKWlmKGlbcl0mJmlbcl0uY29uc3RydWN0b3I9PT1PYmplY3Qpdm9pZCAwPT09dFtyXSYmKHRbcl09e30pLHRbcl0uY29uc3RydWN0b3I9PT1PYmplY3Q/ZS5kZWVwRXh0ZW5kKHRbcl0saVtyXSxvKTpuKHQsaSxyLHMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShpW3JdKSl7dFtyXT1bXTtmb3IodmFyIGE9MDthPGlbcl0ubGVuZ3RoO2ErKyl0W3JdLnB1c2goaVtyXVthXSl9ZWxzZSBuKHQsaSxyLHMpO3JldHVybiB0fSxlLmVxdWFsQXJyYXk9ZnVuY3Rpb24odCxlKXtpZih0Lmxlbmd0aCE9ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBpPTAsbz10Lmxlbmd0aDtpPG87aSsrKWlmKHRbaV0hPWVbaV0pcmV0dXJuITE7cmV0dXJuITB9LGUuY29udmVydD1mdW5jdGlvbih0LGkpe3ZhciBvO2lmKHZvaWQgMCE9PXQpe2lmKG51bGw9PT10KXJldHVybiBudWxsO2lmKCFpKXJldHVybiB0O2lmKFwic3RyaW5nXCIhPXR5cGVvZiBpJiYhKGkgaW5zdGFuY2VvZiBTdHJpbmcpKXRocm93IG5ldyBFcnJvcihcIlR5cGUgbXVzdCBiZSBhIHN0cmluZ1wiKTtzd2l0Y2goaSl7Y2FzZVwiYm9vbGVhblwiOmNhc2VcIkJvb2xlYW5cIjpyZXR1cm4gQm9vbGVhbih0KTtjYXNlXCJudW1iZXJcIjpjYXNlXCJOdW1iZXJcIjpyZXR1cm4gZS5pc1N0cmluZyh0KSYmIWlzTmFOKERhdGUucGFyc2UodCkpP3AodCkudmFsdWVPZigpOk51bWJlcih0LnZhbHVlT2YoKSk7Y2FzZVwic3RyaW5nXCI6Y2FzZVwiU3RyaW5nXCI6cmV0dXJuIFN0cmluZyh0KTtjYXNlXCJEYXRlXCI6aWYoZS5pc051bWJlcih0KSlyZXR1cm4gbmV3IERhdGUodCk7aWYodCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIG5ldyBEYXRlKHQudmFsdWVPZigpKTtpZihwLmlzTW9tZW50KHQpKXJldHVybiBuZXcgRGF0ZSh0LnZhbHVlT2YoKSk7aWYoZS5pc1N0cmluZyh0KSlyZXR1cm4gbz1tLmV4ZWModCksbz9uZXcgRGF0ZShOdW1iZXIob1sxXSkpOnAobmV3IERhdGUodCkpLnRvRGF0ZSgpO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlIFwiK2UuZ2V0VHlwZSh0KStcIiB0byB0eXBlIERhdGVcIik7Y2FzZVwiTW9tZW50XCI6aWYoZS5pc051bWJlcih0KSlyZXR1cm4gcCh0KTtpZih0IGluc3RhbmNlb2YgRGF0ZSlyZXR1cm4gcCh0LnZhbHVlT2YoKSk7aWYocC5pc01vbWVudCh0KSlyZXR1cm4gcCh0KTtpZihlLmlzU3RyaW5nKHQpKXJldHVybiBvPW0uZXhlYyh0KSxwKG8/TnVtYmVyKG9bMV0pOnQpO3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBjb252ZXJ0IG9iamVjdCBvZiB0eXBlIFwiK2UuZ2V0VHlwZSh0KStcIiB0byB0eXBlIERhdGVcIik7Y2FzZVwiSVNPRGF0ZVwiOmlmKGUuaXNOdW1iZXIodCkpcmV0dXJuIG5ldyBEYXRlKHQpO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybi
21167B0LnRvSVNPU3RyaW5nKCk7aWYocC5pc01vbWVudCh0KSlyZXR1cm4gdC50b0RhdGUoKS50b0lTT1N0cmluZygpO2lmKGUuaXNTdHJpbmcodCkpcmV0dXJuIG89bS5leGVjKHQpLG8/bmV3IERhdGUoTnVtYmVyKG9bMV0pKS50b0lTT1N0cmluZygpOnAodCkuZm9ybWF0KCk7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgXCIrZS5nZXRUeXBlKHQpK1wiIHRvIHR5cGUgSVNPRGF0ZVwiKTtjYXNlXCJBU1BEYXRlXCI6aWYoZS5pc051bWJlcih0KSlyZXR1cm5cIi9EYXRlKFwiK3QrXCIpL1wiO2lmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVyblwiL0RhdGUoXCIrdC52YWx1ZU9mKCkrXCIpL1wiO2lmKGUuaXNTdHJpbmcodCkpe289bS5leGVjKHQpO3JldHVyblwiL0RhdGUoXCIrKG8/bmV3IERhdGUoTnVtYmVyKG9bMV0pKS52YWx1ZU9mKCk6bmV3IERhdGUodCkudmFsdWVPZigpKStcIikvXCJ9dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNvbnZlcnQgb2JqZWN0IG9mIHR5cGUgXCIrZS5nZXRUeXBlKHQpK1wiIHRvIHR5cGUgQVNQRGF0ZVwiKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcignVW5rbm93biB0eXBlIFwiJytpKydcIicpfX19O3ZhciBtPS9eXFwvP0RhdGVcXCgoXFwtP1xcZCspL2k7ZS5nZXRUeXBlPWZ1bmN0aW9uKHQpe3ZhciBlPXZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxjLmRlZmF1bHQpKHQpO3JldHVyblwib2JqZWN0XCI9PWU/bnVsbD09PXQ/XCJudWxsXCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/XCJCb29sZWFuXCI6dCBpbnN0YW5jZW9mIE51bWJlcj9cIk51bWJlclwiOnQgaW5zdGFuY2VvZiBTdHJpbmc/XCJTdHJpbmdcIjpBcnJheS5pc0FycmF5KHQpP1wiQXJyYXlcIjp0IGluc3RhbmNlb2YgRGF0ZT9cIkRhdGVcIjpcIk9iamVjdFwiOlwibnVtYmVyXCI9PWU/XCJOdW1iZXJcIjpcImJvb2xlYW5cIj09ZT9cIkJvb2xlYW5cIjpcInN0cmluZ1wiPT1lP1wiU3RyaW5nXCI6dm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOmV9LGUuY29weUFuZEV4dGVuZEFycmF5PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPVtdLG89MDtvPHQubGVuZ3RoO28rKylpLnB1c2godFtvXSk7cmV0dXJuIGkucHVzaChlKSxpfSxlLmNvcHlBcnJheT1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0W2ldKTtyZXR1cm4gZX0sZS5nZXRBYnNvbHV0ZUxlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZS5nZXRBYnNvbHV0ZVJpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0fSxlLmdldEFic29sdXRlVG9wPWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZS5hZGRDbGFzc05hbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT10LmNsYXNzTmFtZS5zcGxpdChcIiBcIiksbz1lLnNwbGl0KFwiIFwiKTtpPWkuY29uY2F0KG8uZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBpLmluZGV4T2YodCk8MH0pKSx0LmNsYXNzTmFtZT1pLmpvaW4oXCIgXCIpfSxlLnJlbW92ZUNsYXNzTmFtZT1mdW5jdGlvbih0LGUpe3ZhciBpPXQuY2xhc3NOYW1lLnNwbGl0KFwiIFwiKSxvPWUuc3BsaXQoXCIgXCIpO2k9aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIG8uaW5kZXhPZih0KTwwfSksdC5jbGFzc05hbWU9aS5qb2luKFwiIFwiKX0sZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIGksbztpZihBcnJheS5pc0FycmF5KHQpKWZvcihpPTAsbz10Lmxlbmd0aDtpPG87aSsrKWUodFtpXSxpLHQpO2Vsc2UgZm9yKGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZlKHRbaV0saSx0KX0sZS50b0FycmF5PWZ1bmN0aW9uKHQpe3ZhciBlPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJmUucHVzaCh0W2ldKTtyZXR1cm4gZX0sZS51cGRhdGVQcm9wZXJ0eT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHRbZV0hPT1pJiYodFtlXT1pLCEwKX0sZS50aHJvdHRsZT1mdW5jdGlvbih0KXt2YXIgZT0hMTtyZXR1cm4gZnVuY3Rpb24oKXtlfHwoZT0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXtlPSExLHQoKX0pKX19LGUuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbih0LGUsaSxvKXt0LmFkZEV2ZW50TGlzdGVuZXI/KHZvaWQgMD09PW8mJihvPSExKSxcIm1vdXNld2hlZWxcIj09PWUmJm5hdmlnYXRvci51c2VyQWdlbnQuaW5kZXhPZihcIkZpcmVmb3hcIik+PTAmJihlPVwiRE9NTW91c2VTY3JvbGxcIiksdC5hZGRFdmVudExpc3RlbmVyKGUsaSxvKSk6dC5hdHRhY2hFdmVudChcIm9uXCIrZSxpKX0sZS5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSxpLG8pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcj8odm9pZCAwPT09byYmKG89ITEpLFwibW91c2V3aGVlbFwiPT09ZSYmbmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKFwiRmlyZWZveFwiKT49MCYmKGU9XCJET01Nb3VzZVNjcm9sbFwiKSx0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxpLG8pKTp0LmRldGFjaEV2ZW50KFwib25cIitlLGkpfSxlLnByZXZlbnREZWZhdWx0PWZ1bmN0aW9uKHQpe3R8fCh0PXdpbmRvdy5ldmVudCksdC5wcmV2ZW50RGVmYXVsdD90LnByZXZlbnREZWZhdWx0KCk6dC5yZXR1cm5WYWx1ZT0hMX0sZS5nZXRUYXJnZXQ9ZnVuY3Rpb24odCl7dHx8KHQ9d2luZG93LmV2ZW50KTt2YXIgZTtyZXR1cm4gdC50YXJnZXQ/ZT10LnRhcmdldDp0LnNyY0VsZW1lbnQmJihlPXQuc3JjRWxlbWVudCksdm9pZCAwIT1lLm5vZGVUeXBlJiYzPT1lLm5vZGVUeXBlJiYoZT1lLnBhcmVudE5vZGUpLGV9LGUuaGFzUGFyZW50PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXQ7aTspe2lmKGk9PT1lKXJldHVybiEwO2k9aS5wYXJlbnROb2RlfXJldHVybiExfSxlLm9wdGlvbj17fSxlLm9wdGlvbi5hc0Jvb2xlYW49ZnVuY3Rpb24odCxlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodD10KCkpLG51bGwhPXQ/MCE9dDplfHxudWxsfSxlLm9wdGlvbi5hc051bWJlcj1mdW5jdGlvbih0LGUpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQoKSksbnVsbCE9dD9OdW1iZXIodCl8fGV8fG51bGw6ZXx8bnVsbH0sZS5vcHRpb24uYXNTdHJpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm5cImZ1bmN0aW9uXCI9PXR5cGVvZiB0JiYodD10KCkpLG51bGwhPXQ/U3RyaW5nKHQpOmV8fG51bGx9LGUub3B0aW9uLmFzU2l6ZT1mdW5jdGlvbih0LGkpe3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQoKSksZS5pc1N0cmluZyh0KT90OmUuaXNOdW1iZXIodCk/dCtcInB4XCI6aXx8bnVsbH0sZS5vcHRpb24uYXNFbGVtZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHQ9dCgpKSx0fHxlfHxudWxsfSxlLmhleFRvUkdCPWZ1bmN0aW9uKHQpe3ZhciBlPS9eIz8oW2EtZlxcZF0pKFthLWZcXGRdKShbYS1mXFxkXSkkL2k7dD10LnJlcGxhY2UoZSxmdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gZStlK2kraStvK299KTt2YXIgaT0vXiM/KFthLWZcXGRdezJ9KShbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pJC9pLmV4ZWModCk7cmV0dXJuIGk/e3I6cGFyc2VJbnQoaVsxXSwxNiksZzpwYXJzZUludChpWzJdLDE2KSxiOnBhcnNlSW50KGlbM10sMTYpfTpudWxsfSxlLm92ZXJyaWRlT3BhY2l0eT1mdW5jdGlvbih0LGkpe3ZhciBvO3JldHVybi0xIT10LmluZGV4T2YoXCJyZ2JhXCIpP3Q6LTEhPXQuaW5kZXhPZihcInJnYlwiKT8obz10LnN1YnN0cih0LmluZGV4T2YoXCIoXCIpKzEpLnJlcGxhY2UoXCIpXCIsXCJcIikuc3BsaXQoXCIsXCIpLFwicmdiYShcIitvWzBdK1wiLFwiK29bMV0rXCIsXCIrb1syXStcIixcIitpK1wiKVwiKToobz1lLmhleFRvUkdCKHQpLG51bGw9PW8/dDpcInJnYmEoXCIrby5yK1wiLFwiK28uZytcIixcIitvLmIrXCIsXCIraStcIilcIil9LGUuUkdCVG9IZXg9ZnVuY3Rpb24odCxlLGkpe3JldHVyblwiI1wiKygoMTw8MjQpKyh0PDwxNikrKGU8PDgpK2kpLnRvU3RyaW5nKDE2KS5zbGljZSgxKX0sZS5wYXJzZUNvbG9yPWZ1bmN0aW9uKHQpe3ZhciBpO2lmKCEwPT09ZS5pc1N0cmluZyh0KSl7aWYoITA9PT1lLmlzVmFsaWRSR0IodCkpe3ZhciBvPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KFwiLFwiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlSW50KHQpfSk7dD1lLlJHQlRvSGV4KG9bMF0sb1sxXSxvWzJdKX1pZighMD09PWUuaXNWYWxpZEhleCh0KSl7dmFyIG49ZS5oZXhUb0hTVih0KSxzPXtoOm4uaCxzOi44Km4ucyx2Ok1hdGgubWluKDEsMS4wMipuLnYpfSxyPXtoOm4uaCxzOk1hdGgubWluKDEsMS4yNSpuLnMpLHY6Ljgqbi52fSxhPWUuSFNWVG9IZXgoci5oLHIucyxyLnYpLGg9ZS5IU1ZUb0hleChzLmgscy5zLHMudik7aT17YmFja2dyb3VuZDp0LGJvcmRlcjphLGhpZ2hsaWdodDp7YmFja2dyb3VuZDpoLGJvcmRlcjphfSxob3Zlcjp7YmFja2dyb3VuZDpoLGJvcmRlcjphfX19ZWxzZSBpPXtiYWNrZ3JvdW5kOnQsYm9yZGVyOnQsaGlnaGxpZ2h0OntiYWNrZ3JvdW5kOnQsYm9yZGVyOnR9LGhvdmVyOntiYWNrZ3JvdW5kOnQsYm9yZGVyOnR9fX1lbHNlIGk9e30saS5iYWNrZ3JvdW5kPXQuYmFja2dyb3VuZHx8dm9pZCAwLGkuYm9yZGVyPXQuYm9yZGVyfHx2b2lkIDAsZS5pc1N0cmluZyh0LmhpZ2hsaWdodCk/aS5oaWdobGlnaHQ9e2JvcmRlcjp0LmhpZ2hsaWdodCxiYWNrZ3JvdW5kOnQuaGlnaGxpZ2h0fTooaS5oaWdobGlnaHQ9e30saS5oaWdobGlnaHQuYmFja2dyb3VuZD10LmhpZ2hsaWdodCYmdC5oaWdobGlnaHQuYmFja2dyb3VuZHx8dm9pZCAwLGkuaGlnaGxpZ2h0LmJvcmRlcj10LmhpZ2hsaWdodCYmdC5oaWdobGlnaHQuYm9yZGVyfHx2b2lkIDApLGUuaXNTdHJpbmcodC5
21167ob3Zlcik/aS5ob3Zlcj17Ym9yZGVyOnQuaG92ZXIsYmFja2dyb3VuZDp0LmhvdmVyfTooaS5ob3Zlcj17fSxpLmhvdmVyLmJhY2tncm91bmQ9dC5ob3ZlciYmdC5ob3Zlci5iYWNrZ3JvdW5kfHx2b2lkIDAsaS5ob3Zlci5ib3JkZXI9dC5ob3ZlciYmdC5ob3Zlci5ib3JkZXJ8fHZvaWQgMCk7cmV0dXJuIGl9LGUuUkdCVG9IU1Y9ZnVuY3Rpb24odCxlLGkpe3QvPTI1NSxlLz0yNTUsaS89MjU1O3ZhciBvPU1hdGgubWluKHQsTWF0aC5taW4oZSxpKSksbj1NYXRoLm1heCh0LE1hdGgubWF4KGUsaSkpO2lmKG89PW4pcmV0dXJue2g6MCxzOjAsdjpvfTt2YXIgcz10PT1vP2UtaTppPT1vP3QtZTppLXQ7cmV0dXJue2g6NjAqKCh0PT1vPzM6aT09bz8xOjUpLXMvKG4tbykpLzM2MCxzOihuLW8pL24sdjpufX07dmFyIHY9e3NwbGl0OmZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiB0LnNwbGl0KFwiO1wiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2lmKFwiXCIhPXQudHJpbSgpKXt2YXIgaT10LnNwbGl0KFwiOlwiKSxvPWlbMF0udHJpbSgpLG49aVsxXS50cmltKCk7ZVtvXT1ufX0pLGV9LGpvaW46ZnVuY3Rpb24odCl7cmV0dXJuKDAsbC5kZWZhdWx0KSh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIGUrXCI6IFwiK3RbZV19KS5qb2luKFwiOyBcIil9fTtlLmFkZENzc1RleHQ9ZnVuY3Rpb24odCxpKXt2YXIgbz12LnNwbGl0KHQuc3R5bGUuY3NzVGV4dCksbj12LnNwbGl0KGkpLHM9ZS5leHRlbmQobyxuKTt0LnN0eWxlLmNzc1RleHQ9di5qb2luKHMpfSxlLnJlbW92ZUNzc1RleHQ9ZnVuY3Rpb24odCxlKXt2YXIgaT12LnNwbGl0KHQuc3R5bGUuY3NzVGV4dCksbz12LnNwbGl0KGUpO2Zvcih2YXIgbiBpbiBvKW8uaGFzT3duUHJvcGVydHkobikmJmRlbGV0ZSBpW25dO3Quc3R5bGUuY3NzVGV4dD12LmpvaW4oaSl9LGUuSFNWVG9SR0I9ZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4scyxyPU1hdGguZmxvb3IoNip0KSxhPTYqdC1yLGg9aSooMS1lKSxkPWkqKDEtYSplKSxsPWkqKDEtKDEtYSkqZSk7c3dpdGNoKHIlNil7Y2FzZSAwOm89aSxuPWwscz1oO2JyZWFrO2Nhc2UgMTpvPWQsbj1pLHM9aDticmVhaztjYXNlIDI6bz1oLG49aSxzPWw7YnJlYWs7Y2FzZSAzOm89aCxuPWQscz1pO2JyZWFrO2Nhc2UgNDpvPWwsbj1oLHM9aTticmVhaztjYXNlIDU6bz1pLG49aCxzPWR9cmV0dXJue3I6TWF0aC5mbG9vcigyNTUqbyksZzpNYXRoLmZsb29yKDI1NSpuKSxiOk1hdGguZmxvb3IoMjU1KnMpfX0sZS5IU1ZUb0hleD1mdW5jdGlvbih0LGksbyl7dmFyIG49ZS5IU1ZUb1JHQih0LGksbyk7cmV0dXJuIGUuUkdCVG9IZXgobi5yLG4uZyxuLmIpfSxlLmhleFRv
21167SFNWPWZ1bmN0aW9uKHQpe3ZhciBpPWUuaGV4VG9SR0IodCk7cmV0dXJuIGUuUkdCVG9IU1YoaS5yLGkuZyxpLmIpfSxlLmlzVmFsaWRIZXg9ZnVuY3Rpb24odCl7cmV0dXJuLyheI1swLTlBLUZdezZ9JCl8KF4jWzAtOUEtRl17M30kKS9pLnRlc3QodCl9LGUuaXNWYWxpZFJHQj1mdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoXCIgXCIsXCJcIiksL3JnYlxcKChcXGR7MSwzfSksKFxcZHsxLDN9KSwoXFxkezEsM30pXFwpL2kudGVzdCh0KX0sZS5pc1ZhbGlkUkdCQT1mdW5jdGlvbih0KXtyZXR1cm4gdD10LnJlcGxhY2UoXCIgXCIsXCJcIiksL3JnYmFcXCgoXFxkezEsM30pLChcXGR7MSwzfSksKFxcZHsxLDN9KSwoLnsxLDN9KVxcKS9pLnRlc3QodCl9LGUuc2VsZWN0aXZlQnJpZGdlT2JqZWN0PWZ1bmN0aW9uKHQsaSl7aWYobnVsbCE9PWkmJlwib2JqZWN0XCI9PT0odm9pZCAwPT09aT9cInVuZGVmaW5lZFwiOigwLGMuZGVmYXVsdCkoaSkpKXtmb3IodmFyIG89KDAsaC5kZWZhdWx0KShpKSxuPTA7bjx0Lmxlbmd0aDtuKyspaS5oYXNPd25Qcm9wZXJ0eSh0W25dKSYmXCJvYmplY3RcIj09KDAsYy5kZWZhdWx0KShpW3Rbbl1dKSYmKG9bdFtuXV09ZS5icmlkZ2VPYmplY3QoaVt0W25dXSkpO3JldHVybiBvfXJldHVybiBudWxsfSxlLmJyaWRnZU9iamVjdD1mdW5jdGlvbih0KXtpZihudWxsIT09dCYmXCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6KDAsYy5kZWZhdWx0KSh0KSkpe3ZhciBpPSgwLGguZGVmYXVsdCkodCk7aWYodCBpbnN0YW5jZW9mIEVsZW1lbnQpaT10O2Vsc2V7aT0oMCxoLmRlZmF1bHQpKHQpO2Zvcih2YXIgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJlwib2JqZWN0XCI9PSgwLGMuZGVmYXVsdCkodFtvXSkmJihpW29dPWUuYnJpZGdlT2JqZWN0KHRbb10pKX1yZXR1cm4gaX1yZXR1cm4gbnVsbH0sZS5pbnNlcnRTb3J0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspe2Zvcih2YXIgbz10W2ldLG49aTtuPjAmJmUobyx0W24tMV0pPDA7bi0tKXRbbl09dFtuLTFdO3Rbbl09b31yZXR1cm4gdH0sZS5tZXJnZU9wdGlvbnM9ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxuPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT09dCYmdm9pZCAwIT09dH0scz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9PXQmJlwib2JqZWN0XCI9PT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGMuZGVmYXVsdCkodCkpfTtpZighcyh0KSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgbWVyZ2VUYXJnZXQgbXVzdCBiZSBhbiBvYmplY3RcIik7aWYoIXMoZSkpdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIG9wdGlvbnMgbXVzdCBiZSBhbiBvYmplY3RcIik7aWYoIW4oaSkpdGhyb3cgbmV3IEVycm9yKFwiUGFyYW1ldGVyIG9wdGlvbiBtdXN0IGhhdmUgYSB2YWx1ZVwiKTtpZighcyhvKSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgZ2xvYmFsT3B0aW9ucyBtdXN0IGJlIGFuIG9iamVjdFwiKTt2YXIgcj1lW2ldLGE9cyhvKSYmIWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9KG8pLGQ9YT9vW2ldOnZvaWQgMCxsPWQ/ZC5lbmFibGVkOnZvaWQgMDtpZih2b2lkIDAhPT1yKXtpZihcImJvb2xlYW5cIj09dHlwZW9mIHIpcmV0dXJuIHModFtpXSl8fCh0W2ldPXt9KSx2b2lkKHRbaV0uZW5hYmxlZD1yKTtpZihudWxsPT09ciYmIXModFtpXSkpe2lmKCFuKGQpKXJldHVybjt0W2ldPSgwLGguZGVmYXVsdCkoZCl9aWYocyhyKSl7dmFyIHU9ITA7dm9pZCAwIT09ci5lbmFibGVkP3U9ci5lbmFibGVkOnZvaWQgMCE9PWwmJih1PWQuZW5hYmxlZCksZnVuY3Rpb24odCxlLGkpe3ModFtpXSl8fCh0W2ldPXt9KTt2YXIgbz1lW2ldLG49dFtpXTtmb3IodmFyIHIgaW4gbylvLmhhc093blByb3BlcnR5KHIpJiYobltyXT1vW3JdKX0odCxlLGkpLHRbaV0uZW5hYmxlZD11fX19LGUuYmluYXJ5U2VhcmNoQ3VzdG9tPWZ1bmN0aW9uKHQsZSxpLG8pe2Zvcih2YXIgbj0wLHM9MCxyPXQubGVuZ3RoLTE7czw9ciYmbjwxZTQ7KXt2YXIgYT1NYXRoLmZsb29yKChzK3IpLzIpLGg9dFthXSxkPXZvaWQgMD09PW8/aFtpXTpoW2ldW29dLGw9ZShkKTtpZigwPT1sKXJldHVybiBhOy0xPT1sP3M9YSsxOnI9YS0xLG4rK31yZXR1cm4tMX0sZS5iaW5hcnlTZWFyY2hWYWx1ZT1mdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzLHIsYSxoLGQ9MCxsPTAsdT10Lmxlbmd0aC0xO2ZvcihuPXZvaWQgMCE9bj9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PWU/MDp0PGU/LTE6MX07bDw9dSYmZDwxZTQ7KXtpZihoPU1hdGguZmxvb3IoLjUqKHUrbCkpLHM9dFtNYXRoLm1heCgwLGgtMSldW2ldLHI9dFtoXVtpXSxhPXRbTWF0aC5taW4odC5sZW5ndGgtMSxoKzEpXVtpXSwwPT1uKHIsZSkpcmV0dXJuIGg7aWYobihzLGUpPDAmJm4ocixlKT4wKXJldHVyblwiYmVmb3JlXCI9PW8/TWF0aC5tYXgoMCxoLTEpOmg7aWYobihyLGUpPDAmJm4oYSxlKT4wKXJldHVyblwiYmVmb3JlXCI9PW8/aDpNYXRoLm1pbih0Lmxlbmd0aC0xLGgrMSk7bihyLGUpPDA/bD1oKzE6dT1oLTEsZCsrfXJldHVybi0xfSxlLmVhc2luZ0Z1bmN0aW9ucz17bGluZWFyOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxlYXNlSW5RdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0KnR9LGVhc2VPdXRRdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0KigyLXQpfSxlYXNlSW5PdXRRdWFkOmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzIqdCp0Oig0LTIqdCkqdC0xfSxlYXNlSW5DdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4gdCp0KnR9LGVhc2VPdXRDdWJpYzpmdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LGVhc2VJbk91dEN1YmljOmZ1bmN0aW9uKHQpe3JldHVybiB0PC41PzQqdCp0KnQ6KHQtMSkqKDIqdC0yKSooMip0LTIpKzF9LGVhc2VJblF1YXJ0OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0fSxlYXNlT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIDEtIC0tdCp0KnQqdH0sZWFzZUluT3V0UXVhcnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/OCp0KnQqdCp0OjEtOCotLXQqdCp0KnR9LGVhc2VJblF1aW50OmZ1bmN0aW9uKHQpe3JldHVybiB0KnQqdCp0KnR9LGVhc2VPdXRRdWludDpmdW5jdGlvbih0KXtyZXR1cm4gMSstLXQqdCp0KnQqdH0sZWFzZUluT3V0UXVpbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ8LjU/MTYqdCp0KnQqdCp0OjErMTYqLS10KnQqdCp0KnR9fSxlLmdldFNjcm9sbEJhcldpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInBcIik7dC5zdHlsZS53aWR0aD1cIjEwMCVcIix0LnN0eWxlLmhlaWdodD1cIjIwMHB4XCI7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlLnN0eWxlLnRvcD1cIjBweFwiLGUuc3R5bGUubGVmdD1cIjBweFwiLGUuc3R5bGUudmlzaWJpbGl0eT1cImhpZGRlblwiLGUuc3R5bGUud2lkdGg9XCIyMDBweFwiLGUuc3R5bGUuaGVpZ2h0PVwiMTUwcHhcIixlLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIsZS
211675hcHBlbmRDaGlsZCh0KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGUpO3ZhciBpPXQub2Zmc2V0V2lkdGg7ZS5zdHlsZS5vdmVyZmxvdz1cInNjcm9sbFwiO3ZhciBvPXQub2Zmc2V0V2lkdGg7cmV0dXJuIGk9PW8mJihvPWUuY2xpZW50V2lkdGgpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZSksaS1vfSxlLnRvcE1vc3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT12b2lkIDA7QXJyYXkuaXNBcnJheShlKXx8KGU9W2VdKTt2YXIgbz0hMCxuPSExLHM9dm9pZCAwO3RyeXtmb3IodmFyIGEsaD0oMCxyLmRlZmF1bHQpKHQpOyEobz0oYT1oLm5leHQoKSkuZG9uZSk7bz0hMCl7dmFyIGQ9YS52YWx1ZTtpZihkKXtpPWRbZVswXV07Zm9yKHZhciBsPTE7bDxlLmxlbmd0aDtsKyspaSYmKGk9aVtlW2xdXSk7aWYodm9pZCAwIT09aSlicmVha319fWNhdGNoKHQpe249ITAscz10fWZpbmFsbHl7dHJ5eyFvJiZoLnJldHVybiYmaC5yZXR1cm4oKX1maW5hbGx5e2lmKG4pdGhyb3cgc319cmV0dXJuIGl9fSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTk0KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2UuX19lc01vZHVsZT0hMDt2YXIgbz1pKDYpLG49ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShvKTtlLmRlZmF1bHQ9ZnVuY3Rpb24odCxlKXtpZighdCl0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IoXCJ0aGlzIGhhc24ndCBiZWVuIGluaXRpYWxpc2VkIC0gc3VwZXIoKSBoYXNuJ3QgYmVlbiBjYWxsZWRcIik7cmV0dXJuIWV8fFwib2JqZWN0XCIhPT0odm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOigwLG4uZGVmYXVsdCkoZSkpJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiBlP3Q6ZX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1lLl9fZXNNb2R1bGU9ITA7dmFyIG49aSgxOTYpLHM9byhuKSxyPWkoMjkpLGE9byhyKSxoPWkoNiksZD1vKGgpO2UuZGVmYXVsdD1mdW5jdGlvbih0LGUpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIGUmJm51bGwhPT1lKXRocm93IG5ldyBUeXBlRXJyb3IoXCJTdXBlciBleHByZXNzaW9uIG11c3QgZWl0aGVyIGJlIG51bGwgb3IgYSBmdW5jdGlvbiwgbm90IFwiKyh2b2lkIDA9PT1lP1widW5kZWZpbmVkXCI6KDAsZC5kZWZhdWx0KShlKSkpO3QucHJvdG90eXBlPSgwLGEuZGVmYXVsdCkoZSYmZS5wcm90b3R5cGUse2NvbnN0cnVjdG9yOnt2YWx1ZTp0LGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfX0pLGUmJihzLmRlZmF1bHQ/KDAscy5kZWZhdWx0KSh0LGUpOnQuX19wcm90b19fPWUpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWUuX19lc01vZHVsZT0hMDt2YXIgbj1pKDE0Mikscz1vKG4pLHI9aSgxNDQpLGE9byhyKSxoPVwiZnVuY3Rpb25cIj09dHlwZW9mIGEuZGVmYXVsdCYmXCJzeW1ib2xcIj09dHlwZW9mIHMuZGVmYXVsdD9mdW5jdGlvbih0KXtyZXR1cm4gdHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmRlZmF1bHQmJnQuY29uc3RydWN0b3I9PT1hLmRlZmF1bHQmJnQhPT1hLmRlZmF1bHQucHJvdG90eXBlP1wic3ltYm9sXCI6dHlwZW9mIHR9O2UuZGVmYXVsdD1cImZ1bmN0aW9uXCI9PXR5cGVvZiBhLmRlZmF1bHQmJlwic3ltYm9sXCI9PT1oKHMuZGVmYXVsdCk/ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjpoKHQpfTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgYS5kZWZhdWx0JiZ0LmNvbnN0cnVjdG9yPT09YS5kZWZhdWx0JiZ0IT09YS5kZWZhdWx0LnByb3RvdHlwZT9cInN5bWJvbFwiOnZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjpoKHQpfX0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4cG9ydHM9e3ZlcnNpb246XCIyLjUuMVwifTtcIm51bWJlclwiPT10eXBlb2YgX19lJiYoX19lPWkpfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTQwKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz1cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cubW9tZW50fHxpKDE1NCl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKCl7dmFyIHQ9ZnVuY3Rpb24oKXt9O3JldHVybntvbjp0LG9mZjp0LGRlc3Ryb3k6dCxlbWl0OnQsZ2V0OmZ1bmN0aW9uKGUpe3JldHVybntzZXQ6dH19fX1pZihcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93KXt2YXIgbj1pKDE3NSkscz13aW5kb3cuSGFtbWVyfHxpKDE3Nik7dC5leHBvcnRzPW4ocyx7cHJldmVudERlZmF1bHQ6XCJtb3VzZVwifSl9ZWxzZSB0LmV4cG9ydHM9ZnVuY3Rpb24oKXtyZXR1cm4gbygpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXtpZih0JiYhQXJyYXkuaXNBcnJheSh0KSYmKGU9dCx0PW51bGwpLHRoaXMuX29wdGlvbnM9ZXx8e30sdGhpcy5fZGF0YT17fSx0aGlzLmxlbmd0aD0wLHRoaXMuX2ZpZWxkSWQ9dGhpcy5fb3B0aW9ucy5maWVsZElkfHxcImlkXCIsdGhpcy5fdHlwZT17fSx0aGlzLl9vcHRpb25zLnR5cGUpZm9yKHZhciBpPSgwLGwuZGVmYXVsdCkodGhpcy5fb3B0aW9ucy50eXBlKSxvPTAsbj1pLmxlbmd0aDtvPG47bysrKXt2YXIgcz1pW29dLHI9dGhpcy5fb3B0aW9ucy50eXBlW3NdO3RoaXMuX3R5cGVbc109XCJEYXRlXCI9PXJ8fFwiSVNPRGF0ZVwiPT1yfHxcIkFTUERhdGVcIj09cj9cIkRhdGVcIjpyfXRoaXMuX3N1YnNjcmliZXJzPXt9LHQmJnRoaXMuYWRkKHQpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgcz1pKDE5KSxyPW8ocyksYT1pKDYpLGg9byhhKSxkPWkoOCksbD1vKGQpLHU9aSgyKSxjPWkoNDMpO24ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmdm9pZCAwIT09dC5xdWV1ZSYmKCExPT09dC5xdWV1ZT90aGlzLl9xdWV1ZSYmKHRoaXMuX3F1ZXVlLmRlc3Ryb3koKSxkZWxldGUgdGhpcy5fcXVldWUpOih0aGlzLl9xdWV1ZXx8KHRoaXMuX3F1ZXVlPWMuZXh0ZW5kKHRoaXMse3JlcGxhY2U6W1wiYWRkXCIsXCJ1cGRhdGVcIixcInJlbW92ZVwiXX0pKSxcIm9iamVjdFwiPT09KDAsaC5kZWZh
21167dWx0KSh0LnF1ZXVlKSYmdGhpcy5fcXVldWUuc2V0T3B0aW9ucyh0LnF1ZXVlKSkpfSxuLnByb3RvdHlwZS5vbj1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX3N1YnNjcmliZXJzW3RdO2l8fChpPVtdLHRoaXMuX3N1YnNjcmliZXJzW3RdPWkpLGkucHVzaCh7Y2FsbGJhY2s6ZX0pfSxuLnByb3RvdHlwZS5vZmY9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9zdWJzY3JpYmVyc1t0XTtpJiYodGhpcy5fc3Vic2NyaWJlcnNbdF09aS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuY2FsbGJhY2shPWV9KSl9LG4ucHJvdG90eXBlLl90cmlnZ2VyPWZ1bmN0aW9uKHQsZSxpKXtpZihcIipcIj09dCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgdHJpZ2dlciBldmVudCAqXCIpO3ZhciBvPVtdO3QgaW4gdGhpcy5fc3Vic2NyaWJlcnMmJihvPW8uY29uY2F0KHRoaXMuX3N1YnNjcmliZXJzW3RdKSksXCIqXCJpbiB0aGlzLl9zdWJzY3JpYmVycyYmKG89by5jb25jYXQodGhpcy5fc3Vic2NyaWJlcnNbXCIqXCJdKSk7Zm9yKHZhciBuPTAscz1vLmxlbmd0aDtuPHM7bisrKXt2YXIgcj1vW25dO3IuY2FsbGJhY2smJnIuY2FsbGJhY2sodCxlLGl8fG51bGwpfX0sbi5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIGksbz1bXSxuPXRoaXM7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHM9MCxyPXQubGVuZ3RoO3M8cjtzKyspaT1uLl9hZGRJdGVtKHRbc10pLG8ucHVzaChpKTtlbHNle2lmKCF0fHxcIm9iamVjdFwiIT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxoLmRlZmF1bHQpKHQpKSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRhdGFUeXBlXCIpO2k9bi5fYWRkSXRlbSh0KSxvLnB1c2goaSl9cmV0dXJuIG8ubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKFwiYWRkXCIse2l0ZW1zOm99LGUpLG99LG4ucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbih0LGUpe3ZhciBpPVtdLG89W10sbj1bXSxzPVtdLHI9dGhpcyxhPXIuX2ZpZWxkSWQsZD1mdW5jdGlvbih0KXt2YXIgZT10W2FdO2lmKHIuX2RhdGFbZV0pe3ZhciBoPXUuZXh0ZW5kKHt9LHIuX2RhdGFbZV0pO2U9ci5fdXBkYXRlSXRlbSh0KSxvLnB1c2goZSkscy5wdXNoKHQpLG4ucHVzaChoKX1lbHNlIGU9ci5fYWRkSXRlbSh0KSxpLnB1c2goZSl9O2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciBsPTAsYz10Lmxlbmd0aDtsPGM7bCsrKXRbbF0mJlwib2JqZWN0XCI9PT0oMCxoLmRlZmF1bHQpKHRbbF0pP2QodFtsXSk6Y29uc29sZS53YXJuKFwiSWdub3JpbmcgaW5wdXQgaXRlbSwgd2hpY2ggaXMgbm90IGFuIG9iamVjdCBhdCBpbmRleCBcIitsKTtlbHNle2lmKCF0fHxcIm9iamVjdFwiIT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxoLmRlZmF1bHQpKHQpKSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGRhdGFUeXBlXCIpO2QodCl9aWYoaS5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJhZGRcIix7aXRlbXM6aX0sZSksby5sZW5ndGgpe3ZhciBwPXtpdGVtczpvLG9sZERhdGE6bixkYXRhOnN9O3RoaXMuX3RyaWdnZXIoXCJ1cGRhdGVcIixwLGUpfXJldHVybiBpLmNvbmNhdChvKX0sbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuPXRoaXMscz11LmdldFR5cGUoYXJndW1lbnRzWzBdKTtcIlN0cmluZ1wiPT1zfHxcIk51bWJlclwiPT1zPyhlPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6XCJBcnJheVwiPT1zPyhpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk6bz1hcmd1bWVudHNbMF07dmFyIHI7aWYobyYmby5yZXR1cm5UeXBlKXtyPS0xPT1bXCJBcnJheVwiLFwiT2JqZWN0XCJdLmluZGV4T2Yoby5yZXR1cm5UeXBlKT9cIkFycmF5XCI6by5yZXR1cm5UeXBlfWVsc2Ugcj1cIkFycmF5XCI7dmFyIGEsaCxkLGMscCxmPW8mJm8udHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLG09byYmby5maWx0ZXIsdj1bXTtpZih2b2lkIDAhPWUpKGE9bi5fZ2V0SXRlbShlLGYpKSYmbSYmIW0oYSkmJihhPW51bGwpO2Vsc2UgaWYodm9pZCAwIT1pKWZvcihjPTAscD1pLmxlbmd0aDtjPHA7YysrKWE9bi5fZ2V0SXRlbShpW2NdLGYpLG0mJiFtKGEpfHx2LnB1c2goYSk7ZWxzZSBmb3IoaD0oMCxsLmRlZmF1bHQpKHRoaXMuX2RhdGEpLGM9MCxwPWgubGVuZ3RoO2M8cDtjKyspZD1oW2NdLGE9bi5fZ2V0SXRlbShkLGYpLG0mJiFtKGEpfHx2LnB1c2goYSk7aWYobyYmby5vcmRlciYmdm9pZCAwPT1lJiZ0aGlzLl9zb3J0KHYsby5vcmRlciksbyYmby5maWVsZHMpe3ZhciBnPW8uZmllbGRzO2lmKHZvaWQgMCE9ZSlhPXRoaXMuX2ZpbHRlckZpZWxkcyhhLGcpO2Vsc2UgZm9yKGM9MCxwPXYubGVuZ3RoO2M8cDtjKyspdltjXT10aGlzLl9maWx0ZXJGaWVsZHModltjXSxnKX1pZihcIk9iamVjdFwiPT1yKXt2YXIgeSxiPXt9O2ZvcihjPTAscD12Lmxlbmd0aDtjPHA7YysrKXk9dltjXSxiW3kuaWRdPXk7cmV0dXJuIGJ9cmV0dXJuIHZvaWQgMCE9ZT9hOnZ9LG4ucHJvdG90eXBlLmdldElkcz1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzLHI9dGhpcy5fZGF0YSxhPXQmJnQuZmlsdGVyLGg9dCYmdC5vcmRlcixkPXQmJnQudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLHU9KDAsbC5kZWZhdWx0KShyKSxjPVtdO2lmKGEpaWYoaCl7Zm9yKHM9W10sZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmcy5wdXNoKG4pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj10aGlzLl9nZXRJdGVtKG8sZCksYShuKSYmYy5wdXNoKG5bdGhpcy5fZmllbGRJZF0pO2Vsc2UgaWYoaCl7Zm9yKHM9W10sZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0scy5wdXNoKHJbb10pO2Zvcih0aGlzLl9zb3J0KHMsaCksZT0wLGk9cy5sZW5ndGg7ZTxpO2UrKyljLnB1c2goc1tlXVt0aGlzLl9maWVsZElkXSl9ZWxzZSBmb3IoZT0wLGk9dS5sZW5ndGg7ZTxpO2UrKylvPXVbZV0sbj1yW29dLGMucHVzaChuW3RoaXMuX2ZpZWxkSWRdKTtyZXR1cm4gY30sbi5wcm90b3R5cGUuZ2V0RGF0YVNldD1mdW5jdGlvbigpe3JldHVybiB0aGlzfSxuLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9dGhpcy5fZGF0YSxkPSgwLGwuZGVmYXVsdCkoaCk7aWYoZSYmZS5vcmRlcil7dmFyIHU9dGhpcy5nZXQoZSk7Zm9yKGk9MCxvPXUubGVuZ3RoO2k8bztpKyspbj11W2ldLHM9blt0aGlzLl9maWVsZElkXSx0KG4scyl9ZWxzZSBmb3IoaT0wLG89ZC5sZW5ndGg7aTxvO2krKylzPWRbaV0sbj10aGlzLl9nZXRJdGVtKHMsYSksciYmIXIobil8fHQobixzKX0sbi5wcm90b3R5cGUubWFwPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1lJiZlLmZpbHRlcixhPWUmJmUudHlwZXx8dGhpcy5fb3B0aW9ucy50eXBlLGg9W10sZD10aGlzLl9kYXRhLHU9KDAsbC5k
21167ZWZhdWx0KShkKTtmb3IoaT0wLG89dS5sZW5ndGg7aTxvO2krKyluPXVbaV0scz10aGlzLl9nZXRJdGVtKG4sYSksciYmIXIocyl8fGgucHVzaCh0KHMsbikpO3JldHVybiBlJiZlLm9yZGVyJiZ0aGlzLl9zb3J0KGgsZS5vcmRlciksaH0sbi5wcm90b3R5cGUuX2ZpbHRlckZpZWxkcz1mdW5jdGlvbih0LGUpe2lmKCF0KXJldHVybiB0O3ZhciBpLG8sbj17fSxzPSgwLGwuZGVmYXVsdCkodCkscj1zLmxlbmd0aDtpZihBcnJheS5pc0FycmF5KGUpKWZvcihpPTA7aTxyO2krKylvPXNbaV0sLTEhPWUuaW5kZXhPZihvKSYmKG5bb109dFtvXSk7ZWxzZSBmb3IoaT0wO2k8cjtpKyspbz1zW2ldLGUuaGFzT3duUHJvcGVydHkobykmJihuW2Vbb11dPXRbb10pO3JldHVybiBufSxuLnByb3RvdHlwZS5fc29ydD1mdW5jdGlvbih0LGUpe2lmKHUuaXNTdHJpbmcoZSkpe3ZhciBpPWU7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7dmFyIG89dFtpXSxuPWVbaV07cmV0dXJuIG8+bj8xOm88bj8tMTowfSl9ZWxzZXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiBlKXRocm93IG5ldyBUeXBlRXJyb3IoXCJPcmRlciBtdXN0IGJlIGEgZnVuY3Rpb24gb3IgYSBzdHJpbmdcIik7dC5zb3J0KGUpfX0sbi5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscj1bXSxhPVtdLGg9W107Zm9yKGg9QXJyYXkuaXNBcnJheSh0KT90Olt0XSxpPTAsbz1oLmxlbmd0aDtpPG87aSsrKShzPXRoaXMuX3JlbW92ZShoW2ldKSkmJnZvaWQgMCE9KG49c1t0aGlzLl9maWVsZElkXSkmJihyLnB1c2gobiksYS5wdXNoKHMpKTtyZXR1cm4gci5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJyZW1vdmVcIix7aXRlbXM6cixvbGREYXRhOmF9LGUpLHJ9LG4ucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGUsaTtyZXR1cm4gdS5pc051bWJlcih0KXx8dS5pc1N0cmluZyh0KT9pPXQ6dCYmXCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6KDAsaC5kZWZhdWx0KSh0KSkmJihpPXRbdGhpcy5fZmllbGRJZF0pLHZvaWQgMCE9PWkmJnRoaXMuX2RhdGFbaV0/KGU9dGhpcy5fZGF0YVtpXSxkZWxldGUgdGhpcy5fZGF0YVtpXSx0aGlzLmxlbmd0aC0tLGUpOm51bGx9LG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKHQpe3ZhciBlLGksbz0oMCxsLmRlZmF1bHQpKHRoaXMuX2RhdGEpLG49W107Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspbi5wdXNoKHRoaXMuX2RhdGFbb1tlXV0pO3JldHVybiB0aGlzLl9kYXRhPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpvLG9sZERhdGE6bn0sdCksb30sbi5wcm90b3R5cGUubWF4PWZ1bmN0aW9uKHQpe3ZhciBlLGksbz10aGlzLl9kYXRhLG49KDAsbC5kZWZhdWx0KShvKSxzPW51bGwscj1udWxsO2ZvcihlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXt2YXIgYT1uW2VdLGg9b1thXSxkPWhbdF07bnVsbCE9ZCYmKCFzfHxkPnIpJiYocz1oLHI9ZCl9cmV0dXJuIHN9LG4ucHJvdG90eXBlLm1pbj1mdW5jdGlvbih0KXt2YXIgZSxpLG89dGhpcy5fZGF0YSxuPSgwLGwuZGVmYXVsdCkobykscz1udWxsLHI9bnVsbDtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7dmFyIGE9bltlXSxoPW9bYV0sZD1oW3RdO251bGwhPWQmJighc3x8ZDxyKSYmKHM9aCxyPWQpfXJldHVybiBzfSxuLnByb3RvdHlwZS5kaXN0aW5jdD1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbj10aGlzLl9kYXRhLHM9KDAsbC5kZWZhdWx0KShuKSxyPVtdLGE9dGhpcy5fb3B0aW9ucy50eXBlJiZ0aGlzLl9vcHRpb25zLnR5cGVbdF18fG51bGwsaD0wO2ZvcihlPTAsbz1zLmxlbmd0aDtlPG87ZSsrKXt2YXIgZD1zW2VdLGM9bltkXSxwPWNbdF0sZj0hMTtmb3IoaT0wO2k8aDtpKyspaWYocltpXT09cCl7Zj0hMDticmVha31mfHx2b2lkIDA9PT1wfHwocltoXT1wLGgrKyl9aWYoYSlmb3IoZT0wLG89ci5sZW5ndGg7ZTxvO2UrKylyW2VdPXUuY29udmVydChyW2VdLGEpO3JldHVybiByfSxuLnByb3RvdHlwZS5fYWRkSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10W3RoaXMuX2ZpZWxkSWRdO2lmKHZvaWQgMCE9ZSl7aWYodGhpcy5fZGF0YVtlXSl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgYWRkIGl0ZW06IGl0ZW0gd2l0aCBpZCBcIitlK1wiIGFscmVhZHkgZXhpc3RzXCIpfWVsc2UgZT11LnJhbmRvbVVVSUQoKSx0W3RoaXMuX2ZpZWxkSWRdPWU7dmFyIGksbyxuPXt9LHM9KDAsbC5kZWZhdWx0KSh0KTtmb3IoaT0wLG89cy5sZW5ndGg7aTxvO2krKyl7dmFyIHI9c1tpXSxhPXRoaXMuX3R5cGVbcl07bltyXT11LmNvbnZlcnQodFtyXSxhKX1yZXR1cm4gdGhpcy5fZGF0YVtlXT1uLHRoaXMubGVuZ3RoKyssZX0sbi5wcm90b3R5cGUuX2dldEl0ZW09ZnVuY3Rpb24odCxlKXt2YXIgaSxvLG4scyxyPXRoaXMuX2RhdGFbdF07aWYoIXIpcmV0dXJuIG51bGw7dmFyIGE9e30saD0oMCxsLmRlZmF1bHQpKHIpO2lmKGUpZm9yKG49MCxzPWgubGVuZ3RoO248cztuKyspaT1oW25dLG89cltpXSxhW2ldPXUuY29udmVydChvLGVbaV0pO2Vsc2UgZm9yKG49MCxzPWgubGVuZ3RoO248cztuKyspaT1oW25dLG89cltpXSxhW2ldPW87cmV0dXJuIGFbdGhpcy5fZmllbGRJZF18fChhW3RoaXMuX2ZpZWxkSWRdPXIuaWQpLGF9LG4ucHJvdG90eXBlLl91cGRhdGVJdGVtPWZ1bmN0aW9uKHQpe3ZhciBlPXRbdGhpcy5fZmllbGRJZF07aWYodm9pZCAwPT1lKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1cGRhdGUgaXRlbTogaXRlbSBoYXMgbm8gaWQgKGl0ZW06IFwiKygwLHIuZGVmYXVsdCkodCkrXCIpXCIpO3ZhciBpPXRoaXMuX2RhdGFbZV07aWYoIWkpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHVwZGF0ZSBpdGVtOiBubyBpdGVtIHdpdGggaWQgXCIrZStcIiBmb3VuZFwiKTtmb3IodmFyIG89KDAsbC5kZWZhdWx0KSh0KSxuPTAscz1vLmxlbmd0aDtuPHM7bisrKXt2YXIgYT1vW25dLGg9dGhpcy5fdHlwZVthXTtpW2FdPXUuY29udmVydCh0W2FdLGgpfXJldHVybiBlfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLl9kYXRhPW51bGwsdGhpcy5faWRzPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fb3B0aW9ucz1lfHx7fS
21167x0aGlzLl9maWVsZElkPVwiaWRcIix0aGlzLl9zdWJzY3JpYmVycz17fTt2YXIgaT10aGlzO3RoaXMubGlzdGVuZXI9ZnVuY3Rpb24oKXtpLl9vbkV2ZW50LmFwcGx5KGksYXJndW1lbnRzKX0sdGhpcy5zZXREYXRhKHQpfXZhciBuPWkoOCkscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9aSgyKSxhPWkoMTEpO28ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG4scztpZih0aGlzLl9kYXRhKXtmb3IodGhpcy5fZGF0YS5vZmYmJnRoaXMuX2RhdGEub2ZmKFwiKlwiLHRoaXMubGlzdGVuZXIpLGU9dGhpcy5fZGF0YS5nZXRJZHMoe2ZpbHRlcjp0aGlzLl9vcHRpb25zJiZ0aGlzLl9vcHRpb25zLmZpbHRlcn0pLHM9W10sbz0wLG49ZS5sZW5ndGg7bzxuO28rKylzLnB1c2godGhpcy5fZGF0YS5fZGF0YVtlW29dXSk7dGhpcy5faWRzPXt9LHRoaXMubGVuZ3RoPTAsdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczplLG9sZERhdGE6c30pfWlmKHRoaXMuX2RhdGE9dCx0aGlzLl9kYXRhKXtmb3IodGhpcy5fZmllbGRJZD10aGlzLl9vcHRpb25zLmZpZWxkSWR8fHRoaXMuX2RhdGEmJnRoaXMuX2RhdGEub3B0aW9ucyYmdGhpcy5fZGF0YS5vcHRpb25zLmZpZWxkSWR8fFwiaWRcIixlPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6dGhpcy5fb3B0aW9ucyYmdGhpcy5fb3B0aW9ucy5maWx0ZXJ9KSxvPTAsbj1lLmxlbmd0aDtvPG47bysrKWk9ZVtvXSx0aGlzLl9pZHNbaV09ITA7dGhpcy5sZW5ndGg9ZS5sZW5ndGgsdGhpcy5fdHJpZ2dlcihcImFkZFwiLHtpdGVtczplfSksdGhpcy5fZGF0YS5vbiYmdGhpcy5fZGF0YS5vbihcIipcIix0aGlzLmxpc3RlbmVyKX19LG8ucHJvdG90eXBlLnJlZnJlc2g9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbz10aGlzLl9kYXRhLmdldElkcyh7ZmlsdGVyOnRoaXMuX29wdGlvbnMmJnRoaXMuX29wdGlvbnMuZmlsdGVyfSksbj0oMCxzLmRlZmF1bHQpKHRoaXMuX2lkcykscj17fSxhPVtdLGg9W10sZD1bXTtmb3IoZT0wLGk9by5sZW5ndGg7ZTxpO2UrKyl0PW9bZV0sclt0XT0hMCx0aGlzLl9pZHNbdF18fChhLnB1c2godCksdGhpcy5faWRzW3RdPSEwKTtmb3IoZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl0PW5bZV0sclt0XXx8KGgucHVzaCh0KSxkLnB1c2godGhpcy5fZGF0YS5fZGF0YVt0XSksZGVsZXRlIHRoaXMuX2lkc1t0XSk7dGhpcy5sZW5ndGgrPWEubGVuZ3RoLWgubGVuZ3RoLGEubGVuZ3RoJiZ0aGlzLl90cmlnZ2VyKFwiYWRkXCIse2l0ZW1zOmF9KSxoLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpoLG9sZERhdGE6ZH0pfSxvLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG49dGhpcyxzPXIuZ2V0VHlwZShhcmd1bWVudHNbMF0pO1wiU3RyaW5nXCI9PXN8fFwiTnVtYmVyXCI9PXN8fFwiQXJyYXlcIj09cz8oZT1hcmd1bWVudHNbMF0saT1hcmd1bWVudHNbMV0sbz1hcmd1bWVudHNbMl0pOihpPWFyZ3VtZW50c1swXSxvPWFyZ3VtZW50c1sxXSk7dmFyIGE9ci5leHRlbmQoe30sdGhpcy5fb3B0aW9ucyxpKTt0aGlzLl9vcHRpb25zLmZpbHRlciYmaSYmaS5maWx0ZXImJihhLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbi5fb3B0aW9ucy5maWx0ZXIodCkmJmkuZmlsdGVyKHQpfSk7dmFyIGg9W107cmV0dXJuIHZvaWQgMCE9ZSYmaC5wdXNoKGUpLGgucHVzaChhKSxoLnB1c2gobyksdGhpcy5fZGF0YSYmdGhpcy5fZGF0YS5nZXQuYXBwbHkodGhpcy5fZGF0YSxoKX0sby5wcm90b3R5cGUuZ2V0SWRzPWZ1bmN0aW9uKHQpe3ZhciBlO2lmKHRoaXMuX2RhdGEpe3ZhciBpLG89dGhpcy5fb3B0aW9ucy5maWx0ZXI7aT10JiZ0LmZpbHRlcj9vP2Z1bmN0aW9uKGUpe3JldHVybiBvKGUpJiZ0LmZpbHRlcihlKX06dC5maWx0ZXI6byxlPXRoaXMuX2RhdGEuZ2V0SWRzKHtmaWx0ZXI6aSxvcmRlcjp0JiZ0Lm9yZGVyfSl9ZWxzZSBlPVtdO3JldHVybiBlfSxvLnByb3RvdHlwZS5tYXA9ZnVuY3Rpb24odCxlKXt2YXIgaT1bXTtpZih0aGlzLl9kYXRhKXt2YXIgbyxuPXRoaXMuX29wdGlvbnMuZmlsdGVyO289ZSYmZS5maWx0ZXI/bj9mdW5jdGlvbih0KXtyZXR1cm4gbih0KSYmZS5maWx0ZXIodCl9OmUuZmlsdGVyOm4saT10aGlzLl9kYXRhLm1hcCh0LHtmaWx0ZXI6byxvcmRlcjplJiZlLm9yZGVyfSl9ZWxzZSBpPVtdO3JldHVybiBpfSxvLnByb3RvdHlwZS5nZXREYXRhU2V0PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXM7dCBpbnN0YW5jZW9mIG87KXQ9dC5fZGF0YTtyZXR1cm4gdHx8bnVsbH0sby5wcm90b3R5cGUuX29uRXZlbnQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBvLG4scyxyLGE9ZSYmZS5pdGVtcyxoPVtdLGQ9W10sbD1bXSx1PVtdLGM9W10scD1bXTtpZihhJiZ0aGlzLl9kYXRhKXtzd2l0Y2godCl7Y2FzZVwiYWRkXCI6Zm9yKG89MCxuPWEubGVuZ3RoO288bjtvKyspcz1hW29dLChyPXRoaXMuZ2V0KHMpKSYmKHRoaXMuX2lkc1tzXT0hMCxoLnB1c2gocykpO2JyZWFrO2Nhc2VcInVwZGF0ZVwiOmZvcihvPTAsbj1hLmxlbmd0aDtvPG47bysrKXM9YVtvXSxyPXRoaXMuZ2V0KHMpLHI/dGhpcy5faWRzW3NdPyhkLnB1c2gocyksYy5wdXNoKGUuZGF0YVtvXSksdS5wdXNoKGUub2xkRGF0YVtvXSkpOih0aGlzLl9pZHNbc109ITAsaC5wdXNoKHMpKTp0aGlzLl9pZHNbc10mJihkZWxldGUgdGhpcy5faWRzW3NdLGwucHVzaChzKSxwLnB1c2goZS5vbGREYXRhW29dKSk7YnJlYWs7Y2FzZVwicmVtb3ZlXCI6Zm9yKG89MCxuPWEubGVuZ3RoO288bjtvKyspcz1hW29dLHRoaXMuX2lkc1tzXSYmKGRlbGV0ZSB0aGlzLl9pZHNbc10sbC5wdXNoKHMpLHAucHVzaChlLm9sZERhdGFbb10pKX10aGlzLmxlbmd0aCs9aC5sZW5ndGgtbC5sZW5ndGgsaC5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJhZGRcIix7aXRlbXM6aH0saSksZC5sZW5ndGgmJnRoaXMuX3RyaWdnZXIoXCJ1cGRhdGVcIix7aXRlbXM6ZCxvbGREYXRhOnUsZGF0YTpjfSxpKSxsLmxlbmd0aCYmdGhpcy5fdHJpZ2dlcihcInJlbW92ZVwiLHtpdGVtczpsLG9sZERhdGE6cH0saSl9fSxvLnByb3RvdHlwZS5vbj1hLnByb3RvdHlwZS5vbixvLnByb3RvdHlwZS5vZmY9YS5wcm90b3R5cGUub2ZmLG8ucHJvdG90eXBlLl90cmlnZ2VyPWEucHJvdG90eXBlLl90cmlnZ2VyLG8ucHJvdG90eXBlLnN1YnNjcmliZT1vLnByb3RvdHlwZS5vbixvLnByb3RvdHlwZS51bnN1YnNjcmliZT1vLnByb3RvdHlwZS5vZmYsdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU3KShcIndrc1wiKSxuPWkoNDApLHM9aSgxOCkuU3ltYm9sLHI9XCJmdW5jdGlvblwiPT10eXBlb2YgczsodC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBvW3RdfHwob1t0XT1yJiZzW3RdfHwocj9zOm4pKFwiU3ltYm9sLlwiK3QpKX0pLnN0b3JlPW99LGZ1bmN0aW9uKHQsZSxpKXtlLnByZXBhcmVFbGVtZW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiYodFtlXS
211675yZWR1bmRhbnQ9dFtlXS51c2VkLHRbZV0udXNlZD1bXSl9LGUuY2xlYW51cEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkmJnRbZV0ucmVkdW5kYW50KXtmb3IodmFyIGk9MDtpPHRbZV0ucmVkdW5kYW50Lmxlbmd0aDtpKyspdFtlXS5yZWR1bmRhbnRbaV0ucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0W2VdLnJlZHVuZGFudFtpXSk7dFtlXS5yZWR1bmRhbnQ9W119fSxlLnJlc2V0RWxlbWVudHM9ZnVuY3Rpb24odCl7ZS5wcmVwYXJlRWxlbWVudHModCksZS5jbGVhbnVwRWxlbWVudHModCksZS5wcmVwYXJlRWxlbWVudHModCl9LGUuZ2V0U1ZHRWxlbWVudD1mdW5jdGlvbih0LGUsaSl7dmFyIG87cmV0dXJuIGUuaGFzT3duUHJvcGVydHkodCk/ZVt0XS5yZWR1bmRhbnQubGVuZ3RoPjA/KG89ZVt0XS5yZWR1bmRhbnRbMF0sZVt0XS5yZWR1bmRhbnQuc2hpZnQoKSk6KG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIix0KSxpLmFwcGVuZENoaWxkKG8pKToobz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoXCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiLHQpLGVbdF09e3VzZWQ6W10scmVkdW5kYW50OltdfSxpLmFwcGVuZENoaWxkKG8pKSxlW3RdLnVzZWQucHVzaChvKSxvfSxlLmdldERPTUVsZW1lbnQ9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG47cmV0dXJuIGUuaGFzT3duUHJvcGVydHkodCk/ZVt0XS5yZWR1bmRhbnQubGVuZ3RoPjA/KG49ZVt0XS5yZWR1bmRhbnRbMF0sZVt0XS5yZWR1bmRhbnQuc2hpZnQoKSk6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSx2b2lkIDAhPT1vP2kuaW5zZXJ0QmVmb3JlKG4sbyk6aS5hcHBlbmRDaGlsZChuKSk6KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KSxlW3RdPXt1c2VkOltdLHJlZHVuZGFudDpbXX0sdm9pZCAwIT09bz9pLmluc2VydEJlZm9yZShuLG8pOmkuYXBwZW5kQ2hpbGQobikpLGVbdF0udXNlZC5wdXNoKG4pLG59LGUuZHJhd1BvaW50PWZ1bmN0aW9uKHQsaSxvLG4scyxyKXt2YXIgYTtpZihcImNpcmNsZVwiPT1vLnN0eWxlPyhhPWUuZ2V0U1ZHRWxlbWVudChcImNpcmNsZVwiLG4scyksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiY3hcIix0KSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjeVwiLGkpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcInJcIiwuNSpvLnNpemUpKTooYT1lLmdldFNWR0VsZW1lbnQoXCJyZWN0XCIsbixzKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsdC0uNSpvLnNpemUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcInlcIixpLS41Km8uc2l6ZSksYS5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvLnNpemUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcImhlaWdodFwiLG8uc2l6ZSkpLHZvaWQgMCE9PW8uc3R5bGVzJiZhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJzdHlsZVwiLG8uc3R5bGVzKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLG8uY2xhc3NOYW1lK1wiIHZpcy1wb2ludFwiKSxyKXt2YXIgaD1lLmdldFNWR0VsZW1lbnQoXCJ0ZXh0XCIsbixzKTtyLnhPZmZzZXQmJih0Kz1yLnhPZmZzZXQpLHIueU9mZnNldCYmKGkrPXIueU9mZnNldCksci5jb250ZW50JiYoaC50ZXh0Q29udGVudD1yLmNvbnRlbnQpLHIuY2xhc3NOYW1lJiZoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLHIuY2xhc3NOYW1lK1wiIHZpcy1sYWJlbFwiKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsdCksaC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwieVwiLGkpfXJldHVybiBhfSxlLmRyYXdCYXI9ZnVuY3Rpb24odCxpLG8sbixzLHIsYSxoKXtpZigwIT1uKXtuPDAmJihuKj0tMSxpLT1uKTt2YXIgZD1lLmdldFNWR0VsZW1lbnQoXCJyZWN0XCIscixhKTtkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsdC0uNSpvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ5XCIsaSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIixuKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLHMpLGgmJmQuc2V0QXR0cmlidXRlTlMobnVsbCxcInN0eWxlXCIsaCl9fX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pLGUucHJpbnRTdHlsZT12b2lkIDA7dmFyIG49aSgxOSkscz1vKG4pLHI9aSg2KSxhPW8ociksaD1pKDgpLGQ9byhoKSxsPWkoMCksdT1vKGwpLGM9aSgxKSxwPW8oYyksZj1pKDIpLG09ITEsdj12b2lkIDAsZz1cImJhY2tncm91bmQ6ICNGRmVlZWU7IGNvbG9yOiAjZGQwMDAwXCIseT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJ2YWxpZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXttPSExLHY9aTt2YXIgbj1pO3JldHVybiB2b2lkIDAhPT1vJiYobj1pW29dKSx0LnBhcnNlKGUsbixbXSksbX19LHtrZXk6XCJwYXJzZVwiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiZ0LmNoZWNrKG4sZSxpLG8pfX0se2tleTpcImNoZWNrXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8sbil7aWYodm9pZCAwPT09b1tlXSYmdm9pZCAwPT09by5fX2FueV9fKXJldHVybiB2b2lkIHQuZ2V0U3VnZ2VzdGlvbihlLG8sbik7dmFyIHM9ZSxyPSEwO3ZvaWQgMD09PW9bZV0mJnZvaWQgMCE9PW8uX19hbnlfXyYmKHM9XCJfX2FueV9fXCIscj1cIm9iamVjdFwiPT09dC5nZXRUeXBlKGlbZV0pKTt2YXIgYT1vW3NdO3ImJnZvaWQgMCE9PWEuX190eXBlX18mJihhPWEuX190eXBlX18pLHQuY2hlY2tGaWVsZHMoZSxpLG8scyxhLG4pfX0se2tleTpcImNoZWNrRmllbGRzXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8sbixzLHIpe3ZhciBhPWZ1bmN0aW9uKGkpe2NvbnNvbGUubG9nKFwiJWNcIitpK3QucHJpbnRMb2NhdGlvbihyLGUpLGcpfSxoPXQuZ2V0VHlwZShpW2VdKSxsPXNbaF07dm9pZCAwIT09bD9cImFycmF5XCI9PT10LmdldFR5cGUobCkmJi0xPT09bC5pbmRleE9mKGlbZV0pPyhhKCdJbnZhbGlkIG9wdGlvbiBkZXRlY3RlZCBpbiBcIicrZSsnXCIuIEFsbG93ZWQgdmFsdWVzIGFyZTonK3QucHJpbnQobCkrJyBub3QgXCInK2lbZV0rJ1wiLiAnKSxtPSEwKTpcIm9iamVjdFwiPT09aCYmXCJfX2FueV9fXCIhPT1uJiYocj1mLmNvcHlBbmRFeHRlbmRBcnJheShyLGUpLHQucGFyc2UoaVtlXSxvW25dLHIpKTp2b2lkIDA9PT1zLmFueSYmKGEoJ0ludmFsaWQgdHlwZSByZWNlaXZlZCBmb3IgXCInK2UrJ1wiLiBFeHBlY3RlZDogJyt0LnByaW50KCgwLGQuZGVmYXVsdCkocykpK1wiLiBSZWNlaXZlZCBbXCIraCsnXSBcIicraVtlXSsnXCInKSxtPSEwKX19LHtrZXk6XCJnZXRUeXBlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkodCk7cmV0dXJuXCJvYmplY3RcIj09PWU/bnVsbD09PXQ/XCJudWxsXCI6dCBpbnN0YW5jZW9mIEJvb2xlYW4/XCJib29sZWFuXCI6dCBpbnN0YW5jZW9mIE51bWJlcj9cIm51bWJlclwiOnQgaW5zdGFuY2VvZiBTdHJpbmc/XCJzdHJpbmdcIjpBcnJheS5pc0FycmF
211675KHQpP1wiYXJyYXlcIjp0IGluc3RhbmNlb2YgRGF0ZT9cImRhdGVcIjp2b2lkIDAhPT10Lm5vZGVUeXBlP1wiZG9tXCI6ITA9PT10Ll9pc0FNb21lbnRPYmplY3Q/XCJtb21lbnRcIjpcIm9iamVjdFwiOlwibnVtYmVyXCI9PT1lP1wibnVtYmVyXCI6XCJib29sZWFuXCI9PT1lP1wiYm9vbGVhblwiOlwic3RyaW5nXCI9PT1lP1wic3RyaW5nXCI6dm9pZCAwPT09ZT9cInVuZGVmaW5lZFwiOmV9fSx7a2V5OlwiZ2V0U3VnZ2VzdGlvblwiLHZhbHVlOmZ1bmN0aW9uKGUsaSxvKXt2YXIgbj10LmZpbmRJbk9wdGlvbnMoZSxpLG8sITEpLHM9dC5maW5kSW5PcHRpb25zKGUsdixbXSwhMCkscj12b2lkIDBcbiAgICA7cj12b2lkIDAhPT1uLmluZGV4TWF0Y2g/XCIgaW4gXCIrdC5wcmludExvY2F0aW9uKG4ucGF0aCxlLFwiXCIpKydQZXJoYXBzIGl0IHdhcyBpbmNvbXBsZXRlPyBEaWQgeW91IG1lYW46IFwiJytuLmluZGV4TWF0Y2grJ1wiP1xcblxcbic6cy5kaXN0YW5jZTw9NCYmbi5kaXN0YW5jZT5zLmRpc3RhbmNlP1wiIGluIFwiK3QucHJpbnRMb2NhdGlvbihuLnBhdGgsZSxcIlwiKStcIlBlcmhhcHMgaXQgd2FzIG1pc3BsYWNlZD8gTWF0Y2hpbmcgb3B0aW9uIGZvdW5kIGF0OiBcIit0LnByaW50TG9jYXRpb24ocy5wYXRoLHMuY2xvc2VzdE1hdGNoLFwiXCIpOm4uZGlzdGFuY2U8PTg/Jy4gRGlkIHlvdSBtZWFuIFwiJytuLmNsb3Nlc3RNYXRjaCsnXCI/Jyt0LnByaW50TG9jYXRpb24obi5wYXRoLGUpOlwiLiBEaWQgeW91IG1lYW4gb25lIG9mIHRoZXNlOiBcIit0LnByaW50KCgwLGQuZGVmYXVsdCkoaSkpK3QucHJpbnRMb2NhdGlvbihvLGUpLGNvbnNvbGUubG9nKCclY1Vua25vd24gb3B0aW9uIGRldGVjdGVkOiBcIicrZSsnXCInK3IsZyksbT0hMH19LHtrZXk6XCJmaW5kSW5PcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdJiZhcmd1bWVudHNbM10scz0xZTkscj1cIlwiLGE9W10saD1lLnRvTG93ZXJDYXNlKCksZD12b2lkIDA7Zm9yKHZhciBsIGluIGkpe3ZhciB1PXZvaWQgMDtpZih2b2lkIDAhPT1pW2xdLl9fdHlwZV9fJiYhMD09PW4pe3ZhciBjPXQuZmluZEluT3B0aW9ucyhlLGlbbF0sZi5jb3B5QW5kRXh0ZW5kQXJyYXkobyxsKSk7cz5jLmRpc3RhbmNlJiYocj1jLmNsb3Nlc3RNYXRjaCxhPWMucGF0aCxzPWMuZGlzdGFuY2UsZD1jLmluZGV4TWF0Y2gpfWVsc2UtMSE9PWwudG9Mb3dlckNhc2UoKS5pbmRleE9mKGgpJiYoZD1sKSx1PXQubGV2ZW5zaHRlaW5EaXN0YW5jZShlLGwpLHM+dSYmKHI9bCxhPWYuY29weUFycmF5KG8pLHM9dSl9cmV0dXJue2Nsb3Nlc3RNYXRjaDpyLHBhdGg6YSxkaXN0YW5jZTpzLGluZGV4TWF0Y2g6ZH19fSx7a2V5OlwicHJpbnRMb2NhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTpcIlByb2JsZW0gdmFsdWUgZm91bmQgYXQ6IFxcblwiLG89XCJcXG5cXG5cIitpK1wib3B0aW9ucyA9IHtcXG5cIixuPTA7bjx0Lmxlbmd0aDtuKyspe2Zvcih2YXIgcz0wO3M8bisxO3MrKylvKz1cIiAgXCI7bys9dFtuXStcIjoge1xcblwifWZvcih2YXIgcj0wO3I8dC5sZW5ndGgrMTtyKyspbys9XCIgIFwiO28rPWUrXCJcXG5cIjtmb3IodmFyIGE9MDthPHQubGVuZ3RoKzE7YSsrKXtmb3IodmFyIGg9MDtoPHQubGVuZ3RoLWE7aCsrKW8rPVwiICBcIjtvKz1cIn1cXG5cIn1yZXR1cm4gbytcIlxcblxcblwifX0se2tleTpcInByaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuKDAscy5kZWZh
21167dWx0KSh0KS5yZXBsYWNlKC8oXFxcIil8KFxcWyl8KFxcXSl8KCxcIl9fdHlwZV9fXCIpL2csXCJcIikucmVwbGFjZSgvKFxcLCkvZyxcIiwgXCIpfX0se2tleTpcImxldmVuc2h0ZWluRGlzdGFuY2VcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4gZS5sZW5ndGg7aWYoMD09PWUubGVuZ3RoKXJldHVybiB0Lmxlbmd0aDt2YXIgaSxvPVtdO2ZvcihpPTA7aTw9ZS5sZW5ndGg7aSsrKW9baV09W2ldO3ZhciBuO2ZvcihuPTA7bjw9dC5sZW5ndGg7bisrKW9bMF1bbl09bjtmb3IoaT0xO2k8PWUubGVuZ3RoO2krKylmb3Iobj0xO248PXQubGVuZ3RoO24rKyllLmNoYXJBdChpLTEpPT10LmNoYXJBdChuLTEpP29baV1bbl09b1tpLTFdW24tMV06b1tpXVtuXT1NYXRoLm1pbihvW2ktMV1bbi0xXSsxLE1hdGgubWluKG9baV1bbi0xXSsxLG9baS0xXVtuXSsxKSk7cmV0dXJuIG9bZS5sZW5ndGhdW3QubGVuZ3RoXX19XSksdH0oKTtlLmRlZmF1bHQ9eSxlLnByaW50U3R5bGU9Z30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLm9wdGlvbnM9bnVsbCx0aGlzLnByb3BzPW51bGx9dmFyIG49aSgyKTtvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJm4uZXh0ZW5kKHRoaXMub3B0aW9ucyx0KX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7cmV0dXJuITF9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LG8ucHJvdG90eXBlLl9pc1Jlc2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLl9wcmV2aW91c1dpZHRoIT09dGhpcy5wcm9wcy53aWR0aHx8dGhpcy5wcm9wcy5fcHJldmlvdXNIZWlnaHQhPT10aGlzLnByb3BzLmhlaWdodDtyZXR1cm4gdGhpcy5wcm9wcy5fcHJldmlvdXNXaWR0aD10aGlzLnByb3BzLndpZHRoLHRoaXMucHJvcHMuX3ByZXZpb3VzSGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0LHR9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxOCksbj1pKDcpLHM9aSg4MCkscj1pKDI2KSxhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgaCxkLGwsdT10JmEuRixjPXQmYS5HLHA9dCZhLlMsZj10JmEuUCxtPXQmYS5CLHY9dCZhLlcsZz1jP246bltlXXx8KG5bZV09e30pLHk9Zy5wcm90b3R5cGUsYj1jP286cD9vW2VdOihvW2VdfHx7fSkucHJvdG90eXBlO2MmJihpPWUpO2ZvcihoIGluIGkpKGQ9IXUmJmImJnZvaWQgMCE9PWJbaF0pJiZoIGluIGd8fChsPWQ/YltoXTppW2hdLGdbaF09YyYmXCJmdW5jdGlvblwiIT10eXBlb2YgYltoXT9pW2hdOm0mJmQ/cyhsLG8pOnYmJmJbaF09PWw/ZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24oZSxpLG8pe2lmKHRoaXMgaW5zdGFuY2VvZiB0KXtzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBuZXcgdDtjYXNlIDE6cmV0dXJuIG5ldyB0KGUpO2Nhc2UgMjpyZXR1cm4gbmV3IHQoZSxpKX1yZXR1cm4gbmV3IHQoZSxpLG8pfXJldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX07cmV0dXJuIGUucHJvdG90eXBlPXQucHJvdG90eXBlLGV9KGwpOmYmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGw/cyhGdW5jdGlvbi5jYWxsLGwpOmwsZiYmKChnLnZpcnR1YWx8fChnLnZpcnR1YWw9e30pKVtoXT1sLHQmYS5SJiZ5JiYheVtoXSYmcih5LGgsbCkpKX07YS5GPTEsYS5HPTIsYS5TPTQsYS5QPTgsYS5CPTE2LGEuVz0zMixhLlU9NjQsYS5SPTEyOCx0LmV4cG9ydHM9YX0sZnVuY3Rpb24odCxlKXt2YXIgaT10LmV4cG9ydHM9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93Lk1hdGg9PU1hdGg/d2luZG93OlwidW5kZWZpbmVkXCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbihcInJldHVybiB0aGlzXCIpKCk7XCJudW1iZXJcIj09dHlwZW9mIF9fZyYmKF9fZz1pKX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDE2MCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDI3KSxuPWkoODEpLHM9aSg1Mykscj1PYmplY3QuZGVmaW5lUHJvcGVydHk7ZS5mPWkoMjEpP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbih0LGUsaSl7aWYobyh0KSxlPXMoZSwhMCksbyhpKSxuKXRyeXtyZXR1cm4gcih0LGUsaSl9Y2F0Y2godCl7fWlmKFwiZ2V0XCJpbiBpfHxcInNldFwiaW4gaSl0aHJvdyBUeXBlRXJyb3IoXCJBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCFcIik7cmV0dXJuXCJ2YWx1ZVwiaW4gaSYmKHRbZV09aS52YWx1ZSksdH19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9IWkoMjgpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSxcImFcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbih0LGUpe3ZhciBpPXt9Lmhhc093blByb3BlcnR5O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiBpLmNhbGwodCxlKX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDYpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLGEuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9aSx0aGlzLmxhYmVsTW9kdWxlPW8sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMudG9wPXZvaWQgMCx0aGlzLmxlZnQ9dm9pZCAwLHRoaXMuaGVpZ2h0PXZvaWQgMCx0aGlzLndpZHRoPXZvaWQgMCx0aGlzLnJhZGl1cz12b2lkIDAsdGhpcy5tYXJnaW49dm9pZCAwLHRoaXMucmVmcmVzaE5lZWRlZD0hMCx0aGlzLmJvdW5kaW5nQm94PXt0b3A6MCxsZWZ0OjAscmlnaHQ6MCxib3R0b206MH19cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleTpcIl9zZXRNYXJnaW5zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5tYXJnaW49e30sdGhpcy5vcHRpb25zLm1hcmdpbiYmKFwib2JqZWN0XCI9PSgwLHMuZGVmYXVsdCkodGhpcy5vcHRpb25zLm1hcmdpbik/KHRoaXMubWFyZ2luLnRvcD10aGlzLm9wdGlvbnMubWFyZ2luLnRvcCx0aGlzLm1hcmdpbi5yaWdodD10aGlzLm9wdGlvbnMubWFyZ2luLnJpZ2h0LHRoaXMubWFyZ2luLmJvdHRvbT10aGlzLm9wdGlvbnMubWFyZ2luLmJvdHRvbSx0aGlzLm1hcmdpbi5sZWZ0PXRoaXMub3B0aW9ucy5tYXJnaW4ubGVmdCk6KHRoaXMubWFyZ2luLnRvcD10aGlzLm9wdGlvbnMubWFyZ2luLHRoaXMubWFyZ2luLnJpZ2h0PXRoaXMub3B0aW9ucy5tYXJnaW4sdGhpcy5tYXJnaW4uYm90dG9tPXRoaXMub3B0aW9ucy5tYXJnaW4sdGhpcy5tYXJnaW4ubGVmdD10aGlzLm9wdGlvbnMubWFyZ2luKSksdC5hZGp1c3RTaXplcyh0aGlzLm1hcmdpbil9fSx7a2V5OlwiX2Rpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aDtyZXR1cm4gdGhpcy5yZXNpemUodCksTWF0aC5taW4oTWF0aC5hYnModGhpcy53aWR0aC8yL01hdGguY29zKGUpKSxNYXRoLmFicyh0aGlzLmhlaWdodC8yL01hdGguc2luKGUpKSkraX19LHtrZXk6XCJlbmFibGVTaGFkb3dcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Uuc2hhZG93JiYodC5zaGFkb3dDb2xvcj1lLnNoYWRvd0NvbG9yLHQuc2hhZG93Qmx1cj1lLnNoYWRvd1NpemUsdC5zaGFkb3dPZmZzZXRYPWUuc2hhZG93WCx0LnNoYWRvd09mZnNldFk9ZS5zaGFkb3dZKX19LHtrZXk6XCJkaXNhYmxlU2hhZG93XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtlLnNoYWRvdyYmKHQuc2hhZG93Q29sb3I9XCJyZ2JhKDAsMCwwLDApXCIsdC5zaGFkb3dCbHVyPTAsdC5zaGFkb3dPZmZzZXRYPTAsdC5zaGFkb3dPZmZzZXRZPTApfX0se2tleTpcImVuYWJsZUJvcmRlckRhc2hlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoITEhPT1lLmJvcmRlckRhc2hlcylpZih2b2lkIDAhPT10LnNldExpbmVEYXNoKXt2YXIgaT1lLmJvcmRlckRhc2hlczshMD09PWkmJihpPVs1LDE1XSksdC5zZXRMaW5lRGFzaChpKX1lbHNlIGNvbnNvbGUud2FybihcInNldExpbmVEYXNoIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBicm93c2VyLiBUaGUgZGFzaGVkIGJvcmRlcnMgY2Fubm90IGJlIHVzZWQuXCIpLHRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyRGFzaGVzPSExLGUuYm9yZGVyRGFzaGVzPSExfX0se2tleTpcImRpc2FibGVCb3JkZXJEYXNoZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpeyExIT09ZS5ib3JkZXJEYXNoZXMmJih2b2lkIDAhPT10LnNldExpbmVEYXNoP3Quc2V0TGluZURhc2goWzBdKTooY29uc29sZS53YXJuKFwic2V0TGluZURhc2ggaXMgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGJyb3dzZXIuIFRoZSBkYXNoZWQgYm9yZGVycyBjYW5ub3QgYmUgdXNlZC5cIiksdGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy5ib3JkZXJEYXNoZXM9ITEsZS5ib3JkZXJEYXNoZXM9ITEpKX19LHtrZXk6XCJuZWVkc1JlZnJlc2hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiEwPT09dGhpcy5yZWZyZXNoTmVlZGVkPyh0aGlzLnJlZnJlc2hOZWVkZWQ9IT
21167EsITApOnZvaWQgMD09PXRoaXMud2lkdGh8fHRoaXMubGFiZWxNb2R1bGUuZGlmZmVyZW50U3RhdGUodCxlKX19LHtrZXk6XCJpbml0Q29udGV4dEZvckRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWUuYm9yZGVyV2lkdGgvdGhpcy5ib2R5LnZpZXcuc2NhbGU7dC5saW5lV2lkdGg9TWF0aC5taW4odGhpcy53aWR0aCxpKSx0LnN0cm9rZVN0eWxlPWUuYm9yZGVyQ29sb3IsdC5maWxsU3R5bGU9ZS5jb2xvcn19LHtrZXk6XCJwZXJmb3JtU3Ryb2tlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1lLmJvcmRlcldpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlO3Quc2F2ZSgpLGk+MCYmKHRoaXMuZW5hYmxlQm9yZGVyRGFzaGVzKHQsZSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVCb3JkZXJEYXNoZXModCxlKSksdC5yZXN0b3JlKCl9fSx7a2V5OlwicGVyZm9ybUZpbGxcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5maWxsKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSksdGhpcy5wZXJmb3JtU3Ryb2tlKHQsZSl9fSx7a2V5OlwiX2FkZEJvdW5kaW5nQm94TWFyZ2luXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5ib3VuZGluZ0JveC5sZWZ0LT10LHRoaXMuYm91bmRpbmdCb3gudG9wLT10LHRoaXMuYm91bmRpbmdCb3guYm90dG9tKz10LHRoaXMuYm91bmRpbmdCb3gucmlnaHQrPXR9fSx7a2V5OlwiX3VwZGF0ZUJvdW5kaW5nQm94XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2b2lkIDAhPT1pJiZ0aGlzLnJlc2l6ZShpLG8sbiksdGhpcy5sZWZ0PXQtdGhpcy53aWR0aC8yLHRoaXMudG9wPWUtdGhpcy5oZWlnaHQvMix0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dGhpcy5sZWZ0LHRoaXMuYm91bmRpbmdCb3gudG9wPXRoaXMudG9wLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPXRoaXMudG9wK3RoaXMuaGVpZ2h0LHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dGhpcy5sZWZ0K3RoaXMud2lkdGh9fSx7a2V5OlwidXBkYXRlQm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMuX3VwZGF0ZUJvdW5kaW5nQm94KHQsZSxpLG8sbil9fSx7a2V5OlwiZ2V0RGltZW5zaW9uc0Zyb21MYWJlbFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLnRleHRTaXplPXRoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxlLGkpO3ZhciBvPXRoaXMudGV4dFNpemUud2lkdGgsbj10aGlzLnRleHRTaXplLmhlaWdodDtyZXR1cm4gMD09PW8mJihvPTE0LG49MTQpLHt3aWR0aDpvLGhlaWdodDpufX19XSksdH0oKTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDIzKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXIsbz1hcmd1bWVudHMubGVuZ3RoPjMmJnZvaWQgMCE9PWFyZ3VtZW50c1szXT9hcmd1bWVudHNbM106e3NpemU6dGhpcy5vcHRpb25zLnNpemV9O2lmKHRoaXMubmVlZHNSZWZyZXNoKGUsaSkpe3RoaXMubGFiZWxNb2R1bGUuZ2V0VGV4dFNpemUodCxlLGkpO3ZhciBuPTIqby5zaXplO3RoaXMud2lkdGg9bix0aGlzLmhlaWdodD1uLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fX0se2tleTpcIl9kcmF3U2hhcGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyxyLGEpe2lmKHRoaXMucmVzaXplKHQscyxyLGEpLHRoaXMubGVmdD1vLXRoaXMud2lkdGgvMix0aGlzLnRvcD1uLXRoaXMuaGVpZ2h0LzIsdGhpcy5pbml0Q29udGV4dEZvckRyYXcodCxhKSx0W2VdKG8sbixhLnNpemUpLHRoaXMucGVyZm9ybUZpbGwodCxhKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwpe3RoaXMubGFiZWxNb2R1bGUuY2FsY3VsYXRlTGFiZWxTaXplKHQscyxyLG8sbixcImhhbmdpbmdcIik7dmFyIGg9bisuNSp0aGlzLmhlaWdodCsuNSp0aGlzLmxhYmVsTW9kdWxlLnNpemUuaGVpZ2h0O3RoaXMubGFiZWxNb2R1bGUuZHJhdyh0LG8saCxzLHIsXCJoYW5naW5nXCIpfXRoaXMudXBkYXRlQm91bmRpbmdCb3gobyxuKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5ib3VuZGluZ0JveC50b3A9ZS10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSt0aGlzLm9wdGlvbnMuc2l6ZSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aD4wJiYodGhpcy5ib3VuZGluZ0JveC5sZWZ0PU1hdGgubWluKHRoaXMuYm91bmRpbmdCb3gubGVmdCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCksdGhpcy5ib3VuZGluZ0JveC5yaWdodD1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LnJpZ2h0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0K3RoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aCksdGhpcy5ib3VuZGluZ0JveC5ib3R0b209TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5ib3R0b20sdGhpcy5ib3VuZGluZ0JveC5ib3R0b20rdGhpcy5sYWJlbE1vZHVsZS5zaXplLmhlaWdodCkpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg3OCksbj1pKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG8obih0KSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMCksbj1pKDM5KTt0LmV4cG9ydHM9aSgyMSk/ZnVuY3Rpb24odCxlLGkpe3JldHVybiBvLmYodCxlLG4oMSxpKSl9OmZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdFtlXT1pLHR9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKCFvKHQpKXRocm93IFR5cGVFcnJvcih0K1wiIGlzIG5vdCBhbiBvYmplY3QhXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiEhdCgpfWNhdGNoKHQpe3JldHVybiEwfX19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxMzgpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZS5fX2VzTW9kdWxlPSEwO3ZhciBuPWkoMTg4KSxzPW8obikscj1pKDc3KSxhPW8ocik7ZS5kZWZhdWx0PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZhciBpPVtdLG89ITAsbj0hMSxzPXZvaWQgMDt0cnl7Zm9yKHZhciByLGg9KDAsYS5kZWZhdWx0KSh0KTshKG89KHI9aC5uZXh0KCkpLmRvbmUpJiYoaS5wdXNoKHIudmFsdWUpLCFlfHxpLmxlbmd0aCE9PWUpO289ITApO31jYXRjaCh0KXtuPSEwLHM9dH1maW5hbGx5e3RyeXshbyYmaC5yZXR1cm4mJmgucmV0dXJuKCl9ZmluYWxseXtpZihuKXRocm93IHN9fXJldHVybiBpfXJldHVybiBmdW5jdGlvbihlLGkpe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGU7aWYoKDAscy5kZWZhdWx0KShPYmplY3QoZSkpKXJldHVybiB0KGUsaSk7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIil9fSgpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz17fX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuXCJvYmplY3RcIj09dHlwZW9mIHQ/bnVsbCE9PXQ6XCJmdW5jdGlvblwiPT10eXBlb2YgdH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDg0KSxuPWkoNTgpO3QuZXhwb3J0cz1PYmplY3Qua2V5c3x8ZnVuY3Rpb24odCl7cmV0dXJuIG8odCxuKX19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXt0aGlzLng9dm9pZCAwIT09dD90OjAsdGhpcy55PXZvaWQgMCE9PWU/ZTowLHRoaXMuej12b2lkIDAhPT1pP2k6MH1vLnN1YnRyYWN0PWZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IG87cmV0dXJuIGkueD10LngtZS54LGkueT10LnktZS55LGkuej10LnotZS56LGl9LG8uYWRkPWZ1bmN0aW9uKHQsZSl7dmFyIGk9bmV3IG87cmV0dXJuIGkueD10LngrZS54LGkueT10LnkrZS55LGkuej10LnorZS56LGl9LG8uYXZnPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5ldyBvKCh0LngrZS54KS8yLCh0LnkrZS55KS8yLCh0LnorZS56KS8yKX0sby5jcm9zc1Byb2R1Y3Q9ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgbztyZXR1cm4gaS54PXQueSplLnotdC56KmUueSxpLnk9dC56KmUueC10LngqZS56LGkuej10LngqZS55LXQueSplLngsaX0sby5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzOyFmdW5jdGlvbihpLHIpe249W10sbz1yLHZvaWQgMCE9PShzPVwiZnVuY3Rpb25cIj09dHlwZW9mIG8/by5hcHBseShlLG4pOm8pJiYodC5leHBvcnRzPXMpfSgwLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt2YXIgZSxpPXQmJnQucHJldmVudERlZmF1bHR8fCExLG89dCYmdC5jb250YWluZXJ8fHdpbmRvdyxuPXt9LHM9e2tleWRvd246e30sa2V5dXA6e319LHI9e307Zm9yKGU9OTc7ZTw9MTIyO2UrKylyW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldPXtjb2RlOmUtOTcrNjUsc2hpZnQ6ITF9O2ZvcihlPTY1O2
21167U8PTkwO2UrKylyW1N0cmluZy5mcm9tQ2hhckNvZGUoZSldPXtjb2RlOmUsc2hpZnQ6ITB9O2ZvcihlPTA7ZTw9OTtlKyspcltcIlwiK2VdPXtjb2RlOjQ4K2Usc2hpZnQ6ITF9O2ZvcihlPTE7ZTw9MTI7ZSsrKXJbXCJGXCIrZV09e2NvZGU6MTExK2Usc2hpZnQ6ITF9O2ZvcihlPTA7ZTw9OTtlKyspcltcIm51bVwiK2VdPXtjb2RlOjk2K2Usc2hpZnQ6ITF9O3JbXCJudW0qXCJdPXtjb2RlOjEwNixzaGlmdDohMX0scltcIm51bStcIl09e2NvZGU6MTA3LHNoaWZ0OiExfSxyW1wibnVtLVwiXT17Y29kZToxMDksc2hpZnQ6ITF9LHJbXCJudW0vXCJdPXtjb2RlOjExMSxzaGlmdDohMX0scltcIm51bS5cIl09e2NvZGU6MTEwLHNoaWZ0OiExfSxyLmxlZnQ9e2NvZGU6Mzcsc2hpZnQ6ITF9LHIudXA9e2NvZGU6Mzgsc2hpZnQ6ITF9LHIucmlnaHQ9e2NvZGU6Mzksc2hpZnQ6ITF9LHIuZG93bj17Y29kZTo0MCxzaGlmdDohMX0sci5zcGFjZT17Y29kZTozMixzaGlmdDohMX0sci5lbnRlcj17Y29kZToxMyxzaGlmdDohMX0sci5zaGlmdD17Y29kZToxNixzaGlmdDp2b2lkIDB9LHIuZXNjPXtjb2RlOjI3LHNoaWZ0OiExfSxyLmJhY2tzcGFjZT17Y29kZTo4LHNoaWZ0OiExfSxyLnRhYj17Y29kZTo5LHNoaWZ0OiExfSxyLmN0cmw9e2NvZGU6MTcsc2hpZnQ6ITF9LHIuYWx0PXtjb2RlOjE4LHNoaWZ0OiExfSxyLmRlbGV0ZT17Y29kZTo0NixzaGlmdDohMX0sci5wYWdldXA9e2NvZGU6MzMsc2hpZnQ6ITF9LHIucGFnZWRvd249e2NvZGU6MzQsc2hpZnQ6ITF9LHJbXCI9XCJdPXtjb2RlOjE4NyxzaGlmdDohMX0scltcIi1cIl09e2NvZGU6MTg5LHNoaWZ0OiExfSxyW1wiXVwiXT17Y29kZToyMjEsc2hpZnQ6ITF9LHJbXCJbXCJdPXtjb2RlOjIxOSxzaGlmdDohMX07dmFyIGE9ZnVuY3Rpb24odCl7ZCh0LFwia2V5ZG93blwiKX0saD1mdW5jdGlvbih0KXtkKHQsXCJrZXl1cFwiKX0sZD1mdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXNbZV1bdC5rZXlDb2RlXSl7Zm9yKHZhciBvPXNbZV1bdC5rZXlDb2RlXSxuPTA7bjxvLmxlbmd0aDtuKyspdm9pZCAwPT09b1tuXS5zaGlmdD9vW25dLmZuKHQpOjE9PW9bbl0uc2hpZnQmJjE9PXQuc2hpZnRLZXk/b1tuXS5mbih0KTowPT1vW25dLnNoaWZ0JiYwPT10LnNoaWZ0S2V5JiZvW25dLmZuKHQpOzE9PWkmJnQucHJldmVudERlZmF1bHQoKX19O3JldHVybiBuLmJpbmQ9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMD09PWkmJihpPVwia2V5ZG93blwiKSx2b2lkIDA9PT1yW3RdKXRocm93IG5ldyBFcnJvcihcInVuc3VwcG9ydGVkIGtleTogXCIrdCk7dm9pZCAwPT09c1tpXVtyW3RdLmNvZGVdJiYoc1tpXVtyW3RdLmNvZGVdPVtdKSxzW2ldW3JbdF0uY29kZV0ucHVzaCh7Zm46ZSxzaGlmdDpyW3RdLnNoaWZ0fSl9LG4uYmluZEFsbD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PWUmJihlPVwia2V5ZG93blwiKTtmb3IodmFyIGkgaW4gcilyLmhhc093blByb3BlcnR5KGkpJiZuLmJpbmQoaSx0LGUpfSxuLmdldEtleT1mdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gcilpZihyLmhhc093blByb3BlcnR5KGUpKXtpZigxPT10LnNoaWZ0S2V5JiYxPT1yW2VdLnNoaWZ0JiZ0LmtleUNvZGU9PXJbZV0uY29kZSlyZXR1cm4gZTtpZigwPT10LnNoaWZ0S2V5JiYwPT1yW2VdLnNoaWZ0JiZ0LmtleUNvZGU9PXJbZV0uY29kZSlyZXR1cm4gZTtpZih0LmtleUNvZGU9PXJbZV0uY29kZSYmXCJzaGlmdFwiPT1lKXJldHVybi
21167BlfXJldHVyblwidW5rbm93biBrZXksIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkXCJ9LG4udW5iaW5kPWZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDA9PT1pJiYoaT1cImtleWRvd25cIiksdm9pZCAwPT09clt0XSl0aHJvdyBuZXcgRXJyb3IoXCJ1bnN1cHBvcnRlZCBrZXk6IFwiK3QpO2lmKHZvaWQgMCE9PWUpe3ZhciBvPVtdLG49c1tpXVtyW3RdLmNvZGVdO2lmKHZvaWQgMCE9PW4pZm9yKHZhciBhPTA7YTxuLmxlbmd0aDthKyspblthXS5mbj09ZSYmblthXS5zaGlmdD09clt0XS5zaGlmdHx8by5wdXNoKHNbaV1bclt0XS5jb2RlXVthXSk7c1tpXVtyW3RdLmNvZGVdPW99ZWxzZSBzW2ldW3JbdF0uY29kZV09W119LG4ucmVzZXQ9ZnVuY3Rpb24oKXtzPXtrZXlkb3duOnt9LGtleXVwOnt9fX0sbi5kZXN0cm95PWZ1bmN0aW9uKCl7cz17a2V5ZG93bjp7fSxrZXl1cDp7fX0sby5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLGEsITApLG8ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsaCwhMCl9LG8uYWRkRXZlbnRMaXN0ZW5lcihcImtleWRvd25cIixhLCEwKSxvLmFkZEV2ZW50TGlzdGVuZXIoXCJrZXl1cFwiLGgsITApLG59cmV0dXJuIHR9KX0sZnVuY3Rpb24odCxlLGkpe2UuY29udmVydEhpZGRlbk9wdGlvbnM9ZnVuY3Rpb24odCxpLG8pe2lmKG8mJiFBcnJheS5pc0FycmF5KG8pKXJldHVybiBlLmNvbnZlcnRIaWRkZW5PcHRpb25zKHQsaSxbb10pO2lmKGkuaGlkZGVuRGF0ZXM9W10sbyYmMT09QXJyYXkuaXNBcnJheShvKSl7Zm9yKHZhciBuPTA7bjxvLmxlbmd0aDtuKyspaWYodm9pZCAwPT09b1tuXS5yZXBlYXQpe3ZhciBzPXt9O3Muc3RhcnQ9dChvW25dLnN0YXJ0KS50b0RhdGUoKS52YWx1ZU9mKCkscy5lbmQ9dChvW25dLmVuZCkudG9EYXRlKCkudmFsdWVPZigpLGkuaGlkZGVuRGF0ZXMucHVzaChzKX1pLmhpZGRlbkRhdGVzLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zdGFydC1lLnN0YXJ0fSl9fSxlLnVwZGF0ZUhpZGRlbkRhdGVzPWZ1bmN0aW9uKHQsaSxvKXtpZihvJiYhQXJyYXkuaXNBcnJheShvKSlyZXR1cm4gZS51cGRhdGVIaWRkZW5EYXRlcyh0LGksW29dKTtpZihvJiZ2b2lkIDAhPT1pLmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci53aWR0aCl7ZS5jb252ZXJ0SGlkZGVuT3B0aW9ucyh0LGksbyk7Zm9yKHZhciBuPXQoaS5yYW5nZS5zdGFydCkscz10KGkucmFuZ2UuZW5kKSxyPWkucmFuZ2UuZW5kLWkucmFuZ2Uuc3RhcnQsYT1yL2kuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLndpZHR
21167oLGg9MDtoPG8ubGVuZ3RoO2grKylpZih2b2lkIDAhPT1vW2hdLnJlcGVhdCl7dmFyIGQ9dChvW2hdLnN0YXJ0KSxsPXQob1toXS5lbmQpO2lmKFwiSW52YWxpZCBEYXRlXCI9PWQuX2QpdGhyb3cgbmV3IEVycm9yKFwiU3VwcGxpZWQgc3RhcnQgZGF0ZSBpcyBub3QgdmFsaWQ6IFwiK29baF0uc3RhcnQpO2lmKFwiSW52YWxpZCBEYXRlXCI9PWwuX2QpdGhyb3cgbmV3IEVycm9yKFwiU3VwcGxpZWQgZW5kIGRhdGUgaXMgbm90IHZhbGlkOiBcIitvW2hdLmVuZCk7dmFyIHU9bC1kO2lmKHU+PTQqYSl7dmFyIGM9MCxwPXMuY2xvbmUoKTtzd2l0Y2gob1toXS5yZXBlYXQpe2Nhc2VcImRhaWx5XCI6ZC5kYXkoKSE9bC5kYXkoKSYmKGM9MSksZC5kYXlPZlllYXIobi5kYXlPZlllYXIoKSksZC55ZWFyKG4ueWVhcigpKSxkLnN1YnRyYWN0KDcsXCJkYXlzXCIpLGwuZGF5T2ZZZWFyKG4uZGF5T2ZZZWFyKCkpLGwueWVhcihuLnllYXIoKSksbC5zdWJ0cmFjdCg3LWMsXCJkYXlzXCIpLHAuYWRkKDEsXCJ3ZWVrc1wiKTticmVhaztjYXNlXCJ3ZWVrbHlcIjp2YXIgZj1sLmRpZmYoZCxcImRheXNcIiksbT1kLmRheSgpO2QuZGF0ZShuLmRhdGUoKSksZC5tb250aChuLm1vbnRoKCkpLGQueWVhcihuLnllYXIoKSksbD1kLmNsb25lKCksZC5kYXkobSksbC5kYXkobSksbC5hZGQoZixcImRheXNcIiksZC5zdWJ0cmFjdCgxLFwid2Vla3NcIiksbC5zdWJ0cmFjdCgxLFwid2Vla3NcIikscC5hZGQoMSxcIndlZWtzXCIpO2JyZWFrO2Nhc2VcIm1vbnRobHlcIjpkLm1vbnRoKCkhPWwubW9udGgoKSYmKGM9MSksZC5tb250aChuLm1vbnRoKCkpLGQueWVhcihuLnllYXIoKSksZC5zdWJ0cmFjdCgxLFwibW9udGhzXCIpLGwubW9udGgobi5tb250aCgpKSxsLnllYXIobi55ZWFyKCkpLGwuc3VidHJhY3QoMSxcIm1vbnRoc1wiKSxsLmFkZChjLFwibW9udGhzXCIpLHAuYWRkKDEsXCJtb250aHNcIik7YnJlYWs7Y2FzZVwieWVhcmx5XCI6ZC55ZWFyKCkhPWwueWVhcigpJiYoYz0xKSxkLnllYXIobi55ZWFyKCkpLGQuc3VidHJhY3QoMSxcInllYXJzXCIpLGwueWVhcihuLnllYXIoKSksbC5zdWJ0cmFjdCgxLFwieWVhcnNcIiksbC5hZGQoYyxcInllYXJzXCIpLHAuYWRkKDEsXCJ5ZWFyc1wiKTticmVhaztkZWZhdWx0OnJldHVybiB2b2lkIGNvbnNvbGUubG9nKFwiV3JvbmcgcmVwZWF0IGZvcm1hdCwgYWxsb3dlZCBhcmU6IGRhaWx5LCB3ZWVrbHksIG1vbnRobHksIHllYXJseS4gR2l2ZW46XCIsb1toXS5yZXBlYXQpfWZvcig7ZDxwOylzd2l0Y2goaS5oaWRkZW5EYXRlcy5wdXNoKHtzdGFydDpkLnZhbHVlT2YoKSxlbmQ6bC52YWx1ZU9mKCl9KSxvW2hdLnJlcGVhdCl7Y2FzZVwiZGFpbHlcIjpkLmFkZCgxLFwiZGF5c1wiKSxsLmFkZCgxLFwiZGF5c1wiKTticmVhaztjYXNlXCJ3ZWVrbHlcIjpkLmFkZCgxLFwid2Vla3NcIiksbC5hZGQoMSxcIndlZWtzXCIpO2JyZWFrO2Nhc2VcIm1vbnRobHlcIjpkLmFkZCgxLFwibW9udGhzXCIpLGwuYWRkKDEsXCJtb250aHNcIik7YnJlYWs7Y2FzZVwieWVhcmx5XCI6ZC5hZGQoMSxcInlcIiksbC5hZGQoMSxcInlcIik7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdm9pZCBjb25zb2xlLmxvZyhcIldyb25nIHJlcGVhdCBmb3JtYXQsIGFsbG93ZWQgYXJlOiBkYWlseSwgd2Vla2x5LCBtb250aGx5LCB5ZWFybHkuIEdpdmVuOlwiLG9baF0ucmVwZWF0KX1pLmhpZGRlbkRhdGVzLnB1c2goe3N0YXJ0OmQudmFsdWVPZigpLGVuZDpsLnZhbHVlT2YoKX0pfX1lLnJlbW92ZUR1cGxpY2F0ZXMoaSk7dmFyIHY9ZS5pc0hpZGRlbihpLnJhbmdlLnN0YXJ0LGkuaGlkZGVuRGF0ZXMpLGc9ZS5pc0hpZGRlbihpLnJhbmdlLmVuZCxpLmhpZGRlbkRhdGVzKSx5PWkucmFuZ2Uuc3RhcnQsYj1pLnJhbmdlLmVuZDsxPT12LmhpZGRlbiYmKHk9MT09aS5yYW5nZS5zdGFydFRvRnJvbnQ/di5zdGFydERhdGUtMTp2LmVuZERhdGUrMSksMT09Zy5oaWRkZW4mJihiPTE9PWkucmFuZ2UuZW5kVG9Gcm9udD9nLnN0YXJ0RGF0ZS0xOmcuZW5kRGF0ZSsxKSwxIT12LmhpZGRlbiYmMSE9Zy5oaWRkZW58fGkucmFuZ2UuX2FwcGx5UmFuZ2UoeSxiKX19LGUucmVtb3ZlRHVwbGljYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC5oaWRkZW5EYXRlcyxpPVtdLG89MDtvPGUubGVuZ3RoO28rKylmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylvIT1uJiYxIT1lW25dLnJlbW92ZSYmMSE9ZVtvXS5yZW1vdmUmJihlW25dLnN0YXJ0Pj1lW29dLnN0YXJ0JiZlW25dLmVuZDw9ZVtvXS5lbmQ/ZVtuXS5yZW1vdmU9ITA6ZVtuXS5zdGFydD49ZVtvXS5zdGFydCYmZVtuXS5zdGFydDw9ZVtvXS5lbmQ/KGVbb10uZW5kPWVbbl0uZW5kLGVbbl0ucmVtb3ZlPSEwKTplW25dLmVuZD49ZVtvXS5zdGFydCYmZVtuXS5lbmQ8PWVbb10uZW5kJiYoZVtvXS5zdGFydD1lW25dLnN0YXJ0LGVbbl0ucmVtb3ZlPSEwKSk7Zm9yKG89MDtvPGUubGVuZ3RoO28rKykhMCE9PWVbb10ucmVtb3ZlJiZpLnB1c2goZVtvXSk7dC5oaWRkZW5EYXRlcz1pLHQuaGlkZGVuRGF0ZXMuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnN0YXJ0LWUuc3RhcnR9KX0sZS5wcmludERhdGVzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWNvbnNvbGUubG9nKGUsbmV3IERhdGUodFtlXS5zdGFydCksbmV3IERhdGUodFtlXS5lbmQpLHRbZV0uc3RhcnQsdFtlXS5lbmQsdFtlXS5yZW1vdmUpfSxlLnN0ZXBPdmVySGlkZGVuRGF0ZXM9ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0hMSxuPWUuY3VycmVudC52YWx1ZU9mKCkscz0wO3M8ZS5oaWRkZW5EYXRlcy5sZW5ndGg7cysrKXt2YXIgcj1lLmhpZGRlbkRhdGVzW3NdLnN0YXJ0LGE9ZS5oaWRkZW5EYXRlc1tzXS5lbmQ7aWYobj49ciYmbjxhKXtvPSEwO2JyZWFrfX1pZigxPT1vJiZuPGUuX2VuZC52YWx1ZU9mKCkmJm4hPWkpe3ZhciBoPXQoaSksZD10KGEpO2gueWVhcigpIT1kLnllYXIoKT9lLnN3aXRjaGVkWWVhcj0hMDpoLm1vbnRoKCkhPWQubW9udGgoKT9lLnN3aXRjaGVkTW9udGg9ITA6aC5kYXlPZlllYXIoKSE9ZC5kYXlPZlllYXIoKSYmKGUuc3dpdGNoZWREYXk9ITApLGUuY3VycmVudD1kfX0sZS50b1NjcmVlbj1mdW5jdGlvbih0LGksbyl7dmFyIG47aWYoMD09dC5ib2R5LmhpZGRlbkRhdGVzLmxlbmd0aClyZXR1cm4gbj10LnJhbmdlLmNvbnZlcnNpb24obyksKGkudmFsdWVPZigpLW4ub2Zmc2V0KSpuLnNjYWxlO3ZhciBzPWUuaXNIaWRkZW4oaSx0LmJvZHkuaGlkZGVuRGF0ZXMpOzE9PXMuaGlkZGVuJiYoaT1zLnN0YXJ0RGF0ZSk7dmFyIHI9ZS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odC5ib2R5LmhpZGRlbkRhdGVzLHQucmFuZ2Uuc3RhcnQsdC5yYW5nZS5lbmQpO2lmKGk8dC5yYW5nZS5zdGFydCl7bj10LnJhbmdlLmNvbnZlcnNpb24obyxyKTt2YXIgYT1lLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlU3RhcnQodC5ib2R5LmhpZGRlbkRhdGVzLGksbi5vZmZzZXQpO3JldHVybiBpPXQub3B0aW9ucy5tb21lbnQoaSkudG9EYXRlKCkudmFsdWVPZigpLGkrPWEsLShuLm9mZnNldC1pLnZhbHVlT2YoKSkqbi5zY2FsZX1pZihpPnQucmFuZ2UuZW5kKXt2YXIgaD17c3RhcnQ6dC5yYW5nZS5zdGFydCxlbmQ6aX07cmV0dXJuIGk9ZS5jb3JyZWN0VGltZUZvckhpZGRlbih0Lm9wdGlvbnMubW9tZW50LHQuYm9keS5oaWRkZW5EYXRlcyxoLGkpLG49dC5yYW5nZS5jb252ZXJzaW9uKG8sciksKGkudmFsdWVPZigpLW4ub2Zmc2V0KSpuLnNjYWxlfXJldHVybi
21167BpPWUuY29ycmVjdFRpbWVGb3JIaWRkZW4odC5vcHRpb25zLm1vbWVudCx0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZSxpKSxuPXQucmFuZ2UuY29udmVyc2lvbihvLHIpLChpLnZhbHVlT2YoKS1uLm9mZnNldCkqbi5zY2FsZX0sZS50b1RpbWU9ZnVuY3Rpb24odCxpLG8pe2lmKDA9PXQuYm9keS5oaWRkZW5EYXRlcy5sZW5ndGgpe3ZhciBuPXQucmFuZ2UuY29udmVyc2lvbihvKTtyZXR1cm4gbmV3IERhdGUoaS9uLnNjYWxlK24ub2Zmc2V0KX12YXIgcz1lLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZS5zdGFydCx0LnJhbmdlLmVuZCkscj10LnJhbmdlLmVuZC10LnJhbmdlLnN0YXJ0LXMsYT1yKmkvbyxoPWUuZ2V0QWNjdW11bGF0ZWRIaWRkZW5EdXJhdGlvbih0LmJvZHkuaGlkZGVuRGF0ZXMsdC5yYW5nZSxhKTtyZXR1cm4gbmV3IERhdGUoaCthK3QucmFuZ2Uuc3RhcnQpfSxlLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbj1mdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPTAsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dLnN0YXJ0LHI9dFtuXS5lbmQ7cz49ZSYmcjxpJiYobys9ci1zKX1yZXR1cm4gb30sZS5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZVN0YXJ0PWZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89MCxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0uc3RhcnQscj10W25dLmVuZDtzPj1lJiZyPD1pJiYobys9ci1zKX1yZXR1cm4gb30sZS5jb3JyZWN0VGltZUZvckhpZGRlbj1mdW5jdGlvbih0LGksbyxuKXtyZXR1cm4gbj10KG4pLnRvRGF0ZSgpLnZhbHVlT2YoKSxuLT1lLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHQsaSxvLG4pfSxlLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPTA7bz10KG8pLnRvRGF0ZSgpLnZhbHVlT2YoKTtmb3IodmFyIHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXS5zdGFydCxhPWVbc10uZW5kO3I+PWkuc3RhcnQmJmE8aS5lbmQmJm8+PWEmJihuKz1hLXIpfXJldHVybiBufSxlLmdldEFjY3VtdWxhdGVkSGlkZGVuRHVyYXRpb249ZnVuY3Rpb24odCxlLGkpe2Zvcih2YXIgbz0wLG49MCxzPWUuc3RhcnQscj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYT10W3JdLnN0YXJ0LGg9dFtyXS5lbmQ7aWYoYT49ZS5zdGFydCYmaDxlLmVuZCl7aWYobis9YS1zLHM9aCxuPj1pKWJyZWFrO28rPWgtYX19cmV0dXJuIG99LGUuc25hcEF3YXlGcm9tSGlkZGVuPWZ1bmN0aW9uKHQsaSxvLG4pe3ZhciBzPWUuaXNIaWRkZW4oaSx0KTtyZXR1cm4gMT09cy5oaWRkZW4/bzwwPzE9PW4/cy5zdGFydERhdGUtKHMuZW5kRGF0ZS1pKS0xOnMuc3RhcnREYXRlLTE6MT09bj9zLmVuZERhdGUrKGktcy5zdGFydERhdGUpKzE6cy5lbmREYXRlKzE6aX0sZS5pc0hpZGRlbj1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXt2YXIgbz1lW2ldLnN0YXJ0LG49ZVtpXS5lbmQ7aWYodD49byYmdDxuKXJldHVybntoaWRkZW46ITAsc3RhcnREYXRlOm8sZW5kRGF0ZTpufX1yZXR1cm57aGlkZGVuOiExLHN0YXJ0RGF0ZTpvLGVuZERhdGU6bn19fSxmdW5jdGlvbih0LGUsaSl7ZS5vblRvdWNoPWZ1bmN0aW9uKHQsZSl7ZS5pbnB1dEhhbmRsZXI9ZnVuY3Rpb24odCl7dC5pc0ZpcnN0JiZlKHQpfSx0Lm9uKFwiaGFtbWVyLmlucHV0XCIsZS5pbnB1dEhhbmRsZXIpfSxlLm9uUmVsZWFzZT1mdW5jdGlvbih0LGUpe3JldHVybiBlLmlucHV0SGFuZGxlcj1mdW5jdGlvbih0KXt0LmlzRmluYWwmJmUodCl9LHQub24oXCJoYW1tZXIuaW5wdXRcIixlLmlucHV0SGFuZGxlcil9LGUub2ZmVG91Y2g9ZnVuY3Rpb24odCxlKXt0Lm9mZihcImhhbW1lci5pbnB1dFwiLGUuaW5wdXRIYW5kbGVyKX0sZS5vZmZSZWxlYXNlPWUub2ZmVG91Y2gsZS5kaXNhYmxlUHJldmVudERlZmF1bHRWZXJ0aWNhbGx5PWZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFRvdWNoQWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuW1wicGFuLXlcIl19LHR9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUsaSl7dGhpcy5pZD1udWxsLHRoaXMucGFyZW50PW51bGwsdGhpcy5kYXRhPXQsdGhpcy5kb209bnVsbCx0aGlzLmNvbnZlcnNpb249ZXx8e30sdGhpcy5vcHRpb25zPWl8fHt9LHRoaXMuc2VsZWN0ZWQ9ITEsdGhpcy5kaXNwbGF5ZWQ9ITEsdGhpcy5ncm91cFNob3dpbmc9ITAsdGhpcy5kaXJ0eT0hMCx0aGlzLnRvcD1udWxsLHRoaXMucmlnaHQ9bnVsbCx0aGlzLmxlZnQ9bnVsbCx0aGlzLndpZHRoPW51bGwsdGhpcy5oZWlnaHQ9bnVsbCx0aGlzLmVkaXRhYmxlPW51bGwsdGhpcy5fdXBkYXRlRWRpdFN0YXR1cygpfXZhciBzPWkoNikscj1vKHMpLGE9aSg4KSxoPW8oYSksZD1pKDEwKSxsPWkoMiksdT1pKDkpO24ucHJvdG90eXBlLnN0YWNrPSEwLG4ucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITAsdGhpcy5kaXJ0eT0hMCx0aGlzLmRpc3BsYXllZCYmdGhpcy5yZWRyYXcoKX0sbi5wcm90b3R5cGUudW5zZWxlY3Q9ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMuZGlydHk9ITAsdGhpcy5kaXNwbGF5ZWQmJnRoaXMucmVkcmF3KCl9LG4ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dm9pZCAwIT10Lmdyb3VwJiZ0aGlzLmRhdGEuZ3JvdXAhPXQuZ3JvdXAmJm51bGwhPXRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5pdGVtU2V0Ll9tb3ZlVG9Hcm91cCh0aGlzLHQuZ3JvdXApLHRoaXMucGFyZW50JiYodGhpcy5wYXJlbnQuc3RhY2tEaXJ0eT0hMCksdm9pZCAwIT10LnN1Ymdyb3VwJiZ0aGlzLmRhdGEuc3ViZ3JvdXAhPXQuc3ViZ3JvdXAmJm51bGwhPXRoaXMucGFyZW50JiZ0aGlzLnBhcmVudC5jaGFuZ2VTdWJncm91cCh0aGlzLHRoaXMuZGF0YS5zdWJncm91cCx0LnN1Ymdyb3VwKSx0aGlzLmRhdGE9dCx0aGlzLl91cGRhdGVFZGl0U3RhdHVzKCksdGhpcy5kaXJ0eT0hMCx0aGlzLmRpc3BsYXllZCYmdGhpcy5yZWRyYXcoKX0sbi5wcm90b3R5cGUuc2V0UGFyZW50PWZ1bmN0aW9uKHQpe3RoaXMuZGlzcGxheWVkPyh0aGlzLmhpZGUoKSx0aGlzLnBhcmVudD10LHRoaXMucGFyZW50JiZ0aGlzLnNob3coKSk6dGhpcy5wYXJlbnQ9dH0sbi5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiExfS
21167xuLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7cmV0dXJuITF9LG4ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtyZXR1cm4hMX0sbi5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7fSxuLnByb3RvdHlwZS5yZXBvc2l0aW9uWD1mdW5jdGlvbigpe30sbi5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt9LG4ucHJvdG90eXBlLl9yZXBhaW50RHJhZ0NlbnRlcj1mdW5jdGlvbigpe2lmKHRoaXMuc2VsZWN0ZWQmJnRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lJiYhdGhpcy5kb20uZHJhZ0NlbnRlcil7dmFyIHQ9dGhpcyxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5jbGFzc05hbWU9XCJ2aXMtZHJhZy1jZW50ZXJcIixlLmRyYWdDZW50ZXJJdGVtPXRoaXM7dmFyIGk9bmV3IGQoZSk7aS5vbihcInRhcFwiLGZ1bmN0aW9uKGUpe3QucGFyZW50Lml0ZW1TZXQuYm9keS5lbWl0dGVyLmVtaXQoXCJjbGlja1wiLHtldmVudDplLGl0ZW06dC5pZH0pfSksaS5vbihcImRvdWJsZXRhcFwiLGZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCksdC5wYXJlbnQuaXRlbVNldC5fb25VcGRhdGVJdGVtKHQpLHQucGFyZW50Lml0ZW1TZXQuYm9keS5lbWl0dGVyLmVtaXQoXCJkb3VibGVDbGlja1wiLHtldmVudDplLGl0ZW06dC5pZH0pfSksdGhpcy5kb20uYm94P3RoaXMuZG9tLmRyYWdMZWZ0P3RoaXMuZG9tLmJveC5pbnNlcnRCZWZvcmUoZSx0aGlzLmRvbS5kcmFnTGVmdCk6dGhpcy5kb20uYm94LmFwcGVuZENoaWxkKGUpOnRoaXMuZG9tLnBvaW50JiZ0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZChlKSx0aGlzLmRvbS5kcmFnQ2VudGVyPWV9ZWxzZSF0aGlzLnNlbGVjdGVkJiZ0aGlzLmRvbS5kcmFnQ2VudGVyJiYodGhpcy5kb20uZHJhZ0NlbnRlci5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnQ2VudGVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZHJhZ0NlbnRlciksdGhpcy5kb20uZHJhZ0NlbnRlcj1udWxsKX0sbi5wcm90b3R5cGUuX3JlcGFpbnREZWxldGVCdXR0b249ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHxudWxsPT10aGlzLmVkaXRhYmxlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnJlbW92ZXx8IXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zJiZudWxsIT10aGlzLmVkaXRhYmxlJiZ0aGlzLmVkaXRhYmxlLnJlbW92ZTtpZih0aGlzLnNlbGVjdGVkJiZlJiYhdGhpcy5kb20uZGVsZXRlQnV0dG9uKXt2YXIgaT10aGlzLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLm9wdGlvbnMucnRsP28uY2xhc3NOYW1lPVwidmlzLWRlbGV0ZS1ydGxcIjpvLmNsYXNzTmFtZT1cInZpcy1kZWxldGVcIixvLnRpdGxlPVwiRGVsZXRlIHRoaXMgaXRlbVwiLG5ldyBkKG8pLm9uKFwidGFwXCIsZnVuY3Rpb24odCl7dC5zdG9wUHJvcGFnYXRpb24oKSxpLnBhcmVudC5yZW1vdmVGcm9tRGF0YVNldChpKX0pLHQuYXBwZW5kQ2hpbGQobyksdGhpcy5kb20uZGVsZXRlQnV0dG9uPW99ZWxzZSF0aGlzLnNlbGVjdGVkJiZ0aGlzLmRvbS5kZWxldGVCdXR0b24mJih0aGlzLmRvbS5kZWxldGVCdXR0b24ucGFyZW50Tm9kZSYmdGhpcy5kb20uZGVsZXRlQnV0dG9uLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZGVsZXRlQnV0dG9uKSx0aGlzLmRvbS5kZWxldGVCdXR0b249bnVsbCl9LG4ucHJvdG90eXBlLl9yZXBhaW50T25JdGVtVXBkYXRlVGltZVRvb2x0aXA9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lKXt2YXIgZT0odGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fCEwPT09dGhpcy5kYXRhLmVkaXRhYmxlKSYmITEhPT10aGlzLmRhdGEuZWRpdGFibGU7aWYodGhpcy5zZWxlY3RlZCYmZSYmIXRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2kuY2xhc3NOYW1lPVwidmlzLW9uVXBkYXRlVGltZS10b29sdGlwXCIsdC5hcHBlbmRDaGlsZChpKSx0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcD1pfWVsc2UhdGhpcy5zZWxlY3RlZCYmdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAmJih0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKSx0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcD1udWxsKTtpZih0aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCl7dGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudmlzaWJpbGl0eT10aGlzLnBhcmVudC5pdGVtU2V0LnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nP1widmlzaWJsZVwiOlwiaGlkZGVuXCIsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5vbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcC5zdHlsZS5yaWdodD10aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0OnRoaXMuZG9tLm9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwLnN0eWxlLmxlZnQ9dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0O3ZhciBvLG49dGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcDtvPVwidG9wXCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtP3RoaXMudG9wOnRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodDtvK3RoaXMucGFyZW50LnRvcC01MDwtbj8odGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUuYm90dG9tPVwiXCIsdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wPXRoaXMuaGVpZ2h0KzIrXCJweFwiKToodGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUudG9wPVwiXCIsdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuc3R5bGUuYm90dG9tPXRoaXMuaGVpZ2h0KzIrXCJweFwiKTt2YXIgcyxyO3RoaXMub3B0aW9ucy50b29sdGlwT25JdGVtVXBkYXRlVGltZSYmdGhpcy5vcHRpb25zLnRvb2x0aXBPbkl0ZW1VcGRhdGVUaW1lLnRlbXBsYXRlPyhyPXRoaXMub3B0aW9ucy50b29sdGlwT25JdGVtVXBkYXRlVGltZS50ZW1wbGF0ZS5iaW5kKHRoaXMpLHM9cih0aGlzLmRhdGEpKToocz1cInN0YXJ0Oi
21167BcIit1KHRoaXMuZGF0YS5zdGFydCkuZm9ybWF0KFwiTU0vREQvWVlZWSBoaDptbVwiKSx0aGlzLmRhdGEuZW5kJiYocys9XCI8YnI+IGVuZDogXCIrdSh0aGlzLmRhdGEuZW5kKS5mb3JtYXQoXCJNTS9ERC9ZWVlZIGhoOm1tXCIpKSksdGhpcy5kb20ub25JdGVtVXBkYXRlVGltZVRvb2x0aXAuaW5uZXJIVE1MPXN9fX0sbi5wcm90b3R5cGUuX3VwZGF0ZUNvbnRlbnRzPWZ1bmN0aW9uKHQpe3ZhciBlLGksbyxuLHM9dGhpcy5wYXJlbnQuaXRlbVNldC5pdGVtc0RhdGEuZ2V0KHRoaXMuaWQpLHI9dGhpcy5kb20uYm94fHx0aGlzLmRvbS5wb2ludCxhPXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShcInZpcy1pdGVtLXZpc2libGUtZnJhbWVcIilbMF07aWYodGhpcy5vcHRpb25zLnZpc2libGVGcmFtZVRlbXBsYXRlPyhuPXRoaXMub3B0aW9ucy52aXNpYmxlRnJhbWVUZW1wbGF0ZS5iaW5kKHRoaXMpLG89bihzLHIpKTpvPVwiXCIsYSlpZihvIGluc3RhbmNlb2YgT2JqZWN0JiYhKG8gaW5zdGFuY2VvZiBFbGVtZW50KSluKHMsYSk7ZWxzZSBpZih0aGlzLl9jb250ZW50VG9TdHJpbmcodGhpcy5pdGVtVmlzaWJsZUZyYW1lQ29udGVudCkhPT10aGlzLl9jb250ZW50VG9TdHJpbmcobykpe2lmKG8gaW5zdGFuY2VvZiBFbGVtZW50KWEuaW5uZXJIVE1MPVwiXCIsYS5hcHBlbmRDaGlsZChvKTtlbHNlIGlmKHZvaWQgMCE9bylhLmlubmVySFRNTD1vO2Vsc2UgaWYoXCJiYWNrZ3JvdW5kXCIhPXRoaXMuZGF0YS50eXBlfHx2b2lkIDAhPT10aGlzLmRhdGEuY29udGVudCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwiY29udGVudFwiIG1pc3NpbmcgaW4gaXRlbSAnK3RoaXMuaWQpO3RoaXMuaXRlbVZpc2libGVGcmFtZUNvbnRlbnQ9b31pZih0aGlzLm9wdGlvbnMudGVtcGxhdGU/KGk9dGhpcy5vcHRpb25zLnRlbXBsYXRlLmJpbmQodGhpcyksZT1pKHMsdCx0aGlzLmRhdGEpKTplPXRoaXMuZGF0YS5jb250ZW50LGUgaW5zdGFuY2VvZiBPYmplY3QmJiEoZSBpbnN0YW5jZW9mIEVsZW1lbnQpKWkocyx0KTtlbHNlIGlmKHRoaXMuX2NvbnRlbnRUb1N0cmluZyh0aGlzLmNvbnRlbnQpIT09dGhpcy5fY29udGVudFRvU3RyaW5nKGUpKXtpZihlIGluc3RhbmNlb2YgRWxlbWVudCl0LmlubmVySFRNTD1cIlwiLHQuYXBwZW5kQ2hpbGQoZSk7ZWxzZSBpZih2b2lkIDAhPWUpdC5pbm5lckhUTUw9ZTtlbHNlIGlmKFwiYmFja2dyb3VuZFwiIT10aGlzLmRhdGEudHlwZXx8dm9pZCAwIT09dGhpcy5kYXRhLmNvbnRlbnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBcImNvbnRlbnRcIiBtaXNzaW5nIGluIGl0ZW0gJyt0aGlzLmlkKTt0aGlzLmNvbnRlbnQ9ZX19LG4ucHJvdG90eXBlLl91cGRhdGVEYXRhQXR0cmlidXRlcz1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXMmJnRoaXMub3B0aW9ucy5kYXRhQXR0cmlidXRlcy5sZW5ndGg+MCl7dmFyIGU9W107aWYoQXJyYXkuaXNBcnJheSh0aGlzLm9wdGlvbnMuZGF0YUF0dHJpYnV0ZXMpKWU9dGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzO2Vsc2V7aWYoXCJhbGxcIiE9dGhpcy5vcHRpb25zLmRhdGFBdHRyaWJ1dGVzKXJldHVybjtlPSgwLGguZGVmYXVsdCkodGhpcy5kYXRhKX1mb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuZGF0YVtvXTtudWxsIT1uP3Quc2V0QXR0cmlidXRlKFwiZGF0YS1cIitvLG4pOnQucmVtb3ZlQXR0cmlidXRlKFwiZGF0YS1cIitvKX19fSxuLnByb3RvdHlwZS5fdXBkYXRlU3R5bGU9ZnVuY3Rpb24odCl7dGhpcy5zdHlsZSYmKGwucmVtb3ZlQ3NzVGV4dCh0LHRoaXMuc3R5bGUpLHRoaXMuc3R5bGU9bnVsbCksdGhpcy5kYXRhLnN0eWxlJiYobC5hZGRDc3NUZXh0KHQsdGhpcy5kYXRhLnN0eWxlKSx0aGlzLnN0eWxlPXRoaXMuZGF0YS5zdHlsZSl9LG4ucHJvdG90eXBlLl9jb250ZW50VG9TdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIHQ/dDp0JiZcIm91dGVySFRNTFwiaW4gdD90Lm91dGVySFRNTDp0fSxuLnByb3RvdHlwZS5fdXBkYXRlRWRpdFN0YXR1cz1mdW5jdGlvbigpe3RoaXMub3B0aW9ucyYmKFwiYm9vbGVhblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmVkaXRhYmxlP3RoaXMuZWRpdGFibGU9e3VwZGF0ZVRpbWU6dGhpcy5vcHRpb25zLmVkaXRhYmxlLHVwZGF0ZUdyb3VwOnRoaXMub3B0aW9ucy5lZGl0YWJsZSxyZW1vdmU6dGhpcy5vcHRpb25zLmVkaXRhYmxlfTpcIm9iamVjdFwiPT09KDAsci5kZWZhdWx0KSh0aGlzLm9wdGlvbnMuZWRpdGFibGUpJiYodGhpcy5lZGl0YWJsZT17fSxsLnNlbGVjdGl2ZUV4dGVuZChbXCJ1cGRhdGVUaW1lXCIsXCJ1cGRhdGVHcm91cFwiLFwicmVtb3ZlXCJdLHRoaXMuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlKSkpLHRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmVkaXRhYmxlJiYhMD09PXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zfHx0aGlzLmRhdGEmJihcImJvb2xlYW5cIj09dHlwZW9mIHRoaXMuZGF0YS5lZGl0YWJsZT90aGlzLmVkaXRhYmxlPXt1cGRhdGVUaW1lOnRoaXMuZGF0YS5lZGl0YWJsZSx1cGRhdGVHcm91cDp0aGlzLmRhdGEuZWRpdGFibGUscmVtb3ZlOnRoaXMuZGF0YS5lZGl0YWJsZX06XCJvYmplY3RcIj09PSgwLHIuZGVmYXVsdCkodGhpcy5kYXRhLmVkaXRhYmxlKSYmKHRoaXMuZWRpdGFibGU9e30sbC5zZWxlY3RpdmVFeHRlbmQoW1widXBkYXRlVGltZVwiLFwidXBkYXRlR3JvdXBcIixcInJlbW92ZVwiXSx0aGlzLmVkaXRhYmxlLHRoaXMuZGF0YS5lZGl0YWJsZSkpKX0sbi5wcm90b3R5cGUuZ2V0V2lkdGhMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIDB9LG4ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gMH0sbi5wcm90b3R5cGUuZ2V0VGl0bGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLnRpdGxlfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXtyZXR1cm57ZW51bWVyYWJsZTohKDEmdCksY29uZmlndXJhYmxlOiEoMiZ0KSx3cml0YWJsZTohKDQmdCksdmFsdWU6ZX19fSxmdW5jdGlvbih0LGUpe3ZhciBpPTAsbz1NYXRoLnJhbmRvbSgpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm5cIlN5bWJvbChcIi5jb25jYXQodm9pZCAwPT09dD9cIlwiOnQsXCIpX1wiLCgrK2krbykudG9TdHJpbmc
21167oMzYpKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUxKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdChvKHQpKX19LGZ1bmN0aW9uKHQsZSl7ZS5mPXt9LnByb3BlcnR5SXNFbnVtZXJhYmxlfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXt0aGlzLmRlbGF5PW51bGwsdGhpcy5tYXg9MS8wLHRoaXMuX3F1ZXVlPVtdLHRoaXMuX3RpbWVvdXQ9bnVsbCx0aGlzLl9leHRlbmRlZD1udWxsLHRoaXMuc2V0T3B0aW9ucyh0KX1vLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJnZvaWQgMCE9PXQuZGVsYXkmJih0aGlzLmRlbGF5PXQuZGVsYXkpLHQmJnZvaWQgMCE9PXQubWF4JiYodGhpcy5tYXg9dC5tYXgpLHRoaXMuX2ZsdXNoSWZOZWVkZWQoKX0sby5leHRlbmQ9ZnVuY3Rpb24odCxlKXt2YXIgaT1uZXcgbyhlKTtpZih2b2lkIDAhPT10LmZsdXNoKXRocm93IG5ldyBFcnJvcihcIlRhcmdldCBvYmplY3QgYWxyZWFkeSBoYXMgYSBwcm9wZXJ0eSBmbHVzaFwiKTt0LmZsdXNoPWZ1bmN0aW9uKCl7aS5mbHVzaCgpfTt2YXIgbj1be25hbWU6XCJmbHVzaFwiLG9yaWdpbmFsOnZvaWQgMH1dO2lmKGUmJmUucmVwbGFjZSlmb3IodmFyIHM9MDtzPGUucmVwbGFjZS5sZW5ndGg7cysrKXt2YXIgcj1lLnJlcGxhY2Vbc107bi5wdXNoKHtuYW1lOnIsb3JpZ2luYWw6dFtyXX0pLGkucmVwbGFjZSh0LHIpfXJldHVybiBpLl9leHRlbmRlZD17b2JqZWN0OnQsbWV0aG9kczpufSxpfSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7aWYodGhpcy5mbHVzaCgpLHRoaXMuX2V4dGVuZGVkKXtmb3IodmFyIHQ9dGhpcy5fZXh0ZW5kZWQub2JqZWN0LGU9dGhpcy5fZXh0ZW5kZWQubWV0aG9kcyxpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07by5vcmlnaW5hbD90W28ubmFtZV09by5vcmlnaW5hbDpkZWxldGUgdFtvLm5hbWVdfXRoaXMuX2V4dGVuZGVkPW51bGx9fSxvLnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXRbZV07aWYoIW8pdGhyb3cgbmV3IEVycm9yKFwiTWV0aG9kIFwiK2UrXCIgdW5kZWZpbmVkXCIpO3RbZV09ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07aS5xdWV1ZSh7YXJnczp0LGZuOm8sY29udGV4dDp0aGlzfSl9fSxvLnByb3RvdHlwZS5xdWV1ZT1mdW5jdGlvbih0KXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0P3RoaXMuX3F1ZXVlLnB1c2goe2ZuOnR9KTp0aGlzLl9xdWV1ZS5wdXNoKHQpLHRoaXMuX2ZsdXNoSWZOZWVkZWQoKX0sby5wcm90b3R5cGUuX2ZsdXNoSWZOZWVkZWQ9ZnVuY3Rpb24oKXtpZih0aGlzLl9xdWV1ZS5sZW5ndGg+dGhpcy5tYXgmJnRoaXMuZmx1c2goKSxjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dCksdGhpcy5xdWV1ZS5sZW5ndGg+MCYmXCJudW1iZXJcIj09dHlwZW9mIHRoaXMuZGVsYXkpe3ZhciB0PXRoaXM7dGhpcy5fdGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5mbHVzaCgpfSx0aGlzLmRlbGF5KX19LG8ucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9xdWV1ZS5sZW5ndGg+MDspe3ZhciB0PXRoaXMuX3F1ZXVlLnNoaWZ0KCk7dC5mbi5hcHBseSh0LmNvbnRleHR8fHQuZm4sdC5hcmdzfHxbXSl9fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe2lmKHQpcmV0dXJuIG8odCl9ZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUgaW4gaS5wcm90b3R5cGUpdFtlXT1pLnByb3RvdHlwZVtlXTtyZXR1cm4gdH10LmV4cG9ydHM9aSxpLnByb3RvdHlwZS5vbj1pLnByb3RvdHlwZS5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcz10aGlzLl9jYWxsYmFja3N8fHt9LCh0aGlzLl9jYWxsYmFja3NbdF09dGhpcy5fY2FsbGJhY2tzW3RdfHxbXSkucHVzaChlKSx0aGlzfSxpLnByb3RvdHlwZS5vbmNlPWZ1bmN0aW9uKHQsZSl7ZnVuY3Rpb24gaSgpe28ub2ZmKHQsaSksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9dmFyIG89dGhpcztyZXR1cm4gdGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e30saS5mbj1lLHRoaXMub24odCxpKSx0aGlzfSxpLnByb3RvdHlwZS5vZmY9aS5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXI9aS5wcm90b3R5cGUucmVtb3ZlQWxsTGlzdGVuZXJzPWkucHJvdG90eXBlLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24odCxlKXtpZih0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSwwPT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9jYWxsYmFja3M9e30sdGhpczt2YXIgaT10aGlzLl9jYWxsYmFja3NbdF07aWYoIWkpcmV0dXJuIHRoaXM7aWYoMT09YXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZGVsZXRlIHRoaXMuX2NhbGxiYWNrc1t0XSx0aGlzO2Zvcih2YXIgbyxuPTA7bjxpLmxlbmd0aDtuKyspaWYoKG89aVtuXSk9PT1lfHxvLmZuPT09ZSl7aS5zcGxpY2UobiwxKTticmVha31yZXR1cm4gdGhpc30saS5wcm90b3R5cGUuZW1pdD1mdW5jdGlvbih0KXt0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fTt2YXIgZT1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxpPXRoaXMuX2NhbGxiYWNrc1t0XTtpZihpKXtpPWkuc2xpY2UoMCk7Zm9yKHZhciBvPTAsbj1pLmxlbmd0aDtvPG47KytvKWlbb10uYXBwbHkodGhpcyxlKX1yZXR1cm4gdGhpc30saS5wcm90b3R5cGUubGlzdGVuZXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3M9dGhpcy5fY2FsbGJhY2tzfHx7fSx0aGlzLl9jYWxsYmFja3NbdF18fFtdfSxpLnByb3RvdHlwZS5oYXNMaXN0ZW5lcnM9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmxpc3RlbmVycyh0KS5sZW5ndGh9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuZG9tPXtmb3JlZ3JvdW5kOm51bGwsbGluZXM6W10sbWFqb3JUZXh0czpbXSxtaW5vclRleHRzOltdLHJlZHVuZGFudDp7bGluZXM6W10sbWFqb3JUZXh0czpbXSxtaW5vclRleHRzOltdfX0sdGhpcy5wcm9wcz17cmFuZ2U6e3N0YXJ0OjAsZW5kOjAsbWluaW11bVN0ZXA6MH0sbGluZVRvcDowfSx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjp7YXhpczpcImJvdHRvbVwifSxzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLG1heE1pbm9yQ2hhcnM6Nyxmb3JtYXQ6aC5GT1JNQVQsbW9tZW50OmwsdGltZUF4aXM6bnVsbH0sdGhpcy5vcHRpb25zPXIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYm9keT10LHRoaXMuX2NyZWF0ZSgpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDYpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMiksYT1pKDE2KSxoPWkoNjYpLGQ9aSgzNiksbD1pKDk
21167pO28ucHJvdG90eXBlPW5ldyBhLG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmKHIuc2VsZWN0aXZlRXh0ZW5kKFtcInNob3dNaW5vckxhYmVsc1wiLFwic2hvd01ham9yTGFiZWxzXCIsXCJtYXhNaW5vckNoYXJzXCIsXCJoaWRkZW5EYXRlc1wiLFwidGltZUF4aXNcIixcIm1vbWVudFwiLFwicnRsXCJdLHRoaXMub3B0aW9ucyx0KSxyLnNlbGVjdGl2ZURlZXBFeHRlbmQoW1wiZm9ybWF0XCJdLHRoaXMub3B0aW9ucyx0KSxcIm9yaWVudGF0aW9uXCJpbiB0JiYoXCJzdHJpbmdcIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbjpcIm9iamVjdFwiPT09KDAscy5kZWZhdWx0KSh0Lm9yaWVudGF0aW9uKSYmXCJheGlzXCJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbi5heGlzKSksXCJsb2NhbGVcImluIHQmJihcImZ1bmN0aW9uXCI9PXR5cGVvZiBsLmxvY2FsZT9sLmxvY2FsZSh0LmxvY2FsZSk6bC5sYW5nKHQubG9jYWxlKSkpfSxvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dGhpcy5kb20uZm9yZWdyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmJhY2tncm91bmQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLmNsYXNzTmFtZT1cInZpcy10aW1lLWF4aXMgdmlzLWZvcmVncm91bmRcIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmNsYXNzTmFtZT1cInZpcy10aW1lLWF4aXMgdmlzLWJhY2tncm91bmRcIn0sby5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuZG9tLmZvcmVncm91bmQucGFyZW50Tm9kZSYmdGhpcy5kb20uZm9yZWdyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmZvcmVncm91bmQpLHRoaXMuZG9tLmJhY2tncm91bmQucGFyZW50Tm9kZSYmdGhpcy5kb20uYmFja2dyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmJhY2tncm91bmQpLHRoaXMuYm9keT1udWxsfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnByb3BzLGU9dGhpcy5kb20uZm9yZWdyb3VuZCxpPXRoaXMuZG9tLmJhY2tncm91bmQsbz1cInRvcFwiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz90aGlzLmJvZHkuZG9tLnRvcDp0aGlzLmJvZHkuZG9tLmJvdHRvbSxuPWUucGFyZW50Tm9kZSE9PW87dGhpcy5fY2FsY3VsYXRlQ2hhclNpemUoKVxuO3ZhciBzPXRoaXMub3B0aW9ucy5zaG93TWlub3JMYWJlbHMmJlwibm9uZVwiIT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMscj10aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzJiZcIm5vbmVcIiE9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzO3QubWlub3JMYWJlbEhlaWdodD1zP3QubWlub3JDaGFySGVpZ2h0OjAsdC5tYWpvckxhYmVsSGVpZ2h0PXI/dC5tYWpvckNoYXJIZWlnaHQ6MCx0LmhlaWdodD10Lm1pbm9yTGFiZWxIZWlnaHQrdC5tYWpvckxhYmVsSGVpZ2h0LHQud2lkdGg9ZS5vZmZzZXRXaWR0aCx0Lm1pbm9yTGluZUhlaWdodD10aGlzLmJvZHkuZG9tUHJvcHMucm9vdC5oZWlnaHQtdC5tYWpvckxhYmVsSGVpZ2h0LShcInRvcFwiPT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcz90aGlzLmJvZHkuZG9tUHJvcHMuYm90dG9tLmhlaWdodDp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCksdC5taW5vckxpbmVXaWR0aD0xLHQubWFqb3JMaW5lSGVpZ2h0PXQubWlub3JMaW5lSGVpZ2h0K3QubWFqb3JMYWJlbEhlaWdodCx0Lm1ham9yTGluZVdpZHRoPTE7dmFyIGE9ZS5uZXh0U2libGluZyxoPWkubmV4dFNpYmxpbmc7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpLGkucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpLGUuc3R5bGUuaGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0K1wicHhcIix0aGlzLl9yZXBhaW50TGFiZWxzKCksYT9vLmluc2VydEJlZm9yZShlLGEpOm8uYXBwZW5kQ2hpbGQoZSksaD90aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5pbnNlcnRCZWZvcmUoaSxoKTp0aGlzLmJvZHkuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5hcHBlbmRDaGlsZChpKSx0aGlzLl9pc1Jlc2l6ZWQoKXx8bn0sby5wcm90b3R5cGUuX3JlcGFpbnRMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uYXhpcyxlPXIuY29udmVydCh0aGlzLmJvZHkucmFuZ2Uuc3RhcnQsXCJOdW1iZXJcIiksaT1yLmNvbnZlcnQodGhpcy5ib2R5LnJhbmdlLmVuZCxcIk51bWJlclwiKSxvPXRoaXMuYm9keS51dGlsLnRvVGltZSgodGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aHx8MTApKnRoaXMub3B0aW9ucy5tYXhNaW5vckNoYXJzKS52YWx1ZU9mKCksbj1vLWQuZ2V0SGlkZGVuRHVyYXRpb25CZWZvcmUodGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5ib2R5LnJhbmdlLG8pO24tPXRoaXMuYm9keS51dGlsLnRvVGltZSgwKS52YWx1ZU9mKCk7dmFyIHM9bmV3IGgobmV3IERhdGUoZSksbmV3IERhdGUoaSksbix0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5vcHRpb25zKTtzLnNldE1vbWVudCh0aGlzLm9wdGlvbnMubW9tZW50KSx0aGlzLm9wdGlvbnMuZm9ybWF0JiZzLnNldEZvcm1hdCh0aGlzLm9wdGlvbnMuZm9ybWF0KSx0aGlzLm9wdGlvbnMudGltZUF4aXMmJnMuc2V0U2NhbGUodGhpcy5vcHRpb25zLnRpbWVBeGlzKSx0aGlzLnN0ZXA9czt2YXIgYT10aGlzLmRvbTthLnJlZHVuZGFudC5saW5lcz1hLmxpbmVzLGEucmVkdW5kYW50Lm1ham9yVGV4dHM9YS5tYWpvclRleHRzLGEucmVkdW5kYW50Lm1pbm9yVGV4dHM9YS5taW5vclRleHRzLGEubGluZXM9W10sYS5tYWpvclRleHRzPVtdLGEubWlub3JUZXh0cz1bXTt2YXIgbCxjLHAsZixtLHYsZyx5LGIsXz0wLHc9dm9pZCAwLHg9MDtmb3Iocy5zdGFydCgpLGw9cy5nZXRDdXJyZW50KCkscD10aGlzLmJvZHkudXRpbC50b1NjcmVlbihsKTtzLmhhc05leHQoKSYmeDwxZTM7KXtzd2l0Y2goeCsrLGY9cy5pc01ham9yKCksYj1zLmdldENsYXNzTmFtZSgpLHk9cy5nZXRMYWJlbE1pbm9yKCksbCxjPXAscy5uZXh0KCksbD1zLmdldEN1cnJlbnQoKSxzLmlzTWFqb3IoKSxwPXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGwpLHY9XyxfPXAtYyxzLnNjYWxlKXtjYXNlXCJ3ZWVrXCI6bT0hMDticmVhaztkZWZhdWx0Om09Xz49LjQqdn1pZih0aGlzLm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiZtKXt2YXIgaz10aGlzLl9yZXBhaW50TWlub3JUZXh0KGMseSx0LGIpO2suc3R5bGUud2lkdGg9XytcInB4XCJ9ZiYmdGhpcy5vcHRpb25zLnNob3dNYWpvckxhYmVscz8oYz4wJiYodm9p
21167ZCAwPT13JiYodz1jKSxrPXRoaXMuX3JlcGFpbnRNYWpvclRleHQoYyxzLmdldExhYmVsTWFqb3IoKSx0LGIpKSxnPXRoaXMuX3JlcGFpbnRNYWpvckxpbmUoYyxfLHQsYikpOm0/Zz10aGlzLl9yZXBhaW50TWlub3JMaW5lKGMsXyx0LGIpOmcmJihnLnN0eWxlLndpZHRoPXBhcnNlSW50KGcuc3R5bGUud2lkdGgpK18rXCJweFwiKX1pZigxZTMhPT14fHx1fHwoY29uc29sZS53YXJuKFwiU29tZXRoaW5nIGlzIHdyb25nIHdpdGggdGhlIFRpbWVsaW5lIHNjYWxlLiBMaW1pdGVkIGRyYXdpbmcgb2YgZ3JpZCBsaW5lcyB0byAxMDAwIGxpbmVzLlwiKSx1PSEwKSx0aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzKXt2YXIgUz10aGlzLmJvZHkudXRpbC50b1RpbWUoMCksRD1zLmdldExhYmVsTWFqb3IoUyksTT1ELmxlbmd0aCoodGhpcy5wcm9wcy5tYWpvckNoYXJXaWR0aHx8MTApKzEwOyh2b2lkIDA9PXd8fE08dykmJnRoaXMuX3JlcGFpbnRNYWpvclRleHQoMCxELHQsYil9ci5mb3JFYWNoKHRoaXMuZG9tLnJlZHVuZGFudCxmdW5jdGlvbih0KXtmb3IoO3QubGVuZ3RoOyl7dmFyIGU9dC5wb3AoKTtlJiZlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX19KX0sby5wcm90b3R5cGUuX3JlcGFpbnRNaW5vclRleHQ9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50Lm1pbm9yVGV4dHMuc2hpZnQoKTtpZighbil7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG4uYXBwZW5kQ2hpbGQocyksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZChuKX1yZXR1cm4gdGhpcy5kb20ubWlub3JUZXh0cy5wdXNoKG4pLG4uaW5uZXJIVE1MPWUsbi5zdHlsZS50b3A9XCJ0b3BcIj09aT90aGlzLnByb3BzLm1ham9yTGFiZWxIZWlnaHQrXCJweFwiOlwiMFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dCtcInB4XCIpOm4uc3R5bGUubGVmdD10K1wicHhcIixuLmNsYXNzTmFtZT1cInZpcy10ZXh0IHZpcy1taW5vciBcIitvLG59LG8ucHJvdG90eXBlLl9yZXBhaW50TWFqb3JUZXh0PWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuZG9tLnJlZHVuZGFudC5tYWpvclRleHRzLnNoaWZ0KCk7aWYoIW4pe3ZhciBzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLG4uYXBwZW5kQ2hpbGQocyksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZChuKX1yZXR1cm4gbi5jaGlsZE5vZGVzWzBdLmlubmVySFRNTD1lLG4uY2xhc3NOYW1lPVwidmlzLXRleHQgdmlzLW1ham9yIFwiK28sbi5zdHlsZS50b3A9XCJ0b3BcIj09aT9cIjBcIjp0aGlzLnByb3BzLm1pbm9yTGFiZWxIZWlnaHQrXCJweFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dCtcInB4XCIpOm4uc3R5bGUubGVmdD10K1wicHhcIix0aGlzLmRvbS5tYWpvclRleHRzLnB1c2gobiksbn0sby5wcm90b3R5cGUuX3JlcGFpbnRNaW5vckxpbmU9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50LmxpbmVzLnNoaWZ0KCk7bnx8KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKG4pKSx0aGlzLmRvbS5saW5lcy5wdXNoKG4pO3ZhciBzPXRoaXMucHJvcHM7cmV0dXJuIG4uc3R5bGUudG9wPVwidG9wXCI9PWk/cy5tYWpvckxhYmVsSGVpZ2h0K1wicHhcIjp0aGlzLmJvZHkuZG9tUHJvcHMudG9wLmhlaWdodCtcInB4XCIsbi5zdHlsZS5oZWlnaHQ9cy5taW5vckxpbmVIZWlnaHQrXCJweFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dC1zLm1pbm9yTGluZVdpZHRoLzIrXCJweFwiLG4uY2xhc3NOYW1lPVwidmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWlub3IgXCIrbyk6KG4uc3R5bGUubGVmdD10LXMubWlub3JMaW5lV2lkdGgvMitcInB4XCIsbi5jbGFzc05hbWU9XCJ2aXMtZ3JpZCB2aXMtdmVydGljYWwgdmlzLW1pbm9yIFwiK28pLG4uc3R5bGUud2lkdGg9ZStcInB4XCIsbn0sby5wcm90b3R5cGUuX3JlcGFpbnRNYWpvckxpbmU9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5kb20ucmVkdW5kYW50LmxpbmVzLnNoaWZ0KCk7bnx8KG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKG4pKSx0aGlzLmRvbS5saW5lcy5wdXNoKG4pO3ZhciBzPXRoaXMucHJvcHM7cmV0dXJuIG4uc3R5bGUudG9wPVwidG9wXCI9PWk/XCIwXCI6dGhpcy5ib2R5LmRvbVByb3BzLnRvcC5oZWlnaHQrXCJweFwiLHRoaXMub3B0aW9ucy5ydGw/KG4uc3R5bGUubGVmdD1cIlwiLG4uc3R5bGUucmlnaHQ9dC1zLm1ham9yTGluZVdpZHRoLzIrXCJweFwiLG4uY2xhc3NOYW1lPVwidmlzLWdyaWQgdmlzLXZlcnRpY2FsLXJ0bCB2aXMtbWFqb3IgXCIrbyk6KG4uc3R5bGUubGVmdD10LXMubWFqb3JMaW5lV2lkdGgvMitcInB4XCIsbi5jbGFzc05hbWU9XCJ2aXMtZ3JpZCB2aXMtdmVydGljYWwgdmlzLW1ham9yIFwiK28pLG4uc3R5bGUuaGVpZ2h0PXMubWFqb3JMaW5lSGVpZ2h0K1wicHhcIixuLnN0eWxlLndpZHRoPWUrXCJweFwiLG59LG8ucHJvdG90eXBlLl9jYWxjdWxhdGVDaGFyU2l6ZT1mdW5jdGlvbigpe3RoaXMuZG9tLm1lYXN1cmVDaGFyTWlub3J8fCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksdGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5jbGFzc05hbWU9XCJ2aXMtdGV4dCB2aXMtbWlub3IgdmlzLW1lYXN1cmVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiMFwiKSksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yKSksdGhpcy5wcm9wcy5taW5vckNoYXJIZWlnaHQ9dGhpcy5kb20ubWVhc3VyZUNoYXJNaW5vci5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aD10aGlzLmRvbS5tZWFzdXJlQ2hhck1pbm9yLmNsaWVudFdpZHRoLHRoaXMuZG9tLm1lYXN1cmVDaGFyTWFqb3J8fCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksdGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGFzc05hbWU9XCJ2aXMtdGV4dCB2aXMtbWFqb3IgdmlzLW1lYXN1cmVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiMFwiKSksdGhpcy5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yKSksdGhpcy5wcm9wcy5tYWpvckNoYXJIZWlnaHQ9dGhpcy5kb20ubWVhc3VyZUNoYXJNYWpvci5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5tYWpvckNoYXJXaWR0aD10aGlzLmRvbS5tZWFzdXJlQ2hhck1ham9yLmNsaWVudFdpZHRofTt2YXIgdT0hMTt0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXttb21lbnQ6YSxsb2NhbGVzOmgsbG9jYWxlOlwiZW5cIixpZDp2b2lkIDAsdGl0bGU6dm9p
21167ZCAwfSx0aGlzLm9wdGlvbnM9cy5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksZSYmZS50aW1lP3RoaXMuY3VzdG9tVGltZT1lLnRpbWU6dGhpcy5jdXN0b21UaW1lPW5ldyBEYXRlLHRoaXMuZXZlbnRQYXJhbXM9e30sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMuX2NyZWF0ZSgpfXZhciBuPWkoMTApLHM9aSgyKSxyPWkoMTYpLGE9aSg5KSxoPWkoOTgpO28ucHJvdG90eXBlPW5ldyByLG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dCYmcy5zZWxlY3RpdmVFeHRlbmQoW1wibW9tZW50XCIsXCJsb2NhbGVcIixcImxvY2FsZXNcIixcImlkXCJdLHRoaXMub3B0aW9ucyx0KX0sby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5ib2R5LnJhbmdlLl9vbk1vdXNlV2hlZWwodCl9dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlW1wiY3VzdG9tLXRpbWVcIl09dGhpcyxlLmNsYXNzTmFtZT1cInZpcy1jdXN0b20tdGltZSBcIisodGhpcy5vcHRpb25zLmlkfHxcIlwiKSxlLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlLnN0eWxlLnRvcD1cIjBweFwiLGUuc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLHRoaXMuYmFyPWU7dmFyIGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtpLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIixpLnN0eWxlLnRvcD1cIjBweFwiLGkuc3R5bGUubGVmdD1cIi0xMHB4XCIsaS5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsaS5zdHlsZS53aWR0aD1cIjIwcHhcIixpLmFkZEV2ZW50TGlzdGVuZXI/KGkuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIix0LmJpbmQodGhpcyksITEpLGkuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsdC5iaW5kKHRoaXMpLCExKSk6aS5hdHRhY2hFdmVudChcIm9ubW91c2V3aGVlbFwiLHQuYmluZCh0aGlzKSksZS5hcHBlbmRDaGlsZChpKSx0aGlzLmhhbW1lcj1uZXcgbihpKSx0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKFwicGFuZW5kXCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldChcInBhblwiKS5zZXQoe3RocmVzaG9sZDo1LGRpcmVjdGlvbjpuLkRJUkVDVElPTl9IT1JJWk9OVEFMfSl9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmhpZGUoKSx0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmJvZHk9bnVsbH0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWw7dGhpcy5iYXIucGFyZW50Tm9kZSE9dCYmKHR
21167oaXMuYmFyLnBhcmVudE5vZGUmJnRoaXMuYmFyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5iYXIpLHQuYXBwZW5kQ2hpbGQodGhpcy5iYXIpKTt2YXIgZT10aGlzLmJvZHkudXRpbC50b1NjcmVlbih0aGlzLmN1c3RvbVRpbWUpLGk9dGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV07aXx8KHRoaXMud2FybmVkfHwoY29uc29sZS5sb2coXCJXQVJOSU5HOiBvcHRpb25zLmxvY2FsZXNbJ1wiK3RoaXMub3B0aW9ucy5sb2NhbGUrXCInXSBub3QgZm91bmQuIFNlZSBodHRwOi8vdmlzanMub3JnL2RvY3MvdGltZWxpbmUvI0xvY2FsaXphdGlvblwiKSx0aGlzLndhcm5lZD0hMCksaT10aGlzLm9wdGlvbnMubG9jYWxlcy5lbik7dmFyIG89dGhpcy5vcHRpb25zLnRpdGxlO3JldHVybiB2b2lkIDA9PT1vPyhvPWkudGltZStcIjogXCIrdGhpcy5vcHRpb25zLm1vbWVudCh0aGlzLmN1c3RvbVRpbWUpLmZvcm1hdChcImRkZGQsIE1NTU0gRG8gWVlZWSwgSDptbTpzc1wiKSxvPW8uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrby5zdWJzdHJpbmcoMSkpOlwiZnVuY3Rpb25cIj09dHlwZW9mIG8mJihvPW8uY2FsbCh0aGlzLmN1c3RvbVRpbWUpKSx0aGlzLmJhci5zdHlsZS5sZWZ0PWUrXCJweFwiLHRoaXMuYmFyLnRpdGxlPW8sITF9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKX0sby5wcm90b3R5cGUuc2V0Q3VzdG9tVGltZT1mdW5jdGlvbih0KXt0aGlzLmN1c3RvbVRpbWU9cy5jb252ZXJ0KHQsXCJEYXRlXCIpLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmdldEN1c3RvbVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSl9LG8ucHJvdG90eXBlLnNldEN1c3RvbVRpdGxlPWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy50aXRsZT10fSxvLnByb3RvdHlwZS5fb25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5ldmVudFBhcmFtcy5kcmFnZ2luZz0hMCx0aGlzLmV2ZW50UGFyYW1zLmN1c3RvbVRpbWU9dGhpcy5jdXN0b21UaW1lLHQuc3RvcFByb3BhZ2F0aW9uKCl9LG8ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodGhpcy5ldmVudFBhcmFtcy5kcmFnZ2luZyl7dmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4odGhpcy5ldmVudFBhcmFtcy5jdXN0b21UaW1lKSt0LmRlbHRhWCxpPXRoaXMuYm9keS51dGlsLnRvVGltZShlKTt0aGlzLnNldEN1c3RvbVRpbWUoaSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInRpbWVjaGFuZ2VcIix7aWQ6dGhpcy5vcHRpb25zLmlkLHRpbWU6bmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSksZXZlbnQ6dH0pLHQuc3RvcFByb3BhZ2F0aW9uKCl9fSxvLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe3RoaXMuZXZlbnRQYXJhbXMuZHJhZ2dpbmcmJih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwidGltZWNoYW5nZWRcIix7aWQ6dGhpcy5vcHRpb25zLmlkLHRpbWU6bmV3IERhdGUodGhpcy5jdXN0b21UaW1lLnZhbHVlT2YoKSksZXZlbnQ6dH0pLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSxvLmN1c3RvbVRpbWVGcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10LnRhcmdldDtlOyl7aWYoZS5oYXNPd25Qcm9wZXJ0eShcImN1c3RvbS10aW1lXCIpKXJldHVybiBlW1wiY3VzdG9tLXRpbWVcIl07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1pKDExNykuZGVmYXVsdCxsPWkoNDgpLmRlZmF1bHQsdT1pKDE5MykuZGVmYXVsdCxjPWkoMjAwKS5kZWZhdWx0LHA9aSgyMDEpLmRlZmF1bHQsZj1pKDIwMikuZGVmYXVsdCxtPWkoMjAzKS5kZWZhdWx0LHY9aSgyMDQpLmRlZmF1bHQsZz1pKDIwNSkuZGVmYXVsdCx5PWkoMjA2KS5kZWZhdWx0LGI9aSgyMDcpLmRlZmF1bHQsXz1pKDIwOCkuZGVmYXVsdCx3PWkoMjA5KS5kZWZhdWx0LHg9aSgyMTApLmRlZmF1bHQsaz1pKDIxMSkuZGVmYXVsdCxTPWkoMjEyKS5kZWZhdWx0LEQ9aSgyMTMpLmRlZmF1bHQsTT1pKDE1KSxDPU0ucHJpbnRTdHlsZSxPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyxuLHIsYSl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMub3B0aW9ucz1oLmJyaWRnZU9iamVjdChyKSx0aGlzLmdsb2JhbE9wdGlvbnM9cix0aGlzLmRlZmF1bHRPcHRpb25zPWEsdGhpcy5ib2R5PWksdGhpcy5lZGdlcz1bXSx0aGlzLmlkPXZvaWQgMCx0aGlzLmltYWdlbGlzdD1vLHRoaXMuZ3JvdXBsaXN0PW4sdGhpcy54PXZvaWQgMCx0aGlzLnk9dm9pZCAwLHRoaXMuYmFzZVNpemU9dGhpcy5vcHRpb25zLnNpemUsdGhpcy5iYXNlRm9udFNpemU9dGhpcy5vcHRpb25zLmZvbnQuc2l6ZSx0aGlzLnByZWRlZmluZWRQb3NpdGlvbj0hMSx0aGlzLnNlbGVjdGVkPSExLHRoaXMuaG92ZXI9ITEsdGhpcy5sYWJlbE1vZHVsZT1uZXcgZCh0aGlzLmJvZHksdGhpcy5vcHRpb25zLCExKSx0aGlzLnNldE9wdGlvbnMoZSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYXR0YWNoRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpey0xPT09dGhpcy5lZGdlcy5pbmRleE9mKHQpJiZ0aGlzLmVkZ2VzLnB1c2godCl9fSx7a2V5OlwiZGV0YWNoRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZXMuaW5kZXhPZih0KTstMSE9ZSYmdGhpcy5lZGdlcy5zcGxpY2UoZSwxKX19LHtrZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dmFyIGk9dGhpcy5vcHRpb25zLnNoYXBlO2lmKGUpe2lmKHZvaWQgMCE9PWUuaWQmJih0aGlzLmlkPWUuaWQpLHZvaWQgMD09PXRoaXMuaWQpdGhyb3cgbmV3IEVycm9yKFwiTm9kZSBtdXN0IGhhdmUgYW4gaWRcIik7dC5jaGVja01hc3MoZSx0aGlzLmlkKSx2b2lkIDAhPT1lLngmJihudWxsPT09ZS54Pyh0aGlzLng9dm9pZCAwLHRoaXMucHJlZGVmaW5lZFBvc2l0aW9uPSExKToodGhpcy54PXBhcnNlSW50KGUueCksdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITApKSx2b2lkIDAhPT1lLnkmJihudWxsPT09ZS55Pyh0aGlzLnk9dm9pZCAwLHRoaXMucHJlZGVmaW5lZFBvc2l0aW9uPSExKToodGhpcy55PXBhcnNlSW50KGUueSksdGhpcy5wcmVkZWZpbmVkUG9zaXRpb249ITApKSx2b2lkIDAhPT1lLnNpemUmJih0aGlzLmJhc2VTaXplPWUuc2l6ZSksdm9pZCAwIT09ZS52YWx1ZSYmKGUudmFsdWU9cGFyc2VGbG9hdChlLnZhbHVlKSksdC5wYXJzZU9wdGlvbnModGhpcy5vcHRpb25zLGUsITAsdGhpcy5nbG9iYWxPcHRpb25zLHRoaXMuZ3JvdXBsaXN0KTt2YXIgbz1bZSx0aGlzLm9wdGlvbnMsdGhpcy5kZWZh
21167dWx0T3B0aW9uc107cmV0dXJuIHRoaXMuY2hvb3Nlcj1sLmNob29zaWZ5KFwibm9kZVwiLG8pLHRoaXMuX2xvYWRfaW1hZ2VzKCksdGhpcy51cGRhdGVMYWJlbE1vZHVsZShlKSx0aGlzLnVwZGF0ZVNoYXBlKGkpLHZvaWQgMCE9PWUuaGlkZGVufHx2b2lkIDAhPT1lLnBoeXNpY3N9fX0se2tleTpcIl9sb2FkX2ltYWdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJjaXJjdWxhckltYWdlXCI9PT10aGlzLm9wdGlvbnMuc2hhcGV8fFwiaW1hZ2VcIj09PXRoaXMub3B0aW9ucy5zaGFwZSl7aWYodm9pZCAwPT09dGhpcy5vcHRpb25zLmltYWdlKXRocm93IG5ldyBFcnJvcihcIk9wdGlvbiBpbWFnZSBtdXN0IGJlIGRlZmluZWQgZm9yIG5vZGUgdHlwZSAnXCIrdGhpcy5vcHRpb25zLnNoYXBlK1wiJ1wiKTtpZih2b2lkIDA9PT10aGlzLmltYWdlbGlzdCl0aHJvdyBuZXcgRXJyb3IoXCJJbnRlcm5hbCBFcnJvcjogTm8gaW1hZ2VzIHByb3ZpZGVkXCIpO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuaW1hZ2UpdGhpcy5pbWFnZU9iaj10aGlzLmltYWdlbGlzdC5sb2FkKHRoaXMub3B0aW9ucy5pbWFnZSx0aGlzLm9wdGlvbnMuYnJva2VuSW1hZ2UsdGhpcy5pZCk7ZWxzZXtpZih2b2lkIDA9PT10aGlzLm9wdGlvbnMuaW1hZ2UudW5zZWxlY3RlZCl0aHJvdyBuZXcgRXJyb3IoXCJObyB1bnNlbGVjdGVkIGltYWdlIHByb3ZpZGVkXCIpO3RoaXMuaW1hZ2VPYmo9dGhpcy5pbWFnZWxpc3QubG9hZCh0aGlzLm9wdGlvbnMuaW1hZ2UudW5zZWxlY3RlZCx0aGlzLm9wdGlvbnMuYnJva2VuSW1hZ2UsdGhpcy5pZCksdm9pZCAwIT09dGhpcy5vcHRpb25zLmltYWdlLnNlbGVjdGVkP3RoaXMuaW1hZ2VPYmpBbHQ9dGhpcy5pbWFnZWxpc3QubG9hZCh0aGlzLm9wdGlvbnMuaW1hZ2Uuc2VsZWN0ZWQsdGhpcy5vcHRpb25zLmJyb2tlbkltYWdlLHRoaXMuaWQpOnRoaXMuaW1hZ2VPYmpBbHQ9dm9pZCAwfX19fSx7a2V5OlwiZ2V0Rm9ybWF0dGluZ1ZhbHVlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9e2NvbG9yOnRoaXMub3B0aW9ucy5jb2xvci5iYWNrZ3JvdW5kLGJvcmRlcldpZHRoOnRoaXMub3B0aW9ucy5ib3JkZXJXaWR0aCxib3JkZXJDb2xvcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHNpemU6dGhpcy5vcHRpb25zLnNpemUsYm9yZGVyRGFzaGVzOnRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuYm9yZGVyRGFzaGVzLGJvcmRlclJhZGl1czp0aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlclJhZGl1cyxzaGFkb3c6dGhpcy5vcHRpb25zLnNoYWRvdy5lbmFibGVkLHNoYWRvd0NvbG9yOnRoaXMub3B0aW9ucy5zaGFkb3cuY29sb3Isc2hhZG93U2l6ZTp0aGlzLm9wdGlvbnMuc2hhZG93LnNpemUsc2hhZG93WDp0aGlzLm9wdGlvbnMuc2hhZG93Lngsc2hhZG93WTp0aGlzLm9wdGlvbnMuc2hhZG93Lnl9O3JldHVybiB0aGlzLnNlbGVjdGVkfHx0aGlzLmhvdmVyPyEwPT09dGhpcy5jaG9vc2VyP3RoaXMuc2VsZWN0ZWQ/KHQuYm9yZGVyV2lkdGgqPTIsdC5jb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJhY2tncm91bmQsdC5ib3JkZXJDb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcix0LnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQpOnRoaXMuaG92ZXImJih0LmNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5ob3Zlci5iYWNrZ3JvdW5kLHQuYm9yZGVyQ29sb3I9dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcix0LnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQpOlwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuY2hvb3NlciYmKHRoaXMuY2hvb3Nlcih0LHRoaXMub3B0aW9ucy5pZCx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpLCExPT09dC5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPT09dGhpcy5vcHRpb25zLnNoYWRvdy5jb2xvciYmdC5zaGFkb3dTaXplPT09dGhpcy5vcHRpb25zLnNoYWRvdy5zaXplJiZ0LnNoYWRvd1g9PT10aGlzLm9wdGlvbnMuc2hhZG93LngmJnQuc2hhZG93WT09PXRoaXMub3B0aW9ucy5zaGFkb3cueXx8KHQuc2hhZG93PSEwKSkpOnQuc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCx0fX0se2tleTpcInVwZGF0ZUxhYmVsTW9kdWxlXCIsdmFsdWU6ZnVuY3Rpb24oZSl7dm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsJiZudWxsIT09dGhpcy5vcHRpb25zLmxhYmVsfHwodGhpcy5vcHRpb25zLmxhYmVsPVwiXCIpLHQudXBkYXRlR3JvdXBPcHRpb25zKHRoaXMub3B0aW9ucyxlLHRoaXMuZ3JvdXBsaXN0KTt2YXIgaT10aGlzLmdyb3VwbGlzdC5nZXQodGhpcy5vcHRpb25zLmdyb3VwLCExKSxvPVtlLHRoaXMub3B0aW9ucyxpLHRoaXMuZ2xvYmFsT3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zXTt0aGlzLmxhYmVsTW9kdWxlLnVwZGF0ZSh0aGlzLm9wdGlvbnMsbyksdm9pZCAwIT09dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSYmKHRoaXMuYmFzZUZvbnRTaXplPXRoaXMubGFiZWxNb2R1bGUuYmFzZVNpemUpfX0se2tleTpcInVwZGF0ZVNoYXBlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodD09PXRoaXMub3B0aW9ucy5zaGFwZSYmdGhpcy5zaGFwZSl0aGlzLnNoYXBlLnNldE9wdGlvbnModGhpcy5vcHRpb25zLHRoaXMuaW1hZ2VPYmosdGhpcy5pbWFnZU9iakFsdCk7ZWxzZSBzd2l0Y2godGhpcy5vcHRpb25zLnNoYXBlKXtjYXNlXCJib3hcIjp0aGlzLnNoYXBlPW5ldyB1KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZVwiY2lyY2xlXCI6dGhpcy5zaGFwZT1uZXcgYyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImNpcmN1bGFySW1hZ2VcIjp0aGlzLnNoYXBlPW5ldyBwKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSx0aGlzLmltYWdlT2JqLHRoaXMuaW1hZ2VPYmpBbHQpO2JyZWFrO2Nhc2VcImRhdGFiYXNlXCI6dGhpcy5zaGFwZT1uZXcgZih0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImRpYW1vbmRcIjp0aGlzLnNoYXBlPW5ldyBtKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVs
21167ZSk7YnJlYWs7Y2FzZVwiZG90XCI6dGhpcy5zaGFwZT1uZXcgdih0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImVsbGlwc2VcIjp0aGlzLnNoYXBlPW5ldyBnKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZVwiaWNvblwiOnRoaXMuc2hhcGU9bmV3IHkodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlXCJpbWFnZVwiOnRoaXMuc2hhcGU9bmV3IGIodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlLHRoaXMuaW1hZ2VPYmosdGhpcy5pbWFnZU9iakFsdCk7YnJlYWs7Y2FzZVwic3F1YXJlXCI6dGhpcy5zaGFwZT1uZXcgXyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcImhleGFnb25cIjp0aGlzLnNoYXBlPW5ldyB3KHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk7YnJlYWs7Y2FzZVwic3RhclwiOnRoaXMuc2hhcGU9bmV3IHgodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztjYXNlXCJ0ZXh0XCI6dGhpcy5zaGFwZT1uZXcgayh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcInRyaWFuZ2xlXCI6dGhpcy5zaGFwZT1uZXcgUyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpO2JyZWFrO2Nhc2VcInRyaWFuZ2xlRG93blwiOnRoaXMuc2hhcGU9bmV3IEQodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTticmVhaztkZWZhdWx0OnRoaXMuc2hhcGU9bmV3IGcodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKX10aGlzLm5lZWRzUmVmcmVzaCgpfX0se2tleTpcInNlbGVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5zZWxlY3RlZD0hMCx0aGlzLm5lZWRzUmVmcmVzaCgpfX0se2tleTpcInVuc2VsZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkPSExLHRoaXMubmVlZHNSZWZyZXNoKCl9fSx7a2V5OlwibmVlZHNSZWZyZXNoXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNoYXBlLnJlZnJlc2hOZWVkZWQ9ITB9fSx7a2V5OlwiZ2V0VGl0bGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudGl0bGV9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuc2hhcGUuZGlzdGFuY2VUb0JvcmRlcih0LGUpfX0se2tleTpcImlzRml4ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMuZml4ZWQueCYmdGhpcy5vcHRpb25zLmZpeGVkLnl9fSx7a2V5OlwiaXNTZWxlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWR9fSx7a2V5OlwiZ2V0VmFsdWVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWV9fSx7a2V5OlwiZ2V0TGFiZWxTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sYWJlbE1vZHVsZS5zaXplKCl9fSx7a2V5Olwic2V0VmFsdWVSYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDAhPT10aGlzLm9wdGlvbnMudmFsdWUpe3ZhciBvPXRoaXMub3B0aW9ucy5zY2FsaW5nLmN1c3RvbVNjYWxpbmdGdW5jdGlvbih0LGUsaSx0aGlzLm9wdGlvbnMudmFsdWUpLG49dGhpcy5vcHRpb25zLnNjYWxpbmcubWF4LXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbjtpZighMD09PXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLmVuYWJsZWQpe3ZhciBzPXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW47dGhpcy5vcHRpb25zLmZvbnQuc2l6ZT10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW4rbypzfXRoaXMub3B0aW9ucy5zaXplPXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbitvKm59ZWxzZSB0aGlzLm9wdGlvbnMuc2l6ZT10aGlzLmJhc2VTaXplLHRoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5iYXNlRm9udFNpemU7dGhpcy51cGRhdGVMYWJlbE1vZHVsZSgpfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEZvcm1hdHRpbmdWYWx1ZXMoKTt0aGlzLnNoYXBlLmRyYXcodCx0aGlzLngsdGhpcy55LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2hhcGUudXBkYXRlQm91bmRpbmdCb3godGhpcy54LHRoaXMueSx0KX19LHtrZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmdldEZvcm1hdHRpbmdWYWx1ZXMoKTt0aGlzLnNoYXBlLnJlc2l6ZSh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlKX19LHtrZXk6XCJnZXRJdGVtc09uUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gdGhpcy5sYWJlbE1vZHVsZS52aXNpYmxlKCkmJmwucG9pbnRJblJlY3QodGhpcy5sYWJlbE1vZHVsZS5nZXRTaXplKCksdCkmJmUucHVzaCh7bm9kZUlkOnRoaXMuaWQsbGFiZWxJZDowfSksbC5wb2ludEluUmVjdCh0aGlzLnNoYXBlLmJvdW5kaW5nQm94LHQpJiZlLnB1c2goe25vZGVJZDp0aGlzLmlkfSksZX19LHtrZXk6XCJpc092ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYXBlLmxlZnQ8dC5yaWdodCYmdGhpcy5zaGFwZS5sZWZ0K3RoaXMuc2hhcGUud2lkdGg+dC5sZWZ0JiZ0aGlzLnNoYXBlLnRvcDx0LmJvdHRvbSYmdGhpcy5zaGFwZS50b3ArdGhpcy5zaGFwZS5oZWlnaHQ+dC50b3B9fSx7a2V5OlwiaXNCb3VuZGluZ0JveE92ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQ8dC5yaWdodCYmdGhpcy5zaGFwZS5ib3VuZGluZ0JveC5yaWdodD50LmxlZnQmJnRoaXMuc2hhcGUuYm91bmRpbmdCb3gudG9wPHQuYm90dG9tJiZ0aGlzLnNoYXBlLmJvdW5kaW5nQm94LmJvdHRvbT50LnRvcH19XSxbe2tleTpcInVwZGF0ZUdyb3VwT3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtp
21167Zih2b2lkIDAhPT1pKXt2YXIgbz10Lmdyb3VwO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUuZ3JvdXAmJm8hPT1lLmdyb3VwKXRocm93IG5ldyBFcnJvcihcInVwZGF0ZUdyb3VwT3B0aW9uczogZ3JvdXAgdmFsdWVzIGluIG9wdGlvbnMgZG9uJ3QgbWF0Y2guXCIpO2lmKFwibnVtYmVyXCI9PXR5cGVvZiBvfHxcInN0cmluZ1wiPT10eXBlb2YgbyYmXCJcIiE9byl7dmFyIG49aS5nZXQobyk7aC5zZWxlY3RpdmVOb3REZWVwRXh0ZW5kKFtcImZvbnRcIl0sdCxuKSx0LmNvbG9yPWgucGFyc2VDb2xvcih0LmNvbG9yKX19fX0se2tleTpcInBhcnNlT3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXSxuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTp7fSxzPWFyZ3VtZW50c1s0XSxyPVtcImNvbG9yXCIsXCJmaXhlZFwiLFwic2hhZG93XCJdO2lmKGguc2VsZWN0aXZlTm90RGVlcEV4dGVuZChyLGUsaSxvKSx0LmNoZWNrTWFzcyhpKSxoLm1lcmdlT3B0aW9ucyhlLGksXCJzaGFkb3dcIixuKSx2b2lkIDAhPT1pLmNvbG9yJiZudWxsIT09aS5jb2xvcil7dmFyIGE9aC5wYXJzZUNvbG9yKGkuY29sb3IpO2guZmlsbElmRGVmaW5lZChlLmNvbG9yLGEpfWVsc2UhMD09PW8mJm51bGw9PT1pLmNvbG9yJiYoZS5jb2xvcj1oLmJyaWRnZU9iamVjdChuLmNvbG9yKSk7dm9pZCAwIT09aS5maXhlZCYmbnVsbCE9PWkuZml4ZWQmJihcImJvb2xlYW5cIj09dHlwZW9mIGkuZml4ZWQ/KGUuZml4ZWQueD1pLmZpeGVkLGUuZml4ZWQueT1pLmZpeGVkKToodm9pZCAwIT09aS5maXhlZC54JiZcImJvb2xlYW5cIj09dHlwZW9mIGkuZml4ZWQueCYmKGUuZml4ZWQueD1pLmZpeGVkLngpLHZvaWQgMCE9PWkuZml4ZWQueSYmXCJib29sZWFuXCI9PXR5cGVvZiBpLmZpeGVkLnkmJihlLmZpeGVkLnk9aS5maXhlZC55KSkpLCEwPT09byYmbnVsbD09PWkuZm9udCYmKGUuZm9udD1oLmJyaWRnZU9iamVjdChuLmZvbnQpKSx0LnVwZGF0ZUdyb3VwT3B0aW9ucyhlLGkscyksdm9pZCAwIT09aS5zY2FsaW5nJiZoLm1lcmdlT3B0aW9ucyhlLnNjYWxpbmcsaS5zY2FsaW5nLFwibGFiZWxcIixuLnNjYWxpbmcpfX0se2tleTpcImNoZWNrTWFzc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dC5tYXNzJiZ0Lm1hc3M8PTApe3ZhciBpPVwiXCI7dm9pZCAwIT09ZSYmKGk9XCIgaW4gbm9kZSBpZDogXCIrZSksY29uc29sZS5sb2coXCIlY05lZ2F0aXZlIG9yIHplcm8gbWFzcyBkaXNhbGxvd2VkXCIraStcIiwgc2V0dGluZyBtYXNzIHRvIDEuXCIsQyksdC5tYXNzPTF9fX1dKSx0fSgpO2UuZGVmYXVsdD1PfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSg2KSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSgyKSx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLGEuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxkLmRlZmF1bHQpKHQsbnVsbCxbe2tleTpcImNob29zaWZ5XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1bXCJub2RlXCIsXCJlZGdlXCIsXCJsYWJlbFwiXSxvPSEwLG49bC50b3BNb3N0KGUsXCJjaG9zZW5cIik7aWYoXCJib29sZWFuXCI9PXR5cGVvZiBuKW89bjtlbHNlIGlmKFwib2JqZWN0XCI9PT0odm9pZCAwPT09bj9cInVuZGVmaW5lZFwiOigwLHMuZGVmYXVsdCkobikpKXtpZigtMT09PWkuaW5kZXhPZih0KSl0aHJvdyBuZXcgRXJyb3IoXCJjaG9vc2lmeTogc3ViT3B0aW9uICdcIit0K1wiJyBzaG91bGQgYmUgb25lIG9mICdcIitpLmpvaW4oXCInLCAnXCIpK1wiJ1wiKTt2YXIgcj1sLnRvcE1vc3QoZSxbXCJjaG9zZW5cIix0XSk7XCJib29sZWFuXCIhPXR5cGVvZiByJiZcImZ1bmN0aW9uXCIhPXR5cGVvZiByfHwobz1yKX1yZXR1cm4gb319LHtrZXk6XCJwb2ludEluUmVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih0LndpZHRoPD0wfHx0LmhlaWdodDw9MClyZXR1cm4hMTtpZih2b2lkIDAhPT1pKXt2YXIgbz17eDplLngtaS54LHk6ZS55LWkueX07aWYoMCE9PWkuYW5nbGUpe3ZhciBuPS1pLmFuZ2xlO2U9e3g6TWF0aC5jb3Mobikqby54LU1hdGguc2luKG4pKm8ueSx5Ok1hdGguc2luKG4pKm8ueCtNYXRoLmNvcyhuKSpvLnl9fWVsc2UgZT1vfXZhciBzPXQueCt0LndpZHRoLHI9dC55K3Qud2lkdGg7cmV0dXJuIHQubGVmdDxlLngmJnM+ZS54JiZ0LnRvcDxlLnkmJnI+ZS55fX0se2tleTpcImlzVmFsaWRMYWJlbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0JiZcIlwiIT09dH19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2koMTI1KTtmb3IodmFyIG89aSgxOCksbj1pKDI2KSxzPWkoMzEpLHI9aSgxMykoXCJ0b1N0cmluZ1RhZ1wiKSxhPVwiQ1NTUnVsZUxpc3QsQ1NTU3R5bGVEZWNsYXJhdGlvbixDU1NWYWx1ZUxpc3QsQ2xpZW50UmVjdExpc3QsRE9NUmVjdExpc3QsRE9NU3RyaW5nTGlzdCxET01Ub2tlbkxpc3QsRGF0YVRyYW5zZmVySXRlbUxpc3QsRmlsZUxpc3QsSFRNTEFsbENvbGxlY3Rpb24sSFRNTENvbGxlY3Rpb24sSFRNTEZvcm1FbGVtZW50LEhUTUxTZWxlY3RFbGVtZW50LE1lZGlhTGlzdCxNaW1lVHlwZUFycmF5LE5hbWVkTm9kZU1hcCxOb2RlTGlzdCxQYWludFJlcXVlc3RMaXN0LFBsdWdpbixQbHVnaW5BcnJheSxTVkdMZW5ndGhMaXN0LFNWR051bWJlckxpc3QsU1ZHUGF0aFNlZ0xpc3QsU1ZHUG9pbnRMaXN0LFNWR1N0cmluZ0xpc3QsU1ZHVHJhbnNmb3JtTGlzdCxTb3VyY2VCdWZmZXJMaXN0LFN0eWxlU2hlZXRMaXN0LFRleHRUcmFja0N1ZUxpc3QsVGV4dFRyYWNrTGlzdCxUb3VjaExpc3RcIi5zcGxpdChcIixcIiksaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgZD1hW2hdLGw9b1tkXSx1PWwmJmwucHJvdG90eXBlO3UmJiF1W3JdJiZuKHUscixkKSxzW2RdPXMuQXJyYXl9fSxmdW5jdGlvbih0LGUpe3ZhciBpPXt9LnRvU3RyaW5nO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gaS5jYWxsKHQpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT10KXRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uICBcIit0KTtyZXR1cm4gdH19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPSEwfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgzMik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7aWYoIW8odCkpcmV0dXJuIHQ7dmFyIGksbjtpZihlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZihpPXQudG9TdHJpbmcpJiYhbyhuPWkuY2FsbCh0KSkpcmV0dXJuIG47aWYoXCJmdW5jdGlvblwiPT10eXBlb2YoaT10LnZhbHVlT2YpJiYhbyhuPWkuY2FsbCh0KSkpcmV0dXJuIG47aWYoIWUmJlwiZnVuY3Rpb25cIj09dHlwZW9mKGk9dC50b1N0cmluZykmJiFvKG49aS5jYWxsKHQpKSlyZXR1cm4gbjt0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyNyksbj1pKDEzMCkscz1pKDU4KSxyPWkoNTYpKFwiSUVfUFJPVE9cIiksYT1mdW5jdGlvbigpe30saD1mdW5jdGlvbigpe3ZhciB0LGU9aSg4MikoXCJpZnJhbWVcIiksbz1zLmxlbmd0aDtmb3IoZS5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLGkoMTM0KS5hcHBlbmRDaGlsZChlKSxlLnNyYz1cImphdmFzY3JpcHQ6XCIsdD1lLmNvbnRlbn
21167RXaW5kb3cuZG9jdW1lbnQsdC5vcGVuKCksdC53cml0ZShcIjxzY3JpcHQ+ZG9jdW1lbnQuRj1PYmplY3Q8XFwvc2NyaXB0PlwiKSx0LmNsb3NlKCksaD10LkY7by0tOylkZWxldGUgaC5wcm90b3R5cGVbc1tvXV07cmV0dXJuIGgoKX07dC5leHBvcnRzPU9iamVjdC5jcmVhdGV8fGZ1bmN0aW9uKHQsZSl7dmFyIGk7cmV0dXJuIG51bGwhPT10PyhhLnByb3RvdHlwZT1vKHQpLGk9bmV3IGEsYS5wcm90b3R5cGU9bnVsbCxpW3JdPXQpOmk9aCgpLHZvaWQgMD09PWU/aTpuKGksZSl9fSxmdW5jdGlvbih0LGUpe3ZhciBpPU1hdGguY2VpbCxvPU1hdGguZmxvb3I7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBpc05hTih0PSt0KT8wOih0PjA/bzppKSh0KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU3KShcImtleXNcIiksbj1pKDQwKTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7cmV0dXJuIG9bdF18fChvW3RdPW4odCkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTgpLG49b1tcIl9fY29yZS1qc19zaGFyZWRfX1wiXXx8KG9bXCJfX2NvcmUtanNfc2hhcmVkX19cIl09e30pO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gblt0XXx8KG5bdF09e30pfX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9XCJjb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eSxpc1Byb3RvdHlwZU9mLHByb3BlcnR5SXNFbnVtZXJhYmxlLHRvTG9jYWxlU3RyaW5nLHRvU3RyaW5nLHZhbHVlT2ZcIi5zcGxpdChcIixcIil9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIwKS5mLG49aSgyMikscz1pKDEzKShcInRvU3RyaW5nVGFnXCIpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7dCYmIW4odD1pP3Q6dC5wcm90b3R5cGUscykmJm8odCxzLHtjb25maWd1cmFibGU6ITAsdmFsdWU6ZX0pfX0s
21167ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTM1KSghMCk7aSg3OSkoU3RyaW5nLFwiU3RyaW5nXCIsZnVuY3Rpb24odCl7dGhpcy5fdD1TdHJpbmcodCksdGhpcy5faT0wfSxmdW5jdGlvbigpe3ZhciB0LGU9dGhpcy5fdCxpPXRoaXMuX2k7cmV0dXJuIGk+PWUubGVuZ3RoP3t2YWx1ZTp2b2lkIDAsZG9uZTohMH06KHQ9byhlLGkpLHRoaXMuX2krPXQubGVuZ3RoLHt2YWx1ZTp0LGRvbmU6ITF9KX0pfSxmdW5jdGlvbih0LGUsaSl7ZS5mPWkoMTMpfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxOCksbj1pKDcpLHM9aSg1Mikscj1pKDYxKSxhPWkoMjApLmY7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW4uU3ltYm9sfHwobi5TeW1ib2w9cz97fTpvLlN5bWJvbHx8e30pO1wiX1wiPT10LmNoYXJBdCgwKXx8dCBpbiBlfHxhKGUsdCx7dmFsdWU6ci5mKHQpfSl9fSxmdW5jdGlvbih0LGUpe2UuZj1PYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19ZnVuY3Rpb24gbih0LGUpe3ZhciBpPXAoKS5ob3VycygwKS5taW51dGVzKDApLnNlY29uZHMoMCkubWlsbGlzZWNvbmRzKDApLG89aS5jbG9uZSgpLmFkZCgtMyxcImRheXNcIikudmFsdWVPZigpLG49aS5jbG9uZSgpLmFkZCgzLFwiZGF5c1wiKS52YWx1ZU9mKCk7dGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlPXZvaWQgMCx2b2lkIDA9PT1lPyh0aGlzLnN0YXJ0PW8sdGhpcy5lbmQ9bik6KHRoaXMuc3RhcnQ9ZS5zdGFydHx8byx0aGlzLmVuZD1lLmVuZHx8biksdGhpcy5yb2xsaW5nPSExLHRoaXMuYm9keT10LHRoaXMuZGVsdGFEaWZmZXJlbmNlPTAsdGhpcy5zY2FsZU9mZnNldD0wLHRoaXMuc3RhcnRUb0Zyb250PSExLHRoaXMuZW5kVG9Gcm9udD0hMCx0aGlzLmRlZmF1bHRPcHRpb25zPXtydGw6ITEsc3RhcnQ6bnVsbCxlbmQ6bnVsbCxtb21lbnQ6cCxkaXJlY3Rpb246XCJob3Jpem9udGFsXCIsbW92ZWFibGU6ITAsem9vbWFibGU6ITAsbWluOm51bGwsbWF4Om51bGwsem9vbU1pbjoxMCx6b29tTWF4OjMxNTM2ZTEwLHJvbGxpbmdNb2RlOntmb2xsb3c6ITEsb2Zmc2V0Oi41fX0sdGhpcy5vcHRpb25zPWMuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMucHJvcHM9e3RvdWNoOnt9fSx0aGlzLmFuaW1hdGlvblRpbWVyPW51bGwsdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJwYW5zdGFydFwiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwicGFubW92ZVwiLHRoaXMuX29uRHJhZy5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInBhbmVuZFwiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIm1vdXNld2hlZWxcIix0aGlzLl9vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJ0b3VjaFwiLHRoaXMuX29uVG91Y2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJwaW5jaFwiLHRoaXMuX29uUGluY2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLnN0YXJ0Um9sbGluZy5iaW5kKHRoaXMpKSx0aGlzLnNldE9wdGlvbnMoZSl9ZnVuY3Rpb24gcyh0KXtpZihcImhvcml6b250YWxcIiE9dCYmXCJ2ZXJ0aWNhbFwiIT10KXRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZGlyZWN0aW9uIFwiJyt0KydcIi4gQ2hvb3NlIFwiaG9yaXpvbnRhbFwiIG9yIFwidmVydGljYWxcIi4nKX12YXIgcj1pKDgpLGE9byhyKSxoPWkoMTkpLGQ9byhoKSxsPWkoNiksdT1vKGwpLGM9aSgyKSxwPWkoOSksZj1pKDE2KSxtPWkoMzYpO24ucHJvdG90eXBlPW5ldyBmLG4ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7aWYodCl7dmFyIGU9W1wiYW5pbWF0aW9uXCIsXCJkaXJlY3Rpb25cIixcIm1pblwiLFwibWF4XCIsXCJ6b29tTWluXCIsXCJ6b29tTWF4XCIsXCJtb3ZlYWJsZVwiLFwiem9vbWFibGVcIixcIm1vbWVudFwiLFwiYWN0aXZhdGVcIixcImhpZGRlbkRhdGVzXCIsXCJ6b29tS2V5XCIsXCJydGxcIixcInNob3dDdXJyZW50VGltZVwiLFwicm9sbGluZ01vZGVcIixcImhvcml6b250YWxTY3JvbGxcIl07Yy5zZWxlY3RpdmVFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksdC5yb2xsaW5nTW9kZSYmdC5yb2xsaW5nTW9kZS5mb2xsb3cmJnRoaXMuc3RhcnRSb2xsaW5nKCksKFwic3RhcnRcImluIHR8fFwiZW5kXCJpbiB0KSYmdGhpcy5zZXRSYW5nZSh0LnN0YXJ0LHQuZW5kKX19LG4ucHJvdG90eXBlLnN0YXJ0Um9sbGluZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXtlLnN0b3BSb2xsaW5nKCksZS5yb2xsaW5nPSEwO3ZhciBpPWUuZW5kLWUuc3RhcnQsbz1jLmNvbnZlcnQobmV3IERhdGUsXCJEYXRlXCIpLnZhbHVlT2YoKSxuPW8taSplLm9wdGlvbnMucm9sbGluZ01vZGUub2Zmc2V0LHM9bytpKigxLWUub3B0aW9ucy5yb2xsaW5nTW9kZS5vZmZzZXQpLHI9e2FuaW1hdGlvbjohMX07ZS5zZXRSYW5nZShuLHMsciksaT0xL2UuY29udmVyc2lvbihlLmJvZHkuZG9tUHJvcHMuY2VudGVyLndpZHRoKS5zY2FsZS8xMCxpPDMwJiYoaT0zMCksaT4xZTMmJihpPTFlMyksZS5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCIsZS5jdXJyZW50VGltZVRpbWVyPXNldFRpbWVvdXQodCxpKX12YXIgZT10aGlzO3QoKX0sbi5wcm90b3R5cGUuc3RvcFJvbGxpbmc9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmN1cnJlbnRUaW1lVGltZXImJihjbGVhclRpbWVvdXQodGhpcy5jdXJyZW50VGltZVRpbWVyKSx0aGlzLnJvbGxpbmc9ITEsdGhpcy5ib2R5LmRvbS5yb2xsaW5nTW9kZUJ0bi5zdHlsZS52aXNpYmlsaXR5PVwidmlzaWJsZVwiKX0sbi5wcm90b3R5cGUuc2V0UmFuZ2U9ZnVuY3Rpb24odCxlLGksbyxuKXtpfHwoaT17fSksITAhPT1pLmJ5VXNlciYmKGkuYnlVc2VyPSExKTt2YXIgcz10aGlzLHI9dm9pZCAwIT10P2MuY29udmVydCh0LFwiRGF0ZVwiKS52YWx1ZU9mKCk6bnVsbCxoPXZvaWQgMCE9ZT9jLmNvbnZlcnQoZSxcIkRhdGVcIikudmFsdWVPZigpOm51bGw7aWYodGhpcy5fY2FuY2VsQW5pbWF0aW9uKCksdGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlPXZvaWQgMCxpLmFuaW1hdGlvbil7dmFyIGw9dGhpcy5zdGFydCxwPXRoaXMuZW5kLGY9XCJvYmplY3RcIj09PSgwLHUuZGVmYXVsdCkoaS
211675hbmltYXRpb24pJiZcImR1cmF0aW9uXCJpbiBpLmFuaW1hdGlvbj9pLmFuaW1hdGlvbi5kdXJhdGlvbjo1MDAsdj1cIm9iamVjdFwiPT09KDAsdS5kZWZhdWx0KShpLmFuaW1hdGlvbikmJlwiZWFzaW5nRnVuY3Rpb25cImluIGkuYW5pbWF0aW9uP2kuYW5pbWF0aW9uLmVhc2luZ0Z1bmN0aW9uOlwiZWFzZUluT3V0UXVhZFwiLGc9Yy5lYXNpbmdGdW5jdGlvbnNbdl07aWYoIWcpdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBlYXNpbmcgZnVuY3Rpb24gXCIrKDAsZC5kZWZhdWx0KSh2KStcIi4gQ2hvb3NlIGZyb206IFwiKygwLGEuZGVmYXVsdCkoYy5lYXNpbmdGdW5jdGlvbnMpLmpvaW4oXCIsIFwiKSk7dmFyIHk9KG5ldyBEYXRlKS52YWx1ZU9mKCksYj0hMTtyZXR1cm4gZnVuY3Rpb24gdCgpe2lmKCFzLnByb3BzLnRvdWNoLmRyYWdnaW5nKXt2YXIgZT0obmV3IERhdGUpLnZhbHVlT2YoKSxhPWUteSxkPWcoYS9mKSx1PWE+ZixjPXV8fG51bGw9PT1yP3I6bCsoci1sKSpkLHY9dXx8bnVsbD09PWg/aDpwKyhoLXApKmQ7Xz1zLl9hcHBseVJhbmdlKGMsdiksbS51cGRhdGVIaWRkZW5EYXRlcyhzLm9wdGlvbnMubW9tZW50LHMuYm9keSxzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLGI9Ynx8Xzt2YXIgdz17c3RhcnQ6bmV3IERhdGUocy5zdGFydCksZW5kOm5ldyBEYXRlKHMuZW5kKSxieVVzZXI6aS5ieVVzZXIsZXZlbnQ6aS5ldmVudH07aWYobiYmbihkLF8sdSksXyYmcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJhbmdlY2hhbmdlXCIsdyksdSl7aWYoYiYmKHMuYm9keS5lbWl0dGVyLmVtaXQoXCJyYW5nZWNoYW5nZWRcIix3KSxvKSlyZXR1cm4gbygpfWVsc2Ugcy5hbmltYXRpb25UaW1lcj1zZXRUaW1lb3V0KHQsMjApfX0oKX12YXIgXz10aGlzLl9hcHBseVJhbmdlKHIsaCk7aWYobS51cGRhdGVIaWRkZW5EYXRlcyh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keSx0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLF8pe3ZhciB3PXtzdGFydDpuZXcgRGF0ZSh0aGlzLnN0YXJ0KSxlbmQ6bmV3IERhdGUodGhpcy5lbmQpLGJ5VXNlcjppLmJ5VXNlcixldmVudDppLmV2ZW50fTtpZih0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicmFuZ2VjaGFuZ2VcIix3KSxjbGVhclRpbWVvdXQocy50aW1lb3V0SUQpLHMudGltZW91dElEPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLmJvZHkuZW1pdHRlci5lbWl0KFwicmFuZ2VjaGFuZ2VkXCIsdyl9LDIwMCksbylyZXR1cm4gbygpfX0sbi5wcm90b3R5cGUuZ2V0TWlsbGlzZWNvbmRzUGVyUGl4ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlJiYodGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlPSh0aGlzLmVuZC10aGlzLnN0YXJ0KS90aGlzLmJvZHkuZG9tLmNlbnRlci5jbGllbnRXaWR0aCksdGhpcy5taWxsaXNlY29uZHNQZXJQaXhlbENhY2hlfSxuLnByb3RvdHlwZS5fY2FuY2VsQW5pbWF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25UaW1lciYmKGNsZWFyVGltZW91dCh0aGlzLmFuaW1hdGlvblRpbWVyKSx0aGlzLmFuaW1hdGlvblRpbWVyPW51bGwpfSxuLnByb3RvdHlwZS5fYXBwbHlSYW5nZT1mdW5jdGlvbih0LGUpe3ZhciBpLG89bnVsbCE9dD9jLmNvbnZlcnQodCxcIkRhdGVcIikudmFsdWVPZigpOnRoaXMuc3RhcnQsbj1udWxsIT1lP2MuY29udmVydChlLFwiRGF0ZVwiKS52YWx1ZU9mKCk6dGhpcy5lbmQscz1udWxsIT10aGlzLm9wdGlvbnMubWF4P2MuY29udmVydCh0aGlzLm9wdGlvbnMubWF4LFwiRGF0ZVwiKS52YWx1ZU9mKCk6bnVsbCxyPW51bGwhPXRoaXMub3B0aW9ucy5taW4/Yy5jb252ZXJ0KHRoaXMub3B0aW9ucy5taW4sXCJEYXRlXCIpLnZhbHVlT2YoKTpudWxsO2lmKGlzTmFOKG8pfHxudWxsPT09byl0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgc3RhcnQgXCInK3QrJ1wiJyk7aWYoaXNOYU4obil8fG51bGw9PT1uKXRocm93IG5ldyBFcnJvcignSW52YWxpZCBlbmQgXCInK2UrJ1wiJyk7aWYobjxvJiYobj1vKSxudWxsIT09ciYmbzxyJiYoaT1yLW8sbys9aSxuKz1pLG51bGwhPXMmJm4+cyYmKG49cykpLG51bGwhPT1zJiZuPnMmJihpPW4tcyxvLT1pLG4tPWksbnVsbCE9ciYmbzxyJiYobz1yKSksbnVsbCE9PXRoaXMub3B0aW9ucy56b29tTWluKXt2YXIgYT1wYXJzZUZsb2F0KHRoaXMub3B0aW9ucy56b29tTWluKTtpZihhPDAmJihhPTApLG4tbzxhKXt0aGlzLmVuZC10aGlzLnN0YXJ0PT09YSYmbz49dGhpcy5zdGFydC0uNSYmbjw9dGhpcy5lbmQ/KG89dGhpcy5zdGFydCxuPXRoaXMuZW5kKTooaT1hLShuLW8pLG8tPWkvMixuKz1pLzIpfX1pZihudWxsIT09dGhpcy5vcHRpb25zLnpvb21NYXgpe3ZhciBoPXBhcnNlRmxvYXQodGhpcy5vcHRpb25zLnpvb21NYXgpO2g8MCYmKGg9MCksbi1vPmgmJih0aGlzLmVuZC10aGlzLnN0YXJ0PT09aCYmbzx0aGlzLnN0YXJ0JiZuPnRoaXMuZW5kPyhvPXRoaXMuc3RhcnQsbj10aGlzLmVuZCk6KGk9bi1vLWgsbys9aS8yLG4tPWkvMikpfXZhciBkPXRoaXMuc3RhcnQhPW98fHRoaXMuZW5kIT1uO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZHx8bj49dGhpcy5zdGFydCYmbjw9dGhpcy5lbmR8fHRoaXMuc3RhcnQ+PW8mJnRoaXMuc3RhcnQ8PW58fHRoaXMuZW5kPj1vJiZ0aGlzLmVuZDw9bnx8dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImNoZWNrUmFuZ2VkSXRlbXNcIiksdGhpcy5zdGFydD1vLHRoaXMuZW5kPW4sZH0sbi5wcm90b3R5cGUuZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm57c3RhcnQ6dGhpcy5zdGFydCxlbmQ6dGhpcy5lbmR9fSxuLnByb3RvdHlwZS5jb252ZXJzaW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uY29udmVyc2lvbih0aGlzLnN0YXJ0LHRoaXMuZW5kLHQsZSl9LG4uY29udmVyc2lvbj1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gdm9pZCAwPT09byYmKG89MCksMCE9aSYmZS10IT0wP3tvZmZzZXQ6dCxzY2FsZTppLyhlLXQtbyl9OntvZmZzZXQ6MCxzY2FsZToxfX0sbi5wcm90b3R5cGUuX29uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3RoaXMuZGVsdGFEaWZmZXJlbmNlPTAsdGhpcy5wcmV2aW91c0RlbHRhPTAsdGhpcy5vcHRpb25zLm1vdmVhYmxlJiZ0aGlzLl9pc0luc2lkZVJhbmdlKHQpJiZ0aGlzLnByb3BzLnRvdWNoLmFsbG93RHJhZ2dpbmcmJih0aGlzLnN0b3BSb2xsaW5nKCksdGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmc9ITAsdGhpcy5ib2R5LmRvbS5yb290JiYodGhpcy5ib2R5LmRvbS5yb290LnN0eWxlLmN1cnNvcj1cIm1vdmVcIikpfSxuLnByb3RvdHlwZS5fb25EcmFnPWZ1bmN0aW9uKHQpe2lmKHQmJnRoaXMucHJvcHMudG91Y2guZHJhZ2dpbmcmJnRoaXMub3B0aW9ucy5tb3ZlYWJsZSYmdGhpcy5wcm9wcy50b3VjaC5hbGxvd0RyYWdnaW5nKXt2YXIgZT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO3MoZSk7dmFyIGk9XCJob3Jpem9udGFsXCI9PWU/dC5kZWx0YVg6dC5kZWx0YVk7aS09dGhpcy5kZWx0YURpZmZlcmVuY2U7dmFyIG89dGhpcy5wcm9wcy50b3VjaC5lbmQtdGhpcy5wcm9wcy50b3VjaC5zdGFydDtvLT1tLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5zdGFydCx0aGlzLmVuZCk7dmFyIG4scj1cImhvcml6b250YWxcIj09ZT90aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLndpZHR
21167oOnRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXIuaGVpZ2h0O249dGhpcy5vcHRpb25zLnJ0bD9pL3IqbzotaS9yKm87dmFyIGE9dGhpcy5wcm9wcy50b3VjaC5zdGFydCtuLGg9dGhpcy5wcm9wcy50b3VjaC5lbmQrbixkPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxhLHRoaXMucHJldmlvdXNEZWx0YS1pLCEwKSxsPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxoLHRoaXMucHJldmlvdXNEZWx0YS1pLCEwKTtpZihkIT1hfHxsIT1oKXJldHVybiB0aGlzLmRlbHRhRGlmZmVyZW5jZSs9aSx0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PWQsdGhpcy5wcm9wcy50b3VjaC5lbmQ9bCx2b2lkIHRoaXMuX29uRHJhZyh0KTt0aGlzLnByZXZpb3VzRGVsdGE9aSx0aGlzLl9hcHBseVJhbmdlKGEsaCk7dmFyIHU9bmV3IERhdGUodGhpcy5zdGFydCksYz1uZXcgRGF0ZSh0aGlzLmVuZCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJhbmdlY2hhbmdlXCIse3N0YXJ0OnUsZW5kOmMsYnlVc2VyOiEwLGV2ZW50OnR9KSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicGFubW92ZVwiKX19LG4ucHJvdG90eXBlLl9vbkRyYWdFbmQ9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5kcmFnZ2luZyYmdGhpcy5vcHRpb25zLm1vdmVhYmxlJiZ0aGlzLnByb3BzLnRvdWNoLmFsbG93RHJhZ2dpbmcmJih0aGlzLnByb3BzLnRvdWNoLmRyYWdnaW5nPSExLHRoaXMuYm9keS5kb20ucm9vdCYmKHRoaXMuYm9keS5kb20ucm9vdC5zdHlsZS5jdXJzb3I9XCJhdXRvXCIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyYW5nZWNoYW5nZWRcIix7c3RhcnQ6bmV3IERhdGUodGhpcy5zdGFydCksZW5kOm5ldyBEYXRlKHRoaXMuZW5kKSxieVVzZXI6ITAsZXZlbnQ6dH0pKX0sbi5wcm90b3R5cGUuX29uTW91c2VXaGVlbD1mdW5jdGlvbih0KXt2YXIgZT0wO2lmKHQud2hlZWxEZWx0YT9lPXQud2hlZWxEZWx0YS8xMjA6dC5kZXRhaWwmJihlPS10LmRldGFpbC8zKSwhKHRoaXMub3B0aW9ucy56b29tS2V5JiYhdFt0aGlzLm9wdGlvbnMuem9vbUtleV0mJnRoaXMub3B0aW9ucy56b29tYWJsZXx8IXRoaXMub3B0aW9ucy56b29tYWJsZSYmdGhpcy5vcHRpb25zLm1vdmVhYmxlKSYmdGhpcy5vcHRpb25zLnpvb21hYmxlJiZ0aGlzLm9wdGlvbnMubW92ZWFibGUmJnRoaXMuX2lzSW5zaWRlUmFuZ2UodCkmJmUpe3ZhciBpO2k9ZTwwPzEtZS81OjEvKDErZS81KTt2YXIgbztpZih0aGlzLnJvbGxpbmcpbz10aGlzLnN0YXJ0Kyh0aGlzLmVuZC10aGlzLnN0YXJ0KSp0aGlzLm9wdGlvbnMucm9sbGluZ01vZGUub2Zmc2V0O2Vsc2V7dmFyIG49dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0sdGhpcy5ib2R5LmRvbS5jZW50ZXIpO289dGhpcy5fcG9pbnRlclRvRGF0ZShuKX10aGlzLnpvb20oaSxvLGUsdCksdC5wcmV2ZW50RGVmYXVsdCgpfX0sbi5wcm90b3R5cGUuX29uVG91Y2g9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy50b3VjaC5zdGFydD10aGlzLnN0YXJ0LHRoaXMucHJvcHMudG91Y2guZW5kPXRoaXMuZW5kLHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZz0hMCx0aGlzLnByb3BzLnRvdWNoLmNlbnRlcj1udWxsLHRoaXMuc2NhbGVPZmZzZXQ9MCx0aGlzLmRlbHRhRGlmZmVyZW5jZT0wLGMucHJldmVudERlZmF1bHQodCl9LG4ucHJvdG90eXBlLl9vblBpbmNoPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy56b29tYWJsZSYmdGhpcy5vcHRpb25zLm1vdmVhYmxlKXtjLnByZXZlbnREZWZhdWx0KHQpLHRoaXMucHJvcHMudG91Y2guYWxsb3dEcmFnZ2luZz0hMSx0aGlzLnByb3BzLnRvdWNoLmNlbnRlcnx8KHRoaXMucHJvcHMudG91Y2guY2VudGVyPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcix0aGlzLmJvZHkuZG9tLmNlbnRlcikpLHRoaXMuc3RvcFJvbGxpbmcoKTt2YXIgZT0xLyh0LnNjYWxlK3RoaXMuc2NhbGVPZmZzZXQpLGk9dGhpcy5fcG9pbnRlclRvRGF0ZSh0aGlzLnByb3BzLnRvdWNoLmNlbnRlciksbz1tLmdldEhpZGRlbkR1cmF0aW9uQmV0d2Vlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsdGhpcy5zdGFydCx0aGlzLmVuZCksbj1tLmdldEhpZGRlbkR1cmF0aW9uQmVmb3JlKHRoaXMub3B0aW9ucy5tb21lbnQsdGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMsaSkscz1vLW4scj1pLW4rKHRoaXMucHJvcHMudG91Y2guc3RhcnQtKGktbikpKmUsYT1pK3MrKHRoaXMucHJvcHMudG91Y2guZW5kLShpK3MpKSplO3RoaXMuc3RhcnRUb0Zyb250PTEtZTw9MCx0aGlzLmVuZFRvRnJvbnQ9ZS0xPD0wO3ZhciBoPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxyLDEtZSwhMCksZD1tLnNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsYSxlLTEsITApO2g9PXImJmQ9PWF8fCh0aGlzLnByb3BzLnRvdWNoLnN0YXJ0PWgsdGhpcy5wcm9wcy50b3VjaC5lbmQ9ZCx0aGlzLnNjYWxlT2Zmc2V0PTEtdC5zY2FsZSxyPWgsYT1kKTt2YXIgbD17YW5pbWF0aW9uOiExLGJ5VXNlcjohMCxldmVudDp0fTt0aGlzLnNldFJhbmdlKHIsYSxsKSx0aGlzLnN0YXJ0VG9Gcm9udD0hMSx0aGlzLmVuZFRvRnJvbnQ9ITB9fSxuLnByb3RvdHlwZS5faXNJbnNpZGVSYW5nZT1mdW5jdGlvbih0KXt2YXIgZSxpPXQuY2VudGVyP3QuY2VudGVyLng6dC5jbGllbnRYO2U9dGhpcy5vcHRpb25zLnJ0bD9pLWMuZ2V0QWJzb2x1dGVMZWZ0KHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyKTpjLmdldEFic29sdXRlUmlnaHQodGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIpLWk7dmFyIG89dGhpcy5ib2R5LnV0aWwudG9UaW1lKGUpO3JldHVybiBvPj10aGlzLnN0YXJ0JiZvPD10aGlzLmVuZH0sbi5wcm90b3R5cGUuX3BvaW50ZXJUb0RhdGU9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMuZGlyZWN0aW9uO2lmKHMoaSksXCJob3Jpem9udGFsXCI9PWkpcmV0dXJuIHRoaXMuYm9keS51dGlsLnRvVGltZSh0LngpLnZhbHVlT2YoKTt2YXIgbz10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLmhlaWdodDtyZXR1cm4gZT10aGlzLmNvbnZlcnNpb24obyksdC55L2Uuc2NhbGUrZS5vZmZzZXR9LG4u
21167cHJvdG90eXBlLmdldFBvaW50ZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5vcHRpb25zLnJ0bD97eDpjLmdldEFic29sdXRlUmlnaHQoZSktdC54LHk6dC55LWMuZ2V0QWJzb2x1dGVUb3AoZSl9Ont4OnQueC1jLmdldEFic29sdXRlTGVmdChlKSx5OnQueS1jLmdldEFic29sdXRlVG9wKGUpfX0sbi5wcm90b3R5cGUuem9vbT1mdW5jdGlvbih0LGUsaSxvKXtudWxsPT1lJiYoZT0odGhpcy5zdGFydCt0aGlzLmVuZCkvMik7dmFyIG49bS5nZXRIaWRkZW5EdXJhdGlvbkJldHdlZW4odGhpcy5ib2R5LmhpZGRlbkRhdGVzLHRoaXMuc3RhcnQsdGhpcy5lbmQpLHM9bS5nZXRIaWRkZW5EdXJhdGlvbkJlZm9yZSh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keS5oaWRkZW5EYXRlcyx0aGlzLGUpLHI9bi1zLGE9ZS1zKyh0aGlzLnN0YXJ0LShlLXMpKSp0LGg9ZStyKyh0aGlzLmVuZC0oZStyKSkqdDt0aGlzLnN0YXJ0VG9Gcm9udD0hKGk+MCksdGhpcy5lbmRUb0Zyb250PSEoLWk+MClcbjt2YXIgZD1tLnNuYXBBd2F5RnJvbUhpZGRlbih0aGlzLmJvZHkuaGlkZGVuRGF0ZXMsYSxpLCEwKSxsPW0uc25hcEF3YXlGcm9tSGlkZGVuKHRoaXMuYm9keS5oaWRkZW5EYXRlcyxoLC1pLCEwKTtkPT1hJiZsPT1ofHwoYT1kLGg9bCk7dmFyIHU9e2FuaW1hdGlvbjohMSxieVVzZXI6ITAsZXZlbnQ6b307dGhpcy5zZXRSYW5nZShhLGgsdSksdGhpcy5zdGFydFRvRnJvbnQ9ITEsdGhpcy5lbmRUb0Zyb250PSEwfSxuLnByb3RvdHlwZS5tb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW5kLXRoaXMuc3RhcnQsaT10aGlzLnN0YXJ0K2UqdCxvPXRoaXMuZW5kK2UqdDt0aGlzLnN0YXJ0PWksdGhpcy5lbmQ9b30sbi5wcm90b3R5cGUubW92ZVRvPWZ1bmN0aW9uKHQpe3ZhciBlPSh0aGlzLnN0YXJ0K3RoaXMuZW5kKS8yLGk9ZS10LG89dGhpcy5zdGFydC1pLG49dGhpcy5lbmQtaSxzPXthbmltYXRpb246ITEsYnlVc2VyOiEwLGV2ZW50Om51bGx9O3RoaXMuc2V0UmFuZ2UobyxuLHMpfSx0LmV4cG9ydHM9bn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4oKXt9dmFyIHM9aSgxOSkscj1vKHMpLGE9aSg2KSxoPW8oYSksZD1pKDQ0KSxsPWkoMTApLHU9aSgzNyksYz1pKDIpLHA9aSg0NSksZj1pKDk3KSxtPWkoMzYpLHY9aSg0Nik7ZChuLnByb3RvdHlwZSksbi5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpe3RoaXMuaXNBY3RpdmUoKSYmdGhpcy5lbWl0KFwibW91c2V3aGVlbFwiLHQpO3ZhciBlPTAsaT0wO2lmKFwiZGV0YWlsXCJpbiB0JiYoaT0tMSp0LmRldGFpbCksXCJ3aGVlbERlbHRhXCJpbiB0JiYoaT10LndoZWVsRGVsdGEpLFwid2hlZWxEZWx0YVlcImluIHQmJihpPXQud2hlZWxEZWx0YVkpLFwid2hlZWxEZWx0YVhcImluIHQmJihlPS0xKnQud2hlZWxEZWx0YVgpLFwiYXhpc1wiaW4gdCYmdC5heGlzPT09dC5IT1JJWk9OVEFMX0FYSVMmJihlPS0xKmksaT0wKSxcImRlbHRhWVwiaW4gdCYmKGk9LTEqdC5kZWx0YVkpLFwiZGVsdGFYXCJpbiB0JiYoZT10LmRlbHRhWCksdGhpcy5vcHRpb25zLnpvb21LZXkmJiF0W3RoaXMub3B0aW9ucy56b29tS2V5XSlpZih0LnByZXZlbn
21167REZWZhdWx0KCksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiZNYXRoLmFicyhpKT49TWF0aC5hYnMoZSkpe3ZhciBvPXRoaXMucHJvcHMuc2Nyb2xsVG9wLG49bytpO3RoaXMuaXNBY3RpdmUoKSYmKHRoaXMuX3NldFNjcm9sbFRvcChuKSx0aGlzLl9yZWRyYXcoKSx0aGlzLmVtaXQoXCJzY3JvbGxcIix0KSl9ZWxzZSBpZih0aGlzLm9wdGlvbnMuaG9yaXpvbnRhbFNjcm9sbCl7dmFyIHM9TWF0aC5hYnMoZSk+PU1hdGguYWJzKGkpP2U6aSxyPXMvMTIwKih0aGlzLnJhbmdlLmVuZC10aGlzLnJhbmdlLnN0YXJ0KS8yMCxhPXRoaXMucmFuZ2Uuc3RhcnQrcixoPXRoaXMucmFuZ2UuZW5kK3IsZD17YW5pbWF0aW9uOiExLGJ5VXNlcjohMCxldmVudDp0fTt0aGlzLnJhbmdlLnNldFJhbmdlKGEsaCxkKX19ZnVuY3Rpb24gaSh0KXtpZihzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0LnByZXZlbnREZWZhdWx0KCkscy5pc0FjdGl2ZSgpKSl7dmFyIGU9LXQudGFyZ2V0LnNjcm9sbFRvcDtzLl9zZXRTY3JvbGxUb3AoZSkscy5fcmVkcmF3KCkscy5lbWl0KFwic2Nyb2xsU2lkZVwiLHQpfX1mdW5jdGlvbiBvKHQpe2lmKHQucHJldmVudERlZmF1bHQmJnQucHJldmVudERlZmF1bHQoKSwhKCF0LnRhcmdldC5jbGFzc05hbWUuaW5kZXhPZihcInZpc1wiKT4tMXx8YSkpcmV0dXJuIHQuZGF0YVRyYW5zZmVyLmRyb3BFZmZlY3Q9XCJtb3ZlXCIsYT0hMCwhMX1mdW5jdGlvbiBuKHQpe3QucHJldmVudERlZmF1bHQmJnQucHJldmVudERlZmF1bHQoKSx0LnN0b3BQcm9wYWdhdGlvbiYmdC5zdG9wUHJvcGFnYXRpb24oKTt0cnl7dmFyIGU9SlNPTi5wYXJzZSh0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7aWYoIWV8fCFlLmNvbnRlbnQpcmV0dXJufWNhdGNoKHQpe3JldHVybiExfXJldHVybiBhPSExLHQuY2VudGVyPXt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0sXCJpdGVtXCIhPT1lLnRhcmdldD9zLml0ZW1TZXQuX29uQWRkSXRlbSh0KTpzLml0ZW1TZXQuX29uRHJvcE9iamVjdE9uSXRlbSh0KSxzLmVtaXQoXCJkcm9wXCIscy5nZXRFdmVudFByb3BlcnRpZXModCkpLCExfXRoaXMuZG9tPXt9LHRoaXMuZG9tLmNvbnRhaW5lcj10LHRoaXMuZG9tLnJvb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5iYWNrZ3JvdW5kPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uYmFja2dyb3VuZFZlcnRpY2FsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uYmFja2dyb3VuZEhvcml6b250YWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5sZWZ0Q29udGFpbmVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ucmlnaHRDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5jZW50ZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5sZWZ0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ucmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS50b3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5ib3R0b209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5zaGFkb3dUb3A9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5zaGFkb3dCb3R0b209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uc2hhZG93Qm90dG9tTGVmdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uc2hhZG93Qm90dG9tUmlnaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLnJvb3QuY2xhc3NOYW1lPVwidmlzLXRpbWVsaW5lXCIsdGhpcy5kb20uYmFja2dyb3VuZC5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWJhY2tncm91bmRcIix0aGlzLmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1iYWNrZ3JvdW5kIHZpcy12ZXJ0aWNhbFwiLHRoaXMuZG9tLmJhY2tncm91bmRIb3Jpem9udGFsLmNsYXNzTmFtZT1cInZpcy1wYW5lbCB2aXMtYmFja2dyb3VuZCB2aXMtaG9yaXpvbnRhbFwiLHRoaXMuZG9tLmNlbnRlckNvbnRhaW5lci5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWNlbnRlclwiLHRoaXMuZG9tLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1sZWZ0XCIsdGhpcy5kb20ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1yaWdodFwiLHRoaXMuZG9tLnRvcC5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLXRvcFwiLHRoaXMuZG9tLmJvdHRvbS5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWJvdHRvbVwiLHRoaXMuZG9tLmxlZnQuY2xhc3NOYW1lPVwidmlzLWNvbnRlbnRcIix0aGlzLmRvbS5jZW50ZXIuY2xhc3NOYW1lPVwidmlzLWNvbnRlbnRcIix0aGlzLmRvbS5yaWdodC5jbGFzc05hbWU9XCJ2aXMtY29udGVudFwiLHRoaXMuZG9tLnNoYWRvd1RvcC5jbGFzc05hbWU9XCJ2aXMtc2hhZG93IHZpcy10b3BcIix0aGlzLmRvbS5zaGFkb3dCb3R0b20uY2xhc3NOYW1lPVwidmlzLXNoYWRvdyB2aXMtYm90dG9tXCIsdGhpcy5kb20uc2hhZG93VG9wTGVmdC5jbGFzc05hbWU9XCJ2aXMtc2hhZG93IHZpcy10b3BcIix0aGlzLmRvbS5zaGFkb3dCb3R0b21MZWZ0LmNsYXNzTmFtZT1cInZpcy1zaGFkb3cgdmlzLWJvdHRvbVwiLHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0LmNsYXNzTmFtZT1cInZpcy1zaGFkb3cgdmlzLXRvcFwiLHRoaXMuZG9tLnNoYWRvd0JvdHRvbVJpZ2h0LmNsYXNzTmFtZT1cInZpcy1zaGFkb3cgdmlzLWJvdHRvbVwiLHRoaXMuZG9tLnJvbGxpbmdNb2RlQnRuLmNsYXNzTmFtZT1cInZpcy1yb2xsaW5nLW1vZGUtYnRuXCIsdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJhY2tncm91bmRWZXJ0aWNhbCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kSG9yaXpvbn
21167RhbCksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20ubGVmdENvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodENvbnRhaW5lciksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS50b3ApLHRoaXMuZG9tLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm90dG9tKSx0aGlzLmRvbS5yb290LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJvdHRvbSksdGhpcy5kb20ucm9vdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yb2xsaW5nTW9kZUJ0biksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNlbnRlciksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sZWZ0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5yaWdodCksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcCksdGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbSksdGhpcy5kb20ubGVmdENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dUb3BMZWZ0KSx0aGlzLmRvbS5sZWZ0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd0JvdHRvbUxlZnQpLHRoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZG9tLnNoYWRvd1RvcFJpZ2h0KSx0aGlzLmRvbS5yaWdodENvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5zaGFkb3dCb3R0b21SaWdodCksdGhpcy5wcm9wcz17cm9vdDp7fSxiYWNrZ3JvdW5kOnt9LGNlbnRlckNvbnRhaW5lcjp7fSxsZWZ0Q29udGFpbmVyOnt9LHJpZ2h0Q29udGFpbmVyOnt9LGNlbnRlcjp7fSxsZWZ0Ont9LHJpZ2h0Ont9LHRvcDp7fSxib3R0b206e30sYm9yZGVyOnt9LHNjcm9sbFRvcDowLHNjcm9sbFRvcE1pbjowfSx0aGlzLm9uKFwicmFuZ2VjaGFuZ2VcIixmdW5jdGlvbigpeyEwPT09dGhpcy5pbml0aWFsRHJhd0RvbmUmJnRoaXMuX3JlZHJhdygpfS5iaW5kKHRoaXMpKSx0aGlzLm9uKFwicmFuZ2VjaGFuZ2VkXCIsZnVuY3Rpb24oKXt0aGlzLmluaXRpYWxSYW5nZUNoYW5nZURvbmV8fCh0aGlzLmluaXRpYWxSYW5nZUNoYW5nZURvbmU9ITApfS5iaW5kKHRoaXMpKSx0aGlzLm9uKFwidG91Y2hcIix0aGlzLl9vblRvdWNoLmJpbmQodGhpcykpLHRoaXMub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpO3ZhciBzPXRoaXM7dGhpcy5fb3JpZ1JlZHJhdz10aGlzLl9yZWRyYXcuYmluZCh0aGlzKSx0aGlzLl9yZWRyYXc9Yy50aHJvdHRsZSh0aGlzLl9vcmlnUmVkcmF3KSx0aGlzLm9uKFwiX2NoYW5nZVwiLGZ1bmN0aW9uKHQpe3MuaXRlbVNldCYmcy5pdGVtU2V0LmluaXRpYWxJdGVtU2V0RHJhd24mJnQmJjE9PXQucXVldWU/cy5fcmVkcmF3KCk6cy5fb3JpZ1JlZHJhdygpfSksdGhpcy5oYW1tZXI9bmV3IGwodGhpcy5kb20ucm9vdCk7dmFyIHI9dGhpcy5oYW1tZXIuZ2V0KFwicGluY2hcIikuc2V0KHtlbmFibGU6ITB9KTt1LmRpc2FibGVQcmV2ZW50RGVmYXVsdFZlcnRpY2FsbHkociksdGhpcy5oYW1tZXIuZ2V0KFwicGFuXCIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmwuRElSRUNUSU9OX0hPUklaT05UQUx9KSx0aGlzLmxpc3RlbmVycz17fSxbXCJ0YXBcIixcImRvdWJsZXRhcFwiLFwicHJlc3NcIixcInBpbmNoXCIsXCJwYW5cIixcInBhbnN0YXJ0XCIsXCJwYW5tb3ZlXCIsXCJwYW5lbmRcIl0uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbihlKXtzLmlzQWN0aXZlKCkmJnMuZW1pdCh0LGUpfTtzLmhhbW1lci5vbih0LGUpLHMubGlzdGVuZXJzW3RdPWV9KSx1Lm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24odCl7cy5lbWl0KFwidG91Y2hcIix0KX0uYmluZCh0aGlzKSksdS5vblJlbGVhc2UodGhpcy5oYW1tZXIsZnVuY3Rpb24odCl7cy5lbWl0KFwicmVsZWFzZVwiLHQpfS5iaW5kKHRoaXMpKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcj8odGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXdoZWVsXCIsZS5iaW5kKHRoaXMpLCExKSx0aGlzLmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsZS5iaW5kKHRoaXMpLCExKSk6dGhpcy5kb20uY2VudGVyQ29udGFpbmVyLmF0dGFjaEV2ZW50KFwib25tb3VzZXdoZWVsXCIsZS5iaW5kKHRoaXMpKSx0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLGkuYmluZCh0aGlzKSksdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5hZGRFdmVudExpc3RlbmVyKFwic2Nyb2xsXCIsaS5iaW5kKHRoaXMpKTt2YXIgYT0hMTtpZih0aGlzLmRvbS5jZW50ZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRyYWdvdmVyXCIsby5iaW5kKHRoaXMpLCExKSx0aGlzLmRvbS5jZW50ZXIuYWRkRXZlbnRMaXN0ZW5lcihcImRyb3BcIixuLmJpbmQodGhpcyksITEpLHRoaXMuY3VzdG9tVGltZXM9W10sdGhpcy50b3VjaD17fSx0aGlzLnJlZHJhd0NvdW50PTAsdGhpcy5pbml0aWFsRHJhd0RvbmU9ITEsdGhpcy5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lPSExLCF0KXRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRhaW5lciBwcm92aWRlZFwiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLnJvb3QpfSxuLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVtcIndpZHRoXCIsXCJoZWlnaHRcIixcIm1pbkhlaWdodFwiLFwibWF4SGVpZ2h0XCIsXCJhdXRvUmVzaXplXCIsXCJzdGFydFwiLFwiZW5kXCIsXCJjbGlja1RvVXNlXCIsXCJkYXRhQXR0cmlidXRlc1wiLFwiaGlkZGVuRGF0ZXNcIixcImxvY2FsZVwiLFwibG9jYWxlc1wiLFwibW9tZW50XCIsXCJydGxcIixcInpvb21LZXlcIixcImhvcml6b250YWxTY3JvbGxcIixcInZlcnRpY2FsU2Nyb2xsXCJdO2lmKGMuc2VsZWN0aXZlRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLHRoaXMuZG9tLnJvbGxpbmdNb2RlQnRuLnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIix0aGlzLm9wdGlvbnMucnRsJiYodGhpcy5kb20uY29udGFpbmVyLnN0eWxlLmRpcmVjdGlvbj1cInJ0bFwiLHRoaXMuZG9tLmJhY2tncm91bmRWZXJ0aWNhbC5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLWJhY2tncm91bmQgdmlzLXZlcnRpY2FsLXJ0bFwiKSx0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLnJpZ2h0Q29udGFpbmVyLmNsYXNzTmFtZT1cInZpcy1wYW5lbCB2aXMtcmlnaHQgdmlzLX
21167ZlcnRpY2FsLXNjcm9sbFwiOnRoaXMuZG9tLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1sZWZ0IHZpcy12ZXJ0aWNhbC1zY3JvbGxcIiksXCJvYmplY3RcIiE9PSgwLGguZGVmYXVsdCkodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uKSYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbj17aXRlbTp2b2lkIDAsYXhpczp2b2lkIDB9KSxcIm9yaWVudGF0aW9uXCJpbiB0JiYoXCJzdHJpbmdcIj09dHlwZW9mIHQub3JpZW50YXRpb24/dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uPXtpdGVtOnQub3JpZW50YXRpb24sYXhpczp0Lm9yaWVudGF0aW9ufTpcIm9iamVjdFwiPT09KDAsaC5kZWZhdWx0KSh0Lm9yaWVudGF0aW9uKSYmKFwiaXRlbVwiaW4gdC5vcmllbnRhdGlvbiYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPXQub3JpZW50YXRpb24uaXRlbSksXCJheGlzXCJpbiB0Lm9yaWVudGF0aW9uJiYodGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXM9dC5vcmllbnRhdGlvbi5heGlzKSkpLFwiYm90aFwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uLmF4aXMpe2lmKCF0aGlzLnRpbWVBeGlzMil7dmFyIGk9dGhpcy50aW1lQXhpczI9bmV3IHAodGhpcy5ib2R5KTtpLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dD9jLmV4dGVuZCh7fSx0KTp7fTtlLm9yaWVudGF0aW9uPVwidG9wXCIscC5wcm90b3R5cGUuc2V0T3B0aW9ucy5jYWxsKGksZSl9LHRoaXMuY29tcG9uZW50cy5wdXNoKGkpfX1lbHNlIGlmKHRoaXMudGltZUF4aXMyKXt2YXIgbz10aGlzLmNvbXBvbmVudHMuaW5kZXhPZih0aGlzLnRpbWVBeGlzMik7LTEhPT1vJiZ0aGlzLmNvbXBvbmVudHMuc3BsaWNlKG8sMSksdGhpcy50aW1lQXhpczIuZGVzdHJveSgpLHRoaXMudGltZUF4aXMyPW51bGx9aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdC5kcmF3UG9pbnRzJiYodC5kcmF3UG9pbnRzPXtvblJlbmRlcjp0LmRyYXdQb2ludHN9KSxcImhpZGRlbkRhdGVzXCJpbiB0aGlzLm9wdGlvbnMmJm0uY29udmVydEhpZGRlbk9wdGlvbnModGhpcy5vcHRpb25zLm1vbWVudCx0aGlzLmJvZHksdGhpcy5vcHRpb25zLmhpZGRlbkRhdGVzKSxcImNsaWNrVG9Vc2VcImluIHQmJih0LmNsaWNrVG9Vc2U/dGhpcy5hY3RpdmF0b3J8fCh0aGlzLmFjdGl2YXRvcj1uZXcgZih0aGlzLmRvbS5yb290KSk6dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKSksXCJzaG93Q3VzdG9tVGltZVwiaW4gdCl0aHJvdyBuZXcgRXJyb3IoXCJPcHRpb24gYHNob3dDdXN0b21UaW1lYCBpcyBkZXByZWNhdGVkLiBDcmVhdGUgYSBjdXN0b20gdGltZSBiYXIgdmlhIHRpbWVsaW5lLmFkZEN1c3RvbVRpbWUodGltZSBbLCBpZF0pXCIpO3RoaXMuX2luaXRBdXRvUmVzaXplKCl9aWYodGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7cmV0dXJuIGUuc2V0T3B0aW9ucyh0KX0pLFwiY29uZmlndXJlXCJpbiB0KXt0aGlzLmNvbmZpZ3VyYXRvcnx8KHRoaXMuY29uZmlndXJhdG9yPXRoaXMuX2NyZWF0ZUNvbmZpZ3VyYXRvcigpKSx0aGlzLmNvbmZpZ3VyYXRvci5zZXRPcHRpb25zKHQuY29uZmlndXJlKTt2YXIgbj1jLmRlZXBFeHRlbmQoe30sdGhpcy5vcHRpb25zKTt0aGlzLmNvbXBvbmVudHMuZm9yRWFjaChmdW5jdGlvbih0KXtjLmRlZXBFeHRlbmQobix0Lm9wdGlvbnMpfSksdGhpcy5jb25maWd1cmF0b3Iuc2V0TW9kdWxlT3B0aW9ucyh7Z2xvYmFsOm59KX10aGlzLl9yZWRyYXcoKX0sbi5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5hY3RpdmF0b3J8fHRoaXMuYWN0aXZhdG9yLmFjdGl2ZX0sbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuc2V0SXRlbXMobnVsbCksdGhpcy5zZXRHcm91cHMobnVsbCksdGhpcy5vZmYoKSx0aGlzLl9zdG9wQXV0b1Jlc2l6ZSgpLHRoaXMuZG9tLnJvb3QucGFyZW50Tm9kZSYmdGhpcy5kb20ucm9vdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLnJvb3QpLHRoaXMuZG9tPW51bGwsdGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKTtmb3IodmFyIHQgaW4gdGhpcy5saXN0ZW5lcnMpdGhpcy5saXN0ZW5lcnMuaGFzT3duUHJvcGVydHkodCkmJmRlbGV0ZSB0aGlzLmxpc3RlbmVyc1t0XTt0aGlzLmxpc3RlbmVycz1udWxsLHRoaXMuaGFtbWVyPW51bGwsdGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuZGVzdHJveSgpfSksdGhpcy5ib2R5PW51bGx9LG4ucHJvdG90eXBlLnNldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQub3B0aW9ucy5pZH0pO2lmKDA9PT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKGUpKTtpLmxlbmd0aD4wJiZpWzBdLnNldEN1c3RvbVRpbWUodCl9LG4ucHJvdG90eXBlLmdldEN1c3RvbVRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jdXN0b21UaW1lcy5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIGUub3B0aW9ucy5pZD09PXR9KTtpZigwPT09ZS5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiTm8gY3VzdG9tIHRpbWUgYmFyIGZvdW5kIHdpdGggaWQgXCIrKDAsci5kZWZhdWx0KSh0KSk7cmV0dXJuIGVbMF0uZ2V0Q3VzdG9tVGltZSgpfSxuLnByb3RvdHlwZS5zZXRDdXN0b21UaW1lVGl0bGU9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5vcHRpb25zLmlkPT09ZX0pO2lmKDA9PT1pLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKGUpKTtpZihpLmxlbmd0aD4wKXJldHVybiBpWzBdLnNldEN1c3RvbVRpdGxlKHQpfSxuLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7cmV0dXJue2V2ZW50OnR9fSxuLnByb3RvdHlwZS5hZGRDdXN0b21UaW1lPWZ1bmN0aW9uKHQsZSl7dmFyIGk9dm9pZCAwIT09dD9jLmNvbnZlcnQodCxcIkRhdGVcIikudmFsdWVPZigpOm5ldyBEYXRlO2lmKHRoaXMuY3VzdG9tVGltZXMuc29tZShmdW5jdGlvbih0KXtyZXR1cm4gdC5vcHRpb25zLmlkPT09ZX0pKXRocm93IG5ldyBFcnJvcihcIkEgY3VzdG9tIHRpbWUgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKGUpK1wiIGFscmVhZHkgZXhpc3RzXCIpO3ZhciBvPW5ldyB2KHRoaXMuYm9keSxjLmV4dGVuZCh7fSx0aGlzLm9wdGlvbnMse3RpbWU6aSxpZDplfSkpO3JldHVybiB0aGlzLmN1c3RvbVRpbWVzLnB1c2gobyksdGhpcy5jb21wb25lbnRzLnB1c2gobyksdGhpcy5fcmVkcmF3KCksZX0sbi5wcm90b3R5cGUucmVtb3ZlQ3VzdG9tVGltZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmN1c3RvbVRpbWVzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5vcHRpb25zLmlkPT09dH0pO2lmKDA9PT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjdXN0b20gdGltZSBiYXIgZm91bmQgd2l0aCBpZCBcIisoMCxyLmRlZmF1bHQpKHQpKTtlLmZvckVhY2goZnVuY3Rpb24odCl7dGhpcy5jdXN0b21UaW1lcy5zcGxpY2UodGhpcy5jdXN0b21UaW1lcy5pbmRleE9mKHQpLDEpLHRoaXMuY29tcG9uZW50cy5zcGxpY2UodGhpcy5jb21wb25lbnRzLmluZGV4T2YodCksMSksdC5kZXN0cm95KCl9LmJpbmQodGhpcykpfSxuLnByb3RvdHlwZS5nZXRWaXNpYmxlSXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuZ2V0VmlzaWJsZUl0ZW1zKCl8fFtdfSxuLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLmdldERhdGFSYW5nZSgpO2lmKG51bGwhPT1pLm1pbnx8bnVsbCE9PWkubWF4KXt2YXIgbz1pLm1heC1pLm1pbixuPW5ldyBEYXRlKGkubWluLnZhbHVlT2YoKS0uMDEqbykscz1uZXcgRGF0ZShpLm1heC52YWx1ZU9mKCkrLjAxKm8pLHI9IXR8fHZvaWQgMD09PXQuYW5pbWF0aW9ufHx0LmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKG4scyx7YW5pbWF0aW9uOnJ9LGUpfX0sbi5wcm90b3R5cGUuZ2V0RGF0YVJhbmdlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGludm9rZSBhYnN0cmFjdCBtZXRob2QgZ2V0RGF0YVJhbmdlXCIpfSxuLnByb3RvdHlwZS5zZXRXaW5kb3c9ZnVuY3Rpb24odCxlLGksbyl7XCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzWzJdJiYobz1hcmd1bWVudHNbMl0saT17fSk7dmFyIG4sczsxPT1hcmd1bWVudHMubGVuZ3RoPyhzPWFyZ3VtZW50c1swXSxuPXZvaWQgMD09PX
21167MuYW5pbWF0aW9ufHxzLmFuaW1hdGlvbix0aGlzLnJhbmdlLnNldFJhbmdlKHMuc3RhcnQscy5lbmQse2FuaW1hdGlvbjpufSkpOjI9PWFyZ3VtZW50cy5sZW5ndGgmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGFyZ3VtZW50c1sxXT8ocz1hcmd1bWVudHNbMF0sbz1hcmd1bWVudHNbMV0sbj12b2lkIDA9PT1zLmFuaW1hdGlvbnx8cy5hbmltYXRpb24sdGhpcy5yYW5nZS5zZXRSYW5nZShzLnN0YXJ0LHMuZW5kLHthbmltYXRpb246bn0sbykpOihuPSFpfHx2b2lkIDA9PT1pLmFuaW1hdGlvbnx8aS5hbmltYXRpb24sdGhpcy5yYW5nZS5zZXRSYW5nZSh0LGUse2FuaW1hdGlvbjpufSxvKSl9LG4ucHJvdG90eXBlLm1vdmVUbz1mdW5jdGlvbih0LGUsaSl7XCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzWzFdJiYoaT1hcmd1bWVudHNbMV0sZT17fSk7dmFyIG89dGhpcy5yYW5nZS5lbmQtdGhpcy5yYW5nZS5zdGFydCxuPWMuY29udmVydCh0LFwiRGF0ZVwiKS52YWx1ZU9mKCkscz1uLW8vMixyPW4rby8yLGE9IWV8fHZvaWQgMD09PWUuYW5pbWF0aW9ufHxlLmFuaW1hdGlvbjt0aGlzLnJhbmdlLnNldFJhbmdlKHMscix7YW5pbWF0aW9uOmF9LGkpfSxuLnByb3RvdHlwZS5nZXRXaW5kb3c9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnJhbmdlLmdldFJhbmdlKCk7cmV0dXJue3N0YXJ0Om5ldyBEYXRlKHQuc3RhcnQpLGVuZDpuZXcgRGF0ZSh0LmVuZCl9fSxuLnByb3RvdHlwZS56b29tSW49ZnVuY3Rpb24odCxlLGkpe2lmKCEoIXR8fHQ8MHx8dD4xKSl7XCJmdW5jdGlvblwiPT10eXBlb2YgYXJndW1lbnRzWzFdJiYoaT1hcmd1bWVudHNbMV0sZT17fSk7dmFyIG89dGhpcy5nZXRXaW5kb3coKSxuPW8uc3RhcnQudmFsdWVPZigpLHM9by5lbmQudmFsdWVPZigpLHI9cy1uLGE9ci8oMSt0KSxoPShyLWEpLzIsZD1uK2gsbD1zLWg7dGhpcy5zZXRXaW5kb3coZCxsLGUsaSl9fSxuLnByb3RvdHlwZS56b29tT3V0PWZ1bmN0aW9uKHQsZSxpKXtpZighKCF0fHx0PDB8fHQ+MSkpe1wiZnVuY3Rpb25cIj09dHlwZW9mIGFyZ3VtZW50c1sxXSYmKGk9YXJndW1lbnRzWzFdLGU9e30pO3ZhciBvPXRoaXMuZ2V0V2luZG93KCksbj1vLnN0YXJ0LnZhbHVlT2YoKSxzPW8uZW5kLnZhbHVlT2YoKSxyPXMtbixhPW4tcip0LzIsaD1zK3IqdC8yO3RoaXMuc2V0V2luZG93KGEsaCxlLGkpfX0sbi5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5fcmVkcmF3KCl9LG4ucHJvdG90eXBlLl9yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLnJlZHJhd0NvdW50Kys7dmFyIHQ9ITEsZT10aGlzLm9wdGlvbnMsaT10aGlzLnByb3BzLG89dGhpcy5kb207aWYobyYmby5jb250YWluZXImJjAhPW8ucm9vdC5vZmZzZXRXaWR0aCl7bS51cGRhdGVIaWRkZW5EYXRlcyh0aGlzLm9wdGlvbnMubW9tZW50LHRoaXMuYm9keSx0aGlzLm9wdGlvbnMuaGlkZGVuRGF0ZXMpLFwidG9wXCI9PWUub3JpZW50YXRpb24/KGMuYWRkQ2xhc3NOYW1lKG8ucm9vdCxcInZpcy10b3BcIiksYy5yZW1vdmVDbGFzc05hbWUoby5yb290LFwidmlzLWJvdHRvbVwiKSk6KGMucmVtb3ZlQ2xhc3NOYW1lKG8ucm9vdCxcInZpcy10b3BcIiksYy5hZGRDbGFzc05hbWUoby5yb290LFwidmlzLWJvdHRvbVwiKSksby5yb290LnN0eWxlLm1heEhlaWdodD1jLm9wdGlvbi5hc1NpemUoZS5tYXhIZWlnaHQsXCJcIiksby5yb290LnN0eWxlLm1pbkhlaWdodD1jLm9wdGlvbi5hc1NpemUoZS5taW5IZWlnaHQsXCJcIiksby5yb290LnN0eWxlLndpZHRoPWMub3B0aW9uLmFzU2l6ZShlLndpZHRoLFwiXCIpLGkuYm9yZGVyLmxlZnQ9KG8uY2VudGVyQ29udGFpbmVyLm9mZnNldFdpZHRoLW8uY2VudGVyQ29udGFpbmVyLmNsaWVudFdpZHRoKS8yLGkuYm9yZGVyLnJpZ2h0PWkuYm9yZGVyLmxlZnQsaS5ib3JkZXIudG9wPShvLmNlbnRlckNvbnRhaW5lci5vZmZzZXRIZWlnaHQtby5jZW50ZXJDb250YWluZXIuY2xpZW50SGVpZ2h0KS8yLGkuYm9yZGVyLmJvdHRvbT1pLmJvcmRlci50b3AsaS5ib3JkZXJSb290SGVpZ2h0PW8ucm9vdC5vZmZzZXRIZWlnaHQtby5yb290LmNsaWVudEhlaWdodCxpLmJvcmRlclJvb3RXaWR0aD1vLnJvb3Qub2Zmc2V0V2lkdGgtby5yb290LmNsaWVudFdpZHRoLDA9PT1vLmNlbnRlckNvbnRhaW5lci5jbGllbnRIZWlnaHQmJihpLmJvcmRlci5sZWZ0PWkuYm9yZGVyLnRvcCxpLmJvcmRlci5yaWdodD1pLmJvcmRlci5sZWZ0KSwwPT09by5yb290LmNsaWVudEhlaWdodCYmKGkuYm9yZGVyUm9vdFdpZHRoPWkuYm9yZGVyUm9vdEhlaWdodCksaS5jZW50ZXIuaGVpZ2h0PW8uY2VudGVyLm9mZnNldEhlaWdodCxpLmxlZnQuaGVpZ2h0PW8ubGVmdC5vZmZzZXRIZWlnaHQsaS5yaWdodC5oZWlnaHQ9by5yaWdodC5vZmZzZXRIZWlnaHQsaS50b3AuaGVpZ2h0PW8udG9wLmNsaWVudEhlaWdodHx8LWkuYm9yZGVyLnRvcCxpLmJvdHRvbS5oZWlnaHQ9by5ib3R0b20uY2xpZW50SGVpZ2h0fHwtaS5ib3JkZXIuYm90dG9tO3ZhciBuPU1hdGgubWF4KGkubGVmdC5oZWlnaHQsaS5jZW50ZXIuaGVpZ2h0LGkucmlnaHQuaGVpZ2h0KSxzPWkudG9wLmhlaWdodCtuK2kuYm90dG9tLmhlaWdodCtpLmJvcmRlclJvb3RIZWlnaHQraS5ib3JkZXIudG9wK2kuYm9yZGVyLmJvdHRvbTtvLnJvb3Quc3R5bGUuaGVpZ2h0PWMub3B0aW9uLmFzU2l6ZShlLmhlaWdodCxzK1wicHhcIiksaS5yb290LmhlaWdodD1vLnJvb3Qub2Zmc2V0SGVpZ2h0LGkuYmFja2dyb3VuZC5oZWlnaHQ9aS5yb290LmhlaWdodC1pLmJvcmRlclJvb3RIZWlnaHQ7dmFyIHI9aS5yb290LmhlaWdodC1pLnRvcC5oZWlnaHQtaS5ib3R0b20uaGVpZ2h0LWkuYm9yZGVyUm9vdEhlaWdodDtpLmNlbnRlckNvbnRhaW5lci5oZWlnaHQ9cixpLmxlZnRDb250YWluZXIuaGVpZ2h0PXIsaS5yaWdodENvbnRhaW5lci5oZWlnaHQ9aS5sZWZ0Q29udGFpbmVyLmhlaWdodCxpLnJvb3Qud2lkdGg9by5yb290Lm9mZnNldFdpZHRoLGkuYmFja2dyb3VuZC53aWR0aD1pLnJvb3Qud2lkdGgtaS5ib3JkZXJSb290V2lkdGgsdGhpcy5pbml0aWFsRHJhd0RvbmV8fChpLnNjcm9sbGJhcldpZHRoPWMuZ2V0U2Nyb2xsQmFyV2lkdGgoKSksZS52ZXJ0aWNhbFNjcm9sbD9lLnJ0bD8oaS5sZWZ0LndpZHR
21167oPW8ubGVmdENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLmxlZnQsaS5yaWdodC53aWR0aD1vLnJpZ2h0Q29udGFpbmVyLmNsaWVudFdpZHRoK2kuc2Nyb2xsYmFyV2lkdGh8fC1pLmJvcmRlci5yaWdodCk6KGkubGVmdC53aWR0aD1vLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGgraS5zY3JvbGxiYXJXaWR0aHx8LWkuYm9yZGVyLmxlZnQsaS5yaWdodC53aWR0aD1vLnJpZ2h0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIucmlnaHQpOihpLmxlZnQud2lkdGg9by5sZWZ0Q29udGFpbmVyLmNsaWVudFdpZHRofHwtaS5ib3JkZXIubGVmdCxpLnJpZ2h0LndpZHRoPW8ucmlnaHRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5yaWdodCksdGhpcy5fc2V0RE9NKCk7dmFyIGE9dGhpcy5fdXBkYXRlU2Nyb2xsVG9wKCk7XCJ0b3BcIiE9ZS5vcmllbnRhdGlvbi5pdGVtJiYoYSs9TWF0aC5tYXgoaS5jZW50ZXJDb250YWluZXIuaGVpZ2h0LWkuY2VudGVyLmhlaWdodC1pLmJvcmRlci50b3AtaS5ib3JkZXIuYm90dG9tLDApKSxvLmNlbnRlci5zdHlsZS50b3A9YStcInB4XCI7dmFyIGg9MD09aS5zY3JvbGxUb3A/XCJoaWRkZW5cIjpcIlwiLGQ9aS5zY3JvbGxUb3A9PWkuc2Nyb2xsVG9wTWluP1wiaGlkZGVuXCI6XCJcIjtvLnNoYWRvd1RvcC5zdHlsZS52aXNpYmlsaXR5PWgsby5zaGFkb3dCb3R0b20uc3R5bGUudmlzaWJpbGl0eT1kLG8uc2hhZG93VG9wTGVmdC5zdHlsZS52aXNpYmlsaXR5PWgsby5zaGFkb3dCb3R0b21MZWZ0LnN0eWxlLnZpc2liaWxpdHk9ZCxvLnNoYWRvd1RvcFJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9aCxvLnNoYWRvd0JvdHRvbVJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9ZCxlLnZlcnRpY2FsU2Nyb2xsJiYoby5yaWdodENvbnRhaW5lci5jbGFzc05hbWU9XCJ2aXMtcGFuZWwgdmlzLXJpZ2h0IHZpcy12ZXJ0aWNhbC1zY3JvbGxcIixvLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLXBhbmVsIHZpcy1sZWZ0IHZpcy12ZXJ0aWNhbC1zY3JvbGxcIixvLnNoYWRvd1RvcFJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIixvLnNoYWRvd0JvdHRvbVJpZ2h0LnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIixvLnNoYWRvd1RvcExlZnQuc3R5bGUudmlzaWJpbGl0eT1cImhpZGRlblwiLG8uc2hhZG93Qm90dG9tTGVmdC5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCIsby5sZWZ0LnN0eWxlLnRvcD1cIjBweFwiLG8ucmlnaHQuc3R5bGUudG9wPVwiMHB4XCIpLCghZS52ZXJ0aWNhbFNjcm9sbHx8aS5jZW50ZXIuaGVpZ2h0PGkuY2VudGVyQ29udGFpbmVyLmhlaWdodCkmJihvLmxlZnQuc3R5bGUudG9wPWErXCJweFwiLG8ucmlnaHQuc3R5bGUudG9wPWErXCJweFwiLG8ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lPW8ucmlnaHRDb250YWluZXIuY2xhc3NOYW1lLnJlcGxhY2UobmV3IFJlZ0V4cChcIig/Ol58XFxcXHMpdmlzLXZlcnRpY2FsLXNjcm9sbCg/OlxcXFxzfCQpXCIpLFwiIFwiKSxvLmxlZnRDb250YWluZXIuY2xhc3NOYW1lPW8ubGVmdENvbnRhaW5lci5jbGFzc05hbWUucmVwbGFjZShuZXcgUmVnRXhwKFwiKD86XnxcXFxccyl2aXMtdmVydGljYWwtc2Nyb2xsKD86XFxcXHN8JClcIiksXCIgXCIpLGkubGVmdC53aWR0aD1vLmxlZnRDb250YWluZXIuY2xpZW50V2lkdGh8fC1pLmJvcmRlci5sZWZ0LGkucmlnaHQud2lkdGg9by5yaWdodENvbnRhaW5lci5jbGllbnRXaWR0aHx8LWkuYm9yZGVyLnJpZ2h0LHRoaXMuX3NldERPTSgpKTt2YXIgdT1pLmNlbnRlci5oZWlnaHQ+aS5jZW50ZXJDb250YWluZXIuaGVpZ2h0O3RoaXMuaGFtbWVyLmdldChcInBhblwiKS5zZXQoe2RpcmVjdGlvbjp1P2wuRElSRUNUSU9OX0FMTDpsLkRJUkVDVElPTl9IT1JJWk9OVEFMfSksdGhpcy5jb21wb25lbnRzLmZvckVhY2goZnVuY3Rpb24oZSl7dD1lLnJlZHJhdygpfHx0fSk7aWYodCl7aWYodGhpcy5yZWRyYXdDb3VudDw1KXJldHVybiB2b2lkIHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIpO2NvbnNvbGUubG9nKFwiV0FSTklORzogaW5maW5pdGUgbG9vcCBpbiByZWRyYXc/XCIpfWVsc2UgdGhpcy5yZWRyYXdDb3VudD0wO3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJjaGFuZ2VkXCIpfX0sbi5wcm90b3R5cGUuX3NldERPTT1mdW5jdGlvbigpe3ZhciB0PXRoaXMucHJvcHMsZT10aGlzLmRvbTt0LmxlZnRDb250YWluZXIud2lkdGg9dC5sZWZ0LndpZHRoLHQucmlnaHRDb250YWluZXIud2lkdGg9dC5yaWdodC53aWR0aDt2YXIgaT10LnJvb3Qud2lkdGgtdC5sZWZ0LndpZHRoLXQucmlnaHQud2lkdGgtdC5ib3JkZXJSb290V2lkdGg7dC5jZW50ZXIud2lkdGg9aSx0LmNlbnRlckNvbnRhaW5lci53aWR0aD1pLHQudG9wLndpZHRoPWksdC5ib3R0b20ud2lkdGg9aSxlLmJhY2tncm91bmQuc3R5bGUuaGVpZ2h0PXQuYmFja2dyb3VuZC5oZWlnaHQrXCJweFwiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLmhlaWdodD10LmJhY2tncm91bmQuaGVpZ2h0K1wicHhcIixlLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLmhlaWdodD10LmNlbnRlckNvbnRhaW5lci5oZWlnaHQrXCJweFwiLGUuY2VudGVyQ29udGFpbmVyLnN0eWxlLmhlaWdodD10LmNlbnRlckNvbnRhaW5lci5oZWlnaHQrXCJweFwiLGUubGVmdENvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dC5sZWZ0Q29udGFpbmVyLmhlaWdodCtcInB4XCIsZS5yaWdodENvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dC5yaWdodENvbnRhaW5lci5oZWlnaHQrXCJweFwiLGUuYmFja2dyb3VuZC5zdHlsZS53aWR0aD10LmJhY2tncm91bmQud2lkdGgrXCJweFwiLGUuYmFja2dyb3VuZFZlcnRpY2FsLnN0eWxlLndpZHRoP
21167XQuY2VudGVyQ29udGFpbmVyLndpZHRoK1wicHhcIixlLmJhY2tncm91bmRIb3Jpem9udGFsLnN0eWxlLndpZHRoPXQuYmFja2dyb3VuZC53aWR0aCtcInB4XCIsZS5jZW50ZXJDb250YWluZXIuc3R5bGUud2lkdGg9dC5jZW50ZXIud2lkdGgrXCJweFwiLGUudG9wLnN0eWxlLndpZHRoPXQudG9wLndpZHRoK1wicHhcIixlLmJvdHRvbS5zdHlsZS53aWR0aD10LmJvdHRvbS53aWR0aCtcInB4XCIsZS5iYWNrZ3JvdW5kLnN0eWxlLmxlZnQ9XCIwXCIsZS5iYWNrZ3JvdW5kLnN0eWxlLnRvcD1cIjBcIixlLmJhY2tncm91bmRWZXJ0aWNhbC5zdHlsZS5sZWZ0PXQubGVmdC53aWR0aCt0LmJvcmRlci5sZWZ0K1wicHhcIixlLmJhY2tncm91bmRWZXJ0aWNhbC5zdHlsZS50b3A9XCIwXCIsZS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5zdHlsZS5sZWZ0PVwiMFwiLGUuYmFja2dyb3VuZEhvcml6b250YWwuc3R5bGUudG9wPXQudG9wLmhlaWdodCtcInB4XCIsZS5jZW50ZXJDb250YWluZXIuc3R5bGUubGVmdD10LmxlZnQud2lkdGgrXCJweFwiLGUuY2VudGVyQ29udGFpbmVyLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrXCJweFwiLGUubGVmdENvbnRhaW5lci5zdHlsZS5sZWZ0PVwiMFwiLGUubGVmdENvbnRhaW5lci5zdHlsZS50b3A9dC50b3AuaGVpZ2h0K1wicHhcIixlLnJpZ2h0Q29udGFpbmVyLnN0eWxlLmxlZnQ9dC5sZWZ0LndpZHRoK3QuY2VudGVyLndpZHRoK1wicHhcIixlLnJpZ2h0Q29udGFpbmVyLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrXCJweFwiLGUudG9wLnN0eWxlLmxlZnQ9dC5sZWZ0LndpZHRoK1wicHhcIixlLnRvcC5zdHlsZS50b3A9XCIwXCIsZS5ib3R0b20uc3R5bGUubGVmdD10LmxlZnQud2lkdGgrXCJweFwiLGUuYm90dG9tLnN0eWxlLnRvcD10LnRvcC5oZWlnaHQrdC5jZW50ZXJDb250YWluZXIuaGVpZ2h0K1wicHhcIixlLmNlbnRlci5zdHlsZS5sZWZ0PVwiMFwiLGUubGVmdC5zdHlsZS5sZWZ0PVwiMFwiLGUucmlnaHQuc3R5bGUubGVmdD1cIjBcIn0sbi5wcm90b3R5cGUucmVwYWludD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIkZ1bmN0aW9uIHJlcGFpbnQgaXMgZGVwcmVjYXRlZC4gVXNlIHJlZHJhdyBpbnN0ZWFkLlwiKX0sbi5wcm90b3R5cGUuc2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24odCl7aWYoIXRoaXMuY3VycmVudFRpbWUpdGhyb3cgbmV3IEVycm9yKFwiT3B0aW9uIHNob3dDdXJyZW50VGltZSBtdXN0IGJlIHRydWVcIik7dGhpcy5jdXJyZW50VGltZS5zZXRDdXJyZW50VGltZSh0KX0sbi5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtpZighdGhpcy5jdXJyZW50VGltZSl0aHJvdyBuZXcgRXJyb3IoXCJPcHRpb24gc2hvd0N1cnJlbnRUaW1lIG11c3QgYmUgdHJ1ZVwiKTtyZXR1cm4gdGhpcy5jdXJyZW50VGltZS5nZXRDdXJyZW50VGltZSgpfSxuLnByb3RvdHlwZS5fdG9UaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvVGltZSh0aGlzLHQsdGhpcy5wcm9wcy5jZW50ZXIud2lkdGgpfSxuLnByb3RvdHlwZS5fdG9HbG9iYWxUaW1lPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvVGltZSh0aGlzLHQsdGhpcy5wcm9wcy5yb290LndpZHRoKX0sbi5wcm90b3R5cGUuX3RvU2NyZWVuPWZ1bmN0aW9uKHQpe3JldHVybiBtLnRvU2NyZWVuKHRoaXMsdCx0aGlzLnByb3BzLmNlbnRlci53aWR0aCl9LG4ucHJvdG90eXBlLl90b0dsb2JhbFNjcmVlbj1mdW5jdGlvbih0KXtyZXR1cm4gbS50b1NjcmVlbih0aGlzLHQsdGhpcy5wcm9wcy5yb290LndpZHRoKX0sbi5wcm90b3R5cGUuX2luaXRBdXRvUmVzaXplPWZ1bmN0aW9uKCl7MT09dGhpcy5vcHRpb25zLmF1dG9SZXNpemU/dGhpcy5fc3RhcnRBdXRvUmVzaXplKCk6dGhpcy5fc3RvcEF1dG9SZXNpemUoKX0sbi5wcm90b3R5cGUuX3N0YXJ0QXV0b1Jlc2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fc3RvcEF1dG9SZXNpemUoKSx0aGlzLl9vblJlc2l6ZT1mdW5jdGlvbigpe2lmKDEhPXQub3B0aW9ucy5hdXRvUmVzaXplKXJldHVybi
21167B2b2lkIHQuX3N0b3BBdXRvUmVzaXplKCk7dC5kb20ucm9vdCYmKHQuZG9tLnJvb3Qub2Zmc2V0V2lkdGg9PXQucHJvcHMubGFzdFdpZHRoJiZ0LmRvbS5yb290Lm9mZnNldEhlaWdodD09dC5wcm9wcy5sYXN0SGVpZ2h0fHwodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQsdC5wcm9wcy5zY3JvbGxiYXJXaWR0aD1jLmdldFNjcm9sbEJhcldpZHRoKCksdC5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIikpKX0sYy5hZGRFdmVudExpc3RlbmVyKHdpbmRvdyxcInJlc2l6ZVwiLHRoaXMuX29uUmVzaXplKSx0LmRvbS5yb290JiYodC5wcm9wcy5sYXN0V2lkdGg9dC5kb20ucm9vdC5vZmZzZXRXaWR0aCx0LnByb3BzLmxhc3RIZWlnaHQ9dC5kb20ucm9vdC5vZmZzZXRIZWlnaHQpLHRoaXMud2F0Y2hUaW1lcj1zZXRJbnRlcnZhbCh0aGlzLl9vblJlc2l6ZSwxZTMpfSxuLnByb3RvdHlwZS5fc3RvcEF1dG9SZXNpemU9ZnVuY3Rpb24oKXt0aGlzLndhdGNoVGltZXImJihjbGVhckludGVydmFsKHRoaXMud2F0Y2hUaW1lciksdGhpcy53YXRjaFRpbWVyPXZvaWQgMCksdGhpcy5fb25SZXNpemUmJihjLnJlbW92ZUV2ZW50TGlzdGVuZXIod2luZG93LFwicmVzaXplXCIsdGhpcy5fb25SZXNpemUpLHRoaXMuX29uUmVzaXplPW51bGwpfSxuLnByb3RvdHlwZS5fb25Ub3VjaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmc9ITAsdGhpcy50b3VjaC5pbml0aWFsU2Nyb2xsVG9wPXRoaXMucHJvcHMuc2Nyb2xsVG9wfSxuLnByb3RvdHlwZS5fb25QaW5jaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoLmFsbG93RHJhZ2dpbmc9ITF9LG4ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodCYmdGhpcy50b3VjaC5hbGxvd0RyYWdnaW5nKXt2YXIgZT10LmRlbHRhWSxpPXRoaXMuX2dldFNjcm9sbFRvcCgpLG89dGhpcy5fc2V0U2Nyb2xsVG9wKHRoaXMudG91Y2guaW5pdGlhbFNjcm9sbFRvcCtlKTt0aGlzLm9wdGlvbnMudmVydGljYWxTY3JvbGwmJih0aGlzLmRvbS5sZWZ0LnBhcmVudE5vZGUuc2Nyb2xsVG9wPS10aGlzLnByb3BzLnNjcm9sbFRvcCx0aGlzLmRvbS5yaWdodC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3ApLG8hPWkmJnRoaXMuZW1pdChcInZlcnRpY2FsRHJhZ1wiKX19LG4ucHJvdG90eXBlLl9zZXRTY3JvbGxUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucHJvcHMuc2Nyb2xsVG9wPXQsdGhpcy5fdXBkYXRlU2Nyb2xsVG9wKCksdGhpcy5wcm9wcy5zY3JvbGxUb3B9LG4ucHJvdG90eXBlLl91cGRhdGVTY3JvbGxUb3A9ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLm1pbih0aGlzLnByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQtdGhpcy5wcm9wcy5jZW50ZXIuaGVpZ2h0LDApO3JldHVybiB0IT10aGlzLnByb3BzLnNjcm9sbFRvcE1pbiYmKFwidG9wXCIhPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtJiYodGhpcy5wcm9wcy5zY3JvbGxUb3ArPXQtdGhpcy5wcm9wcy5zY3JvbGxUb3BNaW4pLHRoaXMucHJvcHMuc2Nyb2xsVG9wTWluPXQpLHRoaXMucHJvcHMuc2Nyb2xsVG9wPjAmJih0aGlzLnByb3BzLnNjcm9sbFRvcD0wKSx0aGlzLnByb3BzLnNjcm9sbFRvcDx0JiYodGhpcy5wcm9wcy5zY3JvbGxUb3A9dCksdGhpcy5vcHRpb25zLnZlcnRpY2FsU2Nyb2xsJiYodGhpcy5kb20ubGVmdC5wYXJlbnROb2RlLnNjcm9sbFRvcD0tdGhpcy5wcm9wcy5zY3JvbGxUb3AsdGhpcy5kb20ucmlnaHQucGFyZW50Tm9kZS5zY3JvbGxUb3A9LXRoaXMucHJvcHMuc2Nyb2xsVG9wKSx0aGlzLnByb3BzLnNjcm9sbFRvcH0sbi5wcm90b3R5cGUuX2dldFNjcm9sbFRvcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BzLnNjcm9sbFRvcH0sbi5wcm90b3R5cGUuX2NyZWF0ZUNvbmZpZ3VyYXRvcj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcihcIkNhbm5vdCBpbnZva2UgYWJzdHJhY3QgbWV0aG9kIF9jcmVhdGVDb25maWd1cmF0b3JcIil9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSxzLHIpe3RoaXMubW9tZW50PW4sdGhpcy5jdXJyZW50PXRoaXMubW9tZW50KCksdGhpcy5fc3RhcnQ9dGhpcy5tb21lbnQoKSx0aGlzLl9lbmQ9dGhpcy5tb21lbnQoKSx0aGlzLmF1dG9TY2FsZT0hMCx0aGlzLnNjYWxlPVwiZGF5XCIsdGhpcy5zdGVwPTEsdGhpcy5zZXRSYW5nZSh0LGUsaSksdGhpcy5zd2l0Y2hlZERheT0hMSx0aGlzLnN3aXRjaGVkTW9udGg9ITEsdGhpcy5zd2l0Y2hlZFllYXI9ITEsQXJyYXkuaXNBcnJheShzKT90aGlzLmhpZGRlbkRhdGVzPXM6dGhpcy5oaWRkZW5EYXRlcz12b2lkIDAhPXM/W3NdOltdLHRoaXMuZm9ybWF0PW8uRk9STUFULHRoaXMub3B0aW9ucz1yfHx7fX12YXIgbj1pKDkpLHM9aSgzNikscj1pKDIpO28uRk9STUFUPXttaW5vckxhYmVsczp7bWlsbGlzZWNvbmQ6XCJTU1NcIixzZWNvbmQ6XCJzXCIsbWludXRlOlwiSEg6bW1cIixob3VyOlwiSEg6bW1cIix3ZWVrZGF5OlwiZGRkIERcIixkYXk6XCJEXCIsd2VlazpcIndcIixtb250aDpcIk1NTVwiLHllYXI6XCJZWVlZXCJ9LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDpcIkhIOm1tOnNzXCIsc2Vjb25kOlwiRCBNTU1NIEhIOm1tXCIsbWludXRlOlwiZGRkIEQgTU1NTVwiLGhvdXI6XCJkZGQgRCBNTU1NXCIsd2Vla2RheTpcIk1NTU0gWVlZWVwiLGRheTpcIk1NTU0gWVlZWVwiLHdlZWs6XCJNTU1NIFlZWVlcIixtb250aDpcIllZWVlcIix5ZWFyOlwiXCJ9fSxvLnByb3RvdHlwZS5zZXRNb21lbnQ9ZnVuY3Rpb24odCl7dGhpcy5tb21lbnQ9dCx0aGlzLmN1cnJlbnQ9dGhpcy5tb21lbnQodGhpcy5jdXJyZW50LnZhbHVlT2YoKSksdGhpcy5fc3RhcnQ9dGhpcy5tb21lbnQodGhpcy5fc3RhcnQudmFsdWVPZigpKSx0aGlzLl9lbmQ9dGhpcy5tb21lbnQodGhpcy5fZW5kLnZhbHVlT2YoKSl9LG8ucHJvdG90eXBlLnNldEZvcm1hdD1mdW5jdGlvbih0KXt2YXIgZT1yLmRlZXBFeHRlbmQoe30sby5GT1JNQVQpO3RoaXMuZm9ybWF0PXIuZGVlcEV4dGVuZChlLHQpfSxvLnByb3RvdHlwZS5zZXRSYW5nZT1mdW5jdGlvbih0LGUsaSl7aWYoISh0IGluc3RhbmNlb2YgRGF0ZSYmZSBpbnN0YW5jZW9mIERhdGUpKXRocm93XCJObyBsZWdhbCBzdGFydCBvciBlbmQgZGF0ZSBpbiBtZXRob2Qgc2V0UmFuZ2VcIjt0aGlzLl9zdGFydD12b2lkIDAhPXQ/dGhpcy5tb21lbnQodC52YWx1ZU9mKCkpOm5ldyBEYXRlLHRoaXMuX2VuZD12b2lkIDAhPWU/dGhpcy5tb21lbnQoZS52YWx1ZU9mKCkpOm5ldyBEYXRlLHRoaXMuYXV0b1NjYWxlJiZ0aGlzLnNldE1pbmltdW1TdGVwKGkpfSxvLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbigpe3RoaXMuY3VycmVudD10aGlzLl9zdGFydC5jbG9uZSgpLHRoaXMucm91bmRUb01pbm9yKCl9LG8ucHJvdG90eXBlLnJvdW5kVG9NaW5vcj1mdW5jdGlvbigpe3N3aXRjaC
21167hcIndlZWtcIj09dGhpcy5zY2FsZSYmdGhpcy5jdXJyZW50LndlZWtkYXkoMCksdGhpcy5zY2FsZSl7Y2FzZVwieWVhclwiOnRoaXMuY3VycmVudC55ZWFyKHRoaXMuc3RlcCpNYXRoLmZsb29yKHRoaXMuY3VycmVudC55ZWFyKCkvdGhpcy5zdGVwKSksdGhpcy5jdXJyZW50Lm1vbnRoKDApO2Nhc2VcIm1vbnRoXCI6dGhpcy5jdXJyZW50LmRhdGUoMSk7Y2FzZVwid2Vla1wiOmNhc2VcImRheVwiOmNhc2VcIndlZWtkYXlcIjp0aGlzLmN1cnJlbnQuaG91cnMoMCk7Y2FzZVwiaG91clwiOnRoaXMuY3VycmVudC5taW51dGVzKDApO2Nhc2VcIm1pbnV0ZVwiOnRoaXMuY3VycmVudC5zZWNvbmRzKDApO2Nhc2VcInNlY29uZFwiOnRoaXMuY3VycmVudC5taWxsaXNlY29uZHMoMCl9aWYoMSE9dGhpcy5zdGVwKXN3aXRjaCh0aGlzLnNjYWxlKXtjYXNlXCJtaWxsaXNlY29uZFwiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCkldGhpcy5zdGVwLFwibWlsbGlzZWNvbmRzXCIpO2JyZWFrO2Nhc2VcInNlY29uZFwiOnRoaXMuY3VycmVudC5zdWJ0cmFjdCh0aGlzLmN1cnJlbnQuc2Vjb25kcygpJXRoaXMuc3RlcCxcInNlY29uZHNcIik7YnJlYWs7Y2FzZVwibWludXRlXCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5taW51dGVzKCkldGhpcy5zdGVwLFwibWludXRlc1wiKTticmVhaztjYXNlXCJob3VyXCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCxcImhvdXJzXCIpO2JyZWFrO2Nhc2VcIndlZWtkYXlcIjpjYXNlXCJkYXlcIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QoKHRoaXMuY3VycmVudC5kYXRlKCktMSkldGhpcy5zdGVwLFwiZGF5XCIpO2JyZWFrO2Nhc2VcIndlZWtcIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LndlZWsoKSV0aGlzLnN0ZXAsXCJ3ZWVrXCIpO2JyZWFrO2Nhc2VcIm1vbnRoXCI6dGhpcy5jdXJyZW50LnN1YnRyYWN0KHRoaXMuY3VycmVudC5tb250aCgpJXRoaXMuc3RlcCxcIm1vbnRoXCIpO2JyZWFrO2Nhc2VcInllYXJcIjp0aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LnllYXIoKSV0aGlzLnN0ZXAsXCJ5ZWFyXCIpfX0sby5wcm90b3R5cGUuaGFzTmV4dD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnQudmFsdWVPZigpPD10aGlzLl9lbmQudmFsdWVPZigpfSxvLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jdXJyZW50LnZhbHVlT2YoKTtzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwibWlsbGlzZWNvbmRcIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcIm1pbGxpc2Vjb25kXCIpO2JyZWFrO2Nhc2VcInNlY29uZFwiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLFwic2Vjb25kXCIpO2JyZWFrO2Nhc2VcIm1pbnV0ZVwiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLFwibWludXRlXCIpO2JyZWFrO2Nhc2VcImhvdXJcIjp0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcImhvdXJcIiksdGhpcy5jdXJyZW50Lm1vbnRoKCk8Nj90aGlzLmN1cnJlbnQuc3VidHJhY3QodGhpcy5jdXJyZW50LmhvdXJzKCkldGhpcy5zdGVwLFwiaG91clwiKTp0aGlzLmN1cnJlbnQuaG91cnMoKSV0aGlzLnN0ZXAhPTAmJnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLXRoaXMuY3VycmVudC5ob3VycygpJXRoaXMuc3RlcCxcImhvdXJcIik7YnJlYWs7Y2FzZVwid2Vla2RheVwiOmNhc2VcImRheVwiOnRoaXMuY3VycmVudC5hZGQodGhpcy5zdGVwLFwiZGF5XCIpO2JyZWFrO2Nhc2VcIndlZWtcIjppZigwIT09dGhpcy5jdXJyZW50LndlZWtkYXkoKSl0aGlzLmN1cnJlbnQud2Vla2RheSgwKSx0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcIndlZWtcIik7ZWxzZSBpZighMT09PXRoaXMub3B0aW9ucy5zaG93TWFqb3JMYWJlbHMpdGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJ3ZWVrXCIpO2Vsc2V7dmFyIGU9dGhpcy5jdXJyZW50LmNsb25lKCk7ZS5hZGQoMSxcIndlZWtcIiksZS5pc1NhbWUodGhpcy5jdXJyZW50LFwibW9udGhcIik/dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJ3ZWVrXCIpOih0aGlzLmN1cnJlbnQuYWRkKHRoaXMuc3RlcCxcIndlZWtcIiksdGhpcy5jdXJyZW50LmRhdGUoMSkpfWJyZWFrO2Nhc2VcIm1vbnRoXCI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJtb250aFwiKTticmVhaztjYXNlXCJ5ZWFyXCI6dGhpcy5jdXJyZW50LmFkZCh0aGlzLnN0ZXAsXCJ5ZWFyXCIpfWlmKDEhPXRoaXMuc3RlcClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwibWlsbGlzZWNvbmRcIjp0aGlzLmN1cnJlbnQubWlsbGlzZWNvbmRzKCk+MCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50Lm1pbGxpc2Vjb25kcygwKTticmVhaztjYXNlXCJzZWNvbmRcIjp0aGlzLmN1cnJlbnQuc2Vjb25kcygpPjAmJnRoaXMuY3VycmVudC5zZWNvbmRzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQuc2Vjb25kcygwKTticmVhaztjYXNlXCJtaW51dGVcIjp0aGlzLmN1cnJlbnQubWludXRlcygpPjAmJnRoaXMuY3VycmVudC5taW51dGVzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQubWludXRlcygwKTticmVhaztjYXNlXCJob3VyXCI6dGhpcy5jdXJyZW50LmhvdXJzKCk+MCYmdGhpcy5jdXJyZW50LmhvdXJzKCk8dGhpcy5zdGVwJiZ0aGlzLmN1cnJlbnQuaG91cnMoMCk7YnJlYWs7Y2FzZVwid2Vla2RheVwiOmNhc2VcImRheVwiOnRoaXMuY3VycmVudC5kYXRlKCk8dGhpcy5zdGVwKzEmJnRoaXMuY3VycmVudC5kYXRlKDEpO2JyZWFrO2Nhc2VcIndlZWtcIjp0aGlzLmN1cnJlbnQud2VlaygpPHRoaXMuc3RlcCYmdGhpcy5jdXJyZW50LndlZWsoMSk7YnJlYWs7Y2FzZVwibW9udGhcIjp0aGlzLmN1cnJlbnQubW9udGgoKTx0aGlzLnN0ZXAmJnRoaXMuY3VycmVudC5tb250aCgwKX10aGlzLmN1cnJlbnQudmFsdWVPZigpPT10JiYodGhpcy5jdXJyZW50PXRoaXMuX2VuZC5jbG9uZSgpKSx0aGlzLnN3aXRjaGVkRGF5PSExLHRoaXMuc3dpdGNoZWRNb250aD0hMSx0aGlzLnN3aXRjaGVkWWVhcj0hMSxzLnN0ZXBPdmVySGlkZGVuRGF0ZXModGhpcy5tb21lbnQsdGhpcyx0KX0sby5wcm90b3R5cGUuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmN1cnJlbnR9LG8ucHJvdG90eXBlLnNldFNjYWxlPWZ1bmN0aW9uKHQpe3QmJlwic3RyaW5nXCI9PXR5cGVvZiB0LnNjYWxlJiYodGhpcy5zY2FsZT10LnNjYWxlLHRoaXMuc3RlcD10LnN0ZXA+MD90LnN0ZXA6MSx0aGlzLmF1dG9TY2FsZT0hMSl9LG8ucHJvdG90eXBlLnNldEF1dG9TY2FsZT1mdW5jdGlvbih0KXt0aGlzLmF1dG9TY2FsZT10fSxvLnByb3RvdHlwZS5zZXRNaW5pbXVtU3RlcD1mdW5jdGlvbih0KXtpZih2b2lkIDAhPXQpezMxMTA0ZTk+dCYmKHRoaXMuc2NhbGU9XCJ5ZWFyXCIsdGhpcy5zdGVwPTFlMyksMTU1NTJlOT50JiYodGhpcy5zY2FsZT1cInllYXJcIix0aGlzLnN0ZXA9NTAwKSwzMTEwNGU4PnQmJih0aGlzLnNjYWxlPVwieWVhclwiLHRoaXMuc3RlcD0xMDApLDE1NTUyZTg+dCYmKHRoaXMuc2NhbGU9XCJ5ZWFyXCIsdGhpcy5zdGVwPTUwKSwzMTEwNGU3PnQmJih0aGlzLnNjYWxlPVwieWVhclwiLHRoaXMuc3RlcD0xMCksMTU1NTJlNz50JiYodGhpcy5zY2FsZT1cInllYXJcIix0aGlzLnN0ZXA9NSksMzExMDRlNj50JiYodGhpcy5zY2FsZT1cInllYXJcIix0aGlzLnN0ZXA9MSksNzc3NmU2PnQmJih0aGlzLnNjYWxlPVwibW9udGhcIix0aGlzLnN0ZXA9MyksMjU5MmU2PnQmJih0aGlzLnNjYWxlPVwibW9udGhcIix0aGlzLnN0ZXA9MSksNDMyZTY+dCYmKHRoaXMuc2NhbGU9XCJkYXlcIix0aGlzLnN0ZXA9NSksMTcyOGU1PnQmJih0aGlzLnNjYWxlPVwiZGF5XCIsdGhpcy5zdGVwPTIpLDg2NGU1PnQmJih0aGlzLnNjYWxlPVwiZGF5XCIsdGhpcy5zdGVwPTEpLDQzMmU1PnQmJih0aGlzLnNjYWxlPVwid2Vla2RheVwiLHRoaXMuc3RlcD0xKSwxNDRlNT50JiYodGhpcy5zY2FsZT1cImhvdXJcIix0aGlzLnN0ZXA9NCksMzZlNT50JiYodGhpcy5zY2FsZT1cImhvdXJcIix0aGlzLnN0ZXA9MSksOWU1PnQmJih0aGlzLnNjYWxlPVwibWludXRlXCIsdGhpcy5zdGVwPTE1KSw2ZTU+dCYmKHRoaXMuc2NhbGU9XCJtaW51dGVcIix0aGlzLnN0ZXA9MTApLDNlNT50JiYodGhpcy5zY2FsZT1cIm1pbnV0ZVwiLHRoaXMuc3RlcD01KSw2ZTQ+dCYmKHRoaXMuc2NhbGU9XCJtaW51dGVcIix0aGlzLnN0ZXA9MSksMTVlMz50JiYodGhpcy5zY2FsZT1cInNlY29uZFwiLHRoaXMuc3RlcD0xNSksMWU0PnQmJih0aGlzLnNjYWxlPVwic2Vjb25kXCIsdGhpcy5zdGVwPTEwKSw1ZTM+dCYmKHRoaXMuc2NhbGU9XCJzZWNvbmRcIix0aGlzLnN0ZXA9NSksMWUzPnQmJih0aGlzLnNjYWxlPVwic2Vjb25kXCIsdGhpcy5zdGVwPTEpLDIwMD50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTIwMCksMTAwPnQmJih0aGlzLnNjYWxlPVwibWlsbGlzZWNvbmRcIix0aGlzLnN0ZXA9MTAwKSw1MD50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTUwKSwxMD50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTEwKSw1PnQmJih0aGlzLnNjYWxlPVwibWlsbGlzZWNvbmRcIix0aGlzLnN0ZXA9NSksMT50JiYodGhpcy5zY2FsZT1cIm1pbGxpc2Vjb25kXCIsdGhpcy5zdGVwPTEpfX0sby5zbmFwPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1uKHQpO2lmKFwieWVhclwiPT1lKXt2YXIgcz1vLnllY
21167XIoKStNYXRoLnJvdW5kKG8ubW9udGgoKS8xMik7by55ZWFyKE1hdGgucm91bmQocy9pKSppKSxvLm1vbnRoKDApLG8uZGF0ZSgwKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcIm1vbnRoXCI9PWUpby5kYXRlKCk+MTU/KG8uZGF0ZSgxKSxvLmFkZCgxLFwibW9udGhcIikpOm8uZGF0ZSgxKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCk7ZWxzZSBpZihcIndlZWtcIj09ZSlvLndlZWtkYXkoKT4yPyhvLndlZWtkYXkoMCksby5hZGQoMSxcIndlZWtcIikpOm8ud2Vla2RheSgwKSxvLmhvdXJzKDApLG8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCk7ZWxzZSBpZihcImRheVwiPT1lKXtzd2l0Y2goaSl7Y2FzZSA1OmNhc2UgMjpvLmhvdXJzKDI0Kk1hdGgucm91bmQoby5ob3VycygpLzI0KSk7YnJlYWs7ZGVmYXVsdDpvLmhvdXJzKDEyKk1hdGgucm91bmQoby5ob3VycygpLzEyKSl9by5taW51dGVzKDApLG8uc2Vjb25kcygwKSxvLm1pbGxpc2Vjb25kcygwKX1lbHNlIGlmKFwid2Vla2RheVwiPT1lKXtzd2l0Y2goaSl7Y2FzZSA1OmNhc2UgMjpvLmhvdXJzKDEyKk1hdGgucm91bmQoby5ob3VycygpLzEyKSk7YnJlYWs7ZGVmYXVsdDpvLmhvdXJzKDYqTWF0aC5yb3VuZChvLmhvdXJzKCkvNikpfW8ubWludXRlcygwKSxvLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcImhvdXJcIj09ZSl7c3dpdGNoKGkpe2Nhc2UgNDpvLm1pbnV0ZXMoNjAqTWF0aC5yb3VuZChvLm1pbnV0ZXMoKS82MCkpO2JyZWFrO2RlZmF1bHQ6by5taW51dGVzKDMwKk1hdGgucm91bmQoby5taW51dGVzKCkvMzApKX1vLnNlY29uZHMoMCksby5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcIm1pbnV0ZVwiPT1lKXtzd2l0Y2goaSl7Y2FzZSAxNTpjYXNlIDEwOm8ubWludXRlcyg1Kk1hdGgucm91bmQoby5taW51dGVzKCkvNSkpLG8uc2Vjb25kcygwKTticmVhaztjYXNlIDU6by5zZWNvbmRzKDYwKk1hdGgucm91bmQoby5zZWNvbmRzKCkvNjApKTticmVhaztkZWZhdWx0Om8uc2Vjb25kcygzMCpNYXRoLnJvdW5kKG8uc2Vjb25kcygpLzMwKSl9by5taWxsaXNlY29uZHMoMCl9ZWxzZSBpZihcInNlY29uZFwiPT1lKXN3aXRjaChpKXtjYXNlIDE1OmNhc2UgMTA6by5zZWNvbmRzKDUqTWF0aC5yb3VuZChvLnNlY29uZHMoKS81KSksby5taWxsaXNlY29uZHMoMCk7YnJlYWs7Y2FzZSA1Om8ubWlsbGlzZWNvbmRzKDFlMypNYXRoLnJvdW5kKG8ubWlsbGlzZWNvbmRzKCkvMWUzKSk7YnJlYWs7ZGVmYXVsdDpvLm1pbGxpc2Vjb25kcyg1MDAqTWF0aC5yb3VuZChvLm1pbGxpc2Vjb25kcygpLzUwMCkpfWVsc2UgaWYoXCJtaWxsaXNlY29uZFwiPT1lKXt2YXIgcj1pPjU/aS8yOjE7by5taWxsaXNlY29uZHMoTWF0aC5yb3VuZChvLm1pbGxpc2Vjb25kcygpL3IpKnIpfXJldHVybiBvfSxvLnByb3RvdHlwZS5pc01ham9yPWZ1bmN0aW9uKCl7aWYoMT09dGhpcy5zd2l0Y2hlZFllYXIpc3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2VcInllYXJcIjpjYXNlXCJtb250aFwiOmNhc2VcIndlZWtcIjpjYXNlXCJ3ZWVrZGF5XCI6Y2FzZVwiZGF5XCI6Y2FzZVwiaG91clwiOmNhc2VcIm1pbnV0ZVwiOmNhc2VcInNlY29uZFwiOmNhc2VcIm1pbGxpc2Vjb25kXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX1lbHNlIGlmKDE9PXRoaXMuc3dpdGNoZWRNb250aClzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwid2Vla1wiOmNhc2VcIndlZWtkYXlcIjpjYXNlXCJkYXlcIjpjYXNlXCJob3VyXCI6Y2FzZVwibWludXRlXCI6Y2FzZVwic2Vjb25kXCI6Y2FzZVwibWlsbGlzZWNvbmRcIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfWVsc2UgaWYoMT09dGhpcy5zd2l0Y2hlZERheSlzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwibWlsbGlzZWNvbmRcIjpjYXNlXCJzZWNvbmRcIjpjYXNlXCJtaW51dGVcIjpjYXNlXCJob3VyXCI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX12YXIgdD10aGlzLm1vbWVudCh0aGlzLmN1cnJlbnQpO3N3aXRjaC
21167h0aGlzLnNjYWxlKXtjYXNlXCJtaWxsaXNlY29uZFwiOnJldHVybiAwPT10Lm1pbGxpc2Vjb25kcygpO2Nhc2VcInNlY29uZFwiOnJldHVybiAwPT10LnNlY29uZHMoKTtjYXNlXCJtaW51dGVcIjpyZXR1cm4gMD09dC5ob3VycygpJiYwPT10Lm1pbnV0ZXMoKTtjYXNlXCJob3VyXCI6cmV0dXJuIDA9PXQuaG91cnMoKTtjYXNlXCJ3ZWVrZGF5XCI6Y2FzZVwiZGF5XCI6Y2FzZVwid2Vla1wiOnJldHVybiAxPT10LmRhdGUoKTtjYXNlXCJtb250aFwiOnJldHVybiAwPT10Lm1vbnRoKCk7Y2FzZVwieWVhclwiOmRlZmF1bHQ6cmV0dXJuITF9fSxvLnByb3RvdHlwZS5nZXRMYWJlbE1pbm9yPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09dCYmKHQ9dGhpcy5jdXJyZW50KSx0IGluc3RhbmNlb2YgRGF0ZSYmKHQ9dGhpcy5tb21lbnQodCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuZm9ybWF0Lm1pbm9yTGFiZWxzKXJldHVybiB0aGlzLmZvcm1hdC5taW5vckxhYmVscyh0LHRoaXMuc2NhbGUsdGhpcy5zdGVwKTt2YXIgZT10aGlzLmZvcm1hdC5taW5vckxhYmVsc1t0aGlzLnNjYWxlXTtzd2l0Y2godGhpcy5zY2FsZSl7Y2FzZVwid2Vla1wiOmlmKHRoaXMuaXNNYWpvcigpJiYwIT09dC53ZWVrZGF5KCkpcmV0dXJuXCJcIjtkZWZhdWx0OnJldHVybiBlJiZlLmxlbmd0aD4wP3RoaXMubW9tZW50KHQpLmZvcm1hdChlKTpcIlwifX0sby5wcm90b3R5cGUuZ2V0TGFiZWxNYWpvcj1mdW5jdGlvbih0KXtpZih2b2lkIDA9PXQmJih0PXRoaXMuY3VycmVudCksdCBpbnN0YW5jZW9mIERhdGUmJih0PXRoaXMubW9tZW50KHQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLmZvcm1hdC5tYWpvckxhYmVscylyZXR1cm4gdGhpcy5mb3JtYXQubWFqb3JMYWJlbHModCx0aGlzLnNjYWxlLHRoaXMuc3RlcCk7dmFyIGU9dGhpcy5mb3JtYXQubWFqb3JMYWJlbHNbdGhpcy5zY2FsZV07cmV0dXJuIGUmJmUubGVuZ3RoPjA/dGhpcy5tb21lbnQodCkuZm9ybWF0KGUpOlwiXCJ9LG8ucHJvdG90eXBlLmdldENsYXNzTmFtZT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7cmV0dXJuIHQvYSUyPT0wP1wiIHZpcy1ldmVuXCI6XCIgdmlzLW9kZFwifWZ1bmN0aW9uIGUodCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLFwiZGF5XCIpP1wiIHZpcy10b2RheVwiOnQuaXNTYW1lKG4oKS5hZGQoMSxcImRheVwiKSxcImRheVwiKT9cIiB2aXMtdG9tb3Jyb3dcIjp0LmlzU2FtZShuKCkuYWRkKC0xLFwiZGF5XCIpLFwiZGF5XCIpP1wiIHZpcy15ZXN0ZXJkYXlcIjpcIlwifWZ1bmN0aW9uIGkodCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLFwid2Vla1wiKT9cIiB2aXMtY3VycmVudC13ZWVrXCI6XCJcIn1mdW5jdGlvbiBvKHQpe3JldHVybiB0LmlzU2FtZShuZXcgRGF0ZSxcIm1vbnRoXCIpP1wiIHZpcy1jdXJyZW50LW1vbnRoXCI6XCJcIn12YXIgbj10aGlzLm1vbWVudCxzPXRoaXMubW9tZW50KHRoaXMuY3VycmVudCkscj1zLmxvY2FsZT9zLmxvY2FsZShcImVuXCIpOnMubGFuZyhcImVuXCIpLGE9dGhpcy5zdGVwLGg9W107c3dpdGNoKHRoaXMuc2NhbGUpe2Nhc2VcIm1pbGxpc2Vjb25kXCI6aC5wdXNoKGUocikpLGgucHVzaCh0KHIubWlsbGlzZWNvbmRzKCkpKTticmVhaztjYXNlXCJzZWNvbmRcIjpoLnB1c2goZShyKSksaC5wdXNoKHQoci5zZWNvbmRzKCkpKTticmVhaztjYXNlXCJtaW51dGVcIjpoLnB1c2goZShyKSksaC5wdXNoKHQoci5taW51dGVzKCkpKTticmVhaztjYXNlXCJob3VyXCI6aC5wdXNoKFwidmlzLWhcIityLmhvdXJzKCkrKDQ9PXRoaXMuc3RlcD9cIi1oXCIrKHIuaG91cnMoKSs0KTpcIlwiKSksaC5wdXNoKGUocikpLGgucHVzaCh0KHIuaG91cnMoKSkpO2JyZWFrO2Nhc2VcIndlZWtkYXlcIjpoLnB1c2goXCJ2aXMtXCIrci5mb3JtYXQoXCJkZGRkXCIpLnRvTG93ZXJDYXNlKCkpLGgucHVzaChlKHIpKSxoLnB1c2goaShyKSksaC5wdXNoKHQoci5kYXRlKCkpKTticmVhaztjYXNlXCJkYXlcIjpoLnB1c2goXCJ2aXMtZGF5XCIrci5kYXRlKCkpLGgucHVzaChcInZpcy1cIityLmZvcm1hdChcIk1NTU1cIikudG9Mb3dlckNhc2UoKSksaC5wdXNoKGUocikpLGgucHVzaChvKHIpKSxoLnB1c2godGhpcy5zdGVwPD0yP2Uocik6XCJcIiksaC5wdXNoKHRoaXMuc3RlcDw9Mj9cInZpcy1cIityLmZvcm1hdChcImRkZGRcIikudG9Mb3dlckNhc2UoKTpcIlwiKSxcbiAgICBoLnB1c2godChyLmRhdGUoKS0xKSk7YnJlYWs7Y2FzZVwid2Vla1wiOmgucHVzaChcInZpcy13ZWVrXCIrci5mb3JtYXQoXCJ3XCIpKSxoLnB1c2goaShyKSksaC5wdXNoKHQoci53ZWVrKCkpKTticmVhaztjYXNlXCJtb250aFwiOmgucHVzaChcInZpcy1cIityLmZvcm1hdChcIk1NTU1cIikudG9Mb3dlckNhc2UoKSksaC5wdXNoKG8ocikpLGgucHVzaCh0KHIubW9udGgoKSkpO2JyZWFrO2Nhc2VcInllYXJcIjpoLnB1c2goXCJ2aXMteWVhclwiK3IueWVhcigpKSxoLnB1c2goZnVuY3Rpb24odCl7cmV0dXJuIHQuaXNTYW1lKG5ldyBEYXRlLFwieWVhclwiKT9cIiB2aXMtY3VycmVudC15ZWFyXCI6XCJcIn0ocikpLGgucHVzaCh0KHIueWVhcigpKSl9cmV0dXJuIGguZmlsdGVyKFN0cmluZykuam9pbihcIiBcIil9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUpe3RoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3J0bDohMSxzaG93Q3VycmVudFRpbWU6ITAsbW9tZW50OnIsbG9jYWxlczphLGxvY2FsZTpcImVuXCJ9LHRoaXMub3B0aW9ucz1uLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLm9mZnNldD0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDIpLHM9aSgxNikscj1pKDkpLGE9aSg5OCk7by5wcm90b3R5cGU9bmV3IHMsby5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9XCJ2aXMtY3VycmVudC10aW1lXCIsdC5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdC5zdHlsZS50b3A9XCIwcHhcIix0LnN0eWxlLmhlaWdodD1cIjEwMCVcIix0aGlzLmJhcj10fSxvLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLnNob3dDdXJyZW50VGltZT0hMSx0aGlzLnJlZHJhdygpLHRoaXMuYm9keT1udWxsfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3QmJm4uc2VsZWN0aXZlRXh0ZW5kKFtcInJ0bFwiLFwic2hvd0N1cnJlbnRUaW1lXCIsXCJtb21lbnRcIixcImxvY2FsZVwiLFwibG9jYWxlc1wiXSx0aGlzLm9wdGlvbnMsdCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHRoaXMub3B0aW9ucy5zaG93Q3VycmVudFRpbWUpe3ZhciB0PXRoaXMuYm9keS5kb20uYmFja2dyb3VuZFZlcnRpY2FsO3RoaXMuYmFyLnBhcmVudE5vZGUhPXQmJih0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0LmFwcGVuZENoaWxkKHRoaXMuYmFyKSx0aGlzLnN0YXJ0KCkpO3ZhciBlPXR
21167oaXMub3B0aW9ucy5tb21lbnQoKG5ldyBEYXRlKS52YWx1ZU9mKCkrdGhpcy5vZmZzZXQpLGk9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4oZSksbz10aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXTtvfHwodGhpcy53YXJuZWR8fChjb25zb2xlLmxvZyhcIldBUk5JTkc6IG9wdGlvbnMubG9jYWxlc1snXCIrdGhpcy5vcHRpb25zLmxvY2FsZStcIiddIG5vdCBmb3VuZC4gU2VlIGh0dHA6Ly92aXNqcy5vcmcvZG9jcy90aW1lbGluZS8jTG9jYWxpemF0aW9uXCIpLHRoaXMud2FybmVkPSEwKSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzLmVuKTt2YXIgbj1vLmN1cnJlbnQrXCIgXCIrby50aW1lK1wiOiBcIitlLmZvcm1hdChcImRkZGQsIE1NTU0gRG8gWVlZWSwgSDptbTpzc1wiKTtuPW4uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrbi5zdWJzdHJpbmcoMSksdGhpcy5vcHRpb25zLnJ0bD90aGlzLmJhci5zdHlsZS5yaWdodD1pK1wicHhcIjp0aGlzLmJhci5zdHlsZS5sZWZ0PWkrXCJweFwiLHRoaXMuYmFyLnRpdGxlPW59ZWxzZSB0aGlzLmJhci5wYXJlbnROb2RlJiZ0aGlzLmJhci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuYmFyKSx0aGlzLnN0b3AoKTtyZXR1cm4hMX0sby5wcm90b3R5cGUuc3RhcnQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ZS5zdG9wKCk7dmFyIGk9ZS5ib2R5LnJhbmdlLmNvbnZlcnNpb24oZS5ib2R5LmRvbVByb3BzLmNlbnRlci53aWR0aCkuc2NhbGUsbz0xL2kvMTA7bzwzMCYmKG89MzApLG8+MWUzJiYobz0xZTMpLGUucmVkcmF3KCksZS5ib2R5LmVtaXR0ZXIuZW1pdChcImN1cnJlbnRUaW1lVGlja1wiKSxlLmN1cnJlbnRUaW1lVGltZXI9c2V0VGltZW91dCh0LG8pfXZhciBlPXRoaXM7dCgpfSxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5jdXJyZW50VGltZVRpbWVyJiYoY2xlYXJUaW1lb3V0KHRoaXMuY3VycmVudFRpbWVUaW1lciksZGVsZXRlIHRoaXMuY3VycmVudFRpbWVUaW1lcil9LG8ucHJvdG90eXBlLnNldEN1cnJlbnRUaW1lPWZ1bmN0aW9uKHQpe3ZhciBlPW4uY29udmVydCh0LFwiRGF0ZVwiKS52YWx1ZU9mKCksaT0obmV3IERhdGUpLnZhbHVlT2YoKTt0aGlzLm9mZnNldD1lLWksdGhpcy5yZWRyYXcoKX0sby5wcm90b3R5cGUuZ2V0Q3VycmVudFRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IERhdGUoKG5ldyBEYXRlKS52YWx1ZU9mKCkrdGhpcy5vZmZzZXQpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMuZ3JvdXBJZD10LHRoaXMuc3ViZ3JvdXBzPXt9LHRoaXMuc3ViZ3JvdXBTdGFjaz17fSx0aGlzLnN1Ymdyb3VwU3RhY2tBbGw9ITEsdGhpcy5kb0lubmVyU3RhY2s9ITEsdGhpcy5zdWJncm91cEluZGV4PTAsdGhpcy5zdWJncm91cE9yZGVyZXI9ZSYmZS5zdWJncm91cE9yZGVyLHRoaXMuaXRlbVNldD1pLHRoaXMuaXNWaXNpYmxlPW51bGwsdGhpcy5zdGFja0RpcnR5PSEwLGUmJmUubmVzdGVkR3JvdXBzJiYodGhpcy5uZXN0ZWRHcm91cHM9ZS5uZXN0ZWRHcm91cHMsMD09ZS5zaG93TmVzdGVkP3RoaXMuc2hvd05lc3RlZD0hMTp0aGlzLnNob3dOZXN0ZWQ9ITApLGUmJmUuc3ViZ3JvdXBTdGFjaylpZihcImJvb2xlYW5cIj09dHlwZW9mIGUuc3ViZ3JvdXBTdGFjayl0aGlzLmRvSW5uZXJTdGFjaz1lLnN1Ymdyb3VwU3RhY2ssdGhpcy5zdWJncm91cFN0YWNrQWxsPWUuc3ViZ3JvdXBTdGFjaztlbHNlIGZvcih2YXIgbyBpbiBlLnN1Ymdyb3VwU3RhY2spdGhpcy5zdWJncm91cFN0YWNrW29dPWUuc3ViZ3JvdXBTdGFja1tvXSx0aGlzLmRvSW5uZXJTdGFjaz10aGlzLmRvSW5uZXJTdGFja3x8ZS5zdWJncm91cFN0YWNrW29dO3RoaXMubmVzdGVkSW5Hcm91cD1udWxsLHRoaXMuZG9tPXt9LHRoaXMucHJvcHM9e2xhYmVsOnt3aWR0aDowLGhlaWdodDowfX0sdGhpcy5jbGFzc05hbWU9bnVsbCx0aGlzLml0ZW1zPXt9LHRoaXMudmlzaWJsZUl0ZW1zPVtdLHRoaXMuaXRlbXNJblJhbmdlPVtdLHRoaXMub3JkZXJlZEl0ZW1zPXtieVN0YXJ0OltdLGJ5RW5kOltdfSx0aGlzLmNoZWNrUmFuZ2VkSXRlbXM9ITE7dmFyIG49dGhpczt0aGlzLml0ZW1TZXQuYm9keS5lbWl0dGVyLm9uKFwiY2hlY2tSYW5nZWRJdGVtc1wiLGZ1bmN0aW9uKCl7bi5jaGVja1JhbmdlZEl0ZW1zPSEwfSksdGhpcy5fY3JlYXRlKCksdGhpcy5zZXREYXRhKGUpfXZhciBuPWkoOCkscz1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19KG4pLHI9aSgyKSxhPWkoMTAwKTtvLnByb3RvdHlwZS5fY3JlYXRlPWZ1bmN0aW9uKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cEVkaXRhYmxlLm9yZGVyP3QuY2xhc3NOYW1lPVwidmlzLWxhYmVsIGRyYWdnYWJsZVwiOnQuY2xhc3NOYW1lPVwidmlzLWxhYmVsXCIsdGhpcy5kb20ubGFiZWw9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2UuY2xhc3NOYW1lPVwidmlzLWlubmVyXCIsdC5hcHBlbmRDaGlsZChlKSx0aGlzLmRvbS5pbm5lcj1lO3ZhciBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7aS5jbGFzc05hbWU9XCJ2aXMtZ3JvdXBcIixpW1widGltZWxpbmUtZ3JvdXBcIl09dGhpcyx0aGlzLmRvbS5mb3JlZ3JvdW5kPWksdGhpcy5kb20uYmFja2dyb3VuZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmJhY2tncm91bmQuY2xhc3NOYW1lPVwidmlzLWdyb3VwXCIsdGhpcy5kb20uYXhpcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmF4aXMuY2xhc3NOYW1lPVwidmlzLWdyb3VwXCIsdGhpcy5kb20ubWFya2VyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ubWFya2VyLnN0eWxlLnZpc2liaWxpdHk9XCJoaWRkZW5cIix0aGlzLmRvbS5tYXJrZXIuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHRoaXMuZG9tLm1hcmtlci5pbm5lckhUTUw9XCJcIix0aGlzLmRvbS5iYWNrZ3JvdW5kLmFwcGVuZENoaWxkKHRoaXMuZG9tLm1hcmtlcil9LG8ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZih0aGlzLml0ZW1TZXQub3B0aW9ucyYmdGhpcy5pdGVtU2V0Lm9wdGlvbnMuZ3JvdXBUZW1wbGF0ZT8oaT10aGlzLml0ZW1TZXQub3B0aW9ucy5ncm91cFRlbXBsYXRlLmJpbmQodGhpcyksZT1pKHQsdGhpcy5kb20uaW5uZXIpKTplPXQmJnQuY29udGVudCxlIGluc3RhbmNlb2YgRWxlbWVudCl7Zm9yKHRoaXMuZG9tLmlubmVyLmFwcGVuZENoaWxkKGUpO3RoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQ7KXRoaXMuZG9tLmlubmVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQpO3RoaXMuZG9tLmlubmVyLmFwcGVuZENoaWxkKGUpfWVsc2UgZSBpbnN0YW5jZW9mIE9iamVjdD9pKHQsdGhpcy5kb20uaW5uZXIpOnRoaXMuZG9tLmlubmVyLmlubmVySFRNTD12b2lkIDAhPT1lJiZudWxsIT09ZT9lOnRoaXMuZ3JvdXBJZHx8XCJcIjtpZih0aGlzLmRvbS5sYWJlbC50aXRsZT10JiZ0LnRpdGxlfHxcIlwiLHRoaXMuZG9tLmlubmVyLmZpcnN0Q2hpbGQ/ci5yZW1vdmVDbGFzc05hbWUo
21167dGhpcy5kb20uaW5uZXIsXCJ2aXMtaGlkZGVuXCIpOnIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmlubmVyLFwidmlzLWhpZGRlblwiKSx0JiZ0Lm5lc3RlZEdyb3Vwcyl7dGhpcy5uZXN0ZWRHcm91cHMmJnRoaXMubmVzdGVkR3JvdXBzPT10Lm5lc3RlZEdyb3Vwc3x8KHRoaXMubmVzdGVkR3JvdXBzPXQubmVzdGVkR3JvdXBzKSx2b2lkIDA9PT10LnNob3dOZXN0ZWQmJnZvaWQgMCE9PXRoaXMuc2hvd05lc3RlZHx8KDA9PXQuc2hvd05lc3RlZD90aGlzLnNob3dOZXN0ZWQ9ITE6dGhpcy5zaG93TmVzdGVkPSEwKSxyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxcInZpcy1uZXN0aW5nLWdyb3VwXCIpO3ZhciBvPXRoaXMuaXRlbVNldC5vcHRpb25zLnJ0bD9cImNvbGxhcHNlZC1ydGxcIjpcImNvbGxhcHNlZFwiO3RoaXMuc2hvd05lc3RlZD8oci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbyksci5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsXCJleHBhbmRlZFwiKSk6KHIucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLFwiZXhwYW5kZWRcIiksci5hZGRDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbykpfWVsc2UgdGhpcy5uZXN0ZWRHcm91cHMmJih0aGlzLm5lc3RlZEdyb3Vwcz1udWxsLG89dGhpcy5pdGVtU2V0Lm9wdGlvbnMucnRsP1wiY29sbGFwc2VkLXJ0bFwiOlwiY29sbGFwc2VkXCIsci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsbyksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20ubGFiZWwsXCJleHBhbmRlZFwiKSxyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxcInZpcy1uZXN0aW5nLWdyb3VwXCIpKTt0JiZ0Lm5lc3RlZEluR3JvdXAmJihyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCxcInZpcy1uZXN0ZWQtZ3JvdXBcIiksdGhpcy5pdGVtU2V0Lm9wdGlvbnMmJnRoaXMuaXRlbVNldC5vcHRpb25zLnJ0bD90aGlzLmRvbS5pbm5lci5zdHlsZS5wYWRkaW5nUmlnaHQ9XCIzMHB4XCI6dGhpcy5kb20uaW5uZXIuc3R5bGUucGFkZGluZ0xlZnQ9XCIzMHB4XCIpO3ZhciBuPXQmJnQuY2xhc3NOYW1lfHxudWxsO24hPXRoaXMuY2xhc3NOYW1lJiYodGhpcy5jbGFzc05hbWUmJihyLnJlbW92ZUNsYXNzTmFtZSh0aGlzLmRvbS5sYWJlbCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uZm9yZWdyb3VuZCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCx0aGlzLmNsYXNzTmFtZSksci5yZW1vdmVDbGFzc05hbWUodGhpcy5kb20uYXhpcyx0aGlzLmNsYXNzTmFtZSkpLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmxhYmVsLG4pLHIuYWRkQ2xhc3NOYW1lKHRoaXMuZG9tLmZvcmVncm91bmQsbiksci5hZGRDbGFzc05hbWUodGhpcy5kb20uYmFja2dyb3VuZCxuKSxyLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5heGlzLG4pLHRoaXMuY2xhc3NOYW1lPW4pLHRoaXMuc3R5bGUmJihyLnJlbW92ZUNzc1RleHQodGhpcy5kb20ubGFiZWwsdGhpcy5zdHlsZSksdGhpcy5zdHlsZT1udWxsKSx0JiZ0LnN0eWxlJiYoci5hZGRDc3NUZXh0KHRoaXMuZG9tLmxhYmVsLHQuc3R5bGUpLHRoaXMuc3R5bGU9dC5zdHlsZSl9LG8ucHJvdG90eXBlLmdldExhYmVsV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9wcy5sYWJlbC53aWR0aH0sby5wcm90b3R5cGUuX2RpZE1hcmtlckhlaWdodENoYW5nZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tLm1hcmtlci5jbGllbnRIZWlnaHQ7aWYodCE9dGhpcy5sYXN0TWFya2VySGVpZ2h0KXt0aGlzLmxhc3RNYXJrZXJIZWlnaHQ9dDt2YXIgZT17fSxpPTA7ci5mb3JFYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24odCxvKXtpZih0LmRpcnR5PSEwLHQuZGlzcGxheWVkKXtlW29dPXQucmVkcmF3KCEwKSxpPWVbb10ubGVuZ3RofX0pO2lmKGk+MClmb3IodmFyIG89MDtvPGk7bysrKXIuZm9yRWFjaChlLGZ1bmN0aW9uKHQpe3Rbb10oKX0pO3JldHVybiEwfX0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb20uZm9yZWdyb3VuZC5vZmZzZXRUb3AsZT10aGlzLmRvbS5mb3JlZ3JvdW5kLm9mZnNldExlZnQsaT10aGlzLmRvbS5mb3JlZ3JvdW5kLm9mZnNldFdpZHRoO3RoaXMudG9wPXQsdGhpcy5yaWdodD1lLHRoaXMud2lkdGg9aX0sby5wcm90b3R5cGUuX3JlZHJhd0l0ZW1zPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKHR8fHRoaXMuc3RhY2tEaXJ0eXx8dGhpcy5pc1Zpc2libGUmJiFlKXt2YXIgbj17fSxzPW51bGw7aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5pdGVtU2V0Lm9wdGlvbnMub3JkZXIpe3ZhciBoPXRoaXMsZD17fSxsPTA7aWYoci5mb3JFYWNoKHRoaXMuaXRlbXMsZnVuY3Rpb24odCxlKXt0LmRpc3BsYXllZHx8KGRbZV09dC5yZWRyYXcoITApLGw9ZFtlXS5sZW5ndGgsaC52aXNpYmxlSXRlbXMucHVzaCh0KSl9KSxsPjApZm9yKHZhciB1PTA7dTxsO3UrKylyLmZvckVhY2goZCxmdW5jdGlvbih0KXt0W3VdKCl9KTtpZihyLmZvckVhY2godGhpcy5pdGVtcyxmdW5jdGlvbih0KXt0LnJlcG9zaXRpb25YKCExKX0pLHRoaXMuZG9Jbm5lclN0YWNrJiZ0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFja1N1Ymdyb3Vwcyl7Zm9yKHMgaW4gdGhpcy5zdWJncm91cHMpbltzXT10aGlzLnN1Ymdyb3Vwc1tzXS5pdGVtcy5zbGljZSgpLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gaC5pdGVtU2V0Lm9wdGlvbnMub3JkZXIodC5kYXRhLGUuZGF0YSl9KTthLnN0YWNrU3ViZ3JvdXBzV2l0aElubmVyU3RhY2sobixpLHRoaXMuc3ViZ3JvdXBzKX1lbHNle3ZhciBjPXRoaXMub3JkZXJlZEl0ZW1zLmJ5U3RhcnQuc2xpY2UoKS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGguaXRlbVNldC5vcHRpb25zLm9yZGVyKHQuZGF0YSxlLmRhdGEpfSk7YS5zdGFjayhjLGksITApfXRoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyxvKX1lbHNlIGlmKHRoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyxvKSx0aGlzLml0ZW1TZXQub3B0aW9ucy5zdGFjaylpZih0aGlzLmRvSW5uZXJTdGFjayYmdGhpcy5pdGVtU2V0Lm9wdGlvbnMuc3RhY2tTdWJncm91cHMpe2ZvcihzIGluIHRoaXMuc3ViZ3JvdXBzKW5bc109dGhpcy5zdWJncm91cHNbc10uaXRlbXM7YS5zdGFja1N1Ymdyb3Vwc1dpdGhJbm5lclN0YWNrKG4saSx0aGlzLnN1Ymdyb3Vwcyl9ZWxzZSBhLnN0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLGksITApO2Vsc2UgYS5ub3N0YWNrKHRoaXMudmlzaWJsZUl0ZW1zLGksdGhpcy5zdWJncm91cHMsdGhpcy5pdGVtU2V0Lm9wdGlvbnMuc3RhY2tTdWJncm91cHMpO3RoaXMuc3RhY2tEaXJ0eT0hMX19LG8ucHJvdG90eXBlLl9kaWRSZXNpemU9ZnVuY3Rpb24odCxlKXt0PXIudXBkYXRlUHJv
21167cGVydHkodGhpcyxcImhlaWdodFwiLGUpfHx0O3ZhciBpPXRoaXMuZG9tLmlubmVyLmNsaWVudFdpZHRoLG89dGhpcy5kb20uaW5uZXIuY2xpZW50SGVpZ2h0O3JldHVybiB0PXIudXBkYXRlUHJvcGVydHkodGhpcy5wcm9wcy5sYWJlbCxcIndpZHRoXCIsaSl8fHQsdD1yLnVwZGF0ZVByb3BlcnR5KHRoaXMucHJvcHMubGFiZWwsXCJoZWlnaHRcIixvKXx8dH0sby5wcm90b3R5cGUuX2FwcGx5R3JvdXBIZWlnaHQ9ZnVuY3Rpb24odCl7dGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9dCtcInB4XCIsdGhpcy5kb20uZm9yZWdyb3VuZC5zdHlsZS5oZWlnaHQ9dCtcInB4XCIsdGhpcy5kb20ubGFiZWwuc3R5bGUuaGVpZ2h0PXQrXCJweFwifSxvLnByb3RvdHlwZS5fdXBkYXRlSXRlbXNWZXJ0aWNhbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wLGk9dGhpcy52aXNpYmxlSXRlbXMubGVuZ3RoO2U8aTtlKyspe3ZhciBvPXRoaXMudmlzaWJsZUl0ZW1zW2VdO28ucmVwb3NpdGlvblkodCksdGhpcy5pc1Zpc2libGV8fFwiX19iYWNrZ3JvdW5kX19cIj09dGhpcy5ncm91cElkfHxvLmRpc3BsYXllZCYmby5oaWRlKCl9fSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG4scz0hMSxyPXRoaXMuaXNWaXNpYmxlLGE9W2Z1bmN0aW9uKCl7aT10aGlzLl9kaWRNYXJrZXJIZWlnaHRDaGFuZ2UuYmluZCh0aGlzKX0uYmluZCh0aGlzKSx0aGlzLl91cGRhdGVTdWJHcm91cEhlaWdodHMuYmluZCh0aGlzLGUpLHRoaXMuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmlzVmlzaWJsZT10aGlzLl9pc0dyb3VwVmlzaWJsZS5iaW5kKHRoaXMpKHQsZSl9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLl9yZWRyYXdJdGVtcy5iaW5kKHRoaXMpKGkscixlLHQpfS5iaW5kKHRoaXMpLHRoaXMuX3VwZGF0ZVN1Ymdyb3Vwc1NpemVzLmJpbmQodGhpcyksZnVuY3Rpb24oKXtuPXRoaXMuX2NhbGN1bGF0ZUhlaWdodC5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX2NhbGN1bGF0ZUdyb3VwU2l6ZUFuZFBvc2l0aW9uLmJpbmQodGhpcyksZnVuY3Rpb24oKXtzPXRoaXMuX2RpZFJlc2l6ZS5iaW5kKHRoaXMpKHMsbil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLl9hcHBseUdyb3VwSGVpZ2h0LmJpbmQodGhpcykobil9LmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVJdGVtc1ZlcnRpY2FsUG9zaXRpb24uYmluZCh0aGlzKShlKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3JldHVybiF0aGlzLmlzVmlzaWJsZSYmdGhpcy5oZWlnaHQmJihzPSExKSxzfV07aWYobylyZXR1cm4gYTt2YXIgaDtyZXR1cm4gYS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2g9dCgpfSksaH0sby5wcm90b3R5cGUuX3VwZGF0ZVN1Ykdyb3VwSGVpZ2h0cz1mdW5jdGlvbih0KXtpZigoMCxzLmRlZmF1bHQpKHRoaXMuc3ViZ3JvdXBzKS5sZW5ndGg+MCl7dmFyIGU9dGhpczt0aGlzLnJlc2V0U3ViZ3JvdXBzKCksci5mb3JFYWNoKHRoaXMudmlzaWJsZUl0ZW1zLGZ1bmN0aW9uKGkpe3ZvaWQgMCE9PWkuZGF0YS5zdWJncm91cCYmKGUuc3ViZ3JvdXBzW2kuZGF0YS5zdWJncm91cF0uaGVpZ2h0PU1hdGgubWF4KGUuc3ViZ3JvdXBzW2kuZGF0YS5zdWJncm91cF0uaGVpZ2h0LGkuaGVpZ2h0K3QuaXRlbS52ZXJ0aWNhbCksZS5zdWJncm91cHNbaS5kYXRhLnN1Ymdyb3VwXS52aXNpYmxlPSEwKX0pfX0sby5wcm90b3R5cGUuX2lzR3JvdXBWaXNpYmxlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudG9wPD10LmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodC10LmJvZHkuZG9tUHJvcHMuc2Nyb2xsVG9wK2UuYXhpcyYmdGhpcy50b3ArdGhpcy5oZWlnaHQrZS5heGlzPj0tdC5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcH0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUhlaWdodD1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMudmlzaWJsZUl0ZW1zO2lmKGkubGVuZ3RoPjApe3ZhciBvPWlbMF0udG9wLG49aVswXS50b3AraVswXS5oZWlnaHQ7aWYoci5mb3JFYWNoKGksZnVuY3Rpb24odCl7bz1NYXRoLm1pbihvLHQudG9wKSxuPU1hdGgubWF4KG4sdC50b3ArdC5oZWlnaHQpfSksbz50LmF4aXMpe3ZhciBzPW8tdC5heGlzO24tPXMsci5mb3JFYWNoKGksZnVuY3Rpb24odCl7dC50b3AtPXN9KX1lPW4rdC5pdGVtLnZlcnRpY2FsLzJ9ZWxzZSBlPTA7cmV0dXJuIGU9TWF0aC5tYXgoZSx0aGlzLnByb3BzLmxhYmVsLmhlaWdodCl9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRvbS5sYWJlbC5wYXJlbnROb2RlfHx0aGlzLml0ZW1TZXQuZG9tLmxhYmVsU2V0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsKSx0aGlzLmRvbS5mb3JlZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uZm9yZWdyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mb3JlZ3JvdW5kKSx0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKSx0aGlzLmRvbS5heGlzLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYXhpcy5hcHBlbmRDaGlsZCh0aGlzLmRvbS5heGlzKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZG9tLmxhYmVsO3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpO3ZhciBlPXRoaXMuZG9tLmZvcmVncm91bmQ7ZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSk7dmFyIGk9dGhpcy5kb20uYmFja2dyb3VuZDtpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKTt2YXIgbz10aGlzLmRvbS5heGlzO28ucGFyZW50Tm9kZSYmby5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfSxvLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtc1t0LmlkXT10LHQuc2V0UGFyZW50KH
21167RoaXMpLHRoaXMuc3RhY2tEaXJ0eT0hMCx2b2lkIDAhPT10LmRhdGEuc3ViZ3JvdXAmJih0aGlzLl9hZGRUb1N1Ymdyb3VwKHQpLHRoaXMub3JkZXJTdWJncm91cHMoKSksLTE9PXRoaXMudmlzaWJsZUl0ZW1zLmluZGV4T2YodCkpe3ZhciBlPXRoaXMuaXRlbVNldC5ib2R5LnJhbmdlO3RoaXMuX2NoZWNrSWZWaXNpYmxlKHQsdGhpcy52aXNpYmxlSXRlbXMsZSl9fSxvLnByb3RvdHlwZS5fYWRkVG9TdWJncm91cD1mdW5jdGlvbih0LGUpe2U9ZXx8dC5kYXRhLnN1Ymdyb3VwLHZvaWQgMCE9ZSYmdm9pZCAwPT09dGhpcy5zdWJncm91cHNbZV0mJih0aGlzLnN1Ymdyb3Vwc1tlXT17aGVpZ2h0OjAsdG9wOjAsc3RhcnQ6dC5kYXRhLnN0YXJ0LGVuZDp0LmRhdGEuZW5kfHx0LmRhdGEuc3RhcnQsdmlzaWJsZTohMSxpbmRleDp0aGlzLnN1Ymdyb3VwSW5kZXgsaXRlbXM6W10sc3RhY2s6dGhpcy5zdWJncm91cFN0YWNrQWxsfHx0aGlzLnN1Ymdyb3VwU3RhY2tbZV18fCExfSx0aGlzLnN1Ymdyb3VwSW5kZXgrKyksbmV3IERhdGUodC5kYXRhLnN0YXJ0KTxuZXcgRGF0ZSh0aGlzLnN1Ymdyb3Vwc1tlXS5zdGFydCkmJih0aGlzLnN1Ymdyb3Vwc1tlXS5zdGFydD10LmRhdGEuc3RhcnQpO3ZhciBpPXQuZGF0YS5lbmR8fHQuZGF0YS5zdGFydDtuZXcgRGF0ZShpKT5uZXcgRGF0ZSh0aGlzLnN1Ymdyb3Vwc1tlXS5lbmQpJiYodGhpcy5zdWJncm91cHNbZV0uZW5kPWkpLHRoaXMuc3ViZ3JvdXBzW2VdLml0ZW1zLnB1c2godCl9LG8ucHJvdG90eXBlLl91cGRhdGVTdWJncm91cHNTaXplcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7aWYodC5zdWJncm91cHMpZm9yKHZhciBlIGluIHQuc3ViZ3JvdXBzKXt2YXIgaT10LnN1Ymdyb3Vwc1tlXS5pdGVtc1swXS5kYXRhLmVuZHx8dC5zdWJncm91cHNbZV0uaXRlbXNbMF0uZGF0YS5zdGFydCxvPXQuc3ViZ3JvdXBzW2VdLml0ZW1zWzBdLmRhdGEuc3RhcnQsbj1pLTE7dC5zdWJncm91cHNbZV0uaXRlbXMuZm9yRWFjaChmdW5jdGlvbih0KXtuZXcgRGF0ZSh0LmRhdGEuc3RhcnQpPG5ldyBEYXRlKG8pJiYobz10LmRhdGEuc3RhcnQpO3ZhciBlPXQuZGF0YS5lbmR8fHQuZGF0YS5zdGFydDtuZXcgRGF0ZShlKT5uZXcgRGF0ZShuKSYmKG49ZSl9KSx0LnN1Ymdyb3Vwc1tlXS5zdGFydD1vLHQuc3ViZ3JvdXBzW2VdLmVuZD1uZXcgRGF0ZShuLTEpfX0sby5wcm90b3R5cGUub3JkZXJTdWJncm91cHM9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLnN1Ymdyb3VwT3JkZXJlcil7dmFyIHQsZT1bXTtpZihcInN0cmluZ1wiPT10eXBlb2YgdGhpcy5zdWJncm91cE9yZGVyZXIpe2Zvcih0IGluIHRoaXMuc3ViZ3JvdXBzKWUucHVzaCh7c3ViZ3JvdXA6dCxzb3J0RmllbGQ6dGhpcy5zdWJncm91cHNbdF0uaXRlbXNbMF0uZGF0YVt0aGlzLnN1Ymdyb3VwT3JkZXJlcl19KTtlLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5zb3J0RmllbGQtZS5zb3J0RmllbGR9KX1lbHNlIGlmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMuc3ViZ3JvdXBPcmRlcmVyKXtmb3IodCBpbiB0aGlzLnN1Ymdyb3VwcyllLnB1c2godGhpcy5zdWJncm91cHNbdF0uaXRlbXNbMF0uZGF0YSk7ZS5zb3J0KHRoaXMuc3ViZ3JvdXBPcmRlcmVyKX1pZihlLmxlbmd0aD4wKWZvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKXRoaXMuc3ViZ3JvdXBzW2VbaV0uc3ViZ3JvdXBdLmluZGV4PWl9fSxvLnByb3RvdHlwZS5yZXNldFN1Ymdyb3Vwcz1mdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnN1Ymdyb3Vwcyl0aGlzLnN1Ymdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KSYmKHRoaXMuc3ViZ3JvdXBzW3RdLnZpc2libGU9ITEsdGhpcy5zdWJncm91cHNbdF0uaGVpZ2h0PTApfSxvLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMuaXRlbXNbdC5pZF0sdC5zZXRQYXJlbnQobnVsbCksdGhpcy5zdGFja0RpcnR5PSEwO3ZhciBlPXRoaXMudmlzaWJsZUl0ZW1zLmluZGV4T2YodCk7LTEhPWUmJnRoaXMudmlzaWJsZUl0ZW1zLnNwbGljZShlLDEpLHZvaWQgMCE9PXQuZGF0YS5zdWJncm91cCYmKHRoaXMuX3JlbW92ZUZyb21TdWJncm91cCh0KSx0aGlzLm9yZGVyU3ViZ3JvdXBzKCkpfSxvLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVN1Ymdyb3VwPWZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT0oZT1lfHx0LmRhdGEuc3ViZ3JvdXApKXt2YXIgaT10aGlzLnN1Ymdyb3Vwc1tlXTtpZihpKXt2YXIgbz1pLml0ZW1zLmluZGV4T2YodCk7bz49MCYmKGkuaXRlbXMuc3BsaWNlKG8sMSksaS5pdGVtcy5sZW5ndGg/dGhpcy5fdXBkYXRlU3ViZ3JvdXBzU2l6ZXMoKTpkZWxldGUgdGhpcy5zdWJncm91cHNbZV0pfX19LG8ucHJvdG90eXBlLnJlbW92ZUZyb21EYXRhU2V0PWZ1bmN0aW9uKHQpe3RoaXMuaXRlbVNldC5yZW1vdmVJdGVtKHQuaWQpfSxvLnByb3RvdHlwZS5vcmRlcj1mdW5jdGlvbigpe2Zvcih2YXIgdD1yLnRvQXJyYXkodGhpcy5pdGVtcyksZT1bXSxpPVtdLG89MDtvPHQubGVuZ3RoO28rKyl2b2lkIDAhPT10W29dLmRhdGEuZW5kJiZpLnB1c2godFtvXSksZS5wdXNoKHRbb10pO3RoaXMub3JkZXJlZEl0ZW1zPXtieVN0YXJ0OmUsYnlFbmQ6aX0sYS5vcmRlckJ5U3RhcnQodGhpcy5vcmRlcmVkSXRlbXMuYnlTdGFydCksYS5vcmRlckJ5RW5kKHRoaXMub3JkZXJlZEl0ZW1zLmJ5RW5kKX0sby5wcm90b3R5cGUuX3VwZGF0ZUl0ZW1zSW5SYW5nZT1mdW5jdGlvbih0LGUsaSl7dmFyIG89W10sbj17fSxzPShpLmVuZC1pLnN0YXJ0KS80LGE9aS5zdGFydC1zLGg9aS5lbmQrcyxkPWZ1bmN0aW9uKHQpe3JldHVybiB0PGE/LTE6dDw9aD8wOjF9O2lmKGUubGVuZ3RoPjApZm9yKHZhciBsPTA7bDxlLmxlbmd0aDtsKyspdGhpcy5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlKGVbbF0sbyxuLGkpO3ZhciB1PXIuYmluYXJ5U2VhcmNoQ3VzdG9tKHQuYnlTdGFydCxkLFwiZGF0YVwiLFwic3RhcnRcIik7aWYodGhpcy5fdHJhY2VWaXNpYmxlKHUsdC5ieVN0YXJ0LG8sbixmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhLnN0YXJ0PGF8fHQuZGF0YS5zdGFydD5ofSksMT09dGhpcy5jaGVja1JhbmdlZEl0ZW1zKWZvcih0aGlzLmNoZWNrUmFuZ2VkSXRlbXM9ITEsbD0wO2w8dC5ieUVuZC5sZW5ndGg7bCsrKXRoaXMuX2NoZWNrSWZWaXNpYmxlV2l0aFJlZmVyZW5jZSh0LmJ5RW5kW2xdLG8sbixpKTtlbHNle3ZhciBjPXIuYmluYXJ5U2VhcmNoQ3VzdG9tKHQuYnlFbmQsZCxcImRhdGFcIixcImVuZFwiKTt0aGlzLl90cmFjZVZpc2libGUoYyx0LmJ5RW5kLG8sbixmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhLmVuZDxhfHx0LmRhdGEuZW5kPmh9KX12YXIgcD17fSxmPTA7Zm9yKGw9MDtsPG8ubGVuZ3RoO2wrKyl7dmFyIG09b1tsXTtpZighbS5kaXNwbGF5ZWQpe3BbbF09bS5yZWRyYXcoITApLGY9cFtsXS5sZW5ndGh9fWlmKGY+MClmb3IodmFyIHY9MDt2PGY7disrKXIuZm9yRWFjaChwLGZ1bmN0aW9uKHQpe3Rbdl0oKX0pO2ZvcihsPTA7bDxvLmxlbmd0aDtsKyspb1tsXS5yZXBvc2l0aW9uWCgpO3JldHVybiBvfSxvLnByb3RvdHlwZS5fdHJhY2VWaXNpYmxlPWZ1bmN0aW9uKHQsZSxpLG8sbil7aWYoLTEhPXQpe3ZhciBzLHI7Zm9yKHM9dDtzPj0wJiYocj1lW3NdLCFuKHIpKTtzLS0pdm9pZCAwPT09b1tyLmlkXSYmKG9bci5pZF09ITAsaS5wdXNoKHIpKTtmb3Iocz10KzE7czxlLmxlbmd0aCYmKHI9ZVtzXSwhbihyKSk7cysrKXZvaWQgMD09PW9bci5pZF0mJihvW3IuaWRdPSEwLGkucHVzaChyKSl9fSxvLnByb3RvdHlwZS5fY2hlY2tJZlZpc2libGU9ZnVuY3Rpb24odCxlLGkpe3QuaXNWaXNpYmxlKGkpPyh0LmRpc3BsYXllZHx8dC5zaG93KCksdC5yZXBvc2l0aW9uWCgpLGUucHVzaCh0KSk6dC5kaXNwbGF5ZWQmJnQuaGlkZSgpfSxvLnByb3RvdHlwZS5fY2hlY2tJZlZpc2libGVXaXRoUmVmZXJlbmNlPWZ1bmN0aW9uKHQsZSxpLG8pe3QuaXNWaXNpYmxlKG8pP3ZvaWQgMD09PWlbdC5pZF0mJihpW3QuaWRdPSEwLGUucHVzaCh0KSk6dC5kaXNwbGF5ZWQmJnQuaGlkZSgpfSxvLnByb3RvdHlwZS5jaGFuZ2VTdWJncm91cD1mdW5jdGlvbih0LGUsaSl7dGhpcy5fcmVtb3ZlRnJvbVN1Ymdyb3VwKHQsZSksdGhpcy5fYWRkVG9TdWJncm91cCh0LGkpLHRoaXMub3JkZXJTdWJncm91cHMoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXtyLmNhbGwodGhpcyx0LGUsaSksdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy50b3A9MCx0aGlzLmxlZnQ9MH12YXIgbj1pKDI5KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDY4KTtvLnByb3RvdHlwZT0oMCxzLmRlZmF1bHQpKHIucHJvdG90eXBlKSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCxlLGkpe3RoaXMudmlzaWJsZUl0ZW1zPXRoaXMuX3VwZGF0ZUl0ZW1zSW5SYW5nZSh0aGlzLm9yZGVyZWRJdGVtcyx0aGlzLnZpc2libGVJdGVtcyx0KSx0aGlzLndpZHRoP
21167XRoaXMuZG9tLmJhY2tncm91bmQub2Zmc2V0V2lkdGgsdGhpcy5kb20uYmFja2dyb3VuZC5zdHlsZS5oZWlnaHQ9XCIwXCI7Zm9yKHZhciBvPTAsbj10aGlzLnZpc2libGVJdGVtcy5sZW5ndGg7bzxuO28rKyl7dGhpcy52aXNpYmxlSXRlbXNbb10ucmVwb3NpdGlvblkoZSl9cmV0dXJuITF9LG8ucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oKXt0aGlzLmRvbS5iYWNrZ3JvdW5kLnBhcmVudE5vZGV8fHRoaXMuaXRlbVNldC5kb20uYmFja2dyb3VuZC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5iYWNrZ3JvdW5kKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpKXtpZih0aGlzLnByb3BzPXtjb250ZW50Ont3aWR0aDowfX0sdGhpcy5vdmVyZmxvdz0hMSx0aGlzLm9wdGlvbnM9aSx0KXtpZih2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBcInN0YXJ0XCIgbWlzc2luZyBpbiBpdGVtICcrdC5pZCk7aWYodm9pZCAwPT10LmVuZCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwiZW5kXCIgbWlzc2luZyBpbiBpdGVtICcrdC5pZCl9bi5jYWxsKHRoaXMsdCxlLGkpfXZhciBuPWkoMzgpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPVwidmlzLWl0ZW0gdmlzLXJhbmdlXCIsby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRhdGEuc3RhcnQ8dC5lbmQmJnRoaXMuZGF0YS5lbmQ+dC5zdGFydH0sby5wcm90b3R5cGUuX2NyZWF0ZURvbUVsZW1lbnQ9ZnVuY3Rpb24oKXt0aGlzLmRvbXx8KHRoaXMuZG9tPXt9LHRoaXMuZG9tLmJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uZnJhbWUuY2xhc3NOYW1lPVwidmlzLWl0ZW0tb3ZlcmZsb3dcIix0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLnZpc2libGVGcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLnZpc2libGVGcmFtZS5jbGFzc05hbWU9XCJ2aXMtaXRlbS12aXNpYmxlLWZyYW1lXCIsdGhpcy5kb20uYm94LmFwcGVuZENoaWxkKHRoaXMuZG9tLnZpc2libGVGcmFtZSksdGhpcy5kb20uY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lPVwidmlzLWl0ZW0tY29udGVudFwiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuZG9tLmJveFtcInRpbWVsaW5lLWl0ZW1cIl09dGhpcyx0aGlzLmRpcnR5PSEwKX0sby5wcm90b3R5cGUuX2FwcGVuZERvbUVsZW1lbnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWRcIik7aWYoIXRoaXMuZG9tLmJveC5wYXJlbnROb2RlKXt2YXIgdD10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudFwiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJveCl9dGhpcy5kaXNwbGF5ZWQ9ITB9LG8ucHJvdG90eXBlLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtpZih0aGlzLmRpcnR5KXt0aGlzLl91cGRhdGVDb250ZW50cyh0aGlzLmRvbS5jb250ZW50KSx0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5ib3gpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIHQ9dGhpcy5lZGl0YWJsZS51cGRhdGVUaW1lfHx0aGlzLmVkaXRhYmxlLnVwZGF0ZUdyb3VwLGU9KHRoaXMuZGF0YS5jbGFzc05hbWU/XCIgXCIrdGhpcy5kYXRhLmNsYXNzTmFtZTpcIlwiKSsodGhpcy5zZWxlY3RlZD9cIiB2aXMtc2VsZWN0ZWRcIjpcIlwiKSsodD9cIiB2aXMtZWRpdGFibGVcIjpcIiB2aXMtcmVhZG9ubHlcIik7dGhpcy5kb20uYm94LmNsYXNzTmFtZT10aGlzLmJhc2VDbGFzc05hbWUrZSx0aGlzLmRvbS5jb250ZW50LnN0eWxlLm1heFdpZHRoPVwibm9uZVwifX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm92ZXJmbG93PVwiaGlkZGVuXCIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbS5mcmFtZSkub3ZlcmZsb3cse2NvbnRlbnQ6e3dpZHRoOnRoaXMuZG9tLmNvbnRlbnQub2Zmc2V0V2lkdGh9LGJveDp7aGVpZ2h0OnRoaXMuZG9tLmJveC5vZmZzZXRIZWlnaHR9fX0sby5wcm90b3R5cGUuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbih0KXt0aGlzLnByb3BzLmNvbn
21167RlbnQud2lkdGg9dC5jb250ZW50LndpZHRoLHRoaXMuaGVpZ2h0PXQuYm94LmhlaWdodCx0aGlzLmRvbS5jb250ZW50LnN0eWxlLm1heFdpZHRoPVwiXCIsdGhpcy5kaXJ0eT0hMX0sby5wcm90b3R5cGUuX3JlcGFpbnREb21BZGRpdGlvbmFscz1mdW5jdGlvbigpe3RoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0aGlzLmRvbS5ib3gpLHRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odGhpcy5kb20uYm94KSx0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpLHRoaXMuX3JlcGFpbnREcmFnTGVmdCgpLHRoaXMuX3JlcGFpbnREcmFnUmlnaHQoKX0sby5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKHQpe3ZhciBlLGk9W3RoaXMuX2NyZWF0ZURvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl9hcHBlbmREb21FbGVtZW50LmJpbmQodGhpcyksdGhpcy5fdXBkYXRlRGlydHlEb21Db21wb25lbnRzLmJpbmQodGhpcyksZnVuY3Rpb24oKXt0aGlzLmRpcnR5JiYoZT10aGlzLl9nZXREb21Db21wb25lbnRzU2l6ZXMuYmluZCh0aGlzKSgpKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJnRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXTtpZih0KXJldHVybiBpO3ZhciBvO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7bz10KCl9KSxvfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtpZih0aGlzLmRpc3BsYXllZCl7dmFyIHQ9dGhpcy5kb20uYm94O3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHRoaXMuZGlzcGxheWVkPSExfX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXRoaXMucGFyZW50LndpZHRoLG49dGhpcy5jb252ZXJzaW9uLnRvU2NyZWVuKHRoaXMuZGF0YS5zdGFydCkscz10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLmVuZCkscj12b2lkIDA9PT10aGlzLmRhdGEuYWxpZ24/dGhpcy5vcHRpb25zLmFsaWduOnRoaXMuZGF0YS5hbGlnbjshMT09PXRoaXMuZGF0YS5saW1pdFNpemV8fHZvaWQgMCE9PXQmJiEwIT09dHx8KG48LW8mJihuPS1vKSxzPjIqbyYmKHM9MipvKSk7dmFyIGE9TWF0aC5tYXgocy1uKy41LDEpO3N3aXRjaCh0aGlzLm92ZXJmbG93Pyh0aGlzLm9wdGlvbnMucnRsP3RoaXMucmlnaHQ9bjp0aGlzLmxlZnQ9bix0aGlzLndpZHRoPWErdGhpcy5wcm9wcy5jb250ZW50LndpZHRoLGk9dGhpcy5wcm9wcy5jb250ZW50LndpZHRoKToodGhpcy5vcHRpb25zLnJ0bD90aGlzLnJpZ2h0PW46dGhpcy5sZWZ0PW4sdGhpcy53aWR0aD1hLGk9TWF0aC5taW4ocy1uLHRoaXMucHJvcHMuY29udGVudC53aWR0aCkpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrXCJweFwiOnRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0PXRoaXMubGVmdCtcInB4XCIsdGhpcy5kb20uYm94LnN0eWxlLndpZHRoPWErXCJweFwiLHIpe2Nhc2VcImxlZnRcIjp0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmNvbnRlbnQuc3R5bGUucmlnaHQ9XCIwXCI6dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0PVwiMFwiO2JyZWFrO2Nhc2VcInJpZ2h0XCI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KGEtaSwwKStcInB4XCI6dGhpcy5kb20uY29udGVudC5zdHlsZS5sZWZ0PU1hdGgubWF4KGEtaSwwKStcInB4XCI7YnJlYWs7Y2FzZVwiY2VudGVyXCI6dGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PU1hdGgubWF4KChhLWkpLzIsMCkrXCJweFwiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubGVmdD1NYXRoLm1heCgoYS1pKS8yLDApK1wicHhcIjticmVhaztkZWZhdWx0OmU9dGhpcy5vdmVyZmxvdz9zPjA/TWF0aC5tYXgoLW4sMCk6LWk6bjwwPy1uOjAsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLnJpZ2h0PWUrXCJweFwiOih0aGlzLmRvbS5jb250ZW50LnN0eWxlLmxlZnQ9ZStcInB4XCIsdGhpcy5kb20uY29udGVudC5zdHlsZS53aWR0aD1cImNhbGMoMTAwJSAtIFwiK2UrXCJweClcIil9fSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtLGU9dGhpcy5kb20uYm94O2Uuc3R5bGUudG9wPVwidG9wXCI9PXQ/dGhpcy50b3ArXCJweFwiOnRoaXMucGFyZW50LmhlaWdodC10aGlzLnRvcC10aGlzLmhlaWdodCtcInB4XCJ9LG8ucHJvdG90eXBlLl9yZXBhaW50RHJhZ0xlZnQ9ZnVuY3Rpb24oKXtpZigodGhpcy5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnTGVmdCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0LmNsYXNzTmFtZT1cInZpcy1kcmFnLWxlZnRcIix0LmRyYWdMZWZ0SXRlbT10aGlzLHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0KSx0aGlzLmRvbS5kcmFnTGVmdD10fWVsc2UgdGhpcy5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlfHwhdGhpcy5kb20uZHJhZ0xlZnR8fCh0aGlzLmRvbS5kcmFnTGVmdC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnTGVmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmRyYWdMZWZ0KSx0aGlzLmRvbS5kcmFnTGVmdD1udWxsKX0sby5wcm90b3R5cGUuX3JlcGFpbnREcmFnUmlnaHQ9ZnVuY3Rpb24oKXtpZigodGhpcy5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlKSYmdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZVRpbWUmJiF0aGlzLmRvbS5kcmFnUmlnaHQpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9XCJ2aXMtZHJhZy1yaWdodFwiLHQuZHJhZ1JpZ2h0SXRlbT10aGlzLHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0KSx0aGlzLmRvbS5kcmFnUmlnaHQ9dH1lbHNlI
21167HRoaXMuc2VsZWN0ZWR8fHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5yYW5nZXx8IXRoaXMuZG9tLmRyYWdSaWdodHx8KHRoaXMuZG9tLmRyYWdSaWdodC5wYXJlbnROb2RlJiZ0aGlzLmRvbS5kcmFnUmlnaHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmRvbS5kcmFnUmlnaHQpLHRoaXMuZG9tLmRyYWdSaWdodD1udWxsKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE5KSxzPW8obikscj1pKDYpLGE9byhyKSxoPWkoMCksZD1vKGgpLGw9aSgxKSx1PW8obCksYz1pKDIpLHA9aSgxNzkpLmRlZmF1bHQsZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXToxOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLnBhcmVudD1lLHRoaXMuY2hhbmdlZE9wdGlvbnM9W10sdGhpcy5jb250YWluZXI9aSx0aGlzLmFsbG93Q3JlYXRpb249ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5wb3B1cENvdW50ZXI9MCx0aGlzLmRlZmF1bHRPcHRpb25zPXtlbmFibGVkOiExLGZpbHRlcjohMCxjb250YWluZXI6dm9pZCAwLHNob3dCdXR0b246ITB9LGMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmNvbmZpZ3VyZU9wdGlvbnM9byx0aGlzLm1vZHVsZU9wdGlvbnM9e30sdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLnBvcHVwRGl2PXt9LHRoaXMucG9wdXBMaW1pdD01LHRoaXMucG9wdXBIaXN0b3J5PXt9LHRoaXMuY29sb3JQaWNrZXI9bmV3IHAobiksdGhpcy53cmFwcGVyPXZvaWQgMH1yZXR1cm4oMCx1LmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dGhpcy5wb3B1cEhpc3Rvcnk9e30sdGhpcy5fcmVtb3ZlUG9wdXAoKTt2YXIgZT0hMDtcInN0cmluZ1wiPT10eXBlb2YgdD90aGlzLm9wdGlvbnMuZmlsdGVyPXQ6dCBpbnN0YW5jZW9mIEFycmF5P3RoaXMub3B0aW9ucy5maWx0ZXI9dC5qb2luKCk6XCJvYmplY3RcIj09PSh2b2lkIDA9PT10P1widW5kZWZpbmVkXCI6KDAsYS5kZWZhdWx0KSh0KSk/KHZvaWQgMCE9PXQuY29udGFpbmVyJiYodGhpcy5vcHRpb25zLmNvbnRhaW5lcj10LmNvbnRhaW5lciksdm9pZCAwIT09dC5maWx0ZXImJih0aGlzLm9wdGlvbnMuZmlsdGVyPXQuZmlsdGVyKSx2b2lkIDAhPT10LnNob3dCdXR0b24mJih0aGlzLm9wdGlvbnMuc2hvd0J1dHRvbj10LnNob3dCdXR0b24pLHZvaWQgMCE9PXQuZW5hYmxlZCYmKGU9dC5lbmFibGVkKSk6XCJib29sZWFuXCI9PXR5cGVvZiB0Pyh0aGlzLm9wdGlvbnMuZmlsdGVyPSEwLGU9dCk6XCJmdW5jdGlvblwiPT10eXBlb2YgdCYmKHRoaXMub3B0aW9ucy5maWx0ZXI9dCxlPSEwKSwhMT09PXRoaXMub3B0aW9ucy5maWx0ZXImJihlPSExKSx0aGlzLm9wdGlvbnMuZW5hYmxlZD1lfXRoaXMuX2NsZWFuKCl9fSx7a2V5Olwic2V0TW9kdWxlT3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubW9kdWxlT3B0aW9ucz10LCEwPT09dGhpcy5vcHRpb25zLmVuYWJsZWQmJih0aGlzLl9jbGVhbigpLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5jb250YWluZXImJih0aGlzLmNvbnRhaW5lcj10aGlzLm9wdGlvbnMuY29udGFpbmVyKSx0aGlzLl9jcmVhdGUoKSl9fSx7a2V5OlwiX2NyZWF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jbGVhbigpLHRoaXMuY2hhbmdlZE9wdGlvbnM9W107dmFyIGU9dGhpcy5vcHRpb25zLmZpbHRlcixpPTAsbz0hMTtmb3IodmFyIG4gaW4gdGhpcy5jb25maWd1cmVPcHRpb25zKXRoaXMuY29uZmlndXJlT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuKSYmKHRoaXMuYWxsb3dDcmVhdGlvbj0hMSxvPSExLFwiZnVuY3Rpb25cIj09dHlwZW9mIGU/KG89ZShuLFtdKSxvPW98fHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dLCEwKSk6ITAhPT1lJiYtMT09PWUuaW5kZXhPZihuKXx8KG89ITApLCExIT09byYmKHRoaXMuYWxsb3dDcmVhdGlvbj0hMCxpPjAmJnRoaXMuX21ha2VJdGVtKFtdKSx0aGlzLl9tYWtlSGVhZGVyKG4pLHRoaXMuX2hhbmRsZU9iamVjdCh0aGlzLmNvbmZpZ3VyZU9wdGlvbnNbbl0sW25dKSksaSsrKTtpZighMD09PXRoaXMub3B0aW9ucy5zaG93QnV0dG9uKXt2YXIgcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3MuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b25cIixzLmlubmVySFRNTD1cImdlbmVyYXRlIG9wdGlvbnNcIixzLm9uY2xpY2s9ZnVuY3Rpb24oKXt0Ll9wcmludE9wdGlvbnMoKX0scy5vbm1vdXNlb3Zlcj1mdW5jdGlvbigpe3MuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1idXR0b24gaG92ZXJcIn0scy5vbm1vdXNlb3V0PWZ1bmN0aW9uKCl7cy5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWJ1dHRvblwifSx0aGlzLm9wdGlvbnNDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm9wdGlvbnNDb250YWluZXIuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1vcHRpb24tY29udGFpbmVyXCIsdGhpcy5kb21FbGVtZW50cy5wdXNoKHRoaXMub3B0aW9uc0NvbnRhaW5lciksdGhpcy5kb21FbGVtZW50cy5wdXNoKHMpfXRoaXMuX3B1c2goKX19LHtrZXk6XCJfcHVzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy53cmFwcGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy53cmFwcGVyLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uLXdyYXBwZXJcIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLndyYXBwZXIpO2Zvcih2YXIgdD0wO3Q8dGhpcy5kb21FbGVtZW50cy5sZW5ndGg7dCsrKXRoaXMud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLmRvbUVs
21167ZW1lbnRzW3RdKTt0aGlzLl9zaG93UG9wdXBJZk5lZWRlZCgpfX0se2tleTpcIl9jbGVhblwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLmRvbUVsZW1lbnRzLmxlbmd0aDt0KyspdGhpcy53cmFwcGVyLnJlbW92ZUNoaWxkKHRoaXMuZG9tRWxlbWVudHNbdF0pO3ZvaWQgMCE9PXRoaXMud3JhcHBlciYmKHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMud3JhcHBlciksdGhpcy53cmFwcGVyPXZvaWQgMCksdGhpcy5kb21FbGVtZW50cz1bXSx0aGlzLl9yZW1vdmVQb3B1cCgpfX0se2tleTpcIl9nZXRWYWx1ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLm1vZHVsZU9wdGlvbnMsaT0wO2k8dC5sZW5ndGg7aSsrKXtpZih2b2lkIDA9PT1lW3RbaV1dKXtlPXZvaWQgMDticmVha31lPWVbdFtpXV19cmV0dXJuIGV9fSx7a2V5OlwiX21ha2VJdGVtXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITA9PT10aGlzLmFsbG93Q3JlYXRpb24pe3ZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWl0ZW0gdmlzLWNvbmZpZy1zXCIrdC5sZW5ndGg7Zm9yKHZhciBpPWFyZ3VtZW50cy5sZW5ndGgsbz1BcnJheShpPjE/aS0xOjApLG49MTtuPGk7bisrKW9bbi0xXT1hcmd1bWVudHNbbl07cmV0dXJuIG8uZm9yRWFjaChmdW5jdGlvbih0KXtlLmFwcGVuZENoaWxkKHQpfSksdGhpcy5kb21FbGVtZW50cy5wdXNoKGUpLHRoaXMuZG9tRWxlbWVudHMubGVuZ3RofXJldHVybiAwfX0se2tleTpcIl9tYWtlSGVhZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtlLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctaGVhZGVyXCIsZS5pbm5lckhUTUw9dCx0aGlzLl9tYWtlSXRlbShbXSxlKX19LHtrZXk6XCJfbWFrZUxhYmVsXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gby5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWxhYmVsIHZpcy1jb25maWctc1wiK2UubGVuZ3RoLG8uaW5uZXJIVE1MPSEwPT09aT9cIjxpPjxiPlwiK3QrXCI6PC9iPjwvaT5cIjp0K1wiOlwiLG99fSx7a2V5OlwiX21ha2VEcm9wZG93blwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic2VsZWN0XCIpO28uY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1zZWxlY3RcIjt2YXIgbj0wO3ZvaWQgMCE9PWUmJi0xIT09dC5pbmRleE9mKGUpJiYobj10LmluZGV4T2YoZSkpO2Zvcih2YXIgcz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwib3B0aW9uXCIpO3IudmFsdWU9dFtzXSxzPT09biYmKHIuc2VsZWN0ZWQ9XCJzZWxlY3RlZFwiKSxyLmlubmVySFRNTD10W3NdLG8uYXBwZW5kQ2hpbGQocil9dmFyIGE9dGhpcztvLm9uY2hhbmdlPWZ1bmN0aW9uKCl7YS5fdXBkYXRlKHRoaXMudmFsdWUsaSl9O3ZhciBoPXRoaXMuX21ha2VMYWJlbChpW2kubGVuZ3RoLTFdLGkpO3RoaXMuX21ha2VJdGVtKGksaCxvKX19LHtrZXk6XCJfbWFrZVJhbmdlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXRbMF0sbj10WzFdLHM9dFsyXSxyPXRbM10sYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7YS5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXJhbmdlXCI7dHJ5e2EudHlwZT1cInJhbmdlXCIsYS5taW49bixhLm1heD1zfWNhdGNoKHQpe31hLnN0ZXA9cjt2YXIgaD1cIlwiLGQ9MDtpZih2b2lkIDAhPT1lKXtlPDAmJjEuMiplPG4/KGEubWluPU1hdGguY2VpbCgxLjIqZSksZD1hLm1pbixoPVwicmFuZ2UgaW5jcmVhc2VkXCIpOmUvMS4yPG4mJihhLm1pbj1NYXRoLmNlaWwoZS8xLjIpLGQ9YS5taW4saD1cInJhbmdlIGluY3JlYXNlZFwiKSwxLjIqZT5zJiYxIT09cyYmKGEubWF4PU1hdGguY2VpbCgxLjIqZSksZD1hLm1heCxoPVwicmFuZ2UgaW5jcmVhc2VkXCIpLGEudmFsdWU9ZX1lbHNlIGEudmFsdWU9bzt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7bC5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXJhbmdlaW5wdXRcIixsLnZhbHVlPWEudmFsdWU7dmFyIHU9dGhpczthLm9uY2hhbmdlPWZ1bmN0aW9uKCl7bC52YWx1ZT10aGlzLnZhbHVlLHUuX3VwZGF0ZShOdW1iZXIodGhpcy52YWx1ZSksaSl9LGEub25pbnB1dD1mdW5jdGlvbigpe2wudmFsdWU9dGhpcy52YWx1ZX07dmFyIGM9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSkscD10aGlzLl9tYWtlSXRlbShpLGMsYSxsKTtcIlwiIT09aCYmdGhpcy5wb3B1cEhpc3RvcnlbcF0hPT1kJiYodGhpcy5wb3B1cEhpc3RvcnlbcF09ZCx0aGlzLl9zZXR1cFBvcHVwKGgscCkpfX0se2tleTpcIl9zZXR1cFBvcHVwXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzO2lmKCEwPT09dGhpcy5pbml0aWFsaXplZCYmITA9PT10aGlzLmFsbG93Q3JlYXRpb24mJnRoaXMucG9wdXBDb3VudGVyPHRoaXMucG9wdXBMaW1pdCl7dmFyIG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtvLmlkPVwidmlzLWNvbmZpZ3VyYXRpb24tcG9wdXBcIixvLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uLXBvcHVwXCIsby5pbm5lckhUTUw9dCxvLm9uY2xpY2s9ZnVuY3Rpb24oKXtpLl9yZW1vdmVQb3B1cCgpfSx0aGlzLnBvcHVwQ291bnRlcis9MSx0aGlzLnBvcHVwRGl2PXtodG1sOm8saW5kZXg6ZX19fX0se2tleTpcIl9yZW1vdmVQb3B1cFwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5wb3B1cERpdi5odG1sJiYodGhpcy5wb3B1cERpdi5odG1sLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5wb3B1cERpdi5odG1sKSxjbGVhclRpbWVvdXQodGhpcy5wb3B1cERpdi5oaWRlVGltZW91dCksY2xlYXJUaW1lb3V0KHRoaXMucG9wdXBEaXYuZGVsZXRlVGltZW91dCksdGhpcy5wb3B1cERpdj17fSl9fSx7a2V5OlwiX3Nob3dQb3B1cElmTmVlZGVkXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO2lmKHZvaWQgMCE9PXRoaXMucG9wdXBEaXYuaHRtbCl7dmFyIGU9dGhpcy5kb21FbGVtZW50c1t0aGlzLnBvcHVwRGl2LmluZGV4XSxpPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5wb3B1cERpdi5odG1sLnN0eWxlLmxlZnQ9aS5sZWZ0K1wicHhcIix0aGlzLnBvcHVwRGl2Lmh0bWwuc3R5bGUudG9wPWkudG9wLTMwK1wicHhcIixkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRoaXMucG9wdXBEaXYuaHRtbCksdGhpcy5wb3B1cERpdi5oaWRlVGltZW91dD1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5wb3B1cERpdi5odG1sLnN0eWxlLm9wYWNpdHk9MH0sMTUwMCksdGhpcy5wb3B1cERpdi5kZWxldGVUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0Ll9yZW1vdmVQb3B1cCgpfSwxODAwKX19fSx7a2V5OlwiX21ha2VDaGVja2JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7by50eXBlPVwiY2hlY2tib3hcIixvLmNsYXNzTmFtZT1cInZpcy1jb25maWd1cmF0aW9uIHZpcy1jb25maWctY2hlY2tib3hcIixvLmNoZWNrZWQ9dCx2b2lkIDAhPT1lJiYoby5jaGVja2VkPWUsZSE9PXQmJihcIm9iamVjdFwiPT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxhLmRlZmF1bHQpKHQpKT9lIT09dC5lbmFibGVkJiZ0aGlzLmNoYW5nZWRPcHRpb25zLnB1c2goe3BhdGg6aSx2YWx1ZTplfSk6dGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKSk7dmFyIG49dGhpcztvLm9uY2hhbmdlPWZ1bmN0aW9uKCl7bi5fdXBkYXRlKHRoaXMuY2hlY2tlZCxpKX07dmFyIHM9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSk7dGhpcy5fbWFrZUl0ZW0oaSxzLG8pfX0se2tleTpcIl9tYWtl
21167VGV4dElucHV0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtvLnR5cGU9XCJ0ZXh0XCIsby5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLXRleHRcIixvLnZhbHVlPWUsZSE9PXQmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOmV9KTt2YXIgbj10aGlzO28ub25jaGFuZ2U9ZnVuY3Rpb24oKXtuLl91cGRhdGUodGhpcy52YWx1ZSxpKX07dmFyIHM9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSk7dGhpcy5fbWFrZUl0ZW0oaSxzLG8pfX0se2tleTpcIl9tYWtlQ29sb3JGaWVsZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzLG49dFsxXSxzPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZT12b2lkIDA9PT1lP246ZSxcIm5vbmVcIiE9PWU/KHMuY2xhc3NOYW1lPVwidmlzLWNvbmZpZ3VyYXRpb24gdmlzLWNvbmZpZy1jb2xvckJsb2NrXCIscy5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9ZSk6cy5jbGFzc05hbWU9XCJ2aXMtY29uZmlndXJhdGlvbiB2aXMtY29uZmlnLWNvbG9yQmxvY2sgbm9uZVwiLGU9dm9pZCAwPT09ZT9uOmUscy5vbmNsaWNrPWZ1bmN0aW9uKCl7by5fc2hvd0NvbG9yUGlja2VyKGUscyxpKX07dmFyIHI9dGhpcy5fbWFrZUxhYmVsKGlbaS5sZW5ndGgtMV0saSk7dGhpcy5fbWFrZUl0ZW0oaSxyLHMpfX0se2tleTpcIl9zaG93Q29sb3JQaWNrZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpcztlLm9uY2xpY2s9ZnVuY3Rpb24oKXt9LHRoaXMuY29sb3JQaWNrZXIuaW5zZXJ0VG8oZSksdGhpcy5jb2xvclBpY2tlci5zaG93KCksdGhpcy5jb2xvclBpY2tlci5zZXRDb2xvcih0KSx0aGlzLmNvbG9yUGlja2VyLnNldFVwZGF0ZUNhbGxiYWNrKGZ1bmN0aW9uKHQpe3ZhciBuPVwicmdiYShcIit0LnIrXCIsXCIrdC5nK1wiLFwiK3QuYitcIixcIit0LmErXCIpXCI7ZS5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9bixvLl91cGRhdGUobixpKX0pLHRoaXMuY29sb3JQaWNrZXIuc2V0Q2xvc2VDYWxsYmFjayhmdW5jdGlvbigpe2Uub25jbGljaz1mdW5jdGlvbigpe28uX3Nob3dDb2xvclBpY2tlcih0LGUsaSl9fSl9fSx7a2V5OlwiX2hhbmRsZU9iamVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTpbXSxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl0sbz0hMSxuPXRoaXMub3B0aW9ucy5maWx0ZXIscz0hMTtmb3IodmFyIHIgaW4gdClpZih0Lmhhc093blByb3BlcnR5KHIpKXtvPSEwO3ZhciBhPXRbcl0saD1jLmNvcHlBbmRFeHRlbmRBcnJheShlLHIpO2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJiExPT09KG89bihyLGUpKSYmIShhIGluc3RhbmNlb2YgQXJyYXkpJiZcInN0cmluZ1wiIT10eXBlb2YgYSYmXCJib29sZWFuXCIhPXR5cGVvZiBhJiZhIGluc3RhbmNlb2YgT2JqZWN0JiYodGhpcy5hbGxvd0NyZWF0aW9uPSExLG89dGhpcy5faGFuZGxlT2JqZWN0KGEsaCwhMCksdGhpcy5hbGxvd0NyZWF0aW9uPSExPT09aSksITEhPT1vKXtzPSEwO3ZhciBkPXRoaXMuX2dldFZhbHVlKGgpO2lmKGEgaW5zdGFuY2VvZiBBcnJheSl0aGlzLl9oYW5kbGVBcnJheShhLGQsaCk7ZWxzZSBpZihcInN0cmluZ1wiPT10eXBlb2YgYSl0aGlzLl9tYWtlVGV4dElucHV0KGEsZCxoKTtlbHNlIGlmKFwiYm9vbGVhblwiPT10eXBlb2YgYSl0aGlzLl9tYWtlQ2hlY2tib3goYSxkLGgpO2Vsc2UgaWYoYSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGw9ITA7aWYoLTEhPT1lLmluZGV4T2YoXCJwaHlzaWNzXCIpJiZ0aGlzLm1vZHVsZU9wdGlvbnMucGh5c2ljcy5zb2x2ZXIhPT1yJiYobD0hMSksITA9PT1sKWlmKHZvaWQgMCE9PWEuZW5hYmxlZCl7dmFyIHU9Yy5jb3B5QW5kRXh0ZW5kQXJyYXkoaCxcImVuYWJsZWRcIikscD10aGlzLl9nZXRWYWx1ZSh1KTtpZighMD09PXApe3ZhciBmPXRoaXMuX21ha2VMYWJlbChyLGgsITApO3RoaXMuX21ha2VJdGVtKGgsZikscz10aGlzLl9oYW5kbGVPYmplY3QoYSxoKXx8c31lbHNlIHRoaXMuX21ha2VDaGVja2JveChhLHAsaCl9ZWxzZXt2YXIgbT10aGlzLl9tYWtlTGFiZWwocixoLCEwKTt0aGlzLl9tYWtlSXRlbShoLG0pLHM9dGhpcy5faGFuZGxlT2JqZWN0KGEsaCl8fHN9fWVsc2UgY29uc29sZS5lcnJvcihcImRvbnQga25vdyBob3cgdG8gaGFuZGxlXCIsYSxyLGgpfX1yZXR1cm4gc319LHtrZXk6XCJfaGFuZGxlQXJyYXlcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7XCJzdHJpbmdcIj09dHlwZW9mIHRbMF0mJlwiY29sb3JcIj09PXRbMF0/KHRoaXMuX21ha2VDb2xvckZpZWxkKHQsZSxpKSx0WzFdIT09ZSYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKTpcInN0cmluZ1wiPT10eXBlb2YgdFswXT8odGhpcy5fbWFrZURyb3Bkb3duKHQsZSxpKSx0WzBdIT09ZSYmdGhpcy5jaGFuZ2VkT3B0aW9ucy5wdXNoKHtwYXRoOmksdmFsdWU6ZX0pKTpcIm51bWJlclwiPT10eXBlb2YgdFswXSYmKHRoaXMuX21ha2VSYW5nZSh0LGUsaSksdFswXSE9PWUmJnRoaXMuY2hhbmdlZE9wdGlvbnMucHVzaCh7cGF0aDppLHZhbHVlOk51bWJlcihlKX0pKX19LHtrZXk6XCJfdXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9jb25zdHJ1Y3RPcHRpb25zKHQsZSk7dGhpcy5wYXJlbnQuYm9keSYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyJiZ0aGlzLnBhcmVudC5ib2R5LmVtaXR0ZXIuZW1pdCYmdGhpcy5wYXJlbnQuYm9keS5lbWl0dGVyLmVtaXQoXCJjb25maWdDaGFuZ2VcIixpKSx0aGlzLmluaXRpYWxpemVkPSEwLHRoaXMucGFyZW50LnNldE9wdGlvbnMoaSl9fSx7a2V5OlwiX2NvbnN0cnVjdE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp7fSxvPWk7dD1cInRydWVcIj09PXR8fHQsdD1cImZhbHNlXCIhPT10JiZ0O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKVwiZ2xvYmFsXCIhPT1lW25dJiYodm9p
21167ZCAwPT09b1tlW25dXSYmKG9bZVtuXV09e30pLG4hPT1lLmxlbmd0aC0xP289b1tlW25dXTpvW2Vbbl1dPXQpO3JldHVybiBpfX0se2tleTpcIl9wcmludE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZ2V0T3B0aW9ucygpO3RoaXMub3B0aW9uc0NvbnRhaW5lci5pbm5lckhUTUw9XCI8cHJlPnZhciBvcHRpb25zID0gXCIrKDAscy5kZWZhdWx0KSh0LG51bGwsMikrXCI8L3ByZT5cIn19LHtrZXk6XCJnZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9e30sZT0wO2U8dGhpcy5jaGFuZ2VkT3B0aW9ucy5sZW5ndGg7ZSsrKXRoaXMuX2NvbnN0cnVjdE9wdGlvbnModGhpcy5jaGFuZ2VkT3B0aW9uc1tlXS52YWx1ZSx0aGlzLmNoYW5nZWRPcHRpb25zW2VdLnBhdGgsdCk7cmV0dXJuIHR9fV0pLHR9KCk7ZS5kZWZhdWx0PWZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7fWZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gZT12b2lkIDA9PT1lP3t9OmUse3N0eWxlOmUuc3R5bGV8fHQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlLFxuICAgIHN0eWxlczplLnN0eWxlc3x8dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGVzLHNpemU6ZS5zaXplfHx0Lm9wdGlvbnMuZHJhd1BvaW50cy5zaXplLGNsYXNzTmFtZTplLmNsYXNzTmFtZXx8dC5jbGFzc05hbWV9fWZ1bmN0aW9uIHModCxlKXt2YXIgaT12b2lkIDA7cmV0dXJuIHQub3B0aW9ucyYmdC5vcHRpb25zLmRyYXdQb2ludHMmJnQub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiB0Lm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmKGk9dC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIpLGUuZ3JvdXAub3B0aW9ucyYmZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMmJmUuZ3JvdXAub3B0aW9ucy5kcmF3UG9pbnRzLm9uUmVuZGVyJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmdyb3VwLm9wdGlvbnMuZHJhd1BvaW50cy5vblJlbmRlciYmKGk9ZS5ncm91cC5vcHRpb25zLmRyYXdQb2ludHMub25SZW5kZXIpLGl9dmFyIHI9aSg2KSxhPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0ociksaD1pKDE0KTtvLmRyYXc9ZnVuY3Rpb24odCxlLGksbyl7bz1vfHwwO2Zvcih2YXIgcj1zKGksZSksZD0wO2Q8dC5sZW5ndGg7ZCsrKWlmKHIpe3ZhciBsPXIodFtkXSxlKTshMCE9PWwmJlwib2JqZWN0XCIhPT0odm9pZCAwPT09bD9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkobCkpfHxoLmRyYXdQb2ludCh0W2RdLnNjcmVlbl94K28sdFtkXS5zY3JlZW5feSxuKGUsbCksaS5zdmdFbGVtZW50cyxpLnN2Zyx0W2RdLmxhYmVsKX1lbHNlIGguZHJhd1BvaW50KHRbZF0uc2NyZWVuX3grbyx0W2RdLnNjcmVlbl95LG4oZSksaS5zdmdFbGVtZW50cyxpLnN2Zyx0W2RdLmxhYmVsKX0sby5kcmF3SWNvbj1mdW5jdGlvbih0LGUsaSxvLHMscil7dmFyIGE9LjUqcyxkPWguZ2V0U1ZHRWxlbWVudChcInJlY3RcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsZSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwieVwiLGktYSksZC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvKSxkLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIiwyKmEpLGQuc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsXCJ2aXMtb3V0bGluZVwiKSxoLmRyYXdQb2ludChlKy41Km8saSxuKHQpLHIuc3ZnRWxlbWVudHMsci5zdmcpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDIzKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIG49KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIG4ubGFiZWxPZmZzZXQ9MCxuLnNlbGVjdGVkPSExLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5vcHRpb25zPXQsdm9pZCAwPT09ZSYmdm9pZCAwPT09aXx8dGhpcy5zZXRJbWFnZXMoZSxpKX19LHtrZXk6XCJzZXRJbWFnZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2UmJnRoaXMuc2VsZWN0ZWQ/KHRoaXMuaW1hZ2VPYmo9ZSx0aGlzLmltYWdlT2JqQWx0PXQpOih0aGlzLmltYWdlT2JqPXQsdGhpcy5pbWFnZU9iakFsdD1lKX19LHtrZXk6XCJzd2l0Y2hJbWFnZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10JiYhdGhpcy5zZWxlY3RlZHx8IXQmJnRoaXMuc2VsZWN0ZWQ7aWYodGhpcy5zZWxlY3RlZD10LHZvaWQgMCE9PXRoaXMuaW1hZ2VPYmpBbHQmJmUpe3ZhciBpPXRoaXMuaW1hZ2VPYmo7dGhpcy5pbWFnZU9iaj10aGlzLmltYWdlT2JqQWx0LHRoaXMuaW1hZ2VPYmpBbHQ9aX19fSx7a2V5OlwiX3Jlc2l6ZUltYWdlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdCxlO2lmKCExPT09dGhpcy5vcHRpb25zLnNoYXBlUHJvcGVydGllcy51c2VJbWFnZVNpemUpe3ZhciBpPTEsbz0xO3RoaXMuaW1hZ2VPYmoud2lkdGgmJnRoaXMuaW1hZ2VPYmouaGVpZ2h0JiYodGhpcy5pbWFnZU9iai53aWR0aD50aGlzLmltYWdlT2JqLmhlaWdodD9pPXRoaXMuaW1hZ2VPYmoud2lkdGgvdGhpcy5pbWFnZU9iai5oZWlnaHQ6bz10aGlzLmltYWdlT2JqLmhlaWdodC90aGlzLmltYWdlT2JqLndpZHRoKSx0PTIqdGhpcy5vcHRpb25zLnNpemUqaSxlPTIqdGhpcy5vcHRpb25zLnNpemUqb31lbHNlIHQ9dGhpcy5pbWFnZU9iai53aWR0aCxlPXRoaXMuaW1hZ2VPYmouaGVpZ2h0O3RoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGh9fSx7a2V5OlwiX2RyYXdSYXdDaXJjbGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt0aGlzLmluaXRDb250ZXh0Rm9yRHJhdyh0LG8pLHQuY2lyY2xlKGUsaSxvLnNpemUpLHRoaXMucGVyZm9ybUZpbGwodCxvKX19LHtrZXk6XCJfZHJhd0ltYWdlQXRQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYoMCE9dGhpcy5pbWFnZU9iai53aWR0aCl7dC5nbG9iYWxBbHBoYT0xLHRoaXMuZW5hYmxlU2hhZG93KHQsZSk7dmFyIGk9MTshMD09PXRoaXMub3B0aW9ucy5zaGFwZVByb3BlcnRpZXMuaW50ZXJwb2xhdGlvbiYmKGk9dGhpcy5pbWFnZU9iai53aWR0aC90aGlzLndpZHRoL3RoaXMuYm9keS52aWV3LnNjYWxlKSx0aGlzLmltYWdlT2JqLmRyYXdJbWFnZUF0UG9zaXRpb24odCxpLHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19fSx7a2V5OlwiX2RyYXdJbWFnZUxhYmVsXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcyxyPTA7aWYodm9pZCAwIT09dGhpcy5oZWlnaHQpe3I9LjUqdGhpcy5oZWlnaHQ7dmFyIGE9dGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LG8sbik7YS5saW5lQ291bnQ+PTEmJihyKz1hLmhlaWdodC8yKX1zPWkrcix0aGlzLm9wdGlvbnMubGFiZWwmJih0aGlzLmxhYmVsT2Zmc2V0PXIpLHRoaXMubGFiZWxNb2R1bGUuZHJhdyh0LGUscyxvLG4sXCJoYW5naW5nXCIpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgxOSkscz1vKG4pLHI9aSg2KSxhPW8ociksaD1pKDI5KSxkPW8oaCksbD1pKDApLHU9byhsKSxjPWkoMSkscD1vKGMpLGY9aSgyKSxtPWkoMTE3KS5kZWZhdWx0LHY9aSg0OCkuZGVmYXVsdCxnPWkoMjE1KS5kZWZhdWx0LHk9aSgyMTcpLmRlZmF1bHQsYj1pKDIxOCkuZGVmYXVsdCxfPWkoMjE5KS5kZWZhdWx0LHc9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvLG4pe2lmKCgwLHUuZGVmYXVsdCkodGhpcyx0KSx2b2lkIDA9PT1pKXRocm93IG5ldyBFcnJvcihcIk5vIGJvZHkgcHJvdmlkZWRcIik7dGhpcy5vcHRpb25zPWYuYnJpZGdlT2JqZWN0KG8pLHRoaXMuZ2xvYmFsT3B0aW9ucz1vLHRoaXMuZGVmYXVsdE9wdGlvbnM9bix0aGlzLmJvZHk9aSx0aGlzLmlkPXZvaWQgMCx0aGlzLmZyb21JZD12b2lkIDAsdGhpcy50b0lkPXZvaWQgMCx0aGlzLnNlbGVjdGVkPSExLHRoaXMuaG92ZXI9ITEsdGhpcy5sYWJlbERpcnR5PSEwLHRoaXMuYmFzZVdpZHRoPXRoaXMub3B0aW9ucy53aWR0aCx0aGlzLmJhc2VGb250U2l6ZT10aGlzLm9wdGlvbnMuZm9udC5zaXplLHRoaXMuZnJvbT12b2lkIDAsdGhpcy50bz12b2lkIDAsdGhpcy5lZGdlVHlwZT12b2lkIDAsdGhpcy5jb25uZWN0ZWQ9ITEsdGhpcy5sYWJlbE1vZHVsZT1uZXcgbSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLCEwKSx0aGlzLnNldE9wdGlvbnMoZSl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe2lmKGUpe3QucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyxlLCEwLHRoaXMuZ2xvYmFsT3B0aW9ucyksdm9pZCAwIT09ZS5pZCYmKHRoaXMuaWQ9ZS5pZCksdm9pZCAwIT09ZS5mcm9tJiYodGhpcy5mcm9tSWQ9ZS5mcm9tKSx2b2lkIDAhPT1lLnRvJiYodGhpcy50b0lkPWUudG8pLHZvaWQgMCE9PWUudGl0bGUmJih0aGlzLnRpdGxlPWUudGl0bGUpLHZvaWQgMCE9PWUudmFsdWUmJihlLnZhbHVlPXBhcnNlRmxvYXQoZS52YWx1ZSkpO3ZhciBpPVtlLHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zXTt0aGlzLmNob29zZXI9di5jaG9vc2lmeShcImVkZ2VcIixpKSx0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKGUpO3ZhciBvPXRoaXMudXBkYXRlRWRnZVR5cGUoKTtyZXR1cm4gdGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLmNvbm5lY3QoKSx2b2lkIDA9PT1lLmhpZGRlbiYmdm9pZCAwPT09ZS5waHlzaWNzfHwobz0hMCksb319fSx7a2V5OlwiZ2V0Rm9ybWF0dGluZ1ZhbHVlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLnRvfHwhMD09PXRoaXMub3B0aW9ucy5hcnJvd3MudG8uZW5hYmxlZCxlPSEwPT09dGhpcy5vcHRpb25zLmFycm93cy5mcm9tfHwhMD09PXRoaXMub3B0aW9ucy5hcnJvd3MuZnJvbS5lbmFibGVkLGk9ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLm1pZGRsZXx8ITA9PT10aGlzLm9wdGlvbnMuYXJyb3dzLm1pZGRsZS5lbmFibGVkLG89dGhpcy5vcHRpb25zLmNvbG9yLmluaGVyaXQsbj17dG9BcnJvdzp0LHRvQXJyb3dTY2FsZTp0aGlzLm9wdGlvbnMuYXJyb3dzLnRvLnNjYWxlRmFjdG9yLHRvQXJyb3dUeXBlOnRoaXMub3B0aW9ucy5hcnJvd3MudG8udHlwZSxtaWRkbGVBcnJvdzppLG1pZGRsZUFycm93U2NhbGU6dGhpcy5vcHRpb25zLmFycm93cy5taWRkbGUuc2NhbGVGYWN0b3IsbWlkZGxlQXJyb3dUeXBlOnRoaXMub3B0aW9ucy5hcnJvd3MubWlkZGxlLnR5cGUsZnJvbUFycm93OmUsZnJvbUFycm93U2NhbGU6dGhpcy5vcHRpb25zLmFycm93cy5mcm9tLnNjYWxlRmFjdG9yLGZyb21BcnJvd1R5cGU6dGhpcy5vcHRpb25zLmFycm93cy5mcm9tLnR5cGUsYXJyb3dTdHJpa2V0aHJvdWdoOnRoaXMub3B0aW9ucy5hcnJvd1N0cmlrZXRocm91Z2gsY29sb3I6bz92b2lkIDA6dGhpcy5vcHRpb25zLmNvbG9yLmNvbG9yLGluaGVyaXRzQ29sb3I6byxvcGFjaXR5OnRoaXMub3B0aW9ucy5jb2xvci5vcGFjaXR5LGhpZGRlbjp0aGlzLm9wdGlvbnMuaGl
21167kZGVuLGxlbmd0aDp0aGlzLm9wdGlvbnMubGVuZ3RoLHNoYWRvdzp0aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWQsc2hhZG93Q29sb3I6dGhpcy5vcHRpb25zLnNoYWRvdy5jb2xvcixzaGFkb3dTaXplOnRoaXMub3B0aW9ucy5zaGFkb3cuc2l6ZSxzaGFkb3dYOnRoaXMub3B0aW9ucy5zaGFkb3cueCxzaGFkb3dZOnRoaXMub3B0aW9ucy5zaGFkb3cueSxkYXNoZXM6dGhpcy5vcHRpb25zLmRhc2hlcyx3aWR0aDp0aGlzLm9wdGlvbnMud2lkdGh9O2lmKHRoaXMuc2VsZWN0ZWR8fHRoaXMuaG92ZXIpaWYoITA9PT10aGlzLmNob29zZXIpe2lmKHRoaXMuc2VsZWN0ZWQpe3ZhciBzPXRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aDtcImZ1bmN0aW9uXCI9PXR5cGVvZiBzP24ud2lkdGg9cyhuLndpZHRoKTpcIm51bWJlclwiPT10eXBlb2YgcyYmKG4ud2lkdGgrPXMpLG4ud2lkdGg9TWF0aC5tYXgobi53aWR0aCwuMy90aGlzLmJvZHkudmlldy5zY2FsZSksbi5jb2xvcj10aGlzLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LG4uc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZH1lbHNlIGlmKHRoaXMuaG92ZXIpe3ZhciByPXRoaXMub3B0aW9ucy5ob3ZlcldpZHRoO1wiZnVuY3Rpb25cIj09dHlwZW9mIHI/bi53aWR0aD1yKG4ud2lkdGgpOlwibnVtYmVyXCI9PXR5cGVvZiByJiYobi53aWR0aCs9ciksbi53aWR0aD1NYXRoLm1heChuLndpZHRoLC4zL3RoaXMuYm9keS52aWV3LnNjYWxlKSxuLmNvbG9yPXRoaXMub3B0aW9ucy5jb2xvci5ob3ZlcixuLnNoYWRvdz10aGlzLm9wdGlvbnMuc2hhZG93LmVuYWJsZWR9fWVsc2VcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLmNob29zZXImJih0aGlzLmNob29zZXIobix0aGlzLm9wdGlvbnMuaWQsdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyKSx2b2lkIDAhPT1uLmNvbG9yJiYobi5pbmhlcml0c0NvbG9yPSExKSwhMT09PW4uc2hhZG93JiYobi5zaGFkb3dDb2xvcj09PXRoaXMub3B0aW9ucy5zaGFkb3cuY29sb3ImJm4uc2hhZG93U2l6ZT09PXRoaXMub3B0aW9ucy5zaGFkb3cuc2l6ZSYmbi5zaGFkb3dYPT09dGhpcy5vcHRpb25zLnNoYWRvdy54JiZuLnNoYWRvd1k9PT10aGlzLm9wdGlvbnMuc2hhZG93Lnl8fChuLnNoYWRvdz0hMCkpKTtlbHNlIG4uc2hhZG93PXRoaXMub3B0aW9ucy5zaGFkb3cuZW5hYmxlZCxuLndpZHRoPU1hdGgubWF4KG4ud2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpO3JldHVybiBufX0se2tleTpcInVwZGF0ZUxhYmVsTW9kdWxlXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W3QsdGhpcy5vcHRpb25zLHRoaXMuZ2xvYmFsT3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zXTt0aGlzLmxhYmVsTW9kdWxlLnVwZGF0ZSh0aGlzLm9wdGlvbnMsZSksdm9pZCAwIT09dGhpcy5sYWJlbE1vZHVsZS5iYXNlU2l6ZSYmKHRoaXMuYmFzZUZvbnRTaXplPXRoaXMubGFiZWxNb2R1bGUuYmFzZVNpemUpfX0se2tleTpcInVwZGF0ZUVkZ2VUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMuc21vb3RoLGU9ITEsaT0hMDtyZXR1cm4gdm9pZCAwIT09dGhpcy5lZGdlVHlwZSYmKCh0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgeSYmITA9PT10LmVuYWJsZWQmJlwiZHluYW1pY1wiPT09dC50eXBlfHx0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgZyYmITA9PT10LmVuYWJsZWQmJlwiY3ViaWNCZXppZXJcIj09PXQudHlwZXx8dGhpcy5lZGdlVHlwZSBpbnN0YW5jZW9mIGImJiEwPT09dC5lbmFibGVkJiZcImR5bmFtaWNcIiE9PXQudHlwZSYmXCJjdWJpY0JlemllclwiIT09dC50eXBlfHx0aGlzLmVkZ2VUeXBlIGluc3RhbmNlb2YgXyYmITE9PT10LnR5cGUuZW5hYmxlZCkmJihpPSExKSwhMD09PWkmJihlPXRoaXMuY2xlYW51cCgpKSksITA9PT1pPyEwPT09dC5lbmFibGVkP1wiZHluYW1pY1wiPT09dC50eXBlPyhlPSEwLHRoaXMuZWRnZVR5cGU9bmV3IHkodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKSk6XCJjdWJpY0JlemllclwiPT09dC50eXBlP3RoaXMuZWRnZVR5cGU9bmV3IGcodGhpcy5vcHRpb25zLHRoaXMuYm9keSx0aGlzLmxhYmVsTW9kdWxlKTp0aGlzLmVkZ2VUeXBlPW5ldyBiKHRoaXMub3B0aW9ucyx0aGlzLmJvZHksdGhpcy5sYWJlbE1vZHVsZSk6dGhpcy5lZGdlVHlwZT1uZXcgXyh0aGlzLm9wdGlvbnMsdGhpcy5ib2R5LHRoaXMubGFiZWxNb2R1bGUpOnRoaXMuZWRnZVR5cGUuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMpLGV9fSx7a2V5OlwiY29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5kaXNjb25uZWN0KCksdGhpcy5mcm9tPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmZyb21JZF18fHZvaWQgMCx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRvSWRdfHx2b2lkIDAsdGhpcy5jb25uZWN0ZWQ9dm9pZCAwIT09dGhpcy5mcm9tJiZ2b2lkIDAhPT10aGlzLnRvLCEwPT09dGhpcy5jb25uZWN0ZWQ/KHRoaXMuZnJvbS5hdHRhY2hFZGdlKHRoaXMpLHRoaXMudG8uYXR0YWNoRWRnZSh0aGlzKSk6KHRoaXMuZnJvbSYmdGhpcy5mcm9tLmRldGFjaEVkZ2UodGhpcyksdGhpcy50byYmdGhpcy50by5kZXRhY2hFZGdlKHRoaXMpKSx0aGlzLmVkZ2VUeXBlLmNvbm5lY3QoKX19LHtrZXk6XCJkaXNjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb20mJih0aGlzLmZyb20uZGV0YWNoRWRnZSh0aGlzKSx0aGlzLmZyb209dm9pZCAwKSx0aGlzLnRvJiYodGhpcy50by5kZXRhY2hFZGdlKHRoaXMpLHRoaXMudG89dm9pZCAwKSx0aGlzLmNvbm5lY3RlZD0hMX19LHtrZXk6XCJnZXRUaXRsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudGl0bGV9fSx7a2V5OlwiaXNTZWxlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0ZWR9fSx7a2V5OlwiZ2V0VmFsdWVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm9wdGlvbnMudmFsdWV9fSx7a2V5Olwic2V0VmFsdWVSYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtpZih2b2lkIDAhPT10aGlzLm9wdGlvbnMudmFsdWUpe3ZhciBvPXRoaXMub3B0aW9ucy5zY2FsaW5nLmN1c3RvbVNjYWxpbmdGdW5jdGlvbih0LGUsaSx0aGlzLm9wdGlvbnMudmFsdWUpLG49dGhpcy5vcHRpb25zLnNjYWxpbmcubWF4LXRoaXMub3B0aW9ucy5zY2FsaW5nLm1pbjtpZighMD09PXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLmVuYWJsZWQpe3ZhciBzPXRoaXMub3B0aW9ucy5zY2FsaW5nLmxhYmVsLm1heC10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW47dGhpcy5vcHRpb25zLmZvbnQuc2l6ZT10aGlzLm9wdGlvbnMuc2NhbGluZy5sYWJlbC5taW4rbypzfXRoaXMub3B0aW9ucy53aWR0aD10aGlzLm9wdGlvbnMuc2NhbGluZy5taW4rbypufWVsc2UgdGhpcy5vcHRpb25zLndpZHRoP
21167XRoaXMuYmFzZVdpZHRoLHRoaXMub3B0aW9ucy5mb250LnNpemU9dGhpcy5iYXNlRm9udFNpemU7dGhpcy5fc2V0SW50ZXJhY3Rpb25XaWR0aHMoKSx0aGlzLnVwZGF0ZUxhYmVsTW9kdWxlKCl9fSx7a2V5OlwiX3NldEludGVyYWN0aW9uV2lkdGhzXCIsdmFsdWU6ZnVuY3Rpb24oKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuaG92ZXJXaWR0aD90aGlzLmVkZ2VUeXBlLmhvdmVyV2lkdGg9dGhpcy5vcHRpb25zLmhvdmVyV2lkdGgodGhpcy5vcHRpb25zLndpZHRoKTp0aGlzLmVkZ2VUeXBlLmhvdmVyV2lkdGg9dGhpcy5vcHRpb25zLmhvdmVyV2lkdGgrdGhpcy5vcHRpb25zLndpZHRoLFwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aD90aGlzLmVkZ2VUeXBlLnNlbGVjdGlvbldpZHRoPXRoaXMub3B0aW9ucy5zZWxlY3Rpb25XaWR0aCh0aGlzLm9wdGlvbnMud2lkdGgpOnRoaXMuZWRnZVR5cGUuc2VsZWN0aW9uV2lkdGg9dGhpcy5vcHRpb25zLnNlbGVjdGlvbldpZHRoK3RoaXMub3B0aW9ucy53aWR0aH19LHtrZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRGb3JtYXR0aW5nVmFsdWVzKCk7aWYoIWUuaGlkZGVuKXt2YXIgaT10aGlzLmVkZ2VUeXBlLmdldFZpYU5vZGUoKSxvPXt9O3RoaXMuZWRnZVR5cGUuZnJvbVBvaW50PXRoaXMuZWRnZVR5cGUuZnJvbSx0aGlzLmVkZ2VUeXBlLnRvUG9pbnQ9dGhpcy5lZGdlVHlwZS50byxlLmZyb21BcnJvdyYmKG8uZnJvbT10aGlzLmVkZ2VUeXBlLmdldEFycm93RGF0YSh0LFwiZnJvbVwiLGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpLCExPT09ZS5hcnJvd1N0cmlrZXRocm91Z2gmJih0aGlzLmVkZ2VUeXBlLmZyb21Qb2ludD1vLmZyb20uY29yZSkpLGUudG9BcnJvdyYmKG8udG89dGhpcy5lZGdlVHlwZS5nZXRBcnJvd0RhdGEodCxcInRvXCIsaSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIsZSksITE9PT1lLmFycm93U3RyaWtldGhyb3VnaCYmKHRoaXMuZWRnZVR5cGUudG9Qb2ludD1vLnRvLmNvcmUpKSxlLm1pZGRsZUFycm93JiYoby5taWRkbGU9dGhpcy5lZGdlVHlwZS5nZXRBcnJvd0RhdGEodCxcIm1pZGRsZVwiLGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUpKSx0aGlzLmVkZ2VUeXBlLmRyYXdMaW5lKHQsZSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIsaSksdGhpcy5kcmF3QXJyb3dzKHQsbyxlKSx0aGlzLmRyYXdMYWJlbCh0LGkpfX19LHtrZXk6XCJkcmF3QXJyb3dzXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2kuZnJvbUFycm93JiZ0aGlzLmVkZ2VUeXBlLmRyYXdBcnJvd0hlYWQodCxpLHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixlLmZyb20pLGkubWlkZGxlQXJyb3cmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUubWlkZGxlKSxpLnRvQXJyb3cmJnRoaXMuZWRnZVR5cGUuZHJhd0Fycm93SGVhZCh0LGksdGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyLGUudG8pfX0se2tleTpcImRyYXdMYWJlbFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09dGhpcy5vcHRpb25zLmxhYmVsKXt2YXIgaT10aGlzLmZyb20sbz10aGlzLnRvO2lmKHRoaXMubGFiZWxNb2R1bGUuZGlmZmVyZW50U3RhdGUodGhpcy5zZWxlY3RlZCx0aGlzLmhvdmVyKSYmdGhpcy5sYWJlbE1vZHVsZS5nZXRUZXh0U2l6ZSh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlciksaS5pZCE9by5pZCl7dGhpcy5sYWJlbE1vZHVsZS5wb2ludFRvU2VsZj0hMTt2YXIgbj10aGlzLmVkZ2VUeXBlLmdldFBvaW50KC41LGUpO3Quc2F2ZSgpO3ZhciBzPXRoaXMuX2dldFJvdGF0aW9uKHQpOzAhPXMuYW5nbGUmJih0LnRyYW5zbGF0ZShzLngscy55KSx0LnJvdGF0ZShzLmFuZ2xlKSksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsbi54LG4ueSx0aGlzLnNlbGVjdGVkLHRoaXMuaG92ZXIpLHQucmVzdG9yZSgpfWVsc2V7dGhpcy5sYWJlbE1vZHVsZS5wb2ludFRvU2VsZj0hMDt2YXIgcixhLGg9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplO2kuc2hhcGUud2lkdGg+aS5zaGFwZS5oZWlnaHQ/KHI9aS54Ky41Kmkuc2hhcGUud2lkdGgsYT1pLnktaCk6KHI9aS54K2gsYT1pLnktLjUqaS5zaGFwZS5oZWlnaHQpLG49dGhpcy5fcG9pbnRPbkNpcmNsZShyLGEsaCwuMTI1KSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCxuLngsbi55LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3Zlcil9fX19LHtrZXk6XCJnZXRJdGVtc09uUG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih0aGlzLmxhYmVsTW9kdWxlLnZpc2libGUoKSl7dmFyIGk9dGhpcy5fZ2V0Um90YXRpb24oKTt2LnBvaW50SW5SZWN0KHRoaXMubGFiZWxNb2R1bGUuZ2V0U2l6ZSgpLHQsaSkmJmUucHVzaCh7ZWRnZUlkOnRoaXMuaWQsbGFiZWxJZDowfSl9dmFyIG89e2xlZnQ6dC54LHRvcDp0Lnl9O3JldHVybiB0aGlzLmlzT3ZlcmxhcHBpbmdXaXRoKG8pJiZlLnB1c2goe2VkZ2VJZDp0aGlzLmlkfSksZX19LHtrZXk6XCJpc092ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuY29ubmVjdGVkKXt2YXIgZT10aGlzLmZyb20ueCxpPXRoaXMuZnJvbS55LG89dGhpcy50by54LG49dGhpcy50by55LHM9dC5sZWZ0LHI9dC50b3A7cmV0dXJuIHRoaXMuZWRnZVR5cGUuZ2V0RGlzdGFuY2VUb0VkZ2UoZSxpLG8sbixzLHIpPDEwfXJldHVybiExfX0se2tleTpcIl9nZXRSb3RhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZWRnZVR5cGUuZ2V0VmlhTm9kZSgpLGk9dGhpcy5lZGdlVHlwZS5nZXRQb2ludCguNSxlKTt2b2lkIDAhPT10JiZ0aGlzLmxhYmVsTW9kdWxlLmNhbGN1bGF0ZUxhYmVsU2l6ZSh0LHRoaXMuc2VsZWN0ZWQsdGhpcy5ob3ZlcixpLngsaS55KTt2YXIgbz17eDppLngseTp0aGlzLmxhYmVsTW9kdWxlLnNpemUueUxpbmUsYW5nbGU6MH07aWYoIXRoaXMubGFiZWxNb2R1bGUudmlzaWJsZSgpKXJldHVybiBvO2lmKFwiaG9yaXpvbnRhbFwiPT09dGhpcy5vcHRpb25zLmZvbnQuYWxpZ24pcmV0dXJuIG87dmFyIG49dGhpcy5mcm9tLnktdGhpcy50by55LHM9dGhpcy5mcm9tLngtdGhpcy50by54LHI9TWF0aC5hdGFuMihuLHMpO3JldHVybihyPC0xJiZzPDB8fHI+MCYmczwwKSYmKHIrPU1hdGguUEkpLG8uYW5nbG
21167U9cixvfX0se2tleTpcIl9wb2ludE9uQ2lyY2xlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49MipvKk1hdGguUEk7cmV0dXJue3g6dCtpKk1hdGguY29zKG4pLHk6ZS1pKk1hdGguc2luKG4pfX19LHtrZXk6XCJzZWxlY3RcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITB9fSx7a2V5OlwidW5zZWxlY3RcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWQ9ITF9fSx7a2V5OlwiY2xlYW51cFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWRnZVR5cGUuY2xlYW51cCgpfX0se2tleTpcInJlbW92ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jbGVhbnVwKCksdGhpcy5kaXNjb25uZWN0KCksZGVsZXRlIHRoaXMuYm9keS5lZGdlc1t0aGlzLmlkXX19LHtrZXk6XCJlbmRQb2ludHNWYWxpZFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLmZyb21JZF0mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRvSWRdfX1dLFt7a2V5OlwicGFyc2VPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOnt9LG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxyPVtcImFycm93U3RyaWtldGhyb3VnaFwiLFwiaWRcIixcImZyb21cIixcImhpZGRlblwiLFwiaG92ZXJXaWR0aFwiLFwibGFiZWxIaWdobGlnaHRCb2xkXCIsXCJsZW5ndGhcIixcImxpbmVcIixcIm9wYWNpdHlcIixcInBoeXNpY3NcIixcInNjYWxpbmdcIixcInNlbGVjdGlvbldpZHRoXCIsXCJzZWxmUmVmZXJlbmNlU2l6ZVwiLFwidG9cIixcInRpdGxlXCIsXCJ2YWx1ZVwiLFwid2lkdGhcIixcImZvbnRcIixcImNob3NlblwiLFwid2lkdGhDb25zdHJhaW50XCJdO2lmKGYuc2VsZWN0aXZlRGVlcEV4dGVuZChyLHQsZSxpKSx2LmlzVmFsaWRMYWJlbChlLmxhYmVsKT90LmxhYmVsPWUubGFiZWw6dC5sYWJlbD12b2lkIDAsZi5tZXJnZU9wdGlvbnModCxlLFwic21vb3RoXCIsbyksZi5tZXJnZU9wdGlvbnModCxlLFwic2hhZG93XCIsbyksdm9pZCAwIT09ZS5kYXNoZXMmJm51bGwhPT1lLmRhc2hlcz90LmRhc2hlcz1lLmRhc2hlczohMD09PWkmJm51bGw9PT1lLmRhc2hlcyYmKHQuZGFzaGVzPSgwLGQuZGVmYXVsdCkoby5kYXNoZXMpKSx2b2lkIDAhPT1lLnNjYWxpbmcmJm51bGwhPT1lLnNjYWxpbmc/KHZvaWQgMCE9PWUuc2NhbGluZy5taW4mJih0LnNjYWxpbmcubWluPWUuc2NhbGluZy5taW4pLHZvaWQgMCE9PWUuc2NhbGluZy5tYXgmJih0LnNjYWxpbmcubWF4PWUuc2NhbGluZy5tYXgpLGYubWVyZ2VPcHRpb25zKHQuc2NhbGluZyxlLnNjYWxpbmcsXCJsYWJlbFwiLG8uc2NhbGluZykpOiEwPT09aSYmbnVsbD09PWUuc2NhbGluZyYmKHQuc2NhbGluZz0oMCxkLmRlZmF1bHQpKG8uc2NhbGluZykpLHZvaWQgMCE9PWUuYXJyb3dzJiZudWxsIT09ZS5hcnJvd3MpaWYoXCJzdHJpbmdcIj09dHlwZW9mIGUuYXJyb3dzKXt2YXIgaD1lLmFycm93cy50b0xvd2VyQ2FzZSgpO3QuYXJyb3dzLnRvLmVuYWJsZWQ9LTEhPWguaW5kZXhPZihcInRvXCIpLHQuYXJyb3dzLm1pZGRsZS5lbmFibGVkPS0xIT1oLmluZGV4T2YoXCJtaWRkbGVcIiksdC5hcnJvd3MuZnJvbS5lbmFibGVkPS0xIT1oLmluZGV4T2YoXCJmcm9tXCIpfWVsc2V7aWYoXCJvYmplY3RcIiE9PSgwLGEuZGVmYXVsdCkoZS5hcnJvd3MpKXRocm93IG5ldyBFcnJvcihcIlRoZSBhcnJvdyBuZXdPcHRpb25zIGNhbiBvbmx5IGJlIGFuIG9iamVjdCBvciBhIHN0cmluZy4gUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24uIFlvdSB1c2VkOlwiKygwLHMuZGVmYXVsdCkoZS5hcnJvd3MpKTtmLm1lcmdlT3B0aW9ucyh0LmFycm93cyxlLmFycm93cyxcInRvXCIsby5hcnJvd3MpLGYubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLFwibWlkZGxlXCIsby5hcnJvd3MpLGYubWVyZ2VPcHRpb25zKHQuYXJyb3dzLGUuYXJyb3dzLFwiZnJvbVwiLG8uYXJyb3dzKX1lbHNlITA9PT1pJiZudWxsPT09ZS5hcnJvd3MmJih0LmFycm93cz0oMCxkLmRlZmF1bHQpKG8uYXJyb3dzKSk7aWYodm9pZCAwIT09ZS5jb2xvciYmbnVsbCE9PWUuY29sb3Ipe3ZhciBsPWUuY29sb3IsdT10LmNvbG9yO2lmKG4pZi5kZWVwRXh0ZW5kKHUsby5jb2xvciwhMSxpKTtlbHNlIGZvcih2YXIgYyBpbiB1KXUuaGFzT3duUHJvcGVydHkoYykmJmRlbGV0ZSB1W2NdO2lmKGYuaXNTdHJpbmcodSkpdS5jb2xvcj11LHUuaGlnaGxpZ2h0PXUsdS5ob3Zlcj11LHUuaW5oZXJpdD0hMSx2b2lkIDA9PT1sLm9wYWNpdHkmJih1Lm9wYWNpdHk9MSk7ZWxzZXt2YXIgcD0hMTt2b2lkIDAhPT1sLmNvbG9yJiYodS5jb2xvcj1sLmNvbG9yLHA9ITApLHZvaWQgMCE9PWwuaGlnaGxpZ2h0JiYodS5oaWdobGlnaHQ9bC5oaWdobGlnaHQscD0hMCksdm9pZCAwIT09bC5ob3ZlciYmKHUuaG92ZXI9bC5ob3ZlcixwPSEwKSx2b2lkIDAhPT1sLmluaGVyaXQmJih1LmluaGVyaXQ9bC5pbmhlcml0KSx2b2lkIDAhPT1sLm9wYWNpdHkmJih1Lm9wYWNpdHk9TWF0aC5taW4oMSxNYXRoLm1heCgwLGwub3BhY2l0eSkpKSwhMD09PXA/dS5pbmhlcml0PSExOnZvaWQgMD09PXUuaW5oZXJpdCYmKHUuaW5oZXJpdD1cImZyb21cIil9fWVsc2UhMD09PWkmJm51bGw9PT1lLmNvbG9yJiYodC5jb2xvcj1mLmJyaWRnZU9iamVjdChvLmNvbG9yKSk7ITA9PT1pJiZudWxsPT09ZS5mb250JiYodC5mb250PWYuYnJpZGdlT2JqZWN0KG8uZm9udCkpfX1dKSx0fSgpO2UuZGVmYXVsdD13fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMTE4KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9maW5kQm9yZGVyUG9zaXRpb25CZXppZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpLG8sbixzLHIsYT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxoPTAsZD0wLGw9MSx1PXRoaXMudG8sYz0hMTtmb3IodC5pZD09PXRoaXMuZnJvbS5pZCYmKHU9dGhpcy5mcm9tLGM9ITApO2Q8PWwmJmg8MTA7KXt2YXIgcD0uNSooZCtsKTtpZihpPXRoaXMuZ2V0UG9pbnQocCxhKSxvPU1hdGguYXRhbjIodS55LWkueSx1LngtaS54KSxuPXUuZGlzdGFuY2VUb0JvcmRlcihlLG8pLHM9TWF0aC5zcXJ0KE1hdGgucG93KGkueC11LngsMikrTWF0aC5wb3coaS55LXUueSwyKSkscj1uLXMsTWF0aC5hYnMocik8LjIpYnJlYWs7cjwwPyExPT09Yz9kPXA6bD1wOiExPT09Yz9sPXA6ZD1wLGgrK31yZXR1cm4gaS50PXAsaX19LHtrZXk6XCJfZ2V0RGlzdGFuY2VUb0JlemllckVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyxyKXt2YXIgYT0xZTksaD12b2lkIDAsZD12b2lkIDAsbD12b2lkIDAsdT12b2lkIDAsYz12b2lkIDAscD10LGY9ZTtmb3IoZD0xO2Q8MTA7ZCsrKWw9LjEqZCx1PU1hdGgucG93KDEtbCwyKSp0KzIqbCooMS1sKSpyLngrTWF0aC5wb3cobCwyKSppLGM9TWF0aC5wb3coMS1sLDIpKmUrMipsKigxLWwpKnIueStNYXRoLnBvdyhsLDIpKm8sZD4wJiYoaD10aGlzLl9nZXREaXN0YW5jZVRvTGluZShwLGYsdSxjLG4scyksYT1oPGE/aDphKSxwPXUsZj1jO3JldHVybiBhfX0se2tleTpcIl9iZXppZXJDdXJ2ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXZvaWQgMCE9PWkmJnZvaWQgMCE9PWkueCxzPXZvaWQgMCE9PW8mJnZvaWQgMCE9PW8ueDt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKHRoaXMuZnJvbVBvaW50LngsdGhpcy5mcm9tUG9pbnQueSksbiYmcz90LmJlemllckN1cnZlVG8oaS54LGkueSxvLngsby55LHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTpuP3QucXVhZHJhdGljQ3VydmVUbyhpLngsaS55LHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KTp0LmxpbmVUbyh0aGlzLnRvUG9pbnQueCx0aGlzLnRvUG9pbnQueSksdGhpcy5lbmFibGVTaGFkb3codCxlKSx0LnN0cm9rZSgpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LGUpfX0se2tleTpcImdldFZpYU5vZGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9nZXRWaWFDb29yZGluYXRlcygpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJnZXRSYW5nZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLG89MWU5LG49LTFlOSxzPTFlOSxyPS0xZTk7aWYoaS5sZW5ndGg+MClmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyllPXRbaVthXV0scz5lLnNoYXBlLmJvdW5kaW5nQm94LmxlZnQmJihzPWUuc2hhcGUuYm91bmRpbmdCb3gubGVmdCkscjxlLnNoYXBlLmJvdW5kaW5nQm94LnJpZ2h0JiYocj1lLnNoYXBlLmJvdW5kaW5nQm94LnJpZ2h0KSxvPmUuc2hhcGUuYm91bmRpbmdCb3gudG9wJiYobz1lLnNoYXBlLmJvdW5kaW5nQm94LnRvcCksbjxlLnNoYXBlLmJvdW5kaW5nQm94LmJvdHRvbSYmKG49ZS5zaGFwZS5ib3VuZGluZ0JveC5ib3R0b20pO3JldHVybiAxZTk9PT1zJiYtMWU5PT09ciYmMWU5PT09byYmLTFlOT09PW4mJihvPTAsbj0wLHM9MCxyPTApLHttaW5YOnMsbWF4WDpyLG1pblk6byxtYXhZOm59fX0se2tleTpcImdldFJhbmdlQ29yZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOltdLG89MWU5LG49LTFlOSxzPTFlOSxyPS0xZTk7aWYoaS5sZW5ndGg+MClmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKyllPXRbaVthXV0scz5lLngmJihzPWUueCkscjxlLngmJihyPWUueCksbz5lLnkmJihvPWUueSksbjxlLnkmJihuPWUueSk7cmV0dXJuIDFlOT09PXMmJi0xZTk9PT1yJiYxZTk9PT1vJiYtMWU5PT09biYmKG89MCxuPTAscz0wLHI9MCkse21pblg6cyxtYXhYOnIsbWluWTpvLG1heFk6bn19fSx7a2V5OlwiZmluZENlbnRlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4Oi41Kih0Lm1heFgrdC5taW5YKSx5Oi41Kih0Lm1heFkrdC5taW5ZKX19fSx7a2V5OlwiY2xvbmVPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT17fTtyZXR1cm4gdm9pZCAwPT09ZXx8XCJub2RlXCI9PT1lPyhoLmRlZXBFeHRlbmQoaSx0Lm9wdGlvbnMsITApLGkueD10LngsaS55PXQueSxpLmFtb3VudE9mQ29ubmVjdGlvbnM9dC5lZGdlcy5sZW5ndGgpOmguZGVlcEV4dGVuZChpLHQub3B0aW9ucywhMCksaX19XSksdH0oKTtlLmRlZmF1bHQ9ZH0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDEyNCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUwKTt0LmV4cG9ydHM9T2JqZWN0KFwielwiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuXCJTdHJpbmdcIj09byh0KT90LnNwbGl0KFwiXCIpOk9iamVjdCh0KX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUyKSxuPWkoMTcpLHM9aSg4Mykscj1pKDI2KSxhPWkoMjIpLGg9aSgzMSksZD1pKDEyOSksbD1pKDU5KSx1PWkoODUpLGM9aSgxMykoXCJpdGVyYXRvclwiKSxwPSEoW10ua2V5cyYmXCJuZXh0XCJpbltdLmtleXMoKSksZj1mdW5jdGlvbigpe3JldHVybiB0aGlzfTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlLGksbSx2LGcseSl7ZChpLGUsbSk7dmFyIGIsXyx3LHg9ZnVuY3Rpb24odCl7aWYoIXAmJnQgaW4gTSlyZXR1cm4gTVt0XTtzd2l0Y2godCl7Y2FzZVwia2V5c1wiOmNhc2VcInZhbHVlc1wiOnJldHVybi
21167BmdW5jdGlvbigpe3JldHVybiBuZXcgaSh0aGlzLHQpfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGkodGhpcyx0KX19LGs9ZStcIiBJdGVyYXRvclwiLFM9XCJ2YWx1ZXNcIj09dixEPSExLE09dC5wcm90b3R5cGUsQz1NW2NdfHxNW1wiQEBpdGVyYXRvclwiXXx8diYmTVt2XSxPPUN8fHgodiksRT12P1M/eChcImVudHJpZXNcIik6Tzp2b2lkIDAsVD1cIkFycmF5XCI9PWU/TS5lbnRyaWVzfHxDOkM7aWYoVCYmKHc9dShULmNhbGwobmV3IHQpKSkhPT1PYmplY3QucHJvdG90eXBlJiZ3Lm5leHQmJihsKHcsaywhMCksb3x8YSh3LGMpfHxyKHcsYyxmKSksUyYmQyYmXCJ2YWx1ZXNcIiE9PUMubmFtZSYmKEQ9ITAsTz1mdW5jdGlvbigpe3JldHVybiBDLmNhbGwodGhpcyl9KSxvJiYheXx8IXAmJiFEJiZNW2NdfHxyKE0sYyxPKSxoW2VdPU8saFtrXT1mLHYpaWYoYj17dmFsdWVzOlM/Tzp4KFwidmFsdWVzXCIpLGtleXM6Zz9POngoXCJrZXlzXCIpLGVudHJpZXM6RX0seSlmb3IoXyBpbiBiKV8gaW4gTXx8cyhNLF8sYltfXSk7ZWxzZSBuKG4uUCtuLkYqKHB8fEQpLGUsYik7cmV0dXJuIGJ9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxMjgpO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7aWYobyh0KSx2b2lkIDA9PT1lKXJldHVybiB0O3N3aXRjaChpKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKGkpe3JldHVybiB0LmNhbGwoZSxpKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihpLG8pe3JldHVybiB0LmNhbGwoZSxpLG8pfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKGksbyxuKXtyZXR1cm4gdC5jYWxsKGUsaSxvLG4pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdC5hcHBseShlLGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz0haSgyMSkmJiFpKDI4KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkoaSg4MikoXCJkaXZcIiksXCJhXCIse2dldDpmdW5jdGlvbigpe3JldHVybiA3fX0pLmF9KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMzIpLG49aSgxOCkuZG9jdW1lbnQscz1vKG4pJiZvKG4uY3JlYXRlRWxlbWVudCk7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiBzP24uY3JlYXRlRWxlbWVudCh0KTp7fX19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9aSgyNil9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIyKSxuPWkoMjUpLHM9aSgxMzEpKCExKSxyPWkoNTYpKFwiSUVfUFJPVE9cIik7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7dmFyIGksYT1uKHQpLGg9MCxkPVtdO2ZvcihpIGluIGEpaSE9ciYmbyhhLGkpJiZkLnB1c2goaSk7Zm9yKDtlLmxlbmd0aD5oOylvKGEsaT1lW2grK10pJiYofnMoZCxpKXx8ZC5wdXNoKGkpKTtyZXR1cm4gZH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIyKSxuPWkoNDEpLHM9aSg1NikoXCJJRV9QUk9UT1wiKSxyPU9iamVjdC5wcm90b3R5cGU7dC5leHBvcnRzPU9iamVjdC5nZXRQcm90b3R5cGVPZnx8ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bih0KSxvKHQscyk/dFtzXTpcImZ1bmN0aW9uXCI9PXR5cGVvZiB0LmNvbnN0cnVjdG9yJiZ0IGluc3RhbmNlb2YgdC5jb25zdHJ1Y3Rvcj90LmNvbnN0cnVjdG9yLnByb3RvdHlwZTp0IGluc3RhbmNlb2YgT2JqZWN0P3I6bnVsbH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUwKSxuPWkoMTMpKFwidG9TdHJpbmdUYWdcIikscz1cIkFyZ3VtZW50c1wiPT1vKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30oKSkscj1mdW5jdGlvbih0LGUpe3RyeXtyZXR1cm4gdFtlXX1jYXRjaCh0KXt9fTt0LmV4cG9ydHM9ZnVuY3Rpb24odCl7dmFyIGUsaSxhO3JldHVybiB2b2lkIDA9PT10P1wiVW5kZWZpbmVkXCI6bnVsbD09PXQ/XCJOdWxsXCI6XCJzdHJpbmdcIj09dHlwZW9mKGk9cihlPU9iamVjdCh0KSxuKSk/aTpzP28oZSk6XCJPYmplY3RcIj09KGE9byhlKSkmJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuY2FsbGVlP1wiQXJndW1lbnRzXCI6YX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE3KSxuPWkoNykscz1pKDI4KTt0LmV4cG9ydHM9ZnVuY3Rpb24odCxlKXt2YXIgaT0obi5PYmplY3R8fHt9KVt0XXx8T2JqZWN0W3RdLHI9e307clt0XT1lKGkpLG8oby5TK28uRipzKGZ1bmN0aW9uKCl7aSgxKX0pLFwiT2JqZWN0XCIscil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg4NCksbj1pKDU4KS5jb25jYXQoXCJsZW5ndGhcIixcInByb3RvdHlwZVwiKTtlLmY9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXN8fGZ1bmN0aW9uKHQpe3JldHVybiBvKHQsbil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0Miksbj1pKDM5KSxzPWkoMjUpLHI9aSg1MyksYT1pKDIyKSxoPWkoODEpLGQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtlLmY9aSgyMSk/ZDpmdW5jdGlvbih0LGUpe2lmKHQ9cyh0KSxlPXIoZSwhMCksaCl0cnl7cmV0dXJuIGQodCxlKX1jYXRjaCh0KXt9aWYoYSh0LGUpKXJldHVybiBuKCFvLmYuY2FsbCh0LGUpLHRbZV0pfX0sZnVuY3Rpb24odCxlLGkpe3QuZXhwb3J0cz17ZGVmYXVsdDppKDE2MiksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSl7dGhpcy54PXZvaWQgMCE9PXQ/dDowLHRoaXMueT12b2lkIDAhPT1lP2U6MH10LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcihcIk5vIGNvbnRhaW5lciBlbGVtZW50IGRlZmluZWRcIik7aWYodGhpcy5jb250YWluZXI9dCx0aGlzLnZpc2libGU9IWV8fHZvaWQgMD09ZS52aXNpYmxlfHxlLnZpc2libGUsdGhpcy52aXNpYmxlKXt0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJESVZcIiksdGhpcy5mcmFtZS5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lKSx0aGlzLmZyYW1lLnByZXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUucHJldi50eXBlPVwiQlVUVE9OXCIsdGhpcy5mcmFtZS5wcmV2LnZhbHVlPVwiUHJldlwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5wcmV2KSx0aGlzLmZyYW1lLnBsYXk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUucGxheS50eX
21167BlPVwiQlVUVE9OXCIsdGhpcy5mcmFtZS5wbGF5LnZhbHVlPVwiUGxheVwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5wbGF5KSx0aGlzLmZyYW1lLm5leHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUubmV4dC50eXBlPVwiQlVUVE9OXCIsdGhpcy5mcmFtZS5uZXh0LnZhbHVlPVwiTmV4dFwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5uZXh0KSx0aGlzLmZyYW1lLmJhcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiSU5QVVRcIiksdGhpcy5mcmFtZS5iYXIudHlwZT1cIkJVVFRPTlwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIix0aGlzLmZyYW1lLmJhci5zdHlsZS5ib3JkZXI9XCIxcHggc29saWQgcmVkXCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUud2lkdGg9XCIxMDBweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmhlaWdodD1cIjZweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJvcmRlclJhZGl1cz1cIjJweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLk1vekJvcmRlclJhZGl1cz1cIjJweFwiLHRoaXMuZnJhbWUuYmFyLnN0eWxlLmJvcmRlcj1cIjFweCBzb2xpZCAjN0Y3RjdGXCIsdGhpcy5mcmFtZS5iYXIuc3R5bGUuYmFja2dyb3VuZENvbG9yPVwiI0U1RTVFNVwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZS5iYXIpLHRoaXMuZnJhbWUuc2xpZGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIklOUFVUXCIpLHRoaXMuZnJhbWUuc2xpZGUudHlwZT1cIkJVVFRPTlwiLHRoaXMuZnJhbWUuc2xpZGUuc3R5bGUubWFyZ2luPVwiMHB4XCIsdGhpcy5mcmFtZS5zbGlkZS52YWx1ZT1cIiBcIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmZyYW1lLnNsaWRlLnN0eWxlLmxlZnQ9XCItMTAwcHhcIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuc2xpZGUpO3ZhciBpPXRoaXM7dGhpcy5mcmFtZS5zbGlkZS5vbm1vdXNlZG93bj1mdW5jdGlvbih0KXtpLl9vbk1vdXNlRG93bih0KX0sdGhpcy5mcmFtZS5wcmV2Lm9uY2xpY2s9ZnVuY3Rpb24odCl7aS5wcmV2KHQpfSx0aGlzLmZyYW1lLnBsYXkub25jbGljaz1mdW5jdGlvbih0KXtpLnRvZ2dsZVBsYXkodCl9LHRoaXMuZnJhbWUubmV4dC5vbmNsaWNrPWZ1bmN0aW9uKHQpe2kubmV4dCh0KX19dGhpcy5vbkNoYW5nZUNhbGxiYWNrPXZvaWQgMCx0aGlzLnZhbHVlcz1bXSx0aGlzLmluZGV4PXZvaWQgMCx0aGlzLnBsYXlUaW1lb3V0PXZvaWQgMCx0aGlzLnBsYXlJbnRlcnZhbD0xZTMsdGhpcy5wbGF5TG9vcD0hMH12YXIgbj1pKDIpO28ucHJvdG90eXBlLnByZXY9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldEluZGV4KCk7dD4wJiYodC0tLHRoaXMuc2V0SW5kZXgodCkpfSxvLnByb3RvdHlwZS5uZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRJbmRleCgpO3Q8dGhpcy52YWx1ZXMubGVuZ3RoLTEmJih0KyssdGhpcy5zZXRJbmRleCh0KSl9LG8ucHJvdG90eXBlLnBsYXlOZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IERhdGUsZT10aGlzLmdldEluZGV4KCk7ZTx0aGlzLnZhbHVlcy5sZW5ndGgtMT8oZSsrLHRoaXMuc2V0SW5kZXgoZSkpOnRoaXMucGxheUxvb3AmJihlPTAsdGhpcy5zZXRJbmRleChlKSk7dmFyIGk9bmV3IERhdGUsbz1pLXQsbj1NYXRoLm1heCh0aGlzLnBsYXlJbnRlcnZhbC1vLDApLHM9dGhpczt0aGlzLnBsYXlUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXtzLnBsYXlOZXh0KCl9LG4pfSxvLnByb3RvdHlwZS50b2dnbGVQbGF5PWZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5wbGF5VGltZW91dD90aGlzLnBsYXkoKTp0aGlzLnN0b3AoKX0sby5wcm90b3R5cGUucGxheT1mdW5jdGlvbigpe3RoaXMucGxheVRpbWVvdXR8fCh0aGlzLnBsYXlOZXh0KCksdGhpcy5mcmFtZSYmKHRoaXMuZnJhbWUucGxheS52YWx1ZT1cIlN0b3BcIikpfSxvLnByb3RvdHlwZS5zdG9wPWZ1bmN0aW9uKCl7Y2xlYXJJbnRlcnZhbCh0aGlzLnBsYXlUaW1lb3V0KSx0aGlzLnBsYXlUaW1lb3V0PXZvaWQgMCx0aGlzLmZyYW1lJiYodGhpcy5mcmFtZS5wbGF5LnZhbHVlPVwiUGxheVwiKX0sby5wcm90b3R5cGUuc2V0T25DaGFuZ2VDYWxsYmFjaz1mdW5jdGlvbih0KXt0aGlzLm9uQ2hhbmdlQ2FsbGJhY2s9dH0sby5wcm90b3R5cGUuc2V0UGxheUludGVydmFsPWZ1bmN0aW9uKHQpe3RoaXMucGxheUludGVydmFsPXR9LG8ucHJvdG90eXBlLmdldFBsYXlJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBsYXlJbnRlcnZhbH0sby5wcm90b3R5cGUuc2V0UGxheUxvb3A9ZnVuY3Rpb24odCl7dGhpcy5wbGF5TG9vcD10fSxvLnByb3RvdHlwZS5vbkNoYW5nZT1mdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMub25DaGFuZ2VDYWxsYmFjayYmdGhpcy5vbkNoYW5nZUNhbGxiYWNrKCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHRoaXMuZnJhbWUpe3RoaXMuZnJhbWUuYmFyLnN0eWxlLnRvcD10aGlzLmZyYW1lLmNsaWVudEhlaWdodC8yLXRoaXMuZnJhbWUuYmFyLm9mZnNldEhlaWdodC8yK1wicHhcIix0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aD10aGlzLmZyYW1lLmNsaWVudFdpZHRoLXRoaXMuZnJhbWUucHJldi5jbGllbnRXaWR0aC10aGlzLmZyYW1lLnBsYXkuY2xpZW50V2lkdGgtdGhpcy5mcmFtZS5uZXh0LmNsaWVudFdpZHRoLTMwK1wicHhcIjt2YXIgdD10aGlzLmluZGV4VG9MZWZ0KHRoaXMuaW5kZXgpO3RoaXMuZnJhbWUuc2xpZGUuc3R5bGUubGVmdD10K1wicHhcIn19LG8ucHJvdG90eXBlLnNldFZhbHVlcz1mdW5jdGlvbih0KXt0aGlzLnZhbHVlcz10LHRoaXMudmFsdWVzLmxlbmd0aD4wP3RoaXMuc2V0SW5kZXgoMCk6dGhpcy5pbmRleD12b2lkIDB9LG8ucHJvdG90eXBlLnNldEluZGV4PWZ1bmN0aW9uKHQpe2lmKCEodDx0aGlzLnZhbHVlcy5sZW5ndGgpKXRocm93IG5ldyBFcnJvcihcIkluZGV4IG91dCBvZiByYW5nZVwiKTt0aGlzLmluZGV4PXQsdGhpcy5yZWRyYXcoKSx0aGlzLm9uQ2hhbmdlKCl9LG8ucHJvdG90eXBlLmdldEluZGV4PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5kZXh9LG8ucHJvdG90eXBlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZhbHVlc1t0aGlzLmluZGV4XX0sby5wcm90b3R5cGUuX29uTW91c2VEb3duPWZ1bmN0aW9uKHQpe2lmKHQud2hpY2g/MT09PXQud2hpY2g6MT09PXQuYnV0dG9uKXt0aGlzLnN0YXJ0Q2xpZW50WD10LmNsaWVudFgsdGhpcy5zdGFydFNsaWRlWD1wYXJzZUZsb2F0KHRoaXMuZnJhbWUuc2xpZGUuc3R5bGUubGVmdCksdGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9XCJtb3ZlXCI7dmFyIGU9dGhpczt0aGlzLm9ubW91c2Vtb3ZlPWZ1bmN0aW9uKHQpe2UuX29uTW91c2VNb3ZlKHQpfSx0aGlzLm9ubW91c2V1cD1mdW5jdGlvbih0KXtlLl9vbk1vdXNlVXAodCl9LG4uYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCxcIm1vdXNlbW92ZVwiLHRoaXMub25tb3VzZW1vdmUpLG4uYWRkRXZlbnRMaXN0ZW5lcihkb2N1bWVudCxcIm1vdXNldXBcIix0aGlzLm9ubW91c2V1cCksbi5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLmxlZnRUb0luZGV4PWZ1bmN0aW9uKHQpe3ZhciBlPXBhcnNlRmxvYXQodGhpcy5mcmFtZS5iYXIuc3R5bGUud2lkdGgpLXRoaXMuZnJhbWUuc2xpZGUuY2xpZW50V2lkdGgtMTAsaT10LTMsbz1NYXRoLnJvdW5kKGkvZSoodGhpcy52YWx1ZXMubGVuZ3RoLTEpKTtyZXR1cm4gbzwwJiYobz0wKSxvPnRoaXMudmFsdWVzLmxlbmd0aC0xJiYobz10aGlzLnZhbHVlcy5sZW5ndGgtMSksb30sby5wcm90b3R5cGUuaW5kZXhUb0xlZnQ9ZnVuY3Rpb24odCl7dmFyIGU9cGFyc2VGbG9hdCh0aGlzLmZyYW1lLmJhci5zdHlsZS53aWR0aCktdGhpcy5mcmFtZS5zbGlkZS5jbGllbnRXaWR0aC0xMDtyZXR1cm4gdC8odGhpcy52YWx1ZXMubGVuZ3RoLTEpKmUrM30sby5wcm90b3R5cGUuX29uTW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2xpZW50WC10aGlzLnN0YXJ0Q2xpZW50WCxpPXRoaXMuc3RhcnRTbGlkZVgrZSxvPXR
21167oaXMubGVmdFRvSW5kZXgoaSk7dGhpcy5zZXRJbmRleChvKSxuLnByZXZlbnREZWZhdWx0KCl9LG8ucHJvdG90eXBlLl9vbk1vdXNlVXA9ZnVuY3Rpb24odCl7dGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9XCJhdXRvXCIsbi5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwibW91c2Vtb3ZlXCIsdGhpcy5vbm1vdXNlbW92ZSksbi5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwibW91c2V1cFwiLHRoaXMub25tb3VzZXVwKSxuLnByZXZlbnREZWZhdWx0KCl9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSxvKXt0aGlzLl9zdGFydD0wLHRoaXMuX2VuZD0wLHRoaXMuX3N0ZXA9MSx0aGlzLnByZXR0eVN0ZXA9ITAsdGhpcy5wcmVjaXNpb249NSx0aGlzLl9jdXJyZW50PTAsdGhpcy5zZXRSYW5nZSh0LGUsaSxvKX1vLnByb3RvdHlwZS5pc051bWVyaWM9ZnVuY3Rpb24odCl7cmV0dXJuIWlzTmFOKHBhcnNlRmxvYXQodCkpJiZpc0Zpbml0ZSh0KX0sby5wcm90b3R5cGUuc2V0UmFuZ2U9ZnVuY3Rpb24odCxlLGksbyl7aWYoIXRoaXMuaXNOdW1lcmljKHQpKXRocm93IG5ldyBFcnJvcihcIlBhcmFtZXRlciAnc3RhcnQnIGlzIG5vdCBudW1lcmljOyB2YWx1ZTogXCIrdCk7aWYoIXRoaXMuaXNOdW1lcmljKGUpKXRocm93IG5ldyBFcnJvcihcIlBhcmFtZXRlciAnZW5kJyBpcyBub3QgbnVtZXJpYzsgdmFsdWU6IFwiK3QpO2lmKCF0aGlzLmlzTnVtZXJpYyhpKSl0aHJvdyBuZXcgRXJyb3IoXCJQYXJhbWV0ZXIgJ3N0ZXAnIGlzIG5vdCBudW1lcmljOyB2YWx1ZTogXCIrdCk7dGhpcy5fc3RhcnQ9dHx8MCx0aGlzLl9lbmQ9ZXx8MCx0aGlzLnNldFN0ZXAoaSxvKX0sby5wcm90b3R5cGUuc2V0U3RlcD1mdW5jdGlvbih0LGUpe3ZvaWQgMD09PXR8fHQ8PTB8fCh2b2lkIDAhPT1lJiYodGhpcy5wcmV0dHlTdGVwPWUpLCEwPT09dGhpcy5wcmV0dHlTdGVwP3RoaXMuX3N0ZXA9by5jYWxjdWxhdGVQcmV0dHlTdGVwKHQpOnRoaXMuX3N0ZXA9dCl9LG8uY2FsY3VsYXRlUHJldHR5U3RlcD1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5sb2codCkvTWF0aC5MTjEwfSxpPU1hdGgucG93KDEwLE1hdGgucm91bmQoZSh0KSkpLG89MipNYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodC8yKSkpLG49NSpNYXRoLnBvdygxMCxNYXRoLnJvdW5kKGUodC81KSkpLHM9aTtyZXR1cm4gTWF0aC5hYnMoby10KTw9TWF0aC5hYnMocy10KSYmKHM9byksTWF0aC5hYnMobi10KTw9TWF0aC5hYnMocy10KSYmKHM9biksczw9MCYmKHM9MSksc30sby5wcm90b3R5cGUuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiBwYXJzZUZsb2F0KHRoaXMuX2N1cnJlbnQudG9QcmVjaXNpb24odGhpcy5wcmVjaXNpb24pKX0sby5wcm90b3R5cGUuZ2V0U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwfSxvLnByb3RvdHlwZS5zdGFydD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMSksdGhpcy5fY3VycmVudD10aGlzLl9zdGFydC10aGlzLl9zdGFydCV0aGlzLl9zdGVwLHQmJnRoaXMuZ2V0Q3VycmVudCgpPHRoaXMuX3N0YXJ0JiZ0aGlzLm5leHQoKX0sby5wcm90b3R5cGUubmV4dD1mdW5jdGlvbigpe3RoaXMuX2N1cnJlbnQrPXRoaXMuX3N0ZXB9LG8ucHJvdG90eXBlLmVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50PnRoaXMuX2VuZH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gbih0KXtyZXR1cm4gdm9pZCAwPT09dHx8XCJcIj09PXR8fFwic3RyaW5nXCIhPXR5cGVvZiB0P3Q6dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gdm9pZCAwPT09dHx8XCJcIj09PXQ/ZTp0K24oZSl9ZnVuY3Rpb24gcih0LGUsaSxvKXtmb3IodmFyIG4scixhPTA7YTxpLmxlbmd0aDsrK2Epbj1pW2FdLHI9cyhvLG4pLGVbcl09dFtuXX1mdW5jdGlvbiBhKHQsZSxpLG8pe2Zvcih2YXIgbixyLGE9MDthPGkubGVuZ3RoOysrYSluPWlbYV0sdm9pZCAwIT09dFtuXSYmKHI9cyhvLG4pLGVbcl09dFtuXSl9ZnVuY3Rpb24gaCh0LGUpe2lmKHZvaWQgMD09PXR8fG8odCkpdGhyb3cgbmV3IEVycm9yKFwiTm8gREVGQVVMVFMgcGFzc2VkXCIpO2lmKHZvaWQgMD09PWUpdGhyb3cgbmV3IEVycm9yKFwiTm8gZHN0IHBhc3NlZFwiKTtDPXQscih0LGUsRCkscih0LGUsTSxcImRlZmF1bHRcIiksbCh0LGUpLGUubWFyZ2luPTEwLGUuc2hvd0dyYXlCb3R0b209ITEsZS5zaG93VG9vbHRpcD0hMSxlLm9uY2xpY2tfY2FsbGJhY2s9bnVsbCxlLmV5ZT1uZXcgeCgwLDAsLTEpfWZ1bmN0aW9uIGQodCxlKXtpZih2b2lkIDAhPT10KXtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcihcIk5vIGRzdCBwYXNzZWRcIik7aWYodm9pZCAwPT09Q3x8byhDKSl0aHJvdyBuZXcgRXJyb3IoXCJERUZBVUxUUyBub3Qgc2V0IGZvciBtb2R1bGUgU2V0dGluZ3NcIik7YSh0LGUsRCksYSh0LGUsTSxcImRlZmF1bHRcIiksbCh0LGUpfX1mdW5jdGlvbiBsKHQsZSl7dm9pZCAwIT09dC5iYWNrZ3JvdW5kQ29sb3ImJm0odC5iYWNrZ3JvdW5kQ29sb3IsZSksdih0LmRhdGFDb2xvcixlKSxmKHQuc3R5bGUsZSksdSh0LnNob3dMZWdlbmQsZSksZyh0LmNhbWVyYVBvc2l0aW9uLGUpLHZvaWQgMCE9PXQudG9vbHRpcCYmKGUuc2hvd1Rvb2x0aXA9dC50b29sdGlwKSx2b2lkIDAhPXQub25jbGljayYmKGUub25jbGlja19jYWxsYmFjaz10Lm9uY2xpY2spLHZvaWQgMCE9PXQudG9vbHRpcFN0eWxlJiZfLnNlbGVjdGl2ZURlZXBFeHRlbmQoW1widG9vbHRpcFN0eWxlXCJdLGUsdCl9ZnVuY3Rpb24gdSh0LGUpe2lmKHZvaWQgMD09PXQpe2lmKHZvaWQgMD09PUMuc2hvd0xlZ2VuZCl7dmFyIGk9ZS5zdHlsZT09PWsuRE9UQ09MT1J8fGUuc3R5bGU9PT1rLkRPVFNJWkU7ZS5zaG93TGVnZW5kPWl9fWVsc2UgZS5zaG93TGVnZW5kPXR9ZnVuY3Rpb24gYyh0KXt2YXIgZT1TW3RdO3JldHVybiB2b2lkIDA9PT1lPy0xOmV9ZnVuY3Rpb24gcCh0KXt2YXIgZT0hMTtmb3IodmFyIGkgaW4gaylpZihrW2ldPT09dCl7ZT0hMDticmVha31yZXR1cm4gZX1mdW5jdGlvbiBmKHQsZSl7aWYodm9pZCAwIT09dCl7dmFyIGk7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKC0xPT09KGk9Yyh0KSkpdGhyb3cgbmV3IEVycm9yKFwiU3R5bGUgJ1wiK3QrXCInIGlzIGludmFsaWRcIil9ZWxzZXtpZighcCh0KSl0aHJvdyBuZXcgRXJyb3IoXCJTdHlsZSAnXCIrdCtcIicgaXMgaW52YWxpZFwiKTtpPXR9ZS5zdHlsZT1pfX1mdW5jdGlvbiBtKHQsZSl7dmFyIGk9XCJ3aGl0ZVwiLG89XCJncmF5XCIsbj0xO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KWk9dCxvPVwibm9uZVwiLG49MDtlbHNle2lmKFwib2JqZWN0XCIhPT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGIuZGVmYXVsdCkodCkpKXRocm93IG5ldyBFcnJvcihcIlVuc3VwcG9ydGVkIHR5cGUgb2YgYmFja2dyb3VuZENvbG9yXCIpO3ZvaWQgMCE9PXQuZmlsbCYmKGk9dC5maWxsKSx2b2lkIDAhPT10LnN0cm9rZSYmKG89dC5zdHJva2UpLHZvaWQgMCE9PXQuc3Ryb2tlV2lkdGgmJihuPXQuc3Ryb2tlV2lkdGgpfWUuZnJhbWUuc3R5bGUuYmFja2dyb3VuZENvbG9yPWksZS5mcmFtZS5zdHlsZS5ib3JkZXJDb2xvcj1vLGUuZnJhbWUuc3R5bGUuYm9yZGVyV2lkdGg9bitcInB4XCIsZS5mcmFtZS5zdHlsZS5ib3JkZXJTdHlsZT1cInNvbGlkXCJ9ZnVuY3Rpb24gdih0LGUpe3ZvaWQgMCE9PXQmJih2b2lkIDA9PT1lLmRhdGFDb2xvciYmKGUuZGF0YUNvbG9yPXt9KSxcInN0cmluZ1wiPT10eXBlb2YgdD8oZS5kYXRhQ29sb3IuZmlsbD10LGUuZGF0YUNvbG9yLnN0cm9rZT10KToodC5maWxsJiYoZS5kYXRhQ29sb3IuZmlsbD10LmZpbGwpLHQuc3Ryb2tlJiYoZS5kYXRhQ29sb3Iuc3Ryb2tlPXQuc3Ryb2tlKSx2b2lkIDAhPT10LnN0cm9rZVdpZHRoJiYoZS5kYXRhQ29sb3Iuc3Ryb2tlV2lkdGg9dC5zdHJva2VXaWR0aCkpKX1mdW5jdGlvbiBnKHQsZSl7dmFyIGk9dDt2b2lkIDAhPT1pJiYodm9p
21167ZCAwPT09ZS5jYW1lcmEmJihlLmNhbWVyYT1uZXcgdyksZS5jYW1lcmEuc2V0QXJtUm90YXRpb24oaS5ob3Jpem9udGFsLGkudmVydGljYWwpLGUuY2FtZXJhLnNldEFybUxlbmd0aChpLmRpc3RhbmNlKSl9dmFyIHk9aSg2KSxiPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0oeSksXz1pKDIpLHc9aSg5NSkseD1pKDM0KSxrPXtCQVI6MCxCQVJDT0xPUjoxLEJBUlNJWkU6MixET1Q6MyxET1RMSU5FOjQsRE9UQ09MT1I6NSxET1RTSVpFOjYsR1JJRDo3LExJTkU6OCxTVVJGQUNFOjl9LFM9e2RvdDprLkRPVCxcImRvdC1saW5lXCI6ay5ET1RMSU5FLFwiZG90LWNvbG9yXCI6ay5ET1RDT0xPUixcImRvdC1zaXplXCI6ay5ET1RTSVpFLGxpbmU6ay5MSU5FLGdyaWQ6ay5HUklELHN1cmZhY2U6ay5TVVJGQUNFLGJhcjprLkJBUixcImJhci1jb2xvclwiOmsuQkFSQ09MT1IsXCJiYXItc2l6ZVwiOmsuQkFSU0laRX0sRD1bXCJ3aWR0aFwiLFwiaGVpZ2h0XCIsXCJmaWx0ZXJMYWJlbFwiLFwibGVnZW5kTGFiZWxcIixcInhMYWJlbFwiLFwieUxhYmVsXCIsXCJ6TGFiZWxcIixcInhWYWx1ZUxhYmVsXCIsXCJ5VmFsdWVMYWJlbFwiLFwielZhbHVlTGFiZWxcIixcInNob3dYQXhpc1wiLFwic2hvd1lBeGlzXCIsXCJzaG93WkF4aXNcIixcInNob3dHcmlkXCIsXCJzaG93UGVyc3BlY3RpdmVcIixcInNob3dTaGFkb3dcIixcImtlZXBBc3BlY3RSYXRpb1wiLFwidmVydGljYWxSYXRpb1wiLFwiZG90U2l6ZVJhdGlvXCIsXCJkb3RTaXplTWluRnJhY3Rpb25cIixcImRvdFNpemVNYXhGcmFjdGlvblwiLFwic2hvd0FuaW1hdGlvbkNvbnRyb2xzXCIsXCJhbmltYXRpb25JbnRlcnZhbFwiLFwiYW5pbWF0aW9uUHJlbG9hZFwiLFwiYW5pbWF0aW9uQXV0b1N0YXJ0XCIsXCJheGlzQ29sb3JcIixcImdyaWRDb2xvclwiLFwieENlbnRlclwiLFwieUNlbnRlclwiXSxNPVtcInhCYXJXaWR0aFwiLFwieUJhcldpZHRoXCIsXCJ2YWx1ZU1pblwiLFwidmFsdWVNYXhcIixcInhNaW5cIixcInhNYXhcIixcInhTdGVwXCIsXCJ5TWluXCIsXCJ5TWF4XCIsXCJ5U3RlcFwiLFwiek1pblwiLFwiek1heFwiLFwielN0ZXBcIl0sQz12b2lkIDA7dC5leHBvcnRzLlNUWUxFPWssdC5leHBvcnRzLnNldERlZmF1bHRzPWgsdC5leHBvcnRzLnNldE9wdGlvbnM9ZCx0LmV4cG9ydHMuc2V0Q2FtZXJhUG9zaXRpb249Z30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8oKXt0aGlzLmFybUxvY2F0aW9uPW5ldyByLHRoaXMuYXJtUm90YXRpb249e30sdGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsPTAsdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD0wLHRoaXMuYXJtTGVuZ3RoPTEuNyx0aGlzLmNhbWVyYU9mZnNldD1uZXcgcix0aGlzLm9mZnNldE11bHRpcGxpZXI9LjYsdGhpcy5jYW1lcmFMb2NhdGlvbj1uZXcgcix0aGlzLmNhbWVyYVJvdGF0aW9uPW5ldyByKC41Kk1hdGguUEksMCwwKSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9dmFyIG49aSgxNjUpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMzQpO28ucHJvdG90eXBlLnNldE9mZnNldD1mdW5jdGlvbih0LGUpe3ZhciBpPU1hdGguYWJzLG89cy5kZWZhdWx0LG49dGhpcy5vZmZzZXRNdWx0aXBsaWVyLHI9dGhpcy5hcm1MZW5ndGgqbjtpKHQpPnImJih0PW8odCkqciksaShlKT5yJiYoZT1vKGUpKnIpLHRoaXMuY2FtZXJhT2Zmc2V0Lng9dCx0aGlzLmNhbWVyYU9mZnNldC55PWUsdGhpcy5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbigpfSxvLnByb3RvdHlwZS5nZXRPZmZzZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW1lcmFPZmZzZXR9LG8ucHJvdG90eXBlLnNldEFybUxvY2F0aW9uPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmFybUxvY2F0aW9uLng9dCx0aGlzLmFybUxvY2F0aW9uLnk9ZSx0aGlzLmFybUxvY2F0aW9uLno9aSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCl9LG8ucHJvdG90eXBlLnNldEFybVJvdGF0aW9uPWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dCYmKHRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbD10KSx2b2lkIDAhPT1lJiYodGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD1lLHRoaXMuYXJtUm90YXRpb24udmVydGljYWw8MCYmKHRoaXMuYXJtUm90YXRpb24udmVydGljYWw9MCksdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD4uNSpNYXRoLlBJJiYodGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbD0uNSpNYXRoLlBJKSksdm9pZCAwPT09dCYmdm9pZCAwPT09ZXx8dGhpcy5jYWxjdWxhdGVDYW1lcmFPcmllbnRhdGlvbigpfSxvLnByb3RvdHlwZS5nZXRBcm1Sb3RhdGlvbj1mdW5jdGlvbigpe3ZhciB0PXt9O3JldHVybiB0Lmhvcml6b250YWw9dGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsLHQudmVydGljYWw9dGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbCx0fSxvLnByb3RvdHlwZS5zZXRBcm1MZW5ndGg9ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKHRoaXMuYXJtTGVuZ3RoPXQsdGhpcy5hcm1MZW5ndGg8LjcxJiYodGhpcy5hcm1MZW5ndGg9LjcxKSx0aGlzLmFybUxlbmd0aD41JiYodGhpcy5hcm1MZW5ndGg9NSksdGhpcy5zZXRPZmZzZXQodGhpcy5jYW1lcmFPZmZzZXQueCx0aGlzLmNhbWVyYU9mZnNldC55KSx0aGlzLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uKCkpfSxcbiAgICBvLnByb3RvdHlwZS5nZXRBcm1MZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcm1MZW5ndGh9LG8ucHJvdG90eXBlLmdldENhbWVyYUxvY2F0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhTG9jYXRpb259LG8ucHJvdG90eXBlLmdldENhbWVyYVJvdGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FtZXJhUm90YXRpb259LG8ucHJvdG90eXBlLmNhbGN1bGF0ZUNhbWVyYU9yaWVudGF0aW9uPWZ1bmN0aW9uKCl7dGhpcy5jYW1lcmFMb2NhdGlvbi54PXRoaXMuYXJtTG9jYXRpb24ueC10aGlzLmFybUxlbmd0aCpNYXRoLnNpbih0aGlzLmFybVJvdGF0aW9uLmhvcml6b250YWwpKk1hdGguY29zKHRoaXMuYXJtUm90YXRpb24udmVydGljYWwpLHRoaXMuY2FtZXJhTG9jYXRpb24ueT10aGlzLmFybUxvY2F0aW9uLnktdGh
21167pcy5hcm1MZW5ndGgqTWF0aC5jb3ModGhpcy5hcm1Sb3RhdGlvbi5ob3Jpem9udGFsKSpNYXRoLmNvcyh0aGlzLmFybVJvdGF0aW9uLnZlcnRpY2FsKSx0aGlzLmNhbWVyYUxvY2F0aW9uLno9dGhpcy5hcm1Mb2NhdGlvbi56K3RoaXMuYXJtTGVuZ3RoKk1hdGguc2luKHRoaXMuYXJtUm90YXRpb24udmVydGljYWwpLHRoaXMuY2FtZXJhUm90YXRpb24ueD1NYXRoLlBJLzItdGhpcy5hcm1Sb3RhdGlvbi52ZXJ0aWNhbCx0aGlzLmNhbWVyYVJvdGF0aW9uLnk9MCx0aGlzLmNhbWVyYVJvdGF0aW9uLno9LXRoaXMuYXJtUm90YXRpb24uaG9yaXpvbnRhbDt2YXIgdD10aGlzLmNhbWVyYVJvdGF0aW9uLngsZT10aGlzLmNhbWVyYVJvdGF0aW9uLnosaT10aGlzLmNhbWVyYU9mZnNldC54LG89dGhpcy5jYW1lcmFPZmZzZXQueSxuPU1hdGguc2luLHM9TWF0aC5jb3M7dGhpcy5jYW1lcmFMb2NhdGlvbi54PXRoaXMuY2FtZXJhTG9jYXRpb24ueCtpKnMoZSkrbyotbihlKSpzKHQpLHRoaXMuY2FtZXJhTG9jYXRpb24ueT10aGlzLmNhbWVyYUxvY2F0aW9uLnkraSpuKGUpK28qcyhlKSpzKHQpLHRoaXMuY2FtZXJhTG9jYXRpb24uej10aGlzLmNhbWVyYUxvY2F0aW9uLnorbypuKHQpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe3RoaXMuZGF0YUdyb3VwPXQsdGhpcy5jb2x1bW49ZSx0aGlzLmdyYXBoPWksdGhpcy5pbmRleD12b2lkIDAsdGhpcy52YWx1ZT12b2lkIDAsdGhpcy52YWx1ZXM9dC5nZXREaXN0aW5jdFZhbHVlcyh0aGlzLmNvbHVtbiksdGhpcy52YWx1ZXMubGVuZ3RoPjAmJnRoaXMuc2VsZWN0VmFsdWUoMCksdGhpcy5kYXRhUG9pbnRzPVtdLHRoaXMubG9hZGVkPSExLHRoaXMub25Mb2FkQ2FsbGJhY2s9dm9pZCAwLGkuYW5pbWF0aW9uUHJlbG9hZD8odGhpcy5sb2FkZWQ9ITEsdGhpcy5sb2FkSW5CYWNrZ3JvdW5kKCkpOnRoaXMubG9hZGVkPSEwfXZhciBuPWkoMTIpO28ucHJvdG90eXBlLmlzTG9hZGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9hZGVkfSxvLnByb3RvdHlwZS5nZXRMb2FkZWRQcm9ncmVzcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLnZhbHVlcy5sZW5ndGgsZT0wO3RoaXMuZGF0YVBvaW50c1tlXTspZSsrO3JldHVybiBNYXRoLnJvdW5kKGUvdCoxMDApfSxvLnByb3RvdHlwZS5nZXRMYWJlbD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmdyYXBoLmZpbHRlckxhYmVsfSxvLnByb3RvdHlwZS5nZXRDb2x1bW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb2x1bW59LG8ucHJvdG90eXBlLmdldFNlbGVjdGVkVmFsdWU9ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT10aGlzLmluZGV4KXJldHVybiB0aGlzLnZhbHVlc1t0aGlzLmluZGV4XX0sby5wcm90b3R5cGUuZ2V0VmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzfSxvLnByb3RvdHlwZS5nZXRWYWx1ZT1mdW5jdGlvbih0KXtpZih0Pj10aGlzLnZhbHVlcy5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiSW5kZXggb3V0IG9mIHJhbmdlXCIpO3JldHVybiB0aGlzLnZhbHVlc1t0XX0sby5wcm90b3R5cGUuX2dldERhdGFQb2ludHM9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dCYmKHQ9dGhpcy5pbmRleCksdm9pZCAwPT09dClyZXR1cm5bXTt2YXIgZTtpZih0aGlzLmRhdGFQb2ludHNbdF0pZT10aGlzLmRhdGFQb2ludHNbdF07ZWxzZXt2YXIgaT17fTtpLmNvbHVtbj10aGlzLmNvbHVtbixpLnZhbHVlPXRoaXMudmFsdWVzW3RdO3ZhciBvPW5ldyBuKHRoaXMuZGF0YUdyb3VwLmdldERhdGFTZXQoKSx7ZmlsdGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0W2kuY29sdW1uXT09aS52YWx1ZX19KS5nZXQoKTtlPXRoaXMuZGF0YUdyb3VwLl9nZXREYXRhUG9pbnRzKG8pLHRoaXMuZGF0YVBvaW50c1t0XT1lfXJldHVybiBlfSxvLnByb3RvdHlwZS5zZXRPbkxvYWRDYWxsYmFjaz1mdW5jdGlvbih0KXt0aGlzLm9uTG9hZENhbGxiYWNrPXR9LG8ucHJvdG90eXBlLnNlbGVjdFZhbHVlPWZ1bmN0aW9uKHQpe2lmKHQ+PXRoaXMudmFsdWVzLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJJbmRleCBvdXQgb2YgcmFuZ2VcIik7dGhpcy5pbmRleD10LHRoaXMudmFsdWU9dGhpcy52YWx1ZXNbdF19LG8ucHJvdG90eXBlLmxvYWRJbkJhY2tncm91bmQ9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9MCk7dmFyIGU9dGhpcy5ncmFwaC5mcmFtZTtpZih0PHRoaXMudmFsdWVzLmxlbmd0aCl7dm9pZCAwPT09ZS5wcm9ncmVzcyYmKGUucHJvZ3Jlc3M9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSxlLnByb2dyZXNzLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixlLnByb2dyZXNzLnN0eWxlLmNvbG9yPVwiZ3JheVwiLGUuYXBwZW5kQ2hpbGQoZS5wcm9ncmVzcykpO3ZhciBpPXRoaXMuZ2V0TG9hZGVkUHJvZ3Jlc3MoKTtlLnByb2dyZXNzLmlubmVySFRNTD1cIkxvYWRpbmcgYW5pbWF0aW9uLi4uIFwiK2krXCIlXCIsZS
211675wcm9ncmVzcy5zdHlsZS5ib3R0b209XCI2MHB4XCIsZS5wcm9ncmVzcy5zdHlsZS5sZWZ0PVwiMTBweFwiO3ZhciBvPXRoaXM7c2V0VGltZW91dChmdW5jdGlvbigpe28ubG9hZEluQmFja2dyb3VuZCh0KzEpfSwxMCksdGhpcy5sb2FkZWQ9ITF9ZWxzZSB0aGlzLmxvYWRlZD0hMCx2b2lkIDAhPT1lLnByb2dyZXNzJiYoZS5yZW1vdmVDaGlsZChlLnByb2dyZXNzKSxlLnByb2dyZXNzPXZvaWQgMCksdGhpcy5vbkxvYWRDYWxsYmFjayYmdGhpcy5vbkxvYWRDYWxsYmFjaygpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7dGhpcy5hY3RpdmU9ITEsdGhpcy5kb209e2NvbnRhaW5lcjp0fSx0aGlzLmRvbS5vdmVybGF5PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20ub3ZlcmxheS5jbGFzc05hbWU9XCJ2aXMtb3ZlcmxheVwiLHRoaXMuZG9tLmNvbnRhaW5lci5hcHBlbmRDaGlsZCh0aGlzLmRvbS5vdmVybGF5KSx0aGlzLmhhbW1lcj1hKHRoaXMuZG9tLm92ZXJsYXkpLHRoaXMuaGFtbWVyLm9uKFwidGFwXCIsdGhpcy5fb25UYXBPdmVybGF5LmJpbmQodGhpcykpO3ZhciBlPXRoaXM7W1widGFwXCIsXCJkb3VibGV0YXBcIixcInByZXNzXCIsXCJwaW5jaFwiLFwicGFuXCIsXCJwYW5zdGFydFwiLFwicGFubW92ZVwiLFwicGFuZW5kXCJdLmZvckVhY2goZnVuY3Rpb24odCl7ZS5oYW1tZXIub24odCxmdW5jdGlvbih0KXt0LnN0b3BQcm9wYWdhdGlvbigpfSl9KSxkb2N1bWVudCYmZG9jdW1lbnQuYm9keSYmKHRoaXMub25DbGljaz1mdW5jdGlvbihpKXtuKGkudGFyZ2V0LHQpfHxlLmRlYWN0aXZhdGUoKX0sZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIix0aGlzLm9uQ2xpY2spKSx2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSx0aGlzLmtleWNoYXJtPXMoKSx0aGlzLmVzY0xpc3RlbmVyPXRoaXMuZGVhY3RpdmF0ZS5iaW5kKHRoaXMpfWZ1bmN0aW9uIG4odCxlKXtmb3IoO3Q7KXtpZih0PT09ZSlyZXR1cm4hMDt0PXQucGFyZW50Tm9kZX1yZXR1cm4hMX12YXIgcz1pKDM1KSxyPWkoNDQpLGE9aSgxMCksaD1pKDIpO3Ioby5wcm90b3R5cGUpLG8uY3VycmVudD1udWxsLG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmRlYWN0aXZhdGUoKSx0aGlzLmRvbS5vdmVybGF5LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ub3ZlcmxheSksdGhpcy5vbkNsaWNrJiZkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLHRoaXMub25DbGljayksdGhpcy5oYW1tZXIuZGVzdHJveSgpLHRoaXMuaGFtbWVyPW51bGx9LG8ucHJvdG90eXBlLmFjdGl2YXRlPWZ1bmN0aW9uKCl7by5jdXJyZW50JiZvLmN1cnJlbnQuZGVhY3RpdmF0ZSgpLG8uY3VycmVudD10aGlzLHRoaXMuYWN0aXZlPSEwLHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT1cIm5vbmVcIixoLmFkZENsYXNzTmFtZSh0aGlzLmRvbS5jb250YWluZXIsXCJ2aXMtYWN0aXZlXCIpLHRoaXMuZW1pdChcImNoYW5nZVwiKSx0aGlzLmVtaXQoXCJhY3RpdmF0ZVwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJlc2NcIix0aGlzLmVzY0xpc3RlbmVyKX0sby5wcm90b3R5cGUuZGVhY3RpdmF0ZT1mdW5jdGlvbigpe3RoaXMuYWN0aXZlPSExLHRoaXMuZG9tLm92ZXJsYXkuc3R5bGUuZGlzcGxheT1cIlwiLGgucmVtb3ZlQ2xhc3NOYW1lKHRoaXMuZG9tLmNvbnRhaW5lcixcInZpcy1hY3RpdmVcIiksdGhpcy5rZXljaGFybS51bmJpbmQoXCJlc2NcIix0aGlzLmVzY0xpc3RlbmVyKSx0aGlzLmVtaXQoXCJjaGFuZ2VcIiksdGhpcy5lbWl0KFwiZGVhY3RpdmF0ZVwiKX0sby5wcm90b3R5cGUuX29uVGFwT3ZlcmxheT1mdW5jdGlvbih0KXt0aGlzLmFjdGl2YXRlKCksdC5zdG9wUHJvcGFnYXRpb24oKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtlLmVuPXtjdXJyZW50OlwiY3VycmVudFwiLHRpbWU6XCJ0aW1lXCJ9LGUuZW5fRU49ZS5lbixlLmVuX1VTPWUuZW4sZS5pdD17Y3VycmVudDpcImF0dHVhbGVcIix0aW1lOlwidGVtcG9cIn0sZS5pdF9JVD1lLml0LGUuaXRfQ0g9ZS5pdCxlLm5sPXtjdXJyZW50OlwiaHVpZGlnZVwiLHRpbWU6XCJ0aWpkXCJ9LGUubmxfTkw9ZS5ubCxlLm5sX0JFPWUubmwsZS5kZT17Y3VycmVudDpcIkFrdHVlbGxlXCIsdGltZTpcIlplaXRcIn0sZS5kZV9ERT1lLmRlLGUuZnI9e2N1cnJlbnQ6XCJhY3R1ZWxcIix0aW1lOlwiaGV1cmVcIn0sZS5mcl9GUj1lLmZyLGUuZnJfQ0E9ZS5mcixlLmZyX0JFPWUuZnIsZS5lcz17Y3VycmVudDpcImNvcnJpZW50ZVwiLHRpbWU6XCJob3JhXCJ9LGUuZXNfRVM9ZS5lc30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4odCxlKXt0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXt0eXBlOm51bGwsb3JpZW50YXRpb246e2l0ZW06XCJib3R0b21cIn0sYWxpZ246XCJhdXRvXCIsc3RhY2s6ITAsc3RhY2tTdWJncm91cHM6ITAsZ3JvdXBPcmRlclN3YXA6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWUub3JkZXI7ZS5vcmRlcj10Lm9yZGVyLHQub3JkZXI9b30sZ3JvdXBPcmRlcjpcIm9yZGVyXCIsc2VsZWN0YWJsZTohMCxtdWx0aXNlbGVjdDohMSxpdGVtc0Fsd2F5c0RyYWdnYWJsZTp7aXRlbTohMSxyYW5nZTohMX0sZWRpdGFibGU6e3VwZGF0ZVRpbWU6ITEsdXBkYXRlR3JvdXA6ITEsYWRkOiExLHJlbW92ZTohMSxvdmVycmlkZUl0ZW1zOiExfSxncm91cEVkaXRhYmxlOntvcmRlcjohMSxhZGQ6ITEscmVtb3ZlOiExfSxzbmFwOnAuc25hcCxvbkRyb3BPYmplY3RPbkl0ZW06ZnVuY3Rpb24odCxlLGkpe2koZSl9LG9uQWRkOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25VcGRhdGU6ZnVuY3Rpb24odCxlKXtlKHQpfSxvbk1vdmU6ZnVuY3Rpb24odCxlKXtlKHQpfSxvblJlbW92ZTpmdW5jdGlvbih0LGUpe2UodCl9LG9uTW92aW5nOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25BZGRHcm91cDpmdW5jdGlvbih0LGUpe2UodCl9LG9uTW92ZUdyb3VwOmZ1bmN0aW9uKHQsZSl7ZSh0KX0sb25SZW1vdmVHcm91cDpmdW5jdGlvbih0LGUpe2UodCl9LG1hcmdpbjp7aXRlbTp7aG9yaXpvbn
21167RhbDoxMCx2ZXJ0aWNhbDoxMH0sYXhpczoyMH0sc2hvd1Rvb2x0aXBzOiEwLHRvb2x0aXA6e2ZvbGxvd01vdXNlOiExLG92ZXJmbG93TWV0aG9kOlwiZmxpcFwifSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMX0sdGhpcy5vcHRpb25zPWwuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMub3B0aW9ucy5ydGw9ZS5ydGwsdGhpcy5pdGVtT3B0aW9ucz17dHlwZTp7c3RhcnQ6XCJEYXRlXCIsZW5kOlwiRGF0ZVwifX0sdGhpcy5jb252ZXJzaW9uPXt0b1NjcmVlbjp0LnV0aWwudG9TY3JlZW4sdG9UaW1lOnQudXRpbC50b1RpbWV9LHRoaXMuZG9tPXt9LHRoaXMucHJvcHM9e30sdGhpcy5oYW1tZXI9bnVsbDt2YXIgaT10aGlzO3RoaXMuaXRlbXNEYXRhPW51bGwsdGhpcy5ncm91cHNEYXRhPW51bGwsdGhpcy5pdGVtTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlKGUuaXRlbXMpfX0sdGhpcy5ncm91cExpc3RlbmVycz17YWRkOmZ1bmN0aW9uKHQsZSxvKXtpZihpLl9vbkFkZEdyb3VwcyhlLml0ZW1zKSxpLmdyb3Vwc0RhdGEmJmkuZ3JvdXBzRGF0YS5sZW5ndGg+MCl7dmFyIG49aS5ncm91cHNEYXRhLmdldERhdGFTZXQoKTtuLmdldCgpLmZvckVhY2goZnVuY3Rpb24odCl7aWYodC5uZXN0ZWRHcm91cHMpezAhPXQuc2hvd05lc3RlZCYmKHQuc2hvd05lc3RlZD0hMCk7dmFyIGU9W107dC5uZXN0ZWRHcm91cHMuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgbz1uLmdldChpKTtvJiYoby5uZXN0ZWRJbkdyb3VwPXQuaWQsMD09dC5zaG93TmVzdGVkJiYoby52aXNpYmxlPSExKSxlPWUuY29uY2F0KG8pKX0pLG4udXBkYXRlKGUsbyl9fSl9fSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLmdyb3Vwcz17fSx0aGlzLmdyb3VwSWRzPVtdLHRoaXMuc2VsZWN0aW9uPVtdLHRoaXMucG9wdXA9bnVsbCx0aGlzLnRvdWNoUGFyYW1zPXt9LHRoaXMuZ3JvdXBUb3VjaFBhcmFtcz17fSx0aGlzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoZSl9dmFyIHM9aSgyOSkscj1vKHMpLGE9aSg2KSxoPW8oYSksZD1pKDEwKSxsPWkoMiksdT1pKDExKSxjPWkoMTIpLHA9aSg2NiksZj1pKDE2KSxtPWkoNjgpLHY9aSg2OSksZz1pKDEwMSkseT1pKDEwMiksYj1pKDcwKSxfPWkoMTAzKSx3PWkoMTA0KS5kZWZhdWx0LHg9XCJfX3VuZ3JvdXBlZF9fXCIsaz1cIl9fYmFja2dyb3VuZF9fXCI7bi5wcm90b3R5cGU9bmV3IGYsbi50eXBlcz17YmFja2dyb3VuZDpfLGJveDpnLHJhbmdlOmIscG9pbnQ6eX0sbi5wcm90b3R5cGUuX2NyZWF0ZT1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dC5jbGFzc05hbWU9XCJ2aXMtaXRlbXNldFwiLHRbXCJ0aW1lbGluZS1pdGVtc2V0XCJdPXRoaXMsdGhpcy5kb20uZnJhbWU9dDt2YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2UuY2xhc3NOYW1lPVwidmlzLWJhY2tncm91bmRcIix0LmFwcGVuZENoaWxkKGUpLHRoaXMuZG9tLmJhY2tncm91bmQ9ZTt2YXIgaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO2kuY2xhc3NOYW1lPVwidmlzLWZvcmVncm91bmRcIix0LmFwcGVuZENoaWxkKGkpLHRoaXMuZG9tLmZvcmVncm91bmQ9aTt2YXIgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO28uY2xhc3NOYW1lPVwidmlzLWF4aXNcIix0aGlzLmRvbS5heGlzPW87dmFyIG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtuLmNsYXNzTmFtZT1cInZpcy1sYWJlbHNldFwiLHRoaXMuZG9tLmxhYmVsU2V0PW4sdGhpcy5fdXBkYXRlVW5ncm91cGVkKCk7dmFyIHM9bmV3IHYoayxudWxsLHRoaXMpO3Muc2hvdygpLHRoaXMuZ3JvdXBzW2tdPXMsdGhpcy5oYW1tZXI9bmV3IGQodGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIpLHRoaXMuaGFtbWVyLm9uKFwiaGFtbWVyLmlucHV0XCIsZnVuY3Rpb24odCl7dC5pc0ZpcnN0JiZ0aGlzLl9vblRvdWNoKHQpfS5iaW5kKHRoaXMpKSx0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsdGhpcy5fb25EcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25EcmFnLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKFwicGFuZW5kXCIsdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLmdldChcInBhblwiKS5zZXQoe3RocmVzaG9sZDo1LGRpcmVjdGlvbjpkLkRJ
21167UkVDVElPTl9IT1JJWk9OVEFMfSksdGhpcy5oYW1tZXIub24oXCJ0YXBcIix0aGlzLl9vblNlbGVjdEl0ZW0uYmluZCh0aGlzKSksdGhpcy5oYW1tZXIub24oXCJwcmVzc1wiLHRoaXMuX29uTXVsdGlTZWxlY3RJdGVtLmJpbmQodGhpcykpLHRoaXMuaGFtbWVyLm9uKFwiZG91YmxldGFwXCIsdGhpcy5fb25BZGRJdGVtLmJpbmQodGhpcykpLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5ncm91cEhhbW1lcj1uZXcgZCh0aGlzLmJvZHkuZG9tLnJpZ2h0Q29udGFpbmVyKTp0aGlzLmdyb3VwSGFtbWVyPW5ldyBkKHRoaXMuYm9keS5kb20ubGVmdENvbnRhaW5lciksdGhpcy5ncm91cEhhbW1lci5vbihcInRhcFwiLHRoaXMuX29uR3JvdXBDbGljay5iaW5kKHRoaXMpKSx0aGlzLmdyb3VwSGFtbWVyLm9uKFwicGFuc3RhcnRcIix0aGlzLl9vbkdyb3VwRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIub24oXCJwYW5tb3ZlXCIsdGhpcy5fb25Hcm91cERyYWcuYmluZCh0aGlzKSksdGhpcy5ncm91cEhhbW1lci5vbihcInBhbmVuZFwiLHRoaXMuX29uR3JvdXBEcmFnRW5kLmJpbmQodGhpcykpLHRoaXMuZ3JvdXBIYW1tZXIuZ2V0KFwicGFuXCIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmQuRElSRUNUSU9OX1ZFUlRJQ0FMfSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlb3ZlclwiLHRoaXMuX29uTW91c2VPdmVyLmJpbmQodGhpcykpLHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW91dFwiLHRoaXMuX29uTW91c2VPdXQuYmluZCh0aGlzKSksdGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXIuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMuX29uTW91c2VNb3ZlLmJpbmQodGhpcykpLHRoaXMuYm9keS5kb20uY2VudGVyQ29udGFpbmVyLmFkZEV2ZW50TGlzdGVuZXIoXCJjb250ZXh0bWVudVwiLHRoaXMuX29uRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZG9tLmNlbnRlckNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKFwibW91c2V3aGVlbFwiLHRoaXMuX29uTW91c2VXaGVlbC5iaW5kKHRoaXMpKSx0aGlzLnNob3coKX0sbi5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXtpZih0KXt2YXIgZT1bXCJ0eXBlXCIsXCJydGxcIixcImFsaWduXCIsXCJvcmRlclwiLFwic3RhY2tcIixcInN0YWNrU3ViZ3JvdXBzXCIsXCJzZWxlY3RhYmxlXCIsXCJtdWx0aXNlbGVjdFwiLFwibXVsdGlzZWxlY3RQZXJHcm91cFwiLFwiZ3JvdXBPcmRlclwiLFwiZGF0YUF0dHJpYnV0ZXNcIixcInRlbXBsYXRlXCIsXCJncm91cFRlbXBsYXRlXCIsXCJ2aXNpYmxlRnJhbWVUZW1wbGF0ZVwiLFwiaGlkZVwiLFwic25hcFwiLFwiZ3JvdXBPcmRlclN3YXBcIixcInNob3dUb29sdGlwc1wiLFwidG9vbHRpcFwiLFwidG9vbHRpcE9uSXRlbVVwZGF0ZVRpbWVcIl07bC5zZWxlY3RpdmVFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksXCJpdGVtc0Fsd2F5c0RyYWdnYWJsZVwiaW4gdCYmKFwiYm9vbGVhblwiPT10eXBlb2YgdC5pdGVtc0Fsd2F5c0RyYWdnYWJsZT8odGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLml0ZW09dC5pdGVtc0Fsd2F5c0RyYWdnYWJsZSx0aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUucmFuZ2U9ITEpOlwib2JqZWN0XCI9PT0oMCxoLmRlZmF1bHQpKHQuaXRlbXNBbHdheXNEcmFnZ2FibGUpJiYobC5zZWxlY3RpdmVFeHRlbmQoW1wiaXRlbVwiLFwicmFuZ2VcIl0sdGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLHQuaXRlbXNBbHdheXNEcmFnZ2FibGUpLHRoaXMub3B0aW9ucy5pdGVtc0Fsd2F5c0RyYWdnYWJsZS5pdGVtfHwodGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLnJhbmdlPSExKSkpLFwib3JpZW50YXRpb25cImluIHQmJihcInN0cmluZ1wiPT10eXBlb2YgdC5vcmllbnRhdGlvbj90aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbT1cInRvcFwiPT09dC5vcmllbnRhdGlvbj9cInRvcFwiOlwiYm90dG9tXCI6XCJvYmplY3RcIj09PSgwLGguZGVmYXVsdCkodC5vcmllbnRhdGlvbikmJlwiaXRlbVwiaW4gdC5vcmllbnRhdGlvbiYmKHRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPXQub3JpZW50YXRpb24uaXRlbSkpLFwibWFyZ2luXCJpbiB0JiYoXCJudW1iZXJcIj09dHlwZW9mIHQubWFyZ2luPyh0aGlzLm9wdGlvbnMubWFyZ2luLmF4aXM9dC5tYXJnaW4sdGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLmhvcml6b250YWw9dC5tYXJnaW4sdGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLnZlcnRpY2FsPXQubWFyZ2luKTpcIm9iamVjdFwiPT09KDAsaC5kZWZhdWx0KSh0Lm1hcmdpbikmJihsLnNlbGVjdGl2ZUV4dGVuZChbXCJheGlzXCJdLHRoaXMub3B0aW9ucy5tYXJnaW4sdC5tYXJnaW4pLFwiaXRlbVwiaW4gdC5tYXJnaW4mJihcIm51bWJlclwiPT10eXBlb2YgdC5tYXJnaW4uaXRlbT8odGhpcy5vcHRpb25zLm1hcmdpbi5pdGVtLmhvcml6b250YWw9dC5tYXJnaW4uaXRlbSx0aGlzLm9wdGlvbnMubWFyZ2luLml0ZW0udmVydGljYWw9dC5tYXJnaW4uaXRlbSk6XCJvYmplY3RcIj09PSgwLGguZGVmYXVsdCkodC5tYXJnaW4uaXRlbSkmJmwuc2VsZWN0aXZlRXh0ZW5kKFtcImhvcml6b250YWxcIixcInZlcnRpY2FsXCJdLHRoaXMub3B0aW9ucy5tYXJnaW4uaXRlbSx0Lm1hcmdpbi5pdGVtKSkpKSxcImVkaXRhYmxlXCJpbiB0JiYoXCJib29sZWFuXCI9PXR5cGVvZiB0LmVkaXRhYmxlPyh0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZT10LmVkaXRhYmxlLHRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVHcm91cD10LmVkaXRhYmxlLHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQ9dC5lZGl0YWJsZSx0aGlzLm9wdGlvbnMuZWRpdGFibGUucmVtb3ZlPXQuZWRpdGFibGUsdGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXM9ITEpOlwib2JqZWN0XCI9PT0oMCxoLmRlZmF1bHQpKHQuZWRpdGFibGUpJiZsLnNlbGVjdGl2ZUV4dGVuZChbXCJ1cGRhdGVUaW1lXCIsXCJ1cGRhdGVHcm91cFwiLFwiYWRkXCIsXCJyZW1vdmVcIixcIm92ZXJyaWRlSXRlbXNcIl0sdGhpcy5vcHRpb25zLmVkaXRhYmxlLHQuZWRpdGFibGUpKSxcImdyb3VwRWRpdGFibGVcImluIHQmJihcImJvb2xlYW5cIj09dHlwZW9mIHQuZ3JvdXBFZGl0YWJsZT8odGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXI9dC5ncm91cEVkaXRhYmxlLHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLmFkZD10Lmdyb3VwRWRpdGFibGUsdGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUucmVtb3ZlPXQuZ3JvdXBFZGl0YWJsZSk6XCJvYmplY3RcIj09PSgwLGguZGVmYXVsdCkodC5ncm91cEVkaXRhYmxlKSYmbC5zZWxlY3RpdmVFeHRlbmQoW1wib3JkZXJcIixcImFkZFwiLFwicmVtb3ZlXCJdLHRoaXMub3B0aW9ucy5ncm91cEVkaXRhYmxlLHQuZ3JvdXBFZGl0YWJsZSkpO1tcIm9uRHJvcE9iamVjdE9uSXRlbVwiLFwib25BZGRcIixcIm9uVXBkYXRlXCIsXCJvblJlbW92ZVwiLFwib25Nb3ZlXCIsXCJvbk1vdmluZ1wiLFwib25BZGRHcm91cFwiLFwib25Nb3ZlR3JvdXBcIixcIm9uUmVtb3ZlR3JvdXBcIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaT10W2VdO2lmKGkpe2lmKCEoaSBpbnN0YW5jZW9mIEZ1bmN0aW9uKSl0aHJvdyBuZXcgRXJyb3IoXCJvcHRpb24gXCIrZStcIiBtdXN0IGJlIGEgZnVuY3Rpb24gXCIrZStcIihpdGVtLCBjYWxsYmFjaylcIik7dGhpcy5vcHRpb25zW2VdPWl9fS5iaW5kKHRoaXMpKSx0aGlzLm1hcmtEaXJ0eSgpfX0sbi5wcm90b3R5cGUubWFya0RpcnR5PWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBJZHM9W10sdCYmdC5yZWZyZXNoSXRlbXMmJmwuZm9yRWFjaCh0aGlzLml0ZW1zLGZ1bmN0aW9uKHQpe3QuZGlydHk9ITAsdC5kaXNwbGF5ZWQmJnQucmVkcmF3KCl9KX0sbi5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuaGlkZSgpLHRoaXMuc2V0SXRlbXMobnVsbCksdGhpcy5zZXRHcm91cHMobnVsbCksdGhpcy5oYW1tZXI9bnVsbCx0aGlzLmJvZHk9bnVsbCx0aGlzLmNvbnZlcnNpb249bnVsbH0sbi5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZSYmdGhpcy5kb20uYXhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmF4aXMpLHRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUmJnRoaXMuZG9tLmxhYmVsU2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ubGFiZWxTZX
21167QpfSxuLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmF4aXMucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kVmVydGljYWwuYXBwZW5kQ2hpbGQodGhpcy5kb20uYXhpcyksdGhpcy5kb20ubGFiZWxTZXQucGFyZW50Tm9kZXx8KHRoaXMub3B0aW9ucy5ydGw/dGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5sYWJlbFNldCk6dGhpcy5ib2R5LmRvbS5sZWZ0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmxhYmVsU2V0KSl9LG4ucHJvdG90eXBlLnNldFNlbGVjdGlvbj1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbjtmb3Iodm9pZCAwPT10JiYodD1bXSksQXJyYXkuaXNBcnJheSh0KXx8KHQ9W3RdKSxlPTAsaT10aGlzLnNlbGVjdGlvbi5sZW5ndGg7ZTxpO2UrKylvPXRoaXMuc2VsZWN0aW9uW2VdLChuPXRoaXMuaXRlbXNbb10pJiZuLnVuc2VsZWN0KCk7Zm9yKHRoaXMuc2VsZWN0aW9uPVtdLGU9MCxpPXQubGVuZ3RoO2U8aTtlKyspbz10W2VdLChuPXRoaXMuaXRlbXNbb10pJiYodGhpcy5zZWxlY3Rpb24ucHVzaChvKSxuLnNlbGVjdCgpKX0sbi5wcm90b3R5cGUuZ2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmNvbmNhdChbXSl9LG4ucHJvdG90eXBlLmdldFZpc2libGVJdGVtcz1mdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLmJvZHkucmFuZ2UuZ2V0UmFuZ2UoKTt0aGlzLm9wdGlvbnMucnRsPyh0PXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGkuc3RhcnQpLGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4oaS5lbmQpKTooZT10aGlzLmJvZHkudXRpbC50b1NjcmVlbihpLnN0YXJ0KSx0PXRoaXMuYm9keS51dGlsLnRvU2NyZWVuKGkuZW5kKSk7dmFyIG89W107Zm9yKHZhciBuIGluIHRoaXMuZ3JvdXBzKWlmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KG4pKWZvcih2YXIgcz10aGlzLmdyb3Vwc1tuXSxyPXMuaXNWaXNpYmxlP3MudmlzaWJsZUl0ZW1zOltdLGE9MDthPHIubGVuZ3RoO2ErKyl7dmFyIGg9clthXTt0aGlzLm9wdGlvbnMucnRsP2gucmlnaHQ8ZSYmaC5yaWdodCtoLndpZHR
21167oPnQmJm8ucHVzaChoLmlkKTpoLmxlZnQ8dCYmaC5sZWZ0K2gud2lkdGg+ZSYmby5wdXNoKGguaWQpfXJldHVybiBvfSxuLnByb3RvdHlwZS5fZGVzZWxlY3Q9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuc2VsZWN0aW9uLGk9MCxvPWUubGVuZ3RoO2k8bztpKyspaWYoZVtpXT09dCl7ZS5zcGxpY2UoaSwxKTticmVha319LG4ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5tYXJnaW4sZT10aGlzLmJvZHkucmFuZ2UsaT1sLm9wdGlvbi5hc1NpemUsbz10aGlzLm9wdGlvbnMsbj1vLm9yaWVudGF0aW9uLml0ZW0scz0hMSxyPXRoaXMuZG9tLmZyYW1lO3RoaXMucHJvcHMudG9wPXRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wLHRoaXMub3B0aW9ucy5ydGw/dGhpcy5wcm9wcy5yaWdodD10aGlzLmJvZHkuZG9tUHJvcHMucmlnaHQud2lkdGgrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci5yaWdodDp0aGlzLnByb3BzLmxlZnQ9dGhpcy5ib2R5LmRvbVByb3BzLmxlZnQud2lkdGgrdGhpcy5ib2R5LmRvbVByb3BzLmJvcmRlci5sZWZ0LHIuY2xhc3NOYW1lPVwidmlzLWl0ZW1zZXRcIixzPXRoaXMuX29yZGVyR3JvdXBzKCl8fHM7dmFyIGE9ZS5lbmQtZS5zdGFydCxoPWEhPXRoaXMubGFzdFZpc2libGVJbnRlcnZhbHx8dGhpcy5wcm9wcy53aWR0aCE9dGhpcy5wcm9wcy5sYXN0V2lkdGgsZD1lLnN0YXJ0IT10aGlzLmxhc3RSYW5nZVN0YXJ0LHU9by5zdGFjayE9dGhpcy5sYXN0U3RhY2ssYz1vLnN0YWNrU3ViZ3JvdXBzIT10aGlzLmxhc3RTdGFja1N1Ymdyb3VwcyxwPWh8fGR8fHV8fGM7dGhpcy5sYXN0VmlzaWJsZUludGVydmFsPWEsdGhpcy5sYXN0UmFuZ2VTdGFydD1lLnN0YXJ0LHRoaXMubGFzdFN0YWNrPW8uc3RhY2ssdGhpcy5sYXN0U3RhY2tTdWJncm91cHM9by5zdGFja1N1Ymdyb3Vwcyx0aGlzLnByb3BzLmxhc3RXaWR0aD10aGlzLnByb3BzLndpZHRoO3ZhciBmPXRoaXMuX2ZpcnN0R3JvdXAoKSxtPXtpdGVtOnQuaXRlbSxheGlzOnQuYXhpc30sdj17aXRlbTp0Lml0ZW0sYXhpczp0Lml0ZW0udmVydGljYWwvMn0sZz0wLHk9dC5heGlzK3QuaXRlbS52ZXJ0aWNhbDt0aGlzLmdyb3Vwc1trXS5yZWRyYXcoZSx2LHApO3ZhciBiPXt9LF89MDtpZihsLmZvckVhY2godGhpcy5ncm91cHMsZnVuY3Rpb24odCxpKXtpZihpIT09ayl7dmFyIG89dD09Zj9tOnY7YltpXT10LnJlZHJhdyhlLG8scCwhMCksXz1iW2ldLmxlbmd0aH19KSxfPjApe2Zvcih2YXIgdz17fSx4PTA7eDxfO3grKylsLmZvckVhY2goYixmdW5jdGlvbih0LGUpe3dbZV09dFt4XSgpfSk7bC5mb3JFYWNoKHRoaXMuZ3JvdXBzLGZ1bmN0aW9uKHQsZSl7aWYoZSE9PWspe3ZhciBpPXdbZV07cz1pfHxzLGcrPXQuaGVpZ2h0fX0pLGc9TWF0aC5tYXgoZyx5KX1yZXR1cm4gZz1NYXRoLm1heChnLHkpLHIuc3R5bGUuaGVpZ2h0PWkoZyksdGhpcy5wcm9wcy53aWR0aD1yLm9mZnNldFdpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PWcsdGhpcy5kb20uYXhpcy5zdHlsZS50b3A9aShcInRvcFwiPT1uP3RoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wOnRoaXMuYm9keS5kb21Qcm9wcy50b3AuaGVpZ2h0K3RoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0KSx0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmF4aXMuc3R5bGUucmlnaHQ9XCIwXCI6dGhpcy5kb20uYXhpcy5zdHlsZS5sZWZ0PVwiMFwiLHRoaXMuaW5pdGlhbEl0ZW1TZXREcmF3bj0hMCxzPXRoaXMuX2lzUmVzaXplZCgpfHxzfSxuLnByb3RvdHlwZS5fZmlyc3RHcm91cD1mdW5jdGlvbigpe3ZhciB0PVwidG9wXCI9PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtPzA6dGhpcy5ncm91cElkcy5sZW5ndGgtMSxlPXRoaXMuZ3JvdXBJZHNbdF07cmV0dXJuIHRoaXMuZ3JvdXBzW2VdfHx0aGlzLmdyb3Vwc1t4XXx8bnVsbH0sbi5wcm90b3R5cGUuX3VwZGF0ZVVuZ3JvdXBlZD1mdW5jdGlvbigpe3ZhciB0LGUsaT10aGlzLmdyb3Vwc1t4XTtpZih0aGlzLmdyb3Vwc0RhdGEpe2lmKGkpe2kuaGlkZSgpLGRlbGV0ZSB0aGlzLmdyb3Vwc1t4XTtmb3IoZSBpbiB0aGlzLml0ZW1zKWlmKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoZSkpe3Q9dGhpcy5pdGVtc1tlXSx0LnBhcmVudCYmdC5wYXJlbnQucmVtb3ZlKHQpO3ZhciBvPXRoaXMuX2dldEdyb3VwSWQodC5kYXRhKSxuPXRoaXMuZ3JvdXBzW29dO24mJm4uYWRkKHQpfHx0LmhpZGUoKX19fWVsc2UgaWYoIWkpe2k9bmV3IG0obnVsbCxudWxsLHRoaXMpLHRoaXMuZ3JvdXBzW3hdPWk7Zm9yKGUgaW4gdGhpcy5pdGVtcyl0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGUpJiYodD10aGlzLml0ZW1zW2VdLGkuYWRkKHQpKTtpLnNob3coKX19LG4ucHJvdG90eXBlLmdldExhYmVsU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tLmxhYmVsU2V0fSxuLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMsbz10aGlzLml0ZW1zRGF0YTtpZih0KXtpZighKHQgaW5zdGFuY2VvZiB1fHx0IGluc3RhbmNlb2YgYykpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3XCIpO3RoaXMuaXRlbXNEYXRhPXR9ZWxzZSB0aGlzLml0ZW1zRGF0YT1udWxsO2lmKG8mJihsLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLGU9by5nZXRJZHMoKSx0aGlzLl9vblJlbW92ZShlKSksdGhpcy5pdGVtc0RhdGEpe3ZhciBuPXRoaXMuaWQ7bC5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuaXRlbXNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGQoZSksdGhpcy5fdXBkYXRlVW5ncm91cGVkKCl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuZ2V0SXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtc0RhdGF9LG4ucHJvdG90eXBlLnNldEdyb3Vwcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXM7aWYodGhpcy5ncm91cHNEYXRhJiYobC5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub2ZmKGUsdCl9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLl9vblJlbW92ZUdyb3VwcyhlKSksdCl7aWYoISh0IGluc3RhbmNlb2YgdXx8dCBpbnN0YW5jZW9mIGMpKXRocm93IG5ldyBUeXBlRXJyb3IoXCJEYXRhIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRGF0YVNldCBvciBEYXRhVmlld1wiKTt0aGlzLmdyb3Vwc0RhdGE9dH1lbHNlI
21167HRoaXMuZ3JvdXBzRGF0YT1udWxsO2lmKHRoaXMuZ3JvdXBzRGF0YSl7dmFyIG89dGhpcy5ncm91cHNEYXRhO3RoaXMuZ3JvdXBzRGF0YSBpbnN0YW5jZW9mIGMmJihvPXRoaXMuZ3JvdXBzRGF0YS5nZXREYXRhU2V0KCkpLG8uZ2V0KCkuZm9yRWFjaChmdW5jdGlvbih0KXt0Lm5lc3RlZEdyb3VwcyYmdC5uZXN0ZWRHcm91cHMuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgaT1vLmdldChlKTtpLm5lc3RlZEluR3JvdXA9dC5pZCwwPT10LnNob3dOZXN0ZWQmJihpLnZpc2libGU9ITEpLG8udXBkYXRlKGkpfSl9KTt2YXIgbj10aGlzLmlkO2wuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5ncm91cHNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5ncm91cHNEYXRhLmdldElkcygpLHRoaXMuX29uQWRkR3JvdXBzKGUpfXRoaXMuX3VwZGF0ZVVuZ3JvdXBlZCgpLHRoaXMuX29yZGVyKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuZ2V0R3JvdXBzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ3JvdXBzRGF0YX0sbi5wcm90b3R5cGUucmVtb3ZlSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1zRGF0YS5nZXQodCksaT10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCk7ZSYmdGhpcy5vcHRpb25zLm9uUmVtb3ZlKGUsZnVuY3Rpb24oZSl7ZSYmaS5yZW1vdmUodCl9KX0sbi5wcm90b3R5cGUuX2dldFR5cGU9ZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZXx8dGhpcy5vcHRpb25zLnR5cGV8fCh0LmVuZD9cInJhbmdlXCI6XCJib3hcIil9LG4ucHJvdG90eXBlLl9nZXRHcm91cElkPWZ1bmN0aW9uKHQpe3JldHVyblwiYmFja2dyb3VuZFwiPT10aGlzLl9nZXRUeXBlKHQpJiZ2b2lkIDA9PXQuZ3JvdXA/azp0aGlzLmdyb3Vwc0RhdGE/dC5ncm91cDp4fSxuLnByb3RvdHlwZS5fb25VcGRhdGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGksbz1lLml0ZW1zRGF0YS5nZXQodCxlLml0ZW1PcHRpb25zKSxzPWUuaXRlbXNbdF0scj1vP2UuX2dldFR5cGUobyk6bnVsbCxhPW4udHlwZXNbcl07aWYocyYmKGEmJnMgaW5zdGFuY2VvZiBhP2UuX3VwZGF0ZUl0ZW0ocyxvKTooaT1zLnNlbGVjdGVkLGUuX3JlbW92ZUl0ZW0ocykscz1udWxsKSksIXMmJm8pe2lmKCFhKXRocm93XCJyYW5nZW92ZXJmbG93XCI9PXI/bmV3IFR5cGVFcnJvcignSXRlbSB0eXBlIFwicmFuZ2VvdmVyZmxvd1wiIGlzIGRlcHJlY2F0ZWQuIFVzZSBjc3Mgc3R5bGluZyBpbnN0ZWFkOiAudmlzLWl0ZW0udmlzLXJhbmdlIC52aXMtaXRlbS1jb250ZW50IHtvdmVyZmxvdzogdmlzaWJsZTt9Jyk6bmV3IFR5cGVFcnJvcignVW5rbm93biBpdGVtIHR5cGUgXCInK3IrJ1wiJyk7cz1uZXcgYShvLGUuY29udmVyc2lvbixlLm9wdGlvbnMpLHMuaWQ9dCxlLl9hZGRJdGVtKHMpLGkmJih0aGlzLnNlbGVjdGlvbi5wdXNoKHQpLHMuc2VsZWN0KCkpfX0uYmluZCh0aGlzKSksdGhpcy5fb3JkZXIoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTohMH0pfSxuLnByb3RvdHlwZS5fb25BZGQ9bi5wcm90b3R5cGUuX29uVXBkYXRlLG4ucHJvdG90eXBlLl9vblJlbW92ZT1mdW5jdGlvbih0KXt2YXIgZT0wLGk9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89aS5pdGVtc1t0XTtvJiYoZSsrLGkuX3JlbW92ZUl0ZW0obykpfSksZSYmKHRoaXMuX29yZGVyKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KSl9LG4ucHJvdG90eXBlLl9vcmRlcj1mdW5jdGlvbigpe2wuZm9yRWFjaCh0aGlzLmdyb3VwcyxmdW5jdGlvbih0KXt0Lm9yZGVyKCl9KX0sbi5wcm90b3R5cGUuX29uVXBkYXRlR3JvdXBzPWZ1bmN0aW9uKHQpe3RoaXMuX29uQWRkR3JvdXBzKHQpfSxuLnByb3RvdHlwZS5fb25BZGRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9ZS5ncm91cHNEYXRhLmdldCh0KSxvPWUuZ3JvdXBzW3RdO2lmKG8pby5zZXREYXRhKGkpO2Vsc2V7aWYodD09eHx8dD09ayl0aHJvdyBuZXcgRXJyb3IoXCJJbGxlZ2FsIGdyb3VwIGlkLiBcIit0K1wiIGlzIGEgcmVzZXJ2ZWQgaWQuXCIpO3ZhciBuPSgwLHIuZGVmYXVsdCkoZS5vcHRpb25zKTtsLmV4dGVuZChuLHtoZWlnaHQ6bnVsbH0pLG89bmV3IG0odCxpLGUpLGUuZ3JvdXBzW3RdPW87Zm9yKHZhciBzIGluIGUuaXRlbXMpaWYoZS5pdGVtcy5oYXNPd25Qcm9wZXJ0eShzKSl7dmFyIGE9ZS5pdGVtc1tzXTthLmRhdGEuZ3JvdXA9PXQmJm8uYWRkKGEpfW8ub3JkZXIoKSxvLnNob3coKX19KSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTohMH0pfSxuLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ncm91cHM7dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBpPWVbdF07aSYmKGkuaGlkZSgpLGRlbGV0ZSBlW3RdKX0pLHRoaXMubWFya0RpcnR5KCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIix7cXVldWU6ITB9KX0sbi5wcm90b3R5cGUuX29yZGVyR3JvdXBzPWZ1bmN0aW9uKCl7aWYodGhpcy5ncm91cHNEYXRhKXt2YXIgdD10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pO3Q9dGhpcy5fb3JkZXJOZXN0ZWRHcm91cHModCk7dmFyIGU9IWwuZXF1YWxBcnJheSh0LHRoaXMuZ3JvdXBJZHMpO2lmKGUpe3ZhciBpPXRoaXMuZ3JvdXBzO3QuZm9yRWFjaChmdW5jdGlvbih0KXtpW3RdLmhpZGUoKX0pLHQuZm9yRWFjaChmdW5jdGlvbih0KXtpW3RdLnNob3coKX0pLHRoaXMuZ3JvdXBJZHM9dH1yZXR1cm4gZX1yZXR1cm4hMX0sbi5wcm90b3R5cGUuX29yZGVyTmVzdGVkR3JvdXBzPWZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGk9dGhpcy5ncm91cHNEYXRhLmdldCh0KTtpZihpLm5lc3RlZEluR3JvdXB8fGUucHVzaCh0KSxpLm5lc3RlZEdyb3Vwcyl7dmFyIG89dGhpcy5ncm91cHNEYXRhLmdldCh7ZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLm5lc3RlZEluR3JvdXA9PXR9LG9yZGVyOnRoaXMub3B0aW9ucy5ncm91cE9yZGVyfSksbj1vLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5pZH0pO2U9ZS5jb25jYXQobil9fSx0aGlzKSxlfSxuLnByb3RvdHlwZS5fYWRkSXRlbT1mdW5jdGlvbih0KXt0aGlzLml0ZW1zW3QuaWRdPXQ7dmFyIGU9dGhpcy5fZ2V0R3JvdXBJZCh0LmRhdGEpLGk9dGhpcy5ncm91cHNbZV07aT9pJiZpLmRhdGEmJmkuZGF0YS5zaG93TmVzdGVkJiYodC5ncm91cFNob3dpbmc9ITApOnQuZ3JvdXBTaG93aW5nPSExLGkmJmkuYWRkKHQpfSxuLnByb3RvdHlwZS5fdXBkYXRlSXRlbT1mdW5jdGlvbih0LGUpe3Quc2V0RGF0YShlKTt2YXIgaT10aGlzLl9nZXRHcm91cElkKHQuZGF0YSksbz10aGlzLmdyb3Vwc1tpXTtvP28mJm8uZGF0YSYmby5kYXRhLnNob3dOZXN0ZWQmJih0Lmdyb3VwU2hvd2luZz0hMCk6dC5ncm91cFNob3dpbmc9ITF9LG4ucHJvdG90eXBlLl9yZW1vdmVJdGVtPWZ1bmN0aW9uKHQpe3QuaGlkZSgpLGRlbGV0ZSB0aGlzLml0ZW1zW3QuaWRdO3ZhciBlPXR
21167oaXMuc2VsZWN0aW9uLmluZGV4T2YodC5pZCk7LTEhPWUmJnRoaXMuc2VsZWN0aW9uLnNwbGljZShlLDEpLHQucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCl9LG4ucHJvdG90eXBlLl9jb25zdHJ1Y3RCeUVuZEFycmF5PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxpPTA7aTx0Lmxlbmd0aDtpKyspdFtpXWluc3RhbmNlb2YgYiYmZS5wdXNoKHRbaV0pO3JldHVybiBlfSxuLnByb3RvdHlwZS5fb25Ub3VjaD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoUGFyYW1zLml0ZW09dGhpcy5pdGVtRnJvbVRhcmdldCh0KSx0aGlzLnRvdWNoUGFyYW1zLmRyYWdMZWZ0SXRlbT10LnRhcmdldC5kcmFnTGVmdEl0ZW18fCExLHRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbT10LnRhcmdldC5kcmFnUmlnaHRJdGVtfHwhMSx0aGlzLnRvdWNoUGFyYW1zLml0ZW1Qcm9wcz1udWxsfSxuLnByb3RvdHlwZS5fZ2V0R3JvdXBJbmRleD1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuZ3JvdXBJZHMubGVuZ3RoO2UrKylpZih0PT10aGlzLmdyb3VwSWRzW2VdKXJldHVybiBlfSxuLnByb3RvdHlwZS5fb25EcmFnU3RhcnQ9ZnVuY3Rpb24odCl7aWYoIXRoaXMudG91Y2hQYXJhbXMuaXRlbUlzRHJhZ2dpbmcpe3ZhciBlLGk9dGhpcy50b3VjaFBhcmFtcy5pdGVtfHxudWxsLG89dGhpcztpZihpJiYoaS5zZWxlY3RlZHx8dGhpcy5vcHRpb25zLml0ZW1zQWx3YXlzRHJhZ2dhYmxlLml0ZW0pKXtpZih0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS51cGRhdGVUaW1lJiYhdGhpcy5vcHRpb25zLmVkaXRhYmxlLnVwZGF0ZUdyb3VwKXJldHVybjtpZihudWxsIT1pLmVkaXRhYmxlJiYhaS5lZGl0YWJsZS51cGRhdGVUaW1lJiYhaS5lZGl0YWJsZS51cGRhdGVHcm91cCYmIXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zKXJldHVybjt2YXIgbj10aGlzLnRvdWNoUGFyYW1zLmRyYWdMZWZ0SXRlbSxzPXRoaXMudG91Y2hQYXJhbXMuZHJhZ1JpZ2h0SXRlbTtpZih0aGlzLnRvdWNoUGFyYW1zLml0ZW1Jc0RyYWdnaW5nPSEwLHRoaXMudG91Y2hQYXJhbXMuc2VsZWN0ZWRJdGVtPWksbillPXtpdGVtOm4saW5pdGlhbFg6dC5jZW50ZXIueCxkcmFnTGVmdDohMCxkYXRhOnRoaXMuX2Nsb25lSXRlbURhdGEoaS5kYXRhKX0sdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9W2VdO2Vsc2UgaWYocyllPXtpdGVtOnMsaW5pdGlhbFg6dC5jZW50ZXIueCxkcmFnUmlnaHQ6ITAsZGF0YTp0aGlzLl9jbG9uZUl0ZW1EYXRhKGkuZGF0YSl9LHRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPVtlXTtlbHNlIGlmKHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSkpdGhpcy5fb25EcmFnU3RhcnRBZGRJdGVtKHQpO2Vsc2V7dGhpcy5ncm91cElkcy5sZW5ndGg8MSYmdGhpcy5yZWRyYXcoKTt2YXIgcj10aGlzLl9nZXRHcm91cEluZGV4KGkuZGF0YS5ncm91cCksYT10aGlzLm9wdGlvbnMuaXRlbXNBbHdheXNEcmFnZ2FibGUuaXRlbSYmIWkuc2VsZWN0ZWQ/W2kuaWRdOnRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9YS5tYXAoZnVuY3Rpb24oZSl7dmFyIGk9by5pdGVtc1tlXSxuPW8uX2dldEdyb3VwSW5kZXgoaS5kYXRhLmdyb3VwKTtyZXR1cm57aXRlbTppLGluaXRpYWxYOnQuY2VudGVyLngsZ3JvdXBPZmZzZXQ6ci1uLGRhdGE6dGhpcy5fY2xvbmVJdGVtRGF0YShpLmRhdGEpfX0uYmluZCh0aGlzKSl9dC5zdG9wUHJvcGFnYXRpb24oKX1lbHNlIHRoaXMub3B0aW9ucy5lZGl0YWJsZS5hZGQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSkmJnRoaXMuX29uRHJhZ1N0YXJ0QWRkSXRlbSh0KX19LG4ucHJvdG90eXBlLl9vbkRyYWdTdGFydEFkZEl0ZW09ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXRoaXMub3B0aW9ucy5zbmFwfHxudWxsO3RoaXMub3B0aW9ucy5ydGw/KGU9bC5nZXRBYnNvbHV0ZVJpZ2h0KHRoaXMuZG9tLmZyYW1lKSxpPWUtdC5jZW50ZXIueCsxMCk6KGU9bC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLGk9dC5jZW50ZXIueC1lLTEwKTt2YXIgbj10aGlzLmJvZHkudXRpbC50b1RpbWUoaSkscz10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLHI9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpLGE9bz9vKG4scyxyKTpuLGg9YSxkPXt0eXBlOlwicmFuZ2VcIixzdGFydDphLGVuZDpoLGNvbnRlbnQ6XCJuZXcgaXRlbVwifSx1PWwucmFuZG9tVVVJRCgpO2RbdGhpcy5pdGVtc0RhdGEuX2ZpZWxkSWRdPXU7dmFyIGM9dGhpcy5ncm91cEZyb21UYXJnZXQodCk7YyYmKGQuZ3JvdXA9Yy5ncm91cElkKTt2YXIgcD1uZXcgYihkLHRoaXMuY29udmVyc2lvbix0aGlzLm9wdGlvbnMpO3AuaWQ9dSxwLmRhdGE9dGhpcy5fY2xvbmVJdGVtRGF0YShkKSx0aGlzLl9hZGRJdGVtKHApLHRoaXMudG91Y2hQYXJhbXMuc2VsZWN0ZWRJdGVtPXA7dmFyIGY9e2l0ZW06cCxpbml0aWFsWDp0LmNlbnRlci54LGRhdGE6cC5kYXRhfTt0aGlzLm9wdGlvbnMucnRsP2YuZHJhZ0xlZnQ9ITA6Zi5kcmFnUmlnaHQ9ITAsdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHM9W2ZdLHQuc3RvcFByb3BhZ2F0aW9uKCl9LG4ucHJvdG90eXBlLl9vbkRyYWc9ZnVuY3Rpb24odCl7aWYodGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGUsaT10aGlzLG89dGhpcy5vcHRpb25zLnNuYXB8fG51bGw7ZT10aGlzLm9wdGlvbnMucnRsP3RoaXMuYm9keS5kb20ucm9vdC5vZmZzZXRMZWZ0K3RoaXMuYm9keS5kb21Qcm9wcy5yaWdodC53aWR0aDp0aGlzLmJvZHkuZG9tLnJvb3Qub2Zmc2V0TGVmdCt0aGlzLmJvZHkuZG9tUHJvcHMubGVmdC53aWR0aDt2YXIgbj10aGlzLmJvZHkudXRpbC5nZXRTY2FsZSgpLHM9dGhpcy5ib2R5LnV0aWwuZ2V0U3RlcCgpLHI9dGhpcy50b3VjaFBhcmFtcy5zZWxlY3RlZEl0ZW0sYT0odGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXN8fG51bGw9PXIuZWRpdGFibGUpJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlR3JvdXB8fCF0aGlzLm9wdGlvbnMuZWRpdGFibGUub3ZlcnJpZGVJdGVtcyYmbnVsbCE9ci5lZGl0YWJsZSYmci5lZGl0YWJsZS51cGRhdGVHcm91cCxoPW51bGw7aWYoYSYmciYmdm9pZCAwIT1yLmRhdGEuZ3JvdXApe3ZhciBkPWkuZ3JvdXBGcm9tVGFyZ2V0KHQpO2QmJihoPXRoaXMuX2dldEdyb3VwSW5kZXgoZC5ncm91cElkKSl9dGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgdSxjLHAsZixtLHY9aS5ib2R5LnV0aWwudG9UaW1lKHQuY2VudGVyLngtZSksZz1pLmJvZHkudXRpbC50b1RpbWUoZC5pbml0aWFsWC1lKTt1PXRoaXMub3B0aW9ucy5ydGw/LSh2LWcpOnYtZzt2YXIgeT10aGlzLl9jbG9uZUl0ZW1EYXRhKGQuaXRlbS5kYXRhKTtpZihudWxsPT1kLml0ZW0uZWRpdGFibGV8fGQuaXRlbS5lZGl0YWJsZS51cGRhdGVUaW1lfHxkLml0ZW0uZWRpdGFibGUudXBkYXRlR3JvdXB8fGkub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zKXtpZigodGhpcy5vcHRpb25zLmVkaXRhYmxlLm92ZXJyaWRlSXRlbXN8fG51bGw9PXIuZWRpdGFibGUpJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUudXBkYXRlVGltZXx8IXRoaXMub3B0aW9ucy5lZGl0YWJsZS5vdmVycmlkZUl0ZW1zJiZudWxsIT1yLmVkaXRhYmxlJiZyLmVkaXRhYmxlLnVwZGF0ZVRpbWUpaWYoZC5kcmFnTGVmdCl0aGlzLm9wdGlvbnMucnRsP3ZvaWQgMCE9eS5lbmQmJihwPWwuY29udmVydChkLmRhdGEuZW5kLFwiRGF0ZVwiKSxtPW5ldyBEYXRlKHAudmFsdWVPZigpK3UpLHkuZW5kPW8/byhtLG4scyk6bSk6dm9pZCAwIT15LnN0YXJ0JiYoYz1sLmNvbnZlcnQoZC5kYXRhLnN0YXJ0LFwiRGF0ZVwiKSxmPW5ldyBEYXRlKGMudmFsdWVPZigpK3UpLHkuc3RhcnQ9bz9vKGYsbixzKTpmKTtlbHNlIGlmKGQuZHJhZ1JpZ2h0KXRoaXMub3B0aW9ucy5ydGw/dm9pZCAwIT15LnN0YXJ0JiYoYz1sLmNvbnZlcnQoZC5kYXRhLnN0YXJ0LFwiRGF0ZVwiKSxmPW5ldyBEYXRlKGMudmFsdWVPZigpK3UpLHkuc3RhcnQ9bz9vKGYsbixzKTpmKTp2b2lkIDAhPXkuZW5kJiYocD1sLmNvbnZlcnQoZC5kYXRhLmVuZCxcIkRhdGVcIiksbT1uZXcgRGF0ZShwLnZhbHVlT2YoKSt1KSx5LmVuZD1vP28obSxuLHMpOm0pO2Vsc2UgaWYodm9pZCAwIT15LnN0YXJ0KWlmKGM9bC5jb252ZXJ0KGQuZGF0YS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpLGY9bmV3IERhdGUoYyt1KSx2b2lkIDAhPXkuZW5kKXtwPWwuY29udmVydChkLmRhdGEuZW5kLFwiRGF0ZVwiKTt2YXIgYj1wLnZhbHVlT2YoKS1jLnZhbHVlT2YoKTt5LnN0YXJ0PW8/byhmLG4scyk6Zix5LmVuZD1uZXcgRGF0ZSh5LnN0YXJ0LnZhbHVlT2YoKStiKX1lbHNlIHkuc3RhcnQ9bz9vKGYsbixzKTpmO2lmKGEmJiFkLmRyYWdMZWZ0JiYhZC5kcmFnUmlnaHQmJm51bGwhPWgmJnZvaWQgMCE9eS5ncm91cCl7dmFyIF89aC1kLmdyb3VwT2Zmc2V0O189TWF0aC5tYXgoMCxfKSxfPU1hdGgubWluKGkuZ3JvdXBJZHMubGVuZ3RoLTEsXykseS5ncm91cD1pLmdyb3VwSWRzW19dfXk9dGhpcy5fY2xvbmVJdGVtRGF0YSh5KSxpLm9wdGlvbnMub25Nb3ZpbmcoeSxmdW5jdGlvbih0KXt0JiZkLml0ZW0uc2V0RGF0YSh0aGlzLl9jbG9uZUl0ZW1EYXRhKHQsXCJEYXRlXCIpKX0uYmluZCh0aGlzKSl9fS5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiKX19LG4ucHJvdG90eXBlLl9tb3ZlVG9Hcm91cD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ3JvdXBzW2VdO2lmKGkmJmkuZ3JvdXBJZCE9dC5kYXRhLmdyb3VwKXt2YXIgbz10LnBhcmVudDtvLnJlbW92ZSh0KSxvLm9yZGVyKCksdC5kYXRhLmdyb3VwPWkuZ3JvdXBJZCxpLmFkZCh0KSxpLm9yZGVyKCl9fSxuLnByb3RvdHlwZS5fb25EcmFnRW5kPWZ1bmN0aW9uKHQpe2lmKHRoaXMudG91Y2h
21167QYXJhbXMuaXRlbUlzRHJhZ2dpbmc9ITEsdGhpcy50b3VjaFBhcmFtcy5pdGVtUHJvcHMpe3Quc3RvcFByb3BhZ2F0aW9uKCk7dmFyIGU9dGhpcyxpPXRoaXMuaXRlbXNEYXRhLmdldERhdGFTZXQoKSxvPXRoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzO3RoaXMudG91Y2hQYXJhbXMuaXRlbVByb3BzPW51bGwsby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBvPXQuaXRlbS5pZDtpZihudWxsIT1lLml0ZW1zRGF0YS5nZXQobyxlLml0ZW1PcHRpb25zKSl7dmFyIG49dGhpcy5fY2xvbmVJdGVtRGF0YSh0Lml0ZW0uZGF0YSk7ZS5vcHRpb25zLm9uTW92ZShuLGZ1bmN0aW9uKG4pe24/KG5baS5fZmllbGRJZF09byxpLnVwZGF0ZShuKSk6KHQuaXRlbS5zZXREYXRhKHQuZGF0YSksZS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIikpfSl9ZWxzZSBlLm9wdGlvbnMub25BZGQodC5pdGVtLmRhdGEsZnVuY3Rpb24oaSl7ZS5fcmVtb3ZlSXRlbSh0Lml0ZW0pLGkmJmUuaXRlbXNEYXRhLmdldERhdGFTZXQoKS5hZGQoaSksZS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9jaGFuZ2VcIil9KX0uYmluZCh0aGlzKSl9fSxuLnByb3RvdHlwZS5fb25Hcm91cENsaWNrPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ3JvdXBGcm9tVGFyZ2V0KHQpO2lmKGUmJmUubmVzdGVkR3JvdXBzKXt2YXIgaT10aGlzLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpLG89aS5nZXQoZS5ncm91cElkKTt2b2lkIDA9PW8uc2hvd05lc3RlZCYmKG8uc2hvd05lc3RlZD0hMCksby5zaG93TmVzdGVkPSFvLnNob3dOZXN0ZWQ7dmFyIG49aS5nZXQoZS5uZXN0ZWRHcm91cHMpLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC52aXNpYmxlPW8uc2hvd05lc3RlZCx0fSk7aWYoaS51cGRhdGUobi5jb25jYXQobykpLG8uc2hvd05lc3RlZClsLnJlbW92ZUNsYXNzTmFtZShlLmRvbS5sYWJlbCxcImNvbGxhcHNlZFwiKSxsLmFkZENsYXNzTmFtZShlLmRvbS5sYWJlbCxcImV4cGFuZGVkXCIpO2Vsc2V7bC5yZW1vdmVDbGFzc05hbWUoZS5kb20ubGFiZWwsXCJleHBhbmRlZFwiKTt2YXIgcz10aGlzLm9wdGlvbnMucnRsP1wiY29sbGFwc2VkLXJ0bFwiOlwiY29sbGFwc2VkXCI7bC5hZGRDbGFzc05hbWUoZS5kb20ubGFiZWwscyl9fX0sbi5wcm90b3R5cGUuX29uR3JvdXBEcmFnU3RhcnQ9ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXImJih0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXA9dGhpcy5ncm91cEZyb21UYXJnZXQodCksdGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwJiYodC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcj10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pKSl9LG4ucHJvdG90eXBlLl9vbkdyb3VwRHJhZz1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuZ3JvdXBFZGl0YWJsZS5vcmRlciYmdGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwKXt0LnN0b3BQcm9wYWdhdGlvbigpO3ZhciBlPXRoaXMuZ3JvdXBzRGF0YTt0aGlzLmdyb3Vwc0RhdGEgaW5zdGFuY2VvZiBjJiYoZT10aGlzLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpKTt2YXIgaT10aGlzLmdyb3VwRnJvbVRhcmdldCh0KTtpZihpJiZpLmhlaWdodCE9dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmhlaWdodCl7dmFyIG89aS50b3A8dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLnRvcCxuPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZLHM9bC5nZXRBYnNvbHV0ZVRvcChpLmRvbS5mb3JlZ3JvdW5kKSxyPXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cC5oZWlnaHQ7aWYobyl7aWYocytyPG4pcmV0dXJufWVsc2V7aWYocytpLmhlaWdodC1yPm4pcmV0dXJufX1pZihpJiZpIT10aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXApe3ZhciBhPWUuZ2V0KGkuZ3JvdXBJZCksaD1lLmdldCh0aGlzLmdyb3VwVG91Y2hQYXJhbXMuZ3JvdXAuZ3JvdXBJZCk7aCYmYSYmKHRoaXMub3B0aW9ucy5ncm91cE9yZGVyU3dhcChoLGEsZSksZS51cGRhdGUoaCksZS51cGRhdGUoYSkpO3ZhciBkPWUuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pO2lmKCFsLmVxdWFsQXJyYXkoZCx0aGlzLmdyb3VwVG91Y2hQYXJhbXMub3JpZ2luYWxPcmRlcikpZm9yKHZhciB1PXRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyLHA9dGhpcy5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmdyb3VwSWQsZj1NYXRoLm1pbih1Lmxlbmd0aCxkLmxlbmd0aCksbT0wLHY9MCxnPTA7bTxmOyl7Zm9yKDttK3Y8ZiYmbStnPGYmJmRbbSt2XT09dVttK2ddOyltKys7aWYobSt2Pj1mKWJyZWFrO2lmKGRbbSt2XT09cCl2PTE7ZWxzZSBpZih1W20rZ109PXApZz0xO2Vsc2V7dmFyIHk9ZC5pbmRleE9mKHVbbStnXSksYj1lLmdldChkW20rdl0pLF89ZS5nZXQodVttK2ddKTt0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlclN3YXAoYixfLGUpLGUudXBkYXRlKGIpLGUudXBkYXRlKF8pO3ZhciB3PWRbbSt2XTtkW20rdl09dVttK2ddLGRbeV09dyxtKyt9fX19fSxuLnByb3RvdHlwZS5fb25Hcm91cERyYWdFbmQ9ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLmdyb3VwRWRpdGFibGUub3JkZXImJnRoaXMuZ3JvdXBUb3VjaFBhcmFtcy5ncm91cCl7dC5zdG9wUHJvcGFnYXRpb24oKTt2YXIgZT10aGlzLGk9ZS5ncm91cFRvdWNoUGFyYW1zLmdyb3VwLmdyb3VwSWQsbz1lLmdyb3Vwc0RhdGEuZ2V0RGF0YVNldCgpLG49bC5leHRlbmQoe30sby5nZXQoaSkpO2Uub3B0aW9ucy5vbk1vdmVHcm91cChuLGZ1bmN0aW9uKHQpe2lmKHQpdFtvLl9maWVsZElkXT1pLG8udXBkYXRlKHQpO2Vsc2V7dmFyIG49by5nZXRJZHMoe29yZGVyOmUub3B0aW9ucy5ncm91cE9yZGVyfSk7aWYoIWwuZXF1YWxBcnJheShuLGUuZ3JvdXBUb3VjaFBhcmFtcy5vcmlnaW5hbE9yZGVyKSlmb3IodmFyIHM9ZS5ncm91cFRvdWNoUGFyYW1zLm9yaWdpbmFsT3JkZXIscj1NYXRoLm1pbihzLmxlbmd0aCxuLmxlbmd0aCksYT0wO2E8cjspe2Zvcig7YTxyJiZuW2FdPT1zW2FdOylhKys7aWYoYT49cilicmVhazt2YXIgaD1uLmluZGV4T2Yoc1thXSksZD1vLmdldChuW2FdKSx1PW8uZ2V0KHNbYV0pO2Uub3B0aW9ucy5ncm91cE9yZGVyU3dhcChkLHUsbyksby51cGRhdGUoZCksby51cGRhdGUodSk7dmFyIGM9blthXTtuW2FdPXNbYV0sbltoXT1jLGErK319fSksZS5ib2R5LmVtaXR0ZXIuZW1pdChcImdyb3VwRHJhZ2dlZFwiLHtncm91cElkOml9KX19LG4ucHJvdG90eXBlLl9vblNlbGVjdEl0ZW09ZnVuY3Rpb24odCl7aWYodGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBlPXQuc3JjRXZlbnQmJih0LnNyY0V2ZW50LmN0cmxLZXl8fHQuc3JjRXZlbnQubWV0YUtleSksaT10LnNyY0V2ZW50JiZ0LnNyY0V2ZW50LnNoaWZ0S2V5O2lmKGV8fGkpcmV0dXJuIHZvaWQgdGhpcy5fb25NdWx0aVNlbGVjdEl0ZW0odCk7dmFyIG89dGhpcy5nZXRTZWxlY3Rpb24oKSxuPXRoaXMuaXRlbUZyb21UYXJnZXQodCkscz1uP1tuLmlkXTpbXTt0aGlzLnNldFNlbGVjdGlvbihzKTt2YXIgcj10aGlzLmdldFNlbGVjdGlvbigpOyhyLmxlbmd0aD4wfHxvLmxlbmd0aD4wKSYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInNlbGVjdFwiLHtpdG
21167VtczpyLGV2ZW50OnR9KX19LG4ucHJvdG90eXBlLl9vbk1vdXNlT3Zlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpO2lmKGUpe2lmKGUhPT10aGlzLml0ZW1Gcm9tUmVsYXRlZFRhcmdldCh0KSl7dmFyIGk9ZS5nZXRUaXRsZSgpO2lmKHRoaXMub3B0aW9ucy5zaG93VG9vbHRpcHMmJmkpe251bGw9PXRoaXMucG9wdXAmJih0aGlzLnBvcHVwPW5ldyB3KHRoaXMuYm9keS5kb20ucm9vdCx0aGlzLm9wdGlvbnMudG9vbHRpcC5vdmVyZmxvd01ldGhvZHx8XCJmbGlwXCIpKSx0aGlzLnBvcHVwLnNldFRleHQoaSk7dmFyIG89dGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXI7dGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LmNsaWVudFgtbC5nZXRBYnNvbHV0ZUxlZnQobykrby5vZmZzZXRMZWZ0LHQuY2xpZW50WS1sLmdldEFic29sdXRlVG9wKG8pK28ub2Zmc2V0VG9wKSx0aGlzLnBvcHVwLnNob3coKX1lbHNlIG51bGwhPXRoaXMucG9wdXAmJnRoaXMucG9wdXAuaGlkZSgpO3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJpdGVtb3ZlclwiLHtpdGVtOmUuaWQsZXZlbnQ6dH0pfX19LG4ucHJvdG90eXBlLl9vbk1vdXNlT3V0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuaXRlbUZyb21UYXJnZXQodCk7aWYoZSl7ZSE9PXRoaXMuaXRlbUZyb21SZWxhdGVkVGFyZ2V0KHQpJiYobnVsbCE9dGhpcy5wb3B1cCYmdGhpcy5wb3B1cC5oaWRlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIml0ZW1vdXRcIix7aXRlbTplLmlkLGV2ZW50OnR9KSl9fSxuLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtRnJvbVRhcmdldCh0KSYmdGhpcy5vcHRpb25zLnNob3dUb29sdGlwcyYmdGhpcy5vcHRpb25zLnRvb2x0aXAuZm9sbG93TW91c2UmJnRoaXMucG9wdXAmJiF0aGlzLnBvcHVwLmhpZGRlbil7dmFyIGU9dGhpcy5ib2R5LmRvbS5jZW50ZXJDb250YWluZXI7dGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LmNsaWVudFgtbC5nZXRBYnNvbHV0ZUxlZnQoZSkrZS5vZmZzZXRMZWZ0LHQuY2xpZW50WS1sLmdldEFic29sdXRlVG9wKGUpK2Uub2Zmc2V0VG9wKSx0aGlzLnBvcHVwLnNob3coKX19LG4ucHJvdG90eXBlLl9vbk1vdXNlV2hlZWw9ZnVuY3Rpb24odCl7dGhpcy50b3VjaFBhcmFtcy5pdGVtSXNEcmFnZ2luZyYmdGhpcy5fb25EcmFnRW5kKHQpfSxuLnByb3RvdHlwZS5fb25VcGRhdGVJdGVtPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkKXt2YXIgZT10aGlzO2lmKHQpe3ZhciBpPWUuaXRlbXNEYXRhLmdldCh0LmlkKTt0aGlzLm9wdGlvbnMub25VcGRhdGUoaSxmdW5jdGlvbih0KXt0JiZlLml0ZW1zRGF0YS5nZXREYXRhU2V0KCkudXBkYXRlKHQpfSl9fX0sbi5wcm90b3R5cGUuX29uRHJvcE9iamVjdE9uSXRlbT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLml0ZW1Gcm9tVGFyZ2V0KHQpLGk9SlNPTi5wYXJzZSh0LmRhdGFUcmFuc2Zlci5nZXREYXRhKFwidGV4dFwiKSk7dGhpcy5vcHRpb25zLm9uRHJvcE9iamVjdE9uSXRlbShpLGUpfSxuLnByb3RvdHlwZS5fb25BZGRJdGVtPWZ1bmN0aW9uKHQpe2lmKHRoaXMub3B0aW9ucy5zZWxlY3RhYmxlJiZ0aGlzLm9wdGlvbnMuZWRpdGFibGUuYWRkKXt2YXIgZSxpLG89dGhpcyxuPXRoaXMub3B0aW9ucy5zbmFwfHxudWxsO3RoaXMub3B0aW9ucy5ydGw/KGU9bC5nZXRBYnNvbHV0ZVJpZ2h0KHRoaXMuZG9tLmZyYW1lKSxpPWUtdC5jZW50ZXIueCk6KGU9bC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uZnJhbWUpLGk9dC5jZW50ZXIueC1lKTt2YXIgcyxyLGE9dGhpcy5ib2R5LnV0aWwudG9UaW1lKGkpLGg9dGhpcy5ib2R5LnV0aWwuZ2V0U2NhbGUoKSxkPXRoaXMuYm9keS51dGlsLmdldFN0ZXAoKTtcImRyb3BcIj09dC50eXBlPyhyPUpTT04ucGFyc2UodC5kYXRhVHJhbnNmZXIuZ2V0RGF0YShcInRleHRcIikpLHIuY29udGVudD1yLmNvbnRlbnQ/ci5jb250ZW50OlwibmV3IGl0ZW1cIixyLnN0YXJ0PXIuc3RhcnQ/ci5zdGFydDpuP24oYSxoLGQpOmEsci50eXBlPXIudHlwZXx8XCJib3hcIixyW3RoaXMuaXRlbXNEYXRhLl9maWVsZElkXT1yLmlkfHxsLnJhbmRvbVVVSUQoKSxcInJhbmdlXCIhPXIudHlwZXx8ci5lbmR8fChzPXRoaXMuYm9keS51dGlsLnRvVGltZShpK3RoaXMucHJvcHMud2lkdGgvNSksci5lbmQ9bj9uKHMsaCxkKTpzKSk6KHI9e3N0YXJ0Om4/bihhLGgsZCk6YSxjb250ZW50OlwibmV3IGl0ZW1cIn0sclt0aGlzLml0ZW1zRGF0YS5fZmllbGRJZF09bC5yYW5kb21VVUlEKCksXCJyYW5nZVwiPT09dGhpcy5vcHRpb25zLnR5cGUmJihzPXRoaXMuYm9keS51dGlsLnRvVGltZShpK3RoaXMucHJvcHMud2lkdGgvNSksci5lbmQ9bj9uKHMsaCxkKTpzKSk7dmFyIHU9dGhpcy5ncm91cEZyb21UYXJnZXQodCk7dSYmKHIuZ3JvdXA9dS5ncm91cElkKSxyPXRoaXMuX2Nsb25lSXRlbURhdGEociksdGhpcy5vcHRpb25zLm9uQWRkKHIsZnVuY3Rpb24oZSl7ZSYmKG8uaXRlbXNEYXRhLmdldERhdGFTZXQoKS5hZGQoZSksXCJkcm9wXCI9PXQudHlwZSYmby5zZXRTZWxlY3Rpb24oW2UuaWRdKSl9KX19LG4ucHJvdG90eXBlLl9vbk11bHRpU2VsZWN0SXRlbT1mdW5jdGlvbih0KXtpZih0aGlzLm9wdGlvbnMuc2VsZWN0YWJsZSl7dmFyIGU9dGhpcy5pdGVtRnJvbVRhcmdldCh0KTtpZihlKXtcbiAgICB2YXIgaT10aGlzLm9wdGlvbnMubXVsdGlzZWxlY3Q/dGhpcy5nZXRTZWxlY3Rpb24oKTpbXTtpZigodC5zcmNFdmVudCYmdC5zcmNFdmVudC5zaGlmdEtleXx8ITEpJiZ0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3Qpe3ZhciBvPXRoaXMuaXRlbXNEYXRhLmdldChlLmlkKS5ncm91cCxzPXZvaWQgMDt0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCYmaS5sZW5ndGg+MCYmKHM9dGhpcy5pdGVtc0RhdGEuZ2V0KGlbMF0pLmdyb3VwKSx0aGlzLm9wdGlvbnMubXVsdGlzZWxlY3RQZXJHcm91cCYmdm9pZCAwIT1zJiZzIT1vfHxpLnB1c2goZS5pZCk7dmFyIHI9bi5fZ2V0SXRlbVJhbmdlKHRoaXMuaXRlbXNEYXRhLmdldChpLHRoaXMuaXRlbU9wdGlvbnMpKTtpZighdGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXB8fHM9PW8pe2k9W107Zm9yKHZhciBhIGluIHRoaXMuaXRlbXMpaWYodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShhKSl7dmFyIGg9dGhpcy5pdGVtc1thXSxkPWguZGF0YS5zdGFydCxsPXZvaWQgMCE9PWguZGF0YS5lbmQ/aC5kYXRhLmVuZDpkOyEoZD49ci5taW4mJmw8PXIubWF4KXx8dGhpcy5vcHRpb25zLm11bHRpc2VsZWN0UGVyR3JvdXAmJnMhPXRoaXMuaXRlbXNEYXRhLmdldChoLmlkKS5ncm91cHx8aCBpbnN0YW5jZW9mIF98fGkucHVzaChoLmlkKX19fWVsc2V7dmFyIHU9aS5pbmRleE9mKGUuaWQpOy0xPT11P2kucHVzaChlLmlkKTppLnNwbGljZSh1LDEpfXRoaXMuc2V0U2VsZWN0aW9uKGkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJzZWxlY3RcIix7aXRlbXM6dGhpcy5nZXRTZWxlY3Rpb24oKSxldmVudDp0fSl9fX0sbi5fZ2V0SXRlbVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlPW51bGwsaT1udWxsO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7KG51bGw9PWl8fHQuc3RhcnQ8aSkmJihpPXQuc3RhcnQpLHZvaWQgMCE9dC5lbmQ/KG51bGw9PWV8fHQuZW5kPmUpJiYoZT10LmVuZCk6KG51bGw9PWV8fHQuc3RhcnQ+ZSkmJihlPXQuc3RhcnQpfSkse21pbjppLG1heDplfX0sbi5wcm90b3R5cGUuaXRlbUZyb21FbGVtZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10O2U7KXtpZihlLmhhc093blByb3BlcnR5KFwidGltZWxpbmUtaXRlbVwiKSlyZXR1cm4gZVtcInRpbWVsaW5lLWl0ZW
211671cIl07ZT1lLnBhcmVudE5vZGV9cmV0dXJuIG51bGx9LG4ucHJvdG90eXBlLml0ZW1Gcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLml0ZW1Gcm9tRWxlbWVudCh0LnRhcmdldCl9LG4ucHJvdG90eXBlLml0ZW1Gcm9tUmVsYXRlZFRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVtRnJvbUVsZW1lbnQodC5yZWxhdGVkVGFyZ2V0KX0sbi5wcm90b3R5cGUuZ3JvdXBGcm9tVGFyZ2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZLGk9dGhpcy5ncm91cElkcztpLmxlbmd0aDw9MCYmdGhpcy5ncm91cHNEYXRhJiYoaT10aGlzLmdyb3Vwc0RhdGEuZ2V0SWRzKHtvcmRlcjp0aGlzLm9wdGlvbnMuZ3JvdXBPcmRlcn0pKTtmb3IodmFyIG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIG49aVtvXSxzPXRoaXMuZ3JvdXBzW25dLHI9cy5kb20uZm9yZWdyb3VuZCxhPWwuZ2V0QWJzb2x1dGVUb3Aocik7aWYoZT5hJiZlPGErci5vZmZzZXRIZWlnaHQpcmV0dXJuIHM7aWYoXCJ0b3BcIj09PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtKXtpZihvPT09dGhpcy5ncm91cElkcy5sZW5ndGgtMSYmZT5hKXJldHVybiBzfWVsc2UgaWYoMD09PW8mJmU8YStyLm9mZnNldClyZXR1cm4gc31yZXR1cm4gbnVsbH0sbi5pdGVtU2V0RnJvbVRhcmdldD1mdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQ7ZTspe2lmKGUuaGFzT3duUHJvcGVydHkoXCJ0aW1lbGluZS1pdGVtc2V0XCIpKXJldHVybiBlW1widGltZWxpbmUtaXRlbXNldFwiXTtlPWUucGFyZW50Tm9kZX1yZXR1cm4gbnVsbH0sbi5wcm90b3R5cGUuX2Nsb25lSXRlbURhdGE9ZnVuY3Rpb24odCxlKXt2YXIgaT1sLmV4dGVuZCh7fSx0KTtyZXR1cm4gZXx8KGU9dGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpLl9vcHRpb25zLnR5cGUpLHZvaWQgMCE9aS5zdGFydCYmKGkuc3RhcnQ9bC5jb252ZXJ0KGkuc3RhcnQsZSYmZS5zdGFydHx8XCJEYXRlXCIpKSx2b2lkIDAhPWkuZW5kJiYoaS5lbmQ9bC5jb252ZXJ0KGkuZW5kLGUmJmUuZW5kfHxcIkRhdGVcIikpLGl9LHQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsaSl7ZS5vcmRlckJ5U3RhcnQ9ZnVuY3Rpb24odCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuZGF0YS5zdGFydC1lLmRhdGEuc3RhcnR9KX0sZS5vcmRlckJ5RW5kPWZ1bmN0aW9uKHQpe3Quc29ydChmdW5jdGlvbih0LGUpe3JldHVybihcImVuZFwiaW4gdC5kYXRhP3QuZGF0YS5lbmQ6dC5kYXRhLnN0YXJ0KS0oXCJlbmRcImluIGUuZGF0YT9lLmRhdGEuZW5kOmUuZGF0YS5zdGFydCl9KX0sZS5zdGFjaz1mdW5jdGlvbih0LGksbyl7aWYobylmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnRvcD1udWxsO2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dO2lmKHMuc3RhY2smJm51bGw9PT1zLnRvcCl7cy50b3A9aS5heGlzO2Rve2Zvcih2YXIgcj1udWxsLGE9MCxoPXQubGVuZ3RoO2E8aDthKyspe3ZhciBkPXRbYV07aWYobnVsbCE9PWQudG9wJiZkIT09cyYmZC5zdGFjayYmZS5jb2xsaXNpb24ocyxkLGkuaXRlbSxkLm9wdGlvbnMucnRsKSl7cj1kO2JyZWFrfX1udWxsIT1yJiYocy50b3A9ci50b3Arci5oZWlnaHQraS5pdGVtLnZlcnRpY2FsKX13aGlsZShyKX19fSxlLnN1YnN0YWNrPWZ1bmN0aW9uKHQsaSxvKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnRvcD1udWxsO3ZhciBzPW8uaGVpZ2h0O2ZvcihuPTA7bj
21167x0Lmxlbmd0aDtuKyspe3ZhciByPXRbbl07aWYoci5zdGFjayYmbnVsbD09PXIudG9wKXtyLnRvcD1yLmJhc2VUb3A7ZG97Zm9yKHZhciBhPW51bGwsaD0wLGQ9dC5sZW5ndGg7aDxkO2grKyl7dmFyIGw9dFtoXTtpZihudWxsIT09bC50b3AmJmwhPT1yJiZlLmNvbGxpc2lvbihyLGwsaS5pdGVtLGwub3B0aW9ucy5ydGwpKXthPWw7YnJlYWt9fW51bGwhPWEmJihyLnRvcD1hLnRvcCthLmhlaWdodCtpLml0ZW0udmVydGljYWwpLHIudG9wK3IuaGVpZ2h0PnMmJihzPXIudG9wK3IuaGVpZ2h0KX13aGlsZShhKX19by5oZWlnaHQ9cy1vLnRvcCsuNSppLml0ZW0udmVydGljYWx9LGUubm9zdGFjaz1mdW5jdGlvbih0LGksbyxuKXtmb3IodmFyIHM9MDtzPHQubGVuZ3RoO3MrKylpZih2b2lkIDA9PXRbc10uZGF0YS5zdWJncm91cCl0W3NdLnRvcD1pLml0ZW0udmVydGljYWw7ZWxzZSBpZih2b2lkIDAhPT10W3NdLmRhdGEuc3ViZ3JvdXAmJm4pe3ZhciByPTA7Zm9yKHZhciBhIGluIG8pby5oYXNPd25Qcm9wZXJ0eShhKSYmMT09b1thXS52aXNpYmxlJiZvW2FdLmluZGV4PG9bdFtzXS5kYXRhLnN1Ymdyb3VwXS5pbmRleCYmKHIrPW9bYV0uaGVpZ2h0LG9bdFtzXS5kYXRhLnN1Ymdyb3VwXS50b3A9cik7dFtzXS50b3A9cisuNSppLml0ZW0udmVydGljYWx9bnx8ZS5zdGFja1N1Ymdyb3Vwcyh0LGksbyl9LGUuc3RhY2tTdWJncm91cHM9ZnVuY3Rpb24odCxpLG8pe2Zvcih2YXIgbiBpbiBvKWlmKG8uaGFzT3duUHJvcGVydHkobikpe29bbl0udG9wPTA7ZG97dmFyIHM9bnVsbDtmb3IodmFyIHIgaW4gbylpZihudWxsIT09b1tyXS50b3AmJnIhPT1uJiZvW25dLmluZGV4Pm9bcl0uaW5kZXgmJmUuY29sbGlzaW9uQnlUaW1lcyhvW25dLG9bcl0pKXtzPW9bcl07YnJlYWt9bnVsbCE9cyYmKG9bbl0udG9wPXMudG9wK3MuaGVpZ2h0KX13aGlsZShzKX1mb3IodmFyIGE9MDthPHQubGVuZ3RoO2ErKyl2b2lkIDAhPT10W2FdLmRhdGEuc3ViZ3JvdXAmJih0W2FdLnRvcD1vW3RbYV0uZGF0YS5zdWJncm91cF0udG9wKy41KmkuaXRlbS52ZXJ0aWNhbCl9LGUuc3RhY2tTdWJncm91cHNXaXRoSW5uZXJTdGFjaz1mdW5jdGlvbih0LGksbyl7dmFyIG49ITEscz1bXTtmb3IodmFyIHIgaW4gbylvW3JdLmhhc093blByb3BlcnR5KFwiaW5kZXhcIik/c1tvW3JdLmluZGV4XT1yOnMucHVzaChyKTtmb3IodmFyIGE9MDthPHMubGVuZ3RoO2ErKylpZihyPXNbYV0sby5oYXNPd25Qcm9wZXJ0eShyKSl7bj1ufHxvW3JdLnN0YWNrLG9bcl0udG9wPTA7Zm9yKHZhciBoIGluIG8pb1toXS52aXNpYmxlJiZvW3JdLmluZGV4Pm9baF0uaW5kZXgmJihvW3JdLnRvcCs9b1toXS5oZWlnaHQpO2Zvcih2YXIgZD10W3JdLGw9MDtsPGQubGVuZ3RoO2wrKyl2b2lkIDAhPT1kW2xdLmRhdGEuc3ViZ3JvdXAmJihkW2xdLnRvcD1vW2RbbF0uZGF0YS5zdWJncm91cF0udG9wKy41KmkuaXRlbS52ZXJ0aWNhbCxvW3JdLnN0YWNrJiYoZFtsXS5iYXNlVG9wPWRbbF0udG9wKSk7biYmb1tyXS5zdGFjayYmZS5zdWJzdGFjayh0W3JdLGksb1tyXSl9fSxlLmNvbGxpc2lvbj1mdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gbz90LnJpZ2h0LWkuaG9yaXpvbn
21167RhbCsuMDAxPGUucmlnaHQrZS53aWR0aCYmdC5yaWdodCt0LndpZHRoK2kuaG9yaXpvbnRhbC0uMDAxPmUucmlnaHQmJnQudG9wLWkudmVydGljYWwrLjAwMTxlLnRvcCtlLmhlaWdodCYmdC50b3ArdC5oZWlnaHQraS52ZXJ0aWNhbC0uMDAxPmUudG9wOnQubGVmdC1pLmhvcml6b250YWwrLjAwMTxlLmxlZnQrZS53aWR0aCYmdC5sZWZ0K3Qud2lkdGgraS5ob3Jpem9udGFsLS4wMDE+ZS5sZWZ0JiZ0LnRvcC1pLnZlcnRpY2FsKy4wMDE8ZS50b3ArZS5oZWlnaHQmJnQudG9wK3QuaGVpZ2h0K2kudmVydGljYWwtLjAwMT5lLnRvcH0sZS5jb2xsaXNpb25CeVRpbWVzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc3RhcnQ8PWUuc3RhcnQmJnQuZW5kPj1lLnN0YXJ0JiZ0LnRvcDxlLnRvcCtlLmhlaWdodCYmdC50b3ArdC5oZWlnaHQ+ZS50b3B8fGUuc3RhcnQ8PXQuc3RhcnQmJmUuZW5kPj10LnN0YXJ0JiZlLnRvcDx0LnRvcCt0LmhlaWdodCYmZS50b3ArZS5oZWlnaHQ+dC50b3B9fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7aWYodGhpcy5wcm9wcz17ZG90Ont3aWR0aDowLGhlaWdodDowfSxsaW5lOnt3aWR0aDowLGhlaWdodDowfX0sdGhpcy5vcHRpb25zPWksdCYmdm9pZCAwPT10LnN0YXJ0KXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgXCJzdGFydFwiIG1pc3NpbmcgaW4gaXRlbSAnK3QpO24uY2FsbCh0aGlzLHQsZSxpKX12YXIgbj1pKDM4KTtvLnByb3RvdHlwZT1uZXcgbihudWxsLG51bGwsbnVsbCksby5wcm90b3R5cGUuaXNWaXNpYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucy5hbGlnbixpPXRoaXMud2lkdGgqdC5nZXRNaWxsaXNlY29uZHNQZXJQaXhlbCgpO3JldHVyblwicmlnaHRcIj09ZT90aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpPnQuc3RhcnQmJnRoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCktaTx0LmVuZDpcImxlZnRcIj09ZT90aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK2k+dC5zdGFydCYmdGhpcy5kYXRhLnN0YXJ0LmdldFRpbWUoKTx0LmVuZDp0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpK2kvMj50LnN0YXJ0JiZ0aGlzLmRhdGEuc3RhcnQuZ2V0VGltZSgpLWkvMjx0LmVuZH0sby5wcm90b3R5cGUuX2NyZWF0ZURvbUVsZW1lbnQ9ZnVuY3Rpb24oKXt0aGlzLmRvbXx8KHRoaXMuZG9tPXt9LHRoaXMuZG9tLmJveD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLHRoaXMuZG9tLmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSx0aGlzLmRvbS5jb250ZW50LmNsYXNzTmFtZT1cInZpcy1pdGVtLWNvbnRlbnRcIix0aGlzLmRvbS5ib3guYXBwZW5kQ2hpbGQodGhpcy5kb20uY29udGVudCksdGhpcy5kb20ubGluZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiRElWXCIpLHRoaXMuZG9tLmxpbmUuY2xhc3NOYW1lPVwidmlzLWxpbmVcIix0aGlzLmRvbS5kb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKSx0aGlzLmRvbS5kb3QuY2xhc3NOYW1lPVwidmlzLWRvdFwiLHRoaXMuZG9tLmJveFtcInRpbWVsaW5lLWl0ZW1cIl09dGhpcyx0aGlzLmRpcnR5PSEwKX0sby5wcm90b3R5cGUuX2FwcGVuZERvbUVsZW1lbnQ9ZnVuY3Rpb24oKXtpZighdGhpcy5wYXJlbnQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBubyBwYXJlbnQgYXR0YWNoZWRcIik7aWYoIXRoaXMuZG9tLmJveC5wYXJlbnROb2RlKXt2YXIgdD10aGlzLnBhcmVudC5kb20uZm9yZWdyb3VuZDtpZighdCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IHBhcmVudCBoYXMgbm8gZm9yZWdyb3VuZCBjb250YWluZXIgZWxlbWVudFwiKTt0LmFwcGVuZENoaWxkKHRoaXMuZG9tLmJveCl9aWYoIXRoaXMuZG9tLmxpbmUucGFyZW50Tm9kZSl7dmFyIGU9dGhpcy5wYXJlbnQuZG9tLmJhY2tncm91bmQ7aWYoIWUpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGJhY2tncm91bmQgY29udGFpbmVyIGVsZW1lbnRcIik7ZS5hcHBlbmRDaGlsZCh0aGlzLmRvbS5saW5lKX1pZighdGhpcy5kb20uZG90LnBhcmVudE5vZGUpe3ZhciBpPXRoaXMucGFyZW50LmRvbS5heGlzO2lmKCFlKXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBheGlzIGNvbnRhaW5lciBlbGVtZW50XCIpO2kuYXBwZW5kQ2hpbGQodGhpcy5kb20uZG90KX10aGlzLmRpc3BsYXllZD0hMH0sby5wcm90b3R5cGUuX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cz1mdW5jdGlvbigpe2lmKHRoaXMuZGlydHkpe3RoaXMuX3VwZGF0ZUNvbnRlbnRzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmJveCksdGhpcy5fdXBkYXRlU3R5bGUodGhpcy5kb20uYm94KTt2YXIgdD10aGlzLmVkaXRhYmxlLnVwZGF0ZVRpbWV8fHRoaXMuZWRpdGFibGUudXBkYXRlR3JvdXAsZT0odGhpcy5kYXRhLmNsYXNzTmFtZT9cIiBcIit0aGlzLmRhdGEuY2xhc3NOYW1lOlwiXCIpKyh0aGlzLnNlbGVjdGVkP1wiIHZpcy1zZWxlY3RlZFwiOlwiXCIpKyh0P1wiIHZpcy1lZGl0YWJsZVwiOlwiIHZpcy1yZWFkb25seVwiKTt0aGlzLmRvbS5ib3guY2xhc3NOYW1lPVwidmlzLWl0ZW0gdmlzLWJveFwiK2UsdGhpcy5kb20ubGluZS5jbGFzc05hbWU9XCJ2aXMtaXRlbSB2aXMtbGluZVwiK2UsdGhpcy5kb20uZG90LmNsYXNzTmFtZT1cInZpcy1pdGVtIHZpcy1kb3RcIitlfX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybntwcmV2aW91czp7cmlnaHQ6dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0LGxlZnQ6dGhpcy5kb20uYm94LnN0eWxlLmxlZnR9LGRvdDp7aGVpZ2h0OnRoaXMuZG9tLmRvdC5vZmZzZXRIZWlnaHQsd2lkdGg6dGhpcy5kb20uZG90Lm9mZnNldFdpZHRofSxsaW5lOnt3aWR0aDp0aGlzLmRvbS5saW5lLm9mZnNldFdpZHRofSxib3g6e3dpZHRoOnRoaXMuZG9tLmJveC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20uYm94Lm9mZnNldEhlaWdodH19fSxvLnByb3RvdHlwZS5fdXBkYXRlRG9tQ29tcG9uZW50c1Npem
21167VzPWZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucy5ydGw/dGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PVwiMHB4XCI6dGhpcy5kb20uYm94LnN0eWxlLmxlZnQ9XCIwcHhcIix0aGlzLnByb3BzLmRvdC5oZWlnaHQ9dC5kb3QuaGVpZ2h0LHRoaXMucHJvcHMuZG90LndpZHRoPXQuZG90LndpZHRoLHRoaXMucHJvcHMubGluZS53aWR0aD10LmxpbmUud2lkdGgsdGhpcy53aWR0aD10LmJveC53aWR0aCx0aGlzLmhlaWdodD10LmJveC5oZWlnaHQsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5ib3guc3R5bGUucmlnaHQ9dC5wcmV2aW91cy5yaWdodDp0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10LnByZXZpb3VzLmxlZnQsdGhpcy5kaXJ0eT0hMX0sby5wcm90b3R5cGUuX3JlcGFpbnREb21BZGRpdGlvbmFscz1mdW5jdGlvbigpe3RoaXMuX3JlcGFpbnRPbkl0ZW1VcGRhdGVUaW1lVG9vbHRpcCh0aGlzLmRvbS5ib3gpLHRoaXMuX3JlcGFpbnREcmFnQ2VudGVyKCksdGhpcy5fcmVwYWludERlbGV0ZUJ1dHRvbih0aGlzLmRvbS5ib3gpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCl7dmFyIGUsaT1bdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJihlPXRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcygpKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJnRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXTtpZih0KXJldHVybiBpO3ZhciBvO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7bz10KCl9KSxvfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXtpZih0aGlzLmRpc3BsYXllZCl7dmFyIHQ9dGhpcy5kb207dC5ib3gucGFyZW50Tm9kZSYmdC5ib3gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmJveCksdC5saW5lLnBhcmVudE5vZGUmJnQubGluZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQubGluZSksdC5kb3QucGFyZW50Tm9kZSYmdC5kb3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0LmRvdCksdGhpcy5kaXNwbGF5ZWQ9ITF9fSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udmVyc2lvbi50b1NjcmVlbih0aGlzLmRhdGEuc3RhcnQpLGU9dGhpcy5vcHRpb25zLmFsaWduO1wicmlnaHRcIj09ZT90aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy53aWR0aCx0aGlzLmRvbS5ib3guc3R5bGUucmlnaHQ9dGhpcy5yaWdodCtcInB4XCIsdGhpcy5kb20ubGluZS5zdHlsZS5yaWdodD10LXRoaXMucHJvcHMubGluZS53aWR0aCtcInB4XCIsdGhpcy5kb20uZG90LnN0eWxlLnJpZ2h0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoLzItdGhpcy5wcm9wcy5kb3Qud2lkdGgvMitcInB4XCIpOih0aGlzLmxlZnQ9dC10aGlzLndpZHRoLHRoaXMuZG9tLmJveC5zdHlsZS5sZWZ0PXRoaXMubGVmdCtcInB4XCIsdGhpcy5kb20ubGluZS5zdHlsZS5sZWZ0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoK1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10LXRoaXMucHJvcHMubGluZS53aWR0aC8yLXRoaXMucHJvcHMuZG90LndpZHRoLzIrXCJweFwiKTpcImxlZnRcIj09ZT90aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQsdGhpcy5kb20uYm94LnN0eWxlLnJpZ2h0PXRoaXMucmlnaHQrXCJweFwiLHRoaXMuZG9tLmxpbmUuc3R5bGUucmlnaHQ9dCtcInB4XCIsdGhpcy5kb20uZG90LnN0eWxlLnJpZ2h0PXQrdGhpcy5wcm9wcy5saW5lLndpZHRoLzItdGhpcy5wcm9wcy5kb3Qud2lkdGgvMitcInB4XCIpOih0aGlzLmxlZnQ9dCx0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrXCJweFwiLHRoaXMuZG9tLmxpbmUuc3R5bGUubGVmdD10K1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10K3RoaXMucHJvcHMubGluZS53aWR0aC8yLXRoaXMucHJvcHMuZG90LndpZHRoLzIrXCJweFwiKTp0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy53aWR0aC8yLHRoaXMuZG9tLmJveC5zdHlsZS5yaWdodD10aGlzLnJpZ2h0K1wicHhcIix0aGlzLmRvbS5saW5lLnN0eWxlLnJpZ2h0PXQtdGhpcy5wcm9wcy5saW5lLndpZHRoK1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUucmlnaHQ9dC10aGlzLnByb3BzLmRvdC53aWR0aC8yK1wicHhcIik6KHRoaXMubGVmdD10LXRoaXMud2lkdGgvMix0aGlzLmRvbS5ib3guc3R5bGUubGVmdD10aGlzLmxlZnQrXCJweFwiLHRoaXMuZG9tLmxpbmUuc3R5bGUubGVmdD10LXRoaXMucHJvcHMubGluZS53aWR0aC8yK1wicHhcIix0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10LXRoaXMucHJvcHMuZG90LndpZHRoLzIrXCJweFwiKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbSxlPXRoaXMuZG9tLmJveCxpPXRoaXMuZG9tLmxpbmUsbz10aGlzLmRvbS5kb3Q7aWYoXCJ0b3BcIj09dCllLnN0eWxlLnRvcD0odGhpcy50b3B8fDApK1wicHhcIixpLnN0eWxlLnRvcD1cIjBcIixpLnN0eWxlLmhlaWdodD10aGlzLnBhcmVudC50b3ArdGhpcy50b3ArMStcInB4XCIsaS5zdHlsZS5ib3R0b209XCJcIjtlbHNle3ZhciBuPXRoaXMucGFyZW50Lml0ZW1TZXQucHJvcHMuaGVpZ2h0LHM9bi10aGlzLnBhcmVudC50b3AtdGhpcy5wYXJlbnQuaGVpZ2h0K3RoaXMudG9wO2Uuc3R5bGUudG9wPSh0aGlzLnBhcmVudC5oZWlnaHQtdGhpcy50b3AtdGhpcy5oZWlnaHR8fDApK1wicHhcIixpLnN0eWxlLnRvcD1uLXMrXCJweFwiLGkuc3R5bGUuYm90dG9tPVwiMFwifW8uc3R5bGUudG9wPS10aGlzLnByb3BzLmRvdC5oZWlnaHQvMitcInB4XCJ9LG8ucHJvdG90eXBlLmdldFdpZHRoTGVmdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLndpZHRoLzJ9LG8ucHJvdG90eXBlLmdldFdpZHRoUmlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53aWR0aC8yfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2RvdDp7dG9wOjAsd2lkdGg6MCxoZWlnaHQ6MH0sY29udGVudDp7aGVpZ2h0OjAsbWFyZ2luTGVmdDowLG1hcmdpblJpZ2h0OjB9fSx0aGlzLm9wdGlvbnM9aSx0JiZ2b2lkIDA9PXQuc3RhcnQpdGhyb3cgbmV3IEVycm9yKCdQcm9wZXJ0eSBcInN0YXJ0XCIgbWlzc2luZyBpbiBpdGVtICcrdCk7bi5jYWxsKHRoaXMsdCxlLGkpfXZhciBuPWkoMzgpO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy53aWR0aCp0LmdldE1pbGxpc2Vjb25kc1BlclBpeGVsKCk7cmV0dXJuIHRoaXMuZGF0YS5zdGFydC5nZXRUaW1lKCkrZT50LnN0YXJ0JiZ0aGlzLmRhdGEuc3RhcnQ8dC5lbmR9LG8ucHJvdG90eXBlLl9jcmVhdGVEb21FbGVtZW50PWZ1bmN0aW9uKCl7dGhpcy5kb218fCh0aGlzLmRvbT17fSx0aGlzLmRvbS5wb2ludD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmNvbnRlbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5jb250ZW50LmNsYXNzTmFtZT1cInZpcy1pdGVtLWNvbnRlbn
21167RcIix0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5jb250ZW50KSx0aGlzLmRvbS5kb3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5wb2ludC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5kb3QpLHRoaXMuZG9tLnBvaW50W1widGltZWxpbmUtaXRlbVwiXT10aGlzLHRoaXMuZGlydHk9ITApfSxvLnByb3RvdHlwZS5fYXBwZW5kRG9tRWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZFwiKTtpZighdGhpcy5kb20ucG9pbnQucGFyZW50Tm9kZSl7dmFyIHQ9dGhpcy5wYXJlbnQuZG9tLmZvcmVncm91bmQ7aWYoIXQpdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IHJlZHJhdyBpdGVtOiBwYXJlbnQgaGFzIG5vIGZvcmVncm91bmQgY29udGFpbmVyIGVsZW1lbnRcIik7dC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5wb2ludCl9dGhpcy5kaXNwbGF5ZWQ9ITB9LG8ucHJvdG90eXBlLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtpZih0aGlzLmRpcnR5KXt0aGlzLl91cGRhdGVDb250ZW50cyh0aGlzLmRvbS5jb250ZW50KSx0aGlzLl91cGRhdGVEYXRhQXR0cmlidXRlcyh0aGlzLmRvbS5wb2ludCksdGhpcy5fdXBkYXRlU3R5bGUodGhpcy5kb20ucG9pbnQpO3ZhciB0PXRoaXMuZWRpdGFibGUudXBkYXRlVGltZXx8dGhpcy5lZGl0YWJsZS51cGRhdGVHcm91cCxlPSh0aGlzLmRhdGEuY2xhc3NOYW1lP1wiIFwiK3RoaXMuZGF0YS5jbGFzc05hbWU6XCJcIikrKHRoaXMuc2VsZWN0ZWQ/XCIgdmlzLXNlbGVjdGVkXCI6XCJcIikrKHQ/XCIgdmlzLWVkaXRhYmxlXCI6XCIgdmlzLXJlYWRvbmx5XCIpO3RoaXMuZG9tLnBvaW50LmNsYXNzTmFtZT1cInZpcy1pdGVtIHZpcy1wb2ludFwiK2UsdGhpcy5kb20uZG90LmNsYXNzTmFtZT1cInZpcy1pdGVtIHZpcy1kb3RcIitlfX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybntkb3Q6e3dpZHRoOnRoaXMuZG9tLmRvdC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20uZG90Lm9mZnNldEhlaWdodH0sY29udGVudDp7d2lkdGg6dGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20uY29udGVudC5vZmZzZXRIZWlnaHR9LHBvaW50Ont3aWR0aDp0aGlzLmRvbS5wb2ludC5vZmZzZXRXaWR0aCxoZWlnaHQ6dGhpcy5kb20ucG9pbnQub2Zmc2V0SGVpZ2h0fX19LG8ucHJvdG90eXBlLl91cGRhdGVEb21Db21wb25lbnRzU2l6ZXM9ZnVuY3Rpb24odCl7dGhpcy5wcm9wcy5kb3Qud2lkdGg9dC5kb3Qud2lkdGgsdGhpcy5wcm9wcy5kb3QuaGVpZ2h0PXQuZG90LmhlaWdodCx0aGlzLnByb3BzLmNvbn
21167RlbnQuaGVpZ2h0PXQuY29udGVudC5oZWlnaHQsdGhpcy5vcHRpb25zLnJ0bD90aGlzLmRvbS5jb250ZW50LnN0eWxlLm1hcmdpblJpZ2h0PTIqdGhpcy5wcm9wcy5kb3Qud2lkdGgrXCJweFwiOnRoaXMuZG9tLmNvbnRlbnQuc3R5bGUubWFyZ2luTGVmdD0yKnRoaXMucHJvcHMuZG90LndpZHRoK1wicHhcIix0aGlzLndpZHRoPXQucG9pbnQud2lkdGgsdGhpcy5oZWlnaHQ9dC5wb2ludC5oZWlnaHQsdGhpcy5kb20uZG90LnN0eWxlLnRvcD0odGhpcy5oZWlnaHQtdGhpcy5wcm9wcy5kb3QuaGVpZ2h0KS8yK1wicHhcIix0aGlzLm9wdGlvbnMucnRsP3RoaXMuZG9tLmRvdC5zdHlsZS5yaWdodD10aGlzLnByb3BzLmRvdC53aWR0aC8yK1wicHhcIjp0aGlzLmRvbS5kb3Quc3R5bGUubGVmdD10aGlzLnByb3BzLmRvdC53aWR0aC8yK1wicHhcIix0aGlzLmRpcnR5PSExfSxvLnByb3RvdHlwZS5fcmVwYWludERvbUFkZGl0aW9uYWxzPWZ1bmN0aW9uKCl7dGhpcy5fcmVwYWludE9uSXRlbVVwZGF0ZVRpbWVUb29sdGlwKHRoaXMuZG9tLnBvaW50KSx0aGlzLl9yZXBhaW50RHJhZ0NlbnRlcigpLHRoaXMuX3JlcGFpbnREZWxldGVCdXR0b24odGhpcy5kb20ucG9pbnQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCl7dmFyIGUsaT1bdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJihlPXRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcygpKX0uYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJnRoaXMuX3VwZGF0ZURvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKGUpfS5iaW5kKHRoaXMpLHRoaXMuX3JlcGFpbnREb21BZGRpdGlvbmFscy5iaW5kKHRoaXMpXTtpZih0KXJldHVybiBpO3ZhciBvO3JldHVybiBpLmZvckVhY2goZnVuY3Rpb24odCl7bz10KCl9KSxvfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kaXNwbGF5ZWR8fHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmRpc3BsYXllZCYmKHRoaXMuZG9tLnBvaW50LnBhcmVudE5vZGUmJnRoaXMuZG9tLnBvaW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20ucG9pbnQpLHRoaXMuZGlzcGxheWVkPSExKX0sby5wcm90b3R5cGUucmVwb3NpdGlvblg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNvbnZlcnNpb24udG9TY3JlZW4odGhpcy5kYXRhLnN0YXJ0KTt0aGlzLm9wdGlvbnMucnRsPyh0aGlzLnJpZ2h0PXQtdGhpcy5wcm9wcy5kb3Qud2lkdGgsdGhpcy5kb20ucG9pbnQuc3R5bGUucmlnaHQ9dGhpcy5yaWdodCtcInB4XCIpOih0aGlzLmxlZnQ9dC10aGlzLnByb3BzLmRvdC53aWR0aCx0aGlzLmRvbS5wb2ludC5zdHlsZS5sZWZ0PXRoaXMubGVmdCtcInB4XCIpfSxvLnByb3RvdHlwZS5yZXBvc2l0aW9uWT1mdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbi5pdGVtLGU9dGhpcy5kb20ucG9pbnQ7ZS5zdHlsZS50b3A9XCJ0b3BcIj09dD90aGlzLnRvcCtcInB4XCI6dGhpcy5wYXJlbnQuaGVpZ2h0LXRoaXMudG9wLXRoaXMuaGVpZ2h0K1wicHhcIn0sby5wcm90b3R5cGUuZ2V0V2lkdGhMZWZ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMuZG90LndpZHRofSxvLnByb3RvdHlwZS5nZXRXaWR0aFJpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJvcHMuZG90LndpZHRofSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKHRoaXMucHJvcHM9e2NvbnRlbnQ6e3dpZHRoOjB9fSx0aGlzLm92ZXJmbG93PSExLHQpe2lmKHZvaWQgMD09dC5zdGFydCl0aHJvdyBuZXcgRXJyb3IoJ1Byb3BlcnR5IFwic3RhcnRcIiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKTtpZih2b2lkIDA9PXQuZW5kKXRocm93IG5ldyBFcnJvcignUHJvcGVydHkgXCJlbmRcIiBtaXNzaW5nIGluIGl0ZW0gJyt0LmlkKX1uLmNhbGwodGhpcyx0LGUsaSl9dmFyIG49aSgzOCkscz1pKDY5KSxyPWkoNzApO28ucHJvdG90eXBlPW5ldyBuKG51bGwsbnVsbCxudWxsKSxvLnByb3RvdHlwZS5iYXNlQ2xhc3NOYW1lPVwidmlzLWl0ZW0gdmlzLWJhY2tncm91bmRcIixvLnByb3RvdHlwZS5zdGFjaz0hMSxvLnByb3RvdHlwZS5pc1Zpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGF0YS5zdGFydDx0LmVuZCYmdGhpcy5kYXRhLmVuZD50LnN0YXJ0fSxvLnByb3RvdHlwZS5fY3JlYXRlRG9tRWxlbWVudD1mdW5jdGlvbigpe3RoaXMuZG9tfHwodGhpcy5kb209e30sdGhpcy5kb20uYm94PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20uZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmRvbS5mcmFtZS5jbGFzc05hbWU9XCJ2aXMtaXRlbS1vdmVyZmxvd1wiLHRoaXMuZG9tLmJveC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSksdGhpcy5kb20uY29udGVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmNvbnRlbnQuY2xhc3NOYW1lPVwidmlzLWl0ZW0tY29udGVudFwiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuZGlydHk9ITApfSxvLnByb3RvdHlwZS5fYXBwZW5kRG9tRWxlbWVudD1mdW5jdGlvbigpe2lmKCF0aGlzLnBhcmVudCl0aHJvdyBuZXcgRXJyb3IoXCJDYW5ub3QgcmVkcmF3IGl0ZW06IG5vIHBhcmVudCBhdHRhY2hlZFwiKTtpZighdGhpcy5kb20uYm94LnBhcmVudE5vZGUpe3ZhciB0PXRoaXMucGFyZW50LmRvbS5iYWNrZ3JvdW5kO2lmKCF0KXRocm93IG5ldyBFcnJvcihcIkNhbm5vdCByZWRyYXcgaXRlbTogcGFyZW50IGhhcyBubyBiYWNrZ3JvdW5kIGNvbnRhaW5lciBlbGVtZW50XCIpO3QuYXBwZW5kQ2hpbGQodGhpcy5kb20uYm94KX10aGlzLmRpc3BsYXllZD0hMH0sby5wcm90b3R5cGUuX3VwZGF0ZURpcnR5RG9tQ29tcG9uZW50cz1mdW5jdGlvbigpe2lmKHRoaXMuZGlydHkpe3RoaXMuX3VwZGF0ZUNvbnRlbnRzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZURhdGFBdHRyaWJ1dGVzKHRoaXMuZG9tLmNvbnRlbnQpLHRoaXMuX3VwZGF0ZVN0eWxlKHRoaXMuZG9tLmJveCk7dmFyIHQ9KHRoaXMuZGF0YS5jbGFzc05hbWU/XCIgXCIrdGhpcy5kYXRhLmNsYXNzTmFtZTpcIlwiKSsodGhpcy5zZWxlY3RlZD9cIiB2aXMtc2VsZWN0ZWRcIjpcIlwiKTt0aGlzLmRvbS5ib3guY2xhc3NOYW1lPXRoaXMuYmFzZUNsYXNzTmFtZSt0fX0sby5wcm90b3R5cGUuX2dldERvbUNvbXBvbmVudHNTaXplcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm92ZXJmbG93PVwiaGlkZGVuXCIhPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmRvbS5jb250ZW50KS5vdmVyZmxvdyx7Y29udGVudDp7d2lk
21167dGg6dGhpcy5kb20uY29udGVudC5vZmZzZXRXaWR0aH19fSxvLnByb3RvdHlwZS5fdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzPWZ1bmN0aW9uKHQpe3RoaXMucHJvcHMuY29udGVudC53aWR0aD10LmNvbnRlbnQud2lkdGgsdGhpcy5oZWlnaHQ9MCx0aGlzLmRpcnR5PSExfSxvLnByb3RvdHlwZS5fcmVwYWludERvbUFkZGl0aW9uYWxzPWZ1bmN0aW9uKCl7fSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24odCl7dmFyIGUsaT1bdGhpcy5fY3JlYXRlRG9tRWxlbWVudC5iaW5kKHRoaXMpLHRoaXMuX2FwcGVuZERvbUVsZW1lbnQuYmluZCh0aGlzKSx0aGlzLl91cGRhdGVEaXJ0eURvbUNvbXBvbmVudHMuYmluZCh0aGlzKSxmdW5jdGlvbigpe3RoaXMuZGlydHkmJihlPXRoaXMuX2dldERvbUNvbXBvbmVudHNTaXplcy5iaW5kKHRoaXMpKCkpfS5iaW5kKHRoaXMpLGZ1bmN0aW9uKCl7dGhpcy5kaXJ0eSYmdGhpcy5fdXBkYXRlRG9tQ29tcG9uZW50c1NpemVzLmJpbmQodGhpcykoZSl9LmJpbmQodGhpcyksdGhpcy5fcmVwYWludERvbUFkZGl0aW9uYWxzLmJpbmQodGhpcyldO2lmKHQpcmV0dXJuIGk7dmFyIG87cmV0dXJuIGkuZm9yRWFjaChmdW5jdGlvbih0KXtvPXQoKX0pLG99LG8ucHJvdG90eXBlLnNob3c9ci5wcm90b3R5cGUuc2hvdyxvLnByb3RvdHlwZS5oaWRlPXIucHJvdG90eXBlLmhpZGUsby5wcm90b3R5cGUucmVwb3NpdGlvblg9ci5wcm90b3R5cGUucmVwb3NpdGlvblgsby5wcm90b3R5cGUucmVwb3NpdGlvblk9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24uaXRlbTtpZih2b2lkIDAhPT10aGlzLmRhdGEuc3ViZ3JvdXApe3ZhciBvPXRoaXMuZGF0YS5zdWJncm91cDt0aGlzLmRvbS5ib3guc3R5bGUuaGVpZ2h0PXRoaXMucGFyZW50LnN1Ymdyb3Vwc1tvXS5oZWlnaHQrXCJweFwiLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9XCJ0b3BcIj09aT90aGlzLnBhcmVudC50b3ArdGhpcy5wYXJlbnQuc3ViZ3JvdXBzW29dLnRvcCtcInB4XCI6dGhpcy5wYXJlbnQudG9wK3RoaXMucGFyZW50LmhlaWdodC10aGlzLnBhcmVudC5zdWJncm91cHNbb10udG9wLXRoaXMucGFyZW50LnN1Ymdyb3Vwc1tvXS5oZWlnaHQrXCJweFwiLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209XCJcIn1lbHNlIHRoaXMucGFyZW50IGluc3RhbmNlb2Ygcz8oZT1NYXRoLm1heCh0aGlzLnBhcmVudC5oZWlnaHQsdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlci5oZWlnaHQsdGhpcy5wYXJlbnQuaXRlbVNldC5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQpLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209XCJib3R0b21cIj09aT9cIjBcIjpcIlwiLHRoaXMuZG9tLmJveC5zdHlsZS50b3A9XCJ0b3BcIj09aT9cIjBcIjpcIlwiKTooZT10aGlzLnBhcmVudC5oZWlnaHQsdGhpcy5kb20uYm94LnN0eWxlLnRvcD10aGlzLnBhcmVudC50b3ArXCJweFwiLHRoaXMuZG9tLmJveC5zdHlsZS5ib3R0b209XCJcIik7dGhpcy5kb20uYm94LnN0eWxlLmhlaWdodD1lK1wicHhcIn0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuY29udGFpbmVyPWUsdGhpcy5vdmVyZmxvd01ldGhvZD1pfHxcImNhcFwiLHRoaXMueD0wLHRoaXMueT0wLHRoaXMucGFkZGluZz01LHRoaXMuaGlkZGVuPSExLHRoaXMuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmZyYW1lLmNsYXNzTmFtZT1cInZpcy10b29sdGlwXCIsdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMueD1wYXJzZUludCh0KSx0aGlzLnk9cGFyc2VJbnQoZSl9fSx7a2V5Olwic2V0VGV4dFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBFbGVtZW50Pyh0aGlzLmZyYW1lLmlubmVySFRNTD1cIlwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodCkpOnRoaXMuZnJhbWUuaW5uZXJIVE1MPXR9fSx7a2V5Olwic2hvd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMD09PXQmJih0PSEwKSwhMD09PXQpe3ZhciBlPXRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0LGk9dGhpcy5mcmFtZS5jbGllbnRXaWR0aCxvPXRoaXMuZnJhbWUucGFyZW50Tm9kZS5jbGllbnRIZWlnaHQsbj10aGlzLmZyYW1lLnBhcmVudE5vZGUuY2xpZW50V2lkdGgscz0wLHI9MDtpZihcImZsaXBcIj09dGhpcy5vdmVyZmxvd01ldGhvZCl7dmFyIGE9ITEsaD0hMDt0aGlzLnktZTx0aGlzLnBhZGRpbmcmJihoPSExKSx0aGlzLngraT5uLXRoaXMucGFkZGluZyYmKGE9ITApLHM9YT90aGlzLngtaTp0aGlzLngscj1oP3RoaXMueS1lOnRoaXMueX1lbHNlIHI9dGhpcy55LWUscitlK3RoaXMucGFkZGluZz5vJiYocj1vLWUtdGhpcy5wYWRkaW5nKSxyPHRoaXMucGFkZGluZyYmKHI9dGhpcy5wYWRkaW5nKSxzPXRoaXMueCxzK2krdGhpcy5wYWRkaW5nPm4mJihzPW4taS10aGlzLnBhZGRpbmcpLHM8dGhpcy5wYWRkaW5nJiYocz10aGlzLnBhZGRpbmcpO3RoaXMuZnJhbWUuc3R5bGUubGVmdD1zK1wicHhcIix0aGlzLmZyYW1lLnN0eWxlLnRvcD1yK1wicHhcIix0aGlzLmZyYW1lLnN0eWxlLnZpc2liaWxpdHk9XCJ2aXNpYmxlXCIsdGhpcy5oaWRkZW49ITF9ZWxzZSB0aGlzLmhpZGUoKX19LHtrZXk6XCJoaWRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmhpZGRlbj0hMCx0aGlzLmZyYW1lLnN0eWxlLmxlZnQ9XCIwXCIsdGhpcy5mcmFtZS5zdHlsZS50b3A9XCIwXCIsdGhpcy5mcmFtZS5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCJ9fSx7a2V5OlwiZGVzdHJveVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZnJhbWUpfX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89XCJzdHJpbmdcIixuPVwiYm9vbGVhblwiLHM9XCJudW1iZXJcIixyPVwib2JqZWN0XCIsYT17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm59LGZpbHRlcjp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sY29udGFpbmVyOntkb206XCJkb21cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxhbGlnbjp7c3RyaW5nOm99LHJ0bDp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxyb2xsaW5nTW9kZTp7Zm9sbG93Ontib29sZWFuOm59LG9mZnNldDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LHZlcnRpY2FsU2Nyb2xsOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGhvcml6b250YWxTY3JvbGw6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sYXV0b1Jlc2l6ZTp7Ym9vbGVhbjpufSx0aHJvdHRsZVJlZHJhdzp7bnVtYmVyOnN9LGNsaWNrVG9Vc2U6e2Jvb2xlYW46bn0sZGF0YUF0dHJpYnV0ZXM6e3N0cmluZzpvLGFycmF5OlwiYXJyYXlcIn0sZWRpdGFibGU6e2FkZDp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxyZW1vdmU6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sdXBkYXRlR3JvdXA6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sdXBkYXRlVGltZTp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxvdmVycmlkZUl0ZW1zOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntib29sZWFuOm4sb2JqZWN0OnJ9fSxlbmQ6e251bWJlcjpzLGRhdGU6XCJkYXRlXCIsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbWludXRlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0saG91cjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHdlZWtkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx3ZWVrOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbW9udGg6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx5ZWFyOntzd
21167HJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn19LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHNlY29uZDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1pbnV0ZTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGhvdXI6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx3ZWVrZGF5OntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sZGF5OntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sd2Vlazp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1vbnRoOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0seWVhcjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtb21lbnQ6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sZ3JvdXBPcmRlcjp7c3RyaW5nOm8sZnVuY3Rpb246XCJmdW5jdGlvblwifSxncm91cEVkaXRhYmxlOnthZGQ6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0scmVtb3ZlOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG9yZGVyOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntib29sZWFuOm4sb2JqZWN0OnJ9fSxncm91cE9yZGVyU3dhcDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxoZWlnaHQ6e3N0cmluZzpvLG51bWJlcjpzfSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGVuZDp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0scmVwZWF0OntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyLGFycmF5OlwiYXJyYXlcIn19LGl0ZW1zQWx3YXlzRHJhZ2dhYmxlOntpdGVtOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHJhbmdlOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntib29sZWFuOm4sb2JqZWN0OnJ9fSxsaW1pdFNpemU6e2Jvb2xlYW46bn0sbG9jYWxlOntzdHJpbmc6b30sbG9jYWxlczp7X19hbnlfXzp7YW55OlwiYW55XCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LG1hcmdpbjp7YXhpczp7bnVtYmVyOnN9LGl0ZW06e2hvcml6b250YWw6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx2ZXJ0aWNhbDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cixudW1iZXI6c319LF9fdHlwZV9fOntvYmplY3Q6cixudW1iZXI6c319LG1heDp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0sbWF4SGVpZ2h0OntudW1iZXI6cyxzdHJpbmc6b30sbWF4TWlub3JDaGFyczp7bnVtYmVyOnN9LG1pbjp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0sbWluSGVpZ2h0OntudW1iZXI6cyxzdHJpbmc6b30sbW92ZWFibGU6e2Jvb2xlYW46bn0sbXVsdGlzZWxlY3Q6e2Jvb2xlYW46bn0sbXVsdGlzZWxlY3RQZXJHcm91cDp7Ym9vbGVhbjpufSxvbkFkZDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxvbkRyb3BPYmplY3RPbkl0ZW06e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25VcGRhdGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25Nb3ZlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LG9uTW92aW5nOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LG9uUmVtb3ZlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LG9uQWRkR3JvdXA6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25Nb3ZlR3JvdXA6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb25SZW1vdmVHcm91cDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxvbkluaXRpYWxEcmF3Q29tcGxldGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb3JkZXI6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sb3JpZW50YXRpb246e2F4aXM6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxpdGVtOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e3N0cmluZzpvLG9iamVjdDpyfX0sc2VsZWN0YWJsZTp7Ym9vbGVhbjpufSxzaG93Q3VycmVudFRpbWU6e2Jvb2xlYW46bn0sc2hvd01ham9yTGFiZWxzOntib29sZWFuOm59LHNob3dNaW5vckxhYmVsczp7Ym9vbGVhbjpufSxzdGFjazp7Ym9vbGVhbjpufSxzdGFja1N1Ymdyb3Vwczp7Ym9vbGVhbjpufSxzbmFwOntmdW5jdGlvbjpcImZ1bmN0aW9uXCIsbnVsbDpcIm51bGxcIn0sc3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LHRlbXBsYXRlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGdyb3VwVGVtcGxhdGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sdmlzaWJsZUZyYW1lVGVtcGxhdGU6e3N0cmluZzpvLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sc2hvd1Rvb2x0aXBzOntib29sZWFuOm59LHRvb2x0aXA6e2ZvbGxvd01vdXNlOntib29sZWFuOm59LG92ZXJmbG93TWV0aG9kOntzdHJpbmc6W1wiY2FwXCIsXCJmbGlwXCJdfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTp7dGVtcGxhdGU6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sX190eXBlX186e2Jvb2xlYW46bixvYmplY3Q6cn19LHRpbWVBeGlzOntzY2FsZTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0ZXA6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSx0eXBlOntzdHJpbmc6b30sd2lkdGg6e3N0cmluZzpvLG51bWJlcjpzfSx6b29tYWJsZTp7Ym9vbGVhbjpufSx6b29tS2V5OntzdHJpbmc6W1wiY3RybEtleVwiLFwiYWx0S2V5XCIsXCJtZXRhS2V5XCIsXCJcIl19LHpvb21NYXg6e251bWJlcjpzfSx6b29tTWluOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyfX0saD17Z2xvYmFsOnthbGlnbjpbXCJjZW50ZXJcIixcImxlZnRcIixcInJpZ2h0XCJdLGRpcmVjdGlvbj
21167ohMSxhdXRvUmVzaXplOiEwLGNsaWNrVG9Vc2U6ITEsZWRpdGFibGU6e2FkZDohMSxyZW1vdmU6ITEsdXBkYXRlR3JvdXA6ITEsdXBkYXRlVGltZTohMX0sZW5kOlwiXCIsZm9ybWF0OnttaW5vckxhYmVsczp7bWlsbGlzZWNvbmQ6XCJTU1NcIixzZWNvbmQ6XCJzXCIsbWludXRlOlwiSEg6bW1cIixob3VyOlwiSEg6bW1cIix3ZWVrZGF5OlwiZGRkIERcIixkYXk6XCJEXCIsd2VlazpcIndcIixtb250aDpcIk1NTVwiLHllYXI6XCJZWVlZXCJ9LG1ham9yTGFiZWxzOnttaWxsaXNlY29uZDpcIkhIOm1tOnNzXCIsc2Vjb25kOlwiRCBNTU1NIEhIOm1tXCIsbWludXRlOlwiZGRkIEQgTU1NTVwiLGhvdXI6XCJkZGQgRCBNTU1NXCIsd2Vla2RheTpcIk1NTU0gWVlZWVwiLGRheTpcIk1NTU0gWVlZWVwiLHdlZWs6XCJNTU1NIFlZWVlcIixtb250aDpcIllZWVlcIix5ZWFyOlwiXCJ9fSxncm91cHNEcmFnZ2FibGU6ITEsaGVpZ2h0OlwiXCIsbG9jYWxlOlwiXCIsbWFyZ2luOntheGlzOlsyMCwwLDEwMCwxXSxpdGVtOntob3Jpem9udGFsOlsxMCwwLDEwMCwxXSx2ZXJ0aWNhbDpbMTAsMCwxMDAsMV19fSxtYXg6XCJcIixtYXhIZWlnaHQ6XCJcIixtYXhNaW5vckNoYXJzOls3LDAsMjAsMV0sbWluOlwiXCIsbWluSGVpZ2h0OlwiXCIsbW92ZWFibGU6ITEsbXVsdGlzZWxlY3Q6ITEsbXVsdGlzZWxlY3RQZXJHcm91cDohMSxvcmllbnRhdGlvbjp7YXhpczpbXCJib3RoXCIsXCJib3R0b21cIixcInRvcFwiXSxpdGVtOltcImJvdHRvbVwiLFwidG9wXCJdfSxzZWxlY3RhYmxlOiEwLHNob3dDdXJyZW50VGltZTohMSxzaG93TWFqb3JMYWJlbHM6ITAsc2hvd01pbm9yTGFiZWxzOiEwLHN0YWNrOiEwLHN0YWNrU3ViZ3JvdXBzOiEwLHN0YXJ0OlwiXCIsc2hvd1Rvb2x0aXBzOiEwLHRvb2x0aXA6e2ZvbGxvd01vdXNlOiExLG92ZXJmbG93TWV0aG9kOlwiZmxpcFwifSx0b29sdGlwT25JdGVtVXBkYXRlVGltZTohMSx0eXBlOltcImJveFwiLFwicG9pbnRcIixcInJhbmdlXCIsXCJiYWNrZ3JvdW5kXCJdLHdpZHRoOlwiMTAwJVwiLHpvb21hYmxlOiEwLHpvb21LZXk6W1wiY3RybEtleVwiLFwiYWx0S2V5XCIsXCJtZXRhS2V5XCIsXCJcIl0sem9vbU1heDpbMzE1MzZlMTAsMTAsMzE1MzZlMTAsMV0sem9vbU1pbjpbMTAsMTAsMzE1MzZlMTAsMV19fTtlLmFsbE9wdGlvbnM9YSxlLmNvbmZpZ3VyZU9wdGlvbnM9aH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt0aGlzLmlkPXIucmFuZG9tVVVJRCgpLHRoaXMuYm9keT10LHRoaXMuZGVmYXVsdE9wdGlvbnM9e3lBeGlzT3JpZW50YXRpb246XCJsZWZ0XCIsZGVmYXVsdEdyb3VwOlwiZGVmYXVsdFwiLHNvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsZ3JhcGhIZWlnaHQ6XCI0MDBweFwiLHNoYWRlZDp7ZW5hYmxlZDohMSxvcmllbnRhdGlvbjpcImJvdHRvbVwifSxzdHlsZTpcImxpbmVcIixiYXJDaGFydDp7d2lkdGg6NTAsc2lkZUJ5U2lkZTohMSxhbGlnbjpcImNlbnRlclwifSxpbnRlcnBvbGF0aW9uOntlbmFibGVkOiEwLHBhcmFtZXRyaXphdGlvbjpcImNlbnRyaXBldGFsXCIsYWxwaGE6LjV9LGRyYXdQb2ludHM6e2VuYWJsZWQ6ITAsc2l6ZTo2LHN0eWxlOlwic3F1YXJlXCJ9LGRhdGFBeGlzOnt9LGxlZ2VuZDp7fSxncm91cHM6e3Zpc2liaWxpdHk6e319fSx0aGlzLm9wdGlvbnM9ci5leHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5kb209e30sdGhpcy5wcm9wcz17fSx0aGlzLmhhbW1lcj1udWxsLHRoaXMuZ3JvdXBzPXt9LHRoaXMuYWJvcnRlZEdyYXBoVXBkYXRlPSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSExLHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemU9ITEsdGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwO3ZhciBpPXRoaXM7dGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLml0ZW1MaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUsbyl7aS5fb25BZGQoZS5pdGVtcyl9LHVwZGF0ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25VcGRhdGUoZS5pdGVtcyl9LHJlbW92ZTpmdW5jdGlvbih0LGUsbyl7aS5fb25SZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmdyb3VwTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlLG8pe2kuX29uQWRkR3JvdXBzKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlLG8pe2kuX29uVXBkYXRlR3JvdXBzKGUuaXRlbXMpfSxyZW1vdmU6ZnVuY3Rpb24odCxlLG8pe2kuX29uUmVtb3ZlR3JvdXBzKGUuaXRlbXMpfX0sdGhpcy5pdGVtcz17fSx0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLmxhc3RTdGFydD10aGlzLmJvZHkucmFuZ2Uuc3RhcnQsdGhpcy50b3VjaFBhcmFtcz17fSx0aGlzLnN2Z0VsZW1lbnRzPXt9LHRoaXMuc2V0T3B0aW9ucyhlKSx0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlcz1bMF0sdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyYW5nZWNoYW5nZWRcIixmdW5jdGlvbigpe2kubGFzdFN0YXJ0PWkuYm9keS5yYW5nZS5zdGFydCxpLnN2Zy5zdHlsZS5sZWZ0PXIub3B0aW9uLmFzU2l6ZSgtaS5wcm9wcy53aWR0aCksaS5mb3JjZUdyYXBoVXBkYXRlPSEwLGkucmVkcmF3LmNhbGwoaSl9KSx0aGlzLl9jcmVhdGUoKSx0aGlzLmZyYW1ld29yaz17c3ZnOnRoaXMuc3ZnLHN2Z0VsZW1lbnRzOnRoaXMuc3ZnRWxlbWVudHMsb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOnRoaXMuZ3JvdXBzfX12YXIgbj1pKDYpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMiksYT1pKDE0KSxoPWkoMTEpLGQ9aSgxMiksbD1pKDE2KSx1PWkoMTA3KSxjPWkoMTA5KSxwPWkoMTEyKSxmPWkoMTEwKSxtPWkoMTExKSx2PWkoNzIpO28ucHJvdG90eXBlPW5ldyBsLG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO3QuY2xhc3NOYW1lPVwidmlzLWxpbmUtZ3JhcGhcIix0aGlzLmRvbS5mcmFtZT10LHRoaXMuc3ZnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiLHRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oXCJcIit0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQpLnJlcGxhY2UoXCJweFwiLFwiXCIpK1wicHhcIix0aGlzLnN2Zy5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0LmFwcGVuZENoaWxkKHRoaXMuc3ZnKSx0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb249XCJsZWZ0XCIsdGhpcy55QXhpc0xlZnQ9bmV3IHUodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5kYXRhQXhpcyx0aGlzLnN2Zyx0aGlzLm9wdGlvbnMuZ3JvdXBzKSx0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb249XCJyaWdodFwiLHRoaXMueUF4aXNSaWdodD1uZXcgdSh0aGlzLmJvZHksdGhpcy5vcHRpb25zLmRh
21167dGFBeGlzLHRoaXMuc3ZnLHRoaXMub3B0aW9ucy5ncm91cHMpLGRlbGV0ZSB0aGlzLm9wdGlvbnMuZGF0YUF4aXMub3JpZW50YXRpb24sdGhpcy5sZWdlbmRMZWZ0PW5ldyBwKHRoaXMuYm9keSx0aGlzLm9wdGlvbnMubGVnZW5kLFwibGVmdFwiLHRoaXMub3B0aW9ucy5ncm91cHMpLHRoaXMubGVnZW5kUmlnaHQ9bmV3IHAodGhpcy5ib2R5LHRoaXMub3B0aW9ucy5sZWdlbmQsXCJyaWdodFwiLHRoaXMub3B0aW9ucy5ncm91cHMpLHRoaXMuc2hvdygpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPVtcInNhbXBsaW5nXCIsXCJkZWZhdWx0R3JvdXBcIixcInN0YWNrXCIsXCJoZWlnaHRcIixcImdyYXBoSGVpZ2h0XCIsXCJ5QXhpc09yaWVudGF0aW9uXCIsXCJzdHlsZVwiLFwiYmFyQ2hhcnRcIixcImRhdGFBeGlzXCIsXCJzb3J0XCIsXCJncm91cHNcIl07dm9pZCAwPT09dC5ncmFwaEhlaWdodCYmdm9pZCAwIT09dC5oZWlnaHQ/KHRoaXMudXBkYXRlU1ZHaGVpZ2h0PSEwLHRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemU9ITApOnZvaWQgMCE9PXRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0JiZ2b2lkIDAhPT10LmdyYXBoSGVpZ2h0JiZwYXJzZUludCgodC5ncmFwaEhlaWdodCtcIlwiKS5yZXBsYWNlKFwicHhcIixcIlwiKSk8dGhpcy5ib2R5LmRvbVByb3BzLmNlbnRlckNvbnRhaW5lci5oZWlnaHQmJih0aGlzLnVwZGF0ZVNWR2hlaWdodD0hMCksci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLHIubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LFwiaW50ZXJwb2xhdGlvblwiKSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCxcImRyYXdQb2ludHNcIiksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJzaGFkZWRcIiksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJsZWdlbmRcIiksdC5pbnRlcnBvbGF0aW9uJiZcIm9iamVjdFwiPT0oMCxzLmRlZmF1bHQpKHQuaW50ZXJwb2xhdGlvbikmJnQuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24mJihcInVuaWZvcm1cIj09dC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj90aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0wOlwiY2hvcmRhbFwiPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTE6KHRoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbj1cImNlbnRyaXBldGFsXCIsdGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE9LjUpKSx0aGlzLnlBeGlzTGVmdCYmdm9pZCAwIT09dC5kYXRhQXhpcyYmKHRoaXMueUF4aXNMZWZ0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmRhdGFBeGlzKSx0aGlzLnlBeGlzUmlnaHQuc2V0T3B0aW9ucyh0aGlzLm9wdGlvbnMuZGF0YUF4aXMpKSx0aGlzLmxlZ2VuZExlZnQmJnZvaWQgMCE9PXQubGVnZW5kJiYodGhpcy5sZWdlbmRMZWZ0LnNldE9wdGlvbnModGhpcy5vcHRpb25zLmxlZ2VuZCksdGhpcy5sZWdlbmRSaWdodC5zZXRPcHRpb25zKHRoaXMub3B0aW9ucy5sZWdlbmQpKSx0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShcIl9fdW5ncm91cGVkX19cIikmJnRoaXMuZ3JvdXBzLl9fdW5ncm91cGVkX18uc2V0T3B0aW9ucyh0KX10aGlzLmRvbS5mcmFtZSYmKHRoaXMuZm9yY2VHcmFwaFVwZGF0ZT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2NoYW5nZVwiLHtxdWV1ZTohMH0pKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMsbz10aGlzLml0ZW1zRGF0YTtpZih0KXtpZighKHQgaW5zdGFuY2VvZiBofHx0IGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3XCIpO3RoaXMuaXRlbXNEYXRhPXR9ZWxzZSB0aGlzLml0ZW1zRGF0YT1udWxsO2lmKG8mJihyLmZvckVhY2godGhpcy5pdGVtTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLGU9by5nZXRJZHMoKSx0aGlzLl9vblJlbW92ZShlKSksdGhpcy5pdGVtc0RhdGEpe3ZhciBuPXRoaXMuaWQ7ci5mb3JFYWNoKHRoaXMuaXRlbUxpc3RlbmVycyxmdW5jdGlvbih0LGUpe2kuaXRlbXNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5pdGVtc0RhdGEuZ2V0SWRzKCksdGhpcy5fb25BZGQoZSl9fSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGUsaT10aGlzO2lmKHRoaXMuZ3JvdXBzRGF0YSl7ci5mb3JFYWNoKHRoaXMuZ3JvdXBMaXN0ZW5lcnMsZnVuY3Rpb24odCxlKXtpLmdyb3Vwc0RhdGEub2ZmKGUsdCl9KSxlPXRoaXMuZ3JvdXBzRGF0YS5nZXRJZHMoKSx0aGlzLmdyb3Vwc0RhdGE9bnVsbDtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl0aGlzLl9yZW1vdmVHcm91cChlW29dKX1pZih0KXtpZighKHQgaW5zdGFuY2VvZiBofHx0IGluc3RhbmNlb2YgZCkpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkRhdGEgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBEYXRhU2V0IG9yIERhdGFWaWV3XCIpO3RoaXMuZ3JvdXBzRGF0YT10fWVsc2UgdGhpcy5ncm91cHNEYXRhPW51bGw7aWYodGhpcy5ncm91cHNEYXRhKXt2YXIgbj10aGlzLmlkO3IuZm9yRWFjaCh0aGlzLmdyb3VwTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5ncm91cHNEYXRhLm9uKGUsdCxuKX0pLGU9dGhpcy5ncm91cHNEYXRhLmdldElkcygpLHRoaXMuX29uQWRkR3JvdXBzKGUpfX0sby5wcm90b3R5cGUuX29uVXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuX3VwZGF0ZUFsbEdyb3VwRGF0YSh0KX0sby5wcm90b3R5cGUuX29uQWRkPWZ1bmN0aW9uKHQpe3RoaXMuX29uVXBkYXRlKHQpfSxvLnByb3RvdHlwZS5fb25SZW1vdmU9ZnVuY3Rpb24odCl7dGhpcy5fb25VcGRhdGUodCl9LG8ucHJvdG90eXBlLl9vblVwZGF0ZUdyb3Vwcz1mdW5jdGlvbih0KXt0aGlzLl91cGRhdGVBbGxHcm91cERhdGEobnVsbCx0KX0sby5wcm90b3R5cGUuX29uQWRkR3JvdXBzPWZ1bmN0aW9uKHQpe3RoaXMuX29uVXBkYXRlR3JvdXBzKHQpfSxvLnByb3RvdHlwZS5fb25SZW1vdmVHcm91cHM9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0Lmxlbmd0aDtlKysp
21167dGhpcy5fcmVtb3ZlR3JvdXAodFtlXSk7dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIse3F1ZXVlOiEwfSl9LG8ucHJvdG90eXBlLl9yZW1vdmVHcm91cD1mdW5jdGlvbih0KXt0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KSYmKFwicmlnaHRcIj09dGhpcy5ncm91cHNbdF0ub3B0aW9ucy55QXhpc09yaWVudGF0aW9uPyh0aGlzLnlBeGlzUmlnaHQucmVtb3ZlR3JvdXAodCksdGhpcy5sZWdlbmRSaWdodC5yZW1vdmVHcm91cCh0KSx0aGlzLmxlZ2VuZFJpZ2h0LnJlZHJhdygpKToodGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAodCksdGhpcy5sZWdlbmRMZWZ0LnJlbW92ZUdyb3VwKHQpLHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKSksZGVsZXRlIHRoaXMuZ3JvdXBzW3RdKX0sby5wcm90b3R5cGUuX3VwZGF0ZUdyb3VwPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoZSk/KHRoaXMuZ3JvdXBzW2VdLnVwZGF0ZSh0KSxcInJpZ2h0XCI9PXRoaXMuZ3JvdXBzW2VdLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbj8odGhpcy55QXhpc1JpZ2h0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kUmlnaHQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy55QXhpc0xlZnQucmVtb3ZlR3JvdXAoZSksdGhpcy5sZWdlbmRMZWZ0LnJlbW92ZUdyb3VwKGUpKToodGhpcy55QXhpc0xlZnQudXBkYXRlR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy5sZWdlbmRMZWZ0LnVwZGF0ZUdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMueUF4aXNSaWdodC5yZW1vdmVHcm91cChlKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlbW92ZUdyb3VwKGUpKSk6KHRoaXMuZ3JvdXBzW2VdPW5ldyBjKHQsZSx0aGlzLm9wdGlvbnMsdGhpcy5ncm91cHNVc2luZ0RlZmF1bHRTdHlsZXMpLFwicmlnaHRcIj09dGhpcy5ncm91cHNbZV0ub3B0aW9ucy55QXhpc09yaWVudGF0aW9uPyh0aGlzLnlBeGlzUmlnaHQuYWRkR3JvdXAoZSx0aGlzLmdyb3Vwc1tlXSksdGhpcy5sZWdlbmRSaWdodC5hZGRHcm91cChlLHRoaXMuZ3JvdXBzW2VdKSk6KHRoaXMueUF4aXNMZWZ0LmFkZEdyb3VwKGUsdGhpcy5ncm91cHNbZV0pLHRoaXMubGVnZW5kTGVmdC5hZGRHcm91cChlLHRoaXMuZ3JvdXBzW2VdKSkpLHRoaXMubGVnZW5kTGVmdC5yZWRyYXcoKSx0aGlzLmxlZ2VuZFJpZ2h0LnJlZHJhdygpfSxvLnByb3RvdHlwZS5fdXBkYXRlQWxsR3JvdXBEYXRhPWZ1bmN0aW9uKHQsZSl7aWYobnVsbCE9dGhpcy5pdGVtc0RhdGEpe3ZhciBpPXt9LG89dGhpcy5pdGVtc0RhdGEuZ2V0KCksbj10aGlzLml0ZW1zRGF0YS5fZmllbGRJZCxzPXt9O3QmJnQubWFwKGZ1bmN0aW9uKHQpe3NbdF09dH0pO2Zvcih2YXIgYT17fSxoPTA7aDxvLmxlbmd0aDtoKyspe3ZhciBkPW9baF0sbD1kLmdyb3VwO251bGwhPT1sJiZ2b2lkIDAhPT1sfHwobD1cIl9fdW5ncm91cGVkX19cIiksYS5oYXNPd25Qcm9wZXJ0eShsKT9hW2xdKys6YVtsXT0xfXZhciB1PXt9O2lmKCFlJiZ0KWZvcihsIGluIHRoaXMuZ3JvdXBzKWlmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpKXt2PXRoaXMuZ3JvdXBzW2xdO3ZhciBjPXYuZ2V0SXRlbXMoKTtpW2xdPWMuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiB1W3Rbbl1dPXRbbl0sdFtuXSE9PXNbdFtuXV19KTt2YXIgcD1hW2xdO2FbbF0tPWlbbF0ubGVuZ3RoLGlbbF0ubGVuZ3RoPHAmJihpW2xdW3AtMV09e30pfWZvcihoPTA7aDxvLmxlbmd0aDtoKyspaWYoZD1vW2hdLGw9ZC5ncm91cCxudWxsIT09bCYmdm9pZCAwIT09bHx8KGw9XCJfX3VuZ3JvdXBlZF9fXCIpLGV8fCF0fHxkW25dPT09c1tkW25dXXx8IXUuaGFzT3duUHJvcGVydHkoZFtuXSkpe2kuaGFzT3duUHJvcGVydHkobCl8fChpW2xdPW5ldyBBcnJheShhW2xdKSk7dmFyIGY9ci5icmlkZ2VPYmplY3QoZCk7Zi54PXIuY29udmVydChkLngsXCJEYXRlXCIpLGYuZW5kPXIuY29udmVydChkLmVuZCxcIkRhdGVcIiksZi5vcmdpbmFsWT1kLnksZi55PU51bWJlcihkLnkpLFxuICAgIGZbbl09ZFtuXTt2YXIgbT1pW2xdLmxlbmd0aC1hW2xdLS07aVtsXVttXT1mfWZvcihsIGluIHRoaXMuZ3JvdXBzKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpJiYoaS5oYXNPd25Qcm9wZXJ0eShsKXx8KGlbbF09bmV3IEFycmF5KDApKSk7Zm9yKGwgaW4gaSlpZihpLmhhc093blByb3BlcnR5KGwpKWlmKDA9PWlbbF0ubGVuZ3RoKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGwpJiZ0aGlzLl9yZW1vdmVHcm91cChsKTtlbHNle3ZhciB2PXZvaWQgMDt2b2lkIDAhPXRoaXMuZ3JvdXBzRGF0YSYmKHY9dGhpcy5ncm91cHNEYXRhLmdldChsKSksdm9pZCAwPT12JiYodj17aWQ6bCxjb250ZW50OnRoaXMub3B0aW9ucy5kZWZhdWx0R3JvdXArbH0pLHRoaXMuX3VwZGF0ZUdyb3VwKHYsbCksdGhpcy5ncm91cHNbbF0uc2V0SXRlbXMoaVtsXSl9dGhpcy5mb3JjZUdyYXBoVXBkYXRlPSEwLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfY2hhbmdlXCIse3F1ZXVlOiEwfSl9fSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0hMTt0aGlzLnByb3BzLndpZHRoPXRoaXMuZG9tLmZyYW1lLm9mZnNldFdpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5jZW50ZXJDb250YWluZXIuaGVpZ2h0LXRoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIudG9wLXRoaXMuYm9keS5kb21Qcm9wcy5ib3JkZXIuYm90dG9tLHQ9dGhpcy5faXNSZXNpemVkKCl8fHQ7dmFyIGU9dGhpcy5ib2R5LnJhbmdlLmVuZC10aGlzLmJvZHkucmFuZ2Uuc3RhcnQsaT1lIT10aGlzLmxhc3RWaXNpYmxlSW50ZXJ2YWw7aWYodGhpcy5sYXN0VmlzaWJsZUludGVydmFsPWUsMT09dCYmKHRoaXMuc3ZnLnN0eWxlLndpZHRoP
21167XIub3B0aW9uLmFzU2l6ZSgzKnRoaXMucHJvcHMud2lkdGgpLHRoaXMuc3ZnLnN0eWxlLmxlZnQ9ci5vcHRpb24uYXNTaXplKC10aGlzLnByb3BzLndpZHRoKSwtMT09KHRoaXMub3B0aW9ucy5oZWlnaHQrXCJcIikuaW5kZXhPZihcIiVcIikmJjEhPXRoaXMudXBkYXRlU1ZHaGVpZ2h0T25SZXNpemV8fCh0aGlzLnVwZGF0ZVNWR2hlaWdodD0hMCkpLDE9PXRoaXMudXBkYXRlU1ZHaGVpZ2h0Pyh0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQhPXRoaXMucHJvcHMuaGVpZ2h0K1wicHhcIiYmKHRoaXMub3B0aW9ucy5ncmFwaEhlaWdodD10aGlzLnByb3BzLmhlaWdodCtcInB4XCIsdGhpcy5zdmcuc3R5bGUuaGVpZ2h0PXRoaXMucHJvcHMuaGVpZ2h0K1wicHhcIiksdGhpcy51cGRhdGVTVkdoZWlnaHQ9ITEpOnRoaXMuc3ZnLnN0eWxlLmhlaWdodD0oXCJcIit0aGlzLm9wdGlvbnMuZ3JhcGhIZWlnaHQpLnJlcGxhY2UoXCJweFwiLFwiXCIpK1wicHhcIiwxPT10fHwxPT1pfHwxPT10aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZXx8MT09dGhpcy5mb3JjZUdyYXBoVXBkYXRlKXQ9dGhpcy5fdXBkYXRlR3JhcGgoKXx8dCx0aGlzLmZvcmNlR3JhcGhVcGRhdGU9ITE7ZWxzZSBpZigwIT10aGlzLmxhc3RTdGFydCl7dmFyIG89dGhpcy5ib2R5LnJhbmdlLnN0YXJ0LXRoaXMubGFzdFN0YXJ0LG49dGhpcy5ib2R5LnJhbmdlLmVuZC10aGlzLmJvZHkucmFuZ2Uuc3RhcnQ7aWYoMCE9dGhpcy5wcm9wcy53aWR0aCl7dmFyIHM9dGhpcy5wcm9wcy53aWR0aC9uLGE9bypzO3RoaXMuc3ZnLnN0eWxlLmxlZnQ9LXRoaXMucHJvcHMud2lkdGgtYStcInB4XCJ9fXJldHVybiB0aGlzLmxlZ2VuZExlZnQucmVkcmF3KCksdGhpcy5sZWdlbmRSaWdodC5yZWRyYXcoKSx0fSxvLnByb3RvdHlwZS5fZ2V0U29ydGVkR3JvdXBJZHM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcy5ncm91cHMpaWYodGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBpPXRoaXMuZ3JvdXBzW2VdOzEhPWkudmlzaWJsZXx8dm9pZCAwIT09dGhpcy5vcHRpb25zLmdyb3Vwcy52aXNpYmlsaXR5W2VdJiYxIT10aGlzLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbZV18fHQucHVzaCh7aWQ6ZSx6SW5kZXg6aS5vcHRpb25zLnpJbmRleH0pfXIuaW5zZXJ0U29ydCh0LGZ1bmN0aW9uKHQsZSl7dmFyIGk9dC56SW5kZXgsbz1lLnpJbmRleDtyZXR1cm4gdm9pZCAwPT09aSYmKGk9MCksdm9pZCAwPT09byYmKG89MCksaT09bz8wOmk8bz8tMToxfSk7Zm9yKHZhciBvPW5ldyBBcnJheSh0Lmxlbmd0aCksbj0wO248dC5sZW5ndGg7bisrKW9bbl09dFtuXS5pZDtyZXR1cm4gb30sby5wcm90b3R5cGUuX3VwZGF0ZUdyYXBoPWZ1bmN0aW9uKCl7aWYoYS5wcmVwYXJlRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksMCE9dGhpcy5wcm9wcy53aWR0aCYmbnVsbCE9dGhpcy5pdGVtc0RhdGEpe3ZhciB0LGUsaT17fSxvPXRoaXMuYm9keS51dGlsLnRvR2xvYmFsVGltZSgtdGhpcy5ib2R5LmRvbVByb3BzLnJvb3Qud2lkdGgpLG49dGhpcy5ib2R5LnV0aWwudG9HbG9iYWxUaW1lKDIqdGhpcy5ib2R5LmRvbVByb3BzLnJvb3Qud2lkdGgpLHM9dGhpcy5fZ2V0U29ydGVkR3JvdXBJZHMoKTtpZihzLmxlbmd0aD4wKXt2YXIgcj17fTtmb3IodGhpcy5fZ2V0UmVsZXZhbnREYXRhKHMscixvLG4pLHRoaXMuX2FwcGx5U2FtcGxpbmcocyxyKSxlPTA7ZTxzLmxlbmd0aDtlKyspdGhpcy5fY29udmVydFhjb29yZGluYXRlcyhyW3NbZV1dKTtpZih0aGlzLl9nZXRZUmFuZ2VzKHMscixpKSwxPT10aGlzLl91cGRhdGVZQXhpcyhzLGkpKXJldHVybiBhLmNsZWFudXBFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKSx0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZT0hMCwhMDt0aGlzLmFib3J0ZWRHcmFwaFVwZGF0ZT0hMTt2YXIgaD12b2lkIDA7Zm9yKGU9MDtlPHMubGVuZ3RoO2UrKyl0PXRoaXMuZ3JvdXBzW3NbZV1dLCEwPT09dGhpcy5vcHRpb25zLnN0YWNrJiZcImxpbmVcIj09PXRoaXMub3B0aW9ucy5zdHlsZSYmKHZvaWQgMCE9dC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmcmJnQub3B0aW9ucy5leGNsdWRlRnJvbVN0YWNraW5nfHwodm9pZCAwIT1oJiYodGhpcy5fc3RhY2soclt0LmlkXSxyW2guaWRdKSwxPT10Lm9wdGlvbnMuc2hhZGVkLmVuYWJsZWQmJlwiZ3JvdXBcIiE9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24mJihcInRvcFwiPT10Lm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiZcImdyb3VwXCIhPT1oLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPyhoLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPVwiZ3JvdXBcIixoLm9wdGlvbnMuc2hhZGVkLmdyb3VwSWQ9dC5pZCk6KHQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb249XCJncm91cFwiLHQub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZD1oLmlkKSkpLGg9dCkpLHRoaXMuX2NvbnZlcnRZY29vcmRpbmF0ZXMocltzW2VdXSx0KTt2YXIgZD17fTtmb3IoZT0wO2U8cy5sZW5ndGg7ZSsrKWlmKHQ9dGhpcy5ncm91cHNbc1tlXV0sXCJsaW5lXCI9PT10Lm9wdGlvbnMuc3R5bGUmJjE9PXQub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCl7dmFyIGw9cltzW2VdXTtpZihudWxsPT1sfHwwPT1sLmxlbmd0aCljb250aW51ZTtpZihkLmhhc093blByb3BlcnR5KHNbZV0pfHwoZFtzW2VdXT1tLmNhbGNQYXRoKGwsdCkpLFwiZ3JvdXBcIj09PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24pe3ZhciB1PXQub3B0aW9ucy5zaGFkZWQuZ3JvdXBJZDtpZigtMT09PXMuaW5kZXhPZih1KSl7Y29uc29sZS5sb2codC5pZCtcIjogVW5rbm93biBzaGFkaW5nIGdyb3VwIHRhcmdldCBnaXZlbjpcIit1KTtjb250aW51ZX1kLmhhc093blByb3BlcnR5KHUpfHwoZFt1XT1tLmNhbGNQYXRoKHJbdV0sdGhpcy5ncm91cHNbdV0pKSxtLmRyYXdTaGFkaW5nKGRbc1tlXV0sdCxkW3VdLHRoaXMuZnJhbWV3b3JrKX1lbHNlIG0uZHJhd1NoYWRpbmcoZFtzW2VdXSx0LHZvaWQgMCx0aGlzLmZyYW1ld29yayl9Zm9yKGYuZHJhdyhzLHIsdGhpcy5mcmFtZXdvcmspLGU9MDtlPHMubGVuZ3RoO2UrKylpZih0PXRoaXMuZ3JvdXBzW3NbZV1dLHJbc1tlXV0ubGVuZ3RoPjApc3dpdGNoKHQub3B0aW9ucy5zdHlsZSl7Y2FzZVwibGluZVwiOmQuaGFzT3duUHJvcGVydHkoc1tlXSl8fChkW3NbZV1dPW0uY2FsY1BhdGgocltzW2VdXSx0KSksbS5kcmF3KGRbc1tlXV0sdCx0aGlzLmZyYW1ld29yayk7Y2FzZVwicG9pbnRcIjpjYXNlXCJwb2ludHNcIjpcInBvaW50XCIhPXQub3B0aW9ucy5zdHlsZSYmXCJwb2ludHNcIiE9dC5vcHRpb25zLnN0eWxlJiYxIT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkfHx2LmRyYXcocltzW2VdXSx0LH
21167RoaXMuZnJhbWV3b3JrKX19fXJldHVybiBhLmNsZWFudXBFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKSwhMX0sby5wcm90b3R5cGUuX3N0YWNrPWZ1bmN0aW9uKHQsZSl7dmFyIGksbyxuLHMscjtpPTA7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3M9dm9pZCAwLHI9dm9pZCAwO2Zvcih2YXIgaD1pO2g8ZS5sZW5ndGg7aCsrKXtpZihlW2hdLng9PT10W2FdLngpe3M9ZVtoXSxyPWVbaF0saT1oO2JyZWFrfWlmKGVbaF0ueD50W2FdLngpe3I9ZVtoXSxzPTA9PWg/cjplW2gtMV0saT1oO2JyZWFrfX12b2lkIDA9PT1yJiYocz1lW2UubGVuZ3RoLTFdLHI9ZVtlLmxlbmd0aC0xXSksbz1yLngtcy54LG49ci55LXMueSx0W2FdLnk9MD09bz90W2FdLm9yZ2luYWxZK3IueTp0W2FdLm9yZ2luYWxZK24vbyoodFthXS54LXMueCkrcy55fX0sby5wcm90b3R5cGUuX2dldFJlbGV2YW50RGF0YT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbixzLGEsaDtpZih0Lmxlbmd0aD4wKWZvcihzPTA7czx0Lmxlbmd0aDtzKyspe249dGhpcy5ncm91cHNbdFtzXV07dmFyIGQ9bi5nZXRJdGVtcygpO2lmKDE9PW4ub3B0aW9ucy5zb3J0KXt2YXIgbD1mdW5jdGlvbih0LGUpe3JldHVybiB0LmdldFRpbWUoKT09ZS5nZXRUaW1lKCk/MDp0PGU/LTE6MX0sdT1NYXRoLm1heCgwLHIuYmluYXJ5U2VhcmNoVmFsdWUoZCxpLFwieFwiLFwiYmVmb3JlXCIsbCkpLGM9TWF0aC5taW4oZC5sZW5ndGgsci5iaW5hcnlTZWFyY2hWYWx1ZShkLG8sXCJ4XCIsXCJhZnRlclwiLGwpKzEpO2M8PTAmJihjPWQubGVuZ3RoKTt2YXIgcD1uZXcgQXJyYXkoYy11KTtmb3IoYT11O2E8YzthKyspaD1uLml0ZW1zRGF0YVthXSxwW2EtdV09aDtlW3Rbc11dPXB9ZWxzZSBlW3Rbc11dPW4uaXRlbXNEYXRhfX0sby5wcm90b3R5cGUuX2FwcGx5U2FtcGxpbmc9ZnVuY3Rpb24odCxlKXt2YXIgaTtpZih0Lmxlbmd0aD4wKWZvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKWlmKGk9dGhpcy5ncm91cHNbdFtvXV0sMT09aS5vcHRpb25zLnNhbXBsaW5nKXt2YXIgbj1lW3Rbb11dO2lmKG4ubGVuZ3RoPjApe3ZhciBzPTEscj1uLmxlbmd0aCxhPXRoaXMuYm9keS51dGlsLnRvR2xvYmFsU2NyZWVuKG5bbi5sZW5ndGgtMV0ueCktdGhpcy5ib2R5LnV0aWwudG9HbG9iYWxTY3JlZW4oblswXS54KSxoPXIvYTtzPU1hdGgubWluKE1hdGguY2VpbCguMipyKSxNYXRoLm1heCgxLE1hdGgucm91bmQoaCkpKTtmb3IodmFyIGQ9bmV3IEFycmF5KHIpLGw9MDtsPHI7bCs9cyl7dmFyIHU9TWF0aC5yb3VuZChsL3MpO2RbdV09bltsXX1lW3Rbb11dPWQuc3BsaWNlKDAsTWF0aC5yb3VuZChyL3MpKX19fSxvLnByb3RvdHlwZS5fZ2V0WVJhbmdlcz1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYT1bXSxoPVtdO2lmKHQubGVuZ3RoPjApe2ZvcihzPTA7czx0Lmxlbmd0aDtzKyspbz1lW3Rbc11dLHI9dGhpcy5ncm91cHNbdFtzXV0ub3B0aW9ucyxvLmxlbmd0aD4wJiYobj10aGlzLmdyb3Vwc1t0W3NdXSwhMD09PXIuc3RhY2smJlwiYmFyXCI9PT1yLnN0eWxlP1wibGVmdFwiPT09ci55QXhpc09yaWVudGF0aW9uP2E9YS5jb25jYXQobyk6aD1oLmNvbmNhdChvKTppW3Rbc11dPW4uZ2V0WVJhbmdlKG8sdFtzXSkpO2YuZ2V0U3RhY2tlZFlSYW5nZShhLGksdCxcIl9fYmFyU3RhY2tMZWZ0XCIsXCJsZWZ0XCIpLGYuZ2V0U3RhY2tlZFlSYW5nZShoLGksdCxcIl9fYmFyU3RhY2tSaWdodFwiLFwicmlnaHRcIil9fSxvLnByb3RvdHlwZS5fdXBkYXRlWUF4aXM9ZnVuY3Rpb24odCxlKXt2YXIgaSxvLG49ITEscz0hMSxyPSExLGE9MWU5LGg9MWU5LGQ9LTFlOSxsPS0xZTk7aWYodC5sZW5ndGg+MCl7Zm9yKHZhciB1PTA7dTx0Lmxlbmd0aDt1Kyspe3ZhciBjPXRoaXMuZ3JvdXBzW3RbdV1dO2MmJlwicmlnaHRcIiE9Yy5vcHRpb25zLnlBeGlzT3JpZW50YXRpb24/KHM9ITAsYT0xZTksZD0tMWU5KTpjJiZjLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKHI9ITAsaD0xZTksbD0tMWU5KX1mb3IodT0wO3U8dC5sZW5ndGg7dSsrKWUuaGFzT3duUHJvcGVydHkodFt1XSkmJiEwIT09ZVt0W3VdXS5pZ25vcmUmJihpPWVbdFt1XV0ubWluLG89ZVt0W3VdXS5tYXgsXCJyaWdodFwiIT1lW3RbdV1dLnlBeGlzT3JpZW50YXRpb24/KHM9ITAsYT1hPmk/aTphLGQ9ZDxvP286ZCk6KHI9ITAsaD1oPmk/aTpoLGw9bDxvP286bCkpOzE9PXMmJnRoaXMueUF4aXNMZWZ0LnNldFJhbmdlKGEsZCksMT09ciYmdGhpcy55QXhpc1JpZ2h0LnNldFJhbmdlKGgsbCl9bj10aGlzLl90b2dnbGVBeGlzVmlzaWJsaXR5KHMsdGhpcy55QXhpc0xlZnQpfHxuLG49dGhpcy5fdG9nZ2xlQXhpc1Zpc2libGl0eShyLHRoaXMueUF4aXNSaWdodCl8fG4sMT09ciYmMT09cz8odGhpcy55QXhpc0xlZnQuZHJhd0ljb25zPSEwLHRoaXMueUF4aXNSaWdodC5kcmF3SWNvbnM9ITApOih0aGlzLnlBeGlzTGVmdC5kcmF3SWNvbnM9ITEsdGhpcy55QXhpc1JpZ2h0LmRyYXdJY29ucz0hMSksdGhpcy55QXhpc1JpZ2h0Lm1hc3Rlcj0hcyx0aGlzLnlBeGlzUmlnaHQubWFzdGVyQXhpcz10aGlzLnlBeGlzTGVmdCwwPT10aGlzLnlBeGlzUmlnaHQubWFzdGVyPyh0aGlzLnlBeGlzTGVmdC5saW5lT2Zmc2V0PTE9PXI/dGhpcy55QXhpc1JpZ2h0LndpZHR
21167oOjAsbj10aGlzLnlBeGlzTGVmdC5yZWRyYXcoKXx8bixuPXRoaXMueUF4aXNSaWdodC5yZWRyYXcoKXx8bik6bj10aGlzLnlBeGlzUmlnaHQucmVkcmF3KCl8fG47dmFyIHA9W1wiX19iYXJTdGFja0xlZnRcIixcIl9fYmFyU3RhY2tSaWdodFwiLFwiX19saW5lU3RhY2tMZWZ0XCIsXCJfX2xpbmVTdGFja1JpZ2h0XCJdO2Zvcih1PTA7dTxwLmxlbmd0aDt1KyspLTEhPXQuaW5kZXhPZihwW3VdKSYmdC5zcGxpY2UodC5pbmRleE9mKHBbdV0pLDEpO3JldHVybiBufSxvLnByb3RvdHlwZS5fdG9nZ2xlQXhpc1Zpc2libGl0eT1mdW5jdGlvbih0LGUpe3ZhciBpPSExO3JldHVybiAwPT10P2UuZG9tLmZyYW1lLnBhcmVudE5vZGUmJjA9PWUuaGlkZGVuJiYoZS5oaWRlKCksaT0hMCk6ZS5kb20uZnJhbWUucGFyZW50Tm9kZXx8MSE9ZS5oaWRkZW58fChlLnNob3coKSxpPSEwKSxpfSxvLnByb3RvdHlwZS5fY29udmVydFhjb29yZGluYXRlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5LnV0aWwudG9TY3JlZW4saT0wO2k8dC5sZW5ndGg7aSsrKXRbaV0uc2NyZWVuX3g9ZSh0W2ldLngpK3RoaXMucHJvcHMud2lkdGgsdFtpXS5zY3JlZW5feT10W2ldLnksdm9pZCAwIT10W2ldLmVuZD90W2ldLnNjcmVlbl9lbmQ9ZSh0W2ldLmVuZCkrdGhpcy5wcm9wcy53aWR0aDp0W2ldLnNjcmVlbl9lbmQ9dm9pZCAwfSxvLnByb3RvdHlwZS5fY29udmVydFljb29yZGluYXRlcz1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueUF4aXNMZWZ0LG89TnVtYmVyKHRoaXMuc3ZnLnN0eWxlLmhlaWdodC5yZXBsYWNlKFwicHhcIixcIlwiKSk7XCJyaWdodFwiPT1lLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbiYmKGk9dGhpcy55QXhpc1JpZ2h0KTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl0W25dLnNjcmVlbl95PU1hdGgucm91bmQoaS5jb252ZXJ0VmFsdWUodFtuXS55KSk7ZS5zZXRaZXJvUG9zaXRpb24oTWF0aC5taW4obyxpLmNvbnZlcnRWYWx1ZSgwKSkpfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5pZD1yLnJhbmRvbVVVSUQoKSx0aGlzLmJvZHk9dCx0aGlzLmRlZmF1bHRPcHRpb25zPXtvcmllbnRhdGlvbjpcImxlZnRcIixzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLGljb25zOiExLG1ham9yTGluZXNPZmZzZXQ6NyxtaW5vckxpbmVzT2Zmc2V0OjQsbGFiZWxPZmZzZXRYOjEwLGxhYmVsT2Zmc2V0WToyLGljb25XaWR0aDoyMCx3aWR0aDpcIjQwcHhcIix2aXNpYmxlOiEwLGFsaWduWmVyb3M6ITAsbGVmdDp7cmFuZ2U6e21pbjp2b2lkIDAsbWF4OnZvaWQgMH0sZm9ybWF0OmZ1bmN0aW9uKHQpe3JldHVyblwiXCIrcGFyc2VGbG9hdCh0LnRvUHJlY2lzaW9uKDMpKX0sdGl0bGU6e3RleHQ6dm9pZCAwLHN0eWxlOnZvaWQgMH19LHJpZ2h0OntyYW5nZTp7bWluOnZvaWQgMCxtYXg6dm9pZCAwfSxmb3JtYXQ6ZnVuY3Rpb24odCl7cmV0dXJuXCJcIitwYXJzZUZsb2F0KHQudG9QcmVjaXNpb24oMykpfSx0aXRsZTp7dGV4dDp2b2lkIDAsc3R5bGU6dm9pZCAwfX19LHRoaXMubGluZWdyYXBoT3B0aW9ucz1vLHRoaXMubGluZWdyYXBoU1ZHPWksdGhpcy5wcm9wcz17fSx0aGlzLkRPTWVsZW1lbnRzPXtsaW5lczp7fSxsYWJlbHM6e30sdGl0bGU6e319LHRoaXMuZG9tPXt9LHRoaXMuc2NhbGU9dm9pZCAwLHRoaXMucmFuZ2U9e3N0YXJ0OjAsZW5kOjB9LHRoaXMub3B0aW9ucz1yLmV4dGVuZCh7fSx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmNvbnZlcnNpb25GYWN0b3I9MSx0aGlzLnNldE9wdGlvbnMoZSksdGhpcy53aWR0aD1OdW1iZXIoKFwiXCIrdGhpcy5vcHRpb25zLndpZHRoKS5yZXBsYWNlKFwicHhcIixcIlwiKSksdGhpcy5taW5XaWR0aD10aGlzLndpZHRoLHRoaXMuaGVpZ2h0PXRoaXMubGluZWdyYXBoU1ZHLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodCx0aGlzLmhpZGRlbj0hMSx0aGlzLnN0ZXBQaXhlbHM9MjUsdGhpcy56ZXJvQ3Jvc3Npbmc9LTEsdGhpcy5hbW91bnRPZlN0ZXBzPS0xLHRoaXMubGluZU9mZnNldD0wLHRoaXMubWFzdGVyPSEwLHRoaXMubWFzdGVyQXhpcz1udWxsLHRoaXMuc3ZnRWxlbWVudHM9e30sdGhpcy5pY29uc1JlbW92ZWQ9ITEsdGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuZnJhbWV3b3JrPXtzdmc6dGhpcy5zdmcsc3ZnRWxlbWVudHM6dGhpcy5zdmdFbGVtZW50cyxvcHRpb25zOnRoaXMub3B0aW9ucyxncm91cHM6dGhpcy5ncm91cHN9O3ZhciBuPXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oXCJ2ZXJ0aWNhbERyYWdcIixmdW5jdGlvbigpe24uZG9tLmxpbmVDb250YWluZXIuc3R5bGUudG9wPW4uYm9keS5kb21Qcm9wcy5zY3JvbGxUb3ArXCJweFwifSl9dmFyIG49aSg4KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDIpLGE9aSgxNCksaD1pKDE2KSxkPWkoMTA4KTtvLnByb3RvdHlwZT1uZXcgaCxvLnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbih0LGUpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5ncm91cHNbdF09ZSksdGhpcy5hbW91bnRPZkdyb3Vwcys9MX0sby5wcm90b3R5cGUudXBkYXRlR3JvdXA9ZnVuY3Rpb24odCxlKXt0aGlzLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eSh0KXx8KHRoaXMuYW1vdW50T2ZHcm91cHMrPTEpLHRoaXMuZ3JvdXBzW3RdPWV9LG8ucHJvdG90eXBlLnJlbW92ZUdyb3VwPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpJiYoZGVsZXRlIHRoaXMuZ3JvdXBzW3RdLHRoaXMuYW1vdW50T2ZHcm91cHMtPTEpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHQpe3ZhciBlPSExO3RoaXMub3B0aW9ucy5vcmllbnRhdGlvbiE9dC5vcmllbnRhdGlvbiYmdm9pZCAwIT09dC5vcmllbnRhdGlvbiYmKGU9ITApO3ZhciBpPVtcIm9yaWVudGF0aW9uXCIsXCJzaG93TWlub3JMYWJlbHNcIixcInNob3dNYWpvckxhYmVsc1wiLFwiaWNvbnNcIixcIm1ham9yTGluZXNPZmZzZXRcIixcIm1pbm9yTGluZXNPZmZzZXRcIixcImxhYmVsT2Zmc2V0WFwiLFwibGFiZWxPZmZzZXRZXCIsXCJpY29uV2lkdGhcIixcIndpZHRoXCIsXCJ2aXNpYmxlXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiYWxpZ25aZXJvc1wiXTtyLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCksdGhpcy5taW5XaWR0aD1OdW1iZXIoKFwiXCIrdGhpcy5vcHRpb25zLndpZHRoKS5yZXBsYWNlKFwicHhcIixcIlwiKSksITA9PT1lJiZ0aGlzLmRvbS5mcmFtZSYmKHRoaXMuaGlkZSgpLHRoaXMuc2hvdygpKX19LG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoP
21167XRoaXMub3B0aW9ucy53aWR0aCx0aGlzLmRvbS5mcmFtZS5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQsdGhpcy5kb20ubGluZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmxpbmVDb250YWluZXIuc3R5bGUud2lkdGg9XCIxMDAlXCIsdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQsdGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIsdGhpcy5zdmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKFwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixcInN2Z1wiKSx0aGlzLnN2Zy5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy5zdmcuc3R5bGUudG9wPVwiMHB4XCIsdGhpcy5zdmcuc3R5bGUuaGVpZ2h0PVwiMTAwJVwiLHRoaXMuc3ZnLnN0eWxlLndpZHRoPVwiMTAwJVwiLHRoaXMuc3ZnLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuc3ZnKX0sby5wcm90b3R5cGUuX3JlZHJhd0dyb3VwSWNvbnM9ZnVuY3Rpb24oKXthLnByZXBhcmVFbGVtZW50cyh0aGlzLnN2Z0VsZW1lbnRzKTt2YXIgdCxlPXRoaXMub3B0aW9ucy5pY29uV2lkdGgsaT0xMS41O3Q9XCJsZWZ0XCI9PT10aGlzLm9wdGlvbnMub3JpZW50YXRpb24/NDp0aGlzLndpZHRoLWUtNDt2YXIgbz0oMCxzLmRlZmF1bHQpKHRoaXMuZ3JvdXBzKTtvLnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOjF9KTtmb3IodmFyIG49MDtuPG8ubGVuZ3RoO24rKyl7dmFyIHI9b1tuXTshMCE9PXRoaXMuZ3JvdXBzW3JdLnZpc2libGV8fHZvaWQgMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W3JdJiYhMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W3JdfHwodGhpcy5ncm91cHNbcl0uZ2V0TGVnZW5kKGUsMTUsdGhpcy5mcmFtZXdvcmssdCxpKSxpKz0xOSl9YS5jbGVhbnVwRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksdGhpcy5pY29uc1JlbW92ZWQ9ITF9LG8ucHJvdG90eXBlLl9jbGVhbnVwSWNvbnM9ZnVuY3Rpb24oKXshMT09PXRoaXMuaWNvbnNSZW1vdmVkJiYoYS5wcmVwYXJlRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksYS5jbGVhbnVwRWxlbWVudHModGhpcy5zdmdFbGVtZW50cyksdGhpcy5pY29uc1JlbW92ZWQ9ITApfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49ITEsdGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8KFwibGVmdFwiPT09dGhpcy5vcHRpb25zLm9yaWVudGF0aW9uP3RoaXMuYm9keS5kb20ubGVmdC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSk6dGhpcy5ib2R5LmRvbS5yaWdodC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5mcmFtZSkpLHRoaXMuZG9tLmxpbmVDb250YWluZXIucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5hcHBlbmRDaGlsZCh0aGlzLmRvbS5saW5lQ29udGFpbmVyKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuaGlkZGVuPSEwLHRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpLHRoaXMuZG9tLmxpbmVDb250YWluZXIucGFyZW50Tm9kZSYmdGhpcy5kb20ubGluZUNvbnRhaW5lci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuZG9tLmxpbmVDb250YWluZXIpfSxvLnByb3RvdHlwZS5zZXRSYW5nZT1mdW5jdGlvbih0LGUpe3RoaXMucmFuZ2Uuc3RhcnQ9dCx0aGlzLnJhbmdlLmVuZD1lfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0hMSxlPTA7dGhpcy5kb20ubGluZUNvbnRhaW5lci5zdHlsZS50b3A9dGhpcy5ib2R5LmRvbVByb3BzLnNjcm9sbFRvcCtcInB4XCI7Zm9yKHZhciBpIGluIHRoaXMuZ3JvdXBzKXRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KGkpJiYoITAhPT10aGlzLmdyb3Vwc1tpXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXSYmITAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtpXXx8ZSsrKTtpZigwPT09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09PWUpdGhpcy5oaWRlKCk7ZWxzZXt0aGlzLnNob3coKSx0aGlzLmhlaWdodD1OdW1iZXIodGhpcy5saW5lZ3JhcGhTVkcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoXCJweFwiLFwiXCIpKSx0aGlzLmRvbS5saW5lQ29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCtcInB4XCIsdGhpcy53aWR0aD0hMD09PXRoaXMub3B0aW9ucy52aXNpYmxlP051bWJlcigoXCJcIit0aGlzLm9wdGlvbnMud2lkdGgpLnJlcGxhY2UoXCJweFwiLFwiXCIpKTowO3ZhciBvPXRoaXMucHJvcHMsbj10aGlzLmRvbS5mcmFtZTtuLmNsYXNzTmFtZT1cInZpcy1kYXRhLWF4aXNcIix0aGlzLl9jYWxjdWxhdGVDaGFyU2l6ZSgpO3ZhciBzPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbixyPXRoaXMub3B0aW9ucy5zaG93TWlub3JMYWJlbHMsYT10aGlzLm9wdGlvbnMuc2hvd01ham9yTGFiZWxzO28ubWlub3JMYWJlbEhlaWdodD1yP28ubWlub3JDaGFySGVpZ2h0OjAsby5tYWpvckxhYmVsSGVpZ2h0PWE/by5tYWpvckNoYXJIZWlnaHQ6MCxvLm1pbm9yTGluZVdpZHRoPXRoaXMuYm9keS5kb20uYmFja2dyb3VuZEhvcml6b250YWwub2Zmc2V0V2lkdGgtdGhpcy5saW5lT2Zmc2V0LXRoaXMud2lkdGgrMip0aGlzLm9wdGlvbnMubWlub3JMaW5lc09mZnNldCxvLm1pbm9yTGluZUhlaWdodD0xLG8ubWFqb3JMaW5lV2lkdGg9dGhpcy5ib2R5LmRvbS5iYWNrZ3JvdW5kSG9yaXpvbnRhbC5vZmZzZXRXaWR0aC10aGlzLmxpbmVPZmZzZXQtdGhpcy53aWR0aCsyKnRoaXMub3B0aW9ucy5tYWpvckxpbmVzT2Zmc2V0LG8ubWFqb3JMaW5lSGVpZ2h0PTEsXCJsZWZ0XCI9PT1zPyhuLnN0eWxlLnRvcD1cIjBcIixuLnN0eWxlLmxlZnQ9XCIwXCIsbi5zdHlsZS5ib3R0b209XCJcIixuLnN0eWxlLndpZHRoP
21167XRoaXMud2lkdGgrXCJweFwiLG4uc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0K1wicHhcIix0aGlzLnByb3BzLndpZHRoPXRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LndpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5sZWZ0LmhlaWdodCk6KG4uc3R5bGUudG9wPVwiXCIsbi5zdHlsZS5ib3R0b209XCIwXCIsbi5zdHlsZS5sZWZ0PVwiMFwiLG4uc3R5bGUud2lkdGg9dGhpcy53aWR0aCtcInB4XCIsbi5zdHlsZS5oZWlnaHQ9dGhpcy5oZWlnaHQrXCJweFwiLHRoaXMucHJvcHMud2lkdGg9dGhpcy5ib2R5LmRvbVByb3BzLnJpZ2h0LndpZHRoLHRoaXMucHJvcHMuaGVpZ2h0PXRoaXMuYm9keS5kb21Qcm9wcy5yaWdodC5oZWlnaHQpLHQ9dGhpcy5fcmVkcmF3TGFiZWxzKCksdD10aGlzLl9pc1Jlc2l6ZWQoKXx8dCwhMD09PXRoaXMub3B0aW9ucy5pY29ucz90aGlzLl9yZWRyYXdHcm91cEljb25zKCk6dGhpcy5fY2xlYW51cEljb25zKCksdGhpcy5fcmVkcmF3VGl0bGUocyl9cmV0dXJuIHR9LG8ucHJvdG90eXBlLl9yZWRyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITE7YS5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5saW5lcyksYS5wcmVwYXJlRWxlbWVudHModGhpcy5ET01lbGVtZW50cy5sYWJlbHMpO3ZhciBpPXRoaXMub3B0aW9ucy5vcmllbnRhdGlvbixvPXZvaWQgMCE9dGhpcy5vcHRpb25zW2ldLnJhbmdlP3RoaXMub3B0aW9uc1tpXS5yYW5nZTp7fSxuPSEwO3ZvaWQgMCE9by5tYXgmJih0aGlzLnJhbmdlLmVuZD1vLm1heCxuPSExKTt2YXIgcz0hMDt2b2lkIDAhPW8ubWluJiYodGhpcy5yYW5nZS5zdGFydD1vLm1pbixzPSExKSx0aGlzLnNjYWxlPW5ldyBkKHRoaXMucmFuZ2Uuc3RhcnQsdGhpcy5yYW5nZS5lbmQscyxuLHRoaXMuZG9tLmZyYW1lLm9mZnNldEhlaWdodCx0aGlzLnByb3BzLm1ham9yQ2hhckhlaWdodCx0aGlzLm9wdGlvbnMuYWxpZ25aZXJvcyx0aGlzLm9wdGlvbnNbaV0uZm9ybWF0KSwhMT09PXRoaXMubWFzdGVyJiZ2b2lkIDAhPXRoaXMubWFzdGVyQXhpcyYmdGhpcy5zY2FsZS5mb2xsb3dTY2FsZSh0aGlzLm1hc3RlckF4aXMuc2NhbGUpLHRoaXMubWF4TGFiZWxTaXplPTAsdGhpcy5zY2FsZS5nZXRMaW5lcygpLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIG89ZS55LG49ZS5tYWpvcjt0Lm9wdGlvbnMuc2hvd01pbm9yTGFiZWxzJiYhMT09PW4mJnQuX3JlZHJhd0xhYmVsKG8tMixlLnZhbCxpLFwidmlzLXktYXhpcyB2aXMtbWlub3JcIix0LnByb3BzLm1pbm9yQ2hhckhlaWdodCksbiYmbz49MCYmdC5fcmVkcmF3TGFiZWwoby0yLGUudmFsLGksXCJ2aXMteS1heGlzIHZpcy1tYWpvclwiLHQucHJvcHMubWFqb3JDaGFySGVpZ2h0KSwhMD09PXQubWFzdGVyJiYobj90Ll9yZWRyYXdMaW5lKG8saSxcInZpcy1ncmlkIHZpcy1ob3Jpem9udGFsIHZpcy1tYWpvclwiLHQub3B0aW9ucy5tYWpvckxpbmVzT2Zmc2V0LHQucHJvcHMubWFqb3JMaW5lV2lkdGgpOnQuX3JlZHJhd0xpbmUobyxpLFwidmlzLWdyaWQgdmlzLWhvcml6b250YWwgdmlzLW1pbm9yXCIsdC5vcHRpb25zLm1pbm9yTGluZXNPZmZzZXQsdC5wcm9wcy5taW5vckxpbmVXaWR0aCkpfSk7dmFyIHI9MDt2b2lkIDAhPT10aGlzLm9wdGlvbnNbaV0udGl0bGUmJnZvaWQgMCE9PXRoaXMub3B0aW9uc1tpXS50aXRsZS50ZXh0JiYocj10aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodCk7dmFyIGg9ITA9PT10aGlzLm9wdGlvbnMuaWNvbnM/TWF0aC5tYXgodGhpcy5vcHRpb25zLmljb25XaWR0aCxyKSt0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRYKzE1OnIrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCsxNTtyZXR1cm4gdGhpcy5tYXhMYWJlbFNpemU+dGhpcy53aWR0aC1oJiYhMD09PXRoaXMub3B0aW9ucy52aXNpYmxlPyh0aGlzLndpZHRoPXRoaXMubWF4TGFiZWxTaXplK2gsdGhpcy5vcHRpb25zLndpZHRoPXRoaXMud2lkdGgrXCJweFwiLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKSx0aGlzLnJlZHJhdygpLGU9ITApOnRoaXMubWF4TGFiZWxTaXplPHRoaXMud2lkdGgtaCYmITA9PT10aGlzLm9wdGlvbnMudmlzaWJsZSYmdGhpcy53aWR0aD50aGlzLm1pbldpZHRoPyh0aGlzLndpZHRoPU1hdGgubWF4KHRoaXMubWluV2lkdGgsdGhpcy5tYXhMYWJlbFNpemUraCksdGhpcy5vcHRpb25zLndpZHRoPXRoaXMud2lkdGgrXCJweFwiLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGluZXMpLGEuY2xlYW51cEVsZW1lbnRzKHRoaXMuRE9NZWxlbWVudHMubGFiZWxzKSx0aGlzLnJlZHJhdygpLGU9ITApOihhLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxpbmVzKSxhLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyksZT0hMSksZX0sby5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlLmNvbnZlcnRWYWx1ZSh0KX0sby5wcm90b3R5cGUuc2NyZWVuVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZS5zY3JlZW5Ub1ZhbHVlKHQpfSxvLnByb3RvdHlwZS5fcmVkcmF3TGFiZWw9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz1hLmdldERPTUVsZW1lbnQoXCJkaXZcIix0aGlzLkRPTWVsZW1lbnRzLmxhYmVscyx0aGlzLmRvbS5mcmFtZSk7cy5jbGFzc05hbWU9byxzLmlubmVySFRNTD1lLFwibGVmdFwiPT09aT8ocy5zdHlsZS5sZWZ0PVwiLVwiK3RoaXMub3B0aW9ucy5sYWJlbE9mZnNldFgrXCJweFwiLHMuc3R5bGUudGV4dEFsaWduPVwicmlnaHRcIik6KHMuc3R5bGUucmlnaHQ9XCItXCIrdGhpcy5vcHRpb25zLmxhYmVsT2Zmc2V0WCtcInB4XCIscy5zdHlsZS50ZXh0QWxpZ249XCJsZWZ0XCIpLHMuc3R5bGUudG9wPXQtLjUqbit0aGlzLm9wdGlvbnMubGFiZWxPZmZzZXRZK1wicHhcIixlKz1cIlwiO3ZhciByPU1hdGgubWF4KHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGgsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aCk7dGhpcy5tYXhMYWJlbFNpemU8ZS5sZW5ndGgqciYmKHR
21167oaXMubWF4TGFiZWxTaXplPWUubGVuZ3RoKnIpfSxvLnByb3RvdHlwZS5fcmVkcmF3TGluZT1mdW5jdGlvbih0LGUsaSxvLG4pe2lmKCEwPT09dGhpcy5tYXN0ZXIpe3ZhciBzPWEuZ2V0RE9NRWxlbWVudChcImRpdlwiLHRoaXMuRE9NZWxlbWVudHMubGluZXMsdGhpcy5kb20ubGluZUNvbnRhaW5lcik7cy5jbGFzc05hbWU9aSxzLmlubmVySFRNTD1cIlwiLFwibGVmdFwiPT09ZT9zLnN0eWxlLmxlZnQ9dGhpcy53aWR0aC1vK1wicHhcIjpzLnN0eWxlLnJpZ2h0PXRoaXMud2lkdGgtbytcInB4XCIscy5zdHlsZS53aWR0aD1uK1wicHhcIixzLnN0eWxlLnRvcD10K1wicHhcIn19LG8ucHJvdG90eXBlLl9yZWRyYXdUaXRsZT1mdW5jdGlvbih0KXtpZihhLnByZXBhcmVFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLnRpdGxlKSx2b2lkIDAhPT10aGlzLm9wdGlvbnNbdF0udGl0bGUmJnZvaWQgMCE9PXRoaXMub3B0aW9uc1t0XS50aXRsZS50ZXh0KXt2YXIgZT1hLmdldERPTUVsZW1lbnQoXCJkaXZcIix0aGlzLkRPTWVsZW1lbnRzLnRpdGxlLHRoaXMuZG9tLmZyYW1lKTtlLmNsYXNzTmFtZT1cInZpcy15LWF4aXMgdmlzLXRpdGxlIHZpcy1cIit0LGUuaW5uZXJIVE1MPXRoaXMub3B0aW9uc1t0XS50aXRsZS50ZXh0LHZvaWQgMCE9PXRoaXMub3B0aW9uc1t0XS50aXRsZS5zdHlsZSYmci5hZGRDc3NUZXh0KGUsdGhpcy5vcHRpb25zW3RdLnRpdGxlLnN0eWxlKSxcImxlZnRcIj09PXQ/ZS5zdHlsZS5sZWZ0PXRoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0K1wicHhcIjplLnN0eWxlLnJpZ2h0PXRoaXMucHJvcHMudGl0bGVDaGFySGVpZ2h0K1wicHhcIixlLnN0eWxlLndpZHRoP
21167XRoaXMuaGVpZ2h0K1wicHhcIn1hLmNsZWFudXBFbGVtZW50cyh0aGlzLkRPTWVsZW1lbnRzLnRpdGxlKX0sby5wcm90b3R5cGUuX2NhbGN1bGF0ZUNoYXJTaXplPWZ1bmN0aW9uKCl7aWYoIShcIm1pbm9yQ2hhckhlaWdodFwiaW4gdGhpcy5wcm9wcykpe3ZhciB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiMFwiKSxlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7ZS5jbGFzc05hbWU9XCJ2aXMteS1heGlzIHZpcy1taW5vciB2aXMtbWVhc3VyZVwiLGUuYXBwZW5kQ2hpbGQodCksdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQoZSksdGhpcy5wcm9wcy5taW5vckNoYXJIZWlnaHQ9ZS5jbGllbnRIZWlnaHQsdGhpcy5wcm9wcy5taW5vckNoYXJXaWR0aD1lLmNsaWVudFdpZHRoLHRoaXMuZG9tLmZyYW1lLnJlbW92ZUNoaWxkKGUpfWlmKCEoXCJtYWpvckNoYXJIZWlnaHRcImluIHRoaXMucHJvcHMpKXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIjBcIiksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO28uY2xhc3NOYW1lPVwidmlzLXktYXhpcyB2aXMtbWFqb3IgdmlzLW1lYXN1cmVcIixvLmFwcGVuZENoaWxkKGkpLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKG8pLHRoaXMucHJvcHMubWFqb3JDaGFySGVpZ2h0PW8uY2xpZW50SGVpZ2h0LHRoaXMucHJvcHMubWFqb3JDaGFyV2lkdGg9by5jbGllbnRXaWR0aCx0aGlzLmRvbS5mcmFtZS5yZW1vdmVDaGlsZChvKX1pZighKFwidGl0bGVDaGFySGVpZ2h0XCJpbiB0aGlzLnByb3BzKSl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCIwXCIpLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtzLmNsYXNzTmFtZT1cInZpcy15LWF4aXMgdmlzLXRpdGxlIHZpcy1tZWFzdXJlXCIscy5hcHBlbmRDaGlsZChuKSx0aGlzLmRvbS5mcmFtZS5hcHBlbmRDaGlsZChzKSx0aGlzLnByb3BzLnRpdGxlQ2hhckhlaWdodD1zLmNsaWVudEhlaWdodCx0aGlzLnByb3BzLnRpdGxlQ2hhcldpZHRoPXMuY2xpZW50V2lkdGgsdGhpcy5kb20uZnJhbWUucmVtb3ZlQ2hpbGQocyl9fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyxuLHMpe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg+NiYmdm9pZCAwIT09YXJndW1lbnRzWzZdJiZhcmd1bWVudHNbNl0sYT1hcmd1bWVudHMubGVuZ3RoPjcmJnZvaWQgMCE9PWFyZ3VtZW50c1s3XSYmYXJndW1lbnRzWzddO2lmKHRoaXMubWFqb3JTdGVwcz1bMSwyLDUsMTBdLHRoaXMubWlub3JTdGVwcz1bLjI1LC41LDEsMl0sdGhpcy5jdXN0b21MaW5lcz1udWxsLHRoaXMuY29udGFpbmVySGVpZ2h0PW4sdGhpcy5tYWpvckNoYXJIZWlnaHQ9cyx0aGlzLl9zdGFydD10LHRoaXMuX2VuZD1lLHRoaXMuc2NhbGU9MSx0aGlzLm1pbm9yU3RlcElkeD0tMSx0aGlzLm1hZ25pdHVkZWZhY3Rvcj0xLHRoaXMuZGV0ZXJtaW5lU2NhbGUoKSx0aGlzLnplcm9BbGlnbj1yLHRoaXMuYXV0b1NjYWxlU3RhcnQ9aSx0aGlzLmF1dG9TY2FsZUVuZD1vLHRoaXMuZm9ybWF0dGluZ0Z1bmN0aW9uPWEsaXx8byl7dmFyIGg9dGhpcyxkPWZ1bmN0aW9uKHQpe3ZhciBlPXQtdCUoaC5tYWduaXR1ZGVmYWN0b3IqaC5taW5vclN0ZXBzW2gubWlub3JTdGVwSWR4XSk7cmV0dXJuIHQlKGgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0pPmgubWFnbml0dWRlZmFjdG9yKmgubWlub3JTdGVwc1toLm1pbm9yU3RlcElkeF0qLjU/ZStoLm1hZ25pdHVkZWZhY3RvcipoLm1pbm9yU3RlcHNbaC5taW5vclN0ZXBJZHhdOmV9O2kmJih0aGlzLl9zdGFydC09Mip0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLHRoaXMuX3N0YXJ0PWQodGhpcy5fc3RhcnQpKSxvJiYodGhpcy5fZW5kKz10aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdLHRoaXMuX2VuZD1kKHRoaXMuX2VuZCkpLHRoaXMuZGV0ZXJtaW5lU2NhbGUoKX19by5wcm90b3R5cGUuc2V0Q2hhckhlaWdodD1mdW5jdGlvbih0KXt0aGlzLm1ham9yQ2hhckhlaWdodD10fSxvLnByb3RvdHlwZS5zZXRIZWlnaHQ9ZnVuY3Rpb24odCl7dGhpcy5jb250YWluZXJIZWlnaHQ9dH0sby5wcm90b3R5cGUuZGV0ZXJtaW5lU2NhbGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9lbmQtdGhpcy5fc3RhcnQ7dGhpcy5zY2FsZT10aGlzLmNvbnRhaW5lckhlaWdodC90O3ZhciBlPXRoaXMubWFqb3JDaGFySGVpZ2h0L3RoaXMuc2NhbGUsaT10PjA/TWF0aC5yb3VuZChNYXRoLmxvZyh0KS9NYXRoLkxOMTApOjA7dGhpcy5taW5vclN0ZXBJZHg9LTEsdGhpcy5tYWduaXR1ZGVmYWN0b3I9TWF0aC5wb3coMTAsaSk7dmFyIG89MDtpPDAmJihvPWkpO2Zvcih2YXIgbj0hMSxzPW87TWF0aC5hYnMocyk8PU1hdGguYWJzKGkpO3MrKyl7dGhpcy5tYWduaXR1ZGVmYWN0b3I9TWF0aC5wb3coMTAscyk7Zm9yKHZhciByPTA7cjx0aGlzLm1pbm9yU3RlcHMubGVuZ3RoO3IrKyl7aWYodGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5taW5vclN0ZXBzW3JdPj1lKXtuPSEwLH
21167RoaXMubWlub3JTdGVwSWR4PXI7YnJlYWt9fWlmKCEwPT09bilicmVha319LG8ucHJvdG90eXBlLmlzX21ham9yPWZ1bmN0aW9uKHQpe3JldHVybiB0JSh0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1ham9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdKT09MH0sby5wcm90b3R5cGUuZ2V0U3RlcD1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hZ25pdHVkZWZhY3Rvcip0aGlzLm1pbm9yU3RlcHNbdGhpcy5taW5vclN0ZXBJZHhdfSxvLnByb3RvdHlwZS5nZXRGaXJzdE1ham9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5tYWpvclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XTtyZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWUodGhpcy5fc3RhcnQrKHQtdGhpcy5fc3RhcnQldCkldCl9LG8ucHJvdG90eXBlLmZvcm1hdFZhbHVlPWZ1bmN0aW9uKHQpe3ZhciBlPXQudG9QcmVjaXNpb24oNSk7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5mb3JtYXR0aW5nRnVuY3Rpb24mJihlPXRoaXMuZm9ybWF0dGluZ0Z1bmN0aW9uKHQpKSxcIm51bWJlclwiPT10eXBlb2YgZT9cIlwiK2U6XCJzdHJpbmdcIj09dHlwZW9mIGU/ZTp0LnRvUHJlY2lzaW9uKDUpfSxvLnByb3RvdHlwZS5nZXRMaW5lcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1bXSxlPXRoaXMuZ2V0U3RlcCgpLGk9KGUtdGhpcy5fc3RhcnQlZSklZSxvPXRoaXMuX3N0YXJ0K2k7dGhpcy5fZW5kLW8+MWUtNTtvKz1lKW8hPXRoaXMuX3N0YXJ0JiZ0LnB1c2goe21ham9yOnRoaXMuaXNfbWFqb3IobykseTp0aGlzLmNvbnZlcnRWYWx1ZShvKSx2YWw6dGhpcy5mb3JtYXRWYWx1ZShvKX0pO3JldHVybiB0fSxvLnByb3RvdHlwZS5mb2xsb3dTY2FsZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm1pbm9yU3RlcElkeCxpPXRoaXMuX3N0YXJ0LG89dGhpcy5fZW5kLG49dGhpcyxzPWZ1bmN0aW9uKCl7bi5tYWduaXR1ZGVmYWN0b3IqPTJ9LHI9ZnVuY3Rpb24oKXtuLm1hZ25pdHVkZWZhY3Rvci89Mn07dC5taW5vclN0ZXBJZHg8PTEmJnRoaXMubWlub3JTdGVwSWR4PD0xfHx0Lm1pbm9yU3RlcElkeD4xJiZ0aGlzLm1pbm9yU3RlcElkeD4xfHwodC5taW5vclN0ZXBJZHg8dGhpcy5taW5vclN0ZXBJZHg/KHRoaXMubWlub3JTdGVwSWR4PTEsMj09ZT9zKCk6KHMoKSxzKCkpKToodGhpcy5taW5vclN0ZXBJZHg9MiwxPT1lP3IoKToocigpLHIoKSkpKTtmb3IodmFyIGE9dC5jb252ZXJ0VmFsdWUoMCksaD10LmdldFN0ZXAoKSp0LnNjYWxlLGQ9ITEsbD0wOyFkJiZsKys8NTspe3RoaXMuc2NhbGU9aC8odGhpcy5taW5vclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSp0aGlzLm1hZ25pdHVkZWZhY3Rvcik7dmFyIHU9dGhpcy5jb250YWluZXJIZWlnaHQvdGhpcy5zY2FsZTt0aGlzLl9zdGFydD1pLHRoaXMuX2VuZD10aGlzLl9zdGFydCt1O3ZhciBjPXRoaXMuX2VuZCp0aGlzLnNjYWxlLHA9dGhpcy5tYWduaXR1ZGVmYWN0b3IqdGhpcy5tYWpvclN0ZXBzW3RoaXMubWlub3JTdGVwSWR4XSxmPXRoaXMuZ2V0Rmlyc3RNYWpvcigpLXQuZ2V0Rmlyc3RNYWpvcigpO2lmKHRoaXMuemVyb0FsaWduKXt2YXIgbT1hLWM7dGhpcy5fZW5kKz1tL3RoaXMuc2NhbGUsdGhpcy5fc3RhcnQ9dGhpcy5fZW5kLXV9ZWxzZSB0aGlzLmF1dG9TY2FsZVN0YXJ0Pyh0aGlzLl9zdGFydC09Zi90aGlzLnNjYWxlLHRoaXMuX2VuZD10aGlzLl9zdGFydCt1KToodGhpcy5fc3RhcnQrPXAtZi90aGlzLnNjYWxlLHRoaXMuX2VuZD10aGlzLl9zdGFydCt1KTtpZighdGhpcy5hdXRvU2NhbGVFbmQmJnRoaXMuX2VuZD5vKzFlLTUpcigpLGQ9ITE7ZWxzZXtpZighdGhpcy5hdXRvU2NhbGVTdGFydCYmdGhpcy5fc3RhcnQ8aS0xZS01KXtpZighKHRoaXMuemVyb0FsaWduJiZpPj0wKSl7cigpLGQ9ITE7Y29udGludWV9Y29uc29sZS53YXJuKFwiQ2FuJ3QgYWRoZXJlIHRvIGdpdmVuICdtaW4nIHJhbmdlLCBkdWUgdG8gemVyb2FsaWduXCIpfXRoaXMuYXV0b1NjYWxlU3RhcnQmJnRoaXMuYXV0b1NjYWxlRW5kJiZ1PG8taT8ocygpLGQ9ITEpOmQ9ITB9fX0sby5wcm90b3R5cGUuY29udmVydFZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNvbnRhaW5lckhlaWdodC0odC10aGlzLl9zdGFydCkqdGhpcy5zY2FsZX0sby5wcm90b3R5cGUuc2NyZWVuVG9WYWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4odGhpcy5jb250YWluZXJIZWlnaHQtdCkvdGhpcy5zY2FsZSt0aGlzLl9zdGFydH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe3RoaXMuaWQ9ZTt2YXIgbj1bXCJzYW1wbGluZ1wiLFwic3R5bGVcIixcInNvcnRcIixcInlBeGlzT3JpZW50YXRpb25cIixcImJhckNoYXJ0XCIsXCJkcmF3UG9pbnRzXCIsXCJzaGFkZWRcIixcImludGVycG9sYXRpb25cIixcInpJbmRleFwiLFwiZXhjbHVkZUZyb21TdGFja2luZ1wiLFwiZXhjbHVkZUZyb21MZWdlbmRcIl07dGhpcy5vcHRpb25zPXIuc2VsZWN0aXZlQnJpZGdlT2JqZWN0KG4saSksdGhpcy51c2luZ0RlZmF1bHRTdHlsZT12b2lkIDA9PT10LmNsYXNzTmFtZSx0aGlzLmdyb3Vwc1VzaW5nRGVmYXVsdFN0eWxlcz1vLHRoaXMuemVyb1Bvc2l0aW9uPTAsdGhpcy51cGRhdGUodCksMT09dGhpcy51c2luZ0RlZmF1bHRTdHlsZSYmKHRoaXMuZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzWzBdKz0xKSx0aGlzLml0ZW1zRGF0YT1bXSx0aGlzLnZpc2libGU9dm9pZCAwPT09dC52aXNpYmxlfHx0LnZpc2libGV9dmFyIG49aSg2KSxzPWZ1bmN0aW9uKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX0obikscj1pKDIpLGE9aSgxMTApLGg9aSgxMTEpLGQ9aSg3Mik7by5wcm90b3R5cGUuc2V0SXRlbXM9ZnVuY3Rpb24odCl7bnVsbCE9dD8odGhpcy5pdGVtc0RhdGE9dCwxPT10aGlzLm9wdGlvbnMuc29ydCYmci5pbnNlcnRTb3J0KHRoaXMuaXRlbXNEYXRhLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueD5lLng/MTotMX0pKTp0aGlzLml0ZW1zRGF0YT1bXX0sby5wcm90b3R5cGUuZ2V0SXRlbXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtc0RhdGF9LG8ucHJvdG90eXBlLnNldFplcm9Qb3NpdGlvbj1mdW5jdGlvbih0KXt0aGlzLnplcm9Qb3NpdGlvbj10fSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPVtcInNhbXBsaW5nXCIsXCJzdHlsZVwiLFwic29ydFwiLFwieUF4aXNPcmllbnRhdGlvblwiLFwiYmFyQ2hhcnRcIixcInpJbmRleFwiLFwiZXhjbHVkZUZyb21TdGFja2luZ1wiLFwiZXhjbHVkZUZyb21MZWdlbmRcIl07ci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQuZHJhd1BvaW50cyYmKHQuZHJhd1BvaW50cz17b25SZW5kZXI6dC5kcmF3UG9pbnRzfSksci5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJpbnRlcnBvbGF0aW9uXCIpLHIubWVyZ2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LFwiZHJhd1BvaW50c1wiKSxyLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCxcInNoYWRlZFwiKSx0LmludGVycG9sYXRpb24mJlwib2JqZWN0XCI9PSgwLHMuZGVmYXVsdCkodC5pbnRlcnBvbGF0aW9uKSYmdC5pbnRlcnBvbGF0aW9uLnBhcmFtZXRyaXphdGlvbiYmKFwidW5pZm9ybVwiPT10LmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uP3RoaXMub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmFscGhhPTA6XCJjaG9yZGFsXCI9PXQuaW50ZXJwb2xhdGlvbi5wYXJhbWV0cml6YXRpb24/dGhpcy5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE9MToodGhpcy5vcHRpb25zLmludGVycG9sYXRpb24ucGFyYW1ldHJpemF0aW9uPVwiY2VudHJpcGV0YWxcIix0aGlzLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5hbHBoYT0uNSkpfX0sby5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKHQpe3RoaXMuZ3JvdXA9dCx0aGlzLmNvbnRlbnQ9dC5jb250ZW50fHxcImdyYXBoXCIsdGhpcy5jbGFzc05hbWU9dC5jbGFzc05hbWV8fHRoaXMuY2xhc3NOYW1lfHxcInZpcy1ncmFwaC1ncm91cFwiK3RoaXMuZ3JvdXBzVXNpbmdEZWZhdWx0U3R5bGVzWzBdJTEwLHRoaXMudmlzaWJsZT12b2lkIDA9PT10LnZpc2libGV8fHQudmlzaWJsZSx0aGlzLnN0eWxlPXQuc3R5bGUsdGhpcy5zZXRPcHRpb25zKHQub3B0aW9ucyl9LG8ucHJvdG90eXBlLmdldExlZ2VuZD1mdW5jdGlvbih0LGUsaSxvLG4pe2lmKHZvaWQgMD09aXx8bnVsbD09aSl7aT17c3ZnOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIiksc3ZnRWxlbWVudHM6e30sb3B0aW9uczp0aGlzLm9wdGlvbnMsZ3JvdXBzOlt0aGlzXX19c3dpdGNoKHZvaWQgMCE9byYmbnVsbCE9b3x8KG89MCksdm9pZCAwIT1uJiZudWxsIT1ufHwobj0uNSplKSx0aGlzLm9wdGlvbnMuc3R5bGUpe2Nhc2VcImxpbmVcIjpoLmRyYXdJY29uKHRoaXMsbyxuLHQsZSxpKTticmVhaztjYXNlXCJwb2ludHNcIjpjYXNlXCJwb2ludFwiOmQuZHJhd0ljb24odGhpcyxvLG4sdCxlLGkpO2JyZWFrO2Nhc2VcImJhclwiOmEuZHJhd0ljb24odGhpcyxvLG4sdCxlLGkpfXJldHVybntpY29uOmkuc3ZnLGxhYmVsOnRoaXMuY29udGVudCxvcmllbnRhdGlvbjp0aGlzLm9wdGlvbnMueUF4aXNPcmllbnRhdGlvbn19LG8ucHJvdG90eXBlLmdldFlSYW5nZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9dFswXS55LGk9dFswXS55LG89MDtvPHQubGVuZ3RoO28rKyllPWU+dFtvXS
2116755P3Rbb10ueTplLGk9aTx0W29dLnk/dFtvXS55Omk7cmV0dXJue21pbjplLG1heDppLHlBeGlzT3JpZW50YXRpb246dGhpcy5vcHRpb25zLnlBeGlzT3JpZW50YXRpb259fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt9dmFyIG49aSgxNCkscz1pKDcyKTtvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgYT0uNSpzLGg9bi5nZXRTVkdFbGVtZW50KFwicmVjdFwiLHIuc3ZnRWxlbWVudHMsci5zdmcpO2guc2V0QXR0cmlidXRlTlMobnVsbCxcInhcIixlKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ5XCIsaS1hKSxoLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ3aWR0aFwiLG8pLGguc2V0QXR0cmlidXRlTlMobnVsbCxcImhlaWdodFwiLDIqYSksaC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiY2xhc3NcIixcInZpcy1vdXRsaW5lXCIpO3ZhciBkPU1hdGgucm91bmQoLjMqbyksbD10Lm9wdGlvbnMuYmFyQ2hhcnQud2lkdGgsdT1sL2QsYz1NYXRoLnJvdW5kKC40KnMpLHA9TWF0aC5yb3VuZCguNzUqcyksZj1NYXRoLnJvdW5kKChvLTIqZCkvMyk7aWYobi5kcmF3QmFyKGUrLjUqZCtmLGkrYS1jLTEsZCxjLHQuY2xhc3NOYW1lK1wiIHZpcy1iYXJcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnLHQuc3R5bGUpLG4uZHJhd0JhcihlKzEuNSpkK2YrMixpK2EtcC0xLGQscCx0LmNsYXNzTmFtZStcIiB2aXMtYmFyXCIsci5zdmdFbGVtZW50cyxyLnN2Zyx0LnN0eWxlKSwxPT10Lm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgbT17c3R5bGU6dC5vcHRpb25zLmRyYXdQb2ludHMuc3R5bGUsc3R5bGVzOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlcyxzaXplOnQub3B0aW9ucy5kcmF3UG9pbnRzLnNpemUvdSxjbGFzc05hbWU6dC5jbGFzc05hbWV9O24uZHJhd1BvaW50KGUrLjUqZCtmLGkrYS1jLTEsbSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxuLmRyYXdQb2ludChlKzEuNSpkK2YrMixpK2EtcC0xLG0sci5zdmdFbGVtZW50cyxyLnN2Zyl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe3ZhciByLGEsaCxkLGwsdSxjPVtdLHA9e30sZj0wO2ZvcihsPTA7bDx0Lmxlbmd0aDtsKyspaWYoZD1pLmdyb3Vwc1t0W2xdXSxcImJhclwiPT09ZC5vcHRpb25zLnN0eWxlJiYhMD09PWQudmlzaWJsZSYmKHZvaWQgMD09PWkub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0W2xdXXx8ITA9PT1pLm9wdGlvbnMuZ3JvdXBzLnZpc2liaWxpdHlbdFtsXV0pKWZvcih1PTA7dTxlW3RbbF1dLmxlbmd0aDt1KyspYy5wdXNoKHtzY3JlZW5feDplW3RbbF1dW3VdLnNjcmVlbl94LHNjcmVlbl9lbmQ6ZVt0W2xdXVt1XS5zY3JlZW5fZW5kLHNjcmVlbl95OmVbdFtsXV1bdV0uc2NyZWVuX3kseDplW3RbbF1dW3VdLngsZW5kOmVbdFtsXV1bdV0uZW5kLHk6ZVt0W2xdXVt1XS55LGdyb3VwSWQ6dFtsXSxsYWJlbDplW3RbbF1dW3VdLmxhYmVsfSksZis9MTtpZigwIT09Zilmb3IoYy5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2NyZWVuX3g9PT1lLnNjcmVlbl94P3QuZ3JvdXBJZDxlLmdyb3VwSWQ/LTE6MTp0LnNjcmVlbl94LWUuc2NyZWVuX3h9KSxvLl9nZXREYXRhSW50ZXJzZWN0aW9ucyhwLGMpLGw9MDtsPGMubGVuZ3RoO2wrKyl7ZD1pLmdyb3Vwc1tjW2xdLmdyb3VwSWRdO3ZhciBtPXZvaWQgMCE9ZC5vcHRpb25zLmJhckNoYXJ0Lm1pbldpZHRoP2Qub3B0aW9ucy5iYXJDaGFydC5taW5XaWR0aDouMSpkLm9wdGlvbnMuYmFyQ2hhcnQud2lkdGg7YT1jW2xdLnNjcmVlbl94O3ZhciB2PTA7aWYodm9pZCAwPT09cFthXSlsKzE8Yy5sZW5ndGgmJihyPU1hdGguYWJzKGNbbCsxXS5zY3JlZW5feC1hKSksaD1vLl9nZXRTYWZlRHJhd0RhdGEocixkLG0pO2Vsc2V7dmFyIGc9bCsocFthXS5hbW91bnQtcFthXS5yZXNvbHZlZCk7ZzxjLmxlbmd0aCYmKHI9TWF0aC5hYnMoY1tnXS5zY3JlZW5feC1hKSksaD1vLl9nZXRTYWZlRHJhd0RhdGEocixkLG0pLHBbYV0ucmVzb2x2ZWQrPTEsITA9PT1kLm9wdGlvbnMuc3RhY2smJiEwIT09ZC5vcHRpb25zLmV4Y2x1ZGVGcm9tU3RhY2tpbmc/Y1tsXS5zY3JlZW5feTxkLnplcm9Qb3NpdGlvbj8odj1wW2FdLmFjY3VtdWxhdGVkTmVnYXRpdmUscFthXS5hY2N1bXVsYXRlZE5lZ2F0aXZlKz1kLnplcm9Qb3NpdGlvbi1jW2xdLnNjcmVlbl95KToodj1wW2FdLmFjY3VtdWxhdGVkUG9zaXRpdmUscFthXS5hY2N1bXVsYXRlZFBvc2l0aXZlKz1kLnplcm9Qb3NpdGlvbi1jW2xdLnNjcmVlbl95KTohMD09PWQub3B0aW9ucy5iYXJDaGFydC5zaWRlQnlTaWRlJiYoaC53aWR0aD1oLndpZHRoL3BbYV0uYW1vdW50LGgub2Zmc2V0Kz1wW2FdLnJlc29sdmVkKmgud2lkdGgtLjUqaC53aWR0aCoocFthXS5hbW91bnQrMSkpfXZhciB5PWgud2lkdGgsYj1jW2xdLnNjcmVlbl94O2lmKHZvaWQgMCE9Y1tsXS5zY3JlZW5fZW5kPyh5PWNbbF0uc2NyZWVuX2VuZC1jW2xdLnNjcmVlbl94LGIrPS41KnkpOmIrPWgub2Zmc2V0LG4uZHJhd0JhcihiLGNbbF0uc2NyZWVuX3ktdix5LGQuemVyb1Bvc2l0aW9uLWNbbF0uc2NyZWVuX3ksZC5jbGFzc05hbWUrXCIgdmlzLWJhclwiLGkuc3ZnRWxlbWVudHMsaS5zdmcsZC5zdHlsZSksITA9PT1kLm9wdGlvbnMuZHJhd1BvaW50cy5lbmFibGVkKXt2YXIgXz17c2NyZWVuX3g6Y1tsXS5zY3JlZW5feCxzY3JlZW5feTpjW2xdLnNjcmVlbl95LXYseDpjW2xdLngseTpjW2xdLnksZ3JvdXBJZDpjW2xdLmdyb3VwSWQsbGFiZWw6Y1tsXS5sYWJlbH07cy5kcmF3KFtfXSxkLGksaC5vZmZzZXQpfX19LG8uX2dldERhdGFJbnRlcnNlY3Rpb25zPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpLG89MDtvPGUubGVuZ3RoO28rKylvKzE8ZS5sZW5ndGgmJihpPU1hdGguYWJzKGVbbysxXS5zY3JlZW5feC1lW29dLnNjcmVlbl94KSksbz4wJiYoaT1NYXRoLm1pbihpLE1hdGguYWJzKGVbby0xXS5zY3JlZW5feC1lW29dLnNjcmVlbl94KSkpLDA9PT1pJiYodm9pZCAwPT09dFtlW29dLnNjcmVlbl94XSYmKHRbZVtvXS5zY3JlZW5feF09e2Ftb3VudDowLHJlc29sdmVkOjAsYWNjdW11bGF0ZWRQb3NpdGl2ZTowLGFjY3VtdWxhdGVkTmVnYXRpdmU6MH0pLHRbZVtvXS5zY3JlZW5feF0uYW1vdW50Kz0xKX0sby5fZ2V0U2FmZURyYXdEYXRhPWZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuO3JldHVybiB0PGUub3B0aW9ucy5iYXJDaGFydC53aWR0aCYmdD4wPyhvPXQ8aT9pOnQsbj0wLFwibGVmdFwiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduP24tPS41KnQ6XCJyaWdodFwiPT09ZS5vcHRpb25zLmJhckNoYXJ0LmFsaWduJiYobis9LjUqdCkpOihvPWUub3B0aW9ucy5iYXJDaGFydC53aWR0aCxuPTAsXCJsZWZ0XCI9PT1lLm9wdGlvbnMuYmFyQ2hhcnQuYWxpZ24/bi09LjUqZS5vcHRpb25zLmJhckNoYXJ0LndpZHRoOlwicmlnaHRcIj09PWUub3B0aW9ucy5iYXJDaGFydC5hbGlnbiYmKG4rPS41KmUub3B0aW9ucy5iYXJDaGFydC53aWR0aCkpLHt3aWR0aDpvLG9mZnNldDpufX0sby5nZXRTdGFja2VkWVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG4scyl7aWYodC5sZW5ndGg+MCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuc2NyZWVuX3g9PT1lLnNjcmVlbl94P3QuZ3JvdXBJZDxlLmdyb3VwSWQ/LTE6MTp0LnNjcmVlbl94
21167LWUuc2NyZWVuX3h9KTt2YXIgcj17fTtvLl9nZXREYXRhSW50ZXJzZWN0aW9ucyhyLHQpLGVbbl09by5fZ2V0U3RhY2tlZFlSYW5nZShyLHQpLGVbbl0ueUF4aXNPcmllbnRhdGlvbj1zLGkucHVzaChuKX19LG8uX2dldFN0YWNrZWRZUmFuZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGksbz1lWzBdLnNjcmVlbl95LG49ZVswXS5zY3JlZW5feSxzPTA7czxlLmxlbmd0aDtzKyspaT1lW3NdLnNjcmVlbl94LHZvaWQgMD09PXRbaV0/KG89bz5lW3NdLnNjcmVlbl95P2Vbc10uc2NyZWVuX3k6byxuPW48ZVtzXS5zY3JlZW5feT9lW3NdLnNjcmVlbl95Om4pOmVbc10uc2NyZWVuX3k8MD90W2ldLmFjY3VtdWxhdGVkTmVnYXRpdmUrPWVbc10uc2NyZWVuX3k6dFtpXS5hY2N1bXVsYXRlZFBvc2l0aXZlKz1lW3NdLnNjcmVlbl95O2Zvcih2YXIgciBpbiB0KXQuaGFzT3duUHJvcGVydHkocikmJihvPW8+dFtyXS5hY2N1bXVsYXRlZE5lZ2F0aXZlP3Rbcl0uYWNjdW11bGF0ZWROZWdhdGl2ZTpvLG89bz50W3JdLmFjY3VtdWxhdGVkUG9zaXRpdmU/dFtyXS5hY2N1bXVsYXRlZFBvc2l0aXZlOm8sbj1uPHRbcl0uYWNjdW11bGF0ZWROZWdhdGl2ZT90W3JdLmFjY3VtdWxhdGVkTmVnYXRpdmU6bixuPW48dFtyXS5hY2N1bXVsYXRlZFBvc2l0aXZlP3Rbcl0uYWNjdW11bGF0ZWRQb3NpdGl2ZTpuKTtyZXR1cm57bWluOm8sbWF4Om59fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt9dmFyIG49aSgxNCk7by5jYWxjUGF0aD1mdW5jdGlvbih0LGUpe2lmKG51bGwhPXQmJnQubGVuZ3RoPjApe3JldHVybiAxPT1lLm9wdGlvbnMuaW50ZXJwb2xhdGlvbi5lbmFibGVkP28uX2NhdG11bGxSb20odCxlKTpvLl9saW5lYXIodCl9fSxvLmRyYXdJY29uPWZ1bmN0aW9uKHQsZSxpLG8scyxyKXt2YXIgYSxoLGQ9LjUqcyxsPW4uZ2V0U1ZHRWxlbWVudChcInJlY3RcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKTtpZihsLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJ4XCIsZSksbC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwieVwiLGktZCksbC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwid2lkdGhcIixvKSxsLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJoZWlnaHRcIiwyKmQpLGwuc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsXCJ2aXMtb3V0bGluZVwiKSxhPW4uZ2V0U1ZHRWxlbWVudChcInBhdGhcIixyLnN2Z0VsZW1lbnRzLHIuc3ZnKSxhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJjbGFzc1wiLHQuY2xhc3NOYW1lKSx2b2lkIDAhPT10LnN0eWxlJiZhLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJzdHlsZVwiLHQuc3R5bGUpLGEuc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk1cIitlK1wiLFwiK2krXCIgTFwiKyhlK28pK1wiLFwiK2kpLDE9PXQub3B0aW9ucy5zaGFkZWQuZW5hYmxlZCYmKGg9bi5nZXRTVkdFbGVtZW50KFwicGF0aFwiLHIuc3ZnRWxlbWVudHMsci5zdmcpLFwidG9wXCI9PXQub3B0aW9ucy5zaGFkZWQub3JpZW50YXRpb24/aC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwiZFwiLFwiTVwiK2UrXCIsIFwiKyhpLWQpK1wiTFwiK2UrXCIsXCIraStcIiBMXCIrKGUrbykrXCIsXCIraStcIiBMXCIrKGUrbykrXCIsXCIrKGktZCkpOmguc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk1cIitlK1wiLFwiK2krXCIgTFwiK2UrXCIsXCIrKGkrZCkrXCIgTFwiKyhlK28pK1wiLFwiKyhpK2QpK1wiTFwiKyhlK28pK1wiLFwiK2kpLGguc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsdC5jbGFzc05hbWUrXCIgdmlzLWljb24tZmlsbFwiKSx2b2lkIDAhPT10Lm9wdGlvbnMuc2hhZGVkLnN0eWxlJiZcIlwiIT09dC5vcHRpb25zLnNoYWRlZC5zdHlsZSYmaC5zZXRBdHRyaWJ1dGVOUyhudWxsLFwic3R5bGVcIix0Lm9wdGlvbnMuc2hhZGVkLnN0eWxlKSksMT09dC5vcHRpb25zLmRyYXdQb2ludHMuZW5hYmxlZCl7dmFyIHU9e3N0eWxlOnQub3B0aW9ucy5kcmF3UG9pbnRzLnN0eWxlLHN0eWxlczp0Lm9wdGlvbnMuZHJhd1BvaW50cy5zdHlsZXMsc2l6ZTp0Lm9wdGlvbnMuZHJhd1BvaW50cy5zaXplLGNsYXNzTmFtZTp0LmNsYXNzTmFtZX07bi5kcmF3UG9pbnQoZSsuNSpvLGksdSxyLnN2Z0VsZW1lbnRzLHIuc3ZnKX19LG8uZHJhd1NoYWRpbmc9ZnVuY3Rpb24odCxlLGksbyl7aWYoMT09ZS5vcHRpb25zLnNoYWRlZC5lbmFibGVkKXt2YXIgcz1OdW1iZXIoby5zdmcuc3R5bGUuaGVpZ2h0LnJlcGxhY2UoXCJweFwiLFwiXCIpKSxyPW4uZ2V0U1ZHRWxlbWVudChcInBhdGhcIixvLnN2Z0VsZW1lbnRzLG8uc3ZnKSxhPVwiTFwiOzE9PWUub3B0aW9ucy5pbnRlcnBvbGF0aW9uLmVuYWJsZWQmJihhPVwiQ1wiKTt2YXIgaCxkPTA7ZD1cInRvcFwiPT1lLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uPzA6XCJib3R0b21cIj09ZS5vcHRpb25zLnNoYWRlZC5vcmllbnRhdGlvbj9zOk1hdGgubWluKE1hdGgubWF4KDAsZS56ZXJvUG9zaXRpb24pLHMpLGg9XCJncm91cFwiPT1lLm9wdGlvbnMuc2hhZGVkLm9yaWVudGF0aW9uJiZudWxsIT1pJiZ2b2lkIDAhPWk/XCJNXCIrdFswXVswXStcIixcIit0WzBdWzFdK1wiIFwiK3RoaXMuc2VyaWFsaXplUGF0aCh0LGEsITEpK1wiIExcIitpW2kubGVuZ3RoLTFdWzBdK1wiLFwiK2lbaS5sZW5ndGgtMV1bMV0rXCIgXCIrdGhpcy5zZXJpYWxpemVQYXRoKGksYSwhMCkraVswXVswXStcIixcIitpWzBdWzFdK1wiIFpcIjpcIk1cIit0WzBdWzBdK1wiLFwiK3RbMF1bMV0rXCIgXCIrdGhpcy5zZXJpYWxpemVQYXRoKHQsYSwhMSkrXCIgVlwiK2QrXCIgSFwiK3RbMF1bMF0rXCIgWlwiLHIuc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsZS5jbGFzc05hbWUrXCIgdmlzLWZpbGxcIiksdm9pZCAwIT09ZS5vcHRpb25zLnNoYWRlZC5zdHlsZSYmci5zZXRBdHRyaWJ1dGVOUyhudWxsLFwic3R5bGVcIixlLm9wdGlvbnMuc2hhZGVkLnN0eWxlKSxyLnNldEF0dHJpYnV0ZU5TKG51bGwsXCJkXCIsaCl9fSxvLmRyYXc9ZnVuY3Rpb24odCxlLGkpe2lmKG51bGwhPXQmJnZvaWQgMCE9dCl7dmFyIG89bi5nZXRTVkdFbGVtZW50KFwicGF0aFwiLGkuc3ZnRWxlbWVudHMsaS5zdmcpO28uc2V0QXR0cmlidXRlTlMobnVsbCxcImNsYXNzXCIsZS5jbGFzc05hbWUpLHZvaWQgMCE9PWUuc3R5bGUmJm8uc2V0QXR0cmlidXRlTlMobnVsbCxcInN0eWxlXCIsZS5zdHlsZSk7dmFyIHM9XCJMXCI7MT09ZS5vcHRpb25zLmludGVycG9sYXRpb24uZW5hYmxlZCYmKHM9XCJDXCIpLG8uc2V0QXR0cmlidXRlTlMobnVsbCxcImRcIixcIk1cIit0WzBdWzBdK1wiLFwiK3RbM
21167F1bMV0rXCIgXCIrdGhpcy5zZXJpYWxpemVQYXRoKHQscywhMSkpfX0sby5zZXJpYWxpemVQYXRoPWZ1bmN0aW9uKHQsZSxpKXtpZih0Lmxlbmd0aDwyKXJldHVyblwiXCI7dmFyIG8sbj1lO2lmKGkpZm9yKG89dC5sZW5ndGgtMjtvPjA7by0tKW4rPXRbb11bMF0rXCIsXCIrdFtvXVsxXStcIiBcIjtlbHNlIGZvcihvPTE7bzx0Lmxlbmd0aDtvKyspbis9dFtvXVswXStcIixcIit0W29dWzFdK1wiIFwiO3JldHVybiBufSxvLl9jYXRtdWxsUm9tVW5pZm9ybT1mdW5jdGlvbih0KXt2YXIgZSxpLG8sbixzLHIsYT1bXTthLnB1c2goW01hdGgucm91bmQodFswXS5zY3JlZW5feCksTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl95KV0pO2Zvcih2YXIgaD10Lmxlbmd0aCxkPTA7ZDxoLTE7ZCsrKWU9MD09ZD90WzBdOnRbZC0xXSxpPXRbZF0sbz10W2QrMV0sbj1kKzI8aD90W2QrMl06byxzPXtzY3JlZW5feDooLWUuc2NyZWVuX3grNippLnNjcmVlbl94K28uc2NyZWVuX3gpKigxLzYpLHNjcmVlbl95OigtZS5zY3JlZW5feSs2Kmkuc2NyZWVuX3krby5zY3JlZW5feSkqKDEvNil9LHI9e3NjcmVlbl94OihpLnNjcmVlbl94KzYqby5zY3JlZW5feC1uLnNjcmVlbl94KSooMS82KSxzY3JlZW5feTooaS5zY3JlZW5feSs2Km8uc2NyZWVuX3ktbi5zY3JlZW5feSkqKDEvNil9LGEucHVzaChbcy5zY3JlZW5feCxzLnNjcmVlbl95XSksYS5wdXNoKFtyLnNjcmVlbl94LHIuc2NyZWVuX3ldKSxhLnB1c2goW28uc2NyZWVuX3gsby5zY3JlZW5feV0pO3JldHVybiBhfSxvLl9jYXRtdWxsUm9tPWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5vcHRpb25zLmludGVycG9sYXRpb24uYWxwaGE7aWYoMD09aXx8dm9pZCAwPT09aSlyZXR1cm4gdGhpcy5fY2F0bXVsbFJvbVVuaWZvcm0odCk7dmFyIG8sbixzLHIsYSxoLGQsbCx1LGMscCxmLG0sdixnLHksYixfLHcseD1bXTt4LnB1c2goW01hdGgucm91bmQodFswXS5zY3JlZW5feCksTWF0aC5yb3VuZCh0WzBdLnNjcmVlbl95KV0pO2Zvcih2YXIgaz10Lmxlbmd0aCxTPTA7UzxrLTE7UysrKW89MD09Uz90WzBdOnRbUy0xXSxuPXRbU10scz10W1MrMV0scj1TKzI8az90W1MrMl06cyxcbiAgICBkPU1hdGguc3FydChNYXRoLnBvdyhvLnNjcmVlbl94LW4uc2NyZWVuX3gsMikrTWF0aC5wb3coby5zY3JlZW5feS1uLnNjcmVlbl95LDIpKSxsPU1hdGguc3FydChNYXRoLnBvdyhuLnNjcmVlbl94LXMuc2NyZWVuX3gsMikrTWF0aC5wb3cobi5zY3JlZW5feS1zLnNjcmVlbl95LDIpKSx1PU1hdGguc3FydChNYXRoLnBvdyhzLnNjcmVlbl94LXIuc2NyZWVuX3gsMikrTWF0aC5wb3cocy5zY3JlZW5feS1yLnNjcmVlbl95LDIpKSx2PU1hdGgucG93KHUsaSkseT1NYXRoLnBvdyh1LDIqaSksZz1NYXRoLnBvdyhsLGkpLGI9TWF0aC5wb3cobCwyKmkpLHc9TWF0aC5wb3coZCxpKSxfPU1hdGgucG93KGQsMippKSxjPTIqXyszKncqZytiLHA9Mip5KzMqdipnK2IsZj0zKncqKHcrZyksZj4wJiYoZj0xL2YpLG09Myp2Kih2K2cpLG0+MCYmKG09MS9tKSxhPXtzY3JlZW5feDooLWIqby5zY3JlZW5feCtjKm4uc2NyZWVuX3grXypzLnNjcmVlbl94KSpmLHNjcmVlbl95OigtYipvLnNjcmVlbl95K2Mqbi5zY3JlZW5feStfKnMuc2NyZWVuX3kpKmZ9LGg9e3NjcmVlbl94Oih5Km4uc2NyZWVuX3grcCpzLnNjcmVlbl94LWIqci5zY3JlZW5feCkqbSxzY3JlZW5feTooeSpuLnNjcmVlbl95K3Aqcy5zY3JlZW5feS1iKnIuc2NyZWVuX3kpKm19LDA9PWEuc2NyZWVuX3gmJjA9PWEuc2NyZWVuX3kmJihhPW4pLDA9PWguc2NyZWVuX3gmJjA9PWguc2NyZWVuX3kmJihoPXMpLHgucHVzaChbYS5zY3JlZW5feCxhLnNjcmVlbl95XSkseC5wdXNoKFtoLnNjcmVlbl94LGguc2NyZWVuX3ldKSx4LnB1c2goW3Muc2NyZWVuX3gscy5zY3JlZW5feV0pO3JldHVybiB4fSxvLl9saW5lYXI9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MDtpPHQubGVuZ3RoO2krKyllLnB1c2goW3RbaV0uc2NyZWVuX3gsdFtpXS5zY3JlZW5feV0pO3JldHVybiBlfSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGksbyl7dGhpcy5ib2R5PXQsdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMSxpY29uczohMCxpY29uU2l6ZToyMCxpY29uU3BhY2luZzo2LGxlZnQ6e3Zpc2libGU6ITAscG9zaXRpb246XCJ0b3AtbGVmdFwifSxyaWdodDp7dmlzaWJsZTohMCxwb3NpdGlvbjpcInRvcC1yaWdodFwifX0sdGhpcy5zaWRlPWksdGhpcy5vcHRpb25zPXIuZXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMubGluZWdyYXBoT3B0aW9ucz1vLHRoaXMuc3ZnRWxlbWVudHM9e30sdGhpcy5kb209e30sdGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wLHRoaXMuX2NyZWF0ZSgpLHRoaXMuZnJhbWV3b3JrPXtzdmc6dGhpcy5zdmcsc3ZnRWxlbWVudHM6dGhpcy5zdmdFbGVtZW50cyxvcHRpb25zOnRoaXMub3B0aW9ucyxncm91cHM6dGhpcy5ncm91cHN9LHRoaXMuc2V0T3B0aW9ucyhlKX12YXIgbj1pKDgpLHM9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShuKSxyPWkoMiksYT1pKDE0KSxoPWkoMTYpO28ucHJvdG90eXBlPW5ldyBoLG8ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9e30sdGhpcy5hbW91bnRPZkdyb3Vwcz0wfSxvLnByb3RvdHlwZS5hZGRHcm91cD1mdW5jdGlvbih0LGUpezEhPWUub3B0aW9ucy5leGNsdWRlRnJvbUxlZ2VuZCYmKHRoaXMuZ3JvdXBzLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5ncm91cHNbdF09ZSksdGhpcy5hbW91bnRPZkdyb3Vwcys9MSl9LG8ucHJvdG90eXBlLnVwZGF0ZUdyb3VwPWZ1bmN0aW9uKHQsZSl7dGhpcy5ncm91cHNbdF09ZX0sby5wcm90b3R5cGUucmVtb3ZlR3JvdXA9ZnVuY3Rpb24odCl7dGhpcy5ncm91cHMuaGFzT3duUHJvcGVydHkodCkmJihkZWxldGUgdGhpcy5ncm91cHNbdF0sdGhpcy5hbW91bnRPZkdyb3Vwcy09MSl9LG8ucHJvdG90eXBlLl9jcmVhdGU9ZnVuY3Rpb24oKXt0aGlzLmRvbS5mcmFtZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuZG9tLmZyYW1lLmNsYXNzTmFtZT1cInZpcy1sZWdlbmRcIix0aGlzLmRvbS5mcmFtZS5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudG9wPVwiMTBweFwiLHRoaXMuZG9tLmZyYW1lLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuZG9tLnRleHRBcmVhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5kb20udGV4dEFyZWEuY2xhc3NOYW1lPVwidmlzLWxlZ2VuZC10ZXh0XCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRvcD1cIjBweFwiLHRoaXMuc3ZnPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhcImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIsXCJzdmdcIiksdGhpcy5zdmcuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHRoaXMuc3ZnLnN0eWxlLnRvcD1cIjBweFwiLHRoaXMuc3ZnLnN0eWxlLndpZHRoP
21167XRoaXMub3B0aW9ucy5pY29uU2l6ZSs1K1wicHhcIix0aGlzLnN2Zy5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsdGhpcy5kb20uZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5zdmcpLHRoaXMuZG9tLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZG9tLnRleHRBcmVhKX0sby5wcm90b3R5cGUuaGlkZT1mdW5jdGlvbigpe3RoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUmJnRoaXMuZG9tLmZyYW1lLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zaG93PWZ1bmN0aW9uKCl7dGhpcy5kb20uZnJhbWUucGFyZW50Tm9kZXx8dGhpcy5ib2R5LmRvbS5jZW50ZXIuYXBwZW5kQ2hpbGQodGhpcy5kb20uZnJhbWUpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe3ZhciBlPVtcImVuYWJsZWRcIixcIm9yaWVudGF0aW9uXCIsXCJpY29uc1wiLFwibGVmdFwiLFwicmlnaHRcIl07ci5zZWxlY3RpdmVEZWVwRXh0ZW5kKGUsdGhpcy5vcHRpb25zLHQpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt2YXIgdD0wLGU9KDAscy5kZWZhdWx0KSh0aGlzLmdyb3Vwcyk7ZS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ8ZT8tMToxfSk7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspe3ZhciBvPWVbaV07MSE9dGhpcy5ncm91cHNbb10udmlzaWJsZXx8dm9pZCAwIT09dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbb10mJjEhPXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dfHx0Kyt9aWYoMD09dGhpcy5vcHRpb25zW3RoaXMuc2lkZV0udmlzaWJsZXx8MD09dGhpcy5hbW91bnRPZkdyb3Vwc3x8MD09dGhpcy5vcHRpb25zLmVuYWJsZWR8fDA9PXQpdGhpcy5oaWRlKCk7ZWxzZXtpZih0aGlzLnNob3coKSxcInRvcC1sZWZ0XCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9ufHxcImJvdHRvbS1sZWZ0XCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9uPyh0aGlzLmRvbS5mcmFtZS5zdHlsZS5sZWZ0PVwiNHB4XCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudGV4dEFsaWduPVwibGVmdFwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnRleHRBbGlnbj1cImxlZnRcIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5sZWZ0PXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNStcInB4XCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUucmlnaHQ9XCJcIix0aGlzLnN2Zy5zdHlsZS5sZWZ0PVwiMHB4XCIsdGhpcy5zdmcuc3R5bGUucmlnaHQ9XCJcIik6KHRoaXMuZG9tLmZyYW1lLnN0eWxlLnJpZ2h0PVwiNHB4XCIsdGhpcy5kb20uZnJhbWUuc3R5bGUudGV4dEFsaWduPVwicmlnaHRcIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS50ZXh0QWxpZ249XCJyaWdodFwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLnJpZ2h0PXRoaXMub3B0aW9ucy5pY29uU2l6ZSsxNStcInB4XCIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGVmdD1cIlwiLHRoaXMuc3ZnLnN0eWxlLnJpZ2h0PVwiMHB4XCIsdGhpcy5zdmcuc3R5bGUubGVmdD1cIlwiKSxcInRvcC1sZWZ0XCI9PXRoaXMub3B0aW9uc1t0aGlzLnNpZGVdLnBvc2l0aW9ufHxcInRvcC1yaWdodFwiPT10aGlzLm9wdGlvbnNbdGhpcy5zaWRlXS5wb3NpdGlvbil0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3A9NC1OdW1iZXIodGhpcy5ib2R5LmRvbS5jZW50ZXIuc3R5bGUudG9wLnJlcGxhY2UoXCJweFwiLFwiXCIpKStcInB4XCIsdGhpcy5kb20uZnJhbWUuc3R5bGUuYm90dG9tPVwiXCI7ZWxzZXt2YXIgbj10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyLmhlaWdodC10aGlzLmJvZHkuZG9tUHJvcHMuY2VudGVyQ29udGFpbmVyLmhlaWdodDt0aGlzLmRvbS5mcmFtZS5zdHlsZS5ib3R0b209NCtuK051bWJlcih0aGlzLmJvZHkuZG9tLmNlbnRlci5zdHlsZS50b3AucmVwbGFjZShcInB4XCIsXCJcIikpK1wicHhcIix0aGlzLmRvbS5mcmFtZS5zdHlsZS50b3A9XCJcIn0wPT10aGlzLm9wdGlvbnMuaWNvbnM/KHRoaXMuZG9tLmZyYW1lLnN0eWxlLndpZHRoP
21167XRoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoKzEwK1wicHhcIix0aGlzLmRvbS50ZXh0QXJlYS5zdHlsZS5yaWdodD1cIlwiLHRoaXMuZG9tLnRleHRBcmVhLnN0eWxlLmxlZnQ9XCJcIix0aGlzLnN2Zy5zdHlsZS53aWR0aD1cIjBweFwiKToodGhpcy5kb20uZnJhbWUuc3R5bGUud2lkdGg9dGhpcy5vcHRpb25zLmljb25TaXplKzE1K3RoaXMuZG9tLnRleHRBcmVhLm9mZnNldFdpZHRoKzEwK1wicHhcIix0aGlzLmRyYXdMZWdlbmRJY29ucygpKTt2YXIgcj1cIlwiO2ZvcihpPTA7aTxlLmxlbmd0aDtpKyspbz1lW2ldLDEhPXRoaXMuZ3JvdXBzW29dLnZpc2libGV8fHZvaWQgMCE9PXRoaXMubGluZWdyYXBoT3B0aW9ucy52aXNpYmlsaXR5W29dJiYxIT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtvXXx8KHIrPXRoaXMuZ3JvdXBzW29dLmNvbnRlbnQrXCI8YnIgLz5cIik7dGhpcy5kb20udGV4dEFyZWEuaW5uZXJIVE1MPXIsdGhpcy5kb20udGV4dEFyZWEuc3R5bGUubGluZUhlaWdodD0uNzUqdGhpcy5vcHRpb25zLmljb25TaXplK3RoaXMub3B0aW9ucy5pY29uU3BhY2luZytcInB4XCJ9fSxvLnByb3RvdHlwZS5kcmF3TGVnZW5kSWNvbnM9ZnVuY3Rpb24oKXtpZih0aGlzLmRvbS5mcmFtZS5wYXJlbnROb2RlKXt2YXIgdD0oMCxzLmRlZmF1bHQpKHRoaXMuZ3JvdXBzKTt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdDxlPy0xOjF9KSxhLnJlc2V0RWxlbWVudHModGhpcy5zdmdFbGVtZW50cyk7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5kb20uZnJhbWUpLnBhZGRpbmdUb3AsaT1OdW1iZXIoZS5yZXBsYWNlKFwicHhcIixcIlwiKSksbz1pLG49dGhpcy5vcHRpb25zLmljb25TaXplLHI9Ljc1KnRoaXMub3B0aW9ucy5pY29uU2l6ZSxoPWkrLjUqciszO3RoaXMuc3ZnLnN0eWxlLndpZHRoPW4rNStpK1wicHhcIjtmb3IodmFyIGQ9MDtkPHQubGVuZ3RoO2QrKyl7dmFyIGw9dFtkXTsxIT10aGlzLmdyb3Vwc1tsXS52aXNpYmxlfHx2b2lkIDAhPT10aGlzLmxpbmVncmFwaE9wdGlvbnMudmlzaWJpbGl0eVtsXSYmMSE9dGhpcy5saW5lZ3JhcGhPcHRpb25zLnZpc2liaWxpdHlbbF18fCh0aGlzLmdyb3Vwc1tsXS5nZXRMZWdlbmQobixyLHRoaXMuZnJhbWV3b3JrLG8saCksaCs9cit0aGlzLm9wdGlvbnMuaWNvblNwYWNpbmcpfX19LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89XCJzdHJpbmdcIixuPVwiYm9vbGVhblwiLHM9XCJudW1iZXJcIixyPVwib2JqZWN0XCIsYT17Y29uZmlndXJlOntlbmFibGVkOntib29sZWFuOm59LGZpbHRlcjp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sY29udGFpbmVyOntkb206XCJkb21cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSx5QXhpc09yaWVudGF0aW9uOntzdHJpbmc6W1wibGVmdFwiLFwicmlnaHRcIl19LGRlZmF1bHRHcm91cDp7c3RyaW5nOm99LHNvcnQ6e2Jvb2xlYW46bn0sc2FtcGxpbmc6e2Jvb2xlYW46bn0sc3RhY2s6e2Jvb2xlYW46bn0sZ3JhcGhIZWlnaHQ6e3N0cmluZzpvLG51bWJlcjpzfSxzaGFkZWQ6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sb3JpZW50YXRpb246e3N0cmluZzpbXCJib3R0b21cIixcInRvcFwiLFwiemVyb1wiLFwiZ3JvdXBcIl19LGdyb3VwSWQ6e29iamVjdDpyfSxfX3R5cGVfXzp7Ym9vbGVhbjpuLG9iamVjdDpyfX0sc3R5bGU6e3N0cmluZzpbXCJsaW5lXCIsXCJiYXJcIixcInBvaW50c1wiXX0sYmFyQ2hhcnQ6e3dpZHRoOntudW1iZXI6c30sbWluV2lkdGg6e251bWJlcjpzfSxzaWRlQnlTaWRlOntib29sZWFuOm59LGFsaWduOntzdHJpbmc6W1wibGVmdFwiLFwiY2VudGVyXCIsXCJyaWdodFwiXX0sX190eXBlX186e29iamVjdDpyfX0saW50ZXJwb2xhdGlvbjp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxwYXJhbWV0cml6YXRpb246e3N0cmluZzpbXCJjZW50cmlwZXRhbFwiLFwiY2hvcmRhbFwiLFwidW5pZm9ybVwiXX0sYWxwaGE6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sZHJhd1BvaW50czp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxvblJlbmRlcjp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxzaXplOntudW1iZXI6c30sc3R5bGU6e3N0cmluZzpbXCJzcXVhcmVcIixcImNpcmNsZVwiXX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxkYXRhQXhpczp7c2hvd01pbm9yTGFiZWxzOntib29sZWFuOm59LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpufSxpY29uczp7Ym9vbGVhbjpufSx3aWR0aDp7c3RyaW5nOm8sbnVtYmVyOnN9LHZpc2libGU6e2Jvb2xlYW46bn0sYWxpZ25aZXJvczp7Ym9vbGVhbjpufSxsZWZ0OntyYW5nZTp7bWluOntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbWF4OntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyfX0sZm9ybWF0OntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LHRpdGxlOnt0ZXh0OntzdHJpbmc6byxudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sc3R5bGU6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxyaWdodDp7cmFuZ2U6e21pbjp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1heDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LGZvcm1hdDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSx0aXRsZTp7dGV4dDp7c3RyaW5nOm8sbnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0eWxlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyfX0sX190eXBlX186e29iamVjdDpyfX0sX190eXBlX186e29iamVjdDpyfX0sbGVnZW5kOntlbmFibGVkOntib29sZWFuOm59LGljb25zOntib29sZWFuOm59LGxlZnQ6e3Zpc2libGU6e2Jvb2xlYW46bn0scG9zaXRpb246e3N0cmluZzpbXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1yaWdodFwiLFwidG9wLWxlZnRcIixcImJvdHRvbS1sZWZ0XCJdfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxyaWdodDp7dmlzaWJsZTp7Ym9vbGVhbjpufSxwb3NpdGlvbjp7c3RyaW5nOltcInRvcC1yaWdodFwiLFwiYm90dG9tLXJpZ2h0XCIsXCJ0b3AtbGVmdFwiLFwiYm90dG9tLWxlZnRcIl19LF9fdHlwZV9fOntvYmplY3Q6cn19LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxncm91cHM6e3Zpc2liaWxpdHk6e2FueTpcImFueVwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxhdXRvUmVzaXplOntib29sZWFuOm59LHRocm90dGxlUmVkcmF3OntudW1iZXI6c30sY2xpY2tUb1VzZTp7Ym9vbGVhbjpufSxlbmQ6e251bWJlcjpzLGRhdGU6XCJkYXRlXCIsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sc2Vjb25kOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sbWludXRlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0saG91cjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHdlZWtkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxkYXk6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxtb250aDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHllYXI6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtYWpvckxhYmVsczp7bWlsbGlzZWNvbmQ6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxzZWNvbmQ6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxtaW51dGU6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxob3VyOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sd2Vla2RheTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGRheTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LG1vbnRoOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0seWVhcjp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LF9fdHlwZV9fOntvYmplY3Q6cn19LG1vbWVudDp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxoZWlnaHQ6e3N0cmluZzpvLG51bWJlcjpzfSxoaWRkZW5EYXRlczp7c3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LGVuZDp7ZGF0ZTpcImRhdGVcIixudW1iZXI6cyxzdHJpbmc6byxtb21lbnQ6XCJtb21lbnRcIn0scmVwZWF0OntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyLGFycmF5OlwiYXJyYXlcIn19LGxvY2FsZTp7c3RyaW5nOm99LGxvY2FsZXM6e19fYW55X186e2FueTpcImFueVwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtYXg6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LG1heEhlaWdodDp7bnVtYmVyOnMsc3RyaW5nOm99LG1heE1pbm9yQ2hhcnM6e251bWJlcjpzfSxtaW46e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LG1pbkhlaWdodDp7bnVtYmVyOnMsc3RyaW5nOm99LG1vdmVhYmxlOntib29sZWFuOm59LG11bHRpc2VsZWN0Ontib29sZWFuOm59LG9yaWVudGF0aW9uOntzdHJpbmc6b30sc2hvd0N1cnJlbnRUaW1lOntib29sZWFuOm59LHNob3dNYWpvckxhYmVsczp7Ym9vbGVhbjpufSxzaG93TWlub3JMYWJlbHM6e2Jvb2xlYW46bn0sc3RhcnQ6e2RhdGU6XCJkYXRlXCIsbnVtYmVyOnMsc3RyaW5nOm8sbW9tZW50OlwibW9tZW50XCJ9LHRpbWVBeGlzOntzY2FsZTp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0ZXA6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSx3aWR0aDp7c3RyaW5nOm8sbnVtYmVyOnN9LHpvb21hYmxlOntib29sZWFuOm59LHpvb21LZXk6e3N0cmluZzpbXCJjdHJsS2V5XCIsXCJhbHRLZXlcIixcIm1ldGFLZXlcIixcIlwiXX0sem9vbU1heDp7bnVtYmVyOnN9LHpvb21NaW46e251bWJlcjpzfSx6SW5kZXg6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxoPXtnbG9iYWw6e3NvcnQ6ITAsc2FtcGxpbmc6ITAsc3RhY2s6ITEsc2hhZGVkOntlbmFibGVkOiExLG9yaWVudGF0aW9uOltcInplcm9cIixcInRvcFwiLFwiYm90dG9tXCIsXCJncm91cFwiXX0sc3R5bGU6W1wibGluZVwiLFwiYmFyXCIsXCJwb2ludHNcIl0sYmFyQ2hhcnQ6e3dpZHRoOls1MCw1LDEwMCw1XSxtaW5XaWR0aDpbNTAsNSwxMDAsNV0sc2lkZUJ5U2lkZTohMSxhbGlnbjpbXCJsZWZ0XCIsXCJjZW50ZXJcIixcInJpZ2h0XCJdfSxpbnRlcnBvbGF0aW9uOntlbmFibGVkOiEwLHBhcmFtZXRyaXphdGlvbjpbXCJjZW50cmlwZXRhbFwiLFwiY2hvcmRhbFwiLFwidW5pZm9ybVwiXX0sZHJhd1BvaW50czp7ZW5hYmxlZDohMCxzaXplOls2LDIsMzAsMV0sc3R5bGU6W1wic3F1YXJlXCIsXCJjaXJjbGVcIl19LGRhdGFBeGlzOntzaG93TWlub3JMYWJlbHM6ITAsc2hvd01ham9yTGFiZWxzOiEwLGljb25zOiExLHdpZHRoOls0MCwwLDIwMCwxXSx2aXNpYmxlOiEwLGFsaWduWmVyb3M6ITAsbGVmdDp7dGl0bGU6e3RleHQ6XCJcIixzdHlsZTpcIlwifX0scmlnaHQ6e3RpdGxlOnt0ZXh0OlwiXCIsc3R5bGU6XCJcIn19fSxsZWdlbmQ6e2VuYWJsZWQ6ITEsaWNvbnM6ITAsbGVmdDp7dmlzaWJsZTohMCxwb3NpdGlvbjpbXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1yaWdodFwiLFwidG9wLWxlZnRcIixcImJvdHRvbS1sZWZ0XCJdfSxyaWdodDp7dmlzaWJsZTohMCxwb3NpdGlvbjpbXCJ0b3AtcmlnaHRcIixcImJvdHRvbS1yaWdodFwiLFwidG9wLWxlZnRcIixcImJvdHRvbS1sZWZ0XCJdfX0sYXV0b1Jlc2l6ZTohMCxjbGlja1RvVXNlOiExLGVuZDpcIlwiLGZvcm1hdDp7bWlub3JMYWJlbHM6e21pbGxpc2Vjb25kOlwiU1NTXCIsc2Vjb25kOlwic1wiLG1pbnV0ZTpcIkhIOm1tXCIsaG91cjpcIkhIOm1tXCIsd2Vla2RheTpcImRkZCBEXCIsZGF5OlwiRFwiLG1vbnRoOlwiTU1NXCIseWVhcjpcIllZWVlcIn0sbWFqb3JMYWJlbHM6e21pbGxpc2Vjb25kOlwiSEg6bW06c3NcIixzZWNvbmQ6XCJEIE1NTU0gSEg6bW1cIixtaW51dGU6XCJkZGQgRCBNTU1NXCIsaG91cjpcImRkZCBEIE1NTU1cIix3ZWVrZGF5OlwiTU1NTSBZWVlZXCIsZGF5OlwiTU1NTSBZWVlZXCIsbW9udGg6XCJZWVlZXCIseWVhcjpcIlwifX0saGVpZ2h0OlwiXCIsbG9jYWxlOlwiXCIsbWF4OlwiXCIsbWF4SGVpZ2h0OlwiXCIsbWF4TWlub3JDaGFyczpbNywwLDIwLDFdLG1pbjpcIlwiLG1pbkhlaWdodDpcIlwiLG1vdmVhYmxlOiEwLG9yaWVudGF0aW9uOltcImJvdGhcIixcImJvdHRvbVwiLFwidG9wXCJdLHNob3dDdXJyZW50VGltZTohMSxzaG93TWFqb3JMYWJlbHM6ITAsc2hvd01pbm9yTGFiZWxzOiEwLHN0YXJ0OlwiXCIsd2lkdGg6XCIxMDAl
21167XCIsem9vbWFibGU6ITAsem9vbUtleTpbXCJjdHJsS2V5XCIsXCJhbHRLZXlcIixcIm1ldGFLZXlcIixcIlwiXSx6b29tTWF4OlszMTUzNmUxMCwxMCwzMTUzNmUxMCwxXSx6b29tTWluOlsxMCwxMCwzMTUzNmUxMCwxXSx6SW5kZXg6MH19O2UuYWxsT3B0aW9ucz1hLGUuY29uZmlndXJlT3B0aW9ucz1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gUj10LGYoKX1mdW5jdGlvbiBuKCl7QT0wLHo9Ui5jaGFyQXQoMCl9ZnVuY3Rpb24gcygpe0ErKyx6PVIuY2hhckF0KEEpfWZ1bmN0aW9uIHIoKXtyZXR1cm4gUi5jaGFyQXQoQSsxKX1mdW5jdGlvbiBhKHQpe3JldHVybiBCLnRlc3QodCl9ZnVuY3Rpb24gaCh0LGUpe2lmKHR8fCh0PXt9KSxlKWZvcih2YXIgaSBpbiBlKWUuaGFzT3duUHJvcGVydHkoaSkmJih0W2ldPWVbaV0pO3JldHVybiB0fWZ1bmN0aW9uIGQodCxlLGkpe2Zvcih2YXIgbz1lLnNwbGl0KFwiLlwiKSxuPXQ7by5sZW5ndGg7KXt2YXIgcz1vLnNoaWZ0KCk7by5sZW5ndGg/KG5bc118fChuW3NdPXt9KSxuPW5bc10pOm5bc109aX19ZnVuY3Rpb24gbCh0LGUpe2Zvcih2YXIgaSxvLG49bnVsbCxzPVt0XSxyPXQ7ci5wYXJlbnQ7KXMucHVzaChyLnBhcmVudCkscj1yLnBhcmVudDtpZihyLm5vZGVzKWZvcihpPTAsbz1yLm5vZGVzLmxlbmd0aDtpPG87aSsrKWlmKGUuaWQ9PT1yLm5vZGVzW2ldLmlkKXtuPXIubm9kZXNbaV07YnJlYWt9Zm9yKG58fChuPXtpZDplLmlkfSx0Lm5vZGUmJihuLmF0dHI9aChuLmF0dHIsdC5ub2RlKSkpLGk9cy5sZW5ndGgtMTtpPj0wO2ktLSl7dmFyIGE9c1tpXTthLm5vZGVzfHwoYS5ub2Rlcz1bXSksLTE9PT1hLm5vZGVzLmluZGV4T2YobikmJmEubm9kZXMucHVzaChuKX1lLmF0dHImJihuLmF0dHI9aChuLmF0dHIsZS5hdHRyKSl9ZnVuY3Rpb24gdSh0LGUpe2lmKHQuZWRnZXN8fCh0LmVkZ2VzPVtdKSx0LmVkZ2VzLnB1c2goZSksdC5lZGdlKXt2YXIgaT1oKHt9LHQuZWRnZSk7ZS5hdHRyPWgoaSxlLmF0dHIpfX1mdW5jdGlvbiBjKHQsZSxpLG8sbil7dmFyIHM9e2Zyb206ZSx0bzppLHR5cGU6b307cmV0dXJuIHQuZWRnZSYmKHMuYXR0cj1oKHt9LHQuZWRnZSkpLHMuYXR0cj1oKHMuYXR0cnx8e30sbiksc31mdW5jdGlvbiBwKCl7Zm9yKEY9SS5OVUxMLEw9XCJcIjtcIiBcIj09PXp8fFwiXFx0XCI9PT16fHxcIlxcblwiPT09enx8XCJcXHJcIj09PXo7KXMoKTtkb3t2YXIgdD0hMTtpZihcIiNcIj09PXope2Zvcih2YXIgZT1BLTE7XCIgXCI9PT1SLmNoYXJBdChlKXx8XCJcXHRcIj09PVIuY2hhckF0KGUpOyllLS07aWYoXCJcXG5cIj09PVIuY2hhckF0KGUpfHxcIlwiPT09Ui5jaGFyQXQoZSkpe2Zvcig7XCJcIiE9eiYmXCJcXG5cIiE9ejspcygpO3Q9ITB9fWlmKFwiL1wiPT09eiYmXCIvXCI9PT1yKCkpe2Zvcig7XCJcIiE9eiYmXCJcXG5cIiE9ejspcygpO3Q9ITB9aWYoXCIvXCI9PT16JiZcIipcIj09PXIoKSl7Zm9yKDtcIlwiIT16Oyl7aWYoXCIqXCI9PT16JiZcIi9cIj09PXIoKSl7cygpLHMoKTticmVha31zKCl9dD0hMH1mb3IoO1wiIFwiPT09enx8XCJcXHRcIj09PXp8fFwiXFxuXCI9PT16fHxcIlxcclwiPT09ejspcygpfXdoaWxlKHQpO2lmKFwiXCI9PT16KXJldHVybiB2b2lkKEY9SS5ERUxJTUlURVIpO3ZhciBpPXorcigpO2lmKE5baV0pcmV0dXJuIEY9SS5ERUxJTUlURVIsTD1pLHMoKSx2b2lkIHMoKTtpZihOW3pdKXJldHVybiBGPUkuREVMSU1JVEVSLEw9eix2b2lkIHMoKTtpZihhKHopfHxcIi1cIj09PXope2ZvcihMKz16LHMoKTthKHopOylMKz16LHMoKTtyZXR1cm5cImZhbHNlXCI9PT1MP0w9ITE6XCJ0cnVlXCI9PT1MP0w9ITA6aXNOYU4oTnVtYmVyKEwpKXx8KEw9TnVtYmVyKEwpKSx2b2lkKEY9SS5JREVOVElGSUVSKX1pZignXCInPT09eil7Zm9yKHMoKTtcIlwiIT16JiYoJ1wiJyE9enx8J1wiJz09PXomJidcIic9PT1yKCkpOyknXCInPT09ej8oTCs9eixzKCkpOlwiXFxcXFwiPT09eiYmXCJuXCI9PT1yKCk/KEwrPVwiXFxuXCIscygpKTpMKz16LHMoKTtpZignXCInIT16KXRocm93IHgoJ0VuZCBvZiBzdHJpbmcgXCIgZXhwZWN0ZWQnKTtyZXR1cm4gcygpLHZvaWQoRj1JLklERU5USUZJRVIpfWZvcihGPUkuVU5LTk9XTjtcIlwiIT16OylMKz16LHMoKTt0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ1N5bnRheCBlcnJvciBpbiBwYXJ0IFwiJytrKEwsMzApKydcIicpfWZ1bmN0aW9uIGYoKXt2YXIgdD17fTtpZihuKCkscCgpLFwic3RyaWN0XCI9PT1MJiYodC5zdHJpY3Q9ITAscCgpKSxcImdyYXBoXCIhPT1MJiZcImRpZ3JhcGhcIiE9PUx8fCh0LnR5cGU9TCxwKCkpLEY9PT1JLklERU5USUZJRVImJih0LmlkPUwscCgpKSxcIntcIiE9TCl0aHJvdyB4KFwiQW5nbGUgYnJhY2tldCB7IGV4cGVjdGVkXCIpO2lmKHAoKSxtKHQpLFwifVwiIT1MKXRocm93IHgoXCJBbmdsZSBicmFja2V0IH0gZXhwZWN0ZWRcIik7aWYocCgpLFwiXCIhPT1MKXRocm93IHgoXCJFbmQgb2YgZmlsZSBleHBlY3RlZFwiKTtyZXR1cm4gcCgpLGRlbGV0ZSB0Lm5vZGUsZGVsZXRlIHQuZWRnZSxkZWxldGUgdC5ncmFwaCx0fWZ1bmN0aW9uIG0odCl7Zm9yKDtcIlwiIT09TCYmXCJ9XCIhPUw7KXYodCksXCI7XCI9PT1MJiZwKCl9ZnVuY3Rpb24gdih0KXt2YXIgZT1nKHQpO2lmKGUpcmV0dXJuIHZvaWQgXyh0LGUpO2lmKCF5KHQpKXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeChcIklkZW50aWZpZXIgZXhwZWN0ZWRcIik7dmFyIGk9TDtpZihwKCksXCI9XCI9PT1MKXtpZihwKCksRiE9SS5JREVOVElGSUVSKXRocm93IHgoXCJJZGVudGlmaWVyIGV4cGVjdGVkXCIpO3RbaV09TCxwKCl9ZWxzZSBiKHQsaSl9fWZ1bmN0aW9uIGcodCl7dmFyIGU9bnVsbDtpZihcInN1YmdyYXBoXCI9PT1MJiYoZT17fSxlLnR5cGU9XCJzdWJncmFwaFwiLHAoKSxGPT09SS5JREVOVElGSUVSJiYoZS5pZD1MLHAoKSkpLFwie1wiPT09TCl7aWYocCgpLGV8fChlPXt9KSxlLnBhcmVudD10LGUubm9kZT10Lm5vZGUsZS5lZGdlPXQuZWRnZSxlLmdyYXBoPXQuZ3JhcGgsbShlKSxcIn1cIiE9TCl0aHJvdyB4KFwiQW5nbGUgYnJhY2tldCB9IGV4cGVjdGVkXCIpO3AoKSxkZWxldGUgZS5ub2RlLGRlbGV0ZSBlLmVkZ2UsZGVsZXRlIGUuZ3JhcGgsZGVsZXRlIGUucGFyZW50LHQuc3ViZ3JhcGhzfHwodC5zdWJncmFwaHM9W10pLHQuc3ViZ3JhcGhzLnB1c2goZSl9cmV0dXJuIGV9ZnVuY3Rpb24geSh0KXtyZXR1cm5cIm5vZGVcIj09PUw/KHAoKSx0Lm5vZGU9dygpLFwibm9kZVwiKTpcImVkZ2VcIj09PUw/KHAoKSx0LmVkZ2U9dygpLFwiZWRnZVwiKTpcImdyYXBoXCI9PT1MPyhwKCksdC5ncmFwaD13KCksXCJncmFwaFwiKTpudWxsfWZ1bmN0aW9uIGIodCxlKXt2YXIgaT17aWQ6ZX0sbz13KCk7byYmKGkuYXR0cj1vKSxsKHQsaSksXyh0LGUpfWZ1bmN0aW9uIF8odCxlKXtmb3IoO1wiLT5cIj09PUx8fFwiLS1cIj09PUw7KXt2YXIgaSxvPUw7cCgpO3ZhciBuPWcodCk7
21167aWYobilpPW47ZWxzZXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeChcIklkZW50aWZpZXIgb3Igc3ViZ3JhcGggZXhwZWN0ZWRcIik7aT1MLGwodCx7aWQ6aX0pLHAoKX11KHQsYyh0LGUsaSxvLHcoKSkpLGU9aX19ZnVuY3Rpb24gdygpe2Zvcih2YXIgdD1udWxsLGU9e2Rhc2hlZDohMCxzb2xpZDohMSxkb3R0ZWQ6WzEsNV19O1wiW1wiPT09TDspe2ZvcihwKCksdD17fTtcIlwiIT09TCYmXCJdXCIhPUw7KXtpZihGIT1JLklERU5USUZJRVIpdGhyb3cgeChcIkF0dHJpYnV0ZSBuYW1lIGV4cGVjdGVkXCIpO3ZhciBpPUw7aWYocCgpLFwiPVwiIT1MKXRocm93IHgoXCJFcXVhbCBzaWduID0gZXhwZWN0ZWRcIik7aWYocCgpLEYhPUkuSURFTlRJRklFUil0aHJvdyB4KFwiQXR0cmlidXRlIHZhbHVlIGV4cGVjdGVkXCIpO3ZhciBvPUw7XCJzdHlsZVwiPT09aSYmKG89ZVtvXSksZCh0LGksbykscCgpLFwiLFwiPT1MJiZwKCl9aWYoXCJdXCIhPUwpdGhyb3cgeChcIkJyYWNrZXQgXSBleHBlY3RlZFwiKTtwKCl9cmV0dXJuIHR9ZnVuY3Rpb24geCh0KXtyZXR1cm4gbmV3IFN5bnRheEVycm9yKHQrJywgZ290IFwiJytrKEwsMzApKydcIiAoY2hhciAnK0ErXCIpXCIpfWZ1bmN0aW9uIGsodCxlKXtyZXR1cm4gdC5sZW5ndGg8PWU/dDp0LnN1YnN0cigwLDI3KStcIi4uLlwifWZ1bmN0aW9uIFModCxlLGkpe0FycmF5LmlzQXJyYXkodCk/dC5mb3JFYWNoKGZ1bmN0aW9uKHQpe0FycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kodCxlKX0pOmkodCxlKX0pOkFycmF5LmlzQXJyYXkoZSk/ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2kodCxlKX0pOmkodCxlKX1mdW5jdGlvbiBEKHQsZSxpKXtmb3IodmFyIG89ZS5zcGxpdChcIi5cIiksbj1vLnBvcCgpLHM9dCxyPTA7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl07YSBpbiBzfHwoc1thXT17fSkscz1zW2FdfXJldHVybiBzW25dPWksdH1mdW5jdGlvbiBNKHQsZSl7dmFyIGk9e307Zm9yKHZhciBvIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49ZVtvXTtBcnJheS5pc0FycmF5KG4pP24uZm9yRWFjaChmdW5jdGlvbihlKXtEKGksZSx0W29dKX0pOlwic3RyaW5nXCI9PXR5cGVvZiBuP0QoaSxuLHRbb10pOkQoaSxvLHRbb10pfXJldHVybiBpfWZ1bmN0aW9uIEModCl7dmFyIGU9byh0KSxpPXtub2RlczpbXSxlZGdlczpbXSxvcHRpb25zOnt9fTtpZihlLm5vZGVzJiZlLm5vZGVzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9e2lkOnQuaWQsbGFiZWw6U3RyaW5nKHQubGFiZWx8fHQuaWQpfTtoKGUsTSh0LmF0dHIsVCkpLGUuaW1hZ2UmJihlLnNoYXBlPVwiaW1hZ2VcIiksaS5ub2Rlcy5wdXNoKGUpfSksZS5lZGdlcyl7dmFyIG49ZnVuY3Rpb24odCl7dmFyIGU9e2Zyb206dC5mcm9tLHRvOnQudG99O3JldHVybiBoKGUsTSh0LmF0dHIsUCkpLGUuYXJyb3dzPVwiLT5cIj09PXQudHlwZT9cInRvXCI6dm9pZCAwLGV9O2UuZWRnZXMuZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZSxvO2U9dC5mcm9tIGluc3RhbmNlb2YgT2JqZWN0P3QuZnJvbS5ub2Rlczp7aWQ6dC5mcm9tfSxvPXQudG8gaW5zdGFuY2VvZiBPYmplY3Q/dC50by5ub2Rlczp7aWQ6dC50b30sdC5mcm9tIGluc3RhbmNlb2YgT2JqZWN0JiZ0LmZyb20uZWRnZXMmJnQuZnJvbS5lZGdlcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPW4odCk7aS5lZGdlcy5wdXNoKGUpfSksUyhlLG8sZnVuY3Rpb24oZSxvKXt2YXIgcz1jKGksZS5pZCxvLmlkLHQudHlwZSx0LmF0dHIpLHI9bihzKTtpLmVkZ2VzLnB1c2gocil9KSx0LnRvIGluc3RhbmNlb2YgT2JqZWN0JiZ0LnRvLmVkZ2VzJiZ0LnRvLmVkZ2VzLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9bih0KTtpLmVkZ2VzLnB1c2goZSl9KX0pfXJldHVybiBlLmF0dHImJihpLm9wdGlvbnM9ZS5hdHRyKSxpfXZhciBPPWkoMjkpLEU9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShPKSxUPXtmb250c2l6ZTpcImZvbnQuc2l6ZVwiLGZvbnRjb2xvcjpcImZvbnQuY29sb3JcIixsYWJlbGZvbnRjb2xvcjpcImZvbnQuY29sb3JcIixmb250bmFtZTpcImZvbnQuZmFjZVwiLGNvbG9yOltcImNvbG9yLmJvcmRlclwiLFwiY29sb3IuYmFja2dyb3VuZFwiXSxmaWxsY29sb3I6XCJjb2xvci5iYWNrZ3JvdW5kXCIsdG9vbHRpcDpcInRpdGxlXCIsbGFiZWx0b29sdGlwOlwidGl0bGVcIn0sUD0oMCxFLmRlZmF1bHQpKFQpO1AuY29sb3I9XCJjb2xvci5jb2xvclwiLFAuc3R5bGU9XCJkYXNoZXNcIjt2YXIgST17TlVMTDowLERFTElNSVRFUjoxLElERU5USUZJRVI6MixVTktOT1dOOjN9LE49e1wie1wiOiEwLFwifVwiOiEwLFwiW1wiOiEwLFwiXVwiOiEwLFwiO1wiOiEwLFwiPVwiOiEwLFwiLFwiOiEwLFwiLT5cIjohMCxcIi0tXCI6ITB9LFI9XCJcIixBPTAsej1cIlwiLEw9XCJcIixGPUkuTlVMTCxCPS9bYS16QS1aXzAtOS46I10vO2UucGFyc2VET1Q9byxlLkRPVFRvR3JhcGg9Q30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlKXt2YXIgaT1bXSxvPVtdLG49e2VkZ2VzOntpbmhlcml0Q29sb3I6ITF9LG5vZGVzOntmaXhlZDohMSxwYXJzZUNvbG9yOiExfX07dm9pZCAwIT09ZSYmKHZvaWQgMCE9PWUuZml4ZWQmJihuLm5vZGVzLmZpeGVkPWUuZml4ZWQpLHZvaWQgMCE9PWUucGFyc2VDb2xvciYmKG4ubm9kZXMucGFyc2VDb2xvcj1lLnBhcnNlQ29sb3IpLHZvaWQgMCE9PWUuaW5oZXJpdENvbG9yJiYobi5lZGdlcy5pbmhlcml0Q29sb3I9ZS5pbmhlcml0Q29sb3IpKTtmb3IodmFyIHM9dC5lZGdlcyxyPXQubm9kZXMsYT0wO2E8cy5sZW5ndGg7YSsrKXt2YXIgaD17fSxkPXNbYV07aC5pZD1kLmlkLGguZnJvbT1kLnNvdXJjZSxoLnRvPWQudGFyZ2V0LGguYXR0cmlidXRlcz1kLmF0dHJpYnV0ZXMsaC5sYWJlbD1kLmxhYmVsLGgudGl0bGU9dm9pZCAwIT09ZC5hdHRyaWJ1dGVzP2QuYXR0cmlidXRlcy50aXRsZTp2b2lkIDAsXCJEaXJlY3RlZFwiPT09ZC50eXBlJiYoaC5hcnJvd3M9XCJ0b1wiKSxkLmNvbG9yJiYhMT09PW4uaW5oZXJpdENvbG9yJiYoaC5jb2xvcj1kLmNvbG9yKSxpLnB1c2goaCl9Zm9yKHZhciBsPTA7bDxyLmxlbmd0aDtsKyspe3ZhciB1PXt9LGM9cltsXTt1LmlkPWMuaWQsdS5hdHRyaWJ1dGVzPWMuYXR0cmlidXRlcyx1Lng9Yy54LHUueT1jLnksdS5sYWJlbD1jLmxhYmVsLHUudGl0bGU9dm9pZCAwIT09Yy5hdHRyaWJ1dGVzP2MuYXR0cmlidXRlcy50aXRsZTpjLnRpdGxlLCEwPT09bi5ub2Rlcy5wYXJzZUNvbG9yP3UuY29sb3I9Yy5jb2xvcjp1LmNvbG9yPXZvaWQgMCE9PWMuY29sb3I/e2JhY2tncm91bmQ6Yy5jb2xvcixib3JkZXI6Yy5jb2xvcixoaWdobGlnaHQ6e2JhY2tncm91bmQ6Yy5jb2xvcixib3JkZXI6Yy5jb2xvcn0saG92ZXI6e2JhY2tncm91bmQ6Yy5jb2xvcixib3JkZXI6Yy5jb2xvcn19OnZvaWQgMCx1LnNpemU9Yy5zaXplLHUuZml4ZWQ9bi5ub2Rlcy5maXhlZCYmdm9pZCAwIT09Yy54JiZ2b2lkIDAhPT1jLnksby5wdXNoKHUpfXJldHVybntub2RlczpvLGVkZ2VzOml9fWUucGFyc2VHZXBoaT1vfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMTg1KSxkPW8oaCksbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7KDAscy5kZWZh
21167dWx0KSh0aGlzLHQpLHRoaXMuaW1hZ2VzPXt9LHRoaXMuaW1hZ2VCcm9rZW49e30sdGhpcy5jYWxsYmFjaz1lfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcIl90cnlsb2FkQnJva2VuVXJsXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PXQmJnZvaWQgMCE9PWkpe2lmKHZvaWQgMD09PWUpcmV0dXJuIHZvaWQgY29uc29sZS53YXJuKFwiTm8gYnJva2VuIHVybCBpbWFnZSBkZWZpbmVkXCIpO2kub25lcnJvcj1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoXCJDb3VsZCBub3QgbG9hZCBicm9rZW5JbWFnZTpcIixlKX0saS5pbWFnZS5zcmM9ZX19fSx7a2V5OlwiX3JlZHJhd1dpdGhJbWFnZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuY2FsbGJhY2smJnRoaXMuY2FsbGJhY2sodCl9fSx7a2V5OlwibG9hZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXRoaXMuaW1hZ2VzW3RdO2lmKG8pcmV0dXJuIG87dmFyIG49bmV3IGQuZGVmYXVsdDtyZXR1cm4gdGhpcy5pbWFnZXNbdF09bixuLmltYWdlLm9ubG9hZD1mdW5jdGlvbigpe2kuX2ZpeEltYWdlQ29vcmRpbmF0ZXMobi5pbWFnZSksbi5pbml0KCksaS5fcmVkcmF3V2l0aEltYWdlKG4pfSxuLmltYWdlLm9uZXJyb3I9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKFwiQ291bGQgbm90IGxvYWQgaW1hZ2U6XCIsdCksaS5fdHJ5bG9hZEJyb2tlblVybCh0LGUsbil9LG4uaW1hZ2Uuc3JjPXQsbn19LHtrZXk6XCJfZml4SW1hZ2VDb29yZGluYXRlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpezA9PT10LndpZHRoJiYoZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSx0LndpZHRoPXQub2Zmc2V0V2lkdGgsdC5oZWlnaHQ9dC5vZmZzZXRIZWlnaHQsZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0KSl9fV0pLHR9KCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMwKSxzPW8obikscj1pKDYpLGE9byhyKSxoPWkoMCksZD1vKGgpLGw9aSgxKSx1PW8obCksYz1pKDIpLHA9aSg0OCkuZGVmYXVsdCxmPWkoMTkxKS5kZWZhdWx0LG09W1wiYm9sZFwiLFwiaXRhbFwiLFwiYm9sZGl0YWxcIixcIm1vbm9cIl0sdj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXt2YXIgbz1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBvaW50VG9TZWxmPSExLHRoaXMuYmFzZVNpemU9dm9pZCAwLHRoaXMuZm9udE9wdGlvbnM9e30sdGhpcy5zZXRPcHRpb25zKGkpLHRoaXMuc2l6ZT17dG9wOjAsbGVmdDowLHdpZHRoOjAsaGVpZ2h0OjAseUxpbmU6MH0sdGhpcy5pc0VkZ2VMYWJlbD1vfXJldHVybigwLHUuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih0aGlzLmVsZW1lbnRPcHRpb25zPXQsdGhpcy5pbml0Rm9udE9wdGlvbnModC5mb250KSxwLmlzVmFsaWRMYWJlbCh0LmxhYmVsKT90aGlzLmxhYmVsRGlydHk9ITA6dC5sYWJlbD1cIlwiLHZvaWQgMCE9PXQuZm9udCYmbnVsbCE9PXQuZm9udClpZihcInN0cmluZ1wiPT10eXBlb2YgdC5mb250KXRoaXMuYmFzZVNpemU9dGhpcy5mb250T3B0aW9ucy5zaXplO2Vsc2UgaWYoXCJvYmplY3RcIj09PSgwLGEuZGVmYXVsdCkodC5mb250KSl7dmFyIGU9dC5mb250LnNpemU7dm9pZCAwIT09ZSYmKHRoaXMuYmFzZVNpemU9ZSl9fX0se2tleTpcImluaXRGb250T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKGUpe3ZhciBpPXRoaXM7aWYoYy5mb3JFYWNoKG0sZnVuY3Rpb24odCl7aS5mb250T3B0aW9uc1t0XT17fX0pLHQucGFyc2VGb250U3RyaW5nKHRoaXMuZm9udE9wdGlvbnMsZSkpcmV0dXJuIHZvaWQodGhpcy5mb250T3B0aW9ucy52YWRqdXN0PTApO2MuZm9yRWFjaChlLGZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dCYmbnVsbCE9PXQmJlwib2JqZWN0XCIhPT0odm9pZCAwPT09dD9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkodCkpJiYoaS5mb250T3B0aW9uc1tlXT10KX0pfX0se2tleTpcImNvbnN0cmFpblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXtjb25zdHJhaW5XaWR0aDohMSxtYXhXZHQ6LTEsbWluV2R0Oi0xLGNvbnN0cmFpbkhlaWdodDohMSxtaW5IZ3Q6LTEsdmFsaWduOlwibWlkZGxlXCJ9LGk9Yy50b3BNb3N0KHQsXCJ3aWR0aENvbnN0cmFpbnRcIik7aWYoXCJudW1iZXJcIj09dHlwZW9mIGkpZS5tYXhXZHQ9TnVtYmVyKGkpLGUubWluV2R0PU51bWJlcihpKTtlbHNlIGlmKFwib2JqZWN0XCI9PT0odm9pZCAwPT09aT9cInVuZGVmaW5lZFwiOigwLGEuZGVmYXVsdCkoaSkpKXt2YXIgbz1jLnRvcE1vc3QodCxbXCJ3aWR0aENvbnN0cmFpbnRcIixcIm1heGltdW1cIl0pO1wibnVtYmVyXCI9PXR5cGVvZiBvJiYoZS5tYXhXZHQ9TnVtYmVyKG8pKTt2YXIgbj1jLnRvcE1vc3QodCxbXCJ3aWR0aENvbnN0cmFpbnRcIixcIm1pbmltdW1cIl0pO1wibnVtYmVyXCI9PXR5cGVvZiBuJiYoZS5taW5XZHQ9TnVtYmVyKG4pKX12YXIgcz1jLnRvcE1vc3QodCxcImhlaWdodENvbnN0cmFpbnRcIik7aWYoXCJudW1iZXJcIj09dHlwZW9mIHMpZS5taW5IZ3Q9TnVtYmVyKHMpO2Vsc2UgaWYoXCJvYmplY3RcIj09PSh2b2lkIDA9PT1zP1widW5kZWZpbmVkXCI6KDAsYS5kZWZhdWx0KShzKSkpe3ZhciByPWMudG9wTW9zdCh0LFtcImhlaWdodENvbnN0cmFpbnRcIixcIm1pbmltdW1cIl0pO1wibnVtYmVyXCI9PXR5cGVvZiByJiYoZS5taW5IZ3Q9TnVtYmVyKHIpKTt2YXIgaD1jLnRvcE1vc3QodCxbXCJoZWlnaHRDb25zdHJhaW50XCIsXCJ2YWxpZ25cIl0pO1wic3RyaW5nXCI9PXR5cGVvZiBoJiYoXCJ0b3BcIiE9PWgmJlwiYm90dG9tXCIhPT1ofHwoZS52YWxpZ249aCkpfXJldHVybiBlfX0se2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRPcHRpb25zKHQsITApLHRoaXMucHJvcGFnYXRlRm9udHMoZSksYy5kZWVwRXh0ZW5kKHRoaXMuZm9udE9wdGlvbnMsdGhpcy5jb25zdHJhaW4oZSkpLHRoaXMuZm9udE9wdGlvbnMuY2hvb3Nlcj1wLmNob29zaWZ5KFwibGFiZWxcIixlKX19LHtrZXk6XCJhZGp1c3RTaXplc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXQ/dC5yaWdodCt0LmxlZnQ6MDt0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbldpZHRoJiYodGhpcy5mb250T3B0aW9ucy5tYXhXZHQtPWUsdGhpcy5mb250T3B0aW9ucy5taW5XZHQtPWUpO3ZhciBpPXQ/dC50b3ArdC5ib3R0b206MDt0aGlzLmZvbnRPcHRpb25zLmNvbnN0cmFpbkhlaWdodCYmKHRoaXMuZm9udE9wdGlvbnMubWluSGd0LT1pKX19LHtrZXk6XCJhZGRGb250T3B0aW9uc1RvUGlsZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPTA7aTxlLmxlbmd0aDsrK2kpdGhpcy5hZGRGb250VG9QaWxlKHQsZVtpXSl9fSx7a2V5OlwiYWRkRm9udFRvUGlsZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwIT09ZSYmdm9pZCAwIT09ZS5mb250JiZudWxsIT09ZS5mb250KXt2YXIgaT1lLmZvbnQ7dC5wdXNoKGkpfX19LHtrZXk6XCJnZXRCYXNpY09wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbihlKXtmb3IodmFyIGk9e30sbz0wO288ZS5sZW5ndGg7KytvKXt2YXIgbj1lW29dLHM9e307dC5wYXJzZU
21167ZvbnRTdHJpbmcocyxuKSYmKG49cyksYy5mb3JFYWNoKG4sZnVuY3Rpb24odCxlKXt2b2lkIDAhPT10JiYoaS5oYXNPd25Qcm9wZXJ0eShlKXx8KC0xIT09bS5pbmRleE9mKGUpP2lbZV09e306aVtlXT10KSl9KX1yZXR1cm4gaX19LHtrZXk6XCJnZXRGb250T3B0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oZSxpLG8pe2Zvcih2YXIgbj12b2lkIDAscz0wO3M8ZS5sZW5ndGg7KytzKXt2YXIgcj1lW3NdO2lmKHIuaGFzT3duUHJvcGVydHkoaSkpe2lmKHZvaWQgMD09PShuPXJbaV0pfHxudWxsPT09biljb250aW51ZTt2YXIgYT17fTtpZih0LnBhcnNlRm9udFN0cmluZyhhLG4pJiYobj1hKSxuLmhhc093blByb3BlcnR5KG8pKXJldHVybiBuW29dfX1pZih0aGlzLmZvbnRPcHRpb25zLmhhc093blByb3BlcnR5KG8pKXJldHVybiB0aGlzLmZvbnRPcHRpb25zW29dO3Rocm93IG5ldyBFcnJvcihcIkRpZCBub3QgZmluZCB2YWx1ZSBmb3IgbXVsdGktZm9udCBmb3IgcHJvcGVydHk6ICdcIitvK1wiJ1wiKX19LHtrZXk6XCJnZXRGb250T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBpPXt9LG89W1wiY29sb3JcIixcInNpemVcIixcImZhY2VcIixcIm1vZFwiLFwidmFkanVzdFwiXSxuPTA7bjxvLmxlbmd0aDsrK24pe3ZhciBzPW9bbl07aVtzXT10aGlzLmdldEZvbnRPcHRpb24odCxlLHMpfXJldHVybiBpfX0se2tleTpcInByb3BhZ2F0ZUZvbnRzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxpPVtdO3RoaXMuYWRkRm9udE9wdGlvbnNUb1BpbGUoaSx0KSx0aGlzLmZvbnRPcHRpb25zPXRoaXMuZ2V0QmFzaWNPcHRpb25zKGkpO2Zvcih2YXIgbz0wO288bS5sZW5ndGg7KytvKSFmdW5jdGlvbih0KXt2YXIgbz1tW3RdLG49ZS5mb250T3B0aW9uc1tvXSxzPWUuZ2V0Rm9udE9wdGlvbnMoaSxvKTtjLmZvckVhY2gocyxmdW5jdGlvbih0LGUpe25bZV09dH0pLG4uc2l6ZT1OdW1iZXIobi5zaXplKSxuLnZhZGp1c3Q9TnVtYmVyKG4udmFkanVzdCl9KG8pfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTpcIm1pZGRsZVwiO2lmKHZvaWQgMCE9PXRoaXMuZWxlbWVudE9wdGlvbnMubGFiZWwpe3ZhciByPXRoaXMuZm9udE9wdGlvbnMuc2l6ZSp0aGlzLmJvZHkudmlldy5zY2FsZTt0aGlzLmVsZW1lbnRPcHRpb25zLmxhYmVsJiZyPHRoaXMuZWxlbWVudE9wdGlvbnMuc2NhbGluZy5sYWJlbC5kcmF3VGhyZXNob2xkLTF8fChyPj10aGlzLmVsZW1lbnRPcHRpb25zLnNjYWxpbmcubGFiZWwubWF4VmlzaWJsZSYmKHI9TnVtYmVyKHRoaXMuZWxlbWVudE9wdGlvbnMuc2NhbGluZy5sYWJlbC5tYXhWaXNpYmxlKS90aGlzLmJvZHkudmlldy5zY2FsZSksdGhpcy5jYWxjdWxhdGVMYWJlbFNpemUodCxvLG4sZSxpLHMpLHRoaXMuX2RyYXdCYWNrZ3JvdW5kKHQpLHRoaXMuX2RyYXdUZXh0KHQsZSx0aGlzLnNpemUueUxpbmUscyxyKSl9fX0se2tleTpcIl9kcmF3QmFja2dyb3VuZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXRoaXMuZm9udE9wdGlvbnMuYmFja2dyb3VuZCYmXCJub25lXCIhPT10aGlzLmZvbnRPcHRpb25zLmJhY2tncm91bmQpe3QuZmlsbFN0eWxlPXRoaXMuZm9udE9wdGlvbnMuYmFja2dyb3VuZDt2YXIgZT10aGlzLmdldFNpemUoKTt0LmZpbGxSZWN0KGUubGVmdCxlLnRvcCxlLndpZHRoLGUuaGVpZ2h0KX19fSx7a2V5OlwiX2RyYXdUZXh0XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpcIm1pZGRsZVwiLG49YXJndW1lbnRzWzRdLHI9dGhpcy5fc2V0QWxpZ25tZW50KHQsZSxpLG8pLGE9KDAscy5kZWZh
21167dWx0KShyLDIpO2U9YVswXSxpPWFbMV0sdC50ZXh0QWxpZ249XCJsZWZ0XCIsZS09dGhpcy5zaXplLndpZHRoLzIsdGhpcy5mb250T3B0aW9ucy52YWxpZ24mJnRoaXMuc2l6ZS5oZWlnaHQ+dGhpcy5zaXplLmxhYmVsSGVpZ2h0JiYoXCJ0b3BcIj09PXRoaXMuZm9udE9wdGlvbnMudmFsaWduJiYoaS09KHRoaXMuc2l6ZS5oZWlnaHQtdGhpcy5zaXplLmxhYmVsSGVpZ2h0KS8yKSxcImJvdHRvbVwiPT09dGhpcy5mb250T3B0aW9ucy52YWxpZ24mJihpKz0odGhpcy5zaXplLmhlaWdodC10aGlzLnNpemUubGFiZWxIZWlnaHQpLzIpKTtmb3IodmFyIGg9MDtoPHRoaXMubGluZUNvdW50O2grKyl7dmFyIGQ9dGhpcy5saW5lc1toXTtpZihkJiZkLmJsb2Nrcyl7dmFyIGw9MDt0aGlzLmlzRWRnZUxhYmVsfHxcImNlbnRlclwiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj9sKz0odGhpcy5zaXplLndpZHRoLWQud2lkdGgpLzI6XCJyaWdodFwiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbiYmKGwrPXRoaXMuc2l6ZS53aWR0aC1kLndpZHRoKTtmb3IodmFyIHU9MDt1PGQuYmxvY2tzLmxlbmd0aDt1Kyspe3ZhciBjPWQuYmxvY2tzW3VdO3QuZm9udD1jLmZvbnQ7dmFyIHA9dGhpcy5fZ2V0Q29sb3IoYy5jb2xvcixuLGMuc3Ryb2tlQ29sb3IpLGY9KDAscy5kZWZhdWx0KShwLDIpLG09ZlswXSx2PWZbMV07Yy5zdHJva2VXaWR0aD4wJiYodC5saW5lV2lkdGg9Yy5zdHJva2VXaWR0aCx0LnN0cm9rZVN0eWxlPXYsdC5saW5lSm9pbj1cInJvdW5kXCIpLHQuZmlsbFN0eWxlPW0sYy5zdHJva2VXaWR0aD4wJiZ0LnN0cm9rZVRleHQoYy50ZXh0LGUrbCxpK2MudmFkanVzdCksdC5maWxsVGV4dChjLnRleHQsZStsLGkrYy52YWRqdXN0KSxsKz1jLndpZHRofWkrPWQuaGVpZ2h0fX19fSx7a2V5OlwiX3NldEFsaWdubWVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8pe2lmKHRoaXMuaXNFZGdlTGFiZWwmJlwiaG9yaXpvbnRhbFwiIT09dGhpcy5mb250T3B0aW9ucy5hbGlnbiYmITE9PT10aGlzLnBvaW50VG9TZWxmKXtlPTAsaT0wO1widG9wXCI9PT10aGlzLmZvbnRPcHRpb25zLmFsaWduPyh0LnRleHRCYXNlbGluZT1cImFscGhhYmV0aWNcIixpLT00KTpcImJvdHRvbVwiPT09dGhpcy5mb250T3B0aW9ucy5hbGlnbj8odC50ZXh0QmFzZWxpbmU9XCJoYW5naW5nXCIsaSs9NCk6dC50ZXh0QmFzZWxpbmU9XCJtaWRkbGVcIn1lbHNlIHQudGV4dEJhc2VsaW5lPW87cmV0dXJuW2UsaV19fSx7a2V5OlwiX2dldENvbG9yXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXR8fFwiIzAwMDAwMFwiLG49aXx8XCIjZmZmZmZmXCI7aWYoZTw9dGhpcy5lbGVtZW50T3B0aW9ucy5zY2FsaW5nLmxhYmVsLmRyYXdUaHJlc2hvbGQpe3ZhciBzPU1hdGgubWF4KDAsTWF0aC5taW4oMSwxLSh0aGlzLmVsZW1lbnRPcHRpb25zLnNjYWxpbmcubGFiZWwuZHJhd1RocmVzaG9sZC1lKSkpO289Yy5vdmVycmlkZU9wYWNpdHkobyxzKSxuPWMub3ZlcnJpZGVPcGFjaXR5KG4scyl9cmV0dXJuW28sbl19fSx7a2V5OlwiZ2V0VGV4dFNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0mJmFyZ3VtZW50c1syXTtyZXR1cm4gdGhpcy5fcHJvY2Vzc0xhYmVsKHQsZSxpKSx7d2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0LGxpbmVDb3VudDp0aGlzLmxpbmVDb3VudH19fSx7a2V5OlwiZ2V0U2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zaXplLmxlZnQsZT10aGlzLnNpemUudG9wLTE7aWYodGhpcy5pc0VkZ2VMYWJlbCl7dmFyIGk9LjUqLXRoaXMuc2l6ZS53aWR0aDtzd2l0Y2godGhpcy5mb250T3B0aW9ucy5hbGlnbil7Y2FzZVwibWlkZGxlXCI6dD1pLGU9LjUqLXRoaXMuc2l6ZS5oZWlnaHQ7YnJlYWs7Y2FzZVwidG9wXCI6dD1pLGU9LSh0aGlzLnNpemUuaGVpZ2h0KzIpO2JyZWFrO2Nhc2VcImJvdHRvbVwiOnQ9aSxlPTJ9fXJldHVybntsZWZ0OnQsdG9wOmUsd2lkdGg6dGhpcy5zaXplLndpZHRoLGhlaWdodDp0aGlzLnNpemUuaGVpZ2h0fX19LHtrZXk6XCJjYWxjdWxhdGVMYWJlbFNpemVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89YXJndW1lbnRzLmxlbmd0aD4zJiZ2b2lkIDAhPT1hcmd1bWVudHNbM10/YXJndW1lbnRzWzNdOjAsbj1hcmd1bWVudHMubGVuZ3RoPjQmJnZvaWQgMCE9PWFyZ3VtZW50c1s0XT9hcmd1bWVudHNbNF06MCxzPWFyZ3VtZW50cy5sZW5ndGg+NSYmdm9pZCAwIT09YXJndW1lbnRzWzVdP2FyZ3VtZW50c1s1XTpcIm1pZGRsZVwiO3RoaXMuX3Byb2Nlc3NMYWJlbCh0LGUsaSksdGhpcy5zaXplLmxlZnQ9by0uNSp0aGlzLnNpemUud2lkdGgsdGhpcy5zaXplLnRvcD1uLS41KnRoaXMuc2l6ZS5oZWlnaHQsdGhpcy5zaXplLnlMaW5lPW4rLjUqKDEtdGhpcy5saW5lQ291bnQpKnRoaXMuZm9udE9wdGlvbnMuc2l6ZSxcImhhbmdpbmdcIj09PXMmJih0aGlzLnNpemUudG9wKz0uNSp0aGlzLmZvbnRPcHRpb25zLnNpemUsdGhpcy5zaXplLnRvcCs9NCx0aGlzLnNpemUueUxpbmUrPTQpfX0se2tleTpcImdldEZvcm1hdHRpbmdWYWx1ZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1mdW5jdGlvbih0LGUsaSl7cmV0dXJuXCJub3JtYWxcIj09PWU/XCJtb2RcIj09PWk/XCJcIjp0W2ldOnZvaWQgMCE9PXRbZV1baV0/dFtlXVtpXTp0W2ldfSxzPXtjb2xvcjpuKHRoaXMuZm9udE9wdGlvbnMsbyxcImNvbG9yXCIpLHNpemU6bih0aGlzLmZvbnRPcHRpb25zLG8sXCJzaXplXCIpLGZhY2U6bih0aGlzLmZvbnRPcHRpb25zLG8sXCJmYWNlXCIpLG1vZDpuKHRoaXMuZm9udE9wdGlvbnMsbyxcIm1vZFwiKSx2YWRqdXN0Om4odGhpcy5mb250T3B0aW9ucyxvLFwidmFkanVzdFwiKSxzdHJva2VXaWR0aDp0aGlzLmZvbnRPcHRpb25zLnN0cm9rZVdpZHRoLHN0cm9rZUNvbG9yOnRoaXMuZm9udE9wdGlvbnMuc3Ryb2tlQ29sb3J9OyhlfHxpKSYmKFwibm9ybWFsXCI9PT1vJiYhMD09PXRoaXMuZm9udE9wdGlvbnMuY2hvb3NlciYmdGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbEhpZ2hsaWdodEJvbGQ/cy5tb2Q9XCJib2xkXCI6XCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5mb250T3B0aW9ucy5jaG9vc2VyJiZ0aGlzLmZvbnRPcHRpb25zLmNob29zZXIocyx0aGlzLmVsZW1lbnRPcHRpb25zLmlkLGUsaSkpO3ZhciByPVwiXCI7cmV0dXJuIHZvaWQgMCE9PXMubW9kJiZcIlwiIT09cy5tb2QmJihyKz1zLm1vZCtcIiBcIikscis9cy5zaXpl
21167K1wicHggXCIrcy5mYWNlLHQuZm9udD1yLnJlcGxhY2UoL1wiL2csXCJcIikscy5mb250PXQuZm9udCxzLmhlaWdodD1zLnNpemUsc319LHtrZXk6XCJkaWZmZXJlbnRTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQhPT10aGlzLnNlbGVjdGVkU3RhdGV8fGUhPT10aGlzLmhvdmVyU3RhdGV9fSx7a2V5OlwiX3Byb2Nlc3NMYWJlbFRleHRcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtyZXR1cm4gbmV3IGYodCx0aGlzLGUsaSkucHJvY2VzcyhvKX19LHtrZXk6XCJfcHJvY2Vzc0xhYmVsXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe2lmKCExIT09dGhpcy5sYWJlbERpcnR5fHx0aGlzLmRpZmZlcmVudFN0YXRlKGUsaSkpe3ZhciBvPXRoaXMuX3Byb2Nlc3NMYWJlbFRleHQodCxlLGksdGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbCk7dGhpcy5mb250T3B0aW9ucy5taW5XZHQ+MCYmby53aWR0aDx0aGlzLmZvbnRPcHRpb25zLm1pbldkdCYmKG8ud2lkdGg9dGhpcy5mb250T3B0aW9ucy5taW5XZHQpLHRoaXMuc2l6ZS5sYWJlbEhlaWdodD1vLmhlaWdodCx0aGlzLmZvbnRPcHRpb25zLm1pbkhndD4wJiZvLmhlaWdodDx0aGlzLmZvbnRPcHRpb25zLm1pbkhndCYmKG8uaGVpZ2h0PXRoaXMuZm9udE9wdGlvbnMubWluSGd0KSx0aGlzLmxpbmVzPW8ubGluZXMsdGhpcy5saW5lQ291bnQ9by5saW5lcy5sZW5ndGgsdGhpcy5zaXplLndpZHRoPW8ud2lkdGgsdGhpcy5zaXplLmhlaWdodD1vLmhlaWdodCx0aGlzLnNlbGVjdGVkU3RhdGU9ZSx0aGlzLmhvdmVyU3RhdGU9aSx0aGlzLmxhYmVsRGlydHk9ITF9fX0se2tleTpcInZpc2libGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiAwIT09dGhpcy5zaXplLndpZHRoJiYwIT09dGhpcy5zaXplLmhlaWdodCYmdm9pZCAwIT09dGhpcy5lbGVtZW50T3B0aW9ucy5sYWJlbCYmISh0aGlzLmZvbnRPcHRpb25zLnNpemUqdGhpcy5ib2R5LnZpZXcuc2NhbGU8dGhpcy5lbGVtZW50T3B0aW9ucy5zY2FsaW5nLmxhYmVsLmRyYXdUaHJlc2hvbGQtMSl9fV0sW3trZXk6XCJwYXJzZUZvbnRTdHJpbmdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCFlfHxcInN0cmluZ1wiIT10eXBlb2YgZSlyZXR1cm4hMTt2YXIgaT1lLnNwbGl0KFwiIFwiKTtyZXR1cm4gdC5zaXplPWlbMF0ucmVwbGFjZShcInB4XCIsXCJcIiksdC5mYWNlPWlbMV0sdC5jb2xvcj1pWzJdLCEwfX1dKSx0fSgpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzMCkscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoMiksdT1pKDExOSkuZGVmYXVsdCxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1pLHRoaXMubGFiZWxNb2R1bGU9byx0aGlzLm9wdGlvbnM9e30sdGhpcy5zZXRPcHRpb25zKGUpLHRoaXMuY29sb3JEaXJ0eT0hMCx0aGlzLmNvbG9yPXt9LHRoaXMuc2VsZWN0aW9uV2lkdGg9Mix0aGlzLmhvdmVyV2lkdGg9MS41LHRoaXMuZnJvbVBvaW50PXRoaXMuZnJvbSx0aGlzLnRvUG9pbnQ9dGhpcy50b31yZXR1cm4oMCxkLmRlZmF1bHQpKHQsW3trZXk6XCJjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dfX0se2tleTpcImNsZWFudXBcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiExfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHRoaXMuaWQ9dGhpcy5vcHRpb25zLmlkfX0se2tleTpcImRyYXdMaW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0LnN0cm9rZVN0eWxlPXRoaXMuZ2V0Q29sb3IodCxlLGksbyksdC5saW5lV2lkdGg9ZS53aWR0aCwhMSE9PWUuZGFzaGVzP3RoaXMuX2RyYXdEYXNoZWRMaW5lKHQsZSxuKTp0aGlzLl9kcmF3TGluZSh0LGUsbil9fSx7a2V5OlwiX2RyYXdMaW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXtpZih0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUsaSxvLG4pO2Vsc2V7dmFyIHI9dGhpcy5fZ2V0Q2lyY2xlRGF0YSh0KSxhPSgwLHMuZGVmYXVsdCkociwzKSxoPWFbMF0sZD1hWzFdLGw9YVsyXTt0aGlzLl9jaXJjbGUodCxlLGgsZCxsKX19fSx7a2V5OlwiX2RyYXdEYXNoZWRMaW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt0LmxpbmVDYXA9XCJyb3VuZFwiO3ZhciByPVs1LDVdO2lmKCEwPT09QXJyYXkuaXNBcnJheShlLmRhc2hlcykmJihyPWUuZGFzaGVzKSx2b2lkIDAhPT10LnNldExpbmVEYXNoKXtpZih0LnNhdmUoKSx0LnNldExpbmVEYXNoKHIpLHQubGluZURhc2hPZmZzZXQ9MCx0aGlzLmZyb20hPXRoaXMudG8pdGhpcy5fbGluZSh0LGUsaSk7ZWxzZXt2YXIgYT10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLGg9KDAscy5kZWZh
21167dWx0KShhLDMpLGQ9aFswXSxsPWhbMV0sdT1oWzJdO3RoaXMuX2NpcmNsZSh0LGUsZCxsLHUpfXQuc2V0TGluZURhc2goWzBdKSx0LmxpbmVEYXNoT2Zmc2V0PTAsdC5yZXN0b3JlKCl9ZWxzZXtpZih0aGlzLmZyb20hPXRoaXMudG8pdC5kYXNoZWRMaW5lKHRoaXMuZnJvbS54LHRoaXMuZnJvbS55LHRoaXMudG8ueCx0aGlzLnRvLnkscik7ZWxzZXt2YXIgYz10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLHA9KDAscy5kZWZhdWx0KShjLDMpLGY9cFswXSxtPXBbMV0sdj1wWzJdO3RoaXMuX2NpcmNsZSh0LGUsZixtLHYpfXRoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19fSx7a2V5OlwiZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3JldHVybiB0aGlzLmZyb20hPXRoaXMudG8/dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uKHQsZSxpKTp0aGlzLl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGUodCxlLGkpfX0se2tleTpcImZpbmRCb3JkZXJQb3NpdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT17fSxpPXt9O2lmKHRoaXMuZnJvbSE9dGhpcy50byllPXRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbih0aGlzLmZyb20sdCksaT10aGlzLl9maW5kQm9yZGVyUG9zaXRpb24odGhpcy50byx0KTtlbHNle3ZhciBvPXRoaXMuX2dldENpcmNsZURhdGEodCkuc2xpY2UoMCwyKSxuPSgwLHMuZGVmYXVsdCkobywyKSxyPW5bMF0sYT1uWzFdO2U9dGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQ2lyY2xlKHRoaXMuZnJvbSx0LHt4OnIseTphLGxvdzouMjUsaGlnaDouNixkaXJlY3Rpb246LTF9KSxpPXRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkNpcmNsZSh0aGlzLmZyb20sdCx7eDpyLHk6YSxsb3c6LjYsaGlnaDouOCxkaXJlY3Rpb246MX0pfXJldHVybntmcm9tOmUsdG86aX19fSx7a2V5OlwiX2dldENpcmNsZURhdGFcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT12b2lkIDAsaT12b2lkIDAsbz10aGlzLmZyb20sbj10aGlzLm9wdGlvbnMuc2VsZlJlZmVyZW5jZVNpemU7cmV0dXJuIHZvaWQgMCE9PXQmJnZvaWQgMD09PW8uc2hhcGUud2lkdGgmJm8uc2hhcGUucmVzaXplKHQpLG8uc2hhcGUud2lkdGg+by5zaGFwZS5oZWlnaHQ/KGU9by54Ky41Km8uc2hhcGUud2lkdGgsaT1vLnktbik6KGU9by54K24saT1vLnktLjUqby5zaGFwZS5oZWlnaHQpLFtlLGksbl19fSx7a2V5OlwiX3BvaW50T25DaXJjbGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXt2YXIgbj0yKm8qTWF0aC5QSTtyZXR1cm57eDp0K2kqTWF0aC5jb3MobikseTplLWkqTWF0aC5zaW4obil9fX0se2tleTpcIl9maW5kQm9yZGVyUG9zaXRpb25DaXJjbGVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7Zm9yKHZhciBvPWkueCxuPWkueSxzPWkubG93LHI9aS5oaWdoLGE9aS5kaXJlY3Rpb24saD0wLGQ9dGhpcy5vcHRpb25zLnNlbGZSZWZlcmVuY2VTaXplLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9dm9pZCAwLG09LjUqKHMrcik7czw9ciYmaDwxMCYmKG09LjUqKHMrciksbD10aGlzLl9wb2ludE9uQ2lyY2xlKG8sbixkLG0pLHU9TWF0aC5hdGFuMih0LnktbC55LHQueC1sLngpLGM9dC5kaXN0YW5jZVRvQm9yZGVyKGUsdSkscD1NYXRoLnNxcnQoTWF0aC5wb3cobC54LXQueCwyKStNYXRoLnBvdyhsLnktdC55LDIpKSxmPWMtcCwhKE1hdGguYWJzKGYpPC4wNSkpOylmPjA/YT4wP3M9bTpyPW06YT4wP3I9bTpzPW0saCsrO3JldHVybiBsLnQ9bSxsfX0se2tleTpcImdldExpbmVXaWR0aFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuITA9PT10P01hdGgubWF4KHRoaXMuc2VsZWN0aW9uV2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpOiEwPT09ZT9NYXRoLm1heCh0aGlzLmhvdmVyV2lkdGgsLjMvdGhpcy5ib2R5LnZpZXcuc2NhbGUpOk1hdGgubWF4KHRoaXMub3B0aW9ucy53aWR0aCwuMy90aGlzLmJvZHkudmlldy5zY2FsZSl9fSx7a2V5OlwiZ2V0Q29sb3JcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtpZighMSE9PWUuaW5oZXJpdHNDb2xvcil7aWYoXCJib3RoXCI9PT1lLmluaGVyaXRzQ29sb3ImJnRoaXMuZnJvbS5pZCE9PXRoaXMudG8uaWQpe3ZhciBuPXQuY3JlYXRlTGluZWFyR3JhZGllbnQodGhpcy5mcm9tLngsdGhpcy5mcm9tLnksdGhpcy50by54LHRoaXMudG8ueSkscz12b2lkIDAscj12b2lkIDA7cmV0dXJuIHM9dGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuaGlnaGxpZ2h0LmJvcmRlcixyPXRoaXMudG8ub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyLCExPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMT09PXRoaXMudG8uc2VsZWN0ZWQ/KHM9bC5vdmVycmlkZU9wYWNpdHkodGhpcy5mcm9tLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSkscj1sLm92ZXJyaWRlT3BhY2l0eSh0aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyLGUub3BhY2l0eSkpOiEwPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMT09PXRoaXMudG8uc2VsZWN0ZWQ/cj10aGlzLnRvLm9wdGlvbnMuY29sb3IuYm9yZGVyOiExPT09dGhpcy5mcm9tLnNlbGVjdGVkJiYhMD09PXRoaXMudG8uc2VsZWN0ZWQmJihzPXRoaXMuZnJvbS5vcHRpb25zLmNvbG9yLmJvcmRlciksbi5hZGRDb2xvclN0b3AoMCxzKSxuLmFkZENvbG9yU3RvcCgxLHIpLG59cmV0dXJuXCJ0b1wiPT09ZS5pbmhlcml0c0NvbG9yP2wub3ZlcnJpZGVPcGFjaXR5KHRoaXMudG8ub3B0aW9ucy5jb2xvci5ib3JkZXIsZS5vcGFjaXR5KTpsLm92ZXJyaWRlT3BhY2l0eSh0aGlzLmZyb20ub3B0aW9ucy5jb2xvci5ib3JkZXIsZS5vcGFjaXR5KX1yZXR1cm4gbC5vdmVycmlkZU9wYWNpdHkoZS5jb2xvcixlLm9wYWNpdHkpfX0se2tleTpcIl9jaXJjbGVcIixcbiAgICB2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3RoaXMuZW5hYmxlU2hhZG93KHQsZSksdC5iZWdpblBhdGgoKSx0LmFyYyhpLG8sbiwwLDIqTWF0aC5QSSwhMSksdC5zdHJva2UoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19LHtrZXk6XCJnZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixyLGEsaCl7dmFyIGQ9MDtpZih0aGlzLmZyb20hPXRoaXMudG8pZD10aGlzLl9nZXREaXN0YW5jZVRvRWRnZSh0LGUsaSxvLG4scixhKTtlbHNle3ZhciBsPXRoaXMuX2dldENpcmNsZURhdGEodm9pZCAwKSx1PSgwLHMuZGVmYXVsdCkobCwzKSxjPXVbMF0scD11WzFdLGY9dVsyXSxtPWMtbix2PXAtcjtkPU1hdGguYWJzKE1hdGguc3FydChtKm0rdip2KS1mKX1yZXR1cm4gZH19LHtrZXk6XCJfZ2V0RGlzdGFuY2VUb0xpbmVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHI9aS10LGE9by1lLGg9cipyK2EqYSxkPSgobi10KSpyKyhzLWUpKmEpL2g7ZD4xP2Q9MTpkPDAmJihkPTApO3ZhciBsPXQrZCpyLHU9ZStkKmEsYz1sLW4scD11LXM7cmV0dXJuIE1hdGguc3FydChjKmMrcCpwKX19LHtrZXk6XCJnZXRBcnJvd0RhdGFcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scil7dmFyIGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9ci53aWR0aDtpZihcImZyb21cIj09PWU/KGQ9dGhpcy5mcm9tLGw9dGhpcy50byx1PS4xLGM9ci5mcm9tQXJyb3dTY2FsZSxwPXIuZnJvbUFycm93VHlwZSk6XCJ0b1wiPT09ZT8oZD10aGlzLnRvLGw9dGhpcy5mcm9tLHU9LS4xLGM9ci50b0Fycm93U2NhbGUscD1yLnRvQXJyb3dUeXBlKTooZD10aGlzLnRvLGw9dGhpcy5mcm9tLGM9ci5taWRkbGVBcnJvd1NjYWxlLHA9ci5taWRkbGVBcnJvd1R5cGUpLGQhPWwpaWYoXCJtaWRkbGVcIiE9PWUpaWYoITA9PT10aGlzLm9wdGlvbnMuc21vb3RoLmVuYWJsZWQpe2g9dGhpcy5maW5kQm9yZGVyUG9zaXRpb24oZCx0LHt2aWE6aX0pO3ZhciBtPXRoaXMuZ2V0UG9pbnQoTWF0aC5tYXgoMCxNYXRoLm1pbigxLGgudCt1KSksaSk7YT1NYXRoLmF0YW4yKGgueS1tLnksaC54LW0ueCl9ZWxzZSBhPU1hdGguYXRhbjIoZC55LWwueSxkLngtbC54KSxoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKGQsdCk7ZWxzZSBhPU1hdGguYXRhbjIoZC55LWwueSxkLngtbC54KSxoPXRoaXMuZ2V0UG9pbnQoLjUsaSk7ZWxzZXt2YXIgdj10aGlzLl9nZXRDaXJjbGVEYXRhKHQpLGc9KDAscy5kZWZh
21167dWx0KSh2LDMpLHk9Z1swXSxiPWdbMV0sXz1nWzJdO1wiZnJvbVwiPT09ZT8oaD10aGlzLmZpbmRCb3JkZXJQb3NpdGlvbih0aGlzLmZyb20sdCx7eDp5LHk6Yixsb3c6LjI1LGhpZ2g6LjYsZGlyZWN0aW9uOi0xfSksYT0tMipoLnQqTWF0aC5QSSsxLjUqTWF0aC5QSSsuMSpNYXRoLlBJKTpcInRvXCI9PT1lPyhoPXRoaXMuZmluZEJvcmRlclBvc2l0aW9uKHRoaXMuZnJvbSx0LHt4OnkseTpiLGxvdzouNixoaWdoOjEsZGlyZWN0aW9uOjF9KSxhPS0yKmgudCpNYXRoLlBJKzEuNSpNYXRoLlBJLTEuMSpNYXRoLlBJKTooaD10aGlzLl9wb2ludE9uQ2lyY2xlKHksYixfLC4xNzUpLGE9My45MjY5OTA4MTY5ODcyNDE0KX1cIm1pZGRsZVwiPT09ZSYmYzwwJiYoZio9LTEpO3ZhciB3PTE1KmMrMypmO3JldHVybntwb2ludDpoLGNvcmU6e3g6aC54LS45KncqTWF0aC5jb3MoYSkseTpoLnktLjkqdypNYXRoLnNpbihhKX0sYW5nbGU6YSxsZW5ndGg6dyx0eXBlOnB9fX0se2tleTpcImRyYXdBcnJvd0hlYWRcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3Quc3Ryb2tlU3R5bGU9dGhpcy5nZXRDb2xvcih0LGUsaSxvKSx0LmZpbGxTdHlsZT10LnN0cm9rZVN0eWxlLHQubGluZVdpZHRoPWUud2lkdGgsdS5kcmF3KHQsbiksdGhpcy5lbmFibGVTaGFkb3codCxlKSx0LmZpbGwoKSx0aGlzLmRpc2FibGVTaGFkb3codCxlKX19LHtrZXk6XCJlbmFibGVTaGFkb3dcIix2YWx1ZTpmdW5jdGlvbih0LGUpeyEwPT09ZS5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPWUuc2hhZG93Q29sb3IsdC5zaGFkb3dCbHVyPWUuc2hhZG93U2l6ZSx0LnNoYWRvd09mZnNldFg9ZS5zaGFkb3dYLHQuc2hhZG93T2Zmc2V0WT1lLnNoYWRvd1kpfX0se2tleTpcImRpc2FibGVTaGFkb3dcIix2YWx1ZTpmdW5jdGlvbih0LGUpeyEwPT09ZS5zaGFkb3cmJih0LnNoYWRvd0NvbG9yPVwicmdiYSgwLDAsMCwwKVwiLHQuc2hhZG93Qmx1cj0wLHQuc2hhZG93T2Zmc2V0WD0wLHQuc2hhZG93T2Zmc2V0WT0wKX19XSksdH0oKTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSg0KSxhPW8ociksaD1pKDUpLGQ9byhoKSxsPWkoMCksdT1vKGwpLGM9aSgxKSxwPW8oYyksZj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJ0cmFuc2Zvcm1cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3QgaW5zdGFuY2VvZiBBcnJheXx8KHQ9W3RdKTtmb3IodmFyIGk9ZS5wb2ludC54LG89ZS5wb2ludC55LG49ZS5hbmdsZSxzPWUubGVuZ3RoLHI9MDtyPHQubGVuZ3RoOysrcil7dmFyIGE9dFtyXSxoPWEueCpNYXRoLmNvcyhuKS1hLnkqTWF0aC5zaW4obiksZD1hLngqTWF0aC5zaW4obikrYS55Kk1hdGguY29zKG4pO2EueD1pK3MqaCxhLnk9bytzKmR9fX0se2tleTpcImRyYXdQYXRoXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGVbMF0ueCxlWzBdLnkpO2Zvcih2YXIgaT0xO2k8ZS5sZW5ndGg7KytpKXQubGluZVRvKGVbaV0ueCxlW2ldLnkpO3QuY2xvc2VQYXRoKCl9fV0pLHR9KCksbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuKDAsdS5kZWZhdWx0KSh0aGlzLGUpLCgwLGEuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9cmV0dXJuKDAsZC5kZWZhdWx0KShlLHQpLCgwLHAuZGVmYXVsdCkoZSxudWxsLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W3t4OjAseTowfSx7eDotMSx5Oi4zfSx7eDotLjkseTowfSx7eDotMSx5Oi0uM31dO2YudHJhbnNmb3JtKGksZSksZi5kcmF3UGF0aCh0LGkpfX1dKSxlfShmKSx2PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLHUuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxwLmRlZmF1bHQpKHQsbnVsbCxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXt4Oi0uNCx5OjB9O2YudHJhbnNmb3JtKGksZSksdC5jaXJjbGUoaS54LGkueSwuNCplLmxlbmd0aCl9fV0pLHR9KCksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LG51bGwsW3trZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1be3g6MCx5Oi41fSx7eDowLHk6LS41fSx7eDotLjE1LHk6LS41fSx7eDotLjE1LHk6LjV9XTtmLnRyYW5zZm9ybShpLGUpLGYuZHJhd1BhdGgodCxpKX19XSksdH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeygwLHUuZGVmYXVsdCkodGhpcyx0KX1yZXR1cm4oMCxwLmRlZmF1bHQpKHQsbnVsbCxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpO3N3aXRjaC
21167hlLnR5cGUmJihpPWUudHlwZS50b0xvd2VyQ2FzZSgpKSxpKXtjYXNlXCJjaXJjbGVcIjp2LmRyYXcodCxlKTticmVhaztjYXNlXCJiYXJcIjpnLmRyYXcodCxlKTticmVhaztjYXNlXCJhcnJvd1wiOmRlZmF1bHQ6bS5kcmF3KHQsZSl9fX1dKSx0fSgpO2UuZGVmYXVsdD15fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLmJhcm5lc0h1dFRyZWUsdGhpcy5zZXRPcHRpb25zKG8pLHRoaXMucmFuZG9tU2VlZD01fXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dCx0aGlzLnRoZXRhSW52ZXJzZWQ9MS90aGlzLm9wdGlvbnMudGhldGEsdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yPTEtTWF0aC5tYXgoMCxNYXRoLm1pbigxLHRoaXMub3B0aW9ucy5hdm9pZE92ZXJsYXApKX19LHtrZXk6XCJzZWVkZWRSYW5kb21cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTFlNCpNYXRoLnNpbih0aGlzLnJhbmRvbVNlZWQrKyk7cmV0dXJuIHQtTWF0aC5mbG9vcih0KX19LHtrZXk6XCJzb2x2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoMCE9PXRoaXMub3B0aW9ucy5ncmF2aXRhdGlvbmFsQ29uc3RhbnQmJnRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aD4wKXt2YXIgdD12b2lkIDAsZT10aGlzLmJvZHkubm9kZXMsaT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyxvPWkubGVuZ3RoLG49dGhpcy5fZm9ybUJhcm5lc0h1dFRyZWUoZSxpKTt0aGlzLmJhcm5lc0h1dFRyZWU9bjtmb3IodmFyIHM9MDtzPG87cysrKXQ9ZVtpW3NdXSx0Lm9wdGlvbnMubWFzcz4wJiZ0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbnMobi5yb290LHQpfX19LHtrZXk6XCJfZ2V0Rm9yY2VDb250cmlidXRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbih0LmNoaWxkcmVuLk5XLGUpLHRoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9uKHQuY2hpbGRyZW4uTkUsZSksdGhpcy5fZ2V0Rm9yY2VDb250cmlidXRpb24odC5jaGlsZHJlbi5TVyxlKSx0aGlzLl9nZXRGb3JjZUNvbnRyaWJ1dGlvbih0LmNoaWxkcmVuLlNFLGUpfX0se2tleTpcIl9nZXRGb3JjZUNvbnRyaWJ1dGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodC5jaGlsZHJlbkNvdW50PjApe3ZhciBpPXZvaWQgMCxvPXZvaWQgMCxuPXZvaWQgMDtpPXQuY2VudGVyT2ZNYXNzLngtZS54LG89dC5jZW50ZXJPZk1hc3MueS1lLnksbj1NYXRoLnNxcnQoaSppK28qbyksbip0LmNhbGNTaXplPnRoaXMudGhldGFJbnZlcnNlZD90aGlzLl9jYWxjdWxhdGVGb3JjZXMobixpLG8sZSx0KTo0PT09dC5jaGlsZHJlbkNvdW50P3RoaXMuX2dldEZvcmNlQ29udHJpYnV0aW9ucyh0LGUpOnQuY2hpbGRyZW4uZGF0YS5pZCE9ZS5pZCYmdGhpcy5fY2FsY3VsYXRlRm9yY2VzKG4saSxvLGUsdCl9fX0se2tleTpcIl9jYWxjdWxhdGVGb3JjZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pezA9PT10JiYodD0uMSxlPXQpLHRoaXMub3ZlcmxhcEF2b2lkYW5jZUZhY3RvcjwxJiZvLnNoYXBlLnJhZGl1cyYmKHQ9TWF0aC5tYXgoLjErdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yKm8uc2hhcGUucmFkaXVzLHQtby5zaGFwZS5yYWRpdXMpKTt2YXIgcz10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50Km4ubWFzcypvLm9wdGlvbnMubWFzcy9NYXRoLnBvdyh0LDMpLHI9ZSpzLGE9aSpzO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW28uaWRdLngrPXIsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbby5pZF0ueSs9YX19LHtrZXk6XCJfZm9ybUJhcm5lc0h1dFRyZWVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT12b2lkIDAsbz1lLmxlbmd0aCxuPXRbZVswXV0ueCxzPXRbZVswXV0ueSxyPXRbZVswXV0ueCxhPXRbZVswXV0ueSxoPTE7aDxvO2grKyl7dmFyIGQ9dFtlW2hdXSxsPWQueCx1PWQueTtkLm9wdGlvbnMubWFzcz4wJiYobDxuJiYobj1sKSxsPnImJihyPWwpLHU8cyYmKHM9dSksdT5hJiYoYT11KSl9dmFyIGM9TWF0aC5hYnMoci1uKS1NYXRoLmFicyhhLXMpO2M+MD8ocy09LjUqYyxhKz0uNSpjKToobis9LjUqYyxyLT0uNSpjKTt2YXIgcD1NYXRoLm1heCgxZS01LE1hdGguYWJzKHItbikpLGY9LjUqcCxtPS41KihuK3IpLHY9LjUqKHMrYSksZz17cm9vdDp7Y2VudGVyT2ZNYXNzOnt4OjAseTowfSxtYXNzOjAscmFuZ2U6e21pblg6bS1mLG1heFg6bStmLG1pblk6di1mLG1heFk6ditmfSxzaXplOnAsY2FsY1NpemU6MS9wLGNoaWxkcmVuOntkYXRhOm51bGx9LG1heFdpZHRoOjAsbGV2ZWw6MCxjaGlsZHJlbkNvdW50OjR9fTt0aGlzLl9zcGxpdEJyYW5jaChnLnJvb3QpO2Zvcih2YXIgeT0wO3k8bzt5KyspaT10W2VbeV1dLGkub3B0aW9ucy5tYXNzPjAmJnRoaXMuX3BsYWNlSW5UcmVlKGcucm9vdCxpKTtyZXR1cm4gZ319LHtrZXk6XCJfdXBkYXRlQnJhbmNoTWFzc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dC5jZW50ZXJPZk1hc3Msbz10Lm1hc3MrZS5vcHRpb25zLm1hc3Msbj0xL287aS54PWkueCp0Lm1hc3MrZS54KmUub3B0aW9ucy5tYXNzLGkueCo9bixpLnk9aS55KnQubWFzcytlLnkqZS5vcHRpb25zLm1hc3MsaS55Kj1uLHQubWFzcz1vO3ZhciBzPU1hdGgubWF4KE1hdGgubWF4KGUuaGVpZ2h0LGUucmFkaXVzKSxlLndpZHRoKTt0Lm1heFdpZHRoPXQubWF4V2lkdGg8cz9zOnQubWF4V2lkdGh9fSx7a2V5OlwiX3BsYWNlSW5UcmVlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpezE9PWkmJnZvaWQgMCE9PWl8fHRoaXMuX3VwZGF0ZUJyYW5jaE1hc3ModCxlKTt2YXIgbz10LmNoaWxkcmVuLk5XLnJhbmdlLG49dm9pZCAwO249by5tYXhYPmUueD9vLm1heFk+ZS55P1wiTldcIjpcIlNXXCI6by5tY
21167XhZPmUueT9cIk5FXCI6XCJTRVwiLHRoaXMuX3BsYWNlSW5SZWdpb24odCxlLG4pfX0se2tleTpcIl9wbGFjZUluUmVnaW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQuY2hpbGRyZW5baV07c3dpdGNoKG8uY2hpbGRyZW5Db3VudCl7Y2FzZSAwOm8uY2hpbGRyZW4uZGF0YT1lLG8uY2hpbGRyZW5Db3VudD0xLHRoaXMuX3VwZGF0ZUJyYW5jaE1hc3MobyxlKTticmVhaztjYXNlIDE6by5jaGlsZHJlbi5kYXRhLng9PT1lLngmJm8uY2hpbGRyZW4uZGF0YS55PT09ZS55PyhlLngrPXRoaXMuc2VlZGVkUmFuZG9tKCksZS55Kz10aGlzLnNlZWRlZFJhbmRvbSgpKToodGhpcy5fc3BsaXRCcmFuY2gobyksdGhpcy5fcGxhY2VJblRyZWUobyxlKSk7YnJlYWs7Y2FzZSA0OnRoaXMuX3BsYWNlSW5UcmVlKG8sZSl9fX0se2tleTpcIl9zcGxpdEJyYW5jaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPW51bGw7MT09PXQuY2hpbGRyZW5Db3VudCYmKGU9dC5jaGlsZHJlbi5kYXRhLHQubWFzcz0wLHQuY2VudGVyT2ZNYXNzLng9MCx0LmNlbnRlck9mTWFzcy55PTApLHQuY2hpbGRyZW5Db3VudD00LHQuY2hpbGRyZW4uZGF0YT1udWxsLHRoaXMuX2luc2VydFJlZ2lvbih0LFwiTldcIiksdGhpcy5faW5zZXJ0UmVnaW9uKHQsXCJORVwiKSx0aGlzLl9pbnNlcnRSZWdpb24odCxcIlNXXCIpLHRoaXMuX2luc2VydFJlZ2lvbih0LFwiU0VcIiksbnVsbCE9ZSYmdGhpcy5fcGxhY2VJblRyZWUodCxlKX19LHtrZXk6XCJfaW5zZXJ0UmVnaW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT12b2lkIDAsbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj0uNSp0LnNpemU7c3dpdGNoKGUpe2Nhc2VcIk5XXCI6aT10LnJhbmdlLm1pblgsbz10LnJhbmdlLm1pblgrcixuPXQucmFuZ2UubWluWSxzPXQucmFuZ2UubWluWStyO2JyZWFrO2Nhc2VcIk5FXCI6aT10LnJhbmdlLm1pblgrcixvPXQucmFuZ2UubWF4WCxuPXQucmFuZ2UubWluWSxzPXQucmFuZ2UubWluWStyO2JyZWFrO2Nhc2VcIlNXXCI6aT10LnJhbmdlLm1pblgsbz10LnJhbmdlLm1pblgrcixuPXQucmFuZ2UubWluWStyLHM9dC5yYW5nZS5tYXhZO2JyZWFrO2Nhc2VcIlNFXCI6aT10LnJhbmdlLm1pblgrcixvPXQucmFuZ2UubWF4WCxuPXQucmFuZ2UubWluWStyLHM9dC5yYW5nZS5tYXhZfXQuY2hpbGRyZW5bZV09e2NlbnRlck9mTWFzczp7eDowLHk6MH0sbWFzczowLHJhbmdlOnttaW5YOmksbWF4WDpvLG1pblk6bixtYXhZOnN9LHNpemU6LjUqdC5zaXplLGNhbGNTaXplOjIqdC5jYWxjU2l6ZSxjaGlsZHJlbjp7ZGF0YTpudWxsfSxtYXhXaWR0aDowLGxldmVsOnQubGV2ZWwrMSxjaGlsZHJlbkNvdW50OjB9fX0se2tleTpcIl9kZWJ1Z1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09dGhpcy5iYXJuZXNIdXRUcmVlJiYodC5saW5lV2lkdGg9MSx0aGlzLl9kcmF3QnJhbmNoKHRoaXMuYmFybmVzSHV0VHJlZS5yb290LHQsZSkpfX0se2tleTpcIl9kcmF3QnJhbmNoXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZvaWQgMD09PWkmJihpPVwiI0ZGMDAwMFwiKSw0PT09dC5jaGlsZHJlbkNvdW50JiYodGhpcy5fZHJhd0JyYW5jaCh0LmNoaWxkcmVuLk5XLGUpLHRoaXMuX2RyYXdCcmFuY2godC5jaGlsZHJlbi5ORSxlKSx0aGlzLl9kcmF3QnJhbmNoKHQuY2hpbGRyZW4uU0UsZSksdGhpcy5fZHJhd0JyYW5jaCh0LmNoaWxkcmVuLlNXLGUpKSxlLnN0cm9rZVN0eWxlPWksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5taW5ZKSxlLmxpbmVUbyh0LnJhbmdlLm1heFgsdC5yYW5nZS5taW5ZKSxlLnN0cm9rZSgpLGUuYmVnaW5QYXRoKCksZS5tb3ZlVG8odC5yYW5nZS5tYXhYLHQucmFuZ2UubWluWSksZS5saW5lVG8odC5yYW5nZS5tYXhYLHQucmFuZ2UubWF4WSksZS5zdHJva2UoKSxlLmJlZ2luUGF0aCgpLGUubW92ZVRvKHQucmFuZ2UubWF4WCx0LnJhbmdlLm1heFkpLGUubGluZVRvKHQucmFuZ2UubWluWCx0LnJhbmdlLm1heFkpLGUuc3Ryb2tlKCksZS5iZWdpblBhdGgoKSxlLm1vdmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5tYXhZKSxlLmxpbmVUbyh0LnJhbmdlLm1pblgsdC5yYW5nZS5taW5ZKSxlLnN0cm9rZSgpfX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9dm9pZCAwLG89dm9pZCAwLG49dGhpcy5ib2R5Lm5vZGVzLHM9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMscj10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyxhPTA7YTxzLmxlbmd0aDthKyspe289bltzW2FdXSx0PS1vLngsZT0tby55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpLHRoaXMuX2NhbGN1bGF0ZUZvcmNlcyhpLHQsZSxyLG8pfX19LHtrZXk6XCJfY2FsY3VsYXRlRm9yY2VzXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz0wPT09dD8wOnRoaXMub3B0aW9ucy5jZW50cmFsR3Jhdml0eS90O29bbi5pZF0ueD1lKnMsb1tuLmlkXS55PWkqc319XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBvPVwic3RyaW5nXCIsbj1cImJvb2xlYW5cIixzPVwibnVtYmVyXCIscj1cIm9iamVjdFwiLGE9W1wiYXJyb3dcIixcImNpcmNsZVwiLFwiYmFyXCJdLGg9e2NvbmZpZ3VyZTp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxmaWx0ZXI6e2Jvb2xlYW46bixzdHJpbmc6byxhcnJheTpcImFycmF5XCIsZnVuY3Rpb246XCJmdW5jdGlvblwifSxjb250YWluZXI6e2RvbTpcImRvbVwifSxzaG93QnV0dG9uOntib29sZWFuOm59LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm4sc3RyaW5nOm8sYXJyYXk6XCJhcnJheVwiLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOntib29sZWFuOm59LHNjYWxlRmFjdG9yOntudW1iZXI6c30sdHlwZTp7c3RyaW5nOmF9LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxtaWRkbGU6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sc2NhbGVGYWN0b3I6e251bWJlcjpzfSx0eXBlOntzdHJpbmc6YX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGZyb206e2VuYWJsZWQ6e2Jvb2xlYW46bn0sc2NhbGVGYWN0b3I6e251bWJlcjpzfSx0eXBlOntzdHJpbmc6YX0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LF9fdHlwZV9fOntzdHJpbmc6W1wiZnJvbVwiLFwidG9cIixcIm1pZGRsZVwiXSxvYmplY3Q6cn19LGFycm93U3RyaWtldGhyb3VnaDp7Ym9vbGVhbjpufSxjaG9zZW46e2xhYmVsOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxlZGdlOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sY29sb3I6e2NvbG9yOntzdHJpbmc6b30saGlnaGxpZ2h0OntzdHJpbmc6b30saG92ZXI6e3N0cmluZzpvfSxpbmhlcml0OntzdHJpbmc6W1wiZnJvbVwiLFwidG9cIixcImJvdGhcIl0sYm9vbGVhbjpufSxvcGFjaXR5OntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sZGFzaGVzOntib29sZWFuOm4sYXJyYXk6XCJhcnJheVwifSxmb250Ontjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sYmFja2dyb3VuZDp7c3RyaW5nOm99LHN0cm9rZVdpZHRoOntudW1iZXI6c30sc3Ryb2tlQ29sb3I6e3N0cmluZzpvfSxhbGlnbjp7c3RyaW5nOltcImhvcml6b250YWxcIixcInRvcFwiLFwibWlkZGxlXCIsXCJib3R0b21cIl19LHZhZGp1c3Q6e251bWJlcjpzfSxtdWx0aTp7Ym9vbGVhbjpuLHN0cmluZzpvfSxib2xkOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGJvbGRpdGFsOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGl0YWw6e2NvbG9yOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGZhY2U6e3N0cmluZzpvfSxtb2Q6e3N0cmluZzpvfSx2YWRqdXN0OntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sbW9ubzp7Y29sb3I6e3N0cmluZzpvfSxzaXplOntudW1iZXI6c30sZmFjZTp7c3RyaW5nOm99LG1vZDp7c3RyaW5nOm99LHZhZGp1c3Q6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxoaWRkZW46e2Jvb2xlYW46bn0saG92ZXJXaWR0aDp7ZnVuY3Rpb246XCJmdW5jdGlvblwiLG51bWJlcjpzfSxsYWJlbDp7c3RyaW5nOm8sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGxhYmVsSGlnaGxpZ2h0Qm9sZDp7Ym9vbGVhbjpufSxsZW5ndGg6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxwaHlzaWNzOntib29sZWFuOm59LHNjYWxpbmc6e21pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LGxhYmVsOntlbmFibGVkOntib29sZWFuOm59LG1pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LG1heFZpc2libGU6e251bWJlcjpzfSxkcmF3VGhyZXNob2xkOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxzZWxlY3Rpb25XaWR0aDp7ZnVuY3Rpb246XCJmdW5jdGlvblwiLG51bWJlcjpzfSxzZWxmUmVmZXJlbmNlU2l6ZTp7bnVtYmVyOnN9LHNoYWRvdzp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSx4OntudW1iZXI6c30seTp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxzbW9vdGg6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sdHlwZTp7c3RyaW5nOltcImR5bmFtaWNcIixcImNvbnRpbnVvdXNcIixcImRpc2NyZXRlXCIsXCJkaWFnb25hbENyb3NzXCIsXCJzdHJhaWdodENyb3NzXCIsXCJob3Jpem9udGFsXCIsXCJ2ZXJ0aWNhbFwiLFwiY3VydmVkQ1dcIixcImN1cnZlZENDV1wiLFwiY3ViaWNCZXppZXJcIl19LHJvdW5kbmVzczp7bnVtYmVyOnN9LGZvcmNlRGlyZWN0aW9uOntzdHJpbmc6W1wiaG9yaXpvbn
21167RhbFwiLFwidmVydGljYWxcIixcIm5vbmVcIl0sYm9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sdGl0bGU6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx3aWR0aDp7bnVtYmVyOnN9LHdpZHRoQ29uc3RyYWludDp7bWF4aW11bTp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm4sbnVtYmVyOnN9fSx2YWx1ZTp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LF9fdHlwZV9fOntvYmplY3Q6cn19LGdyb3Vwczp7dXNlRGVmYXVsdEdyb3Vwczp7Ym9vbGVhbjpufSxfX2FueV9fOlwiZ2V0IGZyb20gbm9kZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVsb3dcIixfX3R5cGVfXzp7b2JqZWN0OnJ9fSxpbnRlcmFjdGlvbjp7ZHJhZ05vZGVzOntib29sZWFuOm59LGRyYWdWaWV3Ontib29sZWFuOm59LGhpZGVFZGdlc09uRHJhZzp7Ym9vbGVhbjpufSxoaWRlTm9kZXNPbkRyYWc6e2Jvb2xlYW46bn0saG92ZXI6e2Jvb2xlYW46bn0sa2V5Ym9hcmQ6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sc3BlZWQ6e3g6e251bWJlcjpzfSx5OntudW1iZXI6c30sem9vbTp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cn19LGJpbmRUb1dpbmRvdzp7Ym9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sbXVsdGlzZWxlY3Q6e2Jvb2xlYW46bn0sbmF2aWdhdGlvbkJ1dHRvbnM6e2Jvb2xlYW46bn0sc2VsZWN0YWJsZTp7Ym9vbGVhbjpufSxzZWxlY3RDb25uZWN0ZWRFZGdlczp7Ym9vbGVhbjpufSxob3ZlckNvbm5lY3RlZEVkZ2VzOntib29sZWFuOm59LHRvb2x0aXBEZWxheTp7bnVtYmVyOnN9LHpvb21WaWV3Ontib29sZWFuOm59LF9fdHlwZV9fOntvYmplY3Q6cn19LGxheW91dDp7cmFuZG9tU2VlZDp7dW5kZWZpbmVkOlwidW5kZWZpbmVkXCIsbnVtYmVyOnN9LGltcHJvdmVkTGF5b3V0Ontib29sZWFuOm59LGhpZXJhcmNoaWNhbDp7ZW5hYmxlZDp7Ym9vbGVhbjpufSxsZXZlbFNlcGFyYXRpb246e251bWJlcjpzfSxub2RlU3BhY2luZzp7bnVtYmVyOnN9LHRyZWVTcGFjaW5nOntudW1iZXI6c30sYmxvY2tTaGlmdGluZzp7Ym9vbGVhbjpufSxlZGdlTWluaW1pemF0aW9uOntib29sZWFuOm59LHBhcmVudENlbnRyYWxpemF0aW9uOntib29sZWFuOm59LGRpcmVjdGlvbjp7c3RyaW5nOltcIlVEXCIsXCJEVVwiLFwiTFJcIixcIlJMXCJdfSxzb3J0TWV0aG9kOntzdHJpbmc6W1wiaHVic2l6ZVwiLFwiZGlyZWN0ZWRcIl19LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxtYW5pcHVsYXRpb246e2VuYWJsZWQ6e2Jvb2xlYW46bn0saW5pdGlhbGx5QWN0aXZlOntib29sZWFuOm59LGFkZE5vZGU6e2Jvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGFkZEVkZ2U6e2Jvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGVkaXROb2RlOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGVkaXRFZGdlOntlZGl0V2l0aG91dERyYWc6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bixmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9fSxkZWxldGVOb2RlOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxkZWxldGVFZGdlOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSxjb250cm9sTm9kZVN0eWxlOlwiZ2V0IGZyb20gbm9kZXMsIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYmVsb3dcIixfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sbm9kZXM6e2JvcmRlcldpZHRoOntudW1iZXI6c30sYm9yZGVyV2lkdGhTZWxlY3RlZDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGJyb2tlbkltYWdlOntzdHJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sY2hvc2VuOntsYWJlbDp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sbm9kZTp7Ym9vbGVhbjpuLGZ1bmN0aW9uOlwiZnVuY3Rpb25cIn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGNvbG9yOntib3JkZXI6e3N0cmluZzpvfSxiYWNrZ3JvdW5kOntzdHJpbmc6b30saGlnaGxpZ2h0Ontib3JkZXI6e3N0cmluZzpvfSxiYWNrZ3JvdW5kOntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0saG92ZXI6e2JvcmRlcjp7c3RyaW5nOm99LGJhY2tncm91bmQ6e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxmaXhlZDp7eDp7Ym9vbGVhbjpufSx5Ontib29sZWFuOm59LF9fdHlwZV9fOntvYmplY3Q6cixib29sZWFuOm59fSxmb250OnthbGlnbjp7c3RyaW5nOm99LGNvbG9yOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGZhY2U6e3N0cmluZzpvfSxiYWNrZ3JvdW5kOntzdHJpbmc6b30sc3Ryb2tlV2lkdGg6e251bWJlcjpzfSxzdHJva2VDb2xvcjp7c3RyaW5nOm99LHZhZGp1c3Q6e251bWJlcjpzfSxtdWx0aTp7Ym9vbGVhbjpuLHN0cmluZzpvfSxib2xkOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGJvbGRpdGFsOntjb2xvcjp7c3RyaW5nOm99LHNpemU6e251bWJlcjpzfSxmYWNlOntzdHJpbmc6b30sbW9kOntzdHJpbmc6b30sdmFkanVzdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixzdHJpbmc6b319LGl0YWw6e2NvbG9yOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGZhY2U6e3N0cmluZzpvfSxtb2Q6e3N0cmluZzpvfSx2YWRqdXN0OntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sbW9ubzp7Y29sb3I6e3N0cmluZzpvfSxzaXplOntudW1iZXI6c30sZmFjZTp7c3RyaW5nOm99LG1vZDp7c3RyaW5nOm99LHZhZGp1c3Q6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxfX3R5cGVfXzp7b2JqZWN0OnIsc3RyaW5nOm99fSxncm91cDp7c3RyaW5nOm8sbnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGhlaWdodENvbnN0cmFpbnQ6e21pbmltdW06e251bWJlcjpzfSx2YWxpZ246e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpuLG51bWJlcjpzfX0saGlkZGVuOntib29sZWFuOm59LGljb246e2ZhY2U6e3N0cmluZzpvfSxjb2RlOntzdHJpbmc6b30sc2l6ZTp7bnVtYmVyOnN9LGNvbG9yOntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpyfX0saWQ6e3N0cmluZzpvLG51bWJlcjpzfSxpbWFnZTp7c2VsZWN0ZWQ6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx1bnNlbGVjdGVkOntzd
21167HJpbmc6byx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sX190eXBlX186e29iamVjdDpyLHN0cmluZzpvfX0sbGFiZWw6e3N0cmluZzpvLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxsYWJlbEhpZ2hsaWdodEJvbGQ6e2Jvb2xlYW46bn0sbGV2ZWw6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxtYXJnaW46e3RvcDp7bnVtYmVyOnN9LHJpZ2h0OntudW1iZXI6c30sYm90dG9tOntudW1iZXI6c30sbGVmdDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cixudW1iZXI6c319LG1hc3M6e251bWJlcjpzfSxwaHlzaWNzOntib29sZWFuOm59LHNjYWxpbmc6e21pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LGxhYmVsOntlbmFibGVkOntib29sZWFuOm59LG1pbjp7bnVtYmVyOnN9LG1heDp7bnVtYmVyOnN9LG1heFZpc2libGU6e251bWJlcjpzfSxkcmF3VGhyZXNob2xkOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjp7ZnVuY3Rpb246XCJmdW5jdGlvblwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxzaGFkb3c6e2VuYWJsZWQ6e2Jvb2xlYW46bn0sY29sb3I6e3N0cmluZzpvfSxzaXplOntudW1iZXI6c30seDp7bnVtYmVyOnN9LHk6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sc2hhcGU6e3N0cmluZzpbXCJlbGxpcHNlXCIsXCJjaXJjbGVcIixcImRhdGFiYXNlXCIsXCJib3hcIixcInRleHRcIixcImltYWdlXCIsXCJjaXJjdWxhckltYWdlXCIsXCJkaWFtb25kXCIsXCJkb3RcIixcInN0YXJcIixcInRyaWFuZ2xlXCIsXCJ0cmlhbmdsZURvd25cIixcInNxdWFyZVwiLFwiaWNvblwiLFwiaGV4YWdvblwiXX0sc2hhcGVQcm9wZXJ0aWVzOntib3JkZXJEYXNoZXM6e2Jvb2xlYW46bixhcnJheTpcImFycmF5XCJ9LGJvcmRlclJhZGl1czp7bnVtYmVyOnN9LGludGVycG9sYXRpb246e2Jvb2xlYW46bn0sdXNlSW1hZ2VTaXplOntib29sZWFuOm59LHVzZUJvcmRlcldpdGhJbWFnZTp7Ym9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxzaXplOntudW1iZXI6c30sdGl0bGU6e3N0cmluZzpvLGRvbTpcImRvbVwiLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx2YWx1ZTp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHdpZHRoQ29uc3RyYWludDp7bWluaW11bTp7bnVtYmVyOnN9LG1heGltdW06e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpuLG51bWJlcjpzfX0seDp7bnVtYmVyOnN9LHk6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxwaHlzaWNzOntlbmFibGVkOntib29sZWFuOm59LGJhcm5lc0h1dDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OntudW1iZXI6c30sY2VudHJhbEdyYXZpdHk6e251bWJlcjpzfSxzcHJpbmdMZW5ndGg6e251bWJlcjpzfSxzcHJpbmdDb25zdGFudDp7bnVtYmVyOnN9LGRhbXBpbmc6e251bWJlcjpzfSxhdm9pZE92ZXJsYXA6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxmb3JjZUF0bGFzMkJhc2VkOntncmF2aXRhdGlvbmFsQ29uc3RhbnQ6e251bWJlcjpzfSxjZW50cmFsR3Jhdml0eTp7bnVtYmVyOnN9LHNwcmluZ0xlbmd0aDp7bnVtYmVyOnN9LHNwcmluZ0NvbnN0YW50OntudW1iZXI6c30sZGFtcGluZzp7bnVtYmVyOnN9LGF2b2lkT3ZlcmxhcDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6cn19LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6e251bWJlcjpzfSxzcHJpbmdMZW5ndGg6e251bWJlcjpzfSxzcHJpbmdDb25zdGFudDp7bnVtYmVyOnN9LG5vZGVEaXN0YW5jZTp7bnVtYmVyOnN9LGRhbXBpbmc6e251bWJlcjpzfSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxoaWVyYXJjaGljYWxSZXB1bHNpb246e2NlbnRyYWxHcmF2aXR5OntudW1iZXI6c30sc3ByaW5nTGVuZ3RoOntudW1iZXI6c30sc3ByaW5nQ29uc3RhbnQ6e251bWJlcjpzfSxub2RlRGlzdGFuY2U6e251bWJlcjpzfSxkYW1waW5nOntudW1iZXI6c30sX190eXBlX186e29iamVjdDpyfX0sbWF4VmVsb2NpdHk6e251bWJlcjpzfSxtaW5WZWxvY2l0eTp7bnVtYmVyOnN9LHNvbHZlcjp7c3RyaW5nOltcImJhcm5lc0h1dFwiLFwicmVwdWxzaW9uXCIsXCJoaWVyYXJjaGljYWxSZXB1bHNpb25cIixcImZvcmNlQXRsYXMyQmFzZWRcIl19LHN0YWJpbGl6YXRpb246e2VuYWJsZWQ6e2Jvb2xlYW46bn0saXRlcmF0aW9uczp7bnVtYmVyOnN9LHVwZGF0ZUludGVydmFsOntudW1iZXI6c30sb25seUR5bmFtaWNFZGdlczp7Ym9vbGVhbjpufSxmaXQ6e2Jvb2xlYW46bn0sX190eXBlX186e29iamVjdDpyLGJvb2xlYW46bn19LHRpbWVzdGVwOntudW1iZXI6c30sYWRhcHRpdmVUaW1lc3RlcDp7Ym9vbGVhbjpufSxfX3R5cGVfXzp7b2JqZWN0OnIsYm9vbGVhbjpufX0sYXV0b1Jlc2l6ZTp7Ym9vbGVhbjpufSxjbGlja1RvVXNlOntib29sZWFuOm59LGxvY2FsZTp7c3RyaW5nOm99LGxvY2FsZXM6e19fYW55X186e2FueTpcImFueVwifSxfX3R5cGVfXzp7b2JqZWN0OnJ9fSxoZWlnaHQ6e3N0cmluZzpvfSx3aWR0aDp7c3RyaW5nOm99LF9fdHlwZV9fOntvYmplY3Q6cn19O2guZ3JvdXBzLl9fYW55X189aC5ub2RlcyxoLm1hbmlwdWxhdGlvbi5jb250cm9sTm9kZVN0eWxlPWgubm9kZXM7dmFyIGQ9e25vZGVzOntib3JkZXJXaWR0aDpbMSwwLDEwLDFdLGJvcmRlcldpZHRoU2VsZWN0ZWQ6WzIsMCwxMCwxXSxjb2xvcjp7Ym9yZGVyOltcImNvbG9yXCIsXCIjMkI3Q0U5XCJdLGJhY2tncm91bmQ6W1wiY29sb3JcIixcIiM5N0MyRkNcIl0saGlnaGxpZ2h0Ontib3JkZXI6W1wiY29sb3JcIixcIiMyQjdDRTlcIl0sYmFja2dyb3VuZDpbXCJjb2xvclwiLFwiI0QyRTVGRlwiXX0saG92ZXI6e2JvcmRlcjpbXCJjb2xvclwiLFwiIzJCN0NFOVwiXSxiYWNrZ3JvdW5kOltcImNvbG9yXCIsXCIjRDJFNUZGXCJdfX0sZml4ZWQ6e3g6ITEseTohMX0sZm9udDp7Y29sb3I6W1wiY29sb3JcIixcIiMzNDM0MzRcIl0sc2l6ZTpbMTQsMCwxMDAsMV0sZmFjZTpbXCJhcmlhbFwiLFwidmVyZGFuYVwiLFwidGFob21hXCJdLGJhY2tncm91bmQ6W1wiY29sb3JcIixcIm5vbmVcIl0sc3Ryb2tlV2lkdGg6WzAsMCw1MCwxXSxzdHJva2VDb2xvcjpbXCJjb2xvclwiLFwiI2ZmZmZmZlwiXX0saGlkZGVuOiExLGxhYmVsSGlnaGxpZ2h0Qm9sZDohMCxwaHlzaWNzOiEwLHNjYWxpbmc6e21pbjpbMTAsMCwyMDAsMV0sbWF4OlszMCwwLDIwMCwxXSxsYWJlbDp7ZW5hYmxlZDohMSxtaW46WzE0LDAsMjAwLDFdLG1heDpbMzAsMCwyMDAsMV0sbWF4VmlzaWJsZTpbMzAsMCwyMDAsMV0sZHJhd1RocmVzaG9sZDpbNSwwLDIwLDFdfX0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOlwicmdiYSgwLDAsMCwwLjUpXCIsc2l6ZTpbMTAsMCwyMCwxXSx4Ols1LC0zMCwzMCwxXSx5Ols1LC0zMCwzMCwxXX0sc2hhcGU6W1wiZWxsaXBzZVwiLFwiYm94XCIsXCJjaXJjbGVcIixcImRhdGFiYXNlXCIsXCJkaWFtb25kXCIsXCJkb3RcIixcInNxdWFyZVwiLFwic3RhclwiLFwidG
21167V4dFwiLFwidHJpYW5nbGVcIixcInRyaWFuZ2xlRG93blwiLFwiaGV4YWdvblwiXSxzaGFwZVByb3BlcnRpZXM6e2JvcmRlckRhc2hlczohMSxib3JkZXJSYWRpdXM6WzYsMCwyMCwxXSxpbnRlcnBvbGF0aW9uOiEwLHVzZUltYWdlU2l6ZTohMX0sc2l6ZTpbMjUsMCwyMDAsMV19LGVkZ2VzOnthcnJvd3M6e3RvOntlbmFibGVkOiExLHNjYWxlRmFjdG9yOlsxLDAsMywuMDVdLHR5cGU6XCJhcnJvd1wifSxtaWRkbGU6e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6WzEsMCwzLC4wNV0sdHlwZTpcImFycm93XCJ9LGZyb206e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6WzEsMCwzLC4wNV0sdHlwZTpcImFycm93XCJ9fSxhcnJvd1N0cmlrZXRocm91Z2g6ITAsY29sb3I6e2NvbG9yOltcImNvbG9yXCIsXCIjODQ4NDg0XCJdLGhpZ2hsaWdodDpbXCJjb2xvclwiLFwiIzg0ODQ4NFwiXSxob3ZlcjpbXCJjb2xvclwiLFwiIzg0ODQ4NFwiXSxpbmhlcml0OltcImZyb21cIixcInRvXCIsXCJib3RoXCIsITAsITFdLG9wYWNpdHk6WzEsMCwxLC4wNV19LGRhc2hlczohMSxmb250Ontjb2xvcjpbXCJjb2xvclwiLFwiIzM0MzQzNFwiXSxzaXplOlsxNCwwLDEwMCwxXSxmYWNlOltcImFyaWFsXCIsXCJ2ZXJkYW5hXCIsXCJ0YWhvbWFcIl0sYmFja2dyb3VuZDpbXCJjb2xvclwiLFwibm9uZVwiXSxzdHJva2VXaWR0aDpbMiwwLDUwLDFdLHN0cm9rZUNvbG9yOltcImNvbG9yXCIsXCIjZmZmZmZmXCJdLGFsaWduOltcImhvcml6b250YWxcIixcInRvcFwiLFwibWlkZGxlXCIsXCJib3R0b21cIl19LGhpZGRlbjohMSxob3ZlcldpZHRoOlsxLjUsMCw1LC4xXSxsYWJlbEhpZ2hsaWdodEJvbGQ6ITAscGh5c2ljczohMCxzY2FsaW5nOnttaW46WzEsMCwxMDAsMV0sbWF4OlsxNSwwLDEwMCwxXSxsYWJlbDp7ZW5hYmxlZDohMCxtaW46WzE0LDAsMjAwLDFdLG1heDpbMzAsMCwyMDAsMV0sbWF4VmlzaWJsZTpbMzAsMCwyMDAsMV0sZHJhd1RocmVzaG9sZDpbNSwwLDIwLDFdfX0sc2VsZWN0aW9uV2lkdGg6WzEuNSwwLDUsLjFdLHNlbGZSZWZlcmVuY2VTaXplOlsyMCwwLDIwMCwxXSxzaGFkb3c6e2VuYWJsZWQ6ITEsY29sb3I6XCJyZ2JhKDAsMCwwLDAuNSlcIixzaXplOlsxMCwwLDIwLDFdLHg6WzUsLTMwLDMwLDFdLHk6WzUsLTMwLDMwLDFdfSxzbW9vdGg6e2VuYWJsZWQ6ITAsdHlwZTpbXCJkeW5hbWljXCIsXCJjb250aW51b3VzXCIsXCJkaXNjcmV0ZVwiLFwiZGlhZ29uYWxDcm9zc1wiLFwic3RyYWlnaHRDcm9zc1wiLFwiaG9yaXpvbnRhbFwiLFwidmVydGljYWxcIixcImN1cnZlZENXXCIsXCJjdXJ2ZWRDQ1dcIixcImN1YmljQmV6aWVyXCJdLGZvcmNlRGlyZWN0aW9uOltcImhvcml6b250YWxcIixcInZlcnRpY2FsXCIsXCJub25lXCJdLHJvdW5kbmVzczpbLjUsMCwxLC4wNV19LHdpZHRoOlsxLDAsMzAsMV19LGxheW91dDp7aGllcmFyY2hpY2FsOntlbmFibGVkOiExLGxldmVsU2VwYXJhdGlvbjpbMTUwLDIwLDUwMCw1XSxub2RlU3BhY2luZzpbMTAwLDIwLDUwMCw1XSx0cmVlU3BhY2luZzpbMjAwLDIwLDUwMCw1XSxibG9ja1NoaWZ0aW5nOiEwLGVkZ2VNaW5pbWl6YXRpb246ITAscGFyZW50Q2VudHJhbGl6YXRpb246ITAsZGlyZWN0aW9uOltcIlVEXCIsXCJEVVwiLFwiTFJcIixcIlJMXCJdLHNvcnRNZXRob2Q6W1wiaHVic2l6ZVwiLFwiZGlyZWN0ZWRcIl19fSxpbnRlcmFjdGlvbjp7ZHJhZ05vZGVzOiEwLGRyYWdWaWV3OiEwLGhpZGVFZGdlc09uRHJhZzohMSxoaWRlTm9kZXNPbkRyYWc6ITEsaG92ZXI6ITEsa2V5Ym9hcmQ6e2VuYWJsZWQ6ITEsc3BlZWQ6e3g6WzEwLDAsNDAsMV0seTpbMTAsMCw0MCwxXSx6b29tOlsuMDIsMCwuMSwuMDA1XX0sYmluZFRvV2luZG93OiEwfSxtdWx0aXNlbGVjdDohMSxuYXZpZ2F0aW9uQnV0dG9uczohMSxzZWxlY3RhYmxlOiEwLHNlbGVjdENvbm5lY3RlZEVkZ2VzOiEwLGhvdmVyQ29ubmVjdGVkRWRnZXM6ITAsdG9vbHRpcERlbGF5OlszMDAsMCwxZTMsMjVdLHpvb21WaWV3OiEwfSxtYW5pcHVsYXRpb246e2VuYWJsZWQ6ITEsaW5pdGlhbGx5QWN0aXZlOiExfSxwaHlzaWNzOntlbmFibGVkOiEwLGJhcm5lc0h1dDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OlstMmUzLC0zZTQsMCw1MF0sY2VudHJhbEdyYXZpdHk6Wy4zLDAsMTAsLjA1XSxzcHJpbmdMZW5ndGg6Wzk1LDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDQsMCwxLjIsLjAwNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdLGF2b2lkT3ZlcmxhcDpbMCwwLDEsLjAxXX0sZm9yY2VBdGxhczJCYXNlZDp7Z3Jhdml0YXRpb25hbENvbnN0YW50OlstNTAsLTUwMCwwLDFdLGNlbnRyYWxHcmF2aXR5OlsuMDEsMCwxLC4wMDVdLHNwcmluZ0xlbmd0aDpbOTUsMCw1MDAsNV0sc3ByaW5nQ29uc3RhbnQ6Wy4wOCwwLDEuMiwuMDA1XSxkYW1waW5nOlsuNCwwLDEsLjAxXSxhdm9pZE92ZXJsYXA6WzAsMCwxLC4wMV19LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6Wy4yLDAsMTAsLjA1XSxzcHJpbmdMZW5ndGg6WzIwMCwwLDUwMCw1XSxzcHJpbmdDb25zdGFudDpbLjA1LDAsMS4yLC4wMDVdLG5vZGVEaXN0YW5jZTpbMTAwLDAsNTAwLDVdLGRhbXBpbmc6Wy4wOSwwLDEsLjAxXX0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTpbLjIsMCwxMCwuMDVdLHNwcmluZ0xlbmd0aDpbMTAwLDAsNTAwLDVdLHNwcmluZ0NvbnN0YW50OlsuMDEsMCwxLjIsLjAwNV0sbm9kZURpc3RhbmNlOlsxMjAsMCw1MDAsNV0sZGFtcGluZzpbLjA5LDAsMSwuMDFdfSxtYXhWZWxvY2l0eTpbNTAsMCwxNTAsMV0sbWluVmVsb2NpdHk6Wy4xLC4wMSwuNSwuMDFdLHNvbHZlcjpbXCJiYXJuZXNIdXRcIixcImZvcmNlQXRsYXMyQmFzZWRcIixcInJlcHVsc2lvblwiLFwiaGllcmFyY2hpY2FsUmVwdWxzaW9uXCJdLHRpbWVzdGVwOlsuNSwuMDEsMSwuMDFdfX07ZS5hbGxPcHRpb25zPWgsZS5jb25maWd1cmVPcHRpb25zPWR9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDIpO28uZXh0ZW5kKGUsaSgxNTkpKSxvLmV4dGVuZChlLGkoMTc3KSksby5leHRlbmQoZSxpKDE4MSkpfSxmdW5jdGlvbih0LGUsaSl7aSg0OSksaSg2MCksdC5leHBvcnRzPWkoMTM2KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTI2KSxuPWkoMTI3KSxzPWkoMzEpLHI9aSgyNSk7dC5leHBvcnRzPWkoNzkpKEFycmF5LFwiQXJyYXlcIixmdW5jdGlvbih0LGUpe3RoaXMuX3Q9cih0KSx0aGlzLl9pPTAsdGhpcy5faz1lfSxmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3QsZT10aGlzLl9rLGk9dGhpcy5faSsrO3JldHVybiF0fHxpPj10Lmxlbmd0aD8odGhpcy5fdD12b2lkIDAsbigxKSk6XCJrZXlzXCI9PWU/bigwLGkpOlwidmFsdWVzXCI9PWU/bigwLHRbaV0pOm4oMCxbaSx0W2ldXSl9LFwidmFsdWVzXCIpLHMuQXJndW1lbnRzPXMuQXJyYXksbyhcImtleXNcIiksbyhcInZhbHVlc1wiKSxvKFwiZW50cmllc1wiKX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24oKXt9fSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybnt2YWx1ZTplLGRvbmU6ISF0fX19LGZ1bmN0aW9uKHQsZSl7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgVHlwZUVycm9yKHQrXCIgaXMgbm90IGEgZnVuY3Rpb24hXCIpO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNTQpLG49aSgzOSkscz1pKDU5KSxyPXt9O2koMjYpKHIsaSgxMykoXCJpdGVyYXRvclwiKSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSksdC5leHBvcnRzPWZ1bmN0aW9uKHQsZSxpKXt0LnByb3RvdHlwZT1vKHIse25leHQ6bigxLGkpfSkscy
21167h0LGUrXCIgSXRlcmF0b3JcIil9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgyMCksbj1pKDI3KSxzPWkoMzMpO3QuZXhwb3J0cz1pKDIxKT9PYmplY3QuZGVmaW5lUHJvcGVydGllczpmdW5jdGlvbih0LGUpe24odCk7Zm9yKHZhciBpLHI9cyhlKSxhPXIubGVuZ3RoLGg9MDthPmg7KW8uZih0LGk9cltoKytdLGVbaV0pO3JldHVybiB0fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjUpLG49aSgxMzIpLHM9aSgxMzMpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpLHIpe3ZhciBhLGg9byhlKSxkPW4oaC5sZW5ndGgpLGw9cyhyLGQpO2lmKHQmJmkhPWkpe2Zvcig7ZD5sOylpZigoYT1oW2wrK10pIT1hKXJldHVybiEwfWVsc2UgZm9yKDtkPmw7bCsrKWlmKCh0fHxsIGluIGgpJiZoW2xdPT09aSlyZXR1cm4gdHx8bHx8MDtyZXR1cm4hdCYmLTF9fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNTUpLG49TWF0aC5taW47dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3JldHVybiB0PjA/bihvKHQpLDkwMDcxOTkyNTQ3NDA5OTEpOjB9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg1NSksbj1NYXRoLm1heCxzPU1hdGgubWluO3QuZXhwb3J0cz1mdW5jdGlvbih0LGUpe3JldHVybiB0PW8odCksdDwwP24odCtlLDApOnModCxlKX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDE4KS5kb2N1bWVudDt0LmV4cG9ydHM9byYmby5kb2N1bWVudEVsZW1lbnR9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDU1KSxuPWkoNTEpO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oZSxpKXt2YXIgcyxyLGE9U3RyaW5nKG4oZSkpLGg9byhpKSxkPWEubGVuZ3RoO3JldHVybiBoPDB8fGg+PWQ/dD9cIlwiOnZvaWQgMDoocz1hLmNoYXJDb2RlQXQoaCksczw1NTI5Nnx8cz41NjMxOXx8aCsxPT09ZHx8KHI9YS5jaGFyQ29kZUF0KGgrMSkpPDU2MzIwfHxyPjU3MzQzP3Q/YS5jaGFyQXQoaCk6czp0P2Euc2xpY2UoaCxoKzIpOnItNTYzMjArKHMtNTUyOTY8PDEwKSs2NTUzNil9fX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjcpLG49aSgxMzcpO3QuZXhwb3J0cz1pKDcpLmdldEl0ZXJhdG9yPWZ1bmN0aW9uKHQpe3ZhciBlPW4odCk7aWYoXCJmdW5jdGlvblwiIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgaXRlcmFibGUhXCIpO3JldHVybiBvKGUuY2FsbCh0KSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg4Niksbj1pKDEzKShcIml0ZXJhdG9yXCIpLHM9aSgzMSk7dC5leHBvcnRzPWkoNykuZ2V0SXRlcmF0b3JNZXRob2Q9ZnVuY3Rpb24odCl7aWYodm9pZCAwIT10KXJldHVybiB0W25dfHx0W1wiQEBpdGVyYXRvclwiXXx8c1tvKHQpXX19LGZ1bmN0aW9uKHQsZSxpKXtpKDEzOSk7dmFyIG89aSg3KS5PYmplY3Q7dC5leHBvcnRzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG8uY3JlYXRlKHQsZSl9fSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSgxNyk7byhvLlMsXCJPYmplY3RcIix7Y3JlYXRlOmkoNTQpfSl9LGZ1bmN0aW9uKHQsZSxpKXtpKDE0MSksdC5leHBvcnRzPWkoNykuT2JqZWN0LmtleXN9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDQxKSxuPWkoMzMpO2koODcpKFwia2V5c1wiLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKG8odCkpfX0pfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTQzKSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koNjApLGkoNDkpLHQuZXhwb3J0cz1pKDYxKS5mKFwiaXRlcmF0b3JcIil9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxNDUpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxNDYpLGkoMTUxKSxpKDE1MiksaSgxNTMpLHQuZXhwb3J0cz1pKDcpLlN5bWJvbH0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTgpLG49aSgyMikscz1pKDIxKSxyPWkoMTcpLGE9aSg4MyksaD1pKDE0NykuS0VZLGQ9aSgyOCksbD1pKDU3KSx1PWkoNTkpLGM9aSg0MCkscD1pKDEzKSxmPWkoNjEpLG09aSg2Miksdj1pKDE0OCksZz1pKDE0OSkseT1pKDI3KSxiPWkoMjUpLF89aSg1Myksdz1pKDM5KSx4PWkoNTQpLGs9aSgxNTApLFM9aSg4OSksRD1pKDIwKSxNPWkoMzMpLEM9Uy5mLE89RC5mLEU9ay5mLFQ9by5TeW1ib2wsUD1vLkpTT04sST1QJiZQLnN0cmluZ2lmeSxOPXAoXCJfaGlkZGVuXCIpLFI9cChcInRvUHJpbWl0aXZlXCIpLEE9e30ucHJvcGVydHlJc0VudW1lcmFibGUsej1sKFwic3ltYm9sLXJlZ2lzdHJ5XCIpLEw9bChcInN5bWJvbHNcIiksRj1sKFwib3Atc3ltYm9sc1wiKSxCPU9iamVjdC5wcm90b3R5cGUsaj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBULEg9by5RT2JqZWN0LFc9IUh8fCFILnByb3RvdHlwZXx8IUgucHJvdG90eXBlLmZpbmRDaGlsZCxZPXMmJmQoZnVuY3Rpb24oKXtyZXR1cm4gNyE9eChPKHt9LFwiYVwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gTyh0aGlzLFwiYVwiLHt2YWx1ZTo3fSkuYX19KSkuYX0pP2Z1bmN0aW9uKHQsZSxpKXt2YXIgbz1DKEIsZSk7byYmZGVsZXRlIEJbZV0sTyh0LGUsaSksbyYmdCE9PUImJk8oQixlLG8pfTpPLEc9ZnVuY3Rpb24odCl7dmFyIGU9TFt0XT14KFQucHJvdG90eXBlKTtyZXR1cm4gZS5faz10LGV9LFY9aiYmXCJzeW1ib2xcIj09dHlwZW9mIFQuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuXCJzeW1ib2xcIj09dHlwZW9mIHR9OmZ1bmN0aW9uKHQpe3JldHVybiB0IGluc3RhbmNlb2YgVH0sVT1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIHQ9PT1CJiZVKEYsZSxpKSx5KHQpLGU9XyhlLCEwKSx5KGkpLG4oTCxlKT8oaS5lbnVtZXJhYmxlPyhuKHQsTikmJnRbTl1bZV0mJih0W05dW2VdPSExKSxpPXgoaSx7ZW51bWVyYWJsZTp3KDAsITEpfSkpOihuKHQsTil8fE8odCxOLHcoMSx7fSkpLHRbTl1bZV09ITApLFkodCxlLGkpKTpPKHQsZSxpKX0scT1mdW5jdGlvbih0LGUpe3kodCk7Zm9yKHZhciBpLG89dihlPWIoZSkpLG49MCxzPW8ubGVuZ3RoO3M+bjspVSh0LGk9b1tuKytdLGVbaV0pO3JldHVybiB0fSxYPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/eCh0KTpxKHgodCksZSl9LFo9ZnVuY3Rpb24odCl7dmFyIGU9QS5jYWxsKHRoaXMsdD1fKHQsITApKTtyZXR1cm4hKHRoaXM9PT1CJiZuKEwsdCkmJiFuKEYsdCkpJiYoIShlfHwhbih0aGlzLHQpfHwhbihMLHQpfHxuKHRoaXMsTikmJnRoaXNbTl1bdF0pfHxlKX0sSz1mdW5jdGlvbih0LGUpe2lmKHQ9Yih0KSxlPV8oZSwhMCksdCE9PUJ8fCFuKEwsZSl8fG4oRixlKSl7dmFyIGk9Qyh0LGUpO3JldHVybiFpfHwhbihMLGUpfHxuKHQsTikmJnRbTl1bZV18fChpLmVudW1lcmFibGU9ITApLGl9fSxKPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPUUoYih0KSksbz1bXSxzPTA7aS5sZW5ndGg+czspbihMLGU9aVtzKytdKXx8ZT09Tnx8ZT09aHx8by5wdXNoKGUpO3JldHVybiBvfSwkPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxpPXQ9PT1CLG89RShpP0Y6Yih0KSkscz1bXSxyPTA7by5sZW5ndGg+cjspIW4oTCxlPW9bcisrXSl8fGkmJiFuKEIsZSl8fHMucHVzaChMW2VdKTtyZXR1cm4gc307anx8KFQ9ZnVuY3Rpb24oKXtpZih0aGlzIGluc3RhbmNlb2YgVCl0aHJvdyBUeXBlRXJyb3IoXCJTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhXCIpO3ZhciB0PWMoYXJndW1lbnRzLmxlbmd0aD4wP2FyZ3VtZW50c1swXTp2b2lkIDApLGU9ZnVuY3Rpb24oaSl7dGhpcz09PUImJmUuY2FsbChGLGkpLG4odGhpcyxOKSYmbih0aGlzW05dLHQpJiYodGhpc1tOXVt0XT0hMSksWSh0aGlzLHQsdygxLGkpKX07cmV0dXJuIHMmJlcmJlkoQix0LHtjb25maWd1cmFibGU6ITAsc2V0OmV9KSxHKHQpfS
21167xhKFQucHJvdG90eXBlLFwidG9TdHJpbmdcIixmdW5jdGlvbigpe3JldHVybiB0aGlzLl9rfSksUy5mPUssRC5mPVUsaSg4OCkuZj1rLmY9SixpKDQyKS5mPVosaSg2MykuZj0kLHMmJiFpKDUyKSYmYShCLFwicHJvcGVydHlJc0VudW1lcmFibGVcIixaLCEwKSxmLmY9ZnVuY3Rpb24odCl7cmV0dXJuIEcocCh0KSl9KSxyKHIuRytyLlcrci5GKiFqLHtTeW1ib2w6VH0pO2Zvcih2YXIgUT1cImhhc0luc3RhbmNlLGlzQ29uY2F0U3ByZWFkYWJsZSxpdGVyYXRvcixtYXRjaCxyZXBsYWNlLHNlYXJjaCxzcGVjaWVzLHNwbGl0LHRvUHJpbWl0aXZlLHRvU3RyaW5nVGFnLHVuc2NvcGFibGVzXCIuc3BsaXQoXCIsXCIpLHR0PTA7US5sZW5ndGg+dHQ7KXAoUVt0dCsrXSk7Zm9yKHZhciBldD1NKHAuc3RvcmUpLGl0PTA7ZXQubGVuZ3RoPml0OyltKGV0W2l0KytdKTtyKHIuUytyLkYqIWosXCJTeW1ib2xcIix7Zm9yOmZ1bmN0aW9uKHQpe3JldHVybiBuKHosdCs9XCJcIik/elt0XTp6W3RdPVQodCl9LGtleUZvcjpmdW5jdGlvbih0KXtpZighVih0KSl0aHJvdyBUeXBlRXJyb3IodCtcIiBpcyBub3QgYSBzeW1ib2whXCIpO2Zvcih2YXIgZSBpbiB6KWlmKHpbZV09PT10KXJldHVybiBlfSx1c2VTZXR0ZXI6ZnVuY3Rpb24oKXtXPSEwfSx1c2VTaW1wbGU6ZnVuY3Rpb24oKXtXPSExfX0pLHIoci5TK3IuRiohaixcIk9iamVjdFwiLHtjcmVhdGU6WCxkZWZpbmVQcm9wZXJ0eTpVLGRlZmluZVByb3BlcnRpZXM6cSxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6SyxnZXRPd25Qcm9wZXJ0eU5hbWVzOkosZ2V0T3duUHJvcGVydHlTeW1ib2xzOiR9KSxQJiZyKHIuUytyLkYqKCFqfHxkKGZ1bmN0aW9uKCl7dmFyIHQ9VCgpO3JldHVyblwiW251bGxdXCIhPUkoW3RdKXx8XCJ7fVwiIT1JKHthOnR9KXx8XCJ7fVwiIT1JKE9iamVjdCh0KSl9KSksXCJKU09OXCIse3N0cmluZ2lmeTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10JiYhVih0KSl7Zm9yKHZhciBlLGksbz1bdF0sbj0xO2FyZ3VtZW50cy5sZW5ndGg+bjspby5wdXNoKGFyZ3VtZW50c1tuKytdKTtyZXR1cm4gZT1vWzFdLFwiZnVuY3Rpb25cIj09dHlwZW9mIGUmJihpPWUpLCFpJiZnKGUpfHwoZT1mdW5jdGlvbih0LGUpe2lmKGkmJihlPWkuY2FsbCh0aGlzLHQsZSkpLCFWKGUpKXJldHVybiBlfSksb1sxXT1lLEkuYXBwbHkoUCxvKX19fSksVC5wcm90b3R5cGVbUl18fGkoMjYpKFQucHJvdG90eXBlLFIsVC5wcm90b3R5cGUudmFsdWVPZiksdShULFwiU3ltYm9sXCIpLHUoTWF0aCxcIk1hdGhcIiwhMCksdShvLkpTT04sXCJKU09OXCIsITApfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0MCkoXCJtZXRhXCIpLG49aSgzMikscz1pKDIyKSxyPWkoMjApLmYsYT0wLGg9T2JqZWN0LmlzRXh0ZW5zaWJsZXx8ZnVuY3Rpb24oKXtyZXR1cm4hMH0sZD0haSgyOCkoZnVuY3Rpb24oKXtyZXR1cm4gaChPYmplY3QucHJldmVudEV4dGVuc2lvbnMoe30pKX0pLGw9ZnVuY3Rpb24odCl7cih0LG8se3ZhbHVlOntpOlwiT1wiKyArK2Esdzp7fX19KX0sdT1mdW5jdGlvbih0LGUpe2lmKCFuKHQpKXJldHVyblwic3ltYm9sXCI9PXR5cGVvZiB0P3Q6KFwic3RyaW5nXCI9PXR5cGVvZiB0P1wiU1wiOlwiUFwiKSt0O2lmKCFzKHQsbykpe2lmKCFoKHQpKXJldHVyblwiRlwiO2lmKCFlKXJldHVyblwiRVwiO2wodCl9cmV0dXJuIHRbb10uaX0sYz1mdW5jdGlvbih0LGUpe2lmKCFzKHQsbykpe2lmKCFoKHQpKXJldHVybiEwO2lmKCFlKXJldHVybiExO2wodCl9cmV0dXJuIHRbb10ud30scD1mdW5jdGlvbih0KXtyZXR1cm4gZCYmZi5ORUVEJiZoKHQpJiYhcyh0LG8pJiZsKHQpLHR9LGY9dC5leHBvcnRzPXtLRVk6byxORUVEOiExLGZhc3RLZXk6dSxnZXRXZWFrOmMsb25GcmVlemU6cH19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDMzKSxuPWkoNjMpLHM9aSg0Mik7dC5leHBvcnRzPWZ1bmN0aW9uKHQpe3ZhciBlPW8odCksaT1uLmY7aWYoaSlmb3IodmFyIHIsYT1pKHQpLGg9cy5mLGQ9MDthLmxlbmd0aD5kOyloLmNhbGwodCxyPWFbZCsrXSkmJmUucHVzaChyKTtyZXR1cm4gZX19LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDUwKTt0LmV4cG9ydHM9QXJyYXkuaXNBcnJheXx8ZnVuY3Rpb24odCl7cmV0dXJuXCJBcnJheVwiPT1vKHQpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMjUpLG49aSg4OCkuZixzPXt9LnRvU3RyaW5nLHI9XCJvYmplY3RcIj09dHlwZW9mIHdpbmRvdyYmd2luZG93JiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcz9PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpOltdLGE9ZnVuY3Rpb24odCl7dHJ5e3JldHVybiBuKHQpfWNhdGNoKHQpe3JldHVybiByLnNsaWNlKCl9fTt0LmV4cG9ydHMuZj1mdW5jdGlvbih0KXtyZXR1cm4gciYmXCJbb2JqZWN0IFdpbmRvd11cIj09cy5jYWxsKHQpP2EodCk6bihvKHQpKX19LGZ1bmN0aW9uKHQsZSl7fSxmdW5jdGlvbih0LGUsaSl7aSg2MikoXCJhc3luY0l0ZXJhdG9yXCIpfSxmdW5jdGlvbih0LGUsaSl7aSg2MikoXCJvYnNlcnZhYmxlXCIpfSxmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKHQpeyFmdW5jdGlvbihlLGkpe3QuZXhwb3J0cz1pKCl9KDAsZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7cmV0dXJuIENvLmFwcGx5KG51bGwsYXJndW1lbnRzKX1mdW5jdGlvbiBpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgQXJyYXl8fFwiW29iamVjdCBBcnJheV1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsIT10JiZcIltvYmplY3QgT2JqZWN0XVwiPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHQpfWZ1bmN0aW9uIG4odCl7aWYoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMpcmV0dXJuIDA9PT1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0KS5sZW5ndGg7dmFyIGU7Zm9yKGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHModCl7cmV0dXJuIHZvaWQgMD09PXR9ZnVuY3Rpb24gcih0KXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgdHx8XCJbb2JqZWN0IE51bWJlcl1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBhKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZXx8XCJbb2JqZWN0IERhdGVdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCl9ZnVuY3Rpb24gaCh0LGUpe3ZhciBpLG89W107Zm9yKGk9MDtpPHQubGVuZ3RoOysraSlvLnB1c2goZSh0W2ldLGkpKTtyZXR1cm4gb31mdW5jdGlvbiBkKHQsZSl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LGUpfWZ1bmN0aW9uIGwodCxlKXtmb3IodmFyIGkgaW4gZSlkKGUsaSkmJih0W2ldPWVbaV0pO3JldHVybiBkKGUsXCJ0b1N0cmluZ1wiKSYmKHQudG9TdHJpbmc9ZS50b1N0cmluZyksZChlLFwidmFsdWVPZlwiKSYmKHQudmFsdWVPZj1lLnZhbHVlT2YpLHR9ZnVuY3Rpb24gdSh0LGUsaSxvKXtyZXR1cm4gU2UodCxlLGksbywhMCkudXRjKCl9ZnVuY3Rpb24gYygpe3JldHVybntlbXB0eTohMSx1bnVzZWRUb2tlbnM6W10sdW51c2VkSW5wdXQ6W10sb3ZlcmZsb3c6LTIsY2hhcnNMZWZ0T3ZlcjowLG51bGxJbnB1dDohMSxpbnZhbGlkTW9udGg6bnVsbCxpbnZhbGlkRm9ybWF0OiExLHVzZXJJbnZhbGlkYXRlZDohMSxpc286ITEscGFyc2VkRGF0ZVBhcnRzOltdLG1lcmlkaWVtOm51bGwscmZjMjgyMjohMSx3ZWVrZGF5TWlzbWF0Y2g6ITF9fWZ1bmN0aW9uIHAodCl7cmV0dXJuIG51bGw9PXQuX3BmJiYodC5fcGY9YygpKSx0Ll9wZn1mdW5jdGlvbiBmKHQpe2lmKG51bGw9PXQuX2lzVmFsaWQpe3ZhciBlPXAodCksaT1Pby5jYWxsKGUucGFyc2VkRGF0ZVBhcnRzLGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSksbz0haXNOYU4odC5fZC5nZXRUaW1lKCkpJiZlLm92ZXJmbG93PDAmJiFlLmVtcHR5JiYhZS5pbnZhbGlkTW9udGgmJiFlLmludmFsaWRXZWVrZGF5JiYhZS53ZWVrZGF5TWlzbWF0Y2gmJiFlLm51bGxJbnB1dCYmIWUuaW52YWxpZEZvcm1hdCYmIWUudXNlckludmFsaWRhdGVkJiYoIWUubWVyaWRpZW18fGUubWVyaWRpZW0mJmkpO2lmKHQuX3N0cmljdCYmKG89byYmMD09PWUuY2hhcnNMZWZ0T3ZlciYmMD09PWUudW51c2VkVG9rZW5zLmxlbmd0aCYmdm9pZCAwPT09ZS5iaWdIb3VyKSxudWxsIT1PYmplY3QuaXNGcm96ZW4mJk9iamVjdC5pc0Zyb3plbih0KSlyZXR1cm4gbzt0Ll9pc1ZhbGlkPW99cmV0dXJuIHQuX2lzVmFsaWR9ZnVuY3Rpb24gbSh0KXt2YXIgZT11KE5hTik7cmV0dXJuIG51bGwhPXQ/bChwKGUpLHQpOnAoZSkudXNlckludmFsaWRhdGVkPSEwLGV9ZnVuY3Rpb24gdih0LGUpe3ZhciBpLG8sbjtpZihzKGUuX2lzQU1vbWVudE9iamVjdCl8fCh0Ll9pc0FNb21lbnRPYmplY3Q9ZS5faXNBTW9tZW50T2JqZWN0KSxzKGUuX2kpfHwodC5faT1lLl9pKSxzKGUuX2YpfHwodC5fZj1lLl9mKSxzKGUuX2wpfHwodC5fbD1lLl9sKSxzKGUuX3N0cmljdCl8fCh0Ll9zdHJpY3Q9ZS5fc3RyaWN0KSxzKGUuX3R6bSl8fCh0Ll90em09ZS5fdHptKSxzKGUuX2lzVVRDKXx8KHQuX2lzVVRDPWUuX2lzVVRDKSxzKGUuX29mZnNldCl8fCh0Ll9vZmZzZXQ9ZS5fb2Zmc2V0KSxzKGUuX3BmKXx8KHQuX3BmPXAoZSkpLHMoZS5fbG9jYWxlKXx8KHQuX2xvY2FsZT1lLl9sb2NhbGUpLEVvLmxlbmd0aD4wKWZvcihpPTA7aTxFby5sZW5ndGg7aSsrKW89RW9baV0sbj1lW29dLHMobil8fCh0W29dPW4pO3JldHVybiB0fWZ1bmN0aW9uIGcodCl7dih0aGlzLHQpLHRoaXMuX2Q9bmV3IERhdGUobnVsbCE9dC5fZD90Ll9kLmdldFRpbWUoKTpOYU4pLHRoaXMuaXNWYWxpZCgpfHwodGhpcy5fZD1uZXcgRGF0ZShOYU4pKSwhMT09PVRvJiYoVG89ITAsZS51cGRhdGVPZmZzZXQodGhpcyksVG89ITEpfWZ1bmN0aW9uIHkodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBnfHxudWxsIT10JiZudWxsIT10Ll9pc0FNb21lbnRPYmplY3R9ZnVuY3Rpb24gYih0KXtyZXR1cm4gdDwwP01hdGguY2VpbCh0KXx8MDpNYXRoLmZsb29yKHQpfWZ1bmN0aW9uIF8odCl7dmFyIGU9K3QsaT0wO3JldHVybiAwIT09ZSYmaXNGaW5pdGUoZSkmJihpPWIoZSkpLGl9ZnVuY3Rpb24gdyh0LGUsaSl7dmFyIG8sbj1NYXRoLm1pbih0Lmxlbmd0aCxlLmxlbmd0aCkscz1NYXRoLmFicyh0Lmxlbmd0aC1lLmxlbmd0aCkscj0wO2ZvcihvPTA7bzxuO28rKykoaSYmdFtvXSE9PWVbb118fCFpJiZfKHRbb10pIT09XyhlW29dKSkmJnIrKztyZXR1cm4gcitzfWZ1bmN0aW9uIHgodCl7ITE9PT1lLnN1cHByZXNzRGVwcmVjYXRpb25XYXJuaW5ncyYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKFwiRGVwcmVjYXRpb24gd2FybmluZzogXCIrdCl9ZnVuY3Rpb24gayh0LGkpe3ZhciBvPSEwO3JldHVybiBsKGZ1bmN0aW9uKCl7aWYobnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKG51bGwsdCksbyl7Zm9yKHZhciBuLHM9W10scj0wO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspe2lmKG49XCJcIixcIm9iamVjdFwiPT10eXBlb2YgYXJndW1lbnRzW3JdKXtuKz1cIlxcbltcIityK1wiXSBcIlxuO2Zvcih2YXIgYSBpbiBhcmd1bWVudHNbMF0pbis9YStcIjogXCIrYXJndW1lbnRzWzBdW2FdK1wiLCBcIjtuPW4uc2xpY2UoMCwtMil9ZWxzZSBuPWFyZ3VtZW50c1tyXTtzLnB1c2gobil9eCh0K1wiXFxuQXJndW1lbnRzOiBcIitBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChzKS5qb2luKFwiXCIpK1wiXFxuXCIrKG5ldyBFcnJvcikuc3RhY2spLG89ITF9cmV0dXJuIGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxpKX1mdW5jdGlvbiBTKHQsaSl7bnVsbCE9ZS5kZXByZWNhdGlvbkhhbmRsZXImJmUuZGVwcmVjYXRpb25IYW5kbGVyKHQsaSksUG9bdF18fCh4KGkpLFBvW3RdPSEwKX1mdW5jdGlvbiBEKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRnVuY3Rpb258fFwiW29iamVjdCBGdW5jdGlvbl1cIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX1mdW5jdGlvbiBNKHQpe3ZhciBlLGk7Zm9yKGkgaW4gdCllPXRbaV0sRChlKT90aGlzW2ldPWU6dGhpc1tcIl9cIitpXT1lO3RoaXMuX2NvbmZpZz10LHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2VMZW5pZW50PW5ldyBSZWdFeHAoKHRoaXMuX2RheU9mTW9udGhPcmRpbmFsUGFyc2Uuc291cmNlfHx0aGlzLl9vcmRpbmFsUGFyc2Uuc291cmNlKStcInxcIisvXFxkezEsMn0vLnNvdXJjZSl9ZnVuY3Rpb24gQyh0LGUpe3ZhciBpLG49bCh7fSx0KTtmb3IoaSBpbiBlKWQoZSxpKSYmKG8odFtpXSkmJm8oZVtpXSk/KG5baV09e30sbChuW2ldLHRbaV0pLGwobltpXSxlW2ldKSk6bnVsbCE9ZVtpXT9uW2ldPWVbaV06ZGVsZXRlIG5baV0pO2ZvcihpIGluIHQpZCh0LGkpJiYhZChlLGkpJiZvKHRbaV0pJiYobltpXT1sKHt9LG5baV0pKTtyZXR1cm4gbn1mdW5jdGlvbiBPKHQpe251bGwhPXQmJnRoaXMuc2V0KHQpfWZ1bmN0aW9uIEUodCxlLGkpe3ZhciBvPXR
21167oaXMuX2NhbGVuZGFyW3RdfHx0aGlzLl9jYWxlbmRhci5zYW1lRWxzZTtyZXR1cm4gRChvKT9vLmNhbGwoZSxpKTpvfWZ1bmN0aW9uIFQodCl7dmFyIGU9dGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF0saT10aGlzLl9sb25nRGF0ZUZvcm1hdFt0LnRvVXBwZXJDYXNlKCldO3JldHVybiBlfHwhaT9lOih0aGlzLl9sb25nRGF0ZUZvcm1hdFt0XT1pLnJlcGxhY2UoL01NTU18TU18RER8ZGRkZC9nLGZ1bmN0aW9uKHQpe3JldHVybiB0LnNsaWNlKDEpfSksdGhpcy5fbG9uZ0RhdGVGb3JtYXRbdF0pfWZ1bmN0aW9uIFAoKXtyZXR1cm4gdGhpcy5faW52YWxpZERhdGV9ZnVuY3Rpb24gSSh0KXtyZXR1cm4gdGhpcy5fb3JkaW5hbC5yZXBsYWNlKFwiJWRcIix0KX1mdW5jdGlvbiBOKHQsZSxpLG8pe3ZhciBuPXRoaXMuX3JlbGF0aXZlVGltZVtpXTtyZXR1cm4gRChuKT9uKHQsZSxpLG8pOm4ucmVwbGFjZSgvJWQvaSx0KX1mdW5jdGlvbiBSKHQsZSl7dmFyIGk9dGhpcy5fcmVsYXRpdmVUaW1lW3Q+MD9cImZ1dHVyZVwiOlwicGFzdFwiXTtyZXR1cm4gRChpKT9pKGUpOmkucmVwbGFjZSgvJXMvaSxlKX1mdW5jdGlvbiBBKHQsZSl7dmFyIGk9dC50b0xvd2VyQ2FzZSgpO0xvW2ldPUxvW2krXCJzXCJdPUxvW2VdPXR9ZnVuY3Rpb24geih0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgdD9Mb1t0XXx8TG9bdC50b0xvd2VyQ2FzZSgpXTp2b2lkIDB9ZnVuY3Rpb24gTCh0KXt2YXIgZSxpLG89e307Zm9yKGkgaW4gdClkKHQsaSkmJihlPXooaSkpJiYob1tlXT10W2ldKTtyZXR1cm4gb31mdW5jdGlvbiBGKHQsZSl7Rm9bdF09ZX1mdW5jdGlvbiBCKHQpe3ZhciBlPVtdO2Zvcih2YXIgaSBpbiB0KWUucHVzaCh7dW5pdDppLHByaW9yaXR5OkZvW2ldfSk7cmV0dXJuIGUuc29ydChmdW5jdGlvbih0LGUpe3JldHVybiB0LnByaW9yaXR5LWUucHJpb3JpdHl9KSxlfWZ1bmN0aW9uIGoodCxlLGkpe3ZhciBvPVwiXCIrTWF0aC5hYnModCksbj1lLW8ubGVuZ3RoO3JldHVybih0Pj0wP2k/XCIrXCI6XCJcIjpcIi1cIikrTWF0aC5wb3coMTAsTWF0aC5tYXgoMCxu
21167KSkudG9TdHJpbmcoKS5zdWJzdHIoMSkrb31mdW5jdGlvbiBIKHQsZSxpLG8pe3ZhciBuPW87XCJzdHJpbmdcIj09dHlwZW9mIG8mJihuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbb10oKX0pLHQmJihXb1t0XT1uKSxlJiYoV29bZVswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxlWzFdLGVbMl0pfSksaSYmKFdvW2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm9yZGluYWwobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdCl9KX1mdW5jdGlvbiBXKHQpe3JldHVybiB0Lm1hdGNoKC9cXFtbXFxzXFxTXS8pP3QucmVwbGFjZSgvXlxcW3xcXF0kL2csXCJcIik6dC5yZXBsYWNlKC9cXFxcL2csXCJcIil9ZnVuY3Rpb24gWSh0KXt2YXIgZSxpLG89dC5tYXRjaChCbyk7Zm9yKGU9MCxpPW8ubGVuZ3RoO2U8aTtlKyspV29bb1tlXV0/b1tlXT1Xb1tvW2VdXTpvW2VdPVcob1tlXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLHM9XCJcIjtmb3Iobj0wO248aTtuKyspcys9RChvW25dKT9vW25dLmNhbGwoZSx0KTpvW25dO3JldHVybiBzfX1mdW5jdGlvbiBHKHQsZSl7cmV0dXJuIHQuaXNWYWxpZCgpPyhlPVYoZSx0LmxvY2FsZURhdGEoKSksSG9bZV09SG9bZV18fFkoZSksSG9bZV0odCkpOnQubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24gVih0LGUpe2Z1bmN0aW9uIGkodCl7cmV0dXJuIGUubG9uZ0RhdGVGb3JtYXQodCl8fHR9dmFyIG89NTtmb3Ioam8ubGFzdEluZGV4PTA7bz49MCYmam8udGVzdCh0KTspdD10LnJlcGxhY2Uoam8saSksam8ubGFzdEluZGV4PTAsby09MTtyZXR1cm4gdH1mdW5jdGlvbiBVKHQsZSxpKXthblt0XT1EKGUpP2U6ZnVuY3Rpb24odCxvKXtyZXR1cm4gdCYmaT9pOmV9fWZ1bmN0aW9uIHEodCxlKXtyZXR1cm4gZChhbix0KT9hblt0XShlLl9zdHJpY3QsZS5fbG9jYWxlKTpuZXcgUmVnRXhwKFgodCkpfWZ1bmN0aW9uIFgodCl7cmV0dXJuIFoodC5yZXBsYWNlKFwiXFxcXFwiLFwiXCIpLnJlcGxhY2UoL1xcXFwoXFxbKXxcXFxcKFxcXSl8XFxbKFteXFxdXFxbXSopXFxdfFxcXFwoLikvZyxmdW5jdGlvbih0LGUsaSxvLG4pe3JldHVybiBlfHxpfHxvfHxufSkpfWZ1bmN0aW9uIFoodCl7cmV0dXJuIHQucmVwbGFjZSgvWy1cXC9cXFxcXiQqKz8uKCl8W1xcXXt9XS9nLFwiXFxcXCQmXCIpfWZ1bmN0aW9uIEsodCxlKXt2YXIgaSxvPWU7Zm9yKFwic3RyaW5nXCI9PXR5cGVvZiB0JiYodD1bdF0pLHIoZSkmJihvPWZ1bmN0aW9uKHQsaSl7aVtlXT1fKHQpfSksaT0wO2k8dC5sZW5ndGg7aSsrKWhuW3RbaV1dPW99ZnVuY3Rpb24gSih0LGUpe0sodCxmdW5jdGlvbih0LGksbyxuKXtvLl93PW8uX3d8fHt9LGUodCxvLl93LG8sbil9KX1mdW5jdGlvbiAkKHQsZSxpKXtudWxsIT1lJiZkKGhuLHQpJiZoblt0XShlLGkuX2EsaSx0KX1mdW5jdGlvbiBRKHQpe3JldHVybiB0dCh0KT8zNjY6MzY1fWZ1bmN0aW9uIHR0KHQpe3JldHVybiB0JTQ9PTAmJnQlMTAwIT0wfHx0JTQwMD09MH1mdW5jdGlvbiBldCgpe3JldHVybiB0dCh0aGlzLnllYXIoKSl9ZnVuY3Rpb24gaXQodCxpKXtyZXR1cm4gZnVuY3Rpb24obyl7cmV0dXJuIG51bGwhPW8/KG50KHRoaXMsdCxvKSxlLnVwZGF0ZU9mZnNldCh0aGlzLGkpLHRoaXMpOm90KHRoaXMsdCl9fWZ1bmN0aW9uIG90KHQsZSl7cmV0dXJuIHQuaXNWYWxpZCgpP3QuX2RbXCJnZXRcIisodC5faXNVVEM/XCJVVENcIjpcIlwiKStlXSgpOk5hTn1mdW5jdGlvbiBudCh0LGUsaSl7dC5pc1ZhbGlkKCkmJiFpc05hTihpKSYmKFwiRnVsbFllYXJcIj09PWUmJnR0KHQueWVhcigpKT90Ll9kW1wic2V0XCIrKHQuX2lzVVRDP1wiVVRDXCI6XCJcIikrZV0oaSx0Lm1vbnRoKCksaHQoaSx0Lm1vbnRoKCkpKTp0Ll9kW1wic2V0XCIrKHQuX2lzVVRDP1wiVVRDXCI6XCJcIikrZV0oaSkpfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0PXoodCksRCh0aGlzW3RdKT90aGlzW3RdKCk6dGhpc31mdW5jdGlvbiBydCh0LGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiB0KXt0PUwodCk7Zm9yKHZhciBpPUIodCksbz0wO288aS5sZW5ndGg7bysrKXRoaXNbaVtvXS51bml0XSh0W2lbb10udW5pdF0pfWVsc2UgaWYodD16KHQpLEQodGhpc1t0XSkpcmV0dXJuIHRoaXNbdF0oZSk7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gYXQodCxlKXtyZXR1cm4odCVlK2UpJWV9ZnVuY3Rpb24gaHQodCxlKXtpZihpc05hTih0KXx8aXNOYU4oZSkpcmV0dXJuIE5hTjt2YXIgaT1hdChlLDEyKTtyZXR1cm4gdCs9KGUtaSkvMTIsMT09PWk/dHQodCk/Mjk6Mjg6MzEtaSU3JTJ9ZnVuY3Rpb24gZHQodCxlKXtyZXR1cm4gdD9pKHRoaXMuX21vbnRocyk/dGhpcy5fbW9udGhzW3QubW9udGgoKV06dGhpcy5fbW9udGhzWyh0aGlzLl9tb250aHMuaXNGb3JtYXR8fF9uKS50ZXN0KGUpP1wiZm9ybWF0XCI6XCJzdGFuZGFsb25lXCJdW3QubW9udGgoKV06aSh0aGlzLl9tb250aHMpP3RoaXMuX21vbnRoczp0aGlzLl9tb250aHMuc3RhbmRhbG9uZX1mdW5jdGlvbiBsdCh0LGUpe3JldHVybiB0P2kodGhpcy5fbW9udGhzU2hvcnQpP3RoaXMuX21vbnRoc1Nob3J0W3QubW9udGgoKV06dGhpcy5fbW9udGhzU2hvcnRbX24udGVzdChlKT9cImZvcm1hdFwiOlwic3RhbmRhbG9uZVwiXVt0Lm1vbnRoKCldOmkodGhpcy5fbW9udGhzU2hvcnQpP3RoaXMuX21vbnRoc1Nob3J0OnRoaXMuX21vbnRoc1Nob3J0LnN0YW5kYWxvbmV9ZnVuY3Rpb24gdXQodCxlLGkpe3ZhciBvLG4scyxyPXQudG9Mb2NhbGVMb3dlckNhc2UoKTtpZighdGhpcy5fbW9udGhzUGFyc2UpZm9yKHRoaXMuX21vbnRoc1BhcnNlPVtdLHRoaXMuX2xvbmdNb250aHNQYXJzZT1bXSx0aGlzLl9zaG9ydE1vbnRoc1BhcnNlPVtdLG89MDtvPDEyOysrbylzPXUoWzJlMyxvXSksdGhpcy5fc2hvcnRNb250aHNQYXJzZVtvXT10aGlzLm1vbnRoc1Nob3J0KHMsXCJcIikudG9Mb2NhbGVMb3dlckNhc2UoKSx0aGlzLl9sb25nTW9udGhzUGFyc2Vbb109dGhpcy5tb250aHMocyxcIlwiKS50b0xvY2FsZUxvd2VyQ2FzZSgpO3JldHVybiBpP1wiTU1NXCI9PT1lPyhuPXluLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKToobj15bi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTpcIk1NTVwiPT09ZT8tMSE9PShuPXluLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSk/bjoobj15bi5jYWxsKHRoaXMuX2xvbmdNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTotMSE9PShuPXluLmNhbGwodGhpcy5fbG9uZ01vbnRoc1BhcnNlLHIpKT9uOihuPXluLmNhbGwodGhpcy5fc2hvcnRNb250aHNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKX1mdW5jdGlvbiBjdCh0LGUsaSl7dmFyIG8sbixzO2lmKHRoaXMuX21vbnRoc1BhcnNlRXhhY3QpcmV0dXJuIHV0LmNhbGwodGhpcyx0LGUsaSk7Zm9yKHRoaXMuX21vbnRoc1BhcnNlfHwodGhpcy5fbW9udGhzUGFyc2U9W10sdGhpcy5fbG9uZ01vbnRoc1BhcnNlPVtdLHRoaXMuX3Nob3J0TW9udGhzUGFyc2U9W10pLG89MDtvPDEyO28rKyl7aWYobj11KFsyZTMsb10pLGkmJiF0aGlzLl9sb25nTW9udGhzUGFyc2Vbb10mJih0aGlzLl9sb25nTW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChcIl5cIit0aGlzLm1vbnRocyhuLFwiXCIpLnJlcGxhY2UoXCIuXCIsXCJcIikrXCIkXCIsXCJpXCIpLHRoaXMuX3Nob3J0TW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChcIl5cIit0aGlzLm1vbnRoc1Nob3J0KG4sXCJcIikucmVwbGFjZShcIi5cIixcIlwiKStcIiRcIixcImlcIikpLGl8fHRoaXMuX21vbnRoc1BhcnNlW29dfHwocz1cIl5cIit0aGlzLm1vbnRocyhuLFwiXCIpK1wifF5cIit0aGlzLm1vbnRoc1Nob3J0KG4sXCJcIiksdGhpcy5fbW9udGhzUGFyc2Vbb109bmV3IFJlZ0V4cChzLnJlcGxhY2UoXCIuXCIsXCJcIiksXCJpXCIpKSxpJiZcIk1NTU1cIj09PWUmJnRoaXMuX2xvbmdNb250aHNQYXJzZVtvXS50ZXN0KHQpKXJldHVybi
21167BvO2lmKGkmJlwiTU1NXCI9PT1lJiZ0aGlzLl9zaG9ydE1vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoIWkmJnRoaXMuX21vbnRoc1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG99fWZ1bmN0aW9uIHB0KHQsZSl7dmFyIGk7aWYoIXQuaXNWYWxpZCgpKXJldHVybiB0O2lmKFwic3RyaW5nXCI9PXR5cGVvZiBlKWlmKC9eXFxkKyQvLnRlc3QoZSkpZT1fKGUpO2Vsc2UgaWYoZT10LmxvY2FsZURhdGEoKS5tb250aHNQYXJzZShlKSwhcihlKSlyZXR1cm4gdDtyZXR1cm4gaT1NYXRoLm1pbih0LmRhdGUoKSxodCh0LnllYXIoKSxlKSksdC5fZFtcInNldFwiKyh0Ll9pc1VUQz9cIlVUQ1wiOlwiXCIpK1wiTW9udGhcIl0oZSxpKSx0fWZ1bmN0aW9uIGZ0KHQpe3JldHVybiBudWxsIT10PyhwdCh0aGlzLHQpLGUudXBkYXRlT2Zmc2V0KHRoaXMsITApLHRoaXMpOm90KHRoaXMsXCJNb250aFwiKX1mdW5jdGlvbiBtdCgpe3JldHVybiBodCh0aGlzLnllYXIoKSx0aGlzLm1vbnRoKCkpfWZ1bmN0aW9uIHZ0KHQpe3JldHVybiB0aGlzLl9tb250aHNQYXJzZUV4YWN0PyhkKHRoaXMsXCJfbW9udGhzUmVnZXhcIil8fHl0LmNhbGwodGhpcyksdD90aGlzLl9tb250aHNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX21vbnRoc1Nob3J0UmVnZXgpOihkKHRoaXMsXCJfbW9udGhzU2hvcnRSZWdleFwiKXx8KHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9a24pLHRoaXMuX21vbnRoc1Nob3J0U3RyaWN0UmVnZXgmJnQ/dGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleDp0aGlzLl9tb250aHNTaG9ydFJlZ2V4KX1mdW5jdGlvbiBndCh0KXtyZXR1cm4gdGhpcy5fbW9udGhzUGFyc2VFeGFjdD8oZCh0aGlzLFwiX21vbnRoc1JlZ2V4XCIpfHx5dC5jYWxsKHRoaXMpLHQ/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpOihkKHRoaXMsXCJfbW9udGhzUmVnZXhcIil8fCh0aGlzLl9tb250aHNSZWdleD1TbiksdGhpcy5fbW9udGhzU3RyaWN0UmVnZXgmJnQ/dGhpcy5fbW9udGhzU3RyaWN0UmVnZXg6dGhpcy5fbW9udGhzUmVnZXgpfWZ1bmN0aW9uIHl0KCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH12YXIgZSxpLG89W10sbj1bXSxzPVtdO2ZvcihlPTA7ZTwxMjtlKyspaT11KFsyZTMsZV0pLG8ucHVzaCh0aGlzLm1vbnRoc1Nob3J0KGksXCJcIikpLG4ucHVzaCh0aGlzLm1vbnRocyhpLFwiXCIpKSxzLnB1c2godGhpcy5tb250aHMoaSxcIlwiKSkscy5wdXNoKHRoaXMubW9udGhzU2hvcnQoaSxcIlwiKSk7Zm9yKG8uc29ydCh0KSxuLnNvcnQodCkscy5zb3J0KHQpLGU9MDtlPDEyO2UrKylvW2VdPVoob1tlXSksbltlXT1aKG5bZV0pO2ZvcihlPTA7ZTwyNDtlKyspc1tlXT1aKHNbZV0pO3RoaXMuX21vbnRoc1JlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK3Muam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX21vbnRoc1Nob3J0UmVnZXg9dGhpcy5fbW9udGhzUmVnZXgsdGhpcy5fbW9udGhzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrbi5qb2luKFwifFwiKStcIilcIixcImlcIiksdGhpcy5fbW9udGhzU2hvcnRTdHJpY3RSZWdleD1uZXcgUmVnRXhwKFwiXihcIitvLmpvaW4oXCJ8XCIpK1wiKVwiLFwiaVwiKX1mdW5jdGlvbiBidCh0LGUsaSxvLG4scyxyKXt2YXIgYT1uZXcgRGF0ZSh0LGUsaSxvLG4scyxyKTtyZXR1cm4gdDwxMDAmJnQ+PTAmJmlzRmluaXRlKGEuZ2V0RnVsbFllYXIoKSkmJmEuc2V0RnVsbFllYXIodCksYX1mdW5jdGlvbiBfdCh0KXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQy5hcHBseShudWxsLGFyZ3VtZW50cykpO3JldHVybiB0PDEwMCYmdD49MCYmaXNGaW5pdGUoZS5nZXRVVENGdWxsWWVhcigpKSYmZS5zZXRVVENGdWxsWWVhcih0KSxlfWZ1bmN0aW9uIHd0KHQsZSxpKXt2YXIgbz03K2UtaTtyZXR1cm4tKDcrX3QodCwwLG8pLmdldFVUQ0RheSgpLWUpJTcrby0xfWZ1bmN0aW9uIHh0KHQsZSxpLG8sbil7dmFyIHMscixhPSg3K2ktbyklNyxoPXd0KHQsbyxuKSxkPTErNyooZS0xKSthK2g7cmV0dXJuIGQ8PTA/KHM9dC0xLHI9UShzKStkKTpkPlEodCk/KHM9dCsxLHI9ZC1RKHQpKToocz10LHI9ZCkse3llYXI6cyxkYXlPZlllYXI6cn19ZnVuY3Rpb24ga3QodCxlLGkpe3ZhciBvLG4scz13dCh0LnllYXIoKSxlLGkpLHI9TWF0aC5mbG9vcigodC5kYXlPZlllYXIoKS1zLTEpLzcpKzE7cmV0dXJuIHI8MT8obj10LnllYXIoKS0xLG89citTdChuLGUsaSkpOnI+U3QodC55ZWFyKCksZSxpKT8obz1yLVN0KHQueWVhcigpLGUsaSksbj10LnllYXIoKSsxKToobj10LnllYXIoKSxvPXIpLHt3ZWVrOm8seWVhcjpufX1mdW5jdGlvbiBTdCh0LGUsaSl7dmFyIG89d3QodCxlLGkpLG49d3QodCsxLGUsaSk7cmV0dXJuKFEodCktbytuKS83fWZ1bmN0aW9uIER0KHQpe3JldHVybiBrdCh0LHRoaXMuX3dlZWsuZG93LHRoaXMuX3dlZWsuZG95KS53ZWVrfWZ1bmN0aW9uIE10KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG93fWZ1bmN0aW9uIEN0KCl7cmV0dXJuIHRoaXMuX3dlZWsuZG95fWZ1bmN0aW9uIE90KHQpe3ZhciBlPXRoaXMubG9jYWxlRGF0YSgpLndlZWsodGhpcyk7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCg3Kih0LWUpLFwiZFwiKX1mdW5jdGlvbiBFdCh0KXt2YXIgZT1rdCh0aGlzLDEsNCkud2VlaztyZXR1cm4gbnVsbD09dD9lOnRoaXMuYWRkKDcqKHQtZSksXCJkXCIpfWZ1bmN0aW9uIFR0KHQsZSl7cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIHQ/dDppc05hTih0KT8odD1lLndlZWtkYXlzUGFyc2UodCksXCJudW1iZXJcIj09dHlwZW9mIHQ/dDpudWxsKTpwYXJzZUludCh0LDEwKX1mdW5jdGlvbiBQdCh0LGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0P2Uud2Vla2RheXNQYXJzZSh0KSU3fHw3OmlzTmFOKHQpP251bGw6dH1mdW5jdGlvbiBJdCh0LGUpe3JldHVybiB0P2kodGhpcy5fd2Vla2RheXMpP3RoaXMuX3dlZWtkYXlzW3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzW3RoaXMuX3dlZWtkYXlzLmlzRm9ybWF0LnRlc3QoZSk/XCJmb3JtYXRcIjpcInN0YW5kYWxvbmVcIl1bdC5kYXkoKV06aSh0aGlzLl93ZWVrZGF5cyk/dGhpcy5fd2Vla2RheXM6dGhpcy5fd2Vla2RheXMuc3RhbmRhbG9uZX1mdW5jdGlvbiBOdCh0KXtyZXR1cm4gdD90aGlzLl93ZWVrZGF5c1Nob3J0W3QuZGF5KCldOnRoaXMuX3dlZWtkYXlzU2hvcnR9ZnVuY3Rpb24gUnQodCl7cmV0dXJuIHQ/dGhpcy5fd2Vla2RheXNNaW5bdC5kYXkoKV06dGhpcy5fd2Vla2RheXNNaW59ZnVuY3Rpb24gQXQo
21167dCxlLGkpe3ZhciBvLG4scyxyPXQudG9Mb2NhbGVMb3dlckNhc2UoKTtpZighdGhpcy5fd2Vla2RheXNQYXJzZSlmb3IodGhpcy5fd2Vla2RheXNQYXJzZT1bXSx0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2U9W10sdGhpcy5fbWluV2Vla2RheXNQYXJzZT1bXSxvPTA7bzw3OysrbylzPXUoWzJlMywxXSkuZGF5KG8pLHRoaXMuX21pbldlZWtkYXlzUGFyc2Vbb109dGhpcy53ZWVrZGF5c01pbihzLFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dPXRoaXMud2Vla2RheXNTaG9ydChzLFwiXCIpLnRvTG9jYWxlTG93ZXJDYXNlKCksdGhpcy5fd2Vla2RheXNQYXJzZVtvXT10aGlzLndlZWtkYXlzKHMsXCJcIikudG9Mb2NhbGVMb3dlckNhc2UoKTtyZXR1cm4gaT9cImRkZGRcIj09PWU/KG49eW4uY2FsbCh0aGlzLl93ZWVrZGF5c1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOlwiZGRkXCI9PT1lPyhuPXluLmNhbGwodGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlLHIpLC0xIT09bj9uOm51bGwpOihuPXluLmNhbGwodGhpcy5fbWluV2Vla2RheXNQYXJzZSxyKSwtMSE9PW4/bjpudWxsKTpcImRkZGRcIj09PWU/LTEhPT0obj15bi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UscikpP246LTEhPT0obj15bi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSk/bjoobj15bi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCk6XCJkZGRcIj09PWU/LTEhPT0obj15bi5jYWxsKHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZSxyKSk/bjotMSE9PShuPXluLmNhbGwodGhpcy5fd2Vla2RheXNQYXJzZSxyKSk/bjoobj15bi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCk6LTEhPT0obj15bi5jYWxsKHRoaXMuX21pbldlZWtkYXlzUGFyc2UscikpP246LTEhPT0obj15bi5jYWxsKHRoaXMuX3dlZWtkYXlzUGFyc2UscikpP246KG49eW4uY2FsbCh0aGlzLl9zaG9ydFdlZWtkYXlzUGFyc2UsciksLTEhPT1uP246bnVsbCl9ZnVuY3Rpb24genQodCxlLGkpe3ZhciBvLG4scztpZih0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3QpcmV0dXJuIEF0LmNhbGwodGhpcyx0LGUsaSk7Zm9yKHRoaXMuX3dlZWtkYXlzUGFyc2V8fCh0aGlzLl93ZWVrZGF5c1BhcnNlPVtdLHRoaXMuX21pbldlZWtkYXlzUGFyc2U9W10sdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlPVtdLHRoaXMuX2Z1bGxXZWVrZGF5c1BhcnNlPVtdKSxvPTA7bzw3O28rKyl7aWYobj11KFsyZTMsMV0pLmRheShvKSxpJiYhdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbb10mJih0aGlzLl9mdWxsV2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMud2Vla2RheXMobixcIlwiKS5yZXBsYWNlKFwiLlwiLFwiLj9cIikrXCIkXCIsXCJpXCIpLHRoaXMuX3Nob3J0V2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMud2Vla2RheXNTaG9ydChuLFwiXCIpLnJlcGxhY2UoXCIuXCIsXCIuP1wiKStcIiRcIixcImlcIiksdGhpcy5fbWluV2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKFwiXlwiK3RoaXMud2Vla2RheXNNaW4obixcIlwiKS5yZXBsYWNlKFwiLlwiLFwiLj9cIikrXCIkXCIsXCJpXCIpKSx0aGlzLl93ZWVrZGF5c1BhcnNlW29dfHwocz1cIl5cIit0aGlzLndlZWtkYXlzKG4sXCJcIikrXCJ8XlwiK3RoaXMud2Vla2RheXNTaG9ydChuLFwiXCIpK1wifF5cIit0aGlzLndlZWtkYXlzTWluKG4sXCJcIiksdGhpcy5fd2Vla2RheXNQYXJzZVtvXT1uZXcgUmVnRXhwKHMucmVwbGFjZShcIi5cIixcIlwiKSxcImlcIikpLGkmJlwiZGRkZFwiPT09ZSYmdGhpcy5fZnVsbFdlZWtkYXlzUGFyc2Vbb10udGVzdCh0KSlyZXR1cm4gbztpZihpJiZcImRkZFwiPT09ZSYmdGhpcy5fc2hvcnRXZWVrZGF5c1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG87aWYoaSYmXCJkZFwiPT09ZSYmdGhpcy5fbWluV2Vla2RheXNQYXJzZVtvXS50ZXN0KHQpKXJldHVybiBvO2lmKCFpJiZ0aGlzLl93ZWVrZGF5c1BhcnNlW29dLnRlc3QodCkpcmV0dXJuIG99fWZ1bmN0aW9uIEx0KHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9dD90aGlzOk5hTjt2YXIgZT10aGlzLl9pc1VUQz90aGlzLl9kLmdldFVUQ0RheSgpOnRoaXMuX2QuZ2V0RGF5KCk7cmV0dXJuIG51bGwhPXQ/KHQ9VHQodCx0aGlzLmxvY2FsZURhdGEoKSksdGhpcy5hZGQodC1lLFwiZFwiKSk6ZX1mdW5jdGlvbiBGdCh0KXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47dmFyIGU9KHRoaXMuZGF5KCkrNy10aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3cpJTc7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCh0LWUsXCJkXCIpfWZ1bmN0aW9uIEJ0KHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gbnVsbCE9dD90aGlzOk5hTjtpZihudWxsIT10KXt2YXIgZT1QdCh0LHRoaXMubG9jYWxlRGF0YSgpKTtyZXR1cm4gdGhpcy5kYXkodGhpcy5kYXkoKSU3P2U6ZS03KX1yZXR1cm4gdGhpcy5kYXkoKXx8N31mdW5jdGlvbiBqdCh0KXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhkKHRoaXMsXCJfd2Vla2RheXNSZWdleFwiKXx8WXQuY2FsbCh0aGlzKSx0P3RoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNSZWdleCk6KGQodGhpcyxcIl93ZWVrZGF5c1JlZ2V4XCIpfHwodGhpcy5fd2Vla2RheXNSZWdleD1FbiksdGhpcy5fd2Vla2RheXNTdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c1N0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzUmVnZXgpfWZ1bmN0aW9uIEh0KHQpe3JldHVybiB0aGlzLl93ZWVrZGF5c1BhcnNlRXhhY3Q/KGQodGhpcyxcIl93ZWVrZGF5c1JlZ2V4XCIpfHxZdC5jYWxsKHRoaXMpLHQ/dGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzU2hvcnRSZWdleCk6KGQodGhpcyxcIl93ZWVrZGF5c1Nob3J0UmVnZXhcIil8fCh0aGlzLl93ZWVrZGF5c1Nob3J0UmVnZXg9VG4pLHRoaXMuX3dlZWtkYXlzU2hvcnRTdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c1Nob3J0U3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4KX1mdW5jdGlvbiBXdCh0KXtyZXR1cm4gdGhpcy5fd2Vla2RheXNQYXJzZUV4YWN0PyhkKHRoaXMsXCJfd2Vla2RheXNSZWdleFwiKXx8WXQuY2FsbCh0aGlzKSx0P3RoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg6dGhpcy5fd2Vla2RheXNNaW5SZWdleCk6KGQodGhpcyxcIl93ZWVrZGF5c01pblJlZ2V4XCIpfHwodGhpcy5fd2Vla2RheXNNaW5SZWdleD1QbiksdGhpcy5fd2Vla2RheXNNaW5TdHJpY3RSZWdleCYmdD90aGlzLl93ZWVrZGF5c01pblN0cmljdFJlZ2V4OnRoaXMuX3dlZWtkYXlzTWluUmVnZXgpfWZ1bmN0aW9uIFl0KCl7ZnVuY3Rpb24gdCh0LGUpe3JldHVybiBlLmxlbmd0aC10Lmxlbmd0aH12YXIgZSxpLG8sbixzLHI9W10sYT1bXSxoPVtdLGQ9W107Zm9yKGU9MDtlPDc7ZSsrKWk9dShbMmUzLDFdKS5kYXkoZSksbz10aGlzLndlZWtkYXlzTWluKGksXCJcIiksbj10aGlzLndlZWtkYXlzU2hvcnQoaSxcIlwiKSxzPXRoaXMud2Vla2RheXMoaSxcIlwiKSxyLnB1c2gobyksYS5wdXNoKG4pLGgucHVzaChzKSxkLnB1c2gobyks
21167ZC5wdXNoKG4pLGQucHVzaChzKTtmb3Ioci5zb3J0KHQpLGEuc29ydCh0KSxoLnNvcnQodCksZC5zb3J0KHQpLGU9MDtlPDc7ZSsrKWFbZV09WihhW2VdKSxoW2VdPVooaFtlXSksZFtlXT1aKGRbZV0pO3RoaXMuX3dlZWtkYXlzUmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrZC5qb2luKFwifFwiKStcIilcIixcImlcIiksdGhpcy5fd2Vla2RheXNTaG9ydFJlZ2V4PXRoaXMuX3dlZWtkYXlzUmVnZXgsdGhpcy5fd2Vla2RheXNNaW5SZWdleD10aGlzLl93ZWVrZGF5c1JlZ2V4LHRoaXMuX3dlZWtkYXlzU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIraC5qb2luKFwifFwiKStcIilcIixcImlcIiksdGhpcy5fd2Vla2RheXNTaG9ydFN0cmljdFJlZ2V4PW5ldyBSZWdFeHAoXCJeKFwiK2Euam9pbihcInxcIikrXCIpXCIsXCJpXCIpLHRoaXMuX3dlZWtkYXlzTWluU3RyaWN0UmVnZXg9bmV3IFJlZ0V4cChcIl4oXCIrci5qb2luKFwifFwiKStcIilcIixcImlcIil9ZnVuY3Rpb24gR3QoKXtyZXR1cm4gdGhpcy5ob3VycygpJTEyfHwxMn1mdW5jdGlvbiBWdCgpe3JldHVybiB0aGlzLmhvdXJzKCl8fDI0fWZ1bmN0aW9uIFV0KHQsZSl7SCh0LDAsMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tZXJpZGllbSh0aGlzLmhvdXJzKCksdGhpcy5taW51dGVzKCksZSl9KX1mdW5jdGlvbiBxdCh0LGUpe3JldHVybiBlLl9tZXJpZGllbVBhcnNlfWZ1bmN0aW9uIFh0KHQpe3JldHVyblwicFwiPT09KHQrXCJcIikudG9Mb3dlckNhc2UoKS5jaGFyQXQoMCl9ZnVuY3Rpb24gWnQodCxlLGkpe3JldHVybiB0PjExP2k/XCJwbVwiOlwiUE1cIjppP1wiYW1cIjpcIkFNXCJ9ZnVuY3Rpb24gS3QodCl7cmV0dXJuIHQ/dC50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoXCJfXCIsXCItXCIpOnR9ZnVuY3Rpb24gSnQodCl7Zm9yKHZhciBlLGksbyxuLHM9MDtzPHQubGVuZ3RoOyl7Zm9yKG49S3QodFtzXSkuc3BsaXQoXCItXCIpLGU9bi5sZW5ndGgsaT1LdCh0W3MrMV0pLGk9aT9pLnNwbGl0KFwiLVwiKTpudWxsO2U+MDspe2lmKG89JHQobi5zbGljZSgwLGUpLmpvaW4oXCItXCIpKSlyZXR1cm4gbztpZihpJiZpLmxlbmd0aD49ZSYmdyhuLGksITApPj1lLTEpYnJlYWs7ZS0tfXMrK31yZXR1cm4gbnVsbH1mdW5jdGlvbiAkdChlKXt2YXIgaT1udWxsO2lmKCF6bltlXSYmdm9pZCAwIT09dCYmdCYmdC5leHBvcnRzKXRyeXtpPUluLl9hYmJyOyFmdW5jdGlvbigpe3ZhciB0PW5ldyBFcnJvcignQ2Fubm90IGZpbmQgbW9kdWxlIFwiLi9sb2NhbGVcIicpO3Rocm93IHQuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIix0fSgpLFF0KGkpfWNhdGNoKHQpe31yZXR1cm4gem5bZV19ZnVuY3Rpb24gUXQodCxlKXt2YXIgaTtyZXR1cm4gdCYmKGk9cyhlKT9pZSh0KTp0ZSh0LGUpKSYmKEluPWkpLEluLl9hYmJyfWZ1bmN0aW9uIHRlKHQsZSl7aWYobnVsbCE9PWUpe3ZhciBpPUFuO2lmKGUuYWJicj10LG51bGwhPXpuW3RdKVMoXCJkZWZpbmVMb2NhbGVPdmVycmlkZVwiLFwidXNlIG1vbWVudC51cGRhdGVMb2NhbGUobG9jYWxlTmFtZSwgY29uZmlnKSB0byBjaGFuZ2UgYW4gZXhpc3RpbmcgbG9jYWxlLiBtb21lbnQuZGVmaW5lTG9jYWxlKGxvY2FsZU5hbWUsIGNvbmZpZykgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgY3JlYXRpbmcgYSBuZXcgbG9jYWxlIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2RlZmluZS1sb2NhbGUvIGZvciBtb3JlIGluZm8uXCIpLGk9em5bdF0uX2NvbmZpZztlbHNlIGlmKG51bGwhPWUucGFyZW50TG9jYWxlKXtpZihudWxsPT16bltlLnBhcmVudExvY2FsZV0pcmV0dXJuIExuW2UucGFyZW50TG9jYWxlXXx8KExuW2UucGFyZW50TG9jYWxlXT1bXSksTG5bZS5wYXJlbnRMb2NhbGVdLnB1c2goe25hbWU6dCxjb25maWc6ZX0pLG51bGw7aT16bltlLnBhcmVudExvY2FsZV0uX2NvbmZpZ31yZXR1cm4gem5bdF09bmV3IE8oQyhpLGUpKSxMblt0XSYmTG5bdF0uZm9yRWFjaChmdW5jdGlvbih0KXt0ZSh0Lm5hbWUsdC5jb25maWcpfSksUXQodCksem5bdF19cmV0dXJuIGRlbGV0ZSB6blt0XSxudWxsfWZ1bmN0aW9uIGVlKHQsZSl7aWYobnVsbCE9ZSl7dmFyIGksbz1BbjtudWxsIT16blt0XSYmKG89em5bdF0uX2NvbmZpZyksZT1DKG8sZSksaT1uZXcgTyhlKSxpLnBhcmVudExvY2FsZT16blt0XSx6blt0XT1pLFF0KHQpfWVsc2UgbnVsbCE9em5bdF0mJihudWxsIT16blt0XS5wYXJlbnRMb2NhbGU/em5bdF09em5bdF0ucGFyZW50TG9jYWxlOm51bGwhPXpuW3RdJiZkZWxldGUgem5bdF0pO3JldHVybiB6blt0XX1mdW5jdGlvbiBpZSh0KXt2YXIgZTtpZih0JiZ0Ll9sb2NhbGUmJnQuX2xvY2FsZS5fYWJiciYmKHQ9dC5fbG9jYWxlLl9hYmJyKSwhdClyZXR1cm4gSW47aWYoIWkodCkpe2lmKGU9JHQodCkpcmV0dXJuIGU7dD1bdF19cmV0dXJuIEp0KHQpfWZ1bmN0aW9uIG9lKCl7cmV0dXJuIElvKHpuKX1mdW5jdGlvbiBuZSh0KXt2YXIgZSxpPXQuX2E7cmV0dXJuIGkmJi0yPT09cCh0KS5vdmVyZmxvdyYmKGU9aVtsbl08MHx8aVtsbl0+MTE/bG46aVt1bl08MXx8aVt1bl0+aHQoaVtkbl0saVtsbl0pP3VuOmlbY25dPDB8fGlbY25dPjI0fHwyND09PWlbY25dJiYoMCE9PWlbcG5dfHwwIT09aVtmbl18fDAhPT1pW21uXSk/Y246aVtwbl08MHx8aVtwbl0+NTk/cG46aVtmbl08MHx8aVtmbl0+NTk/Zm46aVttbl08MHx8aVttbl0+OTk5P21uOi0xLHAodCkuX292ZXJmbG93RGF5T2ZZZWFyJiYoZTxkbnx8ZT51bikmJihlPXVuKSxwKHQpLl9vdmVyZmxvd1dlZWtzJiYtMT09PWUmJihlPXZuKSxwKHQpLl9vdmVyZmxvd1dlZWtkYXkmJi0xPT09ZSYmKGU9Z24pLHAodCkub3ZlcmZsb3c9ZSksdH1mdW5jdGlvbiBzZSh0LGUsaSl7cmV0dXJuIG51bGwhPXQ/dDpudWxsIT1lP2U6aX1mdW5jdGlvbiByZSh0KXt2YXIgaT1uZXcgRGF0ZShlLm5vdygpKTtyZXR1cm4gdC5fdXNlVVRDP1tpLmdldFVUQ0Z1bGxZZWFyKCksaS5nZXRVVENNb250aCgpLGkuZ2V0VVRDRGF0ZSgpXTpbaS5nZXRGdWxsWWVhcigpLGkuZ2V0TW9udGgoKSxpLmdldERhdGUoKV19ZnVuY3Rpb24gYWUodCl7dmFyIGUsaSxvLG4scz1bXTtpZighdC5fZCl7Zm9yKG89cmUodCksdC5fdyYmbnVsbD09dC5fYVt1bl0mJm51bGw9PXQuX2FbbG5dJiZoZSh0KSxudWxsIT10Ll9kYXlPZlllYXImJihuPXNlKHQuX2FbZG5dLG9bZG5dKSwodC5fZGF5T2ZZZWFyPlEobil8fDA9PT10Ll9kYXlPZlllYXIpJiYocCh0KS5fb3ZlcmZsb3dEYXlPZlllYXI9ITApLGk9X3QobiwwLHQuX2RheU9mWWVhciksdC5fYVtsbl09aS5nZXRVVENNb250aCgpLHQuX2FbdW5dPWkuZ2V0VVRDRGF0ZSgpKSxlPTA7ZTwzJiZudWxsPT10Ll9hW2VdOysrZSl0Ll9hW2VdPXNbZV09b1tlXTtmb3IoO2U8NztlKyspdC5fYVtlXT1zW2VdPW51bGw9PXQuX2FbZV0/Mj09PWU/MTowOnQuX2FbZV07MjQ9PT10Ll9hW2NuXSYmMD09PXQuX2FbcG5dJiYwPT09dC5fYVtmbl0mJjA9PT10Ll9hW21uXSYmKHQuX25leHREYXk9ITAsdC5fYVtjbl09MCksdC5fZD0odC5fdXNlVVRDP190OmJ0KS5hcHBseShudWxsLHMpLG51bGwhPXQuX3R6bSYmdC5fZC5zZXRVVENNaW51dGVzKHQuX2QuZ2V0VVRDTWludXRlcygpLXQuX3R6bSksdC5fbmV4dERheSYmKHQuX2FbY25dPTI0KSx0Ll93JiZ2b2lkIDAhPT10Ll93LmQmJnQuX3cuZCE9PXQuX2QuZ2V0RGF5KCkmJihwKHQpLndlZWtkYXlNaXNtYX
21167RjaD0hMCl9fWZ1bmN0aW9uIGhlKHQpe3ZhciBlLGksbyxuLHMscixhLGg7aWYoZT10Ll93LG51bGwhPWUuR0d8fG51bGwhPWUuV3x8bnVsbCE9ZS5FKXM9MSxyPTQsaT1zZShlLkdHLHQuX2FbZG5dLGt0KERlKCksMSw0KS55ZWFyKSxvPXNlKGUuVywxKSwoKG49c2UoZS5FLDEpKTwxfHxuPjcpJiYoaD0hMCk7ZWxzZXtzPXQuX2xvY2FsZS5fd2Vlay5kb3cscj10Ll9sb2NhbGUuX3dlZWsuZG95O3ZhciBkPWt0KERlKCkscyxyKTtpPXNlKGUuZ2csdC5fYVtkbl0sZC55ZWFyKSxvPXNlKGUudyxkLndlZWspLG51bGwhPWUuZD8oKG49ZS5kKTwwfHxuPjYpJiYoaD0hMCk6bnVsbCE9ZS5lPyhuPWUuZStzLChlLmU8MHx8ZS5lPjYpJiYoaD0hMCkpOm49c31vPDF8fG8+U3QoaSxzLHIpP3AodCkuX292ZXJmbG93V2Vla3M9ITA6bnVsbCE9aD9wKHQpLl9vdmVyZmxvd1dlZWtkYXk9ITA6KGE9eHQoaSxvLG4scyxyKSx0Ll9hW2RuXT1hLnllYXIsdC5fZGF5T2ZZZWFyPWEuZGF5T2ZZZWFyKX1mdW5jdGlvbiBkZSh0KXt2YXIgZSxpLG8sbixzLHIsYT10Ll9pLGg9Rm4uZXhlYyhhKXx8Qm4uZXhlYyhhKTtpZihoKXtmb3IocCh0KS5pc289ITAsZT0wLGk9SG4ubGVuZ3RoO2U8aTtlKyspaWYoSG5bZV1bMV0uZXhlYyhoWzFdKSl7bj1IbltlXVswXSxvPSExIT09SG5bZV1bMl07YnJlYWt9aWYobnVsbD09bilyZXR1cm4gdm9pZCh0Ll9pc1ZhbGlkPSExKTtpZihoWzNdKXtmb3IoZT0wLGk9V24ubGVuZ3RoO2U8aTtlKyspaWYoV25bZV1bMV0uZXhlYyhoWzNdKSl7cz0oaFsyXXx8XCIgXCIpK1duW2VdWzBdO2JyZWFrfWlmKG51bGw9PXMpcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSl9aWYoIW8mJm51bGwhPXMpcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSk7aWYoaFs0XSl7aWYoIWpuLmV4ZWMoaFs0XSkpcmV0dXJuIHZvaWQodC5faXNWYWxpZD0hMSk7cj1cIlpcIn10Ll9mPW4rKHN8fFwiXCIpKyhyfHxcIlwiKSxnZSh0KX1lbHNlIHQuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gbGUodCxlLGksbyxuLHMpe3ZhciByPVt1ZSh0KSx4bi5pbmRleE9mKGUpLHBhcnNlSW50KGksMTApLHBhcnNlSW50KG8sMTApLHBhcnNlSW50KG4sMTApXTtyZXR1cm4gcyYmci5wdXNoKHBhcnNlSW50KHMsMTApKSxyfWZ1bmN0aW9uIHVlKHQpe3ZhciBlPXBhcnNlSW50KHQsMTApO3JldHVybiBlPD00OT8yZTMrZTplPD05OTk/MTkwMCtlOmV9ZnVuY3Rpb24gY2UodCl7cmV0dXJuIHQucmVwbGFjZSgvXFwoW14pXSpcXCl8W1xcblxcdF0vZyxcIiBcIikucmVwbGFjZSgvKFxcc1xccyspL2csXCIgXCIpLnRyaW0oKX1mdW5jdGlvbiBwZSh0LGUsaSl7aWYodCl7aWYoQ24uaW5kZXhPZih0KSE9PW5ldyBEYXRlKGVbMF0sZVsxXSxlWzJdKS5nZXREYXkoKSlyZXR1cm4gcChpKS53ZWVrZGF5TWlzbWF0Y2g9ITAsaS5faXNWYWxpZD0hMSwhMX1yZXR1cm4hMH1mdW5jdGlvbiBmZSh0LGUsaSl7aWYodClyZXR1cm4gVm5bdF07aWYoZSlyZXR1cm4gMDt2YXIgbz1wYXJzZUludChpLDEwKSxuPW8lMTAwO3JldHVybihvLW4pLzEwMCo2MCtufWZ1bmN0aW9uIG1lKHQpe3ZhciBlPUduLmV4ZWMoY2UodC5faSkpO2lmKGUpe3ZhciBpPWxlKGVbNF0sZVszXSxlWzJdLGVbNV0sZVs2XSxlWzddKTtpZighcGUoZVsxXSxpLHQpKXJldHVybjt0Ll9hPWksdC5fdHptPWZlKGVbOF0sZVs5XSxlWzEwXSksdC5fZD1fdC5hcHBseShudWxsLHQuX2EpLHQuX2Quc2V0VVRDTWludXRlcyh0Ll9kLmdldFVUQ01pbnV0ZXMoKS10Ll90em0pLHAodCkucmZjMjgyMj0hMH1lbHNlIHQuX2lzVmFsaWQ9ITF9ZnVuY3Rpb24gdmUodCl7dmFyIGk9WW4uZXhlYyh0Ll9pKTtpZihudWxsIT09aSlyZXR1cm4gdm9pZCh0Ll9kPW5ldyBEYXRlKCtpWzFdKSk7ZGUodCksITE9PT10Ll9pc1ZhbGlkJiYoZGVsZXRlIHQuX2lzVmFsaWQsbWUodCksITE9PT10Ll9pc1ZhbGlkJiYoZGVsZXRlIHQuX2lzVmFsaWQsZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayh0KSkpfWZ1bmN0aW9uIGdlKHQpe2lmKHQuX2Y9PT1lLklTT184NjAxKXJldHVybiB2b2lkIGRlKHQpO2lmKHQuX2Y9PT1lLlJGQ18yODIyKXJldHVybiB2b2lkIG1lKHQpO3QuX2E9W10scCh0KS5lbXB0eT0hMDt2YXIgaSxvLG4scyxyLGE9XCJcIit0Ll9pLGg9YS5sZW5ndGgsZD0wO2ZvcihuPVYodC5fZix0Ll9sb2NhbGUpLm1hdGNoKEJvKXx8W10saT0wO2k8bi5sZW5ndGg7aSsrKXM9bltpXSxvPShhLm1hdGNoKHEocyx0KSl8fFtdKVswXSxvJiYocj1hLnN1YnN0cigwLGEuaW5kZXhPZihvKSksci5sZW5ndGg+MCYmcCh0KS51bnVzZWRJbnB1dC5wdXNoKHIpLGE9YS5zbGljZShhLmluZGV4T2Yobykrby5sZW5ndGgpLGQrPW8ubGVuZ3RoKSxXb1tzXT8obz9wKHQpLmVtcHR5PSExOnAodCkudW51c2VkVG9rZW5zLnB1c2gocyksJChzLG8sdCkpOnQuX3N0cmljdCYmIW8mJnAodCkudW51c2VkVG9rZW5zLnB1c2gocyk7cCh0KS5jaGFyc0xlZnRPdmVyPWgtZCxhLmxlbmd0aD4wJiZwKHQpLnVudXNlZElucHV0LnB1c2goYSksdC5fYVtjbl08PTEyJiYhMD09PXAodCkuYmlnSG91ciYmdC5fYVtjbl0+MCYmKHAodCkuYmlnSG91cj12b2lkIDApLHAodCkucGFyc2VkRGF0ZVBhcnRzPXQuX2Euc2xpY2UoMCkscCh0KS5tZXJpZGllbT10Ll9tZXJpZGllbSx0Ll9hW2NuXT15ZSh0Ll9sb2NhbGUsdC5fYVtjbl0sdC5fbWVyaWRpZW0pLGFlKHQpLG5lKHQpfWZ1bmN0aW9uIHllKHQsZSxpKXt2YXIgbztyZXR1cm4gbnVsbD09aT9lOm51bGwhPXQubWVyaWRpZW1Ib3VyP3QubWVyaWRpZW1Ib3VyKGUsaSk6bnVsbCE9dC5pc1BNPyhvPXQuaXNQTShpKSxvJiZlPDEyJiYoZSs9MTIpLG98fDEyIT09ZXx8KGU9MCksZSk6ZX1mdW5jdGlvbiBiZSh0KXt2YXIgZSxpLG8sbixzO2lmKDA9PT10Ll9mLmxlbmd0aClyZXR1cm4gcCh0KS5pbnZhbGlkRm9ybWF0PSEwLHZvaWQodC5fZD1uZXcgRGF0ZShOYU4pKTtmb3Iobj0wO248dC5fZi5sZW5ndGg7bisrKXM9MCxlPXYoe30sdCksbnVsbCE9dC5fdXNlVVRDJiYoZS5fdXNlVVRDPXQuX3VzZVVUQyksZS5fZj10Ll9mW25dLGdlKGUpLGYoZSkmJihzKz1wKGUpLmNoYXJzTGVmdE92ZXIscys9MTAqcChlKS51bnVzZWRUb2tlbnMubGVuZ3RoLHAoZSkuc2Nvcm
21167U9cywobnVsbD09b3x8czxvKSYmKG89cyxpPWUpKTtsKHQsaXx8ZSl9ZnVuY3Rpb24gX2UodCl7aWYoIXQuX2Qpe3ZhciBlPUwodC5faSk7dC5fYT1oKFtlLnllYXIsZS5tb250aCxlLmRheXx8ZS5kYXRlLGUuaG91cixlLm1pbnV0ZSxlLnNlY29uZCxlLm1pbGxpc2Vjb25kXSxmdW5jdGlvbih0KXtyZXR1cm4gdCYmcGFyc2VJbnQodCwxMCl9KSxhZSh0KX19ZnVuY3Rpb24gd2UodCl7dmFyIGU9bmV3IGcobmUoeGUodCkpKTtyZXR1cm4gZS5fbmV4dERheSYmKGUuYWRkKDEsXCJkXCIpLGUuX25leHREYXk9dm9pZCAwKSxlfWZ1bmN0aW9uIHhlKHQpe3ZhciBlPXQuX2ksbz10Ll9mO3JldHVybiB0Ll9sb2NhbGU9dC5fbG9jYWxlfHxpZSh0Ll9sKSxudWxsPT09ZXx8dm9pZCAwPT09byYmXCJcIj09PWU/bSh7bnVsbElucHV0OiEwfSk6KFwic3RyaW5nXCI9PXR5cGVvZiBlJiYodC5faT1lPXQuX2xvY2FsZS5wcmVwYXJzZShlKSkseShlKT9uZXcgZyhuZShlKSk6KGEoZSk/dC5fZD1lOmkobyk/YmUodCk6bz9nZSh0KTprZSh0KSxmKHQpfHwodC5fZD1udWxsKSx0KSl9ZnVuY3Rpb24ga2UodCl7dmFyIG49dC5faTtzKG4pP3QuX2Q9bmV3IERhdGUoZS5ub3coKSk6YShuKT90Ll9kPW5ldyBEYXRlKG4udmFsdWVPZigpKTpcInN0cmluZ1wiPT10eXBlb2Ygbj92ZSh0KTppKG4pPyh0Ll9hPWgobi5zbGljZSgwKSxmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9KSxhZSh0KSk6byhuKT9fZSh0KTpyKG4pP3QuX2Q9bmV3IERhdGUobik6ZS5jcmVhdGVGcm9tSW5wdXRGYWxsYmFjayh0KX1mdW5jdGlvbiBTZSh0LGUscyxyLGEpe3ZhciBoPXt9O3JldHVybiEwIT09cyYmITEhPT1zfHwocj1zLHM9dm9pZCAwKSwobyh0KSYmbih0KXx8aSh0KSYmMD09PXQubGVuZ3RoKSYmKHQ9dm9pZCAwKSxoLl9pc0FNb21lbnRPYmplY3Q9ITAsaC5fdXNlVVRDPWguX2lzVVRDPWEsaC5fbD1zLGguX2k9dCxoLl9mPWUsaC5fc3RyaWN0PXIsd2UoaCl9ZnVuY3Rpb24gRGUodCxlLGksbyl7cmV0dXJuIFNlKHQsZSxpLG8sITEpfWZ1bmN0aW9uIE1lKHQsZSl7dmFyIG8sbjtpZigxPT09ZS5sZW5ndGgmJmkoZVswXSkmJihlPWVbMF0pLCFlLmxlbmd0aClyZXR1cm4gRGUoKTtmb3Iobz1lWzBdLG49MTtuPGUubGVuZ3RoOysrbillW25dLmlzVmFsaWQoKSYmIWVbbl1bdF0obyl8fChvPWVbbl0pO3JldHVybiBvfWZ1bmN0aW9uIENlKCl7cmV0dXJuIE1lKFwiaXNCZWZvcmVcIixbXS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKSl9ZnVuY3Rpb24gT2UoKXtyZXR1cm4gTWUoXCJpc0FmdGVyXCIsW10uc2xpY2UuY2FsbChhcmd1bWVudHMsMCkpfWZ1bmN0aW9uIEVlKHQpe2Zvcih2YXIgZSBpbiB0KWlmKC0xPT09eW4uY2FsbChabixlKXx8bnVsbCE9dFtlXSYmaXNOYU4odFtlXSkpcmV0dXJuITE7Zm9yKHZhciBpPSExLG89MDtvPFpuLmxlbmd0aDsrK28paWYodFtabltvXV0pe2lmKGkpcmV0dXJuITE7cGFyc2VGbG9hdCh0W1puW29dXSkhPT1fKHRbWm5bb11dKSYmKGk9ITApfXJldHVybiEwfWZ1bmN0aW9uIFRlKCl7cmV0dXJuIHRoaXMuX2lzVmFsaWR9ZnVuY3Rpb24gUGUoKXtyZXR1cm4gS2UoTmFOKX1mdW5jdGlvbiBJZSh0KXt2YXIgZT1MKHQpLGk9ZS55ZWFyfHwwLG89ZS5xdWFydGVyfHwwLG49ZS5tb250aHx8MCxzPWUud2Vla3x8MCxyPWUuZGF5fHwwLGE9ZS5ob3VyfHwwLGg9ZS5taW51dGV8fDAsZD1lLnNlY29uZHx8MCxsPWUubWlsbGlzZWNvbmR8fDA7dGhpcy5faXNWYWxpZD1FZShlKSx0aGlzLl9taWxsaXNlY29uZHM9K2wrMWUzKmQrNmU0KmgrMWUzKmEqNjAqNjAsdGhpcy5fZGF5cz0rcis3KnMsdGhpcy5fbW9udGhzPStuKzMqbysxMippLHRoaXMuX2RhdGE9e30sdGhpcy5fbG9jYWxlPWllKCksdGhpcy5fYnViYmxlKCl9ZnVuY3Rpb24gTmUodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBJZX1mdW5jdGlvbiBSZSh0KXtyZXR1cm4gdDwwPy0xKk1hdGgucm91bmQoLTEqdCk6TWF0aC5yb3VuZCh0KX1mdW5jdGlvbiBBZSh0LGUpe0godCwwLDAsZnVuY3Rpb24oKXt2YXIgdD10aGlzLnV0Y09mZnNldCgpLGk9XCIrXCI7cmV0dXJuIHQ8MCYmKHQ9LXQsaT1cIi1cIiksaStqKH5+KHQvNjApLDIpK2Uraih+fnQlNjAsMil9KX1mdW5jdGlvbiB6ZSh0LGUpe3ZhciBpPShlfHxcIlwiKS5tYXRjaCh0KTtpZihudWxsPT09aSlyZXR1cm4gbnVsbDt2YXIgbz1pW2kubGVuZ3RoLTFdfHxbXSxuPShvK1wiXCIpLm1hdGNoKEtuKXx8W1wiLVwiLDAsMF0scz02MCpuWzFdK18oblsyXSk7cmV0dXJuIDA9PT1zPzA6XCIrXCI9PT1uWzBdP3M6LXN9ZnVuY3Rpb24gTGUodCxpKXt2YXIgbyxuO3JldHVybiBpLl9pc1VUQz8obz1pLmNsb25lKCksbj0oeSh0KXx8YSh0KT90LnZhbHVlT2YoKTpEZSh0KS52YWx1ZU9mKCkpLW8udmFsdWVPZigpLG8uX2Quc2V0VGltZShvLl9kLnZhbHVlT2YoKStuKSxlLnVwZGF0ZU9mZnNldChvLCExKSxvKTpEZSh0KS5sb2NhbCgpfWZ1bmN0aW9uIEZlKHQpe3JldHVybiAxNSotTWF0aC5yb3VuZCh0Ll9kLmdldFRpbWV6b25lT2Zmc2V0KCkvMTUpfWZ1bmN0aW9uIEJlKHQsaSxvKXt2YXIgbixzPXRoaXMuX29mZnNldHx8MDtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGwhPXQ/dGhpczpOYU47aWYobnVsbCE9dCl7aWYoXCJzdHJpbmdcIj09dHlwZW9mIHQpe2lmKG51bGw9PT0odD16ZShubix0KSkpcmV0dXJuIHRoaXN9ZWxzZSBNYXRoLmFicyh0KTwxNiYmIW8mJih0Kj02MCk7cmV0dXJuIXRoaXMuX2lzVVRDJiZpJiYobj1GZSh0aGlzKSksdGhpcy5fb2Zmc2V0PXQsdGhpcy5faXNVVEM9ITAsbnVsbCE9biYmdGhpcy5hZGQobixcIm1cIikscyE9PXQmJighaXx8dGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz9laSh0aGlzLEtlKHQtcyxcIm1cIiksMSwhMSk6dGhpcy5fY2hhbmdlSW5Qcm9ncmVzc3x8KHRoaXMuX2NoYW5nZUluUHJvZ3Jlc3M9ITAsZS51cGRhdGVPZmZzZXQodGhpcywhMCksdGhpcy5fY2hhbmdlSW5Qcm9ncmVzcz1udWxsKSksdGhpc31yZXR1cm4gdGhpcy5faXNVVEM/czpGZSh0aGlzKX1mdW5jdGlvbiBqZSh0LGUpe3JldHVybiBudWxsIT10PyhcInN0cmluZ1wiIT10eXBlb2YgdCYmKHQ9LXQpLHRoaXMudXRjT2Zmc2V0KHQsZSksdGhpcyk6LXRoaXMudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gSGUodCl7cmV0dXJuIHRoaXMudXRjT2Zmc2V0KDAsdCl9ZnVuY3Rpb24gV2UodCl7cmV0dXJuIHRoaXMuX2lzVVRDJiYodGhpcy51dGNPZmZzZXQoMCx0KSx0aGlzLl9pc1VUQz0hMSx0JiZ0aGlzLnN1YnRyYWN0KEZlKHRoaXMpLFwibVwiKSksdGhpc31mdW5jdGlvbiBZZSgpe2lmKG51bGwhPXRoaXMuX3R6bSl0aGlzLnV0Y09mZnNldCh0aGlzLl90em0sITEsITApO2Vsc2UgaWYoXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuX2kpe3ZhciB0PXplKG9uLHR
21167oaXMuX2kpO251bGwhPXQ/dGhpcy51dGNPZmZzZXQodCk6dGhpcy51dGNPZmZzZXQoMCwhMCl9cmV0dXJuIHRoaXN9ZnVuY3Rpb24gR2UodCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmKHQ9dD9EZSh0KS51dGNPZmZzZXQoKTowLCh0aGlzLnV0Y09mZnNldCgpLXQpJTYwPT0wKX1mdW5jdGlvbiBWZSgpe3JldHVybiB0aGlzLnV0Y09mZnNldCgpPnRoaXMuY2xvbmUoKS5tb250aCgwKS51dGNPZmZzZXQoKXx8dGhpcy51dGNPZmZzZXQoKT50aGlzLmNsb25lKCkubW9udGgoNSkudXRjT2Zmc2V0KCl9ZnVuY3Rpb24gVWUoKXtpZighcyh0aGlzLl9pc0RTVFNoaWZ0ZWQpKXJldHVybiB0aGlzLl9pc0RTVFNoaWZ0ZWQ7dmFyIHQ9e307aWYodih0LHRoaXMpLHQ9eGUodCksdC5fYSl7dmFyIGU9dC5faXNVVEM/dSh0Ll9hKTpEZSh0Ll9hKTt0aGlzLl9pc0RTVFNoaWZ0ZWQ9dGhpcy5pc1ZhbGlkKCkmJncodC5fYSxlLnRvQXJyYXkoKSk+MH1lbHNlIHRoaXMuX2lzRFNUU2hpZnRlZD0hMTtyZXR1cm4gdGhpcy5faXNEU1RTaGlmdGVkfWZ1bmN0aW9uIHFlKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmIXRoaXMuX2lzVVRDfWZ1bmN0aW9uIFhlKCl7cmV0dXJuISF0aGlzLmlzVmFsaWQoKSYmdGhpcy5faXNVVEN9ZnVuY3Rpb24gWmUoKXtyZXR1cm4hIXRoaXMuaXNWYWxpZCgpJiYodGhpcy5faXNVVEMmJjA9PT10aGlzLl9vZmZzZXQpfWZ1bmN0aW9uIEtlKHQsZSl7dmFyIGksbyxuLHM9dCxhPW51bGw7cmV0dXJuIE5lKHQpP3M9e21zOnQuX21pbGxpc2Vjb25kcyxkOnQuX2RheXMsTTp0Ll9tb250aHN9OnIodCk/KHM9e30sZT9zW2VdPXQ6cy5taWxsaXNlY29uZHM9dCk6KGE9Sm4uZXhlYyh0KSk/KGk9XCItXCI9PT1hWzFdPy0xOjEscz17eTowLGQ6XyhhW3VuXSkqaSxoOl8oYVtjbl0pKmksbTpfKGFbcG5dKSppLHM6XyhhW2ZuXSkqaSxtczpfKFJlKDFlMyphW21uXSkpKml9KTooYT0kbi5leGVjKHQpKT8oaT1cIi1cIj09PWFbMV0/LTE6KGFbMV0sMSkscz17eTpKZShhWzJdLGkpLE06SmUoYVszXSxpKSx3OkplKGFbNF0saSksZDpKZShhWzVdLGkpLGg6SmUoYVs2XSxpKSxtOkplKGFbN10saSksczpKZShhWzhdLGkpfSk6bnVsbD09cz9zPXt9Olwib2JqZWN0XCI9PXR5cGVvZiBzJiYoXCJmcm9tXCJpbiBzfHxcInRvXCJpbiBzKSYmKG49UWUoRGUocy5mcm9tKSxEZShzLnRvKSkscz17fSxzLm1zPW4ubWlsbGlzZWNvbmRzLHMuTT1uLm1vbnRocyksbz1uZXcgSWUocyksTmUodCkmJmQodCxcIl9sb2NhbGVcIikmJihvLl9sb2NhbGU9dC5fbG9jYWxlKSxvfWZ1bmN0aW9uIEplKHQsZSl7dmFyIGk9dCYmcGFyc2VGbG9hdCh0LnJlcGxhY2UoXCIsXCIsXCIuXCIpKTtyZXR1cm4oaXNOYU4oaSk/MDppKSplfWZ1bmN0aW9uICRlKHQsZSl7dmFyIGk9e21pbGxpc2Vjb25kczowLG1vbnRoczowfTtyZXR1cm4gaS5tb250aHM9ZS5tb250aCgpLXQubW9udGgoKSsxMiooZS55ZWFyKCktdC55ZWFyKCkpLHQuY2xvbmUoKS5hZGQoaS5tb250aHMsXCJNXCIpLmlzQWZ0ZXIoZSkmJi0taS5tb250aHMsaS5taWxsaXNlY29uZHM9K2UtK3QuY2xvbmUoKS5hZGQoaS5tb250aHMsXCJNXCIpLGl9ZnVuY3Rpb24gUWUodCxlKXt2YXIgaTtyZXR1cm4gdC5pc1ZhbGlkKCkmJmUuaXNWYWxpZCgpPyhlPUxlKGUsdCksdC5pc0JlZm9yZShlKT9pPSRlKHQsZSk6KGk9JGUoZSx0KSxpLm1pbGxpc2Vjb25kcz0taS5taWxsaXNlY29uZHMsaS5tb250aHM9LWkubW9udGhzKSxpKTp7bWlsbGlzZWNvbmRzOjAsbW9udGhzOjB9fWZ1bmN0aW9uIHRpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKGksbyl7dmFyIG4scztyZXR1cm4gbnVsbD09PW98fGlzTmFOKCtvKXx8KFMoZSxcIm1vbWVudCgpLlwiK2UrXCIocGVyaW9kLCBudW1iZXIpIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgbW9tZW50KCkuXCIrZStcIihudW1iZXIsIHBlcmlvZCkuIFNlZSBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL2FkZC1pbnZlcnRlZC1wYXJhbS8gZm9yIG1vcmUgaW5mby5cIikscz1pLGk9byxvPXMpLGk9XCJzdHJpbmdcIj09dHlwZW9mIGk/K2k6aSxuPUtlKGksbyksZWkodGhpcyxuLHQpLHRoaXN9fWZ1bmN0aW9uIGVpKHQsaSxvLG4pe3ZhciBzPWkuX21pbGxpc2Vjb25kcyxyPVJlKGkuX2RheXMpLGE9UmUoaS5fbW9udGhzKTt0LmlzVmFsaWQoKSYmKG49bnVsbD09bnx8b
21167ixhJiZwdCh0LG90KHQsXCJNb250aFwiKSthKm8pLHImJm50KHQsXCJEYXRlXCIsb3QodCxcIkRhdGVcIikrcipvKSxzJiZ0Ll9kLnNldFRpbWUodC5fZC52YWx1ZU9mKCkrcypvKSxuJiZlLnVwZGF0ZU9mZnNldCh0LHJ8fGEpKX1mdW5jdGlvbiBpaSh0LGUpe3ZhciBpPXQuZGlmZihlLFwiZGF5c1wiLCEwKTtyZXR1cm4gaTwtNj9cInNhbWVFbHNlXCI6aTwtMT9cImxhc3RXZWVrXCI6aTwwP1wibGFzdERheVwiOmk8MT9cInNhbWVEYXlcIjppPDI/XCJuZXh0RGF5XCI6aTw3P1wibmV4dFdlZWtcIjpcInNhbWVFbHNlXCJ9ZnVuY3Rpb24gb2kodCxpKXt2YXIgbz10fHxEZSgpLG49TGUobyx0aGlzKS5zdGFydE9mKFwiZGF5XCIpLHM9ZS5jYWxlbmRhckZvcm1hdCh0aGlzLG4pfHxcInNhbWVFbHNlXCIscj1pJiYoRChpW3NdKT9pW3NdLmNhbGwodGhpcyxvKTppW3NdKTtyZXR1cm4gdGhpcy5mb3JtYXQocnx8dGhpcy5sb2NhbGVEYXRhKCkuY2FsZW5kYXIocyx0aGlzLERlKG8pKSl9ZnVuY3Rpb24gbmkoKXtyZXR1cm4gbmV3IGcodGhpcyl9ZnVuY3Rpb24gc2kodCxlKXt2YXIgaT15KHQpP3Q6RGUodCk7cmV0dXJuISghdGhpcy5pc1ZhbGlkKCl8fCFpLmlzVmFsaWQoKSkmJihlPXoocyhlKT9cIm1pbGxpc2Vjb25kXCI6ZSksXCJtaWxsaXNlY29uZFwiPT09ZT90aGlzLnZhbHVlT2YoKT5pLnZhbHVlT2YoKTppLnZhbHVlT2YoKTx0aGlzLmNsb25lKCkuc3RhcnRPZihlKS52YWx1ZU9mKCkpfWZ1bmN0aW9uIHJpKHQsZSl7dmFyIGk9eSh0KT90OkRlKHQpO3JldHVybiEoIXRoaXMuaXNWYWxpZCgpfHwhaS5pc1ZhbGlkKCkpJiYoZT16KHMoZSk/XCJtaWxsaXNlY29uZFwiOmUpLFwibWlsbGlzZWNvbmRcIj09PWU/dGhpcy52YWx1ZU9mKCk8aS52YWx1ZU9mKCk6dGhpcy5jbG9uZSgpLmVuZE9mKGUpLnZhbHVlT2YoKTxpLnZhbHVlT2YoKSl9ZnVuY3Rpb24gYWkodCxlLGksbyl7cmV0dXJuIG89b3x8XCIoKVwiLChcIihcIj09PW9bMF0/dGhpcy5pc0FmdGVyKHQsaSk6IXRoaXMuaXNCZWZvcmUodCxpKSkmJihcIilcIj09PW9bMV0/dGhpcy5pc0JlZm9yZShlLGkpOiF0aGlzLmlzQWZ0ZXIoZSxpKSl9ZnVuY3Rpb24gaGkodCxlKXt2YXIgaSxvPXkodCk/dDpEZSh0KTtyZXR1cm4hKCF0aGlzLmlzVmFsaWQoKXx8IW8uaXNWYWxpZCgpKSYmKGU9eihlfHxcIm1pbGxpc2Vjb25kXCIpLFwibWlsbGlzZWNvbmRcIj09PWU/dGhpcy52YWx1ZU9mKCk9PT1vLnZhbHVlT2YoKTooaT1vLnZhbHVlT2YoKSx0aGlzLmNsb25lKCkuc3RhcnRPZihlKS52YWx1ZU9mKCk8PWkmJmk8PXRoaXMuY2xvbmUoKS5lbmRPZihlKS52YWx1ZU9mKCkpKX1mdW5jdGlvbiBkaSh0LGUpe3JldHVybiB0aGlzLmlzU2FtZSh0LGUpfHx0aGlzLmlzQWZ0ZXIodCxlKX1mdW5jdGlvbiBsaSh0LGUpe3JldHVybiB0aGlzLmlzU2FtZSh0LGUpfHx0aGlzLmlzQmVmb3JlKHQsZSl9ZnVuY3Rpb24gdWkodCxlLGkpe3ZhciBvLG4scztpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIE5hTjtpZihvPUxlKHQsdGhpcyksIW8uaXNWYWxpZCgpKXJldHVybiBOYU47c3dpdGNoKG49NmU0KihvLnV0Y09mZnNldCgpLXRoaXMudXRjT2Zmc2V0KCkpLGU9eihlKSl7Y2FzZVwieWVhclwiOnM9Y2kodGhpcyxvKS8xMjticmVhaztjYXNlXCJtb250aFwiOnM9Y2kodGhpcyxvKTticmVhaztjYXNlXCJxdWFydGVyXCI6cz1jaSh0aGlzLG8pLzM7YnJlYWs7Y2FzZVwic2Vjb25kXCI6cz0odGhpcy1vKS8xZTM7YnJlYWs7Y2FzZVwibWludXRlXCI6cz0odGhpcy1vKS82ZTQ7YnJlYWs7Y2FzZVwiaG91clwiOnM9KHRoaXMtbykvMzZlNTticmVhaztjYXNlXCJkYXlcIjpzPSh0aGlzLW8tbikvODY0ZTU7YnJlYWs7Y2FzZVwid2Vla1wiOnM9KHRoaXMtby1uKS82MDQ4ZTU7YnJlYWs7ZGVmYXVsdDpzPXRoaXMtb31yZXR1cm4gaT9zOmIocyl9ZnVuY3Rpb24gY2kodCxlKXt2YXIgaSxvLG49MTIqKGUueWVhcigpLXQueWVhcigpKSsoZS5tb250aCgpLXQubW9udGgoKSkscz10LmNsb25lKCkuYWRkKG4sXCJtb250aHNcIik7cmV0dXJuIGUtczwwPyhpPXQuY2xvbmUoKS5hZGQobi0xLFwibW9udGhzXCIpLG89KGUtcykvKHMtaSkpOihpPXQuY2xvbmUoKS5hZGQobisxLFwibW9udGhzXCIpLG89KGUtcykvKGktcykpLC0obitvKXx8MH1mdW5jdGlvbiBwaSgpe3JldHVybiB0aGlzLmNsb25lKCkubG9jYWxlKFwiZW5cIikuZm9ybWF0KFwiZGRkIE1NTSBERCBZWVlZIEhIOm1tOnNzIFtHTVRdWlpcIil9ZnVuY3Rpb24gZmkoKXtpZighdGhpcy5pc1ZhbGlkKCkpcmV0dXJuIG51bGw7dmFyIHQ9dGhpcy5jbG9uZSgpLnV0YygpO3JldHVybiB0LnllYXIoKTwwfHx0LnllYXIoKT45OTk5P0codCxcIllZWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVwiKTpEKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nKT90aGlzLnRvRGF0ZSgpLnRvSVNPU3RyaW5nKCk6Ryh0LFwiWVlZWS1NTS1ERFtUXUhIOm1tOnNzLlNTU1taXVwiKX1mdW5jdGlvbiBtaSgpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm5cIm1vbWVudC5pbnZhbGlkKC8qIFwiK3RoaXMuX2krXCIgKi8pXCI7dmFyIHQ9XCJtb21lbnRcIixlPVwiXCI7dGhpcy5pc0xvY2FsKCl8fCh0PTA9PT10aGlzLnV0Y09mZnNldCgpP1wibW9tZW50LnV0Y1wiOlwibW9tZW50LnBhcnNlWm9uZVwiLGU9XCJaXCIpO3ZhciBpPVwiW1wiK3QrJyhcIl0nLG89MDw9dGhpcy55ZWFyKCkmJnRoaXMueWVhcigpPD05OTk5P1wiWVlZWVwiOlwiWVlZWVlZXCIsbj1lKydbXCIpXSc7cmV0dXJuIHRoaXMuZm9ybWF0KGkrbytcIi1NTS1ERFtUXUhIOm1tOnNzLlNTU1wiK24pfWZ1bmN0aW9uIHZpKHQpe3R8fCh0PXRoaXMuaXNVdGMoKT9lLmRlZmF1bHRGb3JtYXRVdGM6ZS5kZWZhdWx0Rm9ybWF0KTt2YXIgaT1HKHRoaXMsdCk7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLnBvc3Rmb3JtYXQoaSl9ZnVuY3Rpb24gZ2kodCxlKXtyZXR1cm4gdGhpcy5pc1ZhbGlkKCkmJih5KHQpJiZ0LmlzVmFsaWQoKXx8RGUodCkuaXNWYWxpZCgpKT9LZSh7dG86dGhpcyxmcm9tOnR9KS5sb2NhbGUodGhpcy5sb2NhbGUoKSkuaHVtYW5pemUoIWUpOnRoaXMubG9jYWxlRGF0YSgpLmludmFsaWREYXRlKCl9ZnVuY3Rpb24geWkodCl7cmV0dXJuIHRoaXMuZnJvbShEZSgpLHQpfWZ1bmN0aW9uIGJpKHQsZSl7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiYoeSh0KSYmdC5pc1ZhbGlkKCl8fERlKHQpLmlzVmFsaWQoKSk/S2Uoe2Zyb206dGhpcyx0bzp0fSkubG9jYWxlKHRoaXMubG9jYWxlKCkpLmh1bWFuaXplKCFlKTp0aGlzLmxvY2FsZURhdGEoKS5pbnZhbGlkRGF0ZSgpfWZ1bmN0aW9uIF9pKHQpe3JldHVybiB0aGlzLnRvKERlKCksdCl9ZnVuY3Rpb24gd2kodCl7dmFyIGU7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5fbG9jYWxlLl9hYmJyOihlPWllKHQpLG51bGwhPWUmJih0aGlzLl9sb2NhbGU9ZSksdGhpcyl9ZnVuY3Rpb24geGkoKXtyZXR1cm4gdGhpcy5fbG9jYWxlfWZ1bmN0aW9uIGtpKHQpe3N3aXRjaC
21167h0PXoodCkpe2Nhc2VcInllYXJcIjp0aGlzLm1vbnRoKDApO2Nhc2VcInF1YXJ0ZXJcIjpjYXNlXCJtb250aFwiOnRoaXMuZGF0ZSgxKTtjYXNlXCJ3ZWVrXCI6Y2FzZVwiaXNvV2Vla1wiOmNhc2VcImRheVwiOmNhc2VcImRhdGVcIjp0aGlzLmhvdXJzKDApO2Nhc2VcImhvdXJcIjp0aGlzLm1pbnV0ZXMoMCk7Y2FzZVwibWludXRlXCI6dGhpcy5zZWNvbmRzKDApO2Nhc2VcInNlY29uZFwiOnRoaXMubWlsbGlzZWNvbmRzKDApfXJldHVyblwid2Vla1wiPT09dCYmdGhpcy53ZWVrZGF5KDApLFwiaXNvV2Vla1wiPT09dCYmdGhpcy5pc29XZWVrZGF5KDEpLFwicXVhcnRlclwiPT09dCYmdGhpcy5tb250aCgzKk1hdGguZmxvb3IodGhpcy5tb250aCgpLzMpKSx0aGlzfWZ1bmN0aW9uIFNpKHQpe3JldHVybiB2b2lkIDA9PT0odD16KHQpKXx8XCJtaWxsaXNlY29uZFwiPT09dD90aGlzOihcImRhdGVcIj09PXQmJih0PVwiZGF5XCIpLHRoaXMuc3RhcnRPZih0KS5hZGQoMSxcImlzb1dlZWtcIj09PXQ/XCJ3ZWVrXCI6dCkuc3VidHJhY3QoMSxcIm1zXCIpKX1mdW5jdGlvbiBEaSgpe3JldHVybiB0aGlzLl9kLnZhbHVlT2YoKS02ZTQqKHRoaXMuX29mZnNldHx8MCl9ZnVuY3Rpb24gTWkoKXtyZXR1cm4gTWF0aC5mbG9vcih0aGlzLnZhbHVlT2YoKS8xZTMpfWZ1bmN0aW9uIENpKCl7cmV0dXJuIG5ldyBEYXRlKHRoaXMudmFsdWVPZigpKX1mdW5jdGlvbiBPaSgpe3ZhciB0PXRoaXM7cmV0dXJuW3QueWVhcigpLHQubW9udGgoKSx0LmRhdGUoKSx0LmhvdXIoKSx0Lm1pbnV0ZSgpLHQuc2Vjb25kKCksdC5taWxsaXNlY29uZCgpXX1mdW5jdGlvbiBFaSgpe3ZhciB0PXRoaXM7cmV0dXJue3llYXJzOnQueWVhcigpLG1vbnRoczp0Lm1vbnRoKCksZGF0ZTp0LmRhdGUoKSxob3Vyczp0LmhvdXJzKCksbWludXRlczp0Lm1pbnV0ZXMoKSxzZWNvbmRzOnQuc2Vjb25kcygpLG1pbGxpc2Vjb25kczp0Lm1pbGxpc2Vjb25kcygpfX1mdW5jdGlvbiBUaSgpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLnRvSVNPU3RyaW5nKCk6bnVsbH1mdW5jdGlvbiBQaSgpe3JldHVybiBmKHRoaXMpfWZ1bmN0aW9uIElpKCl7cmV0dXJuIGwoe30scCh0aGlzKSl9ZnVuY3Rpb24gTmkoKXtyZXR1cm4gcCh0aGlzKS5vdmVyZmxvd31mdW5jdGlvbiBSaSgpe3JldHVybntpbnB1dDp0aGlzLl9pLGZvcm1hdDp0aGlzLl9mLGxvY2FsZTp0aGlzLl9sb2NhbGUsaXNVVEM6dGhpcy5faXNVVEMsc3RyaWN0OnRoaXMuX3N0cmljdH19ZnVuY3Rpb24gQWkodCxlKXtIKDAsW3QsdC5sZW5ndGhdLDAsZSl9ZnVuY3Rpb24gemkodCl7cmV0dXJuIGppLmNhbGwodGhpcyx0LHRoaXMud2VlaygpLHRoaXMud2Vla2RheSgpLHRoaXMubG9jYWxlRGF0YSgpLl93ZWVrLmRvdyx0aGlzLmxvY2FsZURhdGEoKS5fd2Vlay5kb3kpfWZ1bmN0aW9uIExpKHQpe3JldHVybiBqaS5jYWxsKHRoaXMsdCx0aGlzLmlzb1dlZWsoKSx0aGlzLmlzb1dlZWtkYXkoKSwxLDQpfWZ1bmN0aW9uIEZpKCl7cmV0dXJuIFN0KHRoaXMueWVhcigpLDEsNCl9ZnVuY3Rpb24gQmkoKXt2YXIgdD10aGlzLmxvY2FsZURhdGEoKS5fd2VlaztyZXR1cm4gU3QodGhpcy55ZWFyKCksdC5kb3csdC5kb3kpfWZ1bmN0aW9uIGppKHQsZSxpLG8sbil7dmFyIHM7cmV0dXJuIG51bGw9PXQ/a3QodGhpcyxvLG4pLnllYXI6KHM9U3QodCxvLG4pLGU+cyYmKGU9cyksSGkuY2FsbCh0aGlzLHQsZSxpLG8sbikpfWZ1bmN0aW9uIEhpKHQsZSxpLG8sbil7dmFyIHM9eHQodCxlLGksbyxuKSxyPV90KHMueWVhciwwLHMuZGF5T2ZZZWFyKTtyZXR1cm4gdGhpcy55ZWFyKHIuZ2V0VVRDRnVsbFllYXIoKSksdGhpcy5tb250aChyLmdldFVUQ01vbnRoKCkpLHRoaXMuZGF0ZShyLmdldFVUQ0RhdGUoKSksdGhpc31mdW5jdGlvbiBXaSh0KXtyZXR1cm4gbnVsbD09dD9NYXRoLmNlaWwoKHRoaXMubW9udGgoKSsxKS8zKTp0aGlzLm1vbnRoKDMqKHQtMSkrdGhpcy5tb250aCgpJTMpfWZ1bmN0aW9uIFlpKHQpe3ZhciBlPU1hdGgucm91bmQoKHRoaXMuY2xvbmUoKS5zdGFydE9mKFwiZGF5XCIpLXRoaXMuY2xvbmUoKS5zdGFydE9mKFwieWVhclwiKSkvODY0ZTUpKzE7cmV0dXJuIG51bGw9PXQ/ZTp0aGlzLmFkZCh0LWUsXCJkXCIpfWZ1bmN0aW9uIEdpKHQsZSl7ZVttbl09XygxZTMqKFwiMC5cIit0KSl9ZnVuY3Rpb24gVmkoKXtyZXR1cm4gdGhpcy5faXNVVEM/XCJVVENcIjpcIlwifWZ1bmN0aW9uIFVpKCl7cmV0dXJuIHRoaXMuX2lzVVRDP1wiQ29vcmRpbmF0ZWQgVW5pdmVyc2FsIFRpbWVcIjpcIlwifWZ1bmN0aW9uIHFpKHQpe3JldHVybiBEZSgxZTMqdCl9ZnVuY3Rpb24gWGkoKXtyZXR1cm4gRGUuYXBwbHkobnVsbCxhcmd1bWVudHMpLnBhcnNlWm9uZSgpfWZ1bmN0aW9uIFppKHQpe3JldHVybiB0fWZ1bmN0aW9uIEtpKHQsZSxpLG8pe3ZhciBuPWllKCkscz11KCkuc2V0KG8sZSk7cmV0dXJuIG5baV0ocyx0KX1mdW5jdGlvbiBKaSh0LGUsaSl7aWYocih0KSYmKGU9dCx0PXZvaWQgMCksdD10fHxcIlwiLG51bGwhPWUpcmV0dXJuIEtpKHQsZSxpLFwibW9udGhcIik7dmFyIG8sbj1bXTtmb3Iobz0wO288MTI7bysrKW5bb109S2kodCxvLGksXCJtb250aFwiKTtyZXR1cm4gbn1mdW5jdGlvbiAkaSh0LGUsaSxvKXtcImJvb2xlYW5cIj09dHlwZW9mIHQ/KHIoZSkmJihpPWUsZT12b2lkIDApLGU9ZXx8XCJcIik6KGU9dCxpPWUsdD0hMSxyKGUpJiYoaT1lLGU9dm9pZCAwKSxlPWV8fFwiXCIpO3ZhciBuPWllKCkscz10P24uX3dlZWsuZG93OjA7aWYobnVsbCE9aSlyZXR1cm4gS2koZSwoaStzKSU3LG8sXCJkYXlcIik7dmFyIGEsaD1bXTtmb3IoYT0wO2E8NzthKyspaFthXT1LaShlLChhK3MpJTcsbyxcImRheVwiKTtyZXR1cm4gaH1mdW5jdGlvbiBRaSh0LGUpe3JldHVybiBKaSh0LGUsXCJtb250aHNcIil9ZnVuY3Rpb24gdG8odCxlKXtyZXR1cm4gSmkodCxlLFwibW9udGhzU2hvcnRcIil9ZnVuY3Rpb24gZW8odCxlLGkpe3JldHVybiAkaSh0LGUsaSxcIndlZWtkYXlzXCIpfWZ1bmN0aW9uIGlvKHQsZSxpKXtyZXR1cm4gJGkodCxlLGksXCJ3ZWVrZGF5c1Nob3J0XCIpfWZ1bmN0aW9uIG9vKHQsZSxpKXtyZXR1cm4gJGkodCxlLGksXCJ3ZWVrZGF5c01pblwiKX1mdW5jdGlvbiBubygpe3ZhciB0PXRoaXMuX2RhdGE7cmV0dXJuIHRoaXMuX21pbGxpc2Vjb25kcz1kcyh0aGlzLl9taWxsaXNlY29uZHMpLHRoaXMuX2RheXM9ZHModGhpcy5fZGF5cyksdGhpcy5fbW9udGhzPWRzKHRoaXMuX21vbnRocyksdC5taWxsaXNlY29uZHM9ZHModC5taWxsaXNlY29uZHMpLHQuc2Vjb25kcz1kcyh0LnNlY29uZHMpLHQubWludXRlcz1kcyh0Lm1pbnV0ZXMpLHQuaG91cnM9ZHModC5
21167ob3VycyksdC5tb250aHM9ZHModC5tb250aHMpLHQueWVhcnM9ZHModC55ZWFycyksdGhpc31mdW5jdGlvbiBzbyh0LGUsaSxvKXt2YXIgbj1LZShlLGkpO3JldHVybiB0Ll9taWxsaXNlY29uZHMrPW8qbi5fbWlsbGlzZWNvbmRzLHQuX2RheXMrPW8qbi5fZGF5cyx0Ll9tb250aHMrPW8qbi5fbW9udGhzLHQuX2J1YmJsZSgpfWZ1bmN0aW9uIHJvKHQsZSl7cmV0dXJuIHNvKHRoaXMsdCxlLDEpfWZ1bmN0aW9uIGFvKHQsZSl7cmV0dXJuIHNvKHRoaXMsdCxlLC0xKX1mdW5jdGlvbiBobyh0KXtyZXR1cm4gdDwwP01hdGguZmxvb3IodCk6TWF0aC5jZWlsKHQpfWZ1bmN0aW9uIGxvKCl7dmFyIHQsZSxpLG8sbixzPXRoaXMuX21pbGxpc2Vjb25kcyxyPXRoaXMuX2RheXMsYT10aGlzLl9tb250aHMsaD10aGlzLl9kYXRhO3JldHVybiBzPj0wJiZyPj0wJiZhPj0wfHxzPD0wJiZyPD0wJiZhPD0wfHwocys9ODY0ZTUqaG8oY28oYSkrcikscj0wLGE9MCksaC5taWxsaXNlY29uZHM9cyUxZTMsdD1iKHMvMWUzKSxoLnNlY29uZHM9dCU2MCxlPWIodC82MCksaC5taW51dGVzPWUlNjAsaT1iKGUvNjApLGguaG91cnM9aSUyNCxyKz1iKGkvMjQpLG49Yih1byhyKSksYSs9bixcbiAgICByLT1obyhjbyhuKSksbz1iKGEvMTIpLGElPTEyLGguZGF5cz1yLGgubW9udGhzPWEsaC55ZWFycz1vLHRoaXN9ZnVuY3Rpb24gdW8odCl7cmV0dXJuIDQ4MDAqdC8xNDYwOTd9ZnVuY3Rpb24gY28odCl7cmV0dXJuIDE0NjA5Nyp0LzQ4MDB9ZnVuY3Rpb24gcG8odCl7aWYoIXRoaXMuaXNWYWxpZCgpKXJldHVybiBOYU47dmFyIGUsaSxvPXRoaXMuX21pbGxpc2Vjb25kcztpZihcIm1vbnRoXCI9PT0odD16KHQpKXx8XCJ5ZWFyXCI9PT10KXJldHVybiBlPXRoaXMuX2RheXMrby84NjRlNSxpPXRoaXMuX21vbnRocyt1byhlKSxcIm1vbnRoXCI9PT10P2k6aS8xMjtzd2l0Y2goZT10aGlzLl9kYXlzK01hdGgucm91bmQoY28odGhpcy5fbW9udGhzKSksdCl7Y2FzZVwid2Vla1wiOnJldHVybiBlLzcrby82MDQ4ZTU7Y2FzZVwiZGF5XCI6cmV0dXJuIGUrby84NjRlNTtjYXNlXCJob3VyXCI6cmV0dXJuIDI0KmUrby8zNmU1O2Nhc2VcIm1pbnV0ZVwiOnJldHVybiAxNDQwKmUrby82ZTQ7Y2FzZVwic2Vjb25kXCI6cmV0dXJuIDg2NDAwKmUrby8xZTM7Y2FzZVwibWlsbGlzZWNvbmRcIjpyZXR1cm4gTWF0aC5mbG9vcig4NjRlNSplKStvO2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biB1bml0IFwiK3QpfX1mdW5jdGlvbiBmbygpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLl9taWxsaXNlY29uZHMrODY0ZTUqdGhpcy5fZGF5cyt0aGlzLl9tb250aHMlMTIqMjU5MmU2KzMxNTM2ZTYqXyh0aGlzLl9tb250aHMvMTIpOk5hTn1mdW5jdGlvbiBtbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcyh0KX19ZnVuY3Rpb24gdm8oKXtyZXR1cm4gS2UodGhpcyl9ZnVuY3Rpb24gZ28odCl7cmV0dXJuIHQ9eih0KSx0aGlzLmlzVmFsaWQoKT90aGlzW3QrXCJzXCJdKCk6TmFOfWZ1bmN0aW9uIHlvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzVmFsaWQoKT90aGlzLl9kYXRhW3RdOk5hTn19ZnVuY3Rpb24gYm8oKXtyZXR1cm4gYih0aGlzLmRheXMoKS83KX1mdW5jdGlvbiBfbyh0LGUsaSxvLG4pe3JldHVybiBuLnJlbGF0aXZlVGltZShlfHwxLCEhaSx0LG8pfWZ1bmN0aW9uIHdvKHQsZSxpKXt2YXIgbz1LZSh0KS5hYnMoKSxuPURzKG8uYXMoXCJzXCIpKSxzPURzKG8uYXMoXCJtXCIpKSxyPURzKG8uYXMoXCJoXCIpKSxhPURzKG8uYXMoXCJkXCIpKSxoPURzKG8uYXMoXCJNXCIpKSxkPURzKG8uYXMoXCJ5XCIpKSxsPW48PU1zLnNzJiZbXCJzXCIsbl18fG48TXMucyYmW1wic3NcIixuXXx8czw9MSYmW1wibVwiXXx8czxNcy5tJiZbXCJtbVwiLHNdfHxyPD0xJiZbXCJoXCJdfHxyPE1zLmgmJltcImhoXCIscl18fGE8PTEmJltcImRcIl18fGE8TXMuZCYmW1wiZGRcIixhXXx8aDw9MSYmW1wiTVwiXXx8aDxNcy5NJiZbXCJNTVwiLGhdfHxkPD0xJiZbXCJ5XCJdfHxbXCJ5eVwiLGRdO3JldHVybiBsWzJdPWUsbFszXT0rdD4wLGxbNF09aSxfby5hcHBseShudWxsLGwpfWZ1bmN0aW9uIHhvKHQpe3JldHVybiB2b2lkIDA9PT10P0RzOlwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJihEcz10LCEwKX1mdW5jdGlvbiBrbyh0LGUpe3JldHVybiB2b2lkIDAhPT1Nc1t0XSYmKHZvaWQgMD09PWU/TXNbdF06KE1zW3RdPWUsXCJzXCI9PT10JiYoTXMuc3M9ZS0xKSwhMCkpfWZ1bmN0aW9uIFNvKHQpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTt2YXIgZT10aGlzLmxvY2FsZURhdGEoKSxpPXdvKHRoaXMsIXQsZSk7cmV0dXJuIHQmJihpPWUucGFzdEZ1dHVyZSgrdGhpcyxpKSksZS5wb3N0Zm9ybWF0KGkpfWZ1bmN0aW9uIERvKHQpe3JldHVybih0PjApLSh0PDApfHwrdH1mdW5jdGlvbiBNbygpe2lmKCF0aGlzLmlzVmFsaWQoKSlyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkuaW52YWxpZERhdGUoKTt2YXIgdCxlLGksbz1Dcyh0aGlzLl9taWxsaXNlY29uZHMpLzFlMyxuPUNzKHRoaXMuX2RheXMpLHM9Q3ModGhpcy5fbW9udGhzKTt0PWIoby82MCksZT1iKHQvNjApLG8lPTYwLHQlPTYwLGk9YihzLzEyKSxzJT0xMjt2YXIgcj1pLGE9cyxoPW4sZD1lLGw9dCx1PW8/by50b0ZpeGVkKDMpLnJlcGxhY2UoL1xcLj8wKyQvLFwiXCIpOlwiXCIsYz10aGlzLmFzU2Vjb25kcygpO2lmKCFjKXJldHVyblwiUDBEXCI7dmFyIHA9YzwwP1wiLVwiOlwiXCIsZj1Ebyh0aGlzLl9tb250aHMpIT09RG8oYyk/XCItXCI6XCJcIixtPURvKHRoaXMuX2RheXMpIT09RG8oYyk/XCItXCI6XCJcIix2PURvKHRoaXMuX21pbGxpc2Vjb25kcykhPT1EbyhjKT9cIi1cIjpcIlwiO3JldHVybiBwK1wiUFwiKyhyP2YrcitcIllcIjpcIlwiKSsoYT9mK2ErXCJNXCI6XCJcIikrKGg/bStoK1wiRFwiOlwiXCIpKyhkfHxsfHx1P1wiVFwiOlwiXCIpKyhkP3YrZCtcIkhcIjpcIlwiKSsobD92K2wrXCJNXCI6XCJcIikrKHU/dit1K1wiU1wiOlwiXCIpfXZhciBDbyxPbztPbz1BcnJheS5wcm90b3R5cGUuc29tZT9BcnJheS5wcm90b3R5cGUuc29tZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9T2JqZWN0KHRoaXMpLGk9ZS5sZW5ndGg+Pj4wLG89MDtvPGk7bysrKWlmKG8gaW4gZSYmdC5jYWxsKHRoaXMsZVtvXSxvLGUpKXJldHVybiEwO3JldHVybiExfTt2YXIgRW89ZS5tb21lbnRQcm9wZXJ0aWVzPVtdLFRvPSExLFBvPXt9O2Uuc3VwcHJlc3NEZXByZWNhdGlvbldhcm5pbmdzPSExLGUuZGVwcmVjYXRpb25IYW5kbGVyPW51bGw7dmFyIElvO0lvPU9iamVjdC5rZXlzP09iamVjdC5rZXlzOmZ1bmN0aW9uKHQpe3ZhciBlLGk9W107Zm9yKGUgaW4gdClkKHQsZSkmJmkucHVzaChlKTtyZXR1cm4gaX07dmFyIE
211675vPXtzYW1lRGF5OlwiW1RvZGF5IGF0XSBMVFwiLG5leHREYXk6XCJbVG9tb3Jyb3cgYXRdIExUXCIsbmV4dFdlZWs6XCJkZGRkIFthdF0gTFRcIixsYXN0RGF5OlwiW1llc3RlcmRheSBhdF0gTFRcIixsYXN0V2VlazpcIltMYXN0XSBkZGRkIFthdF0gTFRcIixzYW1lRWxzZTpcIkxcIn0sUm89e0xUUzpcImg6bW06c3MgQVwiLExUOlwiaDptbSBBXCIsTDpcIk1NL0REL1lZWVlcIixMTDpcIk1NTU0gRCwgWVlZWVwiLExMTDpcIk1NTU0gRCwgWVlZWSBoOm1tIEFcIixMTExMOlwiZGRkZCwgTU1NTSBELCBZWVlZIGg6bW0gQVwifSxBbz0vXFxkezEsMn0vLHpvPXtmdXR1cmU6XCJpbiAlc1wiLHBhc3Q6XCIlcyBhZ29cIixzOlwiYSBmZXcgc2Vjb25kc1wiLHNzOlwiJWQgc2Vjb25kc1wiLG06XCJhIG1pbnV0ZVwiLG1tOlwiJWQgbWludXRlc1wiLGg6XCJhbiBob3VyXCIsaGg6XCIlZCBob3Vyc1wiLGQ6XCJhIGRheVwiLGRkOlwiJWQgZGF5c1wiLE06XCJhIG1vbnRoXCIsTU06XCIlZCBtb250aHNcIix5OlwiYSB5ZWFyXCIseXk6XCIlZCB5ZWFyc1wifSxMbz17fSxGbz17fSxCbz0vKFxcW1teXFxbXSpcXF0pfChcXFxcKT8oW0hoXW1tKHNzKT98TW98TU0/TT9NP3xEb3xERERvfEREP0Q/RD98ZGRkP2Q/fGRvP3x3W298d10/fFdbb3xXXT98UW8/fFlZWVlZWXxZWVlZWXxZWVlZfFlZfGdnKGdnZz8pP3xHRyhHR0c/KT98ZXxFfGF8QXxoaD98SEg/fGtrP3xtbT98c3M/fFN7MSw5fXx4fFh8eno/fFpaP3wuKS9nLGpvPS8oXFxbW15cXFtdKlxcXSl8KFxcXFwpPyhMVFN8TFR8TEw/TD9MP3xsezEsNH0pL2csSG89e30sV289e30sWW89L1xcZC8sR289L1xcZFxcZC8sVm89L1xcZHszfS8sVW89L1xcZHs0fS8scW89L1srLV0/XFxkezZ9LyxYbz0vXFxkXFxkPy8sWm89L1xcZFxcZFxcZFxcZD8vLEtvPS9cXGRcXGRcXGRcXGRcXGRcXGQ/LyxKbz0vXFxkezEsM30vLCRvPS9cXGR7MSw0fS8sUW89L1srLV0/XFxkezEsNn0vLHRuPS9cXGQrLyxlbj0vWystXT9cXGQrLyxvbj0vWnxbKy1dXFxkXFxkOj9cXGRcXGQvZ2ksbm49L1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vZ2ksc249L1srLV0/XFxkKyhcXC5cXGR7MSwzfSk/Lyxybj0vWzAtOV0qWydhLXpcXHUwMEEwLVxcdTA1RkZcXHUwNzAwLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRUZdK3xbXFx1MDYwMC1cXHUwNkZGXFwvXSsoXFxzKj9bXFx1MDYwMC1cXHUwNkZGXSspezEsMn0vaSxhbj17fSxobj17fSxkbj0wLGxuPTEsdW49Mixjbj0zLHBuPTQsZm49NSxtbj02LHZuPTcsZ249ODtIKFwiWVwiLDAsMCxmdW5jdGlvbigpe3ZhciB0PXRoaXMueWVhcigpO3JldHVybiB0PD05OTk5P1wiXCIrdDpcIitcIit0fSksSCgwLFtcIllZXCIsMl0sMCxmdW5jdGlvbigpe3JldHVybiB0aGlzLnllYXIoKSUxMDB9KSxIKDAsW1wiWVlZWVwiLDRdLDAsXCJ5ZWFyXCIpLEgoMCxbXCJZWVlZWVwiLDVdLDAsXCJ5ZWFyXCIpLEgoMCxbXCJZWVlZWVlcIiw2LCEwXSwwLFwieWVhclwiKSxBKFwieWVhclwiLFwieVwiKSxGKFwieWVhclwiLDEpLFUoXCJZXCIsZW4pLFUoXCJZWVwiLFhvLEdvKSxVKFwiWVlZWVwiLCRvLFVvKSxVKFwiWVlZWVlcIixRbyxxbyksVShcIllZWVlZWVwiLFFvLHFvKSxLKFtcIllZWVlZXCIsXCJZWVlZWVlcIl0sZG4pLEsoXCJZWVlZXCIsZnVuY3Rpb24odCxpKXtpW2RuXT0yPT09dC5sZW5ndGg/ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KTpfKHQpfSksSyhcIllZXCIsZnVuY3Rpb24odCxpKXtpW2RuXT1lLnBhcnNlVHdvRGlnaXRZZWFyKHQpfSksSyhcIllcIixmdW5jdGlvbih0LGUpe2VbZG5dPXBhcnNlSW50KHQsMTApfSksZS5wYXJzZVR3b0RpZ2l0WWVhcj1mdW5jdGlvbih0KXtyZXR1cm4gXyh0KSsoXyh0KT42OD8xOTAwOjJlMyl9O3ZhciB5bixibj1pdChcIkZ1bGxZZWFyXCIsITApO3luPUFycmF5LnByb3RvdHlwZS5pbmRleE9mP0FycmF5LnByb3RvdHlwZS5pbmRleE9mOmZ1bmN0aW9uKHQpe3ZhciBlO2ZvcihlPTA7ZTx0aGlzLmxlbmd0aDsrK2UpaWYodGhpc1tlXT09PXQpcmV0dXJuIGU7cmV0dXJuLTF9LEgoXCJNXCIsW1wiTU1cIiwyXSxcIk1vXCIsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tb250aCgpKzF9KSxIKFwiTU1NXCIsMCwwLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS5tb250aHNTaG9ydCh0aGlzLHQpfSksSChcIk1NTU1cIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLm1vbnRocyh0aGlzLHQpfSksQShcIm1vbnRoXCIsXCJNXCIpLEYoXCJtb250aFwiLDgpLFUoXCJNXCIsWG8pLFUoXCJNTVwiLFhvLEdvKSxVKFwiTU1NXCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5tb250aHNTaG9ydFJlZ2V4KHQpfSksVShcIk1NTU1cIixmdW5jdGlvbih0LGUpe3JldHVybiBlLm1vbnRoc1JlZ2V4KHQpfSksSyhbXCJNXCIsXCJNTVwiXSxmdW5jdGlvbih0LGUpe2VbbG5dPV8odCktMX0pLEsoW1wiTU1NXCIsXCJNTU1NXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkuX2xvY2FsZS5tb250aHNQYXJzZSh0LG8saS5fc3RyaWN0KTtudWxsIT1uP2VbbG5dPW46cChpKS5pbnZhbGlkTW9udGg9dH0pO3ZhciBfbj0vRFtvRF0/KFxcW1teXFxbXFxdXSpcXF18XFxzKStNTU1NPy8sd249XCJKYW51YXJ5X0ZlYnJ1YXJ5X01hcmNoX0FwcmlsX01heV9KdW5lX0p1bHlfQXVndXN0X1NlcHRlbWJlcl9PY3RvYmVyX05vdmVtYmVyX0RlY2VtYmVyXCIuc3BsaXQoXCJfXCIpLHhuPVwiSmFuX0ZlYl9NYXJfQXByX01heV9KdW5fSnVsX0F1Z19TZXBfT2N0X05vdl9EZWNcIi5zcGxpdChcIl9cIiksa249cm4sU249cm47SChcIndcIixbXCJ3d1wiLDJdLFwid29cIixcIndlZWtcIiksSChcIldcIixbXCJXV1wiLDJdLFwiV29cIixcImlzb1dlZWtcIiksQShcIndlZWtcIixcIndcIiksQShcImlzb1dlZWtcIixcIldcIiksRihcIndlZWtcIiw1KSxGKFwiaXNvV2Vla1wiLDUpLFUoXCJ3XCIsWG8pLFUoXCJ3d1wiLFhvLEdvKSxVKFwiV1wiLFhvKSxVKFwiV1dcIixYbyxHbyksSihbXCJ3XCIsXCJ3d1wiLFwiV1wiLFwiV1dcIl0sZnVuY3Rpb24odCxlLGksbyl7ZVtvLnN1YnN0cigwLDEpXT1fKHQpfSk7dmFyIERuPXtkb3c6MCxkb3k6Nn07SChcImRcIiwwLFwiZG9cIixcImRheVwiKSxIKFwiZGRcIiwwLDAsZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubG9jYWxlRGF0YSgpLndlZWtkYXlzTWluKHRoaXMsdCl9KSxIKFwiZGRkXCIsMCwwLGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmxvY2FsZURhdGEoKS53ZWVrZGF5c1Nob3J0KHRoaXMsdCl9KSxIKFwiZGRkZFwiLDAsMCxmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5sb2NhbGVEYXRhKCkud2Vla2RheXModGhpcyx0KX0pLEgoXCJlXCIsMCwwLFwid2Vla2RheVwiKSxIKFwiRVwiLDAsMCxcImlzb1dlZWtkYXlcIiksQShcImRheVwiLFwiZFwiKSxBKFwid2Vla2RheVwiLFwiZVwiKSxBKFwiaXNvV2Vla2RheVwiLFwiRVwiKSxGKFwiZGF5XCIsMTEpLEYoXCJ3ZWVrZGF5XCIsMTEpLEYoXCJpc29XZWVrZGF5XCIsMTEpLFUoXCJkXCIsWG8pLFUoXCJlXCIsWG8pLFUoXCJFXCIsWG8pLFUoXCJkZFwiLGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUud2Vla2RheXNNaW5SZWdleCh0KX0pLFUoXCJkZGRcIixmdW5jdGlvbih0LGUpe3JldHVybiBlLndlZWtkYXlzU2hvcnRSZWdleCh0KX0pLFUoXCJkZGRkXCIsZnVuY3Rpb24odCxlKXtyZXR1cm4gZS53ZWVrZGF5c1JlZ2V4KHQpfSksSihbXCJkZFwiLFwiZGRkXCIsXCJkZGRkXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPWkuX2xvY2FsZS53ZWVrZGF5c1BhcnNlKHQsbyxpLl9zdHJpY3QpO251bGwhPW4/ZS5kPW46cChpKS5pbnZhbGlkV2Vla2RheT10fSksSihbXCJkXCIsXCJlXCIsXCJFXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbb109Xyh0KX0pO3ZhciBNbj1cIlN1bmRheV9Nb25kYXlfVHVlc2RheV9XZWRuZXNkYXlfVGh1cnNkYXlfRnJpZGF5X1NhdHVyZGF5XCIuc3BsaXQoXCJfXCIpLENuPVwiU3VuX01vbl9UdWVfV2VkX1RodV9GcmlfU2F0XCIuc3BsaXQoXCJfXCIpLE9uPVwiU3VfTW9fVHVfV2VfVGhfRnJfU2FcIi5zcGxpdChcIl9cIiksRW49cm4sVG49cm4sUG49cm47SChcIkhcIixbXCJISFwiLDJdLDAsXCJob3VyXCIpLEgoXCJoXCIsW1wiaGhcIiwyXSwwLEd0KSxIKFwia1wiLFtcImtrXCIsMl0sMCxWdCksSChcImhtbVwiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrR3QuYXBwbHkodGhpcykraih0aGlzLm1pbnV0ZXMoKSwyKX0pLEgoXCJobW1zc1wiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrR3QuYXBwbHkodGhpcykraih0aGlzLm1pbnV0ZXMoKSwyKStqKHRoaXMuc2Vjb25kcygpLDIpfSksSChcIkhtbVwiLDAsMCxmdW5jdGlvbigpe3JldHVyblwiXCIrdGhpcy5ob3VycygpK2oodGhpcy5taW51dGVzKCksMil9KSxIKFwiSG1tc3NcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5cIlwiK3RoaXMuaG91cnMoKStqKHRoaXMubWludXRlcygpLDIpK2oodGhpcy5zZWNvbmRzKCksMil9KSxVdChcImFcIiwhMCksVXQoXCJBXCIsITEpLEEoXCJob3VyXCIsXCJoXCIpLEYoXCJob3VyXCIsMTMpLFUoXCJhXCIscXQpLFUoXCJBXCIscXQpLFUoXCJIXCIsWG8pLFUoXCJoXCIsWG8pLFUoXCJrXCIsWG8pLFUoXCJISFwiLFhvLEdvKSxVKFwiaGhcIixYbyxHbyksVShcImtrXCIsWG8sR28pLFUoXCJobW1cIixabyksVShcImhtbXNzXCIsS28pLFUoXCJIbW1cIixabyksVShcIkhtbXNzXCIsS28pLEsoW1wiSFwiLFwiSEhcIl0sY24pLEsoW1wia1wiLFwia2tcIl0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPV8odCk7ZVtjbl09MjQ9PT1vPzA6b30pLEsoW1wiYVwiLFwiQVwiXSxmdW5jdGlvbih0LGUsaSl7aS5faXNQbT1pLl9sb2NhbGUuaXNQTSh0KSxpLl9tZXJpZGllbT10fSksSyhbXCJoXCIsXCJoaFwiXSxmdW5jdGlvbih0LGUsaSl7ZVtjbl09Xyh0KSxwKGkpLmJpZ0hvdXI9ITB9KSxLKFwiaG1tXCIsZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQubGVuZ3RoLTI7ZVtjbl09Xyh0LnN1YnN0cigwLG8pKSxlW3BuXT1fKHQuc3Vic3RyKG8pKSxwKGkpLmJpZ0hvdXI9ITB9KSxLKFwiaG1tc3NcIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtNCxuPXQubGVuZ3RoLTI7ZVtjbl09Xyh0LnN1YnN0cigwLG8pKSxlW3BuXT1fKHQuc3Vic3RyKG8s
21167MikpLGVbZm5dPV8odC5zdWJzdHIobikpLHAoaSkuYmlnSG91cj0hMH0pLEsoXCJIbW1cIixmdW5jdGlvbih0LGUsaSl7dmFyIG89dC5sZW5ndGgtMjtlW2NuXT1fKHQuc3Vic3RyKDAsbykpLGVbcG5dPV8odC5zdWJzdHIobykpfSksSyhcIkhtbXNzXCIsZnVuY3Rpb24odCxlLGkpe3ZhciBvPXQubGVuZ3RoLTQsbj10Lmxlbmd0aC0yO2VbY25dPV8odC5zdWJzdHIoMCxvKSksZVtwbl09Xyh0LnN1YnN0cihvLDIpKSxlW2ZuXT1fKHQuc3Vic3RyKG4pKX0pO3ZhciBJbixObj0vW2FwXVxcLj9tP1xcLj8vaSxSbj1pdChcIkhvdXJzXCIsITApLEFuPXtjYWxlbmRhcjpObyxsb25nRGF0ZUZvcm1hdDpSbyxpbnZhbGlkRGF0ZTpcIkludmFsaWQgZGF0ZVwiLG9yZGluYWw6XCIlZFwiLGRheU9mTW9udGhPcmRpbmFsUGFyc2U6QW8scmVsYXRpdmVUaW1lOnpvLG1vbnRoczp3bixtb250aHNTaG9ydDp4bix3ZWVrOkRuLHdlZWtkYXlzOk1uLHdlZWtkYXlzTWluOk9uLHdlZWtkYXlzU2hvcnQ6Q24sbWVyaWRpZW1QYXJzZTpObn0sem49e30sTG49e30sRm49L15cXHMqKCg/OlsrLV1cXGR7Nn18XFxkezR9KS0oPzpcXGRcXGQtXFxkXFxkfFdcXGRcXGQtXFxkfFdcXGRcXGR8XFxkXFxkXFxkfFxcZFxcZCkpKD86KFR8ICkoXFxkXFxkKD86OlxcZFxcZCg/OjpcXGRcXGQoPzpbLixdXFxkKyk/KT8pPykoW1xcK1xcLV1cXGRcXGQoPzo6P1xcZFxcZCk/fFxccypaKT8pPyQvLEJuPS9eXFxzKigoPzpbKy1dXFxkezZ9fFxcZHs0fSkoPzpcXGRcXGRcXGRcXGR8V1xcZFxcZFxcZHxXXFxkXFxkfFxcZFxcZFxcZHxcXGRcXGQpKSg/OihUfCApKFxcZFxcZCg/OlxcZFxcZCg/OlxcZFxcZCg/OlsuLF1cXGQrKT8pPyk/KShbXFwrXFwtXVxcZFxcZCg/Ojo/XFxkXFxkKT98XFxzKlopPyk/JC8sam49L1p8WystXVxcZFxcZCg/Ojo/XFxkXFxkKT8vLEhuPVtbXCJZWVlZWVktTU0tRERcIiwvWystXVxcZHs2fS1cXGRcXGQtXFxkXFxkL10sW1wiWVlZWS1NTS1ERFwiLC9cXGR7NH0tXFxkXFxkLVxcZFxcZC9dLFtcIkdHR0ctW1ddV1ctRVwiLC9cXGR7NH0tV1xcZFxcZC1cXGQvXSxbXCJHR0dHLVtXXVdXXCIsL1xcZHs0fS1XXFxkXFxkLywhMV0sW1wiWVlZWS1ERERcIiwvXFxkezR9LVxcZHszfS9dLFtcIllZWVktTU1cIiwvXFxkezR9LVxcZFxcZC8sITFdLFtcIllZWVlZWU1NRERcIiwvWystXVxcZHsxMH0vXSxbXCJZWVlZTU1ERFwiLC9cXGR7OH0vXSxbXCJHR0dHW1ddV1dFXCIsL1xcZHs0fVdcXGR7M30vXSxbXCJHR0dHW1ddV1dcIiwvXFxkezR9V1xcZHsyfS8sITFdLFtcIllZWVlERERcIiwvXFxkezd9L11dLFduPVtbXCJISDptbTpzcy5TU1NTXCIsL1xcZFxcZDpcXGRcXGQ6XFxkXFxkXFwuXFxkKy9dLFtcIkhIOm1tOnNzLFNTU1NcIiwvXFxkXFxkOlxcZFxcZDpcXGRcXGQsXFxkKy9dLFtcIkhIOm1tOnNzXCIsL1xcZFxcZDpcXGRcXGQ6XFxkXFxkL10sW1wiSEg6bW1cIiwvXFxkXFxkOlxcZFxcZC9dLFtcIkhIbW1zcy5TU1NTXCIsL1xcZFxcZFxcZFxcZFxcZFxcZFxcLlxcZCsvXSxbXCJISG1tc3MsU1NTU1wiLC9cXGRcXGRcXGRcXGRcXGRcXGQsXFxkKy9dLFtcIkhIbW1zc1wiLC9cXGRcXGRcXGRcXGRcXGRcXGQvXSxbXCJISG1tXCIsL1xcZFxcZFxcZFxcZC9dLFtcIkhIXCIsL1xcZFxcZC9dXSxZbj0vXlxcLz9EYXRlXFwoKFxcLT9cXGQrKS9pLEduPS9eKD86KE1vbnxUdWV8V2VkfFRodXxGcml8U2F0fFN1biksP1xccyk/KFxcZHsxLDJ9KVxccyhKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYylcXHMoXFxkezIsNH0pXFxzKFxcZFxcZCk6KFxcZFxcZCkoPzo6KFxcZFxcZCkpP1xccyg/OihVVHxHTVR8W0VDTVBdW1NEXVQpfChbWnpdKXwoWystXVxcZHs0fSkpJC8sVm49e1VUOjAsR01UOjAsRURUOi0yNDAsRVNUOi0zMDAsQ0RUOi0zMDAsQ1NUOi0zNjAsTURUOi0zNjAsTVNUOi00MjAsUERUOi00MjAsUFNUOi00ODB9O2UuY3JlYXRlRnJvbUlucHV0RmFsbGJhY2s9ayhcInZhbHVlIHByb3ZpZGVkIGlzIG5vdCBpbiBhIHJlY29nbml6ZWQgUkZDMjgyMiBvciBJU08gZm9ybWF0LiBtb21lbnQgY29uc3RydWN0aW9uIGZhbGxzIGJhY2sgdG8ganMgRGF0ZSgpLCB3aGljaCBpcyBub3QgcmVsaWFibGUgYWNyb3NzIGFsbCBicm93c2VycyBhbmQgdmVyc2lvbnMuIE5vbiBSRkMyODIyL0lTTyBkYXRlIGZvcm1hdHMgYXJlIGRpc2NvdXJhZ2VkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYW4gdXBjb21pbmcgbWFqb3IgcmVsZWFzZS4gUGxlYXNlIHJlZmVyIHRvIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvanMtZGF0ZS8gZm9yIG1vcmUgaW5mby5cIixmdW5jdGlvbih0KXt0Ll9kPW5ldyBEYXRlKHQuX2krKHQuX3VzZVVUQz9cIiBVVENcIjpcIlwiKSl9KSxlLklTT184NjAxPWZ1bmN0aW9uKCl7fSxlLlJGQ18yODIyPWZ1bmN0aW9uKCl7fTt2YXIgVW49ayhcIm1vbWVudCgpLm1pbiBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50Lm1heCBpbnN0ZWFkLiBodHRwOi8vbW9tZW50anMuY29tL2d1aWRlcy8jL3dhcm5pbmdzL21pbi1tYXgvXCIsZnVuY3Rpb24oKXt2YXIgdD1EZS5hcHBseShudWxsLGFyZ3VtZW50cyk7cmV0dXJuIHRoaXMuaXNWYWxpZCgpJiZ0LmlzVmFsaWQoKT90PHRoaXM/dGhpczp0Om0oKX0pLHFuPWsoXCJtb21lbnQoKS5tYXggaXMgZGVwcmVjYXRlZCwgdXNlIG1vbWVudC5taW4gaW5zdGVhZC4gaHR0cDovL21vbWVudGpzLmNvbS9ndWlkZXMvIy93YXJuaW5ncy9taW4tbWF4L1wiLGZ1bmN0aW9uKCl7dmFyIHQ9RGUuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVybiB0aGlzLmlzVmFsaWQoKSYmdC5pc1ZhbGlkKCk/dD50aGlzP3RoaXM6dDptKCl9KSxYbj1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdz9EYXRlLm5vdygpOituZXcgRGF0ZX0sWm49W1wieWVhclwiLFwicXVhcnRlclwiLFwibW9udGhcIixcIndlZWtcIixcImRheVwiLFwiaG91clwiLFwibWludXRlXCIsXCJzZWNvbmRcIixcIm1pbGxpc2Vjb25kXCJdO0FlKFwiWlwiLFwiOlwiKSxBZShcIlpaXCIsXCJcIiksVShcIlpcIixubiksVShcIlpaXCIsbm4pLEsoW1wiWlwiLFwiWlpcIl0sZnVuY3Rpb24odCxlLGkpe2kuX3VzZVVUQz0hMCxpLl90em09emUobm4sdCl9KTt2YXIgS249LyhbXFwrXFwtXXxcXGRcXGQpL2dpO2UudXBkYXRlT2Zmc2V0PWZ1bmN0aW9uKCl7fTt2YXIgSm49L14oXFwtfFxcKyk/KD86K
21167FxcZCopWy4gXSk/KFxcZCspXFw6KFxcZCspKD86XFw6KFxcZCspKFxcLlxcZCopPyk/JC8sJG49L14oLXxcXCspP1AoPzooWy0rXT9bMC05LC5dKilZKT8oPzooWy0rXT9bMC05LC5dKilNKT8oPzooWy0rXT9bMC05LC5dKilXKT8oPzooWy0rXT9bMC05LC5dKilEKT8oPzpUKD86KFstK10/WzAtOSwuXSopSCk/KD86KFstK10/WzAtOSwuXSopTSk/KD86KFstK10/WzAtOSwuXSopUyk/KT8kLztLZS5mbj1JZS5wcm90b3R5cGUsS2UuaW52YWxpZD1QZTt2YXIgUW49dGkoMSxcImFkZFwiKSx0cz10aSgtMSxcInN1YnRyYWN0XCIpO2UuZGVmYXVsdEZvcm1hdD1cIllZWVktTU0tRERUSEg6bW06c3NaXCIsZS5kZWZhdWx0Rm9ybWF0VXRjPVwiWVlZWS1NTS1ERFRISDptbTpzc1taXVwiO3ZhciBlcz1rKFwibW9tZW50KCkubGFuZygpIGlzIGRlcHJlY2F0ZWQuIEluc3RlYWQsIHVzZSBtb21lbnQoKS5sb2NhbGVEYXRhKCkgdG8gZ2V0IHRoZSBsYW5ndWFnZSBjb25maWd1cmF0aW9uLiBVc2UgbW9tZW50KCkubG9jYWxlKCkgdG8gY2hhbmdlIGxhbmd1YWdlcy5cIixmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmxvY2FsZURhdGEoKTp0aGlzLmxvY2FsZSh0KX0pO0goMCxbXCJnZ1wiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy53ZWVrWWVhcigpJTEwMH0pLEgoMCxbXCJHR1wiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc29XZWVrWWVhcigpJTEwMH0pLEFpKFwiZ2dnZ1wiLFwid2Vla1llYXJcIiksQWkoXCJnZ2dnZ1wiLFwid2Vla1llYXJcIiksQWkoXCJHR0dHXCIsXCJpc29XZWVrWWVhclwiKSxBaShcIkdHR0dHXCIsXCJpc29XZWVrWWVhclwiKSxBKFwid2Vla1llYXJcIixcImdnXCIpLEEoXCJpc29XZWVrWWVhclwiLFwiR0dcIiksRihcIndlZWtZZWFyXCIsMSksRihcImlzb1dlZWtZZWFyXCIsMSksVShcIkdcIixlbiksVShcImdcIixlbiksVShcIkdHXCIsWG8sR28pLFUoXCJnZ1wiLFhvLEdvKSxVKFwiR0dHR1wiLCRvLFVvKSxVKFwiZ2dnZ1wiLCRvLFVvKSxVKFwiR0dHR0dcIixRbyxxbyksVShcImdnZ2dnXCIsUW8scW8pLEooW1wiZ2dnZ1wiLFwiZ2dnZ2dcIixcIkdHR0dcIixcIkdHR0dHXCJdLGZ1bmN0aW9uKHQsZSxpLG8pe2Vbby5zdWJzdHIoMCwyKV09Xyh0KX0pLEooW1wiZ2dcIixcIkdHXCJdLGZ1bmN0aW9uKHQsaSxvLG4pe2lbbl09ZS5wYXJzZVR3b0RpZ2l0WWVhcih0KX0pLEgoXCJRXCIsMCxcIlFvXCIsXCJxdWFydGVyXCIpLEEoXCJxdWFydGVyXCIsXCJRXCIpLEYoXCJxdWFydGVyXCIsNyksVShcIlFcIixZbyksSyhcIlFcIixmdW5jdGlvbih0LGUpe2VbbG5dPTMqKF8odCktMSl9KSxIKFwiRFwiLFtcIkREXCIsMl0sXCJEb1wiLFwiZGF0ZVwiKSxBKFwiZGF0ZVwiLFwiRFwiKSxGKFwiZGF0ZVwiLDkpLFUoXCJEXCIsWG8pLFUoXCJERFwiLFhvLEdvKSxVKFwiRG9cIixmdW5jdGlvbih0LGUpe3JldHVybiB0P2UuX2RheU9mTW9udGhPcmRpbmFsUGFyc2V8fGUuX29yZGluYWxQYXJzZTplLl9kYXlPZk1vbnRoT3JkaW5hbFBhcnNlTGVuaWVudH0pLEsoW1wiRFwiLFwiRERcIl0sdW4pLEsoXCJEb1wiLGZ1bmN0aW9uKHQsZSl7ZVt1bl09Xyh0Lm1hdGNoKFhvKVswXSwxMCl9KTt2YXIgaXM9aXQoXCJEYXRlXCIsITApO0goXCJERERcIixbXCJEREREXCIsM10sXCJERERvXCIsXCJkYXlPZlllYXJcIiksQShcImRheU9mWWVhclwiLFwiREREXCIpLEYoXCJkYXlPZlllYXJcIiw0KSxVKFwiREREXCIsSm8pLFUoXCJEREREXCIsVm8pLEsoW1wiREREXCIsXCJEREREXCJdLGZ1bmN0aW9uKHQsZSxpKXtpLl9kYXlPZlllYXI9Xyh0KX0pLEgoXCJtXCIsW1wibW1cIiwyXSwwLFwibWludXRlXCIpLEEoXCJtaW51dGVcIixcIm1cIiksRihcIm1pbnV0ZVwiLDE0KSxVKFwibVwiLFhvKSxVKFwibW1cIixYbyxHbyksSyhbXCJtXCIsXCJtbVwiXSxwbik7dmFyIG9zPWl0KFwiTWludXRlc1wiLCExKTtIKFwic1wiLFtcInNzXCIsMl0sMCxcInNlY29uZFwiKSxBKFwic2Vjb25kXCIsXCJzXCIpLEYoXCJzZWNvbmRcIiwxNSksVShcInNcIixYbyksVShcInNzXCIsWG8sR28pLEsoW1wic1wiLFwic3NcIl0sZm4pO3ZhciBucz1pdChcIlNlY29uZHNcIiwhMSk7SChcIlNcIiwwLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTAwKX0pLEgoMCxbXCJTU1wiLDJdLDAsZnVuY3Rpb24oKXtyZXR1cm5+fih0aGlzLm1pbGxpc2Vjb25kKCkvMTApfSksSCgwLFtcIlNTU1wiLDNdLDAsXCJtaWxsaXNlY29uZFwiKSxIKDAsW1wiU1NTU1wiLDRdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMTAqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTXCIsNV0sMCxmdW5jdGlvbigpe3JldHVybiAxMDAqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTU1wiLDZdLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWUzKnRoaXMubWlsbGlzZWNvbmQoKX0pLEgoMCxbXCJTU1NTU1NTXCIsN10sMCxmdW5jdGlvbigpe3JldHVybiAxZTQqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTU1NTXCIsOF0sMCxmdW5jdGlvbigpe3JldHVybiAxZTUqdGhpcy5taWxsaXNlY29uZCgpfSksSCgwLFtcIlNTU1NTU1NTU1wiLDldLDAsZnVuY3Rpb24oKXtyZXR1cm4gMWU2KnRoaXMubWlsbGlzZWNvbmQoKX0pLEEoXCJtaWxsaXNlY29uZFwiLFwibXNcIiksRihcIm1pbGxpc2Vjb25kXCIsMTYpLFUoXCJTXCIsSm8sWW8pLFUoXCJTU1wiLEpvLEdvKSxVKFwiU1NTXCIsSm8sVm8pO3ZhciBzcztmb3Ioc3M9XCJTU1NTXCI7c3MubGVuZ3RoPD05O3NzKz1cIlNcIilVKHNzLHRuKTtmb3Ioc3M9XCJTXCI7c3MubGVuZ3RoPD05O3NzKz1cIlNcIilLKHNzLEdpKTt2YXIgcnM9aXQoXCJNaWxsaXNlY29uZHNcIiwhMSk7SChcInpcIiwwLDAsXCJ6b25lQWJiclwiKSxIKFwienpcIiwwLDAsXCJ6b25lTmFtZVwiKTt2YXIgYXM9Zy5wcm90b3R5cGU7YXMuYWRkPVFuLGFzLmNhbGVuZGFyPW9pLGFzLmNsb25lPW5pLGFzLmRpZmY9dWksYXMuZW5kT2Y9U2ksYXMuZm9ybWF0PXZpLGFzLmZyb209Z2ksYXMuZnJvbU5vdz15aSxhcy50bz1iaSxhcy50b05vdz1faSxhcy5nZXQ9c3QsYXMuaW52YWxpZEF0PU5pLGFzLmlzQWZ0ZXI9c2ksYXMuaXNCZWZvcmU9cmksYXMuaXNCZXR3ZWVuPWFpLGFzLmlzU2FtZT1oaSxhcy5pc1NhbWVPckFmdGVyPWRpLGFzLmlzU2FtZU9yQmVmb3JlPWxpLGFzLmlzVmFsaWQ9
21167UGksYXMubGFuZz1lcyxhcy5sb2NhbGU9d2ksYXMubG9jYWxlRGF0YT14aSxhcy5tYXg9cW4sYXMubWluPVVuLGFzLnBhcnNpbmdGbGFncz1JaSxhcy5zZXQ9cnQsYXMuc3RhcnRPZj1raSxhcy5zdWJ0cmFjdD10cyxhcy50b0FycmF5PU9pLGFzLnRvT2JqZWN0PUVpLGFzLnRvRGF0ZT1DaSxhcy50b0lTT1N0cmluZz1maSxhcy5pbnNwZWN0PW1pLGFzLnRvSlNPTj1UaSxhcy50b1N0cmluZz1waSxhcy51bml4PU1pLGFzLnZhbHVlT2Y9RGksYXMuY3JlYXRpb25EYXRhPVJpLGFzLnllYXI9Ym4sYXMuaXNMZWFwWWVhcj1ldCxhcy53ZWVrWWVhcj16aSxhcy5pc29XZWVrWWVhcj1MaSxhcy5xdWFydGVyPWFzLnF1YXJ0ZXJzPVdpLGFzLm1vbnRoPWZ0LGFzLmRheXNJbk1vbnRoPW10LGFzLndlZWs9YXMud2Vla3M9T3QsYXMuaXNvV2Vlaz1hcy5pc29XZWVrcz1FdCxhcy53ZWVrc0luWWVhcj1CaSxhcy5pc29XZWVrc0luWWVhcj1GaSxhcy5kYXRlPWlzLGFzLmRheT1hcy5kYXlzPUx0LGFzLndlZWtkYXk9RnQsYXMuaXNvV2Vla2RheT1CdCxhcy5kYXlPZlllYXI9WWksYXMuaG91cj1hcy5ob3Vycz1Sbixhcy5taW51dGU9YXMubWludXRlcz1vcyxhcy5zZWNvbmQ9YXMuc2Vjb25kcz1ucyxhcy5taWxsaXNlY29uZD1hcy5taWxsaXNlY29uZHM9cnMsYXMudXRjT2Zmc2V0PUJlLGFzLnV0Yz1IZSxhcy5sb2NhbD1XZSxhcy5wYXJzZVpvbmU9WWUsYXMuaGFzQWxpZ25lZEhvdXJPZmZzZXQ9R2UsYXMuaXNEU1Q9VmUsYXMuaXNMb2NhbD1xZSxhcy5pc1V0Y09mZnNldD1YZSxhcy5pc1V0Yz1aZSxhcy5pc1VUQz1aZSxhcy56b25lQWJicj1WaSxhcy56b25lTmFtZT1VaSxhcy5kYXRlcz1rKFwiZGF0ZXMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIGRhdGUgaW5zdGVhZC5cIixpcyksYXMubW9udGhzPWsoXCJtb250aHMgYWNjZXNzb3IgaXMgZGVwcmVjYXRlZC4gVXNlIG1vbnRoIGluc3RlYWRcIixmdCksYXMueWVhcnM9ayhcInllYXJzIGFjY2Vzc29yIGlzIGRlcHJlY2F0ZWQuIFVzZSB5ZWFyIGluc3RlYWRcIixibiksYXMuem9uZT1rKFwibW9tZW50KCkuem9uZSBpcyBkZXByZWNhdGVkLCB1c2UgbW9tZW50KCkudXRjT2Zmc2V0IGluc3RlYWQuIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3Mvem9uZS9cIixqZSksYXMuaXNEU1RTaGlmdGVkPWsoXCJpc0RTVFNoaWZ0ZWQgaXMgZGVwcmVjYXRlZC4gU2VlIGh0dHA6Ly9tb21lbnRqcy5jb20vZ3VpZGVzLyMvd2FybmluZ3MvZHN0LXNoaWZ0ZWQvIGZvciBtb3JlIGluZm9ybWF0aW9uXCIsVWUpO3ZhciBocz1PLnByb3RvdHlwZTtocy5jYWxlbmRhcj1FLGhzLmxvbmdEYXRlRm9ybWF0PVQsaHMuaW52YWxpZERhdGU9UCxocy5vcmRpbmFsPUksaHMucHJlcGFyc2U9WmksaHMucG9zdGZvcm1hdD1aaSxocy5yZWxhdGl2ZVRpbWU9Tixocy5wYXN0RnV0dXJlPVIsaHMuc2V0PU0saHMubW9udGhzPWR0LGhzLm1vbnRoc1Nob3J0PWx0LGhzLm1vbnRoc1BhcnNlPWN0LGhzLm1vbnRoc1JlZ2V4PWd0LGhzLm1vbnRoc1Nob3J0UmVnZXg9dnQsaHMud2Vlaz1EdCxocy5maXJzdERheU9mWWVhcj1DdCxocy5maXJzdERheU9mV2Vlaz1NdCxocy53ZWVrZGF5cz1JdCxocy53ZWVrZGF5c01pbj1SdCxocy53ZWVrZGF5c1Nob3J0PU50LGhzLndlZWtkYXlzUGFyc2U9enQsaHMud2Vla2RheXNSZWdleD1qdCxocy53ZWVrZGF5c1Nob3J0UmVnZXg9SHQsaHMud2Vla2RheXNNaW5SZWdleD1XdCxocy5pc1BNPVh0LGhzLm1lcmlkaWVtPVp0LFF0KFwiZW5cIix7ZGF5T2ZNb250aE9yZGluYWxQYXJzZTovXFxkezEsMn0odGh8c3R8bmR8cmQpLyxvcmRpbmFsOmZ1bmN0aW9uKHQpe3ZhciBlPXQlMTA7cmV0dXJuIHQrKDE9PT1fKHQlMTAwLzEwKT9cInRoXCI6MT09PWU/XCJzdFwiOjI9PT1lP1wibmRcIjozPT09ZT9cInJkXCI6XCJ0aFwiKX19KSxlLmxhbmc9ayhcIm1vbWVudC5sYW5nIGlzIGRlcHJlY2F0ZWQuIFVzZSBtb21lbnQubG9jYWxlIGluc3RlYWQuXCIsUXQpLGUubGFuZ0RhdGE9ayhcIm1vbWVudC5sYW5nRGF0YSBpcyBkZXByZWNhdGVkLiBVc2UgbW9tZW50LmxvY2FsZURhdGEgaW5zdGVhZC5cIixpZSk7dmFyIGRzPU1hdGguYWJzLGxzPW1vKFwibXNcIiksdXM9bW8oXCJzXCIpLGNzPW1vKFwibVwiKSxwcz1tbyhcImhcIiksZnM9bW8oXCJkXCIpLG1zPW1vKFwid1wiKSx2cz1tbyhcIk1cIiksZ3M9bW8oXCJ5XCIpLHlzPXlvKFwibWlsbGlzZWNvbmRzXCIpLGJzPXlvKFwic2Vjb25kc1wiKSxfcz15byhcIm1pbnV0ZXNcIiksd3M9eW8oXCJob3Vyc1wiKSx4cz15byhcImRheXNcIiksa3M9eW8oXCJtb250aHNcIiksU3M9eW8oXCJ5ZWFyc1wiKSxEcz1NYXRoLnJvdW5kLE1zPXtzczo0NCxzOjQ1LG06NDUsaDoyMixkOjI2LE06MTF9LENzPU1hdGguYWJzLE9zPUllLnByb3RvdHlwZTtyZXR1cm4gT3MuaXNWYWxpZD1UZSxPcy5hYnM9bm8sT3MuYWRkPXJvLE9zLnN1YnRyYWN0PWFvLE9zLmFzPXBvLE9zLmFzTWlsbGlzZWNvbmRzPWxzLE9zLmFzU2Vjb25kcz11cyxPcy5hc01pbnV0ZXM9Y3MsT3MuYXNIb3Vycz1wcyxPcy5hc0RheXM9ZnMsT3MuYXNXZWVrcz1tcyxPcy5hc01vbnRocz12cyxPcy5hc1llYXJzPWdzLE9zLnZhbHVlT2Y9Zm8sT3MuX2J1YmJsZT1sbyxPcy5jbG9uZT12byxPcy5nZXQ9Z28sT3MubWlsbGlzZWNvbmRzPXlzLE9zLnNlY29uZHM9YnMsT3MubWludXRlcz1fcyxPcy5ob3Vycz13cyxPcy5kYXlzPXhzLE9zLndlZWtzPWJvLE9zLm1vbnRocz1rcyxPcy55ZWFycz1TcyxPcy5odW1hbml6ZT1TbyxPcy50b0lTT1N0cmluZz1NbyxPcy50b1N0cmluZz1NbyxPcy50b0pTT049TW8sT3MubG9jYWxlPXdpLE9zLmxvY2FsZURhdGE9eGksT3MudG9Jc29TdHJpbmc9ayhcInRvSXNvU3RyaW5nKCkgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0b0lTT1N0cmluZygpIGluc3RlYWQgKG5vdGljZSB0aGUgY2FwaXRhbHMpXCIsTW8pLE9zLmxhbmc9ZXMsSChcIlhcIiwwLDAsXCJ1bml4XCIpLEgoXCJ4XCIsMCwwLFwidmFsdWVPZlwiKSxVKFwieFwiLGVuKSxVKFwiWFwiLHNuKSxLKFwiWFwiLGZ1bmN0aW9uKHQsZSxpKXtpLl9kPW5ldyBEYXRlKDFlMypwYXJzZU
21167Zsb2F0KHQsMTApKX0pLEsoXCJ4XCIsZnVuY3Rpb24odCxlLGkpe2kuX2Q9bmV3IERhdGUoXyh0KSl9KSxlLnZlcnNpb249XCIyLjE5LjFcIixmdW5jdGlvbih0KXtDbz10fShEZSksZS5mbj1hcyxlLm1pbj1DZSxlLm1heD1PZSxlLm5vdz1YbixlLnV0Yz11LGUudW5peD1xaSxlLm1vbnRocz1RaSxlLmlzRGF0ZT1hLGUubG9jYWxlPVF0LGUuaW52YWxpZD1tLGUuZHVyYXRpb249S2UsZS5pc01vbWVudD15LGUud2Vla2RheXM9ZW8sZS5wYXJzZVpvbmU9WGksZS5sb2NhbGVEYXRhPWllLGUuaXNEdXJhdGlvbj1OZSxlLm1vbnRoc1Nob3J0PXRvLGUud2Vla2RheXNNaW49b28sZS5kZWZpbmVMb2NhbGU9dGUsZS51cGRhdGVMb2NhbGU9ZWUsZS5sb2NhbGVzPW9lLGUud2Vla2RheXNTaG9ydD1pbyxlLm5vcm1hbGl6ZVVuaXRzPXosZS5yZWxhdGl2ZVRpbWVSb3VuZGluZz14byxlLnJlbGF0aXZlVGltZVRocmVzaG9sZD1rbyxlLmNhbGVuZGFyRm9ybWF0PWlpLGUucHJvdG90eXBlPWFzLGV9KX0pLmNhbGwoZSxpKDE1NSkodCkpfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gdC53ZWJwYWNrUG9seWZpbGx8fCh0LmRlcHJlY2F0ZT1mdW5jdGlvbigpe30sdC5wYXRocz1bXSx0LmNoaWxkcmVufHwodC5jaGlsZHJlbj1bXSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsXCJsb2FkZWRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5sfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiaWRcIix7ZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdC5pfX0pLHQud2VicGFja1BvbHlmaWxsPTEpLHR9fSxmdW5jdGlvbih0LGUpe2Z1bmN0aW9uIGkodCl7dGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIit0K1wiJy5cIil9aS5rZXlzPWZ1bmN0aW9uKCl7cmV0dXJuW119LGkucmVzb2x2ZT1pLHQuZXhwb3J0cz1pLGkuaWQ9MTU2fSxmdW5jdGlvbih0LGUsaSl7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGkodCxlLGkpe3ZhciBvPWUmJml8fDAsbj0wO2ZvcihlPWV8fFtdLHQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9bMC05YS1mXXsyfS9nLGZ1bmN0aW9uKHQpe248MTYmJihlW28rbisrXT11W3RdKX0pO248MTY7KWVbbytuKytdPTA7cmV0dXJuIGV9ZnVuY3Rpb24gbyh0LGUpe3ZhciBpPWV8fDAsbz1sO3JldHVybiBvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rXCItXCIrb1t0W2krK11dK29bdFtpKytdXStcIi1cIitvW3RbaSsrXV0rb1t0W2krK11dK1wiLVwiK29bdFtpKytdXStvW3RbaSsrXV0rXCItXCIrb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV0rb1t0W2krK11dK29bdFtpKytdXStvW3RbaSsrXV19ZnVuY3Rpb24gbih0LGUsaSl7dmFyIG49ZSYmaXx8MCxzPWV8fFtdO3Q9dHx8e307dmFyIHI9dm9pZCAwIT09dC5jbG9ja3NlcT90LmNsb2Nrc2VxOm0sYT12b2lkIDAhPT10Lm1zZWNzP3QubXNlY3M6KG5ldyBEYXRlKS5nZXRUaW1lKCksaD12b2lkIDAhPT10Lm5zZWNzP3QubnNlY3M6ZysxLGQ9YS12KyhoLWcpLzFlNDtpZihkPDAmJnZvaWQgMD09PXQuY2xvY2tzZXEmJihyPXIrMSYxNjM4MyksKGQ8MHx8YT52KSYmdm9pZCAwPT09dC5uc2VjcyYmKGg9MCksaD49MWU0KXRocm93IG5ldyBFcnJvcihcInV1aWQudjEoKTogQ2FuJ3QgY3JlYXRlIG1vcmUgdGhhbiAxME0gdXVpZHMvc2VjXCIpO3Y9YSxnPWgsbT1yLGErPTEyMjE5MjkyOGU1O3ZhciBsPSgxZTQqKDI2ODQzNTQ1NSZhKStoKSU0Mjk0OTY3Mjk2O3NbbisrXT1sPj4+MjQmMjU1LHNbbisrXT1sPj4+MTYmMjU1LHNbbisrXT1sPj4+OCYyNTUsc1tuKytdPTI1NSZsO3ZhciB1PWEvNDI5NDk2NzI5NioxZTQmMjY4NDM1NDU1O3NbbisrXT11Pj4+OCYyNTUsc1tuKytdPTI1NSZ1LHNbbisrXT11Pj4+MjQmMTV8MTYsc1tuKytdPXU+Pj4xNiYyNTUsc1tuKytdPXI+Pj44fDEyOCxzW24rK109MjU1JnI7Zm9yKHZhciBjPXQubm9kZXx8ZixwPTA7cDw2O3ArKylzW24rcF09Y1twXTtyZXR1cm4gZXx8byhzKX1mdW5jdGlvbiBzKHQsZSxpKXt2YXIgbj1lJiZpfHwwO1wic3RyaW5nXCI9PXR5cGVvZiB0JiYoZT1cImJpbmFyeVwiPT10P25ldyBBcnJheSgxNik6bnVsbCx0PW51bGwpLHQ9dHx8e307dmFyIHM9dC5yYW5kb218fCh0LnJuZ3x8cikoKTtpZihzWzZdPTE1JnNbNl18NjQsc1s4XT02MyZzWzhdfDEyOCxlKWZvcih2YXIgYT0wO2E8MTY7YSsrKWVbbithXT1zW2FdO3JldHVybiBlfHxvKHMpfXZhciByLGE9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dm9pZCAwIT09ZT9lOm51bGw7aWYoYSYmYS5jcnlwdG8mJmNyeXB0by5nZXRSYW5kb21WYWx1ZXMpe3ZhciBoPW5ldyBVaW50OEFycmF5KDE2KTtyPWZ1bmN0aW9uKCl7cmV0dXJuIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMoaCksaH19aWYoIXIpe3ZhciBkPW5ldyBBcnJheSgxNik7cj1mdW5jdGlvbigpe2Zvcih2YXIgdCxlPTA7ZTwxNjtlKyspMD09KDMmZSkmJih0PTQyOTQ5NjcyOTYqTWF0aC5yYW5kb20oKSksZFtlXT10Pj4+KCgzJmUpPDwzKSYyNTU7cmV0dXJuIGR9fWZvcih2YXIgbD1bXSx1PXt9LGM9MDtjPDI1NjtjKyspbFtjXT0oYysyNTYpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSksdVtsW2NdXT1jO3ZhciBwPXIoKSxmPVsxfHBbMF0scFsxXSxwWzJdLHBbM10scFs0XSxwWzVdXSxtPTE2MzgzJihwWzZdPDw4fHBbN10pLHY9MCxnPTAseT1zO3kudjE9bix5LnY0PXMseS5wYXJzZT1pLHkudW5wYXJzZT1vLHQuZXhwb3J0cz15fSkuY2FsbChlLGkoMTU4KSl9LGZ1bmN0aW9uKHQsZSl7dmFyIGk7aT1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtpPWl8fEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKXx8KDAsZXZhbCkoXCJ0aGlzXCIpfWNhdGNoKHQpe1wib2JqZWN0XCI9PXR5cGVvZiB3aW5kb3cmJihpPXdpbmRvdyl9dC5leHBvcnRzPWl9LGZ1bmN0aW9uKHQsZSxpKXtlLnV0aWw9aSgyKSxlLkRPTXV0aWw9aSgxNCksZS5EYXRhU2V0PWkoMTEpLGUuRGF0YVZpZXc9aSgxMiksZS5RdWV1ZT1pKDQzKSxlLkdyYXBoM2Q9aSgxNjEpLGUuZ3JhcGgzZD17Q2FtZXJhOmkoOTUpLEZpbHRlcjppKDk2KSxQb2ludDJkOmkoOTEpLFBvaW50M2Q6aSgzNCksU2xpZGVyOmkoOTIpLFN0ZXBOdW1iZXI6aSg5Myl9LGUubW9tZW50PWkoOSksZS5IYW1tZXI9aSgxMCksZS5rZXljaGFybT1pKDM1KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoNyksbj1vLkpTT058fChvLkpTT049e3N0cmluZ2lmeTpKU09OLnN0cmluZ2lmeX0pO3QuZXhwb3J0cz1mdW5jdGlvbih0KXtyZXR1cm4gbi5zdHJpbmdpZnkuYXBwbHkobixhcmd1bWVudHMpfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCxlLGkpe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvclwiKTt0aGlzLmNvbnRhaW5lckVsZW1lbnQ9dCx0aGlzLmRhdGFHcm91cD1uZXcgXyx0aGlzLmRhdGFQb2ludHM9bnVsbCx0aGlzLmNyZWF0ZSgpLGYuc2V0RGVmYXVsdHMoby5ERUZBVUxUUyx0aGlzKSx0aGlzLmNvbFg9dm9pZCAwLHRoaXMuY29sWT12b2lkIDAsdGhpcy5jb2xaPXZvaWQgMCx0aGlzLmNvbFZhbHVlPXZvaWQgMCx0aGlzLnNldE9wdGlvbnMoaSksdGhpcy5zZXREYXRhKGUpfWZ1bmN0aW9uIG4odCl7cmV0dXJuXCJjbGllbnRYXCJpbiB0P3QuY2xpZW50WDp0LnRhcmdldFRvdWNoZXNbMF0mJnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRYfHwwfWZ1bmN0aW9uIHModCl7cmV0dXJuXCJjbGllbnRZXCJpbiB0P3QuY2xpZW50WTp0LnRhcmdldFRvdWNoZXNbMF0mJnQudGFyZ2V0VG91Y2hlc1swXS5jbGllbnRZfHwwfXZhciByPWkoOTApLGE9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fShyKSxoPWkoNDQpLGQ9aSgyKSxsPWkoMzQpLHU9aSg5MSksYz1pKDkyKSxwPWkoOTMpLGY9aSg5NCksbT1pKDE1KS5kZWZh
21167dWx0LHY9aSgxNSksZz12LnByaW50U3R5bGUseT1pKDE3MiksYj15LmFsbE9wdGlvbnMsXz1pKDE3Myk7by5TVFlMRT1mLlNUWUxFO28uREVGQVVMVFM9e3dpZHRoOlwiNDAwcHhcIixoZWlnaHQ6XCI0MDBweFwiLGZpbHRlckxhYmVsOlwidGltZVwiLGxlZ2VuZExhYmVsOlwidmFsdWVcIix4TGFiZWw6XCJ4XCIseUxhYmVsOlwieVwiLHpMYWJlbDpcInpcIix4VmFsdWVMYWJlbDpmdW5jdGlvbih0KXtyZXR1cm4gdH0seVZhbHVlTGFiZWw6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LHpWYWx1ZUxhYmVsOmZ1bmN0aW9uKHQpe3JldHVybiB0fSxzaG93WEF4aXM6ITAsc2hvd1lBeGlzOiEwLHNob3daQXhpczohMCxzaG93R3JpZDohMCxzaG93UGVyc3BlY3RpdmU6ITAsc2hvd1NoYWRvdzohMSxrZWVwQXNwZWN0UmF0aW86ITAsdmVydGljYWxSYXRpbzouNSxkb3RTaXplUmF0aW86LjAyLGRvdFNpemVNaW5GcmFjdGlvbjouNSxkb3RTaXplTWF4RnJhY3Rpb246Mi41LHNob3dBbmltYXRpb25Db250cm9sczp2b2lkIDAsYW5pbWF0aW9uSW50ZXJ2YWw6MWUzLGFuaW1hdGlvblByZWxvYWQ6ITEsYW5pbWF0aW9uQXV0b1N0YXJ0OnZvaWQgMCxheGlzQ29sb3I6XCIjNEQ0RDREXCIsZ3JpZENvbG9yOlwiI0QzRDNEM1wiLHhDZW50ZXI6XCI1NSVcIix5Q2VudGVyOlwiNTAlXCIsc3R5bGU6by5TVFlMRS5ET1QsdG9vbHRpcDohMSx0b29sdGlwU3R5bGU6e2NvbnRlbnQ6e3BhZGRpbmc6XCIxMHB4XCIsYm9yZGVyOlwiMXB4IHNvbGlkICM0ZDRkNGRcIixjb2xvcjpcIiMxYTFhMWFcIixiYWNrZ3JvdW5kOlwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCIsYm9yZGVyUmFkaXVzOlwiMnB4XCIsYm94U2hhZG93OlwiNXB4IDVweCAxMHB4IHJnYmEoMTI4LDEyOCwxMjgsMC41KVwifSxsaW5lOntoZWlnaHQ6XCI0MHB4XCIsd2lkdGg6XCIwXCIsYm9yZGVyTGVmdDpcIjFweCBzb2xpZCAjNGQ0ZDRkXCJ9LGRvdDp7aGVpZ2h0OlwiMFwiLHdpZHRoOlwiMFwiLGJvcmRlcjpcIjVweCBzb2xpZCAjNGQ0ZDRkXCIsYm9yZGVyUmFkaXVzOlwiNXB4XCJ9fSxkYXRhQ29sb3I6e2ZpbGw6XCIjN0RDMUZGXCIsc3Ryb2tlOlwiIzMyNjdEMlwiLHN0cm9rZVdpZHRoOjF9LGNhbWVyYVBvc2l0aW9uOntob3Jpem9udGFsOjEsdmVydGljYWw6LjUsZGlzdGFuY2U6MS43fSxzaG93TGVnZW5kOnZvaWQgMCxiYWNrZ3JvdW5kQ29sb3I6dm9pZCAwLHhCYXJXaWR0aDp2b2lkIDAseUJhcldpZHRoOnZvaWQgMCx2YWx1ZU1pbjp2b2lkIDAsdmFsdWVNYXg6dm9pZCAwLHhNaW46dm9pZCAwLHhNYXg6dm9pZCAwLHhTdGVwOnZvaWQgMCx5TWluOnZvaWQgMCx5TWF4OnZvaWQgMCx5U3RlcDp2b2lkIDAsek1pbjp2b2lkIDAsek1heDp2b2lkIDAselN0ZXA6dm9pZCAwfSxoKG8ucHJvdG90eXBlKSxvLnByb3RvdHlwZS5fc2V0U2NhbGU9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlPW5ldyBsKDEvdGhpcy54UmFuZ2UucmFuZ2UoKSwxL3RoaXMueVJhbmdlLnJhbmdlKCksMS90aGlzLnpSYW5nZS5yYW5nZSgpKSx0aGlzLmtlZXBBc3BlY3RSYXRpbyYmKHRoaXMuc2NhbGUueDx0aGlzLnNjYWxlLnk/dGhpcy5zY2FsZS55PXRoaXMuc2NhbGUueDp0aGlzLnNjYWxlLng9dGhpcy5zY2FsZS55KSx0aGlzLnNjYWxlLnoqPXRoaXMudmVydGljYWxSYXRpbyx2b2lkIDAhPT10aGlzLnZhbHVlUmFuZ2UmJih0aGlzLnNjYWxlLnZhbHVlPTEvdGhpcy52YWx1ZVJhbmdlLnJhbmdlKCkpO3ZhciB0PXRoaXMueFJhbmdlLmNlbnRlcigpKnRoaXMuc2NhbGUueCxlPXRoaXMueVJhbmdlLmNlbnRlcigpKnRoaXMuc2NhbGUueSxpPXRoaXMuelJhbmdlLmNlbnRlcigpKnRoaXMuc2NhbGUuejt0aGlzLmNhbWVyYS5zZXRBcm1Mb2NhdGlvbih0LGUsaSl9LG8ucHJvdG90eXBlLl9jb252ZXJ0M0R0bzJEPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb24odCk7cmV0dXJuIHRoaXMuX2NvbnZlcnRUcmFuc2xhdGlvblRvU2NyZWVuKGUpfSxvLnByb3RvdHlwZS5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmNhbWVyYS5nZXRDYW1lcmFMb2NhdGlvbigpLGk9dGhpcy5jYW1lcmEuZ2V0Q2FtZXJhUm90YXRpb24oKSxvPXQueCp0aGlzLnNjYWxlLngsbj10LnkqdGhpcy5zY2FsZS55LHM9dC56KnRoaXMuc2NhbGUueixyPWUueCxhPWUueSxoPWUueixkPU1hdGguc2luKGkueCksdT1NYXRoLmNvcyhpLngpLGM9TWF0aC5zaW4oaS55KSxwPU1hdGguY29zKGkueSksZj1NYXRoLnNpbihpLnopLG09TWF0aC5jb3MoaS56KTtyZXR1cm4gbmV3IGwocCooZioobi1hKSttKihvLXIpKS1jKihzLWgpLGQqKHAqKHMtaCkrYyooZioobi1hKSttKihvLXIpKSkrdSoobSoobi1hKS1mKihvLXIpKSx1KihwKihzLWgpK2MqKGYqKG4tYSkrbSooby1yKSkpLWQqKG0qKG4tYSktZiooby1yKSkpfSxvLnByb3RvdHlwZS5fY29udmVydFRyYW5zbGF0aW9uVG9TY3JlZW49ZnVuY3Rpb24odCl7dmFyIGUsaSxvPXRoaXMuZXllLngsbj10aGlzLmV5ZS55LHM9dGhpcy5leWUueixyPXQueCxhPXQueSxoPXQuejtyZXR1cm4gdGhpcy5zaG93UGVyc3BlY3RpdmU/KGU9cy9oKihyLW8pLGk9cy9oKihhLW4pKTooZT1yKigtcy90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSksaT1hKigtcy90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSkpLG5ldyB1KHRoaXMuY3VycmVudFhDZW50ZXIrZSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx0aGlzLmN1cnJlbnRZQ2VudGVyLWkqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgpfSxvLnByb3RvdHlwZS5fY2FsY1RyYW5zbGF0aW9ucz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHQubGVuZ3RoO2UrKyl7dmFyIGk9dFtlXTtpLnRyYW5zPXRoaXMuX2NvbnZlcnRQb2ludFRvVHJhbnNsYXRpb24oaS5wb2ludCksaS5zY3JlZW49dGhpcy5fY29udmVydFRyYW5zbGF0aW9uVG9TY3JlZW4oaS50cmFucyk7dmFyIG89dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbihpLmJvdHRvbSk7aS5kaXN0PXRoaXMuc2hvd1BlcnNwZWN0aXZlP28ubGVuZ3RoKCk6LW8uen12YXIgbj1mdW5jdGlvbih0LGUpe3JldHVybiBlLmRpc3QtdC5kaXN0fTt0LnNvcnQobil9LG8ucHJvdG90eXBlLl9pbml0aWFsaXplUmFuZ2VzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhR3JvdXA7dGhpcy54UmFuZ2U9dC54UmFuZ2UsdGhpcy55UmFuZ2U9dC55UmFuZ2UsdGhpcy56UmFuZ2U9dC56UmFuZ2UsdGhpcy52YWx1ZVJhbmdlPXQudmFsdWVSYW5nZSx0aGlzLnhTdGVwPXQueFN0ZXAsdGhpcy55U3RlcD10LnlTdGVwLHRoaXMuelN0ZXA9dC56U3RlcCx0aGlzLnhCYXJXaWR0aD10LnhCYXJXaWR0aCx0aGlzLnlCYXJXaWR0aD10LnlCYXJXaWR0aCx0aGlzLmNvbFg9dC5jb2xYLHRoaXMuY29sWT10LmNvbFksdGhpcy5jb2xaPXQuY29sWix0aGlzLmNvbFZhbHVlPXQuY29sVmFsdWUsdGhpcy5fc2V0U2NhbGUoKX0sby5wcm90b3R5cGUuZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz1uZXcgbDtvLng9dFtpXVt0aGlzLmNvbFhdfHwwLG8ueT10W2ldW3RoaXMuY29sWV18fDAsby56PXRbaV1bdGhpcy5jb2xaXXx8MCxvLmRhdGE9dFtpXSx2b2lkIDAhPT10aGlzLmNvbFZhbHVlJiYoby52YWx1ZT10W2ldW3RoaXMuY29sVmFsdWVdfHwwKTt2YXIgbj17fTtuLnBvaW50PW8sbi5ib3R0b209bmV3IGwoby54LG8ueSx0aGlzLnpSYW5nZS5taW4pLG4udHJhbnM9dm9pZCAwLG4uc2NyZWVuPXZvaWQgMCxlLnB1c2gobil9cmV0dXJuIGV9LG8ucHJvdG90eXBlLl9nZXREYXRhUG9pbnRzPWZ1bmN0aW9uKHQpe3ZhciBlLGksbixzLHI9W107aWYodGhpcy5zdHlsZT09PW8uU1RZTEUuR1JJRHx8dGhpcy5zdHlsZT09PW8uU1RZTEUuU1VSRkFDRSl7dmFyIGE9dGhpcy5kYXRhR3JvdXAuZ2V0RGlzdGluY3RWYWx1ZXModGhpcy5jb2xYLHQpLGg9dGh
21167pcy5kYXRhR3JvdXAuZ2V0RGlzdGluY3RWYWx1ZXModGhpcy5jb2xZLHQpO3I9dGhpcy5nZXREYXRhUG9pbnRzKHQpO3ZhciBkPVtdO2ZvcihuPTA7bjxyLmxlbmd0aDtuKyspe3M9cltuXTt2YXIgbD1hLmluZGV4T2Yocy5wb2ludC54KSx1PWguaW5kZXhPZihzLnBvaW50LnkpO3ZvaWQgMD09PWRbbF0mJihkW2xdPVtdKSxkW2xdW3VdPXN9Zm9yKGU9MDtlPGQubGVuZ3RoO2UrKylmb3IoaT0wO2k8ZFtlXS5sZW5ndGg7aSsrKWRbZV1baV0mJihkW2VdW2ldLnBvaW50UmlnaHQ9ZTxkLmxlbmd0aC0xP2RbZSsxXVtpXTp2b2lkIDAsZFtlXVtpXS5wb2ludFRvcD1pPGRbZV0ubGVuZ3RoLTE/ZFtlXVtpKzFdOnZvaWQgMCxkW2VdW2ldLnBvaW50Q3Jvc3M9ZTxkLmxlbmd0aC0xJiZpPGRbZV0ubGVuZ3RoLTE/ZFtlKzFdW2krMV06dm9pZCAwKX1lbHNlIGlmKHRoaXMuX2NoZWNrVmFsdWVGaWVsZCh0KSxyPXRoaXMuZ2V0RGF0YVBvaW50cyh0KSx0aGlzLnN0eWxlPT09by5TVFlMRS5MSU5FKWZvcihuPTA7bjxyLmxlbmd0aDtuKyspbj4wJiYocltuLTFdLnBvaW50TmV4dD1yW25dKTtyZXR1cm4gcn0sby5wcm90b3R5cGUuY3JlYXRlPWZ1bmN0aW9uKCl7Zm9yKDt0aGlzLmNvbnRhaW5lckVsZW1lbnQuaGFzQ2hpbGROb2RlcygpOyl0aGlzLmNvbnRhaW5lckVsZW1lbnQucmVtb3ZlQ2hpbGQodGhpcy5jb250YWluZXJFbGVtZW50LmZpcnN0Q2hpbGQpO3RoaXMuZnJhbWU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmZyYW1lLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmZyYW1lLnN0eWxlLm92ZXJmbG93PVwiaGlkZGVuXCIsdGhpcy5mcmFtZS5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImNhbnZhc1wiKSx0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5wb3NpdGlvbj1cInJlbGF0aXZlXCIsdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmZyYW1lLmNhbnZhcyk7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTt0LnN0eWxlLmNvbG9yPVwicmVkXCIsdC5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLHQuc3R5bGUucGFkZGluZz1cIjEwcHhcIix0LmlubmVySFRNTD1cIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiLHRoaXMuZnJhbWUuY2FudmFzLmFwcGVuZENoaWxkKHQpLHRoaXMuZnJhbWUuZmlsdGVyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5mcmFtZS5maWx0ZXIuc3R5bGUucG9zaXRpb249XCJhYnNvbHV0ZVwiLHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLmJvdHRvbT1cIjBweFwiLHRoaXMuZnJhbWUuZmlsdGVyLnN0eWxlLmxlZnQ9XCIwcHhcIix0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuZmlsdGVyKTt2YXIgZT10aGlzLGk9ZnVuY3Rpb24odCl7ZS5fb25Nb3VzZURvd24odCl9LG89ZnVuY3Rpb24odCl7ZS5fb25Ub3VjaFN0YXJ0KHQpfSxuPWZ1bmN0aW9uKHQpe2UuX29uV2hlZWwodCl9LHM9ZnVuY3Rpb24odCl7ZS5fb25Ub29sdGlwKHQpfSxyPWZ1bmN0aW9uKHQpe2UuX29uQ2xpY2sodCl9O2QuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcyxcIm1vdXNlZG93blwiLGkpLGQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLmZyYW1lLmNhbnZhcyxcInRvdWNoc3RhcnRcIixvKSxkLmFkZEV2ZW50TGlzdGVuZXIodGhpcy5mcmFtZS5jYW52YXMsXCJtb3VzZXdoZWVsXCIsbiksZC5hZGRFdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLFwibW91c2Vtb3ZlXCIscyksZC5hZGR
21167FdmVudExpc3RlbmVyKHRoaXMuZnJhbWUuY2FudmFzLFwiY2xpY2tcIixyKSx0aGlzLmNvbnRhaW5lckVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSl9LG8ucHJvdG90eXBlLl9zZXRTaXplPWZ1bmN0aW9uKHQsZSl7dGhpcy5mcmFtZS5zdHlsZS53aWR0aD10LHRoaXMuZnJhbWUuc3R5bGUuaGVpZ2h0PWUsdGhpcy5fcmVzaXplQ2FudmFzKCl9LG8ucHJvdG90eXBlLl9yZXNpemVDYW52YXM9ZnVuY3Rpb24oKXt0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsdGhpcy5mcmFtZS5jYW52YXMud2lkdGg9dGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgsdGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCx0aGlzLmZyYW1lLmZpbHRlci5zdHlsZS53aWR0aD10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aC0yMCtcInB4XCJ9LG8ucHJvdG90eXBlLmFuaW1hdGlvblN0YXJ0PWZ1bmN0aW9uKCl7aWYodGhpcy5hbmltYXRpb25BdXRvU3RhcnQmJnRoaXMuZGF0YUdyb3VwLmRhdGFGaWx0ZXIpe2lmKCF0aGlzLmZyYW1lLmZpbHRlcnx8IXRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlcil0aHJvdyBuZXcgRXJyb3IoXCJObyBhbmltYXRpb24gYXZhaWxhYmxlXCIpO3RoaXMuZnJhbWUuZmlsdGVyLnNsaWRlci5wbGF5KCl9fSxvLnByb3RvdHlwZS5hbmltYXRpb25TdG9wPWZ1bmN0aW9uKCl7dGhpcy5mcmFtZS5maWx0ZXImJnRoaXMuZnJhbWUuZmlsdGVyLnNsaWRlciYmdGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyLnN0b3AoKX0sby5wcm90b3R5cGUuX3Jlc2l6ZUNlbnRlcj1mdW5jdGlvbigpe1wiJVwiPT09dGhpcy54Q2VudGVyLmNoYXJBdCh0aGlzLnhDZW50ZXIubGVuZ3RoLTEpP3RoaXMuY3VycmVudFhDZW50ZXI9cGFyc2VGbG9hdCh0aGlzLnhDZW50ZXIpLzEwMCp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aDp0aGlzLmN1cnJlbnRYQ2VudGVyPXBhcnNlRmxvYXQodGhpcy54Q2VudGVyKSxcIiVcIj09PXRoaXMueUNlbnRlci5jaGFyQXQodGhpcy55Q2VudGVyLmxlbmd0aC0xKT90aGlzLmN1cnJlbnRZQ2VudGVyPXBhcnNlRmxvYXQodGhpcy55Q2VudGVyKS8xMDAqKHRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodC10aGlzLmZyYW1lLmZpbHRlci5jbGllbnRIZWlnaHQpOnRoaXMuY3VycmVudFlDZW50ZXI9cGFyc2VGbG9hdCh0aGlzLnlDZW50ZXIpfSxvLnByb3RvdHlwZS5nZXRDYW1lcmFQb3NpdGlvbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCk7cmV0dXJuIHQuZGlzdGFuY2U9dGhpcy5jYW1lcmEuZ2V0QXJtTGVuZ3RoKCksdH0sby5wcm90b3R5cGUuX3JlYWREYXRhPWZ1bmN0aW9uKHQpe3RoaXMuZGF0YVBvaW50cz10aGlzLmRhdGFHcm91cC5pbml0aWFsaXplRGF0YSh0aGlzLHQsdGhpcy5zdHlsZSksdGhpcy5faW5pdGlhbGl6ZVJhbmdlcygpLHRoaXMuX3JlZHJhd0ZpbHRlcigpfSxvLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJm51bGwhPT10JiYodGhpcy5fcmVhZERhdGEodCksdGhpcy5yZWRyYXcoKSx0aGlzLmFuaW1hdGlvblN0YXJ0KCkpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpeyEwPT09bS52YWxpZGF0ZSh0LGIpJiZjb25zb2xlLmxvZyhcIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuXCIsZyksdGhpcy5hbmltYXRpb25TdG9wKCksZi5zZXRPcHRpb25zKHQsdGhpcyksdGhpcy5zZXRQb2ludERyYXdpbmdNZXRob2QoKSx0aGlzLl9zZXRTaXplKHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMuc2V0RGF0YSh0aGlzLmRhdGFHcm91cC5nZXREYXRhVGFibGUoKSksdGhpcy5hbmltYXRpb25TdGFydCgpfX0sby5wcm90b3R5cGUuc2V0UG9pbnREcmF3aW5nTWV0aG9kPWZ1bmN0aW9uKCl7dmFyIHQ9dm9pZCAwO3N3aXRjaCh0aGlzLnN0eWxlKXtjYXNlIG8uU1RZTEUuQkFSOnQ9by5wcm90b3R5cGUuX3JlZHJhd0JhckdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkJBUkNPTE9SOnQ9by5wcm90b3R5cGUuX3JlZHJhd0JhckNvbG9yR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuQkFSU0laRTp0PW8ucHJvdG90eXBlLl9yZWRyYXdCYXJTaXplR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuRE9UOnQ9by5wcm90b3R5cGUuX3JlZHJhd0RvdEdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVExJTkU6dD1vLnByb3RvdHlwZS5fcmVkcmF3RG90TGluZUdyYXBoUG9pbnQ7YnJlYWs7Y2FzZSBvLlNUWUxFLkRPVENPTE9SOnQ9by5wcm90b3R5cGUuX3JlZHJhd0RvdENvbG9yR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuRE9UU0laRTp0PW8ucHJvdG90eXBlLl9yZWRyYXdEb3RTaXplR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuU1VSRkFDRTp0PW8ucHJvdG90eXBlLl9yZWRyYXdTdXJmYWNlR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuR1JJRDp0PW8ucHJvdG90eXBlLl9yZWRyYXdHcmlkR3JhcGhQb2ludDticmVhaztjYXNlIG8uU1RZTEUuTElORTp0PW8ucHJvdG90eXBlLl9yZWRyYXdMaW5lR3JhcGhQb2ludDticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihcIkNhbiBub3QgZGV0ZXJtaW5lIHBvaW50IGRyYXdpbmcgbWV0aG9kIGZvciBncmFwaCBzdHlsZSAnXCIrdGhpcy5zdHlsZStcIidcIil9dGhpcy5fcG9pbnREcmF3aW5nTWV0aG9kPXR9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50cyl0aHJvdyBuZXcgRXJyb3IoXCJHcmFwaCBkYXRhIG5vdCBpbml0aWFsaXplZFwiKTt0aGlzLl9yZXNpemVDYW52YXMoKSx0aGlzLl9yZXNpemVDZW50ZXIoKSx0aGlzLl9yZWRyYXdTbGlkZXIoKSx0aGlzLl9yZWRyYXdDbGVhcigpLHRoaXMuX3JlZHJhd0F4aXMoKSx0aGlzLl9yZWRyYXdEYXRhR3JhcGgoKSx0aGlzLl9yZWRyYXdJbmZvKCksdGhpcy5fcmVkcmF3TGVnZW5kKCl9LG8ucHJvdG90eXBlLl9nZXRDb250ZXh0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mcmFtZS5jYW52YXMsZT10LmdldENvbnRleHQoXCIyZFwiKTtyZXR1cm4gZS5saW5lSm9pbj1cInJvdW5kXCIsZS5saW5lQ2FwPVwicm91bmRcIixlfSxvLnByb3RvdHlwZS5fcmVkcmF3Q2xlYXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmZyYW1lLmNhbnZhczt0LmdldENvbnRleHQoXCIyZFwiKS5jbGVhclJlY3QoMCwwLHQud2lkdGgsdC5oZWlnaHQpfSxvLnByb3RvdHlwZS5fZG90U2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZyYW1lLmNsaWVudFdpZHRoKnRoaXMuZG90U2l6ZVJhdGlvfSxvLnByb3RvdHlwZS5fZ2V0TGVnZW5kV2lkdGg9ZnVuY3Rpb24oKXt2YXIgdDtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFKXt0PXRoaXMuX2RvdFNpemUoKSp0aGlzLmRvdFNpemVNYXhGcmFjdGlvbn1lbHNlI
21167HQ9dGhpcy5zdHlsZT09PW8uU1RZTEUuQkFSU0laRT90aGlzLnhCYXJXaWR0aDoyMDtyZXR1cm4gdH0sby5wcm90b3R5cGUuX3JlZHJhd0xlZ2VuZD1mdW5jdGlvbigpe2lmKCEwPT09dGhpcy5zaG93TGVnZW5kJiZ0aGlzLnN0eWxlIT09by5TVFlMRS5MSU5FJiZ0aGlzLnN0eWxlIT09by5TVFlMRS5CQVJTSVpFKXt2YXIgdD10aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFfHx0aGlzLnN0eWxlPT09by5TVFlMRS5ET1RTSVpFLGU9dGhpcy5zdHlsZT09PW8uU1RZTEUuRE9UU0laRXx8dGhpcy5zdHlsZT09PW8uU1RZTEUuRE9UQ09MT1J8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SLGk9TWF0aC5tYXgoLjI1KnRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0LDEwMCksbj10aGlzLm1hcmdpbixzPXRoaXMuX2dldExlZ2VuZFdpZHRoKCkscj10aGlzLmZyYW1lLmNsaWVudFdpZHRoLXRoaXMubWFyZ2luLGE9ci1zLGg9bitpLGQ9dGhpcy5fZ2V0Q29udGV4dCgpO2lmKGQubGluZVdpZHRoPTEsZC5mb250PVwiMTRweCBhcmlhbFwiLCExPT09dCl7dmFyIGwsYz1pO2ZvcihsPTA7bDxjO2wrKyl7dmFyIGY9KGwtMCkvKGMtMCksbT0yNDAqZix2PXRoaXMuX2hzdjJyZ2IobSwxLDEpO2Quc3Ryb2tlU3R5bGU9dixkLmJlZ2luUGF0aCgpLGQubW92ZVRvKGEsbitsKSxkLmxpbmVUbyhyLG4rbCksZC5zdHJva2UoKX1kLnN0cm9rZVN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuc3Ryb2tlUmVjdChhLG4scyxpKX1lbHNle3ZhciBnO3RoaXMuc3R5bGU9PT1vLlNUWUxFLkRPVFNJWkU/Zz1zKih0aGlzLmRvdFNpemVNaW5GcmFjdGlvbi90aGlzLmRvdFNpemVNYXhGcmFjdGlvbik6KHRoaXMuc3R5bGUsby5TVFlMRS5CQVJTSVpFKSxkLnN0cm9rZVN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuZmlsbFN0eWxlPXRoaXMuZGF0YUNvbG9yLmZpbGwsZC5iZWdpblBhdGgoKSxkLm1vdmVUbyhhLG4pLGQubGluZVRvKHIsbiksZC5saW5lVG8oYStnLGgpLGQubGluZVRvKGEsaCksZC5jbG9zZVBhdGgoKSxkLmZpbGwoKSxkLnN0cm9rZSgpfXZhciB5PWU/dGhpcy52YWx1ZVJhbmdlLm1pbjp0aGlzLnpSYW5nZS5taW4sYj1lP3RoaXMudmFsdWVSYW5nZS5tYXg6dGhpcy56UmFuZ2UubWF4LF89bmV3IHAoeSxiLChiLXkpLzUsITApO18uc3RhcnQoITApO2Zvcih2YXIgdyx4OyFfLmVuZCgpOylsPWgtKF8uZ2V0Q3VycmVudCgpLXkpLyhiLXkpKmksdz1uZXcgdShhLTUsbCkseD1uZXcgdShhLGwpLHRoaXMuX2xpbmUoZCx3LHgpLGQudGV4dEFsaWduPVwicmlnaHRcIixkLnRleHRCYXNlbGluZT1cIm1pZGRsZVwiLGQuZmlsbFN0eWxlPXRoaXMuYXhpc0NvbG9yLGQuZmlsbFRleHQoXy5nZXRDdXJyZW50KCksYS0xMCxsKSxfLm5leHQoKTtkLnRleHRBbGlnbj1cInJpZ2h0XCIsZC50ZXh0QmFzZWxpbmU9XCJ0b3BcIjt2YXIgaz10aGlzLmxlZ2VuZExhYmVsO2QuZmlsbFRleHQoayxyLGgrdGhpcy5tYXJnaW4pfX0sby5wcm90b3R5cGUuX3JlZHJhd0ZpbHRlcj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YUdyb3VwLmRhdGFGaWx0ZXIsZT10aGlzLmZyYW1lLmZpbHRlcjtpZihlLmlubmVySFRNTD1cIlwiLCF0KXJldHVybiB2b2lkKGUuc2xpZGVyPXZvaWQgMCk7dmFyIGk9e3Zpc2libGU6dGhpcy5zaG93QW5pbWF0aW9uQ29udHJvbHN9LG89bmV3IGMoZSxpKTtlLnNsaWRlcj1vLGUuc3R5bGUucGFkZGluZz1cIjEwcHhcIixvLnNldFZhbHVlcyh0LnZhbHVlcyksby5zZXRQbGF5SW50ZXJ2YWwodGhpcy5hbmltYXRpb25JbnRlcnZhbCk7dmFyIG49dGhpcyxzPWZ1bmN0aW9uKCl7dmFyIHQ9bi5kYXRhR3JvdXAuZGF0YUZpbHRlcixlPW8uZ2V0SW5kZXgoKTt0LnNlbGVjdFZhbHVlKGUpLG4uZGF0YVBvaW50cz10Ll9nZXREYXRhUG9pbnRzKCksbi5yZWRyYXcoKX07by5zZXRPbkNoYW5nZUNhbGxiYWNrKHMpfSxvLnByb3RvdHlwZS5fcmVkcmF3U2xpZGVyPWZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5mcmFtZS5maWx0ZXIuc2xpZGVyJiZ0aGlzLmZyYW1lLmZpbHRlci5zbGlkZXIucmVkcmF3KCl9LG8ucHJvdG90eXBlLl9yZWRyYXdJbmZvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhR3JvdXAuZ2V0SW5mbygpO2lmKHZvaWQgMCE9PXQpe3ZhciBlPXRoaXMuX2dldENvbnRleHQoKTtlLmZvbnQ9XCIxNHB4IGFyaWFsXCIsZS5saW5lU3R5bGU9XCJncmF5XCIsZS5maWxsU3R5bGU9XCJncmF5XCIsZS50ZXh0QWxpZ249XCJsZWZ0XCIsZS50ZXh0QmFzZWxpbmU9XCJ0b3BcIjt2YXIgaT10aGlzLm1hcmdpbixvPXRoaXMubWFyZ2luO2UuZmlsbFRleHQodCxpLG8pfX0sby5wcm90b3R5cGUuX2xpbmU9ZnVuY3Rpb24odCxlLGksbyl7dm9pZCAwIT09byYmKHQuc3Ryb2tlU3R5bGU9byksdC5iZWdpblBhdGgoKSx0Lm1vdmVUbyhlLngsZS55KSx0LmxpbmVUbyhpLngsaS55KSx0LnN0cm9rZSgpfSxvLnByb3RvdHlwZS5kcmF3QXhpc0xhYmVsWD1mdW5jdGlvbih0LGUsaSxvLG4pe3ZvaWQgMD09PW4mJihuPTApO3ZhciBzPXRoaXMuX2NvbnZlcnQzRHRvMkQoZSlcbjtNYXRoLmNvcygyKm8pPjA/KHQudGV4dEFsaWduPVwiY2VudGVyXCIsdC50ZXh0QmFzZWxpbmU9XCJ0b3BcIixzLnkrPW4pOk1hdGguc2luKDIqbyk8MD8odC50ZXh0QWxpZ249XCJyaWdodFwiLHQudGV4dEJhc2VsaW5lPVwibWlkZGxlXCIpOih0LnRleHRBbGlnbj1cImxlZnRcIix0LnRleHRCYXNlbGluZT1cIm1pZGRsZVwiKSx0LmZpbGxTdHlsZT10aGlzLmF4aXNDb2xvcix0LmZpbGxUZXh0KGkscy54LHMueSl9LG8ucHJvdG90eXBlLmRyYXdBeGlzTGFiZWxZPWZ1bmN0aW9uKHQsZSxpLG8sbil7dm9pZCAwPT09biYmKG49MCk7dmFyIHM9dGhpcy5fY29udmVydDNEdG8yRChlKTtNYXRoLmNvcygyKm8pPDA/KHQudGV4dEFsaWduPVwiY2VudGVyXCIsdC50ZXh0QmFzZWxpbmU9XCJ0b3BcIixzLnkrPW4pOk1hdGguc2luKDIqbyk+MD8odC50ZXh0QWxpZ249XCJyaWdodFwiLHQudGV4dEJhc2VsaW5lPVwibWlkZGxlXCIpOih0LnRleHRBbGlnbj1cImxlZnRcIix0LnRleHRCYXNlbGluZT1cIm1pZGRsZVwiKSx0LmZpbGxTdHlsZT10aGlzLmF4aXNDb2xvcix0LmZpbGxUZXh0KGkscy54LHMueSl9LG8ucHJvdG90eXBlLmRyYXdBeGlzTGFiZWxaPWZ1bmN0aW9uKHQsZSxpLG8pe3ZvaWQgMD09PW8mJihvPTApO3ZhciBuPXRoaXMuX2NvbnZlcnQzRHRvMkQoZSk7dC50ZXh0QWxpZ249XCJyaWdodFwiLHQudGV4dEJhc2VsaW5lPVwibWlkZGxlXCIsdC5maWxsU3R5bGU9dGhpcy5heGlzQ29sb3IsdC5maWxsVGV4dChpLG4ueC1vLG4ueSl9LG8ucHJvdG90eXBlLl9saW5lM2Q9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49dGhpcy5fY29udmVydDNEdG8yRChlKSxzPXRoaXMuX2NvbnZlcnQzRHRvMkQoaSk7dGhpcy5fbGluZSh0LG4scyxvKX0sby5wcm90b3R5cGUuX3JlZHJhd0F4aXM9ZnVuY3Rpb24oKXt2YXIgdCxlLGksbyxuLHMscixhLGgsZCxjLGY9dGhpcy5fZ2V0Q29udGV4dCgpO2YuZm9udD0yNC90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKStcInB4IGFyaWFsXCI7dmFyIG0sdj0uMDI1L3RoaXMuc2NhbGUueCxnPS4wMjUvdGhpcy5zY2FsZS55LHk9NS90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSxiPXRoaXMuY2FtZXJhLmdldEFybVJvdGF0aW9uKCkuaG9yaXpvbn
21167RhbCxfPW5ldyB1KE1hdGguY29zKGIpLE1hdGguc2luKGIpKSx3PXRoaXMueFJhbmdlLHg9dGhpcy55UmFuZ2Usaz10aGlzLnpSYW5nZTtmb3IoZi5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFhTdGVwLGk9bmV3IHAody5taW4sdy5tYXgsdGhpcy54U3RlcCxvKSxpLnN0YXJ0KCEwKTshaS5lbmQoKTspe3ZhciBTPWkuZ2V0Q3VycmVudCgpO2lmKHRoaXMuc2hvd0dyaWQ/KHQ9bmV3IGwoUyx4Lm1pbixrLm1pbiksZT1uZXcgbChTLHgubWF4LGsubWluKSx0aGlzLl9saW5lM2QoZix0LGUsdGhpcy5ncmlkQ29sb3IpKTp0aGlzLnNob3dYQXhpcyYmKHQ9bmV3IGwoUyx4Lm1pbixrLm1pbiksZT1uZXcgbChTLHgubWluK3Ysay5taW4pLHRoaXMuX2xpbmUzZChmLHQsZSx0aGlzLmF4aXNDb2xvciksdD1uZXcgbChTLHgubWF4LGsubWluKSxlPW5ldyBsKFMseC5tYXgtdixrLm1pbiksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuYXhpc0NvbG9yKSksdGhpcy5zaG93WEF4aXMpe3I9Xy54PjA/eC5taW46eC5tYXgsbT1uZXcgbChTLHIsay5taW4pO3ZhciBEPVwiICBcIit0aGlzLnhWYWx1ZUxhYmVsKFMpK1wiICBcIjt0aGlzLmRyYXdBeGlzTGFiZWxYKGYsbSxELGIseSl9aS5uZXh0KCl9Zm9yKGYubGluZVdpZHRoPTEsbz12b2lkIDA9PT10aGlzLmRlZmF1bHRZU3RlcCxpPW5ldyBwKHgubWluLHgubWF4LHRoaXMueVN0ZXAsbyksaS5zdGFydCghMCk7IWkuZW5kKCk7KXt2YXIgTT1pLmdldEN1cnJlbnQoKTtpZih0aGlzLnNob3dHcmlkPyh0PW5ldyBsKHcubWluLE0say5taW4pLGU9bmV3IGwody5tYXgsTSxrLm1pbiksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuZ3JpZENvbG9yKSk6dGhpcy5zaG93WUF4aXMmJih0PW5ldyBsKHcubWluLE0say5taW4pLGU9bmV3IGwody5taW4rZyxNLGsubWluKSx0aGlzLl9saW5lM2QoZix0LGUsdGhpcy5heGlzQ29sb3IpLHQ9bmV3IGwody5tYXgsTSxrLm1pbiksZT1uZXcgbCh3Lm1heC1nLE0say5taW4pLHRoaXMuX2xpbmUzZChmLHQsZSx0aGlzLmF4aXNDb2xvcikpLHRoaXMuc2hvd1lBeGlzKXtzPV8ueT4wP3cubWluOncubWF4LG09bmV3IGwocyxNLGsubWluKTt2YXIgQz1cIiAgXCIrdGhpcy55VmFsdWVMYWJlbChNKStcIiAgXCI7dGhpcy5kcmF3QXhpc0xhYmVsWShmLG0sQyxiLHkpfWkubmV4dCgpfWlmKHRoaXMuc2hvd1pBeGlzKXtmb3IoZi5saW5lV2lkdGg9MSxvPXZvaWQgMD09PXRoaXMuZGVmYXVsdFpTdGVwLGk9bmV3IHAoay5taW4say5tYXgsdGhpcy56U3RlcCxvKSxpLnN0YXJ0KCEwKSxzPV8ueD4wP3cubWluOncubWF4LHI9Xy55PDA/eC5taW46eC5tYXg7IWkuZW5kKCk7KXt2YXIgTz1pLmdldEN1cnJlbnQoKSxFPW5ldyBsKHMscixPKSxUPXRoaXMuX2NvbnZlcnQzRHRvMkQoRSk7ZT1uZXcgdShULngteSxULnkpLHRoaXMuX2xpbmUoZixULGUsdGhpcy5heGlzQ29sb3IpO3ZhciBQPXRoaXMuelZhbHVlTGFiZWwoTykrXCIgXCI7dGhpcy5kcmF3QXhpc0xhYmVsWihmLEUsUCw1KSxpLm5leHQoKX1mLmxpbmVXaWR0aD0xLHQ9bmV3IGwocyxyLGsubWluKSxlPW5ldyBsKHMscixrLm1heCksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuYXhpc0NvbG9yKX1pZih0aGlzLnNob3dYQXhpcyl7dmFyIEksTjtmLmxpbmVXaWR0aD0xLEk9bmV3IGwody5taW4seC5taW4say5taW4pLE49bmV3IGwody5tYXgseC5taW4say5taW4pLHRoaXMuX2xpbmUzZChmLEksTix0aGlzLmF4aXNDb2xvciksST1uZXcgbCh3Lm1pbix4Lm1heCxrLm1pbiksTj1uZXcgbCh3Lm1heCx4Lm1heCxrLm1pbiksdGhpcy5fbGluZTNkKGYsSSxOLHRoaXMuYXhpc0NvbG9yKX10aGlzLnNob3dZQXhpcyYmKGYubGluZVdpZHRoPTEsdD1uZXcgbCh3Lm1pbix4Lm1pbixrLm1pbiksZT1uZXcgbCh3Lm1pbix4Lm1heCxrLm1pbiksdGhpcy5fbGluZTNkKGYsdCxlLHRoaXMuYXhpc0NvbG9yKSx0PW5ldyBsKHcubWF4LHgubWluLGsubWluKSxlPW5ldyBsKHcubWF4LHgubWF4LGsubWluKSx0aGlzLl9saW5lM2QoZix0LGUsdGhpcy5heGlzQ29sb3IpKTt2YXIgUj10aGlzLnhMYWJlbDtSLmxlbmd0aD4wJiZ0aGlzLnNob3dYQXhpcyYmKGM9LjEvdGhpcy5zY2FsZS55LHM9KHcubWF4KzMqdy5taW4pLzQscj1fLng+MD94Lm1pbi1jOngubWF4K2Msbj1uZXcgbChzLHIsay5taW4pLHRoaXMuZHJhd0F4aXNMYWJlbFgoZixuLFIsYikpO3ZhciBBPXRoaXMueUxhYmVsO0EubGVuZ3RoPjAmJnRoaXMuc2hvd1lBeGlzJiYoZD0uMS90aGlzLnNjYWxlLngscz1fLnk+MD93Lm1pbi1kOncubWF4K2Qscj0oeC5tYXgrMyp4Lm1pbikvNCxuPW5ldyBsKHMscixrLm1pbiksdGhpcy5kcmF3QXhpc0xhYmVsWShmLG4sQSxiKSk7dmFyIHo9dGhpcy56TGFiZWw7ei5sZW5ndGg+MCYmdGhpcy5zaG93WkF4aXMmJihoPTMwLHM9Xy54PjA/dy5taW46dy5tYXgscj1fLnk8MD94Lm1pbjp4Lm1heCxhPShrLm1heCszKmsubWluKS80LG49bmV3IGwocyxyLGEpLHRoaXMuZHJhd0F4aXNMYWJlbFooZixuLHosaCkpfSxvLnByb3RvdHlwZS5faHN2MnJnYj1mdW5jdGlvbih0LGUsaSl7dmFyIG8sbixzLHIsYSxoO3N3aXRjaChyPWkqZSxhPU1hdGguZmxvb3IodC82MCksaD1yKigxLU1hdGguYWJzKHQvNjAlMi0xKSksYSl7Y2FzZSAwOm89cixuPWgscz0wO2JyZWFrO2Nhc2UgMTpvPWgsbj1yLHM9MDticmVhaztjYXNlIDI6bz0wLG49cixzPWg7YnJlYWs7Y2FzZSAzOm89MCxuPWgscz1yO2JyZWFrO2Nhc2UgNDpvPWgsbj0wLHM9cjticmVhaztjYXNlIDU6bz1yLG49MCxzPWg7YnJlYWs7ZGVmYXVsdDpvPTAsbj0wLHM9MH1yZXR1cm5cIlJHQihcIitwYXJzZUludCgyNTUqbykrXCIsXCIrcGFyc2VJbnQoMjU1Km4pK1wiLFwiK3BhcnNlSW50KDI1NSpzKStcIilcIn0sby5wcm90b3R5cGUuX2dldFN0cm9rZVdpZHRoPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10P3RoaXMuc2hvd1BlcnNwZWN0aXZlPzEvLXQudHJhbnMueip0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDotdGhpcy5leWUuei90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aDp0aGlzLmRhdGFDb2xvci5zdHJva2VXaWR0aH0sby5wcm90b3R5cGUuX3JlZHJhd0Jhcj1mdW5jdGlvbih0LGUsaSxvLG4scyl7dmFyIHIsYT10aGlzLGg9ZS5wb2ludCxkPXRoaXMuelJhbmdlLm1pbix1PVt7cG9pbnQ6bmV3IGwoaC54LWksaC55LW8saC56KX0se3BvaW50Om5ldyBsKGgueCtpLGgueS1vLGgueil9LHtwb2ludDpuZXcgbChoLngraSxoLnkrbyxoLnopfSx7cG9pbnQ6bmV3IGwoaC54LWksaC55K28saC56KX1dLGM9W3twb2ludDpuZXcgbChoLngtaSxoLnktbyxkKX0se3BvaW50Om5ldyBsKGgueCtpLGgueS1vLGQpfSx7cG9pbnQ6bmV3IGwoaC54K2ksaC55K28sZCl9LHtwb2ludDpuZXcgbChoLngtaSxoLnkrbyxkKX1dO3UuZm9yRWFjaChmdW5jdGlvbih0KXt0LnNjcmVlbj1hLl9jb252ZXJ0M0R0bzJEKHQucG9pbnQpfSksYy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Quc2NyZWVuPWEuX2NvbnZlcnQzRHRvMkQodC5wb2ludCl9KTt2YXIgcD1be2Nvcm5lcnM6dSxjZW50ZXI6bC5hdmcoY1swXS5wb2ludCxjWzJdLnBvaW50KX0se2Nvcm5lcnM6W3VbMF0sdVsxXSxjWzFdLGNbMF1dLGNlbnRlcjpsLmF2ZyhjWzFdLnBvaW50LGNbMF0ucG9pbnQpfSx7Y29ybmVyczpbdVsxXSx1WzJdLGNbMl0sY1sxXV0sY2VudGVyOmwuYXZnKGNbMl0ucG9pbnQsY1sxXS5wb2ludCl9LHtjb3JuZXJzOlt1WzJdLHVbM10sY1szXSxjWzJdXSxjZW50ZXI6bC5hdmcoY1szXS5wb2ludCxjWzJdLnBvaW50KX0se2Nvcm5lcnM6W3VbM10sdVswXSxjWzBdLGNbM11dLGNlbnRlcjpsLmF2ZyhjWzBdLnBvaW50LGNbM10ucG9pbnQpfV07ZS5zdXJmYWNlcz1wO2Zvcih2YXIgZj0wO2Y8cC5sZW5ndGg7ZisrKXtyPXBbZl07dmFyIG09dGhpcy5fY29udmVydFBvaW50VG9UcmFuc2xhdGlvbihyLmNlbnRlcik7ci5kaXN0PXRoaXMuc2hvd1BlcnNwZWN0aXZlP20ubGVuZ3RoKCk6LW0uen1wLnNvcnQoZnVuY3Rpb24odCxlKXt2YXIgaT1lLmRpc3QtdC5kaXN0O3JldHVybiBpfHwodC5jb3JuZXJzPT
2116709dT8xOmUuY29ybmVycz09PXU/LTE6MCl9KSx0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXMsdC5maWxsU3R5bGU9bjtmb3IodmFyIHY9Mjt2PHAubGVuZ3RoO3YrKylyPXBbdl0sdGhpcy5fcG9seWdvbih0LHIuY29ybmVycyl9LG8ucHJvdG90eXBlLl9wb2x5Z29uPWZ1bmN0aW9uKHQsZSxpLG8pe2lmKCEoZS5sZW5ndGg8Mikpe3ZvaWQgMCE9PWkmJih0LmZpbGxTdHlsZT1pKSx2b2lkIDAhPT1vJiYodC5zdHJva2VTdHlsZT1vKSx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKGVbMF0uc2NyZWVuLngsZVswXS5zY3JlZW4ueSk7Zm9yKHZhciBuPTE7bjxlLmxlbmd0aDsrK24pe3ZhciBzPWVbbl07dC5saW5lVG8ocy5zY3JlZW4ueCxzLnNjcmVlbi55KX10LmNsb3NlUGF0aCgpLHQuZmlsbCgpLHQuc3Ryb2tlKCl9fSxvLnByb3RvdHlwZS5fZHJhd0NpcmNsZT1mdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPXRoaXMuX2NhbGNSYWRpdXMoZSxuKTt0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPW8sdC5maWxsU3R5bGU9aSx0LmJlZ2luUGF0aCgpLHQuYXJjKGUuc2NyZWVuLngsZS5zY3JlZW4ueSxzLDAsMipNYXRoLlBJLCEwKSx0LmZpbGwoKSx0LnN0cm9rZSgpfSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzUmVndWxhcj1mdW5jdGlvbih0KXt2YXIgZT0yNDAqKDEtKHQucG9pbnQuei10aGlzLnpSYW5nZS5taW4pKnRoaXMuc2NhbGUuei90aGlzLnZlcnRpY2FsUmF0aW8pO3JldHVybntmaWxsOnRoaXMuX2hzdjJyZ2IoZSwxLDEpLGJvcmRlcjp0aGlzLl9oc3YycmdiKGUsMSwuOCl9fSxvLnByb3RvdHlwZS5fZ2V0Q29sb3JzQ29sb3I9ZnVuY3Rpb24odCl7dmFyIGUsaTtpZihcInN0cmluZ1wiPT10eXBlb2YgdC5wb2ludC52YWx1ZSllPXQucG9pbnQudmFsdWUsaT10LnBvaW50LnZhbHVlO2Vsc2V7dmFyIG89MjQwKigxLSh0LnBvaW50LnZhbHVlLXRoaXMudmFsdWVSYW5nZS5taW4pKnRoaXMuc2NhbGUudmFsdWUpO2U9dGhpcy5faHN2MnJnYihvLDEsMSksaT10aGlzLl9oc3YycmdiKG8sMSwuOCl9cmV0dXJue2ZpbGw6ZSxib3JkZXI6aX19LG8ucHJvdG90eXBlLl9nZXRDb2xvcnNTaXplPWZ1bmN0aW9uKCl7cmV0dXJue2ZpbGw6dGhpcy5kYXRhQ29sb3IuZmlsbCxib3JkZXI6dGhpcy5kYXRhQ29sb3Iuc3Ryb2tlfX0sby5wcm90b3R5cGUuX2NhbGNSYWRpdXM9ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT1lJiYoZT10aGlzLl9kb3RTaXplKCkpO3ZhciBpO3JldHVybiBpPXRoaXMuc2hvd1BlcnNwZWN0aXZlP2UvLXQudHJhbnMuejplKigtdGhpcy5leWUuei90aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSksaTwwJiYoaT0wKSxpfSxvLnByb3RvdHlwZS5fcmVkcmF3QmFyR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMueEJhcldpZHRoLzIsbz10aGlzLnlCYXJXaWR0aC8yLG49dGhpcy5fZ2V0Q29sb3JzUmVndWxhcihlKTt0aGlzLl9yZWRyYXdCYXIodCxlLGksbyxuLmZpbGwsbi5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3QmFyQ29sb3JHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy54QmFyV2lkdGgvMixvPXRoaXMueUJhcldpZHRoLzIsbj10aGlzLl9nZXRDb2xvcnNDb2xvcihlKTt0aGlzLl9yZWRyYXdCYXIodCxlLGksbyxuLmZpbGwsbi5ib3JkZXIpfSxvLnByb3RvdHlwZS5fcmVkcmF3QmFyU2l6ZUdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT0oZS5wb2ludC52YWx1ZS10aGlzLnZhbHVlUmFuZ2UubWluKS90aGlzLnZhbHVlUmFuZ2UucmFuZ2UoKSxvPXRoaXMueEJhcldpZHRoLzIqKC44KmkrLjIpLG49dGhpcy55QmFyV2lkdGgvMiooLjgqaSsuMikscz10aGlzLl9nZXRDb2xvcnNTaXplKCk7dGhpcy5fcmVkcmF3QmFyKHQsZSxvLG4scy5maWxsLHMuYm9yZGVyKX0sby5wcm90b3R5cGUuX3JlZHJhd0RvdEdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl9nZXRDb2xvcnNSZWd1bGFyKGUpO3RoaXMuX2RyYXdDaXJjbGUodCxlLGkuZmlsbCxpLmJvcmRlcil9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RMaW5lR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2NvbnZlcnQzRHRvMkQoZS5ib3R0b20pO3QubGluZVdpZHRoPTEsdGhpcy5fbGluZSh0LGksZS5zY3JlZW4sdGhpcy5ncmlkQ29sb3IpLHRoaXMuX3JlZHJhd0RvdEdyYXBoUG9pbnQodCxlKX0sby5wcm90b3R5cGUuX3JlZHJhd0RvdENvbG9yR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2dldENvbG9yc0NvbG9yKGUpO3RoaXMuX2RyYXdDaXJjbGUodCxlLGkuZmlsbCxpLmJvcmRlcil9LG8ucHJvdG90eXBlLl9yZWRyYXdEb3RTaXplR3JhcGhQb2ludD1mdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuX2RvdFNpemUoKSxvPShlLnBvaW50LnZhbHVlLXRoaXMudmFsdWVSYW5nZS5taW4pL3RoaXMudmFsdWVSYW5nZS5yYW5nZSgpLG49aSp0aGlzLmRvdFNpemVNaW5GcmFjdGlvbixzPWkqdGhpcy5kb3RTaXplTWF4RnJhY3Rpb24tbixyPW4rcypvLGE9dGhpcy5fZ2V0Q29sb3JzU2l6ZSgpO3RoaXMuX2RyYXdDaXJjbGUodCxlLGEuZmlsbCxhLmJvcmRlcixyKX0sby5wcm90b3R5cGUuX3JlZHJhd1N1cmZhY2VHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dmFyIGk9ZS5wb2ludFJpZ2h0LG89ZS5wb2ludFRvcCxuPWUucG9pbnRDcm9zcztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1pJiZ2b2lkIDAhPT1vJiZ2b2lkIDAhPT1uKXt2YXIgcyxyLGE9ITA7aWYodGhpcy5zaG93R3JheUJvdHRvbXx8dGhpcy5zaG93U2hhZG93KXt2YXIgaD1sLnN1YnRyYWN0KG4udHJhbnMsZS50cmFucyksZD1sLnN1YnRyYWN0KG8udHJhbnMsaS50cmFucyksdT1sLmNyb3NzUHJvZHVjdChoLGQpLGM9dS5sZW5ndGgoKTthPXUuej4wfWlmKGEpe3ZhciBwLGY9KGUucG9pbnQueitpLnBvaW50Lnorby5wb2ludC56K24ucG9pbnQueikvNCxtPTI0MCooMS0oZi10aGlzLnpSYW5nZS5taW4pKnRoaXMuc2NhbGUuei90aGlzLnZlcnRpY2FsUmF0aW8pO3RoaXMuc2hvd1NoYWRvdz8ocD1NYXRoLm1pbigxK3UueC9jLzIsMSkscz10aGlzLl9oc3YycmdiKG0sMSxwKSxyPXMpOihwPTEscz10aGlzLl9oc3YycmdiKG0sMSxwKSxyPXRoaXMuYXhpc0NvbG9yKX1lbHNlIHM9XCJncmF5XCIscj10aGlzLmF4aXNDb2xvcjt0LmxpbmVXaWR0aD10aGlzLl9nZXRTd
21167HJva2VXaWR0aChlKTt2YXIgdj1bZSxpLG4sb107dGhpcy5fcG9seWdvbih0LHYscyxyKX19LG8ucHJvdG90eXBlLl9kcmF3R3JpZExpbmU9ZnVuY3Rpb24odCxlLGkpe2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWkpe3ZhciBvPShlLnBvaW50LnoraS5wb2ludC56KS8yLG49MjQwKigxLShvLXRoaXMuelJhbmdlLm1pbikqdGhpcy5zY2FsZS56L3RoaXMudmVydGljYWxSYXRpbyk7dC5saW5lV2lkdGg9Mip0aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXRoaXMuX2hzdjJyZ2IobiwxLDEpLHRoaXMuX2xpbmUodCxlLnNjcmVlbixpLnNjcmVlbil9fSxvLnByb3RvdHlwZS5fcmVkcmF3R3JpZEdyYXBoUG9pbnQ9ZnVuY3Rpb24odCxlKXt0aGlzLl9kcmF3R3JpZExpbmUodCxlLGUucG9pbnRSaWdodCksdGhpcy5fZHJhd0dyaWRMaW5lKHQsZSxlLnBvaW50VG9wKX0sby5wcm90b3R5cGUuX3JlZHJhd0xpbmVHcmFwaFBvaW50PWZ1bmN0aW9uKHQsZSl7dm9pZCAwIT09ZS5wb2ludE5leHQmJih0LmxpbmVXaWR0aD10aGlzLl9nZXRTdHJva2VXaWR0aChlKSx0LnN0cm9rZVN0eWxlPXRoaXMuZGF0YUNvbG9yLnN0cm9rZSx0aGlzLl9saW5lKHQsZS5zY3JlZW4sZS5wb2ludE5leHQuc2NyZWVuKSl9LG8ucHJvdG90eXBlLl9yZWRyYXdEYXRhR3JhcGg9ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXMuX2dldENvbnRleHQoKTtpZighKHZvaWQgMD09PXRoaXMuZGF0YVBvaW50c3x8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aDw9MCkpZm9yKHRoaXMuX2NhbGNUcmFuc2xhdGlvbnModGhpcy5kYXRhUG9pbnRzKSx0PTA7dDx0aGlzLmRhdGFQb2ludHMubGVuZ3RoO3QrKyl7dmFyIGk9dGhpcy5kYXRhUG9pbnRzW3RdO3RoaXMuX3BvaW50RHJhd2luZ01ldGhvZC5jYWxsKHRoaXMsZSxpKX19LG8ucHJvdG90eXBlLl9zdG9yZU1vdXNlUG9zaXRpb249ZnVuY3Rpb24odCl7dGhpcy5zdGFydE1vdXNlWD1uKHQpLHRoaXMuc3RhcnRNb3VzZVk9cyh0KSx0aGlzLl9zdGFydENhbWVyYU9mZnNldD10aGlzLmNhbWVyYS5nZXRPZmZzZXQoKX0sby5wcm90b3R5cGUuX29uTW91c2VEb3duPWZ1bmN0aW9uKHQpe2lmKHQ9dHx8d2luZG93LmV2ZW50LHRoaXMubGVmdEJ1dHRvbkRvd24mJnRoaXMuX29uTW91c2VVcCh0KSx0aGlzLmxlZnRCdXR0b25Eb3duPXQud2hpY2g/MT09PXQud2hpY2g6MT09PXQuYnV0dG9uLHRoaXMubGVmdEJ1dHRvbkRvd258fHRoaXMudG91Y2hEb3duKXt0aGlzLl9zdG9yZU1vdXNlUG9zaXRpb24odCksdGhpcy5zdGFydFN0YXJ0PW5ldyBEYXRlKHRoaXMuc3RhcnQpLHRoaXMuc3RhcnRFbmQ9bmV3IERhdGUodGhpcy5lbmQpLHRoaXMuc3RhcnRBcm1Sb3RhdGlvbj10aGlzLmNhbWVyYS5nZXRBcm1Sb3RhdGlvbigpLHRoaXMuZnJhbWUuc3R5bGUuY3Vyc29yPVwibW92ZVwiO3ZhciBlPXRoaXM7dGhpcy5vbm1vdXNlbW92ZT1mdW5jdGlvbih0KXtlLl9vbk1vdXNlTW92ZSh0KX0sdGhpcy5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ZS5fb25Nb3VzZVVwKHQpfSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZW1vdmVcIixlLm9ubW91c2Vtb3ZlKSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZXVwXCIsZS5vbm1vdXNldXApLGQucHJldmVudERlZmF1bHQodCl9fSxvLnByb3RvdHlwZS5fb25Nb3VzZU1vdmU9ZnVuY3Rpb24odCl7dGhpcy5tb3Zpbmc9ITAsdD10fHx3aW5kb3cuZXZlbnQ7dmFyIGU9cGFyc2VGbG9hdChuKHQpKS10aGlzLnN0YXJ0TW91c2VYLGk9cGFyc2VGbG9hdChzKHQpKS10aGlzLnN0YXJ0TW91c2VZO2lmKHQmJiEwPT09dC5jdHJsS2V5KXt2YXIgbz0uNSp0aGlzLmZyYW1lLmNsaWVudFdpZHRoLHI9LjUqdGhpcy5mcmFtZS5jbGllbnRIZWlnaHQsYT0odGhpcy5fc3RhcnRDYW1lcmFPZmZzZXQueHx8MCktZS9vKnRoaXMuY2FtZXJhLmFybUxlbmd0aCouOCxoPSh0aGlzLl9zdGFydENhbWVyYU9mZnNldC55fHwwKStpL3IqdGhpcy5jYW1lcmEuYXJtTGVuZ3RoKi44O3RoaXMuY2FtZXJhLnNldE9mZnNldChhLGgpLHRoaXMuX3N0b3JlTW91c2VQb3NpdGlvbih0KX1lbHNle3ZhciBsPXRoaXMuc3RhcnRBcm1Sb3RhdGlvbi5ob3Jpem9udGFsK2UvMjAwLHU9dGhpcy5zdGFydEFybVJvdGF0aW9uLnZlcnRpY2FsK2kvMjAwLGM9TWF0aC5zaW4oNC8zNjAqMipNYXRoLlBJKTtNYXRoLmFicyhNYXRoLnNpbihsKSk8YyYmKGw9TWF0aC5yb3VuZChsL01hdGguUEkpKk1hdGguUEktLjAwMSksTWF0aC5hYnMoTWF0aC5jb3MobCkpPGMmJihsPShNYXRoLnJvdW5kKGwvTWF0aC5QSS0uNSkrLjUpKk1hdGguUEktLjAwMSksTWF0aC5hYnMoTWF0aC5zaW4odSkpPGMmJih1PU1hdGgucm91bmQodS9NYXRoLlBJKSpNYXRoLlBJKSxNYXRoLmFicyhNYXRoLmNvcyh1KSk8YyYmKHU9KE1hdGgucm91bmQodS9NYXRoLlBJLS41KSsuNSkqTWF0aC5QSSksdGhpcy5jYW1lcmEuc2V0QXJtUm90YXRpb24obCx1KX10aGlzLnJlZHJhdygpO3ZhciBwPXRoaXMuZ2V0Q2FtZXJhUG9zaXRpb24oKTt0aGlzLmVtaXQoXCJjYW1lcmFQb3NpdGlvbkNoYW5nZVwiLHApLGQucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbk1vdXNlVXA9ZnVuY3Rpb24odCl7dGhpcy5mcmFtZS5zdHlsZS5jdXJzb3I9XCJhdXRvXCIsdGhpcy5sZWZ0QnV0dG9uRG93bj0hMSxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZW1vdmVcIix0aGlzLm9ubW91c2Vtb3ZlKSxkLnJlbW92ZUV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJtb3VzZXVwXCIsdGhpcy5vbm1vdXNldXApLGQucHJldmVudERlZmF1bHQodCl9LG8ucHJvdG90eXBlLl9vbkNsaWNrPWZ1bmN0aW9uKHQpe2lmKHRoaXMub25jbGlja19jYWxsYmFjayl7aWYodGhpcy5tb3ZpbmcpdGhpcy5tb3Zpbmc9ITE7ZWxzZXt2YXIgZT10aGlzLmZyYW1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGk9bih0KS1lLmxlZnQsbz1zKHQpLWUudG9wLHI9dGhpcy5fZGF0YVBvaW50RnJvbVhZKGksbyk7ciYmdGhpcy5vbmNsaWNrX2NhbGxiYWNrKHIucG9pbnQuZGF0YSl9ZC5wcmV2ZW50RGVmYXVsdCh0KX19LG8ucHJvdG90eXBlLl9vblRvb2x0aXA9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5mcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPW4odCktZS5sZWZ0LG89cyh0KS1lLnRvcDtpZih0aGlzLnNob3dUb29sdGlwKXtp
21167Zih0aGlzLnRvb2x0aXBUaW1lb3V0JiZjbGVhclRpbWVvdXQodGhpcy50b29sdGlwVGltZW91dCksdGhpcy5sZWZ0QnV0dG9uRG93bilyZXR1cm4gdm9pZCB0aGlzLl9oaWRlVG9vbHRpcCgpO2lmKHRoaXMudG9vbHRpcCYmdGhpcy50b29sdGlwLmRhdGFQb2ludCl7dmFyIHI9dGhpcy5fZGF0YVBvaW50RnJvbVhZKGksbyk7ciE9PXRoaXMudG9vbHRpcC5kYXRhUG9pbnQmJihyP3RoaXMuX3Nob3dUb29sdGlwKHIpOnRoaXMuX2hpZGVUb29sdGlwKCkpfWVsc2V7dmFyIGE9dGhpczt0aGlzLnRvb2x0aXBUaW1lb3V0PXNldFRpbWVvdXQoZnVuY3Rpb24oKXthLnRvb2x0aXBUaW1lb3V0PW51bGw7dmFyIHQ9YS5fZGF0YVBvaW50RnJvbVhZKGksbyk7dCYmYS5fc2hvd1Rvb2x0aXAodCl9LDMwMCl9fX0sby5wcm90b3R5cGUuX29uVG91Y2hTdGFydD1mdW5jdGlvbih0KXt0aGlzLnRvdWNoRG93bj0hMDt2YXIgZT10aGlzO3RoaXMub250b3VjaG1vdmU9ZnVuY3Rpb24odCl7ZS5fb25Ub3VjaE1vdmUodCl9LHRoaXMub250b3VjaGVuZD1mdW5jdGlvbih0KXtlLl9vblRvdWNoRW5kKHQpfSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJ0b3VjaG1vdmVcIixlLm9udG91Y2htb3ZlKSxkLmFkZEV2ZW50TGlzdGVuZXIoZG9jdW1lbnQsXCJ0b3VjaGVuZFwiLGUub250b3VjaGVuZCksdGhpcy5fb25Nb3VzZURvd24odCl9LG8ucHJvdG90eXBlLl9vblRvdWNoTW92ZT1mdW5jdGlvbih0KXt0aGlzLl9vbk1vdXNlTW92ZSh0KX0sby5wcm90b3R5cGUuX29uVG91Y2hFbmQ9ZnVuY3Rpb24odCl7dGhpcy50b3VjaERvd249ITEsZC5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwidG91Y2htb3ZlXCIsdGhpcy5vbnRvdWNobW92ZSksZC5yZW1vdmVFdmVudExpc3RlbmVyKGRvY3VtZW50LFwidG91Y2hlbmRcIix0aGlzLm9udG91Y2hlbmQpLHRoaXMuX29uTW91c2VVcCh0KX0sby5wcm90b3R5cGUuX29uV2hlZWw9ZnVuY3Rpb24odCl7dHx8KHQ9d2luZG93LmV2ZW50KTt2YXIgZT0wO2lmKHQud2hlZWxEZWx0YT9lPXQud2hlZWxEZWx0YS8xMjA6dC5kZXRhaWwmJihlPS10LmRldGFpbC8zKSxlKXt2YXIgaT10aGlzLmNhbWVyYS5nZXRBcm1MZW5ndGgoKSxvPWkqKDEtZS8xMCk7dGhpcy5jYW1lcmEuc2V0QXJtTGVuZ3RoKG8pLHRoaXMucmVkcmF3KCksdGhpcy5faGlkZVRvb2x0aXAoKX12YXIgbj10aGlzLmdldENhbWVyYVBvc2l0aW9uKCk7dGhpcy5lbWl0KFwiY2FtZXJhUG9zaXRpb25DaGFuZ2VcIixuKSxkLnByZXZlbn
21167REZWZhdWx0KHQpfSxvLnByb3RvdHlwZS5faW5zaWRlVHJpYW5nbGU9ZnVuY3Rpb24odCxlKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH12YXIgbz1lWzBdLG49ZVsxXSxzPWVbMl0scj1pKChuLngtby54KSoodC55LW8ueSktKG4ueS1vLnkpKih0Lngtby54KSksYT1pKChzLngtbi54KSoodC55LW4ueSktKHMueS1uLnkpKih0Lngtbi54KSksaD1pKChvLngtcy54KSoodC55LXMueSktKG8ueS1zLnkpKih0Lngtcy54KSk7cmV0dXJuISgwIT1yJiYwIT1hJiZyIT1hfHwwIT1hJiYwIT1oJiZhIT1ofHwwIT1yJiYwIT1oJiZyIT1oKX0sby5wcm90b3R5cGUuX2RhdGFQb2ludEZyb21YWT1mdW5jdGlvbih0LGUpe3ZhciBpLG49bnVsbCxzPW51bGwscj1udWxsLGE9bmV3IHUodCxlKTtpZih0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJ8fHRoaXMuc3R5bGU9PT1vLlNUWUxFLkJBUkNPTE9SfHx0aGlzLnN0eWxlPT09by5TVFlMRS5CQVJTSVpFKWZvcihpPXRoaXMuZGF0YVBvaW50cy5sZW5ndGgtMTtpPj0wO2ktLSl7bj10aGlzLmRhdGFQb2ludHNbaV07dmFyIGg9bi5zdXJmYWNlcztpZihoKWZvcih2YXIgZD1oLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgbD1oW2RdLGM9bC5jb3JuZXJzLHA9W2NbMF0uc2NyZWVuLGNbMV0uc2NyZWVuLGNbMl0uc2NyZWVuXSxmPVtjWzJdLnNjcmVlbixjWzNdLnNjcmVlbixjWzBdLnNjcmVlbl07aWYodGhpcy5faW5zaWRlVHJpYW5nbGUoYSxwKXx8dGhpcy5faW5zaWRlVHJpYW5nbGUoYSxmKSlyZXR1cm4gbn19ZWxzZSBmb3IoaT0wO2k8dGhpcy5kYXRhUG9pbnRzLmxlbmd0aDtpKyspe249dGhpcy5kYXRhUG9pbnRzW2ldO3ZhciBtPW4uc2NyZWVuO2lmKG0pe3ZhciB2PU1hdGguYWJzKHQtbS54KSxnPU1hdGguYWJzKGUtbS55KSx5PU1hdGguc3FydCh2KnYrZypnKTsobnVsbD09PXJ8fHk8cikmJnk8MTAwJiYocj15LHM9bil9fXJldHVybiBzfSxvLnByb3RvdHlwZS5oYXNCYXJzPWZ1bmN0aW9uKHQpe3JldHVybiB0PT1vLlNUWUxFLkJBUnx8dD09by5TVFlMRS5CQVJDT0xPUnx8dD09by5TVFlMRS5CQVJTSVpFfSxvLnByb3RvdHlwZS5fc2hvd1Rvb2x0aXA9ZnVuY3Rpb24odCl7dmFyIGUsaSxvO3RoaXMudG9vbHRpcD8oZT10aGlzLnRvb2x0aXAuZG9tLmNvbnRlbnQsaT10aGlzLnRvb2x0aXAuZG9tLmxpbmUsbz10aGlzLnRvb2x0aXAuZG9tLmRvdCk6KGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSwoMCxhLmRlZmF1bHQpKGUuc3R5bGUse30sdGhpcy50b29sdGlwU3R5bGUuY29udGVudCksZS5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsaT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLCgwLGEuZGVmYXVsdCkoaS5zdHlsZSx7fSx0aGlzLnRvb2x0aXBTdHlsZS5saW5lKSxpLnN0eWxlLnBvc2l0aW9uPVwiYWJzb2x1dGVcIixvPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksKDAsYS5kZWZhdWx0KShvLnN0eWxlLHt9LHRoaXMudG9vbHRpcFN0eWxlLmRvdCksby5zdHlsZS5wb3NpdGlvbj1cImFic29sdXRlXCIsdGhpcy50b29sdGlwPXtkYXRhUG9pbnQ6bnVsbCxkb206e2NvbnRlbnQ6ZSxsaW5lOmksZG90Om99fSksdGhpcy5faGlkZVRvb2x0aXAoKSx0aGlzLnRvb2x0aXAuZGF0YVBvaW50PXQsXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5zaG93VG9vbHRpcD9lLmlubmVySFRNTD10aGlzLnNob3dUb29sdGlwKHQucG9pbnQpOmUuaW5uZXJIVE1MPVwiPHRhYmxlPjx0cj48dGQ+XCIrdGhpcy54TGFiZWwrXCI6PC90ZD48dGQ+XCIrdC5wb2ludC54K1wiPC90ZD48L3RyPjx0cj48dGQ+XCIrdGhpcy55TGFiZWwrXCI6PC90ZD48dGQ+XCIrdC5wb2ludC55K1wiPC90ZD48L3RyPjx0cj48dGQ+XCIrdGhpcy56TGFiZWwrXCI6PC90ZD48dGQ+XCIrdC5wb2ludC56K1wiPC90ZD48L3RyPjwvdGFibGU+XCIsZS5zdHlsZS5sZWZ0PVwiMFwiLGUuc3R5bGUudG9wPVwiMFwiLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQoZSksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZChpKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKG8pO3ZhciBuPWUub2Zmc2V0V2lkdGgscz1lLm9mZnNldEhlaWdodCxyPWkub2Zmc2V0SGVpZ2h0LGg9by5vZmZzZXRXaWR0aCxkPW8ub2Zmc2V0SGVpZ2h0LGw9dC5zY3JlZW4ueC1uLzI7bD1NYXRoLm1pbihNYXRoLm1heChsLDEwKSx0aGlzLmZyYW1lLmNsaWVudFdpZHRoLTEwLW4pLGkuc3R5bGUubGVmdD10LnNjcmVlbi54K1wicHhcIixpLnN0eWxlLnRvcD10LnNjcmVlbi55LXIrXCJweFwiLGUuc3R5bGUubGVmdD1sK1wicHhcIixlLnN0eWxlLnRvcD10LnNjcmVlbi55LXItcytcInB4XCIsby5zdHlsZS5sZWZ0PXQuc2NyZWVuLngtaC8yK1wicHhcIixvLnN0eWxlLnRvcD10LnNjcmVlbi55LWQvMitcInB4XCJ9LG8ucHJvdG90eXBlLl9oaWRlVG9vbHRpcD1mdW5jdGlvbigpe2lmKHRoaXMudG9vbHRpcCl7dGhpcy50b29sdGlwLmRhdGFQb2ludD1udWxsO2Zvcih2YXIgdCBpbiB0aGlzLnRvb2x0aXAuZG9tKWlmKHRoaXMudG9vbHRpcC5kb20uaGFzT3duUHJvcGVydHkodCkpe3ZhciBlPXRoaXMudG9vbHRpcC5kb21bdF07ZSYmZS5wYXJlbnROb2RlJiZlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZSl9fX0sby5wcm90b3R5cGUuc2V0Q2FtZXJhUG9zaXRpb249ZnVuY3Rpb24odCl7Zi5zZXRDYW1lcmFQb3NpdGlvbih0LHRoaXMpLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLnNldFNpemU9ZnVuY3Rpb24odCxlKXt0aGlzLl9zZXRTaXplKHQsZSksdGhpcy5yZWRyYXcoKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtpKDE2MyksdC5leHBvcnRzPWkoNykuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TK28uRixcIk9iamVjdFwiLHthc3NpZ246aSgxNjQpfSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDMzKSxuPWkoNjMpLHM9aSg0Mikscj1pKDQxKSxhPWkoNzgpLGg9T2JqZWN0LmFzc2lnbjt0LmV4cG9ydHM9IWh8fGkoMjgpKGZ1bmN0aW9uKCl7dmFyIHQ9e30sZT17fSxpPVN5bWJvbCgpLG89XCJhYmNkZWZnaGlqa2xtbm9wcXJzdFwiO3JldHVybiB0W2ldPTcsby5zcGxpdChcIlwiKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09dH0pLDchPWgoe30sdClbaV18fE9iamVjdC5rZXlzKGgoe30sZSkpLmpvaW4oXCJcIikhPW99KT9mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1yKHQpLGg9YXJndW1lbnRzLmxlbmd0aCxkPTEsbD1uLmYsdT1zLmY7aD5kOylmb3IodmFyIGMscD1hKGFyZ3VtZW50c1tkKytdKSxmPWw/byhwKS5jb25jYXQobChwKSk6byhwKSxtPWYubGVuZ3RoLHY9MDttPnY7KXUuY2FsbChwLGM9Zlt2KytdKSYmKGlbY109cFtjXSk7cmV0dXJuIGl9Omh9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxNjYpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxNjcpLHQuZXhwb3J0cz1pKDcpLk1hdGguc2lnbn0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TLFwiTWF0aFwiLHtzaWduOmkoMTY4KX0pfSxmdW5jdGlvbih0LGUpe3QuZXhwb3J0cz1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiAwPT0odD0rdCl8fHQhPXQ/dDp0PDA/LTE6MX19LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxNzApLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxNzEpO3ZhciBvPWkoNykuT2JqZWN0O3QuZXhwb3J0cz1mdW5jdGlvbih0LGUsaSl7cmV0dXJuIG8uZGVmaW5lUHJvcGVydHkodCxlLGkpfX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TK28uRiohaSgyMSksXCJPYmplY3RcIix7ZGVmaW5lUHJvcGVydHk6aSgyMCkuZn0pfSxmdW5jdGlvbih0LGUsaSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG89XCJzdHJpbmdcIixuPVwiYm9vbGVhblwiLHM9XCJudW1iZXJcIixyPXtmaWxsOntzd
21167HJpbmc6b30sc3Ryb2tlOntzdHJpbmc6b30sc3Ryb2tlV2lkdGg6e251bWJlcjpzfSxfX3R5cGVfXzp7c3RyaW5nOm8sb2JqZWN0Olwib2JqZWN0XCIsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9fSxhPXthbmltYXRpb25BdXRvU3RhcnQ6e2Jvb2xlYW46bix1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sYW5pbWF0aW9uSW50ZXJ2YWw6e251bWJlcjpzfSxhbmltYXRpb25QcmVsb2FkOntib29sZWFuOm59LGF4aXNDb2xvcjp7c3RyaW5nOm99LGJhY2tncm91bmRDb2xvcjpyLHhCYXJXaWR0aDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHlCYXJXaWR0aDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LGNhbWVyYVBvc2l0aW9uOntkaXN0YW5jZTp7bnVtYmVyOnN9LGhvcml6b250YWw6e251bWJlcjpzfSx2ZXJ0aWNhbDp7bnVtYmVyOnN9LF9fdHlwZV9fOntvYmplY3Q6XCJvYmplY3RcIn19LHhDZW50ZXI6e3N0cmluZzpvfSx5Q2VudGVyOntzdHJpbmc6b30sZGF0YUNvbG9yOnIsZG90U2l6ZU1pbkZyYWN0aW9uOntudW1iZXI6c30sZG90U2l6ZU1heEZyYWN0aW9uOntudW1iZXI6c30sZG90U2l6ZVJhdGlvOntudW1iZXI6c30sZmlsdGVyTGFiZWw6e3N0cmluZzpvfSxncmlkQ29sb3I6e3N0cmluZzpvfSxvbmNsaWNrOntmdW5jdGlvbjpcImZ1bmN0aW9uXCJ9LGtlZXBBc3BlY3RSYXRpbzp7Ym9vbGVhbjpufSx4TGFiZWw6e3N0cmluZzpvfSx5TGFiZWw6e3N0cmluZzpvfSx6TGFiZWw6e3N0cmluZzpvfSxsZWdlbmRMYWJlbDp7c3RyaW5nOm99LHhNaW46e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx5TWluOntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sek1pbjp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHhNYXg6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx5TWF4OntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0sek1heDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHNob3dBbmltYXRpb25Db250cm9sczp7Ym9vbGVhbjpuLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSxzaG93R3JpZDp7Ym9vbGVhbjpufSxzaG93TGVnZW5kOntib29sZWFuOm4sdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHNob3dQZXJzcGVjdGl2ZTp7Ym9vbGVhbjpufSxzaG93U2hhZG93Ontib29sZWFuOm59LHNob3dYQXhpczp7Ym9vbGVhbjpufSxzaG93WUF4aXM6e2Jvb2xlYW46bn0sc2hvd1pBeGlzOntib29sZWFuOm59LHhTdGVwOntudW1iZXI6cyx1bmRlZmluZWQ6XCJ1bmRlZmluZWRcIn0seVN0ZXA6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx6U3RlcDp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHN0eWxlOntudW1iZXI6cyxzdHJpbmc6W1wiYmFyXCIsXCJiYXItY29sb3JcIixcImJhci1zaXplXCIsXCJkb3RcIixcImRvdC1saW5lXCIsXCJkb3QtY29sb3JcIixcImRvdC1zaXplXCIsXCJsaW5lXCIsXCJncmlkXCIsXCJzdXJmYWNlXCJdfSx0b29sdGlwOntib29sZWFuOm4sZnVuY3Rpb246XCJmdW5jdGlvblwifSx0b29sdGlwU3R5bGU6e2NvbnRlbnQ6e2NvbG9yOntzdHJpbmc6b30sYmFja2dyb3VuZDp7c3RyaW5nOm99LGJvcmRlcjp7c3RyaW5nOm99LGJvcmRlclJhZGl1czp7c3RyaW5nOm99LGJveFNoYWRvdzp7c3RyaW5nOm99LHBhZGRpbmc6e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0Olwib2JqZWN0XCJ9fSxsaW5lOntib3JkZXJMZWZ0OntzdHJpbmc6b30saGVpZ2h0OntzdHJpbmc6b30sd2lkdGg6e3N0cmluZzpvfSxfX3R5cGVfXzp7b2JqZWN0Olwib2JqZWN0XCJ9fSxkb3Q6e2JvcmRlcjp7c3RyaW5nOm99LGJvcmRlclJhZGl1czp7c3RyaW5nOm99LGhlaWdodDp7c3RyaW5nOm99LHdpZHRoOntzdHJpbmc6b30sX190eXBlX186e29iamVjdDpcIm9iamVjdFwifX0sX190eXBlX186e29iamVjdDpcIm9iamVjdFwifX0seFZhbHVlTGFiZWw6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0seVZhbHVlTGFiZWw6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0selZhbHVlTGFiZWw6e2Z1bmN0aW9uOlwiZnVuY3Rpb25cIn0sdmFsdWVNYXg6e251bWJlcjpzLHVuZGVmaW5lZDpcInVuZGVmaW5lZFwifSx2YWx1ZU1pbjp7bnVtYmVyOnMsdW5kZWZpbmVkOlwidW5kZWZpbmVkXCJ9LHZlcnRpY2FsUmF0aW86e251bWJlcjpzfSxoZWlnaHQ6e3N0cmluZzpvfSx3aWR0aDp7c3RyaW5nOm99LF9fdHlwZV9fOntvYmplY3Q6XCJvYmplY3RcIn19O2UuYWxsT3B0aW9ucz1hfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbygpe3RoaXMuZGF0YVRhYmxlPW51bGx9dmFyIG49aSgxMSkscz1pKDEyKSxyPWkoMTc0KSxhPWkoOTYpLGg9aSg5NCksZD1pKDM0KTtvLnByb3RvdHlwZS5pbml0aWFsaXplRGF0YT1mdW5jdGlvbih0LGUsaSl7aWYodm9pZCAwIT09ZSl7QXJyYXkuaXNBcnJheShlKSYmKGU9bmV3IG4oZSkpO3ZhciBvO2lmKCEoZSBpbnN0YW5jZW9mIG58fGUgaW5zdGFuY2VvZiBzKSl0aHJvdyBuZXcgRXJyb3IoXCJBcnJheSwgRGF0YVNldCwgb3IgRGF0YVZpZXcgZXhwZWN0ZWRcIik7aWYobz1lLmdldCgpLDAhPW8ubGVuZ3RoKXt0aGlzLnN0eWxlPWksdGhpcy5kYXRhU2V0JiZ0aGlzLmRhdGFTZXQub2ZmKFwiKlwiLHRoaXMuX29uQ2hhbmdlKSx0aGlzLmRhdGFTZXQ9ZSx0aGlzLmRhdGFUYWJsZT1vO3ZhciByPXRoaXM7dGhpcy5fb25DaGFuZ2U9ZnVuY3Rpb24oKXt0LnNldERhdGEoci5kYXRhU2V0KX0sdGhpcy5kYXRhU2V0Lm9uKFwiKlwiLHRoaXMuX29uQ2hhbmdlKSx0aGlzLmNvbFg9XCJ4XCIsdGhpcy5jb2xZPVwieVwiLHRoaXMuY29sWj1cInpcIjt2YXIgaD10Lmhhc0JhcnMoaSk7aWYoaCYmKHZvaWQgMCE9PXQuZGVmYXVsdFhCYXJXaWR0aD90aGlzLnhCYXJXaWR0aD10LmRlZmF1bHRYQmFyV2lkdGg6dGhpcy54QmFyV2lkdGg9dGhpcy5nZXRTbWFsbGVzdERpZmZlcmVuY2Uobyx0aGlzLmNvbFgpfHwxLHZvaWQgMCE9PXQuZGVmYXVsdFlCYXJXaWR0aD90aGlzLnlCYXJXaWR0aD10LmRlZmF1bHRZQmFyV2lkdGg6dGhpcy55QmFyV2lkdGg9dGhpcy5nZXRTbWFsbGVzdERpZmZlcmVuY2Uobyx0aGlzLmNvbFkpfHwxKSx0aGlzLl9pbml0aWFsaXplUmFuZ2Uobyx0aGlzLmNvbFgsdCxoKSx0aGlzLl9pbml0aWFsaXplUmFuZ2Uobyx0aGlzLmNvbFksdCxoKSx0aGlzLl9pbml0aWFsaXplUmFuZ2Uobyx0aGlzLmNvbFosdCwhMSksb1swXS5oYXNPd25Qcm9wZXJ0eShcInN0eWxlXCIpKXt0aGlzLmNvbFZhbHVlPVwic3R5bGVcIjt2YXIgZD10aGlzLmdldENvbHVtblJhbmdlKG8sdGhpcy5jb2xWYWx1ZSk7dGhpcy5fc2V0UmFuZ2VEZWZhdWx0cyhkLHQuZGVmYXVsdFZhbHVlTWluLHQuZGVmYXVsdFZhbHVlTWF4KSx0aGlzLnZhbHVlUmFuZ2U9ZH10aGlzLmdldERhdGFUYWJsZSgpWzBdLmhhc093blByb3BlcnR5KFwiZmlsdGVyXCIpJiZ2b2lkIDA9PT10aGlzLmRhdGFGaWx0ZXImJih0aGlzLmRhdGFGaWx0ZXI9bmV3IGEodGhpcyxcImZpbHRlclwiLHQpLHRoaXMuZGF0YUZpbHRlci5zZXRPbkxvYWRDYWxsYmFjayhmdW5jdGlvbigpe3QucmVkcmF3KCl9KSk7cmV0dXJuIHRoaXMuZGF0YUZpbHRlcj90aGlzLmRhdGFGaWx0ZXIuX2dldERhdGFQb2ludHMoKTp0aGlzLl9nZXREYXRhUG9pbnRzKHR
21167oaXMuZ2V0RGF0YVRhYmxlKCkpfX19LG8ucHJvdG90eXBlLl9jb2xsZWN0UmFuZ2VTZXR0aW5ncz1mdW5jdGlvbih0LGUpe2lmKC0xPT1bXCJ4XCIsXCJ5XCIsXCJ6XCJdLmluZGV4T2YodCkpdGhyb3cgbmV3IEVycm9yKFwiQ29sdW1uICdcIit0K1wiJyBpbnZhbGlkXCIpO3ZhciBpPXQudG9VcHBlckNhc2UoKTtyZXR1cm57YmFyV2lkdGg6dGhpc1t0K1wiQmFyV2lkdGhcIl0sbWluOmVbXCJkZWZhdWx0XCIraStcIk1pblwiXSxtYXg6ZVtcImRlZmF1bHRcIitpK1wiTWF4XCJdLHN0ZXA6ZVtcImRlZmF1bHRcIitpK1wiU3RlcFwiXSxyYW5nZV9sYWJlbDp0K1wiUmFuZ2VcIixzdGVwX2xhYmVsOnQrXCJTdGVwXCJ9fSxvLnByb3RvdHlwZS5faW5pdGlhbGl6ZVJhbmdlPWZ1bmN0aW9uKHQsZSxpLG8pe3ZhciBuPXRoaXMuX2NvbGxlY3RSYW5nZVNldHRpbmdzKGUsaSkscz10aGlzLmdldENvbHVtblJhbmdlKHQsZSk7byYmXCJ6XCIhPWUmJnMuZXhwYW5kKG4uYmFyV2lkdGgvMiksdGhpcy5fc2V0UmFuZ2VEZWZhdWx0cyhzLG4ubWluLG4ubWF4KSx0aGlzW24ucmFuZ2VfbGFiZWxdPXMsdGhpc1tuLnN0ZXBfbGFiZWxdPXZvaWQgMCE9PW4uc3RlcD9uLnN0ZXA6cy5yYW5nZSgpLzV9LG8ucHJvdG90eXBlLmdldERpc3RpbmN0VmFsdWVzPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9dGhpcy5kYXRhVGFibGUpO2Zvcih2YXIgaT1bXSxvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciBuPWVbb11bdF18fDA7LTE9PT1pLmluZGV4T2YobikmJmkucHVzaChuKX1yZXR1cm4gaS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pfSxvLnByb3RvdHlwZS5nZXRTbWFsbGVzdERpZmZlcmVuY2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9dGhpcy5nZXREaXN0aW5jdFZhbHVlcyh0LGUpLG89bnVsbCxuPTE7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl0taVtuLTFdOyhudWxsPT1vfHxvPnMpJiYobz1zKX1yZXR1cm4gb30sby5wcm90b3R5cGUuZ2V0Q29sdW1uUmFuZ2U9ZnVuY3Rpb24odCxlKXtmb3IodmFyIGk9bmV3IHIsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dW2VdO2kuYWRqdXN0KG4pfXJldHVybiBpfSxvLnByb3RvdHlwZS5nZXROdW1iZXJPZlJvd3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhVGFibGUubGVuZ3RofSxvLnByb3RvdHlwZS5fc2V0UmFuZ2VEZWZhdWx0cz1mdW5jdGlvbih0LGUsaSl7dm9pZCAwIT09ZSYmKHQubWluPWUpLHZvaWQgMCE9PWkmJih0Lm1heD1pKSx0Lm1heDw9dC5taW4mJih0Lm1heD10Lm1pbisxKX0sby5wcm90b3R5cGUuZ2V0RGF0YVRhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVRhYmxlfSxvLnByb3RvdHlwZS5nZXREYXRhU2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YVNldH0sby5wcm90b3R5cGUuZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKXt2YXIgbz1uZXcgZDtvLng9dFtpXVt0aGlzLmNvbFhdfHwwLG8ueT10W2ldW3RoaXMuY29sWV18fDAsby56PXRbaV1bdGhpcy5jb2xaXXx8MCxvLmRhdGE9dFtpXSx2b2lkIDAhPT10aGlzLmNvbFZhbHVlJiYoby52YWx1ZT10W2ldW3RoaXMuY29sVmFsdWVdfHwwKTt2YXIgbj17fTtuLnBvaW50PW8sbi5ib3R0b209bmV3IGQoby54LG8ueSx0aGlzLnpSYW5nZS5taW4pLG4udHJhbnM9dm9pZCAwLG4uc2NyZWVuPXZvaWQgMCxlLnB1c2gobil9cmV0dXJuIGV9LG8ucHJvdG90eXBlLmluaXREYXRhQXNNYXRyaXg9ZnVuY3Rpb24odCl7dmFyIGUsaSxvLG4scz10aGlzLmdldERpc3RpbmN0VmFsdWVzKHRoaXMuY29sWCx0KSxyPXRoaXMuZ2V0RGlzdGluY3RWYWx1ZXModGhpcy5jb2xZLHQpLGE9dGhpcy5nZXREYXRhUG9pbnRzKHQpLGg9W107Zm9yKG89MDtvPGEubGVuZ3RoO28rKyl7bj1hW29dO3ZhciBkPXMuaW5kZXhPZihuLnBvaW50LngpLGw9ci5pbmRleE9mKG4ucG9pbnQueSk7dm9pZCAwPT09aFtkXSYmKGhbZF09W10pLGhbZF1bbF09bn1mb3IoZT0wO2U8aC5sZW5ndGg7ZSsrKWZvcihpPTA7aTxoW2VdLmxlbmd0aDtpKyspaFtlXVtpXSYmKGhbZV1baV0ucG9pbnRSaWdodD1lPGgubGVuZ3RoLTE/aFtlKzFdW2ldOnZvaWQgMCxoW2VdW2ldLnBvaW50VG9wPWk8aFtlXS5sZW5ndGgtMT9oW2VdW2krMV06dm9pZCAwLGhbZV1baV0ucG9pbnRDcm9zcz1lPGgubGVuZ3RoLTEmJmk8aFtlXS5sZW5ndGgtMT9oW2UrMV1baSsxXTp2b2lkIDApO3JldHVybiBhfSxvLnByb3RvdHlwZS5nZXRJbmZvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhRmlsdGVyO2lmKHQpcmV0dXJuIHQuZ2V0TGFiZWwoKStcIjogXCIrdC5nZXRTZWxlY3RlZFZhbHVlKCl9LG8ucHJvdG90eXBlLnJlbG9hZD1mdW5jdGlvbigpe3RoaXMuZGF0YVRhYmxlJiZ0aGlzLnNldERhdGEodGhpcy5kYXRhVGFibGUpfSxvLnByb3RvdHlwZS5fZ2V0RGF0YVBvaW50cz1mdW5jdGlvbih0KXt2YXIgZT1bXTtpZih0aGlzLnN0eWxlPT09aC5TVFlMRS5HUklEfHx0aGlzLnN0eWxlPT09aC5TVFlMRS5TVVJGQUNFKWU9dGhpcy5pbml0RGF0YUFzTWF0cml4KHQpO2Vsc2UgaWYodGhpcy5fY2hlY2tWYWx1ZUZpZWxkKHQpLGU9dGhpcy5nZXREYXRhUG9pbnRzKHQpLHRoaXMuc3R5bGU9PT1oLlNUWUxFLkxJTkUpZm9yKHZhciBpPTA7aTxlLmxlbmd0aDtpKyspaT4wJiYoZVtpLTFdLnBvaW50TmV4dD1lW2ldKTtyZXR1cm4gZX0sby5wcm90b3R5cGUuX2NoZWNrVmFsdWVGaWVsZD1mdW5jdGlvbih0KXtpZih0aGlzLnN0eWxlPT09aC5TVFlMRS5CQVJDT0xPUnx8dGhpcy5zdHlsZT09PWguU1RZTEUuQkFSU0laRXx8dGhpcy5zdHlsZT09PWguU1RZTEUuRE9UQ09MT1J8fHRoaXMuc3R5bGU9PT1oLlNUWUxFLkRPVFNJWkUpe2lmKHZvaWQgMD09PXRoaXMuY29sVmFsdWUpdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGF0YSB0byBoYXZlICBmaWVsZCAnc3R5bGUnICBmb3IgZ3JhcGggc3R5bGUgJ1wiK3RoaXMuc3R5bGUrXCInXCIpO2lmKHZvaWQgMD09PXRbMF1bdGhpcy5jb2xWYWx1ZV0pdGhyb3cgbmV3IEVycm9yKFwiRXhwZWN0ZWQgZGF0YSB0byBoYXZlICBmaWVsZCAnXCIrdGhpcy5jb2xWYWx1ZStcIicgIGZvciBncmFwaCBzdHlsZSAnXCIrdGhpcy5zdHlsZStcIidcIil9fSx0LmV4cG9ydHM9b30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8oKXt0aGlzLm1pbj12b2lkIDAsdGhpcy5tYXg9dm9pZCAwfW8ucHJvdG90eXBlLmFkanVzdD1mdW5jdGlvbih0KXt2b2lkIDAhPT10JiYoKHZvaWQgMD09PXRoaXMubWlufHx0aGlzLm1pbj50KSYmKHRoaXMubWluPXQpLCh2b2lkIDA9PT10aGlzLm1heHx8dGhpcy5tYXg8dCkmJih0aGlzLm1heD10KSl9LG8ucHJvdG90eXBlLmNvbWJpbmU9ZnVuY3Rpb24odCl7dGhpcy5hZGQodC5taW4pLHRoaXMuYWRkKHQubWF4KX0sby5wcm90b3R5cGUuZXhwYW5kPWZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPXR
21167oaXMubWluLXQsaT10aGlzLm1heCt0O2lmKGU+aSl0aHJvdyBuZXcgRXJyb3IoXCJQYXNzZWQgZXhwYW5zaW9uIHZhbHVlIG1ha2VzIHJhbmdlIGludmFsaWRcIik7dGhpcy5taW49ZSx0aGlzLm1heD1pfX0sby5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXgtdGhpcy5taW59LG8ucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbigpe3JldHVybih0aGlzLm1pbit0aGlzLm1heCkvMn0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbyxuLHM7IWZ1bmN0aW9uKGkpe249W10sbz1pLHZvaWQgMCE9PShzPVwiZnVuY3Rpb25cIj09dHlwZW9mIG8/by5hcHBseShlLG4pOm8pJiYodC5leHBvcnRzPXMpfShmdW5jdGlvbigpe3ZhciB0PW51bGw7cmV0dXJuIGZ1bmN0aW9uIGUoaSxvKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0Lm1hdGNoKC9bXiBdKy9nKX1mdW5jdGlvbiBzKGUpe2lmKFwiaGFtbWVyLmlucHV0XCIhPT1lLnR5cGUpe2lmKGUuc3JjRXZlbnQuX2hhbmRsZWR8fChlLnNyY0V2ZW50Ll9oYW5kbGVkPXt9KSxlLnNyY0V2ZW50Ll9oYW5kbGVkW2UudHlwZV0pcmV0dXJuO2Uuc3JjRXZlbnQuX2hhbmRsZWRbZS50eXBlXT0hMH12YXIgaT0hMTtlLnN0b3BQcm9wYWdhdGlvbj1mdW5jdGlvbigpe2k9ITB9O3ZhciBvPWUuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uLmJpbmQoZS5zcmNFdmVudCk7XCJmdW5jdGlvblwiPT10eXBlb2YgbyYmKGUuc3JjRXZlbnQuc3RvcFByb3BhZ2F0aW9uPWZ1bmN0aW9uKCl7bygpLGUuc3RvcFByb3BhZ2F0aW9uKCl9KSxlLmZpcnN0VGFyZ2V0PXQ7Zm9yKHZhciBuPXQ7biYmIWk7KXt2YXIgcz1uLmhhbW1lcjtpZihzKWZvcih2YXIgcixhPTA7YTxzLmxlbmd0aDthKyspaWYocj1zW2FdLl9oYW5kbGVyc1tlLnR5cGVdKWZvcih2YXIgaD0wO2g8ci5sZW5ndGgmJiFpO2grKylyW2hdKGUpO249bi5wYXJlbnROb2RlfX12YXIgcj1vfHx7cHJldmVudERlZmF1bHQ6ITF9O2lmKGkuTWFuYWdlcil7dmFyIGE9aSxoPWZ1bmN0aW9uKHQsaSl7dmFyIG89T2JqZWN0LmNyZWF0ZShyKTtyZXR1cm4gaSYmYS5hc3NpZ24obyxpKSxlKG5ldyBhKHQsbyksbyl9O3JldHVybiBhLmFzc2lnbihoLGEpLGguTWFuYWdlcj1mdW5jdGlvbih0LGkpe3ZhciBvPU9iamVjdC5jcmVhdGUocik7cmV0dXJuIGkmJmEuYXNzaWduKG8saSksZShuZXcgYS5NYW5hZ2VyKHQsbyksbyl9LGh9dmFyIGQ9T2JqZWN0LmNyZWF0ZShpKSxsPWkuZWxlbWVudDtyZXR1cm4gbC5oYW1tZXJ8fChsLmhhbW1lcj1bXSksbC5oYW1tZXIucHVzaChkKSxpLm9uKFwiaGFtbWVyLmlucHV0XCIsZnVuY3Rpb24oZSl7ITAhPT1yLnByZXZlbnREZWZhdWx0JiZyLnByZXZlbnREZWZhdWx0IT09ZS5wb2ludGVyVHlwZXx8ZS5wcmV2ZW50RGVmYXVsdCgpLGUuaXNGaXJzdCYmKHQ9ZS50YXJnZXQpfSksZC5faGFuZGxlcnM9e30sZC5vbj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89ZC5faGFuZGxlcnNbdF07b3x8KGQuX2hhbmRsZXJzW3RdPW89W10saS5vbih0LHMpKSxvLnB1c2goZSl9KSxkfSxkLm9mZj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQpLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIG89ZC5faGFuZGxlcnNbdF07byYmKG89ZT9vLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdCE9PWV9KTpbXSxvLmxlbmd0aD4wP2QuX2hhbmRsZXJzW3RdPW86KGkub2ZmKHQscyksZGVsZXRlIGQuX2hhbmRsZXJzW3RdKSl9KSxkfSxkLmVtaXQ9ZnVuY3Rpb24oZSxvKXt0PW8udGFyZ2V0LGkuZW1pdChlLG8pfSxkLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgdD1pLmVsZW1lbnQuaGFtbWVyLGU9dC5pbmRleE9mKGQpOy0xIT09ZSYmdC5zcGxpY2UoZSwxKSx0Lmxlbmd0aHx8ZGVsZXRlIGkuZWxlbWVudC5oYW1tZXIsZC5faGFuZGxlcnM9e30saS5kZXN0cm95KCl9LGR9fSl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbzshZnVuY3Rpb24obixzLHIsYSl7ZnVuY3Rpb24gaCh0LGUsaSl7cmV0dXJuIHNldFRpbWVvdXQocCh0LGkpLGUpfWZ1bmN0aW9uIGQodCxlLGkpe3JldHVybiEhQXJyYXkuaXNBcnJheSh0KSYmKGwodCxpW2VdLGkpLCEwKX1mdW5jdGlvbiBsKHQsZSxpKXt2YXIgbztpZih0KWlmKHQuZm9yRWFjaCl0LmZvckVhY2goZSxpKTtlbHNlIGlmKHQubGVuZ3RoIT09YSlmb3Iobz0wO288dC5sZW5ndGg7KWUuY2FsbChpLHRbb10sbyx0KSxvKys7ZWxzZSBmb3IobyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJmUuY2FsbChpLHRbb10sbyx0KX1mdW5jdGlvbiB1KHQsZSxpKXt2YXIgbz1cIkRFUFJFQ0FURUQgTUVUSE9EOiBcIitlK1wiXFxuXCIraStcIiBBVCBcXG5cIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT1uZXcgRXJyb3IoXCJnZXQtc3RhY2stdHJhY2VcIiksaT1lJiZlLnN0YWNrP2Uuc3RhY2sucmVwbGFjZSgvXlteXFwoXSs/W1xcbiRdL2dtLFwiXCIpLnJlcGxhY2UoL15cXHMrYXRcXHMrL2dtLFwiXCIpLnJlcGxhY2UoL15PYmplY3QuPGFub255bW91cz5cXHMqXFwoL2dtLFwie2Fub255bW91c30oKUBcIik6XCJVbmtub3duIFN0YWNrIFRyYWNlXCIscz1uLmNvbnNvbGUmJihuLmNvbnNvbGUud2Fybnx8bi5jb25zb2xlLmxvZyk7cmV0dXJuIHMmJnMuY2FsbChuLmNvbnNvbGUsbyxpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gYyh0LGUsaSl7dmFyIG8sbj1lLnByb3RvdHlwZTtvPXQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobiksby5jb25zdHJ1Y3Rvcj10LG8uX3N1cGVyPW4saSYmZnQobyxpKX1mdW5jdGlvbiBwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHQuYXBwbHkoZSxhcmd1bWVudHMpfX1mdW5jdGlvbiBmKHQsZSl7cmV0dXJuIHR5cGVvZiB0PT1ndD90LmFwcGx5KGU/ZVswXXx8YTphLGUpOnR9ZnVuY3Rpb24gbSh0LGUpe3JldHVybiB0PT09YT9lOnR9ZnVuY3Rpb24gdih0LGUsaSl7bChfKGUpLGZ1bmN0aW9uKGUpe3QuYWRkRXZlbnRMaXN0ZW5lcihlLGksITEpfSl9ZnVuY3Rpb24gZyh0LGUsaSl7bChfKGUpLGZ1bmN0aW9uKGUpe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLGksITEpfSl9ZnVuY3Rpb24geSh0LGUpe2Zvcig7dDspe2lmKHQ9PWUpcmV0dXJuITA7dD10LnBhcmVudE5vZGV9cmV0dXJuITF9ZnVuY3Rpb24gYih0LGUpe3JldHVybiB0LmluZGV4T2YoZSk+LTF9ZnVuY3Rpb24gXyh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL1xccysvZyl9ZnVuY3Rpb24gdyh0LGUsaSl7aWYodC5pbmRleE9mJiYhaSlyZXR1cm4gdC5pbmRleE9mKGUpO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7KXtpZihpJiZ0W29dW2ldPT1lfHwhaSYmdFtvXT09PWUpcmV0dXJuIG87bysrfXJldHVybi0xfWZ1bmN0aW9uIHgodCl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQsMCl9ZnVuY3Rpb24gayh0LGUsaSl7Zm9yKHZhciBvPVtdLG49W10scz0wO3M8dC5sZW5ndGg7KXt2YXIgcj1lP3Rbc11bZV06dFtzXTt3KG4scik8MCYmby5wdXNoKHRbc10pLG5bc109cixzKyt9cmV0dXJuIGkmJihvPWU/by5zb3J0KGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHRbZV0+aVtlXX0pOm8uc29ydCgpKSxvfWZ1bmN0aW9uIFModCxlKXtmb3IodmFyIGksbyxuPWVbMF0udG9VcHBlckNhc2UoKStlLnNsaWNlKDEpLHM9MDtzPG10Lmxlbmd0aDspe2lmKGk9bXRbc10sKG89aT9pK246ZSlpbiB0KXJldHVybi
21167BvO3MrK31yZXR1cm4gYX1mdW5jdGlvbiBEKCl7cmV0dXJuIGt0Kyt9ZnVuY3Rpb24gTSh0KXt2YXIgZT10Lm93bmVyRG9jdW1lbnR8fHQ7cmV0dXJuIGUuZGVmYXVsdFZpZXd8fGUucGFyZW50V2luZG93fHxufWZ1bmN0aW9uIEModCxlKXt2YXIgaT10aGlzO3RoaXMubWFuYWdlcj10LHRoaXMuY2FsbGJhY2s9ZSx0aGlzLmVsZW1lbnQ9dC5lbGVtZW50LHRoaXMudGFyZ2V0PXQub3B0aW9ucy5pbnB1dFRhcmdldCx0aGlzLmRvbUhhbmRsZXI9ZnVuY3Rpb24oZSl7Zih0Lm9wdGlvbnMuZW5hYmxlLFt0XSkmJmkuaGFuZGxlcihlKX0sdGhpcy5pbml0KCl9ZnVuY3Rpb24gTyh0KXt2YXIgZT10Lm9wdGlvbnMuaW5wdXRDbGFzcztyZXR1cm4gbmV3KGV8fChNdD9XOkN0P1Y6RHQ/cTpIKSkodCxFKX1mdW5jdGlvbiBFKHQsZSxpKXt2YXIgbz1pLnBvaW50ZXJzLmxlbmd0aCxuPWkuY2hhbmdlZFBvaW50ZXJzLmxlbmd0aCxzPWUmRXQmJm8tbj09MCxyPWUmKFB0fEl0KSYmby1uPT0wO2kuaXNGaXJzdD0hIXMsaS5pc0ZpbmFsPSEhcixzJiYodC5zZXNzaW9uPXt9KSxpLmV2ZW50VHlwZT1lLFQodCxpKSx0LmVtaXQoXCJoYW1tZXIuaW5wdXRcIixpKSx0LnJlY29nbml6ZShpKSx0LnNlc3Npb24ucHJldklucHV0PWl9ZnVuY3Rpb24gVCh0LGUpe3ZhciBpPXQuc2Vzc2lvbixvPWUucG9pbnRlcnMsbj1vLmxlbmd0aDtpLmZpcnN0SW5wdXR8fChpLmZpcnN0SW5wdXQ9TihlKSksbj4xJiYhaS5maXJzdE11bHRpcGxlP2kuZmlyc3RNdWx0aXBsZT1OKGUpOjE9PT1uJiYoaS5maXJzdE11bHRpcGxlPSExKTt2YXIgcz1pLmZpcnN0SW5wdXQscj1pLmZpcnN0TXVsdGlwbGUsYT1yP3IuY2VudGVyOnMuY2VudGVyLGg9ZS5jZW50ZXI9UihvKTtlLnRpbWVTdGFtcD1fdCgpLGUuZGVsdGFUaW1lPWUudGltZVN0YW1wLXMudGltZVN0YW1wLGUuYW5nbGU9RihhLGgpLGUuZGlzdGFuY2U9TChhLGgpLFAoaSxlKSxlLm9mZnNldERpcmVjdGlvbj16KGUuZGVsdGFYLGUuZGVsdGFZKTt2YXIgZD1BKGUuZGVsdGFUaW1lLGUuZGVsdGFYLGUuZGVsdGFZKTtlLm92ZXJhbGxWZWxvY2l0eVg9ZC54LGUub3ZlcmFsbFZlbG9jaXR5WT1kLnksZS5vdmVyYWxsVmVsb2NpdHk9YnQoZC54KT5idChkLnkpP2QueDpkLnksZS5zY2FsZT1yP2ooci5wb2ludGVycyxvKToxLGUucm90YXRpb249cj9CKHIucG9pbnRlcnMsbyk6MCxlLm1heFBvaW50ZXJzPWkucHJldklucHV0P2UucG9pbnRlcnMubGVuZ3RoPmkucHJldklucHV0Lm1heFBvaW50ZXJzP2UucG9pbnRlcnMubGVuZ3RoOmkucHJldklucHV0Lm1heFBvaW50ZXJzOmUucG9pbnRlcnMubGVuZ3RoLEkoaSxlKTt2YXIgbD10LmVsZW1lbnQ7eShlLnNyY0V2ZW50LnRhcmdldCxsKSYmKGw9ZS5zcmNFdmVudC50YXJnZXQpLGUudGFyZ2V0PWx9ZnVuY3Rpb24gUCh0LGUpe3ZhciBpPWUuY2VudGVyLG89dC5vZmZzZXREZWx0YXx8e30sbj10LnByZXZEZWx0YXx8e30scz10LnByZXZJbnB1dHx8e307ZS5ldmVudFR5cGUhPT1FdCYmcy5ldmVudFR5cGUhPT1QdHx8KG49dC5wcmV2RGVsdGE9e3g6cy5kZWx0YVh8fDAseTpzLmRlbHRhWXx8MH0sbz10Lm9mZnNldERlbHRhPXt4OmkueCx5OmkueX0pLGUuZGVsdGFYPW4ueCsoaS54LW8ueCksZS5kZWx0YVk9bi55KyhpLnktby55KX1mdW5jdGlvbiBJKHQsZSl7dmFyIGksbyxuLHMscj10Lmxhc3RJbnRlcnZhbHx8ZSxoPWUudGltZVN0YW1wLXIudGltZVN0YW1wO2lmKGUuZXZlbnRUeXBlIT1JdCYmKGg+T3R8fHIudmVsb2NpdHk9PT1hKSl7dmFyIGQ9ZS5kZWx0YVgtci5kZWx0YVgsbD1lLmRlbHRhWS1yLmRlbHRhWSx1PUEoaCxkLGwpO289dS54LG49dS55LGk9YnQodS54KT5idCh1LnkpP3UueDp1Lnkscz16KGQsbCksdC5sYXN0SW50ZXJ2YWw9ZX1lbHNlIGk9ci52ZWxvY2l0eSxvPXIudmVsb2NpdHlYLG49ci52ZWxvY2l0eVkscz1yLmRpcmVjdGlvbjtlLnZlbG9jaXR5PWksZS52ZWxvY2l0eVg9byxlLnZlbG9jaXR5WT1uLGUuZGlyZWN0aW9uPXN9ZnVuY3Rpb24gTih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5wb2ludGVycy5sZW5ndGg7KWVbaV09e2NsaWVudFg6eXQodC5wb2ludGVyc1tpXS5jbGllbnRYKSxjbGllbnRZOnl0KHQucG9pbnRlcnNbaV0uY2xpZW50WSl9LGkrKztyZXR1cm57dGltZVN0YW1wOl90KCkscG9pbnRlcnM6ZSxjZW50ZXI6UihlKSxkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfX1mdW5jdGlvbiBSKHQpe3ZhciBlPXQubGVuZ3RoO2lmKDE9PT1lKXJldHVybnt4Onl0KHRbMF0uY2xpZW50WCkseTp5dCh0WzBdLmNsaWVudFkpfTtmb3IodmFyIGk9MCxvPTAsbj0wO248ZTspaSs9dFtuXS5jbGllbnRYLG8rPXRbbl0uY2xpZW50WSxuKys7cmV0dXJue3g6eXQoaS9lKSx5Onl0KG8vZSl9fWZ1bmN0aW9uIEEodCxlLGkpe3JldHVybnt4OmUvdHx8MCx5OmkvdHx8MH19ZnVuY3Rpb24geih0LGUpe3JldHVybiB0PT09ZT9OdDpidCh0KT49YnQoZSk/dDwwP1J0OkF0OmU8MD96dDpMdH1mdW5jdGlvbiBMKHQsZSxpKXtpfHwoaT1IdCk7dmFyIG89ZVtpWzBdXS10W2lbMF1dLG49ZVtpWzFdXS10W2lbMV1dO3JldHVybiBNYXRoLnNxcnQobypvK24qbil9ZnVuY3Rpb24gRih0LGUsaSl7aXx8KGk9SHQpO3ZhciBvPWVbaVswXV0tdFtpWzBdXSxuPWVbaVsxXV0tdFtpWzFdXTtyZXR1cm4gMTgwKk1hdGguYXRhbjIobixvKS9NYXRoLlBJfWZ1bmN0aW9uIEIodCxlKXtyZXR1cm4gRihlWzFdLGVbMF0sV3QpK0YodFsxXSx0WzBdLFd0KX1mdW5jdGlvbiBqKHQsZSl7cmV0dXJuIEwoZVswXSxlWzFdLFd0KS9MKHRbMF0sdFsxXSxXdCl9ZnVuY3Rpb24gSCgpe3RoaXMuZXZFbD1HdCx0aGlzLmV2V2luPVZ0LHRoaXMucHJlc3NlZD0hMSxDLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBXKCl7dGhpcy5ldkVsPVh0LHRoaXMuZXZXaW49WnQsQy5hcHBseSh0aGlzLGFyZ3VtZW50cyksdGhpcy5zdG9yZT10aGlzLm1hbmFnZXIuc2Vzc2lvbi5wb2ludGVyRXZlbnRzPVtdfWZ1bmN0aW9uIFkoKXt0aGlzLmV2VGFyZ2V0PUp0LHRoaXMuZXZXaW49JHQsdGhpcy5zdGFydGVkPSExLEMuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIEcodCxlKXt2YXIgaT14KHQudG91Y2hlcyksbz14KHQuY2hhbmdlZFRvdWNoZXMpO3JldHVybiBlJihQdHxJdCkmJihpPWsoaS5jb25jYXQobyksXCJpZGVudGlmaWVyXCIsITApKSxbaSxvXX1mdW5jdGlvbiBWKCl7dGhpcy5ldlRhcmdldD10ZSx0aGlzLnRhcmdldElkcz17fSxDLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1mdW5jdGlvbiBVKHQsZSl7dmFyIGk9eCh0LnRvdWNoZXMpLG89dGhpcy50YXJnZXRJZHM7aWYoZSYoRXR8VHQpJiYxPT09aS5sZW5ndGgpcmV0dXJuIG9baVswXS5pZGVudGlmaWVyXT0hMCxbaSxpXTt2YXIgbixzLHI9eCh0LmNoYW5nZWRUb3VjaGVzKSxhPVtdLGg9dGhpcy50YXJnZXQ7aWYocz1pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4geSh0LnRhcmdldCxoKX0pLGU9PT1FdClmb3Iobj0wO248cy5sZW5ndGg7KW9bc1tuXS5pZGVudGlmaWVyXT0hMCxuKys7Zm9yKG49MDtuPHIubGVuZ3RoOylvW3Jbbl0uaWRlbnRpZmllcl0mJmEucHVzaChyW25dKSxlJihQdHxJdCkmJmRlbGV0ZSBvW3Jbbl0uaWRlbnRpZmllcl0sbisrO3JldHVybiBhLmxlbmd0aD9bayhzLmNvbmNhdChhKSxcImlkZW50aWZpZXJcIiwhMCksYV06dm9pZCAwfWZ1bmN0aW9uIHEoKXtDLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgdD1wKHRoaXMuaGFuZGxlcix0aGlzKTt0aGlzLnRvdWNoPW5ldyBWKHRoaXMubWFuYWdlcix0KSx0aGlzLm1vdXNlPW5ldyBIKHRoaXMubWFuYWdlcix0KSx0aGlzLnByaW1hcnlUb3VjaD1udWxsLHRoaXMubGFzdFRvdWNoZXM9W119ZnVuY3Rpb24gWCh0LGUpe3QmRXQ/KHRoaXMucHJpbWFyeVRvdWNoPWUuY2hhbmdlZFBvaW50ZXJzWzBdLmlkZW50aWZpZXIsWi5jYWxsKHRoaXMsZSkpOnQmKFB0fEl0KSYmWi5jYWxsKHRoaXMsZSl9ZnVuY3Rpb24gWih0KXt2YXIgZT10LmNoYW5nZWRQb2ludGVyc1swXTtpZihlLmlkZW50aWZpZXI9PT10aGlzLnByaW1hcnlUb3VjaCl7dmFyIGk9e3g6ZS5jbGllbnRYLHk6ZS5jbGllbnRZfTt0aGlzLmxhc3RUb3VjaGVzLnB1c2goaSk7dmFyIG89dGhpcy5sYXN0VG91Y2hlcyxuPWZ1bmN0aW9uKCl7dmFyIHQ9by5pbmRleE9mKGkpO3Q+LTEmJm8uc3BsaWNlKHQsMSl9O3NldFRpbWVvdXQobixlZSl9fWZ1bmN0aW9uIEsodCl7Zm9yKHZhciBlPXQuc3JjRXZlbnQuY2xpZW50WCxpPXQuc3JjRXZlbnQuY2xpZW50WSxvPTA7bzx0aGlzLmxhc3RUb3VjaGVzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMubGFzdFRvdWNoZXNbb10scz1NYXRoLmFicyhlLW4ueCkscj1NYXRoLmFicyhpLW4ueSk7aWYoczw9aWUmJnI8PWllKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIEoodCxlKXt0aGlzLm1hbmFnZXI9dCx0aGlzLnNldChlKX1mdW5jdGlvbiAkKHQpe2lmKGIodCxhZSkpcmV0dXJuIGFlO3ZhciBlPWIodCxoZSksaT1iKHQsZGUpO3JldHVybiBlJiZpP2FlOmV8fGk/ZT9oZTpkZTpiKHQscmUpP3JlOnNlfWZ1bmN0aW9uIFEodCl7dGhpcy5vcHRpb25zPWZ0KHt9LHRoaXMuZGVmYXVsdHMsdHx8e30pLHRoaXMuaWQ9RCgpLHRoaXMubWFuYWdlcj1udWxsLHRoaXMub3B0aW9ucy5lbmFibGU9bSh0aGlzLm9wdGlvbnMuZW5hYmxlLCEwKSx0aGlzLnN0YXRlPXVlLHRoaXMuc2ltdWx0YW5lb3VzPXt9LHRoaXMucmVxdWlyZUZhaWw9W119XG4gICAgZnVuY3Rpb24gdHQodCl7cmV0dXJuIHQmdmU/XCJjYW5jZWxcIjp0JmZlP1wiZW5kXCI6dCZwZT9cIm1vdmVcIjp0JmNlP1wic3RhcnRcIjpcIlwifWZ1bmN0aW9uIGV0KHQpe3JldHVybiB0PT1MdD9cImRvd25cIjp0PT16dD9cInVwXCI6dD09UnQ/XCJsZWZ0XCI6dD09QXQ/XCJyaWdodFwiOlwiXCJ9ZnVuY3Rpb24gaXQodCxlKXt2YXIgaT1lLm1hbmFnZXI7cmV0dXJuIGk/aS5nZXQodCk6dH1mdW5jdGlvbiBvdCgpe1EuYXBwbHkodGhpcyxhcmd1bWVudHMpfWZ1bmN0aW9uIG50KCl7b3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMucFg9bnVsbCx0aGlzLnBZPW51bGx9ZnVuY3Rpb24gc3QoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gcnQoKXtRLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLl90
21167aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGx9ZnVuY3Rpb24gYXQoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gaHQoKXtvdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZHQoKXtRLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0aGlzLnBUaW1lPSExLHRoaXMucENlbnRlcj0hMSx0aGlzLl90aW1lcj1udWxsLHRoaXMuX2lucHV0PW51bGwsdGhpcy5jb3VudD0wfWZ1bmN0aW9uIGx0KHQsZSl7cmV0dXJuIGU9ZXx8e30sZS5yZWNvZ25pemVycz1tKGUucmVjb2duaXplcnMsbHQuZGVmYXVsdHMucHJlc2V0KSxuZXcgdXQodCxlKX1mdW5jdGlvbiB1dCh0LGUpe3RoaXMub3B0aW9ucz1mdCh7fSxsdC5kZWZhdWx0cyxlfHx7fSksdGhpcy5vcHRpb25zLmlucHV0VGFyZ2V0PXRoaXMub3B0aW9ucy5pbnB1dFRhcmdldHx8dCx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLnJlY29nbml6ZXJzPVtdLHRoaXMub2xkQ3NzUHJvcHM9e30sdGhpcy5lbGVtZW50PXQsdGhpcy5pbnB1dD1PKHRoaXMpLHRoaXMudG91Y2hBY3Rpb249bmV3IEoodGhpcyx0aGlzLm9wdGlvbnMudG91Y2hBY3Rpb24pLGN0KHRoaXMsITApLGwodGhpcy5vcHRpb25zLnJlY29nbml6ZXJzLGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYWRkKG5ldyB0WzBdKHRbMV0pKTt0WzJdJiZlLnJlY29nbml6ZVdpdGgodFsyXSksdFszXSYmZS5yZXF1aXJlRmFpbHVyZSh0WzNdKX0sdGhpcyl9ZnVuY3Rpb24gY3QodCxlKXt2YXIgaT10LmVsZW1lbnQ7aWYoaS5zdHlsZSl7dmFyIG87bCh0Lm9wdGlvbnMuY3NzUHJvcHMsZnVuY3Rpb24obixzKXtvPVMoaS5zdHlsZSxzKSxlPyh0Lm9sZENzc1Byb3BzW29dPWkuc3R5bGVbb10saS5zdHlsZVtvXT1uKTppLnN0eWxlW29dPXQub2xkQ3NzUHJvcHNbb118fFwiXCJ9KSxlfHwodC5vbGRDc3NQcm9wcz17fSl9fWZ1bmN0aW9uIHB0KHQsZSl7dmFyIGk9cy5jcmVhdGVFdmVudChcIkV2ZW50XCIpO2kuaW5pdEV2ZW50KHQsITAsITApLGkuZ2VzdHVyZT1lLGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQoaSl9dmFyIGZ0LG10PVtcIlwiLFwid2Via2l0XCIsXCJNb3pcIixcIk1TXCIsXCJtc1wiLFwib1wiXSx2dD1zLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksZ3Q9XCJmdW5jdGlvblwiLHl0PU1hdGgucm91bmQsYnQ9TWF0aC5hYnMsX3Q9RGF0ZS5ub3c7ZnQ9XCJmdW5jdGlvblwiIT10eXBlb2YgT2JqZWN0LmFzc2lnbj9mdW5jdGlvbih0KXtpZih0PT09YXx8bnVsbD09PXQpdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjb252ZXJ0IHVuZGVmaW5lZCBvciBudWxsIHRvIG9iamVjdFwiKTtmb3IodmFyIGU9T2JqZWN0KHQpLGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKXt2YXIgbz1hcmd1bWVudHNbaV07aWYobyE9PWEmJm51bGwhPT1vKWZvcih2YXIgbiBpbiBvKW8uaGFzT3duUHJvcGVydHkobikmJihlW25dPW9bbl0pfXJldHVybiBlfTpPYmplY3QuYXNzaWduO3ZhciB3dD11KGZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89T2JqZWN0LmtleXMoZSksbj0wO248by5sZW5ndGg7KSghaXx8aSYmdFtvW25dXT09PWEpJiYodFtvW25dXT1lW29bbl1dKSxuKys7cmV0dXJuIHR9LFwiZXh0ZW5kXCIsXCJVc2UgYGFzc2lnbmAuXCIpLHh0PXUoZnVuY3Rpb24odCxlKXtyZXR1cm4gd3QodCxlLCEwKX0sXCJtZXJnZVwiLFwiVXNlIGBhc3NpZ25gLlwiKSxrdD0xLFN0PS9tb2JpbGV8dGFibGV0fGlwKGFkfGhvbmV8b2QpfGFuZHJvaWQvaSxEdD1cIm9udG91Y2hzdGFydFwiaW4gbixNdD1TKG4sXCJQb2ludGVyRXZlbnRcIikhPT1hLEN0PUR0JiZTdC50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpLE90PTI1LEV0PTEsVHQ9MixQdD00LEl0PTgsTnQ9MSxSdD0yLEF0PTQsenQ9OCxMdD0xNixGdD1SdHxBdCxCdD16dHxMdCxqdD1GdHxCdCxIdD1bXCJ4XCIsXCJ5XCJdLFd0PVtcImNsaWVudFhcIixcImNsaWVudFlcIl07Qy5wcm90b3R5cGU9e2hhbmRsZXI6ZnVuY3Rpb24oKXt9LGluaXQ6ZnVuY3Rpb24oKXt0aGlzLmV2RWwmJnYodGhpcy5lbGVtZW50LHRoaXMuZXZFbCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZUYXJnZXQmJnYodGhpcy50YXJnZXQsdGhpcy5ldlRhcmdldCx0aGlzLmRvbUhhbmRsZXIpLHRoaXMuZXZXaW4mJnYoTSh0aGlzLmVsZW1lbnQpLHRoaXMuZXZXaW4sdGhpcy5kb21IYW5kbGVyKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuZXZFbCYmZyh0aGlzLmVsZW1lbnQsdGhpcy5ldkVsLHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldlRhcmdldCYmZyh0aGlzLnRhcmdldCx0aGlzLmV2VGFyZ2V0LHRoaXMuZG9tSGFuZGxlciksdGhpcy5ldldpbiYmZyhNKHRoaXMuZWxlbWVudCksdGhpcy5ldldpbix0aGlzLmRvbUhhbmRsZXIpfX07dmFyIFl0PXttb3VzZWRvd246RXQsbW91c2Vtb3ZlOlR0LG1vdXNldXA6UHR9LEd0PVwibW91c2Vkb3duXCIsVnQ9XCJtb3VzZW1vdmUgbW91c2V1cFwiO2MoSCxDLHtoYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPVl0W3QudHlwZV07ZSZFdCYmMD09PXQuYnV0dG9uJiYodGhpcy5wcmVzc2VkPSEwKSxlJlR0JiYxIT09dC53aGljaCYmKGU9UHQpLHRoaXMucHJlc3NlZCYmKGUmUHQmJih0aGlzLnByZXNzZWQ9ITEpLHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLGUse3BvaW50ZXJzOlt0XSxjaGFuZ2VkUG9pbnRlcnM6W3RdLHBvaW50ZXJUeXBlOlwibW91c2VcIixzcmNFdmVudDp0fSkpfX0pO3ZhciBVdD17cG9pbnRlcmRvd246RXQscG9pbnRlcm1vdmU6VHQscG9pbnRlcnVwOlB0LHBvaW50ZXJjYW5jZWw6SXQscG9pbnRlcm91dDpJdH0scXQ9ezI6XCJ0b3VjaFwiLDM6XCJwZW5cIiw0OlwibW91c2VcIiw1Olwia2luZWN0XCJ9LFh0PVwicG9pbnRlcmRvd25cIixadD1cInBvaW50ZXJtb3ZlIHBvaW50ZXJ1cCBwb2ludGVyY2FuY2VsXCI7bi5NU1BvaW50ZXJFdmVudCYmIW4uUG9pbnRlckV2ZW50JiYoWHQ9XCJNU1BvaW50ZXJEb3duXCIsWnQ9XCJNU1BvaW50ZXJNb3ZlIE1TUG9pbnRlclVwIE1TUG9pbnRlckNhbmNlbFwiKSxjKFcsQyx7aGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnN0b3JlLGk9ITEsbz10LnR5cGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKFwibXNcIixcIlwiKSxuPVV0W29dLHM9cXRbdC5wb2ludGVyVHlwZV18fHQucG9pbnRlclR5cGUscj1cInRvdWNoXCI9PXMsYT13KGUsdC5wb2ludGVySWQsXCJwb2ludGVySWRcIik7biZFdCYmKDA9PT10LmJ1dHRvbnx8cik/YTwwJiYoZS5wdXNoKHQpLGE9ZS5sZW5ndGgtMSk6biYoUHR8SXQpJiYoaT0hMCksYTwwfHwoZVthXT10LHRoaXMuY2FsbGJhY2sodGhpcy5tYW5hZ2VyLG4se3BvaW50ZXJzOmUsY2hhbmdlZFBvaW50ZXJzOlt0XSxwb2ludGVyVHlwZTpzLHNyY0V2ZW50OnR9KSxpJiZlLnNwbGljZShhLDEpKX19KTt2YXIgS3Q9e3RvdWNoc3RhcnQ6RXQsdG91Y2htb3ZlOlR0LHRvdWNoZW5kOlB0LHRvdWNoY2FuY2VsOkl0fSxKdD1cInRvdWNoc3RhcnRcIiwkdD1cInRvdWNoc3RhcnQgdG91Y2htb3ZlIHRvdWNoZW5kIHRvdWNoY2FuY2VsXCI7YyhZLEMse2hhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9S3RbdC50eXBlXTtpZihlPT09RXQmJih0aGlzLnN0YXJ0ZWQ9ITApLH
21167RoaXMuc3RhcnRlZCl7dmFyIGk9Ry5jYWxsKHRoaXMsdCxlKTtlJihQdHxJdCkmJmlbMF0ubGVuZ3RoLWlbMV0ubGVuZ3RoPT0wJiYodGhpcy5zdGFydGVkPSExKSx0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczppWzBdLGNoYW5nZWRQb2ludGVyczppWzFdLHBvaW50ZXJUeXBlOlwidG91Y2hcIixzcmNFdmVudDp0fSl9fX0pO3ZhciBRdD17dG91Y2hzdGFydDpFdCx0b3VjaG1vdmU6VHQsdG91Y2hlbmQ6UHQsdG91Y2hjYW5jZWw6SXR9LHRlPVwidG91Y2hzdGFydCB0b3VjaG1vdmUgdG91Y2hlbmQgdG91Y2hjYW5jZWxcIjtjKFYsQyx7aGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT1RdFt0LnR5cGVdLGk9VS5jYWxsKHRoaXMsdCxlKTtpJiZ0aGlzLmNhbGxiYWNrKHRoaXMubWFuYWdlcixlLHtwb2ludGVyczppWzBdLGNoYW5nZWRQb2ludGVyczppWzFdLHBvaW50ZXJUeXBlOlwidG91Y2hcIixzcmNFdmVudDp0fSl9fSk7dmFyIGVlPTI1MDAsaWU9MjU7YyhxLEMse2hhbmRsZXI6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPVwidG91Y2hcIj09aS5wb2ludGVyVHlwZSxuPVwibW91c2VcIj09aS5wb2ludGVyVHlwZTtpZighKG4mJmkuc291cmNlQ2FwYWJpbGl0aWVzJiZpLnNvdXJjZUNhcGFiaWxpdGllcy5maXJlc1RvdWNoRXZlbnRzKSl7aWYobylYLmNhbGwodGhpcyxlLGkpO2Vsc2UgaWYobiYmSy5jYWxsKHRoaXMsaSkpcmV0dXJuO3RoaXMuY2FsbGJhY2sodCxlLGkpfX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMudG91Y2guZGVzdHJveSgpLHRoaXMubW91c2UuZGVzdHJveSgpfX0pO3ZhciBvZT1TKHZ0LnN0eWxlLFwidG91Y2hBY3Rpb25cIiksbmU9b2UhPT1hLHNlPVwiYXV0b1wiLHJlPVwibWFuaXB1bGF0aW9uXCIsYWU9XCJub25lXCIsaGU9XCJwYW4teFwiLGRlPVwicGFuLXlcIixsZT1mdW5jdGlvbigpe2lmKCFuZSlyZXR1cm4hMTt2YXIgdD17fSxlPW4uQ1NTJiZuLkNTUy5zdXBwb3J0cztyZXR1cm5bXCJhdXRvXCIsXCJtYW5pcHVsYXRpb25cIixcInBhbi15XCIsXCJwYW4teFwiLFwicGFuLXggcGFuLXlcIixcIm5vbmVcIl0uZm9yRWFjaChmdW5jdGlvbihpKXt0W2ldPSFlfHxuLkNTUy5zdXBwb3J0cyhcInRvdWNoLWFjdGlvblwiLGkpfSksdH0oKTtKLnByb3RvdHlwZT17c2V0OmZ1bmN0aW9uKHQpe1wiY29tcHV0ZVwiPT10JiYodD10aGlzLmNvbXB1dGUoKSksbmUmJnRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlJiZsZVt0XSYmKHRoaXMubWFuYWdlci5lbGVtZW50LnN0eWxlW29lXT10KSx0aGlzLmFjdGlvbnM9dC50b0xvd2VyQ2FzZSgpLnRyaW0oKX0sdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5zZXQodGhpcy5tYW5hZ2VyLm9wdGlvbnMudG91Y2hBY3Rpb24pfSxjb21wdXRlOmZ1bmN0aW9uKCl7dmFyIHQ9W107cmV0dXJuIGwodGhpcy5tYW5hZ2VyLnJlY29nbml6ZXJzLGZ1bmN0aW9uKGUpe2YoZS5vcHRpb25zLmVuYWJsZSxbZV0pJiYodD10LmNvbmNhdChlLmdldFRvdWNoQWN0aW9uKCkpKX0pLCQodC5qb2luKFwiIFwiKSl9LHByZXZlbnREZWZhdWx0czpmdW5jdGlvbih0KXt2YXIgZT10LnNyY0V2ZW50LGk9dC5vZmZzZXREaXJlY3Rpb247aWYodGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkKXJldHVybiB2b2lkIGUucHJldmVudERlZmF1bHQoKTt2YXIgbz10aGlzLmFjdGlvbnMsbj1iKG8sYWUpJiYhbGVbYWVdLHM9YihvLGRlKSYmIWxlW2RlXSxyPWIobyxoZSkmJiFsZVtoZV07aWYobil7dmFyIGE9MT09PXQucG9pbnRlcnMubGVuZ3RoLGg9dC5kaXN0YW5jZTwyLGQ9dC5kZWx0YVRpbWU8MjUwO2lmKGEmJmgmJmQpcmV0dXJufXJldHVybiByJiZzP3ZvaWQgMDpufHxzJiZpJkZ0fHxyJiZpJkJ0P3RoaXMucHJldmVudFNyYyhlKTp2b2lkIDB9LHByZXZlbnRTcmM6ZnVuY3Rpb24odCl7dGhpcy5tYW5hZ2VyLnNlc3Npb24ucHJldmVudGVkPSEwLHQucHJldmVudERlZmF1bHQoKX19O3ZhciB1ZT0xLGNlPTIscGU9NCxmZT04LG1lPWZlLHZlPTE2O1EucHJvdG90eXBlPXtkZWZhdWx0czp7fSxzZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIGZ0KHRoaXMub3B0aW9ucyx0KSx0aGlzLm1hbmFnZXImJnRoaXMubWFuYWdlci50b3VjaEFjdGlvbi51cGRhdGUoKSx0aGlzfSxyZWNvZ25pemVXaXRoOmZ1bmN0aW9uKHQpe2lmKGQodCxcInJlY29nbml6ZVdpdGhcIix0aGlzKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLnNpbXVsdGFuZW91cztyZXR1cm4gdD1pdCh0LHRoaXMpLGVbdC5pZF18fChlW3QuaWRdPXQsdC5yZWNvZ25pemVXaXRoKHRoaXMpKSx0aGlzfSxkcm9wUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4gZCh0LFwiZHJvcFJlY29nbml6ZVdpdGhcIix0aGlzKT90aGlzOih0PWl0KHQsdGhpcyksZGVsZXRlIHRoaXMuc2ltdWx0YW5lb3VzW3QuaWRdLHRoaXMpfSxyZXF1aXJlRmFpbHVyZTpmdW5jdGlvbih0KXtpZihkKHQsXCJyZXF1aXJlRmFpbHVyZVwiLHRoaXMpKXJldHVybiB0aGlzO3ZhciBlPXRoaXMucmVxdWlyZUZhaWw7cmV0dXJuIHQ9aXQodCx0aGlzKSwtMT09PXcoZSx0KSYmKGUucHVzaCh0KSx0LnJlcXVpcmVGYWlsdXJlKHRoaXMpKSx0aGlzfSxkcm9wUmVxdWlyZUZhaWx1cmU6ZnVuY3Rpb24odCl7aWYoZCh0LFwiZHJvcFJlcXVpcmVGYWlsdXJlXCIsdGhpcykpcmV0dXJuIHRoaXM7dD1pdCh0LHRoaXMpO3ZhciBlPXcodGhpcy5yZXF1aXJlRmFpbCx0KTtyZXR1cm4gZT4tMSYmdGhpcy5yZXF1aXJlRmFpbC5zcGxpY2UoZSwxKSx0aGlzfSxoYXNSZXF1aXJlRmFpbHVyZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg+MH0sY2FuUmVjb2duaXplV2l0aDpmdW5jdGlvbih0KXtyZXR1cm4hIXRoaXMuc2ltdWx0YW5lb3VzW3QuaWRdfSxlbWl0OmZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7aS5tYW5hZ2VyLmVtaXQoZSx0KX12YXIgaT10aGlzLG89dGhpcy5zdGF0ZTtvPGZlJiZlKGkub3B0aW9ucy5ldmVudCt0dChvKSksZShpLm9wdGlvbnMuZXZlbnQpLHQuYWRkaXRpb25hbEV2ZW50JiZlKHQuYWRkaXRpb25hbEV2ZW50KSxvPj1mZSYmZShpLm9wdGlvbnMuZXZlbnQrdHQobykpfSx0cnlFbWl0OmZ1bmN0aW9uKHQpe2lmKHRoaXMuY2FuRW1pdCgpKXJldHVybi
21167B0aGlzLmVtaXQodCk7dGhpcy5zdGF0ZT0zMn0sY2FuRW1pdDpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5yZXF1aXJlRmFpbC5sZW5ndGg7KXtpZighKHRoaXMucmVxdWlyZUZhaWxbdF0uc3RhdGUmKDMyfHVlKSkpcmV0dXJuITE7dCsrfXJldHVybiEwfSxyZWNvZ25pemU6ZnVuY3Rpb24odCl7dmFyIGU9ZnQoe30sdCk7aWYoIWYodGhpcy5vcHRpb25zLmVuYWJsZSxbdGhpcyxlXSkpcmV0dXJuIHRoaXMucmVzZXQoKSx2b2lkKHRoaXMuc3RhdGU9MzIpO3RoaXMuc3RhdGUmKG1lfHZlfDMyKSYmKHRoaXMuc3RhdGU9dWUpLHRoaXMuc3RhdGU9dGhpcy5wcm9jZXNzKGUpLHRoaXMuc3RhdGUmKGNlfHBlfGZlfHZlKSYmdGhpcy50cnlFbWl0KGUpfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe30sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXt9LHJlc2V0OmZ1bmN0aW9uKCl7fX0sYyhvdCxRLHtkZWZhdWx0czp7cG9pbnRlcnM6MX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLnBvaW50ZXJzO3JldHVybiAwPT09ZXx8dC5wb2ludGVycy5sZW5ndGg9PT1lfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc3RhdGUsaT10LmV2ZW50VHlwZSxvPWUmKGNlfHBlKSxuPXRoaXMuYXR0clRlc3QodCk7cmV0dXJuIG8mJihpJkl0fHwhbik/ZXx2ZTpvfHxuP2kmUHQ/ZXxmZTplJmNlP2V8cGU6Y2U6MzJ9fSksYyhudCxvdCx7ZGVmYXVsdHM6e2V2ZW50OlwicGFuXCIsdGhyZXNob2xkOjEwLHBvaW50ZXJzOjEsZGlyZWN0aW9uOmp0fSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3B0aW9ucy5kaXJlY3Rpb24sZT1bXTtyZXR1cm4gdCZGdCYmZS5wdXNoKGRlKSx0JkJ0JiZlLnB1c2goaGUpLGV9LGRpcmVjdGlvblRlc3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5vcHRpb25zLGk9ITAsbz10LmRpc3RhbmNlLG49dC5kaXJlY3Rpb24scz10LmRlbHRhWCxyPXQuZGVsdGFZO3JldHVybiBuJmUuZGlyZWN0aW9ufHwoZS5kaXJlY3Rpb24mRnQ/KG49MD09PXM/TnQ6czwwP1J0OkF0LGk9cyE9dGhpcy5wWCxvPU1hdGguYWJzKHQuZGVsdGFYKSk6KG49MD09PXI/TnQ6cjwwP3p0Okx0LGk9ciE9dGhpcy5wWSxvPU1hdGguYWJzKHQuZGVsdGFZKSkpLHQuZGlyZWN0aW9uPW4saSYmbz5lLnRocmVzaG9sZCYmbiZlLmRpcmVjdGlvbn0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG90LnByb3RvdHlwZS5hdHRyVGVzdC5jYWxsKHRoaXMsdCkmJih0aGlzLnN0YXRlJmNlfHwhKHRoaXMuc3RhdGUmY2UpJiZ0aGlzLmRpcmVjdGlvblRlc3QodCkpfSxlbWl0OmZ1bmN0aW9uKHQpe3RoaXMucFg9dC5kZWx0YVgsdGhpcy5wWT10LmRlbHRhWTt2YXIgZT1ldCh0LmRpcmVjdGlvbik7ZSYmKHQuYWRkaXRpb25hbEV2ZW50PXRoaXMub3B0aW9ucy5ldmVudCtlKSx0aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyx0KX19KSxjKHN0LG90LHtkZWZhdWx0czp7ZXZlbnQ6XCJwaW5jaFwiLHRocmVzaG9sZDowLHBvaW50ZXJzOjJ9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW2FlXX0sYXR0clRlc3Q6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyx0KSYmKE1hdGguYWJzKHQuc2NhbGUtMSk+dGhpcy5vcHRpb25zLnRocmVzaG9sZHx8dGhpcy5zdGF0ZSZjZSl9LGVtaXQ6ZnVuY3Rpb24odCl7aWYoMSE9PXQuc2NhbGUpe3ZhciBlPXQuc2NhbGU8MT9cImluXCI6XCJvdXRcIjt0LmFkZGl0aW9uYWxFdmVudD10aGlzLm9wdGlvbnMuZXZlbnQrZX10aGlzLl9zdXBlci5lbWl0LmNhbGwodGhpcyx0KX19KSxjKHJ0LFEse2RlZmF1bHRzOntldmVudDpcInByZXNzXCIscG9pbnRlcnM6MSx0aW1lOjI1MSx0aHJlc2hvbGQ6OX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm5bc2VdfSxwcm9jZXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMub3B0aW9ucyxpPXQucG9pbnRlcnMubGVuZ3RoPT09ZS5wb2ludGVycyxvPXQuZGlzdGFuY2U8ZS50aHJlc2hvbGQsbj10LmRlbHRhVGltZT5lLnRpbWU7aWYodGhpcy5faW5wdXQ9dCwhb3x8IWl8fHQuZXZlbnRUeXBlJihQdHxJdCkmJiFuKXRoaXMucmVzZXQoKTtlbHNlIGlmKHQuZXZlbnRUeXBlJkV0KXRoaXMucmVzZXQoKSx0aGlzLl90
21167aW1lcj1oKGZ1bmN0aW9uKCl7dGhpcy5zdGF0ZT1tZSx0aGlzLnRyeUVtaXQoKX0sZS50aW1lLHRoaXMpO2Vsc2UgaWYodC5ldmVudFR5cGUmUHQpcmV0dXJuIG1lO3JldHVybiAzMn0scmVzZXQ6ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQodGhpcy5fdGltZXIpfSxlbWl0OmZ1bmN0aW9uKHQpe3RoaXMuc3RhdGU9PT1tZSYmKHQmJnQuZXZlbnRUeXBlJlB0P3RoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtcInVwXCIsdCk6KHRoaXMuX2lucHV0LnRpbWVTdGFtcD1fdCgpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0aGlzLl9pbnB1dCkpKX19KSxjKGF0LG90LHtkZWZhdWx0czp7ZXZlbnQ6XCJyb3RhdGVcIix0aHJlc2hvbGQ6MCxwb2ludGVyczoyfSxnZXRUb3VjaEFjdGlvbjpmdW5jdGlvbigpe3JldHVyblthZV19LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zdXBlci5hdHRyVGVzdC5jYWxsKHRoaXMsdCkmJihNYXRoLmFicyh0LnJvdGF0aW9uKT50aGlzLm9wdGlvbnMudGhyZXNob2xkfHx0aGlzLnN0YXRlJmNlKX19KSxjKGh0LG90LHtkZWZhdWx0czp7ZXZlbnQ6XCJzd2lwZVwiLHRocmVzaG9sZDoxMCx2ZWxvY2l0eTouMyxkaXJlY3Rpb246RnR8QnQscG9pbnRlcnM6MX0sZ2V0VG91Y2hBY3Rpb246ZnVuY3Rpb24oKXtyZXR1cm4gbnQucHJvdG90eXBlLmdldFRvdWNoQWN0aW9uLmNhbGwodGhpcyl9LGF0dHJUZXN0OmZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcy5vcHRpb25zLmRpcmVjdGlvbjtyZXR1cm4gaSYoRnR8QnQpP2U9dC5vdmVyYWxsVmVsb2NpdHk6aSZGdD9lPXQub3ZlcmFsbFZlbG9jaXR5WDppJkJ0JiYoZT10Lm92ZXJhbGxWZWxvY2l0eVkpLHRoaXMuX3N1cGVyLmF0dHJUZXN0LmNhbGwodGhpcyx0KSYmaSZ0Lm9mZnNldERpcmVjdGlvbiYmdC5kaXN0YW5jZT50aGlzLm9wdGlvbnMudGhyZXNob2xkJiZ0Lm1heFBvaW50ZXJzPT10aGlzLm9wdGlvbnMucG9pbnRlcnMmJmJ0KGUpPnRoaXMub3B0aW9ucy52ZWxvY2l0eSYmdC5ldmVudFR5cGUmUHR9LGVtaXQ6ZnVuY3Rpb24odCl7dmFyIGU9ZXQodC5vZmZzZXREaXJlY3Rpb24pO2UmJnRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCtlLHQpLHRoaXMubWFuYWdlci5lbWl0KHRoaXMub3B0aW9ucy5ldmVudCx0KX19KSxjKGR0LFEse2RlZmF1bHRzOntldmVudDpcInRhcFwiLHBvaW50ZXJzOjEsdGFwczoxLGludGVydmFsOjMwMCx0aW1lOjI1MCx0aHJlc2hvbGQ6OSxwb3NUaHJlc2hvbGQ6MTB9LGdldFRvdWNoQWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuW3JlXX0scHJvY2VzczpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm9wdGlvbnMsaT10LnBvaW50ZXJzLmxlbmd0aD09PWUucG9pbnRlcnMsbz10LmRpc3RhbmNlPGUudGhyZXNob2xkLG49dC5kZWx0YVRpbWU8ZS50aW1lO2lmKHRoaXMucmVzZXQoKSx0LmV2ZW50VHlwZSZFdCYmMD09PXRoaXMuY291bnQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTtpZihvJiZuJiZpKXtp
21167Zih0LmV2ZW50VHlwZSE9UHQpcmV0dXJuIHRoaXMuZmFpbFRpbWVvdXQoKTt2YXIgcz0hdGhpcy5wVGltZXx8dC50aW1lU3RhbXAtdGhpcy5wVGltZTxlLmludGVydmFsLHI9IXRoaXMucENlbnRlcnx8TCh0aGlzLnBDZW50ZXIsdC5jZW50ZXIpPGUucG9zVGhyZXNob2xkO3RoaXMucFRpbWU9dC50aW1lU3RhbXAsdGhpcy5wQ2VudGVyPXQuY2VudGVyLHImJnM/dGhpcy5jb3VudCs9MTp0aGlzLmNvdW50PTEsdGhpcy5faW5wdXQ9dDtpZigwPT09dGhpcy5jb3VudCVlLnRhcHMpcmV0dXJuIHRoaXMuaGFzUmVxdWlyZUZhaWx1cmVzKCk/KHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPW1lLHRoaXMudHJ5RW1pdCgpfSxlLmludGVydmFsLHRoaXMpLGNlKTptZX1yZXR1cm4gMzJ9LGZhaWxUaW1lb3V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpbWVyPWgoZnVuY3Rpb24oKXt0aGlzLnN0YXRlPTMyfSx0aGlzLm9wdGlvbnMuaW50ZXJ2YWwsdGhpcyksMzJ9LHJlc2V0OmZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKX0sZW1pdDpmdW5jdGlvbigpe3RoaXMuc3RhdGU9PW1lJiYodGhpcy5faW5wdXQudGFwQ291bnQ9dGhpcy5jb3VudCx0aGlzLm1hbmFnZXIuZW1pdCh0aGlzLm9wdGlvbnMuZXZlbnQsdGhpcy5faW5wdXQpKX19KSxsdC5WRVJTSU9OPVwiMi4wLjdcIixsdC5kZWZhdWx0cz17ZG9tRXZlbnRzOiExLHRvdWNoQWN0aW9uOlwiY29tcHV0ZVwiLGVuYWJsZTohMCxpbnB1dFRhcmdldDpudWxsLGlucHV0Q2xhc3M6bnVsbCxwcmVzZXQ6W1thdCx7ZW5hYmxlOiExfV0sW3N0LHtlbmFibGU6ITF9LFtcInJvdGF0ZVwiXV0sW2h0LHtkaXJlY3Rpb246RnR9XSxbbnQse2RpcmVjdGlvbjpGdH0sW1wic3dpcGVcIl1dLFtkdF0sW2R0LHtldmVudDpcImRvdWJsZXRhcFwiLHRhcHM6Mn0sW1widGFwXCJdXSxbcnRdXSxjc3NQcm9wczp7dXNlclNlbGVjdDpcIm5vbmVcIix0b3VjaFNlbGVjdDpcIm5vbmVcIix0b3VjaENhbGxvdXQ6XCJub25lXCIsY29udGVudFpvb21pbmc6XCJub25lXCIsdXNlckRyYWc6XCJub25lXCIsdGFwSGlnaGxpZ2h0Q29sb3I6XCJyZ2JhKDAsMCwwLDApXCJ9fTt1dC5wcm90b3R5cGU9e3NldDpmdW5jdGlvbih0KXtyZXR1cm4gZnQodGhpcy5vcHRpb25zLHQpLHQudG91Y2hBY3Rpb24mJnRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdC5pbnB1dFRhcmdldCYmKHRoaXMuaW5wdXQuZGVzdHJveSgpLHRoaXMuaW5wdXQudGFyZ2V0PXQuaW5wdXRUYXJnZXQsdGhpcy5pbnB1dC5pbml0KCkpLHRoaXN9LHN0b3A6ZnVuY3Rpb24odCl7dGhpcy5zZXNzaW9uLnN0b3BwZWQ9dD8yOjF9LHJlY29nbml6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLnNlc3Npb247aWYoIWUuc3RvcHBlZCl7dGhpcy50b3VjaEFjdGlvbi5wcmV2ZW50RGVmYXVsdHModCk7dmFyIGksbz10aGlzLnJlY29nbml6ZXJzLG49ZS5jdXJSZWNvZ25pemVyOyghbnx8biYmbi5zdGF0ZSZtZSkmJihuPWUuY3VyUmVjb2duaXplcj1udWxsKTtmb3IodmFyIHM9MDtzPG8ubGVuZ3RoOylpPW9bc10sMj09PWUuc3RvcHBlZHx8biYmaSE9biYmIWkuY2FuUmVjb2duaXplV2l0aChuKT9pLnJlc2V0KCk6aS5yZWNvZ25pemUodCksIW4mJmkuc3RhdGUmKGNlfHBlfGZlKSYmKG49ZS5jdXJSZWNvZ25pemVyPWkpLHMrK319LGdldDpmdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgUSlyZXR1cm4gdDtmb3IodmFyIGU9dGhpcy5yZWNvZ25pemVycyxpPTA7aTxlLmxlbmd0aDtpKyspaWYoZVtpXS5vcHRpb25zLmV2ZW50PT10KXJldHVybiBlW2ldO3JldHVybiBudWxsfSxhZGQ6ZnVuY3Rpb24odCl7aWYoZCh0LFwiYWRkXCIsdGhpcykpcmV0dXJuIHRoaXM7dmFyIGU9dGhpcy5nZXQodC5vcHRpb25zLmV2ZW50KTtyZXR1cm4gZSYmdGhpcy5yZW1vdmUoZSksdGhpcy5yZWNvZ25pemVycy5wdXNoKHQpLHQubWFuYWdlcj10aGlzLHRoaXMudG91Y2hBY3Rpb24udXBkYXRlKCksdH0scmVtb3ZlOmZ1bmN0aW9uKHQpe2lmKGQodCxcInJlbW92ZVwiLHRoaXMpKXJldHVybiB0aGlzO2lmKHQ9dGhpcy5nZXQodCkpe3ZhciBlPXRoaXMucmVjb2duaXplcnMsaT13KGUsdCk7LTEhPT1pJiYoZS5zcGxpY2UoaSwxKSx0aGlzLnRvdWNoQWN0aW9uLnVwZGF0ZSgpKX1yZXR1cm4gdGhpc30sb246ZnVuY3Rpb24odCxlKXtpZih0IT09YSYmZSE9PWEpe3ZhciBpPXRoaXMuaGFuZGxlcnM7cmV0dXJuIGwoXyh0KSxmdW5jdGlvbih0KXtpW3RdPWlbdF18fFtdLGlbdF0ucHVzaChlKX0pLHRoaXN9fSxvZmY6ZnVuY3Rpb24odCxlKXtpZih0IT09YSl7dmFyIGk9dGhpcy5oYW5kbGVycztyZXR1cm4gbChfKHQpLGZ1bmN0aW9uKHQpe2U/aVt0XSYmaVt0XS5zcGxpY2UodyhpW3RdLGUpLDEpOmRlbGV0ZSBpW3RdfSksdGhpc319LGVtaXQ6ZnVuY3Rpb24odCxlKXt0aGlzLm9wdGlvbnMuZG9tRXZlbnRzJiZwdCh0LGUpO3ZhciBpPXRoaXMuaGFuZGxlcnNbdF0mJnRoaXMuaGFuZGxlcnNbdF0uc2xpY2UoKTtpZihpJiZpLmxlbmd0aCl7ZS50eXBlPXQsZS5wcmV2ZW50RGVmYXVsdD1mdW5jdGlvbigpe2Uuc3JjRXZlbnQucHJldmVudERlZmF1bHQoKX07Zm9yKHZhciBvPTA7bzxpLmxlbmd0aDspaVtvXShlKSxvKyt9fSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5lbGVtZW50JiZjdCh0aGlzLCExKSx0aGlzLmhhbmRsZXJzPXt9LHRoaXMuc2Vzc2lvbj17fSx0aGlzLmlucHV0LmRlc3Ryb3koKSx0aGlzLmVsZW1lbnQ9bnVsbH19LGZ0KGx0LHtJTlBVVF9TVEFSVDpFdCxJTlBVVF9NT1ZFOlR0LElOUFVUX0VORDpQdCxJTlBVVF9DQU5DRUw6SXQsU1RBVEVfUE9TU0lCTEU6dWUsU1RBVEVfQkVHQU46Y2UsU1RBVEVfQ0hBTkdFRDpwZSxTVEFURV9FTkRFRDpmZSxTVEFURV9SRUNPR05JWkVEOm1lLFNUQVRFX0NBTkNFTExFRDp2ZSxTVEFURV9GQUlMRUQ6MzIsRElSRUNUSU9OX05PTkU6TnQsRElSRUNUSU9OX0xFRlQ6UnQsRElSRUNUSU9OX1JJR0hUOkF0LERJUkVDVElPTl9VUDp6dCxESVJFQ1RJT05fRE9XTjpMdCxESVJFQ1RJT05fSE9SSVpPTlRBTDpGdCxESVJFQ1RJT05fVkVSVElDQUw6QnQsRElSRUNUSU9OX0FMTDpqdCxNYW5hZ2VyOnV0LElucHV0OkMsVG91Y2hBY3Rpb246SixUb3VjaElucHV0OlYsTW91c2VJbnB1dDpILFBvaW50ZXJFdmVudElucHV0OlcsVG91Y2hNb3VzZUlucHV0OnEsU2luZ2xlVG9
211671Y2hJbnB1dDpZLFJlY29nbml6ZXI6USxBdHRyUmVjb2duaXplcjpvdCxUYXA6ZHQsUGFuOm50LFN3aXBlOmh0LFBpbmNoOnN0LFJvdGF0ZTphdCxQcmVzczpydCxvbjp2LG9mZjpnLGVhY2g6bCxtZXJnZTp4dCxleHRlbmQ6d3QsYXNzaWduOmZ0LGluaGVyaXQ6YyxiaW5kRm46cCxwcmVmaXhlZDpTfSksKHZvaWQgMCE9PW4/bjpcInVuZGVmaW5lZFwiIT10eXBlb2Ygc2VsZj9zZWxmOnt9KS5IYW1tZXI9bHQsKG89ZnVuY3Rpb24oKXtyZXR1cm4gbHR9LmNhbGwoZSxpLGUsdCkpIT09YSYmKHQuZXhwb3J0cz1vKX0od2luZG93LGRvY3VtZW50KX0sZnVuY3Rpb24odCxlLGkpe2UudXRpbD1pKDIpLGUuRE9NdXRpbD1pKDE0KSxlLkRhdGFTZXQ9aSgxMSksZS5EYXRhVmlldz1pKDEyKSxlLlF1ZXVlPWkoNDMpLGUuVGltZWxpbmU9aSgxNzgpLGUuR3JhcGgyZD1pKDE4MCksZS50aW1lbGluZT17Q29yZTppKDY1KSxEYXRlVXRpbDppKDM2KSxSYW5nZTppKDY0KSxzdGFjazppKDEwMCksVGltZVN0ZXA6aSg2NiksY29tcG9uZW50czp7aXRlbXM6e0l0ZW06aSgzOCksQmFja2dyb3VuZEl0ZW06aSgxMDMpLEJveEl0ZW06aSgxMDEpLFBvaW50SXRlbTppKDEwMiksUmFuZ2VJdGVtOmkoNzApfSxCYWNrZ3JvdW5kR3JvdXA6aSg2OSksQ29tcG9uZW50OmkoMTYpLEN1cnJlbnRUaW1lOmkoNjcpLEN1c3RvbVRpbWU6aSg0NiksRGF0YUF4aXM6aSgxMDcpLERhdGFTY2FsZTppKDEwOCksR3JhcGhHcm91cDppKDEwOSksR3JvdXA6aSg2OCksSXRlbVNldDppKDk5KSxMZWdlbmQ6aSgxMTIpLExpbmVHcmFwaDppKDEwNiksVGltZUF4aXM6aSg0NSl9fSxlLm1vbWVudD1pKDkpLGUuSGFtbWVyPWkoMTApLGUua2V5Y2hhcm09aSgzNSl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG4pe2lmKCEodGhpcyBpbnN0YW5jZW9mIG8pKXRocm93IG5ldyBTeW50YXhFcnJvcihcIkNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIG5ldyBvcGVyYXRvclwiKTtpZighKEFycmF5LmlzQXJyYXkoaSl8fGkgaW5zdGFuY2VvZiBkfHxpIGluc3RhbmNlb2YgbCkmJmkgaW5zdGFuY2VvZiBPYmplY3Qpe3ZhciBzPW47bj1pLGk9c31uJiZuLnRocm90dGxlUmVkcmF3JiZjb25zb2xlLndhcm4oJ1RpbWVsaW5lIG9wdGlvbiBcInRocm90dGxlUmVkcmF3XCIgaXMgREVQUklDQVRFRCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBuZXh0IE1BSk9SIHJlbGVhc2UuJyk7dmFyIHI9dGhpcztpZih0aGlzLmRlZmF1bHRPcHRpb25zPXtzdGFydDpudWxsLGVuZDpudWxsLGF1dG9SZXNpemU6ITAsb3JpZW50YXRpb246e2F4aXM6XCJib3R0b21cIixpdGVtOlwiYm90dG9tXCJ9LG1vbWVudDphLHdpZHRoOm51bGwsaGVpZ2h0Om51bGwsbWF4SGVpZ2h0Om51bGwsbWluSGVpZ2h0Om51bGx9LHRoaXMub3B0aW9ucz1oLmRlZXBFeHRlbmQoe30sdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5fY3JlYXRlKHQpLCFufHxuJiZ2b2lkIDA9PT1uLnJ0bCl7dGhpcy5kb20ucm9vdC5zdHlsZS52aXNpYmlsaXR5PVwiaGlkZGVuXCI7Zm9yKHZhciBjLG09dGhpcy5kb20ucm9vdDshYyYmbTspYz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShtLG51bGwpLmRpcmVjdGlvbixtPW0ucGFyZW50RWxlbWVudDt0aGlzLm9wdGlvbnMucnRsPWMmJlwicnRsXCI9PWMudG9Mb3dlckNhc2UoKX1lbHNlIHRoaXMub3B0aW9ucy5ydGw9bi5ydGw7dGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlPW4mJm4ucm9sbGluZ01vZGUsdGhpcy5vcHRpb25zLm9uSW5pdGlhbERyYXdDb21wbGV0ZT1uJiZuLm9uSW5pdGlhbERyYXdDb21wbGV0ZSx0aGlzLmNvbXBvbmVudHM9W10sdGhpcy5ib2R5PXtkb206dGhpcy5kb20sZG9tUHJvcHM6dGhpcy5wcm9wcyxlbWl0dGVyOntvbjp0aGlzLm9uLmJpbmQodGhpcyksb2ZmOnRoaXMub2ZmLmJpbmQodGhpcyksZW1pdDp0aGlzLmVtaXQuYmluZCh0aGlzKX0saGlkZGVuRGF0ZXM6W10sdXRpbDp7Z2V0U2NhbGU6ZnVuY3Rpb24oKXtyZXR1cm4gci50aW1lQXhpcy5zdGVwLnNjYWxlfSxnZXRTdGVwOmZ1bmN0aW9uKCl7cmV0dXJuIHIudGltZUF4aXMuc3RlcC5zdGVwfSx0b1NjcmVlbjpyLl90b1NjcmVlbi5iaW5kKHIpLHRvR2xvYmFsU2NyZWVuOnIuX3RvR2xvYmFsU2NyZWVuLmJpbmQociksdG9UaW1lOnIuX3RvVGltZS5iaW5kKHIpLHRvR2xvYmFsVGltZTpyLl90b0dsb2JhbFRpbWUuYmluZChyKX19LHRoaXMucmFuZ2U9bmV3IHUodGhpcy5ib2R5LHRoaXMub3B0aW9ucyksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5yYW5nZSksdGhpcy5ib2R5LnJhbmdlPXRoaXMucmFuZ2UsdGhpcy50aW1lQXhpcz1uZXcgcCh0aGlzLmJvZHksdGhpcy5vcHRpb25zKSx0aGlzLnRpbWVBeGlzMj1udWxsLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMudGltZUF4aXMpLHRoaXMuY3VycmVudFRpbWU9bmV3IGYodGhpcy5ib2R5LHRoaXMub3B0aW9ucyksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5jdXJyZW50VGltZSksdGhpcy5pdGVtU2V0PW5ldyB2KHRoaXMuYm9keSx0aGlzLm9wdGlvbnMpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMuaXRlbVNldCksdGhpcy5pdGVtc0RhdGE9bnVsbCx0aGlzLmdyb3Vwc0RhdGE9bnVsbCx0aGlzLmRvbS5yb290Lm9uY2xpY2s9ZnVuY3Rpb24odCl7ci5lbWl0KFwiY2xpY2tcIixyLmdldEV2ZW50UHJvcGVydGllcyh0KSl9LHRoaXMuZG9tLnJvb3Qub25kYmxjbGljaz1mdW5jdGlvbih0KXtyLmVtaXQoXCJkb3VibGVDbGlja1wiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbmNvbnRleHRtZW51PWZ1bmN0aW9uKHQpe3IuZW1pdChcImNvbnRleHRtZW51XCIsci5nZXRFdmVudFByb3BlcnRpZXModCkpfSx0aGlzLmRvbS5yb290Lm9ubW91c2VvdmVyPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlT3ZlclwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sd2luZG93LlBvaW50ZXJFdmVudD8odGhpcy5kb20ucm9vdC5vbnBvaW50ZXJkb3duPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlRG93blwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJtb3ZlPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlTW92ZVwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbnBvaW50ZXJ1cD1mdW5jdGlvbih0KXtyLmVtaXQoXCJtb3VzZVVwXCIsci5nZXRFdmVudFByb3BlcnRpZXModCkpfSk6KHRoaXMuZG9tLnJvb3Qub25tb3VzZW1vdmU9ZnVuY3Rpb24odCl7ci5lbWl0KFwibW91c2VNb3ZlXCIsci5nZXRFdmVudFByb3BlcnRpZXModCkpfSx0aGlzLmRvbS5yb290Lm9ubW91c2Vkb3duPWZ1bmN0aW9uKHQpe3IuZW1pdChcIm1vdXNlRG93blwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sdGhpcy5kb20ucm9vdC5vbm1vdXNldXA9ZnVuY3Rpb24odCl7ci5lbWl0KFwibW91c2VVcFwiLHIuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMuaW5pdGlhbEZpdERvbmU9ITEsdGhpcy5vbihcImNoYW5nZWRcIixmdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuaXRlbXNEYXRhJiYhdGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlKXtpZighci5pbml0aWFsRml0RG9uZSlpZihyLmluaXRpYWxGaXREb25lPSEwLHZvaWQgMCE9ci5vcHRpb25zLnN0YXJ0fHx2b2lkIDAhPXIub3B0aW9ucy5lbmQpe2lmKHZvaWQgMD09ci5vcHRpb25zLnN0YXJ0fHx2b2lkIDA9PXIub3B0aW9ucy5lbmQpdmFyIHQ9ci5nZXRJdGVtUmFuZ2UoKTt2YXIgZT12b2lkIDAhPXIub3B0aW9ucy5zdGFydD9yLm9wdGlvbnMuc3RhcnQ6dC5taW4saT12b2lkIDAhPXIub3B0aW9ucy5lbmQ/ci5vcHRpb25zLmVuZDp0Lm1heDtyLnNldFdpbmRvdyhlLGkse2FuaW1hdGlvbjohMX0pfWVsc2Ug
21167ci5maXQoe2FuaW1hdGlvbjohMX0pOyFyLmluaXRpYWxEcmF3RG9uZSYmci5pbml0aWFsUmFuZ2VDaGFuZ2VEb25lJiYoci5pbml0aWFsRHJhd0RvbmU9ITAsci5kb20ucm9vdC5zdHlsZS52aXNpYmlsaXR5PVwidmlzaWJsZVwiLHIub3B0aW9ucy5vbkluaXRpYWxEcmF3Q29tcGxldGUmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gci5vcHRpb25zLm9uSW5pdGlhbERyYXdDb21wbGV0ZSgpfSwwKSl9fSksbiYmdGhpcy5zZXRPcHRpb25zKG4pLGkmJnRoaXMuc2V0R3JvdXBzKGkpLGUmJnRoaXMuc2V0SXRlbXMoZSksdGhpcy5fcmVkcmF3KCl9ZnVuY3Rpb24gbih0KXtyZXR1cm4gaC5jb252ZXJ0KHQuZGF0YS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpfWZ1bmN0aW9uIHModCl7dmFyIGU9dm9pZCAwIT10LmRhdGEuZW5kP3QuZGF0YS5lbmQ6dC5kYXRhLnN0YXJ0O3JldHVybiBoLmNvbnZlcnQoZSxcIkRhdGVcIikudmFsdWVPZigpfWZ1bmN0aW9uIHIodCxlKXt2YXIgaT10LnByb3BzLmxlZnRDb250YWluZXIuaGVpZ2h0LG89dC5wcm9wcy5sZWZ0LmhlaWdodCxuPWUucGFyZW50LHM9bi50b3Ascj0hMCxhPXQudGltZUF4aXMub3B0aW9ucy5vcmllbnRhdGlvbi5heGlzLGg9ZnVuY3Rpb24oKXtyZXR1cm5cImJvdHRvbVwiPT1hP24uaGVpZ2h0LWUudG9wLWUuaGVpZ2h0OmUudG9wfSxkPS0xKnQuX2dldFNjcm9sbFRvcCgpLGw9cytoKCksdT1lLmhlaWdodDtyZXR1cm4gbDxkP3MraTw9cytoKCkrdSYmKHMrPWgoKS10Lml0ZW1TZXQub3B0aW9ucy5tYXJnaW4uaXRlbS52ZXJ0aWNhbCk6bCt1PmQraT9zKz1oKCkrdS1pK3QuaXRlbVNldC5vcHRpb25zLm1hcmdpbi5pdGVtLnZlcnRpY2FsOnI9ITEscz1NYXRoLm1pbihzLG8taSkse3Nob3VsZFNjcm9sbDpyLHNjcm9sbE9mZnNldDpzLGl0ZW1Ub3A6bH19dmFyIGE9aSg5KSxoPWkoMiksZD1pKDExKSxsPWkoMTIpLHU9aSg2NCksYz1pKDY1KSxwPWkoNDUpLGY9aSg2NyksbT1pKDQ2KSx2PWkoOTkpLGc9aSgxNSkucHJpbnRTdHlsZSx5PWkoMTA1KS5hbGxPcHRpb25zLGI9aSgxMDUpLmNvbmZpZ3VyZU9wdGlvbnMsXz1pKDcxKS5kZWZhdWx0LHc9aSgxNSkuZGVmYXVsdDtvLnByb3RvdHlwZT1uZXcgYyxvLnByb3RvdHlwZS5fY3JlYXRlQ29uZmlndXJhdG9yPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBfKHRoaXMsdGhpcy5kb20uY29udGFpbmVyLGIpfSxvLnByb3RvdHlwZS5yZWRyYXc9ZnVuY3Rpb24oKXt0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5tYXJrRGlydHkoe3JlZnJlc2hJdGVtczohMH0pLHRoaXMuX3JlZHJhdygpfSxvLnByb3RvdHlwZS5zZXRPcHRpb25zPWZ1bmN0aW9uKHQpe2lmKCEwPT09dy52YWxpZGF0ZSh0LHkpJiZjb25zb2xlLmxvZyhcIiVjRXJyb3JzIGhhdmUgYmVlbiBmb3VuZCBpbiB0aGUgc3VwcGxpZWQgb3B0aW9ucyBvYmplY3QuXCIsZyksYy5wcm90b3R5cGUuc2V0T3B0aW9ucy5jYWxsKHRoaXMsdCksXCJ0eXBlXCJpbiB0JiZ0LnR5cGUhPT10aGlzLm9wdGlvbnMudHlwZSl7dGhpcy5vcHRpb25zLnR5cGU9dC50eXBlO3ZhciBlPXRoaXMuaXRlbXNEYXRhO2lmKGUpe3ZhciBpPXRoaXMuZ2V0U2VsZWN0aW9uKCk7dGhpcy5zZXRJdGVtcyhudWxsKSx0aGlzLnNldEl0ZW1zKGUpLHRoaXMuc2V0U2VsZWN0aW9uKGkpfX19LG8ucHJvdG90eXBlLnNldEl0ZW1zPWZ1bmN0aW9uKHQpe3ZhciBlO2U9dD90IGluc3RhbmNlb2YgZHx8dCBpbnN0YW5jZW9mIGw/dDpuZXcgZCh0LHt0eXBlOntzdGFydDpcIkRhdGVcIixlbmQ6XCJEYXRlXCJ9fSk6bnVsbCx0aGlzLml0ZW1zRGF0YT1lLHRoaXMuaXRlbVNldCYmdGhpcy5pdGVtU2V0LnNldEl0ZW1zKGUpfSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU7aWYodCl7dmFyIGk9ZnVuY3Rpb24odCl7cmV0dXJuITEhPT10LnZpc2libGV9O2U9dCBpbnN0YW5jZW9mIGR8fHQgaW5zdGFuY2VvZiBsP25ldyBsKHQse2ZpbHRlcjppfSk6bmV3IGQodC5maWx0ZXIoaSkpfWVsc2UgZT1udWxsO3RoaXMuZ3JvdXBzRGF0YT1lLHRoaXMuaXRlbVNldC5zZXRHcm91cHMoZSl9LG8ucHJvdG90eXBlLnNldERhdGE9ZnVuY3Rpb24odCl7dCYmdC5ncm91cHMmJnRoaXMuc2V0R3JvdXBzKHQuZ3JvdXBzKSx0JiZ0Lml0ZW1zJiZ0aGlzLnNldEl0ZW1zKHQuaXRlbXMpfSxvLnByb3RvdHlwZS5zZXRTZWxlY3Rpb249ZnVuY3Rpb24odCxlKXt0aGlzLml0ZW1TZXQmJnRoaXMuaXRlbVNldC5zZXRTZWxlY3Rpb24odCksZSYmZS5mb2N1cyYmdGhpcy5mb2N1cyh0LGUpfSxvLnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pdGVtU2V0JiZ0aGlzLml0ZW1TZXQuZ2V0U2VsZWN0aW9uKCl8fFtdfSxvLnByb3RvdHlwZS5mb2N1cz1mdW5jdGlvbih0LGUpe2lmKHRoaXMuaXRlbXNEYXRhJiZ2b2lkIDAhPXQpe3ZhciBpPUFycmF5LmlzQXJyYXkodCk/dDpbdF0sbz10aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCkuZ2V0KGkse3R5cGU6e3N0YXJ0OlwiRGF0ZVwiLGVuZDpcIkRhdGVcIn19KSxuPW51bGwscz1udWxsO2lmKG8uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgZT10LnN0YXJ0LnZhbHVlT2YoKSxpPVwiZW5kXCJpbiB0P3QuZW5kLnZhbHVlT2YoKTp0LnN0YXJ0LnZhbHVlT2YoKTsobnVsbD09PW58fGU8bikmJihuPWUpLChudWxsPT09c3x8aT5zKSYmKHM9aSl9KSxudWxsIT09biYmbnVsbCE9PXMpe3ZhciBhPXRoaXMsaD10aGlzLml0ZW1TZXQuaXRlbXNbaVswXV0sZD0tMSp0aGlzLl9nZXRTY3JvbGxUb3AoKSxsPW51bGwsdT1mdW5jdGlvbih0LGUsaSl7dmFyIG89cihhLGgpO2lmKGx8fChsPW8pLGwuaXRlbVRvcCE9by5pdGVtVG9wfHxsLnNob3VsZFNjcm9sbCl7bC5pdGVtVG9wIT1vLml0ZW1Ub3AmJm8uc2hvdWxkU2Nyb2xsJiYobD1vLGQ9LTEqYS5fZ2V0U2Nyb2xsVG9wKCkpO3ZhciBuPWQscz1sLnNjcm9sbE9mZnNldCx1PWk/czpuKyhzLW4pKnQ7YS5fc2V0U2Nyb2xsVG9wKC11KSxlfHxhLl9yZWRyYXcoKX19LGM9ZnVuY3Rpb24oKXt2YXIgdD1yKGEsaCk7dC5zaG91bGRTY3JvbGwmJnQuaXRlbVRvcCE9bC5pdGVtVG9wJiYoYS5fc2V0U2Nyb2xsVG9wKC10LnNjcm9sbE9mZnNldCksYS5fcmVkcmF3KCkpfSxwPWZ1bmN0aW9uKCl7YygpLHNldFRpbWVvdXQoYywxMDApfSxmPShuK3MpLzIsbT1NYXRoLm1heCh0aGlzLnJhbmdlLmVuZC10aGlzLnJhbmdlLnN0YXJ0LDEuMSoocy1uKSksdj0hZXx8dm9pZCAwPT09ZS5hbmltYXRpb258fGUuYW5pbWF0aW9uO3Z8fChsPXtzaG91bGRTY3JvbGw6ITEsc2Nyb2xsT2Zmc2V0Oi0xLGl0ZW1Ub3A6LTF9KSx0aGlzLnJhbmdlLnNldFJhbmdlKGYtbS8yLGYrbS8yLHthbmltYXRpb246dn0scCx1KX19fSxvLnByb3RvdHlwZS5maXQ9ZnVuY3Rpb24odCxlKXt2YXIgaSxvPSF0fHx2b2lkIDA9PT10LmFuaW1hdGlvbnx8dC5hbmltYXRpb24sbj10aGlzLml0ZW1zRGF0YSYmdGhpcy5pdGVtc0RhdGEuZ2V0RGF0YVNldCgpOzE9PT1uLmxlbmd0aCYmdm9pZCAwPT09bi5nZXQoKVswXS5lbmQ/KGk9dGhpcy5nZXREYXRhUmFuZ2UoKSx0aGlzLm1vdmVUbyhpLm1pbi52YWx1ZU9mKCkse2FuaW1hdGlvbjpvfSxlKSk6KGk9dGhpcy5nZXRJdGVtUmFuZ2UoKSx0aGlzLnJhbmdlLnNldFJhbmdlKGkubWluLGkubWF4LHthbmltYXRpb246b30sZSkpfSxvLnByb3RvdHlwZS5nZXRJdGVtUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldERhdGFSYW5nZSgpLGU9bnVsbCE9PXQubWluP3QubWluLnZhbHVlT2YoKTpudWxsLGk9bnVsbCE9PXQubWF4P3QubWF4LnZhbHVlT2YoKTpudWxsLG89bnVsbCxyPW51bGw7aWYobnVsbCE9ZSYmbnVsbCE9aSl7dmFyIGE9aS1lO2E8PTAmJihhPTEwKTt2YXIgZD1hL3RoaXMucHJvcHMuY2VudGVyLndpZHR
21167oLGw9e30sdT0wO2guZm9yRWFjaCh0aGlzLml0ZW1TZXQuaXRlbXMsZnVuY3Rpb24odCxlKXtpZih0Lmdyb3VwU2hvd2luZyl7bFtlXT10LnJlZHJhdyghMCksdT1sW2VdLmxlbmd0aH19KTtpZih1PjApZm9yKHZhciBjPTA7Yzx1O2MrKyloLmZvckVhY2gobCxmdW5jdGlvbih0KXt0W2NdKCl9KTtpZihoLmZvckVhY2godGhpcy5pdGVtU2V0Lml0ZW1zLGZ1bmN0aW9uKHQpe3ZhciBhLGgsbD1uKHQpLHU9cyh0KTt0aGlzLm9wdGlvbnMucnRsPyhhPWwtKHQuZ2V0V2lkdGhSaWdodCgpKzEwKSpkLGg9dSsodC5nZXRXaWR0aExlZnQoKSsxMCkqZCk6KGE9bC0odC5nZXRXaWR0aExlZnQoKSsxMCkqZCxoPXUrKHQuZ2V0V2lkdGhSaWdodCgpKzEwKSpkKSxhPGUmJihlPWEsbz10KSxoPmkmJihpPWgscj10KX0uYmluZCh0aGlzKSksbyYmcil7dmFyIHA9by5nZXRXaWR0aExlZnQoKSsxMCxmPXIuZ2V0V2lkdGhSaWdodCgpKzEwLG09dGhpcy5wcm9wcy5jZW50ZXIud2lkdGgtcC1mO20+MCYmKHRoaXMub3B0aW9ucy5ydGw/KGU9bihvKS1mKmEvbSxpPXMocikrcCphL20pOihlPW4obyktcCphL20saT1zKHIpK2YqYS9tKSl9fXJldHVybnttaW46bnVsbCE9ZT9uZXcgRGF0ZShlKTpudWxsLG1heDpudWxsIT1pP25ldyBEYXRlKGkpOm51bGx9fSxvLnByb3RvdHlwZS5nZXREYXRhUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD1udWxsLGU9bnVsbCxpPXRoaXMuaXRlbXNEYXRhJiZ0aGlzLml0ZW1zRGF0YS5nZXREYXRhU2V0KCk7cmV0dXJuIGkmJmkuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgbz1oLmNvbnZlcnQoaS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpLG49aC5jb252ZXJ0KHZvaWQgMCE9aS5lbmQ/aS5lbmQ6aS5zdGFydCxcIkRhdGVcIikudmFsdWVPZigpOyhudWxsPT09dHx8bzx0KSYmKHQ9byksKG51bGw9PT1lfHxuPmUpJiYoZT1uKX0pLHttaW46bnVsbCE9dD9uZXcgRGF0ZSh0KTpudWxsLG1heDpudWxsIT1lP25ldyBEYXRlKGUpOm51bGx9fSxvLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7dmFyIGUsaT10LmNlbnRlcj90LmNlbnRlci54OnQuY2xpZW50WCxvPXQuY2VudGVyP3QuY2VudGVyLnk6dC5jbGllbnRZO2U9dGhpcy5vcHRpb25zLnJ0bD9oLmdldEFic29sdXRlUmlnaHQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKS1pOmktaC5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKTt2YXIgbj1vLWguZ2V0QWJzb2x1dGVUb3AodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKSxzPXRoaXMuaXRlbVNldC5pdGVtRnJvbVRhcmdldCh0KSxyPXRoaXMuaXRlbVNldC5ncm91cEZyb21UYXJnZXQodCksYT1tLmN1c3RvbVRpbWVGcm9tVGFyZ2V0KHQpLGQ9dGhpcy5pdGVtU2V0Lm9wdGlvbnMuc25hcHx8bnVsbCxsPXRoaXMuYm9keS51dGlsLmdldFNjYWxlKCksdT10aGlzLmJvZHkudXRpbC5nZXRTdGVwKCksYz10aGlzLl90b1RpbWUoZSkscD1kP2QoYyxsLHUpOmMsZj1oLmdldFRhcmdldCh0KSx2PW51bGw7cmV0dXJuIG51bGwhPXM/dj1cIml0ZW1cIjpudWxsIT1hP3Y9XCJjdXN0b20tdGltZVwiOmguaGFzUGFyZW50KGYsdGhpcy50aW1lQXhpcy5kb20uZm9yZWdyb3VuZCk/dj1cImF4aXNcIjp0aGlzLnRpbWVBeGlzMiYmaC5oYXNQYXJlbnQoZix0aGlzLnRpbWVBeGlzMi5kb20uZm9yZWdyb3VuZCk/dj1cImF4aXNcIjpoLmhhc1BhcmVudChmLHRoaXMuaXRlbVNldC5kb20ubGFiZWxTZXQpP3Y9XCJncm91cC1sYWJlbFwiOmguaGFzUGFyZW50KGYsdGhpcy5jdXJyZW50VGltZS5iYXIpP3Y9XCJjdXJyZW50LXRpbWVcIjpoLmhhc1BhcmVudChmLHRoaXMuZG9tLmNlbnRlcikmJih2PVwiYmFja2dyb3VuZFwiKSx7ZXZlbnQ6dCxpdGVtOnM/cy5pZDpudWxsLGdyb3VwOnI/ci5ncm91cElkOm51bGwsd2hhdDp2LHBhZ2VYOnQuc3JjRXZlbnQ/dC5zcmNFdmVudC5wYWdlWDp0LnBhZ2VYLHBhZ2VZOnQuc3JjRXZlbnQ/dC5zcmNFdmVudC5wYWdlWTp0LnBhZ2VZLHg6ZSx5Om4sdGltZTpjLHNuYXBwZWRUaW1lOnB9fSxvLnByb3RvdHlwZS50b2dnbGVSb2xsaW5nTW9kZT1mdW5jdGlvbigpe3RoaXMucmFuZ2Uucm9sbGluZz90aGlzLnJhbmdlLnN0b3BSb2xsaW5nKCk6KHZvaWQgMD09dGhpcy5vcHRpb25zLnJvbGxpbmdNb2RlJiZ0aGlzLnNldE9wdGlvbnModGhpcy5vcHRpb25zKSx0aGlzLnJhbmdlLnN0YXJ0Um9sbGluZygpKX0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDE5KSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSgxMCksdT1pKDM3KSxjPWkoMikscD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06MTsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5waXhlbFJhdGlvPWUsdGhpcy5nZW5lcmF0ZWQ9ITEsdGhpcy5jZW50ZXJDb29yZGluYXRlcz17eDoxNDQuNSx5OjE0NC41fSx0aGlzLnI9Mjg5Ki40OSx0aGlzLmNvbG9yPXtyOjI1NSxnOjI1NSxiOjI1NSxhOjF9LHRoaXMuaHVlQ2lyY2xlPXZvaWQgMCx0aGlzLmluaXRpYWxDb2xvcj17cjoyNTUsZzoyNTUsYjoyNTUsYToxfSx0aGlzLnByZXZpb3VzQ29sb3I9dm9pZCAwLHRoaXMuYXBwbGllZD0hMSx0aGlzLnVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7fSx0aGlzLmNsb3NlQ2FsbGJhY2s9ZnVuY3Rpb24oKXt9LHRoaXMuX2NyZWF0ZSgpfXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleTpcImluc2VydFRvXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5oYW1tZXImJih0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5oYW1tZXI9dm9pZCAwKSx0aGlzLmNvbnRhaW5lcj10LHRoaXMuY29udGFpbmVyLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUpLHRoaXMuX2JpbmRIYW1tZXIoKSx0aGlzLl9zZXRTaXplKCl9fSx7a2V5Olwic2V0VXBkYXRlQ2FsbGJhY2tcIix2YWx1ZTpmdW5jdGlvbih0KXtpZihcImZ1bmN0aW9uXCIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcihcIkZ1bmN0aW9uIGF0dGVtcHRlZCB0byBzZXQgYXMgY29sb3JQaWNrZXIgdXBkYXRlIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLlwiKTt0aGlzLnVwZGF0ZUNhbGxiYWNrPXR9fSx7a2V5Olwic2V0Q2xvc2VDYWxsYmFja1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKFwiZnVuY3Rpb25cIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKFwiRnVuY3Rpb24gYXR0ZW1wdGVkIHRvIHNldCBhcyBjb2xvclBpY2tlciBjbG9zaW5nIGNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uLlwiKTt0aGlzLmNsb3NlQ2FsbGJhY2s9dH19LHtrZXk6XCJfaXNDb2xvclN0cmluZ1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXtibGFjazpcIiMwMDAwMDBcIixuYXZ5OlwiIzAwMDA4MFwiLGRhcmtibHVlOlwiIzAwMDA4QlwiLG1lZGl1bWJsdWU6XCIjMDAwMENEXCIsYmx1ZTpcIiMwMDAwRkZcIixkYXJrZ3JlZW46XCIjMDA2NDAwXCIsZ3JlZW46XCIjMDA4MDAwXCIsdGVhbDpcIiMwMDgwODBcIixkYXJrY3lhbjpcIiMwMDhCOEJcIixkZWVwc2t5Ymx1ZTpcIiMwMEJGRkZcIixkYXJrdHVycXVvaXNlOlwiIzAwQ0VEMVwiLG1lZGl1bXNwcmluZ2dyZWVuOlwiIzAwRkE5QVwiLGxpbWU6XCIjMDBGRjAwXCIsc3ByaW5nZ3JlZW46XCIjMDBGRjdGXCIsYXF1YTpcIiMwMEZGRkZcIixjeWFuOlwiIzAwRkZGRlwiLG1pZG5pZ2h0Ymx1ZTpcIiMxOTE5NzBcIixkb2RnZXJibHVlOlwiIzFFOTBGRlwiLGxpZ2h0c2VhZ3JlZW46XCIjMjBCMkFBXCIsZm9yZXN0Z3JlZW46XCIjMjI4QjIyXCIsc2VhZ3JlZW46XCIjMkU4QjU3XCIsZGFya3NsYXRlZ3JheTpcIiMyRjRGNEZcIixsaW1lZ3JlZW46XCIjMzJDRDMyXCIsbWVkaXVtc2VhZ3JlZW46XCIjM0NCMzcxXCIsdHVycXVvaXNlOlwiIzQwRTBEMFwiLHJveWFsYmx1ZTpcIiM0MTY5RTFcIixzdGVlbGJsdWU6XCIjNDY4MkI0XCIsZGFya3NsYXRlYmx1ZTpcIiM0ODNEOEJcIixtZWRpdW10dXJxdW9pc2U6XCIjNDhEMUNDXCIsaW5kaWdvOlwiIzRCMDA4MlwiLGRhcmtvbGl2ZWdyZWVuOlwiIzU1NkIyRlwiLGNhZGV0Ymx1ZTpcIiM1RjlFQTBcIixjb3JuZmxvd2VyYmx1ZTpcIiM2NDk1RURcIixtZWRpdW1hcXVhbWFyaW5lOlwiIzY2Q0RBQVwiLGRpbWdyYXk6XCIjNjk2OTY5XCIsc2xhdGVibHVlOlwiIzZBNUFDRFwiLG9saXZlZHJhYjpcIiM2QjhFMjNcIixzbGF0ZWdyYXk6XCIjNzA4MDkwXCIsbGlnaHRzbGF0ZWdyYXk6XCIjNzc4ODk5XCIsbWVkaXVtc2xhdGVibHVlOlwiIzdCNj
21167hFRVwiLGxhd25ncmVlbjpcIiM3Q0ZDMDBcIixjaGFydHJldXNlOlwiIzdGRkYwMFwiLGFxdWFtYXJpbmU6XCIjN0ZGRkQ0XCIsbWFyb29uOlwiIzgwMDAwMFwiLHB1cnBsZTpcIiM4MDAwODBcIixvbGl2ZTpcIiM4MDgwMDBcIixncmF5OlwiIzgwODA4MFwiLHNreWJsdWU6XCIjODdDRUVCXCIsbGlnaHRza3libHVlOlwiIzg3Q0VGQVwiLGJsdWV2aW9sZXQ6XCIjOEEyQkUyXCIsZGFya3JlZDpcIiM4QjAwMDBcIixkYXJrbWFnZW50YTpcIiM4QjAwOEJcIixzYWRkbGVicm93bjpcIiM4QjQ1MTNcIixkYXJrc2VhZ3JlZW46XCIjOEZCQzhGXCIsbGlnaHRncmVlbjpcIiM5MEVFOTBcIixtZWRpdW1wdXJwbGU6XCIjOTM3MEQ4XCIsZGFya3Zpb2xldDpcIiM5NDAwRDNcIixwYWxlZ3JlZW46XCIjOThGQjk4XCIsZGFya29yY2hpZDpcIiM5OTMyQ0NcIix5ZWxsb3dncmVlbjpcIiM5QUNEMzJcIixzaWVubmE6XCIjQTA1MjJEXCIsYnJvd246XCIjQTUyQTJBXCIsZGFya2dyYXk6XCIjQTlBOUE5XCIsbGlnaHRibHVlOlwiI0FERDhFNlwiLGdyZWVueWVsbG93OlwiI0FERkYyRlwiLHBhbGV0dXJxdW9pc2U6XCIjQUZFRUVFXCIsbGlnaHRzdGVlbGJsdWU6XCIjQjBDNERFXCIscG93ZGVyYmx1ZTpcIiNCMEUwRTZcIixmaXJlYnJpY2s6XCIjQjIyMjIyXCIsZGFya2dvbGRlbnJvZDpcIiNCODg2MEJcIixtZWRpdW1vcmNoaWQ6XCIjQkE1NUQzXCIscm9zeWJyb3duOlwiI0JDOEY4RlwiLGRhcmtraGFraTpcIiNCREI3NkJcIixzaWx2ZXI6XCIjQzBDMEMwXCIsbWVkaXVtdmlvbGV0cmVkOlwiI0M3MTU4NVwiLGluZGlhbnJlZDpcIiNDRDVDNUNcIixwZXJ1OlwiI0NEODUzRlwiLGNob2NvbGF0ZTpcIiNEMjY5MUVcIix0YW46XCIjRDJCNDhDXCIsbGlnaHRncmV5OlwiI0QzRDNEM1wiLHBhbGV2aW9sZXRyZWQ6XCIjRDg3MDkzXCIsdGhpc3RsZTpcIiNEOEJGRDhcIixvcmNoaWQ6XCIjREE3MEQ2XCIsZ29sZGVucm9kOlwiI0RBQTUyMFwiLGNyaW1zb246XCIjREMxNDNDXCIsZ2FpbnNib3JvOlwiI0RDRENEQ1wiLHBsdW06XCIjRERBMEREXCIsYnVybHl3b29kOlwiI0RFQjg4N1wiLGxpZ2h0Y3lhbjpcIiNFMEZGRkZcIixsYXZlbmRlcjpcIiNFNkU2RkFcIixkYXJrc2FsbW9uOlwiI0U5OTY3QVwiLHZpb2xldDpcIiNFRTgyRUVcIixwYWxlZ29sZGVucm9kOlwiI0VFRThBQVwiLGxpZ2h0Y29yYWw6XCIjRjA4MDgwXCIsa2hha2k6XCIjRjBFNjhDXCIsYWxpY2VibHVlOlwiI0YwRjhGRlwiLGhvbmV5ZGV3OlwiI0YwRkZGMFwiLGF6dXJlOlwiI0YwRkZGRlwiLHNhbmR5YnJvd246XCIjRjRBNDYwXCIsd2hlYXQ6XCIjRjVERUIzXCIsYmVpZ2U6XCIjRjVGNURDXCIsd2hpdGVzbW9rZTpcIiNGNUY1RjVcIixtaW50Y3JlYW06XCIjRjVGRkZBXCIsZ2hvc3R3aGl0ZTpcIiNGOEY4RkZcIixzYWxtb246XCIjRkE4MDcyXCIsYW50aXF1ZXdoaXRlOlwiI0ZBRUJEN1wiLGxpbmVuOlwiI0ZBRjBFNlwiLGxpZ2h0Z29sZGVucm9keWVsbG93OlwiI0ZBRkFEMlwiLG9sZGxhY2U6XCIjRkRGNUU2XCIscmVkOlwiI0ZGMDAwMFwiLGZ1Y2hzaWE6XCIjRkYwMEZGXCIsbWFnZW50YTpcIiNGRjAwRkZcIixkZWVwcGluazpcIiNGRjE0OTNcIixvcmFuZ2VyZWQ6XCIjRkY0NTAwXCIsdG9tYXRvOlwiI0ZGNjM0N1wiLGhvdHBpbms6XCIjRkY2OUI0XCIsY29yYWw6XCIjRkY3RjUwXCIsZGFya29yYW5nZTpcIiNGRjhDMDBcIixsaWdodHNhbG1vbjpcIiNGRkEwN0FcIixvcmFuZ2U6XCIjRkZBNTAwXCIsbGlnaHRwaW5rOlwiI0ZGQjZDMVwiLHBpbms6XCIjRkZDMENCXCIsZ29sZDpcIiNGRkQ3MDBcIixwZWFjaHB1ZmY6XCIjRkZEQUI5XCIsbmF2YWpvd2hpdGU6XCIjRkZERUFEXCIsbW9jY2FzaW46XCIjRkZFNEI1XCIsYmlzcXVlOlwiI0ZGRTRDNFwiLG1pc3R5cm9zZTpcIiNGRkU0RTFcIixibGFuY2hlZGFsbW9uZDpcIiNGRkVCQ0RcIixwYXBheWF3aGlwOlwiI0ZGRUZENVwiLGxhdmVuZGVyYmx1c2g6XCIjRkZGMEY1XCIsc2Vhc2hlbGw6XCIjRkZGNUVFXCIsY29ybnNpbGs6XCIjRkZGOERDXCIsbGVtb25jaGlmZm9uOlwiI0ZGRkFDRFwiLGZsb3JhbHdoaXRlOlwiI0ZGRkFGMFwiLHNub3c6XCIjRkZGQUZBXCIseWVsbG93OlwiI0ZGRkYwMFwiLGxpZ2h0eWVsbG93OlwiI0ZGRkZFMFwiLGl2b3J5OlwiI0ZGRkZGMFwiLHdoaXRlOlwiI0ZGRkZGRlwifTtpZihcInN0cmluZ1wiPT10eXBlb2YgdClyZXR1cm4gZVt0XX19LHtrZXk6XCJzZXRDb2xvclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoXCJub25lXCIhPT10KXt2YXIgaT12b2lkIDAsbz10aGlzLl9pc0NvbG9yU3RyaW5nKHQpO2lmKHZvaWQgMCE9PW8mJih0PW8pLCEwPT09Yy5pc1N0cmluZyh0KSl7aWYoITA9PT1jLmlzVmFsaWRSR0IodCkpe3ZhciBuPXQuc3Vic3RyKDQpLnN1YnN0cigwLHQubGVuZ3RoLTUpLnNwbGl0KFwiLFwiKTtpPXtyOm5bMF0sZzpuWzFdLGI6blsyXSxhOjF9fWVsc2UgaWYoITA9PT1jLmlzVmFsaWRSR0JBKHQpKXt2YXIgcj10LnN1YnN0cig1KS5zdWJzdHIoMCx0Lmxlbmd0aC02KS5zcGxpdChcIixcIik7aT17cjpyWzBdLGc6clsxXSxiOnJbMl0sYTpyWzNdfX1lbHNlIGlmKCEwPT09Yy5pc1ZhbGlkSGV4KHQpKXt2YXIgYT1jLmhleFRvUkdCKHQpO2k9e3I6YS5yLGc6YS5nLGI6YS5iLGE6MX19fWVsc2UgaWYodCBpbnN0YW5jZW9mIE9iamVjdCYmdm9pZCAwIT09dC5yJiZ2b2lkIDAhPT10LmcmJnZvaWQgMCE9PXQuYil7dmFyIGg9dm9pZCAwIT09dC5hP3QuYTpcIjEuMFwiO2k9e3I6dC5yLGc6dC5nLGI6dC5iLGE6aH19aWYodm9pZCAwPT09aSl0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGNvbG9yIHBhc3NlZCB0byB0aGUgY29sb3JQaWNrZXIuIFN1cHBvcnRlZCBhcmUgc3RyaW5nczogcmdiLCBoZXgsIHJnYmEuIE9iamVjdDogcmdiICh7cjpyLGc6ZyxiOmIsW2E6YV19KS4gU3VwcGxpZWQ6IFwiKygwLHMuZGVmYXVsdCkodCkpO3RoaXMuX3NldENvbG9yKGksZSl9fX0se2tleTpcInNob3dcIix2YWx1ZTpmdW5jdGlvbigpe3ZvaWQgMCE9PXRoaXMuY2xvc2VDYWxsYmFjayYmKHR
21167oaXMuY2xvc2VDYWxsYmFjaygpLHRoaXMuY2xvc2VDYWxsYmFjaz12b2lkIDApLHRoaXMuYXBwbGllZD0hMSx0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuX2dlbmVyYXRlSHVlQ2lyY2xlKCl9fSx7a2V5OlwiX2hpZGVcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ITA9PT0oIShhcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSl8fGFyZ3VtZW50c1swXSkmJih0aGlzLnByZXZpb3VzQ29sb3I9Yy5leHRlbmQoe30sdGhpcy5jb2xvcikpLCEwPT09dGhpcy5hcHBsaWVkJiZ0aGlzLnVwZGF0ZUNhbGxiYWNrKHRoaXMuaW5pdGlhbENvbG9yKSx0aGlzLmZyYW1lLnN0eWxlLmRpc3BsYXk9XCJub25lXCIsc2V0VGltZW91dChmdW5jdGlvbigpe3ZvaWQgMCE9PXQuY2xvc2VDYWxsYmFjayYmKHQuY2xvc2VDYWxsYmFjaygpLHQuY2xvc2VDYWxsYmFjaz12b2lkIDApfSwwKX19LHtrZXk6XCJfc2F2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVDYWxsYmFjayh0aGlzLmNvbG9yKSx0aGlzLmFwcGxpZWQ9ITEsdGhpcy5faGlkZSgpfX0se2tleTpcIl9hcHBseVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5hcHBsaWVkPSEwLHRoaXMudXBkYXRlQ2FsbGJhY2sodGhpcy5jb2xvciksdGhpcy5fdXBkYXRlUGlja2VyKHRoaXMuY29sb3IpfX0se2tleTpcIl9sb2FkTGFzdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5wcmV2aW91c0NvbG9yP3RoaXMuc2V0Q29sb3IodGhpcy5wcmV2aW91c0NvbG9yLCExKTphbGVydChcIlRoZXJlIGlzIG5vIGxhc3QgY29sb3IgdG8gbG9hZC4uLlwiKX19LHtrZXk6XCJfc2V0Q29sb3JcIix2YWx1ZTpmdW5jdGlvbih0KXshMD09PSghKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdKSYmKHRoaXMuaW5pdGlhbENvbG9yPWMuZXh0ZW5kKHt9LHQpKSx0aGlzLmNvbG9yPXQ7dmFyIGU9Yy5SR0JUb0hTVih0LnIsdC5nLHQuYiksaT0yKk1hdGguUEksbz10aGlzLnIqZS5zLG49dGhpcy5jZW50ZXJDb29yZGluYXRlcy54K28qTWF0aC5zaW4oaSplLmgpLHM9dGhpcy5jZW50ZXJDb29yZGluYXRlcy55K28qTWF0aC5jb3MoaSplLmgpO3RoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0PW4tLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudFdpZHRoK1wicHhcIix0aGlzLmNvbG9yUGlja2VyU2VsZWN0b3Iuc3R5bGUudG9wPXMtLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudEhlaWdodCtcInB4XCIsdGhpcy5fdXBkYXRlUGlja2VyKHQpfX0se2tleTpcIl9zZXRPcGFjaXR5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5jb2xvci5hPXQvMTAwLHRoaXMuX3VwZGF0ZVBpY2tlcih0aGlzLmNvbG9yKX19LHtrZXk6XCJfc2V0QnJpZ2h0bmVzc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWMuUkdCVG9IU1YodGhpcy5jb2xvci5yLHRoaXMuY29sb3IuZyx0aGlzLmNvbG9yLmIpO2Uudj10LzEwMDt2YXIgaT1jLkhTVlRvUkdCKGUuaCxlLnMsZS52KTtpLmE9dGhpcy5jb2xvci5hLHRoaXMuY29sb3I9aSx0aGlzLl91cGRhdGVQaWNrZXIoKX19LHtrZXk6XCJfdXBkYXRlUGlja2VyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5jb2xvcixlPWMuUkdCVG9IU1YodC5yLHQuZyx0LmIpLGk9dGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIik7dm9pZCAwPT09dGhpcy5waXhlbFJhdGlvbiYmKHRoaXMucGl4ZWxSYXRpbz0od2luZG93LmRldmljZVBpeGVsUmF0aW98fDEpLyhpLndlYmtpdEJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkubW96QmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8aS5tc0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkub0JhY2tpbmdTdG9yZVBpeGVsUmF0aW98fGkuYmFja2luZ1N0b3JlUGl4ZWxSYXRpb3x8MSkpLGkuc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywwLDAsdGhpcy5waXhlbFJhdGlvLDAsMCk7dmFyIG89dGhpcy5jb2xvclBpY2tlckNhbnZhcy5jbGllbnRXaWR0aCxuPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50SGVpZ2h0O2kuY2xlYXJSZWN0KDAsMCxvLG4pLGkucHV0SW1hZ2VEYXRhKHRoaXMuaHVlQ2lyY2xlLDAsMCksaS5maWxsU3R5bGU9XCJyZ2JhKDAsMCwwLFwiKygxLWUudikrXCIpXCIsaS5jaXJjbGUodGhpcy5jZW50ZXJDb29yZGluYXRlcy54LHRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueSx0aGlzLnIpLGkuZmlsbCgpLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLnZhbHVlPTEwMCplLnYsdGhpcy5vcGFjaXR5UmFuZ2UudmFsdWU9MTAwKnQuYSx0aGlzLmluaXRpYWxDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9XCJyZ2JhKFwiK3RoaXMuaW5pdGlhbENvbG9yLnIrXCIsXCIrdGhpcy5pbml0aWFsQ29sb3IuZytcIixcIit0aGlzLmluaXRpYWxDb2xvci5iK1wiLFwiK3RoaXMuaW5pdGlhbENvbG9yLmErXCIpXCIsdGhpcy5uZXdDb2xvckRpdi5zdHlsZS5iYWNrZ3JvdW5kQ29sb3I9XCJyZ2JhKFwiK3RoaXMuY29sb3IucitcIixcIit0aGlzLmNvbG9yLmcrXCIsXCIrdGhpcy5jb2xvci5iK1wiLFwiK3RoaXMuY29sb3IuYStcIilcIn19LHtrZXk6XCJfc2V0U2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5jb2xvclBpY2tlckNhbnZhcy5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmNvbG9yUGlja2VyQ2FudmFzLnN0eWxlLmhlaWdodD1cIjEwMCVcIix0aGlzLmNvbG9yUGlja2VyQ2FudmFzLndpZHRoPTI4OSp0aGlzLnBpeGVsUmF0aW8sdGhpcy5jb2xvclBpY2tlckNhbnZhcy5oZWlnaHQ9Mjg5KnRoaXMucGl4ZWxSYXRpb319LHtrZXk6XCJfY3JlYXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5mcmFtZS5jbGFzc05hbWU9XCJ2aXMtY29sb3ItcGlja2VyXCIsdGhpcy5jb2xvclBpY2tlckRpdj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGFzc05hbWU9XCJ2aXMtc2VsZWN0b3JcIix0aGlzLmNvbG9yUGlja2VyRGl2LmFwcGVuZENoaWxkKHRoaXMuY29sb3JQaWNrZXJTZWxlY3RvciksdGhpcy5jb2xvclBpY2tlckNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuY29sb3JQaWNrZXJEaXYuYXBwZW5kQ2hpbGQodGhpcy5jb2xvclBpY2tlckNhbnZhcyksdGhpcy5jb2xvclBpY2tlckNhbnZhcy5nZXRDb250ZXh0KXt2YXIgdD10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmdldENvbnRleHQoXCIyZFwiKVxuICAgIDt0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpLnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApfWVsc2V7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTtlLnN0eWxlLmNvbG9yPVwicmVkXCIsZS5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLGUuc3R5bGUucGFkZGluZz1cIjEwcHhcIixlLmlubmVySFRNTD1cIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiLHRoaXMuY29sb3JQaWNrZXJDYW52YXMuYXBwZW5kQ2hpbGQoZSl9dGhpcy5jb2xvclBpY2tlckRpdi5jbGFzc05hbWU9XCJ2aXMtY29sb3JcIix0aGlzLm9wYWNpdHlEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm9wYWNpdHlEaXYuY2xhc3NOYW1lPVwidmlzLW9wYWNpdHlcIix0aGlzLmJyaWdodG5lc3NEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmJyaWdodG5lc3NEaXYuY2xhc3NOYW1lPVwidmlzLWJyaWdodG5lc3NcIix0aGlzLmFycm93RGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5hcnJvd0Rpdi5jbGFzc05hbWU9XCJ2aXMtYXJyb3dcIix0aGlzLm9wYWNpdHlSYW5nZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7dHJ5e3RoaXMub3BhY2l0eVJhbmdlLnR5cGU9XCJyYW5nZVwiLHRoaXMub3BhY2l0eVJhbmdlLm1pbj1cIjBcIix0aGlzLm9wYWNpdHlSYW5nZS5tYXg9XCIxMDBcIn1jYXRjaCh0KXt9dGhpcy5vcGFjaXR5UmFuZ2UudmFsdWU9XCIxMDBcIix0aGlzLm9wYWNpdHlSYW5nZS5jbGFzc05hbWU9XCJ2aXMtcmFuZ2VcIix0aGlzLmJyaWdodG5lc3NSYW5nZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7dHJ5e3RoaXMuYnJpZ2h0bmVzc1JhbmdlLnR5cGU9XCJyYW5nZVwiLHRoaXMuYnJpZ2h0bmVzc1JhbmdlLm1pbj1cIjBcIix0aGlzLmJyaWdodG5lc3NSYW5nZS5tYXg9XCIxMDBcIn1jYXRjaCh0KXt9dGhpcy5icmlnaHRuZXNzUmFuZ2UudmFsdWU9XCIxMDBcIix0aGlzLmJyaWdodG5lc3NSYW5nZS5jbGFzc05hbWU9XCJ2aXMtcmFuZ2VcIix0aGlzLm9wYWNpdHlEaXYuYXBwZW5kQ2hpbGQodGhpcy5vcGFjaXR5UmFuZ2UpLHRoaXMuYnJpZ2h0bmVzc0Rpdi5hcHBlbmRDaGlsZCh0aGlzLmJyaWdodG5lc3NSYW5nZSk7dmFyIGk9dGhpczt0aGlzLm9wYWNpdHlSYW5nZS5vbmNoYW5nZT1mdW5jdGlvbigpe2kuX3NldE9wYWNpdHkodGhpcy52YWx1ZSl9LHRoaXMub3BhY2l0eVJhbmdlLm9uaW5wdXQ9ZnVuY3Rpb24oKXtpLl9zZXRPcGFjaXR5KHRoaXMudmFsdWUpfSx0aGlzLmJyaWdodG5lc3NSYW5nZS5vbmNoYW5nZT1mdW5jdGlvbigpe2kuX3NldEJyaWdodG5lc3ModGhpcy52YWx1ZSl9LHRoaXMuYnJpZ2h0bmVzc1JhbmdlLm9uaW5wdXQ9ZnVuY3Rpb24oKXtpLl9zZXRCcmlnaHRuZXNzKHRoaXMudmFsdWUpfSx0aGlzLmJyaWdodG5lc3NMYWJlbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmNsYXNzTmFtZT1cInZpcy1sYWJlbCB2aXMtYnJpZ2h0bmVzc1wiLHRoaXMuYnJpZ2h0bmVzc0xhYmVsLmlubmVySFRNTD1cImJyaWdodG5lc3M6XCIsdGhpcy5vcGFjaXR5TGFiZWw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm9wYWNpdHlMYWJlbC5jbGFzc05hbWU9XCJ2aXMtbGFiZWwgdmlzLW9wYWNpdHlcIix0aGlzLm9wYWNpdHlMYWJlbC5pbm5lckhUTUw9XCJvcGFjaXR5OlwiLHRoaXMubmV3Q29sb3JEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm5ld0NvbG9yRGl2LmNsYXNzTmFtZT1cInZpcy1uZXctY29sb3JcIix0aGlzLm5ld0NvbG9yRGl2LmlubmVySFRNTD1cIm5ld1wiLHRoaXMuaW5pdGlhbENvbG9yRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5pbml0aWFsQ29sb3JEaXYuY2xhc3NOYW1lPVwidmlzLWluaXRpYWwtY29sb3JcIix0aGlzLmluaXRpYWxDb2xvckRpdi5pbm5lckhUTUw9XCJpbml0aWFsXCIsdGhpcy5jYW5jZWxCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmNhbmNlbEJ1dHRvbi5jbGFzc05hbWU9XCJ2aXMtYnV0dG9uIHZpcy1jYW5jZWxcIix0aGlzLmNhbmNlbEJ1dHRvbi5pbm5lckhUTUw9XCJjYW5jZWxcIix0aGlzLmNhbmNlbEJ1dHRvbi5vbmNsaWNrPXRoaXMuX2hpZGUuYmluZCh0aGlzLCExKSx0aGlzLmFwcGx5QnV0dG9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5hcHBseUJ1dHRvbi5jbGFzc05hbWU9XCJ2aXMtYnV0dG9uIHZpcy1hcHBseVwiLHRoaXMuYXBwbHlCdXR0b24uaW5uZXJIVE1MPVwiYXBwbHlcIix0aGlzLmFwcGx5QnV0dG9uLm9uY2xpY2s9dGhpcy5fYXBwbHkuYmluZCh0aGlzKSx0aGlzLnNhdmVCdXR0b249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLnNhdmVCdXR0b24uY2xhc3NOYW1lPVwidmlzLWJ1dHRvbiB2aXMtc2F2ZVwiLHRoaXMuc2F2ZUJ1dHRvbi5pbm5lckhUTUw9XCJzYXZlXCIsdGhpcy5zYXZlQnV0dG9uLm9uY2xpY2s9dGhpcy5fc2F2ZS5iaW5kKHRoaXMpLHRoaXMubG9hZEJ1dHRvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMubG9hZEJ1dHRvbi5jbGFzc05hbWU9XCJ2aXMtYnV0dG9uIHZpcy1sb2FkXCIsdGhpcy5sb2FkQnV0dG9uLmlubmVySFRNTD1cImxvYWQgbGFzdFwiLH
21167RoaXMubG9hZEJ1dHRvbi5vbmNsaWNrPXRoaXMuX2xvYWRMYXN0LmJpbmQodGhpcyksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNvbG9yUGlja2VyRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYXJyb3dEaXYpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzTGFiZWwpLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5icmlnaHRuZXNzRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eUxhYmVsKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMub3BhY2l0eURpdiksdGhpcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLm5ld0NvbG9yRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuaW5pdGlhbENvbG9yRGl2KSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuY2FuY2VsQnV0dG9uKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuYXBwbHlCdXR0b24pLHRoaXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5zYXZlQnV0dG9uKSx0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubG9hZEJ1dHRvbil9fSx7a2V5OlwiX2JpbmRIYW1tZXJcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5kcmFnPXt9LHRoaXMucGluY2g9e30sdGhpcy5oYW1tZXI9bmV3IGwodGhpcy5jb2xvclBpY2tlckNhbnZhcyksdGhpcy5oYW1tZXIuZ2V0KFwicGluY2hcIikuc2V0KHtlbmFibGU6ITB9KSx1Lm9uVG91Y2godGhpcy5oYW1tZXIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oXCJ0YXBcIixmdW5jdGlvbihlKXt0Ll9tb3ZlU2VsZWN0b3IoZSl9KSx0aGlzLmhhbW1lci5vbihcInBhbnN0YXJ0XCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oXCJwYW5tb3ZlXCIsZnVuY3Rpb24oZSl7dC5fbW92ZVNlbGVjdG9yKGUpfSksdGhpcy5oYW1tZXIub24oXCJwYW5lbmRcIixmdW5jdGlvbihlKXt0Ll9tb3ZlU2VsZWN0b3IoZSl9KX19LHtrZXk6XCJfZ2VuZXJhdGVIdWVDaXJjbGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCExPT09dGhpcy5nZW5lcmF0ZWQpe3ZhciB0PXRoaXMuY29sb3JQaWNrZXJDYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpO3ZvaWQgMD09PXRoaXMucGl4ZWxSYXRpb24mJih0aGlzLnBpeGVsUmF0aW89KHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvfHwxKS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpKSx0LnNldFRyYW5zZm9ybSh0aGlzLnBpeGVsUmF0aW8sMCwwLHRoaXMucGl4ZWxSYXRpbywwLDApO3ZhciBlPXRoaXMuY29sb3JQaWNrZXJDYW52YXMuY2xpZW50V2lkdGgsaT10aGlzLmNvbG9yUGlja2VyQ2FudmFzLmNsaWVudEhlaWdodDt0LmNsZWFyUmVjdCgwLDAsZSxpKTt2YXIgbz12b2lkIDAsbj12b2lkIDAscz12b2lkIDAscj12b2lkIDA7dGhpcy5jZW50ZXJDb29yZGluYXRlcz17eDouNSplLHk6LjUqaX0sdGhpcy5yPS40OSplO3ZhciBhPTIqTWF0aC5QSS8zNjAsaD0xL3RoaXMucixkPXZvaWQgMDtmb3Iocz0wO3M8MzYwO3MrKylmb3Iocj0wO3I8dGhpcy5yO3IrKylvPXRoaXMuY2VudGVyQ29vcmRpbmF0ZXMueCtyKk1hdGguc2luKGEqcyksbj10aGlzLmNlbnRlckNvb3JkaW5hdGVzLnkrcipNYXRoLmNvcyhhKnMpLGQ9Yy5IU1ZUb1JHQihzKigxLzM2MCkscipoLDEpLHQuZmlsbFN0eWxlPVwicmdiKFwiK2QucitcIixcIitkLmcrXCIsXCIrZC5iK1wiKVwiLHQuZmlsbFJlY3Qoby0uNSxuLS41LDIsMik7dC5zdHJva2VTdHlsZT1cInJnYmEoMCwwLDAsMSlcIix0LmNpcmNsZSh0aGlzLmNlbnRlckNvb3JkaW5hdGVzLngsdGhpcy5jZW50ZXJDb29yZGluYXRlcy55LHRoaXMuciksdC5zdHJva2UoKSx0aGlzLmh1ZUNpcmNsZT10LmdldEltYWdlRGF0YSgwLDAsZSxpKX10aGlzLmdlbmVyYXRlZD0hMH19LHtrZXk6XCJfbW92ZVNlbGVjdG9yXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb2xvclBpY2tlckRpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxpPXQuY2VudGVyLngtZS5sZWZ0LG89dC5jZW50ZXIueS1lLnRvcCxuPS41KnRoaXMuY29sb3JQaWNrZXJEaXYuY2xpZW50SGVpZ2h0LHM9LjUqdGhpcy5jb2xvclBpY2tlckRpdi5jbGllbnRXaWR0aCxyPWktcyxhPW8tbixoPU1hdGguYXRhbjIocixhKSxkPS45OCpNYXRoLm1pbihNYXRoLnNxcnQocipyK2EqYSkscyksbD1NYXRoLmNvcyhoKSpkK24sdT1NYXRoLnNpbihoKSpkK3M7dGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLnN0eWxlLnRvcD1sLS41KnRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5jbGllbnRIZWlnaHQrXCJweFwiLHRoaXMuY29sb3JQaWNrZXJTZWxlY3Rvci5zdHlsZS5sZWZ0PXUtLjUqdGhpcy5jb2xvclBpY2tlclNlbGVjdG9yLmNsaWVudFdpZHRoK1wicHhcIjt2YXIgcD1oLygyKk1hdGguUEkpO3A9cDwwP3ArMTpwO3ZhciBmPWQvdGhpcy5yLG09Yy5SR0JUb0hTVih0aGlzLmNvbG9yLnIsdGhpcy5jb2xvci5nLHRoaXMuY29sb3IuYik7bS5oPXAsbS5zPWY7dmFyIHY9Yy5IU1ZUb1JHQihtLmgsbS5zLG0udik7di5hPXRoaXMuY29sb3IuYSx0aGlzLmNvbG9yPXYsdGhpcy5pbml0aWFsQ29sb3JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yPVwicmdiYShcIit0aGlzLmluaXRpYWxDb2xvci5yK1wiLFwiK3RoaXMuaW5pdGlhbENvbG9yLmcrXCIsXCIrdGhpcy5pbml0aWFsQ29sb3IuYitcIixcIit0aGlzLmluaXRpYWxDb2xvci5hK1wiKVwiLHRoaXMubmV3Q29sb3JEaXYuc3R5bGUuYmFja2dyb3VuZENvbG9yPVwicmdiYShcIit0aGlzLmNvbG9yLnIrXCIsXCIrdGhpcy5jb2xvci5nK1wiLFwiK3RoaXMuY29sb3IuYitcIixcIit0aGlzLmNvbG9yLmErXCIpXCJ9fV0pLHR9KCk7ZS5kZWZhdWx0PXB9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQsZSxpLG8pe2lmKCEoQXJyYXkuaXNBcnJheShpKXx8aSBpbnN0YW5jZW9mIHJ8fGkgaW5zdGFuY2VvZiBhKSYmaSBpbnN0YW5jZW9mIE9iamVjdCl7dmFyIGQ9bztvPWksaT1kfW8mJm8udGhyb3R0bGVSZWRyYXcmJmNvbnNvbGUud2FybignR3JhcGgyZCBvcHRpb24gXCJ0aHJvdHRsZVJlZHJhd1wiIGlzIERFU
21167FJJQ0FURUQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuIEl0IHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgbmV4dCBNQUpPUiByZWxlYXNlLicpO3ZhciBjPXRoaXM7dGhpcy5kZWZhdWx0T3B0aW9ucz17c3RhcnQ6bnVsbCxlbmQ6bnVsbCxhdXRvUmVzaXplOiEwLG9yaWVudGF0aW9uOntheGlzOlwiYm90dG9tXCIsaXRlbTpcImJvdHRvbVwifSxtb21lbnQ6bix3aWR0aDpudWxsLGhlaWdodDpudWxsLG1heEhlaWdodDpudWxsLG1pbkhlaWdodDpudWxsfSx0aGlzLm9wdGlvbnM9cy5kZWVwRXh0ZW5kKHt9LHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuX2NyZWF0ZSh0KSx0aGlzLmNvbXBvbmVudHM9W10sdGhpcy5ib2R5PXtkb206dGhpcy5kb20sZG9tUHJvcHM6dGhpcy5wcm9wcyxlbWl0dGVyOntvbjp0aGlzLm9uLmJpbmQodGhpcyksb2ZmOnRoaXMub2ZmLmJpbmQodGhpcyksZW1pdDp0aGlzLmVtaXQuYmluZCh0aGlzKX0saGlkZGVuRGF0ZXM6W10sdXRpbDp7dG9TY3JlZW46Yy5fdG9TY3JlZW4uYmluZChjKSx0b0dsb2JhbFNjcmVlbjpjLl90b0dsb2JhbFNjcmVlbi5iaW5kKGMpLHRvVGltZTpjLl90b1RpbWUuYmluZChjKSx0b0dsb2JhbFRpbWU6Yy5fdG9HbG9iYWxUaW1lLmJpbmQoYyl9fSx0aGlzLnJhbmdlPW5ldyBoKHRoaXMuYm9keSksdGhpcy5jb21wb25lbnRzLnB1c2godGhpcy5yYW5nZSksdGhpcy5ib2R5LnJhbmdlPXRoaXMucmFuZ2UsdGhpcy50aW1lQXhpcz1uZXcgbCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMudGltZUF4aXMpLHRoaXMuY3VycmVudFRpbWU9bmV3IHUodGhpcy5ib2R5KSx0aGlzLmNvbXBvbmVudHMucHVzaCh0aGlzLmN1cnJlbnRUaW1lKSx0aGlzLmxpbmVncmFwaD1uZXcgcCh0aGlzLmJvZHkpLHRoaXMuY29tcG9uZW50cy5wdXNoKHRoaXMubGluZWdyYXBoKSx0aGlzLml0ZW1zRGF0YT1udWxsLHRoaXMuZ3JvdXBzRGF0YT1udWxsLHRoaXMub24oXCJ0YXBcIixmdW5jdGlvbih0KXtjLmVtaXQoXCJjbGlja1wiLGMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMub24oXCJkb3VibGV0YXBcIixmdW5jdGlvbih0KXtjLmVtaXQoXCJkb3VibGVDbGlja1wiLGMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0pLHRoaXMuZG9tLnJvb3Qub25jb250ZXh0bWVudT1mdW5jdGlvbih0KXtjLmVtaXQoXCJjb250ZXh0bWVudVwiLGMuZ2V0RXZlbnRQcm9wZXJ0aWVzKHQpKX0sbyYmdGhpcy5zZXRPcHRpb25zKG8pLGkmJnRoaXMuc2V0R3JvdXBzKGkpLGUmJnRoaXMuc2V0SXRlbXMoZSksdGhpcy5fcmVkcmF3KCl9dmFyIG49aSg5KSxzPWkoMikscj1pKDExKSxhPWkoMTIpLGg9aSg2NCksZD1pKDY1KSxsPWkoNDUpLHU9aSg2NyksYz1pKDQ2KSxwPWkoMTA2KSxmPWkoMTUpLnByaW50U3R5bGUsbT1pKDExMykuYWxsT3B0aW9ucyx2PWkoMTEzKS5jb25maWd1cmVPcHRpb25zLGc9aSg3MSkuZGVmYXVsdCx5PWkoMTUpLmRlZmF1bHQ7by5wcm90b3R5cGU9bmV3IGQsby5wcm90b3R5cGUuc2V0T3B0aW9ucz1mdW5jdGlvbih0KXshMD09PXkudmFsaWRhdGUodCxtKSYmY29uc29sZS5sb2coXCIlY0Vycm9ycyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0LlwiLGYpLGQucHJvdG90eXBlLnNldE9wdGlvbnMuY2FsbCh0aGlzLHQpfSxvLnByb3RvdHlwZS5zZXRJdGVtcz1mdW5jdGlvbih0KXt2YXIgZSxpPW51bGw9PXRoaXMuaXRlbXNEYXRhO2lmKGU9dD90IGluc3RhbmNlb2Ygcnx8dCBpbnN0YW5jZW9mIGE/dDpuZXcgcih0LHt0eXBlOntzdGFydDpcIkRhdGVcIixlbmQ6XCJEYXRlXCJ9fSk6bnVsbCx0aGlzLml0ZW1zRGF0YT1lLHRoaXMubGluZWdyYXBoJiZ0aGlzLmxpbmVncmFwaC5zZXRJdGVtcyhlKSxpKWlmKHZvaWQgMCE9dGhpcy5vcHRpb25zLnN0YXJ0fHx2b2lkIDAhPXRoaXMub3B0aW9ucy5lbmQpe3ZhciBvPXZvaWQgMCE9dGhpcy5vcHRpb25zLnN0YXJ0P3RoaXMub3B0aW9ucy5zdGFydDpudWxsLG49dm9pZCAwIT10aGlzLm9wdGlvbnMuZW5kP3RoaXMub3B0aW9ucy5lbmQ6bnVsbDt0aGlzLnNldFdpbmRvdyhvLG4se2FuaW1hdGlvbjohMX0pfWVsc2UgdGhpcy5maXQoe2FuaW1hdGlvbjohMX0pfSxvLnByb3RvdHlwZS5zZXRHcm91cHM9ZnVuY3Rpb24odCl7dmFyIGU7ZT10P3QgaW5zdGFuY2VvZiByfHx0IGluc3RhbmNlb2YgYT90Om5ldyByKHQpOm51bGwsdGhpcy5ncm91cHNEYXRhPWUsdGhpcy5saW5lZ3JhcGguc2V0R3JvdXBzKGUpfSxvLnByb3RvdHlwZS5nZXRMZWdlbmQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiB2b2lkIDA9PT1lJiYoZT0xNSksdm9pZCAwPT09aSYmKGk9MTUpLHZvaWQgMCE9PXRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XT90aGlzLmxpbmVncmFwaC5ncm91cHNbdF0uZ2V0TGVnZW5kKGUsaSk6XCJjYW5ub3QgZmluZCBncm91cDonXCIrdCtcIidcIn0sby5wcm90b3R5cGUuaXNHcm91cFZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XSYmKHRoaXMubGluZWdyYXBoLmdyb3Vwc1t0XS52aXNpYmxlJiYodm9pZCAwPT09dGhpcy5saW5lZ3JhcGgub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0XXx8MT09dGhpcy5saW5lZ3JhcGgub3B0aW9ucy5ncm91cHMudmlzaWJpbGl0eVt0XSkpfSxvLnByb3RvdHlwZS5nZXREYXRhUmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdD1udWxsLGU9bnVsbDtmb3IodmFyIGkgaW4gdGhpcy5saW5lZ3JhcGguZ3JvdXBzKWlmKHRoaXMubGluZWdyYXBoLmdyb3Vwcy5oYXNPd25Qcm9wZXJ0eShpKSYmMT09dGhpcy5saW5lZ3JhcGguZ3JvdXBzW2ldLnZpc2libGUpZm9yKHZhciBvPTA7bzx0aGlzLmxpbmVncmFwaC5ncm91cHNbaV0uaXRlbXNEYXRhLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMubGluZWdyYXBoLmdyb3Vwc1tpXS5pdGVtc0RhdGFbb10scj1zLmNvbnZlcnQobi54LFwiRGF0ZVwiKS52YWx1ZU9mKCk7dD1udWxsPT10P3I6dD5yP3I6dCxlPW51bGw9PWU/cjplPHI/cjplfXJldHVybnttaW46bnVsbCE9dD9uZXcgRGF0ZSh0KTpudWxsLG1heDpudWxsIT1lP25ldyBEYXRlKGUpOm51bGx9fSxvLnByb3RvdHlwZS5nZXRFdmVudFByb3BlcnRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dC5jZW50ZXI/dC5jZW50ZXIueDp0LmNsaWVudFgsaT10LmNlbnRlcj90LmNlbnRlci55OnQuY2xpZW50WSxvPWUtcy5nZXRBYnNvbHV0ZUxlZnQodGhpcy5kb20uY2VudGVyQ29udGFpbmVyKSxuPWktcy5nZXRBYnNvbHV0ZVRvcCh0aGlzLmRvbS5jZW50ZXJDb250YWluZXIpLHI9dGhpcy5fdG9UaW1lKG8pLGE9Yy5jdXN0b21UaW1lRnJvbVRhcmdldCh0KSxoPXMuZ2V0VGFyZ2V0KHQpLGQ9bnVsbDtzLmhhc1BhcmVudChoLHRoaXMudGltZUF4aXMuZG9tLmZvcmVncm91bmQpP2Q9XCJheGlzXCI6dGhpcy50aW1lQXhpczImJnMuaGFzUGFyZW50KGgsdGhpcy50aW1lQXhpczIuZG9tLmZvcmVncm91bmQpP2Q9XCJheGlzXCI6cy5oYXN
21167QYXJlbnQoaCx0aGlzLmxpbmVncmFwaC55QXhpc0xlZnQuZG9tLmZyYW1lKT9kPVwiZGF0YS1heGlzXCI6cy5oYXNQYXJlbnQoaCx0aGlzLmxpbmVncmFwaC55QXhpc1JpZ2h0LmRvbS5mcmFtZSk/ZD1cImRhdGEtYXhpc1wiOnMuaGFzUGFyZW50KGgsdGhpcy5saW5lZ3JhcGgubGVnZW5kTGVmdC5kb20uZnJhbWUpP2Q9XCJsZWdlbmRcIjpzLmhhc1BhcmVudChoLHRoaXMubGluZWdyYXBoLmxlZ2VuZFJpZ2h0LmRvbS5mcmFtZSk/ZD1cImxlZ2VuZFwiOm51bGwhPWE/ZD1cImN1c3RvbS10aW1lXCI6cy5oYXNQYXJlbnQoaCx0aGlzLmN1cnJlbnRUaW1lLmJhcik/ZD1cImN1cnJlbnQtdGltZVwiOnMuaGFzUGFyZW50KGgsdGhpcy5kb20uY2VudGVyKSYmKGQ9XCJiYWNrZ3JvdW5kXCIpO3ZhciBsPVtdLHU9dGhpcy5saW5lZ3JhcGgueUF4aXNMZWZ0LHA9dGhpcy5saW5lZ3JhcGgueUF4aXNSaWdodDtyZXR1cm4hdS5oaWRkZW4mJnRoaXMuaXRlbXNEYXRhLmxlbmd0aD4wJiZsLnB1c2godS5zY3JlZW5Ub1ZhbHVlKG4pKSwhcC5oaWRkZW4mJnRoaXMuaXRlbXNEYXRhLmxlbmd0aD4wJiZsLnB1c2gocC5zY3JlZW5Ub1ZhbHVlKG4pKSx7ZXZlbnQ6dCx3aGF0OmQscGFnZVg6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VYOnQucGFnZVgscGFnZVk6dC5zcmNFdmVudD90LnNyY0V2ZW50LnBhZ2VZOnQucGFnZVkseDpvLHk6bix0aW1lOnIsdmFsdWU6bH19LG8ucHJvdG90eXBlLl9jcmVhdGVDb25maWd1cmF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGcodGhpcyx0aGlzLmRvbS5jb250YWluZXIsdil9LHQuZXhwb3J0cz1vfSxmdW5jdGlvbih0LGUsaSl7ZS51dGlsPWkoMiksZS5ET011dGlsPWkoMTQpLGUuRGF0YVNldD1pKDExKSxlLkRhdGFWaWV3PWkoMTIpLGUuUXVldWU9aSg0MyksZS5OZXR3b3JrPWkoMTgyKSxlLm5ldHdvcms9e0ltYWdlczppKDExNiksZG90cGFyc2VyOmkoMTE0KSxnZXBoaVBhcnNlcjppKDExNSksYWxsT3B0aW9uczppKDEyMil9LGUubmV0d29yay5jb252ZXJ0RG90PWZ1bmN0aW9uKHQpe3JldHVybiBlLm5ldHdvcmsuZG90cGFyc2VyLkRPVFRvR3JhcGgodCl9LGUubmV0d29yay5jb252ZXJ0R2VwaGk9ZnVuY3Rpb24odCxpKXtyZXR1cm4gZS5uZXR3b3JrLmdlcGhpUGFyc2VyLnBhcnNlR2VwaGkodCxpKX0sZS5tb21lbnQ9aSg5KSxlLkhhbW1lcj1pKDEwKSxlLmtleWNoYXJtPWkoMzUpfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0LGUsaSl7dmFyIG49dGhpcztpZighKHRoaXMgaW5zdGFuY2VvZiBvKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoXCJDb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBuZXcgb3BlcmF0b3JcIik7dGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2xvY2FsZTpcImVuXCIsbG9jYWxlczpkLGNsaWNrVG9Vc2U6ITF9LHMuZXh0ZW5kKHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKSx0aGlzLmJvZHk9e2NvbnRhaW5lcjp0LG5vZGVzOnt9LG5vZGVJbmRpY2VzOltdLGVkZ2VzOnt9LGVkZ2VJbmRpY2VzOltdLGVtaXR0ZXI6e29uOnRoaXMub24uYmluZCh0aGlzKSxvZmY6dGhpcy5vZmYuYmluZCh0aGlzKSxlbWl0OnRoaXMuZW1pdC5iaW5kKHRoaXMpLG9uY2U6dGhpcy5vbmNlLmJpbmQodGhpcyl9LGV2ZW50TGlzdGVuZXJzOntvblRhcDpmdW5jdGlvbigpe30sb25Ub3VjaDpmdW5jdGlvbigpe30sb25Eb3VibGVUYXA6ZnVuY3Rpb24oKXt9LG9uSG9sZDpmdW5jdGlvbigpe30sb25EcmFnU3RhcnQ6ZnVuY3Rpb24oKXt9LG9uRHJhZzpmdW5jdGlvbigpe30sb25EcmFnRW5kOmZ1bmN0aW9uKCl7fSxvbk1vdXNlV2hlZWw6ZnVuY3Rpb24oKXt9LG9uUGluY2g6ZnVuY3Rpb24oKXt9LG9uTW91c2VNb3ZlOmZ1bmN0aW9uKCl7fSxvblJlbGVhc2U6ZnVuY3Rpb24oKXt9LG9uQ29udGV4dDpmdW5jdGlvbigpe319LGRhdGE6e25vZGVzOm51bGwsZWRnZXM6bnVsbH0sZnVuY3Rpb25zOntjcmVhdGVOb2RlOmZ1bmN0aW9uKCl7fSxjcmVhdGVFZGdlOmZ1bmN0aW9uKCl7fSxnZXRQb2ludGVyOmZ1bmN0aW9uKCl7fX0sbW9kdWxlczp7fSx2aWV3OntzY2FsZToxLHRyYW5zbGF0aW9uOnt4OjAseTowfX19LHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCksdGhpcy5pbWFnZXM9bmV3IGwoZnVuY3Rpb24oKXtyZXR1cm4gbi5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpfSksdGhpcy5ncm91cHM9bmV3IHUsdGhpcy5jYW52YXM9bmV3IGcodGhpcy5ib2R5KSx0aGlzLnNlbGVjdGlvbkhhbmRsZXI9bmV3IF8odGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLmludGVyYWN0aW9uSGFuZGxlcj1uZXcgYih0aGlzLmJvZHksdGhpcy5jYW52YXMsdGhpcy5zZWxlY3Rpb25IYW5kbGVyKSx0aGlzLnZpZXc9bmV3IHkodGhpcy5ib2R5LHRoaXMuY2FudmFzKSx0aGlzLnJlbmRlcmVyPW5ldyB2KHRoaXMuYm9keSx0aGlzLmNhbnZhcyksdGhpcy5waHlzaWNzPW5ldyBmKHRoaXMuYm9keSksdGhpcy5sYXlvdXRFbmdpbmU9bmV3IHcodGhpcy5ib2R5KSx0aGlzLmNsdXN0ZXJpbmc9bmV3IG0odGhpcy5ib2R5KSx0aGlzLm1hbmlwdWxhdGlvbj1uZXcgeCh0aGlzLmJvZHksdGhpcy5jYW52YXMsdGhpcy5zZWxlY3Rpb25IYW5kbGVyKSx0aGlzLm5vZGVzSGFuZGxlcj1uZXcgYyh0aGlzLmJvZHksdGhpcy5pbWFnZXMsdGhpcy5ncm91cHMsdGhpcy5sYXlvdXRFbmdpbmUpLHRoaXMuZWRnZXNIYW5kbGVyPW5ldyBwKHRoaXMuYm9keSx0aGlzLmltYWdlcyx0aGlzLmdyb3VwcyksdGhpcy5ib2R5Lm1vZHVsZXMua2FtYWRhS2F3YWk9bmV3IFQodGhpcy5ib2R5LDE1MCwuMDUpLHRoaXMuYm9keS5tb2R1bGVzLmNsdXN0ZXJpbmc9dGhpcy5jbHVzdGVyaW5nLHRoaXMuY2FudmFzLl9jcmVhdGUoKSx0aGlzLnNldE9wdGlvbnMoaSksdGhpcy5zZXREYXRhKGUpfWkoMTgzKTt2YXIgbj1pKDQ0KSxzPWkoMikscj1pKDExNCksYT1pKDExNSksaD1pKDk3KSxkPWkoMTg0KSxsPWkoMTE2KS5kZWZhdWx0LHU9aSgxODYpLmRlZmF1bHQsYz1pKDE4NykuZGVmYXVsdCxwPWkoMjE0KS5kZWZhdWx0LGY9aSgyMjApLmRlZmF1bHQsbT1pKDIyNykuZGVmYXVsdCx2PWkoMjI5KS5kZWZh
21167dWx0LGc9aSgyMzApLmRlZmF1bHQseT1pKDIzMSkuZGVmYXVsdCxiPWkoMjMyKS5kZWZhdWx0LF89aSgyMzQpLmRlZmF1bHQsdz1pKDIzNSkuZGVmYXVsdCx4PWkoMjM3KS5kZWZhdWx0LGs9aSg3MSkuZGVmYXVsdCxTPWkoMTUpLmRlZmF1bHQsRD1pKDE1KSxNPUQucHJpbnRTdHlsZSxDPWkoMTIyKSxPPUMuYWxsT3B0aW9ucyxFPUMuY29uZmlndXJlT3B0aW9ucyxUPWkoMjM4KS5kZWZhdWx0O24oby5wcm90b3R5cGUpLG8ucHJvdG90eXBlLnNldE9wdGlvbnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDAhPT10KXshMD09PVMudmFsaWRhdGUodCxPKSYmY29uc29sZS5sb2coXCIlY0Vycm9ycyBoYXZlIGJlZW4gZm91bmQgaW4gdGhlIHN1cHBsaWVkIG9wdGlvbnMgb2JqZWN0LlwiLE0pO3ZhciBpPVtcImxvY2FsZVwiLFwibG9jYWxlc1wiLFwiY2xpY2tUb1VzZVwiXTtpZihzLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCksdD10aGlzLmxheW91dEVuZ2luZS5zZXRPcHRpb25zKHQubGF5b3V0LHQpLHRoaXMuY2FudmFzLnNldE9wdGlvbnModCksdGhpcy5ncm91cHMuc2V0T3B0aW9ucyh0Lmdyb3VwcyksdGhpcy5ub2Rlc0hhbmRsZXIuc2V0T3B0aW9ucyh0Lm5vZGVzKSx0aGlzLmVkZ2VzSGFuZGxlci5zZXRPcHRpb25zKHQuZWRnZXMpLHRoaXMucGh5c2ljcy5zZXRPcHRpb25zKHQucGh5c2ljcyksdGhpcy5tYW5pcHVsYXRpb24uc2V0T3B0aW9ucyh0Lm1hbmlwdWxhdGlvbix0LHRoaXMub3B0aW9ucyksdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIuc2V0T3B0aW9ucyh0LmludGVyYWN0aW9uKSx0aGlzLnJlbmRlcmVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNldE9wdGlvbnModC5pbnRlcmFjdGlvbiksdm9pZCAwIT09dC5ncm91cHMmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyZWZyZXNoTm9kZXNcIiksXCJjb25maWd1cmVcImluIHQmJih0aGlzLmNvbmZpZ3VyYXRvcnx8KHRoaXMuY29uZmlndXJhdG9yPW5ldyBrKHRoaXMsdGhpcy5ib2R5LmNvbnRhaW5lcixFLHRoaXMuY2FudmFzLnBpeGVsUmF0aW8pKSx0aGlzLmNvbmZpZ3VyYXRvci5zZXRPcHRpb25zKHQuY29uZmlndXJlKSksdGhpcy5jb25maWd1cmF0b3ImJiEwPT09dGhpcy5jb25maWd1cmF0b3Iub3B0aW9ucy5lbmFibGVkKXt2YXIgbz17bm9kZXM6e30sZWRnZXM6e30sbGF5b3V0Ont9LGludGVyYWN0aW9uOnt9LG1hbmlwdWxhdGlvbjp7fSxwaHlzaWNzOnt9LGdsb2JhbDp7fX07cy5kZWVwRXh0ZW5kKG8ubm9kZXMsdGhpcy5ub2Rlc0hhbmRsZXIub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8uZWRnZXMsdGhpcy5lZGdlc0hhbmRsZXIub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8ubGF5b3V0LHRoaXMubGF5b3V0RW5naW5lLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLmludGVyYWN0aW9uLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5pbnRlcmFjdGlvbix0aGlzLnJlbmRlcmVyLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLmludGVyYWN0aW9uLHRoaXMuaW50ZXJhY3Rpb25IYW5kbGVyLm9wdGlvbnMpLHMuZGVlcEV4dGVuZChvLm1hbmlwdWxhdGlvbix0aGlzLm1hbmlwdWxhdGlvbi5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5waHlzaWNzLHRoaXMucGh5c2ljcy5vcHRpb25zKSxzLmRlZXBFeHRlbmQoby5nbG9iYWwsdGhpcy5jYW52YXMub3B0aW9ucykscy5kZWVwRXh0ZW5kKG8uZ2xvYmFsLHRoaXMub3B0aW9ucyksdGhpcy5jb25maWd1cmF0b3Iuc2V0TW9kdWxlT3B0aW9ucyhvKX12b2lkIDAhPT10LmNsaWNrVG9Vc2U/ITA9PT10LmNsaWNrVG9Vc2U/dm9pZCAwPT09dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvcj1uZXcgaCh0aGlzLmNhbnZhcy5mcmFtZSksdGhpcy5hY3RpdmF0b3Iub24oXCJjaGFuZ2VcIixmdW5jdGlvbigpe2UuYm9keS5lbWl0dGVyLmVtaXQoXCJhY3RpdmF0ZVwiKX0pKToodm9pZCAwIT09dGhpcy5hY3RpdmF0b3ImJih0aGlzLmFjdGl2YXRvci5kZXN0cm95KCksZGVsZXRlIHRoaXMuYWN0aXZhdG9yKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiYWN0aXZhdGVcIikpOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJhY3RpdmF0ZVwiKSx0aGlzLmNhbnZhcy5zZXRTaXplKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKX19LG8ucHJvdG90eXBlLl91cGRhdGVWaXNpYmxlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2RlcyxlPXRoaXMuYm9keS5lZGdlczt0aGlzLmJvZHkubm9kZUluZGljZXM9W10sdGhpcy5ib2R5LmVkZ2VJbmRpY2VzPVtdO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJih0aGlzLmNsdXN0ZXJpbmcuX2lzQ2x1c3RlcmVkTm9kZShpKXx8ITEhPT10W2ldLm9wdGlvbnMuaGlkZGVufHx0aGlzLmJvZHkubm9kZUluZGljZXMucHVzaCh0W2ldLmlkKSk7Zm9yKHZhciBvIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49ZVtvXSxzPXRbbi5mcm9tSWRdLHI9dFtuLnRvSWRdLGE9dm9pZCAwIT09cyYmdm9pZCAwIT09cixoPSF0aGlzLmNsdXN0ZXJpbmcuX2lzQ2x1c3RlcmVkRWRnZShvKSYmITE9PT1uLm9wdGlvbnMuaGlkZGVuJiZhJiYhMT09PXMub3B0aW9ucy5oaWRkZW4mJiExPT09ci5vcHRpb25zLmhpZGRlbjtoJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMucHVzaChuLmlkKX19LG8ucHJvdG90eXBlLmJpbmRFdmVudExpc3RlbmVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfZGF0YUNoYW5nZWRcIixmdW5jdGlvbigpe3QuZWRnZXNIYW5kbGVyLl91cGRhdGVTdGF0ZSgpLHQuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YVVwZGF0ZWRcIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9kYXRhVXBkYXRlZFwiLGZ1bmN0aW9uKCl7dC5jbHVzdGVyaW5nLl91cGRhdGVTdGF0ZSgpLHQuX3VwZGF0ZVZpc2libGVJbmRpY2VzKCksdC5fdXBkYXRlVmFsdWVSYW5nZSh0LmJvZHkubm9kZXMpLHQuX3VwZGF0ZVZhbHVlUmFuZ2UodC5ib2R5LmVkZ2VzKSx0LmJvZHkuZW1pdHRlci5lbWl0KFwic3RhcnRTaW11bGF0aW9uXCIpLHQuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdW
21167VzdFJlZHJhd1wiKX0pfSxvLnByb3RvdHlwZS5zZXREYXRhPWZ1bmN0aW9uKHQpe2lmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyZXNldFBoeXNpY3NcIiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXNldERhdGFcIiksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdCYmdC5kb3QmJih0Lm5vZGVzfHx0LmVkZ2VzKSl0aHJvdyBuZXcgU3ludGF4RXJyb3IoJ0RhdGEgbXVzdCBjb250YWluIGVpdGhlciBwYXJhbWV0ZXIgXCJkb3RcIiBvciAgcGFyYW1ldGVyIHBhaXIgXCJub2Rlc1wiIGFuZCBcImVkZ2VzXCIsIGJ1dCBub3QgYm90aC4nKTtpZih0aGlzLnNldE9wdGlvbnModCYmdC5vcHRpb25zKSx0JiZ0LmRvdCl7Y29uc29sZS5sb2coXCJUaGUgZG90IHByb3BlcnR5IGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgdGhlIHN0YXRpYyBjb252ZXJ0RG90IG1ldGhvZCB0byBjb252ZXJ0IERPVCBpbnRvIHZpcy5uZXR3b3JrIGZvcm1hdCBhbmQgdXNlIHRoZSBub3JtYWwgZGF0YSBmb3JtYXQgd2l0aCBub2RlcyBhbmQgZWRnZXMuIFRoaXMgY29udmVydGVyIGlzIHVzZWQgbGlrZSB0aGlzOiB2YXIgZGF0YSA9IHZpcy5uZXR3b3JrLmNvbnZlcnREb3QoZG90U3RyaW5nKTtcIik7dmFyIGU9ci5ET1RUb0dyYXBoKHQuZG90KTtyZXR1cm4gdm9pZCB0aGlzLnNldERhdGEoZSl9aWYodCYmdC5nZXBoaSl7Y29uc29sZS5sb2coXCJUaGUgZ2VwaGkgcHJvcGVydHkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSB0aGUgc3RhdGljIGNvbnZlcnRHZXBoaSBtZXRob2QgdG8gY29udmVydCBnZXBoaSBpbnRvIHZpcy5uZXR3b3JrIGZvcm1hdCBhbmQgdXNlIHRoZSBub3JtYWwgZGF0YSBmb3JtYXQgd2l0aCBub2RlcyBhbmQgZWRnZXMuIFRoaXMgY29udmVydGVyIGlzIHVzZWQgbGlrZSB0aGlzOiB2YXIgZGF0YSA9IHZpcy5uZXR3b3JrLmNvbnZlcnRHZXBoaShnZXBoaUpzb24pO1wiKTt2YXIgaT1hLnBhcnNlR2VwaGkodC5nZXBoaSk7cmV0dXJuIHZvaWQgdGhpcy5zZXREYXRhKGkpfXRoaXMubm9kZXNIYW5kbGVyLnNldERhdGEodCYmdC5ub2RlcywhMCksdGhpcy5lZGdlc0hhbmRsZXIuc2V0RGF0YSh0JiZ0LmVkZ2VzLCEwKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUxvYWRlZFwiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiaW5pdFBoeXNpY3NcIil9LG8ucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiZGVzdHJveVwiKSx0aGlzLmJvZHkuZW1pdHRlci5vZmYoKSx0aGlzLm9mZigpLGRlbGV0ZSB0aGlzLmdyb3VwcyxkZWxldGUgdGhpcy5jYW52YXMsZGVsZXRlIHRoaXMuc2VsZWN0aW9uSGFuZGxlcixkZWxldGUgdGhpcy5pbnRlcmFjdGlvbkhhbmRsZXIsZGVsZXRlIHRoaXMudmlldyxkZWxldGUgdGhpcy5yZW5kZXJlcixkZWxldGUgdGhpcy5waHlzaWNzLGRlbGV0ZSB0aGlzLmxheW91dEVuZ2luZSxkZWxldGUgdGhpcy5jbHVzdGVyaW5nLGRlbGV0ZSB0aGlzLm1hbmlwdWxhdGlvbixkZWxldGUgdGhpcy5ub2Rlc0hhbmRsZXIsZGVsZXRlIHRoaXMuZWRnZXNIYW5kbGVyLGRlbGV0ZSB0aGlzLmNvbmZpZ3VyYXRvcixkZWxldGUgdGhpcy5pbWFnZXM7Zm9yKHZhciB0IGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkodCkmJmRlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF07Zm9yKHZhciBlIGluIHRoaXMuYm9keS5lZGdlcyl0aGlzLmJvZHkuZWRnZXMuaGFzT3duUHJvcGVydHkoZSkmJmRlbGV0ZSB0aGlzLmJvZHkuZWRnZXNbZV07cy5yZWN1cnNpdmVET01EZWxldGUodGhpcy5ib2R5LmNvbnRhaW5lcil9LG8ucHJvdG90eXBlLl91cGRhdGVWYWx1ZVJhbmdlPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dm9pZCAwLG89dm9pZCAwLG49MDtmb3IoZSBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoZSkpe3ZhciBzPXRbZV0uZ2V0VmFsdWUoKTt2b2lkIDAhPT1zJiYoaT12b2lkIDA9PT1pP3M6TWF0aC5taW4ocyxpKSxvPXZvaWQgMD09PW8/czpNYXRoLm1heChzLG8pLG4rPXMpfWlmKHZvaWQgMCE9PWkmJnZvaWQgMCE9PW8pZm9yKGUgaW4gdCl0Lmhhc093blByb3BlcnR5KGUpJiZ0W2VdLnNldFZhbHVlUmFuZ2UoaSxvLG4pfSxvLnByb3RvdHlwZS5pc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiF0aGlzLmFjdGl2YXRvcnx8dGhpcy5hY3RpdmF0b3IuYWN0aXZlfSxvLnByb3RvdHlwZS5zZXRTaXplPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLnNldFNpemUuYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuY2FudmFzVG9ET009ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuY2FudmFzVG9ET00uYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuRE9NdG9DYW52YXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jYW52YXMuRE9NdG9DYW52YXMuYXBwbHkodGhpcy5jYW52YXMsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZmluZE5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmZpbmROb2RlLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5pc0NsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmlzQ2x1c3Rlci5hcHBseSh0aGlzLmNsdXN0ZXJpbmcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUub3BlbkNsdXN0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLm9wZW5DbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5jbHVzdGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2x1c3RlcmluZy5jbHVzdGVyLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXROb2Rlc0luQ2x1c3Rlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuZ2V0Tm9kZXNJbkNsdXN0ZXIuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNsdXN0ZXJCeUNvbm5lY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJCeUNvbm5lY3Rpb24uYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNsdXN0ZXJCeUh1YnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jbHVzdGVyaW5nLmNsdXN0ZXJCeUh1YnNpemUuYXBwbHkodGhpcy5jbHVzdGVyaW5nLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmNsdXN0ZXJPdXRsaWVycz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNsdXN0ZXJpbmcuY2x1c3Rlck91dGxpZXJzLmFwcGx5KHRoaXMuY2x1c3RlcmluZyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRTZWVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGF5b3V0RW5naW5lLmdldFNlZWQuYXBwbHkodGhpcy5sYXlvdXRFbmdpbmUsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZW5hYmxlRWRpdE1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZW5hYmxlRWRpdE1vZGUuYXBwbHkodGhpcy5tYW5pcHVsYXRpb24sYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZGlzYWJsZUVkaXRNb2RlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmRpc2FibGVFZGl0TW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5hZGROb2RlTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5hZGROb2RlTW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5lZGl0Tm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5lZGl0Tm9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5lZGl0Tm9kZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gY29uc29sZS5sb2coXCJEZXByZWNhdGVkOiBQbGVhc2UgdXNlIGVkaXROb2RlIGluc3RlYWQgb2YgZWRpdE5vZGVNb2RlLlwiKSx0aGlzLm1hbmlwdWxhdGlvbi5lZGl0Tm9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5hZGRFZGdlTW9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbi5hZGRFZGdlTW9kZS5hcHBseSh0aGlzLm1hbmlwdWxhdGlvbixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5lZGl0RWRnZU1vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYW5pcHVsYXRpb24uZWRpdEVkZ2VNb2RlLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmRlbGV0ZVNlbGVjdGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFuaXB1bGF0aW9uLmRlbGV0ZVNlbGVjdGVkLmFwcGx5KHRoaXMubWFuaXB1bGF0aW9uLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFBvc2l0aW9ucz1mdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVzSGFuZGxlci5nZXRQb3NpdGlvbnMuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuc3RvcmVQb3NpdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIuc3RvcmVQb3NpdGlvbnMuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUubW92ZU5vZGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIubW92ZU5vZGUuYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Qm91bmRpbmdCb3g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2Rlc0hhbmRsZXIuZ2V0Qm91bmRpbmdCb3guYXBwbHkodGhpcy5ub2Rlc0hhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Q29ubmVjdGVkTm9kZXM9ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT90aGlzLm5vZGVzSGFuZGxlci5nZXRDb25uZWN0ZWROb2Rlcy5hcHBseSh0aGlzLm5vZGVzSGFuZGxlcixhcmd1bWVudHMpOnRoaXMuZWRnZXNIYW5kbGVyLmdldENvbm5lY3RlZE5vZGVzLmFwcGx5KHRoaXMuZWRnZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldENvbm5lY3RlZEVkZ2VzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZXNIYW5kbGVyLmdldENvbm5lY3RlZEVkZ2VzLmFwcGx5KHRoaXMubm9kZXNIYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnN0YXJ0U2ltdWxhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBoeXNpY3Muc3RhcnRTaW11bGF0aW9uLmFwcGx5KHRoaXMucGh5c2ljcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5zdG9wU2ltdWxhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBoeXNpY3Muc3RvcFNpbXVsYXRpb24uYXBwbHkodGhpcy5waHlzaWNzLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnN0YWJpbGl6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnBoeXNpY3Muc3RhYmlsaXplLmFwcGx5KHRoaXMucGh5c2ljcyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5nZXRTZWxlY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGlvbi5hcHBseSh0aGlzLnNlbGVjdGlvbkhhbmRsZXIsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuc2V0U2VsZWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZXRTZWxlY3Rpb24uYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNlbGVjdGVkTm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkTm9kZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNlbGVjdGVkRWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldE5vZGVBdD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXROb2RlQXQuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyk7cmV0dXJuIHZvaWQgMCE9PXQmJnZvaWQgMCE9PXQuaWQ/dC5pZDp0fSxvLnByb3RvdHlwZS5nZXRFZGdlQXQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0RWRnZUF0LmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpO3JldHVybiB2b2lkIDAhPT10JiZ2b2lkIDAhPT10LmlkP3QuaWQ6dH0sby5wcm90b3R5cGUuc2VsZWN0Tm9kZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdE5vZGVzLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5zZWxlY3RFZGdlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0RWRnZXMuYXBwbHkodGhpcy5zZWxlY3Rpb25IYW5kbGVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLnVuc2VsZWN0QWxsPWZ1bmN0aW9uKCl7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsLmFwcGx5KHRoaXMuc2VsZWN0aW9uSGFuZGxlcixhcmd1bWVudHMpLHRoaXMucmVkcmF3KCl9LG8ucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcmVyLnJlZHJhdy5hcHBseSh0aGlzLnJlbmRlcmVyLGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldFNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5nZXRTY2FsZS5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZ2V0Vmlld1Bvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmlldy5nZXRWaWV3UG9zaXRpb24uY
21167XBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmZpdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcuZml0LmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5tb3ZlVG89ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3Lm1vdmVUby5hcHBseSh0aGlzLnZpZXcsYXJndW1lbnRzKX0sby5wcm90b3R5cGUuZm9jdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWV3LmZvY3VzLmFwcGx5KHRoaXMudmlldyxhcmd1bWVudHMpfSxvLnByb3RvdHlwZS5yZWxlYXNlTm9kZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnZpZXcucmVsZWFzZU5vZGUuYXBwbHkodGhpcy52aWV3LGFyZ3VtZW50cyl9LG8ucHJvdG90eXBlLmdldE9wdGlvbnNGcm9tQ29uZmlndXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9e307cmV0dXJuIHRoaXMuY29uZmlndXJhdG9yJiYodD10aGlzLmNvbmZpZ3VyYXRvci5nZXRPcHRpb25zLmFwcGx5KHRoaXMuY29uZmlndXJhdG9yKSksdH0sdC5leHBvcnRzPW99LGZ1bmN0aW9uKHQsZSxpKXtcInVuZGVmaW5lZFwiIT10eXBlb2YgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEJiYoQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5jaXJjbGU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksdGhpcy5hcmModCxlLGksMCwyKk1hdGguUEksITEpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuc3F1YXJlPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLHRoaXMucmVjdCh0LWksZS1pLDIqaSwyKmkpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUudHJpYW5nbGU9ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksaSo9MS4xNSxlKz0uMjc1Kmk7dmFyIG89MippLG49by8yLHM9TWF0aC5zcXJ0KDMpLzYqbyxyPU1hdGguc3FydChvKm8tbipuKTt0aGlzLm1vdmVUbyh0LGUtKHItcykpLHRoaXMubGluZVRvKHQrbixlK3MpLHRoaXMubGluZVRvKHQtbixlK3MpLHRoaXMubGluZVRvKHQsZS0oci1zKSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS50cmlhbmdsZURvd249ZnVuY3Rpb24odCxlLGkpe3RoaXMuYmVnaW5QYXRoKCksaSo9MS4xNSxlLT0uMjc1Kmk7dmFyIG89MippLG49by8yLHM9TWF0aC5zcXJ0KDMpLzYqbyxyPU1hdGguc3FydChvKm8tbipuKTt0aGlzLm1vdmVUbyh0LGUrKHItcykpLHRoaXMubGluZVRvKHQrbixlLXMpLHRoaXMubGluZVRvKHQtbixlLXMpLHRoaXMubGluZVRvKHQsZSsoci1zKSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5zdGFyPWZ1bmN0aW9uKHQsZSxpKXt0aGlzLmJlZ2luUGF0aCgpLGkqPS44MixlKz0uMSppO2Zvcih2YXIgbz0wO288MTA7bysrKXt2YXIgbj1vJTI9PTA/MS4zKmk6LjUqaTt0aGlzLmxpbmVUbyh0K24qTWF0aC5zaW4oMipvKk1hdGguUEkvMTApLGUtbipNYXRoLmNvcygyKm8qTWF0aC5QSS8xMCkpfXRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZGlhbW9uZD1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKSx0aGlzLmxpbmVUbyh0LGUraSksdGhpcy5saW5lVG8odCtpLGUpLHRoaXMubGluZVRvKHQsZS1pKSx0aGlzLmxpbmVUbyh0LWksZSksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5yb3VuZFJlY3Q9ZnVuY3Rpb24odCxlLGksbyxuKXt2YXIgcz1NYXRoLlBJLzE4MDtpLTIqbjwwJiYobj1pLzIpLG8tMipuPDAmJihuPW8vMiksdGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyh0K24sZSksdGhpcy5saW5lVG8odCtpLW4sZSksdGhpcy5hcmModCtpLW4sZStuLG4sMjcwKnMsMzYwKnMsITEpLHRoaXMubGluZVRvKHQraSxlK28tbiksdGhpcy5hcmModCtpLW4sZStvLW4sbiwwLDkwKnMsITEpLHRoaXMubGluZVRvKHQrbixlK28pLHRoaXMuYXJjKHQrbixlK28tbixuLDkwKnMsMTgwKnMsITEpLHRoaXMubGluZVRvKHQsZStuKSx0aGlzLmFyYyh0K24sZStuLG4sMTgwKnMsMjcwKnMsITEpLHRoaXMuY2xvc2VQYXRoKCl9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuZWxsaXBzZV92aXM9ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49aS8yKi41NTIyODQ4LHM9by8yKi41NTIyODQ4LHI9dCtpLGE9ZStvLGg9dCtpLzIsZD1lK28vMjt0aGlzLmJlZ2luUGF0aCgpLHRoaXMubW92ZVRvKHQsZCksdGhpcy5iZXppZXJDdXJ2ZVRvKHQsZC1zLGgtbixlLGgsZSksdGhpcy5iZXppZXJDdXJ2ZVRvKGgrbixlLHIsZC1zLHIsZCksdGhpcy5iZXppZXJDdXJ2ZVRvKHIsZCtzLGgrbixhLGgsYSksdGhpcy5iZXppZXJDdXJ2ZVRvKGgtbixhLHQsZCtzLHQsZCksdGhpcy5jbG9zZVBhdGgoKX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5kYXRhYmFzZT1mdW5jdGlvbih0LGUsaSxvKXt2YXIgbj1pLHM9byooMS8zKSxyPW4vMiouNTUyMjg0OCxhPXMvMiouNTUyMjg0OCxoPXQrbixkPWUrcyxsPXQrbi8yLHU9ZStzLzIsYz1lKyhvLXMvMikscD1lK287dGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyhoLHUpLHRoaXMuYmV6aWVyQ3VydmVUbyhoLHUrYSxsK3IsZCxsLGQpLHRoaXMuYmV6aWVyQ3VydmVUbyhsLXIsZCx0LHUrYSx0LHUpLHRoaXMuYmV6aWVyQ3VydmVUbyh0LHUtYSxsLXIsZSxsLGUpLHRoaXMuYmV6aWVyQ3VydmVUbyhsK3IsZSxoLHUtYSxoLHUpLHRoaXMubGluZVRvKGgsYyksdGhpcy5iZXppZXJDdXJ2ZVRvKGgsYythLGwrcixwLGwscCksdGhpcy5iZXppZXJDdXJ2ZVRvKGwtcixwLHQsYythLHQsYyksdGhpcy5saW5lVG8odCx1KX0sQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJELnByb3RvdHlwZS5kYXNoZWRMaW5lPWZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5iZWdpblBhdGgoKSx0aGlzLm1vdmVUbyh0LGUpO2Zvcih2YXIgcz1uLmxlbmd0aCxyPWktdCxhPW8tZSxoPWEvcixkPU1hdGguc3FydChyKnIrYSphKSxsPTAsdT0hMCxjPTAscD1uWzBdO2Q+PS4xOylwPW5bbCsrJXNdLHA+ZCYmKHA9ZCksYz1NYXRoLnNxcnQ
21167ocCpwLygxK2gqaCkpLGM9cjwwPy1jOmMsdCs9YyxlKz1oKmMsITA9PT11P3RoaXMubGluZVRvKHQsZSk6dGhpcy5tb3ZlVG8odCxlKSxkLT1wLHU9IXV9LENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRC5wcm90b3R5cGUuaGV4YWdvbj1mdW5jdGlvbih0LGUsaSl7dGhpcy5iZWdpblBhdGgoKTt2YXIgbz0yKk1hdGguUEkvNjt0aGlzLm1vdmVUbyh0K2ksZSk7Zm9yKHZhciBuPTE7bjw2O24rKyl0aGlzLmxpbmVUbyh0K2kqTWF0aC5jb3MobypuKSxlK2kqTWF0aC5zaW4obypuKSk7dGhpcy5jbG9zZVBhdGgoKX0pfSxmdW5jdGlvbih0LGUsaSl7ZS5lbj17ZWRpdDpcIkVkaXRcIixkZWw6XCJEZWxldGUgc2VsZWN0ZWRcIixiYWNrOlwiQmFja1wiLGFkZE5vZGU6XCJBZGQgTm9kZVwiLGFkZEVkZ2U6XCJBZGQgRWRnZVwiLGVkaXROb2RlOlwiRWRpdCBOb2RlXCIsZWRpdEVkZ2U6XCJFZGl0IEVkZ2VcIixhZGREZXNjcmlwdGlvbjpcIkNsaWNrIGluIGFuIGVtcHR5IHNwYWNlIHRvIHBsYWNlIGEgbmV3IG5vZGUuXCIsZWRnZURlc2NyaXB0aW9uOlwiQ2xpY2sgb24gYSBub2RlIGFuZCBkcmFnIHRoZSBlZGdlIHRvIGFub3RoZXIgbm9kZSB0byBjb25uZWN0IHRoZW0uXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIkNsaWNrIG9uIHRoZSBjb250cm9sIHBvaW50cyBhbmQgZHJhZyB0aGVtIHRvIGEgbm9kZSB0byBjb25uZWN0IHRvIGl0LlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIkNhbm5vdCBsaW5rIGVkZ2VzIHRvIGEgY2x1c3Rlci5cIixkZWxldGVDbHVzdGVyRXJyb3I6XCJDbHVzdGVycyBjYW5ub3QgYmUgZGVsZXRlZC5cIixlZGl0Q2x1c3RlckVycm9yOlwiQ2x1c3RlcnMgY2Fubm90IGJlIGVkaXRlZC5cIn0sZS5lbl9FTj1lLmVuLGUuZW5fVVM9ZS5lbixlLmRlPXtlZGl0OlwiRWRpdGllcmVuXCIsZGVsOlwiTMODwrZzY2hlIEF1c3dhaGxcIixiYWNrOlwiWnVyw4PCvGNrXCIsYWRkTm9kZTpcIktub3RlbiBoaW56dWbDg8K8Z2VuXCIsYWRkRWRnZTpcIkthbnRlIGhpbnp1ZsODwrxnZW5cIixlZGl0Tm9kZTpcIktub3RlbiBlZGl0aWVyZW5cIixlZGl0RWRnZTpcIkthbnRlIGVkaXRpZXJlblwiLGFkZERlc2NyaXB0aW9uOlwiS2xpY2tlIGF1ZiBlaW5lIGZyZWllIFN0ZWxsZSwgdW0gZWluZW4gbmV1ZW4gS25vdGVuIHp1IHBsYXppZXJlbi5cIixlZGdlRGVzY3JpcHRpb246XCJLbGlja2UgYXVmIGVpbmVuIEtub3RlbiB1bmQgemllaGUgZGllIEthbnRlIHp1IGVpbmVtIGFuZGVyZW4gS25vdGVuLCB1bSBkaWVzZSB6dSB2ZXJiaW5kZW4uXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIktsaWNrZSBhdWYgZGllIFZlcmJpbmR1bmdzcHVua3RlIHVuZCB6aWVoZSBkaWVzZSBhdWYgZWluZW4gS25vdGVuLCB1bSBzaWUgenUgdmVyYmluZGVuLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIkVzIGlzdCBuaWNodCBtw4PCtmdsaWNoLCBLYW50ZW4gbWl0IENsdXN0ZXJuIHp1IHZlcmJpbmRlbi5cIixkZWxldGVDbHVzdGVyRXJyb3I6XCJDbHVzdGVyIGvDg8K2bm5lbiBuaWNodCBnZWzDg8K2c2NodCB3ZXJkZW4uXCIsZWRpdENsdXN0ZXJFcnJvcjpcIkNsdXN0ZXIga8ODwrZubmVuIG5pY2h0IGVkaXRpZXJ0IHdlcmRlbi5cIn0sZS5kZV9ERT1lLmRlLGUuZXM9e2VkaXQ6XCJFZGl0YXJcIixkZWw6XCJFbGltaW5hciBzZWxlY2Npw4PCs25cIixiYWNrOlwiw4PCgXRyYXNcIixhZGROb2RlOlwiQcODwrFhZGlyIG5vZG9cIixhZGRFZGdlOlwiQcODwrFhZGlyIGFyaXN0YVwiLGVkaXROb2RlOlwiRWRpdGFyIG5vZG9cIixlZGl0RWRnZTpcIkVkaXRhciBhcmlzdGFcIixhZGREZXNjcmlwdGlvbjpcIkhhZ2EgY2xpYyBlbiB1biBsdWdhciB2YWPDg8KtbyBwYXJhIGNvbG9jYXIgdW4gbnVldm8gbm9kby5cIixlZGdlRGVzY3JpcHRpb246XCJIYWdhIGNsaWMgZW4gdW4gbm9kbyB5IGFycmFzdHJlIGxhIGFyaXN0YSBoYWNpYSBvdHJvIG5vZG8gcGFyYSBjb25lY3Rhcmxvcy5cIixlZGl0RWRnZURlc2NyaXB0aW9uOlwiSGFnYSBjbGljIGVuIHVuIHB1bnRvIGRlIGNvbnRyb2wgeSBhcnJhc3RyZWxvIGEgdW4gbm9kbyBwYXJhIGNvbmVjdGFybG8uXCIsY3JlYXRlRWRnZUVycm9yOlwiTm8gc2UgcHVlZGUgY29uZWN0YXIgdW5hIGFyaXN0YSBhIHVuIGdydXBvLlwiLGRlbGV0ZUNsdXN0ZXJFcnJvcjpcIk5vIGVzIHBvc2libGUgZWxpbWluYXIgZ3J1cG9zLlwiLGVkaXRDbHVzdGVyRXJyb3I6XCJObyBlcyBwb3NpYmxlIGVkaXRhciBncnVwb3MuXCJ9LGUuZXNfRVM9ZS5lcyxlLml0PXtlZGl0OlwiTW9kaWZpY2FcIixkZWw6XCJDYW5jZWxsYSBsYSBzZWxlemlvbmVcIixiYWNrOlwiSW5kaWV0cm9cIixhZGROb2RlOlwiQWdnaXVuZ2kgdW4gbm9kb1wiLGFkZEVkZ2U6XCJBZ2dpdW5naSB1biB2ZXJ0aWNlXCIsZWRpdE5vZGU6XCJNb2RpZmljYSBpbCBub2RvXCIsZWRpdEVkZ2U6XCJNb2RpZmljYSBpbCB2ZXJ0aWNlXCIsYWRkRGVzY3JpcHRpb246XCJDbGljY2EgcGVyIGFnZ2l1bmdlcmUgdW4gbnVvdm8gbm9kb1wiLGVkZ2VEZXNjcmlwdGlvbjpcIkNsaWNjYSBzdSB1biBub2RvIGUgdHJhc2NpbmFsbyBhZCB1biBhbHRybyBub2RvIHBlciBjb25uZXR0ZXJsaS5cIixlZGl0RWRnZURlc2NyaXB0aW9uOlwiQ2xpY2NhIHN1aSBQdW50aSBkaSBjb250cm9sbG8gZSB0cmFzY2luYWxpIGFkIHVuIG5vZG8gcGVyIGNvbm5ldHRlcmxpLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIk5vbiBzaSBwb3Nzb25vIGNvbGxlZ2FyZSB2ZXJ0aWNpIGFkIHVuIGNsdXN0ZXJcIixkZWxldGVDbHVzdGVyRXJyb3I6XCJJIGNsdXN0ZXIgbm9uIHBvc3Nvbm8gZXNzZXJlIGNhbmNlbGxhdGlcIixlZGl0Q2x1c3RlckVycm9yOlwiSSBjbHVzdGVycyBub24gcG9zc29ubyBlc3NlcmUgbW9kaWZpY2F0aS5cIn0sZS5pdF9JVD1lLml0LGUubmw9e2VkaXQ6XCJXaWp6aWdlblwiLGRlbDpcIlNlbGVjdGllIHZlcndpamRlcmVuXCIsYmFjazpcIlRlcnVnXCIsYWRkTm9kZTpcIk5vZGUgdG9ldm9lZ2VuXCIsYWRkRWRnZTpcIkxpbmsgdG9ldm9lZ2VuXCIsZWRpdE5vZGU6XCJOb2RlIHdpanppZ2VuXCIsZWRpdEVkZ2U6XCJMaW5rIHdpanppZ2VuXCIsYWRkRGVzY3JpcHRpb246XCJLbGlrIG9wIGVlbiBsZWVnIGdlYmllZCBvbSBlZW4gbmlldXdlIG5vZGUgdGUgbWFrZW4uXCIsZWRnZURlc2NyaXB0aW9uOlwiS2xpayBvcCBlZW4gbm9kZSBlbiBzbGVlcCBkZSBsaW5rIG5hYXIgZWVuIGFuZGVyZSBub2RlIG9tIHplIHRlIHZlcmJpbmRlbi5cIixlZGl0RWRnZURlc2NyaXB0aW9uOlwiS2xpayBvcCBkZSB2ZXJiaW5kaW5nc3B1bnRlbiBlbiBzbGVlcCB6ZSBuYWFyIGVlbiBub2RlIG9tIGRhYXJtZWUgdGUgdmVyYmluZGVuLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIkthbiBnZWVuIGxpbmsgbWFrZW4gbmFhciBlZW4gY2x1c3Rlci5cIixkZWxldGVDbHVzdGVyRXJyb3I6XCJDbHVzdGVycyBrdW5uZW4gbmlldCB3b3JkZW4gdmVyd2lqZGVyZC5cIixlZGl0Q2x1c3RlckVycm9yOlwiQ2x1c3RlcnMga3VubmVuIG5pZXQgd29yZGVuIGFhbmdlcGFzdC5cIn0sZS5ubF9OTD1lLm5sLGUubmxfQkU9ZS5ubCxlW1wicHQtYnJcIl09e2VkaXQ6XCJFZGl0YXJcIixkZWw6XCJSZW1vdmVyIHNlbGVjaW9uYWRvXCIsYmFjazpcIlZvbHRhclwiLGFkZE5vZGU6XCJBZGljaW9uYXIgbsODwrNcIixhZGRFZGdlOlwiQWRpY2lvbmFyIGFyZXN0YVwiLGVkaXROb2RlOlwiRWRpdGFyIG7Dg8KzXCIsZWRpdEVkZ2U6XCJFZGl0YXIgYXJlc3RhXCIsYWRkRGVzY3JpcHRpb246XCJDbGlxdWUgZW0gdW0gZXNwYcODwqdvIGVtIGJyYW5jbyBwYXJhIGFkaWNpb25hciB1bSBub3ZvIG7Dg8KzXCIsZWRnZURlc2NyaXB0aW9uOlwiQ2xpcXVlIGVtIHVtIG7Dg8KzIGUgYXJyYXN0ZSBhIGFyZXN0YSBhdMODwqkgb3V0cm8gbsODwrMgcGFyYSBjb25lY3TDg8KhLWxvc1wiLGVkaXRFZGdlRGVzY3JpcHRpb246XCJDbGlxdWUgbm9zIHBvbnRvcyBkZSBjb250cm9sZSBlIG9zIGFycmFzdGUgcGFyYSB1bSBuw4PCsyBwYXJhIGNvbmVjdMODwqEtbG9zXCIsY3JlYXRlRWRnZUVycm9yOlwiT
21167sODwqNvIGZvaSBwb3Nzw4PCrXZlbCBsaW5rYXIgYXJlc3RhcyBhIHVtIGNsdXN0ZXIuXCIsZGVsZXRlQ2x1c3RlckVycm9yOlwiQ2x1c3RlcnMgbsODwqNvIHB1ZGVyYW0gc2VyIHJlbW92aWRvcy5cIixlZGl0Q2x1c3RlckVycm9yOlwiQ2x1c3RlcnMgbsODwqNvIHB1ZGVyYW0gc2VyIGVkaXRhZG9zLlwifSxlW1wicHQtQlJcIl09ZVtcInB0LWJyXCJdLGUucHRfQlI9ZVtcInB0LWJyXCJdLGUucHRfYnI9ZVtcInB0LWJyXCJdLGUucnU9e2VkaXQ6XCLDkCDDkMK1w5DCtMOQwrDDkMK6w5HigJrDkMK4w5HigqzDkMK+w5DCssOQwrDDkeKAmsORxZJcIixkZWw6XCLDkMKjw5DCtMOQwrDDkMK7w5DCuMOR4oCaw5HFkiDDkMKyw5HigLnDkMKxw5HigqzDkMKww5DCvcOQwr3DkMK+w5DCtVwiLGJhY2s6XCLDkMKdw5DCsMOQwrfDkMKww5DCtFwiLGFkZE5vZGU6XCLDkOKAncOQwr7DkMKxw5DCsMOQwrLDkMK4w5HigJrDkcWSIMORxpLDkMK3w5DCtcOQwrtcIixhZGRFZGdlOlwiw5DigJ3DkMK+w5DCscOQwrDDkMKyw5DCuMOR4oCaw5HFkiDDkeKCrMOQwrXDkMKxw5HigqzDkMK+XCIsZWRpdE5vZGU6XCLDkCDDkMK1w5DCtMOQwrDDkMK6w5HigJrDkMK4w5HigqzDkMK+w5DCssOQwrDDkeKAmsORxZIgw5HGksOQwrfDkMK1w5DCu1wiLGVkaXRFZGdlOlwiw5Agw5DCtcOQwrTDkMKww5DCusOR4oCaw5DCuMOR4oKsw5DCvsOQwrLDkMKww5HigJrDkcWSIMOR4oKsw5DCtcOQwrHDkeKCrMOQwr5cIixhZGREZXNjcmlwdGlvbjpcIsOQxaHDkMK7w5DCuMOQwrrDkMK9w5DCuMOR4oCaw5DCtSDDkMKyIMORwoHDkMKyw5DCvsOQwrHDkMK+w5DCtMOQwr3DkMK+w5DCtSDDkMK8w5DCtcORwoHDkeKAmsOQwr4sIMOR4oChw5HigJrDkMK+w5DCscOR4oC5IMOQwrTDkMK+w5DCscOQwrDDkMKyw5DCuMOR4oCaw5HFkiDDkMK9w5DCvsOQwrLDkeKAucOQwrkgw5HGksOQwrfDkMK1w5DCuy5cIixlZGdlRGVzY3JpcHRpb246XCLDkMWhw5DCu8OQwrjDkMK6w5DCvcOQwrjDkeKAmsOQwrUgw5DCvcOQwrAgw5HGksOQwrfDkMK1w5DCuyDDkMK4IMOQwr/DkeKCrMOQwr7DkeKAmsORwo/DkMK9w5DCuMOR4oCaw5DCtSDDkeKCrMOQwrXDkMKxw5HigqzDkMK+IMOQwrogw5DCtMOR4oKsw5HGksOQwrPDkMK+w5DCvMORxpIgw5HGksOQwrfDkMK7w5HGkiwgw5HigKHDkeKAmsOQwr7DkMKxw5HigLkgw5HCgcOQwr7DkMK1w5DCtMOQwrjDkMK9w5DCuMOR4oCaw5HFkiDDkMK4w5HigKYuXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIsOQxaHDkMK7w5DCuMOQwrrDkMK9w5DCuMOR4oCaw5DCtSDDkMK9w5DCsCDDkMK6w5DCvsOQwr3DkeKAmsOR4oKsw5DCvsOQwrvDkcWSw5DCvcOR4oC5w5DCtSDDkeKAmsOQwr7DkeKAocOQwrrDkMK4IMOQwrggw5DCv8OQwrXDkeKCrMOQwrXDkeKAmsOQwrDDkeKAsMOQwrjDkeKAmsOQwrUgw5DCuMOR4oCmIMOQwrIgw5HGksOQwrfDkMK1w5DCuywgw5HigKHDkeKAmsOQwr7DkMKxw5HigLkgw5DCv8OQwr7DkMK0w5DCusOQwrvDkcW9w5HigKHDkMK4w5HigJrDkcWSw5HCgcORwo8gw5DCuiDDkMK9w5DCtcOQwrzDkcaSLlwiLGNyZWF0ZUVkZ2VFcnJvcjpcIsOQwp3DkMK1w5DCssOQwr7DkMK3w5DCvMOQwr7DkMK2w5DCvcOQwr4gw5HCgcOQwr7DkMK1w5DCtMOQwrjDkMK9w5DCuMOR4oCaw5HFkiDDkeKCrMOQwrXDkMKxw5HigqzDkMKwIMOQwrIgw5DCusOQwrvDkMKww5HCgcOR4oCaw5DCtcOR4oKsLlwiLGRlbGV0ZUNsdXN0ZXJFcnJvcjpcIsOQxaHDkMK7w5DCsMORwoHDkeKAmsOQwrXDkeKCrMOR4oC5IMOQwr3DkMK1IMOQwrzDkMK+w5DCs8ORxpLDkeKAmiDDkMKxw5HigLnDkeKAmsORxZIgw5HGksOQwrTDkMKww5DCu8OQwrXDkMK9w5HigLlcIixlZGl0Q2x1c3RlckVycm9yOlwiw5DFocOQwrvDkMKww5HCgcOR4oCaw5DCtcOR4oKsw5HigLkgw5DCvcOQwrXDkMK0w5DCvsORwoHDkeKAmsORxpLDkMK/w5DCvcOR4oC5IMOQwrTDkMK7w5HCjyDDkeKCrMOQwrXDkMK0w5DCsMOQwrrDkeKAmsOQwrjDkeKCrMOQwr7DkMKyw5DCsMOQwr3DkMK4w5HCjy5cIn0sZS5ydV9SVT1lLnJ1LGUuY249e2VkaXQ6XCLDp8K84oCTw6jCvuKAmFwiLGRlbDpcIsOly4Ygw6nihKLCpMOp4oKs4oCww6XCrsWhXCIsYmFjazpcIsOowr/igJ3DpeKAusW+XCIsYWRkTm9kZTpcIsOmwrfCu8OlxaAgw6jFoOKAmsOn4oCawrlcIixhZGRFZGdlOlwiw6bCt8K7w6XFoCDDqMK/xb7DpsW9wqXDp8K6wr9cIixlZGl0Tm9kZTpcIsOnwrzigJPDqMK+4oCYw6jFoOKAmsOn4oCawrlcIixlZGl0RWRnZTpcIsOnwrzigJPDqMK+4oCYw6jCv8W+w6bFvcKlw6fCusK/XCIsYWRkRGVzY3JpcHRpb246XCLDpcKN4oCiw6XigKHCu8OnwqnCusOn4oSiwr3DpcKk4oCew6bigJ3CvsOnwr3CrsOm4oCTwrDDqMWg4oCaw6figJrCucOj4oKs4oCaXCIsZWRnZURlc2NyaXB0aW9uOlwiw6XCjeKAosOl4oChwrvDpsW4wpDDpMK4wqrDqMWg4oCaw6figJrCucOlwrnCtsOlwrDigKDDqMKvwqXDqMK/xb7DpsW9wqXDp8K6wr/DpuKAueKAk8OlxaDCqMOly4bCsMOlwo/CpsOkwrjigqzDpMK4wqrDqMWg4oCaw6figJrCucOkwrvCpcOowr/FvsOmxb3CpcOlwq7GksOkwrvCrMOj4oKs4oCaXCIsZWRpdEVkZ2VEZXNjcmlwdGlvbjpcIsOlwo3igKLDpeKAocK7w6bFvcKnw6XLhsK2w6jFoOKAmsOn4oCawrnDpcK5wrbDpcKw4oCgw6XCrsaSw6TCu8Ksw6bigLnigJPDpcuGwrDDqMWg4oCaw6figJrCucOkwrjFoMOowr/FvsOmxb3CpcOj4oKs4oCaXCIsY3JlYXRlRWRnZUVycm9yOlwiw6bigJQgw6bCs+KAosOlwrDigKDDqMK/xb7DpsW9wqXDp8K6wr/DqMK/xb7DpsW9wqXDpcuGwrDDp8K+wqTDqeKAuuKAoMOj4oKs4oCaXCIsZGVsZXRlQ2x1c3RlckVycm9yOlwiw6bigJQgw6bCs+KAosOly4Ygw6nihKLCpMOnwr7CpMOp4oC64oCgw6PigqzigJpcIixlZGl0Q2x1c3RlckVycm9yOlwiw6bigJQgw6bCs+KAosOnwrzigJPDqMK+4oCYw6fCvsKkw6nigLrigKDDo+KCrOKAmlwifSxlLnpoX0NOPWUuY259LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZh
21167dWx0KSh0aGlzLHQpLHRoaXMuTlVNX0lURVJBVElPTlM9NCx0aGlzLmltYWdlPW5ldyBJbWFnZSx0aGlzLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcImluaXRcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmluaXRpYWxpemVkKCkpe3RoaXMuc3JjPXRoaXMuaW1hZ2Uuc3JjO3ZhciB0PXRoaXMuaW1hZ2Uud2lkdGgsZT10aGlzLmltYWdlLmhlaWdodDt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZTt2YXIgaT1NYXRoLmZsb29yKGUvMiksbz1NYXRoLmZsb29yKGUvNCksbj1NYXRoLmZsb29yKGUvOCkscz1NYXRoLmZsb29yKGUvMTYpLHI9TWF0aC5mbG9vcih0LzIpLGE9TWF0aC5mbG9vcih0LzQpLGg9TWF0aC5mbG9vcih0LzgpLGQ9TWF0aC5mbG9vcih0LzE2KTt0aGlzLmNhbnZhcy53aWR0aD0zKmEsdGhpcy5jYW52YXMuaGVpZ2h0PWksdGhpcy5jb29yZGluYXRlcz1bWzAsMCxyLGldLFtyLDAsYSxvXSxbcixvLGgsbl0sWzUqaCxvLGQsc11dLHRoaXMuX2ZpbGxNaXBNYXAoKX19fSx7a2V5OlwiaW5pdGlhbGl6ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDAhPT10aGlzLmNvb3JkaW5hdGVzfX0se2tleTpcIl9maWxsTWlwTWFwXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmNhbnZhcy5nZXRDb250ZXh0KFwiMmRcIiksZT10aGlzLmNvb3JkaW5hdGVzWzBdO3QuZHJhd0ltYWdlKHRoaXMuaW1hZ2UsZVswXSxlWzFdLGVbMl0sZVszXSk7Zm9yKHZhciBpPTE7aTx0aGlzLk5VTV9JVEVSQVRJT05TO2krKyl7dmFyIG89dGhpcy5jb29yZGluYXRlc1tpLTFdLG49dGhpcy5jb29yZGluYXRlc1tpXTt0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxvWzBdLG9bMV0sb1syXSxvWzNdLG5bMF0sblsxXSxuWzJdLG5bM10pfX19LHtrZXk6XCJkcmF3SW1hZ2VBdFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe2lmKHRoaXMuaW5pdGlhbGl6ZWQoKSlpZihlPjIpe2UqPS41O2Zvcih2YXIgcj0wO2U+MiYmcjx0aGlzLk5VTV9JVEVSQVRJT05TOyllKj0uNSxyKz0xO3I+PXRoaXMuTlVNX0lURVJBVElPTlMmJihyPXRoaXMuTlVNX0lURVJBVElPTlMtMSk7dmFyIGE9dGhpcy5jb29yZGluYXRlc1tyXTt0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxhWzBdLGFbMV0sYVsyXSxhWzNdLGksbyxuLHMpfWVsc2UgdC5kcmF3SW1hZ2UodGhpcy5pbWFnZSxpLG8sbixzKX19XSksdH0oKTtlLmRlZmF1bHQ9aH0sZnVuY3Rpb24odCxlLGkpe1xuICAgIGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDIpLGQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuY2xlYXIoKSx0aGlzLmRlZmF1bHRJbmRleD0wLHRoaXMuZ3JvdXBzQXJyYXk9W10sdGhpcy5ncm91cEluZGV4PTAsdGhpcy5kZWZhdWx0R3JvdXBzPVt7Ym9yZGVyOlwiIzJCN0NFOVwiLGJhY2tncm91bmQ6XCIjOTdDMkZDXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjMkI3Q0U5XCIsYmFja2dyb3VuZDpcIiNEMkU1RkZcIn0saG92ZXI6e2JvcmRlcjpcIiMyQjdDRTlcIixiYWNrZ3JvdW5kOlwiI0QyRTVGRlwifX0se2JvcmRlcjpcIiNGRkE1MDBcIixiYWNrZ3JvdW5kOlwiI0ZGRkYwMFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0ZGQTUwMFwiLGJhY2tncm91bmQ6XCIjRkZGRkEzXCJ9LGhvdmVyOntib3JkZXI6XCIjRkZBNTAwXCIsYmFja2dyb3VuZDpcIiNGRkZGQTNcIn19LHtib3JkZXI6XCIjRkEwQTEwXCIsYmFja2dyb3VuZDpcIiNGQjdFODFcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGQTBBMTBcIixiYWNrZ3JvdW5kOlwiI0ZGQUZCMVwifSxob3Zlcjp7Ym9yZGVyOlwiI0ZBMEExMFwiLGJhY2tncm91bmQ6XCIjRkZBRkIxXCJ9fSx7Ym9yZGVyOlwiIzQxQTkwNlwiLGJhY2tncm91bmQ6XCIjN0JFMTQxXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjNDFBOTA2XCIsYmFja2dyb3VuZDpcIiNBMUVDNzZcIn0saG92ZXI6e2JvcmRlcjpcIiM0MUE5MDZcIixiYWNrZ3JvdW5kOlwiI0ExRUM3NlwifX0se2JvcmRlcjpcIiNFMTI5RjBcIixiYWNrZ3JvdW5kOlwiI0VCN0RGNFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0UxMjlGMFwiLGJhY2tncm91bmQ6XCIjRjBCM0Y1XCJ9LGhvdmVyOntib3JkZXI6XCIjRTEyOUYwXCIsYmFja2dyb3VuZDpcIiNGMEIzRjVcIn19LHtib3JkZXI6XCIjN0MyOUYwXCIsYmFja2dyb3VuZDpcIiNBRDg1RTRcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiM3QzI5RjBcIixiYWNrZ3JvdW5kOlwiI0QzQkRGMFwifSxob3Zlcjp7Ym9yZGVyOlwiIzdDMjlGMFwiLGJhY2tncm91bmQ6XCIjRDNCREYwXCJ9fSx7Ym9yZGVyOlwiI0MzN0YwMFwiLGJhY2tncm91bmQ6XCIjRkZBODA3XCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjQzM3RjAwXCIsYmFja2dyb3VuZDpcIiNGRkNBNjZcIn0saG92ZXI6e2JvcmRlcjpcIiNDMzdGMDBcIixiYWNrZ3JvdW5kOlwiI0ZGQ0E2NlwifX0se2JvcmRlcjpcIiM0MjIwRkJcIixiYWNrZ3JvdW5kOlwiIzZFNkVGRFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzQyMjBGQlwiLGJhY2tncm91bmQ6XCIjOUI5QkZEXCJ9LGhvdmVyOntib3JkZXI6XCIjNDIyMEZCXCIsYmFja2dyb3VuZDpcIiM5QjlCRkRcIn19LHtib3JkZXI6XCIjRkQ1QTc3XCIsYmFja2dyb3VuZDpcIiNGRkMwQ0JcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGRDVBNzdcIixiYWNrZ3JvdW5kOlwiI0ZGRDFEOVwifSxob3Zlcjp7Ym9yZGVyOlwiI0ZENUE3N1wiLGJhY2tncm91bmQ6XCIjRkZEMUQ5XCJ9fSx7Ym9yZGVyOlwiIzRBRDYzQVwiLGJhY2tncm91bmQ6XCIjQzJGQUJDXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjNEFENjNBXCIsYmFja2dyb3VuZDpcIiNFNkZGRTNcIn0saG92ZXI6e2JvcmRlcjpcIiM0QUQ2M0FcIixiYWNrZ3JvdW5kOlwiI0U2RkZFM1wifX0se2JvcmRlcjpcIiM5OTAwMDBcIixiYWNrZ3JvdW5kOlwiI0VFMDAwMFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0JCMDAwMFwiLGJhY2tncm91bmQ6XCIjRkYzMzMzXCJ9LGhvdmVyOntib3JkZXI6XCIjQkIwMDAwXCIsYmFja2dyb3VuZDpcIiNGRjMzMzNcIn19LHtib3JkZXI6XCIjRkY2MDAwXCIsYmFja2dyb3VuZDpcIiNGRjYwMDBcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGRjYwMDBcIixiYWNrZ3JvdW5kOlwiI0ZGNjAwMFwifSxob3Zlcjp7Ym9yZGVyOlwiI0ZGNjAwMFwiLGJhY2tncm91bmQ6XCIjRkY2MDAwXCJ9fSx7Ym9yZGVyOlwiIzk3QzJGQ1wiLGJhY2tncm91bmQ6XCIjMkI3Q0U5XCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjRDJFNUZGXCIsYmFja2dyb3VuZDpcIiMyQjdDRTlcIn0saG92ZXI6e2JvcmRlcjpcIiNEMkU1RkZcIixiYWNrZ3JvdW5kOlwiIzJCN0NFOVwifX0se2JvcmRlcjpcIiMzOTk2MDVcIixiYWNrZ3JvdW5kOlwiIzI1NUMwM1wiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzM5OTYwNVwiLGJhY2tncm91bmQ6XCIjMjU1QzAzXCJ9LGhvdmVyOntib3JkZXI6XCIjMzk5NjA1XCIsYmFja2dyb3VuZDpcIiMyNTVDMDNcIn19LHtib3JkZXI6XCIjQjcwMDU0XCIsYmFja2dyb3VuZDpcIiNGRjAwN0VcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNCNzAwNTRcIixiYWNrZ3JvdW5kOlwiI0ZGMDA3RVwifSxob3Zlcjp7Ym9yZGVyOlwiI0I3MDA1NFwiLGJhY2tncm91bmQ6XCIjRkYwMDdFXCJ9fSx7Ym9yZGVyOlwiI0FEODVFNFwiLGJhY2tncm91bmQ6XCIjN0MyOUYwXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjRDNCREYwXCIsYmFja2dyb3VuZDpcIiM3QzI5RjBcIn0saG92ZXI6e2JvcmRlcjpcIiNEM0JERjBcIixiYWNrZ3JvdW5kOlwiIzdDMjlGMFwifX0se2JvcmRlcjpcIiM0NTU3RkFcIixiYWNrZ3JvdW5kOlwiIzAwMEVBMVwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzZFNkVGRFwiLGJhY2tncm91bmQ6XCIjMDAwRUExXCJ9LGhvdmVyOntib3JkZXI6XCIjNkU2RUZEXCIsYmFja2dyb3VuZDpcIiMwMDBFQTFcIn19LHtib3JkZXI6XCIjRkZDMENCXCIsYmFja2dyb3VuZDpcIiNGRDVBNzdcIixoaWdobGlnaHQ6e2JvcmRlcjpcIiNGRkQxRDlcIixiYWNrZ3JvdW5kOlwiI0ZENUE3N1wifSxob3Zlcjp7Ym9yZGVyOlwiI0ZGRDFEOVwiLGJhY2tncm91bmQ6XCIjRkQ1QTc3XCJ9fSx7Ym9yZGVyOlwiI0MyRkFCQ1wiLGJhY2tncm91bmQ6XCIjNzRENjZBXCIsaGlnaGxpZ2h0Ontib3JkZXI6XCIjRTZGRkUzXCIsYmFja2dyb3VuZDpcIiM3NEQ2NkFcIn0saG92ZXI6e2JvcmRlcjpcIiNFNkZGRTNcIixiYWNrZ3JvdW5kOlwiIzc0RDY2QVwifX0se2JvcmRlcjpcIiNFRTAwMDBcIixiYWNrZ3JvdW5kOlwiIzk5MDAwMFwiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiI0ZGMzMzM1wiLGJhY2tncm91bmQ6XCIjQkIwMDAwXCJ9LGhvdmVyOntib3JkZXI6XCIjRkYzMzMzXCIsYmFja2dyb3VuZDpcIiNCQjAwMDBcIn19XSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZh
21167dWx0T3B0aW9ucz17dXNlRGVmYXVsdEdyb3VwczohMH0saC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXCJ1c2VEZWZhdWx0R3JvdXBzXCJdO2lmKHZvaWQgMCE9PXQpZm9yKHZhciBpIGluIHQpaWYodC5oYXNPd25Qcm9wZXJ0eShpKSYmLTE9PT1lLmluZGV4T2YoaSkpe3ZhciBvPXRbaV07dGhpcy5hZGQoaSxvKX19fSx7a2V5OlwiY2xlYXJcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuZ3JvdXBzPXt9LHRoaXMuZ3JvdXBzQXJyYXk9W119fSx7a2V5OlwiZ2V0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPXRoaXMuZ3JvdXBzW3RdO2lmKHZvaWQgMD09PWkmJmUpaWYoITE9PT10aGlzLm9wdGlvbnMudXNlRGVmYXVsdEdyb3VwcyYmdGhpcy5ncm91cHNBcnJheS5sZW5ndGg+MCl7dmFyIG89dGhpcy5ncm91cEluZGV4JXRoaXMuZ3JvdXBzQXJyYXkubGVuZ3RoO3RoaXMuZ3JvdXBJbmRleCsrLGk9e30saS5jb2xvcj10aGlzLmdyb3Vwc1t0aGlzLmdyb3Vwc0FycmF5W29dXSx0aGlzLmdyb3Vwc1t0XT1pfWVsc2V7dmFyIG49dGhpcy5kZWZhdWx0SW5kZXgldGhpcy5kZWZhdWx0R3JvdXBzLmxlbmd0aDt0aGlzLmRlZmF1bHRJbmRleCsrLGk9e30saS5jb2xvcj10aGlzLmRlZmF1bHRHcm91cHNbbl0sdGhpcy5ncm91cHNbdF09aX1yZXR1cm4gaX19LHtrZXk6XCJhZGRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLmdyb3Vwc1t0XT1lLHRoaXMuZ3JvdXBzQXJyYXkucHVzaCh0KSxlfX1dKSx0fSgpO2UuZGVmYXVsdD1kfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1pKDExKSxsPWkoMTIpLHU9aSg0NykuZGVmYXVsdCxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyxuKXt2YXIgcj10aGlzO2lmKCgwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmltYWdlcz1pLHRoaXMuZ3JvdXBzPW8sdGhpcy5sYXlvdXRFbmdpbmU9bix0aGlzLmJvZHkuZnVuY3Rpb25zLmNyZWF0ZU5vZGU9dGhpcy5jcmVhdGUuYmluZCh0aGlzKSx0aGlzLm5vZGVzTGlzdGVuZXJzPXthZGQ6ZnVuY3Rpb24odCxlKXtyLmFkZChlLml0ZW1zKX0sdXBkYXRlOmZ1bmN0aW9uKHQsZSl7ci51cGRhdGUoZS5pdGVtcyxlLmRhdGEsZS5vbGREYXRhKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7ci5yZW1vdmUoZS5pdGVtcyl9fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtib3JkZXJXaWR0aDoxLGJvcmRlcldpZHRoU2VsZWN0ZWQ6Mixicm9rZW5JbWFnZTp2b2lkIDAsY29sb3I6e2JvcmRlcjpcIiMyQjdDRTlcIixiYWNrZ3JvdW5kOlwiIzk3QzJGQ1wiLGhpZ2hsaWdodDp7Ym9yZGVyOlwiIzJCN0NFOVwiLGJhY2tncm91bmQ6XCIjRDJFNUZGXCJ9LGhvdmVyOntib3JkZXI6XCIjMkI3Q0U5XCIsYmFja2dyb3VuZDpcIiNEMkU1RkZcIn19LGZpeGVkOnt4OiExLHk6ITF9LGZvbnQ6e2NvbG9yOlwiIzM0MzQzNFwiLHNpemU6MTQsZmFjZTpcImFyaWFsXCIsYmFja2dyb3VuZDpcIm5vbmVcIixzdHJva2VXaWR0aDowLHN0cm9rZUNvbG9yOlwiI2ZmZmZmZlwiLGFsaWduOlwiY2VudGVyXCIsdmFkanVzdDowLG11bHRpOiExLGJvbGQ6e21vZDpcImJvbGRcIn0sYm9sZGl0YWw6e21vZDpcImJvbGQgaXRhbGljXCJ9LGl0YWw6e21vZDpcIml0YWxpY1wifSxtb25vOnttb2Q6XCJcIixzaXplOjE1LGZhY2U6XCJtb25vc3BhY2VcIix2YWRqdXN0OjJ9fSxncm91cDp2b2lkIDAsaGlkZGVuOiExLGljb246e2ZhY2U6XCJGb250QXdlc29tZVwiLGNvZGU6dm9pZCAwLHNpemU6NTAsY29sb3I6XCIjMkI3Q0U5XCJ9LGltYWdlOnZvaWQgMCxsYWJlbDp2b2lkIDAsbGFiZWxIaWdobGlnaHRCb2xkOiEwLGxldmVsOnZvaWQgMCxtYXJnaW46e3RvcDo1LHJpZ2h0OjUsYm90dG9tOjUsbGVmdDo1fSxtYXNzOjEscGh5c2ljczohMCxzY2FsaW5nOnttaW46MTAsbWF4OjMwLGxhYmVsOntlbmFibGVkOiExLG1pbjoxNCxtYXg6MzAsbWF4VmlzaWJsZTozMCxkcmF3VGhyZXNob2xkOjV9LGN1c3RvbVNjYWxpbmdGdW5jdGlvbjpmdW5jdGlvbih0LGUsaSxvKXtpZihlPT09dClyZXR1cm4uNTt2YXIgbj0xLyhlLXQpO3JldHVybiBNYXRoLm1heCgwLChvLXQpKm4pfX0sc2hhZG93OntlbmFibGVkOiExLGNvbG9yOlwicmdiYSgwLDAsMCwwLjUpXCIsc2l6ZToxMCx4OjUseTo1fSxzaGFwZTpcImVsbGlwc2VcIixzaGFwZVByb3BlcnRpZXM6e2JvcmRlckRhc2hlczohMSxib3JkZXJSYWRpdXM6NixpbnRlcnBvbGF0aW9uOiEwLHVzZUltYWdlU2l6ZTohMSx1c2VCb3JkZXJXaXRoSW1hZ2U6ITF9LHNpemU6MjUsdGl0bGU6dm9pZCAwLHZhbHVlOnZvaWQgMCx4OnZvaWQgMCx5OnZvaWQgMH0sdGhpcy5kZWZhdWx0T3B0aW9ucy5tYXNzPD0wKXRocm93XCJJbnRlcm5hbCBlcnJvcjogbWFzcyBpbiBkZWZhdWx0T3B0aW9ucyBvZiBOb2Rlc0hhbmRsZXIgbWF5IG5vdCBiZSB6ZXJvIG9yIG5lZ2F0aXZlXCI7dGhpcy5vcHRpb25zPWguYnJpZGdlT2JqZWN0KHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwicmVmcmVzaE5vZGVzXCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwicmVmcmVzaFwiLHRoaXMucmVmcmVzaC5iaW5kKHRoaXMpKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcImRlc3Ryb3lcIixmdW5jdGlvbigpe2guZm9yRWFjaCh0Lm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKGUsaSl7dC5ib2R5LmRhdGEubm9kZXMmJnQuYm9keS5kYXRhLm5vZGVzLm9mZihpLGUpfSksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuY3JlYXRlTm9kZSxkZWxldGUgdC5ub2Rlc0xpc3RlbmVycy5hZGQsZGVsZXRlIHQubm9kZXNMaXN0ZW5lcnMudXBkYXRlLGRlbGV0ZSB0Lm5vZGVzTGlzdGVuZXJzLnJlbW92ZSxkZWxldGUgdC5ub2Rlc0xpc3RlbmVyc30pfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXtpZih1LnBhcnNlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCksdm9pZCAwIT09dC5zaGFwZSlmb3IodmFyIGUgaW4gdGhpcy5ib2R5Lm5vZGVzKXRoaXMuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdGhpcy5ib2R5Lm5vZGVzW2VdLnVwZGF0ZVNoYXBlKCk7aWYodm9pZCAwIT09dC5mb250KWZvcih2YXIgaSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGkpJiYodGhpcy5ib2R5Lm5vZGVzW2ldLnVwZGF0ZUxhYmVsTW9kdWxlKCksdGhpcy5ib2R5Lm5vZGVzW2ldLm5lZWRzUmVmcmVzaCgpKTtpZih2b2lkIDAhPT10LnNpemUpZm9yKHZhciBvIGluIHRoaXMuYm9keS5ub2Rlcyl0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkobykmJnRoaXMuYm9keS5ub2Rlc1tvXS5uZWVkc1JlZnJlc2goKTt2b2lkIDA9PT10LmhpZGRlbiYmdm9pZCAwPT09dC5waHlzaWNzfHx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX19LHtrZXk6XCJzZXREYXRhXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxpPXRoaXMuYm9keS5kYXRhLm5vZGVzO2lmKHQgaW5zdGFuY2VvZiBkfHx0IGluc3RhbmNlb2YgbCl0aGlzLmJvZHkuZGF0YS5ub2Rlcz10O2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl0aGlzLmJvZHkuZGF0YS5ub2Rlcz1uZXcgZCx0aGlzLmJvZHkuZGF0YS5ub2Rlcy5hZGQodCk7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheSBvciBEYXRhU2V0IGV4cGVjdGVkXCIpO3RoaXMuYm9keS5kYXRhLm5vZGVzPW5ldyBkfWlmKGkmJmguZm9yRWFjaCh0aGlzLm5vZGVzTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7aS5vZmYoZSx0KX0pLHRoaXMuYm9keS5ub2Rlcz17fSx0aGlzLmJvZHkuZGF0YS5ub2Rlcyl7dmFyIG89dGhpcztoLmZvckVhY2godGhpcy5ub2Rlc0xpc3RlbmVycyxmdW5jdGlvbih0LGUpe28uYm9keS5kYXRhLm5vZGVzLm9uKGUsdCl9KTt2YXIgbj10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXRJZHMoKTt0aGlzLmFkZChuLCEwKX0hMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT12b2lkIDAsbz1bXSxuPTA7bj
21167x0Lmxlbmd0aDtuKyspe2k9dFtuXTt2YXIgcz10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXQoaSkscj10aGlzLmNyZWF0ZShzKTtvLnB1c2gociksdGhpcy5ib2R5Lm5vZGVzW2ldPXJ9dGhpcy5sYXlvdXRFbmdpbmUucG9zaXRpb25Jbml0aWFsbHkobyksITE9PT1lJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX0se2tleTpcInVwZGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89dGhpcy5ib2R5Lm5vZGVzLG49ITEscz0wO3M8dC5sZW5ndGg7cysrKXt2YXIgcj10W3NdLGE9b1tyXSxoPWVbc107dm9pZCAwIT09YT9hLnNldE9wdGlvbnMoaCkmJihuPSEwKToobj0hMCxhPXRoaXMuY3JlYXRlKGgpLG9bcl09YSl9bnx8dm9pZCAwPT09aXx8KG49ZS5zb21lKGZ1bmN0aW9uKHQsZSl7dmFyIG89aVtlXTtyZXR1cm4gbyYmby5sZXZlbCE9PXQubGV2ZWx9KSksITA9PT1uP3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIik6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhVXBkYXRlZFwiKX19LHtrZXk6XCJyZW1vdmVcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5Lm5vZGVzLGk9MDtpPHQubGVuZ3RoO2krKyl7ZGVsZXRlIGVbdFtpXV19dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19LHtrZXk6XCJjcmVhdGVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gbmV3KGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp1KSh0LHRoaXMuYm9keSx0aGlzLmltYWdlcyx0aGlzLmdyb3Vwcyx0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyl9fSx7a2V5OlwicmVmcmVzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07aC5mb3JFYWNoKHRoaXMuYm9keS5ub2RlcyxmdW5jdGlvbihpLG8pe3ZhciBuPXQuYm9keS5kYXRhLm5vZGVzLmdldChvKTt2b2lkIDAhPT1uJiYoITA9PT1lJiZpLnNldE9wdGlvbnMoe3g6bnVsbCx5Om51bGx9KSxpLnNldE9wdGlvbnMoe2ZpeGVkOiExfSksaS5zZXRPcHRpb25zKG4pKX0pfX0se2tleTpcImdldFBvc2l0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O2lmKHZvaWQgMCE9PXQpe2lmKCEwPT09QXJyYXkuaXNBcnJheSh0KSl7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aDtpKyspaWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RbaV1dKXt2YXIgbz10aGlzLmJvZHkubm9kZXNbdFtpXV07ZVt0W2ldXT17eDpNYXRoLnJvdW5kKG8ueCkseTpNYXRoLnJvdW5kKG8ueSl9fX1lbHNlIGlmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XSl7dmFyIG49dGhpcy5ib2R5Lm5vZGVzW3RdO2VbdF09e3g6TWF0aC5yb3VuZChuLngpLHk6TWF0aC5yb3VuZChuLnkpfX19ZWxzZSBmb3IodmFyIHM9MDtzPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7cysrKXt2YXIgcj10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW3NdXTtlW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tzXV09e3g6TWF0aC5yb3VuZChyLngpLHk6TWF0aC5yb3VuZChyLnkpfX1yZXR1cm4gZX19LHtrZXk6XCJzdG9yZVBvc2l0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmJvZHkuZGF0YS5ub2Rlcy5nZXREYXRhU2V0KCk7Zm9yKHZhciBpIGluIGUuX2RhdGEpaWYoZS5fZGF0YS5oYXNPd25Qcm9wZXJ0eShpKSl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW2ldO2UuX2RhdGFbaV0ueD09TWF0aC5yb3VuZChvLngpJiZlLl9kYXRhW2ldLnk9PU1hdGgucm91bmQoby55KXx8dC5wdXNoKHtpZDpvLmlkLHg6TWF0aC5yb3VuZChvLngpLHk6TWF0aC5yb3VuZChvLnkpfSl9ZS51cGRhdGUodCl9fSx7a2V5OlwiZ2V0Qm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pcmV0dXJuIHRoaXMuYm9keS5ub2Rlc1t0XS5zaGFwZS5ib3VuZGluZ0JveH19LHtrZXk6XCJnZXRDb25uZWN0ZWROb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W107aWYodm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW3RdKWZvcih2YXIgbz10aGlzLmJvZHkubm9kZXNbdF0sbj17fSxzPTA7czxvLmVkZ2VzLmxlbmd0aDtzKyspe3ZhciByPW8uZWRnZXNbc107XCJ0b1wiIT09ZSYmci50b0lkPT1vLmlkP3ZvaWQgMD09PW5bci5mcm9tSWRdJiYoaS5wdXNoKHIuZnJvbUlkKSxuW3IuZnJvbUlkXT0hMCk6XCJmcm9tXCIhPT1lJiZyLmZyb21JZD09by5pZCYmdm9pZCAwPT09bltyLnRvSWRdJiYoaS5wdXNoKHIudG9JZCksbltyLnRvSWRdPSEwKX1yZXR1cm4gaX19LHtrZXk6XCJnZXRDb25uZWN0ZWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO2lmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XSlmb3IodmFyIGk9dGhpcy5ib2R5Lm5vZGVzW3RdLG89MDtvPGkuZWRnZXMubGVuZ3RoO28rKyllLnB1c2goaS5lZGdlc1tvXS5pZCk7ZWxzZSBjb25zb2xlLmxvZyhcIk5vZGVJZCBwcm92aWRlZCBmb3IgZ2V0Q29ubmVjdGVkRWRnZXMgZG9lcyBub3QgZXhpc3QuIFByb3ZpZGVkOiBcIix0KTtyZXR1cm4gZX19LHtrZXk6XCJtb3ZlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz10aGlzO3ZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0XT8odGhpcy5ib2R5Lm5vZGVzW3RdLng9TnVtYmVyKGUpLHRoaXMuYm9keS5ub2Rlc1t0XS55PU51bWJlcihpKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7by5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKX0sMCkpOmNvbnNvbGUubG9nKFwiTm9kZSBpZCBzdXBwbGllZCB0byBtb3ZlTm9kZSBkb2VzIG5vdCBleGlzdC4gUHJvdmlkZWQ6IFwiLHQpfX1dKSx0fSgpO2UuZGVmYXVsdD1jfSxmdW5jdGlvbih0LGUsaSl7dC5leHBvcnRzPXtkZWZhdWx0OmkoMTg5KSxfX2VzTW9kdWxlOiEwfX0sZnVuY3Rpb24odCxlLGkpe2koNDkpLGkoNjApLHQuZXhwb3J0cz1pKDE5MCl9LGZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pKDg2KSxuPWkoMTMpKFwiaXRlcmF0b3JcIikscz1pKDMxKTt0LmV4cG9ydHM9aSg3KS5pc0l0ZXJhYmxlPWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdCh0KTtyZXR1cm4gdm9pZCAwIT09ZVtuXXx8XCJAQGl0ZXJhdG9yXCJpbiBlfHxzLmhhc093blByb3BlcnR5KG8oZSkpfX0s
21167ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDE5MikuZGVmYXVsdCxkPWkoNDgpLmRlZmF1bHQsbD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8sbil7dmFyIHI9dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5jdHg9ZSx0aGlzLnBhcmVudD1pO3ZhciBhPWZ1bmN0aW9uKHQsaSl7aWYodm9pZCAwPT09dClyZXR1cm4gMDt2YXIgcz1yLnBhcmVudC5nZXRGb3JtYXR0aW5nVmFsdWVzKGUsbyxuLGkpLGE9MDtpZihcIlwiIT09dCl7YT1yLmN0eC5tZWFzdXJlVGV4dCh0KS53aWR0aH1yZXR1cm57d2lkdGg6YSx2YWx1ZXM6c319O3RoaXMubGluZXM9bmV3IGgoYSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwicHJvY2Vzc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCFkLmlzVmFsaWRMYWJlbCh0KSlyZXR1cm4gdGhpcy5saW5lcy5maW5hbGl6ZSgpO3ZhciBlPXRoaXMucGFyZW50LmZvbnRPcHRpb25zO3Q9dC5yZXBsYWNlKC9cXHJcXG4vZyxcIlxcblwiKSx0PXQucmVwbGFjZSgvXFxyL2csXCJcXG5cIik7dmFyIGk9U3RyaW5nKHQpLnNwbGl0KFwiXFxuXCIpLG89aS5sZW5ndGg7aWYoZS5tdWx0aSlmb3IodmFyIG49MDtuPG87bisrKXt2YXIgcz10aGlzLnNwbGl0QmxvY2tzKGlbbl0sZS5tdWx0aSk7aWYodm9pZCAwIT09cylpZigwIT09cy5sZW5ndGgpe2lmKGUubWF4V2R0PjApZm9yKHZhciByPTA7cjxzLmxlbmd0aDtyKyspe3ZhciBhPXNbcl0ubW9kLGg9c1tyXS50ZXh0O3RoaXMuc3BsaXRTdHJpbmdJbnRvTGluZXMoaCxhLCEwKX1lbHNlIGZvcih2YXIgbD0wO2w8cy5sZW5ndGg7bCsrKXt2YXIgdT1zW2xdLm1vZCxjPXNbbF0udGV4dDt0aGlzLmxpbmVzLmFwcGVuZChjLHUpfXRoaXMubGluZXMubmV3TGluZSgpfWVsc2UgdGhpcy5saW5lcy5uZXdMaW5lKFwiXCIpfWVsc2UgaWYoZS5tYXhXZHQ+MClmb3IodmFyIHA9MDtwPG87cCsrKXRoaXMuc3BsaXRTdHJpbmdJbnRvTGluZXMoaVtwXSk7ZWxzZSBmb3IodmFyIGY9MDtmPG87ZisrKXRoaXMubGluZXMubmV3TGluZShpW2ZdKTtyZXR1cm4gdGhpcy5saW5lcy5maW5hbGl6ZSgpfX0se2tleTpcImRlY29kZU1hcmt1cFN5c3RlbVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVwibm9uZVwiO3JldHVyblwibWFya2Rvd25cIj09PXR8fFwibWRcIj09PXQ/ZT1cIm1hcmtkb3duXCI6ITAhPT10JiZcImh0bWxcIiE9PXR8fChlPVwiaHRtbFwiKSxlfX0se2tleTpcInNwbGl0SHRtbEJsb2Nrc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLGk9e2JvbGQ6ITEsaXRhbDohMSxtb25vOiExLHNwYWNpbmc6ITEscG9zaXRpb246MCxidWZmZXI6XCJcIixtb2RTdGFjazpbXX07Zm9yKGkubW9kPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1vZFN0YWNrLmxlbmd0aD9cIm5vcm1hbFwiOnRoaXMubW9kU3RhY2tbMF19LGkubW9kTmFtZT1mdW5jdGlvbigpe3JldHVybiAwPT09dGhpcy5tb2RTdGFjay5sZW5ndGg/XCJub3JtYWxcIjpcIm1vbm9cIj09PXRoaXMubW9kU3RhY2tbMF0/XCJtb25vXCI6aS5ib2xkJiZpLml0YWw/XCJib2xkaXRhbFwiOmkuYm9sZD9cImJvbGRcIjppLml0YWw/XCJpdGFsXCI6dm9pZCAwfSxpLmVtaXRCbG9jaz1mdW5jdGlvbigpe2FyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5zcGFjaW5nJiYodGhpcy5hZGQoXCIgXCIpLHRoaXMuc3BhY2luZz0hMSksdGhpcy5idWZmZXIubGVuZ3RoPjAmJihlLnB1c2goe3RleHQ6dGhpcy5idWZmZXIsbW9kOnRoaXMubW9kTmFtZSgpfSksdGhpcy5idWZmZXI9XCJcIil9LGkuYWRkPWZ1bmN0aW9uKHQpe1wiIFwiPT09dCYmKGkuc3BhY2luZz0hMCksaS5zcGFjaW5nJiYodGhpcy5idWZmZXIrPVwiIFwiLHRoaXMuc3BhY2luZz0hMSksXCIgXCIhPXQmJih0aGlzLmJ1ZmZlcis9dCl9O2kucG9zaXRpb248dC5sZW5ndGg7KXt2YXIgbz10LmNoYXJBdChpLnBvc2l0aW9uKTsvWyBcXHRdLy50ZXN0KG8pP2kubW9ubz9pLmFkZChvKTppLnNwYWNpbmc9ITA6LzwvLnRlc3Qobyk/aS5tb25vfHxpLmJvbGR8fCEvPGI+Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sMykpP2kubW9ub3x8aS5pdGFsfHwhLzxpPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDMpKT8haS5tb25vJiYvPGNvZGU+Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNikpPyhpLmVtaXRCbG9jaygpLGkubW9ubz0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJtb25vXCIpLGkucG9zaXRpb24rPTUpOiFpLm1vbm8mJlwiYm9sZFwiPT09aS5tb2QoKSYmLzxcXC9iPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDQpKT8oaS5lbWl0QmxvY2soKSxpLmJvbGQ9ITEsaS5tb2RTdGFjay5zaGlmdCgpLGkucG9zaXRpb24rPTMpOiFpLm1vbm8mJlwiaXRhbFwiPT09aS5tb2QoKSYmLzxcXC9pPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDQpKT8oaS5lbWl0QmxvY2soKSxpLml0YWw9ITEsaS5tb2RTdGFjay5zaGlmdCgpLGkucG9zaXRpb24rPTMpOlwibW9ub1wiPT09aS5tb2QoKSYmLzxcXC9jb2RlPi8udGVzdCh0LnN1YnN0cihpLnBvc2l0aW9uLDcpKT8oaS5lbWl0QmxvY2soKSxpLm1vbm89ITEsaS5tb2RTdGFjay5zaGlmdCgpLGkucG9zaXRpb24rPTYpOmkuYWRkKG8pOihpLmVtaXRCbG9jaygpLGkuaXRhbD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJpdGFsXCIpLGkucG9zaXRpb24rPTIpOihpLmVtaXRCbG9jaygpLGkuYm9sZD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJib2xkXCIpLGkucG9zaXRpb24rPTIpOi8mLy50ZXN0KG8pPy8mbHQ7Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNCkpPyhpLmFkZChcIjxcIiksaS5wb3NpdGlvbis9Myk6LyZhbXA7Ly50ZXN0KHQuc3Vic3RyKGkucG9zaXRpb24sNSkpPyhpLmFkZChcIiZcIiksaS5wb3NpdGlvbis9NCk6aS5hZGQoXCImXCIpOmkuYWRkKG8pLGkucG9zaXRpb24rK31yZXR1cm4gaS5lbWl0QmxvY2soKSxlfX0se2tleTpcInNwbGl0TWFya2Rvd25CbG9ja3NcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXSxpPXtib2xkOiExLGl0YWw6ITEsbW9ubzohMSxiZWdpbmFibGU6ITAsc3BhY2luZzohMSxwb3NpdGlvbjowLGJ1ZmZlcjpcIlwiLG1vZFN0YWNrOltdfTtmb3IoaS5tb2Q9ZnVuY3Rpb24oKXtyZXR1cm4gMD09PXRoaXMubW9kU3RhY2subGVuZ3RoP1wibm9ybWFsXCI6dGhpcy5tb2RTdGFja1swXX0saS5tb2ROYW1lPWZ1bmN0aW9uKCl7cmV0dXJuIDA9PT10aGlzLm1vZFN0YWNrLmxlbmd0aD9cIm5vcm1hbFwiOlwibW9ub1wiPT09dGhpcy5tb2RTdGFja1swXT9cIm1vbm9cIjppLmJvbGQmJmkuaXRhbD9cImJvbGRpdGFsXCI6aS5ib2xkP1wiYm9sZFwiOmkuaXRhbD9cIml0YWxcIjp2b2lkIDB9LGkuZW1pdEJsb2NrPWZ1bmN0aW9uKCl7YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0mJmFyZ3VtZW50c1swXTt0aGlzLnNwYWNpbmcmJih0aGlzLmFkZChcIiBcIiksdGhpcy5zcGFjaW5nPSExKSx0aGlzLmJ1ZmZlci5sZW5ndGg+MCYmKGUucHVzaCh7dGV4dDp0aGlzLmJ1ZmZlcixtb2Q6dGhpcy5tb2ROYW1lKCl9KSx0aGlzLmJ1ZmZlcj1cIlwiKX0saS5hZGQ9ZnVuY3Rpb24odCl7XCIgXCI9PT10JiYoaS5zcGFjaW5nPSEwKSxpLnNwYWNpbmcmJih0aGlzLmJ1ZmZlcis9XCIgXCIsdGhpcy5zcGFjaW5nPSExKSxcIiBcIiE9dCYmKHR
21167oaXMuYnVmZmVyKz10KX07aS5wb3NpdGlvbjx0Lmxlbmd0aDspe3ZhciBvPXQuY2hhckF0KGkucG9zaXRpb24pOy9bIFxcdF0vLnRlc3Qobyk/KGkubW9ubz9pLmFkZChvKTppLnNwYWNpbmc9ITAsaS5iZWdpbmFibGU9ITApOi9cXFxcLy50ZXN0KG8pP2kucG9zaXRpb248dC5sZW5ndGgrMSYmKGkucG9zaXRpb24rKyxvPXQuY2hhckF0KGkucG9zaXRpb24pLC8gXFx0Ly50ZXN0KG8pP2kuc3BhY2luZz0hMDooaS5hZGQobyksaS5iZWdpbmFibGU9ITEpKTppLm1vbm98fGkuYm9sZHx8IWkuYmVnaW5hYmxlJiYhaS5zcGFjaW5nfHwhL1xcKi8udGVzdChvKT9pLm1vbm98fGkuaXRhbHx8IWkuYmVnaW5hYmxlJiYhaS5zcGFjaW5nfHwhL1xcXy8udGVzdChvKT8haS5tb25vJiYoaS5iZWdpbmFibGV8fGkuc3BhY2luZykmJi9gLy50ZXN0KG8pPyhpLmVtaXRCbG9jaygpLGkubW9ubz0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJtb25vXCIpKTohaS5tb25vJiZcImJvbGRcIj09PWkubW9kKCkmJi9cXCovLnRlc3Qobyk/aS5wb3NpdGlvbj09PXQubGVuZ3RoLTF8fC9bLixfYCBcXHRcXG5dLy50ZXN0KHQuY2hhckF0KGkucG9zaXRpb24rMSkpPyhpLmVtaXRCbG9jaygpLGkuYm9sZD0hMSxpLm1vZFN0YWNrLnNoaWZ0KCkpOmkuYWRkKG8pOiFpLm1vbm8mJlwiaXRhbFwiPT09aS5tb2QoKSYmL1xcXy8udGVzdChvKT9pLnBvc2l0aW9uPT09dC5sZW5ndGgtMXx8L1suLCpgIFxcdFxcbl0vLnRlc3QodC5jaGFyQXQoaS5wb3NpdGlvbisxKSk/KGkuZW1pdEJsb2NrKCksaS5pdGFsPSExLGkubW9kU3RhY2suc2hpZnQoKSk6aS5hZGQobyk6aS5tb25vJiZcIm1vbm9cIj09PWkubW9kKCkmJi9gLy50ZXN0KG8pP2kucG9zaXRpb249PT10Lmxlbmd0aC0xfHwvWy4sKl8gXFx0XFxuXS8udGVzdCh0LmNoYXJBdChpLnBvc2l0aW9uKzEpKT8oaS5lbWl0QmxvY2soKSxpLm1vbm89ITEsaS5tb2RTdGFjay5zaGlmdCgpKTppLmFkZChvKTooaS5hZGQobyksaS5iZWdpbmFibGU9ITEpOihpLmVtaXRCbG9jaygpLGkuaXRhbD0hMCxpLm1vZFN0YWNrLnVuc2hpZnQoXCJpdGFsXCIpKTooaS5lbWl0QmxvY2soKSxpLmJvbGQ9ITAsaS5tb2RTdGFjay51bnNoaWZ0KFwiYm9sZFwiKSksaS5wb3NpdGlvbisrfXJldHVybiBpLmVtaXRCbG9jaygpLGV9fSx7a2V5Olwic3BsaXRCbG9ja3NcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZGVjb2RlTWFya3VwU3lzdGVtKGUpO3JldHVyblwibm9uZVwiPT09aT9be3RleHQ6dCxtb2Q6XCJub3JtYWxcIn1dOlwibWFya2Rvd25cIj09PWk/dGhpcy5zcGxpdE1hcmtkb3duQmxvY2tzKHQpOlwiaHRtbFwiPT09aT90aGlzLnNwbGl0SHRtbEJsb2Nrcyh0KTp2b2lkIDB9fSx7a2V5Olwib3Zlck1heFdpZHRoXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jdHgubWVhc3VyZVRleHQodCkud2lkdGg7cmV0dXJuIHRoaXMubGluZXMuY3VyV2lkdGgoKStlPnRoaXMucGFyZW50LmZvbnRPcHRpb25zLm1heFdkdH19LHtrZXk6XCJnZXRMb25nZXN0Rml0XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVwiXCIsaT0wO2k8dC5sZW5ndGg7KXt2YXIgbz1cIlwiPT09ZT9cIlwiOlwiIFwiLG49ZStvK3RbaV07aWYodGhpcy5vdmVyTWF4V2lkdGgobikpYnJlYWs7ZT1uLGkrK31yZXR1cm4gaX19LHtrZXk6XCJnZXRMb25nZXN0Rml0V29yZFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGgmJiF0aGlzLm92ZXJNYXhXaWR0aCh0LnNsaWNlKDAsZSkpOyllKys7cmV0dXJuIGV9fSx7a2V5Olwic3BsaXRTdHJpbmdJbnRvTGluZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06XCJub3JtYWxcIixpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdJiZhcmd1bWVudHNbMl07dD10LnJlcGxhY2UoL14oICspL2csXCIkMVxcclwiKSx0PXQucmVwbGFjZSgvKFteXFxyXVteIF0qKSggKykvZyxcIiQxXFxyJDJcXHJcIik7Zm9yKHZhciBvPXQuc3BsaXQoXCJcXHJcIik7by5sZW5ndGg+MDspe3ZhciBuPXRoaXMuZ2V0TG9uZ2VzdEZpdChvKTtpZigwPT09bil7dmFyIHM9b1swXSxyPXRoaXMuZ2V0TG9uZ2VzdEZpdFdvcmQocyk7dGhpcy5saW5lcy5uZXdMaW5lKHMuc2xpY2UoMCxyKSxlKSxvWzBdPXMuc2xpY2Uocil9ZWxzZXt2YXIgYT1uO1wiIFwiPT09b1tuLTFdP24tLTpcIiBcIj09PW9bYV0mJmErKzt2YXIgaD1vLnNsaWNlKDAsbikuam9pbihcIlwiKTtuPT1vLmxlbmd0aCYmaT90aGlzLmxpbmVzLmFwcGVuZChoLGUpOnRoaXMubGluZXMubmV3TGluZShoLGUpLG89by5zbGljZShhKX19fX1dKSx0fSgpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSg5MCkscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5tZWFzdXJlVGV4dD1lLHRoaXMuY3VycmVudD0wLHRoaXMud2lkdGg9MCx0aGlzLmhlaWdodD0wLHRoaXMubGluZXM9W119cmV0dXJuKDAsZC5kZWZhdWx0KSh0LFt7a2V5OlwiX2FkZFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOlwibm9ybWFsXCI7dm9pZCAwPT09dGhpcy5saW5lc1t0XSYmKHRoaXMubGluZXNbdF09e3dpZHRoOjAsaGVpZ2h0OjAsYmxvY2tzOltdfSk7dmFyIG89ZTt2b2lkIDAhPT1lJiZcIlwiIT09ZXx8KG89XCIgXCIpO3ZhciBuPXRoaXMubWVhc3VyZVRleHQobyxpKSxyPSgwLHMuZGVmYXVsdCkoe30sbi52YWx1ZXMpO3IudGV4dD1lLHIud2lkdGg9bi53aWR0aCxyLm1vZD1pLHZvaWQgMCE9PWUmJlwiXCIhPT1lfHwoci53aWR0aD0wKSx0aGlzLmxpbmVzW3RdLmJsb2Nrcy5wdXNoKHIpLHRoaXMubGluZXNbdF0ud2lkdGgrPXIud2lkdGh9fSx7a2V5OlwiY3VyV2lkdGhcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMubGluZXNbdGh
21167pcy5jdXJyZW50XTtyZXR1cm4gdm9pZCAwPT09dD8wOnQud2lkdGh9fSx7a2V5OlwiYXBwZW5kXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOlwibm9ybWFsXCI7dGhpcy5fYWRkKHRoaXMuY3VycmVudCx0LGUpfX0se2tleTpcIm5ld0xpbmVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06XCJub3JtYWxcIjt0aGlzLl9hZGQodGhpcy5jdXJyZW50LHQsZSksdGhpcy5jdXJyZW50Kyt9fSx7a2V5OlwiZGV0ZXJtaW5lTGluZUhlaWdodHNcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5saW5lcy5sZW5ndGg7dCsrKXt2YXIgZT10aGlzLmxpbmVzW3RdLGk9MDtpZih2b2lkIDAhPT1lLmJsb2Nrcylmb3IodmFyIG89MDtvPGUuYmxvY2tzLmxlbmd0aDtvKyspe3ZhciBuPWUuYmxvY2tzW29dO2k8bi5oZWlnaHQmJihpPW4uaGVpZ2h0KX1lLmhlaWdodD1pfX19LHtrZXk6XCJkZXRlcm1pbmVMYWJlbFNpemVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGU9MCxpPTA7aTx0aGlzLmxpbmVzLmxlbmd0aDtpKyspe3ZhciBvPXRoaXMubGluZXNbaV07by53aWR0aD50JiYodD1vLndpZHRoKSxlKz1vLmhlaWdodH10aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZX19LHtrZXk6XCJyZW1vdmVFbXB0eUJsb2Nrc1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGU9MDtlPHRoaXMubGluZXMubGVuZ3RoO2UrKyl7dmFyIGk9dGhpcy5saW5lc1tlXTtpZigwIT09aS5ibG9ja3MubGVuZ3RoJiYoZSE9PXRoaXMubGluZXMubGVuZ3RoLTF8fDAhPT1pLndpZHRoKSl7dmFyIG89e307KDAscy5kZWZhdWx0KShvLGkpLG8uYmxvY2tzPVtdO2Zvcih2YXIgbj12b2lkIDAscj1bXSxhPTA7YTxpLmJsb2Nrcy5sZW5ndGg7YSsrKXt2YXIgaD1pLmJsb2Nrc1thXTswIT09aC53aWR0aD9yLnB1c2goaCk6dm9pZCAwPT09biYmKG49aCl9MD09PXIubGVuZ3RoJiZ2b2lkIDAhPT1uJiZyLnB1c2gobiksby5ibG9ja3M9cix0LnB1c2gobyl9fXJldHVybiB0fX0se2tleTpcImZpbmFsaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmRldGVybWluZUxpbmVIZWlnaHRzKCksdGhpcy5kZXRlcm1pbmVMYWJlbFNpemUoKTt2YXIgdD10aGlzLnJlbW92ZUVtcHR5QmxvY2tzKCk7cmV0dXJue3dpZHRoOnRoaXMud2lkdGgsaGVpZ2h0OnRoaXMuaGVpZ2h0LGxpbmVzOnR9fX1dKSx0fSgpO2UuZGVmYXVsdD1sfSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjMpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5zZWxlY3RlZCxpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp0aGlzLmhvdmVyO2lmKHRoaXMubmVlZHNSZWZyZXNoKGUsaSkpe3ZhciBvPXRoaXMuZ2V0RGltZW5zaW9uc0Zyb21MYWJlbCh0LGUsaSk7dGhpcy53aWR0aD1vLndpZHRoK3RoaXMubWFyZ2luLnJpZ2h0K3RoaXMubWFyZ2luLmxlZnQsdGhpcy5oZWlnaHQ9by5oZWlnaHQrdGhpcy5tYXJnaW4udG9wK3RoaXMubWFyZ2luLmJvdHRvbSx0aGlzLnJhZGl1cz10aGlzLndpZHRoLzJ9fX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5pbml0Q29udGV4dEZvckRyYXcodCxzKSx0LnJvdW5kUmVjdCh0aGlzLmxlZnQsdGhpcy50b3AsdGhpcy53aWR0aCx0aGlzLmhlaWdodCxzLmJvcmRlclJhZGl1cyksdGhpcy5wZXJmb3JtRmlsbCh0LHMpLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpLHQsbyxuKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsdGhpcy50b3ArdGhpcy50ZXh0U2l6ZS5oZWlnaHQvMit0aGlzLm1hcmdpbi50b3AsbyxuKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbil7dGhpcy5fdXBkYXRlQm91bmRpbmdCb3godCxlLGksbyxuKTt2YXIgcz10aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLmJvcmRlclJhZGl1czt0aGlzLl9hZGRCb3VuZGluZ0JveE1hcmdpbihzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLnJlc2l6ZSh0KTt2YXIgaT10aGlzLm9wdGlvbnMuYm9yZGVyV2lkdGg7cmV0dXJuIE1hdGgubWluKE1hdGguYWJzKHRoaXMud2lkdGgvMi9NYXRoLmNvcyhlKSksTWF0aC5hYnModGhpcy5oZWlnaHQvMi9NYXRoLnNpbihlKSkpK2l9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtpKDE5NSksdC5leHBvcnRzPWkoNykuT2JqZWN0LmdldFByb3RvdHlwZU9mfSxmdW5jdGlvbih0LGUsaSl7dmFyIG89aSg0MSksbj1pKDg1KTtpKDg3KShcImdldFByb3RvdHlwZU9mXCIsZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4obyh0KSl9fSl9LGZ1bmN0aW9uKHQsZSxpKXt0LmV4cG9ydHM9e2RlZmF1bHQ6aSgxOTcpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbih0LGUsaSl7aSgxOTgpLHQuZXhwb3J0cz1pKDcpLk9iamVjdC5zZXRQcm90b3R5cGVPZn0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMTcpO28oby5TLFwiT2JqZWN0XCIse3NldFByb3RvdHlwZU9mOmkoMTk5KS5zZXR9KX0sZnVuY3Rpb24odCxlLGkpe3ZhciBvPWkoMzIpLG49aSgyNykscz1mdW5jdGlvbih0LGUpe2lmKG4odCksIW8oZSkmJm51bGwhPT1lKXRocm93IFR5cGVFcnJvcihlK1wiOiBjYW4ndCBzZXQgYXMgcHJvdG90eXBlIVwiKX07dC5leHBvcnRzPXtzZXQ6T2JqZWN0LnNldFByb3RvdHlwZU9mfHwoXCJfX3Byb3RvX19cImlue30/ZnVuY3Rpb24odCxlLG8pe3RyeXtvPWkoODApKEZ1bmN0aW9uLmNhbGwsaSg4OSkuZihPYmplY3QucHJvdG90eXBlLFwiX19wcm90b19fXCIpLnNldCwyKSxvKHQsW10pLGU9ISh0IGluc3RhbmNlb2YgQXJyYXkpfWNhdGNoKHQpe2U9ITB9cmV0dXJuIGZ1bmN0aW9uKHQsaSl7cmV0dXJuIHModCxpKSxlP3QuX19wcm90b19fPWk6byh0LGkpLHR9fSh7fSwhMSk6dm9pZCAwKSxjaGVjazpzfX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDczKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXso
21167MCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIG49KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIG4uX3NldE1hcmdpbnMobyksbn1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwicmVzaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3ZlcjtpZih0aGlzLm5lZWRzUmVmcmVzaChlLGkpKXt2YXIgbz10aGlzLmdldERpbWVuc2lvbnNGcm9tTGFiZWwodCxlLGkpLG49TWF0aC5tYXgoby53aWR0aCt0aGlzLm1hcmdpbi5yaWdodCt0aGlzLm1hcmdpbi5sZWZ0LG8uaGVpZ2h0K3RoaXMubWFyZ2luLnRvcCt0aGlzLm1hcmdpbi5ib3R0b20pO3RoaXMub3B0aW9ucy5zaXplPW4vMix0aGlzLndpZHRoPW4sdGhpcy5oZWlnaHQ9bix0aGlzLnJhZGl1cz10aGlzLndpZHRoLzJ9fX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5fZHJhd1Jhd0NpcmNsZSh0LGUsaSxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsdGhpcy5sZWZ0K3RoaXMudGV4dFNpemUud2lkdGgvMit0aGlzLm1hcmdpbi5sZWZ0LGksbyxuKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5ib3VuZGluZ0JveC50b3A9ZS10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC10aGlzLm9wdGlvbnMuc2l6ZSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PXQrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5ib3R0b209ZSt0aGlzLm9wdGlvbnMuc2l6ZX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5yZXNpemUodCksLjUqdGhpcy53aWR0aH19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDczKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvLG4scil7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBoPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBoLnNldEltYWdlcyhuLHIpLGh9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXI7aWYodm9pZCAwPT09dGhpcy5pbWFnZU9iai5zcmN8fHZvaWQgMD09PXRoaXMuaW1hZ2VPYmoud2lkdGh8fHZvaWQgMD09PXRoaXMuaW1hZ2VPYmouaGVpZ2h0KXt2YXIgbz0yKnRoaXMub3B0aW9ucy5zaXplO3JldHVybiB0aGlzLndpZHRoPW8sdGhpcy5oZWlnaHQ9byx2b2lkKHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfXRoaXMubmVlZHNSZWZyZXNoKGUsaSkmJnRoaXMuX3Jlc2l6ZUltYWdlKCl9fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLnN3aXRjaEltYWdlcyhvKSx0aGlzLnJlc2l6ZSgpLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5fZHJhd1Jhd0NpcmNsZSh0LGUsaSxzKSx0LnNhdmUoKSx0LmNsaXAoKSx0aGlzLl9kcmF3SW1hZ2VBdFBvc2l0aW9uKHQscyksdC5yZXN0b3JlKCksdGhpcy5fZHJhd0ltYWdlTGFiZWwodCxlLGksbyxuKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSl9fSx7a2V5OlwidXBkYXRlQm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuYm91bmRpbmdCb3gudG9wPWUtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PXQtdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5yaWdodD10K3RoaXMub3B0aW9ucy5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrdGhpcy5vcHRpb25zLnNpemUsdGhpcy5ib3VuZGluZ0JveC5sZWZ0PU1hdGgubWluKHRoaXMuYm91bmRpbmdCb3gubGVmdCx0aGlzLmxhYmVsTW9kdWxlLnNpemUubGVmdCksdGhpcy5ib3VuZGluZ0JveC5yaWdodD1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LnJpZ2h0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0K3RoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aCksdGhpcy5ib3VuZGluZ0JveC5ib3R0b209TWF0aC5tYXgodGhpcy5ib3VuZGluZ0JveC5ib3R0b20sdGhpcy5ib3VuZGluZ0JveC5ib3R0b20rdGhpcy5sYWJlbE9mZnNldCl9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMucmVzaXplKHQpLC41KnRoaXMud2lkdGh9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyMyksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLl9zZXRNYXJnaW5zKG8pLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtp
21167Zih0aGlzLm5lZWRzUmVmcmVzaChlLGkpKXt2YXIgbz10aGlzLmdldERpbWVuc2lvbnNGcm9tTGFiZWwodCxlLGkpLG49by53aWR0aCt0aGlzLm1hcmdpbi5yaWdodCt0aGlzLm1hcmdpbi5sZWZ0O3RoaXMud2lkdGg9bix0aGlzLmhlaWdodD1uLHRoaXMucmFkaXVzPXRoaXMud2lkdGgvMn19fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLnJlc2l6ZSh0LG8sbiksdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMix0aGlzLmluaXRDb250ZXh0Rm9yRHJhdyh0LHMpLHQuZGF0YWJhc2UoZS10aGlzLndpZHRoLzIsaS10aGlzLmhlaWdodC8yLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpLHRoaXMucGVyZm9ybUZpbGwodCxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbiksdGhpcy5sYWJlbE1vZHVsZS5kcmF3KHQsdGhpcy5sZWZ0K3RoaXMudGV4dFNpemUud2lkdGgvMit0aGlzLm1hcmdpbi5sZWZ0LHRoaXMudG9wK3RoaXMudGV4dFNpemUuaGVpZ2h0LzIrdGhpcy5tYXJnaW4udG9wLG8sbil9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDI0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsXCJkaWFtb25kXCIsNCxlLGksbyxuLHMpfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyNCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3RoaXMuX2RyYXdTaGFwZSh0LFwiY2lyY2xlXCIsMixlLGksbyxuLHMpfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLnJlc2l6ZSh0KSx0aGlzLm9wdGlvbnMuc2l6ZX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDIzKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp0aGlzLnNlbGVjdGVkLGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnRoaXMuaG92ZXI7aWYodGhpcy5uZWVkc1JlZnJlc2goZSxpKSl7dmFyIG89dGhpcy5nZXREaW1lbnNpb25zRnJvbUxhYmVsKHQsZSxpKTt0aGlzLmhlaWdodD0yKm8uaGVpZ2h0LHRoaXMud2lkdGg9by53aWR0aCtvLmhlaWdodCx0aGlzLnJhZGl1cz0uNSp0aGlzLndpZHRofX19LHtrZXk6XCJkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3RoaXMucmVzaXplKHQsbyxuKSx0aGlzLmxlZnQ9ZS0uNSp0aGlzLndpZHRoLHRoaXMudG9wPWktLjUqdGhpcy5oZWlnaHQsdGhpcy5pbml0Q29udGV4dEZvckRyYXcodCxzKSx0LmVsbGlwc2VfdmlzKHRoaXMubGVmdCx0aGlzLnRvcCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLnBlcmZvcm1GaWxsKHQscyksdGhpcy51cGRhdGVCb3VuZGluZ0JveChlLGksdCxvLG4pLHRoaXMubGFiZWxNb2R1bGUuZHJhdyh0LGUsaSxvLG4pfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMucmVzaXplKHQpO3ZhciBpPS41KnRoaXMud2lkdGgsbz0uNSp0aGlzLmhlaWdodCxuPU1hdGguc2luKGUpKmkscz1NYXRoLmNvcyhlKSpvO3JldHVybiBpKm8vTWF0aC5zcXJ0KG4qbitzKnMpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjMpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8peygwLGEuZGVmYXVsdCkodGhpcyxlKTt2YXIgbj0oMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKTtyZXR1cm4gbi5fc2V0TWFyZ2lucyhvKSxufXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJyZXNpemVcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dGhpcy5uZWVkc1JlZnJlc2goZSxpKSYmKHRoaXMuaWNvblNpemU9e3dpZHRoOk51bWJlcih0aGlzLm9wdGlvbnMuaWNvbi5zaXplKSxoZWlnaHQ6TnVtYmVyKHRoaXMub3B0aW9ucy5pY29uLnNpemUpfSx0aGlzLndpZHRoPXRoaXMuaWNvblNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGh
21167pcy5tYXJnaW4ubGVmdCx0aGlzLmhlaWdodD10aGlzLmljb25TaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7aWYodGhpcy5yZXNpemUodCxvLG4pLHRoaXMub3B0aW9ucy5pY29uLnNpemU9dGhpcy5vcHRpb25zLmljb24uc2l6ZXx8NTAsdGhpcy5sZWZ0PWUtdGhpcy53aWR0aC8yLHRoaXMudG9wPWktdGhpcy5oZWlnaHQvMix0aGlzLl9pY29uKHQsZSxpLG8sbixzKSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwpe3RoaXMubGFiZWxNb2R1bGUuZHJhdyh0LHRoaXMubGVmdCt0aGlzLmljb25TaXplLndpZHRoLzIrdGhpcy5tYXJnaW4ubGVmdCxpK3RoaXMuaGVpZ2h0LzIrNSxvKX10aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSl9fSx7a2V5OlwidXBkYXRlQm91bmRpbmdCb3hcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHRoaXMuYm91bmRpbmdCb3gudG9wPWUtLjUqdGhpcy5vcHRpb25zLmljb24uc2l6ZSx0aGlzLmJvdW5kaW5nQm94LmxlZnQ9dC0uNSp0aGlzLm9wdGlvbnMuaWNvbi5zaXplLHRoaXMuYm91bmRpbmdCb3gucmlnaHQ9dCsuNSp0aGlzLm9wdGlvbnMuaWNvbi5zaXplLHRoaXMuYm91bmRpbmdCb3guYm90dG9tPWUrLjUqdGhpcy5vcHRpb25zLmljb24uc2l6ZSx2b2lkIDAhPT10aGlzLm9wdGlvbnMubGFiZWwmJnRoaXMubGFiZWxNb2R1bGUuc2l6ZS53aWR0aD4wKXt0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsTW9kdWxlLnNpemUuaGVpZ2h0KzUpfX19LHtrZXk6XCJfaWNvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt2YXIgcj1OdW1iZXIodGhpcy5vcHRpb25zLmljb24uc2l6ZSk7dm9pZCAwIT09dGhpcy5vcHRpb25zLmljb24uY29kZT8odC5mb250PShvP1wiYm9sZCBcIjpcIlwiKStyK1wicHggXCIrdGh
21167pcy5vcHRpb25zLmljb24uZmFjZSx0LmZpbGxTdHlsZT10aGlzLm9wdGlvbnMuaWNvbi5jb2xvcnx8XCJibGFja1wiLHQudGV4dEFsaWduPVwiY2VudGVyXCIsdC50ZXh0QmFzZWxpbmU9XCJtaWRkbGVcIix0aGlzLmVuYWJsZVNoYWRvdyh0LHMpLHQuZmlsbFRleHQodGhpcy5vcHRpb25zLmljb24uY29kZSxlLGkpLHRoaXMuZGlzYWJsZVNoYWRvdyh0LHMpKTpjb25zb2xlLmVycm9yKFwiV2hlbiB1c2luZyB0aGUgaWNvbiBzaGFwZSwgeW91IG5lZWQgdG8gZGVmaW5lIHRoZSBjb2RlIGluIHRoZSBpY29uIG9wdGlvbnMgb2JqZWN0LiBUaGlzIGNhbiBiZSBkb25lIHBlciBub2RlIG9yIGdsb2JhbGx5LlwiKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoNzMpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8sbixyKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIGg9KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIGguc2V0SW1hZ2VzKG4sciksaH1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwicmVzaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuc2VsZWN0ZWQsaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dGhpcy5ob3ZlcjtpZih2b2lkIDA9PT10aGlzLmltYWdlT2JqLnNyY3x8dm9pZCAwPT09dGhpcy5pbWFnZU9iai53aWR0aHx8dm9pZCAwPT09dGhpcy5pbWFnZU9iai5oZWlnaHQpe3ZhciBvPTIqdGhpcy5vcHRpb25zLnNpemU7cmV0dXJuIHRoaXMud2lkdGg9byx2b2lkKHRoaXMuaGVpZ2h0PW8pfXRoaXMubmVlZHNSZWZyZXNoKGUsaSkmJnRoaXMuX3Jlc2l6ZUltYWdlKCl9fSx7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXtpZih0aGlzLnN3aXRjaEltYWdlcyhvKSx0aGlzLnJlc2l6ZSgpLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsITA9PT10aGlzLm9wdGlvbnMuc2hhcGVQcm9wZXJ0aWVzLnVzZUJvcmRlcldpdGhJbWFnZSl7dmFyIHI9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGE9dGhpcy5vcHRpb25zLmJvcmRlcldpZHRoU2VsZWN0ZWR8fDIqdGhpcy5vcHRpb25zLmJvcmRlcldpZHRoLGg9KG8/YTpyKS90aGlzLmJvZHkudmlldy5zY2FsZTt0LmxpbmVXaWR0aD1NYXRoLm1pbih0aGlzLndpZHRoLGgpLHQuYmVnaW5QYXRoKCksdC5zdHJva2VTdHlsZT1vP3RoaXMub3B0aW9ucy5jb2xvci5oaWdobGlnaHQuYm9yZGVyOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJvcmRlcjp0aGlzLm9wdGlvbnMuY29sb3IuYm9yZGVyLHQuZmlsbFN0eWxlPW8/dGhpcy5vcHRpb25zLmNvbG9yLmhpZ2hsaWdodC5iYWNrZ3JvdW5kOm4/dGhpcy5vcHRpb25zLmNvbG9yLmhvdmVyLmJhY2tncm91bmQ6dGhpcy5vcHRpb25zLmNvbG9yLmJhY2tncm91bmQsdC5yZWN0KHRoaXMubGVmdC0uNSp0LmxpbmVXaWR0aCx0aGlzLnRvcC0uNSp0LmxpbmVXaWR0aCx0aGlzLndpZHRoK3QubGluZVdpZHRoLHRoaXMuaGVpZ2h0K3QubGluZVdpZHRoKSx0LmZpbGwoKSx0aGlzLnBlcmZvcm1TdHJva2UodCxzKSx0LmNsb3NlUGF0aCgpfXRoaXMuX2RyYXdJbWFnZUF0UG9zaXRpb24odCxzKSx0aGlzLl9kcmF3SW1hZ2VMYWJlbCh0LGUsaSxvLG4pLHRoaXMudXBkYXRlQm91bmRpbmdCb3goZSxpKX19LHtrZXk6XCJ1cGRhdGVCb3VuZGluZ0JveFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dGhpcy5yZXNpemUoKSx0aGlzLl91cGRhdGVCb3VuZGluZ0JveCh0LGUpLHZvaWQgMCE9PXRoaXMub3B0aW9ucy5sYWJlbCYmdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoPjAmJih0aGlzLmJvdW5kaW5nQm94LmxlZnQ9TWF0aC5taW4odGhpcy5ib3VuZGluZ0JveC5sZWZ0LHRoaXMubGFiZWxNb2R1bGUuc2l6ZS5sZWZ0KSx0aGlzLmJvdW5kaW5nQm94LnJpZ2h0PU1hdGgubWF4KHRoaXMuYm91bmRpbmdCb3gucmlnaHQsdGhpcy5sYWJlbE1vZHVsZS5zaXplLmxlZnQrdGhpcy5sYWJlbE1vZHVsZS5zaXplLndpZHRoKSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbT1NYXRoLm1heCh0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSx0aGlzLmJvdW5kaW5nQm94LmJvdHRvbSt0aGlzLmxhYmVsT2Zmc2V0KSl9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX1cbn1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCxcInNxdWFyZVwiLDIsZSxpLG8sbixzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZh
21167dWx0KShlLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCxcImhleGFnb25cIiw0LGUsaSxvLG4scyl9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDI0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsXCJzdGFyXCIsNCxlLGksbyxuLHMpfX0se2tleTpcImRpc3RhbmNlVG9Cb3JkZXJcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kaXN0YW5jZVRvQm9yZGVyKHQsZSl9fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyMyksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7KDAsYS5kZWZhdWx0KSh0aGlzLGUpO3ZhciBuPSgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpO3JldHVybiBuLl9zZXRNYXJnaW5zKG8pLG59cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcInJlc2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0aGlzLm5lZWRzUmVmcmVzaChlLGkpJiYodGhpcy50ZXh0U2l6ZT10aGlzLmxhYmVsTW9kdWxlLmdldFRleHRTaXplKHQsZSxpKSx0aGlzLndpZHRoPXRoaXMudGV4dFNpemUud2lkdGgrdGhpcy5tYXJnaW4ucmlnaHQrdGh
21167pcy5tYXJnaW4ubGVmdCx0aGlzLmhlaWdodD10aGlzLnRleHRTaXplLmhlaWdodCt0aGlzLm1hcmdpbi50b3ArdGhpcy5tYXJnaW4uYm90dG9tLHRoaXMucmFkaXVzPS41KnRoaXMud2lkdGgpfX0se2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5yZXNpemUodCxvLG4pLHRoaXMubGVmdD1lLXRoaXMud2lkdGgvMix0aGlzLnRvcD1pLXRoaXMuaGVpZ2h0LzIsdGhpcy5lbmFibGVTaGFkb3codCxzKSx0aGlzLmxhYmVsTW9kdWxlLmRyYXcodCx0aGlzLmxlZnQrdGhpcy50ZXh0U2l6ZS53aWR0aC8yK3RoaXMubWFyZ2luLmxlZnQsdGhpcy50b3ArdGhpcy50ZXh0U2l6ZS5oZWlnaHQvMit0aGlzLm1hcmdpbi50b3AsbyxuKSx0aGlzLmRpc2FibGVTaGFkb3codCxzKSx0aGlzLnVwZGF0ZUJvdW5kaW5nQm94KGUsaSx0LG8sbil9fSx7a2V5OlwiZGlzdGFuY2VUb0JvcmRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2Rpc3RhbmNlVG9Cb3JkZXIodCxlKX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDI0KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcImRyYXdcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4scyl7dGhpcy5fZHJhd1NoYXBlKHQsXCJ0cmlhbmdsZVwiLDMsZSxpLG8sbixzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMjQpLG09byhmKSx2PWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUodCxpLG8pe3JldHVybigwLGEuZGVmYXVsdCkodGhpcyxlKSwoMCx1LmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMsdCxpLG8pKX1yZXR1cm4oMCxwLmRlZmF1bHQpKGUsdCksKDAsZC5kZWZhdWx0KShlLFt7a2V5OlwiZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt0aGlzLl9kcmF3U2hhcGUodCxcInRyaWFuZ2xlRG93blwiLDMsZSxpLG8sbixzKX19LHtrZXk6XCJkaXN0YW5jZVRvQm9yZGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZGlzdGFuY2VUb0JvcmRlcih0LGUpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWkoMiksZD1pKDExKSxsPWkoMTIpLHU9aSg3NCkuZGVmYXVsdCxjPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7dmFyIG49dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbWFnZXM9aSx0aGlzLmdyb3Vwcz1vLHRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZT10aGlzLmNyZWF0ZS5iaW5kKHRoaXMpLHRoaXMuZWRnZXNMaXN0ZW5lcnM9e2FkZDpmdW5jdGlvbih0LGUpe24uYWRkKGUuaXRlbXMpfSx1cGRhdGU6ZnVuY3Rpb24odCxlKXtuLnVwZGF0ZShlLml0ZW1zKX0scmVtb3ZlOmZ1bmN0aW9uKHQsZSl7bi5yZW1vdmUoZS5pdGVtcyl9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17YXJyb3dzOnt0bzp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6XCJhcnJvd1wifSxtaWRkbGU6e2VuYWJsZWQ6ITEsc2NhbGVGYWN0b3I6MSx0eXBlOlwiYXJyb3dcIn0sZnJvbTp7ZW5hYmxlZDohMSxzY2FsZUZhY3RvcjoxLHR5cGU6XCJhcnJvd1wifX0sYXJyb3dTdHJpa2V0aHJvdWdoOiEwLGNvbG9yOntjb2xvcjpcIiM4NDg0ODRcIixoaWdobGlnaHQ6XCIjODQ4NDg0XCIsaG92ZXI6XCIjODQ4NDg0XCIsaW5oZXJpdDpcImZyb21cIixvcGFjaXR5OjF9LGRhc2hlczohMSxmb250Ontjb2xvcjpcIiMzNDM0MzRcIixzaXplOjE0LGZhY2U6XCJhcmlhbFwiLGJhY2tncm91bmQ6XCJub25lXCIsc3Ryb2tlV2lkdGg6MixzdHJva2VDb2xvcjpcIiNmZmZmZmZcIixhbGlnbjpcImhvcml6b250YWxcIixtdWx0aTohMSx2YWRqdXN0OjAsYm9sZDp7bW9kOlwiYm9sZFwifSxib2xkaXRhbDp7bW9kOlwiYm9sZCBpdGFsaWNcIn0saXRhbDp7bW9kOlwiaXRhbGljXCJ9LG1vbm86e21vZDpcIlwiLHNpemU6MTUsZmFjZTpcImNvdXJpZXIgbmV3XCIsdmFkanVzdDoyfX0saGlkZGVuOiExLGhvdmVyV2lkdGg6MS41LGxhYmVsOnZvaWQgMCxsYWJlbEhpZ2hsaWdodEJvbGQ6ITAsbGVuZ3RoOnZvaWQgMCxwaHlzaWNzOiEwLHNjYWxpbmc6e21pbjoxLG1heDoxNSxsYWJlbDp7ZW5hYmxlZDohMCxtaW46MTQsbWF4OjMwLG1heFZpc2libGU6MzAsZHJhd1RocmVzaG9sZDo1fSxjdXN0b21TY2FsaW5nRnVuY3Rpb246ZnVuY3Rpb24odCxlLGksbyl7aWYoZT09PXQpcmV0dXJuLjU7dmFyIG49MS8oZS10KTtyZXR1cm4gTWF0aC5tYXgoMCwoby10KSpuKX19LHNlbGVjdGlvbldpZHRoOjEuNSxzZWxmUmVmZXJlbmNlU2l6ZToyMCxzaGFkb3c6e2VuYWJsZWQ6ITEsY29sb3I6XCJyZ2JhKDAsMCwwLDAuNSlcIixzaXplOjEwLHg6NSx5OjV9LHNtb290aDp7ZW5hYmxlZDohMCx0eXBlOlwiZHluYW1pY1wiLGZvcmNlRGlyZWN0aW9uOlwibm9uZVwiLHJvdW5kbmVzczouNX0sdGl0bGU6dm9pZCAwLHdpZHRoOjEsdmFsdWU6dm9pZCAwfSxoLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiX2ZvcmNlRGlzYWJsZUR5bmFtaWNDdXJ2ZXNcIixmdW5jdGlvbihlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO1wiZHluYW1pY1wiPT09ZSYmKGU9XCJjb250aW51b3VzXCIpO3ZhciBvPSExO2Zvcih2YXIgbiBpbiB0LmJvZHkuZWRnZXMpaWYodC5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KG4pKXt2YXIgcz10LmJvZHkuZWRnZXNbbl0scj10LmJvZHkuZGF0YS5lZGdlcy5fZGF0YVtuXTtpZih2b2lkIDAhPT1yKXt2YXIgYT1yLnNtb290aDt2b2lkIDAhPT1hJiYhMD09PWEuZW5hYmxlZCYmXCJkeW5hbWljXCI9PT1hLnR5cGUmJih2b2lkIDA9PT1lP3Muc2V0T3B0aW9ucyh7c21vb3RoOiExfSk6cy5zZXRPcHRpb25zKHtzbW9vdGg6e3R5cGU6ZX19KSxvPSEwKX19ITA9PT1pJiYhMD09PW8mJnQuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9kYXRhVXBkYXRlZFwiLGZ1bmN0aW9uKCl7dC5yZWNvbm5lY3RFZGdlcygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyZWZyZXNoRWRnZXNcIix0aGlzLnJlZnJlc2guYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyZWZyZXNoXCIsdGhpcy5yZWZyZXNoLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7aC5mb3JFYWNoKHQuZWRnZXNMaXN0ZW5lcnMsZnVuY3Rpb24oZSxpKXt0LmJvZHkuZGF0YS5lZGdlcyYmdC5ib2R5LmR
21167hdGEuZWRnZXMub2ZmKGksZSl9KSxkZWxldGUgdC5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVFZGdlLGRlbGV0ZSB0LmVkZ2VzTGlzdGVuZXJzLmFkZCxkZWxldGUgdC5lZGdlc0xpc3RlbmVycy51cGRhdGUsZGVsZXRlIHQuZWRnZXNMaXN0ZW5lcnMucmVtb3ZlLGRlbGV0ZSB0LmVkZ2VzTGlzdGVuZXJzfSl9fSx7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3UucGFyc2VPcHRpb25zKHRoaXMub3B0aW9ucyx0LCEwLHRoaXMuZGVmYXVsdE9wdGlvbnMsITApO3ZhciBlPSExO2lmKHZvaWQgMCE9PXQuc21vb3RoKWZvcih2YXIgaSBpbiB0aGlzLmJvZHkuZWRnZXMpdGhpcy5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KGkpJiYoZT10aGlzLmJvZHkuZWRnZXNbaV0udXBkYXRlRWRnZVR5cGUoKXx8ZSk7aWYodm9pZCAwIT09dC5mb250KWZvcih2YXIgbyBpbiB0aGlzLmJvZHkuZWRnZXMpdGhpcy5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KG8pJiZ0aGlzLmJvZHkuZWRnZXNbb10udXBkYXRlTGFiZWxNb2R1bGUoKTt2b2lkIDA9PT10LmhpZGRlbiYmdm9pZCAwPT09dC5waHlzaWNzJiYhMCE9PWV8fHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fX0se2tleTpcInNldERhdGFcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0mJmFyZ3VtZW50c1sxXSxvPXRoaXMuYm9keS5kYXRhLmVkZ2VzO2lmKHQgaW5zdGFuY2VvZiBkfHx0IGluc3RhbmNlb2YgbCl0aGlzLmJvZHkuZGF0YS5lZGdlcz10O2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl0aGlzLmJvZHkuZGF0YS5lZGdlcz1uZXcgZCx0aGlzLmJvZHkuZGF0YS5lZGdlcy5hZGQodCk7ZWxzZXtpZih0KXRocm93IG5ldyBUeXBlRXJyb3IoXCJBcnJheSBvciBEYXRhU2V0IGV4cGVjdGVkXCIpO3RoaXMuYm9keS5kYXRhLmVkZ2VzPW5ldyBkfWlmKG8mJmguZm9yRWFjaCh0aGlzLmVkZ2VzTGlzdGVuZXJzLGZ1bmN0aW9uKHQsZSl7by5vZmYoZSx0KX0pLHRoaXMuYm9keS5lZGdlcz17fSx0aGlzLmJvZHkuZGF0YS5lZGdlcyl7aC5mb3JFYWNoKHRoaXMuZWRnZXNMaXN0ZW5lcnMsZnVuY3Rpb24odCxpKXtlLmJvZHkuZGF0YS5lZGdlcy5vbihpLHQpfSk7dmFyIG49dGhpcy5ib2R5LmRhdGEuZWRnZXMuZ2V0SWRzKCk7dGhpcy5hZGQobiwhMCl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiKSwhMT09PWkmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiYWRkXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdJiZhcmd1bWVudHNbMV0saT10aGlzLmJvZHkuZWRnZXMsbz10aGlzLmJvZHkuZGF0YS5lZGdlcyxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBzPXRbbl0scj1pW3NdO3ImJnIuZGlzY29ubmVjdCgpO3ZhciBhPW8uZ2V0KHMse3Nob3dJbnRlcm5hbElkczohMH0pO2lbc109dGhpcy5jcmVhdGUoYSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiKSwhMT09PWUmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwidXBkYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5lZGdlcyxpPXRoaXMuYm9keS5kYXRhLmVkZ2VzLG89ITEsbj0wO248dC5sZW5ndGg7bisrKXt2YXIgcz10W25dLHI9aS5nZXQocyksYT1lW3NdO3ZvaWQgMCE9PWE/KGEuZGlzY29ubmVjdCgpLG89YS5zZXRPcHRpb25zKHIpfHxvLGEuY29ubmVjdCgpKToodGhpcy5ib2R5LmVkZ2VzW3NdPXRoaXMuY3JlYXRlKHIpLG89ITApfSEwPT09bz8odGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpKTp0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFVcGRhdGVkXCIpfX0se2tleTpcInJlbW92ZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoMCE9PXQubGVuZ3RoKXt2YXIgaT10aGlzLmJvZHkuZWRnZXM7aC5mb3JFYWNoKHQsZnVuY3Rpb24odCl7dmFyIGU9aVt0XTt2b2lkIDAhPT1lJiZlLnJlbW92ZSgpfSksZSYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19fSx7a2V5OlwicmVmcmVzaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztoLmZvckVhY2godGhpcy5ib2R5LmVkZ2VzLGZ1bmN0aW9uKGUsaSl7dmFyIG89dC5ib2R5LmRhdGEuZWRnZXMuX2RhdGFbaV07dm9pZCAwIT09byYmZS5zZXRPcHRpb25zKG8pfSl9fSx7a2V5OlwiY3JlYXRlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB1KHQsdGhpcy5ib2R5LHRoaXMub3B0aW9ucyx0aGlzLmRlZmF1bHRPcHRpb25zKX19LHtrZXk6XCJyZWNvbm5lY3RFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZT10aGlzLmJvZHkubm9kZXMsaT10aGlzLmJvZHkuZWRnZXM7Zm9yKHQgaW4gZSllLmhhc093blByb3BlcnR5KHQpJiYoZVt0XS5lZGdlcz1bXSk7Zm9yKHQgaW4gaSlpZihpLmhhc093blByb3BlcnR5KHQpKXt2YXIgbz1pW3RdO28uZnJvbT1udWxsLG8udG89bnVsbCxvLmNvbm5lY3QoKX19fSx7a2V5OlwiZ2V0Q29ubmVjdGVkTm9kZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1bXTtpZih2b2lkIDAhPT10aGlzLmJvZHkuZWRnZXNbdF0pe3ZhciBpPXRoaXMuYm9keS5lZGdlc1t0XTt2b2lkIDAhPT1pLmZyb21JZCYmZS5wdXNoKGkuZnJvbUlkKSx2b2lkIDAhPT1pLnRvSWQmJmUucHVzaChpLnRvSWQpfXJldHVybiBlfX0se2tleTpcIl91cGRhdGVTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fYWRkTWlzc2luZ0VkZ2VzKCksdGhpcy5fcmVtb3ZlSW52YWxpZEVkZ2VzKCl9fSx7a2V5OlwiX3JlbW92ZUludmFsaWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPVtdO2guZm9yRWFjaCh0aGlzLmJvZHkuZWRnZXMsZnVuY3Rpb24oaSxvKXt2YXIgbj10LmJvZHkubm9kZXNbaS50b0lkXSxzPXQuYm9keS5ub2Rlc1tpLmZyb21JZF07dm9pZCAwIT09biYmITA9PT1uLmlzQ2x1c3Rlcnx8dm9pZCAwIT09cyYmITA9PT1zLmlzQ2x1c3Rlcnx8dm9pZCAwIT09biYmdm9pZCAwIT09c3x8ZS5wdXNoKG8pfSksdGhpcy5yZW1vdmUoZSwhMSl9fSx7a2V5OlwiX2FkZE1pc3NpbmdFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LmVkZ2VzLGU9dGhpcy5ib2R5LmR
21167hdGEuZWRnZXMsaT1bXTtlLmZvckVhY2goZnVuY3Rpb24oZSxvKXt2b2lkIDA9PT10W29dJiZpLnB1c2gobyl9KSx0aGlzLmFkZChpLCEwKX19XSksdH0oKTtlLmRlZmF1bHQ9Y30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMzApLHM9byhuKSxyPWkoMyksYT1vKHIpLGg9aSgwKSxkPW8oaCksbD1pKDEpLHU9byhsKSxjPWkoNCkscD1vKGMpLGY9aSg1KSxtPW8oZiksdj1pKDIxNiksZz1vKHYpLHk9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsZC5kZWZhdWx0KSh0aGlzLGUpLCgwLHAuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLGEuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLG0uZGVmYXVsdCkoZSx0KSwoMCx1LmRlZmF1bHQpKGUsW3trZXk6XCJfbGluZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz1pWzBdLG49aVsxXTt0aGlzLl9iZXppZXJDdXJ2ZSh0LGUsbyxuKX19LHtrZXk6XCJfZ2V0VmlhQ29vcmRpbmF0ZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZnJvbS54LXRoaXMudG8ueCxlPXRoaXMuZnJvbS55LXRoaXMudG8ueSxpPXZvaWQgMCxvPXZvaWQgMCxuPXZvaWQgMCxzPXZvaWQgMCxyPXRoaXMub3B0aW9ucy5zbW9vdGgucm91bmRuZXNzO3JldHVybihNYXRoLmFicyh0KT5NYXRoLmFicyhlKXx8ITA9PT10aGlzLm9wdGlvbnMuc21vb3RoLmZvcmNlRGlyZWN0aW9ufHxcImhvcml6b250YWxcIj09PXRoaXMub3B0aW9ucy5zbW9vdGguZm9yY2VEaXJlY3Rpb24pJiZcInZlcnRpY2FsXCIhPT10aGlzLm9wdGlvbnMuc21vb3RoLmZvcmNlRGlyZWN0aW9uPyhvPXR
21167oaXMuZnJvbS55LHM9dGhpcy50by55LGk9dGhpcy5mcm9tLngtcip0LG49dGhpcy50by54K3IqdCk6KG89dGhpcy5mcm9tLnktciplLHM9dGhpcy50by55K3IqZSxpPXRoaXMuZnJvbS54LG49dGhpcy50by54KSxbe3g6aSx5Om99LHt4Om4seTpzfV19fSx7a2V5OlwiZ2V0VmlhTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCl9fSx7a2V5OlwiX2ZpbmRCb3JkZXJQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUpfX0se2tleTpcIl9nZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixyKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxoPSgwLHMuZGVmYXVsdCkoYSwyKSxkPWhbMF0sbD1oWzFdO3JldHVybiB0aGlzLl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSh0LGUsaSxvLG4scixkLGwpfX0se2tleTpcImdldFBvaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCksaT0oMCxzLmRlZmF1bHQpKGUsMiksbz1pWzBdLG49aVsxXSxyPXQsYT1bXTtyZXR1cm4gYVswXT1NYXRoLnBvdygxLXIsMyksYVsxXT0zKnIqTWF0aC5wb3coMS1yLDIpLGFbMl09MypNYXRoLnBvdyhyLDIpKigxLXIpLGFbM109TWF0aC5wb3cociwzKSx7eDphWzBdKnRoaXMuZnJvbVBvaW50LngrYVsxXSpvLngrYVsyXSpuLngrYVszXSp0aGlzLnRvUG9pbnQueCx5OmFbMF0qdGhpcy5mcm9tUG9pbnQueSthWzFdKm8ueSthWzJdKm4ueSthWzNdKnRoaXMudG9Qb2ludC55fX19XSksZX0oZy5kZWZhdWx0KTtlLmRlZmF1bHQ9eX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDc1KSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzLHIsYSl7dmFyIGg9MWU5LGQ9dm9pZCAwLGw9dm9pZCAwLHU9dm9pZCAwLGM9dm9pZCAwLHA9dm9pZCAwLGY9dCxtPWUsdj1bMCwwLDAsMF07Zm9yKGw9MTtsPDEwO2wrKyl1PS4xKmwsdlswXT1NYXRoLnBvdygxLXUsMyksdlsxXT0zKnUqTWF0aC5wb3coMS11LDIpLHZbMl09MypNYXRoLnBvdyh1LDIpKigxLXUpLHZbM109TWF0aC5wb3codSwzKSxjPXZbMF0qdCt2WzFdKnIueCt2WzJdKmEueCt2WzNdKmkscD12WzBdKmUrdlsxXSpyLnkrdlsyXSphLnkrdlszXSpvLGw+MCYmKGQ9dGhpcy5fZ2V0RGlzdGFuY2VUb0xpbmUoZixtLGMscCxuLHMpLGg9ZDxoP2Q6aCksZj1jLG09cDtyZXR1cm4gaH19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMzApLHM9byhuKSxyPWkoMyksYT1vKHIpLGg9aSgwKSxkPW8oaCksbD1pKDEpLHU9byhsKSxjPWkoNCkscD1vKGMpLGY9aSg1KSxtPW8oZiksdj1pKDc1KSxnPW8odikseT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXsoMCxkLmRlZmF1bHQpKHRoaXMsZSk7dmFyIG49KDAscC5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAsYS5kZWZhdWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSk7cmV0dXJuIG4uX2JvdW5kRnVuY3Rpb249ZnVuY3Rpb24oKXtuLnBvc2l0aW9uQmV6aWVyTm9kZSgpfSxuLmJvZHkuZW1pdHRlci5vbihcIl9yZXBvc2l0aW9uQmV6aWVyTm9kZXNcIixuLl9ib3VuZEZ1bmN0aW9uKSxufXJldHVybigwLG0uZGVmYXVsdCkoZSx0KSwoMCx1LmRlZmF1bHQpKGUsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9ITE7dGhpcy5vcHRpb25zLnBoeXNpY3MhPT10LnBoeXNpY3MmJihlPSEwKSx0aGlzLm9wdGlvbnM9dCx0aGlzLmlkPXRoaXMub3B0aW9ucy5pZCx0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHRoaXMuc2V0dXBTdXBwb3J0Tm9kZSgpLHRoaXMuY29ubmVjdCgpLCEwPT09ZSYmKHRoaXMudmlhLnNldE9wdGlvbnMoe3BoeXNpY3M6dGhpcy5vcHRpb25zLnBoeXNpY3N9KSx0aGlzLnBvc2l0aW9uQmV6aWVyTm9kZSgpKX19LHtrZXk6XCJjb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmZyb209dGhpcy5ib2R5Lm5vZGVzW3RoaXMub3B0aW9ucy5mcm9tXSx0aGlzLnRvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLm9wdGlvbnMudG9dLHZvaWQgMD09PXRoaXMuZnJvbXx8dm9pZCAwPT09dGhpcy50b3x8ITE9PT10aGlzLm9wdGlvbnMucGh5c2ljcz90aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOiExfSk6dGhpcy5mcm9tLmlkPT09dGhpcy50by5pZD90aGlzLnZpYS5zZXRPcHRpb25zKHtwaHlzaWNzOiExfSk6dGhpcy52aWEuc2V0T3B0aW9ucyh7cGh5c2ljczohMH0pfX0se2tleTpcImNsZWFudXBcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJfcmVwb3NpdGlvbkJlemllck5vZGVzXCIsdGhpcy5fYm91bmRGdW5jdGlvbiksdm9pZCAwIT09dGhpcy52aWEmJihkZWxldGUgdGhpcy5ib2R5Lm5vZGVzW3RoaXMudmlhLmlkXSx0aGlzLnZpYT12b2lkIDAsITApfX0se2tleTpcInNldHVwU3VwcG9ydE5vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMD09PXRoaXMudmlhKXt2YXIgdD1cImVkZ2VJZDpcIit0aGlzLmlkLGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHtpZDp0LHNoYXBlOlwiY2lyY2xlXCIscGh5c2ljczohMCxoaWRkZW46ITB9KTt0aGlzLmJvZHkubm9kZXNbdF09ZSx0aGlzLnZpYT1lLHRoaXMudmlhLnBhcmVudEVkZ2VJZD10aGlzLmlkLHRoaXMucG9zaXRpb25CZXppZXJOb2RlKCl9fX0se2tleTpcInBvc2l0aW9uQmV6aWVyTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy52aWEmJnZvaWQgMCE9PXRoaXMuZnJvbSYmdm9pZCAwIT09dGhpcy50bz8odGhpcy52aWEueD0uNSoodGhpcy5mcm9tLngrdGhpcy50by54KSx0aGlzLnZpYS55PS41Kih0aGlzLmZyb20ueSt0aGlzLnRvLnkpKTp2b2lkIDAhPT10aGlzLnZpYSYmKHRoaXMudmlhLng9MCx0aGlzLnZpYS55PTApfX0se2tleTpcIl9saW5lXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3RoaXMuX2JlemllckN1cnZlKHQsZSxpKX19LHtrZXk6XCJnZXRWaWFOb2RlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52aWF9fSx7a2V5OlwiZ2V0UG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy52aWEsaT10LG89dm9pZCAwLG49dm9pZCAwO2lmKHRoaXMuZnJvbT09PXRoaXMudG8pe3ZhciByPXRoaXMuX2dldENpcmNsZURhdGEodGhpcy5mcm9tKSxhPSgwLHMuZGVmYXVsdCkociwzKSxoPWFbMF0sZD1hWzFdLGw9YVsyXSx1PTIqTWF0aC5QSSooMS1pKTtvPWgrbCpNYXRoLnNpbih1KSxuPWQrbC1sKigxLU1hdGguY29zKHUpKX1lbHNlIG89TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LG49TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55O3JldHVybnt4Om8seTpufX19LHtrZXk6XCJfZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fZmluZEJvcmRlclBvc2l0aW9uQmV6aWVyKHQsZSx0aGlzLnZpYSl9fSx7a2V5OlwiX2dldERpc3RhbmNlVG9FZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyxuLHMpe3JldHVybiB0aGlzLl9nZXREaXN0YW5jZVRvQmV6aWVyRWRnZSh0LGUsaSxvLG4scyx0aGlzLnZpYSl9fV0pLGV9KGcuZGVmYXVsdCk7ZS5kZWZhdWx0PXl9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSg3NSksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJfbGluZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt0
21167aGlzLl9iZXppZXJDdXJ2ZSh0LGUsaSl9fSx7a2V5OlwiZ2V0VmlhTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFZpYUNvb3JkaW5hdGVzKCl9fSx7a2V5OlwiX2dldFZpYUNvb3JkaW5hdGVzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsaT10aGlzLm9wdGlvbnMuc21vb3RoLnJvdW5kbmVzcyxvPXRoaXMub3B0aW9ucy5zbW9vdGgudHlwZSxuPU1hdGguYWJzKHRoaXMuZnJvbS54LXRoaXMudG8ueCkscz1NYXRoLmFicyh0aGlzLmZyb20ueS10aGlzLnRvLnkpO2lmKFwiZGlzY3JldGVcIj09PW98fFwiZGlhZ29uYWxDcm9zc1wiPT09byl7dmFyIHI9dm9pZCAwLGE9dm9pZCAwO3I9YT1uPD1zP2kqczppKm4sdGhpcy5mcm9tLng+dGhpcy50by54JiYocj0tciksdGhpcy5mcm9tLnk+PXRoaXMudG8ueSYmKGE9LWEpLHQ9dGhpcy5mcm9tLngrcixlPXRoaXMuZnJvbS55K2EsXCJkaXNjcmV0ZVwiPT09byYmKG48PXM/dD1uPGkqcz90aGlzLmZyb20ueDp0OmU9czxpKm4/dGhpcy5mcm9tLnk6ZSl9ZWxzZSBpZihcInN0cmFpZ2h0Q3Jvc3NcIj09PW8pe3ZhciBoPSgxLWkpKm4sZD0oMS1pKSpzO248PXM/KGg9MCx0aGlzLmZyb20ueTx0aGlzLnRvLnkmJihkPS1kKSk6KHRoaXMuZnJvbS54PHRoaXMudG8ueCYmKGg9LWgpLGQ9MCksdD10aGlzLnRvLngraCxlPXRoaXMudG8ueStkfWVsc2UgaWYoXCJob3Jpem9udGFsXCI9PT1vKXt2YXIgbD0oMS1pKSpuO3RoaXMuZnJvbS54PHRoaXMudG8ueCYmKGw9LWwpLHQ9dGhpcy50by54K2wsZT10aGlzLmZyb20ueX1lbHNlIGlmKFwidmVydGljYWxcIj09PW8pe3ZhciB1PSgxLWkpKnM7dGhpcy5mcm9tLnk8dGhpcy50by55JiYodT0tdSksdD10aGlzLmZyb20ueCxlPXRoaXMudG8ueSt1fWVsc2UgaWYoXCJjdXJ2ZWRDV1wiPT09byl7bj10aGlzLnRvLngtdGhpcy5mcm9tLngscz10aGlzLmZyb20ueS10aGlzLnRvLnk7dmFyIGM9TWF0aC5zcXJ0KG4qbitzKnMpLHA9TWF0aC5QSSxmPU1hdGguYXRhbjIocyxuKSxtPShmKyguNSppKy41KSpwKSUoMipwKTt0PXRoaXMuZnJvbS54KyguNSppKy41KSpjKk1hdGguc2luKG0pLGU9dGhpcy5mcm9tLnkrKC41KmkrLjUpKmMqTWF0aC5jb3MobSl9ZWxzZSBpZihcImN1cnZlZENDV1wiPT09byl7bj10aGlzLnRvLngtdGhpcy5mcm9tLngscz10aGlzLmZyb20ueS10aGlzLnRvLnk7dmFyIHY9TWF0aC5zcXJ0KG4qbitzKnMpLGc9TWF0aC5QSSx5PU1hdGguYXRhbjIocyxuKSxiPSh5KyguNSotaSsuNSkqZyklKDIqZyk7dD10aGlzLmZyb20ueCsoLjUqaSsuNSkqdipNYXRoLnNpbihiKSxlPXRoaXMuZnJvbS55KyguNSppKy41KSp2Kk1hdGguY29zKGIpfWVsc2V7dmFyIF89dm9pZCAwLHc9dm9pZCAwO189dz1uPD1zP2kqczppKm4sdGhpcy5mcm9tLng+dGhpcy50by54JiYoXz0tXyksdGhpcy5mcm9tLnk+PXRoaXMudG8ueSYmKHc9LXcpLHQ9dGhpcy5mcm9tLngrXyxlPXRoaXMuZnJvbS55K3csbjw9cz90PXRoaXMuZnJvbS54PD10aGlzLnRvLng/dGhpcy50by54PHQ/dGhpcy50by54OnQ6dGhpcy50by54PnQ/dGhpcy50by54OnQ6ZT10aGlzLmZyb20ueT49dGhpcy50by55P3RoaXMudG8ueT5lP3RoaXMudG8ueTplOnRoaXMudG8ueTxlP3RoaXMudG8ueTplfXJldHVybnt4OnQseTplfX19LHtrZXk6XCJfZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06e307cmV0dXJuIHRoaXMuX2ZpbmRCb3JkZXJQb3NpdGlvbkJlemllcih0LGUsaS52aWEpfX0se2tleTpcIl9nZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoPjYmJnZvaWQgMCE9PWFyZ3VtZW50c1s2XT9hcmd1bWVudHNbNl06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKTtyZXR1cm4gdGhpcy5fZ2V0RGlzdGFuY2VUb0JlemllckVkZ2UodCxlLGksbyxuLHMscil9fSx7a2V5OlwiZ2V0UG9pbnRcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5fZ2V0VmlhQ29vcmRpbmF0ZXMoKSxpPXQ7cmV0dXJue3g6TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LngrMippKigxLWkpKmUueCtNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC54LHk6TWF0aC5wb3coMS1pLDIpKnRoaXMuZnJvbVBvaW50LnkrMippKigxLWkpKmUueStNYXRoLnBvdyhpLDIpKnRoaXMudG9Qb2ludC55fX19XSksZX0obS5kZWZhdWx0KTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMykscz1vKG4pLHI9aSgwKSxhPW8ociksaD1pKDEpLGQ9byhoKSxsPWkoNCksdT1vKGwpLGM9aSg1KSxwPW8oYyksZj1pKDExOCksbT1vKGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0LGksbyl7cmV0dXJuKDAsYS5kZWZhdWx0KSh0aGlzLGUpLCgwLHUuZGVmYXVsdCkodGhpcywoZS5fX3Byb3RvX198fCgwLHMuZGVmYXVsdCkoZSkpLmNhbGwodGhpcyx0LGksbykpfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJfbGluZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dC5iZWdpblBhdGgoKSx0Lm1vdmVUbyh0aGlzLmZyb21Qb2ludC54LHRoaXMuZnJvbVBvaW50LnkpLHQubGluZVRvKHRoaXMudG9Qb2ludC54LHRoaXMudG9Qb2ludC55KSx0aGlzLmVuYWJsZVNoYWRvdyh0LGUpLHQuc3Ryb2tlKCksdGhpcy5kaXNhYmxlU2hhZG93KHQsZSl9fSx7a2V5OlwiZ2V0VmlhTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7fX0se2tleTpcImdldFBvaW50XCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6KDEtdCkqdGhpcy5mcm9tUG9pbnQueCt0KnRoaXMudG9Qb2ludC54LHk6KDEtdCkqdGhpcy5mcm9tUG9pbnQueSt0KnRoaXMudG9Qb2ludC55fX19LHtrZXk6XCJfZmluZEJvcmRlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLnRvLG89dGhpcy5mcm9tO3QuaWQ9PT10aGlzLmZyb20uaWQmJihpPXRoaXMuZnJvbSxvPXRoaXMudG8pO3ZhciBuPU1hdGguYXRhbjIoaS55LW8ueSxpLngtby54KSxzPWkueC1vLngscj1pLnktby55LGE9TWF0aC5zcXJ0KHMqcytyKnIpLGg9dC5kaXN0YW5jZVRvQm9yZGVyKGUsbiksZD0oYS1oKS9hLGw9e307cmV0dXJuIGwueD0oMS1kKSpvLngrZCppLngsbC55PSgxLWQpKm8ueStkKmkueSxsfX0se2tleTpcIl9nZXREaXN0YW5jZVRvRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpLG8sbixzKXtyZXR1cm4gdGhpcy5fZ2V0RGlzdGFuY2VUb0xpbmUodCxlLGksbyxuLHMpfX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSg4KSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSgxMjApLmRlZmF1bHQsdT1pKDIyMSkuZGVmYXVsdCxjPWkoMjIyKS5kZWZh
21167dWx0LHA9aSgyMjMpLmRlZmF1bHQsZj1pKDIyNCkuZGVmYXVsdCxtPWkoMTIxKS5kZWZhdWx0LHY9aSgyMjUpLmRlZmF1bHQsZz1pKDIyNikuZGVmYXVsdCx5PWkoMiksYj1pKDExOSkuZGVmYXVsdCxfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT17cGh5c2ljc05vZGVJbmRpY2VzOltdLHBoeXNpY3NFZGdlSW5kaWNlczpbXSxmb3JjZXM6e30sdmVsb2NpdGllczp7fX0sdGhpcy5waHlzaWNzRW5hYmxlZD0hMCx0aGlzLnNpbXVsYXRpb25JbnRlcnZhbD0xZTMvNjAsdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITAsdGhpcy5wcmV2aW91c1N0YXRlcz17fSx0aGlzLnJlZmVyZW5jZVN0YXRlPXt9LHRoaXMuZnJlZXplQ2FjaGU9e30sdGhpcy5yZW5kZXJUaW1lcj12b2lkIDAsdGhpcy5hZGFwdGl2ZVRpbWVzdGVwPSExLHRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQ9ITEsdGhpcy5hZGFwdGl2ZUNvdW50ZXI9MCx0aGlzLmFkYXB0aXZlSW50ZXJ2YWw9Myx0aGlzLnN0YWJpbGl6ZWQ9ITEsdGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbj0hMSx0aGlzLnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTAsdGhpcy5yZWFkeT0hMSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17ZW5hYmxlZDohMCxiYXJuZXNIdXQ6e3RoZXRhOi41LGdyYXZpdGF0aW9uYWxDb25zdGFudDotMmUzLGNlbnRyYWxHcmF2aXR5Oi4zLHNwcmluZ0xlbmd0aDo5NSxzcHJpbmdDb25zdGFudDouMDQsZGFtcGluZzouMDksYXZvaWRPdmVybGFwOjB9LGZvcmNlQXRsYXMyQmFzZWQ6e3RoZXRhOi41LGdyYXZpdGF0aW9uYWxDb25zdGFudDotNTAsY2VudHJhbEdyYXZpdHk6LjAxLHNwcmluZ0NvbnN0YW50Oi4wOCxzcHJpbmdMZW5ndGg6MTAwLGRhbXBpbmc6LjQsYXZvaWRPdmVybGFwOjB9LHJlcHVsc2lvbjp7Y2VudHJhbEdyYXZpdHk6LjIsc3ByaW5nTGVuZ3RoOjIwMCxzcHJpbmdDb25zdGFudDouMDUsbm9kZURpc3RhbmNlOjEwMCxkYW1waW5nOi4wOSxhdm9pZE92ZXJsYXA6MH0saGllcmFyY2hpY2FsUmVwdWxzaW9uOntjZW50cmFsR3Jhdml0eTowLHNwcmluZ0xlbmd0aDoxMDAsc3ByaW5nQ29uc3RhbnQ6LjAxLG5vZGVEaXN0YW5jZToxMjAsZGFtcGluZzouMDl9LG1heFZlbG9jaXR5OjUwLG1pblZlbG9jaXR5Oi43NSxzb2x2ZXI6XCJiYXJuZXNIdXRcIixzdGFiaWxpemF0aW9uOntlbmFibGVkOiEwLGl0ZXJhdGlvbnM6MWUzLHVwZGF0ZUludGVydmFsOjUwLG9ubHlEeW5hbWljRWRnZXM6ITEsZml0OiEwfSx0aW1lc3RlcDouNSxhZGFwdGl2ZVRpbWVzdGVwOiEwfSx5LmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy50aW1lc3RlcD0uNSx0aGlzLmxheW91dEZhaWxlZD0hMSx0aGlzLmJpbmRFdmVudExpc3RlbmVycygpfXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleTpcImJpbmRFdmVudExpc3RlbmVyc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLmJvZHkuZW1pdHRlci5vbihcImluaXRQaHlzaWNzXCIsZnVuY3Rpb24oKXt0LmluaXRQaHlzaWNzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9sYXlvdXRGYWlsZWRcIixmdW5jdGlvbigpe3QubGF5b3V0RmFpbGVkPSEwfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJyZXNldFBoeXNpY3NcIixmdW5jdGlvbigpe3Quc3RvcFNpbXVsYXRpb24oKSx0LnJlYWR5PSExfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkaXNhYmxlUGh5c2ljc1wiLGZ1bmN0aW9uKCl7dC5waHlzaWNzRW5hYmxlZD0hMSx0LnN0b3BTaW11bGF0aW9uKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInJlc3RvcmVQaHlzaWNzXCIsZnVuY3Rpb24oKXt0LnNldE9wdGlvbnModC5vcHRpb25zKSwhMD09PXQucmVhZHkmJnQuc3RhcnRTaW11bGF0aW9uKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInN0YXJ0U2ltdWxhdGlvblwiLGZ1bmN0aW9uKCl7ITA9PT10LnJlYWR5JiZ0LnN0YXJ0U2ltdWxhdGlvbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJzdG9wU2ltdWxhdGlvblwiLGZ1bmN0aW9uKCl7dC5zdG9wU2ltdWxhdGlvbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZXN0cm95XCIsZnVuY3Rpb24oKXt0LnN0b3BTaW11bGF0aW9uKCExKSx0LmJvZHkuZW1pdHRlci5vZmYoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX2RhdGFDaGFuZ2VkXCIsZnVuY3Rpb24oKXt0LnVwZGF0ZVBoeXNpY3NEYXRhKCl9KX19LHtrZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dCYmKCExPT09dD8odGhpcy5vcHRpb25zLmVuYWJsZWQ9ITEsdGhpcy5waHlzaWNzRW5hYmxlZD0hMSx0aGlzLnN0b3BTaW11bGF0aW9uKCkpOiEwPT09dD8odGhpcy5vcHRpb25zLmVuYWJsZWQ9ITAsdGhpcy5waHlzaWNzRW5hYmxlZD0hMCx0aGlzLnN0YXJ0U2ltdWxhdGlvbigpKToodGhpcy5waHlzaWNzRW5hYmxlZD0hMCx5LnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoW1wic3RhYmlsaXphdGlvblwiXSx0aGlzLm9wdGlvbnMsdCkseS5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJzdGFiaWxpemF0aW9uXCIpLHZvaWQgMD09PXQuZW5hYmxlZCYmKHRoaXMub3B0aW9ucy5lbmFibGVkPSEwKSwhMT09PXRoaXMub3B0aW9ucy5lbmFibGVkJiYodGhpcy5waHlzaWNzRW5hYmxlZD0hMSx0aGlzLnN0b3BTaW11bGF0aW9uKCkpLHRoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwKSksdGhpcy5pbml0KCl9fSx7a2V5OlwiaW5pdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ7XCJmb3JjZUF0bGFzMkJhc2VkXCI9PT10aGlzLm9wdGlvbnMuc29sdmVyPyh0PXRoaXMub3B0aW9ucy5mb3JjZUF0bGFzMkJhc2VkLHRoaXMubm9kZXNTb2x2ZXI9bmV3IHYodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgcCh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmdyYXZpdHlTb2x2ZXI9bmV3IGcodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCkpOlwicmVwdWxzaW9uXCI9PT10aGlzLm9wdGlvbnMuc29sdmVyPyh0PXRoaXMub3B0aW9ucy5yZXB1bHNpb24sdGhpcy5ub2Rlc1NvbHZlcj1uZXcgdSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmVkZ2VzU29sdmVyPW5ldyBwKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZ3Jhdml0eVNvbHZlcj1uZXcgbSh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSk6XCJoaWVyYXJjaGljYWxSZXB1bHNpb25cIj09PXRoaXMub3B0aW9ucy5zb2x2ZXI/KHQ9dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbFJlcHVsc2lvbix0aGlzLm5vZGVzU29sdmVyPW5ldyBjKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpLHRoaXMuZWRnZXNTb2x2ZXI9bmV3IGYodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5ncmF2aXR5U29sdmVyPW5ldyBtKHRoaXMuYm9keSx0aGlzLnBoeXNpY3NCb2R5LHQpKToodD10aGlzLm9wdGlvbnMuYmFybmVzSHV0LHRoaXMubm9kZXNTb2x2ZXI9bmV3IGwodGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCksdGhpcy5lZGdlc1NvbHZlcj1uZXcgcCh0aGlzLmJvZHksdGhpcy5waHlzaWNzQm9keSx0KSx0aGlzLmdyYXZpdHlTb2x2ZXI9bmV3IG0odGhpcy5ib2R5LHRoaXMucGh5c2ljc0JvZHksdCkpLHRoaXMubW9kZWxPcHRpb25zPXR9fSx7a2V5OlwiaW5pdFBoeXNpY3NcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5waHlzaWNzRW5hYmxlZCYmITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8hMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLmVuYWJsZWQ/dGhpcy5zdGFiaWxpemUoKToodGhpcy5zdGFiaWxpemVkPSExLHRoaXMucmVhZHk9ITAsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImZpdFwiLHt9LHRoaXMubGF5b3V0RmFpbGVkKSx0aGlzLnN0YXJ0U2ltdWxhdGlvbigpKToodGhpcy5yZWFkeT0hMCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiZml0XCIpKX19LHtrZXk6XCJzdGFydFNpbXVsYXRpb25cIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5waHlzaWNzRW5hYmxlZCYmITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8odGhpcy5zdGFiaWxpemVkPSExLHRoaXMuYWRhcHRpdmVUaW
211671lc3RlcD0hMSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3Jlc2l6ZU5vZGVzXCIpLHZvaWQgMD09PXRoaXMudmlld0Z1bmN0aW9uJiYodGhpcy52aWV3RnVuY3Rpb249dGhpcy5zaW11bGF0aW9uU3RlcC5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0YXJ0UmVuZGVyaW5nXCIpKSk6dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9fSx7a2V5Olwic3RvcFNpbXVsYXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PSEoYXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0pfHxhcmd1bWVudHNbMF07dGhpcy5zdGFiaWxpemVkPSEwLCEwPT09dCYmdGhpcy5fZW1pdFN0YWJpbGl6ZWQoKSx2b2lkIDAhPT10aGlzLnZpZXdGdW5jdGlvbiYmKHRoaXMuYm9keS5lbWl0dGVyLm9mZihcImluaXRSZWRyYXdcIix0aGlzLnZpZXdGdW5jdGlvbiksdGhpcy52aWV3RnVuY3Rpb249dm9pZCAwLCEwPT09dCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9zdG9wUmVuZGVyaW5nXCIpKX19LHtrZXk6XCJzaW11bGF0aW9uU3RlcFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9RGF0ZS5ub3coKTt0aGlzLnBoeXNpY3NUaWNrKCksKERhdGUubm93KCktdDwuNCp0aGlzLnNpbXVsYXRpb25JbnRlcnZhbHx8ITA9PT10aGlzLnJ1bkRvdWJsZVNwZWVkKSYmITE9PT10aGlzLnN0YWJpbGl6ZWQmJih0aGlzLnBoeXNpY3NUaWNrKCksdGhpcy5ydW5Eb3VibGVTcGVlZD0hMCksITA9PT10aGlzLnN0YWJpbGl6ZWQmJnRoaXMuc3RvcFNpbXVsYXRpb24oKX19LHtrZXk6XCJfZW1pdFN0YWJpbGl6ZWRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9uczsodGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucz4xfHwhMD09PXRoaXMuc3RhcnRlZFN0YWJpbGl6YXRpb24pJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dC5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YWJpbGl6ZWRcIix7aXRlcmF0aW9uczplfSksdC5zdGFydGVkU3RhYmlsaXphdGlvbj0hMSx0LnN0YWJpbGl6YXRpb25JdGVyYXRpb25zPTB9LDApfX0se2tleTpcInBoeXNpY3NTdGVwXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmdyYXZpdHlTb2x2ZXIuc29sdmUoKSx0aGlzLm5vZGVzU29sdmVyLnNvbHZlKCksdGhpcy5lZGdlc1NvbHZlci5zb2x2ZSgpLHRoaXMubW92ZU5vZGVzKCl9fSx7a2V5OlwiYWRqdXN0VGltZVN0ZXBcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5fZXZhbHVhdGVTdGVwUXVhbGl0eSgpP3RoaXMudGltZXN0ZXA9MS4yKnRoaXMudGltZXN0ZXA6dGhpcy50aW1lc3RlcC8xLjI8dGhpcy5vcHRpb25zLnRpbWVzdGVwP3RoaXMudGltZXN0ZXA9dGhpcy5vcHRpb25zLnRpbWVzdGVwOih0aGlzLmFkYXB0aXZlQ291bnRlcj0tMSx0aGlzLnRpbWVzdGVwPU1hdGgubWF4KHRoaXMub3B0aW9ucy50aW1lc3RlcCx0aGlzLnRpbWVzdGVwLzEuMikpfX0se2tleTpcInBoeXNpY3NUaWNrXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZih0aGlzLl9zdGFydFN0YWJpbGl6aW5nKCksITAhPT10aGlzLnN0YWJpbGl6ZWQpe2lmKCEwPT09dGhpcy5hZGFwdGl2ZVRpbWVzdGVwJiYhMD09PXRoaXMuYWRhcHRpdmVUaW1lc3RlcEVuYWJsZWQpe3RoaXMuYWRhcHRpdmVDb3VudGVyJXRoaXMuYWRhcHRpdmVJbnRlcnZhbD09MD8odGhpcy50aW1lc3RlcD0yKnRoaXMudGltZXN0ZXAsdGhpcy5waHlzaWNzU3RlcCgpLHRoaXMucmV2ZXJ0KCksdGhpcy50aW1lc3RlcD0uNSp0aGlzLnRpbWVzdGVwLHRoaXMucGh5c2ljc1N0ZXAoKSx0aGlzLnBoeXNpY3NTdGVwKCksdGhpcy5hZGp1c3RUaW1lU3RlcCgpKTp0aGlzLnBoeXNpY3NTdGVwKCksdGhpcy5hZGFwdGl2ZUNvdW50ZXIrPTF9ZWxzZSB0aGlzLnRpbWVzdGVwPXRoaXMub3B0aW9ucy50aW1lc3RlcCx0aGlzLnBoeXNpY3NTdGVwKCk7ITA9PT10aGlzLnN0YWJpbGl6ZWQmJnRoaXMucmV2ZXJ0KCksdGhpcy5zdGFiaWxpemF0aW9uSXRlcmF0aW9ucysrfX19LHtrZXk6XCJ1cGRhdGVQaHlzaWNzRGF0YVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5waHlzaWNzQm9keS5mb3JjZXM9e30sdGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXM9W10sdGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXM9W107dmFyIHQ9dGhpcy5ib2R5Lm5vZGVzLGU9dGhpcy5ib2R5LmVkZ2VzO2Zvcih2YXIgaSBpbiB0KXQuaGFzT3duUHJvcGVydHkoaSkmJiEwPT09dFtpXS5vcHRpb25zLnBoeXNpY3MmJnRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLnB1c2godFtpXS5pZCk7Zm9yKHZhciBvIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShvKSYmITA9PT1lW29dLm9wdGlvbnMucGh5c2ljcyYmdGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMucHVzaChlW29dLmlkKTtmb3IodmFyIG49MDtuPHRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aDtuKyspe3ZhciBzPXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzW25dO3RoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3NdPXt4OjAseTowfSx2b2lkIDA9PT10aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbc10mJih0aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbc109e3g6MCx5OjB9KX1mb3IodmFyIHIgaW4gdGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzKXZvaWQgMD09PXRbcl0mJmRlbGV0ZSB0aGlzLnBoeXNpY3NCb2R5LnZlbG9jaXRpZXNbcl19fSx7a2V5OlwicmV2ZXJ0XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0oMCxzLmRlZmF1bHQpKHRoaXMucHJldmlvdXNTdGF0ZXMpLGU9dGhpcy5ib2R5Lm5vZGVzLGk9dGhpcy5waHlzaWNzQm9keS52ZWxvY2l0aWVzO3RoaXMucmVmZXJlbmNlU3RhdGU9e307Zm9yKHZhciBvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBuPXRbb107dm9pZCAwIT09ZVtuXT8hMD09PWVbbl0ub3B0aW9ucy5waHlzaWNzJiYodGhpcy5yZWZlcmVuY2VTdGF0ZVtuXT17cG9zaXRpb25zOnt4OmVbbl0ueCx5OmVbbl0ueX19LGlbbl0ueD10aGlzLnByZXZpb3VzU3RhdGVzW25dLnZ4LGlbbl0ueT10aGlzLnByZXZpb3VzU3RhdGVzW25dLnZ5LGVbbl0ueD10aGlzLnByZXZpb3VzU3RhdGVzW25dLngsZVtuXS55PXRoaXMucHJldmlvdXNTdGF0ZXNbbl0ueSk6ZGVsZXRlIHRoaXMucHJldmlvdXNTdGF0ZXNbbl19fX0se2tleTpcIl9ldmFsdWF0ZVN0ZXBRdWFsaXR5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD12b2lkIDAsZT12b2lkIDAsaT10aGlzLmJvZHkubm9kZXMsbz10aGlzLnJlZmVyZW5jZVN0YXRlO2Zvcih2YXIgbiBpbiB0aGlzLnJlZmVyZW5jZVN0YXRlKWlmKHRoaXMucmVmZXJlbmNlU3RhdGUuaGFzT3duUHJvcGVydHkobikmJnZvaWQgMCE9PWlbbl0mJih0PWlbbl0ueC1vW25dLnBvc2l0aW9ucy54LGU9aVtuXS55LW9bbl0ucG9zaXRpb25zLnksTWF0aC5zcXJ0KE1hdGgucG93KHQsMikrTWF0aC5wb3coZSwyKSk+LjMpKXJldHVybiExO3JldHVybiEwfX0se2tleTpcIm1vdmVOb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLGU9MCxpPTAsbz0wO288dC5sZW5ndGg7bysrKXt2YXIgbj10W29dLHM9dGhpcy5fcGVyZm9ybVN0ZXAobik7ZT1NYXRoLm1heChlLHMpLGkrPXN9dGhpcy5hZGFwdGl2ZVRpbWVzdGVwRW5hYmxlZD1pL3QubGVuZ3RoPDUsdGhpcy5zdGFiaWxpemVkPWU8dGhpcy5vcHRpb25zLm1pblZlbG9jaXR5fX0se2tleTpcImNhbGN1bGF0ZUNvbXBvbmVudFZlbG9jaXR5XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3QrPShlLXRoaXMubW9kZWxPcHRpb25zLmRhbXBpbmcqdCkvaSp0aGlzLnRpbWVzdGVwO3ZhciBvPXR
21167oaXMub3B0aW9ucy5tYXhWZWxvY2l0eXx8MWU5O3JldHVybiBNYXRoLmFicyh0KT5vJiYodD10PjA/bzotbyksdH19LHtrZXk6XCJfcGVyZm9ybVN0ZXBcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmJvZHkubm9kZXNbdF0saT10aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1t0XSxvPXRoaXMucGh5c2ljc0JvZHkudmVsb2NpdGllc1t0XTtyZXR1cm4gdGhpcy5wcmV2aW91c1N0YXRlc1t0XT17eDplLngseTplLnksdng6by54LHZ5Om8ueX0sITE9PT1lLm9wdGlvbnMuZml4ZWQueD8oby54PXRoaXMuY2FsY3VsYXRlQ29tcG9uZW50VmVsb2NpdHkoby54LGkueCxlLm9wdGlvbnMubWFzcyksZS54Kz1vLngqdGhpcy50aW1lc3RlcCk6KGkueD0wLG8ueD0wKSwhMT09PWUub3B0aW9ucy5maXhlZC55PyhvLnk9dGhpcy5jYWxjdWxhdGVDb21wb25lbnRWZWxvY2l0eShvLnksaS55LGUub3B0aW9ucy5tYXNzKSxlLnkrPW8ueSp0aGlzLnRpbWVzdGVwKTooaS55PTAsby55PTApLE1hdGguc3FydChNYXRoLnBvdyhvLngsMikrTWF0aC5wb3coby55LDIpKX19LHtrZXk6XCJfZnJlZXplTm9kZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYm9keS5ub2Rlcztmb3IodmFyIGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpJiZ0W2VdLngmJnRbZV0ueSl7dmFyIGk9dFtlXS5vcHRpb25zLmZpeGVkO3RoaXMuZnJlZXplQ2FjaGVbZV09e3g6aS54LHk6aS55fSxpLng9ITAsaS55PSEwfX19LHtrZXk6XCJfcmVzdG9yZUZyb3plbk5vZGVzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkubm9kZXM7Zm9yKHZhciBlIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShlKSYmdm9pZCAwIT09dGhpcy5mcmVlemVDYWNoZVtlXSYmKHRbZV0ub3B0aW9ucy5maXhlZC54PXRoaXMuZnJlZXplQ2FjaGVbZV0ueCx0W2VdLm9wdGlvbnMuZml4ZWQueT10aGlzLmZyZWV6
21167ZUNhY2hlW2VdLnkpO3RoaXMuZnJlZXplQ2FjaGU9e319fSx7a2V5Olwic3RhYmlsaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLml0ZXJhdGlvbnM7aWYoXCJudW1iZXJcIiE9dHlwZW9mIGUmJihlPXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLml0ZXJhdGlvbnMsY29uc29sZS5sb2coXCJUaGUgc3RhYmlsaXplIG1ldGhvZCBuZWVkcyBhIG51bWVyaWMgYW1vdW50IG9mIGl0ZXJhdGlvbnMuIFN3aXRjaGluZyB0byBkZWZhdWx0OiBcIixlKSksMD09PXRoaXMucGh5c2ljc0JvZHkucGh5c2ljc05vZGVJbmRpY2VzLmxlbmd0aClyZXR1cm4gdm9pZCh0aGlzLnJlYWR5PSEwKTt0aGlzLmFkYXB0aXZlVGltZXN0ZXA9dGhpcy5vcHRpb25zLmFkYXB0aXZlVGltZXN0ZXAsdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXNpemVOb2Rlc1wiKSx0aGlzLnN0b3BTaW11bGF0aW9uKCksdGhpcy5zdGFiaWxpemVkPSExLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfYmxvY2tSZWRyYXdcIiksdGhpcy50YXJnZXRJdGVyYXRpb25zPWUsITA9PT10aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi5vbmx5RHluYW1pY0VkZ2VzJiZ0aGlzLl9mcmVlemVOb2RlcygpLHRoaXMuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM9MCxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHQuX3N0YWJpbGl6YXRpb25CYXRjaCgpfSwwKX19LHtrZXk6XCJfc3RhcnRTdGFiaWxpemluZ1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuITAhPT10aGlzLnN0YXJ0ZWRTdGFiaWxpemF0aW9uJiYodGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U3RhYmlsaXppbmdcIiksdGhpcy5zdGFydGVkU3RhYmlsaXphdGlvbj0hMCwhMCl9fSx7a2V5OlwiX3N0YWJpbGl6YXRpb25CYXRjaFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKCl7cmV0dXJuITE9PT10LnN0YWJpbGl6ZWQmJnQuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnM8dC50YXJnZXRJdGVyYXRpb25zfSxpPWZ1bmN0aW9uKCl7dC5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YWJpbGl6YXRpb25Qcm9ncmVzc1wiLHtpdGVyYXRpb25zOnQuc3RhYmlsaXphdGlvbkl0ZXJhdGlvbnMsdG90YWw6dC50YXJnZXRJdGVyYXRpb25zfSl9O3RoaXMuX3N0YXJ0U3RhYmlsaXppbmcoKSYmaSgpO2Zvcih2YXIgbz0wO2UoKSYmbzx0aGlzLm9wdGlvbnMuc3RhYmlsaXphdGlvbi51cGRhdGVJbnRlcnZhbDspdGhpcy5waHlzaWNzVGljaygpLG8rKztpKCksZSgpP3NldFRpbWVvdXQodGhpcy5fc3RhYmlsaXphdGlvbkJhdGNoLmJpbmQodGhpcyksMCk6dGhpcy5fZmluYWxpemVTdGFiaWxpemF0aW9uKCl9fSx7a2V5OlwiX2ZpbmFsaXplU3RhYmlsaXphdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9hbGxvd1JlZHJhd1wiKSwhMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLmZpdCYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImZpdFwiKSwhMD09PXRoaXMub3B0aW9ucy5zdGFiaWxpemF0aW9uLm9ubHlEeW5hbWljRWRnZXMmJnRoaXMuX3Jlc3RvcmVGcm96ZW5Ob2RlcygpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJzdGFiaWxpemF0aW9uSXRlcmF0aW9uc0RvbmVcIiksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpLCEwPT09dGhpcy5zdGFiaWxpemVkP3RoaXMuX2VtaXRTdGFiaWxpemVkKCk6dGhpcy5zdGFydFNpbXVsYXRpb24oKSx0aGlzLnJlYWR5PSEwfX0se2tleTpcIl9kcmF3Rm9yY2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcy5sZW5ndGg7ZSsrKXt2YXIgaT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlc1tlXSxvPXRoaXMuYm9keS5ub2Rlc1tpXSxuPXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW2ldLHM9TWF0aC5zcXJ0KE1hdGgucG93KG4ueCwyKStNYXRoLnBvdyhuLngsMikpLHI9TWF0aC5taW4oTWF0aC5tYXgoNSxzKSwxNSksYT0zKnIsaD15LkhTVlRvSGV4KCgxODAtMTgwKk1hdGgubWluKDEsTWF0aC5tYXgoMCwuMDMqcykpKS8zNjAsMSwxKSxkPXt4Om8ueCsyMCpuLngseTpvLnkrMjAqbi55fTt0LmxpbmVXaWR0aD1yLHQuc3Ryb2tlU3R5bGU9aCx0LmJlZ2luUGF0aCgpLHQubW92ZVRvKG8ueCxvLnkpLHQubGluZVRvKGQueCxkLnkpLHQuc3Ryb2tlKCk7dmFyIGw9TWF0aC5hdGFuMihuLnksbi54KTt0LmZpbGxTdHlsZT1oLGIuZHJhdyh0LHt0eXBlOlwiYXJyb3dcIixwb2ludDpkLGFuZ2xlOmwsbGVuZ3RoOmF9KSx0LmZpbGwoKX19fV0pLHR9KCk7ZS5kZWZhdWx0PV99LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1pLHRoaXMuc2V0T3B0aW9ucyhvKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPXR9fSx7a2V5Olwic29sdmVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGksbyxuLHMscixhLGg9dGhpcy5ib2R5Lm5vZGVzLGQ9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzTm9kZUluZGljZXMsbD10aGlzLnBoeXNpY3NCb2R5LmZvcmNlcyx1PXRoaXMub3B0aW9ucy5ub2RlRGlzdGFuY2UsYz0tMi8zL3UscD0wO3A8ZC5sZW5ndGgtMTtwKyspe3I9aFtkW3BdXTtmb3IodmFyIGY9cCsxO2Y8ZC5sZW5ndGg7ZisrKWE9aFtkW2ZdXSx0PWEueC1yLngsZT1hLnktci55LGk9TWF0aC5zcXJ0KHQqdCtlKmUpLDA9PT1pJiYoaT0uMSpNYXRoLnJhbmRvbSgpLHQ9aSksaTwyKnUmJihzPWk8LjUqdT8xOmMqaSs0LzMscy89aSxvPXQqcyxuPWUqcyxsW3IuaWRdLngtPW8sbFtyLmlkXS55LT1uLGxbYS5pZF0ueCs9byxsW2EuaWRdLnkrPW4pfX19XSksdH0oKTtlLmRlZmF1bHQ9aH0s
21167ZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8peygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLnBoeXNpY3NCb2R5PWksdGhpcy5zZXRPcHRpb25zKG8pfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLm9wdGlvbnM9dH19LHtrZXk6XCJzb2x2ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQsZSxpLG8sbixzLHIsYSxoLGQsbD10aGlzLmJvZHkubm9kZXMsdT10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyxjPXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzLHA9dGhpcy5vcHRpb25zLm5vZGVEaXN0YW5jZTtmb3IoaD0wO2g8dS5sZW5ndGgtMTtoKyspZm9yKHI9bFt1W2hdXSxkPWgrMTtkPHUubGVuZ3RoO2QrKylpZihhPWxbdVtkXV0sci5sZXZlbD09PWEubGV2ZWwpe3Q9YS54LXIueCxlPWEueS1yLnksaT1NYXRoLnNxcnQodCp0K2UqZSlcbiAgICA7cz1pPHA/LU1hdGgucG93KC4wNSppLDIpK01hdGgucG93KC4wNSpwLDIpOjAsMD09PWk/aT0uMDE6cy89aSxvPXQqcyxuPWUqcyxjW3IuaWRdLngtPW8sY1tyLmlkXS55LT1uLGNbYS5pZF0ueCs9byxjW2EuaWRdLnkrPW59fX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgwKSxzPW8obikscj1pKDEpLGE9byhyKSxoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGh5c2ljc0JvZHk9aSx0aGlzLnNldE9wdGlvbnMobyl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMub3B0aW9ucz10fX0se2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMsbz10aGlzLmJvZHkuZWRnZXMsbj12b2lkIDAscz12b2lkIDAscj12b2lkIDAsYT0wO2E8aS5sZW5ndGg7YSsrKWU9b1tpW2FdXSwhMD09PWUuY29ubmVjdGVkJiZlLnRvSWQhPT1lLmZyb21JZCYmdm9pZCAwIT09dGhpcy5ib2R5Lm5vZGVzW2UudG9JZF0mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tlLmZyb21JZF0mJih2b2lkIDAhPT1lLmVkZ2VUeXBlLnZpYT8odD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoP3RoaXMub3B0aW9ucy5zcHJpbmdMZW5ndGg6ZS5vcHRpb25zLmxlbmd0aCxuPWUudG8scz1lLmVkZ2VUeXBlLnZpYSxyPWUuZnJvbSx0aGlzLl9jYWxjdWxhdGVTcHJpbmdGb3JjZShuLHMsLjUqdCksdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UocyxyLC41KnQpKToodD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoPzEuNSp0aGlzLm9wdGlvbnMuc3ByaW5nTGVuZ3RoOmUub3B0aW9ucy5sZW5ndGgsdGhpcy5fY2FsY3VsYXRlU3ByaW5nRm9yY2UoZS5mcm9tLGUudG8sdCkpKX19LHtrZXk6XCJfY2FsY3VsYXRlU3ByaW5nRm9yY2VcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dC54LWUueCxuPXQueS1lLnkscz1NYXRoLm1heChNYXRoLnNxcnQobypvK24qbiksLjAxKSxyPXRoaXMub3B0aW9ucy5zcHJpbmdDb25zdGFudCooaS1zKS9zLGE9bypyLGg9bipyO3ZvaWQgMCE9PXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW3QuaWRdJiYodGhpcy5waHlzaWNzQm9keS5mb3JjZXNbdC5pZF0ueCs9YSx0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1t0LmlkXS55Kz1oKSx2b2lkIDAhPT10aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tlLmlkXSYmKHRoaXMucGh5c2ljc0JvZHkuZm9yY2VzW2UuaWRdLngtPWEsdGhpcy5waHlzaWNzQm9keS5mb3JjZXNbZS5pZF0ueS09aCl9fV0pLHR9KCk7ZS5kZWZhdWx0PWh9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5waHlzaWNzQm9keT1pLHRoaXMuc2V0T3B0aW9ucyhvKX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zPXR9fSx7a2V5Olwic29sdmVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCxlLGksbyxuLHMscixhLGg9dGhpcy5ib2R5LmVkZ2VzLGQ9dGhpcy5waHlzaWNzQm9keS5waHlzaWNzRWRnZUluZGljZXMsbD10aGlzLnBoeXNpY3NCb2R5LnBoeXNpY3NOb2RlSW5kaWNlcyx1PXRoaXMucGh5c2ljc0JvZHkuZm9yY2VzLGM9MDtjPGwubGVuZ3RoO2MrKyl7dmFyIHA9bFtjXTt1W3BdLnNwcmluZ0Z4PTAsdVtwXS5zcHJpbmdGeT0wfWZvcih2YXIgZj0wO2Y8ZC5sZW5ndGg7ZisrKWU9aFtkW2ZdXSwhMD09PWUuY29ubmVjdGVkJiYodD12b2lkIDA9PT1lLm9wdGlvbnMubGVuZ3RoP3RoaXMub3B0aW9ucy5zcHJpbmdMZW5ndGg6ZS5vcHRpb25zLmxlbmd0aCxpPWUuZnJvbS54LWUudG8ueCxvPWUuZnJvbS55LWUudG8ueSxhPU1hdGguc3FydChpKmkrbypvKSxhPTA9PT1hPy4wMTphLHI9dGhpcy5vcHRpb25zLnNwcmluZ0NvbnN0YW50Kih0LWEpL2Esbj1pKnIscz1vKnIsZS50by5sZXZlbCE9ZS5mcm9tLmxldmVsPyh2b2lkIDAhPT11W2UudG9JZF0mJih1W2UudG9JZF0uc3ByaW5nRngtPW4sdVtlLnRvSWRdLnNwcmluZ0Z5LT1zKSx2b2lkIDAhPT11W2UuZnJvbUlkXSYmKHVbZS5mcm9tSWRdLnNwcmluZ0Z4Kz
211671uLHVbZS5mcm9tSWRdLnNwcmluZ0Z5Kz1zKSk6KHZvaWQgMCE9PXVbZS50b0lkXSYmKHVbZS50b0lkXS54LT0uNSpuLHVbZS50b0lkXS55LT0uNSpzKSx2b2lkIDAhPT11W2UuZnJvbUlkXSYmKHVbZS5mcm9tSWRdLngrPS41Km4sdVtlLmZyb21JZF0ueSs9LjUqcykpKTtyPTE7Zm9yKHZhciBtLHYsZz0wO2c8bC5sZW5ndGg7ZysrKXt2YXIgeT1sW2ddO209TWF0aC5taW4ocixNYXRoLm1heCgtcix1W3ldLnNwcmluZ0Z4KSksdj1NYXRoLm1pbihyLE1hdGgubWF4KC1yLHVbeV0uc3ByaW5nRnkpKSx1W3ldLngrPW0sdVt5XS55Kz12fWZvcih2YXIgYj0wLF89MCx3PTA7dzxsLmxlbmd0aDt3Kyspe3ZhciB4PWxbd107Yis9dVt4XS54LF8rPXVbeF0ueX1mb3IodmFyIGs9Yi9sLmxlbmd0aCxTPV8vbC5sZW5ndGgsRD0wO0Q8bC5sZW5ndGg7RCsrKXt2YXIgTT1sW0RdO3VbTV0ueC09ayx1W01dLnktPVN9fX1dKSx0fSgpO2UuZGVmYXVsdD1ofSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMTIwKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9jYWxjdWxhdGVGb3JjZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pezA9PT10JiYodD0uMSpNYXRoLnJhbmRvbSgpLGU9dCksdGhpcy5vdmVybGFwQXZvaWRhbmNlRmFjdG9yPDEmJm8uc2hhcGUucmFkaXVzJiYodD1NYXRoLm1heCguMSt0aGlzLm92ZXJsYXBBdm9pZGFuY2VGYWN0b3Iqby5zaGFwZS5yYWRpdXMsdC1vLnNoYXBlLnJhZGl1cykpO3ZhciBzPW8uZWRnZXMubGVuZ3RoKzEscj10aGlzLm9wdGlvbnMuZ3Jhdml0YXRpb25hbENvbnN0YW50Km4ubWFzcypvLm9wdGlvbnMubWFzcypzL01hdGgucG93KHQsMiksYT1lKnIsaD1pKnI7dGhpcy5waHlzaWNzQm9keS5mb3JjZXNbby5pZF0ueCs9YSx0aGlzLnBoeXNpY3NCb2R5LmZvcmNlc1tvLmlkXS55Kz1ofX1dKSxlfShtLmRlZmF1bHQpO2UuZGVmYXVsdD12fSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSk7dmFyIG49aSgzKSxzPW8obikscj1pKDApLGE9byhyKSxoPWkoMSksZD1vKGgpLGw9aSg0KSx1PW8obCksYz1pKDUpLHA9byhjKSxmPWkoMTIxKSxtPW8oZiksdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvKXtyZXR1cm4oMCxhLmRlZmF1bHQpKHRoaXMsZSksKDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvKSl9cmV0dXJuKDAscC5kZWZhdWx0KShlLHQpLCgwLGQuZGVmYXVsdCkoZSxbe2tleTpcIl9jYWxjdWxhdGVGb3JjZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe2lmKHQ+MCl7dmFyIHM9bi5lZGdlcy5sZW5ndGgrMSxyPXRoaXMub3B0aW9ucy5jZW50cmFsR3Jhdml0eSpzKm4ub3B0aW9ucy5tYXNzO29bbi5pZF0ueD1lKnIsb1tuLmlkXS55PWkqcn19fV0pLGV9KG0uZGVmYXVsdCk7ZS5kZWZhdWx0PXZ9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDgpLHM9byhuKSxyPWkoNiksYT1vKHIpLGg9aSgwKSxkPW8oaCksbD1pKDEpLHU9byhsKSxjPWkoMikscD1pKDc2KS5kZWZhdWx0LGY9aSgyMjgpLmRlZmF1bHQsbT1pKDc0KS5kZWZhdWx0LHY9aSg0NykuZGVmYXVsdCxnPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXt2YXIgaT10aGlzOygwLGQuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmNsdXN0ZXJlZE5vZGVzPXt9LHRoaXMuY2x1c3RlcmVkRWRnZXM9e30sdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e30sYy5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3Jlc2V0RGF0YVwiLGZ1bmN0aW9uKCl7aS5jbHVzdGVyZWROb2Rlcz17fSxpLmNsdXN0ZXJlZEVkZ2VzPXt9fSl9cmV0dXJuKDAsdS5kZWZhdWx0KSh0LFt7a2V5OlwiY2x1c3RlckJ5SHVic2l6ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dD90PXRoaXMuX2dldEh1YlNpemUoKTpcIm9iamVjdFwiPT09KHZvaWQgMD09PXQ/XCJ1bmRlZmluZWRcIjooMCxhLmRlZmF1bHQpKHQpKSYmKGU9dGhpcy5fY2hlY2tPcHRpb25zKHQpLHQ9dGhpcy5fZ2V0SHViU2l6ZSgpKTtmb3IodmFyIGk9W10sbz0wO288dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5ub2Rlc1t0aGlzLmJvZHkubm9kZUluZGljZXNbb11dO24uZWRnZXMubGVuZ3RoPj10JiZpLnB1c2gobi5pZCl9Zm9yKHZhciBzPTA7czxpLmxlbmd0aDtzKyspdGhpcy5jbHVzdGVyQnlDb25uZWN0aW9uKGlbc10sZSwhMCk7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19LHtrZXk6XCJjbHVzdGVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9LGk9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTtpZih2b2lkIDA9PT1lLmpvaW5Db25kaXRpb24pdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGNhbGwgY2x1c3RlckJ5Tm9kZURhdGEgd2l0aG91dCBhIGpvaW5Db25kaXRpb24gZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnMuXCIpO2U9dGhpcy5fY2hlY2tPcHRpb25zKGUpO3ZhciBvPXt9LG49e307Yy5mb3JFYWNoKHRoaXMuYm9keS5ub2RlcyxmdW5jdGlvbihpLHMpe3ZhciByPXAuY2xvbmVPcHRpb25zKGkpOyEwPT09ZS5qb2luQ29uZGl0aW9uKHIpJiYob1tzXT1pLGMuZm9yRWFjaChpLmVkZ2VzLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PXQuY2x1c3RlcmVkRWRnZXNbZS5pZF0mJihuW2UuaWRdPWUpfSkpfSksdGhpcy5fY2x1c3RlcihvLG4sZSxpKX19LHtrZXk6XCJjbHVzdGVyQnlFZGdlQ291bnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2U9dGhpcy5fY2hlY2tPcHRpb25zKGUpO2Zvcih2YXIgbj1bXSxyPXt9LGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9MDtsPHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg7bCsrKXt2YXIgdSxjLGY7IWZ1bmN0aW9uKG8pe3ZhciBsPXt9LG09e30sdj1pLmJvZHkubm9kZUluZGljZXNbb10sZz1pLmJvZHkubm9kZXNbdl07aWYodm9pZCAwPT09clt2XSl7ZD0wLGg9W107Zm9yKHZhciB5PTA7eTxnLmVkZ2VzLmxlbmd0aDt5KyspYT1nLmVkZ2VzW3ldLHZvaWQgMD09PWkuY2x1c3RlcmVkRWRnZXNbYS5pZF0mJihhLnRvSWQhPT1hLmZyb21JZCYmZCsrLGgucHVzaChhKSk7aWYoZD09PXQpe3U9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09ZS5qb2luQ29uZGl0aW9ufHxudWxsPT09ZS5qb2luQ29uZGl0aW9uKXJldHVybiEwO3ZhciBpPXAuY2xvbmVPcHRpb25zKHQpO3JldHVybiBlLmpvaW5Db25kaXRpb24oaSl9O2Zvcih2YXIgYj0hMCxfPTA7XzxoLmxlbmd0aDtfKyspe2E9aFtfXTt2YXIgdz1pLl9nZXRDb25uZWN0ZWRJZChhLHYpO2lmKCF1KGcpKXtiPSExO2JyZWFrfW1bYS5pZF09YSxsW3ZdPWcsbFt3XT1pLmJvZHkubm9kZXNbd10sclt2XT0hMH1pZigoMCxzLmRlZmF1bHQpKGwpLmxlbmd0aD4wJiYoMCxzLmRlZmF1bHQpKG0pLmxlbmd0aD4wJiYhMD09PWIpaWYoYz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8bi5sZW5ndGg7Kyt0KWZvcih2YXIgZSBpbiBsKWlmKHZvaWQgMCE9PW5bdF0ubm9kZXNbZV0pcmV0dXJuIG5bdF19LHZvaWQgMCE9PShmPWMoKSkpe2Zvcih2YXIgeCBpbiBsKXZvaWQgMD09PWYubm9kZXNbeF0mJihmLm5vZGVzW3hdPWxbeF0pO2Zvcih2YXIgayBpbiBtKXZvaWQgMD09PWYuZWRnZXNba10mJihmLmVkZ2VzW2tdPW1ba10pfWVsc2Ugbi5wdXNoKHtub2RlczpsLGVkZ2VzOm19KX19fShsKX1mb3IodmFyIGw9MDtsPG4ubGVuZ3RoO2wrKyl0aGlzLl9jbHVzdGVyKG5bbF0ubm9kZXMsbltsXS5lZGdlcyxlLCExKTshMD09PW8mJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiY2x1c3Rlck91dGxpZXJzXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXTt0aGlzLmNsdXN0ZXJCeUVkZ2VDb3VudCgxLHQsZSl9fSx7a2V5OlwiY2x1c3RlckJyaWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT0hKGFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdKXx8YXJndW1lbnRzWzFdO3RoaXMuY2x1c3RlckJ5RWRnZUNvdW50KDIsdCxlKX19LHtrZXk6XCJjbHVzdGVyQnlDb25uZWN0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gbm9kZUlkIHN1cHBsaWVkIHRvIGNsdXN0ZXJCeUNvbm5lY3Rpb24hXCIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgbm9kZUlkIGdpdmVuIHRvIGNsdXN0ZXJCeUNvbm5lY3Rpb24gZG9lcyBub3QgZXhpc3QhXCIpO3ZhciBvPXR
21167oaXMuYm9keS5ub2Rlc1t0XTtlPXRoaXMuX2NoZWNrT3B0aW9ucyhlLG8pLHZvaWQgMD09PWUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLngmJihlLmNsdXN0ZXJOb2RlUHJvcGVydGllcy54PW8ueCksdm9pZCAwPT09ZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMueSYmKGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLnk9by55KSx2b2lkIDA9PT1lLmNsdXN0ZXJOb2RlUHJvcGVydGllcy5maXhlZCYmKGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkPXt9LGUuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmZpeGVkLng9by5vcHRpb25zLmZpeGVkLngsZS5jbHVzdGVyTm9kZVByb3BlcnRpZXMuZml4ZWQueT1vLm9wdGlvbnMuZml4ZWQueSk7dmFyIG49e30scj17fSxhPW8uaWQsaD1wLmNsb25lT3B0aW9ucyhvKTtuW2FdPW87Zm9yKHZhciBkPTA7ZDxvLmVkZ2VzLmxlbmd0aDtkKyspe3ZhciBsPW8uZWRnZXNbZF07aWYodm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tsLmlkXSl7dmFyIHU9dGhpcy5fZ2V0Q29ubmVjdGVkSWQobCxhKTtpZih2b2lkIDA9PT10aGlzLmNsdXN0ZXJlZE5vZGVzW3VdKWlmKHUhPT1hKWlmKHZvaWQgMD09PWUuam9pbkNvbmRpdGlvbilyW2wuaWRdPWwsblt1XT10aGlzLmJvZHkubm9kZXNbdV07ZWxzZXt2YXIgYz1wLmNsb25lT3B0aW9ucyh0aGlzLmJvZHkubm9kZXNbdV0pOyEwPT09ZS5qb2luQ29uZGl0aW9uKGgsYykmJihyW2wuaWRdPWwsblt1XT10aGlzLmJvZHkubm9kZXNbdV0pfWVsc2UgcltsLmlkXT1sfX12YXIgZj0oMCxzLmRlZmF1bHQpKG4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gblt0XS5pZH0pO2ZvcihtIGluIG4paWYobi5oYXNPd25Qcm9wZXJ0eShtKSlmb3IodmFyIG09blttXSx2PTA7djxtLmVkZ2VzLmxlbmd0aDt2Kyspe3ZhciBnPW0uZWRnZXNbdl07Zi5pbmRleE9mKHRoaXMuX2dldENvbm5lY3RlZElkKGcsbS5pZCkpPi0xJiYocltnLmlkXT1nKX10aGlzLl9jbHVzdGVyKG4scixlLGkpfX0se2tleTpcIl9jcmVhdGVDbHVzdGVyRWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtmb3IodmFyIG49dm9pZCAwLHI9dm9pZCAwLGE9dm9pZCAwLGg9dm9pZCAwLGQ9dm9pZCAwLGw9dm9pZCAwLHU9KDAscy5kZWZh
21167dWx0KSh0KSxjPVtdLHA9MDtwPHUubGVuZ3RoO3ArKyl7cj11W3BdLGE9dFtyXTtmb3IodmFyIGY9MDtmPGEuZWRnZXMubGVuZ3RoO2YrKyluPWEuZWRnZXNbZl0sdm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1tuLmlkXSYmKG4udG9JZD09bi5mcm9tSWQ/ZVtuLmlkXT1uOm4udG9JZD09cj8oaD1pLmlkLGQ9bi5mcm9tSWQsbD1kKTooaD1uLnRvSWQsZD1pLmlkLGw9aCksdm9pZCAwPT09dFtsXSYmYy5wdXNoKHtlZGdlOm4sZnJvbUlkOmQsdG9JZDpofSkpfWZvcih2YXIgbT1bXSx2PTA7djxjLmxlbmd0aDt2Kyspe3ZhciBnPWNbdl0seT1nLmVkZ2UsYj1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPG0ubGVuZ3RoO2UrKyl7dmFyIGk9bVtlXSxvPXQuZnJvbUlkPT09aS5mcm9tSWQmJnQudG9JZD09PWkudG9JZCxuPXQuZnJvbUlkPT09aS50b0lkJiZ0LnRvSWQ9PT1pLmZyb21JZDtpZihvfHxuKXJldHVybiBpfXJldHVybiBudWxsfShnKTtudWxsPT09Yj8oYj10aGlzLl9jcmVhdGVDbHVzdGVyZWRFZGdlKGcuZnJvbUlkLGcudG9JZCx5LG8pLG0ucHVzaChiKSk6Yi5jbHVzdGVyaW5nRWRnZVJlcGxhY2luZ0lkcy5wdXNoKHkuaWQpLHRoaXMuYm9keS5lZGdlc1t5LmlkXS5lZGdlUmVwbGFjZWRCeUlkPWIuaWQsdGhpcy5fYmFja3VwRWRnZU9wdGlvbnMoeSkseS5zZXRPcHRpb25zKHtwaHlzaWNzOiExfSl9fX0se2tleTpcIl9jaGVja09wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdP2FyZ3VtZW50c1swXTp7fTtyZXR1cm4gdm9pZCAwPT09dC5jbHVzdGVyRWRnZVByb3BlcnRpZXMmJih0LmNsdXN0ZXJFZGdlUHJvcGVydGllcz17fSksdm9pZCAwPT09dC5jbHVzdGVyTm9kZVByb3BlcnRpZXMmJih0LmNsdXN0ZXJOb2RlUHJvcGVydGllcz17fSksdH19LHtrZXk6XCJfY2x1c3RlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXt2YXIgbz0hKGFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdKXx8YXJndW1lbnRzWzNdO2lmKDAhPSgwLHMuZGVmYXVsdCkodCkubGVuZ3RoJiYoMSE9KDAscy5kZWZh
21167dWx0KSh0KS5sZW5ndGh8fDE9PWkuY2x1c3Rlck5vZGVQcm9wZXJ0aWVzLmFsbG93U2luZ2xlTm9kZUNsdXN0ZXIpKXtmb3IodmFyIG4gaW4gdClpZih0Lmhhc093blByb3BlcnR5KG4pJiZ2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW25dKXJldHVybjt2YXIgcj1jLmRlZXBFeHRlbmQoe30saS5jbHVzdGVyTm9kZVByb3BlcnRpZXMpO2lmKHZvaWQgMCE9PWkucHJvY2Vzc1Byb3BlcnRpZXMpe3ZhciBhPVtdO2Zvcih2YXIgaCBpbiB0KWlmKHQuaGFzT3duUHJvcGVydHkoaCkpe3ZhciBkPXAuY2xvbmVPcHRpb25zKHRbaF0pO2EucHVzaChkKX12YXIgbD1bXTtmb3IodmFyIHUgaW4gZSlpZihlLmhhc093blByb3BlcnR5KHUpJiZcImNsdXN0ZXJFZGdlOlwiIT09dS5zdWJzdHIoMCwxMikpe3ZhciBtPXAuY2xvbmVPcHRpb25zKGVbdV0sXCJlZGdlXCIpO2wucHVzaChtKX1pZighKHI9aS5wcm9jZXNzUHJvcGVydGllcyhyLGEsbCkpKXRocm93IG5ldyBFcnJvcihcIlRoZSBwcm9jZXNzUHJvcGVydGllcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gcHJvcGVydGllcyFcIil9dm9pZCAwPT09ci5pZCYmKHIuaWQ9XCJjbHVzdGVyOlwiK2MucmFuZG9tVVVJRCgpKTt2YXIgdj1yLmlkO3ZvaWQgMD09PXIubGFiZWwmJihyLmxhYmVsPVwiY2x1c3RlclwiKTt2YXIgZz12b2lkIDA7dm9pZCAwPT09ci54JiYoZz10aGlzLl9nZXRDbHVzdGVyUG9zaXRpb24odCksci54PWcueCksdm9pZCAwPT09ci55JiYodm9pZCAwPT09ZyYmKGc9dGhpcy5fZ2V0Q2x1c3RlclBvc2l0aW9uKHQpKSxyLnk9Zy55KSxyLmlkPXY7dmFyIHk9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKHIsZik7eS5jb250YWluZWROb2Rlcz10LHkuY29udGFpbmVkRWRnZXM9ZSx5LmNsdXN0ZXJFZGdlUHJvcGVydGllcz1pLmNsdXN0ZXJFZGdlUHJvcGVydGllcyx0aGlzLmJvZHkubm9kZXNbci5pZF09eSx0aGlzLl9jbHVzdGVyRWRnZXModCxlLHIsaS5jbHVzdGVyRWRnZVByb3BlcnRpZXMpLHIuaWQ9dm9pZCAwLCEwPT09byYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9kYXRhQ2hhbmdlZFwiKX19fSx7a2V5OlwiX2JhY2t1cEVkZ2VPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5jbHVzdGVyZWRFZGdlc1t0LmlkXSYmKHRoaXMuY2x1c3RlcmVkRWRnZXNbdC5pZF09e3BoeXNpY3M6dC5vcHRpb25zLnBoeXNpY3N9KX19LHtrZXk6XCJfcmVzdG9yZUVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmNsdXN0ZXJlZEVkZ2VzW3QuaWRdO3ZvaWQgMCE9PWUmJih0LnNldE9wdGlvbnMoe3BoeXNpY3M6ZS5waHlzaWNzfSksZGVsZXRlIHRoaXMuY2x1c3RlcmVkRWRnZXNbdC5pZF0pfX0se2tleTpcImlzQ2x1c3RlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0/ITA9PT10aGlzLmJvZHkubm9kZXNbdF0uaXNDbHVzdGVyOihjb25zb2xlLmxvZyhcIk5vZGUgZG9lcyBub3QgZXhpc3QuXCIpLCExKX19LHtrZXk6XCJfZ2V0Q2x1c3RlclBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSgwLHMuZGVmYXVsdCkodCksaT10W2VbMF1dLngsbz10W2VbMF1dLngsbj10W2VbMF1dLnkscj10W2VbMF1dLnksYT12b2lkIDAsaD0xO2g8ZS5sZW5ndGg7aCsrKWE9dFtlW2hdXSxpPWEueDxpP2EueDppLG89YS54Pm8/YS54Om8sbj1hLnk8bj9hLnk6bixyPWEueT5yP2EueTpyO3JldHVybnt4Oi41KihpK28pLHk6LjUqKG4rcil9fX0se2tleTpcIm9wZW5DbHVzdGVyXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0hKGFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdKXx8YXJndW1lbnRzWzJdO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKFwiTm8gY2x1c3Rlck5vZGVJZCBzdXBwbGllZCB0byBvcGVuQ2x1c3Rlci5cIik7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW3RdO2lmKHZvaWQgMD09PW8pdGhyb3cgbmV3IEVycm9yKFwiVGhlIGNsdXN0ZXJOb2RlSWQgc3VwcGxpZWQgdG8gb3BlbkNsdXN0ZXIgZG9lcyBub3QgZXhpc3QuXCIpO2lmKCEwIT09by5pc0NsdXN0ZXJ8fHZvaWQgMD09PW8uY29udGFpbmVkTm9kZXN8fHZvaWQgMD09PW8uY29udGFpbmVkRWRnZXMpdGhyb3cgbmV3IEVycm9yKFwiVGhlIG5vZGU6XCIrdCtcIiBpcyBub3QgYSB2YWxpZCBjbHVzdGVyLlwiKTt2YXIgbj10aGlzLmZpbmROb2RlKHQpLHM9bi5pbmRleE9mKHQpLTE7aWYocz49MCl7dmFyIHI9bltzXTtyZXR1cm4gdGhpcy5ib2R5Lm5vZGVzW3JdLl9vcGVuQ2hpbGRDbHVzdGVyKHQpLGRlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF0sdm9p
21167ZCghMD09PWkmJnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIikpfXZhciBhPW8uY29udGFpbmVkTm9kZXMsaD1vLmNvbnRhaW5lZEVkZ2VzO2lmKHZvaWQgMCE9PWUmJnZvaWQgMCE9PWUucmVsZWFzZUZ1bmN0aW9uJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnJlbGVhc2VGdW5jdGlvbil7dmFyIGQ9e30sbD17eDpvLngseTpvLnl9O2Zvcih2YXIgdSBpbiBhKWlmKGEuaGFzT3duUHJvcGVydHkodSkpe3ZhciBwPXRoaXMuYm9keS5ub2Rlc1t1XTtkW3VdPXt4OnAueCx5OnAueX19dmFyIGY9ZS5yZWxlYXNlRnVuY3Rpb24obCxkKTtmb3IodmFyIG0gaW4gYSlpZihhLmhhc093blByb3BlcnR5KG0pKXt2YXIgdj10aGlzLmJvZHkubm9kZXNbbV07dm9pZCAwIT09ZlttXSYmKHYueD12b2lkIDA9PT1mW21dLng/by54OmZbbV0ueCx2Lnk9dm9pZCAwPT09ZlttXS55P28ueTpmW21dLnkpfX1lbHNlIGMuZm9yRWFjaChhLGZ1bmN0aW9uKHQpeyExPT09dC5vcHRpb25zLmZpeGVkLngmJih0Lng9by54KSwhMT09PXQub3B0aW9ucy5maXhlZC55JiYodC55PW8ueSl9KTtmb3IodmFyIGcgaW4gYSlpZihhLmhhc093blByb3BlcnR5KGcpKXt2YXIgeT10aGlzLmJvZHkubm9kZXNbZ107eS52eD1vLnZ4LHkudnk9by52eSx5LnNldE9wdGlvbnMoe3BoeXNpY3M6ITB9KSxkZWxldGUgdGhpcy5jbHVzdGVyZWROb2Rlc1tnXX1mb3IodmFyIGI9W10sXz0wO188by5lZGdlcy5sZW5ndGg7XysrKWIucHVzaChvLmVkZ2VzW19dKTtmb3IodmFyIHc9MDt3PGIubGVuZ3RoO3crKyl7Zm9yKHZhciB4PWJbd10saz10aGlzLl9nZXRDb25uZWN0ZWRJZCh4LHQpLFM9dGhpcy5jbHVzdGVyZWROb2Rlc1trXSxEPTA7RDx4LmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzLmxlbmd0aDtEKyspe3ZhciBNPXguY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHNbRF0sQz10aGlzLmJvZHkuZWRnZXNbTV07aWYodm9pZCAwIT09QylpZih2b2lkIDAhPT1TKXt2YXIgTz10aGlzLmJvZHkubm9kZXNbUy5jbHVzdGVySWRdO08uY29udGFpbmVkRWRnZXNbQy5pZF09QyxkZWxldGUgaFtDLmlkXTt2YXIgRT1DLmZyb21JZCxUPUMudG9JZDtDLnRvSWQ9PWs/VD1TLmNsdXN0ZXJJZDpFPVMuY2x1c3RlcklkLHRoaXMuX2NyZWF0ZUNsdXN0ZXJlZEVkZ2UoRSxULEMsTy5jbHVzdGVyRWRnZVByb3BlcnRpZXMse2hpZGRlbjohMSxwaHlzaWNzOiEwfSl9ZWxzZSB0aGlzLl9yZXN0b3JlRWRnZShDKX14LnJlbW92ZSgpfWZvcih2YXIgUCBpbiBoKWguaGFzT3duUHJvcGVydHkoUCkmJnRoaXMuX3Jlc3RvcmVFZGdlKGhbUF0pO2RlbGV0ZSB0aGlzLmJvZHkubm9kZXNbdF0sITA9PT1pJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX0se2tleTpcImdldE5vZGVzSW5DbHVzdGVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9W107aWYoITA9PT10aGlzLmlzQ2x1c3Rlcih0KSl7dmFyIGk9dGhpcy5ib2R5Lm5vZGVzW3RdLmNvbnRhaW5lZE5vZGVzO2Zvcih2YXIgbyBpbiBpKWkuaGFzT3duUHJvcGVydHkobykmJmUucHVzaCh0aGlzLmJvZHkubm9kZXNbb10uaWQpfXJldHVybiBlfX0se2tleTpcImZpbmROb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPVtdLGk9MCxvPXZvaWQgMDt2b2lkIDAhPT10aGlzLmNsdXN0ZXJlZE5vZGVzW3RdJiZpPDEwMDspe2lmKHZvaWQgMD09PShvPXRoaXMuYm9keS5ub2Rlc1t0XSkpcmV0dXJuW107ZS5wdXNoKG8uaWQpLHQ9dGhpcy5jbHVzdGVyZWROb2Rlc1t0XS5jbHVzdGVySWQsaSsrfXJldHVybiB2b2lkIDA9PT0obz10aGlzLmJvZHkubm9kZXNbdF0pP1tdOihlLnB1c2goby5pZCksZS5yZXZlcnNlKCksZSl9fSx7a2V5OlwidXBkYXRlQ2x1c3RlcmVkTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJObyBjbHVzdGVyZWROb2RlSWQgc3VwcGxpZWQgdG8gdXBkYXRlQ2x1c3RlcmVkTm9kZS5cIik7aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBuZXdPcHRpb25zIHN1cHBsaWVkIHRvIHVwZGF0ZUNsdXN0ZXJlZE5vZGUuXCIpO2lmKHZvaWQgMD09PXRoaXMuYm9keS5ub2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgY2x1c3RlcmVkTm9kZUlkIHN1cHBsaWVkIHRvIHVwZGF0ZUNsdXN0ZXJlZE5vZGUgZG9lcyBub3QgZXhpc3QuXCIpO3RoaXMuYm9keS5ub2Rlc1t0XS5zZXRPcHRpb25zKGUpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwidXBkYXRlRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJObyBzdGFydEVkZ2VJZCBzdXBwbGllZCB0byB1cGRhdGVFZGdlLlwiKTtpZih2b2lkIDA9PT1lKXRocm93IG5ldyBFcnJvcihcIk5vIG5ld09wdGlvbnMgc3VwcGxpZWQgdG8gdXBkYXRlRWRnZS5cIik7aWYodm9pZCAwPT09dGhpcy5ib2R5LmVkZ2VzW3RdKXRocm93IG5ldyBFcnJvcihcIlRoZSBzdGFydEVkZ2VJZCBzdXBwbGllZCB0byB1cGRhdGVFZGdlIGRvZXMgbm90IGV4aXN0LlwiKTtmb3IodmFyIGk9dGhpcy5nZXRDbHVzdGVyZWRFZGdlcyh0KSxvPTA7bzxpLmxlbmd0aDtvKyspe3RoaXMuYm9keS5lZGdlc1tpW29dXS5zZXRPcHRpb25zKGUpfXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZGF0YUNoYW5nZWRcIil9fSx7a2V5OlwiZ2V0Q2x1c3RlcmVkRWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO3ZvaWQgMCE9PXQmJnZvaWQgMCE9PXRoaXMuYm9keS5lZGdlc1t0XSYmaTwxMDA7KWUucHVzaCh0aGlzLmJvZHkuZWRnZXNbdF0uaWQpLHQ9dGhpcy5ib2R5LmVkZ2VzW3RdLmVkZ2VSZXBsYWNlZEJ5SWQsaSsrO3JldHVybiBlLnJldmVyc2UoKSxlfX0se2tleTpcImdldEJhc2VFZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ2V0QmFzZUVkZ2VzKHQpWzBdfX0se2tleTpcImdldEJhc2VFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bdF0saT1bXSxvPVtdLG49MDtlLmxlbmd0aD4wJiZuPDEwMDspe3ZhciBzPWUucG9wKCk7aWYodm9pZCAwIT09cyl7dmFyIHI9dGhpcy5ib2R5LmVkZ2VzW3NdO2lmKHZvaWQgMCE9PXIpe24rKzt2YXIgYT1yLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzO2lmKHZvaWQgMD09PWEpby5wdXNoKHMpO2Vsc2UgZm9yKHZhciBoPTA7aDxhLmxlbmd0aDsrK2gpe3ZhciBkPWFbaF07LTE9PT1lLmluZGV4T2YoYSkmJi0xPT09aS5pbmRleE9mKGEpJiZlLnB1c2goZCl9aS5wdXNoKHMpfX19cmV0dXJuIG99fSx7a2V5OlwiX2dldENvbm5lY3RlZElkXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0lkIT1lP3QudG9JZDo
21167odC5mcm9tSWQsdC5mcm9tSWQpfX0se2tleTpcIl9nZXRIdWJTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MCxlPTAsaT0wLG89MCxuPTA7bjx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO24rKyl7dmFyIHM9dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tuXV07cy5lZGdlcy5sZW5ndGg+byYmKG89cy5lZGdlcy5sZW5ndGgpLHQrPXMuZWRnZXMubGVuZ3RoLGUrPU1hdGgucG93KHMuZWRnZXMubGVuZ3RoLDIpLGkrPTF9dC89aSxlLz1pO3ZhciByPWUtTWF0aC5wb3codCwyKSxhPU1hdGguc3FydChyKSxoPU1hdGguZmxvb3IodCsyKmEpO3JldHVybiBoPm8mJihoPW8pLGh9fSx7a2V5OlwiX2NyZWF0ZUNsdXN0ZXJlZEVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvLG4pe3ZhciBzPXAuY2xvbmVPcHRpb25zKGksXCJlZGdlXCIpO2MuZGVlcEV4dGVuZChzLG8pLHMuZnJvbT10LHMudG89ZSxzLmlkPVwiY2x1c3RlckVkZ2U6XCIrYy5yYW5kb21VVUlEKCksdm9pZCAwIT09biYmYy5kZWVwRXh0ZW5kKHMsbik7dmFyIHI9dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVFZGdlKHMpO3JldHVybiByLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzPVtpLmlkXSxyLmNvbm5lY3QoKSx0aGlzLmJvZHkuZWRnZXNbci5pZF09cixyfX0se2tleTpcIl9jbHVzdGVyRWRnZXNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSxvKXtpZihlIGluc3RhbmNlb2YgbSl7dmFyIG49ZSxzPXt9O3Nbbi5pZF09bixlPXN9aWYodCBpbnN0YW5jZW9mIHYpe3ZhciByPXQsYT17fTthW3IuaWRdPXIsdD1hfWlmKHZvaWQgMD09PWl8fG51bGw9PT1pKXRocm93IG5ldyBFcnJvcihcIl9jbHVzdGVyRWRnZXM6IHBhcmFtZXRlciBjbHVzdGVyTm9kZSByZXF1aXJlZFwiKTt2b2lkIDA9PT1vJiYobz1pLmNsdXN0ZXJFZGdlUHJvcGVydGllcyksdGhpcy5fY3JlYXRlQ2x1c3RlckVkZ2VzKHQsZSxpLG8pO2Zvcih2YXIgaCBpbiBlKWlmKGUuaGFzT3duUHJvcGVydHkoaCkmJnZvaWQgMCE9PXRoaXMuYm9keS5lZGdlc1toXSl7dmFyIGQ9dGhpcy5ib2R5LmVkZ2VzW2hdO3RoaXMuX2JhY2t1cEVkZ2VPcHRpb25zKGQpLGQuc2V0T3B0aW9ucyh7cGh5c2ljczohMX0pfWZvcih2YXIgbCBpbiB0KXQuaGFzT3duUHJvcGVydHkobCkmJih0aGlzLmNsdXN0ZXJlZE5vZGVzW2xdPXtjbHVzdGVySWQ6aS5pZCxub2RlOnRoaXMuYm9keS5ub2Rlc1tsXX0sdGhpcy5ib2R5Lm5vZGVzW2xdLnNldE9wdGlvbnMoe3BoeXNpY3M6ITF9KSl9fSx7a2V5OlwiX2dldENsdXN0ZXJOb2RlRm9yTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPXRoaXMuY2x1c3RlcmVkTm9kZXNbdF07aWYodm9pZCAwIT09ZSl7dmFyIGk9ZS5jbHVzdGVySWQ7aWYodm9pZCAwIT09aSlyZXR1cm4gdGhpcy5ib2R5Lm5vZGVzW2ldfX19fSx7a2V5OlwiX2ZpbHRlclwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9W107cmV0dXJuIGMuZm9yRWFjaCh0LGZ1bmN0aW9uKHQpe2UodCkmJmkucHVzaCh0KX0pLGl9fSx7a2V5OlwiX3VwZGF0ZVN0YXRlXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dm9pZCAwLGk9W10sbz1bXSxuPWZ1bmN0aW9uKGUpe2MuZm9yRWFjaCh0LmJvZHkubm9kZXMsZnVuY3Rpb24odCl7ITA9PT10LmlzQ2x1c3RlciYmZSh0KX0pfTtmb3IoZSBpbiB0aGlzLmNsdXN0ZXJlZE5vZGVzKWlmKHRoaXMuY2x1c3RlcmVkTm9kZXMuaGFzT3duUHJvcGVydHkoZSkpe3ZhciByPXRoaXMuYm9keS5ub2Rlc1tlXTt2b2lkIDA9PT1yJiZpLnB1c2goZSl9bihmdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPGkubGVuZ3RoO2UrKylkZWxldGUgdC5jb250YWluZWROb2Rlc1tpW2VdXX0pO2Zvcih2YXIgYT0wO2E8aS5sZW5ndGg7YSsrKWRlbGV0ZSB0aGlzLmNsdXN0ZXJlZE5vZGVzW2lbYV1dO2MuZm9yRWFjaCh0aGlzLmNsdXN0ZXJlZEVkZ2VzLGZ1bmN0aW9uKGUpe3ZhciBpPXQuYm9keS5lZGdlc1tlXTt2b2lkIDAhPT1pJiZpLmVuZFBvaW50c1ZhbGlkKCl8fG8ucHVzaChlKX0pLG4oZnVuY3Rpb24odCl7Yy5mb3JFYWNoKHQuY29udGFpbmVkRWRnZXMsZnVuY3Rpb24odCxlKXt0LmVuZFBvaW50c1ZhbGlkKCl8fC0xIT09by5pbmRleE9mKGUpfHxvLnB1c2goZSl9KX0pLGMuZm9yRWFjaCh0aGlzLmJvZHkuZWRnZXMsZnVuY3Rpb24oZSxpKXt2YXIgbj0hMCxzPWUuY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHM7aWYodm9pZCAwIT09cyl7dmFyIHI9MDtjLmZvckVhY2gocyxmdW5jdGlvbihlKXt2YXIgaT10LmJvZHkuZWRnZXNbZV07dm9pZCAwIT09aSYmaS5lbmRQb2ludHNWYWxpZCgpJiYocis9MSl9KSxuPXI+MH1lLmVuZFBvaW50c1ZhbGlkKCkmJm58fG8ucHVzaChpKX0pLG4oZnVuY3Rpb24oZSl7Yy5mb3JFYWNoKG8sZnVuY3Rpb24oaSl7ZGVsZXRlIGUuY29udGFpbmVkRWRnZXNbaV0sYy5mb3JFYWNoKGUuZWRnZXMsZnVuY3Rpb24obixzKXtpZihuLmlkPT09aSlyZXR1cm4gdm9pZChlLmVkZ2VzW3NdPW51bGwpO24uY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHM9dC5fZmlsdGVyKG4uY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHMsZnVuY3Rpb24odCl7cmV0dXJuLTE9PT1vLmluZGV4T2YodCl9KX0pLGUuZWRnZXM9dC5fZmlsdGVyKGUuZWRnZXMsZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPT10fSl9KX0pLGMuZm9yRWFjaChvLGZ1bmN0aW9uKGUpe2RlbGV0ZSB0LmNsdXN0ZXJlZEVkZ2VzW2VdfSksYy5mb3JFYWNoKG8sZnVuY3Rpb24oZSl7ZGVsZXRlIHQuYm9keS5lZGdlc1tlXX0pO3ZhciBoPSgwLHMuZGVmYXVsdCkodGhpcy5ib2R5LmVkZ2VzKTtjLmZvckVhY2goaCxmdW5jdGlvbihlKXt2YXIgaT10LmJvZHkuZWRnZXNbZV0sbz10Ll9pc0NsdXN0ZXJlZE5vZGUoaS5mcm9tSWQpfHx0Ll9pc0NsdXN0ZXJlZE5vZGUoaS50b0lkKTtpZihvIT09dC5faXNDbHVzdGVyZWRFZGdlKGkuaWQpKXtpZighbyl0aHJvdyBuZXcgRXJyb3IoXCJyZW1vdmUgZWRnZSBmcm9tIGNsdXN0ZXJpbmcgbm90IGltcGxlbWVudGVkIVwiKTt2YXIgbj10Ll9nZXRDbHVzdGVyTm9kZUZvck5vZGUoaS5mcm9tSWQpO3ZvaWQgMCE9PW4mJnQuX2NsdXN0ZXJFZGdlcyh0LmJvZHkubm9kZXNbaS5mcm9tSWRdLGksbik7dmFyIHM9dC5fZ2V0Q2x1c3Rlck5vZGVGb3JOb2RlKGkudG9JZCk7dm9pZCAwIT09cyYmdC5fY2x1c3RlckVkZ2VzKHQuYm9keS5ub2Rlc1tpLnRvSWRdLGkscyl9fSk7Zm9yKHZhciBkPSExLGw9ITA7bDspIWZ1bmN0aW9uKCl7dmFyIGU9W107bihmdW5jdGlvbih0KXt2YXIgaT0oMCxzLmRlZmF1bHQpKHQuY29udGFpbmVkTm9kZXMpLmxlbmd0aCxvPSEwPT09dC5vcHRpb25zLmFsbG93U2luZ2xlTm9kZUNsdXN0ZXI7KG8mJmk8MXx8IW8mJmk8MikmJmUucHVzaCh0LmlkKX0pO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7KytpKXQub3BlbkNsdXN0ZXIoZVtpXSx7fSwhMSk7bD1lLmxlbmd0aD4wLGQ9ZHx8bH0oKTtkJiZ0aGlzLl91cGRhdGVTdGF0ZSgpfX0se2tleTpcIl9pc0NsdXN0ZXJlZE5vZGVcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09dGhpcy5jbHVzdGVyZWROb2Rlc1t0XX19LHtrZXk6XCJfaXNDbHVzdGVyZWRFZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuY2x1c3RlcmVkRWRnZXNbdF19fV0pLHR9KCk7ZS5kZWZhdWx0PWd9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMpLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDQpLHU9byhsKSxjPWkoNSkscD1vKGMpLGY9aSgyKSxtPWkoNDcpLmRlZmF1bHQsdj1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQsaSxvLG4scixoKXsoMCxhLmRlZmF1bHQpKHRoaXMsZSk7dmFyIGQ9KDAsdS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzLHQsaSxvLG4scixoKSk7cmV0dXJuIGQuaXNDbHVzdGVyPSEwLGQuY29udGFpbmVkTm9kZXM9e30sZC5jb250YWluZWRFZGdlcz17fSxkfXJldHVybigwLHAuZGVmYXVsdCkoZSx0KSwoMCxkLmRlZmF1bHQpKGUsW3trZXk6XCJfb3BlbkNoaWxkQ2x1c3RlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT10aGlzLmJvZHkubm9kZXNbdF07aWYodm9pZCAwPT09dGhpcy5jb250YWluZWROb2Rlc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJub2RlIHdpdGggaWQ6IFwiK3QrXCIgbm90IGluIGN1cnJlbnQgY2x1c3RlclwiKTtpZighaS5pc0NsdXN0ZXIpdGhyb3cgbmV3IEVycm9yKFwibm9kZSB3aXRoIGlkOiBcIit0K1wiIGlzIG5vdCBhIGNsdXN0ZXJcIik7ZGVsZXRlIHRoaXMuY29udGFpbmVkTm9kZXNbdF0sZi5mb3JFYWNoKGkuZWRnZXMsZnVuY3Rpb24odCl7ZGVsZXRlIGUuY29udGFpbmVkRWRnZXNbdC5pZF19KSxmLmZvckVhY2goaS5jb250YWluZWROb2RlcyxmdW5jdGlvbih0LGkpe2UuY29udGFpbmVkTm9kZXNbaV09dH0pLGkuY29udGFpbmVkTm9kZXM9e30sZi5mb3JFYWNoKGkuY29udGFpbmVkRWRnZXMsZnVuY3Rpb24odCxpKXtlLmNvbnRhaW5lZEVkZ2VzW2ldPXR9KSxpLmNvbnRhaW5lZEVkZ2VzPXt9LGYuZm9yRWFjaChpLmVkZ2VzLGZ1bmN0aW9uKHQpe2YuZm9yRWFjaChlLmVkZ2VzLGZ1bmN0aW9uKGkpe3ZhciBvPWkuY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHMuaW5kZXhPZih0LmlkKTstMSE9PW8mJihmLmZvckVhY2godC5jbHVzdGVyaW5nRWRnZVJlcGxhY2luZ0lkcyxmdW5jdGlvbih0KXtpLmNsdXN0ZXJpbmdFZGdlUmVwbGFjaW5nSWRzLnB1c2godCksZS5ib2R5LmVkZ2VzW3RdLmVkZ2VSZXBsYWNlZEJ5SWQ9aS5pZH0pLGkuY2x1c3RlcmluZ0VkZ2VSZXBsYWNpbmdJZHMuc3BsaWNlKG8sMSkpfSl9KSxpLmVkZ2VzPVtdfX1dKSxlfShtKTtlLmRlZmF1bHQ9dn0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fWZ1bmN0aW9uIG4oKXt2YXIgdDt2b2lkIDAhPT13aW5kb3cmJih0PXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy53ZWJraXRSZXF1ZXN0QW5pbWF0aW9uRnJhbWV8fHdpbmRvdy5tc1JlcXVlc3RBbmltYXRpb25GcmFtZSksd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT12b2lkIDA9PT10P2Z1bmN0aW9uKHQpe3QoKX06dH1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgcz1pKDApLHI9byhzKSxhPWkoMSksaD1vKGEpLGQ9aSgyKSxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGkpeygwLHIuZGVmYXVsdCkodGhpcyx0KSxuKCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnJlZHJhd1JlcXVlc3RlZD0hMSx0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCx0aGlzLnJlcXVpcmVzVGltZW91dD0hMCx0aGlzLnJlbmRlcmluZ0FjdGl2ZT0hMSx0aGlzLnJlbmRlclJlcXVlc3RzPTAsdGhpcy5hbGxvd1JlZHJhdz0hMCx0aGlzLmRyYWdnaW5nPSExLHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXtoaWRlRWRnZXNPbkRyYWc6ITEsaGlkZU5vZGVzT25EcmFnOiExfSxkLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5fZGV0ZXJtaW5lQnJvd3Nlck1ldGhvZCgpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsaC5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiZHJhZ1N0YXJ0XCIsZnVuY3Rpb24oKXt0LmRyYWdnaW5nPSEwfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkcmFnRW5kXCIsZnVuY3Rpb24oKXt0LmRyYWdnaW5nPSExfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfcmVzaXplTm9kZXNcIixmdW5jdGlvbigpe3QuX3Jlc2l6ZU5vZGVzKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9yZWRyYXdcIixmdW5jdGlvbigpeyExPT09dC5yZW5kZXJpbmdBY3RpdmUmJnQuX3JlZHJhdygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfYmxvY2tSZWRyYXdcIixmdW5jdGlvbigpe3QuYWxsb3dSZWRyYXc9ITF9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9hbGxvd1JlZHJhd1wiLGZ1bmN0aW9uKCl7dC5hbGxvd1JlZHJhdz0hMCx0LnJlZHJhd1JlcXVlc3RlZD0hMX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3JlcXVlc3RSZWRyYXdcIix0aGlzLl9yZXF1ZXN0UmVkcmF3LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3N0YXJ0UmVuZGVyaW5nXCIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzKz0xLHQucmVuZGVyaW5nQWN0aXZlPSEwLHQuX3N0YXJ0UmVuZGVyaW5nKCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9zdG9wUmVuZGVyaW5nXCIsZnVuY3Rpb24oKXt0LnJlbmRlclJlcXVlc3RzLT0xLHQucmVuZGVyaW5nQWN0aXZlPXQucmVuZGVyUmVxdWVzdHM+MCx0LnJlbmRlclRpbWVyPXZvaWQgMH0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7dC5yZW5kZXJSZXF1ZXN0cz0wLHQuYWxsb3dSZWRyYXc9ITEsdC5yZW5kZXJpbmdBY3RpdmU9ITEsITA9PT10LnJlcXVpcmVzVGltZW91dD9jbGVhclRpbWVvdXQodC5yZW5kZXJUaW1lcik6d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHQucmVuZGVyVGltZXIpLHQuYm9keS5lbWl0dGVyLm9mZigpfSl9fSx7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHZvaWQgMCE9PXQpe3ZhciBlPVtcImhpZGVFZGdlc09uRHJhZ1wiLFwiaGlkZU5vZGVzT25EcmFnXCJdO2Quc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KX19fSx7a2V5OlwiX3JlcXVlc3ROZXh0RnJhbWVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cpe3ZhciBpPXZvaWQgMCxvPXdpbmRvdztyZXR1cm4hMD09PXRoaXMucmVxdWlyZXNUaW1lb3V0P2k9by5zZXRUaW
211671lb3V0KHQsZSk6by5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUmJihpPW8ucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpKSxpfX19LHtrZXk6XCJfc3RhcnRSZW5kZXJpbmdcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5yZW5kZXJpbmdBY3RpdmUmJnZvaWQgMD09PXRoaXMucmVuZGVyVGltZXImJih0aGlzLnJlbmRlclRpbWVyPXRoaXMuX3JlcXVlc3ROZXh0RnJhbWUodGhpcy5fcmVuZGVyU3RlcC5iaW5kKHRoaXMpLHRoaXMuc2ltdWxhdGlvbkludGVydmFsKSl9fSx7a2V5OlwiX3JlbmRlclN0ZXBcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5yZW5kZXJpbmdBY3RpdmUmJih0aGlzLnJlbmRlclRpbWVyPXZvaWQgMCwhMD09PXRoaXMucmVxdWlyZXNUaW1lb3V0JiZ0aGlzLl9zdGFydFJlbmRlcmluZygpLHRoaXMuX3JlZHJhdygpLCExPT09dGhpcy5yZXF1aXJlc1RpbWVvdXQmJnRoaXMuX3N0YXJ0UmVuZGVyaW5nKCkpfX0se2tleTpcInJlZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInNldFNpemVcIiksdGhpcy5fcmVkcmF3KCl9fSx7a2V5OlwiX3JlcXVlc3RSZWRyYXdcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXM7ITAhPT10aGlzLnJlZHJhd1JlcXVlc3RlZCYmITE9PT10aGlzLnJlbmRlcmluZ0FjdGl2ZSYmITA9PT10aGlzLmFsbG93UmVkcmF3JiYodGhpcy5yZWRyYXdSZXF1ZXN0ZWQ9ITAsdGhpcy5fcmVxdWVzdE5leHRGcmFtZShmdW5jdGlvbigpe3QuX3JlZHJhdyghMSl9LDApKX19LHtrZXk6XCJfcmVkcmF3XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXSYmYXJndW1lbnRzWzBdO2lmKCEwPT09dGhpcy5hbGxvd1JlZHJhdyl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImluaXRSZWRyYXdcIiksdGhpcy5yZWRyYXdSZXF1ZXN0ZWQ9ITEsMCE9PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy53aWR0aCYmMCE9PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5oZWlnaHR8fHRoaXMuY2FudmFzLnNldFNpemUoKSx0aGlzLmNhbnZhcy5zZXRUcmFuc2Zvcm0oKTt2YXIgZT10aGlzLmNhbnZhcy5nZXRDb250ZXh0KCksaT10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgsbz10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0O2lmKGUuY2xlYXJSZWN0KDAsMCxpLG8pLDA9PT10aGlzLmNhbnZhcy5mcmFtZS5jbGllbnRXaWR0aClyZXR1cm47ZS5zYXZlKCksZS50cmFuc2xhdGUodGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueCx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KSxlLnNjYWxlKHRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMuYm9keS52aWV3LnNjYWxlKSxlLmJlZ2luUGF0aCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJiZWZvcmVEcmF3aW5nXCIsZSksZS5jbG9zZVBhdGgoKSwhMT09PXQmJighMT09PXRoaXMuZHJhZ2dpbmd8fCEwPT09dGhpcy5kcmFnZ2luZyYmITE9PT10aGlzLm9wdGlvbnMuaGlkZUVkZ2VzT25EcmFnKSYmdGhpcy5fZHJhd0VkZ2VzKGUpLCghMT09PXRoaXMuZHJhZ2dpbmd8fCEwPT09dGhpcy5kcmFnZ2luZyYmITE9PT10aGlzLm9wdGlvbnMuaGlkZU5vZGVzT25EcmFnKSYmdGhpcy5fZHJhd05vZGVzKGUsdCksZS5iZWdpblBhdGgoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiYWZ0ZXJEcmF3aW5nXCIsZSksZS5jbG9zZVBhdGgoKSxlLnJlc3RvcmUoKSwhMD09PXQmJmUuY2xlYXJSZWN0KDAsMCxpLG8pfX19LHtrZXk6XCJfcmVzaXplTm9kZXNcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuY2FudmFzLnNldFRyYW5zZm9ybSgpO3ZhciB0PXRoaXMuY2FudmFzLmdldENvbnRleHQoKTt0LnNhdmUoKSx0LnRyYW5zbGF0ZSh0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkpLHQuc2NhbGUodGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcuc2NhbGUpO3ZhciBlPXRoaXMuYm9keS5ub2RlcyxpPXZvaWQgMDtmb3IodmFyIG8gaW4gZSllLmhhc093blByb3BlcnR5KG8pJiYoaT1lW29dLGkucmVzaXplKHQpLGkudXBkYXRlQm91bmRpbmdCb3godCxpLnNlbGVjdGVkKSk7dC5yZXN0b3JlKCl9fSx7a2V5OlwiX2RyYXdOb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9dGhpcy5ib2R5Lm5vZGVzLG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dm9pZCAwLHM9W10scj10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDotMjAseTotMjB9KSxhPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4OnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCsyMCx5OnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQrMjB9KSxoPXt0b3A6ci55LGxlZnQ6ci54LGJvdHRvbTphLnkscmlnaHQ6YS54fSxkPTA7ZDxvLmxlbmd0aDtkKyspbj1pW29bZF1dLG4uaXNTZWxlY3RlZCgpP3MucHVzaChvW2RdKTohMD09PWU/bi5kcmF3KHQpOiEwPT09bi5pc0JvdW5kaW5nQm94T3ZlcmxhcHBpbmdXaXRoKGgpP24uZHJhdyh0KTpuLnVwZGF0ZUJvdW5kaW5nQm94KHQsbi5zZWxlY3RlZCk7Zm9yKHZhciBsPTA7bDxzLmxlbmd0aDtsKyspbj1pW3NbbF1dLG4uZHJhdyh0KX19LHtrZXk6XCJfZHJhd0VkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5lZGdlcyxpPXRoaXMuYm9keS5lZGdlSW5kaWNlcyxvPXZvaWQgMCxuPTA7bjxpLmxlbmd0aDtuKyspbz1lW2lbbl1dLCEwPT09by5jb25uZWN0ZWQmJm8uZHJhdyh0KX19LHtrZXk6XCJfZGV0ZXJtaW5lQnJvd3Nlck1ldGhvZFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyl7dmFyIHQ9bmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpO3RoaXMucmVxdWlyZXNUaW1lb3V0PSExLC0xIT10LmluZGV4T2YoXCJtc2llIDkuMFwiKT90aGlzLnJlcXVpcmVzVGltZW91dD0hMDotMSE9dC5pbmRleE9mKFwic2FmYXJpXCIpJiZ0LmluZGV4T2YoXCJjaHJvbWVcIik8PS0xJiYodGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITApfWVsc2UgdGhpcy5yZXF1aXJlc1RpbWVvdXQ9ITB9fV0pLHR9KCk7ZS5kZWZhdWx0PWx9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9aSgxMCksZD1pKDM3KSxsPWkoMiksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSl7KDAscy5kZWZh
21167dWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMucGl4ZWxSYXRpbz0xLHRoaXMucmVzaXplVGltZXI9dm9pZCAwLHRoaXMucmVzaXplRnVuY3Rpb249dGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSx0aGlzLmNhbWVyYVN0YXRlPXt9LHRoaXMuaW5pdGlhbGl6ZWQ9ITEsdGhpcy5jYW52YXNWaWV3Q2VudGVyPXt9LHRoaXMub3B0aW9ucz17fSx0aGlzLmRlZmF1bHRPcHRpb25zPXthdXRvUmVzaXplOiEwLGhlaWdodDpcIjEwMCVcIix3aWR0aDpcIjEwMCVcIn0sbC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uY2UoXCJyZXNpemVcIixmdW5jdGlvbihlKXswIT09ZS53aWR0aCYmKHQuYm9keS52aWV3LnRyYW5zbGF0aW9uLng9LjUqZS53aWR0aCksMCE9PWUuaGVpZ2h0JiYodC5ib2R5LnZpZXcudHJhbnNsYXRpb24ueT0uNSplLmhlaWdodCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcInNldFNpemVcIix0aGlzLnNldFNpemUuYmluZCh0aGlzKSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZXN0cm95XCIsZnVuY3Rpb24oKXt0LmhhbW1lckZyYW1lLmRlc3Ryb3koKSx0LmhhbW1lci5kZXN0cm95KCksdC5fY2xlYW5VcCgpfSl9fSx7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7aWYodm9pZCAwIT09dCl7dmFyIGk9W1wid2lkdGhcIixcImhlaWdodFwiLFwiYXV0b1Jlc2l6ZVwiXTtsLnNlbGVjdGl2ZURlZXBFeHRlbmQoaSx0aGlzLm9wdGlvbnMsdCl9ITA9PT10aGlzLm9wdGlvbnMuYXV0b1Jlc2l6ZSYmKHRoaXMuX2NsZWFuVXAoKSx0aGlzLnJlc2l6ZVRpbWVyPXNldEludGVydmFsKGZ1bmN0aW9uKCl7ITA9PT1lLnNldFNpemUoKSYmZS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpfSwxZTMpLHRoaXMucmVzaXplRnVuY3Rpb249dGhpcy5fb25SZXNpemUuYmluZCh0aGlzKSxsLmFkZEV2ZW50TGlzdGVuZXIod2luZG93LFwicmVzaXplXCIsdGhpcy5yZXNpemVGdW5jdGlvbikpfX0se2tleTpcIl9jbGVhblVwXCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLnJlc2l6ZVRpbWVyJiZjbGVhckludGVydmFsKHRoaXMucmVzaXplVGltZXIpLGwucmVtb3ZlRXZlbnRMaXN0ZW5lcih3aW5kb3csXCJyZXNpemVcIix0aGlzLnJlc2l6ZUZ1bmN0aW9uKSx0aGlzLnJlc2l6ZUZ1bmN0aW9uPXZvaWQgMH19LHtrZXk6XCJfb25SZXNpemVcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuc2V0U2l6ZSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVkcmF3XCIpfX0se2tleTpcIl9nZXRDYW1lcmFTdGF0ZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnRoaXMucGl4ZWxSYXRpbzshMD09PXRoaXMuaW5pdGlhbGl6ZWQmJih0aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzV2lkdGg9dGhpcy5mcmFtZS5jYW52YXMud2lkdGgvdCx0aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzSGVpZ2h0PXRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90LHRoaXMuY2FtZXJhU3RhdGUuc2NhbGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5jYW1lcmFTdGF0ZS5wb3NpdGlvbj10aGlzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3QseTouNSp0aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQvdH0pKX19LHtrZXk6XCJfc2V0Q2FtZXJhU3RhdGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKHZvaWQgMCE9PXRoaXMuY2FtZXJhU3RhdGUuc2NhbGUmJjAhPT10aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCYmMCE9PXRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCYmMCE9PXRoaXMucGl4ZWxSYXRpbyYmdGhpcy5jYW1lcmFTdGF0ZS5wcmV2aW91c1dpZHRoPjApe3ZhciB0PXRoaXMuZnJhbWUuY2FudmFzLndpZHRoL3RoaXMucGl4ZWxSYXRpby90aGlzLmNhbWVyYVN0YXRlLnByZXZpb3VzV2lkdGgsZT10aGlzLmZyYW1lLmNhbnZhcy5oZWlnaHQvdGhpcy5waXhlbFJhdGlvL3RoaXMuY2FtZXJhU3RhdGUucHJldmlvdXNIZWlnaHQsaT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlOzEhPXQmJjEhPWU/aT0uNSp0aGlzLmNhbWVyYVN0YXRlLnNjYWxlKih0K2UpOjEhPXQ/aT10aGlzLmNhbWVyYVN0YXRlLnNjYWxlKnQ6MSE9ZSYmKGk9dGhpcy5jYW1lcmFTdGF0ZS5zY2FsZSplKSx0aGlzLmJvZHkudmlldy5zY2FsZT1pO3ZhciBvPXRoaXMuRE9NdG9DYW52YXMoe3g6LjUqdGhpcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxuPXt4Om8ueC10aGlzLmNhbWVyYVN0YXRlLnBvc2l0aW9uLngseTpvLnktdGhpcy5jYW1lcmFTdGF0ZS5wb3NpdGlvbi55fTt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54Kz1uLngqdGhpcy5ib2R5LnZpZXcuc2NhbGUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueSs9bi55KnRoaXMuYm9keS52aWV3LnNjYWxlfX19LHtrZXk6XCJfcHJlcGFyZVZhbHVlXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoXCJudW1iZXJcIj09dHlwZW9mIHQpcmV0dXJuIHQrXCJweFwiO2lmKFwic3RyaW5nXCI9PXR5cGVvZiB0KXtpZigtMSE9PXQuaW5kZXhPZihcIiVcIil8fC0xIT09dC5pbmRleE9mKFwicHhcIikpcmV0dXJuIHQ7aWYoLTE9PT10LmluZGV4T2YoXCIlXCIpKXJldHVybiB0K1wicHhcIn10aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgdXNlIHRoZSB2YWx1ZSBzdXBwbGllZCBmb3Igd2lkdGggb3IgaGVpZ2h0OlwiK3QpfX0se2tleTpcIl9jcmVhdGVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcig7dGhpcy5ib2R5LmNvbnRhaW5lci5oYXNDaGlsZE5vZGVzKCk7KXRoaXMuYm9keS5jb250YWluZXIucmVtb3ZlQ2hpbGQodGhpcy5ib2R5LmNvbnRhaW5lci5maXJzdENoaWxkKTtpZih0aGlzLmZyYW1lPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5mcmFtZS5jbGFzc05hbWU9XCJ2aXMtbmV0d29ya1wiLHRoaXMuZnJhbWUuc3R5bGUucG9zaXRpb249XCJyZWxhdGl2ZVwiLHRoaXMuZnJhbWUuc3R5bGUub3ZlcmZsb3c9XCJoaWRkZW5cIix0aGlzLmZyYW1lLnRhYkluZGV4PTkwMCx0aGlzLmZyYW1lLmNhbnZhcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiY2FudmFzXCIpLHRoaXMuZnJhbWUuY2FudmFzLnN0eWxlLnBvc2l0aW9uPVwicmVsYXRpdmVcIix0aGlzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMuZnJhbWUuY2FudmFzKSx0aGlzLmZyYW1lLmNhbnZhcy5nZXRDb250ZXh0KXRoaXMuX3NldFBpeGVsUmF0aW8oKSx0aGlzLnNldFRyYW5zZm9ybSgpO2Vsc2V7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIkRJVlwiKTt0LnN0eWxlLmNvbG9yPVwicmVkXCIsdC5zdHlsZS5mb250V2VpZ2h0PVwiYm9sZFwiLHQuc3R5bGUucGFkZGluZz1cIjEwcHhcIix0LmlubmVySFRNTD1cIkVycm9yOiB5b3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBIVE1MIGNhbnZhc1wiLHRoaXMuZnJhbWUuY2FudmFzLmFwcGVuZENoaWxkKHQpfXRoaXMuYm9keS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5mcmFtZSksdGhpcy5ib2R5LnZpZXcuc2NhbGU9MSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbj17eDouNSp0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuZnJhbWUuY2FudmFzLmNsaWVudE
21167hlaWdodH0sdGhpcy5fYmluZEhhbW1lcigpfX0se2tleTpcIl9iaW5kSGFtbWVyXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3ZvaWQgMCE9PXRoaXMuaGFtbWVyJiZ0aGlzLmhhbW1lci5kZXN0cm95KCksdGhpcy5kcmFnPXt9LHRoaXMucGluY2g9e30sdGhpcy5oYW1tZXI9bmV3IGgodGhpcy5mcmFtZS5jYW52YXMpLHRoaXMuaGFtbWVyLmdldChcInBpbmNoXCIpLnNldCh7ZW5hYmxlOiEwfSksdGhpcy5oYW1tZXIuZ2V0KFwicGFuXCIpLnNldCh7dGhyZXNob2xkOjUsZGlyZWN0aW9uOmguRElSRUNUSU9OX0FMTH0pLGQub25Ub3VjaCh0aGlzLmhhbW1lcixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ub3VjaChlKX0pLHRoaXMuaGFtbWVyLm9uKFwidGFwXCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVGFwKGUpfSksdGhpcy5oYW1tZXIub24oXCJkb3VibGV0YXBcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Eb3VibGVUYXAoZSl9KSx0aGlzLmhhbW1lci5vbihcInByZXNzXCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uSG9sZChlKX0pLHRoaXMuaGFtbWVyLm9uKFwicGFuc3RhcnRcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnU3RhcnQoZSl9KSx0aGlzLmhhbW1lci5vbihcInBhbm1vdmVcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnKGUpfSksdGhpcy5oYW1tZXIub24oXCJwYW5lbmRcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnRW5kKGUpfSksdGhpcy5oYW1tZXIub24oXCJwaW5jaFwiLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vblBpbmNoKGUpfSksdGhpcy5mcmFtZS5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNld2hlZWxcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZVdoZWVsKGUpfSksdGhpcy5mcmFtZS5jYW52YXMuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU1vdXNlU2Nyb2xsXCIsZnVuY3Rpb24oZSl7dC5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uTW91c2VXaGVlbChlKX0pLHRoaXMuZnJhbWUuY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZU1vdmUoZSl9KSx0aGlzLmZyYW1lLmNhbnZhcy5hZGRFdmVudExpc3RlbmVyKFwiY29udGV4dG1lbnVcIixmdW5jdGlvbihlKXt0LmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Db250ZXh0KGUpfSksdGhpcy5oYW1tZXJGcmFtZT1uZXcgaCh0aGlzLmZyYW1lKSxkLm9uUmVsZWFzZSh0aGlzLmhhbW1lckZyYW1lLGZ1bmN0aW9uKGUpe3QuYm9keS5ldmVudExpc3RlbmVycy5vblJlbGVhc2UoZSl9KX19LHtrZXk6XCJzZXRTaXplXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06dGhpcy5vcHRpb25zLndpZHRoLGU9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOnRoaXMub3B0aW9ucy5oZWlnaHQ7dD10aGlzLl9wcmVwYXJlVmFsdWUodCksZT10aGlzLl9wcmVwYXJlVmFsdWUoZSk7dmFyIGk9ITEsbz10aGlzLmZyYW1lLmNhbnZhcy53aWR0aCxuPXRoaXMuZnJhbWUuY2FudmFzLmhlaWdodCxzPXRoaXMucGl4ZWxSYXRpbztpZih0aGlzLl9zZXRQaXhlbFJhdGlvKCksdCE9dGhpcy5vcHRpb25zLndpZHRofHxlIT10aGlzLm9wdGlvbnMuaGVpZ2h0fHx0aGlzLmZyYW1lLnN0eWxlLndpZHRoIT10fHx0aGlzLmZyYW1lLnN0eWxlLmhlaWdodCE9ZSl0aGlzLl9nZXRDYW1lcmFTdGF0ZShzKSx0aGlzLmZyYW1lLnN0eWxlLndpZHRoP
21167XQsdGhpcy5mcmFtZS5zdHlsZS5oZWlnaHQ9ZSx0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS53aWR0aD1cIjEwMCVcIix0aGlzLmZyYW1lLmNhbnZhcy5zdHlsZS5oZWlnaHQ9XCIxMDAlXCIsdGhpcy5mcmFtZS5jYW52YXMud2lkdGg9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCp0aGlzLnBpeGVsUmF0aW8pLHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD1NYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLmNsaWVudEhlaWdodCp0aGlzLnBpeGVsUmF0aW8pLHRoaXMub3B0aW9ucy53aWR0aD10LHRoaXMub3B0aW9ucy5oZWlnaHQ9ZSx0aGlzLmNhbnZhc1ZpZXdDZW50ZXI9e3g6LjUqdGhpcy5mcmFtZS5jbGllbnRXaWR0aCx5Oi41KnRoaXMuZnJhbWUuY2xpZW50SGVpZ2h0fSxpPSEwO2Vsc2V7dmFyIHI9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCp0aGlzLnBpeGVsUmF0aW8pLGE9TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQqdGhpcy5waXhlbFJhdGlvKTt0aGlzLmZyYW1lLmNhbnZhcy53aWR0aD09PXImJnRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD09PWF8fHRoaXMuX2dldENhbWVyYVN0YXRlKHMpLFxuICAgIHRoaXMuZnJhbWUuY2FudmFzLndpZHRoIT09ciYmKHRoaXMuZnJhbWUuY2FudmFzLndpZHRoPXIsaT0hMCksdGhpcy5mcmFtZS5jYW52YXMuaGVpZ2h0IT09YSYmKHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodD1hLGk9ITApfXJldHVybiEwPT09aSYmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJyZXNpemVcIix7d2lkdGg6TWF0aC5yb3VuZCh0aGlzLmZyYW1lLmNhbnZhcy53aWR0aC90aGlzLnBpeGVsUmF0aW8pLGhlaWdodDpNYXRoLnJvdW5kKHRoaXMuZnJhbWUuY2FudmFzLmhlaWdodC90aGlzLnBpeGVsUmF0aW8pLG9sZFdpZHRoOk1hdGgucm91bmQoby90aGlzLnBpeGVsUmF0aW8pLG9sZEhlaWdodDpNYXRoLnJvdW5kKG4vdGhpcy5waXhlbFJhdGlvKX0pLHRoaXMuX3NldENhbWVyYVN0YXRl
21167KCkpLHRoaXMuaW5pdGlhbGl6ZWQ9ITAsaX19LHtrZXk6XCJnZXRDb250ZXh0XCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5mcmFtZS5jYW52YXMuZ2V0Q29udGV4dChcIjJkXCIpfX0se2tleTpcIl9kZXRlcm1pbmVQaXhlbFJhdGlvXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmdldENvbnRleHQoKTtpZih2b2lkIDA9PT10KXRocm93IG5ldyBFcnJvcihcIkNvdWxkIG5vdCBnZXQgY2FudmF4IGNvbnRleHRcIik7dmFyIGU9MTtyZXR1cm5cInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiYoZT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpb3x8MSksZS8odC53ZWJraXRCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm1vekJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fHQubXNCYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0Lm9CYWNraW5nU3RvcmVQaXhlbFJhdGlvfHx0LmJhY2tpbmdTdG9yZVBpeGVsUmF0aW98fDEpfX0se2tleTpcIl9zZXRQaXhlbFJhdGlvXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnBpeGVsUmF0aW89dGhpcy5fZGV0ZXJtaW5lUGl4ZWxSYXRpbygpfX0se2tleTpcInNldFRyYW5zZm9ybVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRDb250ZXh0KCk7aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgRXJyb3IoXCJDb3VsZCBub3QgZ2V0IGNhbnZheCBjb250ZXh0XCIpO3Quc2V0VHJhbnNmb3JtKHRoaXMucGl4ZWxSYXRpbywwLDAsdGhpcy5waXhlbFJhdGlvLDAsMCl9fSx7a2V5OlwiX1hjb252ZXJ0RE9NdG9DYW52YXNcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54KS90aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6XCJfWGNvbnZlcnRDYW52YXNUb0RPTVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuYm9keS52aWV3LnNjYWxlK3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnh9fSx7a2V5OlwiX1ljb252ZXJ0RE9NdG9DYW52YXNcIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi55KS90aGlzLmJvZHkudmlldy5zY2FsZX19LHtrZXk6XCJfWWNvbnZlcnRDYW52YXNUb0RPTVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuYm9keS52aWV3LnNjYWxlK3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnl9fSx7a2V5OlwiY2FudmFzVG9ET01cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm57eDp0aGlzLl9YY29udmVydENhbnZhc1RvRE9NKHQueCkseTp0aGlzLl9ZY29udmVydENhbnZhc1RvRE9NKHQueSl9fX0se2tleTpcIkRPTXRvQ2FudmFzXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJue3g6dGhpcy5fWGNvbnZlcnRET010b0NhbnZhcyh0LngpLHk6dGhpcy5fWWNvbnZlcnRET010b0NhbnZhcyh0LnkpfX19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDIpLGQ9aSg3NikuZGVmYXVsdCxsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGkpe3ZhciBvPXRoaXM7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5hbmltYXRpb25TcGVlZD0xL3RoaXMucmVuZGVyUmVmcmVzaFJhdGUsdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj1cImVhc2VJbk91dFF1aW50XCIsdGhpcy5lYXNpbmdUaW1lPTAsdGhpcy5zb3VyY2VTY2FsZT0wLHRoaXMudGFyZ2V0U2NhbGU9MCx0aGlzLnNvdXJjZVRyYW5zbGF0aW9uPTAsdGhpcy50YXJnZXRUcmFuc2xhdGlvbj0wLHRoaXMubG9ja2VkT25Ob2RlSWQ9dm9pZCAwLHRoaXMubG9ja2VkT25Ob2RlT2Zmc2V0PXZvaWQgMCx0aGlzLnRvdWNoVGltZT0wLHRoaXMudmlld0Z1bmN0aW9uPXZvaWQgMCx0aGlzLmJvZHkuZW1pdHRlci5vbihcImZpdFwiLHRoaXMuZml0LmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiYW5pbWF0aW9uRmluaXNoZWRcIixmdW5jdGlvbigpe28uYm9keS5lbWl0dGVyLmVtaXQoXCJfc3RvcFJlbmRlcmluZ1wiKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwidW5sb2NrTm9kZVwiLHRoaXMucmVsZWFzZU5vZGUuYmluZCh0aGlzKSl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOnt9O3RoaXMub3B0aW9ucz10fX0se2tleTpcImZpdFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOntub2RlczpbXX0sZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSYmYXJndW1lbnRzWzFdLGk9dm9pZCAwLG89dm9pZCAwO2lmKHZvaWQgMCE9PXQubm9kZXMmJjAhPT10Lm5vZGVzLmxlbmd0aHx8KHQubm9kZXM9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzKSwhMD09PWUpe3ZhciBuPTA7Zm9yKHZhciBzIGluIHRoaXMuYm9keS5ub2RlcylpZih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkocykpe3ZhciByPXRoaXMuYm9keS5ub2Rlc1tzXTshMD09PXIucHJlZGVmaW5lZFBvc2l0aW9uJiYobis9MSl9aWYobj4uNSp0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMuZml0KHQsITEpO2k9ZC5nZXRSYW5nZSh0aGlzLmJvZHkubm9kZXMsdC5ub2Rlcyk7bz0xMi42NjIvKHRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGgrNy40MTQ3KSsuMDk2NDgyMjtvKj1NYXRoLm1pbih0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgvNjAwLHRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQvNjAwKX1lbHNle3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVzaXplTm9kZXNcIiksaT1kLmdldFJhbmdlKHRoaXMuYm9keS5ub2Rlcyx0Lm5vZGVzKTt2YXIgYT0xLjEqTWF0aC5hYnMoaS5tYXhYLWkubWluWCksaD0xLjEqTWF0aC5hYnMoaS5tYXhZLWkubWluWSksbD10aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgvYSx1PXRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHQvaDtvPWw8PXU/bDp1fW8+MT9vPTE6MD09PW8mJihvPTEpO3ZhciBjPWQuZmluZENlbnRlcihpKSxwPXtwb3NpdGlvbjpjLHNjYWxlOm8sYW5pbWF0aW9uOnQuYW5pbWF0aW9ufTt0aGlzLm1vdmVUbyhwKX19LHtrZXk6XCJmb2N1c1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg+MSYmdm9pZCAwIT09YXJndW1lbnRzWzFdP2FyZ3VtZW50c1sxXTp7fTtpZih2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbdF0pe3ZhciBpPXt4OnRoaXMuYm9keS5ub2Rlc1t0XS54LHk6dGhpcy5ib2R5Lm5vZGVzW3RdLnl9O2UucG9zaXRpb249aSxlLmxvY2tlZE9uTm9kZT10LH
21167RoaXMubW92ZVRvKGUpfWVsc2UgY29uc29sZS5sb2coXCJOb2RlOiBcIit0K1wiIGNhbm5vdCBiZSBmb3VuZC5cIil9fSx7a2V5OlwibW92ZVRvXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdm9pZCh0PXt9KTt2b2lkIDA9PT10Lm9mZnNldCYmKHQub2Zmc2V0PXt4OjAseTowfSksdm9pZCAwPT09dC5vZmZzZXQueCYmKHQub2Zmc2V0Lng9MCksdm9pZCAwPT09dC5vZmZzZXQueSYmKHQub2Zmc2V0Lnk9MCksdm9pZCAwPT09dC5zY2FsZSYmKHQuc2NhbGU9dGhpcy5ib2R5LnZpZXcuc2NhbGUpLHZvaWQgMD09PXQucG9zaXRpb24mJih0LnBvc2l0aW9uPXRoaXMuZ2V0Vmlld1Bvc2l0aW9uKCkpLHZvaWQgMD09PXQuYW5pbWF0aW9uJiYodC5hbmltYXRpb249e2R1cmF0aW9uOjB9KSwhMT09PXQuYW5pbWF0aW9uJiYodC5hbmltYXRpb249e2R1cmF0aW9uOjB9KSwhMD09PXQuYW5pbWF0aW9uJiYodC5hbmltYXRpb249e30pLHZvaWQgMD09PXQuYW5pbWF0aW9uLmR1cmF0aW9uJiYodC5hbmltYXRpb24uZHVyYXRpb249MWUzKSx2b2lkIDA9PT10LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbiYmKHQuYW5pbWF0aW9uLmVhc2luZ0Z1bmN0aW9uPVwiZWFzZUluT3V0UXVhZFwiKSx0aGlzLmFuaW1hdGVWaWV3KHQpfX0se2tleTpcImFuaW1hdGVWaWV3XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbj10LmFuaW1hdGlvbi5lYXNpbmdGdW5jdGlvbix0aGlzLnJlbGVhc2VOb2RlKCksITA9PT10LmxvY2tlZCYmKHR
21167oaXMubG9ja2VkT25Ob2RlSWQ9dC5sb2NrZWRPbk5vZGUsdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQ9dC5vZmZzZXQpLDAhPXRoaXMuZWFzaW5nVGltZSYmdGhpcy5fdHJhbnNpdGlvblJlZHJhdyghMCksdGhpcy5zb3VyY2VTY2FsZT10aGlzLmJvZHkudmlldy5zY2FsZSx0aGlzLnNvdXJjZVRyYW5zbGF0aW9uPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLHRoaXMudGFyZ2V0U2NhbGU9dC5zY2FsZSx0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnRhcmdldFNjYWxlO3ZhciBlPXRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KSxpPXt4OmUueC10LnBvc2l0aW9uLngseTplLnktdC5wb3NpdGlvbi55fTt0aGlzLnRhcmdldFRyYW5zbGF0aW9uPXt4OnRoaXMuc291cmNlVHJhbnNsYXRpb24ueCtpLngqdGhpcy50YXJnZXRTY2FsZSt0Lm9mZnNldC54LHk6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55K2kueSp0aGlzLnRhcmdldFNjYWxlK3Qub2Zmc2V0Lnl9LDA9PT10LmFuaW1hdGlvbi5kdXJhdGlvbj92b2lkIDAhPXRoaXMubG9ja2VkT25Ob2RlSWQ/KHRoaXMudmlld0Z1bmN0aW9uPXRoaXMuX2xvY2tlZFJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSk6KHRoaXMuYm9keS52aWV3LnNjYWxlPXRoaXMudGFyZ2V0U2NhbGUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249dGhpcy50YXJnZXRUcmFuc2xhdGlvbix0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlcXVlc3RSZWRyYXdcIikpOih0aGlzLmFuaW1hdGlvblNwZWVkPTEvKDYwKnQuYW5pbWF0aW9uLmR1cmF0aW9uKi4wMDEpfHwxLzYwLHRoaXMuYW5pbWF0aW9uRWFzaW5nRnVuY3Rpb249dC5hbmltYXRpb24uZWFzaW5nRnVuY3Rpb24sdGhpcy52aWV3RnVuY3Rpb249dGhpcy5fdHJhbnNpdGlvblJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0YXJ0UmVuZGVyaW5nXCIpKX19fSx7a2V5OlwiX2xvY2tlZFJlZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9e3g6dGhpcy5ib2R5Lm5vZGVzW3RoaXMubG9ja2VkT25Ob2RlSWRdLngseTp0aGlzLmJvZHkubm9kZXNbdGhpcy5sb2NrZWRPbk5vZGVJZF0ueX0sZT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh7eDouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50V2lkdGgseTouNSp0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMuY2xpZW50SGVpZ2h0fSksaT17eDplLngtdC54LHk6ZS55LXQueX0sbz10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixuPXt4Om8ueCtpLngqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQueCx5Om8ueStpLnkqdGhpcy5ib2R5LnZpZXcuc2NhbGUrdGhpcy5sb2NrZWRPbk5vZGVPZmZzZXQueX07dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249bn19LHtrZXk6XCJyZWxlYXNlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5sb2NrZWRPbk5vZGVJZCYmdm9pZCAwIT09dGhpcy52aWV3RnVuY3Rpb24mJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJpbml0UmVkcmF3XCIsdGhpcy52aWV3RnVuY3Rpb24pLHRoaXMubG9ja2VkT25Ob2RlSWQ9dm9pZCAwLHRoaXMubG9ja2VkT25Ob2RlT2Zmc2V0PXZvaWQgMCl9fSx7a2V5OlwiX3RyYW5zaXRpb25SZWRyYXdcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGg+MCYmdm9pZCAwIT09YXJndW1lbnRzWzBdJiZhcmd1bWVudHNbMF07dGhpcy5lYXNpbmdUaW1lKz10aGlzLmFuaW1hdGlvblNwZWVkLHRoaXMuZWFzaW5nVGltZT0hMD09PXQ/MTp0aGlzLmVhc2luZ1RpbWU7dmFyIGU9aC5lYXNpbmdGdW5jdGlvbnNbdGhpcy5hbmltYXRpb25FYXNpbmdGdW5jdGlvbl0odGhpcy5lYXNpbmdUaW1lKTt0aGlzLmJvZHkudmlldy5zY2FsZT10aGlzLnNvdXJjZVNjYWxlKyh0aGlzLnRhcmdldFNjYWxlLXRoaXMuc291cmNlU2NhbGUpKmUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi54Kyh0aGlzLnRhcmdldFRyYW5zbGF0aW9uLngtdGhpcy5zb3VyY2VUcmFuc2xhdGlvbi54KSplLHk6dGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55Kyh0aGlzLnRhcmdldFRyYW5zbGF0aW9uLnktdGhpcy5zb3VyY2VUcmFuc2xhdGlvbi55KSplfSx0aGlzLmVhc2luZ1RpbWU+PTEmJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJpbml0UmVkcmF3XCIsdGhpcy52aWV3RnVuY3Rpb24pLHRoaXMuZWFzaW5nVGltZT0wLHZvaWQgMCE9dGhpcy5sb2NrZWRPbk5vZGVJZCYmKHRoaXMudmlld0Z1bmN0aW9uPXRoaXMuX2xvY2tlZFJlZHJhdy5iaW5kKHRoaXMpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiaW5pdFJlZHJhd1wiLHRoaXMudmlld0Z1bmN0aW9uKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImFuaW1hdGlvbkZpbmlzaGVkXCIpKX19LHtrZXk6XCJnZXRTY2FsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYm9keS52aWV3LnNjYWxlfX0se2tleTpcImdldFZpZXdQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKHt4Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRXaWR0aCx5Oi41KnRoaXMuY2FudmFzLmZyYW1lLmNhbnZhcy5jbGllbnRIZWlnaHR9KX19XSksdH0oKTtlLmRlZmF1bHQ9bH0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDIpLGQ9aSgyMzMpLmRlZmF1bHQsbD1pKDEwNCkuZGVmYXVsdCx1PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLGksbyl7KDAscy5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW8sdGhpcy5uYXZpZ2F0aW9uSGFuZGxlcj1uZXcgZChlLGkpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblRhcD10aGlzLm9uVGFwLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uVG91Y2g9dGhpcy5vblRvdWNoLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRG91YmxlVGFwPXRoaXMub25Eb3VibGVUYXAuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Ib2xkPXRoaXMub25Ib2xkLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ1N0YXJ0PXRoaXMub25EcmFnU3RhcnQuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25EcmFnPXRoaXMub25EcmFnLmJpbmQodGhpcyksdGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzLm9uRHJhZ0VuZD10aGlzLm9uRHJhZ0VuZC5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vbk1vdXNlV2hlZWw9dGhpcy5vbk1vdXNlV2hlZWwuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25QaW5jaD10aGlzLm9uUGluY2guYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Nb3VzZU1vdmU9dGhpcy5vbk1vdXNlTW92ZS5iaW5kKHRoaXMpLHRoaXMuYm9keS5ldmVudExpc3RlbmVycy5vblJlbGVhc2U9dGhpcy5vblJlbGVhc2UuYmluZCh0aGlzKSx0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnMub25Db250ZXh0PXRoaXMub25Db250ZXh0LmJpbmQodGhpcyksdGhpcy50b3VjaFRpbWU9MCx0aGlzLmRyYWc9e30sdGhpcy5waW5jaD17fSx0aGlzLnBvcHVwPXZvaWQgMCx0aGlzLnBvcHVwT2JqPXZvaWQgMCx0aGlzLnBvcHVwVGltZXI9dm9pZCAwLHRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcj10aGlzLmdldFBvaW50ZXIuYmluZCh0aGlzKSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZh
21167dWx0T3B0aW9ucz17ZHJhZ05vZGVzOiEwLGRyYWdWaWV3OiEwLGhvdmVyOiExLGtleWJvYXJkOntlbmFibGVkOiExLHNwZWVkOnt4OjEwLHk6MTAsem9vbTouMDJ9LGJpbmRUb1dpbmRvdzohMH0sbmF2aWdhdGlvbkJ1dHRvbnM6ITEsdG9vbHRpcERlbGF5OjMwMCx6b29tVmlldzohMH0saC5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7Y2xlYXJUaW1lb3V0KHQucG9wdXBUaW1lciksZGVsZXRlIHQuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcn0pfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXtpZih2b2lkIDAhPT10KXt2YXIgZT1bXCJoaWRlRWRnZXNPbkRyYWdcIixcImhpZGVOb2Rlc09uRHJhZ1wiLFwia2V5Ym9hcmRcIixcIm11bHRpc2VsZWN0XCIsXCJzZWxlY3RhYmxlXCIsXCJzZWxlY3RDb25uZWN0ZWRFZGdlc1wiXTtoLnNlbGVjdGl2ZU5vdERlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnMsdCksaC5tZXJnZU9wdGlvbnModGhpcy5vcHRpb25zLHQsXCJrZXlib2FyZFwiKSx0LnRvb2x0aXAmJihoLmV4dGVuZCh0aGlzLm9wdGlvbnMudG9vbHRpcCx0LnRvb2x0aXApLHQudG9vbHRpcC5jb2xvciYmKHRoaXMub3B0aW9ucy50b29sdGlwLmNvbG9yPWgucGFyc2VDb2xvcih0LnRvb2x0aXAuY29sb3IpKSl9dGhpcy5uYXZpZ2F0aW9uSGFuZGxlci5zZXRPcHRpb25zKHRoaXMub3B0aW9ucyl9fSx7a2V5OlwiZ2V0UG9pbnRlclwiLHZhbHVlOmZ1bmN0aW9uKHQpe3JldHVybnt4OnQueC1oLmdldEFic29sdXRlTGVmdCh0aGlzLmNhbnZhcy5mcmFtZS5jYW52YXMpLHk6dC55LWguZ2V0QWJzb2x1dGVUb3AodGhpcy5jYW52YXMuZnJhbWUuY2FudmFzKX19fSx7a2V5Olwib25Ub3VjaFwiLHZhbHVlOmZ1bmN0aW9uKHQpeyhuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjUwJiYodGhpcy5kcmFnLnBvaW50ZXI9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx0aGlzLmRyYWcucGluY2hlZD0hMSx0aGlzLnBpbmNoLnNjYWxlPXRoaXMuYm9keS52aWV3LnNjYWxlLHRoaXMudG91Y2hUaW1lPShuZXcgRGF0ZSkudmFsdWVPZigpKX19LHtrZXk6XCJvblRhcFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlciksaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIub3B0aW9ucy5tdWx0aXNlbGVjdCYmKHQuY2hhbmdlZFBvaW50ZXJzWzBdLmN0cmxLZXl8fHQuY2hhbmdlZFBvaW50ZXJzWzBdLm1ldGFLZXkpO3RoaXMuY2hlY2tTZWxlY3Rpb25DaGFuZ2VzKGUsdCxpKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImNsaWNrXCIsdCxlKX19LHtrZXk6XCJvbkRvdWJsZVRhcFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJkb3VibGVDbGlja1wiLHQsZSl9fSx7a2V5Olwib25Ib2xkXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5vcHRpb25zLm11bHRpc2VsZWN0O3RoaXMuY2hlY2tTZWxlY3Rpb25DaGFuZ2VzKGUsdCxpKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImNsaWNrXCIsdCxlKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImhvbGRcIix0LGUpfX0se2tleTpcIm9uUmVsZWFzZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKChuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjEwKXt2YXIgZT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpO3RoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwicmVsZWFzZVwiLHQsZSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCl9fX0se2tleTpcIm9uQ29udGV4dFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih7eDp0LmNsaWVudFgseTp0LmNsaWVudFl9KTt0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcIm9uY29udGV4dFwiLHQsZSl9fSx7a2V5OlwiY2hlY2tTZWxlY3Rpb25DaGFuZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGlvbigpLG49ITE7bj0hMD09PWk/dGhpcy5zZWxlY3Rpb25IYW5kbGVyLnNlbGVjdEFkZGl0aW9uYWxPblBvaW50KHQpOnRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RPblBvaW50KHQpO3ZhciBzPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3Rpb24oKSxyPXRoaXMuX2RldGVybWluZURpZmZlcmVuY2UobyxzKSxhPXRoaXMuX2RldGVybWluZURpZmZlcmVuY2UocyxvKTtyLmVkZ2VzLmxlbmd0aD4wJiYodGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJkZXNlbGVjdEVkZ2VcIixlLHQsbyksbj0hMCksci5ub2Rlcy5sZW5ndGg+MCYmKHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwiZGVzZWxlY3ROb2RlXCIsZSx0LG8pLG49ITApLGEubm9kZXMubGVuZ3RoPjAmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcInNlbGVjdE5vZGVcIixlLHQpLG49ITApLGEuZWRnZXMubGVuZ3RoPjAmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcInNlbGVjdEVkZ2VcIixlLHQpLG49ITApLCEwPT09biYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJzZWxlY3RcIixlLHQpfX0se2tleTpcIl9kZXRlcm1pbmVEaWZmZXJlbmNlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1mdW5jdGlvbih0LGUpe2Zvcih2YXIgaT1bXSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBuPXRbb107LTE9PT1lLmluZGV4T2YobikmJmkucHVzaChuKX1yZXR1cm4gaX07cmV0dXJue25vZGVzOmk
21167odC5ub2RlcyxlLm5vZGVzKSxlZGdlczppKHQuZWRnZXMsZS5lZGdlcyl9fX0se2tleTpcIm9uRHJhZ1N0YXJ0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5kcmFnLnBvaW50ZXImJnRoaXMub25Ub3VjaCh0KTt2YXIgZT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KHRoaXMuZHJhZy5wb2ludGVyKTtpZih0aGlzLmRyYWcuZHJhZ2dpbmc9ITAsdGhpcy5kcmFnLnNlbGVjdGlvbj1bXSx0aGlzLmRyYWcudHJhbnNsYXRpb249aC5leHRlbmQoe30sdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24pLHRoaXMuZHJhZy5ub2RlSWQ9dm9pZCAwLHZvaWQgMCE9PWUmJiEwPT09dGhpcy5vcHRpb25zLmRyYWdOb2Rlcyl7dGhpcy5kcmFnLm5vZGVJZD1lLmlkLCExPT09ZS5pc1NlbGVjdGVkKCkmJih0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuc2VsZWN0T2JqZWN0KGUpKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdTdGFydFwiLHQsdGhpcy5kcmFnLnBvaW50ZXIpO3ZhciBpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3Rpb25PYmoubm9kZXM7Zm9yKHZhciBvIGluIGkpaWYoaS5oYXNPd25Qcm9wZXJ0eShvKSl7dmFyIG49aVtvXSxzPXtpZDpuLmlkLG5vZGU6bix4Om4ueCx5Om4ueSx4Rml4ZWQ6bi5vcHRpb25zLmZpeGVkLngseUZpeGVkOm4ub3B0aW9ucy5maXhlZC55fTtuLm9wdGlvbnMuZml4ZWQueD0hMCxuLm9wdGlvbnMuZml4ZWQueT0hMCx0aGlzLmRyYWcuc2VsZWN0aW9uLnB1c2gocyl9fWVsc2UgdGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZW5lcmF0ZUNsaWNrRXZlbnQoXCJkcmFnU3RhcnRcIix0LHRoaXMuZHJhZy5wb2ludGVyLHZvaWQgMCwhMCl9fSx7a2V5Olwib25EcmFnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZighMCE9PXRoaXMuZHJhZy5waW5jaGVkKXt0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwidW5sb2NrTm9kZVwiKTt2YXIgaT10aGlzLmdldFBvaW50ZXIodC5jZW50ZXIpLG89dGhpcy5kcmFnLnNlbGVjdGlvbjtpZihvJiZvLmxlbmd0aCYmITA9PT10aGlzLm9wdGlvbnMuZHJhZ05vZGVzKXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdnaW5nXCIsdCxpKTt2YXIgbj1pLngtdGhpcy5kcmFnLnBvaW50ZXIueCxzPWkueS10aGlzLmRyYWcucG9pbnRlci55O28uZm9yRWFjaChmdW5jdGlvbih0KXt2YXIgaT10Lm5vZGU7ITE9PT10LnhGaXhlZCYmKGkueD1lLmNhbnZhcy5fWGNvbnZlcnRET010b0NhbnZhcyhlLmNhbnZhcy5fWGNvbnZlcnRDYW52YXNUb0RPTSh0LngpK24pKSwhMT09PXQueUZpeGVkJiYoaS55PWUuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKGUuY2FudmFzLl9ZY29udmVydENhbnZhc1RvRE9NKHQueSkrcykpfSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKX1lbHNlIGlmKCEwPT09dGhpcy5vcHRpb25zLmRyYWdWaWV3KXtpZih0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdnaW5nXCIsdCxpLHZvaWQgMCwhMCksdm9pZCAwPT09dGhpcy5kcmFnLnBvaW50ZXIpcmV0dXJuIHZvaWQgdGhpcy5vbkRyYWdTdGFydCh0KTt2YXIgcj1pLngtdGhpcy5kcmFnLnBvaW50ZXIueCxhPWkueS10aGlzLmRyYWcucG9pbnRlci55O3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnRoaXMuZHJhZy50cmFuc2xhdGlvbi54K3IseTp0aGlzLmRyYWcudHJhbnNsYXRpb24ueSthfSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlcXVlc3RSZWRyYXdcIil9fX19LHtrZXk6XCJvbkRyYWdFbmRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmRyYWcuZHJhZ2dpbmc9ITE7dmFyIGU9dGhpcy5kcmFnLnNlbGVjdGlvbjtlJiZlLmxlbmd0aD8oZS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3Qubm9kZS5vcHRpb25zLmZpeGVkLng9dC54Rml4ZWQsdC5ub2RlLm9wdGlvbnMuZml4ZWQueT10LnlGaXhlZH0pLHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwiZHJhZ0VuZFwiLHQsdGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKSk6KHRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2VuZXJhdGVDbGlja0V2ZW50KFwiZHJhZ0VuZFwiLHQsdGhpcy5nZXRQb2ludGVyKHQuY2VudGVyKSx2b2lkIDAsITApLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKSl9fSx7a2V5Olwib25QaW5jaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0UG9pbnRlcih0LmNlbnRlcik7dGhpcy5kcmFnLnBpbmNoZWQ9ITAsdm9pZCAwPT09dGhpcy5waW5jaC5zY2FsZSYmKHRoaXMucGluY2guc2NhbGU9MSk7dmFyIGk9dGhpcy5waW5jaC5zY2FsZSp0LnNjYWxlO3RoaXMuem9vbShpLGUpfX0se2tleTpcInpvb21cIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKCEwPT09dGhpcy5vcHRpb25zLnpvb21WaWV3KXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZTt0PDFlLTUmJih0PTFlLTUpLHQ+MTAmJih0PTEwKTt2YXIgbz12b2lkIDA7dm9pZCAwIT09dGhpcy5kcmFnJiYhMD09PXRoaXMuZHJhZy5kcmFnZ2luZyYmKG89dGhpcy5jYW52YXMuRE9NdG9DYW52YXModGhpcy5kcmFnLnBvaW50ZXIpKTt2YXIgbj10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixzPXQvaSxyPSgxLXMpKmUueCtuLngqcyxhPSgxLXMpKmUueStuLnkqcztpZih0aGlzLmJvZHkudmlldy5zY2FsZT10LHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnIseTphfSx2b2lkIDAhPW8pe3ZhciBoPXRoaXMuY2FudmFzLmNhbnZhc1RvRE9NKG8pO3RoaXMuZHJhZy5wb2ludGVyLng9aC54LHRoaXMuZHJhZy5wb2ludGVyLnk9aC55fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKSxpPHQ/dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInpvb21cIix7ZGlyZWN0aW9uOlwiK1wiLHNjYWxlOnRoaXMuYm9keS52aWV3LnNjYWxlLHBvaW50ZXI6ZX0pOnRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJ6b29tXCIse2RpcmVjdGlvbjpcIi1cIixzY2FsZTp0aGlzLmJvZHkudmlldy5zY2FsZSxwb2ludGVyOmV9KX19fSx7a2V5Olwib25Nb3VzZVdoZWVsXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITA9PT10aGlzLm9wdGlvbnMuem9vbVZpZXcpe3ZhciBlPTA7aWYodC53aGVlbERlbHRhP2U9dC53aGVlbERlbHRhLzEyMDp0LmRldGFpbCYmKGU9LXQuZGV0YWlsLzMpLDAhPT1lKXt2YXIgaT10aGlzLmJvZHkudmlldy5zY2FsZSxvPWUvMTA7ZTwwJiYoby89MS1vKSxpKj0xK287dmFyIG49dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0
21167pO3RoaXMuem9vbShpLG4pfXQucHJldmVudERlZmF1bHQoKX19fSx7a2V5Olwib25Nb3VzZU1vdmVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLGk9dGhpcy5nZXRQb2ludGVyKHt4OnQuY2xpZW50WCx5OnQuY2xpZW50WX0pLG89ITE7dm9pZCAwIT09dGhpcy5wb3B1cCYmKCExPT09dGhpcy5wb3B1cC5oaWRkZW4mJnRoaXMuX2NoZWNrSGlkZVBvcHVwKGkpLCExPT09dGhpcy5wb3B1cC5oaWRkZW4mJihvPSEwLHRoaXMucG9wdXAuc2V0UG9zaXRpb24oaS54KzMsaS55LTUpLHRoaXMucG9wdXAuc2hvdygpKSksITE9PT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuYmluZFRvV2luZG93JiYhMD09PXRoaXMub3B0aW9ucy5rZXlib2FyZC5lbmFibGVkJiZ0aGlzLmNhbnZhcy5mcmFtZS5mb2N1cygpLCExPT09byYmKHZvaWQgMCE9PXRoaXMucG9wdXBUaW1lciYmKGNsZWFySW50ZXJ2YWwodGhpcy5wb3B1cFRpbWVyKSx0aGlzLnBvcHVwVGltZXI9dm9pZCAwKSx0aGlzLmRyYWcuZHJhZ2dpbmd8fCh0aGlzLnBvcHVwVGltZXI9c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBlLl9jaGVja1Nob3dQb3B1cChpKX0sdGhpcy5vcHRpb25zLnRvb2x0aXBEZWxheSkpKSwhMD09PXRoaXMub3B0aW9ucy5ob3ZlciYmdGhpcy5zZWxlY3Rpb25IYW5kbGVyLmhvdmVyT2JqZWN0KHQsaSl9fSx7a2V5OlwiX2NoZWNrU2hvd1BvcHVwXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMuX1hjb252ZXJ0RE9NdG9DYW52YXModC54KSxpPXRoaXMuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKHQueSksbz17bGVmdDplLHRvcDppLHJpZ2h0OmUsYm90dG9tOml9LG49dm9pZCAwPT09dGhpcy5wb3B1cE9iaj92b2lkIDA6dGhpcy5wb3B1cE9iai5pZCxzPSExLHI9XCJub2RlXCI7aWYodm9pZCAwPT09dGhpcy5wb3B1cE9iail7Zm9yKHZhciBhPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxoPXRoaXMuYm9keS5ub2RlcyxkPXZvaWQgMCx1PVtdLGM9MDtjPGEubGVuZ3RoO2MrKylkPWhbYVtjXV0sITA9PT1kLmlzT3ZlcmxhcHBpbmdXaXRoKG8pJiZ2b2lkIDAhPT1kLmdldFRpdGxlKCkmJnUucHVzaChhW2NdKTt1Lmxlbmd0aD4wJiYodGhpcy5wb3B1cE9iaj1oW3VbdS5sZW5ndGgtMV1dLHM9ITApfWlmKHZvaWQgMD09PXRoaXMucG9wdXBPYmomJiExPT09cyl7Zm9yKHZhciBwPXRoaXMuYm9keS5lZGdlSW5kaWNlcyxmPXRoaXMuYm9keS5lZGdlcyxtPXZvaWQgMCx2PVtdLGc9MDtnPHAubGVuZ3RoO2crKyltPWZbcFtnXV0sITA9PT1tLmlzT3ZlcmxhcHBpbmdXaXRoKG8pJiYhMD09PW0uY29ubmVjdGVkJiZ2b2lkIDAhPT1tLmdldFRpdGxlKCkmJnYucHVzaChwW2ddKTt2Lmxlbmd0aD4wJiYodGhpcy5wb3B1cE9iaj1mW3Zbdi5sZW5ndGgtMV1dLHI9XCJlZGdlXCIpfXZvaWQgMCE9PXRoaXMucG9wdXBPYmo/dGhpcy5wb3B1cE9iai5pZCE9PW4mJih2b2lkIDA9PT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cD1uZXcgbCh0aGlzLmNhbnZhcy5mcmFtZSkpLHRoaXMucG9wdXAucG9wdXBUYXJnZXRUeXBlPXIsdGhpcy5wb3B1cC5wb3B1cFRhcmdldElkPXRoaXMucG9wdXBPYmouaWQsdGhpcy5wb3B1cC5zZXRQb3NpdGlvbih0LngrMyx0LnktNSksdGhpcy5wb3B1cC5zZXRUZXh0KHRoaXMucG9wdXBPYmouZ2V0VGl0bGUoKSksdGhpcy5wb3B1cC5zaG93KCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInNob3dQb3B1cFwiLHRoaXMucG9wdXBPYmouaWQpKTp2b2lkIDAhPT10aGlzLnBvcHVwJiYodGhpcy5wb3B1cC5oaWRlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImhpZGVQb3B1cFwiKSl9fSx7a2V5OlwiX2NoZWNrSGlkZVBvcHVwXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9wb2ludGVyVG9Qb3NpdGlvbk9iamVjdCh0KSxpPSExO2lmKFwibm9kZVwiPT09dGhpcy5wb3B1cC5wb3B1cFRhcmdldFR5cGUpe2lmKHZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdJiYhMD09PShpPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdLmlzT3ZlcmxhcHBpbmdXaXRoKGUpKSl7dmFyIG89dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0KTtpPXZvaWQgMCE9PW8mJm8uaWQ9PT10aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWR9fWVsc2Ugdm9pZCAwPT09dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldE5vZGVBdCh0KSYmdm9pZCAwIT09dGhpcy5ib2R5LmVkZ2VzW3RoaXMucG9wdXAucG9wdXBUYXJnZXRJZF0mJihpPXRoaXMuYm9keS5lZGdlc1t0aGlzLnBvcHVwLnBvcHVwVGFyZ2V0SWRdLmlzT3ZlcmxhcHBpbmdXaXRoKGUpKTshMT09PWkmJih0aGlzLnBvcHVwT2JqPXZvaWQgMCx0aGlzLnBvcHVwLmhpZGUoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiaGlkZVBvcHVwXCIpKX19XSksdH0oKTtlLmRlZmF1bHQ9dX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMCkscz1vKG4pLHI9aSgxKSxhPW8ociksaD1pKDEwKSxkPWkoMzcpLGw9aSgzNSksdT1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpKXt2YXIgbz10aGlzOygwLHMuZGVmYXVsdCkodGhpcyx0KSx0aGlzLmJvZHk9ZSx0aGlzLmNhbnZhcz1pLHRoaXMuaWNvbnNDcmVhdGVkPSExLHRoaXMubmF2aWdhdGlvbkhhbW1lcnM9W10sdGhpcy5ib3VuZEZ1bmN0aW9ucz17fSx0aGlzLnRvdWNoVGltZT0wLHRoaXMuYWN0aXZhdGVkPSExLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiYWN0aXZhdGVcIixmdW5jdGlvbigpe28uYWN0aXZhdGVkPSEwLG8uY29uZmlndXJlS2V5Ym9hcmRCaW5kaW5ncygpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZWFjdGl2YXRlXCIsZnVuY3Rpb24oKXtvLmFjdGl2YXRlZD0hMSxvLmNvbmZpZ3VyZUtleWJvYXJkQmluZGluZ3MoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiZGVzdHJveVwiLGZ1bmN0aW9uKCl7dm9pZCAwIT09by5rZXljaGFybSYmby5rZXljaGFybS5kZXN0cm95KCl9KSx0aGlzLm9wdGlvbnM9e319cmV0dXJuKDAsYS5kZWZhdWx0KSh0LFt7a2V5Olwic2V0T3B0aW9uc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMCE9PXQmJih0aGlzLm9wdGlvbnM9dCx0aGlzLmNyZWF0ZSgpKX19LHtrZXk6XCJjcmVhdGVcIix2YWx1ZTpmdW5jdGlvbigpeyEwPT09dGhpcy5vcHRpb25zLm5hdmlnYXRpb25CdXR0b25zPyExPT09dGhpcy5pY29uc0NyZWF0ZWQmJnRoaXMubG9hZE5hdmlnYXRpb25FbGVtZW50cygpOiEwPT09dGhpcy5pY29uc0NyZWF0ZWQmJnRoaXMuY2xlYW5OYXZpZ2F0aW9uKCksdGhpcy5jb25maWd1cmVLZXlib2FyZEJpbmRpbmdzKCl9fSx7a2V5OlwiY2xlYW5OYXZpZ2F0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtpZigwIT10aGlzLm5hdmlnYXRpb25IYW1tZXJzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDx0aGlzLm5hdmlnYXRpb25IYW1tZXJzLmxlbmd0aDt0KyspdGhpcy5uYXZpZ2F0aW9uSGFtbWVyc1t0XS5kZXN0cm95KCk7dGhpcy5uYXZpZ2F0aW9uSGFtbWVycz1bXX10aGlzLm5hdmlnYXRpb25ET00mJnRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyJiZ0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5wYXJlbnROb2RlJiZ0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyKSx0aGlzLmljb25zQ3JlYXRlZD0hMX19LHtrZXk6XCJsb2FkTmF2aWdhdGlvbkVsZW1lbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuY2xlYW5OYXZpZ2F0aW9uKCksdGhpcy5uYXZpZ2F0aW9uRE9NP
21167Xt9O3ZhciBlPVtcInVwXCIsXCJkb3duXCIsXCJsZWZ0XCIsXCJyaWdodFwiLFwiem9vbUluXCIsXCJ6b29tT3V0XCIsXCJ6b29tRXh0ZW5kc1wiXSxpPVtcIl9tb3ZlVXBcIixcIl9tb3ZlRG93blwiLFwiX21vdmVMZWZ0XCIsXCJfbW92ZVJpZ2h0XCIsXCJfem9vbUluXCIsXCJfem9vbU91dFwiLFwiX2ZpdFwiXTt0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLHRoaXMubmF2aWdhdGlvbkRPTS53cmFwcGVyLmNsYXNzTmFtZT1cInZpcy1uYXZpZ2F0aW9uXCIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5uYXZpZ2F0aW9uRE9NLndyYXBwZXIpO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLm5hdmlnYXRpb25ET01bZVtvXV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm5hdmlnYXRpb25ET01bZVtvXV0uY2xhc3NOYW1lPVwidmlzLWJ1dHRvbiB2aXMtXCIrZVtvXSx0aGlzLm5hdmlnYXRpb25ET00ud3JhcHBlci5hcHBlbmRDaGlsZCh0aGlzLm5hdmlnYXRpb25ET01bZVtvXV0pO3ZhciBuPW5ldyBoKHRoaXMubmF2aWdhdGlvbkRPTVtlW29dXSk7XCJfZml0XCI9PT1pW29dP2Qub25Ub3VjaChuLHRoaXMuX2ZpdC5iaW5kKHRoaXMpKTpkLm9uVG91Y2gobix0aGlzLmJpbmRUb1JlZHJhdy5iaW5kKHRoaXMsaVtvXSkpLHRoaXMubmF2aWdhdGlvbkhhbW1lcnMucHVzaChuKX12YXIgcz1uZXcgaCh0aGlzLmNhbnZhcy5mcmFtZSk7ZC5vblJlbGVhc2UocyxmdW5jdGlvbigpe3QuX3N0b3BNb3ZlbWVudCgpfSksdGhpcy5uYXZpZ2F0aW9uSGFtbWVycy5wdXNoKHMpLHRoaXMuaWNvbnNDcmVhdGVkPSEwfX0se2tleTpcImJpbmRUb1JlZHJhd1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZvaWQgMD09PXRoaXMuYm91bmRGdW5jdGlvbnNbdF0mJih0aGlzLmJvdW5kRnVuY3Rpb25zW3RdPXRoaXNbdF0uYmluZCh0aGlzKSx0aGlzLmJvZHkuZW1pdHRlci5vbihcImluaXRSZWRyYXdcIix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0YXJ0UmVuZGVyaW5nXCIpKX19LHtrZXk6XCJ1bmJpbmRGcm9tUmVkcmF3XCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwIT09dGhpcy5ib3VuZEZ1bmN0aW9uc1t0XSYmKHRoaXMuYm9keS5lbWl0dGVyLm9mZihcImluaXRSZWRyYXdcIix0aGlzLmJvdW5kRnVuY3Rpb25zW3RdKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3N0b3BSZW5kZXJpbmdcIiksZGVsZXRlIHRoaXMuYm91bmRGdW5jdGlvbnNbdF0pfX0se2tleTpcIl9maXRcIix2YWx1ZTpmdW5jdGlvbigpeyhuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjcwMCYmKHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJmaXRcIix7ZHVyYXRpb246NzAwfSksdGhpcy50b3VjaFRpbWU9KG5ldyBEYXRlKS52YWx1ZU9mKCkpfX0se2tleTpcIl9zdG9wTW92ZW1lbnRcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLmJvdW5kRnVuY3Rpb25zKXRoaXMuYm91bmRGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZW1pdHRlci5vZmYoXCJpbml0UmVkcmF3XCIsdGhpcy5ib3VuZEZ1bmN0aW9uc1t0XSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9zdG9wUmVuZGVyaW5nXCIpKTt0aGlzLmJvdW5kRnVuY3Rpb25zPXt9fX0se2tleTpcIl9tb3ZlVXBcIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLnkrPXRoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC55fX0se2tleTpcIl9tb3ZlRG93blwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24ueS09dGhpcy5vcHRpb25zLmtleWJvYXJkLnNwZWVkLnl9fSx7a2V5OlwiX21vdmVMZWZ0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54Kz10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueH19LHtrZXk6XCJfbW92ZVJpZ2h0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbi54LT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQueH19LHtrZXk6XCJfem9vbUluXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkudmlldy5zY2FsZSxlPXRoaXMuYm9keS52aWV3LnNjYWxlKigxK3RoaXMub3B0aW9ucy5rZXlib2FyZC5zcGVlZC56b29tKSxpPXRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uLG89ZS90LG49KDEtbykqdGhpcy5jYW52YXMuY2FudmFzVmlld0NlbnRlci54K2kueCpvLHM9KDEtbykqdGhpcy5jYW52YXMuY2FudmFzVmlld0NlbnRlci55K2kueSpvO3RoaXMuYm9keS52aWV3LnNjYWxlPWUsdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6bix5OnN9LHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJ6b29tXCIse2RpcmVjdGlvbjpcIitcIixzY2FsZTp0aGlzLmJvZHkudmlldy5zY2FsZSxwb2ludGVyOm51bGx9KX19LHtrZXk6XCJfem9vbU91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5ib2R5LnZpZXcuc2NhbGUsZT10aGlzLmJvZHkudmlldy5zY2FsZS8oMSt0aGlzLm9wdGlvbnMua2V5Ym9hcmQuc3BlZWQuem9vbSksaT10aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbixvPWUvdCxuPSgxLW8pKnRoaXMuY2FudmFzLmNhbnZhc1ZpZXdDZW50ZXIueCtpLngqbyxzPSgxLW8pKnRoaXMuY2FudmFzLmNhbnZhc1ZpZXdDZW50ZXIueStpLnkqbzt0aGlzLmJvZHkudmlldy5zY2FsZT1lLHRoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4Om4seTpzfSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiem9vbVwiLHtkaXJlY3Rpb246XCItXCIsc2NhbGU6dGhpcy5ib2R5LnZpZXcuc2NhbGUscG9pbnRlcjpudWxsfSl9fSx7a2V5OlwiY29uZmlndXJlS2V5Ym9hcmRCaW5kaW5nc1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt2b2lkIDAhPT10aGlzLmtleWNoYXJtJiZ0aGlzLmtleWNoYXJtLmRlc3Ryb3koKSwhMD09PXRoaXMub3B0aW9ucy5rZXlib2FyZC5lbmFibGVkJiYoITA9PT10aGlzLm9wdGlvbnMua2V5Ym9hcmQuYmluZFRvV2luZG93P3RoaXMua2V5Y2hhcm09bCh7Y29udGFpbmVyOndpbmRvdyxwcmV2ZW50RGVmYXVsdDohMH0pOnRoaXMua2V5Y2hhcm09bCh7Y29udGFpbmVyOnRoaXMuY2FudmFzLmZyYW1lLHByZXZlbn
21167REZWZhdWx0OiEwfSksdGhpcy5rZXljaGFybS5yZXNldCgpLCEwPT09dGhpcy5hY3RpdmF0ZWQmJih0aGlzLmtleWNoYXJtLmJpbmQoXCJ1cFwiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoXCJfbW92ZVVwXCIpfSxcImtleWRvd25cIiksdGhpcy5rZXljaGFybS5iaW5kKFwiZG93blwiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoXCJfbW92ZURvd25cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJsZWZ0XCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl9tb3ZlTGVmdFwiKX0sXCJrZXlkb3duXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcInJpZ2h0XCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl9tb3ZlUmlnaHRcIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCI9XCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tSW5cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJudW0rXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tSW5cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJudW0tXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tT3V0XCIpfSxcImtleWRvd25cIiksdGhpcy5rZXljaGFybS5iaW5kKFwiLVwiLGZ1bmN0aW9uKCl7dC5iaW5kVG9SZWRyYXcoXCJfem9vbU91dFwiKX0sXCJrZXlkb3duXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcIltcIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJdXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tSW5cIil9LFwia2V5ZG93blwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJwYWdldXBcIixmdW5jdGlvbigpe3QuYmluZFRvUmVkcmF3KFwiX3pvb21JblwiKX0sXCJrZXlkb3duXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcInBhZ2Vkb3duXCIsZnVuY3Rpb24oKXt0LmJpbmRUb1JlZHJhdyhcIl96b29tT3V0XCIpfSxcImtleWRvd25cIiksdGhpcy5rZXljaGFybS5iaW5kKFwidXBcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl9tb3ZlVXBcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiZG93blwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX21vdmVEb3duXCIpfSxcImtleXVwXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcImxlZnRcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl9tb3ZlTGVmdFwiKX0sXCJrZXl1cFwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJyaWdodFwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX21vdmVSaWdodFwiKX0sXCJrZXl1cFwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCI9XCIsZnVuY3Rpb24oKXt0LnVuYmluZEZyb21SZWRyYXcoXCJfem9vbUluXCIpfSxcImtleXVwXCIpLHRoaXMua2V5Y2hhcm0uYmluZChcIm51bStcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl96b29tSW5cIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwibnVtLVwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiLVwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiW1wiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21PdXRcIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwiXVwiLGZ1bmN0aW9uKCl7dC51bmJpbmRGcm9tUmVkcmF3KFwiX3pvb21JblwiKX0sXCJrZXl1cFwiKSx0aGlzLmtleWNoYXJtLmJpbmQoXCJwYWdldXBcIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl96b29tSW5cIil9LFwia2V5dXBcIiksdGhpcy5rZXljaGFybS5iaW5kKFwicGFnZWRvd25cIixmdW5jdGlvbigpe3QudW5iaW5kRnJvbVJlZHJhdyhcIl96b29tT3V0XCIpfSxcImtleXVwXCIpKSl9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9aSg0NykuZGVmYXVsdCxkPWkoNzQpLmRlZmF1bHQsbD1pKDIpLHU9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSl7dmFyIG89dGhpczsoMCxzLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5jYW52YXM9aSx0aGlzLnNlbGVjdGlvbk9iaj17bm9kZXM6W10sZWRnZXM6W119LHRoaXMuaG92ZXJPYmo9e25vZGVzOnt9LGVkZ2VzOnt9fSx0aGlzLm9wdGlvbnM9e30sdGhpcy5kZWZhdWx0T3B0aW9ucz17bXVsdGlzZWxlY3Q6ITEsc2VsZWN0YWJsZTohMCxzZWxlY3RDb25uZWN0ZWRFZGdlczohMCxob3ZlckNvbm5lY3RlZEVkZ2VzOiEwfSxsLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfZGF0YUNoYW5nZWRcIixmdW5jdGlvbigpe28udXBkYXRlU2VsZWN0aW9uKCl9KX1yZXR1cm4oMCxhLmRlZmF1bHQpKHQsW3trZXk6XCJzZXRPcHRpb25zXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYodm9pZCAwIT09dCl7dmFyIGU9W1wibXVsdGlzZWxlY3RcIixcImhvdmVyQ29ubmVjdGVkRWRnZXNcIixcInNlbGVjdGFibGVcIixcInNlbGVjdENvbm5lY3RlZEVkZ2VzXCJdO2wuc2VsZWN0aXZlRGVlcEV4dGVuZChlLHRoaXMub3B0aW9ucyx0KX19fSx7a2V5Olwic2VsZWN0T25Qb2ludFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO2lmKCEwPT09dGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KHQpfHx0aGlzLmdldEVkZ2VBdCh0KTt0aGlzLnVuc2VsZWN0QWxsKCksdm9pZCAwIT09aSYmKGU9dGhpcy5zZWxlY3RPYmplY3QoaSkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKX1yZXR1cm4gZX19LHtrZXk6XCJzZWxlY3RBZGRpdGlvbmFsT25Qb2ludFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSExO2lmKCEwPT09dGhpcy5vcHRpb25zLnNlbGVjdGFibGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KHQpfHx0aGlzLmdldEVkZ2VBdCh0KTt2b2lkIDAhPT1pJiYoZT0hMCwhMD09PWkuaXNTZWxlY3RlZCgpP3RoaXMuZGVzZWxlY3RPYmplY3QoaSk6dGhpcy5zZWxlY3RPYmplY3QoaSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpKX1yZXR1cm4gZX19LHtrZXk6XCJfaW5pdEJhc2VFdmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9e307cmV0dXJuIGkucG9pbnRlcj17RE9NOnt4OmUueCx5OmUueX0sY2FudmFzOnRoaXMuY2FudmFzLkRPTXRvQ2FudmFzKGUpfSxpLmV2ZW50PXQsaX19LHtrZXk6XCJfZ2VuZXJhdGVDbGlja0V2ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGksbyl7dmFyIG49YXJndW1lbnRzLmxlbmd0aD40JiZ2b2lkIDAhPT1hcmd1bWVudHNbNF0mJmFyZ3VtZW50c1s0XSxzPXRoaXMuX2luaXRCYXNlRXZlbnQoZSxpKTtpZighMD09PW4pcy5ub2Rlcz1bXSxzLmVkZ2VzPVtdO2Vsc2V7dmFyIHI9dGhpcy5nZXRTZWxlY3Rpb24oKTtzLm5vZGVzPXIubm9kZXMscy5lZGdlcz1yLmVkZ2VzfXZvaWQgMCE9PW8mJihzLnByZX
21167Zpb3VzU2VsZWN0aW9uPW8pLFwiY2xpY2tcIj09dCYmKHMuaXRlbXM9dGhpcy5nZXRDbGlja2VkSXRlbXMoaSkpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQodCxzKX19LHtrZXk6XCJzZWxlY3RPYmplY3RcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06dGhpcy5vcHRpb25zLnNlbGVjdENvbm5lY3RlZEVkZ2VzO3JldHVybiB2b2lkIDAhPT10JiYodCBpbnN0YW5jZW9mIGgmJiEwPT09ZSYmdGhpcy5fc2VsZWN0Q29ubmVjdGVkRWRnZXModCksdC5zZWxlY3QoKSx0aGlzLl9hZGRUb1NlbGVjdGlvbih0KSwhMCl9fSx7a2V5OlwiZGVzZWxlY3RPYmplY3RcIix2YWx1ZTpmdW5jdGlvbih0KXshMD09PXQuaXNTZWxlY3RlZCgpJiYodC5zZWxlY3RlZD0hMSx0aGlzLl9yZW1vdmVGcm9tU2VsZWN0aW9uKHQpKX19LHtrZXk6XCJfZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGhcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT10aGlzLmJvZHkubm9kZXMsbz0wO288dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5ub2RlSW5kaWNlc1tvXTtpW25dLmlzT3ZlcmxhcHBpbmdXaXRoKHQpJiZlLnB1c2gobil9cmV0dXJuIGV9fSx7a2V5OlwiX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jYW52YXMuRE9NdG9DYW52YXModCk7cmV0dXJue2xlZnQ6ZS54LTEsdG9wOmUueSsxLHJpZ2h0OmUueCsxLGJvdHRvbTplLnktMX19fSx7a2V5OlwiZ2V0Tm9kZUF0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9IShhcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXSl8fGFyZ3VtZW50c1sxXSxpPXRoaXMuX3BvaW50ZXJUb1Bvc2l0aW9uT2JqZWN0KHQpLG89dGhpcy5fZ2V0QWxsTm9kZXNPdmVybGFwcGluZ1dpdGgoaSk7cmV0dXJuIG8ubGVuZ3RoPjA/ITA9PT1lP3RoaXMuYm9keS5ub2Rlc1tvW28ubGVuZ3RoLTFdXTpvW28ubGVuZ3RoLTFdOnZvaWQgMH19LHtrZXk6XCJfZ2V0RWRnZXNPdmVybGFwcGluZ1dpdGhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2Zvcih2YXIgaT10aGlzLmJvZHkuZWRnZXMsbz0wO288dGhpcy5ib2R5LmVkZ2VJbmRpY2VzLmxlbmd0aDtvKyspe3ZhciBuPXRoaXMuYm9keS5lZGdlSW5kaWNlc1tvXTtpW25dLmlzT3ZlcmxhcHBpbmdXaXRoKHQpJiZlLnB1c2gobil9fX0se2tleTpcIl9nZXRBbGxFZGdlc092ZXJsYXBwaW5nV2l0aFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiB0aGlzLl9nZXRFZGdlc092ZXJsYXBwaW5nV2l0aCh0LGUpLGV9fSx7a2V5OlwiZ2V0RWRnZUF0XCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV0saT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh0KSxvPTEwLG49bnVsbCxzPXRoaXMuYm9keS5lZGdlcyxyPTA7cjx0aGlzLmJvZHkuZWRnZUluZGljZXMubGVuZ3RoO3IrKyl7dmFyIGE9dGhpcy5ib2R5LmVkZ2VJbmRpY2VzW3JdLGg9c1thXTtpZihoLmNvbm5lY3RlZCl7dmFyIGQ9aC5mcm9tLngsbD1oLmZyb20ueSx1PWgudG8ueCxjPWgudG8ueSxwPWguZWRnZVR5cGUuZ2V0RGlzdGFuY2VUb0VkZ2UoZCxsLHUsYyxpLngsaS55KTtwPG8mJihuPWEsbz1wKX19cmV0dXJuIG51bGwhPT1uPyEwPT09ZT90aGlzLmJvZHkuZWRnZXNbbl06bjp2b2lkIDB9fSx7a2V5OlwiX2FkZFRvU2VsZWN0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGg/dGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdC5pZF09dDp0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1t0LmlkXT10fX0se2tleTpcIl9hZGRUb0hvdmVyXCIsdmFsdWU6ZnVuY3Rpb24odCl7dCBpbnN0YW5jZW9mIGg/dGhpcy5ob3Zlck9iai5ub2Rlc1t0LmlkXT10OnRoaXMuaG92ZXJPYmouZWRnZXNbdC5pZF09dH19LHtrZXk6XCJfcmVtb3ZlRnJvbVNlbGVjdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3QgaW5zdGFuY2VvZiBoPyhkZWxldGUgdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdC5pZF0sdGhpcy5fdW5zZWxlY3RDb25uZWN0ZWRFZGdlcyh0KSk6ZGVsZXRlIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW3QuaWRdfX0se2tleTpcInVuc2VsZWN0QWxsXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkodCkmJnRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW3RdLnVuc2VsZWN0KCk7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiZ0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1tlXS51bnNlbGVjdCgpO3RoaXMuc2VsZWN0aW9uT2JqPXtub2Rlczp7fSxlZGdlczp7fX19fSx7a2V5OlwiX2dldFNlbGVjdGVkTm9kZUNvdW50XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmKHQrPTEpO3JldHVybiB0fX0se2tleTpcIl9nZXRTZWxlY3RlZE5vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2RlcylpZih0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXNbdF19fSx7a2V5OlwiX2dldFNlbGVjdGVkRWRnZVwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KHQpKXJldHVybiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlc1t0XX19LHtrZXk6XCJfZ2V0U2VsZWN0ZWRFZGdlQ291bnRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiYodCs9MSk7cmV0dXJuIHR9fSx7a2V5OlwiX2dldFNlbGVjdGVkT2JqZWN0Q291bnRcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKXRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KGUpJiYodCs9MSk7Zm9yKHZhciBpIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGkpJiYodCs9MSk7cmV0dXJuIHR9fSx7a2V5OlwiX3NlbGVjdGlvbklzRW1wdHlcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2RlcylpZih0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eSh0KSlyZXR1cm4hMTtmb3IodmFyIGUgaW4gdGhpcy5zZWxlY3Rpb25PYmouZWRnZXMpaWYodGhpcy5zZWxlY3Rpb25PYmouZWRnZXMuaGFzT3duUHJvcGVydHkoZSkpcmV0dXJuITE7cmV0dXJuITB9fSx7a2V5OlwiX2NsdXN0ZXJJblNlbGVjdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzKWlmKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzLmhhc093blByb3BlcnR5KHQpJiZ0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0XS5jbHVzdGVyU2l6ZT4xKXJldHVybiEwO3JldHVybiExfX0se2tleTpcIl9zZWxlY3RDb25uZWN0ZWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgaT10LmVkZ2VzW2VdO2kuc2VsZWN0KCksdGhpcy5fYWRkVG9TZWxlY3Rpb24oaSl9fX0se2tleTpcIl9ob3ZlckNvbm5lY3RlZEVkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPTA7ZTx0LmVkZ2VzLmxlbmd0aDtlKyspe3ZhciBpPXQuZWRnZXNbZV07aS5ob3Zlcj0hMCx0aGlzLl9hZGRUb0hvdmVyKGkpfX19LHtrZXk6XCJfdW5zZWxlY3RDb25uZWN0ZWRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5lZGdlcy5sZW5ndGg7ZSsrKXt2YXIgaT10LmVkZ2VzW2VdO2kudW5zZWxlY3QoKSx0aGlzLl9yZW1vdmVGcm9tU2VsZWN0aW9uKGkpfX19LHtrZXk6XCJlbWl0Qmx1ckV2ZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPXR
21167oaXMuX2luaXRCYXNlRXZlbnQodCxlKTshMD09PWkuaG92ZXImJihpLmhvdmVyPSExLGkgaW5zdGFuY2VvZiBoPyhvLm5vZGU9aS5pZCx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiYmx1ck5vZGVcIixvKSk6KG8uZWRnZT1pLmlkLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJibHVyRWRnZVwiLG8pKSl9fSx7a2V5OlwiZW1pdEhvdmVyRXZlbnRcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dmFyIG89dGhpcy5faW5pdEJhc2VFdmVudCh0LGUpLG49ITE7cmV0dXJuITE9PT1pLmhvdmVyJiYoaS5ob3Zlcj0hMCx0aGlzLl9hZGRUb0hvdmVyKGkpLG49ITAsaSBpbnN0YW5jZW9mIGg/KG8ubm9kZT1pLmlkLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJob3Zlck5vZGVcIixvKSk6KG8uZWRnZT1pLmlkLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJob3ZlckVkZ2VcIixvKSkpLG59fSx7a2V5OlwiaG92ZXJPYmplY3RcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMuZ2V0Tm9kZUF0KGUpO3ZvaWQgMD09PWkmJihpPXRoaXMuZ2V0RWRnZUF0KGUpKTt2YXIgbz0hMTtmb3IodmFyIG4gaW4gdGhpcy5ob3Zlck9iai5ub2Rlcyl0aGlzLmhvdmVyT2JqLm5vZGVzLmhhc093blByb3BlcnR5KG4pJiYodm9pZCAwPT09aXx8aSBpbnN0YW5jZW9mIGgmJmkuaWQhPW58fGkgaW5zdGFuY2VvZiBkKSYmKHRoaXMuZW1pdEJsdXJFdmVudCh0LGUsdGhpcy5ob3Zlck9iai5ub2Rlc1tuXSksZGVsZXRlIHRoaXMuaG92ZXJPYmoubm9kZXNbbl0sbz0hMCk7Zm9yKHZhciBzIGluIHRoaXMuaG92ZXJPYmouZWRnZXMpdGhpcy5ob3Zlck9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShzKSYmKCEwPT09bz8odGhpcy5ob3Zlck9iai5lZGdlc1tzXS5ob3Zlcj0hMSxkZWxldGUgdGhpcy5ob3Zlck9iai5lZGdlc1tzXSk6KHZvaWQgMD09PWl8fGkgaW5zdGFuY2VvZiBkJiZpLmlkIT1zfHxpIGluc3RhbmNlb2YgaCYmIWkuaG92ZXIpJiYodGhpcy5lbWl0Qmx1ckV2ZW50KHQsZSx0aGlzLmhvdmVyT2JqLmVkZ2VzW3NdKSxkZWxldGUgdGhpcy5ob3Zlck9iai5lZGdlc1tzXSxvPSEwKSk7dm9pZCAwIT09aSYmKG89b3x8dGhpcy5lbWl0SG92ZXJFdmVudCh0LGUsaSksaSBpbnN0YW5jZW9mIGgmJiEwPT09dGhpcy5vcHRpb25zLmhvdmVyQ29ubmVjdGVkRWRnZXMmJnRoaXMuX2hvdmVyQ29ubmVjdGVkRWRnZXMoaSkpLCEwPT09byYmdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZXF1ZXN0UmVkcmF3XCIpfX0se2tleTpcImdldFNlbGVjdGlvblwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue25vZGVzOnRoaXMuZ2V0U2VsZWN0ZWROb2RlcygpLGVkZ2VzOnRoaXMuZ2V0U2VsZWN0ZWRFZGdlcygpfX19LHtrZXk6XCJnZXRTZWxlY3RlZE5vZGVzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZighMD09PXRoaXMub3B0aW9ucy5zZWxlY3RhYmxlKWZvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcyl0aGlzLnNlbGVjdGlvbk9iai5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5wdXNoKHRoaXMuc2VsZWN0aW9uT2JqLm5vZGVzW2VdLmlkKTtyZXR1cm4gdH19LHtrZXk6XCJnZXRTZWxlY3RlZEVkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZighMD09PXRoaXMub3B0aW9ucy5zZWxlY3RhYmxlKWZvcih2YXIgZSBpbiB0aGlzLnNlbGVjdGlvbk9iai5lZGdlcyl0aGlzLnNlbGVjdGlvbk9iai5lZGdlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5wdXNoKHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzW2VdLmlkKTtyZXR1cm4gdH19LHtrZXk6XCJzZXRTZWxlY3Rpb25cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPjEmJnZvaWQgMCE9PWFyZ3VtZW50c1sxXT9hcmd1bWVudHNbMV06e30saT12b2lkIDAsbz12b2lkIDA7aWYoIXR8fCF0Lm5vZGVzJiYhdC5lZGdlcyl0aHJvd1wiU2VsZWN0aW9uIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggbm9kZXMgYW5kL29yIGVkZ2VzIHByb3BlcnRpZXNcIlxuICAgICAgICA7aWYoKGUudW5zZWxlY3RBbGx8fHZvaWQgMD09PWUudW5zZWxlY3RBbGwpJiZ0aGlzLnVuc2VsZWN0QWxsKCksdC5ub2Rlcylmb3IoaT0wO2k8dC5ub2Rlcy5sZW5ndGg7aSsrKXtvPXQubm9kZXNbaV07dmFyIG49dGhpcy5ib2R5Lm5vZGVzW29dO2lmKCFuKXRocm93IG5ldyBSYW5nZUVycm9yKCdOb2RlIHdpdGggaWQgXCInK28rJ1wiIG5vdCBmb3VuZCcpO3RoaXMuc2VsZWN0T2JqZWN0KG4sZS5oaWdobGlnaHRFZGdlcyl9aWYodC5lZGdlcylmb3IoaT0wO2k8dC5lZGdlcy5sZW5ndGg7aSsrKXtvPXQuZWRnZXNbaV07dmFyIHM9dGhpcy5ib2R5LmVkZ2VzW29dO2lmKCFzKXRocm93IG5ldyBSYW5nZUVycm9yKCdFZGdlIHdpdGggaWQgXCInK28rJ1wiIG5vdCBmb3VuZCcpO3RoaXMuc2VsZWN0T2JqZWN0KHMpfXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVxdWVzdFJlZHJhd1wiKX19LHtrZXk6XCJzZWxlY3ROb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPSEoYXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0pfHxhcmd1bWVudHNbMV07aWYoIXR8fHZvaWQgMD09PXQubGVuZ3RoKXRocm93XCJTZWxlY3Rpb24gbXVzdCBiZSBhbiBhcnJheSB3aXRoIGlkc1wiO3RoaXMuc2V0U2VsZWN0aW9uKHtub2Rlczp0fSx7aGlnaGxpZ2h0RWRnZXM6ZX0pfX0se2tleTpcInNlbGVjdEVkZ2VzXCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoIXR8fHZvaWQgMD09PXQubGVuZ3RoKXRocm93XCJTZWxlY3Rpb24gbXVzdCBiZSBhbiBhcnJheSB3aXRoIGlkc1wiO3RoaXMuc2V0U2VsZWN0aW9uKHtlZGdlczp0fSl9fSx7a2V5OlwidXBkYXRlU2VsZWN0aW9uXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMpdGhpcy5zZWxlY3Rpb25PYmoubm9kZXMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkodCl8fGRlbGV0ZSB0aGlzLnNlbGVjdGlvbk9iai5ub2Rlc1t0XSk7Zm9yKHZhciBlIGluIHRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzKXRoaXMuc2VsZWN0aW9uT2JqLmVkZ2VzLmhhc093blByb3BlcnR5KGUpJiYodGhpcy5ib2R5LmVkZ2VzLmhhc093blByb3BlcnR5KGUpfHxkZWxldGUgdGhpcy5zZWxlY3Rpb25PYmouZWRnZXNbZV0pfX0se2tleTpcImdldENsaWNrZWRJdGVtc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyh0KSxpPVtdLG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dGhpcy5ib2R5Lm5vZGVzLHM9by5sZW5ndGgtMTtzPj0wO3MtLSl7dmFyIHI9bltvW3NdXSxhPXIuZ2V0SXRlbXNPblBvaW50KGUpO2kucHVzaC5hcHBseShpLGEpfWZvcih2YXIgaD10aGlzLmJvZHkuZWRnZUluZGljZXMsZD10aGlzLmJvZHkuZWRnZXMsbD1oLmxlbmd0aC0xO2w+PTA7bC0tKXt2YXIgdT1kW2hbbF1dLGM9dS5nZXRJdGVtc09uUG9pbnQoZSk7aS5wdXNoLmFwcGx5KGksYyl9cmV0dXJuIGl9fV0pLHR9KCk7ZS5kZWZhdWx0PXV9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDMwKSxzPW8obikscj1pKDYpLGE9byhyKSxoPWkoOCksZD1vKGgpLGw9aSgwKSx1PW8obCksYz1pKDEpLHA9byhjKSxmPWkoMiksbT1pKDc2KS5kZWZhdWx0LHY9aSgyMzYpLGc9di5Ib3Jpem9udGFsU3RyYXRlZ3kseT12LlZlcnRpY2FsU3RyYXRlZ3ksYj1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5jaGlsZHJlblJlZmVyZW5jZT17fSx0aGlzLnBhcmVudFJlZmVyZW5jZT17fSx0aGlzLnRyZWVzPXt9LHRoaXMuZGlzdHJpYnV0aW9uT3JkZXJpbmc9e30sdGhpcy5sZXZlbHM9e30sdGhpcy5kaXN0cmlidXRpb25JbmRleD17fSx0aGlzLmlzVHJlZT0hMSx0aGlzLnRyZWVJbmRleD0tMX1yZXR1cm4oMCxwLmRlZmF1bHQpKHQsW3trZXk6XCJhZGRSZWxhdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09dGhpcy5jaGlsZHJlblJlZmVyZW5jZVt0XSYmKHRoaXMuY2hpbGRyZW5SZWZlcmVuY2VbdF09W10pLHRoaXMuY2hpbGRyZW5SZWZlcmVuY2VbdF0ucHVzaChlKSx2b2lkIDA9PT10aGlzLnBhcmVudFJlZmVyZW5jZVtlXSYmKHRoaXMucGFyZW50UmVmZXJlbmNlW2VdPVtdKSx0aGlzLnBhcmVudFJlZmVyZW5jZVtlXS5wdXNoKHQpfX0se2tleTpcImNoZWNrSWZUcmVlXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5wYXJlbnRSZWZlcmVuY2UpaWYodGhpcy5wYXJlbnRSZWZlcmVuY2VbdF0ubGVuZ3RoPjEpcmV0dXJuIHZvaWQodGhpcy5pc1RyZWU9ITEpO3RoaXMuaXNUcmVlPSEwfX0se2tleTpcIm51bVRyZWVzXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy50cmVlSW5kZXgrMX19LHtrZXk6XCJzZXRUcmVlSW5kZXhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PWUmJnZvaWQgMD09PXRoaXMudHJlZXNbdC5pZF0mJih0aGlzLnRyZWVzW3QuaWRdPWUsdGhpcy50cmVlSW5kZXg9TWF0aC5tYXgoZSx0aGlzLnRyZWVJbmRleCkpfX0se2tleTpcImVuc3VyZUxldmVsXCIsdmFsdWU6ZnVuY3Rpb24odCl7dm9pZCAwPT09dGhpcy5sZXZlbHNbdF0mJih0aGlzLmxldmVsc1t0XT0wKX19LHtrZXk6XCJnZXRNYXhMZXZlbFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXR
21167oaXMsaT17fTtyZXR1cm4gZnVuY3Rpb24gdChvKXtpZih2b2lkIDAhPT1pW29dKXJldHVybiBpW29dO3ZhciBuPWUubGV2ZWxzW29dO2lmKGUuY2hpbGRyZW5SZWZlcmVuY2Vbb10pe3ZhciBzPWUuY2hpbGRyZW5SZWZlcmVuY2Vbb107aWYocy5sZW5ndGg+MClmb3IodmFyIHI9MDtyPHMubGVuZ3RoO3IrKyluPU1hdGgubWF4KG4sdChzW3JdKSl9cmV0dXJuIGlbb109bixufSh0KX19LHtrZXk6XCJsZXZlbERvd25zdHJlYW1cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZvaWQgMD09PXRoaXMubGV2ZWxzW2UuaWRdJiYodm9pZCAwPT09dGhpcy5sZXZlbHNbdC5pZF0mJih0aGlzLmxldmVsc1t0LmlkXT0wKSx0aGlzLmxldmVsc1tlLmlkXT10aGlzLmxldmVsc1t0LmlkXSsxKX19LHtrZXk6XCJzZXRNaW5MZXZlbFRvWmVyb1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPTFlOTtmb3IodmFyIGkgaW4gdCl0Lmhhc093blByb3BlcnR5KGkpJiZ2b2lkIDAhPT10aGlzLmxldmVsc1tpXSYmKGU9TWF0aC5taW4odGhpcy5sZXZlbHNbaV0sZSkpO2Zvcih2YXIgbyBpbiB0KXQuaGFzT3duUHJvcGVydHkobykmJnZvaWQgMCE9PXRoaXMubGV2ZWxzW29dJiYodGhpcy5sZXZlbHNbb10tPWUpfX0se2tleTpcImdldFRyZWVTaXplXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT0xZTksbz0tMWU5LG49MWU5LHM9LTFlOTtmb3IodmFyIHIgaW4gdGhpcy50cmVlcylpZih0aGlzLnRyZWVzLmhhc093blByb3BlcnR5KHIpJiZ0aGlzLnRyZWVzW3JdPT09ZSl7dmFyIGE9dFtyXTtpPU1hdGgubWluKGEueCxpKSxvPU1hdGgubWF4KGEueCxvKSxuPU1hdGgubWluKGEueSxuKSxzPU1hdGgubWF4KGEueSxzKX1yZXR1cm57bWluX3g6aSxtYXhfeDpvLG1pbl95Om4sbWF4X3k6c319fSx7a2V5OlwiaGFzU2FtZVBhcmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5wYXJlbnRSZWZlcmVuY2VbdC5pZF0sbz10aGlzLnBhcmVudFJlZmVyZW5jZVtlLmlkXTtpZih2b2lkIDA9PT1pfHx2b2lkIDA9PT1vKXJldHVybiExO2Zvcih2YXIgbj0wO248aS5sZW5ndGg7bisrKWZvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKWlmKGlbbl09PW9bc10pcmV0dXJuITA7cmV0dXJuITF9fSx7a2V5OlwiaW5TYW1lU3ViTmV0d29ya1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMudHJlZXNbdC5pZF09PT10aGlzLnRyZWVzW2UuaWRdfX0se2tleTpcImdldExldmVsc1wiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKDAsZC5kZWZhdWx0KSh0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nKX19LHtrZXk6XCJhZGRUb09yZGVyaW5nXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2b2lkIDA9PT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdJiYodGhpcy5kaXN0cmlidXRpb25PcmRlcmluZ1tlXT1bXSk7dmFyIGk9ITEsbz10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdO2Zvcih2YXIgbiBpbiBvKWlmKG9bbl09PT10KXtpPSEwO2JyZWFrfWl8fCh0aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdLnB1c2godCksdGhpcy5kaXN0cmlidXRpb25JbmRleFt0LmlkXT10aGlzLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW2VdLmxlbmd0aC0xKX19XSksdH0oKSxfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlKXsoMCx1LmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5pbml0aWFsUmFuZG9tU2VlZD1NYXRoLnJvdW5kKDFlNipNYXRoLnJhbmRvbSgpKSx0aGlzLnJhbmRvbVNlZWQ9dGhpcy5pbml0aWFsUmFuZG9tU2VlZCx0aGlzLnNldFBoeXNpY3M9ITEsdGhpcy5vcHRpb25zPXt9LHRoaXMub3B0aW9uc0JhY2t1cD17cGh5c2ljczp7fX0sdGhpcy5kZWZhdWx0T3B0aW9ucz17cmFuZG9tU2VlZDp2b2lkIDAsaW1wcm92ZWRMYXlvdXQ6ITAsaGllcmFyY2hpY2FsOntlbmFibGVkOiExLGxldmVsU2VwYXJhdGlvbjoxNTAsbm9kZVNwYWNpbmc6MTAwLHRyZWVTcGFjaW5nOjIwMCxibG9ja1NoaWZ0aW5nOiEwLGVkZ2VNaW5pbWl6YXRpb246ITAscGFyZW50Q2VudHJhbGl6YXRpb246ITAsZGlyZWN0aW9uOlwiVURcIixzb3J0TWV0aG9kOlwiaHVic2l6ZVwifX0sZi5leHRlbmQodGhpcy5vcHRpb25zLHRoaXMuZGVmYXVsdE9wdGlvbnMpLHRoaXMuYmluZEV2ZW50TGlzdGVuZXJzKCl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LFt7a2V5OlwiYmluZEV2ZW50TGlzdGVuZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuYm9keS5lbWl0dGVyLm9uKFwiX2RhdGFDaGFuZ2VkXCIsZnVuY3Rpb24oKXt0LnNldHVwSGllcmFyY2hpY2FsTGF5b3V0KCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9kYXRhTG9hZGVkXCIsZnVuY3Rpb24oKXt0LmxheW91dE5ldHdvcmsoKX0pLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3Jlc2V0SGllcmFyY2hpY2FsTGF5b3V0XCIsZnVuY3Rpb24oKXt0LnNldHVwSGllcmFyY2hpY2FsTGF5b3V0KCl9KSx0aGlzLmJvZHkuZW1pdHRlci5vbihcIl9hZGp1c3RFZGdlc0ZvckhpZXJhcmNoaWNhbExheW91dFwiLGZ1bmN0aW9uKCl7aWYoITA9PT10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpe3ZhciBlPXQuZGlyZWN0aW9uLmN1cnZlVHlwZSgpO3QuYm9keS5lbWl0dGVyLmVtaXQoXCJfZm9yY2VEaXNhYmxlRHluYW1pY0N1cnZlc1wiLGUsITEpfX0pfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMCE9PXQpe3ZhciBpPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwsbz1pLmVuYWJsZWQ7aWYoZi5zZWxlY3RpdmVEZWVwRXh0ZW5kKFtcInJhbmRvbVNlZWRcIixcImltcHJvdmVkTGF5b3V0XCJdLHRoaXMub3B0aW9ucyx0KSxmLm1lcmdlT3B0aW9ucyh0aGlzLm9wdGlvbnMsdCxcImhpZXJhcmNoaWNhbFwiKSx2b2lkIDAhPT10LnJhbmRvbVNlZWQmJih0aGlzLmluaXRpYWxSYW5kb21TZWVkPXQucmFuZG9tU2VlZCksITA9PT1pLmVuYWJsZWQpcmV0dXJuITA9PT1vJiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicmVmcmVzaFwiLCEwKSxcIlJMXCI9PT1pLmRpcmVjdGlvbnx8XCJEVVwiPT09aS5kaXJlY3Rpb24/aS5sZXZlbFNlcGFyYXRpb24+MCYmKGkubGV2ZWxTZXBhcmF0aW9uKj0tMSk6aS5sZXZlbFNlcGFyYXRpb248MCYmKGkubGV2ZWxTZXBhcmF0aW9uKj0tMSksdGhpcy5zZXREaXJlY3Rpb25TdHJhdGVneSgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVzZXRIaWVyYXJjaGljYWxMYXlvdXRcIiksdGhpcy5hZGFwdEFsbE9wdGlvbnNGb3JIaWVyYXJjaGljYWxMYXlvdXQoZSk7aWYoITA9PT1vKXJldHVybi
21167B0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwicmVmcmVzaFwiKSxmLmRlZXBFeHRlbmQoZSx0aGlzLm9wdGlvbnNCYWNrdXApfXJldHVybiBlfX0se2tleTpcImFkYXB0QWxsT3B0aW9uc0ZvckhpZXJhcmNoaWNhbExheW91dFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lbmFibGVkKXt2YXIgZT10aGlzLm9wdGlvbnNCYWNrdXAucGh5c2ljczt2b2lkIDA9PT10LnBoeXNpY3N8fCEwPT09dC5waHlzaWNzPyh0LnBoeXNpY3M9e2VuYWJsZWQ6dm9pZCAwPT09ZS5lbmFibGVkfHxlLmVuYWJsZWQsc29sdmVyOlwiaGllcmFyY2hpY2FsUmVwdWxzaW9uXCJ9LGUuZW5hYmxlZD12b2lkIDA9PT1lLmVuYWJsZWR8fGUuZW5hYmxlZCxlLnNvbHZlcj1lLnNvbHZlcnx8XCJiYXJuZXNIdXRcIik6XCJvYmplY3RcIj09PSgwLGEuZGVmYXVsdCkodC5waHlzaWNzKT8oZS5lbmFibGVkPXZvaWQgMD09PXQucGh5c2ljcy5lbmFibGVkfHx0LnBoeXNpY3MuZW5hYmxlZCxlLnNvbHZlcj10LnBoeXNpY3Muc29sdmVyfHxcImJhcm5lc0h1dFwiLHQucGh5c2ljcy5zb2x2ZXI9XCJoaWVyYXJjaGljYWxSZXB1bHNpb25cIik6ITEhPT10LnBoeXNpY3MmJihlLnNvbHZlcj1cImJhcm5lc0h1dFwiLHQucGh5c2ljcz17c29sdmVyOlwiaGllcmFyY2hpY2FsUmVwdWxzaW9uXCJ9KTt2YXIgaT10aGlzLmRpcmVjdGlvbi5jdXJ2ZVR5cGUoKTtpZih2b2lkIDA9PT10LmVkZ2VzKXRoaXMub3B0aW9uc0JhY2t1cC5lZGdlcz17c21vb3RoOntlbmFibGVkOiEwLHR5cGU6XCJkeW5hbWljXCJ9fSx0LmVkZ2VzPXtzbW9vdGg6ITF9O2Vsc2UgaWYodm9pZCAwPT09dC5lZGdlcy5zbW9vdGgpdGhpcy5vcHRpb25zQmFja3VwLmVkZ2VzPXtzbW9vdGg6e2VuYWJsZWQ6ITAsdHlwZTpcImR5bmFtaWNcIn19LHQuZWRnZXMuc21vb3RoPSExO2Vsc2UgaWYoXCJib29sZWFuXCI9PXR5cGVvZiB0LmVkZ2VzLnNtb290aCl0aGlzLm9wdGlvbnNCYWNrdXAuZWRnZXM9e3Ntb290aDp0LmVkZ2VzLnNtb290aH0sdC5lZGdlcy5zbW9vdGg9e2VuYWJsZWQ6dC5lZGdlcy5zbW9vdGgsdHlwZTppfTtlbHNle3ZhciBvPXQuZWRnZXMuc21vb3RoO3ZvaWQgMCE9PW8udHlwZSYmXCJkeW5hbWljXCIhPT1vLnR5cGUmJihpPW8udHlwZSksdGhpcy5vcHRpb25zQmFja3VwLmVkZ2VzPXtzbW9vdGg6dm9pZCAwPT09by5lbmFibGVkfHxvLmVuYWJsZWQsdHlwZTp2b2lkIDA9PT1vLnR5cGU/XCJkeW5hbWljXCI6by50eXBlLHJvdW5kbmVzczp2b2lkIDA9PT1vLnJvdW5kbmVzcz8uNTpvLnJvdW5kbmVzcyxmb3JjZURpcmVjdGlvbjp2b2lkIDAhPT1vLmZvcmNlRGlyZWN0aW9uJiZvLmZvcmNlRGlyZWN0aW9ufSx0LmVkZ2VzLnNtb290aD17ZW5hYmxlZDp2b2lkIDA9PT1vLmVuYWJsZWR8fG8uZW5hYmxlZCx0eXBlOmkscm91bmRuZXNzOnZvaWQgMD09PW8ucm91bmRuZXNzPy41Om8ucm91bmRuZXNzLGZvcmNlRGlyZWN0aW9uOnZvaWQgMCE9PW8uZm9yY2VEaXJlY3Rpb24mJm8uZm9yY2VEaXJlY3Rpb259fXRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfZm9yY2VEaXNhYmxlRHluYW1pY0N1cnZlc1wiLGkpfXJldHVybiB0fX0se2tleTpcInNlZWRlZFJhbmRvbVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9MWU0Kk1hdGguc2luKHRoaXMucmFuZG9tU2VlZCsrKTtyZXR1cm4gdC1NYXRoLmZsb29yKHQpfX0se2tleTpcInBvc2l0aW9uSW5pdGlhbGx5XCIsdmFsdWU6ZnVuY3Rpb24odCl7aWYoITAhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQpe3RoaXMucmFuZG9tU2VlZD10aGlzLmluaXRpYWxSYW5kb21TZWVkO2Zvcih2YXIgZT10Lmxlbmd0aCs1MCxpPTA7aTx0Lmxlbmd0aDtpKyspe3ZhciBvPXRbaV0sbj0yKk1hdGguUEkqdGhpcy5zZWVkZWRSYW5kb20oKTt2b2lkIDA9PT1vLngmJihvLng9ZSpNYXRoLmNvcyhuKSksdm9pZCAwPT09by55JiYoby55PWUqTWF0aC5zaW4obikpfX19fSx7a2V5OlwibGF5b3V0TmV0d29ya1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITAhPT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQmJiEwPT09dGhpcy5vcHRpb25zLmltcHJvdmVkTGF5b3V0KXtmb3IodmFyIHQ9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGU9MCxpPTA7aTx0Lmxlbmd0aDtpKyspeyEwPT09dGhpcy5ib2R5Lm5vZGVzW3RbaV1dLnByZWRlZmluZWRQb3NpdGlvbiYmKGUrPTEpfWlmKGU8LjUqdC5sZW5ndGgpe3ZhciBvPTAsbj17Y2x1c3Rlck5vZGVQcm9wZXJ0aWVzOntzaGFwZTpcImVsbGlwc2VcIixsYWJlbDpcIlwiLGdyb3VwOlwiXCIsZm9udDp7bXVsdGk6ITF9fSxjbHVzdGVyRWRnZVByb3BlcnRpZXM6e2xhYmVsOlwiXCIsZm9udDp7bXVsdGk6ITF9LHNtb290aDp7ZW5hYmxlZDohMX19fTtpZih0Lmxlbmd0aD4xNTApe2Zvcih2YXIgcz10Lmxlbmd0aDt0Lmxlbmd0aD4xNTAmJm88PTEwOyl7bys9MTt2YXIgcj10Lmxlbmd0aDtvJTM9PTA/dGhpcy5ib2R5Lm1vZHVsZXMuY2x1c3RlcmluZy5jbHVzdGVyQnJpZGdlcyhuKTp0aGlzLmJvZHkubW9kdWxlcy5jbHVzdGVyaW5nLmNsdXN0ZXJPdXRsaWVycyhuKTtpZihyPT10Lmxlbmd0aCYmbyUzIT0wKXJldHVybiB0aGlzLl9kZWNsdXN0ZXJBbGwoKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2xheW91dEZhaWxlZFwiKSx2b2lkIGNvbnNvbGUuaW5mbyhcIlRoaXMgbmV0d29yayBjb3VsZCBub3QgYmUgcG9zaXRpb25lZCBieSB0aGlzIHZlcnNpb24gb2YgdGhlIGltcHJvdmVkIGxheW91dCBhbGdvcml0aG0uIFBsZWFzZSBkaXNhYmxlIGltcHJvdmVkTGF5b3V0IGZvciBiZXR0ZXIgcGVyZm9ybWFuY2UuXCIpfXRoaXMuYm9keS5tb2R1bGVzLmthbWFkYUthd2FpLnNldE9wdGlvbnMoe3NwcmluZ0xlbmd0aDpNYXRoLm1heCgxNTAsMipzKX0pfW8+MTAmJmNvbnNvbGUuaW5mbyhcIlRoZSBjbHVzdGVyaW5nIGRpZG4ndCBzdWNjZWVkIHdpdGhpbiB0aGUgYW1vdW50IG9mIGludGVyYXRpb25zIGFsbG93ZWQsIHByb2dyZXNzaW5nIHdpdGggcGFydGlhbCByZXN1bHQuXCIpLHRoaXMuYm9keS5tb2R1bGVzLmthbWFkYUthd2FpLnNvbHZlKHQsdGhpcy5ib2R5LmVkZ2VJbmRpY2VzLCEwKSx0aGlzLl9zaGlmdFRvQ2VudGVyKCk7Zm9yKHZhciBhPTA7YTx0Lmxlbmd0aDthKyspe3ZhciBoPXRoaXMuYm9keS5ub2Rlc1t0W2FdXTshMT09PWgucHJlZGVmaW5lZFBvc2l0aW9uJiYoaC54Kz03MCooLjUtdGhpcy5zZWVkZWRSYW5kb20oKSksaC55Kz03MCooLjUtdGhpcy5zZWVkZWRSYW5kb20oKSkpfXRoaXMuX2RlY2x1c3RlckFsbCgpLHRoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVwb3NpdGlvbkJlemllck5vZGVzXCIpfX19fSx7a2V5OlwiX3NoaWZ0VG9DZW50ZXJcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD1tLmdldFJhbmdlQ29yZSh0aGlzLmJvZHkubm9kZXMsdGhpcy5ib2R5Lm5vZGVJbmRpY2VzKSxlPW0uZmluZENlbnRlcih0KSxpPTA7aTx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO2krKyl7dmFyIG89dGhpcy5ib2R5Lm5vZGVzW3RoaXMuYm9keS5ub2RlSW5kaWNlc1tpXV07by54LT1lLngsby55LT1lLnl9fX0se2tleTpcIl9kZWNsdXN0ZXJBbGxcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0hMDshMD09PXQ7KXt0PSExO2Zvcih2YXIgZT0wO2U8dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLmxlbmd0aDtlKyspITA9PT10aGlzLmJvZHkubm9kZXNbdGhpcy5ib2R5Lm5vZGVJbmRpY2VzW2VdXS5pc0NsdXN0ZXImJih0PSEwLHRoaXMuYm9keS5tb2R1bGVzLmNsdXN0ZXJpbmcub3BlbkNsdXN0ZXIodGhpcy5ib2R5Lm5vZGVJbmRpY2VzW2VdLHt9LCExKSk7ITA9PT10JiZ0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX2RhdGFDaGFuZ2VkXCIpfX19LHtrZXk6XCJnZXRTZWVkXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbml0aWFsUmFuZG9tU2VlZH19LHtrZXk6XCJzZXR1cEhpZXJhcmNoaWNhbExheW91dFwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITA9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmVuYWJsZWQmJnRoaXMuYm9keS5ub2RlSW5kaWNlcy5sZW5ndGg+MCl7dmFyIHQ9dm9pZCAwLGU9dm9pZCAwLGk9ITEsbz0hMTt0aGlzLmxhc3ROb2RlT25MZXZlbD17fSx0aGlzLmhpZXJhcmNoaWNhbD1uZXcgYjtmb3IoZSBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KGUpJiYodD10aGlzLmJvZHkubm9kZXNbZV0sdm9pZCAwIT09dC5vcHRpb25zLmxldmVsPyhpPSEwLHRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXT10Lm9wdGlvbnMubGV2ZWwpOm89ITApO2lmKCEwPT09byYmITA9PT1pKXRocm93IG5ldyBFcnJvcihcIlRvIHVzZSB0aGUgaGllcmFyY2hpY2FsIGxheW91dCwgbm9kZXMgcmVxdWlyZSBlaXRoZXIgbm8gcHJlZGVmaW5lZCBsZXZlbHMgb3IgbGV2ZWxzIGhhdmUgdG8gYmUgZGVmaW5lZCBmb3IgYWxsIG5vZGVzLlwiKTtpZighMD09PW8pe3ZhciBuPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuc29ydE1ldGhvZDtcImh1YnNpemVcIj09PW4/dGhpcy5fZGV0ZXJtaW5lTGV2ZWxzQnlIdWJzaXplKCk6XCJkaXJlY3RlZFwiPT09bj90aGlzLl9kZXRlcm1pbmVMZXZlbHNEaXJlY3RlZCgpOlwiY3VzdG9tXCI9PT1uJiZ0aGlzLl9kZXRlcm1pbmVMZXZlbHNDdXN0b21DYWxsYmFjaygpfWZvcih2YXIgcyBpbiB0aGlzLmJvZHkubm9kZXMpdGhpcy5ib2R5Lm5vZGVzLmhhc093blByb3BlcnR5KHMpJiZ0aGlzLmhpZXJhcmNoaWNhbC5lbnN1cmVMZXZlbChzKTt2YXIgcj10aGlzLl9nZXREaXN0cmlidXRpb24oKTt0aGlzLl9nZW5lcmF0ZU1hcCgpLHRoaXMuX3BsYWNlTm9kZXNCeUhpZXJhcmNoeShyKSx0aGlzLl9jb25kZW5zZUhpZXJhcmNoeSgpLHRoaXMuX3NoaWZ0VG9DZW50ZXIoKX19fSx7a2V5OlwiX2NvbmRlbnNlSGllcmFyY2h5XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9ITEsaT17fSxvPWZ1bmN0aW9uKGUsaSl7dmFyIG89dC5oaWVyYXJjaGljYWwudHJlZXM7Zm9yKHZhciBuIGluIG8pby5oYXNPd25Qcm9wZXJ0eShuKSYmb1tuXT09PWUmJnQuZGlyZWN0aW9uLnNoaWZ0KG4saSl9LG49ZnVuY3Rpb24oKXtmb3IodmFyIGU9W10saT0wO2k8dC5oaWVyYXJjaGljYWwubnVtVHJlZXMoKTtpKyspZS5wdXNoKHQuZGlyZWN0aW9uLmdldFRyZWVTaXplKGkpKTtyZXR1cm4gZX0scj1mdW5jdGlvbiBlKGksbyl7aWYoIW9baS5pZF0mJihvW2kuaWRdPSEwLHQuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW2kuaWRdKSl7dmFyIG49dC5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2VbaS5pZF07aWYobi5sZW5ndGg+MClmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyllKHQuYm9keS5ub2Rlc1tuW3NdXSxvKX19LGE9ZnVuY3Rpb24oZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4xJiZ2b2lkIDAhPT1hcmd1bWVudHNbMV0/YXJndW1lbnRzWzFdOjFlOSxvPTFlOSxuPTFlOSxyPTFlOSxhPS0xZTk7Zm9yKHZhciBoIGluIGUpaWYoZS5oYXNPd25Qcm9wZXJ0eShoKSl7dmFyIGQ9dC5ib2R5Lm5vZGVzW2hdLGw9dC5oaWVyYXJjaGljYWwubGV2ZWxzW2QuaWRdLHU9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oZCksYz10Ll9nZXRTcGFjZUFyb3VuZE5vZGUoZCxlKSxwPSgwLHMuZGVmYXVsdCkoYywyKSxmPXBbMF0sbT1wWzFdO289TWF0aC5taW4oZixvKSxuPU1hdGgubWluKG0sbiksbDw9aSYmKH
21167I9TWF0aC5taW4odSxyKSxhPU1hdGgubWF4KHUsYSkpfXJldHVybltyLGEsbyxuXX0saD1mdW5jdGlvbihlLGkpe3ZhciBvPXQuaGllcmFyY2hpY2FsLmdldE1heExldmVsKGUuaWQpLG49dC5oaWVyYXJjaGljYWwuZ2V0TWF4TGV2ZWwoaS5pZCk7cmV0dXJuIE1hdGgubWluKG8sbil9LGQ9ZnVuY3Rpb24oZSxpLG8pe2Zvcih2YXIgbj10LmhpZXJhcmNoaWNhbCxzPTA7czxpLmxlbmd0aDtzKyspe3ZhciByPWlbc10sYT1uLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW3JdO2lmKGEubGVuZ3RoPjEpZm9yKHZhciBoPTA7aDxhLmxlbmd0aC0xO2grKyl7dmFyIGQ9YVtoXSxsPWFbaCsxXTtuLmhhc1NhbWVQYXJlbnQoZCxsKSYmbi5pblNhbWVTdWJOZXR3b3JrKGQsbCkmJmUoZCxsLG8pfX19LGw9ZnVuY3Rpb24oaSxvKXt2YXIgbj1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLHM9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oaSksZD10LmRpcmVjdGlvbi5nZXRQb3NpdGlvbihvKSxsPU1hdGguYWJzKGQtcyksdT10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nO2lmKGw+dSl7dmFyIGM9e30scD17fTtyKGksYykscihvLHApO3ZhciBmPWgoaSxvKSxtPWEoYyxmKSx2PWEocCxmKSxnPW1bMV0seT12WzBdLGI9dlsyXTtpZihNYXRoLmFicyhnLXkpPnUpe3ZhciBfPWcteSt1O188LWIrdSYmKF89LWIrdSksXzwwJiYodC5fc2hpZnRCbG9jayhvLmlkLF8pLGU9ITAsITA9PT1uJiZ0Ll9jZW50ZXJQYXJlbnQobykpfX19LHU9ZnVuY3Rpb24obyxuKXtmb3IodmFyIGg9bi5pZCxkPW4uZWRnZXMsbD10LmhpZXJhcmNoaWNhbC5sZXZlbHNbbi5pZF0sdT10Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbip0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbixjPXt9LHA9W10sZj0wO2Y8ZC5sZW5ndGg7ZisrKXt2YXIgbT1kW2ZdO2lmKG0udG9JZCE9bS5mcm9tSWQpe3ZhciB2PW0udG9JZD09aD9tLmZyb206bS50bztjW2RbZl0uaWRdPXYsdC5oaWVyYXJjaGljYWwubGV2ZWxzW3YuaWRdPGwmJnAucHVzaChtKX19dmFyIGc9ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG89MCxuPTA7bjxpLmxlbmd0aDtuKyspaWYodm9pZCAwIT09Y1tpW25dLmlkXSl7dmFyIHM9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oY1tpW25dLmlkXSktZTtvKz1zL01hdGguc3FydChzKnMrdSl9cmV0dXJuIG99LHk9ZnVuY3Rpb24oZSxpKXtmb3IodmFyIG89MCxuPTA7bjxpLmxlbmd0aDtuKyspaWYodm9pZCAwIT09Y1tpW25dLmlkXSl7dmFyIHM9dC5kaXJlY3Rpb24uZ2V0UG9zaXRpb24oY1tpW25dLmlkXSktZTtvLT11Kk1hdGgucG93KHMqcyt1LC0xLjUpfXJldHVybiBvfSxiPWZ1bmN0aW9uKGUsaSl7Zm9yKHZhciBvPXQuZGlyZWN0aW9uLmdldFBvc2l0aW9uKG4pLHM9e30scj0wO3I8ZTtyKyspe3ZhciBhPWcobyxpKSxoPXkobyxpKTtpZihvLT1NYXRoLm1heCgtNDAsTWF0aC5taW4oNDAsTWF0aC5yb3VuZChhL2gpKSksdm9pZCAwIT09c1tvXSlicmVhaztzW29dPXJ9cmV0dXJuIG99LF89YihvLHApOyFmdW5jdGlvbihvKXt2YXIgcz10LmRpcmVjdGlvbi5nZXRQb3NpdGlvbihuKTtpZih2b2lkIDA9PT1pW24uaWRdKXt2YXIgaD17fTtyKG4saCksaVtuLmlkXT1ofXZhciBkPWEoaVtuLmlkXSksbD1kWzJdLHU9ZFszXSxjPW8tcyxwPTA7Yz4wP3A9TWF0aC5taW4oYyx1LXQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpOmM8MCYmKHA9LU1hdGgubWluKC1jLGwtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZykpLDAhPXAmJih0Ll9zaGlmdEJsb2NrKG4uaWQscCksZT0hMCl9KF8pLF89YihvLGQpLGZ1bmN0aW9uKGkpe3ZhciBvPXQuZGlyZWN0aW9uLmdldFBvc2l0aW9uKG4pLHI9dC5fZ2V0U3BhY2VBcm91bmROb2RlKG4pLGE9KDAscy5kZWZh
21167dWx0KShyLDIpLGg9YVswXSxkPWFbMV0sbD1pLW8sdT1vO2w+MD91PU1hdGgubWluKG8rKGQtdC5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyksaSk6bDwwJiYodT1NYXRoLm1heChvLShoLXQub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcpLGkpKSx1IT09byYmKHQuZGlyZWN0aW9uLnNldFBvc2l0aW9uKG4sdSksZT0hMCl9KF8pfTshMD09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuYmxvY2tTaGlmdGluZyYmKGZ1bmN0aW9uKGkpe3ZhciBvPXQuaGllcmFyY2hpY2FsLmdldExldmVscygpO289by5yZXZlcnNlKCk7Zm9yKHZhciBuPTA7bjxpJiYoZT0hMSxkKGwsbywhMCksITA9PT1lKTtuKyspO30oNSksZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdC5ib2R5Lm5vZGVzKXQuYm9keS5ub2Rlcy5oYXNPd25Qcm9wZXJ0eShlKSYmdC5fY2VudGVyUGFyZW50KHQuYm9keS5ub2Rlc1tlXSl9KCkpLCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5lZGdlTWluaW1pemF0aW9uJiZmdW5jdGlvbihpKXt2YXIgbz10LmhpZXJhcmNoaWNhbC5nZXRMZXZlbHMoKTtvPW8ucmV2ZXJzZSgpO2Zvcih2YXIgbj0wO248aTtuKyspe2U9ITE7Zm9yKHZhciBzPTA7czxvLmxlbmd0aDtzKyspZm9yKHZhciByPW9bc10sYT10LmhpZXJhcmNoaWNhbC5kaXN0cmlidXRpb25PcmRlcmluZ1tyXSxoPTA7aDxhLmxlbmd0aDtoKyspdSgxZTMsYVtoXSk7aWYoITAhPT1lKWJyZWFrfX0oMjApLCEwPT09dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5wYXJlbnRDZW50cmFsaXphdGlvbiYmZnVuY3Rpb24oKXt2YXIgZT10LmhpZXJhcmNoaWNhbC5nZXRMZXZlbHMoKTtlPWUucmV2ZXJzZSgpO2Zvcih2YXIgaT0wO2k8ZS5sZW5ndGg7aSsrKWZvcih2YXIgbz1lW2ldLG49dC5oaWVyYXJjaGljYWwuZGlzdHJpYnV0aW9uT3JkZXJpbmdbb10scz0wO3M8bi5sZW5ndGg7cysrKXQuX2NlbnRlclBhcmVudChuW3NdKX0oKSxmdW5jdGlvbigpe2Zvcih2YXIgZT1uKCksaT0wLHM9MDtzPGUubGVuZ3RoLTE7cysrKXtpKz1lW3NdLm1heC1lW3MrMV0ubWluK3Qub3B0aW9ucy5oaWVyYXJjaGljYWwudHJlZVNwYWNpbmcsbyhzKzEsaSl9fSgpfX0se2tleTpcIl9nZXRTcGFjZUFyb3VuZE5vZGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPSEwO3ZvaWQgMD09PWUmJihpPSExKTt2YXIgbz10aGlzLmhpZXJhcmNoaWNhbC5sZXZlbHNbdC5pZF07aWYodm9pZCAwIT09byl7dmFyIG49dGhpcy5oaWVyYXJjaGljYWwuZGlzdHJpYnV0aW9uSW5kZXhbdC5pZF0scz10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbih0KSxyPXRoaXMuaGllcmFyY2hpY2FsLmRpc3RyaWJ1dGlvbk9yZGVyaW5nW29dLGE9MWU5LGg9MWU5O2lmKDAhPT1uKXt2YXIgZD1yW24tMV07aWYoITA9PT1pJiZ2b2lkIDA9PT1lW2QuaWRdfHwhMT09PWkpe2E9cy10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihkKX19aWYobiE9ci5sZW5ndGgtMSl7dmFyIGw9cltuKzFdO2lmKCEwPT09aSYmdm9pZCAwPT09ZVtsLmlkXXx8ITE9PT1pKXt2YXIgdT10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihsKTtoPU1hdGgubWluKGgsdS1zKX19cmV0dXJuW2EsaF19cmV0dXJuWzAsMF19fSx7a2V5OlwiX2NlbnRlclBhcmVudFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHRoaXMuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVt0LmlkXSlmb3IodmFyIGU9dGhpcy5oaWVyYXJjaGljYWwucGFyZW50UmVmZXJlbmNlW3QuaWRdLGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXSxuPXRoaXMuYm9keS5ub2Rlc1tvXSxyPXRoaXMuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW29dO2lmKHZvaWQgMCE9PXIpe3ZhciBhPXRoaXMuX2dldENlbnRlclBvc2l0aW9uKHIpLGg9dGhpcy5kaXJlY3Rpb24uZ2V0UG9zaXRpb24obiksZD10aGlzLl9nZXRTcGFjZUFyb3VuZE5vZGUobiksbD0oMCxzLmRlZmF1bHQpKGQsMiksdT1sWzBdLGM9bFsxXSxwPWgtYTsocDwwJiZNYXRoLmFicyhwKTxjLXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmd8fHA+MCYmTWF0aC5hYnMocCk8dS10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nKSYmdGhpcy5kaXJlY3Rpb24uc2V0UG9zaXRpb24obixhKX19fX0se2tleTpcIl9wbGFjZU5vZGVzQnlIaWVyYXJjaHlcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLnBvc2l0aW9uZWROb2Rlcz17fTtmb3IodmFyIGUgaW4gdClpZih0Lmhhc093blByb3BlcnR5KGUpKXt2YXIgaT0oMCxkLmRlZmF1bHQpKHRbZV0pO2k9dGhpcy5faW5kZXhBcnJheVRvTm9kZXMoaSksdGhpcy5kaXJlY3Rpb24uc29ydChpKTtmb3IodmFyIG89MCxuPTA7bjxpLmxlbmd0aDtuKyspe3ZhciBzPWlbbl07aWYodm9pZCAwPT09dGhpcy5wb3NpdGlvbmVkTm9kZXNbcy5pZF0pe3ZhciByPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcsYT1yKm87bz4wJiYoYT10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihpW24tMV0pK3IpLHRoaXMuZGlyZWN0aW9uLnNldFBvc2l0aW9uKHMsYSxlKSx0aGlzLl92YWxpZGF0ZVBvc2l0aW9uQW5kQ29udGludWUocyxlLGEpLG8rK319fX19LHtrZXk6XCJfcGxhY2VCcmFuY2hOb2Rlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcy5oaWVyYXJjaGljYWwuY2hpbGRyZW5SZWZlcmVuY2VbdF07aWYodm9pZCAwIT09aSl7Zm9yKHZhciBvPVtdLG49MDtuPGkubGVuZ3RoO24rKylvLnB1c2godGhpcy5ib2R5Lm5vZGVzW2lbbl1dKTt0aGlzLmRpcmVjdGlvbi5zb3J0KG8pO2Zvcih2YXIgcz0wO3M8by5sZW5ndGg7cysrKXt2YXIgcj1vW3NdLGE9dGhpcy5oaWVyYXJjaGljYWwubGV2ZWxzW3IuaWRdO2lmKCEoYT5lJiZ2b2lkIDA9PT10aGlzLnBvc2l0aW9uZWROb2Rlc1tyLmlkXSkpcmV0dXJuO3ZhciBoPXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwubm9kZVNwYWNpbmcsZD12b2lkIDA7ZD0wPT09cz90aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbih0aGlzLmJvZHkubm9kZXNbdF0pOnRoaXMuZGlyZWN0aW9uLmdldFBvc2l0aW9uKG9bcy0xXSkraCx0aGlzLmRpcmVjdGlvbi5zZXRQb3NpdGlvbihyLGQsYSksdGhpcy5fdmFsaWRhdGVQb3NpdGlvbkFuZENvbnRpbnVlKHIsYSxkKX12YXIgbD10aGlzLl9nZXRDZW50ZXJQb3NpdGlvbihvKTt0aGlzLmRpcmVjdGlvbi5zZXRQb3NpdGlvbih0aGlzLmJvZHkubm9kZXNbdF0sbCxlKX19fSx7a2V5OlwiX3ZhbGlkYXRlUG9zaXRpb25BbmRDb250aW51ZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtp
21167Zih0aGlzLmhpZXJhcmNoaWNhbC5pc1RyZWUpe2lmKHZvaWQgMCE9PXRoaXMubGFzdE5vZGVPbkxldmVsW2VdKXt2YXIgbz10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbih0aGlzLmJvZHkubm9kZXNbdGhpcy5sYXN0Tm9kZU9uTGV2ZWxbZV1dKTtpZihpLW88dGhpcy5vcHRpb25zLmhpZXJhcmNoaWNhbC5ub2RlU3BhY2luZyl7dmFyIG49byt0aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLm5vZGVTcGFjaW5nLWkscz10aGlzLl9maW5kQ29tbW9uUGFyZW50KHRoaXMubGFzdE5vZGVPbkxldmVsW2VdLHQuaWQpO3RoaXMuX3NoaWZ0QmxvY2socy53aXRoQ2hpbGQsbil9fXRoaXMubGFzdE5vZGVPbkxldmVsW2VdPXQuaWQsdGhpcy5wb3NpdGlvbmVkTm9kZXNbdC5pZF09ITAsdGhpcy5fcGxhY2VCcmFuY2hOb2Rlcyh0LmlkLGUpfX19LHtrZXk6XCJfaW5kZXhBcnJheVRvTm9kZXNcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9W10saT0wO2k8dC5sZW5ndGg7aSsrKWUucHVzaCh0aGlzLmJvZHkubm9kZXNbdFtpXV0pO3JldHVybiBlfX0se2tleTpcIl9nZXREaXN0cmlidXRpb25cIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dm9pZCAwLGk9dm9pZCAwO2ZvcihlIGluIHRoaXMuYm9keS5ub2RlcylpZih0aGlzLmJvZHkubm9kZXMuaGFzT3duUHJvcGVydHkoZSkpe2k9dGhpcy5ib2R5Lm5vZGVzW2VdO3ZhciBvPXZvaWQgMD09PXRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXT8wOnRoaXMuaGllcmFyY2hpY2FsLmxldmVsc1tlXTt0aGlzLmRpcmVjdGlvbi5maXgoaSxvKSx2b2lkIDA9PT10W29dJiYodFtvXT17fSksdFtvXVtlXT1pfXJldHVybiB0fX0se2tleTpcIl9nZXRBY3RpdmVFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT1bXTtyZXR1cm4gZi5mb3JFYWNoKHQuZWRnZXMsZnVuY3Rpb24odCl7LTEhPT1lLmJvZHkuZWRnZUluZGljZXMuaW5kZXhPZih0LmlkKSYmaS5wdXNoKHQpfSksaX19LHtrZXk6XCJfZ2V0SHViU2l6ZXNcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT17fSxpPXRoaXMuYm9keS5ub2RlSW5kaWNlcztmLmZvckVhY2goaSxmdW5jdGlvbihpKXt2YXIgbz10LmJvZHkubm9kZXNbaV0sbj10Ll9nZXRBY3RpdmVFZGdlcyhvKS5sZW5ndGg7ZVtuXT0hMH0pO3ZhciBvPVtdO3JldHVybiBmLmZvckVhY2goZSxmdW5jdGlvbih0KXtvLnB1c2goTnVtYmVyKHQpKX0pLG8uc29ydChmdW5jdGlvbih0LGUpe3JldHVybiBlLXR9KSxvfX0se2tleTpcIl9kZXRlcm1pbmVMZXZlbHNCeUh1YnNpemVcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9ZnVuY3Rpb24oZSxpKXt0LmhpZXJhcmNoaWNhbC5sZXZlbERvd25zdHJlYW0oZSxpKX0saT10aGlzLl9nZXRIdWJTaXplcygpLG89MDtvPGkubGVuZ3RoOysrbyl7aWYoXCJicmVha1wiPT09ZnVuY3Rpb24obyl7dmFyIG49aVtvXTtpZigwPT09bilyZXR1cm5cImJyZWFrXCI7Zi5mb3JFYWNoKHQuYm9keS5ub2RlSW5kaWNlcyxmdW5jdGlvbihpKXt2YXIgbz10LmJvZHkubm9kZXNbaV07bj09PXQuX2dldEFjdGl2ZUVkZ2VzKG8pLmxlbmd0aCYmdC5fY3Jhd2xOZXR3b3JrKGUsaSl9KX0obykpYnJlYWt9fX0se2tleTpcIl9kZXRlcm1pbmVMZXZlbHNDdXN0b21DYWxsYmFja1wiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUsaSxvKXt2YXIgbj10LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF07dm9pZCAwPT09biYmKG49dC5oaWVyYXJjaGljYWwubGV2ZWxzW2UuaWRdPTFlNSk7dmFyIHM9KG0uY2xvbmVPcHRpb25zKGUsXCJub2RlXCIpLG0uY2xvbmVPcHRpb25zKGksXCJub2RlXCIpLHZvaWQgbS5jbG9uZU9wdGlvbnMobyxcImVkZ2VcIikpO3QuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT1uK3N9O3RoaXMuX2NyYXdsTmV0d29yayhlKSx0aGlzLmhpZXJhcmNoaWNhbC5zZXRNaW5MZXZlbFRvWmVybyh0aGlzLmJvZHkubm9kZXMpfX0se2tleTpcIl9kZXRlcm1pbmVMZXZlbHNEaXJlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPWZ1bmN0aW9uKGUpe3JldHVybiBmLmZvckVhY2godC5ib2R5LmVkZ2VzLGZ1bmN0aW9uKHQpe2lmKHQudG9JZD09PWUuZnJvbUlkJiZ0LmZyb21JZD09PWUudG9JZClyZXR1cm4hMH0pLCExfSxpPWZ1bmN0aW9uKGksbyxuKXt2YXIgcz10LmhpZXJhcmNoaWNhbC5sZXZlbHNbaS5pZF0scj10LmhpZXJhcmNoaWNhbC5sZXZlbHNbby5pZF07ZShuKSYmdm9pZCAwIT09cyYmdm9pZCAwIT09cnx8KHZvaWQgMD09PXMmJihzPXQuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT0xZTQpLG4udG9JZD09by5pZD90LmhpZXJhcmNoaWNhbC5sZXZlbHNbby5pZF09cysxOnQuaGllcmFyY2hpY2FsLmxldmVsc1tvLmlkXT1zLTEpfTt0aGlzLl9jcmF3bE5ldHdvcmsoaSksdGhpcy5oaWVyYXJjaGljYWwuc2V0TWluTGV2ZWxUb1plcm8odGhpcy5ib2R5Lm5vZGVzKX19LHtrZXk6XCJfZ2VuZXJhdGVNYXBcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1mdW5jdGlvbihlLGkpe3QuaGllcmFyY2hpY2FsLmxldmVsc1tpLmlkXT50LmhpZXJhcmNoaWNhbC5sZXZlbHNbZS5pZF0mJnQuaGllcmFyY2hpY2FsLmFkZFJlbGF0aW9uKGUuaWQsaS5pZCl9O3RoaXMuX2NyYXdsTmV0d29yayhlKSx0aGlzLmhpZXJhcmNoaWNhbC5jaGVja0lmVHJlZSgpfX0se2tleTpcIl9jcmF3bE5ldHdvcmtcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1hcmd1bWVudHMubGVuZ3RoPjAmJnZvaWQgMCE9PWFyZ3VtZW50c1swXT9hcmd1bWVudHNbMF06ZnVuY3Rpb24oKXt9LGk9YXJndW1lbnRzWzFdLG89e30sbj1mdW5jdGlvbiBpKG4scyl7aWYodm9pZCAwPT09b1tuLmlkXSl7dC5oaWVyYXJjaGljYWwuc2V0VHJlZUluZGV4KG4scyksb1tuLmlkXT0hMDtmb3IodmFyIHI9dm9pZCAwLGE9dC5fZ2V0QWN0aXZlRWRnZXMobiksaD0wO2g8YS5sZW5ndGg7aCsrKXt2YXIgZD1hW2hdOyEwPT09ZC5jb25uZWN0ZWQmJihyPWQudG9JZD09bi5pZD9kLmZyb206ZC50byxuLmlkIT1yLmlkJiYoZShuLHIsZCksaShyLHMpKSl9fX07aWYodm9pZCAwPT09aSlmb3IodmFyIHM9MCxyPTA7cjx0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoO3IrKyl7dmFyIGE9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzW3JdO2lmKHZvaWQgMD09PW9bYV0pe3ZhciBoPXRoaXMuYm9keS5ub2Rlc1thXTtuKGgscykscys9MX19ZWxzZXt2YXIgZD10aGlzLmJvZHkubm9kZXNbaV07aWYodm9pZCAwPT09ZClyZXR1cm4gdm9pZCBjb25zb2xlLmVycm9yKFwiTm9kZSBub3QgZm91bmQ6XCIsaSk7bihkKX19fSx7a2V5OlwiX3NoaWZ0QmxvY2tcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPXRoaXMsbz17fTshZnVuY3Rpb24gdChuKXtpZighb1tuXSl7b1tuXT0hMCxpLmRpcmVjdGlvbi5zaGlmdChuLGUpO3ZhciBzPWkuaGllcmFyY2hpY2FsLmNoaWxkcmVuUmVmZXJlbmNlW25dO2lmKHZvaWQgMCE9PXMpZm9yKHZhciByPTA7cjxzLmxlbmd0aDtyKyspdChzW3JdKX19KHQpfX0se2tleTpcIl9maW5kQ29tbW9uUGFyZW50XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89e307cmV0dXJuIGZ1bmN0aW9uIHQoZSxvKXt2YXIgbj1pLmhpZXJhcmNoaWNhbC5wYXJlbnRSZWZlcmVuY2Vbb107aWYodm9pZCAwIT09bilmb3IodmFyIHM9MDtzPG4ubGVuZ3RoO3MrKyl7dmFyIHI9bltzXTtlW3JdPSEwLHQoZSxyKX19KG8sdCksZnVuY3Rpb24gdChlLG8pe3ZhciBuPWkuaGllcmFyY2hpY2FsLnBhcmVudFJlZmVyZW5jZVtvXTtpZih2b2lkIDAhPT1uKWZvcih2YXIgcz0wO3M8bi5sZW5ndGg7cysrKXt2YXIgcj1uW3NdO2lmKHZvaWQgMCE9PWVbcl0pcmV0dXJue2ZvdW5kUGFyZW50OnIsd2l0aENoaWxkOm99O3ZhciBhPXQoZSxyKTtpZihudWxsIT09YS5mb3VuZFBhcmVudClyZXR1cm4gYX1yZXR1cm57Zm91bmRQYXJlbnQ6bnVsbCx3aXRoQ2hpbGQ6b319KG8sZSl9fSx7a2V5Olwic2V0RGlyZWN0aW9uU3RyYXRlZ3lcIix2YWx1ZTpmdW5jdGlvbigpe3ZhciB0PVwiVURcIj09PXRoaXMub3B0aW9ucy5oaWVyYXJjaGljYWwuZGlyZWN0aW9ufHxcIkRVXCI9PT10aGlzLm9wdGlvbnMuaGllcmFyY2hpY2FsLmRpcmVjdGlvbjt0aGlzLmRpcmVjdGlvbj10P25ldyB5KHRoaXMpOm5ldyBnKHRoaXMpfX0se2tleTpcIl9nZXRDZW50ZXJQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xZTksaT0tMWU5LG89MDtvPHQubGVuZ3RoO28rKyl7dmFyIG49dm9pZCAwO2lmKHZvaWQgMCE9PXRbb10uaWQpbj10W29dO2Vsc2V7dmFyIHM9dFtvXTtuPXRoaXMuYm9keS5ub2Rlc1tzXX12YXIgcj10aGlzLmRpcmVjdGlvbi5nZXRQb3NpdGlvbihuKTtlPU1hdGgubWluKGUsciksaT1NYXRoLm1heChpLHIpfXJldHVybi41KihlK2kpfX1dKSx0fSgpO2UuZGVmYXVsdD1ffSxmdW5jdGlvbih0LGUsaSl7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdCYmdC5fX2VzTW9kdWxlP3Q6e2RlZmF1bHQ6dH19T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsXCJfX2VzTW9kdWxlXCIse3ZhbHVlOiEwfSks
21167ZS5WZXJ0aWNhbFN0cmF0ZWd5PWUuSG9yaXpvbnRhbFN0cmF0ZWd5PXZvaWQgMDt2YXIgbj1pKDMpLHM9byhuKSxyPWkoNCksYT1vKHIpLGg9aSg1KSxkPW8oaCksbD1pKDApLHU9byhsKSxjPWkoMSkscD1vKGMpLGY9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAsdS5kZWZhdWx0KSh0aGlzLHQpfXJldHVybigwLHAuZGVmYXVsdCkodCxbe2tleTpcImFic3RyYWN0XCIsdmFsdWU6ZnVuY3Rpb24oKXt0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBpbnN0YW50aWF0ZSBhYnN0cmFjdCBjbGFzcyFcIil9fSx7a2V5OlwiZmFrZV91c2VcIix2YWx1ZTpmdW5jdGlvbigpe319LHtrZXk6XCJjdXJ2ZVR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFic3RyYWN0KCl9fSx7a2V5OlwiZ2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5mYWtlX3VzZSh0KSx0aGlzLmFic3RyYWN0KCl9fSx7a2V5Olwic2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg+MiYmdm9pZCAwIT09YXJndW1lbnRzWzJdP2FyZ3VtZW50c1syXTp2b2lkIDA7dGhpcy5mYWtlX3VzZSh0LGUsaSksdGhpcy5hYnN0cmFjdCgpfX0se2tleTpcImdldFRyZWVTaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmFrZV91c2UodCksdGhpcy5hYnN0cmFjdCgpfX0se2tleTpcInNvcnRcIix2YWx1ZTpmdW5jdGlvbih0KXt0aGlzLmZha2VfdXNlKHQpLHRoaXMuYWJzdHJhY3QoKX19LHtrZXk6XCJmaXhcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmFrZV91c2UodCxlKSx0aGlzLmFic3RyYWN0KCl9fSx7a2V5Olwic2hpZnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmFrZV91c2UodCxlKSx0aGlzLmFic3RyYWN0KCl9fV0pLHR9KCksbT1mdW5jdGlvbih0KXtmdW5jdGlvbiBlKHQpeygwLHUuZGVmYXVsdCkodGhpcyxlKTt2YXIgaT0oMCxhLmRlZmF1bHQpKHRoaXMsKGUuX19wcm90b19ffHwoMCxzLmRlZmF1bHQpKGUpKS5jYWxsKHRoaXMpKTtyZXR1cm4gaS5sYXlvdXQ9dCxpfXJldHVybigwLGQuZGVmYXVsdCkoZSx0KSwoMCxwLmRlZmF1bHQpKGUsW3trZXk6XCJjdXJ2ZVR5cGVcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVyblwiaG9yaXpvbnRhbFwifX0se2tleTpcImdldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7cmV0dXJuIHQueH19LHtrZXk6XCJzZXRQb3NpdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9YXJndW1lbnRzLmxlbmd0aD4yJiZ2b2lkIDAhPT1hcmd1bWVudHNbMl0/YXJndW1lbnRzWzJdOnZvaWQgMDt2b2lkIDAhPT1pJiZ0aGlzLmxheW91dC5oaWVyYXJjaGljYWwuYWRkVG9PcmRlcmluZyh0LGkpLHQueD1lfX0se2tleTpcImdldFRyZWVTaXplXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5sYXlvdXQuaGllcmFyY2hpY2FsLmdldFRyZWVTaXplKHRoaXMubGF5b3V0LmJvZHkubm9kZXMsdCk7cmV0dXJue21pbjplLm1pbl94LG1heDplLm1heF94fX19LHtrZXk6XCJzb3J0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PXQueHx8dm9pZCAwPT09ZS54PzA6dC54LWUueH0pfX0se2tleTpcImZpeFwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dC55PXRoaXMubGF5b3V0Lm9wdGlvbnMuaGllcmFyY2hpY2FsLmxldmVsU2VwYXJhdGlvbiplLHQub3B0aW9ucy5maXhlZC55PSEwfX0se2tleTpcInNoaWZ0XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0aGlzLmxheW91dC5ib2R5Lm5vZGVzW3RdLngrPWV9fV0pLGV9KGYpLHY9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSh0KXsoMCx1LmRlZmF1bHQpKHRoaXMsZSk7dmFyIGk9KDAsYS5kZWZhdWx0KSh0aGlzLChlLl9fcHJvdG9fX3x8KDAscy5kZWZh
21167dWx0KShlKSkuY2FsbCh0aGlzKSk7cmV0dXJuIGkubGF5b3V0PXQsaX1yZXR1cm4oMCxkLmRlZmF1bHQpKGUsdCksKDAscC5kZWZhdWx0KShlLFt7a2V5OlwiY3VydmVUeXBlXCIsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5cInZlcnRpY2FsXCJ9fSx7a2V5OlwiZ2V0UG9zaXRpb25cIix2YWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdC55fX0se2tleTpcInNldFBvc2l0aW9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXT9hcmd1bWVudHNbMl06dm9pZCAwO3ZvaWQgMCE9PWkmJnRoaXMubGF5b3V0LmhpZXJhcmNoaWNhbC5hZGRUb09yZGVyaW5nKHQsaSksdC55PWV9fSx7a2V5OlwiZ2V0VHJlZVNpemVcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxheW91dC5oaWVyYXJjaGljYWwuZ2V0VHJlZVNpemUodGhpcy5sYXlvdXQuYm9keS5ub2Rlcyx0KTtyZXR1cm57bWluOmUubWluX3ksbWF4OmUubWF4X3l9fX0se2tleTpcInNvcnRcIix2YWx1ZTpmdW5jdGlvbih0KXt0LnNvcnQoZnVuY3Rpb24odCxlKXtyZXR1cm4gdm9pZCAwPT09dC55fHx2b2lkIDA9PT1lLnk/MDp0LnktZS55fSl9fSx7a2V5OlwiZml4XCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt0Lng9dGhpcy5sYXlvdXQub3B0aW9ucy5oaWVyYXJjaGljYWwubGV2ZWxTZXBhcmF0aW9uKmUsdC5vcHRpb25zLmZpeGVkLng9ITB9fSx7a2V5Olwic2hpZnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMubGF5b3V0LmJvZHkubm9kZXNbdF0ueSs9ZX19XSksZX0oZik7ZS5Ib3Jpem9udGFsU3RyYXRlZ3k9dixlLlZlcnRpY2FsU3RyYXRlZ3k9bX0sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoOCkscz1vKG4pLHI9aSgxOSksYT1vKHIpLGg9aSg2KSxkPW8oaCksbD1pKDApLHU9byhsKSxjPWkoMSkscD1vKGMpLGY9aSgyKSxtPWkoMTApLHY9aSgzNyksZz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoZSxpLG8pe3ZhciBuPXRoaXM7KDAsdS5kZWZhdWx0KSh0aGlzLHQpLHRoaXMuYm9keT1lLHRoaXMuY2FudmFzPWksdGhpcy5zZWxlY3Rpb25IYW5kbGVyPW8sdGhpcy5lZGl0TW9kZT0hMSx0aGlzLm1hbmlwdWxhdGlvbkRpdj12b2lkIDAsdGhpcy5lZGl0TW9kZURpdj12b2lkIDAsdGhpcy5jbG9zZURpdj12b2lkIDAsdGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzPVtdLHRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnM9e30sdGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9ucz1bXSx0aGlzLnRvdWNoVGltZT0wLHRoaXMudGVtcG9yYXJ5SWRzPXtub2RlczpbXSxlZGdlczpbXX0sdGhpcy5ndWlFbmFibGVkPSExLHRoaXMuaW5Nb2RlPSExLHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT12b2lkIDAsdGhpcy5vcHRpb25zPXt9LHRoaXMuZGVmYXVsdE9wdGlvbnM9e2VuYWJsZWQ6ITEsaW5pdGlhbGx5QWN0aXZlOiExLGFkZE5vZGU6ITAsYWRkRWRnZTohMCxlZGl0Tm9kZTp2b2lkIDAsZWRpdEVkZ2U6ITAsZGVsZXRlTm9kZTohMCxkZWxldGVFZGdlOiEwLGNvbnRyb2xOb2RlU3R5bGU6e3NoYXBlOlwiZG90XCIsc2l6ZTo2LGNvbG9yOntiYWNrZ3JvdW5kOlwiI2ZmMDAwMFwiLGJvcmRlcjpcIiMzYzNjM2NcIixoaWdobGlnaHQ6e2JhY2tncm91bmQ6XCIjMDdmOTY4XCIsYm9yZGVyOlwiIzNjM2MzY1wifX0sYm9yZGVyV2lkdGg6Mixib3JkZXJXaWR0aFNlbGVjdGVkOjJ9fSxmLmV4dGVuZCh0aGlzLm9wdGlvbnMsdGhpcy5kZWZhdWx0T3B0aW9ucyksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJkZXN0cm95XCIsZnVuY3Rpb24oKXtuLl9jbGVhbigpfSksdGhpcy5ib2R5LmVtaXR0ZXIub24oXCJfZGF0YUNoYW5nZWRcIix0aGlzLl9yZXN0b3JlLmJpbmQodGhpcykpLHRoaXMuYm9keS5lbWl0dGVyLm9uKFwiX3Jlc2V0RGF0YVwiLHRoaXMuX3Jlc3RvcmUuYmluZCh0aGlzKSl9cmV0dXJuKDAscC5kZWZhdWx0KSh0LFt7a2V5OlwiX3Jlc3RvcmVcIix2YWx1ZTpmdW5jdGlvbigpeyExIT09dGhpcy5pbk1vZGUmJighMD09PXRoaXMub3B0aW9ucy5pbml0aWFsbHlBY3RpdmU/dGhpcy5lbmFibGVFZGl0TW9kZSgpOnRoaXMuZGlzYWJsZUVkaXRNb2RlKCkpfX0se2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0LGUsaSl7dm9pZCAwIT09ZSYmKHZvaWQgMCE9PWUubG9jYWxlP3RoaXMub3B0aW9ucy5sb2NhbGU9ZS5sb2NhbGU6dGhpcy5vcHRpb25zLmxvY2FsZT1pLmxvY2FsZSx2b2lkIDAhPT1lLmxvY2FsZXM/dGhpcy5vcHRpb25zLmxvY2FsZXM9ZS5sb2NhbGVzOnRoaXMub3B0aW9ucy5sb2NhbGVzPWkubG9jYWxlcyksdm9pZCAwIT09dCYmKFwiYm9vbGVhblwiPT10eXBlb2YgdD90aGlzLm9wdGlvbnMuZW5hYmxlZD10Oih0aGlzLm9wdGlvbnMuZW5hYmxlZD0hMCxmLmRlZXBFeHRlbmQodGhpcy5vcHRpb25zLHQpKSwhMD09PXRoaXMub3B0aW9ucy5pbml0aWFsbHlBY3RpdmUmJih0aGlzLmVkaXRNb2RlPSEwKSx0aGlzLl9zZXR1cCgpKX19LHtrZXk6XCJ0b2dnbGVFZGl0TW9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLmVkaXRNb2RlP3RoaXMuZGlzYWJsZUVkaXRNb2RlKCk6dGhpcy5lbmFibGVFZGl0TW9kZSgpfX0se2tleTpcImVuYWJsZUVkaXRNb2RlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRNb2RlPSEwLHRoaXMuX2NsZWFuKCksITA9PT10aGlzLmd1aUVuYWJsZWQmJih0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuZWRpdE1vZGVEaXYuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9fSx7a2V5OlwiZGlzYWJsZUVkaXRNb2RlXCIsdmFsdWU6ZnVuY3Rpb24oKXt0aGlzLmVkaXRNb2RlPSExLHRoaXMuX2NsZWFuKCksITA9PT10aGlzLmd1aUVuYWJsZWQmJih0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHRoaXMuY2xvc2VEaXYuc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0aGlzLmVkaXRNb2RlRGl2LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiLHRoaXMuX2NyZWF0ZUVkaXRCdXR0b24oKSl9fSx7a2V5Olwic2hvd01hbmlwdWxhdG9yVG9vbGJhclwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYodGhpcy5fY2xlYW4oKSx0aGlzLm1hbmlwdWxhdGlvbkRPTT17fSwhMD09PXRoaXMuZ3VpRW5hYmxlZCl7dGhpcy5lZGl0TW9kZT0hMCx0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9XCJibG9ja1wiO3ZhciB0PXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWROb2RlQ291bnQoKSxlPXR
21167oaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWRFZGdlQ291bnQoKSxpPXQrZSxvPXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLG49ITE7ITEhPT10aGlzLm9wdGlvbnMuYWRkTm9kZSYmKHRoaXMuX2NyZWF0ZUFkZE5vZGVCdXR0b24obyksbj0hMCksITEhPT10aGlzLm9wdGlvbnMuYWRkRWRnZSYmKCEwPT09bj90aGlzLl9jcmVhdGVTZXBlcmF0b3IoMSk6bj0hMCx0aGlzLl9jcmVhdGVBZGRFZGdlQnV0dG9uKG8pKSwxPT09dCYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmVkaXROb2RlPyghMD09PW4/dGhpcy5fY3JlYXRlU2VwZXJhdG9yKDIpOm49ITAsdGhpcy5fY3JlYXRlRWRpdE5vZGVCdXR0b24obykpOjE9PT1lJiYwPT09dCYmITEhPT10aGlzLm9wdGlvbnMuZWRpdEVkZ2UmJighMD09PW4/dGhpcy5fY3JlYXRlU2VwZXJhdG9yKDMpOm49ITAsdGhpcy5fY3JlYXRlRWRpdEVkZ2VCdXR0b24obykpLDAhPT1pJiYodD4wJiYhMSE9PXRoaXMub3B0aW9ucy5kZWxldGVOb2RlPyghMD09PW4mJnRoaXMuX2NyZWF0ZVNlcGVyYXRvcig0KSx0aGlzLl9jcmVhdGVEZWxldGVCdXR0b24obykpOjA9PT10JiYhMSE9PXRoaXMub3B0aW9ucy5kZWxldGVFZGdlJiYoITA9PT1uJiZ0aGlzLl9jcmVhdGVTZXBlcmF0b3IoNCksdGhpcy5fY3JlYXRlRGVsZXRlQnV0dG9uKG8pKSksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kRXZlbnQoXCJzZWxlY3RcIix0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIuYmluZCh0aGlzKSl9dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9fSx7a2V5OlwiYWRkTm9kZU1vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCksdGhpcy5pbk1vZGU9XCJhZGROb2RlXCIsITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24odCksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24odC5hZGREZXNjcmlwdGlvbnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uYWRkRGVzY3JpcHRpb24pLHRoaXMuX2JpbmRIYW1tZXJUb0Rpdih0aGlzLmNsb3NlRGl2LHRoaXMudG9nZ2xlRWRpdE1vZGUuYmluZCh0aGlzKSl9dGhpcy5fdGVtcG9yYXJ5QmluZEV2ZW50KFwiY2xpY2tcIix0aGlzLl9wZXJmb3JtQWRkTm9kZS5iaW5kKHRoaXMpKX19LHtrZXk6XCJlZGl0Tm9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczshMCE9PXRoaXMuZWRpdE1vZGUmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpO3ZhciBlPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fZ2V0U2VsZWN0ZWROb2RlKCk7aWYodm9pZCAwIT09ZSl7aWYodGhpcy5pbk1vZGU9XCJlZGl0Tm9kZVwiLFwiZnVuY3Rpb25cIiE9dHlwZW9mIHRoaXMub3B0aW9ucy5lZGl0Tm9kZSl0aHJvdyBuZXcgRXJyb3IoXCJObyBmdW5jdGlvbiBoYXMgYmVlbiBjb25maWd1cmVkIHRvIGhhbmRsZSB0aGUgZWRpdGluZyBvZiBub2Rlcy5cIik7aWYoITAhPT1lLmlzQ2x1c3Rlcil7dmFyIGk9Zi5kZWVwRXh0ZW5kKHt9LGUub3B0aW9ucywhMSk7aWYoaS54PWUueCxpLnk9ZS55LDIhPT10aGlzLm9wdGlvbnMuZWRpdE5vZGUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihcIlRoZSBmdW5jdGlvbiBmb3IgZWRpdCBkb2VzIG5vdCBzdXBwb3J0IHR3byBhcmd1bWVudHMgKGRhdGEsIGNhbGxiYWNrKVwiKTt0aGlzLm9wdGlvbnMuZWRpdE5vZGUoaSxmdW5jdGlvbihlKXtudWxsIT09ZSYmdm9pZCAwIT09ZSYmXCJlZGl0Tm9kZVwiPT09dC5pbk1vZGUmJnQuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS51cGRhdGUoZSksdC5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9KX1lbHNlIGFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmVkaXRDbHVzdGVyRXJyb3J8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXRDbHVzdGVyRXJyb3IpfWVsc2UgdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OlwiYWRkRWRnZU1vZGVcIix2YWx1ZTpmdW5jdGlvbigpe2lmKCEwIT09dGhpcy5lZGl0TW9kZSYmdGhpcy5lbmFibGVFZGl0TW9kZSgpLHRoaXMuX2NsZWFuKCksdGhpcy5pbk1vZGU9XCJhZGRFZGdlXCIsITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciB0PXRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24odCksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24odC5lZGdlRGVzY3JpcHRpb258fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkZ2VEZXNjcmlwdGlvbiksdGhpcy5fYmluZEhhbW1lclRvRGl2KHRoaXMuY2xvc2VEaXYsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX10aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvblRvdWNoXCIsdGhpcy5faGFuZGxlQ29ubmVjdC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbkRyYWdFbmRcIix0aGlzLl9maW5pc2hDb25uZWN0LmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ1wiLHRoaXMuX2RyYWdDb250cm9sTm9kZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvblJlbGVhc2VcIix0aGlzLl9maW5pc2hDb25uZWN0LmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ1N0YXJ0XCIsdGhpcy5fZHJhZ1N0YXJ0RWRnZS5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbkhvbGRcIixmdW5jdGlvbigpe30pfX0se2tleTpcImVkaXRFZGdlTW9kZVwiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoITAhPT10aGlzLmVkaXRNb2RlJiZ0aGlzLmVuYWJsZUVkaXRNb2RlKCksdGhpcy5fY2xlYW4oKSx0aGlzLmluTW9kZT1cImVkaXRFZGdlXCIsXCJvYmplY3RcIj09PSgwLGQuZGVmYXVsdCkodGhpcy5vcHRpb25zLmVkaXRFZGdlKSYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmVkaXRFZGdlLmVkaXRXaXRob3V0RHJhZyYmKHRoaXMuZWRnZUJlaW5nRWRpdGVkSWQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMoKVswXSx2b2lkIDAhPT10aGlzLmVkZ2VCZWluZ0VkaXRlZElkKSl7dmFyIHQ9dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdO3JldHVybiB2b2lkIHRoaXMuX3BlcmZvcm1FZGl0RWRnZSh0LmZyb20sdC50byl9aWYoITA9PT10aGlzLmd1aUVuYWJsZWQpe3ZhciBlPXR
21167oaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdO3RoaXMubWFuaXB1bGF0aW9uRE9NPXt9LHRoaXMuX2NyZWF0ZUJhY2tCdXR0b24oZSksdGhpcy5fY3JlYXRlU2VwZXJhdG9yKCksdGhpcy5fY3JlYXRlRGVzY3JpcHRpb24oZS5lZGl0RWRnZURlc2NyaXB0aW9ufHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0RWRnZURlc2NyaXB0aW9uKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYodGhpcy5jbG9zZURpdix0aGlzLnRvZ2dsZUVkaXRNb2RlLmJpbmQodGhpcykpfWlmKHRoaXMuZWRnZUJlaW5nRWRpdGVkSWQ9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkRWRnZXMoKVswXSx2b2lkIDAhPT10aGlzLmVkZ2VCZWluZ0VkaXRlZElkKXt2YXIgaT10aGlzLmJvZHkuZWRnZXNbdGhpcy5lZGdlQmVpbmdFZGl0ZWRJZF0sbz10aGlzLl9nZXROZXdUYXJnZXROb2RlKGkuZnJvbS54LGkuZnJvbS55KSxuPXRoaXMuX2dldE5ld1RhcmdldE5vZGUoaS50by54LGkudG8ueSk7dGhpcy50ZW1wb3JhcnlJZHMubm9kZXMucHVzaChvLmlkKSx0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5wdXNoKG4uaWQpLHRoaXMuYm9keS5ub2Rlc1tvLmlkXT1vLHRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKG8uaWQpLHRoaXMuYm9keS5ub2Rlc1tuLmlkXT1uLHRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKG4uaWQpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uVG91Y2hcIix0aGlzLl9jb250cm9sTm9kZVRvdWNoLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uVGFwXCIsZnVuY3Rpb24oKXt9KSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbkhvbGRcIixmdW5jdGlvbigpe30pLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ1N0YXJ0XCIsdGhpcy5fY29udHJvbE5vZGVEcmFnU3RhcnQuYmluZCh0aGlzKSksdGhpcy5fdGVtcG9yYXJ5QmluZFVJKFwib25EcmFnXCIsdGhpcy5fY29udHJvbE5vZGVEcmFnLmJpbmQodGhpcykpLHRoaXMuX3RlbXBvcmFyeUJpbmRVSShcIm9uRHJhZ0VuZFwiLHRoaXMuX2NvbnRyb2xOb2RlRHJhZ0VuZC5iaW5kKHRoaXMpKSx0aGlzLl90ZW1wb3JhcnlCaW5kVUkoXCJvbk1vdXNlTW92ZVwiLGZ1bmN0aW9uKCl7fSksdGhpcy5fdGVtcG9yYXJ5QmluZEV2ZW50KFwiYmVmb3JlRHJhd2luZ1wiLGZ1bmN0aW9uKHQpe3ZhciBlPWkuZWRnZVR5cGUuZmluZEJvcmRlclBvc2l0aW9ucyh0KTshMT09PW8uc2VsZWN0ZWQmJihvLng9ZS5mcm9tLngsby55PWUuZnJvbS55KSwhMT09PW4uc2VsZWN0ZWQmJihuLng9ZS50by54LG4ueT1lLnRvLnkpfSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9ZWxzZSB0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19LHtrZXk6XCJkZWxldGVTZWxlY3RlZFwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczshMCE9PXRoaXMuZWRpdE1vZGUmJnRoaXMuZW5hYmxlRWRpdE1vZGUoKSx0aGlzLl9jbGVhbigpLHRoaXMuaW5Nb2RlPVwiZGVsZXRlXCI7dmFyIGU9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLmdldFNlbGVjdGVkTm9kZXMoKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5nZXRTZWxlY3RlZEVkZ2VzKCksbz12b2lkIDA7aWYoZS5sZW5ndGg+MCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoITA9PT10aGlzLmJvZHkubm9kZXNbZVtuXV0uaXNDbHVzdGVyKXJldHVybiB2b2lkIGFsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmRlbGV0ZUNsdXN0ZXJFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZGVsZXRlQ2x1c3RlckVycm9yKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuZGVsZXRlTm9kZSYmKG89dGhpcy5vcHRpb25zLmRlbGV0ZU5vZGUpfWVsc2UgaS5sZW5ndGg+MCYmXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmRlbGV0ZUVkZ2UmJihvPXRoaXMub3B0aW9ucy5kZWxldGVFZGdlKTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiBvKXt2YXIgcz17bm9kZXM6ZSxlZGdlczppfVxuICAgIDtpZigyIT09by5sZW5ndGgpdGhyb3cgbmV3IEVycm9yKFwiVGhlIGZ1bmN0aW9uIGZvciBkZWxldGUgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaylcIik7byhzLGZ1bmN0aW9uKGUpe251bGwhPT1lJiZ2b2lkIDAhPT1lJiZcImRlbGV0ZVwiPT09dC5pbk1vZGU/KHQuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5yZW1vdmUoZS5lZGdlcyksdC5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLnJlbW92ZShlLm5vZGVzKSx0LmJvZHkuZW1pdHRlci5lbWl0KFwic3RhcnRTaW11bGF0aW9uXCIpLHQuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKToodC5ib2R5LmVtaXR0ZXIuZW1pdChcInN0YXJ0U2ltdWxhdGlvblwiKSx0LnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5yZW1vdmUoaSksdGhpcy5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLnJlbW92ZShlKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwic3RhcnRTaW11bGF0aW9uXCIpLHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpfX0se2tleTpcIl9zZXR1cFwiLHZhbHVlOmZ1bmN0aW9uKCl7ITA9PT10aGlzLm9wdGlvbnMuZW5hYmxlZD8odGhpcy5ndWlFbmFibGVkPSEwLHRoaXMuX2NyZWF0ZVdyYXBwZXJzKCksITE9PT10aGlzLmVkaXRNb2RlP3RoaXMuX2NyZWF0ZUVkaXRCdXR0b24oKTp0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSk6KHRoaXMuX3JlbW92ZU1hbmlwdWxhdGlvbkRPTSgpLHRoaXMuZ3VpRW5hYmxlZD0hMSl9fSx7a2V5OlwiX2NyZWF0ZVdyYXBwZXJzXCIsdmFsdWU6ZnVuY3Rpb24oKXt2b2lkIDA9PT10aGlzLm1hbmlwdWxhdGlvbkRpdiYmKHRoaXMubWFuaXB1bGF0aW9uRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5tYW5pcHVsYXRpb25EaXYuY2xhc3NOYW1lPVwidmlzLW1hbmlwdWxhdGlvblwiLCEwPT09dGhpcy5lZGl0TW9kZT90aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwiYmxvY2tcIjp0aGlzLm1hbmlwdWxhdGlvbkRpdi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiLHRoaXMuY2FudmFzLmZyYW1lLmFwcGVuZENoaWxkKHRoaXMubWFuaXB1bGF0aW9uRGl2KSksdm9pZCAwPT09dGhpcy5lZGl0TW9kZURpdiYmKHR
21167oaXMuZWRpdE1vZGVEaXY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLmVkaXRNb2RlRGl2LmNsYXNzTmFtZT1cInZpcy1lZGl0LW1vZGVcIiwhMD09PXRoaXMuZWRpdE1vZGU/dGhpcy5lZGl0TW9kZURpdi5zdHlsZS5kaXNwbGF5PVwibm9uZVwiOnRoaXMuZWRpdE1vZGVEaXYuc3R5bGUuZGlzcGxheT1cImJsb2NrXCIsdGhpcy5jYW52YXMuZnJhbWUuYXBwZW5kQ2hpbGQodGhpcy5lZGl0TW9kZURpdikpLHZvaWQgMD09PXRoaXMuY2xvc2VEaXYmJih0aGlzLmNsb3NlRGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5jbG9zZURpdi5jbGFzc05hbWU9XCJ2aXMtY2xvc2VcIix0aGlzLmNsb3NlRGl2LnN0eWxlLmRpc3BsYXk9dGhpcy5tYW5pcHVsYXRpb25EaXYuc3R5bGUuZGlzcGxheSx0aGlzLmNhbnZhcy5mcmFtZS5hcHBlbmRDaGlsZCh0aGlzLmNsb3NlRGl2KSl9fSx7a2V5OlwiX2dldE5ld1RhcmdldE5vZGVcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPWYuZGVlcEV4dGVuZCh7fSx0aGlzLm9wdGlvbnMuY29udHJvbE5vZGVTdHlsZSk7aS5pZD1cInRhcmdldE5vZGVcIitmLnJhbmRvbVVVSUQoKSxpLmhpZGRlbj0hMSxpLnBoeXNpY3M9ITEsaS54PXQsaS55PWU7dmFyIG89dGhpcy5ib2R5LmZ1bmN0aW9ucy5jcmVhdGVOb2RlKGkpO3JldHVybiBvLnNoYXBlLmJvdW5kaW5nQm94PXtsZWZ0OnQscmlnaHQ6dCx0b3A6ZSxib3R0b206ZX0sb319LHtrZXk6XCJfY3JlYXRlRWRpdEJ1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYW4oKSx0aGlzLm1hbmlwdWxhdGlvbkRPTT17fSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLmVkaXRNb2RlRGl2KTt2YXIgdD10aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXSxlPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImVkaXRNb2RlXCIsXCJ2aXMtYnV0dG9uIHZpcy1lZGl0IHZpcy1lZGl0LW1vZGVcIix0LmVkaXR8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmVkaXQpO3RoaXMuZWRpdE1vZGVEaXYuYXBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy50b2dnbGVFZGl0TW9kZS5iaW5kKHRoaXMpKX19LHtrZXk6XCJfY2xlYW5cIix2YWx1ZTpmdW5jdGlvbigpe3RoaXMuaW5Nb2RlPSExLCEwPT09dGhpcy5ndWlFbmFibGVkJiYoZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5lZGl0TW9kZURpdiksZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5tYW5pcHVsYXRpb25EaXYpLHRoaXMuX2NsZWFuTWFuaXB1bGF0b3JIYW1tZXJzKCkpLHRoaXMuX2NsZWFudXBUZW1wb3JhcnlOb2Rlc0FuZEVkZ2VzKCksdGhpcy5fdW5iaW5kVGVtcG9yYXJ5VUlzKCksdGhpcy5fdW5iaW5kVGVtcG9yYXJ5RXZlbnRzKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJlc3RvcmVQaHlzaWNzXCIpfX0se2tleTpcIl9jbGVhbk1hbmlwdWxhdG9ySGFtbWVyc1wiLHZhbHVlOmZ1bmN0aW9uKCl7aWYoMCE9dGhpcy5tYW5pcHVsYXRpb25IYW1tZXJzLmxlbmd0aCl7Zm9yKHZhciB0PTA7dDx0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnMubGVuZ3RoO3QrKyl0aGlzLm1hbmlwdWxhdGlvbkhhbW1lcnNbdF0uZGVzdHJveSgpO3RoaXMubWFuaXB1bGF0aW9uSGFtbWVycz1bXX19fSx7a2V5OlwiX3JlbW92ZU1hbmlwdWxhdGlvbkRPTVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5fY2xlYW4oKSxmLnJlY3Vyc2l2ZURPTURlbGV0ZSh0aGlzLm1hbmlwdWxhdGlvbkRpdiksZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5lZGl0TW9kZURpdiksZi5yZWN1cnNpdmVET01EZWxldGUodGhpcy5jbG9zZURpdiksdGhpcy5tYW5pcHVsYXRpb25EaXYmJnRoaXMuY2FudmFzLmZyYW1lLnJlbW92ZUNoaWxkKHRoaXMubWFuaXB1bGF0aW9uRGl2KSx0aGlzLmVkaXRNb2RlRGl2JiZ0aGlzLmNhbnZhcy5mcmFtZS5yZW1vdmVDaGlsZCh0aGlzLmVkaXRNb2RlRGl2KSx0aGlzLmNsb3NlRGl2JiZ0aGlzLmNhbnZhcy5mcmFtZS5yZW1vdmVDaGlsZCh0aGlzLmNsb3NlRGl2KSx0aGlzLm1hbmlwdWxhdGlvbkRpdj12b2lkIDAsdGhpcy5lZGl0TW9kZURpdj12b2lkIDAsdGhpcy5jbG9zZURpdj12b2lkIDB9fSx7a2V5OlwiX2NyZWF0ZVNlcGVyYXRvclwiLHZhbHVlOmZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aD4wJiZ2b2lkIDAhPT1hcmd1bWVudHNbMF0/YXJndW1lbnRzWzBdOjE7dGhpcy5tYW5pcHVsYXRpb25ET01bXCJzZXBlcmF0b3JMaW5lRGl2XCIrdF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVtcInNlcGVyYXRvckxpbmVEaXZcIit0XS5jbGFzc05hbWU9XCJ2aXMtc2VwYXJhdG9yLWxpbmVcIix0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZCh0aGlzLm1hbmlwdWxhdGlvbkRPTVtcInNlcGVyYXRvckxpbmVEaXZcIit0XSl9fSx7a2V5OlwiX2NyZWF0ZUFkZE5vZGVCdXR0b25cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCdXR0b24oXCJhZGROb2RlXCIsXCJ2aXMtYnV0dG9uIHZpcy1hZGRcIix0LmFkZE5vZGV8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmFkZE5vZGUpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuYWRkTm9kZU1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2NyZWF0ZUFkZEVkZ2VCdXR0b25cIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jcmVhdGVCdXR0b24oXCJhZGRFZGdlXCIsXCJ2aXMtYnV0dG9uIHZpcy1jb25uZWN0XCIsdC5hZGRFZGdlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5hZGRFZGdlKTt0aGlzLm1hbmlwdWxhdGlvbkRpdi5hcHBlbmRDaGlsZChlKSx0aGlzLl9iaW5kSGFtbWVyVG9EaXYoZSx0aGlzLmFkZEVkZ2VNb2RlLmJpbmQodGhpcykpfX0se2tleTpcIl9jcmVhdGVFZGl0Tm9kZUJ1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImVkaXROb2RlXCIsXCJ2aXMtYnV0dG9uIHZpcy1lZGl0XCIsdC5lZGl0Tm9kZXx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uZWRpdE5vZGUpO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuZWRpdE5vZGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2NyZWF0ZUVkaXRFZGdlQnV0dG9uXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY3JlYXRlQnV0dG9uKFwiZWRpdEVkZ2VcIixcInZpcy1idXR0b24gdmlzLWVkaXRcIix0LmVkaXRFZGdlfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5lZGl0RWRnZSk7dGhpcy5tYW5pcHVsYXRpb25EaXYuY
21167XBwZW5kQ2hpbGQoZSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGUsdGhpcy5lZGl0RWRnZU1vZGUuYmluZCh0aGlzKSl9fSx7a2V5OlwiX2NyZWF0ZURlbGV0ZUJ1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlO2U9dGhpcy5vcHRpb25zLnJ0bD9cInZpcy1idXR0b24gdmlzLWRlbGV0ZS1ydGxcIjpcInZpcy1idXR0b24gdmlzLWRlbGV0ZVwiO3ZhciBpPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImRlbGV0ZVwiLGUsdC5kZWx8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmRlbCk7dGhpcy5tYW5pcHVsYXRpb25EaXYuYXBwZW5kQ2hpbGQoaSksdGhpcy5fYmluZEhhbW1lclRvRGl2KGksdGhpcy5kZWxldGVTZWxlY3RlZC5iaW5kKHRoaXMpKX19LHtrZXk6XCJfY3JlYXRlQmFja0J1dHRvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NyZWF0ZUJ1dHRvbihcImJhY2tcIixcInZpcy1idXR0b24gdmlzLWJhY2tcIix0LmJhY2t8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmJhY2spO3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKGUpLHRoaXMuX2JpbmRIYW1tZXJUb0RpdihlLHRoaXMuc2hvd01hbmlwdWxhdG9yVG9vbGJhci5iaW5kKHRoaXMpKX19LHtrZXk6XCJfY3JlYXRlQnV0dG9uXCIsdmFsdWU6ZnVuY3Rpb24odCxlLGkpe3ZhciBvPWFyZ3VtZW50cy5sZW5ndGg+MyYmdm9pZCAwIT09YXJndW1lbnRzWzNdP2FyZ3VtZW50c1szXTpcInZpcy1sYWJlbFwiO3JldHVybiB0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiRGl2XCJdPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksdGhpcy5tYW5pcHVsYXRpb25ET01bdCtcIkRpdlwiXS5jbGFzc05hbWU9ZSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiTGFiZWxcIl09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiTGFiZWxcIl0uY2xhc3NOYW1lPW8sdGhpcy5tYW5pcHVsYXRpb25ET01bdCtcIkxhYmVsXCJdLmlubmVySFRNTD1pLHRoaXMubWFuaXB1bGF0aW9uRE9NW3QrXCJEaXZcIl0uYXBwZW5kQ2hpbGQodGhpcy5tYW5pcHVsYXRpb25ET01bdCtcIkxhYmVsXCJdKSx0aGlzLm1hbmlwdWxhdGlvbkRPTVt0K1wiRGl2XCJdfX0se2tleTpcIl9jcmVhdGVEZXNjcmlwdGlvblwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMubWFuaXB1bGF0aW9uRGl2LmFwcGVuZENoaWxkKHRoaXMuX2NyZWF0ZUJ1dHRvbihcImRlc2NyaXB0aW9uXCIsXCJ2aXMtYnV0dG9uIHZpcy1ub25lXCIsdCkpfX0se2tleTpcIl90ZW1wb3JhcnlCaW5kRXZlbnRcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3RoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnMucHVzaCh7ZXZlbnQ6dCxib3VuZEZ1bmN0aW9uOmV9KSx0aGlzLmJvZHkuZW1pdHRlci5vbih0LGUpfX0se2tleTpcIl90ZW1wb3JhcnlCaW5kVUlcIix2YWx1ZTpmdW5jdGlvbih0LGUpe2lmKHZvaWQgMD09PXRoaXMuYm9keS5ldmVudExpc3RlbmVyc1t0XSl0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIFVJIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0LiBUeXBvPyBZb3UgdHJpZWQ6IFwiK3QrXCIgcG9zc2libGUgYXJlOiBcIisoMCxhLmRlZmF1bHQpKCgwLHMuZGVmYXVsdCkodGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzKSkpO3RoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnNbdF09dGhpcy5ib2R5LmV2ZW50TGlzdGVuZXJzW3RdLHRoaXMuYm9keS5ldmVudExpc3RlbmVyc1t0XT1lfX0se2tleTpcIl91bmJpbmRUZW1wb3JhcnlVSXNcIix2YWx1ZTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzLnRlbXBvcmFyeVVJRnVuY3Rpb25zKXRoaXMudGVtcG9yYXJ5VUlGdW5jdGlvbnMuaGFzT3duUHJvcGVydHkodCkmJih0aGlzLmJvZHkuZXZlbnRMaXN0ZW5lcnNbdF09dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSxkZWxldGUgdGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9uc1t0XSk7dGhpcy50ZW1wb3JhcnlVSUZ1bmN0aW9ucz17fX19LHtrZXk6XCJfdW5iaW5kVGVtcG9yYXJ5RXZlbnRzXCIsdmFsdWU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9MDt0PHRoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnMubGVuZ3RoO3QrKyl7dmFyIGU9dGhpcy50ZW1wb3JhcnlFdmVudEZ1bmN0aW9uc1t0XS5ldmVudCxpPXRoaXMudGVtcG9yYXJ5RXZlbnRGdW5jdGlvbnNbdF0uYm91bmRGdW5jdGlvbjt0aGlzLmJvZHkuZW1pdHRlci5vZmYoZSxpKX10aGlzLnRlbXBvcmFyeUV2ZW50RnVuY3Rpb25zPVtdfX0se2tleTpcIl9iaW5kSGFtbWVyVG9EaXZcIix2YWx1ZTpmdW5jdGlvbih0LGUpe3ZhciBpPW5ldyBtKHQse30pO3Yub25Ub3VjaChpLGUpLHRoaXMubWFuaXB1bGF0aW9uSGFtbWVycy5wdXNoKGkpfX0se2tleTpcIl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlc1wiLHZhbHVlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PTA7dDx0aGlzLnRlbXBvcmFyeUlkcy5lZGdlcy5sZW5ndGg7dCsrKXt0aGlzLmJvZHkuZWRnZXNbdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbdF1dLmRpc2Nvbm5lY3QoKSxkZWxldGUgdGhpcy5ib2R5LmVkZ2VzW3RoaXMudGVtcG9yYXJ5SWRzLmVkZ2VzW3RdXTt2YXIgZT10aGlzLmJvZHkuZWRnZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1t0XSk7LTEhPT1lJiZ0aGlzLmJvZHkuZWRnZUluZGljZXMuc3BsaWNlKGUsMSl9Zm9yKHZhciBpPTA7aTx0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5sZW5ndGg7aSsrKXtkZWxldGUgdGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzW2ldXTt2YXIgbz10aGlzLmJvZHkubm9kZUluZGljZXMuaW5kZXhPZih0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1tpXSk7LTEhPT1vJiZ0aGlzLmJvZHkubm9kZUluZGljZXMuc3BsaWNlKG8sMSl9dGhpcy50ZW1wb3JhcnlJZHM9e25vZGVzOltdLGVkZ2VzOltdfX19LHtrZXk6XCJfY29udHJvbE5vZGVUb3VjaFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbCgpLHRoaXMubGFzdFRvdWNoPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksdGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb249Zi5leHRlbmQoe30sdGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb24pfX0se2tleTpcIl9jb250cm9sTm9kZURyYWdTdGFydFwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXR
21167oaXMubGFzdFRvdWNoLGk9dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9wb2ludGVyVG9Qb3NpdGlvbk9iamVjdChlKSxvPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1swXV0sbj10aGlzLmJvZHkubm9kZXNbdGhpcy50ZW1wb3JhcnlJZHMubm9kZXNbMV1dLHM9dGhpcy5ib2R5LmVkZ2VzW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdO3RoaXMuc2VsZWN0ZWRDb250cm9sTm9kZT12b2lkIDA7dmFyIHI9by5pc092ZXJsYXBwaW5nV2l0aChpKSxhPW4uaXNPdmVybGFwcGluZ1dpdGgoaSk7ITA9PT1yPyh0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGU9byxzLmVkZ2VUeXBlLmZyb209byk6ITA9PT1hJiYodGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlPW4scy5lZGdlVHlwZS50bz1uKSx2b2lkIDAhPT10aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUmJnRoaXMuc2VsZWN0aW9uSGFuZGxlci5zZWxlY3RPYmplY3QodGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlKSx0aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlZHJhd1wiKX19LHtrZXk6XCJfY29udHJvbE5vZGVEcmFnXCIsdmFsdWU6ZnVuY3Rpb24odCl7dGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcImRpc2FibGVQaHlzaWNzXCIpO3ZhciBlPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlciksaT10aGlzLmNhbnZhcy5ET010b0NhbnZhcyhlKTtpZih2b2lkIDAhPT10aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUpdGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlLng9aS54LHRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZS55PWkueTtlbHNle3ZhciBvPWUueC10aGlzLmxhc3RUb3VjaC54LG49ZS55LXRoaXMubGFzdFRvdWNoLnk7dGhpcy5ib2R5LnZpZXcudHJhbnNsYXRpb249e3g6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueCtvLHk6dGhpcy5sYXN0VG91Y2gudHJhbnNsYXRpb24ueStufX10aGlzLmJvZHkuZW1pdHRlci5lbWl0KFwiX3JlZHJhd1wiKX19LHtrZXk6XCJfY29udHJvbE5vZGVEcmFnRW5kXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QoZSksbz10aGlzLmJvZHkuZWRnZXNbdGhpcy5lZGdlQmVpbmdFZGl0ZWRJZF07aWYodm9pZCAwIT09dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlKXt0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKTtmb3IodmFyIG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKSxzPXZvaWQgMCxyPW4ubGVuZ3RoLTE7cj49MDtyLS0paWYobltyXSE9PXRoaXMuc2VsZWN0ZWRDb250cm9sTm9kZS5pZCl7cz10aGlzLmJvZHkubm9kZXNbbltyXV07YnJlYWt9aWYodm9pZCAwIT09cyYmdm9pZCAwIT09dGhpcy5zZWxlY3RlZENvbnRyb2xOb2RlKWlmKCEwPT09cy5pc0NsdXN0ZXIpYWxlcnQodGhpcy5vcHRpb25zLmxvY2FsZXNbdGhpcy5vcHRpb25zLmxvY2FsZV0uY3JlYXRlRWRnZUVycm9yfHx0aGlzLm9wdGlvbnMubG9jYWxlcy5lbi5jcmVhdGVFZGdlRXJyb3IpO2Vsc2V7dmFyIGE9dGhpcy5ib2R5Lm5vZGVzW3RoaXMudGVtcG9yYXJ5SWRzLm5vZGVzWzBdXTt0aGlzLnNlbGVjdGVkQ29udHJvbE5vZGUuaWQ9PT1hLmlkP3RoaXMuX3BlcmZvcm1FZGl0RWRnZShzLmlkLG8udG8uaWQpOnRoaXMuX3BlcmZvcm1FZGl0RWRnZShvLmZyb20uaWQscy5pZCl9ZWxzZSBvLnVwZGF0ZUVkZ2VUeXBlKCksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcInJlc3RvcmVQaHlzaWNzXCIpO3RoaXMuYm9keS5lbWl0dGVyLmVtaXQoXCJfcmVkcmF3XCIpfX19LHtrZXk6XCJfaGFuZGxlQ29ubmVjdFwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKChuZXcgRGF0ZSkudmFsdWVPZigpLXRoaXMudG91Y2hUaW1lPjEwMCl7dGhpcy5sYXN0VG91Y2g9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSx0aGlzLmxhc3RUb3VjaC50cmFuc2xhdGlvbj1mLmV4dGVuZCh7fSx0aGlzLmJvZHkudmlldy50cmFuc2xhdGlvbik7dmFyIGU9dGhpcy5sYXN0VG91Y2gsaT10aGlzLnNlbGVjdGlvbkhhbmRsZXIuZ2V0Tm9kZUF0KGUpO2lmKHZvaWQgMCE9PWkpaWYoITA9PT1pLmlzQ2x1c3RlcilhbGVydCh0aGlzLm9wdGlvbnMubG9jYWxlc1t0aGlzLm9wdGlvbnMubG9jYWxlXS5jcmVhdGVFZGdlRXJyb3J8fHRoaXMub3B0aW9ucy5sb2NhbGVzLmVuLmNyZWF0ZUVkZ2VFcnJvcik7ZWxzZXt2YXIgbz10aGlzLl9nZXROZXdUYXJnZXROb2RlKGkueCxpLnkpO3RoaXMuYm9keS5ub2Rlc1tvLmlkXT1vLHRoaXMuYm9keS5ub2RlSW5kaWNlcy5wdXNoKG8uaWQpO3ZhciBuPXRoaXMuYm9keS5mdW5jdGlvbnMuY3JlYXRlRWRnZSh7aWQ6XCJjb25uZWN0aW9uRWRnZVwiK2YucmFuZG9tVVVJRCgpLGZyb206aS5pZCx0bzpvLmlkLHBoeXNpY3M6ITEsc21vb3RoOntlbmFibGVkOiEwLHR5cGU6XCJjb250aW51b3VzXCIscm91bmRuZXNzOi41fX0pO3RoaXMuYm9keS5lZGdlc1tuLmlkXT1uLHRoaXMuYm9keS5lZGdlSW5kaWNlcy5wdXNoKG4uaWQpLHRoaXMudGVtcG9yYXJ5SWRzLm5vZGVzLnB1c2goby5pZCksdGhpcy50ZW1wb3JhcnlJZHMuZWRnZXMucHVzaChuLmlkKX10aGlzLnRvdWNoVGltZT0obmV3IERhdGUpLnZhbHVlT2YoKX19fSx7a2V5OlwiX2RyYWdDb250cm9sTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuYm9keS5mdW5jdGlvbnMuZ2V0UG9pbnRlcih0LmNlbnRlcik7aWYodm9pZCAwIT09dGhpcy50ZW1wb3JhcnlJZHMubm9kZXNbMF0pe3ZhciBpPXRoaXMuYm9keS5ub2Rlc1t0aGlzLnRlbXBvcmFyeUlkcy5ub2Rlc1swXV07aS54PXRoaXMuY2FudmFzLl9YY29udmVydERPTXRvQ2FudmFzKGUueCksaS55PXRoaXMuY2FudmFzLl9ZY29udmVydERPTXRvQ2FudmFzKGUueSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9ZWxzZXt2YXIgbz1lLngtdGhpcy5sYXN0VG91Y2gue
21167CxuPWUueS10aGlzLmxhc3RUb3VjaC55O3RoaXMuYm9keS52aWV3LnRyYW5zbGF0aW9uPXt4OnRoaXMubGFzdFRvdWNoLnRyYW5zbGF0aW9uLngrbyx5OnRoaXMubGFzdFRvdWNoLnRyYW5zbGF0aW9uLnkrbn19fX0se2tleTpcIl9maW5pc2hDb25uZWN0XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5LmZ1bmN0aW9ucy5nZXRQb2ludGVyKHQuY2VudGVyKSxpPXRoaXMuc2VsZWN0aW9uSGFuZGxlci5fcG9pbnRlclRvUG9zaXRpb25PYmplY3QoZSksbz12b2lkIDA7dm9pZCAwIT09dGhpcy50ZW1wb3JhcnlJZHMuZWRnZXNbMF0mJihvPXRoaXMuYm9keS5lZGdlc1t0aGlzLnRlbXBvcmFyeUlkcy5lZGdlc1swXV0uZnJvbUlkKTtmb3IodmFyIG49dGhpcy5zZWxlY3Rpb25IYW5kbGVyLl9nZXRBbGxOb2Rlc092ZXJsYXBwaW5nV2l0aChpKSxzPXZvaWQgMCxyPW4ubGVuZ3RoLTE7cj49MDtyLS0paWYoLTE9PT10aGlzLnRlbXBvcmFyeUlkcy5ub2Rlcy5pbmRleE9mKG5bcl0pKXtzPXRoaXMuYm9keS5ub2Rlc1tuW3JdXTticmVha310aGlzLl9jbGVhbnVwVGVtcG9yYXJ5Tm9kZXNBbmRFZGdlcygpLHZvaWQgMCE9PXMmJighMD09PXMuaXNDbHVzdGVyP2FsZXJ0KHRoaXMub3B0aW9ucy5sb2NhbGVzW3RoaXMub3B0aW9ucy5sb2NhbGVdLmNyZWF0ZUVkZ2VFcnJvcnx8dGhpcy5vcHRpb25zLmxvY2FsZXMuZW4uY3JlYXRlRWRnZUVycm9yKTp2b2lkIDAhPT10aGlzLmJvZHkubm9kZXNbb10mJnZvaWQgMCE9PXRoaXMuYm9keS5ub2Rlc1tzLmlkXSYmdGhpcy5fcGVyZm9ybUFkZEVkZ2UobyxzLmlkKSksdGhpcy5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIil9fSx7a2V5OlwiX2RyYWdTdGFydEVkZ2VcIix2YWx1ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmxhc3RUb3VjaDt0aGlzLnNlbGVjdGlvbkhhbmRsZXIuX2dlbmVyYXRlQ2xpY2tFdmVudChcImRyYWdTdGFydFwiLHQsZSx2b2lkIDAsITApfX0se2tleTpcIl9wZXJmb3JtQWRkTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsaT17aWQ6Zi5yYW5kb21VVUlEKCkseDp0LnBvaW50ZXIuY2FudmFzLngseTp0LnBvaW50ZXIuY2FudmFzLnksbGFiZWw6XCJuZXdcIn07aWYoXCJmdW5jdGlvblwiPT10eXBlb2YgdGhpcy5vcHRpb25zLmFkZE5vZGUpe2lmKDIhPT10aGlzLm9wdGlvbnMuYWRkTm9kZS5sZW5ndGgpdGhyb3cgdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCksbmV3IEVycm9yKFwiVGhlIGZ1bmN0aW9uIGZvciBhZGQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLGNhbGxiYWNrKVwiKTt0aGlzLm9wdGlvbnMuYWRkTm9kZShpLGZ1bmN0aW9uKHQpe251bGwhPT10JiZ2b2lkIDAhPT10JiZcImFkZE5vZGVcIj09PWUuaW5Nb2RlJiYoZS5ib2R5LmRhdGEubm9kZXMuZ2V0RGF0YVNldCgpLmFkZCh0KSxlLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLm5vZGVzLmdldERhdGFTZXQoKS5hZGQoaSksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OlwiX3BlcmZvcm1BZGRFZGdlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLG89e2Zyb206dCx0bzplfTtpZihcImZ1bmN0aW9uXCI9PXR5cGVvZiB0aGlzLm9wdGlvbnMuYWRkRWRnZSl7aWYoMiE9PXRoaXMub3B0aW9ucy5hZGRFZGdlLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZnVuY3Rpb24gZm9yIGNvbm5lY3QgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLGNhbGxiYWNrKVwiKTt0aGlzLm9wdGlvbnMuYWRkRWRnZShvLGZ1bmN0aW9uKHQpe251bGwhPT10JiZ2b2lkIDAhPT10JiZcImFkZEVkZ2VcIj09PWkuaW5Nb2RlJiYoaS5ib2R5LmR
21167hdGEuZWRnZXMuZ2V0RGF0YVNldCgpLmFkZCh0KSxpLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSxpLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKSl9KX1lbHNlIHRoaXMuYm9keS5kYXRhLmVkZ2VzLmdldERhdGFTZXQoKS5hZGQobyksdGhpcy5zZWxlY3Rpb25IYW5kbGVyLnVuc2VsZWN0QWxsKCksdGhpcy5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCl9fSx7a2V5OlwiX3BlcmZvcm1FZGl0RWRnZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSl7dmFyIGk9dGhpcyxvPXtpZDp0aGlzLmVkZ2VCZWluZ0VkaXRlZElkLGZyb206dCx0bzplLGxhYmVsOnRoaXMuYm9keS5kYXRhLmVkZ2VzLl9kYXRhW3RoaXMuZWRnZUJlaW5nRWRpdGVkSWRdLmxhYmVsfSxuPXRoaXMub3B0aW9ucy5lZGl0RWRnZTtpZihcIm9iamVjdFwiPT09KHZvaWQgMD09PW4/XCJ1bmRlZmluZWRcIjooMCxkLmRlZmF1bHQpKG4pKSYmKG49bi5lZGl0V2l0aG91dERyYWcpLFwiZnVuY3Rpb25cIj09dHlwZW9mIG4pe2lmKDIhPT1uLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoXCJUaGUgZnVuY3Rpb24gZm9yIGVkaXQgZG9lcyBub3Qgc3VwcG9ydCB0d28gYXJndW1lbnRzIChkYXRhLCBjYWxsYmFjaylcIik7bihvLGZ1bmN0aW9uKHQpe251bGw9PT10fHx2b2lkIDA9PT10fHxcImVkaXRFZGdlXCIhPT1pLmluTW9kZT8oaS5ib2R5LmVkZ2VzW28uaWRdLnVwZGF0ZUVkZ2VUeXBlKCksaS5ib2R5LmVtaXR0ZXIuZW1pdChcIl9yZWRyYXdcIiksaS5zaG93TWFuaXB1bGF0b3JUb29sYmFyKCkpOihpLmJvZHkuZGF0YS5lZGdlcy5nZXREYXRhU2V0KCkudXBkYXRlKHQpLGkuc2VsZWN0aW9uSGFuZGxlci51bnNlbGVjdEFsbCgpLGkuc2hvd01hbmlwdWxhdG9yVG9vbGJhcigpKX0pfWVsc2UgdGhpcy5ib2R5LmRhdGEuZWRnZXMuZ2V0RGF0YVNldCgpLnVwZGF0ZShvKSx0aGlzLnNlbGVjdGlvbkhhbmRsZXIudW5zZWxlY3RBbGwoKSx0aGlzLnNob3dNYW5pcHVsYXRvclRvb2xiYXIoKX19XSksdH0oKTtlLmRlZmF1bHQ9Z30sZnVuY3Rpb24odCxlLGkpe2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJnQuX19lc01vZHVsZT90OntkZWZhdWx0OnR9fU9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pO3ZhciBuPWkoMzApLHM9byhuKSxyPWkoMCksYT1vKHIpLGg9aSgxKSxkPW8oaCksbD1pKDIzOSksdT1vKGwpLGM9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGUsaSxvKXsoMCxhLmRlZmF1bHQpKHRoaXMsdCksdGhpcy5ib2R5PWUsdGhpcy5zcHJpbmdMZW5ndGg9aSx0aGlzLnNwcmluZ0NvbnN0YW50PW8sdGhpcy5kaXN0YW5jZVNvbHZlcj1uZXcgdS5kZWZhdWx0fXJldHVybigwLGQuZGVmYXVsdCkodCxbe2tleTpcInNldE9wdGlvbnNcIix2YWx1ZTpmdW5jdGlvbih0KXt0JiYodC5zcHJpbmdMZW5ndGgmJih0aGlzLnNwcmluZ0xlbmd0aD10LnNwcmluZ0xlbmd0aCksdC5zcHJpbmdDb25zdGFudCYmKHRoaXMuc3ByaW5nQ29uc3RhbnQ9dC5zcHJpbmdDb25zdGFudCkpfX0se2tleTpcInNvbHZlXCIsdmFsdWU6ZnVuY3Rpb24odCxlKXt2YXIgaT1hcmd1bWVudHMubGVuZ3RoPjImJnZvaWQgMCE9PWFyZ3VtZW50c1syXSYmYXJndW1lbnRzWzJdLG89dGhpcy5kaXN0YW5jZVNvbHZlci5nZXREaXN0YW5jZXModGhpcy5ib2R5LHQsZSk7dGhpcy5fY3JlYXRlTF9tYXRyaXgobyksdGhpcy5fY3JlYXRlS19tYXRyaXgobyksdGhpcy5fY3JlYXRlRV9tYXRyaXgoKTtmb3IodmFyIG49MCxyPU1hdGgubWF4KDFlMyxNYXRoLm1pbigxMCp0aGlzLmJvZHkubm9kZUluZGljZXMubGVuZ3RoLDZlMykpLGE9MWU5LGg9MCxkPTAsbD0wLHU9MCxjPTA7YT4uMDEmJm48cjspe24rPTE7dmFyIHA9dGhpcy5fZ2V0SGlnaGVzdEVuZXJneU5vZGUoaSksZj0oMCxzLmRlZmF1bHQpKHAsNCk7Zm9yKGg9ZlswXSxhPWZbMV0sZD1mWzJdLGw9ZlszXSx1PWEsYz0wO3U+MSYmYzw1Oyl7Yys9MSx0aGlzLl9tb3ZlTm9kZShoLGQsbCk7dmFyIG09dGhpcy5fZ2V0RW5lcmd5KGgpLHY9KDAscy5kZWZh
21167dWx0KShtLDMpO3U9dlswXSxkPXZbMV0sbD12WzJdfX19fSx7a2V5OlwiX2dldEhpZ2hlc3RFbmVyZ3lOb2RlXCIsdmFsdWU6ZnVuY3Rpb24odCl7Zm9yKHZhciBlPXRoaXMuYm9keS5ub2RlSW5kaWNlcyxpPXRoaXMuYm9keS5ub2RlcyxvPTAsbj1lWzBdLHI9MCxhPTAsaD0wO2g8ZS5sZW5ndGg7aCsrKXt2YXIgZD1lW2hdO2lmKCExPT09aVtkXS5wcmVkZWZpbmVkUG9zaXRpb258fCEwPT09aVtkXS5pc0NsdXN0ZXImJiEwPT09dHx8ITA9PT1pW2RdLm9wdGlvbnMuZml4ZWQueHx8ITA9PT1pW2RdLm9wdGlvbnMuZml4ZWQueSl7dmFyIGw9dGhpcy5fZ2V0RW5lcmd5KGQpLHU9KDAscy5kZWZhdWx0KShsLDMpLGM9dVswXSxwPXVbMV0sZj11WzJdO288YyYmKG89YyxuPWQscj1wLGE9Zil9fXJldHVybltuLG8scixhXX19LHtrZXk6XCJfZ2V0RW5lcmd5XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9KDAscy5kZWZhdWx0KSh0aGlzLkVfc3Vtc1t0XSwyKSxpPWVbMF0sbz1lWzFdO3JldHVybltNYXRoLnNxcnQoTWF0aC5wb3coaSwyKStNYXRoLnBvdyhvLDIpKSxpLG9dfX0se2tleTpcIl9tb3ZlTm9kZVwiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLG49dGhpcy5ib2R5Lm5vZGVzLHM9MCxyPTAsYT0wLGg9blt0XS54LGQ9blt0XS55LGw9dGhpcy5LX21hdHJpeFt0XSx1PXRoaXMuTF9tYXRyaXhbdF0sYz0wO2M8by5sZW5ndGg7YysrKXt2YXIgcD1vW2NdO2lmKHAhPT10KXt2YXIgZj1uW3BdLngsbT1uW3BdLnksdj1sW3BdLGc9dVtwXSx5PTEvTWF0aC5wb3coTWF0aC5wb3coaC1mLDIpK01hdGgucG93KGQtbSwyKSwxLjUpO3MrPXYqKDEtZypNYXRoLnBvdyhkLW0sMikqeSkscis9diooZyooaC1mKSooZC1tKSp5KSxhKz12KigxLWcqTWF0aC5wb3coaC1mLDIpKnkpfX12YXIgYj1zLF89cix3PWUseD1hLGs9aSxTPSh3L2Iray9fKS8oXy9iLXgvXyksRD0tKF8qUyt3KS9iO25bdF0ueCs9RCxuW3RdLnkrPVMsdGhpcy5fdXBkYXRlRV9tYXRyaXgodCl9fSx7a2V5OlwiX2NyZWF0ZUxfbWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5zcHJpbmdMZW5ndGg7dGhpcy5MX21hdHJpeD1bXTtmb3IodmFyIG89MDtvPGUubGVuZ3RoO28rKyl7dGhpcy5MX21hdHJpeFtlW29dXT17fTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLkxfbWF0cml4W2Vbb11dW2Vbbl1dPWkqdFtlW29dXVtlW25dXX19fSx7a2V5OlwiX2NyZWF0ZUtfbWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5zcHJpbmdDb25zdGFudDt0aGlzLktfbWF0cml4PVtdO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt0aGlzLktfbWF0cml4W2Vbb11dPXt9O2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKXRoaXMuS19tYXRyaXhbZVtvXV1bZVtuXV09aSpNYXRoLnBvdyh0W2Vbb11dW2Vbbl1dLC0yKX19fSx7a2V5OlwiX2NyZWF0ZUVfbWF0cml4XCIsdmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmJvZHkubm9kZUluZGljZXMsZT10aGlzLmJvZHkubm9kZXM7dGhpcy5FX21hdHJpeD17fSx0aGlzLkVfc3Vtcz17fTtmb3IodmFyIGk9MDtpPHQubGVuZ3RoO2krKyl0aGlzLkVfbWF0cml4W3RbaV1dPVtdO2Zvcih2YXIgbz0wO288dC5sZW5ndGg7bysrKXtmb3IodmFyIG49dFtvXSxzPWVbbl0ueCxyPWVbbl0ueSxhPTAsaD0wLGQ9bztkPHQubGVuZ3RoO2QrKyl7dmFyIGw9dFtkXTtpZihsIT09bil7dmFyIHU9ZVtsXS54LGM9ZVtsXS55LHA9MS9NYXRoLnNxcnQoTWF0aC5wb3cocy11LDIpK01hdGgucG93KHItYywyKSk7dGhpcy5FX21hdHJpeFtuXVtkXT1bdGhpcy5LX21hdHJpeFtuXVtsXSoocy11LXRoaXMuTF9tYXRyaXhbbl1bbF0qKHMtdSkqcCksdGhpcy5LX21hdHJpeFtuXVtsXSooci1jLXRoaXMuTF9tYXRyaXhbbl1bbF0qKHItYykqcCldLHRoaXMuRV9tYXRyaXhbbF1bb109dGhpcy5FX21hdHJpeFtuXVtkXSxhKz10aGlzLkVfbWF0cml4W25dW2RdWzBdLGgrPXRoaXMuRV9tYXRyaXhbbl1bZF1bMV19fXRoaXMuRV9zdW1zW25dPVthLGhdfX19LHtrZXk6XCJfdXBkYXRlRV9tYXRyaXhcIix2YWx1ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5ib2R5Lm5vZGVJbmRpY2VzLGk9dGhpcy5ib2R5Lm5vZGVzLG89dGhpcy5FX21hdHJpeFt0XSxuPXRoaXMuS19tYXRyaXhbdF0scz10aGlzLkxfbWF0cml4W3RdLHI9aVt0XS54LGE9aVt0XS55LGg9MCxkPTAsbD0wO2w8ZS5sZW5ndGg7bCsrKXt2YXIgdT1lW2xdO2lmKHUhPT10KXt2YXIgYz1vW2xdLHA9Y1swXSxmPWNbMV0sbT1pW3VdLngsdj1pW3VdLnksZz0xL01hdGguc3FydChNYXRoLnBvdyhyLW0sMikrTWF0aC5wb3coYS12LDIpKSx5PW5bdV0qKHItbS1zW3VdKihyLW0pKmcpLGI9blt1XSooYS12LXNbdV0qKGEtdikqZyk7b1tsXT1beSxiXSxoKz15LGQrPWI7dmFyIF89dGhpcy5FX3N1bXNbdV07X1swXSs9eS1wLF9bMV0rPWItZn19dGhpcy5FX3N1bXNbdF09W2gsZF19fV0pLHR9KCk7ZS5kZWZhdWx0PWN9LGZ1bmN0aW9uKHQsZSxpKXtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiZ0Ll9fZXNNb2R1bGU/dDp7ZGVmYXVsdDp0fX1PYmplY3QuZGVmaW5lUHJvcGVydHkoZSxcIl9fZXNNb2R1bGVcIix7dmFsdWU6ITB9KTt2YXIgbj1pKDApLHM9byhuKSxyPWkoMSksYT1vKHIpLGg9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7KDAscy5kZWZhdWx0KSh0aGlzLHQpfXJldHVybigwLGEuZGVmYXVsdCkodCxbe2tleTpcImdldERpc3RhbmNlc1wiLHZhbHVlOmZ1bmN0aW9uKHQsZSxpKXtmb3IodmFyIG89e30sbj10LmVkZ2VzLHM9MDtzPGUubGVuZ3RoO3MrKyl7dmFyIHI9ZVtzXSxhPXt9O29bcl09YTtmb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKylhW2VbaF1dPXM9PWg/MDoxZTl9Zm9yKHZhciBkPTA7ZDxpLmxlbmd0aDtkKyspe3ZhciBsPW5baVtkXV07ITA9PT1sLmNvbm5lY3RlZCYmdm9pZCAwIT09b1tsLmZyb21JZF0mJnZvaWQgMCE9PW9bbC50b0lkXSYmKG9bbC5mcm9tSWRdW2wudG9JZF09MSxvW2wudG9JZF1bbC5mcm9tSWRdPTEpfWZvcih2YXIgdT1lLmxlbmd0aCxjPTA7Yzx1O2MrKylmb3IodmFyIHA9ZVtjXSxmPW9bcF0sbT0wO208dS0xO20rKylmb3IodmFyIHY9ZVttXSxnPW9bdl0seT1tKzE7eTx1O3krKyl7dmFyIGI9ZVt5XSxfPW9bYl0sdz1NYXRoLm1pbihnW2JdLGdbcF0rZltiXSk7Z1tiXT13LF9bdl09d31yZXR1cm4gb319XSksdH0oKTtlLmRlZmF1bHQ9aH1dKX0pO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dmlzLm1hcCIsIihmdW5jdGlvbihyb290LGZhY3Rvcnkpe2lmKHR5cGVvZiBkZWZpbmU9PT1cImZ1bmN0aW9uXCImJmRlZmluZS5hbWQpe2RlZmluZShmYWN0b3J5KX1lbHNlIGlmKHR5cGVvZiBleHBvcnRzPT09XCJvYmplY3RcIil7bW9kdWxlLmV4cG9ydHM9ZmFjdG9yeSgpfWVsc2V7ZmFjdG9yeSgpKHJvb3QubHVucil9fSkodGhpcyxmdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsdW5yKXtsdW5yLnN0ZW1tZXJTdXBwb3J0PXtBbW9uZzpmdW5jdGlvbihzLHN1YnN0cmluZ19pLHJlc3VsdCxtZXRob2Qpe3RoaXMudG9DaGFyQXJyYXk9ZnVuY3Rpb24ocyl7dmFyIHNMZW5ndGg9cy5sZW5ndGgsY2hhckFycj1uZXcgQXJyYXkoc0xlbmd0aCk7Zm9yKHZhciBpPTA7aTxzTGVuZ3RoO2krKyljaGFyQXJyW2ldPXMuY2hhckNvZGVBdChpKTtyZXR1cm4gY2hhckFycn07aWYoIXMmJnMhPVwiXCJ8fCFzdWJzdHJpbmdfaSYmc3Vic3RyaW5nX2khPTB8fCFyZXN1bHQpdGhyb3dcIkJhZCBBbW9uZyBpbml0aWFsaXNhdGlvbjogczpcIitzK1wiLCBzdWJzdHJpbmdfaTogXCIrc3Vic3RyaW5nX2krXCIsIHJlc3VsdDogXCIrcmVzdWx0O3RoaXMuc19zaXplPX
21167MubGVuZ3RoO3RoaXMucz10aGlzLnRvQ2hhckFycmF5KHMpO3RoaXMuc3Vic3RyaW5nX2k9c3Vic3RyaW5nX2k7dGhpcy5yZXN1bHQ9cmVzdWx0O3RoaXMubWV0aG9kPW1ldGhvZH0sU25vd2JhbGxQcm9ncmFtOmZ1bmN0aW9uKCl7dmFyIGN1cnJlbnQ7cmV0dXJue2JyYTowLGtldDowLGxpbWl0OjAsY3Vyc29yOjAsbGltaXRfYmFja3dhcmQ6MCxzZXRDdXJyZW50OmZ1bmN0aW9uKHdvcmQpe2N1cnJlbnQ9d29yZDt0aGlzLmN1cnNvcj0wO3RoaXMubGltaXQ9d29yZC5sZW5ndGg7dGhpcy5saW1pdF9iYWNrd2FyZD0wO3RoaXMuYnJhPXRoaXMuY3Vyc29yO3RoaXMua2V0PXRoaXMubGltaXR9LGdldEN1cnJlbnQ6ZnVuY3Rpb24oKXt2YXIgcmVzdWx0PWN1cnJlbnQ7Y3VycmVudD1udWxsO3JldHVybiByZXN1bHR9LGluX2dyb3VwaW5nOmZ1bmN0aW9uKHMsbWluLG1heCl7aWYodGhpcy5jdXJzb3I8dGhpcy5saW1pdCl7dmFyIGNoPWN1cnJlbnQuY2hhckNvZGVBdCh0aGlzLmN1cnNvcik7aWYoY2g8PW1heCYmY2g+PW1pbil7Y2gtPW1pbjtpZihzW2NoPj4zXSYxPDwoY2gmNykpe3RoaXMuY3Vyc29yKys7cmV0dXJuIHRydWV9fX1yZXR1cm4gZmFsc2V9LGluX2dyb3VwaW5nX2I6ZnVuY3Rpb24ocyxtaW4sbWF4KXtpZih0aGlzLmN1cnNvcj50aGlzLmxpbWl0X2JhY2t3YXJkKXt2YXIgY2g9Y3VycmVudC5jaGFyQ29kZUF0KHRoaXMuY3Vyc29yLTEpO2lmKGNoPD1tYXgmJmNoPj1taW4pe2NoLT1taW47aWYoc1tjaD4+M10mMTw8KGNoJjcpKXt0aGlzLmN1cnNvci0tO3JldHVybiB0cnVlfX19cmV0dXJuIGZhbHNlfSxvdXRfZ3JvdXBpbmc6ZnVuY3Rpb24ocyxtaW4sbWF4KXtpZih0aGlzLmN1cnNvcjx0aGlzLmxpbWl0KXt2YXIgY2g9Y3VycmVudC5jaGFyQ29kZUF0KHRoaXMuY3Vyc29yKTtpZihjaD5tYXh8fGNoPG1pbil7dGhpcy5jdXJzb3IrKztyZXR1cm4gdHJ1ZX1jaC09bWluO2lmKCEoc1tjaD4+M10mMTw8KGNoJjcpKSl7dGhpcy5jdXJzb3IrKztyZXR1cm4gdHJ1ZX19cmV0dXJuIGZhbHNlfSxvdXRfZ3JvdXBpbmdfYjpmdW5jdGlvbihzLG1pbixtYXgpe2lmKHRoaXMuY3Vyc29yPnRoaXMubGltaXRfYmFja3dhcmQpe3ZhciBjaD1jdXJyZW50LmNoYXJDb2RlQXQodGhpcy5jdXJzb3ItMSk7aWYoY2g+bWF4fHxjaDxtaW4pe3RoaXMuY3Vyc29yLS07cmV0dXJuIHRydWV9Y2gtPW1pbjtpZighKHNbY2g+PjNdJjE8PChjaCY3KSkpe3RoaXMuY3Vyc29yLS07cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX0sZXFfczpmdW5jdGlvbihzX3NpemUscyl7aWYodGhpcy5saW1pdC10aGlzLmN1cnNvcjxzX3NpemUpcmV0dXJuIGZhbHNlO2Zvcih2YXIgaT0wO2k8c19zaXplO2krKylpZihjdXJyZW50LmNoYXJDb2RlQXQodGhpcy5jdXJzb3IraSkhPXMuY2hhckNvZGVBdChpKSlyZXR1cm4gZmFsc2U7dGhpcy5jdXJzb3IrPXNfc2l6ZTtyZXR1cm4gdHJ1ZX0sZXFfc19iOmZ1bmN0aW9uKHNfc2l6ZSxzKXtpZih0aGlzLmN1cnNvci10aGlzLmxpbWl0X2JhY2t3YXJkPHNfc2l6ZSlyZXR1cm4gZmFsc2U7Zm9yKHZhciBpPTA7aTxzX3NpemU7aSsrKWlmKGN1cnJlbnQuY2hhckNvZGVBdCh0aGlzLmN1cnNvci1zX3NpemUraSkhPXMuY2hhckNvZGVBdChpKSlyZXR1cm4gZmFsc2U7dGhpcy5jdXJzb3ItPXNfc2l6ZTtyZXR1cm4gdHJ1ZX0sZmluZF9hbW9uZzpmdW5jdGlvbih2LHZfc2l6ZSl7dmFyIGk9MCxqPXZfc2l6ZSxjPXRoaXMuY3Vyc29yLGw9dGhpcy5saW1pdCxjb21tb25faT0wLGNvbW1vbl9qPTAsZmlyc3Rfa2V5X2luc3BlY3RlZD1mYWxzZTt3aGlsZSh0cnVlKXt2YXIgaz1pKyhqLWk+PjEpLGRpZmY9MCxjb21tb249Y29tbW9uX2k8Y29tbW9uX2o/Y29tbW9uX2k6Y29tbW9uX2osdz12W2tdO2Zvcih2YXIgaTI9Y29tbW9uO2kyPHcuc19zaXplO2kyKyspe2lmKGMrY29tbW9uPT1sKXtkaWZmPS0xO2JyZWFrfWRpZmY9Y3VycmVudC5jaGFyQ29kZUF0KGMrY29tbW9uKS13LnNbaTJdO2lmKGRpZmYpYnJlYWs7Y29tbW9uKyt9aWYoZGlmZjwwKXtqPWs7Y29tbW9uX2o9Y29tbW9ufWVsc2V7aT1rO2NvbW1vbl9pPWNvbW1vbn1pZihqLWk8PTEpe2lmKGk+MHx8aj09aXx8Zmlyc3Rfa2V5X2luc3BlY3RlZClicmVhaztmaXJzdF9rZXlfaW5zcGVjdGVkPXRydWV9fXdoaWxlKHRydWUpe3ZhciB3PXZbaV07aWYoY29tbW9uX2k+PXcuc19zaXplKXt0aGlzLmN1cnNvcj1jK3cuc19zaXplO2lmKCF3Lm1ldGhvZClyZXR1cm4gdy5yZXN1bHQ7dmFyIHJlcz13Lm1ldGhvZCgpO3RoaXMuY3Vyc29yPWMrdy5zX3NpemU7aWYocmVzKXJldHVybiB3LnJlc3VsdH1pPXcuc3Vic3RyaW5nX2k7aWYoaTwwKXJldHVybiAwfX0sZmluZF9hbW9uZ19iOmZ1bmN0aW9uKHYsdl9zaXplKXt2YXIgaT0wLGo9dl9zaXplLGM9dGhpcy5jdXJzb3IsbGI9dGhpcy5saW1pdF9iYWNrd2FyZCxjb21tb25faT0wLGNvbW1vbl9qPTAsZmlyc3Rfa2V5X2luc3BlY3RlZD1mYWxzZTt3aGlsZSh0cnVlKXt2YXIgaz1pKyhqLWk+PjEpLGRpZmY9MCxjb21tb249Y29tbW9uX2k8Y29tbW9uX2o/Y29tbW9uX2k6Y29tbW9uX2osdz12W2tdO2Zvcih2YXIgaTI9dy5zX3NpemUtMS1jb21tb247aTI+PTA7aTItLSl7aWYoYy1jb21tb249PWxiKXtkaWZmPS0xO2JyZWFrfWRpZmY9Y3VycmVudC5jaGFyQ29kZUF0KGMtMS1jb21tb24pLXcuc1tpMl07aWYoZGlmZilicmVhaztjb21tb24rK31pZihkaWZmPDApe2o9aztjb21tb25faj1jb21tb259ZWxzZXtpPWs7Y29tbW9uX2k9Y29tbW9ufWlmKGotaTw9MSl7aWYoaT4wfHxqPT1pfHxmaXJzdF9rZXlfaW5zcGVjdGVkKWJyZWFrO2ZpcnN0X2tleV9pbnNwZWN0ZWQ9dHJ1ZX19d2hpbGUodHJ1ZSl7dmFyIHc9dltpXTtpZihjb21tb25faT49dy5zX3NpemUpe3RoaXMuY3Vyc29yPWMtdy5zX3NpemU7aWYoIXcubWV0aG9kKXJldHVybiB3LnJlc3VsdDt2YXIgcmVzPXcubWV0aG9kKCk7dGhpcy5jdXJzb3I9Yy13LnNfc2l6ZTtpZihyZXMpcmV0dXJuIHcucmVzdWx0fWk9dy5zdWJzdHJpbmdfaTtpZihpPDApcmV0dXJuIDB9fSxyZXBsYWNlX3M6ZnVuY3Rpb24oY19icmEsY19rZXQscyl7dmFyIGFkanVzdG1lbnQ9cy5sZW5ndGgtKGNfa2V0LWNfYnJhKSxsZWZ0PWN1cnJlbnQuc3Vic3RyaW5nKDAsY19icmEpLHJpZ2h0PWN1cnJlbnQuc3Vic3RyaW5nKGNfa2V0KTtjdXJyZW50PWxlZnQrcytyaWdodDt
211670aGlzLmxpbWl0Kz1hZGp1c3RtZW50O2lmKHRoaXMuY3Vyc29yPj1jX2tldCl0aGlzLmN1cnNvcis9YWRqdXN0bWVudDtlbHNlIGlmKHRoaXMuY3Vyc29yPmNfYnJhKXRoaXMuY3Vyc29yPWNfYnJhO3JldHVybiBhZGp1c3RtZW50fSxzbGljZV9jaGVjazpmdW5jdGlvbigpe2lmKHRoaXMuYnJhPDB8fHRoaXMuYnJhPnRoaXMua2V0fHx0aGlzLmtldD50aGlzLmxpbWl0fHx0aGlzLmxpbWl0PmN1cnJlbnQubGVuZ3RoKXRocm93XCJmYXVsdHkgc2xpY2Ugb3BlcmF0aW9uXCJ9LHNsaWNlX2Zyb206ZnVuY3Rpb24ocyl7dGhpcy5zbGljZV9jaGVjaygpO3RoaXMucmVwbGFjZV9zKHRoaXMuYnJhLHRoaXMua2V0LHMpfSxzbGljZV9kZWw6ZnVuY3Rpb24oKXt0aGlzLnNsaWNlX2Zyb20oXCJcIil9LGluc2VydDpmdW5jdGlvbihjX2JyYSxjX2tldCxzKXt2YXIgYWRqdXN0bWVudD10aGlzLnJlcGxhY2VfcyhjX2JyYSxjX2tldCxzKTtpZihjX2JyYTw9dGhpcy5icmEpdGhpcy5icmErPWFkanVzdG1lbnQ7aWYoY19icmE8PXRoaXMua2V0KXRoaXMua2V0Kz1hZGp1c3RtZW50fSxzbGljZV90bzpmdW5jdGlvbigpe3RoaXMuc2xpY2VfY2hlY2soKTtyZXR1cm4gY3VycmVudC5zdWJzdHJpbmcodGhpcy5icmEsdGhpcy5rZXQpfSxlcV92X2I6ZnVuY3Rpb24ocyl7cmV0dXJuIHRoaXMuZXFfc19iKHMubGVuZ3RoLHMpfX19fX19KTtcbiIsIihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkocmVxdWlyZSgnanF1ZXJ5JykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnanF1ZXJ5J10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoZ2xvYmFsLmpRdWVyeSkpO1xufSh0aGlzLCAoZnVuY3Rpb24gKCQpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gICQuZm4uZGF0ZXBpY2tlci5sYW5ndWFnZXNbJ2ZyLUZSJ10gPSB7XG4gICAgZm9ybWF0OiAnZGQvbW0veXl5eScsXG4gICAgZGF5czogWydEaW1hbmNoZScsICdMdW5kaScsICdNYXJkaScsICdNZXJjcmVkaScsICdKZXVkaScsICdWZW5kcmVkaScsICdTYW1lZGknXSxcbiAgICBkYXlzU2hvcnQ6IFsnRGltJywgJ0x1bicsICdNYXInLCAnTWVyJywgJ0pldScsICdWZW4nLCAnU2FtJ10sXG4gICAgZGF5c01pbjogWydEaScsICdMdScsICdNYScsICdNZScsICdKZScsICdWZScsICdTYSddLFxuICAgIHdlZWtTdGFydDogMSxcbiAgICBtb250aHM6IFsnSmFudmllcicsICdGw6l2cmllcicsICdNYXJzJywgJ0F2cmlsJywgJ01haScsICdKdWluJywgJ0p1aWxsZXQnLCAnQW91dCcsICdTZXB0ZW1icmUnLCAnT2N0b2JyZScsICdOb3ZlbWJyZScsICdEw6ljZW1icmUnXSxcbiAgICBtb250aHNTaG9ydDogWydKYW4nLCAnRmV2JywgJ01hcicsICdBdnInLCAnTWFpJywgJ0p1bicsICdKdWknLCAnQW91JywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddXG4gIH07XG59KSkpO1xuIiwiKGZ1bmN0aW9uKHJvb3QsZmFjdG9yeSl7aWYodHlwZW9mIGRlZmluZT09PVwiZnVuY3Rpb25cIiYmZGVmaW5lLmFtZCl7ZGVmaW5lKGZhY3RvcnkpfWVsc2UgaWYodHlwZW9mIGV4cG9ydHM9PT1cIm9iamVjdFwiKXttb2R1bGUuZXhwb3J0cz1mYWN0b3J5KCl9ZWxzZXtmYWN0b3J5KCkocm9vdC5sdW5yKX19KSh0aGlzLGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGx1bnIpe2lmKFwidW5kZWZpbmVkXCI9PT10eXBlb2YgbHVucil7dGhyb3cgbmV3IEVycm9yKFwiTHVuciBpcyBub3QgcHJlc2VudC4gUGxlYXNlIGluY2x1ZGUgLyByZXF1aXJlIEx1bnIgYmVmb3JlIHRoaXMgc2NyaXB0LlwiKX1pZihcInVuZGVmaW5lZFwiPT09dHlwZW9mIGx1bnIuc3RlbW1lclN1cHBvcnQpe3Rocm93IG5ldyBFcnJvcihcIkx1bnIgc3RlbW1lciBzdXBwb3J0IGlzIG5vdCBwcmVzZW50LiBQbGVhc2UgaW5jbHVkZSAvIHJlcXVpcmUgTHVuciBzdGVtbWVyIHN1cHBvcnQgYmVmb3JlIHRoaXMgc2NyaXB0LlwiKX1sdW5yLmZyPWZ1bmN0aW9uKCl7dGhpcy5waXBlbGluZS5yZXNldCgpO3RoaXMucGlwZWxpbmUuYWRkKGx1bnIuZnIuc3RvcFdvcmRGaWx0ZXIsbHVuci5mci5zdGVtbWVyKX07bHVuci5mci5zdGVtbWVyPWZ1bmN0aW9uKCl7dmFyIEFtb25nPWx1bnIuc3RlbW1lclN1cHBvcnQuQW1vbmcsU25vd2JhbGxQcm9ncmFtPWx1bnIuc3RlbW1lclN1cHBvcnQuU25vd2JhbGxQcm9ncmFtLHN0PW5ldyBmdW5jdGlvbiBGcmVuY2hTdGVtbWVyKCl7dmFyIGFfMD1bbmV3IEFtb25nKFwiY29sXCIsLTEsLTEpLG5ldyBBbW9uZyhcInBhclwiLC0xLC0xKSxuZXcgQW1vbmcoXCJ0YXBcIiwtMSwtMSldLGFfMT1bbmV3IEFtb25nKFwiXCIsLTEsNCksbmV3IEFtb25nKFwiSVwiLDAsMSksbmV3IEFtb25nKFwiVVwiLDAsMiksbmV3IEFtb25nKFwiWVwiLDAsMyldLGFfMj1bbmV3IEFtb25nKFwiaXFVXCIsLTEsMyksbmV3IEFtb25nKFwiYWJsXCIsLTEsMyksbmV3IEFtb25nKFwiScOoclwiLC0xLDQpLG5ldyBBbW9uZyhcImnDqHJcIiwtMSw0KSxuZXcgQW1vbmcoXCJldXNcIiwtMSwyKSxuZXcgQW1vbmcoXCJpdlwiLC0xLDEpXSxhXzM9W25ldyBBbW9uZyhcImljXCIsLTEsMiksbmV3IEFtb25nKFwiYWJpbFwiLC0xLDEpLG5ldyBBbW9uZyhcIml2XCIsLTEsMyldLGFfND1bbmV3IEFtb25nKFwiaXFVZVwiLC0xLDEpLG5ldyBBbW9uZyhcImF0cmljZVwiLC0xLDIpLG5ldyBBbW9uZyhcImFuY2VcIiwtMSwxKSxuZXcgQW1vbmcoXCJlbmNlXCIsLTEsNSksbmV3IEFtb25nKFwibG9naWVcIiwtMSwzKSxuZXcgQW1vbmcoXCJhYmxlXCIsLTEsMSksbmV3IEFtb25nKFwiaXNtZVwiLC0xLDEpLG5ldyBBbW9uZyhcImV1c2VcIiwtMSwxMSksbmV3IEFtb25nKFwiaXN0ZVwiLC0xLDEpLG5ldyBBbW9uZyhcIml2ZVwiLC0xLDgpLG5ldyBBbW9uZyhcImlmXCIsLTEsOCksbmV3IEFtb25nKFwidXNpb25cIiwtMSw0KSxuZXcgQW1vbmcoXCJhdGlvblwiLC0xLDIpLG5ldyBBbW9uZyhcInV0aW9uXCIsLTEsNCksbmV3IEFtb25nKFwiYXRldXJcIiwtMSwyKSxuZXcgQW1vbmcoXCJpcVVlc1wiLC0xLDEpLG5ldyBBbW9uZyhcImF0cmljZXNcIiwtMSwyKSxuZXcgQW1vbmcoXCJhbmNlc1wiLC0xLDEpLG5ldyBBbW9uZyhcImVuY2VzXCIsLTEsNSksbmV3IEFtb25nKFwibG9naWVzXCIsLTEsMyksbmV3IEFtb25nKFwiYWJsZXNcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc21lc1wiLC0xLDEpLG5ldyBBbW9uZyhcImV1c2VzXCIsLTEsMTEpLG5ldyBBbW9uZyhcImlzdGVzXCIsLTEsMSksbmV3IEFtb25nKFwiaXZlc1wiLC0xLDgpLG5ldyBBbW9uZyhcImlmc1wiLC0xLDgpLG5ldyBBbW9uZyhcInVzaW9uc1wiLC0xLDQpLG5ldyBBbW9uZyhcImF0aW9uc1wiLC0xLDIpLG5ldyBBbW9uZyhcInV0aW9uc1wiLC0xLDQpLG5ldyBBbW9uZyhcImF0ZXVyc1wiLC0xLDIpLG5ldyBBbW9uZyhcIm1lbnRzXCIsLTEsMTUpLG5ldyBBbW9uZyhcImVtZW50c1wiLDMwLDYpLG5ldyBBbW9uZyhcImlzc2VtZW50c1wiLDMxLDEyKSxuZXcgQW1vbmcoXCJpdMOpc1wiLC0xLDcpLG5ldyBBbW9uZyhcIm1lbnRcIiwtMSwxNSksbmV3IEFtb25nKFwiZW1lbnRcIiwzNCw2KSxuZXcgQW1vbmcoXCJpc3NlbWVudFwiLDM1LDEyKSxuZXcgQW1vbmcoXCJhbW1lbnRcIiwzNCwxMyksbmV3IEFtb25nKFwiZW1tZW50XCIsMzQsMTQpLG5ldyBBbW9uZyhcImF1eFwiLC0xLDEwKSxuZXcgQW1vbmcoXCJlYXV4XCIsMzksOSksbmV3IEFtb25nKFwiZXV4XCIsLTEsMSksbmV3IEFtb25nKFwiaXTDqVwiLC0xLDcpXSxhXzU9W25ldyBBbW9uZyhcImlyYVwiLC0xLDEpLG5ldyBBbW9uZyhcImllXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzZVwiLC0xLDEpLG5ldyBBbW9uZyhcImlzc2FudGVcIiwtMSwxKSxuZXcgQW1vbmcoXCJpXCIsLTEsMSksbmV3IEFtb25nKFwiaXJhaVwiLDQsMSksbmV3IEFtb25nKFwiaXJcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmFzXCIsLTEsMSksbmV3IEFtb25nKFwiaWVzXCIsLTEsMSksbmV3IEFtb25nKFwiw65tZXNcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc3Nlc1wiLC0xLDEpLG5ldyBBbW9uZyhcImlzc2FudGVzXCIsLTEsMSksbmV3IEFtb25nKFwiw650ZXNcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc1wiLC0xLDEpLG5ldyBBbW9uZyhcImlyYWlzXCIsMTMsMSksbmV3IEFtb25nKFwiaXNzYWlzXCIsMTMsMSksbmV3IEFtb25nKFwiaXJpb25zXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzaW9uc1wiLC0xLDEpLG5ldyBBbW9uZyhcImlyb25zXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzb25zXCIsLTEsMSksbmV3IEFtb25nKFwiaXNzYW50c1wiLC0xLDEpLG5ldyBBbW9uZyhcIml0XCIsLTEsMSksbmV3IEFtb25nKFwiaXJhaXRcIiwyMSwxKSxuZXcgQW1vbmcoXCJpc3NhaXRcIiwyMSwxKSxuZXcgQW1vbmcoXCJpc3NhbnRcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmFJZW50XCIsLTEsMSksbmV3IEFtb25nKFwiaXNzYUllbnRcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmVudFwiLC0xLDEpLG5ldyBBbW9uZyhcImlzc2VudFwiLC0xLDEpLG5ldyBBbW9uZyhcImlyb250XCIsLTEsMSksbmV3IEFtb25nKFwiw650XCIsLTEsMSksbmV3IEFtb25nKFwiaXJpZXpcIiwtMSwxKSxuZXcgQW1vbmcoXCJpc3NpZXpcIiwtMSwxKSxuZXcgQW1vbmcoXCJpcmV6XCIsLTEsMSksbmV3IEFtb25nKFwiaXNzZXpcIiwtMSwxKV0sYV82PVtuZXcgQW1vbmcoXCJhXCIsLTEsMyksbmV3IEFtb25nKFwiZXJhXCIsMCwyKSxuZXcgQW1vbmcoXCJhc3NlXCIsLTEsMyksbmV3IEFtb25nKFwiYW50ZVwiLC0xLDMpLG5ldyBBbW9uZyhcIsOpZVwiLC0xLDIpLG5ldyBBbW9uZyhcImFpXCIsLTEsMyksbmV3IEFtb25nKFwiZXJhaVwiLDUsMiksbmV3IEFtb25nKFwiZXJcIiwtMSwyKSxuZXcgQW1vbmcoXCJhc1wiLC0xLDMpLG5ldyBBbW9uZyhcImVyYXNcIiw4LDIpLG5ldyBBbW9uZyhcIsOibWVzXCIsLTEsMyksbmV3IEFtb25nKFwiYXNzZXNcIiwtMSwzKSxuZXcgQW1vbmcoXCJhbnRlc1wiLC0xLDMpLG5ldyBBbW9uZyhcIsOidGVzXCIsLTEsMyksbmV3IEFtb25nKFwiw6llc1wiLC0xLDIpLG5ldyBBbW9uZyhcImFpc1wiLC0xLDMpLG5ldyBBbW9uZyhcImVyYWlzXCIsMTUsMiksbmV3IEFtb25nKFwiaW9uc1wiLC0xLDEpLG5ldyBBbW9uZyhcImVyaW9uc1wiLDE3LDIpLG5ldyBBbW9uZyhcImFzc2lvbnNcIiwxNywzKSxuZXcgQW1vbmcoXCJlcm9uc1wiLC0xLDIpLG5ldyBBbW9uZyhcImFudHNcIiwtMSwzKSxuZXcgQW1vbmcoXCLDqXNcIiwtMSwyKSxuZXcgQW1vbmcoXCJhaXRcIiwtMSwzKSxuZXcgQW1vbmcoXCJlcmFpdFwiLDIzLDIpLG5ldyBBbW9uZyhcImFudFwiLC0xLDMpLG5ldyBBbW9uZyhcImFJZW50XCIsLTEsMyksbmV3IEFtb25nKFwiZXJhSWVudFwiLDI2LDIpLG5ldyBBbW9uZyhcIsOocmVudFwiLC0xLDIpLG5ldyBBbW9uZyhcImFzc2VudFwiLC0xLDMpLG5ldyBBbW9uZyhcImVyb250XCIsLTEsMiksbmV3IEFtb25nKFwiw6J0XCIsLTEsMyksbmV3IEFtb25nKFwiZXpcIiwtMSwyKSxuZXcgQW1vbmcoXCJpZXpcIiwzMiwyKSxuZXcgQW1vbmcoXCJlcmllelwiLDMzLDIpLG5ldyBBbW9uZyhcImFzc2llelwiLDMzLDMpLG5ldyBBbW9uZyhcImVyZXpcIiwzMiwyKSxuZXcgQW1vbmcoXCLDqVwiLC0xLDIpXSxhXzc9W25ldyBBbW9uZyhcImVcIiwtMSwzKSxuZXcgQW1vbmcoXCJJw6hyZVwiLDAsMiksbmV3IEFtb25nKFwiacOocmVcIiwwLDIpLG5ldyBBbW9uZyhcImlvblwiLC0xLDEpLG5ldyBBbW9uZyhcIkllclwiLC0xLDIpLG5ldyBBbW9uZyhcImllclwiLC0xLDIpLG5ldyBBbW9uZyhcIsOrXCIsLTEsNCldLGFfOD1bbmV3IEFtb25nKFwiZWxsXCIsLTEsLTEpLG5ldyBBbW9uZyhcImVpbGxcIiwtMSwtMSksbmV3IEFtb25nKFwiZW5uXCIsLTEsLTEpLG5ldyBBbW9uZyhcIm9ublwiLC0xLC0xKSxuZXcgQW1vbmcoXCJldHRcIiwtMSwtMSldLGdfdj1bMTcsNjUsMTYsMSwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTI4L
21167DEzMCwxMDMsOCw1XSxnX2tlZXBfd2l0aF9zPVsxLDY1LDIwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMTI4XSxJX3AyLElfcDEsSV9wVixzYnA9bmV3IFNub3diYWxsUHJvZ3JhbTt0aGlzLnNldEN1cnJlbnQ9ZnVuY3Rpb24od29yZCl7c2JwLnNldEN1cnJlbnQod29yZCl9O3RoaXMuZ2V0Q3VycmVudD1mdW5jdGlvbigpe3JldHVybiBzYnAuZ2V0Q3VycmVudCgpfTtmdW5jdGlvbiBoYWJyMShjMSxjMix2XzEpe2lmKHNicC5lcV9zKDEsYzEpKXtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmluX2dyb3VwaW5nKGdfdiw5NywyNTEpKXtzYnAuc2xpY2VfZnJvbShjMik7c2JwLmN1cnNvcj12XzE7cmV0dXJuIHRydWV9fXJldHVybiBmYWxzZX1mdW5jdGlvbiBoYWJyMihjMSxjMix2XzEpe2lmKHNicC5lcV9zKDEsYzEpKXtzYnAua2V0PXNicC5jdXJzb3I7c2JwLnNsaWNlX2Zyb20oYzIpO3NicC5jdXJzb3I9dl8xO3JldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiByX3ByZWx1ZGUoKXt2YXIgdl8xLHZfMjt3aGlsZSh0cnVlKXt2XzE9c2JwLmN1cnNvcjtpZihzYnAuaW5fZ3JvdXBpbmcoZ192LDk3LDI1MSkpe3NicC5icmE9c2JwLmN1cnNvcjt2XzI9c2JwLmN1cnNvcjtpZihoYWJyMShcInVcIixcIlVcIix2XzEpKWNvbnRpbnVlO3NicC5jdXJzb3I9dl8yO2lmKGhhYnIxKFwiaVwiLFwiSVwiLHZfMSkpY29udGludWU7c2JwLmN1cnNvcj12XzI7aWYoaGFicjIoXCJ5XCIsXCJZXCIsdl8xKSljb250aW51ZX1zYnAuY3Vyc29yPXZfMTtzYnAuYnJhPXZfMTtpZighaGFicjEoXCJ5XCIsXCJZXCIsdl8xKSl7c2JwLmN1cnNvcj12XzE7aWYoc2JwLmVxX3MoMSxcInFcIikpe3NicC5icmE9c2JwLmN1cnNvcjtpZihoYWJyMihcInVcIixcIlVcIix2XzEpKWNvbnRpbnVlfXNicC5jdXJzb3I9dl8xO2lmKHZfMT49c2JwLmxpbWl0KXJldHVybjtzYnAuY3Vyc29yKyt9fX1mdW5jdGlvbiBoYWJyMygpe3doaWxlKCFzYnAuaW5fZ3JvdXBpbmcoZ192LDk3LDI1MSkpe2lmKHNicC5jdXJzb3I+PXNicC5saW1pdClyZXR1cm4gdHJ1ZTtzYnAuY3Vyc29yKyt9d2hpbGUoIXNicC5vdXRfZ3JvdXBpbmcoZ192LDk3LDI1MSkpe2lmKHNicC5jdXJzb3I+PXNicC5saW1pdClyZXR1cm4gdHJ1ZTtzYnAuY3Vyc29yKyt9cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHJfbWFya19yZWdpb25zKCl7dmFyIHZfMT1zYnAuY3Vyc29yO0lfcFY9c2JwLmxpbWl0O0lfcDE9SV9wVjtJX3AyPUlfcFY7aWYoc2JwLmluX2dyb3VwaW5nKGdfdiw5NywyNTEpJiZzYnAuaW5fZ3JvdXBpbmcoZ192LDk3LDI1MSkmJnNicC5jdXJzb3I8c2JwLmxpbWl0KXNicC5jdXJzb3IrKztlbHNle3NicC5jdXJzb3I9dl8xO2lmKCFzYnAuZmluZF9hbW9uZyhhXzAsMykpe3NicC5jdXJzb3I9dl8xO2Rve2lmKHNicC5jdXJzb3I+PXNicC5saW1pdCl7c2JwLmN1cnNvcj1JX3BWO2JyZWFrfXNicC5jdXJzb3IrK313aGlsZSghc2JwLmluX2dyb3VwaW5nKGdfdiw5NywyNTEpKX19SV9wVj1zYnAuY3Vyc29yO3NicC5jdXJzb3I9dl8xO2lmKCFoYWJyMygpKXtJX3AxPXNicC5jdXJzb3I7aWYoIWhhYnIzKCkpSV9wMj1zYnAuY3Vyc29yfX1mdW5jdGlvbiByX3Bvc3RsdWRlKCl7dmFyIGFtb25nX3Zhcix2XzE7d2hpbGUodHJ1ZSl7dl8xPXNicC5jdXJzb3I7c2JwLmJyYT12XzE7YW1vbmdfdmFyPXNicC5maW5kX2Ftb25nKGFfMSw0KTtpZighYW1vbmdfdmFyKWJyZWFrO3NicC5rZXQ9c2JwLmN1cnNvcjtzd2l0Y2goYW1vbmdfdmFyKXtjYXNlIDE6c2JwLnNsaWNlX2Zyb20oXCJpXCIpO2JyZWFrO2Nhc2UgMjpzYnAuc2xpY2VfZnJvbShcInVcIik7YnJlYWs7Y2FzZSAzOnNicC5zbGljZV9mcm9tKFwieVwiKTticmVhaztjYXNlIDQ6aWYoc2JwLmN1cnNvcj49c2JwLmxpbWl0KXJldHVybjtzYnAuY3Vyc29yKys7YnJlYWt9fX1mdW5jdGlvbiByX1JWKCl7cmV0dXJuIElfcFY8PXNicC5jdXJzb3J9ZnVuY3Rpb24gcl9SMSgpe3JldHVybiBJX3AxPD1zYnAuY3Vyc29yfWZ1bmN0aW9uIHJfUjIoKXtyZXR1cm4gSV9wMjw9c2JwLmN1cnNvcn1mdW5jdGlvbiByX3N0YW5kYXJkX3N1ZmZpeCgpe3ZhciBhbW9uZ192YXIsdl8xO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzQsNDMpO2lmKGFtb25nX3Zhcil7c2JwLmJyYT1zYnAuY3Vyc29yO3N3aXRjaC
21167hhbW9uZ192YXIpe2Nhc2UgMTppZighcl9SMigpKXJldHVybiBmYWxzZTtzYnAuc2xpY2VfZGVsKCk7YnJlYWs7Y2FzZSAyOmlmKCFyX1IyKCkpcmV0dXJuIGZhbHNlO3NicC5zbGljZV9kZWwoKTtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmVxX3NfYigyLFwiaWNcIikpe3NicC5icmE9c2JwLmN1cnNvcjtpZighcl9SMigpKXNicC5zbGljZV9mcm9tKFwiaXFVXCIpO2Vsc2Ugc2JwLnNsaWNlX2RlbCgpfWJyZWFrO2Nhc2UgMzppZighcl9SMigpKXJldHVybiBmYWxzZTtzYnAuc2xpY2VfZnJvbShcImxvZ1wiKTticmVhaztjYXNlIDQ6aWYoIXJfUjIoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2Zyb20oXCJ1XCIpO2JyZWFrO2Nhc2UgNTppZighcl9SMigpKXJldHVybiBmYWxzZTtzYnAuc2xpY2VfZnJvbShcImVudFwiKTticmVhaztjYXNlIDY6aWYoIXJfUlYoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzIsNik7aWYoYW1vbmdfdmFyKXtzYnAuYnJhPXNicC5jdXJzb3I7c3dpdGNoKGFtb25nX3Zhcil7Y2FzZSAxOmlmKHJfUjIoKSl7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjtpZihzYnAuZXFfc19iKDIsXCJhdFwiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO2lmKHJfUjIoKSlzYnAuc2xpY2VfZGVsKCl9fWJyZWFrO2Nhc2UgMjppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2Vsc2UgaWYocl9SMSgpKXNicC5zbGljZV9mcm9tKFwiZXV4XCIpO2JyZWFrO2Nhc2UgMzppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2JyZWFrO2Nhc2UgNDppZihyX1JWKCkpc2JwLnNsaWNlX2Zyb20oXCJpXCIpO2JyZWFrfX1icmVhaztjYXNlIDc6aWYoIXJfUjIoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzMsMyk7aWYoYW1vbmdfdmFyKXtzYnAuYnJhPXNicC5jdXJzb3I7c3dpdGNoKGFtb25nX3Zhcil7Y2FzZSAxOmlmKHJfUjIoKSlzYnAuc2xpY2VfZGVsKCk7ZWxzZSBzYnAuc2xpY2VfZnJvbShcImFibFwiKTticmVhaztjYXNlIDI6aWYocl9SMigpKXNicC5zbGljZV9kZWwoKTtlbHNlIHNicC5zbGljZV9mcm9tKFwiaXFVXCIpO2JyZWFrO2Nhc2UgMzppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2JyZWFrfX1icmVhaztjYXNlIDg6aWYoIXJfUjIoKSlyZXR1cm4gZmFsc2U7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjtpZihzYnAuZXFfc19iKDIsXCJhdFwiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO2lmKHJfUjIoKSl7c2JwLnNsaWNlX2RlbCgpO3NicC5rZXQ9c2JwLmN1cnNvcjtpZihzYnAuZXFfc19iKDIsXCJpY1wiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO2lmKHJfUjIoKSlzYnAuc2xpY2VfZGVsKCk7ZWxzZSBzYnAuc2xpY2VfZnJvbShcImlxVVwiKTt
21167icmVha319fWJyZWFrO2Nhc2UgOTpzYnAuc2xpY2VfZnJvbShcImVhdVwiKTticmVhaztjYXNlIDEwOmlmKCFyX1IxKCkpcmV0dXJuIGZhbHNlO3NicC5zbGljZV9mcm9tKFwiYWxcIik7YnJlYWs7Y2FzZSAxMTppZihyX1IyKCkpc2JwLnNsaWNlX2RlbCgpO2Vsc2UgaWYoIXJfUjEoKSlyZXR1cm4gZmFsc2U7ZWxzZSBzYnAuc2xpY2VfZnJvbShcImV1eFwiKTticmVhaztjYXNlIDEyOmlmKCFyX1IxKCl8fCFzYnAub3V0X2dyb3VwaW5nX2IoZ192LDk3LDI1MSkpcmV0dXJuIGZhbHNlO3NicC5zbGljZV9kZWwoKTticmVhaztjYXNlIDEzOmlmKHJfUlYoKSlzYnAuc2xpY2VfZnJvbShcImFudFwiKTtyZXR1cm4gZmFsc2U7Y2FzZSAxNDppZihyX1JWKCkpc2JwLnNsaWNlX2Zyb20oXCJlbnRcIik7cmV0dXJuIGZhbHNlO2Nhc2UgMTU6dl8xPXNicC5saW1pdC1zYnAuY3Vyc29yO2lmKHNicC5pbl9ncm91cGluZ19iKGdfdiw5NywyNTEpJiZyX1JWKCkpe3NicC5jdXJzb3I9c2JwLmxpbWl0LXZfMTtzYnAuc2xpY2VfZGVsKCl9cmV0dXJuIGZhbHNlfXJldHVybiB0cnVlfXJldHVybiBmYWxzZX1mdW5jdGlvbiByX2lfdmVyYl9zdWZmaXgoKXt2YXIgYW1vbmdfdmFyLHZfMTtpZihzYnAuY3Vyc29yPElfcFYpcmV0dXJuIGZhbHNlO3ZfMT1zYnAubGltaXRfYmFja3dhcmQ7c2JwLmxpbWl0X2JhY2t3YXJkPUlfcFY7c2JwLmtldD1zYnAuY3Vyc29yO2Ftb25nX3Zhcj1zYnAuZmluZF9hbW9uZ19iKGFfNSwzNSk7aWYoIWFtb25nX3Zhcil7c2JwLmxpbWl0X2JhY2t3YXJkPXZfMTtyZXR1cm4gZmFsc2V9c2JwLmJyYT1zYnAuY3Vyc29yO2lmKGFtb25nX3Zhcj09MSl7aWYoIXNicC5vdXRfZ3JvdXBpbmdfYihnX3YsOTcsMjUxKSl7c2JwLmxpbWl0X2JhY2t3YXJkPXZfMTtyZXR1cm4gZmFsc2V9c2JwLnNsaWNlX2RlbCgpfXNicC5saW1pdF9iYWNrd2FyZD12XzE7cmV0dXJuIHRydWV9ZnVuY3Rpb24gcl92ZXJiX3N1ZmZpeCgpe3ZhciBhbW9uZ192YXIsdl8yLHZfMztpZihzYnAuY3Vyc29yPElfcFYpcmV0dXJuIGZhbHNlO3ZfMj1zYnAubGltaXRfYmFja3dhcmQ7c2JwLmxpbWl0X2JhY2t3YXJkPUlfcFY7c2JwLmtldD1zYnAuY3Vyc29yO2Ftb25nX3Zhcj1zYnAuZmluZF9hbW9uZ19iKGFfNiwzOCk7aWYoIWFtb25nX3Zhcil7c2JwLmxpbWl0X2JhY2t3YXJkPXZfMjtyZXR1cm4gZmFsc2V9c2JwLmJyYT1zYnAuY3Vyc29yO3N3aXRjaC
21167hhbW9uZ192YXIpe2Nhc2UgMTppZighcl9SMigpKXtzYnAubGltaXRfYmFja3dhcmQ9dl8yO3JldHVybiBmYWxzZX1zYnAuc2xpY2VfZGVsKCk7YnJlYWs7Y2FzZSAyOnNicC5zbGljZV9kZWwoKTticmVhaztjYXNlIDM6c2JwLnNsaWNlX2RlbCgpO3ZfMz1zYnAubGltaXQtc2JwLmN1cnNvcjtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmVxX3NfYigxLFwiZVwiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO3NicC5zbGljZV9kZWwoKX1lbHNlIHNicC5jdXJzb3I9c2JwLmxpbWl0LXZfMzticmVha31zYnAubGltaXRfYmFja3dhcmQ9dl8yO3JldHVybiB0cnVlfWZ1bmN0aW9uIHJfcmVzaWR1YWxfc3VmZml4KCl7dmFyIGFtb25nX3Zhcix2XzE9c2JwLmxpbWl0LXNicC5jdXJzb3Isdl8yLHZfNCx2XzU7c2JwLmtldD1zYnAuY3Vyc29yO2lmKHNicC5lcV9zX2IoMSxcInNcIikpe3NicC5icmE9c2JwLmN1cnNvcjt2XzI9c2JwLmxpbWl0LXNicC5jdXJzb3I7aWYoc2JwLm91dF9ncm91cGluZ19iKGdfa2VlcF93aXRoX3MsOTcsMjMyKSl7c2JwLmN1cnNvcj1zYnAubGltaXQtdl8yO3NicC5zbGljZV9kZWwoKX1lbHNlIHNicC5jdXJzb3I9c2JwLmxpbWl0LXZfMX1lbHNlIHNicC5jdXJzb3I9c2JwLmxpbWl0LXZfMTtpZihzYnAuY3Vyc29yPj1JX3BWKXt2XzQ9c2JwLmxpbWl0X2JhY2t3YXJkO3NicC5saW1pdF9iYWNrd2FyZD1JX3BWO3NicC5rZXQ9c2JwLmN1cnNvcjthbW9uZ192YXI9c2JwLmZpbmRfYW1vbmdfYihhXzcsNyk7aWYoYW1vbmdfdmFyKXtzYnAuYnJhPXNicC5jdXJzb3I7c3dpdGNoKGFtb25nX3Zhcil7Y2FzZSAxOmlmKHJfUjIoKSl7dl81PXNicC5saW1pdC1zYnAuY3Vyc29yO2lmKCFzYnAuZXFfc19iKDEsXCJzXCIpKXtzYnAuY3Vyc29yPXNicC5saW1pdC12XzU7aWYoIXNicC5lcV9zX2IoMSxcInRcIikpYnJlYWt9c2JwLnNsaWNlX2RlbCgpfWJyZWFrO2Nhc2UgMjpzYnAuc2xpY2VfZnJvbShcImlcIik7YnJlYWs7Y2FzZSAzOnNicC5zbGljZV9kZWwoKTticmVhaztjYXNlIDQ6aWYoc2JwLmVxX3NfYigyLFwiZ3VcIikpc2JwLnNsaWNlX2RlbCgpO2JyZWFrfX1zYnAubGltaXRfYmFja3dhcmQ9dl80fX1mdW5jdGlvbiByX3VuX2RvdWJsZSgpe3ZhciB2XzE9c2JwLmxpbWl0LXNicC5jdXJzb3I7aWYoc2JwLmZpbmRfYW1vbmdfYihhXzgsNSkpe3NicC5jdXJzb3I9c2JwLmxpbWl0LXZfMTtzYnAua2V0PXNicC5jdXJzb3I7aWYoc2JwLmN1cnNvcj5zYnAubGltaXRfYmFja3dhcmQpe3NicC5jdXJzb3ItLTtzYnAuYnJhPXNicC5jdXJzb3I7c2JwLnNsaWNlX2RlbCgpfX19ZnVuY3Rpb24gcl91bl9hY2NlbnQoKXt2YXIgdl8xLHZfMj0xO3doaWxlKHNicC5vdXRfZ3JvdXBpbmdfYihnX3YsOTcsMjUxKSl2XzItLTtpZih2XzI8PTApe3NicC5rZXQ9c2JwLmN1cnNvcjt2XzE9c2JwLmxpbWl0LXNicC5jdXJzb3I7aWYoIXNicC5lcV9zX2IoMSxcIsOpXCIpKXtzYnAuY3Vyc29yPXNicC5saW1pdC12XzE7aWYoIXNicC5lcV9zX2IoMSxcIsOoXCIpKXJldHVybn1zYnAuYnJhPXNicC5jdXJzb3I7c2JwLnNsaWNlX2Zyb20oXCJlXCIpfX1mdW5jdGlvbiBoYWJyNSgpe2lmKCFyX3N0YW5kYXJkX3N1ZmZpeCgpKXtzYnAuY3Vyc29yPXNicC5saW1pdDtpZighcl9pX3ZlcmJfc3VmZml4KCkpe3NicC5jdXJzb3I9c2JwLmxpbWl0O2lmKCFyX3ZlcmJfc3VmZml4KCkpe3NicC5jdXJzb3I9c2JwLmxpbWl0O3JfcmVzaWR1YWxfc3VmZml4KCk7cmV0dXJufX19c2JwLmN1cnNvcj1zYnAubGltaXQ7c2JwLmtldD1zYnAuY3Vyc29yO2lmKHNicC5lcV9zX2IoMSxcIllcIikpe3NicC5icmE9c2JwLmN1cnNvcjtzYnAuc2xpY2VfZnJvbShcImlcIil9ZWxzZXtzYnAuY3Vyc29yPXNicC5saW1pdDtpZihzYnAuZXFfc19iKDEsXCLDp1wiKSl7c2JwLmJyYT1zYnAuY3Vyc29yO3NicC5zbGljZV9mcm9tKFwiY1wiKX19fXRoaXMuc3RlbT1mdW5jdGlvbigpe3ZhciB2XzE9c2JwLmN1cnNvcjtyX3ByZWx1ZGUoKTtzYnAuY3Vyc29yPXZfMTtyX21hcmtfcmVnaW9ucygpO3NicC5saW1pdF9iYWNrd2FyZD12XzE7c2JwLmN1cnNvcj1zYnAubGltaXQ7aGFicjUoKTtzYnAuY3Vyc29yPXNicC5saW1pdDtyX3VuX2RvdWJsZSgpO3NicC5jdXJzb3I9c2JwLmxpbWl0O3JfdW5fYWNjZW50KCk7c2JwLmN1cnNvcj1zYnAubGltaXRfYmFja3dhcmQ7cl9wb3N0bHVkZSgpO3JldHVybiB0cnVlfX07cmV0dXJuIGZ1bmN0aW9uKHdvcmQpe3N0LnNldEN1cnJlbnQod29yZCk7c3Quc3RlbSgpO3JldHVybiBzdC5nZXRDdXJyZW50KCl9fSgpO2x1bnIuUGlwZWxpbmUucmVnaXN0ZXJGdW5jdGlvbihsdW5yLmZyLnN0ZW1tZXIsXCJzdGVtbWVyLWZyXCIpO2x1bnIuZnIuc3RvcFdvcmRGaWx0ZXI9ZnVuY3Rpb24odG9rZW4pe2lmKGx1bnIuZnIuc3RvcFdvcmRGaWx0ZXIuc3RvcFdvcmRzLmluZGV4T2YodG9rZW4pPT09LTEpe3JldHVybiB0b2tlbn19O2x1bnIuZnIuc3RvcFdvcmRGaWx0ZXIuc3RvcFdvcmRzPW5ldyBsdW5yLlNvcnRlZFNldDtsdW5yLmZyLnN0b3BXb3JkRmlsdGVyLnN0b3BXb3Jkcy5sZW5ndGg9MTY0O2x1bnIuZnIuc3RvcFdvcmRGaWx0ZXIuc3RvcFdvcmRzLmVsZW1lbnRzPVwiIGFpIGFpZSBhaWVudCBhaWVzIGFpdCBhcyBhdSBhdXJhIGF1cmFpIGF1cmFpZW50IGF1cmFpcyBhdXJhaXQgYXVyYXMgYXVyZXogYXVyaWV6IGF1cmlvbnMgYXVyb25zIGF1cm9udCBhdXggYXZhaWVudCBhdmFpcyBhdmFpdCBhdmVjIGF2ZXogYXZpZXogYXZpb25zIGF2b25zIGF5YW50IGF5ZXogYXlvbnMgYyBjZSBjZWNpIGNlbMOgIGNlcyBjZXQgY2V0dGUgZCBkYW5zIGRlIGRlcyBkdSBlbGxlIGVuIGVzIGVzdCBldCBldSBldWUgZXVlcyBldXJlbnQgZXVzIGV1c3NlIGV1c3NlbnQgZXVzc2VzIGV1c3NpZXogZXVzc2lvbnMgZXV0IGV1eCBlw7ttZXMgZcO7dCBlw7t0ZXMgZnVyZW50IGZ1cyBmdXNzZSBmdXNzZW50IGZ1c3NlcyBmdXNzaWV6IGZ1c3Npb25zIGZ1dCBmw7ttZXMgZsO7dCBmw7t0ZXMgaWNpIGlsIGlscyBqIGplIGwgbGEgbGUgbGVzIGxldXIgbGV1cnMgbHVpIG0gbWEgbWFpcyBtZSBtZXMgbW9pIG1vbiBtw6ptZSBuIG5lIG5vcyBub3RyZSBub3VzIG9uIG9udCBvdSBwYXIgcGFzIHBvdXIgcXUgcXVlIHF1ZWwgcXVlbGxlIHF1ZWxsZXMgcXVlbHMgcXVpIHMgc2Egc2FucyBzZSBzZXJhIHNlcmFpIHNlcmFpZW50IHNlcmFpcyBzZXJhaXQgc2VyYXMgc2VyZXogc2VyaWV6IHNlcmlvbnMgc2Vyb25zIHNlcm9udCBzZXMgc29pIHNvaWVudCBzb2lzIHNvaXQgc29tbWVzIHNvbiBzb250IHNveWV6IHNveW9ucyBzdWlzIHN1ciB0IHRhIHRlIHRlcyB0b2kgdG9uIHR1IHVuIHVuZSB2b3Mgdm90cmUgdm91cyB5IMOgIMOpdGFpZW50IMOpdGFpcyDDqXRhaXQgw6l0YW50IMOpdGlleiDDqXRpb25zIMOpdMOpIMOpdMOpZSDDqXTDqWVzIMOpdMOpcyDDqnRlc1wiLnNwbGl0KFwiIFwiKTtsdW5yLlBpcGVsaW5lLnJlZ2lzdGVyRnVuY3Rpb24obHVuci5mci5zdG9wV29yZEZpbHRlcixcInN0b3BXb3JkRmlsdGVyLWZyXCIpfX0pO1xuIiwiKGZ1bmN0aW9uICgkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgd2luZG93LmRh
21167dGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgW107XG4gICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgZXZlbnQ6ICdqUXVlcnlMb2FkZWQnXG4gICAgfSk7XG5cbiAgICAkLmZuLmNmRGF0ZXBpY2tlciA9ICQuZm4uZGF0ZXBpY2tlci5ub0NvbmZsaWN0KCk7XG5cbiAgICBpZiAod2luZG93LnN0YXRpYykge1xuICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoYm94X19mb3JtX19pbnB1dCcpLmZvckVhY2goZnVuY3Rpb24gKHNlYXJjaEZpZWxkKSB7XG4gICAgICAgICAgICBhdXRvY29tcGxldGUoc2VhcmNoRmllbGQsIFtcbiAgICAgICAgICAgICAgICAnQXBwZWxzIMOgIHByb2pldHMgZ8OpbsOpcmlxdWUnLFxuICAgICAgICAgICAgICAgICdBcHBlbCDDoCBwcm9qZXRzIHNww6ljaWZpcXVlJyxcbiAgICAgICAgICAgICAgICAnQXBwZWxzIMOgIHByb2pldHMgJiBpbnZlc3Rpc3NlbWVudHMgZOKAmWF2ZW5pcicsXG4gICAgICAgICAgICAgICAgJ1Byb2pldHMgZmluYW5jw6lzJyxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mKE5vZGVMaXN0LnByb3RvdHlwZS5mb3JFYWNoKSE9PXR5cGVvZihhbGVydCkpIHtcbiAgICAgICAgTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2g9QXJyYXkucHJvdG90eXBlLmZvckVhY2g7XG4gICAgfVxuICAgIFxuICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50YWctZG93bmxvYWQnKS5mb3JFYWNoKGZ1bmN0aW9uICh0YWcpIHtcbiAgICAgICAgdGFnLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZSgnaGlkZScpO1xuICAgICAgICB9KTtcbiAgICB9KTtcblxuICAgIGxldCAkYm9keSA9ICQoJ2JvZHknKTtcbiAgICAkYm9keS5vbignY2hhbmdlJywgJy5zaXRlcy1zZWxlY3RfX3NlbGVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbG9jYXRpb24uYXNzaWduKHRoaXMuc2VsZWN0ZWRPcHRpb25zWzBdLnZhbHVlKTtcbiAgICB9KTtcblxuICAgIC8vIEdlc3Rpb24gZGVzIGNhdMOpZ29yaWVzIGRhbnMgbGEgRkFRXG4gICAgbGV0ICRjaGVja2JveGVzID0gJCgnLmZvcm0tY2hlY2tib3gtc3R5bGVkJyk7XG4gICAgaWYgKCRjaGVja2JveGVzLmxlbmd0aCkge1xuICAgICAgICB2Y
21167XIgY2F0ZWdvcmllcyA9IFtdO1xuICAgICAgICB2YXIgY2F0ZWdvcmllc0h0bWwgPSBbXTtcbiAgICAgICAgdmFyIGNwdCA9IDE7XG4gICAgICAgICQoJy5jYXJkIC5jYXRlZ29yaWVzIC50YWctdHlwZScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGh0bWwgPSAnJztcbiAgICAgICAgICAgIGlmICgkLmluQXJyYXkoJCh0aGlzKS5odG1sKCksIGNhdGVnb3JpZXMpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGh0bWwgPSAnPGxhYmVsIGZvcj1cImNoZWNrYm94JyArIGNwdCArICdcIiBjbGFzcz1cInRhZy1pbnB1dC1jaGVja2JveFwiPic7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGlkPVwiY2hlY2tib3gnICsgY3B0ICsgJ1wiIG5hbWU9XCJ0eXBlMlwiPic7XG4gICAgICAgICAgICAgICAgaHRtbCArPSAnPGRpdiBjbGFzcz1cInRhZy1pbnB1dC1jaGVja2JveF9fYmdcIj48L2Rpdj4nO1xuICAgICAgICAgICAgICAgIGh0bWwgKz0gJzxzcGFuPicgKyAkKHRoaXMpLmh0bWwoKSArICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICBodG1sICs9ICc8L2xhYmVsPic7XG5cbiAgICAgICAgICAgICAgICBjYXRlZ29yaWVzLnB1c2goJCh0aGlzKS5odG1sKCkpO1xuICAgICAgICAgICAgICAgIGNhdGVnb3JpZXNIdG1sLnB1c2goaHRtbCk7XG4gICAgICAgICAgICAgICAgY3B0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICRjaGVja2JveGVzLmh0bWwoY2F0ZWdvcmllc0h0bWwpO1xuXG4gICAgICAgIC8vIEdlc3Rpb24gZGUgbCdhZmZpY2hhZ2UgZGVzIHF1ZXN0aW9ucyBncsOiY2UgYXUgZmlsdHJlIGRlcyBjYXTDqWdvcmllc1xuICAgICAgICAkYm9keS5vbignY2xpY2snLCAnLnRhZy1pbnB1dC1jaGVja2JveCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2Y
21167XIgY2F0ZWdvcnkgPSAnJztcbiAgICAgICAgICAgIHZhciBmaWx0ZXIgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCAkY2hlY2tib3ggPSAkKCcudGFnLWlucHV0LWNoZWNrYm94Jyk7XG4gICAgICAgICAgICAkY2hlY2tib3guZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQodGhpcykuZmluZCgnaW5wdXQnKS5wcm9wKCdjaGVja2VkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgICAgICAkY2hlY2tib3guZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5ID0gJCh0aGlzKS5maW5kKCdzcGFuJykuaHRtbCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCdpbnB1dCcpLnByb3AoJ2NoZWNrZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhcmQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuY2F0ZWdvcmllcyAudGFnLXR5cGUnKS5odG1sKCkgPT09IGNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuc2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmNhcmQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJCh0aGlzKS5maW5kKCcuY2F0ZWdvcmllcyAudGFnLXR5cGUnKS5odG1sKCkgPT09IGNhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJy5jYXJkJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuc2hvdygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59KShqUXVlcnkpO1xuIiwiZnVuY3Rpb24gYXV0b2NvbXBsZXRlKGlucHV0LCBhcnIpIHtcbiAgICBsZXQgY3VycmVudEZvY3VzLFxuICAgICAgICAkaXRlbWxpc3QgPSBbXSxcbiAgICAgICAgJHJlc3VsdHMgPSBqUXVlcnkoaW5wdXQpLmNsb3Nlc3QoJy5zZWFyY2gtZm9ybScpLnBhcmVudCgpLmZpbmQoJy5zZWFyY2gtcmVzdWx0cycpLFxuICAgICAgICAkZm9ybSA9IGpRdWVyeShpbnB1dCkuY2xvc2VzdCgnZm9ybScpLFxuICAgICAgICBjbG9zZVRpbWVvdXQgPSBudWxsO1xuXG4gICAgbGV0IGFkZEFjdGl2ZSA9IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIGlmICgheCkgcmV0dXJuIGZhbHNlO1xuXG4gICAgICAgIHJlbW92ZUFjdGl2ZSh4KTtcblxuICAgICAgICBpZiAoY3VycmVudEZvY3VzID49IHgubGVuZ3RoKSBjdXJyZW50Rm9jdXMgPSAwO1xuICAgICAgICBpZiAoY3VycmVudEZvY3VzIDwgMCkgY3VycmVudEZvY3VzID0gKHgubGVuZ3RoIC0gMSk7XG5cbiAgICAgICAgeFtjdXJyZW50Rm9jdXNdLmNsYXNzTGlzdC5hZGQoJ2hvdmVyJyk7XG4gICAgfTtcblxuICAgIGxldCByZW1vdmVBY3RpdmUgPSBmdW5jdGlvbih4KSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgeFtpXS5jbGFzc0xpc3QucmVtb3ZlKCdob3ZlcicpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIGxldCBjbG9zZUFsbExpc3RzID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIGlmIChjbG9zZVRpbWVvdXQpIHtcbiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoY2xvc2VUaW1lb3V0KTtcbiAgICAgICAgICAgIGNsb3NlVGltZW91dCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRpdGVtbGlzdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICRpdGVtbGlzdC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUgJiYgdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJGl0ZW1saXN0ID0gW107XG4gICAgICAgICRyZXN1bHRzLmhpZGUoKTtcbiAgICB9O1xuXG4gICAgaW5wdXQuc2V0Q2hvaWNlcyA9IGZ1bmN0aW9uKGNob2ljZXMpIHtcbiAgICAgICAgY3VycmVudEZvY3VzID0gLTE7XG4gICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcbiAgICAgICAgaWYgKGNob2ljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ1VMJyk7XG4gICAgICAgIGEuc2V0QXR0cmlidXRlKCdjbGFzcycsICdhdXRvY29tcGxldGUtaXRlbXMnKTtcbiAgICAgICAgJGl0ZW1saXN0ID0gJChhKTtcblxuICAgICAgICBsZXQgY29udGFpbmVyID0gdGhpcy5wYXJlbnROb2RlLnBhcmVudE5vZGU7XG5cbiAgICAgICAgJHJlc3VsdHMuYXBwZW5kKGEpO1xuICAgICAgICAkcmVzdWx0cy5zaG93KCk7XG5cbiAgICAgICAgbGV0IHZhbCA9IGlucHV0LnZhbHVlO1xuICAgICAgICBsZXQgJHRtcCA9ICQoJzxwPjwvcD4nKTtcbiAgICAgICAgalF1ZXJ5LmVhY2goY2hvaWNlcywgZnVuY3Rpb24gKHRlcm0sIHRlcm1JbmRleCkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSBwYXJzZUludCh0ZXJtLnRvVXBwZXJDYXNlKCkuaW5kZXhPZih2YWwudG9VcHBlckNhc2UoKSkpO1xuXG4gICAgICAgICAgICBpZiAoc3RhcnRJbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgYiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0xJJyk7XG4gICAgICAgICAgICAgICAgYyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ0EnKTtcblxuICAgICAgICAgICAgICAgIGMuaW5uZXJIVE1MID0gJHRtcC50ZXh0KHRlcm0uc3Vic3RyKDAsIHN0YXJ0SW5kZXgpKS5odG1sKCk7XG4gICAgICAgICAgICAgICAgYy5pbm5lckhUTUwgKz0gXCI8c3Ryb25nPlwiICsgJHRtcC50ZXh0KHRlcm0uc3Vic3RyKHN0YXJ0SW5kZXgsIHZhbC5sZW5ndGgpKS5odG1sKCkgKyBcIjwvc3Ryb25nPlwiO1xuICAgICAgICAgICAgICAgIGMuaW5uZXJIVE1MICs9ICR0bXAudGV4dCh0ZXJtLnN1YnN0cihzdGFydEluZGV4ICsgdmFsLmxlbmd0aCkpLmh0bWwoKTtcbiAgICAgICAgICAgICAgICBjLmlubmVySFRNTCArPSBcIjxzcGFuIGNsYXNzPVxcXCJjb3VudFxcXCI+KFwiICsgJHRtcC50ZXh0KHRlcm1JbmRleCkuaHRtbCgpICsgXCIpPC9zcGFuPlwiO1xuICAgICAgICAgICAgICAgIGIuY2hvaWNlID0gdGVybTtcblxuICAgICAgICAgICAgICAgIGIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbHVlID0gdGhpcy5jaG9pY2U7XG4gICAgICAgICAgICAgICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRmb3JtLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGZvcm1bMF0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgICAgI
21167H1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5jbGljaygpO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgYi5hcHBlbmRDaGlsZChjKTtcbiAgICAgICAgICAgICAgICBhLmFwcGVuZENoaWxkKGIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgaWYgKHdpbmRvdy5zdGF0aWMpIHtcbiAgICAgICAgaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgYSwgYiwgYywgaSwgdmFsID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcblxuICAgICAgICAgICAgaWYgKCF2YWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuc2V0Q2hvaWNlcyhhcnIpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgbGV0IHggPSAkaXRlbWxpc3RbMF07XG5cbiAgICAgICAgaWYgKHgpIHggPSB4LmNoaWxkTm9kZXM7XG4gICAgICAgIGVsc2UgcmV0dXJuO1xuXG4gICAgICAgIGlmIChlLmtleUNvZGUgPT09IDQwKSB7XG4gICAgICAgICAgICBjdXJyZW50Rm9jdXMrKztcbiAgICAgICAgICAgIGFkZEFjdGl2ZSh4KTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDM4KSB7XG4gICAgICAgICAgICBjdXJyZW50Rm9jdXMtLTtcbiAgICAgICAgICAgIGFkZEFjdGl2ZSh4KTtcbiAgICAgICAgfSBlbHNlIGlmIChlLmtleUNvZGUgPT09IDEzKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudEZvY3VzID4gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoeCkgeFtjdXJyZW50Rm9jdXNdLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZS5rZXlDb2RlID09PSAyNykge1xuICAgICAgICAgICAgY2xvc2VBbGxMaXN0cygpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBsZXQgJGNsb3NlID0gJGZvcm0ubmV4dCgnLnNlYXJjaC1jbG9zZScpO1xuICAgIGlmICgkY2xvc2UubGVuZ3RoID4gMCkge1xuICAgICAgICAkY2xvc2Uub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaW5wdXQudmFsdWUgPSAnJztcbiAgICAgICAgICAgIGNsb3NlQWxsTGlzdHMoKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgalF1ZXJ5KGlucHV0KS5vbignYmx1cicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGNsb3NlVGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGNsb3NlVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgY2xvc2VBbGxMaXN0cygpO1xuICAgICAgICAgICAgfSwgMjAwKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGlucHV0LnNldENob2ljZXMoYXJyKTtcbn1cbiIsIihmdW5jdGlvbiAoJCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGxldCBjb250YWN0Rm9ybVRvZ2dsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdqc0NvbnRhY3RGb3JtVG9nZ2xlQnV0dG9uJyk7XG4gICAgaWYgKGNvbnRhY3RGb3JtVG9nZ2xlKSB7XG4gICAgICAgIGNvbnRhY3RGb3JtVG9nZ2xlLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdGhpcy5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgICAgdXBkYXRlQ29udGFjdEZvcm0oKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGxldCAkY29udGFjdEZvcm1TZWxlY3QgPSAkKCcuanNDb250YWN0Rm9ybVRvZ2dsZVNlbGVjdCcpO1xuICAgIGlmICgkY29udGFjdEZvcm1TZWxlY3QpIHtcbiAgICAgICAgJGNvbnRhY3RGb3JtU2VsZWN0Lm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICgkKCcjanNDb250YWN0Rm9ybVRvZ2dsZUJ1dHRvbicpLnBhcmVudCgpLmhhc0NsYXNzKCdkLW5vbmUnKSkge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRhY3RGb3JtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHVwZGF0ZUNvbnRhY3RGb3JtKCkge1xuICAgICAgICB2Y
21167XIgY2lkID0gJGNvbnRhY3RGb3JtU2VsZWN0LnZhbCgpLFxuICAgICAgICAgICAgbGFiZWwgPSAkY29udGFjdEZvcm1TZWxlY3QuZmluZCgnb3B0aW9uOnNlbGVjdGVkJykudGV4dCgpO1xuXG4gICAgICAgICQoJy5qc0NvbnRhY3RGb3JtVG9nZ2xlQXJlYSA+IGRpdicpLnJlbW92ZUNsYXNzKCdzaG93Jyk7XG4gICAgICAgICQoJy5qc0NvbnRhY3RGb3JtVG9nZ2xlQXJlYScpLmZpbmQoJyNjJyArIGNpZCkuYWRkQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgJCgnLmpzQ29udGFjdEZvcm1Ub2dnbGVBcmVhIC5zaG93IC5pbnB1dC1oaWRkZW4tc3ViamVjdCBpbnB1dCcpLnZhbChsYWJlbCk7XG4gICAgfVxuXG4gICAgJC51cmxQYXJhbSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgICAgIHZhciByZXN1bHRzID0gbmV3IFJlZ0V4cCgnWz8mXScgKyBuYW1lICsgJz0oW14mXSopJykuZXhlYyhsb2NhdGlvbi5zZWFyY2gpXG4gICAgICAgIGlmIChyZXN1bHRzID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNbMV0gfHwgMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoJC51cmxQYXJhbSgncmVhbEZvcm1JZCcpKSB7XG4gICAgICAgIHZhciByZWFsRm9ybUlkID0gJC51cmxQYXJhbSgncmVhbEZvcm1JZCcpO1xuICAgICAgICAkY29udGFjdEZvcm1TZWxlY3QudmFsKHJlYWxGb3JtSWQpO1xuICAgICAgICAkKCcjYycgKyByZWFsRm9ybUlkKS5zaG93KCk7XG4gICAgICAgICQoJy5qc0NvbnRhY3RGb3JtVG9nZ2xlU2VsZWN0QXJlYScpLmhpZGUoKTtcbiAgICAgICAgJCgnI2pzQ29udGFjdEZvcm1Ub2dnbGVCdXR0b24nKS5oaWRlKCk7XG4gICAgfVxufSkoalF1ZXJ5KTtcbiIsIi8qZ2xvYmFsIEZhcVNlYXJjaCovXG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIG5ldyBGYXFTZWFyY2goXCJmclwiKTtcbn0pO1xuIiwiLypnbG9iYWwgbHVuciovXG5cbnZhciBGYXFTZWFyY2ggPSBmdW5jdGlvbiAobGFuZywgb3B0aW9ucykge1xuICAgIGlmIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhcS1zZWFyY2gtZm9ybVwiKSkge1xuICAgICAgICB0aGlzLmluaXQobGFuZywgb3B0aW9ucyk7XG4gICAgfVxufTtcblxuRmFxU2VhcmNoLnByb3RvdHlwZSA9IHtcblxuICAgIGluaXQ6IGZ1bmN0aW9uIChsYW5nLCBvcHRpb25zKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgdGhpcy5sYW5nID0gbGFuZztcbiAgICAgICAgaWYgKG9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3B0aW9ucyA9IHtcInRpdGxlQm9vc3RcIjogMywgXCJ0aHJlc2hvbGRcIjogdW5kZWZpbmVkfTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpdGxlQm9vc3QgPSBvcHRpb25zLnRpdGxlQm9vc3Q7XG4gICAgICAgIGlmICh0aGlzLmxhbmcgPT0gXCJmclwiKSB7XG4gICAgICAgICAgICB0aGlzLmlkeCA9IGx1bnIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMudXNlKGx1bnIuZnIpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJywge2Jvb3N0OiB0aGlzLnRpdGxlQm9vc3R9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxhbmcgPT0gXCJlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmlkeCA9IGx1bnIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJywge2Jvb3N0OiB0aGlzLnRpdGxlQm9vc3R9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyZXNob2xkID0gb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMuZ3JvdXBzID0gW107XG4gICAgICAgIHRoaXMuaW5kZXgoKTtcblxuICAgICAgICAvLyBGb3JtXG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICBkb2
21167N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhcS1zZWFyY2gtZm9ybVwiKS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcImZhcS1zZWFyY2gtaW5wdXRcIik7XG4gICAgICAgIHRoaXMuaW5wdXQuYWRkRXZlbnRMaXN0ZW5lcihcImtleXVwXCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChzZWxmLnRpbWVyKTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBldmVudC50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNldCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHNlbGYuc2VhcmNoLmJpbmQoc2VsZiksIDM1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgaW5kZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGdyb3Vwc0NvbnRlbmV1ciA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJncm91cGVRdWVzdGlvbnNMdW5yXCIpO1xuICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IGdyb3Vwc0NvbnRlbmV1ci5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgdmFyIGdyb3VwT2JqID0gZ3JvdXBzQ29udGVuZXVyW2NdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJpbm5lclwiKVswXTtcbiAgICAgICAgICAgIHZhciBncm91cCA9IHtcbiAgICAgICAgICAgICAgICBpZDogZ3JvdXBPYmouZ2V0QXR0cmlidXRlKFwiaWRcIiksXG4gICAgICAgICAgICAgICAgcXVlc3Rpb25zOiB7fSxcbiAgICAgICAgICAgICAgICByZXN1bHRzOiB7fSxcbiAgICAgICAgICAgICAgICBvYmo6IGdyb3VwT2JqXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdmFyIHF1ZXN0aW9ucyA9IGdyb3Vwc0NvbnRlbmV1cltjXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiUXVlc3Rpb25zTHVuclwiKVswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKFwiaW5uZXJcIik7XG4gICAgICAgICAgICBmb3IgKHZhciBxID0gMDsgcSA8IHF1ZXN0aW9ucy5sZW5ndGg7IHErKykge1xuICAgICAgICAgICAgICAgIHZhciBxdWVzdGlvbk9iaiA9IHF1ZXN0aW9uc1txXTtcbiAgICAgICAgICAgICAgICB2Y
21167XIgcXVlc3Rpb24gPSB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBxdWVzdGlvbk9iai5nZXRBdHRyaWJ1dGUoXCJpZFwiKSxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHF1ZXN0aW9uT2JqLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaDJcIilbMF0udGV4dENvbnRlbnQucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICAgICAgICAgIGJvZHk6IHF1ZXN0aW9uT2JqLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoXCJjZS10ZXh0cGljXCIpWzBdLnRleHRDb250ZW50LnJlcGxhY2UoL1wiL2csIFwiXCIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmlkeC5hZGQocXVlc3Rpb24pO1xuICAgICAgICAgICAgICAgIHF1ZXN0aW9uLm9iaiA9IHF1ZXN0aW9uT2JqO1xuICAgICAgICAgICAgICAgIGdyb3VwLnF1ZXN0aW9uc1txdWVzdGlvbi5pZF0gPSBxdWVzdGlvbjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzLnB1c2goZ3JvdXApO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNlYXJjaFwiLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgdmFyIHJlc3VsdHMgPSB0aGlzLmlkeC5zZWFyY2godGhpcy52YWx1ZSk7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgICAgICBpZiAodGhpcy50aHJlc2hvbGQgPT09IHVuZGVmaW5lZCB8fCByZXN1bHQuc2NvcmUgPiB0aGlzLnRocmVzaG9sZCkge1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGcgPSAwOyBnIDwgdGhpcy5ncm91cHMubGVuZ3RoOyBnKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cHNbZ107XG4gICAgICAgICAgICAgICAgICAgIGlmIChncm91cC5xdWVzdGlvbnNbcmVzdWx0LnJlZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAucmVzdWx0c1tyZXN1bHQucmVmXSA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICB0aGlzLnZhbHVlID0gXCJcIjtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSxcblxuICAgIGhpZGU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCB0aGlzLmdyb3Vwcy5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cHNbZ107XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoZ3JvdXAucmVzdWx0cykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZ3JvdXAub2JqLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAodmFyIHF1ZXN0aW9uIGluIGdyb3VwLnF1ZXN0aW9ucykge1xuICAgICAgICAgICAgICAgIGlmIChncm91cC5yZXN1bHRzW3F1ZXN0aW9uXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnF1ZXN0aW9uc1txdWVzdGlvbl0ub2JqLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yICh2YXIgZyA9IDA7IGcgPCB0aGlzLmdyb3Vwcy5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgdmFyIGdyb3VwID0gdGhpcy5ncm91cHNbZ107XG4gICAgICAgICAgICBncm91cC5vYmouc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgIGdyb3VwLnJlc3VsdHMgPSB7fTtcbiAgICAgICAgICAgIGZvciAodmFyIHF1ZXN0aW9uIGluIGdyb3VwLnF1ZXN0aW9ucykge1xuICAgICAgICAgICAgICAgIGdyb3VwLnF1ZXN0aW9uc1txdWVzdGlvbl0ub2JqLnN0eWxlLmRpc3BsYXkgPSBcImJsb2NrXCI7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn07XG4iLCIvKiBnbG9iYWwgVGltZWxpbmVTZWFyY2guLi4qL1xuXG5kb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NQ29udGVudExvYWRlZFwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAkKCcudGltZWxpbmUnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBuZXcgVGltZWxpbmVTZWFyY2godGhpcy5fdGltZWxpbmVCaWcsIGpRdWVyeSgnaHRtbCcpLmF0dHIoJ2xhbmcnKSk7XG4gICAgfSk7XG59KTtcbiIsIi8qZ2xvYmFsIGx1bnIqL1xuXG52YXIgVGltZWxpbmVTZWFyY2ggPSBmdW5jdGlvbiAodGltZWxpbmVCaWcsIGxhbmcsIG9wdGlvbnMpIHtcbiAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoXCJ0aW1lbGluZS1zZWFyY2gtZm9ybVwiKSkge1xuICAgICAgICB0aGlzLmluaXQodGltZWxpbmVCaWcsIGxhbmcsIG9wdGlvbnMpO1xuICAgIH1cbn07XG5cblRpbWVsaW5lU2VhcmNoLnByb3RvdHlwZSA9IHtcbiAgICBpbml0OiBmdW5jdGlvbiAodGltZWxpbmVCaWcsIGxhbmcsIG9wdGlvbnMpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICB0aGlzLnRpbWVsaW5lQmlnID0gdGltZWxpbmVCaWc7XG4gICAgICAgIHRoaXMubGFuZyA9IGxhbmc7XG4gICAgICAgIGlmIChvcHRpb25zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSB7XCJ0aXRsZUJvb3N0XCI6IDMsIFwidGhyZXNob2xkXCI6IHVuZGVmaW5lZH07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy50aXRsZUJvb3N0ID0gb3B0aW9ucy50aXRsZUJvb3N0O1xuICAgICAgICBpZiAodGhpcy5sYW5nID09PSBcImZyXCIpIHtcbiAgICAgICAgICAgIHRoaXMuaWR4ID0gbHVucihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2UobHVuci5mcik7XG4gICAgICAgICAgICAgICAgdGhpcy5maWVsZCgndGl0bGUnLCB7Ym9vc3Q6IHNlbGYudGl0bGVCb29zdH0pO1xuICAgICAgICAgICAgICAgI
21167HRoaXMuZmllbGQoJ2JvZHknKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubGFuZyA9PT0gXCJlblwiKSB7XG4gICAgICAgICAgICB0aGlzLmlkeCA9IGx1bnIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmllbGQoJ3RpdGxlJywge2Jvb3N0OiBzZWxmLnRpdGxlQm9vc3R9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpZWxkKCdib2R5Jyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGhyZXNob2xkID0gb3B0aW9ucy50aHJlc2hvbGQ7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXTtcbiAgICAgICAgdGhpcy5pbmRleCgpO1xuICAgICAgICB0aGlzLnJlc3VsdHMgPSBbXTtcblxuICAgICAgICAvLyBGb3JtXG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpbWVsaW5lLXNlYXJjaC1pbnB1dFwiKS5hZGRFdmVudExpc3RlbmVyKFwic3VibWl0XCIsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuaW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChcInRpbWVsaW5lLXNlYXJjaC1pbnB1dFwiKTtcbiAgICAgICAgdGhpcy5pbnB1dC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICAgICB3aW5kb3cuY2xlYXJUaW1lb3V0KHNlbGYudGltZXIpO1xuICAgICAgICAgICAgbGV0IHZhbCA9IGV2ZW50LnRhcmdldC52YWx1ZTtcbiAgICAgICAgICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNldCgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh2YWwubGVuZ3RoID4gMykge1xuICAgICAgICAgICAgICAgIHNlbGYudmFsdWUgPSB2YWw7XG4gICAgICAgICAgICAgICAgc2VsZi50aW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHNlbGYuc2VhcmNoLmJpbmQoc2VsZiksIDM1MCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgaW5kZXg6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgbGV0IGl0ZW1zQ29udGVuZXVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGltZWxpbmVfX21vYmlsZScpO1xuICAgICAgICBsZXQgaXRlbXMgPSBpdGVtc0NvbnRlbmV1clswXS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1pdGVtJyk7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGl0ZW1PYmogPSBpdGVtc1tpXTtcbiAgICAgICAgICAgIGxldCBpdGVtID0ge1xuICAgICAgICAgICAgICAgIGlkOiBpdGVtT2JqLmdldEF0dHJpYnV0ZSgnZGF0YS11aWQnKSxcbiAgICAgICAgICAgICAgICB0aXRsZTogaXRlbU9iai5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1pdGVtX19jb250ZW50LXRpdGxlJylbMF0udGV4dENvbnRlbnQucmVwbGFjZSgvXCIvZywgXCJcIiksXG4gICAgICAgICAgICAgICAgYm9keTogJydcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChpdGVtT2JqLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RpbWVsaW5lLWl0ZW1fX2NvbnRlbnQtZGVzYycpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGl0ZW0uYm9keSA9IGl0ZW1PYmouZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGltZWxpbmUtaXRlbV9fY29udGVudC1kZXNjJylbMF0udGV4dENvbnRlbnQucmVwbGFjZSgvXCIvZywgXCJcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuaWR4LmFkZChpdGVtKTtcbiAgICAgICAgICAgIGl0ZW0ub2JqID0gaXRlbU9iajtcbiAgICAgICAgICAgIHRoaXMuaXRlbXNbaXRlbS5pZF0gPSBpdGVtO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNlYXJjaDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgIGlmICh0aGlzLnZhbHVlID09PSBcIlwiKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHRzID0gdGhpcy5pZHguc2VhcmNoKHRoaXMudmFsdWUpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSByZXN1bHRzW2ldO1xuICAgICAgICAgICAgaWYgKHRoaXMudGhyZXNob2xkID09PSB1bmRlZmluZWQgfHwgcmVzdWx0LnNjb3JlID4gdGhpcy50aHJlc2hvbGQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuaXRlbXMubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNbcmVzdWx0LnJlZl0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRzW3Jlc3VsdC5yZWZdID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5oaWRlKCk7XG4gICAgICAgIHRoaXMudmFsdWUgPSBcIlwiO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgaGlkZTogZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgZmlyc3RJZCA9IG51bGw7XG4gICAgICAgIGZvciAobGV0IGl0ZW0gaW4gdGhpcy5pdGVtcykge1xuICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0c1tpdGVtXSAhPT0gdW5kZWZpbmVkICYmIGZpcnN0SWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBmaXJzdElkID0gdGhpcy5pdGVtc1tpdGVtXS5pZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMucmVzdWx0c1tpdGVtXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpdGVtXS5vYmouY2xhc3NMaXN0LmFkZCgndGV4dGZpbHRlcicpO1xuICAgICAgICAgICAgICAgI
21167HRoaXMuaXRlbXNbaXRlbV0ub2JqLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRpbWVsaW5lQmlnLnNldERhdGEoKTtcbiAgICAgICAgdGhpcy50aW1lbGluZUJpZy52YXJzLnRpbWVsaW5lLmZvY3VzKGZpcnN0SWQpO1xuICAgIH0sXG5cbiAgICByZXNldDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnJlc3VsdHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaXRlbSBpbiB0aGlzLml0ZW1zKSB7XG4gICAgICAgICAgICB0aGlzLml0ZW1zW2l0ZW1dLm9iai5jbGFzc0xpc3QucmVtb3ZlKCd0ZXh0ZmlsdGVyJyk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pdGVtc1tpdGVtXS5vYmouY2xhc3NMaXN0LmNvbnRhaW5zKCdjaGVja2JveGZpbHRlcicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpdGVtXS5vYmouY2xhc3NMaXN0LnJlbW92ZSgnaGlkZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGltZWxpbmVCaWcuc2V0RGF0YSgpO1xuICAgIH1cbn07XG4iLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBsZXQgJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgbGV0IG1lbnUgPSB7XG4gICAgICAgIHZhcnM6IHtcbiAgICAgICAgICAgICRtYWluSGVhZGVyOiBudWxsLFxuICAgICAgICAgICAgJHByaW1hcnlNZW51OiBudWxsLFxuICAgICAgICAgICAgJHByaW1hcnlNZW51TGlua3M6IG51bGwsXG4gICAgICAgICAgICAkc3VibWVudUxpbmtzOiBudWxsLFxuICAgICAgICAgICAgJGNsb3NlTGlua3M6IG51bGwsXG4gICAgICAgICAgICAkbWVudVdyYXBwZXI6IG51bGwsXG4gICAgICAgICAgICAkc2VhcmNoYm94OiBudWxsLFxuICAgICAgICAgICAgc3VibWVudU9wZW5DbGFzczogJ2lzLW9wZW4tc3VibWVudScsXG4gICAgICAgICAgICBwcmltYXJ5QWN0aXZlQ2xhc3M6ICdpcy1hY3RpdmUtbWVudScsXG4gICAgICAgICAgICBzdWJtZW51QWN0aXZlQ2xhc3M6ICdpcy1hY3RpdmUtc3VibWVudScsXG4gICAgICAgICAgICBzZWFyY2hib3hBY3RpdmVDbGFzczogJ2lzLWFjdGl2ZS1zZWFyY2hib3gnXG4gICAgICAgIH0sXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMudmFycy4kbWFpbkhlYWRlciA9ICQoJy5tYWluLWhlYWRlcicpO1xuICAgICAgICAgICAgdGhpcy52YXJzLiRwcmltYXJ5TWVudSA9IHRoaXMudmFycy4kbWFpbkhlYWRlci5maW5kKCcucHJpbWFyeS1tZW51Jyk7XG4gICAgICAgICAgICB0aGlzLnZhcnMuJHByaW1hcnlNZW51TGlua3MgPSB0aGlzLnZhcnMuJHByaW1hcnlNZW51LmZpbmQoJy5wcmltYXJ5LW1lbnVfX2xpbmtbZGF0YS1zdWJtZW51XScpO1xuICAgICAgICAgICAgdGhpcy52YXJzLiRzdWJtZW51TGlua3MgPSB0aGlzLnZhcnMuJHByaW1hcnlNZW51LmZpbmQoJ2FbZGF0YS1zdWJtZW51XSwgYnV0dG9uW2RhdGEtc3VibWVudV0nKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kY2xvc2VMaW5rcyA9IHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLmNsb3NlLXN1Ym1lbnVbZGF0YS1jbG9zZS1zdWJtZW51XSwgLnN1Ym1lbnVfX2JyZWFkY3J1bWJzX19wcmV2W2RhdGEtY2xvc2Utc3VibWVudV0nKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kbWFpbm1lbnVMaW5rcyA9IHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnW2RhdGEtbWFpbm1lbnVdJyk7XG4gICAgICAgICAgICB0aGlzLnZhcnMuJG1lbnVXcmFwcGVyID0gdGhpcy52YXJzLiRwcmltYXJ5TWVudS5jbG9zZXN0KCcubWFpbi1oZWFkZXJfX25hdicpO1xuICAgICAgICAgICAgdGhpcy52YXJzLiRtb2JpbGVXcmFwcGVyID0gdGhpcy52YXJzLiRtYWluSGVhZGVyLmZpbmQoJy5tYWluLWhlYWRlcl9fbmF2YmFyLW1vYmlsZScpO1xuXG4gICAgICAgICAgICB0aGlzLnZhcnMuJHNlYXJjaGJveCA9ICQoJy5tYWluLWhlYWRlcl9fc2VhcmNoYm94IC5zZWFyY2hib3gnKTtcblxuICAgICAgICAgICAgdGhpcy5tdWx0aWxldmVsKCk7XG4gICAgICAgICAgICB0aGlzLnNpdGVzU2VsZWN0KCk7XG4gICAgICAgICAgICB0aGlzLmhhbWJ1cmdlcigpO1xuICAgICAgICAgICAgdGhpcy5zZWFyY2hib3goKTtcbiAgICAgICAgfSxcbiAgICAgICAgc2l0ZXNTZWxlY3Q6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCAkc2l0ZVNlbGVjdCA9ICQoJy5zaXRlcy1zZWxlY3RfX3NlbGVjdCcpO1xuXG4gICAgICAgICAgICAkc2l0ZVNlbGVjdC5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sXG4gICAgICAgIGhhbWJ1cmdlcjogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLnZhcnMuJG1haW5IZWFkZXIuZmluZCgnLmhhbWJ1cmdlcicpLm9uKCdjbGljaycsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAkYm9keS50b2dnbGVDbGFzcygnaXMtbWVudScpO1xuICAgICAgICAgICAgICAgIGlmICgkYm9keS5oYXNDbGFzcygnaXMtbWVudScpKSB7XG4gICAgICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5jbGljayhmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmNsb3Nlc3QoJy5tYWluLWhlYWRlcicpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5yZW1vdmVDbGFzcygnaXMtbWVudScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudW5iaW5kKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubXVsdGlsZXZlbENsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnaHRtbCcpLnVuYmluZCgpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLm11bHRpbGV2ZWxDbG9zZSgpO1xuICAgICAgICAgICAgICAgI
21167H1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtdWx0aWxldmVsOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgIHNlbGYudmFycy4kcHJpbWFyeU1lbnVMaW5rcy5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgIGxldCAkYm9keSA9ICQoJ2JvZHknKSxcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gJHRoaXMuY2xvc2VzdCgnbGkucHJpbWFyeS1tZW51X19pdGVtJyksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFN1Ym1lbnUgPSAkdGhpcy5kYXRhKCdzdWJtZW51Jyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHBhcmVudC5oYXNDbGFzcyhzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAvL2lmIGNsaWNrZWQgbWVudSBpcyBhY3RpdmUgLSBjbG9zZSBpdFxuICAgICAgICAgICAgICAgICAgICBzZWxmLm11bHRpbGV2ZWxDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJGJvZHkuaGFzQ2xhc3MoJ2lzLW1lbnUnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGJvZHkuYWRkQ2xhc3MoJ2lzLW1lbnUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHNlbGYudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyBzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyhzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52YXJzLiRwcmltYXJ5TWVudS5maW5kKCcuJyArIHNlbGYudmFycy5zdWJtZW51QWN0aXZlQ2xhc3MpLnJlbW92ZUNsYXNzKHNlbGYudmFycy5zdWJtZW51QWN0aXZlQ2xhc3MpO1xuXG4gICAgICAgICAgICAgICAgICAgICRwYXJlbnQuYWRkQ2xhc3Moc2VsZi52YXJzLnByaW1hcnlBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICRwYXJlbnQuZmluZCgnLnN1Ym1lbnVfX21lbnVbZGF0YS1zdWJtZW51PVwiJyArIHRhcmdldFN1Ym1lbnUgKyAnXCJdJykuYWRkQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGYudmFycy4kc3VibWVudUxpbmtzLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAkcGFyZW50ID0gJHRoaXMuY2xvc2VzdCgnbGkucHJpbWFyeS1tZW51X19pdGVtJyksXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldFN1Ym1lbnUgPSAkdGhpcy5kYXRhKCdzdWJtZW51Jyk7XG5cbiAgICAgICAgICAgICAgICAkcGFyZW50LmZpbmQoJy4nICsgc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcykucmVtb3ZlQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICAgICAgJHBhcmVudC5maW5kKCcuc3VibWVudV9fbWVudVtkYXRhLXN1Ym1lbnU9XCInICsgdGFyZ2V0U3VibWVudSArICdcIl0nKS5hZGRDbGFzcyhzZWxmLnZhcnMuc3VibWVudUFjdGl2ZUNsYXNzKTtcblxuICAgICAgICAgICAgICAgIGlmICghc2VsZi52YXJzLiRtZW51V3JhcHBlci5oYXNDbGFzcyhzZWxmLnZhcnMuc3VibWVudU9wZW5DbGFzcykpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi52YXJzLiRtZW51V3JhcHBlci5hZGRDbGFzcyhzZWxmLnZhcnMuc3VibWVudU9wZW5DbGFzcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNlbGYudmFycy4kY2xvc2VMaW5rcy5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5tdWx0aWxldmVsQ2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxmLnZhcnMuJG1haW5tZW51TGlua3Mub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHNlbGYudmFycy4kbWVudVdyYXBwZXIucmVtb3ZlQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVPcGVuQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHNlbGYudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyBzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyhzZWxmLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMuJHByaW1hcnlNZW51LmZpbmQoJy4nICsgc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcykucmVtb3ZlQ2xhc3Moc2VsZi52YXJzLnN1Ym1lbnVBY3RpdmVDbGFzcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbXVsdGlsZXZlbENsb3NlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnZhcnMuJG1lbnVXcmFwcGVyLnJlbW92ZUNsYXNzKHRoaXMudmFycy5zdWJtZW51T3BlbkNsYXNzKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyB0aGlzLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLnZhcnMucHJpbWFyeUFjdGl2ZUNsYXNzKTtcbiAgICAgICAgICAgIHRoaXMudmFycy4kcHJpbWFyeU1lbnUuZmluZCgnLicgKyB0aGlzLnZhcnMuc3VibWVudUFjdGl2ZUNsYXNzKS5yZW1vdmVDbGFzcyh0aGlzLnZhcnMuc3VibWVudUFjdGl2ZUNsYXNzKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMudmFycy4kbW9iaWxlV3JhcHBlci5maWx0ZXIoJzpoaWRkZW4nKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ2lzLW1lbnUnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgc2VhcmNoYm94Q2xvc2U6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMudmFycy4kbWFpbkhlYWRlci5yZW1vdmVDbGFzcyh0aGlzLnZhcnMuc2VhcmNoYm94QWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ2lzLXNlYXJjaGJveCcpO1xuICAgICAgICB9LFxuICAgICAgICBzZWFyY2hib3g6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgc2VsZi52YXJzLiRtYWluSGVhZGVyLmZpbmQoJy5vcGVuLXNlYXJjaGJveCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLm11bHRpbGV2ZWxDbG9zZSgpO1xuICAgICAgICAgICAgICAgI
21167HNlbGYudmFycy4kbWFpbkhlYWRlci50b2dnbGVDbGFzcyhzZWxmLnZhcnMuc2VhcmNoYm94QWN0aXZlQ2xhc3MpO1xuICAgICAgICAgICAgICAgIHNlbGYudmFycy4kbWFpbkhlYWRlci5maW5kKCcudHgtc29sci1xJykuZm9jdXMoKTtcblxuICAgICAgICAgICAgICAgIGlmIChzZWxmLnZhcnMuJG1haW5IZWFkZXIuaGFzQ2xhc3Moc2VsZi52YXJzLnNlYXJjaGJveEFjdGl2ZUNsYXNzKSkge1xuICAgICAgICAgICAgICAgICAgICAkYm9keS5hZGRDbGFzcygnaXMtc2VhcmNoYm94Jyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5zZWFyY2hib3hDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBzZWxmLnZhcnMuJG1haW5IZWFkZXIuZmluZCgnLmNsb3NlLXNlYXJjaGJveCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZWxmLnNlYXJjaGJveENsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAkKCcub3Blbi1pbm5lci1tZW51JykuY2xpY2soZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgJHdyYXBwZXIgPSAkKHRoaXMpLmNsb3Nlc3QoJy5pbm5lci1tZW51JyksXG4gICAgICAgICAgICAkY29udGVudCA9ICR3cmFwcGVyLmZpbmQoJy5pbm5lci1tZW51X19tb3JlJyk7XG5cbiAgICAgICAgaWYgKCR3cmFwcGVyLmhhc0NsYXNzKCdpcy1hY3RpdmUnKSkge1xuICAgICAgICAgICAgJGNvbnRlbnQuY3NzKHtcIm1heC1oZWlnaHRcIjogXCJcIn0pO1xuICAgICAgICAgICAgJHdyYXBwZXIucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHdyYXBwZXIuYWRkQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgJGNvbnRlbnQuY3NzKHtcIm1heC1oZWlnaHRcIjogJGNvbnRlbnRbMF0uc2Nyb2xsSGVpZ2h0fSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIGxldCAkYXJlYVBhcmVudCA9ICQoJy5ob21lcGFnZS1hcmVhJyk7XG4gICAgaWYgKCRhcmVhUGFyZW50Lmxlbmd0aCkge1xuICAgICAgICAkKCcuaG9tZXBhZ2UtYXJlYV9fbmF2IGJ1dHRvbltkYXRhLXRhcmdldF0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgIHRhcmdldCA9ICR0aGlzLmRhdGEoJ3RhcmdldCcpO1xuXG4gICAgICAgICAgICAkYXJlYVBhcmVudC5maW5kKCcuaXMtYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2lzLWFjdGl2ZScpO1xuICAgICAgICAgICAgJGFyZWFQYXJlbnQuZmluZCgnIycgKyB0YXJnZXQpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgICAgICR0aGlzLnBhcmVudCgpLmFkZENsYXNzKCdpcy1hY3RpdmUnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbWVudS5pbml0KCk7XG59KShqUXVlcnkpO1xuIiwialF1ZXJ5KGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG5cbiAgICBsZXQgbWFuYWdlRGF0ZVJhbmdlRXJyb3JzID0gZnVuY3Rpb24oJGZpbHRlcikge1xuICAgICAgICBsZXQgJGNvbnRhaW5lciA9ICRmaWx0ZXIuY2xvc2VzdCgnLm5ld3NTZWFyY2hEYXRlUmFuZ2VDb250YWluZXInKTtcbiAgICAgICAgbGV0ICRhbGwgPSAkY29udGFpbmVyXG4gICAgICAgICAgICAuYWRkKCRjb250YWluZXIuZmluZCgnaW5wdXQnKSlcbiAgICAgICAgICAgIC5hZGQoJGNvbnRhaW5lci5jbG9zZXN0KCdmb3JtLWdyb3VwJykpXG4gICAgICAgICAgICAuYWRkKCRjb250YWluZXIuZmluZCgnZm9ybS1jb250cm9sJykpO1xuICAgICAgICB2Y
21167XIgZk0gPSAkY29udGFpbmVyLmZpbmQoJy5pbnB1dC1mcm9tLmlucHV0LW1vbnRoJykudmFsKCk7XG4gICAgICAgIHZhciBmWSA9ICRjb250YWluZXIuZmluZCgnLmlucHV0LWZyb20uaW5wdXQteWVhcicpLnZhbCgpO1xuICAgICAgICB2YXIgdE0gPSAkY29udGFpbmVyLmZpbmQoJy5pbnB1dC10by5pbnB1dC1tb250aCcpLnZhbCgpO1xuICAgICAgICB2YXIgdFkgPSAkY29udGFpbmVyLmZpbmQoJy5pbnB1dC10by5pbnB1dC15ZWFyJykudmFsKCk7XG4gICAgICAgIGlmICgoZk0gJiYgZlkgJiYgdE0gJiYgdFkpICYmIChcbiAgICAgICAgICAgIChmWSA9PT0gdFkpICYmIChmTSA+IHRNKVxuICAgICAgICAgICAgfHwgKGZZID4gdFkpKVxuICAgICAgICApIHtcbiAgICAgICAgICAgICRhbGwuYWRkQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICRhbGwucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAkKCcubmV3c3NlYXJjaC1kYXRlLWZpbHRlcicpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBsZXQgZGF0ZUZpbHRlciA9IHRoaXMsICRkYXRlRmlsdGVyID0gJCh0aGlzKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICBmb3JtYXQ6ICdNTS1ZWVlZJyxcbiAgICAgICAgICAgIGF1dG9IaWRlOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIGlmICgkKCdodG1sJylbMF0ubGFuZyA9PT0gJ2ZyJykge1xuICAgICAgICAgICAgb3B0aW9ucy5sYW5ndWFnZSA9ICdmci1GUic7XG4gICAgICAgIH1cbiAgICAgICAgJGRhdGVGaWx0ZXIuY2ZEYXRlcGlja2VyKG9wdGlvbnMpO1xuICAgICAgICBsZXQgJGlucHV0TW9udGggPSAkZGF0ZUZpbHRlci5wYXJlbnQoKS5maW5kKCcuaW5wdXQtbW9udGgnKSxcbiAgICAgICAgICAgICRpbnB1dFllYXIgPSAkZGF0ZUZpbHRlci5wYXJlbnQoKS5maW5kKCcuaW5wdXQteWVhcicpO1xuICAgICAgICBkYXRlRmlsdGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgICB2Y
21167XIgdmFsdWUgPSB0aGlzLnZhbHVlO1xuICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zcGxpdCgnLScpO1xuICAgICAgICAgICAgJGlucHV0TW9udGgudmFsKHZhbHVlWzBdKTtcbiAgICAgICAgICAgICRpbnB1dFllYXIudmFsKHZhbHVlWzFdKTtcbiAgICAgICAgICAgIG1hbmFnZURhdGVSYW5nZUVycm9ycygkZGF0ZUZpbHRlcik7XG5cbiAgICAgICAgfSk7XG4gICAgICAgICQodGhpcykub24oJ3BpY2suZGF0ZXBpY2tlcicsIGZ1bmN0aW9uIChldmVudCkge1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gKGV2ZW50LmRhdGUuZ2V0VVRDTW9udGgoKSA+IDgpID8gZXZlbnQuZGF0ZS5nZXRVVENNb250aCgpICsgMSA6IFwiMFwiICsgZXZhbChldmVudC5kYXRlLmdldFVUQ01vbnRoKCkgKyAxKTtcbiAgICAgICAgICAgICRpbnB1dE1vbnRoLnZhbChtb250aCk7XG4gICAgICAgICAgICAkaW5wdXRZZWFyLnZhbChldmVudC5kYXRlLmdldFVUQ0Z1bGxZZWFyKCkpO1xuICAgICAgICAgICAgbWFuYWdlRGF0ZVJhbmdlRXJyb3JzKCRkYXRlRmlsdGVyKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICAkKCcuaW5wdXQtZGF0ZS1yYW5nZS1yZXNldCBhJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZXYpIHtcbiAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZGF0ZS1yYW5nZS1yZXNldCcpLnBhcmVudCgpLmZpbmQoJy5uZXdzc2VhcmNoLWRhdGUtZmlsdGVyJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICQodGhpcykuZGF0YSgnZGF0ZXBpY2tlcicpLnJlc2V0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJy5pbnB1dC1kYXRlLXJhbmdlLXJlc2V0JykucGFyZW50KCkuZmluZCgnLmlucHV0LW1vbnRoLC5pbnB1dC15ZWFyJykudmFsKCcnKTtcbiAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCcuaW5wdXQtZGF0ZS1yYW5nZS1yZXNldCcpLnBhcmVudCgpLmZpbmQoJy5uZXdzU2VhcmNoRGF0ZVJhbmdlQ29udGFpbmVyJykucmVtb3ZlQ2xhc3MoJ2lzLWludmFsaWQnKTtcbiAgICB9KVxufSk7XG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcmVxID0gZmFsc2U7XG5cbiAgICBsZXQgbWFrZUZpbHRlcnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgbGV0IGZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgJ3R5cGU6dHhfbmV3c19kb21haW5fbW9kZWxfbmV3cydcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAkcGVyaW9kID0galF1ZXJ5KCcubmV3cy1wZXJpb2QnKSxcbiAgICAgICAgICAgICRjYXRlZ29yaWVzID0galF1ZXJ5KCcubmV3cy1jYXRlZ29yeTpjaGVja2VkJyk7XG4gICAgICAgIGlmICghJHBlcmlvZC5oYXNDbGFzcygnaXMtaW52YWxpZCcpKSB7XG4gICAgICAgICAgICBsZXQgZk0gPSAkcGVyaW9kLmZpbmQoJy5pbnB1dC1mcm9tLmlucHV0LW1vbnRoJ
21167ykudmFsKCk7XG4gICAgICAgICAgICBsZXQgZlkgPSAkcGVyaW9kLmZpbmQoJy5pbnB1dC1mcm9tLmlucHV0LXllYXInKS52YWwoKTtcbiAgICAgICAgICAgIGxldCB0TSA9ICRwZXJpb2QuZmluZCgnLmlucHV0LXRvLmlucHV0LW1vbnRoJykudmFsKCk7XG4gICAgICAgICAgICBsZXQgdFkgPSAkcGVyaW9kLmZpbmQoJy5pbnB1dC10by5pbnB1dC15ZWFyJykudmFsKCk7XG4gICAgICAgICAgICBpZiAoKGZNICYmIGZZKSB8fCAodE0gJiYgdFkpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHJhbmdlID0gWycqJywgJyonXTtcbiAgICAgICAgICAgICAgICBpZiAoZk0gJiYgZlkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2VbMF0gPSBuZXcgRGF0ZShwYXJzZUludCh0WSksIHBhcnNlSW50KHRNKSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHRNICYmIHRZKSB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlWzFdID0gbmV3IERhdGUocGFyc2VJbnQodFkpLCBwYXJzZUludCh0TSkgKyAxLCAxLCAwLCAwLCAwLCAtMSkudG9JU09TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZmlsdGVycy5wdXNoKCdwdWJsaWNhdGlvbl9kYXRlUzpbJyArIHJhbmdlLmpvaW4oJyBUTyAnKSArICddJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCRjYXRlZ29yaWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBjYXRlZ29yaWVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgJGNhdGVnb3JpZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKCdjYXRlZ29yeV9zdHJpbmdNOlwiJyArIGpRdWVyeSgkY2F0ZWdvcmllc1tpbmRleF0pLmRhdGEoJ3RpdGxlJykgKyAnXCInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbHRlcnMucHVzaChjYXRlZ29yaWVzLmpvaW4oJyBPUiAnKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbHRlcnM7XG4gICAgfTtcblxuICAgIGxldCBzZWFyY2ggPSBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKHJlcSkge1xuICAgICAgICAgICAgcmVxLmFib3J0KCk7XG4gICAgICAgICAgICByZXEgPSBudWxsO1xuICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNldENob2ljZXMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hvaWNlcyhbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMudmFsdWUubGVuZ3RoIDwgMykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZih0aGlzLnNldENob2ljZXMpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q2hvaWNlcyhbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGlucHV0ID0gdGhpcztcbiAgICAgICAgbGV0ICRmb3JtID0galF1ZXJ5KCcubWFpbi1oZWFkZXJfX3NlYXJjaGJveCAuc2VhcmNoLWZvcm0nKTtcbiAgICAgICAgaWYgKCRmb3JtLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBmaWx0ZXJzID0gbWFrZUZpbHRlcnMoKTtcbiAgICAgICAgICAgIGZpbHRlcnMgPSAoZmlsdGVycy5sZW5ndGggPiAwKSA/IEpTT04uc3RyaW5naWZ5KGZpbHRlcnMpIDogJyc7XG4gICAgICAgICAgICByZXEgPSBqUXVlcnkuYWpheCh7XG4gICAgICAgICAgICAgICAgdXJsOiAkZm9ybS5kYXRhKCd1cmwnKSxcbiAgICAgICAgICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZmlsdGVyczogZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgdGVybUxvd2VyY2FzZTogdGhpcy52YWx1ZS50b0xvd2VyQ2FzZSgpLFxuICAgICAgICAgICAgICAgICAgICB0ZXJtT3JpZ2luYWw6IHRoaXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIEw6ICRmb3JtLmZpbmQoJ2lucHV0W25hbWU9XCJMXCJdJykudmFsKClcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChpbnB1dC5zZXRDaG9pY2VzKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZShpbnB1dCwgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zZXRDaG9pY2VzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGpRdWVyeSgnLm5ld3Mta2V5d29yZCcpLm9uKCdpbnB1dCcsIHNlYXJjaClcbiAgICAgICAgLm9uKCdrZXlkb3duJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgaWYgKChlLmtleUNvZGUgPT09IDQwKSAmJiAoalF1ZXJ5KHRoaXMpLmNsb3Nlc3QoJy5zZWFyY2gtZm9ybScpLnBhcmVudCgpLmZpbmQoJy5zZWFyY2gtcmVzdWx0czpoaWRkZW4nKS5sZW5ndGggPiAwKSkge1xuICAgICAgICAgICAgICAgIHNlYXJjaC5hcHBseSh0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG59KTtcbiIsIihmdW5jdGlvbiAoJCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIGxldCBwb3B1cCA9ICQoJy5wb3B1cCcpO1xuICAgIGlmIChwb3B1cC5sZW5ndGgpIHtcbiAgICAgICAgbGV0IGNvb2tpZSA9IENvb2tpZXMuZ2V0SlNPTignY29va2llX2NvbnNlbnRfc2V0dGluZ3Nfc2V0Jyk7XG4gICAgICAgIGxldCBpc0Nvb2tpZSA9IGZhbHNlO1xuICAgICAgICBsZXQgaXNUdXRvcmlhbCA9IHBvcHVwLmhhc0NsYXNzKCd0dXRvcmlhbCcpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgY29va2llID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcG9wdXAuYWRkQ2xhc3MoJ29uJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY2xvc2VQb3B1cCA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgI
21167HBvcHVwLmFkZENsYXNzKCdjbG9zZScpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBwb3B1cC5yZW1vdmVDbGFzcygnb24gY2xvc2UnKTtcbiAgICAgICAgICAgIH0sIDMwMCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHNob3dQb3B1cCA9IGZ1bmN0aW9uICh0LCBuYW1lKSB7XG4gICAgICAgICAgICB0LmNsb3Nlc3QoJy5wb3B1cF9fc2xpZGUnKS5maW5kKCcucG9wdXBfX2NvbnRlbnQnKS5yZW1vdmVDbGFzcygnb24nKTtcbiAgICAgICAgICAgIHQuY2xvc2VzdCgnLnBvcHVwX19zbGlkZScpLmZpbmQoJy5wb3B1cF9fY29udGVudFtkYXRhLW5hbWU9XCInICsgbmFtZSArICdcIl0nKS5hZGRDbGFzcygnb24nKTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAoaXNUdXRvcmlhbCkge1xuICAgICAgICAgICAgbGV0IHBvcHVwU2xpZGVyID0gcG9wdXAuZmluZCgnLnBvcHVwX19zbGlkZXInKS5zbGljayh7XG4gICAgICAgICAgICAgICAgY2VudGVyTW9kZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBjZW50ZXJQYWRkaW5nOiAnMTIwcHgnLFxuICAgICAgICAgICAgICAgIGRvdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgZHJhZ2dhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpbmZpbml0ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICAgICAgICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgICAgICAgICAgIHN3aXBlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ6IDk5MixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldHRpbmdzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyUGFkZGluZzogJzBweCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvb2tpZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuc2xpY2stYXJyb3cnKS5hZGRDbGFzcygnc2xpY2stZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuc2xpY2stYXJyb3cnKS5hdHRyKCdkaXNhYmxlZCcsICdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1kb3RzJykuYWRkQ2xhc3MoJ3NsaWNrLWRpc2FibGVkJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvcHVwU2xpZGVyLm9uKCdhZnRlckNoYW5nZScsIGZ1bmN0aW9uIChlLCBzbGljaykge1xuICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+IDgwMCkge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcucG9wdXBfX3NsaWRlciAuc2xpY2stbGlzdCcpLnJlbW92ZUNsYXNzKCdtb3ZlVXAnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpY2suY3VycmVudFNsaWRlID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXBTbGlkZXIuc2xpY2soJ3NsaWNrU2V0T3B0aW9uJywgJ2RyYWdnYWJsZScsIHRydWUsIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXBTbGlkZXIuc2xpY2soJ3NsaWNrU2V0T3B0aW9uJywgJ3N3aXBlJywgdHJ1ZSwgZmFsc2UpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzbGljay5jdXJyZW50U2xpZGUgPj0gMSkge1xuICAgICAgICAgICAgICAgICAgICAkKCcucG9wdXBfX2J0bi1jbG9zZScpLmFkZENsYXNzKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaXNDb29raWUpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnLnBvcHVwX19idG4tY2xvc2UnKS5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwb3B1cFNsaWRlci5vbignYmVmb3JlQ2hhbmdlJywgZnVuY3Rpb24gKGUsIHNsaWNrLCBjdXJyZW50U2xpZGUsIG5leHRTbGlkZSkge1xuICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA+IDgwMCkge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcucG9wdXBfX3NsaWRlciAuc2xpY2stbGlzdCcpLmFkZENsYXNzKCdtb3ZlVXAnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc2xpY2suY3VycmVudFNsaWRlICsgMiA9PT0gc2xpY2suc2xpZGVDb3VudCAmJiBuZXh0U2xpZGUgPiBjdXJyZW50U2xpZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnBvcHVwX19zbGlkZXIgLnNsaWNrLW5leHQnKS5hZGRDbGFzcygnc2xpY2staGlkZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5wb3B1cF9fc2xpZGVyIC5zbGljay1uZXh0JykucmVtb3ZlQ2xhc3MoJ3NsaWNrLWhpZGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBvcHVwLmZpbmQoJ1tjbGFzcyo9XCJwb3B1cC1hY3Rpb25cIl0nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICBsZXQgY2FyZCA9ICQodGhpcykuYXR0cignZGF0YS1zaG93Jyk7XG4gICAgICAgICAgICBsZXQgdCA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgIGxldCBpc0Nsb3NlQnV0dG9uID0gdC5oYXNDbGFzcygncG9wdXAtYWN0aW9uLWNsb3NlJyk7XG4gICAgICAgICAgICBsZXQgaXNTYXZlQnV0dG9uID0gdC5oYXNDbGFzcygncG9wdXAtYWN0aW9uLXNhdmUnKTtcbiAgICAgICAgICAgIGxldCBpc1NhdmVBbGxCdXR0b24gPSB0Lmhhc0NsYXNzKCdwb3B1cC1hY3Rpb24tc2F2ZS1hbGwnKTtcbiAgICAgICAgICAgIGxldCBpc1Bhc3MgPSB0Lmhhc0NsYXNzKCdwb3B1cC1hY3Rpb24tcGFzcycpO1xuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhcmQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgc2hvd1BvcHVwKHQsIGNhcmQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNDbG9zZUJ1dHRvbikge1xuICAgICAgICAgICAgICAgIGNsb3NlUG9wdXAoKTtcbiAgICAgICAgICAgI
21167H1cblxuICAgICAgICAgICAgaWYgKGlzU2F2ZUJ1dHRvbiB8fCBpc1NhdmVBbGxCdXR0b24gfHwgaXNQYXNzKSB7XG4gICAgICAgICAgICAgICAgaWYoaXNQYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgIENvb2tpZXMuc2V0KCdjb29raWVfY29uc2VudF9zZXR0aW5nc19zZXQnLCAxKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzVHV0b3JpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY2xvc2VQb3B1cCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5wb3B1cF9fc2xpZGVyJykuc2xpY2soJ3NsaWNrTmV4dCcpO1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuc2xpY2stYXJyb3cnKS5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWFycm93JykucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWRvdHMnKS5yZW1vdmVDbGFzcygnc2xpY2stZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAkKCcucG9wdXBfX2J0bi1jbG9zZScpLmFkZENsYXNzKCd2aXNpYmxlJyk7XG4gICAgICAgICAgICAgICAgaXNDb29raWUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaXNUdXRvcmlhbCkge1xuICAgICAgICAgICAgICAgIGlmIChjYXJkID09PSAnY29va2llcy1zZXR0aW5ncycpIHtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWFycm93JykuYWRkQ2xhc3MoJ3NsaWNrLWhpZGUnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWFycm93JykuYXR0cignZGlzYWJsZWQnLCAnZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLnNsaWNrLWRvdHMnKS5hZGRDbGFzcygnc2xpY2staGlkZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1hcnJvdycpLnJlbW92ZUNsYXNzKCdzbGljay1oaWRlJyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1hcnJvdycpLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICAgICAgICAgIHBvcHVwLmZpbmQoJy5zbGljay1kb3RzJykucmVtb3ZlQ2xhc3MoJ3NsaWNrLWhpZGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmRvTm90VHJhY2sgPT0gXCIxXCIgfHwgbmF2aWdhdG9yLmRvTm90VHJhY2sgPT0gXCJ5ZXNcIiB8fCBuYXZpZ2F0b3IuZG9Ob3RUcmFjayA9PSBcIjFcIiB8fCBuYXZpZ2F0b3IubXNEb05vdFRyYWNrID09IFwiMVwiKSB7XG4gICAgICAgICAgICAgICAgcG9wdXAuZmluZCgnLmJsb2NrZWQnKS5zaG93KCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmICghd2luZG93Lmdvb2dsZV90YWdfbWFuYWdlcikge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcuYmxvY2tlZCcpLnNob3coKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwb3B1cC5maW5kKCcudW5ibG9ja2VkJykuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgZmFsc2UpO1xuICAgIH1cbn0pKGpRdWVyeSk7XG4iLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICBsZXQgJGhlcm9TbGlkZXIgPSAkKCcuaGVyby1zbGlkZXInKSxcbiAgICAgICAgJGhlcm9TbGlkZXJJdGVtcyA9ICRoZXJvU2xpZGVyLmNoaWxkcmVuKCk7XG5cbiAgICBpZiAoJGhlcm9TbGlkZXIubGVuZ3RoICYmICRoZXJvU2xpZGVySXRlbXMubGVuZ3RoID4gMSkge1xuICAgICAgICAkaGVyb1NsaWRlci5zbGljayh7XG4gICAgICAgICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgYXV0b3BsYXk6IHRydWUsXG4gICAgICAgICAgICBhdXRvcGxheVNwZWVkOiA1MDAwLFxuICAgICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICAgIGZhZGU6IHRydWUsXG4gICAgICAgICAgICBtb2JpbGVGaXJzdDogdHJ1ZSxcbiAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsOiAxLFxuICAgICAgICAgICAgc2xpZGVzVG9TaG93OiAxLFxuICAgICAgICAgICAgc3BlZWQ6IDgwMFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsZXQgJHRpbGVTbGlkZXIgPSAkKCcubmV3cy10aWxlcywgLnBhcnRuZXJzLWdyaWQsIC5zaWRlYmFyLWJveF9faW5uZXIsIC5udW1iZXJzX19ncmlkJyk7XG4gICAgaWYgKCR0aWxlU2xpZGVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgdGlsZVNsaWNrT24gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkdGlsZVNsaWRlci5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmNsb3Nlc3QoJy5taW5pbWFsaXN0aWMnKS5sZW5ndGggPCAxICYmICEkdGhpcy5oYXNDbGFzcygnc2xpY2staW5pdGlhbGl6ZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5zbGljayh7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvdHM6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zaXZlOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50OiAxMDkwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrcG9pbnQ6IDU3NixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3M6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI
21167HNsaWRlc1RvU2hvdzogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsOiAyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHRpbGVTbGlkZXIgPSAkKCcubmV3cy10aWxlcywgLnBhcnRuZXJzLWdyaWQsIC5zaWRlYmFyLWJveF9faW5uZXIsIC5udW1iZXJzX19ncmlkJyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbGVTbGlja09mZiA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICR0aWxlU2xpZGVyLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCAkdGhpcyA9ICQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuaGFzQ2xhc3MoJ3NsaWNrLWluaXRpYWxpemVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuc2xpY2soJ3Vuc2xpY2snKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICR0aWxlU2xpZGVyID0gJCgnLm5ld3MtdGlsZXMsIC5wYXJ0bmVycy1ncmlkLCAuc2lkZWJhci1ib3hfX2lubmVyLCAubnVtYmVyc19fZ3JpZCcpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8PSAxMDkwKSB7XG4gICAgICAgICAgICB0aWxlU2xpY2tPbigpXG4gICAgICAgIH1cblxuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQuaW5uZXJXaWR0aCA8PSAxMDkwKSB7XG4gICAgICAgICAgICAgICAgdGlsZVNsaWNrT24oKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGlsZVNsaWNrT2ZmKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCAkZmxhc2hTbGlkZXIgPSAkKCcuZmxhc2gtaW5mb19fc2xpZGVyJyk7XG4gICAgaWYgKCRmbGFzaFNsaWRlci5sZW5ndGgpIHtcbiAgICAgICAgaWYgKCRmbGFzaFNsaWRlci5maW5kKCc+IGRpdicpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICRmbGFzaFNsaWRlci5jbG9zZXN0KCcuZmxhc2gtaW5mb19fY29udGVudCcpLmFkZENsYXNzKCd3aXRoLWJ1dHRvbnMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRmbGFzaFNsaWRlci5zbGljayh7XG4gICAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogdHJ1ZSxcbiAgICAgICAgICAgIGFycm93czogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9wbGF5OiB0cnVlLFxuICAgICAgICAgICAgYXV0b3BsYXlTcGVlZDogNTAwMCxcbiAgICAgICAgICAgIGRvdHM6IGZhbHNlLFxuICAgICAgICAgICAgbW9iaWxlRmlyc3Q6IHRydWUsXG4gICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMVxuICAgICAgICB9KVxuICAgICAgICAgICAgLm9uKCdzZXRQb3NpdGlvbicsIGZ1bmN0aW9uIChldmVudCwgc2xpY2spIHtcbiAgICAgICAgICAgICAgICBzbGljay4kc2xpZGVzLmNzcygnaGVpZ2h0Jywgc2xpY2suJHNsaWRlVHJhY2suaGVpZ2h0KCkgKyAncHgnKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxldCAkdHdpdHRlclNsaWRlciA9ICQoJy50eC1jdy10d2l0dGVyJyk7XG4gICAgaWYgKCR0d2l0dGVyU2xpZGVyLmxlbmd0aCkge1xuICAgICAgICBsZXQgdHdpdHRlclNsaWNrT24gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICR0d2l0dGVyU2xpZGVyLnNsaWNrKHtcbiAgICAgICAgICAgICAgICBzbGlkZXNUb1Nob3c6IDEsXG4gICAgICAgICAgICAgICAgc2xpZGVzVG9TY3JvbGw6IDEsXG4gICAgICAgICAgICAgICAgZG90czogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhcnJvd3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgIG1vYmlsZUZpcnN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGFkYXB0aXZlSGVpZ2h0OiB0cnVlLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNpdmU6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludDogMTA5MFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50OiA3NjgsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2hvdzogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogM1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVha3BvaW50OiA0ODAsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlc1RvU2hvdzogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGFwdGl2ZUhlaWdodDogZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgJHR3aXR0ZXJTbGlkZXIgPSAkKCcudHgtY3ctdHdpdHRlcicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCB0d2l0dGVyU2xpY2tPZmYgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkdHdpdHRlclNsaWRlci5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdzbGljay1pbml0aWFsaXplZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnNsaWNrKCd1bnNsaWNrJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAkdHdpdHRlclNsaWRlciA9ICQoJy50eC1jdy10d2l0dGVyJyk7XG4gICAgICAgI
21167H07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoIDw9IDEwOTApIHtcbiAgICAgICAgICAgIHR3aXR0ZXJTbGlja09uKClcbiAgICAgICAgfVxuXG4gICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGlmIChlLnRhcmdldC5pbm5lcldpZHRoIDw9IDEwOTApIHtcbiAgICAgICAgICAgICAgICB0d2l0dGVyU2xpY2tPbigpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0d2l0dGVyU2xpY2tPZmYoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgJCgnLmhlcm8tc2xpZGVyX19pdGVtJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oJCh0aGlzKS5maW5kKCcuaGVyby1zbGlkZXJfX2l0ZW1fX21vcmUgYScpLmF0dHIoJ2hyZWYnKSk7XG4gICAgfSk7XG5cbiAgICAkKCcuaGVyby1zbGlkZXJfX2l0ZW1fX2NvbnRlbnQnKS5vbignY2xpY2snLCBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbigkKHRoaXMpLmZpbmQoJy5oZXJvLXNsaWRlcl9faXRlbV9fbW9yZSBhJykuYXR0cignaHJlZicpKTtcbiAgICB9KTtcbn0pKGpRdWVyeSk7XG5cbi8qXG4gICAgQXV0byBmb250IHJlc2l6ZVxuICovXG5qUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgY2hhbmdlRm9udFNpemUgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJy5oZXJvLWZpdC10ZXh0JykudGV4dGZpbGwoe1xuICAgICAgICAgICAgaW5uZXJUYWc6ICdwJyxcbiAgICAgICAgICAgIG1heEZvbnRQaXhlbHM6IDMwXG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBjaGFuZ2VGb250U2l6ZSgpO1xuICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBjaGFuZ2VGb250U2l6ZSgpO1xuICAgIH0pO1xufSk7XG4iLCJqUXVlcnkoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgkKSB7XG4gICAgbGV0ICR0aW1lbGluZVNtYWxsID0gJCgnLnRpbWVsaW5lLXNtYWxsJyk7XG5cbiAgICBpZiAoJHRpbWVsaW5lU21hbGwubGVuZ3RoKSB7XG4gICAgICAgIGxldCBjdXJyZW50RGF0ZUZ1bGwgPSBuZXcgRGF0ZSgpLnRvSlNPTigpLnNsaWNlKDAsIDEwKTtcbiAgICAgICAgbGV0IGN1cnJlbnREYXRlID0gbmV3IERhdGUoY3VycmVudERhdGVGdWxsKTtcblxuICAgICAgICBsZXQgdGFza0luUHJvamVjdFBvc2l0aW9uID0gZnVuY3Rpb24gKHRhc2spIHtcbiAgICAgICAgICAgIGxldCAkcHJvamVjdHMgPSB0YXNrLmNsb3Nlc3QoJy50aW1lbGluZS1zbWFsbCcpLmZpbmQoJy50aW1lbGluZS1zbWFsbC1oZWFkZXIgLnByb2plY3QnKTtcbiAgICAgICAgICAgIGxldCBwb3NpdGlvbkluQ29udGVudCA9IG51bGw7XG5cbiAgICAgICAgICAgICRwcm9qZWN0cy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHByb2plY3QgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgIGlmICgkcHJvamVjdC5hdHRyKCdkYXRhLXN0YXJ0JykgJiYgJHByb2plY3QuYXR0cignZGF0YS1lbmQnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvamVjdFN0YXJ0ID0gbmV3IERhdGUoJHByb2plY3QuYXR0cignZGF0YS1zdGFydCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2plY3RFbmQgPSBuZXcgRGF0ZSgkcHJvamVjdC5hdHRyKCdkYXRhLWVuZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhc2tEYXRlID0gbmV3IERhdGUodGFzay5hdHRyKCdkYXRhLWRhdGUnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tEYXRlID49IHByb2plY3RTdGFydCAmJiB0YXNrRGF0ZSA8PSBwcm9qZWN0RW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3V0ZXJXaWR0aCA9ICRwcm9qZWN0Lm91dGVyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCAkbmV4dCA9ICRwcm9qZWN0Lm5leHQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCRuZXh0Lmhhc0NsYXNzKCdwcm9qZWN0LXNraXAnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRuZXh0ID0gJG5leHQubmV4dCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb25TdGFydCA9ICRwcm9qZWN0LnBvc2l0aW9uKCkubGVmdCArIG91dGVyV2lkdGggLyAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uRW5kID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRuZXh0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uRW5kID0gJG5leHQucG9zaXRpb24oKS5sZWZ0ICsgb3V0ZXJXaWR0aCAvIDI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbkluUGVyY2VudGFnZSA9IE1hdGgucm91bmQoKCh0YXNrRGF0ZSAtIHByb2plY3RTdGFydCkgLyAocHJvamVjdEVuZCAtIHByb2plY3RTdGFydCkpICogMTAwKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25JbkNvbnRlbnQgPSBwb3NpdGlvbkVuZCAhPT0gbnVsbCA/IE1hdGgucm91bmQoKHBvc2l0aW9uRW5kIC0gcG9zaXRpb25TdGFydCkgKiBwb3NpdGlvbkluUGVyY2VudGFnZSAvIDEwMCkgKyBwb3NpdGlvblN0YXJ0IDogcG9zaXRpb25TdGFydDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcG9zaXRpb25JbkNvbnRlbnQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgJHRpbWVsaW5lU21hbGwuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBsZXQgJHRpbWVsaW5lID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgbGV0ICRwcm9qZWN0cyA9ICR0aW1lbGluZS5maW5kKCcudGltZWxpbmUtc21hbGwtaGVhZGVyIC5wcm9qZWN0Jyk7XG4gICAgICAgICAgICBsZXQgJHRhc2tzID0gJHRpbWVsaW5lLmZpbmQoJy50aW1lbGluZS1zbWFsbC1jb250ZW50Jyk7XG4gICAgICAgICAgICBsZXQgdGFza0hlaWdodCA9IG51bGw7XG4gICAgICAgICAgICBsZXQgdGFza3NMaW5lcyA9IFtdO1xuXG4gICAgICAgICAgICBsZXQgdGFza1RvcFBvc2l0aW9uID0gZnVuY3Rpb24gKHRhc2tMZWZ0UG9zaXRpb24sIHRhc2tXaWR0aEVsKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5ID0gMDsga2V5IDwgdGFza3NMaW5lcy5sZW5ndGg7IGtleSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXNrc0xpbmVzW2tleV0gPCB0YXNrTGVmdFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXNrc0xpbmVzW2tleV0gPSB0YXNrTGVmdFBvc2l0aW9uICsgdGFza1dpZHRoRWwgKyAzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgI
21167HJldHVybiBrZXk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgbmV4dEtleSA9IHRhc2tzTGluZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHRhc2tzTGluZXMucHVzaCh0YXNrTGVmdFBvc2l0aW9uICsgdGFza1dpZHRoRWwgKyAzMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5leHRLZXk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAkdGFza3MuZmluZCgnLnRhc2snKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgJHRhc2sgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5ldyBEYXRlKCR0YXNrLmF0dHIoJ2RhdGEtZGF0ZScpKSA+IGN1cnJlbnREYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICR0YXNrLmFkZENsYXNzKCd0YXNrLWluY29taW5nJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJHRhc2suYWRkQ2xhc3MoJ3Rhc2stZG9uZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICR0YXNrLmNsb25lKCkuYXBwZW5kVG8oJHByb2plY3RzLmZpcnN0KCkuZmluZCgnLnRhc2tzJykpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGxldCBpbml0VGFza3MgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRpbWVsaW5lV2lkdGggPSAkdGltZWxpbmUud2lkdGgoKTtcbiAgICAgICAgICAgICAgICB0YXNrc0xpbmVzID0gW107XG5cbiAgICAgICAgICAgICAgICAkdGFza3MuZmluZCgnLnRhc2snKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0ICR0YXNrID0gJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPiA3NjgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXNrV2lkdGhFbCA9ICR0YXNrLm91dGVyV2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXNrTGVmdFBvc2l0aW9uID0gdGFza0luUHJvamVjdFBvc2l0aW9uKCR0YXNrKSAtICh0YXNrV2lkdGhFbCAvIDIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFza0hlaWdodCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tIZWlnaHQgPSAkdGFzay5vdXRlckhlaWdodCgpICsgMjA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGFza0xlZnRQb3NpdGlvbiArIHRhc2tXaWR0aEVsKSA+IHRpbWVsaW5lV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGFzay5maW5kKCcudGFzay1saW5lJykuY3NzKCdsZWZ0JywgKHRhc2tXaWR0aEVsIC8gMikgKyAoKHRhc2tMZWZ0UG9zaXRpb24gKyB0YXNrV2lkdGhFbCkgLSB0aW1lbGluZVdpZHRoKSArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tMZWZ0UG9zaXRpb24gPSB0aW1lbGluZVdpZHRoIC0gdGFza1dpZHRoRWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrTGVmdFBvc2l0aW9uIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0YXNrLmZpbmQoJy50YXNrLWxpbmUnKS5jc3MoJ2xlZnQnLCAodGFza1dpZHRoRWwgLyAyKSArIHRhc2tMZWZ0UG9zaXRpb24gKyAncHgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrTGVmdFBvc2l0aW9uID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG51bWJlck9mTGluZSA9IHRhc2tUb3BQb3NpdGlvbih0YXNrTGVmdFBvc2l0aW9uLCB0YXNrV2lkdGhFbCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0YXNrLmNzcygnbGVmdCcsIHRhc2tMZWZ0UG9zaXRpb24gKyAncHgnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICR0YXNrLmNzcygndG9wJywgbnVtYmVyT2ZMaW5lICogdGFza0hlaWdodCArICdweCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRhc2suYXR0cignZGF0YS1saW5lJywgbnVtYmVyT2ZMaW5lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCQod2luZG93KS53aWR0aCgpID4gNzY4KSB7XG4gICAgICAgICAgICAgICAgICAgICR0YXNrcy5maW5kKCcudGFzaycpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5jc3MoJ3pJbmRleCcsICh0YXNrc0xpbmVzLmxlbmd0aCAtIHBhcnNlSW50KCQodGhpcykuYXR0cignZGF0YS1saW5lJykpKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAkdGltZWxpbmUuZmluZCgnLnRpbWVsaW5lLXNtYWxsLWNvbnRlbnQnKS5oZWlnaHQoKE9iamVjdC5rZXlzKHRhc2tzTGluZXMpLmxlbmd0aCAqIHRhc2tIZWlnaHQpICsgMTApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGluaXRUYXNrcygpO1xuICAgICAgICAgICAgJHRpbWVsaW5lLnJlbW92ZUNsYXNzKCdsb2FkJyk7XG5cbiAgICAgICAgICAgIGxldCByZXNpemVUaW1lcjtcbiAgICAgICAgICAgICQod2luZG93KS5vbigncmVzaXplJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lcik7XG5cbiAgICAgICAgICAgICAgICByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpbml0VGFza3MoKTtcbiAgICAgICAgICAgICAgICB9LCAyNTApO1xuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG4iLCIoZnVuY3Rpb24gKCQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAkKCcudGltZWxpbmUnKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICBsZXQgJHRpbWVsaW5lQmlnID0gJCh0aGlzKTtcbiAgICAgICAgdGhpcy5fdGltZWxpbmVCaWcgPSB7XG4gICAgICAgICAgICB2Y
21167XJzOiB7XG4gICAgICAgICAgICAgICAgZGF0YTogbnVsbCxcbiAgICAgICAgICAgICAgICBlbDogZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Zpc3VhbGl6YXRpb24nKSxcbiAgICAgICAgICAgICAgICBoaWdobGlnaHQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIHRpbWVsaW5lOiBudWxsLFxuICAgICAgICAgICAgICAgIHdyYXBwZXI6ICQodGhpcylcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjdXN0b21PcmRlcjogZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYS5zdGFydCAtIGIuc3RhcnQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gMCA/IHJlc3VsdCA6IChhLmVuZCAtIGIuZW5kKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwcmVwYXJlRGF0YTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMuaGlnaGxpZ2h0ID0gc2VsZi52YXJzLndyYXBwZXIuaGFzQ2xhc3MoJ2hpZ2hsaWdodC1nZW5lcmljJyk7XG4gICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gdGhpcy5zZXREYXRhKCk7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3RhcnREYXRlID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgICAgICBzdGFydERhdGUuc2V0TW9udGgoc3RhcnREYXRlLmdldE1vbnRoKCkgLSA2KTtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlndXJlZEhlaWdodCA9IHRoaXMudmFycy5lbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtaGVpZ2h0JykgPyBwYXJzZUludCh0aGlzLnZhcnMuZWwuYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oJ2RhdGEtaGVpZ2h0JykudmFsdWUpIDogMDtcbiAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLm1heChpc05hTihjb25maWd1cmVkSGVpZ2h0KSA/IDAgOiBjb25maWd1cmVkSGVpZ2h0LCA0MDApLCAvL3B4XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsZTogJCgnaHRtbCcpLmF0dHIoJ2xhbmcnKSxcbiAgICAgICAgICAgICAgICAgICAgb3JkZXI6IHRoaXMuY3VzdG9tT3JkZXIsXG4gICAgICAgICAgICAgICAgICAgIHNob3dDdXJyZW50VGltZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgaG9yaXpvbnRhbFNjcm9sbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmVydGljYWxTY3JvbGw6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAncmFuZ2UnLFxuICAgICAgICAgICAgICAgICAgICBzdGFydDogc3RhcnREYXRlLFxuICAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXhpczogJ3RvcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtOiAndG9wJ1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB6b29tTWluOiAxMDAwICogNjAgKiA2MCAqIDI0ICogMzEgKiAxMiwgICAgLy8gb25lIHdlZWsgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgIHpvb21NYXg6IDEwMDAgKiA2MCAqIDYwICogMjQgKiAzMSAqIDEyLCAgICAvLyBvbmUgeWVhciBpbiBtaWxsaXNlY29uZHNcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGZ1bmN0aW9uIChpdGVtKSB7IC8vIChpdGVtLCBlbGVtZW50LCBkYXRhKVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50eXBlQ2xhc3MgPT09ICdnZW5lcmljJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoZWlnaHQgPSBwYXJzZUludCgkKCcudGltZWxpbmVfX21vYmlsZScpLmRhdGEoJ2dlbmVyaWMtaGVpZ2h0JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoZWlnaHQgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gJyBzdHlsZT1cImhlaWdodDogJyArIGhlaWdodCArICdlbTtcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICc8ZGl2IGNsYXNzPVwiaXRlbS10eXBlLScgKyBpdGVtLnR5cGVDbGFzcyArICdcIiBpZD1cIml0ZW0nICsgaXRlbS5pZCArICdcIicgKyBzdHlsZSArICc+JyArIGl0ZW0uaHRtbCArICc8L2Rpdj4nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBsZXQgZ3JvdXBzID0gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMudGltZWxpbmUgPSBzZWxmLnZhcnMuaGlnaGxpZ2h0ID8gbmV3IHZpcy5UaW1lbGluZShzZWxmLnZhcnMuZWwsIGl0ZW1zLCBncm91cHMsIG9wdGlvbnMpIDogbmV3IHZpcy5UaW1lbGluZShzZWxmLnZhcnMuZWwsIGl0ZW1zLCBvcHRpb25zKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzZXREYXRhOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIGxldCBkYXRhID0gW107XG5cbiAgICAgICAgICAgICAgICBzZWxmLnZhcnMud3JhcHBlci5maW5kKCcudGltZWxpbmUtaXRlbScpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICR0aGlzLmRhdGEoJ3VpZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6ICR0aGlzLmRhdGEoJ3N0YXJ0JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBlbmQ6ICR0aGlzLmRhdGEoJ2VuZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUNsYXNzOiAkdGhpcy5kYXRhKCd0eXBlJykgKyAoJHRoaXMuaGFzQ2xhc3MoJ3RpbWVsaW5lLWl0ZW0tZWFybHknKSA/ICcgZWFybHknIDogJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiAkdGhpcy5kYXRhKCd0eXBlJykgKyAoJHRoaXMuaGFzQ2xhc3MoJ2ZpbHRlci1zZWFyY2gtaGlkZScpID8gJyBoaWRlJyA6ICcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWw6ICR0aGlzLmZpbmQoJy50aW1lbGluZS1pdGVtX19jb250ZW50JykuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICR0aGlzLmZpbmQoJy50aW1lbGluZS1pdGVtX19jb250ZW50JykuaHRtbCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGltaXRTaXplOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZhcnMuaGlnaGxpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmdyb3VwID0gJHRoaXMuZGF0YSgndHlwZScpID09PSAnZ2VuZXJpYycgPyAxIDogMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLnZhcnMuZGF0YSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmhhc0NsYXNzKCdoaWRlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnZhcnMuZGF0YS5yZW1vdmUoaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYudmFycy5kYXRhLmdldChpdGVtLmlkKSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgI
vendor: 9,047 bytes, lines 21167-21317
21167HNlbGYudmFycy5kYXRhLmFkZChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKHNlbGYudmFycy5kYXRhID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYudmFycy5kYXRhID0gbmV3IHZpcy5EYXRhU2V0KGRhdGEsIHtmaWVsZElkOiAnaWQnLCB0eXBlOiB7c3RhcnQ6ICdJU09EYXRlJywgZW5kOiAnSVNPRGF0ZSd9fSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFycy5kYXRhO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXBhcmVEYXRhKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRpbWVsaW5lRmlsdGVyQ2hhbmdlID0gZnVuY3Rpb24gKGVsLCBtYW51YWwpIHtcbiAgICAgICAgICAgIGxldCAkdGhpcyA9IG1hbnVhbCA9PT0gdHJ1ZSA/IGVsIDogJCh0aGlzKTtcblxuICAgICAgICAgICAgbGV0IHNlY3Rpb24gPSAkdGhpcy5jbG9zZXN0KCcuc2VjdGlvbi10aW1lbGluZScpO1xuICAgICAgICAgICAgbGV0IHNlY3Rpb25DaGVja2VkRWxlbWVudHMgPSBzZWN0aW9uLmZpbmQoJy50aW1lbGluZV9fZmlsdGVyIGlucHV0OmNoZWNrZWQnKS5tYXAoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmlkO1xuICAgICAgICAgICAgfSkuZ2V0KCk7XG5cbiAgICAgICAgICAgIGxldCBpdGVtcyA9IHNlY3Rpb24uZmluZCgnLnRpbWVsaW5lX19tb2JpbGUgLnRpbWVsaW5lLWl0ZW0nKTtcblxuICAgICAgICAgICAgaXRlbXMuYWRkQ2xhc3MoJ2hpZGUgY2hlY2tib3hmaWx0ZXInKTtcblxuICAgICAgICAgICAgaWYgKHNlY3Rpb25DaGVja2VkRWxlbWVudHMubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgICAgIGl0ZW1zLnJlbW92ZUNsYXNzKCdjaGVja2JveGZpbHRlcicpO1xuICAgICAgICAgICAgICAgIGl0ZW1zLmZpbHRlcignOm5vdCgudGV4dGZpbHRlciknKS5yZW1vdmVDbGFzcygnaGlkZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzZWN0aW9uQ2hlY2tlZEVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24gKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZpbHRlcignW2RhdGEtdHlwZT1cIicgKyBlbCArICdcIl0nKS5yZW1vdmVDbGFzcygnY2hlY2tib3hmaWx0ZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaXRlbXMuZmlsdGVyKCdbZGF0YS10eXBlPVwiJyArIGVsICsgJ1wiXTpub3QoLnRleHRmaWx0ZXIpJykucmVtb3ZlQ2xhc3MoJ2hpZGUnKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJHRpbWVsaW5lQmlnWzBdLl90aW1lbGluZUJpZy5zZXREYXRhKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKGRvY3VtZW50KS5vbignY2hhbmdlJywgJy50aW1lbGluZV9fZmlsdGVyIGlucHV0W3R5cGU9XCJjaGVja2JveFwiXScsIHRpbWVsaW5lRmlsdGVyQ2hhbmdlKTtcbiAgICAgICAgfSwgMTAwKTtcblxuICAgICAgICB0aGlzLl90aW1lbGluZUJpZy5pbml0KCk7XG4gICAgICAgIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGxldCBnZW5lcmljID0gW10sIG90aGVyID0gW107XG4gICAgICAgICAgICAkdGltZWxpbmVCaWcuZmluZCgnLnRpbWVsaW5lLWl0ZW0nKS5ub3QoJy50aW1lbGluZS1pdGVtLWVhcmx5JykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9ICQodGhpcykuZGF0YSgndHlwZScpO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnZ2VuZXJpYycpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpYy5wdXNoKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ2VuZXJpYy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKGdlbmVyaWMuc2hpZnQoKSkucmVtb3ZlQ2xhc3MoJ3Nob3cnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG90aGVyLnB1c2godGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci5sZW5ndGggPiAzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKG90aGVyLnNoaWZ0KCkpLnJlbW92ZUNsYXNzKCdzaG93Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICQoZ2VuZXJpYy5jb25jYXQob3RoZXIpKS5hZGRDbGFzcygnc2hvdycpO1xuICAgICAgICB9KSgpO1xuXG4gICAgICAgICQoZG9jdW1lbnQpLm9uKCdjbGljayB0b3VjaCcsICcudGltZWxpbmVfX2RhdGUtdGV4dCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykucHJldigpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgIH0pO1xuICAgIH0pO1xufSkoalF1ZXJ5KTtcbiJdfQ== 21168 21169/*! 21170 * Lightbox v2.9.0 21171 * by Lokesh Dhakar 21172 * 21173 * More info: 21174 * http://lokeshdhakar.com/projects/lightbox2/ 21175 * 21176 * Copyright 2007, 2015 Lokesh Dhakar 21177 * Released under the MIT license 21178 * https://github.com/lokesh/lightbox2/blob/master/LICENSE 21179 * 21180 * @preserve 21181 */ 21182 21183// Uses Node, AMD or browser globals to create a module. 21184(function (root, factory) { 21185 if (typeof define === 'function' && define.amd) { 21186 // AMD. Register as an anonymous module. 21187 define(['jquery'], factory); 21188 } else if (typeof exports === 'object') { 21189 // Node. Does not work with strict CommonJS, but 21190 // only CommonJS-like environments that support module.exports, 21191 // like Node. 21192 module.exports = factory(require('jquery')); 21193 } else { 21194 // Browser globals (root is window) 21195 root.lightbox = factory(root.jQuery); 21196 } 21197}(this, function ($) { 21198 21199 function Lightbox(options) { 21200 this.album = []; 21201 this.currentImageIndex = void 0; 21202 this.init(); 21203 21204 // options 21205 this.options = $.extend({}, this.constructor.defaults); 21206 this.option(options); 21207 } 21208 21209 // Descriptions of all options available on the demo site: 21210 // http://lokeshdhakar.com/projects/lightbox2/index.html#options 21211 Lightbox.defaults = { 21212 albumLabel: 'Image %1 of %2', 21213 alwaysShowNavOnTouchDevices: false, 21214 fadeDuration: 600, 21215 fitImagesInViewport: true, 21216 imageFadeDuration: 600, 21217 // maxWidth: 800, 21218 // maxHeight: 600, 21219 positionFromTop: 50, 21220 resizeDuration: 700, 21221 showImageNumberLabel: true, 21222 wrapAround: false, 21223 disableScrolling: true, 21224 /* 21225 Sanitize Title 21226 If the caption data is trusted, for example you are hardcoding it in, then leave this to false. 21227 This will free you to add html tags, such as links, in the caption. 21228 21229 If the caption data is user submitted or from some other untrusted source, then set this to true 21230 to prevent xss and other injection attacks. 21231 */ 21232 sanitizeTitle: false 21233 }; 21234 21235 Lightbox.prototype.option = function(options) { 21236 $.extend(this.options, options); 21237 }; 21238 21239 Lightbox.prototype.imageCountLabel = function(currentImageNum, totalImages) { 21240 return this.options.albumLabel.replace(/%1/g, currentImageNum).replace(/%2/g, totalImages); 21241 }; 21242 21243 Lightbox.prototype.init = function() { 21244 var self = this; 21245 // Both enable and build methods require the body tag to be in the DOM. 21246 $(document).ready(function() { 21247 self.enable(); 21248 self.build(); 21249 }); 21250 }; 21251 21252 // Loop through anchors and areamaps looking for either data-lightbox attributes or rel attributes 21253 // that contain 'lightbox'. When these are clicked, start lightbox. 21254 Lightbox.prototype.enable = function() { 21255 var self = this; 21256 $('body').on('click', 'a[rel^=lightbox], area[rel^=lightbox], a[data-lightbox], area[data-lightbox]', function(event) { 21257 self.start($(event.currentTarget)); 21258 return false; 21259 }); 21260 }; 21261 21262 // Build html for the lightbox and the overlay. 21263 // Attach event handlers to the new DOM elements. click click click 21264 Lightbox.prototype.build = function() { 21265 var self = this; 21266 $('<div id="lightboxOverlay" class="lightboxOverlay"></div><div id="lightbox" class="lightbox"><div class="lb-outerContainer"><div class="lb-container"><img class="lb-image" src="data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==" /><div class="lb-nav"><a class="lb-prev" href="" ></a><a class="lb-next" href="" ></a></div><div class="lb-loader"><a class="lb-cancel"></a></div></div></div><div class="lb-dataContainer"><div class="lb-data"><div class="lb-details"><span class="lb-caption"></span><span class="lb-number"></span></div><div class="lb-closeContainer"><a class="lb-close"></a></div></div></div></div>').appendTo($('body')); 21267 21268 // Cache jQuery objects 21269 this.$lightbox = $('#lightbox'); 21270 this.$overlay = $('#lightboxOverlay'); 21271 this.$outerContainer = this.$lightbox.find('.lb-outerContainer'); 21272 this.$container = this.$lightbox.find('.lb-container'); 21273 this.$image = this.$lightbox.find('.lb-image'); 21274 this.$nav = this.$lightbox.find('.lb-nav'); 21275 21276 // Store css values for future lookup 21277 this.containerPadding = { 21278 top: parseInt(this.$container.css('padding-top'), 10), 21279 right: parseInt(this.$container.css('padding-right'), 10), 21280 bottom: parseInt(this.$container.css('padding-bottom'), 10), 21281 left: parseInt(this.$container.css('padding-left'), 10) 21282 }; 21283 21284 this.imageBorderWidth = { 21285 top: parseInt(this.$image.css('border-top-width'), 10), 21286 right: parseInt(this.$image.css('border-right-width'), 10), 21287 bottom: parseInt(this.$image.css('border-bottom-width'), 10), 21288 left: parseInt(this.$image.css('border-left-width'), 10) 21289 }; 21290 21291 // Attach event handlers to the newly minted DOM elements 21292 this.$overlay.hide().on('click', function() { 21293 self.end(); 21294 return false; 21295 }); 21296 21297 this.$lightbox.hide().on('click', function(event) { 21298 if ($(event.target).attr('id') === 'lightbox') { 21299 self.end(); 21300 } 21301 return false; 21302 }); 21303 21304 this.$outerContainer.on('click', function(event) { 21305 if ($(event.target).attr('id') === 'lightbox') { 21306 self.end(); 21307 } 21308 return false; 21309 }); 21310 21311 this.$lightbox.find('.lb-prev').on('click', function() { 21312 if (self.currentImageIndex === 0) { 21313 self.changeImage(self.album.length - 1); 21314 } else { 21315 self.changeImage(self.currentImageIndex - 1); 21316 } 21317 return false;
21318 }); 21319 21320 this.$lightbox.find('.lb-next').on('click', function() { 21321 if (self.currentImageIndex === self.album.length - 1) { 21322 self.changeImage(0); 21323 } else { 21324 self.changeImage(self.currentImageIndex + 1); 21325 } 21326 return false; 21327 }); 21328 21329 /* 21330 Show context menu for image on right-click 21331 21332 There is a div containing the navigation that spans the entire image and lives above of it. If 21333 you right-click, you are right clicking this div and not the image. This prevents users from 21334 saving the image or using other context menu actions with the image. 21335 21336 To fix this, when we detect the right mouse button is pressed down, but not yet clicked, we 21337 set pointer-events to none on the nav div. This is so that the upcoming right-click event on 21338 the next mouseup will bubble down to the image. Once the right-click/contextmenu event occurs 21339 we set the pointer events back to auto for the nav div so it can capture hover and left-click 21340 events as usual. 21341 */ 21342 this.$nav.on('mousedown', function(event) { 21343 if (event.which === 3) { 21344 self.$nav.css('pointer-events', 'none'); 21345 21346 self.$lightbox.one('contextmenu', function() { 21347 setTimeout(function() { 21348 this.$nav.css('pointer-events', 'auto'); 21349 }.bind(self), 0); 21350 }); 21351 } 21352 }); 21353 21354 21355 this.$lightbox.find('.lb-loader, .lb-close').on('click', function() { 21356 self.end(); 21357 return false; 21358 }); 21359 }; 21360 21361 // Show overlay and lightbox. If the image is part of a set, add siblings to album array. 21362 Lightbox.prototype.start = function($link) { 21363 var self = this; 21364 var $window = $(window); 21365 21366 $window.on('resize', $.proxy(this.sizeOverlay, this)); 21367 21368 $('select, object, embed').css({ 21369 visibility: 'hidden' 21370 }); 21371 21372 this.sizeOverlay(); 21373 21374 this.album = []; 21375 var imageNumber = 0; 21376 21377 function addToAlbum($link) { 21378 self.album.push({ 21379 link: $link.attr('href'), 21380 title: $link.attr('data-title') || $link.attr('title') 21381 }); 21382 } 21383 21384 // Support both data-lightbox attribute and rel attribute implementations 21385 var dataLightboxValue = $link.attr('data-lightbox'); 21386 var $links; 21387 21388 if (dataLightboxValue) { 21389 $links = $($link.prop('tagName') + '[data-lightbox="' + dataLightboxValue + '"]'); 21390 for (var i = 0; i < $links.length; i = ++i) { 21391 addToAlbum($($links[i])); 21392 if ($links[i] === $link[0]) { 21393 imageNumber = i; 21394 } 21395 } 21396 } else { 21397 if ($link.attr('rel') === 'lightbox') { 21398 // If image is not part of a set 21399 addToAlbum($link); 21400 } else { 21401 // If image is part of a set 21402 $links = $($link.prop('tagName') + '[rel="' + $link.attr('rel') + '"]'); 21403 for (var j = 0; j < $links.length; j = ++j) { 21404 addToAlbum($($links[j])); 21405 if ($links[j] === $link[0]) { 21406 imageNumber = j; 21407 } 21408 } 21409 } 21410 } 21411 21412 // Position Lightbox 21413 var top = $window.scrollTop() + this.options.positionFromTop; 21414 var left = $window.scrollLeft(); 21415 this.$lightbox.css({ 21416 top: top + 'px', 21417 left: left + 'px' 21418 }).fadeIn(this.options.fadeDuration); 21419 21420 // Disable scrolling of the page while open 21421 if (this.options.disableScrolling) { 21422 $('body').addClass('lb-disable-scrolling'); 21423 } 21424 21425 this.changeImage(imageNumber); 21426 }; 21427 21428 // Hide most UI elements in preparation for the animated resizing of the lightbox. 21429 Lightbox.prototype.changeImage = function(imageNumber) { 21430 var self = this; 21431 21432 this.disableKeyboardNav(); 21433 var $image = this.$lightbox.find('.lb-image'); 21434 21435 this.$overlay.fadeIn(this.options.fadeDuration); 21436 21437 $('.lb-loader').fadeIn('slow'); 21438 this.$lightbox.find('.lb-image, .lb-nav, .lb-prev, .lb-next, .lb-dataContainer, .lb-numbers, .lb-caption').hide(); 21439 21440 this.$outerContainer.addClass('animating'); 21441 21442 // When image to show is preloaded, we send the width and height to sizeContainer() 21443 var preloader = new Image(); 21444 preloader.onload = function() { 21445 var $preloader; 21446 var imageHeight; 21447 var imageWidth; 21448 var maxImageHeight; 21449 var maxImageWidth; 21450 var windowHeight; 21451 var windowWidth; 21452 21453 $image.attr('src', self.album[imageNumber].link); 21454 21455 $preloader = $(preloader); 21456 21457 $image.width(preloader.width); 21458 $image.height(preloader.height); 21459 21460 if (self.options.fitImagesInViewport) { 21461 // Fit image inside the viewport. 21462 // Take into account the border around the image and an additional 10px gutter on each side. 21463 21464 windowWidth = $(window).width(); 21465 windowHeight = $(window).height(); 21466 maxImageWidth = windowWidth - self.containerPadding.left - self.containerPadding.right - self.imageBorderWidth.left - self.imageBorderWidth.right - 20; 21467 maxImageHeight = windowHeight - self.containerPadding.top - self.containerPadding.bottom - self.imageBorderWidth.top - self.imageBorderWidth.bottom - 120; 21468 21469 // Check if image size is larger then maxWidth|maxHeight in settings 21470 if (self.options.maxWidth && self.options.maxWidth < maxImageWidth) { 21471 maxImageWidth = self.options.maxWidth; 21472 } 21473 if (self.options.maxHeight && self.options.maxHeight < maxImageWidth) { 21474 maxImageHeight = self.options.maxHeight; 21475 } 21476 21477 // Is the current image's width or height is greater than the maxImageWidth or maxImageHeight 21478 // option than we need to size down while maintaining the aspect ratio. 21479 if ((preloader.width > maxImageWidth) || (preloader.height > maxImageHeight)) { 21480 if ((preloader.width / maxImageWidth) > (preloader.height / maxImageHeight)) { 21481 imageWidth = maxImageWidth; 21482 imageHeight = parseInt(preloader.height / (preloader.width / imageWidth), 10); 21483 $image.width(imageWidth); 21484 $image.height(imageHeight); 21485 } else { 21486 imageHeight = maxImageHeight; 21487 imageWidth = parseInt(preloader.width / (preloader.height / imageHeight), 10); 21488 $image.width(imageWidth); 21489 $image.height(imageHeight); 21490 } 21491 } 21492 } 21493 self.sizeContainer($image.width(), $image.height()); 21494 }; 21495 21496 preloader.src = this.album[imageNumber].link; 21497 this.currentImageIndex = imageNumber; 21498 }; 21499 21500 // Stretch overlay to fit the viewport 21501 Lightbox.prototype.sizeOverlay = function() { 21502 this.$overlay 21503 .width($(document).width()) 21504 .height($(document).height()); 21505 }; 21506 21507 // Animate the size of the lightbox to fit the image we are showing 21508 Lightbox.prototype.sizeContainer = function(imageWidth, imageHeight) { 21509 var self = this; 21510 21511 var oldWidth = this.$outerContainer.outerWidth(); 21512 var oldHeight = this.$outerContainer.outerHeight(); 21513 var newWidth = imageWidth + this.containerPadding.left + this.containerPadding.right + this.imageBorderWidth.left + this.imageBorderWidth.right; 21514 var newHeight = imageHeight + this.containerPadding.top + this.containerPadding.bottom + this.imageBorderWidth.top + this.imageBorderWidth.bottom; 21515 21516 function postResize() { 21517 self.$lightbox.find('.lb-dataContainer').width(newWidth); 21518 self.$lightbox.find('.lb-prevLink').height(newHeight); 21519 self.$lightbox.find('.lb-nextLink').height(newHeight); 21520 self.showImage(); 21521 } 21522 21523 if (oldWidth !== newWidth || oldHeight !== newHeight) { 21524 this.$outerContainer.animate({ 21525 width: newWidth, 21526 height: newHeight 21527 }, this.options.resizeDuration, 'swing', function() { 21528 postResize(); 21529 }); 21530 } else { 21531 postResize(); 21532 } 21533 }; 21534 21535 // Display the image and its details and begin preload neighboring images. 21536 Lightbox.prototype.showImage = function() { 21537 this.$lightbox.find('.lb-loader').stop(true).hide(); 21538 this.$lightbox.find('.lb-image').fadeIn(this.options.imageFadeDuration); 21539 21540 this.updateNav(); 21541 this.updateDetails(); 21542 this.preloadNeighboringImages(); 21543 this.enableKeyboardNav(); 21544 }; 21545 21546 // Display previous and next navigation if appropriate. 21547 Lightbox.prototype.updateNav = function() { 21548 // Check to see if the browser supports touch events. If so, we take the conservative approach 21549 // and assume that mouse hover events are not supported and always show prev/next navigation 21550 // arrows in image sets. 21551 var alwaysShowNav = false;
21552 try { 21553 document.createEvent('TouchEvent'); 21554 alwaysShowNav = (this.options.alwaysShowNavOnTouchDevices) ? true : false; 21555 } catch (e) {} 21556 21557 this.$lightbox.find('.lb-nav').show(); 21558 21559 if (this.album.length > 1) { 21560 if (this.options.wrapAround) { 21561 if (alwaysShowNav) { 21562 this.$lightbox.find('.lb-prev, .lb-next').css('opacity', '1'); 21563 } 21564 this.$lightbox.find('.lb-prev, .lb-next').show(); 21565 } else { 21566 if (this.currentImageIndex > 0) { 21567 this.$lightbox.find('.lb-prev').show(); 21568 if (alwaysShowNav) { 21569 this.$lightbox.find('.lb-prev').css('opacity', '1'); 21570 } 21571 } 21572 if (this.currentImageIndex < this.album.length - 1) { 21573 this.$lightbox.find('.lb-next').show(); 21574 if (alwaysShowNav) { 21575 this.$lightbox.find('.lb-next').css('opacity', '1'); 21576 } 21577 } 21578 } 21579 } 21580 }; 21581 21582 // Display caption, image number, and closing button. 21583 Lightbox.prototype.updateDetails = function() { 21584 var self = this; 21585 21586 // Enable anchor clicks in the injected caption html. 21587 // Thanks Nate Wright for the fix. @https://github.com/NateWr 21588 if (typeof this.album[this.currentImageIndex].title !== 'undefined' && 21589 this.album[this.currentImageIndex].title !== '') { 21590 var $caption = this.$lightbox.find('.lb-caption'); 21591 if (this.options.sanitizeTitle) { 21592 $caption.text(this.album[this.currentImageIndex].title); 21593 } else { 21594 $caption.html(this.album[this.currentImageIndex].title); 21595 } 21596 $caption.fadeIn('fast') 21597 .find('a').on('click', function(event) { 21598 if ($(this).attr('target') !== undefined) { 21599 window.open($(this).attr('href'), $(this).attr('target')); 21600 } else { 21601 location.href = $(this).attr('href'); 21602 } 21603 }); 21604 } 21605 21606 if (this.album.length > 1 && this.options.showImageNumberLabel) { 21607 var labelText = this.imageCountLabel(this.currentImageIndex + 1, this.album.length); 21608 this.$lightbox.find('.lb-number').text(labelText).fadeIn('fast'); 21609 } else { 21610 this.$lightbox.find('.lb-number').hide(); 21611 } 21612 21613 this.$outerContainer.removeClass('animating'); 21614 21615 this.$lightbox.find('.lb-dataContainer').fadeIn(this.options.resizeDuration, function() { 21616 return self.sizeOverlay(); 21617 }); 21618 }; 21619 21620 // Preload previous and next images in set. 21621 Lightbox.prototype.preloadNeighboringImages = function() { 21622 if (this.album.length > this.currentImageIndex + 1) { 21623 var preloadNext = new Image(); 21624 preloadNext.src = this.album[this.currentImageIndex + 1].link; 21625 } 21626 if (this.currentImageIndex > 0) { 21627 var preloadPrev = new Image(); 21628 preloadPrev.src = this.album[this.currentImageIndex - 1].link; 21629 } 21630 }; 21631 21632 Lightbox.prototype.enableKeyboardNav = function() { 21633 $(document).on('keyup.keyboard', $.proxy(this.keyboardAction, this)); 21634 }; 21635 21636 Lightbox.prototype.disableKeyboardNav = function() { 21637 $(document).off('.keyboard'); 21638 }; 21639 21640 Lightbox.prototype.keyboardAction = function(event) { 21641 var KEYCODE_ESC = 27; 21642 var KEYCODE_LEFTARROW = 37; 21643 var KEYCODE_RIGHTARROW = 39; 21644 21645 var keycode = event.keyCode; 21646 var key = String.fromCharCode(keycode).toLowerCase(); 21647 if (keycode === KEYCODE_ESC || key.match(/x|o|c/)) { 21648 this.end(); 21649 } else if (key === 'p' || keycode === KEYCODE_LEFTARROW) { 21650 if (this.currentImageIndex !== 0) { 21651 this.changeImage(this.currentImageIndex - 1); 21652 } else if (this.options.wrapAround && this.album.length > 1) { 21653 this.changeImage(this.album.length - 1); 21654 } 21655 } else if (key === 'n' || keycode === KEYCODE_RIGHTARROW) { 21656 if (this.currentImageIndex !== this.album.length - 1) { 21657 this.changeImage(this.currentImageIndex + 1); 21658 } else if (this.options.wrapAround && this.album.length > 1) { 21659 this.changeImage(0); 21660 } 21661 } 21662 }; 21663 21664 // Closing time. :-( 21665 Lightbox.prototype.end = function() { 21666 this.disableKeyboardNav(); 21667 $(window).off('resize', this.sizeOverlay); 21668 this.$lightbox.fadeOut(this.options.fadeDuration); 21669 this.$overlay.fadeOut(this.options.fadeDuration); 21670 $('select, object, embed').css({ 21671 visibility: 'visible' 21672 }); 21673 if (this.options.disableScrolling) { 21674 $('body').removeClass('lb-disable-scrolling'); 21675 } 21676 }; 21677 21678 return new Lightbox(); 21679})); 21680 21681document.addEventListener('DOMContentLoaded', () => { 21682 let swiper; 21683 21684 // Slider 21685 const initSwiper = () => { 21686 swiper = new Swiper('.swiper', { 21687 slidesPerView: 2, 21688 grid: { 21689 rows: 2, 21690 }, 21691 spaceBetween: 0, 21692 navigation: { 21693 nextEl: '.swiper-button-next', 21694 prevEl: '.swiper-button-prev', 21695 }, 21696 pagination: { 21697 el: '.swiper-pagination', 21698 clickable: true, 21699 }, 21700 preventClicks: false, 21701 preventClicksPropagation: false, 21702 allowTouchMove: true, 21703 loop: true, 21704 noSwiping: true 21705 }); 21706 } 21707 21708 initSwiper(); 21709 21710 const blueskyFeed = document.querySelectorAll('section.bluesky'); 21711 if (blueskyFeed.length !== 0) { 21712 blueskyFeed.forEach(section => { 21713 const allFeeds = section.querySelectorAll('.swiper-slide'); 21714 const buttons = section.querySelectorAll('.swiper-navigation__tabs .btn'); 21715 21716 const getSpecificSocialCounts = () => { 21717 const counts = { 21718 bluesky: 0, 21719 instagram: 0, 21720 linkedin: 0 21721 }; 21722 21723 allFeeds.forEach(feed => { 21724 const social = feed.getAttribute('data-social'); 21725 if (social) { 21726 counts[social] += 1; 21727 } 21728 }); 21729 21730 return counts; 21731 }; 21732 21733 const socialCounts = getSpecificSocialCounts(); 21734 21735 buttons.forEach((button) => { 21736 const social = button.getAttribute('data-social-btn'); 21737 21738 if (!socialCounts[social]) { 21739 button.classList.add("hidden"); 21740 } 21741 21742 button.addEventListener('click', () => { 21743 const buttonActive = section.querySelector('.swiper-navigation__tabs .btn.isActive'); 21744 if (buttonActive) { 21745 buttonActive.classList.remove('isActive'); 21746 } 21747 21748 // Reset slides 21749 const wrapper = section.querySelector('.swiper-wrapper'); 21750 const allSlides = section.querySelectorAll('.swiper-slide'); 21751 21752 // Destroy existing Swiper 21753 if (swiper) swiper.destroy(true, true); 21754 21755 // Clear wrapper 21756 wrapper.innerHTML = ''; 21757 21758 if (button === buttonActive) { 21759 // Show all slides 21760 if (allFeeds.length > 0) { 21761 allFeeds.forEach(feed => wrapper.appendChild(feed)); 21762 } 21763 } else { 21764 button.classList.add('isActive'); 21765 if (allFeeds.length > 0) { 21766 allFeeds.forEach(feed => { 21767 if (feed.getAttribute('data-social') === social) { 21768 wrapper.appendChild(feed); 21769 } 21770 }); 21771 } 21772 } 21773 21774 // Re-init Swiper 21775 if (allFeeds.length > 0) { 21776 initSwiper(); 21777 } 21778 }); 21779 }); 21780
vendor: 33,571 bytes, lines 21781-21828
21781 // Set valid URL 21782 const feeds = document.querySelectorAll('.bluesky .swiper-slide'); 21783 if (feeds.length > 0) { 21784 feeds.forEach(feed => { 21785 const item = feed.querySelector('.bluesky-post') 21786 if (item) { 21787 const url = item.href; 21788 const type = feed.getAttribute('data-social') 21789 if (url) { 21790 21791 if (type === 'bluesky') { 21792 const postId = url.split('/').pop(); 21793 item.href = `https://bsky.app/profile/agencerecherche.bsky.social/post/${postId}`; 21794 } 21795 21796 // Check if DRAG or CLICK 21797 let drag = false; 21798 item.addEventListener('mousedown', (event) => { 21799 event.preventDefault(); 21800 drag = false; 21801 }); 21802 item.addEventListener('mousemove', (event) => { 21803 event.preventDefault(); 21804 drag = true; 21805 }); 21806 item.addEventListener('mouseup', (event) => { 21807 event.preventDefault(); 21808 }); 21809 } 21810 } 21811 }); 21812 } 21813 }); 21814 } 21815}); 21816/** 21817 * Swiper 14.3.0 21818 * Most modern mobile touch slider and framework with hardware accelerated transitions 21819 * https://swiperjs.com 21820 * 21821 * Copyright 2014-2026 Vladimir Kharlampidi 21822 * 21823 * Released under the MIT License 21824 * 21825 * Released on: September 28, 2026 21826 */ 21827 21828var Swiper=function(){"use strict";function e(e=""){return e.trim().split(" ").filter(e=>!!e.trim())}function t(e,t=0){return setTimeout(e,t)}function s(){return Date.now()}function i(e,t="x"){const s=function(e){return window.getComputedStyle(e,null)}(e),i=s.transform||s.webkitTransform;if(!i||"none"===i)return 0;const r=new DOMMatrixReadOnly(i);return"x"===t?r.m41:r.m42}function r(e){return"object"==typeof e&&null!==e&&!!e.constructor&&"Object"===Object.prototype.toString.call(e).slice(8,-1)}function a(e){return"undefined"!=typeof HTMLElement&&e instanceof HTMLElement||!!e&&"object"==typeof e&&(1===e.nodeType||11===e.nodeType)}function n(e,...t){const s=Object(e);for(let e=0;e<t.length;e+=1){const i=t[e];if(null==i||a(i))continue;const l=i,o=Object.keys(Object(l));for(let e=0,t=o.length;e<t;e+=1){const t=o[e];if("__proto__"===t||"constructor"===t||"prototype"===t)continue;const i=Object.getOwnPropertyDescriptor(l,t);if(!i||!i.enumerable)continue;const a=l[t];r(s[t])&&r(a)?a.__swiper__?s[t]=a:n(s[t],a):!r(s[t])&&r(a)?(s[t]={},a.__swiper__?s[t]=a:n(s[t],a)):s[t]=a}}return s}function l(e,t,s){e.style.setProperty(t,s)}function o(e){const t=e.querySelector(".swiper-slide-transform");if(t)return t;if(e.shadowRoot){const t=e.shadowRoot.querySelector(".swiper-slide-transform");if(t)return t}return e}function d(e,t=""){const s=[...e.children];return e instanceof HTMLSlotElement&&s.push(...e.assignedElements()),t?s.filter(e=>e.matches(t)):s}function c(e){try{console.warn(e)}catch{}}function p(t,s=[]){const i=document.createElement(t);return i.classList.add(...Array.isArray(s)?s:e(s)),i}function u(e){const t=e.getBoundingClientRect();return{top:t.top-(e.clientTop||0),left:t.left-(e.clientLeft||0)}}function m(e,t){return window.getComputedStyle(e,null).getPropertyValue(t)}function h(e){if(e&&e.parentNode)return[...e.parentNode.children].indexOf(e)}function f(e,t){const s=[];let i=e.parentElement;for(;i;)t&&!i.matches(t)||s.push(i),i=i.parentElement;return s}function g(e,t){t&&e.addEventListener("transitionend",function s(i){i.target===e&&(e.removeEventListener("transitionend",s),t.call(e,i))})}function v(e,t,s){{const s=window.getComputedStyle(e,null);return e["width"===t?"offsetWidth":"offsetHeight"]+parseFloat(s.getPropertyValue("width"===t?"margin-right":"margin-top"))+parseFloat(s.getPropertyValue("width"===t?"margin-left":"margin-bottom"))}}function w(e){return(Array.isArray(e)?e:[e]).filter(e=>!!e)}function b(e){return t=>Math.abs(t)>0&&e.browser&&e.browser.need3dFix&&Math.abs(t)%90==0?t+.001:t}function y(e,t=""){const s=globalThis.trustedTypes;e.innerHTML=void 0!==s?s.createPolicy("html",{createHTML:e=>e}).createHTML(t):t}let E,S,x;function T(){return E||(E="undefined"==typeof window?{touch:!1}:{touch:"ontouchstart"in window||navigator.maxTouchPoints>0}),E}function M(e={}){return S||(S=function({userAgent:e}={}){if("undefined"==typeof window)return{ios:!1,android:!1};const t=T(),s=navigator.platform,i=e||navigator.userAgent,r={ios:!1,android:!1},a=/(Android);?[\s/]+([\d.]+)?/.test(i),n=/(iPhone\sOS|iOS|iPod)/.test(i),l=/iPad/.test(i),o="MacIntel"===s&&t.touch&&navigator.maxTouchPoints>1,d=l||o;return a&&!("Win32"===s)&&(r.os="android",r.android=!0),(d||n)&&(r.os="ios",r.ios=!0),r}(e)),S}function C(){return x||(x=function(){if("undefined"==typeof window)return{isSafari:!1,isWebView:!1,need3dFix:!1};const e=M(),t=navigator.userAgent,s=t.toLowerCase(),i=s.includes("safari")&&!s.includes("chrome")&&!s.includes("android"),r=/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(t);return{isSafari:i,isWebView:r,need3dFix:i||r&&e.ios}}()),x}const P=(e,t)=>{if(!e||e.destroyed||!e.params||!e.params.lazyPreload)return;const s=t.closest(e.isElement?"swiper-slide":`.${e.params.slideClass}`);if(s){let t=s.querySelector(`.${e.params.lazyPreloaderClass}`);!t&&e.isElement&&(s.shadowRoot?t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`):requestAnimationFrame(()=>{if(s.shadowRoot){const t=s.shadowRoot.querySelector(`.${e.params.lazyPreloaderClass}`);t&&!t.lazyPreloaderManaged&&t.remove()}})),t&&!t.lazyPreloaderManaged&&t.remove()}},L=(e,t)=>{if(!e.slides[t])return;const s=e.slides[t].querySelector('[loading="lazy"]');s&&s.removeAttribute("loading")},A=e=>{if(!e||e.destroyed||!e.params||!e.params.lazyPreload)return;let t=e.params.lazyPreloadPrevNext;const s=e.slides.length;if(!s||!t||t<0)return;t=Math.min(t,s);const i="auto"===e.params.slidesPerView?e.slidesPerViewDynamic():Math.ceil(e.params.slidesPerView),r=e.activeIndex;if(e.params.grid&&(e.params.grid.rows??1)>1){const s=r,a=[s-t];return a.push(...Array.from({length:t}).map((e,t)=>s+i+t)),void e.slides.forEach((t,s)=>{void 0!==t.column&&a.includes(t.column)&&L(e,s)})}const a=r+i-1;if(e.params.rewind||e.params.loop)for(let i=r-t;i<=a+t;i+=1){const t=(i%s+s)%s;(t<r||t>a)&&L(e,t)}else for(let i=Math.max(r-t,0);i<=Math.min(a+t,s-1);i+=1)i!==r&&(i>a||i<r)&&L(e,i)};const I=(e,t)=>!!(e.grid&&t.grid&&t.grid.rows>1);var z={setBreakpoint:function(){const e=this,{realIndex:t,initialized:s,params:i,el:r}=e,a=i.breakpoints;if(!a||a&&0===Object.keys(a).length)return;const l="window"!==i.breakpointsBase&&i.breakpointsBase?"container":i.breakpointsBase,o=["window","container"].includes(i.breakpointsBase)||!i.breakpointsBase?e.el:document.querySelector(i.breakpointsBase),d=e.getBreakpoint(a,l,o);if(!d||e.currentBreakpoint===d)return;const c=(d in a?a[d]:void 0)||e.originalParams,p=I(e,i),u=I(e,c),m=e.params.grabCursor,h=c.grabCursor,f=i.enabled;p&&!u?(r.classList.remove(`${i.containerModifierClass}grid`,`${i.containerModifierClass}grid-column`),e.emitContainerClasses()):!p&&u&&(r.classList.add(`${i.containerModifierClass}grid`),(c.grid.fill&&"column"===c.grid.fill||!c.grid.fill&&"column"===i.grid.fill)&&r.classList.add(`${i.containerModifierClass}grid-column`),e.emitContainerClasses()),m&&!h?e.unsetGrabCursor():!m&&h&&e.setGrabCursor();const g=(e,t)=>e[t];["navigation","pagination","scrollbar"].forEach(t=>{const s=g(c,t);if(void 0===s)return;const r=g(i,t),a="object"==typeof r&&null!==r&&r.enabled,n="object"==typeof s&&null!==s&&s.enabled,l=e[t];a&&!n&&l?.disable?.(),!a&&n&&l?.enable?.()});const v=c.direction&&c.direction!==i.direction,w=i.loop&&(c.slidesPerView!==i.slidesPerView||v),b=i.loop;v&&s&&e.changeDirection(),n(e.params,c);const y=e.params.enabled,E=e.params.loop;Object.assign(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),f&&!y?e.disable():!f&&y&&e.enable(),e.currentBreakpoint=d,e.emit("_beforeBreakpoint",c),s&&(w?(e.loopDestroy(),e.updateSlides(),e.loopCreate(t)):!b&&E?(e.updateSlides(),e.loopCreate(t)):b&&!E&&e.loopDestroy()),e.emit("breakpoint",c)},getBreakpoint:function(e,t="window",s){if(!e||"container"===t&&!s)return;let i=!1;const r="window"===t?window.innerHeight:s.clientHeight,a=Object.keys(e).map(e=>{if("string"==typeof e&&0===e.indexOf("@")){const t=parseFloat(e.substr(1));return{value:r*t,point:e}}return{value:e,point:e}});a.sort((e,t)=>parseInt(String(e.value),10)-parseInt(String(t.value),10));for(let e=0;e<a.length;e+=1){const{point:r,value:n}=a[e];"window"===t?window.matchMedia(`(min-width: ${n}px)`).matches&&(i=r):n<=s.clientWidth&&(i=r)}return i||"max"}};var $={checkOverflow:function(){const e=this,{isLocked:t,params:s}=e,{slidesOffsetBefore:i}=s;if(i){const t=e.slides.length-1,s=e.slidesGrid[t]+e.slidesSizesGrid[t]+2*i;e.isLocked=e.size>s}else e.isLocked=1===e.snapGrid.length;!0===s.allowSlideNext&&(e.allowSlideNext=!e.isLocked),!0===s.allowSlidePrev&&(e.allowSlidePrev=!e.isLocked),t&&t!==e.isLocked&&(e.isEnd=!1),t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock")}};var k={addClasses:function(){const e=this,{classNames:t,params:s,rtl:i,el:r,device:a}=e,n=function(e,t){const s=[];return e.forEach(e=>{"object"==typeof e?Object.keys(e).forEach(i=>{e[i]&&s.push(t+i)}):"string"==typeof e&&s.push(t+e)}),s}(["initialized",s.direction,{"free-mode":e.params.freeMode&&s.freeMode.enabled},{autoheight:s.autoHeight},{rtl:i},{grid:s.grid&&s.grid.rows>1},{"grid-column":s.grid&&s.grid.rows>1&&"column"===s.grid.fill},{android:a.android},{ios:a.ios},{"css-mode":s.cssMode},{centered:s.cssMode&&s.centeredSlides},{"watch-progress":s.watchSlidesProgress}],s.containerModifierClass);t.push(...n),r.classList.add(...t),e.emitContainerClasses()},removeClasses:function(){const{el:e,classNames:t}=this;e&&"string"!=typeof e&&(e.classList.remove(...t),this.emitContainerClasses())}};const O={init:!0,direction:"horizontal",oneWayMovement:!1,swiperElementNodeName:"SWIPER-CONTAINER",touchEventsTarget:"wrapper",initialSlide:0,speed:300,cssMode:!1,updateOnWindowResize:!0,resizeObserver:!0,nested:!1,createElements:!1,eventsPrefix:"swiper",enabled:!0,focusableElements:"input, select, option, textarea, button, video, label",width:null,height:null,preventInteractionOnTransition:!1,userAgent:null,url:null,edgeSwipeDetection:!1,edgeSwipeThreshold:20,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsBase:"window",spaceBetween:0,slidesPerView:1,slidesPerGroup:1,slidesPerGroupSkip:0,slidesPerGroupAuto:!1,centeredSlides:!1,centeredSlidesBounds:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,snapToSlideEdge:!1,watchOverflow:!0,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:5,touchMoveStopPropagation:!1,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,loop:!1,loopAddBlankSlides:!0,loopAdditionalSlides:0,loopPreventsSliding:!0,rewind:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,maxBackfaceHiddenSlides:10,containerModifierClass:"swiper-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-blank",slideActiveClass:"swiper-slide-active",slideVisibleClass:"swiper-slide-visible",slideFullyVisibleClass:"swiper-slide-fully-visible",slideNextClass:"swiper-slide-next",slidePrevClass:"swiper-slide-prev",wrapperClass:"swiper-wrapper",lazyPreload:!0,lazyPreloaderClass:"swiper-lazy-preloader",lazyPreloadPrevNext:0,runCallbacksOnInit:!0,_emitClasses:!1};var D={on(e,t,s){const i=this;if(!i.eventsListeners||i.destroyed)return i;if("function"!=typeof t)return i;const r=s?"unshift":"push";return e.split(" ").forEach(e=>{i.eventsListeners[e]||(i.eventsListeners[e]=[]),i.eventsListeners[e][r](t)}),i},once(e,t,s){const i=this;if(!i.eventsListeners||i.destroyed)return i;if("function"!=typeof t)return i;const r=function(...s){i.off(e,r),r.__emitterProxy&&delete r.__emitterProxy,t.apply(i,s)};return r.__emitterProxy=t,i.on(e,r,s)},onAny(e,t){const s=this;if(!s.eventsListeners||s.destroyed)return s;if("function"!=typeof e)return s;const i=t?"unshift":"push";return s.eventsAnyListeners.indexOf(e)<0&&s.eventsAnyListeners[i](e),s},offAny(e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsAnyListeners)return t;const s=t.eventsAnyListeners.indexOf(e);return s>=0&&t.eventsAnyListeners.splice(s,1),t},off(e,t){const s=this;return!s.eventsListeners||s.destroyed?s:s.eventsListeners?(e.split(" ").forEach(e=>{void 0===t?s.eventsListeners[e]=[]:s.eventsListeners[e]&&s.eventsListeners[e].forEach((i,r)=>{(i===t||i.__emitterProxy&&i.__emitterProxy===t)&&s.eventsListeners[e].splice(r,1)})}),s):s},emit(...e){const t=this;if(!t.eventsListeners||t.destroyed)return t;if(!t.eventsListeners)return t;let s,i,r;if("string"==typeof e[0]||Array.isArray(e[0]))s=e[0],i=e.slice(1,e.length),r=t;else{const a=e[0];s=a.events,i=a.data??[],r=a.context||t}i.unshift(r);return(Array.isArray(s)?s:s.split(" ")).forEach(e=>{t.eventsAnyListeners&&t.eventsAnyListeners.length&&t.eventsAnyListeners.forEach(t=>{t.apply(r,[e,...i])}),t.eventsListeners&&t.eventsListeners[e]&&t.eventsListeners[e].forEach(e=>{e.apply(r,i)})}),t}};function G(e){const t=this;t.destroyed||t.enabled&&(t.allowClick||(t.params.preventClicks&&e.preventDefault(),t.params.preventClicksPropagation&&t.animating&&(e.stopPropagation(),e.stopImmediatePropagation())))}function X(){const e=this;e.destroyed||e.documentTouchHandlerProceeded||(e.documentTouchHandlerProceeded=!0,e.params.touchReleaseOnEdges&&(e.el.style.touchAction="auto"))}function B(e){const t=this;t.destroyed||(P(t,e.target),"error"===e.type||t.params.cssMode||"auto"!==t.params.slidesPerView&&!t.params.autoHeight||t.update())}function H(){const e=this,{params:t,el:s}=e;if(s&&0===s.offsetWidth)return;t.breakpoints&&e.setBreakpoint();const{allowSlideNext:i,allowSlidePrev:r,snapGrid:a}=e,n=e.virtual&&e.params.virtual?.enabled;e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),e.updateSlidesClasses();const l=n&&t.loop;if(!("auto"===t.slidesPerView||t.slidesPerView>1)||!e.isEnd||e.isBeginning||e.params.centeredSlides||l)e.params.loop&&!n?e.slideToLoop(e.realIndex,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0);else{const t=n?e.virtual.slides.length:e.slides.length;e.slideTo(t-1,0,!1,!0)}if(e.autoplay&&e.autoplay.running&&e.autoplay.paused){const t=e.autoplay;clearTimeout(t.resizeTimeout),t.resizeTimeout=setTimeout(()=>{e.autoplay&&e.autoplay.running&&e.autoplay.paused&&e.autoplay.resume()},500)}e.allowSlidePrev=r,e.allowSlideNext=i,e.params.watchOverflow&&a!==e.snapGrid&&e.checkOverflow()}function Y(){const e=this;if(e.destroyed)return;const{wrapperEl:t,rtlTranslate:s,enabled:i}=e;if(!i)return;let r;e.previousTranslate=e.translate,e.isHorizontal()?e.translate=-t.scrollLeft:e.translate=-t.scrollTop,0===e.translate&&(e.translate=0),e.updateActiveIndex(),e.updateSlidesClasses();const a=e.maxTranslate()-e.minTranslate();r=0===a?0:(e.translate-e.minTranslate())/a,r!==e.progress&&e.updateProgress(s?-e.translate:e.translate),e.emit("setTranslate",e.translate,!1)}function R(e){const i=this;if(i.destroyed)return;const r=i.touchEventsData;let a=e.originalEvent??e;if("touchend"===a.type||"touchcancel"===a.type){const e=[...a.changedTouches].find(e=>e.identifier===r.touchId);if(!e||e.identifier!==r.touchId)return}else{if(null!==r.touchId)return;if(a.pointerId!==r.pointerId)return}if(["pointercancel","pointerout","pointerleave","contextmenu"].includes(a.type)){if(!(["pointercancel","contextmenu"].includes(a.type)&&(i.browser.isSafari||i.browser.isWebView)))return}r.pointerId=null,r.touchId=null,r.startEventPath=void 0,r.lastMoveEvent=void 0;const{params:n,touches:l,rtlTranslate:o,slidesGrid:d,enabled:c}=i;if(!c)return;if(!n.simulateTouch&&"mouse"===a.pointerType)return;if(r.allowTouchCallbacks&&i.emit("touchEnd",a),r.allowTouchCallbacks=!1,!r.isTouched)return r.isMoved&&n.grabCursor&&i.setGrabCursor(!1),r.isMoved=!1,void(r.startMoving=!1);n.grabCursor&&r.isMoved&&r.isTouched&&(!0===i.allowSlideNext||!0===i.allowSlidePrev)&&i.setGrabCursor(!1);const p=s(),u=p-r.touchStartTime;if(i.allowClick){const e=a.path??(a.composedPath&&a.composedPath());i.updateClickedSlide(e&&e[0],e),i.emit("tap click",a),u<300&&p-r.lastClickTime<300&&i.emit("doubleTap doubleClick",a)}if(r.lastClickTime=s(),t(()=>{i.destroyed||(i.allowClick=!0)}),!r.isTouched||!r.isMoved||!i.swipeDirection||0===l.diff&&!r.loopSwapReset||r.currentTranslate===r.startTranslate&&!r.loopSwapReset)return r.isTouched=!1,r.isMoved=!1,void(r.startMoving=!1);let m;if(r.isTouched=!1,r.isMoved=!1,r.startMoving=!1,m=n.followFinger?o?i.translate:-i.translate:-(r.currentTranslate??0),n.cssMode)return;if(n.freeMode&&n.freeMode.enabled)return void i.freeMode.onTouchEnd({currentPos:m});const h=m>=-i.maxTranslate()&&!i.params.loop;let f=0,g=i.slidesSizesGrid[0];for(let e=0;e<d.length;e+=e<n.slidesPerGroupSkip?1:n.slidesPerGroup){const t=e<n.slidesPerGroupSkip-1?1:n.slidesPerGroup;void 0!==d[e+t]?(h||m>=d[e]&&m<d[e+t])&&(f=e,g=d[e+t]-d[e]):(h||m>=d[e])&&(f=e,g=d[d.length-1]-d[d.length-2])}let v=null,w=null;n.rewind&&(i.isBeginning?w=n.virtual?.enabled&&i.virtual?i.virtual.slides.length-1:i.slides.length-1:i.isEnd&&(v=0));const b=(m-d[f])/g,y=f<n.slidesPerGroupSkip-1?1:n.slidesPerGroup;if(u>n.longSwipesMs){if(!n.longSwipes)return void i.slideTo(i.activeIndex);"next"===i.swipeDirection&&(b>=n.longSwipesRatio?i.slideTo(n.rewind&&i.isEnd?v:f+y):i.slideTo(f)),"prev"===i.swipeDirection&&(b>1-n.longSwipesRatio?i.slideTo(f+y):null!==w&&b<0&&Math.abs(b)>n.longSwipesRatio?i.slideTo(w):i.slideTo(f))}else{if(!n.shortSwipes)return void i.slideTo(i.activeIndex);i.navigation&&(a.target===i.navigation.nextEl||a.target===i.navigation.prevEl)?a.target===i.navigation.nextEl?i.slideTo(f+y):i.slideTo(f):("next"===i.swipeDirection&&i.slideTo(null!==v?v:f+y),"prev"===i.swipeDirection&&i.slideTo(null!==w?w:f))}}function _(e){const t=this;if(t.destroyed)return;const i=t.touchEventsData,{params:r,touches:a,rtlTranslate:n,enabled:l}=t;if(!l)return;if(!r.simulateTouch&&"mouse"===e.pointerType)return;const o=e,d=o.originalEvent??o;if("pointermove"===d.type){if(null!==i.touchId)return;if(d.pointerId!==i.pointerId)return}let c;if("touchmove"===d.type){const e=[...d.changedTouches].find(e=>e.identifier===i.touchId);if(!e||e.identifier!==i.touchId)return;c=e}else c=d;if(!i.isTouched)return void(i.startMoving&&i.isScrolling&&t.emit("touchMoveOpposite",d));if(i.lastMoveEvent===d)return;i.lastMoveEvent=d;for(const s of i.startEventPath??[]){if(s===t.el)break;const i=s.swiper;i&&i!==t&&!i.destroyed&&i.params.nested&&i.touchEventsData.isTouched&&i.onTouchMove(e)}const p=c.pageX,u=c.pageY;if(d.preventedByNestedSwiper)return a.startX=p,void(a.startY=u);if(!t.allowTouchMove)return d.target.matches(i.focusableElements)||(t.allowClick=!1),void(i.isTouched&&(Object.assign(a,{startX:p,startY:u,currentX:p,currentY:u}),i.touchStartTime=s()));if(r.touchReleaseOnEdges&&!r.loop)if(t.isVertical()){if(u<a.startY&&t.translate<=t.maxTranslate()||u>a.startY&&t.translate>=t.minTranslate())return i.isTouched=!1,void(i.isMoved=!1)}else{if(n&&(p>a.startX&&-t.translate<=t.maxTranslate()||p<a.startX&&-t.translate>=t.minTranslate()))return;if(!n&&(p<a.startX&&t.translate<=t.maxTranslate()||p>a.startX&&t.translate>=t.minTranslate()))return}if(document.activeElement&&document.activeElement.matches(i.focusableElements)&&document.activeElement!==d.target&&"mouse"!==d.pointerType&&document.activeElement.blur(),document.activeElement&&d.target===document.activeElement&&d.target.matches(i.focusableElements))return i.isMoved=!0,void(t.allowClick=!1);i.allowTouchCallbacks&&t.emit("touchMove",d),a.previousX=a.currentX,a.previousY=a.currentY,a.currentX=p,a.currentY=u;const m=a.currentX-a.startX,h=a.currentY-a.startY;if(t.params.threshold&&Math.sqrt(m**2+h**2)<t.params.threshold)return;if(void 0===i.isScrolling){let e;t.isHorizontal()&&a.currentY===a.startY||t.isVertical()&&a.currentX===a.startX?i.isScrolling=!1:m*m+h*h>=25&&(e=180*Math.atan2(Math.abs(h),Math.abs(m))/Math.PI,i.isScrolling=t.isHorizontal()?e>r.touchAngle:90-e>r.touchAngle)}if(i.isScrolling&&t.emit("touchMoveOpposite",d),void 0===i.startMoving&&(a.currentX===a.startX&&a.currentY===a.startY||(i.startMoving=!0)),i.isScrolling||"touchmove"===d.type&&i.preventTouchMoveFromPointerMove)return void(i.isTouched=!1);if(!i.startMoving)return;t.allowClick=!1,!r.cssMode&&d.cancelable&&d.preventDefault(),r.touchMoveStopPropagation&&!r.nested&&d.stopPropagation();let f=t.isHorizontal()?m:h,g=t.isHorizontal()?a.currentX-a.previousX:a.currentY-a.previousY;r.oneWayMovement&&(f=Math.abs(f)*(n?1:-1),g=Math.abs(g)*(n?1:-1)),a.diff=f,f*=r.touchRatio,n&&(f=-f,g=-g);const v=t.touchesDirection;t.swipeDirection=f>0?"prev":"next",t.touchesDirection=g>0?"prev":"next";const w=t.params.loop&&!r.cssMode,b="next"===t.touchesDirection&&t.allowSlideNext||"prev"===t.touchesDirection&&t.allowSlidePrev;if(!i.isMoved){if(w&&b&&t.loopFix({direction:t.swipeDirection}),i.startTranslate=t.getTranslate(),t.setTransition(0),t.animating){const e=new window.CustomEvent("transitionend",{bubbles:!0,cancelable:!0,detail:{bySwiperTouchMove:!0}});t.wrapperEl.dispatchEvent(e)}i.allowMomentumBounce=!1,!r.grabCursor||!0!==t.allowSlideNext&&!0!==t.allowSlidePrev||t.setGrabCursor(!0),t.emit("sliderFirstMove",d)}if((new Date).getTime(),!1!==r._loopSwapReset&&i.isMoved&&i.allowThresholdMove&&v!==t.touchesDirection&&w&&b&&Math.abs(f)>=1)return Object.assign(a,{startX:p,startY:u,currentX:p,currentY:u,startTranslate:i.currentTranslate}),i.loopSwapReset=!0,void(i.startTranslate=i.currentTranslate);t.emit("sliderMove",d),i.isMoved=!0;const y=i.startTranslate??0;i.currentTranslate=f+y;let E=!0,S=r.resistanceRatio;if(r.touchReleaseOnEdges&&(S=0),f>0?(w&&b&&i.allowThresholdMove&&i.currentTranslate>(r.centeredSlides?t.minTranslate()-t.slidesSizesGrid[t.activeIndex+1]-("auto"!==r.slidesPerView&&t.slides.length-r.slidesPerView>=2?t.slidesSizesGrid[t.activeIndex+1]+t.params.spaceBetween:0)-t.params.spaceBetween:t.minTranslate())&&t.loopFix({direction:"prev",setTranslate:!0,activeSlideIndex:0}),i.currentTranslate>t.minTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=t.minTranslate()-1+(-t.minTranslate()+y+f)**S))):f<0&&(w&&b&&i.allowThresholdMove&&i.currentTranslate<(r.centeredSlides?t.maxTranslate()+t.slidesSizesGrid[t.slidesSizesGrid.length-1]+t.params.spaceBetween+("auto"!==r.slidesPerView&&t.slides.length-r.slidesPerView>=2?t.slidesSizesGrid[t.slidesSizesGrid.length-1]+t.params.spaceBetween:0):t.maxTranslate())&&t.loopFix({direction:"next",setTranslate:!0,activeSlideIndex:t.slides.length-("auto"===r.slidesPerView?t.slidesPerViewDynamic():Math.ceil(parseFloat(String(r.slidesPerView))))}),i.currentTranslate<t.maxTranslate()&&(E=!1,r.resistance&&(i.currentTranslate=t.maxTranslate()+1-(t.maxTranslate()-y-f)**S))),E&&(d.preventedByNestedSwiper=!0),!t.allowSlideNext&&"next"===t.swipeDirection&&(i.currentTranslate??0)<y&&(i.currentTranslate=y),!t.allowSlidePrev&&"prev"===t.swipeDirection&&(i.currentTranslate??0)>y&&(i.currentTranslate=y),t.allowSlidePrev||t.allowSlideNext||(i.currentTranslate=y),r.threshold>0){if(!(Math.abs(f)>r.threshold||i.allowThresholdMove))return void(i.currentTranslate=i.startTranslate);if(!i.allowThresholdMove)return i.allowThresholdMove=!0,a.startX=a.currentX,a.startY=a.currentY,i.currentTranslate=i.startTranslate,void(a.diff=t.isHorizontal()?a.currentX-a.startX:a.currentY-a.startY)}r.followFinger&&!r.cssMode&&((r.freeMode&&r.freeMode.enabled&&t.freeMode||r.watchSlidesProgress)&&(t.updateActiveIndex(),t.updateSlidesClasses()),r.freeMode&&r.freeMode.enabled&&t.freeMode&&t.freeMode.onTouchMove(),t.updateProgress(i.currentTranslate),t.setTranslate(i.currentTranslate??0))}function N(e,t,s){const{params:i}=e,r=i.edgeSwipeDetection,a=i.edgeSwipeThreshold;return!r||!(s<=a||s>=window.innerWidth-a)||"prevent"===r&&(t.preventDefault(),!0)}function V(e){const t=this;if(t.destroyed)return;const i=e.originalEvent??e,r=t.touchEventsData;if("pointerdown"===i.type){const e=i;if(null!==r.pointerId&&r.pointerId!==e.pointerId)return;r.pointerId=e.pointerId}else"touchstart"===i.type&&1===i.targetTouches.length&&(r.touchId=i.targetTouches[0].identifier);if("touchstart"===i.type)return void N(t,i,i.targetTouches[0].pageX);const{params:a,touches:n,enabled:l}=t;if(!l)return;if(!a.simulateTouch&&"mouse"===i.pointerType)return;if(t.animating&&a.preventInteractionOnTransition)return;!t.animating&&a.cssMode&&a.loop&&t.loopFix();let o=i.target;if("wrapper"===a.touchEventsTarget&&!function(e,t){let s=t.contains(e);!s&&t instanceof HTMLSlotElement&&(s=[...t.assignedElements()].includes(e),s||(s=function(e,t){const s=[t];for(;s.length>0;){const t=s.shift();if(e===t)return!0;s.push(...t.children,...t.shadowRoot?t.shadowRoot.children:[],...t.assignedElements?t.assignedElements():[])}return!1}(e,t)));return s}(o,t.wrapperEl))return;const d=i;if("number"==typeof d.which&&3===d.which)return;if("number"==typeof d.button&&d.button>0)return;if(r.isTouched&&r.isMoved)return;const c=!!a.noSwipingClass&&""!==a.noSwipingClass,p=i.composedPath?i.composedPath():i.path;c&&i.target&&i.target.shadowRoot&&p&&(o=p[0]);const u=a.noSwipingSelector?a.noSwipingSelector:`.${a.noSwipingClass}`,m=!(!i.target||!i.target.shadowRoot);if(a.noSwiping&&(m?(h=u,function e(t){if(!t||t===document||t===window)return null;let s=t;s.assignedSlot&&(s=s.assignedSlot);const i=s.closest(h);if(!i&&!s.getRootNode)return null;const r=s.getRootNode();return i||e(r.host)}(o)):o.closest(u)))return void(t.allowClick=!0);var h;if(a.swipeHandler&&"string"==typeof a.swipeHandler&&!o.closest(a.swipeHandler))return;const f=i;n.currentX=f.pageX,n.currentY=f.pageY;const g=n.currentX,v=n.currentY;if(!N(t,i,g))return;Object.assign(r,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),n.startX=g,n.startY=v,r.touchStartTime=s(),r.startEventPath=p,t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,a.threshold>0&&(r.allowThresholdMove=!1);let w=!0;o.matches(r.focusableElements)&&(w=!1,"SELECT"===o.nodeName&&(r.isTouched=!1)),document.activeElement&&document.activeElement.matches(r.focusableElements)&&document.activeElement!==o&&("mouse"===f.pointerType||"mouse"!==f.pointerType&&!o.matches(r.focusableElements))&&document.activeElement.blur();const b=w&&t.allowTouchMove&&a.touchStartPreventDefault;!a.touchStartForcePreventDefault&&!b||o.isContentEditable||i.preventDefault(),a.freeMode&&a.freeMode.enabled&&t.freeMode&&t.animating&&!a.cssMode&&t.freeMode.onTouchStart(),t.emit("touchStart",i)}const q=(e,t)=>{const{params:s,el:i,wrapperEl:r,device:a}=e,n=!!s.nested,l="on"===t?"addEventListener":"removeEventListener",o=t;if(!i||"string"==typeof i)return;document[l]("touchstart",e.onDocumentTouchStart,{passive:!1,capture:n}),i[l]("touchstart",e.onTouchStart,{passive:!1}),i[l]("pointerdown",e.onTouchStart,{passive:!1}),document[l]("touchmove",e.onTouchMove,{passive:!1,capture:n}),document[l]("pointermove",e.onTouchMove,{passive:!1,capture:n}),document[l]("touchend",e.onTouchEnd,{passive:!0}),document[l]("pointerup",e.onTouchEnd,{passive:!0}),document[l]("pointercancel",e.onTouchEnd,{passive:!0}),document[l]("touchcancel",e.onTouchEnd,{passive:!0}),document[l]("pointerout",e.onTouchEnd,{passive:!0}),document[l]("pointerleave",e.onTouchEnd,{passive:!0}),document[l]("contextmenu",e.onTouchEnd,{passive:!0}),(s.preventClicks||s.preventClicksPropagation)&&i[l]("click",e.onClick,!0),s.cssMode&&r[l]("scroll",e.onScroll);const d=t=>{e[o](t,H,!0)};s.updateOnWindowResize?d(a.ios||a.android?"resize orientationchange observerUpdate":"resize observerUpdate"):d("observerUpdate"),s.lazyPreload&&(i[l]("load",e.onLoad,{capture:!0}),i[l]("error",e.onLoad,{capture:!0}))};var F={loopCreate:function(e,t){const s=this,{params:i,slidesEl:r}=s;if(!i.loop||s.virtual&&s.params.virtual?.enabled)return;const a=()=>{d(r,`.${i.slideClass}, swiper-slide`).forEach((e,t)=>{e.setAttribute("data-swiper-slide-index",String(t))})},n=s.grid&&i.grid&&i.grid.rows>1;i.loopAddBlankSlides&&(i.slidesPerGroup>1||n)&&(()=>{const e=d(r,`.${i.slideBlankClass}`);e.forEach(e=>{e.remove()}),e.length>0&&(s.recalcSlides(),s.updateSlides())})();const l=i.slidesPerGroup*(n?i.grid.rows:1),o=s.slides.length%l!==0,u=n&&s.slides.length%i.grid.rows!==0,m=e=>{for(let t=0;t<e;t+=1){const e=s.isElement?p("swiper-slide",[i.slideBlankClass]):p("div",[i.slideClass,i.slideBlankClass]);s.slidesEl.append(e)}};if(o){if(i.loopAddBlankSlides){m(l-s.slides.length%l),s.recalcSlides(),s.updateSlides()}else c("Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");a()}else if(u){if(i.loopAddBlankSlides){m(i.grid.rows-s.slides.length%i.grid.rows),s.recalcSlides(),s.updateSlides()}else c("Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");a()}else a();const h=i.centeredSlides||!!i.slidesOffsetBefore||!!i.slidesOffsetAfter;s.loopFix({slideRealIndex:e,direction:h?void 0:"next",initial:t})},loopFix:function(e={}){const{slideRealIndex:t,slideTo:s=!0,direction:i,setTranslate:r,activeSlideIndex:a,initial:n,byController:l,byMousewheel:o}=e;let d=a;const p=this;if(!p.params.loop)return;if(p.params.watchOverflow&&p.isLocked)return;p.emit("beforeLoopFix"),p.__loopFixInProgress__=!0;const{slides:u,allowSlidePrev:m,allowSlideNext:h,slidesEl:f,params:g}=p,{centeredSlides:v,slidesOffsetBefore:w,slidesOffsetAfter:b,initialSlide:y}=g,E=v||!!w||!!b;if(p.allowSlidePrev=!0,p.allowSlideNext=!0,p.virtual&&g.virtual?.enabled){if(s){const e=p.virtual.slides.length,t=p.virtual.slidesBefore??0;E||0!==p.snapIndex?E&&p.snapIndex<g.slidesPerView?p.slideTo(e+p.snapIndex,0,!1,!0):p.snapIndex===p.snapGrid.length-1&&p.slideTo(t,0,!1,!0):p.slideTo(e,0,!1,!0)}return p.allowSlidePrev=m,p.allowSlideNext=h,p.__loopFixInProgress__=!1,void p.emit("loopFix")}let S=g.slidesPerView;"auto"===S?S=p.slidesPerViewDynamic():(S=Math.ceil(parseFloat(String(g.slidesPerView))),E&&S%2==0&&(S+=1));const x=g.slidesPerGroupAuto?S:g.slidesPerGroup,T=e=>("function"==typeof e?e.call(p):e)||0,M=p.slidesGrid.length>1?(p.slidesGrid[p.slidesGrid.length-1]-p.slidesGrid[0])/(p.slidesGrid.length-1):p.size,C=M>0?T(w)/M:0,P=M>0?T(b)/M:0;let L=E?Math.max(x,(v?Math.ceil(S/2):0)+Math.ceil(Math.max(C,P))):x;L%x!==0&&(L+=x-L%x),L+=g.loopAdditionalSlides,p.loopedSlides=L;const A=p.grid&&g.grid&&g.grid.rows>1;u.length<S+L||"cards"===p.params.effect&&u.length<S+2*L?c("Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters"):A&&"row"===g.grid.fill&&c("Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`");const I=[],z=[],$=A?Math.ceil(u.length/g.grid.rows):u.length,k=n&&$-y<S&&!E;let O=k?y:p.activeIndex;void 0===d?d=p.getSlideIndex(u.find(e=>e.classList.contains(g.slideActiveClass))):O=d;const D="next"===i||!i,G="prev"===i||!i;let X=0,B=0;const H=(A?u[d].column??0:d)+(E&&void 0===r?(v?-S/2+.5:0)-C:0);if(H<L){X=Math.max(L-H,x);for(let e=0;e<L-H;e+=1){const t=e-Math.floor(e/$)*$;if(A){const e=$-t-1;for(let t=u.length-1;t>=0;t-=1)u[t].column===e&&I.push(t)}else I.push($-t-1)}}else if(H+S>$-L){B=Math.max(H-($-2*L),x),k&&(B=Math.max(B,S-$+y+1));for(let e=0;e<B;e+=1){const t=e-Math.floor(e/$)*$;A?u.forEach((e,s)=>{e.column===t&&z.push(s)}):z.push(t)}}if(p.__preventObserver__=!0,requestAnimationFrame(()=>{p.__preventObserver__=!1}),"cards"===p.params.effect&&u.length<S+2*L&&(z.includes(d)&&z.splice(z.indexOf(d),1),I.includes(d)&&I.splice(I.indexOf(d),1)),G&&I.forEach(e=>{const t=u[e];t.swiperLoopMoveDOM=!0,f.prepend(t),t.swiperLoopMoveDOM=!1}),D&&z.forEach(e=>{const t=u[e];t.swiperLoopMoveDOM=!0,f.append(t),t.swiperLoopMoveDOM=!1}),p.recalcSlides(),"auto"===g.slidesPerView?p.updateSlides():A&&(I.length>0&&G||z.length>0&&D)&&p.slides.forEach((e,t)=>{p.grid.updateSlide(t,e,p.slides)}),g.watchSlidesProgress&&p.updateSlidesOffset(),s)if(I.length>0&&G){if(void 0===t){const e=p.slidesGrid[O],t=p.slidesGrid[O+X]-e;o?p.setTranslate(p.translate-t):(p.slideTo(O+Math.ceil(X),0,!1,!0),r&&(p.touchEventsData.startTranslate=p.touchEventsData.startTranslate-t,p.touchEventsData.currentTranslate=p.touchEventsData.currentTranslate-t))}else if(r){const e=A?I.length/g.grid.rows:I.length;p.slideTo(p.activeIndex+e,0,!1,!0),p.touchEventsData.currentTranslate=p.translate}}else if(z.length>0&&D)if(void 0===t){const e=p.slidesGrid[O],t=p.slidesGrid[O-B]-e;o?p.setTranslate(p.translate-t):(p.slideTo(O-B,0,!1,!0),r&&(p.touchEventsData.startTranslate=p.touchEventsData.startTranslate-t,p.touchEventsData.currentTranslate=p.touchEventsData.currentTranslate-t))}else{const e=A
vendor: 12,438 bytes, line 21828
21828?z.length/g.grid.rows:z.length;p.slideTo(p.activeIndex-e,0,!1,!0)}p.allowSlidePrev=m,p.allowSlideNext=h;const Y=p.controller?.control;if(Y&&!l){const e={slideRealIndex:t,direction:i,setTranslate:r,activeSlideIndex:d,byController:!0};Array.isArray(Y)?Y.forEach(t=>{!t.destroyed&&t.params.loop&&t.loopFix({...e,slideTo:t.params.slidesPerView===g.slidesPerView&&s})}):Y instanceof p.constructor&&Y.params.loop&&Y.loopFix({...e,slideTo:Y.params.slidesPerView===g.slidesPerView&&s})}p.__loopFixInProgress__=!1,p.emit("loopFix")},loopDestroy:function(){const e=this,{params:t,slidesEl:s}=e;if(!t.loop||!s||e.virtual&&e.params.virtual?.enabled)return;e.recalcSlides();const i=[];e.slides.forEach(e=>{const t=e,s=void 0===t.swiperSlideIndex?Number(e.getAttribute("data-swiper-slide-index")):t.swiperSlideIndex;i[s]=e}),e.slides.forEach(e=>{e.removeAttribute("data-swiper-slide-index")}),i.forEach(e=>{s.append(e)}),e.recalcSlides(),e.slideTo(e.realIndex,0)}};function W(e,t){return function(s={}){const i=Object.keys(s)[0],r=s[i];"object"==typeof r&&null!==r?(!0===e[i]&&(e[i]={enabled:!0}),"navigation"===i&&e[i]&&e[i].enabled&&!e[i].prevEl&&!e[i].nextEl&&(e[i].auto=!0),["pagination","scrollbar"].indexOf(i)>=0&&e[i]&&e[i].enabled&&!e[i].el&&(e[i].auto=!0),i in e&&"enabled"in r?("object"!=typeof e[i]||"enabled"in e[i]||(e[i].enabled=!0),e[i]||(e[i]={enabled:!1}),n(t,s)):n(t,s)):n(t,s)}}var j={slideTo:function(e=0,t,s=!0,i,r){"string"==typeof e&&(e=parseInt(e,10));const a=this;let n=e;n<0&&(n=0);const{params:l,snapGrid:o,slidesGrid:d,previousIndex:c,activeIndex:p,rtlTranslate:u,wrapperEl:m,enabled:h}=a;if(!h&&!i&&!r||a.destroyed||a.animating&&l.preventInteractionOnTransition)return!1;void 0===t&&(t=a.params.speed);const f=Math.min(a.params.slidesPerGroupSkip,n);let g=f+Math.floor((n-f)/a.params.slidesPerGroup);g>=o.length&&(g=o.length-1);const v=-o[g];if(l.normalizeSlideIndex)for(let e=0;e<d.length;e+=1){const t=-Math.floor(100*v),s=Math.floor(100*d[e]),i=Math.floor(100*d[e+1]);void 0!==d[e+1]?t>=s&&t<i-(i-s)/2?n=e:t>=s&&t<i&&(n=e+1):t>=s&&(n=e)}if(a.initialized&&n!==p){if(!a.allowSlideNext&&(u?v>a.translate&&v>a.minTranslate():v<a.translate&&v<a.minTranslate()))return!1;if(!a.allowSlidePrev&&v>a.translate&&v>a.maxTranslate()&&(p||0)!==n)return!1}let w;n!==(c||0)&&s&&a.emit("beforeSlideChangeStart"),a.updateProgress(v),w=n>p?"next":n<p?"prev":"reset";const b=a.virtual&&a.params.virtual?.enabled;if(!(b&&r)&&(u&&-v===a.translate||!u&&v===a.translate))return a.updateActiveIndex(n),l.autoHeight&&a.updateAutoHeight(),a.updateSlidesClasses(),"slide"!==l.effect&&a.setTranslate(v),"reset"!==w&&(a.transitionStart(s,w),a.transitionEnd(s,w)),!1;if(l.cssMode){const e=a.isHorizontal(),s=u?v:-v;return 0===t?(b&&(a.wrapperEl.style.scrollSnapType="none",a._immediateVirtual=!0),b&&!a._cssModeVirtualInitialSet&&(a.params.initialSlide??0)>0?(a._cssModeVirtualInitialSet=!0,requestAnimationFrame(()=>{m[e?"scrollLeft":"scrollTop"]=s})):m[e?"scrollLeft":"scrollTop"]=s,b&&requestAnimationFrame(()=>{a.wrapperEl.style.scrollSnapType="",a._immediateVirtual=!1})):m.scrollTo({[e?"left":"top"]:s,behavior:"smooth"}),!0}const y=C().isSafari;return b&&!r&&y&&a.isElement&&a.virtual.update(!1,!1,n),a.setTransition(t),a.setTranslate(v),a.updateActiveIndex(n),a.updateSlidesClasses(),a.emit("beforeTransitionStart",t,i),a.transitionStart(s,w),0===t?a.transitionEnd(s,w):a.animating||(a.animating=!0,a.onSlideToWrapperTransitionEnd||(a.onSlideToWrapperTransitionEnd=function(e){a&&!a.destroyed&&e.target===this&&(a.wrapperEl.removeEventListener("transitionend",a.onSlideToWrapperTransitionEnd),a.onSlideToWrapperTransitionEnd=null,delete a.onSlideToWrapperTransitionEnd,a.transitionEnd(s,w))}),a.wrapperEl.addEventListener("transitionend",a.onSlideToWrapperTransitionEnd)),!0},slideToLoop:function(e=0,t,s=!0,i){if("string"==typeof e){e=parseInt(e,10)}const r=this;if(r.destroyed)return;void 0===t&&(t=r.params.speed);const a=r.grid&&r.params.grid&&r.params.grid.rows>1;let n=e;if(r.params.loop)if(r.virtual&&r.params.virtual?.enabled)n+=r.virtual.slidesBefore??0;else{let e;if(a){const t=n*r.params.grid.rows,s=r.slides.find(e=>Number(e.getAttribute("data-swiper-slide-index"))===t);e=s?.column??0}else e=r.getSlideIndexByData(n);const t=a?Math.ceil(r.slides.length/r.params.grid.rows):r.slides.length,{centeredSlides:s,slidesOffsetBefore:l,slidesOffsetAfter:o}=r.params,d=s||!!l||!!o;let c;"auto"===r.params.slidesPerView?c=r.slidesPerViewDynamic():(c=Math.ceil(parseFloat(String(r.params.slidesPerView))),d&&c%2==0&&(c+=1));let p=t-e<c;if(d&&(p=p||e<Math.ceil(c/2)),i&&d&&"auto"!==r.params.slidesPerView&&!a&&(p=!1),p){const s=d?e<r.activeIndex?"prev":"next":e-r.activeIndex-1<r.params.slidesPerView?"next":"prev";r.loopFix({direction:s,slideTo:!0,activeSlideIndex:"next"===s?e+1:e-t+1,slideRealIndex:"next"===s?r.realIndex:void 0})}if(a){const e=n*r.params.grid.rows,t=r.slides.find(t=>Number(t.getAttribute("data-swiper-slide-index"))===e);n=t?.column??0}else n=r.getSlideIndexByData(n)}return requestAnimationFrame(()=>{r.slideTo(n,t,s,i)}),r},slideNext:function(e,t=!0,s){const i=this,{enabled:r,params:a,animating:n}=i;if(!r||i.destroyed)return i;void 0===e&&(e=i.params.speed);let l=a.slidesPerGroup;"auto"===a.slidesPerView&&1===a.slidesPerGroup&&a.slidesPerGroupAuto&&(l=Math.max(i.slidesPerViewDynamic("current",!0),1));const o=i.activeIndex<a.slidesPerGroupSkip?1:l,d=i.virtual&&a.virtual?.enabled;if(a.loop){if(n&&!d&&a.loopPreventsSliding)return!1;if(i.loopFix({direction:"next"}),i._clientLeft=i.wrapperEl.clientLeft,i.activeIndex===i.slides.length-1&&a.cssMode)return requestAnimationFrame(()=>{i.slideTo(i.activeIndex+o,e,t,s)}),!0}return a.rewind&&i.isEnd?i.slideTo(0,e,t,s):i.slideTo(i.activeIndex+o,e,t,s)},slidePrev:function(e,t=!0,s){const i=this,{params:r,snapGrid:a,slidesGrid:n,rtlTranslate:l,enabled:o,animating:d}=i;if(!o||i.destroyed)return i;void 0===e&&(e=i.params.speed);const c=i.virtual&&r.virtual?.enabled;if(r.loop){if(d&&!c&&r.loopPreventsSliding)return!1;i.loopFix({direction:"prev"}),i._clientLeft=i.wrapperEl.clientLeft}function p(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}const u=p(l?i.translate:-i.translate),m=a.map(e=>p(e)),h=r.freeMode&&r.freeMode.enabled;let f=a[m.indexOf(u)-1];if(void 0===f&&(r.cssMode||h)){let e;a.forEach((t,s)=>{u>=t&&(e=s)}),void 0!==e&&(f=h?a[e]:a[e>0?e-1:e])}let g=0;if(void 0!==f&&(g=n.indexOf(f),g<0&&(g=i.activeIndex-1),"auto"===r.slidesPerView&&1===r.slidesPerGroup&&r.slidesPerGroupAuto&&(g=g-i.slidesPerViewDynamic("previous",!0)+1,g=Math.max(g,0))),r.rewind&&i.isBeginning){const r=i.params.virtual?.enabled&&i.virtual?i.virtual.slides.length-1:i.slides.length-1;return i.slideTo(r,e,t,s)}return r.loop&&0===i.activeIndex&&r.cssMode?(requestAnimationFrame(()=>{i.slideTo(g,e,t,s)}),!0):i.slideTo(g,e,t,s)},slideReset:function(e,t=!0,s){const i=this;if(!i.destroyed)return void 0===e&&(e=i.params.speed),i.slideTo(i.activeIndex,e,t,s)},slideToClosest:function(e,t=!0,s,i=.5){const r=this;if(r.destroyed)return;void 0===e&&(e=r.params.speed);let a=r.activeIndex;const n=Math.min(r.params.slidesPerGroupSkip,a),l=n+Math.floor((a-n)/r.params.slidesPerGroup),o=r.rtlTranslate?r.translate:-r.translate;if(o>=r.snapGrid[l]){const e=r.snapGrid[l];o-e>(r.snapGrid[l+1]-e)*i&&(a+=r.params.slidesPerGroup)}else{const e=r.snapGrid[l-1];o-e<=(r.snapGrid[l]-e)*i&&(a-=r.params.slidesPerGroup)}return a=Math.max(a,0),a=Math.min(a,r.slidesGrid.length-1),r.slideTo(a,e,t,s)},slideToClickedSlide:function(){const e=this;if(e.destroyed)return;const{params:s,slidesEl:i,clickedSlide:r,clickedIndex:a}=e;if(void 0===r||void 0===a)return;const n="auto"===s.slidesPerView?e.slidesPerViewDynamic():s.slidesPerView;let l,o=e.getSlideIndexWhenGrid(a);const c=e.isElement?"swiper-slide":`.${s.slideClass}`,p=e.grid&&e.params.grid&&e.params.grid.rows>1;if(s.loop){if(e.animating)return;l=parseInt(r.getAttribute("data-swiper-slide-index"),10),s.centeredSlides?e.slideToLoop(l):o>(p?(e.slides.length-n)/2-(e.params.grid.rows-1):e.slides.length-n)?(e.loopFix(),o=e.getSlideIndex(d(i,`${c}[data-swiper-slide-index="${l}"]`)[0]),t(()=>{e.slideTo(o)})):e.slideTo(o)}else e.slideTo(o)}};function U({swiper:e,runCallbacks:t,direction:s,step:i}){const{activeIndex:r,previousIndex:a}=e;let n=s;n||(n=r>a?"next":r<a?"prev":"reset"),e.emit(`transition${i}`),t&&"reset"===n?e.emit(`slideResetTransition${i}`):t&&r!==a&&(e.emit(`slideChangeTransition${i}`),"next"===n?e.emit(`slideNextTransition${i}`):e.emit(`slidePrevTransition${i}`))}var K={getTranslate:function(e=(this.isHorizontal()?"x":"y")){const{params:t,rtlTranslate:s,translate:r,wrapperEl:a}=this;if(t.virtualTranslate)return s?-r:r;if(t.cssMode)return r;let n=i(a,e);return n+=this.cssOverflowAdjustment(),s&&(n=-n),n||0},setTranslate:function(e,t){const s=this,{rtlTranslate:i,params:r,wrapperEl:a,progress:n}=s;let l,o=0,d=0;s.isHorizontal()?o=i?-e:e:d=e,r.roundLengths&&(o=Math.floor(o),d=Math.floor(d)),s.previousTranslate=s.translate,s.translate=s.isHorizontal()?o:d,r.cssMode?a[s.isHorizontal()?"scrollLeft":"scrollTop"]=s.isHorizontal()?-o:-d:r.virtualTranslate||(s.isHorizontal()?o-=s.cssOverflowAdjustment():d-=s.cssOverflowAdjustment(),a.style.transform=`translate3d(${o}px, ${d}px, 0px)`);const c=s.maxTranslate()-s.minTranslate();l=0===c?0:(e-s.minTranslate())/c,l!==n&&s.updateProgress(e),s.emit("setTranslate",s.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]},translateTo:function(e=0,t=this.params.speed,s=!0,i=!0,r){const a=this,{params:n,wrapperEl:l}=a;if(a.animating&&n.preventInteractionOnTransition)return!1;const o=a.minTranslate(),d=a.maxTranslate();let c;if(c=i&&e>o?o:i&&e<d?d:e,a.updateProgress(c),n.cssMode){const e=a.isHorizontal();return 0===t?l[e?"scrollLeft":"scrollTop"]=-c:l.scrollTo({[e?"left":"top"]:-c,behavior:"smooth"}),!0}return 0===t?(a.setTransition(0),a.setTranslate(c),s&&(a.emit("beforeTransitionStart",t,r),a.emit("transitionEnd"))):(a.setTransition(t),a.setTranslate(c),s&&(a.emit("beforeTransitionStart",t,r),a.emit("transitionStart")),a.animating||(a.animating=!0,a.onTranslateToWrapperTransitionEnd||(a.onTranslateToWrapperTransitionEnd=function(e){a&&!a.destroyed&&e.target===this&&(a.wrapperEl.removeEventListener("transitionend",a.onTranslateToWrapperTransitionEnd),a.onTranslateToWrapperTransitionEnd=null,delete a.onTranslateToWrapperTransitionEnd,a.animating=!1,s&&a.emit("transitionEnd"))}),a.wrapperEl.addEventListener("transitionend",a.onTranslateToWrapperTransitionEnd))),!0}};const Z=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};const Q=(e,t,s)=>{t&&!e.classList.contains(s)?e.classList.add(s):!t&&e.classList.contains(s)&&e.classList.remove(s)};var J={updateSize:function(){const e=this;let t,s;const i=e.el;t=void 0!==e.params.width&&null!==e.params.width?e.params.width:i.clientWidth,s=void 0!==e.params.height&&null!==e.params.height?e.params.height:i.clientHeight,0===t&&e.isHorizontal()||0===s&&e.isVertical()||(t=t-parseInt(m(i,"padding-left")||"0",10)-parseInt(m(i,"padding-right")||"0",10),s=s-parseInt(m(i,"padding-top")||"0",10)-parseInt(m(i,"padding-bottom")||"0",10),Number.isNaN(t)&&(t=0),Number.isNaN(s)&&(s=0),Object.assign(e,{width:t,height:s,size:e.isHorizontal()?t:s}))},updateSlides:function(){const e=this;function t(t,s){return parseFloat(t.getPropertyValue(e.getDirectionLabel(s))||"0")}const s=e.params,{wrapperEl:i,slidesEl:r,rtlTranslate:a,wrongRTL:n}=e,o=!(!e.virtual||!s.virtual?.enabled),c=o?e.virtual.slides.length:e.slides.length,p=d(r,`.${e.params.slideClass}, swiper-slide`),u=o?e.virtual.slides.length:p.length;let h=[];const f=[],g=[],w=t=>"function"==typeof t?t.call(e):t,b=w(s.slidesOffsetBefore),y=w(s.slidesOffsetAfter),E=e.snapGrid.length,S=e.slidesGrid.length,x=e.size-b-y;let T=s.spaceBetween,M=-b,C=0,P=0;if(void 0===x)return;"string"==typeof T&&T.indexOf("%")>=0?T=parseFloat(T.replace("%",""))/100*x:"string"==typeof T&&(T=parseFloat(T)),e.virtualSize=-T-b-y,p.forEach(e=>{a?e.style.marginLeft="":e.style.marginRight="",e.style.marginBottom="",e.style.marginTop=""}),s.centeredSlides&&s.cssMode&&(l(i,"--swiper-centered-offset-before",""),l(i,"--swiper-centered-offset-after","")),s.cssMode&&(l(i,"--swiper-slides-offset-before",`${b}px`),l(i,"--swiper-slides-offset-after",`${y}px`));const L=s.grid&&s.grid.rows>1&&e.grid;L?e.grid.initSlides(p):e.grid&&e.grid.unsetSlides();let
vendor: 9,312 bytes, line 21828
21828A=0;const I="auto"===s.slidesPerView&&s.breakpoints&&Object.keys(s.breakpoints).filter(e=>{const t=s.breakpoints[e];return void 0!==t?.slidesPerView}).length>0;for(let i=0;i<u;i+=1){A=0;const r=p[i];if(!r||(L&&e.grid.updateSlide(i,r,p),"none"!==m(r,"display"))){if(o&&"auto"===s.slidesPerView)s.virtual?.slidesPerViewAutoSlideSize&&(A=s.virtual.slidesPerViewAutoSlideSize),A&&r&&(s.roundLengths&&(A=Math.floor(A)),r.style[e.getDirectionLabel("width")]=`${A}px`);else if("auto"===s.slidesPerView){I&&(r.style[e.getDirectionLabel("width")]="");const i=getComputedStyle(r),a=r.style.transform,n=r.style.webkitTransform;if(a&&(r.style.transform="none"),n&&(r.style.webkitTransform="none"),s.roundLengths)A=e.isHorizontal()?v(r,"width"):v(r,"height");else{const e=t(i,"width"),s=t(i,"padding-left"),a=t(i,"padding-right"),n=t(i,"margin-left"),l=t(i,"margin-right"),o=i.getPropertyValue("box-sizing");if(o&&"border-box"===o)A=e+n+l;else{const{clientWidth:t,offsetWidth:i}=r;A=e+s+a+n+l+(i-t)}}a&&(r.style.transform=a),n&&(r.style.webkitTransform=n),s.roundLengths&&(A=Math.floor(A))}else A=(x-(s.slidesPerView-1)*T)/s.slidesPerView,s.roundLengths&&(A=Math.floor(A)),r&&(r.style[e.getDirectionLabel("width")]=`${A}px`);r&&(r.swiperSlideSize=A),g.push(A),s.centeredSlides?(M=M+A/2+C/2+T,0===C&&0!==i&&(M=M-x/2-T),0===i&&(M=M-x/2-T),Math.abs(M)<.001&&(M=0),s.roundLengths&&(M=Math.floor(M)),P%s.slidesPerGroup===0&&h.push(M),f.push(M)):(s.roundLengths&&(M=Math.floor(M)),(P-Math.min(e.params.slidesPerGroupSkip,P))%e.params.slidesPerGroup===0&&h.push(M),f.push(M),M=M+A+T),e.virtualSize+=A+T,C=A,P+=1}}if(e.virtualSize=Math.max(e.virtualSize,x)+y,a&&n&&("slide"===s.effect||"coverflow"===s.effect)&&(i.style.width=`${e.virtualSize+T}px`),s.setWrapperSize&&(i.style[e.getDirectionLabel("width")]=`${e.virtualSize+T}px`),L&&e.grid.updateWrapperSize(A,h),!s.centeredSlides){const t="auto"!==s.slidesPerView&&s.slidesPerView%1!=0,i=s.snapToSlideEdge&&!s.loop&&("auto"===s.slidesPerView||t);let r=h.length;if(i){let e;if("auto"===s.slidesPerView){e=1;let t=0;for(let s=g.length-1;s>=0&&(t+=g[s]+(s<g.length-1?T:0),t<=x);s-=1)e=g.length-s}else e=Math.floor(s.slidesPerView);r=Math.max(u-e,0)}const a=[];for(let t=0;t<h.length;t+=1){let n=h[t];s.roundLengths&&(n=Math.floor(n)),i?t<=r&&a.push(n):h[t]<=e.virtualSize-x&&a.push(n)}h=a,Math.floor(e.virtualSize-x)-Math.floor(h[h.length-1])>1&&(i||h.push(e.virtualSize-x))}if(o&&s.loop){const t=g[0]+T,i=(e.virtual.slidesBefore??0)+(e.virtual.slidesAfter??0);if(s.slidesPerGroup>1){const e=Math.ceil(i/s.slidesPerGroup),r=t*s.slidesPerGroup;for(let t=0;t<e;t+=1)h.push(h[h.length-1]+r)}for(let r=0;r<i;r+=1)1===s.slidesPerGroup&&h.push(h[h.length-1]+t),f.push(f[f.length-1]+t),e.virtualSize+=t}if(0===h.length&&(h=[0]),0!==T){const t=e.isHorizontal()&&a?"marginLeft":e.getDirectionLabel("marginRight");p.filter((e,t)=>!(s.cssMode&&!s.loop)||t!==p.length-1).forEach(e=>{e.style[t]=`${T}px`})}if(s.centeredSlides&&s.centeredSlidesBounds){let e=0;g.forEach(t=>{e+=t+(T||0)}),e-=T;const t=e>x?e-x:0;h=h.map(e=>e<=0?-b:e>t?t+y:e)}if(s.centerInsufficientSlides){let e=0;if(g.forEach(t=>{e+=t+(T||0)}),e-=T,e<x){const t=(x-e)/2;h.forEach((e,s)=>{h[s]=e-t}),f.forEach((e,s)=>{f[s]=e+t})}}if(Object.assign(e,{slides:p,snapGrid:h,slidesGrid:f,slidesSizesGrid:g}),s.centeredSlides&&s.cssMode&&!s.centeredSlidesBounds){l(i,"--swiper-centered-offset-before",-h[0]+"px"),l(i,"--swiper-centered-offset-after",e.size/2-g[g.length-1]/2+"px");const t=-e.snapGrid[0],s=-e.slidesGrid[0];e.snapGrid=e.snapGrid.map(e=>e+t),e.slidesGrid=e.slidesGrid.map(e=>e+s)}if(u!==c&&e.emit("slidesLengthChange"),h.length!==E&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),f.length!==S&&e.emit("slidesGridLengthChange"),s.watchSlidesProgress&&e.updateSlidesOffset(),e.emit("slidesUpdated"),!(o||s.cssMode||"slide"!==s.effect&&"fade"!==s.effect)){const t=`${s.containerModifierClass}backface-hidden`,i=e.el.classList.contains(t);u<=s.maxBackfaceHiddenSlides?i||e.el.classList.add(t):i&&e.el.classList.remove(t)}},updateAutoHeight:function(e){const t=this,s=[],i=t.virtual&&t.params.virtual?.enabled;let r,a=0;"number"==typeof e?t.setTransition(e):!0===e&&t.setTransition(t.params.speed);const n=e=>i?t.slides[t.getSlideIndexByData(e)]:t.slides[e];if("auto"!==t.params.slidesPerView&&t.params.slidesPerView>1)if(t.params.centeredSlides)(t.visibleSlides||[]).forEach(e=>{s.push(e)});else for(r=0;r<Math.ceil(t.params.slidesPerView);r+=1){const e=t.activeIndex+r;if(e>t.slides.length&&!i)break;const a=n(e);a&&s.push(a)}else{const e=n(t.activeIndex);e&&s.push(e)}for(r=0;r<s.length;r+=1)if(void 0!==s[r]){const e=s[r].offsetHeight;a=e>a?e:a}(a||0===a)&&(t.wrapperEl.style.height=`${a}px`)},updateSlidesOffset:function(){const e=this,t=e.slides,s=e.isElement?e.isHorizontal()?e.wrapperEl.offsetLeft:e.wrapperEl.offsetTop:0;for(let i=0;i<t.length;i+=1)t[i].swiperSlideOffset=(e.isHorizontal()?t[i].offsetLeft:t[i].offsetTop)-s-e.cssOverflowAdjustment()},updateSlidesProgress:function(e=this&&this.translate||0){const t=this,s=t.params,{slides:i,rtlTranslate:r,snapGrid:a}=t;if(0===i.length)return;void 0===i[0].swiperSlideOffset&&t.updateSlidesOffset();let n=-e;r&&(n=e),t.visibleSlidesIndexes=[],t.visibleSlides=[];let l=s.spaceBetween;"string"==typeof l&&l.indexOf("%")>=0?l=parseFloat(l.replace("%",""))/100*t.size:"string"==typeof l&&(l=parseFloat(l));for(let e=0;e<i.length;e+=1){const o=i[e];let d=o.swiperSlideOffset??0;s.cssMode&&s.centeredSlides&&(d-=i[0].swiperSlideOffset??0);const c=o.swiperSlideSize??0,p=(n+(s.centeredSlides?t.minTranslate():0)-d)/(c+l),u=(n-a[0]+(s.centeredSlides?t.minTranslate():0)-d)/(c+l),m=-(n-d),h=m+t.slidesSizesGrid[e],f=m>=0&&m<=t.size-t.slidesSizesGrid[e],g=m>=0&&m<t.size-1||h>1&&h<=t.size||m<=0&&h>=t.size;g&&(t.visibleSlides.push(o),t.visibleSlidesIndexes.push(e)),Q(o,g,s.slideVisibleClass),Q(o,f,s.slideFullyVisibleClass),o.progress=r?-p:p,o.originalProgress=r?-u:u}},updateProgress:function(e){const t=this;if(void 0===e){const s=t.rtlTranslate?-1:1;e=t&&t.translate&&t.translate*s||0}const s=t.params,i=t.maxTranslate()-t.minTranslate();let{progress:r,isBeginning:a,isEnd:n}=t,l=t.progressLoop;const o=a,d=n;if(0===i)r=0,a=!0,n=!0;else{r=(e-t.minTranslate())/i;const s=Math.abs(e-t.minTranslate())<1,l=Math.abs(e-t.maxTranslate())<1;a=s||r<=0,n=l||r>=1,s&&(r=0),l&&(r=1)}if(s.loop){const s=t.getSlideIndexByData(0),i=t.getSlideIndexByData(t.slides.length-1),r=t.slidesGrid[s],a=t.slidesGrid[i],n=t.slidesGrid[t.slidesGrid.length-1],o=Math.abs(e);l=o>=r?(o-r)/n:(o+n-a)/n,l>1&&(l-=1)}Object.assign(t,{progress:r,progressLoop:l,isBeginning:a,isEnd:n}),(s.watchSlidesProgress||s.centeredSlides&&s.autoHeight)&&t.updateSlidesProgress(e),a&&!o&&t.emit("reachBeginning toEdge"),n&&!d&&t.emit("reachEnd toEdge"),(o&&!a||d&&!n)&&t.emit("fromEdge"),t.emit("progress",r)},updateSlidesClasses:function(){const e=this,{slides:t,params:s,slidesEl:i,activeIndex:r}=e,a=!(!e.virtual||!s.virtual?.enabled),n=e.grid&&s.grid&&s.grid.rows>1,l=e=>d(i,`.${s.slideClass}${e}, swiper-slide${e}`)[0];let o,c,p;if(a)if(s.loop){const t=e.virtual.slides;let s=r-(e.virtual.slidesBefore??0);s<0&&(s=t.length+s),s>=t.length&&(s-=t.length),o=l(`[data-swiper-slide-index="${s}"]`)}else o=l(`[data-swiper-slide-index="${r}"]`);else n?(o=t.find(e=>e.column===r),p=t.find(e=>e.column===r+1),c=t.find(e=>e.column===r-1)):o=t[r];o&&(n||(p=function(e,t){const s=[];let i=e.nextElementSibling;for(;i;)t&&!i.matches(t)||s.push(i),i=i.nextElementSibling;return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&!p&&(p=t[0]),c=function(e,t){const s=[];let i=e.previousElementSibling;for(;i;)t&&!i.matches(t)||s.push(i),i=i.previousElementSibling;return s}(o,`.${s.slideClass}, swiper-slide`)[0],s.loop&&0===!c&&(c=t[t.length-1]))),t.forEach(e=>{Z(e,e===o,s.slideActiveClass),Z(e,e===p,s.slideNextClass),Z(e,e===c,s.slidePrevClass)}),e.emitSlidesClasses()},updateActiveIndex:function(e){const t=this,s=t.rtlTranslate?t.translate:-t.translate,{snapGrid:i,params:r,activeIndex:a,realIndex:n,snapIndex:l}=t;let o,d=e;const c=e=>{const s=t.virtual.slides;let i=e-(t.virtual.slidesBefore??0);return i<0&&(i=s.length+i),i>=s.length&&(i-=s.length),i};if(void 0===d&&(d=function(e){const{slidesGrid:t,params:s}=e,i=e.rtlTranslate?e.translate:-e.translate;let r;for(let e=0;e<t.length;e+=1)void 0!==t[e+1]?i>=t[e]&&i<t[e+1]-(t[e+1]-t[e])/2?r=e:i>=t[e]&&i<t[e+1]&&(r=e+1):i>=t[e]&&(r=e);return s.normalizeSlideIndex&&(r<0||void 0===r)&&(r=0),r}(t)),i.indexOf(s)>=0)o=i.indexOf(s);else{const e=Math.min(r.slidesPerGroupSkip,d);o=e+Math.floor((d-e)/r.slidesPerGroup)}if(o>=i.length&&(o=i.length-1),d===a&&!t.params.loop)return void(o!==l&&(t.snapIndex=o,t.emit("snapIndexChange")));if(d===a&&t.params.loop&&t.virtual&&t.params.virtual?.enabled)return void(t.realIndex=c(d));const p=t.grid&&r.grid&&r.grid.rows>1;let u;if(t.virtual&&r.virtual?.enabled)u=r.loop?c(d):d;else if(p){const e=t.slides.find(e=>e.column===d);let s=parseInt(e.getAttribute("data-swiper-slide-index"),10);Number.isNaN(s)&&(s=Math.max(t.slides.indexOf(e),0)),u=Math.floor(s/r.grid.rows)}else if(t.slides[d]){const e=t.slides[d].getAttribute("data-swiper-slide-index");u=e?parseInt(e,10):d}else u=d;Object.assign(t,{previousSnapIndex:l,snapIndex:o,previousRealIndex:n,realIndex:u,previousIndex:a,activeIndex:d}),t.initialized&&A
vendor: 10,737 bytes, line 21828
21828(t),t.__loopFixInProgress__||(t.emit("activeIndexChange"),t.emit("snapIndexChange"),(t.initialized||t.params.runCallbacksOnInit)&&((t.__lastEmittedRealIndex__??n)!==u&&t.emit("realIndexChange"),t.emit("slideChange")),t.__lastEmittedRealIndex__=u)},updateClickedSlide:function(e,t){const s=this,i=s.params;let r=e.closest(`.${i.slideClass}, swiper-slide`);!r&&s.isElement&&t&&t.length>1&&t.includes(e)&&[...t.slice(t.indexOf(e)+1,t.length)].forEach(e=>{!r&&e.matches&&e.matches(`.${i.slideClass}, swiper-slide`)&&(r=e)});let a,n=!1;if(r)for(let e=0;e<s.slides.length;e+=1)if(s.slides[e]===r){n=!0,a=e;break}if(!r||!n)return s.clickedSlide=void 0,void(s.clickedIndex=void 0);s.clickedSlide=r,s.virtual&&s.params.virtual?.enabled?s.clickedIndex=parseInt(r.getAttribute("data-swiper-slide-index"),10):s.clickedIndex=a,i.slideToClickedSlide&&void 0!==s.clickedIndex&&s.clickedIndex!==s.activeIndex&&s.slideToClickedSlide()}};const ee={eventsEmitter:D,update:J,translate:K,transition:{setTransition:function(e,t){const s=this;s.params.cssMode||(s.wrapperEl.style.transitionDuration=`${e}ms`,s.wrapperEl.style.transitionDelay=0===e?"0ms":""),s.emit("setTransition",e,t)},transitionStart:function(e=!0,t){const s=this,{params:i}=s;i.cssMode||(i.autoHeight&&s.updateAutoHeight(),U({swiper:s,runCallbacks:e,direction:t,step:"Start"}))},transitionEnd:function(e=!0,t){const s=this,{params:i}=s;s.animating=!1,i.cssMode||(s.setTransition(0),U({swiper:s,runCallbacks:e,direction:t,step:"End"}))}},slide:j,loop:F,grabCursor:{setGrabCursor:function(e){const t=this;if(!t.params.simulateTouch||t.params.watchOverflow&&t.isLocked||t.params.cssMode)return;const s="container"===t.params.touchEventsTarget?t.el:t.wrapperEl;t.isElement&&(t.__preventObserver__=!0),s.style.cursor="move",s.style.cursor=e?"grabbing":"grab",t.isElement&&requestAnimationFrame(()=>{t.__preventObserver__=!1})},unsetGrabCursor:function(){const e=this;e.params.watchOverflow&&e.isLocked||e.params.cssMode||(e.isElement&&(e.__preventObserver__=!0),e["container"===e.params.touchEventsTarget?"el":"wrapperEl"].style.cursor="",e.isElement&&requestAnimationFrame(()=>{e.__preventObserver__=!1}))}},events:{attachEvents:function(){const e=this,{params:t}=e;e.onTouchStart=V.bind(e),e.onTouchMove=_.bind(e),e.onTouchEnd=R.bind(e),e.onDocumentTouchStart=X.bind(e),t.cssMode&&(e.onScroll=Y.bind(e)),e.onClick=G.bind(e),e.onLoad=B.bind(e),q(e,"on")},detachEvents:function(){q(this,"off")}},breakpoints:z,checkOverflow:$,classes:k},te={};class se{static extendedDefaults;static defaults;constructor(...e){let t,s;if(1===e.length&&null!==e[0]&&"object"==typeof e[0]&&"Object"===Object.prototype.toString.call(e[0]).slice(8,-1)?s=e[0]:[t,s]=e,s||(s={}),s=n({},s),t&&!s.el&&(s.el=t),s.el&&"string"==typeof s.el&&"undefined"!=typeof document&&document.querySelectorAll(s.el).length>1){const e=[];return document.querySelectorAll(s.el).forEach(t=>{const i=n({},s,{el:t});e.push(new se(i))}),e}const i=this;i.__swiper__=!0,i.support=T(),i.device=M({userAgent:s.userAgent??void 0}),i.browser=C(),i.eventsListeners={},i.eventsAnyListeners=[],i.modules=[...i.__modules__||[]],s.modules&&Array.isArray(s.modules)&&s.modules.forEach(e=>{const t=e;"function"==typeof t&&i.modules.indexOf(t)<0&&i.modules.push(t)});const r={};i.modules.forEach(e=>{e({params:s,swiper:i,extendParams:W(s,r),on:i.on.bind(i),once:i.once.bind(i),off:i.off.bind(i),emit:i.emit.bind(i)})});const a=n({},O,r);if(i.params=n({},a,te,s),i.originalParams=n({},i.params),i.passedParams=n({},s),i.params&&i.params.on){const e=i.params.on;Object.keys(e).forEach(t=>{const s=e[t];s&&i.on(t,s)})}return i.params&&i.params.onAny&&i.onAny(i.params.onAny),Object.assign(i,{enabled:i.params.enabled,el:t,classNames:[],slides:[],slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:()=>"horizontal"===i.params.direction,isVertical:()=>"vertical"===i.params.direction,activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,cssOverflowAdjustment(){return Math.trunc(this.translate/2**23)*2**23},allowSlideNext:i.params.allowSlideNext,allowSlidePrev:i.params.allowSlidePrev,touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,focusableElements:i.params.focusableElements,lastClickTime:0,clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,startMoving:void 0,pointerId:null,touchId:null},allowClick:!0,allowTouchMove:i.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),i.emit("_swiper"),i.params.init&&i.init(),i}getDirectionLabel(e){return this.isHorizontal()?e:{width:"height","margin-top":"margin-left","margin-bottom ":"margin-right","margin-left":"margin-top","margin-right":"margin-bottom","padding-left":"padding-top","padding-right":"padding-bottom",marginRight:"marginBottom"}[e]}isHorizontal(){return"horizontal"===this.params.direction}isVertical(){return"vertical"===this.params.direction}cssOverflowAdjustment(){return Math.trunc(this.translate/2**23)*2**23}getSlideIndex(e){const{slidesEl:t,params:s}=this,i=h(d(t,`.${s.slideClass}, swiper-slide`)[0]);return h(e)-(i??0)}getSlideIndexByData(e){return this.getSlideIndex(this.slides.find(t=>Number(t.getAttribute("data-swiper-slide-index"))===e))}getSlideIndexWhenGrid(e){return this.grid&&this.params.grid&&this.params.grid.rows>1&&("column"===this.params.grid.fill?e=Math.floor(e/this.params.grid.rows):"row"===this.params.grid.fill&&(e%=Math.ceil(this.slides.length/this.params.grid.rows))),e}recalcSlides(){const{slidesEl:e,params:t}=this;this.slides=d(e,`.${t.slideClass}, swiper-slide`)}enable(){this.enabled||(this.enabled=!0,this.params.grabCursor&&this.setGrabCursor(),this.emit("enable"))}disable(){this.enabled&&(this.enabled=!1,this.params.grabCursor&&this.unsetGrabCursor(),this.emit("disable"))}setProgress(e,t){e=Math.min(Math.max(e,0),1);const s=this.minTranslate(),i=(this.maxTranslate()-s)*e+s;this.translateTo(i,void 0===t?0:t),this.updateActiveIndex(),this.updateSlidesClasses()}emitContainerClasses(){if(!this.params._emitClasses||!this.el)return;const e=this.el.className.split(" ").filter(e=>0===e.indexOf("swiper")||0===e.indexOf(this.params.containerModifierClass));this.emit("_containerClasses",e.join(" "))}getSlideClasses(e){return this.destroyed?"":e.className.split(" ").filter(e=>0===e.indexOf("swiper-slide")||0===e.indexOf(this.params.slideClass)).join(" ")}emitSlidesClasses(){if(!this.params._emitClasses||!this.el)return;const e=[];this.slides.forEach(t=>{const s=this.getSlideClasses(t);e.push({slideEl:t,classNames:s}),this.emit("_slideClass",t,s)}),this.emit("_slideClasses",e)}slidesPerViewDynamic(e="current",t=!1){const{params:s,slides:i,slidesGrid:r,slidesSizesGrid:a,size:n,activeIndex:l}=this;let o=1;if("number"==typeof s.slidesPerView)return s.slidesPerView;if(!n)return o;if(s.centeredSlides){let e=i[l]?Math.ceil(i[l].swiperSlideSize??0):0,t=!1;for(let s=l+1;s<i.length;s+=1)i[s]&&!t&&(e+=Math.ceil(i[s].swiperSlideSize??0),o+=1,e>n&&(t=!0));for(let s=l-1;s>=0;s-=1)i[s]&&!t&&(e+=i[s].swiperSlideSize??0,o+=1,e>n&&(t=!0))}else if("current"===e)for(let e=l+1;e<i.length;e+=1){(t?r[e]+a[e]-r[l]<n:r[e]-r[l]<n)&&(o+=1)}else for(let e=l-1;e>=0;e-=1){r[l]-r[e]<n&&(o+=1)}return o}update(){const e=this;if(!e||e.destroyed)return;const{snapGrid:t,params:s}=e;function i(){const t=e.rtlTranslate?-1*e.translate:e.translate,s=Math.min(Math.max(t,e.maxTranslate()),e.minTranslate());e.setTranslate(s),e.updateActiveIndex(),e.updateSlidesClasses()}let r;if(s.breakpoints&&e.setBreakpoint(),s.lazyPreload&&[...e.el.querySelectorAll('[loading="lazy"]')].forEach(t=>{t.complete&&P(e,t)}),e.updateSize(),e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),s.freeMode?.enabled&&!s.cssMode)i(),s.autoHeight&&e.updateAutoHeight();else{if(("auto"===s.slidesPerView||s.slidesPerView>1)&&e.isEnd&&!s.centeredSlides){const t=e.virtual&&s.virtual?.enabled?e.virtual.slides.length:e.slides.length;r=e.slideTo(t-1,0,!1,!0)}else r=e.slideTo(e.activeIndex,0,!1,!0);r||i()}s.watchOverflow&&t!==e.snapGrid&&e.checkOverflow(),e.emit("update")}changeDirection(e,t=!0){const s=this,i=s.params.direction;return e||(e="horizontal"===i?"vertical":"horizontal"),e===i||"horizontal"!==e&&"vertical"!==e||(s.el.classList.remove(`${s.params.containerModifierClass}${i}`),s.el.classList.add(`${s.params.containerModifierClass}${e}`),s.emitContainerClasses(),s.params.direction=e,s.rtlTranslate="horizontal"===e&&s.rtl,s.slides.forEach(t=>{"vertical"===e?t.style.width="":t.style.height=""}),s.emit("changeDirection"),t&&s.update()),s}changeLanguageDirection(e){const t=this;t.rtl&&"rtl"===e||!t.rtl&&"ltr"===e||(t.rtl="rtl"===e,t.rtlTranslate="horizontal"===t.params.direction&&t.rtl,t.rtl?(t.el.classList.add(`${t.params.containerModifierClass}rtl`),t.el.dir="rtl"):(t.el.classList.remove(`${t.params.containerModifierClass}rtl`),t.el.dir="ltr"),t.update())}mount(e){const t=this;if(t.mounted)return!0;if("undefined"==typeof document)return!1;const s=e??t.params.el;let i=null;if("string"==typeof s?i=document.querySelector(s):s instanceof HTMLElement&&(i=s),!i)return!1;i.swiper=t;const r=i.parentNode;r&&r.host&&r.host.nodeName===t.params.swiperElementNodeName.toUpperCase()&&(t.isElement=!0);const a=()=>`.${(t.params.wrapperClass||"").trim().split(" ").join(".")}`;let n=(()=>{if(i&&i.shadowRoot){return i.shadowRoot.querySelector(a())}return d(i,a())[0]})();!n&&t.params.createElements&&(n=p("div",t.params.wrapperClass),i.append(n),d(i,`.${t.params.slideClass}`).forEach(e=>{n.append(e)}));const l=t.isElement?i.parentNode.host:null;return Object.assign(t,{el:i,wrapperEl:n,slidesEl:t.isElement&&!l.slideSlots?l:n,hostEl:t.isElement?l:i,mounted:!0,rtl:"rtl"===i.dir.toLowerCase()||"rtl"===m(i,"direction"),rtlTranslate:"horizontal"===t.params.direction&&("rtl"===i.dir.toLowerCase()||"rtl"===m(i,"direction")),wrongRTL:"-webkit-box"===m(n,"display")}),!0}init(e){const t=this;if(t.initialized)return t;if(!1===t.mount(e))return t;if(t.emit("beforeInit"),t.params.breakpoints&&t.setBreakpoint(),t.addClasses(),t.updateSize(),t.updateSlides(),t.params.watchOverflow&&t.checkOverflow(),t.params.grabCursor&&t.enabled&&t.setGrabCursor(),t.params.loop&&t.virtual&&t.params.virtual?.enabled?t.slideTo((t.params.initialSlide??0)+(t.virtual.slidesBefore??0),0,t.params.runCallbacksOnInit,!1,!0):t.slideTo(t.params.initialSlide,0,t.params.runCallbacksOnInit,!1,!0),t.params.loop&&t.loopCreate(void 0,!0),t.attachEvents(),t.params.lazyPreload){const e=[...t.el.querySelectorAll('[loading="lazy"]')];t.isElement&&e.push(...t.hostEl.querySelectorAll('[loading="lazy"]')),e.forEach(e=>{e.complete
vendor: 7,245 bytes, line 21828
21828&&P(t,e)})}return t.initialized=!0,A(t),t.emit("init"),t.emit("afterInit"),t}destroy(e=!0,t=!0){const s=this,{params:i,el:r,wrapperEl:a,slides:n}=s;return void 0===s.params||s.destroyed||(s.emit("beforeDestroy"),s.initialized=!1,s.detachEvents(),i.loop&&s.loopDestroy(),t&&(s.removeClasses(),r&&"string"!=typeof r&&r.removeAttribute("style"),a&&a.removeAttribute("style"),n&&n.length&&n.forEach(e=>{e.classList.remove(i.slideVisibleClass,i.slideFullyVisibleClass,i.slideActiveClass,i.slideNextClass,i.slidePrevClass),e.removeAttribute("style"),e.removeAttribute("data-swiper-slide-index")})),s.emit("destroy"),Object.keys(s.eventsListeners).forEach(e=>{s.off(e)}),!1!==e&&(s.el&&"string"!=typeof s.el&&(s.el.swiper=null),l=s,Object.keys(l).forEach(e=>{try{l[e]=null}catch{}try{delete l[e]}catch{}})),s.destroyed=!0),null;var l}static extendDefaults(e){n(te,e)}static installModule(e){se.prototype.__modules__||(se.prototype.__modules__=[]);const t=se.prototype.__modules__;"function"==typeof e&&t.indexOf(e)<0&&t.push(e)}static use(e){return Array.isArray(e)?(e.forEach(e=>se.installModule(e)),se):(se.installModule(e),se)}}Object.defineProperty(se,"extendedDefaults",{get:()=>te}),Object.defineProperty(se,"defaults",{get:()=>O});const ie=ee,re=se.prototype;Object.keys(ie).forEach(e=>{const t=ie[e];Object.keys(t).forEach(e=>{re[e]=t[e]})}),se.use([({swiper:e,on:t,emit:s})=>{let i=null,r=null;const a=()=>{e&&!e.destroyed&&e.initialized&&(s("beforeResize"),s("resize"))},n=()=>{e&&!e.destroyed&&e.initialized&&s("orientationchange")};t("init",()=>{e.params.resizeObserver&&void 0!==window.ResizeObserver?(()=>{if(!e||e.destroyed||!e.initialized)return;let t=e.width,s=e.height;i=new ResizeObserver(i=>{r=window.requestAnimationFrame(()=>{let r=t,n=s;i.forEach(({contentBoxSize:t,contentRect:s,target:i})=>{if(i&&i!==e.el)return;const a=Array.isArray(t)?t[0]:t;r=s?s.width:a.inlineSize,n=s?s.height:a.blockSize}),r===t&&n===s||(t=r,s=n,a())})}),i.observe(e.el)})():(window.addEventListener("resize",a),window.addEventListener("orientationchange",n))}),t("destroy",()=>{r&&window.cancelAnimationFrame(r),i&&i.unobserve&&e.el&&(i.unobserve(e.el),i=null),window.removeEventListener("resize",a),window.removeEventListener("orientationchange",n)})},({swiper:e,extendParams:t,on:s})=>{const i=[],r=(t,s={})=>{const r=window.MutationObserver||window.WebkitMutationObserver;if(!r)return;const a=new r(t=>{if(e.__preventObserver__)return;if(1===t.length)return void e.emit("observerUpdate",t[0]);const s=function(){e.emit("observerUpdate",t[0])};window.requestAnimationFrame?window.requestAnimationFrame(s):window.setTimeout(s,0)});a.observe(t,{attributes:void 0===s.attributes||s.attributes,childList:e.isElement||void 0===s.childList||s.childList,characterData:void 0===s.characterData||s.characterData}),i.push(a)};t({observer:!1,observeParents:!1,observeSlideChildren:!1}),s("init",()=>{if(e.params.observer){if(e.params.observeParents){const t=f(e.hostEl);for(let e=0;e<t.length;e+=1)r(t[e])}r(e.hostEl,{childList:e.params.observeSlideChildren}),r(e.wrapperEl,{attributes:!1})}}),s("destroy",()=>{i.forEach(e=>{e.disconnect()}),i.splice(0,i.length)})}]);function ae(e,t,s,i){const r=s??{},a=t??{};return e.params.createElements&&Object.keys(i).forEach(t=>{if(!r[t]&&!0===r.auto){let s=d(e.el,`.${i[t]}`)[0];s||(s=p("div",i[t]),s.className=i[t],e.el.append(s)),r[t]=s,a[t]=s}}),r}const ne='<svg class="swiper-navigation-icon" width="11" height="20" viewBox="0 0 11 20" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M0.38296 20.0762C0.111788 19.805 0.111788 19.3654 0.38296 19.0942L9.19758 10.2796L0.38296 1.46497C0.111788 1.19379 0.111788 0.754138 0.38296 0.482966C0.654131 0.211794 1.09379 0.211794 1.36496 0.482966L10.4341 9.55214C10.8359 9.9539 10.8359 10.6053 10.4341 11.007L1.36496 20.0762C1.09379 20.3474 0.654131 20.3474 0.38296 20.0762Z" fill="currentColor"/></svg>';function le(e=""){return`.${e.trim().replace(/([.:!+/()[\]#>~*^$|=,'"@{}\\])/g,"\\$1").replace(/ /g,".")}`}const oe=e=>{if((e=>!!e.virtual&&!!e.params.virtual?.enabled)(e))return e.virtual.slides.length;const t=e.params.grid?.rows;return e.grid&&t&&t>1?e.slides.length/Math.ceil(t):e.slides.length};class de{x;y;lastIndex;binarySearch;constructor(e,t){let s,i,r;this.binarySearch=(e,t)=>{for(i=-1,s=e.length;s-i>1;)r=s+i>>1,e[r]<=t?i=r:s=r;return s},this.x=e,this.y=t,this.lastIndex=e.length-1}interpolate(e){if(!e)return 0;const t=this.binarySearch(this.x,e),s=t-1;return(e-this.x[s])*(this.y[t]-this.y[s])/(this.x[t]-this.x[s])+this.y[s]}}const ce=e=>!!e.virtual&&!!e.params.virtual?.enabled,pe=e=>!!e.virtual&&!!e.params.virtual?.enabled;function ue(e,t){const s=this,{params:i,activeIndex:r,slidesEl:a}=s;let n=r;i.loop&&(n-=s.loopedSlides??0,s.loopDestroy(),s.recalcSlides());const l=s.slides.length;if(e<=0)return void s.prependSlide(t);if(e>=l)return void s.appendSlide(t);let o=n>e?n+1:n;const d=[];for(let t=l-1;t>=e;t-=1){const e=s.slides[t];e&&(e.remove(),d.unshift(e))}if(Array.isArray(t)){for(let e=0;e<t.length;e+=1){const s=t[e];s&&a.append(s)}o=n>e?n+t.length:n}else a.append(t);for(let e=0;e<d.length;e+=1)a.append(d[e]);s.recalcSlides(),i.loop&&s.loopCreate(),i.observer&&!s.isElement||s.update(),i.loop?s.slideTo(o+(s.loopedSlides??0),0,!1):s.slideTo(o,0,!1)}function me(e){const t=this,{params:s,slidesEl:i}=t;s.loop&&t.loopDestroy();const r=e=>{if("string"==typeof e){const t=document.createElement("div");y(t,e);const s=t.children[0];s&&i.append(s),y(t,"")}else i.append(e)};if(Array.isArray(e))for(let t=0;t<e.length;t+=1){const s=e[t];s&&r(s)}else r(e);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update()}function he(e){const t=this,{params:s,activeIndex:i,slidesEl:r}=t;s.loop&&t.loopDestroy();let a=i+1;const n=e=>{if("string"==typeof e){const t=document.createElement("div");y(t,e);const s=t.children[0];s&&r.prepend(s),y(t,"")}else r.prepend(e)};if(Array.isArray(e)){for(let t=0;t<e.length;t+=1){const s=e[t];s&&n(s)}a=i+e.length}else n(e);t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update(),t.slideTo(a,0,!1)}function fe(){const e=this,t=[];for(let s=0;s<e.slides.length;s+=1)t.push(s);e.removeSlide(t)}function ge(e){const t=this,{params:s,activeIndex:i}=t;let r=i;s.loop&&(r-=t.loopedSlides??0,t.loopDestroy());let a=r;if(Array.isArray(e)){for(let s=0;s<e.length;s+=1){const i=e[s];t.slides[i]&&t.slides[i].remove(),i<a&&(a-=1)}a=Math.max(a,0)}else{const s=e;t.slides[s]&&t.slides[s].remove(),s<a&&(a-=1),a=Math.max(a,0)}t.recalcSlides(),s.loop&&t.loopCreate(),s.observer&&!t.isElement||t.update(),s.loop?t.slideTo(a+(t.loopedSlides??0),0,!1):t.slideTo(a,0,!1)}function ve(e){const{effect:t,swiper:s,on:i,setTranslate:r,setTransition:a,overwriteParams:n,perspective:l,recreateShadows:o,getEffectParams:d}=e;i("beforeInit",()=>{if(s.params.effect!==t)return;s.classNames.push(`${s.params.containerModifierClass}${t}`),l&&l()&&s.classNames.push(`${s.params.containerModifierClass}3d`);const e=n?n():{};Object.assign(s.params,e),Object.assign(s.originalParams,e)}),i("setTranslate _virtualUpdated",()=>{s.params.effect===t&&r()}),i("setTransition",(e,i)=>{s.params.effect===t&&a(i)}),i("transitionEnd",()=>{if(s.params.effect===t&&o){const e=d?d():void 0;if(!e||!e.slideShadows)return;
21828s.slides.forEach(e=>{e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>e.remove())}),o()}});let c=!1;i("virtualUpdate",()=>{s.params.effect===t&&(s.slides.length||(c=!0),requestAnimationFrame(()=>{c&&s.slides&&s.slides.length&&(r(),c=!1)}))})}function we(e,t){const s=o(t);return s!==t&&(s.style.backfaceVisibility="hidden",s.style.setProperty("-webkit-backface-visibility","hidden")),s}function be({swiper:e,duration:t,transformElements:s,allSlides:i}){const{activeIndex:r}=e;if(e.params.virtualTranslate&&0!==t){let t,a=!1;t=i?s:s.filter(t=>{const s=t.classList.contains("swiper-slide-transform")?(t=>t.parentElement?t.parentElement instanceof HTMLElement?t.parentElement:void 0:e.slides.find(e=>e.shadowRoot&&e.shadowRoot===t.parentNode))(t):t;return!!s&&e.getSlideIndex(s)===r}),t.forEach(t=>{g(t,()=>{if(a)return;if(!e||e.destroyed)return;a=!0,e.animating=!1;const t=new CustomEvent("transitionend",{bubbles:!0,cancelable:!0});e.wrapperEl.dispatchEvent(t)})})}}function ye(e,t,s){const i=`swiper-slide-shadow${s?`-${s}`:""}${e?` swiper-slide-shadow-${e}`:""}`,r=o(t),a=`.${i.split(" ").join(".")}`,n=r.querySelector(a);if(n)return n;const l=p("div",i.split(" "));return r.append(l),l}const Ee=[({swiper:e,extendParams:t,on:s,emit:i})=>{let r,a;function n(){return e.params.virtual}t({virtual:{enabled:!1,slides:[],cache:!0,slidesPerViewAutoSlideSize:320,renderSlide:null,renderExternal:null,renderExternalUpdate:!0,addSlidesBefore:0,addSlidesAfter:0}}),e.virtual={cache:{},from:0,to:-1,slides:[],offset:0,slidesGrid:[]};function o(t,s){const i=n();if(i.cache&&e.virtual.cache[s])return e.virtual.cache[s];let r;if(i.renderSlide){const n=i.renderSlide.call(e,t,s);if("string"==typeof n){const e=a??=document.createElement("div");y(e,n),r=e.children[0]}else r=n}else r=e.isElement?p("swiper-slide"):p("div",e.params.slideClass);return r.setAttribute("data-swiper-slide-index",String(s)),i.renderSlide||y(r,t),i.cache&&(e.virtual.cache[s]=r),r}function c(t,s,r){const{slidesPerGroup:a,centeredSlides:l,slidesPerView:c,loop:p,initialSlide:u}=e.params;if(s&&!p&&(u??0)>0)return;const{addSlidesBefore:m,addSlidesAfter:h,slidesPerViewAutoSlideSize:f}=n(),{from:g,to:v,slides:w,slidesGrid:b,offset:y}=e.virtual;e.params.cssMode||e.updateActiveIndex();const E=void 0===r?e.activeIndex||0:r;let S,x;if(S=e.rtlTranslate?"right":e.isHorizontal()?"left":"top","auto"===c)if(f){let t=e.size;t||(t=e.isHorizontal()?e.el.getBoundingClientRect().width:e.el.getBoundingClientRect().height),x=Math.max(1,Math.ceil(t/f))}else x=1;else x=c??1;const T=a??1;let M,C;l?(M=Math.floor(x/2)+T+h,C=Math.floor(x/2)+T+m):(M=x+(T-1)+h,C=(p?x:T)+m);let P=E-C,L=E+M;p||(P=Math.max(P,0),L=Math.min(L,w.length-1));let A=(e.slidesGrid[P]||0)-(e.slidesGrid[0]||0);function I(){e.updateSlides(),e.updateProgress(),e.updateSlidesClasses(),i("virtualUpdate")}if(p&&E>=C?(P-=C,l||(A+=e.slidesGrid[0])):p&&E<C&&(P=-C,l&&(A+=e.slidesGrid[0])),Object.assign(e.virtual,{from:P,to:L,offset:A,slidesGrid:e.slidesGrid,slidesBefore:C,slidesAfter:M}),g===P&&v===L&&!t)return e.slidesGrid!==b&&A!==y&&e.slides.forEach(t=>{t.style.setProperty(S,A-Math.abs(e.cssOverflowAdjustment())+"px")}),e.updateProgress(),void i("virtualUpdate");const z=n();if(z.renderExternal){const t=[];for(let e=P;e<=L;e+=1)t.push(w[e]);return z.renderExternal.call(e,{offset:A,from:P,to:L,slides:t}),void(z.renderExternalUpdate?I():i("virtualUpdate"))}const $=[],k=[],O=e=>{let t=e;return e<0?t=w.length+e:t>=w.length&&(t-=w.length),t};if(t)e.slides.filter(t=>t.matches(`.${e.params.slideClass}, swiper-slide`)).forEach(e=>{e.remove()});else for(let t=g;t<=v;t+=1)if(t<P||t>L){const s=O(t);e.slides.filter(t=>t.matches(`.${e.params.slideClass}[data-swiper-slide-index="${s}"], swiper-slide[data-swiper-slide-index="${s}"]`)).forEach(e=>{e.remove()})}const D=p?-w.length:0,G=p?2*w.length:w.length;for(let e=D;e<G;e+=1)if(e>=P&&e<=L){const s=O(e);void 0===v||t?k.push(s):(e>v&&k.push(s),e<g&&$.push(s))}if(k.forEach(t=>{e.slidesEl.append(o(w[t],t))}),p)for(let t=$.length-1;t>=0;t-=1){const s=$[t];e.slidesEl.prepend(o(w[s],s))}else $.sort((e,t)=>
21828t-e),$.forEach(t=>{e.slidesEl.prepend(o(w[t],t))});d(e.slidesEl,".swiper-slide, swiper-slide").forEach(t=>{t.style.setProperty(S,A-Math.abs(e.cssOverflowAdjustment())+"px")}),I
vendor: 30,814 bytes, line 21828
21828()}s("beforeInit",()=>{if(!n().enabled)return;let t=!1;const s=e.passedParams.virtual;if(!s||"object"!=typeof s||void 0===s.slides){const s=[...e.slidesEl.children].filter(t=>t.matches(`.${e.params.slideClass}, swiper-slide`));s&&s.length&&(e.virtual.slides=[...s],t=!0,s.forEach((t,s)=>{t.setAttribute("data-swiper-slide-index",String(s)),e.virtual.cache[s]=t,t.remove()}))}t||(e.virtual.slides=n().slides),e.classNames.push(`${e.params.containerModifierClass}virtual`),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0,c(!1,!0)}),s("setTranslate",()=>{n().enabled&&(e.params.cssMode&&!e._immediateVirtual?(clearTimeout(r),r=setTimeout(()=>{c()},100)):c())}),s("init update resize",()=>{n().enabled&&e.params.cssMode&&l(e.wrapperEl,"--swiper-virtual-size",`${e.virtualSize}px`)}),Object.assign(e.virtual,{appendSlide:function(t){if(null!==t&&"object"==typeof t&&"length"in t){const s=t;for(let t=0;t<s.length;t+=1)s[t]&&e.virtual.slides.push(s[t])}else e.virtual.slides.push(t);c(!0)},prependSlide:function(t){const s=e.activeIndex;let i=s+1,r=1;if(Array.isArray(t)){for(let s=0;s<t.length;s+=1)t[s]&&e.virtual.slides.unshift(t[s]);i=s+t.length,r=t.length}else e.virtual.slides.unshift(t);if(n().cache){const t=e.virtual.cache,s={};Object.keys(t).forEach(e=>{const i=t[Number(e)],a=i.getAttribute("data-swiper-slide-index");a&&i.setAttribute("data-swiper-slide-index",String(parseInt(a,10)+r)),s[parseInt(e,10)+r]=i}),e.virtual.cache=s}c(!0),e.slideTo(i,0)},removeSlide:function(t){if(null==t)return;let s=e.activeIndex;const i=t=>{Object.keys(e.virtual.cache).forEach(s=>{const i=Number(s);if(i>t){const t=e.virtual.cache[i];e.virtual.cache[i-1]=t,t.setAttribute("data-swiper-slide-index",String(i-1)),delete e.virtual.cache[i]}})};if(Array.isArray(t))for(let r=t.length-1;r>=0;r-=1)n().cache&&(delete e.virtual.cache[t[r]],i(t[r])),e.virtual.slides.splice(t[r],1),t[r]<s&&(s-=1),s=Math.max(s,0);else n().cache&&(delete e.virtual.cache[t],i(t)),e.virtual.slides.splice(t,1),t<s&&(s-=1),s=Math.max(s,0);c(!0),e.slideTo(s,0)},removeAllSlides:function(){e.virtual.slides=[],n().cache&&(e.virtual.cache={}),c(!0),e.slideTo(0,0)},update:c})},({swiper:e,extendParams:t,on:s,emit:i})=>{function r(){return e.params.keyboard}function a(t){if(!e.enabled)return;const{rtlTranslate:s}=e,a="originalEvent"in t&&t.originalEvent?t.originalEvent:t,n=a.keyCode||a.charCode,l=r(),o=!!l.pageUpDown,d=o&&33===n,c=o&&34===n,p=37===n,m=39===n,h=38===n,g=40===n;if(!e.allowSlideNext&&(e.isHorizontal()&&m||e.isVertical()&&g||c))return!1;if(!e.allowSlidePrev&&(e.isHorizontal()&&p||e.isVertical()&&h||d))return!1;if(a.shiftKey||a.altKey||a.ctrlKey||a.metaKey)return;const v=document.activeElement;if(v&&(v.isContentEditable||v.nodeName&&("input"===v.nodeName.toLowerCase()||"textarea"===v.nodeName.toLowerCase())))return;if(l.onlyInViewport&&(d||c||p||m||h||g)){let t=!1;if(f(e.el,`.${e.params.slideClass}, swiper-slide`).length>0&&0===f(e.el,`.${e.params.slideActiveClass}`).length)return;const i=e.el,r=i.clientWidth,a=i.clientHeight,n=window.innerWidth,l=window.innerHeight,o=u(i);s&&(o.left-=i.scrollLeft);const d=[[o.left,o.top],[o.left+r,o.top],[o.left,o.top+a],[o.left+r,o.top+a]];for(let e=0;e<d.length;e+=1){const s=d[e];if(s[0]>=0&&s[0]<=n&&s[1]>=0&&s[1]<=l){if(0===s[0]&&0===s[1])continue;t=!0}}if(!t)return}const w=l.speed;e.isHorizontal()?((d||c||p||m)&&a.cancelable&&a.preventDefault(),((c||m)&&!s||(d||p)&&s)&&e.slideNext(w),((d||p)&&!s||(c||m)&&s)&&e.slidePrev(w)):((d||c||h||g)&&a.cancelable&&a.preventDefault(),(c||g)&&e.slideNext(w),(d||h)&&e.slidePrev(w)),i("keyPress",n)}function n(){e.keyboard.enabled||(document.addEventListener("keydown",a),e.keyboard.enabled=!0)}function l(){e.keyboard.enabled&&(document.removeEventListener("keydown",a),e.keyboard.enabled=!1)}t({keyboard:{enabled:!1,onlyInViewport:!0,pageUpDown:!0,speed:void 0}}),e.keyboard={enabled:!1,enable:n,disable:l},s("init",()=>{r().enabled&&n()}),s("destroy",()=>{e.keyboard.enabled&&l()})},({swiper:e,extendParams:i,on:r,emit:a})=>{let n;i({mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarget:"container",thresholdDelta:null,thresholdTime:null,noMousewheelClass:"swiper-no-mousewheel"}});let l,o=s(),d=!1;const c=[];function p(){return e.params.mousewheel}function u(){e.enabled&&(d=!0)}function m(){e.enabled&&(d=!1)}function h(t){const i=p();return!(i.thresholdDelta&&t.delta<i.thresholdDelta)&&(!(i.thresholdTime&&s()-o<i.thresholdTime)&&(t.delta>=6&&s()-o<60||(t.direction<0?e.isEnd&&!e.params.loop||e.animating||(e.slideNext(),a("scroll",t.raw)):e.isBeginning&&!e.params.loop||e.animating||(e.slidePrev(),a("scroll",t.raw)),o=(new window.Date).getTime(),!1)))}function f(i){let r="originalEvent"in i&&i.originalEvent?i.originalEvent:i,o=!0;if(!e.enabled)return!1;const u=p();if(i.target.closest(`.${u.noMousewheelClass}`))return!1;e.params.cssMode&&r.preventDefault();let m=e.el;"container"!==u.eventsTarget&&(m=document.querySelector(u.eventsTarget));const f=m&&m.contains(r.target);if(!d&&!f&&!u.releaseOnEdges)return!0;let g=0;const v=e.rtlTranslate?-1:1,w=function(e){const t=e;let s=0,i=0,r=0,a=0;return void 0!==t.detail&&(i=t.detail),void 0!==t.wheelDelta&&(i=-t.wheelDelta/120),void 0!==t.wheelDeltaY&&(i=-t.wheelDeltaY/120),void 0!==t.wheelDeltaX&&(s=-t.wheelDeltaX/120),void 0!==t.axis&&void 0!==t.HORIZONTAL_AXIS&&t.axis===t.HORIZONTAL_AXIS&&(s=i,i=0),r=10*s,a=10*i,void 0!==t.deltaY&&(a=t.deltaY),void 0!==t.deltaX&&(r=t.deltaX),t.shiftKey&&!r&&(r=a,a=0),(r||a)&&t.deltaMode&&(1===t.deltaMode?(r*=40,a*=40):(r*=800,a*=800)),r&&!s&&(s=r<1?-1:1),a&&!i&&(i=a<1?-1:1),{spinX:s,spinY:i,pixelX:r,pixelY:a}}(r);if(u.forceToAxis)if(e.isHorizontal()){if(!(Math.abs(w.pixelX)>Math.abs(w.pixelY)))return!0;g=-w.pixelX*v}else{if(!(Math.abs(w.pixelY)>Math.abs(w.pixelX)))return!0;g=-w.pixelY}else g=Math.abs(w.pixelX)>Math.abs(w.pixelY)?-w.pixelX*v:-w.pixelY;if(0===g)return!0;u.invert&&(g=-g);let b=e.getTranslate()+g*(u.sensitivity??1);b>=e.minTranslate()&&(b=e.minTranslate()),b<=e.maxTranslate()&&(b=e.maxTranslate()),o=!!e.params.loop||!(b===e.minTranslate()||b===e.maxTranslate()),o&&e.params.nested&&r.stopPropagation();const y=e.params.freeMode;if(e.params.freeMode&&y?.enabled){const i={time:s(),delta:Math.abs(g),direction:Math.sign(g)},o=l&&i.time<l.time+500&&i.delta<=l.delta&&i.direction===l.direction;if(!o){l=void 0;let s=e.getTranslate()+g*(u.sensitivity??1);const d=e.isBeginning,p=e.isEnd;if(s>=e.minTranslate()&&(s=e.minTranslate()),s<=e.maxTranslate()&&(s=e.maxTranslate()),e.setTransition(0),e.setTranslate(s),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses(),(!d&&e.isBeginning||!p&&e.isEnd)&&e.updateSlidesClasses(),e.params.loop&&e.loopFix({direction:i.direction<0?"next":"prev",byMousewheel:!0}),y?.sticky){clearTimeout(n),n=void 0,c.length>=15&&c.shift();const s=c.length?c[c.length-1]:void 0,r=c[0];if(c.push(i),s&&(i.delta>s.delta||i.direction!==s.direction))c.splice(0);else if(c.length>=15&&r&&i.time-r.time<500&&r.delta-i.delta>=1&&i.delta<=6){const s=g>0?.8:.2;l=i,c.splice(0),n=t(()=>{!e.destroyed&&e.params&&e.slideToClosest(e.params.speed,!0,void 0,s)},0)}n||(n=t(()=>{if(e.destroyed||!e.params)return;l=i,c.splice(0),e.slideToClosest(e.params.speed,!0,void 0,.5)},500))}o||a("scroll",r);const m=e.params.autoplay;if(e.params.autoplay&&m?.disableOnInteraction&&e.autoplay.stop(),u.releaseOnEdges&&(s===e.minTranslate()||s===e.maxTranslate()))return!0}}else{const t={time:s(),delta:Math.abs(g),direction:Math.sign(g),raw:i};c.length>=2&&c.shift();const r=c.length?c[c.length-1]:void 0;if(c.push(t),r?(t.direction!==r.direction||t.delta>r.delta||t.time>r.time+150)&&h(t):h(t),function(t){const s=p();if(t.direction<0){if(e.isEnd&&!e.params.loop&&s.releaseOnEdges)return!0}else if(e.isBeginning&&!e.params.loop&&s.releaseOnEdges)return!0;return!1}(t))return!0}return r.cancelable&&r.preventDefault(),!1}function g(t){const s=p();let i=e.el;"container"!==s.eventsTarget&&(i=document.querySelector(s.eventsTarget)),i[t]("mouseenter",u),i[t]("mouseleave",m),i[t]("wheel",f)}function v(){return e.params.cssMode?(e.wrapperEl.removeEventListener("wheel",f),!0):!e.mousewheel.enabled&&(g("addEventListener"),e.mousewheel.enabled=!0,!0)}function w(){return e.params.cssMode?(e.wrapperEl.addEventListener("wheel",f),!0):!!e.mousewheel.enabled&&(g("removeEventListener"),e.mousewheel.enabled=!1,!0)}r("init",()=>{const t=p();!t.enabled&&e.params.cssMode&&w(),t.enabled&&v()}),e.mousewheel={enabled:!1,enable:v,disable:w},r("destroy",()=>{e.params.cssMode&&v(),e.mousewheel.enabled&&w()})},({swiper:e,extendParams:t,on:s,emit:i})=>{function r(){return e.params.navigation}function a(t){let s;return t&&"string"==typeof t&&e.isElement&&(s=e.el.querySelector(t)||e.hostEl.querySelector(t),s)?s:(t&&("string"==typeof t&&(s=[...document.querySelectorAll(t)]),e.params.uniqueNavElements&&"string"==typeof t&&s&&s.length>1&&1===e.el.querySelectorAll(t).length?s=e.el.querySelector(t):s&&1===s.length&&(s=s[0])),t&&!s?t:s)}function n(t,s){const i=r();w(t).forEach(t=>{t&&(t.classList[s?"add":"remove"](...i.disabledClass.split(" ")),"BUTTON"===t.tagName&&(t.disabled=s),e.params.watchOverflow&&e.enabled&&t.classList[e.isLocked?"add":"remove"](i.lockClass))})}function l(){const{nextEl:t,prevEl:s}=e.navigation;if(e.params.loop)return n(s,!1),void n(t,!1);n(s,e.isBeginning&&!e.params.rewind),n(t,e.isEnd&&!e.params.rewind)}function o(t){t.preventDefault(),(!e.isBeginning||e.params.loop||e.params.rewind)&&(e.slidePrev(),i("navigationPrev"))}function d(t){t.preventDefault(),(!e.isEnd||e.params.loop||e.params.rewind)&&(e.slideNext(),i("navigationNext"))}function c(){e.params.navigation=ae(e,e.originalParams.navigation,e.params.navigation,{nextEl:"swiper-button-next",prevEl:"swiper-button-prev"});const t=r();if(!t.nextEl&&!t.prevEl)return;const s=a(t.nextEl),i=a(t.prevEl);Object.assign(e.navigation,{nextEl:s,prevEl:i});const n=w(s),l=w(i),c=(s,i)=>{if(s){if(t.addIcons&&s.matches(".swiper-button-next,.swiper-button-prev")&&!s.querySelector("svg")){const e=document.createElement("div");y(e,ne);const t=e.querySelector("svg");t&&s.appendChild(t),e.remove()}s.addEventListener("click","next"===i?d:o)}!e.enabled&&s&&s.classList.add(...t.lockClass.split(" "))};n.forEach(e=>c(e,"next")),l.forEach(e=>c(e,"prev"))}function p(){const t=r(),{nextEl:s,prevEl:i}=e.navigation,a=w(s),n=w(i),l=(e,s)=>{e.removeEventListener("click","next"===s?d:o),e.classList.remove(...t.disabledClass.split(" "))};a.forEach(e=>l(e,"next")),n.forEach(e=>l(e,"prev"))}t({navigation:{nextEl:null,prevEl:null,addIcons:!0,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock",navigationDisabledClass:"swiper-navigation-disabled"}}),e.navigation={nextEl:null,prevEl:null,arrowSvg:ne},s("init",()=>{!1===r().enabled?u():(c(),l())}),s("toEdge fromEdge lock unlock",()=>{l()}),s("destroy",()=>{p()}),s("enable disable",()=>{const t=r(),{nextEl:s,prevEl:i}=e.navigation,a=w(s),n=w(i);e.enabled?l():[...a,...n].filter(e=>!!e).forEach(e=>e.classList.add(t.lockClass))}),s("click",(t,s)=>{const a=r(),{nextEl:n,prevEl:l}=e.navigation,o=w(n),d=w(l),c=s.target;let p=d.includes(c)||o.includes(c);if(e.isElement&&!p){const e=s.composedPath?s.composedPath():[];e.length&&(p=e.find(e=>o.includes(e)||d.includes(e)))}if(a.hideOnClick&&!p){if(e.pagination&&e.params.pagination&&e.params.pagination.clickable&&(e.pagination.el===c||e.pagination.el.contains(c)))return;let t;o.length?t=o[0].classList.contains(a.hiddenClass):d.length&&(t=d[0].classList.contains(a.hiddenClass)),i(!0===t?"navigationShow":"navigationHide"),[...o,...d].filter(e=>!!e).forEach(e=>e.classList.toggle(a.hiddenClass))}});const u=()=>{const t=r();e.el.classList.add(...t.navigationDisabledClass.split(" ")),p()};Object.assign(e.navigation,{enable:()=>{const t=r();e.el.classList.remove(...t.navigationDisabledClass.split(" ")),c(),l()},disable:u,update:l,init:c,destroy:p})},({swiper:e,extendParams:t,on:s,emit:i})=>{const r="swiper-pagination";let a;t({pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:e=>e,formatFractionTotal:e=>e,bulletClass:`${r}-bullet`,bulletActiveClass:`${r}-bullet-active`,modifierClass:`${r}-`,currentClass:`${r}-current`,totalClass:`${r}-total`,hiddenClass:`${r}-hidden`,progressbarFillClass:`${r}-progressbar-fill`,progressbarOppositeClass:`${r}-progressbar-opposite`,clickableClass:`${r}-clickable`,lockClass:`${r}-lock`,horizontalClass:`${r}-horizontal`,verticalClass:`${r}-vertical`,paginationDisabledClass:`${r}-disabled`}}),e.pagination={el:null,bullets:[]};let n=0;function l(){return e.params.pagination}function o(){return!l().el||!e.pagination.el||Array.isArray(e.pagination.el)&&0===e.pagination.el.length}function d(e,t){const{bulletActiveClass:s}=l();if(!e)return;let i=e[("prev"===t?"previous":"next")+"ElementSibling"];i&&(i.classList.add(`${s}-${t}`),i=i[("prev"===t?"previous":"next")+"ElementSibling"],i&&i.classList.add(`${s}-${t}-${t}`))}function c(t){const s=t.target.closest(le(l().bulletClass));if(!s)return;t.preventDefault();const i=(h(s)??0)*(e.params.slidesPerGroup??1);if(e.params.loop){if(e.realIndex===i)return;const t=(r=e.realIndex,a=i,n=e.slides.length,(a%=n)===1+(r%=n)?"next":a===r-1?"previous":void 0);"next"===t?e.slideNext():"previous"===t?e.slidePrev():e.slideToLoop(i)}else e.slideTo(i);var r,a,n}function p(){const t=e.rtl,s=l();if(o())return;const r=w(e.pagination.el);let c,p;const u=oe(e),m=e.params.loop?Math.ceil(u/(e.params.slidesPerGroup??1)):e.snapGrid.length;if(e.params.loop?(p=e.previousRealIndex||0,c=(e.params.slidesPerGroup??1)>1?Math.floor(e.realIndex/(e.params.slidesPerGroup??1)):e.realIndex):void 0!==e.snapIndex?(c=e.snapIndex,p=e.previousSnapIndex):(p=e.previousIndex||0,c=e.activeIndex||0),"bullets"===s.type&&e.pagination.bullets&&e.pagination.bullets.length>0){const i=e.pagination.bullets;let l=0,o=0,u=0;if(s.dynamicBullets){a=v(i[0],e.isHorizontal()?"width":"height");const t=e.isHorizontal()?"width":"height";r.forEach(e=>{e.style[t]=(a??0)*(s.dynamicMainBullets+4)+"px"}),s.dynamicMainBullets>1&&void 0!==p&&(n+=c-(p||0),n>s.dynamicMainBullets-1?n=s.dynamicMainBullets-1:n<0&&(n=0)),l=Math.max(c-n,0),o=l+(Math.min(i.length,s.dynamicMainBullets)-1),u=(o+l)/2}if(i.forEach(e=>{const t=["","-next","-next-next","-prev","-prev-prev","-main"].map(e=>`${s.bulletActiveClass}${e}`).flatMap(e=>"string"==typeof e&&e.includes(" ")?e.split(" "):[e]);e.classList.remove(...t)}),r.length>1)i.forEach(t=>{const i=h(t);i===c?t.classList.add(...s.bulletActiveClass.split(" ")):e.isElement&&t.setAttribute("part","bullet"),s.dynamicBullets&&void 0!==i&&(i>=l&&i<=o&&t.classList.add(...`${s.bulletActiveClass}-main`.split(" ")),i===l&&d(t,"prev"),i===o&&d(t,"next"))});else{const t=i[c];if(t&&t.classList.add(...s.bulletActiveClass.split(" ")),e.isElement&&i.forEach((e,t)=>{e.setAttribute("part",t===c?"bullet-active":"bullet")}),s.dynamicBullets){const e=i[l],t=i[o];for(let e=l;e<=o;e+=1)i[e]&&i[e].classList.add(...`${s.bulletActiveClass}-main`.split(" "));d(e,"prev"),d(t,"next")}}if(s.dynamicBullets){const r=Math.min(i.length,s.dynamicMainBullets+4),n=((a??0)*r-(a??0))/2-u*(a??0),l=t?"right":"left",o=e.isHorizontal()?l:"top";i.forEach(e=>{e.style[o]=`${n}px`})}}r.forEach((t,r)=>{if("fraction"===s.type&&(t.querySelectorAll(le(s.currentClass)).forEach(e=>{e.textContent=String(s.formatFractionCurrent(c+1))}),t.querySelectorAll(le(s.totalClass)).forEach(e=>{e.textContent=String(s.formatFractionTotal(m))})),"progressbar"===s.type){let i;i=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";const r=(c+1)/m;let a=1,n=1;"horizontal"===i?a=r:n=r,t.querySelectorAll(le(s.progressbarFillClass)).forEach(t=>{t.style.transform=`translate3d(0,0,0) scaleX(${a}) scaleY(${n})`,t.style.transitionDuration=`${e.params.speed}ms`})}"custom"===s.type&&s.renderCustom?(y(t,s.renderCustom(e,c+1,m)),0===r&&i("paginationRender",t)):(0===r&&i("paginationRender",t),i("paginationUpdate",t)),e.params.watchOverflow&&e.enabled&&t.classList[e.isLocked?"add":"remove"](s.lockClass)})}function u(){const t=l();if(o())return;const s=oe(e),r=w(e.pagination.el);let a="";if("bullets"===t.type){let i=e.params.loop?Math.ceil(s/(e.params.slidesPerGroup??1)):e.snapGrid.length;e.params.freeMode&&(e=>!!e.params.freeMode?.enabled)(e)&&i>s&&(i=s);for(let s=0;s<i;s+=1)t.renderBullet?a+=t.renderBullet.call(e,s,t.bulletClass):a+=`<${t.bulletElement} ${e.isElement?'part="bullet"':""} class="${t.bulletClass}"></${t.bulletElement}>`}"fraction"===t.type&&(a=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):`<span class="${t.currentClass}"></span> / <span class="${t.totalClass}"></span>`),"progressbar"===t.type&&(a=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):`<span class="${t.progressbarFillClass}"></span>`),e.pagination.bullets=[],r.forEach(s=>{"custom"!==t.type&&y(s,a||""),"bullets"===t.type&&e.pagination.bullets.push(...Array.from(s.querySelectorAll(le(t.bulletClass))))}),"custom"!==t.type&&i("paginationRender",r[0])}function m(){e.params.pagination=ae(e,e.originalParams.pagination,e.params.pagination,{el:"swiper-pagination"});const t=l();if(!t.el)return;let s;if("string"==typeof t.el&&e.isElement&&(s=e.el.querySelector(t.el)),s||"string"!=typeof t.el||(s=[...document.querySelectorAll(t.el)]),s||(s=t.el),!s||Array.isArray(s)&&0===s.length)return;if(e.params.uniqueNavElements&&"string"==typeof t.el&&Array.isArray(s)&&s.length>1&&(s=[...e.el.querySelectorAll(t.el)],s.length>1)){const t=s.find(t=>f(t,".swiper")[0]===e.el);t&&(s=t)}Array.isArray(s)&&1===s.length&&(s=s[0]),Object.assign(e.pagination,{el:s});w(s).forEach(s=>{"bullets"===t.type&&t.clickable&&s.classList.add(...(t.clickableClass||"").split(" ")),s.classList.add(t.modifierClass+t.type),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass),"bullets"===t.type&&t.dynamicBullets&&(s.classList.add(`${t.modifierClass}${t.type}-dynamic`),n=0,t.dynamicMainBullets<1&&(t.dynamicMainBullets=1)),"progressbar"===t.type&&t.progressbarOpposite&&s.classList.add(t.progressbarOppositeClass),t.clickable&&s.addEventListener("click",c),e.enabled||s.classList.add(t.lockClass)})}function g(){const t=l();if(o())return;const s=e.pagination.el;if(s){w(s).forEach(s=>{s.classList.remove(t.hiddenClass),s.classList.remove(t.modifierClass+t.type),s.classList.remove(e.isHorizontal()?t.horizontalClass:t.verticalClass),t.clickable&&(s.classList.remove(...(t.clickableClass||"").split(" ")),s.removeEventListener("click",c))})}e.pagination.bullets&&e.pagination.bullets.forEach(e=>e.classList.remove(...t.bulletActiveClass.split(" ")))}s("changeDirection",()=>{if(!e.pagination||!e.pagination.el)return;const t=l();w(e.pagination.el).forEach(s=>{s.classList.remove(t.horizontalClass,t.verticalClass),s.classList.add(e.isHorizontal()?t.horizontalClass:t.verticalClass)})}),s("init",()=>{!1===l().enabled?b():(m(),u(),p())}),s("activeIndexChange",()=>{void 0===e.snapIndex&&p()}),s("snapIndexChange",()=>{p()}),s("snapGridLengthChange",()=>{u(),p()}),s("destroy",()=>{g()}),s("enable disable",()=>{const{el:t}=e.pagination;if(t){const s=l();w(t).forEach(t=>t.classList[e.enabled?"remove":"add"](s.lockClass))}}),s("lock unlock",()=>{p()}),s("click",(t,s)=>{const r=s.target,a=w(e.pagination.el),n=l();if(n.el&&n.hideOnClick&&a&&a.length>0&&!r.classList.contains(n.bulletClass)){if(e.navigation&&(e.navigation.nextEl&&r===e.navigation.nextEl||e.navigation.prevEl&&r===e.navigation.prevEl))return;const t=a[0].classList.contains(n.hiddenClass);i(!0===t?"paginationShow":"paginationHide"),a.forEach(e=>e.classList.toggle(n.hiddenClass))}});const b=()=>{const t=l();e.el.classList.add(t.paginationDisabledClass);const{el:s}=e.pagination;if(s){w(s).forEach(e=>e.classList.add(t.paginationDisabledClass))}g()};Object.assign(e.pagination,{enable:()=>{const t=l();e.el.classList.remove(t.paginationDisabledClass);const{el:s}=e.pagination;if(s){w(s).forEach(e=>e.classList.remove(t.paginationDisabledClass))}m(),u(),p()},disable:b,render:u,update:p,init:m,destroy:g})},({swiper:s,extendParams:i,on:r,emit:a})=>{let n=!1,l=null,o=null,d=0,c=0,m=0,h=0;function f(){return s.params.scrollbar}function g(){const e=f();if(!e.el||!s.scrollbar.el)return;const{scrollbar:t,rtlTranslate:i}=s,{dragEl:r,el:a}=t,n=s.params.loop?s.progressLoop??0:s.progress;let o=c,d=(m-c)*n;i?(d=-d,d>0?(o=c-d,d=0):-d+c>m&&(o=m+d)):d<0?(o=c+d,d=0):d+c>m&&(o=m-d),s.isHorizontal()?(r.style.transform=`translate3d(${d}px, 0, 0)`,r.style.width=`${o}px`):(r.style.transform=`translate3d(0px, ${d}px, 0)`,r.style.height=`${o}px`),e.hide&&(l&&clearTimeout(l),a.style.opacity="1",l=setTimeout(()=>{a.style.opacity="0",a.style.transitionDuration="400ms"},1e3))}function v(){const e=f();if(!e.el||!s.scrollbar.el)return;const{scrollbar:t}=s,{dragEl:i,el:r}=t;i.style.width="",i.style.height="",m=s.isHorizontal()?r.offsetWidth:r.offsetHeight,h=s.size/(s.virtualSize+(s.params.slidesOffsetBefore??0)-(s.params.centeredSlides?s.snapGrid[0]:0)),c="auto"===e.dragSize?m*h:parseInt(String(e.dragSize),10),s.isHorizontal()?i.style.width=`${c}px`:i.style.height=`${c}px`,r.style.display=h>=1?"none":"",e.hide&&(r.style.opacity="0"),s.params.watchOverflow&&s.enabled&&t.el.classList[s.isLocked?"add":"remove"](e.lockClass)}function b(e){return s.isHorizontal()?e.clientX??e.touches?.[0]?.clientX??0:e.clientY??e.touches?.[0]?.clientY??0}function y(e){const{scrollbar:t,rtlTranslate:i}=s,{el:r}=t;let a;a=(b(e)-u(r)[s.isHorizontal()?"left":"top"]-(null!==d?d:c/2))/(m-c),a=Math.max(Math.min(a,1),0),i&&(a=1-a);const n=s.minTranslate()+(s.maxTranslate()-s.minTranslate())*a;s.updateProgress(n),s.setTranslate(n),s.updateActiveIndex(),s.updateSlidesClasses()}function E(e){const t=f(),{scrollbar:i,wrapperEl:r}=s,{el:l,dragEl:c}=i;n=!0,d=e.target===c?b(e)-e.target.getBoundingClientRect()[s.isHorizontal()?"left":"top"]:null,e.preventDefault(),e.stopPropagation(),r.style.transitionDuration="100ms",c.style.transitionDuration="100ms",y(e),o&&clearTimeout(o),l.style.transitionDuration="0ms",t.hide&&(l.style.opacity="1"),s.params.cssMode&&(s.wrapperEl.style.scrollSnapType="none"),a("scrollbarDragStart",e)}function S(e){const{scrollbar:t,wrapperEl:i}=s,{el:r,dragEl:l}=t;n&&(e.cancelable&&e.preventDefault(),y(e),i.style.transitionDuration="0ms",r.style.transitionDuration="0ms",l.style.transitionDuration="0ms",a("scrollbarDragMove",e))}function x(e){const i=f(),{scrollbar:r,wrapperEl:l}=s,{el:d}=r;n&&(n=!1,s.params.cssMode&&(s.wrapperEl.style.scrollSnapType="",l.style.transitionDuration=""),i.hide&&(o&&clearTimeout(o),o=t(()=>{d.style.opacity="0",d.style.transitionDuration="400ms"},1e3)),a("scrollbarDragEnd",e),i.snapOnRelease&&s.slideToClosest())}function T(e){const{scrollbar:t,params:i}=s,r=t.el;if(!r)return;const a=!!i.passiveListeners&&{passive:!1,capture:!1},n=!!i.passiveListeners&&{passive:!0,capture:!1},l="on"===e?"addEventListener":"removeEventListener";r[l]("pointerdown",E,a),document[l]("pointermove",S,a),document[l]("pointerup",x,n)}function M(){const{scrollbar:t,el:i}=s;s.params.scrollbar=ae(s,s.originalParams.scrollbar,s.params.scrollbar,{el:"swiper-scrollbar"});const r=f();if(!r.el)return;let a;if("string"==typeof r.el&&s.isElement&&(a=s.el.querySelector(r.el)),a||"string"!=typeof r.el)a||(a=r.el);else if(a=document.querySelectorAll(r.el),!a.length)return;s.params.uniqueNavElements&&"string"==typeof r.el&&a.length>1&&1===i.querySelectorAll(r.el).length&&(a=i.querySelector(r.el)),a.length>0&&(a=a[0]);const n=a;n.classList.add(s.isHorizontal()?r.horizontalClass:r.verticalClass);let l=null;n&&(l=n.querySelector(le(r.dragClass)),l||(l=p("div",r.dragClass),n.append(l))),Object.assign(t,{el:n,dragEl:l}),r.draggable&&f().el&&s.scrollbar.el&&T("on"),n&&n.classList[s.enabled?"remove":"add"](...e(r.lockClass))}function C(){const t=f(),i=s.scrollbar.el;i&&i.classList.remove(...e(s.isHorizontal()?t.horizontalClass:t.verticalClass)),f().el&&s.scrollbar.el&&T("off")}i({scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag",scrollbarDisabledClass:"swiper-scrollbar-disabled",horizontalClass:"swiper-scrollbar-horizontal",verticalClass:"swiper-scrollbar-vertical"}}),s.scrollbar={el:null,dragEl:null},r("changeDirection",()=>{if(!s.scrollbar||!s.scrollbar.el)return;const e=f();w(s.scrollbar.el).forEach(t=>{t.classList.remove(e.horizontalClass,e.verticalClass),t.classList.add(s.isHorizontal()?e.horizontalClass:e.verticalClass)})}),r("init",()=>{!1===f().enabled?P():(M(),v(),g())}),r("update resize observerUpdate lock unlock changeDirection",()=>{v()}),r("setTranslate",()=>{g()}),r("setTransition",(e,t)=>{!function(e){f().el&&s.scrollbar.el&&(s.scrollbar.dragEl.style.transitionDuration=`${e}ms`)}(t)}),r("enable disable",()=>{const{el:t}=s.scrollbar;t&&t.classList[s.enabled?"remove":"add"](...e(f().lockClass))}),r("destroy",()=>{C()});const P=()=>{const t=f();s.el.classList.add(...e(t.scrollbarDisabledClass)),s.scrollbar.el&&s.scrollbar.el.classList.add(...e(t.scrollbarDisabledClass)),C()};Object.assign(s.scrollbar,{enable:()=>{const t=f();s.el.classList.remove(...e(t.scrollbarDisabledClass)),s.scrollbar.el&&s.scrollbar.el.classList.remove(...e(t.scrollbarDisabledClass)),M(),v(),g()},disable:P,updateSize:v,setTranslate:g,init:M,destroy:C})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.parallax}t({parallax:{enabled:!1}});const r="[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y], [data-swiper-parallax-opacity], [data-swiper-parallax-scale]",a=(t,s)=>{const{rtl:i}=e,r=i?-1:1,a=t.getAttribute("data-swiper-parallax")||"0";let n=t.getAttribute("data-swiper-parallax-x"),l=t.getAttribute("data-swiper-parallax-y");const o=t.getAttribute("data-swiper-parallax-scale"),d=t.getAttribute("data-swiper-parallax-opacity"),c=t.getAttribute("data-swiper-parallax-rotate");if(n||l?(n=n||"0",l=l||"0"):e.isHorizontal()?(n=a,l="0"):(l=a,n="0"),n=n.indexOf("%")>=0?parseInt(n,10)*s*r+"%":Number(n)*s*r+"px",l=l.indexOf("%")>=0?parseInt(l,10)*s+"%":Number(l)*s+"px",null!=d){const e=Number(d),i=e-(e-1)*(1-Math.abs(s));t.style.opacity=String(i)}let p=`translate3d(${n}, ${l}, 0px)`;if(null!=o){const e=Number(o);p+=` scale(${e-(e-1)*(1-Math.abs(s))})`}if(c&&null!=c){p+=` rotate(${Number(c)*s*-1}deg)`}t.style.transform=p},n=()=>{const{el:t,slides:s,progress:i,snapGrid:n}=e,l=d(t,r);e.isElement&&l.push(...d(e.hostEl,r)),l.forEach(e=>{a(e,i)}),s.forEach((t,s)=>{let l=t.progress??0;(e.params.slidesPerGroup??1)>1&&"auto"!==e.params.slidesPerView&&(l+=Math.ceil(s/2)-i*(n.length-1)),l=Math.min(Math.max(l,-1),1),t.querySelectorAll(`${r}, [data-swiper-parallax-rotate]`).forEach(e=>{a(e,l)})})};s("beforeInit",()=>{i().enabled&&(e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)}),s("init",()=>{i().enabled&&n()}),s("setTranslate",()=>{i().enabled&&n()}),s("setTransition",(t,s)=>{i().enabled&&((t=e.params.speed??300)=>{const{el:s,hostEl:i}=e,a=[...s.querySelectorAll(r)];e.isElement&&a.push(...i.querySelectorAll(r)),a.forEach(e=>{const s=e.getAttribute("data-swiper-parallax-duration");let i=(s?parseInt(s,10):0)||t;0===t&&(i=0),e.style.transitionDuration=`${i}ms`})})(s)})},({swiper:e,extendParams:t,on:s,emit:r})=>{function a(){return e.params.zoom}t({zoom:{enabled:!1,limitToOriginalSize:!1,maxRatio:3,minRatio:1,panOnMouseMove:!1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}}),e.zoom={enabled:!1};let n=1,l=!1,o=!1,c={x:0,y:0};let p=!1,m=!1;const h=[],g={originX:0,originY:0,slideEl:void 0,slideWidth:void 0,slideHeight:void 0,imageEl:void 0,imageWrapEl:void 0,maxRatio:3},v={isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},w={x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0};let b,y=1;function E(){if(h.length<2)return 1;const e=h[0].pageX,t=h[0].pageY,s=h[1].pageX,i=h[1].pageY;return Math.sqrt((s-e)**2+(i-t)**2)}function S(){const e=a(),t=g.imageWrapEl?.getAttribute("data-swiper-zoom"),s=null!=t?Number(t):e.maxRatio,i=g.imageEl;if(e.limitToOriginalSize&&i&&i.naturalWidth){const e=i.naturalWidth/i.offsetWidth;return Math.min(e,s)}return s}function x(t){const s=e.isElement?"swiper-slide":`.${e.params.slideClass}`,i=t.target;return!!i&&(!!i.matches(s)||e.slides.filter(e=>e.contains(i)).length>0)}function T(t){const s=`.${a().containerClass}`,i=t.target;return!!i&&(!!i.matches(s)||[...e.hostEl.querySelectorAll(s)].filter(e=>e.contains(i)).length>0)}function M(t){if("mouse"===t.pointerType&&h.splice(0,h.length),!x(t))return;const s=a();if(p=!1,m=!1,h.push(t),!(h.length<2)){if(p=!0,g.scaleStart=E(),!g.slideEl){const i=t.target;g.slideEl=i?.closest(`.${e.params.slideClass}, swiper-slide`)??void 0,g.slideEl||(g.slideEl=e.slides[e.activeIndex]);let r=g.slideEl?.querySelector(`.${s.containerClass}`)??null;if(r&&(r=r.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]??null),g.imageEl=r??void 0,g.imageWrapEl=r?f(r,`.${s.containerClass}`)[0]??void 0:void 0,!g.imageWrapEl)return void(g.imageEl=void 0);g.maxRatio=S()}if(g.imageEl){const[e,t]=function(){if(h.length<2||!g.imageEl)return[null,null];const e=g.imageEl.getBoundingClientRect();return[(h[0].pageX+(h[1].pageX-h[0].pageX)/2-e.x-window.scrollX)/n,(h[0].pageY+(h[1].pageY-h[0].pageY)/2-e.y-window.scrollY)/n]}();g.originX=e??0,g.originY=t??0,g.imageEl.style.transitionDuration="0ms"}l=!0}}function C(t){if(!x(t))return;const s=a(),i=e.zoom,r=h.findIndex(e=>e.pointerId===t.pointerId);r>=0&&(h[r]=t),h.length<2||(m=!0,g.scaleMove=E(),g.imageEl&&(i.scale=g.scaleMove/(g.scaleStart??1)*n,i.scale>g.maxRatio&&(i.scale=g.maxRatio-1+(i.scale-g.maxRatio+1)**.5),i.scale<s.minRatio&&(i.scale=s.minRatio+1-(s.minRatio-i.scale+1)**.5),g.imageEl.style.transform=`translate3d(0,0,0) scale(${i.scale})`))}function P(t){if(!x(t))return;if("mouse"===t.pointerType&&"pointerout"===t.type)return;const s=a(),i=e.zoom,r=h.findIndex(e=>e.pointerId===t.pointerId);r>=0&&h.splice(r,1),p&&m&&(p=!1,m=!1,g.imageEl&&(i.scale=Math.max(Math.min(i.scale,g.maxRatio),s.minRatio),g.imageEl.style.transitionDuration=`${e.params.speed}ms`,g.imageEl.style.transform=`translate3d(0,0,0) scale(${i.scale})`,n=i.scale,l=!1,i.scale>1&&g.slideEl?g.slideEl.classList.add(`${s.zoomedSlideClass}`):i.scale<=1&&g.slideEl&&g.slideEl.classList.remove(`${s.zoomedSlideClass}`),1===i.scale&&(g.originX=0,g.originY=0,g.slideEl=void 0)))}function L(){e.touchEventsData.preventTouchMoveFromPointerMove=!1}function
21828A(t){const s="mouse"===t.pointerType&&a().panOnMouseMove;if(!x(t)||!T(t))return;const r=e.zoom;if(!g.imageEl)return;if(!v.isTouched||!g.slideEl)return void(s&&z(t));if(s)return void z(t);v.isMoved||(v.width=g.imageEl.offsetWidth||g.imageEl.clientWidth,v.height=g.imageEl.offsetHeight||g.imageEl.clientHeight,v.startX=i(g.imageWrapEl,"x")||0,v.startY=i(g.imageWrapEl,"y")||0,g.slideWidth=g.slideEl.offsetWidth,g.slideHeight=g.slideEl.offsetHeight,g.imageWrapEl.style.transitionDuration="0ms");const o=v.width*r.scale,d=v.height*r.scale;v.minX=Math.min(g.slideWidth/2-o/2,0),v.maxX=-v.minX,v.minY=Math.min(g.slideHeight/2-d/2,0),v.maxY=-v.minY,v.touchesCurrent.x=h.length>0?h[0].pageX:t.pageX,v.touchesCurrent.y=h.length>0?h[0].pageY:t.pageY;Math.max(Math.abs(v.touchesCurrent.x-(v.touchesStart.x??0)),Math.abs(v.touchesCurrent.y-(v.touchesStart.y??0)))>5&&(e.allowClick=!1);const c=v.startX??0,p=v.startY??0;if(!v.isMoved&&!l){if(e.isHorizontal()&&(Math.floor(v.minX)===Math.floor(c)&&v.touchesCurrent.x<(v.touchesStart.x??0)||Math.floor(v.maxX)===Math.floor(c)&&v.touchesCurrent.x>(v.touchesStart.x??0)))return v.isTouched=!1,void L();if(!e.isHorizontal()&&(Math.floor(v.minY)===Math.floor(p)&&v.touchesCurrent.y<(v.touchesStart.y??0)||Math.floor(v.maxY)===Math.floor(p)&&v.touchesCurrent.y>(v.touchesStart.y??0)))return v.isTouched=!1,void L()}t.cancelable&&t.preventDefault(),t.stopPropagation(),void 0!==b&&clearTimeout(b),e.touchEventsData.preventTouchMoveFromPointerMove=!0,b=setTimeout(()=>{e.destroyed||L()}),v.isMoved=!0;const u=(r.scale-n)/(g.maxRatio-a().minRatio),{originX:m,originY:f}=g;v.currentX=v.touchesCurrent.x-(v.touchesStart.x??0)+c+u*(v.width-2*m),v.currentY=v.touchesCurrent.y-(v.touchesStart.y??0)+p+u*(v.height-2*f),v.currentX<v.minX&&(v.currentX=v.minX+1-(v.minX-v.currentX+1)**.8),v.currentX>v.maxX&&(v.currentX=v.maxX-1+(v.currentX-v.maxX+1)**.8),v.currentY<v.minY&&(v.currentY=v.minY+1-(v.minY-v.currentY+1)**.8),v.currentY>v.maxY&&(v.currentY=v.maxY-1+(v.currentY-v.maxY+1)**.8),w.prevPositionX||(w.prevPositionX=v.touchesCurrent.x),w.prevPositionY||(w.prevPositionY=v.touchesCurrent.y),w.prevTime||(w.prevTime=Date.now()),w.x=(v.touchesCurrent.x-w.prevPositionX)/(Date.now()-w.prevTime)/2,w.y=(v.touchesCurrent.y-w.prevPositionY)/(Date.now()-w.prevTime)/2,Math.abs(v.touchesCurrent.x-w.prevPositionX)<2&&(w.x=0),Math.abs(v.touchesCurrent.y-w.prevPositionY)<2&&(w.y=0),w.prevPositionX=v.touchesCurrent.x,w.prevPositionY=v.touchesCurrent.y,w.prevTime=Date.now(),g.imageWrapEl.style.transform=`translate3d(${v.currentX}px, ${v.currentY}px,0)`}function I(){const t=e.zoom;g.slideEl&&e.activeIndex!==e.slides.indexOf(g.slideEl)&&(g.imageEl&&(g.imageEl.style.transform="translate3d(0,0,0) scale(1)"),g.imageWrapEl&&(g.imageWrapEl.style.transform="translate3d(0,0,0)"),g.slideEl.classList.remove(`${a().zoomedSlideClass}`),t.scale=1,n=1,g.slideEl=void 0,g.imageEl=void 0,g.imageWrapEl=void 0,g.originX=0,g.originY=0)}function z(e){if(n<=1||!g.imageWrapEl)return;if(!x(e)||!T(e))return;const t=window.getComputedStyle(g.imageWrapEl).transform,s=new window.DOMMatrix(t);if(!o)return o=!0,c.x=e.clientX,c.y=e.clientY,v.startX=s.e,v.startY=s.f,v.width=g.imageEl.offsetWidth||g.imageEl.clientWidth,v.height=g.imageEl.offsetHeight||g.imageEl.clientHeight,g.slideWidth=g.slideEl.offsetWidth,void(g.slideHeight=g.slideEl.offsetHeight);const i=-3*(e.clientX-c.x),r=-3*(e.clientY-c.y),a=v.width*n,l=v.height*n,d=g.slideWidth,p=g.slideHeight,u=Math.min(d/2-a/2,0),m=-u,h=Math.min(p/2-l/2,0),f=-h,w=Math.max(Math.min(v.startX+i,m),u),b=Math.max(Math.min(v.startY+r,f),h);g.imageWrapEl.style.transitionDuration="0ms",g.imageWrapEl.style.transform=`translate3d(${w}px, ${b}px, 0)`,c.x=e.clientX,c.y=e.clientY,v.startX=w,v.startY=b,v.currentX=w,v.currentY=b}function $(t){const s=e.zoom,i=a();if(!g.slideEl){if(t&&"number"!=typeof t&&"target"in t&&t.target&&(g.slideEl=t.target.closest(`.${e.params.slideClass}, swiper-slide`)??void 0),!g.slideEl){const t=e.params.virtual;t&&t.enabled&&e.virtual?g.slideEl=d(e.slidesEl,`.${e.params.slideActiveClass}`)[0]??void 0:g.slideEl=e.slides[e.activeIndex]}let s=g.slideEl?.querySelector(`.${i.containerClass}`)??null;s&&(s=s.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]??null),g.imageEl=s??void 0,g.imageWrapEl=s?f(s,`.${i.containerClass}`)[0]??void 0:void 0}if(!g.imageEl||!g.imageWrapEl||!g.slideEl)return;let r,l,o,c,p,m,h,w,b,y,E,x,T,M,C,P,L,A;g.maxRatio=S(),e.params.cssMode&&(e.wrapperEl.style.overflow="hidden",e.wrapperEl.style.touchAction="none"),g.slideEl.classList.add(`${i.zoomedSlideClass}`);const I=t&&"number"!=typeof t;void 0===v.touchesStart.x&&I?(r=t.pageX,l=t.pageY):(r=v.touchesStart.x,l=v.touchesStart.y);const z=n,$="number"==typeof t?t:null;1===n&&$&&(r=void 0,l=void 0,v.touchesStart.x=void 0,v.touchesStart.y=void 0);const k=S();s.scale=$||k,n=$||k,!t||1===n&&$?(h=0,w=0):(L=g.slideEl.offsetWidth,A=g.slideEl.offsetHeight,o=u(g.slideEl).left+window.scrollX,c=u(g.slideEl).top+window.scrollY,p=o+L/2-(r??0),m=c+A/2-(l??0),b=g.imageEl.offsetWidth||g.imageEl.clientWidth,y=g.imageEl.offsetHeight||g.imageEl.clientHeight,E=b*s.scale,x=y*s.scale,T=Math.min(L/2-E/2,0),M=Math.min(A/2-x/2,0),C=-T,P=-M,z>0&&$&&"number"==typeof v.currentX&&"number"==typeof v.currentY?(h=v.currentX*s.scale/z,w=v.currentY*s.scale/z):(h=p*s.scale,w=m*s.scale),h<T&&(h=T),h>C&&(h=C),w<M&&(w=M),w>P&&(w=P)),$&&1===s.scale&&(g.originX=0,g.originY=0),v.currentX=h,v.currentY=w,g.imageWrapEl.style.transitionDuration="300ms",g.imageWrapEl.style.transform=`translate3d(${h}px, ${w}px,0)`,g.imageEl.style.transitionDuration="300ms",g.imageEl.style.transform=`translate3d(0,
218280,0) scale(${s.scale})`}function k(){const t=e.zoom,s=a();if(!g.slideEl){const t=e.params.virtual;t&&t.enabled&&e.virtual?g.slideEl=d(e.slidesEl,`.${e.params.slideActiveClass}`)[0]??void 0:g.slideEl=e.slides[e.activeIndex];let i=g.slideEl?.querySelector(`.${s.containerClass}`)??null;i&&(i=i.querySelectorAll("picture, img, svg, canvas, .swiper-zoom-target")[0]??null),g.imageEl=i??void 0,g.imageWrapEl=i?f(i,`.${s.containerClass}`)[0]??void 0:void 0}g.imageEl&&g.imageWrapEl&&g.slideEl&&(g.maxRatio=S(),e.params.cssMode&&(e.wrapperEl.style.overflow="",e.wrapperEl.style.touchAction=""),t.scale=1,n=1,v.currentX=void 0,v.currentY=void 0,v.touchesStart.x=void 0,v.touchesStart.y=void 0,g.imageWrapEl.style.transitionDuration="300ms",g.imageWrapEl.style.transform="translate3d(0,0,0)",g.imageEl.style.transitionDuration="300ms",g.imageEl.style.transform="translate3d(0,0,0) scale(1)",g.slideEl.classList.remove(`${s.zoomedSlideClass}`),g.slideEl=void 0,g.originX=0,g.originY=0,s.panOnMouseMove&&(c={x:0,y:0},o&&(o=!1,v.startX=0,v.startY=0)))}function O(t){const s=e.zoom;s.scale&&1!==s.scale?k():$(t)}function D(){return{passiveListener:!!e.params.passiveListeners&&{passive:!0,capture:!1},activeListenerWithCapture:!e.params.passiveListeners||{passive:!1,capture:!0}}}function G(){const t=e.zoom;if(t.enabled)return;t.enabled=!0;const{passiveListener:s,activeListenerWithCapture:i}=D();e.wrapperEl.addEventListener("pointerdown",M,s),e.wrapperEl.addEventListener("pointermove",C,i),["pointerup","pointercancel","pointerout"].forEach(t=>{e.wrapperEl.addEventListener(t,P,s)}),e.wrapperEl.addEventListener("pointermove",A,i)}function X(){const t=e.zoom;if(!t.enabled)return;t.enabled=!1;const{passiveListener:s,activeListenerWithCapture:i}=D();e.wrapperEl.removeEventListener("pointerdown",M,s),e.wrapperEl.removeEventListener("pointermove",C,i),["pointerup","pointercancel","pointerout"].forEach(t=>{e.wrapperEl.removeEventListener(t,P,s)}),e.wrapperEl.removeEventListener("pointermove",A,i)}Object.defineProperty(e.zoom,"scale",{get:()=>y,set(e){if(y!==e){const t=g.imageEl,s=g.slideEl;r("zoomChange",e,t,s)}y=e}}),s("init",()=>{a().enabled&&G()}),s("destroy",()=>{X()}),s("touchStart",(t,s)=>{e.zoom.enabled&&function(t){const s=e.device;if(v.isTouched)return;const i=h.length>0?h[0]:t;v.touchesStart.x=i.pageX,v.touchesStart.y=i.pageY,g.imageEl&&(s.android&&t.cancelable&&t.preventDefault(),v.isTouched=!0)}(s)}),s("touchEnd",()=>{e.zoom.enabled&&function(){const t=e.zoom;if(h.length=0,!g.imageEl)return;if(!v.isTouched||!v.isMoved)return v.isTouched=!1,void(v.isMoved=!1);v.isTouched=!1,v.isMoved=!1;let s=300,i=300;const r=w.x??0,a=w.y??0,n=r*s,l=v.currentX+n,o=a*i,d=v.currentY+o;0!==r&&(s=Math.abs((l-v.currentX)/r)),0!==a&&(i=Math.abs((d-v.currentY)/a));const c=Math.max(s,i);v.currentX=l,v.currentY=d;const p=v.width*t.scale,u=v.height*t.scale;v.minX=Math.min(g.slideWidth/2-p/2,0),v.maxX=-v.minX,v.minY=Math.min(g.slideHeight/2-u/2,0),v.maxY=-v.minY,v.currentX=Math.max(Math.min(v.currentX,v.maxX),v.minX),v.currentY=Math.max(Math.min(v.currentY,v.maxY),v.minY),g.imageWrapEl.style.transitionDuration=`${c}ms`,g.imageWrapEl.style.transform=`translate3d(${v.currentX}px, ${v.currentY}px,0)`}()}),s("doubleTap",(t,s)=>{!e.animating&&a().enabled&&e.zoom.enabled&&a().toggle&&O(s)}),s("transitionEnd",()=>{e.zoom.enabled&&a().enabled&&I()}),s("slideChange",()=>{e.zoom.enabled&&a().enabled&&e.params.cssMode&&I()}),Object.assign(e.zoom,{enable:G,disable:X,in:$,out:k,toggle:O})},({swiper:e,extendParams:s,on:i})=>{function r(){return e.params.controller}function a(){e.controller.control&&e.controller.spline&&(e.controller.spline=void 0,delete e.controller.spline)}s({controller:{control:void 0,inverse:!1,by:"slide"}}),e.controller={control:void 0},i("beforeInit",()=>{const t=r().control;if("undefined"!=typeof window&&("string"==typeof t||t instanceof HTMLElement)){return void("string"==typeof t?[...document.querySelectorAll(t)]:[t]).forEach(t=>{e.controller.control||(e.controller.control=[]);const s=e.controller.control;if(t&&t.swiper)s.push(t.swiper);else if(t){const i=`${e.params.eventsPrefix}init`,r=a=>{const n=a.detail;
21828n&&n[0]&&s.push(n[0]),e.update(),t.removeEventListener(i,r)};t.addEventListener(i,r)}})}e.controller.control=t}),i("update",()=>{a()}),i("resize",()=>{a()}),i("observerUpdate",()=>{a()}),i("setTranslate",(t,s,i)=>{e.controller.control&&(!Array.isArray(e.controller.control)&&e.controller.control.destroyed||e.controller.setTranslate(s,i))}),i("setTransition",(t,s,i)=>{e.controller.control&&(!Array.isArray(e.controller.control)&&e.controller.control.destroyed||e.controller.setTransition(s,i))}),Object.assign(e.controller,{setTranslate:function(t,s){const i=e.controller.control;let a,n;const l=e.constructor;function o(t){if(t.destroyed)return;const s=e.rtlTranslate?-e.translate:e.translate,i=r();"slide"===i.by?(!function(t){e.controller.spline=e.params.loop?new de(e.slidesGrid,t.slidesGrid):new de(e.snapGrid,t.snapGrid)}(t),n=-e.controller.spline.interpolate(-s)):n=0,n&&"container"!==i.by||(a=(t.maxTranslate()-t.minTranslate())/(e.maxTranslate()-e.minTranslate()),!Number.isNaN(a)&&Number.isFinite(a)||(a=1),n=(s-e.minTranslate())*a+t.minTranslate()),i.inverse&&(n=t.maxTranslate()-n),t.updateProgress(n),t.setTranslate(n,e),t.updateActiveIndex(),t.updateSlidesClasses()}if(Array.isArray(i))for(let e=0;e<i.length;e+=1){const t=i[e];t&&t!==s&&t instanceof l&&o(t)}else i instanceof l&&s!==i&&o(i)},setTransition:function(s,i){const r=e.constructor,a=e.controller.control;function n(i){i.destroyed||(i.setTransition(s,e),0!==s&&(i.transitionStart(),i.params.autoHeight&&t(()=>{i.updateAutoHeight()}),g(i.wrapperEl,()=>{a&&i.transitionEnd()})))}if(Array.isArray(a))for(let e=0;e<a.length;e+=1){const t=a[e];t&&t!==i&&t instanceof r&&n(t)}else a instanceof r&&i!==a&&n(a)}})},({swiper:e,extendParams:t,on:s})=>{t({a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}",slideLabelMessage:"{{index}} / {{slidesLength}}",containerMessage:null,containerRoleDescriptionMessage:null,containerRole:null,itemRoleDescriptionMessage:null,slideRole:"group",id:null,scrollOnFocus:!0,wrapperLiveRegion:!0}}),e.a11y={clicked:!1};let i,r=null,a=!1,n=(new Date).getTime();function l(){return e.params.a11y}function o(e){r&&e&&y(r,e)}function d(e){w(e).forEach(e=>{e.setAttribute("tabIndex","0")})}function c(e){w(e).forEach(e=>{e.setAttribute("tabIndex","-1")})}function u(e,t){w(e).forEach(e=>{e.setAttribute("role",t)})}function m(e,t){w(e).forEach(e=>{e.setAttribute("aria-roledescription",t)})}function f(e,t){w(e).forEach(e=>{e.setAttribute("aria-label",t)})}function g(e){w(e).forEach(e=>{e.setAttribute("aria-disabled","true")})}function v(e){w(e).forEach(e=>{e.removeAttribute("aria-disabled")})}function b(t){if(13!==t.keyCode&&32!==t.keyCode)return;const s=l(),i=e.params.pagination,r=t.target;if(!e.pagination||!e.pagination.el||r!==e.pagination.el&&!e.pagination.el.contains(r)||r.matches(le(i?.bulletClass))){if(e.navigation&&e.navigation.prevEl&&e.navigation.nextEl){const t=w(e.navigation.prevEl);w(e.navigation.nextEl).includes(r)&&(e.isEnd&&!e.params.loop||e.slideNext(),e.isEnd?o(s.lastSlideMessage):o(s.nextSlideMessage)),t.includes(r)&&(e.isBeginning&&!e.params.loop||e.slidePrev(),e.isBeginning?o(s.firstSlideMessage):o(s.prevSlideMessage))}e.pagination&&r.matches(le(i?.bulletClass))&&r.click()}}function E(){return!!(e.pagination&&e.pagination.bullets&&e.pagination.bullets.length)}function S(){const t=e.params.pagination;return E()&&!!t?.clickable}const x=(e,t,s)=>{d(e),"BUTTON"!==e.tagName&&(u(e,"button"),e.addEventListener("keydown",b)),f(e,s)},T=t=>{i&&i!==t.target&&!i.contains(t.target)&&(a=!0),e.a11y.clicked=!0},M=()=>{a=!1,requestAnimationFrame(()=>{requestAnimationFrame(()=>{e.destroyed||(e.a11y.clicked=!1)})})},C=e=>{n=(new Date).getTime()};let P=[];const L=()=>{P.forEach(e=>e.removeAttribute("inert")),P=[]},A=t=>{if("Tab"!==t.key||!e.params.loop||e.destroyed)return;const s=t.target,i=s?.closest?.(`.${e.params.slideClass}, swiper-slide`);if(!i||!e.slides.includes(i))return;const r=parseInt(i.getAttribute("data-swiper-slide-index")||"",10);if(Number.isNaN(r))return;const a=ce(e)?e.virtual.slides.length:e.slides.length;
21828(t.shiftKey?0===r:r===a-1)&&(L(),e.slides.forEach(e=>{e===i||e.hasAttribute("inert")||(e.setAttribute("inert",""),P.push(e))}),setTimeout(L,0))},I=t=>{const s=l();if(e.a11y.clicked||!s.scrollOnFocus)return;if((new Date).getTime()-n<100)return;const r=t.target.closest(`.${e.params.slideClass}, swiper-slide`);if(!r||!e.slides.includes(r))return;i=r;const o=ce(e),d=(o?parseInt(r.getAttribute("data-swiper-slide-index")||"0",10):e.slides.indexOf(r))===e.activeIndex,c=e.params.watchSlidesProgress&&e.visibleSlides&&e.visibleSlides.includes(r);if(d||c)return;const p=t.sourceCapabilities;p&&p.firesTouchEvents||(e.isHorizontal()?e.el.scrollLeft=0:e.el.scrollTop=0,requestAnimationFrame(()=>{a||(e.params.loop?e.slideToLoop(e.getSlideIndexWhenGrid(parseInt(r.getAttribute("data-swiper-slide-index")||"0",10)),0):o?e.slideTo(e.getSlideIndexWhenGrid(parseInt(r.getAttribute("data-swiper-slide-index")||"0",10)),0):e.slideTo(e.getSlideIndexWhenGrid(e.slides.indexOf(r)),0),a=!1)}))},z=()=>{const t=l();t.itemRoleDescriptionMessage&&m(e.slides,t.itemRoleDescriptionMessage),t.slideRole&&u(e.slides,t.slideRole);const s=e.slides.length,i=t.slideLabelMessage;i&&e.slides.forEach((t,r)=>{const a=e.params.loop?parseInt(t.getAttribute("data-swiper-slide-index")||"0",10):r;f(t,i.replace(/\{\{index\}\}/,String(a+1)).replace(/\{\{slidesLength\}\}/,String(s)))})},$=()=>{const t=l();r&&e.el.append(r);const s=e.el;t.containerRoleDescriptionMessage&&m(s,t.containerRoleDescriptionMessage),t.containerMessage&&f(s,t.containerMessage),t.containerRole&&u(s,t.containerRole);const i=e.wrapperEl,a=String(t.id||i.getAttribute("id")||`swiper-wrapper-${function(e=16){return"x".repeat(e).replace(/x/g,()=>Math.round(16*Math.random()).toString(16))}(16)}`);var n;if(n=a,w(i).forEach(e=>{e.setAttribute("id",n)}),t.wrapperLiveRegion){const t=e.params.autoplay;!function(e,t){w(e).forEach(e=>{e.setAttribute("aria-live",t)})}(i,e.params.autoplay&&t?.enabled?"off":"polite")}z();const o=e.navigation?e.navigation:{nextEl:void 0,prevEl:void 0},d=w(o.nextEl),c=w(o.prevEl);if(d&&d.forEach(e=>x(e,0,t.nextSlideMessage)),c&&c.forEach(e=>x(e,0,t.prevSlideMessage)),S()){w(e.pagination.el).forEach(e=>{e.addEventListener("keydown",b)})}document.addEventListener("visibilitychange",C),e.el.addEventListener("focus",I,!0),e.el.addEventListener("keydown",A,!0),e.el.addEventListener("pointerdown",T,!0),e.el.addEventListener("pointerup",M,!0)};s("beforeInit",()=>{r=p("span",l().notificationClass),r.setAttribute("aria-live","assertive"),r.setAttribute("aria-atomic","true")}),s("afterInit",()=>{l().enabled&&$()}),s("slidesLengthChange snapGridLengthChange slidesGridLengthChange",()=>{l().enabled&&z()}),s("fromEdge toEdge afterInit lock unlock",()=>{l().enabled&&function(){if(e.params.loop||e.params.rewind||!e.navigation)return;const{nextEl:t,prevEl:s}=e.navigation;s&&(e.isBeginning?(g(s),c(s)):(v(s),d(s))),t&&(e.isEnd?(g(t),c(t)):(v(t),d(t)))}()}),s("paginationUpdate",()=>{l().enabled&&function(){const t=l();if(!E())return;const s=e.params.pagination;e.pagination.bullets.forEach(e=>{s.clickable&&(d(e),s.renderBullet||(u(e,"button"),f(e,t.paginationBulletMessage.replace(/\{\{index\}\}/,String((h(e)??0)+1))))),e.matches(le(s.bulletActiveClass))?e.setAttribute("aria-current","true"):e.removeAttribute("aria-current")})}()}),s("destroy",()=>{l().enabled&&function(){r&&r.remove();const t=e.navigation?e.navigation:{nextEl:void 0,prevEl:void 0},s=w(t.nextEl),i=w(t.prevEl);s&&s.forEach(e=>e.removeEventListener("keydown",b)),i&&i.forEach(e=>e.removeEventListener("keydown",b)),S()&&w(e.pagination.el).forEach(e=>{e.removeEventListener("keydown",b)});document.removeEventListener("visibilitychange",C),e.el&&"string"!=typeof e.el&&(e.el.removeEventListener("focus",I,!0),e.el.removeEventListener("keydown",A,!0),e.el.removeEventListener("pointerdown",T,!0),e.el.removeEventListener("pointerup",M,!0)),L()}()})},({swiper:e,extendParams:t,on:s})=>{t({history:{enabled:!1,root:"",replaceState:!1,key:"slides",keepQuery:!1}});let i=!1,r={key:void 0,value:void 0};function a(){return e.params.history}const n=e=>e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,""),l=e=>{let t;t=e?new URL(e):window.location;const s=t.pathname.slice(1).split("/").filter(e=>""!==e),i=s.length;return{key:s[i-2],value:s[i-1]}},o=(t,s)=>{const r=a();if(!i||!r.enabled)return;let l;l=e.params.url?new URL(e.params.url):window.location;
21828const o=!!e.params.virtual?.enabled,d=e.virtual&&o?e.slidesEl.querySelector(`[data-swiper-slide-index="${s}"]`):e.slides[s];if(!d)return;let c=n(d.getAttribute("data-history")||"");const p=r.root;if(p.length>0){c=`${"/"===p[p.length-1]?p.slice(0,p.length-1):p}/${t?`${t}/`:""}${c}`}else l.pathname.includes(t||"")||(c=`${t?`${t}/`:""}${c}`);r.keepQuery&&(c+=l.search);const u=window.history.state;u&&u.value===c||(r.replaceState?window.history.replaceState({value:c},"",c):window.history.pushState({value:c},"",c))},d=(t,s,i)=>{if(s)for(let r=0,a=e.slides.length;r<a;r+=1){const a=e.slides[r];if(n(a.getAttribute("data-history")||"")===s){const s=e.getSlideIndex(a);e.slideTo(s,t,i)}}else e.slideTo(0,t,i)},c=()=>{r=l(e.params.url),d(e.params.speed,r.value,!1)};s("init",()=>{a().enabled&&(()=>{const t=e.params.history;if(t){if(!window.history||!window.history.pushState){t.enabled=!1;const s=e.params.hashNavigation;return void(s&&(s.enabled=!0))}i=!0,r=l(e.params.url),r.key||r.value?(d(0,r.value,e.params.runCallbacksOnInit),t.replaceState||window.addEventListener("popstate",c)):t.replaceState||window.addEventListener("popstate",c)}})()}),s("destroy",()=>{a().enabled&&(a().replaceState||window.removeEventListener("popstate",c))}),s("transitionEnd _freeModeNoMomentumRelease",()=>{i&&o(a().key,e.activeIndex)}),s("slideChange",()=>{i&&e.params.cssMode&&o(a().key,e.activeIndex)})},({swiper:e,extendParams:t,emit:s,on:i})=>{let r=!1;function a(){return e.params.hashNavigation}t({hashNavigation:{enabled:!1,replaceState:!1,watchState:!1,getSlideIndex(t,s){if(pe(e)){const t=e.slides.find(e=>e.getAttribute("data-hash")===s);if(!t)return 0;return parseInt(t.getAttribute("data-swiper-slide-index")||"0",10)}const i=d(e.slidesEl,`.${e.params.slideClass}[data-hash="${s}"], swiper-slide[data-hash="${s}"]`)[0];return i?e.getSlideIndex(i):0}}});const n=()=>{s("hashChange");const t=document.location.hash.replace("#",""),i=pe(e)?e.slidesEl.querySelector(`[data-swiper-slide-index="${e.activeIndex}"]`):e.slides[e.activeIndex];if(t!==(i?i.getAttribute("data-hash"):"")){const s=a().getSlideIndex(e,t);if(void 0===s||Number.isNaN(s))return;e.slideTo(s)}},l=()=>{const t=a();if(!r||!t.enabled)return;const i=pe(e)?e.slidesEl.querySelector(`[data-swiper-slide-index="${e.activeIndex}"]`):e.slides[e.activeIndex],n=i?i.getAttribute("data-hash")||i.getAttribute("data-history"):"";t.replaceState&&window.history&&window.history.replaceState?(window.history.replaceState(null,"",`#${n}`||""),s("hashSet")):(document.location.hash=n||"",s("hashSet"))};i("init",()=>{a().enabled&&(()=>{const t=a(),s=e.params.history;if(!t.enabled||s&&s.enabled)return;r=!0;const i=document.location.hash.replace("#","");if(i){const s=0,r=t.getSlideIndex(e,i);e.slideTo(r||0,s,e.params.runCallbacksOnInit,!0)}t.watchState&&window.addEventListener("hashchange",n)})()}),i("destroy",()=>{a().enabled&&a().watchState&&window.removeEventListener("hashchange",n)}),i("transitionEnd _freeModeNoMomentumRelease",()=>{r&&l()}),i("slideChange",()=>{r&&e.params.cssMode&&l()})},({swiper:e,extendParams:t,on:s,emit:i,params:r})=>{function a(){return e.params.autoplay}e.autoplay={running:!1,paused:!1,timeLeft:0},t({autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!1,stopOnLastSlide:!1,reverseDirection:!1,pauseOnMouseEnter:!1}});const n="object"==typeof r.autoplay&&r.autoplay&&"number"==typeof r.autoplay.delay?r.autoplay.delay:3e3;let l,o,d,c=n,p=n,u=0,m=(new Date).getTime(),h=!1,f=!1,g=!1,v=!1,w=!1;function b(t){if(!e||e.destroyed||!e.wrapperEl)return;if(t.target!==e.wrapperEl)return;e.wrapperEl.removeEventListener("transitionend",b);const s=t.detail;w||s&&s.bySwiperTouchMove||C()}const y=()=>{if(e.destroyed||!e.autoplay.running)return;e.autoplay.paused?h=!0:h&&(p=u,h=!1);const t=e.autoplay.paused?u:m+p-(new Date).getTime();e.autoplay.timeLeft=t,i("autoplayTimeLeft",t,t/c),o=requestAnimationFrame(()=>{y()})},E=()=>{let t=a().delay;const s=(()=>{let t;const s=!!e.params.virtual?.enabled;if(t=e.virtual&&s?e.slides.find(e=>e.classList.contains("swiper-slide-active")):e.slides[e.activeIndex],!t)return;const i=t.getAttribute("data-swiper-autoplay");return null!=i?parseInt(i,10):void 0})();return"number"==typeof s&&!Number.isNaN(s)&&s>0&&(t=s),t},S=t=>{if(e.destroyed||!e.autoplay.running)return 0;void 0!==o&&cancelAnimationFrame(o),y();let s=t;void 0===s&&(s=E(),c=s,p=s),u=s;const r=e.params.speed,n=()=>
21828{if(!e||e.destroyed)return;const t=a();t.reverseDirection?!e.isBeginning||e.params.loop||e.params.rewind?(e.slidePrev(r,!0,!0),i("autoplay")):t.stopOnLastSlide||(e.slideTo(e.slides.length-1,r,!0,!0),i("autoplay")):!e.isEnd||e.params.loop||e.params.rewind?(e.slideNext(r,!0,!0),i("autoplay")):t.stopOnLastSlide||(e.slideTo(0,r,!0,!0),i("autoplay")),e.params.cssMode&&(m=(new Date).getTime(),requestAnimationFrame(()=>{S()}))};return s>0?(void 0!==l&&clearTimeout(l),l=setTimeout(()=>{n()},s)):requestAnimationFrame(()=>{n()}),s},x=()=>(m=(new Date).getTime(),e.autoplay.running=!0,S(),i("autoplayStart"),!0),T=()=>(e.autoplay.running=!1,void 0!==l&&clearTimeout(l),void 0!==o&&cancelAnimationFrame(o),i("autoplayStop"),!0),M=(t,s)=>{if(e.destroyed||!e.autoplay.running)return;void 0!==l&&clearTimeout(l),t||(v=!0);const r=()=>{i("autoplayPause"),a().waitForTransition?e.wrapperEl.addEventListener("transitionend",b):C()};if(e.autoplay.paused=!0,s)return void r();const n=u||a().delay;u=n-((new Date).getTime()-m),e.isEnd&&u<0&&!e.params.loop||(u<0&&(u=0),r())},C=()=>{e.isEnd&&u<0&&!e.params.loop||e.destroyed||!e.autoplay.running||(m=(new Date).getTime(),v?(v=!1,S(u)):S(),e.autoplay.paused=!1,i("autoplayResume"))},P=()=>{!e.destroyed&&e.autoplay.running&&("hidden"===document.visibilityState&&(v=!0,M(!0)),"visible"===document.visibilityState&&C())},L=t=>{"mouse"===t.pointerType&&(v=!0,w=!0,e.animating||e.autoplay.paused||M(!0))},A=t=>{"mouse"===t.pointerType&&(w=!1,e.autoplay.paused&&C())};s("init",()=>{a().enabled&&(a().pauseOnMouseEnter&&(e.el.addEventListener("pointerenter",L),e.el.addEventListener("pointerleave",A)),document.addEventListener("visibilitychange",P),x())}),s("destroy",()=>{e.el&&"string"!=typeof e.el&&(e.el.removeEventListener("pointerenter",L),e.el.removeEventListener("pointerleave",A)),document.removeEventListener("visibilitychange",P),e.autoplay.running&&T()}),s("_freeModeStaticRelease",()=>{(g||v)&&C()}),s("_freeModeNoMomentumRelease",()=>{a().disableOnInteraction?T():M(!0,!0)}),s("beforeTransitionStart",(t,s,i)=>{!e.destroyed&&e.autoplay.running&&(i||!a().disableOnInteraction?M(!0,!0):T())}),s("sliderFirstMove",()=>{!e.destroyed&&e.autoplay.running&&(a().disableOnInteraction?T():(f=!0,g=!1,v=!1,d=setTimeout(()=>{v=!0,g=!0,M(!0)},200)))}),s("touchEnd",()=>{if(!e.destroyed&&e.autoplay.running&&f){if(void 0!==d&&clearTimeout(d),void 0!==l&&clearTimeout(l),a().disableOnInteraction)return g=!1,void(f=!1);g&&e.params.cssMode&&C(),g=!1,f=!1}}),s("slideChange",()=>{!e.destroyed&&e.autoplay.running&&e.autoplay.paused&&(u=E(),c=E())}),Object.assign(e.autoplay,{start:x,stop:T,pause:M,resume:C})},({swiper:e,extendParams:t,on:s})=>{t({thumbs:{swiper:null,multipleActiveThumbs:!0,autoScrollOffset:0,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-thumbs"}});let i=!1,a=!1;function n(){return e.params.thumbs}function l(){const t=e.thumbs.swiper;if(!t||t.destroyed)return!1;const s=t.params.virtual;return!!s&&!!s.enabled}function o(){const t=e.thumbs.swiper;if(!t||t.destroyed)return;const s=t.clickedIndex,i=t.clickedSlide,r=n();if(i&&i.classList.contains(r.slideThumbActiveClass))return;if(null==s)return;let a;if(t.params.loop){const e=t.clickedSlide?.getAttribute("data-swiper-slide-index");a=null==e?s:parseInt(e,10)}else a=s;e.params.loop?e.slideToLoop(a):e.slideTo(a)}function c(){const t=n();if(i)return!1;i=!0;const s=e.constructor;if(t.swiper instanceof s){if(t.swiper.destroyed)return i=!1,!1;const s=t.swiper;e.thumbs.swiper=s,Object.assign(s.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),Object.assign(s.params,{watchSlidesProgress:!0,slideToClickedSlide:!1}),s.update()}else if(r(t.swiper)){const i=Object.assign({},t.swiper);Object.assign(i,{watchSlidesProgress:!0,slideToClickedSlide:!1}),e.thumbs.swiper=new s(i),a=!0}const d=e.thumbs.swiper;return!!d&&(d.el.classList.add(t.thumbsContainerClass),d.on("tap",o),l()&&d.on("virtualUpdate",()=>{p(!1,{autoScroll:!1})}),!0)}function p(t,s){const i=e.thumbs.swiper;if(!i||i.destroyed)return;let r=1;const a=n(),o=a.slideThumbActiveClass,c=e.params.slidesPerView;if("number"==typeof c&&c>1&&!e.params.centeredSlides&&(r=c),a.multipleActiveThumbs||(r=1),r=Math.floor(r),i.slides.forEac
21828h(e=>e.classList.remove(o)),i.params.loop||l())for(let t=0;t<r;t+=1)d(i.slidesEl,`[data-swiper-slide-index="${e.realIndex+t}"]`).forEach(e=>{e.classList.add(o)});else for(let t=0;t<r;t+=1){const s=i.slides[e.realIndex+t];s&&s.classList.add(o)}(s?.autoScroll??1)&&function(t){const s=e.thumbs.swiper;if(!s||s.destroyed)return;const i=s.params.slidesPerView,r="auto"===i?s.slidesPerViewDynamic():i??1,a=n().autoScrollOffset,l=a&&!s.params.loop;if(e.realIndex!==s.realIndex||l){const i=s.activeIndex;let n,o;if(s.params.loop){const t=s.slides.find(t=>t.getAttribute("data-swiper-slide-index")===`${e.realIndex}`);n=t?s.slides.indexOf(t):-1,o=e.activeIndex>e.previousIndex?"next":"prev"}else n=e.realIndex,o=n>e.previousIndex?"next":"prev";l&&(n+="next"===o?a:-1*a),s.visibleSlidesIndexes&&s.visibleSlidesIndexes.indexOf(n)<0&&(s.params.centeredSlides?n=n>i?n-Math.floor(r/2)+1:n+Math.floor(r/2)-1:n>i&&s.params.slidesPerGroup,s.slideTo(n,t))}}(t?0:void 0)}e.thumbs={swiper:null},s("beforeInit",()=>{const t=e.params.thumbs;if(t&&t.swiper)if("string"==typeof t.swiper||t.swiper instanceof HTMLElement){const s=()=>{const s="string"==typeof t.swiper?document.querySelector(t.swiper):t.swiper;if(s&&s.swiper)t.swiper=s.swiper,c(),p(!0);else if(s){const i=`${e.params.eventsPrefix}init`,r=a=>{const n=a.detail;t.swiper=n[0],s.removeEventListener(i,r),c(),p(!0),t.swiper.update(),e.update()};s.addEventListener(i,r)}return s},i=()=>{if(e.destroyed)return;s()||requestAnimationFrame(i)};requestAnimationFrame(i)}else c(),p(!0)}),s("slideChange update resize observerUpdate",()=>{p()}),s("setTransition",(t,s)=>{const i=e.thumbs.swiper;i&&!i.destroyed&&i.setTransition(s)}),s("beforeDestroy",()=>{const t=e.thumbs.swiper;t&&!t.destroyed&&a&&t.destroy()}),Object.assign(e.thumbs,{init:c,update:p})},({swiper:e,extendParams:t,emit:i,once:r})=>{t({freeMode:{enabled:!1,momentum:!0,momentumRatio:1,momentumBounce:!0,momentumBounceRatio:1,momentumVelocityRatio:1,sticky:!1,minimumVelocity:.02}}),e.freeMode={onTouchStart:function(){if(e.params.cssMode)return;const t=e.getTranslate();e.setTranslate(t),e.setTransition(0),e.touchEventsData.velocities.length=0,e.freeMode.onTouchEnd({currentPos:e.rtl?e.translate:-e.translate})},onTouchMove:function(){if(e.params.cssMode)return;const{touchEventsData:t,touches:i}=e;0===t.velocities.length&&t.velocities.push({position:i[e.isHorizontal()?"startX":"startY"],time:t.touchStartTime??s()}),t.velocities.push({position:i[e.isHorizontal()?"currentX":"currentY"],time:s()})},onTouchEnd:function({currentPos:t}){if(e.params.cssMode)return;const{wrapperEl:a,rtlTranslate:n,snapGrid:l,touchEventsData:o}=e,d=e.params,c=e.params.freeMode,p=s(),u=p-(o.touchStartTime??p);if(t<-e.minTranslate())e.slideTo(e.activeIndex);else if(t>-e.maxTranslate())e.slides.length<l.length?e.slideTo(l.length-1):e.slideTo(e.slides.length-1);else{if(c.momentum){if(o.velocities.length>1){const t=o.velocities.pop(),i=o.velocities.pop(),r=t.position-i.position,a=t.time-i.time;e.velocity=r/a,e.velocity/=2,Math.abs(e.velocity)<c.minimumVelocity&&(e.velocity=0),(a>150||s()-t.time>300)&&(e.velocity=0)}else e.velocity=0;e.velocity*=c.momentumVelocityRatio,o.velocities.length=0;let t=1e3*c.momentumRatio;const p=e.velocity*t;let u=e.translate+p;n&&(u=-u);let m,h=!1;const f=20*Math.abs(e.velocity)*c.momentumBounceRatio;let v=!1;if(u<e.maxTranslate())c.momentumBounce?(u+e.maxTranslate()<-f&&(u=e.maxTranslate()-f),m=e.maxTranslate(),h=!0,o.allowMomentumBounce=!0):u=e.maxTranslate(),d.loop&&d.centeredSlides&&(v=!0);else if(u>e.minTranslate())c.momentumBounce?(u-e.minTranslate()>f&&(u=e.minTranslate()+f),m=e.minTranslate(),h=!0,o.allowMomentumBounce=!0):u=e.minTranslate(),d.loop&&d.centeredSlides&&(v=!0);else if(c.sticky){let t=0;for(let e=0;e<l.length;e+=1)if(l[e]>-u){t=e;break}u=Math.abs(l[t]-u)<Math.abs((l[t-1]??l[t])-u)||"next"===e.swipeDirection?l[t]:l[t-1],u=-u}if(v&&r("transitionEnd",()=>{e.loopFix()}),0!==e.velocity){if(t=n?Math.abs((-u-e.translate)/e.velocity):Math.abs((u-e.translate)/e.velocity),c.sticky){const s=Math.abs((n?-u:u)-e.translate),i=e.slidesSizesGrid[e.activeIndex],r=d.speed;t=s<i?r:s<2*i?1.5*r:2.5*r}}else if(c.sticky)return void e.slideToClosest();c.momentumBounce&&h&&void 0!==m?(e.updateProgress(m),e.setTransition(t),e.setTranslate(u),e.transitionStart(!0,e.swipeDirection),e.animating=!0,g(a,()=>{e&&!e.destroyed&&o.allowMomentumBounce&&(i("momentumBounce"),e.setTransition(d.speed),setTimeout(()=>{e.setTranslate(m),g(a,()=>{e&&!e.destroyed&&e.transitionEnd()})},0))})):e.velocity?(i("_freeModeNoMomentumRelease"),e.updateProgress(u),e.setTransition(t),e.setTranslate(u),e.transitionStart(!0,e.swipeDirection),e.animating||(e.animating=!0,g(a,()=>{e&&!e.destroyed&&e.transitionEnd()}))):e.updateProgress(u),e.updateActiveIndex(),e.updateSlidesClasses()}else{if(c.sticky)return void e.slideToClosest();i("_freeModeNoMomentumRelease")}(!c.momentum||u>=d.longSwipesMs)&&(i("_freeModeStaticRelease"),e.updateProgress(),e.updateActiveIndex(),e.updateSlidesClasses())}}}},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.grid}let r,a,n,l;t({grid:{rows:1,fill:"column"}});const o=()=>{let t=e.params.spaceBetween??0;return"string"==typeof t&&t.indexOf("%")>=0?t=parseFloat(t.replace("%",""))/100*e.size:"string"==typeof t&&(t=parseFloat(t)),t},d=()=>{const t=e.params.virtual;return!!e.virtual&&"object"==typeof t&&null!==t&&!!t.enabled};s("init",()=>{const t=e.params.grid;l=!!(t&&(t.rows??1)>1)}),s("update",()=>{const{params:t,el:s}=e,i=t.grid,r=!!(i&&(i.rows??1)>1);l&&!r?(s.classList.remove(`${t.containerModifierClass}grid`,`${t.containerModifierClass}grid-column`),n=1,e.emitContainerClasses()):!l&&r&&(s.classList.add(`${t.containerModifierClass}grid`),"column"===i.fill&&s.classList.add(`${t.containerModifierClass}grid-column`),e.emitContainerClasses()),l=r}),e.grid={initSlides:t=>{const{slidesPerView:s}=e.params,{rows:l,fill:o}=i(),c=d()?e.virtual.slides.length:t.length;n=Math.floor(c/l),r=Math.floor(c/l)===c/l?c:Math.ceil(c/l)*l,"auto"!==s&&"row"===o&&(r=Math.max(r,Math.floor(s??1)*l)),a=r/l},unsetSlides:()=>
21828{e.slides&&e.slides.forEach(t=>{t.swiperSlideGridSet&&(t.style.height="",t.style.setProperty(e.getDirectionLabel("margin-top"),""))})},updateSlide:(t,s,l)=>{const{slidesPerGroup:c}=e.params,p=o(),{rows:u,fill:m}=i(),h=d()?e.virtual.slides.length:l.length;let f,g,v;if("row"===m&&(c??1)>1){const e=c??1,i=Math.floor(t/(e*u)),a=t-u*e*i,n=0===i?e:Math.min(Math.ceil((h-i*u*e)/u),e);v=Math.floor(a/n),g=a-v*n+i*e,f=g+v*r/u,s.style.order=String(f)}else"column"===m?(g=Math.floor(t/u),v=t-g*u,(g>n||g===n&&v===u-1)&&(v+=1,v>=u&&(v=0,g+=1))):(v=Math.floor(t/a),g=t-v*a);const w=s;w.row=v,w.column=g,s.style.height=`calc((100% - ${(u-1)*p}px) / ${u})`,s.style.setProperty(e.getDirectionLabel("margin-top"),0!==v&&p?`${p}px`:""),w.swiperSlideGridSet=!0},updateWrapperSize:(t,s)=>{const{centeredSlides:a,roundLengths:n}=e.params,l=o(),{rows:d}=i();if(e.virtualSize=(t+l)*r,e.virtualSize=Math.ceil(e.virtualSize/d)-l,e.params.cssMode||e.wrapperEl.style.setProperty(e.getDirectionLabel("width"),`${e.virtualSize+l}px`),a){const t=[];for(let i=0;i<s.length;i+=1){let r=s[i];n&&(r=Math.floor(r)),s[i]<e.virtualSize+s[0]&&t.push(r)}s.splice(0,s.length),s.push(...t)}}}},({swiper:e})=>{Object.assign(e,{appendSlide:me.bind(e),prependSlide:he.bind(e),addSlide:ue.bind(e),removeSlide:ge.bind(e),removeAllSlides:fe.bind(e)})},({swiper:e,extendParams:t,on:s})=>{t({fadeEffect:{crossFade:!1,mode:"default"}});let i=0;function r(){return e.params.fadeEffect}function a(){const e=r();return"default"===e.mode&&e.crossFade?"cross-fade":e.mode}ve({effect:"fade",swiper:e,on:s,setTranslate:()=>{const{slides:t}=e,s=(r(),a()),n="out-in"===s&&i>0,l=i;i=0;const o=[],d=[];let c=!1;for(let i=0;i<t.length;i+=1){const r=t[i];let a=-(r.swiperSlideOffset??0);e.params.virtualTranslate||(a-=e.translate);let l=0;e.isHorizontal()||(l=a,a=0);const p=r.progress??0;let u;u="cross-fade"===s?Math.max(1-Math.abs(p),0):"out-in"===s?Math.max(1-2*Math.abs(p),0):1+Math.min(Math.max(p,-1),0);const m=we(0,r);if(n){const e=parseFloat(m.style.opacity);0===u&&e>0&&(c=!0),u>0&&d.push(m),o.push(m)}m.style.opacity=String(u),m.style.transform=`translate3d(${a}px, ${l}px, 0px)`}n&&(o.forEach(e=>{const t=c&&d.includes(e);e.style.transitionDuration=l/2+"ms",e.style.transitionDelay=t?l/2+"ms":"0ms"}),be({swiper:e,duration:l,transformElements:d,allSlides:!0}))},setTransition:t=>{const s=a(),r=e.slides.map(e=>o(e));r.forEach(e=>{e.style.transitionDuration=`${t}ms`,"out-in"===s&&0===t&&(e.style.transitionDelay="")}),"out-in"===s&&t>0&&!e.params.cssMode?i=t:be({swiper:e,duration:t,transformElements:r,allSlides:!0})},overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},({swiper:e,extendParams:t,on:s})=>{t({cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}});const i=(e,t,s)=>{let i=s?e.querySelector(".swiper-slide-shadow-left"):e.querySelector(".swiper-slide-shadow-top"),r=s?e.querySelector(".swiper-slide-shadow-right"):e.querySelector(".swiper-slide-shadow-bottom");i||(i=p("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"left":"top")).split(" ")),e.append(i)),r||(r=p("div",("swiper-slide-shadow-cube swiper-slide-shadow-"+(s?"right":"bottom")).split(" ")),e.append(r)),i&&(i.style.opacity=String(Math.max(-t,0))),r&&(r.style.opacity=String(Math.max(t,0)))};ve({effect:"cube",swiper:e,on:s,setTranslate:()=>{const{el:t,wrapperEl:s,slides:r,width:a,height:n,rtlTranslate:l,size:o}=e,d=b(e),c=e.params.cubeEffect,u=e.isHorizontal(),m=!(!e.virtual||!e.params.virtual?.enabled);let h=0,f=null;c.shadow&&(u?(f=e.wrapperEl.querySelector(".swiper-cube-shadow"),f||(f=p("div","swiper-cube-shadow"),e.wrapperEl.append(f)),f.style.height=`${a}px`):(f=t.querySelector(".swiper-cube-shadow"),f||(f=p("div","swiper-cube-shadow"),t.append(f))));for(let e=0;e<r.length;e+=1){const t=r[e];let s=e;m&&(s=parseInt(t.getAttribute("data-swiper-slide-index")??"0",10));let a=90*s,n=Math.floor(a/360);l&&(a=-a,n=Math.floor(-a/360));const p=Math.max(Math.min(t.progress??0,1),-1);let f=0,g=0,v=0;s%4==0?(f=4*-n*o,v=0):(s-1)%4==0?(f=0,v=4*-n*o):(s-2)%4==0?(f=o+4*n*o,v=o):(s-3)%4==0&&(f=-o,v=3*o+4*o*n),l&&(f=-f),u||(g=f,f=0);const w=`rotateX(${d(u?0:-a)}deg) rotateY(${d(u?a:0)}deg) translate3d(${f}px, ${g}px, ${v}px)`;p<=1&&p>
21828-1&&(h=90*s+90*p,l&&(h=90*-s-90*p)),t.style.transform=w,c.slideShadows&&i(t,p,u)}if(s.style.transformOrigin=`50% 50% -${o/2}px`,s.style.setProperty("-webkit-transform-origin",`50% 50% -${o/2}px`),c.shadow&&f)if(u)f.style.transform=`translate3d(0px, ${a/2+c.shadowOffset}px, ${-a/2}px) rotateX(89.99deg) rotateZ(0deg) scale(${c.shadowScale})`;else{const e=Math.abs(h)-90*Math.floor(Math.abs(h)/90),t=1.5-(Math.sin(2*e*Math.PI/360)/2+Math.cos(2*e*Math.PI/360)/2),s=c.shadowScale,i=c.shadowScale/t,r=c.shadowOffset;f.style.transform=`scale3d(${s}, 1, ${i}) translate3d(0px, ${n/2+r}px, ${-n/2/i}px) rotateX(-89.99deg)`}s.style.transform=`translate3d(0px,0,0px) rotateX(${d(e.isHorizontal()?0:h)}deg) rotateY(${d(e.isHorizontal()?-h:0)}deg)`,s.style.setProperty("--swiper-cube-translate-z","0px")},setTransition:t=>{const{el:s,slides:i}=e;if(i.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),e.params.cubeEffect?.shadow&&!e.isHorizontal()){const e=s.querySelector(".swiper-cube-shadow");e&&(e.style.transitionDuration=`${t}ms`)}},recreateShadows:()=>{const t=e.isHorizontal();e.slides.forEach(e=>{const s=Math.max(Math.min(e.progress??0,1),-1);i(e,s,t)})},getEffectParams:()=>e.params.cubeEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0})})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.flipEffect}t({flipEffect:{slideShadows:!0,limitRotation:!0}});const r=(t,s)=>{let i=e.isHorizontal()?t.querySelector(".swiper-slide-shadow-left"):t.querySelector(".swiper-slide-shadow-top"),r=e.isHorizontal()?t.querySelector(".swiper-slide-shadow-right"):t.querySelector(".swiper-slide-shadow-bottom");i||(i=ye("flip",t,e.isHorizontal()?"left":"top")),r||(r=ye("flip",t,e.isHorizontal()?"right":"bottom")),i&&(i.style.opacity=String(Math.max(-s,0))),r&&(r.style.opacity=String(Math.max(s,0)))};ve({effect:"flip",swiper:e,on:s,setTranslate:()=>{const{slides:t,rtlTranslate:s}=e,a=i(),n=b(e);for(let i=0;i<t.length;i+=1){const l=t[i];let o=l.progress??0;a.limitRotation&&(o=Math.max(Math.min(o,1),-1));const d=l.swiperSlideOffset??0;let c=-180*o,p=0,u=e.params.cssMode?-d-e.translate:-d,m=0;e.isHorizontal()?s&&(c=-c):(m=u,u=0,p=-c,c=0),l.style.zIndex=String(-Math.abs(Math.round(o))+t.length),a.slideShadows&&r(l,o);const h=`translate3d(${u}px, ${m}px, 0px) rotateX(${n(p)}deg) rotateY(${n(c)}deg)`;we(0,l).style.transform=h}},setTransition:t=>{const s=e.slides.map(e=>o(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),be({swiper:e,duration:t,transformElements:s})},recreateShadows:()=>{const t=i();e.slides.forEach(e=>{let s=e.progress??0;t.limitRotation&&(s=Math.max(Math.min(s,1),-1)),r(e,s)})},getEffectParams:()=>e.params.flipEffect,perspective:()=>!0,overwriteParams:()=>({slidesPerView:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!e.params.cssMode})})},({swiper:e,extendParams:t,on:s})=>{t({coverflowEffect:{rotate:50,stretch:0,depth:100,scale:1,modifier:1,slideShadows:!0}});ve({effect:"coverflow",swiper:e,on:s,setTranslate:()=>{const{width:t,height:s,slides:i,slidesSizesGrid:r}=e,a=e.params.coverflowEffect,n=e.isHorizontal(),l=e.translate,o=n?t/2-l:s/2-l,d=n?a.rotate:-a.rotate,c=a.depth,p=b(e);for(let e=0,t=i.length;e<t;e+=1){const t=i[e],s=r[e],l=(o-(t.swiperSlideOffset??0)-s/2)/s,u="function"==typeof a.modifier?a.modifier(l):l*a.modifier;let m=n?d*u:0,h=n?0:d*u,f=-c*Math.abs(u),g="string"==typeof a.stretch&&-1!==a.stretch.indexOf("%")?parseFloat(a.stretch)/100*s:a.stretch,v=n?0:g*u,w=n?g*u:0,b=1-(1-a.scale)*Math.abs(u);Math.abs(w)<.001&&(w=0),Math.abs(v)<.001&&(v=0),Math.abs(f)<.001&&(f=0),Math.abs(m)<.001&&(m=0),Math.abs(h)<.001&&(h=0),Math.abs(b)<.001&&(b=0);const y=`translate3d(${w}px,${v}px,${f}px) rotateX(${p(h)}deg) rotateY(${p(m)}deg) scale(${b})`;if(we(0,t).style.transform=y,t.style.zIndex=String(1-Math.abs(Math.round(u))),a.slideShadows){let e=n?t.querySelector(".swiper-slide-shadow-left"):t.querySelector(".swiper-slide-shadow-top"),s=n?t.querySelector(".swiper-slide-shadow-right"):t.querySelector(".swiper-slide-shadow-bottom");e||(e=ye("coverflow",t,n?"left":"top")),s||(s=ye("coverflow",t,n?"right":"bottom")),e&&(e.style.opacity=String(u>0?u:0)),s&&(s.style.opacity=String(-u>0?-u:0))}}},setTransition:t=>{e.slides.map(e=>
21828o(e)).forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").forEach(e=>{e.style.transitionDuration=`${t}ms`})})},perspective:()=>!0,overwriteParams:()=>({watchSlidesProgress:!0})})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.creativeEffect}t({creativeEffect:{limitProgress:1,shadowPerProgress:!1,progressMultiplier:1,perspective:!0,prev:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1},next:{translate:[0,0,0],rotate:[0,0,0],opacity:1,scale:1}}});const r=e=>"string"==typeof e?e:`${e}px`;ve({effect:"creative",swiper:e,on:s,setTranslate:()=>{const{slides:t,wrapperEl:s,slidesSizesGrid:a}=e,n=i(),{progressMultiplier:l}=n,o=e.params.centeredSlides,d=b(e);if(o){const t=a[0]/2-(e.params.slidesOffsetBefore??0);s.style.transform=`translateX(calc(50% - ${t}px))`}for(let s=0;s<t.length;s+=1){const i=t[s],a=i.progress??0,c=Math.min(Math.max(a,-n.limitProgress),n.limitProgress);let p=c;o||(p=Math.min(Math.max(i.originalProgress??0,-n.limitProgress),n.limitProgress));const u=i.swiperSlideOffset??0,m=[e.params.cssMode?-u-e.translate:-u,0,0],h=[0,0,0];let f=!1;e.isHorizontal()||(m[1]=m[0],m[0]=0);let g={translate:[0,0,0],rotate:[0,0,0],scale:1,opacity:1};c<0?(g=n.next,f=!0):c>0&&(g=n.prev,f=!0),m.forEach((e,t)=>{m[t]=`calc(${e}px + (${r(g.translate[t])} * ${Math.abs(c*l)}))`}),h.forEach((e,t)=>{h[t]=g.rotate[t]*Math.abs(c*l)}),i.style.zIndex=String(-Math.abs(Math.round(a))+t.length);const v=m.join(", "),w=`rotateX(${d(h[0])}deg) rotateY(${d(h[1])}deg) rotateZ(${d(h[2])}deg)`,b=p<0?`scale(${1+(1-g.scale)*p*l})`:`scale(${1-(1-g.scale)*p*l})`,y=p<0?1+(1-g.opacity)*p*l:1-(1-g.opacity)*p*l,E=`translate3d(${v}) ${w} ${b}`;if(f&&g.shadow||!f){let e=i.querySelector(".swiper-slide-shadow");if(!e&&g.shadow&&(e=ye("creative",i)),e){const t=n.shadowPerProgress?c*(1/n.limitProgress):c;e.style.opacity=String(Math.min(Math.max(Math.abs(t),0),1))}}const S=we(0,i);S.style.transform=E,S.style.opacity=String(y),g.origin&&(S.style.transformOrigin=g.origin)}},setTransition:t=>{const s=e.slides.map(e=>o(e));s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),be({swiper:e,duration:t,transformElements:s,allSlides:!0})},perspective:()=>i().perspective,overwriteParams:()=>({watchSlidesProgress:!0,virtualTranslate:!e.params.cssMode})})},({swiper:e,extendParams:t,on:s})=>{function i(){return e.params.cardsEffect}t({cardsEffect:{slideShadows:!0,rotate:!0,perSlideRotate:2,perSlideOffset:8}});ve({effect:"cards",swiper:e,on:s,setTranslate:()=>{const{slides:t,activeIndex:s,rtlTranslate:r}=e,a=i(),{startTranslate:n,isTouched:l}=e.touchEventsData,o=r?-e.translate:e.translate;for(let i=0;i<t.length;i+=1){const d=t[i],c=d.progress??0,p=Math.min(Math.max(c,-4),4);let u=d.swiperSlideOffset??0;e.params.centeredSlides&&!e.params.cssMode&&(e.wrapperEl.style.transform=`translateX(${e.minTranslate()}px)`),e.params.centeredSlides&&e.params.cssMode&&(u-=t[0].swiperSlideOffset??0);let m=e.params.cssMode?-u-e.translate:-u,h=0;const f=-100*Math.abs(p);let g=1,v=-a.perSlideRotate*p,w=a.perSlideOffset-.75*Math.abs(p);const b=e.virtual&&e.params.virtual?.enabled?e.virtual.from+i:i,y=(b===s||b===s-1)&&p>0&&p<1&&(l||e.params.cssMode)&&(o??0)<(n??0),E=(b===s||b===s+1)&&p<0&&p>-1&&(l||e.params.cssMode)&&(o??0)>(n??0);if(y||E){const t=(1-Math.abs((Math.abs(p)-.5)/.5))**.5;v+=-28*p*t,g+=-.5*t,w+=96*t,h=(a.rotate||e.isHorizontal()?-25:0)*t*Math.abs(p)+"%"}if(m=p<0?`calc(${m}px ${r?"-":"+"} (${w*Math.abs(p)}%))`:p>0?`calc(${m}px ${r?"-":"+"} (${-w*Math.abs(p)}%))`:`${m}px`,!e.isHorizontal()){const e=h;h=m,m=e}const S=p<0?""+(1+(1-g)*p):""+(1-(1-g)*p),x=`\n translate3d(${m}, ${h}, ${f}px)\n rotateZ(${a.rotate?r?-v:v:0}deg)\n scale(${S})\n `;if(a.slideShadows){let e=d.querySelector(".swiper-slide-shadow");e||(e=ye("cards",d)),e&&(e.style.opacity=String(Math.min(Math.max((Math.abs(p)-.5)/.5,0),1)))}d.style.zIndex=String(-Math.abs(Math.round(c))+t.length);we(0,d).style.transform=x}},setTransition:t=>{const s=e.slides.map(e=>o(e));
21828s.forEach(e=>{e.style.transitionDuration=`${t}ms`,e.querySelectorAll(".swiper-slide-shadow").forEach(e=>{e.style.transitionDuration=`${t}ms`})}),be({swiper:e,duration:t,transformElements:s})},perspective:()=>!0,overwriteParams:()=>({_loopSwapReset:!1,watchSlidesProgress:!0,loopAdditionalSlides:i().rotate?3:2,centeredSlides:!0,virtualTranslate:!e.params.cssMode})})}];return se.use(Ee),se}(); 21829//# sourceMappingURL=swiper-bundle.min.js.map 21830/*!*************************************************** 21831* mark.js v9.0.0 21832* https://markjs.io/ 21833* Copyright (c) 2014â2018, Julian Kühnel 21834* Released under the MIT license https://git.io/vwTVl 21835*****************************************************/ 21836 21837(function (global, factory) { 21838 typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : 21839 typeof define === 'function' && define.amd ? define(factory) : 21840 (global.Mark = factory()); 21841}(this, (function () { 'use strict'; 21842 21843 function _typeof(obj) { 21844 if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { 21845 _typeof = function (obj) { 21846 return typeof obj; 21847 }; 21848 } else { 21849 _typeof = function (obj) { 21850 return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; 21851 }; 21852 } 21853 21854 return _typeof(obj); 21855 } 21856 21857 function _classCallCheck(instance, Constructor) { 21858 if (!(instance instanceof Constructor)) { 21859 throw new TypeError("Cannot call a class as a function"); 21860 } 21861 } 21862 21863 function _defineProperties(target, props) { 21864 for (var i = 0; i < props.length; i++) { 21865 var descriptor = props[i]; 21866 descriptor.enumerable = descriptor.enumerable || false; 21867 descriptor.configurable = true; 21868 if ("value" in descriptor) descriptor.writable = true; 21869 Object.defineProperty(target, descriptor.key, descriptor); 21870 } 21871 } 21872 21873 function _createClass(Constructor, protoProps, staticProps) { 21874 if (protoProps) _defineProperties(Constructor.prototype, protoProps); 21875 if (staticProps) _defineProperties(Constructor, staticProps); 21876 return Constructor; 21877 } 21878 21879 function _extends() { 21880 _extends = Object.assign || function (target) { 21881 for (var i = 1; i < arguments.length; i++) { 21882 var source = arguments[i]; 21883 21884 for (var key in source) { 21885 if (Object.prototype.hasOwnProperty.call(source, key)) { 21886 target[key] = source[key]; 21887 } 21888 } 21889 } 21890 21891 return target; 21892 }; 21893 21894 return _extends.apply(this, arguments); 21895 } 21896 21897 var DOMIterator = 21898 /*#__PURE__*/ 21899 function () { 21900 function DOMIterator(ctx) { 21901 var iframes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true; 21902 var exclude = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : []; 21903 var iframesTimeout = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 5000; 21904 21905 _classCallCheck(this, DOMIterator); 21906 21907 this.ctx = ctx; 21908 this.iframes = iframes; 21909 this.exclude = exclude; 21910 this.iframesTimeout = iframesTimeout; 21911 } 21912 21913 _createClass(DOMIterator, [{ 21914 key: "getContexts", 21915 value: function getContexts() { 21916 var ctx, 21917 filteredCtx = []; 21918 21919 if (typeof this.ctx === 'undefined' || !this.ctx) { 21920 ctx = []; 21921 } else if (NodeList.prototype.isPrototypeOf(this.ctx)) { 21922 ctx = Array.prototype.slice.call(this.ctx); 21923 } else if (Array.isArray(this.ctx)) { 21924 ctx = this.ctx; 21925 } else if (typeof this.ctx === 'string') { 21926 ctx = Array.prototype.slice.call(document.querySelectorAll(this.ctx)); 21927 } else { 21928 ctx = [this.ctx]; 21929 } 21930 21931 ctx.forEach(function (ctx) { 21932 var isDescendant = filteredCtx.filter(function (contexts) { 21933 return contexts.contains(ctx); 21934 }).length > 0; 21935 21936 if (filteredCtx.indexOf(ctx) === -1 && !isDescendant) { 21937 filteredCtx.push(ctx); 21938 } 21939 }); 21940 return filteredCtx; 21941 } 21942 }, { 21943 key: "getIframeContents", 21944 value: function getIframeContents(ifr, successFn) { 21945 var errorFn = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : function () {}; 21946 var doc; 21947 21948 try { 21949 var ifrWin = ifr.contentWindow; 21950 doc = ifrWin.document; 21951 21952 if (!ifrWin || !doc) { 21953 throw new Error('iframe inaccessible'); 21954 } 21955 } catch (e) { 21956 errorFn(); 21957 } 21958 21959 if (doc) { 21960 successFn(doc); 21961 } 21962 } 21963 }, {
vendor: 7,190 bytes, lines 21964-22226
21964 key: "isIframeBlank", 21965 value: function isIframeBlank(ifr) { 21966 var bl = 'about:blank', 21967 src = ifr.getAttribute('src').trim(), 21968 href = ifr.contentWindow.location.href; 21969 return href === bl && src !== bl && src; 21970 } 21971 }, { 21972 key: "observeIframeLoad", 21973 value: function observeIframeLoad(ifr, successFn, errorFn) { 21974 var _this = this; 21975 21976 var called = false, 21977 tout = null; 21978 21979 var listener = function listener() { 21980 if (called) { 21981 return; 21982 } 21983 21984 called = true; 21985 clearTimeout(tout); 21986 21987 try { 21988 if (!_this.isIframeBlank(ifr)) { 21989 ifr.removeEventListener('load', listener); 21990 21991 _this.getIframeContents(ifr, successFn, errorFn); 21992 } 21993 } catch (e) { 21994 errorFn(); 21995 } 21996 }; 21997 21998 ifr.addEventListener('load', listener); 21999 tout = setTimeout(listener, this.iframesTimeout); 22000 } 22001 }, { 22002 key: "onIframeReady", 22003 value: function onIframeReady(ifr, successFn, errorFn) { 22004 try { 22005 if (ifr.contentWindow.document.readyState === 'complete') { 22006 if (this.isIframeBlank(ifr)) { 22007 this.observeIframeLoad(ifr, successFn, errorFn); 22008 } else { 22009 this.getIframeContents(ifr, successFn, errorFn); 22010 } 22011 } else { 22012 this.observeIframeLoad(ifr, successFn, errorFn); 22013 } 22014 } catch (e) { 22015 errorFn(); 22016 } 22017 } 22018 }, { 22019 key: "waitForIframes", 22020 value: function waitForIframes(ctx, done) { 22021 var _this2 = this; 22022 22023 var eachCalled = 0; 22024 this.forEachIframe(ctx, function () { 22025 return true; 22026 }, function (ifr) { 22027 eachCalled++; 22028 22029 _this2.waitForIframes(ifr.querySelector('html'), function () { 22030 if (! --eachCalled) { 22031 done(); 22032 } 22033 }); 22034 }, function (handled) { 22035 if (!handled) { 22036 done(); 22037 } 22038 }); 22039 } 22040 }, { 22041 key: "forEachIframe", 22042 value: function forEachIframe(ctx, filter, each) { 22043 var _this3 = this; 22044 22045 var end = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {}; 22046 var ifr = ctx.querySelectorAll('iframe'), 22047 open = ifr.length, 22048 handled = 0; 22049 ifr = Array.prototype.slice.call(ifr); 22050 22051 var checkEnd = function checkEnd() { 22052 if (--open <= 0) { 22053 end(handled); 22054 } 22055 }; 22056 22057 if (!open) { 22058 checkEnd(); 22059 } 22060 22061 ifr.forEach(function (ifr) { 22062 if (DOMIterator.matches(ifr, _this3.exclude)) { 22063 checkEnd(); 22064 } else { 22065 _this3.onIframeReady(ifr, function (con) { 22066 if (filter(ifr)) { 22067 handled++; 22068 each(con); 22069 } 22070 22071 checkEnd(); 22072 }, checkEnd); 22073 } 22074 }); 22075 } 22076 }, { 22077 key: "createIterator", 22078 value: function createIterator(ctx, whatToShow, filter) { 22079 return document.createNodeIterator(ctx, whatToShow, filter, false); 22080 } 22081 }, { 22082 key: "createInstanceOnIframe", 22083 value: function createInstanceOnIframe(contents) { 22084 return new DOMIterator(contents.querySelector('html'), this.iframes); 22085 } 22086 }, { 22087 key: "compareNodeIframe", 22088 value: function compareNodeIframe(node, prevNode, ifr) { 22089 var compCurr = node.compareDocumentPosition(ifr), 22090 prev = Node.DOCUMENT_POSITION_PRECEDING; 22091 22092 if (compCurr & prev) { 22093 if (prevNode !== null) { 22094 var compPrev = prevNode.compareDocumentPosition(ifr), 22095 after = Node.DOCUMENT_POSITION_FOLLOWING; 22096 22097 if (compPrev & after) { 22098 return true; 22099 } 22100 } else { 22101 return true; 22102 } 22103 } 22104 22105 return false; 22106 } 22107 }, { 22108 key: "getIteratorNode", 22109 value: function getIteratorNode(itr) { 22110 var prevNode = itr.previousNode(); 22111 var node; 22112 22113 if (prevNode === null) { 22114 node = itr.nextNode(); 22115 } else { 22116 node = itr.nextNode() && itr.nextNode(); 22117 } 22118 22119 return { 22120 prevNode: prevNode, 22121 node: node 22122 }; 22123 } 22124 }, { 22125 key: "checkIframeFilter", 22126 value: function checkIframeFilter(node, prevNode, currIfr, ifr) { 22127 var key = false, 22128 handled = false; 22129 ifr.forEach(function (ifrDict, i) { 22130 if (ifrDict.val === currIfr) { 22131 key = i; 22132 handled = ifrDict.handled; 22133 } 22134 }); 22135 22136 if (this.compareNodeIframe(node, prevNode, currIfr)) { 22137 if (key === false && !handled) { 22138 ifr.push({ 22139 val: currIfr, 22140 handled: true 22141 }); 22142 } else if (key !== false && !handled) { 22143 ifr[key].handled = true; 22144 } 22145 22146 return true; 22147 } 22148 22149 if (key === false) { 22150 ifr.push({ 22151 val: currIfr, 22152 handled: false 22153 }); 22154 } 22155 22156 return false; 22157 } 22158 }, { 22159 key: "handleOpenIframes", 22160 value: function handleOpenIframes(ifr, whatToShow, eCb, fCb) { 22161 var _this4 = this; 22162 22163 ifr.forEach(function (ifrDict) { 22164 if (!ifrDict.handled) { 22165 _this4.getIframeContents(ifrDict.val, function (con) { 22166 _this4.createInstanceOnIframe(con).forEachNode(whatToShow, eCb, fCb); 22167 }); 22168 } 22169 }); 22170 } 22171 }, { 22172 key: "iterateThroughNodes", 22173 value: function iterateThroughNodes(whatToShow, ctx, eachCb, filterCb, doneCb) { 22174 var _this5 = this; 22175 22176 var itr = this.createIterator(ctx, whatToShow, filterCb); 22177 22178 var ifr = [], 22179 elements = [], 22180 node, 22181 prevNode, 22182 retrieveNodes = function retrieveNodes() { 22183 var _this5$getIteratorNod = _this5.getIteratorNode(itr); 22184 22185 prevNode = _this5$getIteratorNod.prevNode; 22186 node = _this5$getIteratorNod.node; 22187 return node; 22188 }; 22189 22190 while (retrieveNodes()) { 22191 if (this.iframes) { 22192 this.forEachIframe(ctx, function (currIfr) { 22193 return _this5.checkIframeFilter(node, prevNode, currIfr, ifr); 22194 }, function (con) { 22195 _this5.createInstanceOnIframe(con).forEachNode(whatToShow, function (ifrNode) { 22196 return elements.push(ifrNode); 22197 }, filterCb); 22198 }); 22199 } 22200 22201 elements.push(node); 22202 } 22203 22204 elements.forEach(function (node) { 22205 eachCb(node); 22206 }); 22207 22208 if (this.iframes) { 22209 this.handleOpenIframes(ifr, whatToShow, eachCb, filterCb); 22210 } 22211 22212 doneCb(); 22213 } 22214 }, { 22215 key: "forEachNode", 22216 value: function forEachNode(whatToShow, each, filter) { 22217 var _this6 = this; 22218 22219 var done = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : function () {}; 22220 var contexts = this.getContexts(); 22221 var open = contexts.length; 22222 22223 if (!open) { 22224 done(); 22225 } 22226
22227 contexts.forEach(function (ctx) { 22228 var ready = function ready() { 22229 _this6.iterateThroughNodes(whatToShow, ctx, each, filter, function () { 22230 if (--open <= 0) { 22231 done(); 22232 } 22233 }); 22234 }; 22235 22236 if (_this6.iframes) { 22237 _this6.waitForIframes(ctx, ready); 22238 } else { 22239 ready(); 22240 } 22241 }); 22242 } 22243 }], [{ 22244 key: "matches", 22245 value: function matches(element, selector) { 22246 var selectors = typeof selector === 'string' ? [selector] : selector, 22247 fn = element.matches || element.matchesSelector || element.msMatchesSelector || element.mozMatchesSelector || element.oMatchesSelector || element.webkitMatchesSelector; 22248 22249 if (fn) { 22250 var match = false; 22251 selectors.every(function (sel) { 22252 if (fn.call(element, sel)) { 22253 match = true; 22254 return false; 22255 } 22256 22257 return true; 22258 }); 22259 return match; 22260 } else { 22261 return false; 22262 } 22263 } 22264 }]); 22265 22266 return DOMIterator; 22267 }(); 22268 22269 var RegExpCreator = 22270 /*#__PURE__*/ 22271 function () { 22272 function RegExpCreator(options) { 22273 _classCallCheck(this, RegExpCreator); 22274 22275 this.opt = _extends({}, { 22276 'diacritics': true, 22277 'synonyms': {}, 22278 'accuracy': 'partially', 22279 'caseSensitive': false, 22280 'ignoreJoiners': false, 22281 'ignorePunctuation': [], 22282 'wildcards': 'disabled' 22283 }, options); 22284 } 22285 22286 _createClass(RegExpCreator, [{ 22287 key: "create", 22288 value: function create(str) { 22289 if (this.opt.wildcards !== 'disabled') { 22290 str = this.setupWildcardsRegExp(str); 22291 } 22292 22293 str = this.escapeStr(str); 22294 22295 if (Object.keys(this.opt.synonyms).length) { 22296 str = this.createSynonymsRegExp(str); 22297 } 22298 22299 if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { 22300 str = this.setupIgnoreJoinersRegExp(str); 22301 } 22302 22303 if (this.opt.diacritics) { 22304 str = this.createDiacriticsRegExp(str); 22305 } 22306 22307 str = this.createMergedBlanksRegExp(str); 22308 22309 if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { 22310 str = this.createJoinersRegExp(str); 22311 } 22312 22313 if (this.opt.wildcards !== 'disabled') { 22314 str = this.createWildcardsRegExp(str); 22315 } 22316 22317 str = this.createAccuracyRegExp(str); 22318 return new RegExp(str, "gm".concat(this.opt.caseSensitive ? '' : 'i')); 22319 } 22320 }, { 22321 key: "sortByLength", 22322 value: function sortByLength(arry) { 22323 return arry.sort(function (a, b) { 22324 return a.length === b.length ? a > b ? 1 : -1 : b.length - a.length; 22325 }); 22326 } 22327 }, { 22328 key: "escapeStr", 22329 value: function escapeStr(str) { 22330 return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, '\\$&'); 22331 } 22332 }, { 22333 key: "createSynonymsRegExp", 22334 value: function createSynonymsRegExp(str) { 22335 var _this = this; 22336 22337 var syn = this.opt.synonyms, 22338 sens = this.opt.caseSensitive ? '' : 'i', 22339 joinerPlaceholder = this.opt.ignoreJoiners || this.opt.ignorePunctuation.length ? "\0" : ''; 22340 22341 for (var index in syn) { 22342 if (syn.hasOwnProperty(index)) { 22343 var keys = Array.isArray(syn[index]) ? syn[index] : [syn[index]]; 22344 keys.unshift(index); 22345 keys = this.sortByLength(keys).map(function (key) { 22346 if (_this.opt.wildcards !== 'disabled') { 22347 key = _this.setupWildcardsRegExp(key); 22348 } 22349 22350 key = _this.escapeStr(key); 22351 return key; 22352 }).filter(function (k) { 22353 return k !== ''; 22354 }); 22355 22356 if (keys.length > 1) { 22357 str = str.replace(new RegExp("(".concat(keys.map(function (k) { 22358 return _this.escapeStr(k); 22359 }).join('|'), ")"), "gm".concat(sens)), joinerPlaceholder + "(".concat(keys.map(function (k) { 22360 return _this.processSynonyms(k); 22361 }).join('|'), ")") + joinerPlaceholder); 22362 } 22363 } 22364 } 22365 22366 return str; 22367 } 22368 }, {
vendor: 2,731 bytes, lines 22369-22426
22369 key: "processSynonyms", 22370 value: function processSynonyms(str) { 22371 if (this.opt.ignoreJoiners || this.opt.ignorePunctuation.length) { 22372 str = this.setupIgnoreJoinersRegExp(str); 22373 } 22374 22375 return str; 22376 } 22377 }, { 22378 key: "setupWildcardsRegExp", 22379 value: function setupWildcardsRegExp(str) { 22380 str = str.replace(/(?:\\)*\?/g, function (val) { 22381 return val.charAt(0) === '\\' ? '?' : "\x01"; 22382 }); 22383 return str.replace(/(?:\\)*\*/g, function (val) { 22384 return val.charAt(0) === '\\' ? '*' : "\x02"; 22385 }); 22386 } 22387 }, { 22388 key: "createWildcardsRegExp", 22389 value: function createWildcardsRegExp(str) { 22390 var spaces = this.opt.wildcards === 'withSpaces'; 22391 return str.replace(/\u0001/g, spaces ? '[\\S\\s]?' : '\\S?').replace(/\u0002/g, spaces ? '[\\S\\s]*?' : '\\S*'); 22392 } 22393 }, { 22394 key: "setupIgnoreJoinersRegExp", 22395 value: function setupIgnoreJoinersRegExp(str) { 22396 return str.replace(/[^(|)\\]/g, function (val, indx, original) { 22397 var nextChar = original.charAt(indx + 1); 22398 22399 if (/[(|)\\]/.test(nextChar) || nextChar === '') { 22400 return val; 22401 } else { 22402 return val + "\0"; 22403 } 22404 }); 22405 } 22406 }, { 22407 key: "createJoinersRegExp", 22408 value: function createJoinersRegExp(str) { 22409 var joiner = []; 22410 var ignorePunctuation = this.opt.ignorePunctuation; 22411 22412 if (Array.isArray(ignorePunctuation) && ignorePunctuation.length) { 22413 joiner.push(this.escapeStr(ignorePunctuation.join(''))); 22414 } 22415 22416 if (this.opt.ignoreJoiners) { 22417 joiner.push("\\u00ad\\u200b\\u200c\\u200d"); 22418 } 22419 22420 return joiner.length ? str.split(/\u0000+/).join("[".concat(joiner.join(''), "]*")) : str; 22421 } 22422 }, { 22423 key: "createDiacriticsRegExp", 22424 value: function createDiacriticsRegExp(str) { 22425 var sens = this.opt.caseSensitive ? '' : 'i', 22426 dct = this.opt.caseSensitive ? ['aà áảãạÄằắẳẵặâầấẩẫáºÃ¤Ã¥ÄÄ ', 'AÃÃẢÃẠÄẰẮẲẴẶÃẦẤẨẪẬÃà ÄÄ', 'cçÄÄ', 'CÃÄÄ', 'dÄÄ', 'DÄÄ', 'eèéẻẽẹêá»áº¿á»á» á»Ã«ÄÄÄ', 'EÃÃẺẼẸÃá»áº¾á»á»á»ÃÄÄÄ', 'iìÃá»Ä©á»Ã®Ã¯Ä«', 'IÃÃá»Ä¨á»ÃÃĪ', 'lÅ', 'LÅ', 'nñÅÅ', 'NÃÅÅ', 'oòóá»Ãµá»Ã´á»á»á»á»á»Æ¡á»á»¡á»á»á»£Ã¶Ã¸Å', 'OÃÃá»Ãá»Ãá»á»á»á»á»Æ á»á» á»á»á»¢ÃÃÅ', 'rÅ', 'RÅ', 'sÅ¡ÅÈÅ', 'SÅ ÅÈÅ', 'tÅ¥ÈÅ£', 'TŤÈÅ¢', 'uùúủũụưừứá»á»¯á»±Ã»Ã¼Å¯Å«', 'UÃÃỦŨỤƯỪỨỬỮỰÃÃŮŪ', 'yýỳỷỹỵÿ', 'YÃỲỶỸỴŸ', 'zžżź', 'ZŽŻŹ'] : ['aà áảãạÄằắẳẵặâầấẩẫáºÃ¤Ã¥ÄÄ AÃÃẢÃá
22426º ÄẰẮẲẴẶÃẦẤẨẪẬÃà ÄÄ', 'cçÄÄCÃÄÄ', 'dÄÄDÄÄ', 'eèéẻẽẹêá»áº¿á»á» á»Ã«ÄÄÄEÃÃẺẼẸÃá»áº¾á»á»á»ÃÄÄÄ', 'iìÃá»Ä©á»Ã®Ã¯Ä«IÃÃá»Ä¨á»ÃÃĪ', 'lÅLÅ', 'nñÅÅNÃÅÅ', 'oòóá»Ãµá»Ã´á»á»á»á»á»Æ¡á»á»¡á»á»á»£Ã¶Ã¸ÅOÃÃá»Ãá»Ãá»á»á»á»á»Æ á»á» á»á»á»¢ÃÃÅ', 'rÅRÅ', 'sÅ¡ÅÈÅSÅ ÅÈÅ', 'tÅ¥ÈÅ£TŤÈÅ¢', 'uùúủũụưừứá»á»¯á»±Ã»Ã¼Å¯Å«UÃÃỦŨỤƯỪỨỬỮỰÃÃŮŪ', 'yýỳỷỹỵÿYÃỲỶỸỴŸ', 'zžżźZŽŻŹ']; 22427 var handled = []; 22428 str.split('').forEach(function (ch) { 22429 dct.every(function (dct) { 22430 if (dct.indexOf(ch) !== -1) { 22431 if (handled.indexOf(dct) > -1) { 22432 return false; 22433 } 22434 22435 str = str.replace(new RegExp("[".concat(dct, "]"), "gm".concat(sens)), "[".concat(dct, "]")); 22436 handled.push(dct); 22437 } 22438 22439 return true; 22440 }); 22441 }); 22442 return str; 22443 } 22444 }, { 22445 key: "createMergedBlanksRegExp", 22446 value: function createMergedBlanksRegExp(str) { 22447 return str.replace(/[\s]+/gmi, '[\\s]+'); 22448 } 22449 }, { 22450 key: "createAccuracyRegExp", 22451 value: function createAccuracyRegExp(str) { 22452 var _this2 = this; 22453 22454 var chars = '!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~¡¿'; 22455 var acc = this.opt.accuracy, 22456 val = typeof acc === 'string' ? acc : acc.value, 22457 ls = typeof acc === 'string' ? [] : acc.limiters, 22458 lsJoin = ''; 22459 ls.forEach(function (limiter) { 22460 lsJoin += "|".concat(_this2.escapeStr(limiter)); 22461 }); 22462 22463 switch (val) { 22464 case 'partially': 22465 default: 22466 return "()(".concat(str, ")"); 22467 22468 case 'complementary': 22469 lsJoin = '\\s' + (lsJoin ? lsJoin : this.escapeStr(chars)); 22470 return "()([^".concat(lsJoin, "]*").concat(str, "[^").concat(lsJoin, "]*)"); 22471 22472 case 'exactly': 22473 return "(^|\\s".concat(lsJoin, ")(").concat(str, ")(?=$|\\s").concat(lsJoin, ")"); 22474 } 22475 } 22476 }]); 22477 22478 return RegExpCreator; 22479 }(); 22480 22481 var Mark = 22482 /*#__PURE__*/ 22483 function () { 22484 function Mark(ctx) { 22485 _classCallCheck(this, Mark); 22486 22487 this.ctx = ctx; 22488 this.ie = false;
22489 var ua = window.navigator.userAgent; 22490 22491 if (ua.indexOf('MSIE') > -1 || ua.indexOf('Trident') > -1) { 22492 this.ie = true; 22493 } 22494 } 22495 22496 _createClass(Mark, [{ 22497 key: "log", 22498 value: function log(msg) { 22499 var level = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'debug'; 22500 var log = this.opt.log; 22501 22502 if (!this.opt.debug) { 22503 return; 22504 } 22505 22506 if (_typeof(log) === 'object' && typeof log[level] === 'function') { 22507 log[level]("mark.js: ".concat(msg)); 22508 } 22509 } 22510 }, { 22511 key: "getSeparatedKeywords", 22512 value: function getSeparatedKeywords(sv) { 22513 var _this = this; 22514 22515 var stack = []; 22516 sv.forEach(function (kw) { 22517 if (!_this.opt.separateWordSearch) { 22518 if (kw.trim() && stack.indexOf(kw) === -1) { 22519 stack.push(kw); 22520 } 22521 } else { 22522 kw.split(' ').forEach(function (kwSplitted) { 22523 if (kwSplitted.trim() && stack.indexOf(kwSplitted) === -1) { 22524 stack.push(kwSplitted); 22525 } 22526 }); 22527 } 22528 }); 22529 return { 22530 'keywords': stack.sort(function (a, b) { 22531 return b.length - a.length; 22532 }), 22533 'length': stack.length 22534 }; 22535 } 22536 }, { 22537 key: "isNumeric", 22538 value: function isNumeric(value) { 22539 return Number(parseFloat(value)) == value; 22540 } 22541 }, { 22542 key: "checkRanges", 22543 value: function checkRanges(array) { 22544 var _this2 = this; 22545 22546 if (!Array.isArray(array) || Object.prototype.toString.call(array[0]) !== '[object Object]') { 22547 this.log('markRanges() will only accept an array of objects'); 22548 this.opt.noMatch(array); 22549 return []; 22550 } 22551 22552 var stack = []; 22553 var last = 0; 22554 array.sort(function (a, b) { 22555 return a.start - b.start; 22556 }
vendor: 4,301 bytes, lines 22556-22689
22556).forEach(function (item) { 22557 var _this2$callNoMatchOnI = _this2.callNoMatchOnInvalidRanges(item, last), 22558 start = _this2$callNoMatchOnI.start, 22559 end = _this2$callNoMatchOnI.end, 22560 valid = _this2$callNoMatchOnI.valid; 22561 22562 if (valid) { 22563 item.start = start; 22564 item.length = end - start; 22565 stack.push(item); 22566 last = end; 22567 } 22568 }); 22569 return stack; 22570 } 22571 }, { 22572 key: "callNoMatchOnInvalidRanges", 22573 value: function callNoMatchOnInvalidRanges(range, last) { 22574 var start, 22575 end, 22576 valid = false; 22577 22578 if (range && typeof range.start !== 'undefined') { 22579 start = parseInt(range.start, 10); 22580 end = start + parseInt(range.length, 10); 22581 22582 if (this.isNumeric(range.start) && this.isNumeric(range.length) && end - last > 0 && end - start > 0) { 22583 valid = true; 22584 } else { 22585 this.log('Ignoring invalid or overlapping range: ' + "".concat(JSON.stringify(range))); 22586 this.opt.noMatch(range); 22587 } 22588 } else { 22589 this.log("Ignoring invalid range: ".concat(JSON.stringify(range))); 22590 this.opt.noMatch(range); 22591 } 22592 22593 return { 22594 start: start, 22595 end: end, 22596 valid: valid 22597 }; 22598 } 22599 }, { 22600 key: "checkWhitespaceRanges", 22601 value: function checkWhitespaceRanges(range, originalLength, string) { 22602 var end, 22603 valid = true, 22604 max = string.length, 22605 offset = originalLength - max, 22606 start = parseInt(range.start, 10) - offset; 22607 start = start > max ? max : start; 22608 end = start + parseInt(range.length, 10); 22609 22610 if (end > max) { 22611 end = max; 22612 this.log("End range automatically set to the max value of ".concat(max)); 22613 } 22614 22615 if (start < 0 || end - start < 0 || start > max || end > max) { 22616 valid = false; 22617 this.log("Invalid range: ".concat(JSON.stringify(range))); 22618 this.opt.noMatch(range); 22619 } else if (string.substring(start, end).replace(/\s+/g, '') === '') { 22620 valid = false; 22621 this.log('Skipping whitespace only range: ' + JSON.stringify(range)); 22622 this.opt.noMatch(range); 22623 } 22624 22625 return { 22626 start: start, 22627 end: end, 22628 valid: valid 22629 }; 22630 } 22631 }, { 22632 key: "getTextNodes", 22633 value: function getTextNodes(cb) { 22634 var _this3 = this; 22635 22636 var val = '', 22637 nodes = []; 22638 this.iterator.forEachNode(NodeFilter.SHOW_TEXT, function (node) { 22639 nodes.push({ 22640 start: val.length, 22641 end: (val += node.textContent).length, 22642 node: node 22643 }); 22644 }, function (node) { 22645 if (_this3.matchesExclude(node.parentNode)) { 22646 return NodeFilter.FILTER_REJECT; 22647 } else { 22648 return NodeFilter.FILTER_ACCEPT; 22649 } 22650 }, function () { 22651 cb({ 22652 value: val, 22653 nodes: nodes 22654 }); 22655 }); 22656 } 22657 }, { 22658 key: "matchesExclude", 22659 value: function matchesExclude(el) { 22660 return DOMIterator.matches(el, this.opt.exclude.concat(['script', 'style', 'title', 'head', 'html'])); 22661 } 22662 }, { 22663 key: "wrapRangeInTextNode", 22664 value: function wrapRangeInTextNode(node, start, end) { 22665 var hEl = !this.opt.element ? 'mark' : this.opt.element, 22666 startNode = node.splitText(start), 22667 ret = startNode.splitText(end - start); 22668 var repl = document.createElement(hEl); 22669 repl.setAttribute('data-markjs', 'true'); 22670 22671 if (this.opt.className) { 22672 repl.setAttribute('class', this.opt.className); 22673 } 22674 22675 repl.textContent = startNode.textContent; 22676 startNode.parentNode.replaceChild(repl, startNode); 22677 return ret; 22678 } 22679 }, { 22680 key: "wrapRangeInMappedTextNode", 22681 value: function wrapRangeInMappedTextNode(dict, start, end, filterCb, eachCb) { 22682 var _this4 = this; 22683 22684 dict.nodes.every(function (n, i) { 22685 var sibl = dict.nodes[i + 1]; 22686 22687 if (typeof sibl === 'undefined' || sibl.start > start) { 22688 if (!filterCb(n.node)) { 22689 return false;
22690 } 22691 22692 var s = start - n.start, 22693 e = (end > n.end ? n.end : end) - n.start, 22694 startStr = dict.value.substr(0, n.start), 22695 endStr = dict.value.substr(e + n.start); 22696 n.node = _this4.wrapRangeInTextNode(n.node, s, e); 22697 dict.value = startStr + endStr; 22698 dict.nodes.forEach(function (k, j) { 22699 if (j >= i) { 22700 if (dict.nodes[j].start > 0 && j !== i) { 22701 dict.nodes[j].start -= e; 22702 } 22703 22704 dict.nodes[j].end -= e; 22705 } 22706 }); 22707 end -= e; 22708 eachCb(n.node.previousSibling, n.start); 22709 22710 if (end > n.end) { 22711 start = n.end; 22712 } else { 22713 return false; 22714 } 22715 } 22716 22717 return true; 22718 }); 22719 } 22720 }, { 22721 key: "wrapGroups", 22722 value: function wrapGroups(node, pos, len, eachCb) { 22723 node = this.wrapRangeInTextNode(node, pos, pos + len); 22724 eachCb(node.previousSibling); 22725 return node; 22726 } 22727 }, { 22728 key: "separateGroups", 22729 value: function separateGroups(node, match, matchIdx, filterCb, eachCb) { 22730 var matchLen = match.length; 22731 22732 for (var i = 1; i < matchLen; i++) { 22733 var pos = node.textContent.indexOf(match[i]); 22734 22735 if (match[i] && pos > -1 && filterCb(match[i], node)) { 22736 node = this.wrapGroups(node, pos, match[i].length, eachCb); 22737 } 22738 } 22739 22740 return node; 22741 } 22742 }, { 22743 key: "wrapMatches", 22744 value: function wrapMatches(regex, ignoreGroups, filterCb, eachCb, endCb) { 22745 var _this5 = this; 22746 22747 var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; 22748 this.getTextNodes(function (dict) { 22749 dict.nodes.forEach(function (node) { 22750 node = node.node; 22751 var match; 22752 22753 while ((match = regex.exec(node.textContent)) !== null && match[matchIdx] !== '') { 22754 if (_this5.opt.separateGroups) { 22755 node = _this5.separateGroups(node, match, matchIdx, filterCb, eachCb); 22756 } else { 22757 if (!filterCb(match[matchIdx], node)) { 22758 continue; 22759 } 22760 22761 var pos = match.index; 22762 22763 if (matchIdx !== 0) { 22764 for (var i = 1; i < matchIdx; i++) { 22765 pos += match[i].length; 22766 } 22767 } 22768 22769 node = _this5.wrapGroups(node, pos, match[matchIdx].length, eachCb); 22770 } 22771 22772 regex.lastIndex = 0; 22773 } 22774 }); 22775 endCb(); 22776 }); 22777 } 22778 }, { 22779 key: "wrapMatchesAcrossElements", 22780 value: function wrapMatchesAcrossElements(regex, ignoreGroups, filterCb, eachCb, endCb) { 22781 var _this6 = this; 22782 22783 var matchIdx = ignoreGroups === 0 ? 0 : ignoreGroups + 1; 22784 this.getTextNodes(function (dict) { 22785 var match; 22786 22787 while ((match = regex.exec(dict.value)) !== null && match[matchIdx] !== '') { 22788 var start = match.index; 22789 22790 if (matchIdx !== 0) { 22791 for (var i = 1; i < matchIdx; i++) { 22792 start += match[i].length; 22793 } 22794 } 22795 22796 var end = start + match[matchIdx].length; 22797 22798 _this6.wrapRangeInMappedTextNode(dict, start, end, function (node) { 22799 return filterCb(match[matchIdx], node); 22800 }, function (node, lastIndex) { 22801 regex.lastIndex = lastIndex; 22802 eachCb(node); 22803 }); 22804 } 22805 22806 endCb(); 22807 }); 22808 } 22809 }, { 22810 key: "wrapRangeFromIndex", 22811 value: function wrapRangeFromIndex(ranges, filterCb, eachCb, endCb) { 22812 var _this7 = this; 22813 22814 this.getTextNodes(function (dict) { 22815 var originalLength = dict.value.length; 22816 ranges.forEach(function (range, counter) { 22817 var _this7$checkWhitespac = _this7.checkWhitespaceRanges(range, originalLength, dict.value), 22818 start = _this7$checkWhitespac.start, 22819 end = _this7$checkWhitespac.end, 22820 valid = _this7$checkWhitespac.valid; 22821 22822 if (valid) { 22823 _this7.wrapRangeInMappedTextNode(dict, start, end, function (node) { 22824 return filterCb(node, range, dict.value.substring(start, end), counter); 22825 }, function (node) { 22826 eachCb(node, range); 22827 }); 22828 } 22829 }); 22830 endCb(); 22831 }); 22832 } 22833 }, {
vendor: 4,784 bytes, lines 22834-22998
22834 key: "unwrapMatches", 22835 value: function unwrapMatches(node) { 22836 var parent = node.parentNode; 22837 var docFrag = document.createDocumentFragment(); 22838 22839 while (node.firstChild) { 22840 docFrag.appendChild(node.removeChild(node.firstChild)); 22841 } 22842 22843 parent.replaceChild(docFrag, node); 22844 22845 if (!this.ie) { 22846 parent.normalize(); 22847 } else { 22848 this.normalizeTextNode(parent); 22849 } 22850 } 22851 }, { 22852 key: "normalizeTextNode", 22853 value: function normalizeTextNode(node) { 22854 if (!node) { 22855 return; 22856 } 22857 22858 if (node.nodeType === 3) { 22859 while (node.nextSibling && node.nextSibling.nodeType === 3) { 22860 node.nodeValue += node.nextSibling.nodeValue; 22861 node.parentNode.removeChild(node.nextSibling); 22862 } 22863 } else { 22864 this.normalizeTextNode(node.firstChild); 22865 } 22866 22867 this.normalizeTextNode(node.nextSibling); 22868 } 22869 }, { 22870 key: "markRegExp", 22871 value: function markRegExp(regexp, opt) { 22872 var _this8 = this; 22873 22874 this.opt = opt; 22875 this.log("Searching with expression \"".concat(regexp, "\"")); 22876 var totalMatches = 0, 22877 fn = 'wrapMatches'; 22878 22879 var eachCb = function eachCb(element) { 22880 totalMatches++; 22881 22882 _this8.opt.each(element); 22883 }; 22884 22885 if (this.opt.acrossElements) { 22886 fn = 'wrapMatchesAcrossElements'; 22887 } 22888 22889 this[fn](regexp, this.opt.ignoreGroups, function (match, node) { 22890 return _this8.opt.filter(node, match, totalMatches); 22891 }, eachCb, function () { 22892 if (totalMatches === 0) { 22893 _this8.opt.noMatch(regexp); 22894 } 22895 22896 _this8.opt.done(totalMatches); 22897 }); 22898 } 22899 }, { 22900 key: "mark", 22901 value: function mark(sv, opt) { 22902 var _this9 = this; 22903 22904 this.opt = opt; 22905 var totalMatches = 0, 22906 fn = 'wrapMatches'; 22907 22908 var _this$getSeparatedKey = this.getSeparatedKeywords(typeof sv === 'string' ? [sv] : sv), 22909 kwArr = _this$getSeparatedKey.keywords, 22910 kwArrLen = _this$getSeparatedKey.length, 22911 handler = function handler(kw) { 22912 var regex = new RegExpCreator(_this9.opt).create(kw); 22913 var matches = 0; 22914 22915 _this9.log("Searching with expression \"".concat(regex, "\"")); 22916 22917 _this9[fn](regex, 1, function (term, node) { 22918 return _this9.opt.filter(node, kw, totalMatches, matches); 22919 }, function (element) { 22920 matches++; 22921 totalMatches++; 22922 22923 _this9.opt.each(element); 22924 }, function () { 22925 if (matches === 0) { 22926 _this9.opt.noMatch(kw); 22927 } 22928 22929 if (kwArr[kwArrLen - 1] === kw) { 22930 _this9.opt.done(totalMatches); 22931 } else { 22932 handler(kwArr[kwArr.indexOf(kw) + 1]); 22933 } 22934 }); 22935 }; 22936 22937 if (this.opt.acrossElements) { 22938 fn = 'wrapMatchesAcrossElements'; 22939 } 22940 22941 if (kwArrLen === 0) { 22942 this.opt.done(totalMatches); 22943 } else { 22944 handler(kwArr[0]); 22945 } 22946 } 22947 }, { 22948 key: "markRanges", 22949 value: function markRanges(rawRanges, opt) { 22950 var _this10 = this; 22951 22952 this.opt = opt; 22953 var totalMatches = 0, 22954 ranges = this.checkRanges(rawRanges); 22955 22956 if (ranges && ranges.length) { 22957 this.log('Starting to mark with the following ranges: ' + JSON.stringify(ranges)); 22958 this.wrapRangeFromIndex(ranges, function (node, range, match, counter) { 22959 return _this10.opt.filter(node, range, match, counter); 22960 }, function (element, range) { 22961 totalMatches++; 22962 22963 _this10.opt.each(element, range); 22964 }, function () { 22965 _this10.opt.done(totalMatches); 22966 }); 22967 } else { 22968 this.opt.done(totalMatches); 22969 } 22970 } 22971 }, { 22972 key: "unmark", 22973 value: function unmark(opt) { 22974 var _this11 = this; 22975 22976 this.opt = opt; 22977 var sel = this.opt.element ? this.opt.element : '*'; 22978 sel += '[data-markjs]'; 22979 22980 if (this.opt.className) { 22981 sel += ".".concat(this.opt.className); 22982 } 22983 22984 this.log("Removal selector \"".concat(sel, "\"")); 22985 this.iterator.forEachNode(NodeFilter.SHOW_ELEMENT, function (node) { 22986 _this11.unwrapMatches(node); 22987 }, function (node) { 22988 var matchesSel = DOMIterator.matches(node, sel), 22989 matchesExclude = _this11.matchesExclude(node); 22990 22991 if (!matchesSel || matchesExclude) { 22992 return NodeFilter.FILTER_REJECT; 22993 } else { 22994 return NodeFilter.FILTER_ACCEPT; 22995 } 22996 }, this.opt.done); 22997 } 22998 }, {
22999 key: "opt", 23000 set: function set(val) { 23001 this._opt = _extends({}, { 23002 'element': '', 23003 'className': '', 23004 'exclude': [], 23005 'iframes': false, 23006 'iframesTimeout': 5000, 23007 'separateWordSearch': true, 23008 'acrossElements': false, 23009 'ignoreGroups': 0, 23010 'each': function each() {}, 23011 'noMatch': function noMatch() {}, 23012 'filter': function filter() { 23013 return true; 23014 }, 23015 'done': function done() {}, 23016 'debug': false, 23017 'log': window.console 23018 }, val); 23019 }, 23020 get: function get() { 23021 return this._opt; 23022 } 23023 }, { 23024 key: "iterator", 23025 get: function get() { 23026 return new DOMIterator(this.ctx, this.opt.iframes, this.opt.exclude, this.opt.iframesTimeout); 23027 } 23028 }]); 23029 23030 return Mark; 23031 }(); 23032 23033 function Mark$1(ctx) { 23034 var _this = this; 23035 23036 var instance = new Mark(ctx); 23037 23038 this.mark = function (sv, opt) { 23039 instance.mark(sv, opt); 23040 return _this; 23041 }; 23042 23043 this.markRegExp = function (sv, opt) { 23044 instance.markRegExp(sv, opt); 23045 return _this; 23046 }; 23047 23048 this.markRanges = function (sv, opt) { 23049 instance.markRanges(sv, opt); 23050 return _this; 23051 }; 23052 23053 this.unmark = function (opt) { 23054 instance.unmark(opt); 23055 return _this; 23056 }; 23057 23058 return this; 23059 } 23060 23061 return Mark$1; 23062 23063}))); 23064 23065$(function() { 23066 var $input = $("input[name='keyword']"), 23067 $context = $(".search_content details"), 23068 $clearBtn = $("button[data-search='clear']"), 23069 instance = new Mark(document.querySelector(".search_content")); 23070 23071 $input.on("input", function() { 23072 var term = $(this).val(); 23073 if (term.length > 0) 23074 $clearBtn.css('display', 'inline-flex'); 23075 else 23076 $clearBtn.hide(); 23077 $context.show(); 23078 instance.unmark(); 23079 $(".search_content details").prop("open", false); 23080 if (term) { 23081 instance.mark(term, { 23082 done: function() { 23083 $(".search_content details").not(":has(mark)").hide(); 23084 $(".search_content details").prop("open", true); 23085 } 23086 }); 23087 } 23088 }); 23089 23090 $clearBtn.on("click", function() { 23091 $clearBtn.hide(); 23092 instance.unmark(); 23093 $(".search_content details").prop("open", false); 23094 $context.show(); 23095 $input.val("").focus(); 23096 }); 23097 23098// -- 23099 23100 var $input_oldprojects = $("#c6821 input[name='q']"), 23101 $context_oldprojects = $("#c6821 .accordion--search p"), 23102 $clearBtn_oldprojects = $("#c6821 button[data-search='clear']"), 23103 instance_oldprojects = new Mark(document.querySelector("#c6821 .accordion")); 23104 23105$input_oldprojects.on("input", function() { 23106 var term = $(this).val(); 23107 23108 if (term.length > 0) 23109 $clearBtn_oldprojects.css('display', 'inline-flex'); 23110else 23111 $clearBtn_oldprojects.hide(); 23112 23113 $context_oldprojects.show(); 23114 instance_oldprojects.unmark(); 23115 if (term) { 23116 instance_oldprojects.mark(term, { 23117 done: function() { 23118 $("#c6821 .accordion--search p:not(:has(mark))").hide(); 23119 } 23120 }); 23121 } 23122}); 23123 23124$clearBtn_oldprojects.on("click", function() { 23125 $clearBtn_oldprojects.hide(); 23126 instance_oldprojects.unmark(); 23127 $context_oldprojects.show(); 23128 $input_oldprojects.val("").focus(); 23129 }); 23130 23131 23132 $("input#theme66").click(function(){ 23133 $("input#theme31").prop("checked", $("input#theme66").prop("checked")); 23134 }); 23135 23136 23137}); 23138 23139 23140 23141/* 23142 * This combined file was created by the DataTables downloader builder: 23143 * https://datatables.net/download 23144 * 23145 * To rebuild or modify this file with the latest versions of the included 23146 * software please visit: 23147 * https://datatables.net/download/#dt/dt-1.13.4 23148 * 23149 * Included libraries: 23150 * DataTables 1.13.4 23151 */ 23152 23153/*! DataTables 1.13.4 23154 * ©2008-2023 SpryMedia Ltd - datatables.net/license 23155 */ 23156!function(n){"use strict";var a;"function"==typeof define&&define.amd?define(["jquery"],function(t){return n(t,window,document)}):"object"==typeof exports?(a=require("jquery"),"undefined"!=typeof window?module.exports=function(t,e){return t=t||window,e=e||a(t),n(e,t,t.document)}:n(a,window,window.document)):window.DataTable=n(jQuery,window,document)}(function(P,j,y,N){"use strict";function d(t){var e=parseInt(t,10);return!isNaN(e)&&isFinite(t)?e:null}function l(t,e,n){var a=typeof t,r="string"==a;return"number"==a||"bigint"==a||!!h(t)||(e&&r&&(t=G(t,e)),n&&r&&(t=t.replace(q,"")),!isNaN(parseFloat(t))&&isFinite(t))}function a(t,e,n){var a;return!!h(t)||(h(a=t)||"string"==typeof a)&&!!l(t.replace(V,""),e,n)||null}function m(t,e,n,a){var r=[],o=0,i=e.length;if(a!==N)for(;o<i;o++)t[e[o]][n]&&r.push(t[e[o]][n][a]);else for(;o<i;o++)r.push(t[e[o]][n]);return r}function f(t,e){var n,a=[];e===N?(e=0,n=t):(n=e,e=t);for(var r=e;r<n;r++)a.push(r);return a}function _(t){for(var e=[],n=0,a=t.length;n<a;n++)t[n]&&e.push(t[n]);return e}function s(t,e){return-1!==this.indexOf(t,e=e===N?0:e)}var p,e,t,w=function(t,v){if(w.factory(t,v))return w;if(this instanceof w)return P(t).DataTable(v);v=t,this.$=function(t,e){return this.api(!0).$(t,e)},this._=function(t,e){return this.api(!0).rows(t,e).data()},this.api=function(t){return new B(t?ge(this[p.iApiIndex]):this)},this.fnAddData=function(t,e){var n=this.api(!0),t=(Array.isArray(t)&&(Array.isArray(t[0])||P.isPlainObject(t[0]))?n.rows:n.row).add(t);return e!==N&&!e||n.draw(),t.flatten().toArray()}
vendor: 21,685 bytes, line 23156
23156,this.fnAdjustColumnSizing=function(t){var e=this.api(!0).columns.adjust(),n=e.settings()[0],a=n.oScroll;t===N||t?e.draw(!1):""===a.sX&&""===a.sY||Qt(n)},this.fnClearTable=function(t){var e=this.api(!0).clear();t!==N&&!t||e.draw()},this.fnClose=function(t){this.api(!0).row(t).child.hide()},this.fnDeleteRow=function(t,e,n){var a=this.api(!0),t=a.rows(t),r=t.settings()[0],o=r.aoData[t[0][0]];return t.remove(),e&&e.call(this,r,o),n!==N&&!n||a.draw(),o},this.fnDestroy=function(t){this.api(!0).destroy(t)},this.fnDraw=function(t){this.api(!0).draw(t)},this.fnFilter=function(t,e,n,a,r,o){var i=this.api(!0);(null===e||e===N?i:i.column(e)).search(t,n,a,o),i.draw()},this.fnGetData=function(t,e){var n,a=this.api(!0);return t!==N?(n=t.nodeName?t.nodeName.toLowerCase():"",e!==N||"td"==n||"th"==n?a.cell(t,e).data():a.row(t).data()||null):a.data().toArray()},this.fnGetNodes=function(t){var e=this.api(!0);return t!==N?e.row(t).node():e.rows().nodes().flatten().toArray()},this.fnGetPosition=function(t){var e=this.api(!0),n=t.nodeName.toUpperCase();return"TR"==n?e.row(t).index():"TD"==n||"TH"==n?[(n=e.cell(t).index()).row,n.columnVisible,n.column]:null},this.fnIsOpen=function(t){return this.api(!0).row(t).child.isShown()},this.fnOpen=function(t,e,n){return this.api(!0).row(t).child(e,n).show().child()[0]},this.fnPageChange=function(t,e){t=this.api(!0).page(t);e!==N&&!e||t.draw(!1)},this.fnSetColumnVis=function(t,e,n){t=this.api(!0).column(t).visible(e);n!==N&&!n||t.columns.adjust().draw()},this.fnSettings=function(){return ge(this[p.iApiIndex])},this.fnSort=function(t){this.api(!0).order(t).draw()},this.fnSortListener=function(t,e,n){this.api(!0).order.listener(t,e,n)},this.fnUpdate=function(t,e,n,a,r){var o=this.api(!0);return(n===N||null===n?o.row(e):o.cell(e,n)).data(t),r!==N&&!r||o.columns.adjust(),a!==N&&!a||o.draw(),0},this.fnVersionCheck=p.fnVersionCheck;var e,y=this,D=v===N,_=this.length;for(e in D&&(v={}),this.oApi=this.internal=p.internal,w.ext.internal)e&&(this[e]=Ge(e));return this.each(function(){var r=1<_?be({},v,!0):v,o=0,t=this.getAttribute("id"),i=!1,e=w.defaults,l=P(this);if("table"!=this.nodeName.toLowerCase())W(null,0,"Non-table node initialisation ("+this.nodeName+")",2);else{K(e),Q(e.column),C(e,e,!0),C(e.column,e.column,!0),C(e,P.extend(r,l.data()),!0);for(var n=w.settings,o=0,s=n.length;o<s;o++){var a=n[o];if(a.nTable==this||a.nTHead&&a.nTHead.parentNode==this||a.nTFoot&&a.nTFoot.parentNode==this){var u=(r.bRetrieve!==N?r:e).bRetrieve,c=(r.bDestroy!==N?r:e).bDestroy;if(D||u)return a.oInstance;if(c){a.oInstance.fnDestroy();break}return void W(a,0,"Cannot reinitialise DataTable",3)}if(a.sTableId==this.id){n.splice(o,1);break}}null!==t&&""!==t||(t="DataTables_Table_"+w.ext._unique++,this.id=t);var f,d,h=P.extend(!0,{},w.models.oSettings,{sDestroyWidth:l[0].style.width,sInstance:t,sTableId:t}),p=(h.nTable=this,h.oApi=y.internal,h.oInit=r,n.push(h),h.oInstance=1===y.length?y:l.dataTable(),K(r),Z(r.oLanguage),r.aLengthMenu&&!r.iDisplayLength&&(r.iDisplayLength=(Array.isArray(r.aLengthMenu[0])?r.aLengthMenu[0]:r.aLengthMenu)[0]),r=be(P.extend(!0,{},e),r),F(h.oFeatures,r,["bPaginate","bLengthChange","bFilter","bSort","bSortMulti","bInfo","bProcessing","bAutoWidth","bSortClasses","bServerSide","bDeferRender"]),F(h,r,["asStripeClasses","ajax","fnServerData","fnFormatNumber","sServerMethod","aaSorting","aaSortingFixed","aLengthMenu","sPaginationType","sAjaxSource","sAjaxDataProp","iStateDuration","sDom","bSortCellsTop","iTabIndex","fnStateLoadCallback","fnStateSaveCallback","renderer","searchDelay","rowId",["iCookieDuration","iStateDuration"],["oSearch","oPreviousSearch"],["aoSearchCols","aoPreSearchCols"],["iDisplayLength","_iDisplayLength"]]),F(h.oScroll,r,[["sScrollX","sX"],["sScrollXInner","sXInner"],["sScrollY","sY"],["bScrollCollapse","bCollapse"]]),F(h.oLanguage,r,"fnInfoCallback"),L(h,"aoDrawCallback",r.fnDrawCallback,"user"),L(h,"aoServerParams",r.fnServerParams,"user"),L(h,"aoStateSaveParams",r.fnStateSaveParams,"user"),L(h,"aoStateLoadParams",r.fnStateLoadParams,"user"),L(h,"aoStateLoaded",r.fnStateLoaded,"user"),L(h,"aoRowCallback",r.fnRowCallback,"user"),L(h,"aoRowCreatedCallback",r.fnCreatedRow,"user"),L(h,"aoHeaderCallback",r.fnHeaderCallback,"user"),L(h,"aoFooterCallback",r.fnFooterCallback,"user"),L(h,"aoInitComplete",r.fnInitComplete,"user"),L(h,"aoPreDrawCallback",r.fnPreDrawCallback,"user"),h.rowIdFn=A(r.rowId),tt(h),h.oClasses),g=(P.extend(p,w.ext.classes,r.oClasses),l.addClass(p.sTable),h.iInitDisplayStart===N&&(h.iInitDisplayStart=r.iDisplayStart,h._iDisplayStart=r.iDisplayStart),null!==r.iDeferLoading&&(h.bDeferLoading=!0,t=Array.isArray(r.iDeferLoading),h._iRecordsDisplay=t?r.iDeferLoading[0]:r.iDeferLoading,h._iRecordsTotal=t?r.iDeferLoading[1]:r.iDeferLoading),h.oLanguage),t=(P.extend(!0,g,r.oLanguage),g.sUrl?(P.ajax({dataType:"json",url:g.sUrl,success:function(t){C(e.oLanguage,t),Z(t),P.extend(!0,g,t,h.oInit.oLanguage),R(h,null,"i18n",[h]),Jt(h)},error:function(){Jt(h)}}),i=!0):R(h,null,"i18n",[h]),null===r.asStripeClasses&&(h.asStripeClasses=[p.sStripeOdd,p.sStripeEven]),h.asStripeClasses),b=l.children("tbody").find("tr").eq(0),m=(-1!==P.inArray(!0,P.map(t,function(t,e){return b.hasClass(t)}))&&(P("tbody tr",this).removeClass(t.join(" ")),h.asDestroyStripes=t.slice()),[]),t=this.getElementsByTagName("thead");if(0!==t.length&&(wt(h.aoHeader,t[0]),m=Ct(h)),null===r.aoColumns)for(f=[],o=0,s=m.length;o<s;o++)f.push(null);else f=r.aoColumns;for(o=0,s=f.length;o<s;o++)nt(h,m?m[o]:null);st(h,r.aoColumnDefs,f,function(t,e){at(h,t,e)}),b.length&&(d=function(t,e){return null!==t.getAttribute("data-"+e)?e:null},P(b[0]).children("th, td").each(function(t,e){var n,a=h.aoColumns[t];a||W(h,0,"Incorrect column count",18),a.mData===t&&(n=d(e,"sort")||d(e,"order"),e=d(e,"filter")||d(e,"search"),null===n&&null===e||(a.mData={_:t+".display",sort:null!==n?t+".@data-"+n:N,type:null!==n?t+".@data-"+n:N,filter:null!==e?t+".@data-"+e:N},a._isArrayHost=!0,at(h,t)))}));var S=h.oFeatures,t=function(){if(r.aaSorting===N){var t=h.aaSorting;for(o=0,s=t.length;o<s;o++)t[o][1]=h.aoColumns[o].asSorting[0]}ce(h),S.bSort&&L(h,"aoDrawCallback",function(){var t,n;h.bSorted&&(t=I(h),n={},P.each(t,function(t,e){n[e.src]=e.dir}),R(h,null,"order",[h,t,n]),le(h))}),L(h,"aoDrawCallback",function(){(h.bSorted||"ssp"===E(h)||S.bDeferRender)&&ce(h)},"sc");var e=l.children("caption").each(function(){this._captionSide=P(this).css("caption-side")}),n=l.children("thead"),a=(0===n.length&&(n=P("<thead/>").appendTo(l)),h.nTHead=n[0],l.children("tbody")),n=(0===a.length&&(a=P("<tbody/>").insertAfter(n)),h.nTBody=a[0],l.children("tfoot"));if(0===(n=0===n.length&&0<e.length&&(""!==h.oScroll.sX||""!==h.oScroll.sY)?P("<tfoot/>").appendTo(l):n).length||0===n.children().length?l.addClass(p.sNoFooter):0<n.length&&(h.nTFoot=n[0],wt(h.aoFooter,h.nTFoot)),r.aaData)for(o=0;o<r.aaData.length;o++)x(h,r.aaData[o]);else!h.bDeferLoading&&"dom"!=E(h)||ut(h,P(h.nTBody).children("tr"));h.aiDisplay=h.aiDisplayMaster.slice(),!(h.bInitialised=!0)===i&&Jt(h)};L(h,"aoDrawCallback",de,"state_save"),r.bStateSave?(S.bStateSave=!0,he(h,0,t)):t()}}),y=null,this},c={},U=/[\r\n\u2028]/g,V=/<.*?>/g,X=/^\d{2,4}[\.\/\-]\d{1,2}[\.\/\-]\d{1,2}([T ]{1}\d{1,2}[:\.]\d{2}([\.:]\d{2})?)?$/,J=new RegExp("(\\"+["/",".","*","+","?","|","(",")","[","]","{","}","\\","$","^","-"].join("|\\")+")","g"),q=/['\u00A0,$£â¬Â¥%\u2009\u202F\u20BD\u20a9\u20BArfkÉÎ]/gi,h=function(t){return!t||!0===t||"-"===t},G=function(t,e){return c[e]||(c[e]=new RegExp(Ot(e),"g")),"string"==typeof t&&"."!==e?t.replace(/\./g,"").replace(c[e],"."):t},H=function(t,e,n){var a=[],r=0,o=t.length;if(n!==N)for(;r<o;r++)t[r]&&t[r][e]&&a.push(t[r][e][n]);else for(;r<o;r++)t[r]&&a.push(t[r][e]);return a},$=function(t){if(!(t.length<2))for(var e=t.slice().sort(),n=e[0],a=1,r=e.length;a<r;a++){if(e[a]===n)return!1;n=e[a]}return!0},z=function(t){if($(t))return t.slice();var e,n,a,r=[],o=t.length,i=0;t:for(n=0;n<o;n++){for(e=t[n],a=0;a<i;a++)if(r[a]===e)continue t;r.push(e),i++}return r},Y=function(t,e){if(Array.isArray(e))for(var n=0;n<e.length;n++)Y(t,e[n]);else t.push(e);return t};function i(n){var a,r,o={};P.each(n,function(t,e){(a=t.match(/^([^A-Z]+?)([A-Z])/))&&-1!=="a aa ai ao as b fn i m o s ".indexOf(a[1]+" ")&&(r=t.replace(a[0],a[2].toLowerCase()),o[r]=t,"o"===a[1])&&i(n[t])}),n._hungarianMap=o}function C(n,a,r){var o;n._hungarianMap||i(n),P.each(a,function(t,e){(o=n._hungarianMap[t])===N||!r&&a[o]!==N||("o"===o.charAt(0)?(a[o]||(a[o]={}),P.extend(!0,a[o],a[t]),C(n[o],a[o],r)):a[o]=a[t])})}function Z(t){var e,n=w.defaults.oLanguage,a=n.sDecimal;a&&Me(a),t&&(e=t.sZeroRecords,!t.sEmptyTable&&e&&"No data available in table"===n.sEmptyTable&&F(t,t,"sZeroRecords","sEmptyTable"),!t.sLoadingRecords&&e&&"Loading..."===n.sLoadingRecords&&F(t,t,"sZeroRecords","sLoadingRecords"),t.sInfoThousands&&(t.sThousands=t.sInfoThousands),e=t.sDecimal)&&a!==e&&Me(e)}Array.isArray||(Array.isArray=function(t){return"[object Array]"===Object.prototype.toString.call(t)}),Array.prototype.includes||(Array.prototype.includes=s),String.prototype.trim||(String.prototype.trim=function(){return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"")}),String.prototype.includes||(String.prototype.includes=s),w.util={throttle:function(a,t){var r,o,i=t!==N?t:200;return function(){var t=this,e=+new Date,n=arguments;r&&e<r+i?(clearTimeout(o),o=setTimeout(function(){r=N,a.apply(t,n)},i)):(r=e,a.apply(t,n))}},escapeRegex:function(t){return t.replace(J,"\\$1")},set:function(a){var d;return P.isPlainObject(a)?w.util.set(a._):null===a?function(){}:"function"==typeof a?function(t,e,n){a(t,"set",e,n)}:"string"!=typeof a||-1===a.indexOf(".")&&-1===a.indexOf("[")&&-1===a.indexOf("(")?function(t,e){t[a]=e}:(d=function(t,e,n){for(var a,r,o,i,l=dt(n),n=l[l.length-1],s=0,u=l.length-1;s<u;s++){if("__proto__"===l[s]||"constructor"===l[s])throw new Error("Cannot set prototype values");if(a=l[s].match(ft),r=l[s].match(g),a){if(l[s]=l[s].replace(ft,""),t[l[s]]=[],(a=l.slice()).splice(0,s+1),i=a.join("."),Array.isArray(e))for(var c=0,f=e.length;c<f;c++)d(o={},e[c],i),t[l[s]].push(o);else t[l[s]]=e;return}r&&(l[s]=l[s].replace(g,""),t=t[l[s]](e)),null!==t[l[s]]&&t[l[s]]!==N||(t[l[s]]={}),t=t[l[s]]}n.match(g)?t[n.replace(g,"")](e):t[n.replace(ft,"")]=e},function(t,e){return d(t,e,a)})},get:function(r){var o,d;return P.isPlainObject(r)?(o={},P.each(r,function(t,e){e&&(o[t]=w.util.get(e))}),function(t,e,n,a){var r=o[e]||o._;return r!==N?r(t,e,n,a):t}):null===r?function(t){return t}:"function"==typeof r?function(t,e,n,a){return r(t,e,n,a)}:"string"!=typeof r||-1===r.indexOf(".")&&-1===r.indexOf("[")&&-1===r.indexOf("(")?function(t,e){return t[r]}:(d=function(t,e,n){var a,r,o;if(""!==n)for(var i=dt(n),l=0,s=i.length;l<s;l++){if(f=i[l].match(ft),a=i[l].match(g),f){if(i[l]=i[l].replace(ft,""),""!==i[l]&&(t=t[i[l]]),r=[],i.splice(0,l+1),o=i.join("."),Array.isArray(t))for(var u=0,c=t.length;u<c;u++)r.push(d(t[u],e,o));var f=f[0].substring(1,f[0].length-1);t=""===f?r:r.join(f);break}if(a)i[l]=i[l].replace(g,""),t=t[i[l]]();else{if(null===t||t[i[l]]===N)return N;t=t[i[l]]}}return t},function(t,e){return d(t,e,r)})}};var r=function(t,e,n){t[e]!==N&&(t[n]=t[e])};function K(t){r(t,"ordering","bSort"),r(t,"orderMulti","bSortMulti"),r(t,"orderClasses","bSortClasses"),r(t,"orderCellsTop","bSortCellsTop"),r(t,"order","aaSorting"),r(t,"orderFixed","aaSortingFixed"),r(t,"paging","bPaginate"),r(t,"pagingType","sPaginationType"),r(t,"pageLength","iDisplayLength"),r(t,"searching","bFilter"),"boolean"==typeof t.sScrollX&&(t.sScrollX=t.sScrollX?"100%":""),"boolean"==typeof t.scrollX&&(t.scrollX=t.scrollX?"100%":"");var e=t.aoSearchCols;if(e)for(var n=0,a=e.length;n<a;n++)e[n]&&C(w.models.oSearch,e[n])}function Q(t){r(t,"orderable","bSortable"),r(t,"orderData","aDataSort"),r(t,"orderSequence","asSorting"),r(t,"orderDataType","sortDataType");var e=t.aDataSort;"number"!=typeof e||Array.isArray(e)||(t.aDataSort=[e])}function tt(t){var e,n,a,r;w.__browser||(w.__browser=e={},r=(a=(n=P("<div/>").css({position:"fixed",top:0,left:-1*P(j).scrollLeft(),height:1,width:1,overflow:"hidden"}).append(P("<div/>").css({position:"absolute",top:1,left:1,width:100,overflow:"scroll"}).append(P("<div/>").css({width:"100%",height:10}))).appendTo("body")).children()).children(),e.barWidth=a[0].offsetWidth-a[0].clientWidth,e.bScrollOversize=100===r[0].offsetWidth&&100!==a[0].clientWidth,e.bScrollbarLeft=1!==Math.round(r.offset().left),e.bBounding=!!n[0].getBoundingClientRect().width,n.remove()),P.extend(t.oBrowser,w.__browser),t.oScroll.iBarWidth=w.__browser.barWidth}function et(t,e,n,a,r,o){var i,l=a,s=!1;for(n!==N&&(i=n,s=!0);l!==r;)t.hasOwnProperty(l)&&(i=s?e(i,t[l],l,t):t[l],s=!0,l+=o);return i}function nt(t,e){var n=w.defaults.column,a=t.aoColumns.length,n=P.extend({},w.models.oColumn,n,{nTh:e||y.createElement("th"),sTitle:n.sTitle||(e?e.innerHTML:""),aDataSort:n.aDataSort||[a],mData:n.mData||a,idx:a}),n=(t.aoColumns.push(n),t.aoPreSearchCols);n[a]=P.extend({},w.models.oSearch,n[a]),at(t,a,P(e).data())}function at(t,e,n){function a(t){return"string"==typeof t&&-1!==t.indexOf("@")}var e=t.aoColumns[e],r=t.oClasses,o=P(e.nTh),i=(!e.sWidthOrig&&(e.sWidthOrig=o.attr("width")||null,u=(o.attr("style")||"").match(/width:\s*(\d+[pxem%]+)/))&&(e.sWidthOrig=u[1]),n!==N&&null!==n&&(Q(n),C(w.defaults.column,n,!0),n.mDataProp===N||n.mData||(n.mData=n.mDataProp),n.sType&&(e._sManualType=n.sType),n.className&&!n.sClass&&(n.sClass=n.className),n.sClass&&o.addClass(n.sClass),u=e.sClass,P.extend(e,n),F(e,n,"sWidth","sWidthOrig"),u!==e.sClass&&(e.sClass=u+" "+e.sClass),n.iDataSort!==N&&(e.aDataSort=[n.iDataSort]),F(e,n,"aDataSort")),e.mData),l=A(i),s=e.mRender?A(e.mRender):null,u=(e._bAttrSrc=P.isPlainObject(i)&&(a(i.sort)||a(i.type)||a(i.filter)),e._setter=null,e.fnGetData=function(t,e,n){var a=l(t,e,N,n);return s&&e?s(a,e,t,n):a},e.fnSetData=function(t,e,n){return b(i)(t,e,n)},"number"==typeof i||e._isArrayHost||(t._rowReadObject=!0),t.oFeatures.bSort||(e.bSortable=!1,o.addClass(r.sSortableNone)),-1!==P.inArray("asc",e.asSorting)),n=-1!==P.inArray("desc",e.asSorting);e.bSortable&&(u||n)?u&&!n?(e.sSortingClass=r.sSortableAsc,e.sSortingClassJUI=r.sSortJUIAscAllowed):!u&&n?(e.sSortingClass=r.sSortableDesc,e.sSortingClassJUI=r.sSortJUIDescAllowed):(e.sSortingClass=r.sSortable,e.sSortingClassJUI=r.sSortJUI):(e.sSortingClass=r.sSortableNone,e.sSortingClassJUI="")}function O(t){if(!1!==t.oFeatures.bAutoWidth){var e=t.aoColumns;ee(t);for(var n=0,a=e.length;n<a;n++)e[n].nTh.style.width=e[n].sWidth}var r=t.oScroll;""===r.sY&&""===r.sX||Qt(t),R(t,null,"column-sizing",[t])}function rt(t,e){t=it(t,"bVisible");return"number"==typeof t[e]?t[e]:null}function ot(t,e){t=it(t,"bVisible"),e=P.inArray(e,t);return-1!==e?e:null}function T(t){var n=0;return P.each(t.aoColumns,function(t,e){e.bVisible&&"none"!==P(e.nTh).css("display")&&n++}),n}function it(t,n){var a=[];return P.map(t.aoColumns,function(t,e){t[n]&&a.push(e)}),a}function lt(t){for(var e,n,a,r,o,i,l,s=t.aoColumns,u=t.aoData,c=w.ext.type.detect,f=0,d=s.length;f<d;f++)if(l=[],!(o=s[f]).sType&&o._sManualType)o.sType=o._sManualType;else if(!o.sType){for(e=0,n=c.length;e<n;e++){for(a=0,r=u.length;a<r&&(l[a]===N&&(l[a]=S(t,a,f,"type")),(i=c[e](l[a],t))||e===c.length-1)&&("html"!==i||h(l[a]));a++);if(i){o.sType=i;break}}o.sType||(o.sType="string")}}function st(t,e,n,a){var r,o,i,l,s=t.aoColumns;if(e)for(r=e.length-1;0<=r;r--)for(var u,c=(u=e[r]).target!==N?u.target:u.targets!==N?u.targets:u.aTargets,f=0,d=(c=Array.isArray(c)?c:[c]).length;f<d;f++)if("number"==typeof c[f]&&0<=c[f]){for(;s.length<=c[f];)nt(t);a(c[f],u)}else if("number"==typeof c[f]&&c[f]<0)a(s.length+c[f],u);else if("string"==typeof c[f])for(i=0,l=s.length;i<l;i++)"_all"!=c[f]&&!P(s[i].nTh).hasClass(c[f])||a(i,u);if(n)for(r=0,o=n.length;r<o;r++)a(r,n[r])}function x(t,e,n,a){for(var r=t.aoData.length,o=P.extend(!0,{},w.models.oRow,{src:n?"dom":"data",idx:r}),i=(o._aData=e,t.aoData.push(o),t.aoColumns),l=0,s=i.length;l<s;l++)i[l].sType=null;t.aiDisplayMaster.push(r);e=t.rowIdFn(e);return e!==N&&(t.aIds[e]=o),!n&&t.oFeatures.bDeferRender||St(t,r,n,a),r}function ut(n,t){var a;return(t=t instanceof P?t:P(t)).map(function(t,e){return a=mt(n,e),x(n,a.data,e,a.cells)})}function S(t,e,n,a){"search"===a?a="filter":"order"===a&&(a="sort");var r=t.iDraw,o=t.aoColumns[n],i=t.aoData[e]._aData,l=o.sDefaultContent,s=o.fnGetData(i,a,{settings:t,row:e,col:n});if(s===N)return t.iDrawError!=r&&null===l&&(W(t,0,"Requested unknown parameter "+("function"==typeof o.mData?"{function}":"'"+o.mData+"'")+" for row "+e+", column "+n,4),t.iDrawError=r),l;if(s!==i&&null!==s||null===l||a===N){if("function"==typeof s)return s.call(i)}else s=l;return null===s&&"display"===a?"":"filter"===a&&(e=w.ext.type.search)[o.sType]?e[o.sType](s):s}function ct(t,e,n,a){var r=t.aoColumns[n],o=t.aoData[e]._aData;r.fnSetData(o,a,{settings:t,row:e,col:n})}var ft=/\[.*?\]$/,g=/\(\)$/;function dt(t){return P.map(t.match(/(\\.|[^\.])+/g)||[""],function(t){return t.replace(/\\\./g,".")})}var A=w.util.get,b=w.util.set;function ht(t){return H(t.aoData,"_aData")}function pt(t){t.aoData.length=0,t.aiDisplayMaster.length=0,t.aiDisplay.length=0,t.aIds={}}function gt(t,e,n){for(var a=-1,r=0,o=t.length;r<o;r++)t[r]==e?a=r:t[r]>e&&t[r]--;-1!=a&&n===N&&t.splice(a,1)}function bt(n,a,t,e){function r(t,e){for(;t.childNodes.length;)t.removeChild(t.firstChild);t.innerHTML=S(n,a,e,"display")}var o,i,l=n.aoData[a];if("dom"!==t&&(t&&"auto"!==t||"dom"!==l.src)){var s=l.anCells;if(s)if(e!==N)r(s[e],e);else for(o=0,i=s.length;o<i;o++)r(s[o],o)}else l._aData=mt(n,l,e,e===N?N:l._aData).data;l._aSortData=null,l._aFilterData=null;var u=n.aoColumns;if(e!==N)u[e].sType=null;else{for(o=0,i=u.length;o<i;o++)u[o].sType=null;vt(n,l)}}function mt(t,e,n,a){function r(t,e){var n;"string"==typeof t&&-1!==(n=t.indexOf("@"))&&(n=t.substring(n+1),b(t)(a,e.getAttribute(n)))}function o(t){n!==N&&n!==f||(l=d[f],s=t.innerHTML.trim(),l&&l._bAttrSrc?(b(l.mData._)(a,s),r(l.mData.sort,t),r(l.mData.type,t),r(l.mData.filter,t)):h?(l._setter||(l._setter=b(l.mData)),l._setter(a,s)):a[f]=s),f++}var i,l,s,u=[],c=e.firstChild,f=0,d=t.aoColumns,h=t._rowReadObject;a=a!==N?a:h?{}:[];if(c)for(;c;)"TD"!=(i=c.nodeName.toUpperCase())&&"TH"!=i||(o(c),u.push(c)),c=c.nextSibling;else for(var p=0,g=(u=e.anCells).length;p<g;p++)o(u[p]);var e=e.firstChild?e:e.nTr;return e&&(e=e.getAttribute("id"))&&b(t.rowId)(a,e),{data:a,cells:u}}function St(t,e,n,a){var r,o,i,l,s,u,c=t.aoData[e],f=c._aData,d=[];if(null===c.nTr){for(r=n||y.createElement("tr"),c.nTr=r,c.anCells=d,r._DT_RowIndex=e,vt(t,c),l=0,s=t.aoColumns.length;l<s;l++)i=t.aoColumns[l],(o=(u=!n)?y.createElement(i.sCellType):a[l])||W(t,0,"Incorrect column count",18),o._DT_CellIndex={row:e,column:l},d.push(o),!u&&(!i.mRender&&i.mData===l||P.isPlainObject(i.mData)&&i.mData._===l+".display")||(o.innerHTML=S(t,e,l,"display")),i.sClass&&(o.className+=" "+i.sClass),i.bVisible&&!n?r.appendChild(o):!i.bVisible&&n&&o.parentNode.removeChild(o),i.fnCreatedCell&&i.fnCreatedCell.call(t.oInstance,o,S(t,e,l),f,e,l);R(t,"aoRowCreatedCallback",null,[r,f,e,d])}}function vt(t,e){var n=e.nTr,a=e._aData;n&&((t=t.rowIdFn(a))&&(n.id=t),a.DT_RowClass&&(t=a.DT_RowClass.split(" "),e.__rowc=e.__rowc?z(e.__rowc.concat(t)):t,P(n).removeClass(e.__rowc.join(" ")).addClass(a.DT_RowClass)),a.DT_RowAttr&&P(n).attr(a.DT_RowAttr),a.DT_RowData)&&P(n).data(a.DT_RowData)}function yt(t){var e,n,a,r=t.nTHead,o=t.nTFoot,i=0===P("th, td",r).length,l=t.oClasses,s=t.aoColumns;for(i&&(n=P("<tr/>").appendTo(r)),c=0,f=s.length;c<f;c++)a=s[c],e=P(a.nTh).addClass(a.sClass),i&&e.appendTo(n),t.oFeatures.bSort&&(e.addClass(a.sSortingClass),!1!==a.bSortable)&&(e.attr("tabindex",t.iTabIndex).attr("aria-controls",t.sTableId),ue(t,a.nTh,c)),a.sTitle!=e[0].innerHTML&&e.html(a.sTitle),ve(t,"header")(t,e,a,l);if(i&&wt(t.aoHeader,r),P(r).children("tr").children("th, td").addClass(l.sHeaderTH),P(o).children("tr").children("th, td").addClass(l.sFooterTH),null!==o)for(var u=t.aoFooter[0],c=0,f=u.length;c<f;c++)(a=s[c])?(a.nTf=u[c].cell,a.sClass&&P(a.nTf).addClass(a.sClass)):W(t,0,"Incorrect column count",18)}function Dt(t,e,n){var a,r,o,i,l,s,u,c,f,d=[],h=[],p=t.aoColumns.length;if(e){for(n===N&&(n=!1),a=0,r=e.length;a<r;a++){for(d[a]=e[a].slice(),d[a].nTr=e[a].nTr,o=p-1;0<=o;o--)t.aoColumns[o].bVisible||n||d[a].splice(o,1);h.push([])}for(a=0,r=d.length;a<r;a++){if(u=d[a].nTr)for(;s=u.firstChild;)u.removeChild(s);for(o=0,i=d[a].length;o<i;o++)if(f=c=1,h[a][o]===N){for(u.appendChild(d[a][o].cell),h[a][o]=1;d[a+c]!==N&&d[a][o].cell==d[a+c][o].cell;)h[a+c][o]=1,c++;for(;d[a][o+f]!==N&&d[a][o].cell==d[a][o+f].cell;){for(l=0;l<c;l++)h[a+l][o+f]=1;f++}P(d[a][o].cell).attr("rowspan",c).attr("colspan",f)}}}}function v(t,e){n="ssp"==E(s=t),(l=s.iInitDisplayStart)!==N&&-1!==l&&(s._iDisplayStart=!n&&l>=s.fnRecordsDisplay()?0:l,s.iInitDisplayStart=-1);var n=R(t,"aoPreDrawCallback","preDraw",[t]);if(-1!==P.inArray(!1,n))D(t,!1);else{var a=[],r=0,o=t.asStripeClasses,i=o.length,l=t.oLanguage,s="ssp"==E(t),u=t.aiDisplay,n=t._iDisplayStart,c=t.fnDisplayEnd();if(t.bDrawing=!0,t.bDeferLoading)t.bDeferLoading=!1,t.iDraw++,D(t,!1);else if(s){if(!t.bDestroying&&!e)return void xt(t)}else t.iDraw++;if(0!==u.length)for(var f=s?t.aoData.length:c,d=s?0:n;d<f;d++){var h,p=u[d],g=t.aoData[p],b=(null===g.nTr&&St(t,p),g.nTr);0!==i&&(h=o[r%i],g._sRowStripe!=h)&&(P(b).removeClass(g._sRowStripe).addClass(h),g._sRowStripe=h),R(t,"aoRowCallback",null,[b,g._aData,r,d,p]),a.push(b),r++}else{e=l.sZeroRecords;1==t.iDraw&&"ajax"==E(t)?e=l.sLoadingRecords:l.sEmptyTable&&0===t.fnRecordsTotal()&&(e=l.sEmptyTable),a[0]=P("<tr/>",{class:i?o[0]:""}).append(P("<td />
23156",{valign:"top",colSpan:T(t),class:t.oClasses.sRowEmpty}).html(e))[0]}R(t,"aoHeaderCallback","header",[P(t.nTHead).children("tr")[0],ht(t),n,c,u]),R(t,"aoFooterCallback","footer",[P(t.nTFoot).children("tr")[0],ht(t),n,c,u]);s=P(t.nTBody);s.children().detach(),s.append(P(a)),R(t,"aoDrawCallback","draw",[t]),t.bSorted=!1,t.bFiltered=!1,t.bDrawing=!1}}function u(t,e){var n=t.oFeatures,a=n.bSort,n=n.bFilter;a&&ie(t),n?Rt(t,t.oPreviousSearch):t.aiDisplay=t.aiDisplayMaster.slice(),!0!==e&&(t._iDisplayStart=0),t._drawHold=e,v(t),t._drawHold=!1}function _t(t){for(var e,n,a,r,o,i,l,s=t.oClasses,u=P(t.nTable),u=P("<div/>").insertBefore(u),c=t.oFeatures,f=P("<div/>",{id:t.sTableId+"_wrapper",class:s.sWrapper+(t.nTFoot?"":" "+s.sNoFooter)}),d=(t.nHolding=u[0],t.nTableWrapper=f[0],t.nTableReinsertBefore=t.nTable.nextSibling,t.sDom.split("")),h=0;h<d.length;h++){if(e=null,"<"==(n=d[h])){if(a=P("<div/>")[0],"'"==(r=d[h+1])||'"'==r){for(o="",i=2;d[h+i]!=r;)o+=d[h+i],i++;"H"==o?o=s.sJUIHeader:"F"==o&&(o=s.sJUIFooter),-1!=o.indexOf(".")?(l=o.split("."),a.id=l[0].substr(1,l[0].length-1),a.className=l[1]):"#"==o.charAt(0)?a.id=o.substr(1,o.length-1):a.className=o,h+=i}f.append(a),f=P(a)}else if(">"==n)f=f.parent();else if("l"==n&&c.bPaginate&&c.bLengthChange)e=$t(t);else if("f"==n&&c.bFilter)e=Lt(t);else if("r"==n&&c.bProcessing)e=Zt(t);else if("t"==n)e=Kt(t);else if("i"==n&&c.bInfo)e=Ut(t);else if("p"==n&&c.bPaginate)e=zt(t);else if(0!==w.ext.feature.length)for(var p=w.ext.feature,g=0,b=p.length;g<b;g++)if(n==p[g].cFeature){e=p[g].fnInit(t);break}e&&((l=t.aanFeatures)[n]||(l[n]=[]),l[n].push(e),f.append(e))}u.replaceWith(f),t.nHolding=null}function wt(t,e){var n,a,r,o,i,l,s,u,c,f,d=P(e).children("tr");for(t.splice(0,t.length),r=0,l=d.length;r<l;r++)t.push([]);for(r=0,l=d.length;r<l;r++)for(a=(n=d[r]).firstChild;a;){if("TD"==a.nodeName.toUpperCase()||"TH"==a.nodeName.toUpperCase())for(u=(u=+a.getAttribute("colspan"))&&0!=u&&1!=u?u:1,c=(c=+a.getAttribute("rowspan"))&&0!=c&&1!=c?c:1,s=function(t,e,n){for(var a=t[e];a[n];)n++;return n}(t,r,0),f=1==u,i=0;i<u;i++)for(o=0;o<c;o++)t[r+o][s+i]={cell:a,unique:f},t[r+o].nTr=n;a=a.nextSibling}}function Ct(t,e,n){var a=[];n||(n=t.aoHeader,e&&wt(n=[],e));for(var r=0,o=n.length;r<o;r++)for(var i=0,l=n[r].length;i<l;i++)!n[r][i].unique||a[i]&&t.bSortCellsTop||(a[i]=n[r][i].cell);return a}function Tt(r,t,n){function e(t){var e=r.jqXHR?r.jqXHR.status:null;(null===t||"number"==typeof e&&204==e)&&Ft(r,t={},[]),(e=t.error||t.sError)&&W(r,0,e),r.json=t,R(r,null,"xhr",[r,t,r.jqXHR]),n(t)}R(r,"aoServerParams","serverParams",[t]),t&&Array.isArray(t)&&(a={},o=/(.*?)\[\]$/,P.each(t,function(t,e){var n=e.name.match(o);n?(n=n[0],a[n]||(a[n]=[]),a[n].push(e.value)):a[e.name]=e.value}),t=a);var a,o,i,l=r.ajax,s=r.oInstance,u=(P.isPlainObject(l)&&l.data&&(u="function"==typeof(i=l.data)?i(t,r):i,t="function"==typeof i&&u?u:P.extend(!0,t,u),delete l.data),{data:t,success:e,dataType:"json",cache:!1,type:r.sServerMethod,error:function(t,e,n){var a=R(r,null,"xhr",[r,null,r.jqXHR]);-1===P.inArray(!0,a)&&("parsererror"==e?W(r,0,"Invalid JSON response",1):4===t.readyState&&W(r,0,"Ajax error",7)),D(r,!1)}});r.oAjaxData=t,R(r,null,"preXhr",[r,t]),r.fnServerData?r.fnServerData.call(s,r.sAjaxSource,P.map(t,function(t,e){return{name:e,value:t}}),e,r):r.sAjaxSource||"string"==typeof l?r.jqXHR=P.ajax(P.extend(u,{url:l||r.sAjaxSource})):"function"==typeof l?r.jqXHR=l.call(s,t,e,r):(r.jqXHR=P.ajax(P.extend(u,l)),l.data=i)}function xt(e){e.iDraw++,D(e,!0),Tt(e,At(e),function(t){It(e,t)})}function At(t){for(var e,n,a,r=t.aoColumns,o=r.length,i=t.oFeatures,l=t.oPreviousSearch,s=t.aoPreSearchCols,u=[],c=I(t),f=t._iDisplayStart,d=!1!==i.bPaginate?t._iDisplayLength:-1,h=function(t,e){u.push({name:t,value:e})},p=(h("sEcho",t.iDraw),h("iColumns",o),h("sColumns",H(r,"sName").join(",")),h("iDisplayStart",f),h("iDisplayLength",d),{draw:t.iDraw,columns:[],order:[],start:f,length:d,search:{value:l.sSearch,regex:l.bRegex}}),g=0;g<o;g++)n=r[g],a=s[g],e="function"==typeof n.mData?"function":n.mData,p.columns.push({data:e,name:n.sName,searchable:n.bSearchable,orderable:n.bSortable,search:{value:a.sSearch,regex:a.bRegex}}),h("mDataProp_"+g,e),i.bFilter&&(h("sSearch_"+g,a.sSearch),h("bRegex_"+g,a.bRegex),h("bSearchable_"+g,n.bSearchable)),i.bSort&&h("bSortable_"+g,n.bSortable);i.bFilter&&(h("sSearch",l.sSearch),h("bRegex",l.bRegex)),i.bSort&&(P.each(c,function(t,e){p.order.push({column:e.col,dir:e.dir}),h("iSortCol_"+t,e.col),h("sSortDir_"+t,e.dir)}),h("iSortingCols",c.length));f=w.ext.legacy.ajax;return null===f?t.sAjaxSource?u:p:f?u:p}function It(t,n){function e(t,e){return n[t]!==N?n[t]:n[e]}var a=Ft(t,n),r=e("sEcho","draw"),o=e("iTotalRecords","recordsTotal"),i=e("iTotalDisplayRecords","recordsFiltered");if(r!==N){if(+r<t.iDraw)return;t.iDraw=+r}a=a||[],pt(t),t._iRecordsTotal=parseInt(o,10),t._iRecordsDisplay=parseInt(i,10);for(var l=0,s=a.length;l<s;l++)x(t,a[l]);t.aiDisplay=t.aiDisplayMaster.slice(),v(t,!0),t._bInitComplete||qt(t,n),D(t,!1)}function Ft(t,e,n){t=P.isPlainObject(t.ajax)&&t.ajax.dataSrc!==N?t.ajax.dataSrc:t.sAjaxDataProp;if(!n)return"data"===t?e.aaData||e[t]:""!==t?A(t)(e):e;b(t)(e,n)}function Lt(n){function e(t){i.f;var e=this.value||"";o.return&&"Enter"!==t.key||e!=o.sSearch&&(Rt(n,{sSearch:e,bRegex:o.bRegex,bSmart:o.bSmart,bCaseInsensitive:o.bCaseInsensitive,return:o.return}),n._iDisplayStart=0,v(n))}var t=n.oClasses,a=n.sTableId,r=n.oLanguage,o=n.oPreviousSearch,i=n.aanFeatures,l='<input type="search" class="'+t.sFilterInput+'"/>',s=(s=r.sSearch).match(/_INPUT_/)?s.replace("_INPUT_",l):s+l,l=P("<div/>",{id:i.f?null:a+"_filter",class:t.sFilter}).append(P("<label/>").append(s)),t=null!==n.searchDelay?n.searchDelay:"ssp"===E(n)?400:0,u=P("input",l).val(o.sSearch).attr("placeholder",r.sSearchPlaceholder).on("keyup.DT search.DT input.DT paste.DT cut.DT",t?ne(e,t):e).on("mouseup",function(t){setTimeout(function(){e.call(u[0],t)},10)}).on("keypress.DT",function(t){if(13==t.keyCode)return!1}).attr("aria-controls",a);return P(n.nTable).on("search.dt.DT",function(t,e){if(n===e)try{u[0]!==y.activeElement&&u.val(o.sSearch)}catch(t){}}),l[0]}function Rt(t,e,n){function a(t){o.sSearch=t.sSearch,o.bRegex=t.bRegex,o.bSmart=t.bSmart,o.bCaseInsensitive=t.bCaseInsensitive,o.return=t.return}function r(t){return t.bEscapeRegex!==N?!t.bEscapeRegex:t.bRegex}var o=t.oPreviousSearch,i=t.aoPreSearchCols;
vendor: 4,357 bytes, line 23156
23156if(lt(t),"ssp"!=E(t)){Nt(t,e.sSearch,n,r(e),e.bSmart,e.bCaseInsensitive,e.return),a(e);for(var l=0;l<i.length;l++)jt(t,i[l].sSearch,l,r(i[l]),i[l].bSmart,i[l].bCaseInsensitive);Pt(t)}else a(e);t.bFiltered=!0,R(t,null,"search",[t])}function Pt(t){for(var e,n,a=w.ext.search,r=t.aiDisplay,o=0,i=a.length;o<i;o++){for(var l=[],s=0,u=r.length;s<u;s++)n=r[s],e=t.aoData[n],a[o](t,e._aFilterData,n,e._aData,s)&&l.push(n);r.length=0,P.merge(r,l)}}function jt(t,e,n,a,r,o){if(""!==e){for(var i,l=[],s=t.aiDisplay,u=Ht(e,a,r,o),c=0;c<s.length;c++)i=t.aoData[s[c]]._aFilterData[n],u.test(i)&&l.push(s[c]);t.aiDisplay=l}}function Nt(t,e,n,a,r,o){var i,l,s,u=Ht(e,a,r,o),r=t.oPreviousSearch.sSearch,o=t.aiDisplayMaster,c=[];if(0!==w.ext.search.length&&(n=!0),l=Wt(t),e.length<=0)t.aiDisplay=o.slice();else{for((l||n||a||r.length>e.length||0!==e.indexOf(r)||t.bSorted)&&(t.aiDisplay=o.slice()),i=t.aiDisplay,s=0;s<i.length;s++)u.test(t.aoData[i[s]]._sFilterRow)&&c.push(i[s]);t.aiDisplay=c}}function Ht(t,e,n,a){return t=e?t:Ot(t),n&&(t="^(?=.*?"+P.map(t.match(/"[^"]+"|[^ ]+/g)||[""],function(t){var e;return(t='"'===t.charAt(0)?(e=t.match(/^"(.*)"$/))?e[1]:t:t).replace('"',"")}).join(")(?=.*?")+").*$"),new RegExp(t,a?"i":"")}var Ot=w.util.escapeRegex,kt=P("<div>")[0],Mt=kt.textContent!==N;function Wt(t){for(var e,n,a,r,o,i=t.aoColumns,l=!1,s=0,u=t.aoData.length;s<u;s++)if(!(o=t.aoData[s])._aFilterData){for(a=[],e=0,n=i.length;e<n;e++)i[e].bSearchable?"string"!=typeof(r=null===(r=S(t,s,e,"filter"))?"":r)&&r.toString&&(r=r.toString()):r="",r.indexOf&&-1!==r.indexOf("&")&&(kt.innerHTML=r,r=Mt?kt.textContent:kt.innerText),r.replace&&(r=r.replace(/[\r\n\u2028]/g,"")),a.push(r);o._aFilterData=a,o._sFilterRow=a.join(" "),l=!0}return l}function Et(t){return{search:t.sSearch,smart:t.bSmart,regex:t.bRegex,caseInsensitive:t.bCaseInsensitive}}function Bt(t){return{sSearch:t.search,bSmart:t.smart,bRegex:t.regex,bCaseInsensitive:t.caseInsensitive}}function Ut(t){var e=t.sTableId,n=t.aanFeatures.i,a=P("<div/>",{class:t.oClasses.sInfo,id:n?null:e+"_info"});return n||(t.aoDrawCallback.push({fn:Vt,sName:"information"}),a.attr("role","status").attr("aria-live","polite"),P(t.nTable).attr("aria-describedby",e+"_info")),a[0]}function Vt(t){var e,n,a,r,o,i,l=t.aanFeatures.i;0!==l.length&&(i=t.oLanguage,e=t._iDisplayStart+1,n=t.fnDisplayEnd(),a=t.fnRecordsTotal(),o=(r=t.fnRecordsDisplay())?i.sInfo:i.sInfoEmpty,r!==a&&(o+=" "+i.sInfoFiltered),o=Xt(t,o+=i.sInfoPostFix),null!==(i=i.fnInfoCallback)&&(o=i.call(t.oInstance,t,e,n,a,r,o)),P(l).html(o))}function Xt(t,e){var n=t.fnFormatNumber,a=t._iDisplayStart+1,r=t._iDisplayLength,o=t.fnRecordsDisplay(),i=-1===r;return e.replace(/_START_/g,n.call(t,a)).replace(/_END_/g,n.call(t,t.fnDisplayEnd())).replace(/_MAX_/g,n.call(t,t.fnRecordsTotal())).replace(/_TOTAL_/g,n.call(t,o)).replace(/_PAGE_/g,n.call(t,i?1:Math.ceil(a/r))).replace(/_PAGES_/g,n.call(t,i?1:Math.ceil(o/r)))}function Jt(n){var a,t,e,r=n.iInitDisplayStart,o=n.aoColumns,i=n.oFeatures,l=n.bDeferLoading;if(n.bInitialised){for(_t(n),yt(n),Dt(n,n.aoHeader),Dt(n,n.aoFooter),D(n,!0),i.bAutoWidth&&ee(n),a=0,t=o.length;a<t;a++)(e=o[a]).sWidth&&(e.nTh.style.width=M(e.sWidth));R(n,null,"preInit",[n]),u(n);i=E(n);"ssp"==i&&!l||("ajax"==i?Tt(n,[],function(t){var e=Ft(n,t);for(a=0;a<e.length;a++)x(n,e[a]);n.iInitDisplayStart=r,u(n),D(n,!1),qt(n,t)}):(D(n,!1),qt(n)))}else setTimeout(function(){Jt(n)},200)}function qt(t,e){t._bInitComplete=!0,(e||t.oInit.aaData)&&O(t),R(t,null,"plugin-init",[t,e]),R(t,"aoInitComplete","init",[t,e])}function Gt(t,e){e=parseInt(e,10);t._iDisplayLength=e,Se(t),R(t,null,"length",[t,e])}function $t(a){for(var t=a.oClasses,e=a.sTableId,n=a.aLengthMenu,r=Array.isArray(n[0]),o=r?n[0]:n,i=r?n[1]:n,l=P("<select/>",{name:e+"_length","aria-controls":e,class:t.sLengthSelect}),s=0,u=o.length;s<u;s++)l[0][s]=new Option("number"==typeof i[s]?a.fnFormatNumber(i[s]):i[s],o[s]);var c=P("<div><label/></div>").addClass(t.sLength);return a.aanFeatures.l||(c[0].id=e+"_length"),c.children().append(a.oLanguage.sLengthMenu.replace("_MENU_",l[0].outerHTML)),P("select",c).val(a._iDisplayLength).on("change.DT",function(t){Gt(a,P(this).val()),v(a)}),P(a.nTable).on("length.dt.DT",function(t,e,n){a===e&&P("select",c).val(n)}),c[0]}function zt(t){function c(t){v(t)}var e=t.sPaginationType,f=w.ext.pager[e],d="function"==typeof f,e=P("<div/>
23156").addClass(t.oClasses.sPaging+e)[0],h=t.aanFeatures;return d||f.fnInit(t,e,c),h.p||(e.id=t.sTableId+"_paginate",t.aoDrawCallback.push({fn:function(t){if(d)for(var e=t._iDisplayStart,n=t._iDisplayLength,a=t.fnRecordsDisplay(),r=-1===n,o=r?0:Math.ceil(e/n),i=r?1:Math.ceil(a/n),l=f(o,i),s=0,u=h.p.length;s<u;s++)ve(t,"pageButton")(t,h.p[s],s,l,o,i);else f.fnUpdate(t,c)},sName:"pagination"})),e}function Yt(t,e,n){var a=t._iDisplayStart,r=t._iDisplayLength,o=t.fnRecordsDisplay(),o=(0===o||-1===r?a=0:"number"==typeof e?o<(a=e*r)&&(a=0):"first"==e?a=0:"previous"==e?(a=0<=r?a-r:0)<0&&(a=0):"next"==e?a+r<o&&(a+=r):"last"==e?a=Math.floor((o-1)/r)*r:W(t,0,"Unknown paging action: "+e,5),t._iDisplayStart!==a);return t._iDisplayStart=a,o?(R(t,null,"page",[t]),n&&v(t)):R(t,null,"page-nc",[t]),o}function Zt(t){return P("<div/>",{id:t.aanFeatures.r?null:t.sTableId+"_processing",class:t.oClasses.sProcessing,role:"status"}).html(t.oLanguage.sProcessing).append("<div><div></div><div></div><div></div><div></div></div>").insertBefore(t.nTable)[0]}function D(t,e){t.oFeatures.bProcessing&&P(t.aanFeatures.r).css("display",e?"block":"none"),R(t,null,"processing",[t,e])}function Kt(t){var e,n,a,r,o,i,l,s,u,c,f,d,h=P(t.nTable),p=t.oScroll;return""===p.sX&&""===p.sY?t.nTable:(e=p.sX,n=p.sY,a=t.oClasses,o=(r=h.children("caption")).length?r[0]._captionSide:null,s=P(h[0].cloneNode(!1)),i=P(h[0].cloneNode(!1)),u=function(t){return t?M(t):null},(l=h.children("tfoot")).length||(l=null),s=P(f="<div/>",{class:a.sScrollWrapper}).append(P(f,{class:a.sScrollHead}).css({overflow:"hidden",position:"relative",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollHeadInner}).css({"box-sizing":"content-box",width:p.sXInner||"100%"}).append(s.removeAttr("id").css("margin-left",0).append("top"===o?r:null).append(h.children("thead"))))).append(P(f,{class:a.sScrollBody}).css({position:"relative",overflow:"auto",width:u(e)}).append(h)),l&&s.append(P(f,{class:a.sScrollFoot}).css({overflow:"hidden",border:0,width:e?u(e):"100%"}).append(P(f,{class:a.sScrollFootInner}).append(i.removeAttr("id").css("margin-left",0).append("bottom"===o?r:null).append(h.children("tfoot"))))),u=s.children(),c=u[0],f=u[1],d=l?u[2]:null,e&&P(f).on("scroll.DT",function(t){var e=this.scrollLeft;c.scrollLeft=e,l&&(d.scrollLeft=e)}),P(f).css("max-height",n),p.bCollapse||P(f).css("height",n),t.nScrollHead=c,t.nScrollBody=f,t.nScrollFoot=d,t.aoDrawCallback.push({fn:Qt,sName:"scrolling"}),s[0])}function Qt(n){function t(t){(t=t.style).paddingTop="0",t.paddingBottom="0",t.borderTopWidth="0",t.borderBottomWidth="0",t.height=0}var e,a,r,o,i,l=n.oScroll,s=l.sX,u=l.sXInner,c=l.sY,l=l.iBarWidth,f=P(n.nScrollHead),d=f[0].style,h=f.children("div"),p=h[0].style,h=h.children("table"),g=n.nScrollBody,b=P(g),m=g.style,S=P(n.nScrollFoot).children("div"),v=S.children("table"),y=P(n.nTHead),D=P(n.nTable),_=D[0],w=_.style,C=n.nTFoot?P(n.nTFoot):null,T=n.oBrowser,x=T.bScrollOversize,A=(H(n.aoColumns,"nTh"),[]),I=[],F=[],L=[],R=g.scrollHeight>g.clientHeight;n.scrollBarVis!==R&&n.scrollBarVis!==N?(n.scrollBarVis=R,O(n)):(n.scrollBarVis=R,D.children("thead, tfoot").remove(),C&&(R=C.clone().prependTo(D),i=C.find("tr"),a=R.find("tr"),R.find("[id]").removeAttr("id")),R=y.clone().prependTo(D),y=y.find("tr"),e=R.find("tr"),R.find("th, td").removeAttr("tabindex"),R.find("[id]").removeAttr("id"),s||(m.width="100%",f[0].style.width="100%"),P.each(Ct(n,R),function(t,e){r=rt(n,t),e.style.width=n.aoColumns[r].sWidth}),C&&k(function(t){t.style.width=""},a),f=D.outerWidth(),""===s?(w.width="100%",x&&(D.find("tbody").height()>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(D.outerWidth()-l)),f=D.outerWidth()):""!==u&&(w.width=M(u),f=D.outerWidth()),k(t,e),k(function(t){var e=j.getComputedStyle?j.getComputedStyle(t).width:M(P(t).width());F.push(t.innerHTML),A.push(e)},e),k(function(t,e){t.style.width=A[e]},y),P(e).css("height",0),C&&(k(t,a),k(function(t){L.push(t.innerHTML),I.push(M(P(t).css("width")))},a),k(function(t,e){t.style.width=I[e]},i),P(a).height(0)),k(function(t,e){t.innerHTML='<div class="dataTables_sizing">'+F[e]+"</div>",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=A[e]},e),C&&k(function(t,e){t.innerHTML='<div class="dataTables_sizing">'+L[e]+"</div>",t.childNodes[0].style.height="0",t.childNodes[0].style.overflow="hidden",t.style.width=I[e]},a),Math.round(D.outerWidth())<Math.round(f)?(o=g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y")?f+l:f,x&&(g.scrollHeight>g.offsetHeight||"scroll"==b.css("overflow-y"))&&(w.width=M(o-l)),""!==s&&""===u||W(n,1,"Possible column misalignment",6)):o="100%",m.width=M(o),d.width=M(o),C&&(n.nScrollFoot.style.width=M(o)),c||x&&(m.height=M(_.offsetHeight+l)),R=D.outerWidth(),h[0].style.width=M(R),p.width=M(R),y=D.height()>g.clientHeight||"scroll"==b.css("overflow-y"),p[i="padding"+(T.bScrollbarLeft?"Left":"Right")]=y?l+"px":"0px",C&&(v[0].style.width=M(R),S[0].style.width=M(R),S[0].style[i]=y?l+"px":"0px"),D.children("colgroup").insertBefore(D.children("thead")),b.trigger("scroll"),!n.bSorted&&!n.bFiltered||n._drawHold||(g.scrollTop=0))}function k(t,e,n){for(var a,r,o=0,i=0,l=e.length;i<l;){for(a=e[i].firstChild,r=n?n[i].firstChild:null;a;)1===a.nodeType&&(n?t(a,r,o):t(a,o),o++),a=a.nextSibling,r=n?r.nextSibling:null;i++}}var te=/<.*?>/g;function ee(t){var e,n,a=t.nTable,r=t.aoColumns,o=t.oScroll,i=o.sY,l=o.sX,o=o.sXInner,s=r.length,u=it(t,"bVisible"),c=P("th",t.nTHead),f=a.getAttribute("width"),d=a.parentNode,h=!1,p=t.oBrowser,g=p.bScrollOversize,b=a.style.width;for(b&&-1!==b.indexOf("%")&&(f=b),D=0;D<u.length;D++)null!==(e=r[u[D]]).sWidth&&(e.sWidth=ae(e.sWidthOrig,d),h=!0);if(g||!h&&!l&&!i&&s==T(t)&&s==c.length)for(D=0;D<s;D++){var m=rt(t,D);null!==m&&(r[m].sWidth=M(c.eq(D).width()))}else{var b=P(a).clone().css("visibility","hidden").removeAttr("id"),S=(b.find("tbody tr").remove(),P("<tr/>").appendTo(b.find("tbody")));for(b.find("thead, tfoot").remove(),b.append(P(t.nTHead).clone()).append(P(t.nTFoot).clone()),b.find("tfoot th, tfoot td").css("width",""),c=Ct(t,b.find("thead")[0]),D=0;D<u.length;D++)e=r[u[D]],c[D].style.width=null!==e.sWidthOrig&&""!==e.sWidthOrig?M(e.sWidthOrig):"",e.sWidthOrig&&l&&P(c[D]).append(P("<div/>").css({width:e.sWidthOrig,margin:0,padding:0,border:0,height:1}));if(t.aoData.length)for(D=0;D<u.length;D++)e=r[n=u[D]],P(re(t,n)).clone(!1).append(e.sContentPadding).appendTo(S);P("[name]",b).removeAttr("name");for(var v=P("<div/>").css(l||i?{position:"absolute",top:0,left:0,height:1,right:0,overflow:"hidden"}:{}).append(b).appendTo(d),y=(l&&o?b.width(o):l?(b.css("width","auto"),b.removeAttr("width"),b.width()<d.clientWidth&&f&&b.width(d.clientWidth)):i?b.width(d.clientWidth):f&&b.width(f),0),D=0;D<u.length;D++){var _=P(c[D]),w=_.outerWidth()-_.width(),_=p.bBounding?Math.ceil(c[D].getBoundingClientRect().width):_.outerWidth();y+=_,r[u[D]].sWidth=M(_-w)}a.style.width=M(y),v.remove()}f&&(a.style.width=M(f)),!f&&!l||t._reszEvt||(o=function(){P(j).on("resize.DT-"+t.sInstance,ne(function(){O(t)}))},g?setTimeout(o,1e3):o(),t._reszEvt=!0)}var ne=w.util.throttle;function ae(t,e){return t?(e=(t=P("<div/>").css("width",M(t)).appendTo(e||y.body))[0].offsetWidth,t.remove(),e):0}function re(t,e){var n,a=oe(t,e);return a<0?null:(n=t.aoData[a]).nTr?n.anCells[e]:P("<td/>").html(S(t,a,e,"display"))[0]}function oe(t,e){for(var n,a=-1,r=-1,o=0,i=t.aoData.length;o<i;o++)(n=(n=(n=S(t,o,e,"display")+"").replace(te,"")).replace(/ /g," ")).length>a&&(a=n.length,r=o);return r}function M(t){return null===t?"0px":"number"==typeof t?t<0?"0px":t+"px":t.match(/\d$/)?t+"px":t}function I(t){function e(t){t.length&&!Array.isArray(t[0])?h.push(t):P.merge(h,t)}var n,a,r,o,i,l,s,u=[],c=t.aoColumns,f=t.aaSortingFixed,d=P.isPlainObject(f),h=[];for(Array.isArray(f)&&e(f),d&&f.pre&&e(f.pre),e(t.aaSorting),d&&f.post&&e(f.post),n=0;n<h.length;n++)for(r=(o=c[s=h[n][a=0]].aDataSort).length;a<r;a++)l=c[i=o[a]].sType||"string",h[n]._idx===N&&(h[n]._idx=P.inArray(h[n][1],c[i].asSorting)),u.push({src:s,col:i,dir:h[n][1],index:h[n]._idx,type:l,formatter:w.ext.type.order[l+"-pre"]});return u}function ie(t){var e,n,a,r,c,f=[],u=w.ext.type.order,d=t.aoData,o=(t.aoColumns,0),i=t.aiDisplayMaster;for(lt(t),e=0,n=(c=I(t)).length;e<n;e++)(r=c[e]).formatter&&o++,fe(t,r.col);if("ssp"!=E(t)&&0!==c.length){for(e=0,a=i.length;e<a;e++)f[i[e]]=e;o===c.length?i.sort(function(t,e){for(var n,a,r,o,i=c.length,l=d[t]._aSortData,s=d[e]._aSortData,u=0;u<i;u++)if(0!=(r=(n=l[(o=c[u]).col])<(a=s[o.col])?-1:a<n?1:0))return"asc"===o.dir?r:-r;return(n=f[t])<(a=f[e])?-1:a<n?1:0}):i.sort(function(t,e){for(var n,a,r,o=c.length,i=d[t]._aSortData,l=d[e]._aSortData,s=0;s<o;s++)if(n=i[(r=c[s]).col],a=l[r.col],0!==(r=(u[r.type+"-"+r.dir]||u["string-"+r.dir])(n,a)))return r;return(n=f[t])<(a=f[e])?-1:a<n?1:0})}t.bSorted=!0}
vendor: 40,709 bytes, line 23156
23156function le(t){for(var e=t.aoColumns,n=I(t),a=t.oLanguage.oAria,r=0,o=e.length;r<o;r++){var i=e[r],l=i.asSorting,s=i.ariaTitle||i.sTitle.replace(/<.*?>/g,""),u=i.nTh;u.removeAttribute("aria-sort"),i=i.bSortable?s+("asc"===(0<n.length&&n[0].col==r&&(u.setAttribute("aria-sort","asc"==n[0].dir?"ascending":"descending"),l[n[0].index+1])||l[0])?a.sSortAscending:a.sSortDescending):s,u.setAttribute("aria-label",i)}}function se(t,e,n,a){function r(t,e){var n=t._idx;return(n=n===N?P.inArray(t[1],s):n)+1<s.length?n+1:e?null:0}var o,i=t.aoColumns[e],l=t.aaSorting,s=i.asSorting;"number"==typeof l[0]&&(l=t.aaSorting=[l]),n&&t.oFeatures.bSortMulti?-1!==(i=P.inArray(e,H(l,"0")))?null===(o=null===(o=r(l[i],!0))&&1===l.length?0:o)?l.splice(i,1):(l[i][1]=s[o],l[i]._idx=o):(l.push([e,s[0],0]),l[l.length-1]._idx=0):l.length&&l[0][0]==e?(o=r(l[0]),l.length=1,l[0][1]=s[o],l[0]._idx=o):(l.length=0,l.push([e,s[0]]),l[0]._idx=0),u(t),"function"==typeof a&&a(t)}function ue(e,t,n,a){var r=e.aoColumns[n];me(t,{},function(t){!1!==r.bSortable&&(e.oFeatures.bProcessing?(D(e,!0),setTimeout(function(){se(e,n,t.shiftKey,a),"ssp"!==E(e)&&D(e,!1)},0)):se(e,n,t.shiftKey,a))})}function ce(t){var e,n,a,r=t.aLastSort,o=t.oClasses.sSortColumn,i=I(t),l=t.oFeatures;if(l.bSort&&l.bSortClasses){for(e=0,n=r.length;e<n;e++)a=r[e].src,P(H(t.aoData,"anCells",a)).removeClass(o+(e<2?e+1:3));for(e=0,n=i.length;e<n;e++)a=i[e].src,P(H(t.aoData,"anCells",a)).addClass(o+(e<2?e+1:3))}t.aLastSort=i}function fe(t,e){for(var n,a,r,o=t.aoColumns[e],i=w.ext.order[o.sSortDataType],l=(i&&(n=i.call(t.oInstance,t,e,ot(t,e))),w.ext.type.order[o.sType+"-pre"]),s=0,u=t.aoData.length;s<u;s++)(a=t.aoData[s])._aSortData||(a._aSortData=[]),a._aSortData[e]&&!i||(r=i?n[s]:S(t,s,e,"sort"),a._aSortData[e]=l?l(r):r)}function de(n){var t;n._bLoadingState||(t={time:+new Date,start:n._iDisplayStart,length:n._iDisplayLength,order:P.extend(!0,[],n.aaSorting),search:Et(n.oPreviousSearch),columns:P.map(n.aoColumns,function(t,e){return{visible:t.bVisible,search:Et(n.aoPreSearchCols[e])}})},n.oSavedState=t,R(n,"aoStateSaveParams","stateSaveParams",[n,t]),n.oFeatures.bStateSave&&!n.bDestroying&&n.fnStateSaveCallback.call(n.oInstance,n,t))}function he(e,t,n){var a;if(e.oFeatures.bStateSave)return(a=e.fnStateLoadCallback.call(e.oInstance,e,function(t){pe(e,t,n)}))!==N&&pe(e,a,n),!0;n()}function pe(n,t,e){var a,r,o=n.aoColumns,i=(n._bLoadingState=!0,n._bInitComplete?new w.Api(n):null);if(t&&t.time){var l=R(n,"aoStateLoadParams","stateLoadParams",[n,t]);if(-1!==P.inArray(!1,l))n._bLoadingState=!1;else{l=n.iStateDuration;if(0<l&&t.time<+new Date-1e3*l)n._bLoadingState=!1;else if(t.columns&&o.length!==t.columns.length)n._bLoadingState=!1;else{if(n.oLoadedState=P.extend(!0,{},t),t.length!==N&&(i?i.page.len(t.length):n._iDisplayLength=t.length),t.start!==N&&(null===i?(n._iDisplayStart=t.start,n.iInitDisplayStart=t.start):Yt(n,t.start/n._iDisplayLength)),t.order!==N&&(n.aaSorting=[],P.each(t.order,function(t,e){n.aaSorting.push(e[0]>=o.length?[0,e[1]]:e)})),t.search!==N&&P.extend(n.oPreviousSearch,Bt(t.search)),t.columns){for(a=0,r=t.columns.length;a<r;a++){var s=t.columns[a];s.visible!==N&&(i?i.column(a).visible(s.visible,!1):o[a].bVisible=s.visible),s.search!==N&&P.extend(n.aoPreSearchCols[a],Bt(s.search))}i&&i.columns.adjust()}n._bLoadingState=!1,R(n,"aoStateLoaded","stateLoaded",[n,t])}}}else n._bLoadingState=!1;e()}function ge(t){var e=w.settings,t=P.inArray(t,H(e,"nTable"));return-1!==t?e[t]:null}function W(t,e,n,a){if(n="DataTables warning: "+(t?"table id="+t.sTableId+" - ":"")+n,a&&(n+=". For more information about this error, please see http://datatables.net/tn/"+a),e)j.console&&console.log&&console.log(n);else{e=w.ext,e=e.sErrMode||e.errMode;if(t&&R(t,null,"error",[t,a,n]),"alert"==e)alert(n);else{if("throw"==e)throw new Error(n);"function"==typeof e&&e(t,a,n)}}}function F(n,a,t,e){Array.isArray(t)?P.each(t,function(t,e){Array.isArray(e)?F(n,a,e[0],e[1]):F(n,a,e)}):(e===N&&(e=t),a[t]!==N&&(n[e]=a[t]))}function be(t,e,n){var a,r;for(r in e)e.hasOwnProperty(r)&&(a=e[r],P.isPlainObject(a)?(P.isPlainObject(t[r])||(t[r]={}),P.extend(!0,t[r],a)):n&&"data"!==r&&"aaData"!==r&&Array.isArray(a)?t[r]=a.slice():t[r]=a);return t}function me(e,t,n){P(e).on("click.DT",t,function(t){P(e).trigger("blur"),n(t)}).on("keypress.DT",t,function(t){13===t.which&&(t.preventDefault(),n(t))}).on("selectstart.DT",function(){return!1})}function L(t,e,n,a){n&&t[e].push({fn:n,sName:a})}function R(n,t,e,a){var r=[];return t&&(r=P.map(n[t].slice().reverse(),function(t,e){return t.fn.apply(n.oInstance,a)})),null!==e&&(t=P.Event(e+".dt"),(e=P(n.nTable)).trigger(t,a),0===e.parents("body").length&&P("body").trigger(t,a),r.push(t.result)),r}function Se(t){var e=t._iDisplayStart,n=t.fnDisplayEnd(),a=t._iDisplayLength;n<=e&&(e=n-a),e-=e%a,t._iDisplayStart=e=-1===a||e<0?0:e}function ve(t,e){var t=t.renderer,n=w.ext.renderer[e];return P.isPlainObject(t)&&t[e]?n[t[e]]||n._:"string"==typeof t&&n[t]||n._}function E(t){return t.oFeatures.bServerSide?"ssp":t.ajax||t.sAjaxSource?"ajax":"dom"}function ye(t,n){var a;return Array.isArray(t)?P.map(t,function(t){return ye(t,n)}):"number"==typeof t?[n[t]]:(a=P.map(n,function(t,e){return t.nTable}),P(a).filter(t).map(function(t){var e=P.inArray(this,a);return n[e]}).toArray())}function De(r,o,t){var e,n;t&&(e=new B(r)).one("draw",function(){t(e.ajax.json())}),"ssp"==E(r)?u(r,o):(D(r,!0),(n=r.jqXHR)&&4!==n.readyState&&n.abort(),Tt(r,[],function(t){pt(r);for(var e=Ft(r,t),n=0,a=e.length;n<a;n++)x(r,e[n]);u(r,o),D(r,!1)}))}function _e(t,e,n,a,r){for(var o,i,l,s,u=[],c=typeof e,f=0,d=(e=e&&"string"!=c&&"function"!=c&&e.length!==N?e:[e]).length;f<d;f++)for(l=0,s=(i=e[f]&&e[f].split&&!e[f].match(/[\[\(:]/)?e[f].split(","):[e[f]]).length;l<s;l++)(o=n("string"==typeof i[l]?i[l].trim():i[l]))&&o.length&&(u=u.concat(o));var h=p.selector[t];if(h.length)for(f=0,d=h.length;f<d;f++)u=h[f](a,r,u);return z(u)}function we(t){return(t=t||{}).filter&&t.search===N&&(t.search=t.filter),P.extend({search:"none",order:"current",page:"all"},t)}function Ce(t){for(var e=0,n=t.length;e<n;e++)if(0<t[e].length)return t[0]=t[e],t[0].length=1,t.length=1,t.context=[t.context[e]],t;return t.length=0,t}function Te(o,t,e,n){function i(t,e){var n;if(Array.isArray(t)||t instanceof P)for(var a=0,r=t.length;a<r;a++)i(t[a],e);else t.nodeName&&"tr"===t.nodeName.toLowerCase()?l.push(t):(n=P("<tr><td></td></tr>").addClass(e),P("td",n).addClass(e).html(t)[0].colSpan=T(o),l.push(n[0]))}var l=[];i(e,n),t._details&&t._details.detach(),t._details=P(l),t._detailsShow&&t._details.insertAfter(t.nTr)}function xe(t,e){var n=t.context;if(n.length&&t.length){var a=n[0].aoData[t[0]];if(a._details){(a._detailsShow=e)?(a._details.insertAfter(a.nTr),P(a.nTr).addClass("dt-hasChild")):(a._details.detach(),P(a.nTr).removeClass("dt-hasChild")),R(n[0],null,"childRow",[e,t.row(t[0])]);var s=n[0],r=new B(s),a=".dt.DT_details",e="draw"+a,t="column-sizing"+a,a="destroy"+a,u=s.aoData;if(r.off(e+" "+t+" "+a),H(u,"_details").length>0){r.on(e,function(t,e){if(s!==e)return;r.rows({page:"current"}).eq(0).each(function(t){var e=u[t];if(e._detailsShow)e._details.insertAfter(e.nTr)})});r.on(t,function(t,e,n,a){if(s!==e)return;var r,o=T(e);for(var i=0,l=u.length;i<l;i++){r=u[i];if(r._details)r._details.children("td[colspan]").attr("colspan",o)}});r.on(a,function(t,e){if(s!==e)return;for(var n=0,a=u.length;n<a;n++)if(u[n]._details)Re(r,n)})}Le(n)}}}function Ae(t,e,n,a,r){for(var o=[],i=0,l=r.length;i<l;i++)o.push(S(t,r[i],e));return o}var Ie=[],o=Array.prototype,B=function(t,e){if(!(this instanceof B))return new B(t,e);function n(t){var e,n,a,r;t=t,a=w.settings,r=P.map(a,function(t,e){return t.nTable}),(t=t?t.nTable&&t.oApi?[t]:t.nodeName&&"table"===t.nodeName.toLowerCase()?-1!==(e=P.inArray(t,r))?[a[e]]:null:t&&"function"==typeof t.settings?t.settings().toArray():("string"==typeof t?n=P(t):t instanceof P&&(n=t),n?n.map(function(t){return-1!==(e=P.inArray(this,r))?a[e]:null}).toArray():void 0):[])&&o.push.apply(o,t)}var o=[];if(Array.isArray(t))for(var a=0,r=t.length;a<r;a++)n(t[a]);else n(t);this.context=z(o),e&&P.merge(this,e),this.selector={rows:null,cols:null,opts:null},B.extend(this,this,Ie)},Fe=(w.Api=B,P.extend(B.prototype,{any:function(){return 0!==this.count()},concat:o.concat,context:[],count:function(){return this.flatten().length},each:function(t){for(var e=0,n=this.length;e<n;e++)t.call(this,this[e],e,this);return this},eq:function(t){var e=this.context;return e.length>t?new B(e[t],this[t]):null},filter:function(t){var e=[];if(o.filter)e=o.filter.call(this,t,this);else for(var n=0,a=this.length;n<a;n++)t.call(this,this[n],n,this)&&e.push(this[n]);return new B(this.context,e)},flatten:function(){var t=[];return new B(this.context,t.concat.apply(t,this.toArray()))},join:o.join,indexOf:o.indexOf||function(t,e){for(var n=e||0,a=this.length;n<a;n++)if(this[n]===t)return n;return-1},iterator:function(t,e,n,a){var r,o,i,l,s,u,c,f,d=[],h=this.context,p=this.selector;for("string"==typeof t&&(a=n,n=e,e=t,t=!1),o=0,i=h.length;o<i;o++){var g=new B(h[o]);if("table"===e)(r=n.call(g,h[o],o))!==N&&d.push(r);else if("columns"===e||"rows"===e)(r=n.call(g,h[o],this[o],o))!==N&&d.push(r);else if("column"===e||"column-rows"===e||"row"===e||"cell"===e)for(c=this[o],"column-rows"===e&&(u=Fe(h[o],p.opts)),l=0,s=c.length;l<s;l++)f=c[l],(r="cell"===e?n.call(g,h[o],f.row,f.column,o,l):n.call(g,h[o],f,o,l,u))!==N&&d.push(r)}return d.length||a?((t=(a=new B(h,t?d.concat.apply([],d):d)).selector).rows=p.rows,t.cols=p.cols,t.opts=p.opts,a):this},lastIndexOf:o.lastIndexOf||function(t,e){return this.indexOf.apply(this.toArray.reverse(),arguments)},length:0,map:function(t){var e=[];if(o.map)e=o.map.call(this,t,this);else for(var n=0,a=this.length;n<a;n++)e.push(t.call(this,this[n],n));return new B(this.context,e)},pluck:function(t){var e=w.util.get(t);return this.map(function(t){return e(t)})},pop:o.pop,push:o.push,reduce:o.reduce||function(t,e){return et(this,t,e,0,this.length,1)},reduceRight:o.reduceRight||function(t,e){return et(this,t,e,this.length-1,-1,-1)},reverse:o.reverse,selector:null,shift:o.shift,slice:function(){return new B(this.context,this)},sort:o.sort,splice:o.splice,toArray:function(){return o.slice.call(this)},to$:function(){return P(this)},toJQuery:function(){return P(this)},unique:function(){return new B(this.context,z(this))},unshift:o.unshift}),B.extend=function(t,e,n){if(n.length&&e&&(e instanceof B||e.__dt_wrapper))for(var a,r=0,o=n.length;r<o;r++)e[(a=n[r]).name]="function"===a.type?function(e,n,a){return function(){var t=n.apply(e,arguments);return B.extend(t,t,a.methodExt),t}}(t,a.val,a):"object"===a.type?{}:a.val,e[a.name].__dt_wrapper=!0,B.extend(t,e[a.name],a.propExt)},B.register=e=function(t,e){if(Array.isArray(t))for(var n=0,a=t.length;n<a;n++)B.register(t[n],e);else for(var r=t.split("."),o=Ie,i=0,l=r.length;i<l;i++){var s,u,c=function(t,e){for(var n=0,a=t.length;n<a;n++)if(t[n].name===e)return t[n];return null}(o,u=(s=-1!==r[i].indexOf("()"))?r[i].replace("()",""):r[i]);c||o.push(c={name:u,val:{},methodExt:[],propExt:[],type:"object"}),i===l-1?(c.val=e,c.type="function"==typeof e?"function":P.isPlainObject(e)?"object":"other"):o=s?c.methodExt:c.propExt}},B.registerPlural=t=function(t,e,n){B.register(t,n),B.register(e,function(){var t=n.apply(this,arguments);return t===this?this:t instanceof B?t.length?Array.isArray(t[0])?new B(t.context,t[0]):t[0]:N:t})},e("tables()",function(t){return t!==N&&null!==t?new B(ye(t,this.context)):this}),e("table()",function(t){var t=this.tables(t),e=t.context;return e.length?new B(e[0]):t}),t("tables().nodes()","table().node()",function(){return this.iterator("table",function(t){return t.nTable},1)}),t("tables().body()","table().body()",function(){return this.iterator("table",function(t){return t.nTBody},1)}),t("tables().header()","table().header()",function(){return this.iterator("table",function(t){return t.nTHead},1)}),t("tables().footer()","table().footer()",function(){return this.iterator("table",function(t){return t.nTFoot},1)}),t("tables().containers()","table().container()",function(){return this.iterator("table",function(t){return t.nTableWrapper},1)}),e("draw()",function(e){return this.iterator("table",function(t){"page"===e?v(t):u(t,!1===(e="string"==typeof e?"full-hold"!==e:e))})}),e("page()",function(e){return e===N?this.page.info().page:this.iterator("table",function(t){Yt(t,e)})}),e("page.info()",function(t){var e,n,a,r,o;return 0===this.context.length?N:(n=(e=this.context[0])._iDisplayStart,a=e.oFeatures.bPaginate?e._iDisplayLength:-1,r=e.fnRecordsDisplay(),{page:(o=-1===a)?0:Math.floor(n/a),pages:o?1:Math.ceil(r/a),start:n,end:e.fnDisplayEnd(),length:a,recordsTotal:e.fnRecordsTotal(),recordsDisplay:r,serverSide:"ssp"===E(e)})}),e("page.len()",function(e){return e===N?0!==this.context.length?this.context[0]._iDisplayLength:N:this.iterator("table",function(t){Gt(t,e)})}),e("ajax.json()",function(){var t=this.context;if(0<t.length)return t[0].json}),e("ajax.params()",function(){var t=this.context;if(0<t.length)return t[0].oAjaxData}),e("ajax.reload()",function(e,n){return this.iterator("table",function(t){De(t,!1===n,e)})}),e("ajax.url()",function(e){var t=this.context;return e===N?0===t.length?N:(t=t[0]).ajax?P.isPlainObject(t.ajax)?t.ajax.url:t.ajax:t.sAjaxSource:this.iterator("table",function(t){P.isPlainObject(t.ajax)?t.ajax.url=e:t.ajax=e})}),e("ajax.url().load()",function(e,n){return this.iterator("table",function(t){De(t,!1===n,e)})}),function(t,e){var n,a=[],r=t.aiDisplay,o=t.aiDisplayMaster,i=e.search,l=e.order,e=e.page;if("ssp"==E(t))return"removed"===i?[]:f(0,o.length);if("current"==e)for(u=t._iDisplayStart,c=t.fnDisplayEnd();u<c;u++)a.push(r[u]);else if("current"==l||"applied"==l){if("none"==i)a=o.slice();else if("applied"==i)a=r.slice();else if("removed"==i){for(var s={},u=0,c=r.length;u<c;u++)s[r[u]]=null;a=P.map(o,function(t){return s.hasOwnProperty(t)?null:t})}}else if("index"==l||"original"==l)for(u=0,c=t.aoData.length;u<c;u++)("none"==i||-1===(n=P.inArray(u,r))&&"removed"==i||0<=n&&"applied"==i)&&a.push(u);return a}),Le=(e("rows()",function(e,n){e===N?e="":P.isPlainObject(e)&&(n=e,e=""),n=we(n);var t=this.iterator("table",function(t){return _e("row",e,function(n){var t=d(n),a=r.aoData;if(null!==t&&!o)return[t];if(i=i||Fe(r,o),null!==t&&-1!==P.inArray(t,i))return[t];if(null===n||n===N||""===n)return i;if("function"==typeof n)return P.map(i,function(t){var e=a[t];return n(t,e._aData,e.nTr)?t:null});if(n.nodeName)return t=n._DT_RowIndex,e=n._DT_CellIndex,t!==N?a[t]&&a[t].nTr===n?[t]:[]:e?a[e.row]&&a[e.row].nTr===n.parentNode?[e.row]:[]:(t=P(n).closest("*[data-dt-row]")).length?[t.data("dt-row")]:[];if("string"==typeof n&&"#"===n.charAt(0)){var e=r.aIds[n.replace(/^#/,"")];if(e!==N)return[e.idx]}t=_(m(r.aoData,i,"nTr"));return P(t).filter(n).map(function(){return this._DT_RowIndex}).toArray()},r=t,o=n);var r,o,i},1);return t.selector.rows=e,t.selector.opts=n,t}),e("rows().nodes()",function(){return this.iterator("row",function(t,e){return t.aoData[e].nTr||N},1)}),e("rows().data()",function(){return this.iterator(!0,"rows",function(t,e){return m(t.aoData,e,"_aData")},1)}),t("rows().cache()","row().cache()",function(n){return this.iterator("row",function(t,e){t=t.aoData[e];return"search"===n?t._aFilterData:t._aSortData},1)}),t("rows().invalidate()","row().invalidate()",function(n){return this.iterator("row",function(t,e){bt(t,e,n)})}),t("rows().indexes()","row().index()",function(){return this.iterator("row",function(t,e){return e},1)}),t("rows().ids()","row().id()",function(t){for(var e=[],n=this.context,a=0,r=n.length;a<r;a++)for(var o=0,i=this[a].length;o<i;o++){var l=n[a].rowIdFn(n[a].aoData[this[a][o]]._aData);e.push((!0===t?"#":"")+l)}return new B(n,e)}),t("rows().remove()","row().remove()",function(){var f=this;return this.iterator("row",function(t,e,n){var a,r,o,i,l,s,u=t.aoData,c=u[e];for(u.splice(e,1),a=0,r=u.length;a<r;a++)if(s=(l=u[a]).anCells,null!==l.nTr&&(l.nTr._DT_RowIndex=a),null!==s)for(o=0,i=s.length;o<i;o++)s[o]._DT_CellIndex.row=a;gt(t.aiDisplayMaster,e),gt(t.aiDisplay,e),gt(f[n],e,!1),0<t._iRecordsDisplay&&t._iRecordsDisplay--,Se(t);n=t.rowIdFn(c._aData);n!==N&&delete t.aIds[n]}),this.iterator("table",function(t){for(var e=0,n=t.aoData.length;e<n;e++)t.aoData[e].idx=e}),this}),e("rows.add()",function(o){var t=this.iterator("table",function(t){for(var e,n=[],a=0,r=o.length;a<r;a++)(e=o[a]).nodeName&&"TR"===e.nodeName.toUpperCase()?n.push(ut(t,e)[0]):n.push(x(t,e));return n},1),e=this.rows(-1);return e.pop(),P.merge(e,t),e}),e("row()",function(t,e){return Ce(this.rows(t,e))}),e("row().data()",function(t){var e,n=this.context;return t===N?n.length&&this.length?n[0].aoData[this[0]]._aData:N:((e=n[0].aoData[this[0]])._aData=t,Array.isArray(t)&&e.nTr&&e.nTr.id&&b(n[0].rowId)(t,e.nTr.id),bt(n[0],this[0],"data"),this)}),e("row().node()",function(){var t=this.context;return t.length&&this.length&&t[0].aoData[this[0]].nTr||null}),e("row.add()",function(e){e instanceof P&&e.length&&(e=e[0]);var t=this.iterator("table",function(t){return e.nodeName&&"TR"===e.nodeName.toUpperCase()?ut(t,e)[0]:x(t,e)});return this.row(t[0])}),P(y).on("plugin-init.dt",function(t,e){var n=new B(e),a="on-plugin-init",r="stateSaveParams."+a,o="destroy. "+a,a=(n.on(r,function(t,e,n){for(var a=e.rowIdFn,r=e.aoData,o=[],i=0;i<r.length;i++)r[i]._detailsShow&&o.push("#"+a(r[i]._aData));n.childRows=o}),n.on(o,function(){n.off(r+" "+o)}),n.state.loaded());a&&a.childRows&&n.rows(P.map(a.childRows,function(t){return t.replace(/:/g,"\\:")})).every(function(){R(e,null,"requestChild",[this])})}),w.util.throttle(function(t){de(t[0])},500)),Re=function(t,e){var n=t.context;n.length&&(e=n[0].aoData[e!==N?e:t[0]])&&e._details&&(e._details.remove(),e._detailsShow=N,e._details=N,P(e.nTr).removeClass("dt-hasChild"),Le(n))},Pe="row().child",je=Pe+"()",Ne=(e(je,function(t,e){var n=this.context;return t===N?n.length&&this.length?n[0].aoData[this[0]]._details:N:(!0===t?this.child.show():!1===t?Re(this):n.length&&this.length&&Te(n[0],n[0].aoData[this[0]],t,e),this)}),e([Pe+".show()",je+".show()"],function(t){return xe(this,!0),this}),e([Pe+".hide()",je+".hide()"],function(){return xe(this,!1),this}),e([Pe+".remove()",je+".remove()"],function(){return Re(this),this}),e(Pe+".isShown()",function(){var t=this.context;return t.length&&this.length&&t[0].aoData[this[0]]._detailsShow||!1}),/^([^:]+):(name|visIdx|visible)$/),He=(e("columns()",function(n,a){n===N?n="":P.isPlainObject(n)&&(a=n,n=""),a=we(a);var t=this.iterator("table",function(t){return e=n,l=a,s=(i=t).aoColumns,u=H(s,"sName"),c=H(s,"nTh"),_e("column",e,function(n){var a,t=d(n);if(""===n)return f(s.length);if(null!==t)return[0<=t?t:s.length+t];if("function"==typeof n)return a=Fe(i,l),P.map(s,function(t,e){return n(e,Ae(i,e,0,0,a),c[e])?e:null});var r="string"==typeof n?n.match(Ne):"";if(r)switch(r[2]){case"visIdx":case"visible":var e,o=parseInt(r[1],10);return o<0?[(e=P.map(s,function(t,e){return t.bVisible?e:null}))[e.length+o]]:[rt(i,o)];case"name":return P.map(u,function(t,e){return t===r[1]?e:null});default:return[]}return n.nodeName&&n._DT_CellIndex?[n._DT_CellIndex.column]:(t=P(c).filter(n).map(function(){return P.inArray(this,c)}).toArray()).length||!n.nodeName?t:(t=P(n).closest("*[data-dt-column]")).length?[t.data("dt-column")]:[]},i,l);var i,e,l,s,u,c},1);return t.selector.cols=n,t.selector.opts=a,t}),t("columns().header()","column().header()",function(t,e){return this.iterator("column",function(t,e){return t.aoColumns[e].nTh},1)}),t("columns().footer()","column().footer()",function(t,e){return this.iterator("column",function(t,e){return t.aoColumns[e].nTf},1)}),t("columns().data()","column().data()",function(){return this.iterator("column-rows",Ae,1)}),t("columns().dataSrc()","column().dataSrc()",function(){return this.iterator("column",function(t,e){return t.aoColumns[e].mData},1)}),t("columns().cache()","column().cache()",function(o){return this.iterator("column-rows",function(t,e,n,a,r){return m(t.aoData,r,"search"===o?"_aFilterData":"_aSortData",e)},1)}),t("columns().nodes()","column().nodes()",function(){return this.iterator("column-rows",function(t,e,n,a,r){return m(t.aoData,r,"anCells",e)},1)}),t("columns().visible()","column().visible()",function(f,n){var e=this,t=this.iterator("column",function(t,e){if(f===N)return t.aoColumns[e].bVisible;var n,a,r=e,e=f,o=t.aoColumns,i=o[r],l=t.aoData;if(e===N)i.bVisible;else if(i.bVisible!==e){if(e)for(var s=P.inArray(!0,H(o,"bVisible"),r+1),u=0,c=l.length;u<c;u++)a=l[u].nTr,n=l[u].anCells,a&&a.insertBefore(n[r],n[s]||null);else P(H(t.aoData,"anCells",r)).detach();i.bVisible=e}});return f!==N&&this.iterator("table",function(t){Dt(t,t.aoHeader),Dt(t,t.aoFooter),t.aiDisplay.length||P(t.nTBody).find("td[colspan]").attr("colspan",T(t)),de(t),e.iterator("column",function(t,e){R(t,null,"column-visibility",[t,e,f,n])}),n!==N&&!n||e.columns.adjust()}),t}),t("columns().indexes()","column().index()",function(n){return this.iterator("column",function(t,e){return"visible"===n?ot(t,e):e},1)}),e("columns.adjust()",function(){return this.iterator("table",function(t){O(t)},1)}),e("column.index()",function(t,e){var n;if(0!==this.context.length)return n=this.context[0],"fromVisible"===t||"toData"===t?rt(n,e):"fromData"===t||"toVisible"===t?ot(n,e):void 0}),e("column()",function(t,e){return Ce(this.columns(t,e))}),e("cells()",function(g,t,b){var a,r,o,i,l,s,e;return P.isPlainObject(g)&&(g.row===N?(b=g,g=null):(b=t,t=null)),P.isPlainObject(t)&&(b=t,t=null),null===t||t===N?this.iterator("table",function(t){return a=t,t=g,e=we(b),f=a.aoData,d=Fe(a,e),n=_(m(f,d,"anCells")),h=P(Y([],n)),p=a.aoColumns.length,_e("cell",t,function(t){var e,n="function"==typeof t;if(null===t||t===N||n){for(o=[],i=0,l=d.length;i<l;i++)for(r=d[i],s=0;s<p;s++)u={row:r,column:s},(!n||(c=f[r],t(u,S(a,r,s),c.anCells?c.anCells[s]:null)))&&o.push(u);return o}return P.isPlainObject(t)?t.column!==N&&t.row!==N&&-1!==P.inArray(t.row,d)?[t]:[]:(e=h.filter(t).map(function(t,e){return{row:e._DT_CellIndex.row,column:e._DT_CellIndex.column}}).toArray()).length||!t.nodeName?e:(c=P(t).closest("*[data-dt-row]")).length?[{row:c.data("dt-row"),column:c.data("dt-column")}]:[]},a,e);var a,e,r,o,i,l,s,u,c,f,d,n,h,p}):(e=b?{page:b.page,order:b.order,search:b.search}:{},a=this.columns(t,e),r=this.rows(g,e),e=this.iterator("table",function(t,e){var n=[];for(o=0,i=r[e].length;o<i;o++)for(l=0,s=a[e].length;l<s;l++)n.push({row:r[e][o],column:a[e][l]});return n},1),e=b&&b.selected?this.cells(e,b):e,P.extend(e.selector,{cols:t,rows:g,opts:b}),e)}),t("cells().nodes()","cell().node()",function(){return this.iterator("cell",function(t,e,n){t=t.aoData[e];return t&&t.anCells?t.anCells[n]:N},1)}),e("cells().data()",function(){return this.iterator("cell",function(t,e,n){return S(t,e,n)},1)}),t("cells().cache()","cell().cache()",function(a){return a="search"===a?"_aFilterData":"_aSortData",this.iterator("cell",function(t,e,n){return t.aoData[e][a][n]},1)}),t("cells().render()","cell().render()",function(a){return this.iterator("cell",function(t,e,n){return S(t,e,n,a)},1)}),t("cells().indexes()","cell().index()",function(){return this.iterator("cell",function(t,e,n){return{row:e,column:n,columnVisible:ot(t,n)}},1)}),t("cells().invalidate()","cell().invalidate()",function(a){return this.iterator("cell",function(t,e,n){bt(t,e,a,n)})}),e("cell()",function(t,e,n){return Ce(this.cells(t,e,n))}),e("cell().data()",function(t){var e=this.context,n=this[0];return t===N?e.length&&n.length?S(e[0],n[0].row,n[0].column):N:(ct(e[0],n[0].row,n[0].column,t),bt(e[0],n[0].row,"data",n[0].column),this)}),e("order()",function(e,t){var n=this.context;return e===N?0!==n.length?n[0].aaSorting:N:("number"==typeof e?e=[[e,t]]:e.length&&!Array.isArray(e[0])&&(e=Array.prototype.slice.call(arguments)),this.iterator("table",function(t){t.aaSorting=e.slice()}))}),e("order.listener()",function(e,n,a){return this.iterator("table",function(t){ue(t,e,n,a)})}),e("order.fixed()",function(e){var t;return e?this.iterator("table",function(t){t.aaSortingFixed=P.extend(!0,{},e)}):(t=(t=this.context).length?t[0].aaSortingFixed:N,Array.isArray(t)?{pre:t}:t)}),e(["columns().order()","column().order()"],function(a){var r=this;return this.iterator("table",function(t,e){var n=[];P.each(r[e],function(t,e){n.push([e,a])}),t.aaSorting=n})}),e("search()",function(e,n,a,r){var t=this.context;return e===N?0!==t.length?t[0].oPreviousSearch.sSearch:N:this.iterator("table",function(t){t.oFeatures.bFilter&&Rt(t,P.extend({},t.oPreviousSearch,{sSearch:e+"",bRegex:null!==n&&n,bSmart:null===a||a,bCaseInsensitive:null===r||r}),1)})}),t("columns().search()","column().search()",function(a,r,o,i){return this.iterator("column",function(t,e){var n=t.aoPreSearchCols;if(a===N)return n[e].sSearch;t.oFeatures.bFilter&&(P.extend(n[e],{sSearch:a+"",bRegex:null!==r&&r,bSmart:null===o||o,bCaseInsensitive:null===i||i}),Rt(t,t.oPreviousSearch,1))})}),e("state()",function(){return this.context.length?this.context[0].oSavedState:null}),e("state.clear()",function(){return this.iterator("table",function(t){t.fnStateSaveCallback.call(t.oInstance,t,{})})}),e("state.loaded()",function(){return this.context.length?this.context[0].oLoadedState:null}),e("state.save()",function(){return this.iterator("table",function(t){de(t)})}),w.use=function(t,e){"lib"===e||t.fn?P=t:"win"!=e&&!t.document||(y=(j=t).document)},w.factory=function(t,e){var n=!1;return t&&t.document&&(y=(j=t).document),e&&e.fn&&e.fn.jquery&&(P=e,n=!0),n},w.versionCheck=w.fnVersionCheck=function(t){for(var e,n,a=w.version.split("."),r=t.split("."),o=0,i=r.length;o<i;o++)if((e=parseInt(a[o],10)||0)!==(n=parseInt(r[o],10)||0))return n<e;return!0},w.isDataTable=w.fnIsDataTable=function(t){var r=P(t).get(0),o=!1;return t instanceof w.Api||(P.each(w.settings,function(t,e){var n=e.nScrollHead?P("table",e.nScrollHead)[0]:null,a=e.nScrollFoot?P("table",e.nScrollFoot)[0]:null;e.nTable!==r&&n!==r&&a!==r||(o=!0)}),o)},w.tables=w.fnTables=function(e){var t=!1,n=(P.isPlainObject(e)&&(t=e.api,e=e.visible),P.map(w.settings,function(t){if(!e||P(t.nTable).is(":visible"))return t.nTable}));return t?new B(n):n},w.camelToHungarian=C,e("$()",function(t,e){e=this.rows(e).nodes(),e=P(e);return P([].concat(e.filter(t).toArray(),e.find(t).toArray()))}),P.each(["on","one","off"],function(t,n){e(n+"()",function(){var t=Array.prototype.slice.call(arguments),e=(t[0]=P.map(t[0].split(/\s/),function(t){return t.match(/\.dt\b/)?t:t+".dt"}).join(" "),P(this.tables().nodes()));return e[n].apply(e,t),this})}),e("clear()",function(){return this.iterator("table",function(t){pt(t)})}),e("settings()",function(){return new B(this.context,this.context)}),e("init()",function(){var t=this.context;return t.length?t[0].oInit:null}),e("data()",function(){return this.iterator("table",function(t){return H(t.aoData,"_aData")}).flatten()}),e("destroy()",function(c){return c=c||!1,this.iterator("table",function(e){var n,t=e.oClasses,a=e.nTable,r=e.nTBody,o=e.nTHead,i=e.nTFoot,l=P(a),r=P(r),s=P(e.nTableWrapper),u=P.map(e.aoData,function(t){return t.nTr}),i=(e.bDestroying=!0,R(e,"aoDestroyCallback","destroy",[e]),c||new B(e).columns().visible(!0),s.off(".DT").find(":not(tbody *)").off(".DT"),P(j).off(".DT-"+e.sInstance),a!=o.parentNode&&(l.children("thead").detach(),l.append(o)),i&&a!=i.parentNode&&(l.children("tfoot").detach(),l.append(i)),e.aaSorting=[],e.aaSortingFixed=[],ce(e),P(u).removeClass(e.asStripeClasses.join(" ")),P("th, td",o).removeClass(t.sSortable+" "+t.sSortableAsc+" "+t.sSortableDesc+" "+t.sSortableNone),r.children().detach(),r.append(u),e.nTableWrapper.parentNode),o=c?"remove":"detach",u=(l[o](),s[o](),!c&&i&&(i.insertBefore(a,e.nTableReinsertBefore),l.css("width",e.sDestroyWidth).removeClass(t.sTable),n=e.asDestroyStripes.length)&&r.children().each(function(t){P(this).addClass(e.asDestroyStripes[t%n])}),P.inArray(e,w.settings));-1!==u&&w.settings.splice(u,1)})}),P.each(["column","row","cell"],function(t,s){e(s+"s().every()",function(o){var i=this.selector.opts,l=this;return this.iterator(s,function(t,e,n,a,r){o.call(l[s](e,"cell"===s?n:i,"cell"===s?i:N),e,n,a,r)})})}),e("i18n()",function(t,e,n){var a=this.context[0],t=A(t)(a.oLanguage);return t===N&&(t=e),(t=n!==N&&P.isPlainObject(t)?t[n]!==N?t[n]:t._:t).replace("%d",n)}),w.version="1.13.4",w.settings=[],w.models={},w.models.oSearch={bCaseInsensitive:!0,sSearch:"",bRegex:!1,bSmart:!0,return:!1},w.models.oRow={nTr:null,anCells:null,_aData:[],_aSortData:null,_aFilterData:null,_sFilterRow:null,_sRowStripe:"",src:null,idx:-1},w.models.oColumn={idx:null,aDataSort:null,asSorting:null,bSearchable:null,bSortable:null,bVisible:null,_sManualType:null,_bAttrSrc:!1,fnCreatedCell:null,fnGetData:null,fnSetData:null,mData:null,mRender:null,nTh:null,nTf:null,sClass:null,sContentPadding:null,sDefaultContent:null,sName:null,sSortDataType:"std",sSortingClass:null,sSortingClassJUI:null,sTitle:null,sType:null,sWidth:null,sWidthOrig:null},w.defaults={aaData:null,aaSorting:[[0,"asc"]],aaSortingFixed:[],ajax:null,aLengthMenu:[10,25,50,100],aoColumns:null,aoColumnDefs:null,aoSearchCols:[],asStripeClasses:null,bAutoWidth:!0,bDeferRender:!1,bDestroy:!1,bFilter:!0,bInfo:!0,bLengthChange:!0,bPaginate:!0,bProcessing:!1,bRetrieve:!1,bScrollCollapse:!1,bServerSide:!1,bSort:!0,bSortMulti:!0,bSortCellsTop:!1,bSortClasses:!0,bStateSave:!1,fnCreatedRow:null,fnDrawCallback:null,fnFooterCallback:null,fnFormatNumber:function(t){return t.toString().replace(/\B(?=(\d{3})+(?!\d))/g,this.oLanguage.sThousands)},fnHeaderCallback:null,fnInfoCallback:null,fnInitComplete:null,fnPreDrawCallback:null,fnRowCallback:null,fnServerData:null,fnServerParams:null,fnStateLoadCallback:function(t){try{return JSON.parse((-1===t.iStateDuration?sessionStorage:localStorage).getItem("DataTables_"+t.sInstance+"_"+location.pathname))}catch(t){return{}}},fnStateLoadParams:null,fnStateLoaded:null,fnStateSaveCallback:function(t,e){try{(-1===t.iStateDuration?sessionStorage:localStorage).setItem("DataTables_"+t.sInstance+"_"+location.pathname,JSON.stringify(e))}catch(t){}},fnStateSaveParams:null,iStateDuration:7200,iDeferLoading:null,iDisplayLength:10,iDisplayStart:0,iTabIndex:0,oClasses:{},oLanguage:{oAria:{sSortAscending:": activate to sort column ascending",sSortDescending:": activate to sort column descending"},oPaginate:{sFirst:"First",sLast:"Last",sNext:"Next",sPrevious:"Previous"},sEmptyTable:"No data available in table",sInfo:"Showing _START_ to _END_ of _TOTAL_ entries",sInfoEmpty:"Showing 0 to 0 of 0 entries",sInfoFiltered:"(filtered from _MAX_ total entries)",sInfoPostFix:"",sDecimal:"",sThousands:",",sLengthMenu:"Show _MENU_ entries",sLoadingRecords:"Loading...",sProcessing:"",sSearch:"Search:",sSearchPlaceholder:"",sUrl:"",sZeroRecords:"No matching records found"},oSearch:P.extend({},w.models.oSearch),sAjaxDataProp:"data",sAjaxSource:null,sDom:"lfrtip",searchDelay:null,sPaginationType:"simple_numbers",sScrollX:"",sScrollXInner:"",sScrollY:"",sServerMethod:"GET",renderer:null,rowId:"DT_RowId"},i(w.defaults),w.defaults.column={aDataSort:null,iDataSort:-1,asSorting:["asc","desc"],bSearchable:!0,bSortable:!0,bVisible:!0,fnCreatedCell:null,mData:null,mRender:null,sCellType:"td",sClass:"",sContentPadding:"",sDefaultContent:null,sName:"",sSortDataType:"std",sTitle:null,sType:null,sWidth:null},i(w.defaults.column),w.models.oSettings={oFeatures:{bAutoWidth:null,bDeferRender:null,bFilter:null,bInfo:null,bLengthChange:null,bPaginate:null,bProcessing:null,bServerSide:null,bSort:null,bSortMulti:null,bSortClasses:null,bStateSave:null},oScroll:{bCollapse:null,iBarWidth:0,sX:null,sXInner:null,sY:null},oLanguage:{fnInfoCallback:null},oBrowser:{bScrollOversize:!1,bScrollbarLeft:!1,bBounding:!1,barWidth:0},ajax:null,aanFeatures:[],aoData:[],aiDisplay:[],aiDisplayMaster:[],aIds:{},aoColumns:[],aoHeader:[],aoFooter:[],oPreviousSearch:{},aoPreSearchCols:[],aaSorting:null,aaSortingFixed:[],asStripeClasses:null,asDestroyStripes:[],sDestroyWidth:0,aoRowCallback:[],aoHeaderCallback:[],aoFooterCallback:[],aoDrawCallback:[],aoRowCreatedCallback:[],aoPreDrawCallback:[],aoInitComplete:[],aoStateSaveParams:[],aoStateLoadParams:[],aoStateLoaded:[],sTableId:"",nTable:null,nTHead:null,nTFoot:null,nTBody:null,nTableWrapper:null,bDeferLoading:!1,bInitialised:!1,aoOpenRows:[],sDom:null,searchDelay:null,sPaginationType:"two_button",iStateDuration:0,aoStateSave:[],aoStateLoad:[],oSavedState:null,oLoadedState:null,sAjaxSource:null,sAjaxDataProp:null,jqXHR:null,json:N,oAjaxData:N,fnServerData:null,aoServerParams:[],sServerMethod:null,fnFormatNumber:null,aLengthMenu:null,iDraw:0,bDrawing:!1,iDrawError:-1,_iDisplayLength:10,_iDisplayStart:0,_iRecordsTotal:0,_iRecordsDisplay:0,oClasses:{},bFiltered:!1,bSorted:!1,bSortCellsTop:null,oInit:null,aoDestroyCallback:[],fnRecordsTotal:function(){return"ssp"==E(this)?+this._iRecordsTotal:this.aiDisplayMaster.length},fnRecordsDisplay:function(){return"ssp"==E(this)?+this._iRecordsDisplay:this.aiDisplay.length},fnDisplayEnd:function(){var t=this._iDisplayLength,e=this._iDisplayStart,n=e+t,a=this.aiDisplay.length,r=this.oFeatures,o=r.bPaginate;return r.bServerSide?!1===o||-1===t?e+a:Math.min(e+t,this._iRecordsDisplay):!o||a<n||-1===t?a:n},oInstance:null,sInstance:null,iTabIndex:0,nScrollHead:null,nScrollFoot:null,aLastSort:[],oPlugins:{},rowIdFn:null,rowId:null},w.ext=p={buttons:{},classes:{},build:"dt/dt-1.13.4",errMode:"alert",feature:[],search:[],selector:{cell:[],column:[],row:[]},internal:{},legacy:{ajax:null},pager:{},renderer:{pageButton:{},header:{}},order:{},type:{detect:[],search:{},order:{}},_unique:0,fnVersionCheck:w.fnVersionCheck,iApiIndex:0,oJUIClasses:{},sVersion:w.version},P.extend(p,{afnFiltering:p.search,aTypes:p.type.detect,ofnSearch:p.type.search,oSort:p.type.order,afnSortData:p.order,aoFeatures:p.feature,oApi:p.internal,oStdClasses:p.classes,oPagination:p.pager}),P.extend(w.ext.classes,{sTable:"dataTable",sNoFooter:"no-footer",sPageButton:"paginate_button",sPageButtonActive:"current",sPageButtonDisabled:"disabled",sStripeOdd:"odd",sStripeEven:"even",sRowEmpty:"dataTables_empty",sWrapper:"dataTables_wrapper",sFilter:"dataTables_filter",sInfo:"dataTables_info",sPaging:"dataTables_paginate paging_",sLength:"dataTables_length",sProcessing:"dataTables_processing",sSortAsc:"sorting_asc",sSortDesc:"sorting_desc",sSortable:"sorting",sSortableAsc:"sorting_desc_disabled",sSortableDesc:"sorting_asc_disabled",sSortableNone:"sorting_disabled",sSortColumn:"sorting_",sFilterInput:"",sLengthSelect:"",sScrollWrapper:"dataTables_scroll",sScrollHead:"dataTables_scrollHead",sScrollHeadInner:"dataTables_scrollHeadInner",sScrollBody:"dataTables_scrollBody",sScrollFoot:"dataTables_scrollFoot",sScrollFootInner:"dataTables_scrollFootInner",sHeaderTH:"",sFooterTH:"",sSortJUIAsc:"",sSortJUIDesc:"",sSortJUI:"",sSortJUIAscAllowed:"",sSortJUIDescAllowed:"",sSortJUIWrapper:"",sSortIcon:"",sJUIHeader:"",sJUIFooter:""}),w.ext.pager);function Oe(t,e){var n=[],a=He.numbers_length,r=Math.floor(a/2);return e<=a?n=f(0,e):t<=r?((n=f(0,a-2)).push("ellipsis"),n.push(e-1)):((e-1-r<=t?n=f(e-(a-2),e):((n=f(t-r+2,t+r-1)).push("ellipsis"),n.push(e-1),n)).splice(0,0,"ellipsis"),n.splice(0,0,0)),n.DT_el="span",n}P.extend(He,{simple:function(t,e){return["previous","next"]},full:function(t,e){return["first","previous","next","last"]},numbers:function(t,e){return[Oe(t,e)]},simple_numbers:function(t,e){return["previous",Oe(t,e),"next"]},full_numbers:function(t,e){return["first","previous",Oe(t,e),"next","last"]},first_last_numbers:function(t,e){return["first",Oe(t,e),"last"]},_numbers:Oe,numbers_length:7}),P.extend(!0,w.ext.renderer,{pageButton:{_:function(c,t,f,e,d,h){function p(t,e){for(var n,a,r,o=m.sPageButtonDisabled,i=function(t){Yt(c,t.data.action,!0)},l=0,s=e.length;l<s;l++)if(n=e[l],Array.isArray(n)){var u=P("<"+(n.DT_el||"div")+"/>").appendTo(t);p(u,n)}else{switch(g=null,b=n,a=c.iTabIndex,n){case"ellipsis":t.append('<span class="ellipsis">…</span>');break;case"first":g=S.sFirst,0===d&&(a=-1,b+=" "+o);break;case"previous":g=S.sPrevious,0===d&&(a=-1,b+=" "+o);break;case"next":g=S.sNext,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;case"last":g=S.sLast,0!==h&&d!==h-1||(a=-1,b+=" "+o);break;default:g=c.fnFormatNumber(n+1),b=d===n?m.sPageButtonActive:""}null!==g&&(u=c.oInit.pagingTag||"a",r=-1!==b.indexOf(o),me(P("<"+u+">",{class:m.sPageButton+" "+b,"aria-controls":c.sTableId,"aria-disabled":r?"true":null,"aria-label":v[n],"aria-role":"link","aria-current":b===m.sPageButtonActive?"page":null,"data-dt-idx":n,tabindex:a,id:0===f&&"string"==typeof n?c.sTableId+"_"+n:null}).html(g).appendTo(t),{action:n},i))}}var g,b,n,m=c.oClasses,S=c.oLanguage.oPaginate,v=c.oLanguage.oAria.paginate||{};try{n=P(t).find(y.activeElement).data("dt-idx")}catch(t){}p(P(t).empty(),e),n!==N&&P(t).find("[data-dt-idx="+n+"]").trigger("focus")}}}),P.extend(w.ext.type.detect,[function(t,e){e=e.oLanguage.sDecimal;return l(t,e)?"num"+e:null},function(t,e){var n;return(!t||t instanceof Date||X.test(t))&&(null!==(n=Date.parse(t))&&!isNaN(n)||h(t))?"date":null},function(t,e){e=e.oLanguage.sDecimal;return l(t,e,!0)?"num-fmt"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e)?"html-num"+e:null},function(t,e){e=e.oLanguage.sDecimal;return a(t,e,!0)?"html-num-fmt"+e:null},function(t,e){return h(t)||"string"==typeof t&&-1!==t.indexOf("<")?"html":null}]),P.extend(w.ext.type.search,{html:function(t){return h(t)?t:"string"==typeof t?t.replace(U," ").replace(V,""):""},string:function(t){return!h(t)&&"string"==typeof t?t.replace(U," "):t}});function ke(t,e,n,a){var r;return 0===t||t&&"-"!==t?"number"==(r=typeof t)||"bigint"==r?t:+(t=(t=e?G(t,e):t).replace&&(n&&(t=t.replace(n,"")),a)?t.replace(a,""):t):-1/0}function Me(n){P.each({num:function(t){return ke(t,n)},"num-fmt":function(t){return ke(t,n,q)},"html-num":function(t){return ke(t,n,V)},"html-num-fmt":function(t){return ke(t,n,V,q)}},function(t,e){p.type.order[t+n+"-pre"]=e,t.match(/^html\-/)&&(p.type.search[t+n]=p.type.search.html)})}P.extend(p.type.order,{"date-pre":function(t){t=Date.parse(t);return isNaN(t)?-1/0:t},"html-pre":function(t){return h(t)?"":t.replace?t.replace(/<.*?>/g,"").toLowerCase():t+""},"string-pre":function(t){return h(t)?"":"string"==typeof t?t.toLowerCase():t.toString?t.toString():""},"string-asc":function(t,e){return t<e?-1:e<t?1:0},"string-desc":function(t,e){return t<e?1:e<t?-1:0}}),Me(""),P.extend(!0,w.ext.renderer,{header:{_:function(r,o,i,l){P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass))})},jqueryui:function(r,o,i,l){P("<div/>").addClass(l.sSortJUIWrapper).append(o.contents()).append(P("<span/>").addClass(l.sSortIcon+" "+i.sSortingClassJUI)).appendTo(o),P(r.nTable).on("order.dt.DT",function(t,e,n,a){r===e&&(e=i.idx,o.removeClass(l.sSortAsc+" "+l.sSortDesc).addClass("asc"==a[e]?l.sSortAsc:"desc"==a[e]?l.sSortDesc:i.sSortingClass),o.find("span."+l.sSortIcon).removeClass(l.sSortJUIAsc+" "+l.sSortJUIDesc+" "+l.sSortJUI+" "+l.sSortJUIAscAllowed+" "+l.sSortJUIDescAllowed).addClass("asc"==a[e]?l.sSortJUIAsc:"desc"==a[e]?l.sSortJUIDesc:i.sSortingClassJUI))})}}});function We(t){return"string"==typeof(t=Array.isArray(t)?t.join(","):t)?t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,"""):t}function Ee(t,e,n,a,r){return j.moment?t[e](r):j.luxon?t[n](r):a?t[a](r):t}var Be=!1;function Ue(t,e,n){var a;if(j.moment){if(!(a=j.moment.utc(t,e,n,!0)).isValid())return null}else if(j.luxon){if(!(a=e&&"string"==typeof t?j.luxon.DateTime.fromFormat(t,e):j.luxon.DateTime.fromISO(t)).isValid)return null;a.setLocale(n)}else e?(Be||alert("DataTables warning: Formatted date without Moment.js or Luxon - https://datatables.net/tn/17"),Be=!0):a=new Date(t);return a}function Ve(s){return function(a,r,o,i){0===arguments.length?(o="en",a=r=null):1===arguments.length?(o="en",r=a,a=null):2===arguments.length&&(o=r,r=a,a=null);var l="datetime-"+r;return w.ext.type.order[l]||(w.ext.type.detect.unshift(function(t){return t===l&&l}),w.ext.type.order[l+"-asc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:t<e?-1:1},w.ext.type.order[l+"-desc"]=function(t,e){t=t.valueOf(),e=e.valueOf();return t===e?0:e<t?-1:1}),function(t,e){var n;return null!==t&&t!==N||(t="--now"===i?(n=new Date,new Date(Date.UTC(n.getFullYear(),n.getMonth(),n.getDate(),n.getHours(),n.getMinutes(),n.getSeconds()))):""),"type"===e?l:""===t?"sort"!==e?"":Ue("0000-01-01 00:00:00",null,o):!(null===r||a!==r||"sort"===e||"type"===e||t instanceof Date)||null===(n=Ue(t,a,o))?t:"sort"===e?n:(t=null===r?Ee(n,"toDate","toJSDate","")[s]():Ee(n,"format","toFormat","toISOString",r),"dis
23156play"===e?We(t):t)}}}var Xe=",",Je=".";if(Intl)try{for(var qe=(new Intl.NumberFormat).formatToParts(100000.1),n=0;n<qe.length;n++)"group"===qe[n].type?Xe=qe[n].value:"decimal"===qe[n].type&&(Je=qe[n].value)}catch(t){}function Ge(e){return function(){var t=[ge(this[w.ext.iApiIndex])].concat(Array.prototype.slice.call(arguments));return w.ext.internal[e].apply(this,t)}}return w.datetime=function(n,a){var r="datetime-detect-"+n;a=a||"en",w.ext.type.order[r]||(w.ext.type.detect.unshift(function(t){var e=Ue(t,n,a);return!(""!==t&&!e)&&r}),w.ext.type.order[r+"-pre"]=function(t){return Ue(t,n,a)||0})},w.render={date:Ve("toLocaleDateString"),datetime:Ve("toLocaleString"),time:Ve("toLocaleTimeString"),number:function(a,r,o,i,l){return null!==a&&a!==N||(a=Xe),null!==r&&r!==N||(r=Je),{display:function(t){if("number"!=typeof t&&"string"!=typeof t)return t;if(""===t||null===t)return t;var e=t<0?"-":"",n=parseFloat(t);if(isNaN(n))return We(t);n=n.toFixed(o),t=Math.abs(n);n=parseInt(t,10),t=o?r+(t-n).toFixed(o).substring(2):"";return(e=0===n&&0===parseFloat(t)?"":e)+(i||"")+n.toString().replace(/\B(?=(\d{3})+(?!\d))/g,a)+t+(l||"")}}},text:function(){return{display:We,filter:We}}},P.extend(w.ext.internal,{_fnExternApiFunc:Ge,_fnBuildAjax:Tt,_fnAjaxUpdate:xt,_fnAjaxParameters:At,_fnAjaxUpdateDraw:It,_fnAjaxDataSrc:Ft,_fnAddColumn:nt,_fnColumnOptions:at,_fnAdjustColumnSizing:O,_fnVisibleToColumnIndex:rt,_fnColumnIndexToVisible:ot,_fnVisbleColumns:T,_fnGetColumns:it,_fnColumnTypes:lt,_fnApplyColumnDefs:st,_fnHungarianMap:i,_fnCamelToHungarian:C,_fnLanguageCompat:Z,_fnBrowserDetect:tt,_fnAddData:x,_fnAddTr:ut,_fnNodeToDataIndex:function(t,e){return e._DT_RowIndex!==N?e._DT_RowIndex:null},_fnNodeToColumnIndex:function(t,e,n){return P.inArray(n,t.aoData[e].anCells)},_fnGetCellData:S,_fnSetCellData:ct,_fnSplitObjNotation:dt,_fnGetObjectDataFn:A,_fnSetObjectDataFn:b,_fnGetDataMaster:ht,_fnClearTable:pt,_fnDeleteIndex:gt,_fnInvalidate:bt,_fnGetRowElements:mt,_fnCreateTr:St,_fnBuildHead:yt,_fnDrawHead:Dt,_fnDraw:v,_fnReDraw:u,_fnAddOptionsHtml:_t,_fnDetectHeader:wt,_fnGetUniqueThs:Ct,_fnFeatureHtmlFilter:Lt,_fnFilterComplete:Rt,_fnFilterCustom:Pt,_fnFilterColumn:jt,_fnFilter:Nt,_fnFilterCreateSearch:Ht,_fnEscapeRegex:Ot,_fnFilterData:Wt,_fnFeatureHtmlInfo:Ut,_fnUpdateInfo:Vt,_fnInfoMacros:Xt,_fnInitialise:Jt,_fnInitComplete:qt,_fnLengthChange:Gt,_fnFeatureHtmlLength:$t,_fnFeatureHtmlPaginate:zt,_fnPageChange:Yt,_fnFeatureHtmlProcessing:Zt,_fnProcessingDisplay:D,_fnFeatureHtmlTable:Kt,_fnScrollDraw:Qt,_fnApplyToChildren:k,_fnCalculateColumnWidths:ee,_fnThrottle:ne,_fnConvertToWidth:ae,_fnGetWidestNode:re,_fnGetMaxLenString:oe,_fnStringToCss:M,_fnSortFlatten:I,_fnSort:ie,_fnSortAria:le,_fnSortListener:se,_fnSortAttachListener:ue,_fnSortingClasses:ce,_fnSortData:fe,_fnSaveState:de,_fnLoadState:he,_fnImplementState:pe,_fnSettingsFromNode:ge,_fnLog:W,_fnMap:F,_fnBindAction:me,_fnCallbackReg:L,_fnCallbackFire:R,_fnLengthOverflow:Se,_fnRenderer:ve,_fnDataSource:E,_fnRowAttributes:vt,_fnExtend:be,_fnCalculateEnd:function(){}}),((P.fn.dataTable=w).$=P).fn.dataTableSettings=w.settings,P.fn.dataTableExt=w.ext,P.fn.DataTable=function(t){return P(this).dataTable(t).api()},P.each(w,function(t,e){P.fn.DataTable[t]=e}),w}); 23157 23158/*! DataTables styling integration 23159 * ©2018 SpryMedia Ltd - datatables.net/license 23160 */ 23161!function(t){var o,d;"function"==typeof define&&define.amd?define(["jquery","datatables.net"],function(e){return t(e,window,document)}):"object"==typeof exports?(o=require("jquery"),d=function(e,n){
23161n.fn.dataTable||require("datatables.net")(e,n)},"undefined"!=typeof window?module.exports=function(e,n){return e=e||window,n=n||o(e),d(e,n),t(n,0,e.document)}:(d(window,o),module.exports=t(o,window,window.document))):t(jQuery,window,document)}(function(e,n,t,o){"use strict";return e.fn.dataTable}); 23162 23163 23164(function ($) { 23165 if ($('.simplified .timeline_print_table').length) { 23166 $('.timeline_print_table').DataTable({ 23167 order: [[1, 'asc']], 23168 paging: false, 23169 searching: false, 23170 info: false 23171 }); 23172 } 23173 23174 let resetButton = $('.timeline__filter_search_input .reset-button button'); 23175 let resetButtonWrapper = $('.timeline__filter_search_input .reset-button'); 23176 23177 if (resetButton) { 23178 let searchInput = $('#timeline-search-input'); 23179 let searchInputModal = $('#timeline-search-input-modal'); 23180 resetButton.on('click', () => { 23181 resetButtonWrapper.hide(); 23182 if (searchInput.length) { 23183 searchInput.val(''); 23184 var eventKeyup = new Event('keyup'); 23185 document.querySelector('#timeline-search-input').dispatchEvent(eventKeyup); 23186 } 23187 23188 if (searchInputModal.length) { 23189 searchInputModal.val(''); 23190 var eventKeyup = new Event('keyup'); 23191 document.querySelector('#timeline-search-input-modal').dispatchEvent(eventKeyup); 23192 } 23193 }); 23194 23195 if (searchInput.length) { 23196 searchInput.on('input', () => { 23197 if (searchInput.val().length > 0) { 23198 resetButtonWrapper.css('display', 'flex'); 23199 } else { 23200 resetButtonWrapper.css('display', 'none'); 23201 } 23202 }); 23203 23204 searchInput.on('keydown', (event) => { 23205 if (event.keyCode === 13) { 23206 event.preventDefault(); 23207 $('#modal-timeline').modal('show'); 23208 } 23209 }); 23210 } 23211 23212 if (searchInputModal.length) { 23213 searchInputModal.on('input', () => { 23214 if (searchInputModal.val().length > 0) { 23215 resetButtonWrapper.css('display', 'flex'); 23216 } else { 23217 resetButtonWrapper.css('display', 'none'); 23218 } 23219 }); 23220 } 23221 } 23222})(jQuery); 23223 23224document.addEventListener('DOMContentLoaded', function () { 23225 const pageRetrospective = document.querySelector(".section-retrospective"); 23226 23227 if (pageRetrospective) { 23228 23229 // Stock si la page contient la div gabarit-press-folder 23230 const gabaritPressFolder = pageRetrospective.querySelector('.gabarit-press-folder'); 23231 23232 // Créer une fausse actualités qui sert de sommaire 23233 if (gabaritPressFolder) { 23234 // Create the main container 23235 const newsItemSummary = pageRetrospective.querySelector(".news-tiles__summary"); 23236 if (newsItemSummary) { 23237 const html = pageRetrospective.querySelector('.list-news-tiles-navigation .sidebar-box__header'); 23238 html.insertAdjacentHTML('afterend', newsItemSummary.outerHTML); 23239 } 23240 } 23241 23242 // Sélectionne tous les éléments de news 23243 const newsItems = pageRetrospective.querySelectorAll(".news-tiles .news-tiles__item"); 23244 // Convertit NodeList en Array pour plus de facilité 23245 const newsArray = Array.from(newsItems); 23246 // Stocke les éléments des actualités 23247 const newsLinks = newsArray; 23248 23249 let currentIndex = -1; // Initialise l'index actuel 23250 23251 // Fonction pour supprimer le popup et les écouteurs associés 23252 const removeModal = () => { 23253 const modal = pageRetrospective.querySelector(".news-retrospective-inner"); 23254 if (modal) { 23255 // Définir un gestionnaire pour 'transitionend' 23256 const handleTransition = (event) => { 23257 // Vérifier si la propriété 'opacity' a terminé la transition 23258 if (event.propertyName === 'opacity') { 23259 modal.removeEventListener('transitionend', handleTransition); 23260 } 23261 }; 23262 23263 modal.style.display = "none"; 23264 // Ajouter l'écouteur 'transitionend' uniquement pour 'opacity' 23265 modal.addEventListener('transitionend', handleTransition); 23266 } 23267 document.removeEventListener("keydown", window.handleKeyDown); 23268 }; 23269 23270 // Définir handleKeyDown comme une fonction globale 23271 window.handleKeyDown = function (evt) { 23272 evt = evt || window.event; 23273 const isEscape = evt.key === "Escape" || evt.key === "Esc" || evt.keyCode === 27; 23274 const isArrowLeft = evt.key === "ArrowLeft" || evt.keyCode === 37; 23275 const isArrowRight = evt.key === "ArrowRight" || evt.keyCode === 39; 23276 23277 if (isEscape) { 23278 removeModal(); 23279 } else if (isArrowLeft) { 23280 // Navigue vers l'actualité précédente 23281 if (currentIndex > 0) { 23282 openPopupAtIndex(currentIndex - 1); 23283 } else { 23284 currentIndex = newsLinks.length - 1; 23285 openPopupAtIndex(currentIndex); 23286 } 23287 } else if (isArrowRight) { 23288 // Navigue vers l'actualité suivante 23289 if (currentIndex < newsLinks.length - 1) { 23290 openPopupAtIndex(currentIndex + 1); 23291 } else { 23292 currentIndex = 0; 23293 openPopupAtIndex(currentIndex); 23294 } 23295 } 23296 }; 23297 23298 // Au clique sur la croix pour supprimer le popup 23299 const closeButton = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__close"); 23300 if (closeButton) closeButton.addEventListener("click", removeModal); 23301 23302 // Fonction pour gérer les touches fléchées et Escape 23303 const handleKeyDown = window.handleKeyDown; 23304 23305 // Fonction pour charger les images de fond et retourner une Promise
23306 const loadBackgroundImage = (imageUrl) => { 23307 return new Promise((resolve, reject) => { 23308 const img = new Image(); 23309 // Extraire l'URL de l'image depuis la propriété CSS backgroundImage 23310 const matches = imageUrl.match(/url\(['"]?(.*?)['"]?\)/); 23311 if (matches && matches[1]) { 23312 img.src = matches[1]; 23313 img.onload = resolve; 23314 img.onerror = reject; 23315 } else { 23316 // Si aucune URL trouvée, résoudre immédiatement 23317 resolve(); 23318 } 23319 }); 23320 }; 23321 23322 const navigationPosition = (modalTitle) => { 23323 let titleRect = modalTitle.getBoundingClientRect(); 23324 const navigation = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__navigation"); 23325 let marge = 40; 23326 if (window.innerWidth > 861 && window.innerWidth < 1024) marge = 10; 23327 navigation.style.width = `calc(${titleRect.width}px + 72px + ${marge}px)`; 23328 navigation.style.top = `${titleRect.top}px`; 23329 } 23330 23331 // Fonction pour ouvrir le popup à un index donné avec loader 23332 const openPopupAtIndex = (index) => { 23333 currentIndex = index; 23334 23335 const menuNews = pageRetrospective.querySelector(".news-retrospective-inner .list-news-tiles-navigation"); 23336 if (menuNews.classList.contains("visible")) menuNews.classList.remove("visible"); 23337 23338 // Supprime le filtre orange si il en existe déjà un 23339 const actif = document.querySelector(".section-retrospective .news-retrospective-inner .isActif"); 23340 if (actif) actif.remove(); 23341 23342 // Ajoute le filtre orange à l'item actif 23343 const div = document.createElement("div"); 23344 div.classList.add("isActif"); 23345 div.innerHTML = '<svg id="Calque_1" data-name="Calque 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 40 38.53"><defs><style>.cls-blc{fill:#fff;}</style></defs><title>Visibilite</title>
23345<path class="cls-blc" d="M12.78,28.67,9.87,25.75l2.35-2.36,2.92,2.92Zm-1.5-2.92,1.5,1.51,1-1L12.22,24.8Z"/><path class="cls-blc" d="M2.92,38.53,0,35.61l2.36-2.36,2.92,2.92ZM1.41,35.61l1.51,1.51,1-.95L2.36,34.66Z"/><path class="cls-blc" d="M21.65,29.1a12.22,12.22,0,1,1,8.65-3.57A12.22,12.22,0,0,1,21.65,29.1Zm0-23.45a11.23,11.23,0,1,0,8,3.28A11.2,11.2,0,0,0,21.65,5.65Zm0,21.07a9.85,9.85,0,1,1,7-2.88h0A9.82,9.82,0,0,1,21.65,26.72ZM21.65,8a8.85,8.85,0,1,0,6.26,2.59A8.83,8.83,0,0,0,21.65,8Z"/><path class="cls-blc" d="M5.18,37.49,1,33.35,10,24.43l4.14,4.14ZM2.45,33.35l2.73,2.73,7.51-7.51L10,25.84Z"/><rect class="cls-blc" x="4.87" y="30.74" width="1" height="4.85" transform="translate(-21.88 13.51) rotate(-45)"/><rect class="cls-blc" x="9.27" y="26.33" width="1" height="4.85" transform="translate(-17.47 15.34) rotate(-45)"/><rect class="cls-blc" x="19.3" y="16.33" width="0.96" height="1"/><rect class="cls-blc" x="23.14" y="16.33" width="0.96" height="1"/><rect class="cls-blc" x="21.2" y="18.27" width="1" height="0.96"/><rect class="cls-blc" x="21.2" y="14.43" width="1" height="0.96"/><rect class="cls-blc" x="14.66" y="34.61" width="0.96" height="1" transform="translate(-20.39 20.98) rotate(-45)"/><rect class="cls-blc" x="17.38" y="31.89" width="0.96" height="1" transform="translate(-17.67 22.11) rotate(-45)"/><rect class="cls-blc" x="17.36" y="34.63" width="1" height="0.96" transform="translate(-19.6 22.91) rotate(-45)"/><rect class="cls-blc" x="14.64" y="31.91" width="1" height="0.96" transform="translate(-18.47 20.19) rotate(-45)"/><rect class="cls-blc" x="36.11" y="18.18" width="0.96" height="1" transform="translate(-2.49 31.34) rotate(-45)"/><rect class="cls-blc" x="38.83" y="15.46" width="0.96" height="1" transform="translate(0.23 32.47) rotate(-45)"/><rect class="cls-blc" x="38.81" y="18.2" width="1" height="0.96" transform="translate(-1.7 33.26) rotate(-45)"/><rect class="cls-blc" x="36.09" y="15.48" width="1" height="0.96" transform="translate(-0.57 30.55) rotate(-45)"/><rect class="cls-blc" x="1.9" y="19.13" width="0.96" height="1" transform="translate(-13.19 7.43) rotate(-45)"/><rect class="cls-blc" x="4.62" y="16.41" width="0.96" height="1" transform="translate(-10.47 8.56) rotate(-45)"/><rect class="cls-blc" x="4.6" y="19.15" width="1" height="0.96" transform="translate(-12.39 9.35) rotate(-45)"/><rect class="cls-blc" x="1.88" y="16.43" width="1" height="0.96" transform="translate(-11.26 6.64) rotate(-45)"/><polygon class="cls-blc" points="38.48 33.66 31.55 33.66 31.55 32.66 37.49 32.66 37.49 26.73 38.48 26.73 38.48 33.66"/><polygon class="cls-blc" points="5.82 6.93 4.82 6.93 4.82 0 11.76 0 11.76 1 5.82 1 5.82 6.93"/><polygon class="cls-blc" points="38.48 6.93 37.49 6.93 37.49 1 31.55 1 31.55 0 38.48 0 38.48 6.93"/></svg>'; 23346 newsLinks[currentIndex].querySelector(".news-tile").appendChild(div); 23347 23348 // Supprime l'ancien popup s'il existe 23349 removeModal(); 23350 23351 const modal = pageRetrospective.querySelector(".news-retrospective-inner"); 23352 if (modal) { 23353 modal.style.display = "flex"; // Afficher la modal 23354 23355 modal.querySelector("article").scrollTo(0, 0); 23356 23357 // Créer et ajouter le loader 23358 const loader = document.createElement("div"); 23359 loader.classList.add("loader"); 23360 loader.setAttribute("role", "status"); 23361 loader.setAttribute("aria-live", "polite"); 23362 modal.appendChild(loader); 23363 23364 // Forcer le reflow pour permettre la transition 23365 void modal.offsetWidth; 23366 23367 // Mettre à jour le contenu de la modal 23368 // Mettre à jour le titre 23369 const modalTitle = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__content h1"); 23370 const newsTitle = newsLinks[currentIndex].querySelector(".news-tile__content h1") 23371 ? newsLinks[currentIndex].querySelector(".news-tile__content h1").innerHTML 23372 : "Aucun titre n'existe pour cet article."; 23373 if (modalTitle) modalTitle.innerHTML = newsTitle; 23374 23375 // Mettre à jour le corps 23376 const modalBody = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__body"); 23377 const newsBody = newsLinks[currentIndex].querySelector(".news-tile__body") 23378 ? newsLinks[currentIndex].querySelector(".news-tile__body").innerHTML 23379 : "Aucun contenu disponible."; 23380 if (modalBody && newsBody) { 23381 modalBody.innerHTML = newsBody; 23382 } 23383 23384 // Mettre à jour l'image de fond
23385 const modalBackground = pageRetrospective.querySelector(".news-retrospective-inner article"); 23386 const newsBackground = newsLinks[currentIndex].querySelector(".news-tile__bg span"); 23387 let imageLoadPromise = Promise.resolve(); 23388 if (newsBackground) { 23389 const image = newsBackground.style.backgroundImage; 23390 modalBackground.style.backgroundImage = image; 23391 23392 // Attendre que l'image de fond soit chargée 23393 imageLoadPromise = loadBackgroundImage(image); 23394 } 23395 23396 // Ajoute l'écouteur pour les liens du sommaire 23397 if (gabaritPressFolder) { 23398 const summaryLinks = modalBackground.querySelectorAll(".summary-news-tile__link"); 23399 if (summaryLinks.length > 0) { 23400 summaryLinks.forEach((link, index) => { 23401 link.addEventListener("click", (e) => { 23402 e.preventDefault(); 23403 openPopupAtIndex(index + 1); 23404 // Scroll to the news 23405 menuNews.scrollTo({ top: newsLinks[index + 1].offsetTop, behavior: 'smooth'}); 23406 }); 23407 }); 23408 } 23409 } 23410 23411 // Après la mise à jour du contenu et le chargement de l'image, retirer le loader 23412 imageLoadPromise.then(() => { 23413 loader.remove(); 23414 }).catch(() => { 23415 loader.remove(); 23416 console.error("Ãchec du chargement de l'image de fond."); 23417 }); 23418 23419 // Met à jour la position des flèches de navigation selon le titre par défaut 23420 navigationPosition(modalTitle); 23421 23422 // Ferme le popup en cliquant sur l'overlay 23423 const overlay = pageRetrospective.querySelector(".news-retrospective-inner .news-popup__overlay"); 23424 if (overlay) { 23425 overlay.addEventListener("click", removeModal, { once: true }); 23426 } 23427 23428 // Ajoute l'écouteur pour les touches (dans le parent) 23429 document.addEventListener("keydown", handleKeyDown); 23430 23431 // MATOMO 23432 var articleTitle = newsLinks[currentIndex].querySelector(".news-tile__content h1").innerHTML; 23433 var articleUrl = newsLinks[currentIndex].querySelector(".news-tile__url").href; 23434 23435 if (articleUrl) { 23436 // Get the current page URL to append the article as a subpage 23437 var currentPageUrl = window.location.pathname; 23438 var virtualPageUrl = currentPageUrl + '/news/' + articleUrl; 23439 23440 _paq.push(['setCustomUrl', virtualPageUrl]); // Set URL with subfolder 23441 _paq.push(['setDocumentTitle', articleTitle]); // Set title for better analytics 23442 _paq.push(['trackPageView']); // Track as a virtual pageview 23443 } 23444 } 23445 }; 23446 23447 const modalTitle = pageRetrospective.querySelector(".news-retrospective-inner article .news-tile__content h1"); 23448 // Met à jour la position des flèches de navigation selon le titre 23449 if (modalTitle) { 23450 window.addEventListener('resize', function (event) { 23451 navigationPosition(modalTitle); 23452 }, true); 23453 } 23454 23455 // Ajoute l'écouteur d'événement click à chaque élément de news 23456 newsArray.forEach((item, index) => { 23457 item.addEventListener("click", (e) => { 23458 e.preventDefault(); 23459 if (newsLinks[index]) { 23460 openPopupAtIndex(index); 23461 } 23462 }); 23463 }); 23464 23465 // Au clique sur les flèches de navigation 23466 const leftButton = pageRetrospective.querySelector(".news-retrospective-inner article .navigation-left"); 23467 const rightButton = pageRetrospective.querySelector(".news-retrospective-inner article .navigation-right"); 23468 if (leftButton) { 23469 // Navigue vers l'actualité précédente 23470 leftButton.addEventListener("click", () => { 23471 if (currentIndex > 0) { 23472 openPopupAtIndex(currentIndex - 1); 23473 } else { 23474 currentIndex = newsLinks.length - 1; 23475 openPopupAtIndex(currentIndex); 23476 } 23477 }); 23478 } 23479 if (rightButton) { 23480 // Navigue vers l'actualité suivante 23481 rightButton.addEventListener("click", () => { 23482 if (currentIndex < newsLinks.length - 1) { 23483 openPopupAtIndex(currentIndex + 1); 23484 } else { 23485 currentIndex = 0; 23486 openPopupAtIndex(currentIndex); 23487 } 23488 }); 23489 } 23490 23491 // Trigger menu header 23492 const menuHeaderButton = pageRetrospective.querySelector(".toggle-news-
23492header"); 23493 if (menuHeaderButton) { 23494 menuHeaderButton.addEventListener("click", () => { 23495 document.querySelector("body").classList.toggle("is-menu"); 23496 const mainHeaderNav = document.querySelector(".is-menu .main-header__nav"); 23497 mainHeaderNav.click(); 23498 const prevs = mainHeaderNav.querySelectorAll(".submenu__breadcrumbs__prev"); 23499 if (prevs.length > 0) { 23500 prevs.forEach((prev) => { 23501 prev.addEventListener("click", (e) => { 23502 e.preventDefault(); 23503 const subPrevs = mainHeaderNav.querySelectorAll(".submenu__menu__links li a"); 23504 if (subPrevs.length > 0) { 23505 subPrevs.forEach((subPrev) => { 23506 subPrev.addEventListener("click", (e) => { 23507 if (subPrev.getAttribute("data-submenu")) { 23508 e.preventDefault(); 23509 document.querySelector("body").classList.add("is-menu"); 23510 } 23511 }); 23512 }); 23513 } 23514 document.querySelector("body").classList.add("is-menu"); 23515 }); 23516 }); 23517 } 23518 }); 23519 } 23520 23521 // Menu mobile 23522 const menuNewsButton = pageRetrospective.querySelector(".toggle-news-tiles-button"); 23523 if (menuNewsButton) { 23524 menuNewsButton.addEventListener("click", () => { 23525 const menuNews = pageRetrospective.querySelector(".news-retrospective-inner .list-news-tiles-navigation"); 23526 if (menuNews.classList.contains("visible")) { 23527 menuNews.classList.remove("visible"); 23528 } else { 23529 menuNews.classList.add("visible"); 23530 } 23531 }); 23532 } 23533 23534 // Change la hauteur de l'ombre de l'article au scroll 23535 const article = pageRetrospective.querySelector(".news-retrospective-inner article"); 23536 if (article) { 23537 article.addEventListener("scroll", (event) => { 23538 let scroll = event.target.scrollTop; 23539 let newValue = 320 + scroll; 23540 article.style.boxShadow = `inset 0em -${newValue}px 20px rgba(0, 0, 0, .3)`; 23541 }); 23542 } 23543 23544 if (!gabaritPressFolder) { 23545 // Convertir les dates et trier les éléments par date décroissante 23546 newsArray.sort((a, b) => { 23547 const dateA = new Date(a.querySelector('.news-tile__date')); 23548 const dateB = new Date(b.querySelector('.news-tile__date')); 23549 return dateB - dateA; // Décroissant 23550 }); 23551 23552 // Grouper les éléments par mois 23553 const groupedNews = newsArray.reduce((groups, item) => { 23554 const date = item.querySelector('.news-tile__date').innerHTML; 23555 const monthYear = date; // Exemple : "mars 2024" 23556 23557 if (!groups[monthYear]) { 23558 groups[monthYear] = []; 23559 } 23560 groups[monthYear].push(item); 23561 return groups; 23562 }, {}); 23563 23564 const newsContainer = pageRetrospective.querySelector('.list-news-tiles-navigation'); 23565 23566 // Fonction pour capitaliser la première lettre du mois 23567 const capitalizeFirstLetter = (string) => { 23568 return string.charAt(0).toUpperCase() + string.slice(1); 23569 } 23570 23571 // Créer des sections pour chaque mois 23572 Object.keys(groupedNews).forEach(month => { 23573 // Créer l'en-tête du mois 23574 const header = document.createElement('h2'); 23575 header.textContent = capitalizeFirstLetter(month); 23576 header.classList.add("news-group-month"); 23577 newsContainer.appendChild(header); 23578 23579 // Créer un conteneur pour les articles de ce mois 23580 const groupDiv = document.createElement('div'); 23581 groupDiv.classList.add('news-group'); 23582 23583 // Ajouter chaque article au conteneur 23584 groupedNews[month].forEach(item => { 23585 groupDiv.appendChild(item); 23586 }); 23587 23588 newsContainer.appendChild(groupDiv); 23589 }); 23590 } 23591 23592 if (gabaritPressFolder) { 23593 // Cliquer sur le jumbotron 23594 const jumbotron = document.querySelector(".section-retrospective #header_jumbotron"); 23595 if (jumbotron) { 23596 jumbotron.addEventListener("click", (e) => { 23597 e.preventDefault(); 23598 23599 if (newsLinks[0]) newsLinks[0].click(); 23600 }); 23601 } else { 23602 console.warn("Aucun élément 'jumbotron' trouvé dans l'article."); 23603 } 23604 23605 // Get the full URL 23606 const url = new URL(window.location.href); 23607 23608 // Use URLSearchParams to get the "news" parameter 23609 const params = new URLSearchParams(url.search); 23610 const newsValue = params.get("news"); 23611 23612 if (newsValue) { 23613 // Convert to a number (if exists) 23614 const newsNumber = newsValue ? parseInt(newsValue, 10) : null; 23615 openPopupAtIndex(newsNumber || 0); 23616 } 23617 } 23618 } 23619}); 23620 23621document.addEventListener('DOMContentLoaded', () => { 23622 const isLongFormat = document.querySelector('.isLongFormat'); 23623 23624 // Check if element is visible 23625 const checkVisible = (elm) => { 23626 var rect = elm.getBoundingClientRect(); 23627 var viewHeight = Math.max(document.documentElement.clientHeight, window.innerHeight); 23628 return !(rect.bottom < 0 || rect.top - viewHeight >= 0); 23629 } 23630 23631 // Only for page long format 23632 if (isLongFormat) { 23633 const article = isLongFormat.querySelector(".page-grid__content"); 23634 // Add reading time in news 23635 const readingTime = () => { 23636 const text = article.innerText; 23637 const wpm = 225; 23638 const words = text.trim().split(/\s+/).length;
23639 const time = Math.ceil(words / wpm); 23640 document.getElementById("time").innerText = time; 23641 } 23642 23643 if (article) { 23644 readingTime(); 23645 23646 article.addEventListener("mouseenter", () => { 23647 article.addEventListener("mousemove", (e) => { 23648 document.documentElement.style.setProperty("--borderPositionLG", e.pageY - article.offsetTop + "px"); 23649 }); 23650 }); 23651 } 23652 } 23653 23654 // Create summary for all news 23655 const articlePage = document.querySelector(".section article.section-inner"); 23656 if (articlePage) { 23657 const article = articlePage.querySelector(".page-grid__content"); 23658 // Get all to Nodes 23659 const h2Nodes = article.querySelectorAll("h2"); 23660 // Transform to Arr 23661 const h2Arr = Array.from(h2Nodes); 23662 // Add title into Arr 23663 const h1 = isLongFormat ? isLongFormat.querySelector(".page-grid__header h1") : article.querySelector("h1"); 23664 h2Arr.unshift(h1); 23665 23666 if (h2Arr.length > 0) { 23667 const summary = articlePage.querySelector(".sidebar-summary"); 23668 if (summary) { 23669 summary.style.display = "block"; 23670 23671 h2Arr.forEach((value, id) => { 23672 const li = document.createElement("li"); 23673 li.textContent = value.textContent; 23674 summary.querySelector(".sidebar-summary__inner ul").appendChild(li); 23675 23676 li.addEventListener("click", (e) => { 23677 const alreadyCurrent = summary.querySelector("li.isActive"); 23678 if (alreadyCurrent) alreadyCurrent.classList.remove("isActive"); 23679 li.classList.add("isActive"); 23680 value.scrollIntoView({ 23681 behavior: "smooth", 23682 block: "center" 23683 }); 23684 }); 23685 }); 23686 23687 // Change isActive value on scroll for summary list 23688 const summaryLi = summary.querySelectorAll("li"); 23689 window.addEventListener("scroll", () => { 23690 h2Arr.forEach((value, id) => { 23691 const isVisible = checkVisible(value); 23692 if (isVisible) { 23693 const alreadyCurrent = summary.querySelector("li.isActive"); 23694 if (alreadyCurrent) alreadyCurrent.classList.remove("isActive"); 23695 summaryLi[id].classList.add("isActive"); 23696 } 23697 return; 23698 }); 23699 }); 23700 } 23701 } 23702 } 23703}); 23704 23705(function () { 23706 var activeYears = []; 23707 23708 window.classeurToggleYear = function (year, btn) { 23709 var idx = activeYears.indexOf(year); 23710 if (idx === -1) { 23711 activeYears.push(year); 23712 btn.classList.add('active'); 23713 } else { 23714 activeYears.splice(idx, 1); 23715 btn.classList.remove('active'); 23716 } 23717 classeurFilter(); 23718 }; 23719 23720 window.classeurFilter = function () { 23721 var search = (document.getElementById('filter-search').value || '').toLowerCase().trim(); 23722 var cards = document.querySelectorAll('#projects-grid .project-card'); 23723 var visible = 0; 23724 23725 cards.forEach(function (card) { 23726 var matchYear = activeYears.length === 0 || activeYears.indexOf(card.dataset.year) !== -1; 23727 var abstractEl = card.querySelector('.project-card__abstract'); 23728 var searchable = (card.dataset.search || '') + (abstractEl ? ' ' + abstractEl.textContent : ''); 23729 var matchSearch = !search || searchable.toLowerCase().indexOf(search) !== -1; 23730 23731 if (matchYear && matchSearch) { 23732 card.classList.remove('hidden'); 23733 visible++; 23734 } else { 23735 card.classList.add('hidden'); 23736 } 23737 }); 23738 23739 var countEl = document.getElementById('visible-count'); 23740 if (countEl) countEl.textContent = visible; 23741 23742 var emptyEl = document.getElementById('no-results'); 23743 if (emptyEl) emptyEl.style.display = (visible === 0) ? 'block' : 'none'; 23744 }; 23745 23746 window.classeurReset = function () { 23747 document.getElementById('filter-search').value = ''; 23748 activeYears = []; 23749 document.querySelectorAll('.year-chip').forEach(function (b) { 23750 b.classList.remove('active'); 23751 }); 23752 classeurFilter(); 23753 }; 23754 23755 // ââ Popup résumé âââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 23756 23757 window.classeurShowInfo = function (el) { 23758 var card = el.closest('.project-card'); 23759 var abstractEl = card.querySelector('.project-card__abstract'); 23760 if (!abstractEl) return; 23761 23762 var acronym = card.querySelector('.project-card__acronym').textContent.trim(); 23763 var titleEl = card.querySelector('.project-card__title'); 23764 var title = titleEl ? titleEl.textContent.trim() : ''; 23765 var abstract = abstractEl.innerHTML; 23766 var isF2030 = card.dataset.type === 'france-2030'; 23767 23768 var modal = document.getElementById('classeur-modal'); 23769 var badge = document.getElementById('modal-badge'); 23770 var titleOut = document.getElementById('modal-title'); 23771 var subtitle = document.getElementById('modal-subtitle'); 23772 var abstractOut = document.getElementById('modal-abstract'); 23773 var footer = document.getElementById('modal-footer'); 23774 var f2030Logo = document.getElementById('modal-f2030-logo'); 23775 23776 badge.textContent = isF2030 ? 'France 2030' : 'Projet ANR'; 23777 badge.className = 'classeur-modal__badge ' + (isF2030 ? 'badge--f2030' : 'badge--anr'); 23778 titleOut.textContent = acronym; 23779 subtitle.textContent = (title !== acronym) ? title : ''; 23780 abstractOut.innerHTML = abstract; 23781 23782 if (f2030Logo) { 23783 if (isF2030) { f2030Logo.removeAttribute('hidden'); } 23784 else { f2030Logo.setAttribute('hidden', ''); } 23785 } 23786 23787 var projectUrl = card.dataset.url; 23788 footer.innerHTML = ''; 23789 if (projectUrl) { 23790 var a = document.createElement('a'); 23791 a.href = projectUrl; 23792 a.target = '_blank'; 23793 a.rel = 'noopener'; 23794 a.className = 'classeur-modal__link icon-arrow-right'; 23795 a.textContent = 'Consultez le résumé complet'; 23796 footer.appendChild(a); 23797 } 23798 23799 modal.classList.add('is-open'); 23800 23801 var body = modal.querySelector('.classeur-modal__body'); 23802 if (body) body.scrollTop = 0; 23803 document.body.style.overflow = 'hidden'; 23804 23805 document._classeurModalEsc = function (e) { 23806 if (e.key === 'Escape') classeurCloseModal(); 23807 }; 23808 document.addEventListener('keydown', document._classeurModalEsc); 23809 }; 23810 23811 window.classeurCloseModal = function () { 23812 var modal = document.getElementById('classeur-modal'); 23813 if (modal) modal.classList.remove('is-open'); 23814 document.body.style.overflow = ''; 23815 if (document._classeurModalEsc) { 23816 document.removeEventListener('keydown', document._classeurModalEsc); 23817 } 23818 }; 23819 23820 // ââ Fil d'ariane âââââââââââââââââââââââââââââââââââââââââââââââââââââââââ 23821 23822 var header = document.querySelector('.anr-classeur-show__header[data-breadcrumb-title]'); 23823 if (header) { 23824 var breadcrumbActive = document.querySelector('.page-breadcrumbs li.active'); 23825 if (breadcrumbActive) { 23826 breadcrumbActive.textContent = header.dataset.breadcrumbTitle; 23827 } 23828 } 23829})();
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.