TimeTrex/interface/html5/dist/developer_tools-debugPanelController.bundle.js

1 line
139 KiB
JavaScript

(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["developer_tools-debugPanelController"],{8038:(__unused_webpack_module,__unused_webpack_exports,__webpack_require__)=>{eval("/* provided dependency */ var $ = __webpack_require__(9755);\n$( document ).on( 'click', '.tt_debug_close_btn', function( e ) {\n\te.preventDefault();\n\tDebug.closePanel();\n} );\n\n$( document ).on( 'change', '#tt_debug_enable_checkbox', function( e ) {\n\te.preventDefault();\n\tDebug.setEnable( $( this ).is( ':checked' ) );\n} );\n\n$( document ).on( 'click', '#trigger_js_exception_button', function( e ) {\n\te.preventDefault();\n\tvar exception_type = $( '#tt_debug_exception_type_select' ).val();\n\n\tswitch ( exception_type ) {\n\t\tcase 'js_error':\n\t\t\tnon_existant_variable.non_existant_function();\n\t\t\tbreak;\n\t\tcase 'js_load_script_parser_error':\n\t\t\tvar script_path = Global.getViewPathByViewId( 'DeveloperTools' ) + 'triggerParserError.js';\n\t\t\t//remove from cache to ensure that we're sending a totally new request\n\t\t\tdelete LocalCacheData.loadedScriptNames[script_path];\n\t\t\t//change the js version number to trigger forced reload\n\t\t\tAPIGlobal.pre_login_data.application_build += '_FORCE';\n\t\t\treturn Global.loadScript( script_path, function( result ) {\n\t\t\t\tDebug.Arr( result, 'no error happened.' );\n\t\t\t} );\n\t\tcase 'js_load_script_404_error':\n\t\t\tGlobal.loadScript( 'nonexistantscript.js', function( result ) {\n\t\t\t\tDebug.Arr( result, 'no error happened.' );\n\t\t\t} );\n\t\t\tbreak;\n\t}\n} );\n\n$( document ).on( 'click', '#trigger_js_timeout_button', function( e ) {\n\te.preventDefault();\n\tGlobal.idle_time = 100;\n\tGlobal.doPingIfNecessary();\n} );\n\n$( document ).on( 'change', '#tt_debug_exception_verbosity', function( e ) {\n\te.preventDefault();\n\tDebug.setVerbosity( $( this ).val() );\n} );\n\n$( document ).on( 'change', '#tt_overlay_disable_checkbox', function( e ) {\n\te.preventDefault();\n\tGlobal.UNIT_TEST_MODE = $( this ).is( ':checked' );\n\tGlobal.event_bus.emit( 'tt_left_container', 'rebuild_menu' );\n} );\n\n$( document ).on( 'click', '#qunit_test_button', function( e ) {\n\te.preventDefault();\n\t$( '#tt_debug_console' ).css( 'width', '80%' );\n\t$( '#tt_debug_console' ).css( 'margin', '0 auto' );\n\trunUnitTests();\n} );\n\n/**\n * Put all unit tests in this function\n */\n\n$( document ).on( 'change', '#tt_output_variable_select', function( e ) {\n\te.preventDefault();\n\toutput_system_data( $( this ).val() );\n} );\n\n$( document ).on( 'click', '#trigger_output_variable_select', function( e ) {\n\te.preventDefault();\n\toutput_system_data( $( '#tt_output_variable_select' ).val() );\n} );\n\n$( document ).on( 'click', '#trigger_arbitrary_script', function( e ) {\n\te.preventDefault();\n\tvar script = $( '#arbitrary_script' ).val();\n\tscript = script.replace( /(\\r\\n|\\n|\\r)/gm, '' ); //strip all line-ends\n\tconsole.log( eval( script ) );\n} );\n\n// #VUETEST\n$( document ).on( 'click', '#load_vue_test_button', function( e ) {\n\te.preventDefault();\n\twindow.VueRouter.push('test');\n} );\n\n\n\n$( document ).on( 'click', '#awesomebox_test', function( e ) {\n\te.preventDefault();\n\tDebug.showAwesomeBoxTest();\n} );\n\n$( document ).on( 'click', '#grid_test', function( e ) {\n\te.preventDefault();\n\tDebug.showGridTest();\n} );\n\n$( document ).on( 'click', '#WidgetTest_test', function( e ) {\n\te.preventDefault();\n\tDebug.showWidgetTest();\n} );\n\nfunction breakOn( obj, propertyName, mode, func ) {\n\t// this is directly from https://github.com/paulmillr/es6-shim\n\tfunction getPropertyDescriptor( obj, name ) {\n\t\tvar property = Object.getOwnPropertyDescriptor( obj, name );\n\t\tvar proto = Object.getPrototypeOf( obj );\n\t\twhile ( property === undefined && proto !== null ) {\n\t\t\tproperty = Object.getOwnPropertyDescriptor( proto, name );\n\t\t\tproto = Object.getPrototypeOf( proto );\n\t\t}\n\t\treturn property;\n\t}\n\n\tfunction verifyNotWritable() {\n\t\tif ( mode !== 'read' )\n\t\t\tthrow \"This property is not writable, so only possible mode is 'read'.\";\n\t}\n\n\tvar enabled = true;\n\tvar originalProperty = getPropertyDescriptor( obj, propertyName );\n\tvar newProperty = { enumerable: originalProperty.enumerable };\n\n\t// write\n\tif ( originalProperty.set ) {// accessor property\n\t\tnewProperty.set = function( val ) {\n\t\t\tif ( enabled && ( !func || func && func( val ) ) )\n\t\t\t\tdebugger;\n\n\t\t\toriginalProperty.set.call( this, val );\n\t\t};\n\t} else if ( originalProperty.writable ) {// value property\n\t\tnewProperty.set = function( val ) {\n\t\t\tif ( enabled && ( !func || func && func( val ) ) )\n\t\t\t\tdebugger;\n\n\t\t\toriginalProperty.value = val;\n\t\t};\n\t} else {\n\t\tverifyNotWritable();\n\t}\n\n\t// read\n\tnewProperty.get = function( val ) {\n\t\tif ( enabled && mode === 'read' && ( !func || func && func( val ) ) )\n\t\t\tdebugger;\n\n\t\treturn originalProperty.get ? originalProperty.get.call( this, val ) : originalProperty.value;\n\t};\n\n\tObject.defineProperty( obj, propertyName, newProperty );\n\n\treturn {\n\t\tdisable: function() {\n\t\t\tenabled = false;\n\t\t},\n\n\t\tenable: function() {\n\t\t\tenabled = true;\n\t\t}\n\t};\n};\n\nfunction runUnitTests() {\n\tif ( $( '#qunit_script' ).length == 0 ) {\n\t\t$( '<script id=\\'qunit_script\\' src=\\'framework/qunit/qunit.js\\'><\/script>' ).appendTo( 'head' );\n\t\t$( '<link rel=\\'stylesheet\\' type=\\'text/css\\' href=\\'framework/qunit/qunit.css\\'>' ).appendTo( 'head' );\n\t\tQUnit.config.autostart = false;\n\t\t$( '#qunit_container' ).css( 'width', '100vw' );\n\t\t$( '#qunit_container' ).css( 'height', '100vh' );\n\t\t$( '#qunit_container' ).css( 'overflow-y', 'scroll' );\n\t\t$( '#qunit_container' ).css( 'position', 'fixed' );\n\t\t$( '#qunit_container' ).css( 'top', '0px' );\n\t\t$( '#qunit_container' ).css( 'left', '0px' );\n\t\t$( '#qunit_container' ).css( 'z-index', '100' );\n\t\t$( '#qunit_container' ).css( 'background', '#fff' );\n\t\t$( '#qunit_container' ).show();\n\n\t\t$( '#tt_debug_console' ).remove();\n\t}\n\tif ( !window.qunit_initiated ) {\n\t\twindow.qunit_initiated = true;\n\t\t//QUnit.start(); //This causes a JavaScript exception, but does not seem to be required. Test ran without it.\n\t}\n\n\tQUnit.module( 'QUnit Sanity' );\n\tQUnit.test( 'QUnit test', function( assert ) {\n\t\tassert.ok( 1 == '1', 'QUnit is loaded and sane!' );\n\t} );\n\n\tQUnit.module( 'Global.js' );\n\tQUnit.test( 'Global.MoneyRound', function( assert ) {\n\t\tassert.ok( Global.MoneyRound( 1.005, 2 ) == '1.01', 'Global.MoneyRound(1.005, 2) == 1.01 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 1.77777777, 2 ) == '1.78', 'Global.MoneyRound(1.77777777, 2) == 1.78 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 9.1, 2 ) == '9.10', 'Global.MoneyRound(9.1, 2) == 9.10 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 1.0049999999999999, 2 ) == '1.01', 'Global.MoneyRound(1.0049999999999999, 2) == 1.01 -- Passed!' );\n\n\t\tassert.ok( Global.MoneyRound( -28.120, 2 ) == '-28.12', 'Global.MoneyRound(-28.120, 2) == -28.12 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 28.120, 2 ) == '28.12', 'Global.MoneyRound(28.120, 2) == 28.12 -- Passed!' );\n\n\t\tassert.ok( Global.MoneyRound( -28.124, 2 ) == '-28.12', 'Global.MoneyRound(-28.124, 2) == -28.12 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 28.124, 2 ) == '28.12', 'Global.MoneyRound(28.124, 2) == 28.12 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( -28.125, 2 ) == '-28.13', 'Global.MoneyRound(-28.125, 2) == -28.13 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 28.125, 2 ) == '28.13', 'Global.MoneyRound(28.125, 2) == 28.13 -- Passed!' );\n\n\t\tassert.ok( Global.MoneyRound( -28.129, 2 ) == '-28.13', 'Global.MoneyRound(-28.129, 2) == -28.13 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 28.129, 2 ) == '28.13', 'Global.MoneyRound(28.129, 2) == 28.13 -- Passed!' );\n\n\t\tassert.ok( Global.MoneyRound( -0.124, 2 ) == '-0.12', 'Global.MoneyRound(-0.124, 2) == -0.12 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 0.124, 2 ) == '0.12', 'Global.MoneyRound(0.124, 2) == 0.12 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( -0.155, 2 ) == '-0.16', 'Global.MoneyRound(-0.155, 2) == -0.16 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 0.155, 2 ) == '0.16', 'Global.MoneyRound(0.155, 2) == 0.16 -- Passed!' );\n\n\t\tassert.ok( Global.MoneyRound( -0.001, 2 ) == '0.00', 'Global.MoneyRound(-0.001, 2) == 0.00 -- Passed!' );\n\t\tassert.ok( Global.MoneyRound( 0.001, 2 ) == '0.00', 'Global.MoneyRound(0.001, 2) == 0.00 -- Passed!' );\n\t} );\n\n\tQUnit.test( 'Global.js sort-prefix', function( assert ) {\n\t\tvar res = Global.removeSortPrefix( '-1234-11111111-1111-1111-1111-111111111111' );\n\t\tassert.ok( res == '11111111-1111-1111-1111-111111111111', 'stripped from synth uuid a.' );\n\n\t\tvar res = Global.removeSortPrefix( '11111111-1111-1111-1111-111111111111' );\n\t\tassert.ok( res == '11111111-1111-1111-1111-111111111111', 'stripped from synth uuid no sort-prefix.' );\n\n\t\tvar res = Global.removeSortPrefix( '-1234-05d3d547-0e2b-9233-65ba-4e229fd72bc0' );\n\t\tassert.ok( res == '05d3d547-0e2b-9233-65ba-4e229fd72bc0', 'stripped from valid UUID with 4 digit numeric section in the middle.' );\n\n\t\tvar res = Global.removeSortPrefix( '05d3d547-0e2b-9233-65ba-4e229fd72bc0' );\n\t\tassert.ok( res == '05d3d547-0e2b-9233-65ba-4e229fd72bc0', 'stripped from valid UUID with 4 digit numeric section in the middle.' );\n\n\t\tvar res = Global.removeSortPrefix( '-1234-111' );\n\t\tassert.ok( res == '111', 'stripped from int a.' );\n\n\t\tvar res = Global.removeSortPrefix( '111' );\n\t\tassert.ok( res == '111', 'stripped from int with no sort-prefix.' );\n\n\t\tvar res = Global.removeSortPrefix( '-1234-testStringGalrblyBlah' );\n\t\tassert.ok( res == 'testStringGalrblyBlah', 'stripped from string a.' );\n\n\t\tvar res = Global.removeSortPrefix( 'testStringGalrblyBlah' );\n\t\tassert.ok( res == 'testStringGalrblyBlah', 'stripped from string with no sort-prefix.' );\n\n\t\tvar res = Global.removeSortPrefixFromArray( {\n\t\t\t'-1112-testStringGalrblyBlah': 'string',\n\t\t\t'-1113-1234': 'int',\n\t\t\t'-1234-11111111-1111-1111-1111-111111111111': 'uuid'\n\t\t} );\n\t\tvar cnt = 0;\n\n\t\tassert.ok( res['testStringGalrblyBlah'] == 'string', 'prefix stripped properly' );\n\t\tassert.ok( res['1234'] == 'int', 'prefix stripped properly' );\n\t\tassert.ok( res['11111111-1111-1111-1111-111111111111'] == 'uuid', 'prefix stripped properly' );\n\t} );\n\n\tQUnit.test( 'Global.js parseTimeUnit HH:MM:SS', function( assert ) {\n\t\tassert.equal( Global.parseTimeUnit( '00:01', 10 ), 60 );\n\t\tassert.equal( Global.parseTimeUnit( '-00:01', 10 ), -60 );\n\n\t\tassert.equal( Global.parseTimeUnit( '01:00', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '10:00', 10 ), 36000 );\n\t\tassert.equal( Global.parseTimeUnit( '100:00', 10 ), 360000 );\n\t\tassert.equal( Global.parseTimeUnit( '1000:00', 10 ), 3600000 );\n\t\tassert.equal( Global.parseTimeUnit( '10000:00', 10 ), 36000000 );\n\t\tassert.equal( Global.parseTimeUnit( '10000:01.5', 10 ), 36000060 );\n\n\t\tassert.equal( Global.parseTimeUnit( '01', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '-1', 10 ), -3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1:', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1:00:00', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1:00:01', 10 ), 3601 );\n\t\tassert.equal( Global.parseTimeUnit( '\"1:00:01\"', 10 ), 3601 );\n\n\t\tassert.equal( Global.parseTimeUnit( '00:60', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( ':60', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( ':1', 10 ), 60 );\n\n\t\tassert.equal( Global.parseTimeUnit( '1:00:01.5', 10 ), 3601 );\n\t\tassert.equal( Global.parseTimeUnit( '\"1:00:01.5\"', 10 ), 3601 );\n\t\tassert.equal( Global.parseTimeUnit( '1:1.5', 10 ), 3660 );\n\n\t\t//Hybrid mode.\n\t\tassert.equal( Global.parseTimeUnit( '1.000', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1.00', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1', 10 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '-1', 10 ), -3600 );\n\t\tassert.equal( Global.parseTimeUnit( '01', 10 ), 3600 );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.25', 10 ), 900 );\n\t\tassert.equal( Global.parseTimeUnit( '0.50', 10 ), 1800 );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.34', 10 ), 1200 ); //Automatically rounds to nearest 1min\n\t} );\n\n\tQUnit.test( 'Global.js parseTimeUnit Hours', function( assert ) {\n\t\tassert.equal( Global.parseTimeUnit( '1000.0000', 20 ), 3600000 );\n\t\tassert.equal( Global.parseTimeUnit( '1,000.0000', 20 ), 3600000 );\n\t\tassert.equal( Global.parseTimeUnit( '1 000.0000', 20 ), 3600000 );\n\t\tassert.equal( Global.parseTimeUnit( '-1,000.0000', 20 ), -3600000 );\n\t\tassert.equal( Global.parseTimeUnit( ' \"-1, 000.0000\" ', 20 ), -3600000 );\n\t\tassert.equal( Global.parseTimeUnit( '1.000', 20 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1.00', 20 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '1', 20 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( '-1', 20 ), -3600 );\n\t\tassert.equal( Global.parseTimeUnit( '01', 20 ), 3600 );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.25', 20 ), 900 );\n\t\tassert.equal( Global.parseTimeUnit( '0.50', 20 ), 1800 );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.34', 20 ), 1200 ); //Automatically rounds to nearest 1min\n\n\t\t//Hybrid mode\n\t\tassert.equal( Global.parseTimeUnit( '00:01', 20 ), 60 );\n\t\tassert.equal( Global.parseTimeUnit( '-00:01', 20 ), -60 );\n\n\t\tassert.equal( Global.parseTimeUnit( ':60', 20 ), 3600 );\n\t\tassert.equal( Global.parseTimeUnit( ':1', 20 ), 60 );\n\n\t\tassert.equal( Global.parseTimeUnit( '1:00:01.5', 20 ), 3600 ); //These don't match PHP due to how\n\t\tassert.equal( Global.parseTimeUnit( '1:1.5', 20 ), 3660 );\n\n\t} );\n\n\tQUnit.test( 'Global.js parseTimeUnit Hours Rounding', function( assert ) {\n\t\tassert.equal( Global.parseTimeUnit( '0.02', 20 ), ( 1 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.03', 20 ), ( 2 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.05', 20 ), ( 3 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.06', 20 ), ( 4 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.08', 20 ), ( 5 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.10', 20 ), ( 6 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.12', 20 ), ( 7 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.13', 20 ), ( 8 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.15', 20 ), ( 9 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.17', 20 ), ( 10 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.18', 20 ), ( 11 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.20', 20 ), ( 12 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.22', 20 ), ( 13 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.23', 20 ), ( 14 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.25', 20 ), ( 15 * 60 ) );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.27', 20 ), ( 16 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.28', 20 ), ( 17 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.30', 20 ), ( 18 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.32', 20 ), ( 19 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.33', 20 ), ( 20 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.35', 20 ), ( 21 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.37', 20 ), ( 22 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.39', 20 ), ( 23 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.40', 20 ), ( 24 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.42', 20 ), ( 25 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.43', 20 ), ( 26 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.45', 20 ), ( 27 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.47', 20 ), ( 28 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.48', 20 ), ( 29 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.50', 20 ), ( 30 * 60 ) );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.52', 20 ), ( 31 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.53', 20 ), ( 32 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.55', 20 ), ( 33 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.57', 20 ), ( 34 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.58', 20 ), ( 35 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.60', 20 ), ( 36 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.62', 20 ), ( 37 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.63', 20 ), ( 38 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.65', 20 ), ( 39 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.67', 20 ), ( 40 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.68', 20 ), ( 41 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.70', 20 ), ( 42 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.72', 20 ), ( 43 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.73', 20 ), ( 44 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.75', 20 ), ( 45 * 60 ) );\n\n\t\tassert.equal( Global.parseTimeUnit( '0.77', 20 ), ( 46 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.78', 20 ), ( 47 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.80', 20 ), ( 48 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.82', 20 ), ( 49 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.84', 20 ), ( 50 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.85', 20 ), ( 51 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.87', 20 ), ( 52 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.89', 20 ), ( 53 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.90', 20 ), ( 54 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.92', 20 ), ( 55 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.94', 20 ), ( 56 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.95', 20 ), ( 57 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.97', 20 ), ( 58 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '0.99', 20 ), ( 59 * 60 ) );\n\t\tassert.equal( Global.parseTimeUnit( '1.00', 20 ), ( 60 * 60 ) );\n\t} );\n\n\tQUnit.test( 'Global.js getTimeUnit', function( assert ) {\n\t\tassert.equal( Global.getTimeUnit( 3600, 10 ), '01:00' );\n\t\tassert.equal( Global.getTimeUnit( 3660, 10 ), '01:01' );\n\t\tassert.equal( Global.getTimeUnit( 36060, 10 ), '10:01' );\n\t\tassert.equal( Global.getTimeUnit( 36660, 10 ), '10:11' );\n\t\tassert.equal( Global.getTimeUnit( 360660, 10 ), '100:11' );\n\t\tassert.equal( Global.getTimeUnit( 3600660, 10 ), '1000:11' );\n\t\tassert.equal( Global.getTimeUnit( 36000660, 10 ), '10000:11' );\n\t\tassert.equal( Global.getTimeUnit( 360000660, 10 ), '100000:11' );\n\t\tassert.equal( Global.getTimeUnit( 3600000660, 10 ), '1000000:11' );\n\n\t\tassert.equal( Global.getTimeUnit( -3600, 10 ), '-01:00' );\n\t\tassert.equal( Global.getTimeUnit( -3660, 10 ), '-01:01' );\n\t\tassert.equal( Global.getTimeUnit( -36060, 10 ), '-10:01' );\n\t\tassert.equal( Global.getTimeUnit( -36660, 10 ), '-10:11' );\n\t\tassert.equal( Global.getTimeUnit( -360660, 10 ), '-100:11' );\n\t\tassert.equal( Global.getTimeUnit( -3600660, 10 ), '-1000:11' );\n\t\tassert.equal( Global.getTimeUnit( -36000660, 10 ), '-10000:11' );\n\t\tassert.equal( Global.getTimeUnit( -360000660, 10 ), '-100000:11' );\n\t\tassert.equal( Global.getTimeUnit( -3600000660, 10 ), '-1000000:11' );\n\n\t\tassert.equal( Global.getTimeUnit( 3600, 12 ), '01:00:00' );\n\t\tassert.equal( Global.getTimeUnit( 3661, 12 ), '01:01:01' );\n\t\tassert.equal( Global.getTimeUnit( 36060, 12 ), '10:01:00' );\n\t\tassert.equal( Global.getTimeUnit( 36660, 12 ), '10:11:00' );\n\n\t\tassert.equal( Global.getTimeUnit( 3600, 23 ), '1.0000' );\n\t\tassert.equal( Global.getTimeUnit( 3660, 23 ), '1.0167' );\n\t\tassert.equal( Global.getTimeUnit( 3600660, 23 ), '1000.1833' );\n\n\t\tassert.equal( Global.getTimeUnit( 603, 99 ), '10:03' );\n\t\tassert.equal( Global.getTimeUnit( 3600, 99 ), '60:00' );\n\t} );\n\n\tQUnit.test( 'Global.js getDaysInSpan', function( assert ) {\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 7 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, true, true, true, true, true, true ), 6 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, true, true, true, true, true ), 5 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, true, true, true, true ), 4 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, true, true, true ), 3 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, false, true, true ), 2 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, false, false, true ), 1 );\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', false, false, false, false, false, false, false ), 0 );\n\n\t\tassert.equal( Global.getDaysInSpan( '01-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 7 );\n\t\tassert.equal( Global.getDaysInSpan( '02-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 6 );\n\t\tassert.equal( Global.getDaysInSpan( '03-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 5 );\n\t\tassert.equal( Global.getDaysInSpan( '04-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 4 );\n\t\tassert.equal( Global.getDaysInSpan( '05-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 3 );\n\t\tassert.equal( Global.getDaysInSpan( '06-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 2 );\n\t\tassert.equal( Global.getDaysInSpan( '07-May-2022', '07-May-2022', true, true, true, true, true, true, true ), 1 );\n\t} );\n\n\tQUnit.module( 'UUID Generation' );\n\tvar uuids = [];\n\tQUnit.test( 'UUID TIGHTLOOP (default logged in user seed)', function( assert ) {\n\t\tvar max = 3000;\n\t\tfor ( var i = 0; i < max; i++ ) {\n\t\t\tuuids.push( TTUUID.generateUUID() );\n\t\t}\n\t\tassert.ok( hasDuplicates( uuids, assert ) == false, 'Duplicate UUIDs!' );\n\t\tfor ( var i = 0; i < max; i++ ) {\n\t\t\tassert.ok( TTUUID.isUUID( uuids[i] ), 'is UUID' );\n\t\t}\n\t} );\n\n\tuuids = [];\n\tQUnit.test( 'UUID TIGHTLOOP (random seed)', function( assert ) {\n\t\tvar user_id = LocalCacheData.loginUser.id;\n\t\tLocalCacheData.loginUser.id = null;\n\t\tvar max = 3000;\n\t\tfor ( var i = 0; i < max; i++ ) {\n\t\t\tuuids.push( TTUUID.generateUUID() );\n\t\t}\n\t\tassert.ok( hasDuplicates( uuids, assert ) == false, 'Duplicate UUIDs!' );\n\t\tfor ( var i = 0; i < max; i++ ) {\n\t\t\tassert.ok( TTUUID.isUUID( uuids[i] ), 'is UUID' );\n\t\t}\n\t\tLocalCacheData.loginUser.id = user_id;\n\t} );\n\n\tQUnit.test( 'Global.isNumeric()', function( assert ) {\n\t\tassert.ok( Global.isNumeric( 1483228800 ) == true, '1483228800 is an epoch and numeric' );\n\t\tassert.ok( Global.isNumeric( '1483228800' ) == true, '1483228800 is an epoch and a numeric string' );\n\n\t\t//assert.ok( Global.isNumeric(\"1,483,228,800\") == false , '1,483,228,800 has commas and so is not numeric'); //does not handle commas\n\n\t\tassert.ok( Global.isNumeric( 2.1234 ) == true, '2.1234 is a float and numeric' );\n\t\tassert.ok( Global.isNumeric( -2.1234 ) == true, '-2.1234 is a negative float and numeric' );\n\t\tassert.ok( Global.isNumeric( '2.1234' ) == true, '\"2.1234\" is numeric string' );\n\t\tassert.ok( Global.isNumeric( -3 ) == true, '-3 is numeric' );\n\t\tassert.ok( Global.isNumeric( 0 ) == true, '0 is numeric' );\n\t\tassert.ok( Global.isNumeric( 1 ) == true, '1 is numeric' );\n\t\tassert.ok( Global.isNumeric( '1' ) == true, '\"1\" is a numeric string' );\n\t\tassert.ok( Global.isNumeric( 'asdf' ) == false, '\"asdf\" is not numeric' );\n\t\tassert.ok( Global.isNumeric( '' ) == false, '\"\" is not numeric' );\n\t} );\n\n\t/**\n\t *\n\t * ASYNCHRONOUS TESTS GO AT THE BOTTOM\n\t *\n\t */\n\n\tQUnit.module( 'TTPromise.js' );\n\tQUnit.test( 'TTPromise Case 1: wait(category) on a single promise', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'test', 'test1' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tTTPromise.wait( 'test', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( 1 == '1', 'TEST Promise test resolved.' );\n\t\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'undefined', 'promises[test] is null.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 0, 'filterPromiseArray(test).length == 0.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray(\"test\",\"test1\") length = 0.' );\n\t\t\tdone();\n\t\t} );\n\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 1.' );\n\t\tTTPromise.resolve( 'test', 'test1' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 1b: wait(category) on a single promise with reject', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'test', 'test1' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tTTPromise.wait( 'test', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( 0 == '1', 'TEST Promise test resolved.' ); //THIS SHOULD NOT BE CALLED.\n\t\t\tdone();\n\t\t}, function() {\n\t\t\t//will be run on reject()\n\t\t\tassert.ok( 1 == '1', 'TEST Promise test rejected.' );\n\t\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'undefined', 'promises[test] is null.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 0, 'filterPromiseArray(test).length == 0.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray(\"test\",\"test1\") length = 0.' );\n\t\t\tdone();\n\t\t} );\n\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 1.' );\n\t\tTTPromise.reject( 'test', 'test1' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 1c: wait(category) two promises with two rejects on category', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'test', 'test1' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tTTPromise.add( 'test', 'test2' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 2, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 2, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tremaining_reject_promises = 0;\n\t\tTTPromise.wait( 'test', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( 0 == '1', 'TEST Promise test resolved.' ); //Fail the test if this is called, since there is a reject.\n\t\t\tdone();\n\t\t}, function() {\n\t\t\t//will be run on reject()\n\t\t\tassert.ok( 1 == '1', 'TEST Promise test rejected.' );\n\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'filterPromiseArray(test).length == 1.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray(\"test\",\"test1\") length = 0.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test2' ).length == 1, 'filterPromiseArray(\"test\",\"test2\") length = 0.' );\n\n\t\t\tassert.ok( remaining_reject_promises == 0, 'Make sure error callback is not called more than once.' );\n\n\t\t\tremaining_reject_promises++;\n\n\t\t\tdone(); //Only finish once all promises are rejected.\n\t\t} );\n\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 2.' );\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test2'] ) == 'object', 'promises object length = 2.' );\n\t\tTTPromise.reject( 'test', 'test1' );\n\t\tTTPromise.reject( 'test', 'test2' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 1d: wait(category) two promises with one reject one resolve on category', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'test', 'test1' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tTTPromise.add( 'test', 'test2' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 2, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 2, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tremaining_reject_promises = 0;\n\t\tTTPromise.wait( 'test', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( 0 == '1', 'TEST Promise test resolved.' ); //Fail the test if this is called, since there is a reject.\n\t\t\tdone();\n\t\t}, function() {\n\t\t\t//will be run on reject()\n\t\t\tassert.ok( 1 == '1', 'TEST Promise test rejected.' );\n\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'filterPromiseArray(test).length == 1.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ) == false, 'filterPromiseArray(\"test\",\"test1\") length = 0.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test2' ).length == 1, 'filterPromiseArray(\"test\",\"test2\") length = 0.' );\n\n\t\t\tassert.ok( remaining_reject_promises == 0, 'Make sure error callback is not called more than once.' );\n\n\t\t\tremaining_reject_promises++;\n\n\t\t\tdone(); //Only finish once all promises are rejected.\n\t\t} );\n\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 2.' );\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test2'] ) == 'object', 'promises object length = 2.' );\n\t\tTTPromise.reject( 'test', 'test1' );\n\t\tTTPromise.resolve( 'test', 'test2' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 1e: wait(category) two promises with one resolve and one reject on category', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'test', 'test1' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tTTPromise.add( 'test', 'test2' );\n\t\tassert.ok( typeof ( TTPromise.promises['test'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['test'] ).length == 2, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 2, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tremaining_reject_promises = 0;\n\t\tTTPromise.wait( 'test', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( 0 == '1', 'TEST Promise test resolved.' ); //Fail the test if this is called, since there is a reject.\n\t\t\tdone();\n\t\t}, function() {\n\t\t\t//will be run on reject()\n\t\t\tassert.ok( 1 == '1', 'TEST Promise test rejected.' );\n\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test' ).length == 1, 'filterPromiseArray(test).length == 1.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test1' ).length == 1, 'filterPromiseArray(\"test\",\"test1\") length = 0.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'test', 'test2' ) == false, 'filterPromiseArray(\"test\",\"test2\") length = 0.' );\n\n\t\t\tassert.ok( remaining_reject_promises == 0, 'Make sure error callback is not called more than once.' );\n\n\t\t\tremaining_reject_promises++;\n\n\t\t\tdone(); //Only finish once all promises are rejected.\n\t\t} );\n\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test1'] ) == 'object', 'promises object length = 2.' );\n\t\tassert.ok( typeof ( TTPromise.promises['test']['test2'] ) == 'object', 'promises object length = 2.' );\n\t\tTTPromise.resolve( 'test', 'test1' );\n\t\tTTPromise.reject( 'test', 'test2' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 2: wait(\\'one_of_many_categories\\').', function( assert ) {\n\t\tvar done = assert.async();\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj empty.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'testa', 'test1' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testa' ).length == 1, 'filterPromiseArray(testa).length == 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testa', 'test1' ).length == 1, 'filterPromiseArray(\"testa\",\"test1\") length = 1.' );\n\n\t\tTTPromise.add( 'testa', 'test2' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testa' ).length == 2, 'filterPromiseArray(testa).length == 2.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testa', 'test2' ).length == 1, 'filterPromiseArray(\"testa\",\"test1\") length = 1.' );\n\n\t\tTTPromise.add( 'testb', 'test1b' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testb' ).length == 1, 'filterPromiseArray(testb).length == 1' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testb', 'test1b' ).length == 1, 'filterPromiseArray(\"testb\",\"test1b\") length = 1.' );\n\n\t\tTTPromise.add( 'testb', 'test2b' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testb' ).length == 2, 'filterPromiseArray(testb).length == 2.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testb', 'test1b' ).length == 1, 'filterPromiseArray(\"testb\",\"test1b\") length = 1.' );\n\n\t\tTTPromise.wait( 'testa', null, function() {\n\t\t\t//Debug.Arr(TTPromise,'Case2 TTPromise',null,null,null,10);\n\t\t\tassert.ok( 1 == '1', 'TEST Promise testa resolved.' );\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( typeof ( TTPromise.promises['testa'] ) == 'undefined', 'promises[testa] is null.' );\n\t\t\tassert.ok( typeof ( TTPromise.promises['testb'] ) == 'object', 'promises[testb] is not null.' );\n\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'testb' ).length == 2, 'filterPromiseArray(testb).length == 1' ); //one is resolved. should return only 1\n\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'testa', 'test1' ).length == 0, 'filterPromiseArray(\"testb\",\"test1b\") length = ' + TTPromise.filterPromiseArray( 'testa', 'test1' ).length );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'testa', 'test2' ).length == 0, 'filterPromiseArray(\"testb\",\"test1b\") length = ' + TTPromise.filterPromiseArray( 'testa', 'test2' ).length );\n\t\t\tdone();\n\t\t} );\n\n\t\tTTPromise.resolve( 'testb', 'test1b' );\n\t\tTTPromise.resolve( 'testa', 'test1' );\n\t\tTTPromise.resolve( 'testa', 'test2' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 3: wait(null, null, callback) all cateogries.', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj empty.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'testc', 'test1' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testc', 'test1' ).length == 1, 'TTPromise.filterPromiseArray(testc,test1).length == 1,.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 1, 'TTPromise.filterPromiseArray(testc).length == 1,.' );\n\n\t\tTTPromise.add( 'testc', 'test2' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testc', 'test2' ).length == 1, 'TTPromise.filterPromiseArray(testc,test1).length == 1,.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 2, 'TTPromise.filterPromiseArray(testc).length == 2,.' );\n\n\t\tTTPromise.add( 'testd', 'test1b' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testd', 'test1b' ).length == 1, 'TTPromise.filterPromiseArray(testd,test1b).length == 1,.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 2, 'TTPromise.filterPromiseArray(testc).length == 2,.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testd' ).length == 1, 'TTPromise.filterPromiseArray(testd).length == 1,.' );\n\n\t\tTTPromise.add( 'testd', 'test2b' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testd', 'test2b' ).length == 1, 'TTPromise.filterPromiseArray(testd,test2b).length == 1,.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 2, 'TTPromise.filterPromiseArray(testc).length == 2,.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'testd' ).length == 2, 'TTPromise.filterPromiseArray(testd).length == 2,.' );\n\n\t\tTTPromise.wait( null, null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( typeof ( TTPromise.promises['testc'] ) == 'undefined', 'promises[testc] is null.' );\n\t\t\tassert.ok( typeof ( TTPromise.promises['testd'] ) == 'undefined', 'promises[testd] is null.' );\n\t\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'testc' ).length == 0, 'TTPromise.filterPromiseArray(testc).length == 0,.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'testd' ).length == 0, 'TTPromise.filterPromiseArray(testd).length == 0,.' );\n\t\t\tdone();\n\t\t} );\n\n\t\tassert.ok( TTPromise.filterPromiseArray().length == 4, 'TTPromise.filterPromiseArray().length == 4' );\n\n\t\tTTPromise.resolve( 'testd', 'test1b' );\n\t\tTTPromise.resolve( 'testd', 'test2b' );\n\t\tTTPromise.resolve( 'testc', 'test1' );\n\t\tTTPromise.resolve( 'testc', 'test2' );\n\n\t} );\n\n\tQUnit.test( 'TTPromise Case 4: wait(category, key) on a single promise', function( assert ) {\n\t\tvar done = assert.async();\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'Reports', 'LoadReports' );\n\t\tassert.ok( typeof ( TTPromise.promises['Reports'] ) == 'object', 'TTPromise.promises[\\'test\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['Reports'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'Reports' ).length == 1, 'TTPromise.filterPromiseArray(test).length == 1' );\n\n\t\tTTPromise.wait( 'Reports', 'LoadReports', function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( 1 == '1', 'TEST Promise test resolved.' );\n\t\t\tassert.ok( typeof ( TTPromise.promises['Reports'] ) == 'undefined', 'promises[Reports] is null.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'Reports' ).length == 0, 'filterPromiseArray(Reports).length == 0.' );\n\t\t\tassert.ok( TTPromise.filterPromiseArray( 'Reports', 'LoadReports' ) == false, 'filterPromiseArray(\"Reports\",\"LoadReports\") length = 0.' );\n\t\t\tdone();\n\t\t} );\n\n\t\tassert.ok( typeof ( TTPromise.promises['Reports']['LoadReports'] ) == 'object', 'promises object length = 1.' );\n\t\tTTPromise.resolve( 'Reports', 'LoadReports' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 5: wait(category, key,function) vs wait(null,null,function)', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'groupone', 'one' );\n\t\tassert.ok( typeof ( TTPromise.promises['groupone'] ) == 'object', 'TTPromise.promises[\\'groupone\\'] exists.' );\n\t\tassert.ok( Object.keys( TTPromise.promises['groupone'] ).length == 1, 'promises object length = 1.' );\n\t\tassert.ok( TTPromise.filterPromiseArray( 'groupone' ).length == 1, 'TTPromise.filterPromiseArray(groupone).length == 1' );\n\n\t\tTTPromise.wait( 'groupone', 'one', function() {\n\t\t\t//will be run on resolve()\n\t\t\tDebug.Text( 'SINGLE PROMISE test resolved second.', '', '', '', 10 );\n\t\t\tassert.ok( group_promise_test == '1', 'SINGLE PROMISE test resolved second.' );\n\t\t\tgroup_promise_test = 2;\n\t\t\tdone();\n\t\t} );\n\n\t\tTTPromise.add( 'grouptwo', 'one' );\n\t\tTTPromise.add( 'grouptwo', 'two' );\n\t\tTTPromise.add( 'grouptwo', 'three' );\n\t\tTTPromise.wait( null, null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( group_promise_test == '0', 'ALL PROMISE test resolved first.' );\n\t\t\tgroup_promise_test = 1;\n\t\t\tDebug.Text( 'ALL PROMISE test resolved first.', '', '', '', 10 );\n\t\t} );\n\n\t\tTTPromise.resolve( 'grouptwo', 'one' );\n\t\tTTPromise.resolve( 'grouptwo', 'two' );\n\t\tTTPromise.resolve( 'groupone', 'one' );\n\t\tTTPromise.resolve( 'grouptwo', 'three' );\n\n\t\tTTPromise.resolve( 'Reports', 'LoadReports' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 6: resolve 2, wait on 1, global wait.', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'a', 'a' );\n\t\tTTPromise.add( 'a', 'b' );\n\t\tTTPromise.add( 'a', 'c' );\n\n\t\tTTPromise.resolve( 'a', 'a' );\n\t\tTTPromise.resolve( 'a', 'b' );\n\t\tTTPromise.resolve( 'a', 'c' );\n\n\t\tTTPromise.add( 'b', 'a' );\n\t\tTTPromise.add( 'b', 'b' );\n\n\t\tvar callbacks = 1;\n\t\tTTPromise.wait( 'a', 'a', function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 1, 'already resolved promise resolved first.' );\n\t\t\tcallbacks++;\n\t\t} );\n\n\t\tTTPromise.wait( null, null, function() {\n\n\t\t\tassert.ok( callbacks == 2, 'null wait resolves after first resolution' );\n\t\t\tcallbacks++;\n\t\t\tdone();\n\t\t} );\n\n\t\tTTPromise.resolve( 'b', 'a' );\n\t\tTTPromise.resolve( 'b', 'b' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 7: resolve already resolved stack when other promises exist.', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'a', 'a' );\n\t\tTTPromise.add( 'a', 'b' );\n\t\tTTPromise.add( 'a', 'c' );\n\n\t\tTTPromise.resolve( 'a', 'a' );\n\t\tTTPromise.resolve( 'a', 'b' );\n\t\tTTPromise.resolve( 'a', 'c' );\n\n\t\tTTPromise.add( 'b', 'a' );\n\t\tTTPromise.add( 'b', 'b' );\n\n\t\tvar callbacks = 1;\n\t\tTTPromise.wait( 'a', 'a', function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 1, 'already resolved promise resolved before resolving unrelated pending promises.' );\n\t\t\tdone();\n\t\t} );\n\t\tcallbacks = 2;\n\t\tTTPromise.resolve( 'b', 'a' );\n\t\tTTPromise.resolve( 'b', 'b' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 8: resolve already resolved when other promises exist.', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'a', 'a' );\n\t\tTTPromise.add( 'a', 'b' );\n\t\tTTPromise.add( 'a', 'c' );\n\n\t\tTTPromise.resolve( 'a', 'a' );\n\t\tTTPromise.resolve( 'a', 'b' );\n\t\tTTPromise.resolve( 'a', 'c' );\n\n\t\tTTPromise.add( 'b', 'a' );\n\t\tTTPromise.add( 'b', 'b' );\n\n\t\tvar callbacks = 1;\n\t\tTTPromise.wait( 'a', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 1, 'already resolved promise stack resolved before resolving unrelated pending promises.' );\n\t\t\tdone();\n\t\t} );\n\t\tcallbacks = 2;\n\t\tTTPromise.resolve( 'b', 'a' );\n\t\tTTPromise.resolve( 'b', 'b' );\n\t} );\n\n\tQUnit.test( 'TTPromise Case 9: 3 parallel stacks only 1 and 3 resolve..', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'a', 'a' );\n\t\tTTPromise.add( 'a', 'b' );\n\t\tTTPromise.add( 'a', 'c' );\n\n\t\tTTPromise.add( 'b', 'a' );\n\t\tTTPromise.add( 'b', 'b' );\n\t\tTTPromise.add( 'b', 'c' );\n\n\t\tTTPromise.add( 'c', 'a' );\n\t\tTTPromise.add( 'c', 'b' );\n\t\tTTPromise.add( 'c', 'c' );\n\n\t\tTTPromise.resolve( 'a', 'a' );\n\t\tTTPromise.resolve( 'a', 'b' );\n\t\tTTPromise.resolve( 'a', 'c' );\n\n\t\tvar callbacks = 1;\n\t\tTTPromise.wait( 'a', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 1, 'already resolved promise resolved before resolving unrelated pending promises.' );\n\t\t\tcallbacks++;\n\t\t} );\n\n\t\tTTPromise.wait( 'b', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 999, 'should NEVER reolve.' );\n\t\t\tcallbacks++;\n\t\t} );\n\t\tTTPromise.wait( 'c', null, function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 2, 'already resolved promise resolved before resolving unrelated pending promises.' );\n\t\t\tcallbacks++;\n\t\t\tdone();\n\t\t} );\n\n\t\tTTPromise.resolve( 'a', 'a' );\n\t\tTTPromise.resolve( 'a', 'b' );\n\t\t//TTPromise.resolve('a','c'); //do not fully resolve b\n\n\t\tTTPromise.resolve( 'c', 'a' );\n\t\tTTPromise.resolve( 'c', 'b' );\n\t\tTTPromise.resolve( 'c', 'c' );\n\n\t} );\n\n\tQUnit.test( 'TTPromise Case 10: identical waits fail..', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'a', 'a' );\n\n\t\tvar callbacks = 1;\n\t\tTTPromise.wait( 'a', 'a', function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 1, 'first resolution.' );\n\t\t\tcallbacks++;\n\t\t} );\n\n\t\tTTPromise.wait( 'a', 'a', function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 2, 'does not resolve in error case.' );\n\t\t\tcallbacks++;\n\t\t} );\n\n\t\twindow.setTimeout( function() {\n\t\t\tassert.ok( callbacks == 3, 'should complete after both callbacks.' );\n\t\t\tdone();\n\t\t}, 4000 );\n\n\t\twindow.setTimeout( function() {\n\t\t\tTTPromise.resolve( 'a', 'a' );\n\t\t}, 2000 );\n\n\t} );\n\n\tQUnit.test( 'TTPromise Case 11: identical waits fail after resolution of first.', function( assert ) {\n\t\tvar done = assert.async();\n\t\tvar group_promise_test = 0;\n\n\t\tTTPromise.clearAllPromises();\n\n\t\tassert.ok( Object.keys( TTPromise.promises ).length == 0, 'Callback: promises obj length = 0.' );\n\t\tassert.ok( typeof ( TTPromise.promises ) == 'object', 'TTPromise.promises exists.' );\n\n\t\tTTPromise.add( 'a', 'a' );\n\n\t\tvar callbacks = 1;\n\t\tTTPromise.wait( 'a', 'a', function() {\n\t\t\t//will be run on resolve()\n\t\t\tassert.ok( callbacks == 1, 'first resolution.' );\n\t\t\tcallbacks++;\n\t\t} );\n\n\t\tTTPromise.resolve( 'a', 'a' );\n\n\t\twindow.setTimeout( function() {\n\t\t\tTTPromise.wait( 'a', 'a', function() {\n\t\t\t\t//will be run on resolve()\n\t\t\t\tassert.ok( callbacks == 2, 'does not resolve in error case: callbacks: ' + callbacks );\n\t\t\t\tcallbacks++;\n\t\t\t} );\n\n\t\t\twindow.setTimeout( function() {\n\t\t\t\tassert.ok( callbacks == 3, 'should complete after both callbacks.' );\n\t\t\t\tdone();\n\t\t\t}, 8000 );\n\n\t\t\twindow.setTimeout( function() {\n\t\t\t\tTTPromise.resolve( 'a', 'a' );\n\t\t\t}, 5000 );\n\t\t}, 2000 );\n\n\t} );\n}\n\nfunction hasDuplicates( array, assert ) {\n\tvar valuesSoFar = Object.create( null );\n\tfor ( var i = 0; i < array.length; ++i ) {\n\t\tvar value = array[i];\n\t\tif ( value in valuesSoFar ) {\n\t\t\tassert.ok( 1 == 2, value + ' Is not unique.' );\n\t\t\treturn true;\n\t\t}\n\t\tvaluesSoFar[value] = true;\n\t}\n\treturn false;\n}\n\nfunction output_system_data( val ) {\n\tswitch ( val ) {\n\t\tcase '0':\n\t\t\tif ( LocalCacheData.current_open_primary_controller ) {\n\t\t\t\tconsole.log( LocalCacheData.current_open_primary_controller.current_edit_record );\n\t\t\t} else {\n\t\t\t\tDebug.Text( 'Primary current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\\'change\\', \\'#tt_output_variable_select\\')', 10 );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '1':\n\t\t\tif ( LocalCacheData.current_open_report_controller ) {\n\t\t\t\tconsole.log( LocalCacheData.current_open_report_controller.current_edit_record );\n\t\t\t} else {\n\t\t\t\tDebug.Text( 'Report current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\\'change\\', \\'#tt_output_variable_select\\')', 10 );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '2':\n\t\t\tif ( LocalCacheData.current_open_sub_controller ) {\n\t\t\t\tconsole.log( LocalCacheData.current_open_sub_controller.current_edit_record );\n\t\t\t} else {\n\t\t\t\tDebug.Text( 'Sub Controller current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\\'change\\', \\'#tt_output_variable_select\\')', 10 );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '3':\n\t\t\tif ( LocalCacheData.current_open_edit_only_controller ) {\n\t\t\t\tconsole.log( LocalCacheData.current_open_edit_only_controller.current_edit_record );\n\t\t\t} else {\n\t\t\t\tDebug.Text( 'Edit Only current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\\'change\\', \\'#tt_output_variable_select\\')', 10 );\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '4':\n\t\t\tif ( LocalCacheData.current_open_wizard_controllers.length > 0 ) {\n\t\t\t\tfor ( let i = 0; i < LocalCacheData.current_open_wizard_controllers.length; i++ ) {\n\t\t\t\t\tif ( LocalCacheData.current_open_wizard_controllers[i].current_edit_record ) {\n\t\t\t\t\t\tconsole.log( LocalCacheData.current_open_wizard_controllers[i].current_edit_record );\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tDebug.Text( 'Wizard current_edit_record does not exist.', 'debugPanelController.js', '', '$(document).on(\\'change\\', \\'#tt_output_variable_select\\')', 10 );\n\t\t\t}\n\t\t\tbreak;\n\t}\n}\n\nwindow.debug_panel_html = `\n\t\t<div id='tt_debug_console' style='width:300pt; background-color:#ffffff; border:1px solid #000000; padding:2em; position:absolute; bottom:0px; right:0px; z-index:1000; border-radius-top-left:10px; border-radius-top-right:10px;'>\n\t\t<a style='float:right; padding:10px; text-align:center; color:red; font-weight:bolder; height:10px; width:10px;' class='tt_debug_close_btn' href='#'>x</a>\n\t\t<h3>Developer Tools (<span>v</span><span class='tt_version'></span>)</h3>\n\t\t<hr>\n\t\t<div class='row' id='enabled_row' style='\"+rowstyle+\"'>\n\t\t\t<input type='checkbox' id='tt_debug_enable_checkbox' checked='\"+ is_enabled +\"'>&nbsp;Enable Console Logging\n\t\t</div>\n\t\t<hr>\n\t\t<div class='row' id='set_verbosity_row' style='\"+rowstyle+\"'>\n\t\t\t<span>Debug Verbosity\n\t\t\t\t<select id=\"tt_debug_exception_verbosity\">\n\t\t\t\t\t<option value=\"0\">0</option>\n\t\t\t\t\t<option value=\"1\">1</option>\n\t\t\t\t\t<option value=\"2\">2</option>\n\t\t\t\t\t<option value=\"3\">3</option>\n\t\t\t\t\t<option value=\"4\">4</option>\n\t\t\t\t\t<option value=\"5\">5</option>\n\t\t\t\t\t<option value=\"6\">6</option>\n\t\t\t\t\t<option value=\"7\">7</option>\n\t\t\t\t\t<option value=\"8\">8</option>\n\t\t\t\t\t<option value=\"9\">9</option>\n\t\t\t\t\t<option value=\"10\">10</option>\n\t\t\t\t\t<option value=\"11\">11</option>\n\t\t\t\t</select>\n\t\t\t</span>\n\t\t</div>\n\t\t<hr>\n\t\t<div class='row' id='trigger_js_exception_row' style='\"+rowstyle+\"'>\n\t\t\t<span>Javascript Errors\n\t\t\t\t<select id=\"tt_debug_exception_type_select\">\n\t\t\t\t\t<option value=\"js_error\">JavaScript Error</option>\n\t\t\t\t\t<option value=\"js_load_script_parser_error\">Script Load Parser Error</option>\n\t\t\t\t\t<option value=\"js_load_script_404_error\">Script Load 404</option>\n\t\t\t\t</select>\n\t\t\t</span>\n\t\t\t<span>\n\t\t\t\t<div class='t-button' id='trigger_js_exception_button'>Trigger</div>\n\t\t\t</span>\n\t\t</div>\n\t\t<hr>\n\t\n\t\t<div class='row' id='trigger_login_timeout_row' style='\"+rowstyle+\"'>\n\t\t\t<p>Note: To trigger idle, must also clear the session at the db</p>\n\t\t\t<div class='t-button' id='trigger_js_timeout_button'>Trigger Idle</div>\n\t\t</div>\n\t\t<hr>\n\t\t<div class='row' id='tt_overlay_disable_row' style='\"+rowstyle+\"'>\n\t\t\t<input type='checkbox' id='tt_overlay_disable_checkbox' checked='\"+ overlay_is_enabled +\"'> Enable Unit Testing Mode\n\t\t</div>\n\t\t<b>Unit Testing</b>\n\t\t<div class='row' id='qunit_row' style='\"+rowstyle+\"'>\n\t\t\t<div class='t-button' id='qunit_test_button'>Run Unit Tests</div>\n\t\t\t<div class='t-button' id='grid_test'>Run Grid Tests</div>\n\t\t\t<div class='t-button' id='awesomebox_test'>Run Awesomebox Tests</div>\n\t\t\t<div class='t-button' id='WidgetTest_test'>Run Widget Tests</div>\n\t\t</div>\n\t\t<hr>\n\t\t<div class='row' id='output_variable_select_row' style='\"+rowstyle+\"'>\n\t\t\t<span>Show Data:\n\t\t\t\t<select id=\"tt_output_variable_select\">\n\t\t\t\t\t<option value=\"-1\">-- Select one --</option>\n\t\t\t\t\t<option value=\"0\">Primary controller->current_edit_record</option>\n\t\t\t\t\t<option value=\"1\">Report controller->current_edit_record</option>\n\t\t\t\t\t<option value=\"2\">Sub controller->current_edit_record</option>\n\t\t\t\t\t<option value=\"3\">Edit Only controller->current_edit_record</option>\n\t\t\t\t\t<option value=\"4\">Wizard controller->current_edit_record</option>\n\t\t\t\t</select>\n\t\t\t</span>\n\t\t\t<span>\n\t\t\t\t<div class='t-button' id='trigger_output_variable_select'>Show</div>\n\t\t\t</span>\n\t\t</div>\n\t\t<hr>\n\t\t<div class=\"row\">\n\t\t\t<h3>breakOn() is active </h3>\n\t\t\t<p>usage: breakOn(myObject, 'myProperty');</p>\n\t\t</div>\n\t\t\x3c!-- keep order --\x3e\n\t\t<hr>\n\t\t<div class='row' id='execute_script_row' style='\"+rowstyle+\"'>\n\t\t\t<b>Script Executor</b>\n\t\t\t<textarea id='arbitrary_script' style=\"width:100%;\" rows=\"5\"></textarea>\n\t\t\t<div class='t-button' id='trigger_arbitrary_script'>Run Js</div>\n\t\t</div>\n\t\t<hr>\n\t\t<div class='row' style='\"+rowstyle+\"'>\n\t\t\t<div class='t-button' id='load_vue_test_button'>Load Vue Test View</div>\n\t\t</div>\n\t</div>\n\t<div id=\"qunit_container\" style=\"display:none;\">\n\t\t<div id=\"qunit\"></div>\n\t\t<div id=\"qunit-fixture\"></div>\n\t</div>\n\t`;\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODAzOC5qcyIsIm1hcHBpbmdzIjoiO0FBQUEsQ0FBQztBQUNEO0FBQ0E7QUFDQSxFQUFFOztBQUVGLENBQUM7QUFDRDtBQUNBLGtCQUFrQixDQUFDO0FBQ25CLEVBQUU7O0FBRUYsQ0FBQztBQUNEO0FBQ0Esc0JBQXNCLENBQUM7O0FBRXZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBLEVBQUU7O0FBRUYsQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLEVBQUU7O0FBRUYsQ0FBQztBQUNEO0FBQ0EscUJBQXFCLENBQUM7QUFDdEIsRUFBRTs7QUFFRixDQUFDO0FBQ0Q7QUFDQSx5QkFBeUIsQ0FBQztBQUMxQjtBQUNBLEVBQUU7O0FBRUYsQ0FBQztBQUNEO0FBQ0EsQ0FBQyxDQUFDO0FBQ0YsQ0FBQyxDQUFDO0FBQ0Y7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTs7QUFFQSxDQUFDO0FBQ0Q7QUFDQSxxQkFBcUIsQ0FBQztBQUN0QixFQUFFOztBQUVGLENBQUM7QUFDRDtBQUNBLHFCQUFxQixDQUFDO0FBQ3RCLEVBQUU7O0FBRUYsQ0FBQztBQUNEO0FBQ0EsY0FBYyxDQUFDO0FBQ2Ysa0RBQWtEO0FBQ2xEO0FBQ0EsRUFBRTs7QUFFRjtBQUNBLENBQUM7QUFDRDtBQUNBO0FBQ0EsRUFBRTs7OztBQUlGLENBQUM7QUFDRDtBQUNBO0FBQ0EsRUFBRTs7QUFFRixDQUFDO0FBQ0Q7QUFDQTtBQUNBLEVBQUU7O0FBRUYsQ0FBQztBQUNEO0FBQ0E7QUFDQSxFQUFFOztBQUVGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHFCQUFxQjs7QUFFckI7QUFDQSw4QkFBOEI7QUFDOUI7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxHQUFHLHVDQUF1QztBQUMxQztBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsTUFBTSxDQUFDO0FBQ1AsRUFBRSxDQUFDO0FBQ0gsRUFBRSxDQUFDO0FBQ0g7QUFDQSxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7QUFDSCxFQUFFLENBQUM7O0FBRUgsRUFBRSxDQUFDO0FBQ0g7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CO0FBQ25COztBQUVBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSw0REFBNEQ7QUFDNUQsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUEsNERBQTREOztBQUU1RDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQSxpRUFBaUU7QUFDakU7O0FBRUEsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBO0FBQ0EsbUJBQW1CLFNBQVM7QUFDNUI7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBLGdIQUFnSDs7QUFFaEg7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQSxHQUFHO0FBQ0g7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSx5REFBeUQ7QUFDekQ7QUFDQSxHQUFHO0FBQ0g7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUEsV0FBVztBQUNYLElBQUk7O0FBRUo7QUFDQTtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBLHlEQUF5RDtBQUN6RDtBQUNBLEdBQUc7QUFDSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxXQUFXO0FBQ1gsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseURBQXlEO0FBQ3pEO0FBQ0EsR0FBRztBQUNIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBLFdBQVc7QUFDWCxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLDhHQUE4Rzs7QUFFOUc7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsR0FBRzs7QUFFSDtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsR0FBRzs7QUFFSDtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7QUFDSjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBLEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTtBQUNKO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQSxnQ0FBZ0M7O0FBRWhDO0FBQ0E7QUFDQTs7QUFFQSxHQUFHOztBQUVIO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQSxHQUFHOztBQUVIO0FBQ0E7QUFDQSxHQUFHOztBQUVILEdBQUc7O0FBRUg7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQTtBQUNBO0FBQ0EsSUFBSTs7QUFFSjtBQUNBO0FBQ0EsSUFBSTtBQUNKLEdBQUc7O0FBRUgsR0FBRztBQUNIOztBQUVBO0FBQ0E7QUFDQSxrQkFBa0Isa0JBQWtCO0FBQ3BDO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxxQkFBcUIsMkRBQTJEO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQSxpREFBaUQsMEJBQTBCLDBCQUEwQixhQUFhLG1CQUFtQixZQUFZLFdBQVcsY0FBYyw2QkFBNkIsNkJBQTZCO0FBQ3BPLHlCQUF5QixjQUFjLG1CQUFtQixXQUFXLG9CQUFvQixhQUFhLFdBQVc7QUFDakg7QUFDQTtBQUNBO0FBQ0EseUZBQXlGO0FBQ3pGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZDQUE2QztBQUM3QztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EscURBQXFEO0FBQ3JEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsK0NBQStDO0FBQy9DO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL2RldmVsb3Blcl90b29scy9kZWJ1Z1BhbmVsQ29udHJvbGxlci5qcz81ODM5Il0sInNvdXJjZXNDb250ZW50IjpbIiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcudHRfZGVidWdfY2xvc2VfYnRuJywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0RGVidWcuY2xvc2VQYW5lbCgpO1xufSApO1xuXG4kKCBkb2N1bWVudCApLm9uKCAnY2hhbmdlJywgJyN0dF9kZWJ1Z19lbmFibGVfY2hlY2tib3gnLCBmdW5jdGlvbiggZSApIHtcblx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHREZWJ1Zy5zZXRFbmFibGUoICQoIHRoaXMgKS5pcyggJzpjaGVja2VkJyApICk7XG59ICk7XG5cbiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcjdHJpZ2dlcl9qc19leGNlcHRpb25fYnV0dG9uJywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0dmFyIGV4Y2VwdGlvbl90eXBlID0gJCggJyN0dF9kZWJ1Z19leGNlcHRpb25fdHlwZV9zZWxlY3QnICkudmFsKCk7XG5cblx0c3dpdGNoICggZXhjZXB0aW9uX3R5cGUgKSB7XG5cdFx0Y2FzZSAnanNfZXJyb3InOlxuXHRcdFx0bm9uX2V4aXN0YW50X3ZhcmlhYmxlLm5vbl9leGlzdGFudF9mdW5jdGlvbigpO1xuXHRcdFx0YnJlYWs7XG5cdFx0Y2FzZSAnanNfbG9hZF9zY3JpcHRfcGFyc2VyX2Vycm9yJzpcblx0XHRcdHZhciBzY3JpcHRfcGF0aCA9IEdsb2JhbC5nZXRWaWV3UGF0aEJ5Vmlld0lkKCAnRGV2ZWxvcGVyVG9vbHMnICkgKyAndHJpZ2dlclBhcnNlckVycm9yLmpzJztcblx0XHRcdC8vcmVtb3ZlIGZyb20gY2FjaGUgdG8gZW5zdXJlIHRoYXQgd2UncmUgc2VuZGluZyBhIHRvdGFsbHkgbmV3IHJlcXVlc3Rcblx0XHRcdGRlbGV0ZSBMb2NhbENhY2hlRGF0YS5sb2FkZWRTY3JpcHROYW1lc1tzY3JpcHRfcGF0aF07XG5cdFx0XHQvL2NoYW5nZSB0aGUganMgdmVyc2lvbiBudW1iZXIgdG8gdHJpZ2dlciBmb3JjZWQgcmVsb2FkXG5cdFx0XHRBUElHbG9iYWwucHJlX2xvZ2luX2RhdGEuYXBwbGljYXRpb25fYnVpbGQgKz0gJ19GT1JDRSc7XG5cdFx0XHRyZXR1cm4gR2xvYmFsLmxvYWRTY3JpcHQoIHNjcmlwdF9wYXRoLCBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHREZWJ1Zy5BcnIoIHJlc3VsdCwgJ25vIGVycm9yIGhhcHBlbmVkLicgKTtcblx0XHRcdH0gKTtcblx0XHRjYXNlICdqc19sb2FkX3NjcmlwdF80MDRfZXJyb3InOlxuXHRcdFx0R2xvYmFsLmxvYWRTY3JpcHQoICdub25leGlzdGFudHNjcmlwdC5qcycsIGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdERlYnVnLkFyciggcmVzdWx0LCAnbm8gZXJyb3IgaGFwcGVuZWQuJyApO1xuXHRcdFx0fSApO1xuXHRcdFx0YnJlYWs7XG5cdH1cbn0gKTtcblxuJCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJyN0cmlnZ2VyX2pzX3RpbWVvdXRfYnV0dG9uJywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0R2xvYmFsLmlkbGVfdGltZSA9IDEwMDtcblx0R2xvYmFsLmRvUGluZ0lmTmVjZXNzYXJ5KCk7XG59ICk7XG5cbiQoIGRvY3VtZW50ICkub24oICdjaGFuZ2UnLCAnI3R0X2RlYnVnX2V4Y2VwdGlvbl92ZXJib3NpdHknLCBmdW5jdGlvbiggZSApIHtcblx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHREZWJ1Zy5zZXRWZXJib3NpdHkoICQoIHRoaXMgKS52YWwoKSApO1xufSApO1xuXG4kKCBkb2N1bWVudCApLm9uKCAnY2hhbmdlJywgJyN0dF9vdmVybGF5X2Rpc2FibGVfY2hlY2tib3gnLCBmdW5jdGlvbiggZSApIHtcblx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHRHbG9iYWwuVU5JVF9URVNUX01PREUgPSAkKCB0aGlzICkuaXMoICc6Y2hlY2tlZCcgKTtcblx0R2xvYmFsLmV2ZW50X2J1cy5lbWl0KCAndHRfbGVmdF9jb250YWluZXInLCAncmVidWlsZF9tZW51JyApO1xufSApO1xuXG4kKCBkb2N1bWVudCApLm9uKCAnY2xpY2snLCAnI3F1bml0X3Rlc3RfYnV0dG9uJywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0JCggJyN0dF9kZWJ1Z19jb25zb2xlJyApLmNzcyggJ3dpZHRoJywgJzgwJScgKTtcblx0JCggJyN0dF9kZWJ1Z19jb25zb2xlJyApLmNzcyggJ21hcmdpbicsICcwIGF1dG8nICk7XG5cdHJ1blVuaXRUZXN0cygpO1xufSApO1xuXG4vKipcbiAqIFB1dCBhbGwgdW5pdCB0ZXN0cyBpbiB0aGlzIGZ1bmN0aW9uXG4gKi9cblxuJCggZG9jdW1lbnQgKS5vbiggJ2NoYW5nZScsICcjdHRfb3V0cHV0X3ZhcmlhYmxlX3NlbGVjdCcsIGZ1bmN0aW9uKCBlICkge1xuXHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdG91dHB1dF9zeXN0ZW1fZGF0YSggJCggdGhpcyApLnZhbCgpICk7XG59ICk7XG5cbiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcjdHJpZ2dlcl9vdXRwdXRfdmFyaWFibGVfc2VsZWN0JywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0b3V0cHV0X3N5c3RlbV9kYXRhKCAkKCAnI3R0X291dHB1dF92YXJpYWJsZV9zZWxlY3QnICkudmFsKCkgKTtcbn0gKTtcblxuJCggZG9jdW1lbnQgKS5vbiggJ2NsaWNrJywgJyN0cmlnZ2VyX2FyYml0cmFyeV9zY3JpcHQnLCBmdW5jdGlvbiggZSApIHtcblx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHR2YXIgc2NyaXB0ID0gJCggJyNhcmJpdHJhcnlfc2NyaXB0JyApLnZhbCgpO1xuXHRzY3JpcHQgPSBzY3JpcHQucmVwbGFjZSggLyhcXHJcXG58XFxufFxccikvZ20sICcnICk7IC8vc3RyaXAgYWxsIGxpbmUtZW5kc1xuXHRjb25zb2xlLmxvZyggZXZhbCggc2NyaXB0ICkgKTtcbn0gKTtcblxuLy8gI1ZVRVRFU1RcbiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcjbG9hZF92dWVfdGVzdF9idXR0b24nLCBmdW5jdGlvbiggZSApIHtcblx0ZS5wcmV2ZW50RGVmYXVsdCgpO1xuXHR3aW5kb3cuVnVlUm91dGVyLnB1c2goJ3Rlc3QnKTtcbn0gKTtcblxuXG5cbiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcjYXdlc29tZWJveF90ZXN0JywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0RGVidWcuc2hvd0F3ZXNvbWVCb3hUZXN0KCk7XG59ICk7XG5cbiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcjZ3JpZF90ZXN0JywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0RGVidWcuc2hvd0dyaWRUZXN0KCk7XG59ICk7XG5cbiQoIGRvY3VtZW50ICkub24oICdjbGljaycsICcjV2lkZ2V0VGVzdF90ZXN0JywgZnVuY3Rpb24oIGUgKSB7XG5cdGUucHJldmVudERlZmF1bHQoKTtcblx0RGVidWcuc2hvd1dpZGdldFRlc3QoKTtcbn0gKTtcblxuZnVuY3Rpb24gYnJlYWtPbiggb2JqLCBwcm9wZXJ0eU5hbWUsIG1vZGUsIGZ1bmMgKSB7XG5cdC8vIHRoaXMgaXMgZGlyZWN0bHkgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vcGF1bG1pbGxyL2VzNi1zaGltXG5cdGZ1bmN0aW9uIGdldFByb3BlcnR5RGVzY3JpcHRvciggb2JqLCBuYW1lICkge1xuXHRcdHZhciBwcm9wZXJ0eSA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoIG9iaiwgbmFtZSApO1xuXHRcdHZhciBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZiggb2JqICk7XG5cdFx0d2hpbGUgKCBwcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICYmIHByb3RvICE9PSBudWxsICkge1xuXHRcdFx0cHJvcGVydHkgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCBwcm90bywgbmFtZSApO1xuXHRcdFx0cHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoIHByb3RvICk7XG5cdFx0fVxuXHRcdHJldHVybiBwcm9wZXJ0eTtcblx0fVxuXG5cdGZ1bmN0aW9uIHZlcmlmeU5vdFdyaXRhYmxlKCkge1xuXHRcdGlmICggbW9kZSAhPT0gJ3JlYWQnIClcblx0XHRcdHRocm93IFwiVGhpcyBwcm9wZXJ0eSBpcyBub3Qgd3JpdGFibGUsIHNvIG9ubHkgcG9zc2libGUgbW9kZSBpcyAncmVhZCcuXCI7XG5cdH1cblxuXHR2YXIgZW5hYmxlZCA9IHRydWU7XG5cdHZhciBvcmlnaW5hbFByb3BlcnR5ID0gZ2V0UHJvcGVydHlEZXNjcmlwdG9yKCBvYmosIHByb3BlcnR5TmFtZSApO1xuXHR2YXIgbmV3UHJvcGVydHkgPSB7IGVudW1lcmFibGU6IG9yaWdpbmFsUHJvcGVydHkuZW51bWVyYWJsZSB9O1xuXG5cdC8vIHdyaXRlXG5cdGlmICggb3JpZ2luYWxQcm9wZXJ0eS5zZXQgKSB7Ly8gYWNjZXNzb3IgcHJvcGVydHlcblx0XHRuZXdQcm9wZXJ0eS5zZXQgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0aWYgKCBlbmFibGVkICYmICggIWZ1bmMgfHwgZnVuYyAmJiBmdW5jKCB2YWwgKSApIClcblx0XHRcdFx0ZGVidWdnZXI7XG5cblx0XHRcdG9yaWdpbmFsUHJvcGVydHkuc2V0LmNhbGwoIHRoaXMsIHZhbCApO1xuXHRcdH07XG5cdH0gZWxzZSBpZiAoIG9yaWdpbmFsUHJvcGVydHkud3JpdGFibGUgKSB7Ly8gdmFsdWUgcHJvcGVydHlcblx0XHRuZXdQcm9wZXJ0eS5zZXQgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0aWYgKCBlbmFibGVkICYmICggIWZ1bmMgfHwgZnVuYyAmJiBmdW5jKCB2YWwgKSApIClcblx0XHRcdFx0ZGVidWdnZXI7XG5cblx0XHRcdG9yaWdpbmFsUHJvcGVydHkudmFsdWUgPSB2YWw7XG5cdFx0fTtcblx0fSBlbHNlIHtcblx0XHR2ZXJpZnlOb3RXcml0YWJsZSgpO1xuXHR9XG5cblx0Ly8gcmVhZFxuXHRuZXdQcm9wZXJ0eS5nZXQgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdGlmICggZW5hYmxlZCAmJiBtb2RlID09PSAncmVhZCcgJiYgKCAhZnVuYyB8fCBmdW5jICYmIGZ1bmMoIHZhbCApICkgKVxuXHRcdFx0ZGVidWdnZXI7XG5cblx0XHRyZXR1cm4gb3JpZ2luYWxQcm9wZXJ0eS5nZXQgPyBvcmlnaW5hbFByb3BlcnR5LmdldC5jYWxsKCB0aGlzLCB2YWwgKSA6IG9yaWdpbmFsUHJvcGVydHkudmFsdWU7XG5cdH07XG5cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KCBvYmosIHByb3BlcnR5TmFtZSwgbmV3UHJvcGVydHkgKTtcblxuXHRyZXR1cm4ge1xuXHRcdGRpc2FibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0ZW5hYmxlZCA9IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRlbmFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0ZW5hYmxlZCA9IHRydWU7XG5cdFx0fVxuXHR9O1xufTtcblxuZnVuY3Rpb24gcnVuVW5pdFRlc3RzKCkge1xuXHRpZiAoICQoICcjcXVuaXRfc2NyaXB0JyApLmxlbmd0aCA9PSAwICkge1xuXHRcdCQoICc8c2NyaXB0IGlkPVxcJ3F1bml0X3NjcmlwdFxcJyBzcmM9XFwnZnJhbWV3b3JrL3F1bml0L3F1bml0LmpzXFwnPjwvc2NyaXB0PicgKS5hcHBlbmRUbyggJ2hlYWQnICk7XG5cdFx0JCggJzxsaW5rIHJlbD1cXCdzdHlsZXNoZWV0XFwnIHR5cGU9XFwndGV4dC9jc3NcXCcgaHJlZj1cXCdmcmFtZXdvcmsvcXVuaXQvcXVuaXQuY3NzXFwnPicgKS5hcHBlbmRUbyggJ2hlYWQnICk7XG5cdFx0UVVuaXQuY29uZmlnLmF1dG9zdGFydCA9IGZhbHNlO1xuXHRcdCQoICcjcXVuaXRfY29udGFpbmVyJyApLmNzcyggJ3dpZHRoJywgJzEwMHZ3JyApO1xuXHRcdCQoICcjcXVuaXRfY29udGFpbmVyJyApLmNzcyggJ2hlaWdodCcsICcxMDB2aCcgKTtcblx0XHQkKCAnI3F1bml0X2NvbnRhaW5lcicgKS5jc3MoICdvdmVyZmxvdy15JywgJ3Njcm9sbCcgKTtcblx0XHQkKCAnI3F1bml0X2NvbnRhaW5lcicgKS5jc3MoICdwb3NpdGlvbicsICdmaXhlZCcgKTtcblx0XHQkKCAnI3F1bml0X2NvbnRhaW5lcicgKS5jc3MoICd0b3AnLCAnMHB4JyApO1xuXHRcdCQoICcjcXVuaXRfY29udGFpbmVyJyApLmNzcyggJ2xlZnQnLCAnMHB4JyApO1xuXHRcdCQoICcjcXVuaXRfY29udGFpbmVyJyApLmNzcyggJ3otaW5kZXgnLCAnMTAwJyApO1xuXHRcdCQoICcjcXVuaXRfY29udGFpbmVyJyApLmNzcyggJ2JhY2tncm91bmQnLCAnI2ZmZicgKTtcblx0XHQkKCAnI3F1bml0X2NvbnRhaW5lcicgKS5zaG93KCk7XG5cblx0XHQkKCAnI3R0X2RlYnVnX2NvbnNvbGUnICkucmVtb3ZlKCk7XG5cdH1cblx0aWYgKCAhd2luZG93LnF1bml0X2luaXRpYXRlZCApIHtcblx0XHR3aW5kb3cucXVuaXRfaW5pdGlhdGVkID0gdHJ1ZTtcblx0XHQvL1FVbml0LnN0YXJ0KCk7IC8vVGhpcyBjYXVzZXMgYSBKYXZhU2NyaXB0IGV4Y2VwdGlvbiwgYnV0IGRvZXMgbm90IHNlZW0gdG8gYmUgcmVxdWlyZWQuIFRlc3QgcmFuIHdpdGhvdXQgaXQuXG5cdH1cblxuXHRRVW5pdC5tb2R1bGUoICdRVW5pdCBTYW5pdHknICk7XG5cdFFVbml0LnRlc3QoICdRVW5pdCB0ZXN0JywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHRhc3NlcnQub2soIDEgPT0gJzEnLCAnUVVuaXQgaXMgbG9hZGVkIGFuZCBzYW5lIScgKTtcblx0fSApO1xuXG5cdFFVbml0Lm1vZHVsZSggJ0dsb2JhbC5qcycgKTtcblx0UVVuaXQudGVzdCggJ0dsb2JhbC5Nb25leVJvdW5kJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAxLjAwNSwgMiApID09ICcxLjAxJywgJ0dsb2JhbC5Nb25leVJvdW5kKDEuMDA1LCAyKSA9PSAxLjAxIC0tIFBhc3NlZCEnICk7XG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuTW9uZXlSb3VuZCggMS43Nzc3Nzc3NywgMiApID09ICcxLjc4JywgJ0dsb2JhbC5Nb25leVJvdW5kKDEuNzc3Nzc3NzcsIDIpID09IDEuNzggLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCA5LjEsIDIgKSA9PSAnOS4xMCcsICdHbG9iYWwuTW9uZXlSb3VuZCg5LjEsIDIpID09IDkuMTAgLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAxLjAwNDk5OTk5OTk5OTk5OTksIDIgKSA9PSAnMS4wMScsICdHbG9iYWwuTW9uZXlSb3VuZCgxLjAwNDk5OTk5OTk5OTk5OTksIDIpID09IDEuMDEgLS0gUGFzc2VkIScgKTtcblxuXHRcdGFzc2VydC5vayggR2xvYmFsLk1vbmV5Um91bmQoIC0yOC4xMjAsIDIgKSA9PSAnLTI4LjEyJywgJ0dsb2JhbC5Nb25leVJvdW5kKC0yOC4xMjAsIDIpID09IC0yOC4xMiAtLSBQYXNzZWQhJyApO1xuXHRcdGFzc2VydC5vayggR2xvYmFsLk1vbmV5Um91bmQoIDI4LjEyMCwgMiApID09ICcyOC4xMicsICdHbG9iYWwuTW9uZXlSb3VuZCgyOC4xMjAsIDIpID09IDI4LjEyIC0tIFBhc3NlZCEnICk7XG5cblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAtMjguMTI0LCAyICkgPT0gJy0yOC4xMicsICdHbG9iYWwuTW9uZXlSb3VuZCgtMjguMTI0LCAyKSA9PSAtMjguMTIgLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAyOC4xMjQsIDIgKSA9PSAnMjguMTInLCAnR2xvYmFsLk1vbmV5Um91bmQoMjguMTI0LCAyKSA9PSAyOC4xMiAtLSBQYXNzZWQhJyApO1xuXHRcdGFzc2VydC5vayggR2xvYmFsLk1vbmV5Um91bmQoIC0yOC4xMjUsIDIgKSA9PSAnLTI4LjEzJywgJ0dsb2JhbC5Nb25leVJvdW5kKC0yOC4xMjUsIDIpID09IC0yOC4xMyAtLSBQYXNzZWQhJyApO1xuXHRcdGFzc2VydC5vayggR2xvYmFsLk1vbmV5Um91bmQoIDI4LjEyNSwgMiApID09ICcyOC4xMycsICdHbG9iYWwuTW9uZXlSb3VuZCgyOC4xMjUsIDIpID09IDI4LjEzIC0tIFBhc3NlZCEnICk7XG5cblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAtMjguMTI5LCAyICkgPT0gJy0yOC4xMycsICdHbG9iYWwuTW9uZXlSb3VuZCgtMjguMTI5LCAyKSA9PSAtMjguMTMgLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAyOC4xMjksIDIgKSA9PSAnMjguMTMnLCAnR2xvYmFsLk1vbmV5Um91bmQoMjguMTI5LCAyKSA9PSAyOC4xMyAtLSBQYXNzZWQhJyApO1xuXG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuTW9uZXlSb3VuZCggLTAuMTI0LCAyICkgPT0gJy0wLjEyJywgJ0dsb2JhbC5Nb25leVJvdW5kKC0wLjEyNCwgMikgPT0gLTAuMTIgLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAwLjEyNCwgMiApID09ICcwLjEyJywgJ0dsb2JhbC5Nb25leVJvdW5kKDAuMTI0LCAyKSA9PSAwLjEyIC0tIFBhc3NlZCEnICk7XG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuTW9uZXlSb3VuZCggLTAuMTU1LCAyICkgPT0gJy0wLjE2JywgJ0dsb2JhbC5Nb25leVJvdW5kKC0wLjE1NSwgMikgPT0gLTAuMTYgLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAwLjE1NSwgMiApID09ICcwLjE2JywgJ0dsb2JhbC5Nb25leVJvdW5kKDAuMTU1LCAyKSA9PSAwLjE2IC0tIFBhc3NlZCEnICk7XG5cblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAtMC4wMDEsIDIgKSA9PSAnMC4wMCcsICdHbG9iYWwuTW9uZXlSb3VuZCgtMC4wMDEsIDIpID09IDAuMDAgLS0gUGFzc2VkIScgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5Nb25leVJvdW5kKCAwLjAwMSwgMiApID09ICcwLjAwJywgJ0dsb2JhbC5Nb25leVJvdW5kKDAuMDAxLCAyKSA9PSAwLjAwIC0tIFBhc3NlZCEnICk7XG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnR2xvYmFsLmpzIHNvcnQtcHJlZml4JywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgcmVzID0gR2xvYmFsLnJlbW92ZVNvcnRQcmVmaXgoICctMTIzNC0xMTExMTExMS0xMTExLTExMTEtMTExMS0xMTExMTExMTExMTEnICk7XG5cdFx0YXNzZXJ0Lm9rKCByZXMgPT0gJzExMTExMTExLTExMTEtMTExMS0xMTExLTExMTExMTExMTExMScsICdzdHJpcHBlZCBmcm9tIHN5bnRoIHV1aWQgYS4nICk7XG5cblx0XHR2YXIgcmVzID0gR2xvYmFsLnJlbW92ZVNvcnRQcmVmaXgoICcxMTExMTExMS0xMTExLTExMTEtMTExMS0xMTExMTExMTExMTEnICk7XG5cdFx0YXNzZXJ0Lm9rKCByZXMgPT0gJzExMTExMTExLTExMTEtMTExMS0xMTExLTExMTExMTExMTExMScsICdzdHJpcHBlZCBmcm9tIHN5bnRoIHV1aWQgbm8gc29ydC1wcmVmaXguJyApO1xuXG5cdFx0dmFyIHJlcyA9IEdsb2JhbC5yZW1vdmVTb3J0UHJlZml4KCAnLTEyMzQtMDVkM2Q1NDctMGUyYi05MjMzLTY1YmEtNGUyMjlmZDcyYmMwJyApO1xuXHRcdGFzc2VydC5vayggcmVzID09ICcwNWQzZDU0Ny0wZTJiLTkyMzMtNjViYS00ZTIyOWZkNzJiYzAnLCAnc3RyaXBwZWQgZnJvbSB2YWxpZCBVVUlEIHdpdGggNCBkaWdpdCBudW1lcmljIHNlY3Rpb24gaW4gdGhlIG1pZGRsZS4nICk7XG5cblx0XHR2YXIgcmVzID0gR2xvYmFsLnJlbW92ZVNvcnRQcmVmaXgoICcwNWQzZDU0Ny0wZTJiLTkyMzMtNjViYS00ZTIyOWZkNzJiYzAnICk7XG5cdFx0YXNzZXJ0Lm9rKCByZXMgPT0gJzA1ZDNkNTQ3LTBlMmItOTIzMy02NWJhLTRlMjI5ZmQ3MmJjMCcsICdzdHJpcHBlZCBmcm9tIHZhbGlkIFVVSUQgd2l0aCA0IGRpZ2l0IG51bWVyaWMgc2VjdGlvbiBpbiB0aGUgbWlkZGxlLicgKTtcblxuXHRcdHZhciByZXMgPSBHbG9iYWwucmVtb3ZlU29ydFByZWZpeCggJy0xMjM0LTExMScgKTtcblx0XHRhc3NlcnQub2soIHJlcyA9PSAnMTExJywgJ3N0cmlwcGVkIGZyb20gaW50IGEuJyApO1xuXG5cdFx0dmFyIHJlcyA9IEdsb2JhbC5yZW1vdmVTb3J0UHJlZml4KCAnMTExJyApO1xuXHRcdGFzc2VydC5vayggcmVzID09ICcxMTEnLCAnc3RyaXBwZWQgZnJvbSBpbnQgd2l0aCBubyBzb3J0LXByZWZpeC4nICk7XG5cblx0XHR2YXIgcmVzID0gR2xvYmFsLnJlbW92ZVNvcnRQcmVmaXgoICctMTIzNC10ZXN0U3RyaW5nR2FscmJseUJsYWgnICk7XG5cdFx0YXNzZXJ0Lm9rKCByZXMgPT0gJ3Rlc3RTdHJpbmdHYWxyYmx5QmxhaCcsICdzdHJpcHBlZCBmcm9tIHN0cmluZyBhLicgKTtcblxuXHRcdHZhciByZXMgPSBHbG9iYWwucmVtb3ZlU29ydFByZWZpeCggJ3Rlc3RTdHJpbmdHYWxyYmx5QmxhaCcgKTtcblx0XHRhc3NlcnQub2soIHJlcyA9PSAndGVzdFN0cmluZ0dhbHJibHlCbGFoJywgJ3N0cmlwcGVkIGZyb20gc3RyaW5nIHdpdGggbm8gc29ydC1wcmVmaXguJyApO1xuXG5cdFx0dmFyIHJlcyA9IEdsb2JhbC5yZW1vdmVTb3J0UHJlZml4RnJvbUFycmF5KCB7XG5cdFx0XHQnLTExMTItdGVzdFN0cmluZ0dhbHJibHlCbGFoJzogJ3N0cmluZycsXG5cdFx0XHQnLTExMTMtMTIzNCc6ICdpbnQnLFxuXHRcdFx0Jy0xMjM0LTExMTExMTExLTExMTEtMTExMS0xMTExLTExMTExMTExMTExMSc6ICd1dWlkJ1xuXHRcdH0gKTtcblx0XHR2YXIgY250ID0gMDtcblxuXHRcdGFzc2VydC5vayggcmVzWyd0ZXN0U3RyaW5nR2FscmJseUJsYWgnXSA9PSAnc3RyaW5nJywgJ3ByZWZpeCBzdHJpcHBlZCBwcm9wZXJseScgKTtcblx0XHRhc3NlcnQub2soIHJlc1snMTIzNCddID09ICdpbnQnLCAncHJlZml4IHN0cmlwcGVkIHByb3Blcmx5JyApO1xuXHRcdGFzc2VydC5vayggcmVzWycxMTExMTExMS0xMTExLTExMTEtMTExMS0xMTExMTExMTExMTEnXSA9PSAndXVpZCcsICdwcmVmaXggc3RyaXBwZWQgcHJvcGVybHknICk7XG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnR2xvYmFsLmpzIHBhcnNlVGltZVVuaXQgSEg6TU06U1MnLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwMDowMScsIDEwICksIDYwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJy0wMDowMScsIDEwICksIC02MCApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAxOjAwJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxMDowMCcsIDEwICksIDM2MDAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzEwMDowMCcsIDEwICksIDM2MDAwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxMDAwOjAwJywgMTAgKSwgMzYwMDAwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxMDAwMDowMCcsIDEwICksIDM2MDAwMDAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzEwMDAwOjAxLjUnLCAxMCApLCAzNjAwMDA2MCApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAxJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICctMScsIDEwICksIC0zNjAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzE6JywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxOjAwOjAwJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxOjAwOjAxJywgMTAgKSwgMzYwMSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICdcIjE6MDA6MDFcIicsIDEwICksIDM2MDEgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwMDo2MCcsIDEwICksIDM2MDAgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnOjYwJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICc6MScsIDEwICksIDYwICk7XG5cblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMTowMDowMS41JywgMTAgKSwgMzYwMSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICdcIjE6MDA6MDEuNVwiJywgMTAgKSwgMzYwMSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxOjEuNScsIDEwICksIDM2NjAgKTtcblxuXHRcdC8vSHlicmlkIG1vZGUuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzEuMDAwJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxLjAwJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxJywgMTAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICctMScsIDEwICksIC0zNjAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAxJywgMTAgKSwgMzYwMCApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuMjUnLCAxMCApLCA5MDAgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC41MCcsIDEwICksIDE4MDAgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjM0JywgMTAgKSwgMTIwMCApOyAvL0F1dG9tYXRpY2FsbHkgcm91bmRzIHRvIG5lYXJlc3QgMW1pblxuXHR9ICk7XG5cblx0UVVuaXQudGVzdCggJ0dsb2JhbC5qcyBwYXJzZVRpbWVVbml0IEhvdXJzJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMTAwMC4wMDAwJywgMjAgKSwgMzYwMDAwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxLDAwMC4wMDAwJywgMjAgKSwgMzYwMDAwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxIDAwMC4wMDAwJywgMjAgKSwgMzYwMDAwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICctMSwwMDAuMDAwMCcsIDIwICksIC0zNjAwMDAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJyBcIi0xLCAwMDAuMDAwMFwiICcsIDIwICksIC0zNjAwMDAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzEuMDAwJywgMjAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxLjAwJywgMjAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxJywgMjAgKSwgMzYwMCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICctMScsIDIwICksIC0zNjAwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAxJywgMjAgKSwgMzYwMCApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuMjUnLCAyMCApLCA5MDAgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC41MCcsIDIwICksIDE4MDAgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjM0JywgMjAgKSwgMTIwMCApOyAvL0F1dG9tYXRpY2FsbHkgcm91bmRzIHRvIG5lYXJlc3QgMW1pblxuXG5cdFx0Ly9IeWJyaWQgbW9kZVxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwMDowMScsIDIwICksIDYwICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJy0wMDowMScsIDIwICksIC02MCApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzo2MCcsIDIwICksIDM2MDAgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnOjEnLCAyMCApLCA2MCApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzE6MDA6MDEuNScsIDIwICksIDM2MDAgKTsgLy9UaGVzZSBkb24ndCBtYXRjaCBQSFAgZHVlIHRvIGhvd1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxOjEuNScsIDIwICksIDM2NjAgKTtcblxuXHR9ICk7XG5cblx0UVVuaXQudGVzdCggJ0dsb2JhbC5qcyBwYXJzZVRpbWVVbml0IEhvdXJzIFJvdW5kaW5nJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4wMicsIDIwICksICggMSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4wMycsIDIwICksICggMiAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4wNScsIDIwICksICggMyAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4wNicsIDIwICksICggNCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4wOCcsIDIwICksICggNSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4xMCcsIDIwICksICggNiAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4xMicsIDIwICksICggNyAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4xMycsIDIwICksICggOCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4xNScsIDIwICksICggOSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4xNycsIDIwICksICggMTAgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuMTgnLCAyMCApLCAoIDExICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjIwJywgMjAgKSwgKCAxMiAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4yMicsIDIwICksICggMTMgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuMjMnLCAyMCApLCAoIDE0ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjI1JywgMjAgKSwgKCAxNSAqIDYwICkgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjI3JywgMjAgKSwgKCAxNiAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4yOCcsIDIwICksICggMTcgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuMzAnLCAyMCApLCAoIDE4ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjMyJywgMjAgKSwgKCAxOSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4zMycsIDIwICksICggMjAgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuMzUnLCAyMCApLCAoIDIxICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjM3JywgMjAgKSwgKCAyMiAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC4zOScsIDIwICksICggMjMgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNDAnLCAyMCApLCAoIDI0ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjQyJywgMjAgKSwgKCAyNSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC40MycsIDIwICksICggMjYgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNDUnLCAyMCApLCAoIDI3ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjQ3JywgMjAgKSwgKCAyOCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC40OCcsIDIwICksICggMjkgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNTAnLCAyMCApLCAoIDMwICogNjAgKSApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNTInLCAyMCApLCAoIDMxICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjUzJywgMjAgKSwgKCAzMiAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC41NScsIDIwICksICggMzMgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNTcnLCAyMCApLCAoIDM0ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjU4JywgMjAgKSwgKCAzNSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC42MCcsIDIwICksICggMzYgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNjInLCAyMCApLCAoIDM3ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjYzJywgMjAgKSwgKCAzOCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC42NScsIDIwICksICggMzkgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNjcnLCAyMCApLCAoIDQwICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjY4JywgMjAgKSwgKCA0MSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC43MCcsIDIwICksICggNDIgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNzInLCAyMCApLCAoIDQzICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjczJywgMjAgKSwgKCA0NCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC43NScsIDIwICksICggNDUgKiA2MCApICk7XG5cblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC43NycsIDIwICksICggNDYgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuNzgnLCAyMCApLCAoIDQ3ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjgwJywgMjAgKSwgKCA0OCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC44MicsIDIwICksICggNDkgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuODQnLCAyMCApLCAoIDUwICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjg1JywgMjAgKSwgKCA1MSAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC44NycsIDIwICksICggNTIgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuODknLCAyMCApLCAoIDUzICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjkwJywgMjAgKSwgKCA1NCAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC45MicsIDIwICksICggNTUgKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuOTQnLCAyMCApLCAoIDU2ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcwLjk1JywgMjAgKSwgKCA1NyAqIDYwICkgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5wYXJzZVRpbWVVbml0KCAnMC45NycsIDIwICksICggNTggKiA2MCApICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwucGFyc2VUaW1lVW5pdCggJzAuOTknLCAyMCApLCAoIDU5ICogNjAgKSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLnBhcnNlVGltZVVuaXQoICcxLjAwJywgMjAgKSwgKCA2MCAqIDYwICkgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdHbG9iYWwuanMgZ2V0VGltZVVuaXQnLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwLCAxMCApLCAnMDE6MDAnICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwuZ2V0VGltZVVuaXQoIDM2NjAsIDEwICksICcwMTowMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzYwNjAsIDEwICksICcxMDowMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzY2NjAsIDEwICksICcxMDoxMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzYwNjYwLCAxMCApLCAnMTAwOjExJyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwNjYwLCAxMCApLCAnMTAwMDoxMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzYwMDA2NjAsIDEwICksICcxMDAwMDoxMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzYwMDAwNjYwLCAxMCApLCAnMTAwMDAwOjExJyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwMDAwNjYwLCAxMCApLCAnMTAwMDAwMDoxMScgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAtMzYwMCwgMTAgKSwgJy0wMTowMCcgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggLTM2NjAsIDEwICksICctMDE6MDEnICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwuZ2V0VGltZVVuaXQoIC0zNjA2MCwgMTAgKSwgJy0xMDowMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggLTM2NjYwLCAxMCApLCAnLTEwOjExJyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAtMzYwNjYwLCAxMCApLCAnLTEwMDoxMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggLTM2MDA2NjAsIDEwICksICctMTAwMDoxMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggLTM2MDAwNjYwLCAxMCApLCAnLTEwMDAwOjExJyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAtMzYwMDAwNjYwLCAxMCApLCAnLTEwMDAwMDoxMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggLTM2MDAwMDA2NjAsIDEwICksICctMTAwMDAwMDoxMScgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwLCAxMiApLCAnMDE6MDA6MDAnICk7XG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwuZ2V0VGltZVVuaXQoIDM2NjEsIDEyICksICcwMTowMTowMScgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzYwNjAsIDEyICksICcxMDowMTowMCcgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXRUaW1lVW5pdCggMzY2NjAsIDEyICksICcxMDoxMTowMCcgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwLCAyMyApLCAnMS4wMDAwJyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjYwLCAyMyApLCAnMS4wMTY3JyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwNjYwLCAyMyApLCAnMTAwMC4xODMzJyApO1xuXG5cdFx0YXNzZXJ0LmVxdWFsKCBHbG9iYWwuZ2V0VGltZVVuaXQoIDYwMywgOTkgKSwgJzEwOjAzJyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldFRpbWVVbml0KCAzNjAwLCA5OSApLCAnNjA6MDAnICk7XG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnR2xvYmFsLmpzIGdldERheXNJblNwYW4nLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlICksIDYgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXREYXlzSW5TcGFuKCAnMDEtTWF5LTIwMjInLCAnMDctTWF5LTIwMjInLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlLCB0cnVlICksIDMgKTtcblx0XHRhc3NlcnQuZXF1YWwoIEdsb2JhbC5nZXREYXlzSW5TcGFuKCAnMDEtTWF5LTIwMjInLCAnMDctTWF5LTIwMjInLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUgKSwgMiApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUgKSwgMSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlICksIDAgKTtcblxuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMi1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNiApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwMy1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNSApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwNC1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgNCApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwNS1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgMyApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwNi1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgMiApO1xuXHRcdGFzc2VydC5lcXVhbCggR2xvYmFsLmdldERheXNJblNwYW4oICcwNy1NYXktMjAyMicsICcwNy1NYXktMjAyMicsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUgKSwgMSApO1xuXHR9ICk7XG5cblx0UVVuaXQubW9kdWxlKCAnVVVJRCBHZW5lcmF0aW9uJyApO1xuXHR2YXIgdXVpZHMgPSBbXTtcblx0UVVuaXQudGVzdCggJ1VVSUQgVElHSFRMT09QIChkZWZhdWx0IGxvZ2dlZCBpbiB1c2VyIHNlZWQpJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgbWF4ID0gMzAwMDtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdHV1aWRzLnB1c2goIFRUVVVJRC5nZW5lcmF0ZVVVSUQoKSApO1xuXHRcdH1cblx0XHRhc3NlcnQub2soIGhhc0R1cGxpY2F0ZXMoIHV1aWRzLCBhc3NlcnQgKSA9PSBmYWxzZSwgJ0R1cGxpY2F0ZSBVVUlEcyEnICk7XG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbWF4OyBpKysgKSB7XG5cdFx0XHRhc3NlcnQub2soIFRUVVVJRC5pc1VVSUQoIHV1aWRzW2ldICksICdpcyBVVUlEJyApO1xuXHRcdH1cblx0fSApO1xuXG5cdHV1aWRzID0gW107XG5cdFFVbml0LnRlc3QoICdVVUlEIFRJR0hUTE9PUCAocmFuZG9tIHNlZWQpJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgdXNlcl9pZCA9IExvY2FsQ2FjaGVEYXRhLmxvZ2luVXNlci5pZDtcblx0XHRMb2NhbENhY2hlRGF0YS5sb2dpblVzZXIuaWQgPSBudWxsO1xuXHRcdHZhciBtYXggPSAzMDAwO1xuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IG1heDsgaSsrICkge1xuXHRcdFx0dXVpZHMucHVzaCggVFRVVUlELmdlbmVyYXRlVVVJRCgpICk7XG5cdFx0fVxuXHRcdGFzc2VydC5vayggaGFzRHVwbGljYXRlcyggdXVpZHMsIGFzc2VydCApID09IGZhbHNlLCAnRHVwbGljYXRlIFVVSURzIScgKTtcblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdGFzc2VydC5vayggVFRVVUlELmlzVVVJRCggdXVpZHNbaV0gKSwgJ2lzIFVVSUQnICk7XG5cdFx0fVxuXHRcdExvY2FsQ2FjaGVEYXRhLmxvZ2luVXNlci5pZCA9IHVzZXJfaWQ7XG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnR2xvYmFsLmlzTnVtZXJpYygpJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5pc051bWVyaWMoIDE0ODMyMjg4MDAgKSA9PSB0cnVlLCAnMTQ4MzIyODgwMCBpcyBhbiBlcG9jaCBhbmQgbnVtZXJpYycgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5pc051bWVyaWMoICcxNDgzMjI4ODAwJyApID09IHRydWUsICcxNDgzMjI4ODAwIGlzIGFuIGVwb2NoIGFuZCBhIG51bWVyaWMgc3RyaW5nJyApO1xuXG5cdFx0Ly9hc3NlcnQub2soICBHbG9iYWwuaXNOdW1lcmljKFwiMSw0ODMsMjI4LDgwMFwiKSA9PSBmYWxzZSAsICcxLDQ4MywyMjgsODAwIGhhcyBjb21tYXMgYW5kIHNvIGlzIG5vdCBudW1lcmljJyk7IC8vZG9lcyBub3QgaGFuZGxlIGNvbW1hc1xuXG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuaXNOdW1lcmljKCAyLjEyMzQgKSA9PSB0cnVlLCAnMi4xMjM0IGlzIGEgZmxvYXQgYW5kIG51bWVyaWMnICk7XG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuaXNOdW1lcmljKCAtMi4xMjM0ICkgPT0gdHJ1ZSwgJy0yLjEyMzQgaXMgYSBuZWdhdGl2ZSBmbG9hdCBhbmQgbnVtZXJpYycgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5pc051bWVyaWMoICcyLjEyMzQnICkgPT0gdHJ1ZSwgJ1wiMi4xMjM0XCIgaXMgbnVtZXJpYyBzdHJpbmcnICk7XG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuaXNOdW1lcmljKCAtMyApID09IHRydWUsICctMyBpcyBudW1lcmljJyApO1xuXHRcdGFzc2VydC5vayggR2xvYmFsLmlzTnVtZXJpYyggMCApID09IHRydWUsICcwIGlzIG51bWVyaWMnICk7XG5cdFx0YXNzZXJ0Lm9rKCBHbG9iYWwuaXNOdW1lcmljKCAxICkgPT0gdHJ1ZSwgJzEgaXMgbnVtZXJpYycgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5pc051bWVyaWMoICcxJyApID09IHRydWUsICdcIjFcIiBpcyBhIG51bWVyaWMgc3RyaW5nJyApO1xuXHRcdGFzc2VydC5vayggR2xvYmFsLmlzTnVtZXJpYyggJ2FzZGYnICkgPT0gZmFsc2UsICdcImFzZGZcIiBpcyBub3QgbnVtZXJpYycgKTtcblx0XHRhc3NlcnQub2soIEdsb2JhbC5pc051bWVyaWMoICcnICkgPT0gZmFsc2UsICdcIlwiIGlzIG5vdCBudW1lcmljJyApO1xuXHR9ICk7XG5cblx0LyoqXG5cdCAqXG5cdCAqIEFTWU5DSFJPTk9VUyBURVNUUyBHTyBBVCBUSEUgQk9UVE9NXG5cdCAqXG5cdCAqL1xuXG5cdFFVbml0Lm1vZHVsZSggJ1RUUHJvbWlzZS5qcycgKTtcblx0UVVuaXQudGVzdCggJ1RUUHJvbWlzZSBDYXNlIDE6IHdhaXQoY2F0ZWdvcnkpIG9uIGEgc2luZ2xlIHByb21pc2UnLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdHZhciBkb25lID0gYXNzZXJ0LmFzeW5jKCk7XG5cblx0XHRUVFByb21pc2UuY2xlYXJBbGxQcm9taXNlcygpO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBsZW5ndGggPSAwLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAndGVzdCcsICd0ZXN0MScgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXNbXFwndGVzdFxcJ10gZXhpc3RzLicgKTtcblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXSApLmxlbmd0aCA9PSAxLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDEuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3QnICkubGVuZ3RoID09IDEsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3QpLmxlbmd0aCA9PSAxJyApO1xuXG5cdFx0VFRQcm9taXNlLndhaXQoICd0ZXN0JywgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCAxID09ICcxJywgJ1RFU1QgUHJvbWlzZSB0ZXN0IHJlc29sdmVkLicgKTtcblx0XHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J10gKSA9PSAndW5kZWZpbmVkJywgJ3Byb21pc2VzW3Rlc3RdIGlzIG51bGwuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcgKS5sZW5ndGggPT0gMCwgJ2ZpbHRlclByb21pc2VBcnJheSh0ZXN0KS5sZW5ndGggPT0gMC4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0JywgJ3Rlc3QxJyApID09IGZhbHNlLCAnZmlsdGVyUHJvbWlzZUFycmF5KFwidGVzdFwiLFwidGVzdDFcIikgbGVuZ3RoID0gMC4nICk7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSApO1xuXG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXVsndGVzdDEnXSApID09ICdvYmplY3QnLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDEuJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAndGVzdCcsICd0ZXN0MScgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSAxYjogd2FpdChjYXRlZ29yeSkgb24gYSBzaW5nbGUgcHJvbWlzZSB3aXRoIHJlamVjdCcsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7XG5cdFx0dmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTtcblxuXHRcdFRUUHJvbWlzZS5jbGVhckFsbFByb21pc2VzKCk7XG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzICkubGVuZ3RoID09IDAsICdDYWxsYmFjazogcHJvbWlzZXMgb2JqIGxlbmd0aCA9IDAuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0JywgJ3Rlc3QxJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J10gKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlc1tcXCd0ZXN0XFwnXSBleGlzdHMuJyApO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkubGVuZ3RoID09IDEsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMS4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcgKS5sZW5ndGggPT0gMSwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdCkubGVuZ3RoID09IDEnICk7XG5cblx0XHRUVFByb21pc2Uud2FpdCggJ3Rlc3QnLCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIDAgPT0gJzEnLCAnVEVTVCBQcm9taXNlIHRlc3QgcmVzb2x2ZWQuJyApOyAvL1RISVMgU0hPVUxEIE5PVCBCRSBDQUxMRUQuXG5cdFx0XHRkb25lKCk7XG5cdFx0fSwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlamVjdCgpXG5cdFx0XHRhc3NlcnQub2soIDEgPT0gJzEnLCAnVEVTVCBQcm9taXNlIHRlc3QgcmVqZWN0ZWQuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXSApID09ICd1bmRlZmluZWQnLCAncHJvbWlzZXNbdGVzdF0gaXMgbnVsbC4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0JyApLmxlbmd0aCA9PSAwLCAnZmlsdGVyUHJvbWlzZUFycmF5KHRlc3QpLmxlbmd0aCA9PSAwLicgKTtcblx0XHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3QnLCAndGVzdDEnICkgPT0gZmFsc2UsICdmaWx0ZXJQcm9taXNlQXJyYXkoXCJ0ZXN0XCIsXCJ0ZXN0MVwiKSBsZW5ndGggPSAwLicgKTtcblx0XHRcdGRvbmUoKTtcblx0XHR9ICk7XG5cblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddWyd0ZXN0MSddICkgPT0gJ29iamVjdCcsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMS4nICk7XG5cdFx0VFRQcm9taXNlLnJlamVjdCggJ3Rlc3QnLCAndGVzdDEnICk7XG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnVFRQcm9taXNlIENhc2UgMWM6IHdhaXQoY2F0ZWdvcnkpIHR3byBwcm9taXNlcyB3aXRoIHR3byByZWplY3RzIG9uIGNhdGVnb3J5JywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgZG9uZSA9IGFzc2VydC5hc3luYygpO1xuXG5cdFx0VFRQcm9taXNlLmNsZWFyQWxsUHJvbWlzZXMoKTtcblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXMgKS5sZW5ndGggPT0gMCwgJ0NhbGxiYWNrOiBwcm9taXNlcyBvYmogbGVuZ3RoID0gMC4nICk7XG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXMgKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlcyBleGlzdHMuJyApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ3Rlc3QnLCAndGVzdDEnICk7XG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXSApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzW1xcJ3Rlc3RcXCddIGV4aXN0cy4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J10gKS5sZW5ndGggPT0gMSwgJ3Byb21pc2VzIG9iamVjdCBsZW5ndGggPSAxLicgKTtcblx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0JyApLmxlbmd0aCA9PSAxLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0KS5sZW5ndGggPT0gMScgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0JywgJ3Rlc3QyJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J10gKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlc1tcXCd0ZXN0XFwnXSBleGlzdHMuJyApO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkubGVuZ3RoID09IDIsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMS4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcgKS5sZW5ndGggPT0gMiwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdCkubGVuZ3RoID09IDEnICk7XG5cblx0XHRyZW1haW5pbmdfcmVqZWN0X3Byb21pc2VzID0gMDtcblx0XHRUVFByb21pc2Uud2FpdCggJ3Rlc3QnLCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIDAgPT0gJzEnLCAnVEVTVCBQcm9taXNlIHRlc3QgcmVzb2x2ZWQuJyApOyAvL0ZhaWwgdGhlIHRlc3QgaWYgdGhpcyBpcyBjYWxsZWQsIHNpbmNlIHRoZXJlIGlzIGEgcmVqZWN0LlxuXHRcdFx0ZG9uZSgpO1xuXHRcdH0sIGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly93aWxsIGJlIHJ1biBvbiByZWplY3QoKVxuXHRcdFx0YXNzZXJ0Lm9rKCAxID09ICcxJywgJ1RFU1QgUHJvbWlzZSB0ZXN0IHJlamVjdGVkLicgKTtcblxuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcgKS5sZW5ndGggPT0gMSwgJ2ZpbHRlclByb21pc2VBcnJheSh0ZXN0KS5sZW5ndGggPT0gMS4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0JywgJ3Rlc3QxJyApID09IGZhbHNlLCAnZmlsdGVyUHJvbWlzZUFycmF5KFwidGVzdFwiLFwidGVzdDFcIikgbGVuZ3RoID0gMC4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0JywgJ3Rlc3QyJyApLmxlbmd0aCA9PSAxLCAnZmlsdGVyUHJvbWlzZUFycmF5KFwidGVzdFwiLFwidGVzdDJcIikgbGVuZ3RoID0gMC4nICk7XG5cblx0XHRcdGFzc2VydC5vayggcmVtYWluaW5nX3JlamVjdF9wcm9taXNlcyA9PSAwLCAnTWFrZSBzdXJlIGVycm9yIGNhbGxiYWNrIGlzIG5vdCBjYWxsZWQgbW9yZSB0aGFuIG9uY2UuJyApO1xuXG5cdFx0XHRyZW1haW5pbmdfcmVqZWN0X3Byb21pc2VzKys7XG5cblx0XHRcdGRvbmUoKTsgLy9Pbmx5IGZpbmlzaCBvbmNlIGFsbCBwcm9taXNlcyBhcmUgcmVqZWN0ZWQuXG5cdFx0fSApO1xuXG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXVsndGVzdDEnXSApID09ICdvYmplY3QnLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDIuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J11bJ3Rlc3QyJ10gKSA9PSAnb2JqZWN0JywgJ3Byb21pc2VzIG9iamVjdCBsZW5ndGggPSAyLicgKTtcblx0XHRUVFByb21pc2UucmVqZWN0KCAndGVzdCcsICd0ZXN0MScgKTtcblx0XHRUVFByb21pc2UucmVqZWN0KCAndGVzdCcsICd0ZXN0MicgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSAxZDogd2FpdChjYXRlZ29yeSkgdHdvIHByb21pc2VzIHdpdGggb25lIHJlamVjdCBvbmUgcmVzb2x2ZSBvbiBjYXRlZ29yeScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7XG5cdFx0dmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTtcblxuXHRcdFRUUHJvbWlzZS5jbGVhckFsbFByb21pc2VzKCk7XG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzICkubGVuZ3RoID09IDAsICdDYWxsYmFjazogcHJvbWlzZXMgb2JqIGxlbmd0aCA9IDAuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0JywgJ3Rlc3QxJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J10gKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlc1tcXCd0ZXN0XFwnXSBleGlzdHMuJyApO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkubGVuZ3RoID09IDEsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMS4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcgKS5sZW5ndGggPT0gMSwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdCkubGVuZ3RoID09IDEnICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAndGVzdCcsICd0ZXN0MicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXNbXFwndGVzdFxcJ10gZXhpc3RzLicgKTtcblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXSApLmxlbmd0aCA9PSAyLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDEuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3QnICkubGVuZ3RoID09IDIsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3QpLmxlbmd0aCA9PSAxJyApO1xuXG5cdFx0cmVtYWluaW5nX3JlamVjdF9wcm9taXNlcyA9IDA7XG5cdFx0VFRQcm9taXNlLndhaXQoICd0ZXN0JywgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCAwID09ICcxJywgJ1RFU1QgUHJvbWlzZSB0ZXN0IHJlc29sdmVkLicgKTsgLy9GYWlsIHRoZSB0ZXN0IGlmIHRoaXMgaXMgY2FsbGVkLCBzaW5jZSB0aGVyZSBpcyBhIHJlamVjdC5cblx0XHRcdGRvbmUoKTtcblx0XHR9LCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVqZWN0KClcblx0XHRcdGFzc2VydC5vayggMSA9PSAnMScsICdURVNUIFByb21pc2UgdGVzdCByZWplY3RlZC4nICk7XG5cblx0XHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3QnICkubGVuZ3RoID09IDEsICdmaWx0ZXJQcm9taXNlQXJyYXkodGVzdCkubGVuZ3RoID09IDEuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcsICd0ZXN0MScgKSA9PSBmYWxzZSwgJ2ZpbHRlclByb21pc2VBcnJheShcInRlc3RcIixcInRlc3QxXCIpIGxlbmd0aCA9IDAuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcsICd0ZXN0MicgKS5sZW5ndGggPT0gMSwgJ2ZpbHRlclByb21pc2VBcnJheShcInRlc3RcIixcInRlc3QyXCIpIGxlbmd0aCA9IDAuJyApO1xuXG5cdFx0XHRhc3NlcnQub2soIHJlbWFpbmluZ19yZWplY3RfcHJvbWlzZXMgPT0gMCwgJ01ha2Ugc3VyZSBlcnJvciBjYWxsYmFjayBpcyBub3QgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLicgKTtcblxuXHRcdFx0cmVtYWluaW5nX3JlamVjdF9wcm9taXNlcysrO1xuXG5cdFx0XHRkb25lKCk7IC8vT25seSBmaW5pc2ggb25jZSBhbGwgcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuXHRcdH0gKTtcblxuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J11bJ3Rlc3QxJ10gKSA9PSAnb2JqZWN0JywgJ3Byb21pc2VzIG9iamVjdCBsZW5ndGggPSAyLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddWyd0ZXN0MiddICkgPT0gJ29iamVjdCcsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMi4nICk7XG5cdFx0VFRQcm9taXNlLnJlamVjdCggJ3Rlc3QnLCAndGVzdDEnICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICd0ZXN0JywgJ3Rlc3QyJyApO1xuXHR9ICk7XG5cblx0UVVuaXQudGVzdCggJ1RUUHJvbWlzZSBDYXNlIDFlOiB3YWl0KGNhdGVnb3J5KSB0d28gcHJvbWlzZXMgd2l0aCBvbmUgcmVzb2x2ZSBhbmQgb25lIHJlamVjdCBvbiBjYXRlZ29yeScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7XG5cdFx0dmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTtcblxuXHRcdFRUUHJvbWlzZS5jbGVhckFsbFByb21pc2VzKCk7XG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzICkubGVuZ3RoID09IDAsICdDYWxsYmFjazogcHJvbWlzZXMgb2JqIGxlbmd0aCA9IDAuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0JywgJ3Rlc3QxJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J10gKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlc1tcXCd0ZXN0XFwnXSBleGlzdHMuJyApO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkubGVuZ3RoID09IDEsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMS4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcgKS5sZW5ndGggPT0gMSwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdCkubGVuZ3RoID09IDEnICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAndGVzdCcsICd0ZXN0MicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXNbXFwndGVzdFxcJ10gZXhpc3RzLicgKTtcblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3QnXSApLmxlbmd0aCA9PSAyLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDEuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3QnICkubGVuZ3RoID09IDIsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3QpLmxlbmd0aCA9PSAxJyApO1xuXG5cdFx0cmVtYWluaW5nX3JlamVjdF9wcm9taXNlcyA9IDA7XG5cdFx0VFRQcm9taXNlLndhaXQoICd0ZXN0JywgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCAwID09ICcxJywgJ1RFU1QgUHJvbWlzZSB0ZXN0IHJlc29sdmVkLicgKTsgLy9GYWlsIHRoZSB0ZXN0IGlmIHRoaXMgaXMgY2FsbGVkLCBzaW5jZSB0aGVyZSBpcyBhIHJlamVjdC5cblx0XHRcdGRvbmUoKTtcblx0XHR9LCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVqZWN0KClcblx0XHRcdGFzc2VydC5vayggMSA9PSAnMScsICdURVNUIFByb21pc2UgdGVzdCByZWplY3RlZC4nICk7XG5cblx0XHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3QnICkubGVuZ3RoID09IDEsICdmaWx0ZXJQcm9taXNlQXJyYXkodGVzdCkubGVuZ3RoID09IDEuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcsICd0ZXN0MScgKS5sZW5ndGggPT0gMSwgJ2ZpbHRlclByb21pc2VBcnJheShcInRlc3RcIixcInRlc3QxXCIpIGxlbmd0aCA9IDAuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdCcsICd0ZXN0MicgKSA9PSBmYWxzZSwgJ2ZpbHRlclByb21pc2VBcnJheShcInRlc3RcIixcInRlc3QyXCIpIGxlbmd0aCA9IDAuJyApO1xuXG5cdFx0XHRhc3NlcnQub2soIHJlbWFpbmluZ19yZWplY3RfcHJvbWlzZXMgPT0gMCwgJ01ha2Ugc3VyZSBlcnJvciBjYWxsYmFjayBpcyBub3QgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLicgKTtcblxuXHRcdFx0cmVtYWluaW5nX3JlamVjdF9wcm9taXNlcysrO1xuXG5cdFx0XHRkb25lKCk7IC8vT25seSBmaW5pc2ggb25jZSBhbGwgcHJvbWlzZXMgYXJlIHJlamVjdGVkLlxuXHRcdH0gKTtcblxuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0J11bJ3Rlc3QxJ10gKSA9PSAnb2JqZWN0JywgJ3Byb21pc2VzIG9iamVjdCBsZW5ndGggPSAyLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdCddWyd0ZXN0MiddICkgPT0gJ29iamVjdCcsICdwcm9taXNlcyBvYmplY3QgbGVuZ3RoID0gMi4nICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICd0ZXN0JywgJ3Rlc3QxJyApO1xuXHRcdFRUUHJvbWlzZS5yZWplY3QoICd0ZXN0JywgJ3Rlc3QyJyApO1xuXHR9ICk7XG5cblx0UVVuaXQudGVzdCggJ1RUUHJvbWlzZSBDYXNlIDI6IHdhaXQoXFwnb25lX29mX21hbnlfY2F0ZWdvcmllc1xcJykuJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgZG9uZSA9IGFzc2VydC5hc3luYygpO1xuXHRcdFRUUHJvbWlzZS5jbGVhckFsbFByb21pc2VzKCk7XG5cblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXMgKS5sZW5ndGggPT0gMCwgJ0NhbGxiYWNrOiBwcm9taXNlcyBvYmogZW1wdHkuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0YScsICd0ZXN0MScgKTtcblx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YScgKS5sZW5ndGggPT0gMSwgJ2ZpbHRlclByb21pc2VBcnJheSh0ZXN0YSkubGVuZ3RoID09IDEuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RhJywgJ3Rlc3QxJyApLmxlbmd0aCA9PSAxLCAnZmlsdGVyUHJvbWlzZUFycmF5KFwidGVzdGFcIixcInRlc3QxXCIpIGxlbmd0aCA9IDEuJyApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ3Rlc3RhJywgJ3Rlc3QyJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RhJyApLmxlbmd0aCA9PSAyLCAnZmlsdGVyUHJvbWlzZUFycmF5KHRlc3RhKS5sZW5ndGggPT0gMi4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdGEnLCAndGVzdDInICkubGVuZ3RoID09IDEsICdmaWx0ZXJQcm9taXNlQXJyYXkoXCJ0ZXN0YVwiLFwidGVzdDFcIikgbGVuZ3RoID0gMS4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAndGVzdGInLCAndGVzdDFiJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RiJyApLmxlbmd0aCA9PSAxLCAnZmlsdGVyUHJvbWlzZUFycmF5KHRlc3RiKS5sZW5ndGggPT0gMScgKTtcblx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YicsICd0ZXN0MWInICkubGVuZ3RoID09IDEsICdmaWx0ZXJQcm9taXNlQXJyYXkoXCJ0ZXN0YlwiLFwidGVzdDFiXCIpIGxlbmd0aCA9IDEuJyApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ3Rlc3RiJywgJ3Rlc3QyYicgKTtcblx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YicgKS5sZW5ndGggPT0gMiwgJ2ZpbHRlclByb21pc2VBcnJheSh0ZXN0YikubGVuZ3RoID09IDIuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RiJywgJ3Rlc3QxYicgKS5sZW5ndGggPT0gMSwgJ2ZpbHRlclByb21pc2VBcnJheShcInRlc3RiXCIsXCJ0ZXN0MWJcIikgbGVuZ3RoID0gMS4nICk7XG5cblx0XHRUVFByb21pc2Uud2FpdCggJ3Rlc3RhJywgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL0RlYnVnLkFycihUVFByb21pc2UsJ0Nhc2UyIFRUUHJvbWlzZScsbnVsbCxudWxsLG51bGwsMTApO1xuXHRcdFx0YXNzZXJ0Lm9rKCAxID09ICcxJywgJ1RFU1QgUHJvbWlzZSB0ZXN0YSByZXNvbHZlZC4nICk7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3RhJ10gKSA9PSAndW5kZWZpbmVkJywgJ3Byb21pc2VzW3Rlc3RhXSBpcyBudWxsLicgKTtcblx0XHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWyd0ZXN0YiddICkgPT0gJ29iamVjdCcsICdwcm9taXNlc1t0ZXN0Yl0gaXMgbm90IG51bGwuJyApO1xuXG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YicgKS5sZW5ndGggPT0gMiwgJ2ZpbHRlclByb21pc2VBcnJheSh0ZXN0YikubGVuZ3RoID09IDEnICk7IC8vb25lIGlzIHJlc29sdmVkLiBzaG91bGQgcmV0dXJuIG9ubHkgMVxuXG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YScsICd0ZXN0MScgKS5sZW5ndGggPT0gMCwgJ2ZpbHRlclByb21pc2VBcnJheShcInRlc3RiXCIsXCJ0ZXN0MWJcIikgbGVuZ3RoID0gJyArIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YScsICd0ZXN0MScgKS5sZW5ndGggKTtcblx0XHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RhJywgJ3Rlc3QyJyApLmxlbmd0aCA9PSAwLCAnZmlsdGVyUHJvbWlzZUFycmF5KFwidGVzdGJcIixcInRlc3QxYlwiKSBsZW5ndGggPSAnICsgVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RhJywgJ3Rlc3QyJyApLmxlbmd0aCApO1xuXHRcdFx0ZG9uZSgpO1xuXHRcdH0gKTtcblxuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAndGVzdGInLCAndGVzdDFiJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAndGVzdGEnLCAndGVzdDEnICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICd0ZXN0YScsICd0ZXN0MicgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSAzOiB3YWl0KG51bGwsIG51bGwsIGNhbGxiYWNrKSBhbGwgY2F0ZW9ncmllcy4nLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdHZhciBkb25lID0gYXNzZXJ0LmFzeW5jKCk7XG5cblx0XHRUVFByb21pc2UuY2xlYXJBbGxQcm9taXNlcygpO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBlbXB0eS4nICk7XG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXMgKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlcyBleGlzdHMuJyApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ3Rlc3RjJywgJ3Rlc3QxJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RjJywgJ3Rlc3QxJyApLmxlbmd0aCA9PSAxLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0Yyx0ZXN0MSkubGVuZ3RoID09IDEsLicgKTtcblx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YycgKS5sZW5ndGggPT0gMSwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdGMpLmxlbmd0aCA9PSAxLC4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAndGVzdGMnLCAndGVzdDInICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdGMnLCAndGVzdDInICkubGVuZ3RoID09IDEsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3RjLHRlc3QxKS5sZW5ndGggPT0gMSwuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RjJyApLmxlbmd0aCA9PSAyLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0YykubGVuZ3RoID09IDIsLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0ZCcsICd0ZXN0MWInICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdGQnLCAndGVzdDFiJyApLmxlbmd0aCA9PSAxLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0ZCx0ZXN0MWIpLmxlbmd0aCA9PSAxLC4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdGMnICkubGVuZ3RoID09IDIsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3RjKS5sZW5ndGggPT0gMiwuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RkJyApLmxlbmd0aCA9PSAxLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0ZCkubGVuZ3RoID09IDEsLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICd0ZXN0ZCcsICd0ZXN0MmInICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdGQnLCAndGVzdDJiJyApLmxlbmd0aCA9PSAxLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0ZCx0ZXN0MmIpLmxlbmd0aCA9PSAxLC4nICk7XG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAndGVzdGMnICkubGVuZ3RoID09IDIsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3RjKS5sZW5ndGggPT0gMiwuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ3Rlc3RkJyApLmxlbmd0aCA9PSAyLCAnVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSh0ZXN0ZCkubGVuZ3RoID09IDIsLicgKTtcblxuXHRcdFRUUHJvbWlzZS53YWl0KCBudWxsLCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1sndGVzdGMnXSApID09ICd1bmRlZmluZWQnLCAncHJvbWlzZXNbdGVzdGNdIGlzIG51bGwuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ3Rlc3RkJ10gKSA9PSAndW5kZWZpbmVkJywgJ3Byb21pc2VzW3Rlc3RkXSBpcyAgbnVsbC4nICk7XG5cdFx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0YycgKS5sZW5ndGggPT0gMCwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdGMpLmxlbmd0aCA9PSAwLC4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICd0ZXN0ZCcgKS5sZW5ndGggPT0gMCwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkodGVzdGQpLmxlbmd0aCA9PSAwLC4nICk7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSApO1xuXG5cdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCkubGVuZ3RoID09IDQsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCkubGVuZ3RoID09IDQnICk7XG5cblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ3Rlc3RkJywgJ3Rlc3QxYicgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ3Rlc3RkJywgJ3Rlc3QyYicgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ3Rlc3RjJywgJ3Rlc3QxJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAndGVzdGMnLCAndGVzdDInICk7XG5cblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSA0OiB3YWl0KGNhdGVnb3J5LCBrZXkpIG9uIGEgc2luZ2xlIHByb21pc2UnLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdHZhciBkb25lID0gYXNzZXJ0LmFzeW5jKCk7XG5cblx0XHRUVFByb21pc2UuY2xlYXJBbGxQcm9taXNlcygpO1xuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBsZW5ndGggPSAwLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnUmVwb3J0cycsICdMb2FkUmVwb3J0cycgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlc1snUmVwb3J0cyddICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXNbXFwndGVzdFxcJ10gZXhpc3RzLicgKTtcblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXNbJ1JlcG9ydHMnXSApLmxlbmd0aCA9PSAxLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDEuJyApO1xuXHRcdGFzc2VydC5vayggVFRQcm9taXNlLmZpbHRlclByb21pc2VBcnJheSggJ1JlcG9ydHMnICkubGVuZ3RoID09IDEsICdUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KHRlc3QpLmxlbmd0aCA9PSAxJyApO1xuXG5cdFx0VFRQcm9taXNlLndhaXQoICdSZXBvcnRzJywgJ0xvYWRSZXBvcnRzJywgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCAxID09ICcxJywgJ1RFU1QgUHJvbWlzZSB0ZXN0IHJlc29sdmVkLicgKTtcblx0XHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzWydSZXBvcnRzJ10gKSA9PSAndW5kZWZpbmVkJywgJ3Byb21pc2VzW1JlcG9ydHNdIGlzIG51bGwuJyApO1xuXHRcdFx0YXNzZXJ0Lm9rKCBUVFByb21pc2UuZmlsdGVyUHJvbWlzZUFycmF5KCAnUmVwb3J0cycgKS5sZW5ndGggPT0gMCwgJ2ZpbHRlclByb21pc2VBcnJheShSZXBvcnRzKS5sZW5ndGggPT0gMC4nICk7XG5cdFx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICdSZXBvcnRzJywgJ0xvYWRSZXBvcnRzJyApID09IGZhbHNlLCAnZmlsdGVyUHJvbWlzZUFycmF5KFwiUmVwb3J0c1wiLFwiTG9hZFJlcG9ydHNcIikgbGVuZ3RoID0gMC4nICk7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSApO1xuXG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ1JlcG9ydHMnXVsnTG9hZFJlcG9ydHMnXSApID09ICdvYmplY3QnLCAncHJvbWlzZXMgb2JqZWN0IGxlbmd0aCA9IDEuJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnUmVwb3J0cycsICdMb2FkUmVwb3J0cycgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSA1OiB3YWl0KGNhdGVnb3J5LCBrZXksZnVuY3Rpb24pIHZzIHdhaXQobnVsbCxudWxsLGZ1bmN0aW9uKScsIGZ1bmN0aW9uKCBhc3NlcnQgKSB7XG5cdFx0dmFyIGRvbmUgPSBhc3NlcnQuYXN5bmMoKTtcblx0XHR2YXIgZ3JvdXBfcHJvbWlzZV90ZXN0ID0gMDtcblxuXHRcdFRUUHJvbWlzZS5jbGVhckFsbFByb21pc2VzKCk7XG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzICkubGVuZ3RoID09IDAsICdDYWxsYmFjazogcHJvbWlzZXMgb2JqIGxlbmd0aCA9IDAuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICdncm91cG9uZScsICdvbmUnICk7XG5cdFx0YXNzZXJ0Lm9rKCB0eXBlb2YgKCBUVFByb21pc2UucHJvbWlzZXNbJ2dyb3Vwb25lJ10gKSA9PSAnb2JqZWN0JywgJ1RUUHJvbWlzZS5wcm9taXNlc1tcXCdncm91cG9uZVxcJ10gZXhpc3RzLicgKTtcblx0XHRhc3NlcnQub2soIE9iamVjdC5rZXlzKCBUVFByb21pc2UucHJvbWlzZXNbJ2dyb3Vwb25lJ10gKS5sZW5ndGggPT0gMSwgJ3Byb21pc2VzIG9iamVjdCBsZW5ndGggPSAxLicgKTtcblx0XHRhc3NlcnQub2soIFRUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoICdncm91cG9uZScgKS5sZW5ndGggPT0gMSwgJ1RUUHJvbWlzZS5maWx0ZXJQcm9taXNlQXJyYXkoZ3JvdXBvbmUpLmxlbmd0aCA9PSAxJyApO1xuXG5cdFx0VFRQcm9taXNlLndhaXQoICdncm91cG9uZScsICdvbmUnLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHREZWJ1Zy5UZXh0KCAnU0lOR0xFIFBST01JU0UgdGVzdCByZXNvbHZlZCBzZWNvbmQuJywgJycsICcnLCAnJywgMTAgKTtcblx0XHRcdGFzc2VydC5vayggZ3JvdXBfcHJvbWlzZV90ZXN0ID09ICcxJywgJ1NJTkdMRSBQUk9NSVNFIHRlc3QgcmVzb2x2ZWQgc2Vjb25kLicgKTtcblx0XHRcdGdyb3VwX3Byb21pc2VfdGVzdCA9IDI7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ2dyb3VwdHdvJywgJ29uZScgKTtcblx0XHRUVFByb21pc2UuYWRkKCAnZ3JvdXB0d28nLCAndHdvJyApO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdncm91cHR3bycsICd0aHJlZScgKTtcblx0XHRUVFByb21pc2Uud2FpdCggbnVsbCwgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCBncm91cF9wcm9taXNlX3Rlc3QgPT0gJzAnLCAnQUxMIFBST01JU0UgdGVzdCByZXNvbHZlZCBmaXJzdC4nICk7XG5cdFx0XHRncm91cF9wcm9taXNlX3Rlc3QgPSAxO1xuXHRcdFx0RGVidWcuVGV4dCggJ0FMTCBQUk9NSVNFIHRlc3QgcmVzb2x2ZWQgZmlyc3QuJywgJycsICcnLCAnJywgMTAgKTtcblx0XHR9ICk7XG5cblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2dyb3VwdHdvJywgJ29uZScgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2dyb3VwdHdvJywgJ3R3bycgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2dyb3Vwb25lJywgJ29uZScgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2dyb3VwdHdvJywgJ3RocmVlJyApO1xuXG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdSZXBvcnRzJywgJ0xvYWRSZXBvcnRzJyApO1xuXHR9ICk7XG5cblx0UVVuaXQudGVzdCggJ1RUUHJvbWlzZSBDYXNlIDY6IHJlc29sdmUgMiwgd2FpdCBvbiAxLCBnbG9iYWwgd2FpdC4nLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdHZhciBkb25lID0gYXNzZXJ0LmFzeW5jKCk7XG5cdFx0dmFyIGdyb3VwX3Byb21pc2VfdGVzdCA9IDA7XG5cblx0XHRUVFByb21pc2UuY2xlYXJBbGxQcm9taXNlcygpO1xuXG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzICkubGVuZ3RoID09IDAsICdDYWxsYmFjazogcHJvbWlzZXMgb2JqIGxlbmd0aCA9IDAuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICdhJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLmFkZCggJ2EnLCAnYicgKTtcblx0XHRUVFByb21pc2UuYWRkKCAnYScsICdjJyApO1xuXG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2InICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2MnICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnYicsICdhJyApO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdiJywgJ2InICk7XG5cblx0XHR2YXIgY2FsbGJhY2tzID0gMTtcblx0XHRUVFByb21pc2Uud2FpdCggJ2EnLCAnYScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly93aWxsIGJlIHJ1biBvbiByZXNvbHZlKClcblx0XHRcdGFzc2VydC5vayggY2FsbGJhY2tzID09IDEsICdhbHJlYWR5IHJlc29sdmVkIHByb21pc2UgcmVzb2x2ZWQgZmlyc3QuJyApO1xuXHRcdFx0Y2FsbGJhY2tzKys7XG5cdFx0fSApO1xuXG5cdFx0VFRQcm9taXNlLndhaXQoIG51bGwsIG51bGwsIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRhc3NlcnQub2soIGNhbGxiYWNrcyA9PSAyLCAnbnVsbCB3YWl0IHJlc29sdmVzIGFmdGVyIGZpcnN0IHJlc29sdXRpb24nICk7XG5cdFx0XHRjYWxsYmFja3MrKztcblx0XHRcdGRvbmUoKTtcblx0XHR9ICk7XG5cblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2InLCAnYScgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2InLCAnYicgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSA3OiByZXNvbHZlIGFscmVhZHkgcmVzb2x2ZWQgc3RhY2sgd2hlbiBvdGhlciBwcm9taXNlcyBleGlzdC4nLCBmdW5jdGlvbiggYXNzZXJ0ICkge1xuXHRcdHZhciBkb25lID0gYXNzZXJ0LmFzeW5jKCk7XG5cdFx0dmFyIGdyb3VwX3Byb21pc2VfdGVzdCA9IDA7XG5cblx0XHRUVFByb21pc2UuY2xlYXJBbGxQcm9taXNlcygpO1xuXG5cdFx0YXNzZXJ0Lm9rKCBPYmplY3Qua2V5cyggVFRQcm9taXNlLnByb21pc2VzICkubGVuZ3RoID09IDAsICdDYWxsYmFjazogcHJvbWlzZXMgb2JqIGxlbmd0aCA9IDAuJyApO1xuXHRcdGFzc2VydC5vayggdHlwZW9mICggVFRQcm9taXNlLnByb21pc2VzICkgPT0gJ29iamVjdCcsICdUVFByb21pc2UucHJvbWlzZXMgZXhpc3RzLicgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICdhJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLmFkZCggJ2EnLCAnYicgKTtcblx0XHRUVFByb21pc2UuYWRkKCAnYScsICdjJyApO1xuXG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2InICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2MnICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnYicsICdhJyApO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdiJywgJ2InICk7XG5cblx0XHR2YXIgY2FsbGJhY2tzID0gMTtcblx0XHRUVFByb21pc2Uud2FpdCggJ2EnLCAnYScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly93aWxsIGJlIHJ1biBvbiByZXNvbHZlKClcblx0XHRcdGFzc2VydC5vayggY2FsbGJhY2tzID09IDEsICdhbHJlYWR5IHJlc29sdmVkIHByb21pc2UgcmVzb2x2ZWQgYmVmb3JlIHJlc29sdmluZyB1bnJlbGF0ZWQgcGVuZGluZyBwcm9taXNlcy4nICk7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSApO1xuXHRcdGNhbGxiYWNrcyA9IDI7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdiJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdiJywgJ2InICk7XG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnVFRQcm9taXNlIENhc2UgODogcmVzb2x2ZSBhbHJlYWR5IHJlc29sdmVkIHdoZW4gb3RoZXIgcHJvbWlzZXMgZXhpc3QuJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgZG9uZSA9IGFzc2VydC5hc3luYygpO1xuXHRcdHZhciBncm91cF9wcm9taXNlX3Rlc3QgPSAwO1xuXG5cdFx0VFRQcm9taXNlLmNsZWFyQWxsUHJvbWlzZXMoKTtcblxuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBsZW5ndGggPSAwLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnYScsICdhJyApO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdhJywgJ2InICk7XG5cdFx0VFRQcm9taXNlLmFkZCggJ2EnLCAnYycgKTtcblxuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnYScsICdhJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnYScsICdiJyApO1xuXHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnYScsICdjJyApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ2InLCAnYScgKTtcblx0XHRUVFByb21pc2UuYWRkKCAnYicsICdiJyApO1xuXG5cdFx0dmFyIGNhbGxiYWNrcyA9IDE7XG5cdFx0VFRQcm9taXNlLndhaXQoICdhJywgbnVsbCwgZnVuY3Rpb24oKSB7XG5cdFx0XHQvL3dpbGwgYmUgcnVuIG9uIHJlc29sdmUoKVxuXHRcdFx0YXNzZXJ0Lm9rKCBjYWxsYmFja3MgPT0gMSwgJ2FscmVhZHkgcmVzb2x2ZWQgcHJvbWlzZSBzdGFjayByZXNvbHZlZCBiZWZvcmUgcmVzb2x2aW5nIHVucmVsYXRlZCBwZW5kaW5nIHByb21pc2VzLicgKTtcblx0XHRcdGRvbmUoKTtcblx0XHR9ICk7XG5cdFx0Y2FsbGJhY2tzID0gMjtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2InLCAnYScgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2InLCAnYicgKTtcblx0fSApO1xuXG5cdFFVbml0LnRlc3QoICdUVFByb21pc2UgQ2FzZSA5OiAzIHBhcmFsbGVsIHN0YWNrcyBvbmx5IDEgYW5kIDMgcmVzb2x2ZS4uJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgZG9uZSA9IGFzc2VydC5hc3luYygpO1xuXHRcdHZhciBncm91cF9wcm9taXNlX3Rlc3QgPSAwO1xuXG5cdFx0VFRQcm9taXNlLmNsZWFyQWxsUHJvbWlzZXMoKTtcblxuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBsZW5ndGggPSAwLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnYScsICdhJyApO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdhJywgJ2InICk7XG5cdFx0VFRQcm9taXNlLmFkZCggJ2EnLCAnYycgKTtcblxuXHRcdFRUUHJvbWlzZS5hZGQoICdiJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLmFkZCggJ2InLCAnYicgKTtcblx0XHRUVFByb21pc2UuYWRkKCAnYicsICdjJyApO1xuXG5cdFx0VFRQcm9taXNlLmFkZCggJ2MnLCAnYScgKTtcblx0XHRUVFByb21pc2UuYWRkKCAnYycsICdiJyApO1xuXHRcdFRUUHJvbWlzZS5hZGQoICdjJywgJ2MnICk7XG5cblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2EnLCAnYScgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2EnLCAnYicgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2EnLCAnYycgKTtcblxuXHRcdHZhciBjYWxsYmFja3MgPSAxO1xuXHRcdFRUUHJvbWlzZS53YWl0KCAnYScsIG51bGwsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly93aWxsIGJlIHJ1biBvbiByZXNvbHZlKClcblx0XHRcdGFzc2VydC5vayggY2FsbGJhY2tzID09IDEsICdhbHJlYWR5IHJlc29sdmVkIHByb21pc2UgcmVzb2x2ZWQgYmVmb3JlIHJlc29sdmluZyB1bnJlbGF0ZWQgcGVuZGluZyBwcm9taXNlcy4nICk7XG5cdFx0XHRjYWxsYmFja3MrKztcblx0XHR9ICk7XG5cblx0XHRUVFByb21pc2Uud2FpdCggJ2InLCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIGNhbGxiYWNrcyA9PSA5OTksICdzaG91bGQgTkVWRVIgcmVvbHZlLicgKTtcblx0XHRcdGNhbGxiYWNrcysrO1xuXHRcdH0gKTtcblx0XHRUVFByb21pc2Uud2FpdCggJ2MnLCBudWxsLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIGNhbGxiYWNrcyA9PSAyLCAnYWxyZWFkeSByZXNvbHZlZCBwcm9taXNlIHJlc29sdmVkIGJlZm9yZSByZXNvbHZpbmcgdW5yZWxhdGVkIHBlbmRpbmcgcHJvbWlzZXMuJyApO1xuXHRcdFx0Y2FsbGJhY2tzKys7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSApO1xuXG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2EnICk7XG5cdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2InICk7XG5cdFx0Ly9UVFByb21pc2UucmVzb2x2ZSgnYScsJ2MnKTsgLy9kbyBub3QgZnVsbHkgcmVzb2x2ZSBiXG5cblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2MnLCAnYScgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2MnLCAnYicgKTtcblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2MnLCAnYycgKTtcblxuXHR9ICk7XG5cblx0UVVuaXQudGVzdCggJ1RUUHJvbWlzZSBDYXNlIDEwOiBpZGVudGljYWwgd2FpdHMgZmFpbC4uJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgZG9uZSA9IGFzc2VydC5hc3luYygpO1xuXHRcdHZhciBncm91cF9wcm9taXNlX3Rlc3QgPSAwO1xuXG5cdFx0VFRQcm9taXNlLmNsZWFyQWxsUHJvbWlzZXMoKTtcblxuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBsZW5ndGggPSAwLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnYScsICdhJyApO1xuXG5cdFx0dmFyIGNhbGxiYWNrcyA9IDE7XG5cdFx0VFRQcm9taXNlLndhaXQoICdhJywgJ2EnLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIGNhbGxiYWNrcyA9PSAxLCAnZmlyc3QgcmVzb2x1dGlvbi4nICk7XG5cdFx0XHRjYWxsYmFja3MrKztcblx0XHR9ICk7XG5cblx0XHRUVFByb21pc2Uud2FpdCggJ2EnLCAnYScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0Ly93aWxsIGJlIHJ1biBvbiByZXNvbHZlKClcblx0XHRcdGFzc2VydC5vayggY2FsbGJhY2tzID09IDIsICdkb2VzIG5vdCByZXNvbHZlIGluIGVycm9yIGNhc2UuJyApO1xuXHRcdFx0Y2FsbGJhY2tzKys7XG5cdFx0fSApO1xuXG5cdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0YXNzZXJ0Lm9rKCBjYWxsYmFja3MgPT0gMywgJ3Nob3VsZCBjb21wbGV0ZSBhZnRlciBib3RoIGNhbGxiYWNrcy4nICk7XG5cdFx0XHRkb25lKCk7XG5cdFx0fSwgNDAwMCApO1xuXG5cdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0VFRQcm9taXNlLnJlc29sdmUoICdhJywgJ2EnICk7XG5cdFx0fSwgMjAwMCApO1xuXG5cdH0gKTtcblxuXHRRVW5pdC50ZXN0KCAnVFRQcm9taXNlIENhc2UgMTE6IGlkZW50aWNhbCB3YWl0cyBmYWlsIGFmdGVyIHJlc29sdXRpb24gb2YgZmlyc3QuJywgZnVuY3Rpb24oIGFzc2VydCApIHtcblx0XHR2YXIgZG9uZSA9IGFzc2VydC5hc3luYygpO1xuXHRcdHZhciBncm91cF9wcm9taXNlX3Rlc3QgPSAwO1xuXG5cdFx0VFRQcm9taXNlLmNsZWFyQWxsUHJvbWlzZXMoKTtcblxuXHRcdGFzc2VydC5vayggT2JqZWN0LmtleXMoIFRUUHJvbWlzZS5wcm9taXNlcyApLmxlbmd0aCA9PSAwLCAnQ2FsbGJhY2s6IHByb21pc2VzIG9iaiBsZW5ndGggPSAwLicgKTtcblx0XHRhc3NlcnQub2soIHR5cGVvZiAoIFRUUHJvbWlzZS5wcm9taXNlcyApID09ICdvYmplY3QnLCAnVFRQcm9taXNlLnByb21pc2VzIGV4aXN0cy4nICk7XG5cblx0XHRUVFByb21pc2UuYWRkKCAnYScsICdhJyApO1xuXG5cdFx0dmFyIGNhbGxiYWNrcyA9IDE7XG5cdFx0VFRQcm9taXNlLndhaXQoICdhJywgJ2EnLCBmdW5jdGlvbigpIHtcblx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRhc3NlcnQub2soIGNhbGxiYWNrcyA9PSAxLCAnZmlyc3QgcmVzb2x1dGlvbi4nICk7XG5cdFx0XHRjYWxsYmFja3MrKztcblx0XHR9ICk7XG5cblx0XHRUVFByb21pc2UucmVzb2x2ZSggJ2EnLCAnYScgKTtcblxuXHRcdHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFRUUHJvbWlzZS53YWl0KCAnYScsICdhJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdC8vd2lsbCBiZSBydW4gb24gcmVzb2x2ZSgpXG5cdFx0XHRcdGFzc2VydC5vayggY2FsbGJhY2tzID09IDIsICdkb2VzIG5vdCByZXNvbHZlIGluIGVycm9yIGNhc2U6IGNhbGxiYWNrczogJyArIGNhbGxiYWNrcyApO1xuXHRcdFx0XHRjYWxsYmFja3MrKztcblx0XHRcdH0gKTtcblxuXHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRhc3NlcnQub2soIGNhbGxiYWNrcyA9PSAzLCAnc2hvdWxkIGNvbXBsZXRlIGFmdGVyIGJvdGggY2FsbGJhY2tzLicgKTtcblx0XHRcdFx0ZG9uZSgpO1xuXHRcdFx0fSwgODAwMCApO1xuXG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFRUUHJvbWlzZS5yZXNvbHZlKCAnYScsICdhJyApO1xuXHRcdFx0fSwgNTAwMCApO1xuXHRcdH0sIDIwMDAgKTtcblxuXHR9ICk7XG59XG5cbmZ1bmN0aW9uIGhhc0R1cGxpY2F0ZXMoIGFycmF5LCBhc3NlcnQgKSB7XG5cdHZhciB2YWx1ZXNTb0ZhciA9IE9iamVjdC5jcmVhdGUoIG51bGwgKTtcblx0Zm9yICggdmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kgKSB7XG5cdFx0dmFyIHZhbHVlID0gYXJyYXlbaV07XG5cdFx0aWYgKCB2YWx1ZSBpbiB2YWx1ZXNTb0ZhciApIHtcblx0XHRcdGFzc2VydC5vayggMSA9PSAyLCB2YWx1ZSArICcgSXMgbm90IHVuaXF1ZS4nICk7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdFx0dmFsdWVzU29GYXJbdmFsdWVdID0gdHJ1ZTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIG91dHB1dF9zeXN0ZW1fZGF0YSggdmFsICkge1xuXHRzd2l0Y2ggKCB2YWwgKSB7XG5cdFx0Y2FzZSAnMCc6XG5cdFx0XHRpZiAoIExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfb3Blbl9wcmltYXJ5X2NvbnRyb2xsZXIgKSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fcHJpbWFyeV9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdERlYnVnLlRleHQoICdQcmltYXJ5IGN1cnJlbnRfZWRpdF9yZWNvcmQgZG9lcyBub3QgZXhpc3QuJywgJ2RlYnVnUGFuZWxDb250cm9sbGVyLmpzJywgJycsICckKGRvY3VtZW50KS5vbihcXCdjaGFuZ2VcXCcsIFxcJyN0dF9vdXRwdXRfdmFyaWFibGVfc2VsZWN0XFwnKScsIDEwICk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICcxJzpcblx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3JlcG9ydF9jb250cm9sbGVyICkge1xuXHRcdFx0XHRjb25zb2xlLmxvZyggTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3JlcG9ydF9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdERlYnVnLlRleHQoICdSZXBvcnQgY3VycmVudF9lZGl0X3JlY29yZCBkb2VzIG5vdCBleGlzdC4nLCAnZGVidWdQYW5lbENvbnRyb2xsZXIuanMnLCAnJywgJyQoZG9jdW1lbnQpLm9uKFxcJ2NoYW5nZVxcJywgXFwnI3R0X291dHB1dF92YXJpYWJsZV9zZWxlY3RcXCcpJywgMTAgKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJzInOlxuXHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fc3ViX2NvbnRyb2xsZXIgKSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fc3ViX2NvbnRyb2xsZXIuY3VycmVudF9lZGl0X3JlY29yZCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0RGVidWcuVGV4dCggJ1N1YiBDb250cm9sbGVyIGN1cnJlbnRfZWRpdF9yZWNvcmQgZG9lcyBub3QgZXhpc3QuJywgJ2RlYnVnUGFuZWxDb250cm9sbGVyLmpzJywgJycsICckKGRvY3VtZW50KS5vbihcXCdjaGFuZ2VcXCcsIFxcJyN0dF9vdXRwdXRfdmFyaWFibGVfc2VsZWN0XFwnKScsIDEwICk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0XHRjYXNlICczJzpcblx0XHRcdGlmICggTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX2VkaXRfb25seV9jb250cm9sbGVyICkge1xuXHRcdFx0XHRjb25zb2xlLmxvZyggTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX2VkaXRfb25seV9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdERlYnVnLlRleHQoICdFZGl0IE9ubHkgY3VycmVudF9lZGl0X3JlY29yZCBkb2VzIG5vdCBleGlzdC4nLCAnZGVidWdQYW5lbENvbnRyb2xsZXIuanMnLCAnJywgJyQoZG9jdW1lbnQpLm9uKFxcJ2NoYW5nZVxcJywgXFwnI3R0X291dHB1dF92YXJpYWJsZV9zZWxlY3RcXCcpJywgMTAgKTtcblx0XHRcdH1cblx0XHRcdGJyZWFrO1xuXHRcdGNhc2UgJzQnOlxuXHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fd2l6YXJkX2NvbnRyb2xsZXJzLmxlbmd0aCA+IDAgKSB7XG5cdFx0XHRcdGZvciAoIGxldCBpID0gMDsgaSA8IExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfb3Blbl93aXphcmRfY29udHJvbGxlcnMubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdFx0aWYgKCBMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fd2l6YXJkX2NvbnRyb2xsZXJzW2ldLmN1cnJlbnRfZWRpdF9yZWNvcmQgKSB7XG5cdFx0XHRcdFx0XHRjb25zb2xlLmxvZyggTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3dpemFyZF9jb250cm9sbGVyc1tpXS5jdXJyZW50X2VkaXRfcmVjb3JkICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHREZWJ1Zy5UZXh0KCAnV2l6YXJkIGN1cnJlbnRfZWRpdF9yZWNvcmQgZG9lcyBub3QgZXhpc3QuJywgJ2RlYnVnUGFuZWxDb250cm9sbGVyLmpzJywgJycsICckKGRvY3VtZW50KS5vbihcXCdjaGFuZ2VcXCcsIFxcJyN0dF9vdXRwdXRfdmFyaWFibGVfc2VsZWN0XFwnKScsIDEwICk7XG5cdFx0XHR9XG5cdFx0XHRicmVhaztcblx0fVxufVxuXG53aW5kb3cuZGVidWdfcGFuZWxfaHRtbCA9IGBcblx0XHQ8ZGl2IGlkPSd0dF9kZWJ1Z19jb25zb2xlJyBzdHlsZT0nd2lkdGg6MzAwcHQ7IGJhY2tncm91bmQtY29sb3I6I2ZmZmZmZjsgYm9yZGVyOjFweCBzb2xpZCAjMDAwMDAwOyBwYWRkaW5nOjJlbTsgcG9zaXRpb246YWJzb2x1dGU7IGJvdHRvbTowcHg7IHJpZ2h0OjBweDsgei1pbmRleDoxMDAwOyBib3JkZXItcmFkaXVzLXRvcC1sZWZ0OjEwcHg7IGJvcmRlci1yYWRpdXMtdG9wLXJpZ2h0OjEwcHg7Jz5cblx0XHQ8YSBzdHlsZT0nZmxvYXQ6cmlnaHQ7IHBhZGRpbmc6MTBweDsgdGV4dC1hbGlnbjpjZW50ZXI7IGNvbG9yOnJlZDsgZm9udC13ZWlnaHQ6Ym9sZGVyOyBoZWlnaHQ6MTBweDsgd2lkdGg6MTBweDsnIGNsYXNzPSd0dF9kZWJ1Z19jbG9zZV9idG4nIGhyZWY9JyMnPng8L2E+XG5cdFx0PGgzPkRldmVsb3BlciBUb29scyAoPHNwYW4+djwvc3Bhbj48c3BhbiBjbGFzcz0ndHRfdmVyc2lvbic+PC9zcGFuPik8L2gzPlxuXHRcdDxocj5cblx0XHQ8ZGl2IGNsYXNzPSdyb3cnIGlkPSdlbmFibGVkX3Jvdycgc3R5bGU9J1wiK3Jvd3N0eWxlK1wiJz5cblx0XHRcdDxpbnB1dCB0eXBlPSdjaGVja2JveCcgaWQ9J3R0X2RlYnVnX2VuYWJsZV9jaGVja2JveCcgY2hlY2tlZD0nXCIrIGlzX2VuYWJsZWQgK1wiJz4mbmJzcDtFbmFibGUgQ29uc29sZSBMb2dnaW5nXG5cdFx0PC9kaXY+XG5cdFx0PGhyPlxuXHRcdDxkaXYgY2xhc3M9J3JvdycgaWQ9J3NldF92ZXJib3NpdHlfcm93JyBzdHlsZT0nXCIrcm93c3R5bGUrXCInPlxuXHRcdFx0PHNwYW4+RGVidWcgVmVyYm9zaXR5XG5cdFx0XHRcdDxzZWxlY3QgaWQ9XCJ0dF9kZWJ1Z19leGNlcHRpb25fdmVyYm9zaXR5XCI+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjBcIj4wPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjFcIj4xPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjJcIj4yPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjNcIj4zPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjRcIj40PC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjVcIj41PC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjZcIj42PC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjdcIj43PC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjhcIj44PC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjlcIj45PC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjEwXCI+MTA8L29wdGlvbj5cblx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiMTFcIj4xMTwvb3B0aW9uPlxuXHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdDwvc3Bhbj5cblx0XHQ8L2Rpdj5cblx0XHQ8aHI+XG5cdFx0PGRpdiBjbGFzcz0ncm93JyBpZD0ndHJpZ2dlcl9qc19leGNlcHRpb25fcm93JyBzdHlsZT0nXCIrcm93c3R5bGUrXCInPlxuXHRcdFx0PHNwYW4+SmF2YXNjcmlwdCBFcnJvcnNcblx0XHRcdFx0PHNlbGVjdCBpZD1cInR0X2RlYnVnX2V4Y2VwdGlvbl90eXBlX3NlbGVjdFwiPlxuXHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCJqc19lcnJvclwiPkphdmFTY3JpcHQgRXJyb3I8L29wdGlvbj5cblx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwianNfbG9hZF9zY3JpcHRfcGFyc2VyX2Vycm9yXCI+U2NyaXB0IExvYWQgUGFyc2VyIEVycm9yPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cImpzX2xvYWRfc2NyaXB0XzQwNF9lcnJvclwiPlNjcmlwdCBMb2FkIDQwNDwvb3B0aW9uPlxuXHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdDwvc3Bhbj5cblx0XHRcdDxzcGFuPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSd0LWJ1dHRvbicgaWQ9J3RyaWdnZXJfanNfZXhjZXB0aW9uX2J1dHRvbic+VHJpZ2dlcjwvZGl2PlxuXHRcdFx0PC9zcGFuPlxuXHRcdDwvZGl2PlxuXHRcdDxocj5cblx0XG5cdFx0PGRpdiBjbGFzcz0ncm93JyBpZD0ndHJpZ2dlcl9sb2dpbl90aW1lb3V0X3Jvdycgc3R5bGU9J1wiK3Jvd3N0eWxlK1wiJz5cblx0XHRcdDxwPk5vdGU6IFRvIHRyaWdnZXIgaWRsZSwgbXVzdCBhbHNvIGNsZWFyIHRoZSBzZXNzaW9uIGF0IHRoZSBkYjwvcD5cblx0XHRcdDxkaXYgY2xhc3M9J3QtYnV0dG9uJyBpZD0ndHJpZ2dlcl9qc190aW1lb3V0X2J1dHRvbic+VHJpZ2dlciBJZGxlPC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PGhyPlxuXHRcdDxkaXYgY2xhc3M9J3JvdycgaWQ9J3R0X292ZXJsYXlfZGlzYWJsZV9yb3cnIHN0eWxlPSdcIityb3dzdHlsZStcIic+XG5cdFx0XHQ8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSd0dF9vdmVybGF5X2Rpc2FibGVfY2hlY2tib3gnIGNoZWNrZWQ9J1wiKyBvdmVybGF5X2lzX2VuYWJsZWQgK1wiJz4gRW5hYmxlIFVuaXQgVGVzdGluZyBNb2RlXG5cdFx0PC9kaXY+XG5cdFx0PGI+VW5pdCBUZXN0aW5nPC9iPlxuXHRcdDxkaXYgY2xhc3M9J3JvdycgaWQ9J3F1bml0X3Jvdycgc3R5bGU9J1wiK3Jvd3N0eWxlK1wiJz5cblx0XHRcdDxkaXYgY2xhc3M9J3QtYnV0dG9uJyBpZD0ncXVuaXRfdGVzdF9idXR0b24nPlJ1biBVbml0IFRlc3RzPC9kaXY+XG5cdFx0XHQ8ZGl2IGNsYXNzPSd0LWJ1dHRvbicgaWQ9J2dyaWRfdGVzdCc+UnVuIEdyaWQgVGVzdHM8L2Rpdj5cblx0XHRcdDxkaXYgY2xhc3M9J3QtYnV0dG9uJyBpZD0nYXdlc29tZWJveF90ZXN0Jz5SdW4gQXdlc29tZWJveCBUZXN0czwvZGl2PlxuXHRcdFx0PGRpdiBjbGFzcz0ndC1idXR0b24nIGlkPSdXaWRnZXRUZXN0X3Rlc3QnPlJ1biBXaWRnZXQgVGVzdHM8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8aHI+XG5cdFx0PGRpdiBjbGFzcz0ncm93JyBpZD0nb3V0cHV0X3ZhcmlhYmxlX3NlbGVjdF9yb3cnIHN0eWxlPSdcIityb3dzdHlsZStcIic+XG5cdFx0XHQ8c3Bhbj5TaG93IERhdGE6XG5cdFx0XHRcdDxzZWxlY3QgaWQ9XCJ0dF9vdXRwdXRfdmFyaWFibGVfc2VsZWN0XCI+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIi0xXCI+LS0gU2VsZWN0IG9uZSAtLTwvb3B0aW9uPlxuXHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCIwXCI+UHJpbWFyeSBjb250cm9sbGVyLT5jdXJyZW50X2VkaXRfcmVjb3JkPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjFcIj5SZXBvcnQgY29udHJvbGxlci0+Y3VycmVudF9lZGl0X3JlY29yZDwvb3B0aW9uPlxuXHRcdFx0XHRcdDxvcHRpb24gdmFsdWU9XCIyXCI+U3ViIGNvbnRyb2xsZXItPmN1cnJlbnRfZWRpdF9yZWNvcmQ8L29wdGlvbj5cblx0XHRcdFx0XHQ8b3B0aW9uIHZhbHVlPVwiM1wiPkVkaXQgT25seSBjb250cm9sbGVyLT5jdXJyZW50X2VkaXRfcmVjb3JkPC9vcHRpb24+XG5cdFx0XHRcdFx0PG9wdGlvbiB2YWx1ZT1cIjRcIj5XaXphcmQgY29udHJvbGxlci0+Y3VycmVudF9lZGl0X3JlY29yZDwvb3B0aW9uPlxuXHRcdFx0XHQ8L3NlbGVjdD5cblx0XHRcdDwvc3Bhbj5cblx0XHRcdDxzcGFuPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPSd0LWJ1dHRvbicgaWQ9J3RyaWdnZXJfb3V0cHV0X3ZhcmlhYmxlX3NlbGVjdCc+U2hvdzwvZGl2PlxuXHRcdFx0PC9zcGFuPlxuXHRcdDwvZGl2PlxuXHRcdDxocj5cblx0XHQ8ZGl2IGNsYXNzPVwicm93XCI+XG5cdFx0XHQ8aDM+YnJlYWtPbigpIGlzIGFjdGl2ZSA8L2gzPlxuXHRcdFx0PHA+dXNhZ2U6IGJyZWFrT24obXlPYmplY3QsICdteVByb3BlcnR5Jyk7PC9wPlxuXHRcdDwvZGl2PlxuXHRcdDwhLS0ga2VlcCBvcmRlciAtLT5cblx0XHQ8aHI+XG5cdFx0PGRpdiBjbGFzcz0ncm93JyBpZD0nZXhlY3V0ZV9zY3JpcHRfcm93JyBzdHlsZT0nXCIrcm93c3R5bGUrXCInPlxuXHRcdFx0PGI+U2NyaXB0IEV4ZWN1dG9yPC9iPlxuXHRcdFx0PHRleHRhcmVhIGlkPSdhcmJpdHJhcnlfc2NyaXB0JyBzdHlsZT1cIndpZHRoOjEwMCU7XCIgcm93cz1cIjVcIj48L3RleHRhcmVhPlxuXHRcdFx0PGRpdiBjbGFzcz0ndC1idXR0b24nIGlkPSd0cmlnZ2VyX2FyYml0cmFyeV9zY3JpcHQnPlJ1biBKczwvZGl2PlxuXHRcdDwvZGl2PlxuXHRcdDxocj5cblx0XHQ8ZGl2IGNsYXNzPSdyb3cnIHN0eWxlPSdcIityb3dzdHlsZStcIic+XG5cdFx0XHQ8ZGl2IGNsYXNzPSd0LWJ1dHRvbicgaWQ9J2xvYWRfdnVlX3Rlc3RfYnV0dG9uJz5Mb2FkIFZ1ZSBUZXN0IFZpZXc8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0PC9kaXY+XG5cdDxkaXYgaWQ9XCJxdW5pdF9jb250YWluZXJcIiBzdHlsZT1cImRpc3BsYXk6bm9uZTtcIj5cblx0XHQ8ZGl2IGlkPVwicXVuaXRcIj48L2Rpdj5cblx0XHQ8ZGl2IGlkPVwicXVuaXQtZml4dHVyZVwiPjwvZGl2PlxuXHQ8L2Rpdj5cblx0YDtcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8038\n")}}]);