{"version":3,"file":"empire.js","sources":["node_modules/jquery/dist/jquery.js","source/scripts/globals/jquery.js","node_modules/jquery-trend/jquery.trend.js","node_modules/jquery-revealer/jquery.revealer.js","node_modules/ev-emitter/ev-emitter.js","node_modules/get-size/get-size.js","node_modules/desandro-matches-selector/matches-selector.js","node_modules/fizzy-ui-utils/utils.js","node_modules/flickity/js/cell.js","node_modules/flickity/js/slide.js","node_modules/flickity/js/animate.js","node_modules/flickity/js/flickity.js","node_modules/unipointer/unipointer.js","node_modules/unidragger/unidragger.js","node_modules/flickity/js/drag.js","node_modules/tap-listener/tap-listener.js","node_modules/flickity/js/prev-next-button.js","node_modules/flickity/js/page-dots.js","node_modules/flickity/js/player.js","node_modules/flickity/js/add-remove-cell.js","node_modules/flickity/js/lazyload.js","node_modules/flickity/js/index.js","source/scripts/globals/flickity-ios-fix.js","node_modules/intersection-observer/intersection-observer.js","node_modules/rimg/dist/index.es.js","node_modules/rimg-shopify/dist/index.es.js","source/scripts/helpers/Quantity.js","source/scripts/Forms.js","source/scripts/templates/Account.js","source/scripts/templates/Contact.js","node_modules/fitvids/index.js","node_modules/grouped-content/dist/index.js","source/scripts/components/RichText.js","source/scripts/templates/Page.js","source/scripts/Sections.js","node_modules/shopify-currency-converter/dist/index.js","node_modules/scriptjs/dist/script.js","source/scripts/Layout.js","source/scripts/helpers/getHeaderOffset.js","source/scripts/components/StickyHeader.js","source/scripts/Accordion.js","source/scripts/components/NavMobileSubMenus.js","source/scripts/components/NavMobile.js","source/scripts/helpers/scrollLeft.js","source/scripts/components/MegaNavScroller.js","source/scripts/components/NavDesktop.js","node_modules/just-debounce/index.js","node_modules/eventemitter2/lib/eventemitter2.js","source/scripts/Search.js","source/scripts/components/SearchForm.js","source/scripts/components/HeaderSearchTemplates.js","source/scripts/components/HeaderSearch.js","source/scripts/sections/StaticSectionHeader.js","source/scripts/sections/StaticSectionFooter.js","source/scripts/sections/StaticArticle.js","source/scripts/sections/StaticBlog.js","source/scripts/components/MessageBanner.js","source/scripts/sections/StaticCart.js","node_modules/vanilla-modal/dist/index.js","source/scripts/components/Modal.js","source/scripts/helpers/a11y.js","source/scripts/ProductOptions.js","source/scripts/VariantHelper.js","source/scripts/helpers/Images.js","source/scripts/components/AddToCartFlyout.js","source/scripts/components/Youtube.js","source/scripts/components/Vimeo.js","source/scripts/components/Video.js","source/scripts/components/ProductGallery.js","source/scripts/components/ProductDetails.js","source/scripts/components/ProductQuickshop.js","source/scripts/components/ProductGridItem.js","source/scripts/components/RecentlyViewed.js","source/scripts/helpers/SelectWidth.js","source/scripts/sections/StaticCollection.js","source/scripts/sections/StaticGiftcard.js","source/scripts/sections/StaticPassword.js","source/scripts/components/ProductRowScroller.js","source/scripts/sections/StaticProduct.js","source/scripts/sections/StaticSearch.js","source/scripts/sections/DynamicBlogPosts.js","source/scripts/sections/StaticHighlightsBanners.js","source/scripts/sections/StaticSlideshow.js","source/scripts/sections/DynamicPromoBlocks.js","source/scripts/sections/DynamicMenuList.js","node_modules/twitter-fetcher/js/twitterFetcher_min.js","source/scripts/sections/DynamicTwitterFeed.js","source/scripts/sections/DynamicInstagramFeed.js","source/scripts/sections/DynamicFeaturedCollection.js","source/scripts/sections/DynamicSearch.js","source/scripts/sections/DynamicRichText.js","source/scripts/sections/DynamicVideo.js","source/scripts/sections/DynamicNewsletter.js","node_modules/pxs-map/dist/index.es.js","source/scripts/Empire.js"],"sourcesContent":["/*!\n * jQuery JavaScript Library v3.3.1\n * https://jquery.com/\n *\n * Includes Sizzle.js\n * https://sizzlejs.com/\n *\n * Copyright JS Foundation and other contributors\n * Released under the MIT license\n * https://jquery.org/license\n *\n * Date: 2018-01-20T17:24Z\n */\n( function( global, factory ) {\n\n\t\"use strict\";\n\n\tif ( typeof module === \"object\" && typeof module.exports === \"object\" ) {\n\n\t\t// For CommonJS and CommonJS-like environments where a proper `window`\n\t\t// is present, execute the factory and get jQuery.\n\t\t// For environments that do not have a `window` with a `document`\n\t\t// (such as Node.js), expose a factory as module.exports.\n\t\t// This accentuates the need for the creation of a real `window`.\n\t\t// e.g. var jQuery = require(\"jquery\")(window);\n\t\t// See ticket #14549 for more info.\n\t\tmodule.exports = global.document ?\n\t\t\tfactory( global, true ) :\n\t\t\tfunction( w ) {\n\t\t\t\tif ( !w.document ) {\n\t\t\t\t\tthrow new Error( \"jQuery requires a window with a document\" );\n\t\t\t\t}\n\t\t\t\treturn factory( w );\n\t\t\t};\n\t} else {\n\t\tfactory( global );\n\t}\n\n// Pass this if window is not defined yet\n} )( typeof window !== \"undefined\" ? window : this, function( window, noGlobal ) {\n\n// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1\n// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode\n// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common\n// enough that all such attempts are guarded in a try block.\n\"use strict\";\n\nvar arr = [];\n\nvar document = window.document;\n\nvar getProto = Object.getPrototypeOf;\n\nvar slice = arr.slice;\n\nvar concat = arr.concat;\n\nvar push = arr.push;\n\nvar indexOf = arr.indexOf;\n\nvar class2type = {};\n\nvar toString = class2type.toString;\n\nvar hasOwn = class2type.hasOwnProperty;\n\nvar fnToString = hasOwn.toString;\n\nvar ObjectFunctionString = fnToString.call( Object );\n\nvar support = {};\n\nvar isFunction = function isFunction( obj ) {\n\n      // Support: Chrome <=57, Firefox <=52\n      // In some browsers, typeof returns \"function\" for HTML <object> elements\n      // (i.e., `typeof document.createElement( \"object\" ) === \"function\"`).\n      // We don't want to classify *any* DOM node as a function.\n      return typeof obj === \"function\" && typeof obj.nodeType !== \"number\";\n  };\n\n\nvar isWindow = function isWindow( obj ) {\n\t\treturn obj != null && obj === obj.window;\n\t};\n\n\n\n\n\tvar preservedScriptAttributes = {\n\t\ttype: true,\n\t\tsrc: true,\n\t\tnoModule: true\n\t};\n\n\tfunction DOMEval( code, doc, node ) {\n\t\tdoc = doc || document;\n\n\t\tvar i,\n\t\t\tscript = doc.createElement( \"script\" );\n\n\t\tscript.text = code;\n\t\tif ( node ) {\n\t\t\tfor ( i in preservedScriptAttributes ) {\n\t\t\t\tif ( node[ i ] ) {\n\t\t\t\t\tscript[ i ] = node[ i ];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tdoc.head.appendChild( script ).parentNode.removeChild( script );\n\t}\n\n\nfunction toType( obj ) {\n\tif ( obj == null ) {\n\t\treturn obj + \"\";\n\t}\n\n\t// Support: Android <=2.3 only (functionish RegExp)\n\treturn typeof obj === \"object\" || typeof obj === \"function\" ?\n\t\tclass2type[ toString.call( obj ) ] || \"object\" :\n\t\ttypeof obj;\n}\n/* global Symbol */\n// Defining this global in .eslintrc.json would create a danger of using the global\n// unguarded in another place, it seems safer to define global only for this module\n\n\n\nvar\n\tversion = \"3.3.1\",\n\n\t// Define a local copy of jQuery\n\tjQuery = function( selector, context ) {\n\n\t\t// The jQuery object is actually just the init constructor 'enhanced'\n\t\t// Need init if jQuery is called (just allow error to be thrown if not included)\n\t\treturn new jQuery.fn.init( selector, context );\n\t},\n\n\t// Support: Android <=4.0 only\n\t// Make sure we trim BOM and NBSP\n\trtrim = /^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g;\n\njQuery.fn = jQuery.prototype = {\n\n\t// The current version of jQuery being used\n\tjquery: version,\n\n\tconstructor: jQuery,\n\n\t// The default length of a jQuery object is 0\n\tlength: 0,\n\n\ttoArray: function() {\n\t\treturn slice.call( this );\n\t},\n\n\t// Get the Nth element in the matched element set OR\n\t// Get the whole matched element set as a clean array\n\tget: function( num ) {\n\n\t\t// Return all the elements in a clean array\n\t\tif ( num == null ) {\n\t\t\treturn slice.call( this );\n\t\t}\n\n\t\t// Return just the one element from the set\n\t\treturn num < 0 ? this[ num + this.length ] : this[ num ];\n\t},\n\n\t// Take an array of elements and push it onto the stack\n\t// (returning the new matched element set)\n\tpushStack: function( elems ) {\n\n\t\t// Build a new jQuery matched element set\n\t\tvar ret = jQuery.merge( this.constructor(), elems );\n\n\t\t// Add the old object onto the stack (as a reference)\n\t\tret.prevObject = this;\n\n\t\t// Return the newly-formed element set\n\t\treturn ret;\n\t},\n\n\t// Execute a callback for every element in the matched set.\n\teach: function( callback ) {\n\t\treturn jQuery.each( this, callback );\n\t},\n\n\tmap: function( callback ) {\n\t\treturn this.pushStack( jQuery.map( this, function( elem, i ) {\n\t\t\treturn callback.call( elem, i, elem );\n\t\t} ) );\n\t},\n\n\tslice: function() {\n\t\treturn this.pushStack( slice.apply( this, arguments ) );\n\t},\n\n\tfirst: function() {\n\t\treturn this.eq( 0 );\n\t},\n\n\tlast: function() {\n\t\treturn this.eq( -1 );\n\t},\n\n\teq: function( i ) {\n\t\tvar len = this.length,\n\t\t\tj = +i + ( i < 0 ? len : 0 );\n\t\treturn this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );\n\t},\n\n\tend: function() {\n\t\treturn this.prevObject || this.constructor();\n\t},\n\n\t// For internal use only.\n\t// Behaves like an Array's method, not like a jQuery method.\n\tpush: push,\n\tsort: arr.sort,\n\tsplice: arr.splice\n};\n\njQuery.extend = jQuery.fn.extend = function() {\n\tvar options, name, src, copy, copyIsArray, clone,\n\t\ttarget = arguments[ 0 ] || {},\n\t\ti = 1,\n\t\tlength = arguments.length,\n\t\tdeep = false;\n\n\t// Handle a deep copy situation\n\tif ( typeof target === \"boolean\" ) {\n\t\tdeep = target;\n\n\t\t// Skip the boolean and the target\n\t\ttarget = arguments[ i ] || {};\n\t\ti++;\n\t}\n\n\t// Handle case when target is a string or something (possible in deep copy)\n\tif ( typeof target !== \"object\" && !isFunction( target ) ) {\n\t\ttarget = {};\n\t}\n\n\t// Extend jQuery itself if only one argument is passed\n\tif ( i === length ) {\n\t\ttarget = this;\n\t\ti--;\n\t}\n\n\tfor ( ; i < length; i++ ) {\n\n\t\t// Only deal with non-null/undefined values\n\t\tif ( ( options = arguments[ i ] ) != null ) {\n\n\t\t\t// Extend the base object\n\t\t\tfor ( name in options ) {\n\t\t\t\tsrc = target[ name ];\n\t\t\t\tcopy = options[ name ];\n\n\t\t\t\t// Prevent never-ending loop\n\t\t\t\tif ( target === copy ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Recurse if we're merging plain objects or arrays\n\t\t\t\tif ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n\t\t\t\t\t( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n\t\t\t\t\tif ( copyIsArray ) {\n\t\t\t\t\t\tcopyIsArray = false;\n\t\t\t\t\t\tclone = src && Array.isArray( src ) ? src : [];\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tclone = src && jQuery.isPlainObject( src ) ? src : {};\n\t\t\t\t\t}\n\n\t\t\t\t\t// Never move original objects, clone them\n\t\t\t\t\ttarget[ name ] = jQuery.extend( deep, clone, copy );\n\n\t\t\t\t// Don't bring in undefined values\n\t\t\t\t} else if ( copy !== undefined ) {\n\t\t\t\t\ttarget[ name ] = copy;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Return the modified object\n\treturn target;\n};\n\njQuery.extend( {\n\n\t// Unique for each copy of jQuery on the page\n\texpando: \"jQuery\" + ( version + Math.random() ).replace( /\\D/g, \"\" ),\n\n\t// Assume jQuery is ready without the ready module\n\tisReady: true,\n\n\terror: function( msg ) {\n\t\tthrow new Error( msg );\n\t},\n\n\tnoop: function() {},\n\n\tisPlainObject: function( obj ) {\n\t\tvar proto, Ctor;\n\n\t\t// Detect obvious negatives\n\t\t// Use toString instead of jQuery.type to catch host objects\n\t\tif ( !obj || toString.call( obj ) !== \"[object Object]\" ) {\n\t\t\treturn false;\n\t\t}\n\n\t\tproto = getProto( obj );\n\n\t\t// Objects with no prototype (e.g., `Object.create( null )`) are plain\n\t\tif ( !proto ) {\n\t\t\treturn true;\n\t\t}\n\n\t\t// Objects with prototype are plain iff they were constructed by a global Object function\n\t\tCtor = hasOwn.call( proto, \"constructor\" ) && proto.constructor;\n\t\treturn typeof Ctor === \"function\" && fnToString.call( Ctor ) === ObjectFunctionString;\n\t},\n\n\tisEmptyObject: function( obj ) {\n\n\t\t/* eslint-disable no-unused-vars */\n\t\t// See https://github.com/eslint/eslint/issues/6125\n\t\tvar name;\n\n\t\tfor ( name in obj ) {\n\t\t\treturn false;\n\t\t}\n\t\treturn true;\n\t},\n\n\t// Evaluates a script in a global context\n\tglobalEval: function( code ) {\n\t\tDOMEval( code );\n\t},\n\n\teach: function( obj, callback ) {\n\t\tvar length, i = 0;\n\n\t\tif ( isArrayLike( obj ) ) {\n\t\t\tlength = obj.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tfor ( i in obj ) {\n\t\t\t\tif ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn obj;\n\t},\n\n\t// Support: Android <=4.0 only\n\ttrim: function( text ) {\n\t\treturn text == null ?\n\t\t\t\"\" :\n\t\t\t( text + \"\" ).replace( rtrim, \"\" );\n\t},\n\n\t// results is for internal usage only\n\tmakeArray: function( arr, results ) {\n\t\tvar ret = results || [];\n\n\t\tif ( arr != null ) {\n\t\t\tif ( isArrayLike( Object( arr ) ) ) {\n\t\t\t\tjQuery.merge( ret,\n\t\t\t\t\ttypeof arr === \"string\" ?\n\t\t\t\t\t[ arr ] : arr\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tpush.call( ret, arr );\n\t\t\t}\n\t\t}\n\n\t\treturn ret;\n\t},\n\n\tinArray: function( elem, arr, i ) {\n\t\treturn arr == null ? -1 : indexOf.call( arr, elem, i );\n\t},\n\n\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t// push.apply(_, arraylike) throws on ancient WebKit\n\tmerge: function( first, second ) {\n\t\tvar len = +second.length,\n\t\t\tj = 0,\n\t\t\ti = first.length;\n\n\t\tfor ( ; j < len; j++ ) {\n\t\t\tfirst[ i++ ] = second[ j ];\n\t\t}\n\n\t\tfirst.length = i;\n\n\t\treturn first;\n\t},\n\n\tgrep: function( elems, callback, invert ) {\n\t\tvar callbackInverse,\n\t\t\tmatches = [],\n\t\t\ti = 0,\n\t\t\tlength = elems.length,\n\t\t\tcallbackExpect = !invert;\n\n\t\t// Go through the array, only saving the items\n\t\t// that pass the validator function\n\t\tfor ( ; i < length; i++ ) {\n\t\t\tcallbackInverse = !callback( elems[ i ], i );\n\t\t\tif ( callbackInverse !== callbackExpect ) {\n\t\t\t\tmatches.push( elems[ i ] );\n\t\t\t}\n\t\t}\n\n\t\treturn matches;\n\t},\n\n\t// arg is for internal usage only\n\tmap: function( elems, callback, arg ) {\n\t\tvar length, value,\n\t\t\ti = 0,\n\t\t\tret = [];\n\n\t\t// Go through the array, translating each of the items to their new values\n\t\tif ( isArrayLike( elems ) ) {\n\t\t\tlength = elems.length;\n\t\t\tfor ( ; i < length; i++ ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Go through every key on the object,\n\t\t} else {\n\t\t\tfor ( i in elems ) {\n\t\t\t\tvalue = callback( elems[ i ], i, arg );\n\n\t\t\t\tif ( value != null ) {\n\t\t\t\t\tret.push( value );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Flatten any nested arrays\n\t\treturn concat.apply( [], ret );\n\t},\n\n\t// A global GUID counter for objects\n\tguid: 1,\n\n\t// jQuery.support is not used in Core but other projects attach their\n\t// properties to it so it needs to exist.\n\tsupport: support\n} );\n\nif ( typeof Symbol === \"function\" ) {\n\tjQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];\n}\n\n// Populate the class2type map\njQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\nfunction( i, name ) {\n\tclass2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n} );\n\nfunction isArrayLike( obj ) {\n\n\t// Support: real iOS 8.2 only (not reproducible in simulator)\n\t// `in` check used to prevent JIT error (gh-2145)\n\t// hasOwn isn't used here due to false negatives\n\t// regarding Nodelist length in IE\n\tvar length = !!obj && \"length\" in obj && obj.length,\n\t\ttype = toType( obj );\n\n\tif ( isFunction( obj ) || isWindow( obj ) ) {\n\t\treturn false;\n\t}\n\n\treturn type === \"array\" || length === 0 ||\n\t\ttypeof length === \"number\" && length > 0 && ( length - 1 ) in obj;\n}\nvar Sizzle =\n/*!\n * Sizzle CSS Selector Engine v2.3.3\n * https://sizzlejs.com/\n *\n * Copyright jQuery Foundation and other contributors\n * Released under the MIT license\n * http://jquery.org/license\n *\n * Date: 2016-08-08\n */\n(function( window ) {\n\nvar i,\n\tsupport,\n\tExpr,\n\tgetText,\n\tisXML,\n\ttokenize,\n\tcompile,\n\tselect,\n\toutermostContext,\n\tsortInput,\n\thasDuplicate,\n\n\t// Local document vars\n\tsetDocument,\n\tdocument,\n\tdocElem,\n\tdocumentIsHTML,\n\trbuggyQSA,\n\trbuggyMatches,\n\tmatches,\n\tcontains,\n\n\t// Instance-specific data\n\texpando = \"sizzle\" + 1 * new Date(),\n\tpreferredDoc = window.document,\n\tdirruns = 0,\n\tdone = 0,\n\tclassCache = createCache(),\n\ttokenCache = createCache(),\n\tcompilerCache = createCache(),\n\tsortOrder = function( a, b ) {\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t}\n\t\treturn 0;\n\t},\n\n\t// Instance methods\n\thasOwn = ({}).hasOwnProperty,\n\tarr = [],\n\tpop = arr.pop,\n\tpush_native = arr.push,\n\tpush = arr.push,\n\tslice = arr.slice,\n\t// Use a stripped-down indexOf as it's faster than native\n\t// https://jsperf.com/thor-indexof-vs-for/5\n\tindexOf = function( list, elem ) {\n\t\tvar i = 0,\n\t\t\tlen = list.length;\n\t\tfor ( ; i < len; i++ ) {\n\t\t\tif ( list[i] === elem ) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t},\n\n\tbooleans = \"checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped\",\n\n\t// Regular expressions\n\n\t// http://www.w3.org/TR/css3-selectors/#whitespace\n\twhitespace = \"[\\\\x20\\\\t\\\\r\\\\n\\\\f]\",\n\n\t// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\n\tidentifier = \"(?:\\\\\\\\.|[\\\\w-]|[^\\0-\\\\xa0])+\",\n\n\t// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors\n\tattributes = \"\\\\[\" + whitespace + \"*(\" + identifier + \")(?:\" + whitespace +\n\t\t// Operator (capture 2)\n\t\t\"*([*^$|!~]?=)\" + whitespace +\n\t\t// \"Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]\"\n\t\t\"*(?:'((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\"|(\" + identifier + \"))|)\" + whitespace +\n\t\t\"*\\\\]\",\n\n\tpseudos = \":(\" + identifier + \")(?:\\\\((\" +\n\t\t// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:\n\t\t// 1. quoted (capture 3; capture 4 or capture 5)\n\t\t\"('((?:\\\\\\\\.|[^\\\\\\\\'])*)'|\\\"((?:\\\\\\\\.|[^\\\\\\\\\\\"])*)\\\")|\" +\n\t\t// 2. simple (capture 6)\n\t\t\"((?:\\\\\\\\.|[^\\\\\\\\()[\\\\]]|\" + attributes + \")*)|\" +\n\t\t// 3. anything else (capture 2)\n\t\t\".*\" +\n\t\t\")\\\\)|)\",\n\n\t// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\n\trwhitespace = new RegExp( whitespace + \"+\", \"g\" ),\n\trtrim = new RegExp( \"^\" + whitespace + \"+|((?:^|[^\\\\\\\\])(?:\\\\\\\\.)*)\" + whitespace + \"+$\", \"g\" ),\n\n\trcomma = new RegExp( \"^\" + whitespace + \"*,\" + whitespace + \"*\" ),\n\trcombinators = new RegExp( \"^\" + whitespace + \"*([>+~]|\" + whitespace + \")\" + whitespace + \"*\" ),\n\n\trattributeQuotes = new RegExp( \"=\" + whitespace + \"*([^\\\\]'\\\"]*?)\" + whitespace + \"*\\\\]\", \"g\" ),\n\n\trpseudo = new RegExp( pseudos ),\n\tridentifier = new RegExp( \"^\" + identifier + \"$\" ),\n\n\tmatchExpr = {\n\t\t\"ID\": new RegExp( \"^#(\" + identifier + \")\" ),\n\t\t\"CLASS\": new RegExp( \"^\\\\.(\" + identifier + \")\" ),\n\t\t\"TAG\": new RegExp( \"^(\" + identifier + \"|[*])\" ),\n\t\t\"ATTR\": new RegExp( \"^\" + attributes ),\n\t\t\"PSEUDO\": new RegExp( \"^\" + pseudos ),\n\t\t\"CHILD\": new RegExp( \"^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\\\(\" + whitespace +\n\t\t\t\"*(even|odd|(([+-]|)(\\\\d*)n|)\" + whitespace + \"*(?:([+-]|)\" + whitespace +\n\t\t\t\"*(\\\\d+)|))\" + whitespace + \"*\\\\)|)\", \"i\" ),\n\t\t\"bool\": new RegExp( \"^(?:\" + booleans + \")$\", \"i\" ),\n\t\t// For use in libraries implementing .is()\n\t\t// We use this for POS matching in `select`\n\t\t\"needsContext\": new RegExp( \"^\" + whitespace + \"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\\\(\" +\n\t\t\twhitespace + \"*((?:-\\\\d)?\\\\d*)\" + whitespace + \"*\\\\)|)(?=[^-]|$)\", \"i\" )\n\t},\n\n\trinputs = /^(?:input|select|textarea|button)$/i,\n\trheader = /^h\\d$/i,\n\n\trnative = /^[^{]+\\{\\s*\\[native \\w/,\n\n\t// Easily-parseable/retrievable ID or TAG or CLASS selectors\n\trquickExpr = /^(?:#([\\w-]+)|(\\w+)|\\.([\\w-]+))$/,\n\n\trsibling = /[+~]/,\n\n\t// CSS escapes\n\t// http://www.w3.org/TR/CSS21/syndata.html#escaped-characters\n\trunescape = new RegExp( \"\\\\\\\\([\\\\da-f]{1,6}\" + whitespace + \"?|(\" + whitespace + \")|.)\", \"ig\" ),\n\tfunescape = function( _, escaped, escapedWhitespace ) {\n\t\tvar high = \"0x\" + escaped - 0x10000;\n\t\t// NaN means non-codepoint\n\t\t// Support: Firefox<24\n\t\t// Workaround erroneous numeric interpretation of +\"0x\"\n\t\treturn high !== high || escapedWhitespace ?\n\t\t\tescaped :\n\t\t\thigh < 0 ?\n\t\t\t\t// BMP codepoint\n\t\t\t\tString.fromCharCode( high + 0x10000 ) :\n\t\t\t\t// Supplemental Plane codepoint (surrogate pair)\n\t\t\t\tString.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );\n\t},\n\n\t// CSS string/identifier serialization\n\t// https://drafts.csswg.org/cssom/#common-serializing-idioms\n\trcssescape = /([\\0-\\x1f\\x7f]|^-?\\d)|^-$|[^\\0-\\x1f\\x7f-\\uFFFF\\w-]/g,\n\tfcssescape = function( ch, asCodePoint ) {\n\t\tif ( asCodePoint ) {\n\n\t\t\t// U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER\n\t\t\tif ( ch === \"\\0\" ) {\n\t\t\t\treturn \"\\uFFFD\";\n\t\t\t}\n\n\t\t\t// Control characters and (dependent upon position) numbers get escaped as code points\n\t\t\treturn ch.slice( 0, -1 ) + \"\\\\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + \" \";\n\t\t}\n\n\t\t// Other potentially-special ASCII characters get backslash-escaped\n\t\treturn \"\\\\\" + ch;\n\t},\n\n\t// Used for iframes\n\t// See setDocument()\n\t// Removing the function wrapper causes a \"Permission Denied\"\n\t// error in IE\n\tunloadHandler = function() {\n\t\tsetDocument();\n\t},\n\n\tdisabledAncestor = addCombinator(\n\t\tfunction( elem ) {\n\t\t\treturn elem.disabled === true && (\"form\" in elem || \"label\" in elem);\n\t\t},\n\t\t{ dir: \"parentNode\", next: \"legend\" }\n\t);\n\n// Optimize for push.apply( _, NodeList )\ntry {\n\tpush.apply(\n\t\t(arr = slice.call( preferredDoc.childNodes )),\n\t\tpreferredDoc.childNodes\n\t);\n\t// Support: Android<4.0\n\t// Detect silently failing push.apply\n\tarr[ preferredDoc.childNodes.length ].nodeType;\n} catch ( e ) {\n\tpush = { apply: arr.length ?\n\n\t\t// Leverage slice if possible\n\t\tfunction( target, els ) {\n\t\t\tpush_native.apply( target, slice.call(els) );\n\t\t} :\n\n\t\t// Support: IE<9\n\t\t// Otherwise append directly\n\t\tfunction( target, els ) {\n\t\t\tvar j = target.length,\n\t\t\t\ti = 0;\n\t\t\t// Can't trust NodeList.length\n\t\t\twhile ( (target[j++] = els[i++]) ) {}\n\t\t\ttarget.length = j - 1;\n\t\t}\n\t};\n}\n\nfunction Sizzle( selector, context, results, seed ) {\n\tvar m, i, elem, nid, match, groups, newSelector,\n\t\tnewContext = context && context.ownerDocument,\n\n\t\t// nodeType defaults to 9, since context defaults to document\n\t\tnodeType = context ? context.nodeType : 9;\n\n\tresults = results || [];\n\n\t// Return early from calls with invalid selector or context\n\tif ( typeof selector !== \"string\" || !selector ||\n\t\tnodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {\n\n\t\treturn results;\n\t}\n\n\t// Try to shortcut find operations (as opposed to filters) in HTML documents\n\tif ( !seed ) {\n\n\t\tif ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {\n\t\t\tsetDocument( context );\n\t\t}\n\t\tcontext = context || document;\n\n\t\tif ( documentIsHTML ) {\n\n\t\t\t// If the selector is sufficiently simple, try using a \"get*By*\" DOM method\n\t\t\t// (excepting DocumentFragment context, where the methods don't exist)\n\t\t\tif ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {\n\n\t\t\t\t// ID selector\n\t\t\t\tif ( (m = match[1]) ) {\n\n\t\t\t\t\t// Document context\n\t\t\t\t\tif ( nodeType === 9 ) {\n\t\t\t\t\t\tif ( (elem = context.getElementById( m )) ) {\n\n\t\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\t\tif ( elem.id === m ) {\n\t\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// Element context\n\t\t\t\t\t} else {\n\n\t\t\t\t\t\t// Support: IE, Opera, Webkit\n\t\t\t\t\t\t// TODO: identify versions\n\t\t\t\t\t\t// getElementById can match elements by name instead of ID\n\t\t\t\t\t\tif ( newContext && (elem = newContext.getElementById( m )) &&\n\t\t\t\t\t\t\tcontains( context, elem ) &&\n\t\t\t\t\t\t\telem.id === m ) {\n\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\treturn results;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t// Type selector\n\t\t\t\t} else if ( match[2] ) {\n\t\t\t\t\tpush.apply( results, context.getElementsByTagName( selector ) );\n\t\t\t\t\treturn results;\n\n\t\t\t\t// Class selector\n\t\t\t\t} else if ( (m = match[3]) && support.getElementsByClassName &&\n\t\t\t\t\tcontext.getElementsByClassName ) {\n\n\t\t\t\t\tpush.apply( results, context.getElementsByClassName( m ) );\n\t\t\t\t\treturn results;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Take advantage of querySelectorAll\n\t\t\tif ( support.qsa &&\n\t\t\t\t!compilerCache[ selector + \" \" ] &&\n\t\t\t\t(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\n\n\t\t\t\tif ( nodeType !== 1 ) {\n\t\t\t\t\tnewContext = context;\n\t\t\t\t\tnewSelector = selector;\n\n\t\t\t\t// qSA looks outside Element context, which is not what we want\n\t\t\t\t// Thanks to Andrew Dupont for this workaround technique\n\t\t\t\t// Support: IE <=8\n\t\t\t\t// Exclude object elements\n\t\t\t\t} else if ( context.nodeName.toLowerCase() !== \"object\" ) {\n\n\t\t\t\t\t// Capture the context ID, setting it first if necessary\n\t\t\t\t\tif ( (nid = context.getAttribute( \"id\" )) ) {\n\t\t\t\t\t\tnid = nid.replace( rcssescape, fcssescape );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcontext.setAttribute( \"id\", (nid = expando) );\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prefix every selector in the list\n\t\t\t\t\tgroups = tokenize( selector );\n\t\t\t\t\ti = groups.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tgroups[i] = \"#\" + nid + \" \" + toSelector( groups[i] );\n\t\t\t\t\t}\n\t\t\t\t\tnewSelector = groups.join( \",\" );\n\n\t\t\t\t\t// Expand context for sibling selectors\n\t\t\t\t\tnewContext = rsibling.test( selector ) && testContext( context.parentNode ) ||\n\t\t\t\t\t\tcontext;\n\t\t\t\t}\n\n\t\t\t\tif ( newSelector ) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tpush.apply( results,\n\t\t\t\t\t\t\tnewContext.querySelectorAll( newSelector )\n\t\t\t\t\t\t);\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t} catch ( qsaError ) {\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tif ( nid === expando ) {\n\t\t\t\t\t\t\tcontext.removeAttribute( \"id\" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// All others\n\treturn select( selector.replace( rtrim, \"$1\" ), context, results, seed );\n}\n\n/**\n * Create key-value caches of limited size\n * @returns {function(string, object)} Returns the Object data after storing it on itself with\n *\tproperty name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)\n *\tdeleting the oldest entry\n */\nfunction createCache() {\n\tvar keys = [];\n\n\tfunction cache( key, value ) {\n\t\t// Use (key + \" \") to avoid collision with native prototype properties (see Issue #157)\n\t\tif ( keys.push( key + \" \" ) > Expr.cacheLength ) {\n\t\t\t// Only keep the most recent entries\n\t\t\tdelete cache[ keys.shift() ];\n\t\t}\n\t\treturn (cache[ key + \" \" ] = value);\n\t}\n\treturn cache;\n}\n\n/**\n * Mark a function for special use by Sizzle\n * @param {Function} fn The function to mark\n */\nfunction markFunction( fn ) {\n\tfn[ expando ] = true;\n\treturn fn;\n}\n\n/**\n * Support testing using an element\n * @param {Function} fn Passed the created element and returns a boolean result\n */\nfunction assert( fn ) {\n\tvar el = document.createElement(\"fieldset\");\n\n\ttry {\n\t\treturn !!fn( el );\n\t} catch (e) {\n\t\treturn false;\n\t} finally {\n\t\t// Remove from its parent by default\n\t\tif ( el.parentNode ) {\n\t\t\tel.parentNode.removeChild( el );\n\t\t}\n\t\t// release memory in IE\n\t\tel = null;\n\t}\n}\n\n/**\n * Adds the same handler for all of the specified attrs\n * @param {String} attrs Pipe-separated list of attributes\n * @param {Function} handler The method that will be applied\n */\nfunction addHandle( attrs, handler ) {\n\tvar arr = attrs.split(\"|\"),\n\t\ti = arr.length;\n\n\twhile ( i-- ) {\n\t\tExpr.attrHandle[ arr[i] ] = handler;\n\t}\n}\n\n/**\n * Checks document order of two siblings\n * @param {Element} a\n * @param {Element} b\n * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b\n */\nfunction siblingCheck( a, b ) {\n\tvar cur = b && a,\n\t\tdiff = cur && a.nodeType === 1 && b.nodeType === 1 &&\n\t\t\ta.sourceIndex - b.sourceIndex;\n\n\t// Use IE sourceIndex if available on both nodes\n\tif ( diff ) {\n\t\treturn diff;\n\t}\n\n\t// Check if b follows a\n\tif ( cur ) {\n\t\twhile ( (cur = cur.nextSibling) ) {\n\t\t\tif ( cur === b ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn a ? 1 : -1;\n}\n\n/**\n * Returns a function to use in pseudos for input types\n * @param {String} type\n */\nfunction createInputPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn name === \"input\" && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for buttons\n * @param {String} type\n */\nfunction createButtonPseudo( type ) {\n\treturn function( elem ) {\n\t\tvar name = elem.nodeName.toLowerCase();\n\t\treturn (name === \"input\" || name === \"button\") && elem.type === type;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for :enabled/:disabled\n * @param {Boolean} disabled true for :disabled; false for :enabled\n */\nfunction createDisabledPseudo( disabled ) {\n\n\t// Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable\n\treturn function( elem ) {\n\n\t\t// Only certain elements can match :enabled or :disabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled\n\t\t// https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled\n\t\tif ( \"form\" in elem ) {\n\n\t\t\t// Check for inherited disabledness on relevant non-disabled elements:\n\t\t\t// * listed form-associated elements in a disabled fieldset\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#category-listed\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled\n\t\t\t// * option elements in a disabled optgroup\n\t\t\t//   https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled\n\t\t\t// All such elements have a \"form\" property.\n\t\t\tif ( elem.parentNode && elem.disabled === false ) {\n\n\t\t\t\t// Option elements defer to a parent optgroup if present\n\t\t\t\tif ( \"label\" in elem ) {\n\t\t\t\t\tif ( \"label\" in elem.parentNode ) {\n\t\t\t\t\t\treturn elem.parentNode.disabled === disabled;\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn elem.disabled === disabled;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Support: IE 6 - 11\n\t\t\t\t// Use the isDisabled shortcut property to check for disabled fieldset ancestors\n\t\t\t\treturn elem.isDisabled === disabled ||\n\n\t\t\t\t\t// Where there is no isDisabled, check manually\n\t\t\t\t\t/* jshint -W018 */\n\t\t\t\t\telem.isDisabled !== !disabled &&\n\t\t\t\t\t\tdisabledAncestor( elem ) === disabled;\n\t\t\t}\n\n\t\t\treturn elem.disabled === disabled;\n\n\t\t// Try to winnow out elements that can't be disabled before trusting the disabled property.\n\t\t// Some victims get caught in our net (label, legend, menu, track), but it shouldn't\n\t\t// even exist on them, let alone have a boolean value.\n\t\t} else if ( \"label\" in elem ) {\n\t\t\treturn elem.disabled === disabled;\n\t\t}\n\n\t\t// Remaining elements are neither :enabled nor :disabled\n\t\treturn false;\n\t};\n}\n\n/**\n * Returns a function to use in pseudos for positionals\n * @param {Function} fn\n */\nfunction createPositionalPseudo( fn ) {\n\treturn markFunction(function( argument ) {\n\t\targument = +argument;\n\t\treturn markFunction(function( seed, matches ) {\n\t\t\tvar j,\n\t\t\t\tmatchIndexes = fn( [], seed.length, argument ),\n\t\t\t\ti = matchIndexes.length;\n\n\t\t\t// Match elements found at the specified indexes\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( seed[ (j = matchIndexes[i]) ] ) {\n\t\t\t\t\tseed[j] = !(matches[j] = seed[j]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t});\n}\n\n/**\n * Checks a node for validity as a Sizzle context\n * @param {Element|Object=} context\n * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value\n */\nfunction testContext( context ) {\n\treturn context && typeof context.getElementsByTagName !== \"undefined\" && context;\n}\n\n// Expose support vars for convenience\nsupport = Sizzle.support = {};\n\n/**\n * Detects XML nodes\n * @param {Element|Object} elem An element or a document\n * @returns {Boolean} True iff elem is a non-HTML XML node\n */\nisXML = Sizzle.isXML = function( elem ) {\n\t// documentElement is verified for cases where it doesn't yet exist\n\t// (such as loading iframes in IE - #4833)\n\tvar documentElement = elem && (elem.ownerDocument || elem).documentElement;\n\treturn documentElement ? documentElement.nodeName !== \"HTML\" : false;\n};\n\n/**\n * Sets document-related variables once based on the current document\n * @param {Element|Object} [doc] An element or document object to use to set the document\n * @returns {Object} Returns the current document\n */\nsetDocument = Sizzle.setDocument = function( node ) {\n\tvar hasCompare, subWindow,\n\t\tdoc = node ? node.ownerDocument || node : preferredDoc;\n\n\t// Return early if doc is invalid or already selected\n\tif ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {\n\t\treturn document;\n\t}\n\n\t// Update global variables\n\tdocument = doc;\n\tdocElem = document.documentElement;\n\tdocumentIsHTML = !isXML( document );\n\n\t// Support: IE 9-11, Edge\n\t// Accessing iframe documents after unload throws \"permission denied\" errors (jQuery #13936)\n\tif ( preferredDoc !== document &&\n\t\t(subWindow = document.defaultView) && subWindow.top !== subWindow ) {\n\n\t\t// Support: IE 11, Edge\n\t\tif ( subWindow.addEventListener ) {\n\t\t\tsubWindow.addEventListener( \"unload\", unloadHandler, false );\n\n\t\t// Support: IE 9 - 10 only\n\t\t} else if ( subWindow.attachEvent ) {\n\t\t\tsubWindow.attachEvent( \"onunload\", unloadHandler );\n\t\t}\n\t}\n\n\t/* Attributes\n\t---------------------------------------------------------------------- */\n\n\t// Support: IE<8\n\t// Verify that getAttribute really returns attributes and not properties\n\t// (excepting IE8 booleans)\n\tsupport.attributes = assert(function( el ) {\n\t\tel.className = \"i\";\n\t\treturn !el.getAttribute(\"className\");\n\t});\n\n\t/* getElement(s)By*\n\t---------------------------------------------------------------------- */\n\n\t// Check if getElementsByTagName(\"*\") returns only elements\n\tsupport.getElementsByTagName = assert(function( el ) {\n\t\tel.appendChild( document.createComment(\"\") );\n\t\treturn !el.getElementsByTagName(\"*\").length;\n\t});\n\n\t// Support: IE<9\n\tsupport.getElementsByClassName = rnative.test( document.getElementsByClassName );\n\n\t// Support: IE<10\n\t// Check if getElementById returns elements by name\n\t// The broken getElementById methods don't pick up programmatically-set names,\n\t// so use a roundabout getElementsByName test\n\tsupport.getById = assert(function( el ) {\n\t\tdocElem.appendChild( el ).id = expando;\n\t\treturn !document.getElementsByName || !document.getElementsByName( expando ).length;\n\t});\n\n\t// ID filter and find\n\tif ( support.getById ) {\n\t\tExpr.filter[\"ID\"] = function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn elem.getAttribute(\"id\") === attrId;\n\t\t\t};\n\t\t};\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar elem = context.getElementById( id );\n\t\t\t\treturn elem ? [ elem ] : [];\n\t\t\t}\n\t\t};\n\t} else {\n\t\tExpr.filter[\"ID\"] =  function( id ) {\n\t\t\tvar attrId = id.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\tvar node = typeof elem.getAttributeNode !== \"undefined\" &&\n\t\t\t\t\telem.getAttributeNode(\"id\");\n\t\t\t\treturn node && node.value === attrId;\n\t\t\t};\n\t\t};\n\n\t\t// Support: IE 6 - 7 only\n\t\t// getElementById is not reliable as a find shortcut\n\t\tExpr.find[\"ID\"] = function( id, context ) {\n\t\t\tif ( typeof context.getElementById !== \"undefined\" && documentIsHTML ) {\n\t\t\t\tvar node, i, elems,\n\t\t\t\t\telem = context.getElementById( id );\n\n\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t// Verify the id attribute\n\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t}\n\n\t\t\t\t\t// Fall back on getElementsByName\n\t\t\t\t\telems = context.getElementsByName( id );\n\t\t\t\t\ti = 0;\n\t\t\t\t\twhile ( (elem = elems[i++]) ) {\n\t\t\t\t\t\tnode = elem.getAttributeNode(\"id\");\n\t\t\t\t\t\tif ( node && node.value === id ) {\n\t\t\t\t\t\t\treturn [ elem ];\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn [];\n\t\t\t}\n\t\t};\n\t}\n\n\t// Tag\n\tExpr.find[\"TAG\"] = support.getElementsByTagName ?\n\t\tfunction( tag, context ) {\n\t\t\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\t\t\treturn context.getElementsByTagName( tag );\n\n\t\t\t// DocumentFragment nodes don't have gEBTN\n\t\t\t} else if ( support.qsa ) {\n\t\t\t\treturn context.querySelectorAll( tag );\n\t\t\t}\n\t\t} :\n\n\t\tfunction( tag, context ) {\n\t\t\tvar elem,\n\t\t\t\ttmp = [],\n\t\t\t\ti = 0,\n\t\t\t\t// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too\n\t\t\t\tresults = context.getElementsByTagName( tag );\n\n\t\t\t// Filter out possible comments\n\t\t\tif ( tag === \"*\" ) {\n\t\t\t\twhile ( (elem = results[i++]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\ttmp.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn tmp;\n\t\t\t}\n\t\t\treturn results;\n\t\t};\n\n\t// Class\n\tExpr.find[\"CLASS\"] = support.getElementsByClassName && function( className, context ) {\n\t\tif ( typeof context.getElementsByClassName !== \"undefined\" && documentIsHTML ) {\n\t\t\treturn context.getElementsByClassName( className );\n\t\t}\n\t};\n\n\t/* QSA/matchesSelector\n\t---------------------------------------------------------------------- */\n\n\t// QSA and matchesSelector support\n\n\t// matchesSelector(:active) reports false when true (IE9/Opera 11.5)\n\trbuggyMatches = [];\n\n\t// qSa(:focus) reports false when true (Chrome 21)\n\t// We allow this because of a bug in IE8/9 that throws an error\n\t// whenever `document.activeElement` is accessed on an iframe\n\t// So, we allow :focus to pass through QSA all the time to avoid the IE error\n\t// See https://bugs.jquery.com/ticket/13378\n\trbuggyQSA = [];\n\n\tif ( (support.qsa = rnative.test( document.querySelectorAll )) ) {\n\t\t// Build QSA regex\n\t\t// Regex strategy adopted from Diego Perini\n\t\tassert(function( el ) {\n\t\t\t// Select is set to empty string on purpose\n\t\t\t// This is to test IE's treatment of not explicitly\n\t\t\t// setting a boolean content attribute,\n\t\t\t// since its presence should be enough\n\t\t\t// https://bugs.jquery.com/ticket/12359\n\t\t\tdocElem.appendChild( el ).innerHTML = \"<a id='\" + expando + \"'></a>\" +\n\t\t\t\t\"<select id='\" + expando + \"-\\r\\\\' msallowcapture=''>\" +\n\t\t\t\t\"<option selected=''></option></select>\";\n\n\t\t\t// Support: IE8, Opera 11-12.16\n\t\t\t// Nothing should be selected when empty strings follow ^= or $= or *=\n\t\t\t// The test attribute must be unknown in Opera but \"safe\" for WinRT\n\t\t\t// https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section\n\t\t\tif ( el.querySelectorAll(\"[msallowcapture^='']\").length ) {\n\t\t\t\trbuggyQSA.push( \"[*^$]=\" + whitespace + \"*(?:''|\\\"\\\")\" );\n\t\t\t}\n\n\t\t\t// Support: IE8\n\t\t\t// Boolean attributes and \"value\" are not treated correctly\n\t\t\tif ( !el.querySelectorAll(\"[selected]\").length ) {\n\t\t\t\trbuggyQSA.push( \"\\\\[\" + whitespace + \"*(?:value|\" + booleans + \")\" );\n\t\t\t}\n\n\t\t\t// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+\n\t\t\tif ( !el.querySelectorAll( \"[id~=\" + expando + \"-]\" ).length ) {\n\t\t\t\trbuggyQSA.push(\"~=\");\n\t\t\t}\n\n\t\t\t// Webkit/Opera - :checked should return selected option elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( !el.querySelectorAll(\":checked\").length ) {\n\t\t\t\trbuggyQSA.push(\":checked\");\n\t\t\t}\n\n\t\t\t// Support: Safari 8+, iOS 8+\n\t\t\t// https://bugs.webkit.org/show_bug.cgi?id=136851\n\t\t\t// In-page `selector#id sibling-combinator selector` fails\n\t\t\tif ( !el.querySelectorAll( \"a#\" + expando + \"+*\" ).length ) {\n\t\t\t\trbuggyQSA.push(\".#.+[+~]\");\n\t\t\t}\n\t\t});\n\n\t\tassert(function( el ) {\n\t\t\tel.innerHTML = \"<a href='' disabled='disabled'></a>\" +\n\t\t\t\t\"<select disabled='disabled'><option/></select>\";\n\n\t\t\t// Support: Windows 8 Native Apps\n\t\t\t// The type and name attributes are restricted during .innerHTML assignment\n\t\t\tvar input = document.createElement(\"input\");\n\t\t\tinput.setAttribute( \"type\", \"hidden\" );\n\t\t\tel.appendChild( input ).setAttribute( \"name\", \"D\" );\n\n\t\t\t// Support: IE8\n\t\t\t// Enforce case-sensitivity of name attribute\n\t\t\tif ( el.querySelectorAll(\"[name=d]\").length ) {\n\t\t\t\trbuggyQSA.push( \"name\" + whitespace + \"*[*^$|!~]?=\" );\n\t\t\t}\n\n\t\t\t// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\n\t\t\t// IE8 throws error here and will not see later tests\n\t\t\tif ( el.querySelectorAll(\":enabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Support: IE9-11+\n\t\t\t// IE's :disabled selector does not pick up the children of disabled fieldsets\n\t\t\tdocElem.appendChild( el ).disabled = true;\n\t\t\tif ( el.querySelectorAll(\":disabled\").length !== 2 ) {\n\t\t\t\trbuggyQSA.push( \":enabled\", \":disabled\" );\n\t\t\t}\n\n\t\t\t// Opera 10-11 does not throw on post-comma invalid pseudos\n\t\t\tel.querySelectorAll(\"*,:x\");\n\t\t\trbuggyQSA.push(\",.*:\");\n\t\t});\n\t}\n\n\tif ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||\n\t\tdocElem.webkitMatchesSelector ||\n\t\tdocElem.mozMatchesSelector ||\n\t\tdocElem.oMatchesSelector ||\n\t\tdocElem.msMatchesSelector) )) ) {\n\n\t\tassert(function( el ) {\n\t\t\t// Check to see if it's possible to do matchesSelector\n\t\t\t// on a disconnected node (IE 9)\n\t\t\tsupport.disconnectedMatch = matches.call( el, \"*\" );\n\n\t\t\t// This should fail with an exception\n\t\t\t// Gecko does not error, returns false instead\n\t\t\tmatches.call( el, \"[s!='']:x\" );\n\t\t\trbuggyMatches.push( \"!=\", pseudos );\n\t\t});\n\t}\n\n\trbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join(\"|\") );\n\trbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join(\"|\") );\n\n\t/* Contains\n\t---------------------------------------------------------------------- */\n\thasCompare = rnative.test( docElem.compareDocumentPosition );\n\n\t// Element contains another\n\t// Purposefully self-exclusive\n\t// As in, an element does not contain itself\n\tcontains = hasCompare || rnative.test( docElem.contains ) ?\n\t\tfunction( a, b ) {\n\t\t\tvar adown = a.nodeType === 9 ? a.documentElement : a,\n\t\t\t\tbup = b && b.parentNode;\n\t\t\treturn a === bup || !!( bup && bup.nodeType === 1 && (\n\t\t\t\tadown.contains ?\n\t\t\t\t\tadown.contains( bup ) :\n\t\t\t\t\ta.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16\n\t\t\t));\n\t\t} :\n\t\tfunction( a, b ) {\n\t\t\tif ( b ) {\n\t\t\t\twhile ( (b = b.parentNode) ) {\n\t\t\t\t\tif ( b === a ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n\n\t/* Sorting\n\t---------------------------------------------------------------------- */\n\n\t// Document order sorting\n\tsortOrder = hasCompare ?\n\tfunction( a, b ) {\n\n\t\t// Flag for duplicate removal\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\t// Sort on method existence if only one input has compareDocumentPosition\n\t\tvar compare = !a.compareDocumentPosition - !b.compareDocumentPosition;\n\t\tif ( compare ) {\n\t\t\treturn compare;\n\t\t}\n\n\t\t// Calculate position if both inputs belong to the same document\n\t\tcompare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?\n\t\t\ta.compareDocumentPosition( b ) :\n\n\t\t\t// Otherwise we know they are disconnected\n\t\t\t1;\n\n\t\t// Disconnected nodes\n\t\tif ( compare & 1 ||\n\t\t\t(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {\n\n\t\t\t// Choose the first element that is related to our preferred document\n\t\t\tif ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t\tif ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\t// Maintain original order\n\t\t\treturn sortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\t\t}\n\n\t\treturn compare & 4 ? -1 : 1;\n\t} :\n\tfunction( a, b ) {\n\t\t// Exit early if the nodes are identical\n\t\tif ( a === b ) {\n\t\t\thasDuplicate = true;\n\t\t\treturn 0;\n\t\t}\n\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\taup = a.parentNode,\n\t\t\tbup = b.parentNode,\n\t\t\tap = [ a ],\n\t\t\tbp = [ b ];\n\n\t\t// Parentless nodes are either documents or disconnected\n\t\tif ( !aup || !bup ) {\n\t\t\treturn a === document ? -1 :\n\t\t\t\tb === document ? 1 :\n\t\t\t\taup ? -1 :\n\t\t\t\tbup ? 1 :\n\t\t\t\tsortInput ?\n\t\t\t\t( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :\n\t\t\t\t0;\n\n\t\t// If the nodes are siblings, we can do a quick check\n\t\t} else if ( aup === bup ) {\n\t\t\treturn siblingCheck( a, b );\n\t\t}\n\n\t\t// Otherwise we need full lists of their ancestors for comparison\n\t\tcur = a;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tap.unshift( cur );\n\t\t}\n\t\tcur = b;\n\t\twhile ( (cur = cur.parentNode) ) {\n\t\t\tbp.unshift( cur );\n\t\t}\n\n\t\t// Walk down the tree looking for a discrepancy\n\t\twhile ( ap[i] === bp[i] ) {\n\t\t\ti++;\n\t\t}\n\n\t\treturn i ?\n\t\t\t// Do a sibling check if the nodes have a common ancestor\n\t\t\tsiblingCheck( ap[i], bp[i] ) :\n\n\t\t\t// Otherwise nodes in our document sort first\n\t\t\tap[i] === preferredDoc ? -1 :\n\t\t\tbp[i] === preferredDoc ? 1 :\n\t\t\t0;\n\t};\n\n\treturn document;\n};\n\nSizzle.matches = function( expr, elements ) {\n\treturn Sizzle( expr, null, null, elements );\n};\n\nSizzle.matchesSelector = function( elem, expr ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\t// Make sure that attribute selectors are quoted\n\texpr = expr.replace( rattributeQuotes, \"='$1']\" );\n\n\tif ( support.matchesSelector && documentIsHTML &&\n\t\t!compilerCache[ expr + \" \" ] &&\n\t\t( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&\n\t\t( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {\n\n\t\ttry {\n\t\t\tvar ret = matches.call( elem, expr );\n\n\t\t\t// IE 9's matchesSelector returns false on disconnected nodes\n\t\t\tif ( ret || support.disconnectedMatch ||\n\t\t\t\t\t// As well, disconnected nodes are said to be in a document\n\t\t\t\t\t// fragment in IE 9\n\t\t\t\t\telem.document && elem.document.nodeType !== 11 ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\t\t} catch (e) {}\n\t}\n\n\treturn Sizzle( expr, document, null, [ elem ] ).length > 0;\n};\n\nSizzle.contains = function( context, elem ) {\n\t// Set document vars if needed\n\tif ( ( context.ownerDocument || context ) !== document ) {\n\t\tsetDocument( context );\n\t}\n\treturn contains( context, elem );\n};\n\nSizzle.attr = function( elem, name ) {\n\t// Set document vars if needed\n\tif ( ( elem.ownerDocument || elem ) !== document ) {\n\t\tsetDocument( elem );\n\t}\n\n\tvar fn = Expr.attrHandle[ name.toLowerCase() ],\n\t\t// Don't get fooled by Object.prototype properties (jQuery #13807)\n\t\tval = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?\n\t\t\tfn( elem, name, !documentIsHTML ) :\n\t\t\tundefined;\n\n\treturn val !== undefined ?\n\t\tval :\n\t\tsupport.attributes || !documentIsHTML ?\n\t\t\telem.getAttribute( name ) :\n\t\t\t(val = elem.getAttributeNode(name)) && val.specified ?\n\t\t\t\tval.value :\n\t\t\t\tnull;\n};\n\nSizzle.escape = function( sel ) {\n\treturn (sel + \"\").replace( rcssescape, fcssescape );\n};\n\nSizzle.error = function( msg ) {\n\tthrow new Error( \"Syntax error, unrecognized expression: \" + msg );\n};\n\n/**\n * Document sorting and removing duplicates\n * @param {ArrayLike} results\n */\nSizzle.uniqueSort = function( results ) {\n\tvar elem,\n\t\tduplicates = [],\n\t\tj = 0,\n\t\ti = 0;\n\n\t// Unless we *know* we can detect duplicates, assume their presence\n\thasDuplicate = !support.detectDuplicates;\n\tsortInput = !support.sortStable && results.slice( 0 );\n\tresults.sort( sortOrder );\n\n\tif ( hasDuplicate ) {\n\t\twhile ( (elem = results[i++]) ) {\n\t\t\tif ( elem === results[ i ] ) {\n\t\t\t\tj = duplicates.push( i );\n\t\t\t}\n\t\t}\n\t\twhile ( j-- ) {\n\t\t\tresults.splice( duplicates[ j ], 1 );\n\t\t}\n\t}\n\n\t// Clear input after sorting to release objects\n\t// See https://github.com/jquery/sizzle/pull/225\n\tsortInput = null;\n\n\treturn results;\n};\n\n/**\n * Utility function for retrieving the text value of an array of DOM nodes\n * @param {Array|Element} elem\n */\ngetText = Sizzle.getText = function( elem ) {\n\tvar node,\n\t\tret = \"\",\n\t\ti = 0,\n\t\tnodeType = elem.nodeType;\n\n\tif ( !nodeType ) {\n\t\t// If no nodeType, this is expected to be an array\n\t\twhile ( (node = elem[i++]) ) {\n\t\t\t// Do not traverse comment nodes\n\t\t\tret += getText( node );\n\t\t}\n\t} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\n\t\t// Use textContent for elements\n\t\t// innerText usage removed for consistency of new lines (jQuery #11153)\n\t\tif ( typeof elem.textContent === \"string\" ) {\n\t\t\treturn elem.textContent;\n\t\t} else {\n\t\t\t// Traverse its children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tret += getText( elem );\n\t\t\t}\n\t\t}\n\t} else if ( nodeType === 3 || nodeType === 4 ) {\n\t\treturn elem.nodeValue;\n\t}\n\t// Do not include comment or processing instruction nodes\n\n\treturn ret;\n};\n\nExpr = Sizzle.selectors = {\n\n\t// Can be adjusted by the user\n\tcacheLength: 50,\n\n\tcreatePseudo: markFunction,\n\n\tmatch: matchExpr,\n\n\tattrHandle: {},\n\n\tfind: {},\n\n\trelative: {\n\t\t\">\": { dir: \"parentNode\", first: true },\n\t\t\" \": { dir: \"parentNode\" },\n\t\t\"+\": { dir: \"previousSibling\", first: true },\n\t\t\"~\": { dir: \"previousSibling\" }\n\t},\n\n\tpreFilter: {\n\t\t\"ATTR\": function( match ) {\n\t\t\tmatch[1] = match[1].replace( runescape, funescape );\n\n\t\t\t// Move the given value to match[3] whether quoted or unquoted\n\t\t\tmatch[3] = ( match[3] || match[4] || match[5] || \"\" ).replace( runescape, funescape );\n\n\t\t\tif ( match[2] === \"~=\" ) {\n\t\t\t\tmatch[3] = \" \" + match[3] + \" \";\n\t\t\t}\n\n\t\t\treturn match.slice( 0, 4 );\n\t\t},\n\n\t\t\"CHILD\": function( match ) {\n\t\t\t/* matches from matchExpr[\"CHILD\"]\n\t\t\t\t1 type (only|nth|...)\n\t\t\t\t2 what (child|of-type)\n\t\t\t\t3 argument (even|odd|\\d*|\\d*n([+-]\\d+)?|...)\n\t\t\t\t4 xn-component of xn+y argument ([+-]?\\d*n|)\n\t\t\t\t5 sign of xn-component\n\t\t\t\t6 x of xn-component\n\t\t\t\t7 sign of y-component\n\t\t\t\t8 y of y-component\n\t\t\t*/\n\t\t\tmatch[1] = match[1].toLowerCase();\n\n\t\t\tif ( match[1].slice( 0, 3 ) === \"nth\" ) {\n\t\t\t\t// nth-* requires argument\n\t\t\t\tif ( !match[3] ) {\n\t\t\t\t\tSizzle.error( match[0] );\n\t\t\t\t}\n\n\t\t\t\t// numeric x and y parameters for Expr.filter.CHILD\n\t\t\t\t// remember that false/true cast respectively to 0/1\n\t\t\t\tmatch[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === \"even\" || match[3] === \"odd\" ) );\n\t\t\t\tmatch[5] = +( ( match[7] + match[8] ) || match[3] === \"odd\" );\n\n\t\t\t// other types prohibit arguments\n\t\t\t} else if ( match[3] ) {\n\t\t\t\tSizzle.error( match[0] );\n\t\t\t}\n\n\t\t\treturn match;\n\t\t},\n\n\t\t\"PSEUDO\": function( match ) {\n\t\t\tvar excess,\n\t\t\t\tunquoted = !match[6] && match[2];\n\n\t\t\tif ( matchExpr[\"CHILD\"].test( match[0] ) ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t// Accept quoted arguments as-is\n\t\t\tif ( match[3] ) {\n\t\t\t\tmatch[2] = match[4] || match[5] || \"\";\n\n\t\t\t// Strip excess characters from unquoted arguments\n\t\t\t} else if ( unquoted && rpseudo.test( unquoted ) &&\n\t\t\t\t// Get excess from tokenize (recursively)\n\t\t\t\t(excess = tokenize( unquoted, true )) &&\n\t\t\t\t// advance to the next closing parenthesis\n\t\t\t\t(excess = unquoted.indexOf( \")\", unquoted.length - excess ) - unquoted.length) ) {\n\n\t\t\t\t// excess is a negative index\n\t\t\t\tmatch[0] = match[0].slice( 0, excess );\n\t\t\t\tmatch[2] = unquoted.slice( 0, excess );\n\t\t\t}\n\n\t\t\t// Return only captures needed by the pseudo filter method (type and argument)\n\t\t\treturn match.slice( 0, 3 );\n\t\t}\n\t},\n\n\tfilter: {\n\n\t\t\"TAG\": function( nodeNameSelector ) {\n\t\t\tvar nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn nodeNameSelector === \"*\" ?\n\t\t\t\tfunction() { return true; } :\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\n\t\t\t\t};\n\t\t},\n\n\t\t\"CLASS\": function( className ) {\n\t\t\tvar pattern = classCache[ className + \" \" ];\n\n\t\t\treturn pattern ||\n\t\t\t\t(pattern = new RegExp( \"(^|\" + whitespace + \")\" + className + \"(\" + whitespace + \"|$)\" )) &&\n\t\t\t\tclassCache( className, function( elem ) {\n\t\t\t\t\treturn pattern.test( typeof elem.className === \"string\" && elem.className || typeof elem.getAttribute !== \"undefined\" && elem.getAttribute(\"class\") || \"\" );\n\t\t\t\t});\n\t\t},\n\n\t\t\"ATTR\": function( name, operator, check ) {\n\t\t\treturn function( elem ) {\n\t\t\t\tvar result = Sizzle.attr( elem, name );\n\n\t\t\t\tif ( result == null ) {\n\t\t\t\t\treturn operator === \"!=\";\n\t\t\t\t}\n\t\t\t\tif ( !operator ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\n\t\t\t\tresult += \"\";\n\n\t\t\t\treturn operator === \"=\" ? result === check :\n\t\t\t\t\toperator === \"!=\" ? result !== check :\n\t\t\t\t\toperator === \"^=\" ? check && result.indexOf( check ) === 0 :\n\t\t\t\t\toperator === \"*=\" ? check && result.indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"$=\" ? check && result.slice( -check.length ) === check :\n\t\t\t\t\toperator === \"~=\" ? ( \" \" + result.replace( rwhitespace, \" \" ) + \" \" ).indexOf( check ) > -1 :\n\t\t\t\t\toperator === \"|=\" ? result === check || result.slice( 0, check.length + 1 ) === check + \"-\" :\n\t\t\t\t\tfalse;\n\t\t\t};\n\t\t},\n\n\t\t\"CHILD\": function( type, what, argument, first, last ) {\n\t\t\tvar simple = type.slice( 0, 3 ) !== \"nth\",\n\t\t\t\tforward = type.slice( -4 ) !== \"last\",\n\t\t\t\tofType = what === \"of-type\";\n\n\t\t\treturn first === 1 && last === 0 ?\n\n\t\t\t\t// Shortcut for :nth-*(n)\n\t\t\t\tfunction( elem ) {\n\t\t\t\t\treturn !!elem.parentNode;\n\t\t\t\t} :\n\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tvar cache, uniqueCache, outerCache, node, nodeIndex, start,\n\t\t\t\t\t\tdir = simple !== forward ? \"nextSibling\" : \"previousSibling\",\n\t\t\t\t\t\tparent = elem.parentNode,\n\t\t\t\t\t\tname = ofType && elem.nodeName.toLowerCase(),\n\t\t\t\t\t\tuseCache = !xml && !ofType,\n\t\t\t\t\t\tdiff = false;\n\n\t\t\t\t\tif ( parent ) {\n\n\t\t\t\t\t\t// :(first|last|only)-(child|of-type)\n\t\t\t\t\t\tif ( simple ) {\n\t\t\t\t\t\t\twhile ( dir ) {\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\twhile ( (node = node[ dir ]) ) {\n\t\t\t\t\t\t\t\t\tif ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) {\n\n\t\t\t\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Reverse direction for :only-* (if we haven't yet done so)\n\t\t\t\t\t\t\t\tstart = dir = type === \"only\" && !start && \"nextSibling\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tstart = [ forward ? parent.firstChild : parent.lastChild ];\n\n\t\t\t\t\t\t// non-xml :nth-child(...) stores cache data on `parent`\n\t\t\t\t\t\tif ( forward && useCache ) {\n\n\t\t\t\t\t\t\t// Seek `elem` from a previously-cached index\n\n\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\tnode = parent;\n\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\tdiff = nodeIndex && cache[ 2 ];\n\t\t\t\t\t\t\tnode = nodeIndex && parent.childNodes[ nodeIndex ];\n\n\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\n\t\t\t\t\t\t\t\t// Fallback to seeking `elem` from the start\n\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t// When found, cache indexes on `parent` and break\n\t\t\t\t\t\t\t\tif ( node.nodeType === 1 && ++diff && node === elem ) {\n\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, nodeIndex, diff ];\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Use previously-cached element index if available\n\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t// ...in a gzip-friendly way\n\t\t\t\t\t\t\t\tnode = elem;\n\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\tcache = uniqueCache[ type ] || [];\n\t\t\t\t\t\t\t\tnodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];\n\t\t\t\t\t\t\t\tdiff = nodeIndex;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t// xml :nth-child(...)\n\t\t\t\t\t\t\t// or :nth-last-child(...) or :nth(-last)?-of-type(...)\n\t\t\t\t\t\t\tif ( diff === false ) {\n\t\t\t\t\t\t\t\t// Use the same loop as above to seek `elem` from the start\n\t\t\t\t\t\t\t\twhile ( (node = ++nodeIndex && node && node[ dir ] ||\n\t\t\t\t\t\t\t\t\t(diff = nodeIndex = 0) || start.pop()) ) {\n\n\t\t\t\t\t\t\t\t\tif ( ( ofType ?\n\t\t\t\t\t\t\t\t\t\tnode.nodeName.toLowerCase() === name :\n\t\t\t\t\t\t\t\t\t\tnode.nodeType === 1 ) &&\n\t\t\t\t\t\t\t\t\t\t++diff ) {\n\n\t\t\t\t\t\t\t\t\t\t// Cache the index of each encountered element\n\t\t\t\t\t\t\t\t\t\tif ( useCache ) {\n\t\t\t\t\t\t\t\t\t\t\touterCache = node[ expando ] || (node[ expando ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache = outerCache[ node.uniqueID ] ||\n\t\t\t\t\t\t\t\t\t\t\t\t(outerCache[ node.uniqueID ] = {});\n\n\t\t\t\t\t\t\t\t\t\t\tuniqueCache[ type ] = [ dirruns, diff ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tif ( node === elem ) {\n\t\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Incorporate the offset, then check against cycle size\n\t\t\t\t\t\tdiff -= last;\n\t\t\t\t\t\treturn diff === first || ( diff % first === 0 && diff / first >= 0 );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t},\n\n\t\t\"PSEUDO\": function( pseudo, argument ) {\n\t\t\t// pseudo-class names are case-insensitive\n\t\t\t// http://www.w3.org/TR/selectors/#pseudo-classes\n\t\t\t// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\n\t\t\t// Remember that setFilters inherits from pseudos\n\t\t\tvar args,\n\t\t\t\tfn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||\n\t\t\t\t\tSizzle.error( \"unsupported pseudo: \" + pseudo );\n\n\t\t\t// The user may use createPseudo to indicate that\n\t\t\t// arguments are needed to create the filter function\n\t\t\t// just as Sizzle does\n\t\t\tif ( fn[ expando ] ) {\n\t\t\t\treturn fn( argument );\n\t\t\t}\n\n\t\t\t// But maintain support for old signatures\n\t\t\tif ( fn.length > 1 ) {\n\t\t\t\targs = [ pseudo, pseudo, \"\", argument ];\n\t\t\t\treturn Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?\n\t\t\t\t\tmarkFunction(function( seed, matches ) {\n\t\t\t\t\t\tvar idx,\n\t\t\t\t\t\t\tmatched = fn( seed, argument ),\n\t\t\t\t\t\t\ti = matched.length;\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tidx = indexOf( seed, matched[i] );\n\t\t\t\t\t\t\tseed[ idx ] = !( matches[ idx ] = matched[i] );\n\t\t\t\t\t\t}\n\t\t\t\t\t}) :\n\t\t\t\t\tfunction( elem ) {\n\t\t\t\t\t\treturn fn( elem, 0, args );\n\t\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn fn;\n\t\t}\n\t},\n\n\tpseudos: {\n\t\t// Potentially complex pseudos\n\t\t\"not\": markFunction(function( selector ) {\n\t\t\t// Trim the selector passed to compile\n\t\t\t// to avoid treating leading and trailing\n\t\t\t// spaces as combinators\n\t\t\tvar input = [],\n\t\t\t\tresults = [],\n\t\t\t\tmatcher = compile( selector.replace( rtrim, \"$1\" ) );\n\n\t\t\treturn matcher[ expando ] ?\n\t\t\t\tmarkFunction(function( seed, matches, context, xml ) {\n\t\t\t\t\tvar elem,\n\t\t\t\t\t\tunmatched = matcher( seed, null, xml, [] ),\n\t\t\t\t\t\ti = seed.length;\n\n\t\t\t\t\t// Match elements unmatched by `matcher`\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = unmatched[i]) ) {\n\t\t\t\t\t\t\tseed[i] = !(matches[i] = elem);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}) :\n\t\t\t\tfunction( elem, context, xml ) {\n\t\t\t\t\tinput[0] = elem;\n\t\t\t\t\tmatcher( input, null, xml, results );\n\t\t\t\t\t// Don't keep the element (issue #299)\n\t\t\t\t\tinput[0] = null;\n\t\t\t\t\treturn !results.pop();\n\t\t\t\t};\n\t\t}),\n\n\t\t\"has\": markFunction(function( selector ) {\n\t\t\treturn function( elem ) {\n\t\t\t\treturn Sizzle( selector, elem ).length > 0;\n\t\t\t};\n\t\t}),\n\n\t\t\"contains\": markFunction(function( text ) {\n\t\t\ttext = text.replace( runescape, funescape );\n\t\t\treturn function( elem ) {\n\t\t\t\treturn ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\n\t\t\t};\n\t\t}),\n\n\t\t// \"Whether an element is represented by a :lang() selector\n\t\t// is based solely on the element's language value\n\t\t// being equal to the identifier C,\n\t\t// or beginning with the identifier C immediately followed by \"-\".\n\t\t// The matching of C against the element's language value is performed case-insensitively.\n\t\t// The identifier C does not have to be a valid language name.\"\n\t\t// http://www.w3.org/TR/selectors/#lang-pseudo\n\t\t\"lang\": markFunction( function( lang ) {\n\t\t\t// lang value must be a valid identifier\n\t\t\tif ( !ridentifier.test(lang || \"\") ) {\n\t\t\t\tSizzle.error( \"unsupported lang: \" + lang );\n\t\t\t}\n\t\t\tlang = lang.replace( runescape, funescape ).toLowerCase();\n\t\t\treturn function( elem ) {\n\t\t\t\tvar elemLang;\n\t\t\t\tdo {\n\t\t\t\t\tif ( (elemLang = documentIsHTML ?\n\t\t\t\t\t\telem.lang :\n\t\t\t\t\t\telem.getAttribute(\"xml:lang\") || elem.getAttribute(\"lang\")) ) {\n\n\t\t\t\t\t\telemLang = elemLang.toLowerCase();\n\t\t\t\t\t\treturn elemLang === lang || elemLang.indexOf( lang + \"-\" ) === 0;\n\t\t\t\t\t}\n\t\t\t\t} while ( (elem = elem.parentNode) && elem.nodeType === 1 );\n\t\t\t\treturn false;\n\t\t\t};\n\t\t}),\n\n\t\t// Miscellaneous\n\t\t\"target\": function( elem ) {\n\t\t\tvar hash = window.location && window.location.hash;\n\t\t\treturn hash && hash.slice( 1 ) === elem.id;\n\t\t},\n\n\t\t\"root\": function( elem ) {\n\t\t\treturn elem === docElem;\n\t\t},\n\n\t\t\"focus\": function( elem ) {\n\t\t\treturn elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);\n\t\t},\n\n\t\t// Boolean properties\n\t\t\"enabled\": createDisabledPseudo( false ),\n\t\t\"disabled\": createDisabledPseudo( true ),\n\n\t\t\"checked\": function( elem ) {\n\t\t\t// In CSS3, :checked should return both checked and selected elements\n\t\t\t// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\n\t\t\tvar nodeName = elem.nodeName.toLowerCase();\n\t\t\treturn (nodeName === \"input\" && !!elem.checked) || (nodeName === \"option\" && !!elem.selected);\n\t\t},\n\n\t\t\"selected\": function( elem ) {\n\t\t\t// Accessing this property makes selected-by-default\n\t\t\t// options in Safari work properly\n\t\t\tif ( elem.parentNode ) {\n\t\t\t\telem.parentNode.selectedIndex;\n\t\t\t}\n\n\t\t\treturn elem.selected === true;\n\t\t},\n\n\t\t// Contents\n\t\t\"empty\": function( elem ) {\n\t\t\t// http://www.w3.org/TR/selectors/#empty-pseudo\n\t\t\t// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),\n\t\t\t//   but not by others (comment: 8; processing instruction: 7; etc.)\n\t\t\t// nodeType < 6 works because attributes (2) do not appear as children\n\t\t\tfor ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\n\t\t\t\tif ( elem.nodeType < 6 ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t},\n\n\t\t\"parent\": function( elem ) {\n\t\t\treturn !Expr.pseudos[\"empty\"]( elem );\n\t\t},\n\n\t\t// Element/input types\n\t\t\"header\": function( elem ) {\n\t\t\treturn rheader.test( elem.nodeName );\n\t\t},\n\n\t\t\"input\": function( elem ) {\n\t\t\treturn rinputs.test( elem.nodeName );\n\t\t},\n\n\t\t\"button\": function( elem ) {\n\t\t\tvar name = elem.nodeName.toLowerCase();\n\t\t\treturn name === \"input\" && elem.type === \"button\" || name === \"button\";\n\t\t},\n\n\t\t\"text\": function( elem ) {\n\t\t\tvar attr;\n\t\t\treturn elem.nodeName.toLowerCase() === \"input\" &&\n\t\t\t\telem.type === \"text\" &&\n\n\t\t\t\t// Support: IE<8\n\t\t\t\t// New HTML5 attribute values (e.g., \"search\") appear with elem.type === \"text\"\n\t\t\t\t( (attr = elem.getAttribute(\"type\")) == null || attr.toLowerCase() === \"text\" );\n\t\t},\n\n\t\t// Position-in-collection\n\t\t\"first\": createPositionalPseudo(function() {\n\t\t\treturn [ 0 ];\n\t\t}),\n\n\t\t\"last\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\treturn [ length - 1 ];\n\t\t}),\n\n\t\t\"eq\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\treturn [ argument < 0 ? argument + length : argument ];\n\t\t}),\n\n\t\t\"even\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"odd\": createPositionalPseudo(function( matchIndexes, length ) {\n\t\t\tvar i = 1;\n\t\t\tfor ( ; i < length; i += 2 ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"lt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; --i >= 0; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t}),\n\n\t\t\"gt\": createPositionalPseudo(function( matchIndexes, length, argument ) {\n\t\t\tvar i = argument < 0 ? argument + length : argument;\n\t\t\tfor ( ; ++i < length; ) {\n\t\t\t\tmatchIndexes.push( i );\n\t\t\t}\n\t\t\treturn matchIndexes;\n\t\t})\n\t}\n};\n\nExpr.pseudos[\"nth\"] = Expr.pseudos[\"eq\"];\n\n// Add button/input type pseudos\nfor ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {\n\tExpr.pseudos[ i ] = createInputPseudo( i );\n}\nfor ( i in { submit: true, reset: true } ) {\n\tExpr.pseudos[ i ] = createButtonPseudo( i );\n}\n\n// Easy API for creating new setFilters\nfunction setFilters() {}\nsetFilters.prototype = Expr.filters = Expr.pseudos;\nExpr.setFilters = new setFilters();\n\ntokenize = Sizzle.tokenize = function( selector, parseOnly ) {\n\tvar matched, match, tokens, type,\n\t\tsoFar, groups, preFilters,\n\t\tcached = tokenCache[ selector + \" \" ];\n\n\tif ( cached ) {\n\t\treturn parseOnly ? 0 : cached.slice( 0 );\n\t}\n\n\tsoFar = selector;\n\tgroups = [];\n\tpreFilters = Expr.preFilter;\n\n\twhile ( soFar ) {\n\n\t\t// Comma and first run\n\t\tif ( !matched || (match = rcomma.exec( soFar )) ) {\n\t\t\tif ( match ) {\n\t\t\t\t// Don't consume trailing commas as valid\n\t\t\t\tsoFar = soFar.slice( match[0].length ) || soFar;\n\t\t\t}\n\t\t\tgroups.push( (tokens = []) );\n\t\t}\n\n\t\tmatched = false;\n\n\t\t// Combinators\n\t\tif ( (match = rcombinators.exec( soFar )) ) {\n\t\t\tmatched = match.shift();\n\t\t\ttokens.push({\n\t\t\t\tvalue: matched,\n\t\t\t\t// Cast descendant combinators to space\n\t\t\t\ttype: match[0].replace( rtrim, \" \" )\n\t\t\t});\n\t\t\tsoFar = soFar.slice( matched.length );\n\t\t}\n\n\t\t// Filters\n\t\tfor ( type in Expr.filter ) {\n\t\t\tif ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\n\t\t\t\t(match = preFilters[ type ]( match ))) ) {\n\t\t\t\tmatched = match.shift();\n\t\t\t\ttokens.push({\n\t\t\t\t\tvalue: matched,\n\t\t\t\t\ttype: type,\n\t\t\t\t\tmatches: match\n\t\t\t\t});\n\t\t\t\tsoFar = soFar.slice( matched.length );\n\t\t\t}\n\t\t}\n\n\t\tif ( !matched ) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t// Return the length of the invalid excess\n\t// if we're just parsing\n\t// Otherwise, throw an error or return tokens\n\treturn parseOnly ?\n\t\tsoFar.length :\n\t\tsoFar ?\n\t\t\tSizzle.error( selector ) :\n\t\t\t// Cache the tokens\n\t\t\ttokenCache( selector, groups ).slice( 0 );\n};\n\nfunction toSelector( tokens ) {\n\tvar i = 0,\n\t\tlen = tokens.length,\n\t\tselector = \"\";\n\tfor ( ; i < len; i++ ) {\n\t\tselector += tokens[i].value;\n\t}\n\treturn selector;\n}\n\nfunction addCombinator( matcher, combinator, base ) {\n\tvar dir = combinator.dir,\n\t\tskip = combinator.next,\n\t\tkey = skip || dir,\n\t\tcheckNonElements = base && key === \"parentNode\",\n\t\tdoneName = done++;\n\n\treturn combinator.first ?\n\t\t// Check against closest ancestor/preceding element\n\t\tfunction( elem, context, xml ) {\n\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\treturn matcher( elem, context, xml );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t} :\n\n\t\t// Check against all ancestor/preceding elements\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar oldCache, uniqueCache, outerCache,\n\t\t\t\tnewCache = [ dirruns, doneName ];\n\n\t\t\t// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching\n\t\t\tif ( xml ) {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\tif ( matcher( elem, context, xml ) ) {\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\twhile ( (elem = elem[ dir ]) ) {\n\t\t\t\t\tif ( elem.nodeType === 1 || checkNonElements ) {\n\t\t\t\t\t\touterCache = elem[ expando ] || (elem[ expando ] = {});\n\n\t\t\t\t\t\t// Support: IE <9 only\n\t\t\t\t\t\t// Defend against cloned attroperties (jQuery gh-1709)\n\t\t\t\t\t\tuniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});\n\n\t\t\t\t\t\tif ( skip && skip === elem.nodeName.toLowerCase() ) {\n\t\t\t\t\t\t\telem = elem[ dir ] || elem;\n\t\t\t\t\t\t} else if ( (oldCache = uniqueCache[ key ]) &&\n\t\t\t\t\t\t\toldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {\n\n\t\t\t\t\t\t\t// Assign to newCache so results back-propagate to previous elements\n\t\t\t\t\t\t\treturn (newCache[ 2 ] = oldCache[ 2 ]);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Reuse newcache so results back-propagate to previous elements\n\t\t\t\t\t\t\tuniqueCache[ key ] = newCache;\n\n\t\t\t\t\t\t\t// A match means we're done; a fail means we have to keep checking\n\t\t\t\t\t\t\tif ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {\n\t\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn false;\n\t\t};\n}\n\nfunction elementMatcher( matchers ) {\n\treturn matchers.length > 1 ?\n\t\tfunction( elem, context, xml ) {\n\t\t\tvar i = matchers.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( !matchers[i]( elem, context, xml ) ) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn true;\n\t\t} :\n\t\tmatchers[0];\n}\n\nfunction multipleContexts( selector, contexts, results ) {\n\tvar i = 0,\n\t\tlen = contexts.length;\n\tfor ( ; i < len; i++ ) {\n\t\tSizzle( selector, contexts[i], results );\n\t}\n\treturn results;\n}\n\nfunction condense( unmatched, map, filter, context, xml ) {\n\tvar elem,\n\t\tnewUnmatched = [],\n\t\ti = 0,\n\t\tlen = unmatched.length,\n\t\tmapped = map != null;\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (elem = unmatched[i]) ) {\n\t\t\tif ( !filter || filter( elem, context, xml ) ) {\n\t\t\t\tnewUnmatched.push( elem );\n\t\t\t\tif ( mapped ) {\n\t\t\t\t\tmap.push( i );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn newUnmatched;\n}\n\nfunction setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {\n\tif ( postFilter && !postFilter[ expando ] ) {\n\t\tpostFilter = setMatcher( postFilter );\n\t}\n\tif ( postFinder && !postFinder[ expando ] ) {\n\t\tpostFinder = setMatcher( postFinder, postSelector );\n\t}\n\treturn markFunction(function( seed, results, context, xml ) {\n\t\tvar temp, i, elem,\n\t\t\tpreMap = [],\n\t\t\tpostMap = [],\n\t\t\tpreexisting = results.length,\n\n\t\t\t// Get initial elements from seed or context\n\t\t\telems = seed || multipleContexts( selector || \"*\", context.nodeType ? [ context ] : context, [] ),\n\n\t\t\t// Prefilter to get matcher input, preserving a map for seed-results synchronization\n\t\t\tmatcherIn = preFilter && ( seed || !selector ) ?\n\t\t\t\tcondense( elems, preMap, preFilter, context, xml ) :\n\t\t\t\telems,\n\n\t\t\tmatcherOut = matcher ?\n\t\t\t\t// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,\n\t\t\t\tpostFinder || ( seed ? preFilter : preexisting || postFilter ) ?\n\n\t\t\t\t\t// ...intermediate processing is necessary\n\t\t\t\t\t[] :\n\n\t\t\t\t\t// ...otherwise use results directly\n\t\t\t\t\tresults :\n\t\t\t\tmatcherIn;\n\n\t\t// Find primary matches\n\t\tif ( matcher ) {\n\t\t\tmatcher( matcherIn, matcherOut, context, xml );\n\t\t}\n\n\t\t// Apply postFilter\n\t\tif ( postFilter ) {\n\t\t\ttemp = condense( matcherOut, postMap );\n\t\t\tpostFilter( temp, [], context, xml );\n\n\t\t\t// Un-match failing elements by moving them back to matcherIn\n\t\t\ti = temp.length;\n\t\t\twhile ( i-- ) {\n\t\t\t\tif ( (elem = temp[i]) ) {\n\t\t\t\t\tmatcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif ( seed ) {\n\t\t\tif ( postFinder || preFilter ) {\n\t\t\t\tif ( postFinder ) {\n\t\t\t\t\t// Get the final matcherOut by condensing this intermediate into postFinder contexts\n\t\t\t\t\ttemp = [];\n\t\t\t\t\ti = matcherOut.length;\n\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\tif ( (elem = matcherOut[i]) ) {\n\t\t\t\t\t\t\t// Restore matcherIn since elem is not yet a final match\n\t\t\t\t\t\t\ttemp.push( (matcherIn[i] = elem) );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tpostFinder( null, (matcherOut = []), temp, xml );\n\t\t\t\t}\n\n\t\t\t\t// Move matched elements from seed to results to keep them synchronized\n\t\t\t\ti = matcherOut.length;\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\tif ( (elem = matcherOut[i]) &&\n\t\t\t\t\t\t(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {\n\n\t\t\t\t\t\tseed[temp] = !(results[temp] = elem);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Add elements to results, through postFinder if defined\n\t\t} else {\n\t\t\tmatcherOut = condense(\n\t\t\t\tmatcherOut === results ?\n\t\t\t\t\tmatcherOut.splice( preexisting, matcherOut.length ) :\n\t\t\t\t\tmatcherOut\n\t\t\t);\n\t\t\tif ( postFinder ) {\n\t\t\t\tpostFinder( null, results, matcherOut, xml );\n\t\t\t} else {\n\t\t\t\tpush.apply( results, matcherOut );\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction matcherFromTokens( tokens ) {\n\tvar checkContext, matcher, j,\n\t\tlen = tokens.length,\n\t\tleadingRelative = Expr.relative[ tokens[0].type ],\n\t\timplicitRelative = leadingRelative || Expr.relative[\" \"],\n\t\ti = leadingRelative ? 1 : 0,\n\n\t\t// The foundational matcher ensures that elements are reachable from top-level context(s)\n\t\tmatchContext = addCombinator( function( elem ) {\n\t\t\treturn elem === checkContext;\n\t\t}, implicitRelative, true ),\n\t\tmatchAnyContext = addCombinator( function( elem ) {\n\t\t\treturn indexOf( checkContext, elem ) > -1;\n\t\t}, implicitRelative, true ),\n\t\tmatchers = [ function( elem, context, xml ) {\n\t\t\tvar ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (\n\t\t\t\t(checkContext = context).nodeType ?\n\t\t\t\t\tmatchContext( elem, context, xml ) :\n\t\t\t\t\tmatchAnyContext( elem, context, xml ) );\n\t\t\t// Avoid hanging onto element (issue #299)\n\t\t\tcheckContext = null;\n\t\t\treturn ret;\n\t\t} ];\n\n\tfor ( ; i < len; i++ ) {\n\t\tif ( (matcher = Expr.relative[ tokens[i].type ]) ) {\n\t\t\tmatchers = [ addCombinator(elementMatcher( matchers ), matcher) ];\n\t\t} else {\n\t\t\tmatcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );\n\n\t\t\t// Return special upon seeing a positional matcher\n\t\t\tif ( matcher[ expando ] ) {\n\t\t\t\t// Find the next relative operator (if any) for proper handling\n\t\t\t\tj = ++i;\n\t\t\t\tfor ( ; j < len; j++ ) {\n\t\t\t\t\tif ( Expr.relative[ tokens[j].type ] ) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn setMatcher(\n\t\t\t\t\ti > 1 && elementMatcher( matchers ),\n\t\t\t\t\ti > 1 && toSelector(\n\t\t\t\t\t\t// If the preceding token was a descendant combinator, insert an implicit any-element `*`\n\t\t\t\t\t\ttokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === \" \" ? \"*\" : \"\" })\n\t\t\t\t\t).replace( rtrim, \"$1\" ),\n\t\t\t\t\tmatcher,\n\t\t\t\t\ti < j && matcherFromTokens( tokens.slice( i, j ) ),\n\t\t\t\t\tj < len && matcherFromTokens( (tokens = tokens.slice( j )) ),\n\t\t\t\t\tj < len && toSelector( tokens )\n\t\t\t\t);\n\t\t\t}\n\t\t\tmatchers.push( matcher );\n\t\t}\n\t}\n\n\treturn elementMatcher( matchers );\n}\n\nfunction matcherFromGroupMatchers( elementMatchers, setMatchers ) {\n\tvar bySet = setMatchers.length > 0,\n\t\tbyElement = elementMatchers.length > 0,\n\t\tsuperMatcher = function( seed, context, xml, results, outermost ) {\n\t\t\tvar elem, j, matcher,\n\t\t\t\tmatchedCount = 0,\n\t\t\t\ti = \"0\",\n\t\t\t\tunmatched = seed && [],\n\t\t\t\tsetMatched = [],\n\t\t\t\tcontextBackup = outermostContext,\n\t\t\t\t// We must always have either seed elements or outermost context\n\t\t\t\telems = seed || byElement && Expr.find[\"TAG\"]( \"*\", outermost ),\n\t\t\t\t// Use integer dirruns iff this is the outermost matcher\n\t\t\t\tdirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),\n\t\t\t\tlen = elems.length;\n\n\t\t\tif ( outermost ) {\n\t\t\t\toutermostContext = context === document || context || outermost;\n\t\t\t}\n\n\t\t\t// Add elements passing elementMatchers directly to results\n\t\t\t// Support: IE<9, Safari\n\t\t\t// Tolerate NodeList properties (IE: \"length\"; Safari: <number>) matching elements by id\n\t\t\tfor ( ; i !== len && (elem = elems[i]) != null; i++ ) {\n\t\t\t\tif ( byElement && elem ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\tif ( !context && elem.ownerDocument !== document ) {\n\t\t\t\t\t\tsetDocument( elem );\n\t\t\t\t\t\txml = !documentIsHTML;\n\t\t\t\t\t}\n\t\t\t\t\twhile ( (matcher = elementMatchers[j++]) ) {\n\t\t\t\t\t\tif ( matcher( elem, context || document, xml) ) {\n\t\t\t\t\t\t\tresults.push( elem );\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( outermost ) {\n\t\t\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Track unmatched elements for set filters\n\t\t\t\tif ( bySet ) {\n\t\t\t\t\t// They will have gone through all possible matchers\n\t\t\t\t\tif ( (elem = !matcher && elem) ) {\n\t\t\t\t\t\tmatchedCount--;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Lengthen the array for every element, matched or not\n\t\t\t\t\tif ( seed ) {\n\t\t\t\t\t\tunmatched.push( elem );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// `i` is now the count of elements visited above, and adding it to `matchedCount`\n\t\t\t// makes the latter nonnegative.\n\t\t\tmatchedCount += i;\n\n\t\t\t// Apply set filters to unmatched elements\n\t\t\t// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`\n\t\t\t// equals `i`), unless we didn't visit _any_ elements in the above loop because we have\n\t\t\t// no element matchers and no seed.\n\t\t\t// Incrementing an initially-string \"0\" `i` allows `i` to remain a string only in that\n\t\t\t// case, which will result in a \"00\" `matchedCount` that differs from `i` but is also\n\t\t\t// numerically zero.\n\t\t\tif ( bySet && i !== matchedCount ) {\n\t\t\t\tj = 0;\n\t\t\t\twhile ( (matcher = setMatchers[j++]) ) {\n\t\t\t\t\tmatcher( unmatched, setMatched, context, xml );\n\t\t\t\t}\n\n\t\t\t\tif ( seed ) {\n\t\t\t\t\t// Reintegrate element matches to eliminate the need for sorting\n\t\t\t\t\tif ( matchedCount > 0 ) {\n\t\t\t\t\t\twhile ( i-- ) {\n\t\t\t\t\t\t\tif ( !(unmatched[i] || setMatched[i]) ) {\n\t\t\t\t\t\t\t\tsetMatched[i] = pop.call( results );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Discard index placeholder values to get only actual matches\n\t\t\t\t\tsetMatched = condense( setMatched );\n\t\t\t\t}\n\n\t\t\t\t// Add matches to results\n\t\t\t\tpush.apply( results, setMatched );\n\n\t\t\t\t// Seedless set matches succeeding multiple successful matchers stipulate sorting\n\t\t\t\tif ( outermost && !seed && setMatched.length > 0 &&\n\t\t\t\t\t( matchedCount + setMatchers.length ) > 1 ) {\n\n\t\t\t\t\tSizzle.uniqueSort( results );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Override manipulation of globals by nested matchers\n\t\t\tif ( outermost ) {\n\t\t\t\tdirruns = dirrunsUnique;\n\t\t\t\toutermostContext = contextBackup;\n\t\t\t}\n\n\t\t\treturn unmatched;\n\t\t};\n\n\treturn bySet ?\n\t\tmarkFunction( superMatcher ) :\n\t\tsuperMatcher;\n}\n\ncompile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {\n\tvar i,\n\t\tsetMatchers = [],\n\t\telementMatchers = [],\n\t\tcached = compilerCache[ selector + \" \" ];\n\n\tif ( !cached ) {\n\t\t// Generate a function of recursive functions that can be used to check each element\n\t\tif ( !match ) {\n\t\t\tmatch = tokenize( selector );\n\t\t}\n\t\ti = match.length;\n\t\twhile ( i-- ) {\n\t\t\tcached = matcherFromTokens( match[i] );\n\t\t\tif ( cached[ expando ] ) {\n\t\t\t\tsetMatchers.push( cached );\n\t\t\t} else {\n\t\t\t\telementMatchers.push( cached );\n\t\t\t}\n\t\t}\n\n\t\t// Cache the compiled function\n\t\tcached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );\n\n\t\t// Save selector and tokenization\n\t\tcached.selector = selector;\n\t}\n\treturn cached;\n};\n\n/**\n * A low-level selection function that works with Sizzle's compiled\n *  selector functions\n * @param {String|Function} selector A selector or a pre-compiled\n *  selector function built with Sizzle.compile\n * @param {Element} context\n * @param {Array} [results]\n * @param {Array} [seed] A set of elements to match against\n */\nselect = Sizzle.select = function( selector, context, results, seed ) {\n\tvar i, tokens, token, type, find,\n\t\tcompiled = typeof selector === \"function\" && selector,\n\t\tmatch = !seed && tokenize( (selector = compiled.selector || selector) );\n\n\tresults = results || [];\n\n\t// Try to minimize operations if there is only one selector in the list and no seed\n\t// (the latter of which guarantees us context)\n\tif ( match.length === 1 ) {\n\n\t\t// Reduce context if the leading compound selector is an ID\n\t\ttokens = match[0] = match[0].slice( 0 );\n\t\tif ( tokens.length > 2 && (token = tokens[0]).type === \"ID\" &&\n\t\t\t\tcontext.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[1].type ] ) {\n\n\t\t\tcontext = ( Expr.find[\"ID\"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];\n\t\t\tif ( !context ) {\n\t\t\t\treturn results;\n\n\t\t\t// Precompiled matchers will still verify ancestry, so step up a level\n\t\t\t} else if ( compiled ) {\n\t\t\t\tcontext = context.parentNode;\n\t\t\t}\n\n\t\t\tselector = selector.slice( tokens.shift().value.length );\n\t\t}\n\n\t\t// Fetch a seed set for right-to-left matching\n\t\ti = matchExpr[\"needsContext\"].test( selector ) ? 0 : tokens.length;\n\t\twhile ( i-- ) {\n\t\t\ttoken = tokens[i];\n\n\t\t\t// Abort if we hit a combinator\n\t\t\tif ( Expr.relative[ (type = token.type) ] ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( (find = Expr.find[ type ]) ) {\n\t\t\t\t// Search, expanding context for leading sibling combinators\n\t\t\t\tif ( (seed = find(\n\t\t\t\t\ttoken.matches[0].replace( runescape, funescape ),\n\t\t\t\t\trsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context\n\t\t\t\t)) ) {\n\n\t\t\t\t\t// If seed is empty or no tokens remain, we can return early\n\t\t\t\t\ttokens.splice( i, 1 );\n\t\t\t\t\tselector = seed.length && toSelector( tokens );\n\t\t\t\t\tif ( !selector ) {\n\t\t\t\t\t\tpush.apply( results, seed );\n\t\t\t\t\t\treturn results;\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// Compile and execute a filtering function if one is not provided\n\t// Provide `match` to avoid retokenization if we modified the selector above\n\t( compiled || compile( selector, match ) )(\n\t\tseed,\n\t\tcontext,\n\t\t!documentIsHTML,\n\t\tresults,\n\t\t!context || rsibling.test( selector ) && testContext( context.parentNode ) || context\n\t);\n\treturn results;\n};\n\n// One-time assignments\n\n// Sort stability\nsupport.sortStable = expando.split(\"\").sort( sortOrder ).join(\"\") === expando;\n\n// Support: Chrome 14-35+\n// Always assume duplicates if they aren't passed to the comparison function\nsupport.detectDuplicates = !!hasDuplicate;\n\n// Initialize against the default document\nsetDocument();\n\n// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)\n// Detached nodes confoundingly follow *each other*\nsupport.sortDetached = assert(function( el ) {\n\t// Should return 1, but returns 4 (following)\n\treturn el.compareDocumentPosition( document.createElement(\"fieldset\") ) & 1;\n});\n\n// Support: IE<8\n// Prevent attribute/property \"interpolation\"\n// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx\nif ( !assert(function( el ) {\n\tel.innerHTML = \"<a href='#'></a>\";\n\treturn el.firstChild.getAttribute(\"href\") === \"#\" ;\n}) ) {\n\taddHandle( \"type|href|height|width\", function( elem, name, isXML ) {\n\t\tif ( !isXML ) {\n\t\t\treturn elem.getAttribute( name, name.toLowerCase() === \"type\" ? 1 : 2 );\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use defaultValue in place of getAttribute(\"value\")\nif ( !support.attributes || !assert(function( el ) {\n\tel.innerHTML = \"<input/>\";\n\tel.firstChild.setAttribute( \"value\", \"\" );\n\treturn el.firstChild.getAttribute( \"value\" ) === \"\";\n}) ) {\n\taddHandle( \"value\", function( elem, name, isXML ) {\n\t\tif ( !isXML && elem.nodeName.toLowerCase() === \"input\" ) {\n\t\t\treturn elem.defaultValue;\n\t\t}\n\t});\n}\n\n// Support: IE<9\n// Use getAttributeNode to fetch booleans when getAttribute lies\nif ( !assert(function( el ) {\n\treturn el.getAttribute(\"disabled\") == null;\n}) ) {\n\taddHandle( booleans, function( elem, name, isXML ) {\n\t\tvar val;\n\t\tif ( !isXML ) {\n\t\t\treturn elem[ name ] === true ? name.toLowerCase() :\n\t\t\t\t\t(val = elem.getAttributeNode( name )) && val.specified ?\n\t\t\t\t\tval.value :\n\t\t\t\tnull;\n\t\t}\n\t});\n}\n\nreturn Sizzle;\n\n})( window );\n\n\n\njQuery.find = Sizzle;\njQuery.expr = Sizzle.selectors;\n\n// Deprecated\njQuery.expr[ \":\" ] = jQuery.expr.pseudos;\njQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;\njQuery.text = Sizzle.getText;\njQuery.isXMLDoc = Sizzle.isXML;\njQuery.contains = Sizzle.contains;\njQuery.escapeSelector = Sizzle.escape;\n\n\n\n\nvar dir = function( elem, dir, until ) {\n\tvar matched = [],\n\t\ttruncate = until !== undefined;\n\n\twhile ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {\n\t\tif ( elem.nodeType === 1 ) {\n\t\t\tif ( truncate && jQuery( elem ).is( until ) ) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmatched.push( elem );\n\t\t}\n\t}\n\treturn matched;\n};\n\n\nvar siblings = function( n, elem ) {\n\tvar matched = [];\n\n\tfor ( ; n; n = n.nextSibling ) {\n\t\tif ( n.nodeType === 1 && n !== elem ) {\n\t\t\tmatched.push( n );\n\t\t}\n\t}\n\n\treturn matched;\n};\n\n\nvar rneedsContext = jQuery.expr.match.needsContext;\n\n\n\nfunction nodeName( elem, name ) {\n\n  return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();\n\n};\nvar rsingleTag = ( /^<([a-z][^\\/\\0>:\\x20\\t\\r\\n\\f]*)[\\x20\\t\\r\\n\\f]*\\/?>(?:<\\/\\1>|)$/i );\n\n\n\n// Implement the identical functionality for filter and not\nfunction winnow( elements, qualifier, not ) {\n\tif ( isFunction( qualifier ) ) {\n\t\treturn jQuery.grep( elements, function( elem, i ) {\n\t\t\treturn !!qualifier.call( elem, i, elem ) !== not;\n\t\t} );\n\t}\n\n\t// Single element\n\tif ( qualifier.nodeType ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( elem === qualifier ) !== not;\n\t\t} );\n\t}\n\n\t// Arraylike of elements (jQuery, arguments, Array)\n\tif ( typeof qualifier !== \"string\" ) {\n\t\treturn jQuery.grep( elements, function( elem ) {\n\t\t\treturn ( indexOf.call( qualifier, elem ) > -1 ) !== not;\n\t\t} );\n\t}\n\n\t// Filtered directly for both simple and complex selectors\n\treturn jQuery.filter( qualifier, elements, not );\n}\n\njQuery.filter = function( expr, elems, not ) {\n\tvar elem = elems[ 0 ];\n\n\tif ( not ) {\n\t\texpr = \":not(\" + expr + \")\";\n\t}\n\n\tif ( elems.length === 1 && elem.nodeType === 1 ) {\n\t\treturn jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [];\n\t}\n\n\treturn jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {\n\t\treturn elem.nodeType === 1;\n\t} ) );\n};\n\njQuery.fn.extend( {\n\tfind: function( selector ) {\n\t\tvar i, ret,\n\t\t\tlen = this.length,\n\t\t\tself = this;\n\n\t\tif ( typeof selector !== \"string\" ) {\n\t\t\treturn this.pushStack( jQuery( selector ).filter( function() {\n\t\t\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\t\t\tif ( jQuery.contains( self[ i ], this ) ) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} ) );\n\t\t}\n\n\t\tret = this.pushStack( [] );\n\n\t\tfor ( i = 0; i < len; i++ ) {\n\t\t\tjQuery.find( selector, self[ i ], ret );\n\t\t}\n\n\t\treturn len > 1 ? jQuery.uniqueSort( ret ) : ret;\n\t},\n\tfilter: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], false ) );\n\t},\n\tnot: function( selector ) {\n\t\treturn this.pushStack( winnow( this, selector || [], true ) );\n\t},\n\tis: function( selector ) {\n\t\treturn !!winnow(\n\t\t\tthis,\n\n\t\t\t// If this is a positional/relative selector, check membership in the returned set\n\t\t\t// so $(\"p:first\").is(\"p:last\") won't return true for a doc with two \"p\".\n\t\t\ttypeof selector === \"string\" && rneedsContext.test( selector ) ?\n\t\t\t\tjQuery( selector ) :\n\t\t\t\tselector || [],\n\t\t\tfalse\n\t\t).length;\n\t}\n} );\n\n\n// Initialize a jQuery object\n\n\n// A central reference to the root jQuery(document)\nvar rootjQuery,\n\n\t// A simple way to check for HTML strings\n\t// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)\n\t// Strict HTML recognition (#11290: must start with <)\n\t// Shortcut simple #id case for speed\n\trquickExpr = /^(?:\\s*(<[\\w\\W]+>)[^>]*|#([\\w-]+))$/,\n\n\tinit = jQuery.fn.init = function( selector, context, root ) {\n\t\tvar match, elem;\n\n\t\t// HANDLE: $(\"\"), $(null), $(undefined), $(false)\n\t\tif ( !selector ) {\n\t\t\treturn this;\n\t\t}\n\n\t\t// Method init() accepts an alternate rootjQuery\n\t\t// so migrate can support jQuery.sub (gh-2101)\n\t\troot = root || rootjQuery;\n\n\t\t// Handle HTML strings\n\t\tif ( typeof selector === \"string\" ) {\n\t\t\tif ( selector[ 0 ] === \"<\" &&\n\t\t\t\tselector[ selector.length - 1 ] === \">\" &&\n\t\t\t\tselector.length >= 3 ) {\n\n\t\t\t\t// Assume that strings that start and end with <> are HTML and skip the regex check\n\t\t\t\tmatch = [ null, selector, null ];\n\n\t\t\t} else {\n\t\t\t\tmatch = rquickExpr.exec( selector );\n\t\t\t}\n\n\t\t\t// Match html or make sure no context is specified for #id\n\t\t\tif ( match && ( match[ 1 ] || !context ) ) {\n\n\t\t\t\t// HANDLE: $(html) -> $(array)\n\t\t\t\tif ( match[ 1 ] ) {\n\t\t\t\t\tcontext = context instanceof jQuery ? context[ 0 ] : context;\n\n\t\t\t\t\t// Option to run scripts is true for back-compat\n\t\t\t\t\t// Intentionally let the error be thrown if parseHTML is not present\n\t\t\t\t\tjQuery.merge( this, jQuery.parseHTML(\n\t\t\t\t\t\tmatch[ 1 ],\n\t\t\t\t\t\tcontext && context.nodeType ? context.ownerDocument || context : document,\n\t\t\t\t\t\ttrue\n\t\t\t\t\t) );\n\n\t\t\t\t\t// HANDLE: $(html, props)\n\t\t\t\t\tif ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {\n\t\t\t\t\t\tfor ( match in context ) {\n\n\t\t\t\t\t\t\t// Properties of context are called as methods if possible\n\t\t\t\t\t\t\tif ( isFunction( this[ match ] ) ) {\n\t\t\t\t\t\t\t\tthis[ match ]( context[ match ] );\n\n\t\t\t\t\t\t\t// ...and otherwise set as attributes\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tthis.attr( match, context[ match ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn this;\n\n\t\t\t\t// HANDLE: $(#id)\n\t\t\t\t} else {\n\t\t\t\t\telem = document.getElementById( match[ 2 ] );\n\n\t\t\t\t\tif ( elem ) {\n\n\t\t\t\t\t\t// Inject the element directly into the jQuery object\n\t\t\t\t\t\tthis[ 0 ] = elem;\n\t\t\t\t\t\tthis.length = 1;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\n\t\t\t// HANDLE: $(expr, $(...))\n\t\t\t} else if ( !context || context.jquery ) {\n\t\t\t\treturn ( context || root ).find( selector );\n\n\t\t\t// HANDLE: $(expr, context)\n\t\t\t// (which is just equivalent to: $(context).find(expr)\n\t\t\t} else {\n\t\t\t\treturn this.constructor( context ).find( selector );\n\t\t\t}\n\n\t\t// HANDLE: $(DOMElement)\n\t\t} else if ( selector.nodeType ) {\n\t\t\tthis[ 0 ] = selector;\n\t\t\tthis.length = 1;\n\t\t\treturn this;\n\n\t\t// HANDLE: $(function)\n\t\t// Shortcut for document ready\n\t\t} else if ( isFunction( selector ) ) {\n\t\t\treturn root.ready !== undefined ?\n\t\t\t\troot.ready( selector ) :\n\n\t\t\t\t// Execute immediately if ready is not present\n\t\t\t\tselector( jQuery );\n\t\t}\n\n\t\treturn jQuery.makeArray( selector, this );\n\t};\n\n// Give the init function the jQuery prototype for later instantiation\ninit.prototype = jQuery.fn;\n\n// Initialize central reference\nrootjQuery = jQuery( document );\n\n\nvar rparentsprev = /^(?:parents|prev(?:Until|All))/,\n\n\t// Methods guaranteed to produce a unique set when starting from a unique set\n\tguaranteedUnique = {\n\t\tchildren: true,\n\t\tcontents: true,\n\t\tnext: true,\n\t\tprev: true\n\t};\n\njQuery.fn.extend( {\n\thas: function( target ) {\n\t\tvar targets = jQuery( target, this ),\n\t\t\tl = targets.length;\n\n\t\treturn this.filter( function() {\n\t\t\tvar i = 0;\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tif ( jQuery.contains( this, targets[ i ] ) ) {\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\tclosest: function( selectors, context ) {\n\t\tvar cur,\n\t\t\ti = 0,\n\t\t\tl = this.length,\n\t\t\tmatched = [],\n\t\t\ttargets = typeof selectors !== \"string\" && jQuery( selectors );\n\n\t\t// Positional selectors never match, since there's no _selection_ context\n\t\tif ( !rneedsContext.test( selectors ) ) {\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tfor ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {\n\n\t\t\t\t\t// Always skip document fragments\n\t\t\t\t\tif ( cur.nodeType < 11 && ( targets ?\n\t\t\t\t\t\ttargets.index( cur ) > -1 :\n\n\t\t\t\t\t\t// Don't pass non-elements to Sizzle\n\t\t\t\t\t\tcur.nodeType === 1 &&\n\t\t\t\t\t\t\tjQuery.find.matchesSelector( cur, selectors ) ) ) {\n\n\t\t\t\t\t\tmatched.push( cur );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );\n\t},\n\n\t// Determine the position of an element within the set\n\tindex: function( elem ) {\n\n\t\t// No argument, return index in parent\n\t\tif ( !elem ) {\n\t\t\treturn ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;\n\t\t}\n\n\t\t// Index in selector\n\t\tif ( typeof elem === \"string\" ) {\n\t\t\treturn indexOf.call( jQuery( elem ), this[ 0 ] );\n\t\t}\n\n\t\t// Locate the position of the desired element\n\t\treturn indexOf.call( this,\n\n\t\t\t// If it receives a jQuery object, the first element is used\n\t\t\telem.jquery ? elem[ 0 ] : elem\n\t\t);\n\t},\n\n\tadd: function( selector, context ) {\n\t\treturn this.pushStack(\n\t\t\tjQuery.uniqueSort(\n\t\t\t\tjQuery.merge( this.get(), jQuery( selector, context ) )\n\t\t\t)\n\t\t);\n\t},\n\n\taddBack: function( selector ) {\n\t\treturn this.add( selector == null ?\n\t\t\tthis.prevObject : this.prevObject.filter( selector )\n\t\t);\n\t}\n} );\n\nfunction sibling( cur, dir ) {\n\twhile ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}\n\treturn cur;\n}\n\njQuery.each( {\n\tparent: function( elem ) {\n\t\tvar parent = elem.parentNode;\n\t\treturn parent && parent.nodeType !== 11 ? parent : null;\n\t},\n\tparents: function( elem ) {\n\t\treturn dir( elem, \"parentNode\" );\n\t},\n\tparentsUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"parentNode\", until );\n\t},\n\tnext: function( elem ) {\n\t\treturn sibling( elem, \"nextSibling\" );\n\t},\n\tprev: function( elem ) {\n\t\treturn sibling( elem, \"previousSibling\" );\n\t},\n\tnextAll: function( elem ) {\n\t\treturn dir( elem, \"nextSibling\" );\n\t},\n\tprevAll: function( elem ) {\n\t\treturn dir( elem, \"previousSibling\" );\n\t},\n\tnextUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"nextSibling\", until );\n\t},\n\tprevUntil: function( elem, i, until ) {\n\t\treturn dir( elem, \"previousSibling\", until );\n\t},\n\tsiblings: function( elem ) {\n\t\treturn siblings( ( elem.parentNode || {} ).firstChild, elem );\n\t},\n\tchildren: function( elem ) {\n\t\treturn siblings( elem.firstChild );\n\t},\n\tcontents: function( elem ) {\n        if ( nodeName( elem, \"iframe\" ) ) {\n            return elem.contentDocument;\n        }\n\n        // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only\n        // Treat the template element as a regular one in browsers that\n        // don't support it.\n        if ( nodeName( elem, \"template\" ) ) {\n            elem = elem.content || elem;\n        }\n\n        return jQuery.merge( [], elem.childNodes );\n\t}\n}, function( name, fn ) {\n\tjQuery.fn[ name ] = function( until, selector ) {\n\t\tvar matched = jQuery.map( this, fn, until );\n\n\t\tif ( name.slice( -5 ) !== \"Until\" ) {\n\t\t\tselector = until;\n\t\t}\n\n\t\tif ( selector && typeof selector === \"string\" ) {\n\t\t\tmatched = jQuery.filter( selector, matched );\n\t\t}\n\n\t\tif ( this.length > 1 ) {\n\n\t\t\t// Remove duplicates\n\t\t\tif ( !guaranteedUnique[ name ] ) {\n\t\t\t\tjQuery.uniqueSort( matched );\n\t\t\t}\n\n\t\t\t// Reverse order for parents* and prev-derivatives\n\t\t\tif ( rparentsprev.test( name ) ) {\n\t\t\t\tmatched.reverse();\n\t\t\t}\n\t\t}\n\n\t\treturn this.pushStack( matched );\n\t};\n} );\nvar rnothtmlwhite = ( /[^\\x20\\t\\r\\n\\f]+/g );\n\n\n\n// Convert String-formatted options into Object-formatted ones\nfunction createOptions( options ) {\n\tvar object = {};\n\tjQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) {\n\t\tobject[ flag ] = true;\n\t} );\n\treturn object;\n}\n\n/*\n * Create a callback list using the following parameters:\n *\n *\toptions: an optional list of space-separated options that will change how\n *\t\t\tthe callback list behaves or a more traditional option object\n *\n * By default a callback list will act like an event callback list and can be\n * \"fired\" multiple times.\n *\n * Possible options:\n *\n *\tonce:\t\t\twill ensure the callback list can only be fired once (like a Deferred)\n *\n *\tmemory:\t\t\twill keep track of previous values and will call any callback added\n *\t\t\t\t\tafter the list has been fired right away with the latest \"memorized\"\n *\t\t\t\t\tvalues (like a Deferred)\n *\n *\tunique:\t\t\twill ensure a callback can only be added once (no duplicate in the list)\n *\n *\tstopOnFalse:\tinterrupt callings when a callback returns false\n *\n */\njQuery.Callbacks = function( options ) {\n\n\t// Convert options from String-formatted to Object-formatted if needed\n\t// (we check in cache first)\n\toptions = typeof options === \"string\" ?\n\t\tcreateOptions( options ) :\n\t\tjQuery.extend( {}, options );\n\n\tvar // Flag to know if list is currently firing\n\t\tfiring,\n\n\t\t// Last fire value for non-forgettable lists\n\t\tmemory,\n\n\t\t// Flag to know if list was already fired\n\t\tfired,\n\n\t\t// Flag to prevent firing\n\t\tlocked,\n\n\t\t// Actual callback list\n\t\tlist = [],\n\n\t\t// Queue of execution data for repeatable lists\n\t\tqueue = [],\n\n\t\t// Index of currently firing callback (modified by add/remove as needed)\n\t\tfiringIndex = -1,\n\n\t\t// Fire callbacks\n\t\tfire = function() {\n\n\t\t\t// Enforce single-firing\n\t\t\tlocked = locked || options.once;\n\n\t\t\t// Execute callbacks for all pending executions,\n\t\t\t// respecting firingIndex overrides and runtime changes\n\t\t\tfired = firing = true;\n\t\t\tfor ( ; queue.length; firingIndex = -1 ) {\n\t\t\t\tmemory = queue.shift();\n\t\t\t\twhile ( ++firingIndex < list.length ) {\n\n\t\t\t\t\t// Run callback and check for early termination\n\t\t\t\t\tif ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&\n\t\t\t\t\t\toptions.stopOnFalse ) {\n\n\t\t\t\t\t\t// Jump to end and forget the data so .add doesn't re-fire\n\t\t\t\t\t\tfiringIndex = list.length;\n\t\t\t\t\t\tmemory = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Forget the data if we're done with it\n\t\t\tif ( !options.memory ) {\n\t\t\t\tmemory = false;\n\t\t\t}\n\n\t\t\tfiring = false;\n\n\t\t\t// Clean up if we're done firing for good\n\t\t\tif ( locked ) {\n\n\t\t\t\t// Keep an empty list if we have data for future add calls\n\t\t\t\tif ( memory ) {\n\t\t\t\t\tlist = [];\n\n\t\t\t\t// Otherwise, this object is spent\n\t\t\t\t} else {\n\t\t\t\t\tlist = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\n\t\t// Actual Callbacks object\n\t\tself = {\n\n\t\t\t// Add a callback or a collection of callbacks to the list\n\t\t\tadd: function() {\n\t\t\t\tif ( list ) {\n\n\t\t\t\t\t// If we have memory from a past run, we should fire after adding\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfiringIndex = list.length - 1;\n\t\t\t\t\t\tqueue.push( memory );\n\t\t\t\t\t}\n\n\t\t\t\t\t( function add( args ) {\n\t\t\t\t\t\tjQuery.each( args, function( _, arg ) {\n\t\t\t\t\t\t\tif ( isFunction( arg ) ) {\n\t\t\t\t\t\t\t\tif ( !options.unique || !self.has( arg ) ) {\n\t\t\t\t\t\t\t\t\tlist.push( arg );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if ( arg && arg.length && toType( arg ) !== \"string\" ) {\n\n\t\t\t\t\t\t\t\t// Inspect recursively\n\t\t\t\t\t\t\t\tadd( arg );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t} )( arguments );\n\n\t\t\t\t\tif ( memory && !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Remove a callback from the list\n\t\t\tremove: function() {\n\t\t\t\tjQuery.each( arguments, function( _, arg ) {\n\t\t\t\t\tvar index;\n\t\t\t\t\twhile ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {\n\t\t\t\t\t\tlist.splice( index, 1 );\n\n\t\t\t\t\t\t// Handle firing indexes\n\t\t\t\t\t\tif ( index <= firingIndex ) {\n\t\t\t\t\t\t\tfiringIndex--;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Check if a given callback is in the list.\n\t\t\t// If no argument is given, return whether or not list has callbacks attached.\n\t\t\thas: function( fn ) {\n\t\t\t\treturn fn ?\n\t\t\t\t\tjQuery.inArray( fn, list ) > -1 :\n\t\t\t\t\tlist.length > 0;\n\t\t\t},\n\n\t\t\t// Remove all callbacks from the list\n\t\t\tempty: function() {\n\t\t\t\tif ( list ) {\n\t\t\t\t\tlist = [];\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Disable .fire and .add\n\t\t\t// Abort any current/pending executions\n\t\t\t// Clear all callbacks and values\n\t\t\tdisable: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tlist = memory = \"\";\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tdisabled: function() {\n\t\t\t\treturn !list;\n\t\t\t},\n\n\t\t\t// Disable .fire\n\t\t\t// Also disable .add unless we have memory (since it would have no effect)\n\t\t\t// Abort any pending executions\n\t\t\tlock: function() {\n\t\t\t\tlocked = queue = [];\n\t\t\t\tif ( !memory && !firing ) {\n\t\t\t\t\tlist = memory = \"\";\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\t\t\tlocked: function() {\n\t\t\t\treturn !!locked;\n\t\t\t},\n\n\t\t\t// Call all callbacks with the given context and arguments\n\t\t\tfireWith: function( context, args ) {\n\t\t\t\tif ( !locked ) {\n\t\t\t\t\targs = args || [];\n\t\t\t\t\targs = [ context, args.slice ? args.slice() : args ];\n\t\t\t\t\tqueue.push( args );\n\t\t\t\t\tif ( !firing ) {\n\t\t\t\t\t\tfire();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// Call all the callbacks with the given arguments\n\t\t\tfire: function() {\n\t\t\t\tself.fireWith( this, arguments );\n\t\t\t\treturn this;\n\t\t\t},\n\n\t\t\t// To know if the callbacks have already been called at least once\n\t\t\tfired: function() {\n\t\t\t\treturn !!fired;\n\t\t\t}\n\t\t};\n\n\treturn self;\n};\n\n\nfunction Identity( v ) {\n\treturn v;\n}\nfunction Thrower( ex ) {\n\tthrow ex;\n}\n\nfunction adoptValue( value, resolve, reject, noValue ) {\n\tvar method;\n\n\ttry {\n\n\t\t// Check for promise aspect first to privilege synchronous behavior\n\t\tif ( value && isFunction( ( method = value.promise ) ) ) {\n\t\t\tmethod.call( value ).done( resolve ).fail( reject );\n\n\t\t// Other thenables\n\t\t} else if ( value && isFunction( ( method = value.then ) ) ) {\n\t\t\tmethod.call( value, resolve, reject );\n\n\t\t// Other non-thenables\n\t\t} else {\n\n\t\t\t// Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:\n\t\t\t// * false: [ value ].slice( 0 ) => resolve( value )\n\t\t\t// * true: [ value ].slice( 1 ) => resolve()\n\t\t\tresolve.apply( undefined, [ value ].slice( noValue ) );\n\t\t}\n\n\t// For Promises/A+, convert exceptions into rejections\n\t// Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in\n\t// Deferred#then to conditionally suppress rejection.\n\t} catch ( value ) {\n\n\t\t// Support: Android 4.0 only\n\t\t// Strict mode functions invoked without .call/.apply get global-object context\n\t\treject.apply( undefined, [ value ] );\n\t}\n}\n\njQuery.extend( {\n\n\tDeferred: function( func ) {\n\t\tvar tuples = [\n\n\t\t\t\t// action, add listener, callbacks,\n\t\t\t\t// ... .then handlers, argument index, [final state]\n\t\t\t\t[ \"notify\", \"progress\", jQuery.Callbacks( \"memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"memory\" ), 2 ],\n\t\t\t\t[ \"resolve\", \"done\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 0, \"resolved\" ],\n\t\t\t\t[ \"reject\", \"fail\", jQuery.Callbacks( \"once memory\" ),\n\t\t\t\t\tjQuery.Callbacks( \"once memory\" ), 1, \"rejected\" ]\n\t\t\t],\n\t\t\tstate = \"pending\",\n\t\t\tpromise = {\n\t\t\t\tstate: function() {\n\t\t\t\t\treturn state;\n\t\t\t\t},\n\t\t\t\talways: function() {\n\t\t\t\t\tdeferred.done( arguments ).fail( arguments );\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\t\t\t\t\"catch\": function( fn ) {\n\t\t\t\t\treturn promise.then( null, fn );\n\t\t\t\t},\n\n\t\t\t\t// Keep pipe for back-compat\n\t\t\t\tpipe: function( /* fnDone, fnFail, fnProgress */ ) {\n\t\t\t\t\tvar fns = arguments;\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\t\t\t\t\t\tjQuery.each( tuples, function( i, tuple ) {\n\n\t\t\t\t\t\t\t// Map tuples (progress, done, fail) to arguments (done, fail, progress)\n\t\t\t\t\t\t\tvar fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ];\n\n\t\t\t\t\t\t\t// deferred.progress(function() { bind to newDefer or newDefer.notify })\n\t\t\t\t\t\t\t// deferred.done(function() { bind to newDefer or newDefer.resolve })\n\t\t\t\t\t\t\t// deferred.fail(function() { bind to newDefer or newDefer.reject })\n\t\t\t\t\t\t\tdeferred[ tuple[ 1 ] ]( function() {\n\t\t\t\t\t\t\t\tvar returned = fn && fn.apply( this, arguments );\n\t\t\t\t\t\t\t\tif ( returned && isFunction( returned.promise ) ) {\n\t\t\t\t\t\t\t\t\treturned.promise()\n\t\t\t\t\t\t\t\t\t\t.progress( newDefer.notify )\n\t\t\t\t\t\t\t\t\t\t.done( newDefer.resolve )\n\t\t\t\t\t\t\t\t\t\t.fail( newDefer.reject );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewDefer[ tuple[ 0 ] + \"With\" ](\n\t\t\t\t\t\t\t\t\t\tthis,\n\t\t\t\t\t\t\t\t\t\tfn ? [ returned ] : arguments\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t} );\n\t\t\t\t\t\tfns = null;\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\t\t\t\tthen: function( onFulfilled, onRejected, onProgress ) {\n\t\t\t\t\tvar maxDepth = 0;\n\t\t\t\t\tfunction resolve( depth, deferred, handler, special ) {\n\t\t\t\t\t\treturn function() {\n\t\t\t\t\t\t\tvar that = this,\n\t\t\t\t\t\t\t\targs = arguments,\n\t\t\t\t\t\t\t\tmightThrow = function() {\n\t\t\t\t\t\t\t\t\tvar returned, then;\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.3\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-59\n\t\t\t\t\t\t\t\t\t// Ignore double-resolution attempts\n\t\t\t\t\t\t\t\t\tif ( depth < maxDepth ) {\n\t\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\treturned = handler.apply( that, args );\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.1\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-48\n\t\t\t\t\t\t\t\t\tif ( returned === deferred.promise() ) {\n\t\t\t\t\t\t\t\t\t\tthrow new TypeError( \"Thenable self-resolution\" );\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Support: Promises/A+ sections 2.3.3.1, 3.5\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-54\n\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-75\n\t\t\t\t\t\t\t\t\t// Retrieve `then` only once\n\t\t\t\t\t\t\t\t\tthen = returned &&\n\n\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.4\n\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-64\n\t\t\t\t\t\t\t\t\t\t// Only check objects and functions for thenability\n\t\t\t\t\t\t\t\t\t\t( typeof returned === \"object\" ||\n\t\t\t\t\t\t\t\t\t\t\ttypeof returned === \"function\" ) &&\n\t\t\t\t\t\t\t\t\t\treturned.then;\n\n\t\t\t\t\t\t\t\t\t// Handle a returned thenable\n\t\t\t\t\t\t\t\t\tif ( isFunction( then ) ) {\n\n\t\t\t\t\t\t\t\t\t\t// Special processors (notify) just wait for resolution\n\t\t\t\t\t\t\t\t\t\tif ( special ) {\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special )\n\t\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// Normal processors (resolve) also hook into progress\n\t\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t\t// ...and disregard older resolution values\n\t\t\t\t\t\t\t\t\t\t\tmaxDepth++;\n\n\t\t\t\t\t\t\t\t\t\t\tthen.call(\n\t\t\t\t\t\t\t\t\t\t\t\treturned,\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Thrower, special ),\n\t\t\t\t\t\t\t\t\t\t\t\tresolve( maxDepth, deferred, Identity,\n\t\t\t\t\t\t\t\t\t\t\t\t\tdeferred.notifyWith )\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t// Handle all other returned values\n\t\t\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\tif ( handler !== Identity ) {\n\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\targs = [ returned ];\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t// Process the value(s)\n\t\t\t\t\t\t\t\t\t\t// Default process is resolve\n\t\t\t\t\t\t\t\t\t\t( special || deferred.resolveWith )( that, args );\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\n\t\t\t\t\t\t\t\t// Only normal processors (resolve) catch and reject exceptions\n\t\t\t\t\t\t\t\tprocess = special ?\n\t\t\t\t\t\t\t\t\tmightThrow :\n\t\t\t\t\t\t\t\t\tfunction() {\n\t\t\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\t\t\tmightThrow();\n\t\t\t\t\t\t\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t\t\t\t\t\t\tif ( jQuery.Deferred.exceptionHook ) {\n\t\t\t\t\t\t\t\t\t\t\t\tjQuery.Deferred.exceptionHook( e,\n\t\t\t\t\t\t\t\t\t\t\t\t\tprocess.stackTrace );\n\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.4.1\n\t\t\t\t\t\t\t\t\t\t\t// https://promisesaplus.com/#point-61\n\t\t\t\t\t\t\t\t\t\t\t// Ignore post-resolution exceptions\n\t\t\t\t\t\t\t\t\t\t\tif ( depth + 1 >= maxDepth ) {\n\n\t\t\t\t\t\t\t\t\t\t\t\t// Only substitute handlers pass on context\n\t\t\t\t\t\t\t\t\t\t\t\t// and multiple values (non-spec behavior)\n\t\t\t\t\t\t\t\t\t\t\t\tif ( handler !== Thrower ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\tthat = undefined;\n\t\t\t\t\t\t\t\t\t\t\t\t\targs = [ e ];\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\t\t\tdeferred.rejectWith( that, args );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t};\n\n\t\t\t\t\t\t\t// Support: Promises/A+ section 2.3.3.3.1\n\t\t\t\t\t\t\t// https://promisesaplus.com/#point-57\n\t\t\t\t\t\t\t// Re-resolve promises immediately to dodge false rejection from\n\t\t\t\t\t\t\t// subsequent errors\n\t\t\t\t\t\t\tif ( depth ) {\n\t\t\t\t\t\t\t\tprocess();\n\t\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t\t// Call an optional hook to record the stack, in case of exception\n\t\t\t\t\t\t\t\t// since it's otherwise lost when execution goes async\n\t\t\t\t\t\t\t\tif ( jQuery.Deferred.getStackHook ) {\n\t\t\t\t\t\t\t\t\tprocess.stackTrace = jQuery.Deferred.getStackHook();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\twindow.setTimeout( process );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\treturn jQuery.Deferred( function( newDefer ) {\n\n\t\t\t\t\t\t// progress_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 0 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onProgress ) ?\n\t\t\t\t\t\t\t\t\tonProgress :\n\t\t\t\t\t\t\t\t\tIdentity,\n\t\t\t\t\t\t\t\tnewDefer.notifyWith\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// fulfilled_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 1 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onFulfilled ) ?\n\t\t\t\t\t\t\t\t\tonFulfilled :\n\t\t\t\t\t\t\t\t\tIdentity\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\t// rejected_handlers.add( ... )\n\t\t\t\t\t\ttuples[ 2 ][ 3 ].add(\n\t\t\t\t\t\t\tresolve(\n\t\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t\t\tnewDefer,\n\t\t\t\t\t\t\t\tisFunction( onRejected ) ?\n\t\t\t\t\t\t\t\t\tonRejected :\n\t\t\t\t\t\t\t\t\tThrower\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t} ).promise();\n\t\t\t\t},\n\n\t\t\t\t// Get a promise for this deferred\n\t\t\t\t// If obj is provided, the promise aspect is added to the object\n\t\t\t\tpromise: function( obj ) {\n\t\t\t\t\treturn obj != null ? jQuery.extend( obj, promise ) : promise;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdeferred = {};\n\n\t\t// Add list-specific methods\n\t\tjQuery.each( tuples, function( i, tuple ) {\n\t\t\tvar list = tuple[ 2 ],\n\t\t\t\tstateString = tuple[ 5 ];\n\n\t\t\t// promise.progress = list.add\n\t\t\t// promise.done = list.add\n\t\t\t// promise.fail = list.add\n\t\t\tpromise[ tuple[ 1 ] ] = list.add;\n\n\t\t\t// Handle state\n\t\t\tif ( stateString ) {\n\t\t\t\tlist.add(\n\t\t\t\t\tfunction() {\n\n\t\t\t\t\t\t// state = \"resolved\" (i.e., fulfilled)\n\t\t\t\t\t\t// state = \"rejected\"\n\t\t\t\t\t\tstate = stateString;\n\t\t\t\t\t},\n\n\t\t\t\t\t// rejected_callbacks.disable\n\t\t\t\t\t// fulfilled_callbacks.disable\n\t\t\t\t\ttuples[ 3 - i ][ 2 ].disable,\n\n\t\t\t\t\t// rejected_handlers.disable\n\t\t\t\t\t// fulfilled_handlers.disable\n\t\t\t\t\ttuples[ 3 - i ][ 3 ].disable,\n\n\t\t\t\t\t// progress_callbacks.lock\n\t\t\t\t\ttuples[ 0 ][ 2 ].lock,\n\n\t\t\t\t\t// progress_handlers.lock\n\t\t\t\t\ttuples[ 0 ][ 3 ].lock\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// progress_handlers.fire\n\t\t\t// fulfilled_handlers.fire\n\t\t\t// rejected_handlers.fire\n\t\t\tlist.add( tuple[ 3 ].fire );\n\n\t\t\t// deferred.notify = function() { deferred.notifyWith(...) }\n\t\t\t// deferred.resolve = function() { deferred.resolveWith(...) }\n\t\t\t// deferred.reject = function() { deferred.rejectWith(...) }\n\t\t\tdeferred[ tuple[ 0 ] ] = function() {\n\t\t\t\tdeferred[ tuple[ 0 ] + \"With\" ]( this === deferred ? undefined : this, arguments );\n\t\t\t\treturn this;\n\t\t\t};\n\n\t\t\t// deferred.notifyWith = list.fireWith\n\t\t\t// deferred.resolveWith = list.fireWith\n\t\t\t// deferred.rejectWith = list.fireWith\n\t\t\tdeferred[ tuple[ 0 ] + \"With\" ] = list.fireWith;\n\t\t} );\n\n\t\t// Make the deferred a promise\n\t\tpromise.promise( deferred );\n\n\t\t// Call given func if any\n\t\tif ( func ) {\n\t\t\tfunc.call( deferred, deferred );\n\t\t}\n\n\t\t// All done!\n\t\treturn deferred;\n\t},\n\n\t// Deferred helper\n\twhen: function( singleValue ) {\n\t\tvar\n\n\t\t\t// count of uncompleted subordinates\n\t\t\tremaining = arguments.length,\n\n\t\t\t// count of unprocessed arguments\n\t\t\ti = remaining,\n\n\t\t\t// subordinate fulfillment data\n\t\t\tresolveContexts = Array( i ),\n\t\t\tresolveValues = slice.call( arguments ),\n\n\t\t\t// the master Deferred\n\t\t\tmaster = jQuery.Deferred(),\n\n\t\t\t// subordinate callback factory\n\t\t\tupdateFunc = function( i ) {\n\t\t\t\treturn function( value ) {\n\t\t\t\t\tresolveContexts[ i ] = this;\n\t\t\t\t\tresolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;\n\t\t\t\t\tif ( !( --remaining ) ) {\n\t\t\t\t\t\tmaster.resolveWith( resolveContexts, resolveValues );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t};\n\n\t\t// Single- and empty arguments are adopted like Promise.resolve\n\t\tif ( remaining <= 1 ) {\n\t\t\tadoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,\n\t\t\t\t!remaining );\n\n\t\t\t// Use .then() to unwrap secondary thenables (cf. gh-3000)\n\t\t\tif ( master.state() === \"pending\" ||\n\t\t\t\tisFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {\n\n\t\t\t\treturn master.then();\n\t\t\t}\n\t\t}\n\n\t\t// Multiple arguments are aggregated like Promise.all array elements\n\t\twhile ( i-- ) {\n\t\t\tadoptValue( resolveValues[ i ], updateFunc( i ), master.reject );\n\t\t}\n\n\t\treturn master.promise();\n\t}\n} );\n\n\n// These usually indicate a programmer mistake during development,\n// warn about them ASAP rather than swallowing them by default.\nvar rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;\n\njQuery.Deferred.exceptionHook = function( error, stack ) {\n\n\t// Support: IE 8 - 9 only\n\t// Console exists when dev tools are open, which can happen at any time\n\tif ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) {\n\t\twindow.console.warn( \"jQuery.Deferred exception: \" + error.message, error.stack, stack );\n\t}\n};\n\n\n\n\njQuery.readyException = function( error ) {\n\twindow.setTimeout( function() {\n\t\tthrow error;\n\t} );\n};\n\n\n\n\n// The deferred used on DOM ready\nvar readyList = jQuery.Deferred();\n\njQuery.fn.ready = function( fn ) {\n\n\treadyList\n\t\t.then( fn )\n\n\t\t// Wrap jQuery.readyException in a function so that the lookup\n\t\t// happens at the time of error handling instead of callback\n\t\t// registration.\n\t\t.catch( function( error ) {\n\t\t\tjQuery.readyException( error );\n\t\t} );\n\n\treturn this;\n};\n\njQuery.extend( {\n\n\t// Is the DOM ready to be used? Set to true once it occurs.\n\tisReady: false,\n\n\t// A counter to track how many items to wait for before\n\t// the ready event fires. See #6781\n\treadyWait: 1,\n\n\t// Handle when the DOM is ready\n\tready: function( wait ) {\n\n\t\t// Abort if there are pending holds or we're already ready\n\t\tif ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Remember that the DOM is ready\n\t\tjQuery.isReady = true;\n\n\t\t// If a normal DOM Ready event fired, decrement, and wait if need be\n\t\tif ( wait !== true && --jQuery.readyWait > 0 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If there are functions bound, to execute\n\t\treadyList.resolveWith( document, [ jQuery ] );\n\t}\n} );\n\njQuery.ready.then = readyList.then;\n\n// The ready event handler and self cleanup method\nfunction completed() {\n\tdocument.removeEventListener( \"DOMContentLoaded\", completed );\n\twindow.removeEventListener( \"load\", completed );\n\tjQuery.ready();\n}\n\n// Catch cases where $(document).ready() is called\n// after the browser event has already occurred.\n// Support: IE <=9 - 10 only\n// Older IE sometimes signals \"interactive\" too soon\nif ( document.readyState === \"complete\" ||\n\t( document.readyState !== \"loading\" && !document.documentElement.doScroll ) ) {\n\n\t// Handle it asynchronously to allow scripts the opportunity to delay ready\n\twindow.setTimeout( jQuery.ready );\n\n} else {\n\n\t// Use the handy event callback\n\tdocument.addEventListener( \"DOMContentLoaded\", completed );\n\n\t// A fallback to window.onload, that will always work\n\twindow.addEventListener( \"load\", completed );\n}\n\n\n\n\n// Multifunctional method to get and set values of a collection\n// The value/s can optionally be executed if it's a function\nvar access = function( elems, fn, key, value, chainable, emptyGet, raw ) {\n\tvar i = 0,\n\t\tlen = elems.length,\n\t\tbulk = key == null;\n\n\t// Sets many values\n\tif ( toType( key ) === \"object\" ) {\n\t\tchainable = true;\n\t\tfor ( i in key ) {\n\t\t\taccess( elems, fn, i, key[ i ], true, emptyGet, raw );\n\t\t}\n\n\t// Sets one value\n\t} else if ( value !== undefined ) {\n\t\tchainable = true;\n\n\t\tif ( !isFunction( value ) ) {\n\t\t\traw = true;\n\t\t}\n\n\t\tif ( bulk ) {\n\n\t\t\t// Bulk operations run against the entire set\n\t\t\tif ( raw ) {\n\t\t\t\tfn.call( elems, value );\n\t\t\t\tfn = null;\n\n\t\t\t// ...except when executing function values\n\t\t\t} else {\n\t\t\t\tbulk = fn;\n\t\t\t\tfn = function( elem, key, value ) {\n\t\t\t\t\treturn bulk.call( jQuery( elem ), value );\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif ( fn ) {\n\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\tfn(\n\t\t\t\t\telems[ i ], key, raw ?\n\t\t\t\t\tvalue :\n\t\t\t\t\tvalue.call( elems[ i ], i, fn( elems[ i ], key ) )\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( chainable ) {\n\t\treturn elems;\n\t}\n\n\t// Gets\n\tif ( bulk ) {\n\t\treturn fn.call( elems );\n\t}\n\n\treturn len ? fn( elems[ 0 ], key ) : emptyGet;\n};\n\n\n// Matches dashed string for camelizing\nvar rmsPrefix = /^-ms-/,\n\trdashAlpha = /-([a-z])/g;\n\n// Used by camelCase as callback to replace()\nfunction fcamelCase( all, letter ) {\n\treturn letter.toUpperCase();\n}\n\n// Convert dashed to camelCase; used by the css and data modules\n// Support: IE <=9 - 11, Edge 12 - 15\n// Microsoft forgot to hump their vendor prefix (#9572)\nfunction camelCase( string ) {\n\treturn string.replace( rmsPrefix, \"ms-\" ).replace( rdashAlpha, fcamelCase );\n}\nvar acceptData = function( owner ) {\n\n\t// Accepts only:\n\t//  - Node\n\t//    - Node.ELEMENT_NODE\n\t//    - Node.DOCUMENT_NODE\n\t//  - Object\n\t//    - Any\n\treturn owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );\n};\n\n\n\n\nfunction Data() {\n\tthis.expando = jQuery.expando + Data.uid++;\n}\n\nData.uid = 1;\n\nData.prototype = {\n\n\tcache: function( owner ) {\n\n\t\t// Check if the owner object already has a cache\n\t\tvar value = owner[ this.expando ];\n\n\t\t// If not, create one\n\t\tif ( !value ) {\n\t\t\tvalue = {};\n\n\t\t\t// We can accept data for non-element nodes in modern browsers,\n\t\t\t// but we should not, see #8335.\n\t\t\t// Always return an empty object.\n\t\t\tif ( acceptData( owner ) ) {\n\n\t\t\t\t// If it is a node unlikely to be stringify-ed or looped over\n\t\t\t\t// use plain assignment\n\t\t\t\tif ( owner.nodeType ) {\n\t\t\t\t\towner[ this.expando ] = value;\n\n\t\t\t\t// Otherwise secure it in a non-enumerable property\n\t\t\t\t// configurable must be true to allow the property to be\n\t\t\t\t// deleted when data is removed\n\t\t\t\t} else {\n\t\t\t\t\tObject.defineProperty( owner, this.expando, {\n\t\t\t\t\t\tvalue: value,\n\t\t\t\t\t\tconfigurable: true\n\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn value;\n\t},\n\tset: function( owner, data, value ) {\n\t\tvar prop,\n\t\t\tcache = this.cache( owner );\n\n\t\t// Handle: [ owner, key, value ] args\n\t\t// Always use camelCase key (gh-2257)\n\t\tif ( typeof data === \"string\" ) {\n\t\t\tcache[ camelCase( data ) ] = value;\n\n\t\t// Handle: [ owner, { properties } ] args\n\t\t} else {\n\n\t\t\t// Copy the properties one-by-one to the cache object\n\t\t\tfor ( prop in data ) {\n\t\t\t\tcache[ camelCase( prop ) ] = data[ prop ];\n\t\t\t}\n\t\t}\n\t\treturn cache;\n\t},\n\tget: function( owner, key ) {\n\t\treturn key === undefined ?\n\t\t\tthis.cache( owner ) :\n\n\t\t\t// Always use camelCase key (gh-2257)\n\t\t\towner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ];\n\t},\n\taccess: function( owner, key, value ) {\n\n\t\t// In cases where either:\n\t\t//\n\t\t//   1. No key was specified\n\t\t//   2. A string key was specified, but no value provided\n\t\t//\n\t\t// Take the \"read\" path and allow the get method to determine\n\t\t// which value to return, respectively either:\n\t\t//\n\t\t//   1. The entire cache object\n\t\t//   2. The data stored at the key\n\t\t//\n\t\tif ( key === undefined ||\n\t\t\t\t( ( key && typeof key === \"string\" ) && value === undefined ) ) {\n\n\t\t\treturn this.get( owner, key );\n\t\t}\n\n\t\t// When the key is not a string, or both a key and value\n\t\t// are specified, set or extend (existing objects) with either:\n\t\t//\n\t\t//   1. An object of properties\n\t\t//   2. A key and value\n\t\t//\n\t\tthis.set( owner, key, value );\n\n\t\t// Since the \"set\" path can have two possible entry points\n\t\t// return the expected data based on which path was taken[*]\n\t\treturn value !== undefined ? value : key;\n\t},\n\tremove: function( owner, key ) {\n\t\tvar i,\n\t\t\tcache = owner[ this.expando ];\n\n\t\tif ( cache === undefined ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( key !== undefined ) {\n\n\t\t\t// Support array or space separated string of keys\n\t\t\tif ( Array.isArray( key ) ) {\n\n\t\t\t\t// If key is an array of keys...\n\t\t\t\t// We always set camelCase keys, so remove that.\n\t\t\t\tkey = key.map( camelCase );\n\t\t\t} else {\n\t\t\t\tkey = camelCase( key );\n\n\t\t\t\t// If a key with the spaces exists, use it.\n\t\t\t\t// Otherwise, create an array by matching non-whitespace\n\t\t\t\tkey = key in cache ?\n\t\t\t\t\t[ key ] :\n\t\t\t\t\t( key.match( rnothtmlwhite ) || [] );\n\t\t\t}\n\n\t\t\ti = key.length;\n\n\t\t\twhile ( i-- ) {\n\t\t\t\tdelete cache[ key[ i ] ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove the expando if there's no more data\n\t\tif ( key === undefined || jQuery.isEmptyObject( cache ) ) {\n\n\t\t\t// Support: Chrome <=35 - 45\n\t\t\t// Webkit & Blink performance suffers when deleting properties\n\t\t\t// from DOM nodes, so set to undefined instead\n\t\t\t// https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)\n\t\t\tif ( owner.nodeType ) {\n\t\t\t\towner[ this.expando ] = undefined;\n\t\t\t} else {\n\t\t\t\tdelete owner[ this.expando ];\n\t\t\t}\n\t\t}\n\t},\n\thasData: function( owner ) {\n\t\tvar cache = owner[ this.expando ];\n\t\treturn cache !== undefined && !jQuery.isEmptyObject( cache );\n\t}\n};\nvar dataPriv = new Data();\n\nvar dataUser = new Data();\n\n\n\n//\tImplementation Summary\n//\n//\t1. Enforce API surface and semantic compatibility with 1.9.x branch\n//\t2. Improve the module's maintainability by reducing the storage\n//\t\tpaths to a single mechanism.\n//\t3. Use the same single mechanism to support \"private\" and \"user\" data.\n//\t4. _Never_ expose \"private\" data to user code (TODO: Drop _data, _removeData)\n//\t5. Avoid exposing implementation details on user objects (eg. expando properties)\n//\t6. Provide a clear path for implementation upgrade to WeakMap in 2014\n\nvar rbrace = /^(?:\\{[\\w\\W]*\\}|\\[[\\w\\W]*\\])$/,\n\trmultiDash = /[A-Z]/g;\n\nfunction getData( data ) {\n\tif ( data === \"true\" ) {\n\t\treturn true;\n\t}\n\n\tif ( data === \"false\" ) {\n\t\treturn false;\n\t}\n\n\tif ( data === \"null\" ) {\n\t\treturn null;\n\t}\n\n\t// Only convert to a number if it doesn't change the string\n\tif ( data === +data + \"\" ) {\n\t\treturn +data;\n\t}\n\n\tif ( rbrace.test( data ) ) {\n\t\treturn JSON.parse( data );\n\t}\n\n\treturn data;\n}\n\nfunction dataAttr( elem, key, data ) {\n\tvar name;\n\n\t// If nothing was found internally, try to fetch any\n\t// data from the HTML5 data-* attribute\n\tif ( data === undefined && elem.nodeType === 1 ) {\n\t\tname = \"data-\" + key.replace( rmultiDash, \"-$&\" ).toLowerCase();\n\t\tdata = elem.getAttribute( name );\n\n\t\tif ( typeof data === \"string\" ) {\n\t\t\ttry {\n\t\t\t\tdata = getData( data );\n\t\t\t} catch ( e ) {}\n\n\t\t\t// Make sure we set the data so it isn't changed later\n\t\t\tdataUser.set( elem, key, data );\n\t\t} else {\n\t\t\tdata = undefined;\n\t\t}\n\t}\n\treturn data;\n}\n\njQuery.extend( {\n\thasData: function( elem ) {\n\t\treturn dataUser.hasData( elem ) || dataPriv.hasData( elem );\n\t},\n\n\tdata: function( elem, name, data ) {\n\t\treturn dataUser.access( elem, name, data );\n\t},\n\n\tremoveData: function( elem, name ) {\n\t\tdataUser.remove( elem, name );\n\t},\n\n\t// TODO: Now that all calls to _data and _removeData have been replaced\n\t// with direct calls to dataPriv methods, these can be deprecated.\n\t_data: function( elem, name, data ) {\n\t\treturn dataPriv.access( elem, name, data );\n\t},\n\n\t_removeData: function( elem, name ) {\n\t\tdataPriv.remove( elem, name );\n\t}\n} );\n\njQuery.fn.extend( {\n\tdata: function( key, value ) {\n\t\tvar i, name, data,\n\t\t\telem = this[ 0 ],\n\t\t\tattrs = elem && elem.attributes;\n\n\t\t// Gets all values\n\t\tif ( key === undefined ) {\n\t\t\tif ( this.length ) {\n\t\t\t\tdata = dataUser.get( elem );\n\n\t\t\t\tif ( elem.nodeType === 1 && !dataPriv.get( elem, \"hasDataAttrs\" ) ) {\n\t\t\t\t\ti = attrs.length;\n\t\t\t\t\twhile ( i-- ) {\n\n\t\t\t\t\t\t// Support: IE 11 only\n\t\t\t\t\t\t// The attrs elements can be null (#14894)\n\t\t\t\t\t\tif ( attrs[ i ] ) {\n\t\t\t\t\t\t\tname = attrs[ i ].name;\n\t\t\t\t\t\t\tif ( name.indexOf( \"data-\" ) === 0 ) {\n\t\t\t\t\t\t\t\tname = camelCase( name.slice( 5 ) );\n\t\t\t\t\t\t\t\tdataAttr( elem, name, data[ name ] );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdataPriv.set( elem, \"hasDataAttrs\", true );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn data;\n\t\t}\n\n\t\t// Sets multiple values\n\t\tif ( typeof key === \"object\" ) {\n\t\t\treturn this.each( function() {\n\t\t\t\tdataUser.set( this, key );\n\t\t\t} );\n\t\t}\n\n\t\treturn access( this, function( value ) {\n\t\t\tvar data;\n\n\t\t\t// The calling jQuery object (element matches) is not empty\n\t\t\t// (and therefore has an element appears at this[ 0 ]) and the\n\t\t\t// `value` parameter was not undefined. An empty jQuery object\n\t\t\t// will result in `undefined` for elem = this[ 0 ] which will\n\t\t\t// throw an exception if an attempt to read a data cache is made.\n\t\t\tif ( elem && value === undefined ) {\n\n\t\t\t\t// Attempt to get data from the cache\n\t\t\t\t// The key will always be camelCased in Data\n\t\t\t\tdata = dataUser.get( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// Attempt to \"discover\" the data in\n\t\t\t\t// HTML5 custom data-* attrs\n\t\t\t\tdata = dataAttr( elem, key );\n\t\t\t\tif ( data !== undefined ) {\n\t\t\t\t\treturn data;\n\t\t\t\t}\n\n\t\t\t\t// We tried really hard, but the data doesn't exist.\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Set the data...\n\t\t\tthis.each( function() {\n\n\t\t\t\t// We always store the camelCased key\n\t\t\t\tdataUser.set( this, key, value );\n\t\t\t} );\n\t\t}, null, value, arguments.length > 1, null, true );\n\t},\n\n\tremoveData: function( key ) {\n\t\treturn this.each( function() {\n\t\t\tdataUser.remove( this, key );\n\t\t} );\n\t}\n} );\n\n\njQuery.extend( {\n\tqueue: function( elem, type, data ) {\n\t\tvar queue;\n\n\t\tif ( elem ) {\n\t\t\ttype = ( type || \"fx\" ) + \"queue\";\n\t\t\tqueue = dataPriv.get( elem, type );\n\n\t\t\t// Speed up dequeue by getting out quickly if this is just a lookup\n\t\t\tif ( data ) {\n\t\t\t\tif ( !queue || Array.isArray( data ) ) {\n\t\t\t\t\tqueue = dataPriv.access( elem, type, jQuery.makeArray( data ) );\n\t\t\t\t} else {\n\t\t\t\t\tqueue.push( data );\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn queue || [];\n\t\t}\n\t},\n\n\tdequeue: function( elem, type ) {\n\t\ttype = type || \"fx\";\n\n\t\tvar queue = jQuery.queue( elem, type ),\n\t\t\tstartLength = queue.length,\n\t\t\tfn = queue.shift(),\n\t\t\thooks = jQuery._queueHooks( elem, type ),\n\t\t\tnext = function() {\n\t\t\t\tjQuery.dequeue( elem, type );\n\t\t\t};\n\n\t\t// If the fx queue is dequeued, always remove the progress sentinel\n\t\tif ( fn === \"inprogress\" ) {\n\t\t\tfn = queue.shift();\n\t\t\tstartLength--;\n\t\t}\n\n\t\tif ( fn ) {\n\n\t\t\t// Add a progress sentinel to prevent the fx queue from being\n\t\t\t// automatically dequeued\n\t\t\tif ( type === \"fx\" ) {\n\t\t\t\tqueue.unshift( \"inprogress\" );\n\t\t\t}\n\n\t\t\t// Clear up the last queue stop function\n\t\t\tdelete hooks.stop;\n\t\t\tfn.call( elem, next, hooks );\n\t\t}\n\n\t\tif ( !startLength && hooks ) {\n\t\t\thooks.empty.fire();\n\t\t}\n\t},\n\n\t// Not public - generate a queueHooks object, or return the current one\n\t_queueHooks: function( elem, type ) {\n\t\tvar key = type + \"queueHooks\";\n\t\treturn dataPriv.get( elem, key ) || dataPriv.access( elem, key, {\n\t\t\tempty: jQuery.Callbacks( \"once memory\" ).add( function() {\n\t\t\t\tdataPriv.remove( elem, [ type + \"queue\", key ] );\n\t\t\t} )\n\t\t} );\n\t}\n} );\n\njQuery.fn.extend( {\n\tqueue: function( type, data ) {\n\t\tvar setter = 2;\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tdata = type;\n\t\t\ttype = \"fx\";\n\t\t\tsetter--;\n\t\t}\n\n\t\tif ( arguments.length < setter ) {\n\t\t\treturn jQuery.queue( this[ 0 ], type );\n\t\t}\n\n\t\treturn data === undefined ?\n\t\t\tthis :\n\t\t\tthis.each( function() {\n\t\t\t\tvar queue = jQuery.queue( this, type, data );\n\n\t\t\t\t// Ensure a hooks for this queue\n\t\t\t\tjQuery._queueHooks( this, type );\n\n\t\t\t\tif ( type === \"fx\" && queue[ 0 ] !== \"inprogress\" ) {\n\t\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t\t}\n\t\t\t} );\n\t},\n\tdequeue: function( type ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.dequeue( this, type );\n\t\t} );\n\t},\n\tclearQueue: function( type ) {\n\t\treturn this.queue( type || \"fx\", [] );\n\t},\n\n\t// Get a promise resolved when queues of a certain type\n\t// are emptied (fx is the type by default)\n\tpromise: function( type, obj ) {\n\t\tvar tmp,\n\t\t\tcount = 1,\n\t\t\tdefer = jQuery.Deferred(),\n\t\t\telements = this,\n\t\t\ti = this.length,\n\t\t\tresolve = function() {\n\t\t\t\tif ( !( --count ) ) {\n\t\t\t\t\tdefer.resolveWith( elements, [ elements ] );\n\t\t\t\t}\n\t\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tobj = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\ttype = type || \"fx\";\n\n\t\twhile ( i-- ) {\n\t\t\ttmp = dataPriv.get( elements[ i ], type + \"queueHooks\" );\n\t\t\tif ( tmp && tmp.empty ) {\n\t\t\t\tcount++;\n\t\t\t\ttmp.empty.add( resolve );\n\t\t\t}\n\t\t}\n\t\tresolve();\n\t\treturn defer.promise( obj );\n\t}\n} );\nvar pnum = ( /[+-]?(?:\\d*\\.|)\\d+(?:[eE][+-]?\\d+|)/ ).source;\n\nvar rcssNum = new RegExp( \"^(?:([+-])=|)(\" + pnum + \")([a-z%]*)$\", \"i\" );\n\n\nvar cssExpand = [ \"Top\", \"Right\", \"Bottom\", \"Left\" ];\n\nvar isHiddenWithinTree = function( elem, el ) {\n\n\t\t// isHiddenWithinTree might be called from jQuery#filter function;\n\t\t// in that case, element will be second argument\n\t\telem = el || elem;\n\n\t\t// Inline style trumps all\n\t\treturn elem.style.display === \"none\" ||\n\t\t\telem.style.display === \"\" &&\n\n\t\t\t// Otherwise, check computed style\n\t\t\t// Support: Firefox <=43 - 45\n\t\t\t// Disconnected elements can have computed display: none, so first confirm that elem is\n\t\t\t// in the document.\n\t\t\tjQuery.contains( elem.ownerDocument, elem ) &&\n\n\t\t\tjQuery.css( elem, \"display\" ) === \"none\";\n\t};\n\nvar swap = function( elem, options, callback, args ) {\n\tvar ret, name,\n\t\told = {};\n\n\t// Remember the old values, and insert the new ones\n\tfor ( name in options ) {\n\t\told[ name ] = elem.style[ name ];\n\t\telem.style[ name ] = options[ name ];\n\t}\n\n\tret = callback.apply( elem, args || [] );\n\n\t// Revert the old values\n\tfor ( name in options ) {\n\t\telem.style[ name ] = old[ name ];\n\t}\n\n\treturn ret;\n};\n\n\n\n\nfunction adjustCSS( elem, prop, valueParts, tween ) {\n\tvar adjusted, scale,\n\t\tmaxIterations = 20,\n\t\tcurrentValue = tween ?\n\t\t\tfunction() {\n\t\t\t\treturn tween.cur();\n\t\t\t} :\n\t\t\tfunction() {\n\t\t\t\treturn jQuery.css( elem, prop, \"\" );\n\t\t\t},\n\t\tinitial = currentValue(),\n\t\tunit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" ),\n\n\t\t// Starting value computation is required for potential unit mismatches\n\t\tinitialInUnit = ( jQuery.cssNumber[ prop ] || unit !== \"px\" && +initial ) &&\n\t\t\trcssNum.exec( jQuery.css( elem, prop ) );\n\n\tif ( initialInUnit && initialInUnit[ 3 ] !== unit ) {\n\n\t\t// Support: Firefox <=54\n\t\t// Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)\n\t\tinitial = initial / 2;\n\n\t\t// Trust units reported by jQuery.css\n\t\tunit = unit || initialInUnit[ 3 ];\n\n\t\t// Iteratively approximate from a nonzero starting point\n\t\tinitialInUnit = +initial || 1;\n\n\t\twhile ( maxIterations-- ) {\n\n\t\t\t// Evaluate and update our best guess (doubling guesses that zero out).\n\t\t\t// Finish if the scale equals or crosses 1 (making the old*new product non-positive).\n\t\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\t\t\tif ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) {\n\t\t\t\tmaxIterations = 0;\n\t\t\t}\n\t\t\tinitialInUnit = initialInUnit / scale;\n\n\t\t}\n\n\t\tinitialInUnit = initialInUnit * 2;\n\t\tjQuery.style( elem, prop, initialInUnit + unit );\n\n\t\t// Make sure we update the tween properties later on\n\t\tvalueParts = valueParts || [];\n\t}\n\n\tif ( valueParts ) {\n\t\tinitialInUnit = +initialInUnit || +initial || 0;\n\n\t\t// Apply relative offset (+=/-=) if specified\n\t\tadjusted = valueParts[ 1 ] ?\n\t\t\tinitialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :\n\t\t\t+valueParts[ 2 ];\n\t\tif ( tween ) {\n\t\t\ttween.unit = unit;\n\t\t\ttween.start = initialInUnit;\n\t\t\ttween.end = adjusted;\n\t\t}\n\t}\n\treturn adjusted;\n}\n\n\nvar defaultDisplayMap = {};\n\nfunction getDefaultDisplay( elem ) {\n\tvar temp,\n\t\tdoc = elem.ownerDocument,\n\t\tnodeName = elem.nodeName,\n\t\tdisplay = defaultDisplayMap[ nodeName ];\n\n\tif ( display ) {\n\t\treturn display;\n\t}\n\n\ttemp = doc.body.appendChild( doc.createElement( nodeName ) );\n\tdisplay = jQuery.css( temp, \"display\" );\n\n\ttemp.parentNode.removeChild( temp );\n\n\tif ( display === \"none\" ) {\n\t\tdisplay = \"block\";\n\t}\n\tdefaultDisplayMap[ nodeName ] = display;\n\n\treturn display;\n}\n\nfunction showHide( elements, show ) {\n\tvar display, elem,\n\t\tvalues = [],\n\t\tindex = 0,\n\t\tlength = elements.length;\n\n\t// Determine new display value for elements that need to change\n\tfor ( ; index < length; index++ ) {\n\t\telem = elements[ index ];\n\t\tif ( !elem.style ) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tdisplay = elem.style.display;\n\t\tif ( show ) {\n\n\t\t\t// Since we force visibility upon cascade-hidden elements, an immediate (and slow)\n\t\t\t// check is required in this first loop unless we have a nonempty display value (either\n\t\t\t// inline or about-to-be-restored)\n\t\t\tif ( display === \"none\" ) {\n\t\t\t\tvalues[ index ] = dataPriv.get( elem, \"display\" ) || null;\n\t\t\t\tif ( !values[ index ] ) {\n\t\t\t\t\telem.style.display = \"\";\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ( elem.style.display === \"\" && isHiddenWithinTree( elem ) ) {\n\t\t\t\tvalues[ index ] = getDefaultDisplay( elem );\n\t\t\t}\n\t\t} else {\n\t\t\tif ( display !== \"none\" ) {\n\t\t\t\tvalues[ index ] = \"none\";\n\n\t\t\t\t// Remember what we're overwriting\n\t\t\t\tdataPriv.set( elem, \"display\", display );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Set the display of the elements in a second loop to avoid constant reflow\n\tfor ( index = 0; index < length; index++ ) {\n\t\tif ( values[ index ] != null ) {\n\t\t\telements[ index ].style.display = values[ index ];\n\t\t}\n\t}\n\n\treturn elements;\n}\n\njQuery.fn.extend( {\n\tshow: function() {\n\t\treturn showHide( this, true );\n\t},\n\thide: function() {\n\t\treturn showHide( this );\n\t},\n\ttoggle: function( state ) {\n\t\tif ( typeof state === \"boolean\" ) {\n\t\t\treturn state ? this.show() : this.hide();\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tif ( isHiddenWithinTree( this ) ) {\n\t\t\t\tjQuery( this ).show();\n\t\t\t} else {\n\t\t\t\tjQuery( this ).hide();\n\t\t\t}\n\t\t} );\n\t}\n} );\nvar rcheckableType = ( /^(?:checkbox|radio)$/i );\n\nvar rtagName = ( /<([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]+)/i );\n\nvar rscriptType = ( /^$|^module$|\\/(?:java|ecma)script/i );\n\n\n\n// We have to close these tags to support XHTML (#13200)\nvar wrapMap = {\n\n\t// Support: IE <=9 only\n\toption: [ 1, \"<select multiple='multiple'>\", \"</select>\" ],\n\n\t// XHTML parsers do not magically insert elements in the\n\t// same way that tag soup parsers do. So we cannot shorten\n\t// this by omitting <tbody> or other required elements.\n\tthead: [ 1, \"<table>\", \"</table>\" ],\n\tcol: [ 2, \"<table><colgroup>\", \"</colgroup></table>\" ],\n\ttr: [ 2, \"<table><tbody>\", \"</tbody></table>\" ],\n\ttd: [ 3, \"<table><tbody><tr>\", \"</tr></tbody></table>\" ],\n\n\t_default: [ 0, \"\", \"\" ]\n};\n\n// Support: IE <=9 only\nwrapMap.optgroup = wrapMap.option;\n\nwrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;\nwrapMap.th = wrapMap.td;\n\n\nfunction getAll( context, tag ) {\n\n\t// Support: IE <=9 - 11 only\n\t// Use typeof to avoid zero-argument method invocation on host objects (#15151)\n\tvar ret;\n\n\tif ( typeof context.getElementsByTagName !== \"undefined\" ) {\n\t\tret = context.getElementsByTagName( tag || \"*\" );\n\n\t} else if ( typeof context.querySelectorAll !== \"undefined\" ) {\n\t\tret = context.querySelectorAll( tag || \"*\" );\n\n\t} else {\n\t\tret = [];\n\t}\n\n\tif ( tag === undefined || tag && nodeName( context, tag ) ) {\n\t\treturn jQuery.merge( [ context ], ret );\n\t}\n\n\treturn ret;\n}\n\n\n// Mark scripts as having already been evaluated\nfunction setGlobalEval( elems, refElements ) {\n\tvar i = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\tdataPriv.set(\n\t\t\telems[ i ],\n\t\t\t\"globalEval\",\n\t\t\t!refElements || dataPriv.get( refElements[ i ], \"globalEval\" )\n\t\t);\n\t}\n}\n\n\nvar rhtml = /<|&#?\\w+;/;\n\nfunction buildFragment( elems, context, scripts, selection, ignored ) {\n\tvar elem, tmp, tag, wrap, contains, j,\n\t\tfragment = context.createDocumentFragment(),\n\t\tnodes = [],\n\t\ti = 0,\n\t\tl = elems.length;\n\n\tfor ( ; i < l; i++ ) {\n\t\telem = elems[ i ];\n\n\t\tif ( elem || elem === 0 ) {\n\n\t\t\t// Add nodes directly\n\t\t\tif ( toType( elem ) === \"object\" ) {\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );\n\n\t\t\t// Convert non-html into a text node\n\t\t\t} else if ( !rhtml.test( elem ) ) {\n\t\t\t\tnodes.push( context.createTextNode( elem ) );\n\n\t\t\t// Convert html into DOM nodes\n\t\t\t} else {\n\t\t\t\ttmp = tmp || fragment.appendChild( context.createElement( \"div\" ) );\n\n\t\t\t\t// Deserialize a standard representation\n\t\t\t\ttag = ( rtagName.exec( elem ) || [ \"\", \"\" ] )[ 1 ].toLowerCase();\n\t\t\t\twrap = wrapMap[ tag ] || wrapMap._default;\n\t\t\t\ttmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];\n\n\t\t\t\t// Descend through wrappers to the right content\n\t\t\t\tj = wrap[ 0 ];\n\t\t\t\twhile ( j-- ) {\n\t\t\t\t\ttmp = tmp.lastChild;\n\t\t\t\t}\n\n\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\tjQuery.merge( nodes, tmp.childNodes );\n\n\t\t\t\t// Remember the top-level container\n\t\t\t\ttmp = fragment.firstChild;\n\n\t\t\t\t// Ensure the created nodes are orphaned (#12392)\n\t\t\t\ttmp.textContent = \"\";\n\t\t\t}\n\t\t}\n\t}\n\n\t// Remove wrapper from fragment\n\tfragment.textContent = \"\";\n\n\ti = 0;\n\twhile ( ( elem = nodes[ i++ ] ) ) {\n\n\t\t// Skip elements already in the context collection (trac-4087)\n\t\tif ( selection && jQuery.inArray( elem, selection ) > -1 ) {\n\t\t\tif ( ignored ) {\n\t\t\t\tignored.push( elem );\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tcontains = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Append to fragment\n\t\ttmp = getAll( fragment.appendChild( elem ), \"script\" );\n\n\t\t// Preserve script evaluation history\n\t\tif ( contains ) {\n\t\t\tsetGlobalEval( tmp );\n\t\t}\n\n\t\t// Capture executables\n\t\tif ( scripts ) {\n\t\t\tj = 0;\n\t\t\twhile ( ( elem = tmp[ j++ ] ) ) {\n\t\t\t\tif ( rscriptType.test( elem.type || \"\" ) ) {\n\t\t\t\t\tscripts.push( elem );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn fragment;\n}\n\n\n( function() {\n\tvar fragment = document.createDocumentFragment(),\n\t\tdiv = fragment.appendChild( document.createElement( \"div\" ) ),\n\t\tinput = document.createElement( \"input\" );\n\n\t// Support: Android 4.0 - 4.3 only\n\t// Check state lost if the name is set (#11217)\n\t// Support: Windows Web Apps (WWA)\n\t// `name` and `type` must use .setAttribute for WWA (#14901)\n\tinput.setAttribute( \"type\", \"radio\" );\n\tinput.setAttribute( \"checked\", \"checked\" );\n\tinput.setAttribute( \"name\", \"t\" );\n\n\tdiv.appendChild( input );\n\n\t// Support: Android <=4.1 only\n\t// Older WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;\n\n\t// Support: IE <=11 only\n\t// Make sure textarea (and checkbox) defaultValue is properly cloned\n\tdiv.innerHTML = \"<textarea>x</textarea>\";\n\tsupport.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;\n} )();\nvar documentElement = document.documentElement;\n\n\n\nvar\n\trkeyEvent = /^key/,\n\trmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,\n\trtypenamespace = /^([^.]*)(?:\\.(.+)|)/;\n\nfunction returnTrue() {\n\treturn true;\n}\n\nfunction returnFalse() {\n\treturn false;\n}\n\n// Support: IE <=9 only\n// See #13393 for more info\nfunction safeActiveElement() {\n\ttry {\n\t\treturn document.activeElement;\n\t} catch ( err ) { }\n}\n\nfunction on( elem, types, selector, data, fn, one ) {\n\tvar origFn, type;\n\n\t// Types can be a map of types/handlers\n\tif ( typeof types === \"object\" ) {\n\n\t\t// ( types-Object, selector, data )\n\t\tif ( typeof selector !== \"string\" ) {\n\n\t\t\t// ( types-Object, data )\n\t\t\tdata = data || selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tfor ( type in types ) {\n\t\t\ton( elem, type, selector, data, types[ type ], one );\n\t\t}\n\t\treturn elem;\n\t}\n\n\tif ( data == null && fn == null ) {\n\n\t\t// ( types, fn )\n\t\tfn = selector;\n\t\tdata = selector = undefined;\n\t} else if ( fn == null ) {\n\t\tif ( typeof selector === \"string\" ) {\n\n\t\t\t// ( types, selector, fn )\n\t\t\tfn = data;\n\t\t\tdata = undefined;\n\t\t} else {\n\n\t\t\t// ( types, data, fn )\n\t\t\tfn = data;\n\t\t\tdata = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t}\n\tif ( fn === false ) {\n\t\tfn = returnFalse;\n\t} else if ( !fn ) {\n\t\treturn elem;\n\t}\n\n\tif ( one === 1 ) {\n\t\torigFn = fn;\n\t\tfn = function( event ) {\n\n\t\t\t// Can use an empty set, since event contains the info\n\t\t\tjQuery().off( event );\n\t\t\treturn origFn.apply( this, arguments );\n\t\t};\n\n\t\t// Use same guid so caller can remove using origFn\n\t\tfn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );\n\t}\n\treturn elem.each( function() {\n\t\tjQuery.event.add( this, types, fn, data, selector );\n\t} );\n}\n\n/*\n * Helper functions for managing events -- not part of the public interface.\n * Props to Dean Edwards' addEvent library for many of the ideas.\n */\njQuery.event = {\n\n\tglobal: {},\n\n\tadd: function( elem, types, handler, data, selector ) {\n\n\t\tvar handleObjIn, eventHandle, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.get( elem );\n\n\t\t// Don't attach events to noData or text/comment nodes (but allow plain objects)\n\t\tif ( !elemData ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Caller can pass in an object of custom data in lieu of the handler\n\t\tif ( handler.handler ) {\n\t\t\thandleObjIn = handler;\n\t\t\thandler = handleObjIn.handler;\n\t\t\tselector = handleObjIn.selector;\n\t\t}\n\n\t\t// Ensure that invalid selectors throw exceptions at attach time\n\t\t// Evaluate against documentElement in case elem is a non-element node (e.g., document)\n\t\tif ( selector ) {\n\t\t\tjQuery.find.matchesSelector( documentElement, selector );\n\t\t}\n\n\t\t// Make sure that the handler has a unique ID, used to find/remove it later\n\t\tif ( !handler.guid ) {\n\t\t\thandler.guid = jQuery.guid++;\n\t\t}\n\n\t\t// Init the element's event structure and main handler, if this is the first\n\t\tif ( !( events = elemData.events ) ) {\n\t\t\tevents = elemData.events = {};\n\t\t}\n\t\tif ( !( eventHandle = elemData.handle ) ) {\n\t\t\teventHandle = elemData.handle = function( e ) {\n\n\t\t\t\t// Discard the second event of a jQuery.event.trigger() and\n\t\t\t\t// when an event is called after a page has unloaded\n\t\t\t\treturn typeof jQuery !== \"undefined\" && jQuery.event.triggered !== e.type ?\n\t\t\t\t\tjQuery.event.dispatch.apply( elem, arguments ) : undefined;\n\t\t\t};\n\t\t}\n\n\t\t// Handle multiple events separated by a space\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// There *must* be a type, no attaching namespace-only handlers\n\t\t\tif ( !type ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// If event changes its type, use the special event handlers for the changed type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// If selector defined, determine special event api type, otherwise given type\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\n\t\t\t// Update special based on newly reset type\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\n\t\t\t// handleObj is passed to all event handlers\n\t\t\thandleObj = jQuery.extend( {\n\t\t\t\ttype: type,\n\t\t\t\torigType: origType,\n\t\t\t\tdata: data,\n\t\t\t\thandler: handler,\n\t\t\t\tguid: handler.guid,\n\t\t\t\tselector: selector,\n\t\t\t\tneedsContext: selector && jQuery.expr.match.needsContext.test( selector ),\n\t\t\t\tnamespace: namespaces.join( \".\" )\n\t\t\t}, handleObjIn );\n\n\t\t\t// Init the event handler queue if we're the first\n\t\t\tif ( !( handlers = events[ type ] ) ) {\n\t\t\t\thandlers = events[ type ] = [];\n\t\t\t\thandlers.delegateCount = 0;\n\n\t\t\t\t// Only use addEventListener if the special events handler returns false\n\t\t\t\tif ( !special.setup ||\n\t\t\t\t\tspecial.setup.call( elem, data, namespaces, eventHandle ) === false ) {\n\n\t\t\t\t\tif ( elem.addEventListener ) {\n\t\t\t\t\t\telem.addEventListener( type, eventHandle );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( special.add ) {\n\t\t\t\tspecial.add.call( elem, handleObj );\n\n\t\t\t\tif ( !handleObj.handler.guid ) {\n\t\t\t\t\thandleObj.handler.guid = handler.guid;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Add to the element's handler list, delegates in front\n\t\t\tif ( selector ) {\n\t\t\t\thandlers.splice( handlers.delegateCount++, 0, handleObj );\n\t\t\t} else {\n\t\t\t\thandlers.push( handleObj );\n\t\t\t}\n\n\t\t\t// Keep track of which events have ever been used, for event optimization\n\t\t\tjQuery.event.global[ type ] = true;\n\t\t}\n\n\t},\n\n\t// Detach an event or set of events from an element\n\tremove: function( elem, types, handler, selector, mappedTypes ) {\n\n\t\tvar j, origCount, tmp,\n\t\t\tevents, t, handleObj,\n\t\t\tspecial, handlers, type, namespaces, origType,\n\t\t\telemData = dataPriv.hasData( elem ) && dataPriv.get( elem );\n\n\t\tif ( !elemData || !( events = elemData.events ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Once for each type.namespace in types; type may be omitted\n\t\ttypes = ( types || \"\" ).match( rnothtmlwhite ) || [ \"\" ];\n\t\tt = types.length;\n\t\twhile ( t-- ) {\n\t\t\ttmp = rtypenamespace.exec( types[ t ] ) || [];\n\t\t\ttype = origType = tmp[ 1 ];\n\t\t\tnamespaces = ( tmp[ 2 ] || \"\" ).split( \".\" ).sort();\n\n\t\t\t// Unbind all events (on this namespace, if provided) for the element\n\t\t\tif ( !type ) {\n\t\t\t\tfor ( type in events ) {\n\t\t\t\t\tjQuery.event.remove( elem, type + types[ t ], handler, selector, true );\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tspecial = jQuery.event.special[ type ] || {};\n\t\t\ttype = ( selector ? special.delegateType : special.bindType ) || type;\n\t\t\thandlers = events[ type ] || [];\n\t\t\ttmp = tmp[ 2 ] &&\n\t\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" );\n\n\t\t\t// Remove matching events\n\t\t\torigCount = j = handlers.length;\n\t\t\twhile ( j-- ) {\n\t\t\t\thandleObj = handlers[ j ];\n\n\t\t\t\tif ( ( mappedTypes || origType === handleObj.origType ) &&\n\t\t\t\t\t( !handler || handler.guid === handleObj.guid ) &&\n\t\t\t\t\t( !tmp || tmp.test( handleObj.namespace ) ) &&\n\t\t\t\t\t( !selector || selector === handleObj.selector ||\n\t\t\t\t\t\tselector === \"**\" && handleObj.selector ) ) {\n\t\t\t\t\thandlers.splice( j, 1 );\n\n\t\t\t\t\tif ( handleObj.selector ) {\n\t\t\t\t\t\thandlers.delegateCount--;\n\t\t\t\t\t}\n\t\t\t\t\tif ( special.remove ) {\n\t\t\t\t\t\tspecial.remove.call( elem, handleObj );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove generic event handler if we removed something and no more handlers exist\n\t\t\t// (avoids potential for endless recursion during removal of special event handlers)\n\t\t\tif ( origCount && !handlers.length ) {\n\t\t\t\tif ( !special.teardown ||\n\t\t\t\t\tspecial.teardown.call( elem, namespaces, elemData.handle ) === false ) {\n\n\t\t\t\t\tjQuery.removeEvent( elem, type, elemData.handle );\n\t\t\t\t}\n\n\t\t\t\tdelete events[ type ];\n\t\t\t}\n\t\t}\n\n\t\t// Remove data and the expando if it's no longer used\n\t\tif ( jQuery.isEmptyObject( events ) ) {\n\t\t\tdataPriv.remove( elem, \"handle events\" );\n\t\t}\n\t},\n\n\tdispatch: function( nativeEvent ) {\n\n\t\t// Make a writable jQuery.Event from the native event object\n\t\tvar event = jQuery.event.fix( nativeEvent );\n\n\t\tvar i, j, ret, matched, handleObj, handlerQueue,\n\t\t\targs = new Array( arguments.length ),\n\t\t\thandlers = ( dataPriv.get( this, \"events\" ) || {} )[ event.type ] || [],\n\t\t\tspecial = jQuery.event.special[ event.type ] || {};\n\n\t\t// Use the fix-ed jQuery.Event rather than the (read-only) native event\n\t\targs[ 0 ] = event;\n\n\t\tfor ( i = 1; i < arguments.length; i++ ) {\n\t\t\targs[ i ] = arguments[ i ];\n\t\t}\n\n\t\tevent.delegateTarget = this;\n\n\t\t// Call the preDispatch hook for the mapped type, and let it bail if desired\n\t\tif ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine handlers\n\t\thandlerQueue = jQuery.event.handlers.call( this, event, handlers );\n\n\t\t// Run delegates first; they may want to stop propagation beneath us\n\t\ti = 0;\n\t\twhile ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tevent.currentTarget = matched.elem;\n\n\t\t\tj = 0;\n\t\t\twhile ( ( handleObj = matched.handlers[ j++ ] ) &&\n\t\t\t\t!event.isImmediatePropagationStopped() ) {\n\n\t\t\t\t// Triggered event must either 1) have no namespace, or 2) have namespace(s)\n\t\t\t\t// a subset or equal to those in the bound event (both can have no namespace).\n\t\t\t\tif ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {\n\n\t\t\t\t\tevent.handleObj = handleObj;\n\t\t\t\t\tevent.data = handleObj.data;\n\n\t\t\t\t\tret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||\n\t\t\t\t\t\thandleObj.handler ).apply( matched.elem, args );\n\n\t\t\t\t\tif ( ret !== undefined ) {\n\t\t\t\t\t\tif ( ( event.result = ret ) === false ) {\n\t\t\t\t\t\t\tevent.preventDefault();\n\t\t\t\t\t\t\tevent.stopPropagation();\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Call the postDispatch hook for the mapped type\n\t\tif ( special.postDispatch ) {\n\t\t\tspecial.postDispatch.call( this, event );\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\thandlers: function( event, handlers ) {\n\t\tvar i, handleObj, sel, matchedHandlers, matchedSelectors,\n\t\t\thandlerQueue = [],\n\t\t\tdelegateCount = handlers.delegateCount,\n\t\t\tcur = event.target;\n\n\t\t// Find delegate handlers\n\t\tif ( delegateCount &&\n\n\t\t\t// Support: IE <=9\n\t\t\t// Black-hole SVG <use> instance trees (trac-13180)\n\t\t\tcur.nodeType &&\n\n\t\t\t// Support: Firefox <=42\n\t\t\t// Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)\n\t\t\t// https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click\n\t\t\t// Support: IE 11 only\n\t\t\t// ...but not arrow key \"clicks\" of radio inputs, which can have `button` -1 (gh-2343)\n\t\t\t!( event.type === \"click\" && event.button >= 1 ) ) {\n\n\t\t\tfor ( ; cur !== this; cur = cur.parentNode || this ) {\n\n\t\t\t\t// Don't check non-elements (#13208)\n\t\t\t\t// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)\n\t\t\t\tif ( cur.nodeType === 1 && !( event.type === \"click\" && cur.disabled === true ) ) {\n\t\t\t\t\tmatchedHandlers = [];\n\t\t\t\t\tmatchedSelectors = {};\n\t\t\t\t\tfor ( i = 0; i < delegateCount; i++ ) {\n\t\t\t\t\t\thandleObj = handlers[ i ];\n\n\t\t\t\t\t\t// Don't conflict with Object.prototype properties (#13203)\n\t\t\t\t\t\tsel = handleObj.selector + \" \";\n\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] === undefined ) {\n\t\t\t\t\t\t\tmatchedSelectors[ sel ] = handleObj.needsContext ?\n\t\t\t\t\t\t\t\tjQuery( sel, this ).index( cur ) > -1 :\n\t\t\t\t\t\t\t\tjQuery.find( sel, this, null, [ cur ] ).length;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( matchedSelectors[ sel ] ) {\n\t\t\t\t\t\t\tmatchedHandlers.push( handleObj );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif ( matchedHandlers.length ) {\n\t\t\t\t\t\thandlerQueue.push( { elem: cur, handlers: matchedHandlers } );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// Add the remaining (directly-bound) handlers\n\t\tcur = this;\n\t\tif ( delegateCount < handlers.length ) {\n\t\t\thandlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } );\n\t\t}\n\n\t\treturn handlerQueue;\n\t},\n\n\taddProp: function( name, hook ) {\n\t\tObject.defineProperty( jQuery.Event.prototype, name, {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: true,\n\n\t\t\tget: isFunction( hook ) ?\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn hook( this.originalEvent );\n\t\t\t\t\t}\n\t\t\t\t} :\n\t\t\t\tfunction() {\n\t\t\t\t\tif ( this.originalEvent ) {\n\t\t\t\t\t\t\treturn this.originalEvent[ name ];\n\t\t\t\t\t}\n\t\t\t\t},\n\n\t\t\tset: function( value ) {\n\t\t\t\tObject.defineProperty( this, name, {\n\t\t\t\t\tenumerable: true,\n\t\t\t\t\tconfigurable: true,\n\t\t\t\t\twritable: true,\n\t\t\t\t\tvalue: value\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t},\n\n\tfix: function( originalEvent ) {\n\t\treturn originalEvent[ jQuery.expando ] ?\n\t\t\toriginalEvent :\n\t\t\tnew jQuery.Event( originalEvent );\n\t},\n\n\tspecial: {\n\t\tload: {\n\n\t\t\t// Prevent triggered image.load events from bubbling to window.load\n\t\t\tnoBubble: true\n\t\t},\n\t\tfocus: {\n\n\t\t\t// Fire native event if possible so blur/focus sequence is correct\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this !== safeActiveElement() && this.focus ) {\n\t\t\t\t\tthis.focus();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusin\"\n\t\t},\n\t\tblur: {\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this === safeActiveElement() && this.blur ) {\n\t\t\t\t\tthis.blur();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\t\t\tdelegateType: \"focusout\"\n\t\t},\n\t\tclick: {\n\n\t\t\t// For checkbox, fire native event so checked state will be right\n\t\t\ttrigger: function() {\n\t\t\t\tif ( this.type === \"checkbox\" && this.click && nodeName( this, \"input\" ) ) {\n\t\t\t\t\tthis.click();\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t// For cross-browser consistency, don't fire native .click() on links\n\t\t\t_default: function( event ) {\n\t\t\t\treturn nodeName( event.target, \"a\" );\n\t\t\t}\n\t\t},\n\n\t\tbeforeunload: {\n\t\t\tpostDispatch: function( event ) {\n\n\t\t\t\t// Support: Firefox 20+\n\t\t\t\t// Firefox doesn't alert if the returnValue field is not set.\n\t\t\t\tif ( event.result !== undefined && event.originalEvent ) {\n\t\t\t\t\tevent.originalEvent.returnValue = event.result;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n};\n\njQuery.removeEvent = function( elem, type, handle ) {\n\n\t// This \"if\" is needed for plain objects\n\tif ( elem.removeEventListener ) {\n\t\telem.removeEventListener( type, handle );\n\t}\n};\n\njQuery.Event = function( src, props ) {\n\n\t// Allow instantiation without the 'new' keyword\n\tif ( !( this instanceof jQuery.Event ) ) {\n\t\treturn new jQuery.Event( src, props );\n\t}\n\n\t// Event object\n\tif ( src && src.type ) {\n\t\tthis.originalEvent = src;\n\t\tthis.type = src.type;\n\n\t\t// Events bubbling up the document may have been marked as prevented\n\t\t// by a handler lower down the tree; reflect the correct value.\n\t\tthis.isDefaultPrevented = src.defaultPrevented ||\n\t\t\t\tsrc.defaultPrevented === undefined &&\n\n\t\t\t\t// Support: Android <=2.3 only\n\t\t\t\tsrc.returnValue === false ?\n\t\t\treturnTrue :\n\t\t\treturnFalse;\n\n\t\t// Create target properties\n\t\t// Support: Safari <=6 - 7 only\n\t\t// Target should not be a text node (#504, #13143)\n\t\tthis.target = ( src.target && src.target.nodeType === 3 ) ?\n\t\t\tsrc.target.parentNode :\n\t\t\tsrc.target;\n\n\t\tthis.currentTarget = src.currentTarget;\n\t\tthis.relatedTarget = src.relatedTarget;\n\n\t// Event type\n\t} else {\n\t\tthis.type = src;\n\t}\n\n\t// Put explicitly provided properties onto the event object\n\tif ( props ) {\n\t\tjQuery.extend( this, props );\n\t}\n\n\t// Create a timestamp if incoming event doesn't have one\n\tthis.timeStamp = src && src.timeStamp || Date.now();\n\n\t// Mark it as fixed\n\tthis[ jQuery.expando ] = true;\n};\n\n// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding\n// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html\njQuery.Event.prototype = {\n\tconstructor: jQuery.Event,\n\tisDefaultPrevented: returnFalse,\n\tisPropagationStopped: returnFalse,\n\tisImmediatePropagationStopped: returnFalse,\n\tisSimulated: false,\n\n\tpreventDefault: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isDefaultPrevented = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.preventDefault();\n\t\t}\n\t},\n\tstopPropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isPropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopPropagation();\n\t\t}\n\t},\n\tstopImmediatePropagation: function() {\n\t\tvar e = this.originalEvent;\n\n\t\tthis.isImmediatePropagationStopped = returnTrue;\n\n\t\tif ( e && !this.isSimulated ) {\n\t\t\te.stopImmediatePropagation();\n\t\t}\n\n\t\tthis.stopPropagation();\n\t}\n};\n\n// Includes all common event props including KeyEvent and MouseEvent specific props\njQuery.each( {\n\taltKey: true,\n\tbubbles: true,\n\tcancelable: true,\n\tchangedTouches: true,\n\tctrlKey: true,\n\tdetail: true,\n\teventPhase: true,\n\tmetaKey: true,\n\tpageX: true,\n\tpageY: true,\n\tshiftKey: true,\n\tview: true,\n\t\"char\": true,\n\tcharCode: true,\n\tkey: true,\n\tkeyCode: true,\n\tbutton: true,\n\tbuttons: true,\n\tclientX: true,\n\tclientY: true,\n\toffsetX: true,\n\toffsetY: true,\n\tpointerId: true,\n\tpointerType: true,\n\tscreenX: true,\n\tscreenY: true,\n\ttargetTouches: true,\n\ttoElement: true,\n\ttouches: true,\n\n\twhich: function( event ) {\n\t\tvar button = event.button;\n\n\t\t// Add which for key events\n\t\tif ( event.which == null && rkeyEvent.test( event.type ) ) {\n\t\t\treturn event.charCode != null ? event.charCode : event.keyCode;\n\t\t}\n\n\t\t// Add which for click: 1 === left; 2 === middle; 3 === right\n\t\tif ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {\n\t\t\tif ( button & 1 ) {\n\t\t\t\treturn 1;\n\t\t\t}\n\n\t\t\tif ( button & 2 ) {\n\t\t\t\treturn 3;\n\t\t\t}\n\n\t\t\tif ( button & 4 ) {\n\t\t\t\treturn 2;\n\t\t\t}\n\n\t\t\treturn 0;\n\t\t}\n\n\t\treturn event.which;\n\t}\n}, jQuery.event.addProp );\n\n// Create mouseenter/leave events using mouseover/out and event-time checks\n// so that event delegation works in jQuery.\n// Do the same for pointerenter/pointerleave and pointerover/pointerout\n//\n// Support: Safari 7 only\n// Safari sends mouseenter too often; see:\n// https://bugs.chromium.org/p/chromium/issues/detail?id=470258\n// for the description of the bug (it existed in older Chrome versions as well).\njQuery.each( {\n\tmouseenter: \"mouseover\",\n\tmouseleave: \"mouseout\",\n\tpointerenter: \"pointerover\",\n\tpointerleave: \"pointerout\"\n}, function( orig, fix ) {\n\tjQuery.event.special[ orig ] = {\n\t\tdelegateType: fix,\n\t\tbindType: fix,\n\n\t\thandle: function( event ) {\n\t\t\tvar ret,\n\t\t\t\ttarget = this,\n\t\t\t\trelated = event.relatedTarget,\n\t\t\t\thandleObj = event.handleObj;\n\n\t\t\t// For mouseenter/leave call the handler if related is outside the target.\n\t\t\t// NB: No relatedTarget if the mouse left/entered the browser window\n\t\t\tif ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {\n\t\t\t\tevent.type = handleObj.origType;\n\t\t\t\tret = handleObj.handler.apply( this, arguments );\n\t\t\t\tevent.type = fix;\n\t\t\t}\n\t\t\treturn ret;\n\t\t}\n\t};\n} );\n\njQuery.fn.extend( {\n\n\ton: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn );\n\t},\n\tone: function( types, selector, data, fn ) {\n\t\treturn on( this, types, selector, data, fn, 1 );\n\t},\n\toff: function( types, selector, fn ) {\n\t\tvar handleObj, type;\n\t\tif ( types && types.preventDefault && types.handleObj ) {\n\n\t\t\t// ( event )  dispatched jQuery.Event\n\t\t\thandleObj = types.handleObj;\n\t\t\tjQuery( types.delegateTarget ).off(\n\t\t\t\thandleObj.namespace ?\n\t\t\t\t\thandleObj.origType + \".\" + handleObj.namespace :\n\t\t\t\t\thandleObj.origType,\n\t\t\t\thandleObj.selector,\n\t\t\t\thandleObj.handler\n\t\t\t);\n\t\t\treturn this;\n\t\t}\n\t\tif ( typeof types === \"object\" ) {\n\n\t\t\t// ( types-object [, selector] )\n\t\t\tfor ( type in types ) {\n\t\t\t\tthis.off( type, selector, types[ type ] );\n\t\t\t}\n\t\t\treturn this;\n\t\t}\n\t\tif ( selector === false || typeof selector === \"function\" ) {\n\n\t\t\t// ( types [, fn] )\n\t\t\tfn = selector;\n\t\t\tselector = undefined;\n\t\t}\n\t\tif ( fn === false ) {\n\t\t\tfn = returnFalse;\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.remove( this, types, fn, selector );\n\t\t} );\n\t}\n} );\n\n\nvar\n\n\t/* eslint-disable max-len */\n\n\t// See https://github.com/eslint/eslint/issues/3229\n\trxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\\/\\0>\\x20\\t\\r\\n\\f]*)[^>]*)\\/>/gi,\n\n\t/* eslint-enable */\n\n\t// Support: IE <=10 - 11, Edge 12 - 13 only\n\t// In IE/Edge using regex groups here causes severe slowdowns.\n\t// See https://connect.microsoft.com/IE/feedback/details/1736512/\n\trnoInnerhtml = /<script|<style|<link/i,\n\n\t// checked=\"checked\" or checked\n\trchecked = /checked\\s*(?:[^=]|=\\s*.checked.)/i,\n\trcleanScript = /^\\s*<!(?:\\[CDATA\\[|--)|(?:\\]\\]|--)>\\s*$/g;\n\n// Prefer a tbody over its parent table for containing new rows\nfunction manipulationTarget( elem, content ) {\n\tif ( nodeName( elem, \"table\" ) &&\n\t\tnodeName( content.nodeType !== 11 ? content : content.firstChild, \"tr\" ) ) {\n\n\t\treturn jQuery( elem ).children( \"tbody\" )[ 0 ] || elem;\n\t}\n\n\treturn elem;\n}\n\n// Replace/restore the type attribute of script elements for safe DOM manipulation\nfunction disableScript( elem ) {\n\telem.type = ( elem.getAttribute( \"type\" ) !== null ) + \"/\" + elem.type;\n\treturn elem;\n}\nfunction restoreScript( elem ) {\n\tif ( ( elem.type || \"\" ).slice( 0, 5 ) === \"true/\" ) {\n\t\telem.type = elem.type.slice( 5 );\n\t} else {\n\t\telem.removeAttribute( \"type\" );\n\t}\n\n\treturn elem;\n}\n\nfunction cloneCopyEvent( src, dest ) {\n\tvar i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;\n\n\tif ( dest.nodeType !== 1 ) {\n\t\treturn;\n\t}\n\n\t// 1. Copy private data: events, handlers, etc.\n\tif ( dataPriv.hasData( src ) ) {\n\t\tpdataOld = dataPriv.access( src );\n\t\tpdataCur = dataPriv.set( dest, pdataOld );\n\t\tevents = pdataOld.events;\n\n\t\tif ( events ) {\n\t\t\tdelete pdataCur.handle;\n\t\t\tpdataCur.events = {};\n\n\t\t\tfor ( type in events ) {\n\t\t\t\tfor ( i = 0, l = events[ type ].length; i < l; i++ ) {\n\t\t\t\t\tjQuery.event.add( dest, type, events[ type ][ i ] );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t// 2. Copy user data\n\tif ( dataUser.hasData( src ) ) {\n\t\tudataOld = dataUser.access( src );\n\t\tudataCur = jQuery.extend( {}, udataOld );\n\n\t\tdataUser.set( dest, udataCur );\n\t}\n}\n\n// Fix IE bugs, see support tests\nfunction fixInput( src, dest ) {\n\tvar nodeName = dest.nodeName.toLowerCase();\n\n\t// Fails to persist the checked state of a cloned checkbox or radio button.\n\tif ( nodeName === \"input\" && rcheckableType.test( src.type ) ) {\n\t\tdest.checked = src.checked;\n\n\t// Fails to return the selected option to the default selected state when cloning options\n\t} else if ( nodeName === \"input\" || nodeName === \"textarea\" ) {\n\t\tdest.defaultValue = src.defaultValue;\n\t}\n}\n\nfunction domManip( collection, args, callback, ignored ) {\n\n\t// Flatten any nested arrays\n\targs = concat.apply( [], args );\n\n\tvar fragment, first, scripts, hasScripts, node, doc,\n\t\ti = 0,\n\t\tl = collection.length,\n\t\tiNoClone = l - 1,\n\t\tvalue = args[ 0 ],\n\t\tvalueIsFunction = isFunction( value );\n\n\t// We can't cloneNode fragments that contain checked, in WebKit\n\tif ( valueIsFunction ||\n\t\t\t( l > 1 && typeof value === \"string\" &&\n\t\t\t\t!support.checkClone && rchecked.test( value ) ) ) {\n\t\treturn collection.each( function( index ) {\n\t\t\tvar self = collection.eq( index );\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\targs[ 0 ] = value.call( this, index, self.html() );\n\t\t\t}\n\t\t\tdomManip( self, args, callback, ignored );\n\t\t} );\n\t}\n\n\tif ( l ) {\n\t\tfragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );\n\t\tfirst = fragment.firstChild;\n\n\t\tif ( fragment.childNodes.length === 1 ) {\n\t\t\tfragment = first;\n\t\t}\n\n\t\t// Require either new content or an interest in ignored elements to invoke the callback\n\t\tif ( first || ignored ) {\n\t\t\tscripts = jQuery.map( getAll( fragment, \"script\" ), disableScript );\n\t\t\thasScripts = scripts.length;\n\n\t\t\t// Use the original fragment for the last item\n\t\t\t// instead of the first because it can end up\n\t\t\t// being emptied incorrectly in certain situations (#8070).\n\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\tnode = fragment;\n\n\t\t\t\tif ( i !== iNoClone ) {\n\t\t\t\t\tnode = jQuery.clone( node, true, true );\n\n\t\t\t\t\t// Keep references to cloned scripts for later restoration\n\t\t\t\t\tif ( hasScripts ) {\n\n\t\t\t\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t\t\t\t// push.apply(_, arraylike) throws on ancient WebKit\n\t\t\t\t\t\tjQuery.merge( scripts, getAll( node, \"script\" ) );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcallback.call( collection[ i ], node, i );\n\t\t\t}\n\n\t\t\tif ( hasScripts ) {\n\t\t\t\tdoc = scripts[ scripts.length - 1 ].ownerDocument;\n\n\t\t\t\t// Reenable scripts\n\t\t\t\tjQuery.map( scripts, restoreScript );\n\n\t\t\t\t// Evaluate executable scripts on first document insertion\n\t\t\t\tfor ( i = 0; i < hasScripts; i++ ) {\n\t\t\t\t\tnode = scripts[ i ];\n\t\t\t\t\tif ( rscriptType.test( node.type || \"\" ) &&\n\t\t\t\t\t\t!dataPriv.access( node, \"globalEval\" ) &&\n\t\t\t\t\t\tjQuery.contains( doc, node ) ) {\n\n\t\t\t\t\t\tif ( node.src && ( node.type || \"\" ).toLowerCase()  !== \"module\" ) {\n\n\t\t\t\t\t\t\t// Optional AJAX dependency, but won't run scripts if not present\n\t\t\t\t\t\t\tif ( jQuery._evalUrl ) {\n\t\t\t\t\t\t\t\tjQuery._evalUrl( node.src );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tDOMEval( node.textContent.replace( rcleanScript, \"\" ), doc, node );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn collection;\n}\n\nfunction remove( elem, selector, keepData ) {\n\tvar node,\n\t\tnodes = selector ? jQuery.filter( selector, elem ) : elem,\n\t\ti = 0;\n\n\tfor ( ; ( node = nodes[ i ] ) != null; i++ ) {\n\t\tif ( !keepData && node.nodeType === 1 ) {\n\t\t\tjQuery.cleanData( getAll( node ) );\n\t\t}\n\n\t\tif ( node.parentNode ) {\n\t\t\tif ( keepData && jQuery.contains( node.ownerDocument, node ) ) {\n\t\t\t\tsetGlobalEval( getAll( node, \"script\" ) );\n\t\t\t}\n\t\t\tnode.parentNode.removeChild( node );\n\t\t}\n\t}\n\n\treturn elem;\n}\n\njQuery.extend( {\n\thtmlPrefilter: function( html ) {\n\t\treturn html.replace( rxhtmlTag, \"<$1></$2>\" );\n\t},\n\n\tclone: function( elem, dataAndEvents, deepDataAndEvents ) {\n\t\tvar i, l, srcElements, destElements,\n\t\t\tclone = elem.cloneNode( true ),\n\t\t\tinPage = jQuery.contains( elem.ownerDocument, elem );\n\n\t\t// Fix IE cloning issues\n\t\tif ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&\n\t\t\t\t!jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2\n\t\t\tdestElements = getAll( clone );\n\t\t\tsrcElements = getAll( elem );\n\n\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\tfixInput( srcElements[ i ], destElements[ i ] );\n\t\t\t}\n\t\t}\n\n\t\t// Copy the events from the original to the clone\n\t\tif ( dataAndEvents ) {\n\t\t\tif ( deepDataAndEvents ) {\n\t\t\t\tsrcElements = srcElements || getAll( elem );\n\t\t\t\tdestElements = destElements || getAll( clone );\n\n\t\t\t\tfor ( i = 0, l = srcElements.length; i < l; i++ ) {\n\t\t\t\t\tcloneCopyEvent( srcElements[ i ], destElements[ i ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcloneCopyEvent( elem, clone );\n\t\t\t}\n\t\t}\n\n\t\t// Preserve script evaluation history\n\t\tdestElements = getAll( clone, \"script\" );\n\t\tif ( destElements.length > 0 ) {\n\t\t\tsetGlobalEval( destElements, !inPage && getAll( elem, \"script\" ) );\n\t\t}\n\n\t\t// Return the cloned set\n\t\treturn clone;\n\t},\n\n\tcleanData: function( elems ) {\n\t\tvar data, elem, type,\n\t\t\tspecial = jQuery.event.special,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {\n\t\t\tif ( acceptData( elem ) ) {\n\t\t\t\tif ( ( data = elem[ dataPriv.expando ] ) ) {\n\t\t\t\t\tif ( data.events ) {\n\t\t\t\t\t\tfor ( type in data.events ) {\n\t\t\t\t\t\t\tif ( special[ type ] ) {\n\t\t\t\t\t\t\t\tjQuery.event.remove( elem, type );\n\n\t\t\t\t\t\t\t// This is a shortcut to avoid jQuery.event.remove's overhead\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tjQuery.removeEvent( elem, type, data.handle );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataPriv.expando ] = undefined;\n\t\t\t\t}\n\t\t\t\tif ( elem[ dataUser.expando ] ) {\n\n\t\t\t\t\t// Support: Chrome <=35 - 45+\n\t\t\t\t\t// Assign undefined instead of using delete, see Data#remove\n\t\t\t\t\telem[ dataUser.expando ] = undefined;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n} );\n\njQuery.fn.extend( {\n\tdetach: function( selector ) {\n\t\treturn remove( this, selector, true );\n\t},\n\n\tremove: function( selector ) {\n\t\treturn remove( this, selector );\n\t},\n\n\ttext: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\treturn value === undefined ?\n\t\t\t\tjQuery.text( this ) :\n\t\t\t\tthis.empty().each( function() {\n\t\t\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\t\t\tthis.textContent = value;\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t}, null, value, arguments.length );\n\t},\n\n\tappend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.appendChild( elem );\n\t\t\t}\n\t\t} );\n\t},\n\n\tprepend: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {\n\t\t\t\tvar target = manipulationTarget( this, elem );\n\t\t\t\ttarget.insertBefore( elem, target.firstChild );\n\t\t\t}\n\t\t} );\n\t},\n\n\tbefore: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this );\n\t\t\t}\n\t\t} );\n\t},\n\n\tafter: function() {\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tif ( this.parentNode ) {\n\t\t\t\tthis.parentNode.insertBefore( elem, this.nextSibling );\n\t\t\t}\n\t\t} );\n\t},\n\n\tempty: function() {\n\t\tvar elem,\n\t\t\ti = 0;\n\n\t\tfor ( ; ( elem = this[ i ] ) != null; i++ ) {\n\t\t\tif ( elem.nodeType === 1 ) {\n\n\t\t\t\t// Prevent memory leaks\n\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\n\t\t\t\t// Remove any remaining nodes\n\t\t\t\telem.textContent = \"\";\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tclone: function( dataAndEvents, deepDataAndEvents ) {\n\t\tdataAndEvents = dataAndEvents == null ? false : dataAndEvents;\n\t\tdeepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;\n\n\t\treturn this.map( function() {\n\t\t\treturn jQuery.clone( this, dataAndEvents, deepDataAndEvents );\n\t\t} );\n\t},\n\n\thtml: function( value ) {\n\t\treturn access( this, function( value ) {\n\t\t\tvar elem = this[ 0 ] || {},\n\t\t\t\ti = 0,\n\t\t\t\tl = this.length;\n\n\t\t\tif ( value === undefined && elem.nodeType === 1 ) {\n\t\t\t\treturn elem.innerHTML;\n\t\t\t}\n\n\t\t\t// See if we can take a shortcut and just use innerHTML\n\t\t\tif ( typeof value === \"string\" && !rnoInnerhtml.test( value ) &&\n\t\t\t\t!wrapMap[ ( rtagName.exec( value ) || [ \"\", \"\" ] )[ 1 ].toLowerCase() ] ) {\n\n\t\t\t\tvalue = jQuery.htmlPrefilter( value );\n\n\t\t\t\ttry {\n\t\t\t\t\tfor ( ; i < l; i++ ) {\n\t\t\t\t\t\telem = this[ i ] || {};\n\n\t\t\t\t\t\t// Remove element nodes and prevent memory leaks\n\t\t\t\t\t\tif ( elem.nodeType === 1 ) {\n\t\t\t\t\t\t\tjQuery.cleanData( getAll( elem, false ) );\n\t\t\t\t\t\t\telem.innerHTML = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\telem = 0;\n\n\t\t\t\t// If using innerHTML throws an exception, use the fallback method\n\t\t\t\t} catch ( e ) {}\n\t\t\t}\n\n\t\t\tif ( elem ) {\n\t\t\t\tthis.empty().append( value );\n\t\t\t}\n\t\t}, null, value, arguments.length );\n\t},\n\n\treplaceWith: function() {\n\t\tvar ignored = [];\n\n\t\t// Make the changes, replacing each non-ignored context element with the new content\n\t\treturn domManip( this, arguments, function( elem ) {\n\t\t\tvar parent = this.parentNode;\n\n\t\t\tif ( jQuery.inArray( this, ignored ) < 0 ) {\n\t\t\t\tjQuery.cleanData( getAll( this ) );\n\t\t\t\tif ( parent ) {\n\t\t\t\t\tparent.replaceChild( elem, this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t// Force callback invocation\n\t\t}, ignored );\n\t}\n} );\n\njQuery.each( {\n\tappendTo: \"append\",\n\tprependTo: \"prepend\",\n\tinsertBefore: \"before\",\n\tinsertAfter: \"after\",\n\treplaceAll: \"replaceWith\"\n}, function( name, original ) {\n\tjQuery.fn[ name ] = function( selector ) {\n\t\tvar elems,\n\t\t\tret = [],\n\t\t\tinsert = jQuery( selector ),\n\t\t\tlast = insert.length - 1,\n\t\t\ti = 0;\n\n\t\tfor ( ; i <= last; i++ ) {\n\t\t\telems = i === last ? this : this.clone( true );\n\t\t\tjQuery( insert[ i ] )[ original ]( elems );\n\n\t\t\t// Support: Android <=4.0 only, PhantomJS 1 only\n\t\t\t// .get() because push.apply(_, arraylike) throws on ancient WebKit\n\t\t\tpush.apply( ret, elems.get() );\n\t\t}\n\n\t\treturn this.pushStack( ret );\n\t};\n} );\nvar rnumnonpx = new RegExp( \"^(\" + pnum + \")(?!px)[a-z%]+$\", \"i\" );\n\nvar getStyles = function( elem ) {\n\n\t\t// Support: IE <=11 only, Firefox <=30 (#15098, #14150)\n\t\t// IE throws on elements created in popups\n\t\t// FF meanwhile throws on frame elements through \"defaultView.getComputedStyle\"\n\t\tvar view = elem.ownerDocument.defaultView;\n\n\t\tif ( !view || !view.opener ) {\n\t\t\tview = window;\n\t\t}\n\n\t\treturn view.getComputedStyle( elem );\n\t};\n\nvar rboxStyle = new RegExp( cssExpand.join( \"|\" ), \"i\" );\n\n\n\n( function() {\n\n\t// Executing both pixelPosition & boxSizingReliable tests require only one layout\n\t// so they're executed at the same time to save the second computation.\n\tfunction computeStyleTests() {\n\n\t\t// This is a singleton, we need to execute it only once\n\t\tif ( !div ) {\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer.style.cssText = \"position:absolute;left:-11111px;width:60px;\" +\n\t\t\t\"margin-top:1px;padding:0;border:0\";\n\t\tdiv.style.cssText =\n\t\t\t\"position:relative;display:block;box-sizing:border-box;overflow:scroll;\" +\n\t\t\t\"margin:auto;border:1px;padding:1px;\" +\n\t\t\t\"width:60%;top:1%\";\n\t\tdocumentElement.appendChild( container ).appendChild( div );\n\n\t\tvar divStyle = window.getComputedStyle( div );\n\t\tpixelPositionVal = divStyle.top !== \"1%\";\n\n\t\t// Support: Android 4.0 - 4.3 only, Firefox <=3 - 44\n\t\treliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12;\n\n\t\t// Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3\n\t\t// Some styles come back with percentage values, even though they shouldn't\n\t\tdiv.style.right = \"60%\";\n\t\tpixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36;\n\n\t\t// Support: IE 9 - 11 only\n\t\t// Detect misreporting of content dimensions for box-sizing:border-box elements\n\t\tboxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36;\n\n\t\t// Support: IE 9 only\n\t\t// Detect overflow:scroll screwiness (gh-3699)\n\t\tdiv.style.position = \"absolute\";\n\t\tscrollboxSizeVal = div.offsetWidth === 36 || \"absolute\";\n\n\t\tdocumentElement.removeChild( container );\n\n\t\t// Nullify the div so it wouldn't be stored in the memory and\n\t\t// it will also be a sign that checks already performed\n\t\tdiv = null;\n\t}\n\n\tfunction roundPixelMeasures( measure ) {\n\t\treturn Math.round( parseFloat( measure ) );\n\t}\n\n\tvar pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,\n\t\treliableMarginLeftVal,\n\t\tcontainer = document.createElement( \"div\" ),\n\t\tdiv = document.createElement( \"div\" );\n\n\t// Finish early in limited (non-browser) environments\n\tif ( !div.style ) {\n\t\treturn;\n\t}\n\n\t// Support: IE <=9 - 11 only\n\t// Style of cloned element affects source element cloned (#8908)\n\tdiv.style.backgroundClip = \"content-box\";\n\tdiv.cloneNode( true ).style.backgroundClip = \"\";\n\tsupport.clearCloneStyle = div.style.backgroundClip === \"content-box\";\n\n\tjQuery.extend( support, {\n\t\tboxSizingReliable: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn boxSizingReliableVal;\n\t\t},\n\t\tpixelBoxStyles: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelBoxStylesVal;\n\t\t},\n\t\tpixelPosition: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn pixelPositionVal;\n\t\t},\n\t\treliableMarginLeft: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn reliableMarginLeftVal;\n\t\t},\n\t\tscrollboxSize: function() {\n\t\t\tcomputeStyleTests();\n\t\t\treturn scrollboxSizeVal;\n\t\t}\n\t} );\n} )();\n\n\nfunction curCSS( elem, name, computed ) {\n\tvar width, minWidth, maxWidth, ret,\n\n\t\t// Support: Firefox 51+\n\t\t// Retrieving style before computed somehow\n\t\t// fixes an issue with getting wrong values\n\t\t// on detached elements\n\t\tstyle = elem.style;\n\n\tcomputed = computed || getStyles( elem );\n\n\t// getPropertyValue is needed for:\n\t//   .css('filter') (IE 9 only, #12537)\n\t//   .css('--customProperty) (#3144)\n\tif ( computed ) {\n\t\tret = computed.getPropertyValue( name ) || computed[ name ];\n\n\t\tif ( ret === \"\" && !jQuery.contains( elem.ownerDocument, elem ) ) {\n\t\t\tret = jQuery.style( elem, name );\n\t\t}\n\n\t\t// A tribute to the \"awesome hack by Dean Edwards\"\n\t\t// Android Browser returns percentage for some values,\n\t\t// but width seems to be reliably pixels.\n\t\t// This is against the CSSOM draft spec:\n\t\t// https://drafts.csswg.org/cssom/#resolved-values\n\t\tif ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) {\n\n\t\t\t// Remember the original values\n\t\t\twidth = style.width;\n\t\t\tminWidth = style.minWidth;\n\t\t\tmaxWidth = style.maxWidth;\n\n\t\t\t// Put in the new values to get a computed value out\n\t\t\tstyle.minWidth = style.maxWidth = style.width = ret;\n\t\t\tret = computed.width;\n\n\t\t\t// Revert the changed values\n\t\t\tstyle.width = width;\n\t\t\tstyle.minWidth = minWidth;\n\t\t\tstyle.maxWidth = maxWidth;\n\t\t}\n\t}\n\n\treturn ret !== undefined ?\n\n\t\t// Support: IE <=9 - 11 only\n\t\t// IE returns zIndex value as an integer.\n\t\tret + \"\" :\n\t\tret;\n}\n\n\nfunction addGetHookIf( conditionFn, hookFn ) {\n\n\t// Define the hook, we'll check on the first run if it's really needed.\n\treturn {\n\t\tget: function() {\n\t\t\tif ( conditionFn() ) {\n\n\t\t\t\t// Hook not needed (or it's not possible to use it due\n\t\t\t\t// to missing dependency), remove it.\n\t\t\t\tdelete this.get;\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Hook needed; redefine it so that the support test is not executed again.\n\t\t\treturn ( this.get = hookFn ).apply( this, arguments );\n\t\t}\n\t};\n}\n\n\nvar\n\n\t// Swappable if display is none or starts with table\n\t// except \"table\", \"table-cell\", or \"table-caption\"\n\t// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display\n\trdisplayswap = /^(none|table(?!-c[ea]).+)/,\n\trcustomProp = /^--/,\n\tcssShow = { position: \"absolute\", visibility: \"hidden\", display: \"block\" },\n\tcssNormalTransform = {\n\t\tletterSpacing: \"0\",\n\t\tfontWeight: \"400\"\n\t},\n\n\tcssPrefixes = [ \"Webkit\", \"Moz\", \"ms\" ],\n\temptyStyle = document.createElement( \"div\" ).style;\n\n// Return a css property mapped to a potentially vendor prefixed property\nfunction vendorPropName( name ) {\n\n\t// Shortcut for names that are not vendor prefixed\n\tif ( name in emptyStyle ) {\n\t\treturn name;\n\t}\n\n\t// Check for vendor prefixed names\n\tvar capName = name[ 0 ].toUpperCase() + name.slice( 1 ),\n\t\ti = cssPrefixes.length;\n\n\twhile ( i-- ) {\n\t\tname = cssPrefixes[ i ] + capName;\n\t\tif ( name in emptyStyle ) {\n\t\t\treturn name;\n\t\t}\n\t}\n}\n\n// Return a property mapped along what jQuery.cssProps suggests or to\n// a vendor prefixed property.\nfunction finalPropName( name ) {\n\tvar ret = jQuery.cssProps[ name ];\n\tif ( !ret ) {\n\t\tret = jQuery.cssProps[ name ] = vendorPropName( name ) || name;\n\t}\n\treturn ret;\n}\n\nfunction setPositiveNumber( elem, value, subtract ) {\n\n\t// Any relative (+/-) values have already been\n\t// normalized at this point\n\tvar matches = rcssNum.exec( value );\n\treturn matches ?\n\n\t\t// Guard against undefined \"subtract\", e.g., when used as in cssHooks\n\t\tMath.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || \"px\" ) :\n\t\tvalue;\n}\n\nfunction boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) {\n\tvar i = dimension === \"width\" ? 1 : 0,\n\t\textra = 0,\n\t\tdelta = 0;\n\n\t// Adjustment may not be necessary\n\tif ( box === ( isBorderBox ? \"border\" : \"content\" ) ) {\n\t\treturn 0;\n\t}\n\n\tfor ( ; i < 4; i += 2 ) {\n\n\t\t// Both box models exclude margin\n\t\tif ( box === \"margin\" ) {\n\t\t\tdelta += jQuery.css( elem, box + cssExpand[ i ], true, styles );\n\t\t}\n\n\t\t// If we get here with a content-box, we're seeking \"padding\" or \"border\" or \"margin\"\n\t\tif ( !isBorderBox ) {\n\n\t\t\t// Add padding\n\t\t\tdelta += jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\n\t\t\t// For \"border\" or \"margin\", add border\n\t\t\tif ( box !== \"padding\" ) {\n\t\t\t\tdelta += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\n\t\t\t// But still keep track of it otherwise\n\t\t\t} else {\n\t\t\t\textra += jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\n\t\t// If we get here with a border-box (content + padding + border), we're seeking \"content\" or\n\t\t// \"padding\" or \"margin\"\n\t\t} else {\n\n\t\t\t// For \"content\", subtract padding\n\t\t\tif ( box === \"content\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"padding\" + cssExpand[ i ], true, styles );\n\t\t\t}\n\n\t\t\t// For \"content\" or \"padding\", subtract border\n\t\t\tif ( box !== \"margin\" ) {\n\t\t\t\tdelta -= jQuery.css( elem, \"border\" + cssExpand[ i ] + \"Width\", true, styles );\n\t\t\t}\n\t\t}\n\t}\n\n\t// Account for positive content-box scroll gutter when requested by providing computedVal\n\tif ( !isBorderBox && computedVal >= 0 ) {\n\n\t\t// offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border\n\t\t// Assuming integer scroll gutter, subtract the rest and round down\n\t\tdelta += Math.max( 0, Math.ceil(\n\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\tcomputedVal -\n\t\t\tdelta -\n\t\t\textra -\n\t\t\t0.5\n\t\t) );\n\t}\n\n\treturn delta;\n}\n\nfunction getWidthOrHeight( elem, dimension, extra ) {\n\n\t// Start with computed style\n\tvar styles = getStyles( elem ),\n\t\tval = curCSS( elem, dimension, styles ),\n\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\tvalueIsBorderBox = isBorderBox;\n\n\t// Support: Firefox <=54\n\t// Return a confounding non-pixel value or feign ignorance, as appropriate.\n\tif ( rnumnonpx.test( val ) ) {\n\t\tif ( !extra ) {\n\t\t\treturn val;\n\t\t}\n\t\tval = \"auto\";\n\t}\n\n\t// Check for style in case a browser which returns unreliable values\n\t// for getComputedStyle silently falls back to the reliable elem.style\n\tvalueIsBorderBox = valueIsBorderBox &&\n\t\t( support.boxSizingReliable() || val === elem.style[ dimension ] );\n\n\t// Fall back to offsetWidth/offsetHeight when value is \"auto\"\n\t// This happens for inline elements with no explicit setting (gh-3571)\n\t// Support: Android <=4.1 - 4.3 only\n\t// Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)\n\tif ( val === \"auto\" ||\n\t\t!parseFloat( val ) && jQuery.css( elem, \"display\", false, styles ) === \"inline\" ) {\n\n\t\tval = elem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ];\n\n\t\t// offsetWidth/offsetHeight provide border-box values\n\t\tvalueIsBorderBox = true;\n\t}\n\n\t// Normalize \"\" and auto\n\tval = parseFloat( val ) || 0;\n\n\t// Adjust for the element's box model\n\treturn ( val +\n\t\tboxModelAdjustment(\n\t\t\telem,\n\t\t\tdimension,\n\t\t\textra || ( isBorderBox ? \"border\" : \"content\" ),\n\t\t\tvalueIsBorderBox,\n\t\t\tstyles,\n\n\t\t\t// Provide the current computed size to request scroll gutter calculation (gh-3589)\n\t\t\tval\n\t\t)\n\t) + \"px\";\n}\n\njQuery.extend( {\n\n\t// Add in style property hooks for overriding the default\n\t// behavior of getting and setting a style property\n\tcssHooks: {\n\t\topacity: {\n\t\t\tget: function( elem, computed ) {\n\t\t\t\tif ( computed ) {\n\n\t\t\t\t\t// We should always get a number back from opacity\n\t\t\t\t\tvar ret = curCSS( elem, \"opacity\" );\n\t\t\t\t\treturn ret === \"\" ? \"1\" : ret;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\t// Don't automatically add \"px\" to these possibly-unitless properties\n\tcssNumber: {\n\t\t\"animationIterationCount\": true,\n\t\t\"columnCount\": true,\n\t\t\"fillOpacity\": true,\n\t\t\"flexGrow\": true,\n\t\t\"flexShrink\": true,\n\t\t\"fontWeight\": true,\n\t\t\"lineHeight\": true,\n\t\t\"opacity\": true,\n\t\t\"order\": true,\n\t\t\"orphans\": true,\n\t\t\"widows\": true,\n\t\t\"zIndex\": true,\n\t\t\"zoom\": true\n\t},\n\n\t// Add in properties whose names you wish to fix before\n\t// setting or getting the value\n\tcssProps: {},\n\n\t// Get and set the style property on a DOM Node\n\tstyle: function( elem, name, value, extra ) {\n\n\t\t// Don't set styles on text and comment nodes\n\t\tif ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Make sure that we're working with the right name\n\t\tvar ret, type, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name ),\n\t\t\tstyle = elem.style;\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to query the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Gets hook for the prefixed version, then unprefixed version\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// Check if we're setting a value\n\t\tif ( value !== undefined ) {\n\t\t\ttype = typeof value;\n\n\t\t\t// Convert \"+=\" or \"-=\" to relative numbers (#7345)\n\t\t\tif ( type === \"string\" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {\n\t\t\t\tvalue = adjustCSS( elem, name, ret );\n\n\t\t\t\t// Fixes bug #9237\n\t\t\t\ttype = \"number\";\n\t\t\t}\n\n\t\t\t// Make sure that null and NaN values aren't set (#7116)\n\t\t\tif ( value == null || value !== value ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// If a number was passed in, add the unit (except for certain CSS properties)\n\t\t\tif ( type === \"number\" ) {\n\t\t\t\tvalue += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? \"\" : \"px\" );\n\t\t\t}\n\n\t\t\t// background-* props affect original clone's values\n\t\t\tif ( !support.clearCloneStyle && value === \"\" && name.indexOf( \"background\" ) === 0 ) {\n\t\t\t\tstyle[ name ] = \"inherit\";\n\t\t\t}\n\n\t\t\t// If a hook was provided, use that value, otherwise just set the specified value\n\t\t\tif ( !hooks || !( \"set\" in hooks ) ||\n\t\t\t\t( value = hooks.set( elem, value, extra ) ) !== undefined ) {\n\n\t\t\t\tif ( isCustomProp ) {\n\t\t\t\t\tstyle.setProperty( name, value );\n\t\t\t\t} else {\n\t\t\t\t\tstyle[ name ] = value;\n\t\t\t\t}\n\t\t\t}\n\n\t\t} else {\n\n\t\t\t// If a hook was provided get the non-computed value from there\n\t\t\tif ( hooks && \"get\" in hooks &&\n\t\t\t\t( ret = hooks.get( elem, false, extra ) ) !== undefined ) {\n\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\t// Otherwise just get the value from the style object\n\t\t\treturn style[ name ];\n\t\t}\n\t},\n\n\tcss: function( elem, name, extra, styles ) {\n\t\tvar val, num, hooks,\n\t\t\torigName = camelCase( name ),\n\t\t\tisCustomProp = rcustomProp.test( name );\n\n\t\t// Make sure that we're working with the right name. We don't\n\t\t// want to modify the value if it is a CSS custom property\n\t\t// since they are user-defined.\n\t\tif ( !isCustomProp ) {\n\t\t\tname = finalPropName( origName );\n\t\t}\n\n\t\t// Try prefixed name followed by the unprefixed name\n\t\thooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];\n\n\t\t// If a hook was provided get the computed value from there\n\t\tif ( hooks && \"get\" in hooks ) {\n\t\t\tval = hooks.get( elem, true, extra );\n\t\t}\n\n\t\t// Otherwise, if a way to get the computed value exists, use that\n\t\tif ( val === undefined ) {\n\t\t\tval = curCSS( elem, name, styles );\n\t\t}\n\n\t\t// Convert \"normal\" to computed value\n\t\tif ( val === \"normal\" && name in cssNormalTransform ) {\n\t\t\tval = cssNormalTransform[ name ];\n\t\t}\n\n\t\t// Make numeric if forced or a qualifier was provided and val looks numeric\n\t\tif ( extra === \"\" || extra ) {\n\t\t\tnum = parseFloat( val );\n\t\t\treturn extra === true || isFinite( num ) ? num || 0 : val;\n\t\t}\n\n\t\treturn val;\n\t}\n} );\n\njQuery.each( [ \"height\", \"width\" ], function( i, dimension ) {\n\tjQuery.cssHooks[ dimension ] = {\n\t\tget: function( elem, computed, extra ) {\n\t\t\tif ( computed ) {\n\n\t\t\t\t// Certain elements can have dimension info if we invisibly show them\n\t\t\t\t// but it must have a current display style that would benefit\n\t\t\t\treturn rdisplayswap.test( jQuery.css( elem, \"display\" ) ) &&\n\n\t\t\t\t\t// Support: Safari 8+\n\t\t\t\t\t// Table columns in Safari have non-zero offsetWidth & zero\n\t\t\t\t\t// getBoundingClientRect().width unless display is changed.\n\t\t\t\t\t// Support: IE <=11 only\n\t\t\t\t\t// Running getBoundingClientRect on a disconnected node\n\t\t\t\t\t// in IE throws an error.\n\t\t\t\t\t( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?\n\t\t\t\t\t\tswap( elem, cssShow, function() {\n\t\t\t\t\t\t\treturn getWidthOrHeight( elem, dimension, extra );\n\t\t\t\t\t\t} ) :\n\t\t\t\t\t\tgetWidthOrHeight( elem, dimension, extra );\n\t\t\t}\n\t\t},\n\n\t\tset: function( elem, value, extra ) {\n\t\t\tvar matches,\n\t\t\t\tstyles = getStyles( elem ),\n\t\t\t\tisBorderBox = jQuery.css( elem, \"boxSizing\", false, styles ) === \"border-box\",\n\t\t\t\tsubtract = extra && boxModelAdjustment(\n\t\t\t\t\telem,\n\t\t\t\t\tdimension,\n\t\t\t\t\textra,\n\t\t\t\t\tisBorderBox,\n\t\t\t\t\tstyles\n\t\t\t\t);\n\n\t\t\t// Account for unreliable border-box dimensions by comparing offset* to computed and\n\t\t\t// faking a content-box to get border and padding (gh-3699)\n\t\t\tif ( isBorderBox && support.scrollboxSize() === styles.position ) {\n\t\t\t\tsubtract -= Math.ceil(\n\t\t\t\t\telem[ \"offset\" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] -\n\t\t\t\t\tparseFloat( styles[ dimension ] ) -\n\t\t\t\t\tboxModelAdjustment( elem, dimension, \"border\", false, styles ) -\n\t\t\t\t\t0.5\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// Convert to pixels if value adjustment is needed\n\t\t\tif ( subtract && ( matches = rcssNum.exec( value ) ) &&\n\t\t\t\t( matches[ 3 ] || \"px\" ) !== \"px\" ) {\n\n\t\t\t\telem.style[ dimension ] = value;\n\t\t\t\tvalue = jQuery.css( elem, dimension );\n\t\t\t}\n\n\t\t\treturn setPositiveNumber( elem, value, subtract );\n\t\t}\n\t};\n} );\n\njQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,\n\tfunction( elem, computed ) {\n\t\tif ( computed ) {\n\t\t\treturn ( parseFloat( curCSS( elem, \"marginLeft\" ) ) ||\n\t\t\t\telem.getBoundingClientRect().left -\n\t\t\t\t\tswap( elem, { marginLeft: 0 }, function() {\n\t\t\t\t\t\treturn elem.getBoundingClientRect().left;\n\t\t\t\t\t} )\n\t\t\t\t) + \"px\";\n\t\t}\n\t}\n);\n\n// These hooks are used by animate to expand properties\njQuery.each( {\n\tmargin: \"\",\n\tpadding: \"\",\n\tborder: \"Width\"\n}, function( prefix, suffix ) {\n\tjQuery.cssHooks[ prefix + suffix ] = {\n\t\texpand: function( value ) {\n\t\t\tvar i = 0,\n\t\t\t\texpanded = {},\n\n\t\t\t\t// Assumes a single number if not a string\n\t\t\t\tparts = typeof value === \"string\" ? value.split( \" \" ) : [ value ];\n\n\t\t\tfor ( ; i < 4; i++ ) {\n\t\t\t\texpanded[ prefix + cssExpand[ i ] + suffix ] =\n\t\t\t\t\tparts[ i ] || parts[ i - 2 ] || parts[ 0 ];\n\t\t\t}\n\n\t\t\treturn expanded;\n\t\t}\n\t};\n\n\tif ( prefix !== \"margin\" ) {\n\t\tjQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;\n\t}\n} );\n\njQuery.fn.extend( {\n\tcss: function( name, value ) {\n\t\treturn access( this, function( elem, name, value ) {\n\t\t\tvar styles, len,\n\t\t\t\tmap = {},\n\t\t\t\ti = 0;\n\n\t\t\tif ( Array.isArray( name ) ) {\n\t\t\t\tstyles = getStyles( elem );\n\t\t\t\tlen = name.length;\n\n\t\t\t\tfor ( ; i < len; i++ ) {\n\t\t\t\t\tmap[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );\n\t\t\t\t}\n\n\t\t\t\treturn map;\n\t\t\t}\n\n\t\t\treturn value !== undefined ?\n\t\t\t\tjQuery.style( elem, name, value ) :\n\t\t\t\tjQuery.css( elem, name );\n\t\t}, name, value, arguments.length > 1 );\n\t}\n} );\n\n\nfunction Tween( elem, options, prop, end, easing ) {\n\treturn new Tween.prototype.init( elem, options, prop, end, easing );\n}\njQuery.Tween = Tween;\n\nTween.prototype = {\n\tconstructor: Tween,\n\tinit: function( elem, options, prop, end, easing, unit ) {\n\t\tthis.elem = elem;\n\t\tthis.prop = prop;\n\t\tthis.easing = easing || jQuery.easing._default;\n\t\tthis.options = options;\n\t\tthis.start = this.now = this.cur();\n\t\tthis.end = end;\n\t\tthis.unit = unit || ( jQuery.cssNumber[ prop ] ? \"\" : \"px\" );\n\t},\n\tcur: function() {\n\t\tvar hooks = Tween.propHooks[ this.prop ];\n\n\t\treturn hooks && hooks.get ?\n\t\t\thooks.get( this ) :\n\t\t\tTween.propHooks._default.get( this );\n\t},\n\trun: function( percent ) {\n\t\tvar eased,\n\t\t\thooks = Tween.propHooks[ this.prop ];\n\n\t\tif ( this.options.duration ) {\n\t\t\tthis.pos = eased = jQuery.easing[ this.easing ](\n\t\t\t\tpercent, this.options.duration * percent, 0, 1, this.options.duration\n\t\t\t);\n\t\t} else {\n\t\t\tthis.pos = eased = percent;\n\t\t}\n\t\tthis.now = ( this.end - this.start ) * eased + this.start;\n\n\t\tif ( this.options.step ) {\n\t\t\tthis.options.step.call( this.elem, this.now, this );\n\t\t}\n\n\t\tif ( hooks && hooks.set ) {\n\t\t\thooks.set( this );\n\t\t} else {\n\t\t\tTween.propHooks._default.set( this );\n\t\t}\n\t\treturn this;\n\t}\n};\n\nTween.prototype.init.prototype = Tween.prototype;\n\nTween.propHooks = {\n\t_default: {\n\t\tget: function( tween ) {\n\t\t\tvar result;\n\n\t\t\t// Use a property on the element directly when it is not a DOM element,\n\t\t\t// or when there is no matching style property that exists.\n\t\t\tif ( tween.elem.nodeType !== 1 ||\n\t\t\t\ttween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {\n\t\t\t\treturn tween.elem[ tween.prop ];\n\t\t\t}\n\n\t\t\t// Passing an empty string as a 3rd parameter to .css will automatically\n\t\t\t// attempt a parseFloat and fallback to a string if the parse fails.\n\t\t\t// Simple values such as \"10px\" are parsed to Float;\n\t\t\t// complex values such as \"rotate(1rad)\" are returned as-is.\n\t\t\tresult = jQuery.css( tween.elem, tween.prop, \"\" );\n\n\t\t\t// Empty strings, null, undefined and \"auto\" are converted to 0.\n\t\t\treturn !result || result === \"auto\" ? 0 : result;\n\t\t},\n\t\tset: function( tween ) {\n\n\t\t\t// Use step hook for back compat.\n\t\t\t// Use cssHook if its there.\n\t\t\t// Use .style if available and use plain properties where available.\n\t\t\tif ( jQuery.fx.step[ tween.prop ] ) {\n\t\t\t\tjQuery.fx.step[ tween.prop ]( tween );\n\t\t\t} else if ( tween.elem.nodeType === 1 &&\n\t\t\t\t( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||\n\t\t\t\t\tjQuery.cssHooks[ tween.prop ] ) ) {\n\t\t\t\tjQuery.style( tween.elem, tween.prop, tween.now + tween.unit );\n\t\t\t} else {\n\t\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Support: IE <=9 only\n// Panic based approach to setting things on disconnected nodes\nTween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {\n\tset: function( tween ) {\n\t\tif ( tween.elem.nodeType && tween.elem.parentNode ) {\n\t\t\ttween.elem[ tween.prop ] = tween.now;\n\t\t}\n\t}\n};\n\njQuery.easing = {\n\tlinear: function( p ) {\n\t\treturn p;\n\t},\n\tswing: function( p ) {\n\t\treturn 0.5 - Math.cos( p * Math.PI ) / 2;\n\t},\n\t_default: \"swing\"\n};\n\njQuery.fx = Tween.prototype.init;\n\n// Back compat <1.8 extension point\njQuery.fx.step = {};\n\n\n\n\nvar\n\tfxNow, inProgress,\n\trfxtypes = /^(?:toggle|show|hide)$/,\n\trrun = /queueHooks$/;\n\nfunction schedule() {\n\tif ( inProgress ) {\n\t\tif ( document.hidden === false && window.requestAnimationFrame ) {\n\t\t\twindow.requestAnimationFrame( schedule );\n\t\t} else {\n\t\t\twindow.setTimeout( schedule, jQuery.fx.interval );\n\t\t}\n\n\t\tjQuery.fx.tick();\n\t}\n}\n\n// Animations created synchronously will run synchronously\nfunction createFxNow() {\n\twindow.setTimeout( function() {\n\t\tfxNow = undefined;\n\t} );\n\treturn ( fxNow = Date.now() );\n}\n\n// Generate parameters to create a standard animation\nfunction genFx( type, includeWidth ) {\n\tvar which,\n\t\ti = 0,\n\t\tattrs = { height: type };\n\n\t// If we include width, step value is 1 to do all cssExpand values,\n\t// otherwise step value is 2 to skip over Left and Right\n\tincludeWidth = includeWidth ? 1 : 0;\n\tfor ( ; i < 4; i += 2 - includeWidth ) {\n\t\twhich = cssExpand[ i ];\n\t\tattrs[ \"margin\" + which ] = attrs[ \"padding\" + which ] = type;\n\t}\n\n\tif ( includeWidth ) {\n\t\tattrs.opacity = attrs.width = type;\n\t}\n\n\treturn attrs;\n}\n\nfunction createTween( value, prop, animation ) {\n\tvar tween,\n\t\tcollection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ \"*\" ] ),\n\t\tindex = 0,\n\t\tlength = collection.length;\n\tfor ( ; index < length; index++ ) {\n\t\tif ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {\n\n\t\t\t// We're done with this property\n\t\t\treturn tween;\n\t\t}\n\t}\n}\n\nfunction defaultPrefilter( elem, props, opts ) {\n\tvar prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,\n\t\tisBox = \"width\" in props || \"height\" in props,\n\t\tanim = this,\n\t\torig = {},\n\t\tstyle = elem.style,\n\t\thidden = elem.nodeType && isHiddenWithinTree( elem ),\n\t\tdataShow = dataPriv.get( elem, \"fxshow\" );\n\n\t// Queue-skipping animations hijack the fx hooks\n\tif ( !opts.queue ) {\n\t\thooks = jQuery._queueHooks( elem, \"fx\" );\n\t\tif ( hooks.unqueued == null ) {\n\t\t\thooks.unqueued = 0;\n\t\t\toldfire = hooks.empty.fire;\n\t\t\thooks.empty.fire = function() {\n\t\t\t\tif ( !hooks.unqueued ) {\n\t\t\t\t\toldfire();\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\thooks.unqueued++;\n\n\t\tanim.always( function() {\n\n\t\t\t// Ensure the complete handler is called before this completes\n\t\t\tanim.always( function() {\n\t\t\t\thooks.unqueued--;\n\t\t\t\tif ( !jQuery.queue( elem, \"fx\" ).length ) {\n\t\t\t\t\thooks.empty.fire();\n\t\t\t\t}\n\t\t\t} );\n\t\t} );\n\t}\n\n\t// Detect show/hide animations\n\tfor ( prop in props ) {\n\t\tvalue = props[ prop ];\n\t\tif ( rfxtypes.test( value ) ) {\n\t\t\tdelete props[ prop ];\n\t\t\ttoggle = toggle || value === \"toggle\";\n\t\t\tif ( value === ( hidden ? \"hide\" : \"show\" ) ) {\n\n\t\t\t\t// Pretend to be hidden if this is a \"show\" and\n\t\t\t\t// there is still data from a stopped show/hide\n\t\t\t\tif ( value === \"show\" && dataShow && dataShow[ prop ] !== undefined ) {\n\t\t\t\t\thidden = true;\n\n\t\t\t\t// Ignore all other no-op show/hide data\n\t\t\t\t} else {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\torig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );\n\t\t}\n\t}\n\n\t// Bail out if this is a no-op like .hide().hide()\n\tpropTween = !jQuery.isEmptyObject( props );\n\tif ( !propTween && jQuery.isEmptyObject( orig ) ) {\n\t\treturn;\n\t}\n\n\t// Restrict \"overflow\" and \"display\" styles during box animations\n\tif ( isBox && elem.nodeType === 1 ) {\n\n\t\t// Support: IE <=9 - 11, Edge 12 - 15\n\t\t// Record all 3 overflow attributes because IE does not infer the shorthand\n\t\t// from identically-valued overflowX and overflowY and Edge just mirrors\n\t\t// the overflowX value there.\n\t\topts.overflow = [ style.overflow, style.overflowX, style.overflowY ];\n\n\t\t// Identify a display type, preferring old show/hide data over the CSS cascade\n\t\trestoreDisplay = dataShow && dataShow.display;\n\t\tif ( restoreDisplay == null ) {\n\t\t\trestoreDisplay = dataPriv.get( elem, \"display\" );\n\t\t}\n\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\tif ( display === \"none\" ) {\n\t\t\tif ( restoreDisplay ) {\n\t\t\t\tdisplay = restoreDisplay;\n\t\t\t} else {\n\n\t\t\t\t// Get nonempty value(s) by temporarily forcing visibility\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t\trestoreDisplay = elem.style.display || restoreDisplay;\n\t\t\t\tdisplay = jQuery.css( elem, \"display\" );\n\t\t\t\tshowHide( [ elem ] );\n\t\t\t}\n\t\t}\n\n\t\t// Animate inline elements as inline-block\n\t\tif ( display === \"inline\" || display === \"inline-block\" && restoreDisplay != null ) {\n\t\t\tif ( jQuery.css( elem, \"float\" ) === \"none\" ) {\n\n\t\t\t\t// Restore the original display value at the end of pure show/hide animations\n\t\t\t\tif ( !propTween ) {\n\t\t\t\t\tanim.done( function() {\n\t\t\t\t\t\tstyle.display = restoreDisplay;\n\t\t\t\t\t} );\n\t\t\t\t\tif ( restoreDisplay == null ) {\n\t\t\t\t\t\tdisplay = style.display;\n\t\t\t\t\t\trestoreDisplay = display === \"none\" ? \"\" : display;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tstyle.display = \"inline-block\";\n\t\t\t}\n\t\t}\n\t}\n\n\tif ( opts.overflow ) {\n\t\tstyle.overflow = \"hidden\";\n\t\tanim.always( function() {\n\t\t\tstyle.overflow = opts.overflow[ 0 ];\n\t\t\tstyle.overflowX = opts.overflow[ 1 ];\n\t\t\tstyle.overflowY = opts.overflow[ 2 ];\n\t\t} );\n\t}\n\n\t// Implement show/hide animations\n\tpropTween = false;\n\tfor ( prop in orig ) {\n\n\t\t// General show/hide setup for this element animation\n\t\tif ( !propTween ) {\n\t\t\tif ( dataShow ) {\n\t\t\t\tif ( \"hidden\" in dataShow ) {\n\t\t\t\t\thidden = dataShow.hidden;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdataShow = dataPriv.access( elem, \"fxshow\", { display: restoreDisplay } );\n\t\t\t}\n\n\t\t\t// Store hidden/visible for toggle so `.stop().toggle()` \"reverses\"\n\t\t\tif ( toggle ) {\n\t\t\t\tdataShow.hidden = !hidden;\n\t\t\t}\n\n\t\t\t// Show elements before animating them\n\t\t\tif ( hidden ) {\n\t\t\t\tshowHide( [ elem ], true );\n\t\t\t}\n\n\t\t\t/* eslint-disable no-loop-func */\n\n\t\t\tanim.done( function() {\n\n\t\t\t/* eslint-enable no-loop-func */\n\n\t\t\t\t// The final step of a \"hide\" animation is actually hiding the element\n\t\t\t\tif ( !hidden ) {\n\t\t\t\t\tshowHide( [ elem ] );\n\t\t\t\t}\n\t\t\t\tdataPriv.remove( elem, \"fxshow\" );\n\t\t\t\tfor ( prop in orig ) {\n\t\t\t\t\tjQuery.style( elem, prop, orig[ prop ] );\n\t\t\t\t}\n\t\t\t} );\n\t\t}\n\n\t\t// Per-property setup\n\t\tpropTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );\n\t\tif ( !( prop in dataShow ) ) {\n\t\t\tdataShow[ prop ] = propTween.start;\n\t\t\tif ( hidden ) {\n\t\t\t\tpropTween.end = propTween.start;\n\t\t\t\tpropTween.start = 0;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction propFilter( props, specialEasing ) {\n\tvar index, name, easing, value, hooks;\n\n\t// camelCase, specialEasing and expand cssHook pass\n\tfor ( index in props ) {\n\t\tname = camelCase( index );\n\t\teasing = specialEasing[ name ];\n\t\tvalue = props[ index ];\n\t\tif ( Array.isArray( value ) ) {\n\t\t\teasing = value[ 1 ];\n\t\t\tvalue = props[ index ] = value[ 0 ];\n\t\t}\n\n\t\tif ( index !== name ) {\n\t\t\tprops[ name ] = value;\n\t\t\tdelete props[ index ];\n\t\t}\n\n\t\thooks = jQuery.cssHooks[ name ];\n\t\tif ( hooks && \"expand\" in hooks ) {\n\t\t\tvalue = hooks.expand( value );\n\t\t\tdelete props[ name ];\n\n\t\t\t// Not quite $.extend, this won't overwrite existing keys.\n\t\t\t// Reusing 'index' because we have the correct \"name\"\n\t\t\tfor ( index in value ) {\n\t\t\t\tif ( !( index in props ) ) {\n\t\t\t\t\tprops[ index ] = value[ index ];\n\t\t\t\t\tspecialEasing[ index ] = easing;\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tspecialEasing[ name ] = easing;\n\t\t}\n\t}\n}\n\nfunction Animation( elem, properties, options ) {\n\tvar result,\n\t\tstopped,\n\t\tindex = 0,\n\t\tlength = Animation.prefilters.length,\n\t\tdeferred = jQuery.Deferred().always( function() {\n\n\t\t\t// Don't match elem in the :animated selector\n\t\t\tdelete tick.elem;\n\t\t} ),\n\t\ttick = function() {\n\t\t\tif ( stopped ) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar currentTime = fxNow || createFxNow(),\n\t\t\t\tremaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),\n\n\t\t\t\t// Support: Android 2.3 only\n\t\t\t\t// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)\n\t\t\t\ttemp = remaining / animation.duration || 0,\n\t\t\t\tpercent = 1 - temp,\n\t\t\t\tindex = 0,\n\t\t\t\tlength = animation.tweens.length;\n\n\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\tanimation.tweens[ index ].run( percent );\n\t\t\t}\n\n\t\t\tdeferred.notifyWith( elem, [ animation, percent, remaining ] );\n\n\t\t\t// If there's more to do, yield\n\t\t\tif ( percent < 1 && length ) {\n\t\t\t\treturn remaining;\n\t\t\t}\n\n\t\t\t// If this was an empty animation, synthesize a final progress notification\n\t\t\tif ( !length ) {\n\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t}\n\n\t\t\t// Resolve the animation and report its conclusion\n\t\t\tdeferred.resolveWith( elem, [ animation ] );\n\t\t\treturn false;\n\t\t},\n\t\tanimation = deferred.promise( {\n\t\t\telem: elem,\n\t\t\tprops: jQuery.extend( {}, properties ),\n\t\t\topts: jQuery.extend( true, {\n\t\t\t\tspecialEasing: {},\n\t\t\t\teasing: jQuery.easing._default\n\t\t\t}, options ),\n\t\t\toriginalProperties: properties,\n\t\t\toriginalOptions: options,\n\t\t\tstartTime: fxNow || createFxNow(),\n\t\t\tduration: options.duration,\n\t\t\ttweens: [],\n\t\t\tcreateTween: function( prop, end ) {\n\t\t\t\tvar tween = jQuery.Tween( elem, animation.opts, prop, end,\n\t\t\t\t\t\tanimation.opts.specialEasing[ prop ] || animation.opts.easing );\n\t\t\t\tanimation.tweens.push( tween );\n\t\t\t\treturn tween;\n\t\t\t},\n\t\t\tstop: function( gotoEnd ) {\n\t\t\t\tvar index = 0,\n\n\t\t\t\t\t// If we are going to the end, we want to run all the tweens\n\t\t\t\t\t// otherwise we skip this part\n\t\t\t\t\tlength = gotoEnd ? animation.tweens.length : 0;\n\t\t\t\tif ( stopped ) {\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t\tstopped = true;\n\t\t\t\tfor ( ; index < length; index++ ) {\n\t\t\t\t\tanimation.tweens[ index ].run( 1 );\n\t\t\t\t}\n\n\t\t\t\t// Resolve when we played the last frame; otherwise, reject\n\t\t\t\tif ( gotoEnd ) {\n\t\t\t\t\tdeferred.notifyWith( elem, [ animation, 1, 0 ] );\n\t\t\t\t\tdeferred.resolveWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t} else {\n\t\t\t\t\tdeferred.rejectWith( elem, [ animation, gotoEnd ] );\n\t\t\t\t}\n\t\t\t\treturn this;\n\t\t\t}\n\t\t} ),\n\t\tprops = animation.props;\n\n\tpropFilter( props, animation.opts.specialEasing );\n\n\tfor ( ; index < length; index++ ) {\n\t\tresult = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );\n\t\tif ( result ) {\n\t\t\tif ( isFunction( result.stop ) ) {\n\t\t\t\tjQuery._queueHooks( animation.elem, animation.opts.queue ).stop =\n\t\t\t\t\tresult.stop.bind( result );\n\t\t\t}\n\t\t\treturn result;\n\t\t}\n\t}\n\n\tjQuery.map( props, createTween, animation );\n\n\tif ( isFunction( animation.opts.start ) ) {\n\t\tanimation.opts.start.call( elem, animation );\n\t}\n\n\t// Attach callbacks from options\n\tanimation\n\t\t.progress( animation.opts.progress )\n\t\t.done( animation.opts.done, animation.opts.complete )\n\t\t.fail( animation.opts.fail )\n\t\t.always( animation.opts.always );\n\n\tjQuery.fx.timer(\n\t\tjQuery.extend( tick, {\n\t\t\telem: elem,\n\t\t\tanim: animation,\n\t\t\tqueue: animation.opts.queue\n\t\t} )\n\t);\n\n\treturn animation;\n}\n\njQuery.Animation = jQuery.extend( Animation, {\n\n\ttweeners: {\n\t\t\"*\": [ function( prop, value ) {\n\t\t\tvar tween = this.createTween( prop, value );\n\t\t\tadjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );\n\t\t\treturn tween;\n\t\t} ]\n\t},\n\n\ttweener: function( props, callback ) {\n\t\tif ( isFunction( props ) ) {\n\t\t\tcallback = props;\n\t\t\tprops = [ \"*\" ];\n\t\t} else {\n\t\t\tprops = props.match( rnothtmlwhite );\n\t\t}\n\n\t\tvar prop,\n\t\t\tindex = 0,\n\t\t\tlength = props.length;\n\n\t\tfor ( ; index < length; index++ ) {\n\t\t\tprop = props[ index ];\n\t\t\tAnimation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];\n\t\t\tAnimation.tweeners[ prop ].unshift( callback );\n\t\t}\n\t},\n\n\tprefilters: [ defaultPrefilter ],\n\n\tprefilter: function( callback, prepend ) {\n\t\tif ( prepend ) {\n\t\t\tAnimation.prefilters.unshift( callback );\n\t\t} else {\n\t\t\tAnimation.prefilters.push( callback );\n\t\t}\n\t}\n} );\n\njQuery.speed = function( speed, easing, fn ) {\n\tvar opt = speed && typeof speed === \"object\" ? jQuery.extend( {}, speed ) : {\n\t\tcomplete: fn || !fn && easing ||\n\t\t\tisFunction( speed ) && speed,\n\t\tduration: speed,\n\t\teasing: fn && easing || easing && !isFunction( easing ) && easing\n\t};\n\n\t// Go to the end state if fx are off\n\tif ( jQuery.fx.off ) {\n\t\topt.duration = 0;\n\n\t} else {\n\t\tif ( typeof opt.duration !== \"number\" ) {\n\t\t\tif ( opt.duration in jQuery.fx.speeds ) {\n\t\t\t\topt.duration = jQuery.fx.speeds[ opt.duration ];\n\n\t\t\t} else {\n\t\t\t\topt.duration = jQuery.fx.speeds._default;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Normalize opt.queue - true/undefined/null -> \"fx\"\n\tif ( opt.queue == null || opt.queue === true ) {\n\t\topt.queue = \"fx\";\n\t}\n\n\t// Queueing\n\topt.old = opt.complete;\n\n\topt.complete = function() {\n\t\tif ( isFunction( opt.old ) ) {\n\t\t\topt.old.call( this );\n\t\t}\n\n\t\tif ( opt.queue ) {\n\t\t\tjQuery.dequeue( this, opt.queue );\n\t\t}\n\t};\n\n\treturn opt;\n};\n\njQuery.fn.extend( {\n\tfadeTo: function( speed, to, easing, callback ) {\n\n\t\t// Show any hidden elements after setting opacity to 0\n\t\treturn this.filter( isHiddenWithinTree ).css( \"opacity\", 0 ).show()\n\n\t\t\t// Animate to the value specified\n\t\t\t.end().animate( { opacity: to }, speed, easing, callback );\n\t},\n\tanimate: function( prop, speed, easing, callback ) {\n\t\tvar empty = jQuery.isEmptyObject( prop ),\n\t\t\toptall = jQuery.speed( speed, easing, callback ),\n\t\t\tdoAnimation = function() {\n\n\t\t\t\t// Operate on a copy of prop so per-property easing won't be lost\n\t\t\t\tvar anim = Animation( this, jQuery.extend( {}, prop ), optall );\n\n\t\t\t\t// Empty animations, or finishing resolves immediately\n\t\t\t\tif ( empty || dataPriv.get( this, \"finish\" ) ) {\n\t\t\t\t\tanim.stop( true );\n\t\t\t\t}\n\t\t\t};\n\t\t\tdoAnimation.finish = doAnimation;\n\n\t\treturn empty || optall.queue === false ?\n\t\t\tthis.each( doAnimation ) :\n\t\t\tthis.queue( optall.queue, doAnimation );\n\t},\n\tstop: function( type, clearQueue, gotoEnd ) {\n\t\tvar stopQueue = function( hooks ) {\n\t\t\tvar stop = hooks.stop;\n\t\t\tdelete hooks.stop;\n\t\t\tstop( gotoEnd );\n\t\t};\n\n\t\tif ( typeof type !== \"string\" ) {\n\t\t\tgotoEnd = clearQueue;\n\t\t\tclearQueue = type;\n\t\t\ttype = undefined;\n\t\t}\n\t\tif ( clearQueue && type !== false ) {\n\t\t\tthis.queue( type || \"fx\", [] );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar dequeue = true,\n\t\t\t\tindex = type != null && type + \"queueHooks\",\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tdata = dataPriv.get( this );\n\n\t\t\tif ( index ) {\n\t\t\t\tif ( data[ index ] && data[ index ].stop ) {\n\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tfor ( index in data ) {\n\t\t\t\t\tif ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {\n\t\t\t\t\t\tstopQueue( data[ index ] );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this &&\n\t\t\t\t\t( type == null || timers[ index ].queue === type ) ) {\n\n\t\t\t\t\ttimers[ index ].anim.stop( gotoEnd );\n\t\t\t\t\tdequeue = false;\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Start the next in the queue if the last step wasn't forced.\n\t\t\t// Timers currently will call their complete callbacks, which\n\t\t\t// will dequeue but only if they were gotoEnd.\n\t\t\tif ( dequeue || !gotoEnd ) {\n\t\t\t\tjQuery.dequeue( this, type );\n\t\t\t}\n\t\t} );\n\t},\n\tfinish: function( type ) {\n\t\tif ( type !== false ) {\n\t\t\ttype = type || \"fx\";\n\t\t}\n\t\treturn this.each( function() {\n\t\t\tvar index,\n\t\t\t\tdata = dataPriv.get( this ),\n\t\t\t\tqueue = data[ type + \"queue\" ],\n\t\t\t\thooks = data[ type + \"queueHooks\" ],\n\t\t\t\ttimers = jQuery.timers,\n\t\t\t\tlength = queue ? queue.length : 0;\n\n\t\t\t// Enable finishing flag on private data\n\t\t\tdata.finish = true;\n\n\t\t\t// Empty the queue first\n\t\t\tjQuery.queue( this, type, [] );\n\n\t\t\tif ( hooks && hooks.stop ) {\n\t\t\t\thooks.stop.call( this, true );\n\t\t\t}\n\n\t\t\t// Look for any active animations, and finish them\n\t\t\tfor ( index = timers.length; index--; ) {\n\t\t\t\tif ( timers[ index ].elem === this && timers[ index ].queue === type ) {\n\t\t\t\t\ttimers[ index ].anim.stop( true );\n\t\t\t\t\ttimers.splice( index, 1 );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Look for any animations in the old queue and finish them\n\t\t\tfor ( index = 0; index < length; index++ ) {\n\t\t\t\tif ( queue[ index ] && queue[ index ].finish ) {\n\t\t\t\t\tqueue[ index ].finish.call( this );\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Turn off finishing flag\n\t\t\tdelete data.finish;\n\t\t} );\n\t}\n} );\n\njQuery.each( [ \"toggle\", \"show\", \"hide\" ], function( i, name ) {\n\tvar cssFn = jQuery.fn[ name ];\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn speed == null || typeof speed === \"boolean\" ?\n\t\t\tcssFn.apply( this, arguments ) :\n\t\t\tthis.animate( genFx( name, true ), speed, easing, callback );\n\t};\n} );\n\n// Generate shortcuts for custom animations\njQuery.each( {\n\tslideDown: genFx( \"show\" ),\n\tslideUp: genFx( \"hide\" ),\n\tslideToggle: genFx( \"toggle\" ),\n\tfadeIn: { opacity: \"show\" },\n\tfadeOut: { opacity: \"hide\" },\n\tfadeToggle: { opacity: \"toggle\" }\n}, function( name, props ) {\n\tjQuery.fn[ name ] = function( speed, easing, callback ) {\n\t\treturn this.animate( props, speed, easing, callback );\n\t};\n} );\n\njQuery.timers = [];\njQuery.fx.tick = function() {\n\tvar timer,\n\t\ti = 0,\n\t\ttimers = jQuery.timers;\n\n\tfxNow = Date.now();\n\n\tfor ( ; i < timers.length; i++ ) {\n\t\ttimer = timers[ i ];\n\n\t\t// Run the timer and safely remove it when done (allowing for external removal)\n\t\tif ( !timer() && timers[ i ] === timer ) {\n\t\t\ttimers.splice( i--, 1 );\n\t\t}\n\t}\n\n\tif ( !timers.length ) {\n\t\tjQuery.fx.stop();\n\t}\n\tfxNow = undefined;\n};\n\njQuery.fx.timer = function( timer ) {\n\tjQuery.timers.push( timer );\n\tjQuery.fx.start();\n};\n\njQuery.fx.interval = 13;\njQuery.fx.start = function() {\n\tif ( inProgress ) {\n\t\treturn;\n\t}\n\n\tinProgress = true;\n\tschedule();\n};\n\njQuery.fx.stop = function() {\n\tinProgress = null;\n};\n\njQuery.fx.speeds = {\n\tslow: 600,\n\tfast: 200,\n\n\t// Default speed\n\t_default: 400\n};\n\n\n// Based off of the plugin by Clint Helfers, with permission.\n// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/\njQuery.fn.delay = function( time, type ) {\n\ttime = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;\n\ttype = type || \"fx\";\n\n\treturn this.queue( type, function( next, hooks ) {\n\t\tvar timeout = window.setTimeout( next, time );\n\t\thooks.stop = function() {\n\t\t\twindow.clearTimeout( timeout );\n\t\t};\n\t} );\n};\n\n\n( function() {\n\tvar input = document.createElement( \"input\" ),\n\t\tselect = document.createElement( \"select\" ),\n\t\topt = select.appendChild( document.createElement( \"option\" ) );\n\n\tinput.type = \"checkbox\";\n\n\t// Support: Android <=4.3 only\n\t// Default value for a checkbox should be \"on\"\n\tsupport.checkOn = input.value !== \"\";\n\n\t// Support: IE <=11 only\n\t// Must access selectedIndex to make default options select\n\tsupport.optSelected = opt.selected;\n\n\t// Support: IE <=11 only\n\t// An input loses its value after becoming a radio\n\tinput = document.createElement( \"input\" );\n\tinput.value = \"t\";\n\tinput.type = \"radio\";\n\tsupport.radioValue = input.value === \"t\";\n} )();\n\n\nvar boolHook,\n\tattrHandle = jQuery.expr.attrHandle;\n\njQuery.fn.extend( {\n\tattr: function( name, value ) {\n\t\treturn access( this, jQuery.attr, name, value, arguments.length > 1 );\n\t},\n\n\tremoveAttr: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.removeAttr( this, name );\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tattr: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set attributes on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Fallback to prop when attributes are not supported\n\t\tif ( typeof elem.getAttribute === \"undefined\" ) {\n\t\t\treturn jQuery.prop( elem, name, value );\n\t\t}\n\n\t\t// Attribute hooks are determined by the lowercase version\n\t\t// Grab necessary hook if one is defined\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\t\t\thooks = jQuery.attrHooks[ name.toLowerCase() ] ||\n\t\t\t\t( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( value === null ) {\n\t\t\t\tjQuery.removeAttr( elem, name );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\telem.setAttribute( name, value + \"\" );\n\t\t\treturn value;\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\tret = jQuery.find.attr( elem, name );\n\n\t\t// Non-existent attributes return null, we normalize to undefined\n\t\treturn ret == null ? undefined : ret;\n\t},\n\n\tattrHooks: {\n\t\ttype: {\n\t\t\tset: function( elem, value ) {\n\t\t\t\tif ( !support.radioValue && value === \"radio\" &&\n\t\t\t\t\tnodeName( elem, \"input\" ) ) {\n\t\t\t\t\tvar val = elem.value;\n\t\t\t\t\telem.setAttribute( \"type\", value );\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\telem.value = val;\n\t\t\t\t\t}\n\t\t\t\t\treturn value;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\n\tremoveAttr: function( elem, value ) {\n\t\tvar name,\n\t\t\ti = 0,\n\n\t\t\t// Attribute names can contain non-HTML whitespace characters\n\t\t\t// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n\t\t\tattrNames = value && value.match( rnothtmlwhite );\n\n\t\tif ( attrNames && elem.nodeType === 1 ) {\n\t\t\twhile ( ( name = attrNames[ i++ ] ) ) {\n\t\t\t\telem.removeAttribute( name );\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Hooks for boolean attributes\nboolHook = {\n\tset: function( elem, value, name ) {\n\t\tif ( value === false ) {\n\n\t\t\t// Remove boolean attributes when set to false\n\t\t\tjQuery.removeAttr( elem, name );\n\t\t} else {\n\t\t\telem.setAttribute( name, name );\n\t\t}\n\t\treturn name;\n\t}\n};\n\njQuery.each( jQuery.expr.match.bool.source.match( /\\w+/g ), function( i, name ) {\n\tvar getter = attrHandle[ name ] || jQuery.find.attr;\n\n\tattrHandle[ name ] = function( elem, name, isXML ) {\n\t\tvar ret, handle,\n\t\t\tlowercaseName = name.toLowerCase();\n\n\t\tif ( !isXML ) {\n\n\t\t\t// Avoid an infinite loop by temporarily removing this function from the getter\n\t\t\thandle = attrHandle[ lowercaseName ];\n\t\t\tattrHandle[ lowercaseName ] = ret;\n\t\t\tret = getter( elem, name, isXML ) != null ?\n\t\t\t\tlowercaseName :\n\t\t\t\tnull;\n\t\t\tattrHandle[ lowercaseName ] = handle;\n\t\t}\n\t\treturn ret;\n\t};\n} );\n\n\n\n\nvar rfocusable = /^(?:input|select|textarea|button)$/i,\n\trclickable = /^(?:a|area)$/i;\n\njQuery.fn.extend( {\n\tprop: function( name, value ) {\n\t\treturn access( this, jQuery.prop, name, value, arguments.length > 1 );\n\t},\n\n\tremoveProp: function( name ) {\n\t\treturn this.each( function() {\n\t\t\tdelete this[ jQuery.propFix[ name ] || name ];\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tprop: function( elem, name, value ) {\n\t\tvar ret, hooks,\n\t\t\tnType = elem.nodeType;\n\n\t\t// Don't get/set properties on text, comment and attribute nodes\n\t\tif ( nType === 3 || nType === 8 || nType === 2 ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {\n\n\t\t\t// Fix name and attach hooks\n\t\t\tname = jQuery.propFix[ name ] || name;\n\t\t\thooks = jQuery.propHooks[ name ];\n\t\t}\n\n\t\tif ( value !== undefined ) {\n\t\t\tif ( hooks && \"set\" in hooks &&\n\t\t\t\t( ret = hooks.set( elem, value, name ) ) !== undefined ) {\n\t\t\t\treturn ret;\n\t\t\t}\n\n\t\t\treturn ( elem[ name ] = value );\n\t\t}\n\n\t\tif ( hooks && \"get\" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {\n\t\t\treturn ret;\n\t\t}\n\n\t\treturn elem[ name ];\n\t},\n\n\tpropHooks: {\n\t\ttabIndex: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\t// Support: IE <=9 - 11 only\n\t\t\t\t// elem.tabIndex doesn't always return the\n\t\t\t\t// correct value when it hasn't been explicitly set\n\t\t\t\t// https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/\n\t\t\t\t// Use proper attribute retrieval(#12072)\n\t\t\t\tvar tabindex = jQuery.find.attr( elem, \"tabindex\" );\n\n\t\t\t\tif ( tabindex ) {\n\t\t\t\t\treturn parseInt( tabindex, 10 );\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\trfocusable.test( elem.nodeName ) ||\n\t\t\t\t\trclickable.test( elem.nodeName ) &&\n\t\t\t\t\telem.href\n\t\t\t\t) {\n\t\t\t\t\treturn 0;\n\t\t\t\t}\n\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}\n\t},\n\n\tpropFix: {\n\t\t\"for\": \"htmlFor\",\n\t\t\"class\": \"className\"\n\t}\n} );\n\n// Support: IE <=11 only\n// Accessing the selectedIndex property\n// forces the browser to respect setting selected\n// on the option\n// The getter ensures a default option is selected\n// when in an optgroup\n// eslint rule \"no-unused-expressions\" is disabled for this code\n// since it considers such accessions noop\nif ( !support.optSelected ) {\n\tjQuery.propHooks.selected = {\n\t\tget: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent && parent.parentNode ) {\n\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t}\n\t\t\treturn null;\n\t\t},\n\t\tset: function( elem ) {\n\n\t\t\t/* eslint no-unused-expressions: \"off\" */\n\n\t\t\tvar parent = elem.parentNode;\n\t\t\tif ( parent ) {\n\t\t\t\tparent.selectedIndex;\n\n\t\t\t\tif ( parent.parentNode ) {\n\t\t\t\t\tparent.parentNode.selectedIndex;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\njQuery.each( [\n\t\"tabIndex\",\n\t\"readOnly\",\n\t\"maxLength\",\n\t\"cellSpacing\",\n\t\"cellPadding\",\n\t\"rowSpan\",\n\t\"colSpan\",\n\t\"useMap\",\n\t\"frameBorder\",\n\t\"contentEditable\"\n], function() {\n\tjQuery.propFix[ this.toLowerCase() ] = this;\n} );\n\n\n\n\n\t// Strip and collapse whitespace according to HTML spec\n\t// https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace\n\tfunction stripAndCollapse( value ) {\n\t\tvar tokens = value.match( rnothtmlwhite ) || [];\n\t\treturn tokens.join( \" \" );\n\t}\n\n\nfunction getClass( elem ) {\n\treturn elem.getAttribute && elem.getAttribute( \"class\" ) || \"\";\n}\n\nfunction classesToArray( value ) {\n\tif ( Array.isArray( value ) ) {\n\t\treturn value;\n\t}\n\tif ( typeof value === \"string\" ) {\n\t\treturn value.match( rnothtmlwhite ) || [];\n\t}\n\treturn [];\n}\n\njQuery.fn.extend( {\n\taddClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).addClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\t\t\t\t\t\tif ( cur.indexOf( \" \" + clazz + \" \" ) < 0 ) {\n\t\t\t\t\t\t\tcur += clazz + \" \";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\tremoveClass: function( value ) {\n\t\tvar classes, elem, cur, curValue, clazz, j, finalValue,\n\t\t\ti = 0;\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( j ) {\n\t\t\t\tjQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );\n\t\t\t} );\n\t\t}\n\n\t\tif ( !arguments.length ) {\n\t\t\treturn this.attr( \"class\", \"\" );\n\t\t}\n\n\t\tclasses = classesToArray( value );\n\n\t\tif ( classes.length ) {\n\t\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\t\tcurValue = getClass( elem );\n\n\t\t\t\t// This expression is here for better compressibility (see addClass)\n\t\t\t\tcur = elem.nodeType === 1 && ( \" \" + stripAndCollapse( curValue ) + \" \" );\n\n\t\t\t\tif ( cur ) {\n\t\t\t\t\tj = 0;\n\t\t\t\t\twhile ( ( clazz = classes[ j++ ] ) ) {\n\n\t\t\t\t\t\t// Remove *all* instances\n\t\t\t\t\t\twhile ( cur.indexOf( \" \" + clazz + \" \" ) > -1 ) {\n\t\t\t\t\t\t\tcur = cur.replace( \" \" + clazz + \" \", \" \" );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Only assign if different to avoid unneeded rendering.\n\t\t\t\t\tfinalValue = stripAndCollapse( cur );\n\t\t\t\t\tif ( curValue !== finalValue ) {\n\t\t\t\t\t\telem.setAttribute( \"class\", finalValue );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn this;\n\t},\n\n\ttoggleClass: function( value, stateVal ) {\n\t\tvar type = typeof value,\n\t\t\tisValidValue = type === \"string\" || Array.isArray( value );\n\n\t\tif ( typeof stateVal === \"boolean\" && isValidValue ) {\n\t\t\treturn stateVal ? this.addClass( value ) : this.removeClass( value );\n\t\t}\n\n\t\tif ( isFunction( value ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).toggleClass(\n\t\t\t\t\tvalue.call( this, i, getClass( this ), stateVal ),\n\t\t\t\t\tstateVal\n\t\t\t\t);\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar className, i, self, classNames;\n\n\t\t\tif ( isValidValue ) {\n\n\t\t\t\t// Toggle individual class names\n\t\t\t\ti = 0;\n\t\t\t\tself = jQuery( this );\n\t\t\t\tclassNames = classesToArray( value );\n\n\t\t\t\twhile ( ( className = classNames[ i++ ] ) ) {\n\n\t\t\t\t\t// Check each className given, space separated list\n\t\t\t\t\tif ( self.hasClass( className ) ) {\n\t\t\t\t\t\tself.removeClass( className );\n\t\t\t\t\t} else {\n\t\t\t\t\t\tself.addClass( className );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t// Toggle whole class name\n\t\t\t} else if ( value === undefined || type === \"boolean\" ) {\n\t\t\t\tclassName = getClass( this );\n\t\t\t\tif ( className ) {\n\n\t\t\t\t\t// Store className if set\n\t\t\t\t\tdataPriv.set( this, \"__className__\", className );\n\t\t\t\t}\n\n\t\t\t\t// If the element has a class name or if we're passed `false`,\n\t\t\t\t// then remove the whole classname (if there was one, the above saved it).\n\t\t\t\t// Otherwise bring back whatever was previously saved (if anything),\n\t\t\t\t// falling back to the empty string if nothing was stored.\n\t\t\t\tif ( this.setAttribute ) {\n\t\t\t\t\tthis.setAttribute( \"class\",\n\t\t\t\t\t\tclassName || value === false ?\n\t\t\t\t\t\t\"\" :\n\t\t\t\t\t\tdataPriv.get( this, \"__className__\" ) || \"\"\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t} );\n\t},\n\n\thasClass: function( selector ) {\n\t\tvar className, elem,\n\t\t\ti = 0;\n\n\t\tclassName = \" \" + selector + \" \";\n\t\twhile ( ( elem = this[ i++ ] ) ) {\n\t\t\tif ( elem.nodeType === 1 &&\n\t\t\t\t( \" \" + stripAndCollapse( getClass( elem ) ) + \" \" ).indexOf( className ) > -1 ) {\n\t\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n} );\n\n\n\n\nvar rreturn = /\\r/g;\n\njQuery.fn.extend( {\n\tval: function( value ) {\n\t\tvar hooks, ret, valueIsFunction,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !arguments.length ) {\n\t\t\tif ( elem ) {\n\t\t\t\thooks = jQuery.valHooks[ elem.type ] ||\n\t\t\t\t\tjQuery.valHooks[ elem.nodeName.toLowerCase() ];\n\n\t\t\t\tif ( hooks &&\n\t\t\t\t\t\"get\" in hooks &&\n\t\t\t\t\t( ret = hooks.get( elem, \"value\" ) ) !== undefined\n\t\t\t\t) {\n\t\t\t\t\treturn ret;\n\t\t\t\t}\n\n\t\t\t\tret = elem.value;\n\n\t\t\t\t// Handle most common string cases\n\t\t\t\tif ( typeof ret === \"string\" ) {\n\t\t\t\t\treturn ret.replace( rreturn, \"\" );\n\t\t\t\t}\n\n\t\t\t\t// Handle cases where value is null/undef or number\n\t\t\t\treturn ret == null ? \"\" : ret;\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\n\t\tvalueIsFunction = isFunction( value );\n\n\t\treturn this.each( function( i ) {\n\t\t\tvar val;\n\n\t\t\tif ( this.nodeType !== 1 ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif ( valueIsFunction ) {\n\t\t\t\tval = value.call( this, i, jQuery( this ).val() );\n\t\t\t} else {\n\t\t\t\tval = value;\n\t\t\t}\n\n\t\t\t// Treat null/undefined as \"\"; convert numbers to string\n\t\t\tif ( val == null ) {\n\t\t\t\tval = \"\";\n\n\t\t\t} else if ( typeof val === \"number\" ) {\n\t\t\t\tval += \"\";\n\n\t\t\t} else if ( Array.isArray( val ) ) {\n\t\t\t\tval = jQuery.map( val, function( value ) {\n\t\t\t\t\treturn value == null ? \"\" : value + \"\";\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\thooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];\n\n\t\t\t// If set returns undefined, fall back to normal setting\n\t\t\tif ( !hooks || !( \"set\" in hooks ) || hooks.set( this, val, \"value\" ) === undefined ) {\n\t\t\t\tthis.value = val;\n\t\t\t}\n\t\t} );\n\t}\n} );\n\njQuery.extend( {\n\tvalHooks: {\n\t\toption: {\n\t\t\tget: function( elem ) {\n\n\t\t\t\tvar val = jQuery.find.attr( elem, \"value\" );\n\t\t\t\treturn val != null ?\n\t\t\t\t\tval :\n\n\t\t\t\t\t// Support: IE <=10 - 11 only\n\t\t\t\t\t// option.text throws exceptions (#14686, #14858)\n\t\t\t\t\t// Strip and collapse whitespace\n\t\t\t\t\t// https://html.spec.whatwg.org/#strip-and-collapse-whitespace\n\t\t\t\t\tstripAndCollapse( jQuery.text( elem ) );\n\t\t\t}\n\t\t},\n\t\tselect: {\n\t\t\tget: function( elem ) {\n\t\t\t\tvar value, option, i,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tindex = elem.selectedIndex,\n\t\t\t\t\tone = elem.type === \"select-one\",\n\t\t\t\t\tvalues = one ? null : [],\n\t\t\t\t\tmax = one ? index + 1 : options.length;\n\n\t\t\t\tif ( index < 0 ) {\n\t\t\t\t\ti = max;\n\n\t\t\t\t} else {\n\t\t\t\t\ti = one ? index : 0;\n\t\t\t\t}\n\n\t\t\t\t// Loop through all the selected options\n\t\t\t\tfor ( ; i < max; i++ ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t// IE8-9 doesn't update selected after form reset (#2551)\n\t\t\t\t\tif ( ( option.selected || i === index ) &&\n\n\t\t\t\t\t\t\t// Don't return options that are disabled or in a disabled optgroup\n\t\t\t\t\t\t\t!option.disabled &&\n\t\t\t\t\t\t\t( !option.parentNode.disabled ||\n\t\t\t\t\t\t\t\t!nodeName( option.parentNode, \"optgroup\" ) ) ) {\n\n\t\t\t\t\t\t// Get the specific value for the option\n\t\t\t\t\t\tvalue = jQuery( option ).val();\n\n\t\t\t\t\t\t// We don't need an array for one selects\n\t\t\t\t\t\tif ( one ) {\n\t\t\t\t\t\t\treturn value;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Multi-Selects return an array\n\t\t\t\t\t\tvalues.push( value );\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn values;\n\t\t\t},\n\n\t\t\tset: function( elem, value ) {\n\t\t\t\tvar optionSet, option,\n\t\t\t\t\toptions = elem.options,\n\t\t\t\t\tvalues = jQuery.makeArray( value ),\n\t\t\t\t\ti = options.length;\n\n\t\t\t\twhile ( i-- ) {\n\t\t\t\t\toption = options[ i ];\n\n\t\t\t\t\t/* eslint-disable no-cond-assign */\n\n\t\t\t\t\tif ( option.selected =\n\t\t\t\t\t\tjQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1\n\t\t\t\t\t) {\n\t\t\t\t\t\toptionSet = true;\n\t\t\t\t\t}\n\n\t\t\t\t\t/* eslint-enable no-cond-assign */\n\t\t\t\t}\n\n\t\t\t\t// Force browsers to behave consistently when non-matching value is set\n\t\t\t\tif ( !optionSet ) {\n\t\t\t\t\telem.selectedIndex = -1;\n\t\t\t\t}\n\t\t\t\treturn values;\n\t\t\t}\n\t\t}\n\t}\n} );\n\n// Radios and checkboxes getter/setter\njQuery.each( [ \"radio\", \"checkbox\" ], function() {\n\tjQuery.valHooks[ this ] = {\n\t\tset: function( elem, value ) {\n\t\t\tif ( Array.isArray( value ) ) {\n\t\t\t\treturn ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );\n\t\t\t}\n\t\t}\n\t};\n\tif ( !support.checkOn ) {\n\t\tjQuery.valHooks[ this ].get = function( elem ) {\n\t\t\treturn elem.getAttribute( \"value\" ) === null ? \"on\" : elem.value;\n\t\t};\n\t}\n} );\n\n\n\n\n// Return jQuery for attributes-only inclusion\n\n\nsupport.focusin = \"onfocusin\" in window;\n\n\nvar rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,\n\tstopPropagationCallback = function( e ) {\n\t\te.stopPropagation();\n\t};\n\njQuery.extend( jQuery.event, {\n\n\ttrigger: function( event, data, elem, onlyHandlers ) {\n\n\t\tvar i, cur, tmp, bubbleType, ontype, handle, special, lastElement,\n\t\t\teventPath = [ elem || document ],\n\t\t\ttype = hasOwn.call( event, \"type\" ) ? event.type : event,\n\t\t\tnamespaces = hasOwn.call( event, \"namespace\" ) ? event.namespace.split( \".\" ) : [];\n\n\t\tcur = lastElement = tmp = elem = elem || document;\n\n\t\t// Don't do events on text and comment nodes\n\t\tif ( elem.nodeType === 3 || elem.nodeType === 8 ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// focus/blur morphs to focusin/out; ensure we're not firing them right now\n\t\tif ( rfocusMorph.test( type + jQuery.event.triggered ) ) {\n\t\t\treturn;\n\t\t}\n\n\t\tif ( type.indexOf( \".\" ) > -1 ) {\n\n\t\t\t// Namespaced trigger; create a regexp to match event type in handle()\n\t\t\tnamespaces = type.split( \".\" );\n\t\t\ttype = namespaces.shift();\n\t\t\tnamespaces.sort();\n\t\t}\n\t\tontype = type.indexOf( \":\" ) < 0 && \"on\" + type;\n\n\t\t// Caller can pass in a jQuery.Event object, Object, or just an event type string\n\t\tevent = event[ jQuery.expando ] ?\n\t\t\tevent :\n\t\t\tnew jQuery.Event( type, typeof event === \"object\" && event );\n\n\t\t// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)\n\t\tevent.isTrigger = onlyHandlers ? 2 : 3;\n\t\tevent.namespace = namespaces.join( \".\" );\n\t\tevent.rnamespace = event.namespace ?\n\t\t\tnew RegExp( \"(^|\\\\.)\" + namespaces.join( \"\\\\.(?:.*\\\\.|)\" ) + \"(\\\\.|$)\" ) :\n\t\t\tnull;\n\n\t\t// Clean up the event in case it is being reused\n\t\tevent.result = undefined;\n\t\tif ( !event.target ) {\n\t\t\tevent.target = elem;\n\t\t}\n\n\t\t// Clone any incoming data and prepend the event, creating the handler arg list\n\t\tdata = data == null ?\n\t\t\t[ event ] :\n\t\t\tjQuery.makeArray( data, [ event ] );\n\n\t\t// Allow special events to draw outside the lines\n\t\tspecial = jQuery.event.special[ type ] || {};\n\t\tif ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Determine event propagation path in advance, per W3C events spec (#9951)\n\t\t// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)\n\t\tif ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) {\n\n\t\t\tbubbleType = special.delegateType || type;\n\t\t\tif ( !rfocusMorph.test( bubbleType + type ) ) {\n\t\t\t\tcur = cur.parentNode;\n\t\t\t}\n\t\t\tfor ( ; cur; cur = cur.parentNode ) {\n\t\t\t\teventPath.push( cur );\n\t\t\t\ttmp = cur;\n\t\t\t}\n\n\t\t\t// Only add window if we got to document (e.g., not plain obj or detached DOM)\n\t\t\tif ( tmp === ( elem.ownerDocument || document ) ) {\n\t\t\t\teventPath.push( tmp.defaultView || tmp.parentWindow || window );\n\t\t\t}\n\t\t}\n\n\t\t// Fire handlers on the event path\n\t\ti = 0;\n\t\twhile ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {\n\t\t\tlastElement = cur;\n\t\t\tevent.type = i > 1 ?\n\t\t\t\tbubbleType :\n\t\t\t\tspecial.bindType || type;\n\n\t\t\t// jQuery handler\n\t\t\thandle = ( dataPriv.get( cur, \"events\" ) || {} )[ event.type ] &&\n\t\t\t\tdataPriv.get( cur, \"handle\" );\n\t\t\tif ( handle ) {\n\t\t\t\thandle.apply( cur, data );\n\t\t\t}\n\n\t\t\t// Native handler\n\t\t\thandle = ontype && cur[ ontype ];\n\t\t\tif ( handle && handle.apply && acceptData( cur ) ) {\n\t\t\t\tevent.result = handle.apply( cur, data );\n\t\t\t\tif ( event.result === false ) {\n\t\t\t\t\tevent.preventDefault();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tevent.type = type;\n\n\t\t// If nobody prevented the default action, do it now\n\t\tif ( !onlyHandlers && !event.isDefaultPrevented() ) {\n\n\t\t\tif ( ( !special._default ||\n\t\t\t\tspecial._default.apply( eventPath.pop(), data ) === false ) &&\n\t\t\t\tacceptData( elem ) ) {\n\n\t\t\t\t// Call a native DOM method on the target with the same name as the event.\n\t\t\t\t// Don't do default actions on window, that's where global variables be (#6170)\n\t\t\t\tif ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) {\n\n\t\t\t\t\t// Don't re-trigger an onFOO event when we call its FOO() method\n\t\t\t\t\ttmp = elem[ ontype ];\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = null;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Prevent re-triggering of the same event, since we already bubbled it above\n\t\t\t\t\tjQuery.event.triggered = type;\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.addEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\telem[ type ]();\n\n\t\t\t\t\tif ( event.isPropagationStopped() ) {\n\t\t\t\t\t\tlastElement.removeEventListener( type, stopPropagationCallback );\n\t\t\t\t\t}\n\n\t\t\t\t\tjQuery.event.triggered = undefined;\n\n\t\t\t\t\tif ( tmp ) {\n\t\t\t\t\t\telem[ ontype ] = tmp;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn event.result;\n\t},\n\n\t// Piggyback on a donor event to simulate a different one\n\t// Used only for `focus(in | out)` events\n\tsimulate: function( type, elem, event ) {\n\t\tvar e = jQuery.extend(\n\t\t\tnew jQuery.Event(),\n\t\t\tevent,\n\t\t\t{\n\t\t\t\ttype: type,\n\t\t\t\tisSimulated: true\n\t\t\t}\n\t\t);\n\n\t\tjQuery.event.trigger( e, null, elem );\n\t}\n\n} );\n\njQuery.fn.extend( {\n\n\ttrigger: function( type, data ) {\n\t\treturn this.each( function() {\n\t\t\tjQuery.event.trigger( type, data, this );\n\t\t} );\n\t},\n\ttriggerHandler: function( type, data ) {\n\t\tvar elem = this[ 0 ];\n\t\tif ( elem ) {\n\t\t\treturn jQuery.event.trigger( type, data, elem, true );\n\t\t}\n\t}\n} );\n\n\n// Support: Firefox <=44\n// Firefox doesn't have focus(in | out) events\n// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787\n//\n// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1\n// focus(in | out) events fire after focus & blur events,\n// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order\n// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857\nif ( !support.focusin ) {\n\tjQuery.each( { focus: \"focusin\", blur: \"focusout\" }, function( orig, fix ) {\n\n\t\t// Attach a single capturing handler on the document while someone wants focusin/focusout\n\t\tvar handler = function( event ) {\n\t\t\tjQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );\n\t\t};\n\n\t\tjQuery.event.special[ fix ] = {\n\t\t\tsetup: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix );\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.addEventListener( orig, handler, true );\n\t\t\t\t}\n\t\t\t\tdataPriv.access( doc, fix, ( attaches || 0 ) + 1 );\n\t\t\t},\n\t\t\tteardown: function() {\n\t\t\t\tvar doc = this.ownerDocument || this,\n\t\t\t\t\tattaches = dataPriv.access( doc, fix ) - 1;\n\n\t\t\t\tif ( !attaches ) {\n\t\t\t\t\tdoc.removeEventListener( orig, handler, true );\n\t\t\t\t\tdataPriv.remove( doc, fix );\n\n\t\t\t\t} else {\n\t\t\t\t\tdataPriv.access( doc, fix, attaches );\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t} );\n}\nvar location = window.location;\n\nvar nonce = Date.now();\n\nvar rquery = ( /\\?/ );\n\n\n\n// Cross-browser xml parsing\njQuery.parseXML = function( data ) {\n\tvar xml;\n\tif ( !data || typeof data !== \"string\" ) {\n\t\treturn null;\n\t}\n\n\t// Support: IE 9 - 11 only\n\t// IE throws on parseFromString with invalid input.\n\ttry {\n\t\txml = ( new window.DOMParser() ).parseFromString( data, \"text/xml\" );\n\t} catch ( e ) {\n\t\txml = undefined;\n\t}\n\n\tif ( !xml || xml.getElementsByTagName( \"parsererror\" ).length ) {\n\t\tjQuery.error( \"Invalid XML: \" + data );\n\t}\n\treturn xml;\n};\n\n\nvar\n\trbracket = /\\[\\]$/,\n\trCRLF = /\\r?\\n/g,\n\trsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,\n\trsubmittable = /^(?:input|select|textarea|keygen)/i;\n\nfunction buildParams( prefix, obj, traditional, add ) {\n\tvar name;\n\n\tif ( Array.isArray( obj ) ) {\n\n\t\t// Serialize array item.\n\t\tjQuery.each( obj, function( i, v ) {\n\t\t\tif ( traditional || rbracket.test( prefix ) ) {\n\n\t\t\t\t// Treat each array item as a scalar.\n\t\t\t\tadd( prefix, v );\n\n\t\t\t} else {\n\n\t\t\t\t// Item is non-scalar (array or object), encode its numeric index.\n\t\t\t\tbuildParams(\n\t\t\t\t\tprefix + \"[\" + ( typeof v === \"object\" && v != null ? i : \"\" ) + \"]\",\n\t\t\t\t\tv,\n\t\t\t\t\ttraditional,\n\t\t\t\t\tadd\n\t\t\t\t);\n\t\t\t}\n\t\t} );\n\n\t} else if ( !traditional && toType( obj ) === \"object\" ) {\n\n\t\t// Serialize object item.\n\t\tfor ( name in obj ) {\n\t\t\tbuildParams( prefix + \"[\" + name + \"]\", obj[ name ], traditional, add );\n\t\t}\n\n\t} else {\n\n\t\t// Serialize scalar item.\n\t\tadd( prefix, obj );\n\t}\n}\n\n// Serialize an array of form elements or a set of\n// key/values into a query string\njQuery.param = function( a, traditional ) {\n\tvar prefix,\n\t\ts = [],\n\t\tadd = function( key, valueOrFunction ) {\n\n\t\t\t// If value is a function, invoke it and use its return value\n\t\t\tvar value = isFunction( valueOrFunction ) ?\n\t\t\t\tvalueOrFunction() :\n\t\t\t\tvalueOrFunction;\n\n\t\t\ts[ s.length ] = encodeURIComponent( key ) + \"=\" +\n\t\t\t\tencodeURIComponent( value == null ? \"\" : value );\n\t\t};\n\n\t// If an array was passed in, assume that it is an array of form elements.\n\tif ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {\n\n\t\t// Serialize the form elements\n\t\tjQuery.each( a, function() {\n\t\t\tadd( this.name, this.value );\n\t\t} );\n\n\t} else {\n\n\t\t// If traditional, encode the \"old\" way (the way 1.3.2 or older\n\t\t// did it), otherwise encode params recursively.\n\t\tfor ( prefix in a ) {\n\t\t\tbuildParams( prefix, a[ prefix ], traditional, add );\n\t\t}\n\t}\n\n\t// Return the resulting serialization\n\treturn s.join( \"&\" );\n};\n\njQuery.fn.extend( {\n\tserialize: function() {\n\t\treturn jQuery.param( this.serializeArray() );\n\t},\n\tserializeArray: function() {\n\t\treturn this.map( function() {\n\n\t\t\t// Can add propHook for \"elements\" to filter or add form elements\n\t\t\tvar elements = jQuery.prop( this, \"elements\" );\n\t\t\treturn elements ? jQuery.makeArray( elements ) : this;\n\t\t} )\n\t\t.filter( function() {\n\t\t\tvar type = this.type;\n\n\t\t\t// Use .is( \":disabled\" ) so that fieldset[disabled] works\n\t\t\treturn this.name && !jQuery( this ).is( \":disabled\" ) &&\n\t\t\t\trsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&\n\t\t\t\t( this.checked || !rcheckableType.test( type ) );\n\t\t} )\n\t\t.map( function( i, elem ) {\n\t\t\tvar val = jQuery( this ).val();\n\n\t\t\tif ( val == null ) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif ( Array.isArray( val ) ) {\n\t\t\t\treturn jQuery.map( val, function( val ) {\n\t\t\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t\t\t} );\n\t\t\t}\n\n\t\t\treturn { name: elem.name, value: val.replace( rCRLF, \"\\r\\n\" ) };\n\t\t} ).get();\n\t}\n} );\n\n\nvar\n\tr20 = /%20/g,\n\trhash = /#.*$/,\n\trantiCache = /([?&])_=[^&]*/,\n\trheaders = /^(.*?):[ \\t]*([^\\r\\n]*)$/mg,\n\n\t// #7653, #8125, #8152: local protocol detection\n\trlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,\n\trnoContent = /^(?:GET|HEAD)$/,\n\trprotocol = /^\\/\\//,\n\n\t/* Prefilters\n\t * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)\n\t * 2) These are called:\n\t *    - BEFORE asking for a transport\n\t *    - AFTER param serialization (s.data is a string if s.processData is true)\n\t * 3) key is the dataType\n\t * 4) the catchall symbol \"*\" can be used\n\t * 5) execution will start with transport dataType and THEN continue down to \"*\" if needed\n\t */\n\tprefilters = {},\n\n\t/* Transports bindings\n\t * 1) key is the dataType\n\t * 2) the catchall symbol \"*\" can be used\n\t * 3) selection will start with transport dataType and THEN go to \"*\" if needed\n\t */\n\ttransports = {},\n\n\t// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression\n\tallTypes = \"*/\".concat( \"*\" ),\n\n\t// Anchor tag for parsing the document origin\n\toriginAnchor = document.createElement( \"a\" );\n\toriginAnchor.href = location.href;\n\n// Base \"constructor\" for jQuery.ajaxPrefilter and jQuery.ajaxTransport\nfunction addToPrefiltersOrTransports( structure ) {\n\n\t// dataTypeExpression is optional and defaults to \"*\"\n\treturn function( dataTypeExpression, func ) {\n\n\t\tif ( typeof dataTypeExpression !== \"string\" ) {\n\t\t\tfunc = dataTypeExpression;\n\t\t\tdataTypeExpression = \"*\";\n\t\t}\n\n\t\tvar dataType,\n\t\t\ti = 0,\n\t\t\tdataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || [];\n\n\t\tif ( isFunction( func ) ) {\n\n\t\t\t// For each dataType in the dataTypeExpression\n\t\t\twhile ( ( dataType = dataTypes[ i++ ] ) ) {\n\n\t\t\t\t// Prepend if requested\n\t\t\t\tif ( dataType[ 0 ] === \"+\" ) {\n\t\t\t\t\tdataType = dataType.slice( 1 ) || \"*\";\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );\n\n\t\t\t\t// Otherwise append\n\t\t\t\t} else {\n\t\t\t\t\t( structure[ dataType ] = structure[ dataType ] || [] ).push( func );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t};\n}\n\n// Base inspection function for prefilters and transports\nfunction inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {\n\n\tvar inspected = {},\n\t\tseekingTransport = ( structure === transports );\n\n\tfunction inspect( dataType ) {\n\t\tvar selected;\n\t\tinspected[ dataType ] = true;\n\t\tjQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {\n\t\t\tvar dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );\n\t\t\tif ( typeof dataTypeOrTransport === \"string\" &&\n\t\t\t\t!seekingTransport && !inspected[ dataTypeOrTransport ] ) {\n\n\t\t\t\toptions.dataTypes.unshift( dataTypeOrTransport );\n\t\t\t\tinspect( dataTypeOrTransport );\n\t\t\t\treturn false;\n\t\t\t} else if ( seekingTransport ) {\n\t\t\t\treturn !( selected = dataTypeOrTransport );\n\t\t\t}\n\t\t} );\n\t\treturn selected;\n\t}\n\n\treturn inspect( options.dataTypes[ 0 ] ) || !inspected[ \"*\" ] && inspect( \"*\" );\n}\n\n// A special extend for ajax options\n// that takes \"flat\" options (not to be deep extended)\n// Fixes #9887\nfunction ajaxExtend( target, src ) {\n\tvar key, deep,\n\t\tflatOptions = jQuery.ajaxSettings.flatOptions || {};\n\n\tfor ( key in src ) {\n\t\tif ( src[ key ] !== undefined ) {\n\t\t\t( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];\n\t\t}\n\t}\n\tif ( deep ) {\n\t\tjQuery.extend( true, target, deep );\n\t}\n\n\treturn target;\n}\n\n/* Handles responses to an ajax request:\n * - finds the right dataType (mediates between content-type and expected dataType)\n * - returns the corresponding response\n */\nfunction ajaxHandleResponses( s, jqXHR, responses ) {\n\n\tvar ct, type, finalDataType, firstDataType,\n\t\tcontents = s.contents,\n\t\tdataTypes = s.dataTypes;\n\n\t// Remove auto dataType and get content-type in the process\n\twhile ( dataTypes[ 0 ] === \"*\" ) {\n\t\tdataTypes.shift();\n\t\tif ( ct === undefined ) {\n\t\t\tct = s.mimeType || jqXHR.getResponseHeader( \"Content-Type\" );\n\t\t}\n\t}\n\n\t// Check if we're dealing with a known content-type\n\tif ( ct ) {\n\t\tfor ( type in contents ) {\n\t\t\tif ( contents[ type ] && contents[ type ].test( ct ) ) {\n\t\t\t\tdataTypes.unshift( type );\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t// Check to see if we have a response for the expected dataType\n\tif ( dataTypes[ 0 ] in responses ) {\n\t\tfinalDataType = dataTypes[ 0 ];\n\t} else {\n\n\t\t// Try convertible dataTypes\n\t\tfor ( type in responses ) {\n\t\t\tif ( !dataTypes[ 0 ] || s.converters[ type + \" \" + dataTypes[ 0 ] ] ) {\n\t\t\t\tfinalDataType = type;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif ( !firstDataType ) {\n\t\t\t\tfirstDataType = type;\n\t\t\t}\n\t\t}\n\n\t\t// Or just use first one\n\t\tfinalDataType = finalDataType || firstDataType;\n\t}\n\n\t// If we found a dataType\n\t// We add the dataType to the list if needed\n\t// and return the corresponding response\n\tif ( finalDataType ) {\n\t\tif ( finalDataType !== dataTypes[ 0 ] ) {\n\t\t\tdataTypes.unshift( finalDataType );\n\t\t}\n\t\treturn responses[ finalDataType ];\n\t}\n}\n\n/* Chain conversions given the request and the original response\n * Also sets the responseXXX fields on the jqXHR instance\n */\nfunction ajaxConvert( s, response, jqXHR, isSuccess ) {\n\tvar conv2, current, conv, tmp, prev,\n\t\tconverters = {},\n\n\t\t// Work with a copy of dataTypes in case we need to modify it for conversion\n\t\tdataTypes = s.dataTypes.slice();\n\n\t// Create converters map with lowercased keys\n\tif ( dataTypes[ 1 ] ) {\n\t\tfor ( conv in s.converters ) {\n\t\t\tconverters[ conv.toLowerCase() ] = s.converters[ conv ];\n\t\t}\n\t}\n\n\tcurrent = dataTypes.shift();\n\n\t// Convert to each sequential dataType\n\twhile ( current ) {\n\n\t\tif ( s.responseFields[ current ] ) {\n\t\t\tjqXHR[ s.responseFields[ current ] ] = response;\n\t\t}\n\n\t\t// Apply the dataFilter if provided\n\t\tif ( !prev && isSuccess && s.dataFilter ) {\n\t\t\tresponse = s.dataFilter( response, s.dataType );\n\t\t}\n\n\t\tprev = current;\n\t\tcurrent = dataTypes.shift();\n\n\t\tif ( current ) {\n\n\t\t\t// There's only work to do if current dataType is non-auto\n\t\t\tif ( current === \"*\" ) {\n\n\t\t\t\tcurrent = prev;\n\n\t\t\t// Convert response if prev dataType is non-auto and differs from current\n\t\t\t} else if ( prev !== \"*\" && prev !== current ) {\n\n\t\t\t\t// Seek a direct converter\n\t\t\t\tconv = converters[ prev + \" \" + current ] || converters[ \"* \" + current ];\n\n\t\t\t\t// If none found, seek a pair\n\t\t\t\tif ( !conv ) {\n\t\t\t\t\tfor ( conv2 in converters ) {\n\n\t\t\t\t\t\t// If conv2 outputs current\n\t\t\t\t\t\ttmp = conv2.split( \" \" );\n\t\t\t\t\t\tif ( tmp[ 1 ] === current ) {\n\n\t\t\t\t\t\t\t// If prev can be converted to accepted input\n\t\t\t\t\t\t\tconv = converters[ prev + \" \" + tmp[ 0 ] ] ||\n\t\t\t\t\t\t\t\tconverters[ \"* \" + tmp[ 0 ] ];\n\t\t\t\t\t\t\tif ( conv ) {\n\n\t\t\t\t\t\t\t\t// Condense equivalence converters\n\t\t\t\t\t\t\t\tif ( conv === true ) {\n\t\t\t\t\t\t\t\t\tconv = converters[ conv2 ];\n\n\t\t\t\t\t\t\t\t// Otherwise, insert the intermediate dataType\n\t\t\t\t\t\t\t\t} else if ( converters[ conv2 ] !== true ) {\n\t\t\t\t\t\t\t\t\tcurrent = tmp[ 0 ];\n\t\t\t\t\t\t\t\t\tdataTypes.unshift( tmp[ 1 ] );\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Apply converter (if not an equivalence)\n\t\t\t\tif ( conv !== true ) {\n\n\t\t\t\t\t// Unless errors are allowed to bubble, catch and return them\n\t\t\t\t\tif ( conv && s.throws ) {\n\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t} else {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tresponse = conv( response );\n\t\t\t\t\t\t} catch ( e ) {\n\t\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\t\tstate: \"parsererror\",\n\t\t\t\t\t\t\t\terror: conv ? e : \"No conversion from \" + prev + \" to \" + current\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { state: \"success\", data: response };\n}\n\njQuery.extend( {\n\n\t// Counter for holding the number of active queries\n\tactive: 0,\n\n\t// Last-Modified header cache for next request\n\tlastModified: {},\n\tetag: {},\n\n\tajaxSettings: {\n\t\turl: location.href,\n\t\ttype: \"GET\",\n\t\tisLocal: rlocalProtocol.test( location.protocol ),\n\t\tglobal: true,\n\t\tprocessData: true,\n\t\tasync: true,\n\t\tcontentType: \"application/x-www-form-urlencoded; charset=UTF-8\",\n\n\t\t/*\n\t\ttimeout: 0,\n\t\tdata: null,\n\t\tdataType: null,\n\t\tusername: null,\n\t\tpassword: null,\n\t\tcache: null,\n\t\tthrows: false,\n\t\ttraditional: false,\n\t\theaders: {},\n\t\t*/\n\n\t\taccepts: {\n\t\t\t\"*\": allTypes,\n\t\t\ttext: \"text/plain\",\n\t\t\thtml: \"text/html\",\n\t\t\txml: \"application/xml, text/xml\",\n\t\t\tjson: \"application/json, text/javascript\"\n\t\t},\n\n\t\tcontents: {\n\t\t\txml: /\\bxml\\b/,\n\t\t\thtml: /\\bhtml/,\n\t\t\tjson: /\\bjson\\b/\n\t\t},\n\n\t\tresponseFields: {\n\t\t\txml: \"responseXML\",\n\t\t\ttext: \"responseText\",\n\t\t\tjson: \"responseJSON\"\n\t\t},\n\n\t\t// Data converters\n\t\t// Keys separate source (or catchall \"*\") and destination types with a single space\n\t\tconverters: {\n\n\t\t\t// Convert anything to text\n\t\t\t\"* text\": String,\n\n\t\t\t// Text to html (true = no transformation)\n\t\t\t\"text html\": true,\n\n\t\t\t// Evaluate text as a json expression\n\t\t\t\"text json\": JSON.parse,\n\n\t\t\t// Parse text as xml\n\t\t\t\"text xml\": jQuery.parseXML\n\t\t},\n\n\t\t// For options that shouldn't be deep extended:\n\t\t// you can add your own custom options here if\n\t\t// and when you create one that shouldn't be\n\t\t// deep extended (see ajaxExtend)\n\t\tflatOptions: {\n\t\t\turl: true,\n\t\t\tcontext: true\n\t\t}\n\t},\n\n\t// Creates a full fledged settings object into target\n\t// with both ajaxSettings and settings fields.\n\t// If target is omitted, writes into ajaxSettings.\n\tajaxSetup: function( target, settings ) {\n\t\treturn settings ?\n\n\t\t\t// Building a settings object\n\t\t\tajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :\n\n\t\t\t// Extending ajaxSettings\n\t\t\tajaxExtend( jQuery.ajaxSettings, target );\n\t},\n\n\tajaxPrefilter: addToPrefiltersOrTransports( prefilters ),\n\tajaxTransport: addToPrefiltersOrTransports( transports ),\n\n\t// Main method\n\tajax: function( url, options ) {\n\n\t\t// If url is an object, simulate pre-1.5 signature\n\t\tif ( typeof url === \"object\" ) {\n\t\t\toptions = url;\n\t\t\turl = undefined;\n\t\t}\n\n\t\t// Force options to be an object\n\t\toptions = options || {};\n\n\t\tvar transport,\n\n\t\t\t// URL without anti-cache param\n\t\t\tcacheURL,\n\n\t\t\t// Response headers\n\t\t\tresponseHeadersString,\n\t\t\tresponseHeaders,\n\n\t\t\t// timeout handle\n\t\t\ttimeoutTimer,\n\n\t\t\t// Url cleanup var\n\t\t\turlAnchor,\n\n\t\t\t// Request state (becomes false upon send and true upon completion)\n\t\t\tcompleted,\n\n\t\t\t// To know if global events are to be dispatched\n\t\t\tfireGlobals,\n\n\t\t\t// Loop variable\n\t\t\ti,\n\n\t\t\t// uncached part of the url\n\t\t\tuncached,\n\n\t\t\t// Create the final options object\n\t\t\ts = jQuery.ajaxSetup( {}, options ),\n\n\t\t\t// Callbacks context\n\t\t\tcallbackContext = s.context || s,\n\n\t\t\t// Context for global events is callbackContext if it is a DOM node or jQuery collection\n\t\t\tglobalEventContext = s.context &&\n\t\t\t\t( callbackContext.nodeType || callbackContext.jquery ) ?\n\t\t\t\t\tjQuery( callbackContext ) :\n\t\t\t\t\tjQuery.event,\n\n\t\t\t// Deferreds\n\t\t\tdeferred = jQuery.Deferred(),\n\t\t\tcompleteDeferred = jQuery.Callbacks( \"once memory\" ),\n\n\t\t\t// Status-dependent callbacks\n\t\t\tstatusCode = s.statusCode || {},\n\n\t\t\t// Headers (they are sent all at once)\n\t\t\trequestHeaders = {},\n\t\t\trequestHeadersNames = {},\n\n\t\t\t// Default abort message\n\t\t\tstrAbort = \"canceled\",\n\n\t\t\t// Fake xhr\n\t\t\tjqXHR = {\n\t\t\t\treadyState: 0,\n\n\t\t\t\t// Builds headers hashtable if needed\n\t\t\t\tgetResponseHeader: function( key ) {\n\t\t\t\t\tvar match;\n\t\t\t\t\tif ( completed ) {\n\t\t\t\t\t\tif ( !responseHeaders ) {\n\t\t\t\t\t\t\tresponseHeaders = {};\n\t\t\t\t\t\t\twhile ( ( match = rheaders.exec( responseHeadersString ) ) ) {\n\t\t\t\t\t\t\t\tresponseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tmatch = responseHeaders[ key.toLowerCase() ];\n\t\t\t\t\t}\n\t\t\t\t\treturn match == null ? null : match;\n\t\t\t\t},\n\n\t\t\t\t// Raw string\n\t\t\t\tgetAllResponseHeaders: function() {\n\t\t\t\t\treturn completed ? responseHeadersString : null;\n\t\t\t\t},\n\n\t\t\t\t// Caches the header\n\t\t\t\tsetRequestHeader: function( name, value ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\tname = requestHeadersNames[ name.toLowerCase() ] =\n\t\t\t\t\t\t\trequestHeadersNames[ name.toLowerCase() ] || name;\n\t\t\t\t\t\trequestHeaders[ name ] = value;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Overrides response content-type header\n\t\t\t\toverrideMimeType: function( type ) {\n\t\t\t\t\tif ( completed == null ) {\n\t\t\t\t\t\ts.mimeType = type;\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Status-dependent callbacks\n\t\t\t\tstatusCode: function( map ) {\n\t\t\t\t\tvar code;\n\t\t\t\t\tif ( map ) {\n\t\t\t\t\t\tif ( completed ) {\n\n\t\t\t\t\t\t\t// Execute the appropriate callbacks\n\t\t\t\t\t\t\tjqXHR.always( map[ jqXHR.status ] );\n\t\t\t\t\t\t} else {\n\n\t\t\t\t\t\t\t// Lazy-add the new callbacks in a way that preserves old ones\n\t\t\t\t\t\t\tfor ( code in map ) {\n\t\t\t\t\t\t\t\tstatusCode[ code ] = [ statusCode[ code ], map[ code ] ];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn this;\n\t\t\t\t},\n\n\t\t\t\t// Cancel the request\n\t\t\t\tabort: function( statusText ) {\n\t\t\t\t\tvar finalText = statusText || strAbort;\n\t\t\t\t\tif ( transport ) {\n\t\t\t\t\t\ttransport.abort( finalText );\n\t\t\t\t\t}\n\t\t\t\t\tdone( 0, finalText );\n\t\t\t\t\treturn this;\n\t\t\t\t}\n\t\t\t};\n\n\t\t// Attach deferreds\n\t\tdeferred.promise( jqXHR );\n\n\t\t// Add protocol if not provided (prefilters might expect it)\n\t\t// Handle falsy url in the settings object (#10093: consistency with old signature)\n\t\t// We also use the url parameter if available\n\t\ts.url = ( ( url || s.url || location.href ) + \"\" )\n\t\t\t.replace( rprotocol, location.protocol + \"//\" );\n\n\t\t// Alias method option to type as per ticket #12004\n\t\ts.type = options.method || options.type || s.method || s.type;\n\n\t\t// Extract dataTypes list\n\t\ts.dataTypes = ( s.dataType || \"*\" ).toLowerCase().match( rnothtmlwhite ) || [ \"\" ];\n\n\t\t// A cross-domain request is in order when the origin doesn't match the current origin.\n\t\tif ( s.crossDomain == null ) {\n\t\t\turlAnchor = document.createElement( \"a\" );\n\n\t\t\t// Support: IE <=8 - 11, Edge 12 - 15\n\t\t\t// IE throws exception on accessing the href property if url is malformed,\n\t\t\t// e.g. http://example.com:80x/\n\t\t\ttry {\n\t\t\t\turlAnchor.href = s.url;\n\n\t\t\t\t// Support: IE <=8 - 11 only\n\t\t\t\t// Anchor's host property isn't correctly set when s.url is relative\n\t\t\t\turlAnchor.href = urlAnchor.href;\n\t\t\t\ts.crossDomain = originAnchor.protocol + \"//\" + originAnchor.host !==\n\t\t\t\t\turlAnchor.protocol + \"//\" + urlAnchor.host;\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// If there is an error parsing the URL, assume it is crossDomain,\n\t\t\t\t// it can be rejected by the transport if it is invalid\n\t\t\t\ts.crossDomain = true;\n\t\t\t}\n\t\t}\n\n\t\t// Convert data if not already a string\n\t\tif ( s.data && s.processData && typeof s.data !== \"string\" ) {\n\t\t\ts.data = jQuery.param( s.data, s.traditional );\n\t\t}\n\n\t\t// Apply prefilters\n\t\tinspectPrefiltersOrTransports( prefilters, s, options, jqXHR );\n\n\t\t// If request was aborted inside a prefilter, stop there\n\t\tif ( completed ) {\n\t\t\treturn jqXHR;\n\t\t}\n\n\t\t// We can fire global events as of now if asked to\n\t\t// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)\n\t\tfireGlobals = jQuery.event && s.global;\n\n\t\t// Watch for a new set of requests\n\t\tif ( fireGlobals && jQuery.active++ === 0 ) {\n\t\t\tjQuery.event.trigger( \"ajaxStart\" );\n\t\t}\n\n\t\t// Uppercase the type\n\t\ts.type = s.type.toUpperCase();\n\n\t\t// Determine if request has content\n\t\ts.hasContent = !rnoContent.test( s.type );\n\n\t\t// Save the URL in case we're toying with the If-Modified-Since\n\t\t// and/or If-None-Match header later on\n\t\t// Remove hash to simplify url manipulation\n\t\tcacheURL = s.url.replace( rhash, \"\" );\n\n\t\t// More options handling for requests with no content\n\t\tif ( !s.hasContent ) {\n\n\t\t\t// Remember the hash so we can put it back\n\t\t\tuncached = s.url.slice( cacheURL.length );\n\n\t\t\t// If data is available and should be processed, append data to url\n\t\t\tif ( s.data && ( s.processData || typeof s.data === \"string\" ) ) {\n\t\t\t\tcacheURL += ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + s.data;\n\n\t\t\t\t// #9682: remove data so that it's not used in an eventual retry\n\t\t\t\tdelete s.data;\n\t\t\t}\n\n\t\t\t// Add or update anti-cache param if needed\n\t\t\tif ( s.cache === false ) {\n\t\t\t\tcacheURL = cacheURL.replace( rantiCache, \"$1\" );\n\t\t\t\tuncached = ( rquery.test( cacheURL ) ? \"&\" : \"?\" ) + \"_=\" + ( nonce++ ) + uncached;\n\t\t\t}\n\n\t\t\t// Put hash and anti-cache on the URL that will be requested (gh-1732)\n\t\t\ts.url = cacheURL + uncached;\n\n\t\t// Change '%20' to '+' if this is encoded form body content (gh-2658)\n\t\t} else if ( s.data && s.processData &&\n\t\t\t( s.contentType || \"\" ).indexOf( \"application/x-www-form-urlencoded\" ) === 0 ) {\n\t\t\ts.data = s.data.replace( r20, \"+\" );\n\t\t}\n\n\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\tif ( s.ifModified ) {\n\t\t\tif ( jQuery.lastModified[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-Modified-Since\", jQuery.lastModified[ cacheURL ] );\n\t\t\t}\n\t\t\tif ( jQuery.etag[ cacheURL ] ) {\n\t\t\t\tjqXHR.setRequestHeader( \"If-None-Match\", jQuery.etag[ cacheURL ] );\n\t\t\t}\n\t\t}\n\n\t\t// Set the correct header, if data is being sent\n\t\tif ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {\n\t\t\tjqXHR.setRequestHeader( \"Content-Type\", s.contentType );\n\t\t}\n\n\t\t// Set the Accepts header for the server, depending on the dataType\n\t\tjqXHR.setRequestHeader(\n\t\t\t\"Accept\",\n\t\t\ts.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?\n\t\t\t\ts.accepts[ s.dataTypes[ 0 ] ] +\n\t\t\t\t\t( s.dataTypes[ 0 ] !== \"*\" ? \", \" + allTypes + \"; q=0.01\" : \"\" ) :\n\t\t\t\ts.accepts[ \"*\" ]\n\t\t);\n\n\t\t// Check for headers option\n\t\tfor ( i in s.headers ) {\n\t\t\tjqXHR.setRequestHeader( i, s.headers[ i ] );\n\t\t}\n\n\t\t// Allow custom headers/mimetypes and early abort\n\t\tif ( s.beforeSend &&\n\t\t\t( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) {\n\n\t\t\t// Abort if not done already and return\n\t\t\treturn jqXHR.abort();\n\t\t}\n\n\t\t// Aborting is no longer a cancellation\n\t\tstrAbort = \"abort\";\n\n\t\t// Install callbacks on deferreds\n\t\tcompleteDeferred.add( s.complete );\n\t\tjqXHR.done( s.success );\n\t\tjqXHR.fail( s.error );\n\n\t\t// Get transport\n\t\ttransport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );\n\n\t\t// If no transport, we auto-abort\n\t\tif ( !transport ) {\n\t\t\tdone( -1, \"No Transport\" );\n\t\t} else {\n\t\t\tjqXHR.readyState = 1;\n\n\t\t\t// Send global event\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxSend\", [ jqXHR, s ] );\n\t\t\t}\n\n\t\t\t// If request was aborted inside ajaxSend, stop there\n\t\t\tif ( completed ) {\n\t\t\t\treturn jqXHR;\n\t\t\t}\n\n\t\t\t// Timeout\n\t\t\tif ( s.async && s.timeout > 0 ) {\n\t\t\t\ttimeoutTimer = window.setTimeout( function() {\n\t\t\t\t\tjqXHR.abort( \"timeout\" );\n\t\t\t\t}, s.timeout );\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tcompleted = false;\n\t\t\t\ttransport.send( requestHeaders, done );\n\t\t\t} catch ( e ) {\n\n\t\t\t\t// Rethrow post-completion exceptions\n\t\t\t\tif ( completed ) {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\n\t\t\t\t// Propagate others as results\n\t\t\t\tdone( -1, e );\n\t\t\t}\n\t\t}\n\n\t\t// Callback for when everything is done\n\t\tfunction done( status, nativeStatusText, responses, headers ) {\n\t\t\tvar isSuccess, success, error, response, modified,\n\t\t\t\tstatusText = nativeStatusText;\n\n\t\t\t// Ignore repeat invocations\n\t\t\tif ( completed ) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tcompleted = true;\n\n\t\t\t// Clear timeout if it exists\n\t\t\tif ( timeoutTimer ) {\n\t\t\t\twindow.clearTimeout( timeoutTimer );\n\t\t\t}\n\n\t\t\t// Dereference transport for early garbage collection\n\t\t\t// (no matter how long the jqXHR object will be used)\n\t\t\ttransport = undefined;\n\n\t\t\t// Cache response headers\n\t\t\tresponseHeadersString = headers || \"\";\n\n\t\t\t// Set readyState\n\t\t\tjqXHR.readyState = status > 0 ? 4 : 0;\n\n\t\t\t// Determine if successful\n\t\t\tisSuccess = status >= 200 && status < 300 || status === 304;\n\n\t\t\t// Get response data\n\t\t\tif ( responses ) {\n\t\t\t\tresponse = ajaxHandleResponses( s, jqXHR, responses );\n\t\t\t}\n\n\t\t\t// Convert no matter what (that way responseXXX fields are always set)\n\t\t\tresponse = ajaxConvert( s, response, jqXHR, isSuccess );\n\n\t\t\t// If successful, handle type chaining\n\t\t\tif ( isSuccess ) {\n\n\t\t\t\t// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.\n\t\t\t\tif ( s.ifModified ) {\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"Last-Modified\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.lastModified[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t\tmodified = jqXHR.getResponseHeader( \"etag\" );\n\t\t\t\t\tif ( modified ) {\n\t\t\t\t\t\tjQuery.etag[ cacheURL ] = modified;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// if no content\n\t\t\t\tif ( status === 204 || s.type === \"HEAD\" ) {\n\t\t\t\t\tstatusText = \"nocontent\";\n\n\t\t\t\t// if not modified\n\t\t\t\t} else if ( status === 304 ) {\n\t\t\t\t\tstatusText = \"notmodified\";\n\n\t\t\t\t// If we have data, let's convert it\n\t\t\t\t} else {\n\t\t\t\t\tstatusText = response.state;\n\t\t\t\t\tsuccess = response.data;\n\t\t\t\t\terror = response.error;\n\t\t\t\t\tisSuccess = !error;\n\t\t\t\t}\n\t\t\t} else {\n\n\t\t\t\t// Extract error from statusText and normalize for non-aborts\n\t\t\t\terror = statusText;\n\t\t\t\tif ( status || !statusText ) {\n\t\t\t\t\tstatusText = \"error\";\n\t\t\t\t\tif ( status < 0 ) {\n\t\t\t\t\t\tstatus = 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Set data for the fake xhr object\n\t\t\tjqXHR.status = status;\n\t\t\tjqXHR.statusText = ( nativeStatusText || statusText ) + \"\";\n\n\t\t\t// Success/Error\n\t\t\tif ( isSuccess ) {\n\t\t\t\tdeferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );\n\t\t\t} else {\n\t\t\t\tdeferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );\n\t\t\t}\n\n\t\t\t// Status-dependent callbacks\n\t\t\tjqXHR.statusCode( statusCode );\n\t\t\tstatusCode = undefined;\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( isSuccess ? \"ajaxSuccess\" : \"ajaxError\",\n\t\t\t\t\t[ jqXHR, s, isSuccess ? success : error ] );\n\t\t\t}\n\n\t\t\t// Complete\n\t\t\tcompleteDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );\n\n\t\t\tif ( fireGlobals ) {\n\t\t\t\tglobalEventContext.trigger( \"ajaxComplete\", [ jqXHR, s ] );\n\n\t\t\t\t// Handle the global AJAX counter\n\t\t\t\tif ( !( --jQuery.active ) ) {\n\t\t\t\t\tjQuery.event.trigger( \"ajaxStop\" );\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn jqXHR;\n\t},\n\n\tgetJSON: function( url, data, callback ) {\n\t\treturn jQuery.get( url, data, callback, \"json\" );\n\t},\n\n\tgetScript: function( url, callback ) {\n\t\treturn jQuery.get( url, undefined, callback, \"script\" );\n\t}\n} );\n\njQuery.each( [ \"get\", \"post\" ], function( i, method ) {\n\tjQuery[ method ] = function( url, data, callback, type ) {\n\n\t\t// Shift arguments if data argument was omitted\n\t\tif ( isFunction( data ) ) {\n\t\t\ttype = type || callback;\n\t\t\tcallback = data;\n\t\t\tdata = undefined;\n\t\t}\n\n\t\t// The url can be an options object (which then must have .url)\n\t\treturn jQuery.ajax( jQuery.extend( {\n\t\t\turl: url,\n\t\t\ttype: method,\n\t\t\tdataType: type,\n\t\t\tdata: data,\n\t\t\tsuccess: callback\n\t\t}, jQuery.isPlainObject( url ) && url ) );\n\t};\n} );\n\n\njQuery._evalUrl = function( url ) {\n\treturn jQuery.ajax( {\n\t\turl: url,\n\n\t\t// Make this explicit, since user can override this through ajaxSetup (#11264)\n\t\ttype: \"GET\",\n\t\tdataType: \"script\",\n\t\tcache: true,\n\t\tasync: false,\n\t\tglobal: false,\n\t\t\"throws\": true\n\t} );\n};\n\n\njQuery.fn.extend( {\n\twrapAll: function( html ) {\n\t\tvar wrap;\n\n\t\tif ( this[ 0 ] ) {\n\t\t\tif ( isFunction( html ) ) {\n\t\t\t\thtml = html.call( this[ 0 ] );\n\t\t\t}\n\n\t\t\t// The elements to wrap the target around\n\t\t\twrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );\n\n\t\t\tif ( this[ 0 ].parentNode ) {\n\t\t\t\twrap.insertBefore( this[ 0 ] );\n\t\t\t}\n\n\t\t\twrap.map( function() {\n\t\t\t\tvar elem = this;\n\n\t\t\t\twhile ( elem.firstElementChild ) {\n\t\t\t\t\telem = elem.firstElementChild;\n\t\t\t\t}\n\n\t\t\t\treturn elem;\n\t\t\t} ).append( this );\n\t\t}\n\n\t\treturn this;\n\t},\n\n\twrapInner: function( html ) {\n\t\tif ( isFunction( html ) ) {\n\t\t\treturn this.each( function( i ) {\n\t\t\t\tjQuery( this ).wrapInner( html.call( this, i ) );\n\t\t\t} );\n\t\t}\n\n\t\treturn this.each( function() {\n\t\t\tvar self = jQuery( this ),\n\t\t\t\tcontents = self.contents();\n\n\t\t\tif ( contents.length ) {\n\t\t\t\tcontents.wrapAll( html );\n\n\t\t\t} else {\n\t\t\t\tself.append( html );\n\t\t\t}\n\t\t} );\n\t},\n\n\twrap: function( html ) {\n\t\tvar htmlIsFunction = isFunction( html );\n\n\t\treturn this.each( function( i ) {\n\t\t\tjQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html );\n\t\t} );\n\t},\n\n\tunwrap: function( selector ) {\n\t\tthis.parent( selector ).not( \"body\" ).each( function() {\n\t\t\tjQuery( this ).replaceWith( this.childNodes );\n\t\t} );\n\t\treturn this;\n\t}\n} );\n\n\njQuery.expr.pseudos.hidden = function( elem ) {\n\treturn !jQuery.expr.pseudos.visible( elem );\n};\njQuery.expr.pseudos.visible = function( elem ) {\n\treturn !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length );\n};\n\n\n\n\njQuery.ajaxSettings.xhr = function() {\n\ttry {\n\t\treturn new window.XMLHttpRequest();\n\t} catch ( e ) {}\n};\n\nvar xhrSuccessStatus = {\n\n\t\t// File protocol always yields status code 0, assume 200\n\t\t0: 200,\n\n\t\t// Support: IE <=9 only\n\t\t// #1450: sometimes IE returns 1223 when it should be 204\n\t\t1223: 204\n\t},\n\txhrSupported = jQuery.ajaxSettings.xhr();\n\nsupport.cors = !!xhrSupported && ( \"withCredentials\" in xhrSupported );\nsupport.ajax = xhrSupported = !!xhrSupported;\n\njQuery.ajaxTransport( function( options ) {\n\tvar callback, errorCallback;\n\n\t// Cross domain only allowed if supported through XMLHttpRequest\n\tif ( support.cors || xhrSupported && !options.crossDomain ) {\n\t\treturn {\n\t\t\tsend: function( headers, complete ) {\n\t\t\t\tvar i,\n\t\t\t\t\txhr = options.xhr();\n\n\t\t\t\txhr.open(\n\t\t\t\t\toptions.type,\n\t\t\t\t\toptions.url,\n\t\t\t\t\toptions.async,\n\t\t\t\t\toptions.username,\n\t\t\t\t\toptions.password\n\t\t\t\t);\n\n\t\t\t\t// Apply custom fields if provided\n\t\t\t\tif ( options.xhrFields ) {\n\t\t\t\t\tfor ( i in options.xhrFields ) {\n\t\t\t\t\t\txhr[ i ] = options.xhrFields[ i ];\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Override mime type if needed\n\t\t\t\tif ( options.mimeType && xhr.overrideMimeType ) {\n\t\t\t\t\txhr.overrideMimeType( options.mimeType );\n\t\t\t\t}\n\n\t\t\t\t// X-Requested-With header\n\t\t\t\t// For cross-domain requests, seeing as conditions for a preflight are\n\t\t\t\t// akin to a jigsaw puzzle, we simply never set it to be sure.\n\t\t\t\t// (it can always be set on a per-request basis or even using ajaxSetup)\n\t\t\t\t// For same-domain requests, won't change header if already provided.\n\t\t\t\tif ( !options.crossDomain && !headers[ \"X-Requested-With\" ] ) {\n\t\t\t\t\theaders[ \"X-Requested-With\" ] = \"XMLHttpRequest\";\n\t\t\t\t}\n\n\t\t\t\t// Set headers\n\t\t\t\tfor ( i in headers ) {\n\t\t\t\t\txhr.setRequestHeader( i, headers[ i ] );\n\t\t\t\t}\n\n\t\t\t\t// Callback\n\t\t\t\tcallback = function( type ) {\n\t\t\t\t\treturn function() {\n\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\tcallback = errorCallback = xhr.onload =\n\t\t\t\t\t\t\t\txhr.onerror = xhr.onabort = xhr.ontimeout =\n\t\t\t\t\t\t\t\t\txhr.onreadystatechange = null;\n\n\t\t\t\t\t\t\tif ( type === \"abort\" ) {\n\t\t\t\t\t\t\t\txhr.abort();\n\t\t\t\t\t\t\t} else if ( type === \"error\" ) {\n\n\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t// On a manual native abort, IE9 throws\n\t\t\t\t\t\t\t\t// errors on any property access that is not readyState\n\t\t\t\t\t\t\t\tif ( typeof xhr.status !== \"number\" ) {\n\t\t\t\t\t\t\t\t\tcomplete( 0, \"error\" );\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tcomplete(\n\n\t\t\t\t\t\t\t\t\t\t// File: protocol always yields status 0; see #8605, #14207\n\t\t\t\t\t\t\t\t\t\txhr.status,\n\t\t\t\t\t\t\t\t\t\txhr.statusText\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tcomplete(\n\t\t\t\t\t\t\t\t\txhrSuccessStatus[ xhr.status ] || xhr.status,\n\t\t\t\t\t\t\t\t\txhr.statusText,\n\n\t\t\t\t\t\t\t\t\t// Support: IE <=9 only\n\t\t\t\t\t\t\t\t\t// IE9 has no XHR2 but throws on binary (trac-11426)\n\t\t\t\t\t\t\t\t\t// For XHR2 non-text, let the caller handle it (gh-2498)\n\t\t\t\t\t\t\t\t\t( xhr.responseType || \"text\" ) !== \"text\"  ||\n\t\t\t\t\t\t\t\t\ttypeof xhr.responseText !== \"string\" ?\n\t\t\t\t\t\t\t\t\t\t{ binary: xhr.response } :\n\t\t\t\t\t\t\t\t\t\t{ text: xhr.responseText },\n\t\t\t\t\t\t\t\t\txhr.getAllResponseHeaders()\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t};\n\n\t\t\t\t// Listen to events\n\t\t\t\txhr.onload = callback();\n\t\t\t\terrorCallback = xhr.onerror = xhr.ontimeout = callback( \"error\" );\n\n\t\t\t\t// Support: IE 9 only\n\t\t\t\t// Use onreadystatechange to replace onabort\n\t\t\t\t// to handle uncaught aborts\n\t\t\t\tif ( xhr.onabort !== undefined ) {\n\t\t\t\t\txhr.onabort = errorCallback;\n\t\t\t\t} else {\n\t\t\t\t\txhr.onreadystatechange = function() {\n\n\t\t\t\t\t\t// Check readyState before timeout as it changes\n\t\t\t\t\t\tif ( xhr.readyState === 4 ) {\n\n\t\t\t\t\t\t\t// Allow onerror to be called first,\n\t\t\t\t\t\t\t// but that will not handle a native abort\n\t\t\t\t\t\t\t// Also, save errorCallback to a variable\n\t\t\t\t\t\t\t// as xhr.onerror cannot be accessed\n\t\t\t\t\t\t\twindow.setTimeout( function() {\n\t\t\t\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\t\t\t\terrorCallback();\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\t// Create the abort callback\n\t\t\t\tcallback = callback( \"abort\" );\n\n\t\t\t\ttry {\n\n\t\t\t\t\t// Do send the request (this may raise an exception)\n\t\t\t\t\txhr.send( options.hasContent && options.data || null );\n\t\t\t\t} catch ( e ) {\n\n\t\t\t\t\t// #14683: Only rethrow if this hasn't been notified as an error yet\n\t\t\t\t\tif ( callback ) {\n\t\t\t\t\t\tthrow e;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\n// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)\njQuery.ajaxPrefilter( function( s ) {\n\tif ( s.crossDomain ) {\n\t\ts.contents.script = false;\n\t}\n} );\n\n// Install script dataType\njQuery.ajaxSetup( {\n\taccepts: {\n\t\tscript: \"text/javascript, application/javascript, \" +\n\t\t\t\"application/ecmascript, application/x-ecmascript\"\n\t},\n\tcontents: {\n\t\tscript: /\\b(?:java|ecma)script\\b/\n\t},\n\tconverters: {\n\t\t\"text script\": function( text ) {\n\t\t\tjQuery.globalEval( text );\n\t\t\treturn text;\n\t\t}\n\t}\n} );\n\n// Handle cache's special case and crossDomain\njQuery.ajaxPrefilter( \"script\", function( s ) {\n\tif ( s.cache === undefined ) {\n\t\ts.cache = false;\n\t}\n\tif ( s.crossDomain ) {\n\t\ts.type = \"GET\";\n\t}\n} );\n\n// Bind script tag hack transport\njQuery.ajaxTransport( \"script\", function( s ) {\n\n\t// This transport only deals with cross domain requests\n\tif ( s.crossDomain ) {\n\t\tvar script, callback;\n\t\treturn {\n\t\t\tsend: function( _, complete ) {\n\t\t\t\tscript = jQuery( \"<script>\" ).prop( {\n\t\t\t\t\tcharset: s.scriptCharset,\n\t\t\t\t\tsrc: s.url\n\t\t\t\t} ).on(\n\t\t\t\t\t\"load error\",\n\t\t\t\t\tcallback = function( evt ) {\n\t\t\t\t\t\tscript.remove();\n\t\t\t\t\t\tcallback = null;\n\t\t\t\t\t\tif ( evt ) {\n\t\t\t\t\t\t\tcomplete( evt.type === \"error\" ? 404 : 200, evt.type );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\t// Use native DOM manipulation to avoid our domManip AJAX trickery\n\t\t\t\tdocument.head.appendChild( script[ 0 ] );\n\t\t\t},\n\t\t\tabort: function() {\n\t\t\t\tif ( callback ) {\n\t\t\t\t\tcallback();\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t}\n} );\n\n\n\n\nvar oldCallbacks = [],\n\trjsonp = /(=)\\?(?=&|$)|\\?\\?/;\n\n// Default jsonp settings\njQuery.ajaxSetup( {\n\tjsonp: \"callback\",\n\tjsonpCallback: function() {\n\t\tvar callback = oldCallbacks.pop() || ( jQuery.expando + \"_\" + ( nonce++ ) );\n\t\tthis[ callback ] = true;\n\t\treturn callback;\n\t}\n} );\n\n// Detect, normalize options and install callbacks for jsonp requests\njQuery.ajaxPrefilter( \"json jsonp\", function( s, originalSettings, jqXHR ) {\n\n\tvar callbackName, overwritten, responseContainer,\n\t\tjsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?\n\t\t\t\"url\" :\n\t\t\ttypeof s.data === \"string\" &&\n\t\t\t\t( s.contentType || \"\" )\n\t\t\t\t\t.indexOf( \"application/x-www-form-urlencoded\" ) === 0 &&\n\t\t\t\trjsonp.test( s.data ) && \"data\"\n\t\t);\n\n\t// Handle iff the expected data type is \"jsonp\" or we have a parameter to set\n\tif ( jsonProp || s.dataTypes[ 0 ] === \"jsonp\" ) {\n\n\t\t// Get callback name, remembering preexisting value associated with it\n\t\tcallbackName = s.jsonpCallback = isFunction( s.jsonpCallback ) ?\n\t\t\ts.jsonpCallback() :\n\t\t\ts.jsonpCallback;\n\n\t\t// Insert callback into url or form data\n\t\tif ( jsonProp ) {\n\t\t\ts[ jsonProp ] = s[ jsonProp ].replace( rjsonp, \"$1\" + callbackName );\n\t\t} else if ( s.jsonp !== false ) {\n\t\t\ts.url += ( rquery.test( s.url ) ? \"&\" : \"?\" ) + s.jsonp + \"=\" + callbackName;\n\t\t}\n\n\t\t// Use data converter to retrieve json after script execution\n\t\ts.converters[ \"script json\" ] = function() {\n\t\t\tif ( !responseContainer ) {\n\t\t\t\tjQuery.error( callbackName + \" was not called\" );\n\t\t\t}\n\t\t\treturn responseContainer[ 0 ];\n\t\t};\n\n\t\t// Force json dataType\n\t\ts.dataTypes[ 0 ] = \"json\";\n\n\t\t// Install callback\n\t\toverwritten = window[ callbackName ];\n\t\twindow[ callbackName ] = function() {\n\t\t\tresponseContainer = arguments;\n\t\t};\n\n\t\t// Clean-up function (fires after converters)\n\t\tjqXHR.always( function() {\n\n\t\t\t// If previous value didn't exist - remove it\n\t\t\tif ( overwritten === undefined ) {\n\t\t\t\tjQuery( window ).removeProp( callbackName );\n\n\t\t\t// Otherwise restore preexisting value\n\t\t\t} else {\n\t\t\t\twindow[ callbackName ] = overwritten;\n\t\t\t}\n\n\t\t\t// Save back as free\n\t\t\tif ( s[ callbackName ] ) {\n\n\t\t\t\t// Make sure that re-using the options doesn't screw things around\n\t\t\t\ts.jsonpCallback = originalSettings.jsonpCallback;\n\n\t\t\t\t// Save the callback name for future use\n\t\t\t\toldCallbacks.push( callbackName );\n\t\t\t}\n\n\t\t\t// Call if it was a function and we have a response\n\t\t\tif ( responseContainer && isFunction( overwritten ) ) {\n\t\t\t\toverwritten( responseContainer[ 0 ] );\n\t\t\t}\n\n\t\t\tresponseContainer = overwritten = undefined;\n\t\t} );\n\n\t\t// Delegate to script\n\t\treturn \"script\";\n\t}\n} );\n\n\n\n\n// Support: Safari 8 only\n// In Safari 8 documents created via document.implementation.createHTMLDocument\n// collapse sibling forms: the second one becomes a child of the first one.\n// Because of that, this security measure has to be disabled in Safari 8.\n// https://bugs.webkit.org/show_bug.cgi?id=137337\nsupport.createHTMLDocument = ( function() {\n\tvar body = document.implementation.createHTMLDocument( \"\" ).body;\n\tbody.innerHTML = \"<form></form><form></form>\";\n\treturn body.childNodes.length === 2;\n} )();\n\n\n// Argument \"data\" should be string of html\n// context (optional): If specified, the fragment will be created in this context,\n// defaults to document\n// keepScripts (optional): If true, will include scripts passed in the html string\njQuery.parseHTML = function( data, context, keepScripts ) {\n\tif ( typeof data !== \"string\" ) {\n\t\treturn [];\n\t}\n\tif ( typeof context === \"boolean\" ) {\n\t\tkeepScripts = context;\n\t\tcontext = false;\n\t}\n\n\tvar base, parsed, scripts;\n\n\tif ( !context ) {\n\n\t\t// Stop scripts or inline event handlers from being executed immediately\n\t\t// by using document.implementation\n\t\tif ( support.createHTMLDocument ) {\n\t\t\tcontext = document.implementation.createHTMLDocument( \"\" );\n\n\t\t\t// Set the base href for the created document\n\t\t\t// so any parsed elements with URLs\n\t\t\t// are based on the document's URL (gh-2965)\n\t\t\tbase = context.createElement( \"base\" );\n\t\t\tbase.href = document.location.href;\n\t\t\tcontext.head.appendChild( base );\n\t\t} else {\n\t\t\tcontext = document;\n\t\t}\n\t}\n\n\tparsed = rsingleTag.exec( data );\n\tscripts = !keepScripts && [];\n\n\t// Single tag\n\tif ( parsed ) {\n\t\treturn [ context.createElement( parsed[ 1 ] ) ];\n\t}\n\n\tparsed = buildFragment( [ data ], context, scripts );\n\n\tif ( scripts && scripts.length ) {\n\t\tjQuery( scripts ).remove();\n\t}\n\n\treturn jQuery.merge( [], parsed.childNodes );\n};\n\n\n/**\n * Load a url into a page\n */\njQuery.fn.load = function( url, params, callback ) {\n\tvar selector, type, response,\n\t\tself = this,\n\t\toff = url.indexOf( \" \" );\n\n\tif ( off > -1 ) {\n\t\tselector = stripAndCollapse( url.slice( off ) );\n\t\turl = url.slice( 0, off );\n\t}\n\n\t// If it's a function\n\tif ( isFunction( params ) ) {\n\n\t\t// We assume that it's the callback\n\t\tcallback = params;\n\t\tparams = undefined;\n\n\t// Otherwise, build a param string\n\t} else if ( params && typeof params === \"object\" ) {\n\t\ttype = \"POST\";\n\t}\n\n\t// If we have elements to modify, make the request\n\tif ( self.length > 0 ) {\n\t\tjQuery.ajax( {\n\t\t\turl: url,\n\n\t\t\t// If \"type\" variable is undefined, then \"GET\" method will be used.\n\t\t\t// Make value of this field explicit since\n\t\t\t// user can override it through ajaxSetup method\n\t\t\ttype: type || \"GET\",\n\t\t\tdataType: \"html\",\n\t\t\tdata: params\n\t\t} ).done( function( responseText ) {\n\n\t\t\t// Save response for use in complete callback\n\t\t\tresponse = arguments;\n\n\t\t\tself.html( selector ?\n\n\t\t\t\t// If a selector was specified, locate the right elements in a dummy div\n\t\t\t\t// Exclude scripts to avoid IE 'Permission Denied' errors\n\t\t\t\tjQuery( \"<div>\" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :\n\n\t\t\t\t// Otherwise use the full result\n\t\t\t\tresponseText );\n\n\t\t// If the request succeeds, this function gets \"data\", \"status\", \"jqXHR\"\n\t\t// but they are ignored because response was set above.\n\t\t// If it fails, this function gets \"jqXHR\", \"status\", \"error\"\n\t\t} ).always( callback && function( jqXHR, status ) {\n\t\t\tself.each( function() {\n\t\t\t\tcallback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );\n\t\t\t} );\n\t\t} );\n\t}\n\n\treturn this;\n};\n\n\n\n\n// Attach a bunch of functions for handling common AJAX events\njQuery.each( [\n\t\"ajaxStart\",\n\t\"ajaxStop\",\n\t\"ajaxComplete\",\n\t\"ajaxError\",\n\t\"ajaxSuccess\",\n\t\"ajaxSend\"\n], function( i, type ) {\n\tjQuery.fn[ type ] = function( fn ) {\n\t\treturn this.on( type, fn );\n\t};\n} );\n\n\n\n\njQuery.expr.pseudos.animated = function( elem ) {\n\treturn jQuery.grep( jQuery.timers, function( fn ) {\n\t\treturn elem === fn.elem;\n\t} ).length;\n};\n\n\n\n\njQuery.offset = {\n\tsetOffset: function( elem, options, i ) {\n\t\tvar curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,\n\t\t\tposition = jQuery.css( elem, \"position\" ),\n\t\t\tcurElem = jQuery( elem ),\n\t\t\tprops = {};\n\n\t\t// Set position first, in-case top/left are set even on static elem\n\t\tif ( position === \"static\" ) {\n\t\t\telem.style.position = \"relative\";\n\t\t}\n\n\t\tcurOffset = curElem.offset();\n\t\tcurCSSTop = jQuery.css( elem, \"top\" );\n\t\tcurCSSLeft = jQuery.css( elem, \"left\" );\n\t\tcalculatePosition = ( position === \"absolute\" || position === \"fixed\" ) &&\n\t\t\t( curCSSTop + curCSSLeft ).indexOf( \"auto\" ) > -1;\n\n\t\t// Need to be able to calculate position if either\n\t\t// top or left is auto and position is either absolute or fixed\n\t\tif ( calculatePosition ) {\n\t\t\tcurPosition = curElem.position();\n\t\t\tcurTop = curPosition.top;\n\t\t\tcurLeft = curPosition.left;\n\n\t\t} else {\n\t\t\tcurTop = parseFloat( curCSSTop ) || 0;\n\t\t\tcurLeft = parseFloat( curCSSLeft ) || 0;\n\t\t}\n\n\t\tif ( isFunction( options ) ) {\n\n\t\t\t// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)\n\t\t\toptions = options.call( elem, i, jQuery.extend( {}, curOffset ) );\n\t\t}\n\n\t\tif ( options.top != null ) {\n\t\t\tprops.top = ( options.top - curOffset.top ) + curTop;\n\t\t}\n\t\tif ( options.left != null ) {\n\t\t\tprops.left = ( options.left - curOffset.left ) + curLeft;\n\t\t}\n\n\t\tif ( \"using\" in options ) {\n\t\t\toptions.using.call( elem, props );\n\n\t\t} else {\n\t\t\tcurElem.css( props );\n\t\t}\n\t}\n};\n\njQuery.fn.extend( {\n\n\t// offset() relates an element's border box to the document origin\n\toffset: function( options ) {\n\n\t\t// Preserve chaining for setter\n\t\tif ( arguments.length ) {\n\t\t\treturn options === undefined ?\n\t\t\t\tthis :\n\t\t\t\tthis.each( function( i ) {\n\t\t\t\t\tjQuery.offset.setOffset( this, options, i );\n\t\t\t\t} );\n\t\t}\n\n\t\tvar rect, win,\n\t\t\telem = this[ 0 ];\n\n\t\tif ( !elem ) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Return zeros for disconnected and hidden (display: none) elements (gh-2310)\n\t\t// Support: IE <=11 only\n\t\t// Running getBoundingClientRect on a\n\t\t// disconnected node in IE throws an error\n\t\tif ( !elem.getClientRects().length ) {\n\t\t\treturn { top: 0, left: 0 };\n\t\t}\n\n\t\t// Get document-relative position by adding viewport scroll to viewport-relative gBCR\n\t\trect = elem.getBoundingClientRect();\n\t\twin = elem.ownerDocument.defaultView;\n\t\treturn {\n\t\t\ttop: rect.top + win.pageYOffset,\n\t\t\tleft: rect.left + win.pageXOffset\n\t\t};\n\t},\n\n\t// position() relates an element's margin box to its offset parent's padding box\n\t// This corresponds to the behavior of CSS absolute positioning\n\tposition: function() {\n\t\tif ( !this[ 0 ] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar offsetParent, offset, doc,\n\t\t\telem = this[ 0 ],\n\t\t\tparentOffset = { top: 0, left: 0 };\n\n\t\t// position:fixed elements are offset from the viewport, which itself always has zero offset\n\t\tif ( jQuery.css( elem, \"position\" ) === \"fixed\" ) {\n\n\t\t\t// Assume position:fixed implies availability of getBoundingClientRect\n\t\t\toffset = elem.getBoundingClientRect();\n\n\t\t} else {\n\t\t\toffset = this.offset();\n\n\t\t\t// Account for the *real* offset parent, which can be the document or its root element\n\t\t\t// when a statically positioned element is identified\n\t\t\tdoc = elem.ownerDocument;\n\t\t\toffsetParent = elem.offsetParent || doc.documentElement;\n\t\t\twhile ( offsetParent &&\n\t\t\t\t( offsetParent === doc.body || offsetParent === doc.documentElement ) &&\n\t\t\t\tjQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\n\t\t\t\toffsetParent = offsetParent.parentNode;\n\t\t\t}\n\t\t\tif ( offsetParent && offsetParent !== elem && offsetParent.nodeType === 1 ) {\n\n\t\t\t\t// Incorporate borders into its offset, since they are outside its content origin\n\t\t\t\tparentOffset = jQuery( offsetParent ).offset();\n\t\t\t\tparentOffset.top += jQuery.css( offsetParent, \"borderTopWidth\", true );\n\t\t\t\tparentOffset.left += jQuery.css( offsetParent, \"borderLeftWidth\", true );\n\t\t\t}\n\t\t}\n\n\t\t// Subtract parent offsets and element margins\n\t\treturn {\n\t\t\ttop: offset.top - parentOffset.top - jQuery.css( elem, \"marginTop\", true ),\n\t\t\tleft: offset.left - parentOffset.left - jQuery.css( elem, \"marginLeft\", true )\n\t\t};\n\t},\n\n\t// This method will return documentElement in the following cases:\n\t// 1) For the element inside the iframe without offsetParent, this method will return\n\t//    documentElement of the parent window\n\t// 2) For the hidden or detached element\n\t// 3) For body or html element, i.e. in case of the html node - it will return itself\n\t//\n\t// but those exceptions were never presented as a real life use-cases\n\t// and might be considered as more preferable results.\n\t//\n\t// This logic, however, is not guaranteed and can change at any point in the future\n\toffsetParent: function() {\n\t\treturn this.map( function() {\n\t\t\tvar offsetParent = this.offsetParent;\n\n\t\t\twhile ( offsetParent && jQuery.css( offsetParent, \"position\" ) === \"static\" ) {\n\t\t\t\toffsetParent = offsetParent.offsetParent;\n\t\t\t}\n\n\t\t\treturn offsetParent || documentElement;\n\t\t} );\n\t}\n} );\n\n// Create scrollLeft and scrollTop methods\njQuery.each( { scrollLeft: \"pageXOffset\", scrollTop: \"pageYOffset\" }, function( method, prop ) {\n\tvar top = \"pageYOffset\" === prop;\n\n\tjQuery.fn[ method ] = function( val ) {\n\t\treturn access( this, function( elem, method, val ) {\n\n\t\t\t// Coalesce documents and windows\n\t\t\tvar win;\n\t\t\tif ( isWindow( elem ) ) {\n\t\t\t\twin = elem;\n\t\t\t} else if ( elem.nodeType === 9 ) {\n\t\t\t\twin = elem.defaultView;\n\t\t\t}\n\n\t\t\tif ( val === undefined ) {\n\t\t\t\treturn win ? win[ prop ] : elem[ method ];\n\t\t\t}\n\n\t\t\tif ( win ) {\n\t\t\t\twin.scrollTo(\n\t\t\t\t\t!top ? val : win.pageXOffset,\n\t\t\t\t\ttop ? val : win.pageYOffset\n\t\t\t\t);\n\n\t\t\t} else {\n\t\t\t\telem[ method ] = val;\n\t\t\t}\n\t\t}, method, val, arguments.length );\n\t};\n} );\n\n// Support: Safari <=7 - 9.1, Chrome <=37 - 49\n// Add the top/left cssHooks using jQuery.fn.position\n// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084\n// Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347\n// getComputedStyle returns percent when specified for top/left/bottom/right;\n// rather than make the css module depend on the offset module, just check for it here\njQuery.each( [ \"top\", \"left\" ], function( i, prop ) {\n\tjQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,\n\t\tfunction( elem, computed ) {\n\t\t\tif ( computed ) {\n\t\t\t\tcomputed = curCSS( elem, prop );\n\n\t\t\t\t// If curCSS returns percentage, fallback to offset\n\t\t\t\treturn rnumnonpx.test( computed ) ?\n\t\t\t\t\tjQuery( elem ).position()[ prop ] + \"px\" :\n\t\t\t\t\tcomputed;\n\t\t\t}\n\t\t}\n\t);\n} );\n\n\n// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods\njQuery.each( { Height: \"height\", Width: \"width\" }, function( name, type ) {\n\tjQuery.each( { padding: \"inner\" + name, content: type, \"\": \"outer\" + name },\n\t\tfunction( defaultExtra, funcName ) {\n\n\t\t// Margin is only for outerHeight, outerWidth\n\t\tjQuery.fn[ funcName ] = function( margin, value ) {\n\t\t\tvar chainable = arguments.length && ( defaultExtra || typeof margin !== \"boolean\" ),\n\t\t\t\textra = defaultExtra || ( margin === true || value === true ? \"margin\" : \"border\" );\n\n\t\t\treturn access( this, function( elem, type, value ) {\n\t\t\t\tvar doc;\n\n\t\t\t\tif ( isWindow( elem ) ) {\n\n\t\t\t\t\t// $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)\n\t\t\t\t\treturn funcName.indexOf( \"outer\" ) === 0 ?\n\t\t\t\t\t\telem[ \"inner\" + name ] :\n\t\t\t\t\t\telem.document.documentElement[ \"client\" + name ];\n\t\t\t\t}\n\n\t\t\t\t// Get document width or height\n\t\t\t\tif ( elem.nodeType === 9 ) {\n\t\t\t\t\tdoc = elem.documentElement;\n\n\t\t\t\t\t// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],\n\t\t\t\t\t// whichever is greatest\n\t\t\t\t\treturn Math.max(\n\t\t\t\t\t\telem.body[ \"scroll\" + name ], doc[ \"scroll\" + name ],\n\t\t\t\t\t\telem.body[ \"offset\" + name ], doc[ \"offset\" + name ],\n\t\t\t\t\t\tdoc[ \"client\" + name ]\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\treturn value === undefined ?\n\n\t\t\t\t\t// Get width or height on the element, requesting but not forcing parseFloat\n\t\t\t\t\tjQuery.css( elem, type, extra ) :\n\n\t\t\t\t\t// Set width or height on the element\n\t\t\t\t\tjQuery.style( elem, type, value, extra );\n\t\t\t}, type, chainable ? margin : undefined, chainable );\n\t\t};\n\t} );\n} );\n\n\njQuery.each( ( \"blur focus focusin focusout resize scroll click dblclick \" +\n\t\"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave \" +\n\t\"change select submit keydown keypress keyup contextmenu\" ).split( \" \" ),\n\tfunction( i, name ) {\n\n\t// Handle event binding\n\tjQuery.fn[ name ] = function( data, fn ) {\n\t\treturn arguments.length > 0 ?\n\t\t\tthis.on( name, null, data, fn ) :\n\t\t\tthis.trigger( name );\n\t};\n} );\n\njQuery.fn.extend( {\n\thover: function( fnOver, fnOut ) {\n\t\treturn this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );\n\t}\n} );\n\n\n\n\njQuery.fn.extend( {\n\n\tbind: function( types, data, fn ) {\n\t\treturn this.on( types, null, data, fn );\n\t},\n\tunbind: function( types, fn ) {\n\t\treturn this.off( types, null, fn );\n\t},\n\n\tdelegate: function( selector, types, data, fn ) {\n\t\treturn this.on( types, selector, data, fn );\n\t},\n\tundelegate: function( selector, types, fn ) {\n\n\t\t// ( namespace ) or ( selector, types [, fn] )\n\t\treturn arguments.length === 1 ?\n\t\t\tthis.off( selector, \"**\" ) :\n\t\t\tthis.off( types, selector || \"**\", fn );\n\t}\n} );\n\n// Bind a function to a context, optionally partially applying any\n// arguments.\n// jQuery.proxy is deprecated to promote standards (specifically Function#bind)\n// However, it is not slated for removal any time soon\njQuery.proxy = function( fn, context ) {\n\tvar tmp, args, proxy;\n\n\tif ( typeof context === \"string\" ) {\n\t\ttmp = fn[ context ];\n\t\tcontext = fn;\n\t\tfn = tmp;\n\t}\n\n\t// Quick check to determine if target is callable, in the spec\n\t// this throws a TypeError, but we will just return undefined.\n\tif ( !isFunction( fn ) ) {\n\t\treturn undefined;\n\t}\n\n\t// Simulated bind\n\targs = slice.call( arguments, 2 );\n\tproxy = function() {\n\t\treturn fn.apply( context || this, args.concat( slice.call( arguments ) ) );\n\t};\n\n\t// Set the guid of unique handler to the same of original handler, so it can be removed\n\tproxy.guid = fn.guid = fn.guid || jQuery.guid++;\n\n\treturn proxy;\n};\n\njQuery.holdReady = function( hold ) {\n\tif ( hold ) {\n\t\tjQuery.readyWait++;\n\t} else {\n\t\tjQuery.ready( true );\n\t}\n};\njQuery.isArray = Array.isArray;\njQuery.parseJSON = JSON.parse;\njQuery.nodeName = nodeName;\njQuery.isFunction = isFunction;\njQuery.isWindow = isWindow;\njQuery.camelCase = camelCase;\njQuery.type = toType;\n\njQuery.now = Date.now;\n\njQuery.isNumeric = function( obj ) {\n\n\t// As of jQuery 3.0, isNumeric is limited to\n\t// strings and numbers (primitives or objects)\n\t// that can be coerced to finite numbers (gh-2662)\n\tvar type = jQuery.type( obj );\n\treturn ( type === \"number\" || type === \"string\" ) &&\n\n\t\t// parseFloat NaNs numeric-cast false positives (\"\")\n\t\t// ...but misinterprets leading-number strings, particularly hex literals (\"0x...\")\n\t\t// subtraction forces infinities to NaN\n\t\t!isNaN( obj - parseFloat( obj ) );\n};\n\n\n\n\n// Register as a named AMD module, since jQuery can be concatenated with other\n// files that may use define, but not via a proper concatenation script that\n// understands anonymous AMD modules. A named AMD is safest and most robust\n// way to register. Lowercase jquery is used because AMD module names are\n// derived from file names, and jQuery is normally delivered in a lowercase\n// file name. Do this after creating the global so that if an AMD module wants\n// to call noConflict to hide this version of jQuery, it will work.\n\n// Note that for maximum portability, libraries that are not jQuery should\n// declare themselves as anonymous modules, and avoid setting a global if an\n// AMD loader is present. jQuery is a special case. For more information, see\n// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon\n\nif ( typeof define === \"function\" && define.amd ) {\n\tdefine( \"jquery\", [], function() {\n\t\treturn jQuery;\n\t} );\n}\n\n\n\n\nvar\n\n\t// Map over jQuery in case of overwrite\n\t_jQuery = window.jQuery,\n\n\t// Map over the $ in case of overwrite\n\t_$ = window.$;\n\njQuery.noConflict = function( deep ) {\n\tif ( window.$ === jQuery ) {\n\t\twindow.$ = _$;\n\t}\n\n\tif ( deep && window.jQuery === jQuery ) {\n\t\twindow.jQuery = _jQuery;\n\t}\n\n\treturn jQuery;\n};\n\n// Expose jQuery and $ identifiers, even in AMD\n// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)\n// and CommonJS for browser emulators (#13566)\nif ( !noGlobal ) {\n\twindow.jQuery = window.$ = jQuery;\n}\n\n\n\n\nreturn jQuery;\n} );\n","// jQuery plugins expect to find a global `jQuery` object, so we\n// need to attach it to the window.\n//\n// This is in its own file because we have to attach it before any\n// other imports happen, but with ES6 modules, all `import`s have\n// to be at the top.\nimport $ from 'jquery';\nwindow.jQuery = $;\nwindow.$ = $;\n","/*!\n * Trend 0.2.0\n *\n * Fail-safe TransitionEnd event for jQuery.\n *\n * Adds a new \"trend\" event that can be used in browsers that don't\n * support \"transitionend\".\n *\n * NOTE: Only supports being bound with \"jQuery.one\".\n *\n * Copyright 2014, Pixel Union - http://pixelunion.net\n * Released under the MIT license\n */\n;(function($){\n\n  // Prefixed transitionend event names\n  var transitionEndEvents =\n    \"webkitTransitionEnd \" +\n    \"otransitionend \" +\n    \"oTransitionEnd \" +\n    \"msTransitionEnd \" +\n    \"transitionend\";\n\n  // Prefixed transition duration property names\n  var transitionDurationProperties = [\n    \"transition-duration\",\n    \"-moz-transition-duration\",\n    \"-webkit-transition-duration\",\n    \"-ms-transition-duration\",\n    \"-o-transition-duration\",\n    \"-khtml-transition-duration\"\n  ];\n\n  // Prefixed transition delay property names\n  var transitionDelayProperties = [\n    \"transition-delay\",\n    \"-moz-transition-delay\",\n    \"-webkit-transition-delay\",\n    \"-ms-transition-delay\",\n    \"-o-transition-delay\",\n    \"-khtml-transition-delay\"\n  ];\n\n  // Parses a CSS time value into milliseconds.\n  var parseTime = function(s) {\n    s = s.replace(/\\s/, \"\");\n    var v = window.parseFloat(s);\n\n    return s.match(/[^m]s$/i)\n      ? v * 1000\n      : v;\n  };\n\n  // Parses the longest time unit found in a series of CSS properties.\n  // Returns a value in milliseconds.\n  var parseProperties = function(el, properties) {\n    var duration = 0;\n\n    for (var i = 0; i < properties.length; i++) {\n      // Get raw CSS value\n      var value = el.css(properties[i]);\n      if (!value) continue;\n\n      // Multiple transitions--pick the longest\n      if (value.indexOf(\",\") !== -1) {\n        var values = value.split(\",\");\n        var durations = (function(){\n          var results = [];\n          for (var i = 0; i < values.length; i++) {\n            var duration = parseTime(values[i]);\n            results.push(duration);\n          }\n          return results;\n        })();\n\n        duration = Math.max.apply(Math, durations);\n      }\n\n      // Single transition\n      else {\n        duration = parseTime(value);\n      }\n\n      // Accept first vaue\n      break;\n    }\n\n    return duration;\n  };\n\n  $.event.special.trend = {\n    // Triggers an event handler when an element is done transitioning.\n    //\n    // Handles browsers that don't support transitionend by adding a\n    // timeout with the transition duration.\n    add: function(handleObj) {\n      var el = $(this);\n      var fired = false;\n\n      // Mark element as being in transition\n      el.data(\"trend\", true);\n\n      // Calculate a fallback duration. + 20 because some browsers fire\n      // timeouts faster than transitionend.\n      var time =\n        parseProperties(el, transitionDurationProperties) +\n        parseProperties(el, transitionDelayProperties) +\n        20;\n\n      var cb = function(e) {\n        // transitionend events can be sent for each property. Let's just\n        // skip all but the first. Also handles the timeout callback.\n        if (fired) return;\n\n        // Child elements that also have transitions can be fired before we\n        // complete. This will catch and ignore those. Unfortunately, we'll\n        // have to rely on the timeout in these cases.\n        if (e && e.srcElement !== el[0]) return;\n\n        // Mark element has not being in transition\n        el.data(\"trend\", false);\n\n        // Callback\n        fired = true;\n        if (handleObj.handler) handleObj.handler();\n      };\n\n      el.one(transitionEndEvents, cb);\n      el.data(\"trend-timeout\", window.setTimeout(cb, time));\n    },\n\n    remove: function(handleObj) {\n      var el = $(this);\n      el.off(transitionEndEvents);\n      window.clearTimeout(el.data(\"trend-timeout\"));\n    }\n  };\n\n})(jQuery);\n","/*!\n * Revealer 2.0.1\n *\n * Copyright 2015, Pixel Union - http://pixelunion.net\n * Released under the MIT license\n */\n(function($){\n  // check for trend event (make sure jquery.trend is included)\n  if (typeof $.event.special.trend !== \"object\") {\n    console.warn(\"Please make sure jquery.trend is included! Otherwise revealer won't work.\");\n  }\n\n  // Simple requestAnimationFrame polyfill\n  var raf = window.requestAnimationFrame ||\n    window.mozRequestAnimationFrame ||\n    window.webkitRequestAnimationFrame ||\n    function(fn) { window.setTimeout(fn, 1000/60); }\n\n\n  // Public API\n  var methods = {\n    isVisible: function(el) {\n      return !!el.data(\"revealer-visible\");\n    },\n\n    show: function(el, force) {\n      // Check state\n      if (methods.isVisible(el)) {\n        el.removeClass(\"animating animating-in\");\n        el.off(\"revealer-animating revealer-show\");\n        return;\n      }\n\n      // Remove previous event listeners\n      el.data(\"revealer-visible\", true);\n      el.off(\"trend\");\n\n      if (force) {\n        el.addClass(\"visible\");\n        raf(function(){\n          el.trigger(\"revealer-animating\");\n          el.trigger(\"revealer-show\");\n        });\n        return;\n      }\n\n      raf(function(){\n        // Start animation state transition\n        el.addClass(\"animating animating-in\");\n        el.trigger(\"revealer-animating\");\n\n        raf(function(){\n          el.addClass(\"visible\");\n\n          el.one(\"trend\", function(){\n            el.removeClass(\"animating animating-in\");\n            el.trigger(\"revealer-show\");\n          });\n        });\n      });\n    },\n\n    hide: function(el, force) {\n      // Check state\n      if (!methods.isVisible(el)) {\n        el.removeClass(\"animating animating-out visible\");\n        el.off(\"revealer-animating revealer-hide\");\n        return;\n      }\n\n      // Remove previous event listeners\n      el.data(\"revealer-visible\", false);\n      el.off(\"trend\");\n\n      if (force) {\n        el.removeClass(\"visible\");\n        raf(function(){\n          el.trigger(\"revealer-animating\");\n          el.trigger(\"revealer-hide\");\n        });\n        return;\n      }\n\n      raf(function(){\n        el.addClass(\"animating animating-out\");\n        el.trigger(\"revealer-animating\");\n\n        raf(function(){\n          el.removeClass(\"visible\");\n\n          el.one(\"trend\", function(){\n            el.removeClass(\"animating animating-in animating-out\");\n            el.trigger(\"revealer-hide\");\n          });\n        });\n      });\n    },\n\n    toggle: function(el, force) {\n      if (methods.isVisible(el)) {\n        methods.hide(el, force);\n      } else {\n        methods.show(el, force);\n      }\n    }\n  };\n\n  // jQuery plugin\n  $.fn.revealer = function(method, force) {\n    // Get action\n    var action = methods[method || \"toggle\"];\n    if (!action) return this;\n\n    // Run action\n    if (method === \"isVisible\") {\n      return action(this);\n    }\n\n    return this.each(function(){\n      action($(this), force);\n    });\n  };\n})(jQuery);\n","/**\n * EvEmitter v1.1.0\n * Lil' event emitter\n * MIT License\n */\n\n/* jshint unused: true, undef: true, strict: true */\n\n( function( global, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /* globals define, module, window */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD - RequireJS\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS - Browserify, Webpack\n    module.exports = factory();\n  } else {\n    // Browser globals\n    global.EvEmitter = factory();\n  }\n\n}( typeof window != 'undefined' ? window : this, function() {\n\n\"use strict\";\n\nfunction EvEmitter() {}\n\nvar proto = EvEmitter.prototype;\n\nproto.on = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // set events hash\n  var events = this._events = this._events || {};\n  // set listeners array\n  var listeners = events[ eventName ] = events[ eventName ] || [];\n  // only add once\n  if ( listeners.indexOf( listener ) == -1 ) {\n    listeners.push( listener );\n  }\n\n  return this;\n};\n\nproto.once = function( eventName, listener ) {\n  if ( !eventName || !listener ) {\n    return;\n  }\n  // add event\n  this.on( eventName, listener );\n  // set once flag\n  // set onceEvents hash\n  var onceEvents = this._onceEvents = this._onceEvents || {};\n  // set onceListeners object\n  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};\n  // set flag\n  onceListeners[ listener ] = true;\n\n  return this;\n};\n\nproto.off = function( eventName, listener ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  var index = listeners.indexOf( listener );\n  if ( index != -1 ) {\n    listeners.splice( index, 1 );\n  }\n\n  return this;\n};\n\nproto.emitEvent = function( eventName, args ) {\n  var listeners = this._events && this._events[ eventName ];\n  if ( !listeners || !listeners.length ) {\n    return;\n  }\n  // copy over to avoid interference if .off() in listener\n  listeners = listeners.slice(0);\n  args = args || [];\n  // once stuff\n  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];\n\n  for ( var i=0; i < listeners.length; i++ ) {\n    var listener = listeners[i]\n    var isOnce = onceListeners && onceListeners[ listener ];\n    if ( isOnce ) {\n      // remove listener\n      // remove before trigger to prevent recursion\n      this.off( eventName, listener );\n      // unset once flag\n      delete onceListeners[ listener ];\n    }\n    // trigger listener\n    listener.apply( this, args );\n  }\n\n  return this;\n};\n\nproto.allOff = function() {\n  delete this._events;\n  delete this._onceEvents;\n};\n\nreturn EvEmitter;\n\n}));\n","/*!\n * getSize v2.0.2\n * measure size of elements\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n/*global define: false, module: false, console: false */\n\n( function( window, factory ) {\n  'use strict';\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( function() {\n      return factory();\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.getSize = factory();\n  }\n\n})( window, function factory() {\n'use strict';\n\n// -------------------------- helpers -------------------------- //\n\n// get a number from a string, not a percentage\nfunction getStyleSize( value ) {\n  var num = parseFloat( value );\n  // not a percent like '100%', and a number\n  var isValid = value.indexOf('%') == -1 && !isNaN( num );\n  return isValid && num;\n}\n\nfunction noop() {}\n\nvar logError = typeof console == 'undefined' ? noop :\n  function( message ) {\n    console.error( message );\n  };\n\n// -------------------------- measurements -------------------------- //\n\nvar measurements = [\n  'paddingLeft',\n  'paddingRight',\n  'paddingTop',\n  'paddingBottom',\n  'marginLeft',\n  'marginRight',\n  'marginTop',\n  'marginBottom',\n  'borderLeftWidth',\n  'borderRightWidth',\n  'borderTopWidth',\n  'borderBottomWidth'\n];\n\nvar measurementsLength = measurements.length;\n\nfunction getZeroSize() {\n  var size = {\n    width: 0,\n    height: 0,\n    innerWidth: 0,\n    innerHeight: 0,\n    outerWidth: 0,\n    outerHeight: 0\n  };\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    size[ measurement ] = 0;\n  }\n  return size;\n}\n\n// -------------------------- getStyle -------------------------- //\n\n/**\n * getStyle, get style of element, check for Firefox bug\n * https://bugzilla.mozilla.org/show_bug.cgi?id=548397\n */\nfunction getStyle( elem ) {\n  var style = getComputedStyle( elem );\n  if ( !style ) {\n    logError( 'Style returned ' + style +\n      '. Are you running this code in a hidden iframe on Firefox? ' +\n      'See http://bit.ly/getsizebug1' );\n  }\n  return style;\n}\n\n// -------------------------- setup -------------------------- //\n\nvar isSetup = false;\n\nvar isBoxSizeOuter;\n\n/**\n * setup\n * check isBoxSizerOuter\n * do on first getSize() rather than on page load for Firefox bug\n */\nfunction setup() {\n  // setup once\n  if ( isSetup ) {\n    return;\n  }\n  isSetup = true;\n\n  // -------------------------- box sizing -------------------------- //\n\n  /**\n   * WebKit measures the outer-width on style.width on border-box elems\n   * IE & Firefox<29 measures the inner-width\n   */\n  var div = document.createElement('div');\n  div.style.width = '200px';\n  div.style.padding = '1px 2px 3px 4px';\n  div.style.borderStyle = 'solid';\n  div.style.borderWidth = '1px 2px 3px 4px';\n  div.style.boxSizing = 'border-box';\n\n  var body = document.body || document.documentElement;\n  body.appendChild( div );\n  var style = getStyle( div );\n\n  getSize.isBoxSizeOuter = isBoxSizeOuter = getStyleSize( style.width ) == 200;\n  body.removeChild( div );\n\n}\n\n// -------------------------- getSize -------------------------- //\n\nfunction getSize( elem ) {\n  setup();\n\n  // use querySeletor if elem is string\n  if ( typeof elem == 'string' ) {\n    elem = document.querySelector( elem );\n  }\n\n  // do not proceed on non-objects\n  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {\n    return;\n  }\n\n  var style = getStyle( elem );\n\n  // if hidden, everything is 0\n  if ( style.display == 'none' ) {\n    return getZeroSize();\n  }\n\n  var size = {};\n  size.width = elem.offsetWidth;\n  size.height = elem.offsetHeight;\n\n  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';\n\n  // get all measurements\n  for ( var i=0; i < measurementsLength; i++ ) {\n    var measurement = measurements[i];\n    var value = style[ measurement ];\n    var num = parseFloat( value );\n    // any 'auto', 'medium' value will be 0\n    size[ measurement ] = !isNaN( num ) ? num : 0;\n  }\n\n  var paddingWidth = size.paddingLeft + size.paddingRight;\n  var paddingHeight = size.paddingTop + size.paddingBottom;\n  var marginWidth = size.marginLeft + size.marginRight;\n  var marginHeight = size.marginTop + size.marginBottom;\n  var borderWidth = size.borderLeftWidth + size.borderRightWidth;\n  var borderHeight = size.borderTopWidth + size.borderBottomWidth;\n\n  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;\n\n  // overwrite width and height if we can get it from style\n  var styleWidth = getStyleSize( style.width );\n  if ( styleWidth !== false ) {\n    size.width = styleWidth +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );\n  }\n\n  var styleHeight = getStyleSize( style.height );\n  if ( styleHeight !== false ) {\n    size.height = styleHeight +\n      // add padding and border unless it's already including it\n      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );\n  }\n\n  size.innerWidth = size.width - ( paddingWidth + borderWidth );\n  size.innerHeight = size.height - ( paddingHeight + borderHeight );\n\n  size.outerWidth = size.width + marginWidth;\n  size.outerHeight = size.height + marginHeight;\n\n  return size;\n}\n\nreturn getSize;\n\n});\n","/**\n * matchesSelector v2.0.2\n * matchesSelector( element, '.selector' )\n * MIT license\n */\n\n/*jshint browser: true, strict: true, undef: true, unused: true */\n\n( function( window, factory ) {\n  /*global define: false, module: false */\n  'use strict';\n  // universal module definition\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.matchesSelector = factory();\n  }\n\n}( window, function factory() {\n  'use strict';\n\n  var matchesMethod = ( function() {\n    var ElemProto = window.Element.prototype;\n    // check for the standard method name first\n    if ( ElemProto.matches ) {\n      return 'matches';\n    }\n    // check un-prefixed\n    if ( ElemProto.matchesSelector ) {\n      return 'matchesSelector';\n    }\n    // check vendor prefixes\n    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];\n\n    for ( var i=0; i < prefixes.length; i++ ) {\n      var prefix = prefixes[i];\n      var method = prefix + 'MatchesSelector';\n      if ( ElemProto[ method ] ) {\n        return method;\n      }\n    }\n  })();\n\n  return function matchesSelector( elem, selector ) {\n    return elem[ matchesMethod ]( selector );\n  };\n\n}));\n","/**\n * Fizzy UI utils v2.0.7\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'desandro-matches-selector/matches-selector'\n    ], function( matchesSelector ) {\n      return factory( window, matchesSelector );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('desandro-matches-selector')\n    );\n  } else {\n    // browser global\n    window.fizzyUIUtils = factory(\n      window,\n      window.matchesSelector\n    );\n  }\n\n}( window, function factory( window, matchesSelector ) {\n\n'use strict';\n\nvar utils = {};\n\n// ----- extend ----- //\n\n// extends objects\nutils.extend = function( a, b ) {\n  for ( var prop in b ) {\n    a[ prop ] = b[ prop ];\n  }\n  return a;\n};\n\n// ----- modulo ----- //\n\nutils.modulo = function( num, div ) {\n  return ( ( num % div ) + div ) % div;\n};\n\n// ----- makeArray ----- //\n\nvar arraySlice = Array.prototype.slice;\n\n// turn element or nodeList into an array\nutils.makeArray = function( obj ) {\n  if ( Array.isArray( obj ) ) {\n    // use object if already an array\n    return obj;\n  }\n  // return empty array if undefined or null. #6\n  if ( obj === null || obj === undefined ) {\n    return [];\n  }\n\n  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';\n  if ( isArrayLike ) {\n    // convert nodeList to array\n    return arraySlice.call( obj );\n  }\n\n  // array of single index\n  return [ obj ];\n};\n\n// ----- removeFrom ----- //\n\nutils.removeFrom = function( ary, obj ) {\n  var index = ary.indexOf( obj );\n  if ( index != -1 ) {\n    ary.splice( index, 1 );\n  }\n};\n\n// ----- getParent ----- //\n\nutils.getParent = function( elem, selector ) {\n  while ( elem.parentNode && elem != document.body ) {\n    elem = elem.parentNode;\n    if ( matchesSelector( elem, selector ) ) {\n      return elem;\n    }\n  }\n};\n\n// ----- getQueryElement ----- //\n\n// use element as selector string\nutils.getQueryElement = function( elem ) {\n  if ( typeof elem == 'string' ) {\n    return document.querySelector( elem );\n  }\n  return elem;\n};\n\n// ----- handleEvent ----- //\n\n// enable .ontype to trigger from .addEventListener( elem, 'type' )\nutils.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// ----- filterFindElements ----- //\n\nutils.filterFindElements = function( elems, selector ) {\n  // make array of elems\n  elems = utils.makeArray( elems );\n  var ffElems = [];\n\n  elems.forEach( function( elem ) {\n    // check that elem is an actual element\n    if ( !( elem instanceof HTMLElement ) ) {\n      return;\n    }\n    // add elem if no selector\n    if ( !selector ) {\n      ffElems.push( elem );\n      return;\n    }\n    // filter & find items if we have a selector\n    // filter\n    if ( matchesSelector( elem, selector ) ) {\n      ffElems.push( elem );\n    }\n    // find children\n    var childElems = elem.querySelectorAll( selector );\n    // concat childElems to filterFound array\n    for ( var i=0; i < childElems.length; i++ ) {\n      ffElems.push( childElems[i] );\n    }\n  });\n\n  return ffElems;\n};\n\n// ----- debounceMethod ----- //\n\nutils.debounceMethod = function( _class, methodName, threshold ) {\n  threshold = threshold || 100;\n  // original method\n  var method = _class.prototype[ methodName ];\n  var timeoutName = methodName + 'Timeout';\n\n  _class.prototype[ methodName ] = function() {\n    var timeout = this[ timeoutName ];\n    clearTimeout( timeout );\n\n    var args = arguments;\n    var _this = this;\n    this[ timeoutName ] = setTimeout( function() {\n      method.apply( _this, args );\n      delete _this[ timeoutName ];\n    }, threshold );\n  };\n};\n\n// ----- docReady ----- //\n\nutils.docReady = function( callback ) {\n  var readyState = document.readyState;\n  if ( readyState == 'complete' || readyState == 'interactive' ) {\n    // do async to allow for other scripts to run. metafizzy/flickity#441\n    setTimeout( callback );\n  } else {\n    document.addEventListener( 'DOMContentLoaded', callback );\n  }\n};\n\n// ----- htmlInit ----- //\n\n// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/\nutils.toDashed = function( str ) {\n  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {\n    return $1 + '-' + $2;\n  }).toLowerCase();\n};\n\nvar console = window.console;\n/**\n * allow user to initialize classes via [data-namespace] or .js-namespace class\n * htmlInit( Widget, 'widgetName' )\n * options are parsed from data-namespace-options\n */\nutils.htmlInit = function( WidgetClass, namespace ) {\n  utils.docReady( function() {\n    var dashedNamespace = utils.toDashed( namespace );\n    var dataAttr = 'data-' + dashedNamespace;\n    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );\n    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );\n    var elems = utils.makeArray( dataAttrElems )\n      .concat( utils.makeArray( jsDashElems ) );\n    var dataOptionsAttr = dataAttr + '-options';\n    var jQuery = window.jQuery;\n\n    elems.forEach( function( elem ) {\n      var attr = elem.getAttribute( dataAttr ) ||\n        elem.getAttribute( dataOptionsAttr );\n      var options;\n      try {\n        options = attr && JSON.parse( attr );\n      } catch ( error ) {\n        // log error, do not initialize\n        if ( console ) {\n          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +\n          ': ' + error );\n        }\n        return;\n      }\n      // initialize\n      var instance = new WidgetClass( elem, options );\n      // make available via $().data('namespace')\n      if ( jQuery ) {\n        jQuery.data( elem, namespace, instance );\n      }\n    });\n\n  });\n};\n\n// -----  ----- //\n\nreturn utils;\n\n}));\n","// Flickity.Cell\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'get-size/get-size'\n    ], function( getSize ) {\n      return factory( window, getSize );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('get-size')\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Cell = factory(\n      window,\n      window.getSize\n    );\n  }\n\n}( window, function factory( window, getSize ) {\n\n'use strict';\n\nfunction Cell( elem, parent ) {\n  this.element = elem;\n  this.parent = parent;\n\n  this.create();\n}\n\nvar proto = Cell.prototype;\n\nproto.create = function() {\n  this.element.style.position = 'absolute';\n  this.element.setAttribute( 'aria-selected', 'false' );\n  this.x = 0;\n  this.shift = 0;\n};\n\nproto.destroy = function() {\n  // reset style\n  this.element.style.position = '';\n  var side = this.parent.originSide;\n  this.element.removeAttribute('aria-selected');\n  this.element.style[ side ] = '';\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n};\n\nproto.setPosition = function( x ) {\n  this.x = x;\n  this.updateTarget();\n  this.renderPosition( x );\n};\n\n// setDefaultTarget v1 method, backwards compatibility, remove in v3\nproto.updateTarget = proto.setDefaultTarget = function() {\n  var marginProperty = this.parent.originSide == 'left' ? 'marginLeft' : 'marginRight';\n  this.target = this.x + this.size[ marginProperty ] +\n    this.size.width * this.parent.cellAlign;\n};\n\nproto.renderPosition = function( x ) {\n  // render position of cell with in slider\n  var side = this.parent.originSide;\n  this.element.style[ side ] = this.parent.getPositionValue( x );\n};\n\n/**\n * @param {Integer} factor - 0, 1, or -1\n**/\nproto.wrapShift = function( shift ) {\n  this.shift = shift;\n  this.renderPosition( this.x + this.parent.slideableWidth * shift );\n};\n\nproto.remove = function() {\n  this.element.parentNode.removeChild( this.element );\n};\n\nreturn Cell;\n\n}));\n","// slide\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory();\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.Slide = factory();\n  }\n\n}( window, function factory() {\n'use strict';\n\nfunction Slide( parent ) {\n  this.parent = parent;\n  this.isOriginLeft = parent.originSide == 'left';\n  this.cells = [];\n  this.outerWidth = 0;\n  this.height = 0;\n}\n\nvar proto = Slide.prototype;\n\nproto.addCell = function( cell ) {\n  this.cells.push( cell );\n  this.outerWidth += cell.size.outerWidth;\n  this.height = Math.max( cell.size.outerHeight, this.height );\n  // first cell stuff\n  if ( this.cells.length == 1 ) {\n    this.x = cell.x; // x comes from first cell\n    var beginMargin = this.isOriginLeft ? 'marginLeft' : 'marginRight';\n    this.firstMargin = cell.size[ beginMargin ];\n  }\n};\n\nproto.updateTarget = function() {\n  var endMargin = this.isOriginLeft ? 'marginRight' : 'marginLeft';\n  var lastCell = this.getLastCell();\n  var lastMargin = lastCell ? lastCell.size[ endMargin ] : 0;\n  var slideWidth = this.outerWidth - ( this.firstMargin + lastMargin );\n  this.target = this.x + this.firstMargin + slideWidth * this.parent.cellAlign;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.select = function() {\n  this.changeSelected( true );\n};\n\nproto.unselect = function() {\n  this.changeSelected( false );\n};\n\nproto.changeSelected = function( isSelected ) {\n  var classMethod = isSelected ? 'add' : 'remove';\n  this.cells.forEach( function( cell ) {\n    cell.element.classList[ classMethod ]('is-selected');\n    cell.element.setAttribute( 'aria-selected', isSelected.toString() );\n  });\n};\n\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  });\n};\n\nreturn Slide;\n\n}));\n","// animate\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'fizzy-ui-utils/utils'\n    ], function( utils ) {\n      return factory( window, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    window.Flickity = window.Flickity || {};\n    window.Flickity.animatePrototype = factory(\n      window,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, utils ) {\n\n'use strict';\n\n// -------------------------- animate -------------------------- //\n\nvar proto = {};\n\nproto.startAnimation = function() {\n  if ( this.isAnimating ) {\n    return;\n  }\n\n  this.isAnimating = true;\n  this.restingFrames = 0;\n  this.animate();\n};\n\nproto.animate = function() {\n  this.applyDragForce();\n  this.applySelectedAttraction();\n\n  var previousX = this.x;\n\n  this.integratePhysics();\n  this.positionSlider();\n  this.settle( previousX );\n  // animate next frame\n  if ( this.isAnimating ) {\n    var _this = this;\n    requestAnimationFrame( function animateFrame() {\n      _this.animate();\n    });\n  }\n};\n\nproto.positionSlider = function() {\n  var x = this.x;\n  // wrap position around\n  if ( this.options.wrapAround && this.cells.length > 1 ) {\n    x = utils.modulo( x, this.slideableWidth );\n    x = x - this.slideableWidth;\n    this.shiftWrapCells( x );\n  }\n\n  x = x + this.cursorPosition;\n  // reverse if right-to-left and using transform\n  x = this.options.rightToLeft ? -x : x;\n  var value = this.getPositionValue( x );\n  // use 3D tranforms for hardware acceleration on iOS\n  // but use 2D when settled, for better font-rendering\n  this.slider.style.transform = this.isAnimating ?\n    'translate3d(' + value + ',0,0)' : 'translateX(' + value + ')';\n\n  // scroll event\n  var firstSlide = this.slides[0];\n  if ( firstSlide ) {\n    var positionX = -this.x - firstSlide.target;\n    var progress = positionX / this.slidesWidth;\n    this.dispatchEvent( 'scroll', null, [ progress, positionX ] );\n  }\n};\n\nproto.positionSliderAtSelected = function() {\n  if ( !this.cells.length ) {\n    return;\n  }\n  this.x = -this.selectedSlide.target;\n  this.velocity = 0; // stop wobble\n  this.positionSlider();\n};\n\nproto.getPositionValue = function( position ) {\n  if ( this.options.percentPosition ) {\n    // percent position, round to 2 digits, like 12.34%\n    return ( Math.round( ( position / this.size.innerWidth ) * 10000 ) * 0.01 )+ '%';\n  } else {\n    // pixel positioning\n    return Math.round( position ) + 'px';\n  }\n};\n\nproto.settle = function( previousX ) {\n  // keep track of frames where x hasn't moved\n  if ( !this.isPointerDown && Math.round( this.x * 100 ) == Math.round( previousX * 100 ) ) {\n    this.restingFrames++;\n  }\n  // stop animating if resting for 3 or more frames\n  if ( this.restingFrames > 2 ) {\n    this.isAnimating = false;\n    delete this.isFreeScrolling;\n    // render position with translateX when settled\n    this.positionSlider();\n    this.dispatchEvent( 'settle', null, [ this.selectedIndex ] );\n  }\n};\n\nproto.shiftWrapCells = function( x ) {\n  // shift before cells\n  var beforeGap = this.cursorPosition + x;\n  this._shiftCells( this.beforeShiftCells, beforeGap, -1 );\n  // shift after cells\n  var afterGap = this.size.innerWidth - ( x + this.slideableWidth + this.cursorPosition );\n  this._shiftCells( this.afterShiftCells, afterGap, 1 );\n};\n\nproto._shiftCells = function( cells, gap, shift ) {\n  for ( var i=0; i < cells.length; i++ ) {\n    var cell = cells[i];\n    var cellShift = gap > 0 ? shift : 0;\n    cell.wrapShift( cellShift );\n    gap -= cell.size.outerWidth;\n  }\n};\n\nproto._unshiftCells = function( cells ) {\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  for ( var i=0; i < cells.length; i++ ) {\n    cells[i].wrapShift( 0 );\n  }\n};\n\n// -------------------------- physics -------------------------- //\n\nproto.integratePhysics = function() {\n  this.x += this.velocity;\n  this.velocity *= this.getFrictionFactor();\n};\n\nproto.applyForce = function( force ) {\n  this.velocity += force;\n};\n\nproto.getFrictionFactor = function() {\n  return 1 - this.options[ this.isFreeScrolling ? 'freeScrollFriction' : 'friction' ];\n};\n\nproto.getRestingPosition = function() {\n  // my thanks to Steven Wittens, who simplified this math greatly\n  return this.x + this.velocity / ( 1 - this.getFrictionFactor() );\n};\n\nproto.applyDragForce = function() {\n  if ( !this.isDraggable || !this.isPointerDown ) {\n    return;\n  }\n  // change the position to drag position by applying force\n  var dragVelocity = this.dragX - this.x;\n  var dragForce = dragVelocity - this.velocity;\n  this.applyForce( dragForce );\n};\n\nproto.applySelectedAttraction = function() {\n  // do not attract if pointer down or no slides\n  var dragDown = this.isDraggable && this.isPointerDown;\n  if ( dragDown || this.isFreeScrolling || !this.slides.length ) {\n    return;\n  }\n  var distance = this.selectedSlide.target * -1 - this.x;\n  var force = distance * this.options.selectedAttraction;\n  this.applyForce( force );\n};\n\nreturn proto;\n\n}));\n","// Flickity main\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter',\n      'get-size/get-size',\n      'fizzy-ui-utils/utils',\n      './cell',\n      './slide',\n      './animate'\n    ], function( EvEmitter, getSize, utils, Cell, Slide, animatePrototype ) {\n      return factory( window, EvEmitter, getSize, utils, Cell, Slide, animatePrototype );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('ev-emitter'),\n      require('get-size'),\n      require('fizzy-ui-utils'),\n      require('./cell'),\n      require('./slide'),\n      require('./animate')\n    );\n  } else {\n    // browser global\n    var _Flickity = window.Flickity;\n\n    window.Flickity = factory(\n      window,\n      window.EvEmitter,\n      window.getSize,\n      window.fizzyUIUtils,\n      _Flickity.Cell,\n      _Flickity.Slide,\n      _Flickity.animatePrototype\n    );\n  }\n\n}( window, function factory( window, EvEmitter, getSize,\n  utils, Cell, Slide, animatePrototype ) {\n\n'use strict';\n\n// vars\nvar jQuery = window.jQuery;\nvar getComputedStyle = window.getComputedStyle;\nvar console = window.console;\n\nfunction moveElements( elems, toElem ) {\n  elems = utils.makeArray( elems );\n  while ( elems.length ) {\n    toElem.appendChild( elems.shift() );\n  }\n}\n\n// -------------------------- Flickity -------------------------- //\n\n// globally unique identifiers\nvar GUID = 0;\n// internal store of all Flickity intances\nvar instances = {};\n\nfunction Flickity( element, options ) {\n  var queryElement = utils.getQueryElement( element );\n  if ( !queryElement ) {\n    if ( console ) {\n      console.error( 'Bad element for Flickity: ' + ( queryElement || element ) );\n    }\n    return;\n  }\n  this.element = queryElement;\n  // do not initialize twice on same element\n  if ( this.element.flickityGUID ) {\n    var instance = instances[ this.element.flickityGUID ];\n    instance.option( options );\n    return instance;\n  }\n\n  // add jQuery\n  if ( jQuery ) {\n    this.$element = jQuery( this.element );\n  }\n  // options\n  this.options = utils.extend( {}, this.constructor.defaults );\n  this.option( options );\n\n  // kick things off\n  this._create();\n}\n\nFlickity.defaults = {\n  accessibility: true,\n  // adaptiveHeight: false,\n  cellAlign: 'center',\n  // cellSelector: undefined,\n  // contain: false,\n  freeScrollFriction: 0.075, // friction when free-scrolling\n  friction: 0.28, // friction when selecting\n  namespaceJQueryEvents: true,\n  // initialIndex: 0,\n  percentPosition: true,\n  resize: true,\n  selectedAttraction: 0.025,\n  setGallerySize: true\n  // watchCSS: false,\n  // wrapAround: false\n};\n\n// hash of methods triggered on _create()\nFlickity.createMethods = [];\n\nvar proto = Flickity.prototype;\n// inherit EventEmitter\nutils.extend( proto, EvEmitter.prototype );\n\nproto._create = function() {\n  // add id for Flickity.data\n  var id = this.guid = ++GUID;\n  this.element.flickityGUID = id; // expando\n  instances[ id ] = this; // associate via id\n  // initial properties\n  this.selectedIndex = 0;\n  // how many frames slider has been in same position\n  this.restingFrames = 0;\n  // initial physics properties\n  this.x = 0;\n  this.velocity = 0;\n  this.originSide = this.options.rightToLeft ? 'right' : 'left';\n  // create viewport & slider\n  this.viewport = document.createElement('div');\n  this.viewport.className = 'flickity-viewport';\n  this._createSlider();\n\n  if ( this.options.resize || this.options.watchCSS ) {\n    window.addEventListener( 'resize', this );\n  }\n\n  // add listeners from on option\n  for ( var eventName in this.options.on ) {\n    var listener = this.options.on[ eventName ];\n    this.on( eventName, listener );\n  }\n\n  Flickity.createMethods.forEach( function( method ) {\n    this[ method ]();\n  }, this );\n\n  if ( this.options.watchCSS ) {\n    this.watchCSS();\n  } else {\n    this.activate();\n  }\n\n};\n\n/**\n * set options\n * @param {Object} opts\n */\nproto.option = function( opts ) {\n  utils.extend( this.options, opts );\n};\n\nproto.activate = function() {\n  if ( this.isActive ) {\n    return;\n  }\n  this.isActive = true;\n  this.element.classList.add('flickity-enabled');\n  if ( this.options.rightToLeft ) {\n    this.element.classList.add('flickity-rtl');\n  }\n\n  this.getSize();\n  // move initial cell elements so they can be loaded as cells\n  var cellElems = this._filterFindCellElements( this.element.children );\n  moveElements( cellElems, this.slider );\n  this.viewport.appendChild( this.slider );\n  this.element.appendChild( this.viewport );\n  // get cells from children\n  this.reloadCells();\n\n  if ( this.options.accessibility ) {\n    // allow element to focusable\n    this.element.tabIndex = 0;\n    // listen for key presses\n    this.element.addEventListener( 'keydown', this );\n  }\n\n  this.emitEvent('activate');\n\n  var index;\n  var initialIndex = this.options.initialIndex;\n  if ( this.isInitActivated ) {\n    index = this.selectedIndex;\n  } else if ( initialIndex !== undefined ) {\n    index = this.cells[ initialIndex ] ? initialIndex : 0;\n  } else {\n    index = 0;\n  }\n  // select instantly\n  this.select( index, false, true );\n  // flag for initial activation, for using initialIndex\n  this.isInitActivated = true;\n  // ready event. #493\n  this.dispatchEvent('ready');\n};\n\n// slider positions the cells\nproto._createSlider = function() {\n  // slider element does all the positioning\n  var slider = document.createElement('div');\n  slider.className = 'flickity-slider';\n  slider.style[ this.originSide ] = 0;\n  this.slider = slider;\n};\n\nproto._filterFindCellElements = function( elems ) {\n  return utils.filterFindElements( elems, this.options.cellSelector );\n};\n\n// goes through all children\nproto.reloadCells = function() {\n  // collection of item elements\n  this.cells = this._makeCells( this.slider.children );\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n};\n\n/**\n * turn elements into Flickity.Cells\n * @param {Array or NodeList or HTMLElement} elems\n * @returns {Array} items - collection of new Flickity Cells\n */\nproto._makeCells = function( elems ) {\n  var cellElems = this._filterFindCellElements( elems );\n\n  // create new Flickity for collection\n  var cells = cellElems.map( function( cellElem ) {\n    return new Cell( cellElem, this );\n  }, this );\n\n  return cells;\n};\n\nproto.getLastCell = function() {\n  return this.cells[ this.cells.length - 1 ];\n};\n\nproto.getLastSlide = function() {\n  return this.slides[ this.slides.length - 1 ];\n};\n\n// positions all cells\nproto.positionCells = function() {\n  // size all cells\n  this._sizeCells( this.cells );\n  // position all cells\n  this._positionCells( 0 );\n};\n\n/**\n * position certain cells\n * @param {Integer} index - which cell to start with\n */\nproto._positionCells = function( index ) {\n  index = index || 0;\n  // also measure maxCellHeight\n  // start 0 if positioning all cells\n  this.maxCellHeight = index ? this.maxCellHeight || 0 : 0;\n  var cellX = 0;\n  // get cellX\n  if ( index > 0 ) {\n    var startCell = this.cells[ index - 1 ];\n    cellX = startCell.x + startCell.size.outerWidth;\n  }\n  var len = this.cells.length;\n  for ( var i=index; i < len; i++ ) {\n    var cell = this.cells[i];\n    cell.setPosition( cellX );\n    cellX += cell.size.outerWidth;\n    this.maxCellHeight = Math.max( cell.size.outerHeight, this.maxCellHeight );\n  }\n  // keep track of cellX for wrap-around\n  this.slideableWidth = cellX;\n  // slides\n  this.updateSlides();\n  // contain slides target\n  this._containSlides();\n  // update slidesWidth\n  this.slidesWidth = len ? this.getLastSlide().target - this.slides[0].target : 0;\n};\n\n/**\n * cell.getSize() on multiple cells\n * @param {Array} cells\n */\nproto._sizeCells = function( cells ) {\n  cells.forEach( function( cell ) {\n    cell.getSize();\n  });\n};\n\n// --------------------------  -------------------------- //\n\nproto.updateSlides = function() {\n  this.slides = [];\n  if ( !this.cells.length ) {\n    return;\n  }\n\n  var slide = new Slide( this );\n  this.slides.push( slide );\n  var isOriginLeft = this.originSide == 'left';\n  var nextMargin = isOriginLeft ? 'marginRight' : 'marginLeft';\n\n  var canCellFit = this._getCanCellFit();\n\n  this.cells.forEach( function( cell, i ) {\n    // just add cell if first cell in slide\n    if ( !slide.cells.length ) {\n      slide.addCell( cell );\n      return;\n    }\n\n    var slideWidth = ( slide.outerWidth - slide.firstMargin ) +\n      ( cell.size.outerWidth - cell.size[ nextMargin ] );\n\n    if ( canCellFit.call( this, i, slideWidth ) ) {\n      slide.addCell( cell );\n    } else {\n      // doesn't fit, new slide\n      slide.updateTarget();\n\n      slide = new Slide( this );\n      this.slides.push( slide );\n      slide.addCell( cell );\n    }\n  }, this );\n  // last slide\n  slide.updateTarget();\n  // update .selectedSlide\n  this.updateSelectedSlide();\n};\n\nproto._getCanCellFit = function() {\n  var groupCells = this.options.groupCells;\n  if ( !groupCells ) {\n    return function() {\n      return false;\n    };\n  } else if ( typeof groupCells == 'number' ) {\n    // group by number. 3 -> [0,1,2], [3,4,5], ...\n    var number = parseInt( groupCells, 10 );\n    return function( i ) {\n      return ( i % number ) !== 0;\n    };\n  }\n  // default, group by width of slide\n  // parse '75%\n  var percentMatch = typeof groupCells == 'string' &&\n    groupCells.match(/^(\\d+)%$/);\n  var percent = percentMatch ? parseInt( percentMatch[1], 10 ) / 100 : 1;\n  return function( i, slideWidth ) {\n    return slideWidth <= ( this.size.innerWidth + 1 ) * percent;\n  };\n};\n\n// alias _init for jQuery plugin .flickity()\nproto._init =\nproto.reposition = function() {\n  this.positionCells();\n  this.positionSliderAtSelected();\n};\n\nproto.getSize = function() {\n  this.size = getSize( this.element );\n  this.setCellAlign();\n  this.cursorPosition = this.size.innerWidth * this.cellAlign;\n};\n\nvar cellAlignShorthands = {\n  // cell align, then based on origin side\n  center: {\n    left: 0.5,\n    right: 0.5\n  },\n  left: {\n    left: 0,\n    right: 1\n  },\n  right: {\n    right: 0,\n    left: 1\n  }\n};\n\nproto.setCellAlign = function() {\n  var shorthand = cellAlignShorthands[ this.options.cellAlign ];\n  this.cellAlign = shorthand ? shorthand[ this.originSide ] : this.options.cellAlign;\n};\n\nproto.setGallerySize = function() {\n  if ( this.options.setGallerySize ) {\n    var height = this.options.adaptiveHeight && this.selectedSlide ?\n      this.selectedSlide.height : this.maxCellHeight;\n    this.viewport.style.height = height + 'px';\n  }\n};\n\nproto._getWrapShiftCells = function() {\n  // only for wrap-around\n  if ( !this.options.wrapAround ) {\n    return;\n  }\n  // unshift previous cells\n  this._unshiftCells( this.beforeShiftCells );\n  this._unshiftCells( this.afterShiftCells );\n  // get before cells\n  // initial gap\n  var gapX = this.cursorPosition;\n  var cellIndex = this.cells.length - 1;\n  this.beforeShiftCells = this._getGapCells( gapX, cellIndex, -1 );\n  // get after cells\n  // ending gap between last cell and end of gallery viewport\n  gapX = this.size.innerWidth - this.cursorPosition;\n  // start cloning at first cell, working forwards\n  this.afterShiftCells = this._getGapCells( gapX, 0, 1 );\n};\n\nproto._getGapCells = function( gapX, cellIndex, increment ) {\n  // keep adding cells until the cover the initial gap\n  var cells = [];\n  while ( gapX > 0 ) {\n    var cell = this.cells[ cellIndex ];\n    if ( !cell ) {\n      break;\n    }\n    cells.push( cell );\n    cellIndex += increment;\n    gapX -= cell.size.outerWidth;\n  }\n  return cells;\n};\n\n// ----- contain ----- //\n\n// contain cell targets so no excess sliding\nproto._containSlides = function() {\n  if ( !this.options.contain || this.options.wrapAround || !this.cells.length ) {\n    return;\n  }\n  var isRightToLeft = this.options.rightToLeft;\n  var beginMargin = isRightToLeft ? 'marginRight' : 'marginLeft';\n  var endMargin = isRightToLeft ? 'marginLeft' : 'marginRight';\n  var contentWidth = this.slideableWidth - this.getLastCell().size[ endMargin ];\n  // content is less than gallery size\n  var isContentSmaller = contentWidth < this.size.innerWidth;\n  // bounds\n  var beginBound = this.cursorPosition + this.cells[0].size[ beginMargin ];\n  var endBound = contentWidth - this.size.innerWidth * ( 1 - this.cellAlign );\n  // contain each cell target\n  this.slides.forEach( function( slide ) {\n    if ( isContentSmaller ) {\n      // all cells fit inside gallery\n      slide.target = contentWidth * this.cellAlign;\n    } else {\n      // contain to bounds\n      slide.target = Math.max( slide.target, beginBound );\n      slide.target = Math.min( slide.target, endBound );\n    }\n  }, this );\n};\n\n// -----  ----- //\n\n/**\n * emits events via eventEmitter and jQuery events\n * @param {String} type - name of event\n * @param {Event} event - original event\n * @param {Array} args - extra arguments\n */\nproto.dispatchEvent = function( type, event, args ) {\n  var emitArgs = event ? [ event ].concat( args ) : args;\n  this.emitEvent( type, emitArgs );\n\n  if ( jQuery && this.$element ) {\n    // default trigger with type if no event\n    type += this.options.namespaceJQueryEvents ? '.flickity' : '';\n    var $event = type;\n    if ( event ) {\n      // create jQuery event\n      var jQEvent = jQuery.Event( event );\n      jQEvent.type = type;\n      $event = jQEvent;\n    }\n    this.$element.trigger( $event, args );\n  }\n};\n\n// -------------------------- select -------------------------- //\n\n/**\n * @param {Integer} index - index of the slide\n * @param {Boolean} isWrap - will wrap-around to last/first if at the end\n * @param {Boolean} isInstant - will immediately set position at selected cell\n */\nproto.select = function( index, isWrap, isInstant ) {\n  if ( !this.isActive ) {\n    return;\n  }\n  index = parseInt( index, 10 );\n  this._wrapSelect( index );\n\n  if ( this.options.wrapAround || isWrap ) {\n    index = utils.modulo( index, this.slides.length );\n  }\n  // bail if invalid index\n  if ( !this.slides[ index ] ) {\n    return;\n  }\n  var prevIndex = this.selectedIndex;\n  this.selectedIndex = index;\n  this.updateSelectedSlide();\n  if ( isInstant ) {\n    this.positionSliderAtSelected();\n  } else {\n    this.startAnimation();\n  }\n  if ( this.options.adaptiveHeight ) {\n    this.setGallerySize();\n  }\n  // events\n  this.dispatchEvent( 'select', null, [ index ] );\n  // change event if new index\n  if ( index != prevIndex ) {\n    this.dispatchEvent( 'change', null, [ index ] );\n  }\n  // old v1 event name, remove in v3\n  this.dispatchEvent('cellSelect');\n};\n\n// wraps position for wrapAround, to move to closest slide. #113\nproto._wrapSelect = function( index ) {\n  var len = this.slides.length;\n  var isWrapping = this.options.wrapAround && len > 1;\n  if ( !isWrapping ) {\n    return index;\n  }\n  var wrapIndex = utils.modulo( index, len );\n  // go to shortest\n  var delta = Math.abs( wrapIndex - this.selectedIndex );\n  var backWrapDelta = Math.abs( ( wrapIndex + len ) - this.selectedIndex );\n  var forewardWrapDelta = Math.abs( ( wrapIndex - len ) - this.selectedIndex );\n  if ( !this.isDragSelect && backWrapDelta < delta ) {\n    index += len;\n  } else if ( !this.isDragSelect && forewardWrapDelta < delta ) {\n    index -= len;\n  }\n  // wrap position so slider is within normal area\n  if ( index < 0 ) {\n    this.x -= this.slideableWidth;\n  } else if ( index >= len ) {\n    this.x += this.slideableWidth;\n  }\n};\n\nproto.previous = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex - 1, isWrap, isInstant );\n};\n\nproto.next = function( isWrap, isInstant ) {\n  this.select( this.selectedIndex + 1, isWrap, isInstant );\n};\n\nproto.updateSelectedSlide = function() {\n  var slide = this.slides[ this.selectedIndex ];\n  // selectedIndex could be outside of slides, if triggered before resize()\n  if ( !slide ) {\n    return;\n  }\n  // unselect previous selected slide\n  this.unselectSelectedSlide();\n  // update new selected slide\n  this.selectedSlide = slide;\n  slide.select();\n  this.selectedCells = slide.cells;\n  this.selectedElements = slide.getCellElements();\n  // HACK: selectedCell & selectedElement is first cell in slide, backwards compatibility\n  // Remove in v3?\n  this.selectedCell = slide.cells[0];\n  this.selectedElement = this.selectedElements[0];\n};\n\nproto.unselectSelectedSlide = function() {\n  if ( this.selectedSlide ) {\n    this.selectedSlide.unselect();\n  }\n};\n\n/**\n * select slide from number or cell element\n * @param {Element or Number} elem\n */\nproto.selectCell = function( value, isWrap, isInstant ) {\n  // get cell\n  var cell = this.queryCell( value );\n  if ( !cell ) {\n    return;\n  }\n\n  var index = this.getCellSlideIndex( cell );\n  this.select( index, isWrap, isInstant );\n};\n\nproto.getCellSlideIndex = function( cell ) {\n  // get index of slides that has cell\n  for ( var i=0; i < this.slides.length; i++ ) {\n    var slide = this.slides[i];\n    var index = slide.cells.indexOf( cell );\n    if ( index != -1 ) {\n      return i;\n    }\n  }\n};\n\n// -------------------------- get cells -------------------------- //\n\n/**\n * get Flickity.Cell, given an Element\n * @param {Element} elem\n * @returns {Flickity.Cell} item\n */\nproto.getCell = function( elem ) {\n  // loop through cells to get the one that matches\n  for ( var i=0; i < this.cells.length; i++ ) {\n    var cell = this.cells[i];\n    if ( cell.element == elem ) {\n      return cell;\n    }\n  }\n};\n\n/**\n * get collection of Flickity.Cells, given Elements\n * @param {Element, Array, NodeList} elems\n * @returns {Array} cells - Flickity.Cells\n */\nproto.getCells = function( elems ) {\n  elems = utils.makeArray( elems );\n  var cells = [];\n  elems.forEach( function( elem ) {\n    var cell = this.getCell( elem );\n    if ( cell ) {\n      cells.push( cell );\n    }\n  }, this );\n  return cells;\n};\n\n/**\n * get cell elements\n * @returns {Array} cellElems\n */\nproto.getCellElements = function() {\n  return this.cells.map( function( cell ) {\n    return cell.element;\n  });\n};\n\n/**\n * get parent cell from an element\n * @param {Element} elem\n * @returns {Flickit.Cell} cell\n */\nproto.getParentCell = function( elem ) {\n  // first check if elem is cell\n  var cell = this.getCell( elem );\n  if ( cell ) {\n    return cell;\n  }\n  // try to get parent cell elem\n  elem = utils.getParent( elem, '.flickity-slider > *' );\n  return this.getCell( elem );\n};\n\n/**\n * get cells adjacent to a slide\n * @param {Integer} adjCount - number of adjacent slides\n * @param {Integer} index - index of slide to start\n * @returns {Array} cells - array of Flickity.Cells\n */\nproto.getAdjacentCellElements = function( adjCount, index ) {\n  if ( !adjCount ) {\n    return this.selectedSlide.getCellElements();\n  }\n  index = index === undefined ? this.selectedIndex : index;\n\n  var len = this.slides.length;\n  if ( 1 + ( adjCount * 2 ) >= len ) {\n    return this.getCellElements();\n  }\n\n  var cellElems = [];\n  for ( var i = index - adjCount; i <= index + adjCount ; i++ ) {\n    var slideIndex = this.options.wrapAround ? utils.modulo( i, len ) : i;\n    var slide = this.slides[ slideIndex ];\n    if ( slide ) {\n      cellElems = cellElems.concat( slide.getCellElements() );\n    }\n  }\n  return cellElems;\n};\n\n/**\n * select slide from number or cell element\n * @param {Element, Selector String, or Number} selector\n */\nproto.queryCell = function( selector ) {\n  if ( typeof selector == 'number' ) {\n    // use number as index\n    return this.cells[ selector ];\n  }\n  if ( typeof selector == 'string' ) {\n    // use string as selector, get element\n    selector = this.element.querySelector( selector );\n  }\n  // get cell from element\n  return this.getCell( selector );\n};\n\n// -------------------------- events -------------------------- //\n\nproto.uiChange = function() {\n  this.emitEvent('uiChange');\n};\n\nproto.childUIPointerDown = function( event ) {\n  this.emitEvent( 'childUIPointerDown', [ event ] );\n};\n\n// ----- resize ----- //\n\nproto.onresize = function() {\n  this.watchCSS();\n  this.resize();\n};\n\nutils.debounceMethod( Flickity, 'onresize', 150 );\n\nproto.resize = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.getSize();\n  // wrap values\n  if ( this.options.wrapAround ) {\n    this.x = utils.modulo( this.x, this.slideableWidth );\n  }\n  this.positionCells();\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  this.emitEvent('resize');\n  // update selected index for group slides, instant\n  // TODO: position can be lost between groups of various numbers\n  var selectedElement = this.selectedElements && this.selectedElements[0];\n  this.selectCell( selectedElement, false, true );\n};\n\n// watches the :after property, activates/deactivates\nproto.watchCSS = function() {\n  var watchOption = this.options.watchCSS;\n  if ( !watchOption ) {\n    return;\n  }\n\n  var afterContent = getComputedStyle( this.element, ':after' ).content;\n  // activate if :after { content: 'flickity' }\n  if ( afterContent.indexOf('flickity') != -1 ) {\n    this.activate();\n  } else {\n    this.deactivate();\n  }\n};\n\n// ----- keydown ----- //\n\n// go previous/next if left/right keys pressed\nproto.onkeydown = function( event ) {\n  // only work if element is in focus\n  var isNotFocused = document.activeElement && document.activeElement != this.element;\n  if ( !this.options.accessibility ||isNotFocused ) {\n    return;\n  }\n\n  var handler = Flickity.keyboardHandlers[ event.keyCode ];\n  if ( handler ) {\n    handler.call( this );\n  }\n};\n\nFlickity.keyboardHandlers = {\n  // left arrow\n  37: function() {\n    var leftMethod = this.options.rightToLeft ? 'next' : 'previous';\n    this.uiChange();\n    this[ leftMethod ]();\n  },\n  // right arrow\n  39: function() {\n    var rightMethod = this.options.rightToLeft ? 'previous' : 'next';\n    this.uiChange();\n    this[ rightMethod ]();\n  },\n};\n\n// ----- focus ----- //\n\nproto.focus = function() {\n  var prevScrollY = window.pageYOffset;\n  this.element.focus();\n  // hack to fix scroll jump after focus, #76\n  if ( window.pageYOffset != prevScrollY ) {\n    window.scrollTo( window.pageXOffset, prevScrollY );\n  }\n};\n\n// -------------------------- destroy -------------------------- //\n\n// deactivate all Flickity functionality, but keep stuff available\nproto.deactivate = function() {\n  if ( !this.isActive ) {\n    return;\n  }\n  this.element.classList.remove('flickity-enabled');\n  this.element.classList.remove('flickity-rtl');\n  this.unselectSelectedSlide();\n  // destroy cells\n  this.cells.forEach( function( cell ) {\n    cell.destroy();\n  });\n  this.element.removeChild( this.viewport );\n  // move child elements back into element\n  moveElements( this.slider.children, this.element );\n  if ( this.options.accessibility ) {\n    this.element.removeAttribute('tabIndex');\n    this.element.removeEventListener( 'keydown', this );\n  }\n  // set flags\n  this.isActive = false;\n  this.emitEvent('deactivate');\n};\n\nproto.destroy = function() {\n  this.deactivate();\n  window.removeEventListener( 'resize', this );\n  this.emitEvent('destroy');\n  if ( jQuery && this.$element ) {\n    jQuery.removeData( this.element, 'flickity' );\n  }\n  delete this.element.flickityGUID;\n  delete instances[ this.guid ];\n};\n\n// -------------------------- prototype -------------------------- //\n\nutils.extend( proto, animatePrototype );\n\n// -------------------------- extras -------------------------- //\n\n/**\n * get Flickity instance from element\n * @param {Element} elem\n * @returns {Flickity}\n */\nFlickity.data = function( elem ) {\n  elem = utils.getQueryElement( elem );\n  var id = elem && elem.flickityGUID;\n  return id && instances[ id ];\n};\n\nutils.htmlInit( Flickity, 'flickity' );\n\nif ( jQuery && jQuery.bridget ) {\n  jQuery.bridget( 'flickity', Flickity );\n}\n\n// set internal jQuery, for Webpack + jQuery v3, #478\nFlickity.setJQuery = function( jq ) {\n  jQuery = jq;\n};\n\nFlickity.Cell = Cell;\n\nreturn Flickity;\n\n}));\n","/*!\n * Unipointer v2.3.0\n * base class for doing one thing with pointer event\n * MIT license\n */\n\n/*jshint browser: true, undef: true, unused: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */ /*global define, module, require */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter'\n    ], function( EvEmitter ) {\n      return factory( window, EvEmitter );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('ev-emitter')\n    );\n  } else {\n    // browser global\n    window.Unipointer = factory(\n      window,\n      window.EvEmitter\n    );\n  }\n\n}( window, function factory( window, EvEmitter ) {\n\n'use strict';\n\nfunction noop() {}\n\nfunction Unipointer() {}\n\n// inherit EvEmitter\nvar proto = Unipointer.prototype = Object.create( EvEmitter.prototype );\n\nproto.bindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindStartEvent = function( elem ) {\n  this._bindStartEvent( elem, false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd - remove if falsey\n */\nproto._bindStartEvent = function( elem, isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n\n  // default to mouse events\n  var startEvent = 'mousedown';\n  if ( window.PointerEvent ) {\n    // Pointer Events\n    startEvent = 'pointerdown';\n  } else if ( 'ontouchstart' in window ) {\n    // Touch Events. iOS Safari\n    startEvent = 'touchstart';\n  }\n  elem[ bindMethod ]( startEvent, this );\n};\n\n// trigger handler methods for events\nproto.handleEvent = function( event ) {\n  var method = 'on' + event.type;\n  if ( this[ method ] ) {\n    this[ method ]( event );\n  }\n};\n\n// returns the touch that we're keeping track of\nproto.getTouch = function( touches ) {\n  for ( var i=0; i < touches.length; i++ ) {\n    var touch = touches[i];\n    if ( touch.identifier == this.pointerIdentifier ) {\n      return touch;\n    }\n  }\n};\n\n// ----- start event ----- //\n\nproto.onmousedown = function( event ) {\n  // dismiss clicks from right or middle buttons\n  var button = event.button;\n  if ( button && ( button !== 0 && button !== 1 ) ) {\n    return;\n  }\n  this._pointerDown( event, event );\n};\n\nproto.ontouchstart = function( event ) {\n  this._pointerDown( event, event.changedTouches[0] );\n};\n\nproto.onpointerdown = function( event ) {\n  this._pointerDown( event, event );\n};\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto._pointerDown = function( event, pointer ) {\n  // dismiss right click and other pointers\n  // button = 0 is okay, 1-4 not\n  if ( event.button || this.isPointerDown ) {\n    return;\n  }\n\n  this.isPointerDown = true;\n  // save pointer identifier to match up touch events\n  this.pointerIdentifier = pointer.pointerId !== undefined ?\n    // pointerId for pointer events, touch.indentifier for touch events\n    pointer.pointerId : pointer.identifier;\n\n  this.pointerDown( event, pointer );\n};\n\nproto.pointerDown = function( event, pointer ) {\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// hash of events to be bound after start event\nvar postStartEvents = {\n  mousedown: [ 'mousemove', 'mouseup' ],\n  touchstart: [ 'touchmove', 'touchend', 'touchcancel' ],\n  pointerdown: [ 'pointermove', 'pointerup', 'pointercancel' ],\n};\n\nproto._bindPostStartEvents = function( event ) {\n  if ( !event ) {\n    return;\n  }\n  // get proper events to match start event\n  var events = postStartEvents[ event.type ];\n  // bind events to node\n  events.forEach( function( eventName ) {\n    window.addEventListener( eventName, this );\n  }, this );\n  // save these arguments\n  this._boundPointerEvents = events;\n};\n\nproto._unbindPostStartEvents = function() {\n  // check for _boundEvents, in case dragEnd triggered twice (old IE8 bug)\n  if ( !this._boundPointerEvents ) {\n    return;\n  }\n  this._boundPointerEvents.forEach( function( eventName ) {\n    window.removeEventListener( eventName, this );\n  }, this );\n\n  delete this._boundPointerEvents;\n};\n\n// ----- move event ----- //\n\nproto.onmousemove = function( event ) {\n  this._pointerMove( event, event );\n};\n\nproto.onpointermove = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerMove( event, event );\n  }\n};\n\nproto.ontouchmove = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerMove( event, touch );\n  }\n};\n\n/**\n * pointer move\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerMove = function( event, pointer ) {\n  this.pointerMove( event, pointer );\n};\n\n// public\nproto.pointerMove = function( event, pointer ) {\n  this.emitEvent( 'pointerMove', [ event, pointer ] );\n};\n\n// ----- end event ----- //\n\n\nproto.onmouseup = function( event ) {\n  this._pointerUp( event, event );\n};\n\nproto.onpointerup = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerUp( event, event );\n  }\n};\n\nproto.ontouchend = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerUp( event, touch );\n  }\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerUp = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerUp( event, pointer );\n};\n\n// public\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n};\n\n// ----- pointer done ----- //\n\n// triggered on pointer up & pointer cancel\nproto._pointerDone = function() {\n  this._pointerReset();\n  this._unbindPostStartEvents();\n  this.pointerDone();\n};\n\nproto._pointerReset = function() {\n  // reset properties\n  this.isPointerDown = false;\n  delete this.pointerIdentifier;\n};\n\nproto.pointerDone = noop;\n\n// ----- pointer cancel ----- //\n\nproto.onpointercancel = function( event ) {\n  if ( event.pointerId == this.pointerIdentifier ) {\n    this._pointerCancel( event, event );\n  }\n};\n\nproto.ontouchcancel = function( event ) {\n  var touch = this.getTouch( event.changedTouches );\n  if ( touch ) {\n    this._pointerCancel( event, touch );\n  }\n};\n\n/**\n * pointer cancel\n * @param {Event} event\n * @param {Event or Touch} pointer\n * @private\n */\nproto._pointerCancel = function( event, pointer ) {\n  this._pointerDone();\n  this.pointerCancel( event, pointer );\n};\n\n// public\nproto.pointerCancel = function( event, pointer ) {\n  this.emitEvent( 'pointerCancel', [ event, pointer ] );\n};\n\n// -----  ----- //\n\n// utility function for getting x/y coords from event\nUnipointer.getPointerPoint = function( pointer ) {\n  return {\n    x: pointer.pageX,\n    y: pointer.pageY\n  };\n};\n\n// -----  ----- //\n\nreturn Unipointer;\n\n}));\n","/*!\n * Unidragger v2.3.0\n * Draggable base class\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false */ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'unipointer/unipointer'\n    ], function( Unipointer ) {\n      return factory( window, Unipointer );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('unipointer')\n    );\n  } else {\n    // browser global\n    window.Unidragger = factory(\n      window,\n      window.Unipointer\n    );\n  }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// -------------------------- Unidragger -------------------------- //\n\nfunction Unidragger() {}\n\n// inherit Unipointer & EvEmitter\nvar proto = Unidragger.prototype = Object.create( Unipointer.prototype );\n\n// ----- bind start ----- //\n\nproto.bindHandles = function() {\n  this._bindHandles( true );\n};\n\nproto.unbindHandles = function() {\n  this._bindHandles( false );\n};\n\n/**\n * Add or remove start event\n * @param {Boolean} isAdd\n */\nproto._bindHandles = function( isAdd ) {\n  // munge isAdd, default to true\n  isAdd = isAdd === undefined ? true : isAdd;\n  // bind each handle\n  var bindMethod = isAdd ? 'addEventListener' : 'removeEventListener';\n  var touchAction = isAdd ? this._touchActionValue : '';\n  for ( var i=0; i < this.handles.length; i++ ) {\n    var handle = this.handles[i];\n    this._bindStartEvent( handle, isAdd );\n    handle[ bindMethod ]( 'click', this );\n    // touch-action: none to override browser touch gestures. metafizzy/flickity#540\n    if ( window.PointerEvent ) {\n      handle.style.touchAction = touchAction;\n    }\n  }\n};\n\n// prototype so it can be overwriteable by Flickity\nproto._touchActionValue = 'none';\n\n// ----- start event ----- //\n\n/**\n * pointer start\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerDown = function( event, pointer ) {\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n  // track start event position\n  this.pointerDownPointer = pointer;\n\n  event.preventDefault();\n  this.pointerDownBlur();\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.emitEvent( 'pointerDown', [ event, pointer ] );\n};\n\n// nodes that have text fields\nvar cursorNodes = {\n  TEXTAREA: true,\n  INPUT: true,\n  SELECT: true,\n  OPTION: true,\n};\n\n// input types that do not have text fields\nvar clickTypes = {\n  radio: true,\n  checkbox: true,\n  button: true,\n  submit: true,\n  image: true,\n  file: true,\n};\n\n// dismiss inputs with text fields. flickity#403, flickity#404\nproto.okayPointerDown = function( event ) {\n  var isCursorNode = cursorNodes[ event.target.nodeName ];\n  var isClickType = clickTypes[ event.target.type ];\n  var isOkay = !isCursorNode || isClickType;\n  if ( !isOkay ) {\n    this._pointerReset();\n  }\n  return isOkay;\n};\n\n// kludge to blur previously focused input\nproto.pointerDownBlur = function() {\n  var focused = document.activeElement;\n  // do not blur body for IE10, metafizzy/flickity#117\n  var canBlur = focused && focused.blur && focused != document.body;\n  if ( canBlur ) {\n    focused.blur();\n  }\n};\n\n// ----- move event ----- //\n\n/**\n * drag move\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.emitEvent( 'pointerMove', [ event, pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\n// base pointer move logic\nproto._dragPointerMove = function( event, pointer ) {\n  var moveVector = {\n    x: pointer.pageX - this.pointerDownPointer.pageX,\n    y: pointer.pageY - this.pointerDownPointer.pageY\n  };\n  // start drag if pointer has moved far enough to start drag\n  if ( !this.isDragging && this.hasDragStarted( moveVector ) ) {\n    this._dragStart( event, pointer );\n  }\n  return moveVector;\n};\n\n// condition if pointer has moved far enough to start drag\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > 3 || Math.abs( moveVector.y ) > 3;\n};\n\n// ----- end event ----- //\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  this.emitEvent( 'pointerUp', [ event, pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto._dragPointerUp = function( event, pointer ) {\n  if ( this.isDragging ) {\n    this._dragEnd( event, pointer );\n  } else {\n    // pointer didn't move enough for drag to start\n    this._staticClick( event, pointer );\n  }\n};\n\n// -------------------------- drag -------------------------- //\n\n// dragStart\nproto._dragStart = function( event, pointer ) {\n  this.isDragging = true;\n  // prevent clicks\n  this.isPreventingClicks = true;\n  this.dragStart( event, pointer );\n};\n\nproto.dragStart = function( event, pointer ) {\n  this.emitEvent( 'dragStart', [ event, pointer ] );\n};\n\n// dragMove\nproto._dragMove = function( event, pointer, moveVector ) {\n  // do not drag if not dragging yet\n  if ( !this.isDragging ) {\n    return;\n  }\n\n  this.dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  event.preventDefault();\n  this.emitEvent( 'dragMove', [ event, pointer, moveVector ] );\n};\n\n// dragEnd\nproto._dragEnd = function( event, pointer ) {\n  // set flags\n  this.isDragging = false;\n  // re-enable clicking async\n  setTimeout( function() {\n    delete this.isPreventingClicks;\n  }.bind( this ) );\n\n  this.dragEnd( event, pointer );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  this.emitEvent( 'dragEnd', [ event, pointer ] );\n};\n\n// ----- onclick ----- //\n\n// handle all clicks and prevent clicks when dragging\nproto.onclick = function( event ) {\n  if ( this.isPreventingClicks ) {\n    event.preventDefault();\n  }\n};\n\n// ----- staticClick ----- //\n\n// triggered after pointer down & up with no/tiny movement\nproto._staticClick = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  this.staticClick( event, pointer );\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    setTimeout( function() {\n      delete this.isIgnoringMouseUp;\n    }.bind( this ), 400 );\n  }\n};\n\nproto.staticClick = function( event, pointer ) {\n  this.emitEvent( 'staticClick', [ event, pointer ] );\n};\n\n// ----- utils ----- //\n\nUnidragger.getPointerPoint = Unipointer.getPointerPoint;\n\n// -----  ----- //\n\nreturn Unidragger;\n\n}));\n","// drag\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'unidragger/unidragger',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, Unidragger, utils ) {\n      return factory( window, Flickity, Unidragger, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('unidragger'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    window.Flickity = factory(\n      window,\n      window.Flickity,\n      window.Unidragger,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, Unidragger, utils ) {\n\n'use strict';\n\n// ----- defaults ----- //\n\nutils.extend( Flickity.defaults, {\n  draggable: '>1',\n  dragThreshold: 3,\n});\n\n// ----- create ----- //\n\nFlickity.createMethods.push('_createDrag');\n\n// -------------------------- drag prototype -------------------------- //\n\nvar proto = Flickity.prototype;\nutils.extend( proto, Unidragger.prototype );\nproto._touchActionValue = 'pan-y';\n\n// --------------------------  -------------------------- //\n\nvar isTouch = 'createTouch' in document;\nvar isTouchmoveScrollCanceled = false;\n\nproto._createDrag = function() {\n  this.on( 'activate', this.onActivateDrag );\n  this.on( 'uiChange', this._uiChangeDrag );\n  this.on( 'childUIPointerDown', this._childUIPointerDownDrag );\n  this.on( 'deactivate', this.unbindDrag );\n  this.on( 'cellChange', this.updateDraggable );\n  // TODO updateDraggable on resize? if groupCells & slides change\n  // HACK - add seemingly innocuous handler to fix iOS 10 scroll behavior\n  // #457, RubaXa/Sortable#973\n  if ( isTouch && !isTouchmoveScrollCanceled ) {\n    window.addEventListener( 'touchmove', function() {});\n    isTouchmoveScrollCanceled = true;\n  }\n};\n\nproto.onActivateDrag = function() {\n  this.handles = [ this.viewport ];\n  this.bindHandles();\n  this.updateDraggable();\n};\n\nproto.onDeactivateDrag = function() {\n  this.unbindHandles();\n  this.element.classList.remove('is-draggable');\n};\n\nproto.updateDraggable = function() {\n  // disable dragging if less than 2 slides. #278\n  if ( this.options.draggable == '>1' ) {\n    this.isDraggable = this.slides.length > 1;\n  } else {\n    this.isDraggable = this.options.draggable;\n  }\n  if ( this.isDraggable ) {\n    this.element.classList.add('is-draggable');\n  } else {\n    this.element.classList.remove('is-draggable');\n  }\n};\n\n// backwards compatibility\nproto.bindDrag = function() {\n  this.options.draggable = true;\n  this.updateDraggable();\n};\n\nproto.unbindDrag = function() {\n  this.options.draggable = false;\n  this.updateDraggable();\n};\n\nproto._uiChangeDrag = function() {\n  delete this.isFreeScrolling;\n};\n\nproto._childUIPointerDownDrag = function( event ) {\n  // allow focus & preventDefault even when not draggable\n  // so child UI elements keep focus on carousel. #721\n  event.preventDefault();\n  this.pointerDownFocus( event );\n};\n\n// -------------------------- pointer events -------------------------- //\n\nproto.pointerDown = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    this._pointerDownDefault( event, pointer );\n    return;\n  }\n  var isOkay = this.okayPointerDown( event );\n  if ( !isOkay ) {\n    return;\n  }\n\n  this._pointerDownPreventDefault( event );\n  this.pointerDownFocus( event );\n  // blur\n  if ( document.activeElement != this.element ) {\n    // do not blur if already focused\n    this.pointerDownBlur();\n  }\n\n  // stop if it was moving\n  this.dragX = this.x;\n  this.viewport.classList.add('is-pointer-down');\n  // track scrolling\n  this.pointerDownScroll = getScrollPosition();\n  window.addEventListener( 'scroll', this );\n\n  this._pointerDownDefault( event, pointer );\n};\n\n// default pointerDown logic, used for staticClick\nproto._pointerDownDefault = function( event, pointer ) {\n  // track start event position\n  this.pointerDownPointer = pointer;\n  // bind move and end events\n  this._bindPostStartEvents( event );\n  this.dispatchEvent( 'pointerDown', event, [ pointer ] );\n};\n\nvar focusNodes = {\n  INPUT: true,\n  TEXTAREA: true,\n  SELECT: true,\n};\n\nproto.pointerDownFocus = function( event ) {\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isFocusNode ) {\n    this.focus();\n  }\n};\n\nproto._pointerDownPreventDefault = function( event ) {\n  var isTouchStart = event.type == 'touchstart';\n  var isTouchPointer = event.pointerType == 'touch';\n  var isFocusNode = focusNodes[ event.target.nodeName ];\n  if ( !isTouchStart && !isTouchPointer && !isFocusNode ) {\n    event.preventDefault();\n  }\n};\n\n// ----- move ----- //\n\nproto.hasDragStarted = function( moveVector ) {\n  return Math.abs( moveVector.x ) > this.options.dragThreshold;\n};\n\n// ----- up ----- //\n\nproto.pointerUp = function( event, pointer ) {\n  delete this.isTouchScrolling;\n  this.viewport.classList.remove('is-pointer-down');\n  this.dispatchEvent( 'pointerUp', event, [ pointer ] );\n  this._dragPointerUp( event, pointer );\n};\n\nproto.pointerDone = function() {\n  window.removeEventListener( 'scroll', this );\n  delete this.pointerDownScroll;\n};\n\n// -------------------------- dragging -------------------------- //\n\nproto.dragStart = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  this.dragStartPosition = this.x;\n  this.startAnimation();\n  window.removeEventListener( 'scroll', this );\n  this.dispatchEvent( 'dragStart', event, [ pointer ] );\n};\n\nproto.pointerMove = function( event, pointer ) {\n  var moveVector = this._dragPointerMove( event, pointer );\n  this.dispatchEvent( 'pointerMove', event, [ pointer, moveVector ] );\n  this._dragMove( event, pointer, moveVector );\n};\n\nproto.dragMove = function( event, pointer, moveVector ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  event.preventDefault();\n\n  this.previousDragX = this.dragX;\n  // reverse if right-to-left\n  var direction = this.options.rightToLeft ? -1 : 1;\n  if ( this.options.wrapAround ) {\n    // wrap around move. #589\n    moveVector.x = moveVector.x % this.slideableWidth;\n  }\n  var dragX = this.dragStartPosition + moveVector.x * direction;\n\n  if ( !this.options.wrapAround && this.slides.length ) {\n    // slow drag\n    var originBound = Math.max( -this.slides[0].target, this.dragStartPosition );\n    dragX = dragX > originBound ? ( dragX + originBound ) * 0.5 : dragX;\n    var endBound = Math.min( -this.getLastSlide().target, this.dragStartPosition );\n    dragX = dragX < endBound ? ( dragX + endBound ) * 0.5 : dragX;\n  }\n\n  this.dragX = dragX;\n\n  this.dragMoveTime = new Date();\n  this.dispatchEvent( 'dragMove', event, [ pointer, moveVector ] );\n};\n\nproto.dragEnd = function( event, pointer ) {\n  if ( !this.isDraggable ) {\n    return;\n  }\n  if ( this.options.freeScroll ) {\n    this.isFreeScrolling = true;\n  }\n  // set selectedIndex based on where flick will end up\n  var index = this.dragEndRestingSelect();\n\n  if ( this.options.freeScroll && !this.options.wrapAround ) {\n    // if free-scroll & not wrap around\n    // do not free-scroll if going outside of bounding slides\n    // so bounding slides can attract slider, and keep it in bounds\n    var restingX = this.getRestingPosition();\n    this.isFreeScrolling = -restingX > this.slides[0].target &&\n      -restingX < this.getLastSlide().target;\n  } else if ( !this.options.freeScroll && index == this.selectedIndex ) {\n    // boost selection if selected index has not changed\n    index += this.dragEndBoostSelect();\n  }\n  delete this.previousDragX;\n  // apply selection\n  // TODO refactor this, selecting here feels weird\n  // HACK, set flag so dragging stays in correct direction\n  this.isDragSelect = this.options.wrapAround;\n  this.select( index );\n  delete this.isDragSelect;\n  this.dispatchEvent( 'dragEnd', event, [ pointer ] );\n};\n\nproto.dragEndRestingSelect = function() {\n  var restingX = this.getRestingPosition();\n  // how far away from selected slide\n  var distance = Math.abs( this.getSlideDistance( -restingX, this.selectedIndex ) );\n  // get closet resting going up and going down\n  var positiveResting = this._getClosestResting( restingX, distance, 1 );\n  var negativeResting = this._getClosestResting( restingX, distance, -1 );\n  // use closer resting for wrap-around\n  var index = positiveResting.distance < negativeResting.distance ?\n    positiveResting.index : negativeResting.index;\n  return index;\n};\n\n/**\n * given resting X and distance to selected cell\n * get the distance and index of the closest cell\n * @param {Number} restingX - estimated post-flick resting position\n * @param {Number} distance - distance to selected cell\n * @param {Integer} increment - +1 or -1, going up or down\n * @returns {Object} - { distance: {Number}, index: {Integer} }\n */\nproto._getClosestResting = function( restingX, distance, increment ) {\n  var index = this.selectedIndex;\n  var minDistance = Infinity;\n  var condition = this.options.contain && !this.options.wrapAround ?\n    // if contain, keep going if distance is equal to minDistance\n    function( d, md ) { return d <= md; } : function( d, md ) { return d < md; };\n  while ( condition( distance, minDistance ) ) {\n    // measure distance to next cell\n    index += increment;\n    minDistance = distance;\n    distance = this.getSlideDistance( -restingX, index );\n    if ( distance === null ) {\n      break;\n    }\n    distance = Math.abs( distance );\n  }\n  return {\n    distance: minDistance,\n    // selected was previous index\n    index: index - increment\n  };\n};\n\n/**\n * measure distance between x and a slide target\n * @param {Number} x\n * @param {Integer} index - slide index\n */\nproto.getSlideDistance = function( x, index ) {\n  var len = this.slides.length;\n  // wrap around if at least 2 slides\n  var isWrapAround = this.options.wrapAround && len > 1;\n  var slideIndex = isWrapAround ? utils.modulo( index, len ) : index;\n  var slide = this.slides[ slideIndex ];\n  if ( !slide ) {\n    return null;\n  }\n  // add distance for wrap-around slides\n  var wrap = isWrapAround ? this.slideableWidth * Math.floor( index / len ) : 0;\n  return x - ( slide.target + wrap );\n};\n\nproto.dragEndBoostSelect = function() {\n  // do not boost if no previousDragX or dragMoveTime\n  if ( this.previousDragX === undefined || !this.dragMoveTime ||\n    // or if drag was held for 100 ms\n    new Date() - this.dragMoveTime > 100 ) {\n    return 0;\n  }\n\n  var distance = this.getSlideDistance( -this.dragX, this.selectedIndex );\n  var delta = this.previousDragX - this.dragX;\n  if ( distance > 0 && delta > 0 ) {\n    // boost to next if moving towards the right, and positive velocity\n    return 1;\n  } else if ( distance < 0 && delta < 0 ) {\n    // boost to previous if moving towards the left, and negative velocity\n    return -1;\n  }\n  return 0;\n};\n\n// ----- staticClick ----- //\n\nproto.staticClick = function( event, pointer ) {\n  // get clickedCell, if cell was clicked\n  var clickedCell = this.getParentCell( event.target );\n  var cellElem = clickedCell && clickedCell.element;\n  var cellIndex = clickedCell && this.cells.indexOf( clickedCell );\n  this.dispatchEvent( 'staticClick', event, [ pointer, cellElem, cellIndex ] );\n};\n\n// ----- scroll ----- //\n\nproto.onscroll = function() {\n  var scroll = getScrollPosition();\n  var scrollMoveX = this.pointerDownScroll.x - scroll.x;\n  var scrollMoveY = this.pointerDownScroll.y - scroll.y;\n  // cancel click/tap if scroll is too much\n  if ( Math.abs( scrollMoveX ) > 3 || Math.abs( scrollMoveY ) > 3 ) {\n    this._pointerDone();\n  }\n};\n\n// ----- utils ----- //\n\nfunction getScrollPosition() {\n  return {\n    x: window.pageXOffset,\n    y: window.pageYOffset\n  };\n}\n\n// -----  ----- //\n\nreturn Flickity;\n\n}));\n","/*!\n * Tap listener v2.0.0\n * listens to taps\n * MIT license\n */\n\n/*jshint browser: true, unused: true, undef: true, strict: true */\n\n( function( window, factory ) {\n  // universal module definition\n  /*jshint strict: false*/ /*globals define, module, require */\n\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'unipointer/unipointer'\n    ], function( Unipointer ) {\n      return factory( window, Unipointer );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('unipointer')\n    );\n  } else {\n    // browser global\n    window.TapListener = factory(\n      window,\n      window.Unipointer\n    );\n  }\n\n}( window, function factory( window, Unipointer ) {\n\n'use strict';\n\n// --------------------------  TapListener -------------------------- //\n\nfunction TapListener( elem ) {\n  this.bindTap( elem );\n}\n\n// inherit Unipointer & EventEmitter\nvar proto = TapListener.prototype = Object.create( Unipointer.prototype );\n\n/**\n * bind tap event to element\n * @param {Element} elem\n */\nproto.bindTap = function( elem ) {\n  if ( !elem ) {\n    return;\n  }\n  this.unbindTap();\n  this.tapElement = elem;\n  this._bindStartEvent( elem, true );\n};\n\nproto.unbindTap = function() {\n  if ( !this.tapElement ) {\n    return;\n  }\n  this._bindStartEvent( this.tapElement, true );\n  delete this.tapElement;\n};\n\n/**\n * pointer up\n * @param {Event} event\n * @param {Event or Touch} pointer\n */\nproto.pointerUp = function( event, pointer ) {\n  // ignore emulated mouse up clicks\n  if ( this.isIgnoringMouseUp && event.type == 'mouseup' ) {\n    return;\n  }\n\n  var pointerPoint = Unipointer.getPointerPoint( pointer );\n  var boundingRect = this.tapElement.getBoundingClientRect();\n  var scrollX = window.pageXOffset;\n  var scrollY = window.pageYOffset;\n  // calculate if pointer is inside tapElement\n  var isInside = pointerPoint.x >= boundingRect.left + scrollX &&\n    pointerPoint.x <= boundingRect.right + scrollX &&\n    pointerPoint.y >= boundingRect.top + scrollY &&\n    pointerPoint.y <= boundingRect.bottom + scrollY;\n  // trigger callback if pointer is inside element\n  if ( isInside ) {\n    this.emitEvent( 'tap', [ event, pointer ] );\n  }\n\n  // set flag for emulated clicks 300ms after touchend\n  if ( event.type != 'mouseup' ) {\n    this.isIgnoringMouseUp = true;\n    // reset flag after 300ms\n    var _this = this;\n    setTimeout( function() {\n      delete _this.isIgnoringMouseUp;\n    }, 400 );\n  }\n};\n\nproto.destroy = function() {\n  this.pointerDone();\n  this.unbindTap();\n};\n\n// -----  ----- //\n\nreturn TapListener;\n\n}));\n","// prev/next buttons\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'tap-listener/tap-listener',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, TapListener, utils ) {\n      return factory( window, Flickity, TapListener, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('tap-listener'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.TapListener,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, TapListener, utils ) {\n'use strict';\n\nvar svgURI = 'http://www.w3.org/2000/svg';\n\n// -------------------------- PrevNextButton -------------------------- //\n\nfunction PrevNextButton( direction, parent ) {\n  this.direction = direction;\n  this.parent = parent;\n  this._create();\n}\n\nPrevNextButton.prototype = Object.create( TapListener.prototype );\n\nPrevNextButton.prototype._create = function() {\n  // properties\n  this.isEnabled = true;\n  this.isPrevious = this.direction == -1;\n  var leftDirection = this.parent.options.rightToLeft ? 1 : -1;\n  this.isLeft = this.direction == leftDirection;\n\n  var element = this.element = document.createElement('button');\n  element.className = 'flickity-button flickity-prev-next-button';\n  element.className += this.isPrevious ? ' previous' : ' next';\n  // prevent button from submitting form http://stackoverflow.com/a/10836076/182183\n  element.setAttribute( 'type', 'button' );\n  // init as disabled\n  this.disable();\n\n  element.setAttribute( 'aria-label', this.isPrevious ? 'Previous' : 'Next' );\n\n  // create arrow\n  var svg = this.createSVG();\n  element.appendChild( svg );\n  // events\n  this.on( 'tap', this.onTap );\n  this.parent.on( 'select', this.update.bind( this ) );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPrevNextButton.prototype.activate = function() {\n  this.bindTap( this.element );\n  // click events from keyboard\n  this.element.addEventListener( 'click', this );\n  // add to DOM\n  this.parent.element.appendChild( this.element );\n};\n\nPrevNextButton.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.element );\n  // do regular TapListener destroy\n  TapListener.prototype.destroy.call( this );\n  // click events from keyboard\n  this.element.removeEventListener( 'click', this );\n};\n\nPrevNextButton.prototype.createSVG = function() {\n  var svg = document.createElementNS( svgURI, 'svg');\n  svg.setAttribute( 'class', 'flickity-button-icon' );\n  svg.setAttribute( 'viewBox', '0 0 100 100' );\n  var path = document.createElementNS( svgURI, 'path');\n  var pathMovements = getArrowMovements( this.parent.options.arrowShape );\n  path.setAttribute( 'd', pathMovements );\n  path.setAttribute( 'class', 'arrow' );\n  // rotate arrow\n  if ( !this.isLeft ) {\n    path.setAttribute( 'transform', 'translate(100, 100) rotate(180) ' );\n  }\n  svg.appendChild( path );\n  return svg;\n};\n\n// get SVG path movmement\nfunction getArrowMovements( shape ) {\n  // use shape as movement if string\n  if ( typeof shape == 'string' ) {\n    return shape;\n  }\n  // create movement string\n  return 'M ' + shape.x0 + ',50' +\n    ' L ' + shape.x1 + ',' + ( shape.y1 + 50 ) +\n    ' L ' + shape.x2 + ',' + ( shape.y2 + 50 ) +\n    ' L ' + shape.x3 + ',50 ' +\n    ' L ' + shape.x2 + ',' + ( 50 - shape.y2 ) +\n    ' L ' + shape.x1 + ',' + ( 50 - shape.y1 ) +\n    ' Z';\n}\n\nPrevNextButton.prototype.onTap = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.parent.uiChange();\n  var method = this.isPrevious ? 'previous' : 'next';\n  this.parent[ method ]();\n};\n\nPrevNextButton.prototype.handleEvent = utils.handleEvent;\n\nPrevNextButton.prototype.onclick = function( event ) {\n  // only allow clicks from keyboard\n  var focused = document.activeElement;\n  if ( focused && focused == this.element ) {\n    this.onTap( event, event );\n  }\n};\n\n// -----  ----- //\n\nPrevNextButton.prototype.enable = function() {\n  if ( this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = false;\n  this.isEnabled = true;\n};\n\nPrevNextButton.prototype.disable = function() {\n  if ( !this.isEnabled ) {\n    return;\n  }\n  this.element.disabled = true;\n  this.isEnabled = false;\n};\n\nPrevNextButton.prototype.update = function() {\n  // index of first or last slide, if previous or next\n  var slides = this.parent.slides;\n  // enable is wrapAround and at least 2 slides\n  if ( this.parent.options.wrapAround && slides.length > 1 ) {\n    this.enable();\n    return;\n  }\n  var lastIndex = slides.length ? slides.length - 1 : 0;\n  var boundIndex = this.isPrevious ? 0 : lastIndex;\n  var method = this.parent.selectedIndex == boundIndex ? 'disable' : 'enable';\n  this[ method ]();\n};\n\nPrevNextButton.prototype.destroy = function() {\n  this.deactivate();\n};\n\n// -------------------------- Flickity prototype -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  prevNextButtons: true,\n  arrowShape: {\n    x0: 10,\n    x1: 60, y1: 50,\n    x2: 70, y2: 40,\n    x3: 30\n  }\n});\n\nFlickity.createMethods.push('_createPrevNextButtons');\nvar proto = Flickity.prototype;\n\nproto._createPrevNextButtons = function() {\n  if ( !this.options.prevNextButtons ) {\n    return;\n  }\n\n  this.prevButton = new PrevNextButton( -1, this );\n  this.nextButton = new PrevNextButton( 1, this );\n\n  this.on( 'activate', this.activatePrevNextButtons );\n};\n\nproto.activatePrevNextButtons = function() {\n  this.prevButton.activate();\n  this.nextButton.activate();\n  this.on( 'deactivate', this.deactivatePrevNextButtons );\n};\n\nproto.deactivatePrevNextButtons = function() {\n  this.prevButton.deactivate();\n  this.nextButton.deactivate();\n  this.off( 'deactivate', this.deactivatePrevNextButtons );\n};\n\n// --------------------------  -------------------------- //\n\nFlickity.PrevNextButton = PrevNextButton;\n\nreturn Flickity;\n\n}));\n","// page dots\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'tap-listener/tap-listener',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, TapListener, utils ) {\n      return factory( window, Flickity, TapListener, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('tap-listener'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.TapListener,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, TapListener, utils ) {\n\n// -------------------------- PageDots -------------------------- //\n\n'use strict';\n\nfunction PageDots( parent ) {\n  this.parent = parent;\n  this._create();\n}\n\nPageDots.prototype = new TapListener();\n\nPageDots.prototype._create = function() {\n  // create holder element\n  this.holder = document.createElement('ol');\n  this.holder.className = 'flickity-page-dots';\n  // create dots, array of elements\n  this.dots = [];\n  // events\n  this.on( 'tap', this.onTap );\n  this.on( 'pointerDown', this.parent.childUIPointerDown.bind( this.parent ) );\n};\n\nPageDots.prototype.activate = function() {\n  this.setDots();\n  this.bindTap( this.holder );\n  // add to DOM\n  this.parent.element.appendChild( this.holder );\n};\n\nPageDots.prototype.deactivate = function() {\n  // remove from DOM\n  this.parent.element.removeChild( this.holder );\n  TapListener.prototype.destroy.call( this );\n};\n\nPageDots.prototype.setDots = function() {\n  // get difference between number of slides and number of dots\n  var delta = this.parent.slides.length - this.dots.length;\n  if ( delta > 0 ) {\n    this.addDots( delta );\n  } else if ( delta < 0 ) {\n    this.removeDots( -delta );\n  }\n};\n\nPageDots.prototype.addDots = function( count ) {\n  var fragment = document.createDocumentFragment();\n  var newDots = [];\n  var length = this.dots.length;\n  var max = length + count;\n\n  for ( var i = length; i < max; i++ ) {\n    var dot = document.createElement('li');\n    dot.className = 'dot';\n    dot.setAttribute( 'aria-label', 'Page dot ' + ( i + 1 ) );\n    fragment.appendChild( dot );\n    newDots.push( dot );\n  }\n\n  this.holder.appendChild( fragment );\n  this.dots = this.dots.concat( newDots );\n};\n\nPageDots.prototype.removeDots = function( count ) {\n  // remove from this.dots collection\n  var removeDots = this.dots.splice( this.dots.length - count, count );\n  // remove from DOM\n  removeDots.forEach( function( dot ) {\n    this.holder.removeChild( dot );\n  }, this );\n};\n\nPageDots.prototype.updateSelected = function() {\n  // remove selected class on previous\n  if ( this.selectedDot ) {\n    this.selectedDot.className = 'dot';\n    this.selectedDot.removeAttribute('aria-current');\n  }\n  // don't proceed if no dots\n  if ( !this.dots.length ) {\n    return;\n  }\n  this.selectedDot = this.dots[ this.parent.selectedIndex ];\n  this.selectedDot.className = 'dot is-selected';\n  this.selectedDot.setAttribute( 'aria-current', 'step' );\n};\n\nPageDots.prototype.onTap = function( event ) {\n  var target = event.target;\n  // only care about dot clicks\n  if ( target.nodeName != 'LI' ) {\n    return;\n  }\n\n  this.parent.uiChange();\n  var index = this.dots.indexOf( target );\n  this.parent.select( index );\n};\n\nPageDots.prototype.destroy = function() {\n  this.deactivate();\n};\n\nFlickity.PageDots = PageDots;\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pageDots: true\n});\n\nFlickity.createMethods.push('_createPageDots');\n\nvar proto = Flickity.prototype;\n\nproto._createPageDots = function() {\n  if ( !this.options.pageDots ) {\n    return;\n  }\n  this.pageDots = new PageDots( this );\n  // events\n  this.on( 'activate', this.activatePageDots );\n  this.on( 'select', this.updateSelectedPageDots );\n  this.on( 'cellChange', this.updatePageDots );\n  this.on( 'resize', this.updatePageDots );\n  this.on( 'deactivate', this.deactivatePageDots );\n};\n\nproto.activatePageDots = function() {\n  this.pageDots.activate();\n};\n\nproto.updateSelectedPageDots = function() {\n  this.pageDots.updateSelected();\n};\n\nproto.updatePageDots = function() {\n  this.pageDots.setDots();\n};\n\nproto.deactivatePageDots = function() {\n  this.pageDots.deactivate();\n};\n\n// -----  ----- //\n\nFlickity.PageDots = PageDots;\n\nreturn Flickity;\n\n}));\n","// player & autoPlay\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      'ev-emitter/ev-emitter',\n      'fizzy-ui-utils/utils',\n      './flickity'\n    ], function( EvEmitter, utils, Flickity ) {\n      return factory( EvEmitter, utils, Flickity );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('ev-emitter'),\n      require('fizzy-ui-utils'),\n      require('./flickity')\n    );\n  } else {\n    // browser global\n    factory(\n      window.EvEmitter,\n      window.fizzyUIUtils,\n      window.Flickity\n    );\n  }\n\n}( window, function factory( EvEmitter, utils, Flickity ) {\n\n'use strict';\n\n// -------------------------- Player -------------------------- //\n\nfunction Player( parent ) {\n  this.parent = parent;\n  this.state = 'stopped';\n  // visibility change event handler\n  this.onVisibilityChange = this.visibilityChange.bind( this );\n  this.onVisibilityPlay = this.visibilityPlay.bind( this );\n}\n\nPlayer.prototype = Object.create( EvEmitter.prototype );\n\n// start play\nPlayer.prototype.play = function() {\n  if ( this.state == 'playing' ) {\n    return;\n  }\n  // do not play if page is hidden, start playing when page is visible\n  var isPageHidden = document.hidden;\n  if ( isPageHidden ) {\n    document.addEventListener( 'visibilitychange', this.onVisibilityPlay );\n    return;\n  }\n\n  this.state = 'playing';\n  // listen to visibility change\n  document.addEventListener( 'visibilitychange', this.onVisibilityChange );\n  // start ticking\n  this.tick();\n};\n\nPlayer.prototype.tick = function() {\n  // do not tick if not playing\n  if ( this.state != 'playing' ) {\n    return;\n  }\n\n  var time = this.parent.options.autoPlay;\n  // default to 3 seconds\n  time = typeof time == 'number' ? time : 3000;\n  var _this = this;\n  // HACK: reset ticks if stopped and started within interval\n  this.clear();\n  this.timeout = setTimeout( function() {\n    _this.parent.next( true );\n    _this.tick();\n  }, time );\n};\n\nPlayer.prototype.stop = function() {\n  this.state = 'stopped';\n  this.clear();\n  // remove visibility change event\n  document.removeEventListener( 'visibilitychange', this.onVisibilityChange );\n};\n\nPlayer.prototype.clear = function() {\n  clearTimeout( this.timeout );\n};\n\nPlayer.prototype.pause = function() {\n  if ( this.state == 'playing' ) {\n    this.state = 'paused';\n    this.clear();\n  }\n};\n\nPlayer.prototype.unpause = function() {\n  // re-start play if paused\n  if ( this.state == 'paused' ) {\n    this.play();\n  }\n};\n\n// pause if page visibility is hidden, unpause if visible\nPlayer.prototype.visibilityChange = function() {\n  var isPageHidden = document.hidden;\n  this[ isPageHidden ? 'pause' : 'unpause' ]();\n};\n\nPlayer.prototype.visibilityPlay = function() {\n  this.play();\n  document.removeEventListener( 'visibilitychange', this.onVisibilityPlay );\n};\n\n// -------------------------- Flickity -------------------------- //\n\nutils.extend( Flickity.defaults, {\n  pauseAutoPlayOnHover: true\n});\n\nFlickity.createMethods.push('_createPlayer');\nvar proto = Flickity.prototype;\n\nproto._createPlayer = function() {\n  this.player = new Player( this );\n\n  this.on( 'activate', this.activatePlayer );\n  this.on( 'uiChange', this.stopPlayer );\n  this.on( 'pointerDown', this.stopPlayer );\n  this.on( 'deactivate', this.deactivatePlayer );\n};\n\nproto.activatePlayer = function() {\n  if ( !this.options.autoPlay ) {\n    return;\n  }\n  this.player.play();\n  this.element.addEventListener( 'mouseenter', this );\n};\n\n// Player API, don't hate the ... thanks I know where the door is\n\nproto.playPlayer = function() {\n  this.player.play();\n};\n\nproto.stopPlayer = function() {\n  this.player.stop();\n};\n\nproto.pausePlayer = function() {\n  this.player.pause();\n};\n\nproto.unpausePlayer = function() {\n  this.player.unpause();\n};\n\nproto.deactivatePlayer = function() {\n  this.player.stop();\n  this.element.removeEventListener( 'mouseenter', this );\n};\n\n// ----- mouseenter/leave ----- //\n\n// pause auto-play on hover\nproto.onmouseenter = function() {\n  if ( !this.options.pauseAutoPlayOnHover ) {\n    return;\n  }\n  this.player.pause();\n  this.element.addEventListener( 'mouseleave', this );\n};\n\n// resume auto-play on hover off\nproto.onmouseleave = function() {\n  this.player.unpause();\n  this.element.removeEventListener( 'mouseleave', this );\n};\n\n// -----  ----- //\n\nFlickity.Player = Player;\n\nreturn Flickity;\n\n}));\n","// add, remove cell\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n\n'use strict';\n\n// append cells to a document fragment\nfunction getCellsFragment( cells ) {\n  var fragment = document.createDocumentFragment();\n  cells.forEach( function( cell ) {\n    fragment.appendChild( cell.element );\n  });\n  return fragment;\n}\n\n// -------------------------- add/remove cell prototype -------------------------- //\n\nvar proto = Flickity.prototype;\n\n/**\n * Insert, prepend, or append cells\n * @param {Element, Array, NodeList} elems\n * @param {Integer} index\n */\nproto.insert = function( elems, index ) {\n  var cells = this._makeCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n  var len = this.cells.length;\n  // default to append\n  index = index === undefined ? len : index;\n  // add cells with document fragment\n  var fragment = getCellsFragment( cells );\n  // append to slider\n  var isAppend = index == len;\n  if ( isAppend ) {\n    this.slider.appendChild( fragment );\n  } else {\n    var insertCellElement = this.cells[ index ].element;\n    this.slider.insertBefore( fragment, insertCellElement );\n  }\n  // add to this.cells\n  if ( index === 0 ) {\n    // prepend, add to start\n    this.cells = cells.concat( this.cells );\n  } else if ( isAppend ) {\n    // append, add to end\n    this.cells = this.cells.concat( cells );\n  } else {\n    // insert in this.cells\n    var endCells = this.cells.splice( index, len - index );\n    this.cells = this.cells.concat( cells ).concat( endCells );\n  }\n\n  this._sizeCells( cells );\n  this.cellChange( index, true );\n};\n\nproto.append = function( elems ) {\n  this.insert( elems, this.cells.length );\n};\n\nproto.prepend = function( elems ) {\n  this.insert( elems, 0 );\n};\n\n/**\n * Remove cells\n * @param {Element, Array, NodeList} elems\n */\nproto.remove = function( elems ) {\n  var cells = this.getCells( elems );\n  if ( !cells || !cells.length ) {\n    return;\n  }\n\n  var minCellIndex = this.cells.length - 1;\n  // remove cells from collection & DOM\n  cells.forEach( function( cell ) {\n    cell.remove();\n    var index = this.cells.indexOf( cell );\n    minCellIndex = Math.min( index, minCellIndex );\n    utils.removeFrom( this.cells, cell );\n  }, this );\n\n  this.cellChange( minCellIndex, true );\n};\n\n/**\n * logic to be run after a cell's size changes\n * @param {Element} elem - cell's element\n */\nproto.cellSizeChange = function( elem ) {\n  var cell = this.getCell( elem );\n  if ( !cell ) {\n    return;\n  }\n  cell.getSize();\n\n  var index = this.cells.indexOf( cell );\n  this.cellChange( index );\n};\n\n/**\n * logic any time a cell is changed: added, removed, or size changed\n * @param {Integer} changedCellIndex - index of the changed cell, optional\n */\nproto.cellChange = function( changedCellIndex, isPositioningSlider ) {\n  var prevSelectedElem = this.selectedElement;\n  this._positionCells( changedCellIndex );\n  this._getWrapShiftCells();\n  this.setGallerySize();\n  // update selectedIndex\n  // try to maintain position & select previous selected element\n  var cell = this.getCell( prevSelectedElem );\n  if ( cell ) {\n    this.selectedIndex = this.getCellSlideIndex( cell );\n  }\n  this.selectedIndex = Math.min( this.slides.length - 1, this.selectedIndex );\n\n  this.emitEvent( 'cellChange', [ changedCellIndex ] );\n  // position slider\n  this.select( this.selectedIndex );\n  // do not position slider after lazy load\n  if ( isPositioningSlider ) {\n    this.positionSliderAtSelected();\n  }\n};\n\n// -----  ----- //\n\nreturn Flickity;\n\n}));\n","// lazyload\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      'fizzy-ui-utils/utils'\n    ], function( Flickity, utils ) {\n      return factory( window, Flickity, utils );\n    });\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      window,\n      require('./flickity'),\n      require('fizzy-ui-utils')\n    );\n  } else {\n    // browser global\n    factory(\n      window,\n      window.Flickity,\n      window.fizzyUIUtils\n    );\n  }\n\n}( window, function factory( window, Flickity, utils ) {\n'use strict';\n\nFlickity.createMethods.push('_createLazyload');\nvar proto = Flickity.prototype;\n\nproto._createLazyload = function() {\n  this.on( 'select', this.lazyLoad );\n};\n\nproto.lazyLoad = function() {\n  var lazyLoad = this.options.lazyLoad;\n  if ( !lazyLoad ) {\n    return;\n  }\n  // get adjacent cells, use lazyLoad option for adjacent count\n  var adjCount = typeof lazyLoad == 'number' ? lazyLoad : 0;\n  var cellElems = this.getAdjacentCellElements( adjCount );\n  // get lazy images in those cells\n  var lazyImages = [];\n  cellElems.forEach( function( cellElem ) {\n    var lazyCellImages = getCellLazyImages( cellElem );\n    lazyImages = lazyImages.concat( lazyCellImages );\n  });\n  // load lazy images\n  lazyImages.forEach( function( img ) {\n    new LazyLoader( img, this );\n  }, this );\n};\n\nfunction getCellLazyImages( cellElem ) {\n  // check if cell element is lazy image\n  if ( cellElem.nodeName == 'IMG' ) {\n    var lazyloadAttr = cellElem.getAttribute('data-flickity-lazyload');\n    var srcAttr = cellElem.getAttribute('data-flickity-lazyload-src');\n    var srcsetAttr = cellElem.getAttribute('data-flickity-lazyload-srcset');\n    if ( lazyloadAttr || srcAttr || srcsetAttr ) {\n      return [ cellElem ];\n    }\n  }\n  // select lazy images in cell\n  var lazySelector = 'img[data-flickity-lazyload], ' +\n    'img[data-flickity-lazyload-src], img[data-flickity-lazyload-srcset]';\n  var imgs = cellElem.querySelectorAll( lazySelector );\n  return utils.makeArray( imgs );\n}\n\n// -------------------------- LazyLoader -------------------------- //\n\n/**\n * class to handle loading images\n */\nfunction LazyLoader( img, flickity ) {\n  this.img = img;\n  this.flickity = flickity;\n  this.load();\n}\n\nLazyLoader.prototype.handleEvent = utils.handleEvent;\n\nLazyLoader.prototype.load = function() {\n  this.img.addEventListener( 'load', this );\n  this.img.addEventListener( 'error', this );\n  // get src & srcset\n  var src = this.img.getAttribute('data-flickity-lazyload') ||\n    this.img.getAttribute('data-flickity-lazyload-src');\n  var srcset = this.img.getAttribute('data-flickity-lazyload-srcset');\n  // set src & serset\n  this.img.src = src;\n  if ( srcset ) {\n    this.img.setAttribute( 'srcset', srcset );\n  }\n  // remove attr\n  this.img.removeAttribute('data-flickity-lazyload');\n  this.img.removeAttribute('data-flickity-lazyload-src');\n  this.img.removeAttribute('data-flickity-lazyload-srcset');\n};\n\nLazyLoader.prototype.onload = function( event ) {\n  this.complete( event, 'flickity-lazyloaded' );\n};\n\nLazyLoader.prototype.onerror = function( event ) {\n  this.complete( event, 'flickity-lazyerror' );\n};\n\nLazyLoader.prototype.complete = function( event, className ) {\n  // unbind events\n  this.img.removeEventListener( 'load', this );\n  this.img.removeEventListener( 'error', this );\n\n  var cell = this.flickity.getParentCell( this.img );\n  var cellElem = cell && cell.element;\n  this.flickity.cellSizeChange( cellElem );\n\n  this.img.classList.add( className );\n  this.flickity.dispatchEvent( 'lazyLoad', event, cellElem );\n};\n\n// -----  ----- //\n\nFlickity.LazyLoader = LazyLoader;\n\nreturn Flickity;\n\n}));\n","/*!\n * Flickity v2.1.1\n * Touch, responsive, flickable carousels\n *\n * Licensed GPLv3 for open source use\n * or Flickity Commercial License for commercial use\n *\n * https://flickity.metafizzy.co\n * Copyright 2015-2018 Metafizzy\n */\n\n( function( window, factory ) {\n  // universal module definition\n  /* jshint strict: false */\n  if ( typeof define == 'function' && define.amd ) {\n    // AMD\n    define( [\n      './flickity',\n      './drag',\n      './prev-next-button',\n      './page-dots',\n      './player',\n      './add-remove-cell',\n      './lazyload'\n    ], factory );\n  } else if ( typeof module == 'object' && module.exports ) {\n    // CommonJS\n    module.exports = factory(\n      require('./flickity'),\n      require('./drag'),\n      require('./prev-next-button'),\n      require('./page-dots'),\n      require('./player'),\n      require('./add-remove-cell'),\n      require('./lazyload')\n    );\n  }\n\n})( window, function factory( Flickity ) {\n  /*jshint strict: false*/\n  return Flickity;\n});\n","import $ from 'jquery';\nimport Flickity from 'flickity';\n\n// This is required to fix an iOS10 bug for Flickity.\n// It is our own implementation of the Flickity 2.0 fix found here: http://bit.ly/2kU4mKW\n$(window).on('dragStart', (event) => {\n  const $target = $(event.target);\n  const $flickityEnabledEl = $target.closest('.flickity-enabled');\n\n  if ($flickityEnabledEl.length) {\n    const flickity = Flickity.data($flickityEnabledEl[0]);\n\n    window.removeEventListener('scroll', flickity);\n  }\n});\n","/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n *  https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n\n(function(window, document) {\n'use strict';\n\n\n// Exits early if all IntersectionObserver and IntersectionObserverEntry\n// features are natively supported.\nif ('IntersectionObserver' in window &&\n    'IntersectionObserverEntry' in window &&\n    'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n\n  // Minimal polyfill for Edge 15's lack of `isIntersecting`\n  // See: https://github.com/w3c/IntersectionObserver/issues/211\n  if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n    Object.defineProperty(window.IntersectionObserverEntry.prototype,\n      'isIntersecting', {\n      get: function () {\n        return this.intersectionRatio > 0;\n      }\n    });\n  }\n  return;\n}\n\n\n/**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observering a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\nvar registry = [];\n\n\n/**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\nfunction IntersectionObserverEntry(entry) {\n  this.time = entry.time;\n  this.target = entry.target;\n  this.rootBounds = entry.rootBounds;\n  this.boundingClientRect = entry.boundingClientRect;\n  this.intersectionRect = entry.intersectionRect || getEmptyRect();\n  this.isIntersecting = !!entry.intersectionRect;\n\n  // Calculates the intersection ratio.\n  var targetRect = this.boundingClientRect;\n  var targetArea = targetRect.width * targetRect.height;\n  var intersectionRect = this.intersectionRect;\n  var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n  // Sets intersection ratio.\n  if (targetArea) {\n    this.intersectionRatio = intersectionArea / targetArea;\n  } else {\n    // If area is zero and is intersecting, sets to 1, otherwise to 0\n    this.intersectionRatio = this.isIntersecting ? 1 : 0;\n  }\n}\n\n\n/**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n *     changes have queued. The function is not invoked if the queue has\n *     been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\nfunction IntersectionObserver(callback, opt_options) {\n\n  var options = opt_options || {};\n\n  if (typeof callback != 'function') {\n    throw new Error('callback must be a function');\n  }\n\n  if (options.root && options.root.nodeType != 1) {\n    throw new Error('root must be an Element');\n  }\n\n  // Binds and throttles `this._checkForIntersections`.\n  this._checkForIntersections = throttle(\n      this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n  // Private properties.\n  this._callback = callback;\n  this._observationTargets = [];\n  this._queuedEntries = [];\n  this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n  // Public properties.\n  this.thresholds = this._initThresholds(options.threshold);\n  this.root = options.root || null;\n  this.rootMargin = this._rootMarginValues.map(function(margin) {\n    return margin.value + margin.unit;\n  }).join(' ');\n}\n\n\n/**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\nIntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n\n/**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\nIntersectionObserver.prototype.POLL_INTERVAL = null;\n\n/**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\nIntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n\n/**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.observe = function(target) {\n  var isTargetAlreadyObserved = this._observationTargets.some(function(item) {\n    return item.element == target;\n  });\n\n  if (isTargetAlreadyObserved) {\n    return;\n  }\n\n  if (!(target && target.nodeType == 1)) {\n    throw new Error('target must be an Element');\n  }\n\n  this._registerInstance();\n  this._observationTargets.push({element: target, entry: null});\n  this._monitorIntersections();\n  this._checkForIntersections();\n};\n\n\n/**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\nIntersectionObserver.prototype.unobserve = function(target) {\n  this._observationTargets =\n      this._observationTargets.filter(function(item) {\n\n    return item.element != target;\n  });\n  if (!this._observationTargets.length) {\n    this._unmonitorIntersections();\n    this._unregisterInstance();\n  }\n};\n\n\n/**\n * Stops observing all target elements for intersection changes.\n */\nIntersectionObserver.prototype.disconnect = function() {\n  this._observationTargets = [];\n  this._unmonitorIntersections();\n  this._unregisterInstance();\n};\n\n\n/**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\nIntersectionObserver.prototype.takeRecords = function() {\n  var records = this._queuedEntries.slice();\n  this._queuedEntries = [];\n  return records;\n};\n\n\n/**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n *     a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\nIntersectionObserver.prototype._initThresholds = function(opt_threshold) {\n  var threshold = opt_threshold || [0];\n  if (!Array.isArray(threshold)) threshold = [threshold];\n\n  return threshold.sort().filter(function(t, i, a) {\n    if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n      throw new Error('threshold must be a number between 0 and 1 inclusively');\n    }\n    return t !== a[i - 1];\n  });\n};\n\n\n/**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n *     defaulting to '0px'.\n * @return {Array<Object>} An array of margin objects with the keys\n *     value and unit.\n */\nIntersectionObserver.prototype._parseRootMargin = function(opt_rootMargin) {\n  var marginString = opt_rootMargin || '0px';\n  var margins = marginString.split(/\\s+/).map(function(margin) {\n    var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n    if (!parts) {\n      throw new Error('rootMargin must be specified in pixels or percent');\n    }\n    return {value: parseFloat(parts[1]), unit: parts[2]};\n  });\n\n  // Handles shorthand.\n  margins[1] = margins[1] || margins[0];\n  margins[2] = margins[2] || margins[0];\n  margins[3] = margins[3] || margins[1];\n\n  return margins;\n};\n\n\n/**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibilty state is visible.\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function() {\n  if (!this._monitoringIntersections) {\n    this._monitoringIntersections = true;\n\n    // If a poll interval is set, use polling instead of listening to\n    // resize and scroll events or DOM mutations.\n    if (this.POLL_INTERVAL) {\n      this._monitoringInterval = setInterval(\n          this._checkForIntersections, this.POLL_INTERVAL);\n    }\n    else {\n      addEvent(window, 'resize', this._checkForIntersections, true);\n      addEvent(document, 'scroll', this._checkForIntersections, true);\n\n      if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {\n        this._domObserver = new MutationObserver(this._checkForIntersections);\n        this._domObserver.observe(document, {\n          attributes: true,\n          childList: true,\n          characterData: true,\n          subtree: true\n        });\n      }\n    }\n  }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function() {\n  if (this._monitoringIntersections) {\n    this._monitoringIntersections = false;\n\n    clearInterval(this._monitoringInterval);\n    this._monitoringInterval = null;\n\n    removeEvent(window, 'resize', this._checkForIntersections, true);\n    removeEvent(document, 'scroll', this._checkForIntersections, true);\n\n    if (this._domObserver) {\n      this._domObserver.disconnect();\n      this._domObserver = null;\n    }\n  }\n};\n\n\n/**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\nIntersectionObserver.prototype._checkForIntersections = function() {\n  var rootIsInDom = this._rootIsInDom();\n  var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n\n  this._observationTargets.forEach(function(item) {\n    var target = item.element;\n    var targetRect = getBoundingClientRect(target);\n    var rootContainsTarget = this._rootContainsTarget(target);\n    var oldEntry = item.entry;\n    var intersectionRect = rootIsInDom && rootContainsTarget &&\n        this._computeTargetAndRootIntersection(target, rootRect);\n\n    var newEntry = item.entry = new IntersectionObserverEntry({\n      time: now(),\n      target: target,\n      boundingClientRect: targetRect,\n      rootBounds: rootRect,\n      intersectionRect: intersectionRect\n    });\n\n    if (!oldEntry) {\n      this._queuedEntries.push(newEntry);\n    } else if (rootIsInDom && rootContainsTarget) {\n      // If the new entry intersection ratio has crossed any of the\n      // thresholds, add a new entry.\n      if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n        this._queuedEntries.push(newEntry);\n      }\n    } else {\n      // If the root is not in the DOM or target is not contained within\n      // root but the previous entry for this target had an intersection,\n      // add a new record indicating removal.\n      if (oldEntry && oldEntry.isIntersecting) {\n        this._queuedEntries.push(newEntry);\n      }\n    }\n  }, this);\n\n  if (this._queuedEntries.length) {\n    this._callback(this.takeRecords(), this);\n  }\n};\n\n\n/**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} rootRect The bounding rect of the root after being\n *     expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n *     intersection is found.\n * @private\n */\nIntersectionObserver.prototype._computeTargetAndRootIntersection =\n    function(target, rootRect) {\n\n  // If the element isn't displayed, an intersection can't happen.\n  if (window.getComputedStyle(target).display == 'none') return;\n\n  var targetRect = getBoundingClientRect(target);\n  var intersectionRect = targetRect;\n  var parent = getParentNode(target);\n  var atRoot = false;\n\n  while (!atRoot) {\n    var parentRect = null;\n    var parentComputedStyle = parent.nodeType == 1 ?\n        window.getComputedStyle(parent) : {};\n\n    // If the parent isn't displayed, an intersection can't happen.\n    if (parentComputedStyle.display == 'none') return;\n\n    if (parent == this.root || parent == document) {\n      atRoot = true;\n      parentRect = rootRect;\n    } else {\n      // If the element has a non-visible overflow, and it's not the <body>\n      // or <html> element, update the intersection rect.\n      // Note: <body> and <html> cannot be clipped to a rect that's not also\n      // the document rect, so no need to compute a new intersection.\n      if (parent != document.body &&\n          parent != document.documentElement &&\n          parentComputedStyle.overflow != 'visible') {\n        parentRect = getBoundingClientRect(parent);\n      }\n    }\n\n    // If either of the above conditionals set a new parentRect,\n    // calculate new intersection data.\n    if (parentRect) {\n      intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n\n      if (!intersectionRect) break;\n    }\n    parent = getParentNode(parent);\n  }\n  return intersectionRect;\n};\n\n\n/**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {Object} The expanded root rect.\n * @private\n */\nIntersectionObserver.prototype._getRootRect = function() {\n  var rootRect;\n  if (this.root) {\n    rootRect = getBoundingClientRect(this.root);\n  } else {\n    // Use <html>/<body> instead of window since scroll bars affect size.\n    var html = document.documentElement;\n    var body = document.body;\n    rootRect = {\n      top: 0,\n      left: 0,\n      right: html.clientWidth || body.clientWidth,\n      width: html.clientWidth || body.clientWidth,\n      bottom: html.clientHeight || body.clientHeight,\n      height: html.clientHeight || body.clientHeight\n    };\n  }\n  return this._expandRectByRootMargin(rootRect);\n};\n\n\n/**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {Object} rect The rect object to expand.\n * @return {Object} The expanded rect.\n * @private\n */\nIntersectionObserver.prototype._expandRectByRootMargin = function(rect) {\n  var margins = this._rootMarginValues.map(function(margin, i) {\n    return margin.unit == 'px' ? margin.value :\n        margin.value * (i % 2 ? rect.width : rect.height) / 100;\n  });\n  var newRect = {\n    top: rect.top - margins[0],\n    right: rect.right + margins[1],\n    bottom: rect.bottom + margins[2],\n    left: rect.left - margins[3]\n  };\n  newRect.width = newRect.right - newRect.left;\n  newRect.height = newRect.bottom - newRect.top;\n\n  return newRect;\n};\n\n\n/**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n *    particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n *    particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\nIntersectionObserver.prototype._hasCrossedThreshold =\n    function(oldEntry, newEntry) {\n\n  // To make comparing easier, an entry that has a ratio of 0\n  // but does not actually intersect is given a value of -1\n  var oldRatio = oldEntry && oldEntry.isIntersecting ?\n      oldEntry.intersectionRatio || 0 : -1;\n  var newRatio = newEntry.isIntersecting ?\n      newEntry.intersectionRatio || 0 : -1;\n\n  // Ignore unchanged ratios\n  if (oldRatio === newRatio) return;\n\n  for (var i = 0; i < this.thresholds.length; i++) {\n    var threshold = this.thresholds[i];\n\n    // Return true if an entry matches a threshold or if the new ratio\n    // and the old ratio are on the opposite sides of a threshold.\n    if (threshold == oldRatio || threshold == newRatio ||\n        threshold < oldRatio !== threshold < newRatio) {\n      return true;\n    }\n  }\n};\n\n\n/**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\nIntersectionObserver.prototype._rootIsInDom = function() {\n  return !this.root || containsDeep(document, this.root);\n};\n\n\n/**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\nIntersectionObserver.prototype._rootContainsTarget = function(target) {\n  return containsDeep(this.root || document, target);\n};\n\n\n/**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\nIntersectionObserver.prototype._registerInstance = function() {\n  if (registry.indexOf(this) < 0) {\n    registry.push(this);\n  }\n};\n\n\n/**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\nIntersectionObserver.prototype._unregisterInstance = function() {\n  var index = registry.indexOf(this);\n  if (index != -1) registry.splice(index, 1);\n};\n\n\n/**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\nfunction now() {\n  return window.performance && performance.now && performance.now();\n}\n\n\n/**\n * Throttles a function and delays its executiong, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n *     function can be called again.\n * @return {Function} The throttled function.\n */\nfunction throttle(fn, timeout) {\n  var timer = null;\n  return function () {\n    if (!timer) {\n      timer = setTimeout(function() {\n        fn();\n        timer = null;\n      }, timeout);\n    }\n  };\n}\n\n\n/**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n *     phase. Note: this only works in modern browsers.\n */\nfunction addEvent(node, event, fn, opt_useCapture) {\n  if (typeof node.addEventListener == 'function') {\n    node.addEventListener(event, fn, opt_useCapture || false);\n  }\n  else if (typeof node.attachEvent == 'function') {\n    node.attachEvent('on' + event, fn);\n  }\n}\n\n\n/**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n *     flag set to true, it should be set to true here in order to remove it.\n */\nfunction removeEvent(node, event, fn, opt_useCapture) {\n  if (typeof node.removeEventListener == 'function') {\n    node.removeEventListener(event, fn, opt_useCapture || false);\n  }\n  else if (typeof node.detatchEvent == 'function') {\n    node.detatchEvent('on' + event, fn);\n  }\n}\n\n\n/**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object} The intersection rect or undefined if no intersection\n *     is found.\n */\nfunction computeRectIntersection(rect1, rect2) {\n  var top = Math.max(rect1.top, rect2.top);\n  var bottom = Math.min(rect1.bottom, rect2.bottom);\n  var left = Math.max(rect1.left, rect2.left);\n  var right = Math.min(rect1.right, rect2.right);\n  var width = right - left;\n  var height = bottom - top;\n\n  return (width >= 0 && height >= 0) && {\n    top: top,\n    bottom: bottom,\n    left: left,\n    right: right,\n    width: width,\n    height: height\n  };\n}\n\n\n/**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {Object} The (possibly shimmed) rect of the element.\n */\nfunction getBoundingClientRect(el) {\n  var rect;\n\n  try {\n    rect = el.getBoundingClientRect();\n  } catch (err) {\n    // Ignore Windows 7 IE11 \"Unspecified error\"\n    // https://github.com/w3c/IntersectionObserver/pull/205\n  }\n\n  if (!rect) return getEmptyRect();\n\n  // Older IE\n  if (!(rect.width && rect.height)) {\n    rect = {\n      top: rect.top,\n      right: rect.right,\n      bottom: rect.bottom,\n      left: rect.left,\n      width: rect.right - rect.left,\n      height: rect.bottom - rect.top\n    };\n  }\n  return rect;\n}\n\n\n/**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {Object} The empty rect.\n */\nfunction getEmptyRect() {\n  return {\n    top: 0,\n    bottom: 0,\n    left: 0,\n    right: 0,\n    width: 0,\n    height: 0\n  };\n}\n\n/**\n * Checks to see if a parent element contains a child elemnt (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\nfunction containsDeep(parent, child) {\n  var node = child;\n  while (node) {\n    if (node == parent) return true;\n\n    node = getParentNode(node);\n  }\n  return false;\n}\n\n\n/**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\nfunction getParentNode(node) {\n  var parent = node.parentNode;\n\n  if (parent && parent.nodeType == 11 && parent.host) {\n    // If the parent is a shadow root, return the host element.\n    return parent.host;\n  }\n  return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}(window, document));\n","/*!\n * rimg v2.1.0\n * (c) 2018 Pixel Union\n */\n/**\n * The default template render function. Turns a template string into an image\n * URL.\n *\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\nfunction defaultTemplateRender(template, size) {\n  return template.replace('{size}', size.width + 'x' + size.height);\n}\n\n/**\n * @type Settings\n */\nvar defaults = {\n  scale: 1,\n  template: false,\n  templateRender: defaultTemplateRender,\n  max: { width: Infinity, height: Infinity },\n  round: 32,\n  placeholder: false\n};\n\n/**\n * Get a data attribute value from an element, with a default fallback and\n * sanitization step.\n *\n * @param {Element} el\n *\n * @param {String} name\n *        The data attribute name.\n *\n * @param {Object} options\n *        An object holding fallback values if the data attribute does not\n *        exist. If this object doesn't have the property, we further fallback\n *        to our defaults.\n *\n * @param {Function} [sanitize]\n *        A function to sanitize the data attribute value with.\n *\n * @returns {String|*}\n */\nfunction getData(el, name, options, sanitize) {\n  var attr = 'data-rimg-' + name;\n  if (!el.hasAttribute(attr)) return options[name] || defaults[name];\n\n  var value = el.getAttribute(attr);\n\n  return sanitize ? sanitize(value) : value;\n}\n\n/**\n * Sanitize data attributes that represent a size (in the form of `10x10`).\n *\n * @param {String} value\n * @returns {Object} An object with `width` and `height` properties.\n */\nfunction parseSize(value) {\n  value = value.split('x');\n  return { width: parseInt(value[0], 10), height: parseInt(value[1], 10) };\n}\n\n/**\n * Loads information about an element.\n *\n * Options can be set on the element itself using data attributes, or through\n * the `options` parameter. Data attributes take priority.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n * @returns {Item}\n */\nfunction parseItem(el) {\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  var isImage = el.hasAttribute('data-rimg-template');\n\n  /**\n   * @typedef {Settings} Item\n   */\n  return {\n    el: el,\n\n    // Type of element\n    isImage: isImage,\n    isBackgroundImage: isImage && el.tagName !== 'IMG',\n\n    // Image scale\n    scale: getData(el, 'scale', options),\n\n    // Device density\n    density: window.devicePixelRatio || 1,\n\n    // Image template URL\n    template: getData(el, 'template', options),\n    templateRender: options.templateRender || defaults.templateRender,\n\n    // Maximum image dimensions\n    max: getData(el, 'max', options, parseSize),\n\n    // Round image dimensions to the nearest multiple\n    round: getData(el, 'round', options),\n\n    // Placeholder image dimensions\n    placeholder: getData(el, 'placeholder', options, parseSize)\n  };\n}\n\n/**\n * Round to the nearest multiple.\n *\n * This is so we don't tax the image server too much.\n *\n * @param {Number} size The size, in pixels.\n * @param {Number} multiple The multiple to round to the nearest.\n * @returns {Number}\n */\nfunction roundSize(size, multiple) {\n  return Math.ceil(size / multiple) * multiple;\n}\n\n/**\n * Get the size of an element.\n *\n * If it is too small, it's parent element is checked, and so on. This helps\n * avoid the situation where an element doesn't have a size yet or is positioned\n * out of the layout.\n *\n * @param {HTMLElement} el\n * @return {Object} size\n * @return {Number} size.width The width, in pixels.\n * @return {Number} size.height The height, in pixels.\n */\nfunction getElementSize(el) {\n  var size = { width: 0, height: 0 };\n\n  while (el) {\n    size.width = el.offsetWidth;\n    size.height = el.offsetHeight;\n    if (size.width > 20 && size.height > 20) break;\n    el = el.parentNode;\n  }\n\n  return size;\n}\n\n/**\n * Trigger a custom event.\n *\n * Note: this approach is deprecated, but still required to support older\n * browsers such as IE 10.\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/Guide/Events/Creating_and_triggering_events\n *\n * @param {HTMLElement} el\n *        The element to trigger the event on.\n *\n * @param {String} name\n *        The event name.\n *\n * @returns {Boolean}\n *          True if the event was canceled.\n */\nfunction trigger(el, name) {\n  var event = document.createEvent('Event');\n  event.initEvent(name, true, true);\n  return !el.dispatchEvent(event);\n}\n\n/**\n * Return the maximum supported density of the image, given the container.\n *\n * @param {Item} item\n * @param {Size} size\n */\nfunction supportedDensity(item, size) {\n  return Math.min(Math.min(Math.max(item.max.width / size.width, 1), item.density), Math.min(Math.max(item.max.height / size.height, 1), item.density)).toFixed(2);\n}\n\n/**\n * Set the image URL on the element. Supports background images and `srcset`.\n *\n * @param {Item} item\n * @param {Size} size\n * @param {Boolean} isPlaceholder\n */\nfunction setImage(item, size, isPlaceholder, onLoad) {\n  var render = item.templateRender;\n  var density = isPlaceholder ? 1 : supportedDensity(item, size);\n  var round = isPlaceholder ? 1 : item.round;\n\n  var width = roundSize(size.width * density, round);\n  var height = roundSize(size.height * density, round);\n  var displaySize = width > item.max.width || height > item.max.height ? { width: item.max.width, height: item.max.height } : { width: width, height: height };\n\n  var url = render(item.template, displaySize);\n\n  // On load callback\n  var image = new Image();\n  image.onload = onLoad;\n  image.src = url;\n\n  // Set image\n  if (item.isBackgroundImage) {\n    item.el.style.backgroundImage = 'url(\\'' + url + '\\')';\n  } else {\n    item.el.setAttribute('srcset', url + ' ' + density + 'x');\n  }\n}\n\n/**\n * Load the image, set loaded status, and trigger the load event.\n *\n * @fires rimg:load\n * @fires rimg:error\n * @param {Item} item\n * @param {Size} size\n */\nfunction loadFullImage(item, size) {\n  var el = item.el;\n\n  setImage(item, size, false, function (event) {\n    if (event.type === 'load') {\n      el.setAttribute('data-rimg', 'loaded');\n    } else {\n      el.setAttribute('data-rimg', 'error');\n      trigger(el, 'rimg:error');\n    }\n\n    trigger(el, 'rimg:load');\n  });\n}\n\n/**\n * Load in a responsive image.\n *\n * Sets the image's `srcset` attribute to the final image URLs, calculated based\n * on the actual size the image is being shown at.\n *\n * @fires rimg:loading\n *        The image URLs have been set and we are waiting for them to load.\n *\n * @fires rimg:loaded\n *        The final image has loaded.\n *\n * @fires rimg:error\n *        The final image failed loading.\n *\n * @param {Item} item\n */\nfunction loadImage(item) {\n  var el = item.el;\n\n  // Already loaded?\n  var status = el.getAttribute('data-rimg');\n  if (status === 'loading' || status === 'loaded') return;\n\n  // Is the SVG loaded?\n  if (!el.complete && !item.isBackgroundImage) {\n    // Wait for the load event, then call load image\n    el.addEventListener('load', function cb() {\n      el.removeEventListener('load', cb);\n      loadImage(item);\n    });\n\n    return;\n  }\n\n  // Trigger loading event, and stop if cancelled\n  if (trigger(el, 'rimg:loading')) return;\n\n  // Mark as loading\n  el.setAttribute('data-rimg', 'loading');\n\n  // Get element size. This is used as the ideal display size.\n  var size = getElementSize(item.el);\n\n  size.width *= item.scale;\n  size.height *= item.scale;\n\n  if (item.placeholder) {\n    // Load a placeholder image first, followed by the full image. Force the\n    // element to keep its dimensions while it loads. If the image is smaller\n    // than the element size, use the image's size. Density is taken into account\n    // for HiDPI devices to avoid blurry images.\n    if (!item.isBackgroundImage) {\n      el.setAttribute('width', Math.min(Math.floor(item.max.width / item.density), size.width));\n      el.setAttribute('height', Math.min(Math.floor(item.max.height / item.density), size.height));\n    }\n\n    setImage(item, item.placeholder, true, function () {\n      return loadFullImage(item, size);\n    });\n  } else {\n    loadFullImage(item, size);\n  }\n}\n\n/**\n * Prepare an element to be displayed on the screen.\n *\n * Images have special logic applied to them to swap out the different sources.\n *\n * @fires rimg:enter\n *        The element is entering the viewport.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\nfunction load(el, options) {\n  if (!el) return;\n  trigger(el, 'rimg:enter');\n\n  var item = parseItem(el, options);\n  if (item.isImage) {\n    if (!item.isBackgroundImage) {\n      el.setAttribute('data-rimg-template-svg', el.getAttribute('srcset'));\n    }\n\n    loadImage(item);\n  }\n}\n\n/**\n * Prepare an element to be displayed on the screen.\n *\n * Images have special logic applied to them to swap out the different sources.\n *\n * @fires rimg:enter\n *        The element is entering the viewport.\n *\n * @param {HTMLElement} el\n * @param {Settings} options\n */\nfunction update(el, options) {\n  if (!el) return;\n  trigger(el, 'rimg:update');\n\n  var item = parseItem(el, options);\n\n  if (item.isImage) {\n    if (!item.isBackgroundImage) {\n      el.setAttribute('data-rimg', 'lazy');\n      el.setAttribute('srcset', el.getAttribute('data-rimg-template-svg'));\n    }\n\n    loadImage(item);\n  }\n}\n\n/**\n * @typedef {Object} Size\n * @property {Number} width\n * @property {Number} height\n */\n\n/**\n * A function to turn a template string into a URL.\n *\n * @callback TemplateRenderer\n * @param {String} template\n * @param {Size} size\n * @returns {String}\n */\n\n/**\n * @typedef {Object} Settings\n *\n * @property {String} [template]\n *           A template string used to generate URLs for an image. This allows us to\n *           dynamically load images with sizes to match the container's size.\n *\n * @property {TemplateRenderer} [templateRender]\n *           A function to turn a template string into a URL.\n *\n * @property {Size} [max]\n *           The maximum available size for the image. This ensures we don't\n *           try to load an image larger than is possible.\n *\n * @property {Number} [round]\n *           Round image dimensions to the nearest multiple. This is intended to\n *           tax the image server less by lowering the number of possible image\n *           sizes requested.\n *\n * @property {Size} [placeholder]\n *           The size of the lo-fi image to load before the full image.\n */\n\n/**\n * Initialize the responsive image handler.\n *\n * @param {String|HTMLElement|NodeList} selector\n *        The CSS selector, element, or elements to track for lazy-loading.\n *\n * @param {Settings} options\n *\n * @returns {PublicApi}\n */\nfunction rimg() {\n  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  // Intersections\n  var io = new IntersectionObserver(function (entries) {\n    entries.forEach(function (entry) {\n      if (entry.isIntersecting || entry.intersectionRatio > 0) {\n        io.unobserve(entry.target);\n        load(entry.target, options);\n      }\n    });\n  }, {\n    // Watch the viewport, with 20% vertical margins\n    rootMargin: '20% 0px'\n  });\n\n  /**\n   * @typedef {Object} PublicApi\n   */\n  var api = {\n    /**\n     * Track a new selector, element, or nodelist for lazy-loading.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    track: function track() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n\n      var els = querySelector(selector);\n      for (var i = 0; i < els.length; i++) {\n        io.observe(els[i]);\n      }\n    },\n    update: function update$$1() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"loaded\"]';\n\n      var els = querySelector(selector);\n      for (var i = 0; i < els.length; i++) {\n        update(els[i], options);\n      }\n    },\n\n\n    /**\n     * Stop tracking element(s) for lazy-loading.\n     * @type Function\n     * @param {String|HTMLElement|NodeList} selector\n     */\n    untrack: function untrack() {\n      var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg]';\n\n      var els = querySelector(selector);\n      for (var i = 0; i < els.length; i++) {\n        io.unobserve(els[i]);\n      }\n    },\n\n\n    /**\n     * Unload all event handlers and observers.\n     * @type Function\n     */\n    unload: function unload() {\n      io.disconnect();\n    }\n  };\n\n  // Add initial elements\n  api.track(selector);\n\n  return api;\n}\n\n/**\n * Finds a group of elements on the page.\n *\n * @param {String|HTMLElement|NodeList} selector\n * @returns {Object} An array-like object.\n */\nfunction querySelector(selector) {\n  if (typeof selector === 'string') {\n    return document.querySelectorAll(selector);\n  }\n\n  if (selector instanceof HTMLElement) {\n    return [selector];\n  }\n\n  if (selector instanceof NodeList) {\n    return selector;\n  }\n\n  return [];\n}\n\nexport default rimg;\n","/*!\n * rimg-shopify v2.2.0\n * (c) 2018 Pixel Union\n */\nimport rimg from 'rimg';\n\n/**\n * Polyfill for Element.matches().\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/Element/matches\n */\nif (!Element.prototype.matches) {\n  Element.prototype.matches = Element.prototype.matchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.webkitMatchesSelector || function (s) {\n    var matches = (this.document || this.ownerDocument).querySelectorAll(s),\n        i = matches.length;\n    while (--i >= 0 && matches.item(i) !== this) {}\n    return i > -1;\n  };\n}\n\nvar state = {\n  init: init,\n  watch: watch,\n  unwatch: unwatch\n};\n\nfunction init() {\n  var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '[data-rimg=\"lazy\"]';\n  var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n  state.selector = selector;\n  state.instance = rimg(selector, options);\n  state.loadedWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n\n  // Listen for Shopify theme editor events\n  document.addEventListener('shopify:section:load', function (event) {\n    return watch(event.target);\n  });\n\n  window.addEventListener('resize', function () {\n    return _update();\n  });\n\n  document.addEventListener('shopify:section:unload', function (event) {\n    return unwatch(event.target);\n  });\n\n  // Listen for custom events to allow themes to hook into rimg\n  document.addEventListener('theme:rimg:watch', function (event) {\n    return watch(event.target);\n  });\n\n  document.addEventListener('theme:rimg:unwatch', function (event) {\n    return unwatch(event.target);\n  });\n\n  // Support custom events triggered through jQuery\n  // See: https://github.com/jquery/jquery/issues/3347\n  if (window.jQuery) {\n    jQuery(document).on({\n      'theme:rimg:watch': function themeRimgWatch(event) {\n        return watch(event.target);\n      },\n      'theme:rimg:unwatch': function themeRimgUnwatch(event) {\n        return unwatch(event.target);\n      }\n    });\n  }\n}\n\n/**\n * Track an element, and its children.\n *\n * @param {HTMLElement} el\n */\nfunction watch(el) {\n  // Track element\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.track(el);\n  }\n\n  // Track element's children\n  state.instance.track(el.querySelectorAll(state.selector));\n}\n\n/**\n * Untrack an element, and its children\n *\n * @param {HTMLElement} el\n * @private\n */\nfunction unwatch(el) {\n  // Untrack element's children\n  state.instance.untrack(el.querySelectorAll(state.selector));\n\n  // Untrack element\n  if (typeof el.matches === 'function' && el.matches(state.selector)) {\n    state.instance.untrack(el);\n  }\n}\n\n/**\n * Update an element, and its children.\n *\n * @param {HTMLElement} el\n */\nfunction _update() {\n  var currentWidth = Math.max(document.documentElement.clientWidth, window.innerWidth || 0);\n\n  // Return if we're not 2x smaller, or larger than the existing loading size\n  if (currentWidth / state.loadedWidth > 0.5 && currentWidth / state.loadedWidth < 2) {\n    return;\n  }\n\n  state.loadedWidth = currentWidth;\n  state.instance.update();\n}\n\nexport default state;\n","export default class Quantity {\n  constructor(el) {\n    this.$el = $(el);\n    this.$inputParent = this.$el.find('.form-field--qty-input');\n    this.$input = this.$el.find('[data-quantity-input]');\n    this.$selectParent = this.$el.find('.form-field--qty-select');\n    this.$select = this.$el.find('[data-quantity-select]');\n\n    this._watchSelect = this._watchSelect.bind(this);\n    this._watchInput = this._watchInput.bind(this);\n\n    this.$select.on('change.quantity', this._watchSelect);\n    this.$input.on('change.quantity', this._watchInput);\n  }\n\n  unload() {\n    this.$el.off('.quantity');\n  }\n\n  _validateValue(event) {\n    const baseValue = parseInt(event.currentTarget.value, 10);\n\n    return isNaN(baseValue) ? 1 : baseValue;\n  }\n\n  _watchSelect(event) {\n    const value = this._validateValue(event);\n\n    // Update input to match select\n    this.$input.val(value).trigger('change');\n\n    // Switch to quantity input when 10 or more\n    if (value >= 10) {\n      this.$inputParent\n        .removeClass('hidden')\n        .addClass('visible');\n\n      this.$input\n        .focus()\n        .removeAttr('tabindex')\n        .select();\n\n      this.$selectParent\n        .removeClass('visible')\n        .addClass('hidden');\n\n      this.$select.attr('tabindex', '-1');\n    }\n  }\n\n  _watchInput(event) {\n    this.$input.val(this._validateValue(event));\n  }\n}\n","import $ from 'jquery';\nimport Quantity from './helpers/Quantity';\n\nexport default class Forms {\n  constructor($el, selector = '.form-field-input') {\n    this.$el = $el;\n    this.filledClass = 'form-field-filled';\n    this.fieldSelector = selector;\n\n    this.quantityItems = [];\n    this.$quantityWrapper = this.$el.find('[data-quantity-wrapper]');\n\n    this._toggleFilled = this._toggleFilled.bind(this);\n    this.$el.on('focus.forms', this.fieldSelector, this._toggleFilled);\n    this.$el.on('blur.forms', this.fieldSelector, this._toggleFilled);\n\n    this._checkFilled();\n\n    if (this.$quantityWrapper.length) {\n      this.$quantityWrapper.each((i, el) => {\n        this.quantityItems.push(\n          new Quantity(el)\n        );\n      });\n    }\n  }\n\n  unload() {\n    this.$el.off('.forms');\n\n    this.quantityItems.forEach((quantityItem) => {\n      quantityItem.unload();\n    });\n  }\n\n  _checkFilled() {\n    this.$el.find(this.fieldSelector).each((i, el) => {\n      if ($(el).hasClass(this.filledClass)) return;\n\n      this._toggleFilled(null, el);\n    });\n  }\n\n  _toggleFilled(event = null, el = false) {\n    const $el = event ? $(event.currentTarget) : $(el);\n    const value = $el.val();\n\n    const isFilled = value && value.length > 0 ? true : false;\n\n    $el.toggleClass(this.filledClass, isFilled);\n  }\n}\n","import $ from 'jquery';\n\nimport Forms from '../Forms';\n\nexport default class Account {\n  constructor() {\n    this.$accountContents = $('[data-template-account]');\n    this.$loginContent = $('[data-template-account-login]');\n    this.$addressesContent = $('[data-template-account-addresses]');\n    this.$addressButtonFocus = null;\n\n    this._loginToggle = this._loginToggle.bind(this);\n\n    if (this.$loginContent.length) {\n      this._initLoginPage();\n    }\n\n    if (this.$addressesContent.length) {\n      this._initAddressPage();\n    }\n\n    if (this.$accountContents.length) {\n      this._init();\n    }\n  }\n\n  _init() {\n    new Forms(this.$accountContents);\n  }\n\n  _initLoginPage() {\n    this.$loginToggle = this.$loginContent.find('[data-login-toggle]');\n    this.$login = this.$loginContent.find('[data-account-login-main]');\n    this.$recovery = this.$loginContent.find('[data-account-login-recovery]');\n    this.$recoveryHasMessage = this.$recovery.find('[data-recovery-has-message]');\n\n    this.$loginToggle.on('click', this._loginToggle);\n\n    if (this.$recoveryHasMessage.length) {\n      this._loginToggle();\n    }\n  }\n\n  _loginToggle(event = null) {\n    if (event) {\n      event.preventDefault();\n    }\n\n    this.$login.toggleClass('visible');\n    this.$recovery.toggleClass('visible');\n  }\n\n  _initAddressPage() {\n    const $customerAddresses = this.$addressesContent.find('[data-address-id]');\n\n    this.$addressesContent.on('click', '[data-edit-address]', (event) => {\n      const $target = $(event.currentTarget);\n      const itemId = $target.attr('data-edit-address');\n\n      $customerAddresses.removeClass('visible');\n      this.$addressButtonFocus = $target;\n\n      $(`[data-address-id=\"${itemId}\"]`)\n        .addClass('visible')\n        .find('.form-field-input')\n        .eq(0)\n        .focus();\n    });\n\n    this.$addressesContent.on('click', '[data-edit-address-cancel]', () => {\n      $customerAddresses.removeClass('visible');\n      $('[data-address-id=\"new\"]').addClass('visible');\n\n      // Return focus to last used button\n      this.$addressButtonFocus.focus();\n      this.$addressButtonFocus = null;\n    });\n\n    this.$addressesContent.on('click', '[data-delete-address]', (event) => {\n      const itemId = $(event.target).attr('data-delete-address');\n      Shopify.CustomerAddress.destroy(itemId, '');\n    });\n\n    $customerAddresses.each((i, el) => {\n      const id = $(el).attr('data-address-id');\n\n      const countryEl = `customer_addr_${id}_country`;\n      const provinceEl = `customer_addr_${id}_province`;\n      const options = { hideElement: `address_province_container_${id}` };\n\n      // Initiate provinces for address forms\n      new Shopify.CountryProvinceSelector(countryEl, provinceEl, options);\n    });\n  }\n}\n","import $ from 'jquery';\n\nimport Forms from '../Forms';\n\nexport default class Contact {\n  constructor() {\n    this.$contactContents = $('[data-template-contact]');\n\n    if (this.$contactContents.length) {\n      new Forms(this.$contactContents);\n    }\n  }\n}\n","\n'use strict'\n\nvar selectors = [\n\t'iframe[src*=\"player.vimeo.com\"]',\n\t'iframe[src*=\"youtube.com\"]',\n\t'iframe[src*=\"youtube-nocookie.com\"]',\n\t'iframe[src*=\"kickstarter.com\"][src*=\"video.html\"]',\n\t'object'\n]\n\nvar css = '.fluid-width-video-wrapper{width:100%;position:relative;padding:0;}.fluid-width-video-wrapper iframe,.fluid-width-video-wrapper object,.fluid-width-video-wrapper embed {position:absolute;top:0;left:0;width:100%;height:100%;}'\n\nmodule.exports = function (parentSelector, opts) {\n\tparentSelector = parentSelector || 'body'\n\topts = opts || {}\n\n\tif (isObject(parentSelector)) {\n\t\topts = parentSelector\n\t\tparentSelector = 'body'\n\t}\n\n\topts.ignore = opts.ignore || ''\n\topts.players = opts.players || ''\n\n\tvar containers = queryAll(parentSelector)\n\tif (!hasLength(containers)) return\n\n\tif (!document.getElementById('fit-vids-style')) {\n\t\tvar head = document.head || document.getElementsByTagName('head')[0]\n\t\thead.appendChild(styles())\n\t}\n\n\tvar custom = toSelectorArray(opts.players) || []\n\tvar ignored = toSelectorArray(opts.ignore) || []\n\tvar selector = selectors\n\t\t.filter(notIgnored(ignored))\n\t\t.concat(custom)\n\t\t.join()\n\n\tif (!hasLength(selector)) return\n\n\tcontainers.forEach(function (container) {\n\t\tvar videos = queryAll(container, selector)\n\t\tvideos.forEach(function (video) {\n\t\t\twrap(video)\n\t\t})\n\t})\n}\n\nfunction queryAll (el, selector) {\n\tif (typeof el === 'string') {\n\t\tselector = el\n\t\tel = document\n\t}\n\treturn Array.prototype.slice.call(el.querySelectorAll(selector))\n}\n\nfunction toSelectorArray (input) {\n\tif (typeof input === 'string') {\n\t\treturn input.split(',').map(trim).filter(hasLength)\n\t} else if (isArray(input)) {\n\t\treturn flatten(input.map(toSelectorArray).filter(hasLength))\n\t}\n\treturn input || []\n}\n\nfunction wrap (el) {\n\tif (/fluid-width-video-wrapper/.test(el.parentNode.className)) return\n\n\tvar widthAttr = parseInt(el.getAttribute('width'), 10)\n\tvar heightAttr = parseInt(el.getAttribute('height'), 10)\n\n\tvar width = !isNaN(widthAttr) ? widthAttr : el.clientWidth\n\tvar height = !isNaN(heightAttr) ? heightAttr : el.clientHeight\n\tvar aspect = height / width\n\n\tel.removeAttribute('width')\n\tel.removeAttribute('height')\n\n\tvar wrapper = document.createElement('div')\n\tel.parentNode.insertBefore(wrapper, el)\n\twrapper.className = 'fluid-width-video-wrapper'\n\twrapper.style.paddingTop = (aspect * 100) + '%'\n\twrapper.appendChild(el)\n}\n\nfunction styles () {\n\tvar div = document.createElement('div')\n\tdiv.innerHTML = '<p>x</p><style id=\"fit-vids-style\">' + css + '</style>'\n\treturn div.childNodes[1]\n}\n\nfunction notIgnored (ignored) {\n\tif (ignored.length < 1) {\n\t\treturn function () {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn function (selector) {\n\t\treturn ignored.indexOf(selector) === -1\n\t}\n}\n\nfunction hasLength (input) {\n\treturn input.length > 0\n}\n\nfunction trim (str) {\n\treturn str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction flatten (input) {\n\treturn [].concat.apply([], input)\n}\n\nfunction isObject (input) {\n\treturn Object.prototype.toString.call(input) === '[object Object]'\n}\n\nfunction isArray (input) {\n\treturn Object.prototype.toString.call(input) === '[object Array]'\n}\n","'use strict';\n\n// forEach method, could be shipped as part of an Object Literal/Module\nfunction forEach(array, callback, scope) {\n  var index = 0;\n\n  for (index = 0; index < array.length; index += 1) {\n    callback.call(scope, array[index], index); // passes back stuff we need\n  }\n}\n\nfunction hasClass(el, className) {\n  var regex = new RegExp('^' + className + '| +' + className, 'g');\n\n  return el.className.match(regex);\n}\n\nfunction addClass(el, className) {\n  // Return if it already has the className\n  if (hasClass(el, className)) return;\n\n  el.className += ' ' + className;\n}\n\nfunction removeClass(el, className) {\n  // Return if it doesn't already have the className\n  if (!hasClass(el, className)) return;\n\n  var regex = new RegExp('^' + className + '| +' + className, 'g');\n\n  el.className = el.className.replace(regex, '');\n}\n\nfunction toggleClass(el, className) {\n  if (hasClass(el, className)) {\n    removeClass(el, className);\n  } else {\n    addClass(el, className);\n  }\n}\n\nfunction findPairingFromPairingTrigger(pairings, pairingTrigger) {\n  var foundPairing = null;\n\n  forEach(pairings, function (pairing) {\n    if (pairing.trigger === pairingTrigger) {\n      foundPairing = pairing;\n    }\n  });\n\n  return foundPairing;\n}\n\n/**\n * See {@link https://stackoverflow.com/revisions/2117523/11 Stack Overflow}\n * An RFC4122 v4 compliant uuid solution\n */\nfunction uuidv4() {\n  return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n    var r = Math.random() * 16 | 0;\n    var v = c === 'x' ? r : r & 0x3 | 0x8;\n\n    return v.toString(16);\n  });\n}\n\nfunction init(groupedContent) {\n  var triggers = groupedContent.triggers;\n  var pairings = groupedContent.pairings;\n\n  triggers.setAttribute('role', 'tablist');\n\n  forEach(pairings, function (pairing, index) {\n    pairing.trigger.setAttribute('role', 'tab');\n    pairing.trigger.setAttribute('aria-controls', groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content');\n\n    if (pairing.trigger.children.length > 0) {\n      forEach(pairing.trigger.children, function (child) {\n        child.setAttribute('tabIndex', '-1');\n      });\n    }\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-selected', 'true');\n      pairing.trigger.setAttribute('tabIndex', '0');\n    } else {\n      pairing.trigger.setAttribute('tabIndex', '-1');\n    }\n\n    pairing.content.id = groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content';\n    pairing.content.setAttribute('role', 'tabpanel');\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nfunction update(groupedContent) {\n  var pairings = groupedContent.pairings;\n\n  forEach(pairings, function (pairing) {\n    pairing.trigger.removeAttribute('aria-selected');\n    pairing.content.removeAttribute('aria-hidden');\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-selected', 'true');\n      pairing.trigger.setAttribute('tabIndex', '0');\n    } else {\n      pairing.trigger.setAttribute('tabIndex', '-1');\n    }\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nvar a11y = {\n  init: init,\n  update: update\n};\n\nvar asyncGenerator = function () {\n  function AwaitValue(value) {\n    this.value = value;\n  }\n\n  function AsyncGenerator(gen) {\n    var front, back;\n\n    function send(key, arg) {\n      return new Promise(function (resolve, reject) {\n        var request = {\n          key: key,\n          arg: arg,\n          resolve: resolve,\n          reject: reject,\n          next: null\n        };\n\n        if (back) {\n          back = back.next = request;\n        } else {\n          front = back = request;\n          resume(key, arg);\n        }\n      });\n    }\n\n    function resume(key, arg) {\n      try {\n        var result = gen[key](arg);\n        var value = result.value;\n\n        if (value instanceof AwaitValue) {\n          Promise.resolve(value.value).then(function (arg) {\n            resume(\"next\", arg);\n          }, function (arg) {\n            resume(\"throw\", arg);\n          });\n        } else {\n          settle(result.done ? \"return\" : \"normal\", result.value);\n        }\n      } catch (err) {\n        settle(\"throw\", err);\n      }\n    }\n\n    function settle(type, value) {\n      switch (type) {\n        case \"return\":\n          front.resolve({\n            value: value,\n            done: true\n          });\n          break;\n\n        case \"throw\":\n          front.reject(value);\n          break;\n\n        default:\n          front.resolve({\n            value: value,\n            done: false\n          });\n          break;\n      }\n\n      front = front.next;\n\n      if (front) {\n        resume(front.key, front.arg);\n      } else {\n        back = null;\n      }\n    }\n\n    this._invoke = send;\n\n    if (typeof gen.return !== \"function\") {\n      this.return = undefined;\n    }\n  }\n\n  if (typeof Symbol === \"function\" && Symbol.asyncIterator) {\n    AsyncGenerator.prototype[Symbol.asyncIterator] = function () {\n      return this;\n    };\n  }\n\n  AsyncGenerator.prototype.next = function (arg) {\n    return this._invoke(\"next\", arg);\n  };\n\n  AsyncGenerator.prototype.throw = function (arg) {\n    return this._invoke(\"throw\", arg);\n  };\n\n  AsyncGenerator.prototype.return = function (arg) {\n    return this._invoke(\"return\", arg);\n  };\n\n  return {\n    wrap: function (fn) {\n      return function () {\n        return new AsyncGenerator(fn.apply(this, arguments));\n      };\n    },\n    await: function (value) {\n      return new AwaitValue(value);\n    }\n  };\n}();\n\n\n\n\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\n/** A class for creating, managing, and destroying groupable content as tabs. */\n\nvar TabsLayout = function () {\n  function TabsLayout(groupedContent) {\n    classCallCheck(this, TabsLayout);\n\n    this.groupedContent = groupedContent;\n    this.pairings = groupedContent.pairings;\n    this.events = [];\n\n    this._handleKeydown = this._handleKeydown.bind(this);\n    this._handleClick = this._handleClick.bind(this);\n\n    this._init();\n    a11y.init(this.groupedContent);\n  }\n\n  createClass(TabsLayout, [{\n    key: 'unload',\n    value: function unload() {\n      forEach(this.events, function (event) {\n        event.trigger.removeEventListener(event.type, event.fn);\n      });\n    }\n  }, {\n    key: '_init',\n    value: function _init() {\n      var _this = this;\n\n      var existingActive = false;\n\n      forEach(this.pairings, function (pairing) {\n        var trigger = pairing.trigger;\n\n        if (hasClass(trigger, 'active')) {\n          existingActive = true;\n        }\n\n        trigger.addEventListener('keydown', _this._handleKeydown);\n        trigger.addEventListener('click', _this._handleClick);\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'keydown',\n          fn: _this._handleKeydown\n        });\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'click',\n          fn: _this._handleClick\n        });\n      });\n\n      if (!existingActive) {\n        addClass(this.pairings[0].trigger, 'active');\n        addClass(this.pairings[0].content, 'active');\n      }\n    }\n  }, {\n    key: '_handleKeydown',\n    value: function _handleKeydown(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n      var pairingIndex = this.pairings.indexOf(pairing);\n      var prevIndex = pairingIndex - 1 < 0 ? this.pairings.length - 1 : pairingIndex - 1;\n      var nextIndex = pairingIndex + 1 >= this.pairings.length ? 0 : pairingIndex + 1;\n\n      var nextPairing = null;\n\n      switch (event.key) {\n        case 'ArrowLeft':\n          nextPairing = this.pairings[prevIndex];\n          break;\n        case 'ArrowRight':\n          nextPairing = this.pairings[nextIndex];\n          break;\n        default:\n          nextPairing = null;\n          break;\n      }\n\n      // Fast exit if we can't find the tab or tabs\n      if (nextPairing === null) return;\n\n      event.preventDefault();\n\n      forEach(this.pairings, function (inactivePairing) {\n        removeClass(inactivePairing.trigger, 'active');\n        removeClass(inactivePairing.content, 'active');\n      });\n\n      addClass(nextPairing.trigger, 'active');\n      addClass(nextPairing.content, 'active');\n\n      nextPairing.trigger.focus();\n\n      a11y.update(this.groupedContent);\n    }\n  }, {\n    key: '_handleClick',\n    value: function _handleClick(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n      // Fast exit if we can't find the tab or tabs\n      if (pairing === null) return;\n\n      event.preventDefault();\n\n      forEach(this.pairings, function (inactivePairing) {\n        removeClass(inactivePairing.trigger, 'active');\n        removeClass(inactivePairing.content, 'active');\n      });\n\n      addClass(pairing.trigger, 'active');\n      addClass(pairing.content, 'active');\n\n      a11y.update(this.groupedContent);\n    }\n  }]);\n  return TabsLayout;\n}();\n\nfunction init$1(groupedContent) {\n  var pairings = groupedContent.pairings;\n\n  forEach(pairings, function (pairing, index) {\n    pairing.trigger.setAttribute('role', 'button');\n    pairing.trigger.setAttribute('aria-controls', groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content');\n    pairing.trigger.setAttribute('tabIndex', '0');\n\n    if (pairing.trigger.children.length > 0) {\n      forEach(pairing.trigger.children, function (child) {\n        child.setAttribute('tabIndex', '-1');\n      });\n    }\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-expanded', 'true');\n    } else {\n      pairing.trigger.setAttribute('aria-expanded', 'false');\n    }\n\n    pairing.content.id = groupedContent.namespace + '-' + groupedContent.id + '-' + index + '-content';\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nfunction update$1(groupedContent) {\n  var pairings = groupedContent.pairings;\n\n  forEach(pairings, function (pairing) {\n    pairing.content.removeAttribute('aria-hidden');\n\n    if (hasClass(pairing.trigger, 'active')) {\n      pairing.trigger.setAttribute('aria-expanded', 'true');\n    } else {\n      pairing.trigger.setAttribute('aria-expanded', 'false');\n    }\n\n    if (!hasClass(pairing.content, 'active')) {\n      pairing.content.setAttribute('aria-hidden', 'true');\n    }\n  });\n}\n\nvar a11y$1 = {\n  init: init$1,\n  update: update$1\n};\n\n/** A class for creating, managing, and destroying groupable content as an accordion. */\n\nvar AccordionLayout = function () {\n  function AccordionLayout(groupedContent) {\n    classCallCheck(this, AccordionLayout);\n\n    this.groupedContent = groupedContent;\n    this.pairings = groupedContent.pairings;\n    this.events = [];\n\n    this._handleKeydown = this._handleKeydown.bind(this);\n    this._handleClick = this._handleClick.bind(this);\n\n    this._init(this.pairings);\n    a11y$1.init(this.groupedContent);\n  }\n\n  createClass(AccordionLayout, [{\n    key: 'unload',\n    value: function unload() {\n      forEach(this.events, function (event) {\n        event.trigger.removeEventListener(event.type, event.fn);\n      });\n    }\n  }, {\n    key: '_init',\n    value: function _init() {\n      var _this = this;\n\n      forEach(this.pairings, function (pairing) {\n        var trigger = pairing.trigger;\n        var content = pairing.content;\n\n        trigger.parentNode.insertBefore(content, trigger.nextSibling);\n\n        trigger.addEventListener('keydown', _this._handleKeydown);\n        trigger.addEventListener('click', _this._handleClick);\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'keydown',\n          fn: _this._handleKeydown\n        });\n\n        _this.events.push({\n          trigger: trigger,\n          type: 'click',\n          fn: _this._handleClick\n        });\n      });\n\n      this.groupedContent.contents.remove();\n    }\n  }, {\n    key: '_handleKeydown',\n    value: function _handleKeydown(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n      // Fast exit if enter isn't pressed or we can't find the group\n      if (event.key !== 'Enter' || pairing === null) return;\n\n      event.preventDefault();\n\n      toggleClass(pairing.trigger, 'active');\n      toggleClass(pairing.content, 'active');\n      a11y$1.update(this.groupedContent);\n    }\n  }, {\n    key: '_handleClick',\n    value: function _handleClick(event) {\n      var trigger = event.currentTarget;\n      var pairing = findPairingFromPairingTrigger(this.pairings, trigger);\n\n      // Fast exit if we can't find the group\n      if (pairing === null) return;\n\n      event.preventDefault();\n\n      toggleClass(pairing.trigger, 'active');\n      toggleClass(pairing.content, 'active');\n      a11y$1.update(this.groupedContent);\n    }\n  }]);\n  return AccordionLayout;\n}();\n\n/**\n * Returns an array of nodes related to the heading node.\n * @param {node} heading - The heading node to search for content from.\n * @returns {node[]}\n */\nfunction getHeadingContent(heading) {\n  var headingTagNames = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n  var tagNameIndex = headingTagNames.indexOf(heading.tagName);\n  var content = [];\n\n  var sibling = heading.nextElementSibling;\n\n  while (sibling !== null && (headingTagNames.indexOf(sibling.tagName) === -1 || headingTagNames.indexOf(sibling.tagName) > tagNameIndex)) {\n    content.push(sibling);\n\n    sibling = sibling.nextElementSibling;\n  }\n\n  return content;\n}\n\n/**\n * Returns an object array representing the heading tree from a given node.\n * Root nodes are evaluated differently, and requires the evaluatingRoot flag\n * to be true.\n * @param {node} el - The node being evaluated.\n * @param {node[]} children - The children of the evaluated node.\n * @param {boolean} [evaluatingRoot] - Whether to evaluate as root node.\n * @returns {Object[]}\n */\nfunction getHeadingTree(el, children) {\n  var evaluatingRoot = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n  var headingTagNames = ['H1', 'H2', 'H3', 'H4', 'H5', 'H6'];\n  var tagNameIndex = headingTagNames.indexOf(el.tagName);\n  var headings = [];\n\n  var currentLowestTagNameIndex = 5;\n\n  for (var i = 0; i < children.length; i += 1) {\n    var child = children[i];\n    var childTagNameIndex = headingTagNames.indexOf(child.tagName);\n\n    if (childTagNameIndex !== -1 && childTagNameIndex < currentLowestTagNameIndex) {\n      currentLowestTagNameIndex = childTagNameIndex;\n    }\n\n    if (evaluatingRoot && childTagNameIndex !== -1 && childTagNameIndex <= currentLowestTagNameIndex || !evaluatingRoot && childTagNameIndex !== -1 && childTagNameIndex === tagNameIndex + 1) {\n      var siblings = getHeadingContent(child);\n\n      var childNode = {\n        el: child,\n        content: siblings,\n        children: getHeadingTree(child, siblings)\n      };\n\n      headings.push(childNode);\n    }\n  }\n\n  return headings;\n}\n\n/**\n * Returns groupings of headings that meet the minimum sequence value\n * and don't contain any invalid headings.\n * @param {Object[]} headings - An array of heading objects.\n * @param {int[]} invalidHeadings - An array of invalid heading integers,\n *                                  representing indexes of headings.\n * @param {*} minInSequence - Minimum headings in sequence before being considered\n *                            as a grouping.\n * @returns {Object[][]}\n */\nfunction getHeadingGroupsInSequence(headings, invalidHeadings, minInSequence) {\n  var headingGroupsInSequence = [];\n  var currentHeadingGroupInSequence = [];\n  var currentSequence = 0;\n\n  for (var i = 0; i < headings.length; i += 1) {\n    if (invalidHeadings.indexOf(i) === -1) {\n      currentHeadingGroupInSequence.push(headings[i]);\n      currentSequence += 1;\n\n      if (i !== headings.length - 1 && headings[i].el.tagName !== headings[i + 1].el.tagName && invalidHeadings.indexOf(i + 1)) {\n        currentHeadingGroupInSequence = [];\n        currentSequence = 0;\n      } else if (i !== 0 && headings[i].el.tagName !== headings[i - 1].el.tagName) {\n        currentHeadingGroupInSequence.pop();\n        currentSequence -= 1;\n\n        if (currentSequence >= minInSequence) {\n          headingGroupsInSequence.push(currentHeadingGroupInSequence);\n        }\n\n        currentHeadingGroupInSequence = [headings[i]];\n        currentSequence = 1;\n      }\n    }\n  }\n\n  if (currentSequence >= minInSequence) {\n    headingGroupsInSequence.push(currentHeadingGroupInSequence);\n  }\n\n  return headingGroupsInSequence;\n}\n\n/**\n * Generates necessary DOM elements to group related content.\n * Returns a object array representing the grouped content.\n * @param {Object[]} children - An array of objects.\n * @returns {Object[]}\n */\nfunction createGroupedContent(children) {\n  var pairings = [];\n\n  var firstChild = children[0].el;\n  var triggers = document.createElement('div');\n  var contents = document.createElement('div');\n\n  contents = firstChild.parentNode.insertBefore(contents, firstChild.nextSibling);\n  triggers = firstChild.parentNode.insertBefore(triggers, firstChild.nextSibling);\n\n  for (var i = 0; i < children.length; i += 1) {\n    var child = children[i];\n    var trigger = child.el;\n    var content = document.createElement('div');\n\n    trigger = triggers.appendChild(trigger);\n    content = contents.appendChild(content);\n\n    for (var j = 0; j < child.content.length; j += 1) {\n      content.appendChild(child.content[j]);\n    }\n\n    pairings.push({\n      trigger: trigger,\n      content: content\n    });\n  }\n\n  return {\n    triggers: triggers,\n    contents: contents,\n    pairings: pairings\n  };\n}\n\n/**\n * Returns all groupable content within the supplied node.\n * @param {node} node - A node to traverse for groupable content.\n * @returns {Object[][]}\n */\n/*\n * Recursive function:\n *  Returns all groups of headings that\n *  are elegible to become grouped content.\n */\nfunction getGroupedContentSet(node) {\n  var children = node.children;\n  var childrenWithGroupableContent = [];\n  var groupedContentSet = [];\n\n  if (children.length === 0) {\n    return [];\n  }\n\n  for (var i = 0; i < children.length; i += 1) {\n    var childGroupableContent = getGroupedContentSet(children[i]);\n\n    if (childGroupableContent.length > 0) {\n      childrenWithGroupableContent.push(i);\n      groupedContentSet = groupedContentSet.concat(childGroupableContent);\n    }\n  }\n\n  var headingGroupsInSequence = getHeadingGroupsInSequence(children, childrenWithGroupableContent, 3);\n\n  for (var _i = 0; _i < headingGroupsInSequence.length; _i += 1) {\n    groupedContentSet.push(createGroupedContent(headingGroupsInSequence[_i]));\n  }\n\n  return groupedContentSet;\n}\n\n/**\n * When static parsing isn't enough, there's intelliparse™!\n * Searches through dom content to find heading groupings that\n * are elegible to become tab groups.\n * Assumes that content is in a flattened hierarchy in the dom\n * and interprets increasing heading values as a deeper level of nesting.\n * Returns all groupable content as an array of object arrays.\n * @param {node} el - The node who's content will be searched for groupable content.\n * @returns {Object[][]}\n */\nfunction intelliParse(el) {\n  var children = el.children;\n  var heading = el.querySelector('h1, h2, h3, h4, h5, h6');\n\n  // Fast return if there's no headings\n  if (children.length === 0) return [];\n\n  var rootNode = {\n    el: el,\n    content: null,\n    children: getHeadingTree(heading, children, true)\n  };\n\n  return getGroupedContentSet(rootNode);\n}\n\n/**\n * Parses content from a given node based on a static structure.\n * The structure is as follows:\n * <ul class=\"tabs\">\n *   <li class=\"active\">Tab 1</li>\n *   <li>Tab 2</li>\n *   <li>Tab 3</li>\n * </ul>\n *\n * <ul class=\"tabs-content\">\n *   <li class=\"active\">\n *     <p>Tab 1 content goes here.</p>\n *   </li>\n *   <li>\n *     <p>Tab 2 content goes here.</p>\n *   </li>\n *   <li>\n *     <p>Tab 3 content goes here.</p>\n *   </li>\n * </ul>\n * Returns all groupable content as an array of object arrays.\n * @param {node} el - The node who's content will be searched for groupable content.\n * @returns {Object[][]}\n */\nfunction staticParse(el) {\n  var groupedContentSet = [];\n\n  var tabs = el.querySelectorAll('.tabs');\n\n  for (var i = 0; i < tabs.length; i += 1) {\n    var triggers = tabs[i].children;\n    var contents = tabs[i].nextElementSibling.children;\n\n    // Only add a tab group if equal triggers to contents\n    if (triggers.length === contents.length) {\n      var length = groupedContentSet.push({\n        triggers: tabs[i],\n        contents: tabs[i].nextElementSibling,\n        pairings: []\n      });\n      var index = length - 1;\n\n      for (var j = 0; j < triggers.length; j += 1) {\n        var trigger = triggers[j];\n        var content = contents[j];\n\n        var pairing = {\n          trigger: trigger,\n          content: content\n        };\n\n        groupedContentSet[index].pairings.push(pairing);\n      }\n    }\n  }\n\n  return groupedContentSet;\n}\n\n/**\n * Returns all groupable content as an array of object arrays.\n * @param {node} content - The node to parse for groupable content.\n * @param {boolean} intelliparse - Whether to use intelligent parsing.\n * @returns {Object[][]}\n */\nfunction parse(content) {\n  var intelliparse = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n  var groupedContentSet = intelliparse ? intelliParse(content) : staticParse(content);\n\n  return groupedContentSet;\n}\n\n/** A class for creating, managing, and destroying groupable content. */\n\nvar GroupedContent = function () {\n  /**\n   * Create grouped content\n   * @param {node} el - The element to search for groupable content in.\n   * @param {Object}  [options] - Additional options\n   * @param {string}  [options.layout] - The layout to display groupable content in.\n   * @param {boolean} [options.intelliparse] - The parsing algorithm used to find content with.\n   */\n  function GroupedContent(el) {\n    var _this = this;\n\n    var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    classCallCheck(this, GroupedContent);\n\n    this.namespace = 'grouped-content';\n    this.el = el;\n    this.groupedContentInstances = [];\n\n    var layout = options.layout || 'tabs';\n    var intelliparse = !!options.intelliparse;\n\n    forEach(parse(el, intelliparse), function (groupedContent) {\n      var id = uuidv4();\n      var instance = null;\n      var groupedContentWrapper = document.createElement('div');\n\n      groupedContentWrapper = groupedContent.triggers.parentNode.insertBefore(groupedContentWrapper, groupedContent.triggers.nextSibling);\n\n      addClass(groupedContentWrapper, _this.namespace);\n      addClass(groupedContentWrapper, _this.namespace + '-layout-' + layout);\n\n      groupedContentWrapper.appendChild(groupedContent.triggers);\n      groupedContentWrapper.appendChild(groupedContent.contents);\n\n      groupedContent.namespace = _this.namespace;\n      groupedContent.id = id;\n      groupedContent.triggers.id = _this.namespace + '-' + id + '-triggers';\n      groupedContent.contents.id = _this.namespace + '-' + id + '-contents';\n\n      addClass(groupedContent.triggers, _this.namespace + '-triggers');\n      addClass(groupedContent.contents, _this.namespace + '-contents');\n\n      forEach(groupedContent.pairings, function (pairing) {\n        addClass(pairing.trigger, _this.namespace + '-trigger');\n        addClass(pairing.content, _this.namespace + '-content');\n      });\n\n      switch (layout) {\n        case 'accordion':\n          instance = new AccordionLayout(groupedContent);\n          break;\n        case 'tabs':\n        default:\n          instance = new TabsLayout(groupedContent);\n          break;\n      }\n\n      _this.groupedContentInstances.push({\n        groupedContent: groupedContent,\n        instance: instance\n      });\n    });\n  }\n\n  /** Unload all grouped content instances */\n\n\n  createClass(GroupedContent, [{\n    key: 'unload',\n    value: function unload() {\n      forEach(this.groupedContentInstances, function (groupedContentInstance) {\n        groupedContentInstance.instance.unload();\n      });\n    }\n  }]);\n  return GroupedContent;\n}();\n\nmodule.exports = GroupedContent;\n","import fitvids from 'fitvids';\nimport GroupedContent from 'grouped-content';\n\nexport default class RichText {\n  constructor($el) {\n    this.$el = $el;\n    this._initExternalLinks();\n    this.groupedContent = null;\n\n    if (this.$el.length) {\n      this.groupedContent = new GroupedContent($el.get(0), {\n        layout: 'tabs',\n        intelliparse: false,\n      });\n      fitvids();\n    }\n  }\n\n  unload() {\n    if (this.groupedContent) {\n      this.groupedContent.unload();\n    }\n  }\n\n  /**\n   * Open links within an RTE field in a new window if they point to external domains\n   *\n   * @private\n   */\n  _initExternalLinks(){\n    const anchors = this.$el.find('a[href^=\"http\"]').filter((i, el) => {\n      return el.href.indexOf(location.hostname) === -1;\n    });\n\n    anchors.attr('target', '_blank');\n  }\n}\n","import $ from 'jquery';\nimport RichText from '../components/RichText';\n\nexport default class Page {\n  constructor() {\n    this.$pageContent = $('[data-template-page]');\n\n    if (this.$pageContent.length) {\n      new RichText(this.$pageContent);\n    }\n  }\n}\n","export default class Sections {\n  constructor() {\n    this.handlers = {};\n    this.instances = {};\n    this._onSectionEvent = this._onSectionEvent.bind(this);\n\n    document.addEventListener('shopify:section:load', this._onSectionEvent);\n    document.addEventListener('shopify:section:unload', this._onSectionEvent);\n    document.addEventListener('shopify:section:select', this._onSectionEvent);\n    document.addEventListener('shopify:section:deselect', this._onSectionEvent);\n    document.addEventListener('shopify:block:select', this._onSectionEvent);\n    document.addEventListener('shopify:block:deselect', this._onSectionEvent);\n  }\n\n  /**\n   * Stop listening for section events, and unbind all handlers.\n   */\n  unbind() {\n    document.removeEventListener('shopify:section:load', this._onSectionEvent);\n    document.removeEventListener('shopify:section:unload', this._onSectionEvent);\n    document.removeEventListener('shopify:section:select', this._onSectionEvent);\n    document.removeEventListener('shopify:section:deselect', this._onSectionEvent);\n    document.removeEventListener('shopify:block:select', this._onSectionEvent);\n    document.removeEventListener('shopify:block:deselect', this._onSectionEvent);\n\n    // Unload all instances\n    for (let i = 0; i < this.instances.length; i++) {\n      this._triggerInstanceEvent(this.instances[i], 'onSectionUnload');\n    }\n\n    this.handlers = {};\n    this.instances = {};\n  }\n\n  /**\n   * Register a section handler.\n   *\n   * @param {string} type\n   *        The section type to handle. The handler will be called for all\n   *        sections with this type.\n   *\n   * @param {function} handler\n   *        The handler function is passed information about a specific section\n   *        instance. The handler is expected to return an object that will be\n   *        associated with the section instance.\n   *\n   *        Section handlers are passed an object with the following parameters:\n   *          {string} id\n   *          An ID that maps to a specific section instance. Typically the\n   *          section's filename for static sections, or a generated ID for\n   *          dynamic sections.\n   *\n   *          {string} type\n   *          The section type, as supplied when registered.\n   *\n   *          {Element} el\n   *          The root DOM element for the section instance.\n   *\n   *          {Object} data\n   *          Data loaded from the section script element. Defaults to an\n   *          empty object.\n   *\n   *          {Function} postMessage\n   *          A function that can be called to pass messages between sections.\n   *          The function should be called with a message \"name\", and\n   *          optionally some data.\n   */\n  register(type, handler) {\n    if (this.handlers[type]) {\n      console.warn(`Sections: section handler already exists of type '${type}'.`);\n    }\n\n    // Store the section handler\n    this.handlers[type] = handler;\n\n    // Init sections for this type\n    this._initSections(type);\n  }\n\n  /**\n   * Initialize sections already on the page.\n   */\n  _initSections(type) {\n    // Fetch all existing sections of our type on the page\n    const dataEls = document.querySelectorAll(`[data-section-type=\"${type}\"]`);\n    if (!dataEls) return;\n\n    // Create an instance for each section\n    for (let i = 0; i < dataEls.length; i++) {\n      const dataEl = dataEls[i];\n      const el = dataEl.parentNode;\n\n      // Get instance ID\n      const idEl = el.querySelector('[data-section-id]');\n\n      if (!idEl) {\n        console.warn(`Sections: unable to find section id for '${type}'.`, el);\n        continue;\n      }\n\n      const sectionId = idEl.getAttribute('data-section-id');\n      if (!sectionId) {\n        console.warn(`Sections: unable to find section id for '${type}'.`, el);\n        continue;\n      }\n\n      this._createInstance(sectionId, el);\n    }\n  }\n\n  _onSectionEvent(event) {\n    const el = event.target;\n    const sectionId = event.detail.sectionId;\n    const blockId = event.detail.blockId;\n    const instance = this.instances[sectionId];\n\n    switch (event.type) {\n      case 'shopify:section:load':\n        this._createInstance(sectionId, el);\n        break;\n\n      case 'shopify:section:unload':\n        this._triggerInstanceEvent(instance, 'onSectionUnload', { el, id: sectionId });\n        delete this.instances[sectionId];\n        break;\n\n      case 'shopify:section:select':\n        this._triggerInstanceEvent(instance, 'onSectionSelect', { el, id: sectionId });\n        break;\n\n      case 'shopify:section:deselect':\n        this._triggerInstanceEvent(instance, 'onSectionDeselect', { el, id: sectionId });\n        break;\n\n      case 'shopify:block:select':\n        this._triggerInstanceEvent(instance, 'onSectionBlockSelect', { el, id: blockId });\n        break;\n\n      case 'shopify:block:deselect':\n        this._triggerInstanceEvent(instance, 'onSectionBlockDeselect', { el, id: blockId });\n        break;\n    }\n  }\n\n  _triggerInstanceEvent(instance, eventName, ...args) {\n    if (instance && instance[eventName]) {\n      instance[eventName](...args);\n    }\n  }\n\n  _postMessage(name, data) {\n    Object.keys(this.instances).forEach((id) => {\n      this._triggerInstanceEvent(this.instances[id], 'onSectionMessage', name, data);\n    });\n  }\n\n  _createInstance(id, el) {\n    const typeEl = el.querySelector('[data-section-type]');\n    if (!typeEl) return;\n\n    const type = typeEl.getAttribute('data-section-type');\n    if (!type) return;\n\n    const handler = this.handlers[type];\n    if (!handler) return console.warn(`Sections: unable to find section handler for type '${type}'.`);\n\n    const data = this._loadData(el);\n    const postMessage = this._postMessage.bind(this);\n\n    this.instances[id] = handler({id, type, el, data, postMessage});\n  }\n\n  _loadData(el) {\n    const dataEl = el.querySelector('[data-section-data]');\n    if (!dataEl) return {};\n\n    // Load data from attribute, or innerHTML\n    const data = dataEl.getAttribute('data-section-data') || dataEl.innerHTML;\n\n    try {\n      return JSON.parse(data);\n    } catch(error) {\n      console.warn(`Sections: invalid section data found. ${error.message}`);\n      return {};\n    }\n  }\n}\n","'use strict';\n\nvar moneyFormats = {\n  USD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} USD'\n  },\n  EUR: {\n    'money_format': '&euro;{{amount}}',\n    'money_with_currency_format': '&euro;{{amount}} EUR'\n  },\n  GBP: {\n    'money_format': '&pound;{{amount}}',\n    'money_with_currency_format': '&pound;{{amount}} GBP'\n  },\n  CAD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} CAD'\n  },\n  ALL: {\n    'money_format': 'Lek {{amount}}',\n    'money_with_currency_format': 'Lek {{amount}} ALL'\n  },\n  DZD: {\n    'money_format': 'DA {{amount}}',\n    'money_with_currency_format': 'DA {{amount}} DZD'\n  },\n  AOA: {\n    'money_format': 'Kz{{amount}}',\n    'money_with_currency_format': 'Kz{{amount}} AOA'\n  },\n  ARS: {\n    'money_format': '${{amount_with_comma_separator}}',\n    'money_with_currency_format': '${{amount_with_comma_separator}} ARS'\n  },\n  AMD: {\n    'money_format': '{{amount}} AMD',\n    'money_with_currency_format': '{{amount}} AMD'\n  },\n  AWG: {\n    'money_format': 'Afl{{amount}}',\n    'money_with_currency_format': 'Afl{{amount}} AWG'\n  },\n  AUD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} AUD'\n  },\n  BBD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} Bds'\n  },\n  AZN: {\n    'money_format': 'm.{{amount}}',\n    'money_with_currency_format': 'm.{{amount}} AZN'\n  },\n  BDT: {\n    'money_format': 'Tk {{amount}}',\n    'money_with_currency_format': 'Tk {{amount}} BDT'\n  },\n  BSD: {\n    'money_format': 'BS${{amount}}',\n    'money_with_currency_format': 'BS${{amount}} BSD'\n  },\n  BHD: {\n    'money_format': '{{amount}}0 BD',\n    'money_with_currency_format': '{{amount}}0 BHD'\n  },\n  BYR: {\n    'money_format': 'Br {{amount}}',\n    'money_with_currency_format': 'Br {{amount}} BYR'\n  },\n  BZD: {\n    'money_format': 'BZ${{amount}}',\n    'money_with_currency_format': 'BZ${{amount}} BZD'\n  },\n  BTN: {\n    'money_format': 'Nu {{amount}}',\n    'money_with_currency_format': 'Nu {{amount}} BTN'\n  },\n  BAM: {\n    'money_format': 'KM {{amount_with_comma_separator}}',\n    'money_with_currency_format': 'KM {{amount_with_comma_separator}} BAM'\n  },\n  BRL: {\n    'money_format': 'R$ {{amount_with_comma_separator}}',\n    'money_with_currency_format': 'R$ {{amount_with_comma_separator}} BRL'\n  },\n  BOB: {\n    'money_format': 'Bs{{amount_with_comma_separator}}',\n    'money_with_currency_format': 'Bs{{amount_with_comma_separator}} BOB'\n  },\n  BWP: {\n    'money_format': 'P{{amount}}',\n    'money_with_currency_format': 'P{{amount}} BWP'\n  },\n  BND: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} BND'\n  },\n  BGN: {\n    'money_format': '{{amount}} лв',\n    'money_with_currency_format': '{{amount}} лв BGN'\n  },\n  MMK: {\n    'money_format': 'K{{amount}}',\n    'money_with_currency_format': 'K{{amount}} MMK'\n  },\n  KHR: {\n    'money_format': 'KHR{{amount}}',\n    'money_with_currency_format': 'KHR{{amount}}'\n  },\n  KYD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} KYD'\n  },\n  XAF: {\n    'money_format': 'FCFA{{amount}}',\n    'money_with_currency_format': 'FCFA{{amount}} XAF'\n  },\n  CLP: {\n    'money_format': '${{amount_no_decimals}}',\n    'money_with_currency_format': '${{amount_no_decimals}} CLP'\n  },\n  CNY: {\n    'money_format': '&#165;{{amount}}',\n    'money_with_currency_format': '&#165;{{amount}} CNY'\n  },\n  COP: {\n    'money_format': '${{amount_with_comma_separator}}',\n    'money_with_currency_format': '${{amount_with_comma_separator}} COP'\n  },\n  CRC: {\n    'money_format': '&#8353; {{amount_with_comma_separator}}',\n    'money_with_currency_format': '&#8353; {{amount_with_comma_separator}} CRC'\n  },\n  HRK: {\n    'money_format': '{{amount_with_comma_separator}} kn',\n    'money_with_currency_format': '{{amount_with_comma_separator}} kn HRK'\n  },\n  CZK: {\n    'money_format': '{{amount_with_comma_separator}} K&#269;',\n    'money_with_currency_format': '{{amount_with_comma_separator}} K&#269;'\n  },\n  DKK: {\n    'money_format': '{{amount_with_comma_separator}}',\n    'money_with_currency_format': 'kr.{{amount_with_comma_separator}}'\n  },\n  DOP: {\n    'money_format': 'RD$ {{amount}}',\n    'money_with_currency_format': 'RD$ {{amount}}'\n  },\n  XCD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': 'EC${{amount}}'\n  },\n  EGP: {\n    'money_format': 'LE {{amount}}',\n    'money_with_currency_format': 'LE {{amount}} EGP'\n  },\n  ETB: {\n    'money_format': 'Br{{amount}}',\n    'money_with_currency_format': 'Br{{amount}} ETB'\n  },\n  XPF: {\n    'money_format': '{{amount_no_decimals_with_comma_separator}} XPF',\n    'money_with_currency_format': '{{amount_no_decimals_with_comma_separator}} XPF'\n  },\n  FJD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': 'FJ${{amount}}'\n  },\n  GMD: {\n    'money_format': 'D {{amount}}',\n    'money_with_currency_format': 'D {{amount}} GMD'\n  },\n  GHS: {\n    'money_format': 'GH&#8373;{{amount}}',\n    'money_with_currency_format': 'GH&#8373;{{amount}}'\n  },\n  GTQ: {\n    'money_format': 'Q{{amount}}',\n    'money_with_currency_format': '{{amount}} GTQ'\n  },\n  GYD: {\n    'money_format': 'G${{amount}}',\n    'money_with_currency_format': '${{amount}} GYD'\n  },\n  GEL: {\n    'money_format': '{{amount}} GEL',\n    'money_with_currency_format': '{{amount}} GEL'\n  },\n  HNL: {\n    'money_format': 'L {{amount}}',\n    'money_with_currency_format': 'L {{amount}} HNL'\n  },\n  HKD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': 'HK${{amount}}'\n  },\n  HUF: {\n    'money_format': '{{amount_no_decimals_with_comma_separator}}',\n    'money_with_currency_format': '{{amount_no_decimals_with_comma_separator}} Ft'\n  },\n  ISK: {\n    'money_format': '{{amount_no_decimals}} kr',\n    'money_with_currency_format': '{{amount_no_decimals}} kr ISK'\n  },\n  INR: {\n    'money_format': 'Rs. {{amount}}',\n    'money_with_currency_format': 'Rs. {{amount}}'\n  },\n  IDR: {\n    'money_format': '{{amount_with_comma_separator}}',\n    'money_with_currency_format': 'Rp {{amount_with_comma_separator}}'\n  },\n  ILS: {\n    'money_format': '{{amount}} NIS',\n    'money_with_currency_format': '{{amount}} NIS'\n  },\n  JMD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} JMD'\n  },\n  JPY: {\n    'money_format': '&#165;{{amount_no_decimals}}',\n    'money_with_currency_format': '&#165;{{amount_no_decimals}} JPY'\n  },\n  JEP: {\n    'money_format': '&pound;{{amount}}',\n    'money_with_currency_format': '&pound;{{amount}} JEP'\n  },\n  JOD: {\n    'money_format': '{{amount}}0 JD',\n    'money_with_currency_format': '{{amount}}0 JOD'\n  },\n  KZT: {\n    'money_format': '{{amount}} KZT',\n    'money_with_currency_format': '{{amount}} KZT'\n  },\n  KES: {\n    'money_format': 'KSh{{amount}}',\n    'money_with_currency_format': 'KSh{{amount}}'\n  },\n  KWD: {\n    'money_format': '{{amount}}0 KD',\n    'money_with_currency_format': '{{amount}}0 KWD'\n  },\n  KGS: {\n    'money_format': 'лв{{amount}}',\n    'money_with_currency_format': 'лв{{amount}}'\n  },\n  LVL: {\n    'money_format': 'Ls {{amount}}',\n    'money_with_currency_format': 'Ls {{amount}} LVL'\n  },\n  LBP: {\n    'money_format': 'L&pound;{{amount}}',\n    'money_with_currency_format': 'L&pound;{{amount}} LBP'\n  },\n  LTL: {\n    'money_format': '{{amount}} Lt',\n    'money_with_currency_format': '{{amount}} Lt'\n  },\n  MGA: {\n    'money_format': 'Ar {{amount}}',\n    'money_with_currency_format': 'Ar {{amount}} MGA'\n  },\n  MKD: {\n    'money_format': 'ден {{amount}}',\n    'money_with_currency_format': 'ден {{amount}} MKD'\n  },\n  MOP: {\n    'money_format': 'MOP${{amount}}',\n    'money_with_currency_format': 'MOP${{amount}}'\n  },\n  MVR: {\n    'money_format': 'Rf{{amount}}',\n    'money_with_currency_format': 'Rf{{amount}} MRf'\n  },\n  MXN: {\n    'money_format': '$ {{amount}}',\n    'money_with_currency_format': '$ {{amount}} MXN'\n  },\n  MYR: {\n    'money_format': 'RM{{amount}} MYR',\n    'money_with_currency_format': 'RM{{amount}} MYR'\n  },\n  MUR: {\n    'money_format': 'Rs {{amount}}',\n    'money_with_currency_format': 'Rs {{amount}} MUR'\n  },\n  MDL: {\n    'money_format': '{{amount}} MDL',\n    'money_with_currency_format': '{{amount}} MDL'\n  },\n  MAD: {\n    'money_format': '{{amount}} dh',\n    'money_with_currency_format': 'Dh {{amount}} MAD'\n  },\n  MNT: {\n    'money_format': '{{amount_no_decimals}} &#8366',\n    'money_with_currency_format': '{{amount_no_decimals}} MNT'\n  },\n  MZN: {\n    'money_format': '{{amount}} Mt',\n    'money_with_currency_format': 'Mt {{amount}} MZN'\n  },\n  NAD: {\n    'money_format': 'N${{amount}}',\n    'money_with_currency_format': 'N${{amount}} NAD'\n  },\n  NPR: {\n    'money_format': 'Rs{{amount}}',\n    'money_with_currency_format': 'Rs{{amount}} NPR'\n  },\n  ANG: {\n    'money_format': '&fnof;{{amount}}',\n    'money_with_currency_format': '{{amount}} NA&fnof;'\n  },\n  NZD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} NZD'\n  },\n  NIO: {\n    'money_format': 'C${{amount}}',\n    'money_with_currency_format': 'C${{amount}} NIO'\n  },\n  NGN: {\n    'money_format': '&#8358;{{amount}}',\n    'money_with_currency_format': '&#8358;{{amount}} NGN'\n  },\n  NOK: {\n    'money_format': 'kr {{amount_with_comma_separator}}',\n    'money_with_currency_format': 'kr {{amount_with_comma_separator}} NOK'\n  },\n  OMR: {\n    'money_format': '{{amount_with_comma_separator}} OMR',\n    'money_with_currency_format': '{{amount_with_comma_separator}} OMR'\n  },\n  PKR: {\n    'money_format': 'Rs.{{amount}}',\n    'money_with_currency_format': 'Rs.{{amount}} PKR'\n  },\n  PGK: {\n    'money_format': 'K {{amount}}',\n    'money_with_currency_format': 'K {{amount}} PGK'\n  },\n  PYG: {\n    'money_format': 'Gs. {{amount_no_decimals_with_comma_separator}}',\n    'money_with_currency_format': 'Gs. {{amount_no_decimals_with_comma_separator}} PYG'\n  },\n  PEN: {\n    'money_format': 'S/. {{amount}}',\n    'money_with_currency_format': 'S/. {{amount}} PEN'\n  },\n  PHP: {\n    'money_format': '&#8369;{{amount}}',\n    'money_with_currency_format': '&#8369;{{amount}} PHP'\n  },\n  PLN: {\n    'money_format': '{{amount_with_comma_separator}} zl',\n    'money_with_currency_format': '{{amount_with_comma_separator}} zl PLN'\n  },\n  QAR: {\n    'money_format': 'QAR {{amount_with_comma_separator}}',\n    'money_with_currency_format': 'QAR {{amount_with_comma_separator}}'\n  },\n  RON: {\n    'money_format': '{{amount_with_comma_separator}} lei',\n    'money_with_currency_format': '{{amount_with_comma_separator}} lei RON'\n  },\n  RUB: {\n    'money_format': '&#1088;&#1091;&#1073;{{amount_with_comma_separator}}',\n    'money_with_currency_format': '&#1088;&#1091;&#1073;{{amount_with_comma_separator}} RUB'\n  },\n  RWF: {\n    'money_format': '{{amount_no_decimals}} RF',\n    'money_with_currency_format': '{{amount_no_decimals}} RWF'\n  },\n  WST: {\n    'money_format': 'WS$ {{amount}}',\n    'money_with_currency_format': 'WS$ {{amount}} WST'\n  },\n  SAR: {\n    'money_format': '{{amount}} SR',\n    'money_with_currency_format': '{{amount}} SAR'\n  },\n  STD: {\n    'money_format': 'Db {{amount}}',\n    'money_with_currency_format': 'Db {{amount}} STD'\n  },\n  RSD: {\n    'money_format': '{{amount}} RSD',\n    'money_with_currency_format': '{{amount}} RSD'\n  },\n  SCR: {\n    'money_format': 'Rs {{amount}}',\n    'money_with_currency_format': 'Rs {{amount}} SCR'\n  },\n  SGD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} SGD'\n  },\n  SYP: {\n    'money_format': 'S&pound;{{amount}}',\n    'money_with_currency_format': 'S&pound;{{amount}} SYP'\n  },\n  ZAR: {\n    'money_format': 'R {{amount}}',\n    'money_with_currency_format': 'R {{amount}} ZAR'\n  },\n  KRW: {\n    'money_format': '&#8361;{{amount_no_decimals}}',\n    'money_with_currency_format': '&#8361;{{amount_no_decimals}} KRW'\n  },\n  LKR: {\n    'money_format': 'Rs {{amount}}',\n    'money_with_currency_format': 'Rs {{amount}} LKR'\n  },\n  SEK: {\n    'money_format': '{{amount_no_decimals}} kr',\n    'money_with_currency_format': '{{amount_no_decimals}} kr SEK'\n  },\n  CHF: {\n    'money_format': 'SFr. {{amount}}',\n    'money_with_currency_format': 'SFr. {{amount}} CHF'\n  },\n  TWD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} TWD'\n  },\n  THB: {\n    'money_format': '{{amount}} &#xe3f;',\n    'money_with_currency_format': '{{amount}} &#xe3f; THB'\n  },\n  TZS: {\n    'money_format': '{{amount}} TZS',\n    'money_with_currency_format': '{{amount}} TZS'\n  },\n  TTD: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}} TTD'\n  },\n  TND: {\n    'money_format': '{{amount}}',\n    'money_with_currency_format': '{{amount}} DT'\n  },\n  TRY: {\n    'money_format': '{{amount}}TL',\n    'money_with_currency_format': '{{amount}}TL'\n  },\n  UGX: {\n    'money_format': 'Ush {{amount_no_decimals}}',\n    'money_with_currency_format': 'Ush {{amount_no_decimals}} UGX'\n  },\n  UAH: {\n    'money_format': '₴{{amount}}',\n    'money_with_currency_format': '₴{{amount}} UAH'\n  },\n  AED: {\n    'money_format': 'Dhs. {{amount}}',\n    'money_with_currency_format': 'Dhs. {{amount}} AED'\n  },\n  UYU: {\n    'money_format': '${{amount_with_comma_separator}}',\n    'money_with_currency_format': '${{amount_with_comma_separator}} UYU'\n  },\n  VUV: {\n    'money_format': '${{amount}}',\n    'money_with_currency_format': '${{amount}}VT'\n  },\n  VEF: {\n    'money_format': 'Bs. {{amount_with_comma_separator}}',\n    'money_with_currency_format': 'Bs. {{amount_with_comma_separator}} VEF'\n  },\n  VND: {\n    'money_format': '{{amount_no_decimals_with_comma_separator}}&#8363;',\n    'money_with_currency_format': '{{amount_no_decimals_with_comma_separator}} VND'\n  },\n  XBT: {\n    'money_format': '{{amount_no_decimals}} BTC',\n    'money_with_currency_format': '{{amount_no_decimals}} BTC'\n  },\n  XOF: {\n    'money_format': 'CFA{{amount}}',\n    'money_with_currency_format': 'CFA{{amount}} XOF'\n  },\n  ZMW: {\n    'money_format': 'K{{amount_no_decimals_with_comma_separator}}',\n    'money_with_currency_format': 'ZMW{{amount_no_decimals_with_comma_separator}}'\n  }\n};\n\n/**\n * Format a number to a specific format\n *\n * @param number {Number}\n * @param precision {Number}\n * @param thousands {String}\n * @param decimal {String}\n * @returns {String}\n */\nfunction formatWithDelimiters(number) {\n  var precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 2;\n  var thousands = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : ',';\n  var decimal = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : '.';\n\n  if (isNaN(number) || !number) {\n    return 0;\n  }\n\n  var preciseNumber = (number / 100.0).toFixed(precision);\n\n  var parts = preciseNumber.split(thousands);\n  var dollarsAmount = parts[0].replace(/(\\d)(?=(\\d\\d\\d)+(?!\\d))/g, '$1' + thousands);\n  var centsAmount = parts[1] ? decimal + parts[1] : '';\n\n  return dollarsAmount + centsAmount;\n}\n\n/**\n * Convert a money value in cents to a formatted currency string\n *\n * @param cents {Number|String}\n * @param format {String}\n * @returns {String}\n */\nfunction formatMoney(cents, format) {\n  if (typeof cents === 'string') {\n    cents = cents.replace('.', '');\n  }\n\n  var value = '';\n  var placeholderRegex = /\\{\\{\\s*(\\w+)\\s*\\}\\}/;\n\n  switch (format.match(placeholderRegex)[1]) {\n    case 'amount':\n      value = formatWithDelimiters(cents, 2, ',', '.');\n      break;\n    case 'amount_with_space_separator':\n      value = formatWithDelimiters(cents, 2, ' ', '.');\n      break;\n    case 'amount_with_comma_separator':\n      value = formatWithDelimiters(cents, 2, '.', ',');\n      break;\n    case 'amount_with_apostrophe_separator':\n      value = formatWithDelimiters(cents, 2, '\\'', '.');\n      break;\n    case 'amount_no_decimals':\n      value = formatWithDelimiters(cents, 0, ',', '.');\n      break;\n    case 'amount_no_decimals_with_space_separator':\n      value = formatWithDelimiters(cents, 0, ' ', '.');\n      break;\n    case 'amount_no_decimals_with_comma_separator':\n      value = formatWithDelimiters(cents, 0, ',', '.');\n      break;\n  }\n\n  return format.replace(placeholderRegex, value);\n}\n\n/**\n * Return the value of money in cents value\n *\n * @param moneyAmount {Number}\n * @param format {String}\n * @param currency {String}\n * @returns {Number}\n * @private\n */\nfunction getCentsValue(moneyAmount, format, currency) {\n  var cents = 0;\n  // Convert prices from float values to integers if needed, then convert\n  if (format.indexOf('amount_no_decimals') !== -1) {\n    cents = moneyAmount * 100;\n  } else if (currency === 'JOD' || currency === 'KWD' || currency === 'BHD') {\n    cents = moneyAmount / 10;\n  } else {\n    cents = moneyAmount;\n  }\n\n  return cents;\n}\n\n/**\n * Converts formatted money to a number\n *\n * @param priceEl {HTMLElement}\n * @returns {Number|String}\n */\nfunction getMoneyValue(priceEl) {\n  var price = priceEl.innerText;\n  var value = parseInt(price.replace(/[^0-9]/g, ''), 10);\n\n  return !isNaN(value) ? value : '';\n}\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar CurrencyConverter = function () {\n  function CurrencyConverter() {\n    classCallCheck(this, CurrencyConverter);\n\n    /**\n     * @property {object} defaults                       - The default configuration for CurrencyConverter\n     * @property {string} defaults.switcherSelector      - CSS Selector for dropdown which controls currency conversion\n     * @property {string} defaults.priceSelector         - CSS Selector for elements containing prices\n     * @property {string} defaults.shopCurrency          - Shop's currency (Currency which prices are printed as)\n     * @property {string} defaults.defaultCurrency       - Theme's currency setting, or initial currency to show on the page\n     * @property {string} defaults.displayFormat         - `money_with_currency_format` or `money_format`\n     * @property {string} defaults.moneyFormat           - Shop's currency formatted using the display format\n     * @property {string} defaults.moneyFormatNoCurrency - Shop's currency formatted without showing currency\n     * @property {string} defaults.moneyFormatCurrency   - Shop's currency formatted showing currency\n     */\n    this.defaults = {\n      switcherSelector: '[data-currency-converter]',\n      priceSelector: '.money',\n      shopCurrency: '',\n      defaultCurrency: '',\n      displayFormat: '',\n      moneyFormat: '',\n      moneyFormatNoCurrency: '',\n      moneyFormatCurrency: ''\n    };\n\n    this.options = {};\n    this.moneyFormats = moneyFormats;\n    this.storage = 'currency';\n    this.currentCurrency = null;\n    this.isInitialised = false;\n  }\n\n  createClass(CurrencyConverter, [{\n    key: 'init',\n    value: function init(settings) {\n      var _this = this;\n\n      if (!window.Currency || this.isInitialised) return;\n\n      Object.keys(this.defaults).forEach(function (key) {\n        _this.options[key] = settings[key] || _this.defaults[key];\n      });\n\n      this.currentCurrency = this._getStoredCurrency() || this.options.defaultCurrency;\n      this.moneyFormats[this.options.shopCurrency].money_with_currency_format = this.options.moneyFormatCurrency;\n      this.moneyFormats[this.options.shopCurrency].money_format = this.options.moneyFormatNoCurrency;\n\n      this.isInitialised = true;\n      this._current();\n    }\n\n    /**\n     * Change the currency to a new currency using an ISO currency code\n     *\n     * @param newCurrency\n     */\n\n  }, {\n    key: 'setCurrency',\n    value: function setCurrency(newCurrency) {\n      if (!this.isInitialised) return;\n\n      this._convertAll(this.currentCurrency, newCurrency);\n    }\n\n    /**\n     * Updates a price on the page to use the active Currency, and formatting\n     *\n     * @param priceEl {HTMLElement}\n     */\n\n  }, {\n    key: 'update',\n    value: function update(priceEl) {\n      if (!this.isInitialised) return;\n\n      var attributes = priceEl.attributes;\n      for (var attr = 0; attr < attributes.length; attr++) {\n        var attribute = attributes[attr];\n\n        if (attribute.name.indexOf('data-currency') === 0) {\n          priceEl.setAttribute(attribute.name, '');\n        }\n      }\n\n      var moneyValue = getMoneyValue(priceEl);\n      var centsValue = getCentsValue(moneyValue, this.options.moneyFormat, this.options.shopCurrency);\n\n      // Cents value is empty, but not 0. 0$ is a valid price, while empty is not\n      if (centsValue === '') return;\n\n      var priceFormatted = formatMoney(centsValue, this.options.moneyFormat);\n\n      priceEl.innerHTML = priceFormatted;\n      priceEl.removeAttribute('data-currency');\n      priceEl.setAttribute('data-currency-' + this.options.shopCurrency, priceFormatted);\n      priceEl.setAttribute('data-currency', this.options.shopCurrency);\n\n      this._convertEl(priceEl, this.options.shopCurrency, this.currentCurrency);\n    }\n  }, {\n    key: '_getStoredCurrency',\n    value: function _getStoredCurrency() {\n      try {\n        return localStorage.getItem(this.storage);\n      } catch (error) {\n        console.warn(error);\n        return this.options.defaultCurrency;\n      }\n    }\n  }, {\n    key: '_setStoredCurrency',\n    value: function _setStoredCurrency(currency) {\n      try {\n        localStorage.setItem(this.storage, currency);\n      } catch (error) {\n        console.warn(error);\n      }\n    }\n\n    /**\n     * Update the currency switcher to the current currency\n     * @private\n     */\n\n  }, {\n    key: '_current',\n    value: function _current() {\n      var switchers = document.querySelectorAll(this.options.switcherSelector);\n      for (var i = 0; i < switchers.length; i++) {\n        var switcher = switchers[i];\n\n        var childrenEls = switcher.querySelectorAll('option');\n\n        for (var _i = 0; _i < childrenEls.length; _i++) {\n          var optionEl = childrenEls[_i];\n\n          if (optionEl.selected && optionEl.value !== this.currentCurrency) {\n            optionEl.selected = false;\n          }\n\n          if (optionEl.value === this.currentCurrency) {\n            optionEl.selected = true;\n          }\n        }\n      }\n\n      this._convertAll(this.options.shopCurrency, this.currentCurrency);\n    }\n\n    /**\n     * Converts an individual price to the new format\n     *\n     * @param priceEl\n     * @param oldCurrency\n     * @param newCurrency\n     * @private\n     */\n\n  }, {\n    key: '_convertEl',\n    value: function _convertEl(priceEl, oldCurrency, newCurrency) {\n\n      // If the amount has already been converted, we leave it alone.\n      if (priceEl.getAttribute('data-currency') === newCurrency) {\n        return;\n      }\n\n      // If we are converting to a currency that we have saved, we will use the saved amount.\n      if (priceEl.getAttribute('data-currency-' + newCurrency)) {\n        priceEl.innerHTML = priceEl.getAttribute('data-currency-' + newCurrency);\n      } else {\n        var oldFormat = this.moneyFormats[oldCurrency][this.options.displayFormat];\n        var newFormat = this.moneyFormats[newCurrency][this.options.displayFormat];\n\n        var moneyValue = getMoneyValue(priceEl);\n        var centsValue = getCentsValue(moneyValue, oldFormat, oldCurrency);\n\n        // Cents value is empty, but not 0. 0$ is a valid price, while empty is not\n        if (centsValue === '') return;\n\n        var cents = window.Currency.convert(centsValue, oldCurrency, newCurrency);\n        var priceFormatted = formatMoney(cents, newFormat);\n\n        priceEl.setAttribute('data-currency-' + newCurrency, priceFormatted);\n        priceEl.innerHTML = priceFormatted;\n      }\n\n      priceEl.setAttribute('data-currency', newCurrency);\n    }\n\n    /**\n     * Convert all prices on the page to the new currency\n     *\n     * @param oldCurrency\n     * @param newCurrency\n     * @private\n     */\n\n  }, {\n    key: '_convertAll',\n    value: function _convertAll(oldCurrency, newCurrency) {\n      var priceEls = document.querySelectorAll(this.options.priceSelector);\n      if (!priceEls) return;\n\n      this.currentCurrency = newCurrency;\n      this._setStoredCurrency(newCurrency);\n\n      for (var i = 0; i < priceEls.length; i++) {\n        this._convertEl(priceEls[i], oldCurrency, newCurrency);\n      }\n    }\n  }]);\n  return CurrencyConverter;\n}();\n\nvar CurrencyConverter$1 = new CurrencyConverter();\n\nmodule.exports = CurrencyConverter$1;\n","/*!\n  * $script.js JS loader & dependency manager\n  * https://github.com/ded/script.js\n  * (c) Dustin Diaz 2014 | License MIT\n  */\n\n(function (name, definition) {\n  if (typeof module != 'undefined' && module.exports) module.exports = definition()\n  else if (typeof define == 'function' && define.amd) define(definition)\n  else this[name] = definition()\n})('$script', function () {\n  var doc = document\n    , head = doc.getElementsByTagName('head')[0]\n    , s = 'string'\n    , f = false\n    , push = 'push'\n    , readyState = 'readyState'\n    , onreadystatechange = 'onreadystatechange'\n    , list = {}\n    , ids = {}\n    , delay = {}\n    , scripts = {}\n    , scriptpath\n    , urlArgs\n\n  function every(ar, fn) {\n    for (var i = 0, j = ar.length; i < j; ++i) if (!fn(ar[i])) return f\n    return 1\n  }\n  function each(ar, fn) {\n    every(ar, function (el) {\n      return !fn(el)\n    })\n  }\n\n  function $script(paths, idOrDone, optDone) {\n    paths = paths[push] ? paths : [paths]\n    var idOrDoneIsDone = idOrDone && idOrDone.call\n      , done = idOrDoneIsDone ? idOrDone : optDone\n      , id = idOrDoneIsDone ? paths.join('') : idOrDone\n      , queue = paths.length\n    function loopFn(item) {\n      return item.call ? item() : list[item]\n    }\n    function callback() {\n      if (!--queue) {\n        list[id] = 1\n        done && done()\n        for (var dset in delay) {\n          every(dset.split('|'), loopFn) && !each(delay[dset], loopFn) && (delay[dset] = [])\n        }\n      }\n    }\n    setTimeout(function () {\n      each(paths, function loading(path, force) {\n        if (path === null) return callback()\n        \n        if (!force && !/^https?:\\/\\//.test(path) && scriptpath) {\n          path = (path.indexOf('.js') === -1) ? scriptpath + path + '.js' : scriptpath + path;\n        }\n        \n        if (scripts[path]) {\n          if (id) ids[id] = 1\n          return (scripts[path] == 2) ? callback() : setTimeout(function () { loading(path, true) }, 0)\n        }\n\n        scripts[path] = 1\n        if (id) ids[id] = 1\n        create(path, callback)\n      })\n    }, 0)\n    return $script\n  }\n\n  function create(path, fn) {\n    var el = doc.createElement('script'), loaded\n    el.onload = el.onerror = el[onreadystatechange] = function () {\n      if ((el[readyState] && !(/^c|loade/.test(el[readyState]))) || loaded) return;\n      el.onload = el[onreadystatechange] = null\n      loaded = 1\n      scripts[path] = 2\n      fn()\n    }\n    el.async = 1\n    el.src = urlArgs ? path + (path.indexOf('?') === -1 ? '?' : '&') + urlArgs : path;\n    head.insertBefore(el, head.lastChild)\n  }\n\n  $script.get = create\n\n  $script.order = function (scripts, id, done) {\n    (function callback(s) {\n      s = scripts.shift()\n      !scripts.length ? $script(s, id, done) : $script(s, callback)\n    }())\n  }\n\n  $script.path = function (p) {\n    scriptpath = p\n  }\n  $script.urlArgs = function (str) {\n    urlArgs = str;\n  }\n  $script.ready = function (deps, ready, req) {\n    deps = deps[push] ? deps : [deps]\n    var missing = [];\n    !each(deps, function (dep) {\n      list[dep] || missing[push](dep);\n    }) && every(deps, function (dep) {return list[dep]}) ?\n      ready() : !function (key) {\n      delay[key] = delay[key] || []\n      delay[key][push](ready)\n      req && req(missing)\n    }(deps.join('|'))\n    return $script\n  }\n\n  $script.done = function (idOrDone) {\n    $script([null], idOrDone)\n  }\n\n  return $script\n});\n","import $ from 'jquery';\n\nconst eventHandlers = [];\nlet previousBreakpoint = null;\n\n$(window).on('resize', (event) => {\n  const currentBreakpoint = getBreakpoint();\n\n  if (previousBreakpoint !== currentBreakpoint) {\n    eventHandlers.forEach((eventHandler) => {\n      eventHandler(event, {\n        previous: previousBreakpoint,\n        current: currentBreakpoint,\n      });\n    });\n  }\n\n  previousBreakpoint = currentBreakpoint;\n});\n\nfunction getBreakpoint() {\n  return window\n    .getComputedStyle(document.documentElement, ':after')\n    .getPropertyValue('content')\n    .replace(/\"/g, '');\n}\n\nfunction isBreakpoint(breakpoint) {\n  return getBreakpoint() === breakpoint;\n}\n\nfunction onBreakpointChange(eventHandler) {\n  if (eventHandlers.indexOf(eventHandler) === -1) {\n    eventHandlers.push(eventHandler);\n  }\n}\n\nfunction offBreakpointChange(eventHandler) {\n  const index = eventHandlers.indexOf(eventHandler);\n\n  if (index !== -1) {\n    eventHandlers.splice(index, 1);\n  }\n}\n\nexport default {\n  isBreakpoint,\n  onBreakpointChange,\n  offBreakpointChange,\n};\n","import $ from 'jquery';\n\nconst ignoredEls = [\n  'data-mobile-nav',\n  'data-site-navigation',\n];\n\nfunction isIgnored(element) {\n  // Disallow if element is a <script>\n  if (element.tagName === 'SCRIPT') {\n    return true;\n  }\n\n  // Allow if element has no attributes\n  if (element.attributes.length === 0) {\n    return false;\n  }\n\n  // Check if any attributes match to the ignore list\n  return [].slice.call(element.attributes).some((attr) => {\n    return ignoredEls.indexOf(attr.name) !== -1;\n  });\n}\n\n/**\n * Get the offset of the header\n *\n * @param {HTMLElement} header\n * @param {Boolean} withAnnouncementBar\n * @returns {number}\n */\nexport default function getHeaderOffset(header, withAnnouncementBar = false) {\n  const headerEls = header.childNodes;\n  const isSticky = header.querySelector('[data-site-header-sticky]');\n  const { pageYOffset } = window;\n  let offset = 0;\n\n  if (isSticky) {\n    for (let i = 0; i < headerEls.length; i++) {\n      if (headerEls[i] instanceof HTMLElement && !isIgnored(headerEls[i])) {\n        offset += headerEls[i].getBoundingClientRect().height;\n      }\n    }\n\n    if ($(header).hasClass('site-header-sticky--open') || pageYOffset === 0) {\n      offset += header.querySelector('[data-site-navigation]').getBoundingClientRect().height;\n    }\n  } else {\n    // If is not sticky header, then DOM can be trusted to return values\n    const { bottom } = header.getBoundingClientRect();\n\n    offset = bottom > 0 ? bottom : 0;\n  }\n\n  if (withAnnouncementBar) {\n    offset += parseInt(header.style.top, 10) || 0;\n  }\n\n  return offset;\n}\n","import $ from 'jquery';\nimport layout from '../Layout';\nimport getHeaderOffset from '../helpers/getHeaderOffset';\n\nexport default class StickyHeader {\n  constructor(options, settings) {\n    this.postMessage = options.postMessage;\n    this.$body = $(document.body);\n    this.$window = $(window);\n    this.$siteMain = $('.site-main');\n\n    this.$el = options.$el;\n    this.$toggle = options.$toggle;\n    this.settings = settings;\n\n    this.stickyClass = 'site-header-sticky';\n    this.scrolledClass = 'site-header-sticky--scrolled';\n    this.navOpenClass = 'site-header-sticky--open';\n\n    this.$announcementBar = this.$el.find('.announcement-bar');\n    this.header = this.$el[0];\n\n    if (!this.settings.sticky_header) {\n      return this._stickyReset();\n    }\n\n    // Revert navigation to original state on breakpoint change\n    this.navVisibility = this.navVisibility.bind(this);\n    layout.onBreakpointChange(this.navVisibility);\n\n    this._stickyOffset = this._stickyOffset.bind(this);\n    layout.onBreakpointChange(this._stickyOffset);\n\n    this._toggleStickyHeader = this._toggleStickyHeader.bind(this);\n    this._headerChecker = this._headerChecker.bind(this);\n\n    this._init();\n  }\n\n  closeNavigation() {\n    if (!this.settings.sticky_header) return;\n\n    this.$el.removeClass(this.navOpenClass).one('trend', () => {\n      this.$body.trigger('position-banners');\n    });\n    this.postMessage('nav:close-all');\n  }\n\n  openNavigation() {\n    this.$el.addClass(this.navOpenClass).one('trend', () => {\n      this.$body.trigger('position-banners');\n    });\n  }\n\n  navVisibility(event, breakpoints) {\n    if (breakpoints.previous === 'L') this.closeNavigation();\n  }\n\n  unload() {\n    if (!this.settings.sticky_header) return;\n\n    this.$body.removeClass(this.stickyClass).removeClass(this.scrolledClass);\n\n    this.$toggle.off('.sticky-header');\n    this.$window.off('.sticky-header');\n\n    layout.offBreakpointChange(this.navVisibility);\n    layout.offBreakpointChange(this._stickyOffset);\n\n    if (this.requestAnimationFrameId) {\n      window.cancelAnimationFrame(this.requestAnimationFrameId);\n    }\n  }\n\n  _init() {\n    this._stickyOffset(true);\n    this._bindEvents();\n\n    if (window.requestAnimationFrame) {\n      this._headerChecker();\n    }\n  }\n\n  _bindEvents() {\n    this.$toggle.on('click.sticky-header', (event) => {\n      event.preventDefault();\n\n      if (layout.isBreakpoint('L')) this._slideToggle();\n    });\n\n    this.$window.on('scroll.sticky-header', this._toggleStickyHeader);\n  }\n\n  _stickyReset() {\n    this.$siteMain.css('paddingTop', '');\n  }\n\n  /**\n   * Determine the offset when breakpoints change\n   *  - Offset is used to determine scroll threshold\n   *  - Offset is used to set a body offset on browsers that don't support Sticky\n   *\n   * @param isInit\n   * @private\n   */\n  _stickyOffset(isInit) {\n    if (!this.$body.hasClass(this.stickyClass)) {\n      this.$body.addClass(this.stickyClass);\n    }\n\n    const offset = getHeaderOffset(this.header);\n\n    this.$siteMain.css('paddingTop', offset);\n\n    if (isInit) {\n      this._toggleStickyHeader();\n    }\n  }\n\n  /**\n   * Open or close the navigation\n   *\n   * @param open\n   * @private\n   */\n  _slideToggle(open = false) {\n    if (this.$el.hasClass(this.navOpenClass) && !open) {\n      this.closeNavigation();\n      this.$toggle.removeClass('active');\n    } else {\n      this.openNavigation();\n      this.$toggle.addClass('active');\n    }\n  }\n\n  /**\n   *\n   *\n   * @param hide\n   * @private\n   */\n  _toggleAnnouncementBar(hide = false) {\n    if (!this.$announcementBar.length) {\n      return;\n    }\n\n    let top = 0;\n\n    if (hide) {\n      const mobileOnly = this.$announcementBar.hasClass('only-mobile');\n\n      if ((layout.isBreakpoint('XS') && mobileOnly) || !mobileOnly) {\n        top = this.$announcementBar.outerHeight() * -1;\n      }\n    }\n\n    this.$el.css('top', top).one('trend', () => {\n      this.$body.trigger('position-banners');\n    });\n  }\n\n  /**\n   * Sticky header only shows as sticky after scroll\n   *\n   * @private\n   */\n  _toggleStickyHeader() {\n    if (this.$body.hasClass('scroll-lock')) {\n      return;\n    }\n\n    const scrollThreshold = getHeaderOffset(this.header) + 20; // Extend threshold 20px past header\n    const shouldShrink = window.pageYOffset > scrollThreshold;\n\n    // Sticky header is scrolled, is and is visible -- nothing more to do!\n    if (shouldShrink && this.$body.hasClass(this.scrolledClass)) {\n      return;\n    }\n\n    if (shouldShrink) {\n      this._shrink();\n      this._toggleAnnouncementBar(true);\n    } else {\n      this._expand();\n      this._toggleAnnouncementBar(false);\n    }\n  }\n\n  _shrink() {\n    this.closeNavigation();\n    this.$toggle.removeClass('active');\n\n    this.$el\n      .revealer('show')\n      .one('revealer-animating.sticky-header', () => {\n        this.$body.addClass(this.scrolledClass).one('trend', () => {\n          this.$body.trigger('position-banners');\n        });\n      });\n  }\n\n  _expand() {\n    this.openNavigation();\n\n    this.$el\n      .revealer('hide')\n      .one('revealer-animating.sticky-header', () => {\n        this.$body.removeClass(this.scrolledClass).one('trend', () => {\n          this.$body.trigger('position-banners');\n        });\n      })\n      .one('revealer-hide.sticky-header', () => {\n        this.$toggle.removeClass('active');\n      });\n  }\n\n  _headerChecker() {\n    // Periodically check to make sure header is offset correctly\n    this.requestAnimationFrameId = window.requestAnimationFrame(this._headerChecker);\n\n    if (!this.$body.hasClass(this.scrolledClass)) {\n      this._stickyOffset();\n    }\n  }\n}\n","import $ from 'jquery';\n\nexport default class Accordion {\n  constructor($el, options = {}) {\n    this.$el = $el;\n\n    this.options = $.extend({}, {\n      activeClass: 'accordion--active',\n      autoCollapse: false,\n      content: '[data-accordion-content]',\n      eligibleClass: 'has-accordion',\n    }, options);\n  }\n\n  toggle($block, open = false) {\n    if (open || !$block.hasClass(this.options.activeClass)) {\n      if (this.options.autoCollapse) this.closeOpen();\n      this._open($block);\n    } else {\n      this._close($block);\n    }\n  }\n\n  closeOpen() {\n    $(this.$el.find(`.${this.options.activeClass}`)).each((i, block) => {\n      const $block = $(block);\n      if ($block.hasClass(this.options.activeClass)) {\n        this._close($block);\n      }\n    });\n  }\n\n  openAll() {\n    $(this.$el.find(`.${this.options.eligibleClass}`)).each((i, block) => {\n      this._open($(block), 0);\n    });\n  }\n\n  _open($block) {\n    $block.addClass(this.options.activeClass);\n  }\n\n  _close($block) {\n    $block.removeClass(this.options.activeClass);\n  }\n}\n","import $ from 'jquery';\n\nimport Accordion from '../Accordion';\n\nexport default class NavMobileSubMenus {\n  constructor($el) {\n    this.$el = $el;\n\n    this.Accordion = new Accordion(this.$el, {\n      activeClass: 'visible',\n      content: '[data-accordion-content]',\n    });\n\n    // Sub menu selectors\n    this.activeMenuClass = 'navmenu-link-parent-active';\n    this.activeMenu = `.${this.activeMenuClass}`;\n    this.navTrigger = '[data-navmenu-trigger]';\n    this.subMenu = '[data-navmenu-submenu]';\n\n    this._bindEvents();\n  }\n\n  unload() {\n    this.$el.off('.mobile-nav');\n\n    delete this.Accordion;\n  }\n\n  closeSubMenus($current) {\n    $current.find(this.activeMenu).each((index, el) => {\n      this._closeSubmenu($(el));\n    });\n  }\n\n  closeAllSubmenus() {\n    this.Accordion.closeOpen();\n  }\n\n  _bindEvents() {\n    // Prevent focus state from applying on mouse click\n    this.$el.on('mousedown.mobile-nav', '.navmenu-link', (event) => {\n      event.preventDefault();\n    });\n\n    this.$el.on('click.mobile-nav', `${this.navTrigger} > .navmenu-link-parent`, (event) => {\n      event.preventDefault();\n      this._toggleSubmenu(event);\n    });\n  }\n\n  _selectSubMenu($target) {\n    return $target.next(this.subMenu);\n  }\n\n  _toggleSubmenu(event) {\n    const $target = $(event.currentTarget);\n\n    if ($target.hasClass(this.activeMenuClass)) {\n      this._closeSubmenu($target);\n    } else {\n      this._openSubmenu($target);\n    }\n  }\n\n  _openSubmenu($target) {\n    const $menu = this._selectSubMenu($target);\n\n    $target\n      .addClass(this.activeMenuClass)\n      .attr('aria-expanded', true);\n    this.Accordion.toggle($menu);\n  }\n\n  _closeSubmenu($target) {\n    const $menu = this._selectSubMenu($target);\n\n    $target\n      .removeClass(this.activeMenuClass)\n      .attr('aria-expanded', false);\n    this.Accordion.toggle($menu);\n    this.closeSubMenus($menu);\n  }\n}\n","import $ from 'jquery';\n\nimport layout from '../Layout';\nimport NavMobileSubMenus from './NavMobileSubMenus';\n\nexport default class NavMobile {\n  constructor(elements) {\n    this.$body = $(document.body);\n    this.$window = $(window);\n    this.$el = elements.$el;\n    this.$toggleOpen = elements.$toggleOpen;\n    this.isOpen = false;\n    this.subMenus = null;\n\n    this.$mobileNav = this.$el.find('[data-mobile-nav]');\n    this.$panel = this.$el.find('[data-mobile-nav-panel]');\n    this.$overlay = this.$el.find('[data-mobile-nav-overlay]');\n    this.$toggleClose = this.$el.find('[data-mobile-nav-close]');\n\n    // Revert navigation to original state on breakpoint change\n    this.layoutHandler = this.onBreakpointChange.bind(this);\n    layout.onBreakpointChange(this.layoutHandler);\n\n    this._bindEvents();\n  }\n\n  unload() {\n    this._close();\n    this.$window.off('resize.mobile-nav');\n    layout.offBreakpointChange(this.layoutHandler);\n  }\n\n  onBreakpointChange() {\n    if (layout.isBreakpoint('L') && this.isOpen) {\n      this._close();\n    }\n  }\n\n  _bindEvents() {\n    this.$toggleOpen.on('click.mobile-nav', (event) => {\n      event.preventDefault();\n\n      if (!layout.isBreakpoint('L')) this._open();\n    });\n\n    this.$window.on('resize.mobile-nav', () => {\n      this.$el.find('[data-menu-toggle]').removeClass('active');\n\n      if (this.isOpen) {\n        this._setPanelHeight();\n      }\n    });\n  }\n\n  _setPanelHeight() {\n    this.$panel.height(window.innerHeight);\n  }\n\n  _open() {\n    this.$body.addClass('scroll-lock');\n    this.isOpen = true;\n\n    // Activate Submenu handler\n    this.subMenus = new NavMobileSubMenus(this.$panel);\n    this._setPanelHeight();\n\n    // Animate in elements\n    this.$mobileNav\n      .addClass('animating animating-in')\n      .one('trend', () => {\n        this.$mobileNav\n          .removeClass('animating animating-in')\n          .addClass('visible')\n          .off('trend');\n      });\n\n    // Event handlers\n    this.events = [\n      // Close menu when clicking on the overlay\n      this.$overlay.on('click.mobile-nav', event => this._close(event)),\n      this.$toggleClose.on('click.mobile-nav', event => this._close(event)),\n\n      // Disable scrolling on overlay and contactbar\n      this.$overlay.on('touchmove.mobile-nav', event => event.preventDefault()),\n    ];\n  }\n\n  _close(event = false) {\n    if (event) event.preventDefault();\n\n    this.$mobileNav\n      .addClass('animating animating-out')\n      .one('trend', () => {\n        this.$mobileNav\n          .removeClass('animating animating-out')\n          .removeClass('visible')\n          .off('trend');\n      });\n\n    this.$body.removeClass('scroll-lock');\n    this.isOpen = false;\n\n    // Close any open drop down menus\n    if (this.subMenus) {\n      this.subMenus.closeSubMenus(this.$el);\n      this.subMenus.closeAllSubmenus();\n\n      // Unbind Mobile sub menus\n      this.subMenus.unload();\n    }\n\n    // Unbind events\n    if (this.events) {\n      this.events.forEach($el => $el.off('.mobile-nav'));\n      this.events = [];\n    }\n  }\n}\n","import $ from 'jquery';\n\nexport default function scrollLeft($el) {\n  const $container = $el.parent();\n\n  $container.animate({\n    scrollLeft: $el.offset().left - ($el.width() / 2) - ($container.width() / 2)\n  });\n}\n","import $ from 'jquery';\nimport scrollLeft from '../helpers/scrollLeft';\n\nexport default class MegaNavScroller {\n  constructor($el, block = null) {\n    this.$el = $el;\n    this.$menuList = this.$el.find('.navmenu-meganav-items');\n\n    this._bindEvents();\n    this._addScrollClasses();\n\n    if (block) {\n      scrollLeft($(block.el));\n    }\n  }\n  \n  unload() {\n    this.$menuList.off('.meganav');\n  }\n\n  _bindEvents() {\n    this.$menuList.on('scroll.meganav', () => this._addScrollClasses());\n  }\n\n  _addScrollClasses() {\n    const scrollLeft = this.$menuList.scrollLeft();\n    const scrollWidth = this.$menuList[0].scrollWidth;\n    const width = this.$menuList.width();\n\n    this.$el.toggleClass('meganav--overflows-left', scrollLeft > 0);\n    this.$el.toggleClass('meganav--overflows-right', scrollLeft < scrollWidth - width);\n  }\n}\n","import $ from 'jquery';\n\nimport MegaNavScroller from './MegaNavScroller';\nimport scrollLeft from '../helpers/scrollLeft';\n\nexport default class NavDesktop {\n  constructor(options) {\n    this.$el = $(options.$el);\n    this.postMessage = options.postMessage;\n\n    this.activeMenu = 'navmenu-active';\n    this.activeItem = 'navmenu-item-active';\n    this.navTrigger = '[data-navmenu-trigger]';\n    this.subMenu = '[data-navmenu-submenu]';\n\n    this.inlineChildren = 'navmenu-submenu-inline-children';\n\n    this.events = [\n      // Navmenu mouse events\n      this.$el.on('mousedown.navmenu', '.navmenu-link', event => {\n        event.preventDefault();\n\n        // Add a class to actively clicked item to prevent focus styling\n        const $target = $(event.currentTarget);\n\n        this.$el.find(`.${this.activeItem}`).removeClass(this.activeItem);\n\n        $target.addClass(this.activeItem).attr('aria-expanded', true);\n      }),\n\n      this.$el.on('mouseup.navemenu, click.navmenu', `${this.navTrigger} > .navmenu-link-parent`, event => {\n        // Mouseup and click fire after mousedown\n        return event.preventDefault();\n      }),\n\n      this.$el.on('mousedown.navmenu', `${this.navTrigger} > .navmenu-link-parent`, event => {\n        event.preventDefault();\n\n        const $target = $(event.currentTarget);\n\n        if ($target.is(':focus')) {\n          $target.data('clicked', true);\n        }\n\n        this.toggleItem(event.currentTarget.parentNode);\n      }),\n\n      // Toggle item on touch, and click\n      this.$el.on('touchend.navmenu', `${this.navTrigger} > .navmenu-link-parent`, event => {\n        event.preventDefault();\n        event.stopPropagation();\n        this.toggleItem(event.currentTarget.parentNode);\n      }),\n\n      // Keyboard navigation -- toggle submenus\n      this.$el.on('focus.navmenu', `${this.navTrigger} > .navmenu-link-parent`, event => {\n        event.stopPropagation();\n\n        const $target = $(event.currentTarget);\n        const clicked = $target.data('clicked');\n\n        // Prevent focus by click to fire a subsequent toggle\n        if (clicked) {\n          $target.removeData('clicked');\n        } else {\n          this.toggleItem(event.currentTarget.parentNode);\n        }\n      }),\n\n      // Keyboard navigation -- close submenus when moving to a new nav item\n      this.$el.on('focus.navmenu', '.navmenu-depth-1 > .navmenu-item .navmenu-link', event => {\n        this.closeAll(event.currentTarget);\n      }),\n\n      // Close items when clicking outside\n      $(document).on('touchstart.navmenu, click.navmenu', event => {\n        this._handleDocumentClick(event.target);\n      }),\n    ];\n  }\n\n  unload() {\n    this.events.forEach($el => $el.off('.navmenu'));\n\n    if (this.megaNav) {\n      delete this.megaNav;\n    }\n  }\n\n  /**\n   * Open the MegaNav\n   * @param $menu\n   * @param block\n   */\n  openMegaNav($menu, block) {\n    this.megaNav = new MegaNavScroller($menu, block);\n  }\n\n  /**\n   * Open a dropdown menu, or scroll to a meganav item\n   *\n   * @param el - Parent LI containing sub menu\n   * @param block - Meganav menu block\n   */\n  openItem(el, block = null) {\n    const $el = $(el);\n\n    // Check if menu is already open\n    const $menu = $el.children(this.subMenu);\n    if ($menu.is(':visible')) {\n      // If its not a meganav, do nothing\n      if ($menu.attr('data-meganav-menu') === undefined) return;\n\n      // If its a meganav, scroll horizontally to the item\n      scrollLeft($(block.el));\n      return;\n    }\n\n    // Close previously opened items\n    this.closeAll(el);\n\n    $el.data('transitioning', true);\n    const $parent = $menu.parent(this.navTrigger);\n\n    // Add an active class to the menu's parent\n    $parent\n      .find('.navmenu-link-parent:first')\n      .addClass(this.activeMenu);\n\n    // Show menu\n    $menu\n      .addClass('animating animating-in')\n      .one('trend', () => {\n        $menu\n          .removeClass('animating animating-in')\n          .addClass('visible')\n          .off('trend');\n\n        this._inlineMenu($menu);\n\n        $el.data('transitioning', false);\n        $parent.find('> .navmenu-link').attr('aria-expanded', true);\n\n        // Load MegaNavScroller if is a mega nav\n        if ($menu.attr('data-meganav-menu') !== undefined) {\n          this.openMegaNav($menu, block);\n        }\n      });\n  }\n\n  closeAll(target) {\n    this.$el.find(`${this.subMenu}.visible, ${this.subMenu}.animating-in`).parent(this.navTrigger).each((i, el) => {\n      if (target && $.contains(el, target)) return;\n\n      // Close any submenus in this tree\n      $(el)\n        .find(this.navTrigger)\n        .each((i, submenu) => this.closeItem(submenu));\n\n      // Close root-level menu item\n      this.closeItem(el);\n    });\n  }\n\n  closeItem(el) {\n    const $el = $(el);\n    const $menu = $el.children(`${this.subMenu}.visible, ${this.subMenu}.animating-in`);\n    const $parent = $menu.parent(this.navTrigger);\n    if (!$menu.length) return;\n\n    // Menu is in the progress of being animated, try in 300ms\n    if($el.data('transitioning')) {\n      setTimeout(() => {\n        return this.closeItem(el);\n      }, 300);\n    }\n\n    // Add an active class to the menu's parent\n    $parent\n      .find('.navmenu-link-parent:first')\n      .removeClass(this.activeMenu);\n\n    // Ensure $menu is scrolled to top\n    if ($menu.hasClass(this.inlineChildren)) {\n      $menu.scrollTop(0);\n    }\n\n    // Hide menu\n    $menu\n      .addClass('animating animating-out')\n      .removeClass('animating-in')\n      .one('trend', () => {\n        $menu\n          .removeClass('animating animating-out visible')\n          .off('trend');\n\n        $parent.find('> .navmenu-link').attr('aria-expanded', false);\n\n        // Unload MegaNavScroller if is a mega-nav\n        if ($menu.data('meganav-menu') !== undefined && this.megaNav) {\n          this.megaNav.unload();\n          this.megaNav = null;\n        }\n      });\n  }\n\n  toggleItem(el) {\n    const $el = $(el);\n    const $menu = $el.children(this.subMenu);\n\n    if ($menu.is(':visible')) {\n      this.closeItem(el);\n    } else {\n      this.openItem(el);\n    }\n  }\n\n  _handleDocumentClick(target) {\n    const $parent = $(target).parents(this.navTrigger);\n    if ($parent.length) return;\n\n    this.closeAll();\n  }\n\n  _menuLimits($menu) {\n    const windowHeight = window.innerHeight;\n    const windowWidth = window.innerWidth;\n    const menuRect = $menu[0].getBoundingClientRect();\n    const hasChildren = $menu.find(this.subMenu).length > 0;\n    const stickyHeaderOffset = $('.site-header-sticky--scrolled').length ? 20 : 0; // Padding difference\n    const edges = {\n      bottomEdge: menuRect.bottom + stickyHeaderOffset,\n      rightEdge: menuRect.right + menuRect.width,\n    };\n\n    // Store bottom offset for subsequent openings\n    if (!$menu.data('bottom-edge') || $menu.data('bottom-edge') !== edges.bottomEdge) {\n      $menu.data('bottom-edge', edges.bottomEdge);\n    }\n\n    // Store child menu right edge\n    if (!$menu.data('right-edge') || $menu.data('right-edge') !== edges.rightEdge) {\n      $menu.data('right-edge', edges.rightEdge);\n    }\n\n    const bottomEdge = parseInt($menu.data('bottom-edge'), 10);\n    const rightEdge = parseInt($menu.data('right-edge'), 10);\n\n    return {\n      childrenExceedHorizontal: rightEdge >= windowWidth && hasChildren,\n      exceedsVertical: bottomEdge >= windowHeight,\n      maxHeight: windowHeight - menuRect.top,\n    };\n  }\n\n  /**\n   * Set a menu to be\n   */\n  _inlineMenu($menu) {\n    const { childrenExceedHorizontal, exceedsVertical, maxHeight } = this._menuLimits($menu);\n\n    // Unset inline style if height allows, and children menu don't exceed window bounds\n    if (!exceedsVertical && !childrenExceedHorizontal) {\n      return this._unsetInlineMenu($menu);\n    }\n\n    return $menu.css({ maxHeight }).addClass(this.inlineChildren);\n  }\n\n  _unsetInlineMenu($menu) {\n    $menu\n      .removeAttr('data-bottom-edge')\n      .removeAttr('data-right-edge')\n      .removeClass(this.inlineChildren)\n      .css('max-height', '');\n  }\n}\n","module.exports = debounce\n\nfunction debounce (fn, delay, at_start, guarantee) {\n  var timeout\n  var args\n  var self\n\n  return function debounced () {\n    self = this\n    args = Array.prototype.slice.call(arguments)\n\n    if (timeout && (at_start || guarantee)) {\n      return\n    } else if (!at_start) {\n      clear()\n\n      timeout = setTimeout(run, delay)\n      return timeout\n    }\n\n    timeout = setTimeout(clear, delay)\n    fn.apply(self, args)\n\n    function run () {\n      clear()\n      fn.apply(self, args)\n    }\n\n    function clear () {\n      clearTimeout(timeout)\n      timeout = null\n    }\n  }\n}\n","/*!\r\n * EventEmitter2\r\n * https://github.com/hij1nx/EventEmitter2\r\n *\r\n * Copyright (c) 2013 hij1nx\r\n * Licensed under the MIT license.\r\n */\r\n;!function(undefined) {\r\n\r\n  var isArray = Array.isArray ? Array.isArray : function _isArray(obj) {\r\n    return Object.prototype.toString.call(obj) === \"[object Array]\";\r\n  };\r\n  var defaultMaxListeners = 10;\r\n\r\n  function init() {\r\n    this._events = {};\r\n    if (this._conf) {\r\n      configure.call(this, this._conf);\r\n    }\r\n  }\r\n\r\n  function configure(conf) {\r\n    if (conf) {\r\n      this._conf = conf;\r\n\r\n      conf.delimiter && (this.delimiter = conf.delimiter);\r\n      this._events.maxListeners = conf.maxListeners !== undefined ? conf.maxListeners : defaultMaxListeners;\r\n      conf.wildcard && (this.wildcard = conf.wildcard);\r\n      conf.newListener && (this.newListener = conf.newListener);\r\n      conf.verboseMemoryLeak && (this.verboseMemoryLeak = conf.verboseMemoryLeak);\r\n\r\n      if (this.wildcard) {\r\n        this.listenerTree = {};\r\n      }\r\n    } else {\r\n      this._events.maxListeners = defaultMaxListeners;\r\n    }\r\n  }\r\n\r\n  function logPossibleMemoryLeak(count, eventName) {\r\n    var errorMsg = '(node) warning: possible EventEmitter memory ' +\r\n        'leak detected. %d listeners added. ' +\r\n        'Use emitter.setMaxListeners() to increase limit.';\r\n\r\n    if(this.verboseMemoryLeak){\r\n      errorMsg += ' Event name: %s.';\r\n      console.error(errorMsg, count, eventName);\r\n    } else {\r\n      console.error(errorMsg, count);\r\n    }\r\n\r\n    if (console.trace){\r\n      console.trace();\r\n    }\r\n  }\r\n\r\n  function EventEmitter(conf) {\r\n    this._events = {};\r\n    this.newListener = false;\r\n    this.verboseMemoryLeak = false;\r\n    configure.call(this, conf);\r\n  }\r\n  EventEmitter.EventEmitter2 = EventEmitter; // backwards compatibility for exporting EventEmitter property\r\n\r\n  //\r\n  // Attention, function return type now is array, always !\r\n  // It has zero elements if no any matches found and one or more\r\n  // elements (leafs) if there are matches\r\n  //\r\n  function searchListenerTree(handlers, type, tree, i) {\r\n    if (!tree) {\r\n      return [];\r\n    }\r\n    var listeners=[], leaf, len, branch, xTree, xxTree, isolatedBranch, endReached,\r\n        typeLength = type.length, currentType = type[i], nextType = type[i+1];\r\n    if (i === typeLength && tree._listeners) {\r\n      //\r\n      // If at the end of the event(s) list and the tree has listeners\r\n      // invoke those listeners.\r\n      //\r\n      if (typeof tree._listeners === 'function') {\r\n        handlers && handlers.push(tree._listeners);\r\n        return [tree];\r\n      } else {\r\n        for (leaf = 0, len = tree._listeners.length; leaf < len; leaf++) {\r\n          handlers && handlers.push(tree._listeners[leaf]);\r\n        }\r\n        return [tree];\r\n      }\r\n    }\r\n\r\n    if ((currentType === '*' || currentType === '**') || tree[currentType]) {\r\n      //\r\n      // If the event emitted is '*' at this part\r\n      // or there is a concrete match at this patch\r\n      //\r\n      if (currentType === '*') {\r\n        for (branch in tree) {\r\n          if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {\r\n            listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+1));\r\n          }\r\n        }\r\n        return listeners;\r\n      } else if(currentType === '**') {\r\n        endReached = (i+1 === typeLength || (i+2 === typeLength && nextType === '*'));\r\n        if(endReached && tree._listeners) {\r\n          // The next element has a _listeners, add it to the handlers.\r\n          listeners = listeners.concat(searchListenerTree(handlers, type, tree, typeLength));\r\n        }\r\n\r\n        for (branch in tree) {\r\n          if (branch !== '_listeners' && tree.hasOwnProperty(branch)) {\r\n            if(branch === '*' || branch === '**') {\r\n              if(tree[branch]._listeners && !endReached) {\r\n                listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], typeLength));\r\n              }\r\n              listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));\r\n            } else if(branch === nextType) {\r\n              listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i+2));\r\n            } else {\r\n              // No match on this one, shift into the tree but not in the type array.\r\n              listeners = listeners.concat(searchListenerTree(handlers, type, tree[branch], i));\r\n            }\r\n          }\r\n        }\r\n        return listeners;\r\n      }\r\n\r\n      listeners = listeners.concat(searchListenerTree(handlers, type, tree[currentType], i+1));\r\n    }\r\n\r\n    xTree = tree['*'];\r\n    if (xTree) {\r\n      //\r\n      // If the listener tree will allow any match for this part,\r\n      // then recursively explore all branches of the tree\r\n      //\r\n      searchListenerTree(handlers, type, xTree, i+1);\r\n    }\r\n\r\n    xxTree = tree['**'];\r\n    if(xxTree) {\r\n      if(i < typeLength) {\r\n        if(xxTree._listeners) {\r\n          // If we have a listener on a '**', it will catch all, so add its handler.\r\n          searchListenerTree(handlers, type, xxTree, typeLength);\r\n        }\r\n\r\n        // Build arrays of matching next branches and others.\r\n        for(branch in xxTree) {\r\n          if(branch !== '_listeners' && xxTree.hasOwnProperty(branch)) {\r\n            if(branch === nextType) {\r\n              // We know the next element will match, so jump twice.\r\n              searchListenerTree(handlers, type, xxTree[branch], i+2);\r\n            } else if(branch === currentType) {\r\n              // Current node matches, move into the tree.\r\n              searchListenerTree(handlers, type, xxTree[branch], i+1);\r\n            } else {\r\n              isolatedBranch = {};\r\n              isolatedBranch[branch] = xxTree[branch];\r\n              searchListenerTree(handlers, type, { '**': isolatedBranch }, i+1);\r\n            }\r\n          }\r\n        }\r\n      } else if(xxTree._listeners) {\r\n        // We have reached the end and still on a '**'\r\n        searchListenerTree(handlers, type, xxTree, typeLength);\r\n      } else if(xxTree['*'] && xxTree['*']._listeners) {\r\n        searchListenerTree(handlers, type, xxTree['*'], typeLength);\r\n      }\r\n    }\r\n\r\n    return listeners;\r\n  }\r\n\r\n  function growListenerTree(type, listener) {\r\n\r\n    type = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\r\n\r\n    //\r\n    // Looks for two consecutive '**', if so, don't add the event at all.\r\n    //\r\n    for(var i = 0, len = type.length; i+1 < len; i++) {\r\n      if(type[i] === '**' && type[i+1] === '**') {\r\n        return;\r\n      }\r\n    }\r\n\r\n    var tree = this.listenerTree;\r\n    var name = type.shift();\r\n\r\n    while (name !== undefined) {\r\n\r\n      if (!tree[name]) {\r\n        tree[name] = {};\r\n      }\r\n\r\n      tree = tree[name];\r\n\r\n      if (type.length === 0) {\r\n\r\n        if (!tree._listeners) {\r\n          tree._listeners = listener;\r\n        }\r\n        else {\r\n          if (typeof tree._listeners === 'function') {\r\n            tree._listeners = [tree._listeners];\r\n          }\r\n\r\n          tree._listeners.push(listener);\r\n\r\n          if (\r\n            !tree._listeners.warned &&\r\n            this._events.maxListeners > 0 &&\r\n            tree._listeners.length > this._events.maxListeners\r\n          ) {\r\n            tree._listeners.warned = true;\r\n            logPossibleMemoryLeak.call(this, tree._listeners.length, name);\r\n          }\r\n        }\r\n        return true;\r\n      }\r\n      name = type.shift();\r\n    }\r\n    return true;\r\n  }\r\n\r\n  // By default EventEmitters will print a warning if more than\r\n  // 10 listeners are added to it. This is a useful default which\r\n  // helps finding memory leaks.\r\n  //\r\n  // Obviously not all Emitters should be limited to 10. This function allows\r\n  // that to be increased. Set to zero for unlimited.\r\n\r\n  EventEmitter.prototype.delimiter = '.';\r\n\r\n  EventEmitter.prototype.setMaxListeners = function(n) {\r\n    if (n !== undefined) {\r\n      this._events || init.call(this);\r\n      this._events.maxListeners = n;\r\n      if (!this._conf) this._conf = {};\r\n      this._conf.maxListeners = n;\r\n    }\r\n  };\r\n\r\n  EventEmitter.prototype.event = '';\r\n\r\n  EventEmitter.prototype.once = function(event, fn) {\r\n    this.many(event, 1, fn);\r\n    return this;\r\n  };\r\n\r\n  EventEmitter.prototype.many = function(event, ttl, fn) {\r\n    var self = this;\r\n\r\n    if (typeof fn !== 'function') {\r\n      throw new Error('many only accepts instances of Function');\r\n    }\r\n\r\n    function listener() {\r\n      if (--ttl === 0) {\r\n        self.off(event, listener);\r\n      }\r\n      return fn.apply(this, arguments);\r\n    }\r\n\r\n    listener._origin = fn;\r\n\r\n    this.on(event, listener);\r\n\r\n    return self;\r\n  };\r\n\r\n  EventEmitter.prototype.emit = function() {\r\n\r\n    this._events || init.call(this);\r\n\r\n    var type = arguments[0];\r\n\r\n    if (type === 'newListener' && !this.newListener) {\r\n      if (!this._events.newListener) {\r\n        return false;\r\n      }\r\n    }\r\n\r\n    var al = arguments.length;\r\n    var args,l,i,j;\r\n    var handler;\r\n\r\n    if (this._all && this._all.length) {\r\n      handler = this._all.slice();\r\n      if (al > 3) {\r\n        args = new Array(al);\r\n        for (j = 0; j < al; j++) args[j] = arguments[j];\r\n      }\r\n\r\n      for (i = 0, l = handler.length; i < l; i++) {\r\n        this.event = type;\r\n        switch (al) {\r\n        case 1:\r\n          handler[i].call(this, type);\r\n          break;\r\n        case 2:\r\n          handler[i].call(this, type, arguments[1]);\r\n          break;\r\n        case 3:\r\n          handler[i].call(this, type, arguments[1], arguments[2]);\r\n          break;\r\n        default:\r\n          handler[i].apply(this, args);\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.wildcard) {\r\n      handler = [];\r\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\r\n      searchListenerTree.call(this, handler, ns, this.listenerTree, 0);\r\n    } else {\r\n      handler = this._events[type];\r\n      if (typeof handler === 'function') {\r\n        this.event = type;\r\n        switch (al) {\r\n        case 1:\r\n          handler.call(this);\r\n          break;\r\n        case 2:\r\n          handler.call(this, arguments[1]);\r\n          break;\r\n        case 3:\r\n          handler.call(this, arguments[1], arguments[2]);\r\n          break;\r\n        default:\r\n          args = new Array(al - 1);\r\n          for (j = 1; j < al; j++) args[j - 1] = arguments[j];\r\n          handler.apply(this, args);\r\n        }\r\n        return true;\r\n      } else if (handler) {\r\n        // need to make copy of handlers because list can change in the middle\r\n        // of emit call\r\n        handler = handler.slice();\r\n      }\r\n    }\r\n\r\n    if (handler && handler.length) {\r\n      if (al > 3) {\r\n        args = new Array(al - 1);\r\n        for (j = 1; j < al; j++) args[j - 1] = arguments[j];\r\n      }\r\n      for (i = 0, l = handler.length; i < l; i++) {\r\n        this.event = type;\r\n        switch (al) {\r\n        case 1:\r\n          handler[i].call(this);\r\n          break;\r\n        case 2:\r\n          handler[i].call(this, arguments[1]);\r\n          break;\r\n        case 3:\r\n          handler[i].call(this, arguments[1], arguments[2]);\r\n          break;\r\n        default:\r\n          handler[i].apply(this, args);\r\n        }\r\n      }\r\n      return true;\r\n    } else if (!this._all && type === 'error') {\r\n      if (arguments[1] instanceof Error) {\r\n        throw arguments[1]; // Unhandled 'error' event\r\n      } else {\r\n        throw new Error(\"Uncaught, unspecified 'error' event.\");\r\n      }\r\n      return false;\r\n    }\r\n\r\n    return !!this._all;\r\n  };\r\n\r\n  EventEmitter.prototype.emitAsync = function() {\r\n\r\n    this._events || init.call(this);\r\n\r\n    var type = arguments[0];\r\n\r\n    if (type === 'newListener' && !this.newListener) {\r\n        if (!this._events.newListener) { return Promise.resolve([false]); }\r\n    }\r\n\r\n    var promises= [];\r\n\r\n    var al = arguments.length;\r\n    var args,l,i,j;\r\n    var handler;\r\n\r\n    if (this._all) {\r\n      if (al > 3) {\r\n        args = new Array(al);\r\n        for (j = 1; j < al; j++) args[j] = arguments[j];\r\n      }\r\n      for (i = 0, l = this._all.length; i < l; i++) {\r\n        this.event = type;\r\n        switch (al) {\r\n        case 1:\r\n          promises.push(this._all[i].call(this, type));\r\n          break;\r\n        case 2:\r\n          promises.push(this._all[i].call(this, type, arguments[1]));\r\n          break;\r\n        case 3:\r\n          promises.push(this._all[i].call(this, type, arguments[1], arguments[2]));\r\n          break;\r\n        default:\r\n          promises.push(this._all[i].apply(this, args));\r\n        }\r\n      }\r\n    }\r\n\r\n    if (this.wildcard) {\r\n      handler = [];\r\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\r\n      searchListenerTree.call(this, handler, ns, this.listenerTree, 0);\r\n    } else {\r\n      handler = this._events[type];\r\n    }\r\n\r\n    if (typeof handler === 'function') {\r\n      this.event = type;\r\n      switch (al) {\r\n      case 1:\r\n        promises.push(handler.call(this));\r\n        break;\r\n      case 2:\r\n        promises.push(handler.call(this, arguments[1]));\r\n        break;\r\n      case 3:\r\n        promises.push(handler.call(this, arguments[1], arguments[2]));\r\n        break;\r\n      default:\r\n        args = new Array(al - 1);\r\n        for (j = 1; j < al; j++) args[j - 1] = arguments[j];\r\n        promises.push(handler.apply(this, args));\r\n      }\r\n    } else if (handler && handler.length) {\r\n      handler = handler.slice();\r\n      if (al > 3) {\r\n        args = new Array(al - 1);\r\n        for (j = 1; j < al; j++) args[j - 1] = arguments[j];\r\n      }\r\n      for (i = 0, l = handler.length; i < l; i++) {\r\n        this.event = type;\r\n        switch (al) {\r\n        case 1:\r\n          promises.push(handler[i].call(this));\r\n          break;\r\n        case 2:\r\n          promises.push(handler[i].call(this, arguments[1]));\r\n          break;\r\n        case 3:\r\n          promises.push(handler[i].call(this, arguments[1], arguments[2]));\r\n          break;\r\n        default:\r\n          promises.push(handler[i].apply(this, args));\r\n        }\r\n      }\r\n    } else if (!this._all && type === 'error') {\r\n      if (arguments[1] instanceof Error) {\r\n        return Promise.reject(arguments[1]); // Unhandled 'error' event\r\n      } else {\r\n        return Promise.reject(\"Uncaught, unspecified 'error' event.\");\r\n      }\r\n    }\r\n\r\n    return Promise.all(promises);\r\n  };\r\n\r\n  EventEmitter.prototype.on = function(type, listener) {\r\n    if (typeof type === 'function') {\r\n      this.onAny(type);\r\n      return this;\r\n    }\r\n\r\n    if (typeof listener !== 'function') {\r\n      throw new Error('on only accepts instances of Function');\r\n    }\r\n    this._events || init.call(this);\r\n\r\n    // To avoid recursion in the case that type == \"newListeners\"! Before\r\n    // adding it to the listeners, first emit \"newListeners\".\r\n    this.emit('newListener', type, listener);\r\n\r\n    if (this.wildcard) {\r\n      growListenerTree.call(this, type, listener);\r\n      return this;\r\n    }\r\n\r\n    if (!this._events[type]) {\r\n      // Optimize the case of one listener. Don't need the extra array object.\r\n      this._events[type] = listener;\r\n    }\r\n    else {\r\n      if (typeof this._events[type] === 'function') {\r\n        // Change to array.\r\n        this._events[type] = [this._events[type]];\r\n      }\r\n\r\n      // If we've already got an array, just append.\r\n      this._events[type].push(listener);\r\n\r\n      // Check for listener leak\r\n      if (\r\n        !this._events[type].warned &&\r\n        this._events.maxListeners > 0 &&\r\n        this._events[type].length > this._events.maxListeners\r\n      ) {\r\n        this._events[type].warned = true;\r\n        logPossibleMemoryLeak.call(this, this._events[type].length, type);\r\n      }\r\n    }\r\n\r\n    return this;\r\n  };\r\n\r\n  EventEmitter.prototype.onAny = function(fn) {\r\n    if (typeof fn !== 'function') {\r\n      throw new Error('onAny only accepts instances of Function');\r\n    }\r\n\r\n    if (!this._all) {\r\n      this._all = [];\r\n    }\r\n\r\n    // Add the function to the event listener collection.\r\n    this._all.push(fn);\r\n    return this;\r\n  };\r\n\r\n  EventEmitter.prototype.addListener = EventEmitter.prototype.on;\r\n\r\n  EventEmitter.prototype.off = function(type, listener) {\r\n    if (typeof listener !== 'function') {\r\n      throw new Error('removeListener only takes instances of Function');\r\n    }\r\n\r\n    var handlers,leafs=[];\r\n\r\n    if(this.wildcard) {\r\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\r\n      leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);\r\n    }\r\n    else {\r\n      // does not use listeners(), so no side effect of creating _events[type]\r\n      if (!this._events[type]) return this;\r\n      handlers = this._events[type];\r\n      leafs.push({_listeners:handlers});\r\n    }\r\n\r\n    for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {\r\n      var leaf = leafs[iLeaf];\r\n      handlers = leaf._listeners;\r\n      if (isArray(handlers)) {\r\n\r\n        var position = -1;\r\n\r\n        for (var i = 0, length = handlers.length; i < length; i++) {\r\n          if (handlers[i] === listener ||\r\n            (handlers[i].listener && handlers[i].listener === listener) ||\r\n            (handlers[i]._origin && handlers[i]._origin === listener)) {\r\n            position = i;\r\n            break;\r\n          }\r\n        }\r\n\r\n        if (position < 0) {\r\n          continue;\r\n        }\r\n\r\n        if(this.wildcard) {\r\n          leaf._listeners.splice(position, 1);\r\n        }\r\n        else {\r\n          this._events[type].splice(position, 1);\r\n        }\r\n\r\n        if (handlers.length === 0) {\r\n          if(this.wildcard) {\r\n            delete leaf._listeners;\r\n          }\r\n          else {\r\n            delete this._events[type];\r\n          }\r\n        }\r\n\r\n        this.emit(\"removeListener\", type, listener);\r\n\r\n        return this;\r\n      }\r\n      else if (handlers === listener ||\r\n        (handlers.listener && handlers.listener === listener) ||\r\n        (handlers._origin && handlers._origin === listener)) {\r\n        if(this.wildcard) {\r\n          delete leaf._listeners;\r\n        }\r\n        else {\r\n          delete this._events[type];\r\n        }\r\n\r\n        this.emit(\"removeListener\", type, listener);\r\n      }\r\n    }\r\n\r\n    function recursivelyGarbageCollect(root) {\r\n      if (root === undefined) {\r\n        return;\r\n      }\r\n      var keys = Object.keys(root);\r\n      for (var i in keys) {\r\n        var key = keys[i];\r\n        var obj = root[key];\r\n        if ((obj instanceof Function) || (typeof obj !== \"object\") || (obj === null))\r\n          continue;\r\n        if (Object.keys(obj).length > 0) {\r\n          recursivelyGarbageCollect(root[key]);\r\n        }\r\n        if (Object.keys(obj).length === 0) {\r\n          delete root[key];\r\n        }\r\n      }\r\n    }\r\n    recursivelyGarbageCollect(this.listenerTree);\r\n\r\n    return this;\r\n  };\r\n\r\n  EventEmitter.prototype.offAny = function(fn) {\r\n    var i = 0, l = 0, fns;\r\n    if (fn && this._all && this._all.length > 0) {\r\n      fns = this._all;\r\n      for(i = 0, l = fns.length; i < l; i++) {\r\n        if(fn === fns[i]) {\r\n          fns.splice(i, 1);\r\n          this.emit(\"removeListenerAny\", fn);\r\n          return this;\r\n        }\r\n      }\r\n    } else {\r\n      fns = this._all;\r\n      for(i = 0, l = fns.length; i < l; i++)\r\n        this.emit(\"removeListenerAny\", fns[i]);\r\n      this._all = [];\r\n    }\r\n    return this;\r\n  };\r\n\r\n  EventEmitter.prototype.removeListener = EventEmitter.prototype.off;\r\n\r\n  EventEmitter.prototype.removeAllListeners = function(type) {\r\n    if (arguments.length === 0) {\r\n      !this._events || init.call(this);\r\n      return this;\r\n    }\r\n\r\n    if (this.wildcard) {\r\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\r\n      var leafs = searchListenerTree.call(this, null, ns, this.listenerTree, 0);\r\n\r\n      for (var iLeaf=0; iLeaf<leafs.length; iLeaf++) {\r\n        var leaf = leafs[iLeaf];\r\n        leaf._listeners = null;\r\n      }\r\n    }\r\n    else if (this._events) {\r\n      this._events[type] = null;\r\n    }\r\n    return this;\r\n  };\r\n\r\n  EventEmitter.prototype.listeners = function(type) {\r\n    if (this.wildcard) {\r\n      var handlers = [];\r\n      var ns = typeof type === 'string' ? type.split(this.delimiter) : type.slice();\r\n      searchListenerTree.call(this, handlers, ns, this.listenerTree, 0);\r\n      return handlers;\r\n    }\r\n\r\n    this._events || init.call(this);\r\n\r\n    if (!this._events[type]) this._events[type] = [];\r\n    if (!isArray(this._events[type])) {\r\n      this._events[type] = [this._events[type]];\r\n    }\r\n    return this._events[type];\r\n  };\r\n\r\n  EventEmitter.prototype.listenerCount = function(type) {\r\n    return this.listeners(type).length;\r\n  };\r\n\r\n  EventEmitter.prototype.listenersAny = function() {\r\n\r\n    if(this._all) {\r\n      return this._all;\r\n    }\r\n    else {\r\n      return [];\r\n    }\r\n\r\n  };\r\n\r\n  if (typeof define === 'function' && define.amd) {\r\n     // AMD. Register as an anonymous module.\r\n    define(function() {\r\n      return EventEmitter;\r\n    });\r\n  } else if (typeof exports === 'object') {\r\n    // CommonJS\r\n    module.exports = EventEmitter;\r\n  }\r\n  else {\r\n    // Browser global.\r\n    window.EventEmitter2 = EventEmitter;\r\n  }\r\n}();\r\n","import EventEmitter from 'eventemitter2';\n\n/**\n * Search API Class\n */\nexport default class Search extends EventEmitter {\n  /**\n   * Create a new Search instance, and override defaults\n   *\n   * @param options\n   * @property {string} options.type - Search restriction. Use 'article', 'page', 'product', or ''\n   * @property {string} options.view - Search template suffix. Specify different templates as needed\n   */\n  constructor(options = {}) {\n    super();\n    \n    this.searchType = options.type || '';\n    this.view = options.view || 'json';\n\n    this.inProgress = false;\n    \n    this.xhr = window.XMLHttpRequest\n      ? new XMLHttpRequest()\n      : new ActiveXObject('Microsoft.XMLHTTP');\n\n    this._xhrLoad = this._xhrLoad.bind(this);\n    this._xhrError = this._xhrError.bind(this);\n    this._xhrAbort = this._xhrAbort.bind(this);\n\n    this._bindEvents();\n  }\n\n  _bindEvents() {\n    this.xhr.addEventListener('load', this._xhrLoad);\n    this.xhr.addEventListener('error', this._xhrError);\n    this.xhr.addEventListener('abort', this._xhrAbort);\n  }\n\n  /**\n   * XHR was successfull\n   *\n   * @description XHR completed successfully\n   * @param {object} event\n   * @fires Search#complete\n   * @private\n   */\n  _xhrLoad(event) {\n    let response = {};\n    const readyState = event.target.readyState;\n    const status = event.target.status;\n\n    try {\n      if (readyState > 3 && status == 200) {\n        response = JSON.parse(event.target.responseText);\n        this.emit('complete', response);\n      } else {\n        const message = `Invalid readyState: ${readyState}, or status: ${status}.`;\n        return this._xhrError(event, message);\n      }\n    } catch (error) {\n      return this._xhrError(event, 'Invalid JSON', error);\n    }\n\n    this.inProgress = false;\n  }\n\n  /**\n   * XHR contains an error\n   *\n   * @description XHR has contained an error, and was unable to complete\n   * @param {object} event\n   * @param {object|string} message\n   * @param {object} error\n   * @fires Search#error\n   * @private\n   */\n  _xhrError(event, message = null, error = null) {\n    this.inProgress = false;\n    this.emit('error', {event, message, error});\n  }\n\n  /**\n   * XHR has been aborted\n   *\n   * @description This event only fires if there is an active XHR request that has been terminated\n   * @fires Search#aborted\n   * @private\n   */\n  _xhrAbort() {\n    this.emit('aborted');\n  }\n\n  /**\n   * Perform the search\n   *\n   * @param {string} term - Search term(s)\n   * @fires Search#initialized\n   * @fires Search#cancelled\n   */\n  execute(term) {\n    this.emit('initialized', {term});\n\n    if (this.inProgress) {\n      this.emit('cancelled');\n      this.xhr.abort();\n    }\n\n    this.inProgress = true;\n\n    const url = '/search';\n    const params = {\n      q: term,\n      type: this.searchType,\n      view: this.view,\n    };\n\n    const searchParams = Object.keys(params).map((key) => {\n      const value = params[key];\n      return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`\n    }).join('&');\n\n    this.xhr.open('get', `${url}?${searchParams}`);\n    this.xhr.setRequestHeader('Accept', 'application/json');\n    this.xhr.send();\n  }\n}\n\n/**\n * @description XHR initialized\n * @event Search#initialized\n * @type {object}\n */\n\n/**\n * @description XHR completed\n * @event Search#complete\n * @property {object} response - JSON response from end point\n */\n\n/**\n * @description XHR had an error\n * @event Search#error\n */\n\n/**\n * @description XHR cancelled due to user interaction. If an XHR is being processed, this does not terminate it\n * @event Search#cancelled\n */\n\n/**\n * @description XHR aborted due to user interaction, terminating previously executed XHR.\n * @event Search#aborted\n */\n","import $ from 'jquery';\n\nexport default class SearchForm {\n  constructor($container) {\n    this.$body = $('body');\n    this.$container = $container;\n    this.$form = this.$container.find('[data-live-search-form]');\n\n    this.submitHandler = this.submitHandler.bind(this);\n\n    this.events = [\n      this.$form.on('submit.search-form', this.submitHandler),\n    ];\n  }\n\n  unload() {\n    this.events.forEach($el => $el.off('.search-form'));\n  }\n\n  submitHandler(event) {\n    event.preventDefault();\n\n    const $form = $(event.currentTarget).clone();\n    const $terms = $form.find('[name=q]');\n\n    $form.css({\n      position: 'absolute',\n      left: -1000,\n      bottom: -1000,\n      visibility: 'hidden',\n    });\n\n    let terms = $terms.val();\n\n    // Adds `*` after each word in search terms, doesn't add to last word\n    if (terms.indexOf(' ') > 0) {\n      terms = terms.split(' ').join('* ').trim();\n    }\n\n    // Adds `*` at the end of the search terms\n    terms = `${terms}*`;\n\n    // Update value\n    $terms.val(terms);\n\n    // Forms must be in the browser context in order to submit\n    this.$body.append($form);\n    $form.submit();\n  }\n}\n","/**\n * Shows a list item component when result is an article, or a page\n *\n * @param contentItem\n * @returns {string}\n * @constructor\n */\nfunction ContentItem(contentItem) {\n  return `\n  <li class=\"search-flydown--content-item\">\n    <a href=\"${contentItem.url}\">${contentItem.title}</a>\n  </li>\n  `;\n}\n\n/**\n * Shows a header for the article and page results\n *\n * @param context\n * @returns {string}\n * @constructor\n */\nfunction ContentResultsHeader(context) {\n  return `\n    <h5 class=\"search-flydown--content-title\">\n      ${context.content_results.title}\n    </h5>  \n  `;\n}\n\n/**\n * Shows a list of results from articles, or pages\n *\n * @param props\n * @returns {jQuery|HTMLElement}\n * @constructor\n */\nfunction ContentResults(props) {\n  const { content, context } = props;\n  const $title = ContentResultsHeader(context);\n  const contentItems = content.map(contentItem => ContentItem(contentItem));\n\n  return $(`\n    <div class=\"search-flydown--content-items\">\n      ${$title}\n      \n      <ul class=\"search-flydown--content-items-list\">\n        ${contentItems.join('')}\n      </ul>\n    </div>\n  `);\n}\n\n/**\n * Shows a message when there are no article or page results\n *\n * @param props\n * @returns {jQuery|HTMLElement}\n * @constructor\n */\nfunction ContentNoResults(props) {\n  const { context } = props;\n  const $title = ContentResultsHeader(context);\n\n  return $(`\n    <div class=\"search-flydown--content-items\">\n      ${$title}\n      \n      <p class=\"search-flydown--content-items-none\">\n        ${context.content_results.no_results}\n      </p>\n    </div>\n  `);\n}\n\n/**\n * Shows the product's compare_at_price, with connection for CurrencyConverter\n *\n * @param price\n * @returns {string}\n * @constructor\n */\nfunction ProductPriceCompareAt(price) {\n  return `\n  <span class=\"search-flydown--product-price--compare-at\">\n    <span class=\"money\">${price.compare_at_price}</span>\n  </span>\n  `;\n}\n\n/**\n * Shows the product's price, with connection for CurrencyConverter\n *\n * @param price\n * @returns {string}\n * @constructor\n */\nfunction ProductPriceMain(price) {\n  return `\n  <span class=\"search-flydown--product-price--main\">\n    <span class=\"money\">${price.price}</span>\n  </span>\n  `;\n}\n\n/**\n * Shows the product's prices\n *\n * @param props\n * @returns {string}\n * @constructor\n */\nfunction ProductPrice(props) {\n  const { price, onSale, consistentSaved } = props;\n  const $compareAt = onSale && consistentSaved ? ProductPriceCompareAt(price) : '';\n  const $price = ProductPriceMain(price);\n\n  return `\n    <span class=\"search-flydown--product-price ${onSale ? 'search-flydown--product-price-has-sale' : ''}\">\n      ${$price}\n      ${$compareAt}\n    </span>\n  `;\n}\n\n/**\n * Shows a product's main content\n *\n * @param product\n * @returns {string}\n * @constructor\n */\nfunction ProductContent(product) {\n  const $price = ProductPrice({\n    price: product.price,\n    onSale: product.on_sale,\n    consistentSaved: product.consistent_saved,\n  });\n\n  return `\n    <div class=\"search-flydown--product-text\">\n      <span class=\"search-flydown--product-title\">\n        ${product.title}\n      </span>\n      ${$price}\n    </div>\n  `;\n}\n\n/**\n * Shows a product's image\n *\n * @param image\n * @returns {string}\n * @constructor\n */\nfunction ProductImage(image) {\n  return `\n    <div class=\"search-flydown--product-image\">\n      ${image}\n    </div>\n  `;\n}\n\n/**\n * Shows a product list item component when result is a product\n *\n * @param product\n * @param enableImages\n * @returns {string}\n * @constructor\n */\nfunction ProductItem(product, enableImages) {\n  const $image = enableImages ? ProductImage(product.image) : '';\n  const $content = ProductContent(product);\n\n  return `\n    <a class=\"search-flydown--product search-flydown--product\" href=\"${product.url}\">\n      ${$image}\n      ${$content}\n    </a>\n  `;\n}\n\n/**\n * Shows a list of product results\n *\n * @param props\n * @returns {jQuery|HTMLElement}\n * @constructor\n */\nfunction ProductResults(props) {\n  const { products, enableImages } = props;\n  const productItems = products.map(product => ProductItem(product, enableImages));\n\n  return $(`\n    <div class=\"search-flydown--product-items\">\n      ${productItems.join('')}\n    </div>\n  `);\n}\n\n/**\n * Show a message when no product results are found\n *\n * @param props\n * @returns {jQuery|HTMLElement}\n * @constructor\n */\nfunction ProductNoResults(props) {\n  const { context, terms } = props;\n\n  return $(`\n    <div class=\"search-flydown--product-items--none\" data-live-search-no-products>\n      <h5>\n        ${context.no_results_products.title.replace('*terms*', terms)}\n      </h5>\n      <p>\n        ${context.no_results_products.message}\n      </p>\n      <p>\n        <a class=\"search-flydown--continue\" href=\"/collections/all\">\n          ${context.view_all_products}\n          \n          <span class=\"search-flydown--continue-icon\" aria-hidden=\"true\">\n            ${context.chevron}\n          </span>\n        </a>\n      </p>\n    </div>\n  `);\n}\n\n/**\n * Show's the Results footer, directing customers to all products\n *\n * @param props\n * @returns {jQuery|HTMLElement}\n * @constructor\n */\nfunction ResultsFooter(props) {\n  const { context, terms, type } = props;\n\n  return $(`\n    <div class=\"search-flydown--footer\">\n      <a class=\"search-flydown--continue\" href=\"/search?q=${terms}&type=${type}\">\n        ${context.view_all_results}\n        \n        <span class=\"search-flydown--continue-icon\" aria-hidden=\"true\">\n          ${context.chevron}\n        </span>\n      </a>\n    </div>\n  `);\n}\n\nexport {\n  ContentResults,\n  ContentNoResults,\n  ProductResults,\n  ProductNoResults,\n  ResultsFooter,\n};\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport CurrencyConverter from 'shopify-currency-converter';\n\nimport Search from '../Search';\nimport layout from '../Layout';\nimport SearchForm from './SearchForm';\n\nimport {\n  ContentResults,\n  ContentNoResults,\n  ProductResults,\n  ProductNoResults,\n  ResultsFooter,\n} from './HeaderSearchTemplates';\n\nexport default class HeaderSearch {\n  constructor($els, settings) {\n    this.$el = $els.$el;\n    this.$body = $('body');\n    this.$header = $els.$header;\n    this.$document = $(document);\n\n    this.settings = settings;\n    this.enableContent = this.settings.enable_content;\n    this.enableImages = this.settings.enable_images;\n    this.flyDownActive = false;\n    this.takeOverActive = false;\n    this.showFlyDown = false;\n    this.searchType = this.enableContent ? 'article,page,product' : 'product';\n\n    this.$form = this.$el.find('[data-live-search-form]');\n    this.$input = this.$form.find('[data-live-search-input]');\n    this.$button = this.$form.find('[data-live-search-submit]');\n    this.$takeOverButton = this.$form.find('[data-live-search-takeover-cancel]');\n\n    this.$flyDown = this.$el.find('[data-live-search-flydown]');\n    this.$searchResults = this.$flyDown.find('[data-live-search-results]');\n    this.$searchPlaceholder = this.$flyDown.find('[data-live-search-placeholder]');\n    this.$quickLinks = this.$flyDown.find('[data-live-search-quick-links]');\n\n    this.staticSearch = new SearchForm(this.$el);\n\n    this.search = new Search({\n      view: 'header',\n      type: this.searchType,\n    });\n\n    this._search = this._search.bind(this);\n    this._toggleTakeOver = this._toggleTakeOver.bind(this);\n    this._searchFocused = this._searchFocused.bind(this);\n    this._documentFocus = this._documentFocus.bind(this);\n\n    this._searchCancelled = this._searchCancelled.bind(this);\n    this._searchComplete = this._searchComplete.bind(this);\n    this._searchError = this._searchError.bind(this);\n\n    this.closeEvents = [];\n\n    this.search.on('cancelled', this._searchCancelled);\n    this.search.on('complete', this._searchComplete);\n    this.search.on('error', this._searchError);\n\n    this.events = [\n      this.$button.on('click.header-search', (event) => {\n        event.preventDefault();\n        this._search(event);\n      }),\n      this.$input.on('keyup.header-search', debounce(this._search, 250)),\n      this.$input.on('focus.header-search', this._searchFocused),\n      this.$takeOverButton.on('click.header-search', this._toggleTakeOver),\n    ];\n  }\n\n  unload() {\n    this.events.forEach($el => $el.off('.header-search'));\n\n    this.search.off('cancelled', this._searchCancelled);\n    this.search.off('complete', this._searchComplete);\n    this.search.off('error', this._searchError);\n\n    this.staticSearch.unload();\n  }\n\n  /**\n   * If is searching, only show placeholder\n   *\n   * @private\n   */\n  _flyDownSearching() {\n    this.$searchResults.removeClass('visible');\n    this.$quickLinks.removeClass('visible');\n\n    this.$searchPlaceholder.addClass('visible');\n  }\n\n  /**\n   * Search field has been focused, or has been cleared of contents\n   *   - If previous search contents, show\n   *   - If no previous search contents, show quicklinks if exists\n   *\n   * @param hasTerms\n   * @private\n   */\n  _flyDownInitial(hasTerms) {\n    this.showFlyDown = false;\n\n    const hasNoResults = this.$searchResults.find('[data-live-search-no-products]').length === 0;\n    const hasPreviousResults = this.$searchResults.children().length > 0;\n\n    if (hasTerms && hasNoResults && hasPreviousResults) {\n      this.$searchResults.addClass('visible');\n      this.$quickLinks.removeClass('visible');\n      this.showFlyDown = true;\n    } else if (this.$quickLinks.length) {\n      this.$searchResults.removeClass('visible');\n      this.$quickLinks.addClass('visible');\n      this.showFlyDown = true;\n    }\n  }\n\n  _search(event) {\n    // Ignore non character key strokes\n    const invalidKeyStrokes = [\n      'Alt',\n      'ArrowRight',\n      'ArrowLeft',\n      'ArrowUp',\n      'ArrowDown',\n      'Capslock',\n      'Control',\n      'Meta',\n      'Shift',\n      'Tab',\n    ];\n\n    if (event.key && invalidKeyStrokes.indexOf(event.key) !== -1) {\n      return;\n    }\n\n    let terms = this.$input.val();\n    const hasTerms = terms.length > 0;\n\n    // If is XS, pop the search out into a Takeover screen\n    if (layout.isBreakpoint('XS')) {\n      this._toggleTakeOver(null, true);\n    }\n\n    if (!hasTerms) {\n      this._flyDownInitial(true);\n\n      if (!this.showFlyDown) {\n        this._closeFlyDown(true);\n      }\n\n      return;\n    }\n\n    this._flyDownSearching();\n\n    // Clear previous results\n    this.$searchResults.html('');\n\n    // If terms has length, this will be true\n    this._toggleButton(hasTerms);\n\n    // Show the flyout if it isn't open\n    if (!this.$flyDown.data('is-open')) {\n      this.showFlyDown = true;\n      this._openFlyDown();\n    }\n\n    // Adds `*` after each word in search terms, doesn't add to last word\n    if (terms.indexOf(' ') > 0) {\n      terms = terms.split(' ').join('* ').trim();\n    }\n\n    // Adds `*` at the end of the search terms\n    terms = `${terms}*`;\n\n    this.search.execute(terms);\n  }\n\n  _searchError(response) {\n    console.warn('Search had error');\n    console.log(response.message, response.error, response.event);\n    this._toggleButton(false);\n  }\n\n  /**\n   * Search has been cancelled due to new search being performed\n   *\n   * @private\n   */\n  _searchCancelled() {\n    // Searches are canceled on user interaction, UI should remain unchanged\n  }\n\n  _searchComplete(response) {\n    const { content, products, terms, sanitizedTerms } = response;\n\n    const settings = {\n      products: {\n        results: {\n          products,\n          enableImages: this.enableImages,\n        },\n        noResults: {\n          context: this.settings.context,\n          terms: sanitizedTerms,\n        },\n      },\n      content: {\n        results: {\n          context: this.settings.context,\n          content,\n        },\n        noResults: {\n          context: this.settings.context,\n        },\n      },\n      footer: {\n        context: this.settings.context,\n        terms,\n        type: this.searchType,\n      },\n    };\n\n    const $productResults = products.length\n      ? ProductResults(settings.products.results)\n      : ProductNoResults(settings.products.noResults);\n\n    const $contentResults = content.length\n    ? ContentResults(settings.content.results)\n    : ContentNoResults(settings.content.noResults);\n\n    $productResults.find('.money').each((i, el) => {\n      el.innerHTML = Shopify.formatMoney(el.innerHTML, this.settings.money_format);\n      CurrencyConverter.update(el);\n    });\n\n    // Hide placeholder\n    // TODO: Lock minimum height?\n    this.$searchPlaceholder.removeClass('visible');\n\n    // Show results\n    this.$searchResults\n      .html($productResults)\n      .addClass('visible');\n\n    if (this.enableContent) {\n      this.$searchResults\n        .append($contentResults);\n    }\n\n    this.$searchResults\n      .append(ResultsFooter(settings.footer));\n\n    this._toggleButton(false);\n  }\n\n  /**\n   * Toggles search button while processing\n   *\n   * @param disable\n   * @private\n   */\n  _toggleButton(disable) {\n    if (disable) {\n      this.$button\n        .addClass('search-icon--processing')\n        .attr('disabled');\n    } else {\n      this.$button\n        .removeClass('search-icon--processing')\n        .removeAttr('disabled');\n    }\n  }\n\n  _searchFocused() {\n    if (this.flyDownActive) {\n      return;\n    }\n    const hasTerms = this.$input.val().length > 0;\n\n    // Only listen for events outside of the search flydown when its open\n    this.closeEvents.concat([\n      this.$header.on('focus.header-search', 'a, button', this._documentFocus),\n      this.$document.on('touchstart.header-search', this._documentFocus),\n      this.$document.on('click.header-search', this._documentFocus),\n    ]);\n\n    this.$el.addClass('site-header-search--focused');\n\n    // If is XS, pop the search out into a Takeover screen\n    if (layout.isBreakpoint('XS')) {\n      this._toggleTakeOver(null, true);\n    }\n\n    this._flyDownInitial(hasTerms);\n\n    this._openFlyDown();\n  }\n\n  _openFlyDown() {\n    if (!this.showFlyDown) {\n      return;\n    }\n\n    this.$el.addClass('site-header-search--active');\n    this.$flyDown.data('is-open', true);\n    this.flyDownActive = true;\n  }\n\n  /**\n   * Close the FlyDown when no longer needed\n   *  - Keep focus styling if input is still being interacted with\n   *\n   * @param retainFocus\n   * @private\n   */\n  _closeFlyDown(retainFocus = false) {\n    if (!this.flyDownActive) {\n      if (!retainFocus) {\n        this.$el.removeClass('site-header-search--focused');\n      }\n\n      return;\n    }\n\n    if (this.takeOverActive) {\n      this._toggleTakeOver(null, false);\n    }\n\n    this.$flyDown.data('is-open', false);\n    this.$el.removeClass('site-header-search--active');\n\n    if (!retainFocus) {\n      this.$el.removeClass('site-header-search--focused');\n    }\n\n    this.flyDownActive = false;\n    this.closeEvents.forEach($el => $el.off('.header-search'));\n    this.closeEvents = [];\n  }\n\n  /**\n   * Open or close the Take over for mobile\n   *\n   *\n   * @param event\n   * @param enable\n   * @private\n   */\n  _toggleTakeOver(event = null, enable = false) {\n    this.takeOverActive = enable;\n\n    if (event) {\n      event.preventDefault();\n    }\n\n    if (!enable) {\n      this._closeFlyDown(false);\n    }\n\n    if (this.$header.hasClass('search--section')) {\n      this.$body.toggleClass('search-takeover-active', enable);\n    }\n\n    this.$el.toggleClass('site-header-search--takeover', enable);\n    this.$body.toggleClass('scroll-lock', enable);\n  }\n\n  /**\n   * When the focus element has changed, either by clicking, touching, or tabbing\n   * check to see if it is within the flydown\n   *\n   * @param event\n   * @private\n   */\n  _documentFocus(event) {\n    const $parent = $(event.target).parents('[data-live-search]');\n\n    if ($parent.length) {\n      return;\n    }\n\n    this._closeFlyDown();\n  }\n}\n","import $ from 'jquery';\nimport CurrencyConverter from 'shopify-currency-converter';\nimport $script from 'scriptjs';\n\nimport Forms from '../Forms';\nimport layout from '../Layout';\nimport StickyHeader from '../components/StickyHeader';\nimport NavMobile from '../components/NavMobile';\nimport NavDesktop from '../components/NavDesktop';\nimport HeaderSearch from '../components/HeaderSearch';\nimport SearchForm from '../components/SearchForm';\n\nexport default class StaticSectionHeader {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.settings = section.data.settings;\n    this.currency = section.data.currency;\n    this.postMessage = section.postMessage;\n    this.headerSearch = null;\n\n    this.$scripts = $('[data-scripts]');\n\n    this.$menuToggle = this.$el.find('[data-menu-toggle]');\n    this.$cartCount = this.$el.find('[data-header-cart-count]');\n    this.$searchField = this.$el.find('[data-live-search]');\n\n    this.$siteNavigation = this.$el.find('[data-site-navigation]');\n    this.$desktopNavigation = this.$siteNavigation.find('ul.navmenu-depth-1');\n    this.$headerTools = this.$siteNavigation.find('[data-header-actions]');\n\n    this.converter = '[data-currency-converter]';\n    this.$converter = $(this.converter);\n\n    this.stickyHeader = new StickyHeader({\n      $el: this.$el,\n      $toggle: this.$menuToggle,\n      postMessage: this.postMessage,\n    }, this.settings);\n\n    this.navMobile = new NavMobile({\n      $el: this.$el,\n      $toggleOpen: this.$menuToggle,\n    });\n\n    this.navDesktop = new NavDesktop({\n      $el: this.$siteNavigation,\n      postMessage: this.postMessage,\n    });\n\n    this.forms = new Forms(this.$el);\n\n    if (this.settings.live_search.enable) {\n      $script(this.$scripts.data('shopify-api-url'), () => {\n        this.headerSearch = new HeaderSearch({\n          $el: this.$searchField,\n          $header: this.$el,\n        }, this.settings.live_search);\n      });\n    } else {\n      this.headerSearch = new SearchForm(this.$searchField);\n    }\n\n    if (this.currency.enable) {\n      $script(this.$scripts.data('shopify-currencies'), () => {\n        this._converter();\n      });\n    }\n\n    // Handle Accordion interaction when window size changes\n    this._headerToolsSize = this._headerToolsSize.bind(this);\n    layout.onBreakpointChange(this._headerToolsSize);\n\n    this.$el.on('cartcount:update', (event, data) => {\n      this.$cartCount\n        .attr('data-header-cart-count', data.response.item_count)\n        .toggleClass('visible', data.response.item_count > 0);\n    });\n\n    this._headerToolsSize();\n  }\n\n  onSectionDeselect() {\n    this.navDesktop.closeAll(null);\n    this.stickyHeader.closeNavigation();\n  }\n\n  onSectionUnload() {\n    this.stickyHeader.unload();\n    this.navMobile.unload();\n    this.navDesktop.unload();\n    this.forms.unload();\n\n    this.$el.off('cartcount:update');\n\n    this.headerSearch.unload();\n\n    if (this.currency.enable) {\n      this.$converter.off('change.converter');\n    }\n  }\n\n  onSectionMessage(name, data) {\n    if (name === 'nav:close-all' && layout.isBreakpoint('L')) {\n      this.navDesktop.closeAll(null);\n    }\n\n    if (name === 'stickyheader:open' && this.settings.sticky_header) {\n      this.stickyHeader.openNavigation(true);\n    }\n  }\n\n  onSectionBlockSelect(block) {\n    if (layout.isBreakpoint('L')) {\n      setTimeout(() => {\n        this.stickyHeader._slideToggle(true);\n\n        if (!$(block.el).find('.navmenu-link').hasClass('navmenu-active')) {\n          this.navDesktop.toggleItem(block.el);\n        }\n      }, 100);\n    }\n  }\n\n  onSectionBlockDeselect() {\n    if (this.$menuToggle.hasClass('active') && layout.isBreakpoint('L')) {\n      this.stickyHeader._slideToggle();\n    }\n\n    this.navDesktop.closeAll(null);\n  }\n\n  _converter() {\n    CurrencyConverter.init({\n      switcherSelector: this.converter,\n      priceSelector: '.money',\n      shopCurrency: this.currency.shop_currency,\n      defaultCurrency: this.currency.default_currency,\n      displayFormat: this.currency.display_format,\n      moneyFormat: this.currency.money_format,\n      moneyFormatNoCurrency: this.currency.money_format_no_currency,\n      moneyFormatCurrency: this.currency.money_format_currency,\n    });\n\n    this.$converter.on('change.converter', event => {\n      this.$converter.each((index, converter) => {\n        if (converter.value !== event.currentTarget.value) {\n          converter.value = event.currentTarget.value;\n        }\n      });\n\n      CurrencyConverter.setCurrency(event.currentTarget.value);\n    });\n  }\n\n  _headerToolsSize() {\n    if (!layout.isBreakpoint('L')) {\n      return;\n    }\n\n    const outerWidth = this.$headerTools.width();\n    const innerWidths = [];\n\n    this.$headerTools.find('li').each((index, el) => {\n      innerWidths.push(Math.ceil($(el).outerWidth()));\n    });\n\n    const combinedWidths = innerWidths.reduce((a, b) => a + b, 0);\n\n    if (combinedWidths > outerWidth) {\n      this.$headerTools.css('max-width', `${combinedWidths}px`);\n      this.$desktopNavigation.css('max-width', `calc(100% - ${combinedWidths}px)`);\n    }\n  }\n}\n","import $ from 'jquery';\n\nimport Accordion from '../Accordion';\nimport Forms from '../Forms';\nimport layout from '../Layout';\n\nexport default class StaticSectionFooter {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.Accordion = new Accordion(this.$el);\n\n    this.forms = new Forms(this.$el);\n\n    // Handle Accordion interaction when window size changes\n    this.layoutHandler = this.onBreakpointChange.bind(this);\n    layout.onBreakpointChange(this.layoutHandler);\n\n    this._bindEvents();\n  }\n\n  _bindEvents() {\n    this.$el.on('click.footer', '[data-accordion-trigger]', event => {\n      event.preventDefault();\n      this._toggleAccordion($(event.currentTarget).parent());\n    });\n  }\n\n  onSectionUnload() {\n    this.$el.off('.footer');\n    this.forms.unload();\n\n    delete this.Accordion;\n  }\n\n  onSectionBlockSelect(block) {\n    const $block = $(block.el);\n\n    if ($block.hasClass('has-accordion')) this._toggleAccordion($block, true);\n  }\n\n  onSectionBlockDeselect(block) {\n    const $block = $(block.el);\n\n    if ($block.hasClass('has-accordion')) this._toggleAccordion($block, false);\n  }\n\n  _toggleAccordion($block) {\n    if (layout.isBreakpoint('L')) return;\n\n    this.Accordion.toggle($block);\n  }\n\n  onBreakpointChange(event, breakpoints) {\n    if (layout.isBreakpoint('L')) {\n      this.Accordion.openAll();\n    } else if (breakpoints.previous === 'L' && !layout.isBreakpoint('L')) {\n      this.Accordion.closeOpen();\n    }\n  }\n}\n","import $ from 'jquery';\nimport RichText from '../components/RichText';\nimport Forms from '../Forms';\n\nexport default class StaticArticle {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.$commentForm = this.$el.find('[data-articlecomments-form]')\n\n    this.richText = new RichText(this.$el);\n\n    if (this.$commentForm.length) {\n      this.commentForm = new Forms(this.$commentForm);\n    }\n  }\n\n  onSectionUnload() {\n    this.richText.unload();\n\n    if (this.commentForm) {\n      this.commentForm.unload();\n    }\n  }\n}\n","import $ from 'jquery';\nimport RichText from '../components/RichText';\n\nexport default class StaticBlog {\n  constructor(section) {\n    this.$el = $(section.el);\n\n    this.richText = new RichText(this.$el);\n  }\n\n  onSectionUnload() {\n    this.richText.unload();\n  }\n}\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport getHeaderOffset from '../helpers/getHeaderOffset';\n\nexport default class MessageBanner {\n  constructor() {\n    this.$window = $(window);\n    this.$document = $(document);\n    this.$body = $(document.body);\n    this.$bannerTemplate = $('[data-templates] [data-message-banner]');\n    this.$banners = [];\n\n    this.header = document.querySelector('.site-header-wrapper');\n    this.events = [];\n\n    this.$document.on('touchstart.message-banner, click.message-banner', (event) => {\n      this._handleDocumentClick(event.target);\n    });\n  }\n\n  unload() {\n    this.$document.off('touchstart.message-banner, click.message-banner');\n  }\n\n  message(message, type) {\n    const $banner = this.$bannerTemplate.clone();\n\n    $banner\n      .addClass(`message--${type}`)\n      .find('[data-message-banner-content]')\n      .html(message);\n\n    this.$body.append($banner);\n    this._bindEvents($banner);\n    this._show($banner);\n  }\n\n  dismissBanners() {\n    const $visibleBanners = $('[data-message-banner]:visible');\n\n    $visibleBanners.each((index, banner) => {\n      this._hide($(banner), index);\n    });\n  }\n\n  _bindEvents($banner) {\n    this.events.push([\n      $banner.on('click.message-banner', '[data-message-banner-close]', (event) => {\n        event.preventDefault();\n        this._hide($banner);\n      }),\n      this.$body.on('position-banners.message-banner', () => {\n        this._positionBanner($banner);\n      }),\n      this.$window.on('resize.message-banner', debounce(() => this._positionBanner($banner), 250)),\n      this.$window.on('scroll.message-banner', () => this._positionBanner($banner)),\n    ]);\n  }\n\n  /**\n   * Position Message beneath header if its in viewport, or at top of viewport\n   *\n   * @param $banner\n   * @private\n   */\n  _positionBanner($banner) {\n    $banner.css({ top: getHeaderOffset(this.header, true) });\n  }\n\n  _show($banner) {\n    this._positionBanner($banner);\n    this.$banners.push($banner);\n\n    $banner\n      .addClass('animating animating-in')\n      .one('trend', () => {\n        $banner\n          .removeClass('animating animating-in')\n          .addClass('visible')\n          .off('trend');\n      });\n  }\n\n  _hide($banner, index = 0) {\n    $banner\n      .addClass('animating animating-out')\n      .one('trend', () => {\n        $banner\n          .removeClass('animating animating-out visible')\n          .off('trend');\n        this._removeBanner($banner, index);\n      });\n  }\n\n  _removeBanner($banner, index) {\n    if (this.events[index]) {\n      this.events[index].forEach($el => $el.off('.message-banner'));\n      this.events.splice(index, 1);\n    }\n\n    this.$banners.splice(index, 1);\n    $banner.remove();\n  }\n\n  _handleDocumentClick(target) {\n    const $parent = $(target).parents('[data-message-banner]');\n    if ($parent.length) return;\n\n    this.dismissBanners();\n  }\n}\n","import $ from 'jquery';\nimport $script from 'scriptjs';\nimport debounce from 'just-debounce';\nimport CurrencyConverter from 'shopify-currency-converter';\n\nimport Forms from '../Forms';\nimport MessageBanner from '../components/MessageBanner';\n\nexport default class StaticCart {\n  constructor(section) {\n    this.settings = section.data.settings;\n    this.shipping = section.data.shipping;\n    this.messageBanner = new MessageBanner();\n\n    this.$window = $(window);\n    this.$el = $(section.el);\n    this.$header = $('.site-header-wrapper');\n    this.$total = this.$el.find('[data-cart-total]');\n    this.$shipping = this.$el.find('[data-cartshipping]');\n\n    // Product form containers\n    this.$titleTotalSmall = this.$el.find('.cart-title-total--small');\n    this.$titleTotalLarge = this.$el.find('.cart-title-total--large');\n    this.$titleTotalContents = this.$el.find('[data-cart-title-total]');\n\n    // Shipping calculator elements\n    this.$shippingToggle = this.$el.find('[data-cartshipping-toggle]');\n    this.$shippingResponse = this.$shipping.find('[data-cartshipping-response]');\n    this.$shippingResponseMessage = this.$shippingResponse.find('[data-cartshipping-message]');\n    this.$shippingResponseRates = this.$shippingResponse.find('[data-cartshipping-rates]');\n    this.$shippingSubmit = this.$shipping.find('[data-cartshipping-submit]');\n\n    this._moveTitleTotal();\n\n    const $scripts = $('[data-scripts]');\n\n    $script($scripts.data('shopify-api-url'), () => {\n      this._bindEvents();\n\n      Shopify.onError = this._handleErrors.bind(this);\n    });\n\n    this.forms = new Forms(this.$el);\n\n    // Update the section when onSectionLoad fires to restore prices to local currency\n    this.$el.find('.money').each((index, el) => CurrencyConverter.update(el));\n\n    if (this.settings.shipping && this.$shipping.length) {\n      $script($scripts.data('shopify-countries'), () => {\n        $script($scripts.data('shopify-common'), () => {\n          $script($scripts.data('shopify-cart'), () => {\n            this._initShippingCalc();\n          });\n        });\n      });\n    }\n  }\n\n  onSectionUnload() {\n    this.$el.off('.cart-page');\n    this.$window.off('.cart-page');\n    this.forms.unload();\n    this.messageBanner.unload();\n    this.messageBanner.dismissBanners();\n  }\n\n  _bindEvents() {\n    this.$el.on('keydown.cart-page', '[data-cartitem-quantity]', (event) => {\n      this._quantityKeyDown(event);\n    });\n\n    this.$el.on('change.cart-page', '[data-cartitem-quantity]', (event) => {\n      this._editItemQuantity(event);\n    });\n\n    this.$el.on('click.cart-page', '[data-cartitem-remove]', (event) => {\n      event.preventDefault();\n      this._editItemQuantity(event, true);\n    });\n\n    this.$window.on('resize.cart-page', debounce(() => this._moveTitleTotal(), 20));\n  }\n\n  _moveTitleTotal() {\n    if (!this.$titleTotalContents.length) {\n      return;\n    }\n\n    if (this.$window.outerWidth() >= 480) {\n      if (!$.contains(this.$titleTotalLarge[0], this.$titleTotalContents[0])) {\n        const $form = this.$titleTotalContents.detach();\n        this.$titleTotalLarge.append($form);\n      }\n    } else {\n      if (!$.contains(this.$titleTotalSmall[0], this.$titleTotalContents[0])) {\n        const $form = this.$titleTotalContents.detach();\n        this.$titleTotalSmall.append($form);\n      }\n    }\n  }\n\n  /**\n   * Prevent form submission when pressing `enter` within a quantity selector\n   *\n   * @param event\n   * @private\n   */\n  _quantityKeyDown(event) {\n    // Only block enter keys\n    if (event.keyCode !== 13) {\n      return;\n    }\n\n    // Block form submission, but update field\n    $(event.currentTarget).trigger('change');\n\n    event.preventDefault();\n  }\n\n  /**\n   * Handle an item quantity change\n   *\n   * @param event\n   * @param {Boolean} remove - Set as true to remove cart item\n   * @private\n   */\n  _editItemQuantity(event, remove = false) {\n    this.messageBanner.dismissBanners();\n\n    const $target = $(event.currentTarget);\n    const $cartItem = $target.closest('[data-cartitem-id]');\n\n    let quantity = remove ? 0 : parseInt($target.val(), 10);\n    quantity = Math.max(quantity, 0);\n\n    this._updateCart($cartItem, quantity);\n\n    // Remove item from cart visually if it is being removed\n    if (quantity === 0 || remove) {\n      $cartItem.height($cartItem.height());\n    }\n  }\n\n  /**\n   * Update cart with a valid quantity\n   *\n   * @param $cartItem\n   * @param quantity\n   * @private\n   */\n  _updateCart($cartItem, quantity) {\n    const id = $cartItem.data('cartitem-id');\n\n    // Notify Shopify updated item\n    Shopify.changeItem(id, quantity, (response) => {\n      this._didUpdate(id, quantity,response, $cartItem);\n    });\n  }\n\n  _quantityError(limit, title) {\n    const errorMessage = this.settings.stock_limit\n      .replace('** quantity **', limit)\n      .replace('** title **', title);\n\n    this.messageBanner.message(errorMessage, 'error');\n  }\n\n  /**\n   * Update cart content based on information from Shopify\n   *\n   * @param id\n   * @param quantity\n   * @param response\n   * @param $cartItem\n   * @returns {*}\n   * @private\n   */\n  _didUpdate(id, quantity,response, $cartItem) {\n    // Reload page if all items are removed from cart\n    if (!response.items.length) {\n      return window.location = '/cart';\n    }\n\n    this.$header.trigger('cartcount:update', { response });\n\n    this.$total.each((i, el) => {\n      el.innerHTML = Shopify.formatMoney(response.total_price, this.settings.money_format);\n      CurrencyConverter.update(el);\n    });\n\n    // Select item from response\n    const filteredItems = response.items.filter(item => item.id === id);\n\n    if(!filteredItems.length) {\n      return $cartItem.addClass('removing')\n        .one('trend', () => {\n          $cartItem\n            .off('trend')\n            .remove();\n        });\n    }\n\n    const cartItem = filteredItems[0];\n    const itemTotal = $cartItem[0].querySelector('[data-cartitem-total]');\n\n    if (cartItem.quantity !== quantity) {\n      this._quantityError(cartItem.quantity, cartItem.title);\n      $cartItem.find('[data-quantity-input]').val(cartItem.quantity);\n      $cartItem.find('[data-quantity-select]').val(cartItem.quantity);\n    }\n\n    itemTotal.innerHTML = Shopify.formatMoney(cartItem.price * cartItem.quantity, this.settings.money_format);\n    CurrencyConverter.update(itemTotal);\n  }\n\n  /**\n   * Handle Errors returned from Shopify\n   *\n   * @param xhr\n   * @private\n   */\n  _handleErrors(xhr = null) {\n    if (!xhr) {\n      return;\n    }\n\n    const errors = $.parseJSON(xhr.responseText);\n    const shippingResponse = {\n      message: this.shipping.error_general,\n    };\n\n    if (errors.zip && errors.zip.length > 0) {\n      if (errors.zip[0].indexOf('is not valid') !== -1 || errors.zip[0].indexOf('can\\'t be blank') !== -1) {\n        shippingResponse.message = `${this.shipping.zip} ${errors.zip}`;\n      }\n    }\n\n    if (errors.error && errors.error.length > 0) {\n      if (errors.error[0].indexOf('shipment_too_heavy') !== -1) {\n        shippingResponse.message = this.shipping.shipment_too_heavy;\n      }\n    }\n\n    this._handleShippingResponse(shippingResponse);\n  }\n\n  _initShippingCalc() {\n    this._bindShippingCalcEvents();\n\n    Shopify.Cart.ShippingCalculator.show({\n      submitButton: this.shipping.calculate_shipping,\n      submitButtonDisabled: this.shipping.calculating,\n      customerIsLoggedIn: this.shipping.customer,\n      moneyFormat: this.settings.money_format,\n    });\n  }\n\n  _bindShippingCalcEvents() {\n    this.$el.on('click.cart-page', '[data-cartshipping-toggle]', () => {\n      this._toggleShippingCalc();\n    });\n\n    this.$el.on('click.cart-page', '[data-cartshipping-submit]', () => {\n      this._getShippingRates();\n    });\n\n    this.$el.on('keypress.cart-page', '#address_zip', (event) => {\n      if (event.keyCode === 10 || event.keyCode === 13) {\n        event.preventDefault();\n        this.$shippingSubmit.trigger('click');\n      }\n    });\n  }\n\n  _toggleShippingCalc() {\n    const oldText = this.$shippingToggle.text();\n    const newText = this.$shippingToggle.data('cartshipping-toggle');\n\n    this.$shippingToggle\n      .text(newText)\n      .data('cartshipping-toggle', oldText);\n\n    this.$shipping.toggleClass('open');\n  }\n\n  _getShippingRates() {\n    this._disableShippingButton();\n\n    const shippingAddress = {};\n    shippingAddress.country = $('#address_country').val() || '';\n    shippingAddress.province = $('#address_province').val() || '';\n    shippingAddress.zip = $('#address_zip').val() || '';\n\n    // Creates an ajax request which returns shipping information\n    Shopify.getCartShippingRatesForDestination(shippingAddress, (response, shippingAddress) => {\n      const addressBase = [];\n\n      if (shippingAddress.zip.length) {\n        addressBase.push(shippingAddress.zip.trim());\n      }\n\n      if (shippingAddress.province.length) {\n        addressBase.push(shippingAddress.province);\n      }\n\n      if (shippingAddress.country.length) {\n        addressBase.push(shippingAddress.country);\n      }\n\n      const address = addressBase.join(', ');\n\n      let message = '';\n      if (response.length > 1) {\n        const firstRate = Shopify.Cart.ShippingCalculator.formatRate(response[0].price);\n        message = this.shipping.multiple_rates\n          .replace('*address*', address)\n          .replace('*number_of_rates*', response.length)\n          .replace('*rate*', `<span class=\"money\">${firstRate}</span>`);\n      } else if (response.length === 1) {\n        message = this.shipping.one_rate.replace('*address*', address);\n      } else {\n        message = this.shipping.no_rates;\n      }\n\n      const rates = [];\n      response.forEach((rate) => {\n        const price = Shopify.Cart.ShippingCalculator.formatRate(rate.price);\n        const rateValue = this.shipping.rate_value\n          .replace('*rate_title*', rate.name)\n          .replace('*rate*', `<span class=\"money\">${price}</span>`);\n\n        rates.push(`<li>${rateValue}</li>`);\n      });\n\n      this._handleShippingResponse({\n        message,\n        rates,\n      });\n    });\n  }\n\n  _enableShippingButton() {\n    this.$shippingSubmit\n      .text(this.shipping.calculate_shipping)\n      .attr('disabled', false);\n  }\n\n  _disableShippingButton() {\n    this.$shippingSubmit\n      .text(this.shipping.calculating)\n      .attr('disabled', true);\n  }\n\n  _showShippingResponse() {\n    this.$shippingResponse.addClass('visible');\n  }\n\n  _hideShippingResponse() {\n    this.$shippingResponse.removeClass('visible');\n  }\n\n  /**\n   * Handle shipping responses\n   *\n   * @param {object} shippingResponse\n   * @property {String} shippingResponse.messages - Error / Success message\n   * @property {Array|String} shippingResponse.rates - Shipping rates\n   * @private\n   */\n  _handleShippingResponse(shippingResponse = {}) {\n    // Hide the response so that it can be populated smoothly\n    this._hideShippingResponse();\n\n    const message = shippingResponse.message || null;\n    const rates = shippingResponse.rates || null;\n\n    // Empty out contents\n    this.$shippingResponseMessage.empty();\n    this.$shippingResponseRates.empty();\n\n    if (message) {\n      this.$shippingResponseMessage.html(message);\n    }\n\n    if (rates) {\n      this.$shippingResponseRates.html(rates);\n    }\n\n    // Reset the calculating button so it can be used again\n    this._enableShippingButton();\n\n    // No error provided\n    if (!message && !rates) {\n      return;\n    }\n\n    // Show the response\n    this._showShippingResponse();\n  }\n}\n","(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define(['exports'], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(exports);\n  } else {\n    var mod = {\n      exports: {}\n    };\n    factory(mod.exports);\n    global.VanillaModal = mod.exports;\n  }\n})(this, function (exports) {\n  'use strict';\n\n  Object.defineProperty(exports, \"__esModule\", {\n    value: true\n  });\n\n  function _classCallCheck(instance, Constructor) {\n    if (!(instance instanceof Constructor)) {\n      throw new TypeError(\"Cannot call a class as a function\");\n    }\n  }\n\n  var _createClass = function () {\n    function defineProperties(target, props) {\n      for (var i = 0; i < props.length; i++) {\n        var descriptor = props[i];\n        descriptor.enumerable = descriptor.enumerable || false;\n        descriptor.configurable = true;\n        if (\"value\" in descriptor) descriptor.writable = true;\n        Object.defineProperty(target, descriptor.key, descriptor);\n      }\n    }\n\n    return function (Constructor, protoProps, staticProps) {\n      if (protoProps) defineProperties(Constructor.prototype, protoProps);\n      if (staticProps) defineProperties(Constructor, staticProps);\n      return Constructor;\n    };\n  }();\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  var defaults = {\n    modal: '.modal',\n    modalInner: '.modal-inner',\n    modalContent: '.modal-content',\n    open: '[data-modal-open]',\n    close: '[data-modal-close]',\n    page: 'body',\n    class: 'modal-visible',\n    loadClass: 'vanilla-modal',\n    clickOutside: true,\n    closeKeys: [27],\n    transitions: true,\n    transitionEnd: null,\n    onBeforeOpen: null,\n    onBeforeClose: null,\n    onOpen: null,\n    onClose: null\n  };\n\n  function throwError(message) {\n    // eslint-disable-next-line no-console\n    console.error('VanillaModal: ' + message);\n  }\n\n  function find(arr, callback) {\n    return function (key) {\n      var filteredArray = arr.filter(callback);\n      return filteredArray[0] ? filteredArray[0][key] : undefined;\n    };\n  }\n\n  function transitionEndVendorSniff() {\n    var el = document.createElement('div');\n    var transitions = [{ key: 'transition', value: 'transitionend' }, { key: 'OTransition', value: 'otransitionend' }, { key: 'MozTransition', value: 'transitionend' }, { key: 'WebkitTransition', value: 'webkitTransitionEnd' }];\n    return find(transitions, function (_ref) {\n      var key = _ref.key;\n      return typeof el.style[key] !== 'undefined';\n    })('value');\n  }\n\n  function isPopulatedArray(arr) {\n    return Object.prototype.toString.call(arr) === '[object Array]' && arr.length;\n  }\n\n  function getNode(selector, parent) {\n    var targetNode = parent || document;\n    var node = targetNode.querySelector(selector);\n    if (!node) {\n      throwError(selector + ' not found in document.');\n    }\n    return node;\n  }\n\n  function addClass(el, className) {\n    if (!(el instanceof HTMLElement)) {\n      throwError('Not a valid HTML element.');\n    }\n    el.setAttribute('class', el.className.split(' ').filter(function (cn) {\n      return cn !== className;\n    }).concat(className).join(' '));\n  }\n\n  function removeClass(el, className) {\n    if (!(el instanceof HTMLElement)) {\n      throwError('Not a valid HTML element.');\n    }\n    el.setAttribute('class', el.className.split(' ').filter(function (cn) {\n      return cn !== className;\n    }).join(' '));\n  }\n\n  function getElementContext(e) {\n    if (e && typeof e.hash === 'string') {\n      return document.querySelector(e.hash);\n    } else if (typeof e === 'string') {\n      return document.querySelector(e);\n    }\n    throwError('No selector supplied to open()');\n    return null;\n  }\n\n  function applyUserSettings(settings) {\n    return _extends({}, defaults, settings, {\n      transitionEnd: transitionEndVendorSniff()\n    });\n  }\n\n  function matches(e, selector) {\n    var allMatches = (e.target.document || e.target.ownerDocument).querySelectorAll(selector);\n    for (var i = 0; i < allMatches.length; i += 1) {\n      var node = e.target;\n      while (node && node !== document.body) {\n        if (node === allMatches[i]) {\n          return node;\n        }\n        node = node.parentNode;\n      }\n    }\n    return null;\n  }\n\n  var VanillaModal = function () {\n    function VanillaModal(settings) {\n      _classCallCheck(this, VanillaModal);\n\n      this.isOpen = false;\n      this.current = null;\n      this.isListening = false;\n\n      this.settings = applyUserSettings(settings);\n      this.dom = this.getDomNodes();\n\n      this.open = this.open.bind(this);\n      this.close = this.close.bind(this);\n      this.closeKeyHandler = this.closeKeyHandler.bind(this);\n      this.outsideClickHandler = this.outsideClickHandler.bind(this);\n      this.delegateOpen = this.delegateOpen.bind(this);\n      this.delegateClose = this.delegateClose.bind(this);\n      this.listen = this.listen.bind(this);\n      this.destroy = this.destroy.bind(this);\n\n      this.addLoadedCssClass();\n      this.listen();\n    }\n\n    _createClass(VanillaModal, [{\n      key: 'getDomNodes',\n      value: function getDomNodes() {\n        var _settings = this.settings,\n            modal = _settings.modal,\n            page = _settings.page,\n            modalInner = _settings.modalInner,\n            modalContent = _settings.modalContent;\n\n        return {\n          modal: getNode(modal),\n          page: getNode(page),\n          modalInner: getNode(modalInner, getNode(modal)),\n          modalContent: getNode(modalContent, getNode(modal))\n        };\n      }\n    }, {\n      key: 'addLoadedCssClass',\n      value: function addLoadedCssClass() {\n        addClass(this.dom.page, this.settings.loadClass);\n      }\n    }, {\n      key: 'setOpenId',\n      value: function setOpenId(id) {\n        var page = this.dom.page;\n\n        page.setAttribute('data-current-modal', id || 'anonymous');\n      }\n    }, {\n      key: 'removeOpenId',\n      value: function removeOpenId() {\n        var page = this.dom.page;\n\n        page.removeAttribute('data-current-modal');\n      }\n    }, {\n      key: 'open',\n      value: function open(allMatches, e) {\n        var page = this.dom.page;\n        var _settings2 = this.settings,\n            onBeforeOpen = _settings2.onBeforeOpen,\n            onOpen = _settings2.onOpen;\n\n        if (!(this.current instanceof HTMLElement === false)) {\n          throwError('VanillaModal target must exist on page.');\n          return;\n        }\n        this.releaseNode(this.current);\n        this.current = getElementContext(allMatches);\n        if (typeof onBeforeOpen === 'function') {\n          onBeforeOpen.call(this, e);\n        }\n        this.captureNode(this.current);\n        addClass(page, this.settings.class);\n        this.setOpenId(this.current.id);\n        this.isOpen = true;\n        if (typeof onOpen === 'function') {\n          onOpen.call(this, e);\n        }\n      }\n    }, {\n      key: 'detectTransition',\n      value: function detectTransition() {\n        var modal = this.dom.modal;\n\n        var css = window.getComputedStyle(modal, null);\n        return Boolean(['transitionDuration', 'oTransitionDuration', 'MozTransitionDuration', 'webkitTransitionDuration'].filter(function (i) {\n          return typeof css[i] === 'string' && parseFloat(css[i]) > 0;\n        }).length);\n      }\n    }, {\n      key: 'close',\n      value: function close(e) {\n        var _settings3 = this.settings,\n            transitions = _settings3.transitions,\n            transitionEnd = _settings3.transitionEnd,\n            onBeforeClose = _settings3.onBeforeClose;\n\n        var hasTransition = this.detectTransition();\n        if (this.isOpen) {\n          this.isOpen = false;\n          if (typeof onBeforeClose === 'function') {\n            onBeforeClose.call(this, e);\n          }\n          removeClass(this.dom.page, this.settings.class);\n          if (transitions && transitionEnd && hasTransition) {\n            this.closeModalWithTransition(e);\n          } else {\n            this.closeModal(e);\n          }\n        }\n      }\n    }, {\n      key: 'closeModal',\n      value: function closeModal(e) {\n        var onClose = this.settings.onClose;\n\n        this.removeOpenId(this.dom.page);\n        this.releaseNode(this.current);\n        this.isOpen = false;\n        this.current = null;\n        if (typeof onClose === 'function') {\n          onClose.call(this, e);\n        }\n      }\n    }, {\n      key: 'closeModalWithTransition',\n      value: function closeModalWithTransition(e) {\n        var _this = this;\n\n        var modal = this.dom.modal;\n        var transitionEnd = this.settings.transitionEnd;\n\n        var closeTransitionHandler = function closeTransitionHandler() {\n          modal.removeEventListener(transitionEnd, closeTransitionHandler);\n          _this.closeModal(e);\n        };\n        modal.addEventListener(transitionEnd, closeTransitionHandler);\n      }\n    }, {\n      key: 'captureNode',\n      value: function captureNode(node) {\n        var modalContent = this.dom.modalContent;\n\n        while (node.childNodes.length) {\n          modalContent.appendChild(node.childNodes[0]);\n        }\n      }\n    }, {\n      key: 'releaseNode',\n      value: function releaseNode(node) {\n        var modalContent = this.dom.modalContent;\n\n        while (modalContent.childNodes.length) {\n          node.appendChild(modalContent.childNodes[0]);\n        }\n      }\n    }, {\n      key: 'closeKeyHandler',\n      value: function closeKeyHandler(e) {\n        var closeKeys = this.settings.closeKeys;\n\n        if (isPopulatedArray(closeKeys) && closeKeys.indexOf(e.which) > -1 && this.isOpen === true) {\n          e.preventDefault();\n          this.close(e);\n        }\n      }\n    }, {\n      key: 'outsideClickHandler',\n      value: function outsideClickHandler(e) {\n        var clickOutside = this.settings.clickOutside;\n        var modalInner = this.dom.modalInner;\n\n        if (clickOutside) {\n          var node = e.target;\n          while (node && node !== document.body) {\n            if (node === modalInner) {\n              return;\n            }\n            node = node.parentNode;\n          }\n          this.close(e);\n        }\n      }\n    }, {\n      key: 'delegateOpen',\n      value: function delegateOpen(e) {\n        var open = this.settings.open;\n\n        var matchedNode = matches(e, open);\n        if (matchedNode) {\n          e.preventDefault();\n          this.open(matchedNode, e);\n        }\n      }\n    }, {\n      key: 'delegateClose',\n      value: function delegateClose(e) {\n        var close = this.settings.close;\n\n        if (matches(e, close)) {\n          e.preventDefault();\n          this.close(e);\n        }\n      }\n    }, {\n      key: 'listen',\n      value: function listen() {\n        var modal = this.dom.modal;\n\n        if (!this.isListening) {\n          modal.addEventListener('click', this.outsideClickHandler, false);\n          document.addEventListener('keydown', this.closeKeyHandler, false);\n          document.addEventListener('click', this.delegateOpen, false);\n          document.addEventListener('click', this.delegateClose, false);\n          this.isListening = true;\n        } else {\n          throwError('Event listeners already applied.');\n        }\n      }\n    }, {\n      key: 'destroy',\n      value: function destroy() {\n        var modal = this.dom.modal;\n\n        if (this.isListening) {\n          this.close();\n          modal.removeEventListener('click', this.outsideClickHandler);\n          document.removeEventListener('keydown', this.closeKeyHandler);\n          document.removeEventListener('click', this.delegateOpen);\n          document.removeEventListener('click', this.delegateClose);\n          this.isListening = false;\n        } else {\n          throwError('Event listeners already removed.');\n        }\n      }\n    }]);\n\n    return VanillaModal;\n  }();\n\n  exports.default = VanillaModal;\n});\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport VanillaModal from 'vanilla-modal';\n\nexport default class Modal {\n  constructor(callbacks = {}) {\n    this.$body = $(document.body);\n    this.$window = $(window);\n\n    this.modal = null;\n    this.$modal = $('[data-modal-container]');\n    this.$modalInner = this.$modal.find('[data-modal-inner]');\n\n    // Extend default vanilla-modal callbacks back to instantiator of Modal\n    this.defaultCallbacks = {\n      onOpen: () => {},\n      onClose: () => {},\n      onBeforeOpen: () => {},\n      onBeforeClose: () => {},\n    };\n\n    this.callbacks = $.extend({}, this.defaultCallbacks, callbacks);\n\n    this._onOpen = this._onOpen.bind(this);\n    this._onBeforeOpen = this._onBeforeOpen.bind(this);\n    this._onClose = this._onClose.bind(this);\n    this._onBeforeClose = this._onBeforeClose.bind(this);\n\n    this.position = this.position.bind(this);\n\n    this.modalOptions = {\n      loadClass: '',\n      class: 'modal-loaded',\n      onOpen: this._onOpen,\n      onClose: this._onClose,\n      onBeforeOpen: this._onBeforeOpen,\n      onBeforeClose: this._onBeforeClose,\n      transitions: false,\n    };\n  }\n\n  unload() {\n    if (!this.modal || !this.modal.isOpen) return;\n\n    this.modal.destroy();\n  }\n\n  /**\n   * Open a modal with contents from selector\n   *\n   * @param selector\n   * @param handle\n   */\n  open(selector, handle = 'general') {\n    this._addModalClass(handle);\n    this.modal = new VanillaModal(this.modalOptions);\n    this.modal.open(selector);\n  }\n\n  close() {\n    this.modal.close();\n  }\n\n  isOpen() {\n    return this.modal && this.modal.isOpen;\n  }\n\n  /**\n   * Update the vertical positioning of modal\n   */\n  position() {\n    const windowHeight = window.innerHeight;\n\n    const modalHeight = this.$modalInner.outerHeight();\n    const modalPadding = parseInt(this.$modal.css('padding-top'), 10) * 2;\n\n    const offset = (windowHeight - modalPadding - modalHeight) / 2;\n    const marginTop = offset > 0 ? offset : 0;\n    this.$modalInner.css({ marginTop });\n  }\n\n  /**\n   * Add a class to the modal for individual styling\n   * @param handle\n   * @private\n   */\n  _addModalClass(handle) {\n    this.$modal.addClass(`modal--${handle}`);\n  }\n\n  /**\n   * Remove modal class based on the handle\n   * @private\n   */\n  _removeModalClass() {\n    const modalClass = this.$modal.attr('class').match(/modal--[\\w-]*\\b/);\n    if (!modalClass) {\n      return;\n    }\n\n    this.$modal.removeClass(modalClass[0]);\n  }\n\n  _onClose() {\n    this._removeModalClass();\n    this.$body\n      .removeClass('scroll-lock')\n      .removeClass('modal-visible');\n\n    this.$window.off('resize.modal');\n\n    this.$modalInner.css({ marginTop: '' });\n\n    this.callbacks.onClose();\n  }\n\n  _onOpen() {\n    this.position();\n    this.$body\n      .addClass('scroll-lock')\n      .addClass('modal-visible');\n    this.$window.on('resize.modal', debounce(() => this.position(), 16, true, true));\n\n    this.callbacks.onOpen();\n  }\n\n  _onBeforeClose() {\n    this.callbacks.onBeforeClose();\n  }\n\n  _onBeforeOpen() {\n    this.callbacks.onBeforeOpen();\n  }\n}\n","import $ from 'jquery';\n\n/**\n * Traps the focus in a particular container\n *\n * @param {object} options - Options to be used\n * @param {jQuery} options.$container - Container to trap focus within\n * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n * @param {string} options.namespace - Namespace used for new focus event handler\n */\nfunction trapFocus(options) {\n  const  eventName = options.namespace\n    ? `focusin.${options.namespace}`\n    : 'focusin';\n\n  if (!options.$elementToFocus) {\n    options.$elementToFocus = options.$container;\n  }\n\n  options.$container.attr('tabindex', '-1');\n  options.$elementToFocus.focus();\n\n  $(document).on(eventName, (evt) => {\n    if (options.$container[0] !== evt.target && !options.$container.has(evt.target).length) {\n      options.$container.focus();\n    }\n  });\n}\n\n\n/**\n * Removes the trap of focus in a particular container\n *\n * @param {object} options - Options to be used\n * @param {jQuery} options.$container - Container to trap focus within\n * @param {string} options.namespace - Namespace used for new focus event handler\n */\nfunction removeTrapFocus(options) {\n  const eventName = options.namespace\n    ? `focusin.${options.namespace}`\n    : 'focusin';\n\n  if (options.$container && options.$container.length) {\n    options.$container.removeAttr('tabindex');\n  }\n\n  $(document).off(eventName);\n}\n\nexport {\n  trapFocus,\n  removeTrapFocus,\n};\n","import $ from 'jquery';\n\nclass Node {\n  constructor(variant) {\n    this.variant = variant;\n    this.optionsCount = this.variant.options.length;\n    this.neighbors = [];\n\n    for (let i = 0; i < this.optionsCount; i++) {\n      this.neighbors.push([]);\n    }\n  }\n\n  addNeighbor(variant) {\n    for (let i = 0; i < this.optionsCount; i++) {\n      if (this.variant.options[i] !== variant.options[i]) {\n        this.neighbors[i].push(variant);\n        break;\n      }\n    }\n  }\n\n  getValidOptions() {\n    const options = [];\n\n    for (let i = 0; i < this.optionsCount; i++) {\n      const variants = [this.variant, ...this.neighbors[i]];\n      options[i] = {};\n\n      variants.forEach((item) => {\n        const variant = item;\n        const option = variant.options[i];\n\n        options[i][option] = {\n          available: (options[i][option] && options[i][option].available) || variant.available,\n        };\n      });\n    }\n\n    return options;\n  }\n}\n\nexport default class ProductOptions {\n  constructor(product) {\n    this.productHandle = product.handle;\n    this.optionsCount = product.options.length;\n    this.variants = product.variants;\n    this.nodeMap = {};\n\n    this._generateNodeMap(product);\n  }\n\n  _generateNodeMap() {\n    this.variants.forEach((variant) => {\n      this.nodeMap[variant.id] = new Node(variant);\n\n      this.variants.forEach((variant2) => {\n        this.nodeMap[variant.id].addNeighbor(variant2);\n      });\n    });\n  }\n\n  getVariantFromOptions(options) {\n    this.variants.forEach((variant) => {\n      let found = true;\n\n      for (let i = 0; i < variant.options.length; i++) {\n        if (options[i] !== variant.options[i]) {\n          found = false;\n        }\n      }\n\n      if (found) {\n        return variant;\n      }\n    });\n\n    return false;\n  }\n\n  getClosestVariantFromOptions(options) {\n    let closestVariant = null;\n    let matchingValues = 0;\n\n    this.variants.forEach((variant) => {\n      let tempMatchingValues = 0;\n\n      for (let i = 0; i < variant.options.length; i++) {\n        if (options[i] === variant.options[i]) {\n          tempMatchingValues++;\n        } else {\n          break;\n        }\n      }\n\n      if (tempMatchingValues >= matchingValues) {\n        closestVariant = variant;\n        matchingValues = tempMatchingValues;\n      }\n    });\n\n    return closestVariant ? closestVariant : false;\n  }\n\n  getVariantOrClosestFromOptions(options) {\n    return this.getVariantFromOptions(options)\n      || this.getClosestVariantFromOptions(options);\n  }\n\n  getAvailableOptionsFromVariant(variant) {\n    return this.nodeMap[variant.id].getValidOptions();\n  }\n}\n","import $ from 'jquery';\nimport ProductOptions from './ProductOptions';\n\nexport default class VariantHelper {\n  constructor(product, $variants, $options) {\n    this.product = product;\n    this.optionsCount = this.product.options.length;\n    this.$variants = $variants;\n    this.$options = $options;\n    this.productOptions = new ProductOptions(this.product);\n    this.optionsTypes = {\n      select: 'select',\n      radio: 'input[type=\"radio\"]',\n    };\n\n    this._bindEvents();\n\n    if (this.$options.is(this.optionsTypes.select)) {\n      this.optionsType = this.optionsTypes.select;\n    } else if (this.$options.is(this.optionsTypes.radio)) {\n      this.optionsType = this.optionsTypes.radio;\n    } else {\n      console.warn('Variant helper: Option set is not a valid type');\n      this._unbindEvents();\n    }\n\n    this._switchVariant(true);\n  }\n\n  _bindEvents() {\n    this.$options.on('change.variant-helper', () => this._switchVariant());\n  }\n\n  _unbindEvents() {\n    this.$options.off('change.variant-helper');\n  }\n\n  _switchVariant(firstLoad = false) {\n    const options = [];\n    const product = this.product;\n    let variant = null;\n    let availableOptions = null;\n\n    if (this.optionsType === this.optionsTypes.select) {\n      this.$options.each((i, option) => {\n        options.push(option.value);\n      });\n    } else if (this.optionsType === this.optionsTypes.radio) {\n      this.$options.filter(':checked').each((i, option) => {\n        options.push(option.value);\n      });\n    } else {\n      return;\n    }\n\n    variant = this.productOptions.getVariantOrClosestFromOptions(options);\n\n    if (variant) {\n      availableOptions = this.productOptions.getAvailableOptionsFromVariant(variant);\n    } else {\n      return;\n    }\n\n    if (this.optionsType === this.optionsTypes.select) {\n      this._switchVariantSelect(variant, availableOptions);\n    } else if (this.optionsType === this.optionsTypes.radio) {\n      this._switchVariantRadio(variant, availableOptions);\n    } else {\n      return;\n    }\n\n    this.$variants.val(variant.id);\n    $(window).trigger('product-variant-switch', {product, variant, firstLoad});\n  }\n\n  _switchVariantSelect(variant, availableOptions) {\n    // Iterate over each option type\n    for (let i = 0; i < this.product.options.length; i++) {\n      // Corresponding select dropdown\n      const $select = $(this.$options[i]);\n      const $optionEls = $select.find('option');\n\n      // Iterate over each option on dropdown\n      $optionEls.each((index, option) => {\n        const $option = $(option);\n        const value = option.value;\n\n        // Not an available option\n        $option\n          .prop('disabled', (!availableOptions[i][value] || !availableOptions[i][value].available))\n          .prop('selected', false);\n\n        // Dropdown option matches variant option\n        if (variant.options[i] === value) {\n          $option\n            .prop('disabled', false)\n            .prop('selected', true);\n        }\n      });\n    }\n  }\n\n  _switchVariantRadio(variant, availableOptions) {\n    this.$options\n      .attr('disabled', true)\n      .prop('checked', false)\n      .attr('data-soldout', false);\n\n    for (let i = 0; i < this.product.options.length; i++) {\n      const $options = this.$options.filter(`[name=\"${this.product.options[i]}\"]`);\n      $options.each((index, option) => {\n        const $option = $(option);\n\n        if (variant.options[i] === $option.val()) {\n          $option\n            .prop('checked', true)\n        }\n\n        if (availableOptions[i][$option.val()]) {\n          $option.attr('disabled', false);\n\n          if (!availableOptions[i][$option.val()].available) {\n            $option.attr('disabled', true);\n            $option.attr('data-soldout', true);\n          }\n        }\n      });\n    }\n  }\n\n  isDefault() {\n    if (this.product.variants[0].title === 'Default Title' && this.product.variants[0].option1 === 'Default Title') {\n      return true;\n    }\n  }\n\n  hasSingleOption() {\n    return this.optionsCount === 1;\n  }\n\n  getSelectedVariant() {\n    const options = [];\n\n    if (this.optionsType === this.optionsTypes.select) {\n      this.$options.each((i, option) => {\n        options.push(option.value);\n      });\n    } else if (this.optionsType === this.optionsTypes.radio) {\n      this.$options.filter(':checked').each((i, option) => {\n        options.push(option.value);\n      });\n    } else {\n      return;\n    }\n\n    return this.productOptions.getVariantFromOptions(options);\n  }\n\n  unload() {\n    this._unbindEvents();\n  }\n}\n","export default class Images {\n  /**\n   * Preloads an image in memory and uses the browsers cache to store it until needed.\n   *\n   * @param {Array} images - A list of image urls\n   * @param {String} size - A shopify image size attribute\n   */\n  preload(images, size) {\n    if (typeof images === 'string') {\n      images = [images];\n    }\n\n    for (let i = 0; i < images.length; i++) {\n      this.loadImage(this.getSizedImageUrl(images[i], size));\n    }\n  }\n\n  /**\n   * Loads and caches an image in the browsers cache.\n   *\n   * @param {string} path - An image url\n   */\n  loadImage(path) {\n    return new Image().src = path;\n  }\n\n  /**\n   * Adds a Shopify size attribute to a URL\n   *\n   * @param src\n   * @param size\n   * @returns {*}\n   */\n  getSizedImageUrl(src = null, size) {\n    if (!size) {\n      return null;\n    }\n\n    if (size === 'master') {\n      return this.removeProtocol(src);\n    }\n\n    const match = src.match(/\\.(jpg|jpeg|gif|png|bmp|bitmap|tiff|tif)(\\?v=\\d+)?$/i);\n\n    if (match) {\n      const prefix = src.split(match[0]);\n      const suffix = match[0];\n\n      return this.removeProtocol(`${prefix[0]}_${size}${suffix}`);\n    } else {\n      console.warn(`No ${size} found for '${src}`);\n      return null;\n    }\n  }\n\n  removeProtocol(path) {\n    return path.replace(/http(s)?:/, '');\n  }\n}\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport CurrencyConverter from 'shopify-currency-converter';\n\nimport MessageBanner from './MessageBanner';\nimport getHeaderOffset from '../helpers/getHeaderOffset';\nimport Images from '../helpers/Images';\n\nclass AddToCartFlyout {\n  constructor() {\n    this.formData = {};\n    this.settings = {};\n    this.events = [];\n    this.Images = new Images();\n    this.flyOutSelector = '[data-atc-banner]';\n    this.$atcTemplate = $(`[data-templates] ${this.flyOutSelector}`);\n\n    this._onInit = this._onInit.bind(this);\n    this._onOpen = this._onOpen.bind(this);\n    this._onClose = this._onClose.bind(this);\n    this._onError = this._onError.bind(this);\n    this._onSuccess = this._onSuccess.bind(this);\n    this._handleDocumentClick = this._handleDocumentClick.bind(this);\n\n    this.messageBanner = new MessageBanner();\n\n    this.header = document.querySelector('.site-header-wrapper');\n    this.$header = $(this.header);\n    this.$body = $(document.body);\n  }\n\n  init(formData, options, callbacks = {}) {\n    // If any FlyOuts are fully open, close them\n    this._closeFlyOuts();\n\n    this.formData = formData;\n\n    // Allows ATC Flow to be overridden\n    this.callbacks = $.extend({\n      onInit: this._onInit,\n      onClose: this._onClose,\n      onError: this._onError,\n      onOpen: this._onOpen,\n      onSuccess: this._onSuccess,\n    }, callbacks);\n\n    const $atcButton = options.$atcButton;\n\n    this.settings = $.extend({\n      moneyFormat: null\n    }, options.settings);\n\n    this.callbacks.onInit();\n\n    this._updateCart($atcButton);\n    this._disableButton($atcButton);\n  }\n\n  unload() {\n    this.messageBanner.dismissBanners();\n    this._removeFlyOuts();\n    delete this.Images;\n  }\n\n  _updateCart($atcButton) {\n    const $flyOut = this.$atcTemplate.clone();\n\n    const quantityField = this.formData.filter(data => { return data.name === 'quantity'; });\n    const quantity = quantityField[0].value;\n\n    $.ajax({\n      type: 'POST',\n      url: '/cart/add.js',\n      data: $.param(this.formData),\n      dataType: 'json',\n    })\n    .done((response) => {\n      if (response.image) {\n        const imageUrl = this.Images.getSizedImageUrl(response.image, '200x');\n        const image = this.Images.loadImage(imageUrl);\n\n        $flyOut.find('[data-atc-banner-product-image]')\n          .html(`<img src=\"${image}\" alt=\"${response.product_title}\">`);\n      }\n\n      $flyOut.find('[data-atc-banner-product-title]')\n        .text(`${response.product_title} × ${quantity}`);\n\n      /*\n        TODO: Bring in `variant.options`, iterate through to get option\n          name for: <strong>Option name:</strong> Option\n       */\n      if (response.variant_options[0] !== 'Title' && response.variant_options[0] !== 'Default Title') {\n        $flyOut.find('[data-atc-banner-product-options]')\n          .text(response.variant_options.join(', '));\n      }\n\n      /*\n        TODO: Bring in variant, and use that to check compare_at_price\n          to see if the item is on sale\n       */\n      const $productPrice = $flyOut.find('[data-atc-banner-product-price]');\n      $productPrice.text(Shopify.formatMoney(response.price, this.settings.moneyFormat));\n\n      // Update price to local currency\n      CurrencyConverter.update($productPrice[0]);\n\n      $.ajax({\n        type: 'GET',\n        url: '/cart.js',\n        dataType: 'json',\n      })\n      .done((response) => {\n        this.callbacks.onSuccess();\n\n        // Reset formData in case instance is never cleared\n        this.formData = {};\n\n        const $subTotal = $flyOut.find('[data-atc-banner-cart-subtotal]');\n        $subTotal.text(Shopify.formatMoney(response.original_total_price, this.settings.moneyFormat));\n        CurrencyConverter.update($subTotal[0]);\n\n        $flyOut\n          .find('[data-atc-banner-cart-button]')\n          .find('span').text(response.item_count);\n\n        this.$body.append($flyOut);\n\n        // Notifiy Header of new cart count\n        this.$header.trigger('cartcount:update', { response });\n\n        this._positionFlyOut($flyOut);\n        this._bindEvents($flyOut);\n        this._openFlyOut($flyOut, $atcButton);\n      });\n    })\n    .fail((response) => {\n      const responseText = JSON.parse(response.responseText);\n      const error = responseText.description;\n\n      this._enableButton($atcButton);\n      this.callbacks.onError(error);\n    });\n  }\n\n  _onError(error) {\n    this.messageBanner.message(error, 'error');\n  }\n\n  _onInit() {\n    this.messageBanner.dismissBanners();\n  }\n\n  _onOpen() {\n    /*\n      The `this.callbacks.onOpen` is used pull keyboard focus into the active flyout\n     */\n    console.warn('AddToCartFlyout onOpen callback not specified');\n  }\n\n  _onClose() {\n    /*\n      The `this.callbacks.onClose` is used to return focus to originating DOM\n     */\n\n    console.warn('AddToCartFlyout onClose callback not specified');\n  }\n\n  _onSuccess() {\n    /*\n      By default, the ATC Flyout doesn't need any additional success callbacks\n\n      The `this.callbacks.onSuccess` is used to allow other views to initiate\n      behaviour when a product has been added to the cart\n     */\n  }\n\n  _bindEvents($flyOut) {\n    this.events.push([\n      $flyOut.on('click.atc-banner', '[data-atc-banner-close]', (event) => {\n        event.preventDefault();\n        this._closeFlyOut($flyOut);\n      }),\n      this.$body.on('position-banners.atc-banner', () => {\n        this._positionFlyOut($flyOut);\n      }),\n      $(window).on('resize.atc-banner', () => {\n        debounce(this._positionFlyOut($flyOut), 250);\n      }),\n      $(window).on('scroll.atc-banner', () => {\n        this._positionFlyOut($flyOut);\n      }),\n      $(document).on('touchstart.atc-banner, click.atc-banner', this._handleDocumentClick),\n    ]);\n  }\n\n  /**\n   * Trigger any existing open FlyOuts to close\n   *\n   * @private\n   */\n  _closeFlyOuts($excludeFlyOut = null) {\n    $(this.flyOutSelector).filter('[data-flyout-active]').each((index, el) => {\n      const $flyOut = $(el);\n\n      if ($excludeFlyOut && $flyOut.is($excludeFlyOut)) {\n        return;\n      }\n\n      this._closeFlyOut($flyOut, index);\n    });\n  }\n\n  _openFlyOut($flyOut, $atcButton) {\n    /*\n     If user has initiated a new ATC Flow before the first has finished,\n     the first FlyOut could have opened after the first attempt to close open flyouts\n    */\n    this._closeFlyOuts($flyOut);\n\n    $flyOut\n      .addClass('animating animating-in')\n      .one('trend', () => {\n        $flyOut\n          .removeClass('animating animating-in')\n          .addClass('visible')\n          .off('trend');\n\n        $flyOut.attr('data-flyout-active', true);\n        this.callbacks.onOpen({\n          $container: $flyOut,\n          $elementToFocus: $flyOut.find('[data-atc-banner-cart-button]')\n        });\n\n        this._enableButton($atcButton);\n      });\n  }\n\n  /**\n   * Close an open FlyOut\n   *\n   * @param $flyOut\n   * @param index\n   * @private\n   */\n  _closeFlyOut($flyOut = null, index = 0) {\n    if (!$flyOut) {\n      return;\n    }\n\n    $flyOut\n      .addClass('animating animating-out')\n      .one('trend', () => {\n        $flyOut\n          .removeClass('animating animating-out visible')\n          .one('trend', () => {\n            $flyOut.off('trend');\n            this._removeFlyOut($flyOut, index);\n            this.callbacks.onClose();\n          });\n      });\n  }\n\n  _removeFlyOuts() {\n    $(this.flyOutSelector).filter('[data-flyout-active]').each((index, el) => {\n      this._removeFlyOut($(el), index);\n    });\n  }\n\n  /**\n   * Remove the Flyout from the DOM, and clean up listeners\n   *\n   * @param $flyOut\n   * @param index\n   * @private\n   */\n  _removeFlyOut($flyOut, index) {\n    if (this.events[index]) {\n      this.events[index].forEach($el => $el.off('.atc-banner'));\n      this.events.splice(index, 1);\n    }\n\n    if ($flyOut) {\n      $flyOut.remove();\n    }\n  }\n\n  /**\n   * Position FlyOut beneath header if its in viewport, or at top of viewport\n   *\n   * @param $flyOut\n   * @private\n   */\n  _positionFlyOut($flyOut) {\n    $flyOut.css({ top: getHeaderOffset(this.header, true) });\n  }\n\n  _disableButton($atcButton) {\n    $atcButton\n      .addClass('processing')\n      .prop('disabled', true);\n  }\n\n  _enableButton($atcButton) {\n    $atcButton\n      .prop('disabled', false)\n      .removeClass('processing');\n  }\n\n  _handleDocumentClick(event) {\n    const target = event.target;\n    const $parent = $(target).parents('[data-atc-banner]');\n\n    if ($parent.length) {\n      return;\n    }\n\n    this._closeFlyOuts();\n  }\n}\n\nexport default new AddToCartFlyout();\n","import $script from 'scriptjs';\n\nconst api = 'https://www.youtube.com/iframe_api';\nlet apiLoadedCallbacks = [];\nlet apiLoaded = false;\n\nwindow.onYouTubeIframeAPIReady = () => {\n  apiLoadedCallbacks.forEach(apiLoadedCallback => apiLoadedCallback());\n  apiLoadedCallbacks = [];\n  apiLoaded = true;\n};\n\nexport default class Youtube {\n  constructor(el) {\n    const url = el.getAttribute('data-video-url');\n    const regex = /(?:youtube\\.com\\/(?:[^\\/]+\\/.+\\/|(?:v|e(?:mbed)?)\\/|.*[?&]v=)|youtu\\.be\\/)([^\"&?\\/ ]{11})/i;\n\n    this.el = el;\n    this.id = url.match(regex)[1] || null;\n\n    this.onApiLoaded = this._onApiLoaded.bind(this);\n\n    this.isReady = false;\n    this.onReady = this._onReady.bind(this);\n    this.onReadyCallback = null;\n\n    this.onStateChange = this._onStateChange.bind(this);\n    this.onPlayCallback = null;\n\n    if (apiLoaded) {\n      this._onApiLoaded();\n    } else {\n      apiLoadedCallbacks.push(this.onApiLoaded);\n      $script(api);\n    }\n  }\n\n  play() {\n    return new Promise((resolve) => {\n      this.onPlayCallback = resolve;\n\n      if (this.isReady) {\n        this.player.playVideo();\n      } else {\n        this.onReadyCallback = () => { this.player.playVideo(); };\n      }\n    });\n  }\n\n  pause() {\n    return new Promise((resolve) => {\n      this.onPlayCallback = resolve;\n\n      if (this.isReady) {\n        this.player.pauseVideo();\n      } else {\n        this.onReadyCallback = () => { this.player.pauseVideo(); };\n      }\n    });\n  }\n\n  autoplay() {\n    return new Promise((resolve) => {\n      this.onPlayCallback = resolve;\n\n      if (this.isReady) {\n        this.player.playVideo();\n        this.player.mute();\n      } else {\n        this.onReadyCallback = () => {\n          this.player.playVideo();\n          this.player.mute();\n        };\n      }\n    });\n  }\n\n  unload() {\n    this.player.destroy();\n  }\n\n  _onApiLoaded() {\n    this.player = new YT.Player(this.el, {\n      videoId: this.id,\n      playerVars: {\n        modestbranding: true,\n        showinfo: false,\n        controls: false,\n        rel: 0,\n      },\n      events: {\n        onReady: this.onReady,\n        onStateChange: this.onStateChange,\n      },\n    });\n  }\n\n  _onReady() {\n    this.isReady = true;\n\n    if (this.onReadyCallback) {\n      this.onReadyCallback();\n    }\n  }\n\n  _onStateChange(event) {\n    const state = event.data;\n\n    if (\n      this.onPlayCallback\n      && state === YT.PlayerState.PLAYING\n    ) {\n      this.onPlayCallback();\n      this.onPlayCallback = null;\n    }\n  }\n}\n","import $script from 'scriptjs';\n\nconst api = 'https://player.vimeo.com/api/player.js';\nlet apiLoaded = false;\n\nexport default class VimeoPlayer {\n  constructor(el) {\n    const url = el.getAttribute('data-video-url');\n    const urlParts = url.split('/');\n\n    this.el = el;\n    this.id = urlParts[urlParts.length - 1];\n    this.onReadyCallback = null;\n\n    this.onApiLoaded = this._onApiLoaded.bind(this);\n\n    this.onProgress = this._onProgress.bind(this);\n    this.onProgressCallback = null;\n\n    if (apiLoaded) {\n      this._onApiLoaded();\n    } else {\n      $script(api, this.onApiLoaded);\n    }\n  }\n\n  play() {\n    return new Promise((resolve) => {\n      this.onProgressCallback = resolve;\n\n      if (apiLoaded) {\n        this.player.on('progress', this.onProgress);\n        this.player.play();\n      } else {\n        this.onReadyCallback = () => {\n          this.player.on('progress', this.onProgress);\n          this.player.play();\n        }\n      }\n    });\n  }\n\n  pause() {\n    return new Promise((resolve) => {\n      this.onProgressCallback = resolve;\n\n      if (apiLoaded) {\n        this.player.on('progress', this.onProgress);\n        this.player.pause();\n      } else {\n        this.onReadyCallback = () => {\n          this.player.on('progress', this.onProgress);\n          this.player.pause();\n        }\n      }\n    });\n  }\n\n  autoplay() {\n    return new Promise((resolve) => {\n      this.onProgressCallback = resolve;\n\n      if (apiLoaded) {\n        this.player.on('progress', this.onProgress);\n        this.player.setVolume(0);\n        this.player.play();\n      } else {\n        this.onReadyCallback = () => {\n          this.player.on('progress', this.onProgress);\n          this.player.setVolume(0);\n          this.player.play();\n        }\n      }\n    });\n  }\n\n  unload() {\n    this.player\n      .unload()\n      .catch();\n  }\n\n  _onApiLoaded() {\n    this.player = new window.Vimeo.Player(this.el, { id: this.id });\n\n    this.player\n      .ready()\n      .then()\n      .catch();\n\n    apiLoaded = true;\n\n    if (this.onReadyCallback) {\n      this.onReadyCallback();\n    }\n  }\n\n  _onProgress() {\n    this.player.off('progress', this.onProgress);\n\n    if (this.onProgressCallback) {\n      this.onProgressCallback();\n      this.onProgressCallback = null;\n    }\n  }\n}\n","import Youtube from './Youtube';\nimport Vimeo from './Vimeo';\n\nexport default class Video {\n  constructor(el, options) {\n    this.el = el;\n    this.options = options;\n    this.platform = el.getAttribute('data-video').trim();\n    this.playButton = el.querySelector('[data-video-play-button]');\n    this.videoEl = el.querySelector('[data-video-element]');\n\n    this.onPlayClick = this._onPlayClick.bind(this);\n    this.onPauseClick = this._onPauseClick.bind(this);\n    this.autoplay = this._autoplay.bind(this);\n\n    this.video = null;\n\n    switch (this.platform) {\n      case 'youtube':\n        this.video = new Youtube(this.videoEl);\n        break;\n      case 'vimeo':\n        this.video = new Vimeo(this.videoEl);\n        break;\n      default:\n        this.video = null;\n        break;\n    }\n\n    if (this.playButton) {\n      if (this.options && this.options.autoplay) {\n        this.autoplay();\n      }\n\n      this.playButton.addEventListener('click', this.onPlayClick);\n    }\n  }\n\n  _onPlayClick() {\n    this.el.classList.add('video-loading');\n\n    this.video.play()\n      .then(() => {\n        this.el.classList.add('video-transitioning');\n\n        setTimeout(() => {\n          this.el.classList.remove('video-loading');\n          this.el.classList.remove('video-transitioning');\n          this.el.classList.add('video-playing');\n        }, 200);\n      });\n  }\n\n  _onPauseClick() {\n    this.video.pause();\n  }\n\n  _autoplay() {\n    this.el.classList.add('video-loading');\n\n    this.video.autoplay()\n      .then(() => {\n        this.el.classList.add('video-transitioning');\n\n        setTimeout(() => {\n          this.el.classList.remove('video-loading');\n          this.el.classList.remove('video-transitioning');\n          this.el.classList.add('video-playing');\n        }, 200);\n      });\n  }\n\n  unload() {\n    if (this.playButton) {\n      this.playButton.removeEventListener('click', this.onPlayClick);\n    }\n\n    if (this.video) {\n      this.video.unload();\n    }\n  }\n}\n","import $ from 'jquery';\nimport Flickity from 'flickity';\nimport layout from '../Layout';\nimport scrollLeft from '../helpers/scrollLeft';\nimport Video from './Video';\n\nexport default class ProductGallery {\n  constructor(options) {\n    this.$gallery = options.$gallery;\n    this.settings = options.settings;\n\n    // Gallery\n    this.flickity = null;\n    this.slider = '[data-product-slider]';\n    this.$slider = this.$gallery.find(this.slider);\n    this.slides = '[data-product-image]';\n    this.$slides = this.$gallery.find(this.slides);\n    this.slideImages = this.$slider[0].querySelectorAll('[data-rimg]');\n    this.$sliderPagination = this.$gallery.find('[data-product-slider-pagination]');\n    this.$paginationTrigger = this.$gallery.find('[data-product-thumbnail]');\n\n    this.videos = {};\n    this.videoSlides = this.$slider[0].querySelectorAll('[data-product-image-video]');\n\n    // Re-initialise gallery when crossing breakpoints if needed\n    this._onUpdateGallery = this._onUpdateGallery.bind(this);\n    layout.onBreakpointChange(this._onUpdateGallery);\n\n    this.slideImageLoaded = this._onSlideImageLoaded.bind(this);\n    this.variantChange = this._onVariantChange.bind(this);\n\n    this._init();\n  }\n\n  unload() {\n    for (let i = 0; i < this.slideImages.length; i += 1) {\n      this.slideImages[i].removeEventListener('rimg:load', this.slideImageLoaded);\n    }\n\n    layout.offBreakpointChange(this._onUpdateGallery);\n\n    this._unloadGallery();\n  }\n\n  _init() {\n    for (let i = 0; i < this.slideImages.length; i += 1) {\n      this.slideImages[i].addEventListener('rimg:load', this.slideImageLoaded);\n    }\n\n    if (this.videoSlides.length) {\n      for (let i = 0; i < this.videoSlides.length; i += 1) {\n        const videoSlide = this.videoSlides[i];\n        const slideId = videoSlide.getAttribute('data-product-image');\n        const videoEl = videoSlide.querySelector('[data-video]');\n\n        this.videos[slideId] = new Video(videoEl);\n      }\n    }\n\n    if (this.$slides.length) {\n      this._initGallery();\n    }\n  }\n\n  /**\n   * Make sure Flickity updates viewport height when images load in\n   * @private\n   */\n  _onSlideImageLoaded() {\n    if (!this.flickity) {\n      return;\n    }\n\n    // Only resize if viewport has no height\n    // Needed to prevent multiple 'select' events\n    if (\n      this.flickity.viewport\n      && parseInt(this.flickity.viewport.style.height, 10)\n    ) {\n      return;\n    }\n\n    this.flickity.resize();\n  }\n\n  _unloadGallery() {\n    if (this.flickity) {\n      this.$paginationTrigger.off('.gallery');\n\n      this.flickity.destroy();\n      this.flickity = null;\n      this.$slider.find(this.slides).attr('style', '');\n    }\n  }\n\n  _onUpdateGallery() {\n    this._unloadGallery();\n    this._initGallery();\n  }\n\n  /**\n   * Update gallery on variant change\n   *\n   * @param variant\n   * @property {Object} options.featured_image - Featured image information\n   * @private\n   */\n  _onVariantChange(variant) {\n    if (!variant.featured_image || !this.flickity) {\n      return;\n    }\n\n    const index = this.$slider\n      .find(`[data-product-image=${variant.featured_image.id}]`)\n      .attr('data-product-image-index');\n    this.flickity.select(index, false, false);\n  }\n\n  _initGallery() {\n    const $selectedImage = this.$slider.find('.image--selected');\n\n    // Options shared on Desktop and Mobile\n    let flickityOptions = {\n      autoPlay: 0,\n      accessibility: true,\n      adaptiveHeight: true,\n      cellAlign: 'left',\n      cellSelector: this.slides,\n      pageDots: false,\n      prevNextButtons: false,\n      wrapAround: true,\n    };\n\n    // Mobile only options\n    const optionsMobile = {\n      draggable: true,\n      friction: 0.8,\n      selectedAttraction: 0.2,\n    };\n\n    // Desktop only options\n    const optionsDesktop = {\n      draggable: false,\n    };\n\n    if (layout.isBreakpoint('XS')){\n      flickityOptions = $.extend({}, optionsMobile, flickityOptions);\n    } else {\n      flickityOptions = $.extend({}, optionsDesktop, flickityOptions);\n    }\n\n    // If a variant has an image pre-selected, start the slideshow at that image\n    // If the slideshow has been re-initalised across a break point, slideshow\n    // restarts at same slide\n    if ($selectedImage.length) {\n      const initialIndex = parseInt($selectedImage.attr('data-product-image-index'), 10);\n\n      flickityOptions = $.extend({}, { initialIndex }, flickityOptions);\n    }\n\n    this.flickity = new Flickity(this.$slider[0], flickityOptions);\n    this._bindGallery();\n    this._handleGalleryVideos();\n  }\n\n  _bindGallery() {\n    this.flickity.on('select', () => {\n      this._updateActiveSlide(this.flickity.selectedIndex);\n      this._handleGalleryVideos();\n    });\n\n    this.$paginationTrigger.on('click.gallery', (event) => {\n      event.preventDefault();\n      const $target = $(event.currentTarget);\n      this.flickity.select($target.attr('data-product-thumbnail'), false, false);\n    });\n  }\n\n  /**\n   * Handle gallery videos\n   * - Pause video if is not active slide\n   * - Play video if is active slide, and is autoplay\n   *\n   * @private\n   */\n  _handleGalleryVideos() {\n    const slideId = parseInt(this.flickity.selectedElement.getAttribute('data-product-image'), 10);\n\n    Object.keys(this.videos).forEach((key) => {\n      const videoKey = parseInt(key, 10);\n\n      // Pause inactive slide videos\n      if (slideId !== videoKey) {\n        this.videos[videoKey].onPauseClick();\n      }\n\n      // Play video if is selected, and auto play enabled\n      if (slideId === videoKey && this.settings.enable_video_autoplay) {\n        this.videos[videoKey].autoplay();\n      }\n    });\n  }\n\n  /**\n   * Adds a non-flickity active class to thumbnails, and main slideshow\n   *  - Is used on re-init across breakpoints\n   *  - Is used to show the active thumbnail in the pagination\n   *\n   * @param index\n   * @private\n   */\n  _updateActiveSlide(index) {\n    const $newSlide = this.$slider.find(`[data-product-image-index=${index}]`);\n    const $newThumbnail = this.$sliderPagination.find(`[data-product-thumbnail=${index}]`);\n\n    $newSlide\n      .addClass('image--selected')\n      .siblings('.image--selected')\n      .removeClass('image--selected');\n\n    $newThumbnail\n      .addClass('thumbnail--selected')\n      .siblings('.thumbnail--selected')\n      .removeClass('thumbnail--selected');\n\n    if (layout.isBreakpoint('XS')) {\n      scrollLeft($newThumbnail);\n    }\n  }\n}\n","import $ from 'jquery';\nimport CurrencyConverter from 'shopify-currency-converter';\nimport { removeTrapFocus, trapFocus } from '../helpers/a11y';\nimport Forms from '../Forms';\nimport VariantHelper from '../VariantHelper';\nimport AddToCartFlyout from './AddToCartFlyout';\nimport ProductGallery from './ProductGallery';\n\nexport default class ProductDetails {\n  constructor(options) {\n    this.$window = $(window);\n    this.$formArea = options.$formArea;\n    this.$gallery = options.$gallery;\n    this.$details = options.$details;\n    this.context = options.context;\n    this.settings = options.settings;\n    this.product = options.product;\n    this.useHistory = options.useHistory;\n\n    this.variantHelper = null;\n\n    // Product ATC Actions\n    this._onATCOpen = this._onATCOpen.bind(this);\n    this._onATCClose = this._onATCClose.bind(this);\n\n    this.atcCallbacks = $.extend({\n      onClose: this._onATCClose,\n      onOpen: this._onATCOpen,\n    }, options.atcCallbacks);\n\n    // Form\n    this.$form = this.$formArea.find('[data-product-form] form');\n    this.$productAtcButton = this.$formArea.find('[data-product-atc]');\n    this.$productVariants = this.$form.find('[data-variants]');\n    this.$productOptions = this.$form.find('[data-product-option]');\n\n    this.variantFields = {\n      $price: this.$details.find('[data-price]'),\n      $priceMoney: this.$details.find('[data-price] .money'),\n      $compareAtPrice: this.$details.find('[data-price-compare-at]'),\n      $compareAtPriceMoney: this.$details.find('[data-price-compare-at] .money'),\n      $badge: this.$details.find('[data-badge-sales]'),\n      $badgeMoneySaved: this.$details.find('[data-price-money-saved]'),\n      $badgePercentSaved: this.$details.find('[data-price-percent-saved]'),\n    };\n\n    this.forms = new Forms(this.$form);\n    this.gallery = new ProductGallery(options);\n\n    this._bindEvents();\n    this._initOptions();\n  }\n\n  unload() {\n    this.$form.off('.product-details');\n    this.forms.unload();\n\n    if (this.variantHelper) {\n      this.variantHelper.unload();\n    }\n\n    this.gallery.unload();\n  }\n\n  _bindEvents() {\n    this.$window.on('product-variant-switch.product-details', (event, data) => this._switchVariant(event, data));\n    this.$form.on('submit.product-details', event => this._AddToCartFlyout(event));\n  }\n\n  _initOptions() {\n    if (!this.$productVariants.length) return;\n\n    this.variantHelper = new VariantHelper(\n      this.product,\n      this.$productVariants,\n      this.$productOptions,\n    );\n  }\n\n  _switchVariant(event, data) {\n    if (data.product !== this.product) return;\n\n    const variant = data.variant;\n    const firstLoad = data.firstLoad;\n\n    if (firstLoad) {\n      return;\n    }\n\n    // Update main select\n    this.$productVariants.val(data.variant.id);\n    this.gallery.variantChange(variant);\n\n    // Update Variant information\n    this._updatePrice(variant);\n    this._updateBadge(variant);\n    this._updateButton(variant);\n\n    if (this.useHistory) {\n      const url = `${ this.product.handle }?${$.param({ variant: variant.id })}`;\n      history.replaceState({}, 'variant', url);\n    }\n  }\n\n  _updatePrice(variant) {\n    // Update compare at price\n    const hasComparePrice = (\n      !!variant.compare_at_price && variant.compare_at_price > variant.price\n    );\n    this.variantFields.$compareAtPrice.toggleClass('visible', hasComparePrice);\n    this.variantFields.$compareAtPriceMoney.text(Shopify.formatMoney(variant.compare_at_price, this.settings.money_format));\n    CurrencyConverter.update(this.variantFields.$compareAtPriceMoney[0]);\n\n    // Update price\n    this.variantFields.$priceMoney.text(Shopify.formatMoney(variant.price, this.settings.money_format));\n    CurrencyConverter.update(this.variantFields.$priceMoney[0]);\n  }\n\n  _updateBadge(variant) {\n    const priceSaved = variant.compare_at_price ? variant.compare_at_price - variant.price : 0;\n    this.variantFields.$badge.toggle(!!priceSaved);\n\n    if (this.variantFields.$badgeMoneySaved.length) {\n      // Update badge if it shows money saved\n      this.variantFields.$badgeMoneySaved.text(Shopify.formatMoney(priceSaved, this.settings.money_format));\n      CurrencyConverter.update(this.variantFields.$badgeMoneySaved[0]);\n    }\n\n    if (this.variantFields.$badgePercentSaved.length) {\n      // Update badge if it shows percentiles\n      const percentileSaved = Math.round((priceSaved * 100) / variant.compare_at_price);\n      this.variantFields.$badgePercentSaved.text(percentileSaved);\n    }\n  }\n\n  _updateButton(variant) {\n    if (variant.available) {\n      this.$productAtcButton.text(this.context.product_available);\n      this.$productAtcButton\n        .removeClass('disabled')\n        .prop('disabled', false);\n    } else {\n      this.$productAtcButton.text(this.context.product_unavailable);\n      this.$productAtcButton\n        .addClass('disabled')\n        .prop('disabled', true);\n    }\n  }\n\n  _AddToCartFlyout(event) {\n    event.preventDefault();\n\n    const formData = this.$form.serializeArray();\n\n    const options = {\n      $atcButton: this.$productAtcButton,\n      settings: {\n        moneyFormat: this.settings.money_format,\n      },\n    };\n\n    AddToCartFlyout.init(formData, options, this.atcCallbacks);\n  }\n\n  /**\n   * Callback when AddToCartFlyout opens\n   * Move keyboard focus into flyout\n   *\n   * @param {object} options - Options to be used\n   * @param {jQuery} options.$container - Container to trap focus within\n   * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n   * @private\n   */\n  _onATCOpen(options) {\n    trapFocus({\n      $container: options.$container,\n      $elementToFocus: options.$elementToFocus,\n      namespace: 'product-details-flyout',\n    });\n  }\n\n  /**\n   * Callback when AddToCartFlyout closes\n   * Move keyboard focus back into grid item\n   *\n   * @private\n   */\n  _onATCClose() {\n    removeTrapFocus({\n      namespace: 'product-details-flyout',\n    });\n\n    this.$productAtcButton.focus();\n  }\n}\n","import $ from 'jquery';\nimport CurrencyConverter from 'shopify-currency-converter';\n\nimport Modal from './Modal';\nimport ProductDetails from './ProductDetails';\nimport RichText from '../components/RichText';\nimport {removeTrapFocus} from '../helpers/a11y';\n\nexport default class ProductQuickshop {\n  constructor(options) {\n    this.$el = options.$el;\n    this.$quickShop = this.$el.find('[data-product-quickshop]');\n    this.modalClass = options.modalClass;\n    this.loaded = false;\n    this.richText = null;\n    this.productDetails = null;\n    this.quickShopHTML = null;\n\n    try {\n      this.data = JSON.parse(this.$el.find('[data-product-quickshop-data]').text());\n    } catch (error) {\n      return console.warn(`Quickshop: invalid quickshop data found. ${error.message}`);\n    }\n\n    try {\n      this.quickShopHTML = JSON.parse(this.$el.find('[data-product-quickshop-html]').text());\n    } catch (error) {\n      return console.warn(`Quickshop: invalid quickshop html found. ${error.message}`);\n    }\n\n    if (!this.$quickShop[0].hasAttribute('data-loaded')) {\n      this.$quickShop.append(this.quickShopHTML);\n      this.$quickShop.attr('data-loaded', true);\n      this.$quickShop\n        .find('.money')\n        .each((index, el) => CurrencyConverter.update(el));\n      this._initSPR();\n    }\n\n    this._initialize();\n\n    if (window.Shopify && Shopify.PaymentButton) {\n      Shopify.PaymentButton.init();\n    }\n  }\n\n  _initSPR() {\n    if (!window.SPR) {\n      return;\n    }\n\n    window.SPR.registerCallbacks();\n    window.SPR.initRatingHandler();\n    window.SPR.initDomEls();\n    window.SPR.loadProducts();\n    window.SPR.loadBadges();\n  }\n\n  _initialize() {\n    this.$message = this.$el.find('[data-product-quickshop-message]');\n    this.$formArea = this.$el.find('[data-product-form-area]');\n    this.$gallery = this.$el.find('[data-product-gallery]');\n    this.$details = this.$el.find('[data-product-details]');\n    this.$description = this.$el.find('[data-product-description]');\n    this.context = this.data.context;\n    this.settings = this.data.settings;\n    this.product = this.data.product;\n\n    this._open = this._open.bind(this);\n    this._close = this._close.bind(this);\n\n    this._onATCClose = this._onATCClose.bind(this);\n    this._onATCInit = this._onATCInit.bind(this);\n    this._onATCError = this._onATCError.bind(this);\n    this._onATCSuccess = this._onATCSuccess.bind(this);\n\n    const modalCallbacks = {\n      onOpen: this._open,\n      onClose: this._close,\n    };\n\n    this.atcCallbacks = {\n      onClose: this._onATCClose,\n      onInit: this._onATCInit,\n      onError: this._onATCError,\n      onSuccess: this._onATCSuccess,\n    };\n\n    this.modal = new Modal(modalCallbacks);\n    this.modal.open(`[data-product-quickshop=\"${this.product.id}\"]`, this.modalClass);\n  }\n\n  _open() {\n    if (this.loaded) {\n      return;\n    }\n\n    if (this.$description.length) {\n      this.richText = new RichText(this.$description);\n    }\n\n    const options = {\n      $formArea: this.$formArea,\n      $gallery: this.$gallery,\n      $details: this.$details,\n      atcCallbacks: this.atcCallbacks,\n      context: this.context,\n      settings: this.settings,\n      product: this.product,\n      useHistory: false,\n    };\n\n    this.productDetails = new ProductDetails(options);\n  }\n\n  _close() {\n    if (this.productDetails) {\n      this.productDetails.unload();\n    }\n\n    if (this.richText) {\n      this.richText.unload();\n    }\n\n    this._toggleMessage('', false);\n    this.modal.unload();\n  }\n\n  _toggleMessage(message, isVisible) {\n    this.$message\n      .html(message)\n      .toggleClass('visible', isVisible);\n  }\n\n  _onATCClose() {\n    removeTrapFocus({\n      namespace: 'product-details-flyout',\n    });\n\n    this.$el.focus();\n  }\n\n  _onATCInit() {\n    this.$message.removeClass('visible');\n  }\n\n  _onATCError(error) {\n    const $content = $(`<div class=\"product-message--error\">${error}</div>`);\n    this._toggleMessage($content, true);\n  }\n\n  _onATCSuccess() {\n    this._close();\n  }\n\n  unload() {\n    this._close();\n  }\n}\n","import $ from 'jquery';\nimport $script from 'scriptjs';\nimport layout from '../Layout';\nimport ProductQuickshop from './ProductQuickshop';\n\nimport {trapFocus, removeTrapFocus} from '../helpers/a11y';\nimport AddToCartFlyout from '../components/AddToCartFlyout';\n\nexport default class ProductGridItem {\n  constructor($el) {\n    this.$el = $el;\n    this.productQuickshop = null;\n    this.quickBuySettings = null;\n    this.events = [];\n\n    this.$window = $(window);\n    this.$html = $('html');\n    this.$content = this.$el.find('[data-product-item-content]');\n    this.$actions = this.$el.find('[data-product-actions]');\n    this.hasProductActions = this.$actions.length;\n\n    this._addToCart = this._addToCart.bind(this);\n    this._actionsToggle = this._actionsToggle.bind(this);\n    this._openQuickShop = this._openQuickShop.bind(this);\n\n    this._onATCOpen = this._onATCOpen.bind(this);\n    this._onATCClose = this._onATCClose.bind(this);\n\n    if (this.hasProductActions) {\n      this._setSortByQueryParameters();\n\n      if (this.$html.hasClass('no-touch') && Shopify.queryParams.grid_list !== 'list-view') {\n        this.events.push(this.$el.on('mouseenter.product-item', this._actionsToggle));\n        this.events.push(this.$el.on('mouseleave.product-item', this._actionsToggle));\n      }\n\n      //$scripts checks existence of script in header before attempting to inject\n      $script($('[data-scripts]').data('shopify-api-url'), () => {\n        this.events.push(this.$el.on('click.product-item', '[data-quick-buy]', this._addToCart));\n        this.events.push(this.$el.on('click.product-item', '[data-quickshop-slim]', this._openQuickShop));\n        this.events.push(this.$el.on('click.product-item', '[data-quickshop-full]', this._openQuickShop));\n      });\n    }\n\n    if (this.$el.find('[data-quick-buy]').length) {\n      this._initQuickBuy();\n    }\n\n    this._objectFitPolyfill();\n  }\n\n  /**\n   * Make Shopify aware of releavent collection search info\n   *  - tag\n   *  - vendor\n   *  - pagination\n   *  - sorting criteria\n   *\n   * @private\n   */\n  _setSortByQueryParameters() {\n    Shopify.queryParams = {};\n    if (location.search.length) {\n      for (let i = 0, aCouples = location.search.substr(1).split('&'); i < aCouples.length; i++) {\n        const aKeyValue = aCouples[i].split('=');\n        // Reset the page number when we apply (i.e. don't add it to params)\n        if (aKeyValue.length > 1 && aKeyValue[0] !== 'page') {\n          Shopify.queryParams[decodeURIComponent(aKeyValue[0])] = decodeURIComponent(aKeyValue[1]);\n        }\n      }\n    }\n  }\n\n  _initQuickBuy() {\n    try {\n      this.quickBuySettings = JSON.parse(this.$el.find('[data-quick-buy-settings]').text());\n    } catch (error) {\n      return console.warn(`Quick buy: invalid QuickBuy data found. ${error.message}`);\n    }\n  }\n\n  _openQuickShop(event) {\n    event.preventDefault();\n\n    const modalClass = event.currentTarget.hasAttribute('data-quickshop-full')\n      ? 'quickshop-full'\n      : 'quickshop-slim';\n\n    if (this.productQuickshop) {\n      this.productQuickshop.unload();\n    }\n\n    this.productQuickshop = new ProductQuickshop({\n      $el: this.$el,\n      modalClass,\n    });\n  }\n\n  _isObjectFitAvailable() {\n    return 'objectFit' in document.documentElement.style;\n  }\n\n  _objectFitPolyfill() {\n    if (this._isObjectFitAvailable()) {\n      return;\n    }\n\n    const $image = $('[data-product-item-image]', this.$el);\n    const src = $('img', $image).attr('src');\n\n    $image.addClass('product-item-image-no-objectfit');\n    $image.css('background-image', `url(\"${ src }\")`);\n  }\n\n  /**\n   * Get height of element, and combined height of element + actions\n   *\n   * @returns {{heightBase, heightExpanded: *}}\n   * @private\n   */\n  _getHeights() {\n    const height = this.$el.height();\n    const actionsHeight = this.$el.find('[data-product-actions]').outerHeight(true);\n\n    return {\n      heightBase: height,\n      heightExpanded : height + actionsHeight,\n    };\n  }\n\n  _actionsToggle(event) {\n    if (!layout.isBreakpoint('L')) return;\n\n    const open = event.type === 'mouseenter';\n\n    if (open) {\n      this._showActions();\n    }\n\n    if (!open) {\n      this._hideActions();\n    }\n  }\n\n  _showActions() {\n    if (this.$el.revealer('isVisible')) {\n      return this._hideActions();\n    }\n\n    const { heightBase, heightExpanded } = this._getHeights();\n\n    // Lock heights to prevent jumping\n    this.$el.css('height', heightBase);\n    this.$content.css('height', heightBase);\n\n    // Store height for when hovering out\n    this.$el.data('base-height', heightBase);\n\n    // Start animation, and transition height to expanded height\n    this.$el\n      .revealer('show')\n      .one('revealer-animating.product-item', () => {\n        this.$content.css('height', heightExpanded);\n      });\n  }\n\n  _hideActions() {\n    const height = this.$el.data('base-height');\n\n    /*\n      - Transition buttons up, using base height for animation\n      - Remove heights after animation is complete in case of resize\n     */\n    this.$el\n      .revealer('hide')\n      .one('revealer-animating', () => {\n        this.$el.off('revealer-animating.product-item');\n        this.$el.css({ height });\n        this.$content.css({ height });\n      }).one('revealer-hide', () => {\n        this.$el\n          .off('revealer-hide.product-item')\n          .css('height', '');\n        this.$content.css('height', '');\n      });\n  }\n\n  _addToCart(event) {\n    event.preventDefault();\n    const $atcButton = $(event.currentTarget);\n    const variantID = $atcButton.attr('data-variant-id');\n\n    const formData = [\n      {\n        'name': 'id',\n        'value': variantID,\n      },\n      {\n        'name': 'quantity',\n        'value': 1,\n      },\n    ];\n\n    const options = {\n      $atcButton,\n      settings: {\n        moneyFormat: this.quickBuySettings.money_format,\n      },\n    };\n\n    const callbacks = {\n      onOpen: this._onATCOpen,\n      onClose: this._onATCClose,\n    };\n\n    AddToCartFlyout.init(formData, options, callbacks);\n  }\n\n  /**\n   * Callback when AddToCartFlyout opens\n   * Move keyboard focus into flyout\n   *\n   * @param {object} options - Options to be used\n   * @param {jQuery} options.$container - Container to trap focus within\n   * @param {jQuery} options.$elementToFocus - Element to be focused when focus leaves container\n   * @private\n   */\n  _onATCOpen(options) {\n    trapFocus({\n      $container: options.$container,\n      $elementToFocus: options.$elementToFocus,\n      namespace: 'product-item-flyout',\n    });\n  }\n\n  /**\n   * Callback when AddToCartFlyout closes\n   * Move keyboard focus back into grid item\n   *\n   * @private\n   */\n  _onATCClose() {\n    removeTrapFocus({\n      namespace: 'product-item-flyout',\n    });\n\n    this.$el.focus();\n  }\n\n  unload() {\n    this.events.forEach($el => $el.off('.product-item'));\n\n    if (this.productQuickshop) {\n      this.productQuickshop.unload();\n    }\n  }\n}\n","import $ from 'jquery';\nimport Flickity from 'flickity';\n\nexport default class RecentlyViewed {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.recentlyViewed = section.data.recently_viewed_info;\n    this.time = section.data.time;\n    this.flickity = null;\n\n    if (this.recentlyViewed && this.time) {\n      this.recentlyViewed.timestamp = Math.round((new Date()).getTime() / 1000);\n    }\n\n    if (this.time) {\n      let recentlyViewed = [];\n\n      if (JSON.parse(localStorage.getItem('recentlyViewed')) !== null) {\n        recentlyViewed = JSON.parse(localStorage.getItem('recentlyViewed'));\n\n        for (let i = recentlyViewed.length - 1; i >= 0; i--) {\n          const timeSince = this.timeSince(recentlyViewed[i].timestamp);\n\n          this.$el.find('[data-recently-viewed-container]').append(\n            `<div class=\"product-recently-viewed-card\"\n              data-recently-viewed-card\n            >\n              <div class=\"product-recently-viewed-card-time\">\n                ${timeSince}\n                <div class=\"product-recently-viewed-card-remove\"\n                  data-remove-recently-viewed=\"${recentlyViewed[i].handle}\">\n                  <svg\n                    aria-hidden=\"true\"\n                    focusable=\"false\"\n                    role=\"presentation\"\n                    width=\"10\"\n                    height=\"10\"\n                    viewBox=\"0 0 10 10\"\n                    xmlns=\"http://www.w3.org/2000/svg\"\n                  >\n                    <path d=\"M6.08785659,5 L9.77469752,1.31315906 L8.68684094,0.225302476 L5,3.91214341 L1.31315906,0.225302476 L0.225302476,1.31315906 L3.91214341,5 L0.225302476,8.68684094 L1.31315906,9.77469752 L5,6.08785659 L8.68684094,9.77469752 L9.77469752,8.68684094 L6.08785659,5 Z\"></path>\n                  </svg>\n                </div>\n              </div>\n              <a href=\"${recentlyViewed[i].link}\">\n                <div\n                  class=\"product-recently-viewed-card-image-wrapper productitem--image\"\n                  style=\"background-image: url(${recentlyViewed[i].image})\"\n                >\n                  <img class=\"product-recently-viewed-card-image\" src=\"${recentlyViewed[i].image}\">\n                </div>\n              </a>\n              <div class=\"product-recently-viewed-card-price\">\n                ${recentlyViewed[i].price}\n              </div>\n              <a\n                href=\"${recentlyViewed[i].link}\"\n                class=\"product-recently-viewed-card-title\"\n              >\n                ${recentlyViewed[i].title}\n              </a>\n            </div>`\n          )\n        }\n\n        if (this.recentlyViewed) {\n          this.removeRecentlyViewed(this.recentlyViewed.handle, recentlyViewed);\n\n          recentlyViewed.push(this.recentlyViewed);\n          localStorage.setItem('recentlyViewed', JSON.stringify(recentlyViewed));\n        }\n\n        this.$carousel = this.$el.find('.product-recently-viewed--content');\n        this.slides = '.product-recently-viewed-card';\n\n        if (this.$carousel.find(this.slides).length > 1) {\n          this._initSlider();\n        }\n      } else {\n        if (this.recentlyViewed) {\n          recentlyViewed.push(this.recentlyViewed);\n          localStorage.setItem('recentlyViewed', JSON.stringify(recentlyViewed));\n        }\n\n        this.$el.find('.product-recently-viewed--section').addClass('hide');\n      }\n    }\n\n    this.bindEvents();\n  }\n\n  bindEvents() {\n    this.$el.on('click', '[data-remove-recently-viewed]', (event) => {\n      const $target = $(event.currentTarget);\n      const handle = $target.data('remove-recently-viewed');\n      const recentlyViewed = JSON.parse(localStorage.getItem('recentlyViewed'));\n\n      this.removeRecentlyViewed(handle, recentlyViewed);\n      localStorage.setItem('recentlyViewed', JSON.stringify(recentlyViewed));\n\n      $target.parents('[data-recently-viewed-card]').addClass('hide-card');\n      $target.parents('[data-recently-viewed-card]').nextAll().addClass('move-card');\n\n      setTimeout(() => {\n        let index = $target.parents('[data-recently-viewed-card]').index();\n         if (index !== 0) {\n          index--;\n         }\n\n        $target.parents('[data-recently-viewed-card]').nextAll().removeClass('move-card');\n        this.flickity.remove($target.parents('[data-recently-viewed-card]'));\n        this.flickity.selectCell(index);\n      }, 500);\n    });\n\n    this.$el.on('click', '[data-clear-recently-viewed]', (event) => {\n      this.clearRecentlyViewed();\n    });\n  }\n\n  timeSince(timestamp) {\n    const now = Math.round((new Date()).getTime() / 1000);\n    const secondsPast = now - timestamp;\n\n    if(secondsPast < 60){\n      const secondsAgo = parseInt(secondsPast);\n\n      return secondsAgo === 1 ?\n        `${secondsAgo} ${this.time.second} ${this.time.ago}` :\n        `${secondsAgo} ${this.time.seconds} ${this.time.ago}`;\n    }\n\n    if(secondsPast < 3600){\n      const minutesAgo = parseInt(secondsPast/60);\n\n      return minutesAgo === 1 ?\n        `${minutesAgo} ${this.time.minute} ${this.time.ago}` :\n        `${minutesAgo} ${this.time.minutes} ${this.time.ago}`;\n    }\n\n    if(secondsPast <= 86400){\n      const hoursAgo = parseInt(secondsPast/3600);\n\n      return hoursAgo === 1 ?\n        `${hoursAgo} ${this.time.hour} ${this.time.ago}` :\n        `${hoursAgo} ${this.time.hours} ${this.time.ago}`;\n    }\n\n    if(secondsPast > 86400){\n      const date = new Date(timestamp);\n      const currentDate = new Date(now);\n      const day = date.getDate();\n      const month = date.toDateString().match(/ [a-zA-Z]*/)[0].replace(' ', '');\n      const year = date.getFullYear() == currentDate.getFullYear() ? '' :  `, ${date.getFullYear()}`;\n\n      return `${month} ${day} ${year}`;\n    }\n  }\n\n  removeRecentlyViewed(handle, recentlyViewed) {\n    for (let i = 0; i < recentlyViewed.length; i++) {\n      if (recentlyViewed[i].handle === handle) {\n        recentlyViewed.splice(i, 1);\n\n        if (recentlyViewed.length === 0) {\n          this.$el.find('.product-recently-viewed--section').addClass('hide');\n        }\n      }\n    }\n  }\n\n  clearRecentlyViewed() {\n    localStorage.setItem('recentlyViewed', null);\n    this.$el.find('[data-recently-viewed-card]').remove();\n    this.$el.find('.product-recently-viewed--section').addClass('hide');\n  }\n\n  _initSlider() {\n    this.flickityOptions = {\n      autoPlay: 0,\n      accessibility: true,\n      cellAlign: 'left',\n      cellSelector: this.slides,\n      groupCells: true,\n      imagesLoaded: true,\n      pageDots: false,\n      contain: true,\n      arrowShape: {\n        x0: 10,\n        x1: 60, y1: 50,\n        x2: 65, y2: 45,\n        x3: 20\n      }\n    };\n\n    this.flickity = new Flickity(this.$carousel[0], this.flickityOptions);\n\n    setTimeout(() => {\n      this.flickity.resize();\n    }, 100);\n  }\n}\n","import $ from 'jquery';\n\nexport default class SelectWidth {\n  constructor($select) {\n    this.$select = $select;\n    this.$html = $('html');\n    this.$body = $('body');\n\n    this._adjustWidth = this._adjustWidth.bind(this);\n\n    this.$select.on('change.select', this._adjustWidth);\n\n    // Update width of <select> on load\n    this._adjustWidth();\n  }\n\n  unload() {\n    this.$select.off('.select');\n  }\n\n  /**\n   * Adjust select to have width equal to its selected option\n   *\n   * @private\n   */\n  _adjustWidth() {\n    const selectedText = this.$select.find(':selected').text();\n    const $select = this.$select.parent().clone();\n\n    const additionalStyles = {\n      position: 'absolute',\n      bottom: '-100%',\n      left: '-100%',\n      display: 'inline-block',\n      visibility: 'hidden',\n    };\n\n    // Replace contents of copied <select> with selected text, and additional styles\n    $select\n      .css(additionalStyles)\n      .find('select')\n      .css('width', '') // Remove any width applied from previous with assignment\n      .html(`<option>${selectedText}</option>`);\n    this.$body.append($select);\n\n    const width = $select.outerWidth(true);\n    $select.remove();\n\n    this.$select.css({width});\n  }\n}\n","import $ from 'jquery';\nimport CurrencyConverter from 'shopify-currency-converter';\n\nimport ProductGridItem from '../components/ProductGridItem';\nimport RecentlyViewed from '../components/RecentlyViewed';\nimport SelectWidth from '../helpers/SelectWidth';\nimport Modal from '../components/Modal';\nimport layout from '../Layout';\nimport {trapFocus, removeTrapFocus} from '../helpers/a11y';\n\nexport default class StaticCollection {\n  constructor(section) {\n    this.section = section;\n    this.$el = $(section.el);\n    this.context = section.data.context;\n    this.sortWidth = null;\n    this.$focusItem = null;\n\n    this.filtersContent = '[data-productgrid-filters-content]';\n    this.sortContent = '[data-productgrid-sort-content]';\n    this.$sortTrigger = this.$el.find('[data-productgrid-trigger-sort]');\n    this.$sortTriggerButton = this.$el.find('[data-productgrid-trigger-sort-button]');\n    this.$sortTriggerModal = this.$el.find('[data-productgrid-modal-sort]');\n    this.$filtersTrigger = this.$el.find('[data-productgrid-trigger-filters]');\n    this.$allTags = this.$el.find(`${this.filtersContent} .filter-item a:not([data-filter-toggle])`);\n    this.$advandedTags = this.$el.find('[data-tag-advanced] a');\n    this.$additionalTags = this.$el.find('[data-filter-toggle]');\n    this.$gridViewToggle = this.$el.find('[data-collection-grid-view]');\n    this.$listViewToggle = this.$el.find('[data-collection-list-view]');\n    this.$gridContainer = this.$el.find('.productgrid--outer');\n\n    this._changeSorting = this._changeSorting.bind(this);\n    this._changeSortingButton = this._changeSortingButton.bind(this);\n    this._showSortModal = this._showSortModal.bind(this);\n    this._showFiltersModal = this._showFiltersModal.bind(this);\n    this._activateTag = this._activateTag.bind(this);\n    this._advancedTags = this._advancedTags.bind(this);\n    this._toggleTags = this._toggleTags.bind(this);\n\n    this._onModalOpen = this._onModalOpen.bind(this);\n    this._onModalClose = this._onModalClose.bind(this);\n\n    this._toggleListView = this._toggleListView.bind(this);\n    this._toggleGridView = this._toggleGridView.bind(this);\n    this._checkListView = this._checkListView.bind(this);\n\n    const modalCallbacks = {\n      onOpen: this._onModalOpen,\n      onClose: this._onModalClose,\n    };\n\n    this.events = [\n      this.$sortTrigger.on('change.collection', this._changeSorting),\n      this.$sortTriggerButton.on('click.collection', this._changeSortingButton),\n      this.$sortTriggerModal.on('click.collection', this._showSortModal),\n      this.$filtersTrigger.on('click.collection', this._showFiltersModal),\n      this.$advandedTags.on('click.collection', this._advancedTags),\n      this.$allTags.on('click.collection', this._activateTag),\n      this.$additionalTags.on('click.collection', this._toggleTags),\n      this.$gridViewToggle.on('click.collection', this._toggleGridView),\n      this.$listViewToggle.on('click.collection', this._toggleListView)\n    ];\n\n    // Product items\n    this.productItems = [];\n    const $productItems = this.$el.find('[data-product-item]');\n\n    $productItems.each((i, productItem) => {\n      this.productItems.push(new ProductGridItem($(productItem)));\n    });\n\n    if (this.$sortTrigger.length) {\n      this.sortWidth = new SelectWidth(this.$sortTrigger);\n    }\n\n    this._setSortByQueryParameters();\n    this._updatePrices();\n    this.modal = new Modal(modalCallbacks);\n\n    new RecentlyViewed(section);\n  }\n\n  onSectionUnload() {\n    this.events.forEach($el => $el.off('.collection'));\n    this.modal.unload();\n\n    if (this.sortWidth) {\n      this.sortWidth.unload();\n    }\n\n    this.productItems.forEach((productItem) => {\n      productItem.unload();\n    });\n  }\n\n  /**\n   * Set product grid prices to match CurrencyConverter settings on page load, section re-load\n   *\n   * @private\n   */\n  _updatePrices() {\n    this.$el.find('.money').each((index, el) => CurrencyConverter.update(el));\n  }\n\n  /**\n   * Open Tags/Filters modal (on mobile)\n   *\n   * @param event\n   * @private\n   */\n  _showFiltersModal(event) {\n    event.preventDefault();\n\n    this.$focusItem = $(event.currentTarget);\n    this.modal.open(this.filtersContent, 'productgrid-filters');\n  }\n\n  /**\n   * Open Sort by modal (on mobile)\n   *\n   * @param event\n   * @private\n   */\n  _showSortModal(event) {\n    event.preventDefault();\n\n    this.$focusItem = $(event.currentTarget);\n    this.modal.open(this.sortContent, 'productgrid-sort');\n  }\n\n  /**\n   * Style a tag as active after click, before page transition\n   *\n   * @param event\n   * @private\n   */\n  _activateTag(event) {\n    $(event.currentTarget).addClass('filter-link--active');\n  }\n\n  /**\n   * Used by advanced tags to concatenate tag searches\n   *\n   * @param event\n   * @private\n   */\n  _advancedTags(event) {\n    const $target = $(event.currentTarget).parent();\n    const tagGroup = $target.attr('data-group');\n    const $activeGroup = $(`.filter-item--active[data-group=\"${tagGroup}\"]`);\n\n    if (!$target.hasClass('filter-item--active') && $activeGroup.length) {\n      const tagHandle = $target.attr('data-handle');\n\n      event.preventDefault();\n      $target.siblings().removeClass('filter-item--active');\n\n      location.href = location.href\n        // swap tag\n        .replace($activeGroup.attr('data-handle'), tagHandle)\n        // go back to page 1\n        .replace(/(&page=\\d+)|(page=\\d+&)|(\\?page=\\d+$)/, '');\n    }\n  }\n\n  /**\n   * Expand / Collapse additional tags in the sidebar\n   *\n   * @param event\n   * @private\n   */\n  _toggleTags(event) {\n    event.preventDefault();\n\n    const $trigger = $(event.currentTarget);\n    const $items = $trigger.parent().siblings('[data-hidden-default]');\n    const siblingsVisible = $trigger.data('filter-toggle');\n\n    $items.toggleClass('filter-item--hidden', siblingsVisible);\n    $trigger\n      .data('filter-toggle', !siblingsVisible)\n      .text(!siblingsVisible ? this.context.see_less : this.context.see_more);\n\n    if (this.modal.isOpen()) {\n      this.modal.position();\n    }\n  }\n\n  /**\n   * Make Shopify aware of releavent collection search info\n   *  - tag\n   *  - vendor\n   *  - pagination\n   *  - sorting criteria\n   *\n   * @private\n   */\n  _setSortByQueryParameters() {\n    Shopify.queryParams = {};\n    if (location.search.length) {\n      for (let i = 0, aCouples = location.search.substr(1).split('&'); i < aCouples.length; i++) {\n        const aKeyValue = aCouples[i].split('=');\n        // Reset the page number when we apply (i.e. don't add it to params)\n        if (aKeyValue.length > 1 && aKeyValue[0] !== 'page') {\n          Shopify.queryParams[decodeURIComponent(aKeyValue[0])] = decodeURIComponent(aKeyValue[1]);\n        }\n      }\n    }\n\n    this._checkListView();\n  }\n\n  /**\n   * Sort by opens a modal on mobile, this handles button events\n   *\n   * @param event\n   * @private\n   */\n  _changeSortingButton(event) {\n    const activeClass = 'utils-sortby--modal-button--active';\n\n    $(event.currentTarget)\n      .addClass(activeClass)\n      .parent()\n      .siblings()\n      .find(`.${activeClass}`)\n      .removeClass(activeClass);\n\n    this._changeSorting(event);\n  }\n\n  /**\n   * Change sorting of collection\n   *\n   * @param event\n   * @private\n   */\n  _changeSorting(event) {\n    event.preventDefault();\n    const $target = $(event.currentTarget);\n\n    Shopify.queryParams.sort_by = $target.val();\n    location.search = jQuery.param(Shopify.queryParams).replace(/\\+/g, '%20');\n  }\n\n  /**\n   * When a modal is open, move focus into the modal for a11y\n   *\n   * @private\n   */\n  _onModalOpen() {\n    trapFocus({\n      $container: this.modal.$modal,\n      namespace: 'productgrid-modal',\n    });\n  }\n\n  /**\n   * Return focus to last used button (if found) on modal close\n   *\n   * @private\n   */\n  _onModalClose() {\n    removeTrapFocus({\n      $container: this.modal.$modal,\n      namespace: 'productgrid-modal',\n    });\n\n    if (this.$focusItem) {\n      this.$focusItem.focus();\n      this.$focusItem = null;\n    }\n  }\n\n  /**\n   * Toggle grid view\n   *\n   */\n  _toggleGridView(event) {\n    Shopify.queryParams.grid_list = 'grid-view';\n    location.search = jQuery.param(Shopify.queryParams).replace(/\\+/g, '%20');\n  }\n\n  /**\n   * Toggle list view\n   *\n   */\n  _toggleListView(event) {\n    Shopify.queryParams.grid_list = 'list-view';\n    location.search = jQuery.param(Shopify.queryParams).replace(/\\+/g, '%20');\n  }\n\n  /**\n   * Check grid/list view toggle query parameters\n   *\n   */\n  _checkListView() {\n    if (Shopify.queryParams.grid_list === 'list-view') {\n      this.$el.find('[href*=\"&grid_list\"]').attr('href', function(i, href) {\n        if (href.indexOf('?') === -1) {\n          href = href.replace('&', '?');\n        }\n\n        return href.replace('grid_list', 'grid_list=list-view');\n      });\n\n      this.$el.find('.utils-viewtoggle-button').removeClass('active');\n      this.$listViewToggle.addClass('active');\n      this.$gridContainer.addClass('productgrid-listview');\n    } else {\n      this.$el.find('[href*=\"&grid_list\"]').attr('href', function(i, href) {\n        if (href.indexOf('?') === -1) {\n          href = href.replace('&', '?');\n        }\n\n        return href.replace('grid_list', 'grid_list=grid-view');\n      });\n    }\n  }\n}\n","import $ from 'jquery';\nimport $script from 'scriptjs';\n\nexport default class StaticGiftcard {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.$qrCode = this.$el.find('[data-giftcard-qr]');\n    this.$giftCardCode = this.$el.find('[data-giftcard-code]');\n\n    $script($('[data-scripts]').data('shopify-qrcode'), () => {\n      this.QRCode = new QRCode(this.$qrCode[0], {\n        text: this.$qrCode.attr('data-giftcard-qr'),\n        width: 120,\n        height: 120\n      });\n    });\n\n    this._bindEvents();\n  }\n\n  _bindEvents() {\n    this.$el.on('click', '[data-giftcard-print]', () => {\n      window.print();\n    });\n\n    // Auto-select gift card code on click, based on ID passed to the function\n    this.$el.on('click', '[data-giftcard-code]', () => {\n      this._selectText();\n    });\n  }\n\n  _selectText() {\n    const text = this.$giftCardCode[0];\n    let range = '';\n\n    if (document.body.createTextRange) { // ms method\n      range = document.body.createTextRange();\n      range.moveToElementText(text);\n      range.select();\n    } else if (window.getSelection) { // moz, opera, webkit method\n      var selection = window.getSelection();\n      range = document.createRange();\n      range.selectNodeContents(text);\n      selection.removeAllRanges();\n      selection.addRange(range);\n    }\n  }\n}\n","import $ from 'jquery';\n\nimport Modal from '../components/Modal';\nimport Forms from '../Forms';\n\nexport default class StaticPassword {\n  constructor(section) {\n    this.$el = $(section.el);\n\n    this.modalForms = null;\n    this.newsletterForm = null;\n    this.modalContents = '[data-passwordentry]';\n    this.$newsletterForm = this.$el.find('[data-password-newsletter]');\n\n    this.modalOpen = this.onModalOpen.bind(this);\n    this.modalClose = this.onModalClose.bind(this);\n    this._openModal = this._openModal.bind(this);\n\n    this.modal = new Modal({\n      onOpen: this.modalOpen,\n      onClose: this.modalClose,\n    });\n\n    if (this.$newsletterForm) {\n      this.newsletterForm = new Forms(this.$newsletterForm);\n    }\n\n    this._checkForPasswordAttempt();\n    this._bindEvents();\n  }\n\n  onSectionUnload() {\n    this.$el.off('.static-password');\n\n    if (this.newsletterForm) {\n      this.newsletterForm.unload();\n    }\n\n    if (this.modalForms) {\n      this.modalForms.unload();\n    }\n  }\n\n  onModalOpen() {\n    const $contents = $('[data-passwordentry-contents]');\n    this.modalForms = new Forms($contents);\n  }\n\n  onModalClose() {\n    this.modalForms.unload();\n    this.modalForms = null;\n  }\n\n  _bindEvents() {\n    this.$el.on('click.static-password', '[data-passwordentry-toggle]', this._openModal);\n  }\n\n  _openModal() {\n    this.modal.open(this.modalContents, 'passwordentry');\n  }\n\n  _checkForPasswordAttempt() {\n    if (!$('[data-passwordentry-errors]').length) {\n      return;\n    }\n\n    this._openModal();\n  }\n}\n","import debounce from 'just-debounce';\nimport Flickity from 'flickity';\n\nimport layout from '../Layout';\n\nexport default class ProductRowScroller {\n  constructor(productRow) {\n    this.$window = $(window);\n    this.flickity = null;\n    this.productRow = productRow;\n    this.$productRow = $(this.productRow);\n\n    // Activate flickity on mobile\n    this._mobileSlider = this._mobileSlider.bind(this);\n    layout.onBreakpointChange(this._mobileSlider);\n\n    this._mobileSlider();\n  }\n\n  unload() {\n    layout.offBreakpointChange(this._mobileSlider);\n    this._destroyFlickity();\n  }\n\n  _initFlickity() {\n    this.flickity = new Flickity(this.productRow, {\n      cellSelector: '.productgrid--item',\n      contain: true,\n      freeScroll: true,\n      percentPosition: false,\n      prevNextButtons: false,\n      pageDots: false,\n      setGallerySize: false,\n    });\n\n    this._bindSlider();\n  }\n\n  _destroyFlickity() {\n    if (!this.flickity) {\n      return;\n    }\n\n    this.$window.off('.product-row');\n    this.$productRow.off('.product-row');\n\n    this.flickity.destroy();\n    this.flickity = null;\n  }\n\n  _mobileSlider() {\n    // If is Large layout, attempt to destroy flickity\n    if (layout.isBreakpoint('L')) {\n      this._destroyFlickity();\n      return;\n    }\n\n    // Is XS/S/M, and flickity is init'd -- do nothing\n    if (this.flickity) {\n      return;\n    }\n\n    // Is XS/S/M, and flickity is not init'd\n    this._initFlickity();\n  }\n\n  _bindSlider() {\n    const $slider = this.$productRow.find('.flickity-slider');\n\n    this.$window.on('resize.product-row', debounce(() => {\n      this.$productRow.trigger('heightUpdate.product-row');\n    }));\n\n    this.flickity.on('cellSelect', () => {\n      this.$productRow.trigger('heightUpdate.product-row');\n    });\n\n    this.$productRow.on('heightUpdate.product-row', () => {\n      if (!this.flickity) {\n        return;\n      }\n\n      $slider.height(Math.ceil(this.flickity.maxCellHeight));\n    });\n\n    // Sets the Slider to the height of the first slide\n    this.$productRow.trigger('heightUpdate.product-row');\n  }\n}\n","import $ from 'jquery';\nimport $script from 'scriptjs';\nimport CurrencyConverter from 'shopify-currency-converter';\nimport layout from '../Layout';\nimport Forms from '../Forms';\n\nimport RichText from '../components/RichText';\nimport ProductDetails from '../components/ProductDetails';\nimport ProductGridItem from '../components/ProductGridItem';\nimport ProductRowScroller from '../components/ProductRowScroller';\nimport RecentlyViewed from '../components/RecentlyViewed';\n\nexport default class StaticProduct {\n  constructor(section) {\n    this.postMessage = section.postMessage;\n    this.context = section.data.context;\n    this.settings = section.data.settings;\n    this.product = section.data.product;\n    this.richText = null;\n    this.reviewForm = null;\n    this.flickity = null;\n    this.flickityOptions = null;\n\n    this.$el = $(section.el);\n    this.$product = this.$el.find('[data-product-wrapper]');\n\n    if (this.settings) {\n      this.isThreeColumn = this.settings.layout === 'layout--three-col';\n    }\n\n    // History\n    this.isThemeEditor = window.Shopify && window.Shopify.designMode;\n    this.useHistory = !this.isThemeEditor && history.replaceState;\n\n    this.$gallery = this.$product.find('[data-product-gallery]');\n\n    // Product details\n    this.$details = this.$product.find('[data-product-details]');\n\n    // Product description\n    this.$description = this.$product.find('[data-product-description]');\n\n    // Product form containers\n    this.$formRegular = this.$product.find('[data-product-form-regular]');\n    this.$formAlt = this.$product.find('[data-product-form-alt]');\n\n    // Product form area\n    this.$formArea = this.$product.find('[data-product-form-area]');\n\n    // Move product form and information on breakpoint change\n    this.layoutHandler = this.onBreakpointChange.bind(this);\n    layout.onBreakpointChange(this.layoutHandler);\n\n    // Related Products\n    this.$relatedProducts = this.$el.find('[data-related-products]');\n    this.relatedProducts = [];\n    this.relatedProductsScroller = null;\n\n    // Product reviews\n    this.$productReviews = this.$el.find('[data-product-reviews]');\n\n    this._moveForm();\n\n    if (this.$description.length) {\n      this.richText = new RichText(this.$description);\n    }\n\n    if (this.$relatedProducts.length) {\n      this.relatedProductsScroller = new ProductRowScroller(section.el.querySelector('[data-product-row]'));\n\n      this.$relatedProducts.find('[data-product-item]').each((i, productItem) => {\n        new ProductGridItem($(productItem));\n      });\n\n      /* If related products are disabled/enabled with while in the TE,\n       * they'll have shop.currency as the monetary value. This updates it to\n       * the active currency\n       */\n      this.$relatedProducts.find('.money').each((index, el) => CurrencyConverter.update(el));\n    }\n\n    if (this.$productReviews.length) {\n      this.reviewForm = new Forms(this.$productReviews, '.spr-form-input');\n    }\n\n    // Instantiate ProductDetails after Shopify API is loaded\n    $script($('[data-scripts]').data('shopify-api-url'), () => {\n      const options = {\n        $formArea: this.$formArea,\n        $gallery: this.$gallery,\n        $details: this.$details,\n        context: this.context,\n        settings: this.settings,\n        product: this.product,\n        useHistory: this.useHistory,\n      };\n\n      this.productDetails = new ProductDetails(options);\n    });\n\n    this.recentlyViewed = new RecentlyViewed(section);\n  }\n\n  onSectionUnload() {\n    layout.offBreakpointChange(this.layoutHandler);\n    this.productDetails.unload();\n\n    if (this.richText) {\n      this.richText.unload();\n    }\n\n    if (this.relatedProductsScroller) {\n      this.relatedProductsScroller.unload();\n    }\n\n    this.relatedProducts.forEach((productItem) => {\n      productItem.unload();\n    });\n\n    if (this.reviewForm) {\n      this.reviewForm.unload();\n    }\n  }\n\n  onBreakpointChange() {\n    this._moveForm();\n  }\n\n  /**\n   * Move product form if is a three column layout\n   * @private\n   */\n  _moveForm() {\n    if (!this.isThreeColumn) return;\n\n    if (layout.isBreakpoint('L')) {\n      if (!$.contains(this.$formAlt[0], this.$formArea[0])) {\n        const $form = this.$formArea.detach();\n        this.$formAlt.append($form);\n      }\n    } else {\n      if (!$.contains(this.$formRegular[0], this.$formArea[0])) {\n        const $form = this.$formArea.detach();\n        this.$formRegular.append($form);\n      }\n    }\n  }\n}\n","import $ from 'jquery';\nimport CurrencyConverter from 'shopify-currency-converter';\n\nimport ProductGridItem from '../components/ProductGridItem';\nimport Modal from '../components/Modal';\nimport SearchForm from '../components/SearchForm';\n\nexport default class StaticSearch {\n  constructor(section) {\n    this.section = section;\n    this.$el = $(section.el);\n    this.$searchField = this.$el.find('[data-live-search]');\n    this.modal = new Modal();\n\n    // Product items\n    this.productItems = [];\n    const $productItems = this.$el.find('[data-product-item]');\n\n    $productItems.each((i, productItem) => {\n      this.productItems.push(new ProductGridItem($(productItem)));\n    });\n\n    this._updatePrices();\n    this.searchForm = new SearchForm(this.$searchField);\n  }\n\n  onSectionUnload() {\n    this.modal.unload();\n    this.searchForm.unload();\n\n    this.productItems.forEach((productItem) => {\n      productItem.unload();\n    });\n  }\n\n  _updatePrices() {\n    this.$el.find('.money').each((index, el) => CurrencyConverter.update(el));\n  }\n}\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport Flickity from 'flickity';\n\nimport layout from '../Layout';\n\nexport default class DynamicTwitterFeed {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.$window = $(window);\n    this.flickity = null;\n\n    this.$blogPosts = this.$el.find('[data-blog-posts]');\n\n    // Activate flickity on mobile\n    this._mobileSlider = this._mobileSlider.bind(this);\n    layout.onBreakpointChange(this._mobileSlider);\n    this._mobileSlider();\n  }\n\n  /**\n   * Unbind events when section is re-drawn\n   */\n  onSectionUnload() {\n    layout.offBreakpointChange(this._mobileSlider);\n    this._destroyFlickity();\n  }\n\n  _initFlickity() {\n    this.flickity = new Flickity(this.$blogPosts[0], {\n      cellSelector: '.article--excerpt-wrapper',\n      contain: true,\n      freeScroll: true,\n      percentPosition: false,\n      prevNextButtons: false,\n      pageDots: false,\n      setGallerySize: false,\n    });\n\n    this._bindSlider();\n  }\n\n  _destroyFlickity() {\n    if (!this.flickity) {\n      return;\n    }\n\n    this.$window.off('.blog-posts');\n    this.$blogPosts.off('.blog-posts');\n    this.flickity.destroy();\n    this.flickity = null;\n  }\n\n  _mobileSlider() {\n    // If is Large layout, attempt to destroy flickity\n    if (layout.isBreakpoint('L')) {\n      this._destroyFlickity();\n      return;\n    }\n\n    // Is XS/S/M, and flickity is init'd -- do nothing\n    if (this.flickity) {\n      return;\n    }\n\n    // Is XS/S/M, and flickity is not init'd\n    this._initFlickity();\n  }\n\n  _bindSlider() {\n    const $slider = this.$blogPosts.find('.flickity-slider');\n\n    this.$window.on('resize.blog-posts', debounce(() => {\n      this.$blogPosts.trigger('heightUpdate.blog-posts');\n    }));\n\n    this.flickity.on('cellSelect', () => {\n      this.$blogPosts.trigger('heightUpdate.blog-posts');\n    });\n\n    this.$blogPosts.on('heightUpdate.blog-posts', () => {\n      if (!this.flickity) {\n        return;\n      }\n\n      $slider.height(Math.ceil(this.flickity.maxCellHeight));\n    });\n\n    // Sets the Slider to the height of the first slide\n    this.$blogPosts.trigger('heightUpdate.blog-posts');\n  }\n}\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport Flickity from 'flickity';\nimport layout from '../Layout';\n\nexport default class StaticHighlightsBanners {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.$window = $(window);\n\n    this.$carousel = this.$el.find('.highlights-banners');\n    this.slides = '.highlights-banners-block';\n\n    this.flickity = null;\n    this.flickityOptions = null;\n\n    if (this.$carousel.find(this.slides).length > 1) {\n      this._initSlider();\n    }\n  }\n\n  _initSlider() {\n    this.flickityOptions = {\n      autoPlay: 0,\n      accessibility: true,\n      cellAlign: 'left',\n      cellSelector: this.slides,\n      imagesLoaded: false,\n      pageDots: false,\n      prevNextButtons: false,\n      setGallerySize: false,\n      contain: true\n    };\n\n    this._bindFlickity();\n  }\n\n  onSectionUnload() {\n    this._destroyFlickity();\n    this.$window.off('.twitter');\n  }\n\n  _bindFlickity() {\n    if (layout.isBreakpoint('L') === false && this.flickity === null) {\n      this.flickity = new Flickity(this.$carousel[0], this.flickityOptions);\n    }\n\n    this.$window.on('resize', debounce(() => {\n      if (layout.isBreakpoint('L') === false && this.flickity === null) {\n        this._bindFlickity();\n      } else if (layout.isBreakpoint('L') && this.flickity) {\n        this._destroyFlickity();\n      }\n    }));\n  }\n\n  _destroyFlickity() {\n    if (!this.flickity) {\n      return;\n    }\n\n    this.flickity.destroy();\n    this.flickity = null;\n  }\n}\n","import Flickity from 'flickity';\nimport layout from '../Layout';\nimport getHeaderOffset from '../helpers/getHeaderOffset';\n\nexport default class StaticSlideshow {\n  constructor(section) {\n    this.el = section.el;\n    this.settings = section.data;\n\n    this.carousel = this.el.querySelector('.slideshow');\n    this.slides = '.slideshow-slide';\n    this.container = this.el.querySelector('.slideshow-height-fullscreen')\n    this.isFullscreen = !!this.container;\n    this.selectBlockOnLoad = true;\n    this.continueAutoplay = true;\n    this.stopAutoplay = false;\n    this.autoplayTimeout = 0;\n\n    this.flickity = null;\n    this.flickityOptions = null;\n\n    if (this.carousel && this.carousel.querySelectorAll(this.slides).length > 1) {\n      this._initSlider();\n    }\n  }\n\n  _initSlider() {\n    this.flickityOptions = {\n      autoPlay: this.settings.enable_autoplay ? this.settings.autoplay_duration * 1000 : false,\n      setGallerySize: !this.isFullscreen,\n      pauseAutoPlayOnHover: false,\n      accessibility: true,\n      adaptiveHeight: true,\n      cellAlign: 'left',\n      cellSelector: this.slides,\n      imagesLoaded: true,\n      contain: true,\n      wrapAround: true,\n      arrowShape: {\n        x0: 10,\n        x1: 60, y1: 50,\n        x2: 65, y2: 45,\n        x3: 20\n      }\n    };\n\n    this._bindFlickity();\n  }\n\n  _bindEvents() {\n    this._slideshowHeight();\n    this._positionDots();\n    this._changeArrrowColors();\n\n    window.addEventListener('resize', () => {\n      this._slideshowHeight();\n      this._positionDots();\n      this._changeArrrowColors();\n    });\n\n    this.flickity.on('select', () => {\n      this._slideshowHeight();\n      this._positionDots();\n      this._changeArrrowColors();\n\n      this.selectBlockOnLoad = false;\n\n      if (this.settings.enable_autoplay && !this.stopAutoplay) {\n        this.flickity.pausePlayer();\n\n        if (this.continueAutoplay) {\n          this.autoplayTimeout = 0;\n        } else {\n          this.autoplayTimeout = 10000;\n        }\n\n        this.continueAutoplay = true;\n\n        setTimeout(() => {\n          this.flickity.playPlayer();\n        }, this.autoplayTimeout);\n      }\n    });\n\n    this.flickity.on('dragStart', () => {\n      this.continueAutoplay = false;\n    });\n  }\n\n  _positionDots() {\n    const pageDots = this.el.querySelector('.flickity-page-dots');\n\n    if (layout.isBreakpoint('XS') && !this.isFullscreen) {\n      const height = this.flickity.selectedElement.querySelector('.slideshow-background').offsetHeight;\n      const gutterContent = 5;\n\n      pageDots.style.top = `${height + gutterContent}px`;\n    } else {\n      pageDots.style.top = 'auto';\n    }\n  }\n\n  _changeArrrowColors() {\n    let currentColor = this.flickity.selectedElement.querySelector('.slideshow-background').dataset;\n    const dots = this.el.querySelectorAll('.flickity-page-dots .dot');\n\n    if (layout.isBreakpoint('XS') && !this.isFullscreen) {\n      currentColor = currentColor.themecolor;\n    } else {\n      currentColor = currentColor.slidecolor;\n    }\n\n    this.el.querySelector('.flickity-prev-next-button.previous svg').style.fill = currentColor;\n    this.el.querySelector('.flickity-prev-next-button.next svg').style.fill = currentColor;\n\n    for (let i = 0; i < dots.length; i++) {\n      dots[i].style.background = currentColor;\n    }\n  }\n\n  _slideshowHeight() {\n    const headerHeight = getHeaderOffset(document.querySelector('.site-header-wrapper'));\n\n    if (this.isFullscreen) {\n      this.el.querySelector('.flickity-viewport').style.height = `calc(100vh - ${headerHeight}px)`;\n      this.container.style.height = `calc(100vh - ${headerHeight}px)`;\n    }\n  }\n\n  onSectionUnload() {\n    this._destroyFlickity();\n  }\n\n  _bindFlickity() {\n    this.flickity = new Flickity(this.carousel, this.flickityOptions);\n    this._bindEvents();\n  }\n\n  _destroyFlickity() {\n    if (!this.flickity) {\n      return;\n    }\n\n    this.flickity.destroy();\n  }\n\n  onSectionBlockSelect(block) {\n    setTimeout(() => {\n      this.flickity.resize();\n    }, 100);\n\n    if (this.settings.enable_autoplay) {\n      const $slides = $(this.slides);\n      const $slide = $(block.el);\n      const slideIndex = $slides.index($slide);\n\n      this.stopAutoplay = true;\n      this.flickity.pausePlayer();\n\n      if (!$slide.hasClass('is-selected') && !this.selectBlockOnLoad) {\n        this.flickity.select(slideIndex, false, false);\n      } else if (this.selectBlockOnLoad) {\n        this.flickity.select(slideIndex, false, true);\n      }\n    }\n  }\n\n  onSectionBlockDeselect() {\n    if (this.settings.enable_autoplay) {\n      this.stopAutoplay = false;\n      this.flickity.playPlayer();\n    }\n  }\n}\n","import $ from 'jquery';\nimport layout from '../Layout';\n\nexport default class DynamicPromoBlocks {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.content = '[data-promo-block-content]';\n    this.expandedClass = 'promo-block--expanded';\n    this.compressBlocks = section.data.compress_blocks;\n\n    // Revert navigation to original state on breakpoint change\n    this.layoutHandler = this.onBreakpointChange.bind(this);\n    layout.onBreakpointChange(this.layoutHandler);\n\n    this._blockInteraction = this._blockInteraction.bind(this);\n\n    this.$el.on('click.promo-block', this.content, this._blockInteraction);\n  }\n\n  /**\n   * Remove block's toggled state and attributes when leaving mobile\n   */\n  onBreakpointChange() {\n    if (!layout.isBreakpoint('XS')) {\n      this.$el.find(`.${this.expandedClass}`).each((i, content) => {\n        this._collapse(content);\n      });\n    }\n  }\n\n  /**\n   * Unbind events when section is re-drawn\n   */\n  onSectionUnload() {\n    this.$el.off('.promo-block');\n    layout.offBreakpointChange(this.layoutHandler);\n  }\n\n  /**\n   * Callback to open block on mobile from the TE\n   *\n   * @param block\n   */\n  onSectionBlockSelect(block) {\n    if (!layout.isBreakpoint('XS')) return;\n\n    this._expand(block.el.querySelector(this.content));\n  }\n\n  /**\n   * Callback to close block on mobile from the TE\n   *\n   * @param block\n   */\n  onSectionBlockDeselect(block) {\n    if (!layout.isBreakpoint('XS')) return;\n\n    this._collapse(block.el.querySelector(this.content));\n  }\n\n  /**\n   * Expand a block on first click, then allow it to behave as normal\n   *\n   * @param event\n   * @private\n   */\n  _blockInteraction(event) {\n    const content = event.currentTarget;\n    const clicked = content.getAttribute('data-clicked');\n\n    // On second click, or on desktop, don't interfere with block\n    if (clicked || !layout.isBreakpoint('XS') || !this.compressBlocks) {\n      return;\n    }\n\n    event.preventDefault();\n    content.setAttribute('data-clicked', 'clicked');\n\n    this._expand(content);\n  }\n\n  /**\n   * Expand promo block\n   *\n   * @param content\n   * @private\n   */\n  _expand(content) {\n    if (!this.compressBlocks) {\n      return;\n    }\n\n    const $content = $(content);\n\n    $content\n      .addClass('animating animating-in')\n      .one('trend', () => {\n        $content\n          .removeClass('animating animating-in')\n          .addClass(this.expandedClass)\n          .off('trend');\n      });\n  }\n\n  /**\n   * Collapse a block\n   *\n   * @param content\n   * @private\n   */\n  _collapse(content) {\n    if (!this.compressBlocks) {\n      return;\n    }\n\n    const $content = $(content);\n\n    $content\n      .addClass('animating animating-out')\n      .one('trend', () => {\n        $content\n          .removeClass(`animating animating-out ${this.expandedClass}`)\n          .off('trend');\n        content.removeAttribute('data-clicked');\n      });\n  }\n}\n","import $ from 'jquery';\n\nimport Accordion from '../Accordion';\nimport layout from '../Layout';\n\nexport default class DynamicMenuList {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.context = section.data.context;\n    this.Accordion = new Accordion(this.$el);\n\n    // Handle Accordion interaction when window size changes\n    this.layoutHandler = this.onBreakpointChange.bind(this);\n    layout.onBreakpointChange(this.layoutHandler);\n\n    this._bindEvents();\n  }\n\n  _bindEvents() {\n    this.$el.on('click.menu-list', '[data-accordion-trigger]', event => {\n      event.preventDefault();\n      this._toggleAccordion($(event.currentTarget).parent());\n    });\n\n    this.$el.on('click.menu-list', '[data-menulist-toggle]', event => {\n      event.preventDefault();\n      this._toggleList(event.currentTarget);\n    });\n  }\n\n  onSectionUnload() {\n    this.$el.off('.menu-list');\n\n    delete this.Accordion;\n  }\n\n  onSectionBlockSelect(block) {\n    this._toggleAccordion($(block.el), true);\n  }\n\n  onSectionBlockDeselect(block) {\n    this._toggleAccordion($(block.el), false);\n  }\n\n  _toggleAccordion($block) {\n    if (layout.isBreakpoint('L')) return;\n\n    this.Accordion.toggle($block);\n  }\n\n  _toggleList(el) {\n    const $trigger = $(el);\n    const $items = $trigger.parent().siblings('[data-hidden-default]');\n    const siblingsVisible = $trigger.data('menulist-toggle');\n\n    $items.toggleClass('menulist--menu-item-hidden', siblingsVisible);\n    $trigger\n      .data('menulist-toggle', !siblingsVisible)\n      .text(!siblingsVisible ? this.context.see_less : this.context.see_more);\n  }\n\n  onBreakpointChange(event, breakpoints) {\n    if (layout.isBreakpoint('L')) {\n      this.Accordion.openAll();\n    } else if (breakpoints.previous === 'L' && !layout.isBreakpoint('L')) {\n      this.Accordion.closeOpen();\n    }\n  }\n}\n","/*********************************************************************\n*  #### Twitter Post Fetcher v17.0.3 ####\n*  Coded by Jason Mayes 2015. A present to all the developers out there.\n*  www.jasonmayes.com\n*  Please keep this disclaimer with my code if you use it. Thanks. :-)\n*  Got feedback or questions, ask here:\n*  http://www.jasonmayes.com/projects/twitterApi/\n*  Github: https://github.com/jasonmayes/Twitter-Post-Fetcher\n*  Updates will be posted to this site.\n*********************************************************************/\n(function(root,factory){if(typeof define==='function'&&define.amd){define([],factory);}else if(typeof exports==='object'){module.exports=factory();}else{factory();}}(this,function(){var domNode='';var maxTweets=20;var parseLinks=true;var queue=[];var inProgress=false;var printTime=true;var printUser=true;var formatterFunction=null;var supportsClassName=true;var showRts=true;var customCallbackFunction=null;var showInteractionLinks=true;var showImages=false;var useEmoji=false;var targetBlank=true;var lang='en';var permalinks=true;var dataOnly=false;var script=null;var scriptAdded=false;function handleTweets(tweets){if(customCallbackFunction===null){var x=tweets.length;var n=0;var element=document.getElementById(domNode);var html='<ul>';while(n<x){html+='<li>'+tweets[n]+'</li>';n++;}\nhtml+='</ul>';element.innerHTML=html;}else{customCallbackFunction(tweets);}}\nfunction strip(data){return data.replace(/<b[^>]*>(.*?)<\\/b>/gi,function(a,s){return s;}).replace(/class=\"(?!(tco-hidden|tco-display|tco-ellipsis))+.*?\"|data-query-source=\".*?\"|dir=\".*?\"|rel=\".*?\"/gi,'');}\nfunction targetLinksToNewWindow(el){var links=el.getElementsByTagName('a');for(var i=links.length-1;i>=0;i--){links[i].setAttribute('target','_blank');}}\nfunction getElementsByClassName(node,classname){var a=[];var regex=new RegExp('(^| )'+classname+'( |$)');var elems=node.getElementsByTagName('*');for(var i=0,j=elems.length;i<j;i++){if(regex.test(elems[i].className)){a.push(elems[i]);}}\nreturn a;}\nfunction extractImageUrl(image_data){if(image_data!==undefined&&image_data.innerHTML.indexOf('data-image')>=0){var data_src=image_data.innerHTML.match(/data-image=\\\"([A-z0-9]+:\\/\\/[A-z0-9]+\\.[A-z0-9]+\\.[A-z0-9]+\\/[A-z0-9]+\\/[A-z0-9\\-]+)/i)[1];return decodeURIComponent(data_src)+'.jpg';}}\nvar twitterFetcher={fetch:function(config){if(config.maxTweets===undefined){config.maxTweets=20;}\nif(config.enableLinks===undefined){config.enableLinks=true;}\nif(config.showUser===undefined){config.showUser=true;}\nif(config.showTime===undefined){config.showTime=true;}\nif(config.dateFunction===undefined){config.dateFunction='default';}\nif(config.showRetweet===undefined){config.showRetweet=true;}\nif(config.customCallback===undefined){config.customCallback=null;}\nif(config.showInteraction===undefined){config.showInteraction=true;}\nif(config.showImages===undefined){config.showImages=false;}\nif(config.useEmoji===undefined){config.useEmoji=false;}\nif(config.linksInNewWindow===undefined){config.linksInNewWindow=true;}\nif(config.showPermalinks===undefined){config.showPermalinks=true;}\nif(config.dataOnly===undefined){config.dataOnly=false;}\nif(inProgress){queue.push(config);}else{inProgress=true;domNode=config.domId;maxTweets=config.maxTweets;parseLinks=config.enableLinks;printUser=config.showUser;printTime=config.showTime;showRts=config.showRetweet;formatterFunction=config.dateFunction;customCallbackFunction=config.customCallback;showInteractionLinks=config.showInteraction;showImages=config.showImages;useEmoji=config.useEmoji;targetBlank=config.linksInNewWindow;permalinks=config.showPermalinks;dataOnly=config.dataOnly;var head=document.getElementsByTagName('head')[0];if(script!==null){head.removeChild(script);}\nscript=document.createElement('script');script.type='text/javascript';if(config.list!==undefined){script.src='https://syndication.twitter.com/timeline/list?'+'callback=__twttrf.callback&dnt=false&list_slug='+\nconfig.list.listSlug+'&screen_name='+config.list.screenName+'&suppress_response_codes=true&lang='+(config.lang||lang)+'&rnd='+Math.random();}else if(config.profile!==undefined){script.src='https://syndication.twitter.com/timeline/profile?'+'callback=__twttrf.callback&dnt=false'+'&screen_name='+config.profile.screenName+'&suppress_response_codes=true&lang='+(config.lang||lang)+'&rnd='+Math.random();}else if(config.likes!==undefined){script.src='https://syndication.twitter.com/timeline/likes?'+'callback=__twttrf.callback&dnt=false'+'&screen_name='+config.likes.screenName+'&suppress_response_codes=true&lang='+(config.lang||lang)+'&rnd='+Math.random();}else{script.src='https://cdn.syndication.twimg.com/widgets/timelines/'+\nconfig.id+'?&lang='+(config.lang||lang)+'&callback=__twttrf.callback&'+'suppress_response_codes=true&rnd='+Math.random();}\nhead.appendChild(script);}},callback:function(data){if(data===undefined||data.body===undefined){inProgress=false;if(queue.length>0){twitterFetcher.fetch(queue[0]);queue.splice(0,1);}\nreturn;}\nif(!useEmoji){data.body=data.body.replace(/(<img[^c]*class=\"Emoji[^>]*>)|(<img[^c]*class=\"u-block[^>]*>)/g,'');}\nif(!showImages){data.body=data.body.replace(/(<img[^c]*class=\"NaturalImage-image[^>]*>|(<img[^c]*class=\"CroppedImage-image[^>]*>))/g,'');}\nif(!printUser){data.body=data.body.replace(/(<img[^c]*class=\"Avatar\"[^>]*>)/g,'');}\nvar div=document.createElement('div');div.innerHTML=data.body;if(typeof(div.getElementsByClassName)==='undefined'){supportsClassName=false;}\nfunction swapDataSrc(element){var avatarImg=element.getElementsByTagName('img')[0];if(avatarImg && avatarImg.length){avatarImg.src=avatarImg.getAttribute('data-src-2x');}return element;}\nvar tweets=[];var authors=[];var times=[];var images=[];var rts=[];var tids=[];var permalinksURL=[];var x=0;if(supportsClassName){var tmp=div.getElementsByClassName('timeline-Tweet');while(x<tmp.length){if(tmp[x].getElementsByClassName('timeline-Tweet-retweetCredit').length>0){rts.push(true);}else{rts.push(false);}\nif(!rts[x]||rts[x]&&showRts){tweets.push(tmp[x].getElementsByClassName('timeline-Tweet-text')[0]);tids.push(tmp[x].getAttribute('data-tweet-id'));if(printUser){authors.push(swapDataSrc(tmp[x].getElementsByClassName('timeline-Tweet-author')[0]));}\ntimes.push(tmp[x].getElementsByClassName('dt-updated')[0]);permalinksURL.push(tmp[x].getElementsByClassName('timeline-Tweet-timestamp')[0]);if(tmp[x].getElementsByClassName('timeline-Tweet-media')[0]!==undefined){images.push(tmp[x].getElementsByClassName('timeline-Tweet-media')[0]);}else{images.push(undefined);}}\nx++;}}else{var tmp=getElementsByClassName(div,'timeline-Tweet');while(x<tmp.length){if(getElementsByClassName(tmp[x],'timeline-Tweet-retweetCredit').length>0){rts.push(true);}else{rts.push(false);}\nif(!rts[x]||rts[x]&&showRts){tweets.push(getElementsByClassName(tmp[x],'timeline-Tweet-text')[0]);tids.push(tmp[x].getAttribute('data-tweet-id'));if(printUser){authors.push(swapDataSrc(getElementsByClassName(tmp[x],'timeline-Tweet-author')[0]));}\ntimes.push(getElementsByClassName(tmp[x],'dt-updated')[0]);permalinksURL.push(getElementsByClassName(tmp[x],'timeline-Tweet-timestamp')[0]);if(getElementsByClassName(tmp[x],'timeline-Tweet-media')[0]!==undefined){images.push(getElementsByClassName(tmp[x],'timeline-Tweet-media')[0]);}else{images.push(undefined);}}\nx++;}}\nif(tweets.length>maxTweets){tweets.splice(maxTweets,(tweets.length-maxTweets));authors.splice(maxTweets,(authors.length-maxTweets));times.splice(maxTweets,(times.length-maxTweets));rts.splice(maxTweets,(rts.length-maxTweets));images.splice(maxTweets,(images.length-maxTweets));permalinksURL.splice(maxTweets,(permalinksURL.length-maxTweets));}\nvar arrayTweets=[];var x=tweets.length;var n=0;if(dataOnly){while(n<x){arrayTweets.push({tweet:tweets[n].innerHTML,author:authors[n]?authors[n].innerHTML:'Unknown Author',author_data:{profile_url:authors[n]?authors[n].querySelector('[data-scribe=\"element:user_link\"]').href:null,profile_image:authors[n]?authors[n].querySelector('[data-scribe=\"element:avatar\"]').getAttribute('data-src-1x'):null,profile_image_2x:authors[n]?authors[n].querySelector('[data-scribe=\"element:avatar\"]').getAttribute('data-src-2x'):null,screen_name:authors[n]?authors[n].querySelector('[data-scribe=\"element:screen_name\"]').title:null,name:authors[n]?authors[n].querySelector('[data-scribe=\"element:name\"]').title:null},time:times[n].textContent,timestamp:times[n].getAttribute('datetime').replace('+0000','Z').replace(/([\\+\\-])(\\d\\d)(\\d\\d)/,'$1$2:$3'),image:extractImageUrl(images[n]),rt:rts[n],tid:tids[n],permalinkURL:(permalinksURL[n]===undefined)?'':permalinksURL[n].href});n++;}}else{while(n<x){if(typeof(formatterFunction)!=='string'){var datetimeText=times[n].getAttribute('datetime');var newDate=new Date(times[n].getAttribute('datetime').replace(/-/g,'/').replace('T',' ').split('+')[0]);var dateString=formatterFunction(newDate,datetimeText);times[n].setAttribute('aria-label',dateString);if(tweets[n].textContent){if(supportsClassName){times[n].textContent=dateString;}else{var h=document.createElement('p');var t=document.createTextNode(dateString);h.appendChild(t);h.setAttribute('aria-label',dateString);times[n]=h;}}else{times[n].textContent=dateString;}}\nvar op='';if(parseLinks){if(targetBlank){targetLinksToNewWindow(tweets[n]);if(printUser){targetLinksToNewWindow(authors[n]);}}\nif(printUser){op+='<div class=\"user\">'+strip(authors[n].innerHTML)+'</div>';}\nop+='<p class=\"tweet\">'+strip(tweets[n].innerHTML)+'</p>';if(printTime){if(permalinks){op+='<p class=\"timePosted\"><a href=\"'+permalinksURL[n]+'\">'+times[n].getAttribute('aria-label')+'</a></p>';}else{op+='<p class=\"timePosted\">'+\ntimes[n].getAttribute('aria-label')+'</p>';}}}else{if(tweets[n].textContent){if(printUser){op+='<p class=\"user\">'+authors[n].textContent+'</p>';}\nop+='<p class=\"tweet\">'+tweets[n].textContent+'</p>';if(printTime){op+='<p class=\"timePosted\">'+times[n].textContent+'</p>';}}else{if(printUser){op+='<p class=\"user\">'+authors[n].textContent+'</p>';}\nop+='<p class=\"tweet\">'+tweets[n].textContent+'</p>';if(printTime){op+='<p class=\"timePosted\">'+times[n].textContent+'</p>';}}}\nif(showInteractionLinks){op+='<p class=\"interact\"><a href=\"https://twitter.com/intent/'+'tweet?in_reply_to='+tids[n]+'\" class=\"twitter_reply_icon\"'+\n(targetBlank?' target=\"_blank\">':'>')+'Reply</a><a href=\"https://twitter.com/intent/retweet?'+'tweet_id='+tids[n]+'\" class=\"twitter_retweet_icon\"'+\n(targetBlank?' target=\"_blank\">':'>')+'Retweet</a>'+'<a href=\"https://twitter.com/intent/favorite?tweet_id='+\ntids[n]+'\" class=\"twitter_fav_icon\"'+\n(targetBlank?' target=\"_blank\">':'>')+'Favorite</a></p>';}\nif(showImages&&images[n]!==undefined&&extractImageUrl(images[n])!==undefined){op+='<div class=\"media\">'+'<img src=\"'+extractImageUrl(images[n])+'\" alt=\"Image from tweet\" />'+'</div>';}\nif(showImages){arrayTweets.push(op);}else if(!showImages&&tweets[n].textContent.length){arrayTweets.push(op);}\nn++;}}\nhandleTweets(arrayTweets);inProgress=false;if(queue.length>0){twitterFetcher.fetch(queue[0]);queue.splice(0,1);}}};window.__twttrf=twitterFetcher;window.twitterFetcher=twitterFetcher;return twitterFetcher;}));\n","import $ from 'jquery';\nimport twitterFetcher from 'twitter-fetcher';\nimport debounce from 'just-debounce';\nimport Flickity from 'flickity';\nimport rimg from 'rimg-shopify';\n\nimport layout from '../Layout';\n\nexport default class DynamicTwitterFeed {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.settings = section.data;\n    this.$window = $(window);\n    this.isIE9 = $('body').hasClass('ie9');\n    this.flickity = null;\n\n    this.$content = this.$el.find('[data-twitter-content]');\n    this.$wrapper = this.$el.find('[data-twitter-wrapper]');\n    this.$tweets = this.$el.find('[data-tweet-content]');\n\n    rimg.instance.track(this.$wrapper[0]);\n\n    this.$wrapper.on('rimg:enter', event => {\n      this._load();\n    });\n  }\n\n  _load() {\n    this.$template = $(this.settings.template);\n\n    const onboarding = this.settings.onboarding;\n    const username = this.settings.username;\n    const retweets = this.settings.retweets;\n    const images = this.settings.images;\n    const locale = this.settings.locale || 'en';\n\n    // Activate flickity on mobile\n    this._mobileSlider = this._mobileSlider.bind(this);\n    layout.onBreakpointChange(this._mobileSlider);\n    this._mobileSlider();\n\n    this._evenHeights = this._evenHeights.bind(this);\n    this._evenHeights();\n\n    if (onboarding || !username) {\n      return;\n    }\n\n    this.$window.on('resize.twitter', debounce(() => this._evenHeights, 16, true, true));\n\n    twitterFetcher.fetch({\n      'profile': { 'screenName': username },\n      'maxTweets': 3,\n      'enableLinks': true,\n      'showUser': true,\n      'showTime': true,\n      'dataOnly': false,\n      'useEmoji': true,\n      'showImages': images,\n      'showRetweet': retweets,\n      'lang': locale,\n      'customCallback': (tweets) => this._renderTweets(tweets),\n      'showInteraction': false,\n    });\n  }\n\n  /**\n   * Unbind events when section is re-drawn\n   */\n  onSectionUnload() {\n    rimg.instance.untrack(this.$wrapper[0]);\n    this.$window.off('.twitter');\n    this.$content.off('.twitter');\n\n    layout.offBreakpointChange(this._mobileSlider);\n    this._destroyFlickity();\n  }\n\n  /**\n   * Evens the height of the twitter blocks if the browser doesn't support Flexbox\n   * @private\n   */\n  _evenHeights() {\n    if (!this.isIE9) {\n      return;\n    }\n\n    const heights = [];\n    this.$tweets.height('');\n\n    this.$tweets.each((i, el) => {\n      const $el = $(el);\n      heights.push($el.outerHeight());\n    });\n\n    this.$tweets.height(Math.ceil(Math.max.apply(null, heights)));\n  }\n\n  _initFlickity() {\n    this.flickity = new Flickity(this.$content[0], {\n      cellSelector: '[data-tweet-content]',\n      contain: true,\n      freeScroll: true,\n      percentPosition: false,\n      prevNextButtons: false,\n      pageDots: false,\n      setGallerySize: false,\n    });\n\n    this._bindSlider();\n  }\n\n  _destroyFlickity() {\n    if (!this.flickity) {\n      return;\n    }\n\n    this.flickity.destroy();\n    this.flickity = null;\n  }\n\n  _mobileSlider() {\n    // If is Large layout, attempt to destroy flickity\n    if (layout.isBreakpoint('L')) {\n      this._destroyFlickity();\n      return;\n    }\n\n    // Is XS/S/M, and flickity is init'd -- do nothing\n    if (this.flickity) {\n      return;\n    }\n\n    // Is XS/S/M, and flickity is not init'd\n    this._initFlickity();\n  }\n\n  _bindSlider() {\n    const $slider = this.$content.find('.flickity-slider');\n\n    this.$window.on('resize.twitter', debounce(() => {\n      this.$content.trigger('heightUpdate.twitter');\n    }));\n\n    this.flickity.on('cellSelect', () => {\n      this.$content.trigger('heightUpdate.twitter');\n    });\n\n    this.$content.on('heightUpdate.twitter', () => {\n      if (!this.flickity) {\n        return;\n      }\n\n      $slider.height(Math.ceil(this.flickity.maxCellHeight));\n    });\n\n    // Sets the Slider to the height of the first slide\n    this.$content.trigger('heightUpdate.twitter');\n  }\n\n  /**\n   * Retrieve information about user who tweeted\n   *\n   * @param el\n   * @returns {{$avatar: *, link: *, name, screenName}}\n   * @private\n   */\n  _extractAuthor(el) {\n    const $el = $(el);\n\n    const link = $el.find('a').attr('href');\n    const name = $el.find('[data-scribe=\"element:name\"]').text();\n    const screenName = $el.find('[data-scribe=\"element:screen_name\"]').text();\n    const $avatar = $el.find('img');\n\n    return { $avatar, link, name, screenName };\n  }\n\n  /**\n   * Retrieve link to tweet, and when it was tweeted\n   *\n   * @param el\n   * @returns {{link: *, postedAt: *}}\n   * @private\n   */\n  _extractMeta(el) {\n    const $el = $(el);\n\n    const link = $el.find('a').attr('href');\n    const postedAt = $el.text();\n\n    return { link, postedAt };\n  }\n\n  _extractWrapperClass() {\n    const wrapperClass = this.$wrapper.attr('class').match(/tweet--count-\\d+$/);\n\n    if (wrapperClass) {\n      return wrapperClass[0];\n    } else {\n      return '';\n    }\n  }\n\n  _renderTweets(tweets) {\n    const tweetsLength = tweets.length;\n\n    if (!tweets || !tweetsLength) return;\n\n    const tweetsArray = [];\n    const wrapperClass = `tweet--count-${tweetsLength}`;\n\n    tweets.forEach((tweet) => {\n      const $tweet = $(tweet);\n\n      const $template = this.$template.clone();\n      const authorInfo = this._extractAuthor($tweet[0]);\n      const meta = this._extractMeta($tweet[2]);\n\n      const content = $tweet[1];\n\n      // Render header\n      $template\n        .find('.tweet--header')\n        .attr('href', authorInfo.link);\n\n      $template\n        .find('.tweet--header-image')\n        .html(authorInfo.$avatar);\n\n      $template\n        .find('.tweet--header-name')\n        .text(authorInfo.name);\n\n      $template\n        .find('.tweet--header-screenname')\n        .text(authorInfo.screenName);\n\n      // Render content\n      $template\n        .find('.tweet--content')\n        .append($tweet[3] ? $tweet[3] : null)\n        .append(content);\n\n      // Render footer\n      $template\n        .find('.tweet--footer')\n        .attr('href', meta.link)\n        .find('.tweet--footer--posted')\n        .text(meta.postedAt);\n\n      tweetsArray.push($template);\n    });\n\n    this.$wrapper.css('min-height', this.$wrapper.height());\n\n    this.$tweets.fadeOut().promise().then(() => {\n      this._destroyFlickity();\n      this.$tweets.remove();\n\n      this.$content.append(tweetsArray);\n\n      this.$wrapper\n        .removeClass(this._extractWrapperClass())\n        .addClass(wrapperClass)\n        .css('min-height', '');\n\n      this.$tweets = this.$el.find('[data-tweet-content]');\n\n      this._evenHeights();\n      this._mobileSlider();\n    });\n  }\n}\n","import $ from 'jquery';\nimport debounce from 'just-debounce';\nimport Flickity from 'flickity';\nimport layout from '../Layout';\nimport rimg from 'rimg-shopify';\n\nexport default class DynamicInstagramFeed {\n  constructor(section) {\n    this.settings = section.data;\n    this.onboarding = this.settings.onboarding;\n    this.photoCount = this.settings.photo_count;\n    this.accessToken = this.settings.access_token;\n\n    this.$el = $(section.el);\n    this.$window = $(window);\n    this.$photoContainer = this.$el.find('[data-instagram-content]');\n    this.$photoContainerPlaceholder = this.$el.find('[data-instagram-photo-placeholder]');\n\n    this.$photoTemplate = $('<figure class=\"instagram--photo\" data-instagram-photo />');\n\n    rimg.instance.track(this.$photoContainer[0]);\n\n    this.$photoContainer.on('rimg:enter', event => {\n      this._load();\n    });\n  }\n\n  _load() {\n    // Activate flickity on mobile\n    this._mobileSlider = this._mobileSlider.bind(this);\n    layout.onBreakpointChange(this._mobileSlider);\n    this._mobileSlider();\n\n    if (this.onboarding || !this.accessToken) {\n      return;\n    }\n\n    this._getPhotos()\n      .done((photos) => this._renderPhotos(photos))\n      .fail((error) => {\n        console.warn(`Instagram: ${error}`);\n      });\n  }\n\n  _getPhotos() {\n    const url = `https://api.instagram.com/v1/users/self/media/recent?access_token=${this.accessToken}&count=${this.photoCount}&callback=`;\n    const photoPromise = $.ajax(url, {\n      dataType: 'jsonp',\n    });\n\n    return photoPromise.then((response) => {\n      if (response.meta.code !== 200) {\n        const error = `${response.meta.error_message} (${response.meta.error_type})`;\n        return $.Deferred().reject(error).promise();\n      }\n\n      return response.data;\n    });\n  }\n\n  _renderPhotos(photos) {\n    const photoArray = [];\n\n    photos.forEach((photo) => {\n      const $template = this.$photoTemplate.clone();\n      const lowResolution = photo.images.low_resolution;\n      const standardResolution = photo.images.standard_resolution;\n\n      const $link = $(`<a target=\"_blank\" href=\"${photo.link}\"></a>`);\n      const $photo = $(`<img src=\"${lowResolution.url}\">`);\n\n      if (standardResolution.width >= (lowResolution.width * 2)) {\n        $photo.attr('srcset', `${standardResolution.url} 2x`);\n      } else {\n        $photo.attr('src', `${standardResolution.url}`);\n      }\n\n      $link.append($photo);\n      $template.append($link);\n\n      photoArray.push($template);\n    });\n\n    this.$photoContainerPlaceholder.fadeOut(() => {\n      this._destroyFlickity();\n      this.$photoContainer.append(photoArray);\n      this.$photoContainerPlaceholder.remove();\n      this._mobileSlider();\n    });\n  }\n\n\n  _initFlickity() {\n    this.flickity = new Flickity(this.$photoContainer[0], {\n      cellSelector: '.instagram--photo',\n      contain: true,\n      freeScroll: true,\n      percentPosition: false,\n      prevNextButtons: false,\n      pageDots: false,\n      setGallerySize: false,\n    });\n\n    this._bindSlider();\n  }\n\n  _destroyFlickity() {\n    if (!this.flickity) {\n      return;\n    }\n\n    this.$window.off('.instagram-feed');\n    this.$photoContainer.off('.instagram-feed');\n    this.flickity.destroy();\n    this.flickity = null;\n  }\n\n  _mobileSlider() {\n    // If is Large layout, attempt to destroy flickity\n    if (layout.isBreakpoint('L') || layout.isBreakpoint('M')) {\n      this._destroyFlickity();\n      return;\n    }\n\n    // Is XS/S/M, and flickity is init'd -- do nothing\n    if (this.flickity) {\n      return;\n    }\n\n    // Is XS/S/M, and flickity is not init'd\n    this._initFlickity();\n  }\n\n  _bindSlider() {\n    const $slider = this.$photoContainer.find('.flickity-slider');\n\n    this.$window.on('resize.instagram-feed', debounce(() => {\n      this.$photoContainer.trigger('heightUpdate.instagram-feed');\n    }));\n\n    this.flickity.on('cellSelect', () => {\n      this.$photoContainer.trigger('heightUpdate.instagram-feed');\n    });\n\n    this.$photoContainer.on('heightUpdate.instagram-feed', () => {\n      if (!this.flickity) {\n        return;\n      }\n\n      $slider.height(Math.ceil(this.flickity.maxCellHeight));\n    });\n\n    // Sets the Slider to the height of the first slide\n    this.$photoContainer.trigger('heightUpdate.instagram-feed');\n  }\n\n  onSectionUnload() {\n    rimg.instance.untrack(this.$photoContainer[0]);\n  }\n}\n","import $ from 'jquery';\nimport CurrencyConverter from 'shopify-currency-converter';\nimport ProductGridItem from '../components/ProductGridItem';\nimport ProductRowScroller from '../components/ProductRowScroller';\n\nexport default class DynamicFeaturedCollection {\n  constructor(section) {\n    this.section = section;\n    this.$el = $(section.el);\n\n    // Product items\n    this.productItems = [];\n    const $productItems = this.$el.find('[data-product-item]');\n\n    $productItems.each((i, productItem) => {\n      this.productItems.push(new ProductGridItem($(productItem)));\n    });\n\n    this.ProductRowScroller = new ProductRowScroller(section.el.querySelector('[data-product-row]'));\n\n    this._updatePrices();\n  }\n\n  _updatePrices() {\n    this.$el.find('.money').each((index, el) => CurrencyConverter.update(el));\n  }\n\n  onSectionUnload() {\n    this.productItems.forEach((productItem) => {\n      productItem.unload();\n    });\n\n    this.ProductRowScroller.unload();\n  }\n}\n","import $ from 'jquery';\nimport $script from 'scriptjs';\n\nimport Forms from '../Forms';\nimport HeaderSearch from '../components/HeaderSearch';\nimport SearchForm from '../components/SearchForm';\n\nexport default class StaticSectionHeader {\n  constructor(section) {\n    this.$el = $(section.el);\n    this.settings = section.data.settings;\n    this.headerSearch = null;\n\n    this.$scripts = $('[data-scripts]');\n\n    this.$searchField = this.$el.find('[data-live-search]');\n\n    this.forms = new Forms(this.$el);\n\n    if (this.settings.live_search.enable) {\n      $script(this.$scripts.data('shopify-api-url'), () => {\n        this.headerSearch = new HeaderSearch({\n          $el: this.$searchField,\n          $header: this.$el,\n        }, this.settings.live_search);\n      });\n    } else {\n      this.headerSearch = new SearchForm(this.$searchField);\n    }\n  }\n\n  onSectionUnload() {\n    this.headerSearch.unload();\n    this.forms.unload();\n  }\n}\n","import $ from 'jquery';\nimport RichText from '../components/RichText';\n\nexport default class DynamicTwitterFeed {\n  constructor(section) {\n    this.$el = $(section.el);\n\n    this.rte = [];\n    this.$el.find('[data-rte]').each((i, el) => {\n      this.rte.push(new RichText($(el)));\n    });\n  }\n\n  /**\n   * Unbind events when section is re-drawn\n   */\n  onSectionUnload() {\n    this.rte.forEach((richTextArea) => {\n      richTextArea.unload();\n    });\n  }\n}\n","import Video from '../components/Video';\n\nexport default class DynamicVideo {\n  constructor(section) {\n    const videoEl = section.el.querySelector('[data-video]');\n    this.$el = section.el;\n\n    this.autoplay = section.data.autoplay;\n    this.hasPlayed = false;\n\n    if (videoEl) {\n      this.video = new Video(videoEl);\n      this.bindEvents();\n    }\n  }\n\n  bindEvents() {\n    window.addEventListener('scroll', () => {\n      if (this.autoplay) {\n        var rect = this.$el.getBoundingClientRect();\n\n        if (rect.top >= 0 || rect.bottom <= (window.innerHeight || document.documentElement.clientHeight)) {\n          if (!this.hasPlayed) {\n            this.video._autoplay();\n            this.hasPlayed = true;\n          }\n        } else {\n          this.video._onPauseClick();\n        }\n      }\n    });\n  }\n\n  onSectionUnload() {\n    if (this.video) {\n      this.video.unload();\n    }\n  }\n}\n","import $ from 'jquery';\n\nimport Forms from '../Forms';\n\nexport default class DynamicNewsletter {\n  constructor(section) {\n    this.$el = $(section.el);\n\n    this.forms = new Forms(this.$el);\n  }\n\n  onSectionUnload() {\n    this.forms.unload();\n  }\n}\n","\n/*!\n * pxs-map v2.0.0\n * (c) 2018 undefined\n */\n\nimport $ from 'jquery';\n\nvar justDebounce = debounce;\n\nfunction debounce(fn, delay, at_start, guarantee) {\n  var timeout;\n  var args;\n  var self;\n\n  return function debounced() {\n    self = this;\n    args = Array.prototype.slice.call(arguments);\n\n    if (timeout && (at_start || guarantee)) {\n      return;\n    } else if (!at_start) {\n      clear();\n\n      timeout = setTimeout(run, delay);\n      return timeout;\n    }\n\n    timeout = setTimeout(clear, delay);\n    fn.apply(self, args);\n\n    function run() {\n      clear();\n      fn.apply(self, args);\n    }\n\n    function clear() {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n}\n\nvar classCallCheck = function (instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n};\n\nvar createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];\n      descriptor.enumerable = descriptor.enumerable || false;\n      descriptor.configurable = true;\n      if (\"value\" in descriptor) descriptor.writable = true;\n      Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }\n\n  return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);\n    if (staticProps) defineProperties(Constructor, staticProps);\n    return Constructor;\n  };\n}();\n\nvar PxsMap = function () {\n  function PxsMap(section) {\n    var _this = this;\n\n    classCallCheck(this, PxsMap);\n\n    this.$el = $('[data-map]', section.el);\n    this.settings = section.data;\n    this.map = null;\n    this.center = null;\n\n    this.$container = $('[data-map-container]', this.$el);\n\n    // Scale so range is 12 ~ 17, rather than 1 to 6\n    this.zoom = 11 + parseInt(this.settings.zoom, 10);\n    if (isNaN(this.zoom)) this.zoom = 13;\n\n    this.colors = null;\n\n    if (this.settings.colors) {\n      this.colors = this.settings.colors;\n    }\n\n    this.resize = this.resize.bind(this);\n\n    this.address = this.settings.address;\n    this.apiKey = this.settings.api_key;\n\n    if (this.apiKey) {\n      if (window.googleMaps === undefined) {\n        window.googleMaps = true;\n\n        $.getScript('https://maps.googleapis.com/maps/api/js?key=' + this.apiKey).done(function () {\n          _this._createMap();\n        }).fail(function (status) {\n          console.error(status);\n        });\n      } else {\n        this._createMap();\n      }\n    }\n  }\n\n  createClass(PxsMap, [{\n    key: '_createMap',\n    value: function _createMap() {\n      var _this2 = this;\n\n      return this.geolocate().done(function (results) {\n        _this2.map = new google.maps.Map(_this2.$container.get(0), {\n          center: results[0].geometry.location,\n          clickableIcons: false,\n          disableDefaultUI: true,\n          disableDoubleClickZoom: true,\n          gestureHandling: 'none',\n          keyboardShortcuts: false,\n          maxZoom: _this2.zoom,\n          minZoom: _this2.zoom,\n          scrollWheel: false,\n          styles: _this2._getMapStyles(),\n          zoom: _this2.zoom,\n          zoomControl: false\n        });\n        _this2.center = _this2.map.getCenter();\n        _this2.map.panBy(0, 0);\n\n        new google.maps.Marker({\n          clickable: false,\n          map: _this2.map,\n          position: _this2.center\n        });\n\n        google.maps.event.addDomListener(window, 'resize', justDebounce(_this2.resize, 250, true, true));\n      }).fail(function (status) {\n        var usageLimits = 'https://developers.google.com/maps/faq#usagelimits';\n        var errorMessage = void 0;\n\n        switch (status) {\n          case 'ZERO_RESULTS':\n            errorMessage = '<p>Unable to find the address:</p> ' + _this2.address;\n            break;\n          case 'OVER_QUERY_LIMIT':\n            errorMessage = '\\n              <p>Unable to load Google Maps, you have reached your usage limit.</p>\\n              <p>\\n                Please visit\\n                <a href=\"' + usageLimits + '\" target=\"_blank\">' + usageLimits + '</a>\\n                for more details.\\n              </p>\\n            ';\n            break;\n          default:\n            errorMessage = 'Unable to load Google Maps.';\n            break;\n        }\n\n        _this2.displayErrorInThemeEditor(errorMessage, status);\n      });\n    }\n  }, {\n    key: 'geolocate',\n    value: function geolocate() {\n      var deferred = $.Deferred();\n      var geocoder = new google.maps.Geocoder();\n\n      geocoder.geocode({ address: this.address }, function (results, status) {\n        if (status !== google.maps.GeocoderStatus.OK) {\n          deferred.reject(status);\n        }\n\n        deferred.resolve(results);\n      });\n\n      return deferred;\n    }\n  }, {\n    key: 'resize',\n    value: function resize() {\n      if (this.map) {\n        google.maps.event.trigger(this.map, 'resize');\n        this.map.setCenter(this.center);\n        this.map.panBy(0, 100);\n      }\n    }\n  }, {\n    key: 'onSectionUnload',\n    value: function onSectionUnload() {\n      if (this.map) {\n        google.maps.event.clearListeners(this.map, 'resize');\n      }\n    }\n  }, {\n    key: '_getMapStyles',\n    value: function _getMapStyles() {\n      if (!this.colors) {\n        return;\n      }\n\n      return [{ elementType: 'geometry', stylers: [{ color: this.colors.e }] }, { elementType: 'labels.icon', stylers: [{ visibility: 'off' }] }, { elementType: 'labels.text.fill', stylers: [{ color: this.colors.a }] }, { elementType: 'labels.text.stroke', stylers: [{ color: this.colors.e }] }, { featureType: 'administrative', elementType: 'geometry', stylers: [{ visibility: 'off' }] }, { featureType: 'administrative.country', stylers: [{ visibility: 'off' }] }, { featureType: 'administrative.land_parcel', stylers: [{ visibility: 'off' }] }, { featureType: 'administrative.neighborhood', stylers: [{ visibility: 'off' }] }, { featureType: 'administrative.locality', stylers: [{ visibility: 'off' }] }, { featureType: 'poi', stylers: [{ visibility: 'off' }] }, { featureType: 'road', elementType: 'geometry.fill', stylers: [{ color: this.colors.d }] }, { featureType: 'road', elementType: 'labels.icon', stylers: [{ visibility: 'off' }] }, { featureType: 'road.arterial', elementType: 'geometry', stylers: [{ color: this.colors.c }] }, { featureType: 'road.highway', elementType: 'geometry', stylers: [{ color: this.colors.b }] }, { featureType: 'road.highway.controlled_access', stylers: [{ visibility: 'off' }] }, { featureType: 'road.local', elementType: 'labels.text.fill', stylers: [{ color: this.colors.b }] }, { featureType: 'road.local', elementType: 'labels.text.stroke', stylers: [{ color: this.colors.e }] }, { featureType: 'transit', stylers: [{ visibility: 'off' }] }, { featureType: 'water', elementType: 'geometry', stylers: [{ color: this.colors.f }] }];\n    }\n  }, {\n    key: 'displayErrorInThemeEditor',\n    value: function displayErrorInThemeEditor(errorMessage) {\n      var isThemeEditor = window.Shopify && window.Shopify.designMode;\n\n      if (!isThemeEditor) {\n        return;\n      }\n\n      this.$container.html('<div class=\"map-error-message\">' + errorMessage + '</div>');\n    }\n  }]);\n  return PxsMap;\n}();\n\nexport default PxsMap;\n","// jQuery plugins\nimport './globals/jquery';\nimport 'jquery-trend'; // eslint-disable-line\nimport 'jquery-revealer'; // eslint-disable-line\n\n// Global imports\nimport './globals/flickity-ios-fix';\n\n// Responsive Images\nimport 'intersection-observer'; // eslint-disable-line\nimport rimg from 'rimg-shopify'; // eslint-disable-line\n\n// Template imports\nimport Account from './templates/Account';\nimport Contact from './templates/Contact';\nimport Page from './templates/Page';\n\n// Section imports\nimport Sections from './Sections';\nimport StaticSectionHeader from './sections/StaticSectionHeader';\nimport StaticSectionFooter from './sections/StaticSectionFooter';\nimport StaticArticle from './sections/StaticArticle';\nimport StaticBlog from './sections/StaticBlog';\nimport StaticCart from './sections/StaticCart';\nimport StaticCollection from './sections/StaticCollection';\nimport StaticGiftcard from './sections/StaticGiftcard';\nimport StaticPassword from './sections/StaticPassword';\nimport StaticProduct from './sections/StaticProduct';\nimport StaticSearch from './sections/StaticSearch';\nimport DynamicBlogPosts from './sections/DynamicBlogPosts';\nimport StaticHighlightsBanners from './sections/StaticHighlightsBanners';\nimport StaticSlideshow from './sections/StaticSlideshow';\nimport DynamicPromoBlocks from './sections/DynamicPromoBlocks';\nimport DynamicMenuList from './sections/DynamicMenuList';\nimport DynamicTwitterFeed from './sections/DynamicTwitterFeed';\nimport DynamicInstagramFeed from './sections/DynamicInstagramFeed';\nimport DynamicFeaturedCollection from './sections/DynamicFeaturedCollection';\nimport DynamicSearch from './sections/DynamicSearch';\nimport DynamicRichText from './sections/DynamicRichText';\nimport DynamicVideo from './sections/DynamicVideo';\nimport DynamicNewsletter from './sections/DynamicNewsletter';\nimport PXSMap from 'pxs-map'; // eslint-disable-line\n\nrimg.init();\n\nconst sections = new Sections();\nsections.register('static-header', section => new StaticSectionHeader(section));\nsections.register('static-footer', section => new StaticSectionFooter(section));\nsections.register('static-article', section => new StaticArticle(section));\nsections.register('static-blog', section => new StaticBlog(section));\nsections.register('static-cart', section => new StaticCart(section));\nsections.register('static-collection', section => new StaticCollection(section));\nsections.register('static-giftcard', section => new StaticGiftcard(section));\nsections.register('static-password', section => new StaticPassword(section));\nsections.register('static-product', section => new StaticProduct(section));\nsections.register('static-search', section => new StaticSearch(section));\nsections.register('dynamic-blog-posts', section => new DynamicBlogPosts(section));\nsections.register('static-highlights-banners', section => new StaticHighlightsBanners(section));\nsections.register('static-slideshow', section => new StaticSlideshow(section));\nsections.register('dynamic-promo-mosaic', section => new DynamicPromoBlocks(section));\nsections.register('dynamic-promo-grid', section => new DynamicPromoBlocks(section));\nsections.register('dynamic-menu-list', section => new DynamicMenuList(section));\nsections.register('dynamic-twitter-feed', section => new DynamicTwitterFeed(section));\nsections.register('dynamic-instagram-feed', section => new DynamicInstagramFeed(section));\nsections.register('dynamic-featured-collection', section => new DynamicFeaturedCollection(section));\nsections.register('dynamic-featured-product', section => new StaticProduct(section));\nsections.register('dynamic-rich-text', section => new DynamicRichText(section));\nsections.register('dynamic-search', section => new DynamicSearch(section));\nsections.register('dynamic-video', section => new DynamicVideo(section));\nsections.register('pxs-newsletter', section => new DynamicNewsletter(section));\nsections.register('pxs-map', section => new PXSMap(section));\n\nnew Account();\nnew Contact();\nnew Page();\n"],"names":["this","define","window","jQuery","$","matchesSelector","require$$0","getSize","utils","require$$1","require$$2","require$$3","require$$4","require$$5","cell","slide","flickity","require$$6","on","event","$target","target","$flickityEnabledEl","closest","length","Flickity","data","removeEventListener","rimg","Quantity","el","$el","$inputParent","find","$input","$selectParent","$select","_watchSelect","bind","_watchInput","off","baseValue","parseInt","currentTarget","value","isNaN","_validateValue","val","trigger","removeClass","addClass","focus","removeAttr","select","attr","Forms","selector","filledClass","fieldSelector","quantityItems","$quantityWrapper","_toggleFilled","_checkFilled","each","i","push","forEach","quantityItem","unload","hasClass","isFilled","toggleClass","Account","$accountContents","$loginContent","$addressesContent","$addressButtonFocus","_loginToggle","_initLoginPage","_initAddressPage","_init","$loginToggle","$login","$recovery","$recoveryHasMessage","preventDefault","$customerAddresses","itemId","eq","CustomerAddress","destroy","id","countryEl","provinceEl","options","hideElement","Shopify","CountryProvinceSelector","Contact","$contactContents","init","update","asyncGenerator","classCallCheck","createClass","init$1","update$1","RichText","_initExternalLinks","groupedContent","GroupedContent","get","anchors","filter","href","indexOf","location","hostname","Page","$pageContent","Sections","handlers","instances","_onSectionEvent","addEventListener","_triggerInstanceEvent","type","handler","warn","_initSections","dataEls","document","querySelectorAll","dataEl","parentNode","idEl","querySelector","sectionId","getAttribute","_createInstance","detail","blockId","instance","eventName","args","name","keys","typeEl","console","_loadData","postMessage","_postMessage","innerHTML","JSON","parse","error","message","eventHandlers","previousBreakpoint","currentBreakpoint","getBreakpoint","eventHandler","getComputedStyle","documentElement","getPropertyValue","replace","isBreakpoint","breakpoint","onBreakpointChange","offBreakpointChange","index","splice","ignoredEls","isIgnored","element","tagName","attributes","slice","call","some","getHeaderOffset","header","withAnnouncementBar","headerEls","childNodes","isSticky","pageYOffset","offset","HTMLElement","getBoundingClientRect","height","bottom","style","top","StickyHeader","settings","$body","body","$window","$siteMain","$toggle","stickyClass","scrolledClass","navOpenClass","$announcementBar","sticky_header","_stickyReset","navVisibility","_stickyOffset","_toggleStickyHeader","_headerChecker","one","breakpoints","previous","closeNavigation","requestAnimationFrameId","cancelAnimationFrame","_bindEvents","requestAnimationFrame","layout","_slideToggle","css","isInit","open","openNavigation","hide","mobileOnly","outerHeight","scrollThreshold","shouldShrink","_shrink","_toggleAnnouncementBar","_expand","revealer","Accordion","extend","$block","activeClass","autoCollapse","closeOpen","_open","_close","block","eligibleClass","NavMobileSubMenus","activeMenuClass","activeMenu","navTrigger","subMenu","$current","_closeSubmenu","_toggleSubmenu","next","_openSubmenu","$menu","_selectSubMenu","toggle","closeSubMenus","NavMobile","elements","$toggleOpen","isOpen","subMenus","$mobileNav","$panel","$overlay","$toggleClose","layoutHandler","_setPanelHeight","innerHeight","events","closeAllSubmenus","scrollLeft","$container","parent","animate","left","width","MegaNavScroller","$menuList","_addScrollClasses","scrollWidth","NavDesktop","activeItem","inlineChildren","is","toggleItem","stopPropagation","clicked","removeData","closeAll","_handleDocumentClick","megaNav","children","undefined","$parent","_inlineMenu","openMegaNav","contains","submenu","closeItem","scrollTop","openItem","parents","windowHeight","windowWidth","innerWidth","menuRect","hasChildren","stickyHeaderOffset","edges","right","bottomEdge","rightEdge","_menuLimits","childrenExceedHorizontal","exceedsVertical","maxHeight","_unsetInlineMenu","Search","searchType","view","inProgress","xhr","XMLHttpRequest","ActiveXObject","_xhrLoad","_xhrError","_xhrAbort","response","readyState","status","responseText","emit","term","abort","url","params","searchParams","Object","map","key","encodeURIComponent","join","setRequestHeader","send","EventEmitter","SearchForm","$form","submitHandler","clone","$terms","terms","split","trim","append","submit","ContentItem","contentItem","title","ContentResultsHeader","context","content_results","ContentResults","props","content","$title","contentItems","ContentNoResults","no_results","ProductPriceCompareAt","price","compare_at_price","ProductPriceMain","ProductPrice","onSale","consistentSaved","$compareAt","$price","ProductContent","product","on_sale","consistent_saved","ProductImage","image","ProductItem","enableImages","$image","$content","ProductResults","products","productItems","ProductNoResults","no_results_products","view_all_products","chevron","ResultsFooter","view_all_results","HeaderSearch","$els","$header","$document","enableContent","enable_content","enable_images","flyDownActive","takeOverActive","showFlyDown","$button","$takeOverButton","$flyDown","$searchResults","$searchPlaceholder","$quickLinks","staticSearch","search","_search","_toggleTakeOver","_searchFocused","_documentFocus","_searchCancelled","_searchComplete","_searchError","closeEvents","debounce","hasTerms","hasNoResults","hasPreviousResults","invalidKeyStrokes","_flyDownInitial","_closeFlyDown","_flyDownSearching","html","_toggleButton","_openFlyDown","execute","log","sanitizedTerms","$productResults","results","noResults","$contentResults","formatMoney","money_format","footer","disable","concat","retainFocus","enable","StaticSectionHeader","section","currency","headerSearch","$scripts","$menuToggle","$cartCount","$searchField","$siteNavigation","$desktopNavigation","$headerTools","converter","$converter","stickyHeader","navMobile","navDesktop","forms","live_search","_converter","_headerToolsSize","item_count","shop_currency","default_currency","display_format","money_format_no_currency","money_format_currency","setCurrency","outerWidth","innerWidths","Math","ceil","combinedWidths","reduce","a","b","StaticSectionFooter","_toggleAccordion","openAll","StaticArticle","$commentForm","richText","commentForm","StaticBlog","MessageBanner","$bannerTemplate","$banners","$banner","_show","$visibleBanners","banner","_hide","_positionBanner","_removeBanner","remove","dismissBanners","StaticCart","shipping","messageBanner","$total","$shipping","$titleTotalSmall","$titleTotalLarge","$titleTotalContents","$shippingToggle","$shippingResponse","$shippingResponseMessage","$shippingResponseRates","$shippingSubmit","_moveTitleTotal","onError","_handleErrors","CurrencyConverter","_initShippingCalc","_quantityKeyDown","_editItemQuantity","detach","keyCode","$cartItem","quantity","max","_updateCart","changeItem","_didUpdate","limit","errorMessage","stock_limit","items","total_price","filteredItems","item","cartItem","itemTotal","_quantityError","errors","parseJSON","shippingResponse","error_general","zip","shipment_too_heavy","_handleShippingResponse","_bindShippingCalcEvents","Cart","ShippingCalculator","show","calculate_shipping","calculating","customer","_toggleShippingCalc","_getShippingRates","oldText","text","newText","_disableShippingButton","shippingAddress","country","province","getCartShippingRatesForDestination","addressBase","address","firstRate","formatRate","multiple_rates","one_rate","no_rates","rates","rate","rateValue","rate_value","_hideShippingResponse","empty","_enableShippingButton","_showShippingResponse","Modal","callbacks","modal","$modal","$modalInner","defaultCallbacks","_onOpen","_onBeforeOpen","_onClose","_onBeforeClose","position","modalOptions","handle","_addModalClass","VanillaModal","close","modalHeight","modalPadding","marginTop","modalClass","match","_removeModalClass","onClose","onOpen","onBeforeClose","onBeforeOpen","trapFocus","namespace","$elementToFocus","evt","has","removeTrapFocus","Node","variant","optionsCount","neighbors","variants","option","available","ProductOptions","productHandle","nodeMap","_generateNodeMap","variant2","addNeighbor","found","closestVariant","matchingValues","tempMatchingValues","getVariantFromOptions","getClosestVariantFromOptions","getValidOptions","VariantHelper","$variants","$options","productOptions","optionsTypes","optionsType","radio","_unbindEvents","_switchVariant","firstLoad","availableOptions","getVariantOrClosestFromOptions","getAvailableOptionsFromVariant","_switchVariantSelect","_switchVariantRadio","$optionEls","$option","prop","option1","Images","images","size","loadImage","getSizedImageUrl","path","Image","src","removeProtocol","prefix","suffix","AddToCartFlyout","formData","flyOutSelector","$atcTemplate","_onInit","_onError","_onSuccess","_closeFlyOuts","$atcButton","onInit","_disableButton","_removeFlyOuts","$flyOut","quantityField","ajax","param","done","imageUrl","product_title","variant_options","$productPrice","moneyFormat","onSuccess","$subTotal","original_total_price","_positionFlyOut","_openFlyOut","fail","description","_enableButton","_closeFlyOut","$excludeFlyOut","_removeFlyOut","api","apiLoadedCallbacks","apiLoaded","onYouTubeIframeAPIReady","apiLoadedCallback","Youtube","regex","onApiLoaded","_onApiLoaded","isReady","onReady","_onReady","onReadyCallback","onStateChange","_onStateChange","onPlayCallback","Promise","resolve","player","playVideo","pauseVideo","mute","YT","Player","state","PlayerState","PLAYING","VimeoPlayer","urlParts","onProgress","_onProgress","onProgressCallback","play","pause","setVolume","catch","Vimeo","ready","then","Video","platform","playButton","videoEl","onPlayClick","_onPlayClick","onPauseClick","_onPauseClick","autoplay","_autoplay","video","classList","add","ProductGallery","$gallery","slider","$slider","slides","$slides","slideImages","$sliderPagination","$paginationTrigger","videos","videoSlides","_onUpdateGallery","slideImageLoaded","_onSlideImageLoaded","variantChange","_onVariantChange","_unloadGallery","videoSlide","slideId","_initGallery","viewport","resize","featured_image","$selectedImage","flickityOptions","optionsMobile","optionsDesktop","initialIndex","_bindGallery","_handleGalleryVideos","_updateActiveSlide","selectedIndex","selectedElement","videoKey","enable_video_autoplay","$newSlide","$newThumbnail","siblings","ProductDetails","$formArea","$details","useHistory","variantHelper","_onATCOpen","_onATCClose","atcCallbacks","$productAtcButton","$productVariants","$productOptions","variantFields","gallery","_initOptions","_AddToCartFlyout","_updatePrice","_updateBadge","_updateButton","replaceState","hasComparePrice","$compareAtPrice","$compareAtPriceMoney","$priceMoney","priceSaved","$badge","$badgeMoneySaved","$badgePercentSaved","percentileSaved","round","product_available","product_unavailable","serializeArray","ProductQuickshop","$quickShop","loaded","productDetails","quickShopHTML","hasAttribute","_initSPR","_initialize","PaymentButton","SPR","registerCallbacks","initRatingHandler","initDomEls","loadProducts","loadBadges","$message","$description","_onATCInit","_onATCError","_onATCSuccess","modalCallbacks","_toggleMessage","isVisible","ProductGridItem","productQuickshop","quickBuySettings","$html","$actions","hasProductActions","_addToCart","_actionsToggle","_openQuickShop","_setSortByQueryParameters","queryParams","grid_list","_initQuickBuy","_objectFitPolyfill","aCouples","substr","aKeyValue","decodeURIComponent","_isObjectFitAvailable","actionsHeight","_showActions","_hideActions","_getHeights","heightBase","heightExpanded","variantID","RecentlyViewed","recentlyViewed","recently_viewed_info","time","timestamp","Date","getTime","localStorage","getItem","timeSince","link","removeRecentlyViewed","setItem","stringify","$carousel","_initSlider","bindEvents","nextAll","selectCell","clearRecentlyViewed","now","secondsPast","secondsAgo","second","ago","seconds","minutesAgo","minute","minutes","hoursAgo","hour","hours","date","currentDate","day","getDate","month","toDateString","year","getFullYear","y1","y2","SelectWidth","_adjustWidth","selectedText","additionalStyles","StaticCollection","sortWidth","$focusItem","filtersContent","sortContent","$sortTrigger","$sortTriggerButton","$sortTriggerModal","$filtersTrigger","$allTags","$advandedTags","$additionalTags","$gridViewToggle","$listViewToggle","$gridContainer","_changeSorting","_changeSortingButton","_showSortModal","_showFiltersModal","_activateTag","_advancedTags","_toggleTags","_onModalOpen","_onModalClose","_toggleListView","_toggleGridView","_checkListView","$productItems","productItem","_updatePrices","tagGroup","$activeGroup","tagHandle","$trigger","$items","siblingsVisible","see_less","see_more","sort_by","StaticGiftcard","$qrCode","$giftCardCode","QRCode","print","_selectText","range","createTextRange","moveToElementText","getSelection","selection","createRange","selectNodeContents","removeAllRanges","addRange","StaticPassword","modalForms","newsletterForm","modalContents","$newsletterForm","modalOpen","onModalOpen","modalClose","onModalClose","_openModal","_checkForPasswordAttempt","$contents","ProductRowScroller","productRow","$productRow","_mobileSlider","_destroyFlickity","_bindSlider","_initFlickity","maxCellHeight","StaticProduct","reviewForm","$product","isThreeColumn","isThemeEditor","designMode","history","$formRegular","$formAlt","$relatedProducts","relatedProducts","relatedProductsScroller","$productReviews","_moveForm","StaticSearch","searchForm","DynamicTwitterFeed","$blogPosts","StaticHighlightsBanners","_bindFlickity","StaticSlideshow","carousel","container","isFullscreen","selectBlockOnLoad","continueAutoplay","stopAutoplay","autoplayTimeout","enable_autoplay","autoplay_duration","_slideshowHeight","_positionDots","_changeArrrowColors","pausePlayer","playPlayer","pageDots","offsetHeight","gutterContent","currentColor","dataset","dots","themecolor","slidecolor","fill","background","headerHeight","$slide","slideIndex","DynamicPromoBlocks","expandedClass","compressBlocks","compress_blocks","_blockInteraction","_collapse","setAttribute","removeAttribute","DynamicMenuList","_toggleList","isIE9","$wrapper","$tweets","track","_load","$template","template","onboarding","username","retweets","locale","_evenHeights","fetch","tweets","_renderTweets","untrack","heights","apply","screenName","$avatar","postedAt","wrapperClass","tweetsLength","tweetsArray","tweet","$tweet","authorInfo","_extractAuthor","meta","_extractMeta","fadeOut","promise","_extractWrapperClass","DynamicInstagramFeed","photoCount","photo_count","accessToken","access_token","$photoContainer","$photoContainerPlaceholder","$photoTemplate","_getPhotos","photos","_renderPhotos","photoPromise","code","error_message","error_type","Deferred","reject","photoArray","photo","lowResolution","low_resolution","standardResolution","standard_resolution","$link","$photo","DynamicFeaturedCollection","rte","richTextArea","DynamicVideo","hasPlayed","rect","clientHeight","DynamicNewsletter","justDebounce","sections","register","DynamicBlogPosts","DynamicRichText","DynamicSearch","PXSMap"],"mappings":"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","preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjpudWxsLCJzb3VyY2VzIjpbIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9nbG9iYWxzL2pxdWVyeS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9qcXVlcnktdHJlbmQvanF1ZXJ5LnRyZW5kLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL2pxdWVyeS1yZXZlYWxlci9qcXVlcnkucmV2ZWFsZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvZXYtZW1pdHRlci9ldi1lbWl0dGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL2dldC1zaXplL2dldC1zaXplLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL2Rlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3Rvci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9maXp6eS11aS11dGlscy91dGlscy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9jZWxsLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL3NsaWRlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2FuaW1hdGUuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvZmxpY2tpdHkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvdW5pcG9pbnRlci91bmlwb2ludGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL3VuaWRyYWdnZXIvdW5pZHJhZ2dlci5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9kcmFnLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL3RhcC1saXN0ZW5lci90YXAtbGlzdGVuZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcHJldi1uZXh0LWJ1dHRvbi5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9wYWdlLWRvdHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvZmxpY2tpdHkvanMvcGxheWVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL2ZsaWNraXR5L2pzL2FkZC1yZW1vdmUtY2VsbC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9sYXp5bG9hZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9mbGlja2l0eS9qcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2dsb2JhbHMvZmxpY2tpdHktaW9zLWZpeC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9pbnRlcnNlY3Rpb24tb2JzZXJ2ZXIvaW50ZXJzZWN0aW9uLW9ic2VydmVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL3JpbWcvZGlzdC9pbmRleC5lcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9yaW1nLXNob3BpZnkvZGlzdC9pbmRleC5lcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvUXVhbnRpdHkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9Gb3Jtcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3RlbXBsYXRlcy9BY2NvdW50LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvdGVtcGxhdGVzL0NvbnRhY3QuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvZml0dmlkcy9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9ncm91cGVkLWNvbnRlbnQvZGlzdC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUmljaFRleHQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy90ZW1wbGF0ZXMvUGFnZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL1NlY3Rpb25zLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL3Nob3BpZnktY3VycmVuY3ktY29udmVydGVyL2Rpc3QvaW5kZXguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvc2NyaXB0anMvZGlzdC9zY3JpcHQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9MYXlvdXQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL2dldEhlYWRlck9mZnNldC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvU3RpY2t5SGVhZGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvQWNjb3JkaW9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9OYXZNb2JpbGVTdWJNZW51cy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvTmF2TW9iaWxlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvaGVscGVycy9zY3JvbGxMZWZ0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9NZWdhTmF2U2Nyb2xsZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL05hdkRlc2t0b3AuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9ub2RlX21vZHVsZXMvanVzdC1kZWJvdW5jZS9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy9ldmVudGVtaXR0ZXIyL2xpYi9ldmVudGVtaXR0ZXIyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvU2VhcmNoLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9TZWFyY2hGb3JtLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9IZWFkZXJTZWFyY2hUZW1wbGF0ZXMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL0hlYWRlclNlYXJjaC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY1NlY3Rpb25IZWFkZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNTZWN0aW9uRm9vdGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljQXJ0aWNsZS5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY0Jsb2cuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL01lc3NhZ2VCYW5uZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDYXJ0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL3ZhbmlsbGEtbW9kYWwvZGlzdC9pbmRleC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvTW9kYWwuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL2ExMXkuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9Qcm9kdWN0T3B0aW9ucy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL1ZhcmlhbnRIZWxwZXIuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9oZWxwZXJzL0ltYWdlcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvQWRkVG9DYXJ0Rmx5b3V0LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9Zb3V0dWJlLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9WaW1lby5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvVmlkZW8uanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9jb21wb25lbnRzL1Byb2R1Y3RHYWxsZXJ5LmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9Qcm9kdWN0RGV0YWlscy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdFF1aWNrc2hvcC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdEdyaWRJdGVtLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvY29tcG9uZW50cy9SZWNlbnRseVZpZXdlZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2hlbHBlcnMvU2VsZWN0V2lkdGguanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNDb2xsZWN0aW9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljR2lmdGNhcmQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNQYXNzd29yZC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL2NvbXBvbmVudHMvUHJvZHVjdFJvd1Njcm9sbGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvU3RhdGljUHJvZHVjdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY1NlYXJjaC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNCbG9nUG9zdHMuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9TdGF0aWNIaWdobGlnaHRzQmFubmVycy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL1N0YXRpY1NsaWRlc2hvdy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNQcm9tb0Jsb2Nrcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNNZW51TGlzdC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L25vZGVfbW9kdWxlcy90d2l0dGVyLWZldGNoZXIvanMvdHdpdHRlckZldGNoZXJfbWluLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvRHluYW1pY1R3aXR0ZXJGZWVkLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvRHluYW1pY0luc3RhZ3JhbUZlZWQuanMiLCIvaG9tZS90cmF2aXMvYnVpbGQvcGl4ZWx1bmlvbi9lbXBpcmUtc2hvcGlmeS9zb3VyY2Uvc2NyaXB0cy9zZWN0aW9ucy9EeW5hbWljRmVhdHVyZWRDb2xsZWN0aW9uLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvc291cmNlL3NjcmlwdHMvc2VjdGlvbnMvRHluYW1pY1NlYXJjaC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNSaWNoVGV4dC5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNWaWRlby5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL3NlY3Rpb25zL0R5bmFtaWNOZXdzbGV0dGVyLmpzIiwiL2hvbWUvdHJhdmlzL2J1aWxkL3BpeGVsdW5pb24vZW1waXJlLXNob3BpZnkvbm9kZV9tb2R1bGVzL3B4cy1tYXAvZGlzdC9pbmRleC5lcy5qcyIsIi9ob21lL3RyYXZpcy9idWlsZC9waXhlbHVuaW9uL2VtcGlyZS1zaG9waWZ5L3NvdXJjZS9zY3JpcHRzL0VtcGlyZS5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIGpRdWVyeSBKYXZhU2NyaXB0IExpYnJhcnkgdjMuMy4xXG4gKiBodHRwczovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwczovL3NpenpsZWpzLmNvbS9cbiAqXG4gKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHBzOi8vanF1ZXJ5Lm9yZy9saWNlbnNlXG4gKlxuICogRGF0ZTogMjAxOC0wMS0yMFQxNzoyNFpcbiAqL1xuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdFwidXNlIHN0cmljdFwiO1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBGb3IgQ29tbW9uSlMgYW5kIENvbW1vbkpTLWxpa2UgZW52aXJvbm1lbnRzIHdoZXJlIGEgcHJvcGVyIGB3aW5kb3dgXG5cdFx0Ly8gaXMgcHJlc2VudCwgZXhlY3V0ZSB0aGUgZmFjdG9yeSBhbmQgZ2V0IGpRdWVyeS5cblx0XHQvLyBGb3IgZW52aXJvbm1lbnRzIHRoYXQgZG8gbm90IGhhdmUgYSBgd2luZG93YCB3aXRoIGEgYGRvY3VtZW50YFxuXHRcdC8vIChzdWNoIGFzIE5vZGUuanMpLCBleHBvc2UgYSBmYWN0b3J5IGFzIG1vZHVsZS5leHBvcnRzLlxuXHRcdC8vIFRoaXMgYWNjZW50dWF0ZXMgdGhlIG5lZWQgZm9yIHRoZSBjcmVhdGlvbiBvZiBhIHJlYWwgYHdpbmRvd2AuXG5cdFx0Ly8gZS5nLiB2YXIgalF1ZXJ5ID0gcmVxdWlyZShcImpxdWVyeVwiKSh3aW5kb3cpO1xuXHRcdC8vIFNlZSB0aWNrZXQgIzE0NTQ5IGZvciBtb3JlIGluZm8uXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBnbG9iYWwuZG9jdW1lbnQgP1xuXHRcdFx0ZmFjdG9yeSggZ2xvYmFsLCB0cnVlICkgOlxuXHRcdFx0ZnVuY3Rpb24oIHcgKSB7XG5cdFx0XHRcdGlmICggIXcuZG9jdW1lbnQgKSB7XG5cdFx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCBcImpRdWVyeSByZXF1aXJlcyBhIHdpbmRvdyB3aXRoIGEgZG9jdW1lbnRcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBmYWN0b3J5KCB3ICk7XG5cdFx0XHR9O1xuXHR9IGVsc2Uge1xuXHRcdGZhY3RvcnkoIGdsb2JhbCApO1xuXHR9XG5cbi8vIFBhc3MgdGhpcyBpZiB3aW5kb3cgaXMgbm90IGRlZmluZWQgeWV0XG59ICkoIHR5cGVvZiB3aW5kb3cgIT09IFwidW5kZWZpbmVkXCIgPyB3aW5kb3cgOiB0aGlzLCBmdW5jdGlvbiggd2luZG93LCBub0dsb2JhbCApIHtcblxuLy8gRWRnZSA8PSAxMiAtIDEzKywgRmlyZWZveCA8PTE4IC0gNDUrLCBJRSAxMCAtIDExLCBTYWZhcmkgNS4xIC0gOSssIGlPUyA2IC0gOS4xXG4vLyB0aHJvdyBleGNlcHRpb25zIHdoZW4gbm9uLXN0cmljdCBjb2RlIChlLmcuLCBBU1AuTkVUIDQuNSkgYWNjZXNzZXMgc3RyaWN0IG1vZGVcbi8vIGFyZ3VtZW50cy5jYWxsZWUuY2FsbGVyICh0cmFjLTEzMzM1KS4gQnV0IGFzIG9mIGpRdWVyeSAzLjAgKDIwMTYpLCBzdHJpY3QgbW9kZSBzaG91bGQgYmUgY29tbW9uXG4vLyBlbm91Z2ggdGhhdCBhbGwgc3VjaCBhdHRlbXB0cyBhcmUgZ3VhcmRlZCBpbiBhIHRyeSBibG9jay5cblwidXNlIHN0cmljdFwiO1xuXG52YXIgYXJyID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIGdldFByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mO1xuXG52YXIgc2xpY2UgPSBhcnIuc2xpY2U7XG5cbnZhciBjb25jYXQgPSBhcnIuY29uY2F0O1xuXG52YXIgcHVzaCA9IGFyci5wdXNoO1xuXG52YXIgaW5kZXhPZiA9IGFyci5pbmRleE9mO1xuXG52YXIgY2xhc3MydHlwZSA9IHt9O1xuXG52YXIgdG9TdHJpbmcgPSBjbGFzczJ0eXBlLnRvU3RyaW5nO1xuXG52YXIgaGFzT3duID0gY2xhc3MydHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGZuVG9TdHJpbmcgPSBoYXNPd24udG9TdHJpbmc7XG5cbnZhciBPYmplY3RGdW5jdGlvblN0cmluZyA9IGZuVG9TdHJpbmcuY2FsbCggT2JqZWN0ICk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cbnZhciBpc0Z1bmN0aW9uID0gZnVuY3Rpb24gaXNGdW5jdGlvbiggb2JqICkge1xuXG4gICAgICAvLyBTdXBwb3J0OiBDaHJvbWUgPD01NywgRmlyZWZveCA8PTUyXG4gICAgICAvLyBJbiBzb21lIGJyb3dzZXJzLCB0eXBlb2YgcmV0dXJucyBcImZ1bmN0aW9uXCIgZm9yIEhUTUwgPG9iamVjdD4gZWxlbWVudHNcbiAgICAgIC8vIChpLmUuLCBgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwib2JqZWN0XCIgKSA9PT0gXCJmdW5jdGlvblwiYCkuXG4gICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGNsYXNzaWZ5ICphbnkqIERPTSBub2RlIGFzIGEgZnVuY3Rpb24uXG4gICAgICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJmdW5jdGlvblwiICYmIHR5cGVvZiBvYmoubm9kZVR5cGUgIT09IFwibnVtYmVyXCI7XG4gIH07XG5cblxudmFyIGlzV2luZG93ID0gZnVuY3Rpb24gaXNXaW5kb3coIG9iaiApIHtcblx0XHRyZXR1cm4gb2JqICE9IG51bGwgJiYgb2JqID09PSBvYmoud2luZG93O1xuXHR9O1xuXG5cblxuXG5cdHZhciBwcmVzZXJ2ZWRTY3JpcHRBdHRyaWJ1dGVzID0ge1xuXHRcdHR5cGU6IHRydWUsXG5cdFx0c3JjOiB0cnVlLFxuXHRcdG5vTW9kdWxlOiB0cnVlXG5cdH07XG5cblx0ZnVuY3Rpb24gRE9NRXZhbCggY29kZSwgZG9jLCBub2RlICkge1xuXHRcdGRvYyA9IGRvYyB8fCBkb2N1bWVudDtcblxuXHRcdHZhciBpLFxuXHRcdFx0c2NyaXB0ID0gZG9jLmNyZWF0ZUVsZW1lbnQoIFwic2NyaXB0XCIgKTtcblxuXHRcdHNjcmlwdC50ZXh0ID0gY29kZTtcblx0XHRpZiAoIG5vZGUgKSB7XG5cdFx0XHRmb3IgKCBpIGluIHByZXNlcnZlZFNjcmlwdEF0dHJpYnV0ZXMgKSB7XG5cdFx0XHRcdGlmICggbm9kZVsgaSBdICkge1xuXHRcdFx0XHRcdHNjcmlwdFsgaSBdID0gbm9kZVsgaSBdO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHRcdGRvYy5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHQgKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBzY3JpcHQgKTtcblx0fVxuXG5cbmZ1bmN0aW9uIHRvVHlwZSggb2JqICkge1xuXHRpZiAoIG9iaiA9PSBudWxsICkge1xuXHRcdHJldHVybiBvYmogKyBcIlwiO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5IChmdW5jdGlvbmlzaCBSZWdFeHApXG5cdHJldHVybiB0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIiA/XG5cdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHR0eXBlb2Ygb2JqO1xufVxuLyogZ2xvYmFsIFN5bWJvbCAqL1xuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmVzbGludHJjLmpzb24gd291bGQgY3JlYXRlIGEgZGFuZ2VyIG9mIHVzaW5nIHRoZSBnbG9iYWxcbi8vIHVuZ3VhcmRlZCBpbiBhbm90aGVyIHBsYWNlLCBpdCBzZWVtcyBzYWZlciB0byBkZWZpbmUgZ2xvYmFsIG9ubHkgZm9yIHRoaXMgbW9kdWxlXG5cblxuXG52YXJcblx0dmVyc2lvbiA9IFwiMy4zLjFcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB3ZSB0cmltIEJPTSBhbmQgTkJTUFxuXHRydHJpbSA9IC9eW1xcc1xcdUZFRkZcXHhBMF0rfFtcXHNcXHVGRUZGXFx4QTBdKyQvZztcblxualF1ZXJ5LmZuID0galF1ZXJ5LnByb3RvdHlwZSA9IHtcblxuXHQvLyBUaGUgY3VycmVudCB2ZXJzaW9uIG9mIGpRdWVyeSBiZWluZyB1c2VkXG5cdGpxdWVyeTogdmVyc2lvbixcblxuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblxuXHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRpZiAoIG51bSA9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0cmV0dXJuIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF07XG5cdH0sXG5cblx0Ly8gVGFrZSBhbiBhcnJheSBvZiBlbGVtZW50cyBhbmQgcHVzaCBpdCBvbnRvIHRoZSBzdGFja1xuXHQvLyAocmV0dXJuaW5nIHRoZSBuZXcgbWF0Y2hlZCBlbGVtZW50IHNldClcblx0cHVzaFN0YWNrOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cblx0XHQvLyBCdWlsZCBhIG5ldyBqUXVlcnkgbWF0Y2hlZCBlbGVtZW50IHNldFxuXHRcdHZhciByZXQgPSBqUXVlcnkubWVyZ2UoIHRoaXMuY29uc3RydWN0b3IoKSwgZWxlbXMgKTtcblxuXHRcdC8vIEFkZCB0aGUgb2xkIG9iamVjdCBvbnRvIHRoZSBzdGFjayAoYXMgYSByZWZlcmVuY2UpXG5cdFx0cmV0LnByZXZPYmplY3QgPSB0aGlzO1xuXG5cdFx0Ly8gUmV0dXJuIHRoZSBuZXdseS1mb3JtZWQgZWxlbWVudCBzZXRcblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdC8vIEV4ZWN1dGUgYSBjYWxsYmFjayBmb3IgZXZlcnkgZWxlbWVudCBpbiB0aGUgbWF0Y2hlZCBzZXQuXG5cdGVhY2g6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmVhY2goIHRoaXMsIGNhbGxiYWNrICk7XG5cdH0sXG5cblx0bWFwOiBmdW5jdGlvbiggY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqUXVlcnkubWFwKCB0aGlzLCBmdW5jdGlvbiggZWxlbSwgaSApIHtcblx0XHRcdHJldHVybiBjYWxsYmFjay5jYWxsKCBlbGVtLCBpLCBlbGVtICk7XG5cdFx0fSApICk7XG5cdH0sXG5cblx0c2xpY2U6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggc2xpY2UuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApICk7XG5cdH0sXG5cblx0Zmlyc3Q6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLmVxKCAwICk7XG5cdH0sXG5cblx0bGFzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIC0xICk7XG5cdH0sXG5cblx0ZXE6IGZ1bmN0aW9uKCBpICkge1xuXHRcdHZhciBsZW4gPSB0aGlzLmxlbmd0aCxcblx0XHRcdGogPSAraSArICggaSA8IDAgPyBsZW4gOiAwICk7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBqID49IDAgJiYgaiA8IGxlbiA/IFsgdGhpc1sgaiBdIF0gOiBbXSApO1xuXHR9LFxuXG5cdGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHJldk9iamVjdCB8fCB0aGlzLmNvbnN0cnVjdG9yKCk7XG5cdH0sXG5cblx0Ly8gRm9yIGludGVybmFsIHVzZSBvbmx5LlxuXHQvLyBCZWhhdmVzIGxpa2UgYW4gQXJyYXkncyBtZXRob2QsIG5vdCBsaWtlIGEgalF1ZXJ5IG1ldGhvZC5cblx0cHVzaDogcHVzaCxcblx0c29ydDogYXJyLnNvcnQsXG5cdHNwbGljZTogYXJyLnNwbGljZVxufTtcblxualF1ZXJ5LmV4dGVuZCA9IGpRdWVyeS5mbi5leHRlbmQgPSBmdW5jdGlvbigpIHtcblx0dmFyIG9wdGlvbnMsIG5hbWUsIHNyYywgY29weSwgY29weUlzQXJyYXksIGNsb25lLFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgMCBdIHx8IHt9LFxuXHRcdGkgPSAxLFxuXHRcdGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsXG5cdFx0ZGVlcCA9IGZhbHNlO1xuXG5cdC8vIEhhbmRsZSBhIGRlZXAgY29weSBzaXR1YXRpb25cblx0aWYgKCB0eXBlb2YgdGFyZ2V0ID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRkZWVwID0gdGFyZ2V0O1xuXG5cdFx0Ly8gU2tpcCB0aGUgYm9vbGVhbiBhbmQgdGhlIHRhcmdldFxuXHRcdHRhcmdldCA9IGFyZ3VtZW50c1sgaSBdIHx8IHt9O1xuXHRcdGkrKztcblx0fVxuXG5cdC8vIEhhbmRsZSBjYXNlIHdoZW4gdGFyZ2V0IGlzIGEgc3RyaW5nIG9yIHNvbWV0aGluZyAocG9zc2libGUgaW4gZGVlcCBjb3B5KVxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgIT09IFwib2JqZWN0XCIgJiYgIWlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0gQXJyYXkuaXNBcnJheSggY29weSApICkgKSApIHtcblxuXHRcdFx0XHRcdGlmICggY29weUlzQXJyYXkgKSB7XG5cdFx0XHRcdFx0XHRjb3B5SXNBcnJheSA9IGZhbHNlO1xuXHRcdFx0XHRcdFx0Y2xvbmUgPSBzcmMgJiYgQXJyYXkuaXNBcnJheSggc3JjICkgPyBzcmMgOiBbXTtcblxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjbG9uZSA9IHNyYyAmJiBqUXVlcnkuaXNQbGFpbk9iamVjdCggc3JjICkgPyBzcmMgOiB7fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBOZXZlciBtb3ZlIG9yaWdpbmFsIG9iamVjdHMsIGNsb25lIHRoZW1cblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGpRdWVyeS5leHRlbmQoIGRlZXAsIGNsb25lLCBjb3B5ICk7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgYnJpbmcgaW4gdW5kZWZpbmVkIHZhbHVlc1xuXHRcdFx0XHR9IGVsc2UgaWYgKCBjb3B5ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0dGFyZ2V0WyBuYW1lIF0gPSBjb3B5O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSBtb2RpZmllZCBvYmplY3Rcblx0cmV0dXJuIHRhcmdldDtcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBVbmlxdWUgZm9yIGVhY2ggY29weSBvZiBqUXVlcnkgb24gdGhlIHBhZ2Vcblx0ZXhwYW5kbzogXCJqUXVlcnlcIiArICggdmVyc2lvbiArIE1hdGgucmFuZG9tKCkgKS5yZXBsYWNlKCAvXFxEL2csIFwiXCIgKSxcblxuXHQvLyBBc3N1bWUgalF1ZXJ5IGlzIHJlYWR5IHdpdGhvdXQgdGhlIHJlYWR5IG1vZHVsZVxuXHRpc1JlYWR5OiB0cnVlLFxuXG5cdGVycm9yOiBmdW5jdGlvbiggbXNnICkge1xuXHRcdHRocm93IG5ldyBFcnJvciggbXNnICk7XG5cdH0sXG5cblx0bm9vcDogZnVuY3Rpb24oKSB7fSxcblxuXHRpc1BsYWluT2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBwcm90bywgQ3RvcjtcblxuXHRcdC8vIERldGVjdCBvYnZpb3VzIG5lZ2F0aXZlc1xuXHRcdC8vIFVzZSB0b1N0cmluZyBpbnN0ZWFkIG9mIGpRdWVyeS50eXBlIHRvIGNhdGNoIGhvc3Qgb2JqZWN0c1xuXHRcdGlmICggIW9iaiB8fCB0b1N0cmluZy5jYWxsKCBvYmogKSAhPT0gXCJbb2JqZWN0IE9iamVjdF1cIiApIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRwcm90byA9IGdldFByb3RvKCBvYmogKTtcblxuXHRcdC8vIE9iamVjdHMgd2l0aCBubyBwcm90b3R5cGUgKGUuZy4sIGBPYmplY3QuY3JlYXRlKCBudWxsIClgKSBhcmUgcGxhaW5cblx0XHRpZiAoICFwcm90byApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdC8vIE9iamVjdHMgd2l0aCBwcm90b3R5cGUgYXJlIHBsYWluIGlmZiB0aGV5IHdlcmUgY29uc3RydWN0ZWQgYnkgYSBnbG9iYWwgT2JqZWN0IGZ1bmN0aW9uXG5cdFx0Q3RvciA9IGhhc093bi5jYWxsKCBwcm90bywgXCJjb25zdHJ1Y3RvclwiICkgJiYgcHJvdG8uY29uc3RydWN0b3I7XG5cdFx0cmV0dXJuIHR5cGVvZiBDdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgZm5Ub1N0cmluZy5jYWxsKCBDdG9yICkgPT09IE9iamVjdEZ1bmN0aW9uU3RyaW5nO1xuXHR9LFxuXG5cdGlzRW1wdHlPYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXHRcdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9pc3N1ZXMvNjEyNVxuXHRcdHZhciBuYW1lO1xuXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0cnVlO1xuXHR9LFxuXG5cdC8vIEV2YWx1YXRlcyBhIHNjcmlwdCBpbiBhIGdsb2JhbCBjb250ZXh0XG5cdGdsb2JhbEV2YWw6IGZ1bmN0aW9uKCBjb2RlICkge1xuXHRcdERPTUV2YWwoIGNvZGUgKTtcblx0fSxcblxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjayApIHtcblx0XHR2YXIgbGVuZ3RoLCBpID0gMDtcblxuXHRcdGlmICggaXNBcnJheUxpa2UoIG9iaiApICkge1xuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjAgb25seVxuXHR0cmltOiBmdW5jdGlvbiggdGV4dCApIHtcblx0XHRyZXR1cm4gdGV4dCA9PSBudWxsID9cblx0XHRcdFwiXCIgOlxuXHRcdFx0KCB0ZXh0ICsgXCJcIiApLnJlcGxhY2UoIHJ0cmltLCBcIlwiICk7XG5cdH0sXG5cblx0Ly8gcmVzdWx0cyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYWtlQXJyYXk6IGZ1bmN0aW9uKCBhcnIsIHJlc3VsdHMgKSB7XG5cdFx0dmFyIHJldCA9IHJlc3VsdHMgfHwgW107XG5cblx0XHRpZiAoIGFyciAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBpc0FycmF5TGlrZSggT2JqZWN0KCBhcnIgKSApICkge1xuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIHJldCxcblx0XHRcdFx0XHR0eXBlb2YgYXJyID09PSBcInN0cmluZ1wiID9cblx0XHRcdFx0XHRbIGFyciBdIDogYXJyXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmNhbGwoIHJldCwgYXJyICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblxuXHRpbkFycmF5OiBmdW5jdGlvbiggZWxlbSwgYXJyLCBpICkge1xuXHRcdHJldHVybiBhcnIgPT0gbnVsbCA/IC0xIDogaW5kZXhPZi5jYWxsKCBhcnIsIGVsZW0sIGkgKTtcblx0fSxcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRtZXJnZTogZnVuY3Rpb24oIGZpcnN0LCBzZWNvbmQgKSB7XG5cdFx0dmFyIGxlbiA9ICtzZWNvbmQubGVuZ3RoLFxuXHRcdFx0aiA9IDAsXG5cdFx0XHRpID0gZmlyc3QubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBqIDwgbGVuOyBqKysgKSB7XG5cdFx0XHRmaXJzdFsgaSsrIF0gPSBzZWNvbmRbIGogXTtcblx0XHR9XG5cblx0XHRmaXJzdC5sZW5ndGggPSBpO1xuXG5cdFx0cmV0dXJuIGZpcnN0O1xuXHR9LFxuXG5cdGdyZXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGludmVydCApIHtcblx0XHR2YXIgY2FsbGJhY2tJbnZlcnNlLFxuXHRcdFx0bWF0Y2hlcyA9IFtdLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGgsXG5cdFx0XHRjYWxsYmFja0V4cGVjdCA9ICFpbnZlcnQ7XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgb25seSBzYXZpbmcgdGhlIGl0ZW1zXG5cdFx0Ly8gdGhhdCBwYXNzIHRoZSB2YWxpZGF0b3IgZnVuY3Rpb25cblx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdGNhbGxiYWNrSW52ZXJzZSA9ICFjYWxsYmFjayggZWxlbXNbIGkgXSwgaSApO1xuXHRcdFx0aWYgKCBjYWxsYmFja0ludmVyc2UgIT09IGNhbGxiYWNrRXhwZWN0ICkge1xuXHRcdFx0XHRtYXRjaGVzLnB1c2goIGVsZW1zWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbWF0Y2hlcztcblx0fSxcblxuXHQvLyBhcmcgaXMgZm9yIGludGVybmFsIHVzYWdlIG9ubHlcblx0bWFwOiBmdW5jdGlvbiggZWxlbXMsIGNhbGxiYWNrLCBhcmcgKSB7XG5cdFx0dmFyIGxlbmd0aCwgdmFsdWUsXG5cdFx0XHRpID0gMCxcblx0XHRcdHJldCA9IFtdO1xuXG5cdFx0Ly8gR28gdGhyb3VnaCB0aGUgYXJyYXksIHRyYW5zbGF0aW5nIGVhY2ggb2YgdGhlIGl0ZW1zIHRvIHRoZWlyIG5ldyB2YWx1ZXNcblx0XHRpZiAoIGlzQXJyYXlMaWtlKCBlbGVtcyApICkge1xuXHRcdFx0bGVuZ3RoID0gZWxlbXMubGVuZ3RoO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdHZhbHVlID0gY2FsbGJhY2soIGVsZW1zWyBpIF0sIGksIGFyZyApO1xuXG5cdFx0XHRcdGlmICggdmFsdWUgIT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXQucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gR28gdGhyb3VnaCBldmVyeSBrZXkgb24gdGhlIG9iamVjdCxcblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yICggaSBpbiBlbGVtcyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmxhdHRlbiBhbnkgbmVzdGVkIGFycmF5c1xuXHRcdHJldHVybiBjb25jYXQuYXBwbHkoIFtdLCByZXQgKTtcblx0fSxcblxuXHQvLyBBIGdsb2JhbCBHVUlEIGNvdW50ZXIgZm9yIG9iamVjdHNcblx0Z3VpZDogMSxcblxuXHQvLyBqUXVlcnkuc3VwcG9ydCBpcyBub3QgdXNlZCBpbiBDb3JlIGJ1dCBvdGhlciBwcm9qZWN0cyBhdHRhY2ggdGhlaXJcblx0Ly8gcHJvcGVydGllcyB0byBpdCBzbyBpdCBuZWVkcyB0byBleGlzdC5cblx0c3VwcG9ydDogc3VwcG9ydFxufSApO1xuXG5pZiAoIHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiApIHtcblx0alF1ZXJ5LmZuWyBTeW1ib2wuaXRlcmF0b3IgXSA9IGFyclsgU3ltYm9sLml0ZXJhdG9yIF07XG59XG5cbi8vIFBvcHVsYXRlIHRoZSBjbGFzczJ0eXBlIG1hcFxualF1ZXJ5LmVhY2goIFwiQm9vbGVhbiBOdW1iZXIgU3RyaW5nIEZ1bmN0aW9uIEFycmF5IERhdGUgUmVnRXhwIE9iamVjdCBFcnJvciBTeW1ib2xcIi5zcGxpdCggXCIgXCIgKSxcbmZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRjbGFzczJ0eXBlWyBcIltvYmplY3QgXCIgKyBuYW1lICsgXCJdXCIgXSA9IG5hbWUudG9Mb3dlckNhc2UoKTtcbn0gKTtcblxuZnVuY3Rpb24gaXNBcnJheUxpa2UoIG9iaiApIHtcblxuXHQvLyBTdXBwb3J0OiByZWFsIGlPUyA4LjIgb25seSAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9ICEhb2JqICYmIFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IHRvVHlwZSggb2JqICk7XG5cblx0aWYgKCBpc0Z1bmN0aW9uKCBvYmogKSB8fCBpc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0cmV0dXJuIHR5cGUgPT09IFwiYXJyYXlcIiB8fCBsZW5ndGggPT09IDAgfHxcblx0XHR0eXBlb2YgbGVuZ3RoID09PSBcIm51bWJlclwiICYmIGxlbmd0aCA+IDAgJiYgKCBsZW5ndGggLSAxICkgaW4gb2JqO1xufVxudmFyIFNpenpsZSA9XG4vKiFcbiAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuM1xuICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTYtMDgtMDhcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEluc3RhbmNlIG1ldGhvZHNcblx0aGFzT3duID0gKHt9KS5oYXNPd25Qcm9wZXJ0eSxcblx0YXJyID0gW10sXG5cdHBvcCA9IGFyci5wb3AsXG5cdHB1c2hfbmF0aXZlID0gYXJyLnB1c2gsXG5cdHB1c2ggPSBhcnIucHVzaCxcblx0c2xpY2UgPSBhcnIuc2xpY2UsXG5cdC8vIFVzZSBhIHN0cmlwcGVkLWRvd24gaW5kZXhPZiBhcyBpdCdzIGZhc3RlciB0aGFuIG5hdGl2ZVxuXHQvLyBodHRwczovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2Vcblx0d2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFwwLVxcXFx4YTBdKStcIixcblxuXHQvLyBBdHRyaWJ1dGUgc2VsZWN0b3JzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2F0dHJpYnV0ZS1zZWxlY3RvcnNcblx0YXR0cmlidXRlcyA9IFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooXCIgKyBpZGVudGlmaWVyICsgXCIpKD86XCIgKyB3aGl0ZXNwYWNlICtcblx0XHQvLyBPcGVyYXRvciAoY2FwdHVyZSAyKVxuXHRcdFwiKihbKl4kfCF+XT89KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gXCJBdHRyaWJ1dGUgdmFsdWVzIG11c3QgYmUgQ1NTIGlkZW50aWZpZXJzIFtjYXB0dXJlIDVdIG9yIHN0cmluZ3MgW2NhcHR1cmUgMyBvciBjYXB0dXJlIDRdXCJcblx0XHRcIiooPzonKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCJ8KFwiICsgaWRlbnRpZmllciArIFwiKSl8KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XCIqXFxcXF1cIixcblxuXHRwc2V1ZG9zID0gXCI6KFwiICsgaWRlbnRpZmllciArIFwiKSg/OlxcXFwoKFwiICtcblx0XHQvLyBUbyByZWR1Y2UgdGhlIG51bWJlciBvZiBzZWxlY3RvcnMgbmVlZGluZyB0b2tlbml6ZSBpbiB0aGUgcHJlRmlsdGVyLCBwcmVmZXIgYXJndW1lbnRzOlxuXHRcdC8vIDEuIHF1b3RlZCAoY2FwdHVyZSAzOyBjYXB0dXJlIDQgb3IgY2FwdHVyZSA1KVxuXHRcdFwiKCcoKD86XFxcXFxcXFwufFteXFxcXFxcXFwnXSkqKSd8XFxcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXFxcXCJdKSopXFxcIil8XCIgK1xuXHRcdC8vIDIuIHNpbXBsZSAoY2FwdHVyZSA2KVxuXHRcdFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcKClbXFxcXF1dfFwiICsgYXR0cmlidXRlcyArIFwiKSopfFwiICtcblx0XHQvLyAzLiBhbnl0aGluZyBlbHNlIChjYXB0dXJlIDIpXG5cdFx0XCIuKlwiICtcblx0XHRcIilcXFxcKXwpXCIsXG5cblx0Ly8gTGVhZGluZyBhbmQgbm9uLWVzY2FwZWQgdHJhaWxpbmcgd2hpdGVzcGFjZSwgY2FwdHVyaW5nIHNvbWUgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVycyBwcmVjZWRpbmcgdGhlIGxhdHRlclxuXHRyd2hpdGVzcGFjZSA9IG5ldyBSZWdFeHAoIHdoaXRlc3BhY2UgKyBcIitcIiwgXCJnXCIgKSxcblx0cnRyaW0gPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIit8KCg/Ol58W15cXFxcXFxcXF0pKD86XFxcXFxcXFwuKSopXCIgKyB3aGl0ZXNwYWNlICsgXCIrJFwiLCBcImdcIiApLFxuXG5cdHJjb21tYSA9IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKixcIiArIHdoaXRlc3BhY2UgKyBcIipcIiApLFxuXHRyY29tYmluYXRvcnMgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiooWz4rfl18XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblxuXHRyYXR0cmlidXRlUXVvdGVzID0gbmV3IFJlZ0V4cCggXCI9XCIgKyB3aGl0ZXNwYWNlICsgXCIqKFteXFxcXF0nXFxcIl0qPylcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcXVwiLCBcImdcIiApLFxuXG5cdHJwc2V1ZG8gPSBuZXcgUmVnRXhwKCBwc2V1ZG9zICksXG5cdHJpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCggXCJeXCIgKyBpZGVudGlmaWVyICsgXCIkXCIgKSxcblxuXHRtYXRjaEV4cHIgPSB7XG5cdFx0XCJJRFwiOiBuZXcgUmVnRXhwKCBcIl4jKFwiICsgaWRlbnRpZmllciArIFwiKVwiICksXG5cdFx0XCJDTEFTU1wiOiBuZXcgUmVnRXhwKCBcIl5cXFxcLihcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiVEFHXCI6IG5ldyBSZWdFeHAoIFwiXihcIiArIGlkZW50aWZpZXIgKyBcInxbKl0pXCIgKSxcblx0XHRcIkFUVFJcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBhdHRyaWJ1dGVzICksXG5cdFx0XCJQU0VVRE9cIjogbmV3IFJlZ0V4cCggXCJeXCIgKyBwc2V1ZG9zICksXG5cdFx0XCJDSElMRFwiOiBuZXcgUmVnRXhwKCBcIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcXFwoXCIgKyB3aGl0ZXNwYWNlICtcblx0XHRcdFwiKihldmVufG9kZHwoKFsrLV18KShcXFxcZCopbnwpXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86KFsrLV18KVwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooXFxcXGQrKXwpKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfClcIiwgXCJpXCIgKSxcblx0XHRcImJvb2xcIjogbmV3IFJlZ0V4cCggXCJeKD86XCIgKyBib29sZWFucyArIFwiKSRcIiwgXCJpXCIgKSxcblx0XHQvLyBGb3IgdXNlIGluIGxpYnJhcmllcyBpbXBsZW1lbnRpbmcgLmlzKClcblx0XHQvLyBXZSB1c2UgdGhpcyBmb3IgUE9TIG1hdGNoaW5nIGluIGBzZWxlY3RgXG5cdFx0XCJuZWVkc0NvbnRleHRcIjogbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqWz4rfl18OihldmVufG9kZHxlcXxndHxsdHxudGh8Zmlyc3R8bGFzdCkoPzpcXFxcKFwiICtcblx0XHRcdHdoaXRlc3BhY2UgKyBcIiooKD86LVxcXFxkKT9cXFxcZCopXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXCl8KSg/PVteLV18JClcIiwgXCJpXCIgKVxuXHR9LFxuXG5cdHJpbnB1dHMgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyaGVhZGVyID0gL15oXFxkJC9pLFxuXG5cdHJuYXRpdmUgPSAvXltee10rXFx7XFxzKlxcW25hdGl2ZSBcXHcvLFxuXG5cdC8vIEVhc2lseS1wYXJzZWFibGUvcmV0cmlldmFibGUgSUQgb3IgVEFHIG9yIENMQVNTIHNlbGVjdG9yc1xuXHRycXVpY2tFeHByID0gL14oPzojKFtcXHctXSspfChcXHcrKXxcXC4oW1xcdy1dKykpJC8sXG5cblx0cnNpYmxpbmcgPSAvWyt+XS8sXG5cblx0Ly8gQ1NTIGVzY2FwZXNcblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvQ1NTMjEvc3luZGF0YS5odG1sI2VzY2FwZWQtY2hhcmFjdGVyc1xuXHRydW5lc2NhcGUgPSBuZXcgUmVnRXhwKCBcIlxcXFxcXFxcKFtcXFxcZGEtZl17MSw2fVwiICsgd2hpdGVzcGFjZSArIFwiP3woXCIgKyB3aGl0ZXNwYWNlICsgXCIpfC4pXCIsIFwiaWdcIiApLFxuXHRmdW5lc2NhcGUgPSBmdW5jdGlvbiggXywgZXNjYXBlZCwgZXNjYXBlZFdoaXRlc3BhY2UgKSB7XG5cdFx0dmFyIGhpZ2ggPSBcIjB4XCIgKyBlc2NhcGVkIC0gMHgxMDAwMDtcblx0XHQvLyBOYU4gbWVhbnMgbm9uLWNvZGVwb2ludFxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3g8MjRcblx0XHQvLyBXb3JrYXJvdW5kIGVycm9uZW91cyBudW1lcmljIGludGVycHJldGF0aW9uIG9mICtcIjB4XCJcblx0XHRyZXR1cm4gaGlnaCAhPT0gaGlnaCB8fCBlc2NhcGVkV2hpdGVzcGFjZSA/XG5cdFx0XHRlc2NhcGVkIDpcblx0XHRcdGhpZ2ggPCAwID9cblx0XHRcdFx0Ly8gQk1QIGNvZGVwb2ludFxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoICsgMHgxMDAwMCApIDpcblx0XHRcdFx0Ly8gU3VwcGxlbWVudGFsIFBsYW5lIGNvZGVwb2ludCAoc3Vycm9nYXRlIHBhaXIpXG5cdFx0XHRcdFN0cmluZy5mcm9tQ2hhckNvZGUoIGhpZ2ggPj4gMTAgfCAweEQ4MDAsIGhpZ2ggJiAweDNGRiB8IDB4REMwMCApO1xuXHR9LFxuXG5cdC8vIENTUyBzdHJpbmcvaWRlbnRpZmllciBzZXJpYWxpemF0aW9uXG5cdC8vIGh0dHBzOi8vZHJhZnRzLmNzc3dnLm9yZy9jc3NvbS8jY29tbW9uLXNlcmlhbGl6aW5nLWlkaW9tc1xuXHRyY3NzZXNjYXBlID0gLyhbXFwwLVxceDFmXFx4N2ZdfF4tP1xcZCl8Xi0kfFteXFwwLVxceDFmXFx4N2YtXFx1RkZGRlxcdy1dL2csXG5cdGZjc3Nlc2NhcGUgPSBmdW5jdGlvbiggY2gsIGFzQ29kZVBvaW50ICkge1xuXHRcdGlmICggYXNDb2RlUG9pbnQgKSB7XG5cblx0XHRcdC8vIFUrMDAwMCBOVUxMIGJlY29tZXMgVStGRkZEIFJFUExBQ0VNRU5UIENIQVJBQ1RFUlxuXHRcdFx0aWYgKCBjaCA9PT0gXCJcXDBcIiApIHtcblx0XHRcdFx0cmV0dXJuIFwiXFx1RkZGRFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb250cm9sIGNoYXJhY3RlcnMgYW5kIChkZXBlbmRlbnQgdXBvbiBwb3NpdGlvbikgbnVtYmVycyBnZXQgZXNjYXBlZCBhcyBjb2RlIHBvaW50c1xuXHRcdFx0cmV0dXJuIGNoLnNsaWNlKCAwLCAtMSApICsgXCJcXFxcXCIgKyBjaC5jaGFyQ29kZUF0KCBjaC5sZW5ndGggLSAxICkudG9TdHJpbmcoIDE2ICkgKyBcIiBcIjtcblx0XHR9XG5cblx0XHQvLyBPdGhlciBwb3RlbnRpYWxseS1zcGVjaWFsIEFTQ0lJIGNoYXJhY3RlcnMgZ2V0IGJhY2tzbGFzaC1lc2NhcGVkXG5cdFx0cmV0dXJuIFwiXFxcXFwiICsgY2g7XG5cdH0sXG5cblx0Ly8gVXNlZCBmb3IgaWZyYW1lc1xuXHQvLyBTZWUgc2V0RG9jdW1lbnQoKVxuXHQvLyBSZW1vdmluZyB0aGUgZnVuY3Rpb24gd3JhcHBlciBjYXVzZXMgYSBcIlBlcm1pc3Npb24gRGVuaWVkXCJcblx0Ly8gZXJyb3IgaW4gSUVcblx0dW5sb2FkSGFuZGxlciA9IGZ1bmN0aW9uKCkge1xuXHRcdHNldERvY3VtZW50KCk7XG5cdH0sXG5cblx0ZGlzYWJsZWRBbmNlc3RvciA9IGFkZENvbWJpbmF0b3IoXG5cdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gdHJ1ZSAmJiAoXCJmb3JtXCIgaW4gZWxlbSB8fCBcImxhYmVsXCIgaW4gZWxlbSk7XG5cdFx0fSxcblx0XHR7IGRpcjogXCJwYXJlbnROb2RlXCIsIG5leHQ6IFwibGVnZW5kXCIgfVxuXHQpO1xuXG4vLyBPcHRpbWl6ZSBmb3IgcHVzaC5hcHBseSggXywgTm9kZUxpc3QgKVxudHJ5IHtcblx0cHVzaC5hcHBseShcblx0XHQoYXJyID0gc2xpY2UuY2FsbCggcHJlZmVycmVkRG9jLmNoaWxkTm9kZXMgKSksXG5cdFx0cHJlZmVycmVkRG9jLmNoaWxkTm9kZXNcblx0KTtcblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjBcblx0Ly8gRGV0ZWN0IHNpbGVudGx5IGZhaWxpbmcgcHVzaC5hcHBseVxuXHRhcnJbIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzLmxlbmd0aCBdLm5vZGVUeXBlO1xufSBjYXRjaCAoIGUgKSB7XG5cdHB1c2ggPSB7IGFwcGx5OiBhcnIubGVuZ3RoID9cblxuXHRcdC8vIExldmVyYWdlIHNsaWNlIGlmIHBvc3NpYmxlXG5cdFx0ZnVuY3Rpb24oIHRhcmdldCwgZWxzICkge1xuXHRcdFx0cHVzaF9uYXRpdmUuYXBwbHkoIHRhcmdldCwgc2xpY2UuY2FsbChlbHMpICk7XG5cdFx0fSA6XG5cblx0XHQvLyBTdXBwb3J0OiBJRTw5XG5cdFx0Ly8gT3RoZXJ3aXNlIGFwcGVuZCBkaXJlY3RseVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHZhciBqID0gdGFyZ2V0Lmxlbmd0aCxcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHQvLyBDYW4ndCB0cnVzdCBOb2RlTGlzdC5sZW5ndGhcblx0XHRcdHdoaWxlICggKHRhcmdldFtqKytdID0gZWxzW2krK10pICkge31cblx0XHRcdHRhcmdldC5sZW5ndGggPSBqIC0gMTtcblx0XHR9XG5cdH07XG59XG5cbmZ1bmN0aW9uIFNpenpsZSggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBtLCBpLCBlbGVtLCBuaWQsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblxuXHRcdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdH1cblx0XHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSBcImdldCpCeSpcIiBET00gbWV0aG9kXG5cdFx0XHQvLyAoZXhjZXB0aW5nIERvY3VtZW50RnJhZ21lbnQgY29udGV4dCwgd2hlcmUgdGhlIG1ldGhvZHMgZG9uJ3QgZXhpc3QpXG5cdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb2N1bWVudCBjb250ZXh0XG5cdFx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmIChlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSAmJlxuXHRcdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0XHQvLyBDbGFzcyBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiZcblx0XHRcdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggc3VwcG9ydC5xc2EgJiZcblx0XHRcdFx0IWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3RvcjtcblxuXHRcdFx0XHQvLyBxU0EgbG9va3Mgb3V0c2lkZSBFbGVtZW50IGNvbnRleHQsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnRcblx0XHRcdFx0Ly8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWVcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgb2JqZWN0IGVsZW1lbnRzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0aWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApKSApIHtcblx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByY3NzZXNjYXBlLCBmY3NzZXNjYXBlICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIChuaWQgPSBleHBhbmRvKSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0Z3JvdXBzW2ldID0gXCIjXCIgKyBuaWQgKyBcIiBcIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXHRcdC8vIFVzZSAoa2V5ICsgXCIgXCIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUpO1xuXHR9XG5cdHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBNYXJrIGEgZnVuY3Rpb24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGVsZW1lbnQgYW5kIHJldHVybnMgYSBib29sZWFuIHJlc3VsdFxuICovXG5mdW5jdGlvbiBhc3NlcnQoIGZuICkge1xuXHR2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZmllbGRzZXRcIik7XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gISFmbiggZWwgKTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fSBmaW5hbGx5IHtcblx0XHQvLyBSZW1vdmUgZnJvbSBpdHMgcGFyZW50IGJ5IGRlZmF1bHRcblx0XHRpZiAoIGVsLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRlbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBlbCApO1xuXHRcdH1cblx0XHQvLyByZWxlYXNlIG1lbW9yeSBpbiBJRVxuXHRcdGVsID0gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZFxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkge1xuXHR2YXIgYXJyID0gYXR0cnMuc3BsaXQoXCJ8XCIpLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdGEuc291cmNlSW5kZXggLSBiLnNvdXJjZUluZGV4O1xuXG5cdC8vIFVzZSBJRSBzb3VyY2VJbmRleCBpZiBhdmFpbGFibGUgb24gYm90aCBub2Rlc1xuXHRpZiAoIGRpZmYgKSB7XG5cdFx0cmV0dXJuIGRpZmY7XG5cdH1cblxuXHQvLyBDaGVjayBpZiBiIGZvbGxvd3MgYVxuXHRpZiAoIGN1ciApIHtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIubmV4dFNpYmxpbmcpICkge1xuXHRcdFx0aWYgKCBjdXIgPT09IGIgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gYSA/IDEgOiAtMTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGlucHV0IHR5cGVzXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZVxuICovXG5mdW5jdGlvbiBjcmVhdGVJbnB1dFBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgYnV0dG9uc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlQnV0dG9uUHNldWRvKCB0eXBlICkge1xuXHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0cmV0dXJuIChuYW1lID09PSBcImlucHV0XCIgfHwgbmFtZSA9PT0gXCJidXR0b25cIikgJiYgZWxlbS50eXBlID09PSB0eXBlO1xuXHR9O1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBmdW5jdGlvbiB0byB1c2UgaW4gcHNldWRvcyBmb3IgOmVuYWJsZWQvOmRpc2FibGVkXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGRpc2FibGVkIHRydWUgZm9yIDpkaXNhYmxlZDsgZmFsc2UgZm9yIDplbmFibGVkXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZURpc2FibGVkUHNldWRvKCBkaXNhYmxlZCApIHtcblxuXHQvLyBLbm93biA6ZGlzYWJsZWQgZmFsc2UgcG9zaXRpdmVzOiBmaWVsZHNldFtkaXNhYmxlZF0gPiBsZWdlbmQ6bnRoLW9mLXR5cGUobisyKSA6Y2FuLWRpc2FibGVcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gT25seSBjZXJ0YWluIGVsZW1lbnRzIGNhbiBtYXRjaCA6ZW5hYmxlZCBvciA6ZGlzYWJsZWRcblx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zY3JpcHRpbmcuaHRtbCNzZWxlY3Rvci1lbmFibGVkXG5cdFx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc2NyaXB0aW5nLmh0bWwjc2VsZWN0b3ItZGlzYWJsZWRcblx0XHRpZiAoIFwiZm9ybVwiIGluIGVsZW0gKSB7XG5cblx0XHRcdC8vIENoZWNrIGZvciBpbmhlcml0ZWQgZGlzYWJsZWRuZXNzIG9uIHJlbGV2YW50IG5vbi1kaXNhYmxlZCBlbGVtZW50czpcblx0XHRcdC8vICogbGlzdGVkIGZvcm0tYXNzb2NpYXRlZCBlbGVtZW50cyBpbiBhIGRpc2FibGVkIGZpZWxkc2V0XG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY2F0ZWdvcnktbGlzdGVkXG5cdFx0XHQvLyAgIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm1zLmh0bWwjY29uY2VwdC1mZS1kaXNhYmxlZFxuXHRcdFx0Ly8gKiBvcHRpb24gZWxlbWVudHMgaW4gYSBkaXNhYmxlZCBvcHRncm91cFxuXHRcdFx0Ly8gICBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3Jtcy5odG1sI2NvbmNlcHQtb3B0aW9uLWRpc2FibGVkXG5cdFx0XHQvLyBBbGwgc3VjaCBlbGVtZW50cyBoYXZlIGEgXCJmb3JtXCIgcHJvcGVydHkuXG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSAmJiBlbGVtLmRpc2FibGVkID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHQvLyBPcHRpb24gZWxlbWVudHMgZGVmZXIgdG8gYSBwYXJlbnQgb3B0Z3JvdXAgaWYgcHJlc2VudFxuXHRcdFx0XHRpZiAoIFwibGFiZWxcIiBpbiBlbGVtICkge1xuXHRcdFx0XHRcdGlmICggXCJsYWJlbFwiIGluIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLnBhcmVudE5vZGUuZGlzYWJsZWQgPT09IGRpc2FibGVkO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgNiAtIDExXG5cdFx0XHRcdC8vIFVzZSB0aGUgaXNEaXNhYmxlZCBzaG9ydGN1dCBwcm9wZXJ0eSB0byBjaGVjayBmb3IgZGlzYWJsZWQgZmllbGRzZXQgYW5jZXN0b3JzXG5cdFx0XHRcdHJldHVybiBlbGVtLmlzRGlzYWJsZWQgPT09IGRpc2FibGVkIHx8XG5cblx0XHRcdFx0XHQvLyBXaGVyZSB0aGVyZSBpcyBubyBpc0Rpc2FibGVkLCBjaGVjayBtYW51YWxseVxuXHRcdFx0XHRcdC8qIGpzaGludCAtVzAxOCAqL1xuXHRcdFx0XHRcdGVsZW0uaXNEaXNhYmxlZCAhPT0gIWRpc2FibGVkICYmXG5cdFx0XHRcdFx0XHRkaXNhYmxlZEFuY2VzdG9yKCBlbGVtICkgPT09IGRpc2FibGVkO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cblx0XHQvLyBUcnkgdG8gd2lubm93IG91dCBlbGVtZW50cyB0aGF0IGNhbid0IGJlIGRpc2FibGVkIGJlZm9yZSB0cnVzdGluZyB0aGUgZGlzYWJsZWQgcHJvcGVydHkuXG5cdFx0Ly8gU29tZSB2aWN0aW1zIGdldCBjYXVnaHQgaW4gb3VyIG5ldCAobGFiZWwsIGxlZ2VuZCwgbWVudSwgdHJhY2spLCBidXQgaXQgc2hvdWxkbid0XG5cdFx0Ly8gZXZlbiBleGlzdCBvbiB0aGVtLCBsZXQgYWxvbmUgaGF2ZSBhIGJvb2xlYW4gdmFsdWUuXG5cdFx0fSBlbHNlIGlmICggXCJsYWJlbFwiIGluIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5kaXNhYmxlZCA9PT0gZGlzYWJsZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gUmVtYWluaW5nIGVsZW1lbnRzIGFyZSBuZWl0aGVyIDplbmFibGVkIG5vciA6ZGlzYWJsZWRcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBwb3NpdGlvbmFsc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZm5cbiAqL1xuZnVuY3Rpb24gY3JlYXRlUG9zaXRpb25hbFBzZXVkbyggZm4gKSB7XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIGFyZ3VtZW50ICkge1xuXHRcdGFyZ3VtZW50ID0gK2FyZ3VtZW50O1xuXHRcdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIG1hdGNoZXMgKSB7XG5cdFx0XHR2YXIgaixcblx0XHRcdFx0bWF0Y2hJbmRleGVzID0gZm4oIFtdLCBzZWVkLmxlbmd0aCwgYXJndW1lbnQgKSxcblx0XHRcdFx0aSA9IG1hdGNoSW5kZXhlcy5sZW5ndGg7XG5cblx0XHRcdC8vIE1hdGNoIGVsZW1lbnRzIGZvdW5kIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlc1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggc2VlZFsgKGogPSBtYXRjaEluZGV4ZXNbaV0pIF0gKSB7XG5cdFx0XHRcdFx0c2VlZFtqXSA9ICEobWF0Y2hlc1tqXSA9IHNlZWRbal0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH0pO1xufVxuXG4vKipcbiAqIENoZWNrcyBhIG5vZGUgZm9yIHZhbGlkaXR5IGFzIGEgU2l6emxlIGNvbnRleHRcbiAqIEBwYXJhbSB7RWxlbWVudHxPYmplY3Q9fSBjb250ZXh0XG4gKiBAcmV0dXJucyB7RWxlbWVudHxPYmplY3R8Qm9vbGVhbn0gVGhlIGlucHV0IG5vZGUgaWYgYWNjZXB0YWJsZSwgb3RoZXJ3aXNlIGEgZmFsc3kgdmFsdWVcbiAqL1xuZnVuY3Rpb24gdGVzdENvbnRleHQoIGNvbnRleHQgKSB7XG5cdHJldHVybiBjb250ZXh0ICYmIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGNvbnRleHQ7XG59XG5cbi8vIEV4cG9zZSBzdXBwb3J0IHZhcnMgZm9yIGNvbnZlbmllbmNlXG5zdXBwb3J0ID0gU2l6emxlLnN1cHBvcnQgPSB7fTtcblxuLyoqXG4gKiBEZXRlY3RzIFhNTCBub2Rlc1xuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gZWxlbSBBbiBlbGVtZW50IG9yIGEgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtCb29sZWFufSBUcnVlIGlmZiBlbGVtIGlzIGEgbm9uLUhUTUwgWE1MIG5vZGVcbiAqL1xuaXNYTUwgPSBTaXp6bGUuaXNYTUwgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0Ly8gZG9jdW1lbnRFbGVtZW50IGlzIHZlcmlmaWVkIGZvciBjYXNlcyB3aGVyZSBpdCBkb2Vzbid0IHlldCBleGlzdFxuXHQvLyAoc3VjaCBhcyBsb2FkaW5nIGlmcmFtZXMgaW4gSUUgLSAjNDgzMylcblx0dmFyIGRvY3VtZW50RWxlbWVudCA9IGVsZW0gJiYgKGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtKS5kb2N1bWVudEVsZW1lbnQ7XG5cdHJldHVybiBkb2N1bWVudEVsZW1lbnQgPyBkb2N1bWVudEVsZW1lbnQubm9kZU5hbWUgIT09IFwiSFRNTFwiIDogZmFsc2U7XG59O1xuXG4vKipcbiAqIFNldHMgZG9jdW1lbnQtcmVsYXRlZCB2YXJpYWJsZXMgb25jZSBiYXNlZCBvbiB0aGUgY3VycmVudCBkb2N1bWVudFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdH0gW2RvY10gQW4gZWxlbWVudCBvciBkb2N1bWVudCBvYmplY3QgdG8gdXNlIHRvIHNldCB0aGUgZG9jdW1lbnRcbiAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGN1cnJlbnQgZG9jdW1lbnRcbiAqL1xuc2V0RG9jdW1lbnQgPSBTaXp6bGUuc2V0RG9jdW1lbnQgPSBmdW5jdGlvbiggbm9kZSApIHtcblx0dmFyIGhhc0NvbXBhcmUsIHN1YldpbmRvdyxcblx0XHRkb2MgPSBub2RlID8gbm9kZS5vd25lckRvY3VtZW50IHx8IG5vZGUgOiBwcmVmZXJyZWREb2M7XG5cblx0Ly8gUmV0dXJuIGVhcmx5IGlmIGRvYyBpcyBpbnZhbGlkIG9yIGFscmVhZHkgc2VsZWN0ZWRcblx0aWYgKCBkb2MgPT09IGRvY3VtZW50IHx8IGRvYy5ub2RlVHlwZSAhPT0gOSB8fCAhZG9jLmRvY3VtZW50RWxlbWVudCApIHtcblx0XHRyZXR1cm4gZG9jdW1lbnQ7XG5cdH1cblxuXHQvLyBVcGRhdGUgZ2xvYmFsIHZhcmlhYmxlc1xuXHRkb2N1bWVudCA9IGRvYztcblx0ZG9jRWxlbSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblx0ZG9jdW1lbnRJc0hUTUwgPSAhaXNYTUwoIGRvY3VtZW50ICk7XG5cblx0Ly8gU3VwcG9ydDogSUUgOS0xMSwgRWRnZVxuXHQvLyBBY2Nlc3NpbmcgaWZyYW1lIGRvY3VtZW50cyBhZnRlciB1bmxvYWQgdGhyb3dzIFwicGVybWlzc2lvbiBkZW5pZWRcIiBlcnJvcnMgKGpRdWVyeSAjMTM5MzYpXG5cdGlmICggcHJlZmVycmVkRG9jICE9PSBkb2N1bWVudCAmJlxuXHRcdChzdWJXaW5kb3cgPSBkb2N1bWVudC5kZWZhdWx0VmlldykgJiYgc3ViV2luZG93LnRvcCAhPT0gc3ViV2luZG93ICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgMTEsIEVkZ2Vcblx0XHRpZiAoIHN1YldpbmRvdy5hZGRFdmVudExpc3RlbmVyICkge1xuXHRcdFx0c3ViV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIFwidW5sb2FkXCIsIHVubG9hZEhhbmRsZXIsIGZhbHNlICk7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTAgb25seVxuXHRcdH0gZWxzZSBpZiAoIHN1YldpbmRvdy5hdHRhY2hFdmVudCApIHtcblx0XHRcdHN1YldpbmRvdy5hdHRhY2hFdmVudCggXCJvbnVubG9hZFwiLCB1bmxvYWRIYW5kbGVyICk7XG5cdFx0fVxuXHR9XG5cblx0LyogQXR0cmlidXRlc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gU3VwcG9ydDogSUU8OFxuXHQvLyBWZXJpZnkgdGhhdCBnZXRBdHRyaWJ1dGUgcmVhbGx5IHJldHVybnMgYXR0cmlidXRlcyBhbmQgbm90IHByb3BlcnRpZXNcblx0Ly8gKGV4Y2VwdGluZyBJRTggYm9vbGVhbnMpXG5cdHN1cHBvcnQuYXR0cmlidXRlcyA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuY2xhc3NOYW1lID0gXCJpXCI7XG5cdFx0cmV0dXJuICFlbC5nZXRBdHRyaWJ1dGUoXCJjbGFzc05hbWVcIik7XG5cdH0pO1xuXG5cdC8qIGdldEVsZW1lbnQocylCeSpcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIENoZWNrIGlmIGdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKSByZXR1cm5zIG9ubHkgZWxlbWVudHNcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5VGFnTmFtZSA9IGFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdFx0ZWwuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoXCJcIikgKTtcblx0XHRyZXR1cm4gIWVsLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiKlwiKS5sZW5ndGg7XG5cdH0pO1xuXG5cdC8vIFN1cHBvcnQ6IElFPDlcblx0c3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICk7XG5cblx0Ly8gU3VwcG9ydDogSUU8MTBcblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudEJ5SWQgcmV0dXJucyBlbGVtZW50cyBieSBuYW1lXG5cdC8vIFRoZSBicm9rZW4gZ2V0RWxlbWVudEJ5SWQgbWV0aG9kcyBkb24ndCBwaWNrIHVwIHByb2dyYW1tYXRpY2FsbHktc2V0IG5hbWVzLFxuXHQvLyBzbyB1c2UgYSByb3VuZGFib3V0IGdldEVsZW1lbnRzQnlOYW1lIHRlc3Rcblx0c3VwcG9ydC5nZXRCeUlkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmlsdGVyIGFuZCBmaW5kXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmlsdGVyW1wiSURcIl0gPSBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKFwiaWRcIikgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0XHRFeHByLmZpbmRbXCJJRFwiXSA9IGZ1bmN0aW9uKCBpZCwgY29udGV4dCApIHtcblx0XHRcdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQgIT09IFwidW5kZWZpbmVkXCIgJiYgZG9jdW1lbnRJc0hUTUwgKSB7XG5cdFx0XHRcdHZhciBlbGVtID0gY29udGV4dC5nZXRFbGVtZW50QnlJZCggaWQgKTtcblx0XHRcdFx0cmV0dXJuIGVsZW0gPyBbIGVsZW0gXSA6IFtdO1xuXHRcdFx0fVxuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDYgLSA3IG9ubHlcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0RXhwci5maW5kW1wiSURcIl0gPSBmdW5jdGlvbiggaWQsIGNvbnRleHQgKSB7XG5cdFx0XHRpZiAoIHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRCeUlkICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0XHR2YXIgbm9kZSwgaSwgZWxlbXMsXG5cdFx0XHRcdFx0ZWxlbSA9IGNvbnRleHQuZ2V0RWxlbWVudEJ5SWQoIGlkICk7XG5cblx0XHRcdFx0aWYgKCBlbGVtICkge1xuXG5cdFx0XHRcdFx0Ly8gVmVyaWZ5IHRoZSBpZCBhdHRyaWJ1dGVcblx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdFx0aWYgKCBub2RlICYmIG5vZGUudmFsdWUgPT09IGlkICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIFsgZWxlbSBdO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEZhbGwgYmFjayBvbiBnZXRFbGVtZW50c0J5TmFtZVxuXHRcdFx0XHRcdGVsZW1zID0gY29udGV4dC5nZXRFbGVtZW50c0J5TmFtZSggaWQgKTtcblx0XHRcdFx0XHRpID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbXNbaSsrXSkgKSB7XG5cdFx0XHRcdFx0XHRub2RlID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUgJiYgbm9kZS52YWx1ZSA9PT0gaWQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBbIGVsZW0gXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHBzOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xMzM3OFxuXHRyYnVnZ3lRU0EgPSBbXTtcblxuXHRpZiAoIChzdXBwb3J0LnFzYSA9IHJuYXRpdmUudGVzdCggZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCApKSApIHtcblx0XHQvLyBCdWlsZCBRU0EgcmVnZXhcblx0XHQvLyBSZWdleCBzdHJhdGVneSBhZG9wdGVkIGZyb20gRGllZ28gUGVyaW5pXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEyMzU5XG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvaGg0NjUzODguYXNweCNhdHRyaWJ1dGVfc2VjdGlvblxuXHRcdFx0aWYgKCBlbC5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbc2VsZWN0ZWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwiXFxcXFtcIiArIHdoaXRlc3BhY2UgKyBcIiooPzp2YWx1ZXxcIiArIGJvb2xlYW5zICsgXCIpXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lPDI5LCBBbmRyb2lkPDQuNCwgU2FmYXJpPDcuMCssIGlPUzw3LjArLCBQaGFudG9tSlM8MS45LjgrXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKCBcIltpZH49XCIgKyBleHBhbmRvICsgXCItXVwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIn49XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXZWJraXQvT3BlcmEgLSA6Y2hlY2tlZCBzaG91bGQgcmV0dXJuIHNlbGVjdGVkIG9wdGlvbiBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoICFlbC5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2libGluZy1jb21iaW5hdG9yIHNlbGVjdG9yYCBmYWlsc1xuXHRcdFx0aWYgKCAhZWwucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZWwgKSB7XG5cdFx0XHRlbC5pbm5lckhUTUwgPSBcIjxhIGhyZWY9JycgZGlzYWJsZWQ9J2Rpc2FibGVkJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD5cIjtcblxuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGVsLmFwcGVuZENoaWxkKCBpbnB1dCApLnNldEF0dHJpYnV0ZSggXCJuYW1lXCIsIFwiRFwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOFxuXHRcdFx0Ly8gRW5mb3JjZSBjYXNlLXNlbnNpdGl2aXR5IG9mIG5hbWUgYXR0cmlidXRlXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbbmFtZT1kXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIm5hbWVcIiArIHdoaXRlc3BhY2UgKyBcIipbKl4kfCF+XT89XCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRkYgMy41IC0gOmVuYWJsZWQvOmRpc2FibGVkIGFuZCBoaWRkZW4gZWxlbWVudHMgKGhpZGRlbiBlbGVtZW50cyBhcmUgc3RpbGwgZW5hYmxlZClcblx0XHRcdC8vIElFOCB0aHJvd3MgZXJyb3IgaGVyZSBhbmQgd2lsbCBub3Qgc2VlIGxhdGVyIHRlc3RzXG5cdFx0XHRpZiAoIGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCI6ZW5hYmxlZFwiKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3VwcG9ydDogSUU5LTExK1xuXHRcdFx0Ly8gSUUncyA6ZGlzYWJsZWQgc2VsZWN0b3IgZG9lcyBub3QgcGljayB1cCB0aGUgY2hpbGRyZW4gb2YgZGlzYWJsZWQgZmllbGRzZXRzXG5cdFx0XHRkb2NFbGVtLmFwcGVuZENoaWxkKCBlbCApLmRpc2FibGVkID0gdHJ1ZTtcblx0XHRcdGlmICggZWwucXVlcnlTZWxlY3RvckFsbChcIjpkaXNhYmxlZFwiKS5sZW5ndGggIT09IDIgKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIjplbmFibGVkXCIsIFwiOmRpc2FibGVkXCIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3BlcmEgMTAtMTEgZG9lcyBub3QgdGhyb3cgb24gcG9zdC1jb21tYSBpbnZhbGlkIHBzZXVkb3Ncblx0XHRcdGVsLnF1ZXJ5U2VsZWN0b3JBbGwoXCIqLDp4XCIpO1xuXHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIsLio6XCIpO1xuXHRcdH0pO1xuXHR9XG5cblx0aWYgKCAoc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgPSBybmF0aXZlLnRlc3QoIChtYXRjaGVzID0gZG9jRWxlbS5tYXRjaGVzIHx8XG5cdFx0ZG9jRWxlbS53ZWJraXRNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRkb2NFbGVtLm1vek1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ub01hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubXNNYXRjaGVzU2VsZWN0b3IpICkpICkge1xuXG5cdFx0YXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGVsLCBcIipcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGVsLCBcIltzIT0nJ106eFwiICk7XG5cdFx0XHRyYnVnZ3lNYXRjaGVzLnB1c2goIFwiIT1cIiwgcHNldWRvcyApO1xuXHRcdH0pO1xuXHR9XG5cblx0cmJ1Z2d5UVNBID0gcmJ1Z2d5UVNBLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lRU0Euam9pbihcInxcIikgKTtcblx0cmJ1Z2d5TWF0Y2hlcyA9IHJidWdneU1hdGNoZXMubGVuZ3RoICYmIG5ldyBSZWdFeHAoIHJidWdneU1hdGNoZXMuam9pbihcInxcIikgKTtcblxuXHQvKiBDb250YWluc1xuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cdGhhc0NvbXBhcmUgPSBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29tcGFyZURvY3VtZW50UG9zaXRpb24gKTtcblxuXHQvLyBFbGVtZW50IGNvbnRhaW5zIGFub3RoZXJcblx0Ly8gUHVycG9zZWZ1bGx5IHNlbGYtZXhjbHVzaXZlXG5cdC8vIEFzIGluLCBhbiBlbGVtZW50IGRvZXMgbm90IGNvbnRhaW4gaXRzZWxmXG5cdGNvbnRhaW5zID0gaGFzQ29tcGFyZSB8fCBybmF0aXZlLnRlc3QoIGRvY0VsZW0uY29udGFpbnMgKSA/XG5cdFx0ZnVuY3Rpb24oIGEsIGIgKSB7XG5cdFx0XHR2YXIgYWRvd24gPSBhLm5vZGVUeXBlID09PSA5ID8gYS5kb2N1bWVudEVsZW1lbnQgOiBhLFxuXHRcdFx0XHRidXAgPSBiICYmIGIucGFyZW50Tm9kZTtcblx0XHRcdHJldHVybiBhID09PSBidXAgfHwgISEoIGJ1cCAmJiBidXAubm9kZVR5cGUgPT09IDEgJiYgKFxuXHRcdFx0XHRhZG93bi5jb250YWlucyA/XG5cdFx0XHRcdFx0YWRvd24uY29udGFpbnMoIGJ1cCApIDpcblx0XHRcdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICYmIGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGJ1cCApICYgMTZcblx0XHRcdCkpO1xuXHRcdH0gOlxuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0aWYgKCBiICkge1xuXHRcdFx0XHR3aGlsZSAoIChiID0gYi5wYXJlbnROb2RlKSApIHtcblx0XHRcdFx0XHRpZiAoIGIgPT09IGEgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xuXG5cdC8qIFNvcnRpbmdcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIERvY3VtZW50IG9yZGVyIHNvcnRpbmdcblx0c29ydE9yZGVyID0gaGFzQ29tcGFyZSA/XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXG5cdFx0Ly8gRmxhZyBmb3IgZHVwbGljYXRlIHJlbW92YWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0Ly8gU29ydCBvbiBtZXRob2QgZXhpc3RlbmNlIGlmIG9ubHkgb25lIGlucHV0IGhhcyBjb21wYXJlRG9jdW1lbnRQb3NpdGlvblxuXHRcdHZhciBjb21wYXJlID0gIWEuY29tcGFyZURvY3VtZW50UG9zaXRpb24gLSAhYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbjtcblx0XHRpZiAoIGNvbXBhcmUgKSB7XG5cdFx0XHRyZXR1cm4gY29tcGFyZTtcblx0XHR9XG5cblx0XHQvLyBDYWxjdWxhdGUgcG9zaXRpb24gaWYgYm90aCBpbnB1dHMgYmVsb25nIHRvIHRoZSBzYW1lIGRvY3VtZW50XG5cdFx0Y29tcGFyZSA9ICggYS5vd25lckRvY3VtZW50IHx8IGEgKSA9PT0gKCBiLm93bmVyRG9jdW1lbnQgfHwgYiApID9cblx0XHRcdGEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGIgKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSB3ZSBrbm93IHRoZXkgYXJlIGRpc2Nvbm5lY3RlZFxuXHRcdFx0MTtcblxuXHRcdC8vIERpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdGlmICggY29tcGFyZSAmIDEgfHxcblx0XHRcdCghc3VwcG9ydC5zb3J0RGV0YWNoZWQgJiYgYi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggYSApID09PSBjb21wYXJlKSApIHtcblxuXHRcdFx0Ly8gQ2hvb3NlIHRoZSBmaXJzdCBlbGVtZW50IHRoYXQgaXMgcmVsYXRlZCB0byBvdXIgcHJlZmVycmVkIGRvY3VtZW50XG5cdFx0XHRpZiAoIGEgPT09IGRvY3VtZW50IHx8IGEub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYSkgKSB7XG5cdFx0XHRcdHJldHVybiAtMTtcblx0XHRcdH1cblx0XHRcdGlmICggYiA9PT0gZG9jdW1lbnQgfHwgYi5vd25lckRvY3VtZW50ID09PSBwcmVmZXJyZWREb2MgJiYgY29udGFpbnMocHJlZmVycmVkRG9jLCBiKSApIHtcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1haW50YWluIG9yaWdpbmFsIG9yZGVyXG5cdFx0XHRyZXR1cm4gc29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb21wYXJlICYgNCA/IC0xIDogMTtcblx0fSA6XG5cdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGVzIGFyZSBpZGVudGljYWxcblx0XHRpZiAoIGEgPT09IGIgKSB7XG5cdFx0XHRoYXNEdXBsaWNhdGUgPSB0cnVlO1xuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0dmFyIGN1cixcblx0XHRcdGkgPSAwLFxuXHRcdFx0YXVwID0gYS5wYXJlbnROb2RlLFxuXHRcdFx0YnVwID0gYi5wYXJlbnROb2RlLFxuXHRcdFx0YXAgPSBbIGEgXSxcblx0XHRcdGJwID0gWyBiIF07XG5cblx0XHQvLyBQYXJlbnRsZXNzIG5vZGVzIGFyZSBlaXRoZXIgZG9jdW1lbnRzIG9yIGRpc2Nvbm5lY3RlZFxuXHRcdGlmICggIWF1cCB8fCAhYnVwICkge1xuXHRcdFx0cmV0dXJuIGEgPT09IGRvY3VtZW50ID8gLTEgOlxuXHRcdFx0XHRiID09PSBkb2N1bWVudCA/IDEgOlxuXHRcdFx0XHRhdXAgPyAtMSA6XG5cdFx0XHRcdGJ1cCA/IDEgOlxuXHRcdFx0XHRzb3J0SW5wdXQgP1xuXHRcdFx0XHQoIGluZGV4T2YoIHNvcnRJbnB1dCwgYSApIC0gaW5kZXhPZiggc29ydElucHV0LCBiICkgKSA6XG5cdFx0XHRcdDA7XG5cblx0XHQvLyBJZiB0aGUgbm9kZXMgYXJlIHNpYmxpbmdzLCB3ZSBjYW4gZG8gYSBxdWljayBjaGVja1xuXHRcdH0gZWxzZSBpZiAoIGF1cCA9PT0gYnVwICkge1xuXHRcdFx0cmV0dXJuIHNpYmxpbmdDaGVjayggYSwgYiApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSB3ZSBuZWVkIGZ1bGwgbGlzdHMgb2YgdGhlaXIgYW5jZXN0b3JzIGZvciBjb21wYXJpc29uXG5cdFx0Y3VyID0gYTtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRhcC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cdFx0Y3VyID0gYjtcblx0XHR3aGlsZSAoIChjdXIgPSBjdXIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRicC51bnNoaWZ0KCBjdXIgKTtcblx0XHR9XG5cblx0XHQvLyBXYWxrIGRvd24gdGhlIHRyZWUgbG9va2luZyBmb3IgYSBkaXNjcmVwYW5jeVxuXHRcdHdoaWxlICggYXBbaV0gPT09IGJwW2ldICkge1xuXHRcdFx0aSsrO1xuXHRcdH1cblxuXHRcdHJldHVybiBpID9cblx0XHRcdC8vIERvIGEgc2libGluZyBjaGVjayBpZiB0aGUgbm9kZXMgaGF2ZSBhIGNvbW1vbiBhbmNlc3RvclxuXHRcdFx0c2libGluZ0NoZWNrKCBhcFtpXSwgYnBbaV0gKSA6XG5cblx0XHRcdC8vIE90aGVyd2lzZSBub2RlcyBpbiBvdXIgZG9jdW1lbnQgc29ydCBmaXJzdFxuXHRcdFx0YXBbaV0gPT09IHByZWZlcnJlZERvYyA/IC0xIDpcblx0XHRcdGJwW2ldID09PSBwcmVmZXJyZWREb2MgPyAxIDpcblx0XHRcdDA7XG5cdH07XG5cblx0cmV0dXJuIGRvY3VtZW50O1xufTtcblxuU2l6emxlLm1hdGNoZXMgPSBmdW5jdGlvbiggZXhwciwgZWxlbWVudHMgKSB7XG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIG51bGwsIG51bGwsIGVsZW1lbnRzICk7XG59O1xuXG5TaXp6bGUubWF0Y2hlc1NlbGVjdG9yID0gZnVuY3Rpb24oIGVsZW0sIGV4cHIgKSB7XG5cdC8vIFNldCBkb2N1bWVudCB2YXJzIGlmIG5lZWRlZFxuXHRpZiAoICggZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0gKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0fVxuXG5cdC8vIE1ha2Ugc3VyZSB0aGF0IGF0dHJpYnV0ZSBzZWxlY3RvcnMgYXJlIHF1b3RlZFxuXHRleHByID0gZXhwci5yZXBsYWNlKCByYXR0cmlidXRlUXVvdGVzLCBcIj0nJDEnXVwiICk7XG5cblx0aWYgKCBzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciAmJiBkb2N1bWVudElzSFRNTCAmJlxuXHRcdCFjb21waWxlckNhY2hlWyBleHByICsgXCIgXCIgXSAmJlxuXHRcdCggIXJidWdneU1hdGNoZXMgfHwgIXJidWdneU1hdGNoZXMudGVzdCggZXhwciApICkgJiZcblx0XHQoICFyYnVnZ3lRU0EgICAgIHx8ICFyYnVnZ3lRU0EudGVzdCggZXhwciApICkgKSB7XG5cblx0XHR0cnkge1xuXHRcdFx0dmFyIHJldCA9IG1hdGNoZXMuY2FsbCggZWxlbSwgZXhwciApO1xuXG5cdFx0XHQvLyBJRSA5J3MgbWF0Y2hlc1NlbGVjdG9yIHJldHVybnMgZmFsc2Ugb24gZGlzY29ubmVjdGVkIG5vZGVzXG5cdFx0XHRpZiAoIHJldCB8fCBzdXBwb3J0LmRpc2Nvbm5lY3RlZE1hdGNoIHx8XG5cdFx0XHRcdFx0Ly8gQXMgd2VsbCwgZGlzY29ubmVjdGVkIG5vZGVzIGFyZSBzYWlkIHRvIGJlIGluIGEgZG9jdW1lbnRcblx0XHRcdFx0XHQvLyBmcmFnbWVudCBpbiBJRSA5XG5cdFx0XHRcdFx0ZWxlbS5kb2N1bWVudCAmJiBlbGVtLmRvY3VtZW50Lm5vZGVUeXBlICE9PSAxMSApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblx0XHR9IGNhdGNoIChlKSB7fVxuXHR9XG5cblx0cmV0dXJuIFNpenpsZSggZXhwciwgZG9jdW1lbnQsIG51bGwsIFsgZWxlbSBdICkubGVuZ3RoID4gMDtcbn07XG5cblNpenpsZS5jb250YWlucyA9IGZ1bmN0aW9uKCBjb250ZXh0LCBlbGVtICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0ICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBjb250ZXh0ICk7XG5cdH1cblx0cmV0dXJuIGNvbnRhaW5zKCBjb250ZXh0LCBlbGVtICk7XG59O1xuXG5TaXp6bGUuYXR0ciA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHR2YXIgZm4gPSBFeHByLmF0dHJIYW5kbGVbIG5hbWUudG9Mb3dlckNhc2UoKSBdLFxuXHRcdC8vIERvbid0IGdldCBmb29sZWQgYnkgT2JqZWN0LnByb3RvdHlwZSBwcm9wZXJ0aWVzIChqUXVlcnkgIzEzODA3KVxuXHRcdHZhbCA9IGZuICYmIGhhc093bi5jYWxsKCBFeHByLmF0dHJIYW5kbGUsIG5hbWUudG9Mb3dlckNhc2UoKSApID9cblx0XHRcdGZuKCBlbGVtLCBuYW1lLCAhZG9jdW1lbnRJc0hUTUwgKSA6XG5cdFx0XHR1bmRlZmluZWQ7XG5cblx0cmV0dXJuIHZhbCAhPT0gdW5kZWZpbmVkID9cblx0XHR2YWwgOlxuXHRcdHN1cHBvcnQuYXR0cmlidXRlcyB8fCAhZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKSA6XG5cdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpKSAmJiB2YWwuc3BlY2lmaWVkID9cblx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcbn07XG5cblNpenpsZS5lc2NhcGUgPSBmdW5jdGlvbiggc2VsICkge1xuXHRyZXR1cm4gKHNlbCArIFwiXCIpLnJlcGxhY2UoIHJjc3Nlc2NhcGUsIGZjc3Nlc2NhcGUgKTtcbn07XG5cblNpenpsZS5lcnJvciA9IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdHRocm93IG5ldyBFcnJvciggXCJTeW50YXggZXJyb3IsIHVucmVjb2duaXplZCBleHByZXNzaW9uOiBcIiArIG1zZyApO1xufTtcblxuLyoqXG4gKiBEb2N1bWVudCBzb3J0aW5nIGFuZCByZW1vdmluZyBkdXBsaWNhdGVzXG4gKiBAcGFyYW0ge0FycmF5TGlrZX0gcmVzdWx0c1xuICovXG5TaXp6bGUudW5pcXVlU29ydCA9IGZ1bmN0aW9uKCByZXN1bHRzICkge1xuXHR2YXIgZWxlbSxcblx0XHRkdXBsaWNhdGVzID0gW10sXG5cdFx0aiA9IDAsXG5cdFx0aSA9IDA7XG5cblx0Ly8gVW5sZXNzIHdlICprbm93KiB3ZSBjYW4gZGV0ZWN0IGR1cGxpY2F0ZXMsIGFzc3VtZSB0aGVpciBwcmVzZW5jZVxuXHRoYXNEdXBsaWNhdGUgPSAhc3VwcG9ydC5kZXRlY3REdXBsaWNhdGVzO1xuXHRzb3J0SW5wdXQgPSAhc3VwcG9ydC5zb3J0U3RhYmxlICYmIHJlc3VsdHMuc2xpY2UoIDAgKTtcblx0cmVzdWx0cy5zb3J0KCBzb3J0T3JkZXIgKTtcblxuXHRpZiAoIGhhc0R1cGxpY2F0ZSApIHtcblx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdGlmICggZWxlbSA9PT0gcmVzdWx0c1sgaSBdICkge1xuXHRcdFx0XHRqID0gZHVwbGljYXRlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0cmVzdWx0cy5zcGxpY2UoIGR1cGxpY2F0ZXNbIGogXSwgMSApO1xuXHRcdH1cblx0fVxuXG5cdC8vIENsZWFyIGlucHV0IGFmdGVyIHNvcnRpbmcgdG8gcmVsZWFzZSBvYmplY3RzXG5cdC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L3NpenpsZS9wdWxsLzIyNVxuXHRzb3J0SW5wdXQgPSBudWxsO1xuXG5cdHJldHVybiByZXN1bHRzO1xufTtcblxuLyoqXG4gKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciByZXRyaWV2aW5nIHRoZSB0ZXh0IHZhbHVlIG9mIGFuIGFycmF5IG9mIERPTSBub2Rlc1xuICogQHBhcmFtIHtBcnJheXxFbGVtZW50fSBlbGVtXG4gKi9cbmdldFRleHQgPSBTaXp6bGUuZ2V0VGV4dCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHR2YXIgbm9kZSxcblx0XHRyZXQgPSBcIlwiLFxuXHRcdGkgPSAwLFxuXHRcdG5vZGVUeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRpZiAoICFub2RlVHlwZSApIHtcblx0XHQvLyBJZiBubyBub2RlVHlwZSwgdGhpcyBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheVxuXHRcdHdoaWxlICggKG5vZGUgPSBlbGVtW2krK10pICkge1xuXHRcdFx0Ly8gRG8gbm90IHRyYXZlcnNlIGNvbW1lbnQgbm9kZXNcblx0XHRcdHJldCArPSBnZXRUZXh0KCBub2RlICk7XG5cdFx0fVxuXHR9IGVsc2UgaWYgKCBub2RlVHlwZSA9PT0gMSB8fCBub2RlVHlwZSA9PT0gOSB8fCBub2RlVHlwZSA9PT0gMTEgKSB7XG5cdFx0Ly8gVXNlIHRleHRDb250ZW50IGZvciBlbGVtZW50c1xuXHRcdC8vIGlubmVyVGV4dCB1c2FnZSByZW1vdmVkIGZvciBjb25zaXN0ZW5jeSBvZiBuZXcgbGluZXMgKGpRdWVyeSAjMTExNTMpXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS50ZXh0Q29udGVudCA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLnRleHRDb250ZW50O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBUcmF2ZXJzZSBpdHMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRyZXQgKz0gZ2V0VGV4dCggZWxlbSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDMgfHwgbm9kZVR5cGUgPT09IDQgKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVZhbHVlO1xuXHR9XG5cdC8vIERvIG5vdCBpbmNsdWRlIGNvbW1lbnQgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBub2Rlc1xuXG5cdHJldHVybiByZXQ7XG59O1xuXG5FeHByID0gU2l6emxlLnNlbGVjdG9ycyA9IHtcblxuXHQvLyBDYW4gYmUgYWRqdXN0ZWQgYnkgdGhlIHVzZXJcblx0Y2FjaGVMZW5ndGg6IDUwLFxuXG5cdGNyZWF0ZVBzZXVkbzogbWFya0Z1bmN0aW9uLFxuXG5cdG1hdGNoOiBtYXRjaEV4cHIsXG5cblx0YXR0ckhhbmRsZToge30sXG5cblx0ZmluZDoge30sXG5cblx0cmVsYXRpdmU6IHtcblx0XHRcIj5cIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiIFwiOiB7IGRpcjogXCJwYXJlbnROb2RlXCIgfSxcblx0XHRcIitcIjogeyBkaXI6IFwicHJldmlvdXNTaWJsaW5nXCIsIGZpcnN0OiB0cnVlIH0sXG5cdFx0XCJ+XCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiIH1cblx0fSxcblxuXHRwcmVGaWx0ZXI6IHtcblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHQvLyBNb3ZlIHRoZSBnaXZlbiB2YWx1ZSB0byBtYXRjaFszXSB3aGV0aGVyIHF1b3RlZCBvciB1bnF1b3RlZFxuXHRcdFx0bWF0Y2hbM10gPSAoIG1hdGNoWzNdIHx8IG1hdGNoWzRdIHx8IG1hdGNoWzVdIHx8IFwiXCIgKS5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzJdID09PSBcIn49XCIgKSB7XG5cdFx0XHRcdG1hdGNoWzNdID0gXCIgXCIgKyBtYXRjaFszXSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDQgKTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHQvKiBtYXRjaGVzIGZyb20gbWF0Y2hFeHByW1wiQ0hJTERcIl1cblx0XHRcdFx0MSB0eXBlIChvbmx5fG50aHwuLi4pXG5cdFx0XHRcdDIgd2hhdCAoY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0MyBhcmd1bWVudCAoZXZlbnxvZGR8XFxkKnxcXGQqbihbKy1dXFxkKyk/fC4uLilcblx0XHRcdFx0NCB4bi1jb21wb25lbnQgb2YgeG4reSBhcmd1bWVudCAoWystXT9cXGQqbnwpXG5cdFx0XHRcdDUgc2lnbiBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NiB4IG9mIHhuLWNvbXBvbmVudFxuXHRcdFx0XHQ3IHNpZ24gb2YgeS1jb21wb25lbnRcblx0XHRcdFx0OCB5IG9mIHktY29tcG9uZW50XG5cdFx0XHQqL1xuXHRcdFx0bWF0Y2hbMV0gPSBtYXRjaFsxXS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0XHRpZiAoIG1hdGNoWzFdLnNsaWNlKCAwLCAzICkgPT09IFwibnRoXCIgKSB7XG5cdFx0XHRcdC8vIG50aC0qIHJlcXVpcmVzIGFyZ3VtZW50XG5cdFx0XHRcdGlmICggIW1hdGNoWzNdICkge1xuXHRcdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIG51bWVyaWMgeCBhbmQgeSBwYXJhbWV0ZXJzIGZvciBFeHByLmZpbHRlci5DSElMRFxuXHRcdFx0XHQvLyByZW1lbWJlciB0aGF0IGZhbHNlL3RydWUgY2FzdCByZXNwZWN0aXZlbHkgdG8gMC8xXG5cdFx0XHRcdG1hdGNoWzRdID0gKyggbWF0Y2hbNF0gPyBtYXRjaFs1XSArIChtYXRjaFs2XSB8fCAxKSA6IDIgKiAoIG1hdGNoWzNdID09PSBcImV2ZW5cIiB8fCBtYXRjaFszXSA9PT0gXCJvZGRcIiApICk7XG5cdFx0XHRcdG1hdGNoWzVdID0gKyggKCBtYXRjaFs3XSArIG1hdGNoWzhdICkgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKTtcblxuXHRcdFx0Ly8gb3RoZXIgdHlwZXMgcHJvaGliaXQgYXJndW1lbnRzXG5cdFx0XHR9IGVsc2UgaWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBtYXRjaFswXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbWF0Y2g7XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdHZhciBleGNlc3MsXG5cdFx0XHRcdHVucXVvdGVkID0gIW1hdGNoWzZdICYmIG1hdGNoWzJdO1xuXG5cdFx0XHRpZiAoIG1hdGNoRXhwcltcIkNISUxEXCJdLnRlc3QoIG1hdGNoWzBdICkgKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBY2NlcHQgcXVvdGVkIGFyZ3VtZW50cyBhcy1pc1xuXHRcdFx0aWYgKCBtYXRjaFszXSApIHtcblx0XHRcdFx0bWF0Y2hbMl0gPSBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTdHJpcCBleGNlc3MgY2hhcmFjdGVycyBmcm9tIHVucXVvdGVkIGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggdW5xdW90ZWQgJiYgcnBzZXVkby50ZXN0KCB1bnF1b3RlZCApICYmXG5cdFx0XHRcdC8vIEdldCBleGNlc3MgZnJvbSB0b2tlbml6ZSAocmVjdXJzaXZlbHkpXG5cdFx0XHRcdChleGNlc3MgPSB0b2tlbml6ZSggdW5xdW90ZWQsIHRydWUgKSkgJiZcblx0XHRcdFx0Ly8gYWR2YW5jZSB0byB0aGUgbmV4dCBjbG9zaW5nIHBhcmVudGhlc2lzXG5cdFx0XHRcdChleGNlc3MgPSB1bnF1b3RlZC5pbmRleE9mKCBcIilcIiwgdW5xdW90ZWQubGVuZ3RoIC0gZXhjZXNzICkgLSB1bnF1b3RlZC5sZW5ndGgpICkge1xuXG5cdFx0XHRcdC8vIGV4Y2VzcyBpcyBhIG5lZ2F0aXZlIGluZGV4XG5cdFx0XHRcdG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAsIGV4Y2VzcyApO1xuXHRcdFx0XHRtYXRjaFsyXSA9IHVucXVvdGVkLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV0dXJuIG9ubHkgY2FwdHVyZXMgbmVlZGVkIGJ5IHRoZSBwc2V1ZG8gZmlsdGVyIG1ldGhvZCAodHlwZSBhbmQgYXJndW1lbnQpXG5cdFx0XHRyZXR1cm4gbWF0Y2guc2xpY2UoIDAsIDMgKTtcblx0XHR9XG5cdH0sXG5cblx0ZmlsdGVyOiB7XG5cblx0XHRcIlRBR1wiOiBmdW5jdGlvbiggbm9kZU5hbWVTZWxlY3RvciApIHtcblx0XHRcdHZhciBub2RlTmFtZSA9IG5vZGVOYW1lU2VsZWN0b3IucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIG5vZGVOYW1lU2VsZWN0b3IgPT09IFwiKlwiID9cblx0XHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9IDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUgJiYgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBub2RlTmFtZTtcblx0XHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDTEFTU1wiOiBmdW5jdGlvbiggY2xhc3NOYW1lICkge1xuXHRcdFx0dmFyIHBhdHRlcm4gPSBjbGFzc0NhY2hlWyBjbGFzc05hbWUgKyBcIiBcIiBdO1xuXG5cdFx0XHRyZXR1cm4gcGF0dGVybiB8fFxuXHRcdFx0XHQocGF0dGVybiA9IG5ldyBSZWdFeHAoIFwiKF58XCIgKyB3aGl0ZXNwYWNlICsgXCIpXCIgKyBjbGFzc05hbWUgKyBcIihcIiArIHdoaXRlc3BhY2UgKyBcInwkKVwiICkpICYmXG5cdFx0XHRcdGNsYXNzQ2FjaGUoIGNsYXNzTmFtZSwgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHBhdHRlcm4udGVzdCggdHlwZW9mIGVsZW0uY2xhc3NOYW1lID09PSBcInN0cmluZ1wiICYmIGVsZW0uY2xhc3NOYW1lIHx8IHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBlbGVtLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpIHx8IFwiXCIgKTtcblx0XHRcdFx0fSk7XG5cdFx0fSxcblxuXHRcdFwiQVRUUlwiOiBmdW5jdGlvbiggbmFtZSwgb3BlcmF0b3IsIGNoZWNrICkge1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgcmVzdWx0ID0gU2l6emxlLmF0dHIoIGVsZW0sIG5hbWUgKTtcblxuXHRcdFx0XHRpZiAoIHJlc3VsdCA9PSBudWxsICkge1xuXHRcdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCIhPVwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggIW9wZXJhdG9yICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0ICs9IFwiXCI7XG5cblx0XHRcdFx0cmV0dXJuIG9wZXJhdG9yID09PSBcIj1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIiE9XCIgPyByZXN1bHQgIT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJePVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPT09IDAgOlxuXHRcdFx0XHRcdG9wZXJhdG9yID09PSBcIio9XCIgPyBjaGVjayAmJiByZXN1bHQuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIkPVwiID8gY2hlY2sgJiYgcmVzdWx0LnNsaWNlKCAtY2hlY2subGVuZ3RoICkgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ+PVwiID8gKCBcIiBcIiArIHJlc3VsdC5yZXBsYWNlKCByd2hpdGVzcGFjZSwgXCIgXCIgKSArIFwiIFwiICkuaW5kZXhPZiggY2hlY2sgKSA+IC0xIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCJ8PVwiID8gcmVzdWx0ID09PSBjaGVjayB8fCByZXN1bHQuc2xpY2UoIDAsIGNoZWNrLmxlbmd0aCArIDEgKSA9PT0gY2hlY2sgKyBcIi1cIiA6XG5cdFx0XHRcdFx0ZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIkNISUxEXCI6IGZ1bmN0aW9uKCB0eXBlLCB3aGF0LCBhcmd1bWVudCwgZmlyc3QsIGxhc3QgKSB7XG5cdFx0XHR2YXIgc2ltcGxlID0gdHlwZS5zbGljZSggMCwgMyApICE9PSBcIm50aFwiLFxuXHRcdFx0XHRmb3J3YXJkID0gdHlwZS5zbGljZSggLTQgKSAhPT0gXCJsYXN0XCIsXG5cdFx0XHRcdG9mVHlwZSA9IHdoYXQgPT09IFwib2YtdHlwZVwiO1xuXG5cdFx0XHRyZXR1cm4gZmlyc3QgPT09IDEgJiYgbGFzdCA9PT0gMCA/XG5cblx0XHRcdFx0Ly8gU2hvcnRjdXQgZm9yIDpudGgtKihuKVxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRyZXR1cm4gISFlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRcdH0gOlxuXG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGNhY2hlLCB1bmlxdWVDYWNoZSwgb3V0ZXJDYWNoZSwgbm9kZSwgbm9kZUluZGV4LCBzdGFydCxcblx0XHRcdFx0XHRcdGRpciA9IHNpbXBsZSAhPT0gZm9yd2FyZCA/IFwibmV4dFNpYmxpbmdcIiA6IFwicHJldmlvdXNTaWJsaW5nXCIsXG5cdFx0XHRcdFx0XHRwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGUsXG5cdFx0XHRcdFx0XHRuYW1lID0gb2ZUeXBlICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSxcblx0XHRcdFx0XHRcdHVzZUNhY2hlID0gIXhtbCAmJiAhb2ZUeXBlLFxuXHRcdFx0XHRcdFx0ZGlmZiA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdC8vIDooZmlyc3R8bGFzdHxvbmx5KS0oY2hpbGR8b2YtdHlwZSlcblx0XHRcdFx0XHRcdGlmICggc2ltcGxlICkge1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIGRpciApIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gbm9kZVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBvZlR5cGUgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUgOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHRub2RlLm5vZGVUeXBlID09PSAxICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0Ly8gUmV2ZXJzZSBkaXJlY3Rpb24gZm9yIDpvbmx5LSogKGlmIHdlIGhhdmVuJ3QgeWV0IGRvbmUgc28pXG5cdFx0XHRcdFx0XHRcdFx0c3RhcnQgPSBkaXIgPSB0eXBlID09PSBcIm9ubHlcIiAmJiAhc3RhcnQgJiYgXCJuZXh0U2libGluZ1wiO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRzdGFydCA9IFsgZm9yd2FyZCA/IHBhcmVudC5maXJzdENoaWxkIDogcGFyZW50Lmxhc3RDaGlsZCBdO1xuXG5cdFx0XHRcdFx0XHQvLyBub24teG1sIDpudGgtY2hpbGQoLi4uKSBzdG9yZXMgY2FjaGUgZGF0YSBvbiBgcGFyZW50YFxuXHRcdFx0XHRcdFx0aWYgKCBmb3J3YXJkICYmIHVzZUNhY2hlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFNlZWsgYGVsZW1gIGZyb20gYSBwcmV2aW91c2x5LWNhY2hlZCBpbmRleFxuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0bm9kZSA9IHBhcmVudDtcblx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdG5vZGVJbmRleCA9IGNhY2hlWyAwIF0gPT09IGRpcnJ1bnMgJiYgY2FjaGVbIDEgXTtcblx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleCAmJiBjYWNoZVsgMiBdO1xuXHRcdFx0XHRcdFx0XHRub2RlID0gbm9kZUluZGV4ICYmIHBhcmVudC5jaGlsZE5vZGVzWyBub2RlSW5kZXggXTtcblxuXHRcdFx0XHRcdFx0XHR3aGlsZSAoIChub2RlID0gKytub2RlSW5kZXggJiYgbm9kZSAmJiBub2RlWyBkaXIgXSB8fFxuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gRmFsbGJhY2sgdG8gc2Vla2luZyBgZWxlbWAgZnJvbSB0aGUgc3RhcnRcblx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFdoZW4gZm91bmQsIGNhY2hlIGluZGV4ZXMgb24gYHBhcmVudGAgYW5kIGJyZWFrXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlLm5vZGVUeXBlID09PSAxICYmICsrZGlmZiAmJiBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgbm9kZUluZGV4LCBkaWZmIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gVXNlIHByZXZpb3VzbHktY2FjaGVkIGVsZW1lbnQgaW5kZXggaWYgYXZhaWxhYmxlXG5cdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0Ly8gLi4uaW4gYSBnemlwLWZyaWVuZGx5IHdheVxuXHRcdFx0XHRcdFx0XHRcdG5vZGUgPSBlbGVtO1xuXHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdGNhY2hlID0gdW5pcXVlQ2FjaGVbIHR5cGUgXSB8fCBbXTtcblx0XHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdFx0ZGlmZiA9IG5vZGVJbmRleDtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHhtbCA6bnRoLWNoaWxkKC4uLilcblx0XHRcdFx0XHRcdFx0Ly8gb3IgOm50aC1sYXN0LWNoaWxkKC4uLikgb3IgOm50aCgtbGFzdCk/LW9mLXR5cGUoLi4uKVxuXHRcdFx0XHRcdFx0XHRpZiAoIGRpZmYgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIFVzZSB0aGUgc2FtZSBsb29wIGFzIGFib3ZlIHRvIHNlZWsgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChkaWZmID0gbm9kZUluZGV4ID0gMCkgfHwgc3RhcnQucG9wKCkpICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRpZiAoICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApICYmXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCsrZGlmZiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBDYWNoZSB0aGUgaW5kZXggb2YgZWFjaCBlbmNvdW50ZXJlZCBlbGVtZW50XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggdXNlQ2FjaGUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IG5vZGVbIGV4cGFuZG8gXSB8fCAobm9kZVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQob3V0ZXJDYWNoZVsgbm9kZS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIHR5cGUgXSA9IFsgZGlycnVucywgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBub2RlID09PSBlbGVtICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIEluY29ycG9yYXRlIHRoZSBvZmZzZXQsIHRoZW4gY2hlY2sgYWdhaW5zdCBjeWNsZSBzaXplXG5cdFx0XHRcdFx0XHRkaWZmIC09IGxhc3Q7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZGlmZiA9PT0gZmlyc3QgfHwgKCBkaWZmICUgZmlyc3QgPT09IDAgJiYgZGlmZiAvIGZpcnN0ID49IDAgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiUFNFVURPXCI6IGZ1bmN0aW9uKCBwc2V1ZG8sIGFyZ3VtZW50ICkge1xuXHRcdFx0Ly8gcHNldWRvLWNsYXNzIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI3BzZXVkby1jbGFzc2VzXG5cdFx0XHQvLyBQcmlvcml0aXplIGJ5IGNhc2Ugc2Vuc2l0aXZpdHkgaW4gY2FzZSBjdXN0b20gcHNldWRvcyBhcmUgYWRkZWQgd2l0aCB1cHBlcmNhc2UgbGV0dGVyc1xuXHRcdFx0Ly8gUmVtZW1iZXIgdGhhdCBzZXRGaWx0ZXJzIGluaGVyaXRzIGZyb20gcHNldWRvc1xuXHRcdFx0dmFyIGFyZ3MsXG5cdFx0XHRcdGZuID0gRXhwci5wc2V1ZG9zWyBwc2V1ZG8gXSB8fCBFeHByLnNldEZpbHRlcnNbIHBzZXVkby50b0xvd2VyQ2FzZSgpIF0gfHxcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgcHNldWRvOiBcIiArIHBzZXVkbyApO1xuXG5cdFx0XHQvLyBUaGUgdXNlciBtYXkgdXNlIGNyZWF0ZVBzZXVkbyB0byBpbmRpY2F0ZSB0aGF0XG5cdFx0XHQvLyBhcmd1bWVudHMgYXJlIG5lZWRlZCB0byBjcmVhdGUgdGhlIGZpbHRlciBmdW5jdGlvblxuXHRcdFx0Ly8ganVzdCBhcyBTaXp6bGUgZG9lc1xuXHRcdFx0aWYgKCBmblsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRyZXR1cm4gZm4oIGFyZ3VtZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEJ1dCBtYWludGFpbiBzdXBwb3J0IGZvciBvbGQgc2lnbmF0dXJlc1xuXHRcdFx0aWYgKCBmbi5sZW5ndGggPiAxICkge1xuXHRcdFx0XHRhcmdzID0gWyBwc2V1ZG8sIHBzZXVkbywgXCJcIiwgYXJndW1lbnQgXTtcblx0XHRcdFx0cmV0dXJuIEV4cHIuc2V0RmlsdGVycy5oYXNPd25Qcm9wZXJ0eSggcHNldWRvLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzICkge1xuXHRcdFx0XHRcdFx0dmFyIGlkeCxcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZCA9IGZuKCBzZWVkLCBhcmd1bWVudCApLFxuXHRcdFx0XHRcdFx0XHRpID0gbWF0Y2hlZC5sZW5ndGg7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWR4ID0gaW5kZXhPZiggc2VlZCwgbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0XHRzZWVkWyBpZHggXSA9ICEoIG1hdGNoZXNbIGlkeCBdID0gbWF0Y2hlZFtpXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pIDpcblx0XHRcdFx0XHRmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmbiggZWxlbSwgMCwgYXJncyApO1xuXHRcdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBmbjtcblx0XHR9XG5cdH0sXG5cblx0cHNldWRvczoge1xuXHRcdC8vIFBvdGVudGlhbGx5IGNvbXBsZXggcHNldWRvc1xuXHRcdFwibm90XCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHQvLyBUcmltIHRoZSBzZWxlY3RvciBwYXNzZWQgdG8gY29tcGlsZVxuXHRcdFx0Ly8gdG8gYXZvaWQgdHJlYXRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmdcblx0XHRcdC8vIHNwYWNlcyBhcyBjb21iaW5hdG9yc1xuXHRcdFx0dmFyIGlucHV0ID0gW10sXG5cdFx0XHRcdHJlc3VsdHMgPSBbXSxcblx0XHRcdFx0bWF0Y2hlciA9IGNvbXBpbGUoIHNlbGVjdG9yLnJlcGxhY2UoIHJ0cmltLCBcIiQxXCIgKSApO1xuXG5cdFx0XHRyZXR1cm4gbWF0Y2hlclsgZXhwYW5kbyBdID9cblx0XHRcdFx0bWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCBtYXRjaGVzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHRcdFx0dmFyIGVsZW0sXG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQgPSBtYXRjaGVyKCBzZWVkLCBudWxsLCB4bWwsIFtdICksXG5cdFx0XHRcdFx0XHRpID0gc2VlZC5sZW5ndGg7XG5cblx0XHRcdFx0XHQvLyBNYXRjaCBlbGVtZW50cyB1bm1hdGNoZWQgYnkgYG1hdGNoZXJgXG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0c2VlZFtpXSA9ICEobWF0Y2hlc1tpXSA9IGVsZW0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkgOlxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdGlucHV0WzBdID0gZWxlbTtcblx0XHRcdFx0XHRtYXRjaGVyKCBpbnB1dCwgbnVsbCwgeG1sLCByZXN1bHRzICk7XG5cdFx0XHRcdFx0Ly8gRG9uJ3Qga2VlcCB0aGUgZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdFx0XHRpbnB1dFswXSA9IG51bGw7XG5cdFx0XHRcdFx0cmV0dXJuICFyZXN1bHRzLnBvcCgpO1xuXHRcdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0XCJoYXNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIFNpenpsZSggc2VsZWN0b3IsIGVsZW0gKS5sZW5ndGggPiAwO1xuXHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiY29udGFpbnNcIjogbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0dGV4dCA9IHRleHQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuICggZWxlbS50ZXh0Q29udGVudCB8fCBlbGVtLmlubmVyVGV4dCB8fCBnZXRUZXh0KCBlbGVtICkgKS5pbmRleE9mKCB0ZXh0ICkgPiAtMTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBcIldoZXRoZXIgYW4gZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIDpsYW5nKCkgc2VsZWN0b3Jcblx0XHQvLyBpcyBiYXNlZCBzb2xlbHkgb24gdGhlIGVsZW1lbnQncyBsYW5ndWFnZSB2YWx1ZVxuXHRcdC8vIGJlaW5nIGVxdWFsIHRvIHRoZSBpZGVudGlmaWVyIEMsXG5cdFx0Ly8gb3IgYmVnaW5uaW5nIHdpdGggdGhlIGlkZW50aWZpZXIgQyBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBcIi1cIi5cblx0XHQvLyBUaGUgbWF0Y2hpbmcgb2YgQyBhZ2FpbnN0IHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWUgaXMgcGVyZm9ybWVkIGNhc2UtaW5zZW5zaXRpdmVseS5cblx0XHQvLyBUaGUgaWRlbnRpZmllciBDIGRvZXMgbm90IGhhdmUgdG8gYmUgYSB2YWxpZCBsYW5ndWFnZSBuYW1lLlwiXG5cdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNsYW5nLXBzZXVkb1xuXHRcdFwibGFuZ1wiOiBtYXJrRnVuY3Rpb24oIGZ1bmN0aW9uKCBsYW5nICkge1xuXHRcdFx0Ly8gbGFuZyB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaWRlbnRpZmllclxuXHRcdFx0aWYgKCAhcmlkZW50aWZpZXIudGVzdChsYW5nIHx8IFwiXCIpICkge1xuXHRcdFx0XHRTaXp6bGUuZXJyb3IoIFwidW5zdXBwb3J0ZWQgbGFuZzogXCIgKyBsYW5nICk7XG5cdFx0XHR9XG5cdFx0XHRsYW5nID0gbGFuZy5yZXBsYWNlKCBydW5lc2NhcGUsIGZ1bmVzY2FwZSApLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHZhciBlbGVtTGFuZztcblx0XHRcdFx0ZG8ge1xuXHRcdFx0XHRcdGlmICggKGVsZW1MYW5nID0gZG9jdW1lbnRJc0hUTUwgP1xuXHRcdFx0XHRcdFx0ZWxlbS5sYW5nIDpcblx0XHRcdFx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKFwieG1sOmxhbmdcIikgfHwgZWxlbS5nZXRBdHRyaWJ1dGUoXCJsYW5nXCIpKSApIHtcblxuXHRcdFx0XHRcdFx0ZWxlbUxhbmcgPSBlbGVtTGFuZy50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZW1MYW5nID09PSBsYW5nIHx8IGVsZW1MYW5nLmluZGV4T2YoIGxhbmcgKyBcIi1cIiApID09PSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSB3aGlsZSAoIChlbGVtID0gZWxlbS5wYXJlbnROb2RlKSAmJiBlbGVtLm5vZGVUeXBlID09PSAxICk7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHQvLyBNaXNjZWxsYW5lb3VzXG5cdFx0XCJ0YXJnZXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbiAmJiB3aW5kb3cubG9jYXRpb24uaGFzaDtcblx0XHRcdHJldHVybiBoYXNoICYmIGhhc2guc2xpY2UoIDEgKSA9PT0gZWxlbS5pZDtcblx0XHR9LFxuXG5cdFx0XCJyb290XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY0VsZW07XG5cdFx0fSxcblxuXHRcdFwiZm9jdXNcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpICYmICEhKGVsZW0udHlwZSB8fCBlbGVtLmhyZWYgfHwgfmVsZW0udGFiSW5kZXgpO1xuXHRcdH0sXG5cblx0XHQvLyBCb29sZWFuIHByb3BlcnRpZXNcblx0XHRcImVuYWJsZWRcIjogY3JlYXRlRGlzYWJsZWRQc2V1ZG8oIGZhbHNlICksXG5cdFx0XCJkaXNhYmxlZFwiOiBjcmVhdGVEaXNhYmxlZFBzZXVkbyggdHJ1ZSApLFxuXG5cdFx0XCJjaGVja2VkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0Ly8gSW4gQ1NTMywgOmNoZWNrZWQgc2hvdWxkIHJldHVybiBib3RoIGNoZWNrZWQgYW5kIHNlbGVjdGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0dmFyIG5vZGVOYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIChub2RlTmFtZSA9PT0gXCJpbnB1dFwiICYmICEhZWxlbS5jaGVja2VkKSB8fCAobm9kZU5hbWUgPT09IFwib3B0aW9uXCIgJiYgISFlbGVtLnNlbGVjdGVkKTtcblx0XHR9LFxuXG5cdFx0XCJzZWxlY3RlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEFjY2Vzc2luZyB0aGlzIHByb3BlcnR5IG1ha2VzIHNlbGVjdGVkLWJ5LWRlZmF1bHRcblx0XHRcdC8vIG9wdGlvbnMgaW4gU2FmYXJpIHdvcmsgcHJvcGVybHlcblx0XHRcdGlmICggZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRlbGVtLnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGVsZW0uc2VsZWN0ZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdC8vIENvbnRlbnRzXG5cdFx0XCJlbXB0eVwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jZW1wdHktcHNldWRvXG5cdFx0XHQvLyA6ZW1wdHkgaXMgbmVnYXRlZCBieSBlbGVtZW50ICgxKSBvciBjb250ZW50IG5vZGVzICh0ZXh0OiAzOyBjZGF0YTogNDsgZW50aXR5IHJlZjogNSksXG5cdFx0XHQvLyAgIGJ1dCBub3QgYnkgb3RoZXJzIChjb21tZW50OiA4OyBwcm9jZXNzaW5nIGluc3RydWN0aW9uOiA3OyBldGMuKVxuXHRcdFx0Ly8gbm9kZVR5cGUgPCA2IHdvcmtzIGJlY2F1c2UgYXR0cmlidXRlcyAoMikgZG8gbm90IGFwcGVhciBhcyBjaGlsZHJlblxuXHRcdFx0Zm9yICggZWxlbSA9IGVsZW0uZmlyc3RDaGlsZDsgZWxlbTsgZWxlbSA9IGVsZW0ubmV4dFNpYmxpbmcgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA8IDYgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9LFxuXG5cdFx0XCJwYXJlbnRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gIUV4cHIucHNldWRvc1tcImVtcHR5XCJdKCBlbGVtICk7XG5cdFx0fSxcblxuXHRcdC8vIEVsZW1lbnQvaW5wdXQgdHlwZXNcblx0XHRcImhlYWRlclwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaGVhZGVyLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJpbnB1dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiByaW5wdXRzLnRlc3QoIGVsZW0ubm9kZU5hbWUgKTtcblx0XHR9LFxuXG5cdFx0XCJidXR0b25cIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBuYW1lID09PSBcImlucHV0XCIgJiYgZWxlbS50eXBlID09PSBcImJ1dHRvblwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCI7XG5cdFx0fSxcblxuXHRcdFwidGV4dFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBhdHRyO1xuXHRcdFx0cmV0dXJuIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICYmXG5cdFx0XHRcdGVsZW0udHlwZSA9PT0gXCJ0ZXh0XCIgJiZcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTw4XG5cdFx0XHRcdC8vIE5ldyBIVE1MNSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuLCBcInNlYXJjaFwiKSBhcHBlYXIgd2l0aCBlbGVtLnR5cGUgPT09IFwidGV4dFwiXG5cdFx0XHRcdCggKGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZShcInR5cGVcIikpID09IG51bGwgfHwgYXR0ci50b0xvd2VyQ2FzZSgpID09PSBcInRleHRcIiApO1xuXHRcdH0sXG5cblx0XHQvLyBQb3NpdGlvbi1pbi1jb2xsZWN0aW9uXG5cdFx0XCJmaXJzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIFsgMCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJsYXN0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIFsgbGVuZ3RoIC0gMSBdO1xuXHRcdH0pLFxuXG5cdFx0XCJlcVwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHRyZXR1cm4gWyBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50IF07XG5cdFx0fSksXG5cblx0XHRcImV2ZW5cIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcIm9kZFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHZhciBpID0gMTtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSArPSAyICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwibHRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyAtLWkgPj0gMDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJndFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCwgYXJndW1lbnQgKSB7XG5cdFx0XHR2YXIgaSA9IGFyZ3VtZW50IDwgMCA/IGFyZ3VtZW50ICsgbGVuZ3RoIDogYXJndW1lbnQ7XG5cdFx0XHRmb3IgKCA7ICsraSA8IGxlbmd0aDsgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pXG5cdH1cbn07XG5cbkV4cHIucHNldWRvc1tcIm50aFwiXSA9IEV4cHIucHNldWRvc1tcImVxXCJdO1xuXG4vLyBBZGQgYnV0dG9uL2lucHV0IHR5cGUgcHNldWRvc1xuZm9yICggaSBpbiB7IHJhZGlvOiB0cnVlLCBjaGVja2JveDogdHJ1ZSwgZmlsZTogdHJ1ZSwgcGFzc3dvcmQ6IHRydWUsIGltYWdlOiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlSW5wdXRQc2V1ZG8oIGkgKTtcbn1cbmZvciAoIGkgaW4geyBzdWJtaXQ6IHRydWUsIHJlc2V0OiB0cnVlIH0gKSB7XG5cdEV4cHIucHNldWRvc1sgaSBdID0gY3JlYXRlQnV0dG9uUHNldWRvKCBpICk7XG59XG5cbi8vIEVhc3kgQVBJIGZvciBjcmVhdGluZyBuZXcgc2V0RmlsdGVyc1xuZnVuY3Rpb24gc2V0RmlsdGVycygpIHt9XG5zZXRGaWx0ZXJzLnByb3RvdHlwZSA9IEV4cHIuZmlsdGVycyA9IEV4cHIucHNldWRvcztcbkV4cHIuc2V0RmlsdGVycyA9IG5ldyBzZXRGaWx0ZXJzKCk7XG5cbnRva2VuaXplID0gU2l6emxlLnRva2VuaXplID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBwYXJzZU9ubHkgKSB7XG5cdHZhciBtYXRjaGVkLCBtYXRjaCwgdG9rZW5zLCB0eXBlLFxuXHRcdHNvRmFyLCBncm91cHMsIHByZUZpbHRlcnMsXG5cdFx0Y2FjaGVkID0gdG9rZW5DYWNoZVsgc2VsZWN0b3IgKyBcIiBcIiBdO1xuXG5cdGlmICggY2FjaGVkICkge1xuXHRcdHJldHVybiBwYXJzZU9ubHkgPyAwIDogY2FjaGVkLnNsaWNlKCAwICk7XG5cdH1cblxuXHRzb0ZhciA9IHNlbGVjdG9yO1xuXHRncm91cHMgPSBbXTtcblx0cHJlRmlsdGVycyA9IEV4cHIucHJlRmlsdGVyO1xuXG5cdHdoaWxlICggc29GYXIgKSB7XG5cblx0XHQvLyBDb21tYSBhbmQgZmlyc3QgcnVuXG5cdFx0aWYgKCAhbWF0Y2hlZCB8fCAobWF0Y2ggPSByY29tbWEuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRpZiAoIG1hdGNoICkge1xuXHRcdFx0XHQvLyBEb24ndCBjb25zdW1lIHRyYWlsaW5nIGNvbW1hcyBhcyB2YWxpZFxuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaFswXS5sZW5ndGggKSB8fCBzb0Zhcjtcblx0XHRcdH1cblx0XHRcdGdyb3Vwcy5wdXNoKCAodG9rZW5zID0gW10pICk7XG5cdFx0fVxuXG5cdFx0bWF0Y2hlZCA9IGZhbHNlO1xuXG5cdFx0Ly8gQ29tYmluYXRvcnNcblx0XHRpZiAoIChtYXRjaCA9IHJjb21iaW5hdG9ycy5leGVjKCBzb0ZhciApKSApIHtcblx0XHRcdG1hdGNoZWQgPSBtYXRjaC5zaGlmdCgpO1xuXHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0Ly8gQ2FzdCBkZXNjZW5kYW50IGNvbWJpbmF0b3JzIHRvIHNwYWNlXG5cdFx0XHRcdHR5cGU6IG1hdGNoWzBdLnJlcGxhY2UoIHJ0cmltLCBcIiBcIiApXG5cdFx0XHR9KTtcblx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0fVxuXG5cdFx0Ly8gRmlsdGVyc1xuXHRcdGZvciAoIHR5cGUgaW4gRXhwci5maWx0ZXIgKSB7XG5cdFx0XHRpZiAoIChtYXRjaCA9IG1hdGNoRXhwclsgdHlwZSBdLmV4ZWMoIHNvRmFyICkpICYmICghcHJlRmlsdGVyc1sgdHlwZSBdIHx8XG5cdFx0XHRcdChtYXRjaCA9IHByZUZpbHRlcnNbIHR5cGUgXSggbWF0Y2ggKSkpICkge1xuXHRcdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdFx0dG9rZW5zLnB1c2goe1xuXHRcdFx0XHRcdHZhbHVlOiBtYXRjaGVkLFxuXHRcdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdFx0bWF0Y2hlczogbWF0Y2hcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNvRmFyID0gc29GYXIuc2xpY2UoIG1hdGNoZWQubGVuZ3RoICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCAhbWF0Y2hlZCApIHtcblx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBpbnZhbGlkIGV4Y2Vzc1xuXHQvLyBpZiB3ZSdyZSBqdXN0IHBhcnNpbmdcblx0Ly8gT3RoZXJ3aXNlLCB0aHJvdyBhbiBlcnJvciBvciByZXR1cm4gdG9rZW5zXG5cdHJldHVybiBwYXJzZU9ubHkgP1xuXHRcdHNvRmFyLmxlbmd0aCA6XG5cdFx0c29GYXIgP1xuXHRcdFx0U2l6emxlLmVycm9yKCBzZWxlY3RvciApIDpcblx0XHRcdC8vIENhY2hlIHRoZSB0b2tlbnNcblx0XHRcdHRva2VuQ2FjaGUoIHNlbGVjdG9yLCBncm91cHMgKS5zbGljZSggMCApO1xufTtcblxuZnVuY3Rpb24gdG9TZWxlY3RvciggdG9rZW5zICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gdG9rZW5zLmxlbmd0aCxcblx0XHRzZWxlY3RvciA9IFwiXCI7XG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdHNlbGVjdG9yICs9IHRva2Vuc1tpXS52YWx1ZTtcblx0fVxuXHRyZXR1cm4gc2VsZWN0b3I7XG59XG5cbmZ1bmN0aW9uIGFkZENvbWJpbmF0b3IoIG1hdGNoZXIsIGNvbWJpbmF0b3IsIGJhc2UgKSB7XG5cdHZhciBkaXIgPSBjb21iaW5hdG9yLmRpcixcblx0XHRza2lwID0gY29tYmluYXRvci5uZXh0LFxuXHRcdGtleSA9IHNraXAgfHwgZGlyLFxuXHRcdGNoZWNrTm9uRWxlbWVudHMgPSBiYXNlICYmIGtleSA9PT0gXCJwYXJlbnROb2RlXCIsXG5cdFx0ZG9uZU5hbWUgPSBkb25lKys7XG5cblx0cmV0dXJuIGNvbWJpbmF0b3IuZmlyc3QgP1xuXHRcdC8vIENoZWNrIGFnYWluc3QgY2xvc2VzdCBhbmNlc3Rvci9wcmVjZWRpbmcgZWxlbWVudFxuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9IDpcblxuXHRcdC8vIENoZWNrIGFnYWluc3QgYWxsIGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50c1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgb2xkQ2FjaGUsIHVuaXF1ZUNhY2hlLCBvdXRlckNhY2hlLFxuXHRcdFx0XHRuZXdDYWNoZSA9IFsgZGlycnVucywgZG9uZU5hbWUgXTtcblxuXHRcdFx0Ly8gV2UgY2FuJ3Qgc2V0IGFyYml0cmFyeSBkYXRhIG9uIFhNTCBub2Rlcywgc28gdGhleSBkb24ndCBiZW5lZml0IGZyb20gY29tYmluYXRvciBjYWNoaW5nXG5cdFx0XHRpZiAoIHhtbCApIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0d2hpbGUgKCAoZWxlbSA9IGVsZW1bIGRpciBdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgY2hlY2tOb25FbGVtZW50cyApIHtcblx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBlbGVtWyBleHBhbmRvIF0gfHwgKGVsZW1bIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPDkgb25seVxuXHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIGVsZW0udW5pcXVlSUQgXSB8fCAob3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHRpZiAoIHNraXAgJiYgc2tpcCA9PT0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRlbGVtID0gZWxlbVsgZGlyIF0gfHwgZWxlbTtcblx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIChvbGRDYWNoZSA9IHVuaXF1ZUNhY2hlWyBrZXkgXSkgJiZcblx0XHRcdFx0XHRcdFx0b2xkQ2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBvbGRDYWNoZVsgMSBdID09PSBkb25lTmFtZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBc3NpZ24gdG8gbmV3Q2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gKG5ld0NhY2hlWyAyIF0gPSBvbGRDYWNoZVsgMiBdKTtcblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJldXNlIG5ld2NhY2hlIHNvIHJlc3VsdHMgYmFjay1wcm9wYWdhdGUgdG8gcHJldmlvdXMgZWxlbWVudHNcblx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGVbIGtleSBdID0gbmV3Q2FjaGU7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQSBtYXRjaCBtZWFucyB3ZSdyZSBkb25lOyBhIGZhaWwgbWVhbnMgd2UgaGF2ZSB0byBrZWVwIGNoZWNraW5nXG5cdFx0XHRcdFx0XHRcdGlmICggKG5ld0NhY2hlWyAyIF0gPSBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9O1xufVxuXG5mdW5jdGlvbiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSB7XG5cdHJldHVybiBtYXRjaGVycy5sZW5ndGggPiAxID9cblx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0dmFyIGkgPSBtYXRjaGVycy5sZW5ndGg7XG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCAhbWF0Y2hlcnNbaV0oIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSA6XG5cdFx0bWF0Y2hlcnNbMF07XG59XG5cbmZ1bmN0aW9uIG11bHRpcGxlQ29udGV4dHMoIHNlbGVjdG9yLCBjb250ZXh0cywgcmVzdWx0cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGNvbnRleHRzLmxlbmd0aDtcblx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0U2l6emxlKCBzZWxlY3RvciwgY29udGV4dHNbaV0sIHJlc3VsdHMgKTtcblx0fVxuXHRyZXR1cm4gcmVzdWx0cztcbn1cblxuZnVuY3Rpb24gY29uZGVuc2UoIHVubWF0Y2hlZCwgbWFwLCBmaWx0ZXIsIGNvbnRleHQsIHhtbCApIHtcblx0dmFyIGVsZW0sXG5cdFx0bmV3VW5tYXRjaGVkID0gW10sXG5cdFx0aSA9IDAsXG5cdFx0bGVuID0gdW5tYXRjaGVkLmxlbmd0aCxcblx0XHRtYXBwZWQgPSBtYXAgIT0gbnVsbDtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChlbGVtID0gdW5tYXRjaGVkW2ldKSApIHtcblx0XHRcdGlmICggIWZpbHRlciB8fCBmaWx0ZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApICkge1xuXHRcdFx0XHRuZXdVbm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRpZiAoIG1hcHBlZCApIHtcblx0XHRcdFx0XHRtYXAucHVzaCggaSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG5ld1VubWF0Y2hlZDtcbn1cblxuZnVuY3Rpb24gc2V0TWF0Y2hlciggcHJlRmlsdGVyLCBzZWxlY3RvciwgbWF0Y2hlciwgcG9zdEZpbHRlciwgcG9zdEZpbmRlciwgcG9zdFNlbGVjdG9yICkge1xuXHRpZiAoIHBvc3RGaWx0ZXIgJiYgIXBvc3RGaWx0ZXJbIGV4cGFuZG8gXSApIHtcblx0XHRwb3N0RmlsdGVyID0gc2V0TWF0Y2hlciggcG9zdEZpbHRlciApO1xuXHR9XG5cdGlmICggcG9zdEZpbmRlciAmJiAhcG9zdEZpbmRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaW5kZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKTtcblx0fVxuXHRyZXR1cm4gbWFya0Z1bmN0aW9uKGZ1bmN0aW9uKCBzZWVkLCByZXN1bHRzLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0dmFyIHRlbXAsIGksIGVsZW0sXG5cdFx0XHRwcmVNYXAgPSBbXSxcblx0XHRcdHBvc3RNYXAgPSBbXSxcblx0XHRcdHByZWV4aXN0aW5nID0gcmVzdWx0cy5sZW5ndGgsXG5cblx0XHRcdC8vIEdldCBpbml0aWFsIGVsZW1lbnRzIGZyb20gc2VlZCBvciBjb250ZXh0XG5cdFx0XHRlbGVtcyA9IHNlZWQgfHwgbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IgfHwgXCIqXCIsIGNvbnRleHQubm9kZVR5cGUgPyBbIGNvbnRleHQgXSA6IGNvbnRleHQsIFtdICksXG5cblx0XHRcdC8vIFByZWZpbHRlciB0byBnZXQgbWF0Y2hlciBpbnB1dCwgcHJlc2VydmluZyBhIG1hcCBmb3Igc2VlZC1yZXN1bHRzIHN5bmNocm9uaXphdGlvblxuXHRcdFx0bWF0Y2hlckluID0gcHJlRmlsdGVyICYmICggc2VlZCB8fCAhc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGNvbmRlbnNlKCBlbGVtcywgcHJlTWFwLCBwcmVGaWx0ZXIsIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0ZWxlbXMsXG5cblx0XHRcdG1hdGNoZXJPdXQgPSBtYXRjaGVyID9cblx0XHRcdFx0Ly8gSWYgd2UgaGF2ZSBhIHBvc3RGaW5kZXIsIG9yIGZpbHRlcmVkIHNlZWQsIG9yIG5vbi1zZWVkIHBvc3RGaWx0ZXIgb3IgcHJlZXhpc3RpbmcgcmVzdWx0cyxcblx0XHRcdFx0cG9zdEZpbmRlciB8fCAoIHNlZWQgPyBwcmVGaWx0ZXIgOiBwcmVleGlzdGluZyB8fCBwb3N0RmlsdGVyICkgP1xuXG5cdFx0XHRcdFx0Ly8gLi4uaW50ZXJtZWRpYXRlIHByb2Nlc3NpbmcgaXMgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0W10gOlxuXG5cdFx0XHRcdFx0Ly8gLi4ub3RoZXJ3aXNlIHVzZSByZXN1bHRzIGRpcmVjdGx5XG5cdFx0XHRcdFx0cmVzdWx0cyA6XG5cdFx0XHRcdG1hdGNoZXJJbjtcblxuXHRcdC8vIEZpbmQgcHJpbWFyeSBtYXRjaGVzXG5cdFx0aWYgKCBtYXRjaGVyICkge1xuXHRcdFx0bWF0Y2hlciggbWF0Y2hlckluLCBtYXRjaGVyT3V0LCBjb250ZXh0LCB4bWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwb3N0RmlsdGVyXG5cdFx0aWYgKCBwb3N0RmlsdGVyICkge1xuXHRcdFx0dGVtcCA9IGNvbmRlbnNlKCBtYXRjaGVyT3V0LCBwb3N0TWFwICk7XG5cdFx0XHRwb3N0RmlsdGVyKCB0ZW1wLCBbXSwgY29udGV4dCwgeG1sICk7XG5cblx0XHRcdC8vIFVuLW1hdGNoIGZhaWxpbmcgZWxlbWVudHMgYnkgbW92aW5nIHRoZW0gYmFjayB0byBtYXRjaGVySW5cblx0XHRcdGkgPSB0ZW1wLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoIChlbGVtID0gdGVtcFtpXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlck91dFsgcG9zdE1hcFtpXSBdID0gIShtYXRjaGVySW5bIHBvc3RNYXBbaV0gXSA9IGVsZW0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyIHx8IHByZUZpbHRlciApIHtcblx0XHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRcdC8vIEdldCB0aGUgZmluYWwgbWF0Y2hlck91dCBieSBjb25kZW5zaW5nIHRoaXMgaW50ZXJtZWRpYXRlIGludG8gcG9zdEZpbmRlciBjb250ZXh0c1xuXHRcdFx0XHRcdHRlbXAgPSBbXTtcblx0XHRcdFx0XHRpID0gbWF0Y2hlck91dC5sZW5ndGg7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdC8vIFJlc3RvcmUgbWF0Y2hlckluIHNpbmNlIGVsZW0gaXMgbm90IHlldCBhIGZpbmFsIG1hdGNoXG5cdFx0XHRcdFx0XHRcdHRlbXAucHVzaCggKG1hdGNoZXJJbltpXSA9IGVsZW0pICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHBvc3RGaW5kZXIoIG51bGwsIChtYXRjaGVyT3V0ID0gW10pLCB0ZW1wLCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE1vdmUgbWF0Y2hlZCBlbGVtZW50cyBmcm9tIHNlZWQgdG8gcmVzdWx0cyB0byBrZWVwIHRoZW0gc3luY2hyb25pemVkXG5cdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9IG1hdGNoZXJPdXRbaV0pICYmXG5cdFx0XHRcdFx0XHQodGVtcCA9IHBvc3RGaW5kZXIgPyBpbmRleE9mKCBzZWVkLCBlbGVtICkgOiBwcmVNYXBbaV0pID4gLTEgKSB7XG5cblx0XHRcdFx0XHRcdHNlZWRbdGVtcF0gPSAhKHJlc3VsdHNbdGVtcF0gPSBlbGVtKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdC8vIEFkZCBlbGVtZW50cyB0byByZXN1bHRzLCB0aHJvdWdoIHBvc3RGaW5kZXIgaWYgZGVmaW5lZFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyT3V0ID0gY29uZGVuc2UoXG5cdFx0XHRcdG1hdGNoZXJPdXQgPT09IHJlc3VsdHMgP1xuXHRcdFx0XHRcdG1hdGNoZXJPdXQuc3BsaWNlKCBwcmVleGlzdGluZywgbWF0Y2hlck91dC5sZW5ndGggKSA6XG5cdFx0XHRcdFx0bWF0Y2hlck91dFxuXHRcdFx0KTtcblx0XHRcdGlmICggcG9zdEZpbmRlciApIHtcblx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgcmVzdWx0cywgbWF0Y2hlck91dCwgeG1sICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBtYXRjaGVyT3V0ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9KTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Ub2tlbnMoIHRva2VucyApIHtcblx0dmFyIGNoZWNrQ29udGV4dCwgbWF0Y2hlciwgaixcblx0XHRsZW4gPSB0b2tlbnMubGVuZ3RoLFxuXHRcdGxlYWRpbmdSZWxhdGl2ZSA9IEV4cHIucmVsYXRpdmVbIHRva2Vuc1swXS50eXBlIF0sXG5cdFx0aW1wbGljaXRSZWxhdGl2ZSA9IGxlYWRpbmdSZWxhdGl2ZSB8fCBFeHByLnJlbGF0aXZlW1wiIFwiXSxcblx0XHRpID0gbGVhZGluZ1JlbGF0aXZlID8gMSA6IDAsXG5cblx0XHQvLyBUaGUgZm91bmRhdGlvbmFsIG1hdGNoZXIgZW5zdXJlcyB0aGF0IGVsZW1lbnRzIGFyZSByZWFjaGFibGUgZnJvbSB0b3AtbGV2ZWwgY29udGV4dChzKVxuXHRcdG1hdGNoQ29udGV4dCA9IGFkZENvbWJpbmF0b3IoIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGNoZWNrQ29udGV4dDtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hBbnlDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gaW5kZXhPZiggY2hlY2tDb250ZXh0LCBlbGVtICkgPiAtMTtcblx0XHR9LCBpbXBsaWNpdFJlbGF0aXZlLCB0cnVlICksXG5cdFx0bWF0Y2hlcnMgPSBbIGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgcmV0ID0gKCAhbGVhZGluZ1JlbGF0aXZlICYmICggeG1sIHx8IGNvbnRleHQgIT09IG91dGVybW9zdENvbnRleHQgKSApIHx8IChcblx0XHRcdFx0KGNoZWNrQ29udGV4dCA9IGNvbnRleHQpLm5vZGVUeXBlID9cblx0XHRcdFx0XHRtYXRjaENvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApIDpcblx0XHRcdFx0XHRtYXRjaEFueUNvbnRleHQoIGVsZW0sIGNvbnRleHQsIHhtbCApICk7XG5cdFx0XHQvLyBBdm9pZCBoYW5naW5nIG9udG8gZWxlbWVudCAoaXNzdWUgIzI5OSlcblx0XHRcdGNoZWNrQ29udGV4dCA9IG51bGw7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH0gXTtcblxuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRpZiAoIChtYXRjaGVyID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2ldLnR5cGUgXSkgKSB7XG5cdFx0XHRtYXRjaGVycyA9IFsgYWRkQ29tYmluYXRvcihlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSwgbWF0Y2hlcikgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2hlciA9IEV4cHIuZmlsdGVyWyB0b2tlbnNbaV0udHlwZSBdLmFwcGx5KCBudWxsLCB0b2tlbnNbaV0ubWF0Y2hlcyApO1xuXG5cdFx0XHQvLyBSZXR1cm4gc3BlY2lhbCB1cG9uIHNlZWluZyBhIHBvc2l0aW9uYWwgbWF0Y2hlclxuXHRcdFx0aWYgKCBtYXRjaGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0XHRcdC8vIEZpbmQgdGhlIG5leHQgcmVsYXRpdmUgb3BlcmF0b3IgKGlmIGFueSkgZm9yIHByb3BlciBoYW5kbGluZ1xuXHRcdFx0XHRqID0gKytpO1xuXHRcdFx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdFx0XHRpZiAoIEV4cHIucmVsYXRpdmVbIHRva2Vuc1tqXS50eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHNldE1hdGNoZXIoXG5cdFx0XHRcdFx0aSA+IDEgJiYgZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICksXG5cdFx0XHRcdFx0aSA+IDEgJiYgdG9TZWxlY3Rvcihcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwcmVjZWRpbmcgdG9rZW4gd2FzIGEgZGVzY2VuZGFudCBjb21iaW5hdG9yLCBpbnNlcnQgYW4gaW1wbGljaXQgYW55LWVsZW1lbnQgYCpgXG5cdFx0XHRcdFx0XHR0b2tlbnMuc2xpY2UoIDAsIGkgLSAxICkuY29uY2F0KHsgdmFsdWU6IHRva2Vuc1sgaSAtIDIgXS50eXBlID09PSBcIiBcIiA/IFwiKlwiIDogXCJcIiB9KVxuXHRcdFx0XHRcdCkucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLFxuXHRcdFx0XHRcdG1hdGNoZXIsXG5cdFx0XHRcdFx0aSA8IGogJiYgbWF0Y2hlckZyb21Ub2tlbnMoIHRva2Vucy5zbGljZSggaSwgaiApICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiBtYXRjaGVyRnJvbVRva2VucyggKHRva2VucyA9IHRva2Vucy5zbGljZSggaiApKSApLFxuXHRcdFx0XHRcdGogPCBsZW4gJiYgdG9TZWxlY3RvciggdG9rZW5zIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHRcdG1hdGNoZXJzLnB1c2goIG1hdGNoZXIgKTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudE1hdGNoZXIoIG1hdGNoZXJzICk7XG59XG5cbmZ1bmN0aW9uIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApIHtcblx0dmFyIGJ5U2V0ID0gc2V0TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRieUVsZW1lbnQgPSBlbGVtZW50TWF0Y2hlcnMubGVuZ3RoID4gMCxcblx0XHRzdXBlck1hdGNoZXIgPSBmdW5jdGlvbiggc2VlZCwgY29udGV4dCwgeG1sLCByZXN1bHRzLCBvdXRlcm1vc3QgKSB7XG5cdFx0XHR2YXIgZWxlbSwgaiwgbWF0Y2hlcixcblx0XHRcdFx0bWF0Y2hlZENvdW50ID0gMCxcblx0XHRcdFx0aSA9IFwiMFwiLFxuXHRcdFx0XHR1bm1hdGNoZWQgPSBzZWVkICYmIFtdLFxuXHRcdFx0XHRzZXRNYXRjaGVkID0gW10sXG5cdFx0XHRcdGNvbnRleHRCYWNrdXAgPSBvdXRlcm1vc3RDb250ZXh0LFxuXHRcdFx0XHQvLyBXZSBtdXN0IGFsd2F5cyBoYXZlIGVpdGhlciBzZWVkIGVsZW1lbnRzIG9yIG91dGVybW9zdCBjb250ZXh0XG5cdFx0XHRcdGVsZW1zID0gc2VlZCB8fCBieUVsZW1lbnQgJiYgRXhwci5maW5kW1wiVEFHXCJdKCBcIipcIiwgb3V0ZXJtb3N0ICksXG5cdFx0XHRcdC8vIFVzZSBpbnRlZ2VyIGRpcnJ1bnMgaWZmIHRoaXMgaXMgdGhlIG91dGVybW9zdCBtYXRjaGVyXG5cdFx0XHRcdGRpcnJ1bnNVbmlxdWUgPSAoZGlycnVucyArPSBjb250ZXh0QmFja3VwID09IG51bGwgPyAxIDogTWF0aC5yYW5kb20oKSB8fCAwLjEpLFxuXHRcdFx0XHRsZW4gPSBlbGVtcy5sZW5ndGg7XG5cblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dCA9PT0gZG9jdW1lbnQgfHwgY29udGV4dCB8fCBvdXRlcm1vc3Q7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBlbGVtZW50cyBwYXNzaW5nIGVsZW1lbnRNYXRjaGVycyBkaXJlY3RseSB0byByZXN1bHRzXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTw5LCBTYWZhcmlcblx0XHRcdC8vIFRvbGVyYXRlIE5vZGVMaXN0IHByb3BlcnRpZXMgKElFOiBcImxlbmd0aFwiOyBTYWZhcmk6IDxudW1iZXI+KSBtYXRjaGluZyBlbGVtZW50cyBieSBpZFxuXHRcdFx0Zm9yICggOyBpICE9PSBsZW4gJiYgKGVsZW0gPSBlbGVtc1tpXSkgIT0gbnVsbDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGJ5RWxlbWVudCAmJiBlbGVtICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdGlmICggIWNvbnRleHQgJiYgZWxlbS5vd25lckRvY3VtZW50ICE9PSBkb2N1bWVudCApIHtcblx0XHRcdFx0XHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdFx0XHRcdFx0XHR4bWwgPSAhZG9jdW1lbnRJc0hUTUw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBlbGVtZW50TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIG1hdGNoZXIoIGVsZW0sIGNvbnRleHQgfHwgZG9jdW1lbnQsIHhtbCkgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUcmFjayB1bm1hdGNoZWQgZWxlbWVudHMgZm9yIHNldCBmaWx0ZXJzXG5cdFx0XHRcdGlmICggYnlTZXQgKSB7XG5cdFx0XHRcdFx0Ly8gVGhleSB3aWxsIGhhdmUgZ29uZSB0aHJvdWdoIGFsbCBwb3NzaWJsZSBtYXRjaGVyc1xuXHRcdFx0XHRcdGlmICggKGVsZW0gPSAhbWF0Y2hlciAmJiBlbGVtKSApIHtcblx0XHRcdFx0XHRcdG1hdGNoZWRDb3VudC0tO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIExlbmd0aGVuIHRoZSBhcnJheSBmb3IgZXZlcnkgZWxlbWVudCwgbWF0Y2hlZCBvciBub3Rcblx0XHRcdFx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRcdFx0XHR1bm1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBgaWAgaXMgbm93IHRoZSBjb3VudCBvZiBlbGVtZW50cyB2aXNpdGVkIGFib3ZlLCBhbmQgYWRkaW5nIGl0IHRvIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBtYWtlcyB0aGUgbGF0dGVyIG5vbm5lZ2F0aXZlLlxuXHRcdFx0bWF0Y2hlZENvdW50ICs9IGk7XG5cblx0XHRcdC8vIEFwcGx5IHNldCBmaWx0ZXJzIHRvIHVubWF0Y2hlZCBlbGVtZW50c1xuXHRcdFx0Ly8gTk9URTogVGhpcyBjYW4gYmUgc2tpcHBlZCBpZiB0aGVyZSBhcmUgbm8gdW5tYXRjaGVkIGVsZW1lbnRzIChpLmUuLCBgbWF0Y2hlZENvdW50YFxuXHRcdFx0Ly8gZXF1YWxzIGBpYCksIHVubGVzcyB3ZSBkaWRuJ3QgdmlzaXQgX2FueV8gZWxlbWVudHMgaW4gdGhlIGFib3ZlIGxvb3AgYmVjYXVzZSB3ZSBoYXZlXG5cdFx0XHQvLyBubyBlbGVtZW50IG1hdGNoZXJzIGFuZCBubyBzZWVkLlxuXHRcdFx0Ly8gSW5jcmVtZW50aW5nIGFuIGluaXRpYWxseS1zdHJpbmcgXCIwXCIgYGlgIGFsbG93cyBgaWAgdG8gcmVtYWluIGEgc3RyaW5nIG9ubHkgaW4gdGhhdFxuXHRcdFx0Ly8gY2FzZSwgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBcIjAwXCIgYG1hdGNoZWRDb3VudGAgdGhhdCBkaWZmZXJzIGZyb20gYGlgIGJ1dCBpcyBhbHNvXG5cdFx0XHQvLyBudW1lcmljYWxseSB6ZXJvLlxuXHRcdFx0aWYgKCBieVNldCAmJiBpICE9PSBtYXRjaGVkQ291bnQgKSB7XG5cdFx0XHRcdGogPSAwO1xuXHRcdFx0XHR3aGlsZSAoIChtYXRjaGVyID0gc2V0TWF0Y2hlcnNbaisrXSkgKSB7XG5cdFx0XHRcdFx0bWF0Y2hlciggdW5tYXRjaGVkLCBzZXRNYXRjaGVkLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHQvLyBSZWludGVncmF0ZSBlbGVtZW50IG1hdGNoZXMgdG8gZWxpbWluYXRlIHRoZSBuZWVkIGZvciBzb3J0aW5nXG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVkQ291bnQgPiAwICkge1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggISh1bm1hdGNoZWRbaV0gfHwgc2V0TWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0c2V0TWF0Y2hlZFtpXSA9IHBvcC5jYWxsKCByZXN1bHRzICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBEaXNjYXJkIGluZGV4IHBsYWNlaG9sZGVyIHZhbHVlcyB0byBnZXQgb25seSBhY3R1YWwgbWF0Y2hlc1xuXHRcdFx0XHRcdHNldE1hdGNoZWQgPSBjb25kZW5zZSggc2V0TWF0Y2hlZCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQWRkIG1hdGNoZXMgdG8gcmVzdWx0c1xuXHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZXRNYXRjaGVkICk7XG5cblx0XHRcdFx0Ly8gU2VlZGxlc3Mgc2V0IG1hdGNoZXMgc3VjY2VlZGluZyBtdWx0aXBsZSBzdWNjZXNzZnVsIG1hdGNoZXJzIHN0aXB1bGF0ZSBzb3J0aW5nXG5cdFx0XHRcdGlmICggb3V0ZXJtb3N0ICYmICFzZWVkICYmIHNldE1hdGNoZWQubGVuZ3RoID4gMCAmJlxuXHRcdFx0XHRcdCggbWF0Y2hlZENvdW50ICsgc2V0TWF0Y2hlcnMubGVuZ3RoICkgPiAxICkge1xuXG5cdFx0XHRcdFx0U2l6emxlLnVuaXF1ZVNvcnQoIHJlc3VsdHMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBPdmVycmlkZSBtYW5pcHVsYXRpb24gb2YgZ2xvYmFscyBieSBuZXN0ZWQgbWF0Y2hlcnNcblx0XHRcdGlmICggb3V0ZXJtb3N0ICkge1xuXHRcdFx0XHRkaXJydW5zID0gZGlycnVuc1VuaXF1ZTtcblx0XHRcdFx0b3V0ZXJtb3N0Q29udGV4dCA9IGNvbnRleHRCYWNrdXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB1bm1hdGNoZWQ7XG5cdFx0fTtcblxuXHRyZXR1cm4gYnlTZXQgP1xuXHRcdG1hcmtGdW5jdGlvbiggc3VwZXJNYXRjaGVyICkgOlxuXHRcdHN1cGVyTWF0Y2hlcjtcbn1cblxuY29tcGlsZSA9IFNpenpsZS5jb21waWxlID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBtYXRjaCAvKiBJbnRlcm5hbCBVc2UgT25seSAqLyApIHtcblx0dmFyIGksXG5cdFx0c2V0TWF0Y2hlcnMgPSBbXSxcblx0XHRlbGVtZW50TWF0Y2hlcnMgPSBbXSxcblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlWyBzZWxlY3RvciArIFwiIFwiIF07XG5cblx0aWYgKCAhY2FjaGVkICkge1xuXHRcdC8vIEdlbmVyYXRlIGEgZnVuY3Rpb24gb2YgcmVjdXJzaXZlIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoZWNrIGVhY2ggZWxlbWVudFxuXHRcdGlmICggIW1hdGNoICkge1xuXHRcdFx0bWF0Y2ggPSB0b2tlbml6ZSggc2VsZWN0b3IgKTtcblx0XHR9XG5cdFx0aSA9IG1hdGNoLmxlbmd0aDtcblx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdGNhY2hlZCA9IG1hdGNoZXJGcm9tVG9rZW5zKCBtYXRjaFtpXSApO1xuXHRcdFx0aWYgKCBjYWNoZWRbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0c2V0TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRlbGVtZW50TWF0Y2hlcnMucHVzaCggY2FjaGVkICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FjaGUgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uXG5cdFx0Y2FjaGVkID0gY29tcGlsZXJDYWNoZSggc2VsZWN0b3IsIG1hdGNoZXJGcm9tR3JvdXBNYXRjaGVycyggZWxlbWVudE1hdGNoZXJzLCBzZXRNYXRjaGVycyApICk7XG5cblx0XHQvLyBTYXZlIHNlbGVjdG9yIGFuZCB0b2tlbml6YXRpb25cblx0XHRjYWNoZWQuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0fVxuXHRyZXR1cm4gY2FjaGVkO1xufTtcblxuLyoqXG4gKiBBIGxvdy1sZXZlbCBzZWxlY3Rpb24gZnVuY3Rpb24gdGhhdCB3b3JrcyB3aXRoIFNpenpsZSdzIGNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge1N0cmluZ3xGdW5jdGlvbn0gc2VsZWN0b3IgQSBzZWxlY3RvciBvciBhIHByZS1jb21waWxlZFxuICogIHNlbGVjdG9yIGZ1bmN0aW9uIGJ1aWx0IHdpdGggU2l6emxlLmNvbXBpbGVcbiAqIEBwYXJhbSB7RWxlbWVudH0gY29udGV4dFxuICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdHNdXG4gKiBAcGFyYW0ge0FycmF5fSBbc2VlZF0gQSBzZXQgb2YgZWxlbWVudHMgdG8gbWF0Y2ggYWdhaW5zdFxuICovXG5zZWxlY3QgPSBTaXp6bGUuc2VsZWN0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgaSwgdG9rZW5zLCB0b2tlbiwgdHlwZSwgZmluZCxcblx0XHRjb21waWxlZCA9IHR5cGVvZiBzZWxlY3RvciA9PT0gXCJmdW5jdGlvblwiICYmIHNlbGVjdG9yLFxuXHRcdG1hdGNoID0gIXNlZWQgJiYgdG9rZW5pemUoIChzZWxlY3RvciA9IGNvbXBpbGVkLnNlbGVjdG9yIHx8IHNlbGVjdG9yKSApO1xuXG5cdHJlc3VsdHMgPSByZXN1bHRzIHx8IFtdO1xuXG5cdC8vIFRyeSB0byBtaW5pbWl6ZSBvcGVyYXRpb25zIGlmIHRoZXJlIGlzIG9ubHkgb25lIHNlbGVjdG9yIGluIHRoZSBsaXN0IGFuZCBubyBzZWVkXG5cdC8vICh0aGUgbGF0dGVyIG9mIHdoaWNoIGd1YXJhbnRlZXMgdXMgY29udGV4dClcblx0aWYgKCBtYXRjaC5sZW5ndGggPT09IDEgKSB7XG5cblx0XHQvLyBSZWR1Y2UgY29udGV4dCBpZiB0aGUgbGVhZGluZyBjb21wb3VuZCBzZWxlY3RvciBpcyBhbiBJRFxuXHRcdHRva2VucyA9IG1hdGNoWzBdID0gbWF0Y2hbMF0uc2xpY2UoIDAgKTtcblx0XHRpZiAoIHRva2Vucy5sZW5ndGggPiAyICYmICh0b2tlbiA9IHRva2Vuc1swXSkudHlwZSA9PT0gXCJJRFwiICYmXG5cdFx0XHRcdGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiYgRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0Ly8gU2hvdWxkIHJldHVybiAxLCBidXQgcmV0dXJucyA0IChmb2xsb3dpbmcpXG5cdHJldHVybiBlbC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiggZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImZpZWxkc2V0XCIpICkgJiAxO1xufSk7XG5cbi8vIFN1cHBvcnQ6IElFPDhcbi8vIFByZXZlbnQgYXR0cmlidXRlL3Byb3BlcnR5IFwiaW50ZXJwb2xhdGlvblwiXG4vLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L21zNTM2NDI5JTI4VlMuODUlMjkuYXNweFxuaWYgKCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZShcImhyZWZcIikgPT09IFwiI1wiIDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidHlwZXxocmVmfGhlaWdodHx3aWR0aFwiLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJ0eXBlXCIgPyAxIDogMiApO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBkZWZhdWx0VmFsdWUgaW4gcGxhY2Ugb2YgZ2V0QXR0cmlidXRlKFwidmFsdWVcIilcbmlmICggIXN1cHBvcnQuYXR0cmlidXRlcyB8fCAhYXNzZXJ0KGZ1bmN0aW9uKCBlbCApIHtcblx0ZWwuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRlbC5maXJzdENoaWxkLnNldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiLCBcIlwiICk7XG5cdHJldHVybiBlbC5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSggXCJ2YWx1ZVwiICkgPT09IFwiXCI7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInZhbHVlXCIsIGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHRpZiAoICFpc1hNTCAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiApIHtcblx0XHRcdHJldHVybiBlbGVtLmRlZmF1bHRWYWx1ZTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZ2V0QXR0cmlidXRlTm9kZSB0byBmZXRjaCBib29sZWFucyB3aGVuIGdldEF0dHJpYnV0ZSBsaWVzXG5pZiAoICFhc3NlcnQoZnVuY3Rpb24oIGVsICkge1xuXHRyZXR1cm4gZWwuZ2V0QXR0cmlidXRlKFwiZGlzYWJsZWRcIikgPT0gbnVsbDtcbn0pICkge1xuXHRhZGRIYW5kbGUoIGJvb2xlYW5zLCBmdW5jdGlvbiggZWxlbSwgbmFtZSwgaXNYTUwgKSB7XG5cdFx0dmFyIHZhbDtcblx0XHRpZiAoICFpc1hNTCApIHtcblx0XHRcdHJldHVybiBlbGVtWyBuYW1lIF0gPT09IHRydWUgPyBuYW1lLnRvTG93ZXJDYXNlKCkgOlxuXHRcdFx0XHRcdCh2YWwgPSBlbGVtLmdldEF0dHJpYnV0ZU5vZGUoIG5hbWUgKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdFx0dmFsLnZhbHVlIDpcblx0XHRcdFx0bnVsbDtcblx0XHR9XG5cdH0pO1xufVxuXG5yZXR1cm4gU2l6emxlO1xuXG59KSggd2luZG93ICk7XG5cblxuXG5qUXVlcnkuZmluZCA9IFNpenpsZTtcbmpRdWVyeS5leHByID0gU2l6emxlLnNlbGVjdG9ycztcblxuLy8gRGVwcmVjYXRlZFxualF1ZXJ5LmV4cHJbIFwiOlwiIF0gPSBqUXVlcnkuZXhwci5wc2V1ZG9zO1xualF1ZXJ5LnVuaXF1ZVNvcnQgPSBqUXVlcnkudW5pcXVlID0gU2l6emxlLnVuaXF1ZVNvcnQ7XG5qUXVlcnkudGV4dCA9IFNpenpsZS5nZXRUZXh0O1xualF1ZXJ5LmlzWE1MRG9jID0gU2l6emxlLmlzWE1MO1xualF1ZXJ5LmNvbnRhaW5zID0gU2l6emxlLmNvbnRhaW5zO1xualF1ZXJ5LmVzY2FwZVNlbGVjdG9yID0gU2l6emxlLmVzY2FwZTtcblxuXG5cblxudmFyIGRpciA9IGZ1bmN0aW9uKCBlbGVtLCBkaXIsIHVudGlsICkge1xuXHR2YXIgbWF0Y2hlZCA9IFtdLFxuXHRcdHRydW5jYXRlID0gdW50aWwgIT09IHVuZGVmaW5lZDtcblxuXHR3aGlsZSAoICggZWxlbSA9IGVsZW1bIGRpciBdICkgJiYgZWxlbS5ub2RlVHlwZSAhPT0gOSApIHtcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRpZiAoIHRydW5jYXRlICYmIGpRdWVyeSggZWxlbSApLmlzKCB1bnRpbCApICkge1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdG1hdGNoZWQucHVzaCggZWxlbSApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gbWF0Y2hlZDtcbn07XG5cblxudmFyIHNpYmxpbmdzID0gZnVuY3Rpb24oIG4sIGVsZW0gKSB7XG5cdHZhciBtYXRjaGVkID0gW107XG5cblx0Zm9yICggOyBuOyBuID0gbi5uZXh0U2libGluZyApIHtcblx0XHRpZiAoIG4ubm9kZVR5cGUgPT09IDEgJiYgbiAhPT0gZWxlbSApIHtcblx0XHRcdG1hdGNoZWQucHVzaCggbiApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgcm5lZWRzQ29udGV4dCA9IGpRdWVyeS5leHByLm1hdGNoLm5lZWRzQ29udGV4dDtcblxuXG5cbmZ1bmN0aW9uIG5vZGVOYW1lKCBlbGVtLCBuYW1lICkge1xuXG4gIHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG59O1xudmFyIHJzaW5nbGVUYWcgPSAoIC9ePChbYS16XVteXFwvXFwwPjpcXHgyMFxcdFxcclxcblxcZl0qKVtcXHgyMFxcdFxcclxcblxcZl0qXFwvPz4oPzo8XFwvXFwxPnwpJC9pICk7XG5cblxuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggaXNGdW5jdGlvbiggcXVhbGlmaWVyICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0sIGkgKSB7XG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gU2luZ2xlIGVsZW1lbnRcblx0aWYgKCBxdWFsaWZpZXIubm9kZVR5cGUgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBlbGVtID09PSBxdWFsaWZpZXIgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEFycmF5bGlrZSBvZiBlbGVtZW50cyAoalF1ZXJ5LCBhcmd1bWVudHMsIEFycmF5KVxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gKCBpbmRleE9mLmNhbGwoIHF1YWxpZmllciwgZWxlbSApID4gLTEgKSAhPT0gbm90O1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEZpbHRlcmVkIGRpcmVjdGx5IGZvciBib3RoIHNpbXBsZSBhbmQgY29tcGxleCBzZWxlY3RvcnNcblx0cmV0dXJuIGpRdWVyeS5maWx0ZXIoIHF1YWxpZmllciwgZWxlbWVudHMsIG5vdCApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0aWYgKCBlbGVtcy5sZW5ndGggPT09IDEgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBleHByICkgPyBbIGVsZW0gXSA6IFtdO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0ubm9kZVR5cGUgPT09IDE7XG5cdH0gKSApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmaW5kOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGksIHJldCxcblx0XHRcdGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0c2VsZiA9IHRoaXM7XG5cblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggalF1ZXJ5KCBzZWxlY3RvciApLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBqUXVlcnkuY29udGFpbnMoIHNlbGZbIGkgXSwgdGhpcyApICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9ICkgKTtcblx0XHR9XG5cblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggW10gKTtcblxuXHRcdGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRqUXVlcnkuZmluZCggc2VsZWN0b3IsIHNlbGZbIGkgXSwgcmV0ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGxlbiA+IDEgPyBqUXVlcnkudW5pcXVlU29ydCggcmV0ICkgOiByZXQ7XG5cdH0sXG5cdGZpbHRlcjogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgZmFsc2UgKSApO1xuXHR9LFxuXHRub3Q6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHdpbm5vdyggdGhpcywgc2VsZWN0b3IgfHwgW10sIHRydWUgKSApO1xuXHR9LFxuXHRpczogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiAhIXdpbm5vdyhcblx0XHRcdHRoaXMsXG5cblx0XHRcdC8vIElmIHRoaXMgaXMgYSBwb3NpdGlvbmFsL3JlbGF0aXZlIHNlbGVjdG9yLCBjaGVjayBtZW1iZXJzaGlwIGluIHRoZSByZXR1cm5lZCBzZXRcblx0XHRcdC8vIHNvICQoXCJwOmZpcnN0XCIpLmlzKFwicDpsYXN0XCIpIHdvbid0IHJldHVybiB0cnVlIGZvciBhIGRvYyB3aXRoIHR3byBcInBcIi5cblx0XHRcdHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiAmJiBybmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICkgP1xuXHRcdFx0XHRqUXVlcnkoIHNlbGVjdG9yICkgOlxuXHRcdFx0XHRzZWxlY3RvciB8fCBbXSxcblx0XHRcdGZhbHNlXG5cdFx0KS5sZW5ndGg7XG5cdH1cbn0gKTtcblxuXG4vLyBJbml0aWFsaXplIGEgalF1ZXJ5IG9iamVjdFxuXG5cbi8vIEEgY2VudHJhbCByZWZlcmVuY2UgdG8gdGhlIHJvb3QgalF1ZXJ5KGRvY3VtZW50KVxudmFyIHJvb3RqUXVlcnksXG5cblx0Ly8gQSBzaW1wbGUgd2F5IHRvIGNoZWNrIGZvciBIVE1MIHN0cmluZ3Ncblx0Ly8gUHJpb3JpdGl6ZSAjaWQgb3ZlciA8dGFnPiB0byBhdm9pZCBYU1MgdmlhIGxvY2F0aW9uLmhhc2ggKCM5NTIxKVxuXHQvLyBTdHJpY3QgSFRNTCByZWNvZ25pdGlvbiAoIzExMjkwOiBtdXN0IHN0YXJ0IHdpdGggPClcblx0Ly8gU2hvcnRjdXQgc2ltcGxlICNpZCBjYXNlIGZvciBzcGVlZFxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKykpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGlzRnVuY3Rpb24oIHRoaXNbIG1hdGNoIF0gKSApIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzWyBtYXRjaCBdKCBjb250ZXh0WyBtYXRjaCBdICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIG90aGVyd2lzZSBzZXQgYXMgYXR0cmlidXRlc1xuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuYXR0ciggbWF0Y2gsIGNvbnRleHRbIG1hdGNoIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXG5cdFx0XHRcdC8vIEhBTkRMRTogJCgjaWQpXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZWxlbSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCBtYXRjaFsgMiBdICk7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0gKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggaXNGdW5jdGlvbiggc2VsZWN0b3IgKSApIHtcblx0XHRcdHJldHVybiByb290LnJlYWR5ICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRyb290LnJlYWR5KCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBFeGVjdXRlIGltbWVkaWF0ZWx5IGlmIHJlYWR5IGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdHNlbGVjdG9yKCBqUXVlcnkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHRhcmdldHMgPSB0eXBlb2Ygc2VsZWN0b3JzICE9PSBcInN0cmluZ1wiICYmIGpRdWVyeSggc2VsZWN0b3JzICk7XG5cblx0XHQvLyBQb3NpdGlvbmFsIHNlbGVjdG9ycyBuZXZlciBtYXRjaCwgc2luY2UgdGhlcmUncyBubyBfc2VsZWN0aW9uXyBjb250ZXh0XG5cdFx0aWYgKCAhcm5lZWRzQ29udGV4dC50ZXN0KCBzZWxlY3RvcnMgKSApIHtcblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0Zm9yICggY3VyID0gdGhpc1sgaSBdOyBjdXIgJiYgY3VyICE9PSBjb250ZXh0OyBjdXIgPSBjdXIucGFyZW50Tm9kZSApIHtcblxuXHRcdFx0XHRcdC8vIEFsd2F5cyBza2lwIGRvY3VtZW50IGZyYWdtZW50c1xuXHRcdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCB0YXJnZXRzID9cblx0XHRcdFx0XHRcdHRhcmdldHMuaW5kZXgoIGN1ciApID4gLTEgOlxuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRcdGN1ci5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGN1ciwgc2VsZWN0b3JzICkgKSApIHtcblxuXHRcdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgICAgIGlmICggbm9kZU5hbWUoIGVsZW0sIFwiaWZyYW1lXCIgKSApIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtLmNvbnRlbnREb2N1bWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN1cHBvcnQ6IElFIDkgLSAxMSBvbmx5LCBpT1MgNyBvbmx5LCBBbmRyb2lkIEJyb3dzZXIgPD00LjMgb25seVxuICAgICAgICAvLyBUcmVhdCB0aGUgdGVtcGxhdGUgZWxlbWVudCBhcyBhIHJlZ3VsYXIgb25lIGluIGJyb3dzZXJzIHRoYXRcbiAgICAgICAgLy8gZG9uJ3Qgc3VwcG9ydCBpdC5cbiAgICAgICAgaWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0ZW1wbGF0ZVwiICkgKSB7XG4gICAgICAgICAgICBlbGVtID0gZWxlbS5jb250ZW50IHx8IGVsZW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgZWxlbS5jaGlsZE5vZGVzICk7XG5cdH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBmbiApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggdW50aWwsIHNlbGVjdG9yICkge1xuXHRcdHZhciBtYXRjaGVkID0galF1ZXJ5Lm1hcCggdGhpcywgZm4sIHVudGlsICk7XG5cblx0XHRpZiAoIG5hbWUuc2xpY2UoIC01ICkgIT09IFwiVW50aWxcIiApIHtcblx0XHRcdHNlbGVjdG9yID0gdW50aWw7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3RvciAmJiB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRtYXRjaGVkID0galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIG1hdGNoZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHRoaXMubGVuZ3RoID4gMSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGR1cGxpY2F0ZXNcblx0XHRcdGlmICggIWd1YXJhbnRlZWRVbmlxdWVbIG5hbWUgXSApIHtcblx0XHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmV2ZXJzZSBvcmRlciBmb3IgcGFyZW50cyogYW5kIHByZXYtZGVyaXZhdGl2ZXNcblx0XHRcdGlmICggcnBhcmVudHNwcmV2LnRlc3QoIG5hbWUgKSApIHtcblx0XHRcdFx0bWF0Y2hlZC5yZXZlcnNlKCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBtYXRjaGVkICk7XG5cdH07XG59ICk7XG52YXIgcm5vdGh0bWx3aGl0ZSA9ICggL1teXFx4MjBcXHRcXHJcXG5cXGZdKy9nICk7XG5cblxuXG4vLyBDb252ZXJ0IFN0cmluZy1mb3JtYXR0ZWQgb3B0aW9ucyBpbnRvIE9iamVjdC1mb3JtYXR0ZWQgb25lc1xuZnVuY3Rpb24gY3JlYXRlT3B0aW9ucyggb3B0aW9ucyApIHtcblx0dmFyIG9iamVjdCA9IHt9O1xuXHRqUXVlcnkuZWFjaCggb3B0aW9ucy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gbG9ja2VkIHx8IG9wdGlvbnMub25jZTtcblxuXHRcdFx0Ly8gRXhlY3V0ZSBjYWxsYmFja3MgZm9yIGFsbCBwZW5kaW5nIGV4ZWN1dGlvbnMsXG5cdFx0XHQvLyByZXNwZWN0aW5nIGZpcmluZ0luZGV4IG92ZXJyaWRlcyBhbmQgcnVudGltZSBjaGFuZ2VzXG5cdFx0XHRmaXJlZCA9IGZpcmluZyA9IHRydWU7XG5cdFx0XHRmb3IgKCA7IHF1ZXVlLmxlbmd0aDsgZmlyaW5nSW5kZXggPSAtMSApIHtcblx0XHRcdFx0bWVtb3J5ID0gcXVldWUuc2hpZnQoKTtcblx0XHRcdFx0d2hpbGUgKCArK2ZpcmluZ0luZGV4IDwgbGlzdC5sZW5ndGggKSB7XG5cblx0XHRcdFx0XHQvLyBSdW4gY2FsbGJhY2sgYW5kIGNoZWNrIGZvciBlYXJseSB0ZXJtaW5hdGlvblxuXHRcdFx0XHRcdGlmICggbGlzdFsgZmlyaW5nSW5kZXggXS5hcHBseSggbWVtb3J5WyAwIF0sIG1lbW9yeVsgMSBdICkgPT09IGZhbHNlICYmXG5cdFx0XHRcdFx0XHRvcHRpb25zLnN0b3BPbkZhbHNlICkge1xuXG5cdFx0XHRcdFx0XHQvLyBKdW1wIHRvIGVuZCBhbmQgZm9yZ2V0IHRoZSBkYXRhIHNvIC5hZGQgZG9lc24ndCByZS1maXJlXG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoO1xuXHRcdFx0XHRcdFx0bWVtb3J5ID0gZmFsc2U7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEZvcmdldCB0aGUgZGF0YSBpZiB3ZSdyZSBkb25lIHdpdGggaXRcblx0XHRcdGlmICggIW9wdGlvbnMubWVtb3J5ICkge1xuXHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0ZmlyaW5nID0gZmFsc2U7XG5cblx0XHRcdC8vIENsZWFuIHVwIGlmIHdlJ3JlIGRvbmUgZmlyaW5nIGZvciBnb29kXG5cdFx0XHRpZiAoIGxvY2tlZCApIHtcblxuXHRcdFx0XHQvLyBLZWVwIGFuIGVtcHR5IGxpc3QgaWYgd2UgaGF2ZSBkYXRhIGZvciBmdXR1cmUgYWRkIGNhbGxzXG5cdFx0XHRcdGlmICggbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBbXTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIHRoaXMgb2JqZWN0IGlzIHNwZW50XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0bGlzdCA9IFwiXCI7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0Ly8gQWN0dWFsIENhbGxiYWNrcyBvYmplY3Rcblx0XHRzZWxmID0ge1xuXG5cdFx0XHQvLyBBZGQgYSBjYWxsYmFjayBvciBhIGNvbGxlY3Rpb24gb2YgY2FsbGJhY2tzIHRvIHRoZSBsaXN0XG5cdFx0XHRhZGQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cblx0XHRcdFx0XHQvLyBJZiB3ZSBoYXZlIG1lbW9yeSBmcm9tIGEgcGFzdCBydW4sIHdlIHNob3VsZCBmaXJlIGFmdGVyIGFkZGluZ1xuXHRcdFx0XHRcdGlmICggbWVtb3J5ICYmICFmaXJpbmcgKSB7XG5cdFx0XHRcdFx0XHRmaXJpbmdJbmRleCA9IGxpc3QubGVuZ3RoIC0gMTtcblx0XHRcdFx0XHRcdHF1ZXVlLnB1c2goIG1lbW9yeSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdCggZnVuY3Rpb24gYWRkKCBhcmdzICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIGFyZ3MsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiB0b1R5cGUoIGFyZyApICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gSW5zcGVjdCByZWN1cnNpdmVseVxuXHRcdFx0XHRcdFx0XHRcdGFkZCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9ICkoIGFyZ3VtZW50cyApO1xuXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYSBjYWxsYmFjayBmcm9tIHRoZSBsaXN0XG5cdFx0XHRyZW1vdmU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRqUXVlcnkuZWFjaCggYXJndW1lbnRzLCBmdW5jdGlvbiggXywgYXJnICkge1xuXHRcdFx0XHRcdHZhciBpbmRleDtcblx0XHRcdFx0XHR3aGlsZSAoICggaW5kZXggPSBqUXVlcnkuaW5BcnJheSggYXJnLCBsaXN0LCBpbmRleCApICkgPiAtMSApIHtcblx0XHRcdFx0XHRcdGxpc3Quc3BsaWNlKCBpbmRleCwgMSApO1xuXG5cdFx0XHRcdFx0XHQvLyBIYW5kbGUgZmlyaW5nIGluZGV4ZXNcblx0XHRcdFx0XHRcdGlmICggaW5kZXggPD0gZmlyaW5nSW5kZXggKSB7XG5cdFx0XHRcdFx0XHRcdGZpcmluZ0luZGV4LS07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gQ2hlY2sgaWYgYSBnaXZlbiBjYWxsYmFjayBpcyBpbiB0aGUgbGlzdC5cblx0XHRcdC8vIElmIG5vIGFyZ3VtZW50IGlzIGdpdmVuLCByZXR1cm4gd2hldGhlciBvciBub3QgbGlzdCBoYXMgY2FsbGJhY2tzIGF0dGFjaGVkLlxuXHRcdFx0aGFzOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdHJldHVybiBmbiA/XG5cdFx0XHRcdFx0alF1ZXJ5LmluQXJyYXkoIGZuLCBsaXN0ICkgPiAtMSA6XG5cdFx0XHRcdFx0bGlzdC5sZW5ndGggPiAwO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gUmVtb3ZlIGFsbCBjYWxsYmFja3MgZnJvbSB0aGUgbGlzdFxuXHRcdFx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGxpc3QgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblxuXHRcdFx0Ly8gRGlzYWJsZSAuZmlyZSBhbmQgLmFkZFxuXHRcdFx0Ly8gQWJvcnQgYW55IGN1cnJlbnQvcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHQvLyBDbGVhciBhbGwgY2FsbGJhY2tzIGFuZCB2YWx1ZXNcblx0XHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRsb2NrZWQgPSBxdWV1ZSA9IFtdO1xuXHRcdFx0XHRsaXN0ID0gbWVtb3J5ID0gXCJcIjtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXHRcdFx0ZGlzYWJsZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gIWxpc3Q7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlXG5cdFx0XHQvLyBBbHNvIGRpc2FibGUgLmFkZCB1bmxlc3Mgd2UgaGF2ZSBtZW1vcnkgKHNpbmNlIGl0IHdvdWxkIGhhdmUgbm8gZWZmZWN0KVxuXHRcdFx0Ly8gQWJvcnQgYW55IHBlbmRpbmcgZXhlY3V0aW9uc1xuXHRcdFx0bG9jazogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGlmICggIW1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5mdW5jdGlvbiBJZGVudGl0eSggdiApIHtcblx0cmV0dXJuIHY7XG59XG5mdW5jdGlvbiBUaHJvd2VyKCBleCApIHtcblx0dGhyb3cgZXg7XG59XG5cbmZ1bmN0aW9uIGFkb3B0VmFsdWUoIHZhbHVlLCByZXNvbHZlLCByZWplY3QsIG5vVmFsdWUgKSB7XG5cdHZhciBtZXRob2Q7XG5cblx0dHJ5IHtcblxuXHRcdC8vIENoZWNrIGZvciBwcm9taXNlIGFzcGVjdCBmaXJzdCB0byBwcml2aWxlZ2Ugc3luY2hyb25vdXMgYmVoYXZpb3Jcblx0XHRpZiAoIHZhbHVlICYmIGlzRnVuY3Rpb24oICggbWV0aG9kID0gdmFsdWUucHJvbWlzZSApICkgKSB7XG5cdFx0XHRtZXRob2QuY2FsbCggdmFsdWUgKS5kb25lKCByZXNvbHZlICkuZmFpbCggcmVqZWN0ICk7XG5cblx0XHQvLyBPdGhlciB0aGVuYWJsZXNcblx0XHR9IGVsc2UgaWYgKCB2YWx1ZSAmJiBpc0Z1bmN0aW9uKCAoIG1ldGhvZCA9IHZhbHVlLnRoZW4gKSApICkge1xuXHRcdFx0bWV0aG9kLmNhbGwoIHZhbHVlLCByZXNvbHZlLCByZWplY3QgKTtcblxuXHRcdC8vIE90aGVyIG5vbi10aGVuYWJsZXNcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBDb250cm9sIGByZXNvbHZlYCBhcmd1bWVudHMgYnkgbGV0dGluZyBBcnJheSNzbGljZSBjYXN0IGJvb2xlYW4gYG5vVmFsdWVgIHRvIGludGVnZXI6XG5cdFx0XHQvLyAqIGZhbHNlOiBbIHZhbHVlIF0uc2xpY2UoIDAgKSA9PiByZXNvbHZlKCB2YWx1ZSApXG5cdFx0XHQvLyAqIHRydWU6IFsgdmFsdWUgXS5zbGljZSggMSApID0+IHJlc29sdmUoKVxuXHRcdFx0cmVzb2x2ZS5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0uc2xpY2UoIG5vVmFsdWUgKSApO1xuXHRcdH1cblxuXHQvLyBGb3IgUHJvbWlzZXMvQSssIGNvbnZlcnQgZXhjZXB0aW9ucyBpbnRvIHJlamVjdGlvbnNcblx0Ly8gU2luY2UgalF1ZXJ5LndoZW4gZG9lc24ndCB1bndyYXAgdGhlbmFibGVzLCB3ZSBjYW4gc2tpcCB0aGUgZXh0cmEgY2hlY2tzIGFwcGVhcmluZyBpblxuXHQvLyBEZWZlcnJlZCN0aGVuIHRvIGNvbmRpdGlvbmFsbHkgc3VwcHJlc3MgcmVqZWN0aW9uLlxuXHR9IGNhdGNoICggdmFsdWUgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCBvbmx5XG5cdFx0Ly8gU3RyaWN0IG1vZGUgZnVuY3Rpb25zIGludm9rZWQgd2l0aG91dCAuY2FsbC8uYXBwbHkgZ2V0IGdsb2JhbC1vYmplY3QgY29udGV4dFxuXHRcdHJlamVjdC5hcHBseSggdW5kZWZpbmVkLCBbIHZhbHVlIF0gKTtcblx0fVxufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGNhbGxiYWNrcyxcblx0XHRcdFx0Ly8gLi4uIC50aGVuIGhhbmRsZXJzLCBhcmd1bWVudCBpbmRleCwgW2ZpbmFsIHN0YXRlXVxuXHRcdFx0XHRbIFwibm90aWZ5XCIsIFwicHJvZ3Jlc3NcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJtZW1vcnlcIiApLFxuXHRcdFx0XHRcdGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSwgMiBdLFxuXHRcdFx0XHRbIFwicmVzb2x2ZVwiLCBcImRvbmVcIiwgalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksXG5cdFx0XHRcdFx0alF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICksIDAsIFwicmVzb2x2ZWRcIiBdLFxuXHRcdFx0XHRbIFwicmVqZWN0XCIsIFwiZmFpbFwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblx0XHRcdFx0XHRqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgMSwgXCJyZWplY3RlZFwiIF1cblx0XHRcdF0sXG5cdFx0XHRzdGF0ZSA9IFwicGVuZGluZ1wiLFxuXHRcdFx0cHJvbWlzZSA9IHtcblx0XHRcdFx0c3RhdGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBzdGF0ZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0YWx3YXlzOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5kb25lKCBhcmd1bWVudHMgKS5mYWlsKCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblx0XHRcdFx0XCJjYXRjaFwiOiBmdW5jdGlvbiggZm4gKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHByb21pc2UudGhlbiggbnVsbCwgZm4gKTtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBLZWVwIHBpcGUgZm9yIGJhY2stY29tcGF0XG5cdFx0XHRcdHBpcGU6IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGpRdWVyeS5EZWZlcnJlZCggZnVuY3Rpb24oIG5ld0RlZmVyICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIE1hcCB0dXBsZXMgKHByb2dyZXNzLCBkb25lLCBmYWlsKSB0byBhcmd1bWVudHMgKGRvbmUsIGZhaWwsIHByb2dyZXNzKVxuXHRcdFx0XHRcdFx0XHR2YXIgZm4gPSBpc0Z1bmN0aW9uKCBmbnNbIHR1cGxlWyA0IF0gXSApICYmIGZuc1sgdHVwbGVbIDQgXSBdO1xuXG5cdFx0XHRcdFx0XHRcdC8vIGRlZmVycmVkLnByb2dyZXNzKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLm5vdGlmeSB9KVxuXHRcdFx0XHRcdFx0XHQvLyBkZWZlcnJlZC5kb25lKGZ1bmN0aW9uKCkgeyBiaW5kIHRvIG5ld0RlZmVyIG9yIG5ld0RlZmVyLnJlc29sdmUgfSlcblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWQuZmFpbChmdW5jdGlvbigpIHsgYmluZCB0byBuZXdEZWZlciBvciBuZXdEZWZlci5yZWplY3QgfSlcblx0XHRcdFx0XHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAxIF0gXSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkID0gZm4gJiYgZm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggcmV0dXJuZWQgJiYgaXNGdW5jdGlvbiggcmV0dXJuZWQucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQucHJvbWlzZSgpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5wcm9ncmVzcyggbmV3RGVmZXIubm90aWZ5IClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LmRvbmUoIG5ld0RlZmVyLnJlc29sdmUgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZmFpbCggbmV3RGVmZXIucmVqZWN0ICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdG5ld0RlZmVyWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXShcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCwgb25Qcm9ncmVzcyApIHtcblx0XHRcdFx0XHR2YXIgbWF4RGVwdGggPSAwO1xuXHRcdFx0XHRcdGZ1bmN0aW9uIHJlc29sdmUoIGRlcHRoLCBkZWZlcnJlZCwgaGFuZGxlciwgc3BlY2lhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdFx0dmFyIHRoYXQgPSB0aGlzLFxuXHRcdFx0XHRcdFx0XHRcdGFyZ3MgPSBhcmd1bWVudHMsXG5cdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdyA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdFx0dmFyIHJldHVybmVkLCB0aGVuO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4zLjMuM1xuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElnbm9yZSBkb3VibGUtcmVzb2x1dGlvbiBhdHRlbXB0c1xuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCA8IG1heERlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkID0gaGFuZGxlci5hcHBseSggdGhhdCwgYXJncyApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy4xXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBodHRwczovL3Byb21pc2VzYXBsdXMuY29tLyNwb2ludC00OFxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCByZXR1cm5lZCA9PT0gZGVmZXJyZWQucHJvbWlzZSgpICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCBcIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvblwiICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IFByb21pc2VzL0ErIHNlY3Rpb25zIDIuMy4zLjEsIDMuNVxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTRcblx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTc1XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBSZXRyaWV2ZSBgdGhlbmAgb25seSBvbmNlXG5cdFx0XHRcdFx0XHRcdFx0XHR0aGVuID0gcmV0dXJuZWQgJiZcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBQcm9taXNlcy9BKyBzZWN0aW9uIDIuMy40XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTY0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgY2hlY2sgb2JqZWN0cyBhbmQgZnVuY3Rpb25zIGZvciB0aGVuYWJpbGl0eVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQoIHR5cGVvZiByZXR1cm5lZCA9PT0gXCJvYmplY3RcIiB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHR5cGVvZiByZXR1cm5lZCA9PT0gXCJmdW5jdGlvblwiICkgJiZcblx0XHRcdFx0XHRcdFx0XHRcdFx0cmV0dXJuZWQudGhlbjtcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gSGFuZGxlIGEgcmV0dXJuZWQgdGhlbmFibGVcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggaXNGdW5jdGlvbiggdGhlbiApICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFNwZWNpYWwgcHJvY2Vzc29ycyAobm90aWZ5KSBqdXN0IHdhaXQgZm9yIHJlc29sdXRpb25cblx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoZW4uY2FsbChcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybmVkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBUaHJvd2VyLCBzcGVjaWFsIClcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE5vcm1hbCBwcm9jZXNzb3JzIChyZXNvbHZlKSBhbHNvIGhvb2sgaW50byBwcm9ncmVzc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gLi4uYW5kIGRpc3JlZ2FyZCBvbGRlciByZXNvbHV0aW9uIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG1heERlcHRoKys7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVuLmNhbGwoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZCxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgSWRlbnRpdHksIHNwZWNpYWwgKSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJlc29sdmUoIG1heERlcHRoLCBkZWZlcnJlZCwgVGhyb3dlciwgc3BlY2lhbCApLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmVzb2x2ZSggbWF4RGVwdGgsIGRlZmVycmVkLCBJZGVudGl0eSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBIYW5kbGUgYWxsIG90aGVyIHJldHVybmVkIHZhbHVlc1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBPbmx5IHN1YnN0aXR1dGUgaGFuZGxlcnMgcGFzcyBvbiBjb250ZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIGhhbmRsZXIgIT09IElkZW50aXR5ICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHRoYXQgPSB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0YXJncyA9IFsgcmV0dXJuZWQgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFByb2Nlc3MgdGhlIHZhbHVlKHMpXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIERlZmF1bHQgcHJvY2VzcyBpcyByZXNvbHZlXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCggc3BlY2lhbCB8fCBkZWZlcnJlZC5yZXNvbHZlV2l0aCApKCB0aGF0LCBhcmdzICk7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgbm9ybWFsIHByb2Nlc3NvcnMgKHJlc29sdmUpIGNhdGNoIGFuZCByZWplY3QgZXhjZXB0aW9uc1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MgPSBzcGVjaWFsID9cblx0XHRcdFx0XHRcdFx0XHRcdG1pZ2h0VGhyb3cgOlxuXHRcdFx0XHRcdFx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0bWlnaHRUaHJvdygpO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayggZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cHJvY2Vzcy5zdGFja1RyYWNlICk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjQuMVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGh0dHBzOi8vcHJvbWlzZXNhcGx1cy5jb20vI3BvaW50LTYxXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gSWdub3JlIHBvc3QtcmVzb2x1dGlvbiBleGNlcHRpb25zXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBkZXB0aCArIDEgPj0gbWF4RGVwdGggKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIE9ubHkgc3Vic3RpdHV0ZSBoYW5kbGVycyBwYXNzIG9uIGNvbnRleHRcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIGFuZCBtdWx0aXBsZSB2YWx1ZXMgKG5vbi1zcGVjIGJlaGF2aW9yKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0aWYgKCBoYW5kbGVyICE9PSBUaHJvd2VyICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR0aGF0ID0gdW5kZWZpbmVkO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRhcmdzID0gWyBlIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdGRlZmVycmVkLnJlamVjdFdpdGgoIHRoYXQsIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogUHJvbWlzZXMvQSsgc2VjdGlvbiAyLjMuMy4zLjFcblx0XHRcdFx0XHRcdFx0Ly8gaHR0cHM6Ly9wcm9taXNlc2FwbHVzLmNvbS8jcG9pbnQtNTdcblx0XHRcdFx0XHRcdFx0Ly8gUmUtcmVzb2x2ZSBwcm9taXNlcyBpbW1lZGlhdGVseSB0byBkb2RnZSBmYWxzZSByZWplY3Rpb24gZnJvbVxuXHRcdFx0XHRcdFx0XHQvLyBzdWJzZXF1ZW50IGVycm9yc1xuXHRcdFx0XHRcdFx0XHRpZiAoIGRlcHRoICkge1xuXHRcdFx0XHRcdFx0XHRcdHByb2Nlc3MoKTtcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIENhbGwgYW4gb3B0aW9uYWwgaG9vayB0byByZWNvcmQgdGhlIHN0YWNrLCBpbiBjYXNlIG9mIGV4Y2VwdGlvblxuXHRcdFx0XHRcdFx0XHRcdC8vIHNpbmNlIGl0J3Mgb3RoZXJ3aXNlIGxvc3Qgd2hlbiBleGVjdXRpb24gZ29lcyBhc3luY1xuXHRcdFx0XHRcdFx0XHRcdGlmICggalF1ZXJ5LkRlZmVycmVkLmdldFN0YWNrSG9vayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHByb2Nlc3Muc3RhY2tUcmFjZSA9IGpRdWVyeS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIHByb2Nlc3MgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4galF1ZXJ5LkRlZmVycmVkKCBmdW5jdGlvbiggbmV3RGVmZXIgKSB7XG5cblx0XHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25Qcm9ncmVzcyApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUHJvZ3Jlc3MgOlxuXHRcdFx0XHRcdFx0XHRcdFx0SWRlbnRpdHksXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIubm90aWZ5V2l0aFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuYWRkKCAuLi4gKVxuXHRcdFx0XHRcdFx0dHVwbGVzWyAxIF1bIDMgXS5hZGQoXG5cdFx0XHRcdFx0XHRcdHJlc29sdmUoXG5cdFx0XHRcdFx0XHRcdFx0MCxcblx0XHRcdFx0XHRcdFx0XHRuZXdEZWZlcixcblx0XHRcdFx0XHRcdFx0XHRpc0Z1bmN0aW9uKCBvbkZ1bGZpbGxlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uRnVsZmlsbGVkIDpcblx0XHRcdFx0XHRcdFx0XHRcdElkZW50aXR5XG5cdFx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmFkZCggLi4uIClcblx0XHRcdFx0XHRcdHR1cGxlc1sgMiBdWyAzIF0uYWRkKFxuXHRcdFx0XHRcdFx0XHRyZXNvbHZlKFxuXHRcdFx0XHRcdFx0XHRcdDAsXG5cdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXIsXG5cdFx0XHRcdFx0XHRcdFx0aXNGdW5jdGlvbiggb25SZWplY3RlZCApID9cblx0XHRcdFx0XHRcdFx0XHRcdG9uUmVqZWN0ZWQgOlxuXHRcdFx0XHRcdFx0XHRcdFx0VGhyb3dlclxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEFkZCBsaXN0LXNwZWNpZmljIG1ldGhvZHNcblx0XHRqUXVlcnkuZWFjaCggdHVwbGVzLCBmdW5jdGlvbiggaSwgdHVwbGUgKSB7XG5cdFx0XHR2YXIgbGlzdCA9IHR1cGxlWyAyIF0sXG5cdFx0XHRcdHN0YXRlU3RyaW5nID0gdHVwbGVbIDUgXTtcblxuXHRcdFx0Ly8gcHJvbWlzZS5wcm9ncmVzcyA9IGxpc3QuYWRkXG5cdFx0XHQvLyBwcm9taXNlLmRvbmUgPSBsaXN0LmFkZFxuXHRcdFx0Ly8gcHJvbWlzZS5mYWlsID0gbGlzdC5hZGRcblx0XHRcdHByb21pc2VbIHR1cGxlWyAxIF0gXSA9IGxpc3QuYWRkO1xuXG5cdFx0XHQvLyBIYW5kbGUgc3RhdGVcblx0XHRcdGlmICggc3RhdGVTdHJpbmcgKSB7XG5cdFx0XHRcdGxpc3QuYWRkKFxuXHRcdFx0XHRcdGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBzdGF0ZSA9IFwicmVzb2x2ZWRcIiAoaS5lLiwgZnVsZmlsbGVkKVxuXHRcdFx0XHRcdFx0Ly8gc3RhdGUgPSBcInJlamVjdGVkXCJcblx0XHRcdFx0XHRcdHN0YXRlID0gc3RhdGVTdHJpbmc7XG5cdFx0XHRcdFx0fSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0Ly8gZnVsZmlsbGVkX2NhbGxiYWNrcy5kaXNhYmxlXG5cdFx0XHRcdFx0dHVwbGVzWyAzIC0gaSBdWyAyIF0uZGlzYWJsZSxcblxuXHRcdFx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmRpc2FibGVcblx0XHRcdFx0XHQvLyBmdWxmaWxsZWRfaGFuZGxlcnMuZGlzYWJsZVxuXHRcdFx0XHRcdHR1cGxlc1sgMyAtIGkgXVsgMyBdLmRpc2FibGUsXG5cblx0XHRcdFx0XHQvLyBwcm9ncmVzc19jYWxsYmFja3MubG9ja1xuXHRcdFx0XHRcdHR1cGxlc1sgMCBdWyAyIF0ubG9jayxcblxuXHRcdFx0XHRcdC8vIHByb2dyZXNzX2hhbmRsZXJzLmxvY2tcblx0XHRcdFx0XHR0dXBsZXNbIDAgXVsgMyBdLmxvY2tcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gcHJvZ3Jlc3NfaGFuZGxlcnMuZmlyZVxuXHRcdFx0Ly8gZnVsZmlsbGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdC8vIHJlamVjdGVkX2hhbmRsZXJzLmZpcmVcblx0XHRcdGxpc3QuYWRkKCB0dXBsZVsgMyBdLmZpcmUgKTtcblxuXHRcdFx0Ly8gZGVmZXJyZWQubm90aWZ5ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLm5vdGlmeVdpdGgoLi4uKSB9XG5cdFx0XHQvLyBkZWZlcnJlZC5yZXNvbHZlID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlc29sdmVXaXRoKC4uLikgfVxuXHRcdFx0Ly8gZGVmZXJyZWQucmVqZWN0ID0gZnVuY3Rpb24oKSB7IGRlZmVycmVkLnJlamVjdFdpdGgoLi4uKSB9XG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyB1bmRlZmluZWQgOiB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBkZWZlcnJlZC5ub3RpZnlXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0Ly8gZGVmZXJyZWQucmVzb2x2ZVdpdGggPSBsaXN0LmZpcmVXaXRoXG5cdFx0XHQvLyBkZWZlcnJlZC5yZWplY3RXaXRoID0gbGlzdC5maXJlV2l0aFxuXHRcdFx0ZGVmZXJyZWRbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdID0gbGlzdC5maXJlV2l0aDtcblx0XHR9ICk7XG5cblx0XHQvLyBNYWtlIHRoZSBkZWZlcnJlZCBhIHByb21pc2Vcblx0XHRwcm9taXNlLnByb21pc2UoIGRlZmVycmVkICk7XG5cblx0XHQvLyBDYWxsIGdpdmVuIGZ1bmMgaWYgYW55XG5cdFx0aWYgKCBmdW5jICkge1xuXHRcdFx0ZnVuYy5jYWxsKCBkZWZlcnJlZCwgZGVmZXJyZWQgKTtcblx0XHR9XG5cblx0XHQvLyBBbGwgZG9uZSFcblx0XHRyZXR1cm4gZGVmZXJyZWQ7XG5cdH0sXG5cblx0Ly8gRGVmZXJyZWQgaGVscGVyXG5cdHdoZW46IGZ1bmN0aW9uKCBzaW5nbGVWYWx1ZSApIHtcblx0XHR2YXJcblxuXHRcdFx0Ly8gY291bnQgb2YgdW5jb21wbGV0ZWQgc3Vib3JkaW5hdGVzXG5cdFx0XHRyZW1haW5pbmcgPSBhcmd1bWVudHMubGVuZ3RoLFxuXG5cdFx0XHQvLyBjb3VudCBvZiB1bnByb2Nlc3NlZCBhcmd1bWVudHNcblx0XHRcdGkgPSByZW1haW5pbmcsXG5cblx0XHRcdC8vIHN1Ym9yZGluYXRlIGZ1bGZpbGxtZW50IGRhdGFcblx0XHRcdHJlc29sdmVDb250ZXh0cyA9IEFycmF5KCBpICksXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cblx0XHRcdC8vIHRoZSBtYXN0ZXIgRGVmZXJyZWRcblx0XHRcdG1hc3RlciA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBzdWJvcmRpbmF0ZSBjYWxsYmFjayBmYWN0b3J5XG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0cmVzb2x2ZUNvbnRleHRzWyBpIF0gPSB0aGlzO1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gc2xpY2UuY2FsbCggYXJndW1lbnRzICkgOiB2YWx1ZTtcblx0XHRcdFx0XHRpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRtYXN0ZXIucmVzb2x2ZVdpdGgoIHJlc29sdmVDb250ZXh0cywgcmVzb2x2ZVZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH07XG5cblx0XHQvLyBTaW5nbGUtIGFuZCBlbXB0eSBhcmd1bWVudHMgYXJlIGFkb3B0ZWQgbGlrZSBQcm9taXNlLnJlc29sdmVcblx0XHRpZiAoIHJlbWFpbmluZyA8PSAxICkge1xuXHRcdFx0YWRvcHRWYWx1ZSggc2luZ2xlVmFsdWUsIG1hc3Rlci5kb25lKCB1cGRhdGVGdW5jKCBpICkgKS5yZXNvbHZlLCBtYXN0ZXIucmVqZWN0LFxuXHRcdFx0XHQhcmVtYWluaW5nICk7XG5cblx0XHRcdC8vIFVzZSAudGhlbigpIHRvIHVud3JhcCBzZWNvbmRhcnkgdGhlbmFibGVzIChjZi4gZ2gtMzAwMClcblx0XHRcdGlmICggbWFzdGVyLnN0YXRlKCkgPT09IFwicGVuZGluZ1wiIHx8XG5cdFx0XHRcdGlzRnVuY3Rpb24oIHJlc29sdmVWYWx1ZXNbIGkgXSAmJiByZXNvbHZlVmFsdWVzWyBpIF0udGhlbiApICkge1xuXG5cdFx0XHRcdHJldHVybiBtYXN0ZXIudGhlbigpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE11bHRpcGxlIGFyZ3VtZW50cyBhcmUgYWdncmVnYXRlZCBsaWtlIFByb21pc2UuYWxsIGFycmF5IGVsZW1lbnRzXG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRhZG9wdFZhbHVlKCByZXNvbHZlVmFsdWVzWyBpIF0sIHVwZGF0ZUZ1bmMoIGkgKSwgbWFzdGVyLnJlamVjdCApO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXN0ZXIucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlc2UgdXN1YWxseSBpbmRpY2F0ZSBhIHByb2dyYW1tZXIgbWlzdGFrZSBkdXJpbmcgZGV2ZWxvcG1lbnQsXG4vLyB3YXJuIGFib3V0IHRoZW0gQVNBUCByYXRoZXIgdGhhbiBzd2FsbG93aW5nIHRoZW0gYnkgZGVmYXVsdC5cbnZhciByZXJyb3JOYW1lcyA9IC9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO1xuXG5qUXVlcnkuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayA9IGZ1bmN0aW9uKCBlcnJvciwgc3RhY2sgKSB7XG5cblx0Ly8gU3VwcG9ydDogSUUgOCAtIDkgb25seVxuXHQvLyBDb25zb2xlIGV4aXN0cyB3aGVuIGRldiB0b29scyBhcmUgb3Blbiwgd2hpY2ggY2FuIGhhcHBlbiBhdCBhbnkgdGltZVxuXHRpZiAoIHdpbmRvdy5jb25zb2xlICYmIHdpbmRvdy5jb25zb2xlLndhcm4gJiYgZXJyb3IgJiYgcmVycm9yTmFtZXMudGVzdCggZXJyb3IubmFtZSApICkge1xuXHRcdHdpbmRvdy5jb25zb2xlLndhcm4oIFwialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogXCIgKyBlcnJvci5tZXNzYWdlLCBlcnJvci5zdGFjaywgc3RhY2sgKTtcblx0fVxufTtcblxuXG5cblxualF1ZXJ5LnJlYWR5RXhjZXB0aW9uID0gZnVuY3Rpb24oIGVycm9yICkge1xuXHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0dGhyb3cgZXJyb3I7XG5cdH0gKTtcbn07XG5cblxuXG5cbi8vIFRoZSBkZWZlcnJlZCB1c2VkIG9uIERPTSByZWFkeVxudmFyIHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0cmVhZHlMaXN0XG5cdFx0LnRoZW4oIGZuIClcblxuXHRcdC8vIFdyYXAgalF1ZXJ5LnJlYWR5RXhjZXB0aW9uIGluIGEgZnVuY3Rpb24gc28gdGhhdCB0aGUgbG9va3VwXG5cdFx0Ly8gaGFwcGVucyBhdCB0aGUgdGltZSBvZiBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mIGNhbGxiYWNrXG5cdFx0Ly8gcmVnaXN0cmF0aW9uLlxuXHRcdC5jYXRjaCggZnVuY3Rpb24oIGVycm9yICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5RXhjZXB0aW9uKCBlcnJvciApO1xuXHRcdH0gKTtcblxuXHRyZXR1cm4gdGhpcztcbn07XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBJcyB0aGUgRE9NIHJlYWR5IHRvIGJlIHVzZWQ/IFNldCB0byB0cnVlIG9uY2UgaXQgb2NjdXJzLlxuXHRpc1JlYWR5OiBmYWxzZSxcblxuXHQvLyBBIGNvdW50ZXIgdG8gdHJhY2sgaG93IG1hbnkgaXRlbXMgdG8gd2FpdCBmb3IgYmVmb3JlXG5cdC8vIHRoZSByZWFkeSBldmVudCBmaXJlcy4gU2VlICM2NzgxXG5cdHJlYWR5V2FpdDogMSxcblxuXHQvLyBIYW5kbGUgd2hlbiB0aGUgRE9NIGlzIHJlYWR5XG5cdHJlYWR5OiBmdW5jdGlvbiggd2FpdCApIHtcblxuXHRcdC8vIEFib3J0IGlmIHRoZXJlIGFyZSBwZW5kaW5nIGhvbGRzIG9yIHdlJ3JlIGFscmVhZHkgcmVhZHlcblx0XHRpZiAoIHdhaXQgPT09IHRydWUgPyAtLWpRdWVyeS5yZWFkeVdhaXQgOiBqUXVlcnkuaXNSZWFkeSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBSZW1lbWJlciB0aGF0IHRoZSBET00gaXMgcmVhZHlcblx0XHRqUXVlcnkuaXNSZWFkeSA9IHRydWU7XG5cblx0XHQvLyBJZiBhIG5vcm1hbCBET00gUmVhZHkgZXZlbnQgZmlyZWQsIGRlY3JlbWVudCwgYW5kIHdhaXQgaWYgbmVlZCBiZVxuXHRcdGlmICggd2FpdCAhPT0gdHJ1ZSAmJiAtLWpRdWVyeS5yZWFkeVdhaXQgPiAwICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMgYm91bmQsIHRvIGV4ZWN1dGVcblx0XHRyZWFkeUxpc3QucmVzb2x2ZVdpdGgoIGRvY3VtZW50LCBbIGpRdWVyeSBdICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LnJlYWR5LnRoZW4gPSByZWFkeUxpc3QudGhlbjtcblxuLy8gVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbmZ1bmN0aW9uIGNvbXBsZXRlZCgpIHtcblx0ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXHR3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRqUXVlcnkucmVhZHkoKTtcbn1cblxuLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcbi8vIGFmdGVyIHRoZSBicm93c2VyIGV2ZW50IGhhcyBhbHJlYWR5IG9jY3VycmVkLlxuLy8gU3VwcG9ydDogSUUgPD05IC0gMTAgb25seVxuLy8gT2xkZXIgSUUgc29tZXRpbWVzIHNpZ25hbHMgXCJpbnRlcmFjdGl2ZVwiIHRvbyBzb29uXG5pZiAoIGRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIiB8fFxuXHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHQvLyBIYW5kbGUgaXQgYXN5bmNocm9ub3VzbHkgdG8gYWxsb3cgc2NyaXB0cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGVsYXkgcmVhZHlcblx0d2luZG93LnNldFRpbWVvdXQoIGpRdWVyeS5yZWFkeSApO1xuXG59IGVsc2Uge1xuXG5cdC8vIFVzZSB0aGUgaGFuZHkgZXZlbnQgY2FsbGJhY2tcblx0ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJET01Db250ZW50TG9hZGVkXCIsIGNvbXBsZXRlZCApO1xuXG5cdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG59XG5cblxuXG5cbi8vIE11bHRpZnVuY3Rpb25hbCBtZXRob2QgdG8gZ2V0IGFuZCBzZXQgdmFsdWVzIG9mIGEgY29sbGVjdGlvblxuLy8gVGhlIHZhbHVlL3MgY2FuIG9wdGlvbmFsbHkgYmUgZXhlY3V0ZWQgaWYgaXQncyBhIGZ1bmN0aW9uXG52YXIgYWNjZXNzID0gZnVuY3Rpb24oIGVsZW1zLCBmbiwga2V5LCB2YWx1ZSwgY2hhaW5hYmxlLCBlbXB0eUdldCwgcmF3ICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gZWxlbXMubGVuZ3RoLFxuXHRcdGJ1bGsgPSBrZXkgPT0gbnVsbDtcblxuXHQvLyBTZXRzIG1hbnkgdmFsdWVzXG5cdGlmICggdG9UeXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyYXcgPSB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICggYnVsayApIHtcblxuXHRcdFx0Ly8gQnVsayBvcGVyYXRpb25zIHJ1biBhZ2FpbnN0IHRoZSBlbnRpcmUgc2V0XG5cdFx0XHRpZiAoIHJhdyApIHtcblx0XHRcdFx0Zm4uY2FsbCggZWxlbXMsIHZhbHVlICk7XG5cdFx0XHRcdGZuID0gbnVsbDtcblxuXHRcdFx0Ly8gLi4uZXhjZXB0IHdoZW4gZXhlY3V0aW5nIGZ1bmN0aW9uIHZhbHVlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0YnVsayA9IGZuO1xuXHRcdFx0XHRmbiA9IGZ1bmN0aW9uKCBlbGVtLCBrZXksIHZhbHVlICkge1xuXHRcdFx0XHRcdHJldHVybiBidWxrLmNhbGwoIGpRdWVyeSggZWxlbSApLCB2YWx1ZSApO1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdFx0Zm4oXG5cdFx0XHRcdFx0ZWxlbXNbIGkgXSwga2V5LCByYXcgP1xuXHRcdFx0XHRcdHZhbHVlIDpcblx0XHRcdFx0XHR2YWx1ZS5jYWxsKCBlbGVtc1sgaSBdLCBpLCBmbiggZWxlbXNbIGkgXSwga2V5ICkgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGlmICggY2hhaW5hYmxlICkge1xuXHRcdHJldHVybiBlbGVtcztcblx0fVxuXG5cdC8vIEdldHNcblx0aWYgKCBidWxrICkge1xuXHRcdHJldHVybiBmbi5jYWxsKCBlbGVtcyApO1xuXHR9XG5cblx0cmV0dXJuIGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcblxuXG4vLyBNYXRjaGVzIGRhc2hlZCBzdHJpbmcgZm9yIGNhbWVsaXppbmdcbnZhciBybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW2Etel0pL2c7XG5cbi8vIFVzZWQgYnkgY2FtZWxDYXNlIGFzIGNhbGxiYWNrIHRvIHJlcGxhY2UoKVxuZnVuY3Rpb24gZmNhbWVsQ2FzZSggYWxsLCBsZXR0ZXIgKSB7XG5cdHJldHVybiBsZXR0ZXIudG9VcHBlckNhc2UoKTtcbn1cblxuLy8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuLy8gU3VwcG9ydDogSUUgPD05IC0gMTEsIEVkZ2UgMTIgLSAxNVxuLy8gTWljcm9zb2Z0IGZvcmdvdCB0byBodW1wIHRoZWlyIHZlbmRvciBwcmVmaXggKCM5NTcyKVxuZnVuY3Rpb24gY2FtZWxDYXNlKCBzdHJpbmcgKSB7XG5cdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xufVxudmFyIGFjY2VwdERhdGEgPSBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0Ly8gQWNjZXB0cyBvbmx5OlxuXHQvLyAgLSBOb2RlXG5cdC8vICAgIC0gTm9kZS5FTEVNRU5UX05PREVcblx0Ly8gICAgLSBOb2RlLkRPQ1VNRU5UX05PREVcblx0Ly8gIC0gT2JqZWN0XG5cdC8vICAgIC0gQW55XG5cdHJldHVybiBvd25lci5ub2RlVHlwZSA9PT0gMSB8fCBvd25lci5ub2RlVHlwZSA9PT0gOSB8fCAhKCArb3duZXIubm9kZVR5cGUgKTtcbn07XG5cblxuXG5cbmZ1bmN0aW9uIERhdGEoKSB7XG5cdHRoaXMuZXhwYW5kbyA9IGpRdWVyeS5leHBhbmRvICsgRGF0YS51aWQrKztcbn1cblxuRGF0YS51aWQgPSAxO1xuXG5EYXRhLnByb3RvdHlwZSA9IHtcblxuXHRjYWNoZTogZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlXG5cdFx0dmFyIHZhbHVlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdmFsdWUgKSB7XG5cdFx0XHR2YWx1ZSA9IHt9O1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRpZiAoIHR5cGVvZiBkYXRhID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggZGF0YSApIF0gPSB2YWx1ZTtcblxuXHRcdC8vIEhhbmRsZTogWyBvd25lciwgeyBwcm9wZXJ0aWVzIH0gXSBhcmdzXG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gQ29weSB0aGUgcHJvcGVydGllcyBvbmUtYnktb25lIHRvIHRoZSBjYWNoZSBvYmplY3Rcblx0XHRcdGZvciAoIHByb3AgaW4gZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVbIGNhbWVsQ2FzZSggcHJvcCApIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cblx0XHRcdC8vIEFsd2F5cyB1c2UgY2FtZWxDYXNlIGtleSAoZ2gtMjI1Nylcblx0XHRcdG93bmVyWyB0aGlzLmV4cGFuZG8gXSAmJiBvd25lclsgdGhpcy5leHBhbmRvIF1bIGNhbWVsQ2FzZSgga2V5ICkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cblx0XHQvLyBJbiBjYXNlcyB3aGVyZSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIE5vIGtleSB3YXMgc3BlY2lmaWVkXG5cdFx0Ly8gICAyLiBBIHN0cmluZyBrZXkgd2FzIHNwZWNpZmllZCwgYnV0IG5vIHZhbHVlIHByb3ZpZGVkXG5cdFx0Ly9cblx0XHQvLyBUYWtlIHRoZSBcInJlYWRcIiBwYXRoIGFuZCBhbGxvdyB0aGUgZ2V0IG1ldGhvZCB0byBkZXRlcm1pbmVcblx0XHQvLyB3aGljaCB2YWx1ZSB0byByZXR1cm4sIHJlc3BlY3RpdmVseSBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIFRoZSBlbnRpcmUgY2FjaGUgb2JqZWN0XG5cdFx0Ly8gICAyLiBUaGUgZGF0YSBzdG9yZWQgYXQgdGhlIGtleVxuXHRcdC8vXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fFxuXHRcdFx0XHQoICgga2V5ICYmIHR5cGVvZiBrZXkgPT09IFwic3RyaW5nXCIgKSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgKSB7XG5cblx0XHRcdHJldHVybiB0aGlzLmdldCggb3duZXIsIGtleSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSxcblx0XHRcdGNhY2hlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0aWYgKCBjYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICgga2V5ICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIEFycmF5LmlzQXJyYXkoIGtleSApICkge1xuXG5cdFx0XHRcdC8vIElmIGtleSBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdlIGFsd2F5cyBzZXQgY2FtZWxDYXNlIGtleXMsIHNvIHJlbW92ZSB0aGF0LlxuXHRcdFx0XHRrZXkgPSBrZXkubWFwKCBjYW1lbENhc2UgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGtleSA9IGNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gSWYgYSBrZXkgd2l0aCB0aGUgc3BhY2VzIGV4aXN0cywgdXNlIGl0LlxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRrZXkgPSBrZXkgaW4gY2FjaGUgP1xuXHRcdFx0XHRcdFsga2V5IF0gOlxuXHRcdFx0XHRcdCgga2V5Lm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW10gKTtcblx0XHRcdH1cblxuXHRcdFx0aSA9IGtleS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIGtleVsgaSBdIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIHRoZSBleHBhbmRvIGlmIHRoZXJlJ3Mgbm8gbW9yZSBkYXRhXG5cdFx0aWYgKCBrZXkgPT09IHVuZGVmaW5lZCB8fCBqUXVlcnkuaXNFbXB0eU9iamVjdCggY2FjaGUgKSApIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NVxuXHRcdFx0Ly8gV2Via2l0ICYgQmxpbmsgcGVyZm9ybWFuY2Ugc3VmZmVycyB3aGVuIGRlbGV0aW5nIHByb3BlcnRpZXNcblx0XHRcdC8vIGZyb20gRE9NIG5vZGVzLCBzbyBzZXQgdG8gdW5kZWZpbmVkIGluc3RlYWRcblx0XHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTM3ODYwNyAoYnVnIHJlc3RyaWN0ZWQpXG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGdldERhdGEoIGRhdGEgKSB7XG5cdGlmICggZGF0YSA9PT0gXCJ0cnVlXCIgKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwiZmFsc2VcIiApIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRpZiAoIGRhdGEgPT09IFwibnVsbFwiICkge1xuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Ly8gT25seSBjb252ZXJ0IHRvIGEgbnVtYmVyIGlmIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBzdHJpbmdcblx0aWYgKCBkYXRhID09PSArZGF0YSArIFwiXCIgKSB7XG5cdFx0cmV0dXJuICtkYXRhO1xuXHR9XG5cblx0aWYgKCByYnJhY2UudGVzdCggZGF0YSApICkge1xuXHRcdHJldHVybiBKU09OLnBhcnNlKCBkYXRhICk7XG5cdH1cblxuXHRyZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gZGF0YUF0dHIoIGVsZW0sIGtleSwgZGF0YSApIHtcblx0dmFyIG5hbWU7XG5cblx0Ly8gSWYgbm90aGluZyB3YXMgZm91bmQgaW50ZXJuYWxseSwgdHJ5IHRvIGZldGNoIGFueVxuXHQvLyBkYXRhIGZyb20gdGhlIEhUTUw1IGRhdGEtKiBhdHRyaWJ1dGVcblx0aWYgKCBkYXRhID09PSB1bmRlZmluZWQgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRuYW1lID0gXCJkYXRhLVwiICsga2V5LnJlcGxhY2UoIHJtdWx0aURhc2gsIFwiLSQmXCIgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdGRhdGEgPSBlbGVtLmdldEF0dHJpYnV0ZSggbmFtZSApO1xuXG5cdFx0aWYgKCB0eXBlb2YgZGF0YSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGRhdGEgPSBnZXREYXRhKCBkYXRhICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgMTEgb25seVxuXHRcdFx0XHRcdFx0Ly8gVGhlIGF0dHJzIGVsZW1lbnRzIGNhbiBiZSBudWxsICgjMTQ4OTQpXG5cdFx0XHRcdFx0XHRpZiAoIGF0dHJzWyBpIF0gKSB7XG5cdFx0XHRcdFx0XHRcdG5hbWUgPSBhdHRyc1sgaSBdLm5hbWU7XG5cdFx0XHRcdFx0XHRcdGlmICggbmFtZS5pbmRleE9mKCBcImRhdGEtXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRuYW1lID0gY2FtZWxDYXNlKCBuYW1lLnNsaWNlKCA1ICkgKTtcblx0XHRcdFx0XHRcdFx0XHRkYXRhQXR0ciggZWxlbSwgbmFtZSwgZGF0YVsgbmFtZSBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0cyBtdWx0aXBsZSB2YWx1ZXNcblx0XHRpZiAoIHR5cGVvZiBrZXkgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVVzZXIuc2V0KCB0aGlzLCBrZXkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZGF0YTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gVGhlIGtleSB3aWxsIGFsd2F5cyBiZSBjYW1lbENhc2VkIGluIERhdGFcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSwga2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGtleSApO1xuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFdlIHRyaWVkIHJlYWxseSBoYXJkLCBidXQgdGhlIGRhdGEgZG9lc24ndCBleGlzdC5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgdGhlIGRhdGEuLi5cblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gV2UgYWx3YXlzIHN0b3JlIHRoZSBjYW1lbENhc2VkIGtleVxuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEsIG51bGwsIHRydWUgKTtcblx0fSxcblxuXHRyZW1vdmVEYXRhOiBmdW5jdGlvbigga2V5ICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGF0YVVzZXIucmVtb3ZlKCB0aGlzLCBrZXkgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgcXVldWU7XG5cblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHR0eXBlID0gKCB0eXBlIHx8IFwiZnhcIiApICsgXCJxdWV1ZVwiO1xuXHRcdFx0cXVldWUgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIHR5cGUgKTtcblxuXHRcdFx0Ly8gU3BlZWQgdXAgZGVxdWV1ZSBieSBnZXR0aW5nIG91dCBxdWlja2x5IGlmIHRoaXMgaXMganVzdCBhIGxvb2t1cFxuXHRcdFx0aWYgKCBkYXRhICkge1xuXHRcdFx0XHRpZiAoICFxdWV1ZSB8fCBBcnJheS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbldpdGhpblRyZWUgPSBmdW5jdGlvbiggZWxlbSwgZWwgKSB7XG5cblx0XHQvLyBpc0hpZGRlbldpdGhpblRyZWUgbWlnaHQgYmUgY2FsbGVkIGZyb20galF1ZXJ5I2ZpbHRlciBmdW5jdGlvbjtcblx0XHQvLyBpbiB0aGF0IGNhc2UsIGVsZW1lbnQgd2lsbCBiZSBzZWNvbmQgYXJndW1lbnRcblx0XHRlbGVtID0gZWwgfHwgZWxlbTtcblxuXHRcdC8vIElubGluZSBzdHlsZSB0cnVtcHMgYWxsXG5cdFx0cmV0dXJuIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJub25lXCIgfHxcblx0XHRcdGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJlxuXG5cdFx0XHQvLyBPdGhlcndpc2UsIGNoZWNrIGNvbXB1dGVkIHN0eWxlXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDMgLSA0NVxuXHRcdFx0Ly8gRGlzY29ubmVjdGVkIGVsZW1lbnRzIGNhbiBoYXZlIGNvbXB1dGVkIGRpc3BsYXk6IG5vbmUsIHNvIGZpcnN0IGNvbmZpcm0gdGhhdCBlbGVtIGlzXG5cdFx0XHQvLyBpbiB0aGUgZG9jdW1lbnQuXG5cdFx0XHRqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApICYmXG5cblx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiO1xuXHR9O1xuXG52YXIgc3dhcCA9IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBjYWxsYmFjaywgYXJncyApIHtcblx0dmFyIHJldCwgbmFtZSxcblx0XHRvbGQgPSB7fTtcblxuXHQvLyBSZW1lbWJlciB0aGUgb2xkIHZhbHVlcywgYW5kIGluc2VydCB0aGUgbmV3IG9uZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdG9sZFsgbmFtZSBdID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9wdGlvbnNbIG5hbWUgXTtcblx0fVxuXG5cdHJldCA9IGNhbGxiYWNrLmFwcGx5KCBlbGVtLCBhcmdzIHx8IFtdICk7XG5cblx0Ly8gUmV2ZXJ0IHRoZSBvbGQgdmFsdWVzXG5cdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSBvbGRbIG5hbWUgXTtcblx0fVxuXG5cdHJldHVybiByZXQ7XG59O1xuXG5cblxuXG5mdW5jdGlvbiBhZGp1c3RDU1MoIGVsZW0sIHByb3AsIHZhbHVlUGFydHMsIHR3ZWVuICkge1xuXHR2YXIgYWRqdXN0ZWQsIHNjYWxlLFxuXHRcdG1heEl0ZXJhdGlvbnMgPSAyMCxcblx0XHRjdXJyZW50VmFsdWUgPSB0d2VlbiA/XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuLmN1cigpO1xuXHRcdFx0fSA6XG5cdFx0XHRmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AsIFwiXCIgKTtcblx0XHRcdH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NTRcblx0XHQvLyBIYWx2ZSB0aGUgaXRlcmF0aW9uIHRhcmdldCB2YWx1ZSB0byBwcmV2ZW50IGludGVyZmVyZW5jZSBmcm9tIENTUyB1cHBlciBib3VuZHMgKGdoLTIxNDQpXG5cdFx0aW5pdGlhbCA9IGluaXRpYWwgLyAyO1xuXG5cdFx0Ly8gVHJ1c3QgdW5pdHMgcmVwb3J0ZWQgYnkgalF1ZXJ5LmNzc1xuXHRcdHVuaXQgPSB1bml0IHx8IGluaXRpYWxJblVuaXRbIDMgXTtcblxuXHRcdC8vIEl0ZXJhdGl2ZWx5IGFwcHJveGltYXRlIGZyb20gYSBub256ZXJvIHN0YXJ0aW5nIHBvaW50XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsIHx8IDE7XG5cblx0XHR3aGlsZSAoIG1heEl0ZXJhdGlvbnMtLSApIHtcblxuXHRcdFx0Ly8gRXZhbHVhdGUgYW5kIHVwZGF0ZSBvdXIgYmVzdCBndWVzcyAoZG91YmxpbmcgZ3Vlc3NlcyB0aGF0IHplcm8gb3V0KS5cblx0XHRcdC8vIEZpbmlzaCBpZiB0aGUgc2NhbGUgZXF1YWxzIG9yIGNyb3NzZXMgMSAobWFraW5nIHRoZSBvbGQqbmV3IHByb2R1Y3Qgbm9uLXBvc2l0aXZlKS5cblx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgcHJvcCwgaW5pdGlhbEluVW5pdCArIHVuaXQgKTtcblx0XHRcdGlmICggKCAxIC0gc2NhbGUgKSAqICggMSAtICggc2NhbGUgPSBjdXJyZW50VmFsdWUoKSAvIGluaXRpYWwgfHwgMC41ICkgKSA8PSAwICkge1xuXHRcdFx0XHRtYXhJdGVyYXRpb25zID0gMDtcblx0XHRcdH1cblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cblx0XHR9XG5cblx0XHRpbml0aWFsSW5Vbml0ID0gaW5pdGlhbEluVW5pdCAqIDI7XG5cdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBpbml0aWFsSW5Vbml0ICsgdW5pdCApO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXHR9XG5cblx0aWYgKCB2YWx1ZVBhcnRzICkge1xuXHRcdGluaXRpYWxJblVuaXQgPSAraW5pdGlhbEluVW5pdCB8fCAraW5pdGlhbCB8fCAwO1xuXG5cdFx0Ly8gQXBwbHkgcmVsYXRpdmUgb2Zmc2V0ICgrPS8tPSkgaWYgc3BlY2lmaWVkXG5cdFx0YWRqdXN0ZWQgPSB2YWx1ZVBhcnRzWyAxIF0gP1xuXHRcdFx0aW5pdGlhbEluVW5pdCArICggdmFsdWVQYXJ0c1sgMSBdICsgMSApICogdmFsdWVQYXJ0c1sgMiBdIDpcblx0XHRcdCt2YWx1ZVBhcnRzWyAyIF07XG5cdFx0aWYgKCB0d2VlbiApIHtcblx0XHRcdHR3ZWVuLnVuaXQgPSB1bml0O1xuXHRcdFx0dHdlZW4uc3RhcnQgPSBpbml0aWFsSW5Vbml0O1xuXHRcdFx0dHdlZW4uZW5kID0gYWRqdXN0ZWQ7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBhZGp1c3RlZDtcbn1cblxuXG52YXIgZGVmYXVsdERpc3BsYXlNYXAgPSB7fTtcblxuZnVuY3Rpb24gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKSB7XG5cdHZhciB0ZW1wLFxuXHRcdGRvYyA9IGVsZW0ub3duZXJEb2N1bWVudCxcblx0XHRub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUsXG5cdFx0ZGlzcGxheSA9IGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdO1xuXG5cdGlmICggZGlzcGxheSApIHtcblx0XHRyZXR1cm4gZGlzcGxheTtcblx0fVxuXG5cdHRlbXAgPSBkb2MuYm9keS5hcHBlbmRDaGlsZCggZG9jLmNyZWF0ZUVsZW1lbnQoIG5vZGVOYW1lICkgKTtcblx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIHRlbXAsIFwiZGlzcGxheVwiICk7XG5cblx0dGVtcC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0ZW1wICk7XG5cblx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRkaXNwbGF5ID0gXCJibG9ja1wiO1xuXHR9XG5cdGRlZmF1bHREaXNwbGF5TWFwWyBub2RlTmFtZSBdID0gZGlzcGxheTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSxcblx0XHR2YWx1ZXMgPSBbXSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gZWxlbWVudHMubGVuZ3RoO1xuXG5cdC8vIERldGVybWluZSBuZXcgZGlzcGxheSB2YWx1ZSBmb3IgZWxlbWVudHMgdGhhdCBuZWVkIHRvIGNoYW5nZVxuXHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0ZGlzcGxheSA9IGVsZW0uc3R5bGUuZGlzcGxheTtcblx0XHRpZiAoIHNob3cgKSB7XG5cblx0XHRcdC8vIFNpbmNlIHdlIGZvcmNlIHZpc2liaWxpdHkgdXBvbiBjYXNjYWRlLWhpZGRlbiBlbGVtZW50cywgYW4gaW1tZWRpYXRlIChhbmQgc2xvdylcblx0XHRcdC8vIGNoZWNrIGlzIHJlcXVpcmVkIGluIHRoaXMgZmlyc3QgbG9vcCB1bmxlc3Mgd2UgaGF2ZSBhIG5vbmVtcHR5IGRpc3BsYXkgdmFsdWUgKGVpdGhlclxuXHRcdFx0Ly8gaW5saW5lIG9yIGFib3V0LXRvLWJlLXJlc3RvcmVkKVxuXHRcdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuZ2V0KCBlbGVtLCBcImRpc3BsYXlcIiApIHx8IG51bGw7XG5cdFx0XHRcdGlmICggIXZhbHVlc1sgaW5kZXggXSApIHtcblx0XHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGVsZW0uc3R5bGUuZGlzcGxheSA9PT0gXCJcIiAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZ2V0RGVmYXVsdERpc3BsYXkoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKCBkaXNwbGF5ICE9PSBcIm5vbmVcIiApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gXCJub25lXCI7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgd2hhdCB3ZSdyZSBvdmVyd3JpdGluZ1xuXHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiZGlzcGxheVwiLCBkaXNwbGF5ICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIHRoZSBlbGVtZW50cyBpbiBhIHNlY29uZCBsb29wIHRvIGF2b2lkIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGlmICggdmFsdWVzWyBpbmRleCBdICE9IG51bGwgKSB7XG5cdFx0XHRlbGVtZW50c1sgaW5kZXggXS5zdHlsZS5kaXNwbGF5ID0gdmFsdWVzWyBpbmRleCBdO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50cztcbn1cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuV2l0aGluVHJlZSggdGhpcyApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5zaG93KCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5oaWRlKCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG52YXIgcmNoZWNrYWJsZVR5cGUgPSAoIC9eKD86Y2hlY2tib3h8cmFkaW8pJC9pICk7XG5cbnZhciBydGFnTmFtZSA9ICggLzwoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0rKS9pICk7XG5cbnZhciByc2NyaXB0VHlwZSA9ICggL14kfF5tb2R1bGUkfFxcLyg/OmphdmF8ZWNtYSlzY3JpcHQvaSApO1xuXG5cblxuLy8gV2UgaGF2ZSB0byBjbG9zZSB0aGVzZSB0YWdzIHRvIHN1cHBvcnQgWEhUTUwgKCMxMzIwMClcbnZhciB3cmFwTWFwID0ge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdG9wdGlvbjogWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdLFxuXG5cdC8vIFhIVE1MIHBhcnNlcnMgZG8gbm90IG1hZ2ljYWxseSBpbnNlcnQgZWxlbWVudHMgaW4gdGhlXG5cdC8vIHNhbWUgd2F5IHRoYXQgdGFnIHNvdXAgcGFyc2VycyBkby4gU28gd2UgY2Fubm90IHNob3J0ZW5cblx0Ly8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLlxuXHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdF9kZWZhdWx0OiBbIDAsIFwiXCIsIFwiXCIgXVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbndyYXBNYXAub3B0Z3JvdXAgPSB3cmFwTWFwLm9wdGlvbjtcblxud3JhcE1hcC50Ym9keSA9IHdyYXBNYXAudGZvb3QgPSB3cmFwTWFwLmNvbGdyb3VwID0gd3JhcE1hcC5jYXB0aW9uID0gd3JhcE1hcC50aGVhZDtcbndyYXBNYXAudGggPSB3cmFwTWFwLnRkO1xuXG5cbmZ1bmN0aW9uIGdldEFsbCggY29udGV4dCwgdGFnICkge1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0Ly8gVXNlIHR5cGVvZiB0byBhdm9pZCB6ZXJvLWFyZ3VtZW50IG1ldGhvZCBpbnZvY2F0aW9uIG9uIGhvc3Qgb2JqZWN0cyAoIzE1MTUxKVxuXHR2YXIgcmV0O1xuXG5cdGlmICggdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0cmV0ID0gY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSggdGFnIHx8IFwiKlwiICk7XG5cblx0fSBlbHNlIGlmICggdHlwZW9mIGNvbnRleHQucXVlcnlTZWxlY3RvckFsbCAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRyZXQgPSBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApO1xuXG5cdH0gZWxzZSB7XG5cdFx0cmV0ID0gW107XG5cdH1cblxuXHRpZiAoIHRhZyA9PT0gdW5kZWZpbmVkIHx8IHRhZyAmJiBub2RlTmFtZSggY29udGV4dCwgdGFnICkgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5tZXJnZSggWyBjb250ZXh0IF0sIHJldCApO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggdG9UeXBlKCBlbGVtICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdC8vIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBub2RlcywgZWxlbS5ub2RlVHlwZSA/IFsgZWxlbSBdIDogZWxlbSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IG5vbi1odG1sIGludG8gYSB0ZXh0IG5vZGVcblx0XHRcdH0gZWxzZSBpZiAoICFyaHRtbC50ZXN0KCBlbGVtICkgKSB7XG5cdFx0XHRcdG5vZGVzLnB1c2goIGNvbnRleHQuY3JlYXRlVGV4dE5vZGUoIGVsZW0gKSApO1xuXG5cdFx0XHQvLyBDb252ZXJ0IGh0bWwgaW50byBET00gbm9kZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRtcCA9IHRtcCB8fCBmcmFnbWVudC5hcHBlbmRDaGlsZCggY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkgKTtcblxuXHRcdFx0XHQvLyBEZXNlcmlhbGl6ZSBhIHN0YW5kYXJkIHJlcHJlc2VudGF0aW9uXG5cdFx0XHRcdHRhZyA9ICggcnRhZ05hbWUuZXhlYyggZWxlbSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHR3cmFwID0gd3JhcE1hcFsgdGFnIF0gfHwgd3JhcE1hcC5fZGVmYXVsdDtcblx0XHRcdFx0dG1wLmlubmVySFRNTCA9IHdyYXBbIDEgXSArIGpRdWVyeS5odG1sUHJlZmlsdGVyKCBlbGVtICkgKyB3cmFwWyAyIF07XG5cblx0XHRcdFx0Ly8gRGVzY2VuZCB0aHJvdWdoIHdyYXBwZXJzIHRvIHRoZSByaWdodCBjb250ZW50XG5cdFx0XHRcdGogPSB3cmFwWyAwIF07XG5cdFx0XHRcdHdoaWxlICggai0tICkge1xuXHRcdFx0XHRcdHRtcCA9IHRtcC5sYXN0Q2hpbGQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCB0bXAuY2hpbGROb2RlcyApO1xuXG5cdFx0XHRcdC8vIFJlbWVtYmVyIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyXG5cdFx0XHRcdHRtcCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRcdFx0Ly8gRW5zdXJlIHRoZSBjcmVhdGVkIG5vZGVzIGFyZSBvcnBoYW5lZCAoIzEyMzkyKVxuXHRcdFx0XHR0bXAudGV4dENvbnRlbnQgPSBcIlwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIFJlbW92ZSB3cmFwcGVyIGZyb20gZnJhZ21lbnRcblx0ZnJhZ21lbnQudGV4dENvbnRlbnQgPSBcIlwiO1xuXG5cdGkgPSAwO1xuXHR3aGlsZSAoICggZWxlbSA9IG5vZGVzWyBpKysgXSApICkge1xuXG5cdFx0Ly8gU2tpcCBlbGVtZW50cyBhbHJlYWR5IGluIHRoZSBjb250ZXh0IGNvbGxlY3Rpb24gKHRyYWMtNDA4Nylcblx0XHRpZiAoIHNlbGVjdGlvbiAmJiBqUXVlcnkuaW5BcnJheSggZWxlbSwgc2VsZWN0aW9uICkgPiAtMSApIHtcblx0XHRcdGlmICggaWdub3JlZCApIHtcblx0XHRcdFx0aWdub3JlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRjb250YWlucyA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBBcHBlbmQgdG8gZnJhZ21lbnRcblx0XHR0bXAgPSBnZXRBbGwoIGZyYWdtZW50LmFwcGVuZENoaWxkKCBlbGVtICksIFwic2NyaXB0XCIgKTtcblxuXHRcdC8vIFByZXNlcnZlIHNjcmlwdCBldmFsdWF0aW9uIGhpc3Rvcnlcblx0XHRpZiAoIGNvbnRhaW5zICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggdG1wICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FwdHVyZSBleGVjdXRhYmxlc1xuXHRcdGlmICggc2NyaXB0cyApIHtcblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0bXBbIGorKyBdICkgKSB7XG5cdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggZWxlbS50eXBlIHx8IFwiXCIgKSApIHtcblx0XHRcdFx0XHRzY3JpcHRzLnB1c2goIGVsZW0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmcmFnbWVudDtcbn1cblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0ZGl2ID0gZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApLFxuXHRcdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seVxuXHQvLyBDaGVjayBzdGF0ZSBsb3N0IGlmIHRoZSBuYW1lIGlzIHNldCAoIzExMjE3KVxuXHQvLyBTdXBwb3J0OiBXaW5kb3dzIFdlYiBBcHBzIChXV0EpXG5cdC8vIGBuYW1lYCBhbmQgYHR5cGVgIG11c3QgdXNlIC5zZXRBdHRyaWJ1dGUgZm9yIFdXQSAoIzE0OTAxKVxuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCBcInJhZGlvXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcImNoZWNrZWRcIiwgXCJjaGVja2VkXCIgKTtcblx0aW5wdXQuc2V0QXR0cmlidXRlKCBcIm5hbWVcIiwgXCJ0XCIgKTtcblxuXHRkaXYuYXBwZW5kQ2hpbGQoIGlucHV0ICk7XG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSBvbmx5XG5cdC8vIE9sZGVyIFdlYktpdCBkb2Vzbid0IGNsb25lIGNoZWNrZWQgc3RhdGUgY29ycmVjdGx5IGluIGZyYWdtZW50c1xuXHRzdXBwb3J0LmNoZWNrQ2xvbmUgPSBkaXYuY2xvbmVOb2RlKCB0cnVlICkuY2xvbmVOb2RlKCB0cnVlICkubGFzdENoaWxkLmNoZWNrZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG59ICkoKTtcbnZhciBkb2N1bWVudEVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG5cblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkvO1xuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFNlZSAjMTMzOTMgZm9yIG1vcmUgaW5mb1xuZnVuY3Rpb24gc2FmZUFjdGl2ZUVsZW1lbnQoKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cdH0gY2F0Y2ggKCBlcnIgKSB7IH1cbn1cblxuZnVuY3Rpb24gb24oIGVsZW0sIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4sIG9uZSApIHtcblx0dmFyIG9yaWdGbiwgdHlwZTtcblxuXHQvLyBUeXBlcyBjYW4gYmUgYSBtYXAgb2YgdHlwZXMvaGFuZGxlcnNcblx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyAoIHR5cGVzLU9iamVjdCwgc2VsZWN0b3IsIGRhdGEgKVxuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yICE9PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLU9iamVjdCwgZGF0YSApXG5cdFx0XHRkYXRhID0gZGF0YSB8fCBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0b24oIGVsZW0sIHR5cGUsIHNlbGVjdG9yLCBkYXRhLCB0eXBlc1sgdHlwZSBdLCBvbmUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIGVsZW07XG5cdH1cblxuXHRpZiAoIGRhdGEgPT0gbnVsbCAmJiBmbiA9PSBudWxsICkge1xuXG5cdFx0Ly8gKCB0eXBlcywgZm4gKVxuXHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0ZGF0YSA9IHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHR9IGVsc2UgaWYgKCBmbiA9PSBudWxsICkge1xuXHRcdGlmICggdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBzZWxlY3RvciwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyAoIHR5cGVzLCBkYXRhLCBmbiApXG5cdFx0XHRmbiA9IGRhdGE7XG5cdFx0XHRkYXRhID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0Zm4gPSByZXR1cm5GYWxzZTtcblx0fSBlbHNlIGlmICggIWZuICkge1xuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBvbmUgPT09IDEgKSB7XG5cdFx0b3JpZ0ZuID0gZm47XG5cdFx0Zm4gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG5cblx0XHRcdC8vIENhbiB1c2UgYW4gZW1wdHkgc2V0LCBzaW5jZSBldmVudCBjb250YWlucyB0aGUgaW5mb1xuXHRcdFx0alF1ZXJ5KCkub2ZmKCBldmVudCApO1xuXHRcdFx0cmV0dXJuIG9yaWdGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fTtcblxuXHRcdC8vIFVzZSBzYW1lIGd1aWQgc28gY2FsbGVyIGNhbiByZW1vdmUgdXNpbmcgb3JpZ0ZuXG5cdFx0Zm4uZ3VpZCA9IG9yaWdGbi5ndWlkIHx8ICggb3JpZ0ZuLmd1aWQgPSBqUXVlcnkuZ3VpZCsrICk7XG5cdH1cblx0cmV0dXJuIGVsZW0uZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0alF1ZXJ5LmV2ZW50LmFkZCggdGhpcywgdHlwZXMsIGZuLCBkYXRhLCBzZWxlY3RvciApO1xuXHR9ICk7XG59XG5cbi8qXG4gKiBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYW5hZ2luZyBldmVudHMgLS0gbm90IHBhcnQgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UuXG4gKiBQcm9wcyB0byBEZWFuIEVkd2FyZHMnIGFkZEV2ZW50IGxpYnJhcnkgZm9yIG1hbnkgb2YgdGhlIGlkZWFzLlxuICovXG5qUXVlcnkuZXZlbnQgPSB7XG5cblx0Z2xvYmFsOiB7fSxcblxuXHRhZGQ6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlcywgaGFuZGxlciwgZGF0YSwgc2VsZWN0b3IgKSB7XG5cblx0XHR2YXIgaGFuZGxlT2JqSW4sIGV2ZW50SGFuZGxlLCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHQvLyBEb24ndCBhdHRhY2ggZXZlbnRzIHRvIG5vRGF0YSBvciB0ZXh0L2NvbW1lbnQgbm9kZXMgKGJ1dCBhbGxvdyBwbGFpbiBvYmplY3RzKVxuXHRcdGlmICggIWVsZW1EYXRhICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhbiBvYmplY3Qgb2YgY3VzdG9tIGRhdGEgaW4gbGlldSBvZiB0aGUgaGFuZGxlclxuXHRcdGlmICggaGFuZGxlci5oYW5kbGVyICkge1xuXHRcdFx0aGFuZGxlT2JqSW4gPSBoYW5kbGVyO1xuXHRcdFx0aGFuZGxlciA9IGhhbmRsZU9iakluLmhhbmRsZXI7XG5cdFx0XHRzZWxlY3RvciA9IGhhbmRsZU9iakluLnNlbGVjdG9yO1xuXHRcdH1cblxuXHRcdC8vIEVuc3VyZSB0aGF0IGludmFsaWQgc2VsZWN0b3JzIHRocm93IGV4Y2VwdGlvbnMgYXQgYXR0YWNoIHRpbWVcblx0XHQvLyBFdmFsdWF0ZSBhZ2FpbnN0IGRvY3VtZW50RWxlbWVudCBpbiBjYXNlIGVsZW0gaXMgYSBub24tZWxlbWVudCBub2RlIChlLmcuLCBkb2N1bWVudClcblx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0alF1ZXJ5LmZpbmQubWF0Y2hlc1NlbGVjdG9yKCBkb2N1bWVudEVsZW1lbnQsIHNlbGVjdG9yICk7XG5cdFx0fVxuXG5cdFx0Ly8gTWFrZSBzdXJlIHRoYXQgdGhlIGhhbmRsZXIgaGFzIGEgdW5pcXVlIElELCB1c2VkIHRvIGZpbmQvcmVtb3ZlIGl0IGxhdGVyXG5cdFx0aWYgKCAhaGFuZGxlci5ndWlkICkge1xuXHRcdFx0aGFuZGxlci5ndWlkID0galF1ZXJ5Lmd1aWQrKztcblx0XHR9XG5cblx0XHQvLyBJbml0IHRoZSBlbGVtZW50J3MgZXZlbnQgc3RydWN0dXJlIGFuZCBtYWluIGhhbmRsZXIsIGlmIHRoaXMgaXMgdGhlIGZpcnN0XG5cdFx0aWYgKCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyA9IHt9O1xuXHRcdH1cblx0XHRpZiAoICEoIGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlICkgKSB7XG5cdFx0XHRldmVudEhhbmRsZSA9IGVsZW1EYXRhLmhhbmRsZSA9IGZ1bmN0aW9uKCBlICkge1xuXG5cdFx0XHRcdC8vIERpc2NhcmQgdGhlIHNlY29uZCBldmVudCBvZiBhIGpRdWVyeS5ldmVudC50cmlnZ2VyKCkgYW5kXG5cdFx0XHRcdC8vIHdoZW4gYW4gZXZlbnQgaXMgY2FsbGVkIGFmdGVyIGEgcGFnZSBoYXMgdW5sb2FkZWRcblx0XHRcdFx0cmV0dXJuIHR5cGVvZiBqUXVlcnkgIT09IFwidW5kZWZpbmVkXCIgJiYgalF1ZXJ5LmV2ZW50LnRyaWdnZXJlZCAhPT0gZS50eXBlID9cblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuZGlzcGF0Y2guYXBwbHkoIGVsZW0sIGFyZ3VtZW50cyApIDogdW5kZWZpbmVkO1xuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyBIYW5kbGUgbXVsdGlwbGUgZXZlbnRzIHNlcGFyYXRlZCBieSBhIHNwYWNlXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFRoZXJlICptdXN0KiBiZSBhIHR5cGUsIG5vIGF0dGFjaGluZyBuYW1lc3BhY2Utb25seSBoYW5kbGVyc1xuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGV2ZW50IGNoYW5nZXMgaXRzIHR5cGUsIHVzZSB0aGUgc3BlY2lhbCBldmVudCBoYW5kbGVycyBmb3IgdGhlIGNoYW5nZWQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIElmIHNlbGVjdG9yIGRlZmluZWQsIGRldGVybWluZSBzcGVjaWFsIGV2ZW50IGFwaSB0eXBlLCBvdGhlcndpc2UgZ2l2ZW4gdHlwZVxuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBVcGRhdGUgc3BlY2lhbCBiYXNlZCBvbiBuZXdseSByZXNldCB0eXBlXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblxuXHRcdFx0Ly8gaGFuZGxlT2JqIGlzIHBhc3NlZCB0byBhbGwgZXZlbnQgaGFuZGxlcnNcblx0XHRcdGhhbmRsZU9iaiA9IGpRdWVyeS5leHRlbmQoIHtcblx0XHRcdFx0dHlwZTogdHlwZSxcblx0XHRcdFx0b3JpZ1R5cGU6IG9yaWdUeXBlLFxuXHRcdFx0XHRkYXRhOiBkYXRhLFxuXHRcdFx0XHRoYW5kbGVyOiBoYW5kbGVyLFxuXHRcdFx0XHRndWlkOiBoYW5kbGVyLmd1aWQsXG5cdFx0XHRcdHNlbGVjdG9yOiBzZWxlY3Rvcixcblx0XHRcdFx0bmVlZHNDb250ZXh0OiBzZWxlY3RvciAmJiBqUXVlcnkuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSxcblx0XHRcdFx0bmFtZXNwYWNlOiBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiIClcblx0XHRcdH0sIGhhbmRsZU9iakluICk7XG5cblx0XHRcdC8vIEluaXQgdGhlIGV2ZW50IGhhbmRsZXIgcXVldWUgaWYgd2UncmUgdGhlIGZpcnN0XG5cdFx0XHRpZiAoICEoIGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gKSApIHtcblx0XHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSA9IFtdO1xuXHRcdFx0XHRoYW5kbGVycy5kZWxlZ2F0ZUNvdW50ID0gMDtcblxuXHRcdFx0XHQvLyBPbmx5IHVzZSBhZGRFdmVudExpc3RlbmVyIGlmIHRoZSBzcGVjaWFsIGV2ZW50cyBoYW5kbGVyIHJldHVybnMgZmFsc2Vcblx0XHRcdFx0aWYgKCAhc3BlY2lhbC5zZXR1cCB8fFxuXHRcdFx0XHRcdHNwZWNpYWwuc2V0dXAuY2FsbCggZWxlbSwgZGF0YSwgbmFtZXNwYWNlcywgZXZlbnRIYW5kbGUgKSA9PT0gZmFsc2UgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGVsZW0uYWRkRXZlbnRMaXN0ZW5lciApIHtcblx0XHRcdFx0XHRcdGVsZW0uYWRkRXZlbnRMaXN0ZW5lciggdHlwZSwgZXZlbnRIYW5kbGUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKCBzcGVjaWFsLmFkZCApIHtcblx0XHRcdFx0c3BlY2lhbC5hZGQuY2FsbCggZWxlbSwgaGFuZGxlT2JqICk7XG5cblx0XHRcdFx0aWYgKCAhaGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCApIHtcblx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlci5ndWlkID0gaGFuZGxlci5ndWlkO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCB0byB0aGUgZWxlbWVudCdzIGhhbmRsZXIgbGlzdCwgZGVsZWdhdGVzIGluIGZyb250XG5cdFx0XHRpZiAoIHNlbGVjdG9yICkge1xuXHRcdFx0XHRoYW5kbGVycy5zcGxpY2UoIGhhbmRsZXJzLmRlbGVnYXRlQ291bnQrKywgMCwgaGFuZGxlT2JqICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRoYW5kbGVycy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gS2VlcCB0cmFjayBvZiB3aGljaCBldmVudHMgaGF2ZSBldmVyIGJlZW4gdXNlZCwgZm9yIGV2ZW50IG9wdGltaXphdGlvblxuXHRcdFx0alF1ZXJ5LmV2ZW50Lmdsb2JhbFsgdHlwZSBdID0gdHJ1ZTtcblx0XHR9XG5cblx0fSxcblxuXHQvLyBEZXRhY2ggYW4gZXZlbnQgb3Igc2V0IG9mIGV2ZW50cyBmcm9tIGFuIGVsZW1lbnRcblx0cmVtb3ZlOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIHNlbGVjdG9yLCBtYXBwZWRUeXBlcyApIHtcblxuXHRcdHZhciBqLCBvcmlnQ291bnQsIHRtcCxcblx0XHRcdGV2ZW50cywgdCwgaGFuZGxlT2JqLFxuXHRcdFx0c3BlY2lhbCwgaGFuZGxlcnMsIHR5cGUsIG5hbWVzcGFjZXMsIG9yaWdUeXBlLFxuXHRcdFx0ZWxlbURhdGEgPSBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICkgJiYgZGF0YVByaXYuZ2V0KCBlbGVtICk7XG5cblx0XHRpZiAoICFlbGVtRGF0YSB8fCAhKCBldmVudHMgPSBlbGVtRGF0YS5ldmVudHMgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBPbmNlIGZvciBlYWNoIHR5cGUubmFtZXNwYWNlIGluIHR5cGVzOyB0eXBlIG1heSBiZSBvbWl0dGVkXG5cdFx0dHlwZXMgPSAoIHR5cGVzIHx8IFwiXCIgKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBuYXRpdmVFdmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdHZhciBldmVudCA9IGpRdWVyeS5ldmVudC5maXgoIG5hdGl2ZUV2ZW50ICk7XG5cblx0XHR2YXIgaSwgaiwgcmV0LCBtYXRjaGVkLCBoYW5kbGVPYmosIGhhbmRsZXJRdWV1ZSxcblx0XHRcdGFyZ3MgPSBuZXcgQXJyYXkoIGFyZ3VtZW50cy5sZW5ndGggKSxcblx0XHRcdGhhbmRsZXJzID0gKCBkYXRhUHJpdi5nZXQoIHRoaXMsIFwiZXZlbnRzXCIgKSB8fCB7fSApWyBldmVudC50eXBlIF0gfHwgW10sXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGV2ZW50LnR5cGUgXSB8fCB7fTtcblxuXHRcdC8vIFVzZSB0aGUgZml4LWVkIGpRdWVyeS5FdmVudCByYXRoZXIgdGhhbiB0aGUgKHJlYWQtb25seSkgbmF0aXZlIGV2ZW50XG5cdFx0YXJnc1sgMCBdID0gZXZlbnQ7XG5cblx0XHRmb3IgKCBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKyApIHtcblx0XHRcdGFyZ3NbIGkgXSA9IGFyZ3VtZW50c1sgaSBdO1xuXHRcdH1cblxuXHRcdGV2ZW50LmRlbGVnYXRlVGFyZ2V0ID0gdGhpcztcblxuXHRcdC8vIENhbGwgdGhlIHByZURpc3BhdGNoIGhvb2sgZm9yIHRoZSBtYXBwZWQgdHlwZSwgYW5kIGxldCBpdCBiYWlsIGlmIGRlc2lyZWRcblx0XHRpZiAoIHNwZWNpYWwucHJlRGlzcGF0Y2ggJiYgc3BlY2lhbC5wcmVEaXNwYXRjaC5jYWxsKCB0aGlzLCBldmVudCApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgaGFuZGxlcnNcblx0XHRoYW5kbGVyUXVldWUgPSBqUXVlcnkuZXZlbnQuaGFuZGxlcnMuY2FsbCggdGhpcywgZXZlbnQsIGhhbmRsZXJzICk7XG5cblx0XHQvLyBSdW4gZGVsZWdhdGVzIGZpcnN0OyB0aGV5IG1heSB3YW50IHRvIHN0b3AgcHJvcGFnYXRpb24gYmVuZWF0aCB1c1xuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBtYXRjaGVkID0gaGFuZGxlclF1ZXVlWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0ZXZlbnQuY3VycmVudFRhcmdldCA9IG1hdGNoZWQuZWxlbTtcblxuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggaGFuZGxlT2JqID0gbWF0Y2hlZC5oYW5kbGVyc1sgaisrIF0gKSAmJlxuXHRcdFx0XHQhZXZlbnQuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblxuXHRcdFx0XHQvLyBUcmlnZ2VyZWQgZXZlbnQgbXVzdCBlaXRoZXIgMSkgaGF2ZSBubyBuYW1lc3BhY2UsIG9yIDIpIGhhdmUgbmFtZXNwYWNlKHMpXG5cdFx0XHRcdC8vIGEgc3Vic2V0IG9yIGVxdWFsIHRvIHRob3NlIGluIHRoZSBib3VuZCBldmVudCAoYm90aCBjYW4gaGF2ZSBubyBuYW1lc3BhY2UpLlxuXHRcdFx0XHRpZiAoICFldmVudC5ybmFtZXNwYWNlIHx8IGV2ZW50LnJuYW1lc3BhY2UudGVzdCggaGFuZGxlT2JqLm5hbWVzcGFjZSApICkge1xuXG5cdFx0XHRcdFx0ZXZlbnQuaGFuZGxlT2JqID0gaGFuZGxlT2JqO1xuXHRcdFx0XHRcdGV2ZW50LmRhdGEgPSBoYW5kbGVPYmouZGF0YTtcblxuXHRcdFx0XHRcdHJldCA9ICggKCBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgaGFuZGxlT2JqLm9yaWdUeXBlIF0gfHwge30gKS5oYW5kbGUgfHxcblx0XHRcdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyICkuYXBwbHkoIG1hdGNoZWQuZWxlbSwgYXJncyApO1xuXG5cdFx0XHRcdFx0aWYgKCByZXQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdGlmICggKCBldmVudC5yZXN1bHQgPSByZXQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdFx0XHRcdGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGwgdGhlIHBvc3REaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGVcblx0XHRpZiAoIHNwZWNpYWwucG9zdERpc3BhdGNoICkge1xuXHRcdFx0c3BlY2lhbC5wb3N0RGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdGhhbmRsZXJzOiBmdW5jdGlvbiggZXZlbnQsIGhhbmRsZXJzICkge1xuXHRcdHZhciBpLCBoYW5kbGVPYmosIHNlbCwgbWF0Y2hlZEhhbmRsZXJzLCBtYXRjaGVkU2VsZWN0b3JzLFxuXHRcdFx0aGFuZGxlclF1ZXVlID0gW10sXG5cdFx0XHRkZWxlZ2F0ZUNvdW50ID0gaGFuZGxlcnMuZGVsZWdhdGVDb3VudCxcblx0XHRcdGN1ciA9IGV2ZW50LnRhcmdldDtcblxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgJiZcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD05XG5cdFx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAodHJhYy0xMzE4MClcblx0XHRcdGN1ci5ub2RlVHlwZSAmJlxuXG5cdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDw9NDJcblx0XHRcdC8vIFN1cHByZXNzIHNwZWMtdmlvbGF0aW5nIGNsaWNrcyBpbmRpY2F0aW5nIGEgbm9uLXByaW1hcnkgcG9pbnRlciBidXR0b24gKHRyYWMtMzg2MSlcblx0XHRcdC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50LXR5cGUtY2xpY2tcblx0XHRcdC8vIFN1cHBvcnQ6IElFIDExIG9ubHlcblx0XHRcdC8vIC4uLmJ1dCBub3QgYXJyb3cga2V5IFwiY2xpY2tzXCIgb2YgcmFkaW8gaW5wdXRzLCB3aGljaCBjYW4gaGF2ZSBgYnV0dG9uYCAtMSAoZ2gtMjM0Mylcblx0XHRcdCEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBldmVudC5idXR0b24gPj0gMSApICkge1xuXG5cdFx0XHRmb3IgKCA7IGN1ciAhPT0gdGhpczsgY3VyID0gY3VyLnBhcmVudE5vZGUgfHwgdGhpcyApIHtcblxuXHRcdFx0XHQvLyBEb24ndCBjaGVjayBub24tZWxlbWVudHMgKCMxMzIwOClcblx0XHRcdFx0Ly8gRG9uJ3QgcHJvY2VzcyBjbGlja3Mgb24gZGlzYWJsZWQgZWxlbWVudHMgKCM2OTExLCAjODE2NSwgIzExMzgyLCAjMTE3NjQpXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlID09PSAxICYmICEoIGV2ZW50LnR5cGUgPT09IFwiY2xpY2tcIiAmJiBjdXIuZGlzYWJsZWQgPT09IHRydWUgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVkSGFuZGxlcnMgPSBbXTtcblx0XHRcdFx0XHRtYXRjaGVkU2VsZWN0b3JzID0ge307XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZFNlbGVjdG9yc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVkU2VsZWN0b3JzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlZEhhbmRsZXJzLnB1c2goIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRIYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiBjdXIsIGhhbmRsZXJzOiBtYXRjaGVkSGFuZGxlcnMgfSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRjdXIgPSB0aGlzO1xuXHRcdGlmICggZGVsZWdhdGVDb3VudCA8IGhhbmRsZXJzLmxlbmd0aCApIHtcblx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IGhhbmRsZXJzLnNsaWNlKCBkZWxlZ2F0ZUNvdW50ICkgfSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBoYW5kbGVyUXVldWU7XG5cdH0sXG5cblx0YWRkUHJvcDogZnVuY3Rpb24oIG5hbWUsIGhvb2sgKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBqUXVlcnkuRXZlbnQucHJvdG90eXBlLCBuYW1lLCB7XG5cdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXG5cdFx0XHRnZXQ6IGlzRnVuY3Rpb24oIGhvb2sgKSA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gaG9vayggdGhpcy5vcmlnaW5hbEV2ZW50ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IDpcblx0XHRcdFx0ZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0aWYgKCB0aGlzLm9yaWdpbmFsRXZlbnQgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB0aGlzLm9yaWdpbmFsRXZlbnRbIG5hbWUgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0sXG5cblx0XHRcdHNldDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsIG5hbWUsIHtcblx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0XHR2YWx1ZTogdmFsdWVcblx0XHRcdFx0fSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRmaXg6IGZ1bmN0aW9uKCBvcmlnaW5hbEV2ZW50ICkge1xuXHRcdHJldHVybiBvcmlnaW5hbEV2ZW50WyBqUXVlcnkuZXhwYW5kbyBdID9cblx0XHRcdG9yaWdpbmFsRXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXHR9LFxuXG5cdHNwZWNpYWw6IHtcblx0XHRsb2FkOiB7XG5cblx0XHRcdC8vIFByZXZlbnQgdHJpZ2dlcmVkIGltYWdlLmxvYWQgZXZlbnRzIGZyb20gYnViYmxpbmcgdG8gd2luZG93LmxvYWRcblx0XHRcdG5vQnViYmxlOiB0cnVlXG5cdFx0fSxcblx0XHRmb2N1czoge1xuXG5cdFx0XHQvLyBGaXJlIG5hdGl2ZSBldmVudCBpZiBwb3NzaWJsZSBzbyBibHVyL2ZvY3VzIHNlcXVlbmNlIGlzIGNvcnJlY3Rcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMgIT09IHNhZmVBY3RpdmVFbGVtZW50KCkgJiYgdGhpcy5mb2N1cyApIHtcblx0XHRcdFx0XHR0aGlzLmZvY3VzKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3VzaW5cIlxuXHRcdH0sXG5cdFx0Ymx1cjoge1xuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyA9PT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmJsdXIgKSB7XG5cdFx0XHRcdFx0dGhpcy5ibHVyKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVsZWdhdGVUeXBlOiBcImZvY3Vzb3V0XCJcblx0XHR9LFxuXHRcdGNsaWNrOiB7XG5cblx0XHRcdC8vIEZvciBjaGVja2JveCwgZmlyZSBuYXRpdmUgZXZlbnQgc28gY2hlY2tlZCBzdGF0ZSB3aWxsIGJlIHJpZ2h0XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzLnR5cGUgPT09IFwiY2hlY2tib3hcIiAmJiB0aGlzLmNsaWNrICYmIG5vZGVOYW1lKCB0aGlzLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBub2RlTmFtZSggZXZlbnQudGFyZ2V0LCBcImFcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHRiZWZvcmV1bmxvYWQ6IHtcblx0XHRcdHBvc3REaXNwYXRjaDogZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggMjArXG5cdFx0XHRcdC8vIEZpcmVmb3ggZG9lc24ndCBhbGVydCBpZiB0aGUgcmV0dXJuVmFsdWUgZmllbGQgaXMgbm90IHNldC5cblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgIT09IHVuZGVmaW5lZCAmJiBldmVudC5vcmlnaW5hbEV2ZW50ICkge1xuXHRcdFx0XHRcdGV2ZW50Lm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWUgPSBldmVudC5yZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5yZW1vdmVFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBoYW5kbGUgKSB7XG5cblx0Ly8gVGhpcyBcImlmXCIgaXMgbmVlZGVkIGZvciBwbGFpbiBvYmplY3RzXG5cdGlmICggZWxlbS5yZW1vdmVFdmVudExpc3RlbmVyICkge1xuXHRcdGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciggdHlwZSwgaGFuZGxlICk7XG5cdH1cbn07XG5cbmpRdWVyeS5FdmVudCA9IGZ1bmN0aW9uKCBzcmMsIHByb3BzICkge1xuXG5cdC8vIEFsbG93IGluc3RhbnRpYXRpb24gd2l0aG91dCB0aGUgJ25ldycga2V5d29yZFxuXHRpZiAoICEoIHRoaXMgaW5zdGFuY2VvZiBqUXVlcnkuRXZlbnQgKSApIHtcblx0XHRyZXR1cm4gbmV3IGpRdWVyeS5FdmVudCggc3JjLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gRXZlbnQgb2JqZWN0XG5cdGlmICggc3JjICYmIHNyYy50eXBlICkge1xuXHRcdHRoaXMub3JpZ2luYWxFdmVudCA9IHNyYztcblx0XHR0aGlzLnR5cGUgPSBzcmMudHlwZTtcblxuXHRcdC8vIEV2ZW50cyBidWJibGluZyB1cCB0aGUgZG9jdW1lbnQgbWF5IGhhdmUgYmVlbiBtYXJrZWQgYXMgcHJldmVudGVkXG5cdFx0Ly8gYnkgYSBoYW5kbGVyIGxvd2VyIGRvd24gdGhlIHRyZWU7IHJlZmxlY3QgdGhlIGNvcnJlY3QgdmFsdWUuXG5cdFx0dGhpcy5pc0RlZmF1bHRQcmV2ZW50ZWQgPSBzcmMuZGVmYXVsdFByZXZlbnRlZCB8fFxuXHRcdFx0XHRzcmMuZGVmYXVsdFByZXZlbnRlZCA9PT0gdW5kZWZpbmVkICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTIuMyBvbmx5XG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHRcdC8vIENyZWF0ZSB0YXJnZXQgcHJvcGVydGllc1xuXHRcdC8vIFN1cHBvcnQ6IFNhZmFyaSA8PTYgLSA3IG9ubHlcblx0XHQvLyBUYXJnZXQgc2hvdWxkIG5vdCBiZSBhIHRleHQgbm9kZSAoIzUwNCwgIzEzMTQzKVxuXHRcdHRoaXMudGFyZ2V0ID0gKCBzcmMudGFyZ2V0ICYmIHNyYy50YXJnZXQubm9kZVR5cGUgPT09IDMgKSA/XG5cdFx0XHRzcmMudGFyZ2V0LnBhcmVudE5vZGUgOlxuXHRcdFx0c3JjLnRhcmdldDtcblxuXHRcdHRoaXMuY3VycmVudFRhcmdldCA9IHNyYy5jdXJyZW50VGFyZ2V0O1xuXHRcdHRoaXMucmVsYXRlZFRhcmdldCA9IHNyYy5yZWxhdGVkVGFyZ2V0O1xuXG5cdC8vIEV2ZW50IHR5cGVcblx0fSBlbHNlIHtcblx0XHR0aGlzLnR5cGUgPSBzcmM7XG5cdH1cblxuXHQvLyBQdXQgZXhwbGljaXRseSBwcm92aWRlZCBwcm9wZXJ0aWVzIG9udG8gdGhlIGV2ZW50IG9iamVjdFxuXHRpZiAoIHByb3BzICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRoaXMsIHByb3BzICk7XG5cdH1cblxuXHQvLyBDcmVhdGUgYSB0aW1lc3RhbXAgaWYgaW5jb21pbmcgZXZlbnQgZG9lc24ndCBoYXZlIG9uZVxuXHR0aGlzLnRpbWVTdGFtcCA9IHNyYyAmJiBzcmMudGltZVN0YW1wIHx8IERhdGUubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMDMvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDMwMzMxL2VjbWEtc2NyaXB0LWJpbmRpbmcuaHRtbFxualF1ZXJ5LkV2ZW50LnByb3RvdHlwZSA9IHtcblx0Y29uc3RydWN0b3I6IGpRdWVyeS5FdmVudCxcblx0aXNEZWZhdWx0UHJldmVudGVkOiByZXR1cm5GYWxzZSxcblx0aXNQcm9wYWdhdGlvblN0b3BwZWQ6IHJldHVybkZhbHNlLFxuXHRpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzU2ltdWxhdGVkOiBmYWxzZSxcblxuXHRwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzRGVmYXVsdFByZXZlbnRlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc1Byb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BQcm9wYWdhdGlvbigpO1xuXHRcdH1cblx0fSxcblx0c3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQgPSByZXR1cm5UcnVlO1xuXG5cdFx0aWYgKCBlICYmICF0aGlzLmlzU2ltdWxhdGVkICkge1xuXHRcdFx0ZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcblx0XHR9XG5cblx0XHR0aGlzLnN0b3BQcm9wYWdhdGlvbigpO1xuXHR9XG59O1xuXG4vLyBJbmNsdWRlcyBhbGwgY29tbW9uIGV2ZW50IHByb3BzIGluY2x1ZGluZyBLZXlFdmVudCBhbmQgTW91c2VFdmVudCBzcGVjaWZpYyBwcm9wc1xualF1ZXJ5LmVhY2goIHtcblx0YWx0S2V5OiB0cnVlLFxuXHRidWJibGVzOiB0cnVlLFxuXHRjYW5jZWxhYmxlOiB0cnVlLFxuXHRjaGFuZ2VkVG91Y2hlczogdHJ1ZSxcblx0Y3RybEtleTogdHJ1ZSxcblx0ZGV0YWlsOiB0cnVlLFxuXHRldmVudFBoYXNlOiB0cnVlLFxuXHRtZXRhS2V5OiB0cnVlLFxuXHRwYWdlWDogdHJ1ZSxcblx0cGFnZVk6IHRydWUsXG5cdHNoaWZ0S2V5OiB0cnVlLFxuXHR2aWV3OiB0cnVlLFxuXHRcImNoYXJcIjogdHJ1ZSxcblx0Y2hhckNvZGU6IHRydWUsXG5cdGtleTogdHJ1ZSxcblx0a2V5Q29kZTogdHJ1ZSxcblx0YnV0dG9uOiB0cnVlLFxuXHRidXR0b25zOiB0cnVlLFxuXHRjbGllbnRYOiB0cnVlLFxuXHRjbGllbnRZOiB0cnVlLFxuXHRvZmZzZXRYOiB0cnVlLFxuXHRvZmZzZXRZOiB0cnVlLFxuXHRwb2ludGVySWQ6IHRydWUsXG5cdHBvaW50ZXJUeXBlOiB0cnVlLFxuXHRzY3JlZW5YOiB0cnVlLFxuXHRzY3JlZW5ZOiB0cnVlLFxuXHR0YXJnZXRUb3VjaGVzOiB0cnVlLFxuXHR0b0VsZW1lbnQ6IHRydWUsXG5cdHRvdWNoZXM6IHRydWUsXG5cblx0d2hpY2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHR2YXIgYnV0dG9uID0gZXZlbnQuYnV0dG9uO1xuXG5cdFx0Ly8gQWRkIHdoaWNoIGZvciBrZXkgZXZlbnRzXG5cdFx0aWYgKCBldmVudC53aGljaCA9PSBudWxsICYmIHJrZXlFdmVudC50ZXN0KCBldmVudC50eXBlICkgKSB7XG5cdFx0XHRyZXR1cm4gZXZlbnQuY2hhckNvZGUgIT0gbnVsbCA/IGV2ZW50LmNoYXJDb2RlIDogZXZlbnQua2V5Q29kZTtcblx0XHR9XG5cblx0XHQvLyBBZGQgd2hpY2ggZm9yIGNsaWNrOiAxID09PSBsZWZ0OyAyID09PSBtaWRkbGU7IDMgPT09IHJpZ2h0XG5cdFx0aWYgKCAhZXZlbnQud2hpY2ggJiYgYnV0dG9uICE9PSB1bmRlZmluZWQgJiYgcm1vdXNlRXZlbnQudGVzdCggZXZlbnQudHlwZSApICkge1xuXHRcdFx0aWYgKCBidXR0b24gJiAxICkge1xuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBidXR0b24gJiAyICkge1xuXHRcdFx0XHRyZXR1cm4gMztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBidXR0b24gJiA0ICkge1xuXHRcdFx0XHRyZXR1cm4gMjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIDA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LndoaWNoO1xuXHR9XG59LCBqUXVlcnkuZXZlbnQuYWRkUHJvcCApO1xuXG4vLyBDcmVhdGUgbW91c2VlbnRlci9sZWF2ZSBldmVudHMgdXNpbmcgbW91c2VvdmVyL291dCBhbmQgZXZlbnQtdGltZSBjaGVja3Ncbi8vIHNvIHRoYXQgZXZlbnQgZGVsZWdhdGlvbiB3b3JrcyBpbiBqUXVlcnkuXG4vLyBEbyB0aGUgc2FtZSBmb3IgcG9pbnRlcmVudGVyL3BvaW50ZXJsZWF2ZSBhbmQgcG9pbnRlcm92ZXIvcG9pbnRlcm91dFxuLy9cbi8vIFN1cHBvcnQ6IFNhZmFyaSA3IG9ubHlcbi8vIFNhZmFyaSBzZW5kcyBtb3VzZWVudGVyIHRvbyBvZnRlbjsgc2VlOlxuLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblxuXHRvbjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICk7XG5cdH0sXG5cdG9uZTogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIG9uKCB0aGlzLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCAxICk7XG5cdH0sXG5cdG9mZjogZnVuY3Rpb24oIHR5cGVzLCBzZWxlY3RvciwgZm4gKSB7XG5cdFx0dmFyIGhhbmRsZU9iaiwgdHlwZTtcblx0XHRpZiAoIHR5cGVzICYmIHR5cGVzLnByZXZlbnREZWZhdWx0ICYmIHR5cGVzLmhhbmRsZU9iaiApIHtcblxuXHRcdFx0Ly8gKCBldmVudCApICBkaXNwYXRjaGVkIGpRdWVyeS5FdmVudFxuXHRcdFx0aGFuZGxlT2JqID0gdHlwZXMuaGFuZGxlT2JqO1xuXHRcdFx0alF1ZXJ5KCB0eXBlcy5kZWxlZ2F0ZVRhcmdldCApLm9mZihcblx0XHRcdFx0aGFuZGxlT2JqLm5hbWVzcGFjZSA/XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlICsgXCIuXCIgKyBoYW5kbGVPYmoubmFtZXNwYWNlIDpcblx0XHRcdFx0XHRoYW5kbGVPYmoub3JpZ1R5cGUsXG5cdFx0XHRcdGhhbmRsZU9iai5zZWxlY3Rvcixcblx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXJcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCB0eXBlb2YgdHlwZXMgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMtb2JqZWN0IFssIHNlbGVjdG9yXSApXG5cdFx0XHRmb3IgKCB0eXBlIGluIHR5cGVzICkge1xuXHRcdFx0XHR0aGlzLm9mZiggdHlwZSwgc2VsZWN0b3IsIHR5cGVzWyB0eXBlIF0gKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiB0aGlzO1xuXHRcdH1cblx0XHRpZiAoIHNlbGVjdG9yID09PSBmYWxzZSB8fCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwiZnVuY3Rpb25cIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcyBbLCBmbl0gKVxuXHRcdFx0Zm4gPSBzZWxlY3Rvcjtcblx0XHRcdHNlbGVjdG9yID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGZuID09PSBmYWxzZSApIHtcblx0XHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggdGhpcywgdHlwZXMsIGZuLCBzZWxlY3RvciApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbnZhclxuXG5cdC8qIGVzbGludC1kaXNhYmxlIG1heC1sZW4gKi9cblxuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvaXNzdWVzLzMyMjlcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW2Etel1bXlxcL1xcMD5cXHgyMFxcdFxcclxcblxcZl0qKVtePl0qKVxcLz4vZ2ksXG5cblx0LyogZXNsaW50LWVuYWJsZSAqL1xuXG5cdC8vIFN1cHBvcnQ6IElFIDw9MTAgLSAxMSwgRWRnZSAxMiAtIDEzIG9ubHlcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO1xuXG4vLyBQcmVmZXIgYSB0Ym9keSBvdmVyIGl0cyBwYXJlbnQgdGFibGUgZm9yIGNvbnRhaW5pbmcgbmV3IHJvd3NcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0aWYgKCBub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRub2RlTmFtZSggY29udGVudC5ub2RlVHlwZSAhPT0gMTEgPyBjb250ZW50IDogY29udGVudC5maXJzdENoaWxkLCBcInRyXCIgKSApIHtcblxuXHRcdHJldHVybiBqUXVlcnkoIGVsZW0gKS5jaGlsZHJlbiggXCJ0Ym9keVwiIClbIDAgXSB8fCBlbGVtO1xuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdGlmICggKCBlbGVtLnR5cGUgfHwgXCJcIiApLnNsaWNlKCAwLCA1ICkgPT09IFwidHJ1ZS9cIiApIHtcblx0XHRlbGVtLnR5cGUgPSBlbGVtLnR5cGUuc2xpY2UoIDUgKTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50cztcblxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy5cblx0aWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7XG5cdFx0ZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzO1xuXG5cdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRkZWxldGUgcGRhdGFDdXIuaGFuZGxlO1xuXHRcdFx0cGRhdGFDdXIuZXZlbnRzID0ge307XG5cblx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyAyLiBDb3B5IHVzZXIgZGF0YVxuXHRpZiAoIGRhdGFVc2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApO1xuXHR9XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0dmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdHZhbHVlSXNGdW5jdGlvbiA9IGlzRnVuY3Rpb24oIHZhbHVlICk7XG5cblx0Ly8gV2UgY2FuJ3QgY2xvbmVOb2RlIGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gY2hlY2tlZCwgaW4gV2ViS2l0XG5cdGlmICggdmFsdWVJc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIHZhbHVlSXNGdW5jdGlvbiApIHtcblx0XHRcdFx0YXJnc1sgMCBdID0gdmFsdWUuY2FsbCggdGhpcywgaW5kZXgsIHNlbGYuaHRtbCgpICk7XG5cdFx0XHR9XG5cdFx0XHRkb21NYW5pcCggc2VsZiwgYXJncywgY2FsbGJhY2ssIGlnbm9yZWQgKTtcblx0XHR9ICk7XG5cdH1cblxuXHRpZiAoIGwgKSB7XG5cdFx0ZnJhZ21lbnQgPSBidWlsZEZyYWdtZW50KCBhcmdzLCBjb2xsZWN0aW9uWyAwIF0ub3duZXJEb2N1bWVudCwgZmFsc2UsIGNvbGxlY3Rpb24sIGlnbm9yZWQgKTtcblx0XHRmaXJzdCA9IGZyYWdtZW50LmZpcnN0Q2hpbGQ7XG5cblx0XHRpZiAoIGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID09PSAxICkge1xuXHRcdFx0ZnJhZ21lbnQgPSBmaXJzdDtcblx0XHR9XG5cblx0XHQvLyBSZXF1aXJlIGVpdGhlciBuZXcgY29udGVudCBvciBhbiBpbnRlcmVzdCBpbiBpZ25vcmVkIGVsZW1lbnRzIHRvIGludm9rZSB0aGUgY2FsbGJhY2tcblx0XHRpZiAoIGZpcnN0IHx8IGlnbm9yZWQgKSB7XG5cdFx0XHRzY3JpcHRzID0galF1ZXJ5Lm1hcCggZ2V0QWxsKCBmcmFnbWVudCwgXCJzY3JpcHRcIiApLCBkaXNhYmxlU2NyaXB0ICk7XG5cdFx0XHRoYXNTY3JpcHRzID0gc2NyaXB0cy5sZW5ndGg7XG5cblx0XHRcdC8vIFVzZSB0aGUgb3JpZ2luYWwgZnJhZ21lbnQgZm9yIHRoZSBsYXN0IGl0ZW1cblx0XHRcdC8vIGluc3RlYWQgb2YgdGhlIGZpcnN0IGJlY2F1c2UgaXQgY2FuIGVuZCB1cFxuXHRcdFx0Ly8gYmVpbmcgZW1wdGllZCBpbmNvcnJlY3RseSBpbiBjZXJ0YWluIHNpdHVhdGlvbnMgKCM4MDcwKS5cblx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0bm9kZSA9IGZyYWdtZW50O1xuXG5cdFx0XHRcdGlmICggaSAhPT0gaU5vQ2xvbmUgKSB7XG5cdFx0XHRcdFx0bm9kZSA9IGpRdWVyeS5jbG9uZSggbm9kZSwgdHJ1ZSwgdHJ1ZSApO1xuXG5cdFx0XHRcdFx0Ly8gS2VlcCByZWZlcmVuY2VzIHRvIGNsb25lZCBzY3JpcHRzIGZvciBsYXRlciByZXN0b3JhdGlvblxuXHRcdFx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMCBvbmx5LCBQaGFudG9tSlMgMSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdFx0XHRqUXVlcnkubWVyZ2UoIHNjcmlwdHMsIGdldEFsbCggbm9kZSwgXCJzY3JpcHRcIiApICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y2FsbGJhY2suY2FsbCggY29sbGVjdGlvblsgaSBdLCBub2RlLCBpICk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaGFzU2NyaXB0cyApIHtcblx0XHRcdFx0ZG9jID0gc2NyaXB0c1sgc2NyaXB0cy5sZW5ndGggLSAxIF0ub3duZXJEb2N1bWVudDtcblxuXHRcdFx0XHQvLyBSZWVuYWJsZSBzY3JpcHRzXG5cdFx0XHRcdGpRdWVyeS5tYXAoIHNjcmlwdHMsIHJlc3RvcmVTY3JpcHQgKTtcblxuXHRcdFx0XHQvLyBFdmFsdWF0ZSBleGVjdXRhYmxlIHNjcmlwdHMgb24gZmlyc3QgZG9jdW1lbnQgaW5zZXJ0aW9uXG5cdFx0XHRcdGZvciAoIGkgPSAwOyBpIDwgaGFzU2NyaXB0czsgaSsrICkge1xuXHRcdFx0XHRcdG5vZGUgPSBzY3JpcHRzWyBpIF07XG5cdFx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBub2RlLnR5cGUgfHwgXCJcIiApICYmXG5cdFx0XHRcdFx0XHQhZGF0YVByaXYuYWNjZXNzKCBub2RlLCBcImdsb2JhbEV2YWxcIiApICYmXG5cdFx0XHRcdFx0XHRqUXVlcnkuY29udGFpbnMoIGRvYywgbm9kZSApICkge1xuXG5cdFx0XHRcdFx0XHRpZiAoIG5vZGUuc3JjICYmICggbm9kZS50eXBlIHx8IFwiXCIgKS50b0xvd2VyQ2FzZSgpICAhPT0gXCJtb2R1bGVcIiApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5fZXZhbFVybCApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdERPTUV2YWwoIG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSggcmNsZWFuU2NyaXB0LCBcIlwiICksIGRvYywgbm9kZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBjb2xsZWN0aW9uO1xufVxuXG5mdW5jdGlvbiByZW1vdmUoIGVsZW0sIHNlbGVjdG9yLCBrZWVwRGF0YSApIHtcblx0dmFyIG5vZGUsXG5cdFx0bm9kZXMgPSBzZWxlY3RvciA/IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBlbGVtICkgOiBlbGVtLFxuXHRcdGkgPSAwO1xuXG5cdGZvciAoIDsgKCBub2RlID0gbm9kZXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRpZiAoICFrZWVwRGF0YSAmJiBub2RlLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBub2RlICkgKTtcblx0XHR9XG5cblx0XHRpZiAoIG5vZGUucGFyZW50Tm9kZSApIHtcblx0XHRcdGlmICgga2VlcERhdGEgJiYgalF1ZXJ5LmNvbnRhaW5zKCBub2RlLm93bmVyRG9jdW1lbnQsIG5vZGUgKSApIHtcblx0XHRcdFx0c2V0R2xvYmFsRXZhbCggZ2V0QWxsKCBub2RlLCBcInNjcmlwdFwiICkgKTtcblx0XHRcdH1cblx0XHRcdG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggbm9kZSApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGh0bWxQcmVmaWx0ZXI6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHJldHVybiBodG1sLnJlcGxhY2UoIHJ4aHRtbFRhZywgXCI8JDE+PC8kMj5cIiApO1xuXHR9LFxuXG5cdGNsb25lOiBmdW5jdGlvbiggZWxlbSwgZGF0YUFuZEV2ZW50cywgZGVlcERhdGFBbmRFdmVudHMgKSB7XG5cdFx0dmFyIGksIGwsIHNyY0VsZW1lbnRzLCBkZXN0RWxlbWVudHMsXG5cdFx0XHRjbG9uZSA9IGVsZW0uY2xvbmVOb2RlKCB0cnVlICksXG5cdFx0XHRpblBhZ2UgPSBqUXVlcnkuY29udGFpbnMoIGVsZW0ub3duZXJEb2N1bWVudCwgZWxlbSApO1xuXG5cdFx0Ly8gRml4IElFIGNsb25pbmcgaXNzdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCAmJiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgfHwgZWxlbS5ub2RlVHlwZSA9PT0gMTEgKSAmJlxuXHRcdFx0XHQhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIFdlIGVzY2hldyBTaXp6bGUgaGVyZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29uczogaHR0cHM6Ly9qc3BlcmYuY29tL2dldGFsbC12cy1zaXp6bGUvMlxuXHRcdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSApO1xuXHRcdFx0c3JjRWxlbWVudHMgPSBnZXRBbGwoIGVsZW0gKTtcblxuXHRcdFx0Zm9yICggaSA9IDAsIGwgPSBzcmNFbGVtZW50cy5sZW5ndGg7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGZpeElucHV0KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvcHkgdGhlIGV2ZW50cyBmcm9tIHRoZSBvcmlnaW5hbCB0byB0aGUgY2xvbmVcblx0XHRpZiAoIGRhdGFBbmRFdmVudHMgKSB7XG5cdFx0XHRpZiAoIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0XHRzcmNFbGVtZW50cyA9IHNyY0VsZW1lbnRzIHx8IGdldEFsbCggZWxlbSApO1xuXHRcdFx0XHRkZXN0RWxlbWVudHMgPSBkZXN0RWxlbWVudHMgfHwgZ2V0QWxsKCBjbG9uZSApO1xuXG5cdFx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdGNsb25lQ29weUV2ZW50KCBzcmNFbGVtZW50c1sgaSBdLCBkZXN0RWxlbWVudHNbIGkgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZUNvcHlFdmVudCggZWxlbSwgY2xvbmUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBQcmVzZXJ2ZSBzY3JpcHQgZXZhbHVhdGlvbiBoaXN0b3J5XG5cdFx0ZGVzdEVsZW1lbnRzID0gZ2V0QWxsKCBjbG9uZSwgXCJzY3JpcHRcIiApO1xuXHRcdGlmICggZGVzdEVsZW1lbnRzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCBkZXN0RWxlbWVudHMsICFpblBhZ2UgJiYgZ2V0QWxsKCBlbGVtLCBcInNjcmlwdFwiICkgKTtcblx0XHR9XG5cblx0XHQvLyBSZXR1cm4gdGhlIGNsb25lZCBzZXRcblx0XHRyZXR1cm4gY2xvbmU7XG5cdH0sXG5cblx0Y2xlYW5EYXRhOiBmdW5jdGlvbiggZWxlbXMgKSB7XG5cdFx0dmFyIGRhdGEsIGVsZW0sIHR5cGUsXG5cdFx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWwsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgKCBlbGVtID0gZWxlbXNbIGkgXSApICE9PSB1bmRlZmluZWQ7IGkrKyApIHtcblx0XHRcdGlmICggYWNjZXB0RGF0YSggZWxlbSApICkge1xuXHRcdFx0XHRpZiAoICggZGF0YSA9IGVsZW1bIGRhdGFQcml2LmV4cGFuZG8gXSApICkge1xuXHRcdFx0XHRcdGlmICggZGF0YS5ldmVudHMgKSB7XG5cdFx0XHRcdFx0XHRmb3IgKCB0eXBlIGluIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0XHRpZiAoIHNwZWNpYWxbIHR5cGUgXSApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZXZlbnQucmVtb3ZlKCBlbGVtLCB0eXBlICk7XG5cblx0XHRcdFx0XHRcdFx0Ly8gVGhpcyBpcyBhIHNob3J0Y3V0IHRvIGF2b2lkIGpRdWVyeS5ldmVudC5yZW1vdmUncyBvdmVyaGVhZFxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZGF0YS5oYW5kbGUgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PTM1IC0gNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9MzUgLSA0NStcblx0XHRcdFx0XHQvLyBBc3NpZ24gdW5kZWZpbmVkIGluc3RlYWQgb2YgdXNpbmcgZGVsZXRlLCBzZWUgRGF0YSNyZW1vdmVcblx0XHRcdFx0XHRlbGVtWyBkYXRhVXNlci5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRkZXRhY2g6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gcmVtb3ZlKCB0aGlzLCBzZWxlY3RvciwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZTogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yICk7XG5cdH0sXG5cblx0dGV4dDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnRleHQoIHRoaXMgKSA6XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdGFwcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0LmFwcGVuZENoaWxkKCBlbGVtICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHByZXBlbmQ6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHR2YXIgdGFyZ2V0ID0gbWFuaXB1bGF0aW9uVGFyZ2V0KCB0aGlzLCBlbGVtICk7XG5cdFx0XHRcdHRhcmdldC5pbnNlcnRCZWZvcmUoIGVsZW0sIHRhcmdldC5maXJzdENoaWxkICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGJlZm9yZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YWZ0ZXI6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdGlmICggdGhpcy5wYXJlbnROb2RlICkge1xuXHRcdFx0XHR0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKCBlbGVtLCB0aGlzLm5leHRTaWJsaW5nICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGVtcHR5OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyAoIGVsZW0gPSB0aGlzWyBpIF0gKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHRcdFx0Ly8gUHJldmVudCBtZW1vcnkgbGVha3Ncblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCBlbGVtLCBmYWxzZSApICk7XG5cblx0XHRcdFx0Ly8gUmVtb3ZlIGFueSByZW1haW5pbmcgbm9kZXNcblx0XHRcdFx0ZWxlbS50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRkYXRhQW5kRXZlbnRzID0gZGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZmFsc2UgOiBkYXRhQW5kRXZlbnRzO1xuXHRcdGRlZXBEYXRhQW5kRXZlbnRzID0gZGVlcERhdGFBbmRFdmVudHMgPT0gbnVsbCA/IGRhdGFBbmRFdmVudHMgOiBkZWVwRGF0YUFuZEV2ZW50cztcblxuXHRcdHJldHVybiB0aGlzLm1hcCggZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmNsb25lKCB0aGlzLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApO1xuXHRcdH0gKTtcblx0fSxcblxuXHRodG1sOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGVsZW0gPSB0aGlzWyAwIF0gfHwge30sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHRsID0gdGhpcy5sZW5ndGg7XG5cblx0XHRcdGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbS5pbm5lckhUTUw7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNlZSBpZiB3ZSBjYW4gdGFrZSBhIHNob3J0Y3V0IGFuZCBqdXN0IHVzZSBpbm5lckhUTUxcblx0XHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmICFybm9Jbm5lcmh0bWwudGVzdCggdmFsdWUgKSAmJlxuXHRcdFx0XHQhd3JhcE1hcFsgKCBydGFnTmFtZS5leGVjKCB2YWx1ZSApIHx8IFsgXCJcIiwgXCJcIiBdIClbIDEgXS50b0xvd2VyQ2FzZSgpIF0gKSB7XG5cblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuaHRtbFByZWZpbHRlciggdmFsdWUgKTtcblxuXHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRcdGVsZW0gPSB0aGlzWyBpIF0gfHwge307XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSBlbGVtZW50IG5vZGVzIGFuZCBwcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0XHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblx0XHRcdFx0XHRcdFx0ZWxlbS5pbm5lckhUTUwgPSB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRlbGVtID0gMDtcblxuXHRcdFx0XHQvLyBJZiB1c2luZyBpbm5lckhUTUwgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdXNlIHRoZSBmYWxsYmFjayBtZXRob2Rcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdHRoaXMuZW1wdHkoKS5hcHBlbmQoIHZhbHVlICk7XG5cdFx0XHR9XG5cdFx0fSwgbnVsbCwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fSxcblxuXHRyZXBsYWNlV2l0aDogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGlnbm9yZWQgPSBbXTtcblxuXHRcdC8vIE1ha2UgdGhlIGNoYW5nZXMsIHJlcGxhY2luZyBlYWNoIG5vbi1pZ25vcmVkIGNvbnRleHQgZWxlbWVudCB3aXRoIHRoZSBuZXcgY29udGVudFxuXHRcdHJldHVybiBkb21NYW5pcCggdGhpcywgYXJndW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7XG5cblx0XHRcdGlmICggalF1ZXJ5LmluQXJyYXkoIHRoaXMsIGlnbm9yZWQgKSA8IDAgKSB7XG5cdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggdGhpcyApICk7XG5cdFx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRcdHBhcmVudC5yZXBsYWNlQ2hpbGQoIGVsZW0sIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gRm9yY2UgY2FsbGJhY2sgaW52b2NhdGlvblxuXHRcdH0sIGlnbm9yZWQgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCgge1xuXHRhcHBlbmRUbzogXCJhcHBlbmRcIixcblx0cHJlcGVuZFRvOiBcInByZXBlbmRcIixcblx0aW5zZXJ0QmVmb3JlOiBcImJlZm9yZVwiLFxuXHRpbnNlcnRBZnRlcjogXCJhZnRlclwiLFxuXHRyZXBsYWNlQWxsOiBcInJlcGxhY2VXaXRoXCJcbn0sIGZ1bmN0aW9uKCBuYW1lLCBvcmlnaW5hbCApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGVsZW1zLFxuXHRcdFx0cmV0ID0gW10sXG5cdFx0XHRpbnNlcnQgPSBqUXVlcnkoIHNlbGVjdG9yICksXG5cdFx0XHRsYXN0ID0gaW5zZXJ0Lmxlbmd0aCAtIDEsXG5cdFx0XHRpID0gMDtcblxuXHRcdGZvciAoIDsgaSA8PSBsYXN0OyBpKysgKSB7XG5cdFx0XHRlbGVtcyA9IGkgPT09IGxhc3QgPyB0aGlzIDogdGhpcy5jbG9uZSggdHJ1ZSApO1xuXHRcdFx0alF1ZXJ5KCBpbnNlcnRbIGkgXSApWyBvcmlnaW5hbCBdKCBlbGVtcyApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDw9NC4wIG9ubHksIFBoYW50b21KUyAxIG9ubHlcblx0XHRcdC8vIC5nZXQoKSBiZWNhdXNlIHB1c2guYXBwbHkoXywgYXJyYXlsaWtlKSB0aHJvd3Mgb24gYW5jaWVudCBXZWJLaXRcblx0XHRcdHB1c2guYXBwbHkoIHJldCwgZWxlbXMuZ2V0KCkgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIHJldCApO1xuXHR9O1xufSApO1xudmFyIHJudW1ub25weCA9IG5ldyBSZWdFeHAoIFwiXihcIiArIHBudW0gKyBcIikoPyFweClbYS16JV0rJFwiLCBcImlcIiApO1xuXG52YXIgZ2V0U3R5bGVzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTExIG9ubHksIEZpcmVmb3ggPD0zMCAoIzE1MDk4LCAjMTQxNTApXG5cdFx0Ly8gSUUgdGhyb3dzIG9uIGVsZW1lbnRzIGNyZWF0ZWQgaW4gcG9wdXBzXG5cdFx0Ly8gRkYgbWVhbndoaWxlIHRocm93cyBvbiBmcmFtZSBlbGVtZW50cyB0aHJvdWdoIFwiZGVmYXVsdFZpZXcuZ2V0Q29tcHV0ZWRTdHlsZVwiXG5cdFx0dmFyIHZpZXcgPSBlbGVtLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXc7XG5cblx0XHRpZiAoICF2aWV3IHx8ICF2aWV3Lm9wZW5lciApIHtcblx0XHRcdHZpZXcgPSB3aW5kb3c7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZpZXcuZ2V0Q29tcHV0ZWRTdHlsZSggZWxlbSApO1xuXHR9O1xuXG52YXIgcmJveFN0eWxlID0gbmV3IFJlZ0V4cCggY3NzRXhwYW5kLmpvaW4oIFwifFwiICksIFwiaVwiICk7XG5cblxuXG4oIGZ1bmN0aW9uKCkge1xuXG5cdC8vIEV4ZWN1dGluZyBib3RoIHBpeGVsUG9zaXRpb24gJiBib3hTaXppbmdSZWxpYWJsZSB0ZXN0cyByZXF1aXJlIG9ubHkgb25lIGxheW91dFxuXHQvLyBzbyB0aGV5J3JlIGV4ZWN1dGVkIGF0IHRoZSBzYW1lIHRpbWUgdG8gc2F2ZSB0aGUgc2Vjb25kIGNvbXB1dGF0aW9uLlxuXHRmdW5jdGlvbiBjb21wdXRlU3R5bGVUZXN0cygpIHtcblxuXHRcdC8vIFRoaXMgaXMgYSBzaW5nbGV0b24sIHdlIG5lZWQgdG8gZXhlY3V0ZSBpdCBvbmx5IG9uY2Vcblx0XHRpZiAoICFkaXYgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcInBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDtcIiArXG5cdFx0XHRcIm1hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MFwiO1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblx0XHRcdFwicG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcIndpZHRoOjYwJTt0b3A6MSVcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApLmFwcGVuZENoaWxkKCBkaXYgKTtcblxuXHRcdHZhciBkaXZTdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKCBkaXYgKTtcblx0XHRwaXhlbFBvc2l0aW9uVmFsID0gZGl2U3R5bGUudG9wICE9PSBcIjElXCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5LCBGaXJlZm94IDw9MyAtIDQ0XG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0VmFsID0gcm91bmRQaXhlbE1lYXN1cmVzKCBkaXZTdHlsZS5tYXJnaW5MZWZ0ICkgPT09IDEyO1xuXG5cdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCA0LjAgLSA0LjMgb25seSwgU2FmYXJpIDw9OS4xIC0gMTAuMSwgaU9TIDw9Ny4wIC0gOS4zXG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLnJpZ2h0ID0gXCI2MCVcIjtcblx0XHRwaXhlbEJveFN0eWxlc1ZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUucmlnaHQgKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHRcdC8vIERldGVjdCBtaXNyZXBvcnRpbmcgb2YgY29udGVudCBkaW1lbnNpb25zIGZvciBib3gtc2l6aW5nOmJvcmRlci1ib3ggZWxlbWVudHNcblx0XHRib3hTaXppbmdSZWxpYWJsZVZhbCA9IHJvdW5kUGl4ZWxNZWFzdXJlcyggZGl2U3R5bGUud2lkdGggKSA9PT0gMzY7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA5IG9ubHlcblx0XHQvLyBEZXRlY3Qgb3ZlcmZsb3c6c2Nyb2xsIHNjcmV3aW5lc3MgKGdoLTM2OTkpXG5cdFx0ZGl2LnN0eWxlLnBvc2l0aW9uID0gXCJhYnNvbHV0ZVwiO1xuXHRcdHNjcm9sbGJveFNpemVWYWwgPSBkaXYub2Zmc2V0V2lkdGggPT09IDM2IHx8IFwiYWJzb2x1dGVcIjtcblxuXHRcdGRvY3VtZW50RWxlbWVudC5yZW1vdmVDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHQvLyBOdWxsaWZ5IHRoZSBkaXYgc28gaXQgd291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSBtZW1vcnkgYW5kXG5cdFx0Ly8gaXQgd2lsbCBhbHNvIGJlIGEgc2lnbiB0aGF0IGNoZWNrcyBhbHJlYWR5IHBlcmZvcm1lZFxuXHRcdGRpdiA9IG51bGw7XG5cdH1cblxuXHRmdW5jdGlvbiByb3VuZFBpeGVsTWVhc3VyZXMoIG1lYXN1cmUgKSB7XG5cdFx0cmV0dXJuIE1hdGgucm91bmQoIHBhcnNlRmxvYXQoIG1lYXN1cmUgKSApO1xuXHR9XG5cblx0dmFyIHBpeGVsUG9zaXRpb25WYWwsIGJveFNpemluZ1JlbGlhYmxlVmFsLCBzY3JvbGxib3hTaXplVmFsLCBwaXhlbEJveFN0eWxlc1ZhbCxcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwsXG5cdFx0Y29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApLFxuXHRcdGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKTtcblxuXHQvLyBGaW5pc2ggZWFybHkgaW4gbGltaXRlZCAobm9uLWJyb3dzZXIpIGVudmlyb25tZW50c1xuXHRpZiAoICFkaXYuc3R5bGUgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHQvLyBTdHlsZSBvZiBjbG9uZWQgZWxlbWVudCBhZmZlY3RzIHNvdXJjZSBlbGVtZW50IGNsb25lZCAoIzg5MDgpXG5cdGRpdi5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiY29udGVudC1ib3hcIjtcblx0ZGl2LmNsb25lTm9kZSggdHJ1ZSApLnN0eWxlLmJhY2tncm91bmRDbGlwID0gXCJcIjtcblx0c3VwcG9ydC5jbGVhckNsb25lU3R5bGUgPSBkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPT09IFwiY29udGVudC1ib3hcIjtcblxuXHRqUXVlcnkuZXh0ZW5kKCBzdXBwb3J0LCB7XG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBib3hTaXppbmdSZWxpYWJsZVZhbDtcblx0XHR9LFxuXHRcdHBpeGVsQm94U3R5bGVzOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxCb3hTdHlsZXNWYWw7XG5cdFx0fSxcblx0XHRwaXhlbFBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRcdGNvbXB1dGVTdHlsZVRlc3RzKCk7XG5cdFx0XHRyZXR1cm4gcGl4ZWxQb3NpdGlvblZhbDtcblx0XHR9LFxuXHRcdHJlbGlhYmxlTWFyZ2luTGVmdDogZnVuY3Rpb24oKSB7XG5cdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0cmV0dXJuIHJlbGlhYmxlTWFyZ2luTGVmdFZhbDtcblx0XHR9LFxuXHRcdHNjcm9sbGJveFNpemU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBzY3JvbGxib3hTaXplVmFsO1xuXHRcdH1cblx0fSApO1xufSApKCk7XG5cblxuZnVuY3Rpb24gY3VyQ1NTKCBlbGVtLCBuYW1lLCBjb21wdXRlZCApIHtcblx0dmFyIHdpZHRoLCBtaW5XaWR0aCwgbWF4V2lkdGgsIHJldCxcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3ggNTErXG5cdFx0Ly8gUmV0cmlldmluZyBzdHlsZSBiZWZvcmUgY29tcHV0ZWQgc29tZWhvd1xuXHRcdC8vIGZpeGVzIGFuIGlzc3VlIHdpdGggZ2V0dGluZyB3cm9uZyB2YWx1ZXNcblx0XHQvLyBvbiBkZXRhY2hlZCBlbGVtZW50c1xuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXG5cdC8vIGdldFByb3BlcnR5VmFsdWUgaXMgbmVlZGVkIGZvcjpcblx0Ly8gICAuY3NzKCdmaWx0ZXInKSAoSUUgOSBvbmx5LCAjMTI1MzcpXG5cdC8vICAgLmNzcygnLS1jdXN0b21Qcm9wZXJ0eSkgKCMzMTQ0KVxuXHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdHJldCA9IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdO1xuXG5cdFx0aWYgKCByZXQgPT09IFwiXCIgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0XHRyZXQgPSBqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUgKTtcblx0XHR9XG5cblx0XHQvLyBBIHRyaWJ1dGUgdG8gdGhlIFwiYXdlc29tZSBoYWNrIGJ5IERlYW4gRWR3YXJkc1wiXG5cdFx0Ly8gQW5kcm9pZCBCcm93c2VyIHJldHVybnMgcGVyY2VudGFnZSBmb3Igc29tZSB2YWx1ZXMsXG5cdFx0Ly8gYnV0IHdpZHRoIHNlZW1zIHRvIGJlIHJlbGlhYmx5IHBpeGVscy5cblx0XHQvLyBUaGlzIGlzIGFnYWluc3QgdGhlIENTU09NIGRyYWZ0IHNwZWM6XG5cdFx0Ly8gaHR0cHM6Ly9kcmFmdHMuY3Nzd2cub3JnL2Nzc29tLyNyZXNvbHZlZC12YWx1ZXNcblx0XHRpZiAoICFzdXBwb3J0LnBpeGVsQm94U3R5bGVzKCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJib3hTdHlsZS50ZXN0KCBuYW1lICkgKSB7XG5cblx0XHRcdC8vIFJlbWVtYmVyIHRoZSBvcmlnaW5hbCB2YWx1ZXNcblx0XHRcdHdpZHRoID0gc3R5bGUud2lkdGg7XG5cdFx0XHRtaW5XaWR0aCA9IHN0eWxlLm1pbldpZHRoO1xuXHRcdFx0bWF4V2lkdGggPSBzdHlsZS5tYXhXaWR0aDtcblxuXHRcdFx0Ly8gUHV0IGluIHRoZSBuZXcgdmFsdWVzIHRvIGdldCBhIGNvbXB1dGVkIHZhbHVlIG91dFxuXHRcdFx0c3R5bGUubWluV2lkdGggPSBzdHlsZS5tYXhXaWR0aCA9IHN0eWxlLndpZHRoID0gcmV0O1xuXHRcdFx0cmV0ID0gY29tcHV0ZWQud2lkdGg7XG5cblx0XHRcdC8vIFJldmVydCB0aGUgY2hhbmdlZCB2YWx1ZXNcblx0XHRcdHN0eWxlLndpZHRoID0gd2lkdGg7XG5cdFx0XHRzdHlsZS5taW5XaWR0aCA9IG1pbldpZHRoO1xuXHRcdFx0c3R5bGUubWF4V2lkdGggPSBtYXhXaWR0aDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gcmV0ICE9PSB1bmRlZmluZWQgP1xuXG5cdFx0Ly8gU3VwcG9ydDogSUUgPD05IC0gMTEgb25seVxuXHRcdC8vIElFIHJldHVybnMgekluZGV4IHZhbHVlIGFzIGFuIGludGVnZXIuXG5cdFx0cmV0ICsgXCJcIiA6XG5cdFx0cmV0O1xufVxuXG5cbmZ1bmN0aW9uIGFkZEdldEhvb2tJZiggY29uZGl0aW9uRm4sIGhvb2tGbiApIHtcblxuXHQvLyBEZWZpbmUgdGhlIGhvb2ssIHdlJ2xsIGNoZWNrIG9uIHRoZSBmaXJzdCBydW4gaWYgaXQncyByZWFsbHkgbmVlZGVkLlxuXHRyZXR1cm4ge1xuXHRcdGdldDogZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGNvbmRpdGlvbkZuKCkgKSB7XG5cblx0XHRcdFx0Ly8gSG9vayBub3QgbmVlZGVkIChvciBpdCdzIG5vdCBwb3NzaWJsZSB0byB1c2UgaXQgZHVlXG5cdFx0XHRcdC8vIHRvIG1pc3NpbmcgZGVwZW5kZW5jeSksIHJlbW92ZSBpdC5cblx0XHRcdFx0ZGVsZXRlIHRoaXMuZ2V0O1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIEhvb2sgbmVlZGVkOyByZWRlZmluZSBpdCBzbyB0aGF0IHRoZSBzdXBwb3J0IHRlc3QgaXMgbm90IGV4ZWN1dGVkIGFnYWluLlxuXHRcdFx0cmV0dXJuICggdGhpcy5nZXQgPSBob29rRm4gKS5hcHBseSggdGhpcywgYXJndW1lbnRzICk7XG5cdFx0fVxuXHR9O1xufVxuXG5cbnZhclxuXG5cdC8vIFN3YXBwYWJsZSBpZiBkaXNwbGF5IGlzIG5vbmUgb3Igc3RhcnRzIHdpdGggdGFibGVcblx0Ly8gZXhjZXB0IFwidGFibGVcIiwgXCJ0YWJsZS1jZWxsXCIsIG9yIFwidGFibGUtY2FwdGlvblwiXG5cdC8vIFNlZSBoZXJlIGZvciBkaXNwbGF5IHZhbHVlczogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9DU1MvZGlzcGxheVxuXHRyZGlzcGxheXN3YXAgPSAvXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sXG5cdHJjdXN0b21Qcm9wID0gL14tLS8sXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk1velwiLCBcIm1zXCIgXSxcblx0ZW1wdHlTdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKS5zdHlsZTtcblxuLy8gUmV0dXJuIGEgY3NzIHByb3BlcnR5IG1hcHBlZCB0byBhIHBvdGVudGlhbGx5IHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eVxuZnVuY3Rpb24gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB7XG5cblx0Ly8gU2hvcnRjdXQgZm9yIG5hbWVzIHRoYXQgYXJlIG5vdCB2ZW5kb3IgcHJlZml4ZWRcblx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cblxuXHQvLyBDaGVjayBmb3IgdmVuZG9yIHByZWZpeGVkIG5hbWVzXG5cdHZhciBjYXBOYW1lID0gbmFtZVsgMCBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKCAxICksXG5cdFx0aSA9IGNzc1ByZWZpeGVzLmxlbmd0aDtcblxuXHR3aGlsZSAoIGktLSApIHtcblx0XHRuYW1lID0gY3NzUHJlZml4ZXNbIGkgXSArIGNhcE5hbWU7XG5cdFx0aWYgKCBuYW1lIGluIGVtcHR5U3R5bGUgKSB7XG5cdFx0XHRyZXR1cm4gbmFtZTtcblx0XHR9XG5cdH1cbn1cblxuLy8gUmV0dXJuIGEgcHJvcGVydHkgbWFwcGVkIGFsb25nIHdoYXQgalF1ZXJ5LmNzc1Byb3BzIHN1Z2dlc3RzIG9yIHRvXG4vLyBhIHZlbmRvciBwcmVmaXhlZCBwcm9wZXJ0eS5cbmZ1bmN0aW9uIGZpbmFsUHJvcE5hbWUoIG5hbWUgKSB7XG5cdHZhciByZXQgPSBqUXVlcnkuY3NzUHJvcHNbIG5hbWUgXTtcblx0aWYgKCAhcmV0ICkge1xuXHRcdHJldCA9IGpRdWVyeS5jc3NQcm9wc1sgbmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG5hbWUgKSB8fCBuYW1lO1xuXHR9XG5cdHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGJveE1vZGVsQWRqdXN0bWVudCggZWxlbSwgZGltZW5zaW9uLCBib3gsIGlzQm9yZGVyQm94LCBzdHlsZXMsIGNvbXB1dGVkVmFsICkge1xuXHR2YXIgaSA9IGRpbWVuc2lvbiA9PT0gXCJ3aWR0aFwiID8gMSA6IDAsXG5cdFx0ZXh0cmEgPSAwLFxuXHRcdGRlbHRhID0gMDtcblxuXHQvLyBBZGp1c3RtZW50IG1heSBub3QgYmUgbmVjZXNzYXJ5XG5cdGlmICggYm94ID09PSAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICkgKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW5cblx0XHRpZiAoIGJveCA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdGRlbHRhICs9IGpRdWVyeS5jc3MoIGVsZW0sIGJveCArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgY29udGVudC1ib3gsIHdlJ3JlIHNlZWtpbmcgXCJwYWRkaW5nXCIgb3IgXCJib3JkZXJcIiBvciBcIm1hcmdpblwiXG5cdFx0aWYgKCAhaXNCb3JkZXJCb3ggKSB7XG5cblx0XHRcdC8vIEFkZCBwYWRkaW5nXG5cdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblxuXHRcdFx0Ly8gRm9yIFwiYm9yZGVyXCIgb3IgXCJtYXJnaW5cIiwgYWRkIGJvcmRlclxuXHRcdFx0aWYgKCBib3ggIT09IFwicGFkZGluZ1wiICkge1xuXHRcdFx0XHRkZWx0YSArPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBCdXQgc3RpbGwga2VlcCB0cmFjayBvZiBpdCBvdGhlcndpc2Vcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGV4dHJhICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHQvLyBJZiB3ZSBnZXQgaGVyZSB3aXRoIGEgYm9yZGVyLWJveCAoY29udGVudCArIHBhZGRpbmcgKyBib3JkZXIpLCB3ZSdyZSBzZWVraW5nIFwiY29udGVudFwiIG9yXG5cdFx0Ly8gXCJwYWRkaW5nXCIgb3IgXCJtYXJnaW5cIlxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEZvciBcImNvbnRlbnRcIiwgc3VidHJhY3QgcGFkZGluZ1xuXHRcdFx0aWYgKCBib3ggPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHRkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBhZGRpbmdcIiArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yIFwiY29udGVudFwiIG9yIFwicGFkZGluZ1wiLCBzdWJ0cmFjdCBib3JkZXJcblx0XHRcdGlmICggYm94ICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHRkZWx0YSAtPSBqUXVlcnkuY3NzKCBlbGVtLCBcImJvcmRlclwiICsgY3NzRXhwYW5kWyBpIF0gKyBcIldpZHRoXCIsIHRydWUsIHN0eWxlcyApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFjY291bnQgZm9yIHBvc2l0aXZlIGNvbnRlbnQtYm94IHNjcm9sbCBndXR0ZXIgd2hlbiByZXF1ZXN0ZWQgYnkgcHJvdmlkaW5nIGNvbXB1dGVkVmFsXG5cdGlmICggIWlzQm9yZGVyQm94ICYmIGNvbXB1dGVkVmFsID49IDAgKSB7XG5cblx0XHQvLyBvZmZzZXRXaWR0aC9vZmZzZXRIZWlnaHQgaXMgYSByb3VuZGVkIHN1bSBvZiBjb250ZW50LCBwYWRkaW5nLCBzY3JvbGwgZ3V0dGVyLCBhbmQgYm9yZGVyXG5cdFx0Ly8gQXNzdW1pbmcgaW50ZWdlciBzY3JvbGwgZ3V0dGVyLCBzdWJ0cmFjdCB0aGUgcmVzdCBhbmQgcm91bmQgZG93blxuXHRcdGRlbHRhICs9IE1hdGgubWF4KCAwLCBNYXRoLmNlaWwoXG5cdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0Y29tcHV0ZWRWYWwgLVxuXHRcdFx0ZGVsdGEgLVxuXHRcdFx0ZXh0cmEgLVxuXHRcdFx0MC41XG5cdFx0KSApO1xuXHR9XG5cblx0cmV0dXJuIGRlbHRhO1xufVxuXG5mdW5jdGlvbiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBkaW1lbnNpb24sIGV4dHJhICkge1xuXG5cdC8vIFN0YXJ0IHdpdGggY29tcHV0ZWQgc3R5bGVcblx0dmFyIHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgZGltZW5zaW9uLCBzdHlsZXMgKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0dmFsdWVJc0JvcmRlckJveCA9IGlzQm9yZGVyQm94O1xuXG5cdC8vIFN1cHBvcnQ6IEZpcmVmb3ggPD01NFxuXHQvLyBSZXR1cm4gYSBjb25mb3VuZGluZyBub24tcGl4ZWwgdmFsdWUgb3IgZmVpZ24gaWdub3JhbmNlLCBhcyBhcHByb3ByaWF0ZS5cblx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0aWYgKCAhZXh0cmEgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblx0XHR2YWwgPSBcImF1dG9cIjtcblx0fVxuXG5cdC8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdC8vIGZvciBnZXRDb21wdXRlZFN0eWxlIHNpbGVudGx5IGZhbGxzIGJhY2sgdG8gdGhlIHJlbGlhYmxlIGVsZW0uc3R5bGVcblx0dmFsdWVJc0JvcmRlckJveCA9IHZhbHVlSXNCb3JkZXJCb3ggJiZcblx0XHQoIHN1cHBvcnQuYm94U2l6aW5nUmVsaWFibGUoKSB8fCB2YWwgPT09IGVsZW0uc3R5bGVbIGRpbWVuc2lvbiBdICk7XG5cblx0Ly8gRmFsbCBiYWNrIHRvIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCB3aGVuIHZhbHVlIGlzIFwiYXV0b1wiXG5cdC8vIFRoaXMgaGFwcGVucyBmb3IgaW5saW5lIGVsZW1lbnRzIHdpdGggbm8gZXhwbGljaXQgc2V0dGluZyAoZ2gtMzU3MSlcblx0Ly8gU3VwcG9ydDogQW5kcm9pZCA8PTQuMSAtIDQuMyBvbmx5XG5cdC8vIEFsc28gdXNlIG9mZnNldFdpZHRoL29mZnNldEhlaWdodCBmb3IgbWlzcmVwb3J0ZWQgaW5saW5lIGRpbWVuc2lvbnMgKGdoLTM2MDIpXG5cdGlmICggdmFsID09PSBcImF1dG9cIiB8fFxuXHRcdCFwYXJzZUZsb2F0KCB2YWwgKSAmJiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImlubGluZVwiICkge1xuXG5cdFx0dmFsID0gZWxlbVsgXCJvZmZzZXRcIiArIGRpbWVuc2lvblsgMCBdLnRvVXBwZXJDYXNlKCkgKyBkaW1lbnNpb24uc2xpY2UoIDEgKSBdO1xuXG5cdFx0Ly8gb2Zmc2V0V2lkdGgvb2Zmc2V0SGVpZ2h0IHByb3ZpZGUgYm9yZGVyLWJveCB2YWx1ZXNcblx0XHR2YWx1ZUlzQm9yZGVyQm94ID0gdHJ1ZTtcblx0fVxuXG5cdC8vIE5vcm1hbGl6ZSBcIlwiIGFuZCBhdXRvXG5cdHZhbCA9IHBhcnNlRmxvYXQoIHZhbCApIHx8IDA7XG5cblx0Ly8gQWRqdXN0IGZvciB0aGUgZWxlbWVudCdzIGJveCBtb2RlbFxuXHRyZXR1cm4gKCB2YWwgK1xuXHRcdGJveE1vZGVsQWRqdXN0bWVudChcblx0XHRcdGVsZW0sXG5cdFx0XHRkaW1lbnNpb24sXG5cdFx0XHRleHRyYSB8fCAoIGlzQm9yZGVyQm94ID8gXCJib3JkZXJcIiA6IFwiY29udGVudFwiICksXG5cdFx0XHR2YWx1ZUlzQm9yZGVyQm94LFxuXHRcdFx0c3R5bGVzLFxuXG5cdFx0XHQvLyBQcm92aWRlIHRoZSBjdXJyZW50IGNvbXB1dGVkIHNpemUgdG8gcmVxdWVzdCBzY3JvbGwgZ3V0dGVyIGNhbGN1bGF0aW9uIChnaC0zNTg5KVxuXHRcdFx0dmFsXG5cdFx0KVxuXHQpICsgXCJweFwiO1xufVxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gQWRkIGluIHN0eWxlIHByb3BlcnR5IGhvb2tzIGZvciBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cdC8vIGJlaGF2aW9yIG9mIGdldHRpbmcgYW5kIHNldHRpbmcgYSBzdHlsZSBwcm9wZXJ0eVxuXHRjc3NIb29rczoge1xuXHRcdG9wYWNpdHk6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIGFsd2F5cyBnZXQgYSBudW1iZXIgYmFjayBmcm9tIG9wYWNpdHlcblx0XHRcdFx0XHR2YXIgcmV0ID0gY3VyQ1NTKCBlbGVtLCBcIm9wYWNpdHlcIiApO1xuXHRcdFx0XHRcdHJldHVybiByZXQgPT09IFwiXCIgPyBcIjFcIiA6IHJldDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHQvLyBEb24ndCBhdXRvbWF0aWNhbGx5IGFkZCBcInB4XCIgdG8gdGhlc2UgcG9zc2libHktdW5pdGxlc3MgcHJvcGVydGllc1xuXHRjc3NOdW1iZXI6IHtcblx0XHRcImFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50XCI6IHRydWUsXG5cdFx0XCJjb2x1bW5Db3VudFwiOiB0cnVlLFxuXHRcdFwiZmlsbE9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcImZsZXhHcm93XCI6IHRydWUsXG5cdFx0XCJmbGV4U2hyaW5rXCI6IHRydWUsXG5cdFx0XCJmb250V2VpZ2h0XCI6IHRydWUsXG5cdFx0XCJsaW5lSGVpZ2h0XCI6IHRydWUsXG5cdFx0XCJvcGFjaXR5XCI6IHRydWUsXG5cdFx0XCJvcmRlclwiOiB0cnVlLFxuXHRcdFwib3JwaGFuc1wiOiB0cnVlLFxuXHRcdFwid2lkb3dzXCI6IHRydWUsXG5cdFx0XCJ6SW5kZXhcIjogdHJ1ZSxcblx0XHRcInpvb21cIjogdHJ1ZVxuXHR9LFxuXG5cdC8vIEFkZCBpbiBwcm9wZXJ0aWVzIHdob3NlIG5hbWVzIHlvdSB3aXNoIHRvIGZpeCBiZWZvcmVcblx0Ly8gc2V0dGluZyBvciBnZXR0aW5nIHRoZSB2YWx1ZVxuXHRjc3NQcm9wczoge30sXG5cblx0Ly8gR2V0IGFuZCBzZXQgdGhlIHN0eWxlIHByb3BlcnR5IG9uIGEgRE9NIE5vZGVcblx0c3R5bGU6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSwgZXh0cmEgKSB7XG5cblx0XHQvLyBEb24ndCBzZXQgc3R5bGVzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoICFlbGVtIHx8IGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCB8fCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWVcblx0XHR2YXIgcmV0LCB0eXBlLCBob29rcyxcblx0XHRcdG9yaWdOYW1lID0gY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRpc0N1c3RvbVByb3AgPSByY3VzdG9tUHJvcC50ZXN0KCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB3ZSdyZSB3b3JraW5nIHdpdGggdGhlIHJpZ2h0IG5hbWUuIFdlIGRvbid0XG5cdFx0Ly8gd2FudCB0byBxdWVyeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIEdldHMgaG9vayBmb3IgdGhlIHByZWZpeGVkIHZlcnNpb24sIHRoZW4gdW5wcmVmaXhlZCB2ZXJzaW9uXG5cdFx0aG9va3MgPSBqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSB8fCBqUXVlcnkuY3NzSG9va3NbIG9yaWdOYW1lIF07XG5cblx0XHQvLyBDaGVjayBpZiB3ZSdyZSBzZXR0aW5nIGEgdmFsdWVcblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHR0eXBlID0gdHlwZW9mIHZhbHVlO1xuXG5cdFx0XHQvLyBDb252ZXJ0IFwiKz1cIiBvciBcIi09XCIgdG8gcmVsYXRpdmUgbnVtYmVycyAoIzczNDUpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwic3RyaW5nXCIgJiYgKCByZXQgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICkgKSAmJiByZXRbIDEgXSApIHtcblx0XHRcdFx0dmFsdWUgPSBhZGp1c3RDU1MoIGVsZW0sIG5hbWUsIHJldCApO1xuXG5cdFx0XHRcdC8vIEZpeGVzIGJ1ZyAjOTIzN1xuXHRcdFx0XHR0eXBlID0gXCJudW1iZXJcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgbnVsbCBhbmQgTmFOIHZhbHVlcyBhcmVuJ3Qgc2V0ICgjNzExNilcblx0XHRcdGlmICggdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBudW1iZXIgd2FzIHBhc3NlZCBpbiwgYWRkIHRoZSB1bml0IChleGNlcHQgZm9yIGNlcnRhaW4gQ1NTIHByb3BlcnRpZXMpXG5cdFx0XHRpZiAoIHR5cGUgPT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdHZhbHVlICs9IHJldCAmJiByZXRbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIG9yaWdOYW1lIF0gPyBcIlwiIDogXCJweFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIGJhY2tncm91bmQtKiBwcm9wcyBhZmZlY3Qgb3JpZ2luYWwgY2xvbmUncyB2YWx1ZXNcblx0XHRcdGlmICggIXN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlICYmIHZhbHVlID09PSBcIlwiICYmIG5hbWUuaW5kZXhPZiggXCJiYWNrZ3JvdW5kXCIgKSA9PT0gMCApIHtcblx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IFwiaW5oZXJpdFwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkLCB1c2UgdGhhdCB2YWx1ZSwgb3RoZXJ3aXNlIGp1c3Qgc2V0IHRoZSBzcGVjaWZpZWQgdmFsdWVcblx0XHRcdGlmICggIWhvb2tzIHx8ICEoIFwic2V0XCIgaW4gaG9va3MgKSB8fFxuXHRcdFx0XHQoIHZhbHVlID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0aWYgKCBpc0N1c3RvbVByb3AgKSB7XG5cdFx0XHRcdFx0c3R5bGUuc2V0UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0c3R5bGVbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBJZiBhIGhvb2sgd2FzIHByb3ZpZGVkIGdldCB0aGUgbm9uLWNvbXB1dGVkIHZhbHVlIGZyb20gdGhlcmVcblx0XHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgZmFsc2UsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE90aGVyd2lzZSBqdXN0IGdldCB0aGUgdmFsdWUgZnJvbSB0aGUgc3R5bGUgb2JqZWN0XG5cdFx0XHRyZXR1cm4gc3R5bGVbIG5hbWUgXTtcblx0XHR9XG5cdH0sXG5cblx0Y3NzOiBmdW5jdGlvbiggZWxlbSwgbmFtZSwgZXh0cmEsIHN0eWxlcyApIHtcblx0XHR2YXIgdmFsLCBudW0sIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBjYW1lbENhc2UoIG5hbWUgKSxcblx0XHRcdGlzQ3VzdG9tUHJvcCA9IHJjdXN0b21Qcm9wLnRlc3QoIG5hbWUgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZS4gV2UgZG9uJ3Rcblx0XHQvLyB3YW50IHRvIG1vZGlmeSB0aGUgdmFsdWUgaWYgaXQgaXMgYSBDU1MgY3VzdG9tIHByb3BlcnR5XG5cdFx0Ly8gc2luY2UgdGhleSBhcmUgdXNlci1kZWZpbmVkLlxuXHRcdGlmICggIWlzQ3VzdG9tUHJvcCApIHtcblx0XHRcdG5hbWUgPSBmaW5hbFByb3BOYW1lKCBvcmlnTmFtZSApO1xuXHRcdH1cblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5pdGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbDtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImhlaWdodFwiLCBcIndpZHRoXCIgXSwgZnVuY3Rpb24oIGksIGRpbWVuc2lvbiApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBkaW1lbnNpb24gXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogU2FmYXJpIDgrXG5cdFx0XHRcdFx0Ly8gVGFibGUgY29sdW1ucyBpbiBTYWZhcmkgaGF2ZSBub24temVybyBvZmZzZXRXaWR0aCAmIHplcm9cblx0XHRcdFx0XHQvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCB1bmxlc3MgZGlzcGxheSBpcyBjaGFuZ2VkLlxuXHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdFx0XHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGEgZGlzY29ubmVjdGVkIG5vZGVcblx0XHRcdFx0XHQvLyBpbiBJRSB0aHJvd3MgYW4gZXJyb3IuXG5cdFx0XHRcdFx0KCAhZWxlbS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCB8fCAhZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCApID9cblx0XHRcdFx0XHRcdHN3YXAoIGVsZW0sIGNzc1Nob3csIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgZGltZW5zaW9uLCBleHRyYSApO1xuXHRcdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIGRpbWVuc2lvbiwgZXh0cmEgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUsIGV4dHJhICkge1xuXHRcdFx0dmFyIG1hdGNoZXMsXG5cdFx0XHRcdHN0eWxlcyA9IGdldFN0eWxlcyggZWxlbSApLFxuXHRcdFx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCIsXG5cdFx0XHRcdHN1YnRyYWN0ID0gZXh0cmEgJiYgYm94TW9kZWxBZGp1c3RtZW50KFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0ZGltZW5zaW9uLFxuXHRcdFx0XHRcdGV4dHJhLFxuXHRcdFx0XHRcdGlzQm9yZGVyQm94LFxuXHRcdFx0XHRcdHN0eWxlc1xuXHRcdFx0XHQpO1xuXG5cdFx0XHQvLyBBY2NvdW50IGZvciB1bnJlbGlhYmxlIGJvcmRlci1ib3ggZGltZW5zaW9ucyBieSBjb21wYXJpbmcgb2Zmc2V0KiB0byBjb21wdXRlZCBhbmRcblx0XHRcdC8vIGZha2luZyBhIGNvbnRlbnQtYm94IHRvIGdldCBib3JkZXIgYW5kIHBhZGRpbmcgKGdoLTM2OTkpXG5cdFx0XHRpZiAoIGlzQm9yZGVyQm94ICYmIHN1cHBvcnQuc2Nyb2xsYm94U2l6ZSgpID09PSBzdHlsZXMucG9zaXRpb24gKSB7XG5cdFx0XHRcdHN1YnRyYWN0IC09IE1hdGguY2VpbChcblx0XHRcdFx0XHRlbGVtWyBcIm9mZnNldFwiICsgZGltZW5zaW9uWyAwIF0udG9VcHBlckNhc2UoKSArIGRpbWVuc2lvbi5zbGljZSggMSApIF0gLVxuXHRcdFx0XHRcdHBhcnNlRmxvYXQoIHN0eWxlc1sgZGltZW5zaW9uIF0gKSAtXG5cdFx0XHRcdFx0Ym94TW9kZWxBZGp1c3RtZW50KCBlbGVtLCBkaW1lbnNpb24sIFwiYm9yZGVyXCIsIGZhbHNlLCBzdHlsZXMgKSAtXG5cdFx0XHRcdFx0MC41XG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbnZlcnQgdG8gcGl4ZWxzIGlmIHZhbHVlIGFkanVzdG1lbnQgaXMgbmVlZGVkXG5cdFx0XHRpZiAoIHN1YnRyYWN0ICYmICggbWF0Y2hlcyA9IHJjc3NOdW0uZXhlYyggdmFsdWUgKSApICYmXG5cdFx0XHRcdCggbWF0Y2hlc1sgMyBdIHx8IFwicHhcIiApICE9PSBcInB4XCIgKSB7XG5cblx0XHRcdFx0ZWxlbS5zdHlsZVsgZGltZW5zaW9uIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBkaW1lbnNpb24gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKTtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5MZWZ0ID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnJlbGlhYmxlTWFyZ2luTGVmdCxcblx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdGlmICggY29tcHV0ZWQgKSB7XG5cdFx0XHRyZXR1cm4gKCBwYXJzZUZsb2F0KCBjdXJDU1MoIGVsZW0sIFwibWFyZ2luTGVmdFwiICkgKSB8fFxuXHRcdFx0XHRlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLVxuXHRcdFx0XHRcdHN3YXAoIGVsZW0sIHsgbWFyZ2luTGVmdDogMCB9LCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7XG5cdFx0XHRcdFx0fSApXG5cdFx0XHRcdCkgKyBcInB4XCI7XG5cdFx0fVxuXHR9XG4pO1xuXG4vLyBUaGVzZSBob29rcyBhcmUgdXNlZCBieSBhbmltYXRlIHRvIGV4cGFuZCBwcm9wZXJ0aWVzXG5qUXVlcnkuZWFjaCgge1xuXHRtYXJnaW46IFwiXCIsXG5cdHBhZGRpbmc6IFwiXCIsXG5cdGJvcmRlcjogXCJXaWR0aFwiXG59LCBmdW5jdGlvbiggcHJlZml4LCBzdWZmaXggKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJlZml4ICsgc3VmZml4IF0gPSB7XG5cdFx0ZXhwYW5kOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgaSA9IDAsXG5cdFx0XHRcdGV4cGFuZGVkID0ge30sXG5cblx0XHRcdFx0Ly8gQXNzdW1lcyBhIHNpbmdsZSBudW1iZXIgaWYgbm90IGEgc3RyaW5nXG5cdFx0XHRcdHBhcnRzID0gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiID8gdmFsdWUuc3BsaXQoIFwiIFwiICkgOiBbIHZhbHVlIF07XG5cblx0XHRcdGZvciAoIDsgaSA8IDQ7IGkrKyApIHtcblx0XHRcdFx0ZXhwYW5kZWRbIHByZWZpeCArIGNzc0V4cGFuZFsgaSBdICsgc3VmZml4IF0gPVxuXHRcdFx0XHRcdHBhcnRzWyBpIF0gfHwgcGFydHNbIGkgLSAyIF0gfHwgcGFydHNbIDAgXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGV4cGFuZGVkO1xuXHRcdH1cblx0fTtcblxuXHRpZiAoIHByZWZpeCAhPT0gXCJtYXJnaW5cIiApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkge1xuXHRcdFx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKTtcblx0XHRcdFx0bGVuID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0bWFwWyBuYW1lWyBpIF0gXSA9IGpRdWVyeS5jc3MoIGVsZW0sIG5hbWVbIGkgXSwgZmFsc2UsIHN0eWxlcyApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIG1hcDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIG5hbWUsIHZhbHVlICkgOlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0fSwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUUgPD05IG9ubHlcbi8vIFBhbmljIGJhc2VkIGFwcHJvYWNoIHRvIHNldHRpbmcgdGhpbmdzIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuVHdlZW4ucHJvcEhvb2tzLnNjcm9sbFRvcCA9IFR3ZWVuLnByb3BIb29rcy5zY3JvbGxMZWZ0ID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRpZiAoIHR3ZWVuLmVsZW0ubm9kZVR5cGUgJiYgdHdlZW4uZWxlbS5wYXJlbnROb2RlICkge1xuXHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmVhc2luZyA9IHtcblx0bGluZWFyOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gcDtcblx0fSxcblx0c3dpbmc6IGZ1bmN0aW9uKCBwICkge1xuXHRcdHJldHVybiAwLjUgLSBNYXRoLmNvcyggcCAqIE1hdGguUEkgKSAvIDI7XG5cdH0sXG5cdF9kZWZhdWx0OiBcInN3aW5nXCJcbn07XG5cbmpRdWVyeS5meCA9IFR3ZWVuLnByb3RvdHlwZS5pbml0O1xuXG4vLyBCYWNrIGNvbXBhdCA8MS44IGV4dGVuc2lvbiBwb2ludFxualF1ZXJ5LmZ4LnN0ZXAgPSB7fTtcblxuXG5cblxudmFyXG5cdGZ4Tm93LCBpblByb2dyZXNzLFxuXHRyZnh0eXBlcyA9IC9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxcblx0cnJ1biA9IC9xdWV1ZUhvb2tzJC87XG5cbmZ1bmN0aW9uIHNjaGVkdWxlKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0aWYgKCBkb2N1bWVudC5oaWRkZW4gPT09IGZhbHNlICYmIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgKSB7XG5cdFx0XHR3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBzY2hlZHVsZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggc2NoZWR1bGUsIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHRcdH1cblxuXHRcdGpRdWVyeS5meC50aWNrKCk7XG5cdH1cbn1cblxuLy8gQW5pbWF0aW9ucyBjcmVhdGVkIHN5bmNocm9ub3VzbHkgd2lsbCBydW4gc3luY2hyb25vdXNseVxuZnVuY3Rpb24gY3JlYXRlRnhOb3coKSB7XG5cdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRmeE5vdyA9IHVuZGVmaW5lZDtcblx0fSApO1xuXHRyZXR1cm4gKCBmeE5vdyA9IERhdGUubm93KCkgKTtcbn1cblxuLy8gR2VuZXJhdGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSBzdGFuZGFyZCBhbmltYXRpb25cbmZ1bmN0aW9uIGdlbkZ4KCB0eXBlLCBpbmNsdWRlV2lkdGggKSB7XG5cdHZhciB3aGljaCxcblx0XHRpID0gMCxcblx0XHRhdHRycyA9IHsgaGVpZ2h0OiB0eXBlIH07XG5cblx0Ly8gSWYgd2UgaW5jbHVkZSB3aWR0aCwgc3RlcCB2YWx1ZSBpcyAxIHRvIGRvIGFsbCBjc3NFeHBhbmQgdmFsdWVzLFxuXHQvLyBvdGhlcndpc2Ugc3RlcCB2YWx1ZSBpcyAyIHRvIHNraXAgb3ZlciBMZWZ0IGFuZCBSaWdodFxuXHRpbmNsdWRlV2lkdGggPSBpbmNsdWRlV2lkdGggPyAxIDogMDtcblx0Zm9yICggOyBpIDwgNDsgaSArPSAyIC0gaW5jbHVkZVdpZHRoICkge1xuXHRcdHdoaWNoID0gY3NzRXhwYW5kWyBpIF07XG5cdFx0YXR0cnNbIFwibWFyZ2luXCIgKyB3aGljaCBdID0gYXR0cnNbIFwicGFkZGluZ1wiICsgd2hpY2ggXSA9IHR5cGU7XG5cdH1cblxuXHRpZiAoIGluY2x1ZGVXaWR0aCApIHtcblx0XHRhdHRycy5vcGFjaXR5ID0gYXR0cnMud2lkdGggPSB0eXBlO1xuXHR9XG5cblx0cmV0dXJuIGF0dHJzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVUd2VlbiggdmFsdWUsIHByb3AsIGFuaW1hdGlvbiApIHtcblx0dmFyIHR3ZWVuLFxuXHRcdGNvbGxlY3Rpb24gPSAoIEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdIHx8IFtdICkuY29uY2F0KCBBbmltYXRpb24udHdlZW5lcnNbIFwiKlwiIF0gKSxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gY29sbGVjdGlvbi5sZW5ndGg7XG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0aWYgKCAoIHR3ZWVuID0gY29sbGVjdGlvblsgaW5kZXggXS5jYWxsKCBhbmltYXRpb24sIHByb3AsIHZhbHVlICkgKSApIHtcblxuXHRcdFx0Ly8gV2UncmUgZG9uZSB3aXRoIHRoaXMgcHJvcGVydHlcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9XG5cdH1cbn1cblxuZnVuY3Rpb24gZGVmYXVsdFByZWZpbHRlciggZWxlbSwgcHJvcHMsIG9wdHMgKSB7XG5cdHZhciBwcm9wLCB2YWx1ZSwgdG9nZ2xlLCBob29rcywgb2xkZmlyZSwgcHJvcFR3ZWVuLCByZXN0b3JlRGlzcGxheSwgZGlzcGxheSxcblx0XHRpc0JveCA9IFwid2lkdGhcIiBpbiBwcm9wcyB8fCBcImhlaWdodFwiIGluIHByb3BzLFxuXHRcdGFuaW0gPSB0aGlzLFxuXHRcdG9yaWcgPSB7fSxcblx0XHRzdHlsZSA9IGVsZW0uc3R5bGUsXG5cdFx0aGlkZGVuID0gZWxlbS5ub2RlVHlwZSAmJiBpc0hpZGRlbldpdGhpblRyZWUoIGVsZW0gKSxcblx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJmeHNob3dcIiApO1xuXG5cdC8vIFF1ZXVlLXNraXBwaW5nIGFuaW1hdGlvbnMgaGlqYWNrIHRoZSBmeCBob29rc1xuXHRpZiAoICFvcHRzLnF1ZXVlICkge1xuXHRcdGhvb2tzID0galF1ZXJ5Ll9xdWV1ZUhvb2tzKCBlbGVtLCBcImZ4XCIgKTtcblx0XHRpZiAoIGhvb2tzLnVucXVldWVkID09IG51bGwgKSB7XG5cdFx0XHRob29rcy51bnF1ZXVlZCA9IDA7XG5cdFx0XHRvbGRmaXJlID0gaG9va3MuZW1wdHkuZmlyZTtcblx0XHRcdGhvb2tzLmVtcHR5LmZpcmUgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCAhaG9va3MudW5xdWV1ZWQgKSB7XG5cdFx0XHRcdFx0b2xkZmlyZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdH1cblx0XHRob29rcy51bnF1ZXVlZCsrO1xuXG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBFbnN1cmUgdGhlIGNvbXBsZXRlIGhhbmRsZXIgaXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNvbXBsZXRlc1xuXHRcdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRob29rcy51bnF1ZXVlZC0tO1xuXHRcdFx0XHRpZiAoICFqUXVlcnkucXVldWUoIGVsZW0sIFwiZnhcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHQvLyBEZXRlY3Qgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy50ZXN0KCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBQcmV0ZW5kIHRvIGJlIGhpZGRlbiBpZiB0aGlzIGlzIGEgXCJzaG93XCIgYW5kXG5cdFx0XHRcdC8vIHRoZXJlIGlzIHN0aWxsIGRhdGEgZnJvbSBhIHN0b3BwZWQgc2hvdy9oaWRlXG5cdFx0XHRcdGlmICggdmFsdWUgPT09IFwic2hvd1wiICYmIGRhdGFTaG93ICYmIGRhdGFTaG93WyBwcm9wIF0gIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRoaWRkZW4gPSB0cnVlO1xuXG5cdFx0XHRcdC8vIElnbm9yZSBhbGwgb3RoZXIgbm8tb3Agc2hvdy9oaWRlIGRhdGFcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBCYWlsIG91dCBpZiB0aGlzIGlzIGEgbm8tb3AgbGlrZSAuaGlkZSgpLmhpZGUoKVxuXHRwcm9wVHdlZW4gPSAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3BzICk7XG5cdGlmICggIXByb3BUd2VlbiAmJiBqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFJlc3RyaWN0IFwib3ZlcmZsb3dcIiBhbmQgXCJkaXNwbGF5XCIgc3R5bGVzIGR1cmluZyBib3ggYW5pbWF0aW9uc1xuXHRpZiAoIGlzQm94ICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cblx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgLSAxMSwgRWRnZSAxMiAtIDE1XG5cdFx0Ly8gUmVjb3JkIGFsbCAzIG92ZXJmbG93IGF0dHJpYnV0ZXMgYmVjYXVzZSBJRSBkb2VzIG5vdCBpbmZlciB0aGUgc2hvcnRoYW5kXG5cdFx0Ly8gZnJvbSBpZGVudGljYWxseS12YWx1ZWQgb3ZlcmZsb3dYIGFuZCBvdmVyZmxvd1kgYW5kIEVkZ2UganVzdCBtaXJyb3JzXG5cdFx0Ly8gdGhlIG92ZXJmbG93WCB2YWx1ZSB0aGVyZS5cblx0XHRvcHRzLm92ZXJmbG93ID0gWyBzdHlsZS5vdmVyZmxvdywgc3R5bGUub3ZlcmZsb3dYLCBzdHlsZS5vdmVyZmxvd1kgXTtcblxuXHRcdC8vIElkZW50aWZ5IGEgZGlzcGxheSB0eXBlLCBwcmVmZXJyaW5nIG9sZCBzaG93L2hpZGUgZGF0YSBvdmVyIHRoZSBDU1MgY2FzY2FkZVxuXHRcdHJlc3RvcmVEaXNwbGF5ID0gZGF0YVNob3cgJiYgZGF0YVNob3cuZGlzcGxheTtcblx0XHRpZiAoIHJlc3RvcmVEaXNwbGF5ID09IG51bGwgKSB7XG5cdFx0XHRyZXN0b3JlRGlzcGxheSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJkaXNwbGF5XCIgKTtcblx0XHR9XG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cdFx0aWYgKCBkaXNwbGF5ID09PSBcIm5vbmVcIiApIHtcblx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgKSB7XG5cdFx0XHRcdGRpc3BsYXkgPSByZXN0b3JlRGlzcGxheTtcblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gR2V0IG5vbmVtcHR5IHZhbHVlKHMpIGJ5IHRlbXBvcmFyaWx5IGZvcmNpbmcgdmlzaWJpbGl0eVxuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0sIHRydWUgKTtcblx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBlbGVtLnN0eWxlLmRpc3BsYXkgfHwgcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdGRpc3BsYXkgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApO1xuXHRcdFx0XHRzaG93SGlkZSggWyBlbGVtIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBBbmltYXRlIGlubGluZSBlbGVtZW50cyBhcyBpbmxpbmUtYmxvY2tcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwiaW5saW5lXCIgfHwgZGlzcGxheSA9PT0gXCJpbmxpbmUtYmxvY2tcIiAmJiByZXN0b3JlRGlzcGxheSAhPSBudWxsICkge1xuXHRcdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcImZsb2F0XCIgKSA9PT0gXCJub25lXCIgKSB7XG5cblx0XHRcdFx0Ly8gUmVzdG9yZSB0aGUgb3JpZ2luYWwgZGlzcGxheSB2YWx1ZSBhdCB0aGUgZW5kIG9mIHB1cmUgc2hvdy9oaWRlIGFuaW1hdGlvbnNcblx0XHRcdFx0aWYgKCAhcHJvcFR3ZWVuICkge1xuXHRcdFx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gcmVzdG9yZURpc3BsYXk7XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdGlmICggcmVzdG9yZURpc3BsYXkgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdGRpc3BsYXkgPSBzdHlsZS5kaXNwbGF5O1xuXHRcdFx0XHRcdFx0cmVzdG9yZURpc3BsYXkgPSBkaXNwbGF5ID09PSBcIm5vbmVcIiA/IFwiXCIgOiBkaXNwbGF5O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRzdHlsZS5kaXNwbGF5ID0gXCJpbmxpbmUtYmxvY2tcIjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRpZiAoIG9wdHMub3ZlcmZsb3cgKSB7XG5cdFx0c3R5bGUub3ZlcmZsb3cgPSBcImhpZGRlblwiO1xuXHRcdGFuaW0uYWx3YXlzKCBmdW5jdGlvbigpIHtcblx0XHRcdHN0eWxlLm92ZXJmbG93ID0gb3B0cy5vdmVyZmxvd1sgMCBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dYID0gb3B0cy5vdmVyZmxvd1sgMSBdO1xuXHRcdFx0c3R5bGUub3ZlcmZsb3dZID0gb3B0cy5vdmVyZmxvd1sgMiBdO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEltcGxlbWVudCBzaG93L2hpZGUgYW5pbWF0aW9uc1xuXHRwcm9wVHdlZW4gPSBmYWxzZTtcblx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXG5cdFx0Ly8gR2VuZXJhbCBzaG93L2hpZGUgc2V0dXAgZm9yIHRoaXMgZWxlbWVudCBhbmltYXRpb25cblx0XHRpZiAoICFwcm9wVHdlZW4gKSB7XG5cdFx0XHRpZiAoIGRhdGFTaG93ICkge1xuXHRcdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gZGF0YVNob3cuaGlkZGVuO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkYXRhU2hvdyA9IGRhdGFQcml2LmFjY2VzcyggZWxlbSwgXCJmeHNob3dcIiwgeyBkaXNwbGF5OiByZXN0b3JlRGlzcGxheSB9ICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0b3JlIGhpZGRlbi92aXNpYmxlIGZvciB0b2dnbGUgc28gYC5zdG9wKCkudG9nZ2xlKClgIFwicmV2ZXJzZXNcIlxuXHRcdFx0aWYgKCB0b2dnbGUgKSB7XG5cdFx0XHRcdGRhdGFTaG93LmhpZGRlbiA9ICFoaWRkZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNob3cgZWxlbWVudHMgYmVmb3JlIGFuaW1hdGluZyB0aGVtXG5cdFx0XHRpZiAoIGhpZGRlbiApIHtcblx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRhbmltLmRvbmUoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvKiBlc2xpbnQtZW5hYmxlIG5vLWxvb3AtZnVuYyAqL1xuXG5cdFx0XHRcdC8vIFRoZSBmaW5hbCBzdGVwIG9mIGEgXCJoaWRlXCIgYW5pbWF0aW9uIGlzIGFjdHVhbGx5IGhpZGluZyB0aGUgZWxlbWVudFxuXHRcdFx0XHRpZiAoICFoaWRkZW4gKSB7XG5cdFx0XHRcdFx0c2hvd0hpZGUoIFsgZWxlbSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBcImZ4c2hvd1wiICk7XG5cdFx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIG9yaWdbIHByb3AgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gUGVyLXByb3BlcnR5IHNldHVwXG5cdFx0cHJvcFR3ZWVuID0gY3JlYXRlVHdlZW4oIGhpZGRlbiA/IGRhdGFTaG93WyBwcm9wIF0gOiAwLCBwcm9wLCBhbmltICk7XG5cdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRkYXRhU2hvd1sgcHJvcCBdID0gcHJvcFR3ZWVuLnN0YXJ0O1xuXHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdHByb3BUd2Vlbi5lbmQgPSBwcm9wVHdlZW4uc3RhcnQ7XG5cdFx0XHRcdHByb3BUd2Vlbi5zdGFydCA9IDA7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHByb3BGaWx0ZXIoIHByb3BzLCBzcGVjaWFsRWFzaW5nICkge1xuXHR2YXIgaW5kZXgsIG5hbWUsIGVhc2luZywgdmFsdWUsIGhvb2tzO1xuXG5cdC8vIGNhbWVsQ2FzZSwgc3BlY2lhbEVhc2luZyBhbmQgZXhwYW5kIGNzc0hvb2sgcGFzc1xuXHRmb3IgKCBpbmRleCBpbiBwcm9wcyApIHtcblx0XHRuYW1lID0gY2FtZWxDYXNlKCBpbmRleCApO1xuXHRcdGVhc2luZyA9IHNwZWNpYWxFYXNpbmdbIG5hbWUgXTtcblx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdO1xuXHRcdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XG5cdFx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTtcblx0XHR9XG5cblx0XHRpZiAoIGluZGV4ICE9PSBuYW1lICkge1xuXHRcdFx0cHJvcHNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xuXHRcdH1cblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XG5cdFx0aWYgKCBob29rcyAmJiBcImV4cGFuZFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7XG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcblxuXHRcdFx0Ly8gTm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBrZXlzLlxuXHRcdFx0Ly8gUmV1c2luZyAnaW5kZXgnIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxuXHRcdFx0Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHtcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xuXHRcdFx0XHRcdHNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7XG5cdHZhciByZXN1bHQsXG5cdFx0c3RvcHBlZCxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yXG5cdFx0XHRkZWxldGUgdGljay5lbGVtO1xuXHRcdH0gKSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuMyBvbmx5XG5cdFx0XHRcdC8vIEFyY2hhaWMgY3Jhc2ggYnVnIHdvbid0IGFsbG93IHVzIHRvIHVzZSBgMSAtICggMC41IHx8IDAgKWAgKCMxMjQ5Nylcblx0XHRcdFx0dGVtcCA9IHJlbWFpbmluZyAvIGFuaW1hdGlvbi5kdXJhdGlvbiB8fCAwLFxuXHRcdFx0XHRwZXJjZW50ID0gMSAtIHRlbXAsXG5cdFx0XHRcdGluZGV4ID0gMCxcblx0XHRcdFx0bGVuZ3RoID0gYW5pbWF0aW9uLnR3ZWVucy5sZW5ndGg7XG5cblx0XHRcdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCBwZXJjZW50ICk7XG5cdFx0XHR9XG5cblx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBwZXJjZW50LCByZW1haW5pbmcgXSApO1xuXG5cdFx0XHQvLyBJZiB0aGVyZSdzIG1vcmUgdG8gZG8sIHlpZWxkXG5cdFx0XHRpZiAoIHBlcmNlbnQgPCAxICYmIGxlbmd0aCApIHtcblx0XHRcdFx0cmV0dXJuIHJlbWFpbmluZztcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgdGhpcyB3YXMgYW4gZW1wdHkgYW5pbWF0aW9uLCBzeW50aGVzaXplIGEgZmluYWwgcHJvZ3Jlc3Mgbm90aWZpY2F0aW9uXG5cdFx0XHRpZiAoICFsZW5ndGggKSB7XG5cdFx0XHRcdGRlZmVycmVkLm5vdGlmeVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCAxLCAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUmVzb2x2ZSB0aGUgYW5pbWF0aW9uIGFuZCByZXBvcnQgaXRzIGNvbmNsdXNpb25cblx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiBdICk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSxcblx0XHRhbmltYXRpb24gPSBkZWZlcnJlZC5wcm9taXNlKCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0cHJvcHM6IGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wZXJ0aWVzICksXG5cdFx0XHRvcHRzOiBqUXVlcnkuZXh0ZW5kKCB0cnVlLCB7XG5cdFx0XHRcdHNwZWNpYWxFYXNpbmc6IHt9LFxuXHRcdFx0XHRlYXNpbmc6IGpRdWVyeS5lYXNpbmcuX2RlZmF1bHRcblx0XHRcdH0sIG9wdGlvbnMgKSxcblx0XHRcdG9yaWdpbmFsUHJvcGVydGllczogcHJvcGVydGllcyxcblx0XHRcdG9yaWdpbmFsT3B0aW9uczogb3B0aW9ucyxcblx0XHRcdHN0YXJ0VGltZTogZnhOb3cgfHwgY3JlYXRlRnhOb3coKSxcblx0XHRcdGR1cmF0aW9uOiBvcHRpb25zLmR1cmF0aW9uLFxuXHRcdFx0dHdlZW5zOiBbXSxcblx0XHRcdGNyZWF0ZVR3ZWVuOiBmdW5jdGlvbiggcHJvcCwgZW5kICkge1xuXHRcdFx0XHR2YXIgdHdlZW4gPSBqUXVlcnkuVHdlZW4oIGVsZW0sIGFuaW1hdGlvbi5vcHRzLCBwcm9wLCBlbmQsXG5cdFx0XHRcdFx0XHRhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nWyBwcm9wIF0gfHwgYW5pbWF0aW9uLm9wdHMuZWFzaW5nICk7XG5cdFx0XHRcdGFuaW1hdGlvbi50d2VlbnMucHVzaCggdHdlZW4gKTtcblx0XHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdFx0fSxcblx0XHRcdHN0b3A6IGZ1bmN0aW9uKCBnb3RvRW5kICkge1xuXHRcdFx0XHR2YXIgaW5kZXggPSAwLFxuXG5cdFx0XHRcdFx0Ly8gSWYgd2UgYXJlIGdvaW5nIHRvIHRoZSBlbmQsIHdlIHdhbnQgdG8gcnVuIGFsbCB0aGUgdHdlZW5zXG5cdFx0XHRcdFx0Ly8gb3RoZXJ3aXNlIHdlIHNraXAgdGhpcyBwYXJ0XG5cdFx0XHRcdFx0bGVuZ3RoID0gZ290b0VuZCA/IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoIDogMDtcblx0XHRcdFx0aWYgKCBzdG9wcGVkICkge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHN0b3BwZWQgPSB0cnVlO1xuXHRcdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdFx0XHRcdGFuaW1hdGlvbi50d2VlbnNbIGluZGV4IF0ucnVuKCAxICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBSZXNvbHZlIHdoZW4gd2UgcGxheWVkIHRoZSBsYXN0IGZyYW1lOyBvdGhlcndpc2UsIHJlamVjdFxuXHRcdFx0XHRpZiAoIGdvdG9FbmQgKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIDEsIDAgXSApO1xuXHRcdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIGdvdG9FbmQgXSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fVxuXHRcdH0gKSxcblx0XHRwcm9wcyA9IGFuaW1hdGlvbi5wcm9wcztcblxuXHRwcm9wRmlsdGVyKCBwcm9wcywgYW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZyApO1xuXG5cdGZvciAoIDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggaXNGdW5jdGlvbiggcmVzdWx0LnN0b3AgKSApIHtcblx0XHRcdFx0alF1ZXJ5Ll9xdWV1ZUhvb2tzKCBhbmltYXRpb24uZWxlbSwgYW5pbWF0aW9uLm9wdHMucXVldWUgKS5zdG9wID1cblx0XHRcdFx0XHRyZXN1bHQuc3RvcC5iaW5kKCByZXN1bHQgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXHR9XG5cblx0alF1ZXJ5Lm1hcCggcHJvcHMsIGNyZWF0ZVR3ZWVuLCBhbmltYXRpb24gKTtcblxuXHRpZiAoIGlzRnVuY3Rpb24oIGFuaW1hdGlvbi5vcHRzLnN0YXJ0ICkgKSB7XG5cdFx0YW5pbWF0aW9uLm9wdHMuc3RhcnQuY2FsbCggZWxlbSwgYW5pbWF0aW9uICk7XG5cdH1cblxuXHQvLyBBdHRhY2ggY2FsbGJhY2tzIGZyb20gb3B0aW9uc1xuXHRhbmltYXRpb25cblx0XHQucHJvZ3Jlc3MoIGFuaW1hdGlvbi5vcHRzLnByb2dyZXNzIClcblx0XHQuZG9uZSggYW5pbWF0aW9uLm9wdHMuZG9uZSwgYW5pbWF0aW9uLm9wdHMuY29tcGxldGUgKVxuXHRcdC5mYWlsKCBhbmltYXRpb24ub3B0cy5mYWlsIClcblx0XHQuYWx3YXlzKCBhbmltYXRpb24ub3B0cy5hbHdheXMgKTtcblxuXHRqUXVlcnkuZngudGltZXIoXG5cdFx0alF1ZXJ5LmV4dGVuZCggdGljaywge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdGFuaW06IGFuaW1hdGlvbixcblx0XHRcdHF1ZXVlOiBhbmltYXRpb24ub3B0cy5xdWV1ZVxuXHRcdH0gKVxuXHQpO1xuXG5cdHJldHVybiBhbmltYXRpb247XG59XG5cbmpRdWVyeS5BbmltYXRpb24gPSBqUXVlcnkuZXh0ZW5kKCBBbmltYXRpb24sIHtcblxuXHR0d2VlbmVyczoge1xuXHRcdFwiKlwiOiBbIGZ1bmN0aW9uKCBwcm9wLCB2YWx1ZSApIHtcblx0XHRcdHZhciB0d2VlbiA9IHRoaXMuY3JlYXRlVHdlZW4oIHByb3AsIHZhbHVlICk7XG5cdFx0XHRhZGp1c3RDU1MoIHR3ZWVuLmVsZW0sIHByb3AsIHJjc3NOdW0uZXhlYyggdmFsdWUgKSwgdHdlZW4gKTtcblx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHR9IF1cblx0fSxcblxuXHR0d2VlbmVyOiBmdW5jdGlvbiggcHJvcHMsIGNhbGxiYWNrICkge1xuXHRcdGlmICggaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdGh0bWx3aGl0ZSApO1xuXHRcdH1cblxuXHRcdHZhciBwcm9wLFxuXHRcdFx0aW5kZXggPSAwLFxuXHRcdFx0bGVuZ3RoID0gcHJvcHMubGVuZ3RoO1xuXG5cdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0aXNGdW5jdGlvbiggc3BlZWQgKSAmJiBzcGVlZCxcblx0XHRkdXJhdGlvbjogc3BlZWQsXG5cdFx0ZWFzaW5nOiBmbiAmJiBlYXNpbmcgfHwgZWFzaW5nICYmICFpc0Z1bmN0aW9uKCBlYXNpbmcgKSAmJiBlYXNpbmdcblx0fTtcblxuXHQvLyBHbyB0byB0aGUgZW5kIHN0YXRlIGlmIGZ4IGFyZSBvZmZcblx0aWYgKCBqUXVlcnkuZngub2ZmICkge1xuXHRcdG9wdC5kdXJhdGlvbiA9IDA7XG5cblx0fSBlbHNlIHtcblx0XHRpZiAoIHR5cGVvZiBvcHQuZHVyYXRpb24gIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRpZiAoIG9wdC5kdXJhdGlvbiBpbiBqUXVlcnkuZnguc3BlZWRzICkge1xuXHRcdFx0XHRvcHQuZHVyYXRpb24gPSBqUXVlcnkuZnguc3BlZWRzWyBvcHQuZHVyYXRpb24gXTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0b3B0LmR1cmF0aW9uID0galF1ZXJ5LmZ4LnNwZWVkcy5fZGVmYXVsdDtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBOb3JtYWxpemUgb3B0LnF1ZXVlIC0gdHJ1ZS91bmRlZmluZWQvbnVsbCAtPiBcImZ4XCJcblx0aWYgKCBvcHQucXVldWUgPT0gbnVsbCB8fCBvcHQucXVldWUgPT09IHRydWUgKSB7XG5cdFx0b3B0LnF1ZXVlID0gXCJmeFwiO1xuXHR9XG5cblx0Ly8gUXVldWVpbmdcblx0b3B0Lm9sZCA9IG9wdC5jb21wbGV0ZTtcblxuXHRvcHQuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuV2l0aGluVHJlZSApLmNzcyggXCJvcGFjaXR5XCIsIDAgKS5zaG93KClcblxuXHRcdFx0Ly8gQW5pbWF0ZSB0byB0aGUgdmFsdWUgc3BlY2lmaWVkXG5cdFx0XHQuZW5kKCkuYW5pbWF0ZSggeyBvcGFjaXR5OiB0byB9LCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9LFxuXHRhbmltYXRlOiBmdW5jdGlvbiggcHJvcCwgc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0dmFyIGVtcHR5ID0galF1ZXJ5LmlzRW1wdHlPYmplY3QoIHByb3AgKSxcblx0XHRcdG9wdGFsbCA9IGpRdWVyeS5zcGVlZCggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSxcblx0XHRcdGRvQW5pbWF0aW9uID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0Ly8gT3BlcmF0ZSBvbiBhIGNvcHkgb2YgcHJvcCBzbyBwZXItcHJvcGVydHkgZWFzaW5nIHdvbid0IGJlIGxvc3Rcblx0XHRcdFx0dmFyIGFuaW0gPSBBbmltYXRpb24oIHRoaXMsIGpRdWVyeS5leHRlbmQoIHt9LCBwcm9wICksIG9wdGFsbCApO1xuXG5cdFx0XHRcdC8vIEVtcHR5IGFuaW1hdGlvbnMsIG9yIGZpbmlzaGluZyByZXNvbHZlcyBpbW1lZGlhdGVseVxuXHRcdFx0XHRpZiAoIGVtcHR5IHx8IGRhdGFQcml2LmdldCggdGhpcywgXCJmaW5pc2hcIiApICkge1xuXHRcdFx0XHRcdGFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXHRcdFx0ZG9BbmltYXRpb24uZmluaXNoID0gZG9BbmltYXRpb247XG5cblx0XHRyZXR1cm4gZW1wdHkgfHwgb3B0YWxsLnF1ZXVlID09PSBmYWxzZSA/XG5cdFx0XHR0aGlzLmVhY2goIGRvQW5pbWF0aW9uICkgOlxuXHRcdFx0dGhpcy5xdWV1ZSggb3B0YWxsLnF1ZXVlLCBkb0FuaW1hdGlvbiApO1xuXHR9LFxuXHRzdG9wOiBmdW5jdGlvbiggdHlwZSwgY2xlYXJRdWV1ZSwgZ290b0VuZCApIHtcblx0XHR2YXIgc3RvcFF1ZXVlID0gZnVuY3Rpb24oIGhvb2tzICkge1xuXHRcdFx0dmFyIHN0b3AgPSBob29rcy5zdG9wO1xuXHRcdFx0ZGVsZXRlIGhvb2tzLnN0b3A7XG5cdFx0XHRzdG9wKCBnb3RvRW5kICk7XG5cdFx0fTtcblxuXHRcdGlmICggdHlwZW9mIHR5cGUgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRnb3RvRW5kID0gY2xlYXJRdWV1ZTtcblx0XHRcdGNsZWFyUXVldWUgPSB0eXBlO1xuXHRcdFx0dHlwZSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBjbGVhclF1ZXVlICYmIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dGhpcy5xdWV1ZSggdHlwZSB8fCBcImZ4XCIsIFtdICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZGVxdWV1ZSA9IHRydWUsXG5cdFx0XHRcdGluZGV4ID0gdHlwZSAhPSBudWxsICYmIHR5cGUgKyBcInF1ZXVlSG9va3NcIixcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApO1xuXG5cdFx0XHRpZiAoIGluZGV4ICkge1xuXHRcdFx0XHRpZiAoIGRhdGFbIGluZGV4IF0gJiYgZGF0YVsgaW5kZXggXS5zdG9wICkge1xuXHRcdFx0XHRcdHN0b3BRdWV1ZSggZGF0YVsgaW5kZXggXSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3IgKCBpbmRleCBpbiBkYXRhICkge1xuXHRcdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgJiYgcnJ1bi50ZXN0KCBpbmRleCApICkge1xuXHRcdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoIGluZGV4ID0gdGltZXJzLmxlbmd0aDsgaW5kZXgtLTsgKSB7XG5cdFx0XHRcdGlmICggdGltZXJzWyBpbmRleCBdLmVsZW0gPT09IHRoaXMgJiZcblx0XHRcdFx0XHQoIHR5cGUgPT0gbnVsbCB8fCB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSApIHtcblxuXHRcdFx0XHRcdHRpbWVyc1sgaW5kZXggXS5hbmltLnN0b3AoIGdvdG9FbmQgKTtcblx0XHRcdFx0XHRkZXF1ZXVlID0gZmFsc2U7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdGFydCB0aGUgbmV4dCBpbiB0aGUgcXVldWUgaWYgdGhlIGxhc3Qgc3RlcCB3YXNuJ3QgZm9yY2VkLlxuXHRcdFx0Ly8gVGltZXJzIGN1cnJlbnRseSB3aWxsIGNhbGwgdGhlaXIgY29tcGxldGUgY2FsbGJhY2tzLCB3aGljaFxuXHRcdFx0Ly8gd2lsbCBkZXF1ZXVlIGJ1dCBvbmx5IGlmIHRoZXkgd2VyZSBnb3RvRW5kLlxuXHRcdFx0aWYgKCBkZXF1ZXVlIHx8ICFnb3RvRW5kICkge1xuXHRcdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblx0ZmluaXNoOiBmdW5jdGlvbiggdHlwZSApIHtcblx0XHRpZiAoIHR5cGUgIT09IGZhbHNlICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgXCJmeFwiO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBpbmRleCxcblx0XHRcdFx0ZGF0YSA9IGRhdGFQcml2LmdldCggdGhpcyApLFxuXHRcdFx0XHRxdWV1ZSA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlXCIgXSxcblx0XHRcdFx0aG9va3MgPSBkYXRhWyB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgXSxcblx0XHRcdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycyxcblx0XHRcdFx0bGVuZ3RoID0gcXVldWUgPyBxdWV1ZS5sZW5ndGggOiAwO1xuXG5cdFx0XHQvLyBFbmFibGUgZmluaXNoaW5nIGZsYWcgb24gcHJpdmF0ZSBkYXRhXG5cdFx0XHRkYXRhLmZpbmlzaCA9IHRydWU7XG5cblx0XHRcdC8vIEVtcHR5IHRoZSBxdWV1ZSBmaXJzdFxuXHRcdFx0alF1ZXJ5LnF1ZXVlKCB0aGlzLCB0eXBlLCBbXSApO1xuXG5cdFx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnN0b3AgKSB7XG5cdFx0XHRcdGhvb2tzLnN0b3AuY2FsbCggdGhpcywgdHJ1ZSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYWN0aXZlIGFuaW1hdGlvbnMsIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJiB0aW1lcnNbIGluZGV4IF0ucXVldWUgPT09IHR5cGUgKSB7XG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggdHJ1ZSApO1xuXHRcdFx0XHRcdHRpbWVycy5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gTG9vayBmb3IgYW55IGFuaW1hdGlvbnMgaW4gdGhlIG9sZCBxdWV1ZSBhbmQgZmluaXNoIHRoZW1cblx0XHRcdGZvciAoIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KysgKSB7XG5cdFx0XHRcdGlmICggcXVldWVbIGluZGV4IF0gJiYgcXVldWVbIGluZGV4IF0uZmluaXNoICkge1xuXHRcdFx0XHRcdHF1ZXVlWyBpbmRleCBdLmZpbmlzaC5jYWxsKCB0aGlzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gVHVybiBvZmYgZmluaXNoaW5nIGZsYWdcblx0XHRcdGRlbGV0ZSBkYXRhLmZpbmlzaDtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJ0b2dnbGVcIiwgXCJzaG93XCIsIFwiaGlkZVwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHR2YXIgY3NzRm4gPSBqUXVlcnkuZm5bIG5hbWUgXTtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHNwZWVkID09IG51bGwgfHwgdHlwZW9mIHNwZWVkID09PSBcImJvb2xlYW5cIiA/XG5cdFx0XHRjc3NGbi5hcHBseSggdGhpcywgYXJndW1lbnRzICkgOlxuXHRcdFx0dGhpcy5hbmltYXRlKCBnZW5GeCggbmFtZSwgdHJ1ZSApLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG4vLyBHZW5lcmF0ZSBzaG9ydGN1dHMgZm9yIGN1c3RvbSBhbmltYXRpb25zXG5qUXVlcnkuZWFjaCgge1xuXHRzbGlkZURvd246IGdlbkZ4KCBcInNob3dcIiApLFxuXHRzbGlkZVVwOiBnZW5GeCggXCJoaWRlXCIgKSxcblx0c2xpZGVUb2dnbGU6IGdlbkZ4KCBcInRvZ2dsZVwiICksXG5cdGZhZGVJbjogeyBvcGFjaXR5OiBcInNob3dcIiB9LFxuXHRmYWRlT3V0OiB7IG9wYWNpdHk6IFwiaGlkZVwiIH0sXG5cdGZhZGVUb2dnbGU6IHsgb3BhY2l0eTogXCJ0b2dnbGVcIiB9XG59LCBmdW5jdGlvbiggbmFtZSwgcHJvcHMgKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiB0aGlzLmFuaW1hdGUoIHByb3BzLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkudGltZXJzID0gW107XG5qUXVlcnkuZngudGljayA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgdGltZXIsXG5cdFx0aSA9IDAsXG5cdFx0dGltZXJzID0galF1ZXJ5LnRpbWVycztcblxuXHRmeE5vdyA9IERhdGUubm93KCk7XG5cblx0Zm9yICggOyBpIDwgdGltZXJzLmxlbmd0aDsgaSsrICkge1xuXHRcdHRpbWVyID0gdGltZXJzWyBpIF07XG5cblx0XHQvLyBSdW4gdGhlIHRpbWVyIGFuZCBzYWZlbHkgcmVtb3ZlIGl0IHdoZW4gZG9uZSAoYWxsb3dpbmcgZm9yIGV4dGVybmFsIHJlbW92YWwpXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0alF1ZXJ5LmZ4LnN0YXJ0KCk7XG59O1xuXG5qUXVlcnkuZnguaW50ZXJ2YWwgPSAxMztcbmpRdWVyeS5meC5zdGFydCA9IGZ1bmN0aW9uKCkge1xuXHRpZiAoIGluUHJvZ3Jlc3MgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0aW5Qcm9ncmVzcyA9IHRydWU7XG5cdHNjaGVkdWxlKCk7XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRpblByb2dyZXNzID0gbnVsbDtcbn07XG5cbmpRdWVyeS5meC5zcGVlZHMgPSB7XG5cdHNsb3c6IDYwMCxcblx0ZmFzdDogMjAwLFxuXG5cdC8vIERlZmF1bHQgc3BlZWRcblx0X2RlZmF1bHQ6IDQwMFxufTtcblxuXG4vLyBCYXNlZCBvZmYgb2YgdGhlIHBsdWdpbiBieSBDbGludCBIZWxmZXJzLCB3aXRoIHBlcm1pc3Npb24uXG4vLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxMDAzMjQwMTQ3NDcvaHR0cDovL2JsaW5kc2lnbmFscy5jb20vaW5kZXgucGhwLzIwMDkvMDcvanF1ZXJ5LWRlbGF5L1xualF1ZXJ5LmZuLmRlbGF5ID0gZnVuY3Rpb24oIHRpbWUsIHR5cGUgKSB7XG5cdHRpbWUgPSBqUXVlcnkuZnggPyBqUXVlcnkuZnguc3BlZWRzWyB0aW1lIF0gfHwgdGltZSA6IHRpbWU7XG5cdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRyZXR1cm4gdGhpcy5xdWV1ZSggdHlwZSwgZnVuY3Rpb24oIG5leHQsIGhvb2tzICkge1xuXHRcdHZhciB0aW1lb3V0ID0gd2luZG93LnNldFRpbWVvdXQoIG5leHQsIHRpbWUgKTtcblx0XHRob29rcy5zdG9wID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cdFx0fTtcblx0fSApO1xufTtcblxuXG4oIGZ1bmN0aW9uKCkge1xuXHR2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKSxcblx0XHRzZWxlY3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcInNlbGVjdFwiICksXG5cdFx0b3B0ID0gc2VsZWN0LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcIm9wdGlvblwiICkgKTtcblxuXHRpbnB1dC50eXBlID0gXCJjaGVja2JveFwiO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQgPD00LjMgb25seVxuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIE11c3QgYWNjZXNzIHNlbGVjdGVkSW5kZXggdG8gbWFrZSBkZWZhdWx0IG9wdGlvbnMgc2VsZWN0XG5cdHN1cHBvcnQub3B0U2VsZWN0ZWQgPSBvcHQuc2VsZWN0ZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUUgPD0xMSBvbmx5XG5cdC8vIEFuIGlucHV0IGxvc2VzIGl0cyB2YWx1ZSBhZnRlciBiZWNvbWluZyBhIHJhZGlvXG5cdGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICk7XG5cdGlucHV0LnZhbHVlID0gXCJ0XCI7XG5cdGlucHV0LnR5cGUgPSBcInJhZGlvXCI7XG5cdHN1cHBvcnQucmFkaW9WYWx1ZSA9IGlucHV0LnZhbHVlID09PSBcInRcIjtcbn0gKSgpO1xuXG5cbnZhciBib29sSG9vayxcblx0YXR0ckhhbmRsZSA9IGpRdWVyeS5leHByLmF0dHJIYW5kbGU7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIG5hbWUsIHZhbHVlICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGpRdWVyeS5hdHRyLCBuYW1lLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgKTtcblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggbmFtZSApIHtcblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5yZW1vdmVBdHRyKCB0aGlzLCBuYW1lICk7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0YXR0cjogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBhdHRyaWJ1dGVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRmFsbGJhY2sgdG8gcHJvcCB3aGVuIGF0dHJpYnV0ZXMgYXJlIG5vdCBzdXBwb3J0ZWRcblx0XHRpZiAoIHR5cGVvZiBlbGVtLmdldEF0dHJpYnV0ZSA9PT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdHJldHVybiBqUXVlcnkucHJvcCggZWxlbSwgbmFtZSwgdmFsdWUgKTtcblx0XHR9XG5cblx0XHQvLyBBdHRyaWJ1dGUgaG9va3MgYXJlIGRldGVybWluZWQgYnkgdGhlIGxvd2VyY2FzZSB2ZXJzaW9uXG5cdFx0Ly8gR3JhYiBuZWNlc3NhcnkgaG9vayBpZiBvbmUgaXMgZGVmaW5lZFxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXHRcdFx0aG9va3MgPSBqUXVlcnkuYXR0ckhvb2tzWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRub2RlTmFtZSggZWxlbSwgXCJpbnB1dFwiICkgKSB7XG5cdFx0XHRcdFx0dmFyIHZhbCA9IGVsZW0udmFsdWU7XG5cdFx0XHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIFwidHlwZVwiLCB2YWx1ZSApO1xuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0ZWxlbS52YWx1ZSA9IHZhbDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHZhbHVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHJlbW92ZUF0dHI6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHR2YXIgbmFtZSxcblx0XHRcdGkgPSAwLFxuXG5cdFx0XHQvLyBBdHRyaWJ1dGUgbmFtZXMgY2FuIGNvbnRhaW4gbm9uLUhUTUwgd2hpdGVzcGFjZSBjaGFyYWN0ZXJzXG5cdFx0XHQvLyBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9zeW50YXguaHRtbCNhdHRyaWJ1dGVzLTJcblx0XHRcdGF0dHJOYW1lcyA9IHZhbHVlICYmIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGVsZW0ucmVtb3ZlQXR0cmlidXRlKCBuYW1lICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhvb2tzIGZvciBib29sZWFuIGF0dHJpYnV0ZXNcbmJvb2xIb29rID0ge1xuXHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSwgbmFtZSApIHtcblx0XHRpZiAoIHZhbHVlID09PSBmYWxzZSApIHtcblxuXHRcdFx0Ly8gUmVtb3ZlIGJvb2xlYW4gYXR0cmlidXRlcyB3aGVuIHNldCB0byBmYWxzZVxuXHRcdFx0alF1ZXJ5LnJlbW92ZUF0dHIoIGVsZW0sIG5hbWUgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbS5zZXRBdHRyaWJ1dGUoIG5hbWUsIG5hbWUgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG5hbWU7XG5cdH1cbn07XG5cbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGUsXG5cdFx0XHRsb3dlcmNhc2VOYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdGhhbmRsZSA9IGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXTtcblx0XHRcdGF0dHJIYW5kbGVbIGxvd2VyY2FzZU5hbWUgXSA9IHJldDtcblx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0bG93ZXJjYXNlTmFtZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0XHRhdHRySGFuZGxlWyBsb3dlcmNhc2VOYW1lIF0gPSBoYW5kbGU7XG5cdFx0fVxuXHRcdHJldHVybiByZXQ7XG5cdH07XG59ICk7XG5cblxuXG5cbnZhciByZm9jdXNhYmxlID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmNsaWNrYWJsZSA9IC9eKD86YXxhcmVhKSQvaTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRwcm9wOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgalF1ZXJ5LnByb3AsIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXG5cdHJlbW92ZVByb3A6IGZ1bmN0aW9uKCBuYW1lICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0ZGVsZXRlIHRoaXNbIGpRdWVyeS5wcm9wRml4WyBuYW1lIF0gfHwgbmFtZSBdO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgcHJvcGVydGllcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICggblR5cGUgIT09IDEgfHwgIWpRdWVyeS5pc1hNTERvYyggZWxlbSApICkge1xuXG5cdFx0XHQvLyBGaXggbmFtZSBhbmQgYXR0YWNoIGhvb2tzXG5cdFx0XHRuYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXHRcdFx0aG9va3MgPSBqUXVlcnkucHJvcEhvb2tzWyBuYW1lIF07XG5cdFx0fVxuXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCBob29rcyAmJiBcInNldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3Muc2V0KCBlbGVtLCB2YWx1ZSwgbmFtZSApICkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuICggZWxlbVsgbmFtZSBdID0gdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdO1xuXHR9LFxuXG5cdHByb3BIb29rczoge1xuXHRcdHRhYkluZGV4OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSAtIDExIG9ubHlcblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNDExMTYyMzMzNDcvaHR0cDovL2ZsdWlkcHJvamVjdC5vcmcvYmxvZy8yMDA4LzAxLzA5L2dldHRpbmctc2V0dGluZy1hbmQtcmVtb3ZpbmctdGFiaW5kZXgtdmFsdWVzLXdpdGgtamF2YXNjcmlwdC9cblx0XHRcdFx0Ly8gVXNlIHByb3BlciBhdHRyaWJ1dGUgcmV0cmlldmFsKCMxMjA3Milcblx0XHRcdFx0dmFyIHRhYmluZGV4ID0galF1ZXJ5LmZpbmQuYXR0ciggZWxlbSwgXCJ0YWJpbmRleFwiICk7XG5cblx0XHRcdFx0aWYgKCB0YWJpbmRleCApIHtcblx0XHRcdFx0XHRyZXR1cm4gcGFyc2VJbnQoIHRhYmluZGV4LCAxMCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHJmb2N1c2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApIHx8XG5cdFx0XHRcdFx0cmNsaWNrYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgJiZcblx0XHRcdFx0XHRlbGVtLmhyZWZcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdHByb3BGaXg6IHtcblx0XHRcImZvclwiOiBcImh0bWxGb3JcIixcblx0XHRcImNsYXNzXCI6IFwiY2xhc3NOYW1lXCJcblx0fVxufSApO1xuXG4vLyBTdXBwb3J0OiBJRSA8PTExIG9ubHlcbi8vIEFjY2Vzc2luZyB0aGUgc2VsZWN0ZWRJbmRleCBwcm9wZXJ0eVxuLy8gZm9yY2VzIHRoZSBicm93c2VyIHRvIHJlc3BlY3Qgc2V0dGluZyBzZWxlY3RlZFxuLy8gb24gdGhlIG9wdGlvblxuLy8gVGhlIGdldHRlciBlbnN1cmVzIGEgZGVmYXVsdCBvcHRpb24gaXMgc2VsZWN0ZWRcbi8vIHdoZW4gaW4gYW4gb3B0Z3JvdXBcbi8vIGVzbGludCBydWxlIFwibm8tdW51c2VkLWV4cHJlc3Npb25zXCIgaXMgZGlzYWJsZWQgZm9yIHRoaXMgY29kZVxuLy8gc2luY2UgaXQgY29uc2lkZXJzIHN1Y2ggYWNjZXNzaW9ucyBub29wXG5pZiAoICFzdXBwb3J0Lm9wdFNlbGVjdGVkICkge1xuXHRqUXVlcnkucHJvcEhvb2tzLnNlbGVjdGVkID0ge1xuXHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdC8qIGVzbGludCBuby11bnVzZWQtZXhwcmVzc2lvbnM6IFwib2ZmXCIgKi9cblxuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0XHQvKiBlc2xpbnQgbm8tdW51c2VkLWV4cHJlc3Npb25zOiBcIm9mZlwiICovXG5cblx0XHRcdHZhciBwYXJlbnQgPSBlbGVtLnBhcmVudE5vZGU7XG5cdFx0XHRpZiAoIHBhcmVudCApIHtcblx0XHRcdFx0cGFyZW50LnNlbGVjdGVkSW5kZXg7XG5cblx0XHRcdFx0aWYgKCBwYXJlbnQucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5qUXVlcnkuZWFjaCggW1xuXHRcInRhYkluZGV4XCIsXG5cdFwicmVhZE9ubHlcIixcblx0XCJtYXhMZW5ndGhcIixcblx0XCJjZWxsU3BhY2luZ1wiLFxuXHRcImNlbGxQYWRkaW5nXCIsXG5cdFwicm93U3BhblwiLFxuXHRcImNvbFNwYW5cIixcblx0XCJ1c2VNYXBcIixcblx0XCJmcmFtZUJvcmRlclwiLFxuXHRcImNvbnRlbnRFZGl0YWJsZVwiXG5dLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnByb3BGaXhbIHRoaXMudG9Mb3dlckNhc2UoKSBdID0gdGhpcztcbn0gKTtcblxuXG5cblxuXHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZSBhY2NvcmRpbmcgdG8gSFRNTCBzcGVjXG5cdC8vIGh0dHBzOi8vaW5mcmEuc3BlYy53aGF0d2cub3JnLyNzdHJpcC1hbmQtY29sbGFwc2UtYXNjaWktd2hpdGVzcGFjZVxuXHRmdW5jdGlvbiBzdHJpcEFuZENvbGxhcHNlKCB2YWx1ZSApIHtcblx0XHR2YXIgdG9rZW5zID0gdmFsdWUubWF0Y2goIHJub3RodG1sd2hpdGUgKSB8fCBbXTtcblx0XHRyZXR1cm4gdG9rZW5zLmpvaW4oIFwiIFwiICk7XG5cdH1cblxuXG5mdW5jdGlvbiBnZXRDbGFzcyggZWxlbSApIHtcblx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlICYmIGVsZW0uZ2V0QXR0cmlidXRlKCBcImNsYXNzXCIgKSB8fCBcIlwiO1xufVxuXG5mdW5jdGlvbiBjbGFzc2VzVG9BcnJheSggdmFsdWUgKSB7XG5cdGlmICggQXJyYXkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIHZhbHVlLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgW107XG5cdH1cblx0cmV0dXJuIFtdO1xufVxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGFkZENsYXNzOiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0dmFyIGNsYXNzZXMsIGVsZW0sIGN1ciwgY3VyVmFsdWUsIGNsYXp6LCBqLCBmaW5hbFZhbHVlLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGNsYXNzZXMgPSBjbGFzc2VzVG9BcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggY2xhc3Nlcy5sZW5ndGggKSB7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRoaXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdGN1clZhbHVlID0gZ2V0Q2xhc3MoIGVsZW0gKTtcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggY3VyVmFsdWUgKSArIFwiIFwiICk7XG5cblx0XHRcdFx0aWYgKCBjdXIgKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0d2hpbGUgKCAoIGNsYXp6ID0gY2xhc3Nlc1sgaisrIF0gKSApIHtcblx0XHRcdFx0XHRcdGlmICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApIDwgMCApIHtcblx0XHRcdFx0XHRcdFx0Y3VyICs9IGNsYXp6ICsgXCIgXCI7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGogKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnJlbW92ZUNsYXNzKCB2YWx1ZS5jYWxsKCB0aGlzLCBqLCBnZXRDbGFzcyggdGhpcyApICkgKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cblx0XHRpZiAoICFhcmd1bWVudHMubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXR0ciggXCJjbGFzc1wiLCBcIlwiICk7XG5cdFx0fVxuXG5cdFx0Y2xhc3NlcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0aWYgKCBjbGFzc2VzLmxlbmd0aCApIHtcblx0XHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdFx0Y3VyVmFsdWUgPSBnZXRDbGFzcyggZWxlbSApO1xuXG5cdFx0XHRcdC8vIFRoaXMgZXhwcmVzc2lvbiBpcyBoZXJlIGZvciBiZXR0ZXIgY29tcHJlc3NpYmlsaXR5IChzZWUgYWRkQ2xhc3MpXG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiYgKCBcIiBcIiArIHN0cmlwQW5kQ29sbGFwc2UoIGN1clZhbHVlICkgKyBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0gc3RyaXBBbmRDb2xsYXBzZSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHR0b2dnbGVDbGFzczogZnVuY3Rpb24oIHZhbHVlLCBzdGF0ZVZhbCApIHtcblx0XHR2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZSxcblx0XHRcdGlzVmFsaWRWYWx1ZSA9IHR5cGUgPT09IFwic3RyaW5nXCIgfHwgQXJyYXkuaXNBcnJheSggdmFsdWUgKTtcblxuXHRcdGlmICggdHlwZW9mIHN0YXRlVmFsID09PSBcImJvb2xlYW5cIiAmJiBpc1ZhbGlkVmFsdWUgKSB7XG5cdFx0XHRyZXR1cm4gc3RhdGVWYWwgPyB0aGlzLmFkZENsYXNzKCB2YWx1ZSApIDogdGhpcy5yZW1vdmVDbGFzcyggdmFsdWUgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCBpc1ZhbGlkVmFsdWUgKSB7XG5cblx0XHRcdFx0Ly8gVG9nZ2xlIGluZGl2aWR1YWwgY2xhc3MgbmFtZXNcblx0XHRcdFx0aSA9IDA7XG5cdFx0XHRcdHNlbGYgPSBqUXVlcnkoIHRoaXMgKTtcblx0XHRcdFx0Y2xhc3NOYW1lcyA9IGNsYXNzZXNUb0FycmF5KCB2YWx1ZSApO1xuXG5cdFx0XHRcdHdoaWxlICggKCBjbGFzc05hbWUgPSBjbGFzc05hbWVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdFx0Ly8gQ2hlY2sgZWFjaCBjbGFzc05hbWUgZ2l2ZW4sIHNwYWNlIHNlcGFyYXRlZCBsaXN0XG5cdFx0XHRcdFx0aWYgKCBzZWxmLmhhc0NsYXNzKCBjbGFzc05hbWUgKSApIHtcblx0XHRcdFx0XHRcdHNlbGYucmVtb3ZlQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRzZWxmLmFkZENsYXNzKCBjbGFzc05hbWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0Ly8gVG9nZ2xlIHdob2xlIGNsYXNzIG5hbWVcblx0XHRcdH0gZWxzZSBpZiAoIHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZSA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0XHRcdGNsYXNzTmFtZSA9IGdldENsYXNzKCB0aGlzICk7XG5cdFx0XHRcdGlmICggY2xhc3NOYW1lICkge1xuXG5cdFx0XHRcdFx0Ly8gU3RvcmUgY2xhc3NOYW1lIGlmIHNldFxuXHRcdFx0XHRcdGRhdGFQcml2LnNldCggdGhpcywgXCJfX2NsYXNzTmFtZV9fXCIsIGNsYXNzTmFtZSApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSWYgdGhlIGVsZW1lbnQgaGFzIGEgY2xhc3MgbmFtZSBvciBpZiB3ZSdyZSBwYXNzZWQgYGZhbHNlYCxcblx0XHRcdFx0Ly8gdGhlbiByZW1vdmUgdGhlIHdob2xlIGNsYXNzbmFtZSAoaWYgdGhlcmUgd2FzIG9uZSwgdGhlIGFib3ZlIHNhdmVkIGl0KS5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIGJyaW5nIGJhY2sgd2hhdGV2ZXIgd2FzIHByZXZpb3VzbHkgc2F2ZWQgKGlmIGFueXRoaW5nKSxcblx0XHRcdFx0Ly8gZmFsbGluZyBiYWNrIHRvIHRoZSBlbXB0eSBzdHJpbmcgaWYgbm90aGluZyB3YXMgc3RvcmVkLlxuXHRcdFx0XHRpZiAoIHRoaXMuc2V0QXR0cmlidXRlICkge1xuXHRcdFx0XHRcdHRoaXMuc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsXG5cdFx0XHRcdFx0XHRjbGFzc05hbWUgfHwgdmFsdWUgPT09IGZhbHNlID9cblx0XHRcdFx0XHRcdFwiXCIgOlxuXHRcdFx0XHRcdFx0ZGF0YVByaXYuZ2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiApIHx8IFwiXCJcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdGhhc0NsYXNzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0dmFyIGNsYXNzTmFtZSwgZWxlbSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Y2xhc3NOYW1lID0gXCIgXCIgKyBzZWxlY3RvciArIFwiIFwiO1xuXHRcdHdoaWxlICggKCBlbGVtID0gdGhpc1sgaSsrIF0gKSApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIFwiIFwiICsgc3RyaXBBbmRDb2xsYXBzZSggZ2V0Q2xhc3MoIGVsZW0gKSApICsgXCIgXCIgKS5pbmRleE9mKCBjbGFzc05hbWUgKSA+IC0xICkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZztcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR2YWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgaG9va3MsIHJldCwgdmFsdWVJc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fFxuXHRcdFx0XHRcdGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdFx0aWYgKCBob29rcyAmJlxuXHRcdFx0XHRcdFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkgKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0aWYgKCB0eXBlb2YgcmV0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0XHRcdHJldHVybiByZXQucmVwbGFjZSggcnJldHVybiwgXCJcIiApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gSGFuZGxlIGNhc2VzIHdoZXJlIHZhbHVlIGlzIG51bGwvdW5kZWYgb3IgbnVtYmVyXG5cdFx0XHRcdHJldHVybiByZXQgPT0gbnVsbCA/IFwiXCIgOiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YWx1ZUlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uKCB2YWx1ZSApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHR2YXIgdmFsO1xuXG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWx1ZUlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlLmNhbGwoIHRoaXMsIGksIGpRdWVyeSggdGhpcyApLnZhbCgpICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR2YWwgPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVHJlYXQgbnVsbC91bmRlZmluZWQgYXMgXCJcIjsgY29udmVydCBudW1iZXJzIHRvIHN0cmluZ1xuXHRcdFx0aWYgKCB2YWwgPT0gbnVsbCApIHtcblx0XHRcdFx0dmFsID0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggdHlwZW9mIHZhbCA9PT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0dmFsICs9IFwiXCI7XG5cblx0XHRcdH0gZWxzZSBpZiAoIEFycmF5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidmFsdWVcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsICE9IG51bGwgP1xuXHRcdFx0XHRcdHZhbCA6XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTEwIC0gMTEgb25seVxuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0c3RyaXBBbmRDb2xsYXBzZSggalF1ZXJ5LnRleHQoIGVsZW0gKSApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbiwgaSxcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIsXG5cdFx0XHRcdFx0dmFsdWVzID0gb25lID8gbnVsbCA6IFtdLFxuXHRcdFx0XHRcdG1heCA9IG9uZSA/IGluZGV4ICsgMSA6IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdGlmICggaW5kZXggPCAwICkge1xuXHRcdFx0XHRcdGkgPSBtYXg7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRpID0gb25lID8gaW5kZXggOiAwO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8PTkgb25seVxuXHRcdFx0XHRcdC8vIElFOC05IGRvZXNuJ3QgdXBkYXRlIHNlbGVjdGVkIGFmdGVyIGZvcm0gcmVzZXQgKCMyNTUxKVxuXHRcdFx0XHRcdGlmICggKCBvcHRpb24uc2VsZWN0ZWQgfHwgaSA9PT0gaW5kZXggKSAmJlxuXG5cdFx0XHRcdFx0XHRcdC8vIERvbid0IHJldHVybiBvcHRpb25zIHRoYXQgYXJlIGRpc2FibGVkIG9yIGluIGEgZGlzYWJsZWQgb3B0Z3JvdXBcblx0XHRcdFx0XHRcdFx0IW9wdGlvbi5kaXNhYmxlZCAmJlxuXHRcdFx0XHRcdFx0XHQoICFvcHRpb24ucGFyZW50Tm9kZS5kaXNhYmxlZCB8fFxuXHRcdFx0XHRcdFx0XHRcdCFub2RlTmFtZSggb3B0aW9uLnBhcmVudE5vZGUsIFwib3B0Z3JvdXBcIiApICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBvcHRpb25cblx0XHRcdFx0XHRcdHZhbHVlID0galF1ZXJ5KCBvcHRpb24gKS52YWwoKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2UgZG9uJ3QgbmVlZCBhbiBhcnJheSBmb3Igb25lIHNlbGVjdHNcblx0XHRcdFx0XHRcdGlmICggb25lICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdC8vIE11bHRpLVNlbGVjdHMgcmV0dXJuIGFuIGFycmF5XG5cdFx0XHRcdFx0XHR2YWx1ZXMucHVzaCggdmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fSxcblxuXHRcdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRcdHZhciBvcHRpb25TZXQsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdHZhbHVlcyA9IGpRdWVyeS5tYWtlQXJyYXkoIHZhbHVlICksXG5cdFx0XHRcdFx0aSA9IG9wdGlvbnMubGVuZ3RoO1xuXG5cdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdG9wdGlvbiA9IG9wdGlvbnNbIGkgXTtcblxuXHRcdFx0XHRcdC8qIGVzbGludC1kaXNhYmxlIG5vLWNvbmQtYXNzaWduICovXG5cblx0XHRcdFx0XHRpZiAoIG9wdGlvbi5zZWxlY3RlZCA9XG5cdFx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggalF1ZXJ5LnZhbEhvb2tzLm9wdGlvbi5nZXQoIG9wdGlvbiApLCB2YWx1ZXMgKSA+IC0xXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRvcHRpb25TZXQgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8qIGVzbGludC1lbmFibGUgbm8tY29uZC1hc3NpZ24gKi9cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEZvcmNlIGJyb3dzZXJzIHRvIGJlaGF2ZSBjb25zaXN0ZW50bHkgd2hlbiBub24tbWF0Y2hpbmcgdmFsdWUgaXMgc2V0XG5cdFx0XHRcdGlmICggIW9wdGlvblNldCApIHtcblx0XHRcdFx0XHRlbGVtLnNlbGVjdGVkSW5kZXggPSAtMTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdmFsdWVzO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG4vLyBSYWRpb3MgYW5kIGNoZWNrYm94ZXMgZ2V0dGVyL3NldHRlclxualF1ZXJ5LmVhY2goIFsgXCJyYWRpb1wiLCBcImNoZWNrYm94XCIgXSwgZnVuY3Rpb24oKSB7XG5cdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdID0ge1xuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlICkge1xuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxuc3VwcG9ydC5mb2N1c2luID0gXCJvbmZvY3VzaW5cIiBpbiB3aW5kb3c7XG5cblxudmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLFxuXHRzdG9wUHJvcGFnYXRpb25DYWxsYmFjayA9IGZ1bmN0aW9uKCBlICkge1xuXHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH07XG5cbmpRdWVyeS5leHRlbmQoIGpRdWVyeS5ldmVudCwge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCBldmVudCwgZGF0YSwgZWxlbSwgb25seUhhbmRsZXJzICkge1xuXG5cdFx0dmFyIGksIGN1ciwgdG1wLCBidWJibGVUeXBlLCBvbnR5cGUsIGhhbmRsZSwgc3BlY2lhbCwgbGFzdEVsZW1lbnQsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIFwiLlwiICkgOiBbXTtcblxuXHRcdGN1ciA9IGxhc3RFbGVtZW50ID0gdG1wID0gZWxlbSA9IGVsZW0gfHwgZG9jdW1lbnQ7XG5cblx0XHQvLyBEb24ndCBkbyBldmVudHMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4ICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIGZvY3VzL2JsdXIgbW9ycGhzIHRvIGZvY3VzaW4vb3V0OyBlbnN1cmUgd2UncmUgbm90IGZpcmluZyB0aGVtIHJpZ2h0IG5vd1xuXHRcdGlmICggcmZvY3VzTW9ycGgudGVzdCggdHlwZSArIGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgKSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIHR5cGUuaW5kZXhPZiggXCIuXCIgKSA+IC0xICkge1xuXG5cdFx0XHQvLyBOYW1lc3BhY2VkIHRyaWdnZXI7IGNyZWF0ZSBhIHJlZ2V4cCB0byBtYXRjaCBldmVudCB0eXBlIGluIGhhbmRsZSgpXG5cdFx0XHRuYW1lc3BhY2VzID0gdHlwZS5zcGxpdCggXCIuXCIgKTtcblx0XHRcdHR5cGUgPSBuYW1lc3BhY2VzLnNoaWZ0KCk7XG5cdFx0XHRuYW1lc3BhY2VzLnNvcnQoKTtcblx0XHR9XG5cdFx0b250eXBlID0gdHlwZS5pbmRleE9mKCBcIjpcIiApIDwgMCAmJiBcIm9uXCIgKyB0eXBlO1xuXG5cdFx0Ly8gQ2FsbGVyIGNhbiBwYXNzIGluIGEgalF1ZXJ5LkV2ZW50IG9iamVjdCwgT2JqZWN0LCBvciBqdXN0IGFuIGV2ZW50IHR5cGUgc3RyaW5nXG5cdFx0ZXZlbnQgPSBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSA/XG5cdFx0XHRldmVudCA6XG5cdFx0XHRuZXcgalF1ZXJ5LkV2ZW50KCB0eXBlLCB0eXBlb2YgZXZlbnQgPT09IFwib2JqZWN0XCIgJiYgZXZlbnQgKTtcblxuXHRcdC8vIFRyaWdnZXIgYml0bWFzazogJiAxIGZvciBuYXRpdmUgaGFuZGxlcnM7ICYgMiBmb3IgalF1ZXJ5IChhbHdheXMgdHJ1ZSlcblx0XHRldmVudC5pc1RyaWdnZXIgPSBvbmx5SGFuZGxlcnMgPyAyIDogMztcblx0XHRldmVudC5uYW1lc3BhY2UgPSBuYW1lc3BhY2VzLmpvaW4oIFwiLlwiICk7XG5cdFx0ZXZlbnQucm5hbWVzcGFjZSA9IGV2ZW50Lm5hbWVzcGFjZSA/XG5cdFx0XHRuZXcgUmVnRXhwKCBcIihefFxcXFwuKVwiICsgbmFtZXNwYWNlcy5qb2luKCBcIlxcXFwuKD86LipcXFxcLnwpXCIgKSArIFwiKFxcXFwufCQpXCIgKSA6XG5cdFx0XHRudWxsO1xuXG5cdFx0Ly8gQ2xlYW4gdXAgdGhlIGV2ZW50IGluIGNhc2UgaXQgaXMgYmVpbmcgcmV1c2VkXG5cdFx0ZXZlbnQucmVzdWx0ID0gdW5kZWZpbmVkO1xuXHRcdGlmICggIWV2ZW50LnRhcmdldCApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGVsZW07XG5cdFx0fVxuXG5cdFx0Ly8gQ2xvbmUgYW55IGluY29taW5nIGRhdGEgYW5kIHByZXBlbmQgdGhlIGV2ZW50LCBjcmVhdGluZyB0aGUgaGFuZGxlciBhcmcgbGlzdFxuXHRcdGRhdGEgPSBkYXRhID09IG51bGwgP1xuXHRcdFx0WyBldmVudCBdIDpcblx0XHRcdGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEsIFsgZXZlbnQgXSApO1xuXG5cdFx0Ly8gQWxsb3cgc3BlY2lhbCBldmVudHMgdG8gZHJhdyBvdXRzaWRlIHRoZSBsaW5lc1xuXHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiBzcGVjaWFsLnRyaWdnZXIgJiYgc3BlY2lhbC50cmlnZ2VyLmFwcGx5KCBlbGVtLCBkYXRhICkgPT09IGZhbHNlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIERldGVybWluZSBldmVudCBwcm9wYWdhdGlvbiBwYXRoIGluIGFkdmFuY2UsIHBlciBXM0MgZXZlbnRzIHNwZWMgKCM5OTUxKVxuXHRcdC8vIEJ1YmJsZSB1cCB0byBkb2N1bWVudCwgdGhlbiB0byB3aW5kb3c7IHdhdGNoIGZvciBhIGdsb2JhbCBvd25lckRvY3VtZW50IHZhciAoIzk3MjQpXG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFzcGVjaWFsLm5vQnViYmxlICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRidWJibGVUeXBlID0gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgfHwgdHlwZTtcblx0XHRcdGlmICggIXJmb2N1c01vcnBoLnRlc3QoIGJ1YmJsZVR5cGUgKyB0eXBlICkgKSB7XG5cdFx0XHRcdGN1ciA9IGN1ci5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0Zm9yICggOyBjdXI7IGN1ciA9IGN1ci5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggY3VyICk7XG5cdFx0XHRcdHRtcCA9IGN1cjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT25seSBhZGQgd2luZG93IGlmIHdlIGdvdCB0byBkb2N1bWVudCAoZS5nLiwgbm90IHBsYWluIG9iaiBvciBkZXRhY2hlZCBET00pXG5cdFx0XHRpZiAoIHRtcCA9PT0gKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQgKSApIHtcblx0XHRcdFx0ZXZlbnRQYXRoLnB1c2goIHRtcC5kZWZhdWx0VmlldyB8fCB0bXAucGFyZW50V2luZG93IHx8IHdpbmRvdyApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEZpcmUgaGFuZGxlcnMgb24gdGhlIGV2ZW50IHBhdGhcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggY3VyID0gZXZlbnRQYXRoWyBpKysgXSApICYmICFldmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpICkge1xuXHRcdFx0bGFzdEVsZW1lbnQgPSBjdXI7XG5cdFx0XHRldmVudC50eXBlID0gaSA+IDEgP1xuXHRcdFx0XHRidWJibGVUeXBlIDpcblx0XHRcdFx0c3BlY2lhbC5iaW5kVHlwZSB8fCB0eXBlO1xuXG5cdFx0XHQvLyBqUXVlcnkgaGFuZGxlclxuXHRcdFx0aGFuZGxlID0gKCBkYXRhUHJpdi5nZXQoIGN1ciwgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSAmJlxuXHRcdFx0XHRkYXRhUHJpdi5nZXQoIGN1ciwgXCJoYW5kbGVcIiApO1xuXHRcdFx0aWYgKCBoYW5kbGUgKSB7XG5cdFx0XHRcdGhhbmRsZS5hcHBseSggY3VyLCBkYXRhICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE5hdGl2ZSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSBvbnR5cGUgJiYgY3VyWyBvbnR5cGUgXTtcblx0XHRcdGlmICggaGFuZGxlICYmIGhhbmRsZS5hcHBseSAmJiBhY2NlcHREYXRhKCBjdXIgKSApIHtcblx0XHRcdFx0ZXZlbnQucmVzdWx0ID0gaGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdFx0aWYgKCBldmVudC5yZXN1bHQgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdFx0ZXZlbnQudHlwZSA9IHR5cGU7XG5cblx0XHQvLyBJZiBub2JvZHkgcHJldmVudGVkIHRoZSBkZWZhdWx0IGFjdGlvbiwgZG8gaXQgbm93XG5cdFx0aWYgKCAhb25seUhhbmRsZXJzICYmICFldmVudC5pc0RlZmF1bHRQcmV2ZW50ZWQoKSApIHtcblxuXHRcdFx0aWYgKCAoICFzcGVjaWFsLl9kZWZhdWx0IHx8XG5cdFx0XHRcdHNwZWNpYWwuX2RlZmF1bHQuYXBwbHkoIGV2ZW50UGF0aC5wb3AoKSwgZGF0YSApID09PSBmYWxzZSApICYmXG5cdFx0XHRcdGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblxuXHRcdFx0XHQvLyBDYWxsIGEgbmF0aXZlIERPTSBtZXRob2Qgb24gdGhlIHRhcmdldCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGV2ZW50LlxuXHRcdFx0XHQvLyBEb24ndCBkbyBkZWZhdWx0IGFjdGlvbnMgb24gd2luZG93LCB0aGF0J3Mgd2hlcmUgZ2xvYmFsIHZhcmlhYmxlcyBiZSAoIzYxNzApXG5cdFx0XHRcdGlmICggb250eXBlICYmIGlzRnVuY3Rpb24oIGVsZW1bIHR5cGUgXSApICYmICFpc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblxuXHRcdFx0XHRcdGlmICggZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdFx0XHRcdGxhc3RFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIHN0b3BQcm9wYWdhdGlvbkNhbGxiYWNrICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0ZWxlbVsgdHlwZSBdKCk7XG5cblx0XHRcdFx0XHRpZiAoIGV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cdFx0XHRcdFx0XHRsYXN0RWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCB0eXBlLCBzdG9wUHJvcGFnYXRpb25DYWxsYmFjayApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyZWQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdFx0XHRpZiAoIHRtcCApIHtcblx0XHRcdFx0XHRcdGVsZW1bIG9udHlwZSBdID0gdG1wO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBldmVudC5yZXN1bHQ7XG5cdH0sXG5cblx0Ly8gUGlnZ3liYWNrIG9uIGEgZG9ub3IgZXZlbnQgdG8gc2ltdWxhdGUgYSBkaWZmZXJlbnQgb25lXG5cdC8vIFVzZWQgb25seSBmb3IgYGZvY3VzKGluIHwgb3V0KWAgZXZlbnRzXG5cdHNpbXVsYXRlOiBmdW5jdGlvbiggdHlwZSwgZWxlbSwgZXZlbnQgKSB7XG5cdFx0dmFyIGUgPSBqUXVlcnkuZXh0ZW5kKFxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCgpLFxuXHRcdFx0ZXZlbnQsXG5cdFx0XHR7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdGlzU2ltdWxhdGVkOiB0cnVlXG5cdFx0XHR9XG5cdFx0KTtcblxuXHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBlLCBudWxsLCBlbGVtICk7XG5cdH1cblxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0dHJpZ2dlcjogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgdGhpcyApO1xuXHRcdH0gKTtcblx0fSxcblx0dHJpZ2dlckhhbmRsZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBlbGVtID0gdGhpc1sgMCBdO1xuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHJldHVybiBqUXVlcnkuZXZlbnQudHJpZ2dlciggdHlwZSwgZGF0YSwgZWxlbSwgdHJ1ZSApO1xuXHRcdH1cblx0fVxufSApO1xuXG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggPD00NFxuLy8gRmlyZWZveCBkb2Vzbid0IGhhdmUgZm9jdXMoaW4gfCBvdXQpIGV2ZW50c1xuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02ODc3ODdcbi8vXG4vLyBTdXBwb3J0OiBDaHJvbWUgPD00OCAtIDQ5LCBTYWZhcmkgPD05LjAgLSA5LjFcbi8vIGZvY3VzKGluIHwgb3V0KSBldmVudHMgZmlyZSBhZnRlciBmb2N1cyAmIGJsdXIgZXZlbnRzLFxuLy8gd2hpY2ggaXMgc3BlYyB2aW9sYXRpb24gLSBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2V2ZW50cy1mb2N1c2V2ZW50LWV2ZW50LW9yZGVyXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTQ0OTg1N1xuaWYgKCAhc3VwcG9ydC5mb2N1c2luICkge1xuXHRqUXVlcnkuZWFjaCggeyBmb2N1czogXCJmb2N1c2luXCIsIGJsdXI6IFwiZm9jdXNvdXRcIiB9LCBmdW5jdGlvbiggb3JpZywgZml4ICkge1xuXG5cdFx0Ly8gQXR0YWNoIGEgc2luZ2xlIGNhcHR1cmluZyBoYW5kbGVyIG9uIHRoZSBkb2N1bWVudCB3aGlsZSBzb21lb25lIHdhbnRzIGZvY3VzaW4vZm9jdXNvdXRcblx0XHR2YXIgaGFuZGxlciA9IGZ1bmN0aW9uKCBldmVudCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC5zaW11bGF0ZSggZml4LCBldmVudC50YXJnZXQsIGpRdWVyeS5ldmVudC5maXgoIGV2ZW50ICkgKTtcblx0XHR9O1xuXG5cdFx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGZpeCBdID0ge1xuXHRcdFx0c2V0dXA6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZG9jID0gdGhpcy5vd25lckRvY3VtZW50IHx8IHRoaXMsXG5cdFx0XHRcdFx0YXR0YWNoZXMgPSBkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLmFkZEV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCAoIGF0dGFjaGVzIHx8IDAgKSArIDEgKTtcblx0XHRcdH0sXG5cdFx0XHR0ZWFyZG93bjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKSAtIDE7XG5cblx0XHRcdFx0aWYgKCAhYXR0YWNoZXMgKSB7XG5cdFx0XHRcdFx0ZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoIG9yaWcsIGhhbmRsZXIsIHRydWUgKTtcblx0XHRcdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGRvYywgZml4ICk7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkYXRhUHJpdi5hY2Nlc3MoIGRvYywgZml4LCBhdHRhY2hlcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fSApO1xufVxudmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuXG52YXIgbm9uY2UgPSBEYXRlLm5vdygpO1xuXG52YXIgcnF1ZXJ5ID0gKCAvXFw/LyApO1xuXG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWw7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRSA5IC0gMTEgb25seVxuXHQvLyBJRSB0aHJvd3Mgb24gcGFyc2VGcm9tU3RyaW5nIHdpdGggaW52YWxpZCBpbnB1dC5cblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBBcnJheS5pc0FycmF5KCBvYmogKSApIHtcblxuXHRcdC8vIFNlcmlhbGl6ZSBhcnJheSBpdGVtLlxuXHRcdGpRdWVyeS5lYWNoKCBvYmosIGZ1bmN0aW9uKCBpLCB2ICkge1xuXHRcdFx0aWYgKCB0cmFkaXRpb25hbCB8fCByYnJhY2tldC50ZXN0KCBwcmVmaXggKSApIHtcblxuXHRcdFx0XHQvLyBUcmVhdCBlYWNoIGFycmF5IGl0ZW0gYXMgYSBzY2FsYXIuXG5cdFx0XHRcdGFkZCggcHJlZml4LCB2ICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gSXRlbSBpcyBub24tc2NhbGFyIChhcnJheSBvciBvYmplY3QpLCBlbmNvZGUgaXRzIG51bWVyaWMgaW5kZXguXG5cdFx0XHRcdGJ1aWxkUGFyYW1zKFxuXHRcdFx0XHRcdHByZWZpeCArIFwiW1wiICsgKCB0eXBlb2YgdiA9PT0gXCJvYmplY3RcIiAmJiB2ICE9IG51bGwgPyBpIDogXCJcIiApICsgXCJdXCIsXG5cdFx0XHRcdFx0dixcblx0XHRcdFx0XHR0cmFkaXRpb25hbCxcblx0XHRcdFx0XHRhZGRcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9ICk7XG5cblx0fSBlbHNlIGlmICggIXRyYWRpdGlvbmFsICYmIHRvVHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWVPckZ1bmN0aW9uICkge1xuXG5cdFx0XHQvLyBJZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uLCBpbnZva2UgaXQgYW5kIHVzZSBpdHMgcmV0dXJuIHZhbHVlXG5cdFx0XHR2YXIgdmFsdWUgPSBpc0Z1bmN0aW9uKCB2YWx1ZU9yRnVuY3Rpb24gKSA/XG5cdFx0XHRcdHZhbHVlT3JGdW5jdGlvbigpIDpcblx0XHRcdFx0dmFsdWVPckZ1bmN0aW9uO1xuXG5cdFx0XHRzWyBzLmxlbmd0aCBdID0gZW5jb2RlVVJJQ29tcG9uZW50KCBrZXkgKSArIFwiPVwiICtcblx0XHRcdFx0ZW5jb2RlVVJJQ29tcG9uZW50KCB2YWx1ZSA9PSBudWxsID8gXCJcIiA6IHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIEFycmF5LmlzQXJyYXkoIGEgKSB8fCAoIGEuanF1ZXJ5ICYmICFqUXVlcnkuaXNQbGFpbk9iamVjdCggYSApICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgdGhlIGZvcm0gZWxlbWVudHNcblx0XHRqUXVlcnkuZWFjaCggYSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRhZGQoIHRoaXMubmFtZSwgdGhpcy52YWx1ZSApO1xuXHRcdH0gKTtcblxuXHR9IGVsc2Uge1xuXG5cdFx0Ly8gSWYgdHJhZGl0aW9uYWwsIGVuY29kZSB0aGUgXCJvbGRcIiB3YXkgKHRoZSB3YXkgMS4zLjIgb3Igb2xkZXJcblx0XHQvLyBkaWQgaXQpLCBvdGhlcndpc2UgZW5jb2RlIHBhcmFtcyByZWN1cnNpdmVseS5cblx0XHRmb3IgKCBwcmVmaXggaW4gYSApIHtcblx0XHRcdGJ1aWxkUGFyYW1zKCBwcmVmaXgsIGFbIHByZWZpeCBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmV0dXJuIHRoZSByZXN1bHRpbmcgc2VyaWFsaXphdGlvblxuXHRyZXR1cm4gcy5qb2luKCBcIiZcIiApO1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRzZXJpYWxpemU6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnkucGFyYW0oIHRoaXMuc2VyaWFsaXplQXJyYXkoKSApO1xuXHR9LFxuXHRzZXJpYWxpemVBcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gQ2FuIGFkZCBwcm9wSG9vayBmb3IgXCJlbGVtZW50c1wiIHRvIGZpbHRlciBvciBhZGQgZm9ybSBlbGVtZW50c1xuXHRcdFx0dmFyIGVsZW1lbnRzID0galF1ZXJ5LnByb3AoIHRoaXMsIFwiZWxlbWVudHNcIiApO1xuXHRcdFx0cmV0dXJuIGVsZW1lbnRzID8galF1ZXJ5Lm1ha2VBcnJheSggZWxlbWVudHMgKSA6IHRoaXM7XG5cdFx0fSApXG5cdFx0LmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgdHlwZSA9IHRoaXMudHlwZTtcblxuXHRcdFx0Ly8gVXNlIC5pcyggXCI6ZGlzYWJsZWRcIiApIHNvIHRoYXQgZmllbGRzZXRbZGlzYWJsZWRdIHdvcmtzXG5cdFx0XHRyZXR1cm4gdGhpcy5uYW1lICYmICFqUXVlcnkoIHRoaXMgKS5pcyggXCI6ZGlzYWJsZWRcIiApICYmXG5cdFx0XHRcdHJzdWJtaXR0YWJsZS50ZXN0KCB0aGlzLm5vZGVOYW1lICkgJiYgIXJzdWJtaXR0ZXJUeXBlcy50ZXN0KCB0eXBlICkgJiZcblx0XHRcdFx0KCB0aGlzLmNoZWNrZWQgfHwgIXJjaGVja2FibGVUeXBlLnRlc3QoIHR5cGUgKSApO1xuXHRcdH0gKVxuXHRcdC5tYXAoIGZ1bmN0aW9uKCBpLCBlbGVtICkge1xuXHRcdFx0dmFyIHZhbCA9IGpRdWVyeSggdGhpcyApLnZhbCgpO1xuXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBBcnJheS5pc0FycmF5KCB2YWwgKSApIHtcblx0XHRcdFx0cmV0dXJuIGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRyZXR1cm4geyBuYW1lOiBlbGVtLm5hbWUsIHZhbHVlOiB2YWwucmVwbGFjZSggckNSTEYsIFwiXFxyXFxuXCIgKSB9O1xuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSApLmdldCgpO1xuXHR9XG59ICk7XG5cblxudmFyXG5cdHIyMCA9IC8lMjAvZyxcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJhbnRpQ2FjaGUgPSAvKFs/Jl0pXz1bXiZdKi8sXG5cdHJoZWFkZXJzID0gL14oLio/KTpbIFxcdF0qKFteXFxyXFxuXSopJC9tZyxcblxuXHQvLyAjNzY1MywgIzgxMjUsICM4MTUyOiBsb2NhbCBwcm90b2NvbCBkZXRlY3Rpb25cblx0cmxvY2FsUHJvdG9jb2wgPSAvXig/OmFib3V0fGFwcHxhcHAtc3RvcmFnZXwuKy1leHRlbnNpb258ZmlsZXxyZXN8d2lkZ2V0KTokLyxcblx0cm5vQ29udGVudCA9IC9eKD86R0VUfEhFQUQpJC8sXG5cdHJwcm90b2NvbCA9IC9eXFwvXFwvLyxcblxuXHQvKiBQcmVmaWx0ZXJzXG5cdCAqIDEpIFRoZXkgYXJlIHVzZWZ1bCB0byBpbnRyb2R1Y2UgY3VzdG9tIGRhdGFUeXBlcyAoc2VlIGFqYXgvanNvbnAuanMgZm9yIGFuIGV4YW1wbGUpXG5cdCAqIDIpIFRoZXNlIGFyZSBjYWxsZWQ6XG5cdCAqICAgIC0gQkVGT1JFIGFza2luZyBmb3IgYSB0cmFuc3BvcnRcblx0ICogICAgLSBBRlRFUiBwYXJhbSBzZXJpYWxpemF0aW9uIChzLmRhdGEgaXMgYSBzdHJpbmcgaWYgcy5wcm9jZXNzRGF0YSBpcyB0cnVlKVxuXHQgKiAzKSBrZXkgaXMgdGhlIGRhdGFUeXBlXG5cdCAqIDQpIHRoZSBjYXRjaGFsbCBzeW1ib2wgXCIqXCIgY2FuIGJlIHVzZWRcblx0ICogNSkgZXhlY3V0aW9uIHdpbGwgc3RhcnQgd2l0aCB0cmFuc3BvcnQgZGF0YVR5cGUgYW5kIFRIRU4gY29udGludWUgZG93biB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHByZWZpbHRlcnMgPSB7fSxcblxuXHQvKiBUcmFuc3BvcnRzIGJpbmRpbmdzXG5cdCAqIDEpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogMikgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiAzKSBzZWxlY3Rpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBnbyB0byBcIipcIiBpZiBuZWVkZWRcblx0ICovXG5cdHRyYW5zcG9ydHMgPSB7fSxcblxuXHQvLyBBdm9pZCBjb21tZW50LXByb2xvZyBjaGFyIHNlcXVlbmNlICgjMTAwOTgpOyBtdXN0IGFwcGVhc2UgbGludCBhbmQgZXZhZGUgY29tcHJlc3Npb25cblx0YWxsVHlwZXMgPSBcIiovXCIuY29uY2F0KCBcIipcIiApLFxuXG5cdC8vIEFuY2hvciB0YWcgZm9yIHBhcnNpbmcgdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvcmlnaW5BbmNob3IgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImFcIiApO1xuXHRvcmlnaW5BbmNob3IuaHJlZiA9IGxvY2F0aW9uLmhyZWY7XG5cbi8vIEJhc2UgXCJjb25zdHJ1Y3RvclwiIGZvciBqUXVlcnkuYWpheFByZWZpbHRlciBhbmQgalF1ZXJ5LmFqYXhUcmFuc3BvcnRcbmZ1bmN0aW9uIGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlICkge1xuXG5cdC8vIGRhdGFUeXBlRXhwcmVzc2lvbiBpcyBvcHRpb25hbCBhbmQgZGVmYXVsdHMgdG8gXCIqXCJcblx0cmV0dXJuIGZ1bmN0aW9uKCBkYXRhVHlwZUV4cHJlc3Npb24sIGZ1bmMgKSB7XG5cblx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZUV4cHJlc3Npb24gIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRmdW5jID0gZGF0YVR5cGVFeHByZXNzaW9uO1xuXHRcdFx0ZGF0YVR5cGVFeHByZXNzaW9uID0gXCIqXCI7XG5cdFx0fVxuXG5cdFx0dmFyIGRhdGFUeXBlLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRkYXRhVHlwZXMgPSBkYXRhVHlwZUV4cHJlc3Npb24udG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdGh0bWx3aGl0ZSApIHx8IFtdO1xuXG5cdFx0aWYgKCBpc0Z1bmN0aW9uKCBmdW5jICkgKSB7XG5cblx0XHRcdC8vIEZvciBlYWNoIGRhdGFUeXBlIGluIHRoZSBkYXRhVHlwZUV4cHJlc3Npb25cblx0XHRcdHdoaWxlICggKCBkYXRhVHlwZSA9IGRhdGFUeXBlc1sgaSsrIF0gKSApIHtcblxuXHRcdFx0XHQvLyBQcmVwZW5kIGlmIHJlcXVlc3RlZFxuXHRcdFx0XHRpZiAoIGRhdGFUeXBlWyAwIF0gPT09IFwiK1wiICkge1xuXHRcdFx0XHRcdGRhdGFUeXBlID0gZGF0YVR5cGUuc2xpY2UoIDEgKSB8fCBcIipcIjtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnVuc2hpZnQoIGZ1bmMgKTtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYXBwZW5kXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0KCBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gPSBzdHJ1Y3R1cmVbIGRhdGFUeXBlIF0gfHwgW10gKS5wdXNoKCBmdW5jICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbi8vIEJhc2UgaW5zcGVjdGlvbiBmdW5jdGlvbiBmb3IgcHJlZmlsdGVycyBhbmQgdHJhbnNwb3J0c1xuZnVuY3Rpb24gaW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHN0cnVjdHVyZSwgb3B0aW9ucywgb3JpZ2luYWxPcHRpb25zLCBqcVhIUiApIHtcblxuXHR2YXIgaW5zcGVjdGVkID0ge30sXG5cdFx0c2Vla2luZ1RyYW5zcG9ydCA9ICggc3RydWN0dXJlID09PSB0cmFuc3BvcnRzICk7XG5cblx0ZnVuY3Rpb24gaW5zcGVjdCggZGF0YVR5cGUgKSB7XG5cdFx0dmFyIHNlbGVjdGVkO1xuXHRcdGluc3BlY3RlZFsgZGF0YVR5cGUgXSA9IHRydWU7XG5cdFx0alF1ZXJ5LmVhY2goIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSwgZnVuY3Rpb24oIF8sIHByZWZpbHRlck9yRmFjdG9yeSApIHtcblx0XHRcdHZhciBkYXRhVHlwZU9yVHJhbnNwb3J0ID0gcHJlZmlsdGVyT3JGYWN0b3J5KCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICk7XG5cdFx0XHRpZiAoIHR5cGVvZiBkYXRhVHlwZU9yVHJhbnNwb3J0ID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCFzZWVraW5nVHJhbnNwb3J0ICYmICFpbnNwZWN0ZWRbIGRhdGFUeXBlT3JUcmFuc3BvcnQgXSApIHtcblxuXHRcdFx0XHRvcHRpb25zLmRhdGFUeXBlcy51bnNoaWZ0KCBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHRcdGluc3BlY3QoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fSBlbHNlIGlmICggc2Vla2luZ1RyYW5zcG9ydCApIHtcblx0XHRcdFx0cmV0dXJuICEoIHNlbGVjdGVkID0gZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0XHRyZXR1cm4gc2VsZWN0ZWQ7XG5cdH1cblxuXHRyZXR1cm4gaW5zcGVjdCggb3B0aW9ucy5kYXRhVHlwZXNbIDAgXSApIHx8ICFpbnNwZWN0ZWRbIFwiKlwiIF0gJiYgaW5zcGVjdCggXCIqXCIgKTtcbn1cblxuLy8gQSBzcGVjaWFsIGV4dGVuZCBmb3IgYWpheCBvcHRpb25zXG4vLyB0aGF0IHRha2VzIFwiZmxhdFwiIG9wdGlvbnMgKG5vdCB0byBiZSBkZWVwIGV4dGVuZGVkKVxuLy8gRml4ZXMgIzk4ODdcbmZ1bmN0aW9uIGFqYXhFeHRlbmQoIHRhcmdldCwgc3JjICkge1xuXHR2YXIga2V5LCBkZWVwLFxuXHRcdGZsYXRPcHRpb25zID0galF1ZXJ5LmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9ucyB8fCB7fTtcblxuXHRmb3IgKCBrZXkgaW4gc3JjICkge1xuXHRcdGlmICggc3JjWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0KCBmbGF0T3B0aW9uc1sga2V5IF0gPyB0YXJnZXQgOiAoIGRlZXAgfHwgKCBkZWVwID0ge30gKSApIClbIGtleSBdID0gc3JjWyBrZXkgXTtcblx0XHR9XG5cdH1cblx0aWYgKCBkZWVwICkge1xuXHRcdGpRdWVyeS5leHRlbmQoIHRydWUsIHRhcmdldCwgZGVlcCApO1xuXHR9XG5cblx0cmV0dXJuIHRhcmdldDtcbn1cblxuLyogSGFuZGxlcyByZXNwb25zZXMgdG8gYW4gYWpheCByZXF1ZXN0OlxuICogLSBmaW5kcyB0aGUgcmlnaHQgZGF0YVR5cGUgKG1lZGlhdGVzIGJldHdlZW4gY29udGVudC10eXBlIGFuZCBleHBlY3RlZCBkYXRhVHlwZSlcbiAqIC0gcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuICovXG5mdW5jdGlvbiBhamF4SGFuZGxlUmVzcG9uc2VzKCBzLCBqcVhIUiwgcmVzcG9uc2VzICkge1xuXG5cdHZhciBjdCwgdHlwZSwgZmluYWxEYXRhVHlwZSwgZmlyc3REYXRhVHlwZSxcblx0XHRjb250ZW50cyA9IHMuY29udGVudHMsXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXM7XG5cblx0Ly8gUmVtb3ZlIGF1dG8gZGF0YVR5cGUgYW5kIGdldCBjb250ZW50LXR5cGUgaW4gdGhlIHByb2Nlc3Ncblx0d2hpbGUgKCBkYXRhVHlwZXNbIDAgXSA9PT0gXCIqXCIgKSB7XG5cdFx0ZGF0YVR5cGVzLnNoaWZ0KCk7XG5cdFx0aWYgKCBjdCA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0Y3QgPSBzLm1pbWVUeXBlIHx8IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiICk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgd2UncmUgZGVhbGluZyB3aXRoIGEga25vd24gY29udGVudC10eXBlXG5cdGlmICggY3QgKSB7XG5cdFx0Zm9yICggdHlwZSBpbiBjb250ZW50cyApIHtcblx0XHRcdGlmICggY29udGVudHNbIHR5cGUgXSAmJiBjb250ZW50c1sgdHlwZSBdLnRlc3QoIGN0ICkgKSB7XG5cdFx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCB0eXBlICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgcmVzcG9uc2UgZm9yIHRoZSBleHBlY3RlZCBkYXRhVHlwZVxuXHRpZiAoIGRhdGFUeXBlc1sgMCBdIGluIHJlc3BvbnNlcyApIHtcblx0XHRmaW5hbERhdGFUeXBlID0gZGF0YVR5cGVzWyAwIF07XG5cdH0gZWxzZSB7XG5cblx0XHQvLyBUcnkgY29udmVydGlibGUgZGF0YVR5cGVzXG5cdFx0Zm9yICggdHlwZSBpbiByZXNwb25zZXMgKSB7XG5cdFx0XHRpZiAoICFkYXRhVHlwZXNbIDAgXSB8fCBzLmNvbnZlcnRlcnNbIHR5cGUgKyBcIiBcIiArIGRhdGFUeXBlc1sgMCBdIF0gKSB7XG5cdFx0XHRcdGZpbmFsRGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHRcdGlmICggIWZpcnN0RGF0YVR5cGUgKSB7XG5cdFx0XHRcdGZpcnN0RGF0YVR5cGUgPSB0eXBlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIE9yIGp1c3QgdXNlIGZpcnN0IG9uZVxuXHRcdGZpbmFsRGF0YVR5cGUgPSBmaW5hbERhdGFUeXBlIHx8IGZpcnN0RGF0YVR5cGU7XG5cdH1cblxuXHQvLyBJZiB3ZSBmb3VuZCBhIGRhdGFUeXBlXG5cdC8vIFdlIGFkZCB0aGUgZGF0YVR5cGUgdG8gdGhlIGxpc3QgaWYgbmVlZGVkXG5cdC8vIGFuZCByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgcmVzcG9uc2Vcblx0aWYgKCBmaW5hbERhdGFUeXBlICkge1xuXHRcdGlmICggZmluYWxEYXRhVHlwZSAhPT0gZGF0YVR5cGVzWyAwIF0gKSB7XG5cdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggZmluYWxEYXRhVHlwZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzcG9uc2VzWyBmaW5hbERhdGFUeXBlIF07XG5cdH1cbn1cblxuLyogQ2hhaW4gY29udmVyc2lvbnMgZ2l2ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZSBvcmlnaW5hbCByZXNwb25zZVxuICogQWxzbyBzZXRzIHRoZSByZXNwb25zZVhYWCBmaWVsZHMgb24gdGhlIGpxWEhSIGluc3RhbmNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApIHtcblx0dmFyIGNvbnYyLCBjdXJyZW50LCBjb252LCB0bXAsIHByZXYsXG5cdFx0Y29udmVydGVycyA9IHt9LFxuXG5cdFx0Ly8gV29yayB3aXRoIGEgY29weSBvZiBkYXRhVHlwZXMgaW4gY2FzZSB3ZSBuZWVkIHRvIG1vZGlmeSBpdCBmb3IgY29udmVyc2lvblxuXHRcdGRhdGFUeXBlcyA9IHMuZGF0YVR5cGVzLnNsaWNlKCk7XG5cblx0Ly8gQ3JlYXRlIGNvbnZlcnRlcnMgbWFwIHdpdGggbG93ZXJjYXNlZCBrZXlzXG5cdGlmICggZGF0YVR5cGVzWyAxIF0gKSB7XG5cdFx0Zm9yICggY29udiBpbiBzLmNvbnZlcnRlcnMgKSB7XG5cdFx0XHRjb252ZXJ0ZXJzWyBjb252LnRvTG93ZXJDYXNlKCkgXSA9IHMuY29udmVydGVyc1sgY29udiBdO1xuXHRcdH1cblx0fVxuXG5cdGN1cnJlbnQgPSBkYXRhVHlwZXMuc2hpZnQoKTtcblxuXHQvLyBDb252ZXJ0IHRvIGVhY2ggc2VxdWVudGlhbCBkYXRhVHlwZVxuXHR3aGlsZSAoIGN1cnJlbnQgKSB7XG5cblx0XHRpZiAoIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSApIHtcblx0XHRcdGpxWEhSWyBzLnJlc3BvbnNlRmllbGRzWyBjdXJyZW50IF0gXSA9IHJlc3BvbnNlO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHRoZSBkYXRhRmlsdGVyIGlmIHByb3ZpZGVkXG5cdFx0aWYgKCAhcHJldiAmJiBpc1N1Y2Nlc3MgJiYgcy5kYXRhRmlsdGVyICkge1xuXHRcdFx0cmVzcG9uc2UgPSBzLmRhdGFGaWx0ZXIoIHJlc3BvbnNlLCBzLmRhdGFUeXBlICk7XG5cdFx0fVxuXG5cdFx0cHJldiA9IGN1cnJlbnQ7XG5cdFx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdFx0aWYgKCBjdXJyZW50ICkge1xuXG5cdFx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cblx0XHQvKlxuXHRcdHRpbWVvdXQ6IDAsXG5cdFx0ZGF0YTogbnVsbCxcblx0XHRkYXRhVHlwZTogbnVsbCxcblx0XHR1c2VybmFtZTogbnVsbCxcblx0XHRwYXNzd29yZDogbnVsbCxcblx0XHRjYWNoZTogbnVsbCxcblx0XHR0aHJvd3M6IGZhbHNlLFxuXHRcdHRyYWRpdGlvbmFsOiBmYWxzZSxcblx0XHRoZWFkZXJzOiB7fSxcblx0XHQqL1xuXG5cdFx0YWNjZXB0czoge1xuXHRcdFx0XCIqXCI6IGFsbFR5cGVzLFxuXHRcdFx0dGV4dDogXCJ0ZXh0L3BsYWluXCIsXG5cdFx0XHRodG1sOiBcInRleHQvaHRtbFwiLFxuXHRcdFx0eG1sOiBcImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWxcIixcblx0XHRcdGpzb246IFwiYXBwbGljYXRpb24vanNvbiwgdGV4dC9qYXZhc2NyaXB0XCJcblx0XHR9LFxuXG5cdFx0Y29udGVudHM6IHtcblx0XHRcdHhtbDogL1xcYnhtbFxcYi8sXG5cdFx0XHRodG1sOiAvXFxiaHRtbC8sXG5cdFx0XHRqc29uOiAvXFxianNvblxcYi9cblx0XHR9LFxuXG5cdFx0cmVzcG9uc2VGaWVsZHM6IHtcblx0XHRcdHhtbDogXCJyZXNwb25zZVhNTFwiLFxuXHRcdFx0dGV4dDogXCJyZXNwb25zZVRleHRcIixcblx0XHRcdGpzb246IFwicmVzcG9uc2VKU09OXCJcblx0XHR9LFxuXG5cdFx0Ly8gRGF0YSBjb252ZXJ0ZXJzXG5cdFx0Ly8gS2V5cyBzZXBhcmF0ZSBzb3VyY2UgKG9yIGNhdGNoYWxsIFwiKlwiKSBhbmQgZGVzdGluYXRpb24gdHlwZXMgd2l0aCBhIHNpbmdsZSBzcGFjZVxuXHRcdGNvbnZlcnRlcnM6IHtcblxuXHRcdFx0Ly8gQ29udmVydCBhbnl0aGluZyB0byB0ZXh0XG5cdFx0XHRcIiogdGV4dFwiOiBTdHJpbmcsXG5cblx0XHRcdC8vIFRleHQgdG8gaHRtbCAodHJ1ZSA9IG5vIHRyYW5zZm9ybWF0aW9uKVxuXHRcdFx0XCJ0ZXh0IGh0bWxcIjogdHJ1ZSxcblxuXHRcdFx0Ly8gRXZhbHVhdGUgdGV4dCBhcyBhIGpzb24gZXhwcmVzc2lvblxuXHRcdFx0XCJ0ZXh0IGpzb25cIjogSlNPTi5wYXJzZSxcblxuXHRcdFx0Ly8gUGFyc2UgdGV4dCBhcyB4bWxcblx0XHRcdFwidGV4dCB4bWxcIjogalF1ZXJ5LnBhcnNlWE1MXG5cdFx0fSxcblxuXHRcdC8vIEZvciBvcHRpb25zIHRoYXQgc2hvdWxkbid0IGJlIGRlZXAgZXh0ZW5kZWQ6XG5cdFx0Ly8geW91IGNhbiBhZGQgeW91ciBvd24gY3VzdG9tIG9wdGlvbnMgaGVyZSBpZlxuXHRcdC8vIGFuZCB3aGVuIHlvdSBjcmVhdGUgb25lIHRoYXQgc2hvdWxkbid0IGJlXG5cdFx0Ly8gZGVlcCBleHRlbmRlZCAoc2VlIGFqYXhFeHRlbmQpXG5cdFx0ZmxhdE9wdGlvbnM6IHtcblx0XHRcdHVybDogdHJ1ZSxcblx0XHRcdGNvbnRleHQ6IHRydWVcblx0XHR9XG5cdH0sXG5cblx0Ly8gQ3JlYXRlcyBhIGZ1bGwgZmxlZGdlZCBzZXR0aW5ncyBvYmplY3QgaW50byB0YXJnZXRcblx0Ly8gd2l0aCBib3RoIGFqYXhTZXR0aW5ncyBhbmQgc2V0dGluZ3MgZmllbGRzLlxuXHQvLyBJZiB0YXJnZXQgaXMgb21pdHRlZCwgd3JpdGVzIGludG8gYWpheFNldHRpbmdzLlxuXHRhamF4U2V0dXA6IGZ1bmN0aW9uKCB0YXJnZXQsIHNldHRpbmdzICkge1xuXHRcdHJldHVybiBzZXR0aW5ncyA/XG5cblx0XHRcdC8vIEJ1aWxkaW5nIGEgc2V0dGluZ3Mgb2JqZWN0XG5cdFx0XHRhamF4RXh0ZW5kKCBhamF4RXh0ZW5kKCB0YXJnZXQsIGpRdWVyeS5hamF4U2V0dGluZ3MgKSwgc2V0dGluZ3MgKSA6XG5cblx0XHRcdC8vIEV4dGVuZGluZyBhamF4U2V0dGluZ3Ncblx0XHRcdGFqYXhFeHRlbmQoIGpRdWVyeS5hamF4U2V0dGluZ3MsIHRhcmdldCApO1xuXHR9LFxuXG5cdGFqYXhQcmVmaWx0ZXI6IGFkZFRvUHJlZmlsdGVyc09yVHJhbnNwb3J0cyggcHJlZmlsdGVycyApLFxuXHRhamF4VHJhbnNwb3J0OiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHRyYW5zcG9ydHMgKSxcblxuXHQvLyBNYWluIG1ldGhvZFxuXHRhamF4OiBmdW5jdGlvbiggdXJsLCBvcHRpb25zICkge1xuXG5cdFx0Ly8gSWYgdXJsIGlzIGFuIG9iamVjdCwgc2ltdWxhdGUgcHJlLTEuNSBzaWduYXR1cmVcblx0XHRpZiAoIHR5cGVvZiB1cmwgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0XHRvcHRpb25zID0gdXJsO1xuXHRcdFx0dXJsID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIEZvcmNlIG9wdGlvbnMgdG8gYmUgYW4gb2JqZWN0XG5cdFx0b3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cblx0XHR2YXIgdHJhbnNwb3J0LFxuXG5cdFx0XHQvLyBVUkwgd2l0aG91dCBhbnRpLWNhY2hlIHBhcmFtXG5cdFx0XHRjYWNoZVVSTCxcblxuXHRcdFx0Ly8gUmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nLFxuXHRcdFx0cmVzcG9uc2VIZWFkZXJzLFxuXG5cdFx0XHQvLyB0aW1lb3V0IGhhbmRsZVxuXHRcdFx0dGltZW91dFRpbWVyLFxuXG5cdFx0XHQvLyBVcmwgY2xlYW51cCB2YXJcblx0XHRcdHVybEFuY2hvcixcblxuXHRcdFx0Ly8gUmVxdWVzdCBzdGF0ZSAoYmVjb21lcyBmYWxzZSB1cG9uIHNlbmQgYW5kIHRydWUgdXBvbiBjb21wbGV0aW9uKVxuXHRcdFx0Y29tcGxldGVkLFxuXG5cdFx0XHQvLyBUbyBrbm93IGlmIGdsb2JhbCBldmVudHMgYXJlIHRvIGJlIGRpc3BhdGNoZWRcblx0XHRcdGZpcmVHbG9iYWxzLFxuXG5cdFx0XHQvLyBMb29wIHZhcmlhYmxlXG5cdFx0XHRpLFxuXG5cdFx0XHQvLyB1bmNhY2hlZCBwYXJ0IG9mIHRoZSB1cmxcblx0XHRcdHVuY2FjaGVkLFxuXG5cdFx0XHQvLyBDcmVhdGUgdGhlIGZpbmFsIG9wdGlvbnMgb2JqZWN0XG5cdFx0XHRzID0galF1ZXJ5LmFqYXhTZXR1cCgge30sIG9wdGlvbnMgKSxcblxuXHRcdFx0Ly8gQ2FsbGJhY2tzIGNvbnRleHRcblx0XHRcdGNhbGxiYWNrQ29udGV4dCA9IHMuY29udGV4dCB8fCBzLFxuXG5cdFx0XHQvLyBDb250ZXh0IGZvciBnbG9iYWwgZXZlbnRzIGlzIGNhbGxiYWNrQ29udGV4dCBpZiBpdCBpcyBhIERPTSBub2RlIG9yIGpRdWVyeSBjb2xsZWN0aW9uXG5cdFx0XHRnbG9iYWxFdmVudENvbnRleHQgPSBzLmNvbnRleHQgJiZcblx0XHRcdFx0KCBjYWxsYmFja0NvbnRleHQubm9kZVR5cGUgfHwgY2FsbGJhY2tDb250ZXh0LmpxdWVyeSApID9cblx0XHRcdFx0XHRqUXVlcnkoIGNhbGxiYWNrQ29udGV4dCApIDpcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQsXG5cblx0XHRcdC8vIERlZmVycmVkc1xuXHRcdFx0ZGVmZXJyZWQgPSBqUXVlcnkuRGVmZXJyZWQoKSxcblx0XHRcdGNvbXBsZXRlRGVmZXJyZWQgPSBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSxcblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdHN0YXR1c0NvZGUgPSBzLnN0YXR1c0NvZGUgfHwge30sXG5cblx0XHRcdC8vIEhlYWRlcnMgKHRoZXkgYXJlIHNlbnQgYWxsIGF0IG9uY2UpXG5cdFx0XHRyZXF1ZXN0SGVhZGVycyA9IHt9LFxuXHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lcyA9IHt9LFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICFyZXNwb25zZUhlYWRlcnMgKSB7XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVycyA9IHt9O1xuXHRcdFx0XHRcdFx0XHR3aGlsZSAoICggbWF0Y2ggPSByaGVhZGVycy5leGVjKCByZXNwb25zZUhlYWRlcnNTdHJpbmcgKSApICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSGVhZGVyc1sgbWF0Y2hbIDEgXS50b0xvd2VyQ2FzZSgpIF0gPSBtYXRjaFsgMiBdO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRtYXRjaCA9IHJlc3BvbnNlSGVhZGVyc1sga2V5LnRvTG93ZXJDYXNlKCkgXTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIG1hdGNoID09IG51bGwgPyBudWxsIDogbWF0Y2g7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gUmF3IHN0cmluZ1xuXHRcdFx0XHRnZXRBbGxSZXNwb25zZUhlYWRlcnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdHJldHVybiBjb21wbGV0ZWQgPyByZXNwb25zZUhlYWRlcnNTdHJpbmcgOiBudWxsO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIENhY2hlcyB0aGUgaGVhZGVyXG5cdFx0XHRcdHNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRcdFx0XHRpZiAoIGNvbXBsZXRlZCA9PSBudWxsICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIG5hbWUudG9Mb3dlckNhc2UoKSBdID1cblx0XHRcdFx0XHRcdFx0cmVxdWVzdEhlYWRlcnNOYW1lc1sgbmFtZS50b0xvd2VyQ2FzZSgpIF0gfHwgbmFtZTtcblx0XHRcdFx0XHRcdHJlcXVlc3RIZWFkZXJzWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gT3ZlcnJpZGVzIHJlc3BvbnNlIGNvbnRlbnQtdHlwZSBoZWFkZXJcblx0XHRcdFx0b3ZlcnJpZGVNaW1lVHlwZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRcdHMubWltZVR5cGUgPSB0eXBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0XHRzdGF0dXNDb2RlOiBmdW5jdGlvbiggbWFwICkge1xuXHRcdFx0XHRcdHZhciBjb2RlO1xuXHRcdFx0XHRcdGlmICggbWFwICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrcyBpbiBhIHdheSB0aGF0IHByZXNlcnZlcyBvbGQgb25lc1xuXHRcdFx0XHRcdFx0XHRmb3IgKCBjb2RlIGluIG1hcCApIHtcblx0XHRcdFx0XHRcdFx0XHRzdGF0dXNDb2RlWyBjb2RlIF0gPSBbIHN0YXR1c0NvZGVbIGNvZGUgXSwgbWFwWyBjb2RlIF0gXTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKTtcblxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKVxuXHRcdFx0LnJlcGxhY2UoIHJwcm90b2NvbCwgbG9jYXRpb24ucHJvdG9jb2wgKyBcIi8vXCIgKTtcblxuXHRcdC8vIEFsaWFzIG1ldGhvZCBvcHRpb24gdG8gdHlwZSBhcyBwZXIgdGlja2V0ICMxMjAwNFxuXHRcdHMudHlwZSA9IG9wdGlvbnMubWV0aG9kIHx8IG9wdGlvbnMudHlwZSB8fCBzLm1ldGhvZCB8fCBzLnR5cGU7XG5cblx0XHQvLyBFeHRyYWN0IGRhdGFUeXBlcyBsaXN0XG5cdFx0cy5kYXRhVHlwZXMgPSAoIHMuZGF0YVR5cGUgfHwgXCIqXCIgKS50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90aHRtbHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gdGhlIG9yaWdpbiBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IG9yaWdpbi5cblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHVybEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExLCBFZGdlIDEyIC0gMTVcblx0XHRcdC8vIElFIHRocm93cyBleGNlcHRpb24gb24gYWNjZXNzaW5nIHRoZSBocmVmIHByb3BlcnR5IGlmIHVybCBpcyBtYWxmb3JtZWQsXG5cdFx0XHQvLyBlLmcuIGh0dHA6Ly9leGFtcGxlLmNvbTo4MHgvXG5cdFx0XHR0cnkge1xuXHRcdFx0XHR1cmxBbmNob3IuaHJlZiA9IHMudXJsO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OCAtIDExIG9ubHlcblx0XHRcdFx0Ly8gQW5jaG9yJ3MgaG9zdCBwcm9wZXJ0eSBpc24ndCBjb3JyZWN0bHkgc2V0IHdoZW4gcy51cmwgaXMgcmVsYXRpdmVcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSB1cmxBbmNob3IuaHJlZjtcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IG9yaWdpbkFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIG9yaWdpbkFuY2hvci5ob3N0ICE9PVxuXHRcdFx0XHRcdHVybEFuY2hvci5wcm90b2NvbCArIFwiLy9cIiArIHVybEFuY2hvci5ob3N0O1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYW4gZXJyb3IgcGFyc2luZyB0aGUgVVJMLCBhc3N1bWUgaXQgaXMgY3Jvc3NEb21haW4sXG5cdFx0XHRcdC8vIGl0IGNhbiBiZSByZWplY3RlZCBieSB0aGUgdHJhbnNwb3J0IGlmIGl0IGlzIGludmFsaWRcblx0XHRcdFx0cy5jcm9zc0RvbWFpbiA9IHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBkYXRhIGlmIG5vdCBhbHJlYWR5IGEgc3RyaW5nXG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5wcm9jZXNzRGF0YSAmJiB0eXBlb2Ygcy5kYXRhICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0cy5kYXRhID0galF1ZXJ5LnBhcmFtKCBzLmRhdGEsIHMudHJhZGl0aW9uYWwgKTtcblx0XHR9XG5cblx0XHQvLyBBcHBseSBwcmVmaWx0ZXJzXG5cdFx0aW5zcGVjdFByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMsIHMsIG9wdGlvbnMsIGpxWEhSICk7XG5cblx0XHQvLyBJZiByZXF1ZXN0IHdhcyBhYm9ydGVkIGluc2lkZSBhIHByZWZpbHRlciwgc3RvcCB0aGVyZVxuXHRcdGlmICggY29tcGxldGVkICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Ly8gUmVtb3ZlIGhhc2ggdG8gc2ltcGxpZnkgdXJsIG1hbmlwdWxhdGlvblxuXHRcdGNhY2hlVVJMID0gcy51cmwucmVwbGFjZSggcmhhc2gsIFwiXCIgKTtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgaGFzaCBzbyB3ZSBjYW4gcHV0IGl0IGJhY2tcblx0XHRcdHVuY2FjaGVkID0gcy51cmwuc2xpY2UoIGNhY2hlVVJMLmxlbmd0aCApO1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSBhbmQgc2hvdWxkIGJlIHByb2Nlc3NlZCwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSAmJiAoIHMucHJvY2Vzc0RhdGEgfHwgdHlwZW9mIHMuZGF0YSA9PT0gXCJzdHJpbmdcIiApICkge1xuXHRcdFx0XHRjYWNoZVVSTCArPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgcy5kYXRhO1xuXG5cdFx0XHRcdC8vICM5NjgyOiByZW1vdmUgZGF0YSBzbyB0aGF0IGl0J3Mgbm90IHVzZWQgaW4gYW4gZXZlbnR1YWwgcmV0cnlcblx0XHRcdFx0ZGVsZXRlIHMuZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIG9yIHVwZGF0ZSBhbnRpLWNhY2hlIHBhcmFtIGlmIG5lZWRlZFxuXHRcdFx0aWYgKCBzLmNhY2hlID09PSBmYWxzZSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSBjYWNoZVVSTC5yZXBsYWNlKCByYW50aUNhY2hlLCBcIiQxXCIgKTtcblx0XHRcdFx0dW5jYWNoZWQgPSAoIHJxdWVyeS50ZXN0KCBjYWNoZVVSTCApID8gXCImXCIgOiBcIj9cIiApICsgXCJfPVwiICsgKCBub25jZSsrICkgKyB1bmNhY2hlZDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gUHV0IGhhc2ggYW5kIGFudGktY2FjaGUgb24gdGhlIFVSTCB0aGF0IHdpbGwgYmUgcmVxdWVzdGVkIChnaC0xNzMyKVxuXHRcdFx0cy51cmwgPSBjYWNoZVVSTCArIHVuY2FjaGVkO1xuXG5cdFx0Ly8gQ2hhbmdlICclMjAnIHRvICcrJyBpZiB0aGlzIGlzIGVuY29kZWQgZm9ybSBib2R5IGNvbnRlbnQgKGdoLTI2NTgpXG5cdFx0fSBlbHNlIGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiZcblx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiICkuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICkge1xuXHRcdFx0cy5kYXRhID0gcy5kYXRhLnJlcGxhY2UoIHIyMCwgXCIrXCIgKTtcblx0XHR9XG5cblx0XHQvLyBTZXQgdGhlIElmLU1vZGlmaWVkLVNpbmNlIGFuZC9vciBJZi1Ob25lLU1hdGNoIGhlYWRlciwgaWYgaW4gaWZNb2RpZmllZCBtb2RlLlxuXHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0aWYgKCBqUXVlcnkubGFzdE1vZGlmaWVkWyBjYWNoZVVSTCBdICkge1xuXHRcdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIklmLU1vZGlmaWVkLVNpbmNlXCIsIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKTtcblx0XHRcdH1cblx0XHRcdGlmICggalF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTm9uZS1NYXRjaFwiLCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgY29ycmVjdCBoZWFkZXIsIGlmIGRhdGEgaXMgYmVpbmcgc2VudFxuXHRcdGlmICggcy5kYXRhICYmIHMuaGFzQ29udGVudCAmJiBzLmNvbnRlbnRUeXBlICE9PSBmYWxzZSB8fCBvcHRpb25zLmNvbnRlbnRUeXBlICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJDb250ZW50LVR5cGVcIiwgcy5jb250ZW50VHlwZSApO1xuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgQWNjZXB0cyBoZWFkZXIgZm9yIHRoZSBzZXJ2ZXIsIGRlcGVuZGluZyBvbiB0aGUgZGF0YVR5cGVcblx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKFxuXHRcdFx0XCJBY2NlcHRcIixcblx0XHRcdHMuZGF0YVR5cGVzWyAwIF0gJiYgcy5hY2NlcHRzWyBzLmRhdGFUeXBlc1sgMCBdIF0gP1xuXHRcdFx0XHRzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSArXG5cdFx0XHRcdFx0KCBzLmRhdGFUeXBlc1sgMCBdICE9PSBcIipcIiA/IFwiLCBcIiArIGFsbFR5cGVzICsgXCI7IHE9MC4wMVwiIDogXCJcIiApIDpcblx0XHRcdFx0cy5hY2NlcHRzWyBcIipcIiBdXG5cdFx0KTtcblxuXHRcdC8vIENoZWNrIGZvciBoZWFkZXJzIG9wdGlvblxuXHRcdGZvciAoIGkgaW4gcy5oZWFkZXJzICkge1xuXHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggaSwgcy5oZWFkZXJzWyBpIF0gKTtcblx0XHR9XG5cblx0XHQvLyBBbGxvdyBjdXN0b20gaGVhZGVycy9taW1ldHlwZXMgYW5kIGVhcmx5IGFib3J0XG5cdFx0aWYgKCBzLmJlZm9yZVNlbmQgJiZcblx0XHRcdCggcy5iZWZvcmVTZW5kLmNhbGwoIGNhbGxiYWNrQ29udGV4dCwganFYSFIsIHMgKSA9PT0gZmFsc2UgfHwgY29tcGxldGVkICkgKSB7XG5cblx0XHRcdC8vIEFib3J0IGlmIG5vdCBkb25lIGFscmVhZHkgYW5kIHJldHVyblxuXHRcdFx0cmV0dXJuIGpxWEhSLmFib3J0KCk7XG5cdFx0fVxuXG5cdFx0Ly8gQWJvcnRpbmcgaXMgbm8gbG9uZ2VyIGEgY2FuY2VsbGF0aW9uXG5cdFx0c3RyQWJvcnQgPSBcImFib3J0XCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrcyBvbiBkZWZlcnJlZHNcblx0XHRjb21wbGV0ZURlZmVycmVkLmFkZCggcy5jb21wbGV0ZSApO1xuXHRcdGpxWEhSLmRvbmUoIHMuc3VjY2VzcyApO1xuXHRcdGpxWEhSLmZhaWwoIHMuZXJyb3IgKTtcblxuXHRcdC8vIEdldCB0cmFuc3BvcnRcblx0XHR0cmFuc3BvcnQgPSBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggdHJhbnNwb3J0cywgcywgb3B0aW9ucywganFYSFIgKTtcblxuXHRcdC8vIElmIG5vIHRyYW5zcG9ydCwgd2UgYXV0by1hYm9ydFxuXHRcdGlmICggIXRyYW5zcG9ydCApIHtcblx0XHRcdGRvbmUoIC0xLCBcIk5vIFRyYW5zcG9ydFwiICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSAxO1xuXG5cdFx0XHQvLyBTZW5kIGdsb2JhbCBldmVudFxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheFNlbmRcIiwgWyBqcVhIUiwgcyBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIHJlcXVlc3Qgd2FzIGFib3J0ZWQgaW5zaWRlIGFqYXhTZW5kLCBzdG9wIHRoZXJlXG5cdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaW1lb3V0XG5cdFx0XHRpZiAoIHMuYXN5bmMgJiYgcy50aW1lb3V0ID4gMCApIHtcblx0XHRcdFx0dGltZW91dFRpbWVyID0gd2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGpxWEhSLmFib3J0KCBcInRpbWVvdXRcIiApO1xuXHRcdFx0XHR9LCBzLnRpbWVvdXQgKTtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29tcGxldGVkID0gZmFsc2U7XG5cdFx0XHRcdHRyYW5zcG9ydC5zZW5kKCByZXF1ZXN0SGVhZGVycywgZG9uZSApO1xuXHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0Ly8gUmV0aHJvdyBwb3N0LWNvbXBsZXRpb24gZXhjZXB0aW9uc1xuXHRcdFx0XHRpZiAoIGNvbXBsZXRlZCApIHtcblx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gUHJvcGFnYXRlIG90aGVycyBhcyByZXN1bHRzXG5cdFx0XHRcdGRvbmUoIC0xLCBlICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsbGJhY2sgZm9yIHdoZW4gZXZlcnl0aGluZyBpcyBkb25lXG5cdFx0ZnVuY3Rpb24gZG9uZSggc3RhdHVzLCBuYXRpdmVTdGF0dXNUZXh0LCByZXNwb25zZXMsIGhlYWRlcnMgKSB7XG5cdFx0XHR2YXIgaXNTdWNjZXNzLCBzdWNjZXNzLCBlcnJvciwgcmVzcG9uc2UsIG1vZGlmaWVkLFxuXHRcdFx0XHRzdGF0dXNUZXh0ID0gbmF0aXZlU3RhdHVzVGV4dDtcblxuXHRcdFx0Ly8gSWdub3JlIHJlcGVhdCBpbnZvY2F0aW9uc1xuXHRcdFx0aWYgKCBjb21wbGV0ZWQgKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Y29tcGxldGVkID0gdHJ1ZTtcblxuXHRcdFx0Ly8gQ2xlYXIgdGltZW91dCBpZiBpdCBleGlzdHNcblx0XHRcdGlmICggdGltZW91dFRpbWVyICkge1xuXHRcdFx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KCB0aW1lb3V0VGltZXIgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gRGVyZWZlcmVuY2UgdHJhbnNwb3J0IGZvciBlYXJseSBnYXJiYWdlIGNvbGxlY3Rpb25cblx0XHRcdC8vIChubyBtYXR0ZXIgaG93IGxvbmcgdGhlIGpxWEhSIG9iamVjdCB3aWxsIGJlIHVzZWQpXG5cdFx0XHR0cmFuc3BvcnQgPSB1bmRlZmluZWQ7XG5cblx0XHRcdC8vIENhY2hlIHJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyA9IGhlYWRlcnMgfHwgXCJcIjtcblxuXHRcdFx0Ly8gU2V0IHJlYWR5U3RhdGVcblx0XHRcdGpxWEhSLnJlYWR5U3RhdGUgPSBzdGF0dXMgPiAwID8gNCA6IDA7XG5cblx0XHRcdC8vIERldGVybWluZSBpZiBzdWNjZXNzZnVsXG5cdFx0XHRpc1N1Y2Nlc3MgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCB8fCBzdGF0dXMgPT09IDMwNDtcblxuXHRcdFx0Ly8gR2V0IHJlc3BvbnNlIGRhdGFcblx0XHRcdGlmICggcmVzcG9uc2VzICkge1xuXHRcdFx0XHRyZXNwb25zZSA9IGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ29udmVydCBubyBtYXR0ZXIgd2hhdCAodGhhdCB3YXkgcmVzcG9uc2VYWFggZmllbGRzIGFyZSBhbHdheXMgc2V0KVxuXHRcdFx0cmVzcG9uc2UgPSBhamF4Q29udmVydCggcywgcmVzcG9uc2UsIGpxWEhSLCBpc1N1Y2Nlc3MgKTtcblxuXHRcdFx0Ly8gSWYgc3VjY2Vzc2Z1bCwgaGFuZGxlIHR5cGUgY2hhaW5pbmdcblx0XHRcdGlmICggaXNTdWNjZXNzICkge1xuXG5cdFx0XHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0XHRcdGlmICggcy5pZk1vZGlmaWVkICkge1xuXHRcdFx0XHRcdG1vZGlmaWVkID0ganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiTGFzdC1Nb2RpZmllZFwiICk7XG5cdFx0XHRcdFx0aWYgKCBtb2RpZmllZCApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJldGFnXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5LmV0YWdbIGNhY2hlVVJMIF0gPSBtb2RpZmllZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBpZiBubyBjb250ZW50XG5cdFx0XHRcdGlmICggc3RhdHVzID09PSAyMDQgfHwgcy50eXBlID09PSBcIkhFQURcIiApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub2NvbnRlbnRcIjtcblxuXHRcdFx0XHQvLyBpZiBub3QgbW9kaWZpZWRcblx0XHRcdFx0fSBlbHNlIGlmICggc3RhdHVzID09PSAzMDQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwibm90bW9kaWZpZWRcIjtcblxuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGRhdGEsIGxldCdzIGNvbnZlcnQgaXRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gcmVzcG9uc2Uuc3RhdGU7XG5cdFx0XHRcdFx0c3VjY2VzcyA9IHJlc3BvbnNlLmRhdGE7XG5cdFx0XHRcdFx0ZXJyb3IgPSByZXNwb25zZS5lcnJvcjtcblx0XHRcdFx0XHRpc1N1Y2Nlc3MgPSAhZXJyb3I7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0Ly8gRXh0cmFjdCBlcnJvciBmcm9tIHN0YXR1c1RleHQgYW5kIG5vcm1hbGl6ZSBmb3Igbm9uLWFib3J0c1xuXHRcdFx0XHRlcnJvciA9IHN0YXR1c1RleHQ7XG5cdFx0XHRcdGlmICggc3RhdHVzIHx8ICFzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcImVycm9yXCI7XG5cdFx0XHRcdFx0aWYgKCBzdGF0dXMgPCAwICkge1xuXHRcdFx0XHRcdFx0c3RhdHVzID0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IGRhdGEgZm9yIHRoZSBmYWtlIHhociBvYmplY3Rcblx0XHRcdGpxWEhSLnN0YXR1cyA9IHN0YXR1cztcblx0XHRcdGpxWEhSLnN0YXR1c1RleHQgPSAoIG5hdGl2ZVN0YXR1c1RleHQgfHwgc3RhdHVzVGV4dCApICsgXCJcIjtcblxuXHRcdFx0Ly8gU3VjY2Vzcy9FcnJvclxuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cdFx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsgc3VjY2Vzcywgc3RhdHVzVGV4dCwganFYSFIgXSApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVqZWN0V2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0LCBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRqcVhIUi5zdGF0dXNDb2RlKCBzdGF0dXNDb2RlICk7XG5cdFx0XHRzdGF0dXNDb2RlID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggaXNTdWNjZXNzID8gXCJhamF4U3VjY2Vzc1wiIDogXCJhamF4RXJyb3JcIixcblx0XHRcdFx0XHRbIGpxWEhSLCBzLCBpc1N1Y2Nlc3MgPyBzdWNjZXNzIDogZXJyb3IgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb21wbGV0ZVxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZC5maXJlV2l0aCggY2FsbGJhY2tDb250ZXh0LCBbIGpxWEhSLCBzdGF0dXNUZXh0IF0gKTtcblxuXHRcdFx0aWYgKCBmaXJlR2xvYmFscyApIHtcblx0XHRcdFx0Z2xvYmFsRXZlbnRDb250ZXh0LnRyaWdnZXIoIFwiYWpheENvbXBsZXRlXCIsIFsganFYSFIsIHMgXSApO1xuXG5cdFx0XHRcdC8vIEhhbmRsZSB0aGUgZ2xvYmFsIEFKQVggY291bnRlclxuXHRcdFx0XHRpZiAoICEoIC0talF1ZXJ5LmFjdGl2ZSApICkge1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdG9wXCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBqcVhIUjtcblx0fSxcblxuXHRnZXRKU09OOiBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdldCggdXJsLCBkYXRhLCBjYWxsYmFjaywgXCJqc29uXCIgKTtcblx0fSxcblxuXHRnZXRTY3JpcHQ6IGZ1bmN0aW9uKCB1cmwsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIHVuZGVmaW5lZCwgY2FsbGJhY2ssIFwic2NyaXB0XCIgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcImdldFwiLCBcInBvc3RcIiBdLCBmdW5jdGlvbiggaSwgbWV0aG9kICkge1xuXHRqUXVlcnlbIG1ldGhvZCBdID0gZnVuY3Rpb24oIHVybCwgZGF0YSwgY2FsbGJhY2ssIHR5cGUgKSB7XG5cblx0XHQvLyBTaGlmdCBhcmd1bWVudHMgaWYgZGF0YSBhcmd1bWVudCB3YXMgb21pdHRlZFxuXHRcdGlmICggaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKVxuXHRcdHJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1cmwgKSAmJiB1cmwgKSApO1xuXHR9O1xufSApO1xuXG5cbmpRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRkYXRhVHlwZTogXCJzY3JpcHRcIixcblx0XHRjYWNoZTogdHJ1ZSxcblx0XHRhc3luYzogZmFsc2UsXG5cdFx0Z2xvYmFsOiBmYWxzZSxcblx0XHRcInRocm93c1wiOiB0cnVlXG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXHRcdFx0aWYgKCBpc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRcdGh0bWwgPSBodG1sLmNhbGwoIHRoaXNbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwSW5uZXIoIGh0bWwuY2FsbCggdGhpcywgaSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGpRdWVyeSggdGhpcyApLFxuXHRcdFx0XHRjb250ZW50cyA9IHNlbGYuY29udGVudHMoKTtcblxuXHRcdFx0aWYgKCBjb250ZW50cy5sZW5ndGggKSB7XG5cdFx0XHRcdGNvbnRlbnRzLndyYXBBbGwoIGh0bWwgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0c2VsZi5hcHBlbmQoIGh0bWwgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0d3JhcDogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0dmFyIGh0bWxJc0Z1bmN0aW9uID0gaXNGdW5jdGlvbiggaHRtbCApO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oIGkgKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sSXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR0aGlzLnBhcmVudCggc2VsZWN0b3IgKS5ub3QoIFwiYm9keVwiICkuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0fSApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5wc2V1ZG9zLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICEhKCBlbGVtLm9mZnNldFdpZHRoIHx8IGVsZW0ub2Zmc2V0SGVpZ2h0IHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggKTtcbn07XG5cblxuXG5cbmpRdWVyeS5hamF4U2V0dGluZ3MueGhyID0gZnVuY3Rpb24oKSB7XG5cdHRyeSB7XG5cdFx0cmV0dXJuIG5ldyB3aW5kb3cuWE1MSHR0cFJlcXVlc3QoKTtcblx0fSBjYXRjaCAoIGUgKSB7fVxufTtcblxudmFyIHhoclN1Y2Nlc3NTdGF0dXMgPSB7XG5cblx0XHQvLyBGaWxlIHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIGNvZGUgMCwgYXNzdW1lIDIwMFxuXHRcdDA6IDIwMCxcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnRpbWVvdXQgPVxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG51bGw7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlID09PSBcImFib3J0XCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0eGhyLmFib3J0KCk7XG5cdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIHR5cGUgPT09IFwiZXJyb3JcIiApIHtcblxuXHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gT24gYSBtYW51YWwgbmF0aXZlIGFib3J0LCBJRTkgdGhyb3dzXG5cdFx0XHRcdFx0XHRcdFx0Ly8gZXJyb3JzIG9uIGFueSBwcm9wZXJ0eSBhY2Nlc3MgdGhhdCBpcyBub3QgcmVhZHlTdGF0ZVxuXHRcdFx0XHRcdFx0XHRcdGlmICggdHlwZW9mIHhoci5zdGF0dXMgIT09IFwibnVtYmVyXCIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZSggMCwgXCJlcnJvclwiICk7XG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC8vIEZpbGU6IHByb3RvY29sIGFsd2F5cyB5aWVsZHMgc3RhdHVzIDA7IHNlZSAjODYwNSwgIzE0MjA3XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHhoci5zdGF0dXNUZXh0XG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRjb21wbGV0ZShcblx0XHRcdFx0XHRcdFx0XHRcdHhoclN1Y2Nlc3NTdGF0dXNbIHhoci5zdGF0dXMgXSB8fCB4aHIuc3RhdHVzLFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHQsXG5cblx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw9OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBJRTkgaGFzIG5vIFhIUjIgYnV0IHRocm93cyBvbiBiaW5hcnkgKHRyYWMtMTE0MjYpXG5cdFx0XHRcdFx0XHRcdFx0XHQvLyBGb3IgWEhSMiBub24tdGV4dCwgbGV0IHRoZSBjYWxsZXIgaGFuZGxlIGl0IChnaC0yNDk4KVxuXHRcdFx0XHRcdFx0XHRcdFx0KCB4aHIucmVzcG9uc2VUeXBlIHx8IFwidGV4dFwiICkgIT09IFwidGV4dFwiICB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0dHlwZW9mIHhoci5yZXNwb25zZVRleHQgIT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IGJpbmFyeTogeGhyLnJlc3BvbnNlIH0gOlxuXHRcdFx0XHRcdFx0XHRcdFx0XHR7IHRleHQ6IHhoci5yZXNwb25zZVRleHQgfSxcblx0XHRcdFx0XHRcdFx0XHRcdHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKVxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdC8vIExpc3RlbiB0byBldmVudHNcblx0XHRcdFx0eGhyLm9ubG9hZCA9IGNhbGxiYWNrKCk7XG5cdFx0XHRcdGVycm9yQ2FsbGJhY2sgPSB4aHIub25lcnJvciA9IHhoci5vbnRpbWVvdXQgPSBjYWxsYmFjayggXCJlcnJvclwiICk7XG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgOSBvbmx5XG5cdFx0XHRcdC8vIFVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UgdG8gcmVwbGFjZSBvbmFib3J0XG5cdFx0XHRcdC8vIHRvIGhhbmRsZSB1bmNhdWdodCBhYm9ydHNcblx0XHRcdFx0aWYgKCB4aHIub25hYm9ydCAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHhoci5vbmFib3J0ID0gZXJyb3JDYWxsYmFjaztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHRcdC8vIENoZWNrIHJlYWR5U3RhdGUgYmVmb3JlIHRpbWVvdXQgYXMgaXQgY2hhbmdlc1xuXHRcdFx0XHRcdFx0aWYgKCB4aHIucmVhZHlTdGF0ZSA9PT0gNCApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBBbGxvdyBvbmVycm9yIHRvIGJlIGNhbGxlZCBmaXJzdCxcblx0XHRcdFx0XHRcdFx0Ly8gYnV0IHRoYXQgd2lsbCBub3QgaGFuZGxlIGEgbmF0aXZlIGFib3J0XG5cdFx0XHRcdFx0XHRcdC8vIEFsc28sIHNhdmUgZXJyb3JDYWxsYmFjayB0byBhIHZhcmlhYmxlXG5cdFx0XHRcdFx0XHRcdC8vIGFzIHhoci5vbmVycm9yIGNhbm5vdCBiZSBhY2Nlc3NlZFxuXHRcdFx0XHRcdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGVycm9yQ2FsbGJhY2soKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQ3JlYXRlIHRoZSBhYm9ydCBjYWxsYmFja1xuXHRcdFx0XHRjYWxsYmFjayA9IGNhbGxiYWNrKCBcImFib3J0XCIgKTtcblxuXHRcdFx0XHR0cnkge1xuXG5cdFx0XHRcdFx0Ly8gRG8gc2VuZCB0aGUgcmVxdWVzdCAodGhpcyBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uKVxuXHRcdFx0XHRcdHhoci5zZW5kKCBvcHRpb25zLmhhc0NvbnRlbnQgJiYgb3B0aW9ucy5kYXRhIHx8IG51bGwgKTtcblx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cblx0XHRcdFx0XHQvLyAjMTQ2ODM6IE9ubHkgcmV0aHJvdyBpZiB0aGlzIGhhc24ndCBiZWVuIG5vdGlmaWVkIGFzIGFuIGVycm9yIHlldFxuXHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSxcblxuXHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFByZXZlbnQgYXV0by1leGVjdXRpb24gb2Ygc2NyaXB0cyB3aGVuIG5vIGV4cGxpY2l0IGRhdGFUeXBlIHdhcyBwcm92aWRlZCAoU2VlIGdoLTI0MzIpXG5qUXVlcnkuYWpheFByZWZpbHRlciggZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLmNvbnRlbnRzLnNjcmlwdCA9IGZhbHNlO1xuXHR9XG59ICk7XG5cbi8vIEluc3RhbGwgc2NyaXB0IGRhdGFUeXBlXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGFjY2VwdHM6IHtcblx0XHRzY3JpcHQ6IFwidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBcIiArXG5cdFx0XHRcImFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdFwiXG5cdH0sXG5cdGNvbnRlbnRzOiB7XG5cdFx0c2NyaXB0OiAvXFxiKD86amF2YXxlY21hKXNjcmlwdFxcYi9cblx0fSxcblx0Y29udmVydGVyczoge1xuXHRcdFwidGV4dCBzY3JpcHRcIjogZnVuY3Rpb24oIHRleHQgKSB7XG5cdFx0XHRqUXVlcnkuZ2xvYmFsRXZhbCggdGV4dCApO1xuXHRcdFx0cmV0dXJuIHRleHQ7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIEhhbmRsZSBjYWNoZSdzIHNwZWNpYWwgY2FzZSBhbmQgY3Jvc3NEb21haW5cbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblx0aWYgKCBzLmNhY2hlID09PSB1bmRlZmluZWQgKSB7XG5cdFx0cy5jYWNoZSA9IGZhbHNlO1xuXHR9XG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHRzLnR5cGUgPSBcIkdFVFwiO1xuXHR9XG59ICk7XG5cbi8vIEJpbmQgc2NyaXB0IHRhZyBoYWNrIHRyYW5zcG9ydFxualF1ZXJ5LmFqYXhUcmFuc3BvcnQoIFwic2NyaXB0XCIsIGZ1bmN0aW9uKCBzICkge1xuXG5cdC8vIFRoaXMgdHJhbnNwb3J0IG9ubHkgZGVhbHMgd2l0aCBjcm9zcyBkb21haW4gcmVxdWVzdHNcblx0aWYgKCBzLmNyb3NzRG9tYWluICkge1xuXHRcdHZhciBzY3JpcHQsIGNhbGxiYWNrO1xuXHRcdHJldHVybiB7XG5cdFx0XHRzZW5kOiBmdW5jdGlvbiggXywgY29tcGxldGUgKSB7XG5cdFx0XHRcdHNjcmlwdCA9IGpRdWVyeSggXCI8c2NyaXB0PlwiICkucHJvcCgge1xuXHRcdFx0XHRcdGNoYXJzZXQ6IHMuc2NyaXB0Q2hhcnNldCxcblx0XHRcdFx0XHRzcmM6IHMudXJsXG5cdFx0XHRcdH0gKS5vbihcblx0XHRcdFx0XHRcImxvYWQgZXJyb3JcIixcblx0XHRcdFx0XHRjYWxsYmFjayA9IGZ1bmN0aW9uKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRzY3JpcHQucmVtb3ZlKCk7XG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9IG51bGw7XG5cdFx0XHRcdFx0XHRpZiAoIGV2dCApIHtcblx0XHRcdFx0XHRcdFx0Y29tcGxldGUoIGV2dC50eXBlID09PSBcImVycm9yXCIgPyA0MDQgOiAyMDAsIGV2dC50eXBlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIFVzZSBuYXRpdmUgRE9NIG1hbmlwdWxhdGlvbiB0byBhdm9pZCBvdXIgZG9tTWFuaXAgQUpBWCB0cmlja2VyeVxuXHRcdFx0XHRkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCBzY3JpcHRbIDAgXSApO1xuXHRcdFx0fSxcblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgb2xkQ2FsbGJhY2tzID0gW10sXG5cdHJqc29ucCA9IC8oPSlcXD8oPz0mfCQpfFxcP1xcPy87XG5cbi8vIERlZmF1bHQganNvbnAgc2V0dGluZ3NcbmpRdWVyeS5hamF4U2V0dXAoIHtcblx0anNvbnA6IFwiY2FsbGJhY2tcIixcblx0anNvbnBDYWxsYmFjazogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGNhbGxiYWNrID0gb2xkQ2FsbGJhY2tzLnBvcCgpIHx8ICggalF1ZXJ5LmV4cGFuZG8gKyBcIl9cIiArICggbm9uY2UrKyApICk7XG5cdFx0dGhpc1sgY2FsbGJhY2sgXSA9IHRydWU7XG5cdFx0cmV0dXJuIGNhbGxiYWNrO1xuXHR9XG59ICk7XG5cbi8vIERldGVjdCwgbm9ybWFsaXplIG9wdGlvbnMgYW5kIGluc3RhbGwgY2FsbGJhY2tzIGZvciBqc29ucCByZXF1ZXN0c1xualF1ZXJ5LmFqYXhQcmVmaWx0ZXIoIFwianNvbiBqc29ucFwiLCBmdW5jdGlvbiggcywgb3JpZ2luYWxTZXR0aW5ncywganFYSFIgKSB7XG5cblx0dmFyIGNhbGxiYWNrTmFtZSwgb3ZlcndyaXR0ZW4sIHJlc3BvbnNlQ29udGFpbmVyLFxuXHRcdGpzb25Qcm9wID0gcy5qc29ucCAhPT0gZmFsc2UgJiYgKCByanNvbnAudGVzdCggcy51cmwgKSA/XG5cdFx0XHRcInVybFwiIDpcblx0XHRcdHR5cGVvZiBzLmRhdGEgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0KCBzLmNvbnRlbnRUeXBlIHx8IFwiXCIgKVxuXHRcdFx0XHRcdC5pbmRleE9mKCBcImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZFwiICkgPT09IDAgJiZcblx0XHRcdFx0cmpzb25wLnRlc3QoIHMuZGF0YSApICYmIFwiZGF0YVwiXG5cdFx0KTtcblxuXHQvLyBIYW5kbGUgaWZmIHRoZSBleHBlY3RlZCBkYXRhIHR5cGUgaXMgXCJqc29ucFwiIG9yIHdlIGhhdmUgYSBwYXJhbWV0ZXIgdG8gc2V0XG5cdGlmICgganNvblByb3AgfHwgcy5kYXRhVHlwZXNbIDAgXSA9PT0gXCJqc29ucFwiICkge1xuXG5cdFx0Ly8gR2V0IGNhbGxiYWNrIG5hbWUsIHJlbWVtYmVyaW5nIHByZWV4aXN0aW5nIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBpdFxuXHRcdGNhbGxiYWNrTmFtZSA9IHMuanNvbnBDYWxsYmFjayA9IGlzRnVuY3Rpb24oIHMuanNvbnBDYWxsYmFjayApID9cblx0XHRcdHMuanNvbnBDYWxsYmFjaygpIDpcblx0XHRcdHMuanNvbnBDYWxsYmFjaztcblxuXHRcdC8vIEluc2VydCBjYWxsYmFjayBpbnRvIHVybCBvciBmb3JtIGRhdGFcblx0XHRpZiAoIGpzb25Qcm9wICkge1xuXHRcdFx0c1sganNvblByb3AgXSA9IHNbIGpzb25Qcm9wIF0ucmVwbGFjZSggcmpzb25wLCBcIiQxXCIgKyBjYWxsYmFja05hbWUgKTtcblx0XHR9IGVsc2UgaWYgKCBzLmpzb25wICE9PSBmYWxzZSApIHtcblx0XHRcdHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIHMudXJsICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmpzb25wICsgXCI9XCIgKyBjYWxsYmFja05hbWU7XG5cdFx0fVxuXG5cdFx0Ly8gVXNlIGRhdGEgY29udmVydGVyIHRvIHJldHJpZXZlIGpzb24gYWZ0ZXIgc2NyaXB0IGV4ZWN1dGlvblxuXHRcdHMuY29udmVydGVyc1sgXCJzY3JpcHQganNvblwiIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdGlmICggIXJlc3BvbnNlQ29udGFpbmVyICkge1xuXHRcdFx0XHRqUXVlcnkuZXJyb3IoIGNhbGxiYWNrTmFtZSArIFwiIHdhcyBub3QgY2FsbGVkXCIgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZXNwb25zZUNvbnRhaW5lclsgMCBdO1xuXHRcdH07XG5cblx0XHQvLyBGb3JjZSBqc29uIGRhdGFUeXBlXG5cdFx0cy5kYXRhVHlwZXNbIDAgXSA9IFwianNvblwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja1xuXHRcdG92ZXJ3cml0dGVuID0gd2luZG93WyBjYWxsYmFja05hbWUgXTtcblx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IGFyZ3VtZW50cztcblx0XHR9O1xuXG5cdFx0Ly8gQ2xlYW4tdXAgZnVuY3Rpb24gKGZpcmVzIGFmdGVyIGNvbnZlcnRlcnMpXG5cdFx0anFYSFIuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgdmFsdWUgZGlkbid0IGV4aXN0IC0gcmVtb3ZlIGl0XG5cdFx0XHRpZiAoIG92ZXJ3cml0dGVuID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdGpRdWVyeSggd2luZG93ICkucmVtb3ZlUHJvcCggY2FsbGJhY2tOYW1lICk7XG5cblx0XHRcdC8vIE90aGVyd2lzZSByZXN0b3JlIHByZWV4aXN0aW5nIHZhbHVlXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aW5kb3dbIGNhbGxiYWNrTmFtZSBdID0gb3ZlcndyaXR0ZW47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFNhdmUgYmFjayBhcyBmcmVlXG5cdFx0XHRpZiAoIHNbIGNhbGxiYWNrTmFtZSBdICkge1xuXG5cdFx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHJlLXVzaW5nIHRoZSBvcHRpb25zIGRvZXNuJ3Qgc2NyZXcgdGhpbmdzIGFyb3VuZFxuXHRcdFx0XHRzLmpzb25wQ2FsbGJhY2sgPSBvcmlnaW5hbFNldHRpbmdzLmpzb25wQ2FsbGJhY2s7XG5cblx0XHRcdFx0Ly8gU2F2ZSB0aGUgY2FsbGJhY2sgbmFtZSBmb3IgZnV0dXJlIHVzZVxuXHRcdFx0XHRvbGRDYWxsYmFja3MucHVzaCggY2FsbGJhY2tOYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENhbGwgaWYgaXQgd2FzIGEgZnVuY3Rpb24gYW5kIHdlIGhhdmUgYSByZXNwb25zZVxuXHRcdFx0aWYgKCByZXNwb25zZUNvbnRhaW5lciAmJiBpc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0gKTtcblxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxuXHRcdHJldHVybiBcInNjcmlwdFwiO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIFN1cHBvcnQ6IFNhZmFyaSA4IG9ubHlcbi8vIEluIFNhZmFyaSA4IGRvY3VtZW50cyBjcmVhdGVkIHZpYSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnRcbi8vIGNvbGxhcHNlIHNpYmxpbmcgZm9ybXM6IHRoZSBzZWNvbmQgb25lIGJlY29tZXMgYSBjaGlsZCBvZiB0aGUgZmlyc3Qgb25lLlxuLy8gQmVjYXVzZSBvZiB0aGF0LCB0aGlzIHNlY3VyaXR5IG1lYXN1cmUgaGFzIHRvIGJlIGRpc2FibGVkIGluIFNhZmFyaSA4LlxuLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNzMzN1xuc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgPSAoIGZ1bmN0aW9uKCkge1xuXHR2YXIgYm9keSA9IGRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCggXCJcIiApLmJvZHk7XG5cdGJvZHkuaW5uZXJIVE1MID0gXCI8Zm9ybT48L2Zvcm0+PGZvcm0+PC9mb3JtPlwiO1xuXHRyZXR1cm4gYm9keS5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMjtcbn0gKSgpO1xuXG5cbi8vIEFyZ3VtZW50IFwiZGF0YVwiIHNob3VsZCBiZSBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cdGlmICggdHlwZW9mIGNvbnRleHQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGtlZXBTY3JpcHRzID0gY29udGV4dDtcblx0XHRjb250ZXh0ID0gZmFsc2U7XG5cdH1cblxuXHR2YXIgYmFzZSwgcGFyc2VkLCBzY3JpcHRzO1xuXG5cdGlmICggIWNvbnRleHQgKSB7XG5cblx0XHQvLyBTdG9wIHNjcmlwdHMgb3IgaW5saW5lIGV2ZW50IGhhbmRsZXJzIGZyb20gYmVpbmcgZXhlY3V0ZWQgaW1tZWRpYXRlbHlcblx0XHQvLyBieSB1c2luZyBkb2N1bWVudC5pbXBsZW1lbnRhdGlvblxuXHRcdGlmICggc3VwcG9ydC5jcmVhdGVIVE1MRG9jdW1lbnQgKSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCBcIlwiICk7XG5cblx0XHRcdC8vIFNldCB0aGUgYmFzZSBocmVmIGZvciB0aGUgY3JlYXRlZCBkb2N1bWVudFxuXHRcdFx0Ly8gc28gYW55IHBhcnNlZCBlbGVtZW50cyB3aXRoIFVSTHNcblx0XHRcdC8vIGFyZSBiYXNlZCBvbiB0aGUgZG9jdW1lbnQncyBVUkwgKGdoLTI5NjUpXG5cdFx0XHRiYXNlID0gY29udGV4dC5jcmVhdGVFbGVtZW50KCBcImJhc2VcIiApO1xuXHRcdFx0YmFzZS5ocmVmID0gZG9jdW1lbnQubG9jYXRpb24uaHJlZjtcblx0XHRcdGNvbnRleHQuaGVhZC5hcHBlbmRDaGlsZCggYmFzZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb250ZXh0ID0gZG9jdW1lbnQ7XG5cdFx0fVxuXHR9XG5cblx0cGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICk7XG5cdHNjcmlwdHMgPSAha2VlcFNjcmlwdHMgJiYgW107XG5cblx0Ly8gU2luZ2xlIHRhZ1xuXHRpZiAoIHBhcnNlZCApIHtcblx0XHRyZXR1cm4gWyBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIHBhcnNlZFsgMSBdICkgXTtcblx0fVxuXG5cdHBhcnNlZCA9IGJ1aWxkRnJhZ21lbnQoIFsgZGF0YSBdLCBjb250ZXh0LCBzY3JpcHRzICk7XG5cblx0aWYgKCBzY3JpcHRzICYmIHNjcmlwdHMubGVuZ3RoICkge1xuXHRcdGpRdWVyeSggc2NyaXB0cyApLnJlbW92ZSgpO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5tZXJnZSggW10sIHBhcnNlZC5jaGlsZE5vZGVzICk7XG59O1xuXG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdHZhciBzZWxlY3RvciwgdHlwZSwgcmVzcG9uc2UsXG5cdFx0c2VsZiA9IHRoaXMsXG5cdFx0b2ZmID0gdXJsLmluZGV4T2YoIFwiIFwiICk7XG5cblx0aWYgKCBvZmYgPiAtMSApIHtcblx0XHRzZWxlY3RvciA9IHN0cmlwQW5kQ29sbGFwc2UoIHVybC5zbGljZSggb2ZmICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggaXNGdW5jdGlvbiggcGFyYW1zICkgKSB7XG5cblx0XHQvLyBXZSBhc3N1bWUgdGhhdCBpdCdzIHRoZSBjYWxsYmFja1xuXHRcdGNhbGxiYWNrID0gcGFyYW1zO1xuXHRcdHBhcmFtcyA9IHVuZGVmaW5lZDtcblxuXHQvLyBPdGhlcndpc2UsIGJ1aWxkIGEgcGFyYW0gc3RyaW5nXG5cdH0gZWxzZSBpZiAoIHBhcmFtcyAmJiB0eXBlb2YgcGFyYW1zID09PSBcIm9iamVjdFwiICkge1xuXHRcdHR5cGUgPSBcIlBPU1RcIjtcblx0fVxuXG5cdC8vIElmIHdlIGhhdmUgZWxlbWVudHMgdG8gbW9kaWZ5LCBtYWtlIHRoZSByZXF1ZXN0XG5cdGlmICggc2VsZi5sZW5ndGggPiAwICkge1xuXHRcdGpRdWVyeS5hamF4KCB7XG5cdFx0XHR1cmw6IHVybCxcblxuXHRcdFx0Ly8gSWYgXCJ0eXBlXCIgdmFyaWFibGUgaXMgdW5kZWZpbmVkLCB0aGVuIFwiR0VUXCIgbWV0aG9kIHdpbGwgYmUgdXNlZC5cblx0XHRcdC8vIE1ha2UgdmFsdWUgb2YgdGhpcyBmaWVsZCBleHBsaWNpdCBzaW5jZVxuXHRcdFx0Ly8gdXNlciBjYW4gb3ZlcnJpZGUgaXQgdGhyb3VnaCBhamF4U2V0dXAgbWV0aG9kXG5cdFx0XHR0eXBlOiB0eXBlIHx8IFwiR0VUXCIsXG5cdFx0XHRkYXRhVHlwZTogXCJodG1sXCIsXG5cdFx0XHRkYXRhOiBwYXJhbXNcblx0XHR9ICkuZG9uZSggZnVuY3Rpb24oIHJlc3BvbnNlVGV4dCApIHtcblxuXHRcdFx0Ly8gU2F2ZSByZXNwb25zZSBmb3IgdXNlIGluIGNvbXBsZXRlIGNhbGxiYWNrXG5cdFx0XHRyZXNwb25zZSA9IGFyZ3VtZW50cztcblxuXHRcdFx0c2VsZi5odG1sKCBzZWxlY3RvciA/XG5cblx0XHRcdFx0Ly8gSWYgYSBzZWxlY3RvciB3YXMgc3BlY2lmaWVkLCBsb2NhdGUgdGhlIHJpZ2h0IGVsZW1lbnRzIGluIGEgZHVtbXkgZGl2XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgc2NyaXB0cyB0byBhdm9pZCBJRSAnUGVybWlzc2lvbiBEZW5pZWQnIGVycm9yc1xuXHRcdFx0XHRqUXVlcnkoIFwiPGRpdj5cIiApLmFwcGVuZCggalF1ZXJ5LnBhcnNlSFRNTCggcmVzcG9uc2VUZXh0ICkgKS5maW5kKCBzZWxlY3RvciApIDpcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UgdXNlIHRoZSBmdWxsIHJlc3VsdFxuXHRcdFx0XHRyZXNwb25zZVRleHQgKTtcblxuXHRcdC8vIElmIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLCB0aGlzIGZ1bmN0aW9uIGdldHMgXCJkYXRhXCIsIFwic3RhdHVzXCIsIFwianFYSFJcIlxuXHRcdC8vIGJ1dCB0aGV5IGFyZSBpZ25vcmVkIGJlY2F1c2UgcmVzcG9uc2Ugd2FzIHNldCBhYm92ZS5cblx0XHQvLyBJZiBpdCBmYWlscywgdGhpcyBmdW5jdGlvbiBnZXRzIFwianFYSFJcIiwgXCJzdGF0dXNcIiwgXCJlcnJvclwiXG5cdFx0fSApLmFsd2F5cyggY2FsbGJhY2sgJiYgZnVuY3Rpb24oIGpxWEhSLCBzdGF0dXMgKSB7XG5cdFx0XHRzZWxmLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRjYWxsYmFjay5hcHBseSggdGhpcywgcmVzcG9uc2UgfHwgWyBqcVhIUi5yZXNwb25zZVRleHQsIHN0YXR1cywganFYSFIgXSApO1xuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdHJldHVybiB0aGlzO1xufTtcblxuXG5cblxuLy8gQXR0YWNoIGEgYnVuY2ggb2YgZnVuY3Rpb25zIGZvciBoYW5kbGluZyBjb21tb24gQUpBWCBldmVudHNcbmpRdWVyeS5lYWNoKCBbXG5cdFwiYWpheFN0YXJ0XCIsXG5cdFwiYWpheFN0b3BcIixcblx0XCJhamF4Q29tcGxldGVcIixcblx0XCJhamF4RXJyb3JcIixcblx0XCJhamF4U3VjY2Vzc1wiLFxuXHRcImFqYXhTZW5kXCJcbl0sIGZ1bmN0aW9uKCBpLCB0eXBlICkge1xuXHRqUXVlcnkuZm5bIHR5cGUgXSA9IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZSwgZm4gKTtcblx0fTtcbn0gKTtcblxuXG5cblxualF1ZXJ5LmV4cHIucHNldWRvcy5hbmltYXRlZCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRyZXR1cm4galF1ZXJ5LmdyZXAoIGpRdWVyeS50aW1lcnMsIGZ1bmN0aW9uKCBmbiApIHtcblx0XHRyZXR1cm4gZWxlbSA9PT0gZm4uZWxlbTtcblx0fSApLmxlbmd0aDtcbn07XG5cblxuXG5cbmpRdWVyeS5vZmZzZXQgPSB7XG5cdHNldE9mZnNldDogZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGkgKSB7XG5cdFx0dmFyIGN1clBvc2l0aW9uLCBjdXJMZWZ0LCBjdXJDU1NUb3AsIGN1clRvcCwgY3VyT2Zmc2V0LCBjdXJDU1NMZWZ0LCBjYWxjdWxhdGVQb3NpdGlvbixcblx0XHRcdHBvc2l0aW9uID0galF1ZXJ5LmNzcyggZWxlbSwgXCJwb3NpdGlvblwiICksXG5cdFx0XHRjdXJFbGVtID0galF1ZXJ5KCBlbGVtICksXG5cdFx0XHRwcm9wcyA9IHt9O1xuXG5cdFx0Ly8gU2V0IHBvc2l0aW9uIGZpcnN0LCBpbi1jYXNlIHRvcC9sZWZ0IGFyZSBzZXQgZXZlbiBvbiBzdGF0aWMgZWxlbVxuXHRcdGlmICggcG9zaXRpb24gPT09IFwic3RhdGljXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLnBvc2l0aW9uID0gXCJyZWxhdGl2ZVwiO1xuXHRcdH1cblxuXHRcdGN1ck9mZnNldCA9IGN1ckVsZW0ub2Zmc2V0KCk7XG5cdFx0Y3VyQ1NTVG9wID0galF1ZXJ5LmNzcyggZWxlbSwgXCJ0b3BcIiApO1xuXHRcdGN1ckNTU0xlZnQgPSBqUXVlcnkuY3NzKCBlbGVtLCBcImxlZnRcIiApO1xuXHRcdGNhbGN1bGF0ZVBvc2l0aW9uID0gKCBwb3NpdGlvbiA9PT0gXCJhYnNvbHV0ZVwiIHx8IHBvc2l0aW9uID09PSBcImZpeGVkXCIgKSAmJlxuXHRcdFx0KCBjdXJDU1NUb3AgKyBjdXJDU1NMZWZ0ICkuaW5kZXhPZiggXCJhdXRvXCIgKSA+IC0xO1xuXG5cdFx0Ly8gTmVlZCB0byBiZSBhYmxlIHRvIGNhbGN1bGF0ZSBwb3NpdGlvbiBpZiBlaXRoZXJcblx0XHQvLyB0b3Agb3IgbGVmdCBpcyBhdXRvIGFuZCBwb3NpdGlvbiBpcyBlaXRoZXIgYWJzb2x1dGUgb3IgZml4ZWRcblx0XHRpZiAoIGNhbGN1bGF0ZVBvc2l0aW9uICkge1xuXHRcdFx0Y3VyUG9zaXRpb24gPSBjdXJFbGVtLnBvc2l0aW9uKCk7XG5cdFx0XHRjdXJUb3AgPSBjdXJQb3NpdGlvbi50b3A7XG5cdFx0XHRjdXJMZWZ0ID0gY3VyUG9zaXRpb24ubGVmdDtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHRjdXJUb3AgPSBwYXJzZUZsb2F0KCBjdXJDU1NUb3AgKSB8fCAwO1xuXHRcdFx0Y3VyTGVmdCA9IHBhcnNlRmxvYXQoIGN1ckNTU0xlZnQgKSB8fCAwO1xuXHRcdH1cblxuXHRcdGlmICggaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXG5cdFx0XHQvLyBVc2UgalF1ZXJ5LmV4dGVuZCBoZXJlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBjb29yZGluYXRlcyBhcmd1bWVudCAoZ2gtMTg0OClcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGpRdWVyeS5leHRlbmQoIHt9LCBjdXJPZmZzZXQgKSApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdC8vIG9mZnNldCgpIHJlbGF0ZXMgYW4gZWxlbWVudCdzIGJvcmRlciBib3ggdG8gdGhlIGRvY3VtZW50IG9yaWdpblxuXHRvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXG5cdFx0Ly8gUHJlc2VydmUgY2hhaW5pbmcgZm9yIHNldHRlclxuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHR0aGlzIDpcblx0XHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIHJlY3QsIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF07XG5cblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIFJldHVybiB6ZXJvcyBmb3IgZGlzY29ubmVjdGVkIGFuZCBoaWRkZW4gKGRpc3BsYXk6IG5vbmUpIGVsZW1lbnRzIChnaC0yMzEwKVxuXHRcdC8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuXHRcdC8vIFJ1bm5pbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IG9uIGFcblx0XHQvLyBkaXNjb25uZWN0ZWQgbm9kZSBpbiBJRSB0aHJvd3MgYW4gZXJyb3Jcblx0XHRpZiAoICFlbGVtLmdldENsaWVudFJlY3RzKCkubGVuZ3RoICkge1xuXHRcdFx0cmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IGRvY3VtZW50LXJlbGF0aXZlIHBvc2l0aW9uIGJ5IGFkZGluZyB2aWV3cG9ydCBzY3JvbGwgdG8gdmlld3BvcnQtcmVsYXRpdmUgZ0JDUlxuXHRcdHJlY3QgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXHRcdHdpbiA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldztcblx0XHRyZXR1cm4ge1xuXHRcdFx0dG9wOiByZWN0LnRvcCArIHdpbi5wYWdlWU9mZnNldCxcblx0XHRcdGxlZnQ6IHJlY3QubGVmdCArIHdpbi5wYWdlWE9mZnNldFxuXHRcdH07XG5cdH0sXG5cblx0Ly8gcG9zaXRpb24oKSByZWxhdGVzIGFuIGVsZW1lbnQncyBtYXJnaW4gYm94IHRvIGl0cyBvZmZzZXQgcGFyZW50J3MgcGFkZGluZyBib3hcblx0Ly8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYmVoYXZpb3Igb2YgQ1NTIGFic29sdXRlIHBvc2l0aW9uaW5nXG5cdHBvc2l0aW9uOiBmdW5jdGlvbigpIHtcblx0XHRpZiAoICF0aGlzWyAwIF0gKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dmFyIG9mZnNldFBhcmVudCwgb2Zmc2V0LCBkb2MsXG5cdFx0XHRlbGVtID0gdGhpc1sgMCBdLFxuXHRcdFx0cGFyZW50T2Zmc2V0ID0geyB0b3A6IDAsIGxlZnQ6IDAgfTtcblxuXHRcdC8vIHBvc2l0aW9uOmZpeGVkIGVsZW1lbnRzIGFyZSBvZmZzZXQgZnJvbSB0aGUgdmlld3BvcnQsIHdoaWNoIGl0c2VsZiBhbHdheXMgaGFzIHplcm8gb2Zmc2V0XG5cdFx0aWYgKCBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSA9PT0gXCJmaXhlZFwiICkge1xuXG5cdFx0XHQvLyBBc3N1bWUgcG9zaXRpb246Zml4ZWQgaW1wbGllcyBhdmFpbGFiaWxpdHkgb2YgZ2V0Qm91bmRpbmdDbGllbnRSZWN0XG5cdFx0XHRvZmZzZXQgPSBlbGVtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdG9mZnNldCA9IHRoaXMub2Zmc2V0KCk7XG5cblx0XHRcdC8vIEFjY291bnQgZm9yIHRoZSAqcmVhbCogb2Zmc2V0IHBhcmVudCwgd2hpY2ggY2FuIGJlIHRoZSBkb2N1bWVudCBvciBpdHMgcm9vdCBlbGVtZW50XG5cdFx0XHQvLyB3aGVuIGEgc3RhdGljYWxseSBwb3NpdGlvbmVkIGVsZW1lbnQgaXMgaWRlbnRpZmllZFxuXHRcdFx0ZG9jID0gZWxlbS5vd25lckRvY3VtZW50O1xuXHRcdFx0b2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQgfHwgZG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdHdoaWxlICggb2Zmc2V0UGFyZW50ICYmXG5cdFx0XHRcdCggb2Zmc2V0UGFyZW50ID09PSBkb2MuYm9keSB8fCBvZmZzZXRQYXJlbnQgPT09IGRvYy5kb2N1bWVudEVsZW1lbnQgKSAmJlxuXHRcdFx0XHRqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwicG9zaXRpb25cIiApID09PSBcInN0YXRpY1wiICkge1xuXG5cdFx0XHRcdG9mZnNldFBhcmVudCA9IG9mZnNldFBhcmVudC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBvZmZzZXRQYXJlbnQgJiYgb2Zmc2V0UGFyZW50ICE9PSBlbGVtICYmIG9mZnNldFBhcmVudC5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSBib3JkZXJzIGludG8gaXRzIG9mZnNldCwgc2luY2UgdGhleSBhcmUgb3V0c2lkZSBpdHMgY29udGVudCBvcmlnaW5cblx0XHRcdFx0cGFyZW50T2Zmc2V0ID0galF1ZXJ5KCBvZmZzZXRQYXJlbnQgKS5vZmZzZXQoKTtcblx0XHRcdFx0cGFyZW50T2Zmc2V0LnRvcCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwiYm9yZGVyVG9wV2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0XHRwYXJlbnRPZmZzZXQubGVmdCArPSBqUXVlcnkuY3NzKCBvZmZzZXRQYXJlbnQsIFwiYm9yZGVyTGVmdFdpZHRoXCIsIHRydWUgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpblRvcFwiLCB0cnVlICksXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIsIHRydWUgKVxuXHRcdH07XG5cdH0sXG5cblx0Ly8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZG9jdW1lbnRFbGVtZW50IGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG5cdC8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5cblx0Ly8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2luZG93XG5cdC8vIDIpIEZvciB0aGUgaGlkZGVuIG9yIGRldGFjaGVkIGVsZW1lbnRcblx0Ly8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZlxuXHQvL1xuXHQvLyBidXQgdGhvc2UgZXhjZXB0aW9ucyB3ZXJlIG5ldmVyIHByZXNlbnRlZCBhcyBhIHJlYWwgbGlmZSB1c2UtY2FzZXNcblx0Ly8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuXG5cdC8vXG5cdC8vIFRoaXMgbG9naWMsIGhvd2V2ZXIsIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBjYW4gY2hhbmdlIGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblxuXHRcdFx0Ly8gQ29hbGVzY2UgZG9jdW1lbnRzIGFuZCB3aW5kb3dzXG5cdFx0XHR2YXIgd2luO1xuXHRcdFx0aWYgKCBpc1dpbmRvdyggZWxlbSApICkge1xuXHRcdFx0XHR3aW4gPSBlbGVtO1xuXHRcdFx0fSBlbHNlIGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0d2luID0gZWxlbS5kZWZhdWx0Vmlldztcblx0XHRcdH1cblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpIDw9NyAtIDkuMSwgQ2hyb21lIDw9MzcgLSA0OVxuLy8gQWRkIHRoZSB0b3AvbGVmdCBjc3NIb29rcyB1c2luZyBqUXVlcnkuZm4ucG9zaXRpb25cbi8vIFdlYmtpdCBidWc6IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yOTA4NFxuLy8gQmxpbmsgYnVnOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD01ODkzNDdcbi8vIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyBwZXJjZW50IHdoZW4gc3BlY2lmaWVkIGZvciB0b3AvbGVmdC9ib3R0b20vcmlnaHQ7XG4vLyByYXRoZXIgdGhhbiBtYWtlIHRoZSBjc3MgbW9kdWxlIGRlcGVuZCBvbiB0aGUgb2Zmc2V0IG1vZHVsZSwganVzdCBjaGVjayBmb3IgaXQgaGVyZVxualF1ZXJ5LmVhY2goIFsgXCJ0b3BcIiwgXCJsZWZ0XCIgXSwgZnVuY3Rpb24oIGksIHByb3AgKSB7XG5cdGpRdWVyeS5jc3NIb29rc1sgcHJvcCBdID0gYWRkR2V0SG9va0lmKCBzdXBwb3J0LnBpeGVsUG9zaXRpb24sXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbXB1dGVkICkge1xuXHRcdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdFx0Y29tcHV0ZWQgPSBjdXJDU1MoIGVsZW0sIHByb3AgKTtcblxuXHRcdFx0XHQvLyBJZiBjdXJDU1MgcmV0dXJucyBwZXJjZW50YWdlLCBmYWxsYmFjayB0byBvZmZzZXRcblx0XHRcdFx0cmV0dXJuIHJudW1ub25weC50ZXN0KCBjb21wdXRlZCApID9cblx0XHRcdFx0XHRqUXVlcnkoIGVsZW0gKS5wb3NpdGlvbigpWyBwcm9wIF0gKyBcInB4XCIgOlxuXHRcdFx0XHRcdGNvbXB1dGVkO1xuXHRcdFx0fVxuXHRcdH1cblx0KTtcbn0gKTtcblxuXG4vLyBDcmVhdGUgaW5uZXJIZWlnaHQsIGlubmVyV2lkdGgsIGhlaWdodCwgd2lkdGgsIG91dGVySGVpZ2h0IGFuZCBvdXRlcldpZHRoIG1ldGhvZHNcbmpRdWVyeS5lYWNoKCB7IEhlaWdodDogXCJoZWlnaHRcIiwgV2lkdGg6IFwid2lkdGhcIiB9LCBmdW5jdGlvbiggbmFtZSwgdHlwZSApIHtcblx0alF1ZXJ5LmVhY2goIHsgcGFkZGluZzogXCJpbm5lclwiICsgbmFtZSwgY29udGVudDogdHlwZSwgXCJcIjogXCJvdXRlclwiICsgbmFtZSB9LFxuXHRcdGZ1bmN0aW9uKCBkZWZhdWx0RXh0cmEsIGZ1bmNOYW1lICkge1xuXG5cdFx0Ly8gTWFyZ2luIGlzIG9ubHkgZm9yIG91dGVySGVpZ2h0LCBvdXRlcldpZHRoXG5cdFx0alF1ZXJ5LmZuWyBmdW5jTmFtZSBdID0gZnVuY3Rpb24oIG1hcmdpbiwgdmFsdWUgKSB7XG5cdFx0XHR2YXIgY2hhaW5hYmxlID0gYXJndW1lbnRzLmxlbmd0aCAmJiAoIGRlZmF1bHRFeHRyYSB8fCB0eXBlb2YgbWFyZ2luICE9PSBcImJvb2xlYW5cIiApLFxuXHRcdFx0XHRleHRyYSA9IGRlZmF1bHRFeHRyYSB8fCAoIG1hcmdpbiA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gdHJ1ZSA/IFwibWFyZ2luXCIgOiBcImJvcmRlclwiICk7XG5cblx0XHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIGRvYztcblxuXHRcdFx0XHRpZiAoIGlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyAkKCB3aW5kb3cgKS5vdXRlcldpZHRoL0hlaWdodCByZXR1cm4gdy9oIGluY2x1ZGluZyBzY3JvbGxiYXJzIChnaC0xNzI5KVxuXHRcdFx0XHRcdHJldHVybiBmdW5jTmFtZS5pbmRleE9mKCBcIm91dGVyXCIgKSA9PT0gMCA/XG5cdFx0XHRcdFx0XHRlbGVtWyBcImlubmVyXCIgKyBuYW1lIF0gOlxuXHRcdFx0XHRcdFx0ZWxlbS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbIFwiY2xpZW50XCIgKyBuYW1lIF07XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBHZXQgZG9jdW1lbnQgd2lkdGggb3IgaGVpZ2h0XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRkb2MgPSBlbGVtLmRvY3VtZW50RWxlbWVudDtcblxuXHRcdFx0XHRcdC8vIEVpdGhlciBzY3JvbGxbV2lkdGgvSGVpZ2h0XSBvciBvZmZzZXRbV2lkdGgvSGVpZ2h0XSBvciBjbGllbnRbV2lkdGgvSGVpZ2h0XSxcblx0XHRcdFx0XHQvLyB3aGljaGV2ZXIgaXMgZ3JlYXRlc3Rcblx0XHRcdFx0XHRyZXR1cm4gTWF0aC5tYXgoXG5cdFx0XHRcdFx0XHRlbGVtLmJvZHlbIFwic2Nyb2xsXCIgKyBuYW1lIF0sIGRvY1sgXCJzY3JvbGxcIiArIG5hbWUgXSxcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJvZmZzZXRcIiArIG5hbWUgXSwgZG9jWyBcIm9mZnNldFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZG9jWyBcImNsaWVudFwiICsgbmFtZSBdXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkID9cblxuXHRcdFx0XHRcdC8vIEdldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnQsIHJlcXVlc3RpbmcgYnV0IG5vdCBmb3JjaW5nIHBhcnNlRmxvYXRcblx0XHRcdFx0XHRqUXVlcnkuY3NzKCBlbGVtLCB0eXBlLCBleHRyYSApIDpcblxuXHRcdFx0XHRcdC8vIFNldCB3aWR0aCBvciBoZWlnaHQgb24gdGhlIGVsZW1lbnRcblx0XHRcdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHR5cGUsIHZhbHVlLCBleHRyYSApO1xuXHRcdFx0fSwgdHlwZSwgY2hhaW5hYmxlID8gbWFyZ2luIDogdW5kZWZpbmVkLCBjaGFpbmFibGUgKTtcblx0XHR9O1xuXHR9ICk7XG59ICk7XG5cblxualF1ZXJ5LmVhY2goICggXCJibHVyIGZvY3VzIGZvY3VzaW4gZm9jdXNvdXQgcmVzaXplIHNjcm9sbCBjbGljayBkYmxjbGljayBcIiArXG5cdFwibW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgXCIgK1xuXHRcImNoYW5nZSBzZWxlY3Qgc3VibWl0IGtleWRvd24ga2V5cHJlc3Mga2V5dXAgY29udGV4dG1lbnVcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRmdW5jdGlvbiggaSwgbmFtZSApIHtcblxuXHQvLyBIYW5kbGUgZXZlbnQgYmluZGluZ1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDAgP1xuXHRcdFx0dGhpcy5vbiggbmFtZSwgbnVsbCwgZGF0YSwgZm4gKSA6XG5cdFx0XHR0aGlzLnRyaWdnZXIoIG5hbWUgKTtcblx0fTtcbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRob3ZlcjogZnVuY3Rpb24oIGZuT3ZlciwgZm5PdXQgKSB7XG5cdFx0cmV0dXJuIHRoaXMubW91c2VlbnRlciggZm5PdmVyICkubW91c2VsZWF2ZSggZm5PdXQgfHwgZm5PdmVyICk7XG5cdH1cbn0gKTtcblxuXG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdGJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBudWxsLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmJpbmQ6IGZ1bmN0aW9uKCB0eXBlcywgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub2ZmKCB0eXBlcywgbnVsbCwgZm4gKTtcblx0fSxcblxuXHRkZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZGF0YSwgZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGVzLCBzZWxlY3RvciwgZGF0YSwgZm4gKTtcblx0fSxcblx0dW5kZWxlZ2F0ZTogZnVuY3Rpb24oIHNlbGVjdG9yLCB0eXBlcywgZm4gKSB7XG5cblx0XHQvLyAoIG5hbWVzcGFjZSApIG9yICggc2VsZWN0b3IsIHR5cGVzIFssIGZuXSApXG5cdFx0cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgP1xuXHRcdFx0dGhpcy5vZmYoIHNlbGVjdG9yLCBcIioqXCIgKSA6XG5cdFx0XHR0aGlzLm9mZiggdHlwZXMsIHNlbGVjdG9yIHx8IFwiKipcIiwgZm4gKTtcblx0fVxufSApO1xuXG4vLyBCaW5kIGEgZnVuY3Rpb24gdG8gYSBjb250ZXh0LCBvcHRpb25hbGx5IHBhcnRpYWxseSBhcHBseWluZyBhbnlcbi8vIGFyZ3VtZW50cy5cbi8vIGpRdWVyeS5wcm94eSBpcyBkZXByZWNhdGVkIHRvIHByb21vdGUgc3RhbmRhcmRzIChzcGVjaWZpY2FsbHkgRnVuY3Rpb24jYmluZClcbi8vIEhvd2V2ZXIsIGl0IGlzIG5vdCBzbGF0ZWQgZm9yIHJlbW92YWwgYW55IHRpbWUgc29vblxualF1ZXJ5LnByb3h5ID0gZnVuY3Rpb24oIGZuLCBjb250ZXh0ICkge1xuXHR2YXIgdG1wLCBhcmdzLCBwcm94eTtcblxuXHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdHRtcCA9IGZuWyBjb250ZXh0IF07XG5cdFx0Y29udGV4dCA9IGZuO1xuXHRcdGZuID0gdG1wO1xuXHR9XG5cblx0Ly8gUXVpY2sgY2hlY2sgdG8gZGV0ZXJtaW5lIGlmIHRhcmdldCBpcyBjYWxsYWJsZSwgaW4gdGhlIHNwZWNcblx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0aWYgKCAhaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cywgMiApO1xuXHRwcm94eSA9IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHR9O1xuXG5cdC8vIFNldCB0aGUgZ3VpZCBvZiB1bmlxdWUgaGFuZGxlciB0byB0aGUgc2FtZSBvZiBvcmlnaW5hbCBoYW5kbGVyLCBzbyBpdCBjYW4gYmUgcmVtb3ZlZFxuXHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRyZXR1cm4gcHJveHk7XG59O1xuXG5qUXVlcnkuaG9sZFJlYWR5ID0gZnVuY3Rpb24oIGhvbGQgKSB7XG5cdGlmICggaG9sZCApIHtcblx0XHRqUXVlcnkucmVhZHlXYWl0Kys7XG5cdH0gZWxzZSB7XG5cdFx0alF1ZXJ5LnJlYWR5KCB0cnVlICk7XG5cdH1cbn07XG5qUXVlcnkuaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5qUXVlcnkucGFyc2VKU09OID0gSlNPTi5wYXJzZTtcbmpRdWVyeS5ub2RlTmFtZSA9IG5vZGVOYW1lO1xualF1ZXJ5LmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xualF1ZXJ5LmlzV2luZG93ID0gaXNXaW5kb3c7XG5qUXVlcnkuY2FtZWxDYXNlID0gY2FtZWxDYXNlO1xualF1ZXJ5LnR5cGUgPSB0b1R5cGU7XG5cbmpRdWVyeS5ub3cgPSBEYXRlLm5vdztcblxualF1ZXJ5LmlzTnVtZXJpYyA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0Ly8gQXMgb2YgalF1ZXJ5IDMuMCwgaXNOdW1lcmljIGlzIGxpbWl0ZWQgdG9cblx0Ly8gc3RyaW5ncyBhbmQgbnVtYmVycyAocHJpbWl0aXZlcyBvciBvYmplY3RzKVxuXHQvLyB0aGF0IGNhbiBiZSBjb2VyY2VkIHRvIGZpbml0ZSBudW1iZXJzIChnaC0yNjYyKVxuXHR2YXIgdHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblx0cmV0dXJuICggdHlwZSA9PT0gXCJudW1iZXJcIiB8fCB0eXBlID09PSBcInN0cmluZ1wiICkgJiZcblxuXHRcdC8vIHBhcnNlRmxvYXQgTmFOcyBudW1lcmljLWNhc3QgZmFsc2UgcG9zaXRpdmVzIChcIlwiKVxuXHRcdC8vIC4uLmJ1dCBtaXNpbnRlcnByZXRzIGxlYWRpbmctbnVtYmVyIHN0cmluZ3MsIHBhcnRpY3VsYXJseSBoZXggbGl0ZXJhbHMgKFwiMHguLi5cIilcblx0XHQvLyBzdWJ0cmFjdGlvbiBmb3JjZXMgaW5maW5pdGllcyB0byBOYU5cblx0XHQhaXNOYU4oIG9iaiAtIHBhcnNlRmxvYXQoIG9iaiApICk7XG59O1xuXG5cblxuXG4vLyBSZWdpc3RlciBhcyBhIG5hbWVkIEFNRCBtb2R1bGUsIHNpbmNlIGpRdWVyeSBjYW4gYmUgY29uY2F0ZW5hdGVkIHdpdGggb3RoZXJcbi8vIGZpbGVzIHRoYXQgbWF5IHVzZSBkZWZpbmUsIGJ1dCBub3QgdmlhIGEgcHJvcGVyIGNvbmNhdGVuYXRpb24gc2NyaXB0IHRoYXRcbi8vIHVuZGVyc3RhbmRzIGFub255bW91cyBBTUQgbW9kdWxlcy4gQSBuYW1lZCBBTUQgaXMgc2FmZXN0IGFuZCBtb3N0IHJvYnVzdFxuLy8gd2F5IHRvIHJlZ2lzdGVyLiBMb3dlcmNhc2UganF1ZXJ5IGlzIHVzZWQgYmVjYXVzZSBBTUQgbW9kdWxlIG5hbWVzIGFyZVxuLy8gZGVyaXZlZCBmcm9tIGZpbGUgbmFtZXMsIGFuZCBqUXVlcnkgaXMgbm9ybWFsbHkgZGVsaXZlcmVkIGluIGEgbG93ZXJjYXNlXG4vLyBmaWxlIG5hbWUuIERvIHRoaXMgYWZ0ZXIgY3JlYXRpbmcgdGhlIGdsb2JhbCBzbyB0aGF0IGlmIGFuIEFNRCBtb2R1bGUgd2FudHNcbi8vIHRvIGNhbGwgbm9Db25mbGljdCB0byBoaWRlIHRoaXMgdmVyc2lvbiBvZiBqUXVlcnksIGl0IHdpbGwgd29yay5cblxuLy8gTm90ZSB0aGF0IGZvciBtYXhpbXVtIHBvcnRhYmlsaXR5LCBsaWJyYXJpZXMgdGhhdCBhcmUgbm90IGpRdWVyeSBzaG91bGRcbi8vIGRlY2xhcmUgdGhlbXNlbHZlcyBhcyBhbm9ueW1vdXMgbW9kdWxlcywgYW5kIGF2b2lkIHNldHRpbmcgYSBnbG9iYWwgaWYgYW5cbi8vIEFNRCBsb2FkZXIgaXMgcHJlc2VudC4galF1ZXJ5IGlzIGEgc3BlY2lhbCBjYXNlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vanJidXJrZS9yZXF1aXJlanMvd2lraS9VcGRhdGluZy1leGlzdGluZy1saWJyYXJpZXMjd2lraS1hbm9uXG5cbmlmICggdHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQgKSB7XG5cdGRlZmluZSggXCJqcXVlcnlcIiwgW10sIGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiBqUXVlcnk7XG5cdH0gKTtcbn1cblxuXG5cblxudmFyXG5cblx0Ly8gTWFwIG92ZXIgalF1ZXJ5IGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF9qUXVlcnkgPSB3aW5kb3cualF1ZXJ5LFxuXG5cdC8vIE1hcCBvdmVyIHRoZSAkIGluIGNhc2Ugb2Ygb3ZlcndyaXRlXG5cdF8kID0gd2luZG93LiQ7XG5cbmpRdWVyeS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oIGRlZXAgKSB7XG5cdGlmICggd2luZG93LiQgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cuJCA9IF8kO1xuXHR9XG5cblx0aWYgKCBkZWVwICYmIHdpbmRvdy5qUXVlcnkgPT09IGpRdWVyeSApIHtcblx0XHR3aW5kb3cualF1ZXJ5ID0gX2pRdWVyeTtcblx0fVxuXG5cdHJldHVybiBqUXVlcnk7XG59O1xuXG4vLyBFeHBvc2UgalF1ZXJ5IGFuZCAkIGlkZW50aWZpZXJzLCBldmVuIGluIEFNRFxuLy8gKCM3MTAyI2NvbW1lbnQ6MTAsIGh0dHBzOi8vZ2l0aHViLmNvbS9qcXVlcnkvanF1ZXJ5L3B1bGwvNTU3KVxuLy8gYW5kIENvbW1vbkpTIGZvciBicm93c2VyIGVtdWxhdG9ycyAoIzEzNTY2KVxuaWYgKCAhbm9HbG9iYWwgKSB7XG5cdHdpbmRvdy5qUXVlcnkgPSB3aW5kb3cuJCA9IGpRdWVyeTtcbn1cblxuXG5cblxucmV0dXJuIGpRdWVyeTtcbn0gKTtcbiIsIi8vIGpRdWVyeSBwbHVnaW5zIGV4cGVjdCB0byBmaW5kIGEgZ2xvYmFsIGBqUXVlcnlgIG9iamVjdCwgc28gd2Vcbi8vIG5lZWQgdG8gYXR0YWNoIGl0IHRvIHRoZSB3aW5kb3cuXG4vL1xuLy8gVGhpcyBpcyBpbiBpdHMgb3duIGZpbGUgYmVjYXVzZSB3ZSBoYXZlIHRvIGF0dGFjaCBpdCBiZWZvcmUgYW55XG4vLyBvdGhlciBpbXBvcnRzIGhhcHBlbiwgYnV0IHdpdGggRVM2IG1vZHVsZXMsIGFsbCBgaW1wb3J0YHMgaGF2ZVxuLy8gdG8gYmUgYXQgdGhlIHRvcC5cbmltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG53aW5kb3cualF1ZXJ5ID0gJDtcbndpbmRvdy4kID0gJDtcbiIsIi8qIVxuICogVHJlbmQgMC4yLjBcbiAqXG4gKiBGYWlsLXNhZmUgVHJhbnNpdGlvbkVuZCBldmVudCBmb3IgalF1ZXJ5LlxuICpcbiAqIEFkZHMgYSBuZXcgXCJ0cmVuZFwiIGV2ZW50IHRoYXQgY2FuIGJlIHVzZWQgaW4gYnJvd3NlcnMgdGhhdCBkb24ndFxuICogc3VwcG9ydCBcInRyYW5zaXRpb25lbmRcIi5cbiAqXG4gKiBOT1RFOiBPbmx5IHN1cHBvcnRzIGJlaW5nIGJvdW5kIHdpdGggXCJqUXVlcnkub25lXCIuXG4gKlxuICogQ29weXJpZ2h0IDIwMTQsIFBpeGVsIFVuaW9uIC0gaHR0cDovL3BpeGVsdW5pb24ubmV0XG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqL1xuOyhmdW5jdGlvbigkKXtcblxuICAvLyBQcmVmaXhlZCB0cmFuc2l0aW9uZW5kIGV2ZW50IG5hbWVzXG4gIHZhciB0cmFuc2l0aW9uRW5kRXZlbnRzID1cbiAgICBcIndlYmtpdFRyYW5zaXRpb25FbmQgXCIgK1xuICAgIFwib3RyYW5zaXRpb25lbmQgXCIgK1xuICAgIFwib1RyYW5zaXRpb25FbmQgXCIgK1xuICAgIFwibXNUcmFuc2l0aW9uRW5kIFwiICtcbiAgICBcInRyYW5zaXRpb25lbmRcIjtcblxuICAvLyBQcmVmaXhlZCB0cmFuc2l0aW9uIGR1cmF0aW9uIHByb3BlcnR5IG5hbWVzXG4gIHZhciB0cmFuc2l0aW9uRHVyYXRpb25Qcm9wZXJ0aWVzID0gW1xuICAgIFwidHJhbnNpdGlvbi1kdXJhdGlvblwiLFxuICAgIFwiLW1vei10cmFuc2l0aW9uLWR1cmF0aW9uXCIsXG4gICAgXCItd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb25cIixcbiAgICBcIi1tcy10cmFuc2l0aW9uLWR1cmF0aW9uXCIsXG4gICAgXCItby10cmFuc2l0aW9uLWR1cmF0aW9uXCIsXG4gICAgXCIta2h0bWwtdHJhbnNpdGlvbi1kdXJhdGlvblwiXG4gIF07XG5cbiAgLy8gUHJlZml4ZWQgdHJhbnNpdGlvbiBkZWxheSBwcm9wZXJ0eSBuYW1lc1xuICB2YXIgdHJhbnNpdGlvbkRlbGF5UHJvcGVydGllcyA9IFtcbiAgICBcInRyYW5zaXRpb24tZGVsYXlcIixcbiAgICBcIi1tb3otdHJhbnNpdGlvbi1kZWxheVwiLFxuICAgIFwiLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5XCIsXG4gICAgXCItbXMtdHJhbnNpdGlvbi1kZWxheVwiLFxuICAgIFwiLW8tdHJhbnNpdGlvbi1kZWxheVwiLFxuICAgIFwiLWtodG1sLXRyYW5zaXRpb24tZGVsYXlcIlxuICBdO1xuXG4gIC8vIFBhcnNlcyBhIENTUyB0aW1lIHZhbHVlIGludG8gbWlsbGlzZWNvbmRzLlxuICB2YXIgcGFyc2VUaW1lID0gZnVuY3Rpb24ocykge1xuICAgIHMgPSBzLnJlcGxhY2UoL1xccy8sIFwiXCIpO1xuICAgIHZhciB2ID0gd2luZG93LnBhcnNlRmxvYXQocyk7XG5cbiAgICByZXR1cm4gcy5tYXRjaCgvW15tXXMkL2kpXG4gICAgICA/IHYgKiAxMDAwXG4gICAgICA6IHY7XG4gIH07XG5cbiAgLy8gUGFyc2VzIHRoZSBsb25nZXN0IHRpbWUgdW5pdCBmb3VuZCBpbiBhIHNlcmllcyBvZiBDU1MgcHJvcGVydGllcy5cbiAgLy8gUmV0dXJucyBhIHZhbHVlIGluIG1pbGxpc2Vjb25kcy5cbiAgdmFyIHBhcnNlUHJvcGVydGllcyA9IGZ1bmN0aW9uKGVsLCBwcm9wZXJ0aWVzKSB7XG4gICAgdmFyIGR1cmF0aW9uID0gMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcGVydGllcy5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gR2V0IHJhdyBDU1MgdmFsdWVcbiAgICAgIHZhciB2YWx1ZSA9IGVsLmNzcyhwcm9wZXJ0aWVzW2ldKTtcbiAgICAgIGlmICghdmFsdWUpIGNvbnRpbnVlO1xuXG4gICAgICAvLyBNdWx0aXBsZSB0cmFuc2l0aW9ucy0tcGljayB0aGUgbG9uZ2VzdFxuICAgICAgaWYgKHZhbHVlLmluZGV4T2YoXCIsXCIpICE9PSAtMSkge1xuICAgICAgICB2YXIgdmFsdWVzID0gdmFsdWUuc3BsaXQoXCIsXCIpO1xuICAgICAgICB2YXIgZHVyYXRpb25zID0gKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTtcbiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdmFyIGR1cmF0aW9uID0gcGFyc2VUaW1lKHZhbHVlc1tpXSk7XG4gICAgICAgICAgICByZXN1bHRzLnB1c2goZHVyYXRpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0cztcbiAgICAgICAgfSkoKTtcblxuICAgICAgICBkdXJhdGlvbiA9IE1hdGgubWF4LmFwcGx5KE1hdGgsIGR1cmF0aW9ucyk7XG4gICAgICB9XG5cbiAgICAgIC8vIFNpbmdsZSB0cmFuc2l0aW9uXG4gICAgICBlbHNlIHtcbiAgICAgICAgZHVyYXRpb24gPSBwYXJzZVRpbWUodmFsdWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBBY2NlcHQgZmlyc3QgdmF1ZVxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgcmV0dXJuIGR1cmF0aW9uO1xuICB9O1xuXG4gICQuZXZlbnQuc3BlY2lhbC50cmVuZCA9IHtcbiAgICAvLyBUcmlnZ2VycyBhbiBldmVudCBoYW5kbGVyIHdoZW4gYW4gZWxlbWVudCBpcyBkb25lIHRyYW5zaXRpb25pbmcuXG4gICAgLy9cbiAgICAvLyBIYW5kbGVzIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCB0cmFuc2l0aW9uZW5kIGJ5IGFkZGluZyBhXG4gICAgLy8gdGltZW91dCB3aXRoIHRoZSB0cmFuc2l0aW9uIGR1cmF0aW9uLlxuICAgIGFkZDogZnVuY3Rpb24oaGFuZGxlT2JqKSB7XG4gICAgICB2YXIgZWwgPSAkKHRoaXMpO1xuICAgICAgdmFyIGZpcmVkID0gZmFsc2U7XG5cbiAgICAgIC8vIE1hcmsgZWxlbWVudCBhcyBiZWluZyBpbiB0cmFuc2l0aW9uXG4gICAgICBlbC5kYXRhKFwidHJlbmRcIiwgdHJ1ZSk7XG5cbiAgICAgIC8vIENhbGN1bGF0ZSBhIGZhbGxiYWNrIGR1cmF0aW9uLiArIDIwIGJlY2F1c2Ugc29tZSBicm93c2VycyBmaXJlXG4gICAgICAvLyB0aW1lb3V0cyBmYXN0ZXIgdGhhbiB0cmFuc2l0aW9uZW5kLlxuICAgICAgdmFyIHRpbWUgPVxuICAgICAgICBwYXJzZVByb3BlcnRpZXMoZWwsIHRyYW5zaXRpb25EdXJhdGlvblByb3BlcnRpZXMpICtcbiAgICAgICAgcGFyc2VQcm9wZXJ0aWVzKGVsLCB0cmFuc2l0aW9uRGVsYXlQcm9wZXJ0aWVzKSArXG4gICAgICAgIDIwO1xuXG4gICAgICB2YXIgY2IgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgIC8vIHRyYW5zaXRpb25lbmQgZXZlbnRzIGNhbiBiZSBzZW50IGZvciBlYWNoIHByb3BlcnR5LiBMZXQncyBqdXN0XG4gICAgICAgIC8vIHNraXAgYWxsIGJ1dCB0aGUgZmlyc3QuIEFsc28gaGFuZGxlcyB0aGUgdGltZW91dCBjYWxsYmFjay5cbiAgICAgICAgaWYgKGZpcmVkKSByZXR1cm47XG5cbiAgICAgICAgLy8gQ2hpbGQgZWxlbWVudHMgdGhhdCBhbHNvIGhhdmUgdHJhbnNpdGlvbnMgY2FuIGJlIGZpcmVkIGJlZm9yZSB3ZVxuICAgICAgICAvLyBjb21wbGV0ZS4gVGhpcyB3aWxsIGNhdGNoIGFuZCBpZ25vcmUgdGhvc2UuIFVuZm9ydHVuYXRlbHksIHdlJ2xsXG4gICAgICAgIC8vIGhhdmUgdG8gcmVseSBvbiB0aGUgdGltZW91dCBpbiB0aGVzZSBjYXNlcy5cbiAgICAgICAgaWYgKGUgJiYgZS5zcmNFbGVtZW50ICE9PSBlbFswXSkgcmV0dXJuO1xuXG4gICAgICAgIC8vIE1hcmsgZWxlbWVudCBoYXMgbm90IGJlaW5nIGluIHRyYW5zaXRpb25cbiAgICAgICAgZWwuZGF0YShcInRyZW5kXCIsIGZhbHNlKTtcblxuICAgICAgICAvLyBDYWxsYmFja1xuICAgICAgICBmaXJlZCA9IHRydWU7XG4gICAgICAgIGlmIChoYW5kbGVPYmouaGFuZGxlcikgaGFuZGxlT2JqLmhhbmRsZXIoKTtcbiAgICAgIH07XG5cbiAgICAgIGVsLm9uZSh0cmFuc2l0aW9uRW5kRXZlbnRzLCBjYik7XG4gICAgICBlbC5kYXRhKFwidHJlbmQtdGltZW91dFwiLCB3aW5kb3cuc2V0VGltZW91dChjYiwgdGltZSkpO1xuICAgIH0sXG5cbiAgICByZW1vdmU6IGZ1bmN0aW9uKGhhbmRsZU9iaikge1xuICAgICAgdmFyIGVsID0gJCh0aGlzKTtcbiAgICAgIGVsLm9mZih0cmFuc2l0aW9uRW5kRXZlbnRzKTtcbiAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoZWwuZGF0YShcInRyZW5kLXRpbWVvdXRcIikpO1xuICAgIH1cbiAgfTtcblxufSkoalF1ZXJ5KTtcbiIsIi8qIVxuICogUmV2ZWFsZXIgMi4wLjFcbiAqXG4gKiBDb3B5cmlnaHQgMjAxNSwgUGl4ZWwgVW5pb24gLSBodHRwOi8vcGl4ZWx1bmlvbi5uZXRcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICovXG4oZnVuY3Rpb24oJCl7XG4gIC8vIGNoZWNrIGZvciB0cmVuZCBldmVudCAobWFrZSBzdXJlIGpxdWVyeS50cmVuZCBpcyBpbmNsdWRlZClcbiAgaWYgKHR5cGVvZiAkLmV2ZW50LnNwZWNpYWwudHJlbmQgIT09IFwib2JqZWN0XCIpIHtcbiAgICBjb25zb2xlLndhcm4oXCJQbGVhc2UgbWFrZSBzdXJlIGpxdWVyeS50cmVuZCBpcyBpbmNsdWRlZCEgT3RoZXJ3aXNlIHJldmVhbGVyIHdvbid0IHdvcmsuXCIpO1xuICB9XG5cbiAgLy8gU2ltcGxlIHJlcXVlc3RBbmltYXRpb25GcmFtZSBwb2x5ZmlsbFxuICB2YXIgcmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgIHdpbmRvdy5tb3pSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHxcbiAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgZnVuY3Rpb24oZm4pIHsgd2luZG93LnNldFRpbWVvdXQoZm4sIDEwMDAvNjApOyB9XG5cblxuICAvLyBQdWJsaWMgQVBJXG4gIHZhciBtZXRob2RzID0ge1xuICAgIGlzVmlzaWJsZTogZnVuY3Rpb24oZWwpIHtcbiAgICAgIHJldHVybiAhIWVsLmRhdGEoXCJyZXZlYWxlci12aXNpYmxlXCIpO1xuICAgIH0sXG5cbiAgICBzaG93OiBmdW5jdGlvbihlbCwgZm9yY2UpIHtcbiAgICAgIC8vIENoZWNrIHN0YXRlXG4gICAgICBpZiAobWV0aG9kcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICAgIGVsLnJlbW92ZUNsYXNzKFwiYW5pbWF0aW5nIGFuaW1hdGluZy1pblwiKTtcbiAgICAgICAgZWwub2ZmKFwicmV2ZWFsZXItYW5pbWF0aW5nIHJldmVhbGVyLXNob3dcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgZWwuZGF0YShcInJldmVhbGVyLXZpc2libGVcIiwgdHJ1ZSk7XG4gICAgICBlbC5vZmYoXCJ0cmVuZFwiKTtcblxuICAgICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIGVsLmFkZENsYXNzKFwidmlzaWJsZVwiKTtcbiAgICAgICAgcmFmKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgZWwudHJpZ2dlcihcInJldmVhbGVyLWFuaW1hdGluZ1wiKTtcbiAgICAgICAgICBlbC50cmlnZ2VyKFwicmV2ZWFsZXItc2hvd1wiKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmFmKGZ1bmN0aW9uKCl7XG4gICAgICAgIC8vIFN0YXJ0IGFuaW1hdGlvbiBzdGF0ZSB0cmFuc2l0aW9uXG4gICAgICAgIGVsLmFkZENsYXNzKFwiYW5pbWF0aW5nIGFuaW1hdGluZy1pblwiKTtcbiAgICAgICAgZWwudHJpZ2dlcihcInJldmVhbGVyLWFuaW1hdGluZ1wiKTtcblxuICAgICAgICByYWYoZnVuY3Rpb24oKXtcbiAgICAgICAgICBlbC5hZGRDbGFzcyhcInZpc2libGVcIik7XG5cbiAgICAgICAgICBlbC5vbmUoXCJ0cmVuZFwiLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgZWwucmVtb3ZlQ2xhc3MoXCJhbmltYXRpbmcgYW5pbWF0aW5nLWluXCIpO1xuICAgICAgICAgICAgZWwudHJpZ2dlcihcInJldmVhbGVyLXNob3dcIik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSxcblxuICAgIGhpZGU6IGZ1bmN0aW9uKGVsLCBmb3JjZSkge1xuICAgICAgLy8gQ2hlY2sgc3RhdGVcbiAgICAgIGlmICghbWV0aG9kcy5pc1Zpc2libGUoZWwpKSB7XG4gICAgICAgIGVsLnJlbW92ZUNsYXNzKFwiYW5pbWF0aW5nIGFuaW1hdGluZy1vdXQgdmlzaWJsZVwiKTtcbiAgICAgICAgZWwub2ZmKFwicmV2ZWFsZXItYW5pbWF0aW5nIHJldmVhbGVyLWhpZGVcIik7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gUmVtb3ZlIHByZXZpb3VzIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgZWwuZGF0YShcInJldmVhbGVyLXZpc2libGVcIiwgZmFsc2UpO1xuICAgICAgZWwub2ZmKFwidHJlbmRcIik7XG5cbiAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICBlbC5yZW1vdmVDbGFzcyhcInZpc2libGVcIik7XG4gICAgICAgIHJhZihmdW5jdGlvbigpe1xuICAgICAgICAgIGVsLnRyaWdnZXIoXCJyZXZlYWxlci1hbmltYXRpbmdcIik7XG4gICAgICAgICAgZWwudHJpZ2dlcihcInJldmVhbGVyLWhpZGVcIik7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJhZihmdW5jdGlvbigpe1xuICAgICAgICBlbC5hZGRDbGFzcyhcImFuaW1hdGluZyBhbmltYXRpbmctb3V0XCIpO1xuICAgICAgICBlbC50cmlnZ2VyKFwicmV2ZWFsZXItYW5pbWF0aW5nXCIpO1xuXG4gICAgICAgIHJhZihmdW5jdGlvbigpe1xuICAgICAgICAgIGVsLnJlbW92ZUNsYXNzKFwidmlzaWJsZVwiKTtcblxuICAgICAgICAgIGVsLm9uZShcInRyZW5kXCIsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBlbC5yZW1vdmVDbGFzcyhcImFuaW1hdGluZyBhbmltYXRpbmctaW4gYW5pbWF0aW5nLW91dFwiKTtcbiAgICAgICAgICAgIGVsLnRyaWdnZXIoXCJyZXZlYWxlci1oaWRlXCIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH0sXG5cbiAgICB0b2dnbGU6IGZ1bmN0aW9uKGVsLCBmb3JjZSkge1xuICAgICAgaWYgKG1ldGhvZHMuaXNWaXNpYmxlKGVsKSkge1xuICAgICAgICBtZXRob2RzLmhpZGUoZWwsIGZvcmNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1ldGhvZHMuc2hvdyhlbCwgZm9yY2UpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvLyBqUXVlcnkgcGx1Z2luXG4gICQuZm4ucmV2ZWFsZXIgPSBmdW5jdGlvbihtZXRob2QsIGZvcmNlKSB7XG4gICAgLy8gR2V0IGFjdGlvblxuICAgIHZhciBhY3Rpb24gPSBtZXRob2RzW21ldGhvZCB8fCBcInRvZ2dsZVwiXTtcbiAgICBpZiAoIWFjdGlvbikgcmV0dXJuIHRoaXM7XG5cbiAgICAvLyBSdW4gYWN0aW9uXG4gICAgaWYgKG1ldGhvZCA9PT0gXCJpc1Zpc2libGVcIikge1xuICAgICAgcmV0dXJuIGFjdGlvbih0aGlzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICBhY3Rpb24oJCh0aGlzKSwgZm9yY2UpO1xuICAgIH0pO1xuICB9O1xufSkoalF1ZXJ5KTtcbiIsIi8qKlxuICogRXZFbWl0dGVyIHYxLjEuMFxuICogTGlsJyBldmVudCBlbWl0dGVyXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbi8qIGpzaGludCB1bnVzZWQ6IHRydWUsIHVuZGVmOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi8gLyogZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgd2luZG93ICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EIC0gUmVxdWlyZUpTXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlMgLSBCcm93c2VyaWZ5LCBXZWJwYWNrXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQnJvd3NlciBnbG9iYWxzXG4gICAgZ2xvYmFsLkV2RW1pdHRlciA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KCB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBFdkVtaXR0ZXIoKSB7fVxuXG52YXIgcHJvdG8gPSBFdkVtaXR0ZXIucHJvdG90eXBlO1xuXG5wcm90by5vbiA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBzZXQgZXZlbnRzIGhhc2hcbiAgdmFyIGV2ZW50cyA9IHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IGxpc3RlbmVycyBhcnJheVxuICB2YXIgbGlzdGVuZXJzID0gZXZlbnRzWyBldmVudE5hbWUgXSA9IGV2ZW50c1sgZXZlbnROYW1lIF0gfHwgW107XG4gIC8vIG9ubHkgYWRkIG9uY2VcbiAgaWYgKCBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKSA9PSAtMSApIHtcbiAgICBsaXN0ZW5lcnMucHVzaCggbGlzdGVuZXIgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub25jZSA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGxpc3RlbmVyICkge1xuICBpZiAoICFldmVudE5hbWUgfHwgIWxpc3RlbmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGQgZXZlbnRcbiAgdGhpcy5vbiggZXZlbnROYW1lLCBsaXN0ZW5lciApO1xuICAvLyBzZXQgb25jZSBmbGFnXG4gIC8vIHNldCBvbmNlRXZlbnRzIGhhc2hcbiAgdmFyIG9uY2VFdmVudHMgPSB0aGlzLl9vbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyB8fCB7fTtcbiAgLy8gc2V0IG9uY2VMaXN0ZW5lcnMgb2JqZWN0XG4gIHZhciBvbmNlTGlzdGVuZXJzID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gPSBvbmNlRXZlbnRzWyBldmVudE5hbWUgXSB8fCB7fTtcbiAgLy8gc2V0IGZsYWdcbiAgb25jZUxpc3RlbmVyc1sgbGlzdGVuZXIgXSA9IHRydWU7XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5vZmYgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50cyAmJiB0aGlzLl9ldmVudHNbIGV2ZW50TmFtZSBdO1xuICBpZiAoICFsaXN0ZW5lcnMgfHwgIWxpc3RlbmVycy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKCBsaXN0ZW5lciApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGxpc3RlbmVycy5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLmVtaXRFdmVudCA9IGZ1bmN0aW9uKCBldmVudE5hbWUsIGFyZ3MgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBjb3B5IG92ZXIgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIGlmIC5vZmYoKSBpbiBsaXN0ZW5lclxuICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoMCk7XG4gIGFyZ3MgPSBhcmdzIHx8IFtdO1xuICAvLyBvbmNlIHN0dWZmXG4gIHZhciBvbmNlTGlzdGVuZXJzID0gdGhpcy5fb25jZUV2ZW50cyAmJiB0aGlzLl9vbmNlRXZlbnRzWyBldmVudE5hbWUgXTtcblxuICBmb3IgKCB2YXIgaT0wOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBsaXN0ZW5lciA9IGxpc3RlbmVyc1tpXVxuICAgIHZhciBpc09uY2UgPSBvbmNlTGlzdGVuZXJzICYmIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgaWYgKCBpc09uY2UgKSB7XG4gICAgICAvLyByZW1vdmUgbGlzdGVuZXJcbiAgICAgIC8vIHJlbW92ZSBiZWZvcmUgdHJpZ2dlciB0byBwcmV2ZW50IHJlY3Vyc2lvblxuICAgICAgdGhpcy5vZmYoIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgICAgIC8vIHVuc2V0IG9uY2UgZmxhZ1xuICAgICAgZGVsZXRlIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF07XG4gICAgfVxuICAgIC8vIHRyaWdnZXIgbGlzdGVuZXJcbiAgICBsaXN0ZW5lci5hcHBseSggdGhpcywgYXJncyApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5hbGxPZmYgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuX2V2ZW50cztcbiAgZGVsZXRlIHRoaXMuX29uY2VFdmVudHM7XG59O1xuXG5yZXR1cm4gRXZFbWl0dGVyO1xuXG59KSk7XG4iLCIvKiFcbiAqIGdldFNpemUgdjIuMC4yXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgc3RyaWN0OiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlICovXG4vKmdsb2JhbCBkZWZpbmU6IGZhbHNlLCBtb2R1bGU6IGZhbHNlLCBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSgpO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuZ2V0U2l6ZSA9IGZhY3RvcnkoKTtcbiAgfVxuXG59KSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdldCBhIG51bWJlciBmcm9tIGEgc3RyaW5nLCBub3QgYSBwZXJjZW50YWdlXG5mdW5jdGlvbiBnZXRTdHlsZVNpemUoIHZhbHVlICkge1xuICB2YXIgbnVtID0gcGFyc2VGbG9hdCggdmFsdWUgKTtcbiAgLy8gbm90IGEgcGVyY2VudCBsaWtlICcxMDAlJywgYW5kIGEgbnVtYmVyXG4gIHZhciBpc1ZhbGlkID0gdmFsdWUuaW5kZXhPZignJScpID09IC0xICYmICFpc05hTiggbnVtICk7XG4gIHJldHVybiBpc1ZhbGlkICYmIG51bTtcbn1cblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnZhciBsb2dFcnJvciA9IHR5cGVvZiBjb25zb2xlID09ICd1bmRlZmluZWQnID8gbm9vcCA6XG4gIGZ1bmN0aW9uKCBtZXNzYWdlICkge1xuICAgIGNvbnNvbGUuZXJyb3IoIG1lc3NhZ2UgKTtcbiAgfTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWVhc3VyZW1lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBtZWFzdXJlbWVudHMgPSBbXG4gICdwYWRkaW5nTGVmdCcsXG4gICdwYWRkaW5nUmlnaHQnLFxuICAncGFkZGluZ1RvcCcsXG4gICdwYWRkaW5nQm90dG9tJyxcbiAgJ21hcmdpbkxlZnQnLFxuICAnbWFyZ2luUmlnaHQnLFxuICAnbWFyZ2luVG9wJyxcbiAgJ21hcmdpbkJvdHRvbScsXG4gICdib3JkZXJMZWZ0V2lkdGgnLFxuICAnYm9yZGVyUmlnaHRXaWR0aCcsXG4gICdib3JkZXJUb3BXaWR0aCcsXG4gICdib3JkZXJCb3R0b21XaWR0aCdcbl07XG5cbnZhciBtZWFzdXJlbWVudHNMZW5ndGggPSBtZWFzdXJlbWVudHMubGVuZ3RoO1xuXG5mdW5jdGlvbiBnZXRaZXJvU2l6ZSgpIHtcbiAgdmFyIHNpemUgPSB7XG4gICAgd2lkdGg6IDAsXG4gICAgaGVpZ2h0OiAwLFxuICAgIGlubmVyV2lkdGg6IDAsXG4gICAgaW5uZXJIZWlnaHQ6IDAsXG4gICAgb3V0ZXJXaWR0aDogMCxcbiAgICBvdXRlckhlaWdodDogMFxuICB9O1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgbWVhc3VyZW1lbnRzTGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIG1lYXN1cmVtZW50ID0gbWVhc3VyZW1lbnRzW2ldO1xuICAgIHNpemVbIG1lYXN1cmVtZW50IF0gPSAwO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBnZXRTdHlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldFN0eWxlLCBnZXQgc3R5bGUgb2YgZWxlbWVudCwgY2hlY2sgZm9yIEZpcmVmb3ggYnVnXG4gKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NDgzOTdcbiAqL1xuZnVuY3Rpb24gZ2V0U3R5bGUoIGVsZW0gKSB7XG4gIHZhciBzdHlsZSA9IGdldENvbXB1dGVkU3R5bGUoIGVsZW0gKTtcbiAgaWYgKCAhc3R5bGUgKSB7XG4gICAgbG9nRXJyb3IoICdTdHlsZSByZXR1cm5lZCAnICsgc3R5bGUgK1xuICAgICAgJy4gQXJlIHlvdSBydW5uaW5nIHRoaXMgY29kZSBpbiBhIGhpZGRlbiBpZnJhbWUgb24gRmlyZWZveD8gJyArXG4gICAgICAnU2VlIGh0dHA6Ly9iaXQubHkvZ2V0c2l6ZWJ1ZzEnICk7XG4gIH1cbiAgcmV0dXJuIHN0eWxlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgaXNTZXR1cCA9IGZhbHNlO1xuXG52YXIgaXNCb3hTaXplT3V0ZXI7XG5cbi8qKlxuICogc2V0dXBcbiAqIGNoZWNrIGlzQm94U2l6ZXJPdXRlclxuICogZG8gb24gZmlyc3QgZ2V0U2l6ZSgpIHJhdGhlciB0aGFuIG9uIHBhZ2UgbG9hZCBmb3IgRmlyZWZveCBidWdcbiAqL1xuZnVuY3Rpb24gc2V0dXAoKSB7XG4gIC8vIHNldHVwIG9uY2VcbiAgaWYgKCBpc1NldHVwICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpc1NldHVwID0gdHJ1ZTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBib3ggc2l6aW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbiAgLyoqXG4gICAqIFdlYktpdCBtZWFzdXJlcyB0aGUgb3V0ZXItd2lkdGggb24gc3R5bGUud2lkdGggb24gYm9yZGVyLWJveCBlbGVtc1xuICAgKiBJRSAmIEZpcmVmb3g8MjkgbWVhc3VyZXMgdGhlIGlubmVyLXdpZHRoXG4gICAqL1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5zdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gIGRpdi5zdHlsZS5wYWRkaW5nID0gJzFweCAycHggM3B4IDRweCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZSggZGl2ICk7XG5cbiAgZ2V0U2l6ZS5pc0JveFNpemVPdXRlciA9IGlzQm94U2l6ZU91dGVyID0gZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApID09IDIwMDtcbiAgYm9keS5yZW1vdmVDaGlsZCggZGl2ICk7XG5cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0U2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBnZXRTaXplKCBlbGVtICkge1xuICBzZXR1cCgpO1xuXG4gIC8vIHVzZSBxdWVyeVNlbGV0b3IgaWYgZWxlbSBpcyBzdHJpbmdcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICBlbGVtID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG5cbiAgLy8gZG8gbm90IHByb2NlZWQgb24gbm9uLW9iamVjdHNcbiAgaWYgKCAhZWxlbSB8fCB0eXBlb2YgZWxlbSAhPSAnb2JqZWN0JyB8fCAhZWxlbS5ub2RlVHlwZSApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgc3R5bGUgPSBnZXRTdHlsZSggZWxlbSApO1xuXG4gIC8vIGlmIGhpZGRlbiwgZXZlcnl0aGluZyBpcyAwXG4gIGlmICggc3R5bGUuZGlzcGxheSA9PSAnbm9uZScgKSB7XG4gICAgcmV0dXJuIGdldFplcm9TaXplKCk7XG4gIH1cblxuICB2YXIgc2l6ZSA9IHt9O1xuICBzaXplLndpZHRoID0gZWxlbS5vZmZzZXRXaWR0aDtcbiAgc2l6ZS5oZWlnaHQgPSBlbGVtLm9mZnNldEhlaWdodDtcblxuICB2YXIgaXNCb3JkZXJCb3ggPSBzaXplLmlzQm9yZGVyQm94ID0gc3R5bGUuYm94U2l6aW5nID09ICdib3JkZXItYm94JztcblxuICAvLyBnZXQgYWxsIG1lYXN1cmVtZW50c1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgbWVhc3VyZW1lbnRzTGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIG1lYXN1cmVtZW50ID0gbWVhc3VyZW1lbnRzW2ldO1xuICAgIHZhciB2YWx1ZSA9IHN0eWxlWyBtZWFzdXJlbWVudCBdO1xuICAgIHZhciBudW0gPSBwYXJzZUZsb2F0KCB2YWx1ZSApO1xuICAgIC8vIGFueSAnYXV0bycsICdtZWRpdW0nIHZhbHVlIHdpbGwgYmUgMFxuICAgIHNpemVbIG1lYXN1cmVtZW50IF0gPSAhaXNOYU4oIG51bSApID8gbnVtIDogMDtcbiAgfVxuXG4gIHZhciBwYWRkaW5nV2lkdGggPSBzaXplLnBhZGRpbmdMZWZ0ICsgc2l6ZS5wYWRkaW5nUmlnaHQ7XG4gIHZhciBwYWRkaW5nSGVpZ2h0ID0gc2l6ZS5wYWRkaW5nVG9wICsgc2l6ZS5wYWRkaW5nQm90dG9tO1xuICB2YXIgbWFyZ2luV2lkdGggPSBzaXplLm1hcmdpbkxlZnQgKyBzaXplLm1hcmdpblJpZ2h0O1xuICB2YXIgbWFyZ2luSGVpZ2h0ID0gc2l6ZS5tYXJnaW5Ub3AgKyBzaXplLm1hcmdpbkJvdHRvbTtcbiAgdmFyIGJvcmRlcldpZHRoID0gc2l6ZS5ib3JkZXJMZWZ0V2lkdGggKyBzaXplLmJvcmRlclJpZ2h0V2lkdGg7XG4gIHZhciBib3JkZXJIZWlnaHQgPSBzaXplLmJvcmRlclRvcFdpZHRoICsgc2l6ZS5ib3JkZXJCb3R0b21XaWR0aDtcblxuICB2YXIgaXNCb3JkZXJCb3hTaXplT3V0ZXIgPSBpc0JvcmRlckJveCAmJiBpc0JveFNpemVPdXRlcjtcblxuICAvLyBvdmVyd3JpdGUgd2lkdGggYW5kIGhlaWdodCBpZiB3ZSBjYW4gZ2V0IGl0IGZyb20gc3R5bGVcbiAgdmFyIHN0eWxlV2lkdGggPSBnZXRTdHlsZVNpemUoIHN0eWxlLndpZHRoICk7XG4gIGlmICggc3R5bGVXaWR0aCAhPT0gZmFsc2UgKSB7XG4gICAgc2l6ZS53aWR0aCA9IHN0eWxlV2lkdGggK1xuICAgICAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB1bmxlc3MgaXQncyBhbHJlYWR5IGluY2x1ZGluZyBpdFxuICAgICAgKCBpc0JvcmRlckJveFNpemVPdXRlciA/IDAgOiBwYWRkaW5nV2lkdGggKyBib3JkZXJXaWR0aCApO1xuICB9XG5cbiAgdmFyIHN0eWxlSGVpZ2h0ID0gZ2V0U3R5bGVTaXplKCBzdHlsZS5oZWlnaHQgKTtcbiAgaWYgKCBzdHlsZUhlaWdodCAhPT0gZmFsc2UgKSB7XG4gICAgc2l6ZS5oZWlnaHQgPSBzdHlsZUhlaWdodCArXG4gICAgICAvLyBhZGQgcGFkZGluZyBhbmQgYm9yZGVyIHVubGVzcyBpdCdzIGFscmVhZHkgaW5jbHVkaW5nIGl0XG4gICAgICAoIGlzQm9yZGVyQm94U2l6ZU91dGVyID8gMCA6IHBhZGRpbmdIZWlnaHQgKyBib3JkZXJIZWlnaHQgKTtcbiAgfVxuXG4gIHNpemUuaW5uZXJXaWR0aCA9IHNpemUud2lkdGggLSAoIHBhZGRpbmdXaWR0aCArIGJvcmRlcldpZHRoICk7XG4gIHNpemUuaW5uZXJIZWlnaHQgPSBzaXplLmhlaWdodCAtICggcGFkZGluZ0hlaWdodCArIGJvcmRlckhlaWdodCApO1xuXG4gIHNpemUub3V0ZXJXaWR0aCA9IHNpemUud2lkdGggKyBtYXJnaW5XaWR0aDtcbiAgc2l6ZS5vdXRlckhlaWdodCA9IHNpemUuaGVpZ2h0ICsgbWFyZ2luSGVpZ2h0O1xuXG4gIHJldHVybiBzaXplO1xufVxuXG5yZXR1cm4gZ2V0U2l6ZTtcblxufSk7XG4iLCIvKipcbiAqIG1hdGNoZXNTZWxlY3RvciB2Mi4wLjJcbiAqIG1hdGNoZXNTZWxlY3RvciggZWxlbWVudCwgJy5zZWxlY3RvcicgKVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvKmdsb2JhbCBkZWZpbmU6IGZhbHNlLCBtb2R1bGU6IGZhbHNlICovXG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5tYXRjaGVzU2VsZWN0b3IgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1hdGNoZXNNZXRob2QgPSAoIGZ1bmN0aW9uKCkge1xuICAgIHZhciBFbGVtUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gICAgLy8gY2hlY2sgZm9yIHRoZSBzdGFuZGFyZCBtZXRob2QgbmFtZSBmaXJzdFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXMgKSB7XG4gICAgICByZXR1cm4gJ21hdGNoZXMnO1xuICAgIH1cbiAgICAvLyBjaGVjayB1bi1wcmVmaXhlZFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXNTZWxlY3RvciApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlc1NlbGVjdG9yJztcbiAgICB9XG4gICAgLy8gY2hlY2sgdmVuZG9yIHByZWZpeGVzXG4gICAgdmFyIHByZWZpeGVzID0gWyAnd2Via2l0JywgJ21veicsICdtcycsICdvJyBdO1xuXG4gICAgZm9yICggdmFyIGk9MDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgICAgdmFyIG1ldGhvZCA9IHByZWZpeCArICdNYXRjaGVzU2VsZWN0b3InO1xuICAgICAgaWYgKCBFbGVtUHJvdG9bIG1ldGhvZCBdICkge1xuICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gZWxlbVsgbWF0Y2hlc01ldGhvZCBdKCBzZWxlY3RvciApO1xuICB9O1xuXG59KSk7XG4iLCIvKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2Rlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3RvcidcbiAgICBdLCBmdW5jdGlvbiggbWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmZpenp5VUlVdGlscyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG4iLCIvLyBGbGlja2l0eS5DZWxsXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2dldC1zaXplL2dldC1zaXplJ1xuICAgIF0sIGZ1bmN0aW9uKCBnZXRTaXplICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgZ2V0U2l6ZSApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnZ2V0LXNpemUnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuRmxpY2tpdHkgPSB3aW5kb3cuRmxpY2tpdHkgfHwge307XG4gICAgd2luZG93LkZsaWNraXR5LkNlbGwgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBnZXRTaXplICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIENlbGwoIGVsZW0sIHBhcmVudCApIHtcbiAgdGhpcy5lbGVtZW50ID0gZWxlbTtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cbiAgdGhpcy5jcmVhdGUoKTtcbn1cblxudmFyIHByb3RvID0gQ2VsbC5wcm90b3R5cGU7XG5cbnByb3RvLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmVsZW1lbnQuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICB0aGlzLmVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1zZWxlY3RlZCcsICdmYWxzZScgKTtcbiAgdGhpcy54ID0gMDtcbiAgdGhpcy5zaGlmdCA9IDA7XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlc2V0IHN0eWxlXG4gIHRoaXMuZWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICcnO1xuICB2YXIgc2lkZSA9IHRoaXMucGFyZW50Lm9yaWdpblNpZGU7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnKTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlWyBzaWRlIF0gPSAnJztcbn07XG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG59O1xuXG5wcm90by5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCB4ICkge1xuICB0aGlzLnggPSB4O1xuICB0aGlzLnVwZGF0ZVRhcmdldCgpO1xuICB0aGlzLnJlbmRlclBvc2l0aW9uKCB4ICk7XG59O1xuXG4vLyBzZXREZWZhdWx0VGFyZ2V0IHYxIG1ldGhvZCwgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHJlbW92ZSBpbiB2M1xucHJvdG8udXBkYXRlVGFyZ2V0ID0gcHJvdG8uc2V0RGVmYXVsdFRhcmdldCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbWFyZ2luUHJvcGVydHkgPSB0aGlzLnBhcmVudC5vcmlnaW5TaWRlID09ICdsZWZ0JyA/ICdtYXJnaW5MZWZ0JyA6ICdtYXJnaW5SaWdodCc7XG4gIHRoaXMudGFyZ2V0ID0gdGhpcy54ICsgdGhpcy5zaXplWyBtYXJnaW5Qcm9wZXJ0eSBdICtcbiAgICB0aGlzLnNpemUud2lkdGggKiB0aGlzLnBhcmVudC5jZWxsQWxpZ247XG59O1xuXG5wcm90by5yZW5kZXJQb3NpdGlvbiA9IGZ1bmN0aW9uKCB4ICkge1xuICAvLyByZW5kZXIgcG9zaXRpb24gb2YgY2VsbCB3aXRoIGluIHNsaWRlclxuICB2YXIgc2lkZSA9IHRoaXMucGFyZW50Lm9yaWdpblNpZGU7XG4gIHRoaXMuZWxlbWVudC5zdHlsZVsgc2lkZSBdID0gdGhpcy5wYXJlbnQuZ2V0UG9zaXRpb25WYWx1ZSggeCApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGZhY3RvciAtIDAsIDEsIG9yIC0xXG4qKi9cbnByb3RvLndyYXBTaGlmdCA9IGZ1bmN0aW9uKCBzaGlmdCApIHtcbiAgdGhpcy5zaGlmdCA9IHNoaWZ0O1xuICB0aGlzLnJlbmRlclBvc2l0aW9uKCB0aGlzLnggKyB0aGlzLnBhcmVudC5zbGlkZWFibGVXaWR0aCAqIHNoaWZ0ICk7XG59O1xuXG5wcm90by5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5lbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xufTtcblxucmV0dXJuIENlbGw7XG5cbn0pKTtcbiIsIi8vIHNsaWRlXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuRmxpY2tpdHkgPSB3aW5kb3cuRmxpY2tpdHkgfHwge307XG4gICAgd2luZG93LkZsaWNraXR5LlNsaWRlID0gZmFjdG9yeSgpO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcbid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gU2xpZGUoIHBhcmVudCApIHtcbiAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gIHRoaXMuaXNPcmlnaW5MZWZ0ID0gcGFyZW50Lm9yaWdpblNpZGUgPT0gJ2xlZnQnO1xuICB0aGlzLmNlbGxzID0gW107XG4gIHRoaXMub3V0ZXJXaWR0aCA9IDA7XG4gIHRoaXMuaGVpZ2h0ID0gMDtcbn1cblxudmFyIHByb3RvID0gU2xpZGUucHJvdG90eXBlO1xuXG5wcm90by5hZGRDZWxsID0gZnVuY3Rpb24oIGNlbGwgKSB7XG4gIHRoaXMuY2VsbHMucHVzaCggY2VsbCApO1xuICB0aGlzLm91dGVyV2lkdGggKz0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIHRoaXMuaGVpZ2h0ID0gTWF0aC5tYXgoIGNlbGwuc2l6ZS5vdXRlckhlaWdodCwgdGhpcy5oZWlnaHQgKTtcbiAgLy8gZmlyc3QgY2VsbCBzdHVmZlxuICBpZiAoIHRoaXMuY2VsbHMubGVuZ3RoID09IDEgKSB7XG4gICAgdGhpcy54ID0gY2VsbC54OyAvLyB4IGNvbWVzIGZyb20gZmlyc3QgY2VsbFxuICAgIHZhciBiZWdpbk1hcmdpbiA9IHRoaXMuaXNPcmlnaW5MZWZ0ID8gJ21hcmdpbkxlZnQnIDogJ21hcmdpblJpZ2h0JztcbiAgICB0aGlzLmZpcnN0TWFyZ2luID0gY2VsbC5zaXplWyBiZWdpbk1hcmdpbiBdO1xuICB9XG59O1xuXG5wcm90by51cGRhdGVUYXJnZXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGVuZE1hcmdpbiA9IHRoaXMuaXNPcmlnaW5MZWZ0ID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcbiAgdmFyIGxhc3RDZWxsID0gdGhpcy5nZXRMYXN0Q2VsbCgpO1xuICB2YXIgbGFzdE1hcmdpbiA9IGxhc3RDZWxsID8gbGFzdENlbGwuc2l6ZVsgZW5kTWFyZ2luIF0gOiAwO1xuICB2YXIgc2xpZGVXaWR0aCA9IHRoaXMub3V0ZXJXaWR0aCAtICggdGhpcy5maXJzdE1hcmdpbiArIGxhc3RNYXJnaW4gKTtcbiAgdGhpcy50YXJnZXQgPSB0aGlzLnggKyB0aGlzLmZpcnN0TWFyZ2luICsgc2xpZGVXaWR0aCAqIHRoaXMucGFyZW50LmNlbGxBbGlnbjtcbn07XG5cbnByb3RvLmdldExhc3RDZWxsID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLmNlbGxzWyB0aGlzLmNlbGxzLmxlbmd0aCAtIDEgXTtcbn07XG5cbnByb3RvLnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNoYW5nZVNlbGVjdGVkKCB0cnVlICk7XG59O1xuXG5wcm90by51bnNlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNoYW5nZVNlbGVjdGVkKCBmYWxzZSApO1xufTtcblxucHJvdG8uY2hhbmdlU2VsZWN0ZWQgPSBmdW5jdGlvbiggaXNTZWxlY3RlZCApIHtcbiAgdmFyIGNsYXNzTWV0aG9kID0gaXNTZWxlY3RlZCA/ICdhZGQnIDogJ3JlbW92ZSc7XG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5lbGVtZW50LmNsYXNzTGlzdFsgY2xhc3NNZXRob2QgXSgnaXMtc2VsZWN0ZWQnKTtcbiAgICBjZWxsLmVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1zZWxlY3RlZCcsIGlzU2VsZWN0ZWQudG9TdHJpbmcoKSApO1xuICB9KTtcbn07XG5cbnByb3RvLmdldENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5jZWxscy5tYXAoIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIHJldHVybiBjZWxsLmVsZW1lbnQ7XG4gIH0pO1xufTtcblxucmV0dXJuIFNsaWRlO1xuXG59KSk7XG4iLCIvLyBhbmltYXRlXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJ1xuICAgIF0sIGZ1bmN0aW9uKCB1dGlscyApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIHV0aWxzICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eSB8fCB7fTtcbiAgICB3aW5kb3cuRmxpY2tpdHkuYW5pbWF0ZVByb3RvdHlwZSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYW5pbWF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSB7fTtcblxucHJvdG8uc3RhcnRBbmltYXRpb24gPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzQW5pbWF0aW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuaXNBbmltYXRpbmcgPSB0cnVlO1xuICB0aGlzLnJlc3RpbmdGcmFtZXMgPSAwO1xuICB0aGlzLmFuaW1hdGUoKTtcbn07XG5cbnByb3RvLmFuaW1hdGUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5hcHBseURyYWdGb3JjZSgpO1xuICB0aGlzLmFwcGx5U2VsZWN0ZWRBdHRyYWN0aW9uKCk7XG5cbiAgdmFyIHByZXZpb3VzWCA9IHRoaXMueDtcblxuICB0aGlzLmludGVncmF0ZVBoeXNpY3MoKTtcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xuICB0aGlzLnNldHRsZSggcHJldmlvdXNYICk7XG4gIC8vIGFuaW1hdGUgbmV4dCBmcmFtZVxuICBpZiAoIHRoaXMuaXNBbmltYXRpbmcgKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoIGZ1bmN0aW9uIGFuaW1hdGVGcmFtZSgpIHtcbiAgICAgIF90aGlzLmFuaW1hdGUoKTtcbiAgICB9KTtcbiAgfVxufTtcblxucHJvdG8ucG9zaXRpb25TbGlkZXIgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHggPSB0aGlzLng7XG4gIC8vIHdyYXAgcG9zaXRpb24gYXJvdW5kXG4gIGlmICggdGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgdGhpcy5jZWxscy5sZW5ndGggPiAxICkge1xuICAgIHggPSB1dGlscy5tb2R1bG8oIHgsIHRoaXMuc2xpZGVhYmxlV2lkdGggKTtcbiAgICB4ID0geCAtIHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gICAgdGhpcy5zaGlmdFdyYXBDZWxscyggeCApO1xuICB9XG5cbiAgeCA9IHggKyB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICAvLyByZXZlcnNlIGlmIHJpZ2h0LXRvLWxlZnQgYW5kIHVzaW5nIHRyYW5zZm9ybVxuICB4ID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gLXggOiB4O1xuICB2YXIgdmFsdWUgPSB0aGlzLmdldFBvc2l0aW9uVmFsdWUoIHggKTtcbiAgLy8gdXNlIDNEIHRyYW5mb3JtcyBmb3IgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIG9uIGlPU1xuICAvLyBidXQgdXNlIDJEIHdoZW4gc2V0dGxlZCwgZm9yIGJldHRlciBmb250LXJlbmRlcmluZ1xuICB0aGlzLnNsaWRlci5zdHlsZS50cmFuc2Zvcm0gPSB0aGlzLmlzQW5pbWF0aW5nID9cbiAgICAndHJhbnNsYXRlM2QoJyArIHZhbHVlICsgJywwLDApJyA6ICd0cmFuc2xhdGVYKCcgKyB2YWx1ZSArICcpJztcblxuICAvLyBzY3JvbGwgZXZlbnRcbiAgdmFyIGZpcnN0U2xpZGUgPSB0aGlzLnNsaWRlc1swXTtcbiAgaWYgKCBmaXJzdFNsaWRlICkge1xuICAgIHZhciBwb3NpdGlvblggPSAtdGhpcy54IC0gZmlyc3RTbGlkZS50YXJnZXQ7XG4gICAgdmFyIHByb2dyZXNzID0gcG9zaXRpb25YIC8gdGhpcy5zbGlkZXNXaWR0aDtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoICdzY3JvbGwnLCBudWxsLCBbIHByb2dyZXNzLCBwb3NpdGlvblggXSApO1xuICB9XG59O1xuXG5wcm90by5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMueCA9IC10aGlzLnNlbGVjdGVkU2xpZGUudGFyZ2V0O1xuICB0aGlzLnZlbG9jaXR5ID0gMDsgLy8gc3RvcCB3b2JibGVcbiAgdGhpcy5wb3NpdGlvblNsaWRlcigpO1xufTtcblxucHJvdG8uZ2V0UG9zaXRpb25WYWx1ZSA9IGZ1bmN0aW9uKCBwb3NpdGlvbiApIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICkge1xuICAgIC8vIHBlcmNlbnQgcG9zaXRpb24sIHJvdW5kIHRvIDIgZGlnaXRzLCBsaWtlIDEyLjM0JVxuICAgIHJldHVybiAoIE1hdGgucm91bmQoICggcG9zaXRpb24gLyB0aGlzLnNpemUuaW5uZXJXaWR0aCApICogMTAwMDAgKSAqIDAuMDEgKSsgJyUnO1xuICB9IGVsc2Uge1xuICAgIC8vIHBpeGVsIHBvc2l0aW9uaW5nXG4gICAgcmV0dXJuIE1hdGgucm91bmQoIHBvc2l0aW9uICkgKyAncHgnO1xuICB9XG59O1xuXG5wcm90by5zZXR0bGUgPSBmdW5jdGlvbiggcHJldmlvdXNYICkge1xuICAvLyBrZWVwIHRyYWNrIG9mIGZyYW1lcyB3aGVyZSB4IGhhc24ndCBtb3ZlZFxuICBpZiAoICF0aGlzLmlzUG9pbnRlckRvd24gJiYgTWF0aC5yb3VuZCggdGhpcy54ICogMTAwICkgPT0gTWF0aC5yb3VuZCggcHJldmlvdXNYICogMTAwICkgKSB7XG4gICAgdGhpcy5yZXN0aW5nRnJhbWVzKys7XG4gIH1cbiAgLy8gc3RvcCBhbmltYXRpbmcgaWYgcmVzdGluZyBmb3IgMyBvciBtb3JlIGZyYW1lc1xuICBpZiAoIHRoaXMucmVzdGluZ0ZyYW1lcyA+IDIgKSB7XG4gICAgdGhpcy5pc0FuaW1hdGluZyA9IGZhbHNlO1xuICAgIGRlbGV0ZSB0aGlzLmlzRnJlZVNjcm9sbGluZztcbiAgICAvLyByZW5kZXIgcG9zaXRpb24gd2l0aCB0cmFuc2xhdGVYIHdoZW4gc2V0dGxlZFxuICAgIHRoaXMucG9zaXRpb25TbGlkZXIoKTtcbiAgICB0aGlzLmRpc3BhdGNoRXZlbnQoICdzZXR0bGUnLCBudWxsLCBbIHRoaXMuc2VsZWN0ZWRJbmRleCBdICk7XG4gIH1cbn07XG5cbnByb3RvLnNoaWZ0V3JhcENlbGxzID0gZnVuY3Rpb24oIHggKSB7XG4gIC8vIHNoaWZ0IGJlZm9yZSBjZWxsc1xuICB2YXIgYmVmb3JlR2FwID0gdGhpcy5jdXJzb3JQb3NpdGlvbiArIHg7XG4gIHRoaXMuX3NoaWZ0Q2VsbHMoIHRoaXMuYmVmb3JlU2hpZnRDZWxscywgYmVmb3JlR2FwLCAtMSApO1xuICAvLyBzaGlmdCBhZnRlciBjZWxsc1xuICB2YXIgYWZ0ZXJHYXAgPSB0aGlzLnNpemUuaW5uZXJXaWR0aCAtICggeCArIHRoaXMuc2xpZGVhYmxlV2lkdGggKyB0aGlzLmN1cnNvclBvc2l0aW9uICk7XG4gIHRoaXMuX3NoaWZ0Q2VsbHMoIHRoaXMuYWZ0ZXJTaGlmdENlbGxzLCBhZnRlckdhcCwgMSApO1xufTtcblxucHJvdG8uX3NoaWZ0Q2VsbHMgPSBmdW5jdGlvbiggY2VsbHMsIGdhcCwgc2hpZnQgKSB7XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgY2VsbCA9IGNlbGxzW2ldO1xuICAgIHZhciBjZWxsU2hpZnQgPSBnYXAgPiAwID8gc2hpZnQgOiAwO1xuICAgIGNlbGwud3JhcFNoaWZ0KCBjZWxsU2hpZnQgKTtcbiAgICBnYXAgLT0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gIH1cbn07XG5cbnByb3RvLl91bnNoaWZ0Q2VsbHMgPSBmdW5jdGlvbiggY2VsbHMgKSB7XG4gIGlmICggIWNlbGxzIHx8ICFjZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoIHZhciBpPTA7IGkgPCBjZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICBjZWxsc1tpXS53cmFwU2hpZnQoIDAgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGh5c2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5pbnRlZ3JhdGVQaHlzaWNzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMueCArPSB0aGlzLnZlbG9jaXR5O1xuICB0aGlzLnZlbG9jaXR5ICo9IHRoaXMuZ2V0RnJpY3Rpb25GYWN0b3IoKTtcbn07XG5cbnByb3RvLmFwcGx5Rm9yY2UgPSBmdW5jdGlvbiggZm9yY2UgKSB7XG4gIHRoaXMudmVsb2NpdHkgKz0gZm9yY2U7XG59O1xuXG5wcm90by5nZXRGcmljdGlvbkZhY3RvciA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gMSAtIHRoaXMub3B0aW9uc1sgdGhpcy5pc0ZyZWVTY3JvbGxpbmcgPyAnZnJlZVNjcm9sbEZyaWN0aW9uJyA6ICdmcmljdGlvbicgXTtcbn07XG5cbnByb3RvLmdldFJlc3RpbmdQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBteSB0aGFua3MgdG8gU3RldmVuIFdpdHRlbnMsIHdobyBzaW1wbGlmaWVkIHRoaXMgbWF0aCBncmVhdGx5XG4gIHJldHVybiB0aGlzLnggKyB0aGlzLnZlbG9jaXR5IC8gKCAxIC0gdGhpcy5nZXRGcmljdGlvbkZhY3RvcigpICk7XG59O1xuXG5wcm90by5hcHBseURyYWdGb3JjZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlIHx8ICF0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGNoYW5nZSB0aGUgcG9zaXRpb24gdG8gZHJhZyBwb3NpdGlvbiBieSBhcHBseWluZyBmb3JjZVxuICB2YXIgZHJhZ1ZlbG9jaXR5ID0gdGhpcy5kcmFnWCAtIHRoaXMueDtcbiAgdmFyIGRyYWdGb3JjZSA9IGRyYWdWZWxvY2l0eSAtIHRoaXMudmVsb2NpdHk7XG4gIHRoaXMuYXBwbHlGb3JjZSggZHJhZ0ZvcmNlICk7XG59O1xuXG5wcm90by5hcHBseVNlbGVjdGVkQXR0cmFjdGlvbiA9IGZ1bmN0aW9uKCkge1xuICAvLyBkbyBub3QgYXR0cmFjdCBpZiBwb2ludGVyIGRvd24gb3Igbm8gc2xpZGVzXG4gIHZhciBkcmFnRG93biA9IHRoaXMuaXNEcmFnZ2FibGUgJiYgdGhpcy5pc1BvaW50ZXJEb3duO1xuICBpZiAoIGRyYWdEb3duIHx8IHRoaXMuaXNGcmVlU2Nyb2xsaW5nIHx8ICF0aGlzLnNsaWRlcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBkaXN0YW5jZSA9IHRoaXMuc2VsZWN0ZWRTbGlkZS50YXJnZXQgKiAtMSAtIHRoaXMueDtcbiAgdmFyIGZvcmNlID0gZGlzdGFuY2UgKiB0aGlzLm9wdGlvbnMuc2VsZWN0ZWRBdHRyYWN0aW9uO1xuICB0aGlzLmFwcGx5Rm9yY2UoIGZvcmNlICk7XG59O1xuXG5yZXR1cm4gcHJvdG87XG5cbn0pKTtcbiIsIi8vIEZsaWNraXR5IG1haW5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnZXYtZW1pdHRlci9ldi1lbWl0dGVyJyxcbiAgICAgICdnZXQtc2l6ZS9nZXQtc2l6ZScsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnLFxuICAgICAgJy4vY2VsbCcsXG4gICAgICAnLi9zbGlkZScsXG4gICAgICAnLi9hbmltYXRlJ1xuICAgIF0sIGZ1bmN0aW9uKCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBDZWxsLCBTbGlkZSwgYW5pbWF0ZVByb3RvdHlwZSApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSwgdXRpbHMsIENlbGwsIFNsaWRlLCBhbmltYXRlUHJvdG90eXBlICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJyksXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKSxcbiAgICAgIHJlcXVpcmUoJy4vY2VsbCcpLFxuICAgICAgcmVxdWlyZSgnLi9zbGlkZScpLFxuICAgICAgcmVxdWlyZSgnLi9hbmltYXRlJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgdmFyIF9GbGlja2l0eSA9IHdpbmRvdy5GbGlja2l0eTtcblxuICAgIHdpbmRvdy5GbGlja2l0eSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgd2luZG93LmdldFNpemUsXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzLFxuICAgICAgX0ZsaWNraXR5LkNlbGwsXG4gICAgICBfRmxpY2tpdHkuU2xpZGUsXG4gICAgICBfRmxpY2tpdHkuYW5pbWF0ZVByb3RvdHlwZVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciwgZ2V0U2l6ZSxcbiAgdXRpbHMsIENlbGwsIFNsaWRlLCBhbmltYXRlUHJvdG90eXBlICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIHZhcnNcbnZhciBqUXVlcnkgPSB3aW5kb3cualF1ZXJ5O1xudmFyIGdldENvbXB1dGVkU3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtcbnZhciBjb25zb2xlID0gd2luZG93LmNvbnNvbGU7XG5cbmZ1bmN0aW9uIG1vdmVFbGVtZW50cyggZWxlbXMsIHRvRWxlbSApIHtcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHdoaWxlICggZWxlbXMubGVuZ3RoICkge1xuICAgIHRvRWxlbS5hcHBlbmRDaGlsZCggZWxlbXMuc2hpZnQoKSApO1xuICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGdsb2JhbGx5IHVuaXF1ZSBpZGVudGlmaWVyc1xudmFyIEdVSUQgPSAwO1xuLy8gaW50ZXJuYWwgc3RvcmUgb2YgYWxsIEZsaWNraXR5IGludGFuY2VzXG52YXIgaW5zdGFuY2VzID0ge307XG5cbmZ1bmN0aW9uIEZsaWNraXR5KCBlbGVtZW50LCBvcHRpb25zICkge1xuICB2YXIgcXVlcnlFbGVtZW50ID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtZW50ICk7XG4gIGlmICggIXF1ZXJ5RWxlbWVudCApIHtcbiAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCAnQmFkIGVsZW1lbnQgZm9yIEZsaWNraXR5OiAnICsgKCBxdWVyeUVsZW1lbnQgfHwgZWxlbWVudCApICk7XG4gICAgfVxuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQgPSBxdWVyeUVsZW1lbnQ7XG4gIC8vIGRvIG5vdCBpbml0aWFsaXplIHR3aWNlIG9uIHNhbWUgZWxlbWVudFxuICBpZiAoIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQgKSB7XG4gICAgdmFyIGluc3RhbmNlID0gaW5zdGFuY2VzWyB0aGlzLmVsZW1lbnQuZmxpY2tpdHlHVUlEIF07XG4gICAgaW5zdGFuY2Uub3B0aW9uKCBvcHRpb25zICk7XG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9XG5cbiAgLy8gYWRkIGpRdWVyeVxuICBpZiAoIGpRdWVyeSApIHtcbiAgICB0aGlzLiRlbGVtZW50ID0galF1ZXJ5KCB0aGlzLmVsZW1lbnQgKTtcbiAgfVxuICAvLyBvcHRpb25zXG4gIHRoaXMub3B0aW9ucyA9IHV0aWxzLmV4dGVuZCgge30sIHRoaXMuY29uc3RydWN0b3IuZGVmYXVsdHMgKTtcbiAgdGhpcy5vcHRpb24oIG9wdGlvbnMgKTtcblxuICAvLyBraWNrIHRoaW5ncyBvZmZcbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cbkZsaWNraXR5LmRlZmF1bHRzID0ge1xuICBhY2Nlc3NpYmlsaXR5OiB0cnVlLFxuICAvLyBhZGFwdGl2ZUhlaWdodDogZmFsc2UsXG4gIGNlbGxBbGlnbjogJ2NlbnRlcicsXG4gIC8vIGNlbGxTZWxlY3RvcjogdW5kZWZpbmVkLFxuICAvLyBjb250YWluOiBmYWxzZSxcbiAgZnJlZVNjcm9sbEZyaWN0aW9uOiAwLjA3NSwgLy8gZnJpY3Rpb24gd2hlbiBmcmVlLXNjcm9sbGluZ1xuICBmcmljdGlvbjogMC4yOCwgLy8gZnJpY3Rpb24gd2hlbiBzZWxlY3RpbmdcbiAgbmFtZXNwYWNlSlF1ZXJ5RXZlbnRzOiB0cnVlLFxuICAvLyBpbml0aWFsSW5kZXg6IDAsXG4gIHBlcmNlbnRQb3NpdGlvbjogdHJ1ZSxcbiAgcmVzaXplOiB0cnVlLFxuICBzZWxlY3RlZEF0dHJhY3Rpb246IDAuMDI1LFxuICBzZXRHYWxsZXJ5U2l6ZTogdHJ1ZVxuICAvLyB3YXRjaENTUzogZmFsc2UsXG4gIC8vIHdyYXBBcm91bmQ6IGZhbHNlXG59O1xuXG4vLyBoYXNoIG9mIG1ldGhvZHMgdHJpZ2dlcmVkIG9uIF9jcmVhdGUoKVxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcyA9IFtdO1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG4vLyBpbmhlcml0IEV2ZW50RW1pdHRlclxudXRpbHMuZXh0ZW5kKCBwcm90bywgRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG5wcm90by5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGFkZCBpZCBmb3IgRmxpY2tpdHkuZGF0YVxuICB2YXIgaWQgPSB0aGlzLmd1aWQgPSArK0dVSUQ7XG4gIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQgPSBpZDsgLy8gZXhwYW5kb1xuICBpbnN0YW5jZXNbIGlkIF0gPSB0aGlzOyAvLyBhc3NvY2lhdGUgdmlhIGlkXG4gIC8vIGluaXRpYWwgcHJvcGVydGllc1xuICB0aGlzLnNlbGVjdGVkSW5kZXggPSAwO1xuICAvLyBob3cgbWFueSBmcmFtZXMgc2xpZGVyIGhhcyBiZWVuIGluIHNhbWUgcG9zaXRpb25cbiAgdGhpcy5yZXN0aW5nRnJhbWVzID0gMDtcbiAgLy8gaW5pdGlhbCBwaHlzaWNzIHByb3BlcnRpZXNcbiAgdGhpcy54ID0gMDtcbiAgdGhpcy52ZWxvY2l0eSA9IDA7XG4gIHRoaXMub3JpZ2luU2lkZSA9IHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCA/ICdyaWdodCcgOiAnbGVmdCc7XG4gIC8vIGNyZWF0ZSB2aWV3cG9ydCAmIHNsaWRlclxuICB0aGlzLnZpZXdwb3J0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIHRoaXMudmlld3BvcnQuY2xhc3NOYW1lID0gJ2ZsaWNraXR5LXZpZXdwb3J0JztcbiAgdGhpcy5fY3JlYXRlU2xpZGVyKCk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMucmVzaXplIHx8IHRoaXMub3B0aW9ucy53YXRjaENTUyApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgfVxuXG4gIC8vIGFkZCBsaXN0ZW5lcnMgZnJvbSBvbiBvcHRpb25cbiAgZm9yICggdmFyIGV2ZW50TmFtZSBpbiB0aGlzLm9wdGlvbnMub24gKSB7XG4gICAgdmFyIGxpc3RlbmVyID0gdGhpcy5vcHRpb25zLm9uWyBldmVudE5hbWUgXTtcbiAgICB0aGlzLm9uKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gIH1cblxuICBGbGlja2l0eS5jcmVhdGVNZXRob2RzLmZvckVhY2goIGZ1bmN0aW9uKCBtZXRob2QgKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oKTtcbiAgfSwgdGhpcyApO1xuXG4gIGlmICggdGhpcy5vcHRpb25zLndhdGNoQ1NTICkge1xuICAgIHRoaXMud2F0Y2hDU1MoKTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLmFjdGl2YXRlKCk7XG4gIH1cblxufTtcblxuLyoqXG4gKiBzZXQgb3B0aW9uc1xuICogQHBhcmFtIHtPYmplY3R9IG9wdHNcbiAqL1xucHJvdG8ub3B0aW9uID0gZnVuY3Rpb24oIG9wdHMgKSB7XG4gIHV0aWxzLmV4dGVuZCggdGhpcy5vcHRpb25zLCBvcHRzICk7XG59O1xuXG5wcm90by5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuaXNBY3RpdmUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuaXNBY3RpdmUgPSB0cnVlO1xuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmxpY2tpdHktZW5hYmxlZCcpO1xuICBpZiAoIHRoaXMub3B0aW9ucy5yaWdodFRvTGVmdCApIHtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZmxpY2tpdHktcnRsJyk7XG4gIH1cblxuICB0aGlzLmdldFNpemUoKTtcbiAgLy8gbW92ZSBpbml0aWFsIGNlbGwgZWxlbWVudHMgc28gdGhleSBjYW4gYmUgbG9hZGVkIGFzIGNlbGxzXG4gIHZhciBjZWxsRWxlbXMgPSB0aGlzLl9maWx0ZXJGaW5kQ2VsbEVsZW1lbnRzKCB0aGlzLmVsZW1lbnQuY2hpbGRyZW4gKTtcbiAgbW92ZUVsZW1lbnRzKCBjZWxsRWxlbXMsIHRoaXMuc2xpZGVyICk7XG4gIHRoaXMudmlld3BvcnQuYXBwZW5kQ2hpbGQoIHRoaXMuc2xpZGVyICk7XG4gIHRoaXMuZWxlbWVudC5hcHBlbmRDaGlsZCggdGhpcy52aWV3cG9ydCApO1xuICAvLyBnZXQgY2VsbHMgZnJvbSBjaGlsZHJlblxuICB0aGlzLnJlbG9hZENlbGxzKCk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMuYWNjZXNzaWJpbGl0eSApIHtcbiAgICAvLyBhbGxvdyBlbGVtZW50IHRvIGZvY3VzYWJsZVxuICAgIHRoaXMuZWxlbWVudC50YWJJbmRleCA9IDA7XG4gICAgLy8gbGlzdGVuIGZvciBrZXkgcHJlc3Nlc1xuICAgIHRoaXMuZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCAna2V5ZG93bicsIHRoaXMgKTtcbiAgfVxuXG4gIHRoaXMuZW1pdEV2ZW50KCdhY3RpdmF0ZScpO1xuXG4gIHZhciBpbmRleDtcbiAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMub3B0aW9ucy5pbml0aWFsSW5kZXg7XG4gIGlmICggdGhpcy5pc0luaXRBY3RpdmF0ZWQgKSB7XG4gICAgaW5kZXggPSB0aGlzLnNlbGVjdGVkSW5kZXg7XG4gIH0gZWxzZSBpZiAoIGluaXRpYWxJbmRleCAhPT0gdW5kZWZpbmVkICkge1xuICAgIGluZGV4ID0gdGhpcy5jZWxsc1sgaW5pdGlhbEluZGV4IF0gPyBpbml0aWFsSW5kZXggOiAwO1xuICB9IGVsc2Uge1xuICAgIGluZGV4ID0gMDtcbiAgfVxuICAvLyBzZWxlY3QgaW5zdGFudGx5XG4gIHRoaXMuc2VsZWN0KCBpbmRleCwgZmFsc2UsIHRydWUgKTtcbiAgLy8gZmxhZyBmb3IgaW5pdGlhbCBhY3RpdmF0aW9uLCBmb3IgdXNpbmcgaW5pdGlhbEluZGV4XG4gIHRoaXMuaXNJbml0QWN0aXZhdGVkID0gdHJ1ZTtcbiAgLy8gcmVhZHkgZXZlbnQuICM0OTNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCdyZWFkeScpO1xufTtcblxuLy8gc2xpZGVyIHBvc2l0aW9ucyB0aGUgY2VsbHNcbnByb3RvLl9jcmVhdGVTbGlkZXIgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2xpZGVyIGVsZW1lbnQgZG9lcyBhbGwgdGhlIHBvc2l0aW9uaW5nXG4gIHZhciBzbGlkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgc2xpZGVyLmNsYXNzTmFtZSA9ICdmbGlja2l0eS1zbGlkZXInO1xuICBzbGlkZXIuc3R5bGVbIHRoaXMub3JpZ2luU2lkZSBdID0gMDtcbiAgdGhpcy5zbGlkZXIgPSBzbGlkZXI7XG59O1xuXG5wcm90by5fZmlsdGVyRmluZENlbGxFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgcmV0dXJuIHV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyggZWxlbXMsIHRoaXMub3B0aW9ucy5jZWxsU2VsZWN0b3IgKTtcbn07XG5cbi8vIGdvZXMgdGhyb3VnaCBhbGwgY2hpbGRyZW5cbnByb3RvLnJlbG9hZENlbGxzID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNvbGxlY3Rpb24gb2YgaXRlbSBlbGVtZW50c1xuICB0aGlzLmNlbGxzID0gdGhpcy5fbWFrZUNlbGxzKCB0aGlzLnNsaWRlci5jaGlsZHJlbiApO1xuICB0aGlzLnBvc2l0aW9uQ2VsbHMoKTtcbiAgdGhpcy5fZ2V0V3JhcFNoaWZ0Q2VsbHMoKTtcbiAgdGhpcy5zZXRHYWxsZXJ5U2l6ZSgpO1xufTtcblxuLyoqXG4gKiB0dXJuIGVsZW1lbnRzIGludG8gRmxpY2tpdHkuQ2VsbHNcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgSFRNTEVsZW1lbnR9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gY29sbGVjdGlvbiBvZiBuZXcgRmxpY2tpdHkgQ2VsbHNcbiAqL1xucHJvdG8uX21ha2VDZWxscyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGNlbGxFbGVtcyA9IHRoaXMuX2ZpbHRlckZpbmRDZWxsRWxlbWVudHMoIGVsZW1zICk7XG5cbiAgLy8gY3JlYXRlIG5ldyBGbGlja2l0eSBmb3IgY29sbGVjdGlvblxuICB2YXIgY2VsbHMgPSBjZWxsRWxlbXMubWFwKCBmdW5jdGlvbiggY2VsbEVsZW0gKSB7XG4gICAgcmV0dXJuIG5ldyBDZWxsKCBjZWxsRWxlbSwgdGhpcyApO1xuICB9LCB0aGlzICk7XG5cbiAgcmV0dXJuIGNlbGxzO1xufTtcblxucHJvdG8uZ2V0TGFzdENlbGwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHNbIHRoaXMuY2VsbHMubGVuZ3RoIC0gMSBdO1xufTtcblxucHJvdG8uZ2V0TGFzdFNsaWRlID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiB0aGlzLnNsaWRlc1sgdGhpcy5zbGlkZXMubGVuZ3RoIC0gMSBdO1xufTtcblxuLy8gcG9zaXRpb25zIGFsbCBjZWxsc1xucHJvdG8ucG9zaXRpb25DZWxscyA9IGZ1bmN0aW9uKCkge1xuICAvLyBzaXplIGFsbCBjZWxsc1xuICB0aGlzLl9zaXplQ2VsbHMoIHRoaXMuY2VsbHMgKTtcbiAgLy8gcG9zaXRpb24gYWxsIGNlbGxzXG4gIHRoaXMuX3Bvc2l0aW9uQ2VsbHMoIDAgKTtcbn07XG5cbi8qKlxuICogcG9zaXRpb24gY2VydGFpbiBjZWxsc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCAtIHdoaWNoIGNlbGwgdG8gc3RhcnQgd2l0aFxuICovXG5wcm90by5fcG9zaXRpb25DZWxscyA9IGZ1bmN0aW9uKCBpbmRleCApIHtcbiAgaW5kZXggPSBpbmRleCB8fCAwO1xuICAvLyBhbHNvIG1lYXN1cmUgbWF4Q2VsbEhlaWdodFxuICAvLyBzdGFydCAwIGlmIHBvc2l0aW9uaW5nIGFsbCBjZWxsc1xuICB0aGlzLm1heENlbGxIZWlnaHQgPSBpbmRleCA/IHRoaXMubWF4Q2VsbEhlaWdodCB8fCAwIDogMDtcbiAgdmFyIGNlbGxYID0gMDtcbiAgLy8gZ2V0IGNlbGxYXG4gIGlmICggaW5kZXggPiAwICkge1xuICAgIHZhciBzdGFydENlbGwgPSB0aGlzLmNlbGxzWyBpbmRleCAtIDEgXTtcbiAgICBjZWxsWCA9IHN0YXJ0Q2VsbC54ICsgc3RhcnRDZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgfVxuICB2YXIgbGVuID0gdGhpcy5jZWxscy5sZW5ndGg7XG4gIGZvciAoIHZhciBpPWluZGV4OyBpIDwgbGVuOyBpKysgKSB7XG4gICAgdmFyIGNlbGwgPSB0aGlzLmNlbGxzW2ldO1xuICAgIGNlbGwuc2V0UG9zaXRpb24oIGNlbGxYICk7XG4gICAgY2VsbFggKz0gY2VsbC5zaXplLm91dGVyV2lkdGg7XG4gICAgdGhpcy5tYXhDZWxsSGVpZ2h0ID0gTWF0aC5tYXgoIGNlbGwuc2l6ZS5vdXRlckhlaWdodCwgdGhpcy5tYXhDZWxsSGVpZ2h0ICk7XG4gIH1cbiAgLy8ga2VlcCB0cmFjayBvZiBjZWxsWCBmb3Igd3JhcC1hcm91bmRcbiAgdGhpcy5zbGlkZWFibGVXaWR0aCA9IGNlbGxYO1xuICAvLyBzbGlkZXNcbiAgdGhpcy51cGRhdGVTbGlkZXMoKTtcbiAgLy8gY29udGFpbiBzbGlkZXMgdGFyZ2V0XG4gIHRoaXMuX2NvbnRhaW5TbGlkZXMoKTtcbiAgLy8gdXBkYXRlIHNsaWRlc1dpZHRoXG4gIHRoaXMuc2xpZGVzV2lkdGggPSBsZW4gPyB0aGlzLmdldExhc3RTbGlkZSgpLnRhcmdldCAtIHRoaXMuc2xpZGVzWzBdLnRhcmdldCA6IDA7XG59O1xuXG4vKipcbiAqIGNlbGwuZ2V0U2l6ZSgpIG9uIG11bHRpcGxlIGNlbGxzXG4gKiBAcGFyYW0ge0FycmF5fSBjZWxsc1xuICovXG5wcm90by5fc2l6ZUNlbGxzID0gZnVuY3Rpb24oIGNlbGxzICkge1xuICBjZWxscy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICBjZWxsLmdldFNpemUoKTtcbiAgfSk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucHJvdG8udXBkYXRlU2xpZGVzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2xpZGVzID0gW107XG4gIGlmICggIXRoaXMuY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBzbGlkZSA9IG5ldyBTbGlkZSggdGhpcyApO1xuICB0aGlzLnNsaWRlcy5wdXNoKCBzbGlkZSApO1xuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5vcmlnaW5TaWRlID09ICdsZWZ0JztcbiAgdmFyIG5leHRNYXJnaW4gPSBpc09yaWdpbkxlZnQgPyAnbWFyZ2luUmlnaHQnIDogJ21hcmdpbkxlZnQnO1xuXG4gIHZhciBjYW5DZWxsRml0ID0gdGhpcy5fZ2V0Q2FuQ2VsbEZpdCgpO1xuXG4gIHRoaXMuY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwsIGkgKSB7XG4gICAgLy8ganVzdCBhZGQgY2VsbCBpZiBmaXJzdCBjZWxsIGluIHNsaWRlXG4gICAgaWYgKCAhc2xpZGUuY2VsbHMubGVuZ3RoICkge1xuICAgICAgc2xpZGUuYWRkQ2VsbCggY2VsbCApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzbGlkZVdpZHRoID0gKCBzbGlkZS5vdXRlcldpZHRoIC0gc2xpZGUuZmlyc3RNYXJnaW4gKSArXG4gICAgICAoIGNlbGwuc2l6ZS5vdXRlcldpZHRoIC0gY2VsbC5zaXplWyBuZXh0TWFyZ2luIF0gKTtcblxuICAgIGlmICggY2FuQ2VsbEZpdC5jYWxsKCB0aGlzLCBpLCBzbGlkZVdpZHRoICkgKSB7XG4gICAgICBzbGlkZS5hZGRDZWxsKCBjZWxsICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGRvZXNuJ3QgZml0LCBuZXcgc2xpZGVcbiAgICAgIHNsaWRlLnVwZGF0ZVRhcmdldCgpO1xuXG4gICAgICBzbGlkZSA9IG5ldyBTbGlkZSggdGhpcyApO1xuICAgICAgdGhpcy5zbGlkZXMucHVzaCggc2xpZGUgKTtcbiAgICAgIHNsaWRlLmFkZENlbGwoIGNlbGwgKTtcbiAgICB9XG4gIH0sIHRoaXMgKTtcbiAgLy8gbGFzdCBzbGlkZVxuICBzbGlkZS51cGRhdGVUYXJnZXQoKTtcbiAgLy8gdXBkYXRlIC5zZWxlY3RlZFNsaWRlXG4gIHRoaXMudXBkYXRlU2VsZWN0ZWRTbGlkZSgpO1xufTtcblxucHJvdG8uX2dldENhbkNlbGxGaXQgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGdyb3VwQ2VsbHMgPSB0aGlzLm9wdGlvbnMuZ3JvdXBDZWxscztcbiAgaWYgKCAhZ3JvdXBDZWxscyApIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIGdyb3VwQ2VsbHMgPT0gJ251bWJlcicgKSB7XG4gICAgLy8gZ3JvdXAgYnkgbnVtYmVyLiAzIC0+IFswLDEsMl0sIFszLDQsNV0sIC4uLlxuICAgIHZhciBudW1iZXIgPSBwYXJzZUludCggZ3JvdXBDZWxscywgMTAgKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oIGkgKSB7XG4gICAgICByZXR1cm4gKCBpICUgbnVtYmVyICkgIT09IDA7XG4gICAgfTtcbiAgfVxuICAvLyBkZWZhdWx0LCBncm91cCBieSB3aWR0aCBvZiBzbGlkZVxuICAvLyBwYXJzZSAnNzUlXG4gIHZhciBwZXJjZW50TWF0Y2ggPSB0eXBlb2YgZ3JvdXBDZWxscyA9PSAnc3RyaW5nJyAmJlxuICAgIGdyb3VwQ2VsbHMubWF0Y2goL14oXFxkKyklJC8pO1xuICB2YXIgcGVyY2VudCA9IHBlcmNlbnRNYXRjaCA/IHBhcnNlSW50KCBwZXJjZW50TWF0Y2hbMV0sIDEwICkgLyAxMDAgOiAxO1xuICByZXR1cm4gZnVuY3Rpb24oIGksIHNsaWRlV2lkdGggKSB7XG4gICAgcmV0dXJuIHNsaWRlV2lkdGggPD0gKCB0aGlzLnNpemUuaW5uZXJXaWR0aCArIDEgKSAqIHBlcmNlbnQ7XG4gIH07XG59O1xuXG4vLyBhbGlhcyBfaW5pdCBmb3IgalF1ZXJ5IHBsdWdpbiAuZmxpY2tpdHkoKVxucHJvdG8uX2luaXQgPVxucHJvdG8ucmVwb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBvc2l0aW9uQ2VsbHMoKTtcbiAgdGhpcy5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQoKTtcbn07XG5cbnByb3RvLmdldFNpemUgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG4gIHRoaXMuc2V0Q2VsbEFsaWduKCk7XG4gIHRoaXMuY3Vyc29yUG9zaXRpb24gPSB0aGlzLnNpemUuaW5uZXJXaWR0aCAqIHRoaXMuY2VsbEFsaWduO1xufTtcblxudmFyIGNlbGxBbGlnblNob3J0aGFuZHMgPSB7XG4gIC8vIGNlbGwgYWxpZ24sIHRoZW4gYmFzZWQgb24gb3JpZ2luIHNpZGVcbiAgY2VudGVyOiB7XG4gICAgbGVmdDogMC41LFxuICAgIHJpZ2h0OiAwLjVcbiAgfSxcbiAgbGVmdDoge1xuICAgIGxlZnQ6IDAsXG4gICAgcmlnaHQ6IDFcbiAgfSxcbiAgcmlnaHQ6IHtcbiAgICByaWdodDogMCxcbiAgICBsZWZ0OiAxXG4gIH1cbn07XG5cbnByb3RvLnNldENlbGxBbGlnbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc2hvcnRoYW5kID0gY2VsbEFsaWduU2hvcnRoYW5kc1sgdGhpcy5vcHRpb25zLmNlbGxBbGlnbiBdO1xuICB0aGlzLmNlbGxBbGlnbiA9IHNob3J0aGFuZCA/IHNob3J0aGFuZFsgdGhpcy5vcmlnaW5TaWRlIF0gOiB0aGlzLm9wdGlvbnMuY2VsbEFsaWduO1xufTtcblxucHJvdG8uc2V0R2FsbGVyeVNpemUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLm9wdGlvbnMuc2V0R2FsbGVyeVNpemUgKSB7XG4gICAgdmFyIGhlaWdodCA9IHRoaXMub3B0aW9ucy5hZGFwdGl2ZUhlaWdodCAmJiB0aGlzLnNlbGVjdGVkU2xpZGUgP1xuICAgICAgdGhpcy5zZWxlY3RlZFNsaWRlLmhlaWdodCA6IHRoaXMubWF4Q2VsbEhlaWdodDtcbiAgICB0aGlzLnZpZXdwb3J0LnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7XG4gIH1cbn07XG5cbnByb3RvLl9nZXRXcmFwU2hpZnRDZWxscyA9IGZ1bmN0aW9uKCkge1xuICAvLyBvbmx5IGZvciB3cmFwLWFyb3VuZFxuICBpZiAoICF0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdW5zaGlmdCBwcmV2aW91cyBjZWxsc1xuICB0aGlzLl91bnNoaWZ0Q2VsbHMoIHRoaXMuYmVmb3JlU2hpZnRDZWxscyApO1xuICB0aGlzLl91bnNoaWZ0Q2VsbHMoIHRoaXMuYWZ0ZXJTaGlmdENlbGxzICk7XG4gIC8vIGdldCBiZWZvcmUgY2VsbHNcbiAgLy8gaW5pdGlhbCBnYXBcbiAgdmFyIGdhcFggPSB0aGlzLmN1cnNvclBvc2l0aW9uO1xuICB2YXIgY2VsbEluZGV4ID0gdGhpcy5jZWxscy5sZW5ndGggLSAxO1xuICB0aGlzLmJlZm9yZVNoaWZ0Q2VsbHMgPSB0aGlzLl9nZXRHYXBDZWxscyggZ2FwWCwgY2VsbEluZGV4LCAtMSApO1xuICAvLyBnZXQgYWZ0ZXIgY2VsbHNcbiAgLy8gZW5kaW5nIGdhcCBiZXR3ZWVuIGxhc3QgY2VsbCBhbmQgZW5kIG9mIGdhbGxlcnkgdmlld3BvcnRcbiAgZ2FwWCA9IHRoaXMuc2l6ZS5pbm5lcldpZHRoIC0gdGhpcy5jdXJzb3JQb3NpdGlvbjtcbiAgLy8gc3RhcnQgY2xvbmluZyBhdCBmaXJzdCBjZWxsLCB3b3JraW5nIGZvcndhcmRzXG4gIHRoaXMuYWZ0ZXJTaGlmdENlbGxzID0gdGhpcy5fZ2V0R2FwQ2VsbHMoIGdhcFgsIDAsIDEgKTtcbn07XG5cbnByb3RvLl9nZXRHYXBDZWxscyA9IGZ1bmN0aW9uKCBnYXBYLCBjZWxsSW5kZXgsIGluY3JlbWVudCApIHtcbiAgLy8ga2VlcCBhZGRpbmcgY2VsbHMgdW50aWwgdGhlIGNvdmVyIHRoZSBpbml0aWFsIGdhcFxuICB2YXIgY2VsbHMgPSBbXTtcbiAgd2hpbGUgKCBnYXBYID4gMCApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbIGNlbGxJbmRleCBdO1xuICAgIGlmICggIWNlbGwgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2VsbHMucHVzaCggY2VsbCApO1xuICAgIGNlbGxJbmRleCArPSBpbmNyZW1lbnQ7XG4gICAgZ2FwWCAtPSBjZWxsLnNpemUub3V0ZXJXaWR0aDtcbiAgfVxuICByZXR1cm4gY2VsbHM7XG59O1xuXG4vLyAtLS0tLSBjb250YWluIC0tLS0tIC8vXG5cbi8vIGNvbnRhaW4gY2VsbCB0YXJnZXRzIHNvIG5vIGV4Y2VzcyBzbGlkaW5nXG5wcm90by5fY29udGFpblNsaWRlcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLm9wdGlvbnMuY29udGFpbiB8fCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCB8fCAhdGhpcy5jZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpc1JpZ2h0VG9MZWZ0ID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0O1xuICB2YXIgYmVnaW5NYXJnaW4gPSBpc1JpZ2h0VG9MZWZ0ID8gJ21hcmdpblJpZ2h0JyA6ICdtYXJnaW5MZWZ0JztcbiAgdmFyIGVuZE1hcmdpbiA9IGlzUmlnaHRUb0xlZnQgPyAnbWFyZ2luTGVmdCcgOiAnbWFyZ2luUmlnaHQnO1xuICB2YXIgY29udGVudFdpZHRoID0gdGhpcy5zbGlkZWFibGVXaWR0aCAtIHRoaXMuZ2V0TGFzdENlbGwoKS5zaXplWyBlbmRNYXJnaW4gXTtcbiAgLy8gY29udGVudCBpcyBsZXNzIHRoYW4gZ2FsbGVyeSBzaXplXG4gIHZhciBpc0NvbnRlbnRTbWFsbGVyID0gY29udGVudFdpZHRoIDwgdGhpcy5zaXplLmlubmVyV2lkdGg7XG4gIC8vIGJvdW5kc1xuICB2YXIgYmVnaW5Cb3VuZCA9IHRoaXMuY3Vyc29yUG9zaXRpb24gKyB0aGlzLmNlbGxzWzBdLnNpemVbIGJlZ2luTWFyZ2luIF07XG4gIHZhciBlbmRCb3VuZCA9IGNvbnRlbnRXaWR0aCAtIHRoaXMuc2l6ZS5pbm5lcldpZHRoICogKCAxIC0gdGhpcy5jZWxsQWxpZ24gKTtcbiAgLy8gY29udGFpbiBlYWNoIGNlbGwgdGFyZ2V0XG4gIHRoaXMuc2xpZGVzLmZvckVhY2goIGZ1bmN0aW9uKCBzbGlkZSApIHtcbiAgICBpZiAoIGlzQ29udGVudFNtYWxsZXIgKSB7XG4gICAgICAvLyBhbGwgY2VsbHMgZml0IGluc2lkZSBnYWxsZXJ5XG4gICAgICBzbGlkZS50YXJnZXQgPSBjb250ZW50V2lkdGggKiB0aGlzLmNlbGxBbGlnbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gY29udGFpbiB0byBib3VuZHNcbiAgICAgIHNsaWRlLnRhcmdldCA9IE1hdGgubWF4KCBzbGlkZS50YXJnZXQsIGJlZ2luQm91bmQgKTtcbiAgICAgIHNsaWRlLnRhcmdldCA9IE1hdGgubWluKCBzbGlkZS50YXJnZXQsIGVuZEJvdW5kICk7XG4gICAgfVxuICB9LCB0aGlzICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuLyoqXG4gKiBlbWl0cyBldmVudHMgdmlhIGV2ZW50RW1pdHRlciBhbmQgalF1ZXJ5IGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIG9yaWdpbmFsIGV2ZW50XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gZXh0cmEgYXJndW1lbnRzXG4gKi9cbnByb3RvLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGFyZ3MgKSB7XG4gIHZhciBlbWl0QXJncyA9IGV2ZW50ID8gWyBldmVudCBdLmNvbmNhdCggYXJncyApIDogYXJncztcbiAgdGhpcy5lbWl0RXZlbnQoIHR5cGUsIGVtaXRBcmdzICk7XG5cbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICAvLyBkZWZhdWx0IHRyaWdnZXIgd2l0aCB0eXBlIGlmIG5vIGV2ZW50XG4gICAgdHlwZSArPSB0aGlzLm9wdGlvbnMubmFtZXNwYWNlSlF1ZXJ5RXZlbnRzID8gJy5mbGlja2l0eScgOiAnJztcbiAgICB2YXIgJGV2ZW50ID0gdHlwZTtcbiAgICBpZiAoIGV2ZW50ICkge1xuICAgICAgLy8gY3JlYXRlIGpRdWVyeSBldmVudFxuICAgICAgdmFyIGpRRXZlbnQgPSBqUXVlcnkuRXZlbnQoIGV2ZW50ICk7XG4gICAgICBqUUV2ZW50LnR5cGUgPSB0eXBlO1xuICAgICAgJGV2ZW50ID0galFFdmVudDtcbiAgICB9XG4gICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCAkZXZlbnQsIGFyZ3MgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2VsZWN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCAtIGluZGV4IG9mIHRoZSBzbGlkZVxuICogQHBhcmFtIHtCb29sZWFufSBpc1dyYXAgLSB3aWxsIHdyYXAtYXJvdW5kIHRvIGxhc3QvZmlyc3QgaWYgYXQgdGhlIGVuZFxuICogQHBhcmFtIHtCb29sZWFufSBpc0luc3RhbnQgLSB3aWxsIGltbWVkaWF0ZWx5IHNldCBwb3NpdGlvbiBhdCBzZWxlY3RlZCBjZWxsXG4gKi9cbnByb3RvLnNlbGVjdCA9IGZ1bmN0aW9uKCBpbmRleCwgaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIGlmICggIXRoaXMuaXNBY3RpdmUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGluZGV4ID0gcGFyc2VJbnQoIGluZGV4LCAxMCApO1xuICB0aGlzLl93cmFwU2VsZWN0KCBpbmRleCApO1xuXG4gIGlmICggdGhpcy5vcHRpb25zLndyYXBBcm91bmQgfHwgaXNXcmFwICkge1xuICAgIGluZGV4ID0gdXRpbHMubW9kdWxvKCBpbmRleCwgdGhpcy5zbGlkZXMubGVuZ3RoICk7XG4gIH1cbiAgLy8gYmFpbCBpZiBpbnZhbGlkIGluZGV4XG4gIGlmICggIXRoaXMuc2xpZGVzWyBpbmRleCBdICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgcHJldkluZGV4ID0gdGhpcy5zZWxlY3RlZEluZGV4O1xuICB0aGlzLnNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgdGhpcy51cGRhdGVTZWxlY3RlZFNsaWRlKCk7XG4gIGlmICggaXNJbnN0YW50ICkge1xuICAgIHRoaXMucG9zaXRpb25TbGlkZXJBdFNlbGVjdGVkKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICB9XG4gIGlmICggdGhpcy5vcHRpb25zLmFkYXB0aXZlSGVpZ2h0ICkge1xuICAgIHRoaXMuc2V0R2FsbGVyeVNpemUoKTtcbiAgfVxuICAvLyBldmVudHNcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnc2VsZWN0JywgbnVsbCwgWyBpbmRleCBdICk7XG4gIC8vIGNoYW5nZSBldmVudCBpZiBuZXcgaW5kZXhcbiAgaWYgKCBpbmRleCAhPSBwcmV2SW5kZXggKSB7XG4gICAgdGhpcy5kaXNwYXRjaEV2ZW50KCAnY2hhbmdlJywgbnVsbCwgWyBpbmRleCBdICk7XG4gIH1cbiAgLy8gb2xkIHYxIGV2ZW50IG5hbWUsIHJlbW92ZSBpbiB2M1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoJ2NlbGxTZWxlY3QnKTtcbn07XG5cbi8vIHdyYXBzIHBvc2l0aW9uIGZvciB3cmFwQXJvdW5kLCB0byBtb3ZlIHRvIGNsb3Nlc3Qgc2xpZGUuICMxMTNcbnByb3RvLl93cmFwU2VsZWN0ID0gZnVuY3Rpb24oIGluZGV4ICkge1xuICB2YXIgbGVuID0gdGhpcy5zbGlkZXMubGVuZ3RoO1xuICB2YXIgaXNXcmFwcGluZyA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICYmIGxlbiA+IDE7XG4gIGlmICggIWlzV3JhcHBpbmcgKSB7XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG4gIHZhciB3cmFwSW5kZXggPSB1dGlscy5tb2R1bG8oIGluZGV4LCBsZW4gKTtcbiAgLy8gZ28gdG8gc2hvcnRlc3RcbiAgdmFyIGRlbHRhID0gTWF0aC5hYnMoIHdyYXBJbmRleCAtIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICB2YXIgYmFja1dyYXBEZWx0YSA9IE1hdGguYWJzKCAoIHdyYXBJbmRleCArIGxlbiApIC0gdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIHZhciBmb3Jld2FyZFdyYXBEZWx0YSA9IE1hdGguYWJzKCAoIHdyYXBJbmRleCAtIGxlbiApIC0gdGhpcy5zZWxlY3RlZEluZGV4ICk7XG4gIGlmICggIXRoaXMuaXNEcmFnU2VsZWN0ICYmIGJhY2tXcmFwRGVsdGEgPCBkZWx0YSApIHtcbiAgICBpbmRleCArPSBsZW47XG4gIH0gZWxzZSBpZiAoICF0aGlzLmlzRHJhZ1NlbGVjdCAmJiBmb3Jld2FyZFdyYXBEZWx0YSA8IGRlbHRhICkge1xuICAgIGluZGV4IC09IGxlbjtcbiAgfVxuICAvLyB3cmFwIHBvc2l0aW9uIHNvIHNsaWRlciBpcyB3aXRoaW4gbm9ybWFsIGFyZWFcbiAgaWYgKCBpbmRleCA8IDAgKSB7XG4gICAgdGhpcy54IC09IHRoaXMuc2xpZGVhYmxlV2lkdGg7XG4gIH0gZWxzZSBpZiAoIGluZGV4ID49IGxlbiApIHtcbiAgICB0aGlzLnggKz0gdGhpcy5zbGlkZWFibGVXaWR0aDtcbiAgfVxufTtcblxucHJvdG8ucHJldmlvdXMgPSBmdW5jdGlvbiggaXNXcmFwLCBpc0luc3RhbnQgKSB7XG4gIHRoaXMuc2VsZWN0KCB0aGlzLnNlbGVjdGVkSW5kZXggLSAxLCBpc1dyYXAsIGlzSW5zdGFudCApO1xufTtcblxucHJvdG8ubmV4dCA9IGZ1bmN0aW9uKCBpc1dyYXAsIGlzSW5zdGFudCApIHtcbiAgdGhpcy5zZWxlY3QoIHRoaXMuc2VsZWN0ZWRJbmRleCArIDEsIGlzV3JhcCwgaXNJbnN0YW50ICk7XG59O1xuXG5wcm90by51cGRhdGVTZWxlY3RlZFNsaWRlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzWyB0aGlzLnNlbGVjdGVkSW5kZXggXTtcbiAgLy8gc2VsZWN0ZWRJbmRleCBjb3VsZCBiZSBvdXRzaWRlIG9mIHNsaWRlcywgaWYgdHJpZ2dlcmVkIGJlZm9yZSByZXNpemUoKVxuICBpZiAoICFzbGlkZSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdW5zZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWQgc2xpZGVcbiAgdGhpcy51bnNlbGVjdFNlbGVjdGVkU2xpZGUoKTtcbiAgLy8gdXBkYXRlIG5ldyBzZWxlY3RlZCBzbGlkZVxuICB0aGlzLnNlbGVjdGVkU2xpZGUgPSBzbGlkZTtcbiAgc2xpZGUuc2VsZWN0KCk7XG4gIHRoaXMuc2VsZWN0ZWRDZWxscyA9IHNsaWRlLmNlbGxzO1xuICB0aGlzLnNlbGVjdGVkRWxlbWVudHMgPSBzbGlkZS5nZXRDZWxsRWxlbWVudHMoKTtcbiAgLy8gSEFDSzogc2VsZWN0ZWRDZWxsICYgc2VsZWN0ZWRFbGVtZW50IGlzIGZpcnN0IGNlbGwgaW4gc2xpZGUsIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gIC8vIFJlbW92ZSBpbiB2Mz9cbiAgdGhpcy5zZWxlY3RlZENlbGwgPSBzbGlkZS5jZWxsc1swXTtcbiAgdGhpcy5zZWxlY3RlZEVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHNbMF07XG59O1xuXG5wcm90by51bnNlbGVjdFNlbGVjdGVkU2xpZGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLnNlbGVjdGVkU2xpZGUgKSB7XG4gICAgdGhpcy5zZWxlY3RlZFNsaWRlLnVuc2VsZWN0KCk7XG4gIH1cbn07XG5cbi8qKlxuICogc2VsZWN0IHNsaWRlIGZyb20gbnVtYmVyIG9yIGNlbGwgZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50IG9yIE51bWJlcn0gZWxlbVxuICovXG5wcm90by5zZWxlY3RDZWxsID0gZnVuY3Rpb24oIHZhbHVlLCBpc1dyYXAsIGlzSW5zdGFudCApIHtcbiAgLy8gZ2V0IGNlbGxcbiAgdmFyIGNlbGwgPSB0aGlzLnF1ZXJ5Q2VsbCggdmFsdWUgKTtcbiAgaWYgKCAhY2VsbCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgaW5kZXggPSB0aGlzLmdldENlbGxTbGlkZUluZGV4KCBjZWxsICk7XG4gIHRoaXMuc2VsZWN0KCBpbmRleCwgaXNXcmFwLCBpc0luc3RhbnQgKTtcbn07XG5cbnByb3RvLmdldENlbGxTbGlkZUluZGV4ID0gZnVuY3Rpb24oIGNlbGwgKSB7XG4gIC8vIGdldCBpbmRleCBvZiBzbGlkZXMgdGhhdCBoYXMgY2VsbFxuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5zbGlkZXMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbaV07XG4gICAgdmFyIGluZGV4ID0gc2xpZGUuY2VsbHMuaW5kZXhPZiggY2VsbCApO1xuICAgIGlmICggaW5kZXggIT0gLTEgKSB7XG4gICAgICByZXR1cm4gaTtcbiAgICB9XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldCBjZWxscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIGdldCBGbGlja2l0eS5DZWxsLCBnaXZlbiBhbiBFbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqIEByZXR1cm5zIHtGbGlja2l0eS5DZWxsfSBpdGVtXG4gKi9cbnByb3RvLmdldENlbGwgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gbG9vcCB0aHJvdWdoIGNlbGxzIHRvIGdldCB0aGUgb25lIHRoYXQgbWF0Y2hlc1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5jZWxscy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgY2VsbCA9IHRoaXMuY2VsbHNbaV07XG4gICAgaWYgKCBjZWxsLmVsZW1lbnQgPT0gZWxlbSApIHtcbiAgICAgIHJldHVybiBjZWxsO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBnZXQgY29sbGVjdGlvbiBvZiBGbGlja2l0eS5DZWxscywgZ2l2ZW4gRWxlbWVudHNcbiAqIEBwYXJhbSB7RWxlbWVudCwgQXJyYXksIE5vZGVMaXN0fSBlbGVtc1xuICogQHJldHVybnMge0FycmF5fSBjZWxscyAtIEZsaWNraXR5LkNlbGxzXG4gKi9cbnByb3RvLmdldENlbGxzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgdmFyIGNlbGxzID0gW107XG4gIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gICAgaWYgKCBjZWxsICkge1xuICAgICAgY2VsbHMucHVzaCggY2VsbCApO1xuICAgIH1cbiAgfSwgdGhpcyApO1xuICByZXR1cm4gY2VsbHM7XG59O1xuXG4vKipcbiAqIGdldCBjZWxsIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7QXJyYXl9IGNlbGxFbGVtc1xuICovXG5wcm90by5nZXRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIHRoaXMuY2VsbHMubWFwKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICByZXR1cm4gY2VsbC5lbGVtZW50O1xuICB9KTtcbn07XG5cbi8qKlxuICogZ2V0IHBhcmVudCBjZWxsIGZyb20gYW4gZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7RmxpY2tpdC5DZWxsfSBjZWxsXG4gKi9cbnByb3RvLmdldFBhcmVudENlbGwgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgLy8gZmlyc3QgY2hlY2sgaWYgZWxlbSBpcyBjZWxsXG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gIGlmICggY2VsbCApIHtcbiAgICByZXR1cm4gY2VsbDtcbiAgfVxuICAvLyB0cnkgdG8gZ2V0IHBhcmVudCBjZWxsIGVsZW1cbiAgZWxlbSA9IHV0aWxzLmdldFBhcmVudCggZWxlbSwgJy5mbGlja2l0eS1zbGlkZXIgPiAqJyApO1xuICByZXR1cm4gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG59O1xuXG4vKipcbiAqIGdldCBjZWxscyBhZGphY2VudCB0byBhIHNsaWRlXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGFkakNvdW50IC0gbnVtYmVyIG9mIGFkamFjZW50IHNsaWRlc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCAtIGluZGV4IG9mIHNsaWRlIHRvIHN0YXJ0XG4gKiBAcmV0dXJucyB7QXJyYXl9IGNlbGxzIC0gYXJyYXkgb2YgRmxpY2tpdHkuQ2VsbHNcbiAqL1xucHJvdG8uZ2V0QWRqYWNlbnRDZWxsRWxlbWVudHMgPSBmdW5jdGlvbiggYWRqQ291bnQsIGluZGV4ICkge1xuICBpZiAoICFhZGpDb3VudCApIHtcbiAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFNsaWRlLmdldENlbGxFbGVtZW50cygpO1xuICB9XG4gIGluZGV4ID0gaW5kZXggPT09IHVuZGVmaW5lZCA/IHRoaXMuc2VsZWN0ZWRJbmRleCA6IGluZGV4O1xuXG4gIHZhciBsZW4gPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gIGlmICggMSArICggYWRqQ291bnQgKiAyICkgPj0gbGVuICkge1xuICAgIHJldHVybiB0aGlzLmdldENlbGxFbGVtZW50cygpO1xuICB9XG5cbiAgdmFyIGNlbGxFbGVtcyA9IFtdO1xuICBmb3IgKCB2YXIgaSA9IGluZGV4IC0gYWRqQ291bnQ7IGkgPD0gaW5kZXggKyBhZGpDb3VudCA7IGkrKyApIHtcbiAgICB2YXIgc2xpZGVJbmRleCA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kID8gdXRpbHMubW9kdWxvKCBpLCBsZW4gKSA6IGk7XG4gICAgdmFyIHNsaWRlID0gdGhpcy5zbGlkZXNbIHNsaWRlSW5kZXggXTtcbiAgICBpZiAoIHNsaWRlICkge1xuICAgICAgY2VsbEVsZW1zID0gY2VsbEVsZW1zLmNvbmNhdCggc2xpZGUuZ2V0Q2VsbEVsZW1lbnRzKCkgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGNlbGxFbGVtcztcbn07XG5cbi8qKlxuICogc2VsZWN0IHNsaWRlIGZyb20gbnVtYmVyIG9yIGNlbGwgZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50LCBTZWxlY3RvciBTdHJpbmcsIG9yIE51bWJlcn0gc2VsZWN0b3JcbiAqL1xucHJvdG8ucXVlcnlDZWxsID0gZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuICBpZiAoIHR5cGVvZiBzZWxlY3RvciA9PSAnbnVtYmVyJyApIHtcbiAgICAvLyB1c2UgbnVtYmVyIGFzIGluZGV4XG4gICAgcmV0dXJuIHRoaXMuY2VsbHNbIHNlbGVjdG9yIF07XG4gIH1cbiAgaWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT0gJ3N0cmluZycgKSB7XG4gICAgLy8gdXNlIHN0cmluZyBhcyBzZWxlY3RvciwgZ2V0IGVsZW1lbnRcbiAgICBzZWxlY3RvciA9IHRoaXMuZWxlbWVudC5xdWVyeVNlbGVjdG9yKCBzZWxlY3RvciApO1xuICB9XG4gIC8vIGdldCBjZWxsIGZyb20gZWxlbWVudFxuICByZXR1cm4gdGhpcy5nZXRDZWxsKCBzZWxlY3RvciApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXZlbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnByb3RvLnVpQ2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCd1aUNoYW5nZScpO1xufTtcblxucHJvdG8uY2hpbGRVSVBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB0aGlzLmVtaXRFdmVudCggJ2NoaWxkVUlQb2ludGVyRG93bicsIFsgZXZlbnQgXSApO1xufTtcblxuLy8gLS0tLS0gcmVzaXplIC0tLS0tIC8vXG5cbnByb3RvLm9ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMud2F0Y2hDU1MoKTtcbiAgdGhpcy5yZXNpemUoKTtcbn07XG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kKCBGbGlja2l0eSwgJ29ucmVzaXplJywgMTUwICk7XG5cbnByb3RvLnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmdldFNpemUoKTtcbiAgLy8gd3JhcCB2YWx1ZXNcbiAgaWYgKCB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCApIHtcbiAgICB0aGlzLnggPSB1dGlscy5tb2R1bG8oIHRoaXMueCwgdGhpcy5zbGlkZWFibGVXaWR0aCApO1xuICB9XG4gIHRoaXMucG9zaXRpb25DZWxscygpO1xuICB0aGlzLl9nZXRXcmFwU2hpZnRDZWxscygpO1xuICB0aGlzLnNldEdhbGxlcnlTaXplKCk7XG4gIHRoaXMuZW1pdEV2ZW50KCdyZXNpemUnKTtcbiAgLy8gdXBkYXRlIHNlbGVjdGVkIGluZGV4IGZvciBncm91cCBzbGlkZXMsIGluc3RhbnRcbiAgLy8gVE9ETzogcG9zaXRpb24gY2FuIGJlIGxvc3QgYmV0d2VlbiBncm91cHMgb2YgdmFyaW91cyBudW1iZXJzXG4gIHZhciBzZWxlY3RlZEVsZW1lbnQgPSB0aGlzLnNlbGVjdGVkRWxlbWVudHMgJiYgdGhpcy5zZWxlY3RlZEVsZW1lbnRzWzBdO1xuICB0aGlzLnNlbGVjdENlbGwoIHNlbGVjdGVkRWxlbWVudCwgZmFsc2UsIHRydWUgKTtcbn07XG5cbi8vIHdhdGNoZXMgdGhlIDphZnRlciBwcm9wZXJ0eSwgYWN0aXZhdGVzL2RlYWN0aXZhdGVzXG5wcm90by53YXRjaENTUyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgd2F0Y2hPcHRpb24gPSB0aGlzLm9wdGlvbnMud2F0Y2hDU1M7XG4gIGlmICggIXdhdGNoT3B0aW9uICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBhZnRlckNvbnRlbnQgPSBnZXRDb21wdXRlZFN0eWxlKCB0aGlzLmVsZW1lbnQsICc6YWZ0ZXInICkuY29udGVudDtcbiAgLy8gYWN0aXZhdGUgaWYgOmFmdGVyIHsgY29udGVudDogJ2ZsaWNraXR5JyB9XG4gIGlmICggYWZ0ZXJDb250ZW50LmluZGV4T2YoJ2ZsaWNraXR5JykgIT0gLTEgKSB7XG4gICAgdGhpcy5hY3RpdmF0ZSgpO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBrZXlkb3duIC0tLS0tIC8vXG5cbi8vIGdvIHByZXZpb3VzL25leHQgaWYgbGVmdC9yaWdodCBrZXlzIHByZXNzZWRcbnByb3RvLm9ua2V5ZG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gb25seSB3b3JrIGlmIGVsZW1lbnQgaXMgaW4gZm9jdXNcbiAgdmFyIGlzTm90Rm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCAhPSB0aGlzLmVsZW1lbnQ7XG4gIGlmICggIXRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5IHx8aXNOb3RGb2N1c2VkICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBoYW5kbGVyID0gRmxpY2tpdHkua2V5Ym9hcmRIYW5kbGVyc1sgZXZlbnQua2V5Q29kZSBdO1xuICBpZiAoIGhhbmRsZXIgKSB7XG4gICAgaGFuZGxlci5jYWxsKCB0aGlzICk7XG4gIH1cbn07XG5cbkZsaWNraXR5LmtleWJvYXJkSGFuZGxlcnMgPSB7XG4gIC8vIGxlZnQgYXJyb3dcbiAgMzc6IGZ1bmN0aW9uKCkge1xuICAgIHZhciBsZWZ0TWV0aG9kID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gJ25leHQnIDogJ3ByZXZpb3VzJztcbiAgICB0aGlzLnVpQ2hhbmdlKCk7XG4gICAgdGhpc1sgbGVmdE1ldGhvZCBdKCk7XG4gIH0sXG4gIC8vIHJpZ2h0IGFycm93XG4gIDM5OiBmdW5jdGlvbigpIHtcbiAgICB2YXIgcmlnaHRNZXRob2QgPSB0aGlzLm9wdGlvbnMucmlnaHRUb0xlZnQgPyAncHJldmlvdXMnIDogJ25leHQnO1xuICAgIHRoaXMudWlDaGFuZ2UoKTtcbiAgICB0aGlzWyByaWdodE1ldGhvZCBdKCk7XG4gIH0sXG59O1xuXG4vLyAtLS0tLSBmb2N1cyAtLS0tLSAvL1xuXG5wcm90by5mb2N1cyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcHJldlNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gIHRoaXMuZWxlbWVudC5mb2N1cygpO1xuICAvLyBoYWNrIHRvIGZpeCBzY3JvbGwganVtcCBhZnRlciBmb2N1cywgIzc2XG4gIGlmICggd2luZG93LnBhZ2VZT2Zmc2V0ICE9IHByZXZTY3JvbGxZICkge1xuICAgIHdpbmRvdy5zY3JvbGxUbyggd2luZG93LnBhZ2VYT2Zmc2V0LCBwcmV2U2Nyb2xsWSApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZXN0cm95IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGRlYWN0aXZhdGUgYWxsIEZsaWNraXR5IGZ1bmN0aW9uYWxpdHksIGJ1dCBrZWVwIHN0dWZmIGF2YWlsYWJsZVxucHJvdG8uZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLmlzQWN0aXZlICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZmxpY2tpdHktZW5hYmxlZCcpO1xuICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZmxpY2tpdHktcnRsJyk7XG4gIHRoaXMudW5zZWxlY3RTZWxlY3RlZFNsaWRlKCk7XG4gIC8vIGRlc3Ryb3kgY2VsbHNcbiAgdGhpcy5jZWxscy5mb3JFYWNoKCBmdW5jdGlvbiggY2VsbCApIHtcbiAgICBjZWxsLmRlc3Ryb3koKTtcbiAgfSk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy52aWV3cG9ydCApO1xuICAvLyBtb3ZlIGNoaWxkIGVsZW1lbnRzIGJhY2sgaW50byBlbGVtZW50XG4gIG1vdmVFbGVtZW50cyggdGhpcy5zbGlkZXIuY2hpbGRyZW4sIHRoaXMuZWxlbWVudCApO1xuICBpZiAoIHRoaXMub3B0aW9ucy5hY2Nlc3NpYmlsaXR5ICkge1xuICAgIHRoaXMuZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ3RhYkluZGV4Jyk7XG4gICAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgdGhpcyApO1xuICB9XG4gIC8vIHNldCBmbGFnc1xuICB0aGlzLmlzQWN0aXZlID0gZmFsc2U7XG4gIHRoaXMuZW1pdEV2ZW50KCdkZWFjdGl2YXRlJyk7XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5lbWl0RXZlbnQoJ2Rlc3Ryb3knKTtcbiAgaWYgKCBqUXVlcnkgJiYgdGhpcy4kZWxlbWVudCApIHtcbiAgICBqUXVlcnkucmVtb3ZlRGF0YSggdGhpcy5lbGVtZW50LCAnZmxpY2tpdHknICk7XG4gIH1cbiAgZGVsZXRlIHRoaXMuZWxlbWVudC5mbGlja2l0eUdVSUQ7XG4gIGRlbGV0ZSBpbnN0YW5jZXNbIHRoaXMuZ3VpZCBdO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvdG90eXBlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggcHJvdG8sIGFuaW1hdGVQcm90b3R5cGUgKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZXh0cmFzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0IEZsaWNraXR5IGluc3RhbmNlIGZyb20gZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7RmxpY2tpdHl9XG4gKi9cbkZsaWNraXR5LmRhdGEgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgZWxlbSA9IHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggZWxlbSApO1xuICB2YXIgaWQgPSBlbGVtICYmIGVsZW0uZmxpY2tpdHlHVUlEO1xuICByZXR1cm4gaWQgJiYgaW5zdGFuY2VzWyBpZCBdO1xufTtcblxudXRpbHMuaHRtbEluaXQoIEZsaWNraXR5LCAnZmxpY2tpdHknICk7XG5cbmlmICggalF1ZXJ5ICYmIGpRdWVyeS5icmlkZ2V0ICkge1xuICBqUXVlcnkuYnJpZGdldCggJ2ZsaWNraXR5JywgRmxpY2tpdHkgKTtcbn1cblxuLy8gc2V0IGludGVybmFsIGpRdWVyeSwgZm9yIFdlYnBhY2sgKyBqUXVlcnkgdjMsICM0NzhcbkZsaWNraXR5LnNldEpRdWVyeSA9IGZ1bmN0aW9uKCBqcSApIHtcbiAgalF1ZXJ5ID0ganE7XG59O1xuXG5GbGlja2l0eS5DZWxsID0gQ2VsbDtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iLCIvKiFcbiAqIFVuaXBvaW50ZXIgdjIuMy4wXG4gKiBiYXNlIGNsYXNzIGZvciBkb2luZyBvbmUgdGhpbmcgd2l0aCBwb2ludGVyIGV2ZW50XG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUsIHN0cmljdDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbCBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcidcbiAgICBdLCBmdW5jdGlvbiggRXZFbWl0dGVyICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LlVuaXBvaW50ZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkV2RW1pdHRlclxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEV2RW1pdHRlciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBub29wKCkge31cblxuZnVuY3Rpb24gVW5pcG9pbnRlcigpIHt9XG5cbi8vIGluaGVyaXQgRXZFbWl0dGVyXG52YXIgcHJvdG8gPSBVbmlwb2ludGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV2RW1pdHRlci5wcm90b3R5cGUgKTtcblxucHJvdG8uYmluZFN0YXJ0RXZlbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGVsZW0sIHRydWUgKTtcbn07XG5cbnByb3RvLnVuYmluZFN0YXJ0RXZlbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGVsZW0sIGZhbHNlICk7XG59O1xuXG4vKipcbiAqIEFkZCBvciByZW1vdmUgc3RhcnQgZXZlbnRcbiAqIEBwYXJhbSB7Qm9vbGVhbn0gaXNBZGQgLSByZW1vdmUgaWYgZmFsc2V5XG4gKi9cbnByb3RvLl9iaW5kU3RhcnRFdmVudCA9IGZ1bmN0aW9uKCBlbGVtLCBpc0FkZCApIHtcbiAgLy8gbXVuZ2UgaXNBZGQsIGRlZmF1bHQgdG8gdHJ1ZVxuICBpc0FkZCA9IGlzQWRkID09PSB1bmRlZmluZWQgPyB0cnVlIDogaXNBZGQ7XG4gIHZhciBiaW5kTWV0aG9kID0gaXNBZGQgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG5cbiAgLy8gZGVmYXVsdCB0byBtb3VzZSBldmVudHNcbiAgdmFyIHN0YXJ0RXZlbnQgPSAnbW91c2Vkb3duJztcbiAgaWYgKCB3aW5kb3cuUG9pbnRlckV2ZW50ICkge1xuICAgIC8vIFBvaW50ZXIgRXZlbnRzXG4gICAgc3RhcnRFdmVudCA9ICdwb2ludGVyZG93bic7XG4gIH0gZWxzZSBpZiAoICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyApIHtcbiAgICAvLyBUb3VjaCBFdmVudHMuIGlPUyBTYWZhcmlcbiAgICBzdGFydEV2ZW50ID0gJ3RvdWNoc3RhcnQnO1xuICB9XG4gIGVsZW1bIGJpbmRNZXRob2QgXSggc3RhcnRFdmVudCwgdGhpcyApO1xufTtcblxuLy8gdHJpZ2dlciBoYW5kbGVyIG1ldGhvZHMgZm9yIGV2ZW50c1xucHJvdG8uaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gcmV0dXJucyB0aGUgdG91Y2ggdGhhdCB3ZSdyZSBrZWVwaW5nIHRyYWNrIG9mXG5wcm90by5nZXRUb3VjaCA9IGZ1bmN0aW9uKCB0b3VjaGVzICkge1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgdG91Y2ggPSB0b3VjaGVzW2ldO1xuICAgIGlmICggdG91Y2guaWRlbnRpZmllciA9PSB0aGlzLnBvaW50ZXJJZGVudGlmaWVyICkge1xuICAgICAgcmV0dXJuIHRvdWNoO1xuICAgIH1cbiAgfVxufTtcblxuLy8gLS0tLS0gc3RhcnQgZXZlbnQgLS0tLS0gLy9cblxucHJvdG8ub25tb3VzZWRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIC8vIGRpc21pc3MgY2xpY2tzIGZyb20gcmlnaHQgb3IgbWlkZGxlIGJ1dHRvbnNcbiAgdmFyIGJ1dHRvbiA9IGV2ZW50LmJ1dHRvbjtcbiAgaWYgKCBidXR0b24gJiYgKCBidXR0b24gIT09IDAgJiYgYnV0dG9uICE9PSAxICkgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuX3BvaW50ZXJEb3duKCBldmVudCwgZXZlbnQgKTtcbn07XG5cbnByb3RvLm9udG91Y2hzdGFydCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlckRvd24oIGV2ZW50LCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSApO1xufTtcblxucHJvdG8ub25wb2ludGVyZG93biA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlckRvd24oIGV2ZW50LCBldmVudCApO1xufTtcblxuLyoqXG4gKiBwb2ludGVyIHN0YXJ0XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5fcG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIGRpc21pc3MgcmlnaHQgY2xpY2sgYW5kIG90aGVyIHBvaW50ZXJzXG4gIC8vIGJ1dHRvbiA9IDAgaXMgb2theSwgMS00IG5vdFxuICBpZiAoIGV2ZW50LmJ1dHRvbiB8fCB0aGlzLmlzUG9pbnRlckRvd24gKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5pc1BvaW50ZXJEb3duID0gdHJ1ZTtcbiAgLy8gc2F2ZSBwb2ludGVyIGlkZW50aWZpZXIgdG8gbWF0Y2ggdXAgdG91Y2ggZXZlbnRzXG4gIHRoaXMucG9pbnRlcklkZW50aWZpZXIgPSBwb2ludGVyLnBvaW50ZXJJZCAhPT0gdW5kZWZpbmVkID9cbiAgICAvLyBwb2ludGVySWQgZm9yIHBvaW50ZXIgZXZlbnRzLCB0b3VjaC5pbmRlbnRpZmllciBmb3IgdG91Y2ggZXZlbnRzXG4gICAgcG9pbnRlci5wb2ludGVySWQgOiBwb2ludGVyLmlkZW50aWZpZXI7XG5cbiAgdGhpcy5wb2ludGVyRG93biggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLnBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJEb3duJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBoYXNoIG9mIGV2ZW50cyB0byBiZSBib3VuZCBhZnRlciBzdGFydCBldmVudFxudmFyIHBvc3RTdGFydEV2ZW50cyA9IHtcbiAgbW91c2Vkb3duOiBbICdtb3VzZW1vdmUnLCAnbW91c2V1cCcgXSxcbiAgdG91Y2hzdGFydDogWyAndG91Y2htb3ZlJywgJ3RvdWNoZW5kJywgJ3RvdWNoY2FuY2VsJyBdLFxuICBwb2ludGVyZG93bjogWyAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJjYW5jZWwnIF0sXG59O1xuXG5wcm90by5fYmluZFBvc3RTdGFydEV2ZW50cyA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCAhZXZlbnQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIGdldCBwcm9wZXIgZXZlbnRzIHRvIG1hdGNoIHN0YXJ0IGV2ZW50XG4gIHZhciBldmVudHMgPSBwb3N0U3RhcnRFdmVudHNbIGV2ZW50LnR5cGUgXTtcbiAgLy8gYmluZCBldmVudHMgdG8gbm9kZVxuICBldmVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCB0aGlzICk7XG4gIH0sIHRoaXMgKTtcbiAgLy8gc2F2ZSB0aGVzZSBhcmd1bWVudHNcbiAgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzID0gZXZlbnRzO1xufTtcblxucHJvdG8uX3VuYmluZFBvc3RTdGFydEV2ZW50cyA9IGZ1bmN0aW9uKCkge1xuICAvLyBjaGVjayBmb3IgX2JvdW5kRXZlbnRzLCBpbiBjYXNlIGRyYWdFbmQgdHJpZ2dlcmVkIHR3aWNlIChvbGQgSUU4IGJ1ZylcbiAgaWYgKCAhdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLl9ib3VuZFBvaW50ZXJFdmVudHMuZm9yRWFjaCggZnVuY3Rpb24oIGV2ZW50TmFtZSApIHtcbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggZXZlbnROYW1lLCB0aGlzICk7XG4gIH0sIHRoaXMgKTtcblxuICBkZWxldGUgdGhpcy5fYm91bmRQb2ludGVyRXZlbnRzO1xufTtcblxuLy8gLS0tLS0gbW92ZSBldmVudCAtLS0tLSAvL1xuXG5wcm90by5vbm1vdXNlbW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5fcG9pbnRlck1vdmUoIGV2ZW50LCBldmVudCApO1xufTtcblxucHJvdG8ub25wb2ludGVybW92ZSA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyTW92ZSggZXZlbnQsIGV2ZW50ICk7XG4gIH1cbn07XG5cbnByb3RvLm9udG91Y2htb3ZlID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJNb3ZlKCBldmVudCwgdG91Y2ggKTtcbiAgfVxufTtcblxuLyoqXG4gKiBwb2ludGVyIG1vdmVcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKiBAcHJpdmF0ZVxuICovXG5wcm90by5fcG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMucG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG4vLyBwdWJsaWNcbnByb3RvLnBvaW50ZXJNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJNb3ZlJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBlbmQgZXZlbnQgLS0tLS0gLy9cblxuXG5wcm90by5vbm1vdXNldXAgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuX3BvaW50ZXJVcCggZXZlbnQsIGV2ZW50ICk7XG59O1xuXG5wcm90by5vbnBvaW50ZXJ1cCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgaWYgKCBldmVudC5wb2ludGVySWQgPT0gdGhpcy5wb2ludGVySWRlbnRpZmllciApIHtcbiAgICB0aGlzLl9wb2ludGVyVXAoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNoZW5kID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJVcCggZXZlbnQsIHRvdWNoICk7XG4gIH1cbn07XG5cbi8qKlxuICogcG9pbnRlciB1cFxuICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAqIEBwYXJhbSB7RXZlbnQgb3IgVG91Y2h9IHBvaW50ZXJcbiAqIEBwcml2YXRlXG4gKi9cbnByb3RvLl9wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIHRoaXMucG9pbnRlclVwKCBldmVudCwgcG9pbnRlciApO1xufTtcblxuLy8gcHVibGljXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlclVwJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSBwb2ludGVyIGRvbmUgLS0tLS0gLy9cblxuLy8gdHJpZ2dlcmVkIG9uIHBvaW50ZXIgdXAgJiBwb2ludGVyIGNhbmNlbFxucHJvdG8uX3BvaW50ZXJEb25lID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX3BvaW50ZXJSZXNldCgpO1xuICB0aGlzLl91bmJpbmRQb3N0U3RhcnRFdmVudHMoKTtcbiAgdGhpcy5wb2ludGVyRG9uZSgpO1xufTtcblxucHJvdG8uX3BvaW50ZXJSZXNldCA9IGZ1bmN0aW9uKCkge1xuICAvLyByZXNldCBwcm9wZXJ0aWVzXG4gIHRoaXMuaXNQb2ludGVyRG93biA9IGZhbHNlO1xuICBkZWxldGUgdGhpcy5wb2ludGVySWRlbnRpZmllcjtcbn07XG5cbnByb3RvLnBvaW50ZXJEb25lID0gbm9vcDtcblxuLy8gLS0tLS0gcG9pbnRlciBjYW5jZWwgLS0tLS0gLy9cblxucHJvdG8ub25wb2ludGVyY2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICBpZiAoIGV2ZW50LnBvaW50ZXJJZCA9PSB0aGlzLnBvaW50ZXJJZGVudGlmaWVyICkge1xuICAgIHRoaXMuX3BvaW50ZXJDYW5jZWwoIGV2ZW50LCBldmVudCApO1xuICB9XG59O1xuXG5wcm90by5vbnRvdWNoY2FuY2VsID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgdG91Y2ggPSB0aGlzLmdldFRvdWNoKCBldmVudC5jaGFuZ2VkVG91Y2hlcyApO1xuICBpZiAoIHRvdWNoICkge1xuICAgIHRoaXMuX3BvaW50ZXJDYW5jZWwoIGV2ZW50LCB0b3VjaCApO1xuICB9XG59O1xuXG4vKipcbiAqIHBvaW50ZXIgY2FuY2VsXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICogQHByaXZhdGVcbiAqL1xucHJvdG8uX3BvaW50ZXJDYW5jZWwgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIHRoaXMucG9pbnRlckNhbmNlbCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbi8vIHB1YmxpY1xucHJvdG8ucG9pbnRlckNhbmNlbCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdwb2ludGVyQ2FuY2VsJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxuLy8gdXRpbGl0eSBmdW5jdGlvbiBmb3IgZ2V0dGluZyB4L3kgY29vcmRzIGZyb20gZXZlbnRcblVuaXBvaW50ZXIuZ2V0UG9pbnRlclBvaW50ID0gZnVuY3Rpb24oIHBvaW50ZXIgKSB7XG4gIHJldHVybiB7XG4gICAgeDogcG9pbnRlci5wYWdlWCxcbiAgICB5OiBwb2ludGVyLnBhZ2VZXG4gIH07XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIFVuaXBvaW50ZXI7XG5cbn0pKTtcbiIsIi8qIVxuICogVW5pZHJhZ2dlciB2Mi4zLjBcbiAqIERyYWdnYWJsZSBiYXNlIGNsYXNzXG4gKiBNSVQgbGljZW5zZVxuICovXG5cbi8qanNoaW50IGJyb3dzZXI6IHRydWUsIHVudXNlZDogdHJ1ZSwgdW5kZWY6IHRydWUsIHN0cmljdDogdHJ1ZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKmpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAndW5pcG9pbnRlci91bmlwb2ludGVyJ1xuICAgIF0sIGZ1bmN0aW9uKCBVbmlwb2ludGVyICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgVW5pcG9pbnRlciApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgndW5pcG9pbnRlcicpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5VbmlkcmFnZ2VyID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5Vbmlwb2ludGVyXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgVW5pcG9pbnRlciApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVbmlkcmFnZ2VyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIFVuaWRyYWdnZXIoKSB7fVxuXG4vLyBpbmhlcml0IFVuaXBvaW50ZXIgJiBFdkVtaXR0ZXJcbnZhciBwcm90byA9IFVuaWRyYWdnZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVW5pcG9pbnRlci5wcm90b3R5cGUgKTtcblxuLy8gLS0tLS0gYmluZCBzdGFydCAtLS0tLSAvL1xuXG5wcm90by5iaW5kSGFuZGxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9iaW5kSGFuZGxlcyggdHJ1ZSApO1xufTtcblxucHJvdG8udW5iaW5kSGFuZGxlcyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9iaW5kSGFuZGxlcyggZmFsc2UgKTtcbn07XG5cbi8qKlxuICogQWRkIG9yIHJlbW92ZSBzdGFydCBldmVudFxuICogQHBhcmFtIHtCb29sZWFufSBpc0FkZFxuICovXG5wcm90by5fYmluZEhhbmRsZXMgPSBmdW5jdGlvbiggaXNBZGQgKSB7XG4gIC8vIG11bmdlIGlzQWRkLCBkZWZhdWx0IHRvIHRydWVcbiAgaXNBZGQgPSBpc0FkZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGlzQWRkO1xuICAvLyBiaW5kIGVhY2ggaGFuZGxlXG4gIHZhciBiaW5kTWV0aG9kID0gaXNBZGQgPyAnYWRkRXZlbnRMaXN0ZW5lcicgOiAncmVtb3ZlRXZlbnRMaXN0ZW5lcic7XG4gIHZhciB0b3VjaEFjdGlvbiA9IGlzQWRkID8gdGhpcy5fdG91Y2hBY3Rpb25WYWx1ZSA6ICcnO1xuICBmb3IgKCB2YXIgaT0wOyBpIDwgdGhpcy5oYW5kbGVzLmxlbmd0aDsgaSsrICkge1xuICAgIHZhciBoYW5kbGUgPSB0aGlzLmhhbmRsZXNbaV07XG4gICAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIGhhbmRsZSwgaXNBZGQgKTtcbiAgICBoYW5kbGVbIGJpbmRNZXRob2QgXSggJ2NsaWNrJywgdGhpcyApO1xuICAgIC8vIHRvdWNoLWFjdGlvbjogbm9uZSB0byBvdmVycmlkZSBicm93c2VyIHRvdWNoIGdlc3R1cmVzLiBtZXRhZml6enkvZmxpY2tpdHkjNTQwXG4gICAgaWYgKCB3aW5kb3cuUG9pbnRlckV2ZW50ICkge1xuICAgICAgaGFuZGxlLnN0eWxlLnRvdWNoQWN0aW9uID0gdG91Y2hBY3Rpb247XG4gICAgfVxuICB9XG59O1xuXG4vLyBwcm90b3R5cGUgc28gaXQgY2FuIGJlIG92ZXJ3cml0ZWFibGUgYnkgRmxpY2tpdHlcbnByb3RvLl90b3VjaEFjdGlvblZhbHVlID0gJ25vbmUnO1xuXG4vLyAtLS0tLSBzdGFydCBldmVudCAtLS0tLSAvL1xuXG4vKipcbiAqIHBvaW50ZXIgc3RhcnRcbiAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50IG9yIFRvdWNofSBwb2ludGVyXG4gKi9cbnByb3RvLnBvaW50ZXJEb3duID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB2YXIgaXNPa2F5ID0gdGhpcy5va2F5UG9pbnRlckRvd24oIGV2ZW50ICk7XG4gIGlmICggIWlzT2theSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gdHJhY2sgc3RhcnQgZXZlbnQgcG9zaXRpb25cbiAgdGhpcy5wb2ludGVyRG93blBvaW50ZXIgPSBwb2ludGVyO1xuXG4gIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIHRoaXMucG9pbnRlckRvd25CbHVyKCk7XG4gIC8vIGJpbmQgbW92ZSBhbmQgZW5kIGV2ZW50c1xuICB0aGlzLl9iaW5kUG9zdFN0YXJ0RXZlbnRzKCBldmVudCApO1xuICB0aGlzLmVtaXRFdmVudCggJ3BvaW50ZXJEb3duJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyBub2RlcyB0aGF0IGhhdmUgdGV4dCBmaWVsZHNcbnZhciBjdXJzb3JOb2RlcyA9IHtcbiAgVEVYVEFSRUE6IHRydWUsXG4gIElOUFVUOiB0cnVlLFxuICBTRUxFQ1Q6IHRydWUsXG4gIE9QVElPTjogdHJ1ZSxcbn07XG5cbi8vIGlucHV0IHR5cGVzIHRoYXQgZG8gbm90IGhhdmUgdGV4dCBmaWVsZHNcbnZhciBjbGlja1R5cGVzID0ge1xuICByYWRpbzogdHJ1ZSxcbiAgY2hlY2tib3g6IHRydWUsXG4gIGJ1dHRvbjogdHJ1ZSxcbiAgc3VibWl0OiB0cnVlLFxuICBpbWFnZTogdHJ1ZSxcbiAgZmlsZTogdHJ1ZSxcbn07XG5cbi8vIGRpc21pc3MgaW5wdXRzIHdpdGggdGV4dCBmaWVsZHMuIGZsaWNraXR5IzQwMywgZmxpY2tpdHkjNDA0XG5wcm90by5va2F5UG9pbnRlckRvd24gPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc0N1cnNvck5vZGUgPSBjdXJzb3JOb2Rlc1sgZXZlbnQudGFyZ2V0Lm5vZGVOYW1lIF07XG4gIHZhciBpc0NsaWNrVHlwZSA9IGNsaWNrVHlwZXNbIGV2ZW50LnRhcmdldC50eXBlIF07XG4gIHZhciBpc09rYXkgPSAhaXNDdXJzb3JOb2RlIHx8IGlzQ2xpY2tUeXBlO1xuICBpZiAoICFpc09rYXkgKSB7XG4gICAgdGhpcy5fcG9pbnRlclJlc2V0KCk7XG4gIH1cbiAgcmV0dXJuIGlzT2theTtcbn07XG5cbi8vIGtsdWRnZSB0byBibHVyIHByZXZpb3VzbHkgZm9jdXNlZCBpbnB1dFxucHJvdG8ucG9pbnRlckRvd25CbHVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgLy8gZG8gbm90IGJsdXIgYm9keSBmb3IgSUUxMCwgbWV0YWZpenp5L2ZsaWNraXR5IzExN1xuICB2YXIgY2FuQmx1ciA9IGZvY3VzZWQgJiYgZm9jdXNlZC5ibHVyICYmIGZvY3VzZWQgIT0gZG9jdW1lbnQuYm9keTtcbiAgaWYgKCBjYW5CbHVyICkge1xuICAgIGZvY3VzZWQuYmx1cigpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBtb3ZlIGV2ZW50IC0tLS0tIC8vXG5cbi8qKlxuICogZHJhZyBtb3ZlXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB0aGlzLl9kcmFnUG9pbnRlck1vdmUoIGV2ZW50LCBwb2ludGVyICk7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlck1vdmUnLCBbIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yIF0gKTtcbiAgdGhpcy5fZHJhZ01vdmUoIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICk7XG59O1xuXG4vLyBiYXNlIHBvaW50ZXIgbW92ZSBsb2dpY1xucHJvdG8uX2RyYWdQb2ludGVyTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdmFyIG1vdmVWZWN0b3IgPSB7XG4gICAgeDogcG9pbnRlci5wYWdlWCAtIHRoaXMucG9pbnRlckRvd25Qb2ludGVyLnBhZ2VYLFxuICAgIHk6IHBvaW50ZXIucGFnZVkgLSB0aGlzLnBvaW50ZXJEb3duUG9pbnRlci5wYWdlWVxuICB9O1xuICAvLyBzdGFydCBkcmFnIGlmIHBvaW50ZXIgaGFzIG1vdmVkIGZhciBlbm91Z2ggdG8gc3RhcnQgZHJhZ1xuICBpZiAoICF0aGlzLmlzRHJhZ2dpbmcgJiYgdGhpcy5oYXNEcmFnU3RhcnRlZCggbW92ZVZlY3RvciApICkge1xuICAgIHRoaXMuX2RyYWdTdGFydCggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfVxuICByZXR1cm4gbW92ZVZlY3Rvcjtcbn07XG5cbi8vIGNvbmRpdGlvbiBpZiBwb2ludGVyIGhhcyBtb3ZlZCBmYXIgZW5vdWdoIHRvIHN0YXJ0IGRyYWdcbnByb3RvLmhhc0RyYWdTdGFydGVkID0gZnVuY3Rpb24oIG1vdmVWZWN0b3IgKSB7XG4gIHJldHVybiBNYXRoLmFicyggbW92ZVZlY3Rvci54ICkgPiAzIHx8IE1hdGguYWJzKCBtb3ZlVmVjdG9yLnkgKSA+IDM7XG59O1xuXG4vLyAtLS0tLSBlbmQgZXZlbnQgLS0tLS0gLy9cblxuLyoqXG4gKiBwb2ludGVyIHVwXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHRoaXMuZW1pdEV2ZW50KCAncG9pbnRlclVwJywgWyBldmVudCwgcG9pbnRlciBdICk7XG4gIHRoaXMuX2RyYWdQb2ludGVyVXAoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5fZHJhZ1BvaW50ZXJVcCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCB0aGlzLmlzRHJhZ2dpbmcgKSB7XG4gICAgdGhpcy5fZHJhZ0VuZCggZXZlbnQsIHBvaW50ZXIgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBwb2ludGVyIGRpZG4ndCBtb3ZlIGVub3VnaCBmb3IgZHJhZyB0byBzdGFydFxuICAgIHRoaXMuX3N0YXRpY0NsaWNrKCBldmVudCwgcG9pbnRlciApO1xuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkcmFnIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8vIGRyYWdTdGFydFxucHJvdG8uX2RyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5pc0RyYWdnaW5nID0gdHJ1ZTtcbiAgLy8gcHJldmVudCBjbGlja3NcbiAgdGhpcy5pc1ByZXZlbnRpbmdDbGlja3MgPSB0cnVlO1xuICB0aGlzLmRyYWdTdGFydCggZXZlbnQsIHBvaW50ZXIgKTtcbn07XG5cbnByb3RvLmRyYWdTdGFydCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnU3RhcnQnLCBbIGV2ZW50LCBwb2ludGVyIF0gKTtcbn07XG5cbi8vIGRyYWdNb3ZlXG5wcm90by5fZHJhZ01vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKSB7XG4gIC8vIGRvIG5vdCBkcmFnIGlmIG5vdCBkcmFnZ2luZyB5ZXRcbiAgaWYgKCAhdGhpcy5pc0RyYWdnaW5nICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuZHJhZ01vdmUoIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICk7XG59O1xuXG5wcm90by5kcmFnTW92ZSA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciwgbW92ZVZlY3RvciApIHtcbiAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdkcmFnTW92ZScsIFsgZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgXSApO1xufTtcblxuLy8gZHJhZ0VuZFxucHJvdG8uX2RyYWdFbmQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIHNldCBmbGFnc1xuICB0aGlzLmlzRHJhZ2dpbmcgPSBmYWxzZTtcbiAgLy8gcmUtZW5hYmxlIGNsaWNraW5nIGFzeW5jXG4gIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgIGRlbGV0ZSB0aGlzLmlzUHJldmVudGluZ0NsaWNrcztcbiAgfS5iaW5kKCB0aGlzICkgKTtcblxuICB0aGlzLmRyYWdFbmQoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ2RyYWdFbmQnLCBbIGV2ZW50LCBwb2ludGVyIF0gKTtcbn07XG5cbi8vIC0tLS0tIG9uY2xpY2sgLS0tLS0gLy9cblxuLy8gaGFuZGxlIGFsbCBjbGlja3MgYW5kIHByZXZlbnQgY2xpY2tzIHdoZW4gZHJhZ2dpbmdcbnByb3RvLm9uY2xpY2sgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIGlmICggdGhpcy5pc1ByZXZlbnRpbmdDbGlja3MgKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gc3RhdGljQ2xpY2sgLS0tLS0gLy9cblxuLy8gdHJpZ2dlcmVkIGFmdGVyIHBvaW50ZXIgZG93biAmIHVwIHdpdGggbm8vdGlueSBtb3ZlbWVudFxucHJvdG8uX3N0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICAvLyBpZ25vcmUgZW11bGF0ZWQgbW91c2UgdXAgY2xpY2tzXG4gIGlmICggdGhpcy5pc0lnbm9yaW5nTW91c2VVcCAmJiBldmVudC50eXBlID09ICdtb3VzZXVwJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnN0YXRpY0NsaWNrKCBldmVudCwgcG9pbnRlciApO1xuXG4gIC8vIHNldCBmbGFnIGZvciBlbXVsYXRlZCBjbGlja3MgMzAwbXMgYWZ0ZXIgdG91Y2hlbmRcbiAgaWYgKCBldmVudC50eXBlICE9ICdtb3VzZXVwJyApIHtcbiAgICB0aGlzLmlzSWdub3JpbmdNb3VzZVVwID0gdHJ1ZTtcbiAgICAvLyByZXNldCBmbGFnIGFmdGVyIDMwMG1zXG4gICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICBkZWxldGUgdGhpcy5pc0lnbm9yaW5nTW91c2VVcDtcbiAgICB9LmJpbmQoIHRoaXMgKSwgNDAwICk7XG4gIH1cbn07XG5cbnByb3RvLnN0YXRpY0NsaWNrID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICB0aGlzLmVtaXRFdmVudCggJ3N0YXRpY0NsaWNrJywgWyBldmVudCwgcG9pbnRlciBdICk7XG59O1xuXG4vLyAtLS0tLSB1dGlscyAtLS0tLSAvL1xuXG5VbmlkcmFnZ2VyLmdldFBvaW50ZXJQb2ludCA9IFVuaXBvaW50ZXIuZ2V0UG9pbnRlclBvaW50O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIFVuaWRyYWdnZXI7XG5cbn0pKTtcbiIsIi8vIGRyYWdcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAndW5pZHJhZ2dlci91bmlkcmFnZ2VyJyxcbiAgICAgICdmaXp6eS11aS11dGlscy91dGlscydcbiAgICBdLCBmdW5jdGlvbiggRmxpY2tpdHksIFVuaWRyYWdnZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFVuaWRyYWdnZXIsIHV0aWxzICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCcuL2ZsaWNraXR5JyksXG4gICAgICByZXF1aXJlKCd1bmlkcmFnZ2VyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5GbGlja2l0eSA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVW5pZHJhZ2dlcixcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgVW5pZHJhZ2dlciwgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gZGVmYXVsdHMgLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBkcmFnZ2FibGU6ICc+MScsXG4gIGRyYWdUaHJlc2hvbGQ6IDMsXG59KTtcblxuLy8gLS0tLS0gY3JlYXRlIC0tLS0tIC8vXG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZURyYWcnKTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZHJhZyBwcm90b3R5cGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xudXRpbHMuZXh0ZW5kKCBwcm90bywgVW5pZHJhZ2dlci5wcm90b3R5cGUgKTtcbnByb3RvLl90b3VjaEFjdGlvblZhbHVlID0gJ3Bhbi15JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1RvdWNoID0gJ2NyZWF0ZVRvdWNoJyBpbiBkb2N1bWVudDtcbnZhciBpc1RvdWNobW92ZVNjcm9sbENhbmNlbGVkID0gZmFsc2U7XG5cbnByb3RvLl9jcmVhdGVEcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdhY3RpdmF0ZScsIHRoaXMub25BY3RpdmF0ZURyYWcgKTtcbiAgdGhpcy5vbiggJ3VpQ2hhbmdlJywgdGhpcy5fdWlDaGFuZ2VEcmFnICk7XG4gIHRoaXMub24oICdjaGlsZFVJUG9pbnRlckRvd24nLCB0aGlzLl9jaGlsZFVJUG9pbnRlckRvd25EcmFnICk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy51bmJpbmREcmFnICk7XG4gIHRoaXMub24oICdjZWxsQ2hhbmdlJywgdGhpcy51cGRhdGVEcmFnZ2FibGUgKTtcbiAgLy8gVE9ETyB1cGRhdGVEcmFnZ2FibGUgb24gcmVzaXplPyBpZiBncm91cENlbGxzICYgc2xpZGVzIGNoYW5nZVxuICAvLyBIQUNLIC0gYWRkIHNlZW1pbmdseSBpbm5vY3VvdXMgaGFuZGxlciB0byBmaXggaU9TIDEwIHNjcm9sbCBiZWhhdmlvclxuICAvLyAjNDU3LCBSdWJhWGEvU29ydGFibGUjOTczXG4gIGlmICggaXNUb3VjaCAmJiAhaXNUb3VjaG1vdmVTY3JvbGxDYW5jZWxlZCApIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNobW92ZScsIGZ1bmN0aW9uKCkge30pO1xuICAgIGlzVG91Y2htb3ZlU2Nyb2xsQ2FuY2VsZWQgPSB0cnVlO1xuICB9XG59O1xuXG5wcm90by5vbkFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmhhbmRsZXMgPSBbIHRoaXMudmlld3BvcnQgXTtcbiAgdGhpcy5iaW5kSGFuZGxlcygpO1xuICB0aGlzLnVwZGF0ZURyYWdnYWJsZSgpO1xufTtcblxucHJvdG8ub25EZWFjdGl2YXRlRHJhZyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnVuYmluZEhhbmRsZXMoKTtcbiAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xufTtcblxucHJvdG8udXBkYXRlRHJhZ2dhYmxlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRpc2FibGUgZHJhZ2dpbmcgaWYgbGVzcyB0aGFuIDIgc2xpZGVzLiAjMjc4XG4gIGlmICggdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9PSAnPjEnICkge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLnNsaWRlcy5sZW5ndGggPiAxO1xuICB9IGVsc2Uge1xuICAgIHRoaXMuaXNEcmFnZ2FibGUgPSB0aGlzLm9wdGlvbnMuZHJhZ2dhYmxlO1xuICB9XG4gIGlmICggdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnaXMtZHJhZ2dhYmxlJyk7XG4gIH0gZWxzZSB7XG4gICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2lzLWRyYWdnYWJsZScpO1xuICB9XG59O1xuXG4vLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxucHJvdG8uYmluZERyYWcgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5vcHRpb25zLmRyYWdnYWJsZSA9IHRydWU7XG4gIHRoaXMudXBkYXRlRHJhZ2dhYmxlKCk7XG59O1xuXG5wcm90by51bmJpbmREcmFnID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub3B0aW9ucy5kcmFnZ2FibGUgPSBmYWxzZTtcbiAgdGhpcy51cGRhdGVEcmFnZ2FibGUoKTtcbn07XG5cbnByb3RvLl91aUNoYW5nZURyYWcgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuaXNGcmVlU2Nyb2xsaW5nO1xufTtcblxucHJvdG8uX2NoaWxkVUlQb2ludGVyRG93bkRyYWcgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIC8vIGFsbG93IGZvY3VzICYgcHJldmVudERlZmF1bHQgZXZlbiB3aGVuIG5vdCBkcmFnZ2FibGVcbiAgLy8gc28gY2hpbGQgVUkgZWxlbWVudHMga2VlcCBmb2N1cyBvbiBjYXJvdXNlbC4gIzcyMVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB0aGlzLnBvaW50ZXJEb3duRm9jdXMoIGV2ZW50ICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwb2ludGVyIGV2ZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5wb2ludGVyRG93biA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgaWYgKCAhdGhpcy5pc0RyYWdnYWJsZSApIHtcbiAgICB0aGlzLl9wb2ludGVyRG93bkRlZmF1bHQoIGV2ZW50LCBwb2ludGVyICk7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBpc09rYXkgPSB0aGlzLm9rYXlQb2ludGVyRG93biggZXZlbnQgKTtcbiAgaWYgKCAhaXNPa2F5ICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX3BvaW50ZXJEb3duUHJldmVudERlZmF1bHQoIGV2ZW50ICk7XG4gIHRoaXMucG9pbnRlckRvd25Gb2N1cyggZXZlbnQgKTtcbiAgLy8gYmx1clxuICBpZiAoIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT0gdGhpcy5lbGVtZW50ICkge1xuICAgIC8vIGRvIG5vdCBibHVyIGlmIGFscmVhZHkgZm9jdXNlZFxuICAgIHRoaXMucG9pbnRlckRvd25CbHVyKCk7XG4gIH1cblxuICAvLyBzdG9wIGlmIGl0IHdhcyBtb3ZpbmdcbiAgdGhpcy5kcmFnWCA9IHRoaXMueDtcbiAgdGhpcy52aWV3cG9ydC5jbGFzc0xpc3QuYWRkKCdpcy1wb2ludGVyLWRvd24nKTtcbiAgLy8gdHJhY2sgc2Nyb2xsaW5nXG4gIHRoaXMucG9pbnRlckRvd25TY3JvbGwgPSBnZXRTY3JvbGxQb3NpdGlvbigpO1xuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsIHRoaXMgKTtcblxuICB0aGlzLl9wb2ludGVyRG93bkRlZmF1bHQoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG4vLyBkZWZhdWx0IHBvaW50ZXJEb3duIGxvZ2ljLCB1c2VkIGZvciBzdGF0aWNDbGlja1xucHJvdG8uX3BvaW50ZXJEb3duRGVmYXVsdCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgLy8gdHJhY2sgc3RhcnQgZXZlbnQgcG9zaXRpb25cbiAgdGhpcy5wb2ludGVyRG93blBvaW50ZXIgPSBwb2ludGVyO1xuICAvLyBiaW5kIG1vdmUgYW5kIGVuZCBldmVudHNcbiAgdGhpcy5fYmluZFBvc3RTdGFydEV2ZW50cyggZXZlbnQgKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAncG9pbnRlckRvd24nLCBldmVudCwgWyBwb2ludGVyIF0gKTtcbn07XG5cbnZhciBmb2N1c05vZGVzID0ge1xuICBJTlBVVDogdHJ1ZSxcbiAgVEVYVEFSRUE6IHRydWUsXG4gIFNFTEVDVDogdHJ1ZSxcbn07XG5cbnByb3RvLnBvaW50ZXJEb3duRm9jdXMgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBpc0ZvY3VzTm9kZSA9IGZvY3VzTm9kZXNbIGV2ZW50LnRhcmdldC5ub2RlTmFtZSBdO1xuICBpZiAoICFpc0ZvY3VzTm9kZSApIHtcbiAgICB0aGlzLmZvY3VzKCk7XG4gIH1cbn07XG5cbnByb3RvLl9wb2ludGVyRG93blByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgaXNUb3VjaFN0YXJ0ID0gZXZlbnQudHlwZSA9PSAndG91Y2hzdGFydCc7XG4gIHZhciBpc1RvdWNoUG9pbnRlciA9IGV2ZW50LnBvaW50ZXJUeXBlID09ICd0b3VjaCc7XG4gIHZhciBpc0ZvY3VzTm9kZSA9IGZvY3VzTm9kZXNbIGV2ZW50LnRhcmdldC5ub2RlTmFtZSBdO1xuICBpZiAoICFpc1RvdWNoU3RhcnQgJiYgIWlzVG91Y2hQb2ludGVyICYmICFpc0ZvY3VzTm9kZSApIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICB9XG59O1xuXG4vLyAtLS0tLSBtb3ZlIC0tLS0tIC8vXG5cbnByb3RvLmhhc0RyYWdTdGFydGVkID0gZnVuY3Rpb24oIG1vdmVWZWN0b3IgKSB7XG4gIHJldHVybiBNYXRoLmFicyggbW92ZVZlY3Rvci54ICkgPiB0aGlzLm9wdGlvbnMuZHJhZ1RocmVzaG9sZDtcbn07XG5cbi8vIC0tLS0tIHVwIC0tLS0tIC8vXG5cbnByb3RvLnBvaW50ZXJVcCA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgZGVsZXRlIHRoaXMuaXNUb3VjaFNjcm9sbGluZztcbiAgdGhpcy52aWV3cG9ydC5jbGFzc0xpc3QucmVtb3ZlKCdpcy1wb2ludGVyLWRvd24nKTtcbiAgdGhpcy5kaXNwYXRjaEV2ZW50KCAncG9pbnRlclVwJywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG4gIHRoaXMuX2RyYWdQb2ludGVyVXAoIGV2ZW50LCBwb2ludGVyICk7XG59O1xuXG5wcm90by5wb2ludGVyRG9uZSA9IGZ1bmN0aW9uKCkge1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Njcm9sbCcsIHRoaXMgKTtcbiAgZGVsZXRlIHRoaXMucG9pbnRlckRvd25TY3JvbGw7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkcmFnZ2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5wcm90by5kcmFnU3RhcnQgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIGlmICggIXRoaXMuaXNEcmFnZ2FibGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gPSB0aGlzLng7XG4gIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdzY3JvbGwnLCB0aGlzICk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2RyYWdTdGFydCcsIGV2ZW50LCBbIHBvaW50ZXIgXSApO1xufTtcblxucHJvdG8ucG9pbnRlck1vdmUgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIHZhciBtb3ZlVmVjdG9yID0gdGhpcy5fZHJhZ1BvaW50ZXJNb3ZlKCBldmVudCwgcG9pbnRlciApO1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdwb2ludGVyTW92ZScsIGV2ZW50LCBbIHBvaW50ZXIsIG1vdmVWZWN0b3IgXSApO1xuICB0aGlzLl9kcmFnTW92ZSggZXZlbnQsIHBvaW50ZXIsIG1vdmVWZWN0b3IgKTtcbn07XG5cbnByb3RvLmRyYWdNb3ZlID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyLCBtb3ZlVmVjdG9yICkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gIHRoaXMucHJldmlvdXNEcmFnWCA9IHRoaXMuZHJhZ1g7XG4gIC8vIHJldmVyc2UgaWYgcmlnaHQtdG8tbGVmdFxuICB2YXIgZGlyZWN0aW9uID0gdGhpcy5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gLTEgOiAxO1xuICBpZiAoIHRoaXMub3B0aW9ucy53cmFwQXJvdW5kICkge1xuICAgIC8vIHdyYXAgYXJvdW5kIG1vdmUuICM1ODlcbiAgICBtb3ZlVmVjdG9yLnggPSBtb3ZlVmVjdG9yLnggJSB0aGlzLnNsaWRlYWJsZVdpZHRoO1xuICB9XG4gIHZhciBkcmFnWCA9IHRoaXMuZHJhZ1N0YXJ0UG9zaXRpb24gKyBtb3ZlVmVjdG9yLnggKiBkaXJlY3Rpb247XG5cbiAgaWYgKCAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgJiYgdGhpcy5zbGlkZXMubGVuZ3RoICkge1xuICAgIC8vIHNsb3cgZHJhZ1xuICAgIHZhciBvcmlnaW5Cb3VuZCA9IE1hdGgubWF4KCAtdGhpcy5zbGlkZXNbMF0udGFyZ2V0LCB0aGlzLmRyYWdTdGFydFBvc2l0aW9uICk7XG4gICAgZHJhZ1ggPSBkcmFnWCA+IG9yaWdpbkJvdW5kID8gKCBkcmFnWCArIG9yaWdpbkJvdW5kICkgKiAwLjUgOiBkcmFnWDtcbiAgICB2YXIgZW5kQm91bmQgPSBNYXRoLm1pbiggLXRoaXMuZ2V0TGFzdFNsaWRlKCkudGFyZ2V0LCB0aGlzLmRyYWdTdGFydFBvc2l0aW9uICk7XG4gICAgZHJhZ1ggPSBkcmFnWCA8IGVuZEJvdW5kID8gKCBkcmFnWCArIGVuZEJvdW5kICkgKiAwLjUgOiBkcmFnWDtcbiAgfVxuXG4gIHRoaXMuZHJhZ1ggPSBkcmFnWDtcblxuICB0aGlzLmRyYWdNb3ZlVGltZSA9IG5ldyBEYXRlKCk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ2RyYWdNb3ZlJywgZXZlbnQsIFsgcG9pbnRlciwgbW92ZVZlY3RvciBdICk7XG59O1xuXG5wcm90by5kcmFnRW5kID0gZnVuY3Rpb24oIGV2ZW50LCBwb2ludGVyICkge1xuICBpZiAoICF0aGlzLmlzRHJhZ2dhYmxlICkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoIHRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICkge1xuICAgIHRoaXMuaXNGcmVlU2Nyb2xsaW5nID0gdHJ1ZTtcbiAgfVxuICAvLyBzZXQgc2VsZWN0ZWRJbmRleCBiYXNlZCBvbiB3aGVyZSBmbGljayB3aWxsIGVuZCB1cFxuICB2YXIgaW5kZXggPSB0aGlzLmRyYWdFbmRSZXN0aW5nU2VsZWN0KCk7XG5cbiAgaWYgKCB0aGlzLm9wdGlvbnMuZnJlZVNjcm9sbCAmJiAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgKSB7XG4gICAgLy8gaWYgZnJlZS1zY3JvbGwgJiBub3Qgd3JhcCBhcm91bmRcbiAgICAvLyBkbyBub3QgZnJlZS1zY3JvbGwgaWYgZ29pbmcgb3V0c2lkZSBvZiBib3VuZGluZyBzbGlkZXNcbiAgICAvLyBzbyBib3VuZGluZyBzbGlkZXMgY2FuIGF0dHJhY3Qgc2xpZGVyLCBhbmQga2VlcCBpdCBpbiBib3VuZHNcbiAgICB2YXIgcmVzdGluZ1ggPSB0aGlzLmdldFJlc3RpbmdQb3NpdGlvbigpO1xuICAgIHRoaXMuaXNGcmVlU2Nyb2xsaW5nID0gLXJlc3RpbmdYID4gdGhpcy5zbGlkZXNbMF0udGFyZ2V0ICYmXG4gICAgICAtcmVzdGluZ1ggPCB0aGlzLmdldExhc3RTbGlkZSgpLnRhcmdldDtcbiAgfSBlbHNlIGlmICggIXRoaXMub3B0aW9ucy5mcmVlU2Nyb2xsICYmIGluZGV4ID09IHRoaXMuc2VsZWN0ZWRJbmRleCApIHtcbiAgICAvLyBib29zdCBzZWxlY3Rpb24gaWYgc2VsZWN0ZWQgaW5kZXggaGFzIG5vdCBjaGFuZ2VkXG4gICAgaW5kZXggKz0gdGhpcy5kcmFnRW5kQm9vc3RTZWxlY3QoKTtcbiAgfVxuICBkZWxldGUgdGhpcy5wcmV2aW91c0RyYWdYO1xuICAvLyBhcHBseSBzZWxlY3Rpb25cbiAgLy8gVE9ETyByZWZhY3RvciB0aGlzLCBzZWxlY3RpbmcgaGVyZSBmZWVscyB3ZWlyZFxuICAvLyBIQUNLLCBzZXQgZmxhZyBzbyBkcmFnZ2luZyBzdGF5cyBpbiBjb3JyZWN0IGRpcmVjdGlvblxuICB0aGlzLmlzRHJhZ1NlbGVjdCA9IHRoaXMub3B0aW9ucy53cmFwQXJvdW5kO1xuICB0aGlzLnNlbGVjdCggaW5kZXggKTtcbiAgZGVsZXRlIHRoaXMuaXNEcmFnU2VsZWN0O1xuICB0aGlzLmRpc3BhdGNoRXZlbnQoICdkcmFnRW5kJywgZXZlbnQsIFsgcG9pbnRlciBdICk7XG59O1xuXG5wcm90by5kcmFnRW5kUmVzdGluZ1NlbGVjdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVzdGluZ1ggPSB0aGlzLmdldFJlc3RpbmdQb3NpdGlvbigpO1xuICAvLyBob3cgZmFyIGF3YXkgZnJvbSBzZWxlY3RlZCBzbGlkZVxuICB2YXIgZGlzdGFuY2UgPSBNYXRoLmFicyggdGhpcy5nZXRTbGlkZURpc3RhbmNlKCAtcmVzdGluZ1gsIHRoaXMuc2VsZWN0ZWRJbmRleCApICk7XG4gIC8vIGdldCBjbG9zZXQgcmVzdGluZyBnb2luZyB1cCBhbmQgZ29pbmcgZG93blxuICB2YXIgcG9zaXRpdmVSZXN0aW5nID0gdGhpcy5fZ2V0Q2xvc2VzdFJlc3RpbmcoIHJlc3RpbmdYLCBkaXN0YW5jZSwgMSApO1xuICB2YXIgbmVnYXRpdmVSZXN0aW5nID0gdGhpcy5fZ2V0Q2xvc2VzdFJlc3RpbmcoIHJlc3RpbmdYLCBkaXN0YW5jZSwgLTEgKTtcbiAgLy8gdXNlIGNsb3NlciByZXN0aW5nIGZvciB3cmFwLWFyb3VuZFxuICB2YXIgaW5kZXggPSBwb3NpdGl2ZVJlc3RpbmcuZGlzdGFuY2UgPCBuZWdhdGl2ZVJlc3RpbmcuZGlzdGFuY2UgP1xuICAgIHBvc2l0aXZlUmVzdGluZy5pbmRleCA6IG5lZ2F0aXZlUmVzdGluZy5pbmRleDtcbiAgcmV0dXJuIGluZGV4O1xufTtcblxuLyoqXG4gKiBnaXZlbiByZXN0aW5nIFggYW5kIGRpc3RhbmNlIHRvIHNlbGVjdGVkIGNlbGxcbiAqIGdldCB0aGUgZGlzdGFuY2UgYW5kIGluZGV4IG9mIHRoZSBjbG9zZXN0IGNlbGxcbiAqIEBwYXJhbSB7TnVtYmVyfSByZXN0aW5nWCAtIGVzdGltYXRlZCBwb3N0LWZsaWNrIHJlc3RpbmcgcG9zaXRpb25cbiAqIEBwYXJhbSB7TnVtYmVyfSBkaXN0YW5jZSAtIGRpc3RhbmNlIHRvIHNlbGVjdGVkIGNlbGxcbiAqIEBwYXJhbSB7SW50ZWdlcn0gaW5jcmVtZW50IC0gKzEgb3IgLTEsIGdvaW5nIHVwIG9yIGRvd25cbiAqIEByZXR1cm5zIHtPYmplY3R9IC0geyBkaXN0YW5jZToge051bWJlcn0sIGluZGV4OiB7SW50ZWdlcn0gfVxuICovXG5wcm90by5fZ2V0Q2xvc2VzdFJlc3RpbmcgPSBmdW5jdGlvbiggcmVzdGluZ1gsIGRpc3RhbmNlLCBpbmNyZW1lbnQgKSB7XG4gIHZhciBpbmRleCA9IHRoaXMuc2VsZWN0ZWRJbmRleDtcbiAgdmFyIG1pbkRpc3RhbmNlID0gSW5maW5pdHk7XG4gIHZhciBjb25kaXRpb24gPSB0aGlzLm9wdGlvbnMuY29udGFpbiAmJiAhdGhpcy5vcHRpb25zLndyYXBBcm91bmQgP1xuICAgIC8vIGlmIGNvbnRhaW4sIGtlZXAgZ29pbmcgaWYgZGlzdGFuY2UgaXMgZXF1YWwgdG8gbWluRGlzdGFuY2VcbiAgICBmdW5jdGlvbiggZCwgbWQgKSB7IHJldHVybiBkIDw9IG1kOyB9IDogZnVuY3Rpb24oIGQsIG1kICkgeyByZXR1cm4gZCA8IG1kOyB9O1xuICB3aGlsZSAoIGNvbmRpdGlvbiggZGlzdGFuY2UsIG1pbkRpc3RhbmNlICkgKSB7XG4gICAgLy8gbWVhc3VyZSBkaXN0YW5jZSB0byBuZXh0IGNlbGxcbiAgICBpbmRleCArPSBpbmNyZW1lbnQ7XG4gICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICBkaXN0YW5jZSA9IHRoaXMuZ2V0U2xpZGVEaXN0YW5jZSggLXJlc3RpbmdYLCBpbmRleCApO1xuICAgIGlmICggZGlzdGFuY2UgPT09IG51bGwgKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGlzdGFuY2UgPSBNYXRoLmFicyggZGlzdGFuY2UgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGRpc3RhbmNlOiBtaW5EaXN0YW5jZSxcbiAgICAvLyBzZWxlY3RlZCB3YXMgcHJldmlvdXMgaW5kZXhcbiAgICBpbmRleDogaW5kZXggLSBpbmNyZW1lbnRcbiAgfTtcbn07XG5cbi8qKlxuICogbWVhc3VyZSBkaXN0YW5jZSBiZXR3ZWVuIHggYW5kIGEgc2xpZGUgdGFyZ2V0XG4gKiBAcGFyYW0ge051bWJlcn0geFxuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleCAtIHNsaWRlIGluZGV4XG4gKi9cbnByb3RvLmdldFNsaWRlRGlzdGFuY2UgPSBmdW5jdGlvbiggeCwgaW5kZXggKSB7XG4gIHZhciBsZW4gPSB0aGlzLnNsaWRlcy5sZW5ndGg7XG4gIC8vIHdyYXAgYXJvdW5kIGlmIGF0IGxlYXN0IDIgc2xpZGVzXG4gIHZhciBpc1dyYXBBcm91bmQgPSB0aGlzLm9wdGlvbnMud3JhcEFyb3VuZCAmJiBsZW4gPiAxO1xuICB2YXIgc2xpZGVJbmRleCA9IGlzV3JhcEFyb3VuZCA/IHV0aWxzLm1vZHVsbyggaW5kZXgsIGxlbiApIDogaW5kZXg7XG4gIHZhciBzbGlkZSA9IHRoaXMuc2xpZGVzWyBzbGlkZUluZGV4IF07XG4gIGlmICggIXNsaWRlICkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIC8vIGFkZCBkaXN0YW5jZSBmb3Igd3JhcC1hcm91bmQgc2xpZGVzXG4gIHZhciB3cmFwID0gaXNXcmFwQXJvdW5kID8gdGhpcy5zbGlkZWFibGVXaWR0aCAqIE1hdGguZmxvb3IoIGluZGV4IC8gbGVuICkgOiAwO1xuICByZXR1cm4geCAtICggc2xpZGUudGFyZ2V0ICsgd3JhcCApO1xufTtcblxucHJvdG8uZHJhZ0VuZEJvb3N0U2VsZWN0ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRvIG5vdCBib29zdCBpZiBubyBwcmV2aW91c0RyYWdYIG9yIGRyYWdNb3ZlVGltZVxuICBpZiAoIHRoaXMucHJldmlvdXNEcmFnWCA9PT0gdW5kZWZpbmVkIHx8ICF0aGlzLmRyYWdNb3ZlVGltZSB8fFxuICAgIC8vIG9yIGlmIGRyYWcgd2FzIGhlbGQgZm9yIDEwMCBtc1xuICAgIG5ldyBEYXRlKCkgLSB0aGlzLmRyYWdNb3ZlVGltZSA+IDEwMCApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciBkaXN0YW5jZSA9IHRoaXMuZ2V0U2xpZGVEaXN0YW5jZSggLXRoaXMuZHJhZ1gsIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICB2YXIgZGVsdGEgPSB0aGlzLnByZXZpb3VzRHJhZ1ggLSB0aGlzLmRyYWdYO1xuICBpZiAoIGRpc3RhbmNlID4gMCAmJiBkZWx0YSA+IDAgKSB7XG4gICAgLy8gYm9vc3QgdG8gbmV4dCBpZiBtb3ZpbmcgdG93YXJkcyB0aGUgcmlnaHQsIGFuZCBwb3NpdGl2ZSB2ZWxvY2l0eVxuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKCBkaXN0YW5jZSA8IDAgJiYgZGVsdGEgPCAwICkge1xuICAgIC8vIGJvb3N0IHRvIHByZXZpb3VzIGlmIG1vdmluZyB0b3dhcmRzIHRoZSBsZWZ0LCBhbmQgbmVnYXRpdmUgdmVsb2NpdHlcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG4vLyAtLS0tLSBzdGF0aWNDbGljayAtLS0tLSAvL1xuXG5wcm90by5zdGF0aWNDbGljayA9IGZ1bmN0aW9uKCBldmVudCwgcG9pbnRlciApIHtcbiAgLy8gZ2V0IGNsaWNrZWRDZWxsLCBpZiBjZWxsIHdhcyBjbGlja2VkXG4gIHZhciBjbGlja2VkQ2VsbCA9IHRoaXMuZ2V0UGFyZW50Q2VsbCggZXZlbnQudGFyZ2V0ICk7XG4gIHZhciBjZWxsRWxlbSA9IGNsaWNrZWRDZWxsICYmIGNsaWNrZWRDZWxsLmVsZW1lbnQ7XG4gIHZhciBjZWxsSW5kZXggPSBjbGlja2VkQ2VsbCAmJiB0aGlzLmNlbGxzLmluZGV4T2YoIGNsaWNrZWRDZWxsICk7XG4gIHRoaXMuZGlzcGF0Y2hFdmVudCggJ3N0YXRpY0NsaWNrJywgZXZlbnQsIFsgcG9pbnRlciwgY2VsbEVsZW0sIGNlbGxJbmRleCBdICk7XG59O1xuXG4vLyAtLS0tLSBzY3JvbGwgLS0tLS0gLy9cblxucHJvdG8ub25zY3JvbGwgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHNjcm9sbCA9IGdldFNjcm9sbFBvc2l0aW9uKCk7XG4gIHZhciBzY3JvbGxNb3ZlWCA9IHRoaXMucG9pbnRlckRvd25TY3JvbGwueCAtIHNjcm9sbC54O1xuICB2YXIgc2Nyb2xsTW92ZVkgPSB0aGlzLnBvaW50ZXJEb3duU2Nyb2xsLnkgLSBzY3JvbGwueTtcbiAgLy8gY2FuY2VsIGNsaWNrL3RhcCBpZiBzY3JvbGwgaXMgdG9vIG11Y2hcbiAgaWYgKCBNYXRoLmFicyggc2Nyb2xsTW92ZVggKSA+IDMgfHwgTWF0aC5hYnMoIHNjcm9sbE1vdmVZICkgPiAzICkge1xuICAgIHRoaXMuX3BvaW50ZXJEb25lKCk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIHV0aWxzIC0tLS0tIC8vXG5cbmZ1bmN0aW9uIGdldFNjcm9sbFBvc2l0aW9uKCkge1xuICByZXR1cm4ge1xuICAgIHg6IHdpbmRvdy5wYWdlWE9mZnNldCxcbiAgICB5OiB3aW5kb3cucGFnZVlPZmZzZXRcbiAgfTtcbn1cblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIiwiLyohXG4gKiBUYXAgbGlzdGVuZXIgdjIuMC4wXG4gKiBsaXN0ZW5zIHRvIHRhcHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLypqc2hpbnQgYnJvd3NlcjogdHJ1ZSwgdW51c2VkOiB0cnVlLCB1bmRlZjogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qanNoaW50IHN0cmljdDogZmFsc2UqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ3VuaXBvaW50ZXIvdW5pcG9pbnRlcidcbiAgICBdLCBmdW5jdGlvbiggVW5pcG9pbnRlciApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIFVuaXBvaW50ZXIgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ3VuaXBvaW50ZXInKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuVGFwTGlzdGVuZXIgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LlVuaXBvaW50ZXJcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBVbmlwb2ludGVyICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBUYXBMaXN0ZW5lciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBUYXBMaXN0ZW5lciggZWxlbSApIHtcbiAgdGhpcy5iaW5kVGFwKCBlbGVtICk7XG59XG5cbi8vIGluaGVyaXQgVW5pcG9pbnRlciAmIEV2ZW50RW1pdHRlclxudmFyIHByb3RvID0gVGFwTGlzdGVuZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVW5pcG9pbnRlci5wcm90b3R5cGUgKTtcblxuLyoqXG4gKiBiaW5kIHRhcCBldmVudCB0byBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqL1xucHJvdG8uYmluZFRhcCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICBpZiAoICFlbGVtICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnVuYmluZFRhcCgpO1xuICB0aGlzLnRhcEVsZW1lbnQgPSBlbGVtO1xuICB0aGlzLl9iaW5kU3RhcnRFdmVudCggZWxlbSwgdHJ1ZSApO1xufTtcblxucHJvdG8udW5iaW5kVGFwID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMudGFwRWxlbWVudCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5fYmluZFN0YXJ0RXZlbnQoIHRoaXMudGFwRWxlbWVudCwgdHJ1ZSApO1xuICBkZWxldGUgdGhpcy50YXBFbGVtZW50O1xufTtcblxuLyoqXG4gKiBwb2ludGVyIHVwXG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudFxuICogQHBhcmFtIHtFdmVudCBvciBUb3VjaH0gcG9pbnRlclxuICovXG5wcm90by5wb2ludGVyVXAgPSBmdW5jdGlvbiggZXZlbnQsIHBvaW50ZXIgKSB7XG4gIC8vIGlnbm9yZSBlbXVsYXRlZCBtb3VzZSB1cCBjbGlja3NcbiAgaWYgKCB0aGlzLmlzSWdub3JpbmdNb3VzZVVwICYmIGV2ZW50LnR5cGUgPT0gJ21vdXNldXAnICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBwb2ludGVyUG9pbnQgPSBVbmlwb2ludGVyLmdldFBvaW50ZXJQb2ludCggcG9pbnRlciApO1xuICB2YXIgYm91bmRpbmdSZWN0ID0gdGhpcy50YXBFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2Nyb2xsWCA9IHdpbmRvdy5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFkgPSB3aW5kb3cucGFnZVlPZmZzZXQ7XG4gIC8vIGNhbGN1bGF0ZSBpZiBwb2ludGVyIGlzIGluc2lkZSB0YXBFbGVtZW50XG4gIHZhciBpc0luc2lkZSA9IHBvaW50ZXJQb2ludC54ID49IGJvdW5kaW5nUmVjdC5sZWZ0ICsgc2Nyb2xsWCAmJlxuICAgIHBvaW50ZXJQb2ludC54IDw9IGJvdW5kaW5nUmVjdC5yaWdodCArIHNjcm9sbFggJiZcbiAgICBwb2ludGVyUG9pbnQueSA+PSBib3VuZGluZ1JlY3QudG9wICsgc2Nyb2xsWSAmJlxuICAgIHBvaW50ZXJQb2ludC55IDw9IGJvdW5kaW5nUmVjdC5ib3R0b20gKyBzY3JvbGxZO1xuICAvLyB0cmlnZ2VyIGNhbGxiYWNrIGlmIHBvaW50ZXIgaXMgaW5zaWRlIGVsZW1lbnRcbiAgaWYgKCBpc0luc2lkZSApIHtcbiAgICB0aGlzLmVtaXRFdmVudCggJ3RhcCcsIFsgZXZlbnQsIHBvaW50ZXIgXSApO1xuICB9XG5cbiAgLy8gc2V0IGZsYWcgZm9yIGVtdWxhdGVkIGNsaWNrcyAzMDBtcyBhZnRlciB0b3VjaGVuZFxuICBpZiAoIGV2ZW50LnR5cGUgIT0gJ21vdXNldXAnICkge1xuICAgIHRoaXMuaXNJZ25vcmluZ01vdXNlVXAgPSB0cnVlO1xuICAgIC8vIHJlc2V0IGZsYWcgYWZ0ZXIgMzAwbXNcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgICAgZGVsZXRlIF90aGlzLmlzSWdub3JpbmdNb3VzZVVwO1xuICAgIH0sIDQwMCApO1xuICB9XG59O1xuXG5wcm90by5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucG9pbnRlckRvbmUoKTtcbiAgdGhpcy51bmJpbmRUYXAoKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5yZXR1cm4gVGFwTGlzdGVuZXI7XG5cbn0pKTtcbiIsIi8vIHByZXYvbmV4dCBidXR0b25zXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ3RhcC1saXN0ZW5lci90YXAtbGlzdGVuZXInLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJ1xuICAgIF0sIGZ1bmN0aW9uKCBGbGlja2l0eSwgVGFwTGlzdGVuZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFRhcExpc3RlbmVyLCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgndGFwLWxpc3RlbmVyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVGFwTGlzdGVuZXIsXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFRhcExpc3RlbmVyLCB1dGlscyApIHtcbid1c2Ugc3RyaWN0JztcblxudmFyIHN2Z1VSSSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFByZXZOZXh0QnV0dG9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIFByZXZOZXh0QnV0dG9uKCBkaXJlY3Rpb24sIHBhcmVudCApIHtcbiAgdGhpcy5kaXJlY3Rpb24gPSBkaXJlY3Rpb247XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLl9jcmVhdGUoKTtcbn1cblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGFwTGlzdGVuZXIucHJvdG90eXBlICk7XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5fY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gIC8vIHByb3BlcnRpZXNcbiAgdGhpcy5pc0VuYWJsZWQgPSB0cnVlO1xuICB0aGlzLmlzUHJldmlvdXMgPSB0aGlzLmRpcmVjdGlvbiA9PSAtMTtcbiAgdmFyIGxlZnREaXJlY3Rpb24gPSB0aGlzLnBhcmVudC5vcHRpb25zLnJpZ2h0VG9MZWZ0ID8gMSA6IC0xO1xuICB0aGlzLmlzTGVmdCA9IHRoaXMuZGlyZWN0aW9uID09IGxlZnREaXJlY3Rpb247XG5cbiAgdmFyIGVsZW1lbnQgPSB0aGlzLmVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKTtcbiAgZWxlbWVudC5jbGFzc05hbWUgPSAnZmxpY2tpdHktYnV0dG9uIGZsaWNraXR5LXByZXYtbmV4dC1idXR0b24nO1xuICBlbGVtZW50LmNsYXNzTmFtZSArPSB0aGlzLmlzUHJldmlvdXMgPyAnIHByZXZpb3VzJyA6ICcgbmV4dCc7XG4gIC8vIHByZXZlbnQgYnV0dG9uIGZyb20gc3VibWl0dGluZyBmb3JtIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzEwODM2MDc2LzE4MjE4M1xuICBlbGVtZW50LnNldEF0dHJpYnV0ZSggJ3R5cGUnLCAnYnV0dG9uJyApO1xuICAvLyBpbml0IGFzIGRpc2FibGVkXG4gIHRoaXMuZGlzYWJsZSgpO1xuXG4gIGVsZW1lbnQuc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsIHRoaXMuaXNQcmV2aW91cyA/ICdQcmV2aW91cycgOiAnTmV4dCcgKTtcblxuICAvLyBjcmVhdGUgYXJyb3dcbiAgdmFyIHN2ZyA9IHRoaXMuY3JlYXRlU1ZHKCk7XG4gIGVsZW1lbnQuYXBwZW5kQ2hpbGQoIHN2ZyApO1xuICAvLyBldmVudHNcbiAgdGhpcy5vbiggJ3RhcCcsIHRoaXMub25UYXAgKTtcbiAgdGhpcy5wYXJlbnQub24oICdzZWxlY3QnLCB0aGlzLnVwZGF0ZS5iaW5kKCB0aGlzICkgKTtcbiAgdGhpcy5vbiggJ3BvaW50ZXJEb3duJywgdGhpcy5wYXJlbnQuY2hpbGRVSVBvaW50ZXJEb3duLmJpbmQoIHRoaXMucGFyZW50ICkgKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmJpbmRUYXAoIHRoaXMuZWxlbWVudCApO1xuICAvLyBjbGljayBldmVudHMgZnJvbSBrZXlib2FyZFxuICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcyApO1xuICAvLyBhZGQgdG8gRE9NXG4gIHRoaXMucGFyZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmRlYWN0aXZhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gcmVtb3ZlIGZyb20gRE9NXG4gIHRoaXMucGFyZW50LmVsZW1lbnQucmVtb3ZlQ2hpbGQoIHRoaXMuZWxlbWVudCApO1xuICAvLyBkbyByZWd1bGFyIFRhcExpc3RlbmVyIGRlc3Ryb3lcbiAgVGFwTGlzdGVuZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCggdGhpcyApO1xuICAvLyBjbGljayBldmVudHMgZnJvbSBrZXlib2FyZFxuICB0aGlzLmVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NsaWNrJywgdGhpcyApO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLmNyZWF0ZVNWRyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCBzdmdVUkksICdzdmcnKTtcbiAgc3ZnLnNldEF0dHJpYnV0ZSggJ2NsYXNzJywgJ2ZsaWNraXR5LWJ1dHRvbi1pY29uJyApO1xuICBzdmcuc2V0QXR0cmlidXRlKCAndmlld0JveCcsICcwIDAgMTAwIDEwMCcgKTtcbiAgdmFyIHBhdGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoIHN2Z1VSSSwgJ3BhdGgnKTtcbiAgdmFyIHBhdGhNb3ZlbWVudHMgPSBnZXRBcnJvd01vdmVtZW50cyggdGhpcy5wYXJlbnQub3B0aW9ucy5hcnJvd1NoYXBlICk7XG4gIHBhdGguc2V0QXR0cmlidXRlKCAnZCcsIHBhdGhNb3ZlbWVudHMgKTtcbiAgcGF0aC5zZXRBdHRyaWJ1dGUoICdjbGFzcycsICdhcnJvdycgKTtcbiAgLy8gcm90YXRlIGFycm93XG4gIGlmICggIXRoaXMuaXNMZWZ0ICkge1xuICAgIHBhdGguc2V0QXR0cmlidXRlKCAndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgxMDAsIDEwMCkgcm90YXRlKDE4MCkgJyApO1xuICB9XG4gIHN2Zy5hcHBlbmRDaGlsZCggcGF0aCApO1xuICByZXR1cm4gc3ZnO1xufTtcblxuLy8gZ2V0IFNWRyBwYXRoIG1vdm1lbWVudFxuZnVuY3Rpb24gZ2V0QXJyb3dNb3ZlbWVudHMoIHNoYXBlICkge1xuICAvLyB1c2Ugc2hhcGUgYXMgbW92ZW1lbnQgaWYgc3RyaW5nXG4gIGlmICggdHlwZW9mIHNoYXBlID09ICdzdHJpbmcnICkge1xuICAgIHJldHVybiBzaGFwZTtcbiAgfVxuICAvLyBjcmVhdGUgbW92ZW1lbnQgc3RyaW5nXG4gIHJldHVybiAnTSAnICsgc2hhcGUueDAgKyAnLDUwJyArXG4gICAgJyBMICcgKyBzaGFwZS54MSArICcsJyArICggc2hhcGUueTEgKyA1MCApICtcbiAgICAnIEwgJyArIHNoYXBlLngyICsgJywnICsgKCBzaGFwZS55MiArIDUwICkgK1xuICAgICcgTCAnICsgc2hhcGUueDMgKyAnLDUwICcgK1xuICAgICcgTCAnICsgc2hhcGUueDIgKyAnLCcgKyAoIDUwIC0gc2hhcGUueTIgKSArXG4gICAgJyBMICcgKyBzaGFwZS54MSArICcsJyArICggNTAgLSBzaGFwZS55MSApICtcbiAgICAnIFonO1xufVxuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUub25UYXAgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5pc0VuYWJsZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMucGFyZW50LnVpQ2hhbmdlKCk7XG4gIHZhciBtZXRob2QgPSB0aGlzLmlzUHJldmlvdXMgPyAncHJldmlvdXMnIDogJ25leHQnO1xuICB0aGlzLnBhcmVudFsgbWV0aG9kIF0oKTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5oYW5kbGVFdmVudCA9IHV0aWxzLmhhbmRsZUV2ZW50O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUub25jbGljayA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gb25seSBhbGxvdyBjbGlja3MgZnJvbSBrZXlib2FyZFxuICB2YXIgZm9jdXNlZCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG4gIGlmICggZm9jdXNlZCAmJiBmb2N1c2VkID09IHRoaXMuZWxlbWVudCApIHtcbiAgICB0aGlzLm9uVGFwKCBldmVudCwgZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5lbmFibGUgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCB0aGlzLmlzRW5hYmxlZCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5lbGVtZW50LmRpc2FibGVkID0gZmFsc2U7XG4gIHRoaXMuaXNFbmFibGVkID0gdHJ1ZTtcbn07XG5cblByZXZOZXh0QnV0dG9uLnByb3RvdHlwZS5kaXNhYmxlID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMuaXNFbmFibGVkICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLmVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlO1xuICB0aGlzLmlzRW5hYmxlZCA9IGZhbHNlO1xufTtcblxuUHJldk5leHRCdXR0b24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBpbmRleCBvZiBmaXJzdCBvciBsYXN0IHNsaWRlLCBpZiBwcmV2aW91cyBvciBuZXh0XG4gIHZhciBzbGlkZXMgPSB0aGlzLnBhcmVudC5zbGlkZXM7XG4gIC8vIGVuYWJsZSBpcyB3cmFwQXJvdW5kIGFuZCBhdCBsZWFzdCAyIHNsaWRlc1xuICBpZiAoIHRoaXMucGFyZW50Lm9wdGlvbnMud3JhcEFyb3VuZCAmJiBzbGlkZXMubGVuZ3RoID4gMSApIHtcbiAgICB0aGlzLmVuYWJsZSgpO1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgbGFzdEluZGV4ID0gc2xpZGVzLmxlbmd0aCA/IHNsaWRlcy5sZW5ndGggLSAxIDogMDtcbiAgdmFyIGJvdW5kSW5kZXggPSB0aGlzLmlzUHJldmlvdXMgPyAwIDogbGFzdEluZGV4O1xuICB2YXIgbWV0aG9kID0gdGhpcy5wYXJlbnQuc2VsZWN0ZWRJbmRleCA9PSBib3VuZEluZGV4ID8gJ2Rpc2FibGUnIDogJ2VuYWJsZSc7XG4gIHRoaXNbIG1ldGhvZCBdKCk7XG59O1xuXG5QcmV2TmV4dEJ1dHRvbi5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmRlYWN0aXZhdGUoKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG51dGlscy5leHRlbmQoIEZsaWNraXR5LmRlZmF1bHRzLCB7XG4gIHByZXZOZXh0QnV0dG9uczogdHJ1ZSxcbiAgYXJyb3dTaGFwZToge1xuICAgIHgwOiAxMCxcbiAgICB4MTogNjAsIHkxOiA1MCxcbiAgICB4MjogNzAsIHkyOiA0MCxcbiAgICB4MzogMzBcbiAgfVxufSk7XG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZVByZXZOZXh0QnV0dG9ucycpO1xudmFyIHByb3RvID0gRmxpY2tpdHkucHJvdG90eXBlO1xuXG5wcm90by5fY3JlYXRlUHJldk5leHRCdXR0b25zID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5wcmV2TmV4dEJ1dHRvbnMgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5wcmV2QnV0dG9uID0gbmV3IFByZXZOZXh0QnV0dG9uKCAtMSwgdGhpcyApO1xuICB0aGlzLm5leHRCdXR0b24gPSBuZXcgUHJldk5leHRCdXR0b24oIDEsIHRoaXMgKTtcblxuICB0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlUHJldk5leHRCdXR0b25zICk7XG59O1xuXG5wcm90by5hY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnByZXZCdXR0b24uYWN0aXZhdGUoKTtcbiAgdGhpcy5uZXh0QnV0dG9uLmFjdGl2YXRlKCk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlUHJldk5leHRCdXR0b25zICk7XG59O1xuXG5wcm90by5kZWFjdGl2YXRlUHJldk5leHRCdXR0b25zID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucHJldkJ1dHRvbi5kZWFjdGl2YXRlKCk7XG4gIHRoaXMubmV4dEJ1dHRvbi5kZWFjdGl2YXRlKCk7XG4gIHRoaXMub2ZmKCAnZGVhY3RpdmF0ZScsIHRoaXMuZGVhY3RpdmF0ZVByZXZOZXh0QnV0dG9ucyApO1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbkZsaWNraXR5LlByZXZOZXh0QnV0dG9uID0gUHJldk5leHRCdXR0b247XG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIiwiLy8gcGFnZSBkb3RzXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ3RhcC1saXN0ZW5lci90YXAtbGlzdGVuZXInLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJ1xuICAgIF0sIGZ1bmN0aW9uKCBGbGlja2l0eSwgVGFwTGlzdGVuZXIsIHV0aWxzICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFRhcExpc3RlbmVyLCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgndGFwLWxpc3RlbmVyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRmxpY2tpdHksXG4gICAgICB3aW5kb3cuVGFwTGlzdGVuZXIsXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRmxpY2tpdHksIFRhcExpc3RlbmVyLCB1dGlscyApIHtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUGFnZURvdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBQYWdlRG90cyggcGFyZW50ICkge1xuICB0aGlzLnBhcmVudCA9IHBhcmVudDtcbiAgdGhpcy5fY3JlYXRlKCk7XG59XG5cblBhZ2VEb3RzLnByb3RvdHlwZSA9IG5ldyBUYXBMaXN0ZW5lcigpO1xuXG5QYWdlRG90cy5wcm90b3R5cGUuX2NyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyBjcmVhdGUgaG9sZGVyIGVsZW1lbnRcbiAgdGhpcy5ob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdvbCcpO1xuICB0aGlzLmhvbGRlci5jbGFzc05hbWUgPSAnZmxpY2tpdHktcGFnZS1kb3RzJztcbiAgLy8gY3JlYXRlIGRvdHMsIGFycmF5IG9mIGVsZW1lbnRzXG4gIHRoaXMuZG90cyA9IFtdO1xuICAvLyBldmVudHNcbiAgdGhpcy5vbiggJ3RhcCcsIHRoaXMub25UYXAgKTtcbiAgdGhpcy5vbiggJ3BvaW50ZXJEb3duJywgdGhpcy5wYXJlbnQuY2hpbGRVSVBvaW50ZXJEb3duLmJpbmQoIHRoaXMucGFyZW50ICkgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5hY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNldERvdHMoKTtcbiAgdGhpcy5iaW5kVGFwKCB0aGlzLmhvbGRlciApO1xuICAvLyBhZGQgdG8gRE9NXG4gIHRoaXMucGFyZW50LmVsZW1lbnQuYXBwZW5kQ2hpbGQoIHRoaXMuaG9sZGVyICk7XG59O1xuXG5QYWdlRG90cy5wcm90b3R5cGUuZGVhY3RpdmF0ZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgdGhpcy5wYXJlbnQuZWxlbWVudC5yZW1vdmVDaGlsZCggdGhpcy5ob2xkZXIgKTtcbiAgVGFwTGlzdGVuZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCggdGhpcyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnNldERvdHMgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGRpZmZlcmVuY2UgYmV0d2VlbiBudW1iZXIgb2Ygc2xpZGVzIGFuZCBudW1iZXIgb2YgZG90c1xuICB2YXIgZGVsdGEgPSB0aGlzLnBhcmVudC5zbGlkZXMubGVuZ3RoIC0gdGhpcy5kb3RzLmxlbmd0aDtcbiAgaWYgKCBkZWx0YSA+IDAgKSB7XG4gICAgdGhpcy5hZGREb3RzKCBkZWx0YSApO1xuICB9IGVsc2UgaWYgKCBkZWx0YSA8IDAgKSB7XG4gICAgdGhpcy5yZW1vdmVEb3RzKCAtZGVsdGEgKTtcbiAgfVxufTtcblxuUGFnZURvdHMucHJvdG90eXBlLmFkZERvdHMgPSBmdW5jdGlvbiggY291bnQgKSB7XG4gIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtcbiAgdmFyIG5ld0RvdHMgPSBbXTtcbiAgdmFyIGxlbmd0aCA9IHRoaXMuZG90cy5sZW5ndGg7XG4gIHZhciBtYXggPSBsZW5ndGggKyBjb3VudDtcblxuICBmb3IgKCB2YXIgaSA9IGxlbmd0aDsgaSA8IG1heDsgaSsrICkge1xuICAgIHZhciBkb3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpO1xuICAgIGRvdC5jbGFzc05hbWUgPSAnZG90JztcbiAgICBkb3Quc2V0QXR0cmlidXRlKCAnYXJpYS1sYWJlbCcsICdQYWdlIGRvdCAnICsgKCBpICsgMSApICk7XG4gICAgZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGRvdCApO1xuICAgIG5ld0RvdHMucHVzaCggZG90ICk7XG4gIH1cblxuICB0aGlzLmhvbGRlci5hcHBlbmRDaGlsZCggZnJhZ21lbnQgKTtcbiAgdGhpcy5kb3RzID0gdGhpcy5kb3RzLmNvbmNhdCggbmV3RG90cyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnJlbW92ZURvdHMgPSBmdW5jdGlvbiggY291bnQgKSB7XG4gIC8vIHJlbW92ZSBmcm9tIHRoaXMuZG90cyBjb2xsZWN0aW9uXG4gIHZhciByZW1vdmVEb3RzID0gdGhpcy5kb3RzLnNwbGljZSggdGhpcy5kb3RzLmxlbmd0aCAtIGNvdW50LCBjb3VudCApO1xuICAvLyByZW1vdmUgZnJvbSBET01cbiAgcmVtb3ZlRG90cy5mb3JFYWNoKCBmdW5jdGlvbiggZG90ICkge1xuICAgIHRoaXMuaG9sZGVyLnJlbW92ZUNoaWxkKCBkb3QgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuUGFnZURvdHMucHJvdG90eXBlLnVwZGF0ZVNlbGVjdGVkID0gZnVuY3Rpb24oKSB7XG4gIC8vIHJlbW92ZSBzZWxlY3RlZCBjbGFzcyBvbiBwcmV2aW91c1xuICBpZiAoIHRoaXMuc2VsZWN0ZWREb3QgKSB7XG4gICAgdGhpcy5zZWxlY3RlZERvdC5jbGFzc05hbWUgPSAnZG90JztcbiAgICB0aGlzLnNlbGVjdGVkRG90LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1jdXJyZW50Jyk7XG4gIH1cbiAgLy8gZG9uJ3QgcHJvY2VlZCBpZiBubyBkb3RzXG4gIGlmICggIXRoaXMuZG90cy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuc2VsZWN0ZWREb3QgPSB0aGlzLmRvdHNbIHRoaXMucGFyZW50LnNlbGVjdGVkSW5kZXggXTtcbiAgdGhpcy5zZWxlY3RlZERvdC5jbGFzc05hbWUgPSAnZG90IGlzLXNlbGVjdGVkJztcbiAgdGhpcy5zZWxlY3RlZERvdC5zZXRBdHRyaWJ1dGUoICdhcmlhLWN1cnJlbnQnLCAnc3RlcCcgKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5vblRhcCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdmFyIHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgLy8gb25seSBjYXJlIGFib3V0IGRvdCBjbGlja3NcbiAgaWYgKCB0YXJnZXQubm9kZU5hbWUgIT0gJ0xJJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLnBhcmVudC51aUNoYW5nZSgpO1xuICB2YXIgaW5kZXggPSB0aGlzLmRvdHMuaW5kZXhPZiggdGFyZ2V0ICk7XG4gIHRoaXMucGFyZW50LnNlbGVjdCggaW5kZXggKTtcbn07XG5cblBhZ2VEb3RzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZGVhY3RpdmF0ZSgpO1xufTtcblxuRmxpY2tpdHkuUGFnZURvdHMgPSBQYWdlRG90cztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmxpY2tpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxudXRpbHMuZXh0ZW5kKCBGbGlja2l0eS5kZWZhdWx0cywge1xuICBwYWdlRG90czogdHJ1ZVxufSk7XG5cbkZsaWNraXR5LmNyZWF0ZU1ldGhvZHMucHVzaCgnX2NyZWF0ZVBhZ2VEb3RzJyk7XG5cbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZVBhZ2VEb3RzID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5wYWdlRG90cyApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wYWdlRG90cyA9IG5ldyBQYWdlRG90cyggdGhpcyApO1xuICAvLyBldmVudHNcbiAgdGhpcy5vbiggJ2FjdGl2YXRlJywgdGhpcy5hY3RpdmF0ZVBhZ2VEb3RzICk7XG4gIHRoaXMub24oICdzZWxlY3QnLCB0aGlzLnVwZGF0ZVNlbGVjdGVkUGFnZURvdHMgKTtcbiAgdGhpcy5vbiggJ2NlbGxDaGFuZ2UnLCB0aGlzLnVwZGF0ZVBhZ2VEb3RzICk7XG4gIHRoaXMub24oICdyZXNpemUnLCB0aGlzLnVwZGF0ZVBhZ2VEb3RzICk7XG4gIHRoaXMub24oICdkZWFjdGl2YXRlJywgdGhpcy5kZWFjdGl2YXRlUGFnZURvdHMgKTtcbn07XG5cbnByb3RvLmFjdGl2YXRlUGFnZURvdHMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wYWdlRG90cy5hY3RpdmF0ZSgpO1xufTtcblxucHJvdG8udXBkYXRlU2VsZWN0ZWRQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLnVwZGF0ZVNlbGVjdGVkKCk7XG59O1xuXG5wcm90by51cGRhdGVQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLnNldERvdHMoKTtcbn07XG5cbnByb3RvLmRlYWN0aXZhdGVQYWdlRG90cyA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBhZ2VEb3RzLmRlYWN0aXZhdGUoKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5QYWdlRG90cyA9IFBhZ2VEb3RzO1xuXG5yZXR1cm4gRmxpY2tpdHk7XG5cbn0pKTtcbiIsIi8vIHBsYXllciAmIGF1dG9QbGF5XG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2V2LWVtaXR0ZXIvZXYtZW1pdHRlcicsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnLFxuICAgICAgJy4vZmxpY2tpdHknXG4gICAgXSwgZnVuY3Rpb24oIEV2RW1pdHRlciwgdXRpbHMsIEZsaWNraXR5ICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIEV2RW1pdHRlciwgdXRpbHMsIEZsaWNraXR5ICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJyksXG4gICAgICByZXF1aXJlKCdmaXp6eS11aS11dGlscycpLFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIGZhY3RvcnkoXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgd2luZG93LmZpenp5VUlVdGlscyxcbiAgICAgIHdpbmRvdy5GbGlja2l0eVxuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCBFdkVtaXR0ZXIsIHV0aWxzLCBGbGlja2l0eSApIHtcblxuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQbGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gUGxheWVyKCBwYXJlbnQgKSB7XG4gIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB0aGlzLnN0YXRlID0gJ3N0b3BwZWQnO1xuICAvLyB2aXNpYmlsaXR5IGNoYW5nZSBldmVudCBoYW5kbGVyXG4gIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlID0gdGhpcy52aXNpYmlsaXR5Q2hhbmdlLmJpbmQoIHRoaXMgKTtcbiAgdGhpcy5vblZpc2liaWxpdHlQbGF5ID0gdGhpcy52aXNpYmlsaXR5UGxheS5iaW5kKCB0aGlzICk7XG59XG5cblBsYXllci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbi8vIHN0YXJ0IHBsYXlcblBsYXllci5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BsYXlpbmcnICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBkbyBub3QgcGxheSBpZiBwYWdlIGlzIGhpZGRlbiwgc3RhcnQgcGxheWluZyB3aGVuIHBhZ2UgaXMgdmlzaWJsZVxuICB2YXIgaXNQYWdlSGlkZGVuID0gZG9jdW1lbnQuaGlkZGVuO1xuICBpZiAoIGlzUGFnZUhpZGRlbiApIHtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5UGxheSApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuc3RhdGUgPSAncGxheWluZyc7XG4gIC8vIGxpc3RlbiB0byB2aXNpYmlsaXR5IGNoYW5nZVxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCAndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlICk7XG4gIC8vIHN0YXJ0IHRpY2tpbmdcbiAgdGhpcy50aWNrKCk7XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnRpY2sgPSBmdW5jdGlvbigpIHtcbiAgLy8gZG8gbm90IHRpY2sgaWYgbm90IHBsYXlpbmdcbiAgaWYgKCB0aGlzLnN0YXRlICE9ICdwbGF5aW5nJyApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdGltZSA9IHRoaXMucGFyZW50Lm9wdGlvbnMuYXV0b1BsYXk7XG4gIC8vIGRlZmF1bHQgdG8gMyBzZWNvbmRzXG4gIHRpbWUgPSB0eXBlb2YgdGltZSA9PSAnbnVtYmVyJyA/IHRpbWUgOiAzMDAwO1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICAvLyBIQUNLOiByZXNldCB0aWNrcyBpZiBzdG9wcGVkIGFuZCBzdGFydGVkIHdpdGhpbiBpbnRlcnZhbFxuICB0aGlzLmNsZWFyKCk7XG4gIHRoaXMudGltZW91dCA9IHNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuICAgIF90aGlzLnBhcmVudC5uZXh0KCB0cnVlICk7XG4gICAgX3RoaXMudGljaygpO1xuICB9LCB0aW1lICk7XG59O1xuXG5QbGF5ZXIucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5zdGF0ZSA9ICdzdG9wcGVkJztcbiAgdGhpcy5jbGVhcigpO1xuICAvLyByZW1vdmUgdmlzaWJpbGl0eSBjaGFuZ2UgZXZlbnRcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkge1xuICBjbGVhclRpbWVvdXQoIHRoaXMudGltZW91dCApO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BsYXlpbmcnICkge1xuICAgIHRoaXMuc3RhdGUgPSAncGF1c2VkJztcbiAgICB0aGlzLmNsZWFyKCk7XG4gIH1cbn07XG5cblBsYXllci5wcm90b3R5cGUudW5wYXVzZSA9IGZ1bmN0aW9uKCkge1xuICAvLyByZS1zdGFydCBwbGF5IGlmIHBhdXNlZFxuICBpZiAoIHRoaXMuc3RhdGUgPT0gJ3BhdXNlZCcgKSB7XG4gICAgdGhpcy5wbGF5KCk7XG4gIH1cbn07XG5cbi8vIHBhdXNlIGlmIHBhZ2UgdmlzaWJpbGl0eSBpcyBoaWRkZW4sIHVucGF1c2UgaWYgdmlzaWJsZVxuUGxheWVyLnByb3RvdHlwZS52aXNpYmlsaXR5Q2hhbmdlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpc1BhZ2VIaWRkZW4gPSBkb2N1bWVudC5oaWRkZW47XG4gIHRoaXNbIGlzUGFnZUhpZGRlbiA/ICdwYXVzZScgOiAndW5wYXVzZScgXSgpO1xufTtcblxuUGxheWVyLnByb3RvdHlwZS52aXNpYmlsaXR5UGxheSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXkoKTtcbiAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eVBsYXkgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsaWNraXR5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnV0aWxzLmV4dGVuZCggRmxpY2tpdHkuZGVmYXVsdHMsIHtcbiAgcGF1c2VBdXRvUGxheU9uSG92ZXI6IHRydWVcbn0pO1xuXG5GbGlja2l0eS5jcmVhdGVNZXRob2RzLnB1c2goJ19jcmVhdGVQbGF5ZXInKTtcbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllciA9IG5ldyBQbGF5ZXIoIHRoaXMgKTtcblxuICB0aGlzLm9uKCAnYWN0aXZhdGUnLCB0aGlzLmFjdGl2YXRlUGxheWVyICk7XG4gIHRoaXMub24oICd1aUNoYW5nZScsIHRoaXMuc3RvcFBsYXllciApO1xuICB0aGlzLm9uKCAncG9pbnRlckRvd24nLCB0aGlzLnN0b3BQbGF5ZXIgKTtcbiAgdGhpcy5vbiggJ2RlYWN0aXZhdGUnLCB0aGlzLmRlYWN0aXZhdGVQbGF5ZXIgKTtcbn07XG5cbnByb3RvLmFjdGl2YXRlUGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIGlmICggIXRoaXMub3B0aW9ucy5hdXRvUGxheSApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZW50ZXInLCB0aGlzICk7XG59O1xuXG4vLyBQbGF5ZXIgQVBJLCBkb24ndCBoYXRlIHRoZSAuLi4gdGhhbmtzIEkga25vdyB3aGVyZSB0aGUgZG9vciBpc1xuXG5wcm90by5wbGF5UGxheWVyID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnBsYXkoKTtcbn07XG5cbnByb3RvLnN0b3BQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIuc3RvcCgpO1xufTtcblxucHJvdG8ucGF1c2VQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIucGF1c2UoKTtcbn07XG5cbnByb3RvLnVucGF1c2VQbGF5ZXIgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5wbGF5ZXIudW5wYXVzZSgpO1xufTtcblxucHJvdG8uZGVhY3RpdmF0ZVBsYXllciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnBsYXllci5zdG9wKCk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2VlbnRlcicsIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tIG1vdXNlZW50ZXIvbGVhdmUgLS0tLS0gLy9cblxuLy8gcGF1c2UgYXV0by1wbGF5IG9uIGhvdmVyXG5wcm90by5vbm1vdXNlZW50ZXIgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCAhdGhpcy5vcHRpb25zLnBhdXNlQXV0b1BsYXlPbkhvdmVyICkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICB0aGlzLmVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlbGVhdmUnLCB0aGlzICk7XG59O1xuXG4vLyByZXN1bWUgYXV0by1wbGF5IG9uIGhvdmVyIG9mZlxucHJvdG8ub25tb3VzZWxlYXZlID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucGxheWVyLnVucGF1c2UoKTtcbiAgdGhpcy5lbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZWxlYXZlJywgdGhpcyApO1xufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbkZsaWNraXR5LlBsYXllciA9IFBsYXllcjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iLCIvLyBhZGQsIHJlbW92ZSBjZWxsXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8vIHVuaXZlcnNhbCBtb2R1bGUgZGVmaW5pdGlvblxuICAvKiBqc2hpbnQgc3RyaWN0OiBmYWxzZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJy4vZmxpY2tpdHknLFxuICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJ1xuICAgIF0sIGZ1bmN0aW9uKCBGbGlja2l0eSwgdXRpbHMgKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgdXRpbHMgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJy4vZmxpY2tpdHknKSxcbiAgICAgIHJlcXVpcmUoJ2Zpenp5LXVpLXV0aWxzJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5GbGlja2l0eSxcbiAgICAgIHdpbmRvdy5maXp6eVVJVXRpbHNcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBGbGlja2l0eSwgdXRpbHMgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gYXBwZW5kIGNlbGxzIHRvIGEgZG9jdW1lbnQgZnJhZ21lbnRcbmZ1bmN0aW9uIGdldENlbGxzRnJhZ21lbnQoIGNlbGxzICkge1xuICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7XG4gIGNlbGxzLmZvckVhY2goIGZ1bmN0aW9uKCBjZWxsICkge1xuICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKCBjZWxsLmVsZW1lbnQgKTtcbiAgfSk7XG4gIHJldHVybiBmcmFnbWVudDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWRkL3JlbW92ZSBjZWxsIHByb3RvdHlwZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgcHJvdG8gPSBGbGlja2l0eS5wcm90b3R5cGU7XG5cbi8qKlxuICogSW5zZXJ0LCBwcmVwZW5kLCBvciBhcHBlbmQgY2VsbHNcbiAqIEBwYXJhbSB7RWxlbWVudCwgQXJyYXksIE5vZGVMaXN0fSBlbGVtc1xuICogQHBhcmFtIHtJbnRlZ2VyfSBpbmRleFxuICovXG5wcm90by5pbnNlcnQgPSBmdW5jdGlvbiggZWxlbXMsIGluZGV4ICkge1xuICB2YXIgY2VsbHMgPSB0aGlzLl9tYWtlQ2VsbHMoIGVsZW1zICk7XG4gIGlmICggIWNlbGxzIHx8ICFjZWxscy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBsZW4gPSB0aGlzLmNlbGxzLmxlbmd0aDtcbiAgLy8gZGVmYXVsdCB0byBhcHBlbmRcbiAgaW5kZXggPSBpbmRleCA9PT0gdW5kZWZpbmVkID8gbGVuIDogaW5kZXg7XG4gIC8vIGFkZCBjZWxscyB3aXRoIGRvY3VtZW50IGZyYWdtZW50XG4gIHZhciBmcmFnbWVudCA9IGdldENlbGxzRnJhZ21lbnQoIGNlbGxzICk7XG4gIC8vIGFwcGVuZCB0byBzbGlkZXJcbiAgdmFyIGlzQXBwZW5kID0gaW5kZXggPT0gbGVuO1xuICBpZiAoIGlzQXBwZW5kICkge1xuICAgIHRoaXMuc2xpZGVyLmFwcGVuZENoaWxkKCBmcmFnbWVudCApO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnNlcnRDZWxsRWxlbWVudCA9IHRoaXMuY2VsbHNbIGluZGV4IF0uZWxlbWVudDtcbiAgICB0aGlzLnNsaWRlci5pbnNlcnRCZWZvcmUoIGZyYWdtZW50LCBpbnNlcnRDZWxsRWxlbWVudCApO1xuICB9XG4gIC8vIGFkZCB0byB0aGlzLmNlbGxzXG4gIGlmICggaW5kZXggPT09IDAgKSB7XG4gICAgLy8gcHJlcGVuZCwgYWRkIHRvIHN0YXJ0XG4gICAgdGhpcy5jZWxscyA9IGNlbGxzLmNvbmNhdCggdGhpcy5jZWxscyApO1xuICB9IGVsc2UgaWYgKCBpc0FwcGVuZCApIHtcbiAgICAvLyBhcHBlbmQsIGFkZCB0byBlbmRcbiAgICB0aGlzLmNlbGxzID0gdGhpcy5jZWxscy5jb25jYXQoIGNlbGxzICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gaW5zZXJ0IGluIHRoaXMuY2VsbHNcbiAgICB2YXIgZW5kQ2VsbHMgPSB0aGlzLmNlbGxzLnNwbGljZSggaW5kZXgsIGxlbiAtIGluZGV4ICk7XG4gICAgdGhpcy5jZWxscyA9IHRoaXMuY2VsbHMuY29uY2F0KCBjZWxscyApLmNvbmNhdCggZW5kQ2VsbHMgKTtcbiAgfVxuXG4gIHRoaXMuX3NpemVDZWxscyggY2VsbHMgKTtcbiAgdGhpcy5jZWxsQ2hhbmdlKCBpbmRleCwgdHJ1ZSApO1xufTtcblxucHJvdG8uYXBwZW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB0aGlzLmluc2VydCggZWxlbXMsIHRoaXMuY2VsbHMubGVuZ3RoICk7XG59O1xuXG5wcm90by5wcmVwZW5kID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB0aGlzLmluc2VydCggZWxlbXMsIDAgKTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGNlbGxzXG4gKiBAcGFyYW0ge0VsZW1lbnQsIEFycmF5LCBOb2RlTGlzdH0gZWxlbXNcbiAqL1xucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgY2VsbHMgPSB0aGlzLmdldENlbGxzKCBlbGVtcyApO1xuICBpZiAoICFjZWxscyB8fCAhY2VsbHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBtaW5DZWxsSW5kZXggPSB0aGlzLmNlbGxzLmxlbmd0aCAtIDE7XG4gIC8vIHJlbW92ZSBjZWxscyBmcm9tIGNvbGxlY3Rpb24gJiBET01cbiAgY2VsbHMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGwgKSB7XG4gICAgY2VsbC5yZW1vdmUoKTtcbiAgICB2YXIgaW5kZXggPSB0aGlzLmNlbGxzLmluZGV4T2YoIGNlbGwgKTtcbiAgICBtaW5DZWxsSW5kZXggPSBNYXRoLm1pbiggaW5kZXgsIG1pbkNlbGxJbmRleCApO1xuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuY2VsbHMsIGNlbGwgKTtcbiAgfSwgdGhpcyApO1xuXG4gIHRoaXMuY2VsbENoYW5nZSggbWluQ2VsbEluZGV4LCB0cnVlICk7XG59O1xuXG4vKipcbiAqIGxvZ2ljIHRvIGJlIHJ1biBhZnRlciBhIGNlbGwncyBzaXplIGNoYW5nZXNcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbSAtIGNlbGwncyBlbGVtZW50XG4gKi9cbnByb3RvLmNlbGxTaXplQ2hhbmdlID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIHZhciBjZWxsID0gdGhpcy5nZXRDZWxsKCBlbGVtICk7XG4gIGlmICggIWNlbGwgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNlbGwuZ2V0U2l6ZSgpO1xuXG4gIHZhciBpbmRleCA9IHRoaXMuY2VsbHMuaW5kZXhPZiggY2VsbCApO1xuICB0aGlzLmNlbGxDaGFuZ2UoIGluZGV4ICk7XG59O1xuXG4vKipcbiAqIGxvZ2ljIGFueSB0aW1lIGEgY2VsbCBpcyBjaGFuZ2VkOiBhZGRlZCwgcmVtb3ZlZCwgb3Igc2l6ZSBjaGFuZ2VkXG4gKiBAcGFyYW0ge0ludGVnZXJ9IGNoYW5nZWRDZWxsSW5kZXggLSBpbmRleCBvZiB0aGUgY2hhbmdlZCBjZWxsLCBvcHRpb25hbFxuICovXG5wcm90by5jZWxsQ2hhbmdlID0gZnVuY3Rpb24oIGNoYW5nZWRDZWxsSW5kZXgsIGlzUG9zaXRpb25pbmdTbGlkZXIgKSB7XG4gIHZhciBwcmV2U2VsZWN0ZWRFbGVtID0gdGhpcy5zZWxlY3RlZEVsZW1lbnQ7XG4gIHRoaXMuX3Bvc2l0aW9uQ2VsbHMoIGNoYW5nZWRDZWxsSW5kZXggKTtcbiAgdGhpcy5fZ2V0V3JhcFNoaWZ0Q2VsbHMoKTtcbiAgdGhpcy5zZXRHYWxsZXJ5U2l6ZSgpO1xuICAvLyB1cGRhdGUgc2VsZWN0ZWRJbmRleFxuICAvLyB0cnkgdG8gbWFpbnRhaW4gcG9zaXRpb24gJiBzZWxlY3QgcHJldmlvdXMgc2VsZWN0ZWQgZWxlbWVudFxuICB2YXIgY2VsbCA9IHRoaXMuZ2V0Q2VsbCggcHJldlNlbGVjdGVkRWxlbSApO1xuICBpZiAoIGNlbGwgKSB7XG4gICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy5nZXRDZWxsU2xpZGVJbmRleCggY2VsbCApO1xuICB9XG4gIHRoaXMuc2VsZWN0ZWRJbmRleCA9IE1hdGgubWluKCB0aGlzLnNsaWRlcy5sZW5ndGggLSAxLCB0aGlzLnNlbGVjdGVkSW5kZXggKTtcblxuICB0aGlzLmVtaXRFdmVudCggJ2NlbGxDaGFuZ2UnLCBbIGNoYW5nZWRDZWxsSW5kZXggXSApO1xuICAvLyBwb3NpdGlvbiBzbGlkZXJcbiAgdGhpcy5zZWxlY3QoIHRoaXMuc2VsZWN0ZWRJbmRleCApO1xuICAvLyBkbyBub3QgcG9zaXRpb24gc2xpZGVyIGFmdGVyIGxhenkgbG9hZFxuICBpZiAoIGlzUG9zaXRpb25pbmdTbGlkZXIgKSB7XG4gICAgdGhpcy5wb3NpdGlvblNsaWRlckF0U2VsZWN0ZWQoKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gIC0tLS0tIC8vXG5cbnJldHVybiBGbGlja2l0eTtcblxufSkpO1xuIiwiLy8gbGF6eWxvYWRcbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnLi9mbGlja2l0eScsXG4gICAgICAnZml6enktdWktdXRpbHMvdXRpbHMnXG4gICAgXSwgZnVuY3Rpb24oIEZsaWNraXR5LCB1dGlscyApIHtcbiAgICAgIHJldHVybiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCB1dGlscyApO1xuICAgIH0pO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgcmVxdWlyZSgnLi9mbGlja2l0eScpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICBmYWN0b3J5KFxuICAgICAgd2luZG93LFxuICAgICAgd2luZG93LkZsaWNraXR5LFxuICAgICAgd2luZG93LmZpenp5VUlVdGlsc1xuICAgICk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCB3aW5kb3csIEZsaWNraXR5LCB1dGlscyApIHtcbid1c2Ugc3RyaWN0JztcblxuRmxpY2tpdHkuY3JlYXRlTWV0aG9kcy5wdXNoKCdfY3JlYXRlTGF6eWxvYWQnKTtcbnZhciBwcm90byA9IEZsaWNraXR5LnByb3RvdHlwZTtcblxucHJvdG8uX2NyZWF0ZUxhenlsb2FkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMub24oICdzZWxlY3QnLCB0aGlzLmxhenlMb2FkICk7XG59O1xuXG5wcm90by5sYXp5TG9hZCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbGF6eUxvYWQgPSB0aGlzLm9wdGlvbnMubGF6eUxvYWQ7XG4gIGlmICggIWxhenlMb2FkICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBnZXQgYWRqYWNlbnQgY2VsbHMsIHVzZSBsYXp5TG9hZCBvcHRpb24gZm9yIGFkamFjZW50IGNvdW50XG4gIHZhciBhZGpDb3VudCA9IHR5cGVvZiBsYXp5TG9hZCA9PSAnbnVtYmVyJyA/IGxhenlMb2FkIDogMDtcbiAgdmFyIGNlbGxFbGVtcyA9IHRoaXMuZ2V0QWRqYWNlbnRDZWxsRWxlbWVudHMoIGFkakNvdW50ICk7XG4gIC8vIGdldCBsYXp5IGltYWdlcyBpbiB0aG9zZSBjZWxsc1xuICB2YXIgbGF6eUltYWdlcyA9IFtdO1xuICBjZWxsRWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGNlbGxFbGVtICkge1xuICAgIHZhciBsYXp5Q2VsbEltYWdlcyA9IGdldENlbGxMYXp5SW1hZ2VzKCBjZWxsRWxlbSApO1xuICAgIGxhenlJbWFnZXMgPSBsYXp5SW1hZ2VzLmNvbmNhdCggbGF6eUNlbGxJbWFnZXMgKTtcbiAgfSk7XG4gIC8vIGxvYWQgbGF6eSBpbWFnZXNcbiAgbGF6eUltYWdlcy5mb3JFYWNoKCBmdW5jdGlvbiggaW1nICkge1xuICAgIG5ldyBMYXp5TG9hZGVyKCBpbWcsIHRoaXMgKTtcbiAgfSwgdGhpcyApO1xufTtcblxuZnVuY3Rpb24gZ2V0Q2VsbExhenlJbWFnZXMoIGNlbGxFbGVtICkge1xuICAvLyBjaGVjayBpZiBjZWxsIGVsZW1lbnQgaXMgbGF6eSBpbWFnZVxuICBpZiAoIGNlbGxFbGVtLm5vZGVOYW1lID09ICdJTUcnICkge1xuICAgIHZhciBsYXp5bG9hZEF0dHIgPSBjZWxsRWxlbS5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgICB2YXIgc3JjQXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmMnKTtcbiAgICB2YXIgc3Jjc2V0QXR0ciA9IGNlbGxFbGVtLmdldEF0dHJpYnV0ZSgnZGF0YS1mbGlja2l0eS1sYXp5bG9hZC1zcmNzZXQnKTtcbiAgICBpZiAoIGxhenlsb2FkQXR0ciB8fCBzcmNBdHRyIHx8IHNyY3NldEF0dHIgKSB7XG4gICAgICByZXR1cm4gWyBjZWxsRWxlbSBdO1xuICAgIH1cbiAgfVxuICAvLyBzZWxlY3QgbGF6eSBpbWFnZXMgaW4gY2VsbFxuICB2YXIgbGF6eVNlbGVjdG9yID0gJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkXSwgJyArXG4gICAgJ2ltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY10sIGltZ1tkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyY3NldF0nO1xuICB2YXIgaW1ncyA9IGNlbGxFbGVtLnF1ZXJ5U2VsZWN0b3JBbGwoIGxhenlTZWxlY3RvciApO1xuICByZXR1cm4gdXRpbHMubWFrZUFycmF5KCBpbWdzICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIExhenlMb2FkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBjbGFzcyB0byBoYW5kbGUgbG9hZGluZyBpbWFnZXNcbiAqL1xuZnVuY3Rpb24gTGF6eUxvYWRlciggaW1nLCBmbGlja2l0eSApIHtcbiAgdGhpcy5pbWcgPSBpbWc7XG4gIHRoaXMuZmxpY2tpdHkgPSBmbGlja2l0eTtcbiAgdGhpcy5sb2FkKCk7XG59XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgLy8gZ2V0IHNyYyAmIHNyY3NldFxuICB2YXIgc3JjID0gdGhpcy5pbWcuZ2V0QXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkJykgfHxcbiAgICB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3JjJyk7XG4gIHZhciBzcmNzZXQgPSB0aGlzLmltZy5nZXRBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG4gIC8vIHNldCBzcmMgJiBzZXJzZXRcbiAgdGhpcy5pbWcuc3JjID0gc3JjO1xuICBpZiAoIHNyY3NldCApIHtcbiAgICB0aGlzLmltZy5zZXRBdHRyaWJ1dGUoICdzcmNzZXQnLCBzcmNzZXQgKTtcbiAgfVxuICAvLyByZW1vdmUgYXR0clxuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQnKTtcbiAgdGhpcy5pbWcucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWZsaWNraXR5LWxhenlsb2FkLXNyYycpO1xuICB0aGlzLmltZy5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZmxpY2tpdHktbGF6eWxvYWQtc3Jjc2V0Jyk7XG59O1xuXG5MYXp5TG9hZGVyLnByb3RvdHlwZS5vbmxvYWQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWxvYWRlZCcgKTtcbn07XG5cbkxhenlMb2FkZXIucHJvdG90eXBlLm9uZXJyb3IgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMuY29tcGxldGUoIGV2ZW50LCAnZmxpY2tpdHktbGF6eWVycm9yJyApO1xufTtcblxuTGF6eUxvYWRlci5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbiggZXZlbnQsIGNsYXNzTmFtZSApIHtcbiAgLy8gdW5iaW5kIGV2ZW50c1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuXG4gIHZhciBjZWxsID0gdGhpcy5mbGlja2l0eS5nZXRQYXJlbnRDZWxsKCB0aGlzLmltZyApO1xuICB2YXIgY2VsbEVsZW0gPSBjZWxsICYmIGNlbGwuZWxlbWVudDtcbiAgdGhpcy5mbGlja2l0eS5jZWxsU2l6ZUNoYW5nZSggY2VsbEVsZW0gKTtcblxuICB0aGlzLmltZy5jbGFzc0xpc3QuYWRkKCBjbGFzc05hbWUgKTtcbiAgdGhpcy5mbGlja2l0eS5kaXNwYXRjaEV2ZW50KCAnbGF6eUxvYWQnLCBldmVudCwgY2VsbEVsZW0gKTtcbn07XG5cbi8vIC0tLS0tICAtLS0tLSAvL1xuXG5GbGlja2l0eS5MYXp5TG9hZGVyID0gTGF6eUxvYWRlcjtcblxucmV0dXJuIEZsaWNraXR5O1xuXG59KSk7XG4iLCIvKiFcbiAqIEZsaWNraXR5IHYyLjEuMVxuICogVG91Y2gsIHJlc3BvbnNpdmUsIGZsaWNrYWJsZSBjYXJvdXNlbHNcbiAqXG4gKiBMaWNlbnNlZCBHUEx2MyBmb3Igb3BlbiBzb3VyY2UgdXNlXG4gKiBvciBGbGlja2l0eSBDb21tZXJjaWFsIExpY2Vuc2UgZm9yIGNvbW1lcmNpYWwgdXNlXG4gKlxuICogaHR0cHM6Ly9mbGlja2l0eS5tZXRhZml6enkuY29cbiAqIENvcHlyaWdodCAyMDE1LTIwMTggTWV0YWZpenp5XG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIFtcbiAgICAgICcuL2ZsaWNraXR5JyxcbiAgICAgICcuL2RyYWcnLFxuICAgICAgJy4vcHJldi1uZXh0LWJ1dHRvbicsXG4gICAgICAnLi9wYWdlLWRvdHMnLFxuICAgICAgJy4vcGxheWVyJyxcbiAgICAgICcuL2FkZC1yZW1vdmUtY2VsbCcsXG4gICAgICAnLi9sYXp5bG9hZCdcbiAgICBdLCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICByZXF1aXJlKCcuL2ZsaWNraXR5JyksXG4gICAgICByZXF1aXJlKCcuL2RyYWcnKSxcbiAgICAgIHJlcXVpcmUoJy4vcHJldi1uZXh0LWJ1dHRvbicpLFxuICAgICAgcmVxdWlyZSgnLi9wYWdlLWRvdHMnKSxcbiAgICAgIHJlcXVpcmUoJy4vcGxheWVyJyksXG4gICAgICByZXF1aXJlKCcuL2FkZC1yZW1vdmUtY2VsbCcpLFxuICAgICAgcmVxdWlyZSgnLi9sYXp5bG9hZCcpXG4gICAgKTtcbiAgfVxuXG59KSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCBGbGlja2l0eSApIHtcbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSovXG4gIHJldHVybiBGbGlja2l0eTtcbn0pO1xuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5cbi8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gZml4IGFuIGlPUzEwIGJ1ZyBmb3IgRmxpY2tpdHkuXG4vLyBJdCBpcyBvdXIgb3duIGltcGxlbWVudGF0aW9uIG9mIHRoZSBGbGlja2l0eSAyLjAgZml4IGZvdW5kIGhlcmU6IGh0dHA6Ly9iaXQubHkvMmtVNG1LV1xuJCh3aW5kb3cpLm9uKCdkcmFnU3RhcnQnLCAoZXZlbnQpID0+IHtcbiAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQudGFyZ2V0KTtcbiAgY29uc3QgJGZsaWNraXR5RW5hYmxlZEVsID0gJHRhcmdldC5jbG9zZXN0KCcuZmxpY2tpdHktZW5hYmxlZCcpO1xuXG4gIGlmICgkZmxpY2tpdHlFbmFibGVkRWwubGVuZ3RoKSB7XG4gICAgY29uc3QgZmxpY2tpdHkgPSBGbGlja2l0eS5kYXRhKCRmbGlja2l0eUVuYWJsZWRFbFswXSk7XG5cbiAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZmxpY2tpdHkpO1xuICB9XG59KTtcbiIsIi8qKlxuICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgVzNDIFNPRlRXQVJFIEFORCBET0NVTUVOVCBOT1RJQ0UgQU5EIExJQ0VOU0UuXG4gKlxuICogIGh0dHBzOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLzIwMTUvY29weXJpZ2h0LXNvZnR3YXJlLWFuZC1kb2N1bWVudFxuICpcbiAqL1xuXG4oZnVuY3Rpb24od2luZG93LCBkb2N1bWVudCkge1xuJ3VzZSBzdHJpY3QnO1xuXG5cbi8vIEV4aXRzIGVhcmx5IGlmIGFsbCBJbnRlcnNlY3Rpb25PYnNlcnZlciBhbmQgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeVxuLy8gZmVhdHVyZXMgYXJlIG5hdGl2ZWx5IHN1cHBvcnRlZC5cbmlmICgnSW50ZXJzZWN0aW9uT2JzZXJ2ZXInIGluIHdpbmRvdyAmJlxuICAgICdJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5JyBpbiB3aW5kb3cgJiZcbiAgICAnaW50ZXJzZWN0aW9uUmF0aW8nIGluIHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSkge1xuXG4gIC8vIE1pbmltYWwgcG9seWZpbGwgZm9yIEVkZ2UgMTUncyBsYWNrIG9mIGBpc0ludGVyc2VjdGluZ2BcbiAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdzNjL0ludGVyc2VjdGlvbk9ic2VydmVyL2lzc3Vlcy8yMTFcbiAgaWYgKCEoJ2lzSW50ZXJzZWN0aW5nJyBpbiB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeS5wcm90b3R5cGUpKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5LnByb3RvdHlwZSxcbiAgICAgICdpc0ludGVyc2VjdGluZycsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnNlY3Rpb25SYXRpbyA+IDA7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5cbi8qKlxuICogQW4gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkuIFRoaXMgcmVnaXN0cnkgZXhpc3RzIHRvIGhvbGQgYSBzdHJvbmdcbiAqIHJlZmVyZW5jZSB0byBJbnRlcnNlY3Rpb25PYnNlcnZlciBpbnN0YW5jZXMgY3VycmVudGx5IG9ic2VydmVyaW5nIGEgdGFyZ2V0XG4gKiBlbGVtZW50LiBXaXRob3V0IHRoaXMgcmVnaXN0cnksIGluc3RhbmNlcyB3aXRob3V0IGFub3RoZXIgcmVmZXJlbmNlIG1heSBiZVxuICogZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKi9cbnZhciByZWdpc3RyeSA9IFtdO1xuXG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZ2xvYmFsIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgY29uc3RydWN0b3IuXG4gKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2ludGVyc2VjdGlvbi1vYnNlcnZlci1lbnRyeVxuICogQHBhcmFtIHtPYmplY3R9IGVudHJ5IEEgZGljdGlvbmFyeSBvZiBpbnN0YW5jZSBwcm9wZXJ0aWVzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkoZW50cnkpIHtcbiAgdGhpcy50aW1lID0gZW50cnkudGltZTtcbiAgdGhpcy50YXJnZXQgPSBlbnRyeS50YXJnZXQ7XG4gIHRoaXMucm9vdEJvdW5kcyA9IGVudHJ5LnJvb3RCb3VuZHM7XG4gIHRoaXMuYm91bmRpbmdDbGllbnRSZWN0ID0gZW50cnkuYm91bmRpbmdDbGllbnRSZWN0O1xuICB0aGlzLmludGVyc2VjdGlvblJlY3QgPSBlbnRyeS5pbnRlcnNlY3Rpb25SZWN0IHx8IGdldEVtcHR5UmVjdCgpO1xuICB0aGlzLmlzSW50ZXJzZWN0aW5nID0gISFlbnRyeS5pbnRlcnNlY3Rpb25SZWN0O1xuXG4gIC8vIENhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiByYXRpby5cbiAgdmFyIHRhcmdldFJlY3QgPSB0aGlzLmJvdW5kaW5nQ2xpZW50UmVjdDtcbiAgdmFyIHRhcmdldEFyZWEgPSB0YXJnZXRSZWN0LndpZHRoICogdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gIHZhciBpbnRlcnNlY3Rpb25SZWN0ID0gdGhpcy5pbnRlcnNlY3Rpb25SZWN0O1xuICB2YXIgaW50ZXJzZWN0aW9uQXJlYSA9IGludGVyc2VjdGlvblJlY3Qud2lkdGggKiBpbnRlcnNlY3Rpb25SZWN0LmhlaWdodDtcblxuICAvLyBTZXRzIGludGVyc2VjdGlvbiByYXRpby5cbiAgaWYgKHRhcmdldEFyZWEpIHtcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gaW50ZXJzZWN0aW9uQXJlYSAvIHRhcmdldEFyZWE7XG4gIH0gZWxzZSB7XG4gICAgLy8gSWYgYXJlYSBpcyB6ZXJvIGFuZCBpcyBpbnRlcnNlY3RpbmcsIHNldHMgdG8gMSwgb3RoZXJ3aXNlIHRvIDBcbiAgICB0aGlzLmludGVyc2VjdGlvblJhdGlvID0gdGhpcy5pc0ludGVyc2VjdGluZyA/IDEgOiAwO1xuICB9XG59XG5cblxuLyoqXG4gKiBDcmVhdGVzIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgY29uc3RydWN0b3IuXG4gKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2ludGVyc2VjdGlvbi1vYnNlcnZlci1pbnRlcmZhY2VcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrIFRoZSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIGludGVyc2VjdGlvblxuICogICAgIGNoYW5nZXMgaGF2ZSBxdWV1ZWQuIFRoZSBmdW5jdGlvbiBpcyBub3QgaW52b2tlZCBpZiB0aGUgcXVldWUgaGFzXG4gKiAgICAgYmVlbiBlbXB0aWVkIGJ5IGNhbGxpbmcgdGhlIGB0YWtlUmVjb3Jkc2AgbWV0aG9kLlxuICogQHBhcmFtIHtPYmplY3Q9fSBvcHRfb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoY2FsbGJhY2ssIG9wdF9vcHRpb25zKSB7XG5cbiAgdmFyIG9wdGlvbnMgPSBvcHRfb3B0aW9ucyB8fCB7fTtcblxuICBpZiAodHlwZW9mIGNhbGxiYWNrICE9ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG5cbiAgaWYgKG9wdGlvbnMucm9vdCAmJiBvcHRpb25zLnJvb3Qubm9kZVR5cGUgIT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncm9vdCBtdXN0IGJlIGFuIEVsZW1lbnQnKTtcbiAgfVxuXG4gIC8vIEJpbmRzIGFuZCB0aHJvdHRsZXMgYHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9uc2AuXG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyA9IHRocm90dGxlKFxuICAgICAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLmJpbmQodGhpcyksIHRoaXMuVEhST1RUTEVfVElNRU9VVCk7XG5cbiAgLy8gUHJpdmF0ZSBwcm9wZXJ0aWVzLlxuICB0aGlzLl9jYWxsYmFjayA9IGNhbGxiYWNrO1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICB0aGlzLl9yb290TWFyZ2luVmFsdWVzID0gdGhpcy5fcGFyc2VSb290TWFyZ2luKG9wdGlvbnMucm9vdE1hcmdpbik7XG5cbiAgLy8gUHVibGljIHByb3BlcnRpZXMuXG4gIHRoaXMudGhyZXNob2xkcyA9IHRoaXMuX2luaXRUaHJlc2hvbGRzKG9wdGlvbnMudGhyZXNob2xkKTtcbiAgdGhpcy5yb290ID0gb3B0aW9ucy5yb290IHx8IG51bGw7XG4gIHRoaXMucm9vdE1hcmdpbiA9IHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMubWFwKGZ1bmN0aW9uKG1hcmdpbikge1xuICAgIHJldHVybiBtYXJnaW4udmFsdWUgKyBtYXJnaW4udW5pdDtcbiAgfSkuam9pbignICcpO1xufVxuXG5cbi8qKlxuICogVGhlIG1pbmltdW0gaW50ZXJ2YWwgd2l0aGluIHdoaWNoIHRoZSBkb2N1bWVudCB3aWxsIGJlIGNoZWNrZWQgZm9yXG4gKiBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlRIUk9UVExFX1RJTUVPVVQgPSAxMDA7XG5cblxuLyoqXG4gKiBUaGUgZnJlcXVlbmN5IGluIHdoaWNoIHRoZSBwb2x5ZmlsbCBwb2xscyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiB0aGlzIGNhbiBiZSB1cGRhdGVkIG9uIGEgcGVyIGluc3RhbmNlIGJhc2lzIGFuZCBtdXN0IGJlIHNldCBwcmlvciB0b1xuICogY2FsbGluZyBgb2JzZXJ2ZWAgb24gdGhlIGZpcnN0IHRhcmdldC5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlBPTExfSU5URVJWQUwgPSBudWxsO1xuXG4vKipcbiAqIFVzZSBhIG11dGF0aW9uIG9ic2VydmVyIG9uIHRoZSByb290IGVsZW1lbnRcbiAqIHRvIGRldGVjdCBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLlVTRV9NVVRBVElPTl9PQlNFUlZFUiA9IHRydWU7XG5cblxuLyoqXG4gKiBTdGFydHMgb2JzZXJ2aW5nIGEgdGFyZ2V0IGVsZW1lbnQgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzIGJhc2VkIG9uXG4gKiB0aGUgdGhyZXNob2xkcyB2YWx1ZXMuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgRE9NIGVsZW1lbnQgdG8gb2JzZXJ2ZS5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLm9ic2VydmUgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgdmFyIGlzVGFyZ2V0QWxyZWFkeU9ic2VydmVkID0gdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnNvbWUoZnVuY3Rpb24oaXRlbSkge1xuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgPT0gdGFyZ2V0O1xuICB9KTtcblxuICBpZiAoaXNUYXJnZXRBbHJlYWR5T2JzZXJ2ZWQpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoISh0YXJnZXQgJiYgdGFyZ2V0Lm5vZGVUeXBlID09IDEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0YXJnZXQgbXVzdCBiZSBhbiBFbGVtZW50Jyk7XG4gIH1cblxuICB0aGlzLl9yZWdpc3Rlckluc3RhbmNlKCk7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cy5wdXNoKHtlbGVtZW50OiB0YXJnZXQsIGVudHJ5OiBudWxsfSk7XG4gIHRoaXMuX21vbml0b3JJbnRlcnNlY3Rpb25zKCk7XG4gIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucygpO1xufTtcblxuXG4vKipcbiAqIFN0b3BzIG9ic2VydmluZyBhIHRhcmdldCBlbGVtZW50IGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUudW5vYnNlcnZlID0gZnVuY3Rpb24odGFyZ2V0KSB7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9XG4gICAgICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHtcblxuICAgIHJldHVybiBpdGVtLmVsZW1lbnQgIT0gdGFyZ2V0O1xuICB9KTtcbiAgaWYgKCF0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMubGVuZ3RoKSB7XG4gICAgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpO1xuICAgIHRoaXMuX3VucmVnaXN0ZXJJbnN0YW5jZSgpO1xuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgb2JzZXJ2aW5nIGFsbCB0YXJnZXQgZWxlbWVudHMgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuZGlzY29ubmVjdCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPSBbXTtcbiAgdGhpcy5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucygpO1xuICB0aGlzLl91bnJlZ2lzdGVySW5zdGFuY2UoKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFueSBxdWV1ZSBlbnRyaWVzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gcmVwb3J0ZWQgdG8gdGhlXG4gKiBjYWxsYmFjayBhbmQgY2xlYXJzIHRoZSBxdWV1ZS4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZVxuICogY2FsbGJhY2sgdG8gb2J0YWluIHRoZSBhYnNvbHV0ZSBtb3N0IHVwLXRvLWRhdGUgaW50ZXJzZWN0aW9uIGluZm9ybWF0aW9uLlxuICogQHJldHVybiB7QXJyYXl9IFRoZSBjdXJyZW50bHkgcXVldWVkIGVudHJpZXMuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS50YWtlUmVjb3JkcyA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcmVjb3JkcyA9IHRoaXMuX3F1ZXVlZEVudHJpZXMuc2xpY2UoKTtcbiAgdGhpcy5fcXVldWVkRW50cmllcyA9IFtdO1xuICByZXR1cm4gcmVjb3Jkcztcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSB0aHJlc2hvbGQgdmFsdWUgZnJvbSB0aGUgdXNlciBjb25maWd1cmF0aW9uIG9iamVjdCBhbmRcbiAqIHJldHVybnMgYSBzb3J0ZWQgYXJyYXkgb2YgdW5pcXVlIHRocmVzaG9sZCB2YWx1ZXMuIElmIGEgdmFsdWUgaXMgbm90XG4gKiBiZXR3ZWVuIDAgYW5kIDEgYW5kIGVycm9yIGlzIHRocm93bi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge0FycmF5fG51bWJlcj19IG9wdF90aHJlc2hvbGQgQW4gb3B0aW9uYWwgdGhyZXNob2xkIHZhbHVlIG9yXG4gKiAgICAgYSBsaXN0IG9mIHRocmVzaG9sZCB2YWx1ZXMsIGRlZmF1bHRpbmcgdG8gWzBdLlxuICogQHJldHVybiB7QXJyYXl9IEEgc29ydGVkIGxpc3Qgb2YgdW5pcXVlIGFuZCB2YWxpZCB0aHJlc2hvbGQgdmFsdWVzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2luaXRUaHJlc2hvbGRzID0gZnVuY3Rpb24ob3B0X3RocmVzaG9sZCkge1xuICB2YXIgdGhyZXNob2xkID0gb3B0X3RocmVzaG9sZCB8fCBbMF07XG4gIGlmICghQXJyYXkuaXNBcnJheSh0aHJlc2hvbGQpKSB0aHJlc2hvbGQgPSBbdGhyZXNob2xkXTtcblxuICByZXR1cm4gdGhyZXNob2xkLnNvcnQoKS5maWx0ZXIoZnVuY3Rpb24odCwgaSwgYSkge1xuICAgIGlmICh0eXBlb2YgdCAhPSAnbnVtYmVyJyB8fCBpc05hTih0KSB8fCB0IDwgMCB8fCB0ID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aHJlc2hvbGQgbXVzdCBiZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEgaW5jbHVzaXZlbHknKTtcbiAgICB9XG4gICAgcmV0dXJuIHQgIT09IGFbaSAtIDFdO1xuICB9KTtcbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIHRoZSByb290TWFyZ2luIHZhbHVlIGZyb20gdGhlIHVzZXIgY29uZmlndXJhdGlvbiBvYmplY3RcbiAqIGFuZCByZXR1cm5zIGFuIGFycmF5IG9mIHRoZSBmb3VyIG1hcmdpbiB2YWx1ZXMgYXMgYW4gb2JqZWN0IGNvbnRhaW5pbmdcbiAqIHRoZSB2YWx1ZSBhbmQgdW5pdCBwcm9wZXJ0aWVzLiBJZiBhbnkgb2YgdGhlIHZhbHVlcyBhcmUgbm90IHByb3Blcmx5XG4gKiBmb3JtYXR0ZWQgb3IgdXNlIGEgdW5pdCBvdGhlciB0aGFuIHB4IG9yICUsIGFuZCBlcnJvciBpcyB0aHJvd24uXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHRfcm9vdE1hcmdpbiBBbiBvcHRpb25hbCByb290TWFyZ2luIHZhbHVlLFxuICogICAgIGRlZmF1bHRpbmcgdG8gJzBweCcuXG4gKiBAcmV0dXJuIHtBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBtYXJnaW4gb2JqZWN0cyB3aXRoIHRoZSBrZXlzXG4gKiAgICAgdmFsdWUgYW5kIHVuaXQuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fcGFyc2VSb290TWFyZ2luID0gZnVuY3Rpb24ob3B0X3Jvb3RNYXJnaW4pIHtcbiAgdmFyIG1hcmdpblN0cmluZyA9IG9wdF9yb290TWFyZ2luIHx8ICcwcHgnO1xuICB2YXIgbWFyZ2lucyA9IG1hcmdpblN0cmluZy5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbihtYXJnaW4pIHtcbiAgICB2YXIgcGFydHMgPSAvXigtP1xcZCpcXC4/XFxkKykocHh8JSkkLy5leGVjKG1hcmdpbik7XG4gICAgaWYgKCFwYXJ0cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdyb290TWFyZ2luIG11c3QgYmUgc3BlY2lmaWVkIGluIHBpeGVscyBvciBwZXJjZW50Jyk7XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IHBhcnNlRmxvYXQocGFydHNbMV0pLCB1bml0OiBwYXJ0c1syXX07XG4gIH0pO1xuXG4gIC8vIEhhbmRsZXMgc2hvcnRoYW5kLlxuICBtYXJnaW5zWzFdID0gbWFyZ2luc1sxXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzJdID0gbWFyZ2luc1syXSB8fCBtYXJnaW5zWzBdO1xuICBtYXJnaW5zWzNdID0gbWFyZ2luc1szXSB8fCBtYXJnaW5zWzFdO1xuXG4gIHJldHVybiBtYXJnaW5zO1xufTtcblxuXG4vKipcbiAqIFN0YXJ0cyBwb2xsaW5nIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcyBpZiB0aGUgcG9sbGluZyBpcyBub3QgYWxyZWFkeVxuICogaGFwcGVuaW5nLCBhbmQgaWYgdGhlIHBhZ2UncyB2aXNpYmlsdHkgc3RhdGUgaXMgdmlzaWJsZS5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fbW9uaXRvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgaWYgKCF0aGlzLl9tb25pdG9yaW5nSW50ZXJzZWN0aW9ucykge1xuICAgIHRoaXMuX21vbml0b3JpbmdJbnRlcnNlY3Rpb25zID0gdHJ1ZTtcblxuICAgIC8vIElmIGEgcG9sbCBpbnRlcnZhbCBpcyBzZXQsIHVzZSBwb2xsaW5nIGluc3RlYWQgb2YgbGlzdGVuaW5nIHRvXG4gICAgLy8gcmVzaXplIGFuZCBzY3JvbGwgZXZlbnRzIG9yIERPTSBtdXRhdGlvbnMuXG4gICAgaWYgKHRoaXMuUE9MTF9JTlRFUlZBTCkge1xuICAgICAgdGhpcy5fbW9uaXRvcmluZ0ludGVydmFsID0gc2V0SW50ZXJ2YWwoXG4gICAgICAgICAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLCB0aGlzLlBPTExfSU5URVJWQUwpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIGFkZEV2ZW50KHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgdHJ1ZSk7XG4gICAgICBhZGRFdmVudChkb2N1bWVudCwgJ3Njcm9sbCcsIHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucywgdHJ1ZSk7XG5cbiAgICAgIGlmICh0aGlzLlVTRV9NVVRBVElPTl9PQlNFUlZFUiAmJiAnTXV0YXRpb25PYnNlcnZlcicgaW4gd2luZG93KSB7XG4gICAgICAgIHRoaXMuX2RvbU9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zKTtcbiAgICAgICAgdGhpcy5fZG9tT2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudCwge1xuICAgICAgICAgIGF0dHJpYnV0ZXM6IHRydWUsXG4gICAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsXG4gICAgICAgICAgc3VidHJlZTogdHJ1ZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTdG9wcyBwb2xsaW5nIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fdW5tb25pdG9ySW50ZXJzZWN0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICBpZiAodGhpcy5fbW9uaXRvcmluZ0ludGVyc2VjdGlvbnMpIHtcbiAgICB0aGlzLl9tb25pdG9yaW5nSW50ZXJzZWN0aW9ucyA9IGZhbHNlO1xuXG4gICAgY2xlYXJJbnRlcnZhbCh0aGlzLl9tb25pdG9yaW5nSW50ZXJ2YWwpO1xuICAgIHRoaXMuX21vbml0b3JpbmdJbnRlcnZhbCA9IG51bGw7XG5cbiAgICByZW1vdmVFdmVudCh3aW5kb3csICdyZXNpemUnLCB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMsIHRydWUpO1xuICAgIHJlbW92ZUV2ZW50KGRvY3VtZW50LCAnc2Nyb2xsJywgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zLCB0cnVlKTtcblxuICAgIGlmICh0aGlzLl9kb21PYnNlcnZlcikge1xuICAgICAgdGhpcy5fZG9tT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgICAgdGhpcy5fZG9tT2JzZXJ2ZXIgPSBudWxsO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIFNjYW5zIGVhY2ggb2JzZXJ2YXRpb24gdGFyZ2V0IGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcyBhbmQgYWRkcyB0aGVtXG4gKiB0byB0aGUgaW50ZXJuYWwgZW50cmllcyBxdWV1ZS4gSWYgbmV3IGVudHJpZXMgYXJlIGZvdW5kLCBpdFxuICogc2NoZWR1bGVzIHRoZSBjYWxsYmFjayB0byBiZSBpbnZva2VkLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9jaGVja0ZvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3RJc0luRG9tID0gdGhpcy5fcm9vdElzSW5Eb20oKTtcbiAgdmFyIHJvb3RSZWN0ID0gcm9vdElzSW5Eb20gPyB0aGlzLl9nZXRSb290UmVjdCgpIDogZ2V0RW1wdHlSZWN0KCk7XG5cbiAgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciB0YXJnZXQgPSBpdGVtLmVsZW1lbnQ7XG4gICAgdmFyIHRhcmdldFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGFyZ2V0KTtcbiAgICB2YXIgcm9vdENvbnRhaW5zVGFyZ2V0ID0gdGhpcy5fcm9vdENvbnRhaW5zVGFyZ2V0KHRhcmdldCk7XG4gICAgdmFyIG9sZEVudHJ5ID0gaXRlbS5lbnRyeTtcbiAgICB2YXIgaW50ZXJzZWN0aW9uUmVjdCA9IHJvb3RJc0luRG9tICYmIHJvb3RDb250YWluc1RhcmdldCAmJlxuICAgICAgICB0aGlzLl9jb21wdXRlVGFyZ2V0QW5kUm9vdEludGVyc2VjdGlvbih0YXJnZXQsIHJvb3RSZWN0KTtcblxuICAgIHZhciBuZXdFbnRyeSA9IGl0ZW0uZW50cnkgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSh7XG4gICAgICB0aW1lOiBub3coKSxcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgYm91bmRpbmdDbGllbnRSZWN0OiB0YXJnZXRSZWN0LFxuICAgICAgcm9vdEJvdW5kczogcm9vdFJlY3QsXG4gICAgICBpbnRlcnNlY3Rpb25SZWN0OiBpbnRlcnNlY3Rpb25SZWN0XG4gICAgfSk7XG5cbiAgICBpZiAoIW9sZEVudHJ5KSB7XG4gICAgICB0aGlzLl9xdWV1ZWRFbnRyaWVzLnB1c2gobmV3RW50cnkpO1xuICAgIH0gZWxzZSBpZiAocm9vdElzSW5Eb20gJiYgcm9vdENvbnRhaW5zVGFyZ2V0KSB7XG4gICAgICAvLyBJZiB0aGUgbmV3IGVudHJ5IGludGVyc2VjdGlvbiByYXRpbyBoYXMgY3Jvc3NlZCBhbnkgb2YgdGhlXG4gICAgICAvLyB0aHJlc2hvbGRzLCBhZGQgYSBuZXcgZW50cnkuXG4gICAgICBpZiAodGhpcy5faGFzQ3Jvc3NlZFRocmVzaG9sZChvbGRFbnRyeSwgbmV3RW50cnkpKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZEVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSByb290IGlzIG5vdCBpbiB0aGUgRE9NIG9yIHRhcmdldCBpcyBub3QgY29udGFpbmVkIHdpdGhpblxuICAgICAgLy8gcm9vdCBidXQgdGhlIHByZXZpb3VzIGVudHJ5IGZvciB0aGlzIHRhcmdldCBoYWQgYW4gaW50ZXJzZWN0aW9uLFxuICAgICAgLy8gYWRkIGEgbmV3IHJlY29yZCBpbmRpY2F0aW5nIHJlbW92YWwuXG4gICAgICBpZiAob2xkRW50cnkgJiYgb2xkRW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHRoaXMpO1xuXG4gIGlmICh0aGlzLl9xdWV1ZWRFbnRyaWVzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrKHRoaXMudGFrZVJlY29yZHMoKSwgdGhpcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIGEgdGFyZ2V0IGFuZCByb290IHJlY3QgY29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZW5cbiAqIGZvbGxvd2luZyB0aGUgYWxnb3JpdGhtIGluIHRoZSBzcGVjLlxuICogVE9ETyhwaGlsaXB3YWx0b24pOiBhdCB0aGlzIHRpbWUgY2xpcC1wYXRoIGlzIG5vdCBjb25zaWRlcmVkLlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ludGVyc2VjdGlvbk9ic2VydmVyLyNjYWxjdWxhdGUtaW50ZXJzZWN0aW9uLXJlY3QtYWxnb1xuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgVGhlIHRhcmdldCBET00gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHJvb3RSZWN0IFRoZSBib3VuZGluZyByZWN0IG9mIHRoZSByb290IGFmdGVyIGJlaW5nXG4gKiAgICAgZXhwYW5kZWQgYnkgdGhlIHJvb3RNYXJnaW4gdmFsdWUuXG4gKiBAcmV0dXJuIHs/T2JqZWN0fSBUaGUgZmluYWwgaW50ZXJzZWN0aW9uIHJlY3Qgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBub1xuICogICAgIGludGVyc2VjdGlvbiBpcyBmb3VuZC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fY29tcHV0ZVRhcmdldEFuZFJvb3RJbnRlcnNlY3Rpb24gPVxuICAgIGZ1bmN0aW9uKHRhcmdldCwgcm9vdFJlY3QpIHtcblxuICAvLyBJZiB0aGUgZWxlbWVudCBpc24ndCBkaXNwbGF5ZWQsIGFuIGludGVyc2VjdGlvbiBjYW4ndCBoYXBwZW4uXG4gIGlmICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpLmRpc3BsYXkgPT0gJ25vbmUnKSByZXR1cm47XG5cbiAgdmFyIHRhcmdldFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGFyZ2V0KTtcbiAgdmFyIGludGVyc2VjdGlvblJlY3QgPSB0YXJnZXRSZWN0O1xuICB2YXIgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSh0YXJnZXQpO1xuICB2YXIgYXRSb290ID0gZmFsc2U7XG5cbiAgd2hpbGUgKCFhdFJvb3QpIHtcbiAgICB2YXIgcGFyZW50UmVjdCA9IG51bGw7XG4gICAgdmFyIHBhcmVudENvbXB1dGVkU3R5bGUgPSBwYXJlbnQubm9kZVR5cGUgPT0gMSA/XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCkgOiB7fTtcblxuICAgIC8vIElmIHRoZSBwYXJlbnQgaXNuJ3QgZGlzcGxheWVkLCBhbiBpbnRlcnNlY3Rpb24gY2FuJ3QgaGFwcGVuLlxuICAgIGlmIChwYXJlbnRDb21wdXRlZFN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSByZXR1cm47XG5cbiAgICBpZiAocGFyZW50ID09IHRoaXMucm9vdCB8fCBwYXJlbnQgPT0gZG9jdW1lbnQpIHtcbiAgICAgIGF0Um9vdCA9IHRydWU7XG4gICAgICBwYXJlbnRSZWN0ID0gcm9vdFJlY3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSBlbGVtZW50IGhhcyBhIG5vbi12aXNpYmxlIG92ZXJmbG93LCBhbmQgaXQncyBub3QgdGhlIDxib2R5PlxuICAgICAgLy8gb3IgPGh0bWw+IGVsZW1lbnQsIHVwZGF0ZSB0aGUgaW50ZXJzZWN0aW9uIHJlY3QuXG4gICAgICAvLyBOb3RlOiA8Ym9keT4gYW5kIDxodG1sPiBjYW5ub3QgYmUgY2xpcHBlZCB0byBhIHJlY3QgdGhhdCdzIG5vdCBhbHNvXG4gICAgICAvLyB0aGUgZG9jdW1lbnQgcmVjdCwgc28gbm8gbmVlZCB0byBjb21wdXRlIGEgbmV3IGludGVyc2VjdGlvbi5cbiAgICAgIGlmIChwYXJlbnQgIT0gZG9jdW1lbnQuYm9keSAmJlxuICAgICAgICAgIHBhcmVudCAhPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiZcbiAgICAgICAgICBwYXJlbnRDb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9ICd2aXNpYmxlJykge1xuICAgICAgICBwYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgZWl0aGVyIG9mIHRoZSBhYm92ZSBjb25kaXRpb25hbHMgc2V0IGEgbmV3IHBhcmVudFJlY3QsXG4gICAgLy8gY2FsY3VsYXRlIG5ldyBpbnRlcnNlY3Rpb24gZGF0YS5cbiAgICBpZiAocGFyZW50UmVjdCkge1xuICAgICAgaW50ZXJzZWN0aW9uUmVjdCA9IGNvbXB1dGVSZWN0SW50ZXJzZWN0aW9uKHBhcmVudFJlY3QsIGludGVyc2VjdGlvblJlY3QpO1xuXG4gICAgICBpZiAoIWludGVyc2VjdGlvblJlY3QpIGJyZWFrO1xuICAgIH1cbiAgICBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGludGVyc2VjdGlvblJlY3Q7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcm9vdCByZWN0IGFmdGVyIGJlaW5nIGV4cGFuZGVkIGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgZXhwYW5kZWQgcm9vdCByZWN0LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9nZXRSb290UmVjdCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgcm9vdFJlY3Q7XG4gIGlmICh0aGlzLnJvb3QpIHtcbiAgICByb290UmVjdCA9IGdldEJvdW5kaW5nQ2xpZW50UmVjdCh0aGlzLnJvb3QpO1xuICB9IGVsc2Uge1xuICAgIC8vIFVzZSA8aHRtbD4vPGJvZHk+IGluc3RlYWQgb2Ygd2luZG93IHNpbmNlIHNjcm9sbCBiYXJzIGFmZmVjdCBzaXplLlxuICAgIHZhciBodG1sID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuICAgIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keTtcbiAgICByb290UmVjdCA9IHtcbiAgICAgIHRvcDogMCxcbiAgICAgIGxlZnQ6IDAsXG4gICAgICByaWdodDogaHRtbC5jbGllbnRXaWR0aCB8fCBib2R5LmNsaWVudFdpZHRoLFxuICAgICAgd2lkdGg6IGh0bWwuY2xpZW50V2lkdGggfHwgYm9keS5jbGllbnRXaWR0aCxcbiAgICAgIGJvdHRvbTogaHRtbC5jbGllbnRIZWlnaHQgfHwgYm9keS5jbGllbnRIZWlnaHQsXG4gICAgICBoZWlnaHQ6IGh0bWwuY2xpZW50SGVpZ2h0IHx8IGJvZHkuY2xpZW50SGVpZ2h0XG4gICAgfTtcbiAgfVxuICByZXR1cm4gdGhpcy5fZXhwYW5kUmVjdEJ5Um9vdE1hcmdpbihyb290UmVjdCk7XG59O1xuXG5cbi8qKlxuICogQWNjZXB0cyBhIHJlY3QgYW5kIGV4cGFuZHMgaXQgYnkgdGhlIHJvb3RNYXJnaW4gdmFsdWUuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdCBUaGUgcmVjdCBvYmplY3QgdG8gZXhwYW5kLlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgZXhwYW5kZWQgcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fZXhwYW5kUmVjdEJ5Um9vdE1hcmdpbiA9IGZ1bmN0aW9uKHJlY3QpIHtcbiAgdmFyIG1hcmdpbnMgPSB0aGlzLl9yb290TWFyZ2luVmFsdWVzLm1hcChmdW5jdGlvbihtYXJnaW4sIGkpIHtcbiAgICByZXR1cm4gbWFyZ2luLnVuaXQgPT0gJ3B4JyA/IG1hcmdpbi52YWx1ZSA6XG4gICAgICAgIG1hcmdpbi52YWx1ZSAqIChpICUgMiA/IHJlY3Qud2lkdGggOiByZWN0LmhlaWdodCkgLyAxMDA7XG4gIH0pO1xuICB2YXIgbmV3UmVjdCA9IHtcbiAgICB0b3A6IHJlY3QudG9wIC0gbWFyZ2luc1swXSxcbiAgICByaWdodDogcmVjdC5yaWdodCArIG1hcmdpbnNbMV0sXG4gICAgYm90dG9tOiByZWN0LmJvdHRvbSArIG1hcmdpbnNbMl0sXG4gICAgbGVmdDogcmVjdC5sZWZ0IC0gbWFyZ2luc1szXVxuICB9O1xuICBuZXdSZWN0LndpZHRoID0gbmV3UmVjdC5yaWdodCAtIG5ld1JlY3QubGVmdDtcbiAgbmV3UmVjdC5oZWlnaHQgPSBuZXdSZWN0LmJvdHRvbSAtIG5ld1JlY3QudG9wO1xuXG4gIHJldHVybiBuZXdSZWN0O1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgYW4gb2xkIGFuZCBuZXcgZW50cnkgYW5kIHJldHVybnMgdHJ1ZSBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlXG4gKiB0aHJlc2hvbGQgdmFsdWVzIGhhcyBiZWVuIGNyb3NzZWQuXG4gKiBAcGFyYW0gez9JbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5fSBvbGRFbnRyeSBUaGUgcHJldmlvdXMgZW50cnkgZm9yIGFcbiAqICAgIHBhcnRpY3VsYXIgdGFyZ2V0IGVsZW1lbnQgb3IgbnVsbCBpZiBubyBwcmV2aW91cyBlbnRyeSBleGlzdHMuXG4gKiBAcGFyYW0ge0ludGVyc2VjdGlvbk9ic2VydmVyRW50cnl9IG5ld0VudHJ5IFRoZSBjdXJyZW50IGVudHJ5IGZvciBhXG4gKiAgICBwYXJ0aWN1bGFyIHRhcmdldCBlbGVtZW50LlxuICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGEgYW55IHRocmVzaG9sZCBoYXMgYmVlbiBjcm9zc2VkLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9oYXNDcm9zc2VkVGhyZXNob2xkID1cbiAgICBmdW5jdGlvbihvbGRFbnRyeSwgbmV3RW50cnkpIHtcblxuICAvLyBUbyBtYWtlIGNvbXBhcmluZyBlYXNpZXIsIGFuIGVudHJ5IHRoYXQgaGFzIGEgcmF0aW8gb2YgMFxuICAvLyBidXQgZG9lcyBub3QgYWN0dWFsbHkgaW50ZXJzZWN0IGlzIGdpdmVuIGEgdmFsdWUgb2YgLTFcbiAgdmFyIG9sZFJhdGlvID0gb2xkRW50cnkgJiYgb2xkRW50cnkuaXNJbnRlcnNlY3RpbmcgP1xuICAgICAgb2xkRW50cnkuaW50ZXJzZWN0aW9uUmF0aW8gfHwgMCA6IC0xO1xuICB2YXIgbmV3UmF0aW8gPSBuZXdFbnRyeS5pc0ludGVyc2VjdGluZyA/XG4gICAgICBuZXdFbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyB8fCAwIDogLTE7XG5cbiAgLy8gSWdub3JlIHVuY2hhbmdlZCByYXRpb3NcbiAgaWYgKG9sZFJhdGlvID09PSBuZXdSYXRpbykgcmV0dXJuO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy50aHJlc2hvbGRzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIHRocmVzaG9sZCA9IHRoaXMudGhyZXNob2xkc1tpXTtcblxuICAgIC8vIFJldHVybiB0cnVlIGlmIGFuIGVudHJ5IG1hdGNoZXMgYSB0aHJlc2hvbGQgb3IgaWYgdGhlIG5ldyByYXRpb1xuICAgIC8vIGFuZCB0aGUgb2xkIHJhdGlvIGFyZSBvbiB0aGUgb3Bwb3NpdGUgc2lkZXMgb2YgYSB0aHJlc2hvbGQuXG4gICAgaWYgKHRocmVzaG9sZCA9PSBvbGRSYXRpbyB8fCB0aHJlc2hvbGQgPT0gbmV3UmF0aW8gfHxcbiAgICAgICAgdGhyZXNob2xkIDwgb2xkUmF0aW8gIT09IHRocmVzaG9sZCA8IG5ld1JhdGlvKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSByb290IGVsZW1lbnQgaXMgYW4gZWxlbWVudCBhbmQgaXMgaW4gdGhlIERPTS5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHJvb3QgZWxlbWVudCBpcyBhbiBlbGVtZW50IGFuZCBpcyBpbiB0aGUgRE9NLlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9yb290SXNJbkRvbSA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gIXRoaXMucm9vdCB8fCBjb250YWluc0RlZXAoZG9jdW1lbnQsIHRoaXMucm9vdCk7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSBjaGlsZCBvZiByb290LlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgVGhlIHRhcmdldCBlbGVtZW50IHRvIGNoZWNrLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgdGFyZ2V0IGVsZW1lbnQgaXMgYSBjaGlsZCBvZiByb290LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9yb290Q29udGFpbnNUYXJnZXQgPSBmdW5jdGlvbih0YXJnZXQpIHtcbiAgcmV0dXJuIGNvbnRhaW5zRGVlcCh0aGlzLnJvb3QgfHwgZG9jdW1lbnQsIHRhcmdldCk7XG59O1xuXG5cbi8qKlxuICogQWRkcyB0aGUgaW5zdGFuY2UgdG8gdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlciByZWdpc3RyeSBpZiBpdCBpc24ndFxuICogYWxyZWFkeSBwcmVzZW50LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gIGlmIChyZWdpc3RyeS5pbmRleE9mKHRoaXMpIDwgMCkge1xuICAgIHJlZ2lzdHJ5LnB1c2godGhpcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSBpbnN0YW5jZSBmcm9tIHRoZSBnbG9iYWwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgcmVnaXN0cnkuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3VucmVnaXN0ZXJJbnN0YW5jZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgaW5kZXggPSByZWdpc3RyeS5pbmRleE9mKHRoaXMpO1xuICBpZiAoaW5kZXggIT0gLTEpIHJlZ2lzdHJ5LnNwbGljZShpbmRleCwgMSk7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBwZXJmb3JtYW5jZS5ub3coKSBtZXRob2Qgb3IgbnVsbCBpbiBicm93c2Vyc1xuICogdGhhdCBkb24ndCBzdXBwb3J0IHRoZSBBUEkuXG4gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHBhZ2Ugd2FzIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gbm93KCkge1xuICByZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlLm5vdyAmJiBwZXJmb3JtYW5jZS5ub3coKTtcbn1cblxuXG4vKipcbiAqIFRocm90dGxlcyBhIGZ1bmN0aW9uIGFuZCBkZWxheXMgaXRzIGV4ZWN1dGlvbmcsIHNvIGl0J3Mgb25seSBjYWxsZWQgYXQgbW9zdFxuICogb25jZSB3aXRoaW4gYSBnaXZlbiB0aW1lIHBlcmlvZC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBmdW5jdGlvbiB0byB0aHJvdHRsZS5cbiAqIEBwYXJhbSB7bnVtYmVyfSB0aW1lb3V0IFRoZSBhbW91bnQgb2YgdGltZSB0aGF0IG11c3QgcGFzcyBiZWZvcmUgdGhlXG4gKiAgICAgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBhZ2Fpbi5cbiAqIEByZXR1cm4ge0Z1bmN0aW9ufSBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiB0aHJvdHRsZShmbiwgdGltZW91dCkge1xuICB2YXIgdGltZXIgPSBudWxsO1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIGlmICghdGltZXIpIHtcbiAgICAgIHRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgZm4oKTtcbiAgICAgICAgdGltZXIgPSBudWxsO1xuICAgICAgfSwgdGltZW91dCk7XG4gICAgfVxuICB9O1xufVxuXG5cbi8qKlxuICogQWRkcyBhbiBldmVudCBoYW5kbGVyIHRvIGEgRE9NIG5vZGUgZW5zdXJpbmcgY3Jvc3MtYnJvd3NlciBjb21wYXRpYmlsaXR5LlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBET00gbm9kZSB0byBhZGQgdGhlIGV2ZW50IGhhbmRsZXIgdG8uXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZXZlbnQgaGFuZGxlciB0byBhZGQuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF91c2VDYXB0dXJlIE9wdGlvbmFsbHkgYWRkcyB0aGUgZXZlbiB0byB0aGUgY2FwdHVyZVxuICogICAgIHBoYXNlLiBOb3RlOiB0aGlzIG9ubHkgd29ya3MgaW4gbW9kZXJuIGJyb3dzZXJzLlxuICovXG5mdW5jdGlvbiBhZGRFdmVudChub2RlLCBldmVudCwgZm4sIG9wdF91c2VDYXB0dXJlKSB7XG4gIGlmICh0eXBlb2Ygbm9kZS5hZGRFdmVudExpc3RlbmVyID09ICdmdW5jdGlvbicpIHtcbiAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSB8fCBmYWxzZSk7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIG5vZGUuYXR0YWNoRXZlbnQgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5vZGUuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBmbik7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJlbW92ZXMgYSBwcmV2aW91c2x5IGFkZGVkIGV2ZW50IGhhbmRsZXIgZnJvbSBhIERPTSBub2RlLlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBET00gbm9kZSB0byByZW1vdmUgdGhlIGV2ZW50IGhhbmRsZXIgZnJvbS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBldmVudCBUaGUgZXZlbnQgbmFtZS5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuIFRoZSBldmVudCBoYW5kbGVyIHRvIHJlbW92ZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gb3B0X3VzZUNhcHR1cmUgSWYgdGhlIGV2ZW50IGhhbmRsZXIgd2FzIGFkZGVkIHdpdGggdGhpc1xuICogICAgIGZsYWcgc2V0IHRvIHRydWUsIGl0IHNob3VsZCBiZSBzZXQgdG8gdHJ1ZSBoZXJlIGluIG9yZGVyIHRvIHJlbW92ZSBpdC5cbiAqL1xuZnVuY3Rpb24gcmVtb3ZlRXZlbnQobm9kZSwgZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSkge1xuICBpZiAodHlwZW9mIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgb3B0X3VzZUNhcHR1cmUgfHwgZmFsc2UpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBub2RlLmRldGF0Y2hFdmVudCA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5kZXRhdGNoRXZlbnQoJ29uJyArIGV2ZW50LCBmbik7XG4gIH1cbn1cblxuXG4vKipcbiAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byByZWN0IG9iamVjdHMuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdDEgVGhlIGZpcnN0IHJlY3QuXG4gKiBAcGFyYW0ge09iamVjdH0gcmVjdDIgVGhlIHNlY29uZCByZWN0LlxuICogQHJldHVybiB7P09iamVjdH0gVGhlIGludGVyc2VjdGlvbiByZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBpbnRlcnNlY3Rpb25cbiAqICAgICBpcyBmb3VuZC5cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVJlY3RJbnRlcnNlY3Rpb24ocmVjdDEsIHJlY3QyKSB7XG4gIHZhciB0b3AgPSBNYXRoLm1heChyZWN0MS50b3AsIHJlY3QyLnRvcCk7XG4gIHZhciBib3R0b20gPSBNYXRoLm1pbihyZWN0MS5ib3R0b20sIHJlY3QyLmJvdHRvbSk7XG4gIHZhciBsZWZ0ID0gTWF0aC5tYXgocmVjdDEubGVmdCwgcmVjdDIubGVmdCk7XG4gIHZhciByaWdodCA9IE1hdGgubWluKHJlY3QxLnJpZ2h0LCByZWN0Mi5yaWdodCk7XG4gIHZhciB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgdmFyIGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcblxuICByZXR1cm4gKHdpZHRoID49IDAgJiYgaGVpZ2h0ID49IDApICYmIHtcbiAgICB0b3A6IHRvcCxcbiAgICBib3R0b206IGJvdHRvbSxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIHJpZ2h0OiByaWdodCxcbiAgICB3aWR0aDogd2lkdGgsXG4gICAgaGVpZ2h0OiBoZWlnaHRcbiAgfTtcbn1cblxuXG4vKipcbiAqIFNoaW1zIHRoZSBuYXRpdmUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgSUUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nIHJlY3QgdG8gZ2V0LlxuICogQHJldHVybiB7T2JqZWN0fSBUaGUgKHBvc3NpYmx5IHNoaW1tZWQpIHJlY3Qgb2YgdGhlIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCkge1xuICB2YXIgcmVjdDtcblxuICB0cnkge1xuICAgIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWdub3JlIFdpbmRvd3MgNyBJRTExIFwiVW5zcGVjaWZpZWQgZXJyb3JcIlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvcHVsbC8yMDVcbiAgfVxuXG4gIGlmICghcmVjdCkgcmV0dXJuIGdldEVtcHR5UmVjdCgpO1xuXG4gIC8vIE9sZGVyIElFXG4gIGlmICghKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpKSB7XG4gICAgcmVjdCA9IHtcbiAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICB3aWR0aDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlY3Q7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IHJlY3Qgb2JqZWN0LiBBbiBlbXB0eSByZWN0IGlzIHJldHVybmVkIHdoZW4gYW4gZWxlbWVudFxuICogaXMgbm90IGluIHRoZSBET00uXG4gKiBAcmV0dXJuIHtPYmplY3R9IFRoZSBlbXB0eSByZWN0LlxuICovXG5mdW5jdGlvbiBnZXRFbXB0eVJlY3QoKSB7XG4gIHJldHVybiB7XG4gICAgdG9wOiAwLFxuICAgIGJvdHRvbTogMCxcbiAgICBsZWZ0OiAwLFxuICAgIHJpZ2h0OiAwLFxuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMFxuICB9O1xufVxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaWYgYSBwYXJlbnQgZWxlbWVudCBjb250YWlucyBhIGNoaWxkIGVsZW1udCAoaW5jbHVkaW5nIGluc2lkZVxuICogc2hhZG93IERPTSkuXG4gKiBAcGFyYW0ge05vZGV9IHBhcmVudCBUaGUgcGFyZW50IGVsZW1lbnQuXG4gKiBAcGFyYW0ge05vZGV9IGNoaWxkIFRoZSBjaGlsZCBlbGVtZW50LlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcGFyZW50IG5vZGUgY29udGFpbnMgdGhlIGNoaWxkIG5vZGUuXG4gKi9cbmZ1bmN0aW9uIGNvbnRhaW5zRGVlcChwYXJlbnQsIGNoaWxkKSB7XG4gIHZhciBub2RlID0gY2hpbGQ7XG4gIHdoaWxlIChub2RlKSB7XG4gICAgaWYgKG5vZGUgPT0gcGFyZW50KSByZXR1cm4gdHJ1ZTtcblxuICAgIG5vZGUgPSBnZXRQYXJlbnROb2RlKG5vZGUpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuXG4vKipcbiAqIEdldHMgdGhlIHBhcmVudCBub2RlIG9mIGFuIGVsZW1lbnQgb3IgaXRzIGhvc3QgZWxlbWVudCBpZiB0aGUgcGFyZW50IG5vZGVcbiAqIGlzIGEgc2hhZG93IHJvb3QuXG4gKiBAcGFyYW0ge05vZGV9IG5vZGUgVGhlIG5vZGUgd2hvc2UgcGFyZW50IHRvIGdldC5cbiAqIEByZXR1cm4ge05vZGV8bnVsbH0gVGhlIHBhcmVudCBub2RlIG9yIG51bGwgaWYgbm8gcGFyZW50IGV4aXN0cy5cbiAqL1xuZnVuY3Rpb24gZ2V0UGFyZW50Tm9kZShub2RlKSB7XG4gIHZhciBwYXJlbnQgPSBub2RlLnBhcmVudE5vZGU7XG5cbiAgaWYgKHBhcmVudCAmJiBwYXJlbnQubm9kZVR5cGUgPT0gMTEgJiYgcGFyZW50Lmhvc3QpIHtcbiAgICAvLyBJZiB0aGUgcGFyZW50IGlzIGEgc2hhZG93IHJvb3QsIHJldHVybiB0aGUgaG9zdCBlbGVtZW50LlxuICAgIHJldHVybiBwYXJlbnQuaG9zdDtcbiAgfVxuICByZXR1cm4gcGFyZW50O1xufVxuXG5cbi8vIEV4cG9zZXMgdGhlIGNvbnN0cnVjdG9ycyBnbG9iYWxseS5cbndpbmRvdy5JbnRlcnNlY3Rpb25PYnNlcnZlciA9IEludGVyc2VjdGlvbk9ic2VydmVyO1xud2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgPSBJbnRlcnNlY3Rpb25PYnNlcnZlckVudHJ5O1xuXG59KHdpbmRvdywgZG9jdW1lbnQpKTtcbiIsIi8qIVxuICogcmltZyB2Mi4xLjBcbiAqIChjKSAyMDE4IFBpeGVsIFVuaW9uXG4gKi9cbi8qKlxuICogVGhlIGRlZmF1bHQgdGVtcGxhdGUgcmVuZGVyIGZ1bmN0aW9uLiBUdXJucyBhIHRlbXBsYXRlIHN0cmluZyBpbnRvIGFuIGltYWdlXG4gKiBVUkwuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHRlbXBsYXRlXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRUZW1wbGF0ZVJlbmRlcih0ZW1wbGF0ZSwgc2l6ZSkge1xuICByZXR1cm4gdGVtcGxhdGUucmVwbGFjZSgne3NpemV9Jywgc2l6ZS53aWR0aCArICd4JyArIHNpemUuaGVpZ2h0KTtcbn1cblxuLyoqXG4gKiBAdHlwZSBTZXR0aW5nc1xuICovXG52YXIgZGVmYXVsdHMgPSB7XG4gIHNjYWxlOiAxLFxuICB0ZW1wbGF0ZTogZmFsc2UsXG4gIHRlbXBsYXRlUmVuZGVyOiBkZWZhdWx0VGVtcGxhdGVSZW5kZXIsXG4gIG1heDogeyB3aWR0aDogSW5maW5pdHksIGhlaWdodDogSW5maW5pdHkgfSxcbiAgcm91bmQ6IDMyLFxuICBwbGFjZWhvbGRlcjogZmFsc2Vcbn07XG5cbi8qKlxuICogR2V0IGEgZGF0YSBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhbiBlbGVtZW50LCB3aXRoIGEgZGVmYXVsdCBmYWxsYmFjayBhbmRcbiAqIHNhbml0aXphdGlvbiBzdGVwLlxuICpcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWxcbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogICAgICAgIFRoZSBkYXRhIGF0dHJpYnV0ZSBuYW1lLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zXG4gKiAgICAgICAgQW4gb2JqZWN0IGhvbGRpbmcgZmFsbGJhY2sgdmFsdWVzIGlmIHRoZSBkYXRhIGF0dHJpYnV0ZSBkb2VzIG5vdFxuICogICAgICAgIGV4aXN0LiBJZiB0aGlzIG9iamVjdCBkb2Vzbid0IGhhdmUgdGhlIHByb3BlcnR5LCB3ZSBmdXJ0aGVyIGZhbGxiYWNrXG4gKiAgICAgICAgdG8gb3VyIGRlZmF1bHRzLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtzYW5pdGl6ZV1cbiAqICAgICAgICBBIGZ1bmN0aW9uIHRvIHNhbml0aXplIHRoZSBkYXRhIGF0dHJpYnV0ZSB2YWx1ZSB3aXRoLlxuICpcbiAqIEByZXR1cm5zIHtTdHJpbmd8Kn1cbiAqL1xuZnVuY3Rpb24gZ2V0RGF0YShlbCwgbmFtZSwgb3B0aW9ucywgc2FuaXRpemUpIHtcbiAgdmFyIGF0dHIgPSAnZGF0YS1yaW1nLScgKyBuYW1lO1xuICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyKSkgcmV0dXJuIG9wdGlvbnNbbmFtZV0gfHwgZGVmYXVsdHNbbmFtZV07XG5cbiAgdmFyIHZhbHVlID0gZWwuZ2V0QXR0cmlidXRlKGF0dHIpO1xuXG4gIHJldHVybiBzYW5pdGl6ZSA/IHNhbml0aXplKHZhbHVlKSA6IHZhbHVlO1xufVxuXG4vKipcbiAqIFNhbml0aXplIGRhdGEgYXR0cmlidXRlcyB0aGF0IHJlcHJlc2VudCBhIHNpemUgKGluIHRoZSBmb3JtIG9mIGAxMHgxMGApLlxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSB2YWx1ZVxuICogQHJldHVybnMge09iamVjdH0gQW4gb2JqZWN0IHdpdGggYHdpZHRoYCBhbmQgYGhlaWdodGAgcHJvcGVydGllcy5cbiAqL1xuZnVuY3Rpb24gcGFyc2VTaXplKHZhbHVlKSB7XG4gIHZhbHVlID0gdmFsdWUuc3BsaXQoJ3gnKTtcbiAgcmV0dXJuIHsgd2lkdGg6IHBhcnNlSW50KHZhbHVlWzBdLCAxMCksIGhlaWdodDogcGFyc2VJbnQodmFsdWVbMV0sIDEwKSB9O1xufVxuXG4vKipcbiAqIExvYWRzIGluZm9ybWF0aW9uIGFib3V0IGFuIGVsZW1lbnQuXG4gKlxuICogT3B0aW9ucyBjYW4gYmUgc2V0IG9uIHRoZSBlbGVtZW50IGl0c2VsZiB1c2luZyBkYXRhIGF0dHJpYnV0ZXMsIG9yIHRocm91Z2hcbiAqIHRoZSBgb3B0aW9uc2AgcGFyYW1ldGVyLiBEYXRhIGF0dHJpYnV0ZXMgdGFrZSBwcmlvcml0eS5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHBhcmFtIHtTZXR0aW5nc30gb3B0aW9uc1xuICogQHJldHVybnMge0l0ZW19XG4gKi9cbmZ1bmN0aW9uIHBhcnNlSXRlbShlbCkge1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgdmFyIGlzSW1hZ2UgPSBlbC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcmltZy10ZW1wbGF0ZScpO1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7U2V0dGluZ3N9IEl0ZW1cbiAgICovXG4gIHJldHVybiB7XG4gICAgZWw6IGVsLFxuXG4gICAgLy8gVHlwZSBvZiBlbGVtZW50XG4gICAgaXNJbWFnZTogaXNJbWFnZSxcbiAgICBpc0JhY2tncm91bmRJbWFnZTogaXNJbWFnZSAmJiBlbC50YWdOYW1lICE9PSAnSU1HJyxcblxuICAgIC8vIEltYWdlIHNjYWxlXG4gICAgc2NhbGU6IGdldERhdGEoZWwsICdzY2FsZScsIG9wdGlvbnMpLFxuXG4gICAgLy8gRGV2aWNlIGRlbnNpdHlcbiAgICBkZW5zaXR5OiB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyB8fCAxLFxuXG4gICAgLy8gSW1hZ2UgdGVtcGxhdGUgVVJMXG4gICAgdGVtcGxhdGU6IGdldERhdGEoZWwsICd0ZW1wbGF0ZScsIG9wdGlvbnMpLFxuICAgIHRlbXBsYXRlUmVuZGVyOiBvcHRpb25zLnRlbXBsYXRlUmVuZGVyIHx8IGRlZmF1bHRzLnRlbXBsYXRlUmVuZGVyLFxuXG4gICAgLy8gTWF4aW11bSBpbWFnZSBkaW1lbnNpb25zXG4gICAgbWF4OiBnZXREYXRhKGVsLCAnbWF4Jywgb3B0aW9ucywgcGFyc2VTaXplKSxcblxuICAgIC8vIFJvdW5kIGltYWdlIGRpbWVuc2lvbnMgdG8gdGhlIG5lYXJlc3QgbXVsdGlwbGVcbiAgICByb3VuZDogZ2V0RGF0YShlbCwgJ3JvdW5kJywgb3B0aW9ucyksXG5cbiAgICAvLyBQbGFjZWhvbGRlciBpbWFnZSBkaW1lbnNpb25zXG4gICAgcGxhY2Vob2xkZXI6IGdldERhdGEoZWwsICdwbGFjZWhvbGRlcicsIG9wdGlvbnMsIHBhcnNlU2l6ZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBSb3VuZCB0byB0aGUgbmVhcmVzdCBtdWx0aXBsZS5cbiAqXG4gKiBUaGlzIGlzIHNvIHdlIGRvbid0IHRheCB0aGUgaW1hZ2Ugc2VydmVyIHRvbyBtdWNoLlxuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBzaXplIFRoZSBzaXplLCBpbiBwaXhlbHMuXG4gKiBAcGFyYW0ge051bWJlcn0gbXVsdGlwbGUgVGhlIG11bHRpcGxlIHRvIHJvdW5kIHRvIHRoZSBuZWFyZXN0LlxuICogQHJldHVybnMge051bWJlcn1cbiAqL1xuZnVuY3Rpb24gcm91bmRTaXplKHNpemUsIG11bHRpcGxlKSB7XG4gIHJldHVybiBNYXRoLmNlaWwoc2l6ZSAvIG11bHRpcGxlKSAqIG11bHRpcGxlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgc2l6ZSBvZiBhbiBlbGVtZW50LlxuICpcbiAqIElmIGl0IGlzIHRvbyBzbWFsbCwgaXQncyBwYXJlbnQgZWxlbWVudCBpcyBjaGVja2VkLCBhbmQgc28gb24uIFRoaXMgaGVscHNcbiAqIGF2b2lkIHRoZSBzaXR1YXRpb24gd2hlcmUgYW4gZWxlbWVudCBkb2Vzbid0IGhhdmUgYSBzaXplIHlldCBvciBpcyBwb3NpdGlvbmVkXG4gKiBvdXQgb2YgdGhlIGxheW91dC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHJldHVybiB7T2JqZWN0fSBzaXplXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNpemUud2lkdGggVGhlIHdpZHRoLCBpbiBwaXhlbHMuXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHNpemUuaGVpZ2h0IFRoZSBoZWlnaHQsIGluIHBpeGVscy5cbiAqL1xuZnVuY3Rpb24gZ2V0RWxlbWVudFNpemUoZWwpIHtcbiAgdmFyIHNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcblxuICB3aGlsZSAoZWwpIHtcbiAgICBzaXplLndpZHRoID0gZWwub2Zmc2V0V2lkdGg7XG4gICAgc2l6ZS5oZWlnaHQgPSBlbC5vZmZzZXRIZWlnaHQ7XG4gICAgaWYgKHNpemUud2lkdGggPiAyMCAmJiBzaXplLmhlaWdodCA+IDIwKSBicmVhaztcbiAgICBlbCA9IGVsLnBhcmVudE5vZGU7XG4gIH1cblxuICByZXR1cm4gc2l6ZTtcbn1cblxuLyoqXG4gKiBUcmlnZ2VyIGEgY3VzdG9tIGV2ZW50LlxuICpcbiAqIE5vdGU6IHRoaXMgYXBwcm9hY2ggaXMgZGVwcmVjYXRlZCwgYnV0IHN0aWxsIHJlcXVpcmVkIHRvIHN1cHBvcnQgb2xkZXJcbiAqIGJyb3dzZXJzIHN1Y2ggYXMgSUUgMTAuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9HdWlkZS9FdmVudHMvQ3JlYXRpbmdfYW5kX3RyaWdnZXJpbmdfZXZlbnRzXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqICAgICAgICBUaGUgZWxlbWVudCB0byB0cmlnZ2VyIHRoZSBldmVudCBvbi5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogICAgICAgIFRoZSBldmVudCBuYW1lLlxuICpcbiAqIEByZXR1cm5zIHtCb29sZWFufVxuICogICAgICAgICAgVHJ1ZSBpZiB0aGUgZXZlbnQgd2FzIGNhbmNlbGVkLlxuICovXG5mdW5jdGlvbiB0cmlnZ2VyKGVsLCBuYW1lKSB7XG4gIHZhciBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICBldmVudC5pbml0RXZlbnQobmFtZSwgdHJ1ZSwgdHJ1ZSk7XG4gIHJldHVybiAhZWwuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBkZW5zaXR5IG9mIHRoZSBpbWFnZSwgZ2l2ZW4gdGhlIGNvbnRhaW5lci5cbiAqXG4gKiBAcGFyYW0ge0l0ZW19IGl0ZW1cbiAqIEBwYXJhbSB7U2l6ZX0gc2l6ZVxuICovXG5mdW5jdGlvbiBzdXBwb3J0ZWREZW5zaXR5KGl0ZW0sIHNpemUpIHtcbiAgcmV0dXJuIE1hdGgubWluKE1hdGgubWluKE1hdGgubWF4KGl0ZW0ubWF4LndpZHRoIC8gc2l6ZS53aWR0aCwgMSksIGl0ZW0uZGVuc2l0eSksIE1hdGgubWluKE1hdGgubWF4KGl0ZW0ubWF4LmhlaWdodCAvIHNpemUuaGVpZ2h0LCAxKSwgaXRlbS5kZW5zaXR5KSkudG9GaXhlZCgyKTtcbn1cblxuLyoqXG4gKiBTZXQgdGhlIGltYWdlIFVSTCBvbiB0aGUgZWxlbWVudC4gU3VwcG9ydHMgYmFja2dyb3VuZCBpbWFnZXMgYW5kIGBzcmNzZXRgLlxuICpcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzUGxhY2Vob2xkZXJcbiAqL1xuZnVuY3Rpb24gc2V0SW1hZ2UoaXRlbSwgc2l6ZSwgaXNQbGFjZWhvbGRlciwgb25Mb2FkKSB7XG4gIHZhciByZW5kZXIgPSBpdGVtLnRlbXBsYXRlUmVuZGVyO1xuICB2YXIgZGVuc2l0eSA9IGlzUGxhY2Vob2xkZXIgPyAxIDogc3VwcG9ydGVkRGVuc2l0eShpdGVtLCBzaXplKTtcbiAgdmFyIHJvdW5kID0gaXNQbGFjZWhvbGRlciA/IDEgOiBpdGVtLnJvdW5kO1xuXG4gIHZhciB3aWR0aCA9IHJvdW5kU2l6ZShzaXplLndpZHRoICogZGVuc2l0eSwgcm91bmQpO1xuICB2YXIgaGVpZ2h0ID0gcm91bmRTaXplKHNpemUuaGVpZ2h0ICogZGVuc2l0eSwgcm91bmQpO1xuICB2YXIgZGlzcGxheVNpemUgPSB3aWR0aCA+IGl0ZW0ubWF4LndpZHRoIHx8IGhlaWdodCA+IGl0ZW0ubWF4LmhlaWdodCA/IHsgd2lkdGg6IGl0ZW0ubWF4LndpZHRoLCBoZWlnaHQ6IGl0ZW0ubWF4LmhlaWdodCB9IDogeyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07XG5cbiAgdmFyIHVybCA9IHJlbmRlcihpdGVtLnRlbXBsYXRlLCBkaXNwbGF5U2l6ZSk7XG5cbiAgLy8gT24gbG9hZCBjYWxsYmFja1xuICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2UoKTtcbiAgaW1hZ2Uub25sb2FkID0gb25Mb2FkO1xuICBpbWFnZS5zcmMgPSB1cmw7XG5cbiAgLy8gU2V0IGltYWdlXG4gIGlmIChpdGVtLmlzQmFja2dyb3VuZEltYWdlKSB7XG4gICAgaXRlbS5lbC5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAndXJsKFxcJycgKyB1cmwgKyAnXFwnKSc7XG4gIH0gZWxzZSB7XG4gICAgaXRlbS5lbC5zZXRBdHRyaWJ1dGUoJ3NyY3NldCcsIHVybCArICcgJyArIGRlbnNpdHkgKyAneCcpO1xuICB9XG59XG5cbi8qKlxuICogTG9hZCB0aGUgaW1hZ2UsIHNldCBsb2FkZWQgc3RhdHVzLCBhbmQgdHJpZ2dlciB0aGUgbG9hZCBldmVudC5cbiAqXG4gKiBAZmlyZXMgcmltZzpsb2FkXG4gKiBAZmlyZXMgcmltZzplcnJvclxuICogQHBhcmFtIHtJdGVtfSBpdGVtXG4gKiBAcGFyYW0ge1NpemV9IHNpemVcbiAqL1xuZnVuY3Rpb24gbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKSB7XG4gIHZhciBlbCA9IGl0ZW0uZWw7XG5cbiAgc2V0SW1hZ2UoaXRlbSwgc2l6ZSwgZmFsc2UsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGlmIChldmVudC50eXBlID09PSAnbG9hZCcpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xvYWRlZCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmltZycsICdlcnJvcicpO1xuICAgICAgdHJpZ2dlcihlbCwgJ3JpbWc6ZXJyb3InKTtcbiAgICB9XG5cbiAgICB0cmlnZ2VyKGVsLCAncmltZzpsb2FkJyk7XG4gIH0pO1xufVxuXG4vKipcbiAqIExvYWQgaW4gYSByZXNwb25zaXZlIGltYWdlLlxuICpcbiAqIFNldHMgdGhlIGltYWdlJ3MgYHNyY3NldGAgYXR0cmlidXRlIHRvIHRoZSBmaW5hbCBpbWFnZSBVUkxzLCBjYWxjdWxhdGVkIGJhc2VkXG4gKiBvbiB0aGUgYWN0dWFsIHNpemUgdGhlIGltYWdlIGlzIGJlaW5nIHNob3duIGF0LlxuICpcbiAqIEBmaXJlcyByaW1nOmxvYWRpbmdcbiAqICAgICAgICBUaGUgaW1hZ2UgVVJMcyBoYXZlIGJlZW4gc2V0IGFuZCB3ZSBhcmUgd2FpdGluZyBmb3IgdGhlbSB0byBsb2FkLlxuICpcbiAqIEBmaXJlcyByaW1nOmxvYWRlZFxuICogICAgICAgIFRoZSBmaW5hbCBpbWFnZSBoYXMgbG9hZGVkLlxuICpcbiAqIEBmaXJlcyByaW1nOmVycm9yXG4gKiAgICAgICAgVGhlIGZpbmFsIGltYWdlIGZhaWxlZCBsb2FkaW5nLlxuICpcbiAqIEBwYXJhbSB7SXRlbX0gaXRlbVxuICovXG5mdW5jdGlvbiBsb2FkSW1hZ2UoaXRlbSkge1xuICB2YXIgZWwgPSBpdGVtLmVsO1xuXG4gIC8vIEFscmVhZHkgbG9hZGVkP1xuICB2YXIgc3RhdHVzID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJpbWcnKTtcbiAgaWYgKHN0YXR1cyA9PT0gJ2xvYWRpbmcnIHx8IHN0YXR1cyA9PT0gJ2xvYWRlZCcpIHJldHVybjtcblxuICAvLyBJcyB0aGUgU1ZHIGxvYWRlZD9cbiAgaWYgKCFlbC5jb21wbGV0ZSAmJiAhaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgIC8vIFdhaXQgZm9yIHRoZSBsb2FkIGV2ZW50LCB0aGVuIGNhbGwgbG9hZCBpbWFnZVxuICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBmdW5jdGlvbiBjYigpIHtcbiAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjYik7XG4gICAgICBsb2FkSW1hZ2UoaXRlbSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBUcmlnZ2VyIGxvYWRpbmcgZXZlbnQsIGFuZCBzdG9wIGlmIGNhbmNlbGxlZFxuICBpZiAodHJpZ2dlcihlbCwgJ3JpbWc6bG9hZGluZycpKSByZXR1cm47XG5cbiAgLy8gTWFyayBhcyBsb2FkaW5nXG4gIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xvYWRpbmcnKTtcblxuICAvLyBHZXQgZWxlbWVudCBzaXplLiBUaGlzIGlzIHVzZWQgYXMgdGhlIGlkZWFsIGRpc3BsYXkgc2l6ZS5cbiAgdmFyIHNpemUgPSBnZXRFbGVtZW50U2l6ZShpdGVtLmVsKTtcblxuICBzaXplLndpZHRoICo9IGl0ZW0uc2NhbGU7XG4gIHNpemUuaGVpZ2h0ICo9IGl0ZW0uc2NhbGU7XG5cbiAgaWYgKGl0ZW0ucGxhY2Vob2xkZXIpIHtcbiAgICAvLyBMb2FkIGEgcGxhY2Vob2xkZXIgaW1hZ2UgZmlyc3QsIGZvbGxvd2VkIGJ5IHRoZSBmdWxsIGltYWdlLiBGb3JjZSB0aGVcbiAgICAvLyBlbGVtZW50IHRvIGtlZXAgaXRzIGRpbWVuc2lvbnMgd2hpbGUgaXQgbG9hZHMuIElmIHRoZSBpbWFnZSBpcyBzbWFsbGVyXG4gICAgLy8gdGhhbiB0aGUgZWxlbWVudCBzaXplLCB1c2UgdGhlIGltYWdlJ3Mgc2l6ZS4gRGVuc2l0eSBpcyB0YWtlbiBpbnRvIGFjY291bnRcbiAgICAvLyBmb3IgSGlEUEkgZGV2aWNlcyB0byBhdm9pZCBibHVycnkgaW1hZ2VzLlxuICAgIGlmICghaXRlbS5pc0JhY2tncm91bmRJbWFnZSkge1xuICAgICAgZWwuc2V0QXR0cmlidXRlKCd3aWR0aCcsIE1hdGgubWluKE1hdGguZmxvb3IoaXRlbS5tYXgud2lkdGggLyBpdGVtLmRlbnNpdHkpLCBzaXplLndpZHRoKSk7XG4gICAgICBlbC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIE1hdGgubWluKE1hdGguZmxvb3IoaXRlbS5tYXguaGVpZ2h0IC8gaXRlbS5kZW5zaXR5KSwgc2l6ZS5oZWlnaHQpKTtcbiAgICB9XG5cbiAgICBzZXRJbWFnZShpdGVtLCBpdGVtLnBsYWNlaG9sZGVyLCB0cnVlLCBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gbG9hZEZ1bGxJbWFnZShpdGVtLCBzaXplKTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsb2FkRnVsbEltYWdlKGl0ZW0sIHNpemUpO1xuICB9XG59XG5cbi8qKlxuICogUHJlcGFyZSBhbiBlbGVtZW50IHRvIGJlIGRpc3BsYXllZCBvbiB0aGUgc2NyZWVuLlxuICpcbiAqIEltYWdlcyBoYXZlIHNwZWNpYWwgbG9naWMgYXBwbGllZCB0byB0aGVtIHRvIHN3YXAgb3V0IHRoZSBkaWZmZXJlbnQgc291cmNlcy5cbiAqXG4gKiBAZmlyZXMgcmltZzplbnRlclxuICogICAgICAgIFRoZSBlbGVtZW50IGlzIGVudGVyaW5nIHRoZSB2aWV3cG9ydC5cbiAqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbFxuICogQHBhcmFtIHtTZXR0aW5nc30gb3B0aW9uc1xuICovXG5mdW5jdGlvbiBsb2FkKGVsLCBvcHRpb25zKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJpZ2dlcihlbCwgJ3JpbWc6ZW50ZXInKTtcblxuICB2YXIgaXRlbSA9IHBhcnNlSXRlbShlbCwgb3B0aW9ucyk7XG4gIGlmIChpdGVtLmlzSW1hZ2UpIHtcbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nLXRlbXBsYXRlLXN2ZycsIGVsLmdldEF0dHJpYnV0ZSgnc3Jjc2V0JykpO1xuICAgIH1cblxuICAgIGxvYWRJbWFnZShpdGVtKTtcbiAgfVxufVxuXG4vKipcbiAqIFByZXBhcmUgYW4gZWxlbWVudCB0byBiZSBkaXNwbGF5ZWQgb24gdGhlIHNjcmVlbi5cbiAqXG4gKiBJbWFnZXMgaGF2ZSBzcGVjaWFsIGxvZ2ljIGFwcGxpZWQgdG8gdGhlbSB0byBzd2FwIG91dCB0aGUgZGlmZmVyZW50IHNvdXJjZXMuXG4gKlxuICogQGZpcmVzIHJpbWc6ZW50ZXJcbiAqICAgICAgICBUaGUgZWxlbWVudCBpcyBlbnRlcmluZyB0aGUgdmlld3BvcnQuXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqL1xuZnVuY3Rpb24gdXBkYXRlKGVsLCBvcHRpb25zKSB7XG4gIGlmICghZWwpIHJldHVybjtcbiAgdHJpZ2dlcihlbCwgJ3JpbWc6dXBkYXRlJyk7XG5cbiAgdmFyIGl0ZW0gPSBwYXJzZUl0ZW0oZWwsIG9wdGlvbnMpO1xuXG4gIGlmIChpdGVtLmlzSW1hZ2UpIHtcbiAgICBpZiAoIWl0ZW0uaXNCYWNrZ3JvdW5kSW1hZ2UpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1yaW1nJywgJ2xhenknKTtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnc3Jjc2V0JywgZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXJpbWctdGVtcGxhdGUtc3ZnJykpO1xuICAgIH1cblxuICAgIGxvYWRJbWFnZShpdGVtKTtcbiAgfVxufVxuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFNpemVcbiAqIEBwcm9wZXJ0eSB7TnVtYmVyfSB3aWR0aFxuICogQHByb3BlcnR5IHtOdW1iZXJ9IGhlaWdodFxuICovXG5cbi8qKlxuICogQSBmdW5jdGlvbiB0byB0dXJuIGEgdGVtcGxhdGUgc3RyaW5nIGludG8gYSBVUkwuXG4gKlxuICogQGNhbGxiYWNrIFRlbXBsYXRlUmVuZGVyZXJcbiAqIEBwYXJhbSB7U3RyaW5nfSB0ZW1wbGF0ZVxuICogQHBhcmFtIHtTaXplfSBzaXplXG4gKiBAcmV0dXJucyB7U3RyaW5nfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gU2V0dGluZ3NcbiAqXG4gKiBAcHJvcGVydHkge1N0cmluZ30gW3RlbXBsYXRlXVxuICogICAgICAgICAgIEEgdGVtcGxhdGUgc3RyaW5nIHVzZWQgdG8gZ2VuZXJhdGUgVVJMcyBmb3IgYW4gaW1hZ2UuIFRoaXMgYWxsb3dzIHVzIHRvXG4gKiAgICAgICAgICAgZHluYW1pY2FsbHkgbG9hZCBpbWFnZXMgd2l0aCBzaXplcyB0byBtYXRjaCB0aGUgY29udGFpbmVyJ3Mgc2l6ZS5cbiAqXG4gKiBAcHJvcGVydHkge1RlbXBsYXRlUmVuZGVyZXJ9IFt0ZW1wbGF0ZVJlbmRlcl1cbiAqICAgICAgICAgICBBIGZ1bmN0aW9uIHRvIHR1cm4gYSB0ZW1wbGF0ZSBzdHJpbmcgaW50byBhIFVSTC5cbiAqXG4gKiBAcHJvcGVydHkge1NpemV9IFttYXhdXG4gKiAgICAgICAgICAgVGhlIG1heGltdW0gYXZhaWxhYmxlIHNpemUgZm9yIHRoZSBpbWFnZS4gVGhpcyBlbnN1cmVzIHdlIGRvbid0XG4gKiAgICAgICAgICAgdHJ5IHRvIGxvYWQgYW4gaW1hZ2UgbGFyZ2VyIHRoYW4gaXMgcG9zc2libGUuXG4gKlxuICogQHByb3BlcnR5IHtOdW1iZXJ9IFtyb3VuZF1cbiAqICAgICAgICAgICBSb3VuZCBpbWFnZSBkaW1lbnNpb25zIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlLiBUaGlzIGlzIGludGVuZGVkIHRvXG4gKiAgICAgICAgICAgdGF4IHRoZSBpbWFnZSBzZXJ2ZXIgbGVzcyBieSBsb3dlcmluZyB0aGUgbnVtYmVyIG9mIHBvc3NpYmxlIGltYWdlXG4gKiAgICAgICAgICAgc2l6ZXMgcmVxdWVzdGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7U2l6ZX0gW3BsYWNlaG9sZGVyXVxuICogICAgICAgICAgIFRoZSBzaXplIG9mIHRoZSBsby1maSBpbWFnZSB0byBsb2FkIGJlZm9yZSB0aGUgZnVsbCBpbWFnZS5cbiAqL1xuXG4vKipcbiAqIEluaXRpYWxpemUgdGhlIHJlc3BvbnNpdmUgaW1hZ2UgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAqICAgICAgICBUaGUgQ1NTIHNlbGVjdG9yLCBlbGVtZW50LCBvciBlbGVtZW50cyB0byB0cmFjayBmb3IgbGF6eS1sb2FkaW5nLlxuICpcbiAqIEBwYXJhbSB7U2V0dGluZ3N9IG9wdGlvbnNcbiAqXG4gKiBAcmV0dXJucyB7UHVibGljQXBpfVxuICovXG5mdW5jdGlvbiByaW1nKCkge1xuICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nPVwibGF6eVwiXSc7XG4gIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcblxuICAvLyBJbnRlcnNlY3Rpb25zXG4gIHZhciBpbyA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihmdW5jdGlvbiAoZW50cmllcykge1xuICAgIGVudHJpZXMuZm9yRWFjaChmdW5jdGlvbiAoZW50cnkpIHtcbiAgICAgIGlmIChlbnRyeS5pc0ludGVyc2VjdGluZyB8fCBlbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApIHtcbiAgICAgICAgaW8udW5vYnNlcnZlKGVudHJ5LnRhcmdldCk7XG4gICAgICAgIGxvYWQoZW50cnkudGFyZ2V0LCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSwge1xuICAgIC8vIFdhdGNoIHRoZSB2aWV3cG9ydCwgd2l0aCAyMCUgdmVydGljYWwgbWFyZ2luc1xuICAgIHJvb3RNYXJnaW46ICcyMCUgMHB4J1xuICB9KTtcblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gUHVibGljQXBpXG4gICAqL1xuICB2YXIgYXBpID0ge1xuICAgIC8qKlxuICAgICAqIFRyYWNrIGEgbmV3IHNlbGVjdG9yLCBlbGVtZW50LCBvciBub2RlbGlzdCBmb3IgbGF6eS1sb2FkaW5nLlxuICAgICAqIEB0eXBlIEZ1bmN0aW9uXG4gICAgICogQHBhcmFtIHtTdHJpbmd8SFRNTEVsZW1lbnR8Tm9kZUxpc3R9IHNlbGVjdG9yXG4gICAgICovXG4gICAgdHJhY2s6IGZ1bmN0aW9uIHRyYWNrKCkge1xuICAgICAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZz1cImxhenlcIl0nO1xuXG4gICAgICB2YXIgZWxzID0gcXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpby5vYnNlcnZlKGVsc1tpXSk7XG4gICAgICB9XG4gICAgfSxcbiAgICB1cGRhdGU6IGZ1bmN0aW9uIHVwZGF0ZSQkMSgpIHtcbiAgICAgIHZhciBzZWxlY3RvciA9IGFyZ3VtZW50cy5sZW5ndGggPiAwICYmIGFyZ3VtZW50c1swXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzBdIDogJ1tkYXRhLXJpbWc9XCJsb2FkZWRcIl0nO1xuXG4gICAgICB2YXIgZWxzID0gcXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVscy5sZW5ndGg7IGkrKykge1xuICAgICAgICB1cGRhdGUoZWxzW2ldLCBvcHRpb25zKTtcbiAgICAgIH1cbiAgICB9LFxuXG5cbiAgICAvKipcbiAgICAgKiBTdG9wIHRyYWNraW5nIGVsZW1lbnQocykgZm9yIGxhenktbG9hZGluZy5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqIEBwYXJhbSB7U3RyaW5nfEhUTUxFbGVtZW50fE5vZGVMaXN0fSBzZWxlY3RvclxuICAgICAqL1xuICAgIHVudHJhY2s6IGZ1bmN0aW9uIHVudHJhY2soKSB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBhcmd1bWVudHMubGVuZ3RoID4gMCAmJiBhcmd1bWVudHNbMF0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1swXSA6ICdbZGF0YS1yaW1nXSc7XG5cbiAgICAgIHZhciBlbHMgPSBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlvLnVub2JzZXJ2ZShlbHNbaV0pO1xuICAgICAgfVxuICAgIH0sXG5cblxuICAgIC8qKlxuICAgICAqIFVubG9hZCBhbGwgZXZlbnQgaGFuZGxlcnMgYW5kIG9ic2VydmVycy5cbiAgICAgKiBAdHlwZSBGdW5jdGlvblxuICAgICAqL1xuICAgIHVubG9hZDogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgaW8uZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfTtcblxuICAvLyBBZGQgaW5pdGlhbCBlbGVtZW50c1xuICBhcGkudHJhY2soc2VsZWN0b3IpO1xuXG4gIHJldHVybiBhcGk7XG59XG5cbi8qKlxuICogRmluZHMgYSBncm91cCBvZiBlbGVtZW50cyBvbiB0aGUgcGFnZS5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ3xIVE1MRWxlbWVudHxOb2RlTGlzdH0gc2VsZWN0b3JcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIGFycmF5LWxpa2Ugb2JqZWN0LlxuICovXG5mdW5jdGlvbiBxdWVyeVNlbGVjdG9yKHNlbGVjdG9yKSB7XG4gIGlmICh0eXBlb2Ygc2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICB9XG5cbiAgaWYgKHNlbGVjdG9yIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHtcbiAgICByZXR1cm4gW3NlbGVjdG9yXTtcbiAgfVxuXG4gIGlmIChzZWxlY3RvciBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG5cbiAgcmV0dXJuIFtdO1xufVxuXG5leHBvcnQgZGVmYXVsdCByaW1nO1xuIiwiLyohXG4gKiByaW1nLXNob3BpZnkgdjIuMi4wXG4gKiAoYykgMjAxOCBQaXhlbCBVbmlvblxuICovXG5pbXBvcnQgcmltZyBmcm9tICdyaW1nJztcblxuLyoqXG4gKiBQb2x5ZmlsbCBmb3IgRWxlbWVudC5tYXRjaGVzKCkuXG4gKlxuICogQHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9tYXRjaGVzXG4gKi9cbmlmICghRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuICBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLm1vek1hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS5tc01hdGNoZXNTZWxlY3RvciB8fCBFbGVtZW50LnByb3RvdHlwZS5vTWF0Y2hlc1NlbGVjdG9yIHx8IEVsZW1lbnQucHJvdG90eXBlLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fCBmdW5jdGlvbiAocykge1xuICAgIHZhciBtYXRjaGVzID0gKHRoaXMuZG9jdW1lbnQgfHwgdGhpcy5vd25lckRvY3VtZW50KS5xdWVyeVNlbGVjdG9yQWxsKHMpLFxuICAgICAgICBpID0gbWF0Y2hlcy5sZW5ndGg7XG4gICAgd2hpbGUgKC0taSA+PSAwICYmIG1hdGNoZXMuaXRlbShpKSAhPT0gdGhpcykge31cbiAgICByZXR1cm4gaSA+IC0xO1xuICB9O1xufVxuXG52YXIgc3RhdGUgPSB7XG4gIGluaXQ6IGluaXQsXG4gIHdhdGNoOiB3YXRjaCxcbiAgdW53YXRjaDogdW53YXRjaFxufTtcblxuZnVuY3Rpb24gaW5pdCgpIHtcbiAgdmFyIHNlbGVjdG9yID0gYXJndW1lbnRzLmxlbmd0aCA+IDAgJiYgYXJndW1lbnRzWzBdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMF0gOiAnW2RhdGEtcmltZz1cImxhenlcIl0nO1xuICB2YXIgb3B0aW9ucyA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDoge307XG5cbiAgc3RhdGUuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgc3RhdGUuaW5zdGFuY2UgPSByaW1nKHNlbGVjdG9yLCBvcHRpb25zKTtcbiAgc3RhdGUubG9hZGVkV2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuXG4gIC8vIExpc3RlbiBmb3IgU2hvcGlmeSB0aGVtZSBlZGl0b3IgZXZlbnRzXG4gIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pO1xuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIF91cGRhdGUoKTtcbiAgfSk7XG5cbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnVubG9hZCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiB1bndhdGNoKGV2ZW50LnRhcmdldCk7XG4gIH0pO1xuXG4gIC8vIExpc3RlbiBmb3IgY3VzdG9tIGV2ZW50cyB0byBhbGxvdyB0aGVtZXMgdG8gaG9vayBpbnRvIHJpbWdcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndGhlbWU6cmltZzp3YXRjaCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIHJldHVybiB3YXRjaChldmVudC50YXJnZXQpO1xuICB9KTtcblxuICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0aGVtZTpyaW1nOnVud2F0Y2gnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICByZXR1cm4gdW53YXRjaChldmVudC50YXJnZXQpO1xuICB9KTtcblxuICAvLyBTdXBwb3J0IGN1c3RvbSBldmVudHMgdHJpZ2dlcmVkIHRocm91Z2ggalF1ZXJ5XG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvaXNzdWVzLzMzNDdcbiAgaWYgKHdpbmRvdy5qUXVlcnkpIHtcbiAgICBqUXVlcnkoZG9jdW1lbnQpLm9uKHtcbiAgICAgICd0aGVtZTpyaW1nOndhdGNoJzogZnVuY3Rpb24gdGhlbWVSaW1nV2F0Y2goZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHdhdGNoKGV2ZW50LnRhcmdldCk7XG4gICAgICB9LFxuICAgICAgJ3RoZW1lOnJpbWc6dW53YXRjaCc6IGZ1bmN0aW9uIHRoZW1lUmltZ1Vud2F0Y2goZXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIHVud2F0Y2goZXZlbnQudGFyZ2V0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrIGFuIGVsZW1lbnQsIGFuZCBpdHMgY2hpbGRyZW4uXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxcbiAqL1xuZnVuY3Rpb24gd2F0Y2goZWwpIHtcbiAgLy8gVHJhY2sgZWxlbWVudFxuICBpZiAodHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2hlcyhzdGF0ZS5zZWxlY3RvcikpIHtcbiAgICBzdGF0ZS5pbnN0YW5jZS50cmFjayhlbCk7XG4gIH1cblxuICAvLyBUcmFjayBlbGVtZW50J3MgY2hpbGRyZW5cbiAgc3RhdGUuaW5zdGFuY2UudHJhY2soZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpO1xufVxuXG4vKipcbiAqIFVudHJhY2sgYW4gZWxlbWVudCwgYW5kIGl0cyBjaGlsZHJlblxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKiBAcHJpdmF0ZVxuICovXG5mdW5jdGlvbiB1bndhdGNoKGVsKSB7XG4gIC8vIFVudHJhY2sgZWxlbWVudCdzIGNoaWxkcmVuXG4gIHN0YXRlLmluc3RhbmNlLnVudHJhY2soZWwucXVlcnlTZWxlY3RvckFsbChzdGF0ZS5zZWxlY3RvcikpO1xuXG4gIC8vIFVudHJhY2sgZWxlbWVudFxuICBpZiAodHlwZW9mIGVsLm1hdGNoZXMgPT09ICdmdW5jdGlvbicgJiYgZWwubWF0Y2hlcyhzdGF0ZS5zZWxlY3RvcikpIHtcbiAgICBzdGF0ZS5pbnN0YW5jZS51bnRyYWNrKGVsKTtcbiAgfVxufVxuXG4vKipcbiAqIFVwZGF0ZSBhbiBlbGVtZW50LCBhbmQgaXRzIGNoaWxkcmVuLlxuICpcbiAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsXG4gKi9cbmZ1bmN0aW9uIF91cGRhdGUoKSB7XG4gIHZhciBjdXJyZW50V2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApO1xuXG4gIC8vIFJldHVybiBpZiB3ZSdyZSBub3QgMnggc21hbGxlciwgb3IgbGFyZ2VyIHRoYW4gdGhlIGV4aXN0aW5nIGxvYWRpbmcgc2l6ZVxuICBpZiAoY3VycmVudFdpZHRoIC8gc3RhdGUubG9hZGVkV2lkdGggPiAwLjUgJiYgY3VycmVudFdpZHRoIC8gc3RhdGUubG9hZGVkV2lkdGggPCAyKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc3RhdGUubG9hZGVkV2lkdGggPSBjdXJyZW50V2lkdGg7XG4gIHN0YXRlLmluc3RhbmNlLnVwZGF0ZSgpO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdGF0ZTtcbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFF1YW50aXR5IHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICB0aGlzLiRlbCA9ICQoZWwpO1xuICAgIHRoaXMuJGlucHV0UGFyZW50ID0gdGhpcy4kZWwuZmluZCgnLmZvcm0tZmllbGQtLXF0eS1pbnB1dCcpO1xuICAgIHRoaXMuJGlucHV0ID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcXVhbnRpdHktaW5wdXRdJyk7XG4gICAgdGhpcy4kc2VsZWN0UGFyZW50ID0gdGhpcy4kZWwuZmluZCgnLmZvcm0tZmllbGQtLXF0eS1zZWxlY3QnKTtcbiAgICB0aGlzLiRzZWxlY3QgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1xdWFudGl0eS1zZWxlY3RdJyk7XG5cbiAgICB0aGlzLl93YXRjaFNlbGVjdCA9IHRoaXMuX3dhdGNoU2VsZWN0LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fd2F0Y2hJbnB1dCA9IHRoaXMuX3dhdGNoSW5wdXQuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuJHNlbGVjdC5vbignY2hhbmdlLnF1YW50aXR5JywgdGhpcy5fd2F0Y2hTZWxlY3QpO1xuICAgIHRoaXMuJGlucHV0Lm9uKCdjaGFuZ2UucXVhbnRpdHknLCB0aGlzLl93YXRjaElucHV0KTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLiRlbC5vZmYoJy5xdWFudGl0eScpO1xuICB9XG5cbiAgX3ZhbGlkYXRlVmFsdWUoZXZlbnQpIHtcbiAgICBjb25zdCBiYXNlVmFsdWUgPSBwYXJzZUludChldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlLCAxMCk7XG5cbiAgICByZXR1cm4gaXNOYU4oYmFzZVZhbHVlKSA/IDEgOiBiYXNlVmFsdWU7XG4gIH1cblxuICBfd2F0Y2hTZWxlY3QoZXZlbnQpIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX3ZhbGlkYXRlVmFsdWUoZXZlbnQpO1xuXG4gICAgLy8gVXBkYXRlIGlucHV0IHRvIG1hdGNoIHNlbGVjdFxuICAgIHRoaXMuJGlucHV0LnZhbCh2YWx1ZSkudHJpZ2dlcignY2hhbmdlJyk7XG5cbiAgICAvLyBTd2l0Y2ggdG8gcXVhbnRpdHkgaW5wdXQgd2hlbiAxMCBvciBtb3JlXG4gICAgaWYgKHZhbHVlID49IDEwKSB7XG4gICAgICB0aGlzLiRpbnB1dFBhcmVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2hpZGRlbicpXG4gICAgICAgIC5hZGRDbGFzcygndmlzaWJsZScpO1xuXG4gICAgICB0aGlzLiRpbnB1dFxuICAgICAgICAuZm9jdXMoKVxuICAgICAgICAucmVtb3ZlQXR0cigndGFiaW5kZXgnKVxuICAgICAgICAuc2VsZWN0KCk7XG5cbiAgICAgIHRoaXMuJHNlbGVjdFBhcmVudFxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKVxuICAgICAgICAuYWRkQ2xhc3MoJ2hpZGRlbicpO1xuXG4gICAgICB0aGlzLiRzZWxlY3QuYXR0cigndGFiaW5kZXgnLCAnLTEnKTtcbiAgICB9XG4gIH1cblxuICBfd2F0Y2hJbnB1dChldmVudCkge1xuICAgIHRoaXMuJGlucHV0LnZhbCh0aGlzLl92YWxpZGF0ZVZhbHVlKGV2ZW50KSk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgUXVhbnRpdHkgZnJvbSAnLi9oZWxwZXJzL1F1YW50aXR5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRm9ybXMge1xuICBjb25zdHJ1Y3RvcigkZWwsIHNlbGVjdG9yID0gJy5mb3JtLWZpZWxkLWlucHV0Jykge1xuICAgIHRoaXMuJGVsID0gJGVsO1xuICAgIHRoaXMuZmlsbGVkQ2xhc3MgPSAnZm9ybS1maWVsZC1maWxsZWQnO1xuICAgIHRoaXMuZmllbGRTZWxlY3RvciA9IHNlbGVjdG9yO1xuXG4gICAgdGhpcy5xdWFudGl0eUl0ZW1zID0gW107XG4gICAgdGhpcy4kcXVhbnRpdHlXcmFwcGVyID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcXVhbnRpdHktd3JhcHBlcl0nKTtcblxuICAgIHRoaXMuX3RvZ2dsZUZpbGxlZCA9IHRoaXMuX3RvZ2dsZUZpbGxlZC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuJGVsLm9uKCdmb2N1cy5mb3JtcycsIHRoaXMuZmllbGRTZWxlY3RvciwgdGhpcy5fdG9nZ2xlRmlsbGVkKTtcbiAgICB0aGlzLiRlbC5vbignYmx1ci5mb3JtcycsIHRoaXMuZmllbGRTZWxlY3RvciwgdGhpcy5fdG9nZ2xlRmlsbGVkKTtcblxuICAgIHRoaXMuX2NoZWNrRmlsbGVkKCk7XG5cbiAgICBpZiAodGhpcy4kcXVhbnRpdHlXcmFwcGVyLmxlbmd0aCkge1xuICAgICAgdGhpcy4kcXVhbnRpdHlXcmFwcGVyLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICAgIHRoaXMucXVhbnRpdHlJdGVtcy5wdXNoKFxuICAgICAgICAgIG5ldyBRdWFudGl0eShlbClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLiRlbC5vZmYoJy5mb3JtcycpO1xuXG4gICAgdGhpcy5xdWFudGl0eUl0ZW1zLmZvckVhY2goKHF1YW50aXR5SXRlbSkgPT4ge1xuICAgICAgcXVhbnRpdHlJdGVtLnVubG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2NoZWNrRmlsbGVkKCkge1xuICAgIHRoaXMuJGVsLmZpbmQodGhpcy5maWVsZFNlbGVjdG9yKS5lYWNoKChpLCBlbCkgPT4ge1xuICAgICAgaWYgKCQoZWwpLmhhc0NsYXNzKHRoaXMuZmlsbGVkQ2xhc3MpKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX3RvZ2dsZUZpbGxlZChudWxsLCBlbCk7XG4gICAgfSk7XG4gIH1cblxuICBfdG9nZ2xlRmlsbGVkKGV2ZW50ID0gbnVsbCwgZWwgPSBmYWxzZSkge1xuICAgIGNvbnN0ICRlbCA9IGV2ZW50ID8gJChldmVudC5jdXJyZW50VGFyZ2V0KSA6ICQoZWwpO1xuICAgIGNvbnN0IHZhbHVlID0gJGVsLnZhbCgpO1xuXG4gICAgY29uc3QgaXNGaWxsZWQgPSB2YWx1ZSAmJiB2YWx1ZS5sZW5ndGggPiAwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgJGVsLnRvZ2dsZUNsYXNzKHRoaXMuZmlsbGVkQ2xhc3MsIGlzRmlsbGVkKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuaW1wb3J0IEZvcm1zIGZyb20gJy4uL0Zvcm1zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQWNjb3VudCB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuJGFjY291bnRDb250ZW50cyA9ICQoJ1tkYXRhLXRlbXBsYXRlLWFjY291bnRdJyk7XG4gICAgdGhpcy4kbG9naW5Db250ZW50ID0gJCgnW2RhdGEtdGVtcGxhdGUtYWNjb3VudC1sb2dpbl0nKTtcbiAgICB0aGlzLiRhZGRyZXNzZXNDb250ZW50ID0gJCgnW2RhdGEtdGVtcGxhdGUtYWNjb3VudC1hZGRyZXNzZXNdJyk7XG4gICAgdGhpcy4kYWRkcmVzc0J1dHRvbkZvY3VzID0gbnVsbDtcblxuICAgIHRoaXMuX2xvZ2luVG9nZ2xlID0gdGhpcy5fbG9naW5Ub2dnbGUuYmluZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLiRsb2dpbkNvbnRlbnQubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9pbml0TG9naW5QYWdlKCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuJGFkZHJlc3Nlc0NvbnRlbnQubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9pbml0QWRkcmVzc1BhZ2UoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4kYWNjb3VudENvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgdGhpcy5faW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9pbml0KCkge1xuICAgIG5ldyBGb3Jtcyh0aGlzLiRhY2NvdW50Q29udGVudHMpO1xuICB9XG5cbiAgX2luaXRMb2dpblBhZ2UoKSB7XG4gICAgdGhpcy4kbG9naW5Ub2dnbGUgPSB0aGlzLiRsb2dpbkNvbnRlbnQuZmluZCgnW2RhdGEtbG9naW4tdG9nZ2xlXScpO1xuICAgIHRoaXMuJGxvZ2luID0gdGhpcy4kbG9naW5Db250ZW50LmZpbmQoJ1tkYXRhLWFjY291bnQtbG9naW4tbWFpbl0nKTtcbiAgICB0aGlzLiRyZWNvdmVyeSA9IHRoaXMuJGxvZ2luQ29udGVudC5maW5kKCdbZGF0YS1hY2NvdW50LWxvZ2luLXJlY292ZXJ5XScpO1xuICAgIHRoaXMuJHJlY292ZXJ5SGFzTWVzc2FnZSA9IHRoaXMuJHJlY292ZXJ5LmZpbmQoJ1tkYXRhLXJlY292ZXJ5LWhhcy1tZXNzYWdlXScpO1xuXG4gICAgdGhpcy4kbG9naW5Ub2dnbGUub24oJ2NsaWNrJywgdGhpcy5fbG9naW5Ub2dnbGUpO1xuXG4gICAgaWYgKHRoaXMuJHJlY292ZXJ5SGFzTWVzc2FnZS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuX2xvZ2luVG9nZ2xlKCk7XG4gICAgfVxuICB9XG5cbiAgX2xvZ2luVG9nZ2xlKGV2ZW50ID0gbnVsbCkge1xuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLiRsb2dpbi50b2dnbGVDbGFzcygndmlzaWJsZScpO1xuICAgIHRoaXMuJHJlY292ZXJ5LnRvZ2dsZUNsYXNzKCd2aXNpYmxlJyk7XG4gIH1cblxuICBfaW5pdEFkZHJlc3NQYWdlKCkge1xuICAgIGNvbnN0ICRjdXN0b21lckFkZHJlc3NlcyA9IHRoaXMuJGFkZHJlc3Nlc0NvbnRlbnQuZmluZCgnW2RhdGEtYWRkcmVzcy1pZF0nKTtcblxuICAgIHRoaXMuJGFkZHJlc3Nlc0NvbnRlbnQub24oJ2NsaWNrJywgJ1tkYXRhLWVkaXQtYWRkcmVzc10nLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgICAgY29uc3QgaXRlbUlkID0gJHRhcmdldC5hdHRyKCdkYXRhLWVkaXQtYWRkcmVzcycpO1xuXG4gICAgICAkY3VzdG9tZXJBZGRyZXNzZXMucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTtcbiAgICAgIHRoaXMuJGFkZHJlc3NCdXR0b25Gb2N1cyA9ICR0YXJnZXQ7XG5cbiAgICAgICQoYFtkYXRhLWFkZHJlc3MtaWQ9XCIke2l0ZW1JZH1cIl1gKVxuICAgICAgICAuYWRkQ2xhc3MoJ3Zpc2libGUnKVxuICAgICAgICAuZmluZCgnLmZvcm0tZmllbGQtaW5wdXQnKVxuICAgICAgICAuZXEoMClcbiAgICAgICAgLmZvY3VzKCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRhZGRyZXNzZXNDb250ZW50Lm9uKCdjbGljaycsICdbZGF0YS1lZGl0LWFkZHJlc3MtY2FuY2VsXScsICgpID0+IHtcbiAgICAgICRjdXN0b21lckFkZHJlc3Nlcy5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICAgICAgJCgnW2RhdGEtYWRkcmVzcy1pZD1cIm5ld1wiXScpLmFkZENsYXNzKCd2aXNpYmxlJyk7XG5cbiAgICAgIC8vIFJldHVybiBmb2N1cyB0byBsYXN0IHVzZWQgYnV0dG9uXG4gICAgICB0aGlzLiRhZGRyZXNzQnV0dG9uRm9jdXMuZm9jdXMoKTtcbiAgICAgIHRoaXMuJGFkZHJlc3NCdXR0b25Gb2N1cyA9IG51bGw7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRhZGRyZXNzZXNDb250ZW50Lm9uKCdjbGljaycsICdbZGF0YS1kZWxldGUtYWRkcmVzc10nLCAoZXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IGl0ZW1JZCA9ICQoZXZlbnQudGFyZ2V0KS5hdHRyKCdkYXRhLWRlbGV0ZS1hZGRyZXNzJyk7XG4gICAgICBTaG9waWZ5LkN1c3RvbWVyQWRkcmVzcy5kZXN0cm95KGl0ZW1JZCwgJycpO1xuICAgIH0pO1xuXG4gICAgJGN1c3RvbWVyQWRkcmVzc2VzLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICBjb25zdCBpZCA9ICQoZWwpLmF0dHIoJ2RhdGEtYWRkcmVzcy1pZCcpO1xuXG4gICAgICBjb25zdCBjb3VudHJ5RWwgPSBgY3VzdG9tZXJfYWRkcl8ke2lkfV9jb3VudHJ5YDtcbiAgICAgIGNvbnN0IHByb3ZpbmNlRWwgPSBgY3VzdG9tZXJfYWRkcl8ke2lkfV9wcm92aW5jZWA7XG4gICAgICBjb25zdCBvcHRpb25zID0geyBoaWRlRWxlbWVudDogYGFkZHJlc3NfcHJvdmluY2VfY29udGFpbmVyXyR7aWR9YCB9O1xuXG4gICAgICAvLyBJbml0aWF0ZSBwcm92aW5jZXMgZm9yIGFkZHJlc3MgZm9ybXNcbiAgICAgIG5ldyBTaG9waWZ5LkNvdW50cnlQcm92aW5jZVNlbGVjdG9yKGNvdW50cnlFbCwgcHJvdmluY2VFbCwgb3B0aW9ucyk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmltcG9ydCBGb3JtcyBmcm9tICcuLi9Gb3Jtcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENvbnRhY3Qge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLiRjb250YWN0Q29udGVudHMgPSAkKCdbZGF0YS10ZW1wbGF0ZS1jb250YWN0XScpO1xuXG4gICAgaWYgKHRoaXMuJGNvbnRhY3RDb250ZW50cy5sZW5ndGgpIHtcbiAgICAgIG5ldyBGb3Jtcyh0aGlzLiRjb250YWN0Q29udGVudHMpO1xuICAgIH1cbiAgfVxufVxuIiwiXG4ndXNlIHN0cmljdCdcblxudmFyIHNlbGVjdG9ycyA9IFtcblx0J2lmcmFtZVtzcmMqPVwicGxheWVyLnZpbWVvLmNvbVwiXScsXG5cdCdpZnJhbWVbc3JjKj1cInlvdXR1YmUuY29tXCJdJyxcblx0J2lmcmFtZVtzcmMqPVwieW91dHViZS1ub2Nvb2tpZS5jb21cIl0nLFxuXHQnaWZyYW1lW3NyYyo9XCJraWNrc3RhcnRlci5jb21cIl1bc3JjKj1cInZpZGVvLmh0bWxcIl0nLFxuXHQnb2JqZWN0J1xuXVxuXG52YXIgY3NzID0gJy5mbHVpZC13aWR0aC12aWRlby13cmFwcGVye3dpZHRoOjEwMCU7cG9zaXRpb246cmVsYXRpdmU7cGFkZGluZzowO30uZmx1aWQtd2lkdGgtdmlkZW8td3JhcHBlciBpZnJhbWUsLmZsdWlkLXdpZHRoLXZpZGVvLXdyYXBwZXIgb2JqZWN0LC5mbHVpZC13aWR0aC12aWRlby13cmFwcGVyIGVtYmVkIHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTt9J1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChwYXJlbnRTZWxlY3Rvciwgb3B0cykge1xuXHRwYXJlbnRTZWxlY3RvciA9IHBhcmVudFNlbGVjdG9yIHx8ICdib2R5J1xuXHRvcHRzID0gb3B0cyB8fCB7fVxuXG5cdGlmIChpc09iamVjdChwYXJlbnRTZWxlY3RvcikpIHtcblx0XHRvcHRzID0gcGFyZW50U2VsZWN0b3Jcblx0XHRwYXJlbnRTZWxlY3RvciA9ICdib2R5J1xuXHR9XG5cblx0b3B0cy5pZ25vcmUgPSBvcHRzLmlnbm9yZSB8fCAnJ1xuXHRvcHRzLnBsYXllcnMgPSBvcHRzLnBsYXllcnMgfHwgJydcblxuXHR2YXIgY29udGFpbmVycyA9IHF1ZXJ5QWxsKHBhcmVudFNlbGVjdG9yKVxuXHRpZiAoIWhhc0xlbmd0aChjb250YWluZXJzKSkgcmV0dXJuXG5cblx0aWYgKCFkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZml0LXZpZHMtc3R5bGUnKSkge1xuXHRcdHZhciBoZWFkID0gZG9jdW1lbnQuaGVhZCB8fCBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdXG5cdFx0aGVhZC5hcHBlbmRDaGlsZChzdHlsZXMoKSlcblx0fVxuXG5cdHZhciBjdXN0b20gPSB0b1NlbGVjdG9yQXJyYXkob3B0cy5wbGF5ZXJzKSB8fCBbXVxuXHR2YXIgaWdub3JlZCA9IHRvU2VsZWN0b3JBcnJheShvcHRzLmlnbm9yZSkgfHwgW11cblx0dmFyIHNlbGVjdG9yID0gc2VsZWN0b3JzXG5cdFx0LmZpbHRlcihub3RJZ25vcmVkKGlnbm9yZWQpKVxuXHRcdC5jb25jYXQoY3VzdG9tKVxuXHRcdC5qb2luKClcblxuXHRpZiAoIWhhc0xlbmd0aChzZWxlY3RvcikpIHJldHVyblxuXG5cdGNvbnRhaW5lcnMuZm9yRWFjaChmdW5jdGlvbiAoY29udGFpbmVyKSB7XG5cdFx0dmFyIHZpZGVvcyA9IHF1ZXJ5QWxsKGNvbnRhaW5lciwgc2VsZWN0b3IpXG5cdFx0dmlkZW9zLmZvckVhY2goZnVuY3Rpb24gKHZpZGVvKSB7XG5cdFx0XHR3cmFwKHZpZGVvKVxuXHRcdH0pXG5cdH0pXG59XG5cbmZ1bmN0aW9uIHF1ZXJ5QWxsIChlbCwgc2VsZWN0b3IpIHtcblx0aWYgKHR5cGVvZiBlbCA9PT0gJ3N0cmluZycpIHtcblx0XHRzZWxlY3RvciA9IGVsXG5cdFx0ZWwgPSBkb2N1bWVudFxuXHR9XG5cdHJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSlcbn1cblxuZnVuY3Rpb24gdG9TZWxlY3RvckFycmF5IChpbnB1dCkge1xuXHRpZiAodHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJykge1xuXHRcdHJldHVybiBpbnB1dC5zcGxpdCgnLCcpLm1hcCh0cmltKS5maWx0ZXIoaGFzTGVuZ3RoKVxuXHR9IGVsc2UgaWYgKGlzQXJyYXkoaW5wdXQpKSB7XG5cdFx0cmV0dXJuIGZsYXR0ZW4oaW5wdXQubWFwKHRvU2VsZWN0b3JBcnJheSkuZmlsdGVyKGhhc0xlbmd0aCkpXG5cdH1cblx0cmV0dXJuIGlucHV0IHx8IFtdXG59XG5cbmZ1bmN0aW9uIHdyYXAgKGVsKSB7XG5cdGlmICgvZmx1aWQtd2lkdGgtdmlkZW8td3JhcHBlci8udGVzdChlbC5wYXJlbnROb2RlLmNsYXNzTmFtZSkpIHJldHVyblxuXG5cdHZhciB3aWR0aEF0dHIgPSBwYXJzZUludChlbC5nZXRBdHRyaWJ1dGUoJ3dpZHRoJyksIDEwKVxuXHR2YXIgaGVpZ2h0QXR0ciA9IHBhcnNlSW50KGVsLmdldEF0dHJpYnV0ZSgnaGVpZ2h0JyksIDEwKVxuXG5cdHZhciB3aWR0aCA9ICFpc05hTih3aWR0aEF0dHIpID8gd2lkdGhBdHRyIDogZWwuY2xpZW50V2lkdGhcblx0dmFyIGhlaWdodCA9ICFpc05hTihoZWlnaHRBdHRyKSA/IGhlaWdodEF0dHIgOiBlbC5jbGllbnRIZWlnaHRcblx0dmFyIGFzcGVjdCA9IGhlaWdodCAvIHdpZHRoXG5cblx0ZWwucmVtb3ZlQXR0cmlidXRlKCd3aWR0aCcpXG5cdGVsLnJlbW92ZUF0dHJpYnV0ZSgnaGVpZ2h0JylcblxuXHR2YXIgd3JhcHBlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpXG5cdGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHdyYXBwZXIsIGVsKVxuXHR3cmFwcGVyLmNsYXNzTmFtZSA9ICdmbHVpZC13aWR0aC12aWRlby13cmFwcGVyJ1xuXHR3cmFwcGVyLnN0eWxlLnBhZGRpbmdUb3AgPSAoYXNwZWN0ICogMTAwKSArICclJ1xuXHR3cmFwcGVyLmFwcGVuZENoaWxkKGVsKVxufVxuXG5mdW5jdGlvbiBzdHlsZXMgKCkge1xuXHR2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jylcblx0ZGl2LmlubmVySFRNTCA9ICc8cD54PC9wPjxzdHlsZSBpZD1cImZpdC12aWRzLXN0eWxlXCI+JyArIGNzcyArICc8L3N0eWxlPidcblx0cmV0dXJuIGRpdi5jaGlsZE5vZGVzWzFdXG59XG5cbmZ1bmN0aW9uIG5vdElnbm9yZWQgKGlnbm9yZWQpIHtcblx0aWYgKGlnbm9yZWQubGVuZ3RoIDwgMSkge1xuXHRcdHJldHVybiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZVxuXHRcdH1cblx0fVxuXHRyZXR1cm4gZnVuY3Rpb24gKHNlbGVjdG9yKSB7XG5cdFx0cmV0dXJuIGlnbm9yZWQuaW5kZXhPZihzZWxlY3RvcikgPT09IC0xXG5cdH1cbn1cblxuZnVuY3Rpb24gaGFzTGVuZ3RoIChpbnB1dCkge1xuXHRyZXR1cm4gaW5wdXQubGVuZ3RoID4gMFxufVxuXG5mdW5jdGlvbiB0cmltIChzdHIpIHtcblx0cmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJylcbn1cblxuZnVuY3Rpb24gZmxhdHRlbiAoaW5wdXQpIHtcblx0cmV0dXJuIFtdLmNvbmNhdC5hcHBseShbXSwgaW5wdXQpXG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0IChpbnB1dCkge1xuXHRyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGlucHV0KSA9PT0gJ1tvYmplY3QgT2JqZWN0XSdcbn1cblxuZnVuY3Rpb24gaXNBcnJheSAoaW5wdXQpIHtcblx0cmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09ICdbb2JqZWN0IEFycmF5XSdcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuLy8gZm9yRWFjaCBtZXRob2QsIGNvdWxkIGJlIHNoaXBwZWQgYXMgcGFydCBvZiBhbiBPYmplY3QgTGl0ZXJhbC9Nb2R1bGVcbmZ1bmN0aW9uIGZvckVhY2goYXJyYXksIGNhbGxiYWNrLCBzY29wZSkge1xuICB2YXIgaW5kZXggPSAwO1xuXG4gIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IGFycmF5Lmxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIGNhbGxiYWNrLmNhbGwoc2NvcGUsIGFycmF5W2luZGV4XSwgaW5kZXgpOyAvLyBwYXNzZXMgYmFjayBzdHVmZiB3ZSBuZWVkXG4gIH1cbn1cblxuZnVuY3Rpb24gaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIGNsYXNzTmFtZSArICd8ICsnICsgY2xhc3NOYW1lLCAnZycpO1xuXG4gIHJldHVybiBlbC5jbGFzc05hbWUubWF0Y2gocmVnZXgpO1xufVxuXG5mdW5jdGlvbiBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKSB7XG4gIC8vIFJldHVybiBpZiBpdCBhbHJlYWR5IGhhcyB0aGUgY2xhc3NOYW1lXG4gIGlmIChoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSkgcmV0dXJuO1xuXG4gIGVsLmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWU7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsLCBjbGFzc05hbWUpIHtcbiAgLy8gUmV0dXJuIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBoYXZlIHRoZSBjbGFzc05hbWVcbiAgaWYgKCFoYXNDbGFzcyhlbCwgY2xhc3NOYW1lKSkgcmV0dXJuO1xuXG4gIHZhciByZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgY2xhc3NOYW1lICsgJ3wgKycgKyBjbGFzc05hbWUsICdnJyk7XG5cbiAgZWwuY2xhc3NOYW1lID0gZWwuY2xhc3NOYW1lLnJlcGxhY2UocmVnZXgsICcnKTtcbn1cblxuZnVuY3Rpb24gdG9nZ2xlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICBpZiAoaGFzQ2xhc3MoZWwsIGNsYXNzTmFtZSkpIHtcbiAgICByZW1vdmVDbGFzcyhlbCwgY2xhc3NOYW1lKTtcbiAgfSBlbHNlIHtcbiAgICBhZGRDbGFzcyhlbCwgY2xhc3NOYW1lKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcihwYWlyaW5ncywgcGFpcmluZ1RyaWdnZXIpIHtcbiAgdmFyIGZvdW5kUGFpcmluZyA9IG51bGw7XG5cbiAgZm9yRWFjaChwYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICBpZiAocGFpcmluZy50cmlnZ2VyID09PSBwYWlyaW5nVHJpZ2dlcikge1xuICAgICAgZm91bmRQYWlyaW5nID0gcGFpcmluZztcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiBmb3VuZFBhaXJpbmc7XG59XG5cbi8qKlxuICogU2VlIHtAbGluayBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3JldmlzaW9ucy8yMTE3NTIzLzExIFN0YWNrIE92ZXJmbG93fVxuICogQW4gUkZDNDEyMiB2NCBjb21wbGlhbnQgdXVpZCBzb2x1dGlvblxuICovXG5mdW5jdGlvbiB1dWlkdjQoKSB7XG4gIHJldHVybiAneHh4eHh4eHgteHh4eC00eHh4LXl4eHgteHh4eHh4eHh4eHh4Jy5yZXBsYWNlKC9beHldL2csIGZ1bmN0aW9uIChjKSB7XG4gICAgdmFyIHIgPSBNYXRoLnJhbmRvbSgpICogMTYgfCAwO1xuICAgIHZhciB2ID0gYyA9PT0gJ3gnID8gciA6IHIgJiAweDMgfCAweDg7XG5cbiAgICByZXR1cm4gdi50b1N0cmluZygxNik7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBpbml0KGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciB0cmlnZ2VycyA9IGdyb3VwZWRDb250ZW50LnRyaWdnZXJzO1xuICB2YXIgcGFpcmluZ3MgPSBncm91cGVkQ29udGVudC5wYWlyaW5ncztcblxuICB0cmlnZ2Vycy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFibGlzdCcpO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nLCBpbmRleCkge1xuICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFiJyk7XG4gICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsIGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnKTtcblxuICAgIGlmIChwYWlyaW5nLnRyaWdnZXIuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgZm9yRWFjaChwYWlyaW5nLnRyaWdnZXIuY2hpbGRyZW4sIGZ1bmN0aW9uIChjaGlsZCkge1xuICAgICAgICBjaGlsZC5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoaGFzQ2xhc3MocGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJykpIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtc2VsZWN0ZWQnLCAndHJ1ZScpO1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgndGFiSW5kZXgnLCAnMCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xuICAgIH1cblxuICAgIHBhaXJpbmcuY29udGVudC5pZCA9IGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnO1xuICAgIHBhaXJpbmcuY29udGVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAndGFicGFuZWwnKTtcblxuICAgIGlmICghaGFzQ2xhc3MocGFpcmluZy5jb250ZW50LCAnYWN0aXZlJykpIHtcbiAgICAgIHBhaXJpbmcuY29udGVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB1cGRhdGUoZ3JvdXBlZENvbnRlbnQpIHtcbiAgdmFyIHBhaXJpbmdzID0gZ3JvdXBlZENvbnRlbnQucGFpcmluZ3M7XG5cbiAgZm9yRWFjaChwYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICBwYWlyaW5nLnRyaWdnZXIucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJyk7XG4gICAgcGFpcmluZy5jb250ZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgIGlmIChoYXNDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICcwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3RhYkluZGV4JywgJy0xJyk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy5jb250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH1cbiAgfSk7XG59XG5cbnZhciBhMTF5ID0ge1xuICBpbml0OiBpbml0LFxuICB1cGRhdGU6IHVwZGF0ZVxufTtcblxudmFyIGFzeW5jR2VuZXJhdG9yID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBBd2FpdFZhbHVlKHZhbHVlKSB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgZnVuY3Rpb24gQXN5bmNHZW5lcmF0b3IoZ2VuKSB7XG4gICAgdmFyIGZyb250LCBiYWNrO1xuXG4gICAgZnVuY3Rpb24gc2VuZChrZXksIGFyZykge1xuICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHJlcXVlc3QgPSB7XG4gICAgICAgICAga2V5OiBrZXksXG4gICAgICAgICAgYXJnOiBhcmcsXG4gICAgICAgICAgcmVzb2x2ZTogcmVzb2x2ZSxcbiAgICAgICAgICByZWplY3Q6IHJlamVjdCxcbiAgICAgICAgICBuZXh0OiBudWxsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGJhY2spIHtcbiAgICAgICAgICBiYWNrID0gYmFjay5uZXh0ID0gcmVxdWVzdDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmcm9udCA9IGJhY2sgPSByZXF1ZXN0O1xuICAgICAgICAgIHJlc3VtZShrZXksIGFyZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlc3VtZShrZXksIGFyZykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IGdlbltrZXldKGFyZyk7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcblxuICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBd2FpdFZhbHVlKSB7XG4gICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlLnZhbHVlKS50aGVuKGZ1bmN0aW9uIChhcmcpIHtcbiAgICAgICAgICAgIHJlc3VtZShcIm5leHRcIiwgYXJnKTtcbiAgICAgICAgICB9LCBmdW5jdGlvbiAoYXJnKSB7XG4gICAgICAgICAgICByZXN1bWUoXCJ0aHJvd1wiLCBhcmcpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldHRsZShyZXN1bHQuZG9uZSA/IFwicmV0dXJuXCIgOiBcIm5vcm1hbFwiLCByZXN1bHQudmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgc2V0dGxlKFwidGhyb3dcIiwgZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXR0bGUodHlwZSwgdmFsdWUpIHtcbiAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICBjYXNlIFwicmV0dXJuXCI6XG4gICAgICAgICAgZnJvbnQucmVzb2x2ZSh7XG4gICAgICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgICAgICBkb25lOiB0cnVlXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSBcInRocm93XCI6XG4gICAgICAgICAgZnJvbnQucmVqZWN0KHZhbHVlKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGZyb250LnJlc29sdmUoe1xuICAgICAgICAgICAgdmFsdWU6IHZhbHVlLFxuICAgICAgICAgICAgZG9uZTogZmFsc2VcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgZnJvbnQgPSBmcm9udC5uZXh0O1xuXG4gICAgICBpZiAoZnJvbnQpIHtcbiAgICAgICAgcmVzdW1lKGZyb250LmtleSwgZnJvbnQuYXJnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJhY2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2ludm9rZSA9IHNlbmQ7XG5cbiAgICBpZiAodHlwZW9mIGdlbi5yZXR1cm4gIT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgdGhpcy5yZXR1cm4gPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuYXN5bmNJdGVyYXRvcikge1xuICAgIEFzeW5jR2VuZXJhdG9yLnByb3RvdHlwZVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9O1xuICB9XG5cbiAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLm5leHQgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcIm5leHRcIiwgYXJnKTtcbiAgfTtcblxuICBBc3luY0dlbmVyYXRvci5wcm90b3R5cGUudGhyb3cgPSBmdW5jdGlvbiAoYXJnKSB7XG4gICAgcmV0dXJuIHRoaXMuX2ludm9rZShcInRocm93XCIsIGFyZyk7XG4gIH07XG5cbiAgQXN5bmNHZW5lcmF0b3IucHJvdG90eXBlLnJldHVybiA9IGZ1bmN0aW9uIChhcmcpIHtcbiAgICByZXR1cm4gdGhpcy5faW52b2tlKFwicmV0dXJuXCIsIGFyZyk7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB3cmFwOiBmdW5jdGlvbiAoZm4pIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgQXN5bmNHZW5lcmF0b3IoZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKSk7XG4gICAgICB9O1xuICAgIH0sXG4gICAgYXdhaXQ6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgcmV0dXJuIG5ldyBBd2FpdFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gIH07XG59KCk7XG5cblxuXG5cblxudmFyIGNsYXNzQ2FsbENoZWNrID0gZnVuY3Rpb24gKGluc3RhbmNlLCBDb25zdHJ1Y3Rvcikge1xuICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDYW5ub3QgY2FsbCBhIGNsYXNzIGFzIGEgZnVuY3Rpb25cIik7XG4gIH1cbn07XG5cbnZhciBjcmVhdGVDbGFzcyA9IGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyh0YXJnZXQsIHByb3BzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGRlc2NyaXB0b3IgPSBwcm9wc1tpXTtcbiAgICAgIGRlc2NyaXB0b3IuZW51bWVyYWJsZSA9IGRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCBmYWxzZTtcbiAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgIGlmIChcInZhbHVlXCIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7XG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgcHJvdG9Qcm9wcywgc3RhdGljUHJvcHMpIHtcbiAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgIGlmIChzdGF0aWNQcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvciwgc3RhdGljUHJvcHMpO1xuICAgIHJldHVybiBDb25zdHJ1Y3RvcjtcbiAgfTtcbn0oKTtcblxuLyoqIEEgY2xhc3MgZm9yIGNyZWF0aW5nLCBtYW5hZ2luZywgYW5kIGRlc3Ryb3lpbmcgZ3JvdXBhYmxlIGNvbnRlbnQgYXMgdGFicy4gKi9cblxudmFyIFRhYnNMYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIFRhYnNMYXlvdXQoZ3JvdXBlZENvbnRlbnQpIHtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBUYWJzTGF5b3V0KTtcblxuICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQgPSBncm91cGVkQ29udGVudDtcbiAgICB0aGlzLnBhaXJpbmdzID0gZ3JvdXBlZENvbnRlbnQucGFpcmluZ3M7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuX2hhbmRsZUtleWRvd24gPSB0aGlzLl9oYW5kbGVLZXlkb3duLmJpbmQodGhpcyk7XG4gICAgdGhpcy5faGFuZGxlQ2xpY2sgPSB0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5faW5pdCgpO1xuICAgIGExMXkuaW5pdCh0aGlzLmdyb3VwZWRDb250ZW50KTtcbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFRhYnNMYXlvdXQsIFt7XG4gICAga2V5OiAndW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBldmVudC5mbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgdmFyIGV4aXN0aW5nQWN0aXZlID0gZmFsc2U7XG5cbiAgICAgIGZvckVhY2godGhpcy5wYWlyaW5ncywgZnVuY3Rpb24gKHBhaXJpbmcpIHtcbiAgICAgICAgdmFyIHRyaWdnZXIgPSBwYWlyaW5nLnRyaWdnZXI7XG5cbiAgICAgICAgaWYgKGhhc0NsYXNzKHRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgICAgIGV4aXN0aW5nQWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIF90aGlzLl9oYW5kbGVLZXlkb3duKTtcbiAgICAgICAgdHJpZ2dlci5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIF90aGlzLl9oYW5kbGVDbGljayk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgdHlwZTogJ2tleWRvd24nLFxuICAgICAgICAgIGZuOiBfdGhpcy5faGFuZGxlS2V5ZG93blxuICAgICAgICB9KTtcblxuICAgICAgICBfdGhpcy5ldmVudHMucHVzaCh7XG4gICAgICAgICAgdHJpZ2dlcjogdHJpZ2dlcixcbiAgICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICAgIGZuOiBfdGhpcy5faGFuZGxlQ2xpY2tcbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgaWYgKCFleGlzdGluZ0FjdGl2ZSkge1xuICAgICAgICBhZGRDbGFzcyh0aGlzLnBhaXJpbmdzWzBdLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgICAgYWRkQ2xhc3ModGhpcy5wYWlyaW5nc1swXS5jb250ZW50LCAnYWN0aXZlJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUtleWRvd24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgdmFyIHBhaXJpbmcgPSBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcih0aGlzLnBhaXJpbmdzLCB0cmlnZ2VyKTtcbiAgICAgIHZhciBwYWlyaW5nSW5kZXggPSB0aGlzLnBhaXJpbmdzLmluZGV4T2YocGFpcmluZyk7XG4gICAgICB2YXIgcHJldkluZGV4ID0gcGFpcmluZ0luZGV4IC0gMSA8IDAgPyB0aGlzLnBhaXJpbmdzLmxlbmd0aCAtIDEgOiBwYWlyaW5nSW5kZXggLSAxO1xuICAgICAgdmFyIG5leHRJbmRleCA9IHBhaXJpbmdJbmRleCArIDEgPj0gdGhpcy5wYWlyaW5ncy5sZW5ndGggPyAwIDogcGFpcmluZ0luZGV4ICsgMTtcblxuICAgICAgdmFyIG5leHRQYWlyaW5nID0gbnVsbDtcblxuICAgICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgICBuZXh0UGFpcmluZyA9IHRoaXMucGFpcmluZ3NbcHJldkluZGV4XTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgbmV4dFBhaXJpbmcgPSB0aGlzLnBhaXJpbmdzW25leHRJbmRleF07XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgbmV4dFBhaXJpbmcgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICAvLyBGYXN0IGV4aXQgaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFiIG9yIHRhYnNcbiAgICAgIGlmIChuZXh0UGFpcmluZyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBmb3JFYWNoKHRoaXMucGFpcmluZ3MsIGZ1bmN0aW9uIChpbmFjdGl2ZVBhaXJpbmcpIHtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoaW5hY3RpdmVQYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgICAgcmVtb3ZlQ2xhc3MoaW5hY3RpdmVQYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKTtcbiAgICAgIH0pO1xuXG4gICAgICBhZGRDbGFzcyhuZXh0UGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJyk7XG4gICAgICBhZGRDbGFzcyhuZXh0UGFpcmluZy5jb250ZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgIG5leHRQYWlyaW5nLnRyaWdnZXIuZm9jdXMoKTtcblxuICAgICAgYTExeS51cGRhdGUodGhpcy5ncm91cGVkQ29udGVudCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUNsaWNrJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2hhbmRsZUNsaWNrKGV2ZW50KSB7XG4gICAgICB2YXIgdHJpZ2dlciA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgICB2YXIgcGFpcmluZyA9IGZpbmRQYWlyaW5nRnJvbVBhaXJpbmdUcmlnZ2VyKHRoaXMucGFpcmluZ3MsIHRyaWdnZXIpO1xuXG4gICAgICAvLyBGYXN0IGV4aXQgaWYgd2UgY2FuJ3QgZmluZCB0aGUgdGFiIG9yIHRhYnNcbiAgICAgIGlmIChwYWlyaW5nID09PSBudWxsKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGZvckVhY2godGhpcy5wYWlyaW5ncywgZnVuY3Rpb24gKGluYWN0aXZlUGFpcmluZykge1xuICAgICAgICByZW1vdmVDbGFzcyhpbmFjdGl2ZVBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpO1xuICAgICAgICByZW1vdmVDbGFzcyhpbmFjdGl2ZVBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpO1xuICAgICAgfSk7XG5cbiAgICAgIGFkZENsYXNzKHBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpO1xuICAgICAgYWRkQ2xhc3MocGFpcmluZy5jb250ZW50LCAnYWN0aXZlJyk7XG5cbiAgICAgIGExMXkudXBkYXRlKHRoaXMuZ3JvdXBlZENvbnRlbnQpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gVGFic0xheW91dDtcbn0oKTtcblxuZnVuY3Rpb24gaW5pdCQxKGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nLCBpbmRleCkge1xuICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAnYnV0dG9uJyk7XG4gICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1jb250cm9scycsIGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnKTtcbiAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICcwJyk7XG5cbiAgICBpZiAocGFpcmluZy50cmlnZ2VyLmNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvckVhY2gocGFpcmluZy50cmlnZ2VyLmNoaWxkcmVuLCBmdW5jdGlvbiAoY2hpbGQpIHtcbiAgICAgICAgY2hpbGQuc2V0QXR0cmlidXRlKCd0YWJJbmRleCcsICctMScpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0NsYXNzKHBhaXJpbmcudHJpZ2dlciwgJ2FjdGl2ZScpKSB7XG4gICAgICBwYWlyaW5nLnRyaWdnZXIuc2V0QXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgIH1cblxuICAgIHBhaXJpbmcuY29udGVudC5pZCA9IGdyb3VwZWRDb250ZW50Lm5hbWVzcGFjZSArICctJyArIGdyb3VwZWRDb250ZW50LmlkICsgJy0nICsgaW5kZXggKyAnLWNvbnRlbnQnO1xuXG4gICAgaWYgKCFoYXNDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy5jb250ZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZSQxKGdyb3VwZWRDb250ZW50KSB7XG4gIHZhciBwYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuXG4gIGZvckVhY2gocGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nKSB7XG4gICAgcGFpcmluZy5jb250ZW50LnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTtcblxuICAgIGlmIChoYXNDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKSkge1xuICAgICAgcGFpcmluZy50cmlnZ2VyLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhaXJpbmcudHJpZ2dlci5zZXRBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICB9XG5cbiAgICBpZiAoIWhhc0NsYXNzKHBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpKSB7XG4gICAgICBwYWlyaW5nLmNvbnRlbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgfVxuICB9KTtcbn1cblxudmFyIGExMXkkMSA9IHtcbiAgaW5pdDogaW5pdCQxLFxuICB1cGRhdGU6IHVwZGF0ZSQxXG59O1xuXG4vKiogQSBjbGFzcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgZGVzdHJveWluZyBncm91cGFibGUgY29udGVudCBhcyBhbiBhY2NvcmRpb24uICovXG5cbnZhciBBY2NvcmRpb25MYXlvdXQgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEFjY29yZGlvbkxheW91dChncm91cGVkQ29udGVudCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEFjY29yZGlvbkxheW91dCk7XG5cbiAgICB0aGlzLmdyb3VwZWRDb250ZW50ID0gZ3JvdXBlZENvbnRlbnQ7XG4gICAgdGhpcy5wYWlyaW5ncyA9IGdyb3VwZWRDb250ZW50LnBhaXJpbmdzO1xuICAgIHRoaXMuZXZlbnRzID0gW107XG5cbiAgICB0aGlzLl9oYW5kbGVLZXlkb3duID0gdGhpcy5faGFuZGxlS2V5ZG93bi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2hhbmRsZUNsaWNrID0gdGhpcy5faGFuZGxlQ2xpY2suYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2luaXQodGhpcy5wYWlyaW5ncyk7XG4gICAgYTExeSQxLmluaXQodGhpcy5ncm91cGVkQ29udGVudCk7XG4gIH1cblxuICBjcmVhdGVDbGFzcyhBY2NvcmRpb25MYXlvdXQsIFt7XG4gICAga2V5OiAndW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gdW5sb2FkKCkge1xuICAgICAgZm9yRWFjaCh0aGlzLmV2ZW50cywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgIGV2ZW50LnRyaWdnZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudC50eXBlLCBldmVudC5mbik7XG4gICAgICB9KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9pbml0KCkge1xuICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgZm9yRWFjaCh0aGlzLnBhaXJpbmdzLCBmdW5jdGlvbiAocGFpcmluZykge1xuICAgICAgICB2YXIgdHJpZ2dlciA9IHBhaXJpbmcudHJpZ2dlcjtcbiAgICAgICAgdmFyIGNvbnRlbnQgPSBwYWlyaW5nLmNvbnRlbnQ7XG5cbiAgICAgICAgdHJpZ2dlci5wYXJlbnROb2RlLmluc2VydEJlZm9yZShjb250ZW50LCB0cmlnZ2VyLm5leHRTaWJsaW5nKTtcblxuICAgICAgICB0cmlnZ2VyLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBfdGhpcy5faGFuZGxlS2V5ZG93bik7XG4gICAgICAgIHRyaWdnZXIuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBfdGhpcy5faGFuZGxlQ2xpY2spO1xuXG4gICAgICAgIF90aGlzLmV2ZW50cy5wdXNoKHtcbiAgICAgICAgICB0cmlnZ2VyOiB0cmlnZ2VyLFxuICAgICAgICAgIHR5cGU6ICdrZXlkb3duJyxcbiAgICAgICAgICBmbjogX3RoaXMuX2hhbmRsZUtleWRvd25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgX3RoaXMuZXZlbnRzLnB1c2goe1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgICBmbjogX3RoaXMuX2hhbmRsZUNsaWNrXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQuY29udGVudHMucmVtb3ZlKCk7XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2hhbmRsZUtleWRvd24nLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlS2V5ZG93bihldmVudCkge1xuICAgICAgdmFyIHRyaWdnZXIgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgICAgdmFyIHBhaXJpbmcgPSBmaW5kUGFpcmluZ0Zyb21QYWlyaW5nVHJpZ2dlcih0aGlzLnBhaXJpbmdzLCB0cmlnZ2VyKTtcblxuICAgICAgLy8gRmFzdCBleGl0IGlmIGVudGVyIGlzbid0IHByZXNzZWQgb3Igd2UgY2FuJ3QgZmluZCB0aGUgZ3JvdXBcbiAgICAgIGlmIChldmVudC5rZXkgIT09ICdFbnRlcicgfHwgcGFpcmluZyA9PT0gbnVsbCkgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICB0b2dnbGVDbGFzcyhwYWlyaW5nLnRyaWdnZXIsICdhY3RpdmUnKTtcbiAgICAgIHRvZ2dsZUNsYXNzKHBhaXJpbmcuY29udGVudCwgJ2FjdGl2ZScpO1xuICAgICAgYTExeSQxLnVwZGF0ZSh0aGlzLmdyb3VwZWRDb250ZW50KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfaGFuZGxlQ2xpY2snLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfaGFuZGxlQ2xpY2soZXZlbnQpIHtcbiAgICAgIHZhciB0cmlnZ2VyID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgIHZhciBwYWlyaW5nID0gZmluZFBhaXJpbmdGcm9tUGFpcmluZ1RyaWdnZXIodGhpcy5wYWlyaW5ncywgdHJpZ2dlcik7XG5cbiAgICAgIC8vIEZhc3QgZXhpdCBpZiB3ZSBjYW4ndCBmaW5kIHRoZSBncm91cFxuICAgICAgaWYgKHBhaXJpbmcgPT09IG51bGwpIHJldHVybjtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgdG9nZ2xlQ2xhc3MocGFpcmluZy50cmlnZ2VyLCAnYWN0aXZlJyk7XG4gICAgICB0b2dnbGVDbGFzcyhwYWlyaW5nLmNvbnRlbnQsICdhY3RpdmUnKTtcbiAgICAgIGExMXkkMS51cGRhdGUodGhpcy5ncm91cGVkQ29udGVudCk7XG4gICAgfVxuICB9XSk7XG4gIHJldHVybiBBY2NvcmRpb25MYXlvdXQ7XG59KCk7XG5cbi8qKlxuICogUmV0dXJucyBhbiBhcnJheSBvZiBub2RlcyByZWxhdGVkIHRvIHRoZSBoZWFkaW5nIG5vZGUuXG4gKiBAcGFyYW0ge25vZGV9IGhlYWRpbmcgLSBUaGUgaGVhZGluZyBub2RlIHRvIHNlYXJjaCBmb3IgY29udGVudCBmcm9tLlxuICogQHJldHVybnMge25vZGVbXX1cbiAqL1xuZnVuY3Rpb24gZ2V0SGVhZGluZ0NvbnRlbnQoaGVhZGluZykge1xuICB2YXIgaGVhZGluZ1RhZ05hbWVzID0gWydIMScsICdIMicsICdIMycsICdINCcsICdINScsICdINiddO1xuICB2YXIgdGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoaGVhZGluZy50YWdOYW1lKTtcbiAgdmFyIGNvbnRlbnQgPSBbXTtcblxuICB2YXIgc2libGluZyA9IGhlYWRpbmcubmV4dEVsZW1lbnRTaWJsaW5nO1xuXG4gIHdoaWxlIChzaWJsaW5nICE9PSBudWxsICYmIChoZWFkaW5nVGFnTmFtZXMuaW5kZXhPZihzaWJsaW5nLnRhZ05hbWUpID09PSAtMSB8fCBoZWFkaW5nVGFnTmFtZXMuaW5kZXhPZihzaWJsaW5nLnRhZ05hbWUpID4gdGFnTmFtZUluZGV4KSkge1xuICAgIGNvbnRlbnQucHVzaChzaWJsaW5nKTtcblxuICAgIHNpYmxpbmcgPSBzaWJsaW5nLm5leHRFbGVtZW50U2libGluZztcbiAgfVxuXG4gIHJldHVybiBjb250ZW50O1xufVxuXG4vKipcbiAqIFJldHVybnMgYW4gb2JqZWN0IGFycmF5IHJlcHJlc2VudGluZyB0aGUgaGVhZGluZyB0cmVlIGZyb20gYSBnaXZlbiBub2RlLlxuICogUm9vdCBub2RlcyBhcmUgZXZhbHVhdGVkIGRpZmZlcmVudGx5LCBhbmQgcmVxdWlyZXMgdGhlIGV2YWx1YXRpbmdSb290IGZsYWdcbiAqIHRvIGJlIHRydWUuXG4gKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIG5vZGUgYmVpbmcgZXZhbHVhdGVkLlxuICogQHBhcmFtIHtub2RlW119IGNoaWxkcmVuIC0gVGhlIGNoaWxkcmVuIG9mIHRoZSBldmFsdWF0ZWQgbm9kZS5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V2YWx1YXRpbmdSb290XSAtIFdoZXRoZXIgdG8gZXZhbHVhdGUgYXMgcm9vdCBub2RlLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBnZXRIZWFkaW5nVHJlZShlbCwgY2hpbGRyZW4pIHtcbiAgdmFyIGV2YWx1YXRpbmdSb290ID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgJiYgYXJndW1lbnRzWzJdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMl0gOiBmYWxzZTtcblxuICB2YXIgaGVhZGluZ1RhZ05hbWVzID0gWydIMScsICdIMicsICdIMycsICdINCcsICdINScsICdINiddO1xuICB2YXIgdGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoZWwudGFnTmFtZSk7XG4gIHZhciBoZWFkaW5ncyA9IFtdO1xuXG4gIHZhciBjdXJyZW50TG93ZXN0VGFnTmFtZUluZGV4ID0gNTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgdmFyIGNoaWxkVGFnTmFtZUluZGV4ID0gaGVhZGluZ1RhZ05hbWVzLmluZGV4T2YoY2hpbGQudGFnTmFtZSk7XG5cbiAgICBpZiAoY2hpbGRUYWdOYW1lSW5kZXggIT09IC0xICYmIGNoaWxkVGFnTmFtZUluZGV4IDwgY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCkge1xuICAgICAgY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCA9IGNoaWxkVGFnTmFtZUluZGV4O1xuICAgIH1cblxuICAgIGlmIChldmFsdWF0aW5nUm9vdCAmJiBjaGlsZFRhZ05hbWVJbmRleCAhPT0gLTEgJiYgY2hpbGRUYWdOYW1lSW5kZXggPD0gY3VycmVudExvd2VzdFRhZ05hbWVJbmRleCB8fCAhZXZhbHVhdGluZ1Jvb3QgJiYgY2hpbGRUYWdOYW1lSW5kZXggIT09IC0xICYmIGNoaWxkVGFnTmFtZUluZGV4ID09PSB0YWdOYW1lSW5kZXggKyAxKSB7XG4gICAgICB2YXIgc2libGluZ3MgPSBnZXRIZWFkaW5nQ29udGVudChjaGlsZCk7XG5cbiAgICAgIHZhciBjaGlsZE5vZGUgPSB7XG4gICAgICAgIGVsOiBjaGlsZCxcbiAgICAgICAgY29udGVudDogc2libGluZ3MsXG4gICAgICAgIGNoaWxkcmVuOiBnZXRIZWFkaW5nVHJlZShjaGlsZCwgc2libGluZ3MpXG4gICAgICB9O1xuXG4gICAgICBoZWFkaW5ncy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGhlYWRpbmdzO1xufVxuXG4vKipcbiAqIFJldHVybnMgZ3JvdXBpbmdzIG9mIGhlYWRpbmdzIHRoYXQgbWVldCB0aGUgbWluaW11bSBzZXF1ZW5jZSB2YWx1ZVxuICogYW5kIGRvbid0IGNvbnRhaW4gYW55IGludmFsaWQgaGVhZGluZ3MuXG4gKiBAcGFyYW0ge09iamVjdFtdfSBoZWFkaW5ncyAtIEFuIGFycmF5IG9mIGhlYWRpbmcgb2JqZWN0cy5cbiAqIEBwYXJhbSB7aW50W119IGludmFsaWRIZWFkaW5ncyAtIEFuIGFycmF5IG9mIGludmFsaWQgaGVhZGluZyBpbnRlZ2VycyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGluZyBpbmRleGVzIG9mIGhlYWRpbmdzLlxuICogQHBhcmFtIHsqfSBtaW5JblNlcXVlbmNlIC0gTWluaW11bSBoZWFkaW5ncyBpbiBzZXF1ZW5jZSBiZWZvcmUgYmVpbmcgY29uc2lkZXJlZFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBncm91cGluZy5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG5mdW5jdGlvbiBnZXRIZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZShoZWFkaW5ncywgaW52YWxpZEhlYWRpbmdzLCBtaW5JblNlcXVlbmNlKSB7XG4gIHZhciBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZSA9IFtdO1xuICB2YXIgY3VycmVudEhlYWRpbmdHcm91cEluU2VxdWVuY2UgPSBbXTtcbiAgdmFyIGN1cnJlbnRTZXF1ZW5jZSA9IDA7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWFkaW5ncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpbnZhbGlkSGVhZGluZ3MuaW5kZXhPZihpKSA9PT0gLTEpIHtcbiAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlLnB1c2goaGVhZGluZ3NbaV0pO1xuICAgICAgY3VycmVudFNlcXVlbmNlICs9IDE7XG5cbiAgICAgIGlmIChpICE9PSBoZWFkaW5ncy5sZW5ndGggLSAxICYmIGhlYWRpbmdzW2ldLmVsLnRhZ05hbWUgIT09IGhlYWRpbmdzW2kgKyAxXS5lbC50YWdOYW1lICYmIGludmFsaWRIZWFkaW5ncy5pbmRleE9mKGkgKyAxKSkge1xuICAgICAgICBjdXJyZW50SGVhZGluZ0dyb3VwSW5TZXF1ZW5jZSA9IFtdO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2UgPSAwO1xuICAgICAgfSBlbHNlIGlmIChpICE9PSAwICYmIGhlYWRpbmdzW2ldLmVsLnRhZ05hbWUgIT09IGhlYWRpbmdzW2kgLSAxXS5lbC50YWdOYW1lKSB7XG4gICAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlLnBvcCgpO1xuICAgICAgICBjdXJyZW50U2VxdWVuY2UgLT0gMTtcblxuICAgICAgICBpZiAoY3VycmVudFNlcXVlbmNlID49IG1pbkluU2VxdWVuY2UpIHtcbiAgICAgICAgICBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZS5wdXNoKGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlID0gW2hlYWRpbmdzW2ldXTtcbiAgICAgICAgY3VycmVudFNlcXVlbmNlID0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoY3VycmVudFNlcXVlbmNlID49IG1pbkluU2VxdWVuY2UpIHtcbiAgICBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZS5wdXNoKGN1cnJlbnRIZWFkaW5nR3JvdXBJblNlcXVlbmNlKTtcbiAgfVxuXG4gIHJldHVybiBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZTtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgbmVjZXNzYXJ5IERPTSBlbGVtZW50cyB0byBncm91cCByZWxhdGVkIGNvbnRlbnQuXG4gKiBSZXR1cm5zIGEgb2JqZWN0IGFycmF5IHJlcHJlc2VudGluZyB0aGUgZ3JvdXBlZCBjb250ZW50LlxuICogQHBhcmFtIHtPYmplY3RbXX0gY2hpbGRyZW4gLSBBbiBhcnJheSBvZiBvYmplY3RzLlxuICogQHJldHVybnMge09iamVjdFtdfVxuICovXG5mdW5jdGlvbiBjcmVhdGVHcm91cGVkQ29udGVudChjaGlsZHJlbikge1xuICB2YXIgcGFpcmluZ3MgPSBbXTtcblxuICB2YXIgZmlyc3RDaGlsZCA9IGNoaWxkcmVuWzBdLmVsO1xuICB2YXIgdHJpZ2dlcnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgdmFyIGNvbnRlbnRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgY29udGVudHMgPSBmaXJzdENoaWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGNvbnRlbnRzLCBmaXJzdENoaWxkLm5leHRTaWJsaW5nKTtcbiAgdHJpZ2dlcnMgPSBmaXJzdENoaWxkLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRyaWdnZXJzLCBmaXJzdENoaWxkLm5leHRTaWJsaW5nKTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgdmFyIGNoaWxkID0gY2hpbGRyZW5baV07XG4gICAgdmFyIHRyaWdnZXIgPSBjaGlsZC5lbDtcbiAgICB2YXIgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuXG4gICAgdHJpZ2dlciA9IHRyaWdnZXJzLmFwcGVuZENoaWxkKHRyaWdnZXIpO1xuICAgIGNvbnRlbnQgPSBjb250ZW50cy5hcHBlbmRDaGlsZChjb250ZW50KTtcblxuICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hpbGQuY29udGVudC5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgY29udGVudC5hcHBlbmRDaGlsZChjaGlsZC5jb250ZW50W2pdKTtcbiAgICB9XG5cbiAgICBwYWlyaW5ncy5wdXNoKHtcbiAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICBjb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHRyaWdnZXJzOiB0cmlnZ2VycyxcbiAgICBjb250ZW50czogY29udGVudHMsXG4gICAgcGFpcmluZ3M6IHBhaXJpbmdzXG4gIH07XG59XG5cbi8qKlxuICogUmV0dXJucyBhbGwgZ3JvdXBhYmxlIGNvbnRlbnQgd2l0aGluIHRoZSBzdXBwbGllZCBub2RlLlxuICogQHBhcmFtIHtub2RlfSBub2RlIC0gQSBub2RlIHRvIHRyYXZlcnNlIGZvciBncm91cGFibGUgY29udGVudC5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG4vKlxuICogUmVjdXJzaXZlIGZ1bmN0aW9uOlxuICogIFJldHVybnMgYWxsIGdyb3VwcyBvZiBoZWFkaW5ncyB0aGF0XG4gKiAgYXJlIGVsZWdpYmxlIHRvIGJlY29tZSBncm91cGVkIGNvbnRlbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEdyb3VwZWRDb250ZW50U2V0KG5vZGUpIHtcbiAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjtcbiAgdmFyIGNoaWxkcmVuV2l0aEdyb3VwYWJsZUNvbnRlbnQgPSBbXTtcbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gW107XG5cbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB2YXIgY2hpbGRHcm91cGFibGVDb250ZW50ID0gZ2V0R3JvdXBlZENvbnRlbnRTZXQoY2hpbGRyZW5baV0pO1xuXG4gICAgaWYgKGNoaWxkR3JvdXBhYmxlQ29udGVudC5sZW5ndGggPiAwKSB7XG4gICAgICBjaGlsZHJlbldpdGhHcm91cGFibGVDb250ZW50LnB1c2goaSk7XG4gICAgICBncm91cGVkQ29udGVudFNldCA9IGdyb3VwZWRDb250ZW50U2V0LmNvbmNhdChjaGlsZEdyb3VwYWJsZUNvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZSA9IGdldEhlYWRpbmdHcm91cHNJblNlcXVlbmNlKGNoaWxkcmVuLCBjaGlsZHJlbldpdGhHcm91cGFibGVDb250ZW50LCAzKTtcblxuICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgaGVhZGluZ0dyb3Vwc0luU2VxdWVuY2UubGVuZ3RoOyBfaSArPSAxKSB7XG4gICAgZ3JvdXBlZENvbnRlbnRTZXQucHVzaChjcmVhdGVHcm91cGVkQ29udGVudChoZWFkaW5nR3JvdXBzSW5TZXF1ZW5jZVtfaV0pKTtcbiAgfVxuXG4gIHJldHVybiBncm91cGVkQ29udGVudFNldDtcbn1cblxuLyoqXG4gKiBXaGVuIHN0YXRpYyBwYXJzaW5nIGlzbid0IGVub3VnaCwgdGhlcmUncyBpbnRlbGxpcGFyc2XihKIhXG4gKiBTZWFyY2hlcyB0aHJvdWdoIGRvbSBjb250ZW50IHRvIGZpbmQgaGVhZGluZyBncm91cGluZ3MgdGhhdFxuICogYXJlIGVsZWdpYmxlIHRvIGJlY29tZSB0YWIgZ3JvdXBzLlxuICogQXNzdW1lcyB0aGF0IGNvbnRlbnQgaXMgaW4gYSBmbGF0dGVuZWQgaGllcmFyY2h5IGluIHRoZSBkb21cbiAqIGFuZCBpbnRlcnByZXRzIGluY3JlYXNpbmcgaGVhZGluZyB2YWx1ZXMgYXMgYSBkZWVwZXIgbGV2ZWwgb2YgbmVzdGluZy5cbiAqIFJldHVybnMgYWxsIGdyb3VwYWJsZSBjb250ZW50IGFzIGFuIGFycmF5IG9mIG9iamVjdCBhcnJheXMuXG4gKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIG5vZGUgd2hvJ3MgY29udGVudCB3aWxsIGJlIHNlYXJjaGVkIGZvciBncm91cGFibGUgY29udGVudC5cbiAqIEByZXR1cm5zIHtPYmplY3RbXVtdfVxuICovXG5mdW5jdGlvbiBpbnRlbGxpUGFyc2UoZWwpIHtcbiAgdmFyIGNoaWxkcmVuID0gZWwuY2hpbGRyZW47XG4gIHZhciBoZWFkaW5nID0gZWwucXVlcnlTZWxlY3RvcignaDEsIGgyLCBoMywgaDQsIGg1LCBoNicpO1xuXG4gIC8vIEZhc3QgcmV0dXJuIGlmIHRoZXJlJ3Mgbm8gaGVhZGluZ3NcbiAgaWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkgcmV0dXJuIFtdO1xuXG4gIHZhciByb290Tm9kZSA9IHtcbiAgICBlbDogZWwsXG4gICAgY29udGVudDogbnVsbCxcbiAgICBjaGlsZHJlbjogZ2V0SGVhZGluZ1RyZWUoaGVhZGluZywgY2hpbGRyZW4sIHRydWUpXG4gIH07XG5cbiAgcmV0dXJuIGdldEdyb3VwZWRDb250ZW50U2V0KHJvb3ROb2RlKTtcbn1cblxuLyoqXG4gKiBQYXJzZXMgY29udGVudCBmcm9tIGEgZ2l2ZW4gbm9kZSBiYXNlZCBvbiBhIHN0YXRpYyBzdHJ1Y3R1cmUuXG4gKiBUaGUgc3RydWN0dXJlIGlzIGFzIGZvbGxvd3M6XG4gKiA8dWwgY2xhc3M9XCJ0YWJzXCI+XG4gKiAgIDxsaSBjbGFzcz1cImFjdGl2ZVwiPlRhYiAxPC9saT5cbiAqICAgPGxpPlRhYiAyPC9saT5cbiAqICAgPGxpPlRhYiAzPC9saT5cbiAqIDwvdWw+XG4gKlxuICogPHVsIGNsYXNzPVwidGFicy1jb250ZW50XCI+XG4gKiAgIDxsaSBjbGFzcz1cImFjdGl2ZVwiPlxuICogICAgIDxwPlRhYiAxIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxwPlRhYiAyIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqICAgPGxpPlxuICogICAgIDxwPlRhYiAzIGNvbnRlbnQgZ29lcyBoZXJlLjwvcD5cbiAqICAgPC9saT5cbiAqIDwvdWw+XG4gKiBSZXR1cm5zIGFsbCBncm91cGFibGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBvYmplY3QgYXJyYXlzLlxuICogQHBhcmFtIHtub2RlfSBlbCAtIFRoZSBub2RlIHdobydzIGNvbnRlbnQgd2lsbCBiZSBzZWFyY2hlZCBmb3IgZ3JvdXBhYmxlIGNvbnRlbnQuXG4gKiBAcmV0dXJucyB7T2JqZWN0W11bXX1cbiAqL1xuZnVuY3Rpb24gc3RhdGljUGFyc2UoZWwpIHtcbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gW107XG5cbiAgdmFyIHRhYnMgPSBlbC5xdWVyeVNlbGVjdG9yQWxsKCcudGFicycpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHZhciB0cmlnZ2VycyA9IHRhYnNbaV0uY2hpbGRyZW47XG4gICAgdmFyIGNvbnRlbnRzID0gdGFic1tpXS5uZXh0RWxlbWVudFNpYmxpbmcuY2hpbGRyZW47XG5cbiAgICAvLyBPbmx5IGFkZCBhIHRhYiBncm91cCBpZiBlcXVhbCB0cmlnZ2VycyB0byBjb250ZW50c1xuICAgIGlmICh0cmlnZ2Vycy5sZW5ndGggPT09IGNvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgdmFyIGxlbmd0aCA9IGdyb3VwZWRDb250ZW50U2V0LnB1c2goe1xuICAgICAgICB0cmlnZ2VyczogdGFic1tpXSxcbiAgICAgICAgY29udGVudHM6IHRhYnNbaV0ubmV4dEVsZW1lbnRTaWJsaW5nLFxuICAgICAgICBwYWlyaW5nczogW11cbiAgICAgIH0pO1xuICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTtcblxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0cmlnZ2Vycy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICB2YXIgdHJpZ2dlciA9IHRyaWdnZXJzW2pdO1xuICAgICAgICB2YXIgY29udGVudCA9IGNvbnRlbnRzW2pdO1xuXG4gICAgICAgIHZhciBwYWlyaW5nID0ge1xuICAgICAgICAgIHRyaWdnZXI6IHRyaWdnZXIsXG4gICAgICAgICAgY29udGVudDogY29udGVudFxuICAgICAgICB9O1xuXG4gICAgICAgIGdyb3VwZWRDb250ZW50U2V0W2luZGV4XS5wYWlyaW5ncy5wdXNoKHBhaXJpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBncm91cGVkQ29udGVudFNldDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGFsbCBncm91cGFibGUgY29udGVudCBhcyBhbiBhcnJheSBvZiBvYmplY3QgYXJyYXlzLlxuICogQHBhcmFtIHtub2RlfSBjb250ZW50IC0gVGhlIG5vZGUgdG8gcGFyc2UgZm9yIGdyb3VwYWJsZSBjb250ZW50LlxuICogQHBhcmFtIHtib29sZWFufSBpbnRlbGxpcGFyc2UgLSBXaGV0aGVyIHRvIHVzZSBpbnRlbGxpZ2VudCBwYXJzaW5nLlxuICogQHJldHVybnMge09iamVjdFtdW119XG4gKi9cbmZ1bmN0aW9uIHBhcnNlKGNvbnRlbnQpIHtcbiAgdmFyIGludGVsbGlwYXJzZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxICYmIGFyZ3VtZW50c1sxXSAhPT0gdW5kZWZpbmVkID8gYXJndW1lbnRzWzFdIDogZmFsc2U7XG5cbiAgdmFyIGdyb3VwZWRDb250ZW50U2V0ID0gaW50ZWxsaXBhcnNlID8gaW50ZWxsaVBhcnNlKGNvbnRlbnQpIDogc3RhdGljUGFyc2UoY29udGVudCk7XG5cbiAgcmV0dXJuIGdyb3VwZWRDb250ZW50U2V0O1xufVxuXG4vKiogQSBjbGFzcyBmb3IgY3JlYXRpbmcsIG1hbmFnaW5nLCBhbmQgZGVzdHJveWluZyBncm91cGFibGUgY29udGVudC4gKi9cblxudmFyIEdyb3VwZWRDb250ZW50ID0gZnVuY3Rpb24gKCkge1xuICAvKipcbiAgICogQ3JlYXRlIGdyb3VwZWQgY29udGVudFxuICAgKiBAcGFyYW0ge25vZGV9IGVsIC0gVGhlIGVsZW1lbnQgdG8gc2VhcmNoIGZvciBncm91cGFibGUgY29udGVudCBpbi5cbiAgICogQHBhcmFtIHtPYmplY3R9ICBbb3B0aW9uc10gLSBBZGRpdGlvbmFsIG9wdGlvbnNcbiAgICogQHBhcmFtIHtzdHJpbmd9ICBbb3B0aW9ucy5sYXlvdXRdIC0gVGhlIGxheW91dCB0byBkaXNwbGF5IGdyb3VwYWJsZSBjb250ZW50IGluLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmludGVsbGlwYXJzZV0gLSBUaGUgcGFyc2luZyBhbGdvcml0aG0gdXNlZCB0byBmaW5kIGNvbnRlbnQgd2l0aC5cbiAgICovXG4gIGZ1bmN0aW9uIEdyb3VwZWRDb250ZW50KGVsKSB7XG4gICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiB7fTtcbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBHcm91cGVkQ29udGVudCk7XG5cbiAgICB0aGlzLm5hbWVzcGFjZSA9ICdncm91cGVkLWNvbnRlbnQnO1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLmdyb3VwZWRDb250ZW50SW5zdGFuY2VzID0gW107XG5cbiAgICB2YXIgbGF5b3V0ID0gb3B0aW9ucy5sYXlvdXQgfHwgJ3RhYnMnO1xuICAgIHZhciBpbnRlbGxpcGFyc2UgPSAhIW9wdGlvbnMuaW50ZWxsaXBhcnNlO1xuXG4gICAgZm9yRWFjaChwYXJzZShlbCwgaW50ZWxsaXBhcnNlKSwgZnVuY3Rpb24gKGdyb3VwZWRDb250ZW50KSB7XG4gICAgICB2YXIgaWQgPSB1dWlkdjQoKTtcbiAgICAgIHZhciBpbnN0YW5jZSA9IG51bGw7XG4gICAgICB2YXIgZ3JvdXBlZENvbnRlbnRXcmFwcGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgIGdyb3VwZWRDb250ZW50V3JhcHBlciA9IGdyb3VwZWRDb250ZW50LnRyaWdnZXJzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGdyb3VwZWRDb250ZW50V3JhcHBlciwgZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMubmV4dFNpYmxpbmcpO1xuXG4gICAgICBhZGRDbGFzcyhncm91cGVkQ29udGVudFdyYXBwZXIsIF90aGlzLm5hbWVzcGFjZSk7XG4gICAgICBhZGRDbGFzcyhncm91cGVkQ29udGVudFdyYXBwZXIsIF90aGlzLm5hbWVzcGFjZSArICctbGF5b3V0LScgKyBsYXlvdXQpO1xuXG4gICAgICBncm91cGVkQ29udGVudFdyYXBwZXIuYXBwZW5kQ2hpbGQoZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMpO1xuICAgICAgZ3JvdXBlZENvbnRlbnRXcmFwcGVyLmFwcGVuZENoaWxkKGdyb3VwZWRDb250ZW50LmNvbnRlbnRzKTtcblxuICAgICAgZ3JvdXBlZENvbnRlbnQubmFtZXNwYWNlID0gX3RoaXMubmFtZXNwYWNlO1xuICAgICAgZ3JvdXBlZENvbnRlbnQuaWQgPSBpZDtcbiAgICAgIGdyb3VwZWRDb250ZW50LnRyaWdnZXJzLmlkID0gX3RoaXMubmFtZXNwYWNlICsgJy0nICsgaWQgKyAnLXRyaWdnZXJzJztcbiAgICAgIGdyb3VwZWRDb250ZW50LmNvbnRlbnRzLmlkID0gX3RoaXMubmFtZXNwYWNlICsgJy0nICsgaWQgKyAnLWNvbnRlbnRzJztcblxuICAgICAgYWRkQ2xhc3MoZ3JvdXBlZENvbnRlbnQudHJpZ2dlcnMsIF90aGlzLm5hbWVzcGFjZSArICctdHJpZ2dlcnMnKTtcbiAgICAgIGFkZENsYXNzKGdyb3VwZWRDb250ZW50LmNvbnRlbnRzLCBfdGhpcy5uYW1lc3BhY2UgKyAnLWNvbnRlbnRzJyk7XG5cbiAgICAgIGZvckVhY2goZ3JvdXBlZENvbnRlbnQucGFpcmluZ3MsIGZ1bmN0aW9uIChwYWlyaW5nKSB7XG4gICAgICAgIGFkZENsYXNzKHBhaXJpbmcudHJpZ2dlciwgX3RoaXMubmFtZXNwYWNlICsgJy10cmlnZ2VyJyk7XG4gICAgICAgIGFkZENsYXNzKHBhaXJpbmcuY29udGVudCwgX3RoaXMubmFtZXNwYWNlICsgJy1jb250ZW50Jyk7XG4gICAgICB9KTtcblxuICAgICAgc3dpdGNoIChsYXlvdXQpIHtcbiAgICAgICAgY2FzZSAnYWNjb3JkaW9uJzpcbiAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBBY2NvcmRpb25MYXlvdXQoZ3JvdXBlZENvbnRlbnQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0YWJzJzpcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBUYWJzTGF5b3V0KGdyb3VwZWRDb250ZW50KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgX3RoaXMuZ3JvdXBlZENvbnRlbnRJbnN0YW5jZXMucHVzaCh7XG4gICAgICAgIGdyb3VwZWRDb250ZW50OiBncm91cGVkQ29udGVudCxcbiAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKiBVbmxvYWQgYWxsIGdyb3VwZWQgY29udGVudCBpbnN0YW5jZXMgKi9cblxuXG4gIGNyZWF0ZUNsYXNzKEdyb3VwZWRDb250ZW50LCBbe1xuICAgIGtleTogJ3VubG9hZCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVubG9hZCgpIHtcbiAgICAgIGZvckVhY2godGhpcy5ncm91cGVkQ29udGVudEluc3RhbmNlcywgZnVuY3Rpb24gKGdyb3VwZWRDb250ZW50SW5zdGFuY2UpIHtcbiAgICAgICAgZ3JvdXBlZENvbnRlbnRJbnN0YW5jZS5pbnN0YW5jZS51bmxvYWQoKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gR3JvdXBlZENvbnRlbnQ7XG59KCk7XG5cbm1vZHVsZS5leHBvcnRzID0gR3JvdXBlZENvbnRlbnQ7XG4iLCJpbXBvcnQgZml0dmlkcyBmcm9tICdmaXR2aWRzJztcbmltcG9ydCBHcm91cGVkQ29udGVudCBmcm9tICdncm91cGVkLWNvbnRlbnQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSaWNoVGV4dCB7XG4gIGNvbnN0cnVjdG9yKCRlbCkge1xuICAgIHRoaXMuJGVsID0gJGVsO1xuICAgIHRoaXMuX2luaXRFeHRlcm5hbExpbmtzKCk7XG4gICAgdGhpcy5ncm91cGVkQ29udGVudCA9IG51bGw7XG5cbiAgICBpZiAodGhpcy4kZWwubGVuZ3RoKSB7XG4gICAgICB0aGlzLmdyb3VwZWRDb250ZW50ID0gbmV3IEdyb3VwZWRDb250ZW50KCRlbC5nZXQoMCksIHtcbiAgICAgICAgbGF5b3V0OiAndGFicycsXG4gICAgICAgIGludGVsbGlwYXJzZTogZmFsc2UsXG4gICAgICB9KTtcbiAgICAgIGZpdHZpZHMoKTtcbiAgICB9XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKHRoaXMuZ3JvdXBlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZ3JvdXBlZENvbnRlbnQudW5sb2FkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gbGlua3Mgd2l0aGluIGFuIFJURSBmaWVsZCBpbiBhIG5ldyB3aW5kb3cgaWYgdGhleSBwb2ludCB0byBleHRlcm5hbCBkb21haW5zXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaW5pdEV4dGVybmFsTGlua3MoKXtcbiAgICBjb25zdCBhbmNob3JzID0gdGhpcy4kZWwuZmluZCgnYVtocmVmXj1cImh0dHBcIl0nKS5maWx0ZXIoKGksIGVsKSA9PiB7XG4gICAgICByZXR1cm4gZWwuaHJlZi5pbmRleE9mKGxvY2F0aW9uLmhvc3RuYW1lKSA9PT0gLTE7XG4gICAgfSk7XG5cbiAgICBhbmNob3JzLmF0dHIoJ3RhcmdldCcsICdfYmxhbmsnKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBSaWNoVGV4dCBmcm9tICcuLi9jb21wb25lbnRzL1JpY2hUZXh0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGFnZSB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuJHBhZ2VDb250ZW50ID0gJCgnW2RhdGEtdGVtcGxhdGUtcGFnZV0nKTtcblxuICAgIGlmICh0aGlzLiRwYWdlQ29udGVudC5sZW5ndGgpIHtcbiAgICAgIG5ldyBSaWNoVGV4dCh0aGlzLiRwYWdlQ29udGVudCk7XG4gICAgfVxuICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBTZWN0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaGFuZGxlcnMgPSB7fTtcbiAgICB0aGlzLmluc3RhbmNlcyA9IHt9O1xuICAgIHRoaXMuX29uU2VjdGlvbkV2ZW50ID0gdGhpcy5fb25TZWN0aW9uRXZlbnQuYmluZCh0aGlzKTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjp1bmxvYWQnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wIGxpc3RlbmluZyBmb3Igc2VjdGlvbiBldmVudHMsIGFuZCB1bmJpbmQgYWxsIGhhbmRsZXJzLlxuICAgKi9cbiAgdW5iaW5kKCkge1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJywgdGhpcy5fb25TZWN0aW9uRXZlbnQpO1xuICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nob3BpZnk6c2VjdGlvbjp1bmxvYWQnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpzZWN0aW9uOnNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcbiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpzZWxlY3QnLCB0aGlzLl9vblNlY3Rpb25FdmVudCk7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2hvcGlmeTpibG9jazpkZXNlbGVjdCcsIHRoaXMuX29uU2VjdGlvbkV2ZW50KTtcblxuICAgIC8vIFVubG9hZCBhbGwgaW5zdGFuY2VzXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmluc3RhbmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fdHJpZ2dlckluc3RhbmNlRXZlbnQodGhpcy5pbnN0YW5jZXNbaV0sICdvblNlY3Rpb25VbmxvYWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLmhhbmRsZXJzID0ge307XG4gICAgdGhpcy5pbnN0YW5jZXMgPSB7fTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNlY3Rpb24gaGFuZGxlci5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogICAgICAgIFRoZSBzZWN0aW9uIHR5cGUgdG8gaGFuZGxlLiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZCBmb3IgYWxsXG4gICAqICAgICAgICBzZWN0aW9ucyB3aXRoIHRoaXMgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gaGFuZGxlclxuICAgKiAgICAgICAgVGhlIGhhbmRsZXIgZnVuY3Rpb24gaXMgcGFzc2VkIGluZm9ybWF0aW9uIGFib3V0IGEgc3BlY2lmaWMgc2VjdGlvblxuICAgKiAgICAgICAgaW5zdGFuY2UuIFRoZSBoYW5kbGVyIGlzIGV4cGVjdGVkIHRvIHJldHVybiBhbiBvYmplY3QgdGhhdCB3aWxsIGJlXG4gICAqICAgICAgICBhc3NvY2lhdGVkIHdpdGggdGhlIHNlY3Rpb24gaW5zdGFuY2UuXG4gICAqXG4gICAqICAgICAgICBTZWN0aW9uIGhhbmRsZXJzIGFyZSBwYXNzZWQgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICAgKiAgICAgICAgICB7c3RyaW5nfSBpZFxuICAgKiAgICAgICAgICBBbiBJRCB0aGF0IG1hcHMgdG8gYSBzcGVjaWZpYyBzZWN0aW9uIGluc3RhbmNlLiBUeXBpY2FsbHkgdGhlXG4gICAqICAgICAgICAgIHNlY3Rpb24ncyBmaWxlbmFtZSBmb3Igc3RhdGljIHNlY3Rpb25zLCBvciBhIGdlbmVyYXRlZCBJRCBmb3JcbiAgICogICAgICAgICAgZHluYW1pYyBzZWN0aW9ucy5cbiAgICpcbiAgICogICAgICAgICAge3N0cmluZ30gdHlwZVxuICAgKiAgICAgICAgICBUaGUgc2VjdGlvbiB0eXBlLCBhcyBzdXBwbGllZCB3aGVuIHJlZ2lzdGVyZWQuXG4gICAqXG4gICAqICAgICAgICAgIHtFbGVtZW50fSBlbFxuICAgKiAgICAgICAgICBUaGUgcm9vdCBET00gZWxlbWVudCBmb3IgdGhlIHNlY3Rpb24gaW5zdGFuY2UuXG4gICAqXG4gICAqICAgICAgICAgIHtPYmplY3R9IGRhdGFcbiAgICogICAgICAgICAgRGF0YSBsb2FkZWQgZnJvbSB0aGUgc2VjdGlvbiBzY3JpcHQgZWxlbWVudC4gRGVmYXVsdHMgdG8gYW5cbiAgICogICAgICAgICAgZW1wdHkgb2JqZWN0LlxuICAgKlxuICAgKiAgICAgICAgICB7RnVuY3Rpb259IHBvc3RNZXNzYWdlXG4gICAqICAgICAgICAgIEEgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHRvIHBhc3MgbWVzc2FnZXMgYmV0d2VlbiBzZWN0aW9ucy5cbiAgICogICAgICAgICAgVGhlIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgd2l0aCBhIG1lc3NhZ2UgXCJuYW1lXCIsIGFuZFxuICAgKiAgICAgICAgICBvcHRpb25hbGx5IHNvbWUgZGF0YS5cbiAgICovXG4gIHJlZ2lzdGVyKHR5cGUsIGhhbmRsZXIpIHtcbiAgICBpZiAodGhpcy5oYW5kbGVyc1t0eXBlXSkge1xuICAgICAgY29uc29sZS53YXJuKGBTZWN0aW9uczogc2VjdGlvbiBoYW5kbGVyIGFscmVhZHkgZXhpc3RzIG9mIHR5cGUgJyR7dHlwZX0nLmApO1xuICAgIH1cblxuICAgIC8vIFN0b3JlIHRoZSBzZWN0aW9uIGhhbmRsZXJcbiAgICB0aGlzLmhhbmRsZXJzW3R5cGVdID0gaGFuZGxlcjtcblxuICAgIC8vIEluaXQgc2VjdGlvbnMgZm9yIHRoaXMgdHlwZVxuICAgIHRoaXMuX2luaXRTZWN0aW9ucyh0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplIHNlY3Rpb25zIGFscmVhZHkgb24gdGhlIHBhZ2UuXG4gICAqL1xuICBfaW5pdFNlY3Rpb25zKHR5cGUpIHtcbiAgICAvLyBGZXRjaCBhbGwgZXhpc3Rpbmcgc2VjdGlvbnMgb2Ygb3VyIHR5cGUgb24gdGhlIHBhZ2VcbiAgICBjb25zdCBkYXRhRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgW2RhdGEtc2VjdGlvbi10eXBlPVwiJHt0eXBlfVwiXWApO1xuICAgIGlmICghZGF0YUVscykgcmV0dXJuO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIGZvciBlYWNoIHNlY3Rpb25cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGFFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGRhdGFFbCA9IGRhdGFFbHNbaV07XG4gICAgICBjb25zdCBlbCA9IGRhdGFFbC5wYXJlbnROb2RlO1xuXG4gICAgICAvLyBHZXQgaW5zdGFuY2UgSURcbiAgICAgIGNvbnN0IGlkRWwgPSBlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1zZWN0aW9uLWlkXScpO1xuXG4gICAgICBpZiAoIWlkRWwpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBTZWN0aW9uczogdW5hYmxlIHRvIGZpbmQgc2VjdGlvbiBpZCBmb3IgJyR7dHlwZX0nLmAsIGVsKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlY3Rpb25JZCA9IGlkRWwuZ2V0QXR0cmlidXRlKCdkYXRhLXNlY3Rpb24taWQnKTtcbiAgICAgIGlmICghc2VjdGlvbklkKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaWQgZm9yICcke3R5cGV9Jy5gLCBlbCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jcmVhdGVJbnN0YW5jZShzZWN0aW9uSWQsIGVsKTtcbiAgICB9XG4gIH1cblxuICBfb25TZWN0aW9uRXZlbnQoZXZlbnQpIHtcbiAgICBjb25zdCBlbCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCBzZWN0aW9uSWQgPSBldmVudC5kZXRhaWwuc2VjdGlvbklkO1xuICAgIGNvbnN0IGJsb2NrSWQgPSBldmVudC5kZXRhaWwuYmxvY2tJZDtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuaW5zdGFuY2VzW3NlY3Rpb25JZF07XG5cbiAgICBzd2l0Y2ggKGV2ZW50LnR5cGUpIHtcbiAgICAgIGNhc2UgJ3Nob3BpZnk6c2VjdGlvbjpsb2FkJzpcbiAgICAgICAgdGhpcy5fY3JlYXRlSW5zdGFuY2Uoc2VjdGlvbklkLCBlbCk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246dW5sb2FkJzpcbiAgICAgICAgdGhpcy5fdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25VbmxvYWQnLCB7IGVsLCBpZDogc2VjdGlvbklkIH0pO1xuICAgICAgICBkZWxldGUgdGhpcy5pbnN0YW5jZXNbc2VjdGlvbklkXTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3Nob3BpZnk6c2VjdGlvbjpzZWxlY3QnOlxuICAgICAgICB0aGlzLl90cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvblNlbGVjdCcsIHsgZWwsIGlkOiBzZWN0aW9uSWQgfSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdzaG9waWZ5OnNlY3Rpb246ZGVzZWxlY3QnOlxuICAgICAgICB0aGlzLl90cmlnZ2VySW5zdGFuY2VFdmVudChpbnN0YW5jZSwgJ29uU2VjdGlvbkRlc2VsZWN0JywgeyBlbCwgaWQ6IHNlY3Rpb25JZCB9KTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ3Nob3BpZnk6YmxvY2s6c2VsZWN0JzpcbiAgICAgICAgdGhpcy5fdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsICdvblNlY3Rpb25CbG9ja1NlbGVjdCcsIHsgZWwsIGlkOiBibG9ja0lkIH0pO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnc2hvcGlmeTpibG9jazpkZXNlbGVjdCc6XG4gICAgICAgIHRoaXMuX3RyaWdnZXJJbnN0YW5jZUV2ZW50KGluc3RhbmNlLCAnb25TZWN0aW9uQmxvY2tEZXNlbGVjdCcsIHsgZWwsIGlkOiBibG9ja0lkIH0pO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBfdHJpZ2dlckluc3RhbmNlRXZlbnQoaW5zdGFuY2UsIGV2ZW50TmFtZSwgLi4uYXJncykge1xuICAgIGlmIChpbnN0YW5jZSAmJiBpbnN0YW5jZVtldmVudE5hbWVdKSB7XG4gICAgICBpbnN0YW5jZVtldmVudE5hbWVdKC4uLmFyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIF9wb3N0TWVzc2FnZShuYW1lLCBkYXRhKSB7XG4gICAgT2JqZWN0LmtleXModGhpcy5pbnN0YW5jZXMpLmZvckVhY2goKGlkKSA9PiB7XG4gICAgICB0aGlzLl90cmlnZ2VySW5zdGFuY2VFdmVudCh0aGlzLmluc3RhbmNlc1tpZF0sICdvblNlY3Rpb25NZXNzYWdlJywgbmFtZSwgZGF0YSk7XG4gICAgfSk7XG4gIH1cblxuICBfY3JlYXRlSW5zdGFuY2UoaWQsIGVsKSB7XG4gICAgY29uc3QgdHlwZUVsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtc2VjdGlvbi10eXBlXScpO1xuICAgIGlmICghdHlwZUVsKSByZXR1cm47XG5cbiAgICBjb25zdCB0eXBlID0gdHlwZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLXR5cGUnKTtcbiAgICBpZiAoIXR5cGUpIHJldHVybjtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSB0aGlzLmhhbmRsZXJzW3R5cGVdO1xuICAgIGlmICghaGFuZGxlcikgcmV0dXJuIGNvbnNvbGUud2FybihgU2VjdGlvbnM6IHVuYWJsZSB0byBmaW5kIHNlY3Rpb24gaGFuZGxlciBmb3IgdHlwZSAnJHt0eXBlfScuYCk7XG5cbiAgICBjb25zdCBkYXRhID0gdGhpcy5fbG9hZERhdGEoZWwpO1xuICAgIGNvbnN0IHBvc3RNZXNzYWdlID0gdGhpcy5fcG9zdE1lc3NhZ2UuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuaW5zdGFuY2VzW2lkXSA9IGhhbmRsZXIoe2lkLCB0eXBlLCBlbCwgZGF0YSwgcG9zdE1lc3NhZ2V9KTtcbiAgfVxuXG4gIF9sb2FkRGF0YShlbCkge1xuICAgIGNvbnN0IGRhdGFFbCA9IGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNlY3Rpb24tZGF0YV0nKTtcbiAgICBpZiAoIWRhdGFFbCkgcmV0dXJuIHt9O1xuXG4gICAgLy8gTG9hZCBkYXRhIGZyb20gYXR0cmlidXRlLCBvciBpbm5lckhUTUxcbiAgICBjb25zdCBkYXRhID0gZGF0YUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1zZWN0aW9uLWRhdGEnKSB8fCBkYXRhRWwuaW5uZXJIVE1MO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpO1xuICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUud2FybihgU2VjdGlvbnM6IGludmFsaWQgc2VjdGlvbiBkYXRhIGZvdW5kLiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBtb25leUZvcm1hdHMgPSB7XG4gIFVTRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnR9fSBVU0QnXG4gIH0sXG4gIEVVUjoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJmV1cm87e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyZldXJvO3t7YW1vdW50fX0gRVVSJ1xuICB9LFxuICBHQlA6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyZwb3VuZDt7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJnBvdW5kO3t7YW1vdW50fX0gR0JQJ1xuICB9LFxuICBDQUQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50fX0gQ0FEJ1xuICB9LFxuICBBTEw6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0xlayB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnTGVrIHt7YW1vdW50fX0gQUxMJ1xuICB9LFxuICBEWkQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0RBIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdEQSB7e2Ftb3VudH19IERaRCdcbiAgfSxcbiAgQU9BOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdLent7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdLent7YW1vdW50fX0gQU9BJ1xuICB9LFxuICBBUlM6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0gQVJTJ1xuICB9LFxuICBBTUQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50fX0gQU1EJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnR9fSBBTUQnXG4gIH0sXG4gIEFXRzoge1xuICAgICdtb25leV9mb3JtYXQnOiAnQWZse3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0FmbHt7YW1vdW50fX0gQVdHJ1xuICB9LFxuICBBVUQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50fX0gQVVEJ1xuICB9LFxuICBCQkQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50fX0gQmRzJ1xuICB9LFxuICBBWk46IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ20ue3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ20ue3thbW91bnR9fSBBWk4nXG4gIH0sXG4gIEJEVDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnVGsge3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ1RrIHt7YW1vdW50fX0gQkRUJ1xuICB9LFxuICBCU0Q6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0JTJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdCUyR7e2Ftb3VudH19IEJTRCdcbiAgfSxcbiAgQkhEOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudH19MCBCRCcsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0wIEJIRCdcbiAgfSxcbiAgQllSOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdCciB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnQnIge3thbW91bnR9fSBCWVInXG4gIH0sXG4gIEJaRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnQloke3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0JaJHt7YW1vdW50fX0gQlpEJ1xuICB9LFxuICBCVE46IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ051IHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdOdSB7e2Ftb3VudH19IEJUTidcbiAgfSxcbiAgQkFNOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdLTSB7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnS00ge3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBCQU0nXG4gIH0sXG4gIEJSTDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnUiQge3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ1IkIHt7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0gQlJMJ1xuICB9LFxuICBCT0I6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0Jze3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0Jze3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBCT0InXG4gIH0sXG4gIEJXUDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnUHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdQe3thbW91bnR9fSBCV1AnXG4gIH0sXG4gIEJORDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnR9fSBCTkQnXG4gIH0sXG4gIEJHTjoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnR9fSDQu9CyJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnR9fSDQu9CyIEJHTidcbiAgfSxcbiAgTU1LOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdLe3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0t7e2Ftb3VudH19IE1NSydcbiAgfSxcbiAgS0hSOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdLSFJ7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnS0hSe3thbW91bnR9fSdcbiAgfSxcbiAgS1lEOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcke3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyR7e2Ftb3VudH19IEtZRCdcbiAgfSxcbiAgWEFGOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdGQ0ZBe3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0ZDRkF7e2Ftb3VudH19IFhBRidcbiAgfSxcbiAgQ0xQOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcke3thbW91bnRfbm9fZGVjaW1hbHN9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyR7e2Ftb3VudF9ub19kZWNpbWFsc319IENMUCdcbiAgfSxcbiAgQ05ZOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcmIzE2NTt7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJiMxNjU7e3thbW91bnR9fSBDTlknXG4gIH0sXG4gIENPUDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBDT1AnXG4gIH0sXG4gIENSQzoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJiM4MzUzOyB7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJiM4MzUzOyB7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19IENSQydcbiAgfSxcbiAgSFJLOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19IGtuJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBrbiBIUksnXG4gIH0sXG4gIENaSzoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBLJiMyNjk7JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBLJiMyNjk7J1xuICB9LFxuICBES0s6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdrci57e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19J1xuICB9LFxuICBET1A6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1JEJCB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnUkQkIHt7YW1vdW50fX0nXG4gIH0sXG4gIFhDRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdFQyR7e2Ftb3VudH19J1xuICB9LFxuICBFR1A6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0xFIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdMRSB7e2Ftb3VudH19IEVHUCdcbiAgfSxcbiAgRVRCOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdCcnt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdCcnt7YW1vdW50fX0gRVRCJ1xuICB9LFxuICBYUEY6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50X25vX2RlY2ltYWxzX3dpdGhfY29tbWFfc2VwYXJhdG9yfX0gWFBGJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfbm9fZGVjaW1hbHNfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBYUEYnXG4gIH0sXG4gIEZKRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdGSiR7e2Ftb3VudH19J1xuICB9LFxuICBHTUQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0Qge3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0Qge3thbW91bnR9fSBHTUQnXG4gIH0sXG4gIEdIUzoge1xuICAgICdtb25leV9mb3JtYXQnOiAnR0gmIzgzNzM7e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0dIJiM4MzczO3t7YW1vdW50fX0nXG4gIH0sXG4gIEdUUToge1xuICAgICdtb25leV9mb3JtYXQnOiAnUXt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IEdUUSdcbiAgfSxcbiAgR1lEOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdHJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnR9fSBHWUQnXG4gIH0sXG4gIEdFTDoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnR9fSBHRUwnLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IEdFTCdcbiAgfSxcbiAgSE5MOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdMIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdMIHt7YW1vdW50fX0gSE5MJ1xuICB9LFxuICBIS0Q6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnSEske3thbW91bnR9fSdcbiAgfSxcbiAgSFVGOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfbm9fZGVjaW1hbHNfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBGdCdcbiAgfSxcbiAgSVNLOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF9ub19kZWNpbWFsc319IGtyJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfbm9fZGVjaW1hbHN9fSBrciBJU0snXG4gIH0sXG4gIElOUjoge1xuICAgICdtb25leV9mb3JtYXQnOiAnUnMuIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdScy4ge3thbW91bnR9fSdcbiAgfSxcbiAgSURSOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnUnAge3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSdcbiAgfSxcbiAgSUxTOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IE5JUycsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0gTklTJ1xuICB9LFxuICBKTUQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50fX0gSk1EJ1xuICB9LFxuICBKUFk6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyYjMTY1O3t7YW1vdW50X25vX2RlY2ltYWxzfX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcmIzE2NTt7e2Ftb3VudF9ub19kZWNpbWFsc319IEpQWSdcbiAgfSxcbiAgSkVQOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcmcG91bmQ7e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyZwb3VuZDt7e2Ftb3VudH19IEpFUCdcbiAgfSxcbiAgSk9EOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudH19MCBKRCcsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0wIEpPRCdcbiAgfSxcbiAgS1pUOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IEtaVCcsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0gS1pUJ1xuICB9LFxuICBLRVM6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0tTaHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdLU2h7e2Ftb3VudH19J1xuICB9LFxuICBLV0Q6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50fX0wIEtEJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnR9fTAgS1dEJ1xuICB9LFxuICBLR1M6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ9C70LJ7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAn0LvQsnt7YW1vdW50fX0nXG4gIH0sXG4gIExWTDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnTHMge3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0xzIHt7YW1vdW50fX0gTFZMJ1xuICB9LFxuICBMQlA6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0wmcG91bmQ7e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0wmcG91bmQ7e3thbW91bnR9fSBMQlAnXG4gIH0sXG4gIExUTDoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnR9fSBMdCcsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0gTHQnXG4gIH0sXG4gIE1HQToge1xuICAgICdtb25leV9mb3JtYXQnOiAnQXIge3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0FyIHt7YW1vdW50fX0gTUdBJ1xuICB9LFxuICBNS0Q6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ9C00LXQvSB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAn0LTQtdC9IHt7YW1vdW50fX0gTUtEJ1xuICB9LFxuICBNT1A6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ01PUCR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnTU9QJHt7YW1vdW50fX0nXG4gIH0sXG4gIE1WUjoge1xuICAgICdtb25leV9mb3JtYXQnOiAnUmZ7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnUmZ7e2Ftb3VudH19IE1SZidcbiAgfSxcbiAgTVhOOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICckIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICckIHt7YW1vdW50fX0gTVhOJ1xuICB9LFxuICBNWVI6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1JNe3thbW91bnR9fSBNWVInLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdSTXt7YW1vdW50fX0gTVlSJ1xuICB9LFxuICBNVVI6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1JzIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdScyB7e2Ftb3VudH19IE1VUidcbiAgfSxcbiAgTURMOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IE1ETCcsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0gTURMJ1xuICB9LFxuICBNQUQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50fX0gZGgnLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdEaCB7e2Ftb3VudH19IE1BRCdcbiAgfSxcbiAgTU5UOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF9ub19kZWNpbWFsc319ICYjODM2NicsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50X25vX2RlY2ltYWxzfX0gTU5UJ1xuICB9LFxuICBNWk46IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50fX0gTXQnLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdNdCB7e2Ftb3VudH19IE1aTidcbiAgfSxcbiAgTkFEOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdOJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdOJHt7YW1vdW50fX0gTkFEJ1xuICB9LFxuICBOUFI6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1Jze3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ1Jze3thbW91bnR9fSBOUFInXG4gIH0sXG4gIEFORzoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJmZub2Y7e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0gTkEmZm5vZjsnXG4gIH0sXG4gIE5aRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnR9fSBOWkQnXG4gIH0sXG4gIE5JTzoge1xuICAgICdtb25leV9mb3JtYXQnOiAnQyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnQyR7e2Ftb3VudH19IE5JTydcbiAgfSxcbiAgTkdOOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcmIzgzNTg7e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyYjODM1ODt7e2Ftb3VudH19IE5HTidcbiAgfSxcbiAgTk9LOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdrciB7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAna3Ige3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBOT0snXG4gIH0sXG4gIE9NUjoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBPTVInLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICd7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19IE9NUidcbiAgfSxcbiAgUEtSOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdScy57e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnUnMue3thbW91bnR9fSBQS1InXG4gIH0sXG4gIFBHSzoge1xuICAgICdtb25leV9mb3JtYXQnOiAnSyB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnSyB7e2Ftb3VudH19IFBHSydcbiAgfSxcbiAgUFlHOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdHcy4ge3thbW91bnRfbm9fZGVjaW1hbHNfd2l0aF9jb21tYV9zZXBhcmF0b3J9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0dzLiB7e2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcn19IFBZRydcbiAgfSxcbiAgUEVOOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdTLy4ge3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ1MvLiB7e2Ftb3VudH19IFBFTidcbiAgfSxcbiAgUEhQOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcmIzgzNjk7e3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyYjODM2OTt7e2Ftb3VudH19IFBIUCdcbiAgfSxcbiAgUExOOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19IHpsJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSB6bCBQTE4nXG4gIH0sXG4gIFFBUjoge1xuICAgICdtb25leV9mb3JtYXQnOiAnUUFSIHt7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdRQVIge3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSdcbiAgfSxcbiAgUk9OOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19IGxlaScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0gbGVpIFJPTidcbiAgfSxcbiAgUlVCOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcmIzEwODg7JiMxMDkxOyYjMTA3Mzt7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJiMxMDg4OyYjMTA5MTsmIzEwNzM7e3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSBSVUInXG4gIH0sXG4gIFJXRjoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnRfbm9fZGVjaW1hbHN9fSBSRicsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50X25vX2RlY2ltYWxzfX0gUldGJ1xuICB9LFxuICBXU1Q6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1dTJCB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnV1MkIHt7YW1vdW50fX0gV1NUJ1xuICB9LFxuICBTQVI6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50fX0gU1InLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IFNBUidcbiAgfSxcbiAgU1REOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdEYiB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnRGIge3thbW91bnR9fSBTVEQnXG4gIH0sXG4gIFJTRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnR9fSBSU0QnLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICd7e2Ftb3VudH19IFJTRCdcbiAgfSxcbiAgU0NSOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdScyB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnUnMge3thbW91bnR9fSBTQ1InXG4gIH0sXG4gIFNHRDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnR9fSBTR0QnXG4gIH0sXG4gIFNZUDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnUyZwb3VuZDt7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnUyZwb3VuZDt7e2Ftb3VudH19IFNZUCdcbiAgfSxcbiAgWkFSOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdSIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdSIHt7YW1vdW50fX0gWkFSJ1xuICB9LFxuICBLUlc6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyYjODM2MTt7e2Ftb3VudF9ub19kZWNpbWFsc319JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJiM4MzYxO3t7YW1vdW50X25vX2RlY2ltYWxzfX0gS1JXJ1xuICB9LFxuICBMS1I6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1JzIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdScyB7e2Ftb3VudH19IExLUidcbiAgfSxcbiAgU0VLOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF9ub19kZWNpbWFsc319IGtyJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfbm9fZGVjaW1hbHN9fSBrciBTRUsnXG4gIH0sXG4gIENIRjoge1xuICAgICdtb25leV9mb3JtYXQnOiAnU0ZyLiB7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnU0ZyLiB7e2Ftb3VudH19IENIRidcbiAgfSxcbiAgVFdEOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICcke3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJyR7e2Ftb3VudH19IFRXRCdcbiAgfSxcbiAgVEhCOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudH19ICYjeGUzZjsnLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICd7e2Ftb3VudH19ICYjeGUzZjsgVEhCJ1xuICB9LFxuICBUWlM6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50fX0gVFpTJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnR9fSBUWlMnXG4gIH0sXG4gIFRURDoge1xuICAgICdtb25leV9mb3JtYXQnOiAnJHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICcke3thbW91bnR9fSBUVEQnXG4gIH0sXG4gIFRORDoge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50fX0gRFQnXG4gIH0sXG4gIFRSWToge1xuICAgICdtb25leV9mb3JtYXQnOiAne3thbW91bnR9fVRMJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnR9fVRMJ1xuICB9LFxuICBVR1g6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ1VzaCB7e2Ftb3VudF9ub19kZWNpbWFsc319JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnVXNoIHt7YW1vdW50X25vX2RlY2ltYWxzfX0gVUdYJ1xuICB9LFxuICBVQUg6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ+KCtHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICfigrR7e2Ftb3VudH19IFVBSCdcbiAgfSxcbiAgQUVEOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdEaHMuIHt7YW1vdW50fX0nLFxuICAgICdtb25leV93aXRoX2N1cnJlbmN5X2Zvcm1hdCc6ICdEaHMuIHt7YW1vdW50fX0gQUVEJ1xuICB9LFxuICBVWVU6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50X3dpdGhfY29tbWFfc2VwYXJhdG9yfX0gVVlVJ1xuICB9LFxuICBWVVY6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJyR7e2Ftb3VudH19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnJHt7YW1vdW50fX1WVCdcbiAgfSxcbiAgVkVGOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICdCcy4ge3thbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3J9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0JzLiB7e2Ftb3VudF93aXRoX2NvbW1hX3NlcGFyYXRvcn19IFZFRidcbiAgfSxcbiAgVk5EOiB7XG4gICAgJ21vbmV5X2Zvcm1hdCc6ICd7e2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcn19JiM4MzYzOycsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ3t7YW1vdW50X25vX2RlY2ltYWxzX3dpdGhfY29tbWFfc2VwYXJhdG9yfX0gVk5EJ1xuICB9LFxuICBYQlQ6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ3t7YW1vdW50X25vX2RlY2ltYWxzfX0gQlRDJyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAne3thbW91bnRfbm9fZGVjaW1hbHN9fSBCVEMnXG4gIH0sXG4gIFhPRjoge1xuICAgICdtb25leV9mb3JtYXQnOiAnQ0ZBe3thbW91bnR9fScsXG4gICAgJ21vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0JzogJ0NGQXt7YW1vdW50fX0gWE9GJ1xuICB9LFxuICBaTVc6IHtcbiAgICAnbW9uZXlfZm9ybWF0JzogJ0t7e2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcn19JyxcbiAgICAnbW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQnOiAnWk1Xe3thbW91bnRfbm9fZGVjaW1hbHNfd2l0aF9jb21tYV9zZXBhcmF0b3J9fSdcbiAgfVxufTtcblxuLyoqXG4gKiBGb3JtYXQgYSBudW1iZXIgdG8gYSBzcGVjaWZpYyBmb3JtYXRcbiAqXG4gKiBAcGFyYW0gbnVtYmVyIHtOdW1iZXJ9XG4gKiBAcGFyYW0gcHJlY2lzaW9uIHtOdW1iZXJ9XG4gKiBAcGFyYW0gdGhvdXNhbmRzIHtTdHJpbmd9XG4gKiBAcGFyYW0gZGVjaW1hbCB7U3RyaW5nfVxuICogQHJldHVybnMge1N0cmluZ31cbiAqL1xuZnVuY3Rpb24gZm9ybWF0V2l0aERlbGltaXRlcnMobnVtYmVyKSB7XG4gIHZhciBwcmVjaXNpb24gPSBhcmd1bWVudHMubGVuZ3RoID4gMSAmJiBhcmd1bWVudHNbMV0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1sxXSA6IDI7XG4gIHZhciB0aG91c2FuZHMgPSBhcmd1bWVudHMubGVuZ3RoID4gMiAmJiBhcmd1bWVudHNbMl0gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1syXSA6ICcsJztcbiAgdmFyIGRlY2ltYWwgPSBhcmd1bWVudHMubGVuZ3RoID4gMyAmJiBhcmd1bWVudHNbM10gIT09IHVuZGVmaW5lZCA/IGFyZ3VtZW50c1szXSA6ICcuJztcblxuICBpZiAoaXNOYU4obnVtYmVyKSB8fCAhbnVtYmVyKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cblxuICB2YXIgcHJlY2lzZU51bWJlciA9IChudW1iZXIgLyAxMDAuMCkudG9GaXhlZChwcmVjaXNpb24pO1xuXG4gIHZhciBwYXJ0cyA9IHByZWNpc2VOdW1iZXIuc3BsaXQodGhvdXNhbmRzKTtcbiAgdmFyIGRvbGxhcnNBbW91bnQgPSBwYXJ0c1swXS5yZXBsYWNlKC8oXFxkKSg/PShcXGRcXGRcXGQpKyg/IVxcZCkpL2csICckMScgKyB0aG91c2FuZHMpO1xuICB2YXIgY2VudHNBbW91bnQgPSBwYXJ0c1sxXSA/IGRlY2ltYWwgKyBwYXJ0c1sxXSA6ICcnO1xuXG4gIHJldHVybiBkb2xsYXJzQW1vdW50ICsgY2VudHNBbW91bnQ7XG59XG5cbi8qKlxuICogQ29udmVydCBhIG1vbmV5IHZhbHVlIGluIGNlbnRzIHRvIGEgZm9ybWF0dGVkIGN1cnJlbmN5IHN0cmluZ1xuICpcbiAqIEBwYXJhbSBjZW50cyB7TnVtYmVyfFN0cmluZ31cbiAqIEBwYXJhbSBmb3JtYXQge1N0cmluZ31cbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIGZvcm1hdE1vbmV5KGNlbnRzLCBmb3JtYXQpIHtcbiAgaWYgKHR5cGVvZiBjZW50cyA9PT0gJ3N0cmluZycpIHtcbiAgICBjZW50cyA9IGNlbnRzLnJlcGxhY2UoJy4nLCAnJyk7XG4gIH1cblxuICB2YXIgdmFsdWUgPSAnJztcbiAgdmFyIHBsYWNlaG9sZGVyUmVnZXggPSAvXFx7XFx7XFxzKihcXHcrKVxccypcXH1cXH0vO1xuXG4gIHN3aXRjaCAoZm9ybWF0Lm1hdGNoKHBsYWNlaG9sZGVyUmVnZXgpWzFdKSB7XG4gICAgY2FzZSAnYW1vdW50JzpcbiAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDIsICcsJywgJy4nKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Ftb3VudF93aXRoX3NwYWNlX3NlcGFyYXRvcic6XG4gICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAyLCAnICcsICcuJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhbW91bnRfd2l0aF9jb21tYV9zZXBhcmF0b3InOlxuICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMiwgJy4nLCAnLCcpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYW1vdW50X3dpdGhfYXBvc3Ryb3BoZV9zZXBhcmF0b3InOlxuICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMiwgJ1xcJycsICcuJyk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdhbW91bnRfbm9fZGVjaW1hbHMnOlxuICAgICAgdmFsdWUgPSBmb3JtYXRXaXRoRGVsaW1pdGVycyhjZW50cywgMCwgJywnLCAnLicpO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYW1vdW50X25vX2RlY2ltYWxzX3dpdGhfc3BhY2Vfc2VwYXJhdG9yJzpcbiAgICAgIHZhbHVlID0gZm9ybWF0V2l0aERlbGltaXRlcnMoY2VudHMsIDAsICcgJywgJy4nKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2Ftb3VudF9ub19kZWNpbWFsc193aXRoX2NvbW1hX3NlcGFyYXRvcic6XG4gICAgICB2YWx1ZSA9IGZvcm1hdFdpdGhEZWxpbWl0ZXJzKGNlbnRzLCAwLCAnLCcsICcuJyk7XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiBmb3JtYXQucmVwbGFjZShwbGFjZWhvbGRlclJlZ2V4LCB2YWx1ZSk7XG59XG5cbi8qKlxuICogUmV0dXJuIHRoZSB2YWx1ZSBvZiBtb25leSBpbiBjZW50cyB2YWx1ZVxuICpcbiAqIEBwYXJhbSBtb25leUFtb3VudCB7TnVtYmVyfVxuICogQHBhcmFtIGZvcm1hdCB7U3RyaW5nfVxuICogQHBhcmFtIGN1cnJlbmN5IHtTdHJpbmd9XG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQHByaXZhdGVcbiAqL1xuZnVuY3Rpb24gZ2V0Q2VudHNWYWx1ZShtb25leUFtb3VudCwgZm9ybWF0LCBjdXJyZW5jeSkge1xuICB2YXIgY2VudHMgPSAwO1xuICAvLyBDb252ZXJ0IHByaWNlcyBmcm9tIGZsb2F0IHZhbHVlcyB0byBpbnRlZ2VycyBpZiBuZWVkZWQsIHRoZW4gY29udmVydFxuICBpZiAoZm9ybWF0LmluZGV4T2YoJ2Ftb3VudF9ub19kZWNpbWFscycpICE9PSAtMSkge1xuICAgIGNlbnRzID0gbW9uZXlBbW91bnQgKiAxMDA7XG4gIH0gZWxzZSBpZiAoY3VycmVuY3kgPT09ICdKT0QnIHx8IGN1cnJlbmN5ID09PSAnS1dEJyB8fCBjdXJyZW5jeSA9PT0gJ0JIRCcpIHtcbiAgICBjZW50cyA9IG1vbmV5QW1vdW50IC8gMTA7XG4gIH0gZWxzZSB7XG4gICAgY2VudHMgPSBtb25leUFtb3VudDtcbiAgfVxuXG4gIHJldHVybiBjZW50cztcbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBmb3JtYXR0ZWQgbW9uZXkgdG8gYSBudW1iZXJcbiAqXG4gKiBAcGFyYW0gcHJpY2VFbCB7SFRNTEVsZW1lbnR9XG4gKiBAcmV0dXJucyB7TnVtYmVyfFN0cmluZ31cbiAqL1xuZnVuY3Rpb24gZ2V0TW9uZXlWYWx1ZShwcmljZUVsKSB7XG4gIHZhciBwcmljZSA9IHByaWNlRWwuaW5uZXJUZXh0O1xuICB2YXIgdmFsdWUgPSBwYXJzZUludChwcmljZS5yZXBsYWNlKC9bXjAtOV0vZywgJycpLCAxMCk7XG5cbiAgcmV0dXJuICFpc05hTih2YWx1ZSkgPyB2YWx1ZSA6ICcnO1xufVxuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG52YXIgQ3VycmVuY3lDb252ZXJ0ZXIgPSBmdW5jdGlvbiAoKSB7XG4gIGZ1bmN0aW9uIEN1cnJlbmN5Q29udmVydGVyKCkge1xuICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIEN1cnJlbmN5Q29udmVydGVyKTtcblxuICAgIC8qKlxuICAgICAqIEBwcm9wZXJ0eSB7b2JqZWN0fSBkZWZhdWx0cyAgICAgICAgICAgICAgICAgICAgICAgLSBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIGZvciBDdXJyZW5jeUNvbnZlcnRlclxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWZhdWx0cy5zd2l0Y2hlclNlbGVjdG9yICAgICAgLSBDU1MgU2VsZWN0b3IgZm9yIGRyb3Bkb3duIHdoaWNoIGNvbnRyb2xzIGN1cnJlbmN5IGNvbnZlcnNpb25cbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGVmYXVsdHMucHJpY2VTZWxlY3RvciAgICAgICAgIC0gQ1NTIFNlbGVjdG9yIGZvciBlbGVtZW50cyBjb250YWluaW5nIHByaWNlc1xuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWZhdWx0cy5zaG9wQ3VycmVuY3kgICAgICAgICAgLSBTaG9wJ3MgY3VycmVuY3kgKEN1cnJlbmN5IHdoaWNoIHByaWNlcyBhcmUgcHJpbnRlZCBhcylcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGVmYXVsdHMuZGVmYXVsdEN1cnJlbmN5ICAgICAgIC0gVGhlbWUncyBjdXJyZW5jeSBzZXR0aW5nLCBvciBpbml0aWFsIGN1cnJlbmN5IHRvIHNob3cgb24gdGhlIHBhZ2VcbiAgICAgKiBAcHJvcGVydHkge3N0cmluZ30gZGVmYXVsdHMuZGlzcGxheUZvcm1hdCAgICAgICAgIC0gYG1vbmV5X3dpdGhfY3VycmVuY3lfZm9ybWF0YCBvciBgbW9uZXlfZm9ybWF0YFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWZhdWx0cy5tb25leUZvcm1hdCAgICAgICAgICAgLSBTaG9wJ3MgY3VycmVuY3kgZm9ybWF0dGVkIHVzaW5nIHRoZSBkaXNwbGF5IGZvcm1hdFxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWZhdWx0cy5tb25leUZvcm1hdE5vQ3VycmVuY3kgLSBTaG9wJ3MgY3VycmVuY3kgZm9ybWF0dGVkIHdpdGhvdXQgc2hvd2luZyBjdXJyZW5jeVxuICAgICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWZhdWx0cy5tb25leUZvcm1hdEN1cnJlbmN5ICAgLSBTaG9wJ3MgY3VycmVuY3kgZm9ybWF0dGVkIHNob3dpbmcgY3VycmVuY3lcbiAgICAgKi9cbiAgICB0aGlzLmRlZmF1bHRzID0ge1xuICAgICAgc3dpdGNoZXJTZWxlY3RvcjogJ1tkYXRhLWN1cnJlbmN5LWNvbnZlcnRlcl0nLFxuICAgICAgcHJpY2VTZWxlY3RvcjogJy5tb25leScsXG4gICAgICBzaG9wQ3VycmVuY3k6ICcnLFxuICAgICAgZGVmYXVsdEN1cnJlbmN5OiAnJyxcbiAgICAgIGRpc3BsYXlGb3JtYXQ6ICcnLFxuICAgICAgbW9uZXlGb3JtYXQ6ICcnLFxuICAgICAgbW9uZXlGb3JtYXROb0N1cnJlbmN5OiAnJyxcbiAgICAgIG1vbmV5Rm9ybWF0Q3VycmVuY3k6ICcnXG4gICAgfTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHt9O1xuICAgIHRoaXMubW9uZXlGb3JtYXRzID0gbW9uZXlGb3JtYXRzO1xuICAgIHRoaXMuc3RvcmFnZSA9ICdjdXJyZW5jeSc7XG4gICAgdGhpcy5jdXJyZW50Q3VycmVuY3kgPSBudWxsO1xuICAgIHRoaXMuaXNJbml0aWFsaXNlZCA9IGZhbHNlO1xuICB9XG5cbiAgY3JlYXRlQ2xhc3MoQ3VycmVuY3lDb252ZXJ0ZXIsIFt7XG4gICAga2V5OiAnaW5pdCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGluaXQoc2V0dGluZ3MpIHtcbiAgICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICAgIGlmICghd2luZG93LkN1cnJlbmN5IHx8IHRoaXMuaXNJbml0aWFsaXNlZCkgcmV0dXJuO1xuXG4gICAgICBPYmplY3Qua2V5cyh0aGlzLmRlZmF1bHRzKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgX3RoaXMub3B0aW9uc1trZXldID0gc2V0dGluZ3Nba2V5XSB8fCBfdGhpcy5kZWZhdWx0c1trZXldO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuY3VycmVudEN1cnJlbmN5ID0gdGhpcy5fZ2V0U3RvcmVkQ3VycmVuY3koKSB8fCB0aGlzLm9wdGlvbnMuZGVmYXVsdEN1cnJlbmN5O1xuICAgICAgdGhpcy5tb25leUZvcm1hdHNbdGhpcy5vcHRpb25zLnNob3BDdXJyZW5jeV0ubW9uZXlfd2l0aF9jdXJyZW5jeV9mb3JtYXQgPSB0aGlzLm9wdGlvbnMubW9uZXlGb3JtYXRDdXJyZW5jeTtcbiAgICAgIHRoaXMubW9uZXlGb3JtYXRzW3RoaXMub3B0aW9ucy5zaG9wQ3VycmVuY3ldLm1vbmV5X2Zvcm1hdCA9IHRoaXMub3B0aW9ucy5tb25leUZvcm1hdE5vQ3VycmVuY3k7XG5cbiAgICAgIHRoaXMuaXNJbml0aWFsaXNlZCA9IHRydWU7XG4gICAgICB0aGlzLl9jdXJyZW50KCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hhbmdlIHRoZSBjdXJyZW5jeSB0byBhIG5ldyBjdXJyZW5jeSB1c2luZyBhbiBJU08gY3VycmVuY3kgY29kZVxuICAgICAqXG4gICAgICogQHBhcmFtIG5ld0N1cnJlbmN5XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3NldEN1cnJlbmN5JyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gc2V0Q3VycmVuY3kobmV3Q3VycmVuY3kpIHtcbiAgICAgIGlmICghdGhpcy5pc0luaXRpYWxpc2VkKSByZXR1cm47XG5cbiAgICAgIHRoaXMuX2NvbnZlcnRBbGwodGhpcy5jdXJyZW50Q3VycmVuY3ksIG5ld0N1cnJlbmN5KTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBVcGRhdGVzIGEgcHJpY2Ugb24gdGhlIHBhZ2UgdG8gdXNlIHRoZSBhY3RpdmUgQ3VycmVuY3ksIGFuZCBmb3JtYXR0aW5nXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcHJpY2VFbCB7SFRNTEVsZW1lbnR9XG4gICAgICovXG5cbiAgfSwge1xuICAgIGtleTogJ3VwZGF0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHVwZGF0ZShwcmljZUVsKSB7XG4gICAgICBpZiAoIXRoaXMuaXNJbml0aWFsaXNlZCkgcmV0dXJuO1xuXG4gICAgICB2YXIgYXR0cmlidXRlcyA9IHByaWNlRWwuYXR0cmlidXRlcztcbiAgICAgIGZvciAodmFyIGF0dHIgPSAwOyBhdHRyIDwgYXR0cmlidXRlcy5sZW5ndGg7IGF0dHIrKykge1xuICAgICAgICB2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlc1thdHRyXTtcblxuICAgICAgICBpZiAoYXR0cmlidXRlLm5hbWUuaW5kZXhPZignZGF0YS1jdXJyZW5jeScpID09PSAwKSB7XG4gICAgICAgICAgcHJpY2VFbC5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLm5hbWUsICcnKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB2YXIgbW9uZXlWYWx1ZSA9IGdldE1vbmV5VmFsdWUocHJpY2VFbCk7XG4gICAgICB2YXIgY2VudHNWYWx1ZSA9IGdldENlbnRzVmFsdWUobW9uZXlWYWx1ZSwgdGhpcy5vcHRpb25zLm1vbmV5Rm9ybWF0LCB0aGlzLm9wdGlvbnMuc2hvcEN1cnJlbmN5KTtcblxuICAgICAgLy8gQ2VudHMgdmFsdWUgaXMgZW1wdHksIGJ1dCBub3QgMC4gMCQgaXMgYSB2YWxpZCBwcmljZSwgd2hpbGUgZW1wdHkgaXMgbm90XG4gICAgICBpZiAoY2VudHNWYWx1ZSA9PT0gJycpIHJldHVybjtcblxuICAgICAgdmFyIHByaWNlRm9ybWF0dGVkID0gZm9ybWF0TW9uZXkoY2VudHNWYWx1ZSwgdGhpcy5vcHRpb25zLm1vbmV5Rm9ybWF0KTtcblxuICAgICAgcHJpY2VFbC5pbm5lckhUTUwgPSBwcmljZUZvcm1hdHRlZDtcbiAgICAgIHByaWNlRWwucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWN1cnJlbmN5Jyk7XG4gICAgICBwcmljZUVsLnNldEF0dHJpYnV0ZSgnZGF0YS1jdXJyZW5jeS0nICsgdGhpcy5vcHRpb25zLnNob3BDdXJyZW5jeSwgcHJpY2VGb3JtYXR0ZWQpO1xuICAgICAgcHJpY2VFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VycmVuY3knLCB0aGlzLm9wdGlvbnMuc2hvcEN1cnJlbmN5KTtcblxuICAgICAgdGhpcy5fY29udmVydEVsKHByaWNlRWwsIHRoaXMub3B0aW9ucy5zaG9wQ3VycmVuY3ksIHRoaXMuY3VycmVudEN1cnJlbmN5KTtcbiAgICB9XG4gIH0sIHtcbiAgICBrZXk6ICdfZ2V0U3RvcmVkQ3VycmVuY3knLFxuICAgIHZhbHVlOiBmdW5jdGlvbiBfZ2V0U3RvcmVkQ3VycmVuY3koKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5zdG9yYWdlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7XG4gICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZGVmYXVsdEN1cnJlbmN5O1xuICAgICAgfVxuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ19zZXRTdG9yZWRDdXJyZW5jeScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9zZXRTdG9yZWRDdXJyZW5jeShjdXJyZW5jeSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5zdG9yYWdlLCBjdXJyZW5jeSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLndhcm4oZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFVwZGF0ZSB0aGUgY3VycmVuY3kgc3dpdGNoZXIgdG8gdGhlIGN1cnJlbnQgY3VycmVuY3lcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfY3VycmVudCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jdXJyZW50KCkge1xuICAgICAgdmFyIHN3aXRjaGVycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodGhpcy5vcHRpb25zLnN3aXRjaGVyU2VsZWN0b3IpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzd2l0Y2hlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIHN3aXRjaGVyID0gc3dpdGNoZXJzW2ldO1xuXG4gICAgICAgIHZhciBjaGlsZHJlbkVscyA9IHN3aXRjaGVyLnF1ZXJ5U2VsZWN0b3JBbGwoJ29wdGlvbicpO1xuXG4gICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBjaGlsZHJlbkVscy5sZW5ndGg7IF9pKyspIHtcbiAgICAgICAgICB2YXIgb3B0aW9uRWwgPSBjaGlsZHJlbkVsc1tfaV07XG5cbiAgICAgICAgICBpZiAob3B0aW9uRWwuc2VsZWN0ZWQgJiYgb3B0aW9uRWwudmFsdWUgIT09IHRoaXMuY3VycmVudEN1cnJlbmN5KSB7XG4gICAgICAgICAgICBvcHRpb25FbC5zZWxlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChvcHRpb25FbC52YWx1ZSA9PT0gdGhpcy5jdXJyZW50Q3VycmVuY3kpIHtcbiAgICAgICAgICAgIG9wdGlvbkVsLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5fY29udmVydEFsbCh0aGlzLm9wdGlvbnMuc2hvcEN1cnJlbmN5LCB0aGlzLmN1cnJlbnRDdXJyZW5jeSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ29udmVydHMgYW4gaW5kaXZpZHVhbCBwcmljZSB0byB0aGUgbmV3IGZvcm1hdFxuICAgICAqXG4gICAgICogQHBhcmFtIHByaWNlRWxcbiAgICAgKiBAcGFyYW0gb2xkQ3VycmVuY3lcbiAgICAgKiBAcGFyYW0gbmV3Q3VycmVuY3lcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfY29udmVydEVsJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NvbnZlcnRFbChwcmljZUVsLCBvbGRDdXJyZW5jeSwgbmV3Q3VycmVuY3kpIHtcblxuICAgICAgLy8gSWYgdGhlIGFtb3VudCBoYXMgYWxyZWFkeSBiZWVuIGNvbnZlcnRlZCwgd2UgbGVhdmUgaXQgYWxvbmUuXG4gICAgICBpZiAocHJpY2VFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3VycmVuY3knKSA9PT0gbmV3Q3VycmVuY3kpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB3ZSBhcmUgY29udmVydGluZyB0byBhIGN1cnJlbmN5IHRoYXQgd2UgaGF2ZSBzYXZlZCwgd2Ugd2lsbCB1c2UgdGhlIHNhdmVkIGFtb3VudC5cbiAgICAgIGlmIChwcmljZUVsLmdldEF0dHJpYnV0ZSgnZGF0YS1jdXJyZW5jeS0nICsgbmV3Q3VycmVuY3kpKSB7XG4gICAgICAgIHByaWNlRWwuaW5uZXJIVE1MID0gcHJpY2VFbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtY3VycmVuY3ktJyArIG5ld0N1cnJlbmN5KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBvbGRGb3JtYXQgPSB0aGlzLm1vbmV5Rm9ybWF0c1tvbGRDdXJyZW5jeV1bdGhpcy5vcHRpb25zLmRpc3BsYXlGb3JtYXRdO1xuICAgICAgICB2YXIgbmV3Rm9ybWF0ID0gdGhpcy5tb25leUZvcm1hdHNbbmV3Q3VycmVuY3ldW3RoaXMub3B0aW9ucy5kaXNwbGF5Rm9ybWF0XTtcblxuICAgICAgICB2YXIgbW9uZXlWYWx1ZSA9IGdldE1vbmV5VmFsdWUocHJpY2VFbCk7XG4gICAgICAgIHZhciBjZW50c1ZhbHVlID0gZ2V0Q2VudHNWYWx1ZShtb25leVZhbHVlLCBvbGRGb3JtYXQsIG9sZEN1cnJlbmN5KTtcblxuICAgICAgICAvLyBDZW50cyB2YWx1ZSBpcyBlbXB0eSwgYnV0IG5vdCAwLiAwJCBpcyBhIHZhbGlkIHByaWNlLCB3aGlsZSBlbXB0eSBpcyBub3RcbiAgICAgICAgaWYgKGNlbnRzVmFsdWUgPT09ICcnKSByZXR1cm47XG5cbiAgICAgICAgdmFyIGNlbnRzID0gd2luZG93LkN1cnJlbmN5LmNvbnZlcnQoY2VudHNWYWx1ZSwgb2xkQ3VycmVuY3ksIG5ld0N1cnJlbmN5KTtcbiAgICAgICAgdmFyIHByaWNlRm9ybWF0dGVkID0gZm9ybWF0TW9uZXkoY2VudHMsIG5ld0Zvcm1hdCk7XG5cbiAgICAgICAgcHJpY2VFbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VycmVuY3ktJyArIG5ld0N1cnJlbmN5LCBwcmljZUZvcm1hdHRlZCk7XG4gICAgICAgIHByaWNlRWwuaW5uZXJIVE1MID0gcHJpY2VGb3JtYXR0ZWQ7XG4gICAgICB9XG5cbiAgICAgIHByaWNlRWwuc2V0QXR0cmlidXRlKCdkYXRhLWN1cnJlbmN5JywgbmV3Q3VycmVuY3kpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENvbnZlcnQgYWxsIHByaWNlcyBvbiB0aGUgcGFnZSB0byB0aGUgbmV3IGN1cnJlbmN5XG4gICAgICpcbiAgICAgKiBAcGFyYW0gb2xkQ3VycmVuY3lcbiAgICAgKiBAcGFyYW0gbmV3Q3VycmVuY3lcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqL1xuXG4gIH0sIHtcbiAgICBrZXk6ICdfY29udmVydEFsbCcsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9jb252ZXJ0QWxsKG9sZEN1cnJlbmN5LCBuZXdDdXJyZW5jeSkge1xuICAgICAgdmFyIHByaWNlRWxzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLm9wdGlvbnMucHJpY2VTZWxlY3Rvcik7XG4gICAgICBpZiAoIXByaWNlRWxzKSByZXR1cm47XG5cbiAgICAgIHRoaXMuY3VycmVudEN1cnJlbmN5ID0gbmV3Q3VycmVuY3k7XG4gICAgICB0aGlzLl9zZXRTdG9yZWRDdXJyZW5jeShuZXdDdXJyZW5jeSk7XG5cbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJpY2VFbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdGhpcy5fY29udmVydEVsKHByaWNlRWxzW2ldLCBvbGRDdXJyZW5jeSwgbmV3Q3VycmVuY3kpO1xuICAgICAgfVxuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gQ3VycmVuY3lDb252ZXJ0ZXI7XG59KCk7XG5cbnZhciBDdXJyZW5jeUNvbnZlcnRlciQxID0gbmV3IEN1cnJlbmN5Q29udmVydGVyKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gQ3VycmVuY3lDb252ZXJ0ZXIkMTtcbiIsIi8qIVxuICAqICRzY3JpcHQuanMgSlMgbG9hZGVyICYgZGVwZW5kZW5jeSBtYW5hZ2VyXG4gICogaHR0cHM6Ly9naXRodWIuY29tL2RlZC9zY3JpcHQuanNcbiAgKiAoYykgRHVzdGluIERpYXogMjAxNCB8IExpY2Vuc2UgTUlUXG4gICovXG5cbihmdW5jdGlvbiAobmFtZSwgZGVmaW5pdGlvbikge1xuICBpZiAodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykgbW9kdWxlLmV4cG9ydHMgPSBkZWZpbml0aW9uKClcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIGRlZmluZShkZWZpbml0aW9uKVxuICBlbHNlIHRoaXNbbmFtZV0gPSBkZWZpbml0aW9uKClcbn0pKCckc2NyaXB0JywgZnVuY3Rpb24gKCkge1xuICB2YXIgZG9jID0gZG9jdW1lbnRcbiAgICAsIGhlYWQgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXVxuICAgICwgcyA9ICdzdHJpbmcnXG4gICAgLCBmID0gZmFsc2VcbiAgICAsIHB1c2ggPSAncHVzaCdcbiAgICAsIHJlYWR5U3RhdGUgPSAncmVhZHlTdGF0ZSdcbiAgICAsIG9ucmVhZHlzdGF0ZWNoYW5nZSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICAgLCBsaXN0ID0ge31cbiAgICAsIGlkcyA9IHt9XG4gICAgLCBkZWxheSA9IHt9XG4gICAgLCBzY3JpcHRzID0ge31cbiAgICAsIHNjcmlwdHBhdGhcbiAgICAsIHVybEFyZ3NcblxuICBmdW5jdGlvbiBldmVyeShhciwgZm4pIHtcbiAgICBmb3IgKHZhciBpID0gMCwgaiA9IGFyLmxlbmd0aDsgaSA8IGo7ICsraSkgaWYgKCFmbihhcltpXSkpIHJldHVybiBmXG4gICAgcmV0dXJuIDFcbiAgfVxuICBmdW5jdGlvbiBlYWNoKGFyLCBmbikge1xuICAgIGV2ZXJ5KGFyLCBmdW5jdGlvbiAoZWwpIHtcbiAgICAgIHJldHVybiAhZm4oZWwpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uICRzY3JpcHQocGF0aHMsIGlkT3JEb25lLCBvcHREb25lKSB7XG4gICAgcGF0aHMgPSBwYXRoc1twdXNoXSA/IHBhdGhzIDogW3BhdGhzXVxuICAgIHZhciBpZE9yRG9uZUlzRG9uZSA9IGlkT3JEb25lICYmIGlkT3JEb25lLmNhbGxcbiAgICAgICwgZG9uZSA9IGlkT3JEb25lSXNEb25lID8gaWRPckRvbmUgOiBvcHREb25lXG4gICAgICAsIGlkID0gaWRPckRvbmVJc0RvbmUgPyBwYXRocy5qb2luKCcnKSA6IGlkT3JEb25lXG4gICAgICAsIHF1ZXVlID0gcGF0aHMubGVuZ3RoXG4gICAgZnVuY3Rpb24gbG9vcEZuKGl0ZW0pIHtcbiAgICAgIHJldHVybiBpdGVtLmNhbGwgPyBpdGVtKCkgOiBsaXN0W2l0ZW1dXG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbGxiYWNrKCkge1xuICAgICAgaWYgKCEtLXF1ZXVlKSB7XG4gICAgICAgIGxpc3RbaWRdID0gMVxuICAgICAgICBkb25lICYmIGRvbmUoKVxuICAgICAgICBmb3IgKHZhciBkc2V0IGluIGRlbGF5KSB7XG4gICAgICAgICAgZXZlcnkoZHNldC5zcGxpdCgnfCcpLCBsb29wRm4pICYmICFlYWNoKGRlbGF5W2RzZXRdLCBsb29wRm4pICYmIChkZWxheVtkc2V0XSA9IFtdKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgZWFjaChwYXRocywgZnVuY3Rpb24gbG9hZGluZyhwYXRoLCBmb3JjZSkge1xuICAgICAgICBpZiAocGF0aCA9PT0gbnVsbCkgcmV0dXJuIGNhbGxiYWNrKClcbiAgICAgICAgXG4gICAgICAgIGlmICghZm9yY2UgJiYgIS9eaHR0cHM/OlxcL1xcLy8udGVzdChwYXRoKSAmJiBzY3JpcHRwYXRoKSB7XG4gICAgICAgICAgcGF0aCA9IChwYXRoLmluZGV4T2YoJy5qcycpID09PSAtMSkgPyBzY3JpcHRwYXRoICsgcGF0aCArICcuanMnIDogc2NyaXB0cGF0aCArIHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGlmIChzY3JpcHRzW3BhdGhdKSB7XG4gICAgICAgICAgaWYgKGlkKSBpZHNbaWRdID0gMVxuICAgICAgICAgIHJldHVybiAoc2NyaXB0c1twYXRoXSA9PSAyKSA/IGNhbGxiYWNrKCkgOiBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgbG9hZGluZyhwYXRoLCB0cnVlKSB9LCAwKVxuICAgICAgICB9XG5cbiAgICAgICAgc2NyaXB0c1twYXRoXSA9IDFcbiAgICAgICAgaWYgKGlkKSBpZHNbaWRdID0gMVxuICAgICAgICBjcmVhdGUocGF0aCwgY2FsbGJhY2spXG4gICAgICB9KVxuICAgIH0sIDApXG4gICAgcmV0dXJuICRzY3JpcHRcbiAgfVxuXG4gIGZ1bmN0aW9uIGNyZWF0ZShwYXRoLCBmbikge1xuICAgIHZhciBlbCA9IGRvYy5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSwgbG9hZGVkXG4gICAgZWwub25sb2FkID0gZWwub25lcnJvciA9IGVsW29ucmVhZHlzdGF0ZWNoYW5nZV0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICBpZiAoKGVsW3JlYWR5U3RhdGVdICYmICEoL15jfGxvYWRlLy50ZXN0KGVsW3JlYWR5U3RhdGVdKSkpIHx8IGxvYWRlZCkgcmV0dXJuO1xuICAgICAgZWwub25sb2FkID0gZWxbb25yZWFkeXN0YXRlY2hhbmdlXSA9IG51bGxcbiAgICAgIGxvYWRlZCA9IDFcbiAgICAgIHNjcmlwdHNbcGF0aF0gPSAyXG4gICAgICBmbigpXG4gICAgfVxuICAgIGVsLmFzeW5jID0gMVxuICAgIGVsLnNyYyA9IHVybEFyZ3MgPyBwYXRoICsgKHBhdGguaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzIDogcGF0aDtcbiAgICBoZWFkLmluc2VydEJlZm9yZShlbCwgaGVhZC5sYXN0Q2hpbGQpXG4gIH1cblxuICAkc2NyaXB0LmdldCA9IGNyZWF0ZVxuXG4gICRzY3JpcHQub3JkZXIgPSBmdW5jdGlvbiAoc2NyaXB0cywgaWQsIGRvbmUpIHtcbiAgICAoZnVuY3Rpb24gY2FsbGJhY2socykge1xuICAgICAgcyA9IHNjcmlwdHMuc2hpZnQoKVxuICAgICAgIXNjcmlwdHMubGVuZ3RoID8gJHNjcmlwdChzLCBpZCwgZG9uZSkgOiAkc2NyaXB0KHMsIGNhbGxiYWNrKVxuICAgIH0oKSlcbiAgfVxuXG4gICRzY3JpcHQucGF0aCA9IGZ1bmN0aW9uIChwKSB7XG4gICAgc2NyaXB0cGF0aCA9IHBcbiAgfVxuICAkc2NyaXB0LnVybEFyZ3MgPSBmdW5jdGlvbiAoc3RyKSB7XG4gICAgdXJsQXJncyA9IHN0cjtcbiAgfVxuICAkc2NyaXB0LnJlYWR5ID0gZnVuY3Rpb24gKGRlcHMsIHJlYWR5LCByZXEpIHtcbiAgICBkZXBzID0gZGVwc1twdXNoXSA/IGRlcHMgOiBbZGVwc11cbiAgICB2YXIgbWlzc2luZyA9IFtdO1xuICAgICFlYWNoKGRlcHMsIGZ1bmN0aW9uIChkZXApIHtcbiAgICAgIGxpc3RbZGVwXSB8fCBtaXNzaW5nW3B1c2hdKGRlcCk7XG4gICAgfSkgJiYgZXZlcnkoZGVwcywgZnVuY3Rpb24gKGRlcCkge3JldHVybiBsaXN0W2RlcF19KSA/XG4gICAgICByZWFkeSgpIDogIWZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIGRlbGF5W2tleV0gPSBkZWxheVtrZXldIHx8IFtdXG4gICAgICBkZWxheVtrZXldW3B1c2hdKHJlYWR5KVxuICAgICAgcmVxICYmIHJlcShtaXNzaW5nKVxuICAgIH0oZGVwcy5qb2luKCd8JykpXG4gICAgcmV0dXJuICRzY3JpcHRcbiAgfVxuXG4gICRzY3JpcHQuZG9uZSA9IGZ1bmN0aW9uIChpZE9yRG9uZSkge1xuICAgICRzY3JpcHQoW251bGxdLCBpZE9yRG9uZSlcbiAgfVxuXG4gIHJldHVybiAkc2NyaXB0XG59KTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmNvbnN0IGV2ZW50SGFuZGxlcnMgPSBbXTtcbmxldCBwcmV2aW91c0JyZWFrcG9pbnQgPSBudWxsO1xuXG4kKHdpbmRvdykub24oJ3Jlc2l6ZScsIChldmVudCkgPT4ge1xuICBjb25zdCBjdXJyZW50QnJlYWtwb2ludCA9IGdldEJyZWFrcG9pbnQoKTtcblxuICBpZiAocHJldmlvdXNCcmVha3BvaW50ICE9PSBjdXJyZW50QnJlYWtwb2ludCkge1xuICAgIGV2ZW50SGFuZGxlcnMuZm9yRWFjaCgoZXZlbnRIYW5kbGVyKSA9PiB7XG4gICAgICBldmVudEhhbmRsZXIoZXZlbnQsIHtcbiAgICAgICAgcHJldmlvdXM6IHByZXZpb3VzQnJlYWtwb2ludCxcbiAgICAgICAgY3VycmVudDogY3VycmVudEJyZWFrcG9pbnQsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByZXZpb3VzQnJlYWtwb2ludCA9IGN1cnJlbnRCcmVha3BvaW50O1xufSk7XG5cbmZ1bmN0aW9uIGdldEJyZWFrcG9pbnQoKSB7XG4gIHJldHVybiB3aW5kb3dcbiAgICAuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICc6YWZ0ZXInKVxuICAgIC5nZXRQcm9wZXJ0eVZhbHVlKCdjb250ZW50JylcbiAgICAucmVwbGFjZSgvXCIvZywgJycpO1xufVxuXG5mdW5jdGlvbiBpc0JyZWFrcG9pbnQoYnJlYWtwb2ludCkge1xuICByZXR1cm4gZ2V0QnJlYWtwb2ludCgpID09PSBicmVha3BvaW50O1xufVxuXG5mdW5jdGlvbiBvbkJyZWFrcG9pbnRDaGFuZ2UoZXZlbnRIYW5kbGVyKSB7XG4gIGlmIChldmVudEhhbmRsZXJzLmluZGV4T2YoZXZlbnRIYW5kbGVyKSA9PT0gLTEpIHtcbiAgICBldmVudEhhbmRsZXJzLnB1c2goZXZlbnRIYW5kbGVyKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBvZmZCcmVha3BvaW50Q2hhbmdlKGV2ZW50SGFuZGxlcikge1xuICBjb25zdCBpbmRleCA9IGV2ZW50SGFuZGxlcnMuaW5kZXhPZihldmVudEhhbmRsZXIpO1xuXG4gIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICBldmVudEhhbmRsZXJzLnNwbGljZShpbmRleCwgMSk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBpc0JyZWFrcG9pbnQsXG4gIG9uQnJlYWtwb2ludENoYW5nZSxcbiAgb2ZmQnJlYWtwb2ludENoYW5nZSxcbn07XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5jb25zdCBpZ25vcmVkRWxzID0gW1xuICAnZGF0YS1tb2JpbGUtbmF2JyxcbiAgJ2RhdGEtc2l0ZS1uYXZpZ2F0aW9uJyxcbl07XG5cbmZ1bmN0aW9uIGlzSWdub3JlZChlbGVtZW50KSB7XG4gIC8vIERpc2FsbG93IGlmIGVsZW1lbnQgaXMgYSA8c2NyaXB0PlxuICBpZiAoZWxlbWVudC50YWdOYW1lID09PSAnU0NSSVBUJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gQWxsb3cgaWYgZWxlbWVudCBoYXMgbm8gYXR0cmlidXRlc1xuICBpZiAoZWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIGFueSBhdHRyaWJ1dGVzIG1hdGNoIHRvIHRoZSBpZ25vcmUgbGlzdFxuICByZXR1cm4gW10uc2xpY2UuY2FsbChlbGVtZW50LmF0dHJpYnV0ZXMpLnNvbWUoKGF0dHIpID0+IHtcbiAgICByZXR1cm4gaWdub3JlZEVscy5pbmRleE9mKGF0dHIubmFtZSkgIT09IC0xO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG9mZnNldCBvZiB0aGUgaGVhZGVyXG4gKlxuICogQHBhcmFtIHtIVE1MRWxlbWVudH0gaGVhZGVyXG4gKiBAcGFyYW0ge0Jvb2xlYW59IHdpdGhBbm5vdW5jZW1lbnRCYXJcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGdldEhlYWRlck9mZnNldChoZWFkZXIsIHdpdGhBbm5vdW5jZW1lbnRCYXIgPSBmYWxzZSkge1xuICBjb25zdCBoZWFkZXJFbHMgPSBoZWFkZXIuY2hpbGROb2RlcztcbiAgY29uc3QgaXNTdGlja3kgPSBoZWFkZXIucXVlcnlTZWxlY3RvcignW2RhdGEtc2l0ZS1oZWFkZXItc3RpY2t5XScpO1xuICBjb25zdCB7IHBhZ2VZT2Zmc2V0IH0gPSB3aW5kb3c7XG4gIGxldCBvZmZzZXQgPSAwO1xuXG4gIGlmIChpc1N0aWNreSkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVhZGVyRWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGVhZGVyRWxzW2ldIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgIWlzSWdub3JlZChoZWFkZXJFbHNbaV0pKSB7XG4gICAgICAgIG9mZnNldCArPSBoZWFkZXJFbHNbaV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICgkKGhlYWRlcikuaGFzQ2xhc3MoJ3NpdGUtaGVhZGVyLXN0aWNreS0tb3BlbicpIHx8IHBhZ2VZT2Zmc2V0ID09PSAwKSB7XG4gICAgICBvZmZzZXQgKz0gaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNpdGUtbmF2aWdhdGlvbl0nKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIElmIGlzIG5vdCBzdGlja3kgaGVhZGVyLCB0aGVuIERPTSBjYW4gYmUgdHJ1c3RlZCB0byByZXR1cm4gdmFsdWVzXG4gICAgY29uc3QgeyBib3R0b20gfSA9IGhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgIG9mZnNldCA9IGJvdHRvbSA+IDAgPyBib3R0b20gOiAwO1xuICB9XG5cbiAgaWYgKHdpdGhBbm5vdW5jZW1lbnRCYXIpIHtcbiAgICBvZmZzZXQgKz0gcGFyc2VJbnQoaGVhZGVyLnN0eWxlLnRvcCwgMTApIHx8IDA7XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0O1xufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi4vTGF5b3V0JztcbmltcG9ydCBnZXRIZWFkZXJPZmZzZXQgZnJvbSAnLi4vaGVscGVycy9nZXRIZWFkZXJPZmZzZXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGlja3lIZWFkZXIge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zLCBzZXR0aW5ncykge1xuICAgIHRoaXMucG9zdE1lc3NhZ2UgPSBvcHRpb25zLnBvc3RNZXNzYWdlO1xuICAgIHRoaXMuJGJvZHkgPSAkKGRvY3VtZW50LmJvZHkpO1xuICAgIHRoaXMuJHdpbmRvdyA9ICQod2luZG93KTtcbiAgICB0aGlzLiRzaXRlTWFpbiA9ICQoJy5zaXRlLW1haW4nKTtcblxuICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XG4gICAgdGhpcy4kdG9nZ2xlID0gb3B0aW9ucy4kdG9nZ2xlO1xuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblxuICAgIHRoaXMuc3RpY2t5Q2xhc3MgPSAnc2l0ZS1oZWFkZXItc3RpY2t5JztcbiAgICB0aGlzLnNjcm9sbGVkQ2xhc3MgPSAnc2l0ZS1oZWFkZXItc3RpY2t5LS1zY3JvbGxlZCc7XG4gICAgdGhpcy5uYXZPcGVuQ2xhc3MgPSAnc2l0ZS1oZWFkZXItc3RpY2t5LS1vcGVuJztcblxuICAgIHRoaXMuJGFubm91bmNlbWVudEJhciA9IHRoaXMuJGVsLmZpbmQoJy5hbm5vdW5jZW1lbnQtYmFyJyk7XG4gICAgdGhpcy5oZWFkZXIgPSB0aGlzLiRlbFswXTtcblxuICAgIGlmICghdGhpcy5zZXR0aW5ncy5zdGlja3lfaGVhZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc3RpY2t5UmVzZXQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXZlcnQgbmF2aWdhdGlvbiB0byBvcmlnaW5hbCBzdGF0ZSBvbiBicmVha3BvaW50IGNoYW5nZVxuICAgIHRoaXMubmF2VmlzaWJpbGl0eSA9IHRoaXMubmF2VmlzaWJpbGl0eS5iaW5kKHRoaXMpO1xuICAgIGxheW91dC5vbkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5uYXZWaXNpYmlsaXR5KTtcblxuICAgIHRoaXMuX3N0aWNreU9mZnNldCA9IHRoaXMuX3N0aWNreU9mZnNldC5iaW5kKHRoaXMpO1xuICAgIGxheW91dC5vbkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5fc3RpY2t5T2Zmc2V0KTtcblxuICAgIHRoaXMuX3RvZ2dsZVN0aWNreUhlYWRlciA9IHRoaXMuX3RvZ2dsZVN0aWNreUhlYWRlci5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2hlYWRlckNoZWNrZXIgPSB0aGlzLl9oZWFkZXJDaGVja2VyLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9pbml0KCk7XG4gIH1cblxuICBjbG9zZU5hdmlnYXRpb24oKSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnN0aWNreV9oZWFkZXIpIHJldHVybjtcblxuICAgIHRoaXMuJGVsLnJlbW92ZUNsYXNzKHRoaXMubmF2T3BlbkNsYXNzKS5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgdGhpcy4kYm9keS50cmlnZ2VyKCdwb3NpdGlvbi1iYW5uZXJzJyk7XG4gICAgfSk7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSgnbmF2OmNsb3NlLWFsbCcpO1xuICB9XG5cbiAgb3Blbk5hdmlnYXRpb24oKSB7XG4gICAgdGhpcy4kZWwuYWRkQ2xhc3ModGhpcy5uYXZPcGVuQ2xhc3MpLm9uZSgndHJlbmQnLCAoKSA9PiB7XG4gICAgICB0aGlzLiRib2R5LnRyaWdnZXIoJ3Bvc2l0aW9uLWJhbm5lcnMnKTtcbiAgICB9KTtcbiAgfVxuXG4gIG5hdlZpc2liaWxpdHkoZXZlbnQsIGJyZWFrcG9pbnRzKSB7XG4gICAgaWYgKGJyZWFrcG9pbnRzLnByZXZpb3VzID09PSAnTCcpIHRoaXMuY2xvc2VOYXZpZ2F0aW9uKCk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKCF0aGlzLnNldHRpbmdzLnN0aWNreV9oZWFkZXIpIHJldHVybjtcblxuICAgIHRoaXMuJGJvZHkucmVtb3ZlQ2xhc3ModGhpcy5zdGlja3lDbGFzcykucmVtb3ZlQ2xhc3ModGhpcy5zY3JvbGxlZENsYXNzKTtcblxuICAgIHRoaXMuJHRvZ2dsZS5vZmYoJy5zdGlja3ktaGVhZGVyJyk7XG4gICAgdGhpcy4kd2luZG93Lm9mZignLnN0aWNreS1oZWFkZXInKTtcblxuICAgIGxheW91dC5vZmZCcmVha3BvaW50Q2hhbmdlKHRoaXMubmF2VmlzaWJpbGl0eSk7XG4gICAgbGF5b3V0Lm9mZkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5fc3RpY2t5T2Zmc2V0KTtcblxuICAgIGlmICh0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkKSB7XG4gICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCk7XG4gICAgfVxuICB9XG5cbiAgX2luaXQoKSB7XG4gICAgdGhpcy5fc3RpY2t5T2Zmc2V0KHRydWUpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcblxuICAgIGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7XG4gICAgICB0aGlzLl9oZWFkZXJDaGVja2VyKCk7XG4gICAgfVxuICB9XG5cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgdGhpcy4kdG9nZ2xlLm9uKCdjbGljay5zdGlja3ktaGVhZGVyJywgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSB0aGlzLl9zbGlkZVRvZ2dsZSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kd2luZG93Lm9uKCdzY3JvbGwuc3RpY2t5LWhlYWRlcicsIHRoaXMuX3RvZ2dsZVN0aWNreUhlYWRlcik7XG4gIH1cblxuICBfc3RpY2t5UmVzZXQoKSB7XG4gICAgdGhpcy4kc2l0ZU1haW4uY3NzKCdwYWRkaW5nVG9wJywgJycpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSB0aGUgb2Zmc2V0IHdoZW4gYnJlYWtwb2ludHMgY2hhbmdlXG4gICAqICAtIE9mZnNldCBpcyB1c2VkIHRvIGRldGVybWluZSBzY3JvbGwgdGhyZXNob2xkXG4gICAqICAtIE9mZnNldCBpcyB1c2VkIHRvIHNldCBhIGJvZHkgb2Zmc2V0IG9uIGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBTdGlja3lcbiAgICpcbiAgICogQHBhcmFtIGlzSW5pdFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3N0aWNreU9mZnNldChpc0luaXQpIHtcbiAgICBpZiAoIXRoaXMuJGJvZHkuaGFzQ2xhc3ModGhpcy5zdGlja3lDbGFzcykpIHtcbiAgICAgIHRoaXMuJGJvZHkuYWRkQ2xhc3ModGhpcy5zdGlja3lDbGFzcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgb2Zmc2V0ID0gZ2V0SGVhZGVyT2Zmc2V0KHRoaXMuaGVhZGVyKTtcblxuICAgIHRoaXMuJHNpdGVNYWluLmNzcygncGFkZGluZ1RvcCcsIG9mZnNldCk7XG5cbiAgICBpZiAoaXNJbml0KSB7XG4gICAgICB0aGlzLl90b2dnbGVTdGlja3lIZWFkZXIoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBvciBjbG9zZSB0aGUgbmF2aWdhdGlvblxuICAgKlxuICAgKiBAcGFyYW0gb3BlblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3NsaWRlVG9nZ2xlKG9wZW4gPSBmYWxzZSkge1xuICAgIGlmICh0aGlzLiRlbC5oYXNDbGFzcyh0aGlzLm5hdk9wZW5DbGFzcykgJiYgIW9wZW4pIHtcbiAgICAgIHRoaXMuY2xvc2VOYXZpZ2F0aW9uKCk7XG4gICAgICB0aGlzLiR0b2dnbGUucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9wZW5OYXZpZ2F0aW9uKCk7XG4gICAgICB0aGlzLiR0b2dnbGUuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gaGlkZVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3RvZ2dsZUFubm91bmNlbWVudEJhcihoaWRlID0gZmFsc2UpIHtcbiAgICBpZiAoIXRoaXMuJGFubm91bmNlbWVudEJhci5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdG9wID0gMDtcblxuICAgIGlmIChoaWRlKSB7XG4gICAgICBjb25zdCBtb2JpbGVPbmx5ID0gdGhpcy4kYW5ub3VuY2VtZW50QmFyLmhhc0NsYXNzKCdvbmx5LW1vYmlsZScpO1xuXG4gICAgICBpZiAoKGxheW91dC5pc0JyZWFrcG9pbnQoJ1hTJykgJiYgbW9iaWxlT25seSkgfHwgIW1vYmlsZU9ubHkpIHtcbiAgICAgICAgdG9wID0gdGhpcy4kYW5ub3VuY2VtZW50QmFyLm91dGVySGVpZ2h0KCkgKiAtMTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLiRlbC5jc3MoJ3RvcCcsIHRvcCkub25lKCd0cmVuZCcsICgpID0+IHtcbiAgICAgIHRoaXMuJGJvZHkudHJpZ2dlcigncG9zaXRpb24tYmFubmVycycpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0aWNreSBoZWFkZXIgb25seSBzaG93cyBhcyBzdGlja3kgYWZ0ZXIgc2Nyb2xsXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdG9nZ2xlU3RpY2t5SGVhZGVyKCkge1xuICAgIGlmICh0aGlzLiRib2R5Lmhhc0NsYXNzKCdzY3JvbGwtbG9jaycpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2Nyb2xsVGhyZXNob2xkID0gZ2V0SGVhZGVyT2Zmc2V0KHRoaXMuaGVhZGVyKSArIDIwOyAvLyBFeHRlbmQgdGhyZXNob2xkIDIwcHggcGFzdCBoZWFkZXJcbiAgICBjb25zdCBzaG91bGRTaHJpbmsgPSB3aW5kb3cucGFnZVlPZmZzZXQgPiBzY3JvbGxUaHJlc2hvbGQ7XG5cbiAgICAvLyBTdGlja3kgaGVhZGVyIGlzIHNjcm9sbGVkLCBpcyBhbmQgaXMgdmlzaWJsZSAtLSBub3RoaW5nIG1vcmUgdG8gZG8hXG4gICAgaWYgKHNob3VsZFNocmluayAmJiB0aGlzLiRib2R5Lmhhc0NsYXNzKHRoaXMuc2Nyb2xsZWRDbGFzcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkU2hyaW5rKSB7XG4gICAgICB0aGlzLl9zaHJpbmsoKTtcbiAgICAgIHRoaXMuX3RvZ2dsZUFubm91bmNlbWVudEJhcih0cnVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fZXhwYW5kKCk7XG4gICAgICB0aGlzLl90b2dnbGVBbm5vdW5jZW1lbnRCYXIoZmFsc2UpO1xuICAgIH1cbiAgfVxuXG4gIF9zaHJpbmsoKSB7XG4gICAgdGhpcy5jbG9zZU5hdmlnYXRpb24oKTtcbiAgICB0aGlzLiR0b2dnbGUucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuXG4gICAgdGhpcy4kZWxcbiAgICAgIC5yZXZlYWxlcignc2hvdycpXG4gICAgICAub25lKCdyZXZlYWxlci1hbmltYXRpbmcuc3RpY2t5LWhlYWRlcicsICgpID0+IHtcbiAgICAgICAgdGhpcy4kYm9keS5hZGRDbGFzcyh0aGlzLnNjcm9sbGVkQ2xhc3MpLm9uZSgndHJlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgdGhpcy4kYm9keS50cmlnZ2VyKCdwb3NpdGlvbi1iYW5uZXJzJyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gIH1cblxuICBfZXhwYW5kKCkge1xuICAgIHRoaXMub3Blbk5hdmlnYXRpb24oKTtcblxuICAgIHRoaXMuJGVsXG4gICAgICAucmV2ZWFsZXIoJ2hpZGUnKVxuICAgICAgLm9uZSgncmV2ZWFsZXItYW5pbWF0aW5nLnN0aWNreS1oZWFkZXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuJGJvZHkucmVtb3ZlQ2xhc3ModGhpcy5zY3JvbGxlZENsYXNzKS5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICAgIHRoaXMuJGJvZHkudHJpZ2dlcigncG9zaXRpb24tYmFubmVycycpO1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAub25lKCdyZXZlYWxlci1oaWRlLnN0aWNreS1oZWFkZXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuJHRvZ2dsZS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIF9oZWFkZXJDaGVja2VyKCkge1xuICAgIC8vIFBlcmlvZGljYWxseSBjaGVjayB0byBtYWtlIHN1cmUgaGVhZGVyIGlzIG9mZnNldCBjb3JyZWN0bHlcbiAgICB0aGlzLnJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9oZWFkZXJDaGVja2VyKTtcblxuICAgIGlmICghdGhpcy4kYm9keS5oYXNDbGFzcyh0aGlzLnNjcm9sbGVkQ2xhc3MpKSB7XG4gICAgICB0aGlzLl9zdGlja3lPZmZzZXQoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEFjY29yZGlvbiB7XG4gIGNvbnN0cnVjdG9yKCRlbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy4kZWwgPSAkZWw7XG5cbiAgICB0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwge1xuICAgICAgYWN0aXZlQ2xhc3M6ICdhY2NvcmRpb24tLWFjdGl2ZScsXG4gICAgICBhdXRvQ29sbGFwc2U6IGZhbHNlLFxuICAgICAgY29udGVudDogJ1tkYXRhLWFjY29yZGlvbi1jb250ZW50XScsXG4gICAgICBlbGlnaWJsZUNsYXNzOiAnaGFzLWFjY29yZGlvbicsXG4gICAgfSwgb3B0aW9ucyk7XG4gIH1cblxuICB0b2dnbGUoJGJsb2NrLCBvcGVuID0gZmFsc2UpIHtcbiAgICBpZiAob3BlbiB8fCAhJGJsb2NrLmhhc0NsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuYXV0b0NvbGxhcHNlKSB0aGlzLmNsb3NlT3BlbigpO1xuICAgICAgdGhpcy5fb3BlbigkYmxvY2spO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9jbG9zZSgkYmxvY2spO1xuICAgIH1cbiAgfVxuXG4gIGNsb3NlT3BlbigpIHtcbiAgICAkKHRoaXMuJGVsLmZpbmQoYC4ke3RoaXMub3B0aW9ucy5hY3RpdmVDbGFzc31gKSkuZWFjaCgoaSwgYmxvY2spID0+IHtcbiAgICAgIGNvbnN0ICRibG9jayA9ICQoYmxvY2spO1xuICAgICAgaWYgKCRibG9jay5oYXNDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlKCRibG9jayk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBvcGVuQWxsKCkge1xuICAgICQodGhpcy4kZWwuZmluZChgLiR7dGhpcy5vcHRpb25zLmVsaWdpYmxlQ2xhc3N9YCkpLmVhY2goKGksIGJsb2NrKSA9PiB7XG4gICAgICB0aGlzLl9vcGVuKCQoYmxvY2spLCAwKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9vcGVuKCRibG9jaykge1xuICAgICRibG9jay5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO1xuICB9XG5cbiAgX2Nsb3NlKCRibG9jaykge1xuICAgICRibG9jay5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5pbXBvcnQgQWNjb3JkaW9uIGZyb20gJy4uL0FjY29yZGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdk1vYmlsZVN1Yk1lbnVzIHtcbiAgY29uc3RydWN0b3IoJGVsKSB7XG4gICAgdGhpcy4kZWwgPSAkZWw7XG5cbiAgICB0aGlzLkFjY29yZGlvbiA9IG5ldyBBY2NvcmRpb24odGhpcy4kZWwsIHtcbiAgICAgIGFjdGl2ZUNsYXNzOiAndmlzaWJsZScsXG4gICAgICBjb250ZW50OiAnW2RhdGEtYWNjb3JkaW9uLWNvbnRlbnRdJyxcbiAgICB9KTtcblxuICAgIC8vIFN1YiBtZW51IHNlbGVjdG9yc1xuICAgIHRoaXMuYWN0aXZlTWVudUNsYXNzID0gJ25hdm1lbnUtbGluay1wYXJlbnQtYWN0aXZlJztcbiAgICB0aGlzLmFjdGl2ZU1lbnUgPSBgLiR7dGhpcy5hY3RpdmVNZW51Q2xhc3N9YDtcbiAgICB0aGlzLm5hdlRyaWdnZXIgPSAnW2RhdGEtbmF2bWVudS10cmlnZ2VyXSc7XG4gICAgdGhpcy5zdWJNZW51ID0gJ1tkYXRhLW5hdm1lbnUtc3VibWVudV0nO1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICB9XG5cbiAgdW5sb2FkKCkge1xuICAgIHRoaXMuJGVsLm9mZignLm1vYmlsZS1uYXYnKTtcblxuICAgIGRlbGV0ZSB0aGlzLkFjY29yZGlvbjtcbiAgfVxuXG4gIGNsb3NlU3ViTWVudXMoJGN1cnJlbnQpIHtcbiAgICAkY3VycmVudC5maW5kKHRoaXMuYWN0aXZlTWVudSkuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XG4gICAgICB0aGlzLl9jbG9zZVN1Ym1lbnUoJChlbCkpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VBbGxTdWJtZW51cygpIHtcbiAgICB0aGlzLkFjY29yZGlvbi5jbG9zZU9wZW4oKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIC8vIFByZXZlbnQgZm9jdXMgc3RhdGUgZnJvbSBhcHBseWluZyBvbiBtb3VzZSBjbGlja1xuICAgIHRoaXMuJGVsLm9uKCdtb3VzZWRvd24ubW9iaWxlLW5hdicsICcubmF2bWVudS1saW5rJywgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kZWwub24oJ2NsaWNrLm1vYmlsZS1uYXYnLCBgJHt0aGlzLm5hdlRyaWdnZXJ9ID4gLm5hdm1lbnUtbGluay1wYXJlbnRgLCAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLl90b2dnbGVTdWJtZW51KGV2ZW50KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zZWxlY3RTdWJNZW51KCR0YXJnZXQpIHtcbiAgICByZXR1cm4gJHRhcmdldC5uZXh0KHRoaXMuc3ViTWVudSk7XG4gIH1cblxuICBfdG9nZ2xlU3VibWVudShldmVudCkge1xuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuXG4gICAgaWYgKCR0YXJnZXQuaGFzQ2xhc3ModGhpcy5hY3RpdmVNZW51Q2xhc3MpKSB7XG4gICAgICB0aGlzLl9jbG9zZVN1Ym1lbnUoJHRhcmdldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX29wZW5TdWJtZW51KCR0YXJnZXQpO1xuICAgIH1cbiAgfVxuXG4gIF9vcGVuU3VibWVudSgkdGFyZ2V0KSB7XG4gICAgY29uc3QgJG1lbnUgPSB0aGlzLl9zZWxlY3RTdWJNZW51KCR0YXJnZXQpO1xuXG4gICAgJHRhcmdldFxuICAgICAgLmFkZENsYXNzKHRoaXMuYWN0aXZlTWVudUNsYXNzKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCB0cnVlKTtcbiAgICB0aGlzLkFjY29yZGlvbi50b2dnbGUoJG1lbnUpO1xuICB9XG5cbiAgX2Nsb3NlU3VibWVudSgkdGFyZ2V0KSB7XG4gICAgY29uc3QgJG1lbnUgPSB0aGlzLl9zZWxlY3RTdWJNZW51KCR0YXJnZXQpO1xuXG4gICAgJHRhcmdldFxuICAgICAgLnJlbW92ZUNsYXNzKHRoaXMuYWN0aXZlTWVudUNsYXNzKVxuICAgICAgLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCBmYWxzZSk7XG4gICAgdGhpcy5BY2NvcmRpb24udG9nZ2xlKCRtZW51KTtcbiAgICB0aGlzLmNsb3NlU3ViTWVudXMoJG1lbnUpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5pbXBvcnQgTmF2TW9iaWxlU3ViTWVudXMgZnJvbSAnLi9OYXZNb2JpbGVTdWJNZW51cyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdk1vYmlsZSB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRzKSB7XG4gICAgdGhpcy4kYm9keSA9ICQoZG9jdW1lbnQuYm9keSk7XG4gICAgdGhpcy4kd2luZG93ID0gJCh3aW5kb3cpO1xuICAgIHRoaXMuJGVsID0gZWxlbWVudHMuJGVsO1xuICAgIHRoaXMuJHRvZ2dsZU9wZW4gPSBlbGVtZW50cy4kdG9nZ2xlT3BlbjtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuc3ViTWVudXMgPSBudWxsO1xuXG4gICAgdGhpcy4kbW9iaWxlTmF2ID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtbW9iaWxlLW5hdl0nKTtcbiAgICB0aGlzLiRwYW5lbCA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLW1vYmlsZS1uYXYtcGFuZWxdJyk7XG4gICAgdGhpcy4kb3ZlcmxheSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLW1vYmlsZS1uYXYtb3ZlcmxheV0nKTtcbiAgICB0aGlzLiR0b2dnbGVDbG9zZSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLW1vYmlsZS1uYXYtY2xvc2VdJyk7XG5cbiAgICAvLyBSZXZlcnQgbmF2aWdhdGlvbiB0byBvcmlnaW5hbCBzdGF0ZSBvbiBicmVha3BvaW50IGNoYW5nZVxuICAgIHRoaXMubGF5b3V0SGFuZGxlciA9IHRoaXMub25CcmVha3BvaW50Q2hhbmdlLmJpbmQodGhpcyk7XG4gICAgbGF5b3V0Lm9uQnJlYWtwb2ludENoYW5nZSh0aGlzLmxheW91dEhhbmRsZXIpO1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICB9XG5cbiAgdW5sb2FkKCkge1xuICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgdGhpcy4kd2luZG93Lm9mZigncmVzaXplLm1vYmlsZS1uYXYnKTtcbiAgICBsYXlvdXQub2ZmQnJlYWtwb2ludENoYW5nZSh0aGlzLmxheW91dEhhbmRsZXIpO1xuICB9XG5cbiAgb25CcmVha3BvaW50Q2hhbmdlKCkge1xuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdMJykgJiYgdGhpcy5pc09wZW4pIHtcbiAgICAgIHRoaXMuX2Nsb3NlKCk7XG4gICAgfVxuICB9XG5cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgdGhpcy4kdG9nZ2xlT3Blbi5vbignY2xpY2subW9iaWxlLW5hdicsIChldmVudCkgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgaWYgKCFsYXlvdXQuaXNCcmVha3BvaW50KCdMJykpIHRoaXMuX29wZW4oKTtcbiAgICB9KTtcblxuICAgIHRoaXMuJHdpbmRvdy5vbigncmVzaXplLm1vYmlsZS1uYXYnLCAoKSA9PiB7XG4gICAgICB0aGlzLiRlbC5maW5kKCdbZGF0YS1tZW51LXRvZ2dsZV0nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG5cbiAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICB0aGlzLl9zZXRQYW5lbEhlaWdodCgpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgX3NldFBhbmVsSGVpZ2h0KCkge1xuICAgIHRoaXMuJHBhbmVsLmhlaWdodCh3aW5kb3cuaW5uZXJIZWlnaHQpO1xuICB9XG5cbiAgX29wZW4oKSB7XG4gICAgdGhpcy4kYm9keS5hZGRDbGFzcygnc2Nyb2xsLWxvY2snKTtcbiAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG5cbiAgICAvLyBBY3RpdmF0ZSBTdWJtZW51IGhhbmRsZXJcbiAgICB0aGlzLnN1Yk1lbnVzID0gbmV3IE5hdk1vYmlsZVN1Yk1lbnVzKHRoaXMuJHBhbmVsKTtcbiAgICB0aGlzLl9zZXRQYW5lbEhlaWdodCgpO1xuXG4gICAgLy8gQW5pbWF0ZSBpbiBlbGVtZW50c1xuICAgIHRoaXMuJG1vYmlsZU5hdlxuICAgICAgLmFkZENsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLWluJylcbiAgICAgIC5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICB0aGlzLiRtb2JpbGVOYXZcbiAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FuaW1hdGluZyBhbmltYXRpbmctaW4nKVxuICAgICAgICAgIC5hZGRDbGFzcygndmlzaWJsZScpXG4gICAgICAgICAgLm9mZigndHJlbmQnKTtcbiAgICAgIH0pO1xuXG4gICAgLy8gRXZlbnQgaGFuZGxlcnNcbiAgICB0aGlzLmV2ZW50cyA9IFtcbiAgICAgIC8vIENsb3NlIG1lbnUgd2hlbiBjbGlja2luZyBvbiB0aGUgb3ZlcmxheVxuICAgICAgdGhpcy4kb3ZlcmxheS5vbignY2xpY2subW9iaWxlLW5hdicsIGV2ZW50ID0+IHRoaXMuX2Nsb3NlKGV2ZW50KSksXG4gICAgICB0aGlzLiR0b2dnbGVDbG9zZS5vbignY2xpY2subW9iaWxlLW5hdicsIGV2ZW50ID0+IHRoaXMuX2Nsb3NlKGV2ZW50KSksXG5cbiAgICAgIC8vIERpc2FibGUgc2Nyb2xsaW5nIG9uIG92ZXJsYXkgYW5kIGNvbnRhY3RiYXJcbiAgICAgIHRoaXMuJG92ZXJsYXkub24oJ3RvdWNobW92ZS5tb2JpbGUtbmF2JywgZXZlbnQgPT4gZXZlbnQucHJldmVudERlZmF1bHQoKSksXG4gICAgXTtcbiAgfVxuXG4gIF9jbG9zZShldmVudCA9IGZhbHNlKSB7XG4gICAgaWYgKGV2ZW50KSBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy4kbW9iaWxlTmF2XG4gICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGluZyBhbmltYXRpbmctb3V0JylcbiAgICAgIC5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICB0aGlzLiRtb2JpbGVOYXZcbiAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FuaW1hdGluZyBhbmltYXRpbmctb3V0JylcbiAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKVxuICAgICAgICAgIC5vZmYoJ3RyZW5kJyk7XG4gICAgICB9KTtcblxuICAgIHRoaXMuJGJvZHkucmVtb3ZlQ2xhc3MoJ3Njcm9sbC1sb2NrJyk7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgIC8vIENsb3NlIGFueSBvcGVuIGRyb3AgZG93biBtZW51c1xuICAgIGlmICh0aGlzLnN1Yk1lbnVzKSB7XG4gICAgICB0aGlzLnN1Yk1lbnVzLmNsb3NlU3ViTWVudXModGhpcy4kZWwpO1xuICAgICAgdGhpcy5zdWJNZW51cy5jbG9zZUFsbFN1Ym1lbnVzKCk7XG5cbiAgICAgIC8vIFVuYmluZCBNb2JpbGUgc3ViIG1lbnVzXG4gICAgICB0aGlzLnN1Yk1lbnVzLnVubG9hZCgpO1xuICAgIH1cblxuICAgIC8vIFVuYmluZCBldmVudHNcbiAgICBpZiAodGhpcy5ldmVudHMpIHtcbiAgICAgIHRoaXMuZXZlbnRzLmZvckVhY2goJGVsID0+ICRlbC5vZmYoJy5tb2JpbGUtbmF2JykpO1xuICAgICAgdGhpcy5ldmVudHMgPSBbXTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHNjcm9sbExlZnQoJGVsKSB7XG4gIGNvbnN0ICRjb250YWluZXIgPSAkZWwucGFyZW50KCk7XG5cbiAgJGNvbnRhaW5lci5hbmltYXRlKHtcbiAgICBzY3JvbGxMZWZ0OiAkZWwub2Zmc2V0KCkubGVmdCAtICgkZWwud2lkdGgoKSAvIDIpIC0gKCRjb250YWluZXIud2lkdGgoKSAvIDIpXG4gIH0pO1xufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBzY3JvbGxMZWZ0IGZyb20gJy4uL2hlbHBlcnMvc2Nyb2xsTGVmdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1lZ2FOYXZTY3JvbGxlciB7XG4gIGNvbnN0cnVjdG9yKCRlbCwgYmxvY2sgPSBudWxsKSB7XG4gICAgdGhpcy4kZWwgPSAkZWw7XG4gICAgdGhpcy4kbWVudUxpc3QgPSB0aGlzLiRlbC5maW5kKCcubmF2bWVudS1tZWdhbmF2LWl0ZW1zJyk7XG5cbiAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgdGhpcy5fYWRkU2Nyb2xsQ2xhc3NlcygpO1xuXG4gICAgaWYgKGJsb2NrKSB7XG4gICAgICBzY3JvbGxMZWZ0KCQoYmxvY2suZWwpKTtcbiAgICB9XG4gIH1cbiAgXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLiRtZW51TGlzdC5vZmYoJy5tZWdhbmF2Jyk7XG4gIH1cblxuICBfYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLiRtZW51TGlzdC5vbignc2Nyb2xsLm1lZ2FuYXYnLCAoKSA9PiB0aGlzLl9hZGRTY3JvbGxDbGFzc2VzKCkpO1xuICB9XG5cbiAgX2FkZFNjcm9sbENsYXNzZXMoKSB7XG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IHRoaXMuJG1lbnVMaXN0LnNjcm9sbExlZnQoKTtcbiAgICBjb25zdCBzY3JvbGxXaWR0aCA9IHRoaXMuJG1lbnVMaXN0WzBdLnNjcm9sbFdpZHRoO1xuICAgIGNvbnN0IHdpZHRoID0gdGhpcy4kbWVudUxpc3Qud2lkdGgoKTtcblxuICAgIHRoaXMuJGVsLnRvZ2dsZUNsYXNzKCdtZWdhbmF2LS1vdmVyZmxvd3MtbGVmdCcsIHNjcm9sbExlZnQgPiAwKTtcbiAgICB0aGlzLiRlbC50b2dnbGVDbGFzcygnbWVnYW5hdi0tb3ZlcmZsb3dzLXJpZ2h0Jywgc2Nyb2xsTGVmdCA8IHNjcm9sbFdpZHRoIC0gd2lkdGgpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5pbXBvcnQgTWVnYU5hdlNjcm9sbGVyIGZyb20gJy4vTWVnYU5hdlNjcm9sbGVyJztcbmltcG9ydCBzY3JvbGxMZWZ0IGZyb20gJy4uL2hlbHBlcnMvc2Nyb2xsTGVmdCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5hdkRlc2t0b3Age1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy4kZWwgPSAkKG9wdGlvbnMuJGVsKTtcbiAgICB0aGlzLnBvc3RNZXNzYWdlID0gb3B0aW9ucy5wb3N0TWVzc2FnZTtcblxuICAgIHRoaXMuYWN0aXZlTWVudSA9ICduYXZtZW51LWFjdGl2ZSc7XG4gICAgdGhpcy5hY3RpdmVJdGVtID0gJ25hdm1lbnUtaXRlbS1hY3RpdmUnO1xuICAgIHRoaXMubmF2VHJpZ2dlciA9ICdbZGF0YS1uYXZtZW51LXRyaWdnZXJdJztcbiAgICB0aGlzLnN1Yk1lbnUgPSAnW2RhdGEtbmF2bWVudS1zdWJtZW51XSc7XG5cbiAgICB0aGlzLmlubGluZUNoaWxkcmVuID0gJ25hdm1lbnUtc3VibWVudS1pbmxpbmUtY2hpbGRyZW4nO1xuXG4gICAgdGhpcy5ldmVudHMgPSBbXG4gICAgICAvLyBOYXZtZW51IG1vdXNlIGV2ZW50c1xuICAgICAgdGhpcy4kZWwub24oJ21vdXNlZG93bi5uYXZtZW51JywgJy5uYXZtZW51LWxpbmsnLCBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgLy8gQWRkIGEgY2xhc3MgdG8gYWN0aXZlbHkgY2xpY2tlZCBpdGVtIHRvIHByZXZlbnQgZm9jdXMgc3R5bGluZ1xuICAgICAgICBjb25zdCAkdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcblxuICAgICAgICB0aGlzLiRlbC5maW5kKGAuJHt0aGlzLmFjdGl2ZUl0ZW19YCkucmVtb3ZlQ2xhc3ModGhpcy5hY3RpdmVJdGVtKTtcblxuICAgICAgICAkdGFyZ2V0LmFkZENsYXNzKHRoaXMuYWN0aXZlSXRlbSkuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuICAgICAgfSksXG5cbiAgICAgIHRoaXMuJGVsLm9uKCdtb3VzZXVwLm5hdmVtZW51LCBjbGljay5uYXZtZW51JywgYCR7dGhpcy5uYXZUcmlnZ2VyfSA+IC5uYXZtZW51LWxpbmstcGFyZW50YCwgZXZlbnQgPT4ge1xuICAgICAgICAvLyBNb3VzZXVwIGFuZCBjbGljayBmaXJlIGFmdGVyIG1vdXNlZG93blxuICAgICAgICByZXR1cm4gZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH0pLFxuXG4gICAgICB0aGlzLiRlbC5vbignbW91c2Vkb3duLm5hdm1lbnUnLCBgJHt0aGlzLm5hdlRyaWdnZXJ9ID4gLm5hdm1lbnUtbGluay1wYXJlbnRgLCBldmVudCA9PiB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG5cbiAgICAgICAgaWYgKCR0YXJnZXQuaXMoJzpmb2N1cycpKSB7XG4gICAgICAgICAgJHRhcmdldC5kYXRhKCdjbGlja2VkJywgdHJ1ZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRvZ2dsZUl0ZW0oZXZlbnQuY3VycmVudFRhcmdldC5wYXJlbnROb2RlKTtcbiAgICAgIH0pLFxuXG4gICAgICAvLyBUb2dnbGUgaXRlbSBvbiB0b3VjaCwgYW5kIGNsaWNrXG4gICAgICB0aGlzLiRlbC5vbigndG91Y2hlbmQubmF2bWVudScsIGAke3RoaXMubmF2VHJpZ2dlcn0gPiAubmF2bWVudS1saW5rLXBhcmVudGAsIGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHRoaXMudG9nZ2xlSXRlbShldmVudC5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUpO1xuICAgICAgfSksXG5cbiAgICAgIC8vIEtleWJvYXJkIG5hdmlnYXRpb24gLS0gdG9nZ2xlIHN1Ym1lbnVzXG4gICAgICB0aGlzLiRlbC5vbignZm9jdXMubmF2bWVudScsIGAke3RoaXMubmF2VHJpZ2dlcn0gPiAubmF2bWVudS1saW5rLXBhcmVudGAsIGV2ZW50ID0+IHtcbiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgICAgIGNvbnN0IGNsaWNrZWQgPSAkdGFyZ2V0LmRhdGEoJ2NsaWNrZWQnKTtcblxuICAgICAgICAvLyBQcmV2ZW50IGZvY3VzIGJ5IGNsaWNrIHRvIGZpcmUgYSBzdWJzZXF1ZW50IHRvZ2dsZVxuICAgICAgICBpZiAoY2xpY2tlZCkge1xuICAgICAgICAgICR0YXJnZXQucmVtb3ZlRGF0YSgnY2xpY2tlZCcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG9nZ2xlSXRlbShldmVudC5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KSxcblxuICAgICAgLy8gS2V5Ym9hcmQgbmF2aWdhdGlvbiAtLSBjbG9zZSBzdWJtZW51cyB3aGVuIG1vdmluZyB0byBhIG5ldyBuYXYgaXRlbVxuICAgICAgdGhpcy4kZWwub24oJ2ZvY3VzLm5hdm1lbnUnLCAnLm5hdm1lbnUtZGVwdGgtMSA+IC5uYXZtZW51LWl0ZW0gLm5hdm1lbnUtbGluaycsIGV2ZW50ID0+IHtcbiAgICAgICAgdGhpcy5jbG9zZUFsbChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgIH0pLFxuXG4gICAgICAvLyBDbG9zZSBpdGVtcyB3aGVuIGNsaWNraW5nIG91dHNpZGVcbiAgICAgICQoZG9jdW1lbnQpLm9uKCd0b3VjaHN0YXJ0Lm5hdm1lbnUsIGNsaWNrLm5hdm1lbnUnLCBldmVudCA9PiB7XG4gICAgICAgIHRoaXMuX2hhbmRsZURvY3VtZW50Q2xpY2soZXZlbnQudGFyZ2V0KTtcbiAgICAgIH0pLFxuICAgIF07XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5ldmVudHMuZm9yRWFjaCgkZWwgPT4gJGVsLm9mZignLm5hdm1lbnUnKSk7XG5cbiAgICBpZiAodGhpcy5tZWdhTmF2KSB7XG4gICAgICBkZWxldGUgdGhpcy5tZWdhTmF2O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBNZWdhTmF2XG4gICAqIEBwYXJhbSAkbWVudVxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIG9wZW5NZWdhTmF2KCRtZW51LCBibG9jaykge1xuICAgIHRoaXMubWVnYU5hdiA9IG5ldyBNZWdhTmF2U2Nyb2xsZXIoJG1lbnUsIGJsb2NrKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIGEgZHJvcGRvd24gbWVudSwgb3Igc2Nyb2xsIHRvIGEgbWVnYW5hdiBpdGVtXG4gICAqXG4gICAqIEBwYXJhbSBlbCAtIFBhcmVudCBMSSBjb250YWluaW5nIHN1YiBtZW51XG4gICAqIEBwYXJhbSBibG9jayAtIE1lZ2FuYXYgbWVudSBibG9ja1xuICAgKi9cbiAgb3Blbkl0ZW0oZWwsIGJsb2NrID0gbnVsbCkge1xuICAgIGNvbnN0ICRlbCA9ICQoZWwpO1xuXG4gICAgLy8gQ2hlY2sgaWYgbWVudSBpcyBhbHJlYWR5IG9wZW5cbiAgICBjb25zdCAkbWVudSA9ICRlbC5jaGlsZHJlbih0aGlzLnN1Yk1lbnUpO1xuICAgIGlmICgkbWVudS5pcygnOnZpc2libGUnKSkge1xuICAgICAgLy8gSWYgaXRzIG5vdCBhIG1lZ2FuYXYsIGRvIG5vdGhpbmdcbiAgICAgIGlmICgkbWVudS5hdHRyKCdkYXRhLW1lZ2FuYXYtbWVudScpID09PSB1bmRlZmluZWQpIHJldHVybjtcblxuICAgICAgLy8gSWYgaXRzIGEgbWVnYW5hdiwgc2Nyb2xsIGhvcml6b250YWxseSB0byB0aGUgaXRlbVxuICAgICAgc2Nyb2xsTGVmdCgkKGJsb2NrLmVsKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgcHJldmlvdXNseSBvcGVuZWQgaXRlbXNcbiAgICB0aGlzLmNsb3NlQWxsKGVsKTtcblxuICAgICRlbC5kYXRhKCd0cmFuc2l0aW9uaW5nJywgdHJ1ZSk7XG4gICAgY29uc3QgJHBhcmVudCA9ICRtZW51LnBhcmVudCh0aGlzLm5hdlRyaWdnZXIpO1xuXG4gICAgLy8gQWRkIGFuIGFjdGl2ZSBjbGFzcyB0byB0aGUgbWVudSdzIHBhcmVudFxuICAgICRwYXJlbnRcbiAgICAgIC5maW5kKCcubmF2bWVudS1saW5rLXBhcmVudDpmaXJzdCcpXG4gICAgICAuYWRkQ2xhc3ModGhpcy5hY3RpdmVNZW51KTtcblxuICAgIC8vIFNob3cgbWVudVxuICAgICRtZW51XG4gICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGluZyBhbmltYXRpbmctaW4nKVxuICAgICAgLm9uZSgndHJlbmQnLCAoKSA9PiB7XG4gICAgICAgICRtZW51XG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLWluJylcbiAgICAgICAgICAuYWRkQ2xhc3MoJ3Zpc2libGUnKVxuICAgICAgICAgIC5vZmYoJ3RyZW5kJyk7XG5cbiAgICAgICAgdGhpcy5faW5saW5lTWVudSgkbWVudSk7XG5cbiAgICAgICAgJGVsLmRhdGEoJ3RyYW5zaXRpb25pbmcnLCBmYWxzZSk7XG4gICAgICAgICRwYXJlbnQuZmluZCgnPiAubmF2bWVudS1saW5rJykuYXR0cignYXJpYS1leHBhbmRlZCcsIHRydWUpO1xuXG4gICAgICAgIC8vIExvYWQgTWVnYU5hdlNjcm9sbGVyIGlmIGlzIGEgbWVnYSBuYXZcbiAgICAgICAgaWYgKCRtZW51LmF0dHIoJ2RhdGEtbWVnYW5hdi1tZW51JykgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRoaXMub3Blbk1lZ2FOYXYoJG1lbnUsIGJsb2NrKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBjbG9zZUFsbCh0YXJnZXQpIHtcbiAgICB0aGlzLiRlbC5maW5kKGAke3RoaXMuc3ViTWVudX0udmlzaWJsZSwgJHt0aGlzLnN1Yk1lbnV9LmFuaW1hdGluZy1pbmApLnBhcmVudCh0aGlzLm5hdlRyaWdnZXIpLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICBpZiAodGFyZ2V0ICYmICQuY29udGFpbnMoZWwsIHRhcmdldCkpIHJldHVybjtcblxuICAgICAgLy8gQ2xvc2UgYW55IHN1Ym1lbnVzIGluIHRoaXMgdHJlZVxuICAgICAgJChlbClcbiAgICAgICAgLmZpbmQodGhpcy5uYXZUcmlnZ2VyKVxuICAgICAgICAuZWFjaCgoaSwgc3VibWVudSkgPT4gdGhpcy5jbG9zZUl0ZW0oc3VibWVudSkpO1xuXG4gICAgICAvLyBDbG9zZSByb290LWxldmVsIG1lbnUgaXRlbVxuICAgICAgdGhpcy5jbG9zZUl0ZW0oZWwpO1xuICAgIH0pO1xuICB9XG5cbiAgY2xvc2VJdGVtKGVsKSB7XG4gICAgY29uc3QgJGVsID0gJChlbCk7XG4gICAgY29uc3QgJG1lbnUgPSAkZWwuY2hpbGRyZW4oYCR7dGhpcy5zdWJNZW51fS52aXNpYmxlLCAke3RoaXMuc3ViTWVudX0uYW5pbWF0aW5nLWluYCk7XG4gICAgY29uc3QgJHBhcmVudCA9ICRtZW51LnBhcmVudCh0aGlzLm5hdlRyaWdnZXIpO1xuICAgIGlmICghJG1lbnUubGVuZ3RoKSByZXR1cm47XG5cbiAgICAvLyBNZW51IGlzIGluIHRoZSBwcm9ncmVzcyBvZiBiZWluZyBhbmltYXRlZCwgdHJ5IGluIDMwMG1zXG4gICAgaWYoJGVsLmRhdGEoJ3RyYW5zaXRpb25pbmcnKSkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlSXRlbShlbCk7XG4gICAgICB9LCAzMDApO1xuICAgIH1cblxuICAgIC8vIEFkZCBhbiBhY3RpdmUgY2xhc3MgdG8gdGhlIG1lbnUncyBwYXJlbnRcbiAgICAkcGFyZW50XG4gICAgICAuZmluZCgnLm5hdm1lbnUtbGluay1wYXJlbnQ6Zmlyc3QnKVxuICAgICAgLnJlbW92ZUNsYXNzKHRoaXMuYWN0aXZlTWVudSk7XG5cbiAgICAvLyBFbnN1cmUgJG1lbnUgaXMgc2Nyb2xsZWQgdG8gdG9wXG4gICAgaWYgKCRtZW51Lmhhc0NsYXNzKHRoaXMuaW5saW5lQ2hpbGRyZW4pKSB7XG4gICAgICAkbWVudS5zY3JvbGxUb3AoMCk7XG4gICAgfVxuXG4gICAgLy8gSGlkZSBtZW51XG4gICAgJG1lbnVcbiAgICAgIC5hZGRDbGFzcygnYW5pbWF0aW5nIGFuaW1hdGluZy1vdXQnKVxuICAgICAgLnJlbW92ZUNsYXNzKCdhbmltYXRpbmctaW4nKVxuICAgICAgLm9uZSgndHJlbmQnLCAoKSA9PiB7XG4gICAgICAgICRtZW51XG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLW91dCB2aXNpYmxlJylcbiAgICAgICAgICAub2ZmKCd0cmVuZCcpO1xuXG4gICAgICAgICRwYXJlbnQuZmluZCgnPiAubmF2bWVudS1saW5rJykuYXR0cignYXJpYS1leHBhbmRlZCcsIGZhbHNlKTtcblxuICAgICAgICAvLyBVbmxvYWQgTWVnYU5hdlNjcm9sbGVyIGlmIGlzIGEgbWVnYS1uYXZcbiAgICAgICAgaWYgKCRtZW51LmRhdGEoJ21lZ2FuYXYtbWVudScpICE9PSB1bmRlZmluZWQgJiYgdGhpcy5tZWdhTmF2KSB7XG4gICAgICAgICAgdGhpcy5tZWdhTmF2LnVubG9hZCgpO1xuICAgICAgICAgIHRoaXMubWVnYU5hdiA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgdG9nZ2xlSXRlbShlbCkge1xuICAgIGNvbnN0ICRlbCA9ICQoZWwpO1xuICAgIGNvbnN0ICRtZW51ID0gJGVsLmNoaWxkcmVuKHRoaXMuc3ViTWVudSk7XG5cbiAgICBpZiAoJG1lbnUuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgIHRoaXMuY2xvc2VJdGVtKGVsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5vcGVuSXRlbShlbCk7XG4gICAgfVxuICB9XG5cbiAgX2hhbmRsZURvY3VtZW50Q2xpY2sodGFyZ2V0KSB7XG4gICAgY29uc3QgJHBhcmVudCA9ICQodGFyZ2V0KS5wYXJlbnRzKHRoaXMubmF2VHJpZ2dlcik7XG4gICAgaWYgKCRwYXJlbnQubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLmNsb3NlQWxsKCk7XG4gIH1cblxuICBfbWVudUxpbWl0cygkbWVudSkge1xuICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcbiAgICBjb25zdCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgIGNvbnN0IG1lbnVSZWN0ID0gJG1lbnVbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgY29uc3QgaGFzQ2hpbGRyZW4gPSAkbWVudS5maW5kKHRoaXMuc3ViTWVudSkubGVuZ3RoID4gMDtcbiAgICBjb25zdCBzdGlja3lIZWFkZXJPZmZzZXQgPSAkKCcuc2l0ZS1oZWFkZXItc3RpY2t5LS1zY3JvbGxlZCcpLmxlbmd0aCA/IDIwIDogMDsgLy8gUGFkZGluZyBkaWZmZXJlbmNlXG4gICAgY29uc3QgZWRnZXMgPSB7XG4gICAgICBib3R0b21FZGdlOiBtZW51UmVjdC5ib3R0b20gKyBzdGlja3lIZWFkZXJPZmZzZXQsXG4gICAgICByaWdodEVkZ2U6IG1lbnVSZWN0LnJpZ2h0ICsgbWVudVJlY3Qud2lkdGgsXG4gICAgfTtcblxuICAgIC8vIFN0b3JlIGJvdHRvbSBvZmZzZXQgZm9yIHN1YnNlcXVlbnQgb3BlbmluZ3NcbiAgICBpZiAoISRtZW51LmRhdGEoJ2JvdHRvbS1lZGdlJykgfHwgJG1lbnUuZGF0YSgnYm90dG9tLWVkZ2UnKSAhPT0gZWRnZXMuYm90dG9tRWRnZSkge1xuICAgICAgJG1lbnUuZGF0YSgnYm90dG9tLWVkZ2UnLCBlZGdlcy5ib3R0b21FZGdlKTtcbiAgICB9XG5cbiAgICAvLyBTdG9yZSBjaGlsZCBtZW51IHJpZ2h0IGVkZ2VcbiAgICBpZiAoISRtZW51LmRhdGEoJ3JpZ2h0LWVkZ2UnKSB8fCAkbWVudS5kYXRhKCdyaWdodC1lZGdlJykgIT09IGVkZ2VzLnJpZ2h0RWRnZSkge1xuICAgICAgJG1lbnUuZGF0YSgncmlnaHQtZWRnZScsIGVkZ2VzLnJpZ2h0RWRnZSk7XG4gICAgfVxuXG4gICAgY29uc3QgYm90dG9tRWRnZSA9IHBhcnNlSW50KCRtZW51LmRhdGEoJ2JvdHRvbS1lZGdlJyksIDEwKTtcbiAgICBjb25zdCByaWdodEVkZ2UgPSBwYXJzZUludCgkbWVudS5kYXRhKCdyaWdodC1lZGdlJyksIDEwKTtcblxuICAgIHJldHVybiB7XG4gICAgICBjaGlsZHJlbkV4Y2VlZEhvcml6b250YWw6IHJpZ2h0RWRnZSA+PSB3aW5kb3dXaWR0aCAmJiBoYXNDaGlsZHJlbixcbiAgICAgIGV4Y2VlZHNWZXJ0aWNhbDogYm90dG9tRWRnZSA+PSB3aW5kb3dIZWlnaHQsXG4gICAgICBtYXhIZWlnaHQ6IHdpbmRvd0hlaWdodCAtIG1lbnVSZWN0LnRvcCxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIG1lbnUgdG8gYmVcbiAgICovXG4gIF9pbmxpbmVNZW51KCRtZW51KSB7XG4gICAgY29uc3QgeyBjaGlsZHJlbkV4Y2VlZEhvcml6b250YWwsIGV4Y2VlZHNWZXJ0aWNhbCwgbWF4SGVpZ2h0IH0gPSB0aGlzLl9tZW51TGltaXRzKCRtZW51KTtcblxuICAgIC8vIFVuc2V0IGlubGluZSBzdHlsZSBpZiBoZWlnaHQgYWxsb3dzLCBhbmQgY2hpbGRyZW4gbWVudSBkb24ndCBleGNlZWQgd2luZG93IGJvdW5kc1xuICAgIGlmICghZXhjZWVkc1ZlcnRpY2FsICYmICFjaGlsZHJlbkV4Y2VlZEhvcml6b250YWwpIHtcbiAgICAgIHJldHVybiB0aGlzLl91bnNldElubGluZU1lbnUoJG1lbnUpO1xuICAgIH1cblxuICAgIHJldHVybiAkbWVudS5jc3MoeyBtYXhIZWlnaHQgfSkuYWRkQ2xhc3ModGhpcy5pbmxpbmVDaGlsZHJlbik7XG4gIH1cblxuICBfdW5zZXRJbmxpbmVNZW51KCRtZW51KSB7XG4gICAgJG1lbnVcbiAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLWJvdHRvbS1lZGdlJylcbiAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXJpZ2h0LWVkZ2UnKVxuICAgICAgLnJlbW92ZUNsYXNzKHRoaXMuaW5saW5lQ2hpbGRyZW4pXG4gICAgICAuY3NzKCdtYXgtaGVpZ2h0JywgJycpO1xuICB9XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGRlYm91bmNlXG5cbmZ1bmN0aW9uIGRlYm91bmNlIChmbiwgZGVsYXksIGF0X3N0YXJ0LCBndWFyYW50ZWUpIHtcbiAgdmFyIHRpbWVvdXRcbiAgdmFyIGFyZ3NcbiAgdmFyIHNlbGZcblxuICByZXR1cm4gZnVuY3Rpb24gZGVib3VuY2VkICgpIHtcbiAgICBzZWxmID0gdGhpc1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpXG5cbiAgICBpZiAodGltZW91dCAmJiAoYXRfc3RhcnQgfHwgZ3VhcmFudGVlKSkge1xuICAgICAgcmV0dXJuXG4gICAgfSBlbHNlIGlmICghYXRfc3RhcnQpIHtcbiAgICAgIGNsZWFyKClcblxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQocnVuLCBkZWxheSlcbiAgICAgIHJldHVybiB0aW1lb3V0XG4gICAgfVxuXG4gICAgdGltZW91dCA9IHNldFRpbWVvdXQoY2xlYXIsIGRlbGF5KVxuICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpXG5cbiAgICBmdW5jdGlvbiBydW4gKCkge1xuICAgICAgY2xlYXIoKVxuICAgICAgZm4uYXBwbHkoc2VsZiwgYXJncylcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjbGVhciAoKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGltZW91dClcbiAgICAgIHRpbWVvdXQgPSBudWxsXG4gICAgfVxuICB9XG59XG4iLCIvKiFcclxuICogRXZlbnRFbWl0dGVyMlxyXG4gKiBodHRwczovL2dpdGh1Yi5jb20vaGlqMW54L0V2ZW50RW1pdHRlcjJcclxuICpcclxuICogQ29weXJpZ2h0IChjKSAyMDEzIGhpajFueFxyXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXHJcbiAqL1xyXG47IWZ1bmN0aW9uKHVuZGVmaW5lZCkge1xyXG5cclxuICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgPyBBcnJheS5pc0FycmF5IDogZnVuY3Rpb24gX2lzQXJyYXkob2JqKSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iaikgPT09IFwiW29iamVjdCBBcnJheV1cIjtcclxuICB9O1xyXG4gIHZhciBkZWZhdWx0TWF4TGlzdGVuZXJzID0gMTA7XHJcblxyXG4gIGZ1bmN0aW9uIGluaXQoKSB7XHJcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcclxuICAgIGlmICh0aGlzLl9jb25mKSB7XHJcbiAgICAgIGNvbmZpZ3VyZS5jYWxsKHRoaXMsIHRoaXMuX2NvbmYpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gY29uZmlndXJlKGNvbmYpIHtcclxuICAgIGlmIChjb25mKSB7XHJcbiAgICAgIHRoaXMuX2NvbmYgPSBjb25mO1xyXG5cclxuICAgICAgY29uZi5kZWxpbWl0ZXIgJiYgKHRoaXMuZGVsaW1pdGVyID0gY29uZi5kZWxpbWl0ZXIpO1xyXG4gICAgICB0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzID0gY29uZi5tYXhMaXN0ZW5lcnMgIT09IHVuZGVmaW5lZCA/IGNvbmYubWF4TGlzdGVuZXJzIDogZGVmYXVsdE1heExpc3RlbmVycztcclxuICAgICAgY29uZi53aWxkY2FyZCAmJiAodGhpcy53aWxkY2FyZCA9IGNvbmYud2lsZGNhcmQpO1xyXG4gICAgICBjb25mLm5ld0xpc3RlbmVyICYmICh0aGlzLm5ld0xpc3RlbmVyID0gY29uZi5uZXdMaXN0ZW5lcik7XHJcbiAgICAgIGNvbmYudmVyYm9zZU1lbW9yeUxlYWsgJiYgKHRoaXMudmVyYm9zZU1lbW9yeUxlYWsgPSBjb25mLnZlcmJvc2VNZW1vcnlMZWFrKTtcclxuXHJcbiAgICAgIGlmICh0aGlzLndpbGRjYXJkKSB7XHJcbiAgICAgICAgdGhpcy5saXN0ZW5lclRyZWUgPSB7fTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZXZlbnRzLm1heExpc3RlbmVycyA9IGRlZmF1bHRNYXhMaXN0ZW5lcnM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmdW5jdGlvbiBsb2dQb3NzaWJsZU1lbW9yeUxlYWsoY291bnQsIGV2ZW50TmFtZSkge1xyXG4gICAgdmFyIGVycm9yTXNnID0gJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xyXG4gICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xyXG4gICAgICAgICdVc2UgZW1pdHRlci5zZXRNYXhMaXN0ZW5lcnMoKSB0byBpbmNyZWFzZSBsaW1pdC4nO1xyXG5cclxuICAgIGlmKHRoaXMudmVyYm9zZU1lbW9yeUxlYWspe1xyXG4gICAgICBlcnJvck1zZyArPSAnIEV2ZW50IG5hbWU6ICVzLic7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyb3JNc2csIGNvdW50LCBldmVudE5hbWUpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgY29uc29sZS5lcnJvcihlcnJvck1zZywgY291bnQpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChjb25zb2xlLnRyYWNlKXtcclxuICAgICAgY29uc29sZS50cmFjZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZnVuY3Rpb24gRXZlbnRFbWl0dGVyKGNvbmYpIHtcclxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xyXG4gICAgdGhpcy5uZXdMaXN0ZW5lciA9IGZhbHNlO1xyXG4gICAgdGhpcy52ZXJib3NlTWVtb3J5TGVhayA9IGZhbHNlO1xyXG4gICAgY29uZmlndXJlLmNhbGwodGhpcywgY29uZik7XHJcbiAgfVxyXG4gIEV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIyID0gRXZlbnRFbWl0dGVyOyAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgZXhwb3J0aW5nIEV2ZW50RW1pdHRlciBwcm9wZXJ0eVxyXG5cclxuICAvL1xyXG4gIC8vIEF0dGVudGlvbiwgZnVuY3Rpb24gcmV0dXJuIHR5cGUgbm93IGlzIGFycmF5LCBhbHdheXMgIVxyXG4gIC8vIEl0IGhhcyB6ZXJvIGVsZW1lbnRzIGlmIG5vIGFueSBtYXRjaGVzIGZvdW5kIGFuZCBvbmUgb3IgbW9yZVxyXG4gIC8vIGVsZW1lbnRzIChsZWFmcykgaWYgdGhlcmUgYXJlIG1hdGNoZXNcclxuICAvL1xyXG4gIGZ1bmN0aW9uIHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgdHJlZSwgaSkge1xyXG4gICAgaWYgKCF0cmVlKSB7XHJcbiAgICAgIHJldHVybiBbXTtcclxuICAgIH1cclxuICAgIHZhciBsaXN0ZW5lcnM9W10sIGxlYWYsIGxlbiwgYnJhbmNoLCB4VHJlZSwgeHhUcmVlLCBpc29sYXRlZEJyYW5jaCwgZW5kUmVhY2hlZCxcclxuICAgICAgICB0eXBlTGVuZ3RoID0gdHlwZS5sZW5ndGgsIGN1cnJlbnRUeXBlID0gdHlwZVtpXSwgbmV4dFR5cGUgPSB0eXBlW2krMV07XHJcbiAgICBpZiAoaSA9PT0gdHlwZUxlbmd0aCAmJiB0cmVlLl9saXN0ZW5lcnMpIHtcclxuICAgICAgLy9cclxuICAgICAgLy8gSWYgYXQgdGhlIGVuZCBvZiB0aGUgZXZlbnQocykgbGlzdCBhbmQgdGhlIHRyZWUgaGFzIGxpc3RlbmVyc1xyXG4gICAgICAvLyBpbnZva2UgdGhvc2UgbGlzdGVuZXJzLlxyXG4gICAgICAvL1xyXG4gICAgICBpZiAodHlwZW9mIHRyZWUuX2xpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIGhhbmRsZXJzICYmIGhhbmRsZXJzLnB1c2godHJlZS5fbGlzdGVuZXJzKTtcclxuICAgICAgICByZXR1cm4gW3RyZWVdO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGZvciAobGVhZiA9IDAsIGxlbiA9IHRyZWUuX2xpc3RlbmVycy5sZW5ndGg7IGxlYWYgPCBsZW47IGxlYWYrKykge1xyXG4gICAgICAgICAgaGFuZGxlcnMgJiYgaGFuZGxlcnMucHVzaCh0cmVlLl9saXN0ZW5lcnNbbGVhZl0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gW3RyZWVdO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKChjdXJyZW50VHlwZSA9PT0gJyonIHx8IGN1cnJlbnRUeXBlID09PSAnKionKSB8fCB0cmVlW2N1cnJlbnRUeXBlXSkge1xyXG4gICAgICAvL1xyXG4gICAgICAvLyBJZiB0aGUgZXZlbnQgZW1pdHRlZCBpcyAnKicgYXQgdGhpcyBwYXJ0XHJcbiAgICAgIC8vIG9yIHRoZXJlIGlzIGEgY29uY3JldGUgbWF0Y2ggYXQgdGhpcyBwYXRjaFxyXG4gICAgICAvL1xyXG4gICAgICBpZiAoY3VycmVudFR5cGUgPT09ICcqJykge1xyXG4gICAgICAgIGZvciAoYnJhbmNoIGluIHRyZWUpIHtcclxuICAgICAgICAgIGlmIChicmFuY2ggIT09ICdfbGlzdGVuZXJzJyAmJiB0cmVlLmhhc093blByb3BlcnR5KGJyYW5jaCkpIHtcclxuICAgICAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmNvbmNhdChzZWFyY2hMaXN0ZW5lclRyZWUoaGFuZGxlcnMsIHR5cGUsIHRyZWVbYnJhbmNoXSwgaSsxKSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBsaXN0ZW5lcnM7XHJcbiAgICAgIH0gZWxzZSBpZihjdXJyZW50VHlwZSA9PT0gJyoqJykge1xyXG4gICAgICAgIGVuZFJlYWNoZWQgPSAoaSsxID09PSB0eXBlTGVuZ3RoIHx8IChpKzIgPT09IHR5cGVMZW5ndGggJiYgbmV4dFR5cGUgPT09ICcqJykpO1xyXG4gICAgICAgIGlmKGVuZFJlYWNoZWQgJiYgdHJlZS5fbGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAvLyBUaGUgbmV4dCBlbGVtZW50IGhhcyBhIF9saXN0ZW5lcnMsIGFkZCBpdCB0byB0aGUgaGFuZGxlcnMuXHJcbiAgICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuY29uY2F0KHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgdHJlZSwgdHlwZUxlbmd0aCkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChicmFuY2ggaW4gdHJlZSkge1xyXG4gICAgICAgICAgaWYgKGJyYW5jaCAhPT0gJ19saXN0ZW5lcnMnICYmIHRyZWUuaGFzT3duUHJvcGVydHkoYnJhbmNoKSkge1xyXG4gICAgICAgICAgICBpZihicmFuY2ggPT09ICcqJyB8fCBicmFuY2ggPT09ICcqKicpIHtcclxuICAgICAgICAgICAgICBpZih0cmVlW2JyYW5jaF0uX2xpc3RlbmVycyAmJiAhZW5kUmVhY2hlZCkge1xyXG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmNvbmNhdChzZWFyY2hMaXN0ZW5lclRyZWUoaGFuZGxlcnMsIHR5cGUsIHRyZWVbYnJhbmNoXSwgdHlwZUxlbmd0aCkpO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuY29uY2F0KHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgdHJlZVticmFuY2hdLCBpKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZihicmFuY2ggPT09IG5leHRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmNvbmNhdChzZWFyY2hMaXN0ZW5lclRyZWUoaGFuZGxlcnMsIHR5cGUsIHRyZWVbYnJhbmNoXSwgaSsyKSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgLy8gTm8gbWF0Y2ggb24gdGhpcyBvbmUsIHNoaWZ0IGludG8gdGhlIHRyZWUgYnV0IG5vdCBpbiB0aGUgdHlwZSBhcnJheS5cclxuICAgICAgICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuY29uY2F0KHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgdHJlZVticmFuY2hdLCBpKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGxpc3RlbmVycztcclxuICAgICAgfVxyXG5cclxuICAgICAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLmNvbmNhdChzZWFyY2hMaXN0ZW5lclRyZWUoaGFuZGxlcnMsIHR5cGUsIHRyZWVbY3VycmVudFR5cGVdLCBpKzEpKTtcclxuICAgIH1cclxuXHJcbiAgICB4VHJlZSA9IHRyZWVbJyonXTtcclxuICAgIGlmICh4VHJlZSkge1xyXG4gICAgICAvL1xyXG4gICAgICAvLyBJZiB0aGUgbGlzdGVuZXIgdHJlZSB3aWxsIGFsbG93IGFueSBtYXRjaCBmb3IgdGhpcyBwYXJ0LFxyXG4gICAgICAvLyB0aGVuIHJlY3Vyc2l2ZWx5IGV4cGxvcmUgYWxsIGJyYW5jaGVzIG9mIHRoZSB0cmVlXHJcbiAgICAgIC8vXHJcbiAgICAgIHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgeFRyZWUsIGkrMSk7XHJcbiAgICB9XHJcblxyXG4gICAgeHhUcmVlID0gdHJlZVsnKionXTtcclxuICAgIGlmKHh4VHJlZSkge1xyXG4gICAgICBpZihpIDwgdHlwZUxlbmd0aCkge1xyXG4gICAgICAgIGlmKHh4VHJlZS5fbGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICAvLyBJZiB3ZSBoYXZlIGEgbGlzdGVuZXIgb24gYSAnKionLCBpdCB3aWxsIGNhdGNoIGFsbCwgc28gYWRkIGl0cyBoYW5kbGVyLlxyXG4gICAgICAgICAgc2VhcmNoTGlzdGVuZXJUcmVlKGhhbmRsZXJzLCB0eXBlLCB4eFRyZWUsIHR5cGVMZW5ndGgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gQnVpbGQgYXJyYXlzIG9mIG1hdGNoaW5nIG5leHQgYnJhbmNoZXMgYW5kIG90aGVycy5cclxuICAgICAgICBmb3IoYnJhbmNoIGluIHh4VHJlZSkge1xyXG4gICAgICAgICAgaWYoYnJhbmNoICE9PSAnX2xpc3RlbmVycycgJiYgeHhUcmVlLmhhc093blByb3BlcnR5KGJyYW5jaCkpIHtcclxuICAgICAgICAgICAgaWYoYnJhbmNoID09PSBuZXh0VHlwZSkge1xyXG4gICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhlIG5leHQgZWxlbWVudCB3aWxsIG1hdGNoLCBzbyBqdW1wIHR3aWNlLlxyXG4gICAgICAgICAgICAgIHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgeHhUcmVlW2JyYW5jaF0sIGkrMik7XHJcbiAgICAgICAgICAgIH0gZWxzZSBpZihicmFuY2ggPT09IGN1cnJlbnRUeXBlKSB7XHJcbiAgICAgICAgICAgICAgLy8gQ3VycmVudCBub2RlIG1hdGNoZXMsIG1vdmUgaW50byB0aGUgdHJlZS5cclxuICAgICAgICAgICAgICBzZWFyY2hMaXN0ZW5lclRyZWUoaGFuZGxlcnMsIHR5cGUsIHh4VHJlZVticmFuY2hdLCBpKzEpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgIGlzb2xhdGVkQnJhbmNoID0ge307XHJcbiAgICAgICAgICAgICAgaXNvbGF0ZWRCcmFuY2hbYnJhbmNoXSA9IHh4VHJlZVticmFuY2hdO1xyXG4gICAgICAgICAgICAgIHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgeyAnKionOiBpc29sYXRlZEJyYW5jaCB9LCBpKzEpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYoeHhUcmVlLl9saXN0ZW5lcnMpIHtcclxuICAgICAgICAvLyBXZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBhbmQgc3RpbGwgb24gYSAnKionXHJcbiAgICAgICAgc2VhcmNoTGlzdGVuZXJUcmVlKGhhbmRsZXJzLCB0eXBlLCB4eFRyZWUsIHR5cGVMZW5ndGgpO1xyXG4gICAgICB9IGVsc2UgaWYoeHhUcmVlWycqJ10gJiYgeHhUcmVlWycqJ10uX2xpc3RlbmVycykge1xyXG4gICAgICAgIHNlYXJjaExpc3RlbmVyVHJlZShoYW5kbGVycywgdHlwZSwgeHhUcmVlWycqJ10sIHR5cGVMZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGxpc3RlbmVycztcclxuICB9XHJcblxyXG4gIGZ1bmN0aW9uIGdyb3dMaXN0ZW5lclRyZWUodHlwZSwgbGlzdGVuZXIpIHtcclxuXHJcbiAgICB0eXBlID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnID8gdHlwZS5zcGxpdCh0aGlzLmRlbGltaXRlcikgOiB0eXBlLnNsaWNlKCk7XHJcblxyXG4gICAgLy9cclxuICAgIC8vIExvb2tzIGZvciB0d28gY29uc2VjdXRpdmUgJyoqJywgaWYgc28sIGRvbid0IGFkZCB0aGUgZXZlbnQgYXQgYWxsLlxyXG4gICAgLy9cclxuICAgIGZvcih2YXIgaSA9IDAsIGxlbiA9IHR5cGUubGVuZ3RoOyBpKzEgPCBsZW47IGkrKykge1xyXG4gICAgICBpZih0eXBlW2ldID09PSAnKionICYmIHR5cGVbaSsxXSA9PT0gJyoqJykge1xyXG4gICAgICAgIHJldHVybjtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHZhciB0cmVlID0gdGhpcy5saXN0ZW5lclRyZWU7XHJcbiAgICB2YXIgbmFtZSA9IHR5cGUuc2hpZnQoKTtcclxuXHJcbiAgICB3aGlsZSAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XHJcblxyXG4gICAgICBpZiAoIXRyZWVbbmFtZV0pIHtcclxuICAgICAgICB0cmVlW25hbWVdID0ge307XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRyZWUgPSB0cmVlW25hbWVdO1xyXG5cclxuICAgICAgaWYgKHR5cGUubGVuZ3RoID09PSAwKSB7XHJcblxyXG4gICAgICAgIGlmICghdHJlZS5fbGlzdGVuZXJzKSB7XHJcbiAgICAgICAgICB0cmVlLl9saXN0ZW5lcnMgPSBsaXN0ZW5lcjtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICBpZiAodHlwZW9mIHRyZWUuX2xpc3RlbmVycyA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgICAgICB0cmVlLl9saXN0ZW5lcnMgPSBbdHJlZS5fbGlzdGVuZXJzXTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB0cmVlLl9saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XHJcblxyXG4gICAgICAgICAgaWYgKFxyXG4gICAgICAgICAgICAhdHJlZS5fbGlzdGVuZXJzLndhcm5lZCAmJlxyXG4gICAgICAgICAgICB0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzID4gMCAmJlxyXG4gICAgICAgICAgICB0cmVlLl9saXN0ZW5lcnMubGVuZ3RoID4gdGhpcy5fZXZlbnRzLm1heExpc3RlbmVyc1xyXG4gICAgICAgICAgKSB7XHJcbiAgICAgICAgICAgIHRyZWUuX2xpc3RlbmVycy53YXJuZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICBsb2dQb3NzaWJsZU1lbW9yeUxlYWsuY2FsbCh0aGlzLCB0cmVlLl9saXN0ZW5lcnMubGVuZ3RoLCBuYW1lKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgbmFtZSA9IHR5cGUuc2hpZnQoKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhblxyXG4gIC8vIDEwIGxpc3RlbmVycyBhcmUgYWRkZWQgdG8gaXQuIFRoaXMgaXMgYSB1c2VmdWwgZGVmYXVsdCB3aGljaFxyXG4gIC8vIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxyXG4gIC8vXHJcbiAgLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXHJcbiAgLy8gdGhhdCB0byBiZSBpbmNyZWFzZWQuIFNldCB0byB6ZXJvIGZvciB1bmxpbWl0ZWQuXHJcblxyXG4gIEV2ZW50RW1pdHRlci5wcm90b3R5cGUuZGVsaW1pdGVyID0gJy4nO1xyXG5cclxuICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLnNldE1heExpc3RlbmVycyA9IGZ1bmN0aW9uKG4pIHtcclxuICAgIGlmIChuICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhpcy5fZXZlbnRzIHx8IGluaXQuY2FsbCh0aGlzKTtcclxuICAgICAgdGhpcy5fZXZlbnRzLm1heExpc3RlbmVycyA9IG47XHJcbiAgICAgIGlmICghdGhpcy5fY29uZikgdGhpcy5fY29uZiA9IHt9O1xyXG4gICAgICB0aGlzLl9jb25mLm1heExpc3RlbmVycyA9IG47XHJcbiAgICB9XHJcbiAgfTtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5ldmVudCA9ICcnO1xyXG5cclxuICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uY2UgPSBmdW5jdGlvbihldmVudCwgZm4pIHtcclxuICAgIHRoaXMubWFueShldmVudCwgMSwgZm4pO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5tYW55ID0gZnVuY3Rpb24oZXZlbnQsIHR0bCwgZm4pIHtcclxuICAgIHZhciBzZWxmID0gdGhpcztcclxuXHJcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWFueSBvbmx5IGFjY2VwdHMgaW5zdGFuY2VzIG9mIEZ1bmN0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIoKSB7XHJcbiAgICAgIGlmICgtLXR0bCA9PT0gMCkge1xyXG4gICAgICAgIHNlbGYub2ZmKGV2ZW50LCBsaXN0ZW5lcik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XHJcbiAgICB9XHJcblxyXG4gICAgbGlzdGVuZXIuX29yaWdpbiA9IGZuO1xyXG5cclxuICAgIHRoaXMub24oZXZlbnQsIGxpc3RlbmVyKTtcclxuXHJcbiAgICByZXR1cm4gc2VsZjtcclxuICB9O1xyXG5cclxuICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICB0aGlzLl9ldmVudHMgfHwgaW5pdC5jYWxsKHRoaXMpO1xyXG5cclxuICAgIHZhciB0eXBlID0gYXJndW1lbnRzWzBdO1xyXG5cclxuICAgIGlmICh0eXBlID09PSAnbmV3TGlzdGVuZXInICYmICF0aGlzLm5ld0xpc3RlbmVyKSB7XHJcbiAgICAgIGlmICghdGhpcy5fZXZlbnRzLm5ld0xpc3RlbmVyKSB7XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGFsID0gYXJndW1lbnRzLmxlbmd0aDtcclxuICAgIHZhciBhcmdzLGwsaSxqO1xyXG4gICAgdmFyIGhhbmRsZXI7XHJcblxyXG4gICAgaWYgKHRoaXMuX2FsbCAmJiB0aGlzLl9hbGwubGVuZ3RoKSB7XHJcbiAgICAgIGhhbmRsZXIgPSB0aGlzLl9hbGwuc2xpY2UoKTtcclxuICAgICAgaWYgKGFsID4gMykge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoYWwpO1xyXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBhbDsgaisrKSBhcmdzW2pdID0gYXJndW1lbnRzW2pdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGkgPSAwLCBsID0gaGFuZGxlci5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICB0aGlzLmV2ZW50ID0gdHlwZTtcclxuICAgICAgICBzd2l0Y2ggKGFsKSB7XHJcbiAgICAgICAgY2FzZSAxOlxyXG4gICAgICAgICAgaGFuZGxlcltpXS5jYWxsKHRoaXMsIHR5cGUpO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAyOlxyXG4gICAgICAgICAgaGFuZGxlcltpXS5jYWxsKHRoaXMsIHR5cGUsIGFyZ3VtZW50c1sxXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBoYW5kbGVyW2ldLmNhbGwodGhpcywgdHlwZSwgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgIGhhbmRsZXJbaV0uYXBwbHkodGhpcywgYXJncyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMud2lsZGNhcmQpIHtcclxuICAgICAgaGFuZGxlciA9IFtdO1xyXG4gICAgICB2YXIgbnMgPSB0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycgPyB0eXBlLnNwbGl0KHRoaXMuZGVsaW1pdGVyKSA6IHR5cGUuc2xpY2UoKTtcclxuICAgICAgc2VhcmNoTGlzdGVuZXJUcmVlLmNhbGwodGhpcywgaGFuZGxlciwgbnMsIHRoaXMubGlzdGVuZXJUcmVlLCAwKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGhhbmRsZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XHJcbiAgICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIHRoaXMuZXZlbnQgPSB0eXBlO1xyXG4gICAgICAgIHN3aXRjaCAoYWwpIHtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcyk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgYXJncyA9IG5ldyBBcnJheShhbCAtIDEpO1xyXG4gICAgICAgICAgZm9yIChqID0gMTsgaiA8IGFsOyBqKyspIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xyXG4gICAgICAgICAgaGFuZGxlci5hcHBseSh0aGlzLCBhcmdzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlcikge1xyXG4gICAgICAgIC8vIG5lZWQgdG8gbWFrZSBjb3B5IG9mIGhhbmRsZXJzIGJlY2F1c2UgbGlzdCBjYW4gY2hhbmdlIGluIHRoZSBtaWRkbGVcclxuICAgICAgICAvLyBvZiBlbWl0IGNhbGxcclxuICAgICAgICBoYW5kbGVyID0gaGFuZGxlci5zbGljZSgpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGhhbmRsZXIgJiYgaGFuZGxlci5sZW5ndGgpIHtcclxuICAgICAgaWYgKGFsID4gMykge1xyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoYWwgLSAxKTtcclxuICAgICAgICBmb3IgKGogPSAxOyBqIDwgYWw7IGorKykgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XHJcbiAgICAgIH1cclxuICAgICAgZm9yIChpID0gMCwgbCA9IGhhbmRsZXIubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgdGhpcy5ldmVudCA9IHR5cGU7XHJcbiAgICAgICAgc3dpdGNoIChhbCkge1xyXG4gICAgICAgIGNhc2UgMTpcclxuICAgICAgICAgIGhhbmRsZXJbaV0uY2FsbCh0aGlzKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIGhhbmRsZXJbaV0uY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xyXG4gICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgY2FzZSAzOlxyXG4gICAgICAgICAgaGFuZGxlcltpXS5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICBoYW5kbGVyW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2FsbCAmJiB0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgIGlmIChhcmd1bWVudHNbMV0gaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgIHRocm93IGFyZ3VtZW50c1sxXTsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmNhdWdodCwgdW5zcGVjaWZpZWQgJ2Vycm9yJyBldmVudC5cIik7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiAhIXRoaXMuX2FsbDtcclxuICB9O1xyXG5cclxuICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXRBc3luYyA9IGZ1bmN0aW9uKCkge1xyXG5cclxuICAgIHRoaXMuX2V2ZW50cyB8fCBpbml0LmNhbGwodGhpcyk7XHJcblxyXG4gICAgdmFyIHR5cGUgPSBhcmd1bWVudHNbMF07XHJcblxyXG4gICAgaWYgKHR5cGUgPT09ICduZXdMaXN0ZW5lcicgJiYgIXRoaXMubmV3TGlzdGVuZXIpIHtcclxuICAgICAgICBpZiAoIXRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcikgeyByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtmYWxzZV0pOyB9XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIHByb21pc2VzPSBbXTtcclxuXHJcbiAgICB2YXIgYWwgPSBhcmd1bWVudHMubGVuZ3RoO1xyXG4gICAgdmFyIGFyZ3MsbCxpLGo7XHJcbiAgICB2YXIgaGFuZGxlcjtcclxuXHJcbiAgICBpZiAodGhpcy5fYWxsKSB7XHJcbiAgICAgIGlmIChhbCA+IDMpIHtcclxuICAgICAgICBhcmdzID0gbmV3IEFycmF5KGFsKTtcclxuICAgICAgICBmb3IgKGogPSAxOyBqIDwgYWw7IGorKykgYXJnc1tqXSA9IGFyZ3VtZW50c1tqXTtcclxuICAgICAgfVxyXG4gICAgICBmb3IgKGkgPSAwLCBsID0gdGhpcy5fYWxsLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZXZlbnQgPSB0eXBlO1xyXG4gICAgICAgIHN3aXRjaCAoYWwpIHtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2FsbFtpXS5jYWxsKHRoaXMsIHR5cGUpKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMjpcclxuICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fYWxsW2ldLmNhbGwodGhpcywgdHlwZSwgYXJndW1lbnRzWzFdKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDM6XHJcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHRoaXMuX2FsbFtpXS5jYWxsKHRoaXMsIHR5cGUsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcHJvbWlzZXMucHVzaCh0aGlzLl9hbGxbaV0uYXBwbHkodGhpcywgYXJncykpO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLndpbGRjYXJkKSB7XHJcbiAgICAgIGhhbmRsZXIgPSBbXTtcclxuICAgICAgdmFyIG5zID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnID8gdHlwZS5zcGxpdCh0aGlzLmRlbGltaXRlcikgOiB0eXBlLnNsaWNlKCk7XHJcbiAgICAgIHNlYXJjaExpc3RlbmVyVHJlZS5jYWxsKHRoaXMsIGhhbmRsZXIsIG5zLCB0aGlzLmxpc3RlbmVyVHJlZSwgMCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB0aGlzLmV2ZW50ID0gdHlwZTtcclxuICAgICAgc3dpdGNoIChhbCkge1xyXG4gICAgICBjYXNlIDE6XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChoYW5kbGVyLmNhbGwodGhpcykpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlIDI6XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdKSk7XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIGNhc2UgMzpcclxuICAgICAgICBwcm9taXNlcy5wdXNoKGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0sIGFyZ3VtZW50c1syXSkpO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIGFyZ3MgPSBuZXcgQXJyYXkoYWwgLSAxKTtcclxuICAgICAgICBmb3IgKGogPSAxOyBqIDwgYWw7IGorKykgYXJnc1tqIC0gMV0gPSBhcmd1bWVudHNbal07XHJcbiAgICAgICAgcHJvbWlzZXMucHVzaChoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmIChoYW5kbGVyICYmIGhhbmRsZXIubGVuZ3RoKSB7XHJcbiAgICAgIGhhbmRsZXIgPSBoYW5kbGVyLnNsaWNlKCk7XHJcbiAgICAgIGlmIChhbCA+IDMpIHtcclxuICAgICAgICBhcmdzID0gbmV3IEFycmF5KGFsIC0gMSk7XHJcbiAgICAgICAgZm9yIChqID0gMTsgaiA8IGFsOyBqKyspIGFyZ3NbaiAtIDFdID0gYXJndW1lbnRzW2pdO1xyXG4gICAgICB9XHJcbiAgICAgIGZvciAoaSA9IDAsIGwgPSBoYW5kbGVyLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIHRoaXMuZXZlbnQgPSB0eXBlO1xyXG4gICAgICAgIHN3aXRjaCAoYWwpIHtcclxuICAgICAgICBjYXNlIDE6XHJcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGhhbmRsZXJbaV0uY2FsbCh0aGlzKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBjYXNlIDI6XHJcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKGhhbmRsZXJbaV0uY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIGNhc2UgMzpcclxuICAgICAgICAgIHByb21pc2VzLnB1c2goaGFuZGxlcltpXS5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKSk7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgcHJvbWlzZXMucHVzaChoYW5kbGVyW2ldLmFwcGx5KHRoaXMsIGFyZ3MpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSBpZiAoIXRoaXMuX2FsbCAmJiB0eXBlID09PSAnZXJyb3InKSB7XHJcbiAgICAgIGlmIChhcmd1bWVudHNbMV0gaW5zdGFuY2VvZiBFcnJvcikge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChhcmd1bWVudHNbMV0pOyAvLyBVbmhhbmRsZWQgJ2Vycm9yJyBldmVudFxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcIlVuY2F1Z2h0LCB1bnNwZWNpZmllZCAnZXJyb3InIGV2ZW50LlwiKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XHJcbiAgfTtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XHJcbiAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdmdW5jdGlvbicpIHtcclxuICAgICAgdGhpcy5vbkFueSh0eXBlKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ29uIG9ubHkgYWNjZXB0cyBpbnN0YW5jZXMgb2YgRnVuY3Rpb24nKTtcclxuICAgIH1cclxuICAgIHRoaXMuX2V2ZW50cyB8fCBpbml0LmNhbGwodGhpcyk7XHJcblxyXG4gICAgLy8gVG8gYXZvaWQgcmVjdXJzaW9uIGluIHRoZSBjYXNlIHRoYXQgdHlwZSA9PSBcIm5ld0xpc3RlbmVyc1wiISBCZWZvcmVcclxuICAgIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJzXCIuXHJcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xyXG5cclxuICAgIGlmICh0aGlzLndpbGRjYXJkKSB7XHJcbiAgICAgIGdyb3dMaXN0ZW5lclRyZWUuY2FsbCh0aGlzLCB0eXBlLCBsaXN0ZW5lcik7XHJcbiAgICAgIHJldHVybiB0aGlzO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fZXZlbnRzW3R5cGVdKSB7XHJcbiAgICAgIC8vIE9wdGltaXplIHRoZSBjYXNlIG9mIG9uZSBsaXN0ZW5lci4gRG9uJ3QgbmVlZCB0aGUgZXh0cmEgYXJyYXkgb2JqZWN0LlxyXG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICBpZiAodHlwZW9mIHRoaXMuX2V2ZW50c1t0eXBlXSA9PT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICAgIC8vIENoYW5nZSB0byBhcnJheS5cclxuICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcclxuICAgICAgfVxyXG5cclxuICAgICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxyXG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ucHVzaChsaXN0ZW5lcik7XHJcblxyXG4gICAgICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xyXG4gICAgICBpZiAoXHJcbiAgICAgICAgIXRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgJiZcclxuICAgICAgICB0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzID4gMCAmJlxyXG4gICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiB0aGlzLl9ldmVudHMubWF4TGlzdGVuZXJzXHJcbiAgICAgICkge1xyXG4gICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xyXG4gICAgICAgIGxvZ1Bvc3NpYmxlTWVtb3J5TGVhay5jYWxsKHRoaXMsIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgsIHR5cGUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfTtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbkFueSA9IGZ1bmN0aW9uKGZuKSB7XHJcbiAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcignb25Bbnkgb25seSBhY2NlcHRzIGluc3RhbmNlcyBvZiBGdW5jdGlvbicpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmICghdGhpcy5fYWxsKSB7XHJcbiAgICAgIHRoaXMuX2FsbCA9IFtdO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCB0aGUgZnVuY3Rpb24gdG8gdGhlIGV2ZW50IGxpc3RlbmVyIGNvbGxlY3Rpb24uXHJcbiAgICB0aGlzLl9hbGwucHVzaChmbik7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG5cclxuICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbjtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xyXG4gICAgaWYgKHR5cGVvZiBsaXN0ZW5lciAhPT0gJ2Z1bmN0aW9uJykge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3JlbW92ZUxpc3RlbmVyIG9ubHkgdGFrZXMgaW5zdGFuY2VzIG9mIEZ1bmN0aW9uJyk7XHJcbiAgICB9XHJcblxyXG4gICAgdmFyIGhhbmRsZXJzLGxlYWZzPVtdO1xyXG5cclxuICAgIGlmKHRoaXMud2lsZGNhcmQpIHtcclxuICAgICAgdmFyIG5zID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnID8gdHlwZS5zcGxpdCh0aGlzLmRlbGltaXRlcikgOiB0eXBlLnNsaWNlKCk7XHJcbiAgICAgIGxlYWZzID0gc2VhcmNoTGlzdGVuZXJUcmVlLmNhbGwodGhpcywgbnVsbCwgbnMsIHRoaXMubGlzdGVuZXJUcmVlLCAwKTtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICAvLyBkb2VzIG5vdCB1c2UgbGlzdGVuZXJzKCksIHNvIG5vIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIF9ldmVudHNbdHlwZV1cclxuICAgICAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pIHJldHVybiB0aGlzO1xyXG4gICAgICBoYW5kbGVycyA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcclxuICAgICAgbGVhZnMucHVzaCh7X2xpc3RlbmVyczpoYW5kbGVyc30pO1xyXG4gICAgfVxyXG5cclxuICAgIGZvciAodmFyIGlMZWFmPTA7IGlMZWFmPGxlYWZzLmxlbmd0aDsgaUxlYWYrKykge1xyXG4gICAgICB2YXIgbGVhZiA9IGxlYWZzW2lMZWFmXTtcclxuICAgICAgaGFuZGxlcnMgPSBsZWFmLl9saXN0ZW5lcnM7XHJcbiAgICAgIGlmIChpc0FycmF5KGhhbmRsZXJzKSkge1xyXG5cclxuICAgICAgICB2YXIgcG9zaXRpb24gPSAtMTtcclxuXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGhhbmRsZXJzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICBpZiAoaGFuZGxlcnNbaV0gPT09IGxpc3RlbmVyIHx8XHJcbiAgICAgICAgICAgIChoYW5kbGVyc1tpXS5saXN0ZW5lciAmJiBoYW5kbGVyc1tpXS5saXN0ZW5lciA9PT0gbGlzdGVuZXIpIHx8XHJcbiAgICAgICAgICAgIChoYW5kbGVyc1tpXS5fb3JpZ2luICYmIGhhbmRsZXJzW2ldLl9vcmlnaW4gPT09IGxpc3RlbmVyKSkge1xyXG4gICAgICAgICAgICBwb3NpdGlvbiA9IGk7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCkge1xyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZih0aGlzLndpbGRjYXJkKSB7XHJcbiAgICAgICAgICBsZWFmLl9saXN0ZW5lcnMuc3BsaWNlKHBvc2l0aW9uLCAxKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9ldmVudHNbdHlwZV0uc3BsaWNlKHBvc2l0aW9uLCAxKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChoYW5kbGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGlmKHRoaXMud2lsZGNhcmQpIHtcclxuICAgICAgICAgICAgZGVsZXRlIGxlYWYuX2xpc3RlbmVycztcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5lbWl0KFwicmVtb3ZlTGlzdGVuZXJcIiwgdHlwZSwgbGlzdGVuZXIpO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgfVxyXG4gICAgICBlbHNlIGlmIChoYW5kbGVycyA9PT0gbGlzdGVuZXIgfHxcclxuICAgICAgICAoaGFuZGxlcnMubGlzdGVuZXIgJiYgaGFuZGxlcnMubGlzdGVuZXIgPT09IGxpc3RlbmVyKSB8fFxyXG4gICAgICAgIChoYW5kbGVycy5fb3JpZ2luICYmIGhhbmRsZXJzLl9vcmlnaW4gPT09IGxpc3RlbmVyKSkge1xyXG4gICAgICAgIGlmKHRoaXMud2lsZGNhcmQpIHtcclxuICAgICAgICAgIGRlbGV0ZSBsZWFmLl9saXN0ZW5lcnM7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZW1pdChcInJlbW92ZUxpc3RlbmVyXCIsIHR5cGUsIGxpc3RlbmVyKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGZ1bmN0aW9uIHJlY3Vyc2l2ZWx5R2FyYmFnZUNvbGxlY3Qocm9vdCkge1xyXG4gICAgICBpZiAocm9vdCA9PT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgcmV0dXJuO1xyXG4gICAgICB9XHJcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMocm9vdCk7XHJcbiAgICAgIGZvciAodmFyIGkgaW4ga2V5cykge1xyXG4gICAgICAgIHZhciBrZXkgPSBrZXlzW2ldO1xyXG4gICAgICAgIHZhciBvYmogPSByb290W2tleV07XHJcbiAgICAgICAgaWYgKChvYmogaW5zdGFuY2VvZiBGdW5jdGlvbikgfHwgKHR5cGVvZiBvYmogIT09IFwib2JqZWN0XCIpIHx8IChvYmogPT09IG51bGwpKVxyXG4gICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcmVjdXJzaXZlbHlHYXJiYWdlQ29sbGVjdChyb290W2tleV0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAoT2JqZWN0LmtleXMob2JqKS5sZW5ndGggPT09IDApIHtcclxuICAgICAgICAgIGRlbGV0ZSByb290W2tleV07XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZWN1cnNpdmVseUdhcmJhZ2VDb2xsZWN0KHRoaXMubGlzdGVuZXJUcmVlKTtcclxuXHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9O1xyXG5cclxuICBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZkFueSA9IGZ1bmN0aW9uKGZuKSB7XHJcbiAgICB2YXIgaSA9IDAsIGwgPSAwLCBmbnM7XHJcbiAgICBpZiAoZm4gJiYgdGhpcy5fYWxsICYmIHRoaXMuX2FsbC5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGZucyA9IHRoaXMuX2FsbDtcclxuICAgICAgZm9yKGkgPSAwLCBsID0gZm5zLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgIGlmKGZuID09PSBmbnNbaV0pIHtcclxuICAgICAgICAgIGZucy5zcGxpY2UoaSwgMSk7XHJcbiAgICAgICAgICB0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lckFueVwiLCBmbik7XHJcbiAgICAgICAgICByZXR1cm4gdGhpcztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGZucyA9IHRoaXMuX2FsbDtcclxuICAgICAgZm9yKGkgPSAwLCBsID0gZm5zLmxlbmd0aDsgaSA8IGw7IGkrKylcclxuICAgICAgICB0aGlzLmVtaXQoXCJyZW1vdmVMaXN0ZW5lckFueVwiLCBmbnNbaV0pO1xyXG4gICAgICB0aGlzLl9hbGwgPSBbXTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcblxyXG4gIEV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBFdmVudEVtaXR0ZXIucHJvdG90eXBlLm9mZjtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XHJcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAhdGhpcy5fZXZlbnRzIHx8IGluaXQuY2FsbCh0aGlzKTtcclxuICAgICAgcmV0dXJuIHRoaXM7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMud2lsZGNhcmQpIHtcclxuICAgICAgdmFyIG5zID0gdHlwZW9mIHR5cGUgPT09ICdzdHJpbmcnID8gdHlwZS5zcGxpdCh0aGlzLmRlbGltaXRlcikgOiB0eXBlLnNsaWNlKCk7XHJcbiAgICAgIHZhciBsZWFmcyA9IHNlYXJjaExpc3RlbmVyVHJlZS5jYWxsKHRoaXMsIG51bGwsIG5zLCB0aGlzLmxpc3RlbmVyVHJlZSwgMCk7XHJcblxyXG4gICAgICBmb3IgKHZhciBpTGVhZj0wOyBpTGVhZjxsZWFmcy5sZW5ndGg7IGlMZWFmKyspIHtcclxuICAgICAgICB2YXIgbGVhZiA9IGxlYWZzW2lMZWFmXTtcclxuICAgICAgICBsZWFmLl9saXN0ZW5lcnMgPSBudWxsO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHMpIHtcclxuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbnVsbDtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH07XHJcblxyXG4gIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJzID0gZnVuY3Rpb24odHlwZSkge1xyXG4gICAgaWYgKHRoaXMud2lsZGNhcmQpIHtcclxuICAgICAgdmFyIGhhbmRsZXJzID0gW107XHJcbiAgICAgIHZhciBucyA9IHR5cGVvZiB0eXBlID09PSAnc3RyaW5nJyA/IHR5cGUuc3BsaXQodGhpcy5kZWxpbWl0ZXIpIDogdHlwZS5zbGljZSgpO1xyXG4gICAgICBzZWFyY2hMaXN0ZW5lclRyZWUuY2FsbCh0aGlzLCBoYW5kbGVycywgbnMsIHRoaXMubGlzdGVuZXJUcmVlLCAwKTtcclxuICAgICAgcmV0dXJuIGhhbmRsZXJzO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuX2V2ZW50cyB8fCBpbml0LmNhbGwodGhpcyk7XHJcblxyXG4gICAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFtdO1xyXG4gICAgaWYgKCFpc0FycmF5KHRoaXMuX2V2ZW50c1t0eXBlXSkpIHtcclxuICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXV07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5fZXZlbnRzW3R5cGVdO1xyXG4gIH07XHJcblxyXG4gIEV2ZW50RW1pdHRlci5wcm90b3R5cGUubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKHR5cGUpIHtcclxuICAgIHJldHVybiB0aGlzLmxpc3RlbmVycyh0eXBlKS5sZW5ndGg7XHJcbiAgfTtcclxuXHJcbiAgRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnNBbnkgPSBmdW5jdGlvbigpIHtcclxuXHJcbiAgICBpZih0aGlzLl9hbGwpIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX2FsbDtcclxuICAgIH1cclxuICAgIGVsc2Uge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gIH07XHJcblxyXG4gIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcclxuICAgICAvLyBBTUQuIFJlZ2lzdGVyIGFzIGFuIGFub255bW91cyBtb2R1bGUuXHJcbiAgICBkZWZpbmUoZnVuY3Rpb24oKSB7XHJcbiAgICAgIHJldHVybiBFdmVudEVtaXR0ZXI7XHJcbiAgICB9KTtcclxuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xyXG4gICAgLy8gQ29tbW9uSlNcclxuICAgIG1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xyXG4gIH1cclxuICBlbHNlIHtcclxuICAgIC8vIEJyb3dzZXIgZ2xvYmFsLlxyXG4gICAgd2luZG93LkV2ZW50RW1pdHRlcjIgPSBFdmVudEVtaXR0ZXI7XHJcbiAgfVxyXG59KCk7XHJcbiIsImltcG9ydCBFdmVudEVtaXR0ZXIgZnJvbSAnZXZlbnRlbWl0dGVyMic7XG5cbi8qKlxuICogU2VhcmNoIEFQSSBDbGFzc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTZWFyY2ggZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlIGEgbmV3IFNlYXJjaCBpbnN0YW5jZSwgYW5kIG92ZXJyaWRlIGRlZmF1bHRzXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBvcHRpb25zLnR5cGUgLSBTZWFyY2ggcmVzdHJpY3Rpb24uIFVzZSAnYXJ0aWNsZScsICdwYWdlJywgJ3Byb2R1Y3QnLCBvciAnJ1xuICAgKiBAcHJvcGVydHkge3N0cmluZ30gb3B0aW9ucy52aWV3IC0gU2VhcmNoIHRlbXBsYXRlIHN1ZmZpeC4gU3BlY2lmeSBkaWZmZXJlbnQgdGVtcGxhdGVzIGFzIG5lZWRlZFxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICBcbiAgICB0aGlzLnNlYXJjaFR5cGUgPSBvcHRpb25zLnR5cGUgfHwgJyc7XG4gICAgdGhpcy52aWV3ID0gb3B0aW9ucy52aWV3IHx8ICdqc29uJztcblxuICAgIHRoaXMuaW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgIFxuICAgIHRoaXMueGhyID0gd2luZG93LlhNTEh0dHBSZXF1ZXN0XG4gICAgICA/IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgICA6IG5ldyBBY3RpdmVYT2JqZWN0KCdNaWNyb3NvZnQuWE1MSFRUUCcpO1xuXG4gICAgdGhpcy5feGhyTG9hZCA9IHRoaXMuX3hockxvYWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl94aHJFcnJvciA9IHRoaXMuX3hockVycm9yLmJpbmQodGhpcyk7XG4gICAgdGhpcy5feGhyQWJvcnQgPSB0aGlzLl94aHJBYm9ydC5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICB9XG5cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgdGhpcy54aHIuYWRkRXZlbnRMaXN0ZW5lcignbG9hZCcsIHRoaXMuX3hockxvYWQpO1xuICAgIHRoaXMueGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgdGhpcy5feGhyRXJyb3IpO1xuICAgIHRoaXMueGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgdGhpcy5feGhyQWJvcnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFhIUiB3YXMgc3VjY2Vzc2Z1bGxcbiAgICpcbiAgICogQGRlc2NyaXB0aW9uIFhIUiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAqIEBwYXJhbSB7b2JqZWN0fSBldmVudFxuICAgKiBAZmlyZXMgU2VhcmNoI2NvbXBsZXRlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfeGhyTG9hZChldmVudCkge1xuICAgIGxldCByZXNwb25zZSA9IHt9O1xuICAgIGNvbnN0IHJlYWR5U3RhdGUgPSBldmVudC50YXJnZXQucmVhZHlTdGF0ZTtcbiAgICBjb25zdCBzdGF0dXMgPSBldmVudC50YXJnZXQuc3RhdHVzO1xuXG4gICAgdHJ5IHtcbiAgICAgIGlmIChyZWFkeVN0YXRlID4gMyAmJiBzdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShldmVudC50YXJnZXQucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgdGhpcy5lbWl0KCdjb21wbGV0ZScsIHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgSW52YWxpZCByZWFkeVN0YXRlOiAke3JlYWR5U3RhdGV9LCBvciBzdGF0dXM6ICR7c3RhdHVzfS5gO1xuICAgICAgICByZXR1cm4gdGhpcy5feGhyRXJyb3IoZXZlbnQsIG1lc3NhZ2UpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5feGhyRXJyb3IoZXZlbnQsICdJbnZhbGlkIEpTT04nLCBlcnJvcik7XG4gICAgfVxuXG4gICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogWEhSIGNvbnRhaW5zIGFuIGVycm9yXG4gICAqXG4gICAqIEBkZXNjcmlwdGlvbiBYSFIgaGFzIGNvbnRhaW5lZCBhbiBlcnJvciwgYW5kIHdhcyB1bmFibGUgdG8gY29tcGxldGVcbiAgICogQHBhcmFtIHtvYmplY3R9IGV2ZW50XG4gICAqIEBwYXJhbSB7b2JqZWN0fHN0cmluZ30gbWVzc2FnZVxuICAgKiBAcGFyYW0ge29iamVjdH0gZXJyb3JcbiAgICogQGZpcmVzIFNlYXJjaCNlcnJvclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3hockVycm9yKGV2ZW50LCBtZXNzYWdlID0gbnVsbCwgZXJyb3IgPSBudWxsKSB7XG4gICAgdGhpcy5pblByb2dyZXNzID0gZmFsc2U7XG4gICAgdGhpcy5lbWl0KCdlcnJvcicsIHtldmVudCwgbWVzc2FnZSwgZXJyb3J9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBYSFIgaGFzIGJlZW4gYWJvcnRlZFxuICAgKlxuICAgKiBAZGVzY3JpcHRpb24gVGhpcyBldmVudCBvbmx5IGZpcmVzIGlmIHRoZXJlIGlzIGFuIGFjdGl2ZSBYSFIgcmVxdWVzdCB0aGF0IGhhcyBiZWVuIHRlcm1pbmF0ZWRcbiAgICogQGZpcmVzIFNlYXJjaCNhYm9ydGVkXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfeGhyQWJvcnQoKSB7XG4gICAgdGhpcy5lbWl0KCdhYm9ydGVkJyk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSB0aGUgc2VhcmNoXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXJtIC0gU2VhcmNoIHRlcm0ocylcbiAgICogQGZpcmVzIFNlYXJjaCNpbml0aWFsaXplZFxuICAgKiBAZmlyZXMgU2VhcmNoI2NhbmNlbGxlZFxuICAgKi9cbiAgZXhlY3V0ZSh0ZXJtKSB7XG4gICAgdGhpcy5lbWl0KCdpbml0aWFsaXplZCcsIHt0ZXJtfSk7XG5cbiAgICBpZiAodGhpcy5pblByb2dyZXNzKSB7XG4gICAgICB0aGlzLmVtaXQoJ2NhbmNlbGxlZCcpO1xuICAgICAgdGhpcy54aHIuYWJvcnQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmluUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgY29uc3QgdXJsID0gJy9zZWFyY2gnO1xuICAgIGNvbnN0IHBhcmFtcyA9IHtcbiAgICAgIHE6IHRlcm0sXG4gICAgICB0eXBlOiB0aGlzLnNlYXJjaFR5cGUsXG4gICAgICB2aWV3OiB0aGlzLnZpZXcsXG4gICAgfTtcblxuICAgIGNvbnN0IHNlYXJjaFBhcmFtcyA9IE9iamVjdC5rZXlzKHBhcmFtcykubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV07XG4gICAgICByZXR1cm4gYCR7ZW5jb2RlVVJJQ29tcG9uZW50KGtleSl9PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHZhbHVlKX1gXG4gICAgfSkuam9pbignJicpO1xuXG4gICAgdGhpcy54aHIub3BlbignZ2V0JywgYCR7dXJsfT8ke3NlYXJjaFBhcmFtc31gKTtcbiAgICB0aGlzLnhoci5zZXRSZXF1ZXN0SGVhZGVyKCdBY2NlcHQnLCAnYXBwbGljYXRpb24vanNvbicpO1xuICAgIHRoaXMueGhyLnNlbmQoKTtcbiAgfVxufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBYSFIgaW5pdGlhbGl6ZWRcbiAqIEBldmVudCBTZWFyY2gjaW5pdGlhbGl6ZWRcbiAqIEB0eXBlIHtvYmplY3R9XG4gKi9cblxuLyoqXG4gKiBAZGVzY3JpcHRpb24gWEhSIGNvbXBsZXRlZFxuICogQGV2ZW50IFNlYXJjaCNjb21wbGV0ZVxuICogQHByb3BlcnR5IHtvYmplY3R9IHJlc3BvbnNlIC0gSlNPTiByZXNwb25zZSBmcm9tIGVuZCBwb2ludFxuICovXG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIFhIUiBoYWQgYW4gZXJyb3JcbiAqIEBldmVudCBTZWFyY2gjZXJyb3JcbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBYSFIgY2FuY2VsbGVkIGR1ZSB0byB1c2VyIGludGVyYWN0aW9uLiBJZiBhbiBYSFIgaXMgYmVpbmcgcHJvY2Vzc2VkLCB0aGlzIGRvZXMgbm90IHRlcm1pbmF0ZSBpdFxuICogQGV2ZW50IFNlYXJjaCNjYW5jZWxsZWRcbiAqL1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBYSFIgYWJvcnRlZCBkdWUgdG8gdXNlciBpbnRlcmFjdGlvbiwgdGVybWluYXRpbmcgcHJldmlvdXNseSBleGVjdXRlZCBYSFIuXG4gKiBAZXZlbnQgU2VhcmNoI2Fib3J0ZWRcbiAqL1xuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VhcmNoRm9ybSB7XG4gIGNvbnN0cnVjdG9yKCRjb250YWluZXIpIHtcbiAgICB0aGlzLiRib2R5ID0gJCgnYm9keScpO1xuICAgIHRoaXMuJGNvbnRhaW5lciA9ICRjb250YWluZXI7XG4gICAgdGhpcy4kZm9ybSA9IHRoaXMuJGNvbnRhaW5lci5maW5kKCdbZGF0YS1saXZlLXNlYXJjaC1mb3JtXScpO1xuXG4gICAgdGhpcy5zdWJtaXRIYW5kbGVyID0gdGhpcy5zdWJtaXRIYW5kbGVyLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmV2ZW50cyA9IFtcbiAgICAgIHRoaXMuJGZvcm0ub24oJ3N1Ym1pdC5zZWFyY2gtZm9ybScsIHRoaXMuc3VibWl0SGFuZGxlciksXG4gICAgXTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKCRlbCA9PiAkZWwub2ZmKCcuc2VhcmNoLWZvcm0nKSk7XG4gIH1cblxuICBzdWJtaXRIYW5kbGVyKGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0ICRmb3JtID0gJChldmVudC5jdXJyZW50VGFyZ2V0KS5jbG9uZSgpO1xuICAgIGNvbnN0ICR0ZXJtcyA9ICRmb3JtLmZpbmQoJ1tuYW1lPXFdJyk7XG5cbiAgICAkZm9ybS5jc3Moe1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBsZWZ0OiAtMTAwMCxcbiAgICAgIGJvdHRvbTogLTEwMDAsXG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICB9KTtcblxuICAgIGxldCB0ZXJtcyA9ICR0ZXJtcy52YWwoKTtcblxuICAgIC8vIEFkZHMgYCpgIGFmdGVyIGVhY2ggd29yZCBpbiBzZWFyY2ggdGVybXMsIGRvZXNuJ3QgYWRkIHRvIGxhc3Qgd29yZFxuICAgIGlmICh0ZXJtcy5pbmRleE9mKCcgJykgPiAwKSB7XG4gICAgICB0ZXJtcyA9IHRlcm1zLnNwbGl0KCcgJykuam9pbignKiAnKS50cmltKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkcyBgKmAgYXQgdGhlIGVuZCBvZiB0aGUgc2VhcmNoIHRlcm1zXG4gICAgdGVybXMgPSBgJHt0ZXJtc30qYDtcblxuICAgIC8vIFVwZGF0ZSB2YWx1ZVxuICAgICR0ZXJtcy52YWwodGVybXMpO1xuXG4gICAgLy8gRm9ybXMgbXVzdCBiZSBpbiB0aGUgYnJvd3NlciBjb250ZXh0IGluIG9yZGVyIHRvIHN1Ym1pdFxuICAgIHRoaXMuJGJvZHkuYXBwZW5kKCRmb3JtKTtcbiAgICAkZm9ybS5zdWJtaXQoKTtcbiAgfVxufVxuIiwiLyoqXG4gKiBTaG93cyBhIGxpc3QgaXRlbSBjb21wb25lbnQgd2hlbiByZXN1bHQgaXMgYW4gYXJ0aWNsZSwgb3IgYSBwYWdlXG4gKlxuICogQHBhcmFtIGNvbnRlbnRJdGVtXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENvbnRlbnRJdGVtKGNvbnRlbnRJdGVtKSB7XG4gIHJldHVybiBgXG4gIDxsaSBjbGFzcz1cInNlYXJjaC1mbHlkb3duLS1jb250ZW50LWl0ZW1cIj5cbiAgICA8YSBocmVmPVwiJHtjb250ZW50SXRlbS51cmx9XCI+JHtjb250ZW50SXRlbS50aXRsZX08L2E+XG4gIDwvbGk+XG4gIGA7XG59XG5cbi8qKlxuICogU2hvd3MgYSBoZWFkZXIgZm9yIHRoZSBhcnRpY2xlIGFuZCBwYWdlIHJlc3VsdHNcbiAqXG4gKiBAcGFyYW0gY29udGV4dFxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBDb250ZW50UmVzdWx0c0hlYWRlcihjb250ZXh0KSB7XG4gIHJldHVybiBgXG4gICAgPGg1IGNsYXNzPVwic2VhcmNoLWZseWRvd24tLWNvbnRlbnQtdGl0bGVcIj5cbiAgICAgICR7Y29udGV4dC5jb250ZW50X3Jlc3VsdHMudGl0bGV9XG4gICAgPC9oNT4gIFxuICBgO1xufVxuXG4vKipcbiAqIFNob3dzIGEgbGlzdCBvZiByZXN1bHRzIGZyb20gYXJ0aWNsZXMsIG9yIHBhZ2VzXG4gKlxuICogQHBhcmFtIHByb3BzXG4gKiBAcmV0dXJucyB7alF1ZXJ5fEhUTUxFbGVtZW50fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENvbnRlbnRSZXN1bHRzKHByb3BzKSB7XG4gIGNvbnN0IHsgY29udGVudCwgY29udGV4dCB9ID0gcHJvcHM7XG4gIGNvbnN0ICR0aXRsZSA9IENvbnRlbnRSZXN1bHRzSGVhZGVyKGNvbnRleHQpO1xuICBjb25zdCBjb250ZW50SXRlbXMgPSBjb250ZW50Lm1hcChjb250ZW50SXRlbSA9PiBDb250ZW50SXRlbShjb250ZW50SXRlbSkpO1xuXG4gIHJldHVybiAkKGBcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZseWRvd24tLWNvbnRlbnQtaXRlbXNcIj5cbiAgICAgICR7JHRpdGxlfVxuICAgICAgXG4gICAgICA8dWwgY2xhc3M9XCJzZWFyY2gtZmx5ZG93bi0tY29udGVudC1pdGVtcy1saXN0XCI+XG4gICAgICAgICR7Y29udGVudEl0ZW1zLmpvaW4oJycpfVxuICAgICAgPC91bD5cbiAgICA8L2Rpdj5cbiAgYCk7XG59XG5cbi8qKlxuICogU2hvd3MgYSBtZXNzYWdlIHdoZW4gdGhlcmUgYXJlIG5vIGFydGljbGUgb3IgcGFnZSByZXN1bHRzXG4gKlxuICogQHBhcmFtIHByb3BzXG4gKiBAcmV0dXJucyB7alF1ZXJ5fEhUTUxFbGVtZW50fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIENvbnRlbnROb1Jlc3VsdHMocHJvcHMpIHtcbiAgY29uc3QgeyBjb250ZXh0IH0gPSBwcm9wcztcbiAgY29uc3QgJHRpdGxlID0gQ29udGVudFJlc3VsdHNIZWFkZXIoY29udGV4dCk7XG5cbiAgcmV0dXJuICQoYFxuICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtZmx5ZG93bi0tY29udGVudC1pdGVtc1wiPlxuICAgICAgJHskdGl0bGV9XG4gICAgICBcbiAgICAgIDxwIGNsYXNzPVwic2VhcmNoLWZseWRvd24tLWNvbnRlbnQtaXRlbXMtbm9uZVwiPlxuICAgICAgICAke2NvbnRleHQuY29udGVudF9yZXN1bHRzLm5vX3Jlc3VsdHN9XG4gICAgICA8L3A+XG4gICAgPC9kaXY+XG4gIGApO1xufVxuXG4vKipcbiAqIFNob3dzIHRoZSBwcm9kdWN0J3MgY29tcGFyZV9hdF9wcmljZSwgd2l0aCBjb25uZWN0aW9uIGZvciBDdXJyZW5jeUNvbnZlcnRlclxuICpcbiAqIEBwYXJhbSBwcmljZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBQcm9kdWN0UHJpY2VDb21wYXJlQXQocHJpY2UpIHtcbiAgcmV0dXJuIGBcbiAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtZmx5ZG93bi0tcHJvZHVjdC1wcmljZS0tY29tcGFyZS1hdFwiPlxuICAgIDxzcGFuIGNsYXNzPVwibW9uZXlcIj4ke3ByaWNlLmNvbXBhcmVfYXRfcHJpY2V9PC9zcGFuPlxuICA8L3NwYW4+XG4gIGA7XG59XG5cbi8qKlxuICogU2hvd3MgdGhlIHByb2R1Y3QncyBwcmljZSwgd2l0aCBjb25uZWN0aW9uIGZvciBDdXJyZW5jeUNvbnZlcnRlclxuICpcbiAqIEBwYXJhbSBwcmljZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBQcm9kdWN0UHJpY2VNYWluKHByaWNlKSB7XG4gIHJldHVybiBgXG4gIDxzcGFuIGNsYXNzPVwic2VhcmNoLWZseWRvd24tLXByb2R1Y3QtcHJpY2UtLW1haW5cIj5cbiAgICA8c3BhbiBjbGFzcz1cIm1vbmV5XCI+JHtwcmljZS5wcmljZX08L3NwYW4+XG4gIDwvc3Bhbj5cbiAgYDtcbn1cblxuLyoqXG4gKiBTaG93cyB0aGUgcHJvZHVjdCdzIHByaWNlc1xuICpcbiAqIEBwYXJhbSBwcm9wc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBQcm9kdWN0UHJpY2UocHJvcHMpIHtcbiAgY29uc3QgeyBwcmljZSwgb25TYWxlLCBjb25zaXN0ZW50U2F2ZWQgfSA9IHByb3BzO1xuICBjb25zdCAkY29tcGFyZUF0ID0gb25TYWxlICYmIGNvbnNpc3RlbnRTYXZlZCA/IFByb2R1Y3RQcmljZUNvbXBhcmVBdChwcmljZSkgOiAnJztcbiAgY29uc3QgJHByaWNlID0gUHJvZHVjdFByaWNlTWFpbihwcmljZSk7XG5cbiAgcmV0dXJuIGBcbiAgICA8c3BhbiBjbGFzcz1cInNlYXJjaC1mbHlkb3duLS1wcm9kdWN0LXByaWNlICR7b25TYWxlID8gJ3NlYXJjaC1mbHlkb3duLS1wcm9kdWN0LXByaWNlLWhhcy1zYWxlJyA6ICcnfVwiPlxuICAgICAgJHskcHJpY2V9XG4gICAgICAkeyRjb21wYXJlQXR9XG4gICAgPC9zcGFuPlxuICBgO1xufVxuXG4vKipcbiAqIFNob3dzIGEgcHJvZHVjdCdzIG1haW4gY29udGVudFxuICpcbiAqIEBwYXJhbSBwcm9kdWN0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFByb2R1Y3RDb250ZW50KHByb2R1Y3QpIHtcbiAgY29uc3QgJHByaWNlID0gUHJvZHVjdFByaWNlKHtcbiAgICBwcmljZTogcHJvZHVjdC5wcmljZSxcbiAgICBvblNhbGU6IHByb2R1Y3Qub25fc2FsZSxcbiAgICBjb25zaXN0ZW50U2F2ZWQ6IHByb2R1Y3QuY29uc2lzdGVudF9zYXZlZCxcbiAgfSk7XG5cbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZseWRvd24tLXByb2R1Y3QtdGV4dFwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzZWFyY2gtZmx5ZG93bi0tcHJvZHVjdC10aXRsZVwiPlxuICAgICAgICAke3Byb2R1Y3QudGl0bGV9XG4gICAgICA8L3NwYW4+XG4gICAgICAkeyRwcmljZX1cbiAgICA8L2Rpdj5cbiAgYDtcbn1cblxuLyoqXG4gKiBTaG93cyBhIHByb2R1Y3QncyBpbWFnZVxuICpcbiAqIEBwYXJhbSBpbWFnZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBQcm9kdWN0SW1hZ2UoaW1hZ2UpIHtcbiAgcmV0dXJuIGBcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZseWRvd24tLXByb2R1Y3QtaW1hZ2VcIj5cbiAgICAgICR7aW1hZ2V9XG4gICAgPC9kaXY+XG4gIGA7XG59XG5cbi8qKlxuICogU2hvd3MgYSBwcm9kdWN0IGxpc3QgaXRlbSBjb21wb25lbnQgd2hlbiByZXN1bHQgaXMgYSBwcm9kdWN0XG4gKlxuICogQHBhcmFtIHByb2R1Y3RcbiAqIEBwYXJhbSBlbmFibGVJbWFnZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gUHJvZHVjdEl0ZW0ocHJvZHVjdCwgZW5hYmxlSW1hZ2VzKSB7XG4gIGNvbnN0ICRpbWFnZSA9IGVuYWJsZUltYWdlcyA/IFByb2R1Y3RJbWFnZShwcm9kdWN0LmltYWdlKSA6ICcnO1xuICBjb25zdCAkY29udGVudCA9IFByb2R1Y3RDb250ZW50KHByb2R1Y3QpO1xuXG4gIHJldHVybiBgXG4gICAgPGEgY2xhc3M9XCJzZWFyY2gtZmx5ZG93bi0tcHJvZHVjdCBzZWFyY2gtZmx5ZG93bi0tcHJvZHVjdFwiIGhyZWY9XCIke3Byb2R1Y3QudXJsfVwiPlxuICAgICAgJHskaW1hZ2V9XG4gICAgICAkeyRjb250ZW50fVxuICAgIDwvYT5cbiAgYDtcbn1cblxuLyoqXG4gKiBTaG93cyBhIGxpc3Qgb2YgcHJvZHVjdCByZXN1bHRzXG4gKlxuICogQHBhcmFtIHByb3BzXG4gKiBAcmV0dXJucyB7alF1ZXJ5fEhUTUxFbGVtZW50fVxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFByb2R1Y3RSZXN1bHRzKHByb3BzKSB7XG4gIGNvbnN0IHsgcHJvZHVjdHMsIGVuYWJsZUltYWdlcyB9ID0gcHJvcHM7XG4gIGNvbnN0IHByb2R1Y3RJdGVtcyA9IHByb2R1Y3RzLm1hcChwcm9kdWN0ID0+IFByb2R1Y3RJdGVtKHByb2R1Y3QsIGVuYWJsZUltYWdlcykpO1xuXG4gIHJldHVybiAkKGBcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZseWRvd24tLXByb2R1Y3QtaXRlbXNcIj5cbiAgICAgICR7cHJvZHVjdEl0ZW1zLmpvaW4oJycpfVxuICAgIDwvZGl2PlxuICBgKTtcbn1cblxuLyoqXG4gKiBTaG93IGEgbWVzc2FnZSB3aGVuIG5vIHByb2R1Y3QgcmVzdWx0cyBhcmUgZm91bmRcbiAqXG4gKiBAcGFyYW0gcHJvcHNcbiAqIEByZXR1cm5zIHtqUXVlcnl8SFRNTEVsZW1lbnR9XG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gUHJvZHVjdE5vUmVzdWx0cyhwcm9wcykge1xuICBjb25zdCB7IGNvbnRleHQsIHRlcm1zIH0gPSBwcm9wcztcblxuICByZXR1cm4gJChgXG4gICAgPGRpdiBjbGFzcz1cInNlYXJjaC1mbHlkb3duLS1wcm9kdWN0LWl0ZW1zLS1ub25lXCIgZGF0YS1saXZlLXNlYXJjaC1uby1wcm9kdWN0cz5cbiAgICAgIDxoNT5cbiAgICAgICAgJHtjb250ZXh0Lm5vX3Jlc3VsdHNfcHJvZHVjdHMudGl0bGUucmVwbGFjZSgnKnRlcm1zKicsIHRlcm1zKX1cbiAgICAgIDwvaDU+XG4gICAgICA8cD5cbiAgICAgICAgJHtjb250ZXh0Lm5vX3Jlc3VsdHNfcHJvZHVjdHMubWVzc2FnZX1cbiAgICAgIDwvcD5cbiAgICAgIDxwPlxuICAgICAgICA8YSBjbGFzcz1cInNlYXJjaC1mbHlkb3duLS1jb250aW51ZVwiIGhyZWY9XCIvY29sbGVjdGlvbnMvYWxsXCI+XG4gICAgICAgICAgJHtjb250ZXh0LnZpZXdfYWxsX3Byb2R1Y3RzfVxuICAgICAgICAgIFxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwic2VhcmNoLWZseWRvd24tLWNvbnRpbnVlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAgICR7Y29udGV4dC5jaGV2cm9ufVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9wPlxuICAgIDwvZGl2PlxuICBgKTtcbn1cblxuLyoqXG4gKiBTaG93J3MgdGhlIFJlc3VsdHMgZm9vdGVyLCBkaXJlY3RpbmcgY3VzdG9tZXJzIHRvIGFsbCBwcm9kdWN0c1xuICpcbiAqIEBwYXJhbSBwcm9wc1xuICogQHJldHVybnMge2pRdWVyeXxIVE1MRWxlbWVudH1cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBSZXN1bHRzRm9vdGVyKHByb3BzKSB7XG4gIGNvbnN0IHsgY29udGV4dCwgdGVybXMsIHR5cGUgfSA9IHByb3BzO1xuXG4gIHJldHVybiAkKGBcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWZseWRvd24tLWZvb3RlclwiPlxuICAgICAgPGEgY2xhc3M9XCJzZWFyY2gtZmx5ZG93bi0tY29udGludWVcIiBocmVmPVwiL3NlYXJjaD9xPSR7dGVybXN9JnR5cGU9JHt0eXBlfVwiPlxuICAgICAgICAke2NvbnRleHQudmlld19hbGxfcmVzdWx0c31cbiAgICAgICAgXG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2VhcmNoLWZseWRvd24tLWNvbnRpbnVlLWljb25cIiBhcmlhLWhpZGRlbj1cInRydWVcIj5cbiAgICAgICAgICAke2NvbnRleHQuY2hldnJvbn1cbiAgICAgICAgPC9zcGFuPlxuICAgICAgPC9hPlxuICAgIDwvZGl2PlxuICBgKTtcbn1cblxuZXhwb3J0IHtcbiAgQ29udGVudFJlc3VsdHMsXG4gIENvbnRlbnROb1Jlc3VsdHMsXG4gIFByb2R1Y3RSZXN1bHRzLFxuICBQcm9kdWN0Tm9SZXN1bHRzLFxuICBSZXN1bHRzRm9vdGVyLFxufTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnanVzdC1kZWJvdW5jZSc7XG5pbXBvcnQgQ3VycmVuY3lDb252ZXJ0ZXIgZnJvbSAnc2hvcGlmeS1jdXJyZW5jeS1jb252ZXJ0ZXInO1xuXG5pbXBvcnQgU2VhcmNoIGZyb20gJy4uL1NlYXJjaCc7XG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5pbXBvcnQgU2VhcmNoRm9ybSBmcm9tICcuL1NlYXJjaEZvcm0nO1xuXG5pbXBvcnQge1xuICBDb250ZW50UmVzdWx0cyxcbiAgQ29udGVudE5vUmVzdWx0cyxcbiAgUHJvZHVjdFJlc3VsdHMsXG4gIFByb2R1Y3ROb1Jlc3VsdHMsXG4gIFJlc3VsdHNGb290ZXIsXG59IGZyb20gJy4vSGVhZGVyU2VhcmNoVGVtcGxhdGVzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSGVhZGVyU2VhcmNoIHtcbiAgY29uc3RydWN0b3IoJGVscywgc2V0dGluZ3MpIHtcbiAgICB0aGlzLiRlbCA9ICRlbHMuJGVsO1xuICAgIHRoaXMuJGJvZHkgPSAkKCdib2R5Jyk7XG4gICAgdGhpcy4kaGVhZGVyID0gJGVscy4kaGVhZGVyO1xuICAgIHRoaXMuJGRvY3VtZW50ID0gJChkb2N1bWVudCk7XG5cbiAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7XG4gICAgdGhpcy5lbmFibGVDb250ZW50ID0gdGhpcy5zZXR0aW5ncy5lbmFibGVfY29udGVudDtcbiAgICB0aGlzLmVuYWJsZUltYWdlcyA9IHRoaXMuc2V0dGluZ3MuZW5hYmxlX2ltYWdlcztcbiAgICB0aGlzLmZseURvd25BY3RpdmUgPSBmYWxzZTtcbiAgICB0aGlzLnRha2VPdmVyQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zaG93Rmx5RG93biA9IGZhbHNlO1xuICAgIHRoaXMuc2VhcmNoVHlwZSA9IHRoaXMuZW5hYmxlQ29udGVudCA/ICdhcnRpY2xlLHBhZ2UscHJvZHVjdCcgOiAncHJvZHVjdCc7XG5cbiAgICB0aGlzLiRmb3JtID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtbGl2ZS1zZWFyY2gtZm9ybV0nKTtcbiAgICB0aGlzLiRpbnB1dCA9IHRoaXMuJGZvcm0uZmluZCgnW2RhdGEtbGl2ZS1zZWFyY2gtaW5wdXRdJyk7XG4gICAgdGhpcy4kYnV0dG9uID0gdGhpcy4kZm9ybS5maW5kKCdbZGF0YS1saXZlLXNlYXJjaC1zdWJtaXRdJyk7XG4gICAgdGhpcy4kdGFrZU92ZXJCdXR0b24gPSB0aGlzLiRmb3JtLmZpbmQoJ1tkYXRhLWxpdmUtc2VhcmNoLXRha2VvdmVyLWNhbmNlbF0nKTtcblxuICAgIHRoaXMuJGZseURvd24gPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1saXZlLXNlYXJjaC1mbHlkb3duXScpO1xuICAgIHRoaXMuJHNlYXJjaFJlc3VsdHMgPSB0aGlzLiRmbHlEb3duLmZpbmQoJ1tkYXRhLWxpdmUtc2VhcmNoLXJlc3VsdHNdJyk7XG4gICAgdGhpcy4kc2VhcmNoUGxhY2Vob2xkZXIgPSB0aGlzLiRmbHlEb3duLmZpbmQoJ1tkYXRhLWxpdmUtc2VhcmNoLXBsYWNlaG9sZGVyXScpO1xuICAgIHRoaXMuJHF1aWNrTGlua3MgPSB0aGlzLiRmbHlEb3duLmZpbmQoJ1tkYXRhLWxpdmUtc2VhcmNoLXF1aWNrLWxpbmtzXScpO1xuXG4gICAgdGhpcy5zdGF0aWNTZWFyY2ggPSBuZXcgU2VhcmNoRm9ybSh0aGlzLiRlbCk7XG5cbiAgICB0aGlzLnNlYXJjaCA9IG5ldyBTZWFyY2goe1xuICAgICAgdmlldzogJ2hlYWRlcicsXG4gICAgICB0eXBlOiB0aGlzLnNlYXJjaFR5cGUsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9zZWFyY2ggPSB0aGlzLl9zZWFyY2guYmluZCh0aGlzKTtcbiAgICB0aGlzLl90b2dnbGVUYWtlT3ZlciA9IHRoaXMuX3RvZ2dsZVRha2VPdmVyLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2VhcmNoRm9jdXNlZCA9IHRoaXMuX3NlYXJjaEZvY3VzZWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9kb2N1bWVudEZvY3VzID0gdGhpcy5fZG9jdW1lbnRGb2N1cy5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5fc2VhcmNoQ2FuY2VsbGVkID0gdGhpcy5fc2VhcmNoQ2FuY2VsbGVkLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fc2VhcmNoQ29tcGxldGUgPSB0aGlzLl9zZWFyY2hDb21wbGV0ZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3NlYXJjaEVycm9yID0gdGhpcy5fc2VhcmNoRXJyb3IuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuY2xvc2VFdmVudHMgPSBbXTtcblxuICAgIHRoaXMuc2VhcmNoLm9uKCdjYW5jZWxsZWQnLCB0aGlzLl9zZWFyY2hDYW5jZWxsZWQpO1xuICAgIHRoaXMuc2VhcmNoLm9uKCdjb21wbGV0ZScsIHRoaXMuX3NlYXJjaENvbXBsZXRlKTtcbiAgICB0aGlzLnNlYXJjaC5vbignZXJyb3InLCB0aGlzLl9zZWFyY2hFcnJvcik7XG5cbiAgICB0aGlzLmV2ZW50cyA9IFtcbiAgICAgIHRoaXMuJGJ1dHRvbi5vbignY2xpY2suaGVhZGVyLXNlYXJjaCcsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9zZWFyY2goZXZlbnQpO1xuICAgICAgfSksXG4gICAgICB0aGlzLiRpbnB1dC5vbigna2V5dXAuaGVhZGVyLXNlYXJjaCcsIGRlYm91bmNlKHRoaXMuX3NlYXJjaCwgMjUwKSksXG4gICAgICB0aGlzLiRpbnB1dC5vbignZm9jdXMuaGVhZGVyLXNlYXJjaCcsIHRoaXMuX3NlYXJjaEZvY3VzZWQpLFxuICAgICAgdGhpcy4kdGFrZU92ZXJCdXR0b24ub24oJ2NsaWNrLmhlYWRlci1zZWFyY2gnLCB0aGlzLl90b2dnbGVUYWtlT3ZlciksXG4gICAgXTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKCRlbCA9PiAkZWwub2ZmKCcuaGVhZGVyLXNlYXJjaCcpKTtcblxuICAgIHRoaXMuc2VhcmNoLm9mZignY2FuY2VsbGVkJywgdGhpcy5fc2VhcmNoQ2FuY2VsbGVkKTtcbiAgICB0aGlzLnNlYXJjaC5vZmYoJ2NvbXBsZXRlJywgdGhpcy5fc2VhcmNoQ29tcGxldGUpO1xuICAgIHRoaXMuc2VhcmNoLm9mZignZXJyb3InLCB0aGlzLl9zZWFyY2hFcnJvcik7XG5cbiAgICB0aGlzLnN0YXRpY1NlYXJjaC51bmxvYWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiBpcyBzZWFyY2hpbmcsIG9ubHkgc2hvdyBwbGFjZWhvbGRlclxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZseURvd25TZWFyY2hpbmcoKSB7XG4gICAgdGhpcy4kc2VhcmNoUmVzdWx0cy5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICAgIHRoaXMuJHF1aWNrTGlua3MucmVtb3ZlQ2xhc3MoJ3Zpc2libGUnKTtcblxuICAgIHRoaXMuJHNlYXJjaFBsYWNlaG9sZGVyLmFkZENsYXNzKCd2aXNpYmxlJyk7XG4gIH1cblxuICAvKipcbiAgICogU2VhcmNoIGZpZWxkIGhhcyBiZWVuIGZvY3VzZWQsIG9yIGhhcyBiZWVuIGNsZWFyZWQgb2YgY29udGVudHNcbiAgICogICAtIElmIHByZXZpb3VzIHNlYXJjaCBjb250ZW50cywgc2hvd1xuICAgKiAgIC0gSWYgbm8gcHJldmlvdXMgc2VhcmNoIGNvbnRlbnRzLCBzaG93IHF1aWNrbGlua3MgaWYgZXhpc3RzXG4gICAqXG4gICAqIEBwYXJhbSBoYXNUZXJtc1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2ZseURvd25Jbml0aWFsKGhhc1Rlcm1zKSB7XG4gICAgdGhpcy5zaG93Rmx5RG93biA9IGZhbHNlO1xuXG4gICAgY29uc3QgaGFzTm9SZXN1bHRzID0gdGhpcy4kc2VhcmNoUmVzdWx0cy5maW5kKCdbZGF0YS1saXZlLXNlYXJjaC1uby1wcm9kdWN0c10nKS5sZW5ndGggPT09IDA7XG4gICAgY29uc3QgaGFzUHJldmlvdXNSZXN1bHRzID0gdGhpcy4kc2VhcmNoUmVzdWx0cy5jaGlsZHJlbigpLmxlbmd0aCA+IDA7XG5cbiAgICBpZiAoaGFzVGVybXMgJiYgaGFzTm9SZXN1bHRzICYmIGhhc1ByZXZpb3VzUmVzdWx0cykge1xuICAgICAgdGhpcy4kc2VhcmNoUmVzdWx0cy5hZGRDbGFzcygndmlzaWJsZScpO1xuICAgICAgdGhpcy4kcXVpY2tMaW5rcy5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICAgICAgdGhpcy5zaG93Rmx5RG93biA9IHRydWU7XG4gICAgfSBlbHNlIGlmICh0aGlzLiRxdWlja0xpbmtzLmxlbmd0aCkge1xuICAgICAgdGhpcy4kc2VhcmNoUmVzdWx0cy5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICAgICAgdGhpcy4kcXVpY2tMaW5rcy5hZGRDbGFzcygndmlzaWJsZScpO1xuICAgICAgdGhpcy5zaG93Rmx5RG93biA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgX3NlYXJjaChldmVudCkge1xuICAgIC8vIElnbm9yZSBub24gY2hhcmFjdGVyIGtleSBzdHJva2VzXG4gICAgY29uc3QgaW52YWxpZEtleVN0cm9rZXMgPSBbXG4gICAgICAnQWx0JyxcbiAgICAgICdBcnJvd1JpZ2h0JyxcbiAgICAgICdBcnJvd0xlZnQnLFxuICAgICAgJ0Fycm93VXAnLFxuICAgICAgJ0Fycm93RG93bicsXG4gICAgICAnQ2Fwc2xvY2snLFxuICAgICAgJ0NvbnRyb2wnLFxuICAgICAgJ01ldGEnLFxuICAgICAgJ1NoaWZ0JyxcbiAgICAgICdUYWInLFxuICAgIF07XG5cbiAgICBpZiAoZXZlbnQua2V5ICYmIGludmFsaWRLZXlTdHJva2VzLmluZGV4T2YoZXZlbnQua2V5KSAhPT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgdGVybXMgPSB0aGlzLiRpbnB1dC52YWwoKTtcbiAgICBjb25zdCBoYXNUZXJtcyA9IHRlcm1zLmxlbmd0aCA+IDA7XG5cbiAgICAvLyBJZiBpcyBYUywgcG9wIHRoZSBzZWFyY2ggb3V0IGludG8gYSBUYWtlb3ZlciBzY3JlZW5cbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnWFMnKSkge1xuICAgICAgdGhpcy5fdG9nZ2xlVGFrZU92ZXIobnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKCFoYXNUZXJtcykge1xuICAgICAgdGhpcy5fZmx5RG93bkluaXRpYWwodHJ1ZSk7XG5cbiAgICAgIGlmICghdGhpcy5zaG93Rmx5RG93bikge1xuICAgICAgICB0aGlzLl9jbG9zZUZseURvd24odHJ1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9mbHlEb3duU2VhcmNoaW5nKCk7XG5cbiAgICAvLyBDbGVhciBwcmV2aW91cyByZXN1bHRzXG4gICAgdGhpcy4kc2VhcmNoUmVzdWx0cy5odG1sKCcnKTtcblxuICAgIC8vIElmIHRlcm1zIGhhcyBsZW5ndGgsIHRoaXMgd2lsbCBiZSB0cnVlXG4gICAgdGhpcy5fdG9nZ2xlQnV0dG9uKGhhc1Rlcm1zKTtcblxuICAgIC8vIFNob3cgdGhlIGZseW91dCBpZiBpdCBpc24ndCBvcGVuXG4gICAgaWYgKCF0aGlzLiRmbHlEb3duLmRhdGEoJ2lzLW9wZW4nKSkge1xuICAgICAgdGhpcy5zaG93Rmx5RG93biA9IHRydWU7XG4gICAgICB0aGlzLl9vcGVuRmx5RG93bigpO1xuICAgIH1cblxuICAgIC8vIEFkZHMgYCpgIGFmdGVyIGVhY2ggd29yZCBpbiBzZWFyY2ggdGVybXMsIGRvZXNuJ3QgYWRkIHRvIGxhc3Qgd29yZFxuICAgIGlmICh0ZXJtcy5pbmRleE9mKCcgJykgPiAwKSB7XG4gICAgICB0ZXJtcyA9IHRlcm1zLnNwbGl0KCcgJykuam9pbignKiAnKS50cmltKCk7XG4gICAgfVxuXG4gICAgLy8gQWRkcyBgKmAgYXQgdGhlIGVuZCBvZiB0aGUgc2VhcmNoIHRlcm1zXG4gICAgdGVybXMgPSBgJHt0ZXJtc30qYDtcblxuICAgIHRoaXMuc2VhcmNoLmV4ZWN1dGUodGVybXMpO1xuICB9XG5cbiAgX3NlYXJjaEVycm9yKHJlc3BvbnNlKSB7XG4gICAgY29uc29sZS53YXJuKCdTZWFyY2ggaGFkIGVycm9yJyk7XG4gICAgY29uc29sZS5sb2cocmVzcG9uc2UubWVzc2FnZSwgcmVzcG9uc2UuZXJyb3IsIHJlc3BvbnNlLmV2ZW50KTtcbiAgICB0aGlzLl90b2dnbGVCdXR0b24oZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlYXJjaCBoYXMgYmVlbiBjYW5jZWxsZWQgZHVlIHRvIG5ldyBzZWFyY2ggYmVpbmcgcGVyZm9ybWVkXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2VhcmNoQ2FuY2VsbGVkKCkge1xuICAgIC8vIFNlYXJjaGVzIGFyZSBjYW5jZWxlZCBvbiB1c2VyIGludGVyYWN0aW9uLCBVSSBzaG91bGQgcmVtYWluIHVuY2hhbmdlZFxuICB9XG5cbiAgX3NlYXJjaENvbXBsZXRlKHJlc3BvbnNlKSB7XG4gICAgY29uc3QgeyBjb250ZW50LCBwcm9kdWN0cywgdGVybXMsIHNhbml0aXplZFRlcm1zIH0gPSByZXNwb25zZTtcblxuICAgIGNvbnN0IHNldHRpbmdzID0ge1xuICAgICAgcHJvZHVjdHM6IHtcbiAgICAgICAgcmVzdWx0czoge1xuICAgICAgICAgIHByb2R1Y3RzLFxuICAgICAgICAgIGVuYWJsZUltYWdlczogdGhpcy5lbmFibGVJbWFnZXMsXG4gICAgICAgIH0sXG4gICAgICAgIG5vUmVzdWx0czoge1xuICAgICAgICAgIGNvbnRleHQ6IHRoaXMuc2V0dGluZ3MuY29udGV4dCxcbiAgICAgICAgICB0ZXJtczogc2FuaXRpemVkVGVybXMsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29udGVudDoge1xuICAgICAgICByZXN1bHRzOiB7XG4gICAgICAgICAgY29udGV4dDogdGhpcy5zZXR0aW5ncy5jb250ZXh0LFxuICAgICAgICAgIGNvbnRlbnQsXG4gICAgICAgIH0sXG4gICAgICAgIG5vUmVzdWx0czoge1xuICAgICAgICAgIGNvbnRleHQ6IHRoaXMuc2V0dGluZ3MuY29udGV4dCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmb290ZXI6IHtcbiAgICAgICAgY29udGV4dDogdGhpcy5zZXR0aW5ncy5jb250ZXh0LFxuICAgICAgICB0ZXJtcyxcbiAgICAgICAgdHlwZTogdGhpcy5zZWFyY2hUeXBlLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgJHByb2R1Y3RSZXN1bHRzID0gcHJvZHVjdHMubGVuZ3RoXG4gICAgICA/IFByb2R1Y3RSZXN1bHRzKHNldHRpbmdzLnByb2R1Y3RzLnJlc3VsdHMpXG4gICAgICA6IFByb2R1Y3ROb1Jlc3VsdHMoc2V0dGluZ3MucHJvZHVjdHMubm9SZXN1bHRzKTtcblxuICAgIGNvbnN0ICRjb250ZW50UmVzdWx0cyA9IGNvbnRlbnQubGVuZ3RoXG4gICAgPyBDb250ZW50UmVzdWx0cyhzZXR0aW5ncy5jb250ZW50LnJlc3VsdHMpXG4gICAgOiBDb250ZW50Tm9SZXN1bHRzKHNldHRpbmdzLmNvbnRlbnQubm9SZXN1bHRzKTtcblxuICAgICRwcm9kdWN0UmVzdWx0cy5maW5kKCcubW9uZXknKS5lYWNoKChpLCBlbCkgPT4ge1xuICAgICAgZWwuaW5uZXJIVE1MID0gU2hvcGlmeS5mb3JtYXRNb25leShlbC5pbm5lckhUTUwsIHRoaXMuc2V0dGluZ3MubW9uZXlfZm9ybWF0KTtcbiAgICAgIEN1cnJlbmN5Q29udmVydGVyLnVwZGF0ZShlbCk7XG4gICAgfSk7XG5cbiAgICAvLyBIaWRlIHBsYWNlaG9sZGVyXG4gICAgLy8gVE9ETzogTG9jayBtaW5pbXVtIGhlaWdodD9cbiAgICB0aGlzLiRzZWFyY2hQbGFjZWhvbGRlci5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuXG4gICAgLy8gU2hvdyByZXN1bHRzXG4gICAgdGhpcy4kc2VhcmNoUmVzdWx0c1xuICAgICAgLmh0bWwoJHByb2R1Y3RSZXN1bHRzKVxuICAgICAgLmFkZENsYXNzKCd2aXNpYmxlJyk7XG5cbiAgICBpZiAodGhpcy5lbmFibGVDb250ZW50KSB7XG4gICAgICB0aGlzLiRzZWFyY2hSZXN1bHRzXG4gICAgICAgIC5hcHBlbmQoJGNvbnRlbnRSZXN1bHRzKTtcbiAgICB9XG5cbiAgICB0aGlzLiRzZWFyY2hSZXN1bHRzXG4gICAgICAuYXBwZW5kKFJlc3VsdHNGb290ZXIoc2V0dGluZ3MuZm9vdGVyKSk7XG5cbiAgICB0aGlzLl90b2dnbGVCdXR0b24oZmFsc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZXMgc2VhcmNoIGJ1dHRvbiB3aGlsZSBwcm9jZXNzaW5nXG4gICAqXG4gICAqIEBwYXJhbSBkaXNhYmxlXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdG9nZ2xlQnV0dG9uKGRpc2FibGUpIHtcbiAgICBpZiAoZGlzYWJsZSkge1xuICAgICAgdGhpcy4kYnV0dG9uXG4gICAgICAgIC5hZGRDbGFzcygnc2VhcmNoLWljb24tLXByb2Nlc3NpbmcnKVxuICAgICAgICAuYXR0cignZGlzYWJsZWQnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy4kYnV0dG9uXG4gICAgICAgIC5yZW1vdmVDbGFzcygnc2VhcmNoLWljb24tLXByb2Nlc3NpbmcnKVxuICAgICAgICAucmVtb3ZlQXR0cignZGlzYWJsZWQnKTtcbiAgICB9XG4gIH1cblxuICBfc2VhcmNoRm9jdXNlZCgpIHtcbiAgICBpZiAodGhpcy5mbHlEb3duQWN0aXZlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGhhc1Rlcm1zID0gdGhpcy4kaW5wdXQudmFsKCkubGVuZ3RoID4gMDtcblxuICAgIC8vIE9ubHkgbGlzdGVuIGZvciBldmVudHMgb3V0c2lkZSBvZiB0aGUgc2VhcmNoIGZseWRvd24gd2hlbiBpdHMgb3BlblxuICAgIHRoaXMuY2xvc2VFdmVudHMuY29uY2F0KFtcbiAgICAgIHRoaXMuJGhlYWRlci5vbignZm9jdXMuaGVhZGVyLXNlYXJjaCcsICdhLCBidXR0b24nLCB0aGlzLl9kb2N1bWVudEZvY3VzKSxcbiAgICAgIHRoaXMuJGRvY3VtZW50Lm9uKCd0b3VjaHN0YXJ0LmhlYWRlci1zZWFyY2gnLCB0aGlzLl9kb2N1bWVudEZvY3VzKSxcbiAgICAgIHRoaXMuJGRvY3VtZW50Lm9uKCdjbGljay5oZWFkZXItc2VhcmNoJywgdGhpcy5fZG9jdW1lbnRGb2N1cyksXG4gICAgXSk7XG5cbiAgICB0aGlzLiRlbC5hZGRDbGFzcygnc2l0ZS1oZWFkZXItc2VhcmNoLS1mb2N1c2VkJyk7XG5cbiAgICAvLyBJZiBpcyBYUywgcG9wIHRoZSBzZWFyY2ggb3V0IGludG8gYSBUYWtlb3ZlciBzY3JlZW5cbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnWFMnKSkge1xuICAgICAgdGhpcy5fdG9nZ2xlVGFrZU92ZXIobnVsbCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZmx5RG93bkluaXRpYWwoaGFzVGVybXMpO1xuXG4gICAgdGhpcy5fb3BlbkZseURvd24oKTtcbiAgfVxuXG4gIF9vcGVuRmx5RG93bigpIHtcbiAgICBpZiAoIXRoaXMuc2hvd0ZseURvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLiRlbC5hZGRDbGFzcygnc2l0ZS1oZWFkZXItc2VhcmNoLS1hY3RpdmUnKTtcbiAgICB0aGlzLiRmbHlEb3duLmRhdGEoJ2lzLW9wZW4nLCB0cnVlKTtcbiAgICB0aGlzLmZseURvd25BY3RpdmUgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIHRoZSBGbHlEb3duIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZFxuICAgKiAgLSBLZWVwIGZvY3VzIHN0eWxpbmcgaWYgaW5wdXQgaXMgc3RpbGwgYmVpbmcgaW50ZXJhY3RlZCB3aXRoXG4gICAqXG4gICAqIEBwYXJhbSByZXRhaW5Gb2N1c1xuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Nsb3NlRmx5RG93bihyZXRhaW5Gb2N1cyA9IGZhbHNlKSB7XG4gICAgaWYgKCF0aGlzLmZseURvd25BY3RpdmUpIHtcbiAgICAgIGlmICghcmV0YWluRm9jdXMpIHtcbiAgICAgICAgdGhpcy4kZWwucmVtb3ZlQ2xhc3MoJ3NpdGUtaGVhZGVyLXNlYXJjaC0tZm9jdXNlZCcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudGFrZU92ZXJBY3RpdmUpIHtcbiAgICAgIHRoaXMuX3RvZ2dsZVRha2VPdmVyKG51bGwsIGZhbHNlKTtcbiAgICB9XG5cbiAgICB0aGlzLiRmbHlEb3duLmRhdGEoJ2lzLW9wZW4nLCBmYWxzZSk7XG4gICAgdGhpcy4kZWwucmVtb3ZlQ2xhc3MoJ3NpdGUtaGVhZGVyLXNlYXJjaC0tYWN0aXZlJyk7XG5cbiAgICBpZiAoIXJldGFpbkZvY3VzKSB7XG4gICAgICB0aGlzLiRlbC5yZW1vdmVDbGFzcygnc2l0ZS1oZWFkZXItc2VhcmNoLS1mb2N1c2VkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5mbHlEb3duQWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5jbG9zZUV2ZW50cy5mb3JFYWNoKCRlbCA9PiAkZWwub2ZmKCcuaGVhZGVyLXNlYXJjaCcpKTtcbiAgICB0aGlzLmNsb3NlRXZlbnRzID0gW107XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBvciBjbG9zZSB0aGUgVGFrZSBvdmVyIGZvciBtb2JpbGVcbiAgICpcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwYXJhbSBlbmFibGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF90b2dnbGVUYWtlT3ZlcihldmVudCA9IG51bGwsIGVuYWJsZSA9IGZhbHNlKSB7XG4gICAgdGhpcy50YWtlT3ZlckFjdGl2ZSA9IGVuYWJsZTtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBpZiAoIWVuYWJsZSkge1xuICAgICAgdGhpcy5fY2xvc2VGbHlEb3duKGZhbHNlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4kaGVhZGVyLmhhc0NsYXNzKCdzZWFyY2gtLXNlY3Rpb24nKSkge1xuICAgICAgdGhpcy4kYm9keS50b2dnbGVDbGFzcygnc2VhcmNoLXRha2VvdmVyLWFjdGl2ZScsIGVuYWJsZSk7XG4gICAgfVxuXG4gICAgdGhpcy4kZWwudG9nZ2xlQ2xhc3MoJ3NpdGUtaGVhZGVyLXNlYXJjaC0tdGFrZW92ZXInLCBlbmFibGUpO1xuICAgIHRoaXMuJGJvZHkudG9nZ2xlQ2xhc3MoJ3Njcm9sbC1sb2NrJywgZW5hYmxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIHRoZSBmb2N1cyBlbGVtZW50IGhhcyBjaGFuZ2VkLCBlaXRoZXIgYnkgY2xpY2tpbmcsIHRvdWNoaW5nLCBvciB0YWJiaW5nXG4gICAqIGNoZWNrIHRvIHNlZSBpZiBpdCBpcyB3aXRoaW4gdGhlIGZseWRvd25cbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZG9jdW1lbnRGb2N1cyhldmVudCkge1xuICAgIGNvbnN0ICRwYXJlbnQgPSAkKGV2ZW50LnRhcmdldCkucGFyZW50cygnW2RhdGEtbGl2ZS1zZWFyY2hdJyk7XG5cbiAgICBpZiAoJHBhcmVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbG9zZUZseURvd24oKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBDdXJyZW5jeUNvbnZlcnRlciBmcm9tICdzaG9waWZ5LWN1cnJlbmN5LWNvbnZlcnRlcic7XG5pbXBvcnQgJHNjcmlwdCBmcm9tICdzY3JpcHRqcyc7XG5cbmltcG9ydCBGb3JtcyBmcm9tICcuLi9Gb3Jtcyc7XG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5pbXBvcnQgU3RpY2t5SGVhZGVyIGZyb20gJy4uL2NvbXBvbmVudHMvU3RpY2t5SGVhZGVyJztcbmltcG9ydCBOYXZNb2JpbGUgZnJvbSAnLi4vY29tcG9uZW50cy9OYXZNb2JpbGUnO1xuaW1wb3J0IE5hdkRlc2t0b3AgZnJvbSAnLi4vY29tcG9uZW50cy9OYXZEZXNrdG9wJztcbmltcG9ydCBIZWFkZXJTZWFyY2ggZnJvbSAnLi4vY29tcG9uZW50cy9IZWFkZXJTZWFyY2gnO1xuaW1wb3J0IFNlYXJjaEZvcm0gZnJvbSAnLi4vY29tcG9uZW50cy9TZWFyY2hGb3JtJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljU2VjdGlvbkhlYWRlciB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YS5zZXR0aW5ncztcbiAgICB0aGlzLmN1cnJlbmN5ID0gc2VjdGlvbi5kYXRhLmN1cnJlbmN5O1xuICAgIHRoaXMucG9zdE1lc3NhZ2UgPSBzZWN0aW9uLnBvc3RNZXNzYWdlO1xuICAgIHRoaXMuaGVhZGVyU2VhcmNoID0gbnVsbDtcblxuICAgIHRoaXMuJHNjcmlwdHMgPSAkKCdbZGF0YS1zY3JpcHRzXScpO1xuXG4gICAgdGhpcy4kbWVudVRvZ2dsZSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLW1lbnUtdG9nZ2xlXScpO1xuICAgIHRoaXMuJGNhcnRDb3VudCA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLWhlYWRlci1jYXJ0LWNvdW50XScpO1xuICAgIHRoaXMuJHNlYXJjaEZpZWxkID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtbGl2ZS1zZWFyY2hdJyk7XG5cbiAgICB0aGlzLiRzaXRlTmF2aWdhdGlvbiA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXNpdGUtbmF2aWdhdGlvbl0nKTtcbiAgICB0aGlzLiRkZXNrdG9wTmF2aWdhdGlvbiA9IHRoaXMuJHNpdGVOYXZpZ2F0aW9uLmZpbmQoJ3VsLm5hdm1lbnUtZGVwdGgtMScpO1xuICAgIHRoaXMuJGhlYWRlclRvb2xzID0gdGhpcy4kc2l0ZU5hdmlnYXRpb24uZmluZCgnW2RhdGEtaGVhZGVyLWFjdGlvbnNdJyk7XG5cbiAgICB0aGlzLmNvbnZlcnRlciA9ICdbZGF0YS1jdXJyZW5jeS1jb252ZXJ0ZXJdJztcbiAgICB0aGlzLiRjb252ZXJ0ZXIgPSAkKHRoaXMuY29udmVydGVyKTtcblxuICAgIHRoaXMuc3RpY2t5SGVhZGVyID0gbmV3IFN0aWNreUhlYWRlcih7XG4gICAgICAkZWw6IHRoaXMuJGVsLFxuICAgICAgJHRvZ2dsZTogdGhpcy4kbWVudVRvZ2dsZSxcbiAgICAgIHBvc3RNZXNzYWdlOiB0aGlzLnBvc3RNZXNzYWdlLFxuICAgIH0sIHRoaXMuc2V0dGluZ3MpO1xuXG4gICAgdGhpcy5uYXZNb2JpbGUgPSBuZXcgTmF2TW9iaWxlKHtcbiAgICAgICRlbDogdGhpcy4kZWwsXG4gICAgICAkdG9nZ2xlT3BlbjogdGhpcy4kbWVudVRvZ2dsZSxcbiAgICB9KTtcblxuICAgIHRoaXMubmF2RGVza3RvcCA9IG5ldyBOYXZEZXNrdG9wKHtcbiAgICAgICRlbDogdGhpcy4kc2l0ZU5hdmlnYXRpb24sXG4gICAgICBwb3N0TWVzc2FnZTogdGhpcy5wb3N0TWVzc2FnZSxcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybXModGhpcy4kZWwpO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MubGl2ZV9zZWFyY2guZW5hYmxlKSB7XG4gICAgICAkc2NyaXB0KHRoaXMuJHNjcmlwdHMuZGF0YSgnc2hvcGlmeS1hcGktdXJsJyksICgpID0+IHtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWFyY2ggPSBuZXcgSGVhZGVyU2VhcmNoKHtcbiAgICAgICAgICAkZWw6IHRoaXMuJHNlYXJjaEZpZWxkLFxuICAgICAgICAgICRoZWFkZXI6IHRoaXMuJGVsLFxuICAgICAgICB9LCB0aGlzLnNldHRpbmdzLmxpdmVfc2VhcmNoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlclNlYXJjaCA9IG5ldyBTZWFyY2hGb3JtKHRoaXMuJHNlYXJjaEZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jdXJyZW5jeS5lbmFibGUpIHtcbiAgICAgICRzY3JpcHQodGhpcy4kc2NyaXB0cy5kYXRhKCdzaG9waWZ5LWN1cnJlbmNpZXMnKSwgKCkgPT4ge1xuICAgICAgICB0aGlzLl9jb252ZXJ0ZXIoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEhhbmRsZSBBY2NvcmRpb24gaW50ZXJhY3Rpb24gd2hlbiB3aW5kb3cgc2l6ZSBjaGFuZ2VzXG4gICAgdGhpcy5faGVhZGVyVG9vbHNTaXplID0gdGhpcy5faGVhZGVyVG9vbHNTaXplLmJpbmQodGhpcyk7XG4gICAgbGF5b3V0Lm9uQnJlYWtwb2ludENoYW5nZSh0aGlzLl9oZWFkZXJUb29sc1NpemUpO1xuXG4gICAgdGhpcy4kZWwub24oJ2NhcnRjb3VudDp1cGRhdGUnLCAoZXZlbnQsIGRhdGEpID0+IHtcbiAgICAgIHRoaXMuJGNhcnRDb3VudFxuICAgICAgICAuYXR0cignZGF0YS1oZWFkZXItY2FydC1jb3VudCcsIGRhdGEucmVzcG9uc2UuaXRlbV9jb3VudClcbiAgICAgICAgLnRvZ2dsZUNsYXNzKCd2aXNpYmxlJywgZGF0YS5yZXNwb25zZS5pdGVtX2NvdW50ID4gMCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9oZWFkZXJUb29sc1NpemUoKTtcbiAgfVxuXG4gIG9uU2VjdGlvbkRlc2VsZWN0KCkge1xuICAgIHRoaXMubmF2RGVza3RvcC5jbG9zZUFsbChudWxsKTtcbiAgICB0aGlzLnN0aWNreUhlYWRlci5jbG9zZU5hdmlnYXRpb24oKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLnN0aWNreUhlYWRlci51bmxvYWQoKTtcbiAgICB0aGlzLm5hdk1vYmlsZS51bmxvYWQoKTtcbiAgICB0aGlzLm5hdkRlc2t0b3AudW5sb2FkKCk7XG4gICAgdGhpcy5mb3Jtcy51bmxvYWQoKTtcblxuICAgIHRoaXMuJGVsLm9mZignY2FydGNvdW50OnVwZGF0ZScpO1xuXG4gICAgdGhpcy5oZWFkZXJTZWFyY2gudW5sb2FkKCk7XG5cbiAgICBpZiAodGhpcy5jdXJyZW5jeS5lbmFibGUpIHtcbiAgICAgIHRoaXMuJGNvbnZlcnRlci5vZmYoJ2NoYW5nZS5jb252ZXJ0ZXInKTtcbiAgICB9XG4gIH1cblxuICBvblNlY3Rpb25NZXNzYWdlKG5hbWUsIGRhdGEpIHtcbiAgICBpZiAobmFtZSA9PT0gJ25hdjpjbG9zZS1hbGwnICYmIGxheW91dC5pc0JyZWFrcG9pbnQoJ0wnKSkge1xuICAgICAgdGhpcy5uYXZEZXNrdG9wLmNsb3NlQWxsKG51bGwpO1xuICAgIH1cblxuICAgIGlmIChuYW1lID09PSAnc3RpY2t5aGVhZGVyOm9wZW4nICYmIHRoaXMuc2V0dGluZ3Muc3RpY2t5X2hlYWRlcikge1xuICAgICAgdGhpcy5zdGlja3lIZWFkZXIub3Blbk5hdmlnYXRpb24odHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tTZWxlY3QoYmxvY2spIHtcbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5zdGlja3lIZWFkZXIuX3NsaWRlVG9nZ2xlKHRydWUpO1xuXG4gICAgICAgIGlmICghJChibG9jay5lbCkuZmluZCgnLm5hdm1lbnUtbGluaycpLmhhc0NsYXNzKCduYXZtZW51LWFjdGl2ZScpKSB7XG4gICAgICAgICAgdGhpcy5uYXZEZXNrdG9wLnRvZ2dsZUl0ZW0oYmxvY2suZWwpO1xuICAgICAgICB9XG4gICAgICB9LCAxMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VjdGlvbkJsb2NrRGVzZWxlY3QoKSB7XG4gICAgaWYgKHRoaXMuJG1lbnVUb2dnbGUuaGFzQ2xhc3MoJ2FjdGl2ZScpICYmIGxheW91dC5pc0JyZWFrcG9pbnQoJ0wnKSkge1xuICAgICAgdGhpcy5zdGlja3lIZWFkZXIuX3NsaWRlVG9nZ2xlKCk7XG4gICAgfVxuXG4gICAgdGhpcy5uYXZEZXNrdG9wLmNsb3NlQWxsKG51bGwpO1xuICB9XG5cbiAgX2NvbnZlcnRlcigpIHtcbiAgICBDdXJyZW5jeUNvbnZlcnRlci5pbml0KHtcbiAgICAgIHN3aXRjaGVyU2VsZWN0b3I6IHRoaXMuY29udmVydGVyLFxuICAgICAgcHJpY2VTZWxlY3RvcjogJy5tb25leScsXG4gICAgICBzaG9wQ3VycmVuY3k6IHRoaXMuY3VycmVuY3kuc2hvcF9jdXJyZW5jeSxcbiAgICAgIGRlZmF1bHRDdXJyZW5jeTogdGhpcy5jdXJyZW5jeS5kZWZhdWx0X2N1cnJlbmN5LFxuICAgICAgZGlzcGxheUZvcm1hdDogdGhpcy5jdXJyZW5jeS5kaXNwbGF5X2Zvcm1hdCxcbiAgICAgIG1vbmV5Rm9ybWF0OiB0aGlzLmN1cnJlbmN5Lm1vbmV5X2Zvcm1hdCxcbiAgICAgIG1vbmV5Rm9ybWF0Tm9DdXJyZW5jeTogdGhpcy5jdXJyZW5jeS5tb25leV9mb3JtYXRfbm9fY3VycmVuY3ksXG4gICAgICBtb25leUZvcm1hdEN1cnJlbmN5OiB0aGlzLmN1cnJlbmN5Lm1vbmV5X2Zvcm1hdF9jdXJyZW5jeSxcbiAgICB9KTtcblxuICAgIHRoaXMuJGNvbnZlcnRlci5vbignY2hhbmdlLmNvbnZlcnRlcicsIGV2ZW50ID0+IHtcbiAgICAgIHRoaXMuJGNvbnZlcnRlci5lYWNoKChpbmRleCwgY29udmVydGVyKSA9PiB7XG4gICAgICAgIGlmIChjb252ZXJ0ZXIudmFsdWUgIT09IGV2ZW50LmN1cnJlbnRUYXJnZXQudmFsdWUpIHtcbiAgICAgICAgICBjb252ZXJ0ZXIudmFsdWUgPSBldmVudC5jdXJyZW50VGFyZ2V0LnZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgQ3VycmVuY3lDb252ZXJ0ZXIuc2V0Q3VycmVuY3koZXZlbnQuY3VycmVudFRhcmdldC52YWx1ZSk7XG4gICAgfSk7XG4gIH1cblxuICBfaGVhZGVyVG9vbHNTaXplKCkge1xuICAgIGlmICghbGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0ZXJXaWR0aCA9IHRoaXMuJGhlYWRlclRvb2xzLndpZHRoKCk7XG4gICAgY29uc3QgaW5uZXJXaWR0aHMgPSBbXTtcblxuICAgIHRoaXMuJGhlYWRlclRvb2xzLmZpbmQoJ2xpJykuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XG4gICAgICBpbm5lcldpZHRocy5wdXNoKE1hdGguY2VpbCgkKGVsKS5vdXRlcldpZHRoKCkpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGNvbWJpbmVkV2lkdGhzID0gaW5uZXJXaWR0aHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiwgMCk7XG5cbiAgICBpZiAoY29tYmluZWRXaWR0aHMgPiBvdXRlcldpZHRoKSB7XG4gICAgICB0aGlzLiRoZWFkZXJUb29scy5jc3MoJ21heC13aWR0aCcsIGAke2NvbWJpbmVkV2lkdGhzfXB4YCk7XG4gICAgICB0aGlzLiRkZXNrdG9wTmF2aWdhdGlvbi5jc3MoJ21heC13aWR0aCcsIGBjYWxjKDEwMCUgLSAke2NvbWJpbmVkV2lkdGhzfXB4KWApO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuaW1wb3J0IEFjY29yZGlvbiBmcm9tICcuLi9BY2NvcmRpb24nO1xuaW1wb3J0IEZvcm1zIGZyb20gJy4uL0Zvcm1zJztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi4vTGF5b3V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljU2VjdGlvbkZvb3RlciB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy5BY2NvcmRpb24gPSBuZXcgQWNjb3JkaW9uKHRoaXMuJGVsKTtcblxuICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybXModGhpcy4kZWwpO1xuXG4gICAgLy8gSGFuZGxlIEFjY29yZGlvbiBpbnRlcmFjdGlvbiB3aGVuIHdpbmRvdyBzaXplIGNoYW5nZXNcbiAgICB0aGlzLmxheW91dEhhbmRsZXIgPSB0aGlzLm9uQnJlYWtwb2ludENoYW5nZS5iaW5kKHRoaXMpO1xuICAgIGxheW91dC5vbkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5sYXlvdXRIYW5kbGVyKTtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuJGVsLm9uKCdjbGljay5mb290ZXInLCAnW2RhdGEtYWNjb3JkaW9uLXRyaWdnZXJdJywgZXZlbnQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuX3RvZ2dsZUFjY29yZGlvbigkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnBhcmVudCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLiRlbC5vZmYoJy5mb290ZXInKTtcbiAgICB0aGlzLmZvcm1zLnVubG9hZCgpO1xuXG4gICAgZGVsZXRlIHRoaXMuQWNjb3JkaW9uO1xuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tTZWxlY3QoYmxvY2spIHtcbiAgICBjb25zdCAkYmxvY2sgPSAkKGJsb2NrLmVsKTtcblxuICAgIGlmICgkYmxvY2suaGFzQ2xhc3MoJ2hhcy1hY2NvcmRpb24nKSkgdGhpcy5fdG9nZ2xlQWNjb3JkaW9uKCRibG9jaywgdHJ1ZSk7XG4gIH1cblxuICBvblNlY3Rpb25CbG9ja0Rlc2VsZWN0KGJsb2NrKSB7XG4gICAgY29uc3QgJGJsb2NrID0gJChibG9jay5lbCk7XG5cbiAgICBpZiAoJGJsb2NrLmhhc0NsYXNzKCdoYXMtYWNjb3JkaW9uJykpIHRoaXMuX3RvZ2dsZUFjY29yZGlvbigkYmxvY2ssIGZhbHNlKTtcbiAgfVxuXG4gIF90b2dnbGVBY2NvcmRpb24oJGJsb2NrKSB7XG4gICAgaWYgKGxheW91dC5pc0JyZWFrcG9pbnQoJ0wnKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5BY2NvcmRpb24udG9nZ2xlKCRibG9jayk7XG4gIH1cblxuICBvbkJyZWFrcG9pbnRDaGFuZ2UoZXZlbnQsIGJyZWFrcG9pbnRzKSB7XG4gICAgaWYgKGxheW91dC5pc0JyZWFrcG9pbnQoJ0wnKSkge1xuICAgICAgdGhpcy5BY2NvcmRpb24ub3BlbkFsbCgpO1xuICAgIH0gZWxzZSBpZiAoYnJlYWtwb2ludHMucHJldmlvdXMgPT09ICdMJyAmJiAhbGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSB7XG4gICAgICB0aGlzLkFjY29yZGlvbi5jbG9zZU9wZW4oKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgUmljaFRleHQgZnJvbSAnLi4vY29tcG9uZW50cy9SaWNoVGV4dCc7XG5pbXBvcnQgRm9ybXMgZnJvbSAnLi4vRm9ybXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNBcnRpY2xlIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcbiAgICB0aGlzLiRjb21tZW50Rm9ybSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLWFydGljbGVjb21tZW50cy1mb3JtXScpXG5cbiAgICB0aGlzLnJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHRoaXMuJGVsKTtcblxuICAgIGlmICh0aGlzLiRjb21tZW50Rm9ybS5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29tbWVudEZvcm0gPSBuZXcgRm9ybXModGhpcy4kY29tbWVudEZvcm0pO1xuICAgIH1cbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLnJpY2hUZXh0LnVubG9hZCgpO1xuXG4gICAgaWYgKHRoaXMuY29tbWVudEZvcm0pIHtcbiAgICAgIHRoaXMuY29tbWVudEZvcm0udW5sb2FkKCk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IFJpY2hUZXh0IGZyb20gJy4uL2NvbXBvbmVudHMvUmljaFRleHQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNCbG9nIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcblxuICAgIHRoaXMucmljaFRleHQgPSBuZXcgUmljaFRleHQodGhpcy4kZWwpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucmljaFRleHQudW5sb2FkKCk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnanVzdC1kZWJvdW5jZSc7XG5pbXBvcnQgZ2V0SGVhZGVyT2Zmc2V0IGZyb20gJy4uL2hlbHBlcnMvZ2V0SGVhZGVyT2Zmc2V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVzc2FnZUJhbm5lciB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuJHdpbmRvdyA9ICQod2luZG93KTtcbiAgICB0aGlzLiRkb2N1bWVudCA9ICQoZG9jdW1lbnQpO1xuICAgIHRoaXMuJGJvZHkgPSAkKGRvY3VtZW50LmJvZHkpO1xuICAgIHRoaXMuJGJhbm5lclRlbXBsYXRlID0gJCgnW2RhdGEtdGVtcGxhdGVzXSBbZGF0YS1tZXNzYWdlLWJhbm5lcl0nKTtcbiAgICB0aGlzLiRiYW5uZXJzID0gW107XG5cbiAgICB0aGlzLmhlYWRlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaXRlLWhlYWRlci13cmFwcGVyJyk7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuJGRvY3VtZW50Lm9uKCd0b3VjaHN0YXJ0Lm1lc3NhZ2UtYmFubmVyLCBjbGljay5tZXNzYWdlLWJhbm5lcicsIChldmVudCkgPT4ge1xuICAgICAgdGhpcy5faGFuZGxlRG9jdW1lbnRDbGljayhldmVudC50YXJnZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgdW5sb2FkKCkge1xuICAgIHRoaXMuJGRvY3VtZW50Lm9mZigndG91Y2hzdGFydC5tZXNzYWdlLWJhbm5lciwgY2xpY2subWVzc2FnZS1iYW5uZXInKTtcbiAgfVxuXG4gIG1lc3NhZ2UobWVzc2FnZSwgdHlwZSkge1xuICAgIGNvbnN0ICRiYW5uZXIgPSB0aGlzLiRiYW5uZXJUZW1wbGF0ZS5jbG9uZSgpO1xuXG4gICAgJGJhbm5lclxuICAgICAgLmFkZENsYXNzKGBtZXNzYWdlLS0ke3R5cGV9YClcbiAgICAgIC5maW5kKCdbZGF0YS1tZXNzYWdlLWJhbm5lci1jb250ZW50XScpXG4gICAgICAuaHRtbChtZXNzYWdlKTtcblxuICAgIHRoaXMuJGJvZHkuYXBwZW5kKCRiYW5uZXIpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoJGJhbm5lcik7XG4gICAgdGhpcy5fc2hvdygkYmFubmVyKTtcbiAgfVxuXG4gIGRpc21pc3NCYW5uZXJzKCkge1xuICAgIGNvbnN0ICR2aXNpYmxlQmFubmVycyA9ICQoJ1tkYXRhLW1lc3NhZ2UtYmFubmVyXTp2aXNpYmxlJyk7XG5cbiAgICAkdmlzaWJsZUJhbm5lcnMuZWFjaCgoaW5kZXgsIGJhbm5lcikgPT4ge1xuICAgICAgdGhpcy5faGlkZSgkKGJhbm5lciksIGluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCRiYW5uZXIpIHtcbiAgICB0aGlzLmV2ZW50cy5wdXNoKFtcbiAgICAgICRiYW5uZXIub24oJ2NsaWNrLm1lc3NhZ2UtYmFubmVyJywgJ1tkYXRhLW1lc3NhZ2UtYmFubmVyLWNsb3NlXScsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9oaWRlKCRiYW5uZXIpO1xuICAgICAgfSksXG4gICAgICB0aGlzLiRib2R5Lm9uKCdwb3NpdGlvbi1iYW5uZXJzLm1lc3NhZ2UtYmFubmVyJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbkJhbm5lcigkYmFubmVyKTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy4kd2luZG93Lm9uKCdyZXNpemUubWVzc2FnZS1iYW5uZXInLCBkZWJvdW5jZSgoKSA9PiB0aGlzLl9wb3NpdGlvbkJhbm5lcigkYmFubmVyKSwgMjUwKSksXG4gICAgICB0aGlzLiR3aW5kb3cub24oJ3Njcm9sbC5tZXNzYWdlLWJhbm5lcicsICgpID0+IHRoaXMuX3Bvc2l0aW9uQmFubmVyKCRiYW5uZXIpKSxcbiAgICBdKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQb3NpdGlvbiBNZXNzYWdlIGJlbmVhdGggaGVhZGVyIGlmIGl0cyBpbiB2aWV3cG9ydCwgb3IgYXQgdG9wIG9mIHZpZXdwb3J0XG4gICAqXG4gICAqIEBwYXJhbSAkYmFubmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcG9zaXRpb25CYW5uZXIoJGJhbm5lcikge1xuICAgICRiYW5uZXIuY3NzKHsgdG9wOiBnZXRIZWFkZXJPZmZzZXQodGhpcy5oZWFkZXIsIHRydWUpIH0pO1xuICB9XG5cbiAgX3Nob3coJGJhbm5lcikge1xuICAgIHRoaXMuX3Bvc2l0aW9uQmFubmVyKCRiYW5uZXIpO1xuICAgIHRoaXMuJGJhbm5lcnMucHVzaCgkYmFubmVyKTtcblxuICAgICRiYW5uZXJcbiAgICAgIC5hZGRDbGFzcygnYW5pbWF0aW5nIGFuaW1hdGluZy1pbicpXG4gICAgICAub25lKCd0cmVuZCcsICgpID0+IHtcbiAgICAgICAgJGJhbm5lclxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnYW5pbWF0aW5nIGFuaW1hdGluZy1pbicpXG4gICAgICAgICAgLmFkZENsYXNzKCd2aXNpYmxlJylcbiAgICAgICAgICAub2ZmKCd0cmVuZCcpO1xuICAgICAgfSk7XG4gIH1cblxuICBfaGlkZSgkYmFubmVyLCBpbmRleCA9IDApIHtcbiAgICAkYmFubmVyXG4gICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGluZyBhbmltYXRpbmctb3V0JylcbiAgICAgIC5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICAkYmFubmVyXG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLW91dCB2aXNpYmxlJylcbiAgICAgICAgICAub2ZmKCd0cmVuZCcpO1xuICAgICAgICB0aGlzLl9yZW1vdmVCYW5uZXIoJGJhbm5lciwgaW5kZXgpO1xuICAgICAgfSk7XG4gIH1cblxuICBfcmVtb3ZlQmFubmVyKCRiYW5uZXIsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuZXZlbnRzW2luZGV4XSkge1xuICAgICAgdGhpcy5ldmVudHNbaW5kZXhdLmZvckVhY2goJGVsID0+ICRlbC5vZmYoJy5tZXNzYWdlLWJhbm5lcicpKTtcbiAgICAgIHRoaXMuZXZlbnRzLnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuXG4gICAgdGhpcy4kYmFubmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICRiYW5uZXIucmVtb3ZlKCk7XG4gIH1cblxuICBfaGFuZGxlRG9jdW1lbnRDbGljayh0YXJnZXQpIHtcbiAgICBjb25zdCAkcGFyZW50ID0gJCh0YXJnZXQpLnBhcmVudHMoJ1tkYXRhLW1lc3NhZ2UtYmFubmVyXScpO1xuICAgIGlmICgkcGFyZW50Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgdGhpcy5kaXNtaXNzQmFubmVycygpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2p1c3QtZGVib3VuY2UnO1xuaW1wb3J0IEN1cnJlbmN5Q29udmVydGVyIGZyb20gJ3Nob3BpZnktY3VycmVuY3ktY29udmVydGVyJztcblxuaW1wb3J0IEZvcm1zIGZyb20gJy4uL0Zvcm1zJztcbmltcG9ydCBNZXNzYWdlQmFubmVyIGZyb20gJy4uL2NvbXBvbmVudHMvTWVzc2FnZUJhbm5lcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY0NhcnQge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YS5zZXR0aW5ncztcbiAgICB0aGlzLnNoaXBwaW5nID0gc2VjdGlvbi5kYXRhLnNoaXBwaW5nO1xuICAgIHRoaXMubWVzc2FnZUJhbm5lciA9IG5ldyBNZXNzYWdlQmFubmVyKCk7XG5cbiAgICB0aGlzLiR3aW5kb3cgPSAkKHdpbmRvdyk7XG4gICAgdGhpcy4kZWwgPSAkKHNlY3Rpb24uZWwpO1xuICAgIHRoaXMuJGhlYWRlciA9ICQoJy5zaXRlLWhlYWRlci13cmFwcGVyJyk7XG4gICAgdGhpcy4kdG90YWwgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1jYXJ0LXRvdGFsXScpO1xuICAgIHRoaXMuJHNoaXBwaW5nID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtY2FydHNoaXBwaW5nXScpO1xuXG4gICAgLy8gUHJvZHVjdCBmb3JtIGNvbnRhaW5lcnNcbiAgICB0aGlzLiR0aXRsZVRvdGFsU21hbGwgPSB0aGlzLiRlbC5maW5kKCcuY2FydC10aXRsZS10b3RhbC0tc21hbGwnKTtcbiAgICB0aGlzLiR0aXRsZVRvdGFsTGFyZ2UgPSB0aGlzLiRlbC5maW5kKCcuY2FydC10aXRsZS10b3RhbC0tbGFyZ2UnKTtcbiAgICB0aGlzLiR0aXRsZVRvdGFsQ29udGVudHMgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1jYXJ0LXRpdGxlLXRvdGFsXScpO1xuXG4gICAgLy8gU2hpcHBpbmcgY2FsY3VsYXRvciBlbGVtZW50c1xuICAgIHRoaXMuJHNoaXBwaW5nVG9nZ2xlID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtY2FydHNoaXBwaW5nLXRvZ2dsZV0nKTtcbiAgICB0aGlzLiRzaGlwcGluZ1Jlc3BvbnNlID0gdGhpcy4kc2hpcHBpbmcuZmluZCgnW2RhdGEtY2FydHNoaXBwaW5nLXJlc3BvbnNlXScpO1xuICAgIHRoaXMuJHNoaXBwaW5nUmVzcG9uc2VNZXNzYWdlID0gdGhpcy4kc2hpcHBpbmdSZXNwb25zZS5maW5kKCdbZGF0YS1jYXJ0c2hpcHBpbmctbWVzc2FnZV0nKTtcbiAgICB0aGlzLiRzaGlwcGluZ1Jlc3BvbnNlUmF0ZXMgPSB0aGlzLiRzaGlwcGluZ1Jlc3BvbnNlLmZpbmQoJ1tkYXRhLWNhcnRzaGlwcGluZy1yYXRlc10nKTtcbiAgICB0aGlzLiRzaGlwcGluZ1N1Ym1pdCA9IHRoaXMuJHNoaXBwaW5nLmZpbmQoJ1tkYXRhLWNhcnRzaGlwcGluZy1zdWJtaXRdJyk7XG5cbiAgICB0aGlzLl9tb3ZlVGl0bGVUb3RhbCgpO1xuXG4gICAgY29uc3QgJHNjcmlwdHMgPSAkKCdbZGF0YS1zY3JpcHRzXScpO1xuXG4gICAgJHNjcmlwdCgkc2NyaXB0cy5kYXRhKCdzaG9waWZ5LWFwaS11cmwnKSwgKCkgPT4ge1xuICAgICAgdGhpcy5fYmluZEV2ZW50cygpO1xuXG4gICAgICBTaG9waWZ5Lm9uRXJyb3IgPSB0aGlzLl9oYW5kbGVFcnJvcnMuYmluZCh0aGlzKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybXModGhpcy4kZWwpO1xuXG4gICAgLy8gVXBkYXRlIHRoZSBzZWN0aW9uIHdoZW4gb25TZWN0aW9uTG9hZCBmaXJlcyB0byByZXN0b3JlIHByaWNlcyB0byBsb2NhbCBjdXJyZW5jeVxuICAgIHRoaXMuJGVsLmZpbmQoJy5tb25leScpLmVhY2goKGluZGV4LCBlbCkgPT4gQ3VycmVuY3lDb252ZXJ0ZXIudXBkYXRlKGVsKSk7XG5cbiAgICBpZiAodGhpcy5zZXR0aW5ncy5zaGlwcGluZyAmJiB0aGlzLiRzaGlwcGluZy5sZW5ndGgpIHtcbiAgICAgICRzY3JpcHQoJHNjcmlwdHMuZGF0YSgnc2hvcGlmeS1jb3VudHJpZXMnKSwgKCkgPT4ge1xuICAgICAgICAkc2NyaXB0KCRzY3JpcHRzLmRhdGEoJ3Nob3BpZnktY29tbW9uJyksICgpID0+IHtcbiAgICAgICAgICAkc2NyaXB0KCRzY3JpcHRzLmRhdGEoJ3Nob3BpZnktY2FydCcpLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pbml0U2hpcHBpbmdDYWxjKCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMuJGVsLm9mZignLmNhcnQtcGFnZScpO1xuICAgIHRoaXMuJHdpbmRvdy5vZmYoJy5jYXJ0LXBhZ2UnKTtcbiAgICB0aGlzLmZvcm1zLnVubG9hZCgpO1xuICAgIHRoaXMubWVzc2FnZUJhbm5lci51bmxvYWQoKTtcbiAgICB0aGlzLm1lc3NhZ2VCYW5uZXIuZGlzbWlzc0Jhbm5lcnMoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuJGVsLm9uKCdrZXlkb3duLmNhcnQtcGFnZScsICdbZGF0YS1jYXJ0aXRlbS1xdWFudGl0eV0nLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX3F1YW50aXR5S2V5RG93bihldmVudCk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRlbC5vbignY2hhbmdlLmNhcnQtcGFnZScsICdbZGF0YS1jYXJ0aXRlbS1xdWFudGl0eV0nLCAoZXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX2VkaXRJdGVtUXVhbnRpdHkoZXZlbnQpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kZWwub24oJ2NsaWNrLmNhcnQtcGFnZScsICdbZGF0YS1jYXJ0aXRlbS1yZW1vdmVdJywgKGV2ZW50KSA9PiB7XG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgdGhpcy5fZWRpdEl0ZW1RdWFudGl0eShldmVudCwgdHJ1ZSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiR3aW5kb3cub24oJ3Jlc2l6ZS5jYXJ0LXBhZ2UnLCBkZWJvdW5jZSgoKSA9PiB0aGlzLl9tb3ZlVGl0bGVUb3RhbCgpLCAyMCkpO1xuICB9XG5cbiAgX21vdmVUaXRsZVRvdGFsKCkge1xuICAgIGlmICghdGhpcy4kdGl0bGVUb3RhbENvbnRlbnRzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiR3aW5kb3cub3V0ZXJXaWR0aCgpID49IDQ4MCkge1xuICAgICAgaWYgKCEkLmNvbnRhaW5zKHRoaXMuJHRpdGxlVG90YWxMYXJnZVswXSwgdGhpcy4kdGl0bGVUb3RhbENvbnRlbnRzWzBdKSkge1xuICAgICAgICBjb25zdCAkZm9ybSA9IHRoaXMuJHRpdGxlVG90YWxDb250ZW50cy5kZXRhY2goKTtcbiAgICAgICAgdGhpcy4kdGl0bGVUb3RhbExhcmdlLmFwcGVuZCgkZm9ybSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghJC5jb250YWlucyh0aGlzLiR0aXRsZVRvdGFsU21hbGxbMF0sIHRoaXMuJHRpdGxlVG90YWxDb250ZW50c1swXSkpIHtcbiAgICAgICAgY29uc3QgJGZvcm0gPSB0aGlzLiR0aXRsZVRvdGFsQ29udGVudHMuZGV0YWNoKCk7XG4gICAgICAgIHRoaXMuJHRpdGxlVG90YWxTbWFsbC5hcHBlbmQoJGZvcm0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmV2ZW50IGZvcm0gc3VibWlzc2lvbiB3aGVuIHByZXNzaW5nIGBlbnRlcmAgd2l0aGluIGEgcXVhbnRpdHkgc2VsZWN0b3JcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcXVhbnRpdHlLZXlEb3duKGV2ZW50KSB7XG4gICAgLy8gT25seSBibG9jayBlbnRlciBrZXlzXG4gICAgaWYgKGV2ZW50LmtleUNvZGUgIT09IDEzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQmxvY2sgZm9ybSBzdWJtaXNzaW9uLCBidXQgdXBkYXRlIGZpZWxkXG4gICAgJChldmVudC5jdXJyZW50VGFyZ2V0KS50cmlnZ2VyKCdjaGFuZ2UnKTtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIGFuIGl0ZW0gcXVhbnRpdHkgY2hhbmdlXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcGFyYW0ge0Jvb2xlYW59IHJlbW92ZSAtIFNldCBhcyB0cnVlIHRvIHJlbW92ZSBjYXJ0IGl0ZW1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9lZGl0SXRlbVF1YW50aXR5KGV2ZW50LCByZW1vdmUgPSBmYWxzZSkge1xuICAgIHRoaXMubWVzc2FnZUJhbm5lci5kaXNtaXNzQmFubmVycygpO1xuXG4gICAgY29uc3QgJHRhcmdldCA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgY29uc3QgJGNhcnRJdGVtID0gJHRhcmdldC5jbG9zZXN0KCdbZGF0YS1jYXJ0aXRlbS1pZF0nKTtcblxuICAgIGxldCBxdWFudGl0eSA9IHJlbW92ZSA/IDAgOiBwYXJzZUludCgkdGFyZ2V0LnZhbCgpLCAxMCk7XG4gICAgcXVhbnRpdHkgPSBNYXRoLm1heChxdWFudGl0eSwgMCk7XG5cbiAgICB0aGlzLl91cGRhdGVDYXJ0KCRjYXJ0SXRlbSwgcXVhbnRpdHkpO1xuXG4gICAgLy8gUmVtb3ZlIGl0ZW0gZnJvbSBjYXJ0IHZpc3VhbGx5IGlmIGl0IGlzIGJlaW5nIHJlbW92ZWRcbiAgICBpZiAocXVhbnRpdHkgPT09IDAgfHwgcmVtb3ZlKSB7XG4gICAgICAkY2FydEl0ZW0uaGVpZ2h0KCRjYXJ0SXRlbS5oZWlnaHQoKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSBjYXJ0IHdpdGggYSB2YWxpZCBxdWFudGl0eVxuICAgKlxuICAgKiBAcGFyYW0gJGNhcnRJdGVtXG4gICAqIEBwYXJhbSBxdWFudGl0eVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZUNhcnQoJGNhcnRJdGVtLCBxdWFudGl0eSkge1xuICAgIGNvbnN0IGlkID0gJGNhcnRJdGVtLmRhdGEoJ2NhcnRpdGVtLWlkJyk7XG5cbiAgICAvLyBOb3RpZnkgU2hvcGlmeSB1cGRhdGVkIGl0ZW1cbiAgICBTaG9waWZ5LmNoYW5nZUl0ZW0oaWQsIHF1YW50aXR5LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuX2RpZFVwZGF0ZShpZCwgcXVhbnRpdHkscmVzcG9uc2UsICRjYXJ0SXRlbSk7XG4gICAgfSk7XG4gIH1cblxuICBfcXVhbnRpdHlFcnJvcihsaW1pdCwgdGl0bGUpIHtcbiAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSB0aGlzLnNldHRpbmdzLnN0b2NrX2xpbWl0XG4gICAgICAucmVwbGFjZSgnKiogcXVhbnRpdHkgKionLCBsaW1pdClcbiAgICAgIC5yZXBsYWNlKCcqKiB0aXRsZSAqKicsIHRpdGxlKTtcblxuICAgIHRoaXMubWVzc2FnZUJhbm5lci5tZXNzYWdlKGVycm9yTWVzc2FnZSwgJ2Vycm9yJyk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGNhcnQgY29udGVudCBiYXNlZCBvbiBpbmZvcm1hdGlvbiBmcm9tIFNob3BpZnlcbiAgICpcbiAgICogQHBhcmFtIGlkXG4gICAqIEBwYXJhbSBxdWFudGl0eVxuICAgKiBAcGFyYW0gcmVzcG9uc2VcbiAgICogQHBhcmFtICRjYXJ0SXRlbVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9kaWRVcGRhdGUoaWQsIHF1YW50aXR5LHJlc3BvbnNlLCAkY2FydEl0ZW0pIHtcbiAgICAvLyBSZWxvYWQgcGFnZSBpZiBhbGwgaXRlbXMgYXJlIHJlbW92ZWQgZnJvbSBjYXJ0XG4gICAgaWYgKCFyZXNwb25zZS5pdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB3aW5kb3cubG9jYXRpb24gPSAnL2NhcnQnO1xuICAgIH1cblxuICAgIHRoaXMuJGhlYWRlci50cmlnZ2VyKCdjYXJ0Y291bnQ6dXBkYXRlJywgeyByZXNwb25zZSB9KTtcblxuICAgIHRoaXMuJHRvdGFsLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICBlbC5pbm5lckhUTUwgPSBTaG9waWZ5LmZvcm1hdE1vbmV5KHJlc3BvbnNlLnRvdGFsX3ByaWNlLCB0aGlzLnNldHRpbmdzLm1vbmV5X2Zvcm1hdCk7XG4gICAgICBDdXJyZW5jeUNvbnZlcnRlci51cGRhdGUoZWwpO1xuICAgIH0pO1xuXG4gICAgLy8gU2VsZWN0IGl0ZW0gZnJvbSByZXNwb25zZVxuICAgIGNvbnN0IGZpbHRlcmVkSXRlbXMgPSByZXNwb25zZS5pdGVtcy5maWx0ZXIoaXRlbSA9PiBpdGVtLmlkID09PSBpZCk7XG5cbiAgICBpZighZmlsdGVyZWRJdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiAkY2FydEl0ZW0uYWRkQ2xhc3MoJ3JlbW92aW5nJylcbiAgICAgICAgLm9uZSgndHJlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgJGNhcnRJdGVtXG4gICAgICAgICAgICAub2ZmKCd0cmVuZCcpXG4gICAgICAgICAgICAucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvbnN0IGNhcnRJdGVtID0gZmlsdGVyZWRJdGVtc1swXTtcbiAgICBjb25zdCBpdGVtVG90YWwgPSAkY2FydEl0ZW1bMF0ucXVlcnlTZWxlY3RvcignW2RhdGEtY2FydGl0ZW0tdG90YWxdJyk7XG5cbiAgICBpZiAoY2FydEl0ZW0ucXVhbnRpdHkgIT09IHF1YW50aXR5KSB7XG4gICAgICB0aGlzLl9xdWFudGl0eUVycm9yKGNhcnRJdGVtLnF1YW50aXR5LCBjYXJ0SXRlbS50aXRsZSk7XG4gICAgICAkY2FydEl0ZW0uZmluZCgnW2RhdGEtcXVhbnRpdHktaW5wdXRdJykudmFsKGNhcnRJdGVtLnF1YW50aXR5KTtcbiAgICAgICRjYXJ0SXRlbS5maW5kKCdbZGF0YS1xdWFudGl0eS1zZWxlY3RdJykudmFsKGNhcnRJdGVtLnF1YW50aXR5KTtcbiAgICB9XG5cbiAgICBpdGVtVG90YWwuaW5uZXJIVE1MID0gU2hvcGlmeS5mb3JtYXRNb25leShjYXJ0SXRlbS5wcmljZSAqIGNhcnRJdGVtLnF1YW50aXR5LCB0aGlzLnNldHRpbmdzLm1vbmV5X2Zvcm1hdCk7XG4gICAgQ3VycmVuY3lDb252ZXJ0ZXIudXBkYXRlKGl0ZW1Ub3RhbCk7XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIEVycm9ycyByZXR1cm5lZCBmcm9tIFNob3BpZnlcbiAgICpcbiAgICogQHBhcmFtIHhoclxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2hhbmRsZUVycm9ycyh4aHIgPSBudWxsKSB7XG4gICAgaWYgKCF4aHIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBlcnJvcnMgPSAkLnBhcnNlSlNPTih4aHIucmVzcG9uc2VUZXh0KTtcbiAgICBjb25zdCBzaGlwcGluZ1Jlc3BvbnNlID0ge1xuICAgICAgbWVzc2FnZTogdGhpcy5zaGlwcGluZy5lcnJvcl9nZW5lcmFsLFxuICAgIH07XG5cbiAgICBpZiAoZXJyb3JzLnppcCAmJiBlcnJvcnMuemlwLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChlcnJvcnMuemlwWzBdLmluZGV4T2YoJ2lzIG5vdCB2YWxpZCcpICE9PSAtMSB8fCBlcnJvcnMuemlwWzBdLmluZGV4T2YoJ2NhblxcJ3QgYmUgYmxhbmsnKSAhPT0gLTEpIHtcbiAgICAgICAgc2hpcHBpbmdSZXNwb25zZS5tZXNzYWdlID0gYCR7dGhpcy5zaGlwcGluZy56aXB9ICR7ZXJyb3JzLnppcH1gO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMuZXJyb3IgJiYgZXJyb3JzLmVycm9yLmxlbmd0aCA+IDApIHtcbiAgICAgIGlmIChlcnJvcnMuZXJyb3JbMF0uaW5kZXhPZignc2hpcG1lbnRfdG9vX2hlYXZ5JykgIT09IC0xKSB7XG4gICAgICAgIHNoaXBwaW5nUmVzcG9uc2UubWVzc2FnZSA9IHRoaXMuc2hpcHBpbmcuc2hpcG1lbnRfdG9vX2hlYXZ5O1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZVNoaXBwaW5nUmVzcG9uc2Uoc2hpcHBpbmdSZXNwb25zZSk7XG4gIH1cblxuICBfaW5pdFNoaXBwaW5nQ2FsYygpIHtcbiAgICB0aGlzLl9iaW5kU2hpcHBpbmdDYWxjRXZlbnRzKCk7XG5cbiAgICBTaG9waWZ5LkNhcnQuU2hpcHBpbmdDYWxjdWxhdG9yLnNob3coe1xuICAgICAgc3VibWl0QnV0dG9uOiB0aGlzLnNoaXBwaW5nLmNhbGN1bGF0ZV9zaGlwcGluZyxcbiAgICAgIHN1Ym1pdEJ1dHRvbkRpc2FibGVkOiB0aGlzLnNoaXBwaW5nLmNhbGN1bGF0aW5nLFxuICAgICAgY3VzdG9tZXJJc0xvZ2dlZEluOiB0aGlzLnNoaXBwaW5nLmN1c3RvbWVyLFxuICAgICAgbW9uZXlGb3JtYXQ6IHRoaXMuc2V0dGluZ3MubW9uZXlfZm9ybWF0LFxuICAgIH0pO1xuICB9XG5cbiAgX2JpbmRTaGlwcGluZ0NhbGNFdmVudHMoKSB7XG4gICAgdGhpcy4kZWwub24oJ2NsaWNrLmNhcnQtcGFnZScsICdbZGF0YS1jYXJ0c2hpcHBpbmctdG9nZ2xlXScsICgpID0+IHtcbiAgICAgIHRoaXMuX3RvZ2dsZVNoaXBwaW5nQ2FsYygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kZWwub24oJ2NsaWNrLmNhcnQtcGFnZScsICdbZGF0YS1jYXJ0c2hpcHBpbmctc3VibWl0XScsICgpID0+IHtcbiAgICAgIHRoaXMuX2dldFNoaXBwaW5nUmF0ZXMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuJGVsLm9uKCdrZXlwcmVzcy5jYXJ0LXBhZ2UnLCAnI2FkZHJlc3NfemlwJywgKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTAgfHwgZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy4kc2hpcHBpbmdTdWJtaXQudHJpZ2dlcignY2xpY2snKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIF90b2dnbGVTaGlwcGluZ0NhbGMoKSB7XG4gICAgY29uc3Qgb2xkVGV4dCA9IHRoaXMuJHNoaXBwaW5nVG9nZ2xlLnRleHQoKTtcbiAgICBjb25zdCBuZXdUZXh0ID0gdGhpcy4kc2hpcHBpbmdUb2dnbGUuZGF0YSgnY2FydHNoaXBwaW5nLXRvZ2dsZScpO1xuXG4gICAgdGhpcy4kc2hpcHBpbmdUb2dnbGVcbiAgICAgIC50ZXh0KG5ld1RleHQpXG4gICAgICAuZGF0YSgnY2FydHNoaXBwaW5nLXRvZ2dsZScsIG9sZFRleHQpO1xuXG4gICAgdGhpcy4kc2hpcHBpbmcudG9nZ2xlQ2xhc3MoJ29wZW4nKTtcbiAgfVxuXG4gIF9nZXRTaGlwcGluZ1JhdGVzKCkge1xuICAgIHRoaXMuX2Rpc2FibGVTaGlwcGluZ0J1dHRvbigpO1xuXG4gICAgY29uc3Qgc2hpcHBpbmdBZGRyZXNzID0ge307XG4gICAgc2hpcHBpbmdBZGRyZXNzLmNvdW50cnkgPSAkKCcjYWRkcmVzc19jb3VudHJ5JykudmFsKCkgfHwgJyc7XG4gICAgc2hpcHBpbmdBZGRyZXNzLnByb3ZpbmNlID0gJCgnI2FkZHJlc3NfcHJvdmluY2UnKS52YWwoKSB8fCAnJztcbiAgICBzaGlwcGluZ0FkZHJlc3MuemlwID0gJCgnI2FkZHJlc3NfemlwJykudmFsKCkgfHwgJyc7XG5cbiAgICAvLyBDcmVhdGVzIGFuIGFqYXggcmVxdWVzdCB3aGljaCByZXR1cm5zIHNoaXBwaW5nIGluZm9ybWF0aW9uXG4gICAgU2hvcGlmeS5nZXRDYXJ0U2hpcHBpbmdSYXRlc0ZvckRlc3RpbmF0aW9uKHNoaXBwaW5nQWRkcmVzcywgKHJlc3BvbnNlLCBzaGlwcGluZ0FkZHJlc3MpID0+IHtcbiAgICAgIGNvbnN0IGFkZHJlc3NCYXNlID0gW107XG5cbiAgICAgIGlmIChzaGlwcGluZ0FkZHJlc3MuemlwLmxlbmd0aCkge1xuICAgICAgICBhZGRyZXNzQmFzZS5wdXNoKHNoaXBwaW5nQWRkcmVzcy56aXAudHJpbSgpKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNoaXBwaW5nQWRkcmVzcy5wcm92aW5jZS5sZW5ndGgpIHtcbiAgICAgICAgYWRkcmVzc0Jhc2UucHVzaChzaGlwcGluZ0FkZHJlc3MucHJvdmluY2UpO1xuICAgICAgfVxuXG4gICAgICBpZiAoc2hpcHBpbmdBZGRyZXNzLmNvdW50cnkubGVuZ3RoKSB7XG4gICAgICAgIGFkZHJlc3NCYXNlLnB1c2goc2hpcHBpbmdBZGRyZXNzLmNvdW50cnkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBhZGRyZXNzID0gYWRkcmVzc0Jhc2Uuam9pbignLCAnKTtcblxuICAgICAgbGV0IG1lc3NhZ2UgPSAnJztcbiAgICAgIGlmIChyZXNwb25zZS5sZW5ndGggPiAxKSB7XG4gICAgICAgIGNvbnN0IGZpcnN0UmF0ZSA9IFNob3BpZnkuQ2FydC5TaGlwcGluZ0NhbGN1bGF0b3IuZm9ybWF0UmF0ZShyZXNwb25zZVswXS5wcmljZSk7XG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLnNoaXBwaW5nLm11bHRpcGxlX3JhdGVzXG4gICAgICAgICAgLnJlcGxhY2UoJyphZGRyZXNzKicsIGFkZHJlc3MpXG4gICAgICAgICAgLnJlcGxhY2UoJypudW1iZXJfb2ZfcmF0ZXMqJywgcmVzcG9uc2UubGVuZ3RoKVxuICAgICAgICAgIC5yZXBsYWNlKCcqcmF0ZSonLCBgPHNwYW4gY2xhc3M9XCJtb25leVwiPiR7Zmlyc3RSYXRlfTwvc3Bhbj5gKTtcbiAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIG1lc3NhZ2UgPSB0aGlzLnNoaXBwaW5nLm9uZV9yYXRlLnJlcGxhY2UoJyphZGRyZXNzKicsIGFkZHJlc3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWVzc2FnZSA9IHRoaXMuc2hpcHBpbmcubm9fcmF0ZXM7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJhdGVzID0gW107XG4gICAgICByZXNwb25zZS5mb3JFYWNoKChyYXRlKSA9PiB7XG4gICAgICAgIGNvbnN0IHByaWNlID0gU2hvcGlmeS5DYXJ0LlNoaXBwaW5nQ2FsY3VsYXRvci5mb3JtYXRSYXRlKHJhdGUucHJpY2UpO1xuICAgICAgICBjb25zdCByYXRlVmFsdWUgPSB0aGlzLnNoaXBwaW5nLnJhdGVfdmFsdWVcbiAgICAgICAgICAucmVwbGFjZSgnKnJhdGVfdGl0bGUqJywgcmF0ZS5uYW1lKVxuICAgICAgICAgIC5yZXBsYWNlKCcqcmF0ZSonLCBgPHNwYW4gY2xhc3M9XCJtb25leVwiPiR7cHJpY2V9PC9zcGFuPmApO1xuXG4gICAgICAgIHJhdGVzLnB1c2goYDxsaT4ke3JhdGVWYWx1ZX08L2xpPmApO1xuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuX2hhbmRsZVNoaXBwaW5nUmVzcG9uc2Uoe1xuICAgICAgICBtZXNzYWdlLFxuICAgICAgICByYXRlcyxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgX2VuYWJsZVNoaXBwaW5nQnV0dG9uKCkge1xuICAgIHRoaXMuJHNoaXBwaW5nU3VibWl0XG4gICAgICAudGV4dCh0aGlzLnNoaXBwaW5nLmNhbGN1bGF0ZV9zaGlwcGluZylcbiAgICAgIC5hdHRyKCdkaXNhYmxlZCcsIGZhbHNlKTtcbiAgfVxuXG4gIF9kaXNhYmxlU2hpcHBpbmdCdXR0b24oKSB7XG4gICAgdGhpcy4kc2hpcHBpbmdTdWJtaXRcbiAgICAgIC50ZXh0KHRoaXMuc2hpcHBpbmcuY2FsY3VsYXRpbmcpXG4gICAgICAuYXR0cignZGlzYWJsZWQnLCB0cnVlKTtcbiAgfVxuXG4gIF9zaG93U2hpcHBpbmdSZXNwb25zZSgpIHtcbiAgICB0aGlzLiRzaGlwcGluZ1Jlc3BvbnNlLmFkZENsYXNzKCd2aXNpYmxlJyk7XG4gIH1cblxuICBfaGlkZVNoaXBwaW5nUmVzcG9uc2UoKSB7XG4gICAgdGhpcy4kc2hpcHBpbmdSZXNwb25zZS5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBzaGlwcGluZyByZXNwb25zZXNcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IHNoaXBwaW5nUmVzcG9uc2VcbiAgICogQHByb3BlcnR5IHtTdHJpbmd9IHNoaXBwaW5nUmVzcG9uc2UubWVzc2FnZXMgLSBFcnJvciAvIFN1Y2Nlc3MgbWVzc2FnZVxuICAgKiBAcHJvcGVydHkge0FycmF5fFN0cmluZ30gc2hpcHBpbmdSZXNwb25zZS5yYXRlcyAtIFNoaXBwaW5nIHJhdGVzXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlU2hpcHBpbmdSZXNwb25zZShzaGlwcGluZ1Jlc3BvbnNlID0ge30pIHtcbiAgICAvLyBIaWRlIHRoZSByZXNwb25zZSBzbyB0aGF0IGl0IGNhbiBiZSBwb3B1bGF0ZWQgc21vb3RobHlcbiAgICB0aGlzLl9oaWRlU2hpcHBpbmdSZXNwb25zZSgpO1xuXG4gICAgY29uc3QgbWVzc2FnZSA9IHNoaXBwaW5nUmVzcG9uc2UubWVzc2FnZSB8fCBudWxsO1xuICAgIGNvbnN0IHJhdGVzID0gc2hpcHBpbmdSZXNwb25zZS5yYXRlcyB8fCBudWxsO1xuXG4gICAgLy8gRW1wdHkgb3V0IGNvbnRlbnRzXG4gICAgdGhpcy4kc2hpcHBpbmdSZXNwb25zZU1lc3NhZ2UuZW1wdHkoKTtcbiAgICB0aGlzLiRzaGlwcGluZ1Jlc3BvbnNlUmF0ZXMuZW1wdHkoKTtcblxuICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICB0aGlzLiRzaGlwcGluZ1Jlc3BvbnNlTWVzc2FnZS5odG1sKG1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGlmIChyYXRlcykge1xuICAgICAgdGhpcy4kc2hpcHBpbmdSZXNwb25zZVJhdGVzLmh0bWwocmF0ZXMpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHRoZSBjYWxjdWxhdGluZyBidXR0b24gc28gaXQgY2FuIGJlIHVzZWQgYWdhaW5cbiAgICB0aGlzLl9lbmFibGVTaGlwcGluZ0J1dHRvbigpO1xuXG4gICAgLy8gTm8gZXJyb3IgcHJvdmlkZWRcbiAgICBpZiAoIW1lc3NhZ2UgJiYgIXJhdGVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gU2hvdyB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLl9zaG93U2hpcHBpbmdSZXNwb25zZSgpO1xuICB9XG59XG4iLCIoZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gXCJmdW5jdGlvblwiICYmIGRlZmluZS5hbWQpIHtcbiAgICBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzICE9PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgZmFjdG9yeShleHBvcnRzKTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgbW9kID0ge1xuICAgICAgZXhwb3J0czoge31cbiAgICB9O1xuICAgIGZhY3RvcnkobW9kLmV4cG9ydHMpO1xuICAgIGdsb2JhbC5WYW5pbGxhTW9kYWwgPSBtb2QuZXhwb3J0cztcbiAgfVxufSkodGhpcywgZnVuY3Rpb24gKGV4cG9ydHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIF9jbGFzc0NhbGxDaGVjayhpbnN0YW5jZSwgQ29uc3RydWN0b3IpIHtcbiAgICBpZiAoIShpbnN0YW5jZSBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgICB9XG4gIH1cblxuICB2YXIgX2NyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICAgIGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wcykge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgICBkZXNjcmlwdG9yLmVudW1lcmFibGUgPSBkZXNjcmlwdG9yLmVudW1lcmFibGUgfHwgZmFsc2U7XG4gICAgICAgIGRlc2NyaXB0b3IuY29uZmlndXJhYmxlID0gdHJ1ZTtcbiAgICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgZGVzY3JpcHRvci5rZXksIGRlc2NyaXB0b3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbiAoQ29uc3RydWN0b3IsIHByb3RvUHJvcHMsIHN0YXRpY1Byb3BzKSB7XG4gICAgICBpZiAocHJvdG9Qcm9wcykgZGVmaW5lUHJvcGVydGllcyhDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHByb3RvUHJvcHMpO1xuICAgICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgICByZXR1cm4gQ29uc3RydWN0b3I7XG4gICAgfTtcbiAgfSgpO1xuXG4gIHZhciBfZXh0ZW5kcyA9IE9iamVjdC5hc3NpZ24gfHwgZnVuY3Rpb24gKHRhcmdldCkge1xuICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc291cmNlID0gYXJndW1lbnRzW2ldO1xuXG4gICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc291cmNlLCBrZXkpKSB7XG4gICAgICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB0YXJnZXQ7XG4gIH07XG5cbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIG1vZGFsOiAnLm1vZGFsJyxcbiAgICBtb2RhbElubmVyOiAnLm1vZGFsLWlubmVyJyxcbiAgICBtb2RhbENvbnRlbnQ6ICcubW9kYWwtY29udGVudCcsXG4gICAgb3BlbjogJ1tkYXRhLW1vZGFsLW9wZW5dJyxcbiAgICBjbG9zZTogJ1tkYXRhLW1vZGFsLWNsb3NlXScsXG4gICAgcGFnZTogJ2JvZHknLFxuICAgIGNsYXNzOiAnbW9kYWwtdmlzaWJsZScsXG4gICAgbG9hZENsYXNzOiAndmFuaWxsYS1tb2RhbCcsXG4gICAgY2xpY2tPdXRzaWRlOiB0cnVlLFxuICAgIGNsb3NlS2V5czogWzI3XSxcbiAgICB0cmFuc2l0aW9uczogdHJ1ZSxcbiAgICB0cmFuc2l0aW9uRW5kOiBudWxsLFxuICAgIG9uQmVmb3JlT3BlbjogbnVsbCxcbiAgICBvbkJlZm9yZUNsb3NlOiBudWxsLFxuICAgIG9uT3BlbjogbnVsbCxcbiAgICBvbkNsb3NlOiBudWxsXG4gIH07XG5cbiAgZnVuY3Rpb24gdGhyb3dFcnJvcihtZXNzYWdlKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKCdWYW5pbGxhTW9kYWw6ICcgKyBtZXNzYWdlKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGZpbmQoYXJyLCBjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgICB2YXIgZmlsdGVyZWRBcnJheSA9IGFyci5maWx0ZXIoY2FsbGJhY2spO1xuICAgICAgcmV0dXJuIGZpbHRlcmVkQXJyYXlbMF0gPyBmaWx0ZXJlZEFycmF5WzBdW2tleV0gOiB1bmRlZmluZWQ7XG4gICAgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyYW5zaXRpb25FbmRWZW5kb3JTbmlmZigpIHtcbiAgICB2YXIgZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICB2YXIgdHJhbnNpdGlvbnMgPSBbeyBrZXk6ICd0cmFuc2l0aW9uJywgdmFsdWU6ICd0cmFuc2l0aW9uZW5kJyB9LCB7IGtleTogJ09UcmFuc2l0aW9uJywgdmFsdWU6ICdvdHJhbnNpdGlvbmVuZCcgfSwgeyBrZXk6ICdNb3pUcmFuc2l0aW9uJywgdmFsdWU6ICd0cmFuc2l0aW9uZW5kJyB9LCB7IGtleTogJ1dlYmtpdFRyYW5zaXRpb24nLCB2YWx1ZTogJ3dlYmtpdFRyYW5zaXRpb25FbmQnIH1dO1xuICAgIHJldHVybiBmaW5kKHRyYW5zaXRpb25zLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgdmFyIGtleSA9IF9yZWYua2V5O1xuICAgICAgcmV0dXJuIHR5cGVvZiBlbC5zdHlsZVtrZXldICE9PSAndW5kZWZpbmVkJztcbiAgICB9KSgndmFsdWUnKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGlzUG9wdWxhdGVkQXJyYXkoYXJyKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChhcnIpID09PSAnW29iamVjdCBBcnJheV0nICYmIGFyci5sZW5ndGg7XG4gIH1cblxuICBmdW5jdGlvbiBnZXROb2RlKHNlbGVjdG9yLCBwYXJlbnQpIHtcbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IHBhcmVudCB8fCBkb2N1bWVudDtcbiAgICB2YXIgbm9kZSA9IHRhcmdldE5vZGUucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgaWYgKCFub2RlKSB7XG4gICAgICB0aHJvd0Vycm9yKHNlbGVjdG9yICsgJyBub3QgZm91bmQgaW4gZG9jdW1lbnQuJyk7XG4gICAgfVxuICAgIHJldHVybiBub2RlO1xuICB9XG5cbiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGlmICghKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICB0aHJvd0Vycm9yKCdOb3QgYSB2YWxpZCBIVE1MIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBlbC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoZnVuY3Rpb24gKGNuKSB7XG4gICAgICByZXR1cm4gY24gIT09IGNsYXNzTmFtZTtcbiAgICB9KS5jb25jYXQoY2xhc3NOYW1lKS5qb2luKCcgJykpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3MoZWwsIGNsYXNzTmFtZSkge1xuICAgIGlmICghKGVsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICB0aHJvd0Vycm9yKCdOb3QgYSB2YWxpZCBIVE1MIGVsZW1lbnQuJyk7XG4gICAgfVxuICAgIGVsLnNldEF0dHJpYnV0ZSgnY2xhc3MnLCBlbC5jbGFzc05hbWUuc3BsaXQoJyAnKS5maWx0ZXIoZnVuY3Rpb24gKGNuKSB7XG4gICAgICByZXR1cm4gY24gIT09IGNsYXNzTmFtZTtcbiAgICB9KS5qb2luKCcgJykpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxlbWVudENvbnRleHQoZSkge1xuICAgIGlmIChlICYmIHR5cGVvZiBlLmhhc2ggPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLmhhc2gpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTtcbiAgICB9XG4gICAgdGhyb3dFcnJvcignTm8gc2VsZWN0b3Igc3VwcGxpZWQgdG8gb3BlbigpJyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseVVzZXJTZXR0aW5ncyhzZXR0aW5ncykge1xuICAgIHJldHVybiBfZXh0ZW5kcyh7fSwgZGVmYXVsdHMsIHNldHRpbmdzLCB7XG4gICAgICB0cmFuc2l0aW9uRW5kOiB0cmFuc2l0aW9uRW5kVmVuZG9yU25pZmYoKVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gbWF0Y2hlcyhlLCBzZWxlY3Rvcikge1xuICAgIHZhciBhbGxNYXRjaGVzID0gKGUudGFyZ2V0LmRvY3VtZW50IHx8IGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWxsTWF0Y2hlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIG5vZGUgPSBlLnRhcmdldDtcbiAgICAgIHdoaWxlIChub2RlICYmIG5vZGUgIT09IGRvY3VtZW50LmJvZHkpIHtcbiAgICAgICAgaWYgKG5vZGUgPT09IGFsbE1hdGNoZXNbaV0pIHtcbiAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgfVxuICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBWYW5pbGxhTW9kYWwgPSBmdW5jdGlvbiAoKSB7XG4gICAgZnVuY3Rpb24gVmFuaWxsYU1vZGFsKHNldHRpbmdzKSB7XG4gICAgICBfY2xhc3NDYWxsQ2hlY2sodGhpcywgVmFuaWxsYU1vZGFsKTtcblxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuY3VycmVudCA9IG51bGw7XG4gICAgICB0aGlzLmlzTGlzdGVuaW5nID0gZmFsc2U7XG5cbiAgICAgIHRoaXMuc2V0dGluZ3MgPSBhcHBseVVzZXJTZXR0aW5ncyhzZXR0aW5ncyk7XG4gICAgICB0aGlzLmRvbSA9IHRoaXMuZ2V0RG9tTm9kZXMoKTtcblxuICAgICAgdGhpcy5vcGVuID0gdGhpcy5vcGVuLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmNsb3NlID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5jbG9zZUtleUhhbmRsZXIgPSB0aGlzLmNsb3NlS2V5SGFuZGxlci5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy5vdXRzaWRlQ2xpY2tIYW5kbGVyID0gdGhpcy5vdXRzaWRlQ2xpY2tIYW5kbGVyLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRlbGVnYXRlT3BlbiA9IHRoaXMuZGVsZWdhdGVPcGVuLmJpbmQodGhpcyk7XG4gICAgICB0aGlzLmRlbGVnYXRlQ2xvc2UgPSB0aGlzLmRlbGVnYXRlQ2xvc2UuYmluZCh0aGlzKTtcbiAgICAgIHRoaXMubGlzdGVuID0gdGhpcy5saXN0ZW4uYmluZCh0aGlzKTtcbiAgICAgIHRoaXMuZGVzdHJveSA9IHRoaXMuZGVzdHJveS5iaW5kKHRoaXMpO1xuXG4gICAgICB0aGlzLmFkZExvYWRlZENzc0NsYXNzKCk7XG4gICAgICB0aGlzLmxpc3RlbigpO1xuICAgIH1cblxuICAgIF9jcmVhdGVDbGFzcyhWYW5pbGxhTW9kYWwsIFt7XG4gICAgICBrZXk6ICdnZXREb21Ob2RlcycsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0RG9tTm9kZXMoKSB7XG4gICAgICAgIHZhciBfc2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgICAgbW9kYWwgPSBfc2V0dGluZ3MubW9kYWwsXG4gICAgICAgICAgICBwYWdlID0gX3NldHRpbmdzLnBhZ2UsXG4gICAgICAgICAgICBtb2RhbElubmVyID0gX3NldHRpbmdzLm1vZGFsSW5uZXIsXG4gICAgICAgICAgICBtb2RhbENvbnRlbnQgPSBfc2V0dGluZ3MubW9kYWxDb250ZW50O1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbW9kYWw6IGdldE5vZGUobW9kYWwpLFxuICAgICAgICAgIHBhZ2U6IGdldE5vZGUocGFnZSksXG4gICAgICAgICAgbW9kYWxJbm5lcjogZ2V0Tm9kZShtb2RhbElubmVyLCBnZXROb2RlKG1vZGFsKSksXG4gICAgICAgICAgbW9kYWxDb250ZW50OiBnZXROb2RlKG1vZGFsQ29udGVudCwgZ2V0Tm9kZShtb2RhbCkpXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnYWRkTG9hZGVkQ3NzQ2xhc3MnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGFkZExvYWRlZENzc0NsYXNzKCkge1xuICAgICAgICBhZGRDbGFzcyh0aGlzLmRvbS5wYWdlLCB0aGlzLnNldHRpbmdzLmxvYWRDbGFzcyk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnc2V0T3BlbklkJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBzZXRPcGVuSWQoaWQpIHtcbiAgICAgICAgdmFyIHBhZ2UgPSB0aGlzLmRvbS5wYWdlO1xuXG4gICAgICAgIHBhZ2Uuc2V0QXR0cmlidXRlKCdkYXRhLWN1cnJlbnQtbW9kYWwnLCBpZCB8fCAnYW5vbnltb3VzJyk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAncmVtb3ZlT3BlbklkJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZW1vdmVPcGVuSWQoKSB7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5kb20ucGFnZTtcblxuICAgICAgICBwYWdlLnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1jdXJyZW50LW1vZGFsJyk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnb3BlbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gb3BlbihhbGxNYXRjaGVzLCBlKSB7XG4gICAgICAgIHZhciBwYWdlID0gdGhpcy5kb20ucGFnZTtcbiAgICAgICAgdmFyIF9zZXR0aW5nczIgPSB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgICAgb25CZWZvcmVPcGVuID0gX3NldHRpbmdzMi5vbkJlZm9yZU9wZW4sXG4gICAgICAgICAgICBvbk9wZW4gPSBfc2V0dGluZ3MyLm9uT3BlbjtcblxuICAgICAgICBpZiAoISh0aGlzLmN1cnJlbnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCA9PT0gZmFsc2UpKSB7XG4gICAgICAgICAgdGhyb3dFcnJvcignVmFuaWxsYU1vZGFsIHRhcmdldCBtdXN0IGV4aXN0IG9uIHBhZ2UuJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVsZWFzZU5vZGUodGhpcy5jdXJyZW50KTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gZ2V0RWxlbWVudENvbnRleHQoYWxsTWF0Y2hlcyk7XG4gICAgICAgIGlmICh0eXBlb2Ygb25CZWZvcmVPcGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25CZWZvcmVPcGVuLmNhbGwodGhpcywgZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jYXB0dXJlTm9kZSh0aGlzLmN1cnJlbnQpO1xuICAgICAgICBhZGRDbGFzcyhwYWdlLCB0aGlzLnNldHRpbmdzLmNsYXNzKTtcbiAgICAgICAgdGhpcy5zZXRPcGVuSWQodGhpcy5jdXJyZW50LmlkKTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIG9uT3BlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIG9uT3Blbi5jYWxsKHRoaXMsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnZGV0ZWN0VHJhbnNpdGlvbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZGV0ZWN0VHJhbnNpdGlvbigpIHtcbiAgICAgICAgdmFyIG1vZGFsID0gdGhpcy5kb20ubW9kYWw7XG5cbiAgICAgICAgdmFyIGNzcyA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG1vZGFsLCBudWxsKTtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4oWyd0cmFuc2l0aW9uRHVyYXRpb24nLCAnb1RyYW5zaXRpb25EdXJhdGlvbicsICdNb3pUcmFuc2l0aW9uRHVyYXRpb24nLCAnd2Via2l0VHJhbnNpdGlvbkR1cmF0aW9uJ10uZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVvZiBjc3NbaV0gPT09ICdzdHJpbmcnICYmIHBhcnNlRmxvYXQoY3NzW2ldKSA+IDA7XG4gICAgICAgIH0pLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnY2xvc2UnLFxuICAgICAgdmFsdWU6IGZ1bmN0aW9uIGNsb3NlKGUpIHtcbiAgICAgICAgdmFyIF9zZXR0aW5nczMgPSB0aGlzLnNldHRpbmdzLFxuICAgICAgICAgICAgdHJhbnNpdGlvbnMgPSBfc2V0dGluZ3MzLnRyYW5zaXRpb25zLFxuICAgICAgICAgICAgdHJhbnNpdGlvbkVuZCA9IF9zZXR0aW5nczMudHJhbnNpdGlvbkVuZCxcbiAgICAgICAgICAgIG9uQmVmb3JlQ2xvc2UgPSBfc2V0dGluZ3MzLm9uQmVmb3JlQ2xvc2U7XG5cbiAgICAgICAgdmFyIGhhc1RyYW5zaXRpb24gPSB0aGlzLmRldGVjdFRyYW5zaXRpb24oKTtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG9uQmVmb3JlQ2xvc2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIG9uQmVmb3JlQ2xvc2UuY2FsbCh0aGlzLCBlKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVtb3ZlQ2xhc3ModGhpcy5kb20ucGFnZSwgdGhpcy5zZXR0aW5ncy5jbGFzcyk7XG4gICAgICAgICAgaWYgKHRyYW5zaXRpb25zICYmIHRyYW5zaXRpb25FbmQgJiYgaGFzVHJhbnNpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jbG9zZU1vZGFsV2l0aFRyYW5zaXRpb24oZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2xvc2VNb2RhbChlKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdjbG9zZU1vZGFsJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZU1vZGFsKGUpIHtcbiAgICAgICAgdmFyIG9uQ2xvc2UgPSB0aGlzLnNldHRpbmdzLm9uQ2xvc2U7XG5cbiAgICAgICAgdGhpcy5yZW1vdmVPcGVuSWQodGhpcy5kb20ucGFnZSk7XG4gICAgICAgIHRoaXMucmVsZWFzZU5vZGUodGhpcy5jdXJyZW50KTtcbiAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jdXJyZW50ID0gbnVsbDtcbiAgICAgICAgaWYgKHR5cGVvZiBvbkNsb3NlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb25DbG9zZS5jYWxsKHRoaXMsIGUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnY2xvc2VNb2RhbFdpdGhUcmFuc2l0aW9uJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZU1vZGFsV2l0aFRyYW5zaXRpb24oZSkge1xuICAgICAgICB2YXIgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHZhciBtb2RhbCA9IHRoaXMuZG9tLm1vZGFsO1xuICAgICAgICB2YXIgdHJhbnNpdGlvbkVuZCA9IHRoaXMuc2V0dGluZ3MudHJhbnNpdGlvbkVuZDtcblxuICAgICAgICB2YXIgY2xvc2VUcmFuc2l0aW9uSGFuZGxlciA9IGZ1bmN0aW9uIGNsb3NlVHJhbnNpdGlvbkhhbmRsZXIoKSB7XG4gICAgICAgICAgbW9kYWwucmVtb3ZlRXZlbnRMaXN0ZW5lcih0cmFuc2l0aW9uRW5kLCBjbG9zZVRyYW5zaXRpb25IYW5kbGVyKTtcbiAgICAgICAgICBfdGhpcy5jbG9zZU1vZGFsKGUpO1xuICAgICAgICB9O1xuICAgICAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKHRyYW5zaXRpb25FbmQsIGNsb3NlVHJhbnNpdGlvbkhhbmRsZXIpO1xuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2NhcHR1cmVOb2RlJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjYXB0dXJlTm9kZShub2RlKSB7XG4gICAgICAgIHZhciBtb2RhbENvbnRlbnQgPSB0aGlzLmRvbS5tb2RhbENvbnRlbnQ7XG5cbiAgICAgICAgd2hpbGUgKG5vZGUuY2hpbGROb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgICBtb2RhbENvbnRlbnQuYXBwZW5kQ2hpbGQobm9kZS5jaGlsZE5vZGVzWzBdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ3JlbGVhc2VOb2RlJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiByZWxlYXNlTm9kZShub2RlKSB7XG4gICAgICAgIHZhciBtb2RhbENvbnRlbnQgPSB0aGlzLmRvbS5tb2RhbENvbnRlbnQ7XG5cbiAgICAgICAgd2hpbGUgKG1vZGFsQ29udGVudC5jaGlsZE5vZGVzLmxlbmd0aCkge1xuICAgICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQobW9kYWxDb250ZW50LmNoaWxkTm9kZXNbMF0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwge1xuICAgICAga2V5OiAnY2xvc2VLZXlIYW5kbGVyJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBjbG9zZUtleUhhbmRsZXIoZSkge1xuICAgICAgICB2YXIgY2xvc2VLZXlzID0gdGhpcy5zZXR0aW5ncy5jbG9zZUtleXM7XG5cbiAgICAgICAgaWYgKGlzUG9wdWxhdGVkQXJyYXkoY2xvc2VLZXlzKSAmJiBjbG9zZUtleXMuaW5kZXhPZihlLndoaWNoKSA+IC0xICYmIHRoaXMuaXNPcGVuID09PSB0cnVlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuY2xvc2UoZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdvdXRzaWRlQ2xpY2tIYW5kbGVyJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBvdXRzaWRlQ2xpY2tIYW5kbGVyKGUpIHtcbiAgICAgICAgdmFyIGNsaWNrT3V0c2lkZSA9IHRoaXMuc2V0dGluZ3MuY2xpY2tPdXRzaWRlO1xuICAgICAgICB2YXIgbW9kYWxJbm5lciA9IHRoaXMuZG9tLm1vZGFsSW5uZXI7XG5cbiAgICAgICAgaWYgKGNsaWNrT3V0c2lkZSkge1xuICAgICAgICAgIHZhciBub2RlID0gZS50YXJnZXQ7XG4gICAgICAgICAgd2hpbGUgKG5vZGUgJiYgbm9kZSAhPT0gZG9jdW1lbnQuYm9keSkge1xuICAgICAgICAgICAgaWYgKG5vZGUgPT09IG1vZGFsSW5uZXIpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5jbG9zZShlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2RlbGVnYXRlT3BlbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gZGVsZWdhdGVPcGVuKGUpIHtcbiAgICAgICAgdmFyIG9wZW4gPSB0aGlzLnNldHRpbmdzLm9wZW47XG5cbiAgICAgICAgdmFyIG1hdGNoZWROb2RlID0gbWF0Y2hlcyhlLCBvcGVuKTtcbiAgICAgICAgaWYgKG1hdGNoZWROb2RlKSB7XG4gICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMub3BlbihtYXRjaGVkTm9kZSwgZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdkZWxlZ2F0ZUNsb3NlJyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBkZWxlZ2F0ZUNsb3NlKGUpIHtcbiAgICAgICAgdmFyIGNsb3NlID0gdGhpcy5zZXR0aW5ncy5jbG9zZTtcblxuICAgICAgICBpZiAobWF0Y2hlcyhlLCBjbG9zZSkpIHtcbiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5jbG9zZShlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIGtleTogJ2xpc3RlbicsXG4gICAgICB2YWx1ZTogZnVuY3Rpb24gbGlzdGVuKCkge1xuICAgICAgICB2YXIgbW9kYWwgPSB0aGlzLmRvbS5tb2RhbDtcblxuICAgICAgICBpZiAoIXRoaXMuaXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgICBtb2RhbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub3V0c2lkZUNsaWNrSGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLmNsb3NlS2V5SGFuZGxlciwgZmFsc2UpO1xuICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5kZWxlZ2F0ZU9wZW4sIGZhbHNlKTtcbiAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZGVsZWdhdGVDbG9zZSwgZmFsc2UpO1xuICAgICAgICAgIHRoaXMuaXNMaXN0ZW5pbmcgPSB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoJ0V2ZW50IGxpc3RlbmVycyBhbHJlYWR5IGFwcGxpZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LCB7XG4gICAgICBrZXk6ICdkZXN0cm95JyxcbiAgICAgIHZhbHVlOiBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICB2YXIgbW9kYWwgPSB0aGlzLmRvbS5tb2RhbDtcblxuICAgICAgICBpZiAodGhpcy5pc0xpc3RlbmluZykge1xuICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICBtb2RhbC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub3V0c2lkZUNsaWNrSGFuZGxlcik7XG4gICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuY2xvc2VLZXlIYW5kbGVyKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZGVsZWdhdGVPcGVuKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuZGVsZWdhdGVDbG9zZSk7XG4gICAgICAgICAgdGhpcy5pc0xpc3RlbmluZyA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3IoJ0V2ZW50IGxpc3RlbmVycyBhbHJlYWR5IHJlbW92ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XSk7XG5cbiAgICByZXR1cm4gVmFuaWxsYU1vZGFsO1xuICB9KCk7XG5cbiAgZXhwb3J0cy5kZWZhdWx0ID0gVmFuaWxsYU1vZGFsO1xufSk7XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2p1c3QtZGVib3VuY2UnO1xuaW1wb3J0IFZhbmlsbGFNb2RhbCBmcm9tICd2YW5pbGxhLW1vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTW9kYWwge1xuICBjb25zdHJ1Y3RvcihjYWxsYmFja3MgPSB7fSkge1xuICAgIHRoaXMuJGJvZHkgPSAkKGRvY3VtZW50LmJvZHkpO1xuICAgIHRoaXMuJHdpbmRvdyA9ICQod2luZG93KTtcblxuICAgIHRoaXMubW9kYWwgPSBudWxsO1xuICAgIHRoaXMuJG1vZGFsID0gJCgnW2RhdGEtbW9kYWwtY29udGFpbmVyXScpO1xuICAgIHRoaXMuJG1vZGFsSW5uZXIgPSB0aGlzLiRtb2RhbC5maW5kKCdbZGF0YS1tb2RhbC1pbm5lcl0nKTtcblxuICAgIC8vIEV4dGVuZCBkZWZhdWx0IHZhbmlsbGEtbW9kYWwgY2FsbGJhY2tzIGJhY2sgdG8gaW5zdGFudGlhdG9yIG9mIE1vZGFsXG4gICAgdGhpcy5kZWZhdWx0Q2FsbGJhY2tzID0ge1xuICAgICAgb25PcGVuOiAoKSA9PiB7fSxcbiAgICAgIG9uQ2xvc2U6ICgpID0+IHt9LFxuICAgICAgb25CZWZvcmVPcGVuOiAoKSA9PiB7fSxcbiAgICAgIG9uQmVmb3JlQ2xvc2U6ICgpID0+IHt9LFxuICAgIH07XG5cbiAgICB0aGlzLmNhbGxiYWNrcyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRDYWxsYmFja3MsIGNhbGxiYWNrcyk7XG5cbiAgICB0aGlzLl9vbk9wZW4gPSB0aGlzLl9vbk9wZW4uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkJlZm9yZU9wZW4gPSB0aGlzLl9vbkJlZm9yZU9wZW4uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vbkNsb3NlID0gdGhpcy5fb25DbG9zZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQmVmb3JlQ2xvc2UgPSB0aGlzLl9vbkJlZm9yZUNsb3NlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5wb3NpdGlvbi5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5tb2RhbE9wdGlvbnMgPSB7XG4gICAgICBsb2FkQ2xhc3M6ICcnLFxuICAgICAgY2xhc3M6ICdtb2RhbC1sb2FkZWQnLFxuICAgICAgb25PcGVuOiB0aGlzLl9vbk9wZW4sXG4gICAgICBvbkNsb3NlOiB0aGlzLl9vbkNsb3NlLFxuICAgICAgb25CZWZvcmVPcGVuOiB0aGlzLl9vbkJlZm9yZU9wZW4sXG4gICAgICBvbkJlZm9yZUNsb3NlOiB0aGlzLl9vbkJlZm9yZUNsb3NlLFxuICAgICAgdHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgaWYgKCF0aGlzLm1vZGFsIHx8ICF0aGlzLm1vZGFsLmlzT3BlbikgcmV0dXJuO1xuXG4gICAgdGhpcy5tb2RhbC5kZXN0cm95KCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiBhIG1vZGFsIHdpdGggY29udGVudHMgZnJvbSBzZWxlY3RvclxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0b3JcbiAgICogQHBhcmFtIGhhbmRsZVxuICAgKi9cbiAgb3BlbihzZWxlY3RvciwgaGFuZGxlID0gJ2dlbmVyYWwnKSB7XG4gICAgdGhpcy5fYWRkTW9kYWxDbGFzcyhoYW5kbGUpO1xuICAgIHRoaXMubW9kYWwgPSBuZXcgVmFuaWxsYU1vZGFsKHRoaXMubW9kYWxPcHRpb25zKTtcbiAgICB0aGlzLm1vZGFsLm9wZW4oc2VsZWN0b3IpO1xuICB9XG5cbiAgY2xvc2UoKSB7XG4gICAgdGhpcy5tb2RhbC5jbG9zZSgpO1xuICB9XG5cbiAgaXNPcGVuKCkge1xuICAgIHJldHVybiB0aGlzLm1vZGFsICYmIHRoaXMubW9kYWwuaXNPcGVuO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgdmVydGljYWwgcG9zaXRpb25pbmcgb2YgbW9kYWxcbiAgICovXG4gIHBvc2l0aW9uKCkge1xuICAgIGNvbnN0IHdpbmRvd0hlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDtcblxuICAgIGNvbnN0IG1vZGFsSGVpZ2h0ID0gdGhpcy4kbW9kYWxJbm5lci5vdXRlckhlaWdodCgpO1xuICAgIGNvbnN0IG1vZGFsUGFkZGluZyA9IHBhcnNlSW50KHRoaXMuJG1vZGFsLmNzcygncGFkZGluZy10b3AnKSwgMTApICogMjtcblxuICAgIGNvbnN0IG9mZnNldCA9ICh3aW5kb3dIZWlnaHQgLSBtb2RhbFBhZGRpbmcgLSBtb2RhbEhlaWdodCkgLyAyO1xuICAgIGNvbnN0IG1hcmdpblRvcCA9IG9mZnNldCA+IDAgPyBvZmZzZXQgOiAwO1xuICAgIHRoaXMuJG1vZGFsSW5uZXIuY3NzKHsgbWFyZ2luVG9wIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNsYXNzIHRvIHRoZSBtb2RhbCBmb3IgaW5kaXZpZHVhbCBzdHlsaW5nXG4gICAqIEBwYXJhbSBoYW5kbGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hZGRNb2RhbENsYXNzKGhhbmRsZSkge1xuICAgIHRoaXMuJG1vZGFsLmFkZENsYXNzKGBtb2RhbC0tJHtoYW5kbGV9YCk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG1vZGFsIGNsYXNzIGJhc2VkIG9uIHRoZSBoYW5kbGVcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9yZW1vdmVNb2RhbENsYXNzKCkge1xuICAgIGNvbnN0IG1vZGFsQ2xhc3MgPSB0aGlzLiRtb2RhbC5hdHRyKCdjbGFzcycpLm1hdGNoKC9tb2RhbC0tW1xcdy1dKlxcYi8pO1xuICAgIGlmICghbW9kYWxDbGFzcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuJG1vZGFsLnJlbW92ZUNsYXNzKG1vZGFsQ2xhc3NbMF0pO1xuICB9XG5cbiAgX29uQ2xvc2UoKSB7XG4gICAgdGhpcy5fcmVtb3ZlTW9kYWxDbGFzcygpO1xuICAgIHRoaXMuJGJvZHlcbiAgICAgIC5yZW1vdmVDbGFzcygnc2Nyb2xsLWxvY2snKVxuICAgICAgLnJlbW92ZUNsYXNzKCdtb2RhbC12aXNpYmxlJyk7XG5cbiAgICB0aGlzLiR3aW5kb3cub2ZmKCdyZXNpemUubW9kYWwnKTtcblxuICAgIHRoaXMuJG1vZGFsSW5uZXIuY3NzKHsgbWFyZ2luVG9wOiAnJyB9KTtcblxuICAgIHRoaXMuY2FsbGJhY2tzLm9uQ2xvc2UoKTtcbiAgfVxuXG4gIF9vbk9wZW4oKSB7XG4gICAgdGhpcy5wb3NpdGlvbigpO1xuICAgIHRoaXMuJGJvZHlcbiAgICAgIC5hZGRDbGFzcygnc2Nyb2xsLWxvY2snKVxuICAgICAgLmFkZENsYXNzKCdtb2RhbC12aXNpYmxlJyk7XG4gICAgdGhpcy4kd2luZG93Lm9uKCdyZXNpemUubW9kYWwnLCBkZWJvdW5jZSgoKSA9PiB0aGlzLnBvc2l0aW9uKCksIDE2LCB0cnVlLCB0cnVlKSk7XG5cbiAgICB0aGlzLmNhbGxiYWNrcy5vbk9wZW4oKTtcbiAgfVxuXG4gIF9vbkJlZm9yZUNsb3NlKCkge1xuICAgIHRoaXMuY2FsbGJhY2tzLm9uQmVmb3JlQ2xvc2UoKTtcbiAgfVxuXG4gIF9vbkJlZm9yZU9wZW4oKSB7XG4gICAgdGhpcy5jYWxsYmFja3Mub25CZWZvcmVPcGVuKCk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbi8qKlxuICogVHJhcHMgdGhlIGZvY3VzIGluIGEgcGFydGljdWxhciBjb250YWluZXJcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgdXNlZFxuICogQHBhcmFtIHtqUXVlcnl9IG9wdGlvbnMuJGNvbnRhaW5lciAtIENvbnRhaW5lciB0byB0cmFwIGZvY3VzIHdpdGhpblxuICogQHBhcmFtIHtqUXVlcnl9IG9wdGlvbnMuJGVsZW1lbnRUb0ZvY3VzIC0gRWxlbWVudCB0byBiZSBmb2N1c2VkIHdoZW4gZm9jdXMgbGVhdmVzIGNvbnRhaW5lclxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubmFtZXNwYWNlIC0gTmFtZXNwYWNlIHVzZWQgZm9yIG5ldyBmb2N1cyBldmVudCBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHRyYXBGb2N1cyhvcHRpb25zKSB7XG4gIGNvbnN0ICBldmVudE5hbWUgPSBvcHRpb25zLm5hbWVzcGFjZVxuICAgID8gYGZvY3VzaW4uJHtvcHRpb25zLm5hbWVzcGFjZX1gXG4gICAgOiAnZm9jdXNpbic7XG5cbiAgaWYgKCFvcHRpb25zLiRlbGVtZW50VG9Gb2N1cykge1xuICAgIG9wdGlvbnMuJGVsZW1lbnRUb0ZvY3VzID0gb3B0aW9ucy4kY29udGFpbmVyO1xuICB9XG5cbiAgb3B0aW9ucy4kY29udGFpbmVyLmF0dHIoJ3RhYmluZGV4JywgJy0xJyk7XG4gIG9wdGlvbnMuJGVsZW1lbnRUb0ZvY3VzLmZvY3VzKCk7XG5cbiAgJChkb2N1bWVudCkub24oZXZlbnROYW1lLCAoZXZ0KSA9PiB7XG4gICAgaWYgKG9wdGlvbnMuJGNvbnRhaW5lclswXSAhPT0gZXZ0LnRhcmdldCAmJiAhb3B0aW9ucy4kY29udGFpbmVyLmhhcyhldnQudGFyZ2V0KS5sZW5ndGgpIHtcbiAgICAgIG9wdGlvbnMuJGNvbnRhaW5lci5mb2N1cygpO1xuICAgIH1cbiAgfSk7XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIHRoZSB0cmFwIG9mIGZvY3VzIGluIGEgcGFydGljdWxhciBjb250YWluZXJcbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgdXNlZFxuICogQHBhcmFtIHtqUXVlcnl9IG9wdGlvbnMuJGNvbnRhaW5lciAtIENvbnRhaW5lciB0byB0cmFwIGZvY3VzIHdpdGhpblxuICogQHBhcmFtIHtzdHJpbmd9IG9wdGlvbnMubmFtZXNwYWNlIC0gTmFtZXNwYWNlIHVzZWQgZm9yIG5ldyBmb2N1cyBldmVudCBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZVRyYXBGb2N1cyhvcHRpb25zKSB7XG4gIGNvbnN0IGV2ZW50TmFtZSA9IG9wdGlvbnMubmFtZXNwYWNlXG4gICAgPyBgZm9jdXNpbi4ke29wdGlvbnMubmFtZXNwYWNlfWBcbiAgICA6ICdmb2N1c2luJztcblxuICBpZiAob3B0aW9ucy4kY29udGFpbmVyICYmIG9wdGlvbnMuJGNvbnRhaW5lci5sZW5ndGgpIHtcbiAgICBvcHRpb25zLiRjb250YWluZXIucmVtb3ZlQXR0cigndGFiaW5kZXgnKTtcbiAgfVxuXG4gICQoZG9jdW1lbnQpLm9mZihldmVudE5hbWUpO1xufVxuXG5leHBvcnQge1xuICB0cmFwRm9jdXMsXG4gIHJlbW92ZVRyYXBGb2N1cyxcbn07XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuXG5jbGFzcyBOb2RlIHtcbiAgY29uc3RydWN0b3IodmFyaWFudCkge1xuICAgIHRoaXMudmFyaWFudCA9IHZhcmlhbnQ7XG4gICAgdGhpcy5vcHRpb25zQ291bnQgPSB0aGlzLnZhcmlhbnQub3B0aW9ucy5sZW5ndGg7XG4gICAgdGhpcy5uZWlnaGJvcnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zQ291bnQ7IGkrKykge1xuICAgICAgdGhpcy5uZWlnaGJvcnMucHVzaChbXSk7XG4gICAgfVxuICB9XG5cbiAgYWRkTmVpZ2hib3IodmFyaWFudCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zQ291bnQ7IGkrKykge1xuICAgICAgaWYgKHRoaXMudmFyaWFudC5vcHRpb25zW2ldICE9PSB2YXJpYW50Lm9wdGlvbnNbaV0pIHtcbiAgICAgICAgdGhpcy5uZWlnaGJvcnNbaV0ucHVzaCh2YXJpYW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsaWRPcHRpb25zKCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vcHRpb25zQ291bnQ7IGkrKykge1xuICAgICAgY29uc3QgdmFyaWFudHMgPSBbdGhpcy52YXJpYW50LCAuLi50aGlzLm5laWdoYm9yc1tpXV07XG4gICAgICBvcHRpb25zW2ldID0ge307XG5cbiAgICAgIHZhcmlhbnRzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgY29uc3QgdmFyaWFudCA9IGl0ZW07XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IHZhcmlhbnQub3B0aW9uc1tpXTtcblxuICAgICAgICBvcHRpb25zW2ldW29wdGlvbl0gPSB7XG4gICAgICAgICAgYXZhaWxhYmxlOiAob3B0aW9uc1tpXVtvcHRpb25dICYmIG9wdGlvbnNbaV1bb3B0aW9uXS5hdmFpbGFibGUpIHx8IHZhcmlhbnQuYXZhaWxhYmxlLFxuICAgICAgICB9O1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9wdGlvbnM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdE9wdGlvbnMge1xuICBjb25zdHJ1Y3Rvcihwcm9kdWN0KSB7XG4gICAgdGhpcy5wcm9kdWN0SGFuZGxlID0gcHJvZHVjdC5oYW5kbGU7XG4gICAgdGhpcy5vcHRpb25zQ291bnQgPSBwcm9kdWN0Lm9wdGlvbnMubGVuZ3RoO1xuICAgIHRoaXMudmFyaWFudHMgPSBwcm9kdWN0LnZhcmlhbnRzO1xuICAgIHRoaXMubm9kZU1hcCA9IHt9O1xuXG4gICAgdGhpcy5fZ2VuZXJhdGVOb2RlTWFwKHByb2R1Y3QpO1xuICB9XG5cbiAgX2dlbmVyYXRlTm9kZU1hcCgpIHtcbiAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2goKHZhcmlhbnQpID0+IHtcbiAgICAgIHRoaXMubm9kZU1hcFt2YXJpYW50LmlkXSA9IG5ldyBOb2RlKHZhcmlhbnQpO1xuXG4gICAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2goKHZhcmlhbnQyKSA9PiB7XG4gICAgICAgIHRoaXMubm9kZU1hcFt2YXJpYW50LmlkXS5hZGROZWlnaGJvcih2YXJpYW50Mik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldFZhcmlhbnRGcm9tT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgdGhpcy52YXJpYW50cy5mb3JFYWNoKCh2YXJpYW50KSA9PiB7XG4gICAgICBsZXQgZm91bmQgPSB0cnVlO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhcmlhbnQub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAob3B0aW9uc1tpXSAhPT0gdmFyaWFudC5vcHRpb25zW2ldKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZm91bmQpIHtcbiAgICAgICAgcmV0dXJuIHZhcmlhbnQ7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBnZXRDbG9zZXN0VmFyaWFudEZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICBsZXQgY2xvc2VzdFZhcmlhbnQgPSBudWxsO1xuICAgIGxldCBtYXRjaGluZ1ZhbHVlcyA9IDA7XG5cbiAgICB0aGlzLnZhcmlhbnRzLmZvckVhY2goKHZhcmlhbnQpID0+IHtcbiAgICAgIGxldCB0ZW1wTWF0Y2hpbmdWYWx1ZXMgPSAwO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhcmlhbnQub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICBpZiAob3B0aW9uc1tpXSA9PT0gdmFyaWFudC5vcHRpb25zW2ldKSB7XG4gICAgICAgICAgdGVtcE1hdGNoaW5nVmFsdWVzKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHRlbXBNYXRjaGluZ1ZhbHVlcyA+PSBtYXRjaGluZ1ZhbHVlcykge1xuICAgICAgICBjbG9zZXN0VmFyaWFudCA9IHZhcmlhbnQ7XG4gICAgICAgIG1hdGNoaW5nVmFsdWVzID0gdGVtcE1hdGNoaW5nVmFsdWVzO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGNsb3Nlc3RWYXJpYW50ID8gY2xvc2VzdFZhcmlhbnQgOiBmYWxzZTtcbiAgfVxuXG4gIGdldFZhcmlhbnRPckNsb3Nlc3RGcm9tT3B0aW9ucyhvcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0VmFyaWFudEZyb21PcHRpb25zKG9wdGlvbnMpXG4gICAgICB8fCB0aGlzLmdldENsb3Nlc3RWYXJpYW50RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICBnZXRBdmFpbGFibGVPcHRpb25zRnJvbVZhcmlhbnQodmFyaWFudCkge1xuICAgIHJldHVybiB0aGlzLm5vZGVNYXBbdmFyaWFudC5pZF0uZ2V0VmFsaWRPcHRpb25zKCk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgUHJvZHVjdE9wdGlvbnMgZnJvbSAnLi9Qcm9kdWN0T3B0aW9ucyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZhcmlhbnRIZWxwZXIge1xuICBjb25zdHJ1Y3Rvcihwcm9kdWN0LCAkdmFyaWFudHMsICRvcHRpb25zKSB7XG4gICAgdGhpcy5wcm9kdWN0ID0gcHJvZHVjdDtcbiAgICB0aGlzLm9wdGlvbnNDb3VudCA9IHRoaXMucHJvZHVjdC5vcHRpb25zLmxlbmd0aDtcbiAgICB0aGlzLiR2YXJpYW50cyA9ICR2YXJpYW50cztcbiAgICB0aGlzLiRvcHRpb25zID0gJG9wdGlvbnM7XG4gICAgdGhpcy5wcm9kdWN0T3B0aW9ucyA9IG5ldyBQcm9kdWN0T3B0aW9ucyh0aGlzLnByb2R1Y3QpO1xuICAgIHRoaXMub3B0aW9uc1R5cGVzID0ge1xuICAgICAgc2VsZWN0OiAnc2VsZWN0JyxcbiAgICAgIHJhZGlvOiAnaW5wdXRbdHlwZT1cInJhZGlvXCJdJyxcbiAgICB9O1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuXG4gICAgaWYgKHRoaXMuJG9wdGlvbnMuaXModGhpcy5vcHRpb25zVHlwZXMuc2VsZWN0KSkge1xuICAgICAgdGhpcy5vcHRpb25zVHlwZSA9IHRoaXMub3B0aW9uc1R5cGVzLnNlbGVjdDtcbiAgICB9IGVsc2UgaWYgKHRoaXMuJG9wdGlvbnMuaXModGhpcy5vcHRpb25zVHlwZXMucmFkaW8pKSB7XG4gICAgICB0aGlzLm9wdGlvbnNUeXBlID0gdGhpcy5vcHRpb25zVHlwZXMucmFkaW87XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybignVmFyaWFudCBoZWxwZXI6IE9wdGlvbiBzZXQgaXMgbm90IGEgdmFsaWQgdHlwZScpO1xuICAgICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgdGhpcy5fc3dpdGNoVmFyaWFudCh0cnVlKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuJG9wdGlvbnMub24oJ2NoYW5nZS52YXJpYW50LWhlbHBlcicsICgpID0+IHRoaXMuX3N3aXRjaFZhcmlhbnQoKSk7XG4gIH1cblxuICBfdW5iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuJG9wdGlvbnMub2ZmKCdjaGFuZ2UudmFyaWFudC1oZWxwZXInKTtcbiAgfVxuXG4gIF9zd2l0Y2hWYXJpYW50KGZpcnN0TG9hZCA9IGZhbHNlKSB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IFtdO1xuICAgIGNvbnN0IHByb2R1Y3QgPSB0aGlzLnByb2R1Y3Q7XG4gICAgbGV0IHZhcmlhbnQgPSBudWxsO1xuICAgIGxldCBhdmFpbGFibGVPcHRpb25zID0gbnVsbDtcblxuICAgIGlmICh0aGlzLm9wdGlvbnNUeXBlID09PSB0aGlzLm9wdGlvbnNUeXBlcy5zZWxlY3QpIHtcbiAgICAgIHRoaXMuJG9wdGlvbnMuZWFjaCgoaSwgb3B0aW9uKSA9PiB7XG4gICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24udmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnNUeXBlID09PSB0aGlzLm9wdGlvbnNUeXBlcy5yYWRpbykge1xuICAgICAgdGhpcy4kb3B0aW9ucy5maWx0ZXIoJzpjaGVja2VkJykuZWFjaCgoaSwgb3B0aW9uKSA9PiB7XG4gICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24udmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXJpYW50ID0gdGhpcy5wcm9kdWN0T3B0aW9ucy5nZXRWYXJpYW50T3JDbG9zZXN0RnJvbU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICBpZiAodmFyaWFudCkge1xuICAgICAgYXZhaWxhYmxlT3B0aW9ucyA9IHRoaXMucHJvZHVjdE9wdGlvbnMuZ2V0QXZhaWxhYmxlT3B0aW9uc0Zyb21WYXJpYW50KHZhcmlhbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMub3B0aW9uc1R5cGUgPT09IHRoaXMub3B0aW9uc1R5cGVzLnNlbGVjdCkge1xuICAgICAgdGhpcy5fc3dpdGNoVmFyaWFudFNlbGVjdCh2YXJpYW50LCBhdmFpbGFibGVPcHRpb25zKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uc1R5cGUgPT09IHRoaXMub3B0aW9uc1R5cGVzLnJhZGlvKSB7XG4gICAgICB0aGlzLl9zd2l0Y2hWYXJpYW50UmFkaW8odmFyaWFudCwgYXZhaWxhYmxlT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLiR2YXJpYW50cy52YWwodmFyaWFudC5pZCk7XG4gICAgJCh3aW5kb3cpLnRyaWdnZXIoJ3Byb2R1Y3QtdmFyaWFudC1zd2l0Y2gnLCB7cHJvZHVjdCwgdmFyaWFudCwgZmlyc3RMb2FkfSk7XG4gIH1cblxuICBfc3dpdGNoVmFyaWFudFNlbGVjdCh2YXJpYW50LCBhdmFpbGFibGVPcHRpb25zKSB7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggb3B0aW9uIHR5cGVcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucHJvZHVjdC5vcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBDb3JyZXNwb25kaW5nIHNlbGVjdCBkcm9wZG93blxuICAgICAgY29uc3QgJHNlbGVjdCA9ICQodGhpcy4kb3B0aW9uc1tpXSk7XG4gICAgICBjb25zdCAkb3B0aW9uRWxzID0gJHNlbGVjdC5maW5kKCdvcHRpb24nKTtcblxuICAgICAgLy8gSXRlcmF0ZSBvdmVyIGVhY2ggb3B0aW9uIG9uIGRyb3Bkb3duXG4gICAgICAkb3B0aW9uRWxzLmVhY2goKGluZGV4LCBvcHRpb24pID0+IHtcbiAgICAgICAgY29uc3QgJG9wdGlvbiA9ICQob3B0aW9uKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBvcHRpb24udmFsdWU7XG5cbiAgICAgICAgLy8gTm90IGFuIGF2YWlsYWJsZSBvcHRpb25cbiAgICAgICAgJG9wdGlvblxuICAgICAgICAgIC5wcm9wKCdkaXNhYmxlZCcsICghYXZhaWxhYmxlT3B0aW9uc1tpXVt2YWx1ZV0gfHwgIWF2YWlsYWJsZU9wdGlvbnNbaV1bdmFsdWVdLmF2YWlsYWJsZSkpXG4gICAgICAgICAgLnByb3AoJ3NlbGVjdGVkJywgZmFsc2UpO1xuXG4gICAgICAgIC8vIERyb3Bkb3duIG9wdGlvbiBtYXRjaGVzIHZhcmlhbnQgb3B0aW9uXG4gICAgICAgIGlmICh2YXJpYW50Lm9wdGlvbnNbaV0gPT09IHZhbHVlKSB7XG4gICAgICAgICAgJG9wdGlvblxuICAgICAgICAgICAgLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpXG4gICAgICAgICAgICAucHJvcCgnc2VsZWN0ZWQnLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgX3N3aXRjaFZhcmlhbnRSYWRpbyh2YXJpYW50LCBhdmFpbGFibGVPcHRpb25zKSB7XG4gICAgdGhpcy4kb3B0aW9uc1xuICAgICAgLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSlcbiAgICAgIC5wcm9wKCdjaGVja2VkJywgZmFsc2UpXG4gICAgICAuYXR0cignZGF0YS1zb2xkb3V0JywgZmFsc2UpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnByb2R1Y3Qub3B0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgJG9wdGlvbnMgPSB0aGlzLiRvcHRpb25zLmZpbHRlcihgW25hbWU9XCIke3RoaXMucHJvZHVjdC5vcHRpb25zW2ldfVwiXWApO1xuICAgICAgJG9wdGlvbnMuZWFjaCgoaW5kZXgsIG9wdGlvbikgPT4ge1xuICAgICAgICBjb25zdCAkb3B0aW9uID0gJChvcHRpb24pO1xuXG4gICAgICAgIGlmICh2YXJpYW50Lm9wdGlvbnNbaV0gPT09ICRvcHRpb24udmFsKCkpIHtcbiAgICAgICAgICAkb3B0aW9uXG4gICAgICAgICAgICAucHJvcCgnY2hlY2tlZCcsIHRydWUpXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYXZhaWxhYmxlT3B0aW9uc1tpXVskb3B0aW9uLnZhbCgpXSkge1xuICAgICAgICAgICRvcHRpb24uYXR0cignZGlzYWJsZWQnLCBmYWxzZSk7XG5cbiAgICAgICAgICBpZiAoIWF2YWlsYWJsZU9wdGlvbnNbaV1bJG9wdGlvbi52YWwoKV0uYXZhaWxhYmxlKSB7XG4gICAgICAgICAgICAkb3B0aW9uLmF0dHIoJ2Rpc2FibGVkJywgdHJ1ZSk7XG4gICAgICAgICAgICAkb3B0aW9uLmF0dHIoJ2RhdGEtc29sZG91dCcsIHRydWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaXNEZWZhdWx0KCkge1xuICAgIGlmICh0aGlzLnByb2R1Y3QudmFyaWFudHNbMF0udGl0bGUgPT09ICdEZWZhdWx0IFRpdGxlJyAmJiB0aGlzLnByb2R1Y3QudmFyaWFudHNbMF0ub3B0aW9uMSA9PT0gJ0RlZmF1bHQgVGl0bGUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBoYXNTaW5nbGVPcHRpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMub3B0aW9uc0NvdW50ID09PSAxO1xuICB9XG5cbiAgZ2V0U2VsZWN0ZWRWYXJpYW50KCkge1xuICAgIGNvbnN0IG9wdGlvbnMgPSBbXTtcblxuICAgIGlmICh0aGlzLm9wdGlvbnNUeXBlID09PSB0aGlzLm9wdGlvbnNUeXBlcy5zZWxlY3QpIHtcbiAgICAgIHRoaXMuJG9wdGlvbnMuZWFjaCgoaSwgb3B0aW9uKSA9PiB7XG4gICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24udmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbnNUeXBlID09PSB0aGlzLm9wdGlvbnNUeXBlcy5yYWRpbykge1xuICAgICAgdGhpcy4kb3B0aW9ucy5maWx0ZXIoJzpjaGVja2VkJykuZWFjaCgoaSwgb3B0aW9uKSA9PiB7XG4gICAgICAgIG9wdGlvbnMucHVzaChvcHRpb24udmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5wcm9kdWN0T3B0aW9ucy5nZXRWYXJpYW50RnJvbU9wdGlvbnMob3B0aW9ucyk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5fdW5iaW5kRXZlbnRzKCk7XG4gIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIEltYWdlcyB7XG4gIC8qKlxuICAgKiBQcmVsb2FkcyBhbiBpbWFnZSBpbiBtZW1vcnkgYW5kIHVzZXMgdGhlIGJyb3dzZXJzIGNhY2hlIHRvIHN0b3JlIGl0IHVudGlsIG5lZWRlZC5cbiAgICpcbiAgICogQHBhcmFtIHtBcnJheX0gaW1hZ2VzIC0gQSBsaXN0IG9mIGltYWdlIHVybHNcbiAgICogQHBhcmFtIHtTdHJpbmd9IHNpemUgLSBBIHNob3BpZnkgaW1hZ2Ugc2l6ZSBhdHRyaWJ1dGVcbiAgICovXG4gIHByZWxvYWQoaW1hZ2VzLCBzaXplKSB7XG4gICAgaWYgKHR5cGVvZiBpbWFnZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICBpbWFnZXMgPSBbaW1hZ2VzXTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltYWdlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5sb2FkSW1hZ2UodGhpcy5nZXRTaXplZEltYWdlVXJsKGltYWdlc1tpXSwgc2l6ZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyBhbmQgY2FjaGVzIGFuIGltYWdlIGluIHRoZSBicm93c2VycyBjYWNoZS5cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggLSBBbiBpbWFnZSB1cmxcbiAgICovXG4gIGxvYWRJbWFnZShwYXRoKSB7XG4gICAgcmV0dXJuIG5ldyBJbWFnZSgpLnNyYyA9IHBhdGg7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIFNob3BpZnkgc2l6ZSBhdHRyaWJ1dGUgdG8gYSBVUkxcbiAgICpcbiAgICogQHBhcmFtIHNyY1xuICAgKiBAcGFyYW0gc2l6ZVxuICAgKiBAcmV0dXJucyB7Kn1cbiAgICovXG4gIGdldFNpemVkSW1hZ2VVcmwoc3JjID0gbnVsbCwgc2l6ZSkge1xuICAgIGlmICghc2l6ZSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHNpemUgPT09ICdtYXN0ZXInKSB7XG4gICAgICByZXR1cm4gdGhpcy5yZW1vdmVQcm90b2NvbChzcmMpO1xuICAgIH1cblxuICAgIGNvbnN0IG1hdGNoID0gc3JjLm1hdGNoKC9cXC4oanBnfGpwZWd8Z2lmfHBuZ3xibXB8Yml0bWFwfHRpZmZ8dGlmKShcXD92PVxcZCspPyQvaSk7XG5cbiAgICBpZiAobWF0Y2gpIHtcbiAgICAgIGNvbnN0IHByZWZpeCA9IHNyYy5zcGxpdChtYXRjaFswXSk7XG4gICAgICBjb25zdCBzdWZmaXggPSBtYXRjaFswXTtcblxuICAgICAgcmV0dXJuIHRoaXMucmVtb3ZlUHJvdG9jb2woYCR7cHJlZml4WzBdfV8ke3NpemV9JHtzdWZmaXh9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnNvbGUud2FybihgTm8gJHtzaXplfSBmb3VuZCBmb3IgJyR7c3JjfWApO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgcmVtb3ZlUHJvdG9jb2wocGF0aCkge1xuICAgIHJldHVybiBwYXRoLnJlcGxhY2UoL2h0dHAocyk/Oi8sICcnKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdqdXN0LWRlYm91bmNlJztcbmltcG9ydCBDdXJyZW5jeUNvbnZlcnRlciBmcm9tICdzaG9waWZ5LWN1cnJlbmN5LWNvbnZlcnRlcic7XG5cbmltcG9ydCBNZXNzYWdlQmFubmVyIGZyb20gJy4vTWVzc2FnZUJhbm5lcic7XG5pbXBvcnQgZ2V0SGVhZGVyT2Zmc2V0IGZyb20gJy4uL2hlbHBlcnMvZ2V0SGVhZGVyT2Zmc2V0JztcbmltcG9ydCBJbWFnZXMgZnJvbSAnLi4vaGVscGVycy9JbWFnZXMnO1xuXG5jbGFzcyBBZGRUb0NhcnRGbHlvdXQge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmZvcm1EYXRhID0ge307XG4gICAgdGhpcy5zZXR0aW5ncyA9IHt9O1xuICAgIHRoaXMuZXZlbnRzID0gW107XG4gICAgdGhpcy5JbWFnZXMgPSBuZXcgSW1hZ2VzKCk7XG4gICAgdGhpcy5mbHlPdXRTZWxlY3RvciA9ICdbZGF0YS1hdGMtYmFubmVyXSc7XG4gICAgdGhpcy4kYXRjVGVtcGxhdGUgPSAkKGBbZGF0YS10ZW1wbGF0ZXNdICR7dGhpcy5mbHlPdXRTZWxlY3Rvcn1gKTtcblxuICAgIHRoaXMuX29uSW5pdCA9IHRoaXMuX29uSW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uT3BlbiA9IHRoaXMuX29uT3Blbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQ2xvc2UgPSB0aGlzLl9vbkNsb3NlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25FcnJvciA9IHRoaXMuX29uRXJyb3IuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9vblN1Y2Nlc3MgPSB0aGlzLl9vblN1Y2Nlc3MuYmluZCh0aGlzKTtcbiAgICB0aGlzLl9oYW5kbGVEb2N1bWVudENsaWNrID0gdGhpcy5faGFuZGxlRG9jdW1lbnRDbGljay5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5tZXNzYWdlQmFubmVyID0gbmV3IE1lc3NhZ2VCYW5uZXIoKTtcblxuICAgIHRoaXMuaGVhZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnNpdGUtaGVhZGVyLXdyYXBwZXInKTtcbiAgICB0aGlzLiRoZWFkZXIgPSAkKHRoaXMuaGVhZGVyKTtcbiAgICB0aGlzLiRib2R5ID0gJChkb2N1bWVudC5ib2R5KTtcbiAgfVxuXG4gIGluaXQoZm9ybURhdGEsIG9wdGlvbnMsIGNhbGxiYWNrcyA9IHt9KSB7XG4gICAgLy8gSWYgYW55IEZseU91dHMgYXJlIGZ1bGx5IG9wZW4sIGNsb3NlIHRoZW1cbiAgICB0aGlzLl9jbG9zZUZseU91dHMoKTtcblxuICAgIHRoaXMuZm9ybURhdGEgPSBmb3JtRGF0YTtcblxuICAgIC8vIEFsbG93cyBBVEMgRmxvdyB0byBiZSBvdmVycmlkZGVuXG4gICAgdGhpcy5jYWxsYmFja3MgPSAkLmV4dGVuZCh7XG4gICAgICBvbkluaXQ6IHRoaXMuX29uSW5pdCxcbiAgICAgIG9uQ2xvc2U6IHRoaXMuX29uQ2xvc2UsXG4gICAgICBvbkVycm9yOiB0aGlzLl9vbkVycm9yLFxuICAgICAgb25PcGVuOiB0aGlzLl9vbk9wZW4sXG4gICAgICBvblN1Y2Nlc3M6IHRoaXMuX29uU3VjY2VzcyxcbiAgICB9LCBjYWxsYmFja3MpO1xuXG4gICAgY29uc3QgJGF0Y0J1dHRvbiA9IG9wdGlvbnMuJGF0Y0J1dHRvbjtcblxuICAgIHRoaXMuc2V0dGluZ3MgPSAkLmV4dGVuZCh7XG4gICAgICBtb25leUZvcm1hdDogbnVsbFxuICAgIH0sIG9wdGlvbnMuc2V0dGluZ3MpO1xuXG4gICAgdGhpcy5jYWxsYmFja3Mub25Jbml0KCk7XG5cbiAgICB0aGlzLl91cGRhdGVDYXJ0KCRhdGNCdXR0b24pO1xuICAgIHRoaXMuX2Rpc2FibGVCdXR0b24oJGF0Y0J1dHRvbik7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy5tZXNzYWdlQmFubmVyLmRpc21pc3NCYW5uZXJzKCk7XG4gICAgdGhpcy5fcmVtb3ZlRmx5T3V0cygpO1xuICAgIGRlbGV0ZSB0aGlzLkltYWdlcztcbiAgfVxuXG4gIF91cGRhdGVDYXJ0KCRhdGNCdXR0b24pIHtcbiAgICBjb25zdCAkZmx5T3V0ID0gdGhpcy4kYXRjVGVtcGxhdGUuY2xvbmUoKTtcblxuICAgIGNvbnN0IHF1YW50aXR5RmllbGQgPSB0aGlzLmZvcm1EYXRhLmZpbHRlcihkYXRhID0+IHsgcmV0dXJuIGRhdGEubmFtZSA9PT0gJ3F1YW50aXR5JzsgfSk7XG4gICAgY29uc3QgcXVhbnRpdHkgPSBxdWFudGl0eUZpZWxkWzBdLnZhbHVlO1xuXG4gICAgJC5hamF4KHtcbiAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgIHVybDogJy9jYXJ0L2FkZC5qcycsXG4gICAgICBkYXRhOiAkLnBhcmFtKHRoaXMuZm9ybURhdGEpLFxuICAgICAgZGF0YVR5cGU6ICdqc29uJyxcbiAgICB9KVxuICAgIC5kb25lKChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKHJlc3BvbnNlLmltYWdlKSB7XG4gICAgICAgIGNvbnN0IGltYWdlVXJsID0gdGhpcy5JbWFnZXMuZ2V0U2l6ZWRJbWFnZVVybChyZXNwb25zZS5pbWFnZSwgJzIwMHgnKTtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLkltYWdlcy5sb2FkSW1hZ2UoaW1hZ2VVcmwpO1xuXG4gICAgICAgICRmbHlPdXQuZmluZCgnW2RhdGEtYXRjLWJhbm5lci1wcm9kdWN0LWltYWdlXScpXG4gICAgICAgICAgLmh0bWwoYDxpbWcgc3JjPVwiJHtpbWFnZX1cIiBhbHQ9XCIke3Jlc3BvbnNlLnByb2R1Y3RfdGl0bGV9XCI+YCk7XG4gICAgICB9XG5cbiAgICAgICRmbHlPdXQuZmluZCgnW2RhdGEtYXRjLWJhbm5lci1wcm9kdWN0LXRpdGxlXScpXG4gICAgICAgIC50ZXh0KGAke3Jlc3BvbnNlLnByb2R1Y3RfdGl0bGV9IMOXICR7cXVhbnRpdHl9YCk7XG5cbiAgICAgIC8qXG4gICAgICAgIFRPRE86IEJyaW5nIGluIGB2YXJpYW50Lm9wdGlvbnNgLCBpdGVyYXRlIHRocm91Z2ggdG8gZ2V0IG9wdGlvblxuICAgICAgICAgIG5hbWUgZm9yOiA8c3Ryb25nPk9wdGlvbiBuYW1lOjwvc3Ryb25nPiBPcHRpb25cbiAgICAgICAqL1xuICAgICAgaWYgKHJlc3BvbnNlLnZhcmlhbnRfb3B0aW9uc1swXSAhPT0gJ1RpdGxlJyAmJiByZXNwb25zZS52YXJpYW50X29wdGlvbnNbMF0gIT09ICdEZWZhdWx0IFRpdGxlJykge1xuICAgICAgICAkZmx5T3V0LmZpbmQoJ1tkYXRhLWF0Yy1iYW5uZXItcHJvZHVjdC1vcHRpb25zXScpXG4gICAgICAgICAgLnRleHQocmVzcG9uc2UudmFyaWFudF9vcHRpb25zLmpvaW4oJywgJykpO1xuICAgICAgfVxuXG4gICAgICAvKlxuICAgICAgICBUT0RPOiBCcmluZyBpbiB2YXJpYW50LCBhbmQgdXNlIHRoYXQgdG8gY2hlY2sgY29tcGFyZV9hdF9wcmljZVxuICAgICAgICAgIHRvIHNlZSBpZiB0aGUgaXRlbSBpcyBvbiBzYWxlXG4gICAgICAgKi9cbiAgICAgIGNvbnN0ICRwcm9kdWN0UHJpY2UgPSAkZmx5T3V0LmZpbmQoJ1tkYXRhLWF0Yy1iYW5uZXItcHJvZHVjdC1wcmljZV0nKTtcbiAgICAgICRwcm9kdWN0UHJpY2UudGV4dChTaG9waWZ5LmZvcm1hdE1vbmV5KHJlc3BvbnNlLnByaWNlLCB0aGlzLnNldHRpbmdzLm1vbmV5Rm9ybWF0KSk7XG5cbiAgICAgIC8vIFVwZGF0ZSBwcmljZSB0byBsb2NhbCBjdXJyZW5jeVxuICAgICAgQ3VycmVuY3lDb252ZXJ0ZXIudXBkYXRlKCRwcm9kdWN0UHJpY2VbMF0pO1xuXG4gICAgICAkLmFqYXgoe1xuICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgdXJsOiAnL2NhcnQuanMnLFxuICAgICAgICBkYXRhVHlwZTogJ2pzb24nLFxuICAgICAgfSlcbiAgICAgIC5kb25lKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLmNhbGxiYWNrcy5vblN1Y2Nlc3MoKTtcblxuICAgICAgICAvLyBSZXNldCBmb3JtRGF0YSBpbiBjYXNlIGluc3RhbmNlIGlzIG5ldmVyIGNsZWFyZWRcbiAgICAgICAgdGhpcy5mb3JtRGF0YSA9IHt9O1xuXG4gICAgICAgIGNvbnN0ICRzdWJUb3RhbCA9ICRmbHlPdXQuZmluZCgnW2RhdGEtYXRjLWJhbm5lci1jYXJ0LXN1YnRvdGFsXScpO1xuICAgICAgICAkc3ViVG90YWwudGV4dChTaG9waWZ5LmZvcm1hdE1vbmV5KHJlc3BvbnNlLm9yaWdpbmFsX3RvdGFsX3ByaWNlLCB0aGlzLnNldHRpbmdzLm1vbmV5Rm9ybWF0KSk7XG4gICAgICAgIEN1cnJlbmN5Q29udmVydGVyLnVwZGF0ZSgkc3ViVG90YWxbMF0pO1xuXG4gICAgICAgICRmbHlPdXRcbiAgICAgICAgICAuZmluZCgnW2RhdGEtYXRjLWJhbm5lci1jYXJ0LWJ1dHRvbl0nKVxuICAgICAgICAgIC5maW5kKCdzcGFuJykudGV4dChyZXNwb25zZS5pdGVtX2NvdW50KTtcblxuICAgICAgICB0aGlzLiRib2R5LmFwcGVuZCgkZmx5T3V0KTtcblxuICAgICAgICAvLyBOb3RpZml5IEhlYWRlciBvZiBuZXcgY2FydCBjb3VudFxuICAgICAgICB0aGlzLiRoZWFkZXIudHJpZ2dlcignY2FydGNvdW50OnVwZGF0ZScsIHsgcmVzcG9uc2UgfSk7XG5cbiAgICAgICAgdGhpcy5fcG9zaXRpb25GbHlPdXQoJGZseU91dCk7XG4gICAgICAgIHRoaXMuX2JpbmRFdmVudHMoJGZseU91dCk7XG4gICAgICAgIHRoaXMuX29wZW5GbHlPdXQoJGZseU91dCwgJGF0Y0J1dHRvbik7XG4gICAgICB9KTtcbiAgICB9KVxuICAgIC5mYWlsKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VUZXh0ID0gSlNPTi5wYXJzZShyZXNwb25zZS5yZXNwb25zZVRleHQpO1xuICAgICAgY29uc3QgZXJyb3IgPSByZXNwb25zZVRleHQuZGVzY3JpcHRpb247XG5cbiAgICAgIHRoaXMuX2VuYWJsZUJ1dHRvbigkYXRjQnV0dG9uKTtcbiAgICAgIHRoaXMuY2FsbGJhY2tzLm9uRXJyb3IoZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgX29uRXJyb3IoZXJyb3IpIHtcbiAgICB0aGlzLm1lc3NhZ2VCYW5uZXIubWVzc2FnZShlcnJvciwgJ2Vycm9yJyk7XG4gIH1cblxuICBfb25Jbml0KCkge1xuICAgIHRoaXMubWVzc2FnZUJhbm5lci5kaXNtaXNzQmFubmVycygpO1xuICB9XG5cbiAgX29uT3BlbigpIHtcbiAgICAvKlxuICAgICAgVGhlIGB0aGlzLmNhbGxiYWNrcy5vbk9wZW5gIGlzIHVzZWQgcHVsbCBrZXlib2FyZCBmb2N1cyBpbnRvIHRoZSBhY3RpdmUgZmx5b3V0XG4gICAgICovXG4gICAgY29uc29sZS53YXJuKCdBZGRUb0NhcnRGbHlvdXQgb25PcGVuIGNhbGxiYWNrIG5vdCBzcGVjaWZpZWQnKTtcbiAgfVxuXG4gIF9vbkNsb3NlKCkge1xuICAgIC8qXG4gICAgICBUaGUgYHRoaXMuY2FsbGJhY2tzLm9uQ2xvc2VgIGlzIHVzZWQgdG8gcmV0dXJuIGZvY3VzIHRvIG9yaWdpbmF0aW5nIERPTVxuICAgICAqL1xuXG4gICAgY29uc29sZS53YXJuKCdBZGRUb0NhcnRGbHlvdXQgb25DbG9zZSBjYWxsYmFjayBub3Qgc3BlY2lmaWVkJyk7XG4gIH1cblxuICBfb25TdWNjZXNzKCkge1xuICAgIC8qXG4gICAgICBCeSBkZWZhdWx0LCB0aGUgQVRDIEZseW91dCBkb2Vzbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgc3VjY2VzcyBjYWxsYmFja3NcblxuICAgICAgVGhlIGB0aGlzLmNhbGxiYWNrcy5vblN1Y2Nlc3NgIGlzIHVzZWQgdG8gYWxsb3cgb3RoZXIgdmlld3MgdG8gaW5pdGlhdGVcbiAgICAgIGJlaGF2aW91ciB3aGVuIGEgcHJvZHVjdCBoYXMgYmVlbiBhZGRlZCB0byB0aGUgY2FydFxuICAgICAqL1xuICB9XG5cbiAgX2JpbmRFdmVudHMoJGZseU91dCkge1xuICAgIHRoaXMuZXZlbnRzLnB1c2goW1xuICAgICAgJGZseU91dC5vbignY2xpY2suYXRjLWJhbm5lcicsICdbZGF0YS1hdGMtYmFubmVyLWNsb3NlXScsIChldmVudCkgPT4ge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLl9jbG9zZUZseU91dCgkZmx5T3V0KTtcbiAgICAgIH0pLFxuICAgICAgdGhpcy4kYm9keS5vbigncG9zaXRpb24tYmFubmVycy5hdGMtYmFubmVyJywgKCkgPT4ge1xuICAgICAgICB0aGlzLl9wb3NpdGlvbkZseU91dCgkZmx5T3V0KTtcbiAgICAgIH0pLFxuICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUuYXRjLWJhbm5lcicsICgpID0+IHtcbiAgICAgICAgZGVib3VuY2UodGhpcy5fcG9zaXRpb25GbHlPdXQoJGZseU91dCksIDI1MCk7XG4gICAgICB9KSxcbiAgICAgICQod2luZG93KS5vbignc2Nyb2xsLmF0Yy1iYW5uZXInLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuX3Bvc2l0aW9uRmx5T3V0KCRmbHlPdXQpO1xuICAgICAgfSksXG4gICAgICAkKGRvY3VtZW50KS5vbigndG91Y2hzdGFydC5hdGMtYmFubmVyLCBjbGljay5hdGMtYmFubmVyJywgdGhpcy5faGFuZGxlRG9jdW1lbnRDbGljayksXG4gICAgXSk7XG4gIH1cblxuICAvKipcbiAgICogVHJpZ2dlciBhbnkgZXhpc3Rpbmcgb3BlbiBGbHlPdXRzIHRvIGNsb3NlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfY2xvc2VGbHlPdXRzKCRleGNsdWRlRmx5T3V0ID0gbnVsbCkge1xuICAgICQodGhpcy5mbHlPdXRTZWxlY3RvcikuZmlsdGVyKCdbZGF0YS1mbHlvdXQtYWN0aXZlXScpLmVhY2goKGluZGV4LCBlbCkgPT4ge1xuICAgICAgY29uc3QgJGZseU91dCA9ICQoZWwpO1xuXG4gICAgICBpZiAoJGV4Y2x1ZGVGbHlPdXQgJiYgJGZseU91dC5pcygkZXhjbHVkZUZseU91dCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICB0aGlzLl9jbG9zZUZseU91dCgkZmx5T3V0LCBpbmRleCk7XG4gICAgfSk7XG4gIH1cblxuICBfb3BlbkZseU91dCgkZmx5T3V0LCAkYXRjQnV0dG9uKSB7XG4gICAgLypcbiAgICAgSWYgdXNlciBoYXMgaW5pdGlhdGVkIGEgbmV3IEFUQyBGbG93IGJlZm9yZSB0aGUgZmlyc3QgaGFzIGZpbmlzaGVkLFxuICAgICB0aGUgZmlyc3QgRmx5T3V0IGNvdWxkIGhhdmUgb3BlbmVkIGFmdGVyIHRoZSBmaXJzdCBhdHRlbXB0IHRvIGNsb3NlIG9wZW4gZmx5b3V0c1xuICAgICovXG4gICAgdGhpcy5fY2xvc2VGbHlPdXRzKCRmbHlPdXQpO1xuXG4gICAgJGZseU91dFxuICAgICAgLmFkZENsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLWluJylcbiAgICAgIC5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICAkZmx5T3V0XG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLWluJylcbiAgICAgICAgICAuYWRkQ2xhc3MoJ3Zpc2libGUnKVxuICAgICAgICAgIC5vZmYoJ3RyZW5kJyk7XG5cbiAgICAgICAgJGZseU91dC5hdHRyKCdkYXRhLWZseW91dC1hY3RpdmUnLCB0cnVlKTtcbiAgICAgICAgdGhpcy5jYWxsYmFja3Mub25PcGVuKHtcbiAgICAgICAgICAkY29udGFpbmVyOiAkZmx5T3V0LFxuICAgICAgICAgICRlbGVtZW50VG9Gb2N1czogJGZseU91dC5maW5kKCdbZGF0YS1hdGMtYmFubmVyLWNhcnQtYnV0dG9uXScpXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX2VuYWJsZUJ1dHRvbigkYXRjQnV0dG9uKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENsb3NlIGFuIG9wZW4gRmx5T3V0XG4gICAqXG4gICAqIEBwYXJhbSAkZmx5T3V0XG4gICAqIEBwYXJhbSBpbmRleFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2Nsb3NlRmx5T3V0KCRmbHlPdXQgPSBudWxsLCBpbmRleCA9IDApIHtcbiAgICBpZiAoISRmbHlPdXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAkZmx5T3V0XG4gICAgICAuYWRkQ2xhc3MoJ2FuaW1hdGluZyBhbmltYXRpbmctb3V0JylcbiAgICAgIC5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICAkZmx5T3V0XG4gICAgICAgICAgLnJlbW92ZUNsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLW91dCB2aXNpYmxlJylcbiAgICAgICAgICAub25lKCd0cmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICRmbHlPdXQub2ZmKCd0cmVuZCcpO1xuICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRmx5T3V0KCRmbHlPdXQsIGluZGV4KTtcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLm9uQ2xvc2UoKTtcbiAgICAgICAgICB9KTtcbiAgICAgIH0pO1xuICB9XG5cbiAgX3JlbW92ZUZseU91dHMoKSB7XG4gICAgJCh0aGlzLmZseU91dFNlbGVjdG9yKS5maWx0ZXIoJ1tkYXRhLWZseW91dC1hY3RpdmVdJykuZWFjaCgoaW5kZXgsIGVsKSA9PiB7XG4gICAgICB0aGlzLl9yZW1vdmVGbHlPdXQoJChlbCksIGluZGV4KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIEZseW91dCBmcm9tIHRoZSBET00sIGFuZCBjbGVhbiB1cCBsaXN0ZW5lcnNcbiAgICpcbiAgICogQHBhcmFtICRmbHlPdXRcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcmVtb3ZlRmx5T3V0KCRmbHlPdXQsIGluZGV4KSB7XG4gICAgaWYgKHRoaXMuZXZlbnRzW2luZGV4XSkge1xuICAgICAgdGhpcy5ldmVudHNbaW5kZXhdLmZvckVhY2goJGVsID0+ICRlbC5vZmYoJy5hdGMtYmFubmVyJykpO1xuICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBpZiAoJGZseU91dCkge1xuICAgICAgJGZseU91dC5yZW1vdmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUG9zaXRpb24gRmx5T3V0IGJlbmVhdGggaGVhZGVyIGlmIGl0cyBpbiB2aWV3cG9ydCwgb3IgYXQgdG9wIG9mIHZpZXdwb3J0XG4gICAqXG4gICAqIEBwYXJhbSAkZmx5T3V0XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfcG9zaXRpb25GbHlPdXQoJGZseU91dCkge1xuICAgICRmbHlPdXQuY3NzKHsgdG9wOiBnZXRIZWFkZXJPZmZzZXQodGhpcy5oZWFkZXIsIHRydWUpIH0pO1xuICB9XG5cbiAgX2Rpc2FibGVCdXR0b24oJGF0Y0J1dHRvbikge1xuICAgICRhdGNCdXR0b25cbiAgICAgIC5hZGRDbGFzcygncHJvY2Vzc2luZycpXG4gICAgICAucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgfVxuXG4gIF9lbmFibGVCdXR0b24oJGF0Y0J1dHRvbikge1xuICAgICRhdGNCdXR0b25cbiAgICAgIC5wcm9wKCdkaXNhYmxlZCcsIGZhbHNlKVxuICAgICAgLnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7XG4gIH1cblxuICBfaGFuZGxlRG9jdW1lbnRDbGljayhldmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCAkcGFyZW50ID0gJCh0YXJnZXQpLnBhcmVudHMoJ1tkYXRhLWF0Yy1iYW5uZXJdJyk7XG5cbiAgICBpZiAoJHBhcmVudC5sZW5ndGgpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9jbG9zZUZseU91dHMoKTtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBuZXcgQWRkVG9DYXJ0Rmx5b3V0KCk7XG4iLCJpbXBvcnQgJHNjcmlwdCBmcm9tICdzY3JpcHRqcyc7XG5cbmNvbnN0IGFwaSA9ICdodHRwczovL3d3dy55b3V0dWJlLmNvbS9pZnJhbWVfYXBpJztcbmxldCBhcGlMb2FkZWRDYWxsYmFja3MgPSBbXTtcbmxldCBhcGlMb2FkZWQgPSBmYWxzZTtcblxud2luZG93Lm9uWW91VHViZUlmcmFtZUFQSVJlYWR5ID0gKCkgPT4ge1xuICBhcGlMb2FkZWRDYWxsYmFja3MuZm9yRWFjaChhcGlMb2FkZWRDYWxsYmFjayA9PiBhcGlMb2FkZWRDYWxsYmFjaygpKTtcbiAgYXBpTG9hZGVkQ2FsbGJhY2tzID0gW107XG4gIGFwaUxvYWRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBZb3V0dWJlIHtcbiAgY29uc3RydWN0b3IoZWwpIHtcbiAgICBjb25zdCB1cmwgPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8tdXJsJyk7XG4gICAgY29uc3QgcmVnZXggPSAvKD86eW91dHViZVxcLmNvbVxcLyg/OlteXFwvXStcXC8uK1xcL3woPzp2fGUoPzptYmVkKT8pXFwvfC4qWz8mXXY9KXx5b3V0dVxcLmJlXFwvKShbXlwiJj9cXC8gXXsxMX0pL2k7XG5cbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5pZCA9IHVybC5tYXRjaChyZWdleClbMV0gfHwgbnVsbDtcblxuICAgIHRoaXMub25BcGlMb2FkZWQgPSB0aGlzLl9vbkFwaUxvYWRlZC5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5pc1JlYWR5ID0gZmFsc2U7XG4gICAgdGhpcy5vblJlYWR5ID0gdGhpcy5fb25SZWFkeS5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gbnVsbDtcblxuICAgIHRoaXMub25TdGF0ZUNoYW5nZSA9IHRoaXMuX29uU3RhdGVDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICB0aGlzLm9uUGxheUNhbGxiYWNrID0gbnVsbDtcblxuICAgIGlmIChhcGlMb2FkZWQpIHtcbiAgICAgIHRoaXMuX29uQXBpTG9hZGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFwaUxvYWRlZENhbGxiYWNrcy5wdXNoKHRoaXMub25BcGlMb2FkZWQpO1xuICAgICAgJHNjcmlwdChhcGkpO1xuICAgIH1cbiAgfVxuXG4gIHBsYXkoKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICB0aGlzLm9uUGxheUNhbGxiYWNrID0gcmVzb2x2ZTtcblxuICAgICAgaWYgKHRoaXMuaXNSZWFkeSkge1xuICAgICAgICB0aGlzLnBsYXllci5wbGF5VmlkZW8oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gKCkgPT4geyB0aGlzLnBsYXllci5wbGF5VmlkZW8oKTsgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHBhdXNlKCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5vblBsYXlDYWxsYmFjayA9IHJlc29sdmU7XG5cbiAgICAgIGlmICh0aGlzLmlzUmVhZHkpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucGF1c2VWaWRlbygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vblJlYWR5Q2FsbGJhY2sgPSAoKSA9PiB7IHRoaXMucGxheWVyLnBhdXNlVmlkZW8oKTsgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGF1dG9wbGF5KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5vblBsYXlDYWxsYmFjayA9IHJlc29sdmU7XG5cbiAgICAgIGlmICh0aGlzLmlzUmVhZHkpIHtcbiAgICAgICAgdGhpcy5wbGF5ZXIucGxheVZpZGVvKCk7XG4gICAgICAgIHRoaXMucGxheWVyLm11dGUoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGxheWVyLnBsYXlWaWRlbygpO1xuICAgICAgICAgIHRoaXMucGxheWVyLm11dGUoKTtcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLnBsYXllci5kZXN0cm95KCk7XG4gIH1cblxuICBfb25BcGlMb2FkZWQoKSB7XG4gICAgdGhpcy5wbGF5ZXIgPSBuZXcgWVQuUGxheWVyKHRoaXMuZWwsIHtcbiAgICAgIHZpZGVvSWQ6IHRoaXMuaWQsXG4gICAgICBwbGF5ZXJWYXJzOiB7XG4gICAgICAgIG1vZGVzdGJyYW5kaW5nOiB0cnVlLFxuICAgICAgICBzaG93aW5mbzogZmFsc2UsXG4gICAgICAgIGNvbnRyb2xzOiBmYWxzZSxcbiAgICAgICAgcmVsOiAwLFxuICAgICAgfSxcbiAgICAgIGV2ZW50czoge1xuICAgICAgICBvblJlYWR5OiB0aGlzLm9uUmVhZHksXG4gICAgICAgIG9uU3RhdGVDaGFuZ2U6IHRoaXMub25TdGF0ZUNoYW5nZSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBfb25SZWFkeSgpIHtcbiAgICB0aGlzLmlzUmVhZHkgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uUmVhZHlDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIF9vblN0YXRlQ2hhbmdlKGV2ZW50KSB7XG4gICAgY29uc3Qgc3RhdGUgPSBldmVudC5kYXRhO1xuXG4gICAgaWYgKFxuICAgICAgdGhpcy5vblBsYXlDYWxsYmFja1xuICAgICAgJiYgc3RhdGUgPT09IFlULlBsYXllclN0YXRlLlBMQVlJTkdcbiAgICApIHtcbiAgICAgIHRoaXMub25QbGF5Q2FsbGJhY2soKTtcbiAgICAgIHRoaXMub25QbGF5Q2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuXG5jb25zdCBhcGkgPSAnaHR0cHM6Ly9wbGF5ZXIudmltZW8uY29tL2FwaS9wbGF5ZXIuanMnO1xubGV0IGFwaUxvYWRlZCA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaW1lb1BsYXllciB7XG4gIGNvbnN0cnVjdG9yKGVsKSB7XG4gICAgY29uc3QgdXJsID0gZWwuZ2V0QXR0cmlidXRlKCdkYXRhLXZpZGVvLXVybCcpO1xuICAgIGNvbnN0IHVybFBhcnRzID0gdXJsLnNwbGl0KCcvJyk7XG5cbiAgICB0aGlzLmVsID0gZWw7XG4gICAgdGhpcy5pZCA9IHVybFBhcnRzW3VybFBhcnRzLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gbnVsbDtcblxuICAgIHRoaXMub25BcGlMb2FkZWQgPSB0aGlzLl9vbkFwaUxvYWRlZC5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5vblByb2dyZXNzID0gdGhpcy5fb25Qcm9ncmVzcy5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25Qcm9ncmVzc0NhbGxiYWNrID0gbnVsbDtcblxuICAgIGlmIChhcGlMb2FkZWQpIHtcbiAgICAgIHRoaXMuX29uQXBpTG9hZGVkKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICRzY3JpcHQoYXBpLCB0aGlzLm9uQXBpTG9hZGVkKTtcbiAgICB9XG4gIH1cblxuICBwbGF5KCkge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgdGhpcy5vblByb2dyZXNzQ2FsbGJhY2sgPSByZXNvbHZlO1xuXG4gICAgICBpZiAoYXBpTG9hZGVkKSB7XG4gICAgICAgIHRoaXMucGxheWVyLm9uKCdwcm9ncmVzcycsIHRoaXMub25Qcm9ncmVzcyk7XG4gICAgICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGxheWVyLm9uKCdwcm9ncmVzcycsIHRoaXMub25Qcm9ncmVzcyk7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIucGxheSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwYXVzZSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMub25Qcm9ncmVzc0NhbGxiYWNrID0gcmVzb2x2ZTtcblxuICAgICAgaWYgKGFwaUxvYWRlZCkge1xuICAgICAgICB0aGlzLnBsYXllci5vbigncHJvZ3Jlc3MnLCB0aGlzLm9uUHJvZ3Jlc3MpO1xuICAgICAgICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5vblJlYWR5Q2FsbGJhY2sgPSAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIub24oJ3Byb2dyZXNzJywgdGhpcy5vblByb2dyZXNzKTtcbiAgICAgICAgICB0aGlzLnBsYXllci5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhdXRvcGxheSgpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgIHRoaXMub25Qcm9ncmVzc0NhbGxiYWNrID0gcmVzb2x2ZTtcblxuICAgICAgaWYgKGFwaUxvYWRlZCkge1xuICAgICAgICB0aGlzLnBsYXllci5vbigncHJvZ3Jlc3MnLCB0aGlzLm9uUHJvZ3Jlc3MpO1xuICAgICAgICB0aGlzLnBsYXllci5zZXRWb2x1bWUoMCk7XG4gICAgICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25SZWFkeUNhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAgIHRoaXMucGxheWVyLm9uKCdwcm9ncmVzcycsIHRoaXMub25Qcm9ncmVzcyk7XG4gICAgICAgICAgdGhpcy5wbGF5ZXIuc2V0Vm9sdW1lKDApO1xuICAgICAgICAgIHRoaXMucGxheWVyLnBsYXkoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgdW5sb2FkKCkge1xuICAgIHRoaXMucGxheWVyXG4gICAgICAudW5sb2FkKClcbiAgICAgIC5jYXRjaCgpO1xuICB9XG5cbiAgX29uQXBpTG9hZGVkKCkge1xuICAgIHRoaXMucGxheWVyID0gbmV3IHdpbmRvdy5WaW1lby5QbGF5ZXIodGhpcy5lbCwgeyBpZDogdGhpcy5pZCB9KTtcblxuICAgIHRoaXMucGxheWVyXG4gICAgICAucmVhZHkoKVxuICAgICAgLnRoZW4oKVxuICAgICAgLmNhdGNoKCk7XG5cbiAgICBhcGlMb2FkZWQgPSB0cnVlO1xuXG4gICAgaWYgKHRoaXMub25SZWFkeUNhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uUmVhZHlDYWxsYmFjaygpO1xuICAgIH1cbiAgfVxuXG4gIF9vblByb2dyZXNzKCkge1xuICAgIHRoaXMucGxheWVyLm9mZigncHJvZ3Jlc3MnLCB0aGlzLm9uUHJvZ3Jlc3MpO1xuXG4gICAgaWYgKHRoaXMub25Qcm9ncmVzc0NhbGxiYWNrKSB7XG4gICAgICB0aGlzLm9uUHJvZ3Jlc3NDYWxsYmFjaygpO1xuICAgICAgdGhpcy5vblByb2dyZXNzQ2FsbGJhY2sgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IFlvdXR1YmUgZnJvbSAnLi9Zb3V0dWJlJztcbmltcG9ydCBWaW1lbyBmcm9tICcuL1ZpbWVvJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlkZW8ge1xuICBjb25zdHJ1Y3RvcihlbCwgb3B0aW9ucykge1xuICAgIHRoaXMuZWwgPSBlbDtcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucGxhdGZvcm0gPSBlbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtdmlkZW8nKS50cmltKCk7XG4gICAgdGhpcy5wbGF5QnV0dG9uID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdmlkZW8tcGxheS1idXR0b25dJyk7XG4gICAgdGhpcy52aWRlb0VsID0gZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdmlkZW8tZWxlbWVudF0nKTtcblxuICAgIHRoaXMub25QbGF5Q2xpY2sgPSB0aGlzLl9vblBsYXlDbGljay5iaW5kKHRoaXMpO1xuICAgIHRoaXMub25QYXVzZUNsaWNrID0gdGhpcy5fb25QYXVzZUNsaWNrLmJpbmQodGhpcyk7XG4gICAgdGhpcy5hdXRvcGxheSA9IHRoaXMuX2F1dG9wbGF5LmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLnZpZGVvID0gbnVsbDtcblxuICAgIHN3aXRjaCAodGhpcy5wbGF0Zm9ybSkge1xuICAgICAgY2FzZSAneW91dHViZSc6XG4gICAgICAgIHRoaXMudmlkZW8gPSBuZXcgWW91dHViZSh0aGlzLnZpZGVvRWwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3ZpbWVvJzpcbiAgICAgICAgdGhpcy52aWRlbyA9IG5ldyBWaW1lbyh0aGlzLnZpZGVvRWwpO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMudmlkZW8gPSBudWxsO1xuICAgICAgICBicmVhaztcbiAgICB9XG5cbiAgICBpZiAodGhpcy5wbGF5QnV0dG9uKSB7XG4gICAgICBpZiAodGhpcy5vcHRpb25zICYmIHRoaXMub3B0aW9ucy5hdXRvcGxheSkge1xuICAgICAgICB0aGlzLmF1dG9wbGF5KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMucGxheUJ1dHRvbi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25QbGF5Q2xpY2spO1xuICAgIH1cbiAgfVxuXG4gIF9vblBsYXlDbGljaygpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3ZpZGVvLWxvYWRpbmcnKTtcblxuICAgIHRoaXMudmlkZW8ucGxheSgpXG4gICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndmlkZW8tdHJhbnNpdGlvbmluZycpO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlkZW8tbG9hZGluZycpO1xuICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LnJlbW92ZSgndmlkZW8tdHJhbnNpdGlvbmluZycpO1xuICAgICAgICAgIHRoaXMuZWwuY2xhc3NMaXN0LmFkZCgndmlkZW8tcGxheWluZycpO1xuICAgICAgICB9LCAyMDApO1xuICAgICAgfSk7XG4gIH1cblxuICBfb25QYXVzZUNsaWNrKCkge1xuICAgIHRoaXMudmlkZW8ucGF1c2UoKTtcbiAgfVxuXG4gIF9hdXRvcGxheSgpIHtcbiAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3ZpZGVvLWxvYWRpbmcnKTtcblxuICAgIHRoaXMudmlkZW8uYXV0b3BsYXkoKVxuICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3ZpZGVvLXRyYW5zaXRpb25pbmcnKTtcblxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3ZpZGVvLWxvYWRpbmcnKTtcbiAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5yZW1vdmUoJ3ZpZGVvLXRyYW5zaXRpb25pbmcnKTtcbiAgICAgICAgICB0aGlzLmVsLmNsYXNzTGlzdC5hZGQoJ3ZpZGVvLXBsYXlpbmcnKTtcbiAgICAgICAgfSwgMjAwKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgdW5sb2FkKCkge1xuICAgIGlmICh0aGlzLnBsYXlCdXR0b24pIHtcbiAgICAgIHRoaXMucGxheUJ1dHRvbi5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25QbGF5Q2xpY2spO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnZpZGVvKSB7XG4gICAgICB0aGlzLnZpZGVvLnVubG9hZCgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5pbXBvcnQgc2Nyb2xsTGVmdCBmcm9tICcuLi9oZWxwZXJzL3Njcm9sbExlZnQnO1xuaW1wb3J0IFZpZGVvIGZyb20gJy4vVmlkZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0R2FsbGVyeSB7XG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICB0aGlzLiRnYWxsZXJ5ID0gb3B0aW9ucy4kZ2FsbGVyeTtcbiAgICB0aGlzLnNldHRpbmdzID0gb3B0aW9ucy5zZXR0aW5ncztcblxuICAgIC8vIEdhbGxlcnlcbiAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcbiAgICB0aGlzLnNsaWRlciA9ICdbZGF0YS1wcm9kdWN0LXNsaWRlcl0nO1xuICAgIHRoaXMuJHNsaWRlciA9IHRoaXMuJGdhbGxlcnkuZmluZCh0aGlzLnNsaWRlcik7XG4gICAgdGhpcy5zbGlkZXMgPSAnW2RhdGEtcHJvZHVjdC1pbWFnZV0nO1xuICAgIHRoaXMuJHNsaWRlcyA9IHRoaXMuJGdhbGxlcnkuZmluZCh0aGlzLnNsaWRlcyk7XG4gICAgdGhpcy5zbGlkZUltYWdlcyA9IHRoaXMuJHNsaWRlclswXS5xdWVyeVNlbGVjdG9yQWxsKCdbZGF0YS1yaW1nXScpO1xuICAgIHRoaXMuJHNsaWRlclBhZ2luYXRpb24gPSB0aGlzLiRnYWxsZXJ5LmZpbmQoJ1tkYXRhLXByb2R1Y3Qtc2xpZGVyLXBhZ2luYXRpb25dJyk7XG4gICAgdGhpcy4kcGFnaW5hdGlvblRyaWdnZXIgPSB0aGlzLiRnYWxsZXJ5LmZpbmQoJ1tkYXRhLXByb2R1Y3QtdGh1bWJuYWlsXScpO1xuXG4gICAgdGhpcy52aWRlb3MgPSB7fTtcbiAgICB0aGlzLnZpZGVvU2xpZGVzID0gdGhpcy4kc2xpZGVyWzBdLnF1ZXJ5U2VsZWN0b3JBbGwoJ1tkYXRhLXByb2R1Y3QtaW1hZ2UtdmlkZW9dJyk7XG5cbiAgICAvLyBSZS1pbml0aWFsaXNlIGdhbGxlcnkgd2hlbiBjcm9zc2luZyBicmVha3BvaW50cyBpZiBuZWVkZWRcbiAgICB0aGlzLl9vblVwZGF0ZUdhbGxlcnkgPSB0aGlzLl9vblVwZGF0ZUdhbGxlcnkuYmluZCh0aGlzKTtcbiAgICBsYXlvdXQub25CcmVha3BvaW50Q2hhbmdlKHRoaXMuX29uVXBkYXRlR2FsbGVyeSk7XG5cbiAgICB0aGlzLnNsaWRlSW1hZ2VMb2FkZWQgPSB0aGlzLl9vblNsaWRlSW1hZ2VMb2FkZWQuYmluZCh0aGlzKTtcbiAgICB0aGlzLnZhcmlhbnRDaGFuZ2UgPSB0aGlzLl9vblZhcmlhbnRDaGFuZ2UuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX2luaXQoKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2xpZGVJbWFnZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIHRoaXMuc2xpZGVJbWFnZXNbaV0ucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmltZzpsb2FkJywgdGhpcy5zbGlkZUltYWdlTG9hZGVkKTtcbiAgICB9XG5cbiAgICBsYXlvdXQub2ZmQnJlYWtwb2ludENoYW5nZSh0aGlzLl9vblVwZGF0ZUdhbGxlcnkpO1xuXG4gICAgdGhpcy5fdW5sb2FkR2FsbGVyeSgpO1xuICB9XG5cbiAgX2luaXQoKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNsaWRlSW1hZ2VzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICB0aGlzLnNsaWRlSW1hZ2VzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ3JpbWc6bG9hZCcsIHRoaXMuc2xpZGVJbWFnZUxvYWRlZCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmlkZW9TbGlkZXMubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudmlkZW9TbGlkZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgdmlkZW9TbGlkZSA9IHRoaXMudmlkZW9TbGlkZXNbaV07XG4gICAgICAgIGNvbnN0IHNsaWRlSWQgPSB2aWRlb1NsaWRlLmdldEF0dHJpYnV0ZSgnZGF0YS1wcm9kdWN0LWltYWdlJyk7XG4gICAgICAgIGNvbnN0IHZpZGVvRWwgPSB2aWRlb1NsaWRlLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXZpZGVvXScpO1xuXG4gICAgICAgIHRoaXMudmlkZW9zW3NsaWRlSWRdID0gbmV3IFZpZGVvKHZpZGVvRWwpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLiRzbGlkZXMubGVuZ3RoKSB7XG4gICAgICB0aGlzLl9pbml0R2FsbGVyeSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIHN1cmUgRmxpY2tpdHkgdXBkYXRlcyB2aWV3cG9ydCBoZWlnaHQgd2hlbiBpbWFnZXMgbG9hZCBpblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uU2xpZGVJbWFnZUxvYWRlZCgpIHtcbiAgICBpZiAoIXRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBPbmx5IHJlc2l6ZSBpZiB2aWV3cG9ydCBoYXMgbm8gaGVpZ2h0XG4gICAgLy8gTmVlZGVkIHRvIHByZXZlbnQgbXVsdGlwbGUgJ3NlbGVjdCcgZXZlbnRzXG4gICAgaWYgKFxuICAgICAgdGhpcy5mbGlja2l0eS52aWV3cG9ydFxuICAgICAgJiYgcGFyc2VJbnQodGhpcy5mbGlja2l0eS52aWV3cG9ydC5zdHlsZS5oZWlnaHQsIDEwKVxuICAgICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkucmVzaXplKCk7XG4gIH1cblxuICBfdW5sb2FkR2FsbGVyeSgpIHtcbiAgICBpZiAodGhpcy5mbGlja2l0eSkge1xuICAgICAgdGhpcy4kcGFnaW5hdGlvblRyaWdnZXIub2ZmKCcuZ2FsbGVyeScpO1xuXG4gICAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgICAgdGhpcy4kc2xpZGVyLmZpbmQodGhpcy5zbGlkZXMpLmF0dHIoJ3N0eWxlJywgJycpO1xuICAgIH1cbiAgfVxuXG4gIF9vblVwZGF0ZUdhbGxlcnkoKSB7XG4gICAgdGhpcy5fdW5sb2FkR2FsbGVyeSgpO1xuICAgIHRoaXMuX2luaXRHYWxsZXJ5KCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIGdhbGxlcnkgb24gdmFyaWFudCBjaGFuZ2VcbiAgICpcbiAgICogQHBhcmFtIHZhcmlhbnRcbiAgICogQHByb3BlcnR5IHtPYmplY3R9IG9wdGlvbnMuZmVhdHVyZWRfaW1hZ2UgLSBGZWF0dXJlZCBpbWFnZSBpbmZvcm1hdGlvblxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uVmFyaWFudENoYW5nZSh2YXJpYW50KSB7XG4gICAgaWYgKCF2YXJpYW50LmZlYXR1cmVkX2ltYWdlIHx8ICF0aGlzLmZsaWNraXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLiRzbGlkZXJcbiAgICAgIC5maW5kKGBbZGF0YS1wcm9kdWN0LWltYWdlPSR7dmFyaWFudC5mZWF0dXJlZF9pbWFnZS5pZH1dYClcbiAgICAgIC5hdHRyKCdkYXRhLXByb2R1Y3QtaW1hZ2UtaW5kZXgnKTtcbiAgICB0aGlzLmZsaWNraXR5LnNlbGVjdChpbmRleCwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIF9pbml0R2FsbGVyeSgpIHtcbiAgICBjb25zdCAkc2VsZWN0ZWRJbWFnZSA9IHRoaXMuJHNsaWRlci5maW5kKCcuaW1hZ2UtLXNlbGVjdGVkJyk7XG5cbiAgICAvLyBPcHRpb25zIHNoYXJlZCBvbiBEZXNrdG9wIGFuZCBNb2JpbGVcbiAgICBsZXQgZmxpY2tpdHlPcHRpb25zID0ge1xuICAgICAgYXV0b1BsYXk6IDAsXG4gICAgICBhY2Nlc3NpYmlsaXR5OiB0cnVlLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgICBjZWxsQWxpZ246ICdsZWZ0JyxcbiAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zbGlkZXMsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBwcmV2TmV4dEJ1dHRvbnM6IGZhbHNlLFxuICAgICAgd3JhcEFyb3VuZDogdHJ1ZSxcbiAgICB9O1xuXG4gICAgLy8gTW9iaWxlIG9ubHkgb3B0aW9uc1xuICAgIGNvbnN0IG9wdGlvbnNNb2JpbGUgPSB7XG4gICAgICBkcmFnZ2FibGU6IHRydWUsXG4gICAgICBmcmljdGlvbjogMC44LFxuICAgICAgc2VsZWN0ZWRBdHRyYWN0aW9uOiAwLjIsXG4gICAgfTtcblxuICAgIC8vIERlc2t0b3Agb25seSBvcHRpb25zXG4gICAgY29uc3Qgb3B0aW9uc0Rlc2t0b3AgPSB7XG4gICAgICBkcmFnZ2FibGU6IGZhbHNlLFxuICAgIH07XG5cbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnWFMnKSl7XG4gICAgICBmbGlja2l0eU9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgb3B0aW9uc01vYmlsZSwgZmxpY2tpdHlPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxpY2tpdHlPcHRpb25zID0gJC5leHRlbmQoe30sIG9wdGlvbnNEZXNrdG9wLCBmbGlja2l0eU9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIElmIGEgdmFyaWFudCBoYXMgYW4gaW1hZ2UgcHJlLXNlbGVjdGVkLCBzdGFydCB0aGUgc2xpZGVzaG93IGF0IHRoYXQgaW1hZ2VcbiAgICAvLyBJZiB0aGUgc2xpZGVzaG93IGhhcyBiZWVuIHJlLWluaXRhbGlzZWQgYWNyb3NzIGEgYnJlYWsgcG9pbnQsIHNsaWRlc2hvd1xuICAgIC8vIHJlc3RhcnRzIGF0IHNhbWUgc2xpZGVcbiAgICBpZiAoJHNlbGVjdGVkSW1hZ2UubGVuZ3RoKSB7XG4gICAgICBjb25zdCBpbml0aWFsSW5kZXggPSBwYXJzZUludCgkc2VsZWN0ZWRJbWFnZS5hdHRyKCdkYXRhLXByb2R1Y3QtaW1hZ2UtaW5kZXgnKSwgMTApO1xuXG4gICAgICBmbGlja2l0eU9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgeyBpbml0aWFsSW5kZXggfSwgZmxpY2tpdHlPcHRpb25zKTtcbiAgICB9XG5cbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuJHNsaWRlclswXSwgZmxpY2tpdHlPcHRpb25zKTtcbiAgICB0aGlzLl9iaW5kR2FsbGVyeSgpO1xuICAgIHRoaXMuX2hhbmRsZUdhbGxlcnlWaWRlb3MoKTtcbiAgfVxuXG4gIF9iaW5kR2FsbGVyeSgpIHtcbiAgICB0aGlzLmZsaWNraXR5Lm9uKCdzZWxlY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLl91cGRhdGVBY3RpdmVTbGlkZSh0aGlzLmZsaWNraXR5LnNlbGVjdGVkSW5kZXgpO1xuICAgICAgdGhpcy5faGFuZGxlR2FsbGVyeVZpZGVvcygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kcGFnaW5hdGlvblRyaWdnZXIub24oJ2NsaWNrLmdhbGxlcnknLCAoZXZlbnQpID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBjb25zdCAkdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgIHRoaXMuZmxpY2tpdHkuc2VsZWN0KCR0YXJnZXQuYXR0cignZGF0YS1wcm9kdWN0LXRodW1ibmFpbCcpLCBmYWxzZSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEhhbmRsZSBnYWxsZXJ5IHZpZGVvc1xuICAgKiAtIFBhdXNlIHZpZGVvIGlmIGlzIG5vdCBhY3RpdmUgc2xpZGVcbiAgICogLSBQbGF5IHZpZGVvIGlmIGlzIGFjdGl2ZSBzbGlkZSwgYW5kIGlzIGF1dG9wbGF5XG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfaGFuZGxlR2FsbGVyeVZpZGVvcygpIHtcbiAgICBjb25zdCBzbGlkZUlkID0gcGFyc2VJbnQodGhpcy5mbGlja2l0eS5zZWxlY3RlZEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXByb2R1Y3QtaW1hZ2UnKSwgMTApO1xuXG4gICAgT2JqZWN0LmtleXModGhpcy52aWRlb3MpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgY29uc3QgdmlkZW9LZXkgPSBwYXJzZUludChrZXksIDEwKTtcblxuICAgICAgLy8gUGF1c2UgaW5hY3RpdmUgc2xpZGUgdmlkZW9zXG4gICAgICBpZiAoc2xpZGVJZCAhPT0gdmlkZW9LZXkpIHtcbiAgICAgICAgdGhpcy52aWRlb3NbdmlkZW9LZXldLm9uUGF1c2VDbGljaygpO1xuICAgICAgfVxuXG4gICAgICAvLyBQbGF5IHZpZGVvIGlmIGlzIHNlbGVjdGVkLCBhbmQgYXV0byBwbGF5IGVuYWJsZWRcbiAgICAgIGlmIChzbGlkZUlkID09PSB2aWRlb0tleSAmJiB0aGlzLnNldHRpbmdzLmVuYWJsZV92aWRlb19hdXRvcGxheSkge1xuICAgICAgICB0aGlzLnZpZGVvc1t2aWRlb0tleV0uYXV0b3BsYXkoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgbm9uLWZsaWNraXR5IGFjdGl2ZSBjbGFzcyB0byB0aHVtYm5haWxzLCBhbmQgbWFpbiBzbGlkZXNob3dcbiAgICogIC0gSXMgdXNlZCBvbiByZS1pbml0IGFjcm9zcyBicmVha3BvaW50c1xuICAgKiAgLSBJcyB1c2VkIHRvIHNob3cgdGhlIGFjdGl2ZSB0aHVtYm5haWwgaW4gdGhlIHBhZ2luYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGluZGV4XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdXBkYXRlQWN0aXZlU2xpZGUoaW5kZXgpIHtcbiAgICBjb25zdCAkbmV3U2xpZGUgPSB0aGlzLiRzbGlkZXIuZmluZChgW2RhdGEtcHJvZHVjdC1pbWFnZS1pbmRleD0ke2luZGV4fV1gKTtcbiAgICBjb25zdCAkbmV3VGh1bWJuYWlsID0gdGhpcy4kc2xpZGVyUGFnaW5hdGlvbi5maW5kKGBbZGF0YS1wcm9kdWN0LXRodW1ibmFpbD0ke2luZGV4fV1gKTtcblxuICAgICRuZXdTbGlkZVxuICAgICAgLmFkZENsYXNzKCdpbWFnZS0tc2VsZWN0ZWQnKVxuICAgICAgLnNpYmxpbmdzKCcuaW1hZ2UtLXNlbGVjdGVkJylcbiAgICAgIC5yZW1vdmVDbGFzcygnaW1hZ2UtLXNlbGVjdGVkJyk7XG5cbiAgICAkbmV3VGh1bWJuYWlsXG4gICAgICAuYWRkQ2xhc3MoJ3RodW1ibmFpbC0tc2VsZWN0ZWQnKVxuICAgICAgLnNpYmxpbmdzKCcudGh1bWJuYWlsLS1zZWxlY3RlZCcpXG4gICAgICAucmVtb3ZlQ2xhc3MoJ3RodW1ibmFpbC0tc2VsZWN0ZWQnKTtcblxuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdYUycpKSB7XG4gICAgICBzY3JvbGxMZWZ0KCRuZXdUaHVtYm5haWwpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBDdXJyZW5jeUNvbnZlcnRlciBmcm9tICdzaG9waWZ5LWN1cnJlbmN5LWNvbnZlcnRlcic7XG5pbXBvcnQgeyByZW1vdmVUcmFwRm9jdXMsIHRyYXBGb2N1cyB9IGZyb20gJy4uL2hlbHBlcnMvYTExeSc7XG5pbXBvcnQgRm9ybXMgZnJvbSAnLi4vRm9ybXMnO1xuaW1wb3J0IFZhcmlhbnRIZWxwZXIgZnJvbSAnLi4vVmFyaWFudEhlbHBlcic7XG5pbXBvcnQgQWRkVG9DYXJ0Rmx5b3V0IGZyb20gJy4vQWRkVG9DYXJ0Rmx5b3V0JztcbmltcG9ydCBQcm9kdWN0R2FsbGVyeSBmcm9tICcuL1Byb2R1Y3RHYWxsZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdERldGFpbHMge1xuICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7XG4gICAgdGhpcy4kd2luZG93ID0gJCh3aW5kb3cpO1xuICAgIHRoaXMuJGZvcm1BcmVhID0gb3B0aW9ucy4kZm9ybUFyZWE7XG4gICAgdGhpcy4kZ2FsbGVyeSA9IG9wdGlvbnMuJGdhbGxlcnk7XG4gICAgdGhpcy4kZGV0YWlscyA9IG9wdGlvbnMuJGRldGFpbHM7XG4gICAgdGhpcy5jb250ZXh0ID0gb3B0aW9ucy5jb250ZXh0O1xuICAgIHRoaXMuc2V0dGluZ3MgPSBvcHRpb25zLnNldHRpbmdzO1xuICAgIHRoaXMucHJvZHVjdCA9IG9wdGlvbnMucHJvZHVjdDtcbiAgICB0aGlzLnVzZUhpc3RvcnkgPSBvcHRpb25zLnVzZUhpc3Rvcnk7XG5cbiAgICB0aGlzLnZhcmlhbnRIZWxwZXIgPSBudWxsO1xuXG4gICAgLy8gUHJvZHVjdCBBVEMgQWN0aW9uc1xuICAgIHRoaXMuX29uQVRDT3BlbiA9IHRoaXMuX29uQVRDT3Blbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQVRDQ2xvc2UgPSB0aGlzLl9vbkFUQ0Nsb3NlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmF0Y0NhbGxiYWNrcyA9ICQuZXh0ZW5kKHtcbiAgICAgIG9uQ2xvc2U6IHRoaXMuX29uQVRDQ2xvc2UsXG4gICAgICBvbk9wZW46IHRoaXMuX29uQVRDT3BlbixcbiAgICB9LCBvcHRpb25zLmF0Y0NhbGxiYWNrcyk7XG5cbiAgICAvLyBGb3JtXG4gICAgdGhpcy4kZm9ybSA9IHRoaXMuJGZvcm1BcmVhLmZpbmQoJ1tkYXRhLXByb2R1Y3QtZm9ybV0gZm9ybScpO1xuICAgIHRoaXMuJHByb2R1Y3RBdGNCdXR0b24gPSB0aGlzLiRmb3JtQXJlYS5maW5kKCdbZGF0YS1wcm9kdWN0LWF0Y10nKTtcbiAgICB0aGlzLiRwcm9kdWN0VmFyaWFudHMgPSB0aGlzLiRmb3JtLmZpbmQoJ1tkYXRhLXZhcmlhbnRzXScpO1xuICAgIHRoaXMuJHByb2R1Y3RPcHRpb25zID0gdGhpcy4kZm9ybS5maW5kKCdbZGF0YS1wcm9kdWN0LW9wdGlvbl0nKTtcblxuICAgIHRoaXMudmFyaWFudEZpZWxkcyA9IHtcbiAgICAgICRwcmljZTogdGhpcy4kZGV0YWlscy5maW5kKCdbZGF0YS1wcmljZV0nKSxcbiAgICAgICRwcmljZU1vbmV5OiB0aGlzLiRkZXRhaWxzLmZpbmQoJ1tkYXRhLXByaWNlXSAubW9uZXknKSxcbiAgICAgICRjb21wYXJlQXRQcmljZTogdGhpcy4kZGV0YWlscy5maW5kKCdbZGF0YS1wcmljZS1jb21wYXJlLWF0XScpLFxuICAgICAgJGNvbXBhcmVBdFByaWNlTW9uZXk6IHRoaXMuJGRldGFpbHMuZmluZCgnW2RhdGEtcHJpY2UtY29tcGFyZS1hdF0gLm1vbmV5JyksXG4gICAgICAkYmFkZ2U6IHRoaXMuJGRldGFpbHMuZmluZCgnW2RhdGEtYmFkZ2Utc2FsZXNdJyksXG4gICAgICAkYmFkZ2VNb25leVNhdmVkOiB0aGlzLiRkZXRhaWxzLmZpbmQoJ1tkYXRhLXByaWNlLW1vbmV5LXNhdmVkXScpLFxuICAgICAgJGJhZGdlUGVyY2VudFNhdmVkOiB0aGlzLiRkZXRhaWxzLmZpbmQoJ1tkYXRhLXByaWNlLXBlcmNlbnQtc2F2ZWRdJyksXG4gICAgfTtcblxuICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybXModGhpcy4kZm9ybSk7XG4gICAgdGhpcy5nYWxsZXJ5ID0gbmV3IFByb2R1Y3RHYWxsZXJ5KG9wdGlvbnMpO1xuXG4gICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICAgIHRoaXMuX2luaXRPcHRpb25zKCk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy4kZm9ybS5vZmYoJy5wcm9kdWN0LWRldGFpbHMnKTtcbiAgICB0aGlzLmZvcm1zLnVubG9hZCgpO1xuXG4gICAgaWYgKHRoaXMudmFyaWFudEhlbHBlcikge1xuICAgICAgdGhpcy52YXJpYW50SGVscGVyLnVubG9hZCgpO1xuICAgIH1cblxuICAgIHRoaXMuZ2FsbGVyeS51bmxvYWQoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuJHdpbmRvdy5vbigncHJvZHVjdC12YXJpYW50LXN3aXRjaC5wcm9kdWN0LWRldGFpbHMnLCAoZXZlbnQsIGRhdGEpID0+IHRoaXMuX3N3aXRjaFZhcmlhbnQoZXZlbnQsIGRhdGEpKTtcbiAgICB0aGlzLiRmb3JtLm9uKCdzdWJtaXQucHJvZHVjdC1kZXRhaWxzJywgZXZlbnQgPT4gdGhpcy5fQWRkVG9DYXJ0Rmx5b3V0KGV2ZW50KSk7XG4gIH1cblxuICBfaW5pdE9wdGlvbnMoKSB7XG4gICAgaWYgKCF0aGlzLiRwcm9kdWN0VmFyaWFudHMubGVuZ3RoKSByZXR1cm47XG5cbiAgICB0aGlzLnZhcmlhbnRIZWxwZXIgPSBuZXcgVmFyaWFudEhlbHBlcihcbiAgICAgIHRoaXMucHJvZHVjdCxcbiAgICAgIHRoaXMuJHByb2R1Y3RWYXJpYW50cyxcbiAgICAgIHRoaXMuJHByb2R1Y3RPcHRpb25zLFxuICAgICk7XG4gIH1cblxuICBfc3dpdGNoVmFyaWFudChldmVudCwgZGF0YSkge1xuICAgIGlmIChkYXRhLnByb2R1Y3QgIT09IHRoaXMucHJvZHVjdCkgcmV0dXJuO1xuXG4gICAgY29uc3QgdmFyaWFudCA9IGRhdGEudmFyaWFudDtcbiAgICBjb25zdCBmaXJzdExvYWQgPSBkYXRhLmZpcnN0TG9hZDtcblxuICAgIGlmIChmaXJzdExvYWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWFpbiBzZWxlY3RcbiAgICB0aGlzLiRwcm9kdWN0VmFyaWFudHMudmFsKGRhdGEudmFyaWFudC5pZCk7XG4gICAgdGhpcy5nYWxsZXJ5LnZhcmlhbnRDaGFuZ2UodmFyaWFudCk7XG5cbiAgICAvLyBVcGRhdGUgVmFyaWFudCBpbmZvcm1hdGlvblxuICAgIHRoaXMuX3VwZGF0ZVByaWNlKHZhcmlhbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUJhZGdlKHZhcmlhbnQpO1xuICAgIHRoaXMuX3VwZGF0ZUJ1dHRvbih2YXJpYW50KTtcblxuICAgIGlmICh0aGlzLnVzZUhpc3RvcnkpIHtcbiAgICAgIGNvbnN0IHVybCA9IGAkeyB0aGlzLnByb2R1Y3QuaGFuZGxlIH0/JHskLnBhcmFtKHsgdmFyaWFudDogdmFyaWFudC5pZCB9KX1gO1xuICAgICAgaGlzdG9yeS5yZXBsYWNlU3RhdGUoe30sICd2YXJpYW50JywgdXJsKTtcbiAgICB9XG4gIH1cblxuICBfdXBkYXRlUHJpY2UodmFyaWFudCkge1xuICAgIC8vIFVwZGF0ZSBjb21wYXJlIGF0IHByaWNlXG4gICAgY29uc3QgaGFzQ29tcGFyZVByaWNlID0gKFxuICAgICAgISF2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UgJiYgdmFyaWFudC5jb21wYXJlX2F0X3ByaWNlID4gdmFyaWFudC5wcmljZVxuICAgICk7XG4gICAgdGhpcy52YXJpYW50RmllbGRzLiRjb21wYXJlQXRQcmljZS50b2dnbGVDbGFzcygndmlzaWJsZScsIGhhc0NvbXBhcmVQcmljZSk7XG4gICAgdGhpcy52YXJpYW50RmllbGRzLiRjb21wYXJlQXRQcmljZU1vbmV5LnRleHQoU2hvcGlmeS5mb3JtYXRNb25leSh2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UsIHRoaXMuc2V0dGluZ3MubW9uZXlfZm9ybWF0KSk7XG4gICAgQ3VycmVuY3lDb252ZXJ0ZXIudXBkYXRlKHRoaXMudmFyaWFudEZpZWxkcy4kY29tcGFyZUF0UHJpY2VNb25leVswXSk7XG5cbiAgICAvLyBVcGRhdGUgcHJpY2VcbiAgICB0aGlzLnZhcmlhbnRGaWVsZHMuJHByaWNlTW9uZXkudGV4dChTaG9waWZ5LmZvcm1hdE1vbmV5KHZhcmlhbnQucHJpY2UsIHRoaXMuc2V0dGluZ3MubW9uZXlfZm9ybWF0KSk7XG4gICAgQ3VycmVuY3lDb252ZXJ0ZXIudXBkYXRlKHRoaXMudmFyaWFudEZpZWxkcy4kcHJpY2VNb25leVswXSk7XG4gIH1cblxuICBfdXBkYXRlQmFkZ2UodmFyaWFudCkge1xuICAgIGNvbnN0IHByaWNlU2F2ZWQgPSB2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UgPyB2YXJpYW50LmNvbXBhcmVfYXRfcHJpY2UgLSB2YXJpYW50LnByaWNlIDogMDtcbiAgICB0aGlzLnZhcmlhbnRGaWVsZHMuJGJhZGdlLnRvZ2dsZSghIXByaWNlU2F2ZWQpO1xuXG4gICAgaWYgKHRoaXMudmFyaWFudEZpZWxkcy4kYmFkZ2VNb25leVNhdmVkLmxlbmd0aCkge1xuICAgICAgLy8gVXBkYXRlIGJhZGdlIGlmIGl0IHNob3dzIG1vbmV5IHNhdmVkXG4gICAgICB0aGlzLnZhcmlhbnRGaWVsZHMuJGJhZGdlTW9uZXlTYXZlZC50ZXh0KFNob3BpZnkuZm9ybWF0TW9uZXkocHJpY2VTYXZlZCwgdGhpcy5zZXR0aW5ncy5tb25leV9mb3JtYXQpKTtcbiAgICAgIEN1cnJlbmN5Q29udmVydGVyLnVwZGF0ZSh0aGlzLnZhcmlhbnRGaWVsZHMuJGJhZGdlTW9uZXlTYXZlZFswXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudmFyaWFudEZpZWxkcy4kYmFkZ2VQZXJjZW50U2F2ZWQubGVuZ3RoKSB7XG4gICAgICAvLyBVcGRhdGUgYmFkZ2UgaWYgaXQgc2hvd3MgcGVyY2VudGlsZXNcbiAgICAgIGNvbnN0IHBlcmNlbnRpbGVTYXZlZCA9IE1hdGgucm91bmQoKHByaWNlU2F2ZWQgKiAxMDApIC8gdmFyaWFudC5jb21wYXJlX2F0X3ByaWNlKTtcbiAgICAgIHRoaXMudmFyaWFudEZpZWxkcy4kYmFkZ2VQZXJjZW50U2F2ZWQudGV4dChwZXJjZW50aWxlU2F2ZWQpO1xuICAgIH1cbiAgfVxuXG4gIF91cGRhdGVCdXR0b24odmFyaWFudCkge1xuICAgIGlmICh2YXJpYW50LmF2YWlsYWJsZSkge1xuICAgICAgdGhpcy4kcHJvZHVjdEF0Y0J1dHRvbi50ZXh0KHRoaXMuY29udGV4dC5wcm9kdWN0X2F2YWlsYWJsZSk7XG4gICAgICB0aGlzLiRwcm9kdWN0QXRjQnV0dG9uXG4gICAgICAgIC5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKVxuICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuJHByb2R1Y3RBdGNCdXR0b24udGV4dCh0aGlzLmNvbnRleHQucHJvZHVjdF91bmF2YWlsYWJsZSk7XG4gICAgICB0aGlzLiRwcm9kdWN0QXRjQnV0dG9uXG4gICAgICAgIC5hZGRDbGFzcygnZGlzYWJsZWQnKVxuICAgICAgICAucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBfQWRkVG9DYXJ0Rmx5b3V0KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gdGhpcy4kZm9ybS5zZXJpYWxpemVBcnJheSgpO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICRhdGNCdXR0b246IHRoaXMuJHByb2R1Y3RBdGNCdXR0b24sXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBtb25leUZvcm1hdDogdGhpcy5zZXR0aW5ncy5tb25leV9mb3JtYXQsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBBZGRUb0NhcnRGbHlvdXQuaW5pdChmb3JtRGF0YSwgb3B0aW9ucywgdGhpcy5hdGNDYWxsYmFja3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gQWRkVG9DYXJ0Rmx5b3V0IG9wZW5zXG4gICAqIE1vdmUga2V5Ym9hcmQgZm9jdXMgaW50byBmbHlvdXRcbiAgICpcbiAgICogQHBhcmFtIHtvYmplY3R9IG9wdGlvbnMgLSBPcHRpb25zIHRvIGJlIHVzZWRcbiAgICogQHBhcmFtIHtqUXVlcnl9IG9wdGlvbnMuJGNvbnRhaW5lciAtIENvbnRhaW5lciB0byB0cmFwIGZvY3VzIHdpdGhpblxuICAgKiBAcGFyYW0ge2pRdWVyeX0gb3B0aW9ucy4kZWxlbWVudFRvRm9jdXMgLSBFbGVtZW50IHRvIGJlIGZvY3VzZWQgd2hlbiBmb2N1cyBsZWF2ZXMgY29udGFpbmVyXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25BVENPcGVuKG9wdGlvbnMpIHtcbiAgICB0cmFwRm9jdXMoe1xuICAgICAgJGNvbnRhaW5lcjogb3B0aW9ucy4kY29udGFpbmVyLFxuICAgICAgJGVsZW1lbnRUb0ZvY3VzOiBvcHRpb25zLiRlbGVtZW50VG9Gb2N1cyxcbiAgICAgIG5hbWVzcGFjZTogJ3Byb2R1Y3QtZGV0YWlscy1mbHlvdXQnLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHdoZW4gQWRkVG9DYXJ0Rmx5b3V0IGNsb3Nlc1xuICAgKiBNb3ZlIGtleWJvYXJkIGZvY3VzIGJhY2sgaW50byBncmlkIGl0ZW1cbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkFUQ0Nsb3NlKCkge1xuICAgIHJlbW92ZVRyYXBGb2N1cyh7XG4gICAgICBuYW1lc3BhY2U6ICdwcm9kdWN0LWRldGFpbHMtZmx5b3V0JyxcbiAgICB9KTtcblxuICAgIHRoaXMuJHByb2R1Y3RBdGNCdXR0b24uZm9jdXMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBDdXJyZW5jeUNvbnZlcnRlciBmcm9tICdzaG9waWZ5LWN1cnJlbmN5LWNvbnZlcnRlcic7XG5cbmltcG9ydCBNb2RhbCBmcm9tICcuL01vZGFsJztcbmltcG9ydCBQcm9kdWN0RGV0YWlscyBmcm9tICcuL1Byb2R1Y3REZXRhaWxzJztcbmltcG9ydCBSaWNoVGV4dCBmcm9tICcuLi9jb21wb25lbnRzL1JpY2hUZXh0JztcbmltcG9ydCB7cmVtb3ZlVHJhcEZvY3VzfSBmcm9tICcuLi9oZWxwZXJzL2ExMXknO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0UXVpY2tzaG9wIHtcbiAgY29uc3RydWN0b3Iob3B0aW9ucykge1xuICAgIHRoaXMuJGVsID0gb3B0aW9ucy4kZWw7XG4gICAgdGhpcy4kcXVpY2tTaG9wID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1xdWlja3Nob3BdJyk7XG4gICAgdGhpcy5tb2RhbENsYXNzID0gb3B0aW9ucy5tb2RhbENsYXNzO1xuICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgdGhpcy5yaWNoVGV4dCA9IG51bGw7XG4gICAgdGhpcy5wcm9kdWN0RGV0YWlscyA9IG51bGw7XG4gICAgdGhpcy5xdWlja1Nob3BIVE1MID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICB0aGlzLmRhdGEgPSBKU09OLnBhcnNlKHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3QtcXVpY2tzaG9wLWRhdGFdJykudGV4dCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FybihgUXVpY2tzaG9wOiBpbnZhbGlkIHF1aWNrc2hvcCBkYXRhIGZvdW5kLiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucXVpY2tTaG9wSFRNTCA9IEpTT04ucGFyc2UodGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1xdWlja3Nob3AtaHRtbF0nKS50ZXh0KCkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gY29uc29sZS53YXJuKGBRdWlja3Nob3A6IGludmFsaWQgcXVpY2tzaG9wIGh0bWwgZm91bmQuICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuJHF1aWNrU2hvcFswXS5oYXNBdHRyaWJ1dGUoJ2RhdGEtbG9hZGVkJykpIHtcbiAgICAgIHRoaXMuJHF1aWNrU2hvcC5hcHBlbmQodGhpcy5xdWlja1Nob3BIVE1MKTtcbiAgICAgIHRoaXMuJHF1aWNrU2hvcC5hdHRyKCdkYXRhLWxvYWRlZCcsIHRydWUpO1xuICAgICAgdGhpcy4kcXVpY2tTaG9wXG4gICAgICAgIC5maW5kKCcubW9uZXknKVxuICAgICAgICAuZWFjaCgoaW5kZXgsIGVsKSA9PiBDdXJyZW5jeUNvbnZlcnRlci51cGRhdGUoZWwpKTtcbiAgICAgIHRoaXMuX2luaXRTUFIoKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbml0aWFsaXplKCk7XG5cbiAgICBpZiAod2luZG93LlNob3BpZnkgJiYgU2hvcGlmeS5QYXltZW50QnV0dG9uKSB7XG4gICAgICBTaG9waWZ5LlBheW1lbnRCdXR0b24uaW5pdCgpO1xuICAgIH1cbiAgfVxuXG4gIF9pbml0U1BSKCkge1xuICAgIGlmICghd2luZG93LlNQUikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHdpbmRvdy5TUFIucmVnaXN0ZXJDYWxsYmFja3MoKTtcbiAgICB3aW5kb3cuU1BSLmluaXRSYXRpbmdIYW5kbGVyKCk7XG4gICAgd2luZG93LlNQUi5pbml0RG9tRWxzKCk7XG4gICAgd2luZG93LlNQUi5sb2FkUHJvZHVjdHMoKTtcbiAgICB3aW5kb3cuU1BSLmxvYWRCYWRnZXMoKTtcbiAgfVxuXG4gIF9pbml0aWFsaXplKCkge1xuICAgIHRoaXMuJG1lc3NhZ2UgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1wcm9kdWN0LXF1aWNrc2hvcC1tZXNzYWdlXScpO1xuICAgIHRoaXMuJGZvcm1BcmVhID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1mb3JtLWFyZWFdJyk7XG4gICAgdGhpcy4kZ2FsbGVyeSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3QtZ2FsbGVyeV0nKTtcbiAgICB0aGlzLiRkZXRhaWxzID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1kZXRhaWxzXScpO1xuICAgIHRoaXMuJGRlc2NyaXB0aW9uID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1kZXNjcmlwdGlvbl0nKTtcbiAgICB0aGlzLmNvbnRleHQgPSB0aGlzLmRhdGEuY29udGV4dDtcbiAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5kYXRhLnNldHRpbmdzO1xuICAgIHRoaXMucHJvZHVjdCA9IHRoaXMuZGF0YS5wcm9kdWN0O1xuXG4gICAgdGhpcy5fb3BlbiA9IHRoaXMuX29wZW4uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9jbG9zZSA9IHRoaXMuX2Nsb3NlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9vbkFUQ0Nsb3NlID0gdGhpcy5fb25BVENDbG9zZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQVRDSW5pdCA9IHRoaXMuX29uQVRDSW5pdC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQVRDRXJyb3IgPSB0aGlzLl9vbkFUQ0Vycm9yLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25BVENTdWNjZXNzID0gdGhpcy5fb25BVENTdWNjZXNzLmJpbmQodGhpcyk7XG5cbiAgICBjb25zdCBtb2RhbENhbGxiYWNrcyA9IHtcbiAgICAgIG9uT3BlbjogdGhpcy5fb3BlbixcbiAgICAgIG9uQ2xvc2U6IHRoaXMuX2Nsb3NlLFxuICAgIH07XG5cbiAgICB0aGlzLmF0Y0NhbGxiYWNrcyA9IHtcbiAgICAgIG9uQ2xvc2U6IHRoaXMuX29uQVRDQ2xvc2UsXG4gICAgICBvbkluaXQ6IHRoaXMuX29uQVRDSW5pdCxcbiAgICAgIG9uRXJyb3I6IHRoaXMuX29uQVRDRXJyb3IsXG4gICAgICBvblN1Y2Nlc3M6IHRoaXMuX29uQVRDU3VjY2VzcyxcbiAgICB9O1xuXG4gICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChtb2RhbENhbGxiYWNrcyk7XG4gICAgdGhpcy5tb2RhbC5vcGVuKGBbZGF0YS1wcm9kdWN0LXF1aWNrc2hvcD1cIiR7dGhpcy5wcm9kdWN0LmlkfVwiXWAsIHRoaXMubW9kYWxDbGFzcyk7XG4gIH1cblxuICBfb3BlbigpIHtcbiAgICBpZiAodGhpcy5sb2FkZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4kZGVzY3JpcHRpb24ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHRoaXMuJGRlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgJGZvcm1BcmVhOiB0aGlzLiRmb3JtQXJlYSxcbiAgICAgICRnYWxsZXJ5OiB0aGlzLiRnYWxsZXJ5LFxuICAgICAgJGRldGFpbHM6IHRoaXMuJGRldGFpbHMsXG4gICAgICBhdGNDYWxsYmFja3M6IHRoaXMuYXRjQ2FsbGJhY2tzLFxuICAgICAgY29udGV4dDogdGhpcy5jb250ZXh0LFxuICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXG4gICAgICBwcm9kdWN0OiB0aGlzLnByb2R1Y3QsXG4gICAgICB1c2VIaXN0b3J5OiBmYWxzZSxcbiAgICB9O1xuXG4gICAgdGhpcy5wcm9kdWN0RGV0YWlscyA9IG5ldyBQcm9kdWN0RGV0YWlscyhvcHRpb25zKTtcbiAgfVxuXG4gIF9jbG9zZSgpIHtcbiAgICBpZiAodGhpcy5wcm9kdWN0RGV0YWlscykge1xuICAgICAgdGhpcy5wcm9kdWN0RGV0YWlscy51bmxvYWQoKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5yaWNoVGV4dCkge1xuICAgICAgdGhpcy5yaWNoVGV4dC51bmxvYWQoKTtcbiAgICB9XG5cbiAgICB0aGlzLl90b2dnbGVNZXNzYWdlKCcnLCBmYWxzZSk7XG4gICAgdGhpcy5tb2RhbC51bmxvYWQoKTtcbiAgfVxuXG4gIF90b2dnbGVNZXNzYWdlKG1lc3NhZ2UsIGlzVmlzaWJsZSkge1xuICAgIHRoaXMuJG1lc3NhZ2VcbiAgICAgIC5odG1sKG1lc3NhZ2UpXG4gICAgICAudG9nZ2xlQ2xhc3MoJ3Zpc2libGUnLCBpc1Zpc2libGUpO1xuICB9XG5cbiAgX29uQVRDQ2xvc2UoKSB7XG4gICAgcmVtb3ZlVHJhcEZvY3VzKHtcbiAgICAgIG5hbWVzcGFjZTogJ3Byb2R1Y3QtZGV0YWlscy1mbHlvdXQnLFxuICAgIH0pO1xuXG4gICAgdGhpcy4kZWwuZm9jdXMoKTtcbiAgfVxuXG4gIF9vbkFUQ0luaXQoKSB7XG4gICAgdGhpcy4kbWVzc2FnZS5yZW1vdmVDbGFzcygndmlzaWJsZScpO1xuICB9XG5cbiAgX29uQVRDRXJyb3IoZXJyb3IpIHtcbiAgICBjb25zdCAkY29udGVudCA9ICQoYDxkaXYgY2xhc3M9XCJwcm9kdWN0LW1lc3NhZ2UtLWVycm9yXCI+JHtlcnJvcn08L2Rpdj5gKTtcbiAgICB0aGlzLl90b2dnbGVNZXNzYWdlKCRjb250ZW50LCB0cnVlKTtcbiAgfVxuXG4gIF9vbkFUQ1N1Y2Nlc3MoKSB7XG4gICAgdGhpcy5fY2xvc2UoKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLl9jbG9zZSgpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuaW1wb3J0IGxheW91dCBmcm9tICcuLi9MYXlvdXQnO1xuaW1wb3J0IFByb2R1Y3RRdWlja3Nob3AgZnJvbSAnLi9Qcm9kdWN0UXVpY2tzaG9wJztcblxuaW1wb3J0IHt0cmFwRm9jdXMsIHJlbW92ZVRyYXBGb2N1c30gZnJvbSAnLi4vaGVscGVycy9hMTF5JztcbmltcG9ydCBBZGRUb0NhcnRGbHlvdXQgZnJvbSAnLi4vY29tcG9uZW50cy9BZGRUb0NhcnRGbHlvdXQnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQcm9kdWN0R3JpZEl0ZW0ge1xuICBjb25zdHJ1Y3RvcigkZWwpIHtcbiAgICB0aGlzLiRlbCA9ICRlbDtcbiAgICB0aGlzLnByb2R1Y3RRdWlja3Nob3AgPSBudWxsO1xuICAgIHRoaXMucXVpY2tCdXlTZXR0aW5ncyA9IG51bGw7XG4gICAgdGhpcy5ldmVudHMgPSBbXTtcblxuICAgIHRoaXMuJHdpbmRvdyA9ICQod2luZG93KTtcbiAgICB0aGlzLiRodG1sID0gJCgnaHRtbCcpO1xuICAgIHRoaXMuJGNvbnRlbnQgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1wcm9kdWN0LWl0ZW0tY29udGVudF0nKTtcbiAgICB0aGlzLiRhY3Rpb25zID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1hY3Rpb25zXScpO1xuICAgIHRoaXMuaGFzUHJvZHVjdEFjdGlvbnMgPSB0aGlzLiRhY3Rpb25zLmxlbmd0aDtcblxuICAgIHRoaXMuX2FkZFRvQ2FydCA9IHRoaXMuX2FkZFRvQ2FydC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FjdGlvbnNUb2dnbGUgPSB0aGlzLl9hY3Rpb25zVG9nZ2xlLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb3BlblF1aWNrU2hvcCA9IHRoaXMuX29wZW5RdWlja1Nob3AuYmluZCh0aGlzKTtcblxuICAgIHRoaXMuX29uQVRDT3BlbiA9IHRoaXMuX29uQVRDT3Blbi5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29uQVRDQ2xvc2UgPSB0aGlzLl9vbkFUQ0Nsb3NlLmJpbmQodGhpcyk7XG5cbiAgICBpZiAodGhpcy5oYXNQcm9kdWN0QWN0aW9ucykge1xuICAgICAgdGhpcy5fc2V0U29ydEJ5UXVlcnlQYXJhbWV0ZXJzKCk7XG5cbiAgICAgIGlmICh0aGlzLiRodG1sLmhhc0NsYXNzKCduby10b3VjaCcpICYmIFNob3BpZnkucXVlcnlQYXJhbXMuZ3JpZF9saXN0ICE9PSAnbGlzdC12aWV3Jykge1xuICAgICAgICB0aGlzLmV2ZW50cy5wdXNoKHRoaXMuJGVsLm9uKCdtb3VzZWVudGVyLnByb2R1Y3QtaXRlbScsIHRoaXMuX2FjdGlvbnNUb2dnbGUpKTtcbiAgICAgICAgdGhpcy5ldmVudHMucHVzaCh0aGlzLiRlbC5vbignbW91c2VsZWF2ZS5wcm9kdWN0LWl0ZW0nLCB0aGlzLl9hY3Rpb25zVG9nZ2xlKSk7XG4gICAgICB9XG5cbiAgICAgIC8vJHNjcmlwdHMgY2hlY2tzIGV4aXN0ZW5jZSBvZiBzY3JpcHQgaW4gaGVhZGVyIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGluamVjdFxuICAgICAgJHNjcmlwdCgkKCdbZGF0YS1zY3JpcHRzXScpLmRhdGEoJ3Nob3BpZnktYXBpLXVybCcpLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2godGhpcy4kZWwub24oJ2NsaWNrLnByb2R1Y3QtaXRlbScsICdbZGF0YS1xdWljay1idXldJywgdGhpcy5fYWRkVG9DYXJ0KSk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2godGhpcy4kZWwub24oJ2NsaWNrLnByb2R1Y3QtaXRlbScsICdbZGF0YS1xdWlja3Nob3Atc2xpbV0nLCB0aGlzLl9vcGVuUXVpY2tTaG9wKSk7XG4gICAgICAgIHRoaXMuZXZlbnRzLnB1c2godGhpcy4kZWwub24oJ2NsaWNrLnByb2R1Y3QtaXRlbScsICdbZGF0YS1xdWlja3Nob3AtZnVsbF0nLCB0aGlzLl9vcGVuUXVpY2tTaG9wKSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4kZWwuZmluZCgnW2RhdGEtcXVpY2stYnV5XScpLmxlbmd0aCkge1xuICAgICAgdGhpcy5faW5pdFF1aWNrQnV5KCk7XG4gICAgfVxuXG4gICAgdGhpcy5fb2JqZWN0Rml0UG9seWZpbGwoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYWtlIFNob3BpZnkgYXdhcmUgb2YgcmVsZWF2ZW50IGNvbGxlY3Rpb24gc2VhcmNoIGluZm9cbiAgICogIC0gdGFnXG4gICAqICAtIHZlbmRvclxuICAgKiAgLSBwYWdpbmF0aW9uXG4gICAqICAtIHNvcnRpbmcgY3JpdGVyaWFcbiAgICpcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9zZXRTb3J0QnlRdWVyeVBhcmFtZXRlcnMoKSB7XG4gICAgU2hvcGlmeS5xdWVyeVBhcmFtcyA9IHt9O1xuICAgIGlmIChsb2NhdGlvbi5zZWFyY2gubGVuZ3RoKSB7XG4gICAgICBmb3IgKGxldCBpID0gMCwgYUNvdXBsZXMgPSBsb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KCcmJyk7IGkgPCBhQ291cGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhS2V5VmFsdWUgPSBhQ291cGxlc1tpXS5zcGxpdCgnPScpO1xuICAgICAgICAvLyBSZXNldCB0aGUgcGFnZSBudW1iZXIgd2hlbiB3ZSBhcHBseSAoaS5lLiBkb24ndCBhZGQgaXQgdG8gcGFyYW1zKVxuICAgICAgICBpZiAoYUtleVZhbHVlLmxlbmd0aCA+IDEgJiYgYUtleVZhbHVlWzBdICE9PSAncGFnZScpIHtcbiAgICAgICAgICBTaG9waWZ5LnF1ZXJ5UGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudChhS2V5VmFsdWVbMF0pXSA9IGRlY29kZVVSSUNvbXBvbmVudChhS2V5VmFsdWVbMV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgX2luaXRRdWlja0J1eSgpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5xdWlja0J1eVNldHRpbmdzID0gSlNPTi5wYXJzZSh0aGlzLiRlbC5maW5kKCdbZGF0YS1xdWljay1idXktc2V0dGluZ3NdJykudGV4dCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGNvbnNvbGUud2FybihgUXVpY2sgYnV5OiBpbnZhbGlkIFF1aWNrQnV5IGRhdGEgZm91bmQuICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICBfb3BlblF1aWNrU2hvcChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCBtb2RhbENsYXNzID0gZXZlbnQuY3VycmVudFRhcmdldC5oYXNBdHRyaWJ1dGUoJ2RhdGEtcXVpY2tzaG9wLWZ1bGwnKVxuICAgICAgPyAncXVpY2tzaG9wLWZ1bGwnXG4gICAgICA6ICdxdWlja3Nob3Atc2xpbSc7XG5cbiAgICBpZiAodGhpcy5wcm9kdWN0UXVpY2tzaG9wKSB7XG4gICAgICB0aGlzLnByb2R1Y3RRdWlja3Nob3AudW5sb2FkKCk7XG4gICAgfVxuXG4gICAgdGhpcy5wcm9kdWN0UXVpY2tzaG9wID0gbmV3IFByb2R1Y3RRdWlja3Nob3Aoe1xuICAgICAgJGVsOiB0aGlzLiRlbCxcbiAgICAgIG1vZGFsQ2xhc3MsXG4gICAgfSk7XG4gIH1cblxuICBfaXNPYmplY3RGaXRBdmFpbGFibGUoKSB7XG4gICAgcmV0dXJuICdvYmplY3RGaXQnIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZTtcbiAgfVxuXG4gIF9vYmplY3RGaXRQb2x5ZmlsbCgpIHtcbiAgICBpZiAodGhpcy5faXNPYmplY3RGaXRBdmFpbGFibGUoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0ICRpbWFnZSA9ICQoJ1tkYXRhLXByb2R1Y3QtaXRlbS1pbWFnZV0nLCB0aGlzLiRlbCk7XG4gICAgY29uc3Qgc3JjID0gJCgnaW1nJywgJGltYWdlKS5hdHRyKCdzcmMnKTtcblxuICAgICRpbWFnZS5hZGRDbGFzcygncHJvZHVjdC1pdGVtLWltYWdlLW5vLW9iamVjdGZpdCcpO1xuICAgICRpbWFnZS5jc3MoJ2JhY2tncm91bmQtaW1hZ2UnLCBgdXJsKFwiJHsgc3JjIH1cIilgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaGVpZ2h0IG9mIGVsZW1lbnQsIGFuZCBjb21iaW5lZCBoZWlnaHQgb2YgZWxlbWVudCArIGFjdGlvbnNcbiAgICpcbiAgICogQHJldHVybnMge3toZWlnaHRCYXNlLCBoZWlnaHRFeHBhbmRlZDogKn19XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZ2V0SGVpZ2h0cygpIHtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLiRlbC5oZWlnaHQoKTtcbiAgICBjb25zdCBhY3Rpb25zSGVpZ2h0ID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1hY3Rpb25zXScpLm91dGVySGVpZ2h0KHRydWUpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGhlaWdodEJhc2U6IGhlaWdodCxcbiAgICAgIGhlaWdodEV4cGFuZGVkIDogaGVpZ2h0ICsgYWN0aW9uc0hlaWdodCxcbiAgICB9O1xuICB9XG5cbiAgX2FjdGlvbnNUb2dnbGUoZXZlbnQpIHtcbiAgICBpZiAoIWxheW91dC5pc0JyZWFrcG9pbnQoJ0wnKSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgb3BlbiA9IGV2ZW50LnR5cGUgPT09ICdtb3VzZWVudGVyJztcblxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLl9zaG93QWN0aW9ucygpO1xuICAgIH1cblxuICAgIGlmICghb3Blbikge1xuICAgICAgdGhpcy5faGlkZUFjdGlvbnMoKTtcbiAgICB9XG4gIH1cblxuICBfc2hvd0FjdGlvbnMoKSB7XG4gICAgaWYgKHRoaXMuJGVsLnJldmVhbGVyKCdpc1Zpc2libGUnKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2hpZGVBY3Rpb25zKCk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBoZWlnaHRCYXNlLCBoZWlnaHRFeHBhbmRlZCB9ID0gdGhpcy5fZ2V0SGVpZ2h0cygpO1xuXG4gICAgLy8gTG9jayBoZWlnaHRzIHRvIHByZXZlbnQganVtcGluZ1xuICAgIHRoaXMuJGVsLmNzcygnaGVpZ2h0JywgaGVpZ2h0QmFzZSk7XG4gICAgdGhpcy4kY29udGVudC5jc3MoJ2hlaWdodCcsIGhlaWdodEJhc2UpO1xuXG4gICAgLy8gU3RvcmUgaGVpZ2h0IGZvciB3aGVuIGhvdmVyaW5nIG91dFxuICAgIHRoaXMuJGVsLmRhdGEoJ2Jhc2UtaGVpZ2h0JywgaGVpZ2h0QmFzZSk7XG5cbiAgICAvLyBTdGFydCBhbmltYXRpb24sIGFuZCB0cmFuc2l0aW9uIGhlaWdodCB0byBleHBhbmRlZCBoZWlnaHRcbiAgICB0aGlzLiRlbFxuICAgICAgLnJldmVhbGVyKCdzaG93JylcbiAgICAgIC5vbmUoJ3JldmVhbGVyLWFuaW1hdGluZy5wcm9kdWN0LWl0ZW0nLCAoKSA9PiB7XG4gICAgICAgIHRoaXMuJGNvbnRlbnQuY3NzKCdoZWlnaHQnLCBoZWlnaHRFeHBhbmRlZCk7XG4gICAgICB9KTtcbiAgfVxuXG4gIF9oaWRlQWN0aW9ucygpIHtcbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLiRlbC5kYXRhKCdiYXNlLWhlaWdodCcpO1xuXG4gICAgLypcbiAgICAgIC0gVHJhbnNpdGlvbiBidXR0b25zIHVwLCB1c2luZyBiYXNlIGhlaWdodCBmb3IgYW5pbWF0aW9uXG4gICAgICAtIFJlbW92ZSBoZWlnaHRzIGFmdGVyIGFuaW1hdGlvbiBpcyBjb21wbGV0ZSBpbiBjYXNlIG9mIHJlc2l6ZVxuICAgICAqL1xuICAgIHRoaXMuJGVsXG4gICAgICAucmV2ZWFsZXIoJ2hpZGUnKVxuICAgICAgLm9uZSgncmV2ZWFsZXItYW5pbWF0aW5nJywgKCkgPT4ge1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ3JldmVhbGVyLWFuaW1hdGluZy5wcm9kdWN0LWl0ZW0nKTtcbiAgICAgICAgdGhpcy4kZWwuY3NzKHsgaGVpZ2h0IH0pO1xuICAgICAgICB0aGlzLiRjb250ZW50LmNzcyh7IGhlaWdodCB9KTtcbiAgICAgIH0pLm9uZSgncmV2ZWFsZXItaGlkZScsICgpID0+IHtcbiAgICAgICAgdGhpcy4kZWxcbiAgICAgICAgICAub2ZmKCdyZXZlYWxlci1oaWRlLnByb2R1Y3QtaXRlbScpXG4gICAgICAgICAgLmNzcygnaGVpZ2h0JywgJycpO1xuICAgICAgICB0aGlzLiRjb250ZW50LmNzcygnaGVpZ2h0JywgJycpO1xuICAgICAgfSk7XG4gIH1cblxuICBfYWRkVG9DYXJ0KGV2ZW50KSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBjb25zdCAkYXRjQnV0dG9uID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICBjb25zdCB2YXJpYW50SUQgPSAkYXRjQnV0dG9uLmF0dHIoJ2RhdGEtdmFyaWFudC1pZCcpO1xuXG4gICAgY29uc3QgZm9ybURhdGEgPSBbXG4gICAgICB7XG4gICAgICAgICduYW1lJzogJ2lkJyxcbiAgICAgICAgJ3ZhbHVlJzogdmFyaWFudElELFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ25hbWUnOiAncXVhbnRpdHknLFxuICAgICAgICAndmFsdWUnOiAxLFxuICAgICAgfSxcbiAgICBdO1xuXG4gICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICRhdGNCdXR0b24sXG4gICAgICBzZXR0aW5nczoge1xuICAgICAgICBtb25leUZvcm1hdDogdGhpcy5xdWlja0J1eVNldHRpbmdzLm1vbmV5X2Zvcm1hdCxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGNhbGxiYWNrcyA9IHtcbiAgICAgIG9uT3BlbjogdGhpcy5fb25BVENPcGVuLFxuICAgICAgb25DbG9zZTogdGhpcy5fb25BVENDbG9zZSxcbiAgICB9O1xuXG4gICAgQWRkVG9DYXJ0Rmx5b3V0LmluaXQoZm9ybURhdGEsIG9wdGlvbnMsIGNhbGxiYWNrcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBBZGRUb0NhcnRGbHlvdXQgb3BlbnNcbiAgICogTW92ZSBrZXlib2FyZCBmb2N1cyBpbnRvIGZseW91dFxuICAgKlxuICAgKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIE9wdGlvbnMgdG8gYmUgdXNlZFxuICAgKiBAcGFyYW0ge2pRdWVyeX0gb3B0aW9ucy4kY29udGFpbmVyIC0gQ29udGFpbmVyIHRvIHRyYXAgZm9jdXMgd2l0aGluXG4gICAqIEBwYXJhbSB7alF1ZXJ5fSBvcHRpb25zLiRlbGVtZW50VG9Gb2N1cyAtIEVsZW1lbnQgdG8gYmUgZm9jdXNlZCB3aGVuIGZvY3VzIGxlYXZlcyBjb250YWluZXJcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9vbkFUQ09wZW4ob3B0aW9ucykge1xuICAgIHRyYXBGb2N1cyh7XG4gICAgICAkY29udGFpbmVyOiBvcHRpb25zLiRjb250YWluZXIsXG4gICAgICAkZWxlbWVudFRvRm9jdXM6IG9wdGlvbnMuJGVsZW1lbnRUb0ZvY3VzLFxuICAgICAgbmFtZXNwYWNlOiAncHJvZHVjdC1pdGVtLWZseW91dCcsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGJhY2sgd2hlbiBBZGRUb0NhcnRGbHlvdXQgY2xvc2VzXG4gICAqIE1vdmUga2V5Ym9hcmQgZm9jdXMgYmFjayBpbnRvIGdyaWQgaXRlbVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uQVRDQ2xvc2UoKSB7XG4gICAgcmVtb3ZlVHJhcEZvY3VzKHtcbiAgICAgIG5hbWVzcGFjZTogJ3Byb2R1Y3QtaXRlbS1mbHlvdXQnLFxuICAgIH0pO1xuXG4gICAgdGhpcy4kZWwuZm9jdXMoKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICB0aGlzLmV2ZW50cy5mb3JFYWNoKCRlbCA9PiAkZWwub2ZmKCcucHJvZHVjdC1pdGVtJykpO1xuXG4gICAgaWYgKHRoaXMucHJvZHVjdFF1aWNrc2hvcCkge1xuICAgICAgdGhpcy5wcm9kdWN0UXVpY2tzaG9wLnVubG9hZCgpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFJlY2VudGx5Vmlld2VkIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcbiAgICB0aGlzLnJlY2VudGx5Vmlld2VkID0gc2VjdGlvbi5kYXRhLnJlY2VudGx5X3ZpZXdlZF9pbmZvO1xuICAgIHRoaXMudGltZSA9IHNlY3Rpb24uZGF0YS50aW1lO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMucmVjZW50bHlWaWV3ZWQgJiYgdGhpcy50aW1lKSB7XG4gICAgICB0aGlzLnJlY2VudGx5Vmlld2VkLnRpbWVzdGFtcCA9IE1hdGgucm91bmQoKG5ldyBEYXRlKCkpLmdldFRpbWUoKSAvIDEwMDApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRpbWUpIHtcbiAgICAgIGxldCByZWNlbnRseVZpZXdlZCA9IFtdO1xuXG4gICAgICBpZiAoSlNPTi5wYXJzZShsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgncmVjZW50bHlWaWV3ZWQnKSkgIT09IG51bGwpIHtcbiAgICAgICAgcmVjZW50bHlWaWV3ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWNlbnRseVZpZXdlZCcpKTtcblxuICAgICAgICBmb3IgKGxldCBpID0gcmVjZW50bHlWaWV3ZWQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICBjb25zdCB0aW1lU2luY2UgPSB0aGlzLnRpbWVTaW5jZShyZWNlbnRseVZpZXdlZFtpXS50aW1lc3RhbXApO1xuXG4gICAgICAgICAgdGhpcy4kZWwuZmluZCgnW2RhdGEtcmVjZW50bHktdmlld2VkLWNvbnRhaW5lcl0nKS5hcHBlbmQoXG4gICAgICAgICAgICBgPGRpdiBjbGFzcz1cInByb2R1Y3QtcmVjZW50bHktdmlld2VkLWNhcmRcIlxuICAgICAgICAgICAgICBkYXRhLXJlY2VudGx5LXZpZXdlZC1jYXJkXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXJlY2VudGx5LXZpZXdlZC1jYXJkLXRpbWVcIj5cbiAgICAgICAgICAgICAgICAke3RpbWVTaW5jZX1cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1yZWNlbnRseS12aWV3ZWQtY2FyZC1yZW1vdmVcIlxuICAgICAgICAgICAgICAgICAgZGF0YS1yZW1vdmUtcmVjZW50bHktdmlld2VkPVwiJHtyZWNlbnRseVZpZXdlZFtpXS5oYW5kbGV9XCI+XG4gICAgICAgICAgICAgICAgICA8c3ZnXG4gICAgICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgIGZvY3VzYWJsZT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgICAgICAgcm9sZT1cInByZXNlbnRhdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiMTBcIlxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCIxMFwiXG4gICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9XCIwIDAgMTAgMTBcIlxuICAgICAgICAgICAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHBhdGggZD1cIk02LjA4Nzg1NjU5LDUgTDkuNzc0Njk3NTIsMS4zMTMxNTkwNiBMOC42ODY4NDA5NCwwLjIyNTMwMjQ3NiBMNSwzLjkxMjE0MzQxIEwxLjMxMzE1OTA2LDAuMjI1MzAyNDc2IEwwLjIyNTMwMjQ3NiwxLjMxMzE1OTA2IEwzLjkxMjE0MzQxLDUgTDAuMjI1MzAyNDc2LDguNjg2ODQwOTQgTDEuMzEzMTU5MDYsOS43NzQ2OTc1MiBMNSw2LjA4Nzg1NjU5IEw4LjY4Njg0MDk0LDkuNzc0Njk3NTIgTDkuNzc0Njk3NTIsOC42ODY4NDA5NCBMNi4wODc4NTY1OSw1IFpcIj48L3BhdGg+XG4gICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxhIGhyZWY9XCIke3JlY2VudGx5Vmlld2VkW2ldLmxpbmt9XCI+XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgY2xhc3M9XCJwcm9kdWN0LXJlY2VudGx5LXZpZXdlZC1jYXJkLWltYWdlLXdyYXBwZXIgcHJvZHVjdGl0ZW0tLWltYWdlXCJcbiAgICAgICAgICAgICAgICAgIHN0eWxlPVwiYmFja2dyb3VuZC1pbWFnZTogdXJsKCR7cmVjZW50bHlWaWV3ZWRbaV0uaW1hZ2V9KVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cInByb2R1Y3QtcmVjZW50bHktdmlld2VkLWNhcmQtaW1hZ2VcIiBzcmM9XCIke3JlY2VudGx5Vmlld2VkW2ldLmltYWdlfVwiPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LXJlY2VudGx5LXZpZXdlZC1jYXJkLXByaWNlXCI+XG4gICAgICAgICAgICAgICAgJHtyZWNlbnRseVZpZXdlZFtpXS5wcmljZX1cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgaHJlZj1cIiR7cmVjZW50bHlWaWV3ZWRbaV0ubGlua31cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwicHJvZHVjdC1yZWNlbnRseS12aWV3ZWQtY2FyZC10aXRsZVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAke3JlY2VudGx5Vmlld2VkW2ldLnRpdGxlfVxuICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucmVjZW50bHlWaWV3ZWQpIHtcbiAgICAgICAgICB0aGlzLnJlbW92ZVJlY2VudGx5Vmlld2VkKHRoaXMucmVjZW50bHlWaWV3ZWQuaGFuZGxlLCByZWNlbnRseVZpZXdlZCk7XG5cbiAgICAgICAgICByZWNlbnRseVZpZXdlZC5wdXNoKHRoaXMucmVjZW50bHlWaWV3ZWQpO1xuICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWNlbnRseVZpZXdlZCcsIEpTT04uc3RyaW5naWZ5KHJlY2VudGx5Vmlld2VkKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiRjYXJvdXNlbCA9IHRoaXMuJGVsLmZpbmQoJy5wcm9kdWN0LXJlY2VudGx5LXZpZXdlZC0tY29udGVudCcpO1xuICAgICAgICB0aGlzLnNsaWRlcyA9ICcucHJvZHVjdC1yZWNlbnRseS12aWV3ZWQtY2FyZCc7XG5cbiAgICAgICAgaWYgKHRoaXMuJGNhcm91c2VsLmZpbmQodGhpcy5zbGlkZXMpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0aGlzLl9pbml0U2xpZGVyKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLnJlY2VudGx5Vmlld2VkKSB7XG4gICAgICAgICAgcmVjZW50bHlWaWV3ZWQucHVzaCh0aGlzLnJlY2VudGx5Vmlld2VkKTtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVjZW50bHlWaWV3ZWQnLCBKU09OLnN0cmluZ2lmeShyZWNlbnRseVZpZXdlZCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy4kZWwuZmluZCgnLnByb2R1Y3QtcmVjZW50bHktdmlld2VkLS1zZWN0aW9uJykuYWRkQ2xhc3MoJ2hpZGUnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmJpbmRFdmVudHMoKTtcbiAgfVxuXG4gIGJpbmRFdmVudHMoKSB7XG4gICAgdGhpcy4kZWwub24oJ2NsaWNrJywgJ1tkYXRhLXJlbW92ZS1yZWNlbnRseS12aWV3ZWRdJywgKGV2ZW50KSA9PiB7XG4gICAgICBjb25zdCAkdGFyZ2V0ID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICAgIGNvbnN0IGhhbmRsZSA9ICR0YXJnZXQuZGF0YSgncmVtb3ZlLXJlY2VudGx5LXZpZXdlZCcpO1xuICAgICAgY29uc3QgcmVjZW50bHlWaWV3ZWQgPSBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdyZWNlbnRseVZpZXdlZCcpKTtcblxuICAgICAgdGhpcy5yZW1vdmVSZWNlbnRseVZpZXdlZChoYW5kbGUsIHJlY2VudGx5Vmlld2VkKTtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdyZWNlbnRseVZpZXdlZCcsIEpTT04uc3RyaW5naWZ5KHJlY2VudGx5Vmlld2VkKSk7XG5cbiAgICAgICR0YXJnZXQucGFyZW50cygnW2RhdGEtcmVjZW50bHktdmlld2VkLWNhcmRdJykuYWRkQ2xhc3MoJ2hpZGUtY2FyZCcpO1xuICAgICAgJHRhcmdldC5wYXJlbnRzKCdbZGF0YS1yZWNlbnRseS12aWV3ZWQtY2FyZF0nKS5uZXh0QWxsKCkuYWRkQ2xhc3MoJ21vdmUtY2FyZCcpO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgbGV0IGluZGV4ID0gJHRhcmdldC5wYXJlbnRzKCdbZGF0YS1yZWNlbnRseS12aWV3ZWQtY2FyZF0nKS5pbmRleCgpO1xuICAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgaW5kZXgtLTtcbiAgICAgICAgIH1cblxuICAgICAgICAkdGFyZ2V0LnBhcmVudHMoJ1tkYXRhLXJlY2VudGx5LXZpZXdlZC1jYXJkXScpLm5leHRBbGwoKS5yZW1vdmVDbGFzcygnbW92ZS1jYXJkJyk7XG4gICAgICAgIHRoaXMuZmxpY2tpdHkucmVtb3ZlKCR0YXJnZXQucGFyZW50cygnW2RhdGEtcmVjZW50bHktdmlld2VkLWNhcmRdJykpO1xuICAgICAgICB0aGlzLmZsaWNraXR5LnNlbGVjdENlbGwoaW5kZXgpO1xuICAgICAgfSwgNTAwKTtcbiAgICB9KTtcblxuICAgIHRoaXMuJGVsLm9uKCdjbGljaycsICdbZGF0YS1jbGVhci1yZWNlbnRseS12aWV3ZWRdJywgKGV2ZW50KSA9PiB7XG4gICAgICB0aGlzLmNsZWFyUmVjZW50bHlWaWV3ZWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRpbWVTaW5jZSh0aW1lc3RhbXApIHtcbiAgICBjb25zdCBub3cgPSBNYXRoLnJvdW5kKChuZXcgRGF0ZSgpKS5nZXRUaW1lKCkgLyAxMDAwKTtcbiAgICBjb25zdCBzZWNvbmRzUGFzdCA9IG5vdyAtIHRpbWVzdGFtcDtcblxuICAgIGlmKHNlY29uZHNQYXN0IDwgNjApe1xuICAgICAgY29uc3Qgc2Vjb25kc0FnbyA9IHBhcnNlSW50KHNlY29uZHNQYXN0KTtcblxuICAgICAgcmV0dXJuIHNlY29uZHNBZ28gPT09IDEgP1xuICAgICAgICBgJHtzZWNvbmRzQWdvfSAke3RoaXMudGltZS5zZWNvbmR9ICR7dGhpcy50aW1lLmFnb31gIDpcbiAgICAgICAgYCR7c2Vjb25kc0Fnb30gJHt0aGlzLnRpbWUuc2Vjb25kc30gJHt0aGlzLnRpbWUuYWdvfWA7XG4gICAgfVxuXG4gICAgaWYoc2Vjb25kc1Bhc3QgPCAzNjAwKXtcbiAgICAgIGNvbnN0IG1pbnV0ZXNBZ28gPSBwYXJzZUludChzZWNvbmRzUGFzdC82MCk7XG5cbiAgICAgIHJldHVybiBtaW51dGVzQWdvID09PSAxID9cbiAgICAgICAgYCR7bWludXRlc0Fnb30gJHt0aGlzLnRpbWUubWludXRlfSAke3RoaXMudGltZS5hZ299YCA6XG4gICAgICAgIGAke21pbnV0ZXNBZ299ICR7dGhpcy50aW1lLm1pbnV0ZXN9ICR7dGhpcy50aW1lLmFnb31gO1xuICAgIH1cblxuICAgIGlmKHNlY29uZHNQYXN0IDw9IDg2NDAwKXtcbiAgICAgIGNvbnN0IGhvdXJzQWdvID0gcGFyc2VJbnQoc2Vjb25kc1Bhc3QvMzYwMCk7XG5cbiAgICAgIHJldHVybiBob3Vyc0FnbyA9PT0gMSA/XG4gICAgICAgIGAke2hvdXJzQWdvfSAke3RoaXMudGltZS5ob3VyfSAke3RoaXMudGltZS5hZ299YCA6XG4gICAgICAgIGAke2hvdXJzQWdvfSAke3RoaXMudGltZS5ob3Vyc30gJHt0aGlzLnRpbWUuYWdvfWA7XG4gICAgfVxuXG4gICAgaWYoc2Vjb25kc1Bhc3QgPiA4NjQwMCl7XG4gICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUodGltZXN0YW1wKTtcbiAgICAgIGNvbnN0IGN1cnJlbnREYXRlID0gbmV3IERhdGUobm93KTtcbiAgICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgICAgY29uc3QgbW9udGggPSBkYXRlLnRvRGF0ZVN0cmluZygpLm1hdGNoKC8gW2EtekEtWl0qLylbMF0ucmVwbGFjZSgnICcsICcnKTtcbiAgICAgIGNvbnN0IHllYXIgPSBkYXRlLmdldEZ1bGxZZWFyKCkgPT0gY3VycmVudERhdGUuZ2V0RnVsbFllYXIoKSA/ICcnIDogIGAsICR7ZGF0ZS5nZXRGdWxsWWVhcigpfWA7XG5cbiAgICAgIHJldHVybiBgJHttb250aH0gJHtkYXl9ICR7eWVhcn1gO1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZVJlY2VudGx5Vmlld2VkKGhhbmRsZSwgcmVjZW50bHlWaWV3ZWQpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY2VudGx5Vmlld2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVjZW50bHlWaWV3ZWRbaV0uaGFuZGxlID09PSBoYW5kbGUpIHtcbiAgICAgICAgcmVjZW50bHlWaWV3ZWQuc3BsaWNlKGksIDEpO1xuXG4gICAgICAgIGlmIChyZWNlbnRseVZpZXdlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aGlzLiRlbC5maW5kKCcucHJvZHVjdC1yZWNlbnRseS12aWV3ZWQtLXNlY3Rpb24nKS5hZGRDbGFzcygnaGlkZScpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2xlYXJSZWNlbnRseVZpZXdlZCgpIHtcbiAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgncmVjZW50bHlWaWV3ZWQnLCBudWxsKTtcbiAgICB0aGlzLiRlbC5maW5kKCdbZGF0YS1yZWNlbnRseS12aWV3ZWQtY2FyZF0nKS5yZW1vdmUoKTtcbiAgICB0aGlzLiRlbC5maW5kKCcucHJvZHVjdC1yZWNlbnRseS12aWV3ZWQtLXNlY3Rpb24nKS5hZGRDbGFzcygnaGlkZScpO1xuICB9XG5cbiAgX2luaXRTbGlkZXIoKSB7XG4gICAgdGhpcy5mbGlja2l0eU9wdGlvbnMgPSB7XG4gICAgICBhdXRvUGxheTogMCxcbiAgICAgIGFjY2Vzc2liaWxpdHk6IHRydWUsXG4gICAgICBjZWxsQWxpZ246ICdsZWZ0JyxcbiAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zbGlkZXMsXG4gICAgICBncm91cENlbGxzOiB0cnVlLFxuICAgICAgaW1hZ2VzTG9hZGVkOiB0cnVlLFxuICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgY29udGFpbjogdHJ1ZSxcbiAgICAgIGFycm93U2hhcGU6IHtcbiAgICAgICAgeDA6IDEwLFxuICAgICAgICB4MTogNjAsIHkxOiA1MCxcbiAgICAgICAgeDI6IDY1LCB5MjogNDUsXG4gICAgICAgIHgzOiAyMFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuJGNhcm91c2VsWzBdLCB0aGlzLmZsaWNraXR5T3B0aW9ucyk7XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZmxpY2tpdHkucmVzaXplKCk7XG4gICAgfSwgMTAwKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2VsZWN0V2lkdGgge1xuICBjb25zdHJ1Y3Rvcigkc2VsZWN0KSB7XG4gICAgdGhpcy4kc2VsZWN0ID0gJHNlbGVjdDtcbiAgICB0aGlzLiRodG1sID0gJCgnaHRtbCcpO1xuICAgIHRoaXMuJGJvZHkgPSAkKCdib2R5Jyk7XG5cbiAgICB0aGlzLl9hZGp1c3RXaWR0aCA9IHRoaXMuX2FkanVzdFdpZHRoLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLiRzZWxlY3Qub24oJ2NoYW5nZS5zZWxlY3QnLCB0aGlzLl9hZGp1c3RXaWR0aCk7XG5cbiAgICAvLyBVcGRhdGUgd2lkdGggb2YgPHNlbGVjdD4gb24gbG9hZFxuICAgIHRoaXMuX2FkanVzdFdpZHRoKCk7XG4gIH1cblxuICB1bmxvYWQoKSB7XG4gICAgdGhpcy4kc2VsZWN0Lm9mZignLnNlbGVjdCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkanVzdCBzZWxlY3QgdG8gaGF2ZSB3aWR0aCBlcXVhbCB0byBpdHMgc2VsZWN0ZWQgb3B0aW9uXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfYWRqdXN0V2lkdGgoKSB7XG4gICAgY29uc3Qgc2VsZWN0ZWRUZXh0ID0gdGhpcy4kc2VsZWN0LmZpbmQoJzpzZWxlY3RlZCcpLnRleHQoKTtcbiAgICBjb25zdCAkc2VsZWN0ID0gdGhpcy4kc2VsZWN0LnBhcmVudCgpLmNsb25lKCk7XG5cbiAgICBjb25zdCBhZGRpdGlvbmFsU3R5bGVzID0ge1xuICAgICAgcG9zaXRpb246ICdhYnNvbHV0ZScsXG4gICAgICBib3R0b206ICctMTAwJScsXG4gICAgICBsZWZ0OiAnLTEwMCUnLFxuICAgICAgZGlzcGxheTogJ2lubGluZS1ibG9jaycsXG4gICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJyxcbiAgICB9O1xuXG4gICAgLy8gUmVwbGFjZSBjb250ZW50cyBvZiBjb3BpZWQgPHNlbGVjdD4gd2l0aCBzZWxlY3RlZCB0ZXh0LCBhbmQgYWRkaXRpb25hbCBzdHlsZXNcbiAgICAkc2VsZWN0XG4gICAgICAuY3NzKGFkZGl0aW9uYWxTdHlsZXMpXG4gICAgICAuZmluZCgnc2VsZWN0JylcbiAgICAgIC5jc3MoJ3dpZHRoJywgJycpIC8vIFJlbW92ZSBhbnkgd2lkdGggYXBwbGllZCBmcm9tIHByZXZpb3VzIHdpdGggYXNzaWdubWVudFxuICAgICAgLmh0bWwoYDxvcHRpb24+JHtzZWxlY3RlZFRleHR9PC9vcHRpb24+YCk7XG4gICAgdGhpcy4kYm9keS5hcHBlbmQoJHNlbGVjdCk7XG5cbiAgICBjb25zdCB3aWR0aCA9ICRzZWxlY3Qub3V0ZXJXaWR0aCh0cnVlKTtcbiAgICAkc2VsZWN0LnJlbW92ZSgpO1xuXG4gICAgdGhpcy4kc2VsZWN0LmNzcyh7d2lkdGh9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBDdXJyZW5jeUNvbnZlcnRlciBmcm9tICdzaG9waWZ5LWN1cnJlbmN5LWNvbnZlcnRlcic7XG5cbmltcG9ydCBQcm9kdWN0R3JpZEl0ZW0gZnJvbSAnLi4vY29tcG9uZW50cy9Qcm9kdWN0R3JpZEl0ZW0nO1xuaW1wb3J0IFJlY2VudGx5Vmlld2VkIGZyb20gJy4uL2NvbXBvbmVudHMvUmVjZW50bHlWaWV3ZWQnO1xuaW1wb3J0IFNlbGVjdFdpZHRoIGZyb20gJy4uL2hlbHBlcnMvU2VsZWN0V2lkdGgnO1xuaW1wb3J0IE1vZGFsIGZyb20gJy4uL2NvbXBvbmVudHMvTW9kYWwnO1xuaW1wb3J0IGxheW91dCBmcm9tICcuLi9MYXlvdXQnO1xuaW1wb3J0IHt0cmFwRm9jdXMsIHJlbW92ZVRyYXBGb2N1c30gZnJvbSAnLi4vaGVscGVycy9hMTF5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljQ29sbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uO1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcbiAgICB0aGlzLmNvbnRleHQgPSBzZWN0aW9uLmRhdGEuY29udGV4dDtcbiAgICB0aGlzLnNvcnRXaWR0aCA9IG51bGw7XG4gICAgdGhpcy4kZm9jdXNJdGVtID0gbnVsbDtcblxuICAgIHRoaXMuZmlsdGVyc0NvbnRlbnQgPSAnW2RhdGEtcHJvZHVjdGdyaWQtZmlsdGVycy1jb250ZW50XSc7XG4gICAgdGhpcy5zb3J0Q29udGVudCA9ICdbZGF0YS1wcm9kdWN0Z3JpZC1zb3J0LWNvbnRlbnRdJztcbiAgICB0aGlzLiRzb3J0VHJpZ2dlciA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3RncmlkLXRyaWdnZXItc29ydF0nKTtcbiAgICB0aGlzLiRzb3J0VHJpZ2dlckJ1dHRvbiA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3RncmlkLXRyaWdnZXItc29ydC1idXR0b25dJyk7XG4gICAgdGhpcy4kc29ydFRyaWdnZXJNb2RhbCA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3RncmlkLW1vZGFsLXNvcnRdJyk7XG4gICAgdGhpcy4kZmlsdGVyc1RyaWdnZXIgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1wcm9kdWN0Z3JpZC10cmlnZ2VyLWZpbHRlcnNdJyk7XG4gICAgdGhpcy4kYWxsVGFncyA9IHRoaXMuJGVsLmZpbmQoYCR7dGhpcy5maWx0ZXJzQ29udGVudH0gLmZpbHRlci1pdGVtIGE6bm90KFtkYXRhLWZpbHRlci10b2dnbGVdKWApO1xuICAgIHRoaXMuJGFkdmFuZGVkVGFncyA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXRhZy1hZHZhbmNlZF0gYScpO1xuICAgIHRoaXMuJGFkZGl0aW9uYWxUYWdzID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtZmlsdGVyLXRvZ2dsZV0nKTtcbiAgICB0aGlzLiRncmlkVmlld1RvZ2dsZSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLWNvbGxlY3Rpb24tZ3JpZC12aWV3XScpO1xuICAgIHRoaXMuJGxpc3RWaWV3VG9nZ2xlID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtY29sbGVjdGlvbi1saXN0LXZpZXddJyk7XG4gICAgdGhpcy4kZ3JpZENvbnRhaW5lciA9IHRoaXMuJGVsLmZpbmQoJy5wcm9kdWN0Z3JpZC0tb3V0ZXInKTtcblxuICAgIHRoaXMuX2NoYW5nZVNvcnRpbmcgPSB0aGlzLl9jaGFuZ2VTb3J0aW5nLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fY2hhbmdlU29ydGluZ0J1dHRvbiA9IHRoaXMuX2NoYW5nZVNvcnRpbmdCdXR0b24uYmluZCh0aGlzKTtcbiAgICB0aGlzLl9zaG93U29ydE1vZGFsID0gdGhpcy5fc2hvd1NvcnRNb2RhbC5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3Nob3dGaWx0ZXJzTW9kYWwgPSB0aGlzLl9zaG93RmlsdGVyc01vZGFsLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fYWN0aXZhdGVUYWcgPSB0aGlzLl9hY3RpdmF0ZVRhZy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2FkdmFuY2VkVGFncyA9IHRoaXMuX2FkdmFuY2VkVGFncy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX3RvZ2dsZVRhZ3MgPSB0aGlzLl90b2dnbGVUYWdzLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl9vbk1vZGFsT3BlbiA9IHRoaXMuX29uTW9kYWxPcGVuLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fb25Nb2RhbENsb3NlID0gdGhpcy5fb25Nb2RhbENsb3NlLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLl90b2dnbGVMaXN0VmlldyA9IHRoaXMuX3RvZ2dsZUxpc3RWaWV3LmJpbmQodGhpcyk7XG4gICAgdGhpcy5fdG9nZ2xlR3JpZFZpZXcgPSB0aGlzLl90b2dnbGVHcmlkVmlldy5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX2NoZWNrTGlzdFZpZXcgPSB0aGlzLl9jaGVja0xpc3RWaWV3LmJpbmQodGhpcyk7XG5cbiAgICBjb25zdCBtb2RhbENhbGxiYWNrcyA9IHtcbiAgICAgIG9uT3BlbjogdGhpcy5fb25Nb2RhbE9wZW4sXG4gICAgICBvbkNsb3NlOiB0aGlzLl9vbk1vZGFsQ2xvc2UsXG4gICAgfTtcblxuICAgIHRoaXMuZXZlbnRzID0gW1xuICAgICAgdGhpcy4kc29ydFRyaWdnZXIub24oJ2NoYW5nZS5jb2xsZWN0aW9uJywgdGhpcy5fY2hhbmdlU29ydGluZyksXG4gICAgICB0aGlzLiRzb3J0VHJpZ2dlckJ1dHRvbi5vbignY2xpY2suY29sbGVjdGlvbicsIHRoaXMuX2NoYW5nZVNvcnRpbmdCdXR0b24pLFxuICAgICAgdGhpcy4kc29ydFRyaWdnZXJNb2RhbC5vbignY2xpY2suY29sbGVjdGlvbicsIHRoaXMuX3Nob3dTb3J0TW9kYWwpLFxuICAgICAgdGhpcy4kZmlsdGVyc1RyaWdnZXIub24oJ2NsaWNrLmNvbGxlY3Rpb24nLCB0aGlzLl9zaG93RmlsdGVyc01vZGFsKSxcbiAgICAgIHRoaXMuJGFkdmFuZGVkVGFncy5vbignY2xpY2suY29sbGVjdGlvbicsIHRoaXMuX2FkdmFuY2VkVGFncyksXG4gICAgICB0aGlzLiRhbGxUYWdzLm9uKCdjbGljay5jb2xsZWN0aW9uJywgdGhpcy5fYWN0aXZhdGVUYWcpLFxuICAgICAgdGhpcy4kYWRkaXRpb25hbFRhZ3Mub24oJ2NsaWNrLmNvbGxlY3Rpb24nLCB0aGlzLl90b2dnbGVUYWdzKSxcbiAgICAgIHRoaXMuJGdyaWRWaWV3VG9nZ2xlLm9uKCdjbGljay5jb2xsZWN0aW9uJywgdGhpcy5fdG9nZ2xlR3JpZFZpZXcpLFxuICAgICAgdGhpcy4kbGlzdFZpZXdUb2dnbGUub24oJ2NsaWNrLmNvbGxlY3Rpb24nLCB0aGlzLl90b2dnbGVMaXN0VmlldylcbiAgICBdO1xuXG4gICAgLy8gUHJvZHVjdCBpdGVtc1xuICAgIHRoaXMucHJvZHVjdEl0ZW1zID0gW107XG4gICAgY29uc3QgJHByb2R1Y3RJdGVtcyA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3QtaXRlbV0nKTtcblxuICAgICRwcm9kdWN0SXRlbXMuZWFjaCgoaSwgcHJvZHVjdEl0ZW0pID0+IHtcbiAgICAgIHRoaXMucHJvZHVjdEl0ZW1zLnB1c2gobmV3IFByb2R1Y3RHcmlkSXRlbSgkKHByb2R1Y3RJdGVtKSkpO1xuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuJHNvcnRUcmlnZ2VyLmxlbmd0aCkge1xuICAgICAgdGhpcy5zb3J0V2lkdGggPSBuZXcgU2VsZWN0V2lkdGgodGhpcy4kc29ydFRyaWdnZXIpO1xuICAgIH1cblxuICAgIHRoaXMuX3NldFNvcnRCeVF1ZXJ5UGFyYW1ldGVycygpO1xuICAgIHRoaXMuX3VwZGF0ZVByaWNlcygpO1xuICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwobW9kYWxDYWxsYmFja3MpO1xuXG4gICAgbmV3IFJlY2VudGx5Vmlld2VkKHNlY3Rpb24pO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMuZXZlbnRzLmZvckVhY2goJGVsID0+ICRlbC5vZmYoJy5jb2xsZWN0aW9uJykpO1xuICAgIHRoaXMubW9kYWwudW5sb2FkKCk7XG5cbiAgICBpZiAodGhpcy5zb3J0V2lkdGgpIHtcbiAgICAgIHRoaXMuc29ydFdpZHRoLnVubG9hZCgpO1xuICAgIH1cblxuICAgIHRoaXMucHJvZHVjdEl0ZW1zLmZvckVhY2goKHByb2R1Y3RJdGVtKSA9PiB7XG4gICAgICBwcm9kdWN0SXRlbS51bmxvYWQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgcHJvZHVjdCBncmlkIHByaWNlcyB0byBtYXRjaCBDdXJyZW5jeUNvbnZlcnRlciBzZXR0aW5ncyBvbiBwYWdlIGxvYWQsIHNlY3Rpb24gcmUtbG9hZFxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3VwZGF0ZVByaWNlcygpIHtcbiAgICB0aGlzLiRlbC5maW5kKCcubW9uZXknKS5lYWNoKChpbmRleCwgZWwpID0+IEN1cnJlbmN5Q29udmVydGVyLnVwZGF0ZShlbCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE9wZW4gVGFncy9GaWx0ZXJzIG1vZGFsIChvbiBtb2JpbGUpXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX3Nob3dGaWx0ZXJzTW9kYWwoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy4kZm9jdXNJdGVtID0gJChldmVudC5jdXJyZW50VGFyZ2V0KTtcbiAgICB0aGlzLm1vZGFsLm9wZW4odGhpcy5maWx0ZXJzQ29udGVudCwgJ3Byb2R1Y3RncmlkLWZpbHRlcnMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIFNvcnQgYnkgbW9kYWwgKG9uIG1vYmlsZSlcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2hvd1NvcnRNb2RhbChldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLiRmb2N1c0l0ZW0gPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIHRoaXMubW9kYWwub3Blbih0aGlzLnNvcnRDb250ZW50LCAncHJvZHVjdGdyaWQtc29ydCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN0eWxlIGEgdGFnIGFzIGFjdGl2ZSBhZnRlciBjbGljaywgYmVmb3JlIHBhZ2UgdHJhbnNpdGlvblxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9hY3RpdmF0ZVRhZyhldmVudCkge1xuICAgICQoZXZlbnQuY3VycmVudFRhcmdldCkuYWRkQ2xhc3MoJ2ZpbHRlci1saW5rLS1hY3RpdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIGJ5IGFkdmFuY2VkIHRhZ3MgdG8gY29uY2F0ZW5hdGUgdGFnIHNlYXJjaGVzXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2FkdmFuY2VkVGFncyhldmVudCkge1xuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnBhcmVudCgpO1xuICAgIGNvbnN0IHRhZ0dyb3VwID0gJHRhcmdldC5hdHRyKCdkYXRhLWdyb3VwJyk7XG4gICAgY29uc3QgJGFjdGl2ZUdyb3VwID0gJChgLmZpbHRlci1pdGVtLS1hY3RpdmVbZGF0YS1ncm91cD1cIiR7dGFnR3JvdXB9XCJdYCk7XG5cbiAgICBpZiAoISR0YXJnZXQuaGFzQ2xhc3MoJ2ZpbHRlci1pdGVtLS1hY3RpdmUnKSAmJiAkYWN0aXZlR3JvdXAubGVuZ3RoKSB7XG4gICAgICBjb25zdCB0YWdIYW5kbGUgPSAkdGFyZ2V0LmF0dHIoJ2RhdGEtaGFuZGxlJyk7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAkdGFyZ2V0LnNpYmxpbmdzKCkucmVtb3ZlQ2xhc3MoJ2ZpbHRlci1pdGVtLS1hY3RpdmUnKTtcblxuICAgICAgbG9jYXRpb24uaHJlZiA9IGxvY2F0aW9uLmhyZWZcbiAgICAgICAgLy8gc3dhcCB0YWdcbiAgICAgICAgLnJlcGxhY2UoJGFjdGl2ZUdyb3VwLmF0dHIoJ2RhdGEtaGFuZGxlJyksIHRhZ0hhbmRsZSlcbiAgICAgICAgLy8gZ28gYmFjayB0byBwYWdlIDFcbiAgICAgICAgLnJlcGxhY2UoLygmcGFnZT1cXGQrKXwocGFnZT1cXGQrJil8KFxcP3BhZ2U9XFxkKyQpLywgJycpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeHBhbmQgLyBDb2xsYXBzZSBhZGRpdGlvbmFsIHRhZ3MgaW4gdGhlIHNpZGViYXJcbiAgICpcbiAgICogQHBhcmFtIGV2ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfdG9nZ2xlVGFncyhldmVudCkge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBjb25zdCAkdHJpZ2dlciA9ICQoZXZlbnQuY3VycmVudFRhcmdldCk7XG4gICAgY29uc3QgJGl0ZW1zID0gJHRyaWdnZXIucGFyZW50KCkuc2libGluZ3MoJ1tkYXRhLWhpZGRlbi1kZWZhdWx0XScpO1xuICAgIGNvbnN0IHNpYmxpbmdzVmlzaWJsZSA9ICR0cmlnZ2VyLmRhdGEoJ2ZpbHRlci10b2dnbGUnKTtcblxuICAgICRpdGVtcy50b2dnbGVDbGFzcygnZmlsdGVyLWl0ZW0tLWhpZGRlbicsIHNpYmxpbmdzVmlzaWJsZSk7XG4gICAgJHRyaWdnZXJcbiAgICAgIC5kYXRhKCdmaWx0ZXItdG9nZ2xlJywgIXNpYmxpbmdzVmlzaWJsZSlcbiAgICAgIC50ZXh0KCFzaWJsaW5nc1Zpc2libGUgPyB0aGlzLmNvbnRleHQuc2VlX2xlc3MgOiB0aGlzLmNvbnRleHQuc2VlX21vcmUpO1xuXG4gICAgaWYgKHRoaXMubW9kYWwuaXNPcGVuKCkpIHtcbiAgICAgIHRoaXMubW9kYWwucG9zaXRpb24oKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBTaG9waWZ5IGF3YXJlIG9mIHJlbGVhdmVudCBjb2xsZWN0aW9uIHNlYXJjaCBpbmZvXG4gICAqICAtIHRhZ1xuICAgKiAgLSB2ZW5kb3JcbiAgICogIC0gcGFnaW5hdGlvblxuICAgKiAgLSBzb3J0aW5nIGNyaXRlcmlhXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfc2V0U29ydEJ5UXVlcnlQYXJhbWV0ZXJzKCkge1xuICAgIFNob3BpZnkucXVlcnlQYXJhbXMgPSB7fTtcbiAgICBpZiAobG9jYXRpb24uc2VhcmNoLmxlbmd0aCkge1xuICAgICAgZm9yIChsZXQgaSA9IDAsIGFDb3VwbGVzID0gbG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5zcGxpdCgnJicpOyBpIDwgYUNvdXBsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgYUtleVZhbHVlID0gYUNvdXBsZXNbaV0uc3BsaXQoJz0nKTtcbiAgICAgICAgLy8gUmVzZXQgdGhlIHBhZ2UgbnVtYmVyIHdoZW4gd2UgYXBwbHkgKGkuZS4gZG9uJ3QgYWRkIGl0IHRvIHBhcmFtcylcbiAgICAgICAgaWYgKGFLZXlWYWx1ZS5sZW5ndGggPiAxICYmIGFLZXlWYWx1ZVswXSAhPT0gJ3BhZ2UnKSB7XG4gICAgICAgICAgU2hvcGlmeS5xdWVyeVBhcmFtc1tkZWNvZGVVUklDb21wb25lbnQoYUtleVZhbHVlWzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQoYUtleVZhbHVlWzFdKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuX2NoZWNrTGlzdFZpZXcoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTb3J0IGJ5IG9wZW5zIGEgbW9kYWwgb24gbW9iaWxlLCB0aGlzIGhhbmRsZXMgYnV0dG9uIGV2ZW50c1xuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9jaGFuZ2VTb3J0aW5nQnV0dG9uKGV2ZW50KSB7XG4gICAgY29uc3QgYWN0aXZlQ2xhc3MgPSAndXRpbHMtc29ydGJ5LS1tb2RhbC1idXR0b24tLWFjdGl2ZSc7XG5cbiAgICAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpXG4gICAgICAuYWRkQ2xhc3MoYWN0aXZlQ2xhc3MpXG4gICAgICAucGFyZW50KClcbiAgICAgIC5zaWJsaW5ncygpXG4gICAgICAuZmluZChgLiR7YWN0aXZlQ2xhc3N9YClcbiAgICAgIC5yZW1vdmVDbGFzcyhhY3RpdmVDbGFzcyk7XG5cbiAgICB0aGlzLl9jaGFuZ2VTb3J0aW5nKGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGFuZ2Ugc29ydGluZyBvZiBjb2xsZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NoYW5nZVNvcnRpbmcoZXZlbnQpIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0ICR0YXJnZXQgPSAkKGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuXG4gICAgU2hvcGlmeS5xdWVyeVBhcmFtcy5zb3J0X2J5ID0gJHRhcmdldC52YWwoKTtcbiAgICBsb2NhdGlvbi5zZWFyY2ggPSBqUXVlcnkucGFyYW0oU2hvcGlmeS5xdWVyeVBhcmFtcykucmVwbGFjZSgvXFwrL2csICclMjAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVuIGEgbW9kYWwgaXMgb3BlbiwgbW92ZSBmb2N1cyBpbnRvIHRoZSBtb2RhbCBmb3IgYTExeVxuICAgKlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX29uTW9kYWxPcGVuKCkge1xuICAgIHRyYXBGb2N1cyh7XG4gICAgICAkY29udGFpbmVyOiB0aGlzLm1vZGFsLiRtb2RhbCxcbiAgICAgIG5hbWVzcGFjZTogJ3Byb2R1Y3RncmlkLW1vZGFsJyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gZm9jdXMgdG8gbGFzdCB1c2VkIGJ1dHRvbiAoaWYgZm91bmQpIG9uIG1vZGFsIGNsb3NlXG4gICAqXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfb25Nb2RhbENsb3NlKCkge1xuICAgIHJlbW92ZVRyYXBGb2N1cyh7XG4gICAgICAkY29udGFpbmVyOiB0aGlzLm1vZGFsLiRtb2RhbCxcbiAgICAgIG5hbWVzcGFjZTogJ3Byb2R1Y3RncmlkLW1vZGFsJyxcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLiRmb2N1c0l0ZW0pIHtcbiAgICAgIHRoaXMuJGZvY3VzSXRlbS5mb2N1cygpO1xuICAgICAgdGhpcy4kZm9jdXNJdGVtID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlIGdyaWQgdmlld1xuICAgKlxuICAgKi9cbiAgX3RvZ2dsZUdyaWRWaWV3KGV2ZW50KSB7XG4gICAgU2hvcGlmeS5xdWVyeVBhcmFtcy5ncmlkX2xpc3QgPSAnZ3JpZC12aWV3JztcbiAgICBsb2NhdGlvbi5zZWFyY2ggPSBqUXVlcnkucGFyYW0oU2hvcGlmeS5xdWVyeVBhcmFtcykucmVwbGFjZSgvXFwrL2csICclMjAnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgbGlzdCB2aWV3XG4gICAqXG4gICAqL1xuICBfdG9nZ2xlTGlzdFZpZXcoZXZlbnQpIHtcbiAgICBTaG9waWZ5LnF1ZXJ5UGFyYW1zLmdyaWRfbGlzdCA9ICdsaXN0LXZpZXcnO1xuICAgIGxvY2F0aW9uLnNlYXJjaCA9IGpRdWVyeS5wYXJhbShTaG9waWZ5LnF1ZXJ5UGFyYW1zKS5yZXBsYWNlKC9cXCsvZywgJyUyMCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGdyaWQvbGlzdCB2aWV3IHRvZ2dsZSBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqXG4gICAqL1xuICBfY2hlY2tMaXN0VmlldygpIHtcbiAgICBpZiAoU2hvcGlmeS5xdWVyeVBhcmFtcy5ncmlkX2xpc3QgPT09ICdsaXN0LXZpZXcnKSB7XG4gICAgICB0aGlzLiRlbC5maW5kKCdbaHJlZio9XCImZ3JpZF9saXN0XCJdJykuYXR0cignaHJlZicsIGZ1bmN0aW9uKGksIGhyZWYpIHtcbiAgICAgICAgaWYgKGhyZWYuaW5kZXhPZignPycpID09PSAtMSkge1xuICAgICAgICAgIGhyZWYgPSBocmVmLnJlcGxhY2UoJyYnLCAnPycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhyZWYucmVwbGFjZSgnZ3JpZF9saXN0JywgJ2dyaWRfbGlzdD1saXN0LXZpZXcnKTtcbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLiRlbC5maW5kKCcudXRpbHMtdmlld3RvZ2dsZS1idXR0b24nKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICB0aGlzLiRsaXN0Vmlld1RvZ2dsZS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICB0aGlzLiRncmlkQ29udGFpbmVyLmFkZENsYXNzKCdwcm9kdWN0Z3JpZC1saXN0dmlldycpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLiRlbC5maW5kKCdbaHJlZio9XCImZ3JpZF9saXN0XCJdJykuYXR0cignaHJlZicsIGZ1bmN0aW9uKGksIGhyZWYpIHtcbiAgICAgICAgaWYgKGhyZWYuaW5kZXhPZignPycpID09PSAtMSkge1xuICAgICAgICAgIGhyZWYgPSBocmVmLnJlcGxhY2UoJyYnLCAnPycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhyZWYucmVwbGFjZSgnZ3JpZF9saXN0JywgJ2dyaWRfbGlzdD1ncmlkLXZpZXcnKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAkc2NyaXB0IGZyb20gJ3NjcmlwdGpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljR2lmdGNhcmQge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy4kZWwgPSAkKHNlY3Rpb24uZWwpO1xuICAgIHRoaXMuJHFyQ29kZSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLWdpZnRjYXJkLXFyXScpO1xuICAgIHRoaXMuJGdpZnRDYXJkQ29kZSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLWdpZnRjYXJkLWNvZGVdJyk7XG5cbiAgICAkc2NyaXB0KCQoJ1tkYXRhLXNjcmlwdHNdJykuZGF0YSgnc2hvcGlmeS1xcmNvZGUnKSwgKCkgPT4ge1xuICAgICAgdGhpcy5RUkNvZGUgPSBuZXcgUVJDb2RlKHRoaXMuJHFyQ29kZVswXSwge1xuICAgICAgICB0ZXh0OiB0aGlzLiRxckNvZGUuYXR0cignZGF0YS1naWZ0Y2FyZC1xcicpLFxuICAgICAgICB3aWR0aDogMTIwLFxuICAgICAgICBoZWlnaHQ6IDEyMFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gIH1cblxuICBfYmluZEV2ZW50cygpIHtcbiAgICB0aGlzLiRlbC5vbignY2xpY2snLCAnW2RhdGEtZ2lmdGNhcmQtcHJpbnRdJywgKCkgPT4ge1xuICAgICAgd2luZG93LnByaW50KCk7XG4gICAgfSk7XG5cbiAgICAvLyBBdXRvLXNlbGVjdCBnaWZ0IGNhcmQgY29kZSBvbiBjbGljaywgYmFzZWQgb24gSUQgcGFzc2VkIHRvIHRoZSBmdW5jdGlvblxuICAgIHRoaXMuJGVsLm9uKCdjbGljaycsICdbZGF0YS1naWZ0Y2FyZC1jb2RlXScsICgpID0+IHtcbiAgICAgIHRoaXMuX3NlbGVjdFRleHQoKTtcbiAgICB9KTtcbiAgfVxuXG4gIF9zZWxlY3RUZXh0KCkge1xuICAgIGNvbnN0IHRleHQgPSB0aGlzLiRnaWZ0Q2FyZENvZGVbMF07XG4gICAgbGV0IHJhbmdlID0gJyc7XG5cbiAgICBpZiAoZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UpIHsgLy8gbXMgbWV0aG9kXG4gICAgICByYW5nZSA9IGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCk7XG4gICAgICByYW5nZS5tb3ZlVG9FbGVtZW50VGV4dCh0ZXh0KTtcbiAgICAgIHJhbmdlLnNlbGVjdCgpO1xuICAgIH0gZWxzZSBpZiAod2luZG93LmdldFNlbGVjdGlvbikgeyAvLyBtb3osIG9wZXJhLCB3ZWJraXQgbWV0aG9kXG4gICAgICB2YXIgc2VsZWN0aW9uID0gd2luZG93LmdldFNlbGVjdGlvbigpO1xuICAgICAgcmFuZ2UgPSBkb2N1bWVudC5jcmVhdGVSYW5nZSgpO1xuICAgICAgcmFuZ2Uuc2VsZWN0Tm9kZUNvbnRlbnRzKHRleHQpO1xuICAgICAgc2VsZWN0aW9uLnJlbW92ZUFsbFJhbmdlcygpO1xuICAgICAgc2VsZWN0aW9uLmFkZFJhbmdlKHJhbmdlKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmltcG9ydCBNb2RhbCBmcm9tICcuLi9jb21wb25lbnRzL01vZGFsJztcbmltcG9ydCBGb3JtcyBmcm9tICcuLi9Gb3Jtcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY1Bhc3N3b3JkIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcblxuICAgIHRoaXMubW9kYWxGb3JtcyA9IG51bGw7XG4gICAgdGhpcy5uZXdzbGV0dGVyRm9ybSA9IG51bGw7XG4gICAgdGhpcy5tb2RhbENvbnRlbnRzID0gJ1tkYXRhLXBhc3N3b3JkZW50cnldJztcbiAgICB0aGlzLiRuZXdzbGV0dGVyRm9ybSA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXBhc3N3b3JkLW5ld3NsZXR0ZXJdJyk7XG5cbiAgICB0aGlzLm1vZGFsT3BlbiA9IHRoaXMub25Nb2RhbE9wZW4uYmluZCh0aGlzKTtcbiAgICB0aGlzLm1vZGFsQ2xvc2UgPSB0aGlzLm9uTW9kYWxDbG9zZS5iaW5kKHRoaXMpO1xuICAgIHRoaXMuX29wZW5Nb2RhbCA9IHRoaXMuX29wZW5Nb2RhbC5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbCh7XG4gICAgICBvbk9wZW46IHRoaXMubW9kYWxPcGVuLFxuICAgICAgb25DbG9zZTogdGhpcy5tb2RhbENsb3NlLFxuICAgIH0pO1xuXG4gICAgaWYgKHRoaXMuJG5ld3NsZXR0ZXJGb3JtKSB7XG4gICAgICB0aGlzLm5ld3NsZXR0ZXJGb3JtID0gbmV3IEZvcm1zKHRoaXMuJG5ld3NsZXR0ZXJGb3JtKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jaGVja0ZvclBhc3N3b3JkQXR0ZW1wdCgpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLiRlbC5vZmYoJy5zdGF0aWMtcGFzc3dvcmQnKTtcblxuICAgIGlmICh0aGlzLm5ld3NsZXR0ZXJGb3JtKSB7XG4gICAgICB0aGlzLm5ld3NsZXR0ZXJGb3JtLnVubG9hZCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1vZGFsRm9ybXMpIHtcbiAgICAgIHRoaXMubW9kYWxGb3Jtcy51bmxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBvbk1vZGFsT3BlbigpIHtcbiAgICBjb25zdCAkY29udGVudHMgPSAkKCdbZGF0YS1wYXNzd29yZGVudHJ5LWNvbnRlbnRzXScpO1xuICAgIHRoaXMubW9kYWxGb3JtcyA9IG5ldyBGb3JtcygkY29udGVudHMpO1xuICB9XG5cbiAgb25Nb2RhbENsb3NlKCkge1xuICAgIHRoaXMubW9kYWxGb3Jtcy51bmxvYWQoKTtcbiAgICB0aGlzLm1vZGFsRm9ybXMgPSBudWxsO1xuICB9XG5cbiAgX2JpbmRFdmVudHMoKSB7XG4gICAgdGhpcy4kZWwub24oJ2NsaWNrLnN0YXRpYy1wYXNzd29yZCcsICdbZGF0YS1wYXNzd29yZGVudHJ5LXRvZ2dsZV0nLCB0aGlzLl9vcGVuTW9kYWwpO1xuICB9XG5cbiAgX29wZW5Nb2RhbCgpIHtcbiAgICB0aGlzLm1vZGFsLm9wZW4odGhpcy5tb2RhbENvbnRlbnRzLCAncGFzc3dvcmRlbnRyeScpO1xuICB9XG5cbiAgX2NoZWNrRm9yUGFzc3dvcmRBdHRlbXB0KCkge1xuICAgIGlmICghJCgnW2RhdGEtcGFzc3dvcmRlbnRyeS1lcnJvcnNdJykubGVuZ3RoKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fb3Blbk1vZGFsKCk7XG4gIH1cbn1cbiIsImltcG9ydCBkZWJvdW5jZSBmcm9tICdqdXN0LWRlYm91bmNlJztcbmltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5cbmltcG9ydCBsYXlvdXQgZnJvbSAnLi4vTGF5b3V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvZHVjdFJvd1Njcm9sbGVyIHtcbiAgY29uc3RydWN0b3IocHJvZHVjdFJvdykge1xuICAgIHRoaXMuJHdpbmRvdyA9ICQod2luZG93KTtcbiAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcbiAgICB0aGlzLnByb2R1Y3RSb3cgPSBwcm9kdWN0Um93O1xuICAgIHRoaXMuJHByb2R1Y3RSb3cgPSAkKHRoaXMucHJvZHVjdFJvdyk7XG5cbiAgICAvLyBBY3RpdmF0ZSBmbGlja2l0eSBvbiBtb2JpbGVcbiAgICB0aGlzLl9tb2JpbGVTbGlkZXIgPSB0aGlzLl9tb2JpbGVTbGlkZXIuYmluZCh0aGlzKTtcbiAgICBsYXlvdXQub25CcmVha3BvaW50Q2hhbmdlKHRoaXMuX21vYmlsZVNsaWRlcik7XG5cbiAgICB0aGlzLl9tb2JpbGVTbGlkZXIoKTtcbiAgfVxuXG4gIHVubG9hZCgpIHtcbiAgICBsYXlvdXQub2ZmQnJlYWtwb2ludENoYW5nZSh0aGlzLl9tb2JpbGVTbGlkZXIpO1xuICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICB9XG5cbiAgX2luaXRGbGlja2l0eSgpIHtcbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMucHJvZHVjdFJvdywge1xuICAgICAgY2VsbFNlbGVjdG9yOiAnLnByb2R1Y3RncmlkLS1pdGVtJyxcbiAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICBmcmVlU2Nyb2xsOiB0cnVlLFxuICAgICAgcGVyY2VudFBvc2l0aW9uOiBmYWxzZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kU2xpZGVyKCk7XG4gIH1cblxuICBfZGVzdHJveUZsaWNraXR5KCkge1xuICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuJHdpbmRvdy5vZmYoJy5wcm9kdWN0LXJvdycpO1xuICAgIHRoaXMuJHByb2R1Y3RSb3cub2ZmKCcucHJvZHVjdC1yb3cnKTtcblxuICAgIHRoaXMuZmxpY2tpdHkuZGVzdHJveSgpO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICB9XG5cbiAgX21vYmlsZVNsaWRlcigpIHtcbiAgICAvLyBJZiBpcyBMYXJnZSBsYXlvdXQsIGF0dGVtcHQgdG8gZGVzdHJveSBmbGlja2l0eVxuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdMJykpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElzIFhTL1MvTSwgYW5kIGZsaWNraXR5IGlzIGluaXQnZCAtLSBkbyBub3RoaW5nXG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJcyBYUy9TL00sIGFuZCBmbGlja2l0eSBpcyBub3QgaW5pdCdkXG4gICAgdGhpcy5faW5pdEZsaWNraXR5KCk7XG4gIH1cblxuICBfYmluZFNsaWRlcigpIHtcbiAgICBjb25zdCAkc2xpZGVyID0gdGhpcy4kcHJvZHVjdFJvdy5maW5kKCcuZmxpY2tpdHktc2xpZGVyJyk7XG5cbiAgICB0aGlzLiR3aW5kb3cub24oJ3Jlc2l6ZS5wcm9kdWN0LXJvdycsIGRlYm91bmNlKCgpID0+IHtcbiAgICAgIHRoaXMuJHByb2R1Y3RSb3cudHJpZ2dlcignaGVpZ2h0VXBkYXRlLnByb2R1Y3Qtcm93Jyk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5mbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuJHByb2R1Y3RSb3cudHJpZ2dlcignaGVpZ2h0VXBkYXRlLnByb2R1Y3Qtcm93Jyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRwcm9kdWN0Um93Lm9uKCdoZWlnaHRVcGRhdGUucHJvZHVjdC1yb3cnLCAoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuZmxpY2tpdHkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAkc2xpZGVyLmhlaWdodChNYXRoLmNlaWwodGhpcy5mbGlja2l0eS5tYXhDZWxsSGVpZ2h0KSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXRzIHRoZSBTbGlkZXIgdG8gdGhlIGhlaWdodCBvZiB0aGUgZmlyc3Qgc2xpZGVcbiAgICB0aGlzLiRwcm9kdWN0Um93LnRyaWdnZXIoJ2hlaWdodFVwZGF0ZS5wcm9kdWN0LXJvdycpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuaW1wb3J0IEN1cnJlbmN5Q29udmVydGVyIGZyb20gJ3Nob3BpZnktY3VycmVuY3ktY29udmVydGVyJztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi4vTGF5b3V0JztcbmltcG9ydCBGb3JtcyBmcm9tICcuLi9Gb3Jtcyc7XG5cbmltcG9ydCBSaWNoVGV4dCBmcm9tICcuLi9jb21wb25lbnRzL1JpY2hUZXh0JztcbmltcG9ydCBQcm9kdWN0RGV0YWlscyBmcm9tICcuLi9jb21wb25lbnRzL1Byb2R1Y3REZXRhaWxzJztcbmltcG9ydCBQcm9kdWN0R3JpZEl0ZW0gZnJvbSAnLi4vY29tcG9uZW50cy9Qcm9kdWN0R3JpZEl0ZW0nO1xuaW1wb3J0IFByb2R1Y3RSb3dTY3JvbGxlciBmcm9tICcuLi9jb21wb25lbnRzL1Byb2R1Y3RSb3dTY3JvbGxlcic7XG5pbXBvcnQgUmVjZW50bHlWaWV3ZWQgZnJvbSAnLi4vY29tcG9uZW50cy9SZWNlbnRseVZpZXdlZCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY1Byb2R1Y3Qge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5wb3N0TWVzc2FnZSA9IHNlY3Rpb24ucG9zdE1lc3NhZ2U7XG4gICAgdGhpcy5jb250ZXh0ID0gc2VjdGlvbi5kYXRhLmNvbnRleHQ7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YS5zZXR0aW5ncztcbiAgICB0aGlzLnByb2R1Y3QgPSBzZWN0aW9uLmRhdGEucHJvZHVjdDtcbiAgICB0aGlzLnJpY2hUZXh0ID0gbnVsbDtcbiAgICB0aGlzLnJldmlld0Zvcm0gPSBudWxsO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgIHRoaXMuZmxpY2tpdHlPcHRpb25zID0gbnVsbDtcblxuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcbiAgICB0aGlzLiRwcm9kdWN0ID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC13cmFwcGVyXScpO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MpIHtcbiAgICAgIHRoaXMuaXNUaHJlZUNvbHVtbiA9IHRoaXMuc2V0dGluZ3MubGF5b3V0ID09PSAnbGF5b3V0LS10aHJlZS1jb2wnO1xuICAgIH1cblxuICAgIC8vIEhpc3RvcnlcbiAgICB0aGlzLmlzVGhlbWVFZGl0b3IgPSB3aW5kb3cuU2hvcGlmeSAmJiB3aW5kb3cuU2hvcGlmeS5kZXNpZ25Nb2RlO1xuICAgIHRoaXMudXNlSGlzdG9yeSA9ICF0aGlzLmlzVGhlbWVFZGl0b3IgJiYgaGlzdG9yeS5yZXBsYWNlU3RhdGU7XG5cbiAgICB0aGlzLiRnYWxsZXJ5ID0gdGhpcy4kcHJvZHVjdC5maW5kKCdbZGF0YS1wcm9kdWN0LWdhbGxlcnldJyk7XG5cbiAgICAvLyBQcm9kdWN0IGRldGFpbHNcbiAgICB0aGlzLiRkZXRhaWxzID0gdGhpcy4kcHJvZHVjdC5maW5kKCdbZGF0YS1wcm9kdWN0LWRldGFpbHNdJyk7XG5cbiAgICAvLyBQcm9kdWN0IGRlc2NyaXB0aW9uXG4gICAgdGhpcy4kZGVzY3JpcHRpb24gPSB0aGlzLiRwcm9kdWN0LmZpbmQoJ1tkYXRhLXByb2R1Y3QtZGVzY3JpcHRpb25dJyk7XG5cbiAgICAvLyBQcm9kdWN0IGZvcm0gY29udGFpbmVyc1xuICAgIHRoaXMuJGZvcm1SZWd1bGFyID0gdGhpcy4kcHJvZHVjdC5maW5kKCdbZGF0YS1wcm9kdWN0LWZvcm0tcmVndWxhcl0nKTtcbiAgICB0aGlzLiRmb3JtQWx0ID0gdGhpcy4kcHJvZHVjdC5maW5kKCdbZGF0YS1wcm9kdWN0LWZvcm0tYWx0XScpO1xuXG4gICAgLy8gUHJvZHVjdCBmb3JtIGFyZWFcbiAgICB0aGlzLiRmb3JtQXJlYSA9IHRoaXMuJHByb2R1Y3QuZmluZCgnW2RhdGEtcHJvZHVjdC1mb3JtLWFyZWFdJyk7XG5cbiAgICAvLyBNb3ZlIHByb2R1Y3QgZm9ybSBhbmQgaW5mb3JtYXRpb24gb24gYnJlYWtwb2ludCBjaGFuZ2VcbiAgICB0aGlzLmxheW91dEhhbmRsZXIgPSB0aGlzLm9uQnJlYWtwb2ludENoYW5nZS5iaW5kKHRoaXMpO1xuICAgIGxheW91dC5vbkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5sYXlvdXRIYW5kbGVyKTtcblxuICAgIC8vIFJlbGF0ZWQgUHJvZHVjdHNcbiAgICB0aGlzLiRyZWxhdGVkUHJvZHVjdHMgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1yZWxhdGVkLXByb2R1Y3RzXScpO1xuICAgIHRoaXMucmVsYXRlZFByb2R1Y3RzID0gW107XG4gICAgdGhpcy5yZWxhdGVkUHJvZHVjdHNTY3JvbGxlciA9IG51bGw7XG5cbiAgICAvLyBQcm9kdWN0IHJldmlld3NcbiAgICB0aGlzLiRwcm9kdWN0UmV2aWV3cyA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLXByb2R1Y3QtcmV2aWV3c10nKTtcblxuICAgIHRoaXMuX21vdmVGb3JtKCk7XG5cbiAgICBpZiAodGhpcy4kZGVzY3JpcHRpb24ubGVuZ3RoKSB7XG4gICAgICB0aGlzLnJpY2hUZXh0ID0gbmV3IFJpY2hUZXh0KHRoaXMuJGRlc2NyaXB0aW9uKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy4kcmVsYXRlZFByb2R1Y3RzLmxlbmd0aCkge1xuICAgICAgdGhpcy5yZWxhdGVkUHJvZHVjdHNTY3JvbGxlciA9IG5ldyBQcm9kdWN0Um93U2Nyb2xsZXIoc2VjdGlvbi5lbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS1wcm9kdWN0LXJvd10nKSk7XG5cbiAgICAgIHRoaXMuJHJlbGF0ZWRQcm9kdWN0cy5maW5kKCdbZGF0YS1wcm9kdWN0LWl0ZW1dJykuZWFjaCgoaSwgcHJvZHVjdEl0ZW0pID0+IHtcbiAgICAgICAgbmV3IFByb2R1Y3RHcmlkSXRlbSgkKHByb2R1Y3RJdGVtKSk7XG4gICAgICB9KTtcblxuICAgICAgLyogSWYgcmVsYXRlZCBwcm9kdWN0cyBhcmUgZGlzYWJsZWQvZW5hYmxlZCB3aXRoIHdoaWxlIGluIHRoZSBURSxcbiAgICAgICAqIHRoZXknbGwgaGF2ZSBzaG9wLmN1cnJlbmN5IGFzIHRoZSBtb25ldGFyeSB2YWx1ZS4gVGhpcyB1cGRhdGVzIGl0IHRvXG4gICAgICAgKiB0aGUgYWN0aXZlIGN1cnJlbmN5XG4gICAgICAgKi9cbiAgICAgIHRoaXMuJHJlbGF0ZWRQcm9kdWN0cy5maW5kKCcubW9uZXknKS5lYWNoKChpbmRleCwgZWwpID0+IEN1cnJlbmN5Q29udmVydGVyLnVwZGF0ZShlbCkpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLiRwcm9kdWN0UmV2aWV3cy5sZW5ndGgpIHtcbiAgICAgIHRoaXMucmV2aWV3Rm9ybSA9IG5ldyBGb3Jtcyh0aGlzLiRwcm9kdWN0UmV2aWV3cywgJy5zcHItZm9ybS1pbnB1dCcpO1xuICAgIH1cblxuICAgIC8vIEluc3RhbnRpYXRlIFByb2R1Y3REZXRhaWxzIGFmdGVyIFNob3BpZnkgQVBJIGlzIGxvYWRlZFxuICAgICRzY3JpcHQoJCgnW2RhdGEtc2NyaXB0c10nKS5kYXRhKCdzaG9waWZ5LWFwaS11cmwnKSwgKCkgPT4ge1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgJGZvcm1BcmVhOiB0aGlzLiRmb3JtQXJlYSxcbiAgICAgICAgJGdhbGxlcnk6IHRoaXMuJGdhbGxlcnksXG4gICAgICAgICRkZXRhaWxzOiB0aGlzLiRkZXRhaWxzLFxuICAgICAgICBjb250ZXh0OiB0aGlzLmNvbnRleHQsXG4gICAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxuICAgICAgICBwcm9kdWN0OiB0aGlzLnByb2R1Y3QsXG4gICAgICAgIHVzZUhpc3Rvcnk6IHRoaXMudXNlSGlzdG9yeSxcbiAgICAgIH07XG5cbiAgICAgIHRoaXMucHJvZHVjdERldGFpbHMgPSBuZXcgUHJvZHVjdERldGFpbHMob3B0aW9ucyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlY2VudGx5Vmlld2VkID0gbmV3IFJlY2VudGx5Vmlld2VkKHNlY3Rpb24pO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGxheW91dC5vZmZCcmVha3BvaW50Q2hhbmdlKHRoaXMubGF5b3V0SGFuZGxlcik7XG4gICAgdGhpcy5wcm9kdWN0RGV0YWlscy51bmxvYWQoKTtcblxuICAgIGlmICh0aGlzLnJpY2hUZXh0KSB7XG4gICAgICB0aGlzLnJpY2hUZXh0LnVubG9hZCgpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlbGF0ZWRQcm9kdWN0c1Njcm9sbGVyKSB7XG4gICAgICB0aGlzLnJlbGF0ZWRQcm9kdWN0c1Njcm9sbGVyLnVubG9hZCgpO1xuICAgIH1cblxuICAgIHRoaXMucmVsYXRlZFByb2R1Y3RzLmZvckVhY2goKHByb2R1Y3RJdGVtKSA9PiB7XG4gICAgICBwcm9kdWN0SXRlbS51bmxvYWQoKTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLnJldmlld0Zvcm0pIHtcbiAgICAgIHRoaXMucmV2aWV3Rm9ybS51bmxvYWQoKTtcbiAgICB9XG4gIH1cblxuICBvbkJyZWFrcG9pbnRDaGFuZ2UoKSB7XG4gICAgdGhpcy5fbW92ZUZvcm0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHByb2R1Y3QgZm9ybSBpZiBpcyBhIHRocmVlIGNvbHVtbiBsYXlvdXRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9tb3ZlRm9ybSgpIHtcbiAgICBpZiAoIXRoaXMuaXNUaHJlZUNvbHVtbikgcmV0dXJuO1xuXG4gICAgaWYgKGxheW91dC5pc0JyZWFrcG9pbnQoJ0wnKSkge1xuICAgICAgaWYgKCEkLmNvbnRhaW5zKHRoaXMuJGZvcm1BbHRbMF0sIHRoaXMuJGZvcm1BcmVhWzBdKSkge1xuICAgICAgICBjb25zdCAkZm9ybSA9IHRoaXMuJGZvcm1BcmVhLmRldGFjaCgpO1xuICAgICAgICB0aGlzLiRmb3JtQWx0LmFwcGVuZCgkZm9ybSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghJC5jb250YWlucyh0aGlzLiRmb3JtUmVndWxhclswXSwgdGhpcy4kZm9ybUFyZWFbMF0pKSB7XG4gICAgICAgIGNvbnN0ICRmb3JtID0gdGhpcy4kZm9ybUFyZWEuZGV0YWNoKCk7XG4gICAgICAgIHRoaXMuJGZvcm1SZWd1bGFyLmFwcGVuZCgkZm9ybSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IEN1cnJlbmN5Q29udmVydGVyIGZyb20gJ3Nob3BpZnktY3VycmVuY3ktY29udmVydGVyJztcblxuaW1wb3J0IFByb2R1Y3RHcmlkSXRlbSBmcm9tICcuLi9jb21wb25lbnRzL1Byb2R1Y3RHcmlkSXRlbSc7XG5pbXBvcnQgTW9kYWwgZnJvbSAnLi4vY29tcG9uZW50cy9Nb2RhbCc7XG5pbXBvcnQgU2VhcmNoRm9ybSBmcm9tICcuLi9jb21wb25lbnRzL1NlYXJjaEZvcm0nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNTZWFyY2gge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5zZWN0aW9uID0gc2VjdGlvbjtcbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy4kc2VhcmNoRmllbGQgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1saXZlLXNlYXJjaF0nKTtcbiAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKCk7XG5cbiAgICAvLyBQcm9kdWN0IGl0ZW1zXG4gICAgdGhpcy5wcm9kdWN0SXRlbXMgPSBbXTtcbiAgICBjb25zdCAkcHJvZHVjdEl0ZW1zID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtcHJvZHVjdC1pdGVtXScpO1xuXG4gICAgJHByb2R1Y3RJdGVtcy5lYWNoKChpLCBwcm9kdWN0SXRlbSkgPT4ge1xuICAgICAgdGhpcy5wcm9kdWN0SXRlbXMucHVzaChuZXcgUHJvZHVjdEdyaWRJdGVtKCQocHJvZHVjdEl0ZW0pKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLl91cGRhdGVQcmljZXMoKTtcbiAgICB0aGlzLnNlYXJjaEZvcm0gPSBuZXcgU2VhcmNoRm9ybSh0aGlzLiRzZWFyY2hGaWVsZCk7XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy5tb2RhbC51bmxvYWQoKTtcbiAgICB0aGlzLnNlYXJjaEZvcm0udW5sb2FkKCk7XG5cbiAgICB0aGlzLnByb2R1Y3RJdGVtcy5mb3JFYWNoKChwcm9kdWN0SXRlbSkgPT4ge1xuICAgICAgcHJvZHVjdEl0ZW0udW5sb2FkKCk7XG4gICAgfSk7XG4gIH1cblxuICBfdXBkYXRlUHJpY2VzKCkge1xuICAgIHRoaXMuJGVsLmZpbmQoJy5tb25leScpLmVhY2goKGluZGV4LCBlbCkgPT4gQ3VycmVuY3lDb252ZXJ0ZXIudXBkYXRlKGVsKSk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnanVzdC1kZWJvdW5jZSc7XG5pbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuXG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNUd2l0dGVyRmVlZCB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy4kd2luZG93ID0gJCh3aW5kb3cpO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuXG4gICAgdGhpcy4kYmxvZ1Bvc3RzID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtYmxvZy1wb3N0c10nKTtcblxuICAgIC8vIEFjdGl2YXRlIGZsaWNraXR5IG9uIG1vYmlsZVxuICAgIHRoaXMuX21vYmlsZVNsaWRlciA9IHRoaXMuX21vYmlsZVNsaWRlci5iaW5kKHRoaXMpO1xuICAgIGxheW91dC5vbkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5fbW9iaWxlU2xpZGVyKTtcbiAgICB0aGlzLl9tb2JpbGVTbGlkZXIoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbmJpbmQgZXZlbnRzIHdoZW4gc2VjdGlvbiBpcyByZS1kcmF3blxuICAgKi9cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIGxheW91dC5vZmZCcmVha3BvaW50Q2hhbmdlKHRoaXMuX21vYmlsZVNsaWRlcik7XG4gICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gIH1cblxuICBfaW5pdEZsaWNraXR5KCkge1xuICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy4kYmxvZ1Bvc3RzWzBdLCB7XG4gICAgICBjZWxsU2VsZWN0b3I6ICcuYXJ0aWNsZS0tZXhjZXJwdC13cmFwcGVyJyxcbiAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICBmcmVlU2Nyb2xsOiB0cnVlLFxuICAgICAgcGVyY2VudFBvc2l0aW9uOiBmYWxzZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kU2xpZGVyKCk7XG4gIH1cblxuICBfZGVzdHJveUZsaWNraXR5KCkge1xuICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuJHdpbmRvdy5vZmYoJy5ibG9nLXBvc3RzJyk7XG4gICAgdGhpcy4kYmxvZ1Bvc3RzLm9mZignLmJsb2ctcG9zdHMnKTtcbiAgICB0aGlzLmZsaWNraXR5LmRlc3Ryb3koKTtcbiAgICB0aGlzLmZsaWNraXR5ID0gbnVsbDtcbiAgfVxuXG4gIF9tb2JpbGVTbGlkZXIoKSB7XG4gICAgLy8gSWYgaXMgTGFyZ2UgbGF5b3V0LCBhdHRlbXB0IHRvIGRlc3Ryb3kgZmxpY2tpdHlcbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSB7XG4gICAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJcyBYUy9TL00sIGFuZCBmbGlja2l0eSBpcyBpbml0J2QgLS0gZG8gbm90aGluZ1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSXMgWFMvUy9NLCBhbmQgZmxpY2tpdHkgaXMgbm90IGluaXQnZFxuICAgIHRoaXMuX2luaXRGbGlja2l0eSgpO1xuICB9XG5cbiAgX2JpbmRTbGlkZXIoKSB7XG4gICAgY29uc3QgJHNsaWRlciA9IHRoaXMuJGJsb2dQb3N0cy5maW5kKCcuZmxpY2tpdHktc2xpZGVyJyk7XG5cbiAgICB0aGlzLiR3aW5kb3cub24oJ3Jlc2l6ZS5ibG9nLXBvc3RzJywgZGVib3VuY2UoKCkgPT4ge1xuICAgICAgdGhpcy4kYmxvZ1Bvc3RzLnRyaWdnZXIoJ2hlaWdodFVwZGF0ZS5ibG9nLXBvc3RzJyk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5mbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuJGJsb2dQb3N0cy50cmlnZ2VyKCdoZWlnaHRVcGRhdGUuYmxvZy1wb3N0cycpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kYmxvZ1Bvc3RzLm9uKCdoZWlnaHRVcGRhdGUuYmxvZy1wb3N0cycsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICRzbGlkZXIuaGVpZ2h0KE1hdGguY2VpbCh0aGlzLmZsaWNraXR5Lm1heENlbGxIZWlnaHQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNldHMgdGhlIFNsaWRlciB0byB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCBzbGlkZVxuICAgIHRoaXMuJGJsb2dQb3N0cy50cmlnZ2VyKCdoZWlnaHRVcGRhdGUuYmxvZy1wb3N0cycpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0IGRlYm91bmNlIGZyb20gJ2p1c3QtZGVib3VuY2UnO1xuaW1wb3J0IEZsaWNraXR5IGZyb20gJ2ZsaWNraXR5JztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi4vTGF5b3V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3RhdGljSGlnaGxpZ2h0c0Jhbm5lcnMge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy4kZWwgPSAkKHNlY3Rpb24uZWwpO1xuICAgIHRoaXMuJHdpbmRvdyA9ICQod2luZG93KTtcblxuICAgIHRoaXMuJGNhcm91c2VsID0gdGhpcy4kZWwuZmluZCgnLmhpZ2hsaWdodHMtYmFubmVycycpO1xuICAgIHRoaXMuc2xpZGVzID0gJy5oaWdobGlnaHRzLWJhbm5lcnMtYmxvY2snO1xuXG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG4gICAgdGhpcy5mbGlja2l0eU9wdGlvbnMgPSBudWxsO1xuXG4gICAgaWYgKHRoaXMuJGNhcm91c2VsLmZpbmQodGhpcy5zbGlkZXMpLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRoaXMuX2luaXRTbGlkZXIoKTtcbiAgICB9XG4gIH1cblxuICBfaW5pdFNsaWRlcigpIHtcbiAgICB0aGlzLmZsaWNraXR5T3B0aW9ucyA9IHtcbiAgICAgIGF1dG9QbGF5OiAwLFxuICAgICAgYWNjZXNzaWJpbGl0eTogdHJ1ZSxcbiAgICAgIGNlbGxBbGlnbjogJ2xlZnQnLFxuICAgICAgY2VsbFNlbGVjdG9yOiB0aGlzLnNsaWRlcyxcbiAgICAgIGltYWdlc0xvYWRlZDogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBwcmV2TmV4dEJ1dHRvbnM6IGZhbHNlLFxuICAgICAgc2V0R2FsbGVyeVNpemU6IGZhbHNlLFxuICAgICAgY29udGFpbjogdHJ1ZVxuICAgIH07XG5cbiAgICB0aGlzLl9iaW5kRmxpY2tpdHkoKTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgICB0aGlzLiR3aW5kb3cub2ZmKCcudHdpdHRlcicpO1xuICB9XG5cbiAgX2JpbmRGbGlja2l0eSgpIHtcbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpID09PSBmYWxzZSAmJiB0aGlzLmZsaWNraXR5ID09PSBudWxsKSB7XG4gICAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuJGNhcm91c2VsWzBdLCB0aGlzLmZsaWNraXR5T3B0aW9ucyk7XG4gICAgfVxuXG4gICAgdGhpcy4kd2luZG93Lm9uKCdyZXNpemUnLCBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpID09PSBmYWxzZSAmJiB0aGlzLmZsaWNraXR5ID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuX2JpbmRGbGlja2l0eSgpO1xuICAgICAgfSBlbHNlIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdMJykgJiYgdGhpcy5mbGlja2l0eSkge1xuICAgICAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgICAgIH1cbiAgICB9KSk7XG4gIH1cblxuICBfZGVzdHJveUZsaWNraXR5KCkge1xuICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkuZGVzdHJveSgpO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICB9XG59XG4iLCJpbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IGxheW91dCBmcm9tICcuLi9MYXlvdXQnO1xuaW1wb3J0IGdldEhlYWRlck9mZnNldCBmcm9tICcuLi9oZWxwZXJzL2dldEhlYWRlck9mZnNldCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN0YXRpY1NsaWRlc2hvdyB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLmVsID0gc2VjdGlvbi5lbDtcbiAgICB0aGlzLnNldHRpbmdzID0gc2VjdGlvbi5kYXRhO1xuXG4gICAgdGhpcy5jYXJvdXNlbCA9IHRoaXMuZWwucXVlcnlTZWxlY3RvcignLnNsaWRlc2hvdycpO1xuICAgIHRoaXMuc2xpZGVzID0gJy5zbGlkZXNob3ctc2xpZGUnO1xuICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yKCcuc2xpZGVzaG93LWhlaWdodC1mdWxsc2NyZWVuJylcbiAgICB0aGlzLmlzRnVsbHNjcmVlbiA9ICEhdGhpcy5jb250YWluZXI7XG4gICAgdGhpcy5zZWxlY3RCbG9ja09uTG9hZCA9IHRydWU7XG4gICAgdGhpcy5jb250aW51ZUF1dG9wbGF5ID0gdHJ1ZTtcbiAgICB0aGlzLnN0b3BBdXRvcGxheSA9IGZhbHNlO1xuICAgIHRoaXMuYXV0b3BsYXlUaW1lb3V0ID0gMDtcblxuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICAgIHRoaXMuZmxpY2tpdHlPcHRpb25zID0gbnVsbDtcblxuICAgIGlmICh0aGlzLmNhcm91c2VsICYmIHRoaXMuY2Fyb3VzZWwucXVlcnlTZWxlY3RvckFsbCh0aGlzLnNsaWRlcykubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5faW5pdFNsaWRlcigpO1xuICAgIH1cbiAgfVxuXG4gIF9pbml0U2xpZGVyKCkge1xuICAgIHRoaXMuZmxpY2tpdHlPcHRpb25zID0ge1xuICAgICAgYXV0b1BsYXk6IHRoaXMuc2V0dGluZ3MuZW5hYmxlX2F1dG9wbGF5ID8gdGhpcy5zZXR0aW5ncy5hdXRvcGxheV9kdXJhdGlvbiAqIDEwMDAgOiBmYWxzZSxcbiAgICAgIHNldEdhbGxlcnlTaXplOiAhdGhpcy5pc0Z1bGxzY3JlZW4sXG4gICAgICBwYXVzZUF1dG9QbGF5T25Ib3ZlcjogZmFsc2UsXG4gICAgICBhY2Nlc3NpYmlsaXR5OiB0cnVlLFxuICAgICAgYWRhcHRpdmVIZWlnaHQ6IHRydWUsXG4gICAgICBjZWxsQWxpZ246ICdsZWZ0JyxcbiAgICAgIGNlbGxTZWxlY3RvcjogdGhpcy5zbGlkZXMsXG4gICAgICBpbWFnZXNMb2FkZWQ6IHRydWUsXG4gICAgICBjb250YWluOiB0cnVlLFxuICAgICAgd3JhcEFyb3VuZDogdHJ1ZSxcbiAgICAgIGFycm93U2hhcGU6IHtcbiAgICAgICAgeDA6IDEwLFxuICAgICAgICB4MTogNjAsIHkxOiA1MCxcbiAgICAgICAgeDI6IDY1LCB5MjogNDUsXG4gICAgICAgIHgzOiAyMFxuICAgICAgfVxuICAgIH07XG5cbiAgICB0aGlzLl9iaW5kRmxpY2tpdHkoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuX3NsaWRlc2hvd0hlaWdodCgpO1xuICAgIHRoaXMuX3Bvc2l0aW9uRG90cygpO1xuICAgIHRoaXMuX2NoYW5nZUFycnJvd0NvbG9ycygpO1xuXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd0hlaWdodCgpO1xuICAgICAgdGhpcy5fcG9zaXRpb25Eb3RzKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VBcnJyb3dDb2xvcnMoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuZmxpY2tpdHkub24oJ3NlbGVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuX3NsaWRlc2hvd0hlaWdodCgpO1xuICAgICAgdGhpcy5fcG9zaXRpb25Eb3RzKCk7XG4gICAgICB0aGlzLl9jaGFuZ2VBcnJyb3dDb2xvcnMoKTtcblxuICAgICAgdGhpcy5zZWxlY3RCbG9ja09uTG9hZCA9IGZhbHNlO1xuXG4gICAgICBpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVfYXV0b3BsYXkgJiYgIXRoaXMuc3RvcEF1dG9wbGF5KSB7XG4gICAgICAgIHRoaXMuZmxpY2tpdHkucGF1c2VQbGF5ZXIoKTtcblxuICAgICAgICBpZiAodGhpcy5jb250aW51ZUF1dG9wbGF5KSB7XG4gICAgICAgICAgdGhpcy5hdXRvcGxheVRpbWVvdXQgPSAwO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuYXV0b3BsYXlUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbnRpbnVlQXV0b3BsYXkgPSB0cnVlO1xuXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZmxpY2tpdHkucGxheVBsYXllcigpO1xuICAgICAgICB9LCB0aGlzLmF1dG9wbGF5VGltZW91dCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmZsaWNraXR5Lm9uKCdkcmFnU3RhcnQnLCAoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRpbnVlQXV0b3BsYXkgPSBmYWxzZTtcbiAgICB9KTtcbiAgfVxuXG4gIF9wb3NpdGlvbkRvdHMoKSB7XG4gICAgY29uc3QgcGFnZURvdHMgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mbGlja2l0eS1wYWdlLWRvdHMnKTtcblxuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdYUycpICYmICF0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5mbGlja2l0eS5zZWxlY3RlZEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNsaWRlc2hvdy1iYWNrZ3JvdW5kJykub2Zmc2V0SGVpZ2h0O1xuICAgICAgY29uc3QgZ3V0dGVyQ29udGVudCA9IDU7XG5cbiAgICAgIHBhZ2VEb3RzLnN0eWxlLnRvcCA9IGAke2hlaWdodCArIGd1dHRlckNvbnRlbnR9cHhgO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYWdlRG90cy5zdHlsZS50b3AgPSAnYXV0byc7XG4gICAgfVxuICB9XG5cbiAgX2NoYW5nZUFycnJvd0NvbG9ycygpIHtcbiAgICBsZXQgY3VycmVudENvbG9yID0gdGhpcy5mbGlja2l0eS5zZWxlY3RlZEVsZW1lbnQucXVlcnlTZWxlY3RvcignLnNsaWRlc2hvdy1iYWNrZ3JvdW5kJykuZGF0YXNldDtcbiAgICBjb25zdCBkb3RzID0gdGhpcy5lbC5xdWVyeVNlbGVjdG9yQWxsKCcuZmxpY2tpdHktcGFnZS1kb3RzIC5kb3QnKTtcblxuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdYUycpICYmICF0aGlzLmlzRnVsbHNjcmVlbikge1xuICAgICAgY3VycmVudENvbG9yID0gY3VycmVudENvbG9yLnRoZW1lY29sb3I7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnRDb2xvciA9IGN1cnJlbnRDb2xvci5zbGlkZWNvbG9yO1xuICAgIH1cblxuICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLmZsaWNraXR5LXByZXYtbmV4dC1idXR0b24ucHJldmlvdXMgc3ZnJykuc3R5bGUuZmlsbCA9IGN1cnJlbnRDb2xvcjtcbiAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mbGlja2l0eS1wcmV2LW5leHQtYnV0dG9uLm5leHQgc3ZnJykuc3R5bGUuZmlsbCA9IGN1cnJlbnRDb2xvcjtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG90cy5sZW5ndGg7IGkrKykge1xuICAgICAgZG90c1tpXS5zdHlsZS5iYWNrZ3JvdW5kID0gY3VycmVudENvbG9yO1xuICAgIH1cbiAgfVxuXG4gIF9zbGlkZXNob3dIZWlnaHQoKSB7XG4gICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gZ2V0SGVhZGVyT2Zmc2V0KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5zaXRlLWhlYWRlci13cmFwcGVyJykpO1xuXG4gICAgaWYgKHRoaXMuaXNGdWxsc2NyZWVuKSB7XG4gICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5mbGlja2l0eS12aWV3cG9ydCcpLnN0eWxlLmhlaWdodCA9IGBjYWxjKDEwMHZoIC0gJHtoZWFkZXJIZWlnaHR9cHgpYDtcbiAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLmhlaWdodCA9IGBjYWxjKDEwMHZoIC0gJHtoZWFkZXJIZWlnaHR9cHgpYDtcbiAgICB9XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gIH1cblxuICBfYmluZEZsaWNraXR5KCkge1xuICAgIHRoaXMuZmxpY2tpdHkgPSBuZXcgRmxpY2tpdHkodGhpcy5jYXJvdXNlbCwgdGhpcy5mbGlja2l0eU9wdGlvbnMpO1xuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIF9kZXN0cm95RmxpY2tpdHkoKSB7XG4gICAgaWYgKCF0aGlzLmZsaWNraXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5mbGlja2l0eS5kZXN0cm95KCk7XG4gIH1cblxuICBvblNlY3Rpb25CbG9ja1NlbGVjdChibG9jaykge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5mbGlja2l0eS5yZXNpemUoKTtcbiAgICB9LCAxMDApO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MuZW5hYmxlX2F1dG9wbGF5KSB7XG4gICAgICBjb25zdCAkc2xpZGVzID0gJCh0aGlzLnNsaWRlcyk7XG4gICAgICBjb25zdCAkc2xpZGUgPSAkKGJsb2NrLmVsKTtcbiAgICAgIGNvbnN0IHNsaWRlSW5kZXggPSAkc2xpZGVzLmluZGV4KCRzbGlkZSk7XG5cbiAgICAgIHRoaXMuc3RvcEF1dG9wbGF5ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZmxpY2tpdHkucGF1c2VQbGF5ZXIoKTtcblxuICAgICAgaWYgKCEkc2xpZGUuaGFzQ2xhc3MoJ2lzLXNlbGVjdGVkJykgJiYgIXRoaXMuc2VsZWN0QmxvY2tPbkxvYWQpIHtcbiAgICAgICAgdGhpcy5mbGlja2l0eS5zZWxlY3Qoc2xpZGVJbmRleCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RCbG9ja09uTG9hZCkge1xuICAgICAgICB0aGlzLmZsaWNraXR5LnNlbGVjdChzbGlkZUluZGV4LCBmYWxzZSwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tEZXNlbGVjdCgpIHtcbiAgICBpZiAodGhpcy5zZXR0aW5ncy5lbmFibGVfYXV0b3BsYXkpIHtcbiAgICAgIHRoaXMuc3RvcEF1dG9wbGF5ID0gZmFsc2U7XG4gICAgICB0aGlzLmZsaWNraXR5LnBsYXlQbGF5ZXIoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNQcm9tb0Jsb2NrcyB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy5jb250ZW50ID0gJ1tkYXRhLXByb21vLWJsb2NrLWNvbnRlbnRdJztcbiAgICB0aGlzLmV4cGFuZGVkQ2xhc3MgPSAncHJvbW8tYmxvY2stLWV4cGFuZGVkJztcbiAgICB0aGlzLmNvbXByZXNzQmxvY2tzID0gc2VjdGlvbi5kYXRhLmNvbXByZXNzX2Jsb2NrcztcblxuICAgIC8vIFJldmVydCBuYXZpZ2F0aW9uIHRvIG9yaWdpbmFsIHN0YXRlIG9uIGJyZWFrcG9pbnQgY2hhbmdlXG4gICAgdGhpcy5sYXlvdXRIYW5kbGVyID0gdGhpcy5vbkJyZWFrcG9pbnRDaGFuZ2UuYmluZCh0aGlzKTtcbiAgICBsYXlvdXQub25CcmVha3BvaW50Q2hhbmdlKHRoaXMubGF5b3V0SGFuZGxlcik7XG5cbiAgICB0aGlzLl9ibG9ja0ludGVyYWN0aW9uID0gdGhpcy5fYmxvY2tJbnRlcmFjdGlvbi5iaW5kKHRoaXMpO1xuXG4gICAgdGhpcy4kZWwub24oJ2NsaWNrLnByb21vLWJsb2NrJywgdGhpcy5jb250ZW50LCB0aGlzLl9ibG9ja0ludGVyYWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgYmxvY2sncyB0b2dnbGVkIHN0YXRlIGFuZCBhdHRyaWJ1dGVzIHdoZW4gbGVhdmluZyBtb2JpbGVcbiAgICovXG4gIG9uQnJlYWtwb2ludENoYW5nZSgpIHtcbiAgICBpZiAoIWxheW91dC5pc0JyZWFrcG9pbnQoJ1hTJykpIHtcbiAgICAgIHRoaXMuJGVsLmZpbmQoYC4ke3RoaXMuZXhwYW5kZWRDbGFzc31gKS5lYWNoKChpLCBjb250ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuX2NvbGxhcHNlKGNvbnRlbnQpO1xuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCBldmVudHMgd2hlbiBzZWN0aW9uIGlzIHJlLWRyYXduXG4gICAqL1xuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy4kZWwub2ZmKCcucHJvbW8tYmxvY2snKTtcbiAgICBsYXlvdXQub2ZmQnJlYWtwb2ludENoYW5nZSh0aGlzLmxheW91dEhhbmRsZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIG9wZW4gYmxvY2sgb24gbW9iaWxlIGZyb20gdGhlIFRFXG4gICAqXG4gICAqIEBwYXJhbSBibG9ja1xuICAgKi9cbiAgb25TZWN0aW9uQmxvY2tTZWxlY3QoYmxvY2spIHtcbiAgICBpZiAoIWxheW91dC5pc0JyZWFrcG9pbnQoJ1hTJykpIHJldHVybjtcblxuICAgIHRoaXMuX2V4cGFuZChibG9jay5lbC5xdWVyeVNlbGVjdG9yKHRoaXMuY29udGVudCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxiYWNrIHRvIGNsb3NlIGJsb2NrIG9uIG1vYmlsZSBmcm9tIHRoZSBURVxuICAgKlxuICAgKiBAcGFyYW0gYmxvY2tcbiAgICovXG4gIG9uU2VjdGlvbkJsb2NrRGVzZWxlY3QoYmxvY2spIHtcbiAgICBpZiAoIWxheW91dC5pc0JyZWFrcG9pbnQoJ1hTJykpIHJldHVybjtcblxuICAgIHRoaXMuX2NvbGxhcHNlKGJsb2NrLmVsLnF1ZXJ5U2VsZWN0b3IodGhpcy5jb250ZW50KSk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIGEgYmxvY2sgb24gZmlyc3QgY2xpY2ssIHRoZW4gYWxsb3cgaXQgdG8gYmVoYXZlIGFzIG5vcm1hbFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnRcbiAgICogQHByaXZhdGVcbiAgICovXG4gIF9ibG9ja0ludGVyYWN0aW9uKGV2ZW50KSB7XG4gICAgY29uc3QgY29udGVudCA9IGV2ZW50LmN1cnJlbnRUYXJnZXQ7XG4gICAgY29uc3QgY2xpY2tlZCA9IGNvbnRlbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNsaWNrZWQnKTtcblxuICAgIC8vIE9uIHNlY29uZCBjbGljaywgb3Igb24gZGVza3RvcCwgZG9uJ3QgaW50ZXJmZXJlIHdpdGggYmxvY2tcbiAgICBpZiAoY2xpY2tlZCB8fCAhbGF5b3V0LmlzQnJlYWtwb2ludCgnWFMnKSB8fCAhdGhpcy5jb21wcmVzc0Jsb2Nrcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgY29udGVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY2xpY2tlZCcsICdjbGlja2VkJyk7XG5cbiAgICB0aGlzLl9leHBhbmQoY29udGVudCk7XG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kIHByb21vIGJsb2NrXG4gICAqXG4gICAqIEBwYXJhbSBjb250ZW50XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXhwYW5kKGNvbnRlbnQpIHtcbiAgICBpZiAoIXRoaXMuY29tcHJlc3NCbG9ja3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCAkY29udGVudCA9ICQoY29udGVudCk7XG5cbiAgICAkY29udGVudFxuICAgICAgLmFkZENsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLWluJylcbiAgICAgIC5vbmUoJ3RyZW5kJywgKCkgPT4ge1xuICAgICAgICAkY29udGVudFxuICAgICAgICAgIC5yZW1vdmVDbGFzcygnYW5pbWF0aW5nIGFuaW1hdGluZy1pbicpXG4gICAgICAgICAgLmFkZENsYXNzKHRoaXMuZXhwYW5kZWRDbGFzcylcbiAgICAgICAgICAub2ZmKCd0cmVuZCcpO1xuICAgICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQ29sbGFwc2UgYSBibG9ja1xuICAgKlxuICAgKiBAcGFyYW0gY29udGVudFxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2NvbGxhcHNlKGNvbnRlbnQpIHtcbiAgICBpZiAoIXRoaXMuY29tcHJlc3NCbG9ja3MpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCAkY29udGVudCA9ICQoY29udGVudCk7XG5cbiAgICAkY29udGVudFxuICAgICAgLmFkZENsYXNzKCdhbmltYXRpbmcgYW5pbWF0aW5nLW91dCcpXG4gICAgICAub25lKCd0cmVuZCcsICgpID0+IHtcbiAgICAgICAgJGNvbnRlbnRcbiAgICAgICAgICAucmVtb3ZlQ2xhc3MoYGFuaW1hdGluZyBhbmltYXRpbmctb3V0ICR7dGhpcy5leHBhbmRlZENsYXNzfWApXG4gICAgICAgICAgLm9mZigndHJlbmQnKTtcbiAgICAgICAgY29udGVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtY2xpY2tlZCcpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmltcG9ydCBBY2NvcmRpb24gZnJvbSAnLi4vQWNjb3JkaW9uJztcbmltcG9ydCBsYXlvdXQgZnJvbSAnLi4vTGF5b3V0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY01lbnVMaXN0IHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcbiAgICB0aGlzLmNvbnRleHQgPSBzZWN0aW9uLmRhdGEuY29udGV4dDtcbiAgICB0aGlzLkFjY29yZGlvbiA9IG5ldyBBY2NvcmRpb24odGhpcy4kZWwpO1xuXG4gICAgLy8gSGFuZGxlIEFjY29yZGlvbiBpbnRlcmFjdGlvbiB3aGVuIHdpbmRvdyBzaXplIGNoYW5nZXNcbiAgICB0aGlzLmxheW91dEhhbmRsZXIgPSB0aGlzLm9uQnJlYWtwb2ludENoYW5nZS5iaW5kKHRoaXMpO1xuICAgIGxheW91dC5vbkJyZWFrcG9pbnRDaGFuZ2UodGhpcy5sYXlvdXRIYW5kbGVyKTtcblxuICAgIHRoaXMuX2JpbmRFdmVudHMoKTtcbiAgfVxuXG4gIF9iaW5kRXZlbnRzKCkge1xuICAgIHRoaXMuJGVsLm9uKCdjbGljay5tZW51LWxpc3QnLCAnW2RhdGEtYWNjb3JkaW9uLXRyaWdnZXJdJywgZXZlbnQgPT4ge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIHRoaXMuX3RvZ2dsZUFjY29yZGlvbigkKGV2ZW50LmN1cnJlbnRUYXJnZXQpLnBhcmVudCgpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuJGVsLm9uKCdjbGljay5tZW51LWxpc3QnLCAnW2RhdGEtbWVudWxpc3QtdG9nZ2xlXScsIGV2ZW50ID0+IHtcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB0aGlzLl90b2dnbGVMaXN0KGV2ZW50LmN1cnJlbnRUYXJnZXQpO1xuICAgIH0pO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMuJGVsLm9mZignLm1lbnUtbGlzdCcpO1xuXG4gICAgZGVsZXRlIHRoaXMuQWNjb3JkaW9uO1xuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tTZWxlY3QoYmxvY2spIHtcbiAgICB0aGlzLl90b2dnbGVBY2NvcmRpb24oJChibG9jay5lbCksIHRydWUpO1xuICB9XG5cbiAgb25TZWN0aW9uQmxvY2tEZXNlbGVjdChibG9jaykge1xuICAgIHRoaXMuX3RvZ2dsZUFjY29yZGlvbigkKGJsb2NrLmVsKSwgZmFsc2UpO1xuICB9XG5cbiAgX3RvZ2dsZUFjY29yZGlvbigkYmxvY2spIHtcbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSByZXR1cm47XG5cbiAgICB0aGlzLkFjY29yZGlvbi50b2dnbGUoJGJsb2NrKTtcbiAgfVxuXG4gIF90b2dnbGVMaXN0KGVsKSB7XG4gICAgY29uc3QgJHRyaWdnZXIgPSAkKGVsKTtcbiAgICBjb25zdCAkaXRlbXMgPSAkdHJpZ2dlci5wYXJlbnQoKS5zaWJsaW5ncygnW2RhdGEtaGlkZGVuLWRlZmF1bHRdJyk7XG4gICAgY29uc3Qgc2libGluZ3NWaXNpYmxlID0gJHRyaWdnZXIuZGF0YSgnbWVudWxpc3QtdG9nZ2xlJyk7XG5cbiAgICAkaXRlbXMudG9nZ2xlQ2xhc3MoJ21lbnVsaXN0LS1tZW51LWl0ZW0taGlkZGVuJywgc2libGluZ3NWaXNpYmxlKTtcbiAgICAkdHJpZ2dlclxuICAgICAgLmRhdGEoJ21lbnVsaXN0LXRvZ2dsZScsICFzaWJsaW5nc1Zpc2libGUpXG4gICAgICAudGV4dCghc2libGluZ3NWaXNpYmxlID8gdGhpcy5jb250ZXh0LnNlZV9sZXNzIDogdGhpcy5jb250ZXh0LnNlZV9tb3JlKTtcbiAgfVxuXG4gIG9uQnJlYWtwb2ludENoYW5nZShldmVudCwgYnJlYWtwb2ludHMpIHtcbiAgICBpZiAobGF5b3V0LmlzQnJlYWtwb2ludCgnTCcpKSB7XG4gICAgICB0aGlzLkFjY29yZGlvbi5vcGVuQWxsKCk7XG4gICAgfSBlbHNlIGlmIChicmVha3BvaW50cy5wcmV2aW91cyA9PT0gJ0wnICYmICFsYXlvdXQuaXNCcmVha3BvaW50KCdMJykpIHtcbiAgICAgIHRoaXMuQWNjb3JkaW9uLmNsb3NlT3BlbigpO1xuICAgIH1cbiAgfVxufVxuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuKiAgIyMjIyBUd2l0dGVyIFBvc3QgRmV0Y2hlciB2MTcuMC4zICMjIyNcbiogIENvZGVkIGJ5IEphc29uIE1heWVzIDIwMTUuIEEgcHJlc2VudCB0byBhbGwgdGhlIGRldmVsb3BlcnMgb3V0IHRoZXJlLlxuKiAgd3d3Lmphc29ubWF5ZXMuY29tXG4qICBQbGVhc2Uga2VlcCB0aGlzIGRpc2NsYWltZXIgd2l0aCBteSBjb2RlIGlmIHlvdSB1c2UgaXQuIFRoYW5rcy4gOi0pXG4qICBHb3QgZmVlZGJhY2sgb3IgcXVlc3Rpb25zLCBhc2sgaGVyZTpcbiogIGh0dHA6Ly93d3cuamFzb25tYXllcy5jb20vcHJvamVjdHMvdHdpdHRlckFwaS9cbiogIEdpdGh1YjogaHR0cHM6Ly9naXRodWIuY29tL2phc29ubWF5ZXMvVHdpdHRlci1Qb3N0LUZldGNoZXJcbiogIFVwZGF0ZXMgd2lsbCBiZSBwb3N0ZWQgdG8gdGhpcyBzaXRlLlxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuKGZ1bmN0aW9uKHJvb3QsZmFjdG9yeSl7aWYodHlwZW9mIGRlZmluZT09PSdmdW5jdGlvbicmJmRlZmluZS5hbWQpe2RlZmluZShbXSxmYWN0b3J5KTt9ZWxzZSBpZih0eXBlb2YgZXhwb3J0cz09PSdvYmplY3QnKXttb2R1bGUuZXhwb3J0cz1mYWN0b3J5KCk7fWVsc2V7ZmFjdG9yeSgpO319KHRoaXMsZnVuY3Rpb24oKXt2YXIgZG9tTm9kZT0nJzt2YXIgbWF4VHdlZXRzPTIwO3ZhciBwYXJzZUxpbmtzPXRydWU7dmFyIHF1ZXVlPVtdO3ZhciBpblByb2dyZXNzPWZhbHNlO3ZhciBwcmludFRpbWU9dHJ1ZTt2YXIgcHJpbnRVc2VyPXRydWU7dmFyIGZvcm1hdHRlckZ1bmN0aW9uPW51bGw7dmFyIHN1cHBvcnRzQ2xhc3NOYW1lPXRydWU7dmFyIHNob3dSdHM9dHJ1ZTt2YXIgY3VzdG9tQ2FsbGJhY2tGdW5jdGlvbj1udWxsO3ZhciBzaG93SW50ZXJhY3Rpb25MaW5rcz10cnVlO3ZhciBzaG93SW1hZ2VzPWZhbHNlO3ZhciB1c2VFbW9qaT1mYWxzZTt2YXIgdGFyZ2V0Qmxhbms9dHJ1ZTt2YXIgbGFuZz0nZW4nO3ZhciBwZXJtYWxpbmtzPXRydWU7dmFyIGRhdGFPbmx5PWZhbHNlO3ZhciBzY3JpcHQ9bnVsbDt2YXIgc2NyaXB0QWRkZWQ9ZmFsc2U7ZnVuY3Rpb24gaGFuZGxlVHdlZXRzKHR3ZWV0cyl7aWYoY3VzdG9tQ2FsbGJhY2tGdW5jdGlvbj09PW51bGwpe3ZhciB4PXR3ZWV0cy5sZW5ndGg7dmFyIG49MDt2YXIgZWxlbWVudD1kb2N1bWVudC5nZXRFbGVtZW50QnlJZChkb21Ob2RlKTt2YXIgaHRtbD0nPHVsPic7d2hpbGUobjx4KXtodG1sKz0nPGxpPicrdHdlZXRzW25dKyc8L2xpPic7bisrO31cbmh0bWwrPSc8L3VsPic7ZWxlbWVudC5pbm5lckhUTUw9aHRtbDt9ZWxzZXtjdXN0b21DYWxsYmFja0Z1bmN0aW9uKHR3ZWV0cyk7fX1cbmZ1bmN0aW9uIHN0cmlwKGRhdGEpe3JldHVybiBkYXRhLnJlcGxhY2UoLzxiW14+XSo+KC4qPyk8XFwvYj4vZ2ksZnVuY3Rpb24oYSxzKXtyZXR1cm4gczt9KS5yZXBsYWNlKC9jbGFzcz1cIig/ISh0Y28taGlkZGVufHRjby1kaXNwbGF5fHRjby1lbGxpcHNpcykpKy4qP1wifGRhdGEtcXVlcnktc291cmNlPVwiLio/XCJ8ZGlyPVwiLio/XCJ8cmVsPVwiLio/XCIvZ2ksJycpO31cbmZ1bmN0aW9uIHRhcmdldExpbmtzVG9OZXdXaW5kb3coZWwpe3ZhciBsaW5rcz1lbC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYScpO2Zvcih2YXIgaT1saW5rcy5sZW5ndGgtMTtpPj0wO2ktLSl7bGlua3NbaV0uc2V0QXR0cmlidXRlKCd0YXJnZXQnLCdfYmxhbmsnKTt9fVxuZnVuY3Rpb24gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShub2RlLGNsYXNzbmFtZSl7dmFyIGE9W107dmFyIHJlZ2V4PW5ldyBSZWdFeHAoJyhefCApJytjbGFzc25hbWUrJyggfCQpJyk7dmFyIGVsZW1zPW5vZGUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJyonKTtmb3IodmFyIGk9MCxqPWVsZW1zLmxlbmd0aDtpPGo7aSsrKXtpZihyZWdleC50ZXN0KGVsZW1zW2ldLmNsYXNzTmFtZSkpe2EucHVzaChlbGVtc1tpXSk7fX1cbnJldHVybiBhO31cbmZ1bmN0aW9uIGV4dHJhY3RJbWFnZVVybChpbWFnZV9kYXRhKXtpZihpbWFnZV9kYXRhIT09dW5kZWZpbmVkJiZpbWFnZV9kYXRhLmlubmVySFRNTC5pbmRleE9mKCdkYXRhLWltYWdlJyk+PTApe3ZhciBkYXRhX3NyYz1pbWFnZV9kYXRhLmlubmVySFRNTC5tYXRjaCgvZGF0YS1pbWFnZT1cXFwiKFtBLXowLTldKzpcXC9cXC9bQS16MC05XStcXC5bQS16MC05XStcXC5bQS16MC05XStcXC9bQS16MC05XStcXC9bQS16MC05XFwtXSspL2kpWzFdO3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZGF0YV9zcmMpKycuanBnJzt9fVxudmFyIHR3aXR0ZXJGZXRjaGVyPXtmZXRjaDpmdW5jdGlvbihjb25maWcpe2lmKGNvbmZpZy5tYXhUd2VldHM9PT11bmRlZmluZWQpe2NvbmZpZy5tYXhUd2VldHM9MjA7fVxuaWYoY29uZmlnLmVuYWJsZUxpbmtzPT09dW5kZWZpbmVkKXtjb25maWcuZW5hYmxlTGlua3M9dHJ1ZTt9XG5pZihjb25maWcuc2hvd1VzZXI9PT11bmRlZmluZWQpe2NvbmZpZy5zaG93VXNlcj10cnVlO31cbmlmKGNvbmZpZy5zaG93VGltZT09PXVuZGVmaW5lZCl7Y29uZmlnLnNob3dUaW1lPXRydWU7fVxuaWYoY29uZmlnLmRhdGVGdW5jdGlvbj09PXVuZGVmaW5lZCl7Y29uZmlnLmRhdGVGdW5jdGlvbj0nZGVmYXVsdCc7fVxuaWYoY29uZmlnLnNob3dSZXR3ZWV0PT09dW5kZWZpbmVkKXtjb25maWcuc2hvd1JldHdlZXQ9dHJ1ZTt9XG5pZihjb25maWcuY3VzdG9tQ2FsbGJhY2s9PT11bmRlZmluZWQpe2NvbmZpZy5jdXN0b21DYWxsYmFjaz1udWxsO31cbmlmKGNvbmZpZy5zaG93SW50ZXJhY3Rpb249PT11bmRlZmluZWQpe2NvbmZpZy5zaG93SW50ZXJhY3Rpb249dHJ1ZTt9XG5pZihjb25maWcuc2hvd0ltYWdlcz09PXVuZGVmaW5lZCl7Y29uZmlnLnNob3dJbWFnZXM9ZmFsc2U7fVxuaWYoY29uZmlnLnVzZUVtb2ppPT09dW5kZWZpbmVkKXtjb25maWcudXNlRW1vamk9ZmFsc2U7fVxuaWYoY29uZmlnLmxpbmtzSW5OZXdXaW5kb3c9PT11bmRlZmluZWQpe2NvbmZpZy5saW5rc0luTmV3V2luZG93PXRydWU7fVxuaWYoY29uZmlnLnNob3dQZXJtYWxpbmtzPT09dW5kZWZpbmVkKXtjb25maWcuc2hvd1Blcm1hbGlua3M9dHJ1ZTt9XG5pZihjb25maWcuZGF0YU9ubHk9PT11bmRlZmluZWQpe2NvbmZpZy5kYXRhT25seT1mYWxzZTt9XG5pZihpblByb2dyZXNzKXtxdWV1ZS5wdXNoKGNvbmZpZyk7fWVsc2V7aW5Qcm9ncmVzcz10cnVlO2RvbU5vZGU9Y29uZmlnLmRvbUlkO21heFR3ZWV0cz1jb25maWcubWF4VHdlZXRzO3BhcnNlTGlua3M9Y29uZmlnLmVuYWJsZUxpbmtzO3ByaW50VXNlcj1jb25maWcuc2hvd1VzZXI7cHJpbnRUaW1lPWNvbmZpZy5zaG93VGltZTtzaG93UnRzPWNvbmZpZy5zaG93UmV0d2VldDtmb3JtYXR0ZXJGdW5jdGlvbj1jb25maWcuZGF0ZUZ1bmN0aW9uO2N1c3RvbUNhbGxiYWNrRnVuY3Rpb249Y29uZmlnLmN1c3RvbUNhbGxiYWNrO3Nob3dJbnRlcmFjdGlvbkxpbmtzPWNvbmZpZy5zaG93SW50ZXJhY3Rpb247c2hvd0ltYWdlcz1jb25maWcuc2hvd0ltYWdlczt1c2VFbW9qaT1jb25maWcudXNlRW1vamk7dGFyZ2V0Qmxhbms9Y29uZmlnLmxpbmtzSW5OZXdXaW5kb3c7cGVybWFsaW5rcz1jb25maWcuc2hvd1Blcm1hbGlua3M7ZGF0YU9ubHk9Y29uZmlnLmRhdGFPbmx5O3ZhciBoZWFkPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07aWYoc2NyaXB0IT09bnVsbCl7aGVhZC5yZW1vdmVDaGlsZChzY3JpcHQpO31cbnNjcmlwdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtzY3JpcHQudHlwZT0ndGV4dC9qYXZhc2NyaXB0JztpZihjb25maWcubGlzdCE9PXVuZGVmaW5lZCl7c2NyaXB0LnNyYz0naHR0cHM6Ly9zeW5kaWNhdGlvbi50d2l0dGVyLmNvbS90aW1lbGluZS9saXN0PycrJ2NhbGxiYWNrPV9fdHd0dHJmLmNhbGxiYWNrJmRudD1mYWxzZSZsaXN0X3NsdWc9JytcbmNvbmZpZy5saXN0Lmxpc3RTbHVnKycmc2NyZWVuX25hbWU9Jytjb25maWcubGlzdC5zY3JlZW5OYW1lKycmc3VwcHJlc3NfcmVzcG9uc2VfY29kZXM9dHJ1ZSZsYW5nPScrKGNvbmZpZy5sYW5nfHxsYW5nKSsnJnJuZD0nK01hdGgucmFuZG9tKCk7fWVsc2UgaWYoY29uZmlnLnByb2ZpbGUhPT11bmRlZmluZWQpe3NjcmlwdC5zcmM9J2h0dHBzOi8vc3luZGljYXRpb24udHdpdHRlci5jb20vdGltZWxpbmUvcHJvZmlsZT8nKydjYWxsYmFjaz1fX3R3dHRyZi5jYWxsYmFjayZkbnQ9ZmFsc2UnKycmc2NyZWVuX25hbWU9Jytjb25maWcucHJvZmlsZS5zY3JlZW5OYW1lKycmc3VwcHJlc3NfcmVzcG9uc2VfY29kZXM9dHJ1ZSZsYW5nPScrKGNvbmZpZy5sYW5nfHxsYW5nKSsnJnJuZD0nK01hdGgucmFuZG9tKCk7fWVsc2UgaWYoY29uZmlnLmxpa2VzIT09dW5kZWZpbmVkKXtzY3JpcHQuc3JjPSdodHRwczovL3N5bmRpY2F0aW9uLnR3aXR0ZXIuY29tL3RpbWVsaW5lL2xpa2VzPycrJ2NhbGxiYWNrPV9fdHd0dHJmLmNhbGxiYWNrJmRudD1mYWxzZScrJyZzY3JlZW5fbmFtZT0nK2NvbmZpZy5saWtlcy5zY3JlZW5OYW1lKycmc3VwcHJlc3NfcmVzcG9uc2VfY29kZXM9dHJ1ZSZsYW5nPScrKGNvbmZpZy5sYW5nfHxsYW5nKSsnJnJuZD0nK01hdGgucmFuZG9tKCk7fWVsc2V7c2NyaXB0LnNyYz0naHR0cHM6Ly9jZG4uc3luZGljYXRpb24udHdpbWcuY29tL3dpZGdldHMvdGltZWxpbmVzLycrXG5jb25maWcuaWQrJz8mbGFuZz0nKyhjb25maWcubGFuZ3x8bGFuZykrJyZjYWxsYmFjaz1fX3R3dHRyZi5jYWxsYmFjayYnKydzdXBwcmVzc19yZXNwb25zZV9jb2Rlcz10cnVlJnJuZD0nK01hdGgucmFuZG9tKCk7fVxuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO319LGNhbGxiYWNrOmZ1bmN0aW9uKGRhdGEpe2lmKGRhdGE9PT11bmRlZmluZWR8fGRhdGEuYm9keT09PXVuZGVmaW5lZCl7aW5Qcm9ncmVzcz1mYWxzZTtpZihxdWV1ZS5sZW5ndGg+MCl7dHdpdHRlckZldGNoZXIuZmV0Y2gocXVldWVbMF0pO3F1ZXVlLnNwbGljZSgwLDEpO31cbnJldHVybjt9XG5pZighdXNlRW1vamkpe2RhdGEuYm9keT1kYXRhLmJvZHkucmVwbGFjZSgvKDxpbWdbXmNdKmNsYXNzPVwiRW1vamlbXj5dKj4pfCg8aW1nW15jXSpjbGFzcz1cInUtYmxvY2tbXj5dKj4pL2csJycpO31cbmlmKCFzaG93SW1hZ2VzKXtkYXRhLmJvZHk9ZGF0YS5ib2R5LnJlcGxhY2UoLyg8aW1nW15jXSpjbGFzcz1cIk5hdHVyYWxJbWFnZS1pbWFnZVtePl0qPnwoPGltZ1teY10qY2xhc3M9XCJDcm9wcGVkSW1hZ2UtaW1hZ2VbXj5dKj4pKS9nLCcnKTt9XG5pZighcHJpbnRVc2VyKXtkYXRhLmJvZHk9ZGF0YS5ib2R5LnJlcGxhY2UoLyg8aW1nW15jXSpjbGFzcz1cIkF2YXRhclwiW14+XSo+KS9nLCcnKTt9XG52YXIgZGl2PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO2Rpdi5pbm5lckhUTUw9ZGF0YS5ib2R5O2lmKHR5cGVvZihkaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSk9PT0ndW5kZWZpbmVkJyl7c3VwcG9ydHNDbGFzc05hbWU9ZmFsc2U7fVxuZnVuY3Rpb24gc3dhcERhdGFTcmMoZWxlbWVudCl7dmFyIGF2YXRhckltZz1lbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdpbWcnKVswXTtpZihhdmF0YXJJbWcgJiYgYXZhdGFySW1nLmxlbmd0aCl7YXZhdGFySW1nLnNyYz1hdmF0YXJJbWcuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYy0yeCcpO31yZXR1cm4gZWxlbWVudDt9XG52YXIgdHdlZXRzPVtdO3ZhciBhdXRob3JzPVtdO3ZhciB0aW1lcz1bXTt2YXIgaW1hZ2VzPVtdO3ZhciBydHM9W107dmFyIHRpZHM9W107dmFyIHBlcm1hbGlua3NVUkw9W107dmFyIHg9MDtpZihzdXBwb3J0c0NsYXNzTmFtZSl7dmFyIHRtcD1kaXYuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgndGltZWxpbmUtVHdlZXQnKTt3aGlsZSh4PHRtcC5sZW5ndGgpe2lmKHRtcFt4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1Ud2VldC1yZXR3ZWV0Q3JlZGl0JykubGVuZ3RoPjApe3J0cy5wdXNoKHRydWUpO31lbHNle3J0cy5wdXNoKGZhbHNlKTt9XG5pZighcnRzW3hdfHxydHNbeF0mJnNob3dSdHMpe3R3ZWV0cy5wdXNoKHRtcFt4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1Ud2VldC10ZXh0JylbMF0pO3RpZHMucHVzaCh0bXBbeF0uZ2V0QXR0cmlidXRlKCdkYXRhLXR3ZWV0LWlkJykpO2lmKHByaW50VXNlcil7YXV0aG9ycy5wdXNoKHN3YXBEYXRhU3JjKHRtcFt4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1Ud2VldC1hdXRob3InKVswXSkpO31cbnRpbWVzLnB1c2godG1wW3hdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ2R0LXVwZGF0ZWQnKVswXSk7cGVybWFsaW5rc1VSTC5wdXNoKHRtcFt4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1Ud2VldC10aW1lc3RhbXAnKVswXSk7aWYodG1wW3hdLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoJ3RpbWVsaW5lLVR3ZWV0LW1lZGlhJylbMF0hPT11bmRlZmluZWQpe2ltYWdlcy5wdXNoKHRtcFt4XS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCd0aW1lbGluZS1Ud2VldC1tZWRpYScpWzBdKTt9ZWxzZXtpbWFnZXMucHVzaCh1bmRlZmluZWQpO319XG54Kys7fX1lbHNle3ZhciB0bXA9Z2V0RWxlbWVudHNCeUNsYXNzTmFtZShkaXYsJ3RpbWVsaW5lLVR3ZWV0Jyk7d2hpbGUoeDx0bXAubGVuZ3RoKXtpZihnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRtcFt4XSwndGltZWxpbmUtVHdlZXQtcmV0d2VldENyZWRpdCcpLmxlbmd0aD4wKXtydHMucHVzaCh0cnVlKTt9ZWxzZXtydHMucHVzaChmYWxzZSk7fVxuaWYoIXJ0c1t4XXx8cnRzW3hdJiZzaG93UnRzKXt0d2VldHMucHVzaChnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRtcFt4XSwndGltZWxpbmUtVHdlZXQtdGV4dCcpWzBdKTt0aWRzLnB1c2godG1wW3hdLmdldEF0dHJpYnV0ZSgnZGF0YS10d2VldC1pZCcpKTtpZihwcmludFVzZXIpe2F1dGhvcnMucHVzaChzd2FwRGF0YVNyYyhnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRtcFt4XSwndGltZWxpbmUtVHdlZXQtYXV0aG9yJylbMF0pKTt9XG50aW1lcy5wdXNoKGdldEVsZW1lbnRzQnlDbGFzc05hbWUodG1wW3hdLCdkdC11cGRhdGVkJylbMF0pO3Blcm1hbGlua3NVUkwucHVzaChnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRtcFt4XSwndGltZWxpbmUtVHdlZXQtdGltZXN0YW1wJylbMF0pO2lmKGdldEVsZW1lbnRzQnlDbGFzc05hbWUodG1wW3hdLCd0aW1lbGluZS1Ud2VldC1tZWRpYScpWzBdIT09dW5kZWZpbmVkKXtpbWFnZXMucHVzaChnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKHRtcFt4XSwndGltZWxpbmUtVHdlZXQtbWVkaWEnKVswXSk7fWVsc2V7aW1hZ2VzLnB1c2godW5kZWZpbmVkKTt9fVxueCsrO319XG5pZih0d2VldHMubGVuZ3RoPm1heFR3ZWV0cyl7dHdlZXRzLnNwbGljZShtYXhUd2VldHMsKHR3ZWV0cy5sZW5ndGgtbWF4VHdlZXRzKSk7YXV0aG9ycy5zcGxpY2UobWF4VHdlZXRzLChhdXRob3JzLmxlbmd0aC1tYXhUd2VldHMpKTt0aW1lcy5zcGxpY2UobWF4VHdlZXRzLCh0aW1lcy5sZW5ndGgtbWF4VHdlZXRzKSk7cnRzLnNwbGljZShtYXhUd2VldHMsKHJ0cy5sZW5ndGgtbWF4VHdlZXRzKSk7aW1hZ2VzLnNwbGljZShtYXhUd2VldHMsKGltYWdlcy5sZW5ndGgtbWF4VHdlZXRzKSk7cGVybWFsaW5rc1VSTC5zcGxpY2UobWF4VHdlZXRzLChwZXJtYWxpbmtzVVJMLmxlbmd0aC1tYXhUd2VldHMpKTt9XG52YXIgYXJyYXlUd2VldHM9W107dmFyIHg9dHdlZXRzLmxlbmd0aDt2YXIgbj0wO2lmKGRhdGFPbmx5KXt3aGlsZShuPHgpe2FycmF5VHdlZXRzLnB1c2goe3R3ZWV0OnR3ZWV0c1tuXS5pbm5lckhUTUwsYXV0aG9yOmF1dGhvcnNbbl0/YXV0aG9yc1tuXS5pbm5lckhUTUw6J1Vua25vd24gQXV0aG9yJyxhdXRob3JfZGF0YTp7cHJvZmlsZV91cmw6YXV0aG9yc1tuXT9hdXRob3JzW25dLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNjcmliZT1cImVsZW1lbnQ6dXNlcl9saW5rXCJdJykuaHJlZjpudWxsLHByb2ZpbGVfaW1hZ2U6YXV0aG9yc1tuXT9hdXRob3JzW25dLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXNjcmliZT1cImVsZW1lbnQ6YXZhdGFyXCJdJykuZ2V0QXR0cmlidXRlKCdkYXRhLXNyYy0xeCcpOm51bGwscHJvZmlsZV9pbWFnZV8yeDphdXRob3JzW25dP2F1dGhvcnNbbl0ucXVlcnlTZWxlY3RvcignW2RhdGEtc2NyaWJlPVwiZWxlbWVudDphdmF0YXJcIl0nKS5nZXRBdHRyaWJ1dGUoJ2RhdGEtc3JjLTJ4Jyk6bnVsbCxzY3JlZW5fbmFtZTphdXRob3JzW25dP2F1dGhvcnNbbl0ucXVlcnlTZWxlY3RvcignW2RhdGEtc2NyaWJlPVwiZWxlbWVudDpzY3JlZW5fbmFtZVwiXScpLnRpdGxlOm51bGwsbmFtZTphdXRob3JzW25dP2F1dGhvcnNbbl0ucXVlcnlTZWxlY3RvcignW2RhdGEtc2NyaWJlPVwiZWxlbWVudDpuYW1lXCJdJykudGl0bGU6bnVsbH0sdGltZTp0aW1lc1tuXS50ZXh0Q29udGVudCx0aW1lc3RhbXA6dGltZXNbbl0uZ2V0QXR0cmlidXRlKCdkYXRldGltZScpLnJlcGxhY2UoJyswMDAwJywnWicpLnJlcGxhY2UoLyhbXFwrXFwtXSkoXFxkXFxkKShcXGRcXGQpLywnJDEkMjokMycpLGltYWdlOmV4dHJhY3RJbWFnZVVybChpbWFnZXNbbl0pLHJ0OnJ0c1tuXSx0aWQ6dGlkc1tuXSxwZXJtYWxpbmtVUkw6KHBlcm1hbGlua3NVUkxbbl09PT11bmRlZmluZWQpPycnOnBlcm1hbGlua3NVUkxbbl0uaHJlZn0pO24rKzt9fWVsc2V7d2hpbGUobjx4KXtpZih0eXBlb2YoZm9ybWF0dGVyRnVuY3Rpb24pIT09J3N0cmluZycpe3ZhciBkYXRldGltZVRleHQ9dGltZXNbbl0uZ2V0QXR0cmlidXRlKCdkYXRldGltZScpO3ZhciBuZXdEYXRlPW5ldyBEYXRlKHRpbWVzW25dLmdldEF0dHJpYnV0ZSgnZGF0ZXRpbWUnKS5yZXBsYWNlKC8tL2csJy8nKS5yZXBsYWNlKCdUJywnICcpLnNwbGl0KCcrJylbMF0pO3ZhciBkYXRlU3RyaW5nPWZvcm1hdHRlckZ1bmN0aW9uKG5ld0RhdGUsZGF0ZXRpbWVUZXh0KTt0aW1lc1tuXS5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLGRhdGVTdHJpbmcpO2lmKHR3ZWV0c1tuXS50ZXh0Q29udGVudCl7aWYoc3VwcG9ydHNDbGFzc05hbWUpe3RpbWVzW25dLnRleHRDb250ZW50PWRhdGVTdHJpbmc7fWVsc2V7dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncCcpO3ZhciB0PWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRhdGVTdHJpbmcpO2guYXBwZW5kQ2hpbGQodCk7aC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLGRhdGVTdHJpbmcpO3RpbWVzW25dPWg7fX1lbHNle3RpbWVzW25dLnRleHRDb250ZW50PWRhdGVTdHJpbmc7fX1cbnZhciBvcD0nJztpZihwYXJzZUxpbmtzKXtpZih0YXJnZXRCbGFuayl7dGFyZ2V0TGlua3NUb05ld1dpbmRvdyh0d2VldHNbbl0pO2lmKHByaW50VXNlcil7dGFyZ2V0TGlua3NUb05ld1dpbmRvdyhhdXRob3JzW25dKTt9fVxuaWYocHJpbnRVc2VyKXtvcCs9JzxkaXYgY2xhc3M9XCJ1c2VyXCI+JytzdHJpcChhdXRob3JzW25dLmlubmVySFRNTCkrJzwvZGl2Pic7fVxub3ArPSc8cCBjbGFzcz1cInR3ZWV0XCI+JytzdHJpcCh0d2VldHNbbl0uaW5uZXJIVE1MKSsnPC9wPic7aWYocHJpbnRUaW1lKXtpZihwZXJtYWxpbmtzKXtvcCs9JzxwIGNsYXNzPVwidGltZVBvc3RlZFwiPjxhIGhyZWY9XCInK3Blcm1hbGlua3NVUkxbbl0rJ1wiPicrdGltZXNbbl0uZ2V0QXR0cmlidXRlKCdhcmlhLWxhYmVsJykrJzwvYT48L3A+Jzt9ZWxzZXtvcCs9JzxwIGNsYXNzPVwidGltZVBvc3RlZFwiPicrXG50aW1lc1tuXS5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKSsnPC9wPic7fX19ZWxzZXtpZih0d2VldHNbbl0udGV4dENvbnRlbnQpe2lmKHByaW50VXNlcil7b3ArPSc8cCBjbGFzcz1cInVzZXJcIj4nK2F1dGhvcnNbbl0udGV4dENvbnRlbnQrJzwvcD4nO31cbm9wKz0nPHAgY2xhc3M9XCJ0d2VldFwiPicrdHdlZXRzW25dLnRleHRDb250ZW50Kyc8L3A+JztpZihwcmludFRpbWUpe29wKz0nPHAgY2xhc3M9XCJ0aW1lUG9zdGVkXCI+Jyt0aW1lc1tuXS50ZXh0Q29udGVudCsnPC9wPic7fX1lbHNle2lmKHByaW50VXNlcil7b3ArPSc8cCBjbGFzcz1cInVzZXJcIj4nK2F1dGhvcnNbbl0udGV4dENvbnRlbnQrJzwvcD4nO31cbm9wKz0nPHAgY2xhc3M9XCJ0d2VldFwiPicrdHdlZXRzW25dLnRleHRDb250ZW50Kyc8L3A+JztpZihwcmludFRpbWUpe29wKz0nPHAgY2xhc3M9XCJ0aW1lUG9zdGVkXCI+Jyt0aW1lc1tuXS50ZXh0Q29udGVudCsnPC9wPic7fX19XG5pZihzaG93SW50ZXJhY3Rpb25MaW5rcyl7b3ArPSc8cCBjbGFzcz1cImludGVyYWN0XCI+PGEgaHJlZj1cImh0dHBzOi8vdHdpdHRlci5jb20vaW50ZW50LycrJ3R3ZWV0P2luX3JlcGx5X3RvPScrdGlkc1tuXSsnXCIgY2xhc3M9XCJ0d2l0dGVyX3JlcGx5X2ljb25cIicrXG4odGFyZ2V0Qmxhbms/JyB0YXJnZXQ9XCJfYmxhbmtcIj4nOic+JykrJ1JlcGx5PC9hPjxhIGhyZWY9XCJodHRwczovL3R3aXR0ZXIuY29tL2ludGVudC9yZXR3ZWV0PycrJ3R3ZWV0X2lkPScrdGlkc1tuXSsnXCIgY2xhc3M9XCJ0d2l0dGVyX3JldHdlZXRfaWNvblwiJytcbih0YXJnZXRCbGFuaz8nIHRhcmdldD1cIl9ibGFua1wiPic6Jz4nKSsnUmV0d2VldDwvYT4nKyc8YSBocmVmPVwiaHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvZmF2b3JpdGU/dHdlZXRfaWQ9JytcbnRpZHNbbl0rJ1wiIGNsYXNzPVwidHdpdHRlcl9mYXZfaWNvblwiJytcbih0YXJnZXRCbGFuaz8nIHRhcmdldD1cIl9ibGFua1wiPic6Jz4nKSsnRmF2b3JpdGU8L2E+PC9wPic7fVxuaWYoc2hvd0ltYWdlcyYmaW1hZ2VzW25dIT09dW5kZWZpbmVkJiZleHRyYWN0SW1hZ2VVcmwoaW1hZ2VzW25dKSE9PXVuZGVmaW5lZCl7b3ArPSc8ZGl2IGNsYXNzPVwibWVkaWFcIj4nKyc8aW1nIHNyYz1cIicrZXh0cmFjdEltYWdlVXJsKGltYWdlc1tuXSkrJ1wiIGFsdD1cIkltYWdlIGZyb20gdHdlZXRcIiAvPicrJzwvZGl2Pic7fVxuaWYoc2hvd0ltYWdlcyl7YXJyYXlUd2VldHMucHVzaChvcCk7fWVsc2UgaWYoIXNob3dJbWFnZXMmJnR3ZWV0c1tuXS50ZXh0Q29udGVudC5sZW5ndGgpe2FycmF5VHdlZXRzLnB1c2gob3ApO31cbm4rKzt9fVxuaGFuZGxlVHdlZXRzKGFycmF5VHdlZXRzKTtpblByb2dyZXNzPWZhbHNlO2lmKHF1ZXVlLmxlbmd0aD4wKXt0d2l0dGVyRmV0Y2hlci5mZXRjaChxdWV1ZVswXSk7cXVldWUuc3BsaWNlKDAsMSk7fX19O3dpbmRvdy5fX3R3dHRyZj10d2l0dGVyRmV0Y2hlcjt3aW5kb3cudHdpdHRlckZldGNoZXI9dHdpdHRlckZldGNoZXI7cmV0dXJuIHR3aXR0ZXJGZXRjaGVyO30pKTtcbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgdHdpdHRlckZldGNoZXIgZnJvbSAndHdpdHRlci1mZXRjaGVyJztcbmltcG9ydCBkZWJvdW5jZSBmcm9tICdqdXN0LWRlYm91bmNlJztcbmltcG9ydCBGbGlja2l0eSBmcm9tICdmbGlja2l0eSc7XG5pbXBvcnQgcmltZyBmcm9tICdyaW1nLXNob3BpZnknO1xuXG5pbXBvcnQgbGF5b3V0IGZyb20gJy4uL0xheW91dCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNUd2l0dGVyRmVlZCB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLiR3aW5kb3cgPSAkKHdpbmRvdyk7XG4gICAgdGhpcy5pc0lFOSA9ICQoJ2JvZHknKS5oYXNDbGFzcygnaWU5Jyk7XG4gICAgdGhpcy5mbGlja2l0eSA9IG51bGw7XG5cbiAgICB0aGlzLiRjb250ZW50ID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtdHdpdHRlci1jb250ZW50XScpO1xuICAgIHRoaXMuJHdyYXBwZXIgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS10d2l0dGVyLXdyYXBwZXJdJyk7XG4gICAgdGhpcy4kdHdlZXRzID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtdHdlZXQtY29udGVudF0nKTtcblxuICAgIHJpbWcuaW5zdGFuY2UudHJhY2sodGhpcy4kd3JhcHBlclswXSk7XG5cbiAgICB0aGlzLiR3cmFwcGVyLm9uKCdyaW1nOmVudGVyJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5fbG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2xvYWQoKSB7XG4gICAgdGhpcy4kdGVtcGxhdGUgPSAkKHRoaXMuc2V0dGluZ3MudGVtcGxhdGUpO1xuXG4gICAgY29uc3Qgb25ib2FyZGluZyA9IHRoaXMuc2V0dGluZ3Mub25ib2FyZGluZztcbiAgICBjb25zdCB1c2VybmFtZSA9IHRoaXMuc2V0dGluZ3MudXNlcm5hbWU7XG4gICAgY29uc3QgcmV0d2VldHMgPSB0aGlzLnNldHRpbmdzLnJldHdlZXRzO1xuICAgIGNvbnN0IGltYWdlcyA9IHRoaXMuc2V0dGluZ3MuaW1hZ2VzO1xuICAgIGNvbnN0IGxvY2FsZSA9IHRoaXMuc2V0dGluZ3MubG9jYWxlIHx8ICdlbic7XG5cbiAgICAvLyBBY3RpdmF0ZSBmbGlja2l0eSBvbiBtb2JpbGVcbiAgICB0aGlzLl9tb2JpbGVTbGlkZXIgPSB0aGlzLl9tb2JpbGVTbGlkZXIuYmluZCh0aGlzKTtcbiAgICBsYXlvdXQub25CcmVha3BvaW50Q2hhbmdlKHRoaXMuX21vYmlsZVNsaWRlcik7XG4gICAgdGhpcy5fbW9iaWxlU2xpZGVyKCk7XG5cbiAgICB0aGlzLl9ldmVuSGVpZ2h0cyA9IHRoaXMuX2V2ZW5IZWlnaHRzLmJpbmQodGhpcyk7XG4gICAgdGhpcy5fZXZlbkhlaWdodHMoKTtcblxuICAgIGlmIChvbmJvYXJkaW5nIHx8ICF1c2VybmFtZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuJHdpbmRvdy5vbigncmVzaXplLnR3aXR0ZXInLCBkZWJvdW5jZSgoKSA9PiB0aGlzLl9ldmVuSGVpZ2h0cywgMTYsIHRydWUsIHRydWUpKTtcblxuICAgIHR3aXR0ZXJGZXRjaGVyLmZldGNoKHtcbiAgICAgICdwcm9maWxlJzogeyAnc2NyZWVuTmFtZSc6IHVzZXJuYW1lIH0sXG4gICAgICAnbWF4VHdlZXRzJzogMyxcbiAgICAgICdlbmFibGVMaW5rcyc6IHRydWUsXG4gICAgICAnc2hvd1VzZXInOiB0cnVlLFxuICAgICAgJ3Nob3dUaW1lJzogdHJ1ZSxcbiAgICAgICdkYXRhT25seSc6IGZhbHNlLFxuICAgICAgJ3VzZUVtb2ppJzogdHJ1ZSxcbiAgICAgICdzaG93SW1hZ2VzJzogaW1hZ2VzLFxuICAgICAgJ3Nob3dSZXR3ZWV0JzogcmV0d2VldHMsXG4gICAgICAnbGFuZyc6IGxvY2FsZSxcbiAgICAgICdjdXN0b21DYWxsYmFjayc6ICh0d2VldHMpID0+IHRoaXMuX3JlbmRlclR3ZWV0cyh0d2VldHMpLFxuICAgICAgJ3Nob3dJbnRlcmFjdGlvbic6IGZhbHNlLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCBldmVudHMgd2hlbiBzZWN0aW9uIGlzIHJlLWRyYXduXG4gICAqL1xuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgcmltZy5pbnN0YW5jZS51bnRyYWNrKHRoaXMuJHdyYXBwZXJbMF0pO1xuICAgIHRoaXMuJHdpbmRvdy5vZmYoJy50d2l0dGVyJyk7XG4gICAgdGhpcy4kY29udGVudC5vZmYoJy50d2l0dGVyJyk7XG5cbiAgICBsYXlvdXQub2ZmQnJlYWtwb2ludENoYW5nZSh0aGlzLl9tb2JpbGVTbGlkZXIpO1xuICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZW5zIHRoZSBoZWlnaHQgb2YgdGhlIHR3aXR0ZXIgYmxvY2tzIGlmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBGbGV4Ym94XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXZlbkhlaWdodHMoKSB7XG4gICAgaWYgKCF0aGlzLmlzSUU5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgaGVpZ2h0cyA9IFtdO1xuICAgIHRoaXMuJHR3ZWV0cy5oZWlnaHQoJycpO1xuXG4gICAgdGhpcy4kdHdlZXRzLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICBjb25zdCAkZWwgPSAkKGVsKTtcbiAgICAgIGhlaWdodHMucHVzaCgkZWwub3V0ZXJIZWlnaHQoKSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiR0d2VldHMuaGVpZ2h0KE1hdGguY2VpbChNYXRoLm1heC5hcHBseShudWxsLCBoZWlnaHRzKSkpO1xuICB9XG5cbiAgX2luaXRGbGlja2l0eSgpIHtcbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuJGNvbnRlbnRbMF0sIHtcbiAgICAgIGNlbGxTZWxlY3RvcjogJ1tkYXRhLXR3ZWV0LWNvbnRlbnRdJyxcbiAgICAgIGNvbnRhaW46IHRydWUsXG4gICAgICBmcmVlU2Nyb2xsOiB0cnVlLFxuICAgICAgcGVyY2VudFBvc2l0aW9uOiBmYWxzZSxcbiAgICAgIHByZXZOZXh0QnV0dG9uczogZmFsc2UsXG4gICAgICBwYWdlRG90czogZmFsc2UsXG4gICAgICBzZXRHYWxsZXJ5U2l6ZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICB0aGlzLl9iaW5kU2xpZGVyKCk7XG4gIH1cblxuICBfZGVzdHJveUZsaWNraXR5KCkge1xuICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZmxpY2tpdHkuZGVzdHJveSgpO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICB9XG5cbiAgX21vYmlsZVNsaWRlcigpIHtcbiAgICAvLyBJZiBpcyBMYXJnZSBsYXlvdXQsIGF0dGVtcHQgdG8gZGVzdHJveSBmbGlja2l0eVxuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdMJykpIHtcbiAgICAgIHRoaXMuX2Rlc3Ryb3lGbGlja2l0eSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIElzIFhTL1MvTSwgYW5kIGZsaWNraXR5IGlzIGluaXQnZCAtLSBkbyBub3RoaW5nXG4gICAgaWYgKHRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJcyBYUy9TL00sIGFuZCBmbGlja2l0eSBpcyBub3QgaW5pdCdkXG4gICAgdGhpcy5faW5pdEZsaWNraXR5KCk7XG4gIH1cblxuICBfYmluZFNsaWRlcigpIHtcbiAgICBjb25zdCAkc2xpZGVyID0gdGhpcy4kY29udGVudC5maW5kKCcuZmxpY2tpdHktc2xpZGVyJyk7XG5cbiAgICB0aGlzLiR3aW5kb3cub24oJ3Jlc2l6ZS50d2l0dGVyJywgZGVib3VuY2UoKCkgPT4ge1xuICAgICAgdGhpcy4kY29udGVudC50cmlnZ2VyKCdoZWlnaHRVcGRhdGUudHdpdHRlcicpO1xuICAgIH0pKTtcblxuICAgIHRoaXMuZmxpY2tpdHkub24oJ2NlbGxTZWxlY3QnLCAoKSA9PiB7XG4gICAgICB0aGlzLiRjb250ZW50LnRyaWdnZXIoJ2hlaWdodFVwZGF0ZS50d2l0dGVyJyk7XG4gICAgfSk7XG5cbiAgICB0aGlzLiRjb250ZW50Lm9uKCdoZWlnaHRVcGRhdGUudHdpdHRlcicsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICRzbGlkZXIuaGVpZ2h0KE1hdGguY2VpbCh0aGlzLmZsaWNraXR5Lm1heENlbGxIZWlnaHQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNldHMgdGhlIFNsaWRlciB0byB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCBzbGlkZVxuICAgIHRoaXMuJGNvbnRlbnQudHJpZ2dlcignaGVpZ2h0VXBkYXRlLnR3aXR0ZXInKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBhYm91dCB1c2VyIHdobyB0d2VldGVkXG4gICAqXG4gICAqIEBwYXJhbSBlbFxuICAgKiBAcmV0dXJucyB7eyRhdmF0YXI6ICosIGxpbms6ICosIG5hbWUsIHNjcmVlbk5hbWV9fVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgX2V4dHJhY3RBdXRob3IoZWwpIHtcbiAgICBjb25zdCAkZWwgPSAkKGVsKTtcblxuICAgIGNvbnN0IGxpbmsgPSAkZWwuZmluZCgnYScpLmF0dHIoJ2hyZWYnKTtcbiAgICBjb25zdCBuYW1lID0gJGVsLmZpbmQoJ1tkYXRhLXNjcmliZT1cImVsZW1lbnQ6bmFtZVwiXScpLnRleHQoKTtcbiAgICBjb25zdCBzY3JlZW5OYW1lID0gJGVsLmZpbmQoJ1tkYXRhLXNjcmliZT1cImVsZW1lbnQ6c2NyZWVuX25hbWVcIl0nKS50ZXh0KCk7XG4gICAgY29uc3QgJGF2YXRhciA9ICRlbC5maW5kKCdpbWcnKTtcblxuICAgIHJldHVybiB7ICRhdmF0YXIsIGxpbmssIG5hbWUsIHNjcmVlbk5hbWUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSBsaW5rIHRvIHR3ZWV0LCBhbmQgd2hlbiBpdCB3YXMgdHdlZXRlZFxuICAgKlxuICAgKiBAcGFyYW0gZWxcbiAgICogQHJldHVybnMge3tsaW5rOiAqLCBwb3N0ZWRBdDogKn19XG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBfZXh0cmFjdE1ldGEoZWwpIHtcbiAgICBjb25zdCAkZWwgPSAkKGVsKTtcblxuICAgIGNvbnN0IGxpbmsgPSAkZWwuZmluZCgnYScpLmF0dHIoJ2hyZWYnKTtcbiAgICBjb25zdCBwb3N0ZWRBdCA9ICRlbC50ZXh0KCk7XG5cbiAgICByZXR1cm4geyBsaW5rLCBwb3N0ZWRBdCB9O1xuICB9XG5cbiAgX2V4dHJhY3RXcmFwcGVyQ2xhc3MoKSB7XG4gICAgY29uc3Qgd3JhcHBlckNsYXNzID0gdGhpcy4kd3JhcHBlci5hdHRyKCdjbGFzcycpLm1hdGNoKC90d2VldC0tY291bnQtXFxkKyQvKTtcblxuICAgIGlmICh3cmFwcGVyQ2xhc3MpIHtcbiAgICAgIHJldHVybiB3cmFwcGVyQ2xhc3NbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICBfcmVuZGVyVHdlZXRzKHR3ZWV0cykge1xuICAgIGNvbnN0IHR3ZWV0c0xlbmd0aCA9IHR3ZWV0cy5sZW5ndGg7XG5cbiAgICBpZiAoIXR3ZWV0cyB8fCAhdHdlZXRzTGVuZ3RoKSByZXR1cm47XG5cbiAgICBjb25zdCB0d2VldHNBcnJheSA9IFtdO1xuICAgIGNvbnN0IHdyYXBwZXJDbGFzcyA9IGB0d2VldC0tY291bnQtJHt0d2VldHNMZW5ndGh9YDtcblxuICAgIHR3ZWV0cy5mb3JFYWNoKCh0d2VldCkgPT4ge1xuICAgICAgY29uc3QgJHR3ZWV0ID0gJCh0d2VldCk7XG5cbiAgICAgIGNvbnN0ICR0ZW1wbGF0ZSA9IHRoaXMuJHRlbXBsYXRlLmNsb25lKCk7XG4gICAgICBjb25zdCBhdXRob3JJbmZvID0gdGhpcy5fZXh0cmFjdEF1dGhvcigkdHdlZXRbMF0pO1xuICAgICAgY29uc3QgbWV0YSA9IHRoaXMuX2V4dHJhY3RNZXRhKCR0d2VldFsyXSk7XG5cbiAgICAgIGNvbnN0IGNvbnRlbnQgPSAkdHdlZXRbMV07XG5cbiAgICAgIC8vIFJlbmRlciBoZWFkZXJcbiAgICAgICR0ZW1wbGF0ZVxuICAgICAgICAuZmluZCgnLnR3ZWV0LS1oZWFkZXInKVxuICAgICAgICAuYXR0cignaHJlZicsIGF1dGhvckluZm8ubGluayk7XG5cbiAgICAgICR0ZW1wbGF0ZVxuICAgICAgICAuZmluZCgnLnR3ZWV0LS1oZWFkZXItaW1hZ2UnKVxuICAgICAgICAuaHRtbChhdXRob3JJbmZvLiRhdmF0YXIpO1xuXG4gICAgICAkdGVtcGxhdGVcbiAgICAgICAgLmZpbmQoJy50d2VldC0taGVhZGVyLW5hbWUnKVxuICAgICAgICAudGV4dChhdXRob3JJbmZvLm5hbWUpO1xuXG4gICAgICAkdGVtcGxhdGVcbiAgICAgICAgLmZpbmQoJy50d2VldC0taGVhZGVyLXNjcmVlbm5hbWUnKVxuICAgICAgICAudGV4dChhdXRob3JJbmZvLnNjcmVlbk5hbWUpO1xuXG4gICAgICAvLyBSZW5kZXIgY29udGVudFxuICAgICAgJHRlbXBsYXRlXG4gICAgICAgIC5maW5kKCcudHdlZXQtLWNvbnRlbnQnKVxuICAgICAgICAuYXBwZW5kKCR0d2VldFszXSA/ICR0d2VldFszXSA6IG51bGwpXG4gICAgICAgIC5hcHBlbmQoY29udGVudCk7XG5cbiAgICAgIC8vIFJlbmRlciBmb290ZXJcbiAgICAgICR0ZW1wbGF0ZVxuICAgICAgICAuZmluZCgnLnR3ZWV0LS1mb290ZXInKVxuICAgICAgICAuYXR0cignaHJlZicsIG1ldGEubGluaylcbiAgICAgICAgLmZpbmQoJy50d2VldC0tZm9vdGVyLS1wb3N0ZWQnKVxuICAgICAgICAudGV4dChtZXRhLnBvc3RlZEF0KTtcblxuICAgICAgdHdlZXRzQXJyYXkucHVzaCgkdGVtcGxhdGUpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kd3JhcHBlci5jc3MoJ21pbi1oZWlnaHQnLCB0aGlzLiR3cmFwcGVyLmhlaWdodCgpKTtcblxuICAgIHRoaXMuJHR3ZWV0cy5mYWRlT3V0KCkucHJvbWlzZSgpLnRoZW4oKCkgPT4ge1xuICAgICAgdGhpcy5fZGVzdHJveUZsaWNraXR5KCk7XG4gICAgICB0aGlzLiR0d2VldHMucmVtb3ZlKCk7XG5cbiAgICAgIHRoaXMuJGNvbnRlbnQuYXBwZW5kKHR3ZWV0c0FycmF5KTtcblxuICAgICAgdGhpcy4kd3JhcHBlclxuICAgICAgICAucmVtb3ZlQ2xhc3ModGhpcy5fZXh0cmFjdFdyYXBwZXJDbGFzcygpKVxuICAgICAgICAuYWRkQ2xhc3Mod3JhcHBlckNsYXNzKVxuICAgICAgICAuY3NzKCdtaW4taGVpZ2h0JywgJycpO1xuXG4gICAgICB0aGlzLiR0d2VldHMgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS10d2VldC1jb250ZW50XScpO1xuXG4gICAgICB0aGlzLl9ldmVuSGVpZ2h0cygpO1xuICAgICAgdGhpcy5fbW9iaWxlU2xpZGVyKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgZGVib3VuY2UgZnJvbSAnanVzdC1kZWJvdW5jZSc7XG5pbXBvcnQgRmxpY2tpdHkgZnJvbSAnZmxpY2tpdHknO1xuaW1wb3J0IGxheW91dCBmcm9tICcuLi9MYXlvdXQnO1xuaW1wb3J0IHJpbWcgZnJvbSAncmltZy1zaG9waWZ5JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0luc3RhZ3JhbUZlZWQge1xuICBjb25zdHJ1Y3RvcihzZWN0aW9uKSB7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLm9uYm9hcmRpbmcgPSB0aGlzLnNldHRpbmdzLm9uYm9hcmRpbmc7XG4gICAgdGhpcy5waG90b0NvdW50ID0gdGhpcy5zZXR0aW5ncy5waG90b19jb3VudDtcbiAgICB0aGlzLmFjY2Vzc1Rva2VuID0gdGhpcy5zZXR0aW5ncy5hY2Nlc3NfdG9rZW47XG5cbiAgICB0aGlzLiRlbCA9ICQoc2VjdGlvbi5lbCk7XG4gICAgdGhpcy4kd2luZG93ID0gJCh3aW5kb3cpO1xuICAgIHRoaXMuJHBob3RvQ29udGFpbmVyID0gdGhpcy4kZWwuZmluZCgnW2RhdGEtaW5zdGFncmFtLWNvbnRlbnRdJyk7XG4gICAgdGhpcy4kcGhvdG9Db250YWluZXJQbGFjZWhvbGRlciA9IHRoaXMuJGVsLmZpbmQoJ1tkYXRhLWluc3RhZ3JhbS1waG90by1wbGFjZWhvbGRlcl0nKTtcblxuICAgIHRoaXMuJHBob3RvVGVtcGxhdGUgPSAkKCc8ZmlndXJlIGNsYXNzPVwiaW5zdGFncmFtLS1waG90b1wiIGRhdGEtaW5zdGFncmFtLXBob3RvIC8+Jyk7XG5cbiAgICByaW1nLmluc3RhbmNlLnRyYWNrKHRoaXMuJHBob3RvQ29udGFpbmVyWzBdKTtcblxuICAgIHRoaXMuJHBob3RvQ29udGFpbmVyLm9uKCdyaW1nOmVudGVyJywgZXZlbnQgPT4ge1xuICAgICAgdGhpcy5fbG9hZCgpO1xuICAgIH0pO1xuICB9XG5cbiAgX2xvYWQoKSB7XG4gICAgLy8gQWN0aXZhdGUgZmxpY2tpdHkgb24gbW9iaWxlXG4gICAgdGhpcy5fbW9iaWxlU2xpZGVyID0gdGhpcy5fbW9iaWxlU2xpZGVyLmJpbmQodGhpcyk7XG4gICAgbGF5b3V0Lm9uQnJlYWtwb2ludENoYW5nZSh0aGlzLl9tb2JpbGVTbGlkZXIpO1xuICAgIHRoaXMuX21vYmlsZVNsaWRlcigpO1xuXG4gICAgaWYgKHRoaXMub25ib2FyZGluZyB8fCAhdGhpcy5hY2Nlc3NUb2tlbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2dldFBob3RvcygpXG4gICAgICAuZG9uZSgocGhvdG9zKSA9PiB0aGlzLl9yZW5kZXJQaG90b3MocGhvdG9zKSlcbiAgICAgIC5mYWlsKChlcnJvcikgPT4ge1xuICAgICAgICBjb25zb2xlLndhcm4oYEluc3RhZ3JhbTogJHtlcnJvcn1gKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgX2dldFBob3RvcygpIHtcbiAgICBjb25zdCB1cmwgPSBgaHR0cHM6Ly9hcGkuaW5zdGFncmFtLmNvbS92MS91c2Vycy9zZWxmL21lZGlhL3JlY2VudD9hY2Nlc3NfdG9rZW49JHt0aGlzLmFjY2Vzc1Rva2VufSZjb3VudD0ke3RoaXMucGhvdG9Db3VudH0mY2FsbGJhY2s9YDtcbiAgICBjb25zdCBwaG90b1Byb21pc2UgPSAkLmFqYXgodXJsLCB7XG4gICAgICBkYXRhVHlwZTogJ2pzb25wJyxcbiAgICB9KTtcblxuICAgIHJldHVybiBwaG90b1Byb21pc2UudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChyZXNwb25zZS5tZXRhLmNvZGUgIT09IDIwMCkge1xuICAgICAgICBjb25zdCBlcnJvciA9IGAke3Jlc3BvbnNlLm1ldGEuZXJyb3JfbWVzc2FnZX0gKCR7cmVzcG9uc2UubWV0YS5lcnJvcl90eXBlfSlgO1xuICAgICAgICByZXR1cm4gJC5EZWZlcnJlZCgpLnJlamVjdChlcnJvcikucHJvbWlzZSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzcG9uc2UuZGF0YTtcbiAgICB9KTtcbiAgfVxuXG4gIF9yZW5kZXJQaG90b3MocGhvdG9zKSB7XG4gICAgY29uc3QgcGhvdG9BcnJheSA9IFtdO1xuXG4gICAgcGhvdG9zLmZvckVhY2goKHBob3RvKSA9PiB7XG4gICAgICBjb25zdCAkdGVtcGxhdGUgPSB0aGlzLiRwaG90b1RlbXBsYXRlLmNsb25lKCk7XG4gICAgICBjb25zdCBsb3dSZXNvbHV0aW9uID0gcGhvdG8uaW1hZ2VzLmxvd19yZXNvbHV0aW9uO1xuICAgICAgY29uc3Qgc3RhbmRhcmRSZXNvbHV0aW9uID0gcGhvdG8uaW1hZ2VzLnN0YW5kYXJkX3Jlc29sdXRpb247XG5cbiAgICAgIGNvbnN0ICRsaW5rID0gJChgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgaHJlZj1cIiR7cGhvdG8ubGlua31cIj48L2E+YCk7XG4gICAgICBjb25zdCAkcGhvdG8gPSAkKGA8aW1nIHNyYz1cIiR7bG93UmVzb2x1dGlvbi51cmx9XCI+YCk7XG5cbiAgICAgIGlmIChzdGFuZGFyZFJlc29sdXRpb24ud2lkdGggPj0gKGxvd1Jlc29sdXRpb24ud2lkdGggKiAyKSkge1xuICAgICAgICAkcGhvdG8uYXR0cignc3Jjc2V0JywgYCR7c3RhbmRhcmRSZXNvbHV0aW9uLnVybH0gMnhgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRwaG90by5hdHRyKCdzcmMnLCBgJHtzdGFuZGFyZFJlc29sdXRpb24udXJsfWApO1xuICAgICAgfVxuXG4gICAgICAkbGluay5hcHBlbmQoJHBob3RvKTtcbiAgICAgICR0ZW1wbGF0ZS5hcHBlbmQoJGxpbmspO1xuXG4gICAgICBwaG90b0FycmF5LnB1c2goJHRlbXBsYXRlKTtcbiAgICB9KTtcblxuICAgIHRoaXMuJHBob3RvQ29udGFpbmVyUGxhY2Vob2xkZXIuZmFkZU91dCgoKSA9PiB7XG4gICAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgICAgIHRoaXMuJHBob3RvQ29udGFpbmVyLmFwcGVuZChwaG90b0FycmF5KTtcbiAgICAgIHRoaXMuJHBob3RvQ29udGFpbmVyUGxhY2Vob2xkZXIucmVtb3ZlKCk7XG4gICAgICB0aGlzLl9tb2JpbGVTbGlkZXIoKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgX2luaXRGbGlja2l0eSgpIHtcbiAgICB0aGlzLmZsaWNraXR5ID0gbmV3IEZsaWNraXR5KHRoaXMuJHBob3RvQ29udGFpbmVyWzBdLCB7XG4gICAgICBjZWxsU2VsZWN0b3I6ICcuaW5zdGFncmFtLS1waG90bycsXG4gICAgICBjb250YWluOiB0cnVlLFxuICAgICAgZnJlZVNjcm9sbDogdHJ1ZSxcbiAgICAgIHBlcmNlbnRQb3NpdGlvbjogZmFsc2UsXG4gICAgICBwcmV2TmV4dEJ1dHRvbnM6IGZhbHNlLFxuICAgICAgcGFnZURvdHM6IGZhbHNlLFxuICAgICAgc2V0R2FsbGVyeVNpemU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgdGhpcy5fYmluZFNsaWRlcigpO1xuICB9XG5cbiAgX2Rlc3Ryb3lGbGlja2l0eSgpIHtcbiAgICBpZiAoIXRoaXMuZmxpY2tpdHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLiR3aW5kb3cub2ZmKCcuaW5zdGFncmFtLWZlZWQnKTtcbiAgICB0aGlzLiRwaG90b0NvbnRhaW5lci5vZmYoJy5pbnN0YWdyYW0tZmVlZCcpO1xuICAgIHRoaXMuZmxpY2tpdHkuZGVzdHJveSgpO1xuICAgIHRoaXMuZmxpY2tpdHkgPSBudWxsO1xuICB9XG5cbiAgX21vYmlsZVNsaWRlcigpIHtcbiAgICAvLyBJZiBpcyBMYXJnZSBsYXlvdXQsIGF0dGVtcHQgdG8gZGVzdHJveSBmbGlja2l0eVxuICAgIGlmIChsYXlvdXQuaXNCcmVha3BvaW50KCdMJykgfHwgbGF5b3V0LmlzQnJlYWtwb2ludCgnTScpKSB7XG4gICAgICB0aGlzLl9kZXN0cm95RmxpY2tpdHkoKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBJcyBYUy9TL00sIGFuZCBmbGlja2l0eSBpcyBpbml0J2QgLS0gZG8gbm90aGluZ1xuICAgIGlmICh0aGlzLmZsaWNraXR5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSXMgWFMvUy9NLCBhbmQgZmxpY2tpdHkgaXMgbm90IGluaXQnZFxuICAgIHRoaXMuX2luaXRGbGlja2l0eSgpO1xuICB9XG5cbiAgX2JpbmRTbGlkZXIoKSB7XG4gICAgY29uc3QgJHNsaWRlciA9IHRoaXMuJHBob3RvQ29udGFpbmVyLmZpbmQoJy5mbGlja2l0eS1zbGlkZXInKTtcblxuICAgIHRoaXMuJHdpbmRvdy5vbigncmVzaXplLmluc3RhZ3JhbS1mZWVkJywgZGVib3VuY2UoKCkgPT4ge1xuICAgICAgdGhpcy4kcGhvdG9Db250YWluZXIudHJpZ2dlcignaGVpZ2h0VXBkYXRlLmluc3RhZ3JhbS1mZWVkJyk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5mbGlja2l0eS5vbignY2VsbFNlbGVjdCcsICgpID0+IHtcbiAgICAgIHRoaXMuJHBob3RvQ29udGFpbmVyLnRyaWdnZXIoJ2hlaWdodFVwZGF0ZS5pbnN0YWdyYW0tZmVlZCcpO1xuICAgIH0pO1xuXG4gICAgdGhpcy4kcGhvdG9Db250YWluZXIub24oJ2hlaWdodFVwZGF0ZS5pbnN0YWdyYW0tZmVlZCcsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5mbGlja2l0eSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgICRzbGlkZXIuaGVpZ2h0KE1hdGguY2VpbCh0aGlzLmZsaWNraXR5Lm1heENlbGxIZWlnaHQpKTtcbiAgICB9KTtcblxuICAgIC8vIFNldHMgdGhlIFNsaWRlciB0byB0aGUgaGVpZ2h0IG9mIHRoZSBmaXJzdCBzbGlkZVxuICAgIHRoaXMuJHBob3RvQ29udGFpbmVyLnRyaWdnZXIoJ2hlaWdodFVwZGF0ZS5pbnN0YWdyYW0tZmVlZCcpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHJpbWcuaW5zdGFuY2UudW50cmFjayh0aGlzLiRwaG90b0NvbnRhaW5lclswXSk7XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgQ3VycmVuY3lDb252ZXJ0ZXIgZnJvbSAnc2hvcGlmeS1jdXJyZW5jeS1jb252ZXJ0ZXInO1xuaW1wb3J0IFByb2R1Y3RHcmlkSXRlbSBmcm9tICcuLi9jb21wb25lbnRzL1Byb2R1Y3RHcmlkSXRlbSc7XG5pbXBvcnQgUHJvZHVjdFJvd1Njcm9sbGVyIGZyb20gJy4uL2NvbXBvbmVudHMvUHJvZHVjdFJvd1Njcm9sbGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHNlY3Rpb24pIHtcbiAgICB0aGlzLnNlY3Rpb24gPSBzZWN0aW9uO1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcblxuICAgIC8vIFByb2R1Y3QgaXRlbXNcbiAgICB0aGlzLnByb2R1Y3RJdGVtcyA9IFtdO1xuICAgIGNvbnN0ICRwcm9kdWN0SXRlbXMgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1wcm9kdWN0LWl0ZW1dJyk7XG5cbiAgICAkcHJvZHVjdEl0ZW1zLmVhY2goKGksIHByb2R1Y3RJdGVtKSA9PiB7XG4gICAgICB0aGlzLnByb2R1Y3RJdGVtcy5wdXNoKG5ldyBQcm9kdWN0R3JpZEl0ZW0oJChwcm9kdWN0SXRlbSkpKTtcbiAgICB9KTtcblxuICAgIHRoaXMuUHJvZHVjdFJvd1Njcm9sbGVyID0gbmV3IFByb2R1Y3RSb3dTY3JvbGxlcihzZWN0aW9uLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXByb2R1Y3Qtcm93XScpKTtcblxuICAgIHRoaXMuX3VwZGF0ZVByaWNlcygpO1xuICB9XG5cbiAgX3VwZGF0ZVByaWNlcygpIHtcbiAgICB0aGlzLiRlbC5maW5kKCcubW9uZXknKS5lYWNoKChpbmRleCwgZWwpID0+IEN1cnJlbmN5Q29udmVydGVyLnVwZGF0ZShlbCkpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMucHJvZHVjdEl0ZW1zLmZvckVhY2goKHByb2R1Y3RJdGVtKSA9PiB7XG4gICAgICBwcm9kdWN0SXRlbS51bmxvYWQoKTtcbiAgICB9KTtcblxuICAgIHRoaXMuUHJvZHVjdFJvd1Njcm9sbGVyLnVubG9hZCgpO1xuICB9XG59XG4iLCJpbXBvcnQgJCBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICRzY3JpcHQgZnJvbSAnc2NyaXB0anMnO1xuXG5pbXBvcnQgRm9ybXMgZnJvbSAnLi4vRm9ybXMnO1xuaW1wb3J0IEhlYWRlclNlYXJjaCBmcm9tICcuLi9jb21wb25lbnRzL0hlYWRlclNlYXJjaCc7XG5pbXBvcnQgU2VhcmNoRm9ybSBmcm9tICcuLi9jb21wb25lbnRzL1NlYXJjaEZvcm0nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdGF0aWNTZWN0aW9uSGVhZGVyIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcbiAgICB0aGlzLnNldHRpbmdzID0gc2VjdGlvbi5kYXRhLnNldHRpbmdzO1xuICAgIHRoaXMuaGVhZGVyU2VhcmNoID0gbnVsbDtcblxuICAgIHRoaXMuJHNjcmlwdHMgPSAkKCdbZGF0YS1zY3JpcHRzXScpO1xuXG4gICAgdGhpcy4kc2VhcmNoRmllbGQgPSB0aGlzLiRlbC5maW5kKCdbZGF0YS1saXZlLXNlYXJjaF0nKTtcblxuICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybXModGhpcy4kZWwpO1xuXG4gICAgaWYgKHRoaXMuc2V0dGluZ3MubGl2ZV9zZWFyY2guZW5hYmxlKSB7XG4gICAgICAkc2NyaXB0KHRoaXMuJHNjcmlwdHMuZGF0YSgnc2hvcGlmeS1hcGktdXJsJyksICgpID0+IHtcbiAgICAgICAgdGhpcy5oZWFkZXJTZWFyY2ggPSBuZXcgSGVhZGVyU2VhcmNoKHtcbiAgICAgICAgICAkZWw6IHRoaXMuJHNlYXJjaEZpZWxkLFxuICAgICAgICAgICRoZWFkZXI6IHRoaXMuJGVsLFxuICAgICAgICB9LCB0aGlzLnNldHRpbmdzLmxpdmVfc2VhcmNoKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlclNlYXJjaCA9IG5ldyBTZWFyY2hGb3JtKHRoaXMuJHNlYXJjaEZpZWxkKTtcbiAgICB9XG4gIH1cblxuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy5oZWFkZXJTZWFyY2gudW5sb2FkKCk7XG4gICAgdGhpcy5mb3Jtcy51bmxvYWQoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcbmltcG9ydCBSaWNoVGV4dCBmcm9tICcuLi9jb21wb25lbnRzL1JpY2hUZXh0JztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY1R3aXR0ZXJGZWVkIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcblxuICAgIHRoaXMucnRlID0gW107XG4gICAgdGhpcy4kZWwuZmluZCgnW2RhdGEtcnRlXScpLmVhY2goKGksIGVsKSA9PiB7XG4gICAgICB0aGlzLnJ0ZS5wdXNoKG5ldyBSaWNoVGV4dCgkKGVsKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuYmluZCBldmVudHMgd2hlbiBzZWN0aW9uIGlzIHJlLWRyYXduXG4gICAqL1xuICBvblNlY3Rpb25VbmxvYWQoKSB7XG4gICAgdGhpcy5ydGUuZm9yRWFjaCgocmljaFRleHRBcmVhKSA9PiB7XG4gICAgICByaWNoVGV4dEFyZWEudW5sb2FkKCk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCBWaWRlbyBmcm9tICcuLi9jb21wb25lbnRzL1ZpZGVvJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRHluYW1pY1ZpZGVvIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIGNvbnN0IHZpZGVvRWwgPSBzZWN0aW9uLmVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXZpZGVvXScpO1xuICAgIHRoaXMuJGVsID0gc2VjdGlvbi5lbDtcblxuICAgIHRoaXMuYXV0b3BsYXkgPSBzZWN0aW9uLmRhdGEuYXV0b3BsYXk7XG4gICAgdGhpcy5oYXNQbGF5ZWQgPSBmYWxzZTtcblxuICAgIGlmICh2aWRlb0VsKSB7XG4gICAgICB0aGlzLnZpZGVvID0gbmV3IFZpZGVvKHZpZGVvRWwpO1xuICAgICAgdGhpcy5iaW5kRXZlbnRzKCk7XG4gICAgfVxuICB9XG5cbiAgYmluZEV2ZW50cygpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuYXV0b3BsYXkpIHtcbiAgICAgICAgdmFyIHJlY3QgPSB0aGlzLiRlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuICAgICAgICBpZiAocmVjdC50b3AgPj0gMCB8fCByZWN0LmJvdHRvbSA8PSAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmhhc1BsYXllZCkge1xuICAgICAgICAgICAgdGhpcy52aWRlby5fYXV0b3BsYXkoKTtcbiAgICAgICAgICAgIHRoaXMuaGFzUGxheWVkID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy52aWRlby5fb25QYXVzZUNsaWNrKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIG9uU2VjdGlvblVubG9hZCgpIHtcbiAgICBpZiAodGhpcy52aWRlbykge1xuICAgICAgdGhpcy52aWRlby51bmxvYWQoKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAkIGZyb20gJ2pxdWVyeSc7XG5cbmltcG9ydCBGb3JtcyBmcm9tICcuLi9Gb3Jtcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIER5bmFtaWNOZXdzbGV0dGVyIHtcbiAgY29uc3RydWN0b3Ioc2VjdGlvbikge1xuICAgIHRoaXMuJGVsID0gJChzZWN0aW9uLmVsKTtcblxuICAgIHRoaXMuZm9ybXMgPSBuZXcgRm9ybXModGhpcy4kZWwpO1xuICB9XG5cbiAgb25TZWN0aW9uVW5sb2FkKCkge1xuICAgIHRoaXMuZm9ybXMudW5sb2FkKCk7XG4gIH1cbn1cbiIsIlxuLyohXG4gKiBweHMtbWFwIHYyLjAuMFxuICogKGMpIDIwMTggdW5kZWZpbmVkXG4gKi9cblxuaW1wb3J0ICQgZnJvbSAnanF1ZXJ5JztcblxudmFyIGp1c3REZWJvdW5jZSA9IGRlYm91bmNlO1xuXG5mdW5jdGlvbiBkZWJvdW5jZShmbiwgZGVsYXksIGF0X3N0YXJ0LCBndWFyYW50ZWUpIHtcbiAgdmFyIHRpbWVvdXQ7XG4gIHZhciBhcmdzO1xuICB2YXIgc2VsZjtcblxuICByZXR1cm4gZnVuY3Rpb24gZGVib3VuY2VkKCkge1xuICAgIHNlbGYgPSB0aGlzO1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO1xuXG4gICAgaWYgKHRpbWVvdXQgJiYgKGF0X3N0YXJ0IHx8IGd1YXJhbnRlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKCFhdF9zdGFydCkge1xuICAgICAgY2xlYXIoKTtcblxuICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQocnVuLCBkZWxheSk7XG4gICAgICByZXR1cm4gdGltZW91dDtcbiAgICB9XG5cbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChjbGVhciwgZGVsYXkpO1xuICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuXG4gICAgZnVuY3Rpb24gcnVuKCkge1xuICAgICAgY2xlYXIoKTtcbiAgICAgIGZuLmFwcGx5KHNlbGYsIGFyZ3MpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFyKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgfVxuICB9O1xufVxuXG52YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7XG4gIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBjYWxsIGEgY2xhc3MgYXMgYSBmdW5jdGlvblwiKTtcbiAgfVxufTtcblxudmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldO1xuICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlO1xuICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlO1xuICAgICAgaWYgKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSBkZXNjcmlwdG9yLndyaXRhYmxlID0gdHJ1ZTtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGRlc2NyaXB0b3Iua2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykge1xuICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7XG4gICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7XG4gICAgcmV0dXJuIENvbnN0cnVjdG9yO1xuICB9O1xufSgpO1xuXG52YXIgUHhzTWFwID0gZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBQeHNNYXAoc2VjdGlvbikge1xuICAgIHZhciBfdGhpcyA9IHRoaXM7XG5cbiAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBQeHNNYXApO1xuXG4gICAgdGhpcy4kZWwgPSAkKCdbZGF0YS1tYXBdJywgc2VjdGlvbi5lbCk7XG4gICAgdGhpcy5zZXR0aW5ncyA9IHNlY3Rpb24uZGF0YTtcbiAgICB0aGlzLm1hcCA9IG51bGw7XG4gICAgdGhpcy5jZW50ZXIgPSBudWxsO1xuXG4gICAgdGhpcy4kY29udGFpbmVyID0gJCgnW2RhdGEtbWFwLWNvbnRhaW5lcl0nLCB0aGlzLiRlbCk7XG5cbiAgICAvLyBTY2FsZSBzbyByYW5nZSBpcyAxMiB+IDE3LCByYXRoZXIgdGhhbiAxIHRvIDZcbiAgICB0aGlzLnpvb20gPSAxMSArIHBhcnNlSW50KHRoaXMuc2V0dGluZ3Muem9vbSwgMTApO1xuICAgIGlmIChpc05hTih0aGlzLnpvb20pKSB0aGlzLnpvb20gPSAxMztcblxuICAgIHRoaXMuY29sb3JzID0gbnVsbDtcblxuICAgIGlmICh0aGlzLnNldHRpbmdzLmNvbG9ycykge1xuICAgICAgdGhpcy5jb2xvcnMgPSB0aGlzLnNldHRpbmdzLmNvbG9ycztcbiAgICB9XG5cbiAgICB0aGlzLnJlc2l6ZSA9IHRoaXMucmVzaXplLmJpbmQodGhpcyk7XG5cbiAgICB0aGlzLmFkZHJlc3MgPSB0aGlzLnNldHRpbmdzLmFkZHJlc3M7XG4gICAgdGhpcy5hcGlLZXkgPSB0aGlzLnNldHRpbmdzLmFwaV9rZXk7XG5cbiAgICBpZiAodGhpcy5hcGlLZXkpIHtcbiAgICAgIGlmICh3aW5kb3cuZ29vZ2xlTWFwcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHdpbmRvdy5nb29nbGVNYXBzID0gdHJ1ZTtcblxuICAgICAgICAkLmdldFNjcmlwdCgnaHR0cHM6Ly9tYXBzLmdvb2dsZWFwaXMuY29tL21hcHMvYXBpL2pzP2tleT0nICsgdGhpcy5hcGlLZXkpLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgIF90aGlzLl9jcmVhdGVNYXAoKTtcbiAgICAgICAgfSkuZmFpbChmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihzdGF0dXMpO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2NyZWF0ZU1hcCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNyZWF0ZUNsYXNzKFB4c01hcCwgW3tcbiAgICBrZXk6ICdfY3JlYXRlTWFwJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gX2NyZWF0ZU1hcCgpIHtcbiAgICAgIHZhciBfdGhpczIgPSB0aGlzO1xuXG4gICAgICByZXR1cm4gdGhpcy5nZW9sb2NhdGUoKS5kb25lKGZ1bmN0aW9uIChyZXN1bHRzKSB7XG4gICAgICAgIF90aGlzMi5tYXAgPSBuZXcgZ29vZ2xlLm1hcHMuTWFwKF90aGlzMi4kY29udGFpbmVyLmdldCgwKSwge1xuICAgICAgICAgIGNlbnRlcjogcmVzdWx0c1swXS5nZW9tZXRyeS5sb2NhdGlvbixcbiAgICAgICAgICBjbGlja2FibGVJY29uczogZmFsc2UsXG4gICAgICAgICAgZGlzYWJsZURlZmF1bHRVSTogdHJ1ZSxcbiAgICAgICAgICBkaXNhYmxlRG91YmxlQ2xpY2tab29tOiB0cnVlLFxuICAgICAgICAgIGdlc3R1cmVIYW5kbGluZzogJ25vbmUnLFxuICAgICAgICAgIGtleWJvYXJkU2hvcnRjdXRzOiBmYWxzZSxcbiAgICAgICAgICBtYXhab29tOiBfdGhpczIuem9vbSxcbiAgICAgICAgICBtaW5ab29tOiBfdGhpczIuem9vbSxcbiAgICAgICAgICBzY3JvbGxXaGVlbDogZmFsc2UsXG4gICAgICAgICAgc3R5bGVzOiBfdGhpczIuX2dldE1hcFN0eWxlcygpLFxuICAgICAgICAgIHpvb206IF90aGlzMi56b29tLFxuICAgICAgICAgIHpvb21Db250cm9sOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgICAgX3RoaXMyLmNlbnRlciA9IF90aGlzMi5tYXAuZ2V0Q2VudGVyKCk7XG4gICAgICAgIF90aGlzMi5tYXAucGFuQnkoMCwgMCk7XG5cbiAgICAgICAgbmV3IGdvb2dsZS5tYXBzLk1hcmtlcih7XG4gICAgICAgICAgY2xpY2thYmxlOiBmYWxzZSxcbiAgICAgICAgICBtYXA6IF90aGlzMi5tYXAsXG4gICAgICAgICAgcG9zaXRpb246IF90aGlzMi5jZW50ZXJcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZ29vZ2xlLm1hcHMuZXZlbnQuYWRkRG9tTGlzdGVuZXIod2luZG93LCAncmVzaXplJywganVzdERlYm91bmNlKF90aGlzMi5yZXNpemUsIDI1MCwgdHJ1ZSwgdHJ1ZSkpO1xuICAgICAgfSkuZmFpbChmdW5jdGlvbiAoc3RhdHVzKSB7XG4gICAgICAgIHZhciB1c2FnZUxpbWl0cyA9ICdodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9tYXBzL2ZhcSN1c2FnZWxpbWl0cyc7XG4gICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSB2b2lkIDA7XG5cbiAgICAgICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgICAgICBjYXNlICdaRVJPX1JFU1VMVFMnOlxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJzxwPlVuYWJsZSB0byBmaW5kIHRoZSBhZGRyZXNzOjwvcD4gJyArIF90aGlzMi5hZGRyZXNzO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgY2FzZSAnT1ZFUl9RVUVSWV9MSU1JVCc6XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSAnXFxuICAgICAgICAgICAgICA8cD5VbmFibGUgdG8gbG9hZCBHb29nbGUgTWFwcywgeW91IGhhdmUgcmVhY2hlZCB5b3VyIHVzYWdlIGxpbWl0LjwvcD5cXG4gICAgICAgICAgICAgIDxwPlxcbiAgICAgICAgICAgICAgICBQbGVhc2UgdmlzaXRcXG4gICAgICAgICAgICAgICAgPGEgaHJlZj1cIicgKyB1c2FnZUxpbWl0cyArICdcIiB0YXJnZXQ9XCJfYmxhbmtcIj4nICsgdXNhZ2VMaW1pdHMgKyAnPC9hPlxcbiAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLlxcbiAgICAgICAgICAgICAgPC9wPlxcbiAgICAgICAgICAgICc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0gJ1VuYWJsZSB0byBsb2FkIEdvb2dsZSBNYXBzLic7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIF90aGlzMi5kaXNwbGF5RXJyb3JJblRoZW1lRWRpdG9yKGVycm9yTWVzc2FnZSwgc3RhdHVzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ2dlb2xvY2F0ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGdlb2xvY2F0ZSgpIHtcbiAgICAgIHZhciBkZWZlcnJlZCA9ICQuRGVmZXJyZWQoKTtcbiAgICAgIHZhciBnZW9jb2RlciA9IG5ldyBnb29nbGUubWFwcy5HZW9jb2RlcigpO1xuXG4gICAgICBnZW9jb2Rlci5nZW9jb2RlKHsgYWRkcmVzczogdGhpcy5hZGRyZXNzIH0sIGZ1bmN0aW9uIChyZXN1bHRzLCBzdGF0dXMpIHtcbiAgICAgICAgaWYgKHN0YXR1cyAhPT0gZ29vZ2xlLm1hcHMuR2VvY29kZXJTdGF0dXMuT0spIHtcbiAgICAgICAgICBkZWZlcnJlZC5yZWplY3Qoc3RhdHVzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmVycmVkLnJlc29sdmUocmVzdWx0cyk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRlZmVycmVkO1xuICAgIH1cbiAgfSwge1xuICAgIGtleTogJ3Jlc2l6ZScsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIHJlc2l6ZSgpIHtcbiAgICAgIGlmICh0aGlzLm1hcCkge1xuICAgICAgICBnb29nbGUubWFwcy5ldmVudC50cmlnZ2VyKHRoaXMubWFwLCAncmVzaXplJyk7XG4gICAgICAgIHRoaXMubWFwLnNldENlbnRlcih0aGlzLmNlbnRlcik7XG4gICAgICAgIHRoaXMubWFwLnBhbkJ5KDAsIDEwMCk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnb25TZWN0aW9uVW5sb2FkJyxcbiAgICB2YWx1ZTogZnVuY3Rpb24gb25TZWN0aW9uVW5sb2FkKCkge1xuICAgICAgaWYgKHRoaXMubWFwKSB7XG4gICAgICAgIGdvb2dsZS5tYXBzLmV2ZW50LmNsZWFyTGlzdGVuZXJzKHRoaXMubWFwLCAncmVzaXplJyk7XG4gICAgICB9XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnX2dldE1hcFN0eWxlcycsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIF9nZXRNYXBTdHlsZXMoKSB7XG4gICAgICBpZiAoIXRoaXMuY29sb3JzKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIFt7IGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLCBzdHlsZXJzOiBbeyBjb2xvcjogdGhpcy5jb2xvcnMuZSB9XSB9LCB7IGVsZW1lbnRUeXBlOiAnbGFiZWxzLmljb24nLCBzdHlsZXJzOiBbeyB2aXNpYmlsaXR5OiAnb2ZmJyB9XSB9LCB7IGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuZmlsbCcsIHN0eWxlcnM6IFt7IGNvbG9yOiB0aGlzLmNvbG9ycy5hIH1dIH0sIHsgZWxlbWVudFR5cGU6ICdsYWJlbHMudGV4dC5zdHJva2UnLCBzdHlsZXJzOiBbeyBjb2xvcjogdGhpcy5jb2xvcnMuZSB9XSB9LCB7IGZlYXR1cmVUeXBlOiAnYWRtaW5pc3RyYXRpdmUnLCBlbGVtZW50VHlwZTogJ2dlb21ldHJ5Jywgc3R5bGVyczogW3sgdmlzaWJpbGl0eTogJ29mZicgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmNvdW50cnknLCBzdHlsZXJzOiBbeyB2aXNpYmlsaXR5OiAnb2ZmJyB9XSB9LCB7IGZlYXR1cmVUeXBlOiAnYWRtaW5pc3RyYXRpdmUubGFuZF9wYXJjZWwnLCBzdHlsZXJzOiBbeyB2aXNpYmlsaXR5OiAnb2ZmJyB9XSB9LCB7IGZlYXR1cmVUeXBlOiAnYWRtaW5pc3RyYXRpdmUubmVpZ2hib3Job29kJywgc3R5bGVyczogW3sgdmlzaWJpbGl0eTogJ29mZicgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ2FkbWluaXN0cmF0aXZlLmxvY2FsaXR5Jywgc3R5bGVyczogW3sgdmlzaWJpbGl0eTogJ29mZicgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ3BvaScsIHN0eWxlcnM6IFt7IHZpc2liaWxpdHk6ICdvZmYnIH1dIH0sIHsgZmVhdHVyZVR5cGU6ICdyb2FkJywgZWxlbWVudFR5cGU6ICdnZW9tZXRyeS5maWxsJywgc3R5bGVyczogW3sgY29sb3I6IHRoaXMuY29sb3JzLmQgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ3JvYWQnLCBlbGVtZW50VHlwZTogJ2xhYmVscy5pY29uJywgc3R5bGVyczogW3sgdmlzaWJpbGl0eTogJ29mZicgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ3JvYWQuYXJ0ZXJpYWwnLCBlbGVtZW50VHlwZTogJ2dlb21ldHJ5Jywgc3R5bGVyczogW3sgY29sb3I6IHRoaXMuY29sb3JzLmMgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ3JvYWQuaGlnaHdheScsIGVsZW1lbnRUeXBlOiAnZ2VvbWV0cnknLCBzdHlsZXJzOiBbeyBjb2xvcjogdGhpcy5jb2xvcnMuYiB9XSB9LCB7IGZlYXR1cmVUeXBlOiAncm9hZC5oaWdod2F5LmNvbnRyb2xsZWRfYWNjZXNzJywgc3R5bGVyczogW3sgdmlzaWJpbGl0eTogJ29mZicgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ3JvYWQubG9jYWwnLCBlbGVtZW50VHlwZTogJ2xhYmVscy50ZXh0LmZpbGwnLCBzdHlsZXJzOiBbeyBjb2xvcjogdGhpcy5jb2xvcnMuYiB9XSB9LCB7IGZlYXR1cmVUeXBlOiAncm9hZC5sb2NhbCcsIGVsZW1lbnRUeXBlOiAnbGFiZWxzLnRleHQuc3Ryb2tlJywgc3R5bGVyczogW3sgY29sb3I6IHRoaXMuY29sb3JzLmUgfV0gfSwgeyBmZWF0dXJlVHlwZTogJ3RyYW5zaXQnLCBzdHlsZXJzOiBbeyB2aXNpYmlsaXR5OiAnb2ZmJyB9XSB9LCB7IGZlYXR1cmVUeXBlOiAnd2F0ZXInLCBlbGVtZW50VHlwZTogJ2dlb21ldHJ5Jywgc3R5bGVyczogW3sgY29sb3I6IHRoaXMuY29sb3JzLmYgfV0gfV07XG4gICAgfVxuICB9LCB7XG4gICAga2V5OiAnZGlzcGxheUVycm9ySW5UaGVtZUVkaXRvcicsXG4gICAgdmFsdWU6IGZ1bmN0aW9uIGRpc3BsYXlFcnJvckluVGhlbWVFZGl0b3IoZXJyb3JNZXNzYWdlKSB7XG4gICAgICB2YXIgaXNUaGVtZUVkaXRvciA9IHdpbmRvdy5TaG9waWZ5ICYmIHdpbmRvdy5TaG9waWZ5LmRlc2lnbk1vZGU7XG5cbiAgICAgIGlmICghaXNUaGVtZUVkaXRvcikge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRoaXMuJGNvbnRhaW5lci5odG1sKCc8ZGl2IGNsYXNzPVwibWFwLWVycm9yLW1lc3NhZ2VcIj4nICsgZXJyb3JNZXNzYWdlICsgJzwvZGl2PicpO1xuICAgIH1cbiAgfV0pO1xuICByZXR1cm4gUHhzTWFwO1xufSgpO1xuXG5leHBvcnQgZGVmYXVsdCBQeHNNYXA7XG4iLCIvLyBqUXVlcnkgcGx1Z2luc1xuaW1wb3J0ICcuL2dsb2JhbHMvanF1ZXJ5JztcbmltcG9ydCAnanF1ZXJ5LXRyZW5kJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuaW1wb3J0ICdqcXVlcnktcmV2ZWFsZXInOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG5cbi8vIEdsb2JhbCBpbXBvcnRzXG5pbXBvcnQgJy4vZ2xvYmFscy9mbGlja2l0eS1pb3MtZml4JztcblxuLy8gUmVzcG9uc2l2ZSBJbWFnZXNcbmltcG9ydCAnaW50ZXJzZWN0aW9uLW9ic2VydmVyJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuaW1wb3J0IHJpbWcgZnJvbSAncmltZy1zaG9waWZ5JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG4vLyBUZW1wbGF0ZSBpbXBvcnRzXG5pbXBvcnQgQWNjb3VudCBmcm9tICcuL3RlbXBsYXRlcy9BY2NvdW50JztcbmltcG9ydCBDb250YWN0IGZyb20gJy4vdGVtcGxhdGVzL0NvbnRhY3QnO1xuaW1wb3J0IFBhZ2UgZnJvbSAnLi90ZW1wbGF0ZXMvUGFnZSc7XG5cbi8vIFNlY3Rpb24gaW1wb3J0c1xuaW1wb3J0IFNlY3Rpb25zIGZyb20gJy4vU2VjdGlvbnMnO1xuaW1wb3J0IFN0YXRpY1NlY3Rpb25IZWFkZXIgZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNTZWN0aW9uSGVhZGVyJztcbmltcG9ydCBTdGF0aWNTZWN0aW9uRm9vdGVyIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljU2VjdGlvbkZvb3Rlcic7XG5pbXBvcnQgU3RhdGljQXJ0aWNsZSBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0FydGljbGUnO1xuaW1wb3J0IFN0YXRpY0Jsb2cgZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNCbG9nJztcbmltcG9ydCBTdGF0aWNDYXJ0IGZyb20gJy4vc2VjdGlvbnMvU3RhdGljQ2FydCc7XG5pbXBvcnQgU3RhdGljQ29sbGVjdGlvbiBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0NvbGxlY3Rpb24nO1xuaW1wb3J0IFN0YXRpY0dpZnRjYXJkIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljR2lmdGNhcmQnO1xuaW1wb3J0IFN0YXRpY1Bhc3N3b3JkIGZyb20gJy4vc2VjdGlvbnMvU3RhdGljUGFzc3dvcmQnO1xuaW1wb3J0IFN0YXRpY1Byb2R1Y3QgZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNQcm9kdWN0JztcbmltcG9ydCBTdGF0aWNTZWFyY2ggZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNTZWFyY2gnO1xuaW1wb3J0IER5bmFtaWNCbG9nUG9zdHMgZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljQmxvZ1Bvc3RzJztcbmltcG9ydCBTdGF0aWNIaWdobGlnaHRzQmFubmVycyBmcm9tICcuL3NlY3Rpb25zL1N0YXRpY0hpZ2hsaWdodHNCYW5uZXJzJztcbmltcG9ydCBTdGF0aWNTbGlkZXNob3cgZnJvbSAnLi9zZWN0aW9ucy9TdGF0aWNTbGlkZXNob3cnO1xuaW1wb3J0IER5bmFtaWNQcm9tb0Jsb2NrcyBmcm9tICcuL3NlY3Rpb25zL0R5bmFtaWNQcm9tb0Jsb2Nrcyc7XG5pbXBvcnQgRHluYW1pY01lbnVMaXN0IGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY01lbnVMaXN0JztcbmltcG9ydCBEeW5hbWljVHdpdHRlckZlZWQgZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljVHdpdHRlckZlZWQnO1xuaW1wb3J0IER5bmFtaWNJbnN0YWdyYW1GZWVkIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY0luc3RhZ3JhbUZlZWQnO1xuaW1wb3J0IER5bmFtaWNGZWF0dXJlZENvbGxlY3Rpb24gZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljRmVhdHVyZWRDb2xsZWN0aW9uJztcbmltcG9ydCBEeW5hbWljU2VhcmNoIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY1NlYXJjaCc7XG5pbXBvcnQgRHluYW1pY1JpY2hUZXh0IGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY1JpY2hUZXh0JztcbmltcG9ydCBEeW5hbWljVmlkZW8gZnJvbSAnLi9zZWN0aW9ucy9EeW5hbWljVmlkZW8nO1xuaW1wb3J0IER5bmFtaWNOZXdzbGV0dGVyIGZyb20gJy4vc2VjdGlvbnMvRHluYW1pY05ld3NsZXR0ZXInO1xuaW1wb3J0IFBYU01hcCBmcm9tICdweHMtbWFwJzsgLy8gZXNsaW50LWRpc2FibGUtbGluZVxuXG5yaW1nLmluaXQoKTtcblxuY29uc3Qgc2VjdGlvbnMgPSBuZXcgU2VjdGlvbnMoKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtaGVhZGVyJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljU2VjdGlvbkhlYWRlcihzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWZvb3RlcicsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY1NlY3Rpb25Gb290ZXIoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1hcnRpY2xlJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljQXJ0aWNsZShzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWJsb2cnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNCbG9nKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtY2FydCcsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY0NhcnQoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1jb2xsZWN0aW9uJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljQ29sbGVjdGlvbihzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLWdpZnRjYXJkJywgc2VjdGlvbiA9PiBuZXcgU3RhdGljR2lmdGNhcmQoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1wYXNzd29yZCcsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY1Bhc3N3b3JkKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdzdGF0aWMtcHJvZHVjdCcsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY1Byb2R1Y3Qoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1zZWFyY2gnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNTZWFyY2goc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtYmxvZy1wb3N0cycsIHNlY3Rpb24gPT4gbmV3IER5bmFtaWNCbG9nUG9zdHMoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3N0YXRpYy1oaWdobGlnaHRzLWJhbm5lcnMnLCBzZWN0aW9uID0+IG5ldyBTdGF0aWNIaWdobGlnaHRzQmFubmVycyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3Rlcignc3RhdGljLXNsaWRlc2hvdycsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY1NsaWRlc2hvdyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1wcm9tby1tb3NhaWMnLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljUHJvbW9CbG9ja3Moc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtcHJvbW8tZ3JpZCcsIHNlY3Rpb24gPT4gbmV3IER5bmFtaWNQcm9tb0Jsb2NrcyhzZWN0aW9uKSk7XG5zZWN0aW9ucy5yZWdpc3RlcignZHluYW1pYy1tZW51LWxpc3QnLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljTWVudUxpc3Qoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtdHdpdHRlci1mZWVkJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY1R3aXR0ZXJGZWVkKHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdkeW5hbWljLWluc3RhZ3JhbS1mZWVkJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY0luc3RhZ3JhbUZlZWQoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtZmVhdHVyZWQtY29sbGVjdGlvbicsIHNlY3Rpb24gPT4gbmV3IER5bmFtaWNGZWF0dXJlZENvbGxlY3Rpb24oc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtZmVhdHVyZWQtcHJvZHVjdCcsIHNlY3Rpb24gPT4gbmV3IFN0YXRpY1Byb2R1Y3Qoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtcmljaC10ZXh0Jywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY1JpY2hUZXh0KHNlY3Rpb24pKTtcbnNlY3Rpb25zLnJlZ2lzdGVyKCdkeW5hbWljLXNlYXJjaCcsIHNlY3Rpb24gPT4gbmV3IER5bmFtaWNTZWFyY2goc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ2R5bmFtaWMtdmlkZW8nLCBzZWN0aW9uID0+IG5ldyBEeW5hbWljVmlkZW8oc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3B4cy1uZXdzbGV0dGVyJywgc2VjdGlvbiA9PiBuZXcgRHluYW1pY05ld3NsZXR0ZXIoc2VjdGlvbikpO1xuc2VjdGlvbnMucmVnaXN0ZXIoJ3B4cy1tYXAnLCBzZWN0aW9uID0+IG5ldyBQWFNNYXAoc2VjdGlvbikpO1xuXG5uZXcgQWNjb3VudCgpO1xubmV3IENvbnRhY3QoKTtcbm5ldyBQYWdlKCk7XG4iXSwibmFtZXMiOlsidGhpcyIsImRlZmluZSIsIndpbmRvdyIsImpRdWVyeSIsIiQiLCJtYXRjaGVzU2VsZWN0b3IiLCJyZXF1aXJlJCQwIiwiZ2V0U2l6ZSIsInV0aWxzIiwicmVxdWlyZSQkMSIsInJlcXVpcmUkJDIiLCJyZXF1aXJlJCQzIiwicmVxdWlyZSQkNCIsInJlcXVpcmUkJDUiLCJjZWxsIiwic2xpZGUiLCJmbGlja2l0eSIsInJlcXVpcmUkJDYiLCJvbiIsImV2ZW50IiwiJHRhcmdldCIsInRhcmdldCIsIiRmbGlja2l0eUVuYWJsZWRFbCIsImNsb3Nlc3QiLCJsZW5ndGgiLCJGbGlja2l0eSIsImRhdGEiLCJyZW1vdmVFdmVudExpc3RlbmVyIiwicmltZyIsIlF1YW50aXR5IiwiZWwiLCIkZWwiLCIkaW5wdXRQYXJlbnQiLCJmaW5kIiwiJGlucHV0IiwiJHNlbGVjdFBhcmVudCIsIiRzZWxlY3QiLCJfd2F0Y2hTZWxlY3QiLCJiaW5kIiwiX3dhdGNoSW5wdXQiLCJvZmYiLCJiYXNlVmFsdWUiLCJwYXJzZUludCIsImN1cnJlbnRUYXJnZXQiLCJ2YWx1ZSIsImlzTmFOIiwiX3ZhbGlkYXRlVmFsdWUiLCJ2YWwiLCJ0cmlnZ2VyIiwicmVtb3ZlQ2xhc3MiLCJhZGRDbGFzcyIsImZvY3VzIiwicmVtb3ZlQXR0ciIsInNlbGVjdCIsImF0dHIiLCJGb3JtcyIsInNlbGVjdG9yIiwiZmlsbGVkQ2xhc3MiLCJmaWVsZFNlbGVjdG9yIiwicXVhbnRpdHlJdGVtcyIsIiRxdWFudGl0eVdyYXBwZXIiLCJfdG9nZ2xlRmlsbGVkIiwiX2NoZWNrRmlsbGVkIiwiZWFjaCIsImkiLCJwdXNoIiwiZm9yRWFjaCIsInF1YW50aXR5SXRlbSIsInVubG9hZCIsImhhc0NsYXNzIiwiaXNGaWxsZWQiLCJ0b2dnbGVDbGFzcyIsIkFjY291bnQiLCIkYWNjb3VudENvbnRlbnRzIiwiJGxvZ2luQ29udGVudCIsIiRhZGRyZXNzZXNDb250ZW50IiwiJGFkZHJlc3NCdXR0b25Gb2N1cyIsIl9sb2dpblRvZ2dsZSIsIl9pbml0TG9naW5QYWdlIiwiX2luaXRBZGRyZXNzUGFnZSIsIl9pbml0IiwiJGxvZ2luVG9nZ2xlIiwiJGxvZ2luIiwiJHJlY292ZXJ5IiwiJHJlY292ZXJ5SGFzTWVzc2FnZSIsInByZXZlbnREZWZhdWx0IiwiJGN1c3RvbWVyQWRkcmVzc2VzIiwiaXRlbUlkIiwiZXEiLCJDdXN0b21lckFkZHJlc3MiLCJkZXN0cm95IiwiaWQiLCJjb3VudHJ5RWwiLCJwcm92aW5jZUVsIiwib3B0aW9ucyIsImhpZGVFbGVtZW50IiwiU2hvcGlmeSIsIkNvdW50cnlQcm92aW5jZVNlbGVjdG9yIiwiQ29udGFjdCIsIiRjb250YWN0Q29udGVudHMiLCJpbml0IiwidXBkYXRlIiwiYXN5bmNHZW5lcmF0b3IiLCJjbGFzc0NhbGxDaGVjayIsImNyZWF0ZUNsYXNzIiwiaW5pdCQxIiwidXBkYXRlJDEiLCJSaWNoVGV4dCIsIl9pbml0RXh0ZXJuYWxMaW5rcyIsImdyb3VwZWRDb250ZW50IiwiR3JvdXBlZENvbnRlbnQiLCJnZXQiLCJhbmNob3JzIiwiZmlsdGVyIiwiaHJlZiIsImluZGV4T2YiLCJsb2NhdGlvbiIsImhvc3RuYW1lIiwiUGFnZSIsIiRwYWdlQ29udGVudCIsIlNlY3Rpb25zIiwiaGFuZGxlcnMiLCJpbnN0YW5jZXMiLCJfb25TZWN0aW9uRXZlbnQiLCJhZGRFdmVudExpc3RlbmVyIiwiX3RyaWdnZXJJbnN0YW5jZUV2ZW50IiwidHlwZSIsImhhbmRsZXIiLCJ3YXJuIiwiX2luaXRTZWN0aW9ucyIsImRhdGFFbHMiLCJkb2N1bWVudCIsInF1ZXJ5U2VsZWN0b3JBbGwiLCJkYXRhRWwiLCJwYXJlbnROb2RlIiwiaWRFbCIsInF1ZXJ5U2VsZWN0b3IiLCJzZWN0aW9uSWQiLCJnZXRBdHRyaWJ1dGUiLCJfY3JlYXRlSW5zdGFuY2UiLCJkZXRhaWwiLCJibG9ja0lkIiwiaW5zdGFuY2UiLCJldmVudE5hbWUiLCJhcmdzIiwibmFtZSIsImtleXMiLCJ0eXBlRWwiLCJjb25zb2xlIiwiX2xvYWREYXRhIiwicG9zdE1lc3NhZ2UiLCJfcG9zdE1lc3NhZ2UiLCJpbm5lckhUTUwiLCJKU09OIiwicGFyc2UiLCJlcnJvciIsIm1lc3NhZ2UiLCJldmVudEhhbmRsZXJzIiwicHJldmlvdXNCcmVha3BvaW50IiwiY3VycmVudEJyZWFrcG9pbnQiLCJnZXRCcmVha3BvaW50IiwiZXZlbnRIYW5kbGVyIiwiZ2V0Q29tcHV0ZWRTdHlsZSIsImRvY3VtZW50RWxlbWVudCIsImdldFByb3BlcnR5VmFsdWUiLCJyZXBsYWNlIiwiaXNCcmVha3BvaW50IiwiYnJlYWtwb2ludCIsIm9uQnJlYWtwb2ludENoYW5nZSIsIm9mZkJyZWFrcG9pbnRDaGFuZ2UiLCJpbmRleCIsInNwbGljZSIsImlnbm9yZWRFbHMiLCJpc0lnbm9yZWQiLCJlbGVtZW50IiwidGFnTmFtZSIsImF0dHJpYnV0ZXMiLCJzbGljZSIsImNhbGwiLCJzb21lIiwiZ2V0SGVhZGVyT2Zmc2V0IiwiaGVhZGVyIiwid2l0aEFubm91bmNlbWVudEJhciIsImhlYWRlckVscyIsImNoaWxkTm9kZXMiLCJpc1N0aWNreSIsInBhZ2VZT2Zmc2V0Iiwib2Zmc2V0IiwiSFRNTEVsZW1lbnQiLCJnZXRCb3VuZGluZ0NsaWVudFJlY3QiLCJoZWlnaHQiLCJib3R0b20iLCJzdHlsZSIsInRvcCIsIlN0aWNreUhlYWRlciIsInNldHRpbmdzIiwiJGJvZHkiLCJib2R5IiwiJHdpbmRvdyIsIiRzaXRlTWFpbiIsIiR0b2dnbGUiLCJzdGlja3lDbGFzcyIsInNjcm9sbGVkQ2xhc3MiLCJuYXZPcGVuQ2xhc3MiLCIkYW5ub3VuY2VtZW50QmFyIiwic3RpY2t5X2hlYWRlciIsIl9zdGlja3lSZXNldCIsIm5hdlZpc2liaWxpdHkiLCJfc3RpY2t5T2Zmc2V0IiwiX3RvZ2dsZVN0aWNreUhlYWRlciIsIl9oZWFkZXJDaGVja2VyIiwib25lIiwiYnJlYWtwb2ludHMiLCJwcmV2aW91cyIsImNsb3NlTmF2aWdhdGlvbiIsInJlcXVlc3RBbmltYXRpb25GcmFtZUlkIiwiY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJfYmluZEV2ZW50cyIsInJlcXVlc3RBbmltYXRpb25GcmFtZSIsImxheW91dCIsIl9zbGlkZVRvZ2dsZSIsImNzcyIsImlzSW5pdCIsIm9wZW4iLCJvcGVuTmF2aWdhdGlvbiIsImhpZGUiLCJtb2JpbGVPbmx5Iiwib3V0ZXJIZWlnaHQiLCJzY3JvbGxUaHJlc2hvbGQiLCJzaG91bGRTaHJpbmsiLCJfc2hyaW5rIiwiX3RvZ2dsZUFubm91bmNlbWVudEJhciIsIl9leHBhbmQiLCJyZXZlYWxlciIsIkFjY29yZGlvbiIsImV4dGVuZCIsIiRibG9jayIsImFjdGl2ZUNsYXNzIiwiYXV0b0NvbGxhcHNlIiwiY2xvc2VPcGVuIiwiX29wZW4iLCJfY2xvc2UiLCJibG9jayIsImVsaWdpYmxlQ2xhc3MiLCJOYXZNb2JpbGVTdWJNZW51cyIsImFjdGl2ZU1lbnVDbGFzcyIsImFjdGl2ZU1lbnUiLCJuYXZUcmlnZ2VyIiwic3ViTWVudSIsIiRjdXJyZW50IiwiX2Nsb3NlU3VibWVudSIsIl90b2dnbGVTdWJtZW51IiwibmV4dCIsIl9vcGVuU3VibWVudSIsIiRtZW51IiwiX3NlbGVjdFN1Yk1lbnUiLCJ0b2dnbGUiLCJjbG9zZVN1Yk1lbnVzIiwiTmF2TW9iaWxlIiwiZWxlbWVudHMiLCIkdG9nZ2xlT3BlbiIsImlzT3BlbiIsInN1Yk1lbnVzIiwiJG1vYmlsZU5hdiIsIiRwYW5lbCIsIiRvdmVybGF5IiwiJHRvZ2dsZUNsb3NlIiwibGF5b3V0SGFuZGxlciIsIl9zZXRQYW5lbEhlaWdodCIsImlubmVySGVpZ2h0IiwiZXZlbnRzIiwiY2xvc2VBbGxTdWJtZW51cyIsInNjcm9sbExlZnQiLCIkY29udGFpbmVyIiwicGFyZW50IiwiYW5pbWF0ZSIsImxlZnQiLCJ3aWR0aCIsIk1lZ2FOYXZTY3JvbGxlciIsIiRtZW51TGlzdCIsIl9hZGRTY3JvbGxDbGFzc2VzIiwic2Nyb2xsV2lkdGgiLCJOYXZEZXNrdG9wIiwiYWN0aXZlSXRlbSIsImlubGluZUNoaWxkcmVuIiwiaXMiLCJ0b2dnbGVJdGVtIiwic3RvcFByb3BhZ2F0aW9uIiwiY2xpY2tlZCIsInJlbW92ZURhdGEiLCJjbG9zZUFsbCIsIl9oYW5kbGVEb2N1bWVudENsaWNrIiwibWVnYU5hdiIsImNoaWxkcmVuIiwidW5kZWZpbmVkIiwiJHBhcmVudCIsIl9pbmxpbmVNZW51Iiwib3Blbk1lZ2FOYXYiLCJjb250YWlucyIsInN1Ym1lbnUiLCJjbG9zZUl0ZW0iLCJzY3JvbGxUb3AiLCJvcGVuSXRlbSIsInBhcmVudHMiLCJ3aW5kb3dIZWlnaHQiLCJ3aW5kb3dXaWR0aCIsImlubmVyV2lkdGgiLCJtZW51UmVjdCIsImhhc0NoaWxkcmVuIiwic3RpY2t5SGVhZGVyT2Zmc2V0IiwiZWRnZXMiLCJyaWdodCIsImJvdHRvbUVkZ2UiLCJyaWdodEVkZ2UiLCJfbWVudUxpbWl0cyIsImNoaWxkcmVuRXhjZWVkSG9yaXpvbnRhbCIsImV4Y2VlZHNWZXJ0aWNhbCIsIm1heEhlaWdodCIsIl91bnNldElubGluZU1lbnUiLCJTZWFyY2giLCJzZWFyY2hUeXBlIiwidmlldyIsImluUHJvZ3Jlc3MiLCJ4aHIiLCJYTUxIdHRwUmVxdWVzdCIsIkFjdGl2ZVhPYmplY3QiLCJfeGhyTG9hZCIsIl94aHJFcnJvciIsIl94aHJBYm9ydCIsInJlc3BvbnNlIiwicmVhZHlTdGF0ZSIsInN0YXR1cyIsInJlc3BvbnNlVGV4dCIsImVtaXQiLCJ0ZXJtIiwiYWJvcnQiLCJ1cmwiLCJwYXJhbXMiLCJzZWFyY2hQYXJhbXMiLCJPYmplY3QiLCJtYXAiLCJrZXkiLCJlbmNvZGVVUklDb21wb25lbnQiLCJqb2luIiwic2V0UmVxdWVzdEhlYWRlciIsInNlbmQiLCJFdmVudEVtaXR0ZXIiLCJTZWFyY2hGb3JtIiwiJGZvcm0iLCJzdWJtaXRIYW5kbGVyIiwiY2xvbmUiLCIkdGVybXMiLCJ0ZXJtcyIsInNwbGl0IiwidHJpbSIsImFwcGVuZCIsInN1Ym1pdCIsIkNvbnRlbnRJdGVtIiwiY29udGVudEl0ZW0iLCJ0aXRsZSIsIkNvbnRlbnRSZXN1bHRzSGVhZGVyIiwiY29udGV4dCIsImNvbnRlbnRfcmVzdWx0cyIsIkNvbnRlbnRSZXN1bHRzIiwicHJvcHMiLCJjb250ZW50IiwiJHRpdGxlIiwiY29udGVudEl0ZW1zIiwiQ29udGVudE5vUmVzdWx0cyIsIm5vX3Jlc3VsdHMiLCJQcm9kdWN0UHJpY2VDb21wYXJlQXQiLCJwcmljZSIsImNvbXBhcmVfYXRfcHJpY2UiLCJQcm9kdWN0UHJpY2VNYWluIiwiUHJvZHVjdFByaWNlIiwib25TYWxlIiwiY29uc2lzdGVudFNhdmVkIiwiJGNvbXBhcmVBdCIsIiRwcmljZSIsIlByb2R1Y3RDb250ZW50IiwicHJvZHVjdCIsIm9uX3NhbGUiLCJjb25zaXN0ZW50X3NhdmVkIiwiUHJvZHVjdEltYWdlIiwiaW1hZ2UiLCJQcm9kdWN0SXRlbSIsImVuYWJsZUltYWdlcyIsIiRpbWFnZSIsIiRjb250ZW50IiwiUHJvZHVjdFJlc3VsdHMiLCJwcm9kdWN0cyIsInByb2R1Y3RJdGVtcyIsIlByb2R1Y3ROb1Jlc3VsdHMiLCJub19yZXN1bHRzX3Byb2R1Y3RzIiwidmlld19hbGxfcHJvZHVjdHMiLCJjaGV2cm9uIiwiUmVzdWx0c0Zvb3RlciIsInZpZXdfYWxsX3Jlc3VsdHMiLCJIZWFkZXJTZWFyY2giLCIkZWxzIiwiJGhlYWRlciIsIiRkb2N1bWVudCIsImVuYWJsZUNvbnRlbnQiLCJlbmFibGVfY29udGVudCIsImVuYWJsZV9pbWFnZXMiLCJmbHlEb3duQWN0aXZlIiwidGFrZU92ZXJBY3RpdmUiLCJzaG93Rmx5RG93biIsIiRidXR0b24iLCIkdGFrZU92ZXJCdXR0b24iLCIkZmx5RG93biIsIiRzZWFyY2hSZXN1bHRzIiwiJHNlYXJjaFBsYWNlaG9sZGVyIiwiJHF1aWNrTGlua3MiLCJzdGF0aWNTZWFyY2giLCJzZWFyY2giLCJfc2VhcmNoIiwiX3RvZ2dsZVRha2VPdmVyIiwiX3NlYXJjaEZvY3VzZWQiLCJfZG9jdW1lbnRGb2N1cyIsIl9zZWFyY2hDYW5jZWxsZWQiLCJfc2VhcmNoQ29tcGxldGUiLCJfc2VhcmNoRXJyb3IiLCJjbG9zZUV2ZW50cyIsImRlYm91bmNlIiwiaGFzVGVybXMiLCJoYXNOb1Jlc3VsdHMiLCJoYXNQcmV2aW91c1Jlc3VsdHMiLCJpbnZhbGlkS2V5U3Ryb2tlcyIsIl9mbHlEb3duSW5pdGlhbCIsIl9jbG9zZUZseURvd24iLCJfZmx5RG93blNlYXJjaGluZyIsImh0bWwiLCJfdG9nZ2xlQnV0dG9uIiwiX29wZW5GbHlEb3duIiwiZXhlY3V0ZSIsImxvZyIsInNhbml0aXplZFRlcm1zIiwiJHByb2R1Y3RSZXN1bHRzIiwicmVzdWx0cyIsIm5vUmVzdWx0cyIsIiRjb250ZW50UmVzdWx0cyIsImZvcm1hdE1vbmV5IiwibW9uZXlfZm9ybWF0IiwiZm9vdGVyIiwiZGlzYWJsZSIsImNvbmNhdCIsInJldGFpbkZvY3VzIiwiZW5hYmxlIiwiU3RhdGljU2VjdGlvbkhlYWRlciIsInNlY3Rpb24iLCJjdXJyZW5jeSIsImhlYWRlclNlYXJjaCIsIiRzY3JpcHRzIiwiJG1lbnVUb2dnbGUiLCIkY2FydENvdW50IiwiJHNlYXJjaEZpZWxkIiwiJHNpdGVOYXZpZ2F0aW9uIiwiJGRlc2t0b3BOYXZpZ2F0aW9uIiwiJGhlYWRlclRvb2xzIiwiY29udmVydGVyIiwiJGNvbnZlcnRlciIsInN0aWNreUhlYWRlciIsIm5hdk1vYmlsZSIsIm5hdkRlc2t0b3AiLCJmb3JtcyIsImxpdmVfc2VhcmNoIiwiX2NvbnZlcnRlciIsIl9oZWFkZXJUb29sc1NpemUiLCJpdGVtX2NvdW50Iiwic2hvcF9jdXJyZW5jeSIsImRlZmF1bHRfY3VycmVuY3kiLCJkaXNwbGF5X2Zvcm1hdCIsIm1vbmV5X2Zvcm1hdF9ub19jdXJyZW5jeSIsIm1vbmV5X2Zvcm1hdF9jdXJyZW5jeSIsInNldEN1cnJlbmN5Iiwib3V0ZXJXaWR0aCIsImlubmVyV2lkdGhzIiwiTWF0aCIsImNlaWwiLCJjb21iaW5lZFdpZHRocyIsInJlZHVjZSIsImEiLCJiIiwiU3RhdGljU2VjdGlvbkZvb3RlciIsIl90b2dnbGVBY2NvcmRpb24iLCJvcGVuQWxsIiwiU3RhdGljQXJ0aWNsZSIsIiRjb21tZW50Rm9ybSIsInJpY2hUZXh0IiwiY29tbWVudEZvcm0iLCJTdGF0aWNCbG9nIiwiTWVzc2FnZUJhbm5lciIsIiRiYW5uZXJUZW1wbGF0ZSIsIiRiYW5uZXJzIiwiJGJhbm5lciIsIl9zaG93IiwiJHZpc2libGVCYW5uZXJzIiwiYmFubmVyIiwiX2hpZGUiLCJfcG9zaXRpb25CYW5uZXIiLCJfcmVtb3ZlQmFubmVyIiwicmVtb3ZlIiwiZGlzbWlzc0Jhbm5lcnMiLCJTdGF0aWNDYXJ0Iiwic2hpcHBpbmciLCJtZXNzYWdlQmFubmVyIiwiJHRvdGFsIiwiJHNoaXBwaW5nIiwiJHRpdGxlVG90YWxTbWFsbCIsIiR0aXRsZVRvdGFsTGFyZ2UiLCIkdGl0bGVUb3RhbENvbnRlbnRzIiwiJHNoaXBwaW5nVG9nZ2xlIiwiJHNoaXBwaW5nUmVzcG9uc2UiLCIkc2hpcHBpbmdSZXNwb25zZU1lc3NhZ2UiLCIkc2hpcHBpbmdSZXNwb25zZVJhdGVzIiwiJHNoaXBwaW5nU3VibWl0IiwiX21vdmVUaXRsZVRvdGFsIiwib25FcnJvciIsIl9oYW5kbGVFcnJvcnMiLCJDdXJyZW5jeUNvbnZlcnRlciIsIl9pbml0U2hpcHBpbmdDYWxjIiwiX3F1YW50aXR5S2V5RG93biIsIl9lZGl0SXRlbVF1YW50aXR5IiwiZGV0YWNoIiwia2V5Q29kZSIsIiRjYXJ0SXRlbSIsInF1YW50aXR5IiwibWF4IiwiX3VwZGF0ZUNhcnQiLCJjaGFuZ2VJdGVtIiwiX2RpZFVwZGF0ZSIsImxpbWl0IiwiZXJyb3JNZXNzYWdlIiwic3RvY2tfbGltaXQiLCJpdGVtcyIsInRvdGFsX3ByaWNlIiwiZmlsdGVyZWRJdGVtcyIsIml0ZW0iLCJjYXJ0SXRlbSIsIml0ZW1Ub3RhbCIsIl9xdWFudGl0eUVycm9yIiwiZXJyb3JzIiwicGFyc2VKU09OIiwic2hpcHBpbmdSZXNwb25zZSIsImVycm9yX2dlbmVyYWwiLCJ6aXAiLCJzaGlwbWVudF90b29faGVhdnkiLCJfaGFuZGxlU2hpcHBpbmdSZXNwb25zZSIsIl9iaW5kU2hpcHBpbmdDYWxjRXZlbnRzIiwiQ2FydCIsIlNoaXBwaW5nQ2FsY3VsYXRvciIsInNob3ciLCJjYWxjdWxhdGVfc2hpcHBpbmciLCJjYWxjdWxhdGluZyIsImN1c3RvbWVyIiwiX3RvZ2dsZVNoaXBwaW5nQ2FsYyIsIl9nZXRTaGlwcGluZ1JhdGVzIiwib2xkVGV4dCIsInRleHQiLCJuZXdUZXh0IiwiX2Rpc2FibGVTaGlwcGluZ0J1dHRvbiIsInNoaXBwaW5nQWRkcmVzcyIsImNvdW50cnkiLCJwcm92aW5jZSIsImdldENhcnRTaGlwcGluZ1JhdGVzRm9yRGVzdGluYXRpb24iLCJhZGRyZXNzQmFzZSIsImFkZHJlc3MiLCJmaXJzdFJhdGUiLCJmb3JtYXRSYXRlIiwibXVsdGlwbGVfcmF0ZXMiLCJvbmVfcmF0ZSIsIm5vX3JhdGVzIiwicmF0ZXMiLCJyYXRlIiwicmF0ZVZhbHVlIiwicmF0ZV92YWx1ZSIsIl9oaWRlU2hpcHBpbmdSZXNwb25zZSIsImVtcHR5IiwiX2VuYWJsZVNoaXBwaW5nQnV0dG9uIiwiX3Nob3dTaGlwcGluZ1Jlc3BvbnNlIiwiTW9kYWwiLCJjYWxsYmFja3MiLCJtb2RhbCIsIiRtb2RhbCIsIiRtb2RhbElubmVyIiwiZGVmYXVsdENhbGxiYWNrcyIsIl9vbk9wZW4iLCJfb25CZWZvcmVPcGVuIiwiX29uQ2xvc2UiLCJfb25CZWZvcmVDbG9zZSIsInBvc2l0aW9uIiwibW9kYWxPcHRpb25zIiwiaGFuZGxlIiwiX2FkZE1vZGFsQ2xhc3MiLCJWYW5pbGxhTW9kYWwiLCJjbG9zZSIsIm1vZGFsSGVpZ2h0IiwibW9kYWxQYWRkaW5nIiwibWFyZ2luVG9wIiwibW9kYWxDbGFzcyIsIm1hdGNoIiwiX3JlbW92ZU1vZGFsQ2xhc3MiLCJvbkNsb3NlIiwib25PcGVuIiwib25CZWZvcmVDbG9zZSIsIm9uQmVmb3JlT3BlbiIsInRyYXBGb2N1cyIsIm5hbWVzcGFjZSIsIiRlbGVtZW50VG9Gb2N1cyIsImV2dCIsImhhcyIsInJlbW92ZVRyYXBGb2N1cyIsIk5vZGUiLCJ2YXJpYW50Iiwib3B0aW9uc0NvdW50IiwibmVpZ2hib3JzIiwidmFyaWFudHMiLCJvcHRpb24iLCJhdmFpbGFibGUiLCJQcm9kdWN0T3B0aW9ucyIsInByb2R1Y3RIYW5kbGUiLCJub2RlTWFwIiwiX2dlbmVyYXRlTm9kZU1hcCIsInZhcmlhbnQyIiwiYWRkTmVpZ2hib3IiLCJmb3VuZCIsImNsb3Nlc3RWYXJpYW50IiwibWF0Y2hpbmdWYWx1ZXMiLCJ0ZW1wTWF0Y2hpbmdWYWx1ZXMiLCJnZXRWYXJpYW50RnJvbU9wdGlvbnMiLCJnZXRDbG9zZXN0VmFyaWFudEZyb21PcHRpb25zIiwiZ2V0VmFsaWRPcHRpb25zIiwiVmFyaWFudEhlbHBlciIsIiR2YXJpYW50cyIsIiRvcHRpb25zIiwicHJvZHVjdE9wdGlvbnMiLCJvcHRpb25zVHlwZXMiLCJvcHRpb25zVHlwZSIsInJhZGlvIiwiX3VuYmluZEV2ZW50cyIsIl9zd2l0Y2hWYXJpYW50IiwiZmlyc3RMb2FkIiwiYXZhaWxhYmxlT3B0aW9ucyIsImdldFZhcmlhbnRPckNsb3Nlc3RGcm9tT3B0aW9ucyIsImdldEF2YWlsYWJsZU9wdGlvbnNGcm9tVmFyaWFudCIsIl9zd2l0Y2hWYXJpYW50U2VsZWN0IiwiX3N3aXRjaFZhcmlhbnRSYWRpbyIsIiRvcHRpb25FbHMiLCIkb3B0aW9uIiwicHJvcCIsIm9wdGlvbjEiLCJJbWFnZXMiLCJpbWFnZXMiLCJzaXplIiwibG9hZEltYWdlIiwiZ2V0U2l6ZWRJbWFnZVVybCIsInBhdGgiLCJJbWFnZSIsInNyYyIsInJlbW92ZVByb3RvY29sIiwicHJlZml4Iiwic3VmZml4IiwiQWRkVG9DYXJ0Rmx5b3V0IiwiZm9ybURhdGEiLCJmbHlPdXRTZWxlY3RvciIsIiRhdGNUZW1wbGF0ZSIsIl9vbkluaXQiLCJfb25FcnJvciIsIl9vblN1Y2Nlc3MiLCJfY2xvc2VGbHlPdXRzIiwiJGF0Y0J1dHRvbiIsIm9uSW5pdCIsIl9kaXNhYmxlQnV0dG9uIiwiX3JlbW92ZUZseU91dHMiLCIkZmx5T3V0IiwicXVhbnRpdHlGaWVsZCIsImFqYXgiLCJwYXJhbSIsImRvbmUiLCJpbWFnZVVybCIsInByb2R1Y3RfdGl0bGUiLCJ2YXJpYW50X29wdGlvbnMiLCIkcHJvZHVjdFByaWNlIiwibW9uZXlGb3JtYXQiLCJvblN1Y2Nlc3MiLCIkc3ViVG90YWwiLCJvcmlnaW5hbF90b3RhbF9wcmljZSIsIl9wb3NpdGlvbkZseU91dCIsIl9vcGVuRmx5T3V0IiwiZmFpbCIsImRlc2NyaXB0aW9uIiwiX2VuYWJsZUJ1dHRvbiIsIl9jbG9zZUZseU91dCIsIiRleGNsdWRlRmx5T3V0IiwiX3JlbW92ZUZseU91dCIsImFwaSIsImFwaUxvYWRlZENhbGxiYWNrcyIsImFwaUxvYWRlZCIsIm9uWW91VHViZUlmcmFtZUFQSVJlYWR5IiwiYXBpTG9hZGVkQ2FsbGJhY2siLCJZb3V0dWJlIiwicmVnZXgiLCJvbkFwaUxvYWRlZCIsIl9vbkFwaUxvYWRlZCIsImlzUmVhZHkiLCJvblJlYWR5IiwiX29uUmVhZHkiLCJvblJlYWR5Q2FsbGJhY2siLCJvblN0YXRlQ2hhbmdlIiwiX29uU3RhdGVDaGFuZ2UiLCJvblBsYXlDYWxsYmFjayIsIlByb21pc2UiLCJyZXNvbHZlIiwicGxheWVyIiwicGxheVZpZGVvIiwicGF1c2VWaWRlbyIsIm11dGUiLCJZVCIsIlBsYXllciIsInN0YXRlIiwiUGxheWVyU3RhdGUiLCJQTEFZSU5HIiwiVmltZW9QbGF5ZXIiLCJ1cmxQYXJ0cyIsIm9uUHJvZ3Jlc3MiLCJfb25Qcm9ncmVzcyIsIm9uUHJvZ3Jlc3NDYWxsYmFjayIsInBsYXkiLCJwYXVzZSIsInNldFZvbHVtZSIsImNhdGNoIiwiVmltZW8iLCJyZWFkeSIsInRoZW4iLCJWaWRlbyIsInBsYXRmb3JtIiwicGxheUJ1dHRvbiIsInZpZGVvRWwiLCJvblBsYXlDbGljayIsIl9vblBsYXlDbGljayIsIm9uUGF1c2VDbGljayIsIl9vblBhdXNlQ2xpY2siLCJhdXRvcGxheSIsIl9hdXRvcGxheSIsInZpZGVvIiwiY2xhc3NMaXN0IiwiYWRkIiwiUHJvZHVjdEdhbGxlcnkiLCIkZ2FsbGVyeSIsInNsaWRlciIsIiRzbGlkZXIiLCJzbGlkZXMiLCIkc2xpZGVzIiwic2xpZGVJbWFnZXMiLCIkc2xpZGVyUGFnaW5hdGlvbiIsIiRwYWdpbmF0aW9uVHJpZ2dlciIsInZpZGVvcyIsInZpZGVvU2xpZGVzIiwiX29uVXBkYXRlR2FsbGVyeSIsInNsaWRlSW1hZ2VMb2FkZWQiLCJfb25TbGlkZUltYWdlTG9hZGVkIiwidmFyaWFudENoYW5nZSIsIl9vblZhcmlhbnRDaGFuZ2UiLCJfdW5sb2FkR2FsbGVyeSIsInZpZGVvU2xpZGUiLCJzbGlkZUlkIiwiX2luaXRHYWxsZXJ5Iiwidmlld3BvcnQiLCJyZXNpemUiLCJmZWF0dXJlZF9pbWFnZSIsIiRzZWxlY3RlZEltYWdlIiwiZmxpY2tpdHlPcHRpb25zIiwib3B0aW9uc01vYmlsZSIsIm9wdGlvbnNEZXNrdG9wIiwiaW5pdGlhbEluZGV4IiwiX2JpbmRHYWxsZXJ5IiwiX2hhbmRsZUdhbGxlcnlWaWRlb3MiLCJfdXBkYXRlQWN0aXZlU2xpZGUiLCJzZWxlY3RlZEluZGV4Iiwic2VsZWN0ZWRFbGVtZW50IiwidmlkZW9LZXkiLCJlbmFibGVfdmlkZW9fYXV0b3BsYXkiLCIkbmV3U2xpZGUiLCIkbmV3VGh1bWJuYWlsIiwic2libGluZ3MiLCJQcm9kdWN0RGV0YWlscyIsIiRmb3JtQXJlYSIsIiRkZXRhaWxzIiwidXNlSGlzdG9yeSIsInZhcmlhbnRIZWxwZXIiLCJfb25BVENPcGVuIiwiX29uQVRDQ2xvc2UiLCJhdGNDYWxsYmFja3MiLCIkcHJvZHVjdEF0Y0J1dHRvbiIsIiRwcm9kdWN0VmFyaWFudHMiLCIkcHJvZHVjdE9wdGlvbnMiLCJ2YXJpYW50RmllbGRzIiwiZ2FsbGVyeSIsIl9pbml0T3B0aW9ucyIsIl9BZGRUb0NhcnRGbHlvdXQiLCJfdXBkYXRlUHJpY2UiLCJfdXBkYXRlQmFkZ2UiLCJfdXBkYXRlQnV0dG9uIiwicmVwbGFjZVN0YXRlIiwiaGFzQ29tcGFyZVByaWNlIiwiJGNvbXBhcmVBdFByaWNlIiwiJGNvbXBhcmVBdFByaWNlTW9uZXkiLCIkcHJpY2VNb25leSIsInByaWNlU2F2ZWQiLCIkYmFkZ2UiLCIkYmFkZ2VNb25leVNhdmVkIiwiJGJhZGdlUGVyY2VudFNhdmVkIiwicGVyY2VudGlsZVNhdmVkIiwicm91bmQiLCJwcm9kdWN0X2F2YWlsYWJsZSIsInByb2R1Y3RfdW5hdmFpbGFibGUiLCJzZXJpYWxpemVBcnJheSIsIlByb2R1Y3RRdWlja3Nob3AiLCIkcXVpY2tTaG9wIiwibG9hZGVkIiwicHJvZHVjdERldGFpbHMiLCJxdWlja1Nob3BIVE1MIiwiaGFzQXR0cmlidXRlIiwiX2luaXRTUFIiLCJfaW5pdGlhbGl6ZSIsIlBheW1lbnRCdXR0b24iLCJTUFIiLCJyZWdpc3RlckNhbGxiYWNrcyIsImluaXRSYXRpbmdIYW5kbGVyIiwiaW5pdERvbUVscyIsImxvYWRQcm9kdWN0cyIsImxvYWRCYWRnZXMiLCIkbWVzc2FnZSIsIiRkZXNjcmlwdGlvbiIsIl9vbkFUQ0luaXQiLCJfb25BVENFcnJvciIsIl9vbkFUQ1N1Y2Nlc3MiLCJtb2RhbENhbGxiYWNrcyIsIl90b2dnbGVNZXNzYWdlIiwiaXNWaXNpYmxlIiwiUHJvZHVjdEdyaWRJdGVtIiwicHJvZHVjdFF1aWNrc2hvcCIsInF1aWNrQnV5U2V0dGluZ3MiLCIkaHRtbCIsIiRhY3Rpb25zIiwiaGFzUHJvZHVjdEFjdGlvbnMiLCJfYWRkVG9DYXJ0IiwiX2FjdGlvbnNUb2dnbGUiLCJfb3BlblF1aWNrU2hvcCIsIl9zZXRTb3J0QnlRdWVyeVBhcmFtZXRlcnMiLCJxdWVyeVBhcmFtcyIsImdyaWRfbGlzdCIsIl9pbml0UXVpY2tCdXkiLCJfb2JqZWN0Rml0UG9seWZpbGwiLCJhQ291cGxlcyIsInN1YnN0ciIsImFLZXlWYWx1ZSIsImRlY29kZVVSSUNvbXBvbmVudCIsIl9pc09iamVjdEZpdEF2YWlsYWJsZSIsImFjdGlvbnNIZWlnaHQiLCJfc2hvd0FjdGlvbnMiLCJfaGlkZUFjdGlvbnMiLCJfZ2V0SGVpZ2h0cyIsImhlaWdodEJhc2UiLCJoZWlnaHRFeHBhbmRlZCIsInZhcmlhbnRJRCIsIlJlY2VudGx5Vmlld2VkIiwicmVjZW50bHlWaWV3ZWQiLCJyZWNlbnRseV92aWV3ZWRfaW5mbyIsInRpbWUiLCJ0aW1lc3RhbXAiLCJEYXRlIiwiZ2V0VGltZSIsImxvY2FsU3RvcmFnZSIsImdldEl0ZW0iLCJ0aW1lU2luY2UiLCJsaW5rIiwicmVtb3ZlUmVjZW50bHlWaWV3ZWQiLCJzZXRJdGVtIiwic3RyaW5naWZ5IiwiJGNhcm91c2VsIiwiX2luaXRTbGlkZXIiLCJiaW5kRXZlbnRzIiwibmV4dEFsbCIsInNlbGVjdENlbGwiLCJjbGVhclJlY2VudGx5Vmlld2VkIiwibm93Iiwic2Vjb25kc1Bhc3QiLCJzZWNvbmRzQWdvIiwic2Vjb25kIiwiYWdvIiwic2Vjb25kcyIsIm1pbnV0ZXNBZ28iLCJtaW51dGUiLCJtaW51dGVzIiwiaG91cnNBZ28iLCJob3VyIiwiaG91cnMiLCJkYXRlIiwiY3VycmVudERhdGUiLCJkYXkiLCJnZXREYXRlIiwibW9udGgiLCJ0b0RhdGVTdHJpbmciLCJ5ZWFyIiwiZ2V0RnVsbFllYXIiLCJ5MSIsInkyIiwiU2VsZWN0V2lkdGgiLCJfYWRqdXN0V2lkdGgiLCJzZWxlY3RlZFRleHQiLCJhZGRpdGlvbmFsU3R5bGVzIiwiU3RhdGljQ29sbGVjdGlvbiIsInNvcnRXaWR0aCIsIiRmb2N1c0l0ZW0iLCJmaWx0ZXJzQ29udGVudCIsInNvcnRDb250ZW50IiwiJHNvcnRUcmlnZ2VyIiwiJHNvcnRUcmlnZ2VyQnV0dG9uIiwiJHNvcnRUcmlnZ2VyTW9kYWwiLCIkZmlsdGVyc1RyaWdnZXIiLCIkYWxsVGFncyIsIiRhZHZhbmRlZFRhZ3MiLCIkYWRkaXRpb25hbFRhZ3MiLCIkZ3JpZFZpZXdUb2dnbGUiLCIkbGlzdFZpZXdUb2dnbGUiLCIkZ3JpZENvbnRhaW5lciIsIl9jaGFuZ2VTb3J0aW5nIiwiX2NoYW5nZVNvcnRpbmdCdXR0b24iLCJfc2hvd1NvcnRNb2RhbCIsIl9zaG93RmlsdGVyc01vZGFsIiwiX2FjdGl2YXRlVGFnIiwiX2FkdmFuY2VkVGFncyIsIl90b2dnbGVUYWdzIiwiX29uTW9kYWxPcGVuIiwiX29uTW9kYWxDbG9zZSIsIl90b2dnbGVMaXN0VmlldyIsIl90b2dnbGVHcmlkVmlldyIsIl9jaGVja0xpc3RWaWV3IiwiJHByb2R1Y3RJdGVtcyIsInByb2R1Y3RJdGVtIiwiX3VwZGF0ZVByaWNlcyIsInRhZ0dyb3VwIiwiJGFjdGl2ZUdyb3VwIiwidGFnSGFuZGxlIiwiJHRyaWdnZXIiLCIkaXRlbXMiLCJzaWJsaW5nc1Zpc2libGUiLCJzZWVfbGVzcyIsInNlZV9tb3JlIiwic29ydF9ieSIsIlN0YXRpY0dpZnRjYXJkIiwiJHFyQ29kZSIsIiRnaWZ0Q2FyZENvZGUiLCJRUkNvZGUiLCJwcmludCIsIl9zZWxlY3RUZXh0IiwicmFuZ2UiLCJjcmVhdGVUZXh0UmFuZ2UiLCJtb3ZlVG9FbGVtZW50VGV4dCIsImdldFNlbGVjdGlvbiIsInNlbGVjdGlvbiIsImNyZWF0ZVJhbmdlIiwic2VsZWN0Tm9kZUNvbnRlbnRzIiwicmVtb3ZlQWxsUmFuZ2VzIiwiYWRkUmFuZ2UiLCJTdGF0aWNQYXNzd29yZCIsIm1vZGFsRm9ybXMiLCJuZXdzbGV0dGVyRm9ybSIsIm1vZGFsQ29udGVudHMiLCIkbmV3c2xldHRlckZvcm0iLCJtb2RhbE9wZW4iLCJvbk1vZGFsT3BlbiIsIm1vZGFsQ2xvc2UiLCJvbk1vZGFsQ2xvc2UiLCJfb3Blbk1vZGFsIiwiX2NoZWNrRm9yUGFzc3dvcmRBdHRlbXB0IiwiJGNvbnRlbnRzIiwiUHJvZHVjdFJvd1Njcm9sbGVyIiwicHJvZHVjdFJvdyIsIiRwcm9kdWN0Um93IiwiX21vYmlsZVNsaWRlciIsIl9kZXN0cm95RmxpY2tpdHkiLCJfYmluZFNsaWRlciIsIl9pbml0RmxpY2tpdHkiLCJtYXhDZWxsSGVpZ2h0IiwiU3RhdGljUHJvZHVjdCIsInJldmlld0Zvcm0iLCIkcHJvZHVjdCIsImlzVGhyZWVDb2x1bW4iLCJpc1RoZW1lRWRpdG9yIiwiZGVzaWduTW9kZSIsImhpc3RvcnkiLCIkZm9ybVJlZ3VsYXIiLCIkZm9ybUFsdCIsIiRyZWxhdGVkUHJvZHVjdHMiLCJyZWxhdGVkUHJvZHVjdHMiLCJyZWxhdGVkUHJvZHVjdHNTY3JvbGxlciIsIiRwcm9kdWN0UmV2aWV3cyIsIl9tb3ZlRm9ybSIsIlN0YXRpY1NlYXJjaCIsInNlYXJjaEZvcm0iLCJEeW5hbWljVHdpdHRlckZlZWQiLCIkYmxvZ1Bvc3RzIiwiU3RhdGljSGlnaGxpZ2h0c0Jhbm5lcnMiLCJfYmluZEZsaWNraXR5IiwiU3RhdGljU2xpZGVzaG93IiwiY2Fyb3VzZWwiLCJjb250YWluZXIiLCJpc0Z1bGxzY3JlZW4iLCJzZWxlY3RCbG9ja09uTG9hZCIsImNvbnRpbnVlQXV0b3BsYXkiLCJzdG9wQXV0b3BsYXkiLCJhdXRvcGxheVRpbWVvdXQiLCJlbmFibGVfYXV0b3BsYXkiLCJhdXRvcGxheV9kdXJhdGlvbiIsIl9zbGlkZXNob3dIZWlnaHQiLCJfcG9zaXRpb25Eb3RzIiwiX2NoYW5nZUFycnJvd0NvbG9ycyIsInBhdXNlUGxheWVyIiwicGxheVBsYXllciIsInBhZ2VEb3RzIiwib2Zmc2V0SGVpZ2h0IiwiZ3V0dGVyQ29udGVudCIsImN1cnJlbnRDb2xvciIsImRhdGFzZXQiLCJkb3RzIiwidGhlbWVjb2xvciIsInNsaWRlY29sb3IiLCJmaWxsIiwiYmFja2dyb3VuZCIsImhlYWRlckhlaWdodCIsIiRzbGlkZSIsInNsaWRlSW5kZXgiLCJEeW5hbWljUHJvbW9CbG9ja3MiLCJleHBhbmRlZENsYXNzIiwiY29tcHJlc3NCbG9ja3MiLCJjb21wcmVzc19ibG9ja3MiLCJfYmxvY2tJbnRlcmFjdGlvbiIsIl9jb2xsYXBzZSIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsIkR5bmFtaWNNZW51TGlzdCIsIl90b2dnbGVMaXN0IiwiaXNJRTkiLCIkd3JhcHBlciIsIiR0d2VldHMiLCJ0cmFjayIsIl9sb2FkIiwiJHRlbXBsYXRlIiwidGVtcGxhdGUiLCJvbmJvYXJkaW5nIiwidXNlcm5hbWUiLCJyZXR3ZWV0cyIsImxvY2FsZSIsIl9ldmVuSGVpZ2h0cyIsImZldGNoIiwidHdlZXRzIiwiX3JlbmRlclR3ZWV0cyIsInVudHJhY2siLCJoZWlnaHRzIiwiYXBwbHkiLCJzY3JlZW5OYW1lIiwiJGF2YXRhciIsInBvc3RlZEF0Iiwid3JhcHBlckNsYXNzIiwidHdlZXRzTGVuZ3RoIiwidHdlZXRzQXJyYXkiLCJ0d2VldCIsIiR0d2VldCIsImF1dGhvckluZm8iLCJfZXh0cmFjdEF1dGhvciIsIm1ldGEiLCJfZXh0cmFjdE1ldGEiLCJmYWRlT3V0IiwicHJvbWlzZSIsIl9leHRyYWN0V3JhcHBlckNsYXNzIiwiRHluYW1pY0luc3RhZ3JhbUZlZWQiLCJwaG90b0NvdW50IiwicGhvdG9fY291bnQiLCJhY2Nlc3NUb2tlbiIsImFjY2Vzc190b2tlbiIsIiRwaG90b0NvbnRhaW5lciIsIiRwaG90b0NvbnRhaW5lclBsYWNlaG9sZGVyIiwiJHBob3RvVGVtcGxhdGUiLCJfZ2V0UGhvdG9zIiwicGhvdG9zIiwiX3JlbmRlclBob3RvcyIsInBob3RvUHJvbWlzZSIsImNvZGUiLCJlcnJvcl9tZXNzYWdlIiwiZXJyb3JfdHlwZSIsIkRlZmVycmVkIiwicmVqZWN0IiwicGhvdG9BcnJheSIsInBob3RvIiwibG93UmVzb2x1dGlvbiIsImxvd19yZXNvbHV0aW9uIiwic3RhbmRhcmRSZXNvbHV0aW9uIiwic3RhbmRhcmRfcmVzb2x1dGlvbiIsIiRsaW5rIiwiJHBob3RvIiwiRHluYW1pY0ZlYXR1cmVkQ29sbGVjdGlvbiIsInJ0ZSIsInJpY2hUZXh0QXJlYSIsIkR5bmFtaWNWaWRlbyIsImhhc1BsYXllZCIsInJlY3QiLCJjbGllbnRIZWlnaHQiLCJEeW5hbWljTmV3c2xldHRlciIsImp1c3REZWJvdW5jZSIsInNlY3Rpb25zIiwicmVnaXN0ZXIiLCJEeW5hbWljQmxvZ1Bvc3RzIiwiRHluYW1pY1JpY2hUZXh0IiwiRHluYW1pY1NlYXJjaCIsIlBYU01hcCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFhQSxFQUFFLFVBQVUsTUFBTSxFQUFFLE9BQU8sR0FBRzs7Q0FFN0IsWUFBWSxDQUFDOztDQUViLEFBQXdFOzs7Ozs7Ozs7RUFTdkUsY0FBYyxHQUFHLE1BQU0sQ0FBQyxRQUFRO0dBQy9CLE9BQU8sRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO0dBQ3ZCLFVBQVUsQ0FBQyxHQUFHO0lBQ2IsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUc7S0FDbEIsTUFBTSxJQUFJLEtBQUssRUFBRSwwQ0FBMEMsRUFBRSxDQUFDO0tBQzlEO0lBQ0QsT0FBTyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUM7SUFDcEIsQ0FBQztFQUNILEFBRUE7OztDQUdELElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sR0FBR0EsY0FBSSxFQUFFLFVBQVUsTUFBTSxFQUFFLFFBQVEsR0FBRzs7Ozs7O0FBTWpGLFlBQVksQ0FBQzs7QUFFYixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7O0FBRWIsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQzs7QUFFL0IsSUFBSSxRQUFRLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQzs7QUFFckMsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQzs7QUFFdEIsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQzs7QUFFeEIs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QUFDLFdBQVcsRUFBRSxFQUFFLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtLQUN0RTs7SUFFRCxJQUFJLFFBQVEsRUFBRSxFQUFFLENBQUM7O0lBRWpCLElBQUksRUFBRSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUM7SUFDMUIsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDZixJQUFJLE9BQU8sQ0FBQzs7SUFFWixJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7TUFDYixJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUU7UUFDVixJQUFJLEdBQUcsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztPQUNqRDtNQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUNsQixRQUFRLEVBQUU7UUFDVixLQUFLLENBQUM7VUFDSixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1VBQzdDLE1BQU07UUFDUixLQUFLLENBQUM7VUFDSixRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztVQUMzRCxNQUFNO1FBQ1IsS0FBSyxDQUFD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QUNoUyxJQUFJLGNBQWMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLE1BQU0sQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pHLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVELEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RELEdBQUcsTUFBTSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ25FLEdBQUcsTUFBTSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzVELEdBQUcsTUFBTSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2xFLEdBQUcsTUFBTSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BFLEdBQUcsTUFBTSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzNELEdBQUcsTUFBTSxDQUFDLFFBQVEsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3ZELEdBQUcsTUFBTSxDQUFDLGdCQUFnQixHQUFHLFNBQVMsQ0FB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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsSUFBSSxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsT0FBTyxPQUFPLENBQUMsQ0FBQztBQUMxTCxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsc0JBQXNCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsOEJBQThCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDNVQsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdFAsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMVQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsOEJBQThCLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDck0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsc0JBQXNCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDdFAsS0FBSyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxzQkFBc0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMVQsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ04sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDdlYsSUFBSSxXQUFXLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsbUNBQW1DLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDLFlBQVksQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsZ0NBQWdDLENBQUMsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLDhCQUE4QixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLFNBQVMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLGlCQUFpQixDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7QUFDOWdELElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxD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"}