(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["wizard-import_csv-ImportCSVWizardController","filebrowser-TImageBrowser"],{8326:(__unused_webpack_module,__unused_webpack_exports,__webpack_require__)=>{eval("/* provided dependency */ var jQuery = __webpack_require__(9755);\n( function( $ ) {\n\n\t$.fn.TImageBrowser = function( options ) {\n\t\tGlobal.addCss( 'global/widgets/filebrowser/TImageBrowser.css' );\n\t\tvar opts = $.extend( {}, $.fn.TImageBrowser.defaults, options );\n\n\t\tvar $this = this;\n\t\tvar field;\n\t\tvar id = 'file_browser';\n\t\tvar name = 'filedata';\n\t\tvar browser;\n\n\t\tvar accept_filter = '';\n\n\t\tvar default_width = 177;\n\t\tvar default_height = 42;\n\t\tvar enabled = true;\n\n\t\tthis.setEnabled = function( val ) {\n\t\t\tenabled = val;\n\n\t\t\tvar btn = this.find( '.browser-form input' );\n\n\t\t\tif ( !val ) {\n\t\t\t\tbtn.attr( 'disabled', true );\n\t\t\t\tbtn.removeClass( 'disable-element' ).addClass( 'disable-element' );\n\t\t\t} else {\n\t\t\t\tbtn.removeAttr( 'disabled' );\n\t\t\t\tbtn.removeClass( 'disable-element' );\n\t\t\t}\n\n\t\t};\n\n\t\tthis.clearErrorStyle = function() {\n\n\t\t};\n\n\t\tthis.getFileName = function() {\n\n\t\t\treturn browser.val();\n\t\t};\n\n\t\tthis.getField = function() {\n\t\t\treturn field;\n\t\t};\n\n\t\tthis.setEnableDelete = function( val ) {\n\t\t\tvar image = $this.find( '.image' );\n\t\t\tif ( !val ) {\n\t\t\t\timage.removeAttr( 'enable-delete' );\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\timage.attr( 'enable-delete', 1 );\n\t\t\t}\n\t\t};\n\n\t\tthis.getValue = function() {\n\t\t\tvar form_data;\n\t\t\tif ( browser && browser.val() ) {\n\n\t\t\t\tif ( typeof FormData == 'undefined' ) {\n\t\t\t\t\tform_data = $this.find( '.browser-form' );\n\t\t\t\t} else {\n\t\t\t\t\tform_data = new FormData( $( $this.find( '.browser-form' ) )[0] );\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\tform_data = null;\n\t\t\t}\n\n\t\t\treturn form_data;\n\t\t};\n\n\t\tthis.getImageSrc = function() {\n\t\t\tvar image = $this.find( '.image' );\n\t\t\treturn image.attr( 'src' );\n\t\t};\n\n\t\tthis.setImage = function( val ) {\n\t\t\tvar image = $this.find( '.image' );\n\n\t\t\tif ( !val ) {\n\t\t\t\timage.attr( 'src', '' );\n\t\t\t\timage.hide();\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar d = new Date();\n\t\t\timage.hide();\n\t\t\timage.attr( 'src', val + '&t=' + d.getTime() );\n\t\t\timage.css( 'height', 'auto' );\n\t\t\timage.css( 'width', 'auto' );\n\n\t\t};\n\n\t\tvar onImageLoad = function( image ) {\n\n\t\t\tvar image_height = $( image ).height() > 0 ? $( image ).height() : image.naturalHeight;\n\t\t\tvar image_width = $( image ).width() > 0 ? $( image ).width() : image.naturalWidth;\n\n\t\t\tif ( image_height > default_height ) {\n\t\t\t\t$( image ).css( 'height', default_height );\n\n\t\t\t}\n\n\t\t\tif ( image_width > default_width ) {\n\t\t\t\t$( image ).css( 'width', default_width );\n\t\t\t\t$( image ).css( 'height', 'auto' );\n\t\t\t}\n\n\t\t\t$this.trigger( 'setSize' );\n\n\t\t\tif ( image_height < 5 ) {\n\t\t\t\t$( image ).hide();\n\t\t\t} else {\n\t\t\t\t$( image ).show();\n\t\t\t}\n\t\t};\n\n\t\tthis.setValue = function( val ) {\n\n\t\t\tif ( !val ) {\n\t\t\t\tval = '';\n\t\t\t}\n\n\t\t};\n\n\t\tthis.each( function() {\n\t\t\tvar o = $.meta ? $.extend( {}, opts, $( this ).data() ) : opts;\n\n\t\t\tfield = o.field;\n\n\t\t\t// var $this = this;\n\n\t\t\tif ( o.default_width > 0 ) {\n\t\t\t\tdefault_width = o.default_width;\n\t\t\t}\n\n\t\t\tif ( o.default_height > 0 ) {\n\t\t\t\tdefault_height = o.default_height;\n\t\t\t}\n\n\t\t\tif ( Global.isSet( o.name ) ) {\n\t\t\t\tname = o.name;\n\t\t\t}\n\n\t\t\tif ( Global.isSet( accept_filter ) ) {\n\t\t\t\taccept_filter = o.accept_filter;\n\t\t\t}\n\n\t\t\tbrowser = $( this ).find( '.browser' );\n\t\t\tvar image = $( this ).find( '.image' );\n\t\t\timage.hide();\n\t\t\timage.on( 'load', function() {\n\t\t\t\tonImageLoad( this );\n\n\t\t\t} );\n\n\t\t\tif ( accept_filter ) {\n\t\t\t\tbrowser.attr( 'accept', accept_filter );\n\t\t\t} else {\n\t\t\t\taccept_filter = 'image/*';\n\t\t\t\tbrowser.attr( 'accept', 'image/*' );\n\t\t\t}\n\n\t\t\tbrowser.attr( 'id', id );\n\t\t\tbrowser.attr( 'name', name );\n\n\t\t\tif ( Global.isSet( o.changeHandler ) ) {\n\n\t\t\t\t$this.bind( 'imageChange', o.changeHandler );\n\t\t\t}\n\t\t\tif ( Global.isSet( o.deleteImageHandler ) ) {\n\t\t\t\tthis.find( '.file-browser' ).on( 'deleteClick', function() {\n\t\t\t\t\to.deleteImageHandler();\n\t\t\t\t} );\n\n\t\t\t}\n\n\t\t\tbrowser.bind( 'change', function() {\n\t\t\t\timage.hide();\n\n\t\t\t\tif ( typeof FileReader != 'undefined' ) {\n\n\t\t\t\t\tvar files = !!this.files ? this.files : [];\n\n\t\t\t\t\t// If no files were selected, or no FileReader support, return\n\t\t\t\t\tif ( !files.length || !window.FileReader ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tif ( accept_filter === 'image/*' ) {\n\t\t\t\t\t\t// Create a new instance of the FileReader\n\t\t\t\t\t\tvar reader = new FileReader();\n\n\t\t\t\t\t\t// Read the local file as a DataURL\n\t\t\t\t\t\treader.readAsDataURL( files[0] );\n\n\t\t\t\t\t\t// When loaded, set image data as background of div\n\t\t\t\t\t\treader.onloadend = function() {\n\t\t\t\t\t\t\tvar url = this.result;\n\t\t\t\t\t\t\timage.attr( 'src', url );\n\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t}\n\n\t\t\t\t$this.trigger( 'imageChange', [$this] );\n\n\t\t\t} );\n\n\t\t} );\n\n\t\treturn this;\n\n\t};\n\n\t$.fn.TImageBrowser.defaults = {};\n\t$.fn.TImageBrowser.html_template = `\n\t
\n\t\t
\n\t\t
\n\t
\n\t`;\n\n} )( jQuery );//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiODMyNi5qcyIsIm1hcHBpbmdzIjoiO0FBQUE7O0FBRUE7QUFDQTtBQUNBLHlCQUF5Qjs7QUFFekI7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBOztBQUVBOztBQUVBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsTUFBTTtBQUNOO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQSxLQUFLO0FBQ0w7QUFDQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBLGdDQUFnQzs7QUFFaEM7O0FBRUE7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUEsS0FBSzs7QUFFTDtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxNQUFNOztBQUVOOztBQUVBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTs7QUFFQSxLQUFLOztBQUVMLElBQUk7O0FBRUo7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLEVBQUUsR0FBRyxNQUFNIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L2dsb2JhbC93aWRnZXRzL2ZpbGVicm93c2VyL1RJbWFnZUJyb3dzZXIuanM/MjAyOSJdLCJzb3VyY2VzQ29udGVudCI6WyIoIGZ1bmN0aW9uKCAkICkge1xuXG5cdCQuZm4uVEltYWdlQnJvd3NlciA9IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdEdsb2JhbC5hZGRDc3MoICdnbG9iYWwvd2lkZ2V0cy9maWxlYnJvd3Nlci9USW1hZ2VCcm93c2VyLmNzcycgKTtcblx0XHR2YXIgb3B0cyA9ICQuZXh0ZW5kKCB7fSwgJC5mbi5USW1hZ2VCcm93c2VyLmRlZmF1bHRzLCBvcHRpb25zICk7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBmaWVsZDtcblx0XHR2YXIgaWQgPSAnZmlsZV9icm93c2VyJztcblx0XHR2YXIgbmFtZSA9ICdmaWxlZGF0YSc7XG5cdFx0dmFyIGJyb3dzZXI7XG5cblx0XHR2YXIgYWNjZXB0X2ZpbHRlciA9ICcnO1xuXG5cdFx0dmFyIGRlZmF1bHRfd2lkdGggPSAxNzc7XG5cdFx0dmFyIGRlZmF1bHRfaGVpZ2h0ID0gNDI7XG5cdFx0dmFyIGVuYWJsZWQgPSB0cnVlO1xuXG5cdFx0dGhpcy5zZXRFbmFibGVkID0gZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdGVuYWJsZWQgPSB2YWw7XG5cblx0XHRcdHZhciBidG4gPSB0aGlzLmZpbmQoICcuYnJvd3Nlci1mb3JtIGlucHV0JyApO1xuXG5cdFx0XHRpZiAoICF2YWwgKSB7XG5cdFx0XHRcdGJ0bi5hdHRyKCAnZGlzYWJsZWQnLCB0cnVlICk7XG5cdFx0XHRcdGJ0bi5yZW1vdmVDbGFzcyggJ2Rpc2FibGUtZWxlbWVudCcgKS5hZGRDbGFzcyggJ2Rpc2FibGUtZWxlbWVudCcgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ0bi5yZW1vdmVBdHRyKCAnZGlzYWJsZWQnICk7XG5cdFx0XHRcdGJ0bi5yZW1vdmVDbGFzcyggJ2Rpc2FibGUtZWxlbWVudCcgKTtcblx0XHRcdH1cblxuXHRcdH07XG5cblx0XHR0aGlzLmNsZWFyRXJyb3JTdHlsZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0fTtcblxuXHRcdHRoaXMuZ2V0RmlsZU5hbWUgPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0cmV0dXJuIGJyb3dzZXIudmFsKCk7XG5cdFx0fTtcblxuXHRcdHRoaXMuZ2V0RmllbGQgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmaWVsZDtcblx0XHR9O1xuXG5cdFx0dGhpcy5zZXRFbmFibGVEZWxldGUgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0dmFyIGltYWdlID0gJHRoaXMuZmluZCggJy5pbWFnZScgKTtcblx0XHRcdGlmICggIXZhbCApIHtcblx0XHRcdFx0aW1hZ2UucmVtb3ZlQXR0ciggJ2VuYWJsZS1kZWxldGUnICk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGltYWdlLmF0dHIoICdlbmFibGUtZGVsZXRlJywgMSApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHR0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgZm9ybV9kYXRhO1xuXHRcdFx0aWYgKCBicm93c2VyICYmIGJyb3dzZXIudmFsKCkgKSB7XG5cblx0XHRcdFx0aWYgKCB0eXBlb2YgRm9ybURhdGEgPT0gJ3VuZGVmaW5lZCcgKSB7XG5cdFx0XHRcdFx0Zm9ybV9kYXRhID0gJHRoaXMuZmluZCggJy5icm93c2VyLWZvcm0nICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Zm9ybV9kYXRhID0gbmV3IEZvcm1EYXRhKCAkKCAkdGhpcy5maW5kKCAnLmJyb3dzZXItZm9ybScgKSApWzBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRmb3JtX2RhdGEgPSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm9ybV9kYXRhO1xuXHRcdH07XG5cblx0XHR0aGlzLmdldEltYWdlU3JjID0gZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaW1hZ2UgPSAkdGhpcy5maW5kKCAnLmltYWdlJyApO1xuXHRcdFx0cmV0dXJuIGltYWdlLmF0dHIoICdzcmMnICk7XG5cdFx0fTtcblxuXHRcdHRoaXMuc2V0SW1hZ2UgPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdFx0dmFyIGltYWdlID0gJHRoaXMuZmluZCggJy5pbWFnZScgKTtcblxuXHRcdFx0aWYgKCAhdmFsICkge1xuXHRcdFx0XHRpbWFnZS5hdHRyKCAnc3JjJywgJycgKTtcblx0XHRcdFx0aW1hZ2UuaGlkZSgpO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciBkID0gbmV3IERhdGUoKTtcblx0XHRcdGltYWdlLmhpZGUoKTtcblx0XHRcdGltYWdlLmF0dHIoICdzcmMnLCB2YWwgKyAnJnQ9JyArIGQuZ2V0VGltZSgpICk7XG5cdFx0XHRpbWFnZS5jc3MoICdoZWlnaHQnLCAnYXV0bycgKTtcblx0XHRcdGltYWdlLmNzcyggJ3dpZHRoJywgJ2F1dG8nICk7XG5cblx0XHR9O1xuXG5cdFx0dmFyIG9uSW1hZ2VMb2FkID0gZnVuY3Rpb24oIGltYWdlICkge1xuXG5cdFx0XHR2YXIgaW1hZ2VfaGVpZ2h0ID0gJCggaW1hZ2UgKS5oZWlnaHQoKSA+IDAgPyAkKCBpbWFnZSApLmhlaWdodCgpIDogaW1hZ2UubmF0dXJhbEhlaWdodDtcblx0XHRcdHZhciBpbWFnZV93aWR0aCA9ICQoIGltYWdlICkud2lkdGgoKSA+IDAgPyAkKCBpbWFnZSApLndpZHRoKCkgOiBpbWFnZS5uYXR1cmFsV2lkdGg7XG5cblx0XHRcdGlmICggaW1hZ2VfaGVpZ2h0ID4gZGVmYXVsdF9oZWlnaHQgKSB7XG5cdFx0XHRcdCQoIGltYWdlICkuY3NzKCAnaGVpZ2h0JywgZGVmYXVsdF9oZWlnaHQgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGltYWdlX3dpZHRoID4gZGVmYXVsdF93aWR0aCApIHtcblx0XHRcdFx0JCggaW1hZ2UgKS5jc3MoICd3aWR0aCcsIGRlZmF1bHRfd2lkdGggKTtcblx0XHRcdFx0JCggaW1hZ2UgKS5jc3MoICdoZWlnaHQnLCAnYXV0bycgKTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMudHJpZ2dlciggJ3NldFNpemUnICk7XG5cblx0XHRcdGlmICggaW1hZ2VfaGVpZ2h0IDwgNSApIHtcblx0XHRcdFx0JCggaW1hZ2UgKS5oaWRlKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHQkKCBpbWFnZSApLnNob3coKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0dGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdGlmICggIXZhbCApIHtcblx0XHRcdFx0dmFsID0gJyc7XG5cdFx0XHR9XG5cblx0XHR9O1xuXG5cdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvID0gJC5tZXRhID8gJC5leHRlbmQoIHt9LCBvcHRzLCAkKCB0aGlzICkuZGF0YSgpICkgOiBvcHRzO1xuXG5cdFx0XHRmaWVsZCA9IG8uZmllbGQ7XG5cblx0XHRcdC8vIHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRcdGlmICggby5kZWZhdWx0X3dpZHRoID4gMCApIHtcblx0XHRcdFx0ZGVmYXVsdF93aWR0aCA9IG8uZGVmYXVsdF93aWR0aDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCBvLmRlZmF1bHRfaGVpZ2h0ID4gMCApIHtcblx0XHRcdFx0ZGVmYXVsdF9oZWlnaHQgPSBvLmRlZmF1bHRfaGVpZ2h0O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggby5uYW1lICkgKSB7XG5cdFx0XHRcdG5hbWUgPSBvLm5hbWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBhY2NlcHRfZmlsdGVyICkgKSB7XG5cdFx0XHRcdGFjY2VwdF9maWx0ZXIgPSBvLmFjY2VwdF9maWx0ZXI7XG5cdFx0XHR9XG5cblx0XHRcdGJyb3dzZXIgPSAkKCB0aGlzICkuZmluZCggJy5icm93c2VyJyApO1xuXHRcdFx0dmFyIGltYWdlID0gJCggdGhpcyApLmZpbmQoICcuaW1hZ2UnICk7XG5cdFx0XHRpbWFnZS5oaWRlKCk7XG5cdFx0XHRpbWFnZS5vbiggJ2xvYWQnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0b25JbWFnZUxvYWQoIHRoaXMgKTtcblxuXHRcdFx0fSApO1xuXG5cdFx0XHRpZiAoIGFjY2VwdF9maWx0ZXIgKSB7XG5cdFx0XHRcdGJyb3dzZXIuYXR0ciggJ2FjY2VwdCcsIGFjY2VwdF9maWx0ZXIgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGFjY2VwdF9maWx0ZXIgPSAnaW1hZ2UvKic7XG5cdFx0XHRcdGJyb3dzZXIuYXR0ciggJ2FjY2VwdCcsICdpbWFnZS8qJyApO1xuXHRcdFx0fVxuXG5cdFx0XHRicm93c2VyLmF0dHIoICdpZCcsIGlkICk7XG5cdFx0XHRicm93c2VyLmF0dHIoICduYW1lJywgbmFtZSApO1xuXG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggby5jaGFuZ2VIYW5kbGVyICkgKSB7XG5cblx0XHRcdFx0JHRoaXMuYmluZCggJ2ltYWdlQ2hhbmdlJywgby5jaGFuZ2VIYW5kbGVyICk7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIEdsb2JhbC5pc1NldCggby5kZWxldGVJbWFnZUhhbmRsZXIgKSApIHtcblx0XHRcdFx0dGhpcy5maW5kKCAnLmZpbGUtYnJvd3NlcicgKS5vbiggJ2RlbGV0ZUNsaWNrJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0by5kZWxldGVJbWFnZUhhbmRsZXIoKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHR9XG5cblx0XHRcdGJyb3dzZXIuYmluZCggJ2NoYW5nZScsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpbWFnZS5oaWRlKCk7XG5cblx0XHRcdFx0aWYgKCB0eXBlb2YgRmlsZVJlYWRlciAhPSAndW5kZWZpbmVkJyApIHtcblxuXHRcdFx0XHRcdHZhciBmaWxlcyA9ICEhdGhpcy5maWxlcyA/IHRoaXMuZmlsZXMgOiBbXTtcblxuXHRcdFx0XHRcdC8vIElmIG5vIGZpbGVzIHdlcmUgc2VsZWN0ZWQsIG9yIG5vIEZpbGVSZWFkZXIgc3VwcG9ydCwgcmV0dXJuXG5cdFx0XHRcdFx0aWYgKCAhZmlsZXMubGVuZ3RoIHx8ICF3aW5kb3cuRmlsZVJlYWRlciApIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoIGFjY2VwdF9maWx0ZXIgPT09ICdpbWFnZS8qJyApIHtcblx0XHRcdFx0XHRcdC8vIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgRmlsZVJlYWRlclxuXHRcdFx0XHRcdFx0dmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cblx0XHRcdFx0XHRcdC8vIFJlYWQgdGhlIGxvY2FsIGZpbGUgYXMgYSBEYXRhVVJMXG5cdFx0XHRcdFx0XHRyZWFkZXIucmVhZEFzRGF0YVVSTCggZmlsZXNbMF0gKTtcblxuXHRcdFx0XHRcdFx0Ly8gV2hlbiBsb2FkZWQsIHNldCBpbWFnZSBkYXRhIGFzIGJhY2tncm91bmQgb2YgZGl2XG5cdFx0XHRcdFx0XHRyZWFkZXIub25sb2FkZW5kID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHZhciB1cmwgPSB0aGlzLnJlc3VsdDtcblx0XHRcdFx0XHRcdFx0aW1hZ2UuYXR0ciggJ3NyYycsIHVybCApO1xuXG5cdFx0XHRcdFx0XHR9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9XG5cblx0XHRcdFx0JHRoaXMudHJpZ2dlciggJ2ltYWdlQ2hhbmdlJywgWyR0aGlzXSApO1xuXG5cdFx0XHR9ICk7XG5cblx0XHR9ICk7XG5cblx0XHRyZXR1cm4gdGhpcztcblxuXHR9O1xuXG5cdCQuZm4uVEltYWdlQnJvd3Nlci5kZWZhdWx0cyA9IHt9O1xuXHQkLmZuLlRJbWFnZUJyb3dzZXIuaHRtbF90ZW1wbGF0ZSA9IGBcblx0PGRpdiBjbGFzcz1cImZpbGUtYnJvd3NlclwiPlxuXHRcdDxpbWcgY2xhc3M9XCJpbWFnZVwiPlxuXHRcdDxmb3JtIGVuY3R5cGU9XCJtdWx0aXBhcnQvZm9ybS1kYXRhXCIgY2xhc3M9XCJicm93c2VyLWZvcm1cIj5cblx0XHRcdDxpbnB1dCBuYW1lPVwiZmlsZWRhdGFcIiBjbGFzcz1cImJyb3dzZXJcIiB0eXBlPVwiZmlsZVwiLz5cblx0XHQ8L2Zvcm0+XG5cdDwvZGl2PlxuXHRgO1xuXG59ICkoIGpRdWVyeSApOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///8326\n")},8884:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{"use strict";eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"ImportCSVWizardController\": () => (/* binding */ ImportCSVWizardController)\n/* harmony export */ });\n/* harmony import */ var _global_widgets_filebrowser_TImageBrowser__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(8326);\n/* harmony import */ var _global_widgets_filebrowser_TImageBrowser__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_global_widgets_filebrowser_TImageBrowser__WEBPACK_IMPORTED_MODULE_0__);\n/* provided dependency */ var _ = __webpack_require__(9050);\n/* provided dependency */ var $ = __webpack_require__(9755);\n\n\nclass ImportCSVWizardController extends BaseWizardController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '.wizard-bg',\n\n\t\t\tapi_import: null,\n\n\t\t\tparse_hint_source: null,\n\n\t\t\tfield_source: null,\n\n\t\t\tselect_grid_last_row: null,\n\n\t\t\tlast_id: 0, // Last grid id\n\n\t\t\tsaved_layout_array: null,\n\n\t\t\tcolumn_map_data: null, //Used to build grid data\n\n\t\t\t// _required_files: ['TImageBrowser']\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\n\t\tthis.title = $.i18n._( 'Import Wizard' );\n\t\tthis.steps = 6;\n\t\tthis.current_step = 1;\n\t\tthis.wizard_id = 'ProcessPayrollWizard';\n\t\tthis.api_import = TTAPI.APIImport;\n\n\t\tthis.render();\n\t}\n\n\trender() {\n\t\tsuper.render();\n\n\t\tthis.initCurrentStep();\n\t}\n\n\t//Create each page UI\n\tbuildCurrentStepUI() {\n\n\t\tvar $this = this;\n\t\tthis.content_div.empty();\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 1:\n\t\t\t\tvar label = this.getLabel();\n\t\t\t\tlabel.text( $.i18n._( 'Select the type of objects that you wish to import' ) );\n\n\t\t\t\tvar combo_box = this.getComboBox( 'import_class' );\n\n\t\t\t\tvar example_label = this.getLabel();\n\t\t\t\texample_label.text( $.i18n._( 'Download example CSV file' ) );\n\t\t\t\texample_label.css( 'text-decoration', 'underline' );\n\t\t\t\texample_label.css( 'cursor', 'pointer' );\n\t\t\t\texample_label.css( 'margin-top', '25px' );\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step] = {};\n\t\t\t\tthis.stepsWidgetDic[this.current_step][combo_box.getField()] = combo_box;\n\n\t\t\t\texample_label.unbind( 'click' ).bind( 'click', function() {\n\n\t\t\t\t\tvar current_step_ui = $this.stepsWidgetDic[$this.current_step];\n\t\t\t\t\tvar current_value = current_step_ui.import_class.getValue().toLowerCase();\n\t\t\t\t\tvar url = ServiceCaller.getURLByObjectType( 'import_csv_example' ) + 'import_' + current_value + '_example.csv';\n\t\t\t\t\twindow.open( url, '_blank' );\n\t\t\t\t} );\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step]['example_label'] = example_label;\n\n\t\t\t\tcombo_box.unbind( 'change' ).bind( 'change', function( e ) {\n\t\t\t\t\texample_label.text( $.i18n._( 'Download example' ) + ' ' + combo_box.getLabel() + ' ' + $.i18n._( 'CSV file' ) );\n\t\t\t\t} );\n\n\t\t\t\tthis.content_div.append( label );\n\t\t\t\tthis.content_div.append( combo_box );\n\t\t\t\tthis.content_div.append( example_label );\n\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tlabel = this.getLabel();\n\t\t\t\tlabel.text( $.i18n._( 'Upload Comma Separated Value (CSV) text file' ) );\n\n\t\t\t\tvar file_browser = this.getFileBrowser( 'file_uploader', '.csv, .txt, .xls, .xlsx, .ods' );\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step] = {};\n\t\t\t\tthis.stepsWidgetDic[this.current_step][file_browser.getField()] = file_browser;\n\n\t\t\t\tthis.content_div.append( label );\n\t\t\t\tthis.content_div.append( file_browser );\n\n\t\t\t\tfile_browser.unbind( 'imageChange' ).bind( 'imageChange', function() {\n\t\t\t\t\tif ( file_browser.getValue() ) {\n\t\t\t\t\t\tGlobal.setWidgetEnabled( $this.back_btn, true );\n\t\t\t\t\t\tGlobal.setWidgetEnabled( $this.next_btn, true );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tlabel = this.getLabel();\n\t\t\t\tlabel.text( $.i18n._( 'Map columns from the uploaded file' ) );\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step] = {};\n\n\t\t\t\t//Saved layout\n\n\t\t\t\tvar saved_layout_div = $( '' );\n\n\t\t\t\tvar form_item_label = $( '' );\n\n\t\t\t\tsaved_layout_div.append( form_item_label );\n\n\t\t\t\tform_item_label.text( $.i18n._( 'Save Mapping As' ) );\n\n\t\t\t\tvar save_mapping_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT ).TTextInput();\n\n\t\t\t\tvar save_btn = $( '' );\n\n\t\t\t\tsaved_layout_div.append( save_mapping_input );\n\t\t\t\tsaved_layout_div.append( save_btn );\n\n\t\t\t\tform_item_label = $( '' + $.i18n._( 'Saved Mapping' ) + ':' );\n\n\t\t\t\tvar previous_saved_layout_selector = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\tprevious_saved_layout_selector = previous_saved_layout_selector.TComboBox();\n\t\t\t\tprevious_saved_layout_selector.setValueKey( 'id' );\n\t\t\t\tprevious_saved_layout_selector.setLabelKey( 'name' );\n\n\t\t\t\tvar update_btn = $( '' );\n\t\t\t\tvar del_btn = $( '' );\n\n\t\t\t\tsave_btn.unbind( 'click' ).bind( 'click', function() {\n\t\t\t\t\tvar name = save_mapping_input.getValue();\n\t\t\t\t\tif ( !name ) {\n\t\t\t\t\t\tTAlertManager.showAlert( $.i18n._( 'Mapping Name is blank' ) );\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t$this.saveNewMapping( save_mapping_input.getValue() );\n\t\t\t\t} );\n\n\t\t\t\tupdate_btn.unbind( 'click' ).bind( 'click', function() {\n\t\t\t\t\t$this.updateSelectMapping( previous_saved_layout_selector.getValue() );\n\t\t\t\t} );\n\n\t\t\t\tdel_btn.unbind( 'click' ).bind( 'click', function() {\n\t\t\t\t\t$this.deleteSelectMapping( previous_saved_layout_selector.getValue() );\n\t\t\t\t} );\n\n\t\t\t\tsaved_layout_div.append( form_item_label );\n\t\t\t\tsaved_layout_div.append( previous_saved_layout_selector );\n\t\t\t\tsaved_layout_div.append( update_btn );\n\t\t\t\tsaved_layout_div.append( del_btn );\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step]['saved_mapping'] = previous_saved_layout_selector;\n\n\t\t\t\tprevious_saved_layout_selector.bind( 'formItemChange', function( e, target ) {\n\t\t\t\t\t$this.onSavedLayoutChange( target.getValue() );\n\t\t\t\t} );\n\n\t\t\t\t//add minus buttons\n\t\t\t\tvar action_button_div = $( '' );\n\t\t\t\tvar add_icon = $( '' );\n\t\t\t\tvar minus_icon = $( '' );\n\n\t\t\t\taction_button_div.append( add_icon );\n\t\t\t\taction_button_div.append( minus_icon );\n\n\t\t\t\tthis.content_div.append( label );\n\t\t\t\tthis.content_div.append( saved_layout_div );\n\t\t\t\tthis.content_div.append( action_button_div );\n\n\t\t\t\tvar grid_id = 'import_data';\n\t\t\t\tvar grid_div = $( '' );\n\t\t\t\tthis.setImportGrid( grid_id, grid_div );\n\n\t\t\t\tadd_icon.bind( 'click', function() {\n\t\t\t\t\t$this.addRow();\n\t\t\t\t} );\n\n\t\t\t\tminus_icon.bind( 'click', function() {\n\t\t\t\t\t$this.minusRow();\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tlabel = this.getLabel();\n\t\t\t\tlabel.text( $.i18n._( 'Select import settings' ) );\n\n\t\t\t\tthis.content_div.append( label );\n\n\t\t\t\tthis.stepsWidgetDic[this.current_step] = {};\n\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\n\t\t}\n\t}\n\n\tonSavedLayoutChange( value ) {\n\t\tvar grid = this.stepsWidgetDic[this.current_step].import_data;\n\n\t\tvar len = this.saved_layout_array.length;\n\n\t\tvar id = 1;\n\n\t\tvar select_data = {};\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar layout = this.saved_layout_array[i];\n\n\t\t\tif ( layout.id === value ) {\n\t\t\t\tselect_data = layout.data;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor ( var i = 0; i < select_data.length; i++ ) {\n\t\t\tvar item = select_data[i];\n\t\t\titem.id = 'csv' + id;\n\t\t\titem.field = item.field ? item.field : TTUUID.zero_id; //Make sure any blank fields are converted to zero_ids to prevent \"undefined\" from appearing in place of the dropdown box.\n\t\t\tid = id + 1;\n\t\t}\n\n\t\tthis.last_id = id;\n\n\t\t//Clone this array because its currently a reference to the raw grid data itself and grid.setData() clears out the grid before rendering it again, which results in a blank grid when switching from a saved mapping, then back to the original.\n\t\tselect_data = this.setSampleRowBaseOnImportFile( select_data ).slice( 0 );\n\n\t\tgrid.setData( select_data );\n\n\t\tthis.bindGridRenderEvents( grid );\n\t}\n\n\tsetSampleRowBaseOnImportFile( grid_data ) {\n\t\tif ( !this.import_data || !grid_data ) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor ( var i = 0; i < grid_data.length; i++ ) {\n\t\t\tvar item = grid_data[i];\n\t\t\titem.row_1 = '';\n\t\t\tfor ( var j = 0; j < this.import_data.length; j++ ) {\n\t\t\t\tvar import_data = this.import_data[j];\n\n\t\t\t\t//#2132 - match based on map_column_name\n\t\t\t\tif ( item && item.map_column_name && import_data && import_data.map_column_name ) {\n\t\t\t\t\tif ( item.map_column_name.trim() === import_data.map_column_name.trim() ) {\n\t\t\t\t\t\titem.row_1 = import_data.row_1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn grid_data;\n\t}\n\n\tgetSavedMapping( select_layout_id ) {\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\tvar filter_data = {};\n\t\tfilter_data.script = 'import_wizard' + this.stepsDataDic[1].import_class;\n\t\tfilter_data.deleted = false;\n\t\targs.filter_data = filter_data;\n\t\tTTAPI.APIUserGenericData.getUserGenericData( args, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tvar res_data = result.getResult();\n\t\t\t\tif ( $.type( res_data ) !== 'array' ) {\n\t\t\t\t\t$this.saveNewMapping( BaseViewController.default_layout_name, true );\n\t\t\t\t} else {\n\t\t\t\t\t//Force sorting by name so -- DEFAULT -- record appears at the top.\n\t\t\t\t\tres_data.sort( function( a, b ) {\n\t\t\t\t\t\t\treturn Global.compare( a, b, 'name' );\n\t\t\t\t\t\t}\n\t\t\t\t\t);\n\n\t\t\t\t\t$this.saved_layout_array = res_data;\n\n\t\t\t\t\t//If not set select layout, default to first one and update it to current upload columns\n\t\t\t\t\tif ( !select_layout_id ) {\n\t\t\t\t\t\tselect_layout_id = res_data[0].id;\n\n\t\t\t\t\t\t//Only update the first saved import data record if it is infact the DEFAULT one, otherwise it could overwrite some other random saved mapping, especially if they happen to the delete the default one.\n\t\t\t\t\t\t// It has to update the DEFAULT saved mapping, otherwise if the user changes to a different mapping, then changes back, all the settings will be lost.\n\t\t\t\t\t\tif ( res_data[0].is_default == true || res_data[0].name == BaseViewController.default_layout_name ) {\n\t\t\t\t\t\t\t$this.updateSelectMapping( select_layout_id );\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t$this.saveNewMapping( BaseViewController.default_layout_name, true );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.setSavedMappingOptions( res_data, select_layout_id );\n\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tgetLayoutById( select_id ) {\n\t\tvar len = this.saved_layout_array.length;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar layout = this.saved_layout_array[i];\n\n\t\t\tif ( layout.id === select_id ) {\n\t\t\t\treturn layout;\n\t\t\t}\n\t\t}\n\t}\n\n\tdeleteSelectMapping( select_id ) {\n\t\tvar $this = this;\n\t\tvar select_layout = this.getLayoutById( select_id );\n\n\t\tif ( select_layout.is_default == true || select_layout.name === BaseViewController.default_layout_name ) {\n\t\t\tTAlertManager.showAlert( $.i18n._( 'Can\\'t delete default layout' ) );\n\t\t\treturn;\n\t\t}\n\n\t\tTAlertManager.showConfirmAlert( $.i18n._( 'Are you sure you wish to continue?' ), null, function( flag ) {\n\t\t\tif ( flag ) {\n\t\t\t\tTTAPI.APIUserGenericData.deleteUserGenericData( select_id, {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.onSavedLayoutChange( $this.saved_layout_array[0].id );\n\t\t\t\t\t\t$this.getSavedMapping();\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t}\n\t\t} );\n\t}\n\n\tupdateSelectMapping( select_id ) {\n\t\tvar $this = this;\n\n\t\tthis.saveCurrentStep();\n\t\tvar select_layout = this.getLayoutById( select_id );\n\n\t\tselect_layout.data = this.stepsDataDic[this.current_step].import_data_for_layout;\n\n\t\tTTAPI.APIUserGenericData.setUserGenericData( select_layout, {\n\t\t\tonResult: function( result ) {\n\t\t\t\t//Refresh saved mapping data once it has been saved on the server.\n\t\t\t\t// This makes it so if the user clicks the UPDATE button, then switches to another saved mapping, then switches back, they will see their most recent settings.\n\t\t\t\t$this.getSavedMapping( select_id );\n\t\t\t}\n\t\t} );\n\t}\n\n\tsaveNewMapping( name, is_default ) {\n\t\tthis.saveCurrentStep();\n\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.script = 'import_wizard' + this.stepsDataDic[1].import_class;\n\t\targs.name = name;\n\t\targs.is_default = ( is_default && is_default == true ? true : false );\n\t\targs.data = this.stepsDataDic[this.current_step].import_data_for_layout;\n\n\t\tTTAPI.APIUserGenericData.setUserGenericData( args, {\n\t\t\tonResult: function( result ) {\n\t\t\t\tif ( !result.isValid() ) {\n\t\t\t\t\tTAlertManager.showErrorAlert( result );\n\t\t\t\t} else {\n\t\t\t\t\t$this.getSavedMapping( result.getResult() );\n\t\t\t\t}\n\n\t\t\t}\n\t\t} );\n\t}\n\n\tsetSavedMappingOptions( array, select_layout_id ) {\n\t\tvar $this = this;\n\n\t\tif ( Global.isSet( $this.stepsWidgetDic[$this.current_step]['saved_mapping'] ) == true ) {\n\t\t\tvar selector = $this.stepsWidgetDic[$this.current_step]['saved_mapping'];\n\n\t\t\tselector.setSourceData( array );\n\n\t\t\tif ( select_layout_id ) {\n\t\t\t\tselector.setValue( select_layout_id );\n\t\t\t}\n\t\t}\n\t\t$this.saved_layout_array = array;\n\t}\n\n\taddRow() {\n\t\tvar grid = this.stepsWidgetDic[this.current_step].import_data;\n\t\tvar all_data = grid.getData();\n\n\t\tvar data = {};\n\t\tdata.id = 'csv' + this.last_id;\n\t\tdata.field = TTUUID.zero_id;\n\t\tdata.default_value = '';\n\t\tdata.parse_hint = '';\n\t\tdata.map_column_name = $.i18n._( 'New Field Column' );\n\t\tdata.row_1 = '';\n\n\t\tthis.last_id = this.last_id + 1;\n\n\t\tall_data.push( data );\n\n\t\tgrid.setData( all_data, false );\n\n\t\tgrid.grid.jqGrid( 'setSelection', data.id );\n\n\t\tthis.bindGridRenderEvents( grid );\n\t}\n\n\tminusRow() {\n\n\t\tvar grid = this.stepsWidgetDic[this.current_step].import_data;\n\t\tvar sel_id = grid.getGridParam( 'selrow' );\n\n\t\tif ( !sel_id ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar all_data = grid.getGridParam( 'data' );\n\n\t\tfor ( var i = all_data.length - 1; i >= 0; i-- ) {\n\t\t\tvar data = all_data[i];\n\n\t\t\tif ( data.id === sel_id ) {\n\t\t\t\tall_data.splice( i, 1 );\n\t\t\t}\n\t\t}\n\n\t\tgrid.setData( all_data, false );\n\n\t\tgrid.grid.jqGrid( 'setSelection', all_data[all_data.length - 1].id );\n\t}\n\n\tgetGridColumns( gridId, callBack ) {\n\t\tvar column_info_array = [];\n\t\tvar $this = this;\n\n\t\tswitch ( gridId ) {\n\t\t\tcase 'import_data':\n\n\t\t\t\tvar column_info = {\n\t\t\t\t\tname: 'map_column_name',\n\t\t\t\t\tindex: 'map_column_name',\n\t\t\t\t\tlabel: $.i18n._( 'File Column' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: function( cell_value, related_data, row ) {\n\t\t\t\t\t\treturn $this.onTextInputRender( cell_value, related_data, row );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'field',\n\t\t\t\t\tindex: 'field',\n\t\t\t\t\tlabel: $.i18n._( 'Field' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: function( cell_value, related_data, row ) {\n\t\t\t\t\t\treturn $this.onFieldRender( cell_value, related_data, row );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'default_value',\n\t\t\t\t\tindex: 'default_value',\n\t\t\t\t\tlabel: $.i18n._( 'Default Value' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: function( cell_value, related_data, row ) {\n\t\t\t\t\t\treturn $this.onTextInputRender( cell_value, related_data, row );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'parse_hint',\n\t\t\t\t\tindex: 'parse_hint',\n\t\t\t\t\tlabel: $.i18n._( 'Parse Hint' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false,\n\t\t\t\t\tformatter: function( cell_value, related_data, row ) {\n\t\t\t\t\t\treturn $this.onParseHintRender( cell_value, related_data, row );\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\tcolumn_info = {\n\t\t\t\t\tname: 'row_1',\n\t\t\t\t\tindex: 'row_1',\n\t\t\t\t\tlabel: $.i18n._( 'Sample Row' ),\n\t\t\t\t\twidth: 100,\n\t\t\t\t\tsortable: false,\n\t\t\t\t\ttitle: false\n\t\t\t\t};\n\t\t\t\tcolumn_info_array.push( column_info );\n\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tcallBack( column_info_array );\n\t}\n\n\tonParseHintRender( cell_value, related_data, row ) {\n\t\tvar widget;\n\t\tvar col_model = related_data.colModel;\n\t\tvar row_id = related_data.rowId;\n\n\t\tif ( this.parse_hint_source[row.field] ) {\n\t\t\twidget = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\twidget = widget.TComboBox( { set_empty: false } );\n\n\t\t\twidget.attr( 'custom_cell', 'true' );\n\t\t\twidget.attr( 'render_type', 'combobox' );\n\t\t\twidget.attr( 'id', row_id + '_' + col_model.name );\n\t\t\twidget.width( '97%' );\n\n\t\t\tvar source = Global.buildRecordArray( this.parse_hint_source[row.field] );\n\t\t\twidget.setSourceData( source );\n\n\t\t\tif ( cell_value ) {\n\t\t\t\twidget.setValue( cell_value );\n\t\t\t} else {\n\t\t\t\twidget.setValue( source[0].value );\n\t\t\t\trow.parse_hint = source[0].value;\n\t\t\t}\n\n\t\t} else {\n\t\t\twidget = $( '' );\n\n\t\t\twidget.text( cell_value );\n\t\t}\n\n\t\treturn widget.get( 0 ).outerHTML;\n\t}\n\n\tonFieldRender( cell_value, related_data, row ) {\n\t\tif ( !cell_value ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar col_model = related_data.colModel;\n\t\tvar row_id = related_data.rowId;\n\n\t\tvar acombobox = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\tacombobox = acombobox.TComboBox( { set_empty: true } );\n\n\t\tacombobox.attr( 'custom_cell', 'true' );\n\t\tacombobox.attr( 'render_type', 'combobox' );\n\t\tacombobox.attr( 'id', row_id + '_' + col_model.name );\n\t\tacombobox.width( '97%' );\n\n\t\tacombobox.setSourceData( this.field_source );\n\n\t\t$( acombobox[0] ).find( '[value=' + cell_value + ']' ).attr( 'selected', true );\n\n\t\treturn acombobox.get( 0 ).outerHTML;\n\t}\n\n\tonTextInputRender( cell_value, related_data, row ) {\n\n\t\tvar col_model = related_data.colModel;\n\t\tvar row_id = related_data.rowId;\n\n\t\treturn '';\n\t}\n\n\tbuildCurrentStepData() {\n\n\t\tvar grid;\n\t\tvar $this = this;\n\n\t\tvar current_step_data = this.stepsDataDic[this.current_step];\n\t\tvar current_step_ui = this.stepsWidgetDic[this.current_step];\n\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 1:\n\t\t\t\tthis.api_import.getImportObjects( {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar combo_box = current_step_ui['import_class'];\n\t\t\t\t\t\tvar array = Global.buildRecordArray( result.getResult() );\n\t\t\t\t\t\tcombo_box.setSourceData( array );\n\n\t\t\t\t\t\tif ( current_step_data ) {\n\t\t\t\t\t\t\tcombo_box.setValue( current_step_data.import_class );\n\t\t\t\t\t\t} else if ( $this.default_data ) {\n\t\t\t\t\t\t\tcombo_box.setValue( $this.default_data );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar example_label = current_step_ui.example_label;\n\t\t\t\t\t\texample_label.text( $.i18n._( 'Download example' ) + ' ' + combo_box.getLabel() + ' ' + $.i18n._( 'CSV file' ) );\n\t\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\n\t\t\t\tgrid = current_step_ui.import_data;\n\t\t\t\tif ( current_step_data && current_step_data.import_data_for_layout ) {\n\n\t\t\t\t\tcurrent_step_data.import_data_for_layout = this.setSampleRowBaseOnImportFile( current_step_data.import_data_for_layout );\n\n\t\t\t\t\tgrid.setData( current_step_data.import_data_for_layout );\n\n\t\t\t\t\t$this.bindGridRenderEvents( grid );\n\n\t\t\t\t\t$this.setSavedMappingOptions( $this.saved_layout_array, current_step_data.saved_mapping );\n\n\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tthis.api_import.getOptions( 'parse_hint', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.parse_hint_source = result.getResult();\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tthis.api_import.getOptions( 'columns', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t$this.field_source = Global.buildRecordArray( result.getResult() );\n\t\t\t\t\t\t$this.api_import.getRawData( 1, {\n\t\t\t\t\t\t\tonResult: function( getRawDataRes ) {\n\n\t\t\t\t\t\t\t\tvar raw_data = getRawDataRes.getResult();\n\t\t\t\t\t\t\t\traw_data = $this.buildMappingGridDataArray( raw_data[0] );\n\n\t\t\t\t\t\t\t\t$this.api_import.generateColumnMap( {\n\t\t\t\t\t\t\t\t\tonResult: function( generateColumnMapRes ) {\n\t\t\t\t\t\t\t\t\t\t$this.column_map_data = generateColumnMapRes.getResult();\n\n\t\t\t\t\t\t\t\t\t\tvar len = raw_data.length;\n\t\t\t\t\t\t\t\t\t\tfor ( var key in $this.column_map_data ) {\n\t\t\t\t\t\t\t\t\t\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\t\t\t\t\t\t\t\t\t\tvar raw_data_item = raw_data[i];\n\t\t\t\t\t\t\t\t\t\t\t\tvar col_map_data_item = $this.column_map_data[key];\n\t\t\t\t\t\t\t\t\t\t\t\tif ( raw_data_item.map_column_name == col_map_data_item.map_column_name ) {\n\t\t\t\t\t\t\t\t\t\t\t\t\traw_data_item.field = key;\n\t\t\t\t\t\t\t\t\t\t\t\t\traw_data_item.default_value = $this.column_map_data[key].default_value ? $this.column_map_data[key].default_value : '';\n\t\t\t\t\t\t\t\t\t\t\t\t\traw_data_item.parse_hint = $this.column_map_data[key].parse_hint ? $this.column_map_data[key].parse_hint : '';\n\t\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\traw_data.sort( function( a, b ) {\n\t\t\t\t\t\t\t\t\t\t\t\treturn Global.compare( a, b, 'map_column_name' );\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t);\n\n\t\t\t\t\t\t\t\t\t\t// use to set Sample row to same layout\n\t\t\t\t\t\t\t\t\t\t$this.import_data = raw_data;\n\n\t\t\t\t\t\t\t\t\t\tgrid.setData( raw_data );\n\n\t\t\t\t\t\t\t\t\t\t$this.bindGridRenderEvents( grid );\n\n\t\t\t\t\t\t\t\t\t\t$this.getSavedMapping();\n\t\t\t\t\t\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t\t}\n\t\t\t\t} );\n\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tthis.api_import.getOptions( 'import_options', {\n\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\tvar result_data = Global.buildRecordArray( result.getResult() );\n\t\t\t\t\t\tvar div = $( '' );\n\n\t\t\t\t\t\tfor ( var i = 0; i < result_data.length; i++ ) {\n\t\t\t\t\t\t\tvar item = result_data[i];\n\t\t\t\t\t\t\tvar check_box = $this.getCheckBox( item.value );\n\n\t\t\t\t\t\t\tif ( current_step_data && current_step_data[item.value] ) {\n\t\t\t\t\t\t\t\tcheck_box.setValue( current_step_data[item.value] );\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tvar label = $( '' );\n\t\t\t\t\t\t\tlabel.prepend( check_box );\n\t\t\t\t\t\t\t$this.stepsWidgetDic[$this.current_step][item.value] = check_box;\n\n\t\t\t\t\t\t\tdiv.append( label );\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this.content_div.append( div );\n\t\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 5:\n\t\t\t\tvar import_data = this.stepsDataDic[3].import_data;\n\t\t\t\tvar import_options = this.stepsDataDic[4];\n\n\t\t\t\tthis.api_import.import( import_data, import_options, true, {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tif ( $this.current_step != 5 ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\t\t\tvar label = $this.getLabel();\n\t\t\t\t\t\t\tlabel.text( $.i18n._( 'Data verification successful' ) );\n\n\t\t\t\t\t\t\t$this.content_div.append( label );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar data_grid_error_source = $this.createErrorSource( result.getDetails() );\n\t\t\t\t\t\t\t$this.showErrorGrid( $.i18n._( 'Verification failed due to the following reasons' ) + ': ',\n\t\t\t\t\t\t\t\tdata_grid_error_source,\n\t\t\t\t\t\t\t\t$.i18n._( 'Continue to the next step to skip importing invalid records.' ),\n\t\t\t\t\t\t\t\tresult.getRecordDetails() );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tcase 6:\n\t\t\t\timport_data = this.stepsDataDic[3].import_data;\n\t\t\t\timport_options = this.stepsDataDic[4];\n\n\t\t\t\tthis.api_import.setIsIdempotent( true ); //Force to idempotent API call to avoid duplicate network requests from causing errors displayed to the user.\n\t\t\t\tthis.api_import.import( import_data, import_options, false, {\n\t\t\t\t\tonResult: function( result ) {\n\n\t\t\t\t\t\tif ( $this.current_step != 6 ) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\t\t\tvar label = $this.getLabel();\n\t\t\t\t\t\t\tlabel.text( $.i18n._( 'Import successful' ) );\n\n\t\t\t\t\t\t\t$this.content_div.append( label );\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar data_grid_error_source = $this.createErrorSource( result.getDetails() );\n\n\t\t\t\t\t\t\t$this.showErrorGrid( $.i18n._( 'Import failed due to the following reasons' ) + ':',\n\t\t\t\t\t\t\t\tdata_grid_error_source,\n\t\t\t\t\t\t\t\t$.i18n._( 'Invalid records have been skipped, all other records have been imported successfully.' ),\n\t\t\t\t\t\t\t\tresult.getRecordDetails() );\n\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\t\t\t\t\t}\n\t\t\t\t} );\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\t\t\t\tbreak;\n\n\t\t}\n\t}\n\n\tshowErrorGrid( top_des, data_grid_error_source, bottom_des, records_details ) {\n\t\tvar label = $( '' );\n\t\tlabel.text( top_des );\n\n\t\tthis.content_div.append( label );\n\n\t\tvar grid = $( '' );\n\n\t\tvar columns = [];\n\n\t\tvar column_info = {\n\t\t\tname: 'rowIndex',\n\t\t\tindex: 'rowIndex',\n\t\t\tlabel: $.i18n._( 'Row' ),\n\t\t\twidth: 60,\n\t\t\tsortable: false,\n\t\t\ttitle: false,\n\t\t\tfixed: true\n\t\t};\n\t\tcolumns.push( column_info );\n\n\t\tcolumn_info = {\n\t\t\tname: 'row',\n\t\t\tindex: 'row',\n\t\t\tlabel: $.i18n._( 'File Column' ),\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\t\tcolumns.push( column_info );\n\n\t\tcolumn_info = {\n\t\t\tname: 'column',\n\t\t\tindex: 'column',\n\t\t\tlabel: $.i18n._( 'Field' ),\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\t\tcolumns.push( column_info );\n\n\t\tcolumn_info = {\n\t\t\tname: 'message',\n\t\t\tindex: 'message',\n\t\t\tlabel: $.i18n._( 'Message' ),\n\t\t\twidth: 100,\n\t\t\tsortable: false,\n\t\t\ttitle: false\n\t\t};\n\t\tcolumns.push( column_info );\n\n\t\tthis.content_div.append( grid );\n\n\t\tlabel = $( '' );\n\t\tlabel.text( $.i18n._( 'Records' ) + ':' + $.i18n._( 'Total' ) + ': ' + records_details.total + ' ' + $.i18n._( 'Valid' ) + ': ' + records_details.valid + ' ' + $.i18n._( 'Invalid' ) + ': ' + records_details.invalid );\n\n\t\tthis.content_div.append( label );\n\n\t\tlabel = $( '' );\n\t\tlabel.text( bottom_des );\n\n\t\tthis.content_div.append( label );\n\n\t\tgrid = new TTGrid( 'error_grid', {\n\t\t\tsortable: false,\n\t\t\twidth: ( this.content_div.width() - 2 )\n\t\t}, columns );\n\t\tgrid.setData( data_grid_error_source );\n\t\tgrid.setGridColumnsWidth( null, { max_grid_width: ( this.content_div.width() - 2 ) } );\n\t}\n\n\tcreateErrorSource( error_array ) {\n\n\t\t//Error: Uncaught TypeError: Cannot read property 'import_data' of undefined in /interface/html5/#!m=TimeSheet&date=00070609&user_id=14372 line 773\n\t\tif ( !this.stepsDataDic || !this.stepsDataDic[3] ) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar import_data = this.stepsDataDic[3].import_data;\n\t\tvar result = [];\n\t\tvar error_row = {};\n\n\t\tfor ( var key in error_array ) {\n\t\t\tvar error_info = error_array[key]['error'];\n\t\t\tfor ( var error_key in error_info ) {\n\t\t\t\tif ( !error_info.hasOwnProperty( error_key ) ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\terror_row = {};\n\t\t\t\t// #2345 - we always want the row and column name to show in the error report.\n\t\t\t\terror_row.rowIndex = parseInt( key ) + 2;\n\t\t\t\terror_row.row = $.i18n._( 'Unknown' );\n\t\t\t\terror_row.column = error_key;\n\t\t\t\terror_row.message = error_info[error_key][0];\n\n\t\t\t\t// Try to get more specific error info.\n\t\t\t\tfor ( var import_key in import_data ) {\n\t\t\t\t\tif ( import_key == error_key ) { // #2345 - This won't match in cases where the csv columns do not match the object properties being validated. For example 'branch' != 'branch_id'\n\t\t\t\t\t\terror_row.row = import_data[import_key].map_column_name;\n\t\t\t\t\t\terror_row.column = import_data[import_key].field_name;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tresult.push( error_row );\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tbindGridRenderEvents( grid ) {\n\t\tvar $this = this;\n\t\tvar inputs = grid.grid.find( 'input[custom_cell=\"true\"]' );\n\t\tvar select = grid.grid.find( 'select[custom_cell=\"true\"]' );\n\n\t\tinputs.unbind( 'change' ).bind( 'change', function( e ) {\n\t\t\t$this.onCellInputChange( e );\n\t\t} );\n\n\t\tselect.unbind( 'change' ).bind( 'change', function( e ) {\n\t\t\t$this.onCellInputChange( e );\n\t\t} );\n\n\t\tinputs.unbind( 'focusin' ).bind( 'focusin', function( e ) {\n\t\t\t$this.onCellFocusIn( e );\n\t\t} );\n\n\t\tselect.unbind( 'focusin' ).bind( 'focusin', function( e ) {\n\t\t\t$this.onCellFocusIn( e );\n\t\t} );\n\t}\n\n\tonCellFocusIn( e ) {\n\t\tvar current_step_ui = this.stepsWidgetDic[this.current_step];\n\t\tvar grid = current_step_ui['import_data'];\n\t\tvar target = $( e.target );\n\t\tvar target_id = target.attr( 'id' );\n\t\tvar row_id = target_id.split( '_' )[0];\n\n\t\tgrid.grid.jqGrid( 'setSelection', row_id );\n\t}\n\n\tonCellInputChange( e ) {\n\t\tvar $this = this;\n\t\tvar current_step_ui = this.stepsWidgetDic[this.current_step];\n\t\tvar grid = current_step_ui['import_data'];\n\t\tvar target = $( e.target );\n\t\tvar target_id = target.attr( 'id' );\n\t\tvar row_id = target_id.split( '_' )[0];\n\t\tvar field = target_id.substring( target_id.indexOf( '_' ) + 1, target_id.length );\n\t\tvar data = grid.getData();\n\t\tvar target_val = target.val();\n\n\t\tvar len = data.length;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row_data = data[i];\n\t\t\tif ( row_data.id === row_id ) {\n\t\t\t\trow_data[field] = target_val;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif ( field === 'field' ) {\n\t\t\tupdateParseHintWidget();\n\t\t}\n\n\t\tfunction updateParseHintWidget() {\n\t\t\tvar widget;\n\t\t\tvar parse_hint_widget = target.parent().parent().find( '#' + row_id + '_parse_hint' );\n\t\t\tvar render_type = parse_hint_widget.attr( 'render_type' );\n\n\t\t\trow_data['parse_hint'] = '';\n\n\t\t\tif ( $this.parse_hint_source[target_val] ) {\n\n\t\t\t\twidget = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\t\t\t\twidget = widget.TComboBox( { set_empty: false } );\n\n\t\t\t\twidget.attr( 'custom_cell', 'true' );\n\t\t\t\twidget.attr( 'render_type', 'combobox' );\n\t\t\t\twidget.attr( 'id', row_id + '_parse_hint' );\n\t\t\t\twidget.width( '97%' );\n\n\t\t\t\tvar source = Global.buildRecordArray( $this.parse_hint_source[target_val] );\n\t\t\t\twidget.setSourceData( Global.buildRecordArray( $this.parse_hint_source[target_val] ) );\n\t\t\t\twidget.setValue( source[0].value );\n\t\t\t\trow_data['parse_hint'] = source[0].value;\n\n\t\t\t\tparse_hint_widget.parent().append( widget );\n\t\t\t\tparse_hint_widget.remove();\n\n\t\t\t} else {\n\n\t\t\t\twidget = $( '' );\n\n\t\t\t\tparse_hint_widget.parent().append( widget );\n\t\t\t\tparse_hint_widget.remove();\n\n\t\t\t}\n\n\t\t\twidget.bind( 'change', function( e ) {\n\t\t\t\t$this.onCellInputChange( e );\n\t\t\t} );\n\n\t\t}\n\t}\n\n\tsetImportGrid( gridId, grid_div, allMultipleSelection ) {\n\n\t\tif ( !allMultipleSelection ) {\n\t\t\tallMultipleSelection = false;\n\t\t}\n\n\t\tvar $this = this;\n\n\t\tthis.content_div.append( grid_div );\n\n\t\tthis.getGridColumns( gridId, function( column_model ) {\n\n\t\t\t$this.stepsWidgetDic[$this.current_step][gridId] = new TTGrid( gridId, {\n\t\t\t\tsortable: false,\n\t\t\t\theight: 300,\n\t\t\t\tmultiselect: allMultipleSelection,\n\t\t\t\tmultiboxonly: allMultipleSelection,\n\t\t\t\tediturl: 'clientArray'\n\t\t\t}, column_model );\n\n\t\t\t$this.setGridSize( $this.stepsWidgetDic[$this.current_step][gridId] );\n\n\t\t\t$this.setGridGroupColumns( gridId );\n\n\t\t} );\n\t}\n\n\tbuildMappingGridDataArray( mappingData ) {\n\n\t\tvar result = [];\n\t\tvar id = 1;\n\t\tfor ( var key in mappingData ) {\n\t\t\tif ( !mappingData.hasOwnProperty( key ) ) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tvar item = mappingData[key];\n\t\t\tvar data = {};\n\t\t\tdata.id = 'csv' + id;\n\t\t\tdata.field = item.field ? item.field : TTUUID.zero_id;\n\t\t\tdata.default_value = item.default_value ? item.default_value : '';\n\t\t\tdata.parse_hint = item.parse_hint ? item.parse_hint : '';\n\t\t\tdata.map_column_name = item.map_column_name ? item.map_column_name : key;\n\t\t\tdata.row_1 = item.row_1 ? item.row_1 : item;\n\t\t\tresult.push( data );\n\n\t\t\tid = id + 1;\n\n\t\t}\n\n\t\tthis.last_id = id;\n\n\t\treturn result;\n\t}\n\n\tonDoneClick() {\n\t\tthis.cleanStepsData();\n\t\tLocalCacheData.current_open_wizard_controllers = LocalCacheData.current_open_wizard_controllers.filter( wizard => wizard.wizard_id !== this.wizard_id );\n\t\tthis.saveAllStepsToUserGenericData( function() {\n\n\t\t} );\n\n\t\tif ( this.call_back ) {\n\t\t\tthis.call_back();\n\t\t}\n\n\t\t$( this.el ).remove();\n\t}\n\n\tinitCurrentStep() {\n\n\t\tvar $this = this;\n\t\t$this.progress_label.text( 'Step ' + $this.current_step + ' of ' + $this.steps );\n\t\t$this.progress.attr( 'max', $this.steps );\n\t\t$this.progress.val( $this.current_step );\n\n\t\t$this.buildCurrentStepUI();\n\t\t$this.buildCurrentStepData();\n\t\t$this.setCurrentStepValues();\n\t}\n\n\tonNextClick() {\n\t\tvar $this = this;\n\t\tthis.saveCurrentStep();\n\t\tvar current_step_data = this.stepsDataDic[this.current_step];\n\t\tGlobal.setWidgetEnabled( this.back_btn, false );\n\t\tGlobal.setWidgetEnabled( this.next_btn, false );\n\t\tif ( this.current_step === 2 ) {\n\n\t\t\tif ( !current_step_data.file_uploader ) {\n\t\t\t\tTAlertManager.showAlert( $.i18n._( 'Please choose a CSV file first' ) );\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t$this.api_import.uploadFile( current_step_data.file_uploader, 'object_type=import&object_id=' + this.api_import.className, {\n\t\t\t\tonResult: function( upload_file_result ) {\n\t\t\t\t\tif ( upload_file_result.toLowerCase() !== 'true' ) {\n\t\t\t\t\t\t$this.setButtonsStatus(); // set button enabled or disabled\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t$this.current_step = $this.current_step + 1;\n\n\t\t\t\t\t$this.stepsDataDic[$this.current_step] = null;\n\t\t\t\t\t$this.initCurrentStep();\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t} else {\n\n\t\t\tthis.current_step = this.current_step + 1;\n\t\t\tthis.initCurrentStep();\n\t\t}\n\t}\n\n\tbuildImportMapping( array ) {\n\n\t\tvar result = {};\n\t\tvar content;\n\n\t\tvar len = array.length;\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar item = array[i];\n\t\t\tif ( item.field ) {\n\t\t\t\tcontent = {};\n\t\t\t\tcontent.field = item.field;\n\t\t\t\tcontent.map_column_name = item.map_column_name;\n\t\t\t\tcontent.default_value = item.default_value;\n\t\t\t\tcontent.parse_hint = item.parse_hint;\n\t\t\t\tresult[item.field] = content;\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n\n\t/* jshint ignore:start */\n\tsaveCurrentStep() {\n\t\tthis.stepsDataDic[this.current_step] = {};\n\t\tvar current_step_data = this.stepsDataDic[this.current_step];\n\t\tvar current_step_ui = this.stepsWidgetDic[this.current_step];\n\t\tswitch ( this.current_step ) {\n\t\t\tcase 1:\n\t\t\t\tcurrent_step_data.import_class = current_step_ui.import_class.getValue();\n\n\t\t\t\tvar formatted_import_class = current_step_data.import_class.charAt( 0 ).toUpperCase() + current_step_data.import_class.slice( 1 );\n\n\t\t\t\tthis.api_import.className = 'APIImport' + formatted_import_class;\n\t\t\t\tthis.api_import.key_name = 'Import' + formatted_import_class;\n\n\t\t\t\tbreak;\n\t\t\tcase 2:\n\t\t\t\tcurrent_step_data.file_uploader = current_step_ui.file_uploader.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 3:\n\t\t\t\tvar grid = current_step_ui.import_data;\n\t\t\t\tcurrent_step_data.import_data = this.buildImportMapping( grid.getData() );\n\t\t\t\tcurrent_step_data.import_data_for_layout = grid.getData();\n\t\t\t\tcurrent_step_data.saved_mapping = current_step_ui.saved_mapping.getValue();\n\t\t\t\tbreak;\n\t\t\tcase 4:\n\t\t\t\tfor ( var key in current_step_ui ) {\n\n\t\t\t\t\tif ( !current_step_ui.hasOwnProperty( key ) ) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tcurrent_step_data[key] = current_step_ui[key].getValue();\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\tsetDefaultDataToSteps() {\n\n\t\tif ( !this.default_data ) {\n\t\t\treturn null;\n\t\t}\n\t}\n\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBLElBQUk7O0FBRUo7O0FBRUE7O0FBRUEsSUFBSTtBQUNKOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7O0FBRUE7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJOztBQUVKO0FBQ0E7QUFDQTs7QUFFQSxFQUFFLENBQUM7QUFDSDs7QUFFQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLDZCQUE2QixDQUFDO0FBQzlCO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsZ0NBQWdDO0FBQ2hDO0FBQ0E7O0FBRUE7O0FBRUE7QUFDQTs7QUFFQTtBQUNBLEtBQUs7O0FBRUwsSUFBSTs7QUFFSjtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBLG1CQUFtQixTQUFTO0FBQzVCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7O0FBRUEiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9pbnRlcmZhY2UvaHRtbDUvdmlld3Mvd2l6YXJkL2ltcG9ydF9jc3YvSW1wb3J0Q1NWV2l6YXJkQ29udHJvbGxlci5qcz8yNzg4Il0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAnQC9nbG9iYWwvd2lkZ2V0cy9maWxlYnJvd3Nlci9USW1hZ2VCcm93c2VyJztcblxuZXhwb3J0IGNsYXNzIEltcG9ydENTVldpemFyZENvbnRyb2xsZXIgZXh0ZW5kcyBCYXNlV2l6YXJkQ29udHJvbGxlciB7XG5cdGNvbnN0cnVjdG9yKCBvcHRpb25zID0ge30gKSB7XG5cdFx0Xy5kZWZhdWx0cyggb3B0aW9ucywge1xuXHRcdFx0ZWw6ICcud2l6YXJkLWJnJyxcblxuXHRcdFx0YXBpX2ltcG9ydDogbnVsbCxcblxuXHRcdFx0cGFyc2VfaGludF9zb3VyY2U6IG51bGwsXG5cblx0XHRcdGZpZWxkX3NvdXJjZTogbnVsbCxcblxuXHRcdFx0c2VsZWN0X2dyaWRfbGFzdF9yb3c6IG51bGwsXG5cblx0XHRcdGxhc3RfaWQ6IDAsIC8vIExhc3QgZ3JpZCBpZFxuXG5cdFx0XHRzYXZlZF9sYXlvdXRfYXJyYXk6IG51bGwsXG5cblx0XHRcdGNvbHVtbl9tYXBfZGF0YTogbnVsbCwgLy9Vc2VkIHRvIGJ1aWxkIGdyaWQgZGF0YVxuXG5cdFx0XHQvLyBfcmVxdWlyZWRfZmlsZXM6IFsnVEltYWdlQnJvd3NlciddXG5cdFx0fSApO1xuXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcblx0fVxuXG5cdGluaXQoIG9wdGlvbnMgKSB7XG5cdFx0Ly90aGlzLl9zdXBlcignaW5pdGlhbGl6ZScsIG9wdGlvbnMgKTtcblxuXHRcdHRoaXMudGl0bGUgPSAkLmkxOG4uXyggJ0ltcG9ydCBXaXphcmQnICk7XG5cdFx0dGhpcy5zdGVwcyA9IDY7XG5cdFx0dGhpcy5jdXJyZW50X3N0ZXAgPSAxO1xuXHRcdHRoaXMud2l6YXJkX2lkID0gJ1Byb2Nlc3NQYXlyb2xsV2l6YXJkJztcblx0XHR0aGlzLmFwaV9pbXBvcnQgPSBUVEFQSS5BUElJbXBvcnQ7XG5cblx0XHR0aGlzLnJlbmRlcigpO1xuXHR9XG5cblx0cmVuZGVyKCkge1xuXHRcdHN1cGVyLnJlbmRlcigpO1xuXG5cdFx0dGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblx0fVxuXG5cdC8vQ3JlYXRlIGVhY2ggcGFnZSBVSVxuXHRidWlsZEN1cnJlbnRTdGVwVUkoKSB7XG5cblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHRoaXMuY29udGVudF9kaXYuZW1wdHkoKTtcblx0XHRzd2l0Y2ggKCB0aGlzLmN1cnJlbnRfc3RlcCApIHtcblx0XHRcdGNhc2UgMTpcblx0XHRcdFx0dmFyIGxhYmVsID0gdGhpcy5nZXRMYWJlbCgpO1xuXHRcdFx0XHRsYWJlbC50ZXh0KCAkLmkxOG4uXyggJ1NlbGVjdCB0aGUgdHlwZSBvZiBvYmplY3RzIHRoYXQgeW91IHdpc2ggdG8gaW1wb3J0JyApICk7XG5cblx0XHRcdFx0dmFyIGNvbWJvX2JveCA9IHRoaXMuZ2V0Q29tYm9Cb3goICdpbXBvcnRfY2xhc3MnICk7XG5cblx0XHRcdFx0dmFyIGV4YW1wbGVfbGFiZWwgPSB0aGlzLmdldExhYmVsKCk7XG5cdFx0XHRcdGV4YW1wbGVfbGFiZWwudGV4dCggJC5pMThuLl8oICdEb3dubG9hZCBleGFtcGxlIENTViBmaWxlJyApICk7XG5cdFx0XHRcdGV4YW1wbGVfbGFiZWwuY3NzKCAndGV4dC1kZWNvcmF0aW9uJywgJ3VuZGVybGluZScgKTtcblx0XHRcdFx0ZXhhbXBsZV9sYWJlbC5jc3MoICdjdXJzb3InLCAncG9pbnRlcicgKTtcblx0XHRcdFx0ZXhhbXBsZV9sYWJlbC5jc3MoICdtYXJnaW4tdG9wJywgJzI1cHgnICk7XG5cblx0XHRcdFx0dGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF0gPSB7fTtcblx0XHRcdFx0dGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1bY29tYm9fYm94LmdldEZpZWxkKCldID0gY29tYm9fYm94O1xuXG5cdFx0XHRcdGV4YW1wbGVfbGFiZWwudW5iaW5kKCAnY2xpY2snICkuYmluZCggJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHR2YXIgY3VycmVudF9zdGVwX3VpID0gJHRoaXMuc3RlcHNXaWRnZXREaWNbJHRoaXMuY3VycmVudF9zdGVwXTtcblx0XHRcdFx0XHR2YXIgY3VycmVudF92YWx1ZSA9IGN1cnJlbnRfc3RlcF91aS5pbXBvcnRfY2xhc3MuZ2V0VmFsdWUoKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdHZhciB1cmwgPSBTZXJ2aWNlQ2FsbGVyLmdldFVSTEJ5T2JqZWN0VHlwZSggJ2ltcG9ydF9jc3ZfZXhhbXBsZScgKSArICdpbXBvcnRfJyArIGN1cnJlbnRfdmFsdWUgKyAnX2V4YW1wbGUuY3N2Jztcblx0XHRcdFx0XHR3aW5kb3cub3BlbiggdXJsLCAnX2JsYW5rJyApO1xuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0dGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF1bJ2V4YW1wbGVfbGFiZWwnXSA9IGV4YW1wbGVfbGFiZWw7XG5cblx0XHRcdFx0Y29tYm9fYm94LnVuYmluZCggJ2NoYW5nZScgKS5iaW5kKCAnY2hhbmdlJywgZnVuY3Rpb24oIGUgKSB7XG5cdFx0XHRcdFx0ZXhhbXBsZV9sYWJlbC50ZXh0KCAkLmkxOG4uXyggJ0Rvd25sb2FkIGV4YW1wbGUnICkgKyAnICcgKyBjb21ib19ib3guZ2V0TGFiZWwoKSArICcgJyArICQuaTE4bi5fKCAnQ1NWIGZpbGUnICkgKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdHRoaXMuY29udGVudF9kaXYuYXBwZW5kKCBsYWJlbCApO1xuXHRcdFx0XHR0aGlzLmNvbnRlbnRfZGl2LmFwcGVuZCggY29tYm9fYm94ICk7XG5cdFx0XHRcdHRoaXMuY29udGVudF9kaXYuYXBwZW5kKCBleGFtcGxlX2xhYmVsICk7XG5cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDI6XG5cdFx0XHRcdGxhYmVsID0gdGhpcy5nZXRMYWJlbCgpO1xuXHRcdFx0XHRsYWJlbC50ZXh0KCAkLmkxOG4uXyggJ1VwbG9hZCBDb21tYSBTZXBhcmF0ZWQgVmFsdWUgKENTVikgdGV4dCBmaWxlJyApICk7XG5cblx0XHRcdFx0dmFyIGZpbGVfYnJvd3NlciA9IHRoaXMuZ2V0RmlsZUJyb3dzZXIoICdmaWxlX3VwbG9hZGVyJywgJy5jc3YsIC50eHQsIC54bHMsIC54bHN4LCAub2RzJyApO1xuXG5cdFx0XHRcdHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdID0ge307XG5cdFx0XHRcdHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdW2ZpbGVfYnJvd3Nlci5nZXRGaWVsZCgpXSA9IGZpbGVfYnJvd3NlcjtcblxuXHRcdFx0XHR0aGlzLmNvbnRlbnRfZGl2LmFwcGVuZCggbGFiZWwgKTtcblx0XHRcdFx0dGhpcy5jb250ZW50X2Rpdi5hcHBlbmQoIGZpbGVfYnJvd3NlciApO1xuXG5cdFx0XHRcdGZpbGVfYnJvd3Nlci51bmJpbmQoICdpbWFnZUNoYW5nZScgKS5iaW5kKCAnaW1hZ2VDaGFuZ2UnLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAoIGZpbGVfYnJvd3Nlci5nZXRWYWx1ZSgpICkge1xuXHRcdFx0XHRcdFx0R2xvYmFsLnNldFdpZGdldEVuYWJsZWQoICR0aGlzLmJhY2tfYnRuLCB0cnVlICk7XG5cdFx0XHRcdFx0XHRHbG9iYWwuc2V0V2lkZ2V0RW5hYmxlZCggJHRoaXMubmV4dF9idG4sIHRydWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMzpcblx0XHRcdFx0bGFiZWwgPSB0aGlzLmdldExhYmVsKCk7XG5cdFx0XHRcdGxhYmVsLnRleHQoICQuaTE4bi5fKCAnTWFwIGNvbHVtbnMgZnJvbSB0aGUgdXBsb2FkZWQgZmlsZScgKSApO1xuXG5cdFx0XHRcdHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdID0ge307XG5cblx0XHRcdFx0Ly9TYXZlZCBsYXlvdXRcblxuXHRcdFx0XHR2YXIgc2F2ZWRfbGF5b3V0X2RpdiA9ICQoICc8ZGl2PjwvZGl2PicgKTtcblxuXHRcdFx0XHR2YXIgZm9ybV9pdGVtX2xhYmVsID0gJCggJzxzcGFuPjwvc3Bhbj4nICk7XG5cblx0XHRcdFx0c2F2ZWRfbGF5b3V0X2Rpdi5hcHBlbmQoIGZvcm1faXRlbV9sYWJlbCApO1xuXG5cdFx0XHRcdGZvcm1faXRlbV9sYWJlbC50ZXh0KCAkLmkxOG4uXyggJ1NhdmUgTWFwcGluZyBBcycgKSApO1xuXG5cdFx0XHRcdHZhciBzYXZlX21hcHBpbmdfaW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFRfSU5QVVQgKS5UVGV4dElucHV0KCk7XG5cblx0XHRcdFx0dmFyIHNhdmVfYnRuID0gJCggJzxpbnB1dCBjbGFzcz1cXCd0LWJ1dHRvblxcJyBzdHlsZT1cXCdtYXJnaW4tbGVmdDogNXB4XFwnIHR5cGU9XFwnYnV0dG9uXFwnIHZhbHVlPVxcJycgKyAkLmkxOG4uXyggJ1NhdmUnICkgKyAnXFwnPjwvaW5wdXQ+JyApO1xuXG5cdFx0XHRcdHNhdmVkX2xheW91dF9kaXYuYXBwZW5kKCBzYXZlX21hcHBpbmdfaW5wdXQgKTtcblx0XHRcdFx0c2F2ZWRfbGF5b3V0X2Rpdi5hcHBlbmQoIHNhdmVfYnRuICk7XG5cblx0XHRcdFx0Zm9ybV9pdGVtX2xhYmVsID0gJCggJzxzcGFuIHN0eWxlPVxcJ21hcmdpbi1sZWZ0OiA1cHhcXCcgPicgKyAkLmkxOG4uXyggJ1NhdmVkIE1hcHBpbmcnICkgKyAnOjwvc3Bhbj4nICk7XG5cblx0XHRcdFx0dmFyIHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3RvciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3RvciA9IHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3Rvci5UQ29tYm9Cb3goKTtcblx0XHRcdFx0cHJldmlvdXNfc2F2ZWRfbGF5b3V0X3NlbGVjdG9yLnNldFZhbHVlS2V5KCAnaWQnICk7XG5cdFx0XHRcdHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3Rvci5zZXRMYWJlbEtleSggJ25hbWUnICk7XG5cblx0XHRcdFx0dmFyIHVwZGF0ZV9idG4gPSAkKCAnPGlucHV0IGNsYXNzPVxcJ3QtYnV0dG9uXFwnIHN0eWxlPVxcJ21hcmdpbi1sZWZ0OiA1cHhcXCcgdHlwZT1cXCdidXR0b25cXCcgdmFsdWU9XFwnJyArICQuaTE4bi5fKCAnVXBkYXRlJyApICsgJ1xcJz48L2lucHV0PicgKTtcblx0XHRcdFx0dmFyIGRlbF9idG4gPSAkKCAnPGlucHV0IGNsYXNzPVxcJ3QtYnV0dG9uXFwnIHN0eWxlPVxcJ21hcmdpbi1sZWZ0OiA1cHhcXCcgdHlwZT1cXCdidXR0b25cXCcgdmFsdWU9XFwnJyArICQuaTE4bi5fKCAnRGVsZXRlJyApICsgJ1xcJz48L2lucHV0PicgKTtcblxuXHRcdFx0XHRzYXZlX2J0bi51bmJpbmQoICdjbGljaycgKS5iaW5kKCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHR2YXIgbmFtZSA9IHNhdmVfbWFwcGluZ19pbnB1dC5nZXRWYWx1ZSgpO1xuXHRcdFx0XHRcdGlmICggIW5hbWUgKSB7XG5cdFx0XHRcdFx0XHRUQWxlcnRNYW5hZ2VyLnNob3dBbGVydCggJC5pMThuLl8oICdNYXBwaW5nIE5hbWUgaXMgYmxhbmsnICkgKTtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0JHRoaXMuc2F2ZU5ld01hcHBpbmcoIHNhdmVfbWFwcGluZ19pbnB1dC5nZXRWYWx1ZSgpICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHR1cGRhdGVfYnRuLnVuYmluZCggJ2NsaWNrJyApLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCR0aGlzLnVwZGF0ZVNlbGVjdE1hcHBpbmcoIHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3Rvci5nZXRWYWx1ZSgpICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRkZWxfYnRuLnVuYmluZCggJ2NsaWNrJyApLmJpbmQoICdjbGljaycsIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCR0aGlzLmRlbGV0ZVNlbGVjdE1hcHBpbmcoIHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3Rvci5nZXRWYWx1ZSgpICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRzYXZlZF9sYXlvdXRfZGl2LmFwcGVuZCggZm9ybV9pdGVtX2xhYmVsICk7XG5cdFx0XHRcdHNhdmVkX2xheW91dF9kaXYuYXBwZW5kKCBwcmV2aW91c19zYXZlZF9sYXlvdXRfc2VsZWN0b3IgKTtcblx0XHRcdFx0c2F2ZWRfbGF5b3V0X2Rpdi5hcHBlbmQoIHVwZGF0ZV9idG4gKTtcblx0XHRcdFx0c2F2ZWRfbGF5b3V0X2Rpdi5hcHBlbmQoIGRlbF9idG4gKTtcblxuXHRcdFx0XHR0aGlzLnN0ZXBzV2lkZ2V0RGljW3RoaXMuY3VycmVudF9zdGVwXVsnc2F2ZWRfbWFwcGluZyddID0gcHJldmlvdXNfc2F2ZWRfbGF5b3V0X3NlbGVjdG9yO1xuXG5cdFx0XHRcdHByZXZpb3VzX3NhdmVkX2xheW91dF9zZWxlY3Rvci5iaW5kKCAnZm9ybUl0ZW1DaGFuZ2UnLCBmdW5jdGlvbiggZSwgdGFyZ2V0ICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uU2F2ZWRMYXlvdXRDaGFuZ2UoIHRhcmdldC5nZXRWYWx1ZSgpICk7XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHQvL2FkZCBtaW51cyBidXR0b25zXG5cdFx0XHRcdHZhciBhY3Rpb25fYnV0dG9uX2RpdiA9ICQoICc8ZGl2IHN0eWxlPVwibWFyZ2luLWxlZnQ6IDE1cHg7dGV4dC1hbGlnbjogbGVmdDsgbWFyZ2luLWJvdHRvbTogNXB4O1wiPjwvZGl2PicgKTtcblx0XHRcdFx0dmFyIGFkZF9pY29uID0gJCggJzxidXR0b24gY2xhc3M9XCJwbHVzLWljb25cIiBzdHlsZT1cIm1hcmdpbi1yaWdodDogNXB4O1wiPjwvYnV0dG9uPicgKTtcblx0XHRcdFx0dmFyIG1pbnVzX2ljb24gPSAkKCAnPGJ1dHRvbiBjbGFzcz1cIm1pbnVzLWljb25cIj48L2J1dHRvbj4nICk7XG5cblx0XHRcdFx0YWN0aW9uX2J1dHRvbl9kaXYuYXBwZW5kKCBhZGRfaWNvbiApO1xuXHRcdFx0XHRhY3Rpb25fYnV0dG9uX2Rpdi5hcHBlbmQoIG1pbnVzX2ljb24gKTtcblxuXHRcdFx0XHR0aGlzLmNvbnRlbnRfZGl2LmFwcGVuZCggbGFiZWwgKTtcblx0XHRcdFx0dGhpcy5jb250ZW50X2Rpdi5hcHBlbmQoIHNhdmVkX2xheW91dF9kaXYgKTtcblx0XHRcdFx0dGhpcy5jb250ZW50X2Rpdi5hcHBlbmQoIGFjdGlvbl9idXR0b25fZGl2ICk7XG5cblx0XHRcdFx0dmFyIGdyaWRfaWQgPSAnaW1wb3J0X2RhdGEnO1xuXHRcdFx0XHR2YXIgZ3JpZF9kaXYgPSAkKCAnPGRpdiBjbGFzcz1cXCdncmlkLWRpdiB3aXphcmQtZ3JpZC1kaXZcXCc+IDx0YWJsZSBpZD1cXCcnICsgZ3JpZF9pZCArICdcXCc+PC90YWJsZT48L2Rpdj4nICk7XG5cdFx0XHRcdHRoaXMuc2V0SW1wb3J0R3JpZCggZ3JpZF9pZCwgZ3JpZF9kaXYgKTtcblxuXHRcdFx0XHRhZGRfaWNvbi5iaW5kKCAnY2xpY2snLCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHQkdGhpcy5hZGRSb3coKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdG1pbnVzX2ljb24uYmluZCggJ2NsaWNrJywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0JHRoaXMubWludXNSb3coKTtcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSA0OlxuXHRcdFx0XHRsYWJlbCA9IHRoaXMuZ2V0TGFiZWwoKTtcblx0XHRcdFx0bGFiZWwudGV4dCggJC5pMThuLl8oICdTZWxlY3QgaW1wb3J0IHNldHRpbmdzJyApICk7XG5cblx0XHRcdFx0dGhpcy5jb250ZW50X2Rpdi5hcHBlbmQoIGxhYmVsICk7XG5cblx0XHRcdFx0dGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF0gPSB7fTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgNTpcblxuXHRcdH1cblx0fVxuXG5cdG9uU2F2ZWRMYXlvdXRDaGFuZ2UoIHZhbHVlICkge1xuXHRcdHZhciBncmlkID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF0uaW1wb3J0X2RhdGE7XG5cblx0XHR2YXIgbGVuID0gdGhpcy5zYXZlZF9sYXlvdXRfYXJyYXkubGVuZ3RoO1xuXG5cdFx0dmFyIGlkID0gMTtcblxuXHRcdHZhciBzZWxlY3RfZGF0YSA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHR2YXIgbGF5b3V0ID0gdGhpcy5zYXZlZF9sYXlvdXRfYXJyYXlbaV07XG5cblx0XHRcdGlmICggbGF5b3V0LmlkID09PSB2YWx1ZSApIHtcblx0XHRcdFx0c2VsZWN0X2RhdGEgPSBsYXlvdXQuZGF0YTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgc2VsZWN0X2RhdGEubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHR2YXIgaXRlbSA9IHNlbGVjdF9kYXRhW2ldO1xuXHRcdFx0aXRlbS5pZCA9ICdjc3YnICsgaWQ7XG5cdFx0XHRpdGVtLmZpZWxkID0gaXRlbS5maWVsZCA/IGl0ZW0uZmllbGQgOiBUVFVVSUQuemVyb19pZDsgLy9NYWtlIHN1cmUgYW55IGJsYW5rIGZpZWxkcyBhcmUgY29udmVydGVkIHRvIHplcm9faWRzIHRvIHByZXZlbnQgXCJ1bmRlZmluZWRcIiBmcm9tIGFwcGVhcmluZyBpbiBwbGFjZSBvZiB0aGUgZHJvcGRvd24gYm94LlxuXHRcdFx0aWQgPSBpZCArIDE7XG5cdFx0fVxuXG5cdFx0dGhpcy5sYXN0X2lkID0gaWQ7XG5cblx0XHQvL0Nsb25lIHRoaXMgYXJyYXkgYmVjYXVzZSBpdHMgY3VycmVudGx5IGEgcmVmZXJlbmNlIHRvIHRoZSByYXcgZ3JpZCBkYXRhIGl0c2VsZiBhbmQgZ3JpZC5zZXREYXRhKCkgY2xlYXJzIG91dCB0aGUgZ3JpZCBiZWZvcmUgcmVuZGVyaW5nIGl0IGFnYWluLCB3aGljaCByZXN1bHRzIGluIGEgYmxhbmsgZ3JpZCB3aGVuIHN3aXRjaGluZyBmcm9tIGEgc2F2ZWQgbWFwcGluZywgdGhlbiBiYWNrIHRvIHRoZSBvcmlnaW5hbC5cblx0XHRzZWxlY3RfZGF0YSA9IHRoaXMuc2V0U2FtcGxlUm93QmFzZU9uSW1wb3J0RmlsZSggc2VsZWN0X2RhdGEgKS5zbGljZSggMCApO1xuXG5cdFx0Z3JpZC5zZXREYXRhKCBzZWxlY3RfZGF0YSApO1xuXG5cdFx0dGhpcy5iaW5kR3JpZFJlbmRlckV2ZW50cyggZ3JpZCApO1xuXHR9XG5cblx0c2V0U2FtcGxlUm93QmFzZU9uSW1wb3J0RmlsZSggZ3JpZF9kYXRhICkge1xuXHRcdGlmICggIXRoaXMuaW1wb3J0X2RhdGEgfHwgIWdyaWRfZGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBncmlkX2RhdGEubGVuZ3RoOyBpKysgKSB7XG5cdFx0XHR2YXIgaXRlbSA9IGdyaWRfZGF0YVtpXTtcblx0XHRcdGl0ZW0ucm93XzEgPSAnJztcblx0XHRcdGZvciAoIHZhciBqID0gMDsgaiA8IHRoaXMuaW1wb3J0X2RhdGEubGVuZ3RoOyBqKysgKSB7XG5cdFx0XHRcdHZhciBpbXBvcnRfZGF0YSA9IHRoaXMuaW1wb3J0X2RhdGFbal07XG5cblx0XHRcdFx0Ly8jMjEzMiAtIG1hdGNoIGJhc2VkIG9uIG1hcF9jb2x1bW5fbmFtZVxuXHRcdFx0XHRpZiAoIGl0ZW0gJiYgaXRlbS5tYXBfY29sdW1uX25hbWUgJiYgaW1wb3J0X2RhdGEgJiYgaW1wb3J0X2RhdGEubWFwX2NvbHVtbl9uYW1lICkge1xuXHRcdFx0XHRcdGlmICggaXRlbS5tYXBfY29sdW1uX25hbWUudHJpbSgpID09PSBpbXBvcnRfZGF0YS5tYXBfY29sdW1uX25hbWUudHJpbSgpICkge1xuXHRcdFx0XHRcdFx0aXRlbS5yb3dfMSA9IGltcG9ydF9kYXRhLnJvd18xO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGdyaWRfZGF0YTtcblx0fVxuXG5cdGdldFNhdmVkTWFwcGluZyggc2VsZWN0X2xheW91dF9pZCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBhcmdzID0ge307XG5cdFx0dmFyIGZpbHRlcl9kYXRhID0ge307XG5cdFx0ZmlsdGVyX2RhdGEuc2NyaXB0ID0gJ2ltcG9ydF93aXphcmQnICsgdGhpcy5zdGVwc0RhdGFEaWNbMV0uaW1wb3J0X2NsYXNzO1xuXHRcdGZpbHRlcl9kYXRhLmRlbGV0ZWQgPSBmYWxzZTtcblx0XHRhcmdzLmZpbHRlcl9kYXRhID0gZmlsdGVyX2RhdGE7XG5cdFx0VFRBUEkuQVBJVXNlckdlbmVyaWNEYXRhLmdldFVzZXJHZW5lcmljRGF0YSggYXJncywge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdHZhciByZXNfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0XHRcdFx0aWYgKCAkLnR5cGUoIHJlc19kYXRhICkgIT09ICdhcnJheScgKSB7XG5cdFx0XHRcdFx0JHRoaXMuc2F2ZU5ld01hcHBpbmcoIEJhc2VWaWV3Q29udHJvbGxlci5kZWZhdWx0X2xheW91dF9uYW1lLCB0cnVlICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly9Gb3JjZSBzb3J0aW5nIGJ5IG5hbWUgc28gLS0gREVGQVVMVCAtLSByZWNvcmQgYXBwZWFycyBhdCB0aGUgdG9wLlxuXHRcdFx0XHRcdHJlc19kYXRhLnNvcnQoIGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gR2xvYmFsLmNvbXBhcmUoIGEsIGIsICduYW1lJyApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHQkdGhpcy5zYXZlZF9sYXlvdXRfYXJyYXkgPSByZXNfZGF0YTtcblxuXHRcdFx0XHRcdC8vSWYgbm90IHNldCBzZWxlY3QgbGF5b3V0LCBkZWZhdWx0IHRvIGZpcnN0IG9uZSBhbmQgdXBkYXRlIGl0IHRvIGN1cnJlbnQgdXBsb2FkIGNvbHVtbnNcblx0XHRcdFx0XHRpZiAoICFzZWxlY3RfbGF5b3V0X2lkICkge1xuXHRcdFx0XHRcdFx0c2VsZWN0X2xheW91dF9pZCA9IHJlc19kYXRhWzBdLmlkO1xuXG5cdFx0XHRcdFx0XHQvL09ubHkgdXBkYXRlIHRoZSBmaXJzdCBzYXZlZCBpbXBvcnQgZGF0YSByZWNvcmQgaWYgaXQgaXMgaW5mYWN0IHRoZSBERUZBVUxUIG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkIG92ZXJ3cml0ZSBzb21lIG90aGVyIHJhbmRvbSBzYXZlZCBtYXBwaW5nLCBlc3BlY2lhbGx5IGlmIHRoZXkgaGFwcGVuIHRvIHRoZSBkZWxldGUgdGhlIGRlZmF1bHQgb25lLlxuXHRcdFx0XHRcdFx0Ly8gIEl0IGhhcyB0byB1cGRhdGUgdGhlIERFRkFVTFQgc2F2ZWQgbWFwcGluZywgb3RoZXJ3aXNlIGlmIHRoZSB1c2VyIGNoYW5nZXMgdG8gYSBkaWZmZXJlbnQgbWFwcGluZywgdGhlbiBjaGFuZ2VzIGJhY2ssIGFsbCB0aGUgc2V0dGluZ3Mgd2lsbCBiZSBsb3N0LlxuXHRcdFx0XHRcdFx0aWYgKCByZXNfZGF0YVswXS5pc19kZWZhdWx0ID09IHRydWUgfHwgcmVzX2RhdGFbMF0ubmFtZSA9PSBCYXNlVmlld0NvbnRyb2xsZXIuZGVmYXVsdF9sYXlvdXRfbmFtZSApIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMudXBkYXRlU2VsZWN0TWFwcGluZyggc2VsZWN0X2xheW91dF9pZCApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc2F2ZU5ld01hcHBpbmcoIEJhc2VWaWV3Q29udHJvbGxlci5kZWZhdWx0X2xheW91dF9uYW1lLCB0cnVlICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JHRoaXMuc2V0U2F2ZWRNYXBwaW5nT3B0aW9ucyggcmVzX2RhdGEsIHNlbGVjdF9sYXlvdXRfaWQgKTtcblxuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRnZXRMYXlvdXRCeUlkKCBzZWxlY3RfaWQgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMuc2F2ZWRfbGF5b3V0X2FycmF5Lmxlbmd0aDtcblxuXHRcdGZvciAoIHZhciBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0dmFyIGxheW91dCA9IHRoaXMuc2F2ZWRfbGF5b3V0X2FycmF5W2ldO1xuXG5cdFx0XHRpZiAoIGxheW91dC5pZCA9PT0gc2VsZWN0X2lkICkge1xuXHRcdFx0XHRyZXR1cm4gbGF5b3V0O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdGRlbGV0ZVNlbGVjdE1hcHBpbmcoIHNlbGVjdF9pZCApIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBzZWxlY3RfbGF5b3V0ID0gdGhpcy5nZXRMYXlvdXRCeUlkKCBzZWxlY3RfaWQgKTtcblxuXHRcdGlmICggc2VsZWN0X2xheW91dC5pc19kZWZhdWx0ID09IHRydWUgfHwgc2VsZWN0X2xheW91dC5uYW1lID09PSBCYXNlVmlld0NvbnRyb2xsZXIuZGVmYXVsdF9sYXlvdXRfbmFtZSApIHtcblx0XHRcdFRBbGVydE1hbmFnZXIuc2hvd0FsZXJ0KCAkLmkxOG4uXyggJ0NhblxcJ3QgZGVsZXRlIGRlZmF1bHQgbGF5b3V0JyApICk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0VEFsZXJ0TWFuYWdlci5zaG93Q29uZmlybUFsZXJ0KCAkLmkxOG4uXyggJ0FyZSB5b3Ugc3VyZSB5b3Ugd2lzaCB0byBjb250aW51ZT8nICksIG51bGwsIGZ1bmN0aW9uKCBmbGFnICkge1xuXHRcdFx0aWYgKCBmbGFnICkge1xuXHRcdFx0XHRUVEFQSS5BUElVc2VyR2VuZXJpY0RhdGEuZGVsZXRlVXNlckdlbmVyaWNEYXRhKCBzZWxlY3RfaWQsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLm9uU2F2ZWRMYXlvdXRDaGFuZ2UoICR0aGlzLnNhdmVkX2xheW91dF9hcnJheVswXS5pZCApO1xuXHRcdFx0XHRcdFx0JHRoaXMuZ2V0U2F2ZWRNYXBwaW5nKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0dXBkYXRlU2VsZWN0TWFwcGluZyggc2VsZWN0X2lkICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR0aGlzLnNhdmVDdXJyZW50U3RlcCgpO1xuXHRcdHZhciBzZWxlY3RfbGF5b3V0ID0gdGhpcy5nZXRMYXlvdXRCeUlkKCBzZWxlY3RfaWQgKTtcblxuXHRcdHNlbGVjdF9sYXlvdXQuZGF0YSA9IHRoaXMuc3RlcHNEYXRhRGljW3RoaXMuY3VycmVudF9zdGVwXS5pbXBvcnRfZGF0YV9mb3JfbGF5b3V0O1xuXG5cdFx0VFRBUEkuQVBJVXNlckdlbmVyaWNEYXRhLnNldFVzZXJHZW5lcmljRGF0YSggc2VsZWN0X2xheW91dCwge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdC8vUmVmcmVzaCBzYXZlZCBtYXBwaW5nIGRhdGEgb25jZSBpdCBoYXMgYmVlbiBzYXZlZCBvbiB0aGUgc2VydmVyLlxuXHRcdFx0XHQvLyBUaGlzIG1ha2VzIGl0IHNvIGlmIHRoZSB1c2VyIGNsaWNrcyB0aGUgVVBEQVRFIGJ1dHRvbiwgdGhlbiBzd2l0Y2hlcyB0byBhbm90aGVyIHNhdmVkIG1hcHBpbmcsIHRoZW4gc3dpdGNoZXMgYmFjaywgdGhleSB3aWxsIHNlZSB0aGVpciBtb3N0IHJlY2VudCBzZXR0aW5ncy5cblx0XHRcdFx0JHRoaXMuZ2V0U2F2ZWRNYXBwaW5nKCBzZWxlY3RfaWQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRzYXZlTmV3TWFwcGluZyggbmFtZSwgaXNfZGVmYXVsdCApIHtcblx0XHR0aGlzLnNhdmVDdXJyZW50U3RlcCgpO1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdGFyZ3Muc2NyaXB0ID0gJ2ltcG9ydF93aXphcmQnICsgdGhpcy5zdGVwc0RhdGFEaWNbMV0uaW1wb3J0X2NsYXNzO1xuXHRcdGFyZ3MubmFtZSA9IG5hbWU7XG5cdFx0YXJncy5pc19kZWZhdWx0ID0gKCBpc19kZWZhdWx0ICYmIGlzX2RlZmF1bHQgPT0gdHJ1ZSA/IHRydWUgOiBmYWxzZSApO1xuXHRcdGFyZ3MuZGF0YSA9IHRoaXMuc3RlcHNEYXRhRGljW3RoaXMuY3VycmVudF9zdGVwXS5pbXBvcnRfZGF0YV9mb3JfbGF5b3V0O1xuXG5cdFx0VFRBUEkuQVBJVXNlckdlbmVyaWNEYXRhLnNldFVzZXJHZW5lcmljRGF0YSggYXJncywge1xuXHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdGlmICggIXJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdFx0XHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93RXJyb3JBbGVydCggcmVzdWx0ICk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0JHRoaXMuZ2V0U2F2ZWRNYXBwaW5nKCByZXN1bHQuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG5cblx0c2V0U2F2ZWRNYXBwaW5nT3B0aW9ucyggYXJyYXksIHNlbGVjdF9sYXlvdXRfaWQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCAkdGhpcy5zdGVwc1dpZGdldERpY1skdGhpcy5jdXJyZW50X3N0ZXBdWydzYXZlZF9tYXBwaW5nJ10gKSA9PSB0cnVlICkge1xuXHRcdFx0dmFyIHNlbGVjdG9yID0gJHRoaXMuc3RlcHNXaWRnZXREaWNbJHRoaXMuY3VycmVudF9zdGVwXVsnc2F2ZWRfbWFwcGluZyddO1xuXG5cdFx0XHRzZWxlY3Rvci5zZXRTb3VyY2VEYXRhKCBhcnJheSApO1xuXG5cdFx0XHRpZiAoIHNlbGVjdF9sYXlvdXRfaWQgKSB7XG5cdFx0XHRcdHNlbGVjdG9yLnNldFZhbHVlKCBzZWxlY3RfbGF5b3V0X2lkICk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdCR0aGlzLnNhdmVkX2xheW91dF9hcnJheSA9IGFycmF5O1xuXHR9XG5cblx0YWRkUm93KCkge1xuXHRcdHZhciBncmlkID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF0uaW1wb3J0X2RhdGE7XG5cdFx0dmFyIGFsbF9kYXRhID0gZ3JpZC5nZXREYXRhKCk7XG5cblx0XHR2YXIgZGF0YSA9IHt9O1xuXHRcdGRhdGEuaWQgPSAnY3N2JyArIHRoaXMubGFzdF9pZDtcblx0XHRkYXRhLmZpZWxkID0gVFRVVUlELnplcm9faWQ7XG5cdFx0ZGF0YS5kZWZhdWx0X3ZhbHVlID0gJyc7XG5cdFx0ZGF0YS5wYXJzZV9oaW50ID0gJyc7XG5cdFx0ZGF0YS5tYXBfY29sdW1uX25hbWUgPSAkLmkxOG4uXyggJ05ldyBGaWVsZCBDb2x1bW4nICk7XG5cdFx0ZGF0YS5yb3dfMSA9ICcnO1xuXG5cdFx0dGhpcy5sYXN0X2lkID0gdGhpcy5sYXN0X2lkICsgMTtcblxuXHRcdGFsbF9kYXRhLnB1c2goIGRhdGEgKTtcblxuXHRcdGdyaWQuc2V0RGF0YSggYWxsX2RhdGEsIGZhbHNlICk7XG5cblx0XHRncmlkLmdyaWQuanFHcmlkKCAnc2V0U2VsZWN0aW9uJywgZGF0YS5pZCApO1xuXG5cdFx0dGhpcy5iaW5kR3JpZFJlbmRlckV2ZW50cyggZ3JpZCApO1xuXHR9XG5cblx0bWludXNSb3coKSB7XG5cblx0XHR2YXIgZ3JpZCA9IHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdLmltcG9ydF9kYXRhO1xuXHRcdHZhciBzZWxfaWQgPSBncmlkLmdldEdyaWRQYXJhbSggJ3NlbHJvdycgKTtcblxuXHRcdGlmICggIXNlbF9pZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgYWxsX2RhdGEgPSBncmlkLmdldEdyaWRQYXJhbSggJ2RhdGEnICk7XG5cblx0XHRmb3IgKCB2YXIgaSA9IGFsbF9kYXRhLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tICkge1xuXHRcdFx0dmFyIGRhdGEgPSBhbGxfZGF0YVtpXTtcblxuXHRcdFx0aWYgKCBkYXRhLmlkID09PSBzZWxfaWQgKSB7XG5cdFx0XHRcdGFsbF9kYXRhLnNwbGljZSggaSwgMSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGdyaWQuc2V0RGF0YSggYWxsX2RhdGEsIGZhbHNlICk7XG5cblx0XHRncmlkLmdyaWQuanFHcmlkKCAnc2V0U2VsZWN0aW9uJywgYWxsX2RhdGFbYWxsX2RhdGEubGVuZ3RoIC0gMV0uaWQgKTtcblx0fVxuXG5cdGdldEdyaWRDb2x1bW5zKCBncmlkSWQsIGNhbGxCYWNrICkge1xuXHRcdHZhciBjb2x1bW5faW5mb19hcnJheSA9IFtdO1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHRzd2l0Y2ggKCBncmlkSWQgKSB7XG5cdFx0XHRjYXNlICdpbXBvcnRfZGF0YSc6XG5cblx0XHRcdFx0dmFyIGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRcdG5hbWU6ICdtYXBfY29sdW1uX25hbWUnLFxuXHRcdFx0XHRcdGluZGV4OiAnbWFwX2NvbHVtbl9uYW1lJyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdGaWxlIENvbHVtbicgKSxcblx0XHRcdFx0XHR3aWR0aDogMTAwLFxuXHRcdFx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdFx0XHR0aXRsZTogZmFsc2UsXG5cdFx0XHRcdFx0Zm9ybWF0dGVyOiBmdW5jdGlvbiggY2VsbF92YWx1ZSwgcmVsYXRlZF9kYXRhLCByb3cgKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJHRoaXMub25UZXh0SW5wdXRSZW5kZXIoIGNlbGxfdmFsdWUsIHJlbGF0ZWRfZGF0YSwgcm93ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRcdG5hbWU6ICdmaWVsZCcsXG5cdFx0XHRcdFx0aW5kZXg6ICdmaWVsZCcsXG5cdFx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRmllbGQnICksXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogZnVuY3Rpb24oIGNlbGxfdmFsdWUsIHJlbGF0ZWRfZGF0YSwgcm93ICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICR0aGlzLm9uRmllbGRSZW5kZXIoIGNlbGxfdmFsdWUsIHJlbGF0ZWRfZGF0YSwgcm93ICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0XHRcdGNvbHVtbl9pbmZvID0ge1xuXHRcdFx0XHRcdG5hbWU6ICdkZWZhdWx0X3ZhbHVlJyxcblx0XHRcdFx0XHRpbmRleDogJ2RlZmF1bHRfdmFsdWUnLFxuXHRcdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0RlZmF1bHQgVmFsdWUnICksXG5cdFx0XHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHRcdFx0dGl0bGU6IGZhbHNlLFxuXHRcdFx0XHRcdGZvcm1hdHRlcjogZnVuY3Rpb24oIGNlbGxfdmFsdWUsIHJlbGF0ZWRfZGF0YSwgcm93ICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICR0aGlzLm9uVGV4dElucHV0UmVuZGVyKCBjZWxsX3ZhbHVlLCByZWxhdGVkX2RhdGEsIHJvdyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdFx0Y29sdW1uX2luZm9fYXJyYXkucHVzaCggY29sdW1uX2luZm8gKTtcblxuXHRcdFx0XHRjb2x1bW5faW5mbyA9IHtcblx0XHRcdFx0XHRuYW1lOiAncGFyc2VfaGludCcsXG5cdFx0XHRcdFx0aW5kZXg6ICdwYXJzZV9oaW50Jyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdQYXJzZSBIaW50JyApLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdHRpdGxlOiBmYWxzZSxcblx0XHRcdFx0XHRmb3JtYXR0ZXI6IGZ1bmN0aW9uKCBjZWxsX3ZhbHVlLCByZWxhdGVkX2RhdGEsIHJvdyApIHtcblx0XHRcdFx0XHRcdHJldHVybiAkdGhpcy5vblBhcnNlSGludFJlbmRlciggY2VsbF92YWx1ZSwgcmVsYXRlZF9kYXRhLCByb3cgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cdFx0XHRcdGNvbHVtbl9pbmZvX2FycmF5LnB1c2goIGNvbHVtbl9pbmZvICk7XG5cblx0XHRcdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRcdFx0bmFtZTogJ3Jvd18xJyxcblx0XHRcdFx0XHRpbmRleDogJ3Jvd18xJyxcblx0XHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdTYW1wbGUgUm93JyApLFxuXHRcdFx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRcdHRpdGxlOiBmYWxzZVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRjb2x1bW5faW5mb19hcnJheS5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0XHRcdGJyZWFrO1xuXG5cdFx0fVxuXG5cdFx0Y2FsbEJhY2soIGNvbHVtbl9pbmZvX2FycmF5ICk7XG5cdH1cblxuXHRvblBhcnNlSGludFJlbmRlciggY2VsbF92YWx1ZSwgcmVsYXRlZF9kYXRhLCByb3cgKSB7XG5cdFx0dmFyIHdpZGdldDtcblx0XHR2YXIgY29sX21vZGVsID0gcmVsYXRlZF9kYXRhLmNvbE1vZGVsO1xuXHRcdHZhciByb3dfaWQgPSByZWxhdGVkX2RhdGEucm93SWQ7XG5cblx0XHRpZiAoIHRoaXMucGFyc2VfaGludF9zb3VyY2Vbcm93LmZpZWxkXSApIHtcblx0XHRcdHdpZGdldCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHR3aWRnZXQgPSB3aWRnZXQuVENvbWJvQm94KCB7IHNldF9lbXB0eTogZmFsc2UgfSApO1xuXG5cdFx0XHR3aWRnZXQuYXR0ciggJ2N1c3RvbV9jZWxsJywgJ3RydWUnICk7XG5cdFx0XHR3aWRnZXQuYXR0ciggJ3JlbmRlcl90eXBlJywgJ2NvbWJvYm94JyApO1xuXHRcdFx0d2lkZ2V0LmF0dHIoICdpZCcsIHJvd19pZCArICdfJyArIGNvbF9tb2RlbC5uYW1lICk7XG5cdFx0XHR3aWRnZXQud2lkdGgoICc5NyUnICk7XG5cblx0XHRcdHZhciBzb3VyY2UgPSBHbG9iYWwuYnVpbGRSZWNvcmRBcnJheSggdGhpcy5wYXJzZV9oaW50X3NvdXJjZVtyb3cuZmllbGRdICk7XG5cdFx0XHR3aWRnZXQuc2V0U291cmNlRGF0YSggc291cmNlICk7XG5cblx0XHRcdGlmICggY2VsbF92YWx1ZSApIHtcblx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCBjZWxsX3ZhbHVlICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHNvdXJjZVswXS52YWx1ZSApO1xuXHRcdFx0XHRyb3cucGFyc2VfaGludCA9IHNvdXJjZVswXS52YWx1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR3aWRnZXQgPSAkKCAnPGlucHV0IGN1c3RvbV9jZWxsPVwidHJ1ZVwiICcgK1xuXHRcdFx0XHQncmVuZGVyX3R5cGU9XCJ0ZXh0XCIgJyArXG5cdFx0XHRcdCdpZD1cIicgKyByb3dfaWQgKyAnXycgKyBjb2xfbW9kZWwubmFtZSArICdcIiAnICtcblx0XHRcdFx0J3R5cGU9XCJ0ZXh0XCIgJyArXG5cdFx0XHRcdCdjbGFzcz1cInQtdGV4dC1pbnB1dFwiICcgK1xuXHRcdFx0XHQnc3R5bGU9XCJ3aWR0aDogOTclXCI+JyApO1xuXG5cdFx0XHR3aWRnZXQudGV4dCggY2VsbF92YWx1ZSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB3aWRnZXQuZ2V0KCAwICkub3V0ZXJIVE1MO1xuXHR9XG5cblx0b25GaWVsZFJlbmRlciggY2VsbF92YWx1ZSwgcmVsYXRlZF9kYXRhLCByb3cgKSB7XG5cdFx0aWYgKCAhY2VsbF92YWx1ZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgY29sX21vZGVsID0gcmVsYXRlZF9kYXRhLmNvbE1vZGVsO1xuXHRcdHZhciByb3dfaWQgPSByZWxhdGVkX2RhdGEucm93SWQ7XG5cblx0XHR2YXIgYWNvbWJvYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DT01CT19CT1ggKTtcblx0XHRhY29tYm9ib3ggPSBhY29tYm9ib3guVENvbWJvQm94KCB7IHNldF9lbXB0eTogdHJ1ZSB9ICk7XG5cblx0XHRhY29tYm9ib3guYXR0ciggJ2N1c3RvbV9jZWxsJywgJ3RydWUnICk7XG5cdFx0YWNvbWJvYm94LmF0dHIoICdyZW5kZXJfdHlwZScsICdjb21ib2JveCcgKTtcblx0XHRhY29tYm9ib3guYXR0ciggJ2lkJywgcm93X2lkICsgJ18nICsgY29sX21vZGVsLm5hbWUgKTtcblx0XHRhY29tYm9ib3gud2lkdGgoICc5NyUnICk7XG5cblx0XHRhY29tYm9ib3guc2V0U291cmNlRGF0YSggdGhpcy5maWVsZF9zb3VyY2UgKTtcblxuXHRcdCQoIGFjb21ib2JveFswXSApLmZpbmQoICdbdmFsdWU9JyArIGNlbGxfdmFsdWUgKyAnXScgKS5hdHRyKCAnc2VsZWN0ZWQnLCB0cnVlICk7XG5cblx0XHRyZXR1cm4gYWNvbWJvYm94LmdldCggMCApLm91dGVySFRNTDtcblx0fVxuXG5cdG9uVGV4dElucHV0UmVuZGVyKCBjZWxsX3ZhbHVlLCByZWxhdGVkX2RhdGEsIHJvdyApIHtcblxuXHRcdHZhciBjb2xfbW9kZWwgPSByZWxhdGVkX2RhdGEuY29sTW9kZWw7XG5cdFx0dmFyIHJvd19pZCA9IHJlbGF0ZWRfZGF0YS5yb3dJZDtcblxuXHRcdHJldHVybiAnPGlucHV0IGN1c3RvbV9jZWxsPVwidHJ1ZVwiIHJlbmRlcl90eXBlPVwidGV4dFwiIGlkPVwiJyArIHJvd19pZCArICdfJyArIGNvbF9tb2RlbC5uYW1lICsgJ1wiIHZhbHVlPVwiJyArIGNlbGxfdmFsdWUgKyAnXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cInQtdGV4dC1pbnB1dFwiIHN0eWxlPVwid2lkdGg6IDk3JVwiPic7XG5cdH1cblxuXHRidWlsZEN1cnJlbnRTdGVwRGF0YSgpIHtcblxuXHRcdHZhciBncmlkO1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgY3VycmVudF9zdGVwX2RhdGEgPSB0aGlzLnN0ZXBzRGF0YURpY1t0aGlzLmN1cnJlbnRfc3RlcF07XG5cdFx0dmFyIGN1cnJlbnRfc3RlcF91aSA9IHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdO1xuXG5cdFx0c3dpdGNoICggdGhpcy5jdXJyZW50X3N0ZXAgKSB7XG5cdFx0XHRjYXNlIDE6XG5cdFx0XHRcdHRoaXMuYXBpX2ltcG9ydC5nZXRJbXBvcnRPYmplY3RzKCB7XG5cdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0XHR2YXIgY29tYm9fYm94ID0gY3VycmVudF9zdGVwX3VpWydpbXBvcnRfY2xhc3MnXTtcblx0XHRcdFx0XHRcdHZhciBhcnJheSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHQuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0XHRcdGNvbWJvX2JveC5zZXRTb3VyY2VEYXRhKCBhcnJheSApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIGN1cnJlbnRfc3RlcF9kYXRhICkge1xuXHRcdFx0XHRcdFx0XHRjb21ib19ib3guc2V0VmFsdWUoIGN1cnJlbnRfc3RlcF9kYXRhLmltcG9ydF9jbGFzcyApO1xuXHRcdFx0XHRcdFx0fSBlbHNlIGlmICggJHRoaXMuZGVmYXVsdF9kYXRhICkge1xuXHRcdFx0XHRcdFx0XHRjb21ib19ib3guc2V0VmFsdWUoICR0aGlzLmRlZmF1bHRfZGF0YSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdHZhciBleGFtcGxlX2xhYmVsID0gY3VycmVudF9zdGVwX3VpLmV4YW1wbGVfbGFiZWw7XG5cdFx0XHRcdFx0XHRleGFtcGxlX2xhYmVsLnRleHQoICQuaTE4bi5fKCAnRG93bmxvYWQgZXhhbXBsZScgKSArICcgJyArIGNvbWJvX2JveC5nZXRMYWJlbCgpICsgJyAnICsgJC5pMThuLl8oICdDU1YgZmlsZScgKSApO1xuXHRcdFx0XHRcdFx0JHRoaXMuc2V0QnV0dG9uc1N0YXR1cygpOyAvLyBzZXQgYnV0dG9uIGVuYWJsZWQgb3IgZGlzYWJsZWRcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDM6XG5cblx0XHRcdFx0Z3JpZCA9IGN1cnJlbnRfc3RlcF91aS5pbXBvcnRfZGF0YTtcblx0XHRcdFx0aWYgKCBjdXJyZW50X3N0ZXBfZGF0YSAmJiBjdXJyZW50X3N0ZXBfZGF0YS5pbXBvcnRfZGF0YV9mb3JfbGF5b3V0ICkge1xuXG5cdFx0XHRcdFx0Y3VycmVudF9zdGVwX2RhdGEuaW1wb3J0X2RhdGFfZm9yX2xheW91dCA9IHRoaXMuc2V0U2FtcGxlUm93QmFzZU9uSW1wb3J0RmlsZSggY3VycmVudF9zdGVwX2RhdGEuaW1wb3J0X2RhdGFfZm9yX2xheW91dCApO1xuXG5cdFx0XHRcdFx0Z3JpZC5zZXREYXRhKCBjdXJyZW50X3N0ZXBfZGF0YS5pbXBvcnRfZGF0YV9mb3JfbGF5b3V0ICk7XG5cblx0XHRcdFx0XHQkdGhpcy5iaW5kR3JpZFJlbmRlckV2ZW50cyggZ3JpZCApO1xuXG5cdFx0XHRcdFx0JHRoaXMuc2V0U2F2ZWRNYXBwaW5nT3B0aW9ucyggJHRoaXMuc2F2ZWRfbGF5b3V0X2FycmF5LCBjdXJyZW50X3N0ZXBfZGF0YS5zYXZlZF9tYXBwaW5nICk7XG5cblx0XHRcdFx0XHQkdGhpcy5zZXRCdXR0b25zU3RhdHVzKCk7IC8vIHNldCBidXR0b24gZW5hYmxlZCBvciBkaXNhYmxlZFxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuYXBpX2ltcG9ydC5nZXRPcHRpb25zKCAncGFyc2VfaGludCcsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnBhcnNlX2hpbnRfc291cmNlID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cblx0XHRcdFx0dGhpcy5hcGlfaW1wb3J0LmdldE9wdGlvbnMoICdjb2x1bW5zJywge1xuXHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0JHRoaXMuZmllbGRfc291cmNlID0gR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoIHJlc3VsdC5nZXRSZXN1bHQoKSApO1xuXHRcdFx0XHRcdFx0JHRoaXMuYXBpX2ltcG9ydC5nZXRSYXdEYXRhKCAxLCB7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggZ2V0UmF3RGF0YVJlcyApIHtcblxuXHRcdFx0XHRcdFx0XHRcdHZhciByYXdfZGF0YSA9IGdldFJhd0RhdGFSZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0cmF3X2RhdGEgPSAkdGhpcy5idWlsZE1hcHBpbmdHcmlkRGF0YUFycmF5KCByYXdfZGF0YVswXSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuYXBpX2ltcG9ydC5nZW5lcmF0ZUNvbHVtbk1hcCgge1xuXHRcdFx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCBnZW5lcmF0ZUNvbHVtbk1hcFJlcyApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuY29sdW1uX21hcF9kYXRhID0gZ2VuZXJhdGVDb2x1bW5NYXBSZXMuZ2V0UmVzdWx0KCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGxlbiA9IHJhd19kYXRhLmxlbmd0aDtcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICggdmFyIGtleSBpbiAkdGhpcy5jb2x1bW5fbWFwX2RhdGEgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0Zm9yICggdmFyIGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHR2YXIgcmF3X2RhdGFfaXRlbSA9IHJhd19kYXRhW2ldO1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0dmFyIGNvbF9tYXBfZGF0YV9pdGVtID0gJHRoaXMuY29sdW1uX21hcF9kYXRhW2tleV07XG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHJhd19kYXRhX2l0ZW0ubWFwX2NvbHVtbl9uYW1lID09IGNvbF9tYXBfZGF0YV9pdGVtLm1hcF9jb2x1bW5fbmFtZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmF3X2RhdGFfaXRlbS5maWVsZCA9IGtleTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmF3X2RhdGFfaXRlbS5kZWZhdWx0X3ZhbHVlID0gJHRoaXMuY29sdW1uX21hcF9kYXRhW2tleV0uZGVmYXVsdF92YWx1ZSA/ICR0aGlzLmNvbHVtbl9tYXBfZGF0YVtrZXldLmRlZmF1bHRfdmFsdWUgOiAnJztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0cmF3X2RhdGFfaXRlbS5wYXJzZV9oaW50ID0gJHRoaXMuY29sdW1uX21hcF9kYXRhW2tleV0ucGFyc2VfaGludCA/ICR0aGlzLmNvbHVtbl9tYXBfZGF0YVtrZXldLnBhcnNlX2hpbnQgOiAnJztcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyYXdfZGF0YS5zb3J0KCBmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRcdHJldHVybiBHbG9iYWwuY29tcGFyZSggYSwgYiwgJ21hcF9jb2x1bW5fbmFtZScgKTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gdXNlIHRvIHNldCBTYW1wbGUgcm93IHRvIHNhbWUgbGF5b3V0XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmltcG9ydF9kYXRhID0gcmF3X2RhdGE7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Z3JpZC5zZXREYXRhKCByYXdfZGF0YSApO1xuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmJpbmRHcmlkUmVuZGVyRXZlbnRzKCBncmlkICk7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0JHRoaXMuZ2V0U2F2ZWRNYXBwaW5nKCk7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLnNldEJ1dHRvbnNTdGF0dXMoKTsgLy8gc2V0IGJ1dHRvbiBlbmFibGVkIG9yIGRpc2FibGVkXG5cblx0XHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgNDpcblx0XHRcdFx0dGhpcy5hcGlfaW1wb3J0LmdldE9wdGlvbnMoICdpbXBvcnRfb3B0aW9ucycsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0XHRcdHZhciByZXN1bHRfZGF0YSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCByZXN1bHQuZ2V0UmVzdWx0KCkgKTtcblx0XHRcdFx0XHRcdHZhciBkaXYgPSAkKCAnPGRpdiBzdHlsZT1cInRleHQtYWxpZ246IGxlZnQ7bWFyZ2luLWxlZnQ6IDE1cHg7XCI+PC9kaXY+JyApO1xuXG5cdFx0XHRcdFx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCByZXN1bHRfZGF0YS5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0XHRcdFx0dmFyIGl0ZW0gPSByZXN1bHRfZGF0YVtpXTtcblx0XHRcdFx0XHRcdFx0dmFyIGNoZWNrX2JveCA9ICR0aGlzLmdldENoZWNrQm94KCBpdGVtLnZhbHVlICk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKCBjdXJyZW50X3N0ZXBfZGF0YSAmJiBjdXJyZW50X3N0ZXBfZGF0YVtpdGVtLnZhbHVlXSApIHtcblx0XHRcdFx0XHRcdFx0XHRjaGVja19ib3guc2V0VmFsdWUoIGN1cnJlbnRfc3RlcF9kYXRhW2l0ZW0udmFsdWVdICk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR2YXIgbGFiZWwgPSAkKCAnPGxhYmVsIGNsYXNzPVwid2l6YXJkLWNoZWNrYm94LWxhYmVsXCIgc3R5bGU9XCJkaXNwbGF5OiBibG9jaztcIj4nICsgaXRlbS5sYWJlbCArICc8L2xhYmVsPicgKTtcblx0XHRcdFx0XHRcdFx0bGFiZWwucHJlcGVuZCggY2hlY2tfYm94ICk7XG5cdFx0XHRcdFx0XHRcdCR0aGlzLnN0ZXBzV2lkZ2V0RGljWyR0aGlzLmN1cnJlbnRfc3RlcF1baXRlbS52YWx1ZV0gPSBjaGVja19ib3g7XG5cblx0XHRcdFx0XHRcdFx0ZGl2LmFwcGVuZCggbGFiZWwgKTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0JHRoaXMuY29udGVudF9kaXYuYXBwZW5kKCBkaXYgKTtcblx0XHRcdFx0XHRcdCR0aGlzLnNldEJ1dHRvbnNTdGF0dXMoKTsgLy8gc2V0IGJ1dHRvbiBlbmFibGVkIG9yIGRpc2FibGVkXG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDU6XG5cdFx0XHRcdHZhciBpbXBvcnRfZGF0YSA9IHRoaXMuc3RlcHNEYXRhRGljWzNdLmltcG9ydF9kYXRhO1xuXHRcdFx0XHR2YXIgaW1wb3J0X29wdGlvbnMgPSB0aGlzLnN0ZXBzRGF0YURpY1s0XTtcblxuXHRcdFx0XHR0aGlzLmFwaV9pbXBvcnQuaW1wb3J0KCBpbXBvcnRfZGF0YSwgaW1wb3J0X29wdGlvbnMsIHRydWUsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCAkdGhpcy5jdXJyZW50X3N0ZXAgIT0gNSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgbGFiZWwgPSAkdGhpcy5nZXRMYWJlbCgpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbC50ZXh0KCAkLmkxOG4uXyggJ0RhdGEgdmVyaWZpY2F0aW9uIHN1Y2Nlc3NmdWwnICkgKTtcblxuXHRcdFx0XHRcdFx0XHQkdGhpcy5jb250ZW50X2Rpdi5hcHBlbmQoIGxhYmVsICk7XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdHZhciBkYXRhX2dyaWRfZXJyb3Jfc291cmNlID0gJHRoaXMuY3JlYXRlRXJyb3JTb3VyY2UoIHJlc3VsdC5nZXREZXRhaWxzKCkgKTtcblx0XHRcdFx0XHRcdFx0JHRoaXMuc2hvd0Vycm9yR3JpZCggJC5pMThuLl8oICdWZXJpZmljYXRpb24gZmFpbGVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIHJlYXNvbnMnICkgKyAnOiAnLFxuXHRcdFx0XHRcdFx0XHRcdGRhdGFfZ3JpZF9lcnJvcl9zb3VyY2UsXG5cdFx0XHRcdFx0XHRcdFx0JC5pMThuLl8oICdDb250aW51ZSB0byB0aGUgbmV4dCBzdGVwIHRvIHNraXAgaW1wb3J0aW5nIGludmFsaWQgcmVjb3Jkcy4nICksXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0LmdldFJlY29yZERldGFpbHMoKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCR0aGlzLnNldEJ1dHRvbnNTdGF0dXMoKTsgLy8gc2V0IGJ1dHRvbiBlbmFibGVkIG9yIGRpc2FibGVkXG5cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDY6XG5cdFx0XHRcdGltcG9ydF9kYXRhID0gdGhpcy5zdGVwc0RhdGFEaWNbM10uaW1wb3J0X2RhdGE7XG5cdFx0XHRcdGltcG9ydF9vcHRpb25zID0gdGhpcy5zdGVwc0RhdGFEaWNbNF07XG5cblx0XHRcdFx0dGhpcy5hcGlfaW1wb3J0LnNldElzSWRlbXBvdGVudCggdHJ1ZSApOyAvL0ZvcmNlIHRvIGlkZW1wb3RlbnQgQVBJIGNhbGwgdG8gYXZvaWQgZHVwbGljYXRlIG5ldHdvcmsgcmVxdWVzdHMgZnJvbSBjYXVzaW5nIGVycm9ycyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG5cdFx0XHRcdHRoaXMuYXBpX2ltcG9ydC5pbXBvcnQoIGltcG9ydF9kYXRhLCBpbXBvcnRfb3B0aW9ucywgZmFsc2UsIHtcblx0XHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCAkdGhpcy5jdXJyZW50X3N0ZXAgIT0gNiApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgbGFiZWwgPSAkdGhpcy5nZXRMYWJlbCgpO1xuXHRcdFx0XHRcdFx0XHRsYWJlbC50ZXh0KCAkLmkxOG4uXyggJ0ltcG9ydCBzdWNjZXNzZnVsJyApICk7XG5cblx0XHRcdFx0XHRcdFx0JHRoaXMuY29udGVudF9kaXYuYXBwZW5kKCBsYWJlbCApO1xuXG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHR2YXIgZGF0YV9ncmlkX2Vycm9yX3NvdXJjZSA9ICR0aGlzLmNyZWF0ZUVycm9yU291cmNlKCByZXN1bHQuZ2V0RGV0YWlscygpICk7XG5cblx0XHRcdFx0XHRcdFx0JHRoaXMuc2hvd0Vycm9yR3JpZCggJC5pMThuLl8oICdJbXBvcnQgZmFpbGVkIGR1ZSB0byB0aGUgZm9sbG93aW5nIHJlYXNvbnMnICkgKyAnOicsXG5cdFx0XHRcdFx0XHRcdFx0ZGF0YV9ncmlkX2Vycm9yX3NvdXJjZSxcblx0XHRcdFx0XHRcdFx0XHQkLmkxOG4uXyggJ0ludmFsaWQgcmVjb3JkcyBoYXZlIGJlZW4gc2tpcHBlZCwgYWxsIG90aGVyIHJlY29yZHMgaGF2ZSBiZWVuIGltcG9ydGVkIHN1Y2Nlc3NmdWxseS4nICksXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0LmdldFJlY29yZERldGFpbHMoKSApO1xuXG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdCR0aGlzLnNldEJ1dHRvbnNTdGF0dXMoKTsgLy8gc2V0IGJ1dHRvbiBlbmFibGVkIG9yIGRpc2FibGVkXG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0JHRoaXMuc2V0QnV0dG9uc1N0YXR1cygpOyAvLyBzZXQgYnV0dG9uIGVuYWJsZWQgb3IgZGlzYWJsZWRcblx0XHRcdFx0YnJlYWs7XG5cblx0XHR9XG5cdH1cblxuXHRzaG93RXJyb3JHcmlkKCB0b3BfZGVzLCBkYXRhX2dyaWRfZXJyb3Jfc291cmNlLCBib3R0b21fZGVzLCByZWNvcmRzX2RldGFpbHMgKSB7XG5cdFx0dmFyIGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ3RvcC1kZXMgY2xlYXItYm90aC1kaXZcXCc+PC9zcGFuPicgKTtcblx0XHRsYWJlbC50ZXh0KCB0b3BfZGVzICk7XG5cblx0XHR0aGlzLmNvbnRlbnRfZGl2LmFwcGVuZCggbGFiZWwgKTtcblxuXHRcdHZhciBncmlkID0gJCggJzx0YWJsZSBpZD1cImVycm9yX2dyaWRcIj48L3RhYmxlPicgKTtcblxuXHRcdHZhciBjb2x1bW5zID0gW107XG5cblx0XHR2YXIgY29sdW1uX2luZm8gPSB7XG5cdFx0XHRuYW1lOiAncm93SW5kZXgnLFxuXHRcdFx0aW5kZXg6ICdyb3dJbmRleCcsXG5cdFx0XHRsYWJlbDogJC5pMThuLl8oICdSb3cnICksXG5cdFx0XHR3aWR0aDogNjAsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHR0aXRsZTogZmFsc2UsXG5cdFx0XHRmaXhlZDogdHJ1ZVxuXHRcdH07XG5cdFx0Y29sdW1ucy5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRuYW1lOiAncm93Jyxcblx0XHRcdGluZGV4OiAncm93Jyxcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0ZpbGUgQ29sdW1uJyApLFxuXHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdHRpdGxlOiBmYWxzZVxuXHRcdH07XG5cdFx0Y29sdW1ucy5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRuYW1lOiAnY29sdW1uJyxcblx0XHRcdGluZGV4OiAnY29sdW1uJyxcblx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ0ZpZWxkJyApLFxuXHRcdFx0d2lkdGg6IDEwMCxcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdHRpdGxlOiBmYWxzZVxuXHRcdH07XG5cdFx0Y29sdW1ucy5wdXNoKCBjb2x1bW5faW5mbyApO1xuXG5cdFx0Y29sdW1uX2luZm8gPSB7XG5cdFx0XHRuYW1lOiAnbWVzc2FnZScsXG5cdFx0XHRpbmRleDogJ21lc3NhZ2UnLFxuXHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnTWVzc2FnZScgKSxcblx0XHRcdHdpZHRoOiAxMDAsXG5cdFx0XHRzb3J0YWJsZTogZmFsc2UsXG5cdFx0XHR0aXRsZTogZmFsc2Vcblx0XHR9O1xuXHRcdGNvbHVtbnMucHVzaCggY29sdW1uX2luZm8gKTtcblxuXHRcdHRoaXMuY29udGVudF9kaXYuYXBwZW5kKCBncmlkICk7XG5cblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd0b3RhbC1kZXMgY2xlYXItYm90aC1kaXZcXCc+PC9zcGFuPicgKTtcblx0XHRsYWJlbC50ZXh0KCAkLmkxOG4uXyggJ1JlY29yZHMnICkgKyAnOicgKyAkLmkxOG4uXyggJ1RvdGFsJyApICsgJzogJyArIHJlY29yZHNfZGV0YWlscy50b3RhbCArICcgJyArICQuaTE4bi5fKCAnVmFsaWQnICkgKyAnOiAnICsgcmVjb3Jkc19kZXRhaWxzLnZhbGlkICsgJyAnICsgJC5pMThuLl8oICdJbnZhbGlkJyApICsgJzogJyArIHJlY29yZHNfZGV0YWlscy5pbnZhbGlkICk7XG5cblx0XHR0aGlzLmNvbnRlbnRfZGl2LmFwcGVuZCggbGFiZWwgKTtcblxuXHRcdGxhYmVsID0gJCggJzxzcGFuIGNsYXNzPVxcJ2JvdHRvbS1kZXMgY2xlYXItYm90aC1kaXZcXCc+PC9zcGFuPicgKTtcblx0XHRsYWJlbC50ZXh0KCBib3R0b21fZGVzICk7XG5cblx0XHR0aGlzLmNvbnRlbnRfZGl2LmFwcGVuZCggbGFiZWwgKTtcblxuXHRcdGdyaWQgPSBuZXcgVFRHcmlkKCAnZXJyb3JfZ3JpZCcsIHtcblx0XHRcdHNvcnRhYmxlOiBmYWxzZSxcblx0XHRcdHdpZHRoOiAoIHRoaXMuY29udGVudF9kaXYud2lkdGgoKSAtIDIgKVxuXHRcdH0sIGNvbHVtbnMgKTtcblx0XHRncmlkLnNldERhdGEoIGRhdGFfZ3JpZF9lcnJvcl9zb3VyY2UgKTtcblx0XHRncmlkLnNldEdyaWRDb2x1bW5zV2lkdGgoIG51bGwsIHsgbWF4X2dyaWRfd2lkdGg6ICggdGhpcy5jb250ZW50X2Rpdi53aWR0aCgpIC0gMiApIH0gKTtcblx0fVxuXG5cdGNyZWF0ZUVycm9yU291cmNlKCBlcnJvcl9hcnJheSApIHtcblxuXHRcdC8vRXJyb3I6IFVuY2F1Z2h0IFR5cGVFcnJvcjogQ2Fubm90IHJlYWQgcHJvcGVydHkgJ2ltcG9ydF9kYXRhJyBvZiB1bmRlZmluZWQgaW4gL2ludGVyZmFjZS9odG1sNS8jIW09VGltZVNoZWV0JmRhdGU9MDAwNzA2MDkmdXNlcl9pZD0xNDM3MiBsaW5lIDc3M1xuXHRcdGlmICggIXRoaXMuc3RlcHNEYXRhRGljIHx8ICF0aGlzLnN0ZXBzRGF0YURpY1szXSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR2YXIgaW1wb3J0X2RhdGEgPSB0aGlzLnN0ZXBzRGF0YURpY1szXS5pbXBvcnRfZGF0YTtcblx0XHR2YXIgcmVzdWx0ID0gW107XG5cdFx0dmFyIGVycm9yX3JvdyA9IHt9O1xuXG5cdFx0Zm9yICggdmFyIGtleSBpbiBlcnJvcl9hcnJheSApIHtcblx0XHRcdHZhciBlcnJvcl9pbmZvID0gZXJyb3JfYXJyYXlba2V5XVsnZXJyb3InXTtcblx0XHRcdGZvciAoIHZhciBlcnJvcl9rZXkgaW4gZXJyb3JfaW5mbyApIHtcblx0XHRcdFx0aWYgKCAhZXJyb3JfaW5mby5oYXNPd25Qcm9wZXJ0eSggZXJyb3Jfa2V5ICkgKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRlcnJvcl9yb3cgPSB7fTtcblx0XHRcdFx0Ly8gIzIzNDUgLSB3ZSBhbHdheXMgd2FudCB0aGUgcm93IGFuZCBjb2x1bW4gbmFtZSB0byBzaG93IGluIHRoZSBlcnJvciByZXBvcnQuXG5cdFx0XHRcdGVycm9yX3Jvdy5yb3dJbmRleCA9IHBhcnNlSW50KCBrZXkgKSArIDI7XG5cdFx0XHRcdGVycm9yX3Jvdy5yb3cgPSAkLmkxOG4uXyggJ1Vua25vd24nICk7XG5cdFx0XHRcdGVycm9yX3Jvdy5jb2x1bW4gPSBlcnJvcl9rZXk7XG5cdFx0XHRcdGVycm9yX3Jvdy5tZXNzYWdlID0gZXJyb3JfaW5mb1tlcnJvcl9rZXldWzBdO1xuXG5cdFx0XHRcdC8vIFRyeSB0byBnZXQgbW9yZSBzcGVjaWZpYyBlcnJvciBpbmZvLlxuXHRcdFx0XHRmb3IgKCB2YXIgaW1wb3J0X2tleSBpbiBpbXBvcnRfZGF0YSApIHtcblx0XHRcdFx0XHRpZiAoIGltcG9ydF9rZXkgPT0gZXJyb3Jfa2V5ICkgeyAgLy8gIzIzNDUgLSBUaGlzIHdvbid0IG1hdGNoIGluIGNhc2VzIHdoZXJlIHRoZSBjc3YgY29sdW1ucyBkbyBub3QgbWF0Y2ggdGhlIG9iamVjdCBwcm9wZXJ0aWVzIGJlaW5nIHZhbGlkYXRlZC4gRm9yIGV4YW1wbGUgJ2JyYW5jaCcgIT0gJ2JyYW5jaF9pZCdcblx0XHRcdFx0XHRcdGVycm9yX3Jvdy5yb3cgPSBpbXBvcnRfZGF0YVtpbXBvcnRfa2V5XS5tYXBfY29sdW1uX25hbWU7XG5cdFx0XHRcdFx0XHRlcnJvcl9yb3cuY29sdW1uID0gaW1wb3J0X2RhdGFbaW1wb3J0X2tleV0uZmllbGRfbmFtZTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdC5wdXNoKCBlcnJvcl9yb3cgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0YmluZEdyaWRSZW5kZXJFdmVudHMoIGdyaWQgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgaW5wdXRzID0gZ3JpZC5ncmlkLmZpbmQoICdpbnB1dFtjdXN0b21fY2VsbD1cInRydWVcIl0nICk7XG5cdFx0dmFyIHNlbGVjdCA9IGdyaWQuZ3JpZC5maW5kKCAnc2VsZWN0W2N1c3RvbV9jZWxsPVwidHJ1ZVwiXScgKTtcblxuXHRcdGlucHV0cy51bmJpbmQoICdjaGFuZ2UnICkuYmluZCggJ2NoYW5nZScsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0JHRoaXMub25DZWxsSW5wdXRDaGFuZ2UoIGUgKTtcblx0XHR9ICk7XG5cblx0XHRzZWxlY3QudW5iaW5kKCAnY2hhbmdlJyApLmJpbmQoICdjaGFuZ2UnLCBmdW5jdGlvbiggZSApIHtcblx0XHRcdCR0aGlzLm9uQ2VsbElucHV0Q2hhbmdlKCBlICk7XG5cdFx0fSApO1xuXG5cdFx0aW5wdXRzLnVuYmluZCggJ2ZvY3VzaW4nICkuYmluZCggJ2ZvY3VzaW4nLCBmdW5jdGlvbiggZSApIHtcblx0XHRcdCR0aGlzLm9uQ2VsbEZvY3VzSW4oIGUgKTtcblx0XHR9ICk7XG5cblx0XHRzZWxlY3QudW5iaW5kKCAnZm9jdXNpbicgKS5iaW5kKCAnZm9jdXNpbicsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0JHRoaXMub25DZWxsRm9jdXNJbiggZSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdG9uQ2VsbEZvY3VzSW4oIGUgKSB7XG5cdFx0dmFyIGN1cnJlbnRfc3RlcF91aSA9IHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdO1xuXHRcdHZhciBncmlkID0gY3VycmVudF9zdGVwX3VpWydpbXBvcnRfZGF0YSddO1xuXHRcdHZhciB0YXJnZXQgPSAkKCBlLnRhcmdldCApO1xuXHRcdHZhciB0YXJnZXRfaWQgPSB0YXJnZXQuYXR0ciggJ2lkJyApO1xuXHRcdHZhciByb3dfaWQgPSB0YXJnZXRfaWQuc3BsaXQoICdfJyApWzBdO1xuXG5cdFx0Z3JpZC5ncmlkLmpxR3JpZCggJ3NldFNlbGVjdGlvbicsIHJvd19pZCApO1xuXHR9XG5cblx0b25DZWxsSW5wdXRDaGFuZ2UoIGUgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR2YXIgY3VycmVudF9zdGVwX3VpID0gdGhpcy5zdGVwc1dpZGdldERpY1t0aGlzLmN1cnJlbnRfc3RlcF07XG5cdFx0dmFyIGdyaWQgPSBjdXJyZW50X3N0ZXBfdWlbJ2ltcG9ydF9kYXRhJ107XG5cdFx0dmFyIHRhcmdldCA9ICQoIGUudGFyZ2V0ICk7XG5cdFx0dmFyIHRhcmdldF9pZCA9IHRhcmdldC5hdHRyKCAnaWQnICk7XG5cdFx0dmFyIHJvd19pZCA9IHRhcmdldF9pZC5zcGxpdCggJ18nIClbMF07XG5cdFx0dmFyIGZpZWxkID0gdGFyZ2V0X2lkLnN1YnN0cmluZyggdGFyZ2V0X2lkLmluZGV4T2YoICdfJyApICsgMSwgdGFyZ2V0X2lkLmxlbmd0aCApO1xuXHRcdHZhciBkYXRhID0gZ3JpZC5nZXREYXRhKCk7XG5cdFx0dmFyIHRhcmdldF92YWwgPSB0YXJnZXQudmFsKCk7XG5cblx0XHR2YXIgbGVuID0gZGF0YS5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciByb3dfZGF0YSA9IGRhdGFbaV07XG5cdFx0XHRpZiAoIHJvd19kYXRhLmlkID09PSByb3dfaWQgKSB7XG5cdFx0XHRcdHJvd19kYXRhW2ZpZWxkXSA9IHRhcmdldF92YWw7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggZmllbGQgPT09ICdmaWVsZCcgKSB7XG5cdFx0XHR1cGRhdGVQYXJzZUhpbnRXaWRnZXQoKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiB1cGRhdGVQYXJzZUhpbnRXaWRnZXQoKSB7XG5cdFx0XHR2YXIgd2lkZ2V0O1xuXHRcdFx0dmFyIHBhcnNlX2hpbnRfd2lkZ2V0ID0gdGFyZ2V0LnBhcmVudCgpLnBhcmVudCgpLmZpbmQoICcjJyArIHJvd19pZCArICdfcGFyc2VfaGludCcgKTtcblx0XHRcdHZhciByZW5kZXJfdHlwZSA9IHBhcnNlX2hpbnRfd2lkZ2V0LmF0dHIoICdyZW5kZXJfdHlwZScgKTtcblxuXHRcdFx0cm93X2RhdGFbJ3BhcnNlX2hpbnQnXSA9ICcnO1xuXG5cdFx0XHRpZiAoICR0aGlzLnBhcnNlX2hpbnRfc291cmNlW3RhcmdldF92YWxdICkge1xuXG5cdFx0XHRcdHdpZGdldCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQ09NQk9fQk9YICk7XG5cdFx0XHRcdHdpZGdldCA9IHdpZGdldC5UQ29tYm9Cb3goIHsgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cblx0XHRcdFx0d2lkZ2V0LmF0dHIoICdjdXN0b21fY2VsbCcsICd0cnVlJyApO1xuXHRcdFx0XHR3aWRnZXQuYXR0ciggJ3JlbmRlcl90eXBlJywgJ2NvbWJvYm94JyApO1xuXHRcdFx0XHR3aWRnZXQuYXR0ciggJ2lkJywgcm93X2lkICsgJ19wYXJzZV9oaW50JyApO1xuXHRcdFx0XHR3aWRnZXQud2lkdGgoICc5NyUnICk7XG5cblx0XHRcdFx0dmFyIHNvdXJjZSA9IEdsb2JhbC5idWlsZFJlY29yZEFycmF5KCAkdGhpcy5wYXJzZV9oaW50X3NvdXJjZVt0YXJnZXRfdmFsXSApO1xuXHRcdFx0XHR3aWRnZXQuc2V0U291cmNlRGF0YSggR2xvYmFsLmJ1aWxkUmVjb3JkQXJyYXkoICR0aGlzLnBhcnNlX2hpbnRfc291cmNlW3RhcmdldF92YWxdICkgKTtcblx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCBzb3VyY2VbMF0udmFsdWUgKTtcblx0XHRcdFx0cm93X2RhdGFbJ3BhcnNlX2hpbnQnXSA9IHNvdXJjZVswXS52YWx1ZTtcblxuXHRcdFx0XHRwYXJzZV9oaW50X3dpZGdldC5wYXJlbnQoKS5hcHBlbmQoIHdpZGdldCApO1xuXHRcdFx0XHRwYXJzZV9oaW50X3dpZGdldC5yZW1vdmUoKTtcblxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHR3aWRnZXQgPSAkKCAnPGlucHV0IGN1c3RvbV9jZWxsPVwidHJ1ZVwiICcgK1xuXHRcdFx0XHRcdCdyZW5kZXJfdHlwZT1cInRleHRcIiAnICtcblx0XHRcdFx0XHQnaWQ9XCInICsgcm93X2lkICsgJ19wYXJzZV9oaW50XCIgJyArXG5cdFx0XHRcdFx0J3ZhbHVlPVwiXCIgJyArXG5cdFx0XHRcdFx0J3R5cGU9XCJ0ZXh0XCIgJyArXG5cdFx0XHRcdFx0J2NsYXNzPVwidC10ZXh0LWlucHV0XCIgJyArXG5cdFx0XHRcdFx0J3N0eWxlPVwid2lkdGg6IDk3JVwiPicgKTtcblxuXHRcdFx0XHRwYXJzZV9oaW50X3dpZGdldC5wYXJlbnQoKS5hcHBlbmQoIHdpZGdldCApO1xuXHRcdFx0XHRwYXJzZV9oaW50X3dpZGdldC5yZW1vdmUoKTtcblxuXHRcdFx0fVxuXG5cdFx0XHR3aWRnZXQuYmluZCggJ2NoYW5nZScsIGZ1bmN0aW9uKCBlICkge1xuXHRcdFx0XHQkdGhpcy5vbkNlbGxJbnB1dENoYW5nZSggZSApO1xuXHRcdFx0fSApO1xuXG5cdFx0fVxuXHR9XG5cblx0c2V0SW1wb3J0R3JpZCggZ3JpZElkLCBncmlkX2RpdiwgYWxsTXVsdGlwbGVTZWxlY3Rpb24gKSB7XG5cblx0XHRpZiAoICFhbGxNdWx0aXBsZVNlbGVjdGlvbiApIHtcblx0XHRcdGFsbE11bHRpcGxlU2VsZWN0aW9uID0gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuY29udGVudF9kaXYuYXBwZW5kKCBncmlkX2RpdiApO1xuXG5cdFx0dGhpcy5nZXRHcmlkQ29sdW1ucyggZ3JpZElkLCBmdW5jdGlvbiggY29sdW1uX21vZGVsICkge1xuXG5cdFx0XHQkdGhpcy5zdGVwc1dpZGdldERpY1skdGhpcy5jdXJyZW50X3N0ZXBdW2dyaWRJZF0gPSBuZXcgVFRHcmlkKCBncmlkSWQsIHtcblx0XHRcdFx0c29ydGFibGU6IGZhbHNlLFxuXHRcdFx0XHRoZWlnaHQ6IDMwMCxcblx0XHRcdFx0bXVsdGlzZWxlY3Q6IGFsbE11bHRpcGxlU2VsZWN0aW9uLFxuXHRcdFx0XHRtdWx0aWJveG9ubHk6IGFsbE11bHRpcGxlU2VsZWN0aW9uLFxuXHRcdFx0XHRlZGl0dXJsOiAnY2xpZW50QXJyYXknXG5cdFx0XHR9LCBjb2x1bW5fbW9kZWwgKTtcblxuXHRcdFx0JHRoaXMuc2V0R3JpZFNpemUoICR0aGlzLnN0ZXBzV2lkZ2V0RGljWyR0aGlzLmN1cnJlbnRfc3RlcF1bZ3JpZElkXSApO1xuXG5cdFx0XHQkdGhpcy5zZXRHcmlkR3JvdXBDb2x1bW5zKCBncmlkSWQgKTtcblxuXHRcdH0gKTtcblx0fVxuXG5cdGJ1aWxkTWFwcGluZ0dyaWREYXRhQXJyYXkoIG1hcHBpbmdEYXRhICkge1xuXG5cdFx0dmFyIHJlc3VsdCA9IFtdO1xuXHRcdHZhciBpZCA9IDE7XG5cdFx0Zm9yICggdmFyIGtleSBpbiBtYXBwaW5nRGF0YSApIHtcblx0XHRcdGlmICggIW1hcHBpbmdEYXRhLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHZhciBpdGVtID0gbWFwcGluZ0RhdGFba2V5XTtcblx0XHRcdHZhciBkYXRhID0ge307XG5cdFx0XHRkYXRhLmlkID0gJ2NzdicgKyBpZDtcblx0XHRcdGRhdGEuZmllbGQgPSBpdGVtLmZpZWxkID8gaXRlbS5maWVsZCA6IFRUVVVJRC56ZXJvX2lkO1xuXHRcdFx0ZGF0YS5kZWZhdWx0X3ZhbHVlID0gaXRlbS5kZWZhdWx0X3ZhbHVlID8gaXRlbS5kZWZhdWx0X3ZhbHVlIDogJyc7XG5cdFx0XHRkYXRhLnBhcnNlX2hpbnQgPSBpdGVtLnBhcnNlX2hpbnQgPyBpdGVtLnBhcnNlX2hpbnQgOiAnJztcblx0XHRcdGRhdGEubWFwX2NvbHVtbl9uYW1lID0gaXRlbS5tYXBfY29sdW1uX25hbWUgPyBpdGVtLm1hcF9jb2x1bW5fbmFtZSA6IGtleTtcblx0XHRcdGRhdGEucm93XzEgPSBpdGVtLnJvd18xID8gaXRlbS5yb3dfMSA6IGl0ZW07XG5cdFx0XHRyZXN1bHQucHVzaCggZGF0YSApO1xuXG5cdFx0XHRpZCA9IGlkICsgMTtcblxuXHRcdH1cblxuXHRcdHRoaXMubGFzdF9pZCA9IGlkO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdG9uRG9uZUNsaWNrKCkge1xuXHRcdHRoaXMuY2xlYW5TdGVwc0RhdGEoKTtcblx0XHRMb2NhbENhY2hlRGF0YS5jdXJyZW50X29wZW5fd2l6YXJkX2NvbnRyb2xsZXJzID0gTG9jYWxDYWNoZURhdGEuY3VycmVudF9vcGVuX3dpemFyZF9jb250cm9sbGVycy5maWx0ZXIoIHdpemFyZCA9PiB3aXphcmQud2l6YXJkX2lkICE9PSB0aGlzLndpemFyZF9pZCApO1xuXHRcdHRoaXMuc2F2ZUFsbFN0ZXBzVG9Vc2VyR2VuZXJpY0RhdGEoIGZ1bmN0aW9uKCkge1xuXG5cdFx0fSApO1xuXG5cdFx0aWYgKCB0aGlzLmNhbGxfYmFjayApIHtcblx0XHRcdHRoaXMuY2FsbF9iYWNrKCk7XG5cdFx0fVxuXG5cdFx0JCggdGhpcy5lbCApLnJlbW92ZSgpO1xuXHR9XG5cblx0aW5pdEN1cnJlbnRTdGVwKCkge1xuXG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHQkdGhpcy5wcm9ncmVzc19sYWJlbC50ZXh0KCAnU3RlcCAnICsgJHRoaXMuY3VycmVudF9zdGVwICsgJyBvZiAnICsgJHRoaXMuc3RlcHMgKTtcblx0XHQkdGhpcy5wcm9ncmVzcy5hdHRyKCAnbWF4JywgJHRoaXMuc3RlcHMgKTtcblx0XHQkdGhpcy5wcm9ncmVzcy52YWwoICR0aGlzLmN1cnJlbnRfc3RlcCApO1xuXG5cdFx0JHRoaXMuYnVpbGRDdXJyZW50U3RlcFVJKCk7XG5cdFx0JHRoaXMuYnVpbGRDdXJyZW50U3RlcERhdGEoKTtcblx0XHQkdGhpcy5zZXRDdXJyZW50U3RlcFZhbHVlcygpO1xuXHR9XG5cblx0b25OZXh0Q2xpY2soKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLnNhdmVDdXJyZW50U3RlcCgpO1xuXHRcdHZhciBjdXJyZW50X3N0ZXBfZGF0YSA9IHRoaXMuc3RlcHNEYXRhRGljW3RoaXMuY3VycmVudF9zdGVwXTtcblx0XHRHbG9iYWwuc2V0V2lkZ2V0RW5hYmxlZCggdGhpcy5iYWNrX2J0biwgZmFsc2UgKTtcblx0XHRHbG9iYWwuc2V0V2lkZ2V0RW5hYmxlZCggdGhpcy5uZXh0X2J0biwgZmFsc2UgKTtcblx0XHRpZiAoIHRoaXMuY3VycmVudF9zdGVwID09PSAyICkge1xuXG5cdFx0XHRpZiAoICFjdXJyZW50X3N0ZXBfZGF0YS5maWxlX3VwbG9hZGVyICkge1xuXHRcdFx0XHRUQWxlcnRNYW5hZ2VyLnNob3dBbGVydCggJC5pMThuLl8oICdQbGVhc2UgY2hvb3NlIGEgQ1NWIGZpbGUgZmlyc3QnICkgKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5hcGlfaW1wb3J0LnVwbG9hZEZpbGUoIGN1cnJlbnRfc3RlcF9kYXRhLmZpbGVfdXBsb2FkZXIsICdvYmplY3RfdHlwZT1pbXBvcnQmb2JqZWN0X2lkPScgKyB0aGlzLmFwaV9pbXBvcnQuY2xhc3NOYW1lLCB7XG5cdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggdXBsb2FkX2ZpbGVfcmVzdWx0ICkge1xuXHRcdFx0XHRcdGlmICggdXBsb2FkX2ZpbGVfcmVzdWx0LnRvTG93ZXJDYXNlKCkgIT09ICd0cnVlJyApIHtcblx0XHRcdFx0XHRcdCR0aGlzLnNldEJ1dHRvbnNTdGF0dXMoKTsgLy8gc2V0IGJ1dHRvbiBlbmFibGVkIG9yIGRpc2FibGVkXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0JHRoaXMuY3VycmVudF9zdGVwID0gJHRoaXMuY3VycmVudF9zdGVwICsgMTtcblxuXHRcdFx0XHRcdCR0aGlzLnN0ZXBzRGF0YURpY1skdGhpcy5jdXJyZW50X3N0ZXBdID0gbnVsbDtcblx0XHRcdFx0XHQkdGhpcy5pbml0Q3VycmVudFN0ZXAoKTtcblxuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHR0aGlzLmN1cnJlbnRfc3RlcCA9IHRoaXMuY3VycmVudF9zdGVwICsgMTtcblx0XHRcdHRoaXMuaW5pdEN1cnJlbnRTdGVwKCk7XG5cdFx0fVxuXHR9XG5cblx0YnVpbGRJbXBvcnRNYXBwaW5nKCBhcnJheSApIHtcblxuXHRcdHZhciByZXN1bHQgPSB7fTtcblx0XHR2YXIgY29udGVudDtcblxuXHRcdHZhciBsZW4gPSBhcnJheS5sZW5ndGg7XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciBpdGVtID0gYXJyYXlbaV07XG5cdFx0XHRpZiAoIGl0ZW0uZmllbGQgKSB7XG5cdFx0XHRcdGNvbnRlbnQgPSB7fTtcblx0XHRcdFx0Y29udGVudC5maWVsZCA9IGl0ZW0uZmllbGQ7XG5cdFx0XHRcdGNvbnRlbnQubWFwX2NvbHVtbl9uYW1lID0gaXRlbS5tYXBfY29sdW1uX25hbWU7XG5cdFx0XHRcdGNvbnRlbnQuZGVmYXVsdF92YWx1ZSA9IGl0ZW0uZGVmYXVsdF92YWx1ZTtcblx0XHRcdFx0Y29udGVudC5wYXJzZV9oaW50ID0gaXRlbS5wYXJzZV9oaW50O1xuXHRcdFx0XHRyZXN1bHRbaXRlbS5maWVsZF0gPSBjb250ZW50O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOnN0YXJ0ICovXG5cdHNhdmVDdXJyZW50U3RlcCgpIHtcblx0XHR0aGlzLnN0ZXBzRGF0YURpY1t0aGlzLmN1cnJlbnRfc3RlcF0gPSB7fTtcblx0XHR2YXIgY3VycmVudF9zdGVwX2RhdGEgPSB0aGlzLnN0ZXBzRGF0YURpY1t0aGlzLmN1cnJlbnRfc3RlcF07XG5cdFx0dmFyIGN1cnJlbnRfc3RlcF91aSA9IHRoaXMuc3RlcHNXaWRnZXREaWNbdGhpcy5jdXJyZW50X3N0ZXBdO1xuXHRcdHN3aXRjaCAoIHRoaXMuY3VycmVudF9zdGVwICkge1xuXHRcdFx0Y2FzZSAxOlxuXHRcdFx0XHRjdXJyZW50X3N0ZXBfZGF0YS5pbXBvcnRfY2xhc3MgPSBjdXJyZW50X3N0ZXBfdWkuaW1wb3J0X2NsYXNzLmdldFZhbHVlKCk7XG5cblx0XHRcdFx0dmFyIGZvcm1hdHRlZF9pbXBvcnRfY2xhc3MgPSBjdXJyZW50X3N0ZXBfZGF0YS5pbXBvcnRfY2xhc3MuY2hhckF0KCAwICkudG9VcHBlckNhc2UoKSArIGN1cnJlbnRfc3RlcF9kYXRhLmltcG9ydF9jbGFzcy5zbGljZSggMSApO1xuXG5cdFx0XHRcdHRoaXMuYXBpX2ltcG9ydC5jbGFzc05hbWUgPSAnQVBJSW1wb3J0JyArIGZvcm1hdHRlZF9pbXBvcnRfY2xhc3M7XG5cdFx0XHRcdHRoaXMuYXBpX2ltcG9ydC5rZXlfbmFtZSA9ICdJbXBvcnQnICsgZm9ybWF0dGVkX2ltcG9ydF9jbGFzcztcblxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgMjpcblx0XHRcdFx0Y3VycmVudF9zdGVwX2RhdGEuZmlsZV91cGxvYWRlciA9IGN1cnJlbnRfc3RlcF91aS5maWxlX3VwbG9hZGVyLmdldFZhbHVlKCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAzOlxuXHRcdFx0XHR2YXIgZ3JpZCA9IGN1cnJlbnRfc3RlcF91aS5pbXBvcnRfZGF0YTtcblx0XHRcdFx0Y3VycmVudF9zdGVwX2RhdGEuaW1wb3J0X2RhdGEgPSB0aGlzLmJ1aWxkSW1wb3J0TWFwcGluZyggZ3JpZC5nZXREYXRhKCkgKTtcblx0XHRcdFx0Y3VycmVudF9zdGVwX2RhdGEuaW1wb3J0X2RhdGFfZm9yX2xheW91dCA9IGdyaWQuZ2V0RGF0YSgpO1xuXHRcdFx0XHRjdXJyZW50X3N0ZXBfZGF0YS5zYXZlZF9tYXBwaW5nID0gY3VycmVudF9zdGVwX3VpLnNhdmVkX21hcHBpbmcuZ2V0VmFsdWUoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIDQ6XG5cdFx0XHRcdGZvciAoIHZhciBrZXkgaW4gY3VycmVudF9zdGVwX3VpICkge1xuXG5cdFx0XHRcdFx0aWYgKCAhY3VycmVudF9zdGVwX3VpLmhhc093blByb3BlcnR5KCBrZXkgKSApIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRjdXJyZW50X3N0ZXBfZGF0YVtrZXldID0gY3VycmVudF9zdGVwX3VpW2tleV0uZ2V0VmFsdWUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvKiBqc2hpbnQgaWdub3JlOmVuZCAqL1xuXHRzZXREZWZhdWx0RGF0YVRvU3RlcHMoKSB7XG5cblx0XHRpZiAoICF0aGlzLmRlZmF1bHRfZGF0YSApIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblx0fVxuXG59XG4iXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///8884\n")}}]);