1 line
107 KiB
JavaScript
1 line
107 KiB
JavaScript
(self.webpackChunktimetrex=self.webpackChunktimetrex||[]).push([["payroll-user_expense-UserExpenseViewController","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<div class=\"file-browser\">\n\t\t<img class=\"image\">\n\t\t<form enctype=\"multipart/form-data\" class=\"browser-form\">\n\t\t\t<input name=\"filedata\" class=\"browser\" type=\"file\"/>\n\t\t</form>\n\t</div>\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")},3434:(__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 */ \"UserExpenseViewController\": () => (/* binding */ UserExpenseViewController)\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 UserExpenseViewController extends BaseViewController {\n\tconstructor( options = {} ) {\n\t\t_.defaults( options, {\n\t\t\tel: '#user_expense_view_container',\n\n\t\t\t// _required_files: ['TImageBrowser'],\n\n\t\t\tstatus_array: null,\n\n\t\t\thierarchy_level_array: null,\n\n\t\t\tsub_document_view_controller: null,\n\n\t\t\tdocument_object_type_id: null,\n\n\t\t\trelatedExpenseArray: null,\n\n\t\t\tdocument_api: null,\n\t\t\tpayment_method_array: null\n\t\t} );\n\n\t\tsuper( options );\n\t}\n\n\tinit( options ) {\n\t\t//this._super('initialize', options );\n\t\tthis.edit_view_tpl = 'UserExpenseEditView.html';\n\t\tthis.permission_id = 'user_expense';\n\t\tthis.viewId = 'UserExpense';\n\t\tthis.script_name = 'UserExpenseView';\n\t\tthis.table_name_key = 'user_expense';\n\t\tthis.context_menu_name = $.i18n._( 'Expenses' );\n\t\tthis.navigation_label = $.i18n._( 'Expense' );\n\t\tthis.document_object_type_id = 400;\n\t\tthis.hierarchy_type_id = 200;\n\n\t\tthis.api = TTAPI.APIUserExpense;\n\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\tthis.job_api = TTAPI.APIJob;\n\t\t\tthis.job_item_api = TTAPI.APIJobItem;\n\t\t}\n\n\t\tthis.render();\n\t\tthis.buildContextMenu();\n\n\t\tthis.initData();\n\t}\n\n\tgetCustomContextMenuModel() {\n\t\tvar context_menu_model = {\n\t\t\texclude: ['copy', 'mass_edit'],\n\t\t\tinclude: []\n\t\t};\n\n\t\treturn context_menu_model;\n\t}\n\n\tinitOptions() {\n\t\tvar $this = this;\n\t\tthis.initDropDownOption( 'status' );\n\t\tthis.initDropDownOption( 'payment_method' );\n\n\t\tvar filter = {};\n\t\tfilter.filter_data = {};\n\t\tfilter.filter_data.type_id = [10, 20, 30];\n\t\tfilter.filter_data.user_id = [LocalCacheData.loginUser.id];\n\n\t\t$this.basic_search_field_ui_dic['expense_policy_id'].setDefaultArgs( filter );\n\t}\n\n\tgetFilterColumnsFromDisplayColumns() {\n\t\tvar column_filter = {};\n\t\tcolumn_filter.user = true;\n\t\tthis._getFilterColumnsFromDisplayColumns( column_filter, true );\n\t}\n\n\tgetSubViewFilter( filter ) {\n\n\t\tif ( filter.length === 0 ) {\n\t\t\tfilter = {};\n\t\t}\n\n\t\tfilter['parent_id'] = 0;\n\n\t\treturn filter;\n\t}\n\n\t/* jshint ignore:start */\n\tsetCurrentEditRecordData() {\n\t\tvar $this = this;\n\t\t//Set current edit record data to all widgets\n\n\t\tif ( Global.isFalseOrNull( this.current_edit_record['user_id'] ) ) {\n\t\t\tthis.current_edit_record['user_id'] = LocalCacheData.getLoginUser().id;\n\t\t}\n\n\t\tfor ( var key in this.current_edit_record ) {\n\t\t\tvar widget = this.edit_view_ui_dic[key];\n\t\t\tif ( Global.isSet( widget ) ) {\n\t\t\t\tswitch ( key ) {\n\t\t\t\t\tcase 'user_id':\n\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\tvar filter_data = {};\n\t\t\t\t\t\tfilter_data.type_id = [10, 20, 30];\n\t\t\t\t\t\tfilter_data.user_id = this.current_edit_record[key];\n\t\t\t\t\t\targs.filter_data = filter_data;\n\t\t\t\t\t\tthis.edit_view_ui_dic['expense_policy_id'].setDefaultArgs( args );\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'expense_policy_id':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'gross_amount1':\n\t\t\t\t\t\twidget.setValue( this.current_edit_record['gross_amount'] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'gross_amount':\n\t\t\t\t\tcase 'reimburse_amount':\n\t\t\t\t\tcase 'net_amount':\n\t\t\t\t\t\t// Don't do anything.\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_id':\n\t\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_item_id':\n\t\t\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\t\t\tvar args = {};\n\t\t\t\t\t\t\targs.filter_data = { job_id: this.current_edit_record.job_id };\n\t\t\t\t\t\t\twidget.setDefaultArgs( args );\n\t\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_quick_search':\n//\t\t\t\t\t\twidget.setValue( this.current_edit_record['job_id'] ? this.current_edit_record['job_id'] : 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'job_item_quick_search':\n//\t\t\t\t\t\twidget.setValue( this.current_edit_record['job_item_id'] ? this.current_edit_record['job_item_id'] : 0 );\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\twidget.setValue( this.current_edit_record[key] );\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\n\t\tthis.collectUIDataToCurrentEditRecord();\n\t\tthis.setEditViewDataDone();\n\t}\n\n\t/* jshint ignore:end */\n\n\tsetEditViewDataDone() {\n\t\tsuper.setEditViewDataDone();\n\n\t\tif ( Global.isSet( this.current_edit_record['related_expenses'] ) ) {\n\t\t\tthis.relatedExpenseArray = this.current_edit_record['related_expenses'];\n\t\t} else {\n\t\t\tthis.relatedExpenseArray = {};\n\t\t}\n\n\t\tthis.setRelatedExpense( this.relatedExpenseArray );\n\n\t\tthis.initInsideEditorData();\n\t\tAuthorizationHistory.init( this );\n\n\t\tthis.onExpensePolicyChange();\n\t}\n\n\tinitInsideEditorData() {\n\t\tvar $this = this;\n\t\tvar args = {};\n\t\targs.filter_data = {};\n\n\t\tif ( !this.current_edit_record || !this.current_edit_record.id ) {\n\t\t\t$this.editor.removeAllRows();\n\t\t\t$this.editor.getDefaultData();\n\n\t\t} else {\n\n\t\t\targs.filter_data.object_type_id = this.document_object_type_id;\n\t\t\targs.filter_data.object_id = this.current_edit_record['id'];\n\n\t\t\t$this.api['getAttachment']( args, {\n\t\t\t\tonResult: function( res ) {\n\n\t\t\t\t\tif ( !$this.edit_view ) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tvar data = res.getResult();\n\t\t\t\t\t$this.editor.setValue( data );\n\n\t\t\t\t}\n\t\t\t} );\n\n\t\t}\n\t}\n\n\tinsideEditorSetValue( val ) {\n\t\tvar len = val.length;\n\t\tthis.removeAllRows();\n\n\t\tif ( len > 0 ) {\n\t\t\tfor ( var i = 0; i < val.length; i++ ) {\n\t\t\t\tif ( Global.isSet( val[i] ) ) {\n\t\t\t\t\tvar row = val[i];\n\t\t\t\t\tthis.addRow( row );\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthis.getDefaultData();\n\t\t}\n\t}\n\n\tinsideEditorGetValue() {\n\n\t\tvar len = this.rows_widgets_array.length;\n\n\t\tvar result = [];\n\n\t\tfor ( var i = 0; i < len; i++ ) {\n\t\t\tvar row = this.rows_widgets_array[i];\n\t\t\tif ( Global.isSet( row.file ) ) {\n\t\t\t\tvar data = {\n\t\t\t\t\tname: row.name.getValue(),\n\t\t\t\t\tfile: row.file.getValue()\n\t\t\t\t};\n\n\t\t\t\tif ( data.name === 'No File Selected' ) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tresult.push( data );\n\t\t\t}\n\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tinsideEditorAddRow( data, index ) {\n\n\t\tif ( !data ) {\n\t\t\tthis.getDefaultData( index );\n\t\t} else {\n\t\t\tvar row = this.getRowRender(); //Get Row render\n\t\t\tvar render = this.getRender(); //get render, should be a table\n\t\t\tvar widgets = {}; //Save each row's widgets\n\n\t\t\t//Build row widgets\n\n\t\t\t// Attachment Name\n\t\t\tvar form_item_file_name = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_file_name.TText( { field: 'name', width: 400 } );\n\t\t\tform_item_file_name.setValue( data.name ? data.name : $.i18n._( 'No File Selected' ) );\n\t\t\tform_item_file_name.setClassStyle( data.name ? {\n\t\t\t\t'font-weight': 'bold',\n\t\t\t\t'line-height': 0\n\t\t\t} : { 'line-height': 0 } );\n\t\t\twidgets[form_item_file_name.getField()] = form_item_file_name;\n\t\t\trow.children().eq( 0 ).append( form_item_file_name );\n\t\t\tform_item_file_name.attr( 'document_id', ( data.id && this.parent_controller.current_edit_record.id ) ? data.id : '' );\n\t\t\tform_item_file_name.attr( 'document_revision_id', ( data.document_revision_id && this.parent_controller.current_edit_record.id ) ? data.document_revision_id : '' );\n\n\t\t\t// Action\n\t\t\tif ( data.name ) {\n\n\t\t\t\tvar widgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\t\t\t\tvar download = $( '<button type=\\'button\\' class=\\' download-button t-button widget-right-label\\'>' + $.i18n._( 'Download' ) + '</button>' );\n\t\t\t\tvar view = $( '<button type=\\'button\\' class=\\' view-button t-button widget-right-label\\'>' + $.i18n._( 'View' ) + '</button>' );\n\n\t\t\t\tdownload.attr( {\n\t\t\t\t\tdocument_id: data.id,\n\t\t\t\t\tdocument_revision_id: data.document_revision_id,\n\t\t\t\t\tobject_type_id: this.parent_controller.document_object_type_id\n\t\t\t\t} );\n\t\t\t\tview.attr( {\n\t\t\t\t\tdocument_id: data.id,\n\t\t\t\t\tdocument_revision_id: data.document_revision_id,\n\t\t\t\t\tobject_type_id: this.parent_controller.document_object_type_id\n\t\t\t\t} );\n\n\t\t\t\tdownload.bind( 'click', this.parent_controller.downloadFile );\n\t\t\t\tview.bind( 'click', this.parent_controller.downloadFile );\n\n\t\t\t\twidgetContainer.append( download );\n\t\t\t\twidgetContainer.append( view );\n\n\t\t\t\trow.children().eq( 1 ).append( widgetContainer );\n\t\t\t} else {\n\t\t\t\tvar form_item_file = Global.loadWidgetByName( FormItemType.IMAGE_BROWSER );\n\n\t\t\t\tvar $this = this.file_browser = form_item_file.TImageBrowser( {\n\t\t\t\t\t\tfield: 'file',\n\t\t\t\t\t\tname: 'filedata',\n\t\t\t\t\t\taccept_filter: '*',\n\t\t\t\t\t\tchangeHandler: function( a ) {\n\t\t\t\t\t\t\tvar file_name = $( this ).find( '.browser' )[0].files[0].name;\n\t\t\t\t\t\t\tform_item_file_name.setValue( file_name );\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t);\n\n\t\t\t\twidgets[form_item_file.getField()] = form_item_file;\n\t\t\t\trow.children().eq( 1 ).append( form_item_file );\n\n\t\t\t}\n\n\t\t\t// end\n\n\t\t\tif ( typeof index != 'undefined' ) {\n\n\t\t\t\trow.insertAfter( $( render ).find( 'tr' ).eq( index ) );\n\t\t\t\tthis.rows_widgets_array.splice( ( index ), 0, widgets );\n\n\t\t\t} else {\n\t\t\t\t$( render ).append( row );\n\t\t\t\tthis.rows_widgets_array.push( widgets );\n\t\t\t}\n\n\t\t\tif ( this.parent_controller.is_viewing ) {\n\t\t\t\trow.find( '.control-icon' ).hide();\n\t\t\t}\n\n\t\t\tthis.addIconsEvent( row ); //Bind event to add and minus icon\n\t\t\tthis.removeLastRowLine();\n\t\t}\n\t}\n\n\tdownloadFile() {\n\n\t\tvar $this = $( this );\n\t\tvar document_attachment_id = $this.attr( 'document_id' );\n\t\tvar document_revision_id = $this.attr( 'document_revision_id' );\n\t\tvar object_type_id = $this.attr( 'object_type_id' );\n\n\t\tvar url = ServiceCaller.getURLByObjectType( 'file_download' ) + '&object_type=document&parent_id=' + document_attachment_id + '&parent_object_type_id=' + object_type_id + '&object_id=' + document_revision_id;\n\n\t\tGlobal.APIFileDownload( null, null, null, url );\n\t}\n\n\tinsideEditorRemoveRow( row ) {\n\n\t\tvar $this = this;\n\t\tvar index = row[0].rowIndex - 1;\n\t\tvar remove_id = this.rows_widgets_array[index].name.attr( 'document_id' );\n\t\tif ( TTUUID.isUUID( remove_id ) && remove_id != TTUUID.zero_id && remove_id != TTUUID.not_exist_id ) {\n\t\t\tTAlertManager.showConfirmAlert( Global.delete_confirm_message, null, function( result ) {\n\t\t\t\tif ( result ) {\n\t\t\t\t\tProgressBar.showOverlay();\n\t\t\t\t\t$this.api['delete' + $this.api.key_name]( remove_id, {\n\t\t\t\t\t\tonResult: function( result ) {\n\t\t\t\t\t\t\tProgressBar.closeOverlay();\n\t\t\t\t\t\t\tif ( result.isValid() ) {\n\t\t\t\t\t\t\t\trow.remove();\n\t\t\t\t\t\t\t\t$this.rows_widgets_array.splice( index, 1 );\n\t\t\t\t\t\t\t\tif ( $this.rows_widgets_array.length === 0 ) {\n\t\t\t\t\t\t\t\t\t$this.getDefaultData();\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\t\t\t} );\n\t\t} else {\n\t\t\trow.remove();\n\t\t\t$this.rows_widgets_array.splice( index, 1 );\n\t\t}\n\n\t\tthis.removeLastRowLine();\n\t}\n\n\t/* jshint ignore:start */\n\tonFormItemChange( target, doNotValidate ) {\n\t\tvar $this = this;\n\n\t\tthis.setIsChanged( target );\n\t\tthis.setMassEditingFieldsWhenFormChange( target );\n\n\t\tvar key = target.getField();\n\t\tvar c_value = target.getValue();\n\n\t\tthis.current_edit_record[key] = c_value;\n\n\t\tvar amount_arr = false;\n\t\tswitch ( key ) {\n\t\t\tcase 'user_id':\n\t\t\t\tvar args = {};\n\t\t\t\tvar filter_data = {};\n\t\t\t\tfilter_data.type_id = [10, 20, 30];\n\t\t\t\tfilter_data.user_id = this.current_edit_record[key];\n\t\t\t\targs.filter_data = filter_data;\n\t\t\t\tthis.edit_view_ui_dic['expense_policy_id'].setSourceData( null );\n\t\t\t\tthis.edit_view_ui_dic['expense_policy_id'].setDefaultArgs( args );\n\t\t\t\tbreak;\n\t\t\tcase 'expense_policy_id':\n\t\t\t\tthis.onExpensePolicyChange();\n\t\t\t\tbreak;\n\t\t\tcase 'gross_amount1':\n\t\t\t\tthis.current_edit_record['gross_amount1'] = this.current_edit_record['gross_amount1'] ? this.current_edit_record['gross_amount1'] : this.current_edit_record['gross_amount'];\n\t\t\t\tif ( this.current_edit_record['expense_policy_id'] && this.current_edit_record['gross_amount1'] ) {\n\t\t\t\t\tthis.api['calcRelatedExpenses'](\n\t\t\t\t\t\tthis.current_edit_record['expense_policy_id'], this.current_edit_record['gross_amount1'], amount_arr, this.current_edit_record['is_reimbursable'],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t\t$this.relatedExpenseArray = res.getResult();\n\t\t\t\t\t\t\t\t$this.setRelatedExpense( $this.relatedExpenseArray );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'is_reimbursable':\n\t\t\t\tthis.current_edit_record['gross_amount1'] = this.current_edit_record['gross_amount1'] ? this.current_edit_record['gross_amount1'] : this.current_edit_record['gross_amount'];\n\t\t\t\tamount_arr = this.relatedExpenseArray ? this.relatedExpenseArray : false;\n\t\t\t\tif ( this.current_edit_record['expense_policy_id'] && this.current_edit_record['gross_amount1'] ) {\n\t\t\t\t\tthis.api['calcRelatedExpenses'](\n\t\t\t\t\t\tthis.current_edit_record['expense_policy_id'], this.current_edit_record['gross_amount1'], amount_arr, this.current_edit_record['is_reimbursable'],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t\t$this.relatedExpenseArray = res.getResult();\n\t\t\t\t\t\t\t\t$this.setRelatedExpense( $this.relatedExpenseArray );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'amount':\n\t\t\t\tvar related_expense_policy_id = target.attr( 'id' );\n\t\t\t\tthis.current_edit_record['gross_amount1'] = this.current_edit_record['gross_amount1'] ? this.current_edit_record['gross_amount1'] : this.current_edit_record['gross_amount'];\n\t\t\t\tthis.relatedExpenseArray['taxes'][related_expense_policy_id]['amount'] = c_value;\n\t\t\t\tamount_arr = this.relatedExpenseArray;\n\t\t\t\tif ( this.current_edit_record['expense_policy_id'] && this.current_edit_record['gross_amount1'] ) {\n\t\t\t\t\tthis.api['calcRelatedExpenses'](\n\t\t\t\t\t\tthis.current_edit_record['expense_policy_id'], this.current_edit_record['gross_amount1'], amount_arr, this.current_edit_record['is_reimbursable'],\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tonResult: function( res ) {\n\t\t\t\t\t\t\t\t$this.relatedExpenseArray = res.getResult();\n\t\t\t\t\t\t\t\t$this.setRelatedExpense( $this.relatedExpenseArray );\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.setJobItemValueWhenJobChanged( target.getValue( true ) );\n\t\t\t\t\tthis.edit_view_ui_dic['job_quick_search'].setCheckBox( true );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_item_id':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setValue( target.getValue( true ) ? ( target.getValue( true ).manual_id ? target.getValue( true ).manual_id : '' ) : '' );\n\t\t\t\t\tthis.edit_view_ui_dic['job_item_quick_search'].setCheckBox( true );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'job_quick_search':\n\t\t\tcase 'job_item_quick_search':\n\t\t\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t\t\tthis.onJobQuickSearch( key, c_value );\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t}\n\n\t\tif ( !doNotValidate ) {\n\t\t\tthis.validate();\n\t\t}\n\t}\n\n\tonExpensePolicyChange() {\n\t\tvar expense_policies = this.edit_view_ui_dic['expense_policy_id'].getSourceData();\n\t\tif ( expense_policies && Global.isArray( expense_policies ) && expense_policies.length > 0 ) {\n\t\t\tvar unit_name = $.i18n._( 'Amount' );\n\n\t\t\tfor ( var n in expense_policies ) {\n\t\t\t\tif ( expense_policies[n].id == this.edit_view_ui_dic['expense_policy_id'].getValue() && expense_policies[n].unit_name && expense_policies[n].unit_name.length > 0 && expense_policies[n].type_id == 30 ) {\n\t\t\t\t\tunit_name = expense_policies[n].unit_name;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tthis.edit_view_ui_dic['gross_amount1'].parents( '.edit-view-form-item-div' ).find( '.edit-view-form-item-label' ).html( unit_name );\n\t\t}\n\t}\n\n\t/* jshint ignore:end */\n\tsetRelatedExpense( expenses ) {\n\t\t// Third column start\n\t\tvar tab_expense = this.edit_view_tab.find( '#tab_expense' );\n\t\tvar tab_expense_column3 = tab_expense.find( '.third-column' ).empty();\n\n\t\tif ( this.edit_view_tabs[0].length < 3 ) {\n\t\t\tthis.edit_view_tabs[0].push( tab_expense_column3 );\n\t\t}\n\n\t\tif ( expenses && expenses['taxes'] && Object.keys( expenses['taxes'] ).length > 0 ) {\n\t\t\t// Net Amount\n\t\t\tvar form_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tform_item_input.TTextInput( { field: 'net_amount' } );\n\t\t\tform_item_input.setValue( expenses['net_amount'] );\n\t\t\tform_item_input.setEnabled( ( this.is_viewing == false ) );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Net Amount' ), form_item_input, tab_expense_column3, '', null, true );\n\t\t\tthis.edit_view_ui_dic['net_amount'].css( 'opacity', 1 );\n\n\t\t\tfor ( var key in expenses['taxes'] ) {\n\t\t\t\t// taxes\n\t\t\t\tvar item = expenses['taxes'][key];\n\t\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\t\tform_item_input.TTextInput( { field: 'amount' } );\n\t\t\t\tform_item_input.setValue( item['amount'] );\n\t\t\t\tform_item_input.attr( 'id', item['expense_policy_id'] );\n\t\t\t\tform_item_input.setEnabled( ( this.is_viewing == false ) );\n\t\t\t\tthis.addEditFieldToColumn( $.i18n._( item['expense_policy_name'] ), form_item_input, tab_expense_column3, '', null, true );\n\t\t\t\tthis.edit_view_ui_dic['amount'].css( 'opacity', 1 );\n\t\t\t}\n\n\t\t\t// Amount\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\t\tform_item_input.TText( { field: 'gross_amount' } );\n\t\t\tform_item_input.setValue( expenses['gross_amount'] );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Amount' ), form_item_input, tab_expense_column3, '', null, true );\n\t\t\tthis.edit_view_ui_dic['gross_amount'].css( 'opacity', 1 );\n\t\t}\n\n\t\t// Reimburse Amount\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT );\n\t\tform_item_input.TText( { field: 'reimburse_amount' } );\n\t\tif ( expenses ) {\n\t\t\tif ( expenses['reimburse_amount'] && expenses['unit_amount'] && expenses['unit_name'] ) {\n\t\t\t\tform_item_input.setValue( expenses['reimburse_amount'] + ' (' + expenses['unit_amount'] + '/' + expenses['unit_name'] + ')' );\n\t\t\t} else {\n\t\t\t\tform_item_input.setValue( expenses['reimburse_amount'] );\n\t\t\t}\n\t\t} else {\n\t\t\tform_item_input.setValue( this.current_edit_record.reimburse_amount );\n\t\t}\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Reimburse Amount' ), form_item_input, tab_expense_column3, '', null, true );\n\n\t\tthis.edit_view_ui_dic['reimburse_amount'].css( 'opacity', 1 );\n\n\t\tthis.editFieldResize( 0 );\n\t}\n\n\tuniformVariable( records ) {\n\n\t\trecords.related_expenses = this.relatedExpenseArray;\n\t\trecords.gross_amount = this.relatedExpenseArray.gross_amount;\n\t\trecords.net_amount = this.relatedExpenseArray.net_amount;\n\t\trecords.reimburse_amount = this.relatedExpenseArray.reimburse_amount;\n\n\t\tif ( !Global.isSet( records.parent_id ) ) {\n\t\t\trecords.parent_id = false;\n\t\t}\n\n\t\treturn records;\n\t}\n\n\tonSaveResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search();\n\t\t\t\t$this.onSaveDone( result );\n\n\t\t\t\t$this.removeEditView();\n\n\t\t\t\t$().TFeedback( {\n\t\t\t\t\tsource: 'Save'\n\t\t\t\t} );\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorMenu();\n\t\t\t$this.setErrorTips( result );\n\n\t\t}\n\t}\n\n\t// onSaveAndContinueResult( result ) {\n\t//\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { // as new\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onEditClick( $this.refresh_id, true );\n\t//\n\t// \t\t\t$this.onSaveAndContinueDone( result );\n\t//\n\t// \t\t} );\n\t//\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\t// onSaveAndNewResult: function( result ) {\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) { // as new\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onAddClick( true );\n\t//\n\t// \t\t} );\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\t_continueDoCopyAsNew() {\n\t\tthis.setCurrentEditViewState( 'new' );\n\t\tLocalCacheData.current_doing_context_action = 'copy_as_new';\n\n\t\tif ( Global.isSet( this.edit_view ) ) {\n\t\t\tthis.editor.removeAllRows();\n\t\t\tthis.editor.getDefaultData();\n\t\t}\n\t\tsuper._continueDoCopyAsNew();\n\t}\n\n\tonSaveAndCopyResult( result ) {\n\t\tvar $this = this;\n\t\tif ( result.isValid() ) {\n\t\t\tvar result_data = result.getResult();\n\t\t\tif ( result_data === true ) {\n\t\t\t\t$this.refresh_id = $this.current_edit_record.id;\n\n\t\t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t\t\t\t$this.refresh_id = result_data;\n\t\t\t}\n\n\t\t\t$this.saveInsideEditorData( function() {\n\t\t\t\t$this.search( false );\n\n\t\t\t\t$this.onCopyAsNewClick();\n\n\t\t\t} );\n\n\t\t} else {\n\t\t\t$this.setErrorTips( result );\n\t\t\t$this.setErrorMenu();\n\t\t}\n\t}\n\n\t// onSaveAndNextResult( result ) {\n\t// \tvar $this = this;\n\t// \tif ( result.isValid() ) {\n\t// \t\tvar result_data = result.getResult();\n\t// \t\tif ( result_data === true ) {\n\t// \t\t\t$this.refresh_id = $this.current_edit_record.id;\n\t//\n\t// \t\t} else if ( TTUUID.isUUID( result_data ) && result_data != TTUUID.zero_id && result_data != TTUUID.not_exist_id ) {\n\t// \t\t\t$this.refresh_id = result_data;\n\t// \t\t}\n\t//\n\t// \t\t$this.saveInsideEditorData( function() {\n\t// \t\t\t$this.onRightArrowClick();\n\t// \t\t\t$this.search( false );\n\t// \t\t\t$this.onSaveAndNextDone( result );\n\t//\n\t// \t\t} );\n\t//\n\t// \t} else {\n\t// \t\t$this.setErrorTips( result );\n\t// \t\t$this.setErrorMenu();\n\t// \t}\n\t// },\n\n\tsaveInsideEditorData( callBack ) {\n\t\tvar $this = this;\n\t\tvar data = this.editor.getValue();\n\t\tvar files = data.length;\n\t\tif ( files > 0 ) {\n\t\t\tvar success = 0;\n\t\t\tfor ( var key in data ) {\n\t\t\t\tvar fileItem = data[key];\n\t\t\t\tif ( Global.isSet( fileItem.file ) ) {\n\n\t\t\t\t\tvar document_revision_id = this.api.addAttachment( fileItem.name, this.document_object_type_id, this.refresh_id, { async: false } ).getResult();\n\t\t\t\t\t$this.api.uploadFile( fileItem.file, 'object_type=document_revision&object_id=' + document_revision_id + '&parent_object_type_id=' + $this.document_object_type_id, {} );\n\n\t\t\t\t\tsuccess++;\n\n\t\t\t\t} else {\n\t\t\t\t\tcallBack();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ( success === files ) {\n\t\t\t\tcallBack();\n\t\t\t}\n\n\t\t} else {\n\t\t\tcallBack();\n\t\t}\n\t}\n\n\tuploadFile( document_result, file_data ) {\n\t\tvar document_revision_id = document_result.getResult();\n\t\tvar $this = this;\n\n\t\t$this.api.uploadFile( file_data, 'object_type=document_revision&object_id=' + document_revision_id, {\n\t\t\tonResult: function( upload_file_result ) {\n\t\t\t}\n\t\t} );\n\t}\n\n\tbuildEditViewUI() {\n\n\t\tsuper.buildEditViewUI();\n\n\t\tvar $this = this;\n\n\t\tvar tab_model = {\n\t\t\t'tab_expense': {\n\t\t\t\t'label': $.i18n._( 'Expense' ),\n\t\t\t\t'html_template': this.getUserExpenseTabHtml(),\n\t\t\t\t'is_multi_column': true\n\t\t\t},\n\t\t\t'tab_attachment': true,\n\t\t\t'tab_audit': true,\n\t\t};\n\t\tthis.setTabModel( tab_model );\n\n\t\tthis.navigation.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUserExpense,\n\t\t\tid: this.script_name + '_navigation',\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_expense',\n\t\t\tnavigation_mode: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tthis.setNavigation();\n\n\t\t//Tab 0 start\n\n\t\tvar tab_expense = this.edit_view_tab.find( '#tab_expense' );\n\n\t\tvar tab_expense_column1 = tab_expense.find( '.first-column' );\n\t\tvar tab_expense_column2 = tab_expense.find( '.second-column' );\n\n\t\tthis.edit_view_tabs[0] = [];\n\n\t\tthis.edit_view_tabs[0].push( tab_expense_column1 );\n\t\tthis.edit_view_tabs[0].push( tab_expense_column2 );\n\n\t\tvar form_item_input;\n\t\tvar widgetContainer;\n\t\tvar label;\n\n\t\t// Employee\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIUser,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_user',\n\t\t\tfield: 'user_id',\n\t\t\tset_empty: true,\n\t\t\tshow_search_inputs: true\n\t\t} );\n\n\t\tvar default_args = {};\n\t\tdefault_args.permission_section = 'user_expense';\n\t\tform_item_input.setDefaultArgs( default_args );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Employee' ), form_item_input, tab_expense_column1, '' );\n\n\t\t// Effective Date\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'effective_date' } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Effective Date' ), form_item_input, tab_expense_column1, '', null );\n\n\t\t// Date Incurred\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.DATE_PICKER );\n\n\t\tform_item_input.TDatePicker( { field: 'incurred_date' } );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Date Incurred' ), form_item_input, tab_expense_column1, '', null );\n\n\t\t// Description\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_AREA );\n\t\tform_item_input.TTextArea( { field: 'description', width: '100%' } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Description' ), form_item_input, tab_expense_column1, '', null, null, true );\n\n\t\tform_item_input.parent().width( '45%' );\n\n\t\t// Payment Method\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.COMBO_BOX );\n\n\t\tform_item_input.TComboBox( { field: 'payment_method_id', set_empty: false } );\n\t\tform_item_input.setSourceData( $this.payment_method_array );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Payment Method' ), form_item_input, tab_expense_column1 );\n\n\t\t// Type\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIExpensePolicy,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_expense_policy',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'expense_policy_id',\n\t\t\talways_include_columns: ['type_id', 'unit_name'],\n\t\t\tinit_data_immediately: true,\n\t\t\tsetRealValueCallBack: ( function( val ) {\n\t\t\t\tif ( val ) {\n\t\t\t\t\t$this.onExpensePolicyChange();\n\t\t\t\t}\n\t\t\t} ),\n\t\t} );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Type' ), form_item_input, tab_expense_column1 );\n\n\t\t//Amount\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\tform_item_input.TTextInput( { field: 'gross_amount1' } );\n\n\t\twidgetContainer = $( '<div class=\\'widget-h-box \\'></div>' );\n\t\tlabel = $( '<span class=\\'widget-right-label\\'> ' + $.i18n._( 'Reimburse' ) + ': </span>' );\n\n\t\tvar widget_checkbox = Global.loadWidgetByName( FormItemType.CHECKBOX );\n\t\twidget_checkbox.TCheckbox( { field: 'is_reimbursable' } );\n\n\t\twidgetContainer.append( form_item_input );\n\t\twidgetContainer.append( label );\n\t\twidgetContainer.append( widget_checkbox );\n\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Amount' ), [form_item_input, widget_checkbox], tab_expense_column1, 'last', widgetContainer );\n\n\t\t// Currency\n\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APICurrency,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_currency',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'currency_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Currency' ), form_item_input, tab_expense_column2, '' );\n\n\t\t// Branch\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIBranch,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_branch',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'branch_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Branch' ), form_item_input, tab_expense_column2 );\n\n\t\t//Department\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\tform_item_input.AComboBox( {\n\t\t\tapi_class: TTAPI.APIDepartment,\n\t\t\tallow_multiple_selection: false,\n\t\t\tlayout_name: 'global_department',\n\t\t\tshow_search_inputs: true,\n\t\t\tset_empty: true,\n\t\t\tfield: 'department_id'\n\t\t} );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Department' ), form_item_input, tab_expense_column2 );\n\n\t\tif ( ( Global.getProductEdition() >= 20 ) ) {\n\t\t\t//Job\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJob,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar job_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_coder.TTextInput( { field: 'job_quick_search', disable_keyup_event: true } );\n\t\t\tjob_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Job' ), [form_item_input, job_coder], tab_expense_column2, '', widgetContainer, true );\n\n\t\t\t//Job Item\n\t\t\tform_item_input = Global.loadWidgetByName( FormItemType.AWESOME_BOX );\n\n\t\t\tform_item_input.AComboBox( {\n\t\t\t\tapi_class: TTAPI.APIJobItem,\n\t\t\t\tallow_multiple_selection: false,\n\t\t\t\tlayout_name: 'global_job_item',\n\t\t\t\tshow_search_inputs: true,\n\t\t\t\tset_empty: true,\n\t\t\t\tsetRealValueCallBack: ( function( val ) {\n\n\t\t\t\t\tif ( val ) {\n\t\t\t\t\t\tjob_item_coder.setValue( val.manual_id );\n\t\t\t\t\t}\n\t\t\t\t} ),\n\t\t\t\tfield: 'job_item_id'\n\t\t\t} );\n\n\t\t\twidgetContainer = $( '<div class=\\'widget-h-box\\'></div>' );\n\n\t\t\tvar job_item_coder = Global.loadWidgetByName( FormItemType.TEXT_INPUT );\n\t\t\tjob_item_coder.TTextInput( { field: 'job_item_quick_search', disable_keyup_event: true } );\n\t\t\tjob_item_coder.addClass( 'job-coder' );\n\n\t\t\twidgetContainer.append( job_item_coder );\n\t\t\twidgetContainer.append( form_item_input );\n\t\t\tthis.addEditFieldToColumn( $.i18n._( 'Task' ), [form_item_input, job_item_coder], tab_expense_column2, '', widgetContainer, true );\n\t\t}\n\t\t//Tags\n\t\tform_item_input = Global.loadWidgetByName( FormItemType.TAG_INPUT );\n\n\t\tform_item_input.TTagInput( { field: 'tag', object_type_id: 930 } );\n\t\tthis.addEditFieldToColumn( $.i18n._( 'Tags' ), form_item_input, tab_expense_column2, '', null, null, true );\n\n\t\t//Inside editor\n\n\t\tvar inside_editor_div = tab_expense.find( '.inside-editor-div' );\n\n\t\tvar inside_editor_args = {\n\t\t\tname: $.i18n._( 'Attachment Name' ),\n\t\t\taction: $.i18n._( 'Action' )\n\t\t};\n\n\t\tthis.editor = Global.loadWidgetByName( FormItemType.INSIDE_EDITOR );\n\t\tthis.editor.InsideEditor( {\n\t\t\taddRow: this.insideEditorAddRow,\n\t\t\tremoveRow: this.insideEditorRemoveRow,\n\t\t\tgetValue: this.insideEditorGetValue,\n\t\t\tsetValue: this.insideEditorSetValue,\n\t\t\tparent_controller: this,\n\t\t\tapi: this.document_api,\n\t\t\trender: getRender(),\n\t\t\trender_args: inside_editor_args,\n\t\t\trender_inline_html: true,\n\t\t\trow_render: getRowRender()\n\n\t\t} );\n\n\t\tfunction getRender() {\n\t\t\treturn `\n\t\t\t<table class=\"inside-editor-render\">\n\t\t\t\t<tr class=\"title\" style=\"font-weight: bold\">\n\t\t\t\t\t<td style=\"width: 400px\"><%= name %></td>\n\t\t\t\t\t<td style=\"width: 300px\"><%= action %></td>\n\t\t\t\t</tr>\n\t\t\t</table>`;\n\t\t}\n\n\t\tfunction getRowRender() {\n\t\t\treturn `\n\t\t\t<tr class=\"inside-editor-row data-row\">\n\t\t\t\t<td></td>\n\t\t\t\t<td></td>\n\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t<button class=\"plus-icon\" onclick=\"\"></button>\n\t\t\t\t</td>\n\t\t\t\t<td class=\"cell control-icon\">\n\t\t\t\t\t<button class=\"minus-icon \" onclick=\"\"></button>\n\t\t\t\t</td>\n\t\t\t</tr>`;\n\t\t}\n\n\t\tinside_editor_div.append( this.editor );\n\t}\n\n\tbuildSearchFields() {\n\n\t\tsuper.buildSearchFields();\n\t\tvar default_args = {};\n\t\tdefault_args.permission_section = 'user_expense';\n\t\tthis.search_fields = [\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Employee' ),\n\t\t\t\tin_column: 1,\n\t\t\t\tfield: 'user_id',\n\t\t\t\tdefault_args: default_args,\n\t\t\t\tlayout_name: 'global_user',\n\t\t\t\tapi_class: TTAPI.APIUser,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Tags' ),\n\t\t\t\tfield: 'tag',\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tin_column: 1,\n\t\t\t\tobject_type_id: 930,\n\t\t\t\tform_item_type: FormItemType.TAG_INPUT\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Type' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'expense_policy_id',\n\t\t\t\tlayout_name: 'global_expense_policy',\n\t\t\t\tapi_class: TTAPI.APIExpensePolicy,\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} ),\n\n\t\t\tnew SearchField( {\n\t\t\t\tlabel: $.i18n._( 'Status' ),\n\t\t\t\tin_column: 2,\n\t\t\t\tfield: 'status_id',\n\t\t\t\tmultiple: true,\n\t\t\t\tbasic_search: true,\n\t\t\t\tadv_search: false,\n\t\t\t\tlayout_name: 'global_option_column',\n\t\t\t\tform_item_type: FormItemType.AWESOME_BOX\n\t\t\t} )\n\t\t];\n\n\t}\n\n\tgetUserExpenseTabHtml() {\n\t\treturn `<div id=\"tab_expense\" class=\"edit-view-tab-outside\">\n\t\t\t\t\t<div class=\"edit-view-tab\" id=\"tab_expense_content_div\">\n\t\t\t\t\t\t<div class=\"first-column\"></div>\n\t\t\t\t\t\t<div class=\"second-column\"></div>\n\t\t\t\t\t\t<div class=\"third-column full-width-column\"></div>\n\t\t\t\t\t\t<div class=\"inside-editor-div full-width-column\"></div>\n\t\t\t\t\t\t<div class=\"authorization-grid-div inside-grid full-width-column\">\n\t\t\t\t\t\t\t<div class=\"grid-top-border\"></div>\n\t\t\t\t\t\t\t<div class=\"grid-title separated-box\"></div>\n\t\t\t\t\t\t\t<table id=\"grid\"></table>\n\t\t\t\t\t\t\t<div class=\"bottom-div\">\n\t\t\t\t\t\t\t\t<div class=\"grid-bottom-border\"></div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>`;\n\t}\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0EsV0FBVyxDQUFDO0FBQ1o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7O0FBRUw7QUFDQSxXQUFXLENBQUM7QUFDWjtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSzs7QUFFTDtBQUNBLFdBQVcsQ0FBQztBQUNaO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4vaW50ZXJmYWNlL2h0bWw1L3ZpZXdzL3BheXJvbGwvdXNlcl9leHBlbnNlL1VzZXJFeHBlbnNlVmlld0NvbnRyb2xsZXIuanM/NjcxOSJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgJ0AvZ2xvYmFsL3dpZGdldHMvZmlsZWJyb3dzZXIvVEltYWdlQnJvd3Nlcic7XG5cbmV4cG9ydCBjbGFzcyBVc2VyRXhwZW5zZVZpZXdDb250cm9sbGVyIGV4dGVuZHMgQmFzZVZpZXdDb250cm9sbGVyIHtcblx0Y29uc3RydWN0b3IoIG9wdGlvbnMgPSB7fSApIHtcblx0XHRfLmRlZmF1bHRzKCBvcHRpb25zLCB7XG5cdFx0XHRlbDogJyN1c2VyX2V4cGVuc2Vfdmlld19jb250YWluZXInLFxuXG5cdFx0XHQvLyBfcmVxdWlyZWRfZmlsZXM6IFsnVEltYWdlQnJvd3NlciddLFxuXG5cdFx0XHRzdGF0dXNfYXJyYXk6IG51bGwsXG5cblx0XHRcdGhpZXJhcmNoeV9sZXZlbF9hcnJheTogbnVsbCxcblxuXHRcdFx0c3ViX2RvY3VtZW50X3ZpZXdfY29udHJvbGxlcjogbnVsbCxcblxuXHRcdFx0ZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWQ6IG51bGwsXG5cblx0XHRcdHJlbGF0ZWRFeHBlbnNlQXJyYXk6IG51bGwsXG5cblx0XHRcdGRvY3VtZW50X2FwaTogbnVsbCxcblx0XHRcdHBheW1lbnRfbWV0aG9kX2FycmF5OiBudWxsXG5cdFx0fSApO1xuXG5cdFx0c3VwZXIoIG9wdGlvbnMgKTtcblx0fVxuXG5cdGluaXQoIG9wdGlvbnMgKSB7XG5cdFx0Ly90aGlzLl9zdXBlcignaW5pdGlhbGl6ZScsIG9wdGlvbnMgKTtcblx0XHR0aGlzLmVkaXRfdmlld190cGwgPSAnVXNlckV4cGVuc2VFZGl0Vmlldy5odG1sJztcblx0XHR0aGlzLnBlcm1pc3Npb25faWQgPSAndXNlcl9leHBlbnNlJztcblx0XHR0aGlzLnZpZXdJZCA9ICdVc2VyRXhwZW5zZSc7XG5cdFx0dGhpcy5zY3JpcHRfbmFtZSA9ICdVc2VyRXhwZW5zZVZpZXcnO1xuXHRcdHRoaXMudGFibGVfbmFtZV9rZXkgPSAndXNlcl9leHBlbnNlJztcblx0XHR0aGlzLmNvbnRleHRfbWVudV9uYW1lID0gJC5pMThuLl8oICdFeHBlbnNlcycgKTtcblx0XHR0aGlzLm5hdmlnYXRpb25fbGFiZWwgPSAkLmkxOG4uXyggJ0V4cGVuc2UnICk7XG5cdFx0dGhpcy5kb2N1bWVudF9vYmplY3RfdHlwZV9pZCA9IDQwMDtcblx0XHR0aGlzLmhpZXJhcmNoeV90eXBlX2lkID0gMjAwO1xuXG5cdFx0dGhpcy5hcGkgPSBUVEFQSS5BUElVc2VyRXhwZW5zZTtcblxuXHRcdGlmICggKCBHbG9iYWwuZ2V0UHJvZHVjdEVkaXRpb24oKSA+PSAyMCApICkge1xuXHRcdFx0dGhpcy5qb2JfYXBpID0gVFRBUEkuQVBJSm9iO1xuXHRcdFx0dGhpcy5qb2JfaXRlbV9hcGkgPSBUVEFQSS5BUElKb2JJdGVtO1xuXHRcdH1cblxuXHRcdHRoaXMucmVuZGVyKCk7XG5cdFx0dGhpcy5idWlsZENvbnRleHRNZW51KCk7XG5cblx0XHR0aGlzLmluaXREYXRhKCk7XG5cdH1cblxuXHRnZXRDdXN0b21Db250ZXh0TWVudU1vZGVsKCkge1xuXHRcdHZhciBjb250ZXh0X21lbnVfbW9kZWwgPSB7XG5cdFx0XHRleGNsdWRlOiBbJ2NvcHknLCAnbWFzc19lZGl0J10sXG5cdFx0XHRpbmNsdWRlOiBbXVxuXHRcdH07XG5cblx0XHRyZXR1cm4gY29udGV4dF9tZW51X21vZGVsO1xuXHR9XG5cblx0aW5pdE9wdGlvbnMoKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbiggJ3N0YXR1cycgKTtcblx0XHR0aGlzLmluaXREcm9wRG93bk9wdGlvbiggJ3BheW1lbnRfbWV0aG9kJyApO1xuXG5cdFx0dmFyIGZpbHRlciA9IHt9O1xuXHRcdGZpbHRlci5maWx0ZXJfZGF0YSA9IHt9O1xuXHRcdGZpbHRlci5maWx0ZXJfZGF0YS50eXBlX2lkID0gWzEwLCAyMCwgMzBdO1xuXHRcdGZpbHRlci5maWx0ZXJfZGF0YS51c2VyX2lkID0gW0xvY2FsQ2FjaGVEYXRhLmxvZ2luVXNlci5pZF07XG5cblx0XHQkdGhpcy5iYXNpY19zZWFyY2hfZmllbGRfdWlfZGljWydleHBlbnNlX3BvbGljeV9pZCddLnNldERlZmF1bHRBcmdzKCBmaWx0ZXIgKTtcblx0fVxuXG5cdGdldEZpbHRlckNvbHVtbnNGcm9tRGlzcGxheUNvbHVtbnMoKSB7XG5cdFx0dmFyIGNvbHVtbl9maWx0ZXIgPSB7fTtcblx0XHRjb2x1bW5fZmlsdGVyLnVzZXIgPSB0cnVlO1xuXHRcdHRoaXMuX2dldEZpbHRlckNvbHVtbnNGcm9tRGlzcGxheUNvbHVtbnMoIGNvbHVtbl9maWx0ZXIsIHRydWUgKTtcblx0fVxuXG5cdGdldFN1YlZpZXdGaWx0ZXIoIGZpbHRlciApIHtcblxuXHRcdGlmICggZmlsdGVyLmxlbmd0aCA9PT0gMCApIHtcblx0XHRcdGZpbHRlciA9IHt9O1xuXHRcdH1cblxuXHRcdGZpbHRlclsncGFyZW50X2lkJ10gPSAwO1xuXG5cdFx0cmV0dXJuIGZpbHRlcjtcblx0fVxuXG5cdC8qIGpzaGludCBpZ25vcmU6c3RhcnQgKi9cblx0c2V0Q3VycmVudEVkaXRSZWNvcmREYXRhKCkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0Ly9TZXQgY3VycmVudCBlZGl0IHJlY29yZCBkYXRhIHRvIGFsbCB3aWRnZXRzXG5cblx0XHRpZiAoIEdsb2JhbC5pc0ZhbHNlT3JOdWxsKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3VzZXJfaWQnXSApICkge1xuXHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWyd1c2VyX2lkJ10gPSBMb2NhbENhY2hlRGF0YS5nZXRMb2dpblVzZXIoKS5pZDtcblx0XHR9XG5cblx0XHRmb3IgKCB2YXIga2V5IGluIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZCApIHtcblx0XHRcdHZhciB3aWRnZXQgPSB0aGlzLmVkaXRfdmlld191aV9kaWNba2V5XTtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCB3aWRnZXQgKSApIHtcblx0XHRcdFx0c3dpdGNoICgga2V5ICkge1xuXHRcdFx0XHRcdGNhc2UgJ3VzZXJfaWQnOlxuXHRcdFx0XHRcdFx0dmFyIGFyZ3MgPSB7fTtcblx0XHRcdFx0XHRcdHZhciBmaWx0ZXJfZGF0YSA9IHt9O1xuXHRcdFx0XHRcdFx0ZmlsdGVyX2RhdGEudHlwZV9pZCA9IFsxMCwgMjAsIDMwXTtcblx0XHRcdFx0XHRcdGZpbHRlcl9kYXRhLnVzZXJfaWQgPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XTtcblx0XHRcdFx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSBmaWx0ZXJfZGF0YTtcblx0XHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZXhwZW5zZV9wb2xpY3lfaWQnXS5zZXREZWZhdWx0QXJncyggYXJncyApO1xuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZXhwZW5zZV9wb2xpY3lfaWQnOlxuXHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnZ3Jvc3NfYW1vdW50MSc6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50J10gKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2dyb3NzX2Ftb3VudCc6XG5cdFx0XHRcdFx0Y2FzZSAncmVpbWJ1cnNlX2Ftb3VudCc6XG5cdFx0XHRcdFx0Y2FzZSAnbmV0X2Ftb3VudCc6XG5cdFx0XHRcdFx0XHQvLyBEb24ndCBkbyBhbnl0aGluZy5cblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGNhc2UgJ2pvYl9pZCc6XG5cdFx0XHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnam9iX2l0ZW1faWQnOlxuXHRcdFx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0XHRcdHZhciBhcmdzID0ge307XG5cdFx0XHRcdFx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEgPSB7IGpvYl9pZDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmpvYl9pZCB9O1xuXHRcdFx0XHRcdFx0XHR3aWRnZXQuc2V0RGVmYXVsdEFyZ3MoIGFyZ3MgKTtcblx0XHRcdFx0XHRcdFx0d2lkZ2V0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0Y2FzZSAnam9iX3F1aWNrX3NlYXJjaCc6XG4vL1x0XHRcdFx0XHRcdHdpZGdldC5zZXRWYWx1ZSggdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydqb2JfaWQnXSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnam9iX2lkJ10gOiAwICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRjYXNlICdqb2JfaXRlbV9xdWlja19zZWFyY2gnOlxuLy9cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnam9iX2l0ZW1faWQnXSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnam9iX2l0ZW1faWQnXSA6IDAgKTtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdFx0XHR3aWRnZXQuc2V0VmFsdWUoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldICk7XG5cdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2xsZWN0VUlEYXRhVG9DdXJyZW50RWRpdFJlY29yZCgpO1xuXHRcdHRoaXMuc2V0RWRpdFZpZXdEYXRhRG9uZSgpO1xuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblxuXHRzZXRFZGl0Vmlld0RhdGFEb25lKCkge1xuXHRcdHN1cGVyLnNldEVkaXRWaWV3RGF0YURvbmUoKTtcblxuXHRcdGlmICggR2xvYmFsLmlzU2V0KCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ3JlbGF0ZWRfZXhwZW5zZXMnXSApICkge1xuXHRcdFx0dGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5ID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydyZWxhdGVkX2V4cGVuc2VzJ107XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuc2V0UmVsYXRlZEV4cGVuc2UoIHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSApO1xuXG5cdFx0dGhpcy5pbml0SW5zaWRlRWRpdG9yRGF0YSgpO1xuXHRcdEF1dGhvcml6YXRpb25IaXN0b3J5LmluaXQoIHRoaXMgKTtcblxuXHRcdHRoaXMub25FeHBlbnNlUG9saWN5Q2hhbmdlKCk7XG5cdH1cblxuXHRpbml0SW5zaWRlRWRpdG9yRGF0YSgpIHtcblx0XHR2YXIgJHRoaXMgPSB0aGlzO1xuXHRcdHZhciBhcmdzID0ge307XG5cdFx0YXJncy5maWx0ZXJfZGF0YSA9IHt9O1xuXG5cdFx0aWYgKCAhdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkIHx8ICF0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSB7XG5cdFx0XHQkdGhpcy5lZGl0b3IucmVtb3ZlQWxsUm93cygpO1xuXHRcdFx0JHRoaXMuZWRpdG9yLmdldERlZmF1bHREYXRhKCk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHRhcmdzLmZpbHRlcl9kYXRhLm9iamVjdF90eXBlX2lkID0gdGhpcy5kb2N1bWVudF9vYmplY3RfdHlwZV9pZDtcblx0XHRcdGFyZ3MuZmlsdGVyX2RhdGEub2JqZWN0X2lkID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydpZCddO1xuXG5cdFx0XHQkdGhpcy5hcGlbJ2dldEF0dGFjaG1lbnQnXSggYXJncywge1xuXHRcdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHJlcyApIHtcblxuXHRcdFx0XHRcdGlmICggISR0aGlzLmVkaXRfdmlldyApIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dmFyIGRhdGEgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0JHRoaXMuZWRpdG9yLnNldFZhbHVlKCBkYXRhICk7XG5cblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXG5cdFx0fVxuXHR9XG5cblx0aW5zaWRlRWRpdG9yU2V0VmFsdWUoIHZhbCApIHtcblx0XHR2YXIgbGVuID0gdmFsLmxlbmd0aDtcblx0XHR0aGlzLnJlbW92ZUFsbFJvd3MoKTtcblxuXHRcdGlmICggbGVuID4gMCApIHtcblx0XHRcdGZvciAoIHZhciBpID0gMDsgaSA8IHZhbC5sZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHZhbFtpXSApICkge1xuXHRcdFx0XHRcdHZhciByb3cgPSB2YWxbaV07XG5cdFx0XHRcdFx0dGhpcy5hZGRSb3coIHJvdyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuZ2V0RGVmYXVsdERhdGEoKTtcblx0XHR9XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JHZXRWYWx1ZSgpIHtcblxuXHRcdHZhciBsZW4gPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5sZW5ndGg7XG5cblx0XHR2YXIgcmVzdWx0ID0gW107XG5cblx0XHRmb3IgKCB2YXIgaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdHZhciByb3cgPSB0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheVtpXTtcblx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCByb3cuZmlsZSApICkge1xuXHRcdFx0XHR2YXIgZGF0YSA9IHtcblx0XHRcdFx0XHRuYW1lOiByb3cubmFtZS5nZXRWYWx1ZSgpLFxuXHRcdFx0XHRcdGZpbGU6IHJvdy5maWxlLmdldFZhbHVlKClcblx0XHRcdFx0fTtcblxuXHRcdFx0XHRpZiAoIGRhdGEubmFtZSA9PT0gJ05vIEZpbGUgU2VsZWN0ZWQnICkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0LnB1c2goIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JBZGRSb3coIGRhdGEsIGluZGV4ICkge1xuXG5cdFx0aWYgKCAhZGF0YSApIHtcblx0XHRcdHRoaXMuZ2V0RGVmYXVsdERhdGEoIGluZGV4ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHZhciByb3cgPSB0aGlzLmdldFJvd1JlbmRlcigpOyAvL0dldCBSb3cgcmVuZGVyXG5cdFx0XHR2YXIgcmVuZGVyID0gdGhpcy5nZXRSZW5kZXIoKTsgLy9nZXQgcmVuZGVyLCBzaG91bGQgYmUgYSB0YWJsZVxuXHRcdFx0dmFyIHdpZGdldHMgPSB7fTsgLy9TYXZlIGVhY2ggcm93J3Mgd2lkZ2V0c1xuXG5cdFx0XHQvL0J1aWxkIHJvdyB3aWRnZXRzXG5cblx0XHRcdC8vIEF0dGFjaG1lbnQgTmFtZVxuXHRcdFx0dmFyIGZvcm1faXRlbV9maWxlX25hbWUgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdGZvcm1faXRlbV9maWxlX25hbWUuVFRleHQoIHsgZmllbGQ6ICduYW1lJywgd2lkdGg6IDQwMCB9ICk7XG5cdFx0XHRmb3JtX2l0ZW1fZmlsZV9uYW1lLnNldFZhbHVlKCBkYXRhLm5hbWUgPyBkYXRhLm5hbWUgOiAkLmkxOG4uXyggJ05vIEZpbGUgU2VsZWN0ZWQnICkgKTtcblx0XHRcdGZvcm1faXRlbV9maWxlX25hbWUuc2V0Q2xhc3NTdHlsZSggZGF0YS5uYW1lID8ge1xuXHRcdFx0XHQnZm9udC13ZWlnaHQnOiAnYm9sZCcsXG5cdFx0XHRcdCdsaW5lLWhlaWdodCc6IDBcblx0XHRcdH0gOiB7ICdsaW5lLWhlaWdodCc6IDAgfSApO1xuXHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fZmlsZV9uYW1lLmdldEZpZWxkKCldID0gZm9ybV9pdGVtX2ZpbGVfbmFtZTtcblx0XHRcdHJvdy5jaGlsZHJlbigpLmVxKCAwICkuYXBwZW5kKCBmb3JtX2l0ZW1fZmlsZV9uYW1lICk7XG5cdFx0XHRmb3JtX2l0ZW1fZmlsZV9uYW1lLmF0dHIoICdkb2N1bWVudF9pZCcsICggZGF0YS5pZCAmJiB0aGlzLnBhcmVudF9jb250cm9sbGVyLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQgKSA/IGRhdGEuaWQgOiAnJyApO1xuXHRcdFx0Zm9ybV9pdGVtX2ZpbGVfbmFtZS5hdHRyKCAnZG9jdW1lbnRfcmV2aXNpb25faWQnLCAoIGRhdGEuZG9jdW1lbnRfcmV2aXNpb25faWQgJiYgdGhpcy5wYXJlbnRfY29udHJvbGxlci5jdXJyZW50X2VkaXRfcmVjb3JkLmlkICkgPyBkYXRhLmRvY3VtZW50X3JldmlzaW9uX2lkIDogJycgKTtcblxuXHRcdFx0Ly8gQWN0aW9uXG5cdFx0XHRpZiAoIGRhdGEubmFtZSApIHtcblxuXHRcdFx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyID0gJCggJzxkaXYgY2xhc3M9XFwnd2lkZ2V0LWgtYm94XFwnPjwvZGl2PicgKTtcblx0XHRcdFx0dmFyIGRvd25sb2FkID0gJCggJzxidXR0b24gdHlwZT1cXCdidXR0b25cXCcgY2xhc3M9XFwnIGRvd25sb2FkLWJ1dHRvbiB0LWJ1dHRvbiB3aWRnZXQtcmlnaHQtbGFiZWxcXCc+JyArICQuaTE4bi5fKCAnRG93bmxvYWQnICkgKyAnPC9idXR0b24+JyApO1xuXHRcdFx0XHR2YXIgdmlldyA9ICQoICc8YnV0dG9uIHR5cGU9XFwnYnV0dG9uXFwnIGNsYXNzPVxcJyB2aWV3LWJ1dHRvbiB0LWJ1dHRvbiB3aWRnZXQtcmlnaHQtbGFiZWxcXCc+JyArICQuaTE4bi5fKCAnVmlldycgKSArICc8L2J1dHRvbj4nICk7XG5cblx0XHRcdFx0ZG93bmxvYWQuYXR0cigge1xuXHRcdFx0XHRcdGRvY3VtZW50X2lkOiBkYXRhLmlkLFxuXHRcdFx0XHRcdGRvY3VtZW50X3JldmlzaW9uX2lkOiBkYXRhLmRvY3VtZW50X3JldmlzaW9uX2lkLFxuXHRcdFx0XHRcdG9iamVjdF90eXBlX2lkOiB0aGlzLnBhcmVudF9jb250cm9sbGVyLmRvY3VtZW50X29iamVjdF90eXBlX2lkXG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0dmlldy5hdHRyKCB7XG5cdFx0XHRcdFx0ZG9jdW1lbnRfaWQ6IGRhdGEuaWQsXG5cdFx0XHRcdFx0ZG9jdW1lbnRfcmV2aXNpb25faWQ6IGRhdGEuZG9jdW1lbnRfcmV2aXNpb25faWQsXG5cdFx0XHRcdFx0b2JqZWN0X3R5cGVfaWQ6IHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWRcblx0XHRcdFx0fSApO1xuXG5cdFx0XHRcdGRvd25sb2FkLmJpbmQoICdjbGljaycsIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuZG93bmxvYWRGaWxlICk7XG5cdFx0XHRcdHZpZXcuYmluZCggJ2NsaWNrJywgdGhpcy5wYXJlbnRfY29udHJvbGxlci5kb3dubG9hZEZpbGUgKTtcblxuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBkb3dubG9hZCApO1xuXHRcdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCB2aWV3ICk7XG5cblx0XHRcdFx0cm93LmNoaWxkcmVuKCkuZXEoIDEgKS5hcHBlbmQoIHdpZGdldENvbnRhaW5lciApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dmFyIGZvcm1faXRlbV9maWxlID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5JTUFHRV9CUk9XU0VSICk7XG5cblx0XHRcdFx0dmFyICR0aGlzID0gdGhpcy5maWxlX2Jyb3dzZXIgPSBmb3JtX2l0ZW1fZmlsZS5USW1hZ2VCcm93c2VyKCB7XG5cdFx0XHRcdFx0XHRmaWVsZDogJ2ZpbGUnLFxuXHRcdFx0XHRcdFx0bmFtZTogJ2ZpbGVkYXRhJyxcblx0XHRcdFx0XHRcdGFjY2VwdF9maWx0ZXI6ICcqJyxcblx0XHRcdFx0XHRcdGNoYW5nZUhhbmRsZXI6IGZ1bmN0aW9uKCBhICkge1xuXHRcdFx0XHRcdFx0XHR2YXIgZmlsZV9uYW1lID0gJCggdGhpcyApLmZpbmQoICcuYnJvd3NlcicgKVswXS5maWxlc1swXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRmb3JtX2l0ZW1fZmlsZV9uYW1lLnNldFZhbHVlKCBmaWxlX25hbWUgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0d2lkZ2V0c1tmb3JtX2l0ZW1fZmlsZS5nZXRGaWVsZCgpXSA9IGZvcm1faXRlbV9maWxlO1xuXHRcdFx0XHRyb3cuY2hpbGRyZW4oKS5lcSggMSApLmFwcGVuZCggZm9ybV9pdGVtX2ZpbGUgKTtcblxuXHRcdFx0fVxuXG5cdFx0XHQvLyBlbmRcblxuXHRcdFx0aWYgKCB0eXBlb2YgaW5kZXggIT0gJ3VuZGVmaW5lZCcgKSB7XG5cblx0XHRcdFx0cm93Lmluc2VydEFmdGVyKCAkKCByZW5kZXIgKS5maW5kKCAndHInICkuZXEoIGluZGV4ICkgKTtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCAoIGluZGV4ICksIDAsIHdpZGdldHMgKTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0JCggcmVuZGVyICkuYXBwZW5kKCByb3cgKTtcblx0XHRcdFx0dGhpcy5yb3dzX3dpZGdldHNfYXJyYXkucHVzaCggd2lkZ2V0cyApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIHRoaXMucGFyZW50X2NvbnRyb2xsZXIuaXNfdmlld2luZyApIHtcblx0XHRcdFx0cm93LmZpbmQoICcuY29udHJvbC1pY29uJyApLmhpZGUoKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5hZGRJY29uc0V2ZW50KCByb3cgKTsgLy9CaW5kIGV2ZW50IHRvIGFkZCBhbmQgbWludXMgaWNvblxuXHRcdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXHRcdH1cblx0fVxuXG5cdGRvd25sb2FkRmlsZSgpIHtcblxuXHRcdHZhciAkdGhpcyA9ICQoIHRoaXMgKTtcblx0XHR2YXIgZG9jdW1lbnRfYXR0YWNobWVudF9pZCA9ICR0aGlzLmF0dHIoICdkb2N1bWVudF9pZCcgKTtcblx0XHR2YXIgZG9jdW1lbnRfcmV2aXNpb25faWQgPSAkdGhpcy5hdHRyKCAnZG9jdW1lbnRfcmV2aXNpb25faWQnICk7XG5cdFx0dmFyIG9iamVjdF90eXBlX2lkID0gJHRoaXMuYXR0ciggJ29iamVjdF90eXBlX2lkJyApO1xuXG5cdFx0dmFyIHVybCA9IFNlcnZpY2VDYWxsZXIuZ2V0VVJMQnlPYmplY3RUeXBlKCAnZmlsZV9kb3dubG9hZCcgKSArICcmb2JqZWN0X3R5cGU9ZG9jdW1lbnQmcGFyZW50X2lkPScgKyBkb2N1bWVudF9hdHRhY2htZW50X2lkICsgJyZwYXJlbnRfb2JqZWN0X3R5cGVfaWQ9JyArIG9iamVjdF90eXBlX2lkICsgJyZvYmplY3RfaWQ9JyArIGRvY3VtZW50X3JldmlzaW9uX2lkO1xuXG5cdFx0R2xvYmFsLkFQSUZpbGVEb3dubG9hZCggbnVsbCwgbnVsbCwgbnVsbCwgdXJsICk7XG5cdH1cblxuXHRpbnNpZGVFZGl0b3JSZW1vdmVSb3coIHJvdyApIHtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGluZGV4ID0gcm93WzBdLnJvd0luZGV4IC0gMTtcblx0XHR2YXIgcmVtb3ZlX2lkID0gdGhpcy5yb3dzX3dpZGdldHNfYXJyYXlbaW5kZXhdLm5hbWUuYXR0ciggJ2RvY3VtZW50X2lkJyApO1xuXHRcdGlmICggVFRVVUlELmlzVVVJRCggcmVtb3ZlX2lkICkgJiYgcmVtb3ZlX2lkICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlbW92ZV9pZCAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkge1xuXHRcdFx0VEFsZXJ0TWFuYWdlci5zaG93Q29uZmlybUFsZXJ0KCBHbG9iYWwuZGVsZXRlX2NvbmZpcm1fbWVzc2FnZSwgbnVsbCwgZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0XHRcdFx0aWYgKCByZXN1bHQgKSB7XG5cdFx0XHRcdFx0UHJvZ3Jlc3NCYXIuc2hvd092ZXJsYXkoKTtcblx0XHRcdFx0XHQkdGhpcy5hcGlbJ2RlbGV0ZScgKyAkdGhpcy5hcGkua2V5X25hbWVdKCByZW1vdmVfaWQsIHtcblx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzdWx0ICkge1xuXHRcdFx0XHRcdFx0XHRQcm9ncmVzc0Jhci5jbG9zZU92ZXJsYXkoKTtcblx0XHRcdFx0XHRcdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0XHRcdFx0XHRcdHJvdy5yZW1vdmUoKTtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5yb3dzX3dpZGdldHNfYXJyYXkuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHRcdFx0XHRcdGlmICggJHRoaXMucm93c193aWRnZXRzX2FycmF5Lmxlbmd0aCA9PT0gMCApIHtcblx0XHRcdFx0XHRcdFx0XHRcdCR0aGlzLmdldERlZmF1bHREYXRhKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJvdy5yZW1vdmUoKTtcblx0XHRcdCR0aGlzLnJvd3Nfd2lkZ2V0c19hcnJheS5zcGxpY2UoIGluZGV4LCAxICk7XG5cdFx0fVxuXG5cdFx0dGhpcy5yZW1vdmVMYXN0Um93TGluZSgpO1xuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTpzdGFydCAqL1xuXHRvbkZvcm1JdGVtQ2hhbmdlKCB0YXJnZXQsIGRvTm90VmFsaWRhdGUgKSB7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdHRoaXMuc2V0SXNDaGFuZ2VkKCB0YXJnZXQgKTtcblx0XHR0aGlzLnNldE1hc3NFZGl0aW5nRmllbGRzV2hlbkZvcm1DaGFuZ2UoIHRhcmdldCApO1xuXG5cdFx0dmFyIGtleSA9IHRhcmdldC5nZXRGaWVsZCgpO1xuXHRcdHZhciBjX3ZhbHVlID0gdGFyZ2V0LmdldFZhbHVlKCk7XG5cblx0XHR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRba2V5XSA9IGNfdmFsdWU7XG5cblx0XHR2YXIgYW1vdW50X2FyciA9IGZhbHNlO1xuXHRcdHN3aXRjaCAoIGtleSApIHtcblx0XHRcdGNhc2UgJ3VzZXJfaWQnOlxuXHRcdFx0XHR2YXIgYXJncyA9IHt9O1xuXHRcdFx0XHR2YXIgZmlsdGVyX2RhdGEgPSB7fTtcblx0XHRcdFx0ZmlsdGVyX2RhdGEudHlwZV9pZCA9IFsxMCwgMjAsIDMwXTtcblx0XHRcdFx0ZmlsdGVyX2RhdGEudXNlcl9pZCA9IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFtrZXldO1xuXHRcdFx0XHRhcmdzLmZpbHRlcl9kYXRhID0gZmlsdGVyX2RhdGE7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZXhwZW5zZV9wb2xpY3lfaWQnXS5zZXRTb3VyY2VEYXRhKCBudWxsICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZXhwZW5zZV9wb2xpY3lfaWQnXS5zZXREZWZhdWx0QXJncyggYXJncyApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2V4cGVuc2VfcG9saWN5X2lkJzpcblx0XHRcdFx0dGhpcy5vbkV4cGVuc2VQb2xpY3lDaGFuZ2UoKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdncm9zc19hbW91bnQxJzpcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddIDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQnXTtcblx0XHRcdFx0aWYgKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2V4cGVuc2VfcG9saWN5X2lkJ10gJiYgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gKSB7XG5cdFx0XHRcdFx0dGhpcy5hcGlbJ2NhbGNSZWxhdGVkRXhwZW5zZXMnXShcblx0XHRcdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZXhwZW5zZV9wb2xpY3lfaWQnXSwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10sIGFtb3VudF9hcnIsIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnaXNfcmVpbWJ1cnNhYmxlJ10sXG5cdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdG9uUmVzdWx0OiBmdW5jdGlvbiggcmVzICkge1xuXHRcdFx0XHRcdFx0XHRcdCR0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkgPSByZXMuZ2V0UmVzdWx0KCk7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMuc2V0UmVsYXRlZEV4cGVuc2UoICR0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnaXNfcmVpbWJ1cnNhYmxlJzpcblx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gPSB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSA/IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddIDogdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQnXTtcblx0XHRcdFx0YW1vdW50X2FyciA9IHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA/IHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA6IGZhbHNlO1xuXHRcdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZXhwZW5zZV9wb2xpY3lfaWQnXSAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSApIHtcblx0XHRcdFx0XHR0aGlzLmFwaVsnY2FsY1JlbGF0ZWRFeHBlbnNlcyddKFxuXHRcdFx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydleHBlbnNlX3BvbGljeV9pZCddLCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSwgYW1vdW50X2FyciwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydpc19yZWltYnVyc2FibGUnXSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zZXRSZWxhdGVkRXhwZW5zZSggJHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdhbW91bnQnOlxuXHRcdFx0XHR2YXIgcmVsYXRlZF9leHBlbnNlX3BvbGljeV9pZCA9IHRhcmdldC5hdHRyKCAnaWQnICk7XG5cdFx0XHRcdHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50MSddID0gdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydncm9zc19hbW91bnQxJ10gPyB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSA6IHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZ3Jvc3NfYW1vdW50J107XG5cdFx0XHRcdHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheVsndGF4ZXMnXVtyZWxhdGVkX2V4cGVuc2VfcG9saWN5X2lkXVsnYW1vdW50J10gPSBjX3ZhbHVlO1xuXHRcdFx0XHRhbW91bnRfYXJyID0gdGhpcy5yZWxhdGVkRXhwZW5zZUFycmF5O1xuXHRcdFx0XHRpZiAoIHRoaXMuY3VycmVudF9lZGl0X3JlY29yZFsnZXhwZW5zZV9wb2xpY3lfaWQnXSAmJiB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSApIHtcblx0XHRcdFx0XHR0aGlzLmFwaVsnY2FsY1JlbGF0ZWRFeHBlbnNlcyddKFxuXHRcdFx0XHRcdFx0dGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydleHBlbnNlX3BvbGljeV9pZCddLCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmRbJ2dyb3NzX2Ftb3VudDEnXSwgYW1vdW50X2FyciwgdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkWydpc19yZWltYnVyc2FibGUnXSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0b25SZXN1bHQ6IGZ1bmN0aW9uKCByZXMgKSB7XG5cdFx0XHRcdFx0XHRcdFx0JHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSA9IHJlcy5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHRcdFx0XHQkdGhpcy5zZXRSZWxhdGVkRXhwZW5zZSggJHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheSApO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlICdqb2JfaWQnOlxuXHRcdFx0XHRpZiAoICggR2xvYmFsLmdldFByb2R1Y3RFZGl0aW9uKCkgPj0gMjAgKSApIHtcblx0XHRcdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2pvYl9xdWlja19zZWFyY2gnXS5zZXRWYWx1ZSggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkgPyAoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA/IHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA6ICcnICkgOiAnJyApO1xuXHRcdFx0XHRcdHRoaXMuc2V0Sm9iSXRlbVZhbHVlV2hlbkpvYkNoYW5nZWQoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApICk7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfcXVpY2tfc2VhcmNoJ10uc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9pdGVtX2lkJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydqb2JfaXRlbV9xdWlja19zZWFyY2gnXS5zZXRWYWx1ZSggdGFyZ2V0LmdldFZhbHVlKCB0cnVlICkgPyAoIHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA/IHRhcmdldC5nZXRWYWx1ZSggdHJ1ZSApLm1hbnVhbF9pZCA6ICcnICkgOiAnJyApO1xuXHRcdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snam9iX2l0ZW1fcXVpY2tfc2VhcmNoJ10uc2V0Q2hlY2tCb3goIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ2pvYl9xdWlja19zZWFyY2gnOlxuXHRcdFx0Y2FzZSAnam9iX2l0ZW1fcXVpY2tfc2VhcmNoJzpcblx0XHRcdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHRcdFx0dGhpcy5vbkpvYlF1aWNrU2VhcmNoKCBrZXksIGNfdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRpZiAoICFkb05vdFZhbGlkYXRlICkge1xuXHRcdFx0dGhpcy52YWxpZGF0ZSgpO1xuXHRcdH1cblx0fVxuXG5cdG9uRXhwZW5zZVBvbGljeUNoYW5nZSgpIHtcblx0XHR2YXIgZXhwZW5zZV9wb2xpY2llcyA9IHRoaXMuZWRpdF92aWV3X3VpX2RpY1snZXhwZW5zZV9wb2xpY3lfaWQnXS5nZXRTb3VyY2VEYXRhKCk7XG5cdFx0aWYgKCBleHBlbnNlX3BvbGljaWVzICYmIEdsb2JhbC5pc0FycmF5KCBleHBlbnNlX3BvbGljaWVzICkgJiYgZXhwZW5zZV9wb2xpY2llcy5sZW5ndGggPiAwICkge1xuXHRcdFx0dmFyIHVuaXRfbmFtZSA9ICQuaTE4bi5fKCAnQW1vdW50JyApO1xuXG5cdFx0XHRmb3IgKCB2YXIgbiBpbiBleHBlbnNlX3BvbGljaWVzICkge1xuXHRcdFx0XHRpZiAoIGV4cGVuc2VfcG9saWNpZXNbbl0uaWQgPT0gdGhpcy5lZGl0X3ZpZXdfdWlfZGljWydleHBlbnNlX3BvbGljeV9pZCddLmdldFZhbHVlKCkgJiYgZXhwZW5zZV9wb2xpY2llc1tuXS51bml0X25hbWUgJiYgZXhwZW5zZV9wb2xpY2llc1tuXS51bml0X25hbWUubGVuZ3RoID4gMCAmJiBleHBlbnNlX3BvbGljaWVzW25dLnR5cGVfaWQgPT0gMzAgKSB7XG5cdFx0XHRcdFx0dW5pdF9uYW1lID0gZXhwZW5zZV9wb2xpY2llc1tuXS51bml0X25hbWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydncm9zc19hbW91bnQxJ10ucGFyZW50cyggJy5lZGl0LXZpZXctZm9ybS1pdGVtLWRpdicgKS5maW5kKCAnLmVkaXQtdmlldy1mb3JtLWl0ZW0tbGFiZWwnICkuaHRtbCggdW5pdF9uYW1lICk7XG5cdFx0fVxuXHR9XG5cblx0LyoganNoaW50IGlnbm9yZTplbmQgKi9cblx0c2V0UmVsYXRlZEV4cGVuc2UoIGV4cGVuc2VzICkge1xuXHRcdC8vIFRoaXJkIGNvbHVtbiBzdGFydFxuXHRcdHZhciB0YWJfZXhwZW5zZSA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9leHBlbnNlJyApO1xuXHRcdHZhciB0YWJfZXhwZW5zZV9jb2x1bW4zID0gdGFiX2V4cGVuc2UuZmluZCggJy50aGlyZC1jb2x1bW4nICkuZW1wdHkoKTtcblxuXHRcdGlmICggdGhpcy5lZGl0X3ZpZXdfdGFic1swXS5sZW5ndGggPCAzICkge1xuXHRcdFx0dGhpcy5lZGl0X3ZpZXdfdGFic1swXS5wdXNoKCB0YWJfZXhwZW5zZV9jb2x1bW4zICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBleHBlbnNlcyAmJiBleHBlbnNlc1sndGF4ZXMnXSAmJiBPYmplY3Qua2V5cyggZXhwZW5zZXNbJ3RheGVzJ10gKS5sZW5ndGggPiAwICkge1xuXHRcdFx0Ly8gTmV0IEFtb3VudFxuXHRcdFx0dmFyIGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICduZXRfYW1vdW50JyB9ICk7XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGV4cGVuc2VzWyduZXRfYW1vdW50J10gKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRFbmFibGVkKCAoIHRoaXMuaXNfdmlld2luZyA9PSBmYWxzZSApICk7XG5cdFx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ05ldCBBbW91bnQnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMywgJycsIG51bGwsIHRydWUgKTtcblx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snbmV0X2Ftb3VudCddLmNzcyggJ29wYWNpdHknLCAxICk7XG5cblx0XHRcdGZvciAoIHZhciBrZXkgaW4gZXhwZW5zZXNbJ3RheGVzJ10gKSB7XG5cdFx0XHRcdC8vIHRheGVzXG5cdFx0XHRcdHZhciBpdGVtID0gZXhwZW5zZXNbJ3RheGVzJ11ba2V5XTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dElucHV0KCB7IGZpZWxkOiAnYW1vdW50JyB9ICk7XG5cdFx0XHRcdGZvcm1faXRlbV9pbnB1dC5zZXRWYWx1ZSggaXRlbVsnYW1vdW50J10gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LmF0dHIoICdpZCcsIGl0ZW1bJ2V4cGVuc2VfcG9saWN5X2lkJ10gKTtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldEVuYWJsZWQoICggdGhpcy5pc192aWV3aW5nID09IGZhbHNlICkgKTtcblx0XHRcdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oIGl0ZW1bJ2V4cGVuc2VfcG9saWN5X25hbWUnXSApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjMsICcnLCBudWxsLCB0cnVlICk7XG5cdFx0XHRcdHRoaXMuZWRpdF92aWV3X3VpX2RpY1snYW1vdW50J10uY3NzKCAnb3BhY2l0eScsIDEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQW1vdW50XG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLlRFWFQgKTtcblx0XHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ2dyb3NzX2Ftb3VudCcgfSApO1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBleHBlbnNlc1snZ3Jvc3NfYW1vdW50J10gKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQW1vdW50JyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjMsICcnLCBudWxsLCB0cnVlICk7XG5cdFx0XHR0aGlzLmVkaXRfdmlld191aV9kaWNbJ2dyb3NzX2Ftb3VudCddLmNzcyggJ29wYWNpdHknLCAxICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmVpbWJ1cnNlIEFtb3VudFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5UVGV4dCggeyBmaWVsZDogJ3JlaW1idXJzZV9hbW91bnQnIH0gKTtcblx0XHRpZiAoIGV4cGVuc2VzICkge1xuXHRcdFx0aWYgKCBleHBlbnNlc1sncmVpbWJ1cnNlX2Ftb3VudCddICYmIGV4cGVuc2VzWyd1bml0X2Ftb3VudCddICYmIGV4cGVuc2VzWyd1bml0X25hbWUnXSApIHtcblx0XHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCBleHBlbnNlc1sncmVpbWJ1cnNlX2Ftb3VudCddICsgJyAoJyArIGV4cGVuc2VzWyd1bml0X2Ftb3VudCddICsgJy8nICsgZXhwZW5zZXNbJ3VuaXRfbmFtZSddICsgJyknICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmb3JtX2l0ZW1faW5wdXQuc2V0VmFsdWUoIGV4cGVuc2VzWydyZWltYnVyc2VfYW1vdW50J10gKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LnNldFZhbHVlKCB0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQucmVpbWJ1cnNlX2Ftb3VudCApO1xuXHRcdH1cblxuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnUmVpbWJ1cnNlIEFtb3VudCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4zLCAnJywgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0dGhpcy5lZGl0X3ZpZXdfdWlfZGljWydyZWltYnVyc2VfYW1vdW50J10uY3NzKCAnb3BhY2l0eScsIDEgKTtcblxuXHRcdHRoaXMuZWRpdEZpZWxkUmVzaXplKCAwICk7XG5cdH1cblxuXHR1bmlmb3JtVmFyaWFibGUoIHJlY29yZHMgKSB7XG5cblx0XHRyZWNvcmRzLnJlbGF0ZWRfZXhwZW5zZXMgPSB0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXk7XG5cdFx0cmVjb3Jkcy5ncm9zc19hbW91bnQgPSB0aGlzLnJlbGF0ZWRFeHBlbnNlQXJyYXkuZ3Jvc3NfYW1vdW50O1xuXHRcdHJlY29yZHMubmV0X2Ftb3VudCA9IHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheS5uZXRfYW1vdW50O1xuXHRcdHJlY29yZHMucmVpbWJ1cnNlX2Ftb3VudCA9IHRoaXMucmVsYXRlZEV4cGVuc2VBcnJheS5yZWltYnVyc2VfYW1vdW50O1xuXG5cdFx0aWYgKCAhR2xvYmFsLmlzU2V0KCByZWNvcmRzLnBhcmVudF9pZCApICkge1xuXHRcdFx0cmVjb3Jkcy5wYXJlbnRfaWQgPSBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVjb3Jkcztcblx0fVxuXG5cdG9uU2F2ZVJlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0XHRcdH1cblxuXHRcdFx0JHRoaXMuc2F2ZUluc2lkZUVkaXRvckRhdGEoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHQkdGhpcy5zZWFyY2goKTtcblx0XHRcdFx0JHRoaXMub25TYXZlRG9uZSggcmVzdWx0ICk7XG5cblx0XHRcdFx0JHRoaXMucmVtb3ZlRWRpdFZpZXcoKTtcblxuXHRcdFx0XHQkKCkuVEZlZWRiYWNrKCB7XG5cdFx0XHRcdFx0c291cmNlOiAnU2F2ZSdcblx0XHRcdFx0fSApO1xuXHRcdFx0fSApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblxuXHRcdH1cblx0fVxuXG5cdC8vIG9uU2F2ZUFuZENvbnRpbnVlUmVzdWx0KCByZXN1bHQgKSB7XG5cdC8vXG5cdC8vIFx0dmFyICR0aGlzID0gdGhpcztcblx0Ly8gXHRpZiAoIHJlc3VsdC5pc1ZhbGlkKCkgKSB7XG5cdC8vIFx0XHR2YXIgcmVzdWx0X2RhdGEgPSByZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdC8vIFx0XHRpZiAoIHJlc3VsdF9kYXRhID09PSB0cnVlICkge1xuXHQvLyBcdFx0XHQkdGhpcy5yZWZyZXNoX2lkID0gJHRoaXMuY3VycmVudF9lZGl0X3JlY29yZC5pZDtcblx0Ly9cblx0Ly8gXHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHsgLy8gYXMgbmV3XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0Ly8gXHRcdH1cblx0Ly9cblx0Ly8gXHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0Ly8gXHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHQvLyBcdFx0XHQkdGhpcy5vbkVkaXRDbGljayggJHRoaXMucmVmcmVzaF9pZCwgdHJ1ZSApO1xuXHQvL1xuXHQvLyBcdFx0XHQkdGhpcy5vblNhdmVBbmRDb250aW51ZURvbmUoIHJlc3VsdCApO1xuXHQvL1xuXHQvLyBcdFx0fSApO1xuXHQvL1xuXHQvLyBcdH0gZWxzZSB7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXHQvLyBcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdC8vIFx0fVxuXHQvLyB9LFxuXG5cdC8vIG9uU2F2ZUFuZE5ld1Jlc3VsdDogZnVuY3Rpb24oIHJlc3VsdCApIHtcblx0Ly8gXHR2YXIgJHRoaXMgPSB0aGlzO1xuXHQvLyBcdGlmICggcmVzdWx0LmlzVmFsaWQoKSApIHtcblx0Ly8gXHRcdHZhciByZXN1bHRfZGF0YSA9IHJlc3VsdC5nZXRSZXN1bHQoKTtcblx0Ly8gXHRcdGlmICggcmVzdWx0X2RhdGEgPT09IHRydWUgKSB7XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSAkdGhpcy5jdXJyZW50X2VkaXRfcmVjb3JkLmlkO1xuXHQvL1xuXHQvLyBcdFx0fSBlbHNlIGlmICggVFRVVUlELmlzVVVJRCggcmVzdWx0X2RhdGEgKSAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQuemVyb19pZCAmJiByZXN1bHRfZGF0YSAhPSBUVFVVSUQubm90X2V4aXN0X2lkICkgeyAvLyBhcyBuZXdcblx0Ly8gXHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHQvLyBcdFx0fVxuXHQvL1xuXHQvLyBcdFx0JHRoaXMuc2F2ZUluc2lkZUVkaXRvckRhdGEoIGZ1bmN0aW9uKCkge1xuXHQvLyBcdFx0XHQkdGhpcy5zZWFyY2goIGZhbHNlICk7XG5cdC8vIFx0XHRcdCR0aGlzLm9uQWRkQ2xpY2soIHRydWUgKTtcblx0Ly9cblx0Ly8gXHRcdH0gKTtcblx0Ly8gXHR9IGVsc2Uge1xuXHQvLyBcdFx0JHRoaXMuc2V0RXJyb3JUaXBzKCByZXN1bHQgKTtcblx0Ly8gXHRcdCR0aGlzLnNldEVycm9yTWVudSgpO1xuXHQvLyBcdH1cblx0Ly8gfSxcblxuXHRfY29udGludWVEb0NvcHlBc05ldygpIHtcblx0XHR0aGlzLnNldEN1cnJlbnRFZGl0Vmlld1N0YXRlKCAnbmV3JyApO1xuXHRcdExvY2FsQ2FjaGVEYXRhLmN1cnJlbnRfZG9pbmdfY29udGV4dF9hY3Rpb24gPSAnY29weV9hc19uZXcnO1xuXG5cdFx0aWYgKCBHbG9iYWwuaXNTZXQoIHRoaXMuZWRpdF92aWV3ICkgKSB7XG5cdFx0XHR0aGlzLmVkaXRvci5yZW1vdmVBbGxSb3dzKCk7XG5cdFx0XHR0aGlzLmVkaXRvci5nZXREZWZhdWx0RGF0YSgpO1xuXHRcdH1cblx0XHRzdXBlci5fY29udGludWVEb0NvcHlBc05ldygpO1xuXHR9XG5cblx0b25TYXZlQW5kQ29weVJlc3VsdCggcmVzdWx0ICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHRcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHRcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cblx0XHRcdH0gZWxzZSBpZiAoIFRUVVVJRC5pc1VVSUQoIHJlc3VsdF9kYXRhICkgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELnplcm9faWQgJiYgcmVzdWx0X2RhdGEgIT0gVFRVVUlELm5vdF9leGlzdF9pZCApIHtcblx0XHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9IHJlc3VsdF9kYXRhO1xuXHRcdFx0fVxuXG5cdFx0XHQkdGhpcy5zYXZlSW5zaWRlRWRpdG9yRGF0YSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdCR0aGlzLnNlYXJjaCggZmFsc2UgKTtcblxuXHRcdFx0XHQkdGhpcy5vbkNvcHlBc05ld0NsaWNrKCk7XG5cblx0XHRcdH0gKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHQkdGhpcy5zZXRFcnJvclRpcHMoIHJlc3VsdCApO1xuXHRcdFx0JHRoaXMuc2V0RXJyb3JNZW51KCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gb25TYXZlQW5kTmV4dFJlc3VsdCggcmVzdWx0ICkge1xuXHQvLyBcdHZhciAkdGhpcyA9IHRoaXM7XG5cdC8vIFx0aWYgKCByZXN1bHQuaXNWYWxpZCgpICkge1xuXHQvLyBcdFx0dmFyIHJlc3VsdF9kYXRhID0gcmVzdWx0LmdldFJlc3VsdCgpO1xuXHQvLyBcdFx0aWYgKCByZXN1bHRfZGF0YSA9PT0gdHJ1ZSApIHtcblx0Ly8gXHRcdFx0JHRoaXMucmVmcmVzaF9pZCA9ICR0aGlzLmN1cnJlbnRfZWRpdF9yZWNvcmQuaWQ7XG5cdC8vXG5cdC8vIFx0XHR9IGVsc2UgaWYgKCBUVFVVSUQuaXNVVUlEKCByZXN1bHRfZGF0YSApICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC56ZXJvX2lkICYmIHJlc3VsdF9kYXRhICE9IFRUVVVJRC5ub3RfZXhpc3RfaWQgKSB7XG5cdC8vIFx0XHRcdCR0aGlzLnJlZnJlc2hfaWQgPSByZXN1bHRfZGF0YTtcblx0Ly8gXHRcdH1cblx0Ly9cblx0Ly8gXHRcdCR0aGlzLnNhdmVJbnNpZGVFZGl0b3JEYXRhKCBmdW5jdGlvbigpIHtcblx0Ly8gXHRcdFx0JHRoaXMub25SaWdodEFycm93Q2xpY2soKTtcblx0Ly8gXHRcdFx0JHRoaXMuc2VhcmNoKCBmYWxzZSApO1xuXHQvLyBcdFx0XHQkdGhpcy5vblNhdmVBbmROZXh0RG9uZSggcmVzdWx0ICk7XG5cdC8vXG5cdC8vIFx0XHR9ICk7XG5cdC8vXG5cdC8vIFx0fSBlbHNlIHtcblx0Ly8gXHRcdCR0aGlzLnNldEVycm9yVGlwcyggcmVzdWx0ICk7XG5cdC8vIFx0XHQkdGhpcy5zZXRFcnJvck1lbnUoKTtcblx0Ly8gXHR9XG5cdC8vIH0sXG5cblx0c2F2ZUluc2lkZUVkaXRvckRhdGEoIGNhbGxCYWNrICkge1xuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cdFx0dmFyIGRhdGEgPSB0aGlzLmVkaXRvci5nZXRWYWx1ZSgpO1xuXHRcdHZhciBmaWxlcyA9IGRhdGEubGVuZ3RoO1xuXHRcdGlmICggZmlsZXMgPiAwICkge1xuXHRcdFx0dmFyIHN1Y2Nlc3MgPSAwO1xuXHRcdFx0Zm9yICggdmFyIGtleSBpbiBkYXRhICkge1xuXHRcdFx0XHR2YXIgZmlsZUl0ZW0gPSBkYXRhW2tleV07XG5cdFx0XHRcdGlmICggR2xvYmFsLmlzU2V0KCBmaWxlSXRlbS5maWxlICkgKSB7XG5cblx0XHRcdFx0XHR2YXIgZG9jdW1lbnRfcmV2aXNpb25faWQgPSB0aGlzLmFwaS5hZGRBdHRhY2htZW50KCBmaWxlSXRlbS5uYW1lLCB0aGlzLmRvY3VtZW50X29iamVjdF90eXBlX2lkLCB0aGlzLnJlZnJlc2hfaWQsIHsgYXN5bmM6IGZhbHNlIH0gKS5nZXRSZXN1bHQoKTtcblx0XHRcdFx0XHQkdGhpcy5hcGkudXBsb2FkRmlsZSggZmlsZUl0ZW0uZmlsZSwgJ29iamVjdF90eXBlPWRvY3VtZW50X3JldmlzaW9uJm9iamVjdF9pZD0nICsgZG9jdW1lbnRfcmV2aXNpb25faWQgKyAnJnBhcmVudF9vYmplY3RfdHlwZV9pZD0nICsgJHRoaXMuZG9jdW1lbnRfb2JqZWN0X3R5cGVfaWQsIHt9ICk7XG5cblx0XHRcdFx0XHRzdWNjZXNzKys7XG5cblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjYWxsQmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3VjY2VzcyA9PT0gZmlsZXMgKSB7XG5cdFx0XHRcdGNhbGxCYWNrKCk7XG5cdFx0XHR9XG5cblx0XHR9IGVsc2Uge1xuXHRcdFx0Y2FsbEJhY2soKTtcblx0XHR9XG5cdH1cblxuXHR1cGxvYWRGaWxlKCBkb2N1bWVudF9yZXN1bHQsIGZpbGVfZGF0YSApIHtcblx0XHR2YXIgZG9jdW1lbnRfcmV2aXNpb25faWQgPSBkb2N1bWVudF9yZXN1bHQuZ2V0UmVzdWx0KCk7XG5cdFx0dmFyICR0aGlzID0gdGhpcztcblxuXHRcdCR0aGlzLmFwaS51cGxvYWRGaWxlKCBmaWxlX2RhdGEsICdvYmplY3RfdHlwZT1kb2N1bWVudF9yZXZpc2lvbiZvYmplY3RfaWQ9JyArIGRvY3VtZW50X3JldmlzaW9uX2lkLCB7XG5cdFx0XHRvblJlc3VsdDogZnVuY3Rpb24oIHVwbG9hZF9maWxlX3Jlc3VsdCApIHtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cblxuXHRidWlsZEVkaXRWaWV3VUkoKSB7XG5cblx0XHRzdXBlci5idWlsZEVkaXRWaWV3VUkoKTtcblxuXHRcdHZhciAkdGhpcyA9IHRoaXM7XG5cblx0XHR2YXIgdGFiX21vZGVsID0ge1xuXHRcdFx0J3RhYl9leHBlbnNlJzoge1xuXHRcdFx0XHQnbGFiZWwnOiAkLmkxOG4uXyggJ0V4cGVuc2UnICksXG5cdFx0XHRcdCdodG1sX3RlbXBsYXRlJzogdGhpcy5nZXRVc2VyRXhwZW5zZVRhYkh0bWwoKSxcblx0XHRcdFx0J2lzX211bHRpX2NvbHVtbic6IHRydWVcblx0XHRcdH0sXG5cdFx0XHQndGFiX2F0dGFjaG1lbnQnOiB0cnVlLFxuXHRcdFx0J3RhYl9hdWRpdCc6IHRydWUsXG5cdFx0fTtcblx0XHR0aGlzLnNldFRhYk1vZGVsKCB0YWJfbW9kZWwgKTtcblxuXHRcdHRoaXMubmF2aWdhdGlvbi5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlckV4cGVuc2UsXG5cdFx0XHRpZDogdGhpcy5zY3JpcHRfbmFtZSArICdfbmF2aWdhdGlvbicsXG5cdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0bGF5b3V0X25hbWU6ICdnbG9iYWxfZXhwZW5zZScsXG5cdFx0XHRuYXZpZ2F0aW9uX21vZGU6IHRydWUsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWVcblx0XHR9ICk7XG5cblx0XHR0aGlzLnNldE5hdmlnYXRpb24oKTtcblxuXHRcdC8vVGFiIDAgc3RhcnRcblxuXHRcdHZhciB0YWJfZXhwZW5zZSA9IHRoaXMuZWRpdF92aWV3X3RhYi5maW5kKCAnI3RhYl9leHBlbnNlJyApO1xuXG5cdFx0dmFyIHRhYl9leHBlbnNlX2NvbHVtbjEgPSB0YWJfZXhwZW5zZS5maW5kKCAnLmZpcnN0LWNvbHVtbicgKTtcblx0XHR2YXIgdGFiX2V4cGVuc2VfY29sdW1uMiA9IHRhYl9leHBlbnNlLmZpbmQoICcuc2Vjb25kLWNvbHVtbicgKTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0gPSBbXTtcblxuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX2V4cGVuc2VfY29sdW1uMSApO1xuXHRcdHRoaXMuZWRpdF92aWV3X3RhYnNbMF0ucHVzaCggdGFiX2V4cGVuc2VfY29sdW1uMiApO1xuXG5cdFx0dmFyIGZvcm1faXRlbV9pbnB1dDtcblx0XHR2YXIgd2lkZ2V0Q29udGFpbmVyO1xuXHRcdHZhciBsYWJlbDtcblxuXHRcdC8vIEVtcGxveWVlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJVXNlcixcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF91c2VyJyxcblx0XHRcdGZpZWxkOiAndXNlcl9pZCcsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWVcblx0XHR9ICk7XG5cblx0XHR2YXIgZGVmYXVsdF9hcmdzID0ge307XG5cdFx0ZGVmYXVsdF9hcmdzLnBlcm1pc3Npb25fc2VjdGlvbiA9ICd1c2VyX2V4cGVuc2UnO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5zZXREZWZhdWx0QXJncyggZGVmYXVsdF9hcmdzICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFbXBsb3llZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xLCAnJyApO1xuXG5cdFx0Ly8gRWZmZWN0aXZlIERhdGVcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkRBVEVfUElDS0VSICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVERhdGVQaWNrZXIoIHsgZmllbGQ6ICdlZmZlY3RpdmVfZGF0ZScgfSApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdFZmZlY3RpdmUgRGF0ZScgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xLCAnJywgbnVsbCApO1xuXG5cdFx0Ly8gRGF0ZSBJbmN1cnJlZFxuXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5EQVRFX1BJQ0tFUiApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlREYXRlUGlja2VyKCB7IGZpZWxkOiAnaW5jdXJyZWRfZGF0ZScgfSApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEYXRlIEluY3VycmVkJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjEsICcnLCBudWxsICk7XG5cblx0XHQvLyBEZXNjcmlwdGlvblxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9BUkVBICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0QXJlYSggeyBmaWVsZDogJ2Rlc2NyaXB0aW9uJywgd2lkdGg6ICcxMDAlJyB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdEZXNjcmlwdGlvbicgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xLCAnJywgbnVsbCwgbnVsbCwgdHJ1ZSApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LnBhcmVudCgpLndpZHRoKCAnNDUlJyApO1xuXG5cdFx0Ly8gUGF5bWVudCBNZXRob2Rcblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkNPTUJPX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRDb21ib0JveCggeyBmaWVsZDogJ3BheW1lbnRfbWV0aG9kX2lkJywgc2V0X2VtcHR5OiBmYWxzZSB9ICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LnNldFNvdXJjZURhdGEoICR0aGlzLnBheW1lbnRfbWV0aG9kX2FycmF5ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdQYXltZW50IE1ldGhvZCcgKSwgZm9ybV9pdGVtX2lucHV0LCB0YWJfZXhwZW5zZV9jb2x1bW4xICk7XG5cblx0XHQvLyBUeXBlXG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJRXhwZW5zZVBvbGljeSxcblx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9leHBlbnNlX3BvbGljeScsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2V4cGVuc2VfcG9saWN5X2lkJyxcblx0XHRcdGFsd2F5c19pbmNsdWRlX2NvbHVtbnM6IFsndHlwZV9pZCcsICd1bml0X25hbWUnXSxcblx0XHRcdGluaXRfZGF0YV9pbW1lZGlhdGVseTogdHJ1ZSxcblx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoIGZ1bmN0aW9uKCB2YWwgKSB7XG5cdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdCR0aGlzLm9uRXhwZW5zZVBvbGljeUNoYW5nZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9ICksXG5cdFx0fSApO1xuXG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUeXBlJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjEgKTtcblxuXHRcdC8vQW1vdW50XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0Zm9ybV9pdGVtX2lucHV0LlRUZXh0SW5wdXQoIHsgZmllbGQ6ICdncm9zc19hbW91bnQxJyB9ICk7XG5cblx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3ggXFwnPjwvZGl2PicgKTtcblx0XHRsYWJlbCA9ICQoICc8c3BhbiBjbGFzcz1cXCd3aWRnZXQtcmlnaHQtbGFiZWxcXCc+ICcgKyAkLmkxOG4uXyggJ1JlaW1idXJzZScgKSArICc6IDwvc3Bhbj4nICk7XG5cblx0XHR2YXIgd2lkZ2V0X2NoZWNrYm94ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5DSEVDS0JPWCApO1xuXHRcdHdpZGdldF9jaGVja2JveC5UQ2hlY2tib3goIHsgZmllbGQ6ICdpc19yZWltYnVyc2FibGUnIH0gKTtcblxuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGZvcm1faXRlbV9pbnB1dCApO1xuXHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGxhYmVsICk7XG5cdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggd2lkZ2V0X2NoZWNrYm94ICk7XG5cblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0Ftb3VudCcgKSwgW2Zvcm1faXRlbV9pbnB1dCwgd2lkZ2V0X2NoZWNrYm94XSwgdGFiX2V4cGVuc2VfY29sdW1uMSwgJ2xhc3QnLCB3aWRnZXRDb250YWluZXIgKTtcblxuXHRcdC8vIEN1cnJlbmN5XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQgPSBHbG9iYWwubG9hZFdpZGdldEJ5TmFtZSggRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUN1cnJlbmN5LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2N1cnJlbmN5Jyxcblx0XHRcdHNob3dfc2VhcmNoX2lucHV0czogdHJ1ZSxcblx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdGZpZWxkOiAnY3VycmVuY3lfaWQnXG5cdFx0fSApO1xuXHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnQ3VycmVuY3knICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMiwgJycgKTtcblxuXHRcdC8vIEJyYW5jaFxuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdGZvcm1faXRlbV9pbnB1dC5BQ29tYm9Cb3goIHtcblx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJQnJhbmNoLFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2JyYW5jaCcsXG5cdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRmaWVsZDogJ2JyYW5jaF9pZCdcblx0XHR9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdCcmFuY2gnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMiApO1xuXG5cdFx0Ly9EZXBhcnRtZW50XG5cdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElEZXBhcnRtZW50LFxuXHRcdFx0YWxsb3dfbXVsdGlwbGVfc2VsZWN0aW9uOiBmYWxzZSxcblx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2RlcGFydG1lbnQnLFxuXHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0c2V0X2VtcHR5OiB0cnVlLFxuXHRcdFx0ZmllbGQ6ICdkZXBhcnRtZW50X2lkJ1xuXHRcdH0gKTtcblx0XHR0aGlzLmFkZEVkaXRGaWVsZFRvQ29sdW1uKCAkLmkxOG4uXyggJ0RlcGFydG1lbnQnICksIGZvcm1faXRlbV9pbnB1dCwgdGFiX2V4cGVuc2VfY29sdW1uMiApO1xuXG5cdFx0aWYgKCAoIEdsb2JhbC5nZXRQcm9kdWN0RWRpdGlvbigpID49IDIwICkgKSB7XG5cdFx0XHQvL0pvYlxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0ID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWCApO1xuXG5cdFx0XHRmb3JtX2l0ZW1faW5wdXQuQUNvbWJvQm94KCB7XG5cdFx0XHRcdGFwaV9jbGFzczogVFRBUEkuQVBJSm9iLFxuXHRcdFx0XHRhbGxvd19tdWx0aXBsZV9zZWxlY3Rpb246IGZhbHNlLFxuXHRcdFx0XHRsYXlvdXRfbmFtZTogJ2dsb2JhbF9qb2InLFxuXHRcdFx0XHRzaG93X3NlYXJjaF9pbnB1dHM6IHRydWUsXG5cdFx0XHRcdHNldF9lbXB0eTogdHJ1ZSxcblx0XHRcdFx0c2V0UmVhbFZhbHVlQ2FsbEJhY2s6ICggZnVuY3Rpb24oIHZhbCApIHtcblxuXHRcdFx0XHRcdGlmICggdmFsICkge1xuXHRcdFx0XHRcdFx0am9iX2NvZGVyLnNldFZhbHVlKCB2YWwubWFudWFsX2lkICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGZpZWxkOiAnam9iX2lkJ1xuXHRcdFx0fSApO1xuXG5cdFx0XHR3aWRnZXRDb250YWluZXIgPSAkKCAnPGRpdiBjbGFzcz1cXCd3aWRnZXQtaC1ib3hcXCc+PC9kaXY+JyApO1xuXG5cdFx0XHR2YXIgam9iX2NvZGVyID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5URVhUX0lOUFVUICk7XG5cdFx0XHRqb2JfY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ2pvYl9xdWlja19zZWFyY2gnLCBkaXNhYmxlX2tleXVwX2V2ZW50OiB0cnVlIH0gKTtcblx0XHRcdGpvYl9jb2Rlci5hZGRDbGFzcyggJ2pvYi1jb2RlcicgKTtcblxuXHRcdFx0d2lkZ2V0Q29udGFpbmVyLmFwcGVuZCggam9iX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnSm9iJyApLCBbZm9ybV9pdGVtX2lucHV0LCBqb2JfY29kZXJdLCB0YWJfZXhwZW5zZV9jb2x1bW4yLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cblx0XHRcdC8vSm9iIEl0ZW1cblx0XHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuQVdFU09NRV9CT1ggKTtcblxuXHRcdFx0Zm9ybV9pdGVtX2lucHV0LkFDb21ib0JveCgge1xuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSUpvYkl0ZW0sXG5cdFx0XHRcdGFsbG93X211bHRpcGxlX3NlbGVjdGlvbjogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2pvYl9pdGVtJyxcblx0XHRcdFx0c2hvd19zZWFyY2hfaW5wdXRzOiB0cnVlLFxuXHRcdFx0XHRzZXRfZW1wdHk6IHRydWUsXG5cdFx0XHRcdHNldFJlYWxWYWx1ZUNhbGxCYWNrOiAoIGZ1bmN0aW9uKCB2YWwgKSB7XG5cblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGpvYl9pdGVtX2NvZGVyLnNldFZhbHVlKCB2YWwubWFudWFsX2lkICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9ICksXG5cdFx0XHRcdGZpZWxkOiAnam9iX2l0ZW1faWQnXG5cdFx0XHR9ICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lciA9ICQoICc8ZGl2IGNsYXNzPVxcJ3dpZGdldC1oLWJveFxcJz48L2Rpdj4nICk7XG5cblx0XHRcdHZhciBqb2JfaXRlbV9jb2RlciA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEVYVF9JTlBVVCApO1xuXHRcdFx0am9iX2l0ZW1fY29kZXIuVFRleHRJbnB1dCggeyBmaWVsZDogJ2pvYl9pdGVtX3F1aWNrX3NlYXJjaCcsIGRpc2FibGVfa2V5dXBfZXZlbnQ6IHRydWUgfSApO1xuXHRcdFx0am9iX2l0ZW1fY29kZXIuYWRkQ2xhc3MoICdqb2ItY29kZXInICk7XG5cblx0XHRcdHdpZGdldENvbnRhaW5lci5hcHBlbmQoIGpvYl9pdGVtX2NvZGVyICk7XG5cdFx0XHR3aWRnZXRDb250YWluZXIuYXBwZW5kKCBmb3JtX2l0ZW1faW5wdXQgKTtcblx0XHRcdHRoaXMuYWRkRWRpdEZpZWxkVG9Db2x1bW4oICQuaTE4bi5fKCAnVGFzaycgKSwgW2Zvcm1faXRlbV9pbnB1dCwgam9iX2l0ZW1fY29kZXJdLCB0YWJfZXhwZW5zZV9jb2x1bW4yLCAnJywgd2lkZ2V0Q29udGFpbmVyLCB0cnVlICk7XG5cdFx0fVxuXHRcdC8vVGFnc1xuXHRcdGZvcm1faXRlbV9pbnB1dCA9IEdsb2JhbC5sb2FkV2lkZ2V0QnlOYW1lKCBGb3JtSXRlbVR5cGUuVEFHX0lOUFVUICk7XG5cblx0XHRmb3JtX2l0ZW1faW5wdXQuVFRhZ0lucHV0KCB7IGZpZWxkOiAndGFnJywgb2JqZWN0X3R5cGVfaWQ6IDkzMCB9ICk7XG5cdFx0dGhpcy5hZGRFZGl0RmllbGRUb0NvbHVtbiggJC5pMThuLl8oICdUYWdzJyApLCBmb3JtX2l0ZW1faW5wdXQsIHRhYl9leHBlbnNlX2NvbHVtbjIsICcnLCBudWxsLCBudWxsLCB0cnVlICk7XG5cblx0XHQvL0luc2lkZSBlZGl0b3JcblxuXHRcdHZhciBpbnNpZGVfZWRpdG9yX2RpdiA9IHRhYl9leHBlbnNlLmZpbmQoICcuaW5zaWRlLWVkaXRvci1kaXYnICk7XG5cblx0XHR2YXIgaW5zaWRlX2VkaXRvcl9hcmdzID0ge1xuXHRcdFx0bmFtZTogJC5pMThuLl8oICdBdHRhY2htZW50IE5hbWUnICksXG5cdFx0XHRhY3Rpb246ICQuaTE4bi5fKCAnQWN0aW9uJyApXG5cdFx0fTtcblxuXHRcdHRoaXMuZWRpdG9yID0gR2xvYmFsLmxvYWRXaWRnZXRCeU5hbWUoIEZvcm1JdGVtVHlwZS5JTlNJREVfRURJVE9SICk7XG5cdFx0dGhpcy5lZGl0b3IuSW5zaWRlRWRpdG9yKCB7XG5cdFx0XHRhZGRSb3c6IHRoaXMuaW5zaWRlRWRpdG9yQWRkUm93LFxuXHRcdFx0cmVtb3ZlUm93OiB0aGlzLmluc2lkZUVkaXRvclJlbW92ZVJvdyxcblx0XHRcdGdldFZhbHVlOiB0aGlzLmluc2lkZUVkaXRvckdldFZhbHVlLFxuXHRcdFx0c2V0VmFsdWU6IHRoaXMuaW5zaWRlRWRpdG9yU2V0VmFsdWUsXG5cdFx0XHRwYXJlbnRfY29udHJvbGxlcjogdGhpcyxcblx0XHRcdGFwaTogdGhpcy5kb2N1bWVudF9hcGksXG5cdFx0XHRyZW5kZXI6IGdldFJlbmRlcigpLFxuXHRcdFx0cmVuZGVyX2FyZ3M6IGluc2lkZV9lZGl0b3JfYXJncyxcblx0XHRcdHJlbmRlcl9pbmxpbmVfaHRtbDogdHJ1ZSxcblx0XHRcdHJvd19yZW5kZXI6IGdldFJvd1JlbmRlcigpXG5cblx0XHR9ICk7XG5cblx0XHRmdW5jdGlvbiBnZXRSZW5kZXIoKSB7XG5cdFx0XHRyZXR1cm4gYFxuXHRcdFx0PHRhYmxlIGNsYXNzPVwiaW5zaWRlLWVkaXRvci1yZW5kZXJcIj5cblx0XHRcdFx0PHRyIGNsYXNzPVwidGl0bGVcIiBzdHlsZT1cImZvbnQtd2VpZ2h0OiBib2xkXCI+XG5cdFx0XHRcdFx0PHRkIHN0eWxlPVwid2lkdGg6IDQwMHB4XCI+PCU9IG5hbWUgJT48L3RkPlxuXHRcdFx0XHRcdDx0ZCBzdHlsZT1cIndpZHRoOiAzMDBweFwiPjwlPSBhY3Rpb24gJT48L3RkPlxuXHRcdFx0XHQ8L3RyPlxuXHRcdFx0PC90YWJsZT5gO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGdldFJvd1JlbmRlcigpIHtcblx0XHRcdHJldHVybiBgXG5cdFx0XHQ8dHIgY2xhc3M9XCJpbnNpZGUtZWRpdG9yLXJvdyBkYXRhLXJvd1wiPlxuXHRcdFx0XHQ8dGQ+PC90ZD5cblx0XHRcdFx0PHRkPjwvdGQ+XG5cdFx0XHRcdDx0ZCBjbGFzcz1cImNlbGwgY29udHJvbC1pY29uXCI+XG5cdFx0XHRcdFx0PGJ1dHRvbiBjbGFzcz1cInBsdXMtaWNvblwiIG9uY2xpY2s9XCJcIj48L2J1dHRvbj5cblx0XHRcdFx0PC90ZD5cblx0XHRcdFx0PHRkIGNsYXNzPVwiY2VsbCBjb250cm9sLWljb25cIj5cblx0XHRcdFx0XHQ8YnV0dG9uIGNsYXNzPVwibWludXMtaWNvbiBcIiBvbmNsaWNrPVwiXCI+PC9idXR0b24+XG5cdFx0XHRcdDwvdGQ+XG5cdFx0XHQ8L3RyPmA7XG5cdFx0fVxuXG5cdFx0aW5zaWRlX2VkaXRvcl9kaXYuYXBwZW5kKCB0aGlzLmVkaXRvciApO1xuXHR9XG5cblx0YnVpbGRTZWFyY2hGaWVsZHMoKSB7XG5cblx0XHRzdXBlci5idWlsZFNlYXJjaEZpZWxkcygpO1xuXHRcdHZhciBkZWZhdWx0X2FyZ3MgPSB7fTtcblx0XHRkZWZhdWx0X2FyZ3MucGVybWlzc2lvbl9zZWN0aW9uID0gJ3VzZXJfZXhwZW5zZSc7XG5cdFx0dGhpcy5zZWFyY2hfZmllbGRzID0gW1xuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnRW1wbG95ZWUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0ZmllbGQ6ICd1c2VyX2lkJyxcblx0XHRcdFx0ZGVmYXVsdF9hcmdzOiBkZWZhdWx0X2FyZ3MsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX3VzZXInLFxuXHRcdFx0XHRhcGlfY2xhc3M6IFRUQVBJLkFQSVVzZXIsXG5cdFx0XHRcdG11bHRpcGxlOiB0cnVlLFxuXHRcdFx0XHRiYXNpY19zZWFyY2g6IHRydWUsXG5cdFx0XHRcdGFkdl9zZWFyY2g6IGZhbHNlLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9ICksXG5cblx0XHRcdG5ldyBTZWFyY2hGaWVsZCgge1xuXHRcdFx0XHRsYWJlbDogJC5pMThuLl8oICdUYWdzJyApLFxuXHRcdFx0XHRmaWVsZDogJ3RhZycsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGluX2NvbHVtbjogMSxcblx0XHRcdFx0b2JqZWN0X3R5cGVfaWQ6IDkzMCxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5UQUdfSU5QVVRcblx0XHRcdH0gKSxcblxuXHRcdFx0bmV3IFNlYXJjaEZpZWxkKCB7XG5cdFx0XHRcdGxhYmVsOiAkLmkxOG4uXyggJ1R5cGUnICksXG5cdFx0XHRcdGluX2NvbHVtbjogMixcblx0XHRcdFx0ZmllbGQ6ICdleHBlbnNlX3BvbGljeV9pZCcsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX2V4cGVuc2VfcG9saWN5Jyxcblx0XHRcdFx0YXBpX2NsYXNzOiBUVEFQSS5BUElFeHBlbnNlUG9saWN5LFxuXHRcdFx0XHRtdWx0aXBsZTogdHJ1ZSxcblx0XHRcdFx0YmFzaWNfc2VhcmNoOiB0cnVlLFxuXHRcdFx0XHRhZHZfc2VhcmNoOiBmYWxzZSxcblx0XHRcdFx0Zm9ybV9pdGVtX3R5cGU6IEZvcm1JdGVtVHlwZS5BV0VTT01FX0JPWFxuXHRcdFx0fSApLFxuXG5cdFx0XHRuZXcgU2VhcmNoRmllbGQoIHtcblx0XHRcdFx0bGFiZWw6ICQuaTE4bi5fKCAnU3RhdHVzJyApLFxuXHRcdFx0XHRpbl9jb2x1bW46IDIsXG5cdFx0XHRcdGZpZWxkOiAnc3RhdHVzX2lkJyxcblx0XHRcdFx0bXVsdGlwbGU6IHRydWUsXG5cdFx0XHRcdGJhc2ljX3NlYXJjaDogdHJ1ZSxcblx0XHRcdFx0YWR2X3NlYXJjaDogZmFsc2UsXG5cdFx0XHRcdGxheW91dF9uYW1lOiAnZ2xvYmFsX29wdGlvbl9jb2x1bW4nLFxuXHRcdFx0XHRmb3JtX2l0ZW1fdHlwZTogRm9ybUl0ZW1UeXBlLkFXRVNPTUVfQk9YXG5cdFx0XHR9IClcblx0XHRdO1xuXG5cdH1cblxuXHRnZXRVc2VyRXhwZW5zZVRhYkh0bWwoKSB7XG5cdFx0cmV0dXJuIGA8ZGl2IGlkPVwidGFiX2V4cGVuc2VcIiBjbGFzcz1cImVkaXQtdmlldy10YWItb3V0c2lkZVwiPlxuXHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJlZGl0LXZpZXctdGFiXCIgaWQ9XCJ0YWJfZXhwZW5zZV9jb250ZW50X2RpdlwiPlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImZpcnN0LWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cInNlY29uZC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJ0aGlyZC1jb2x1bW4gZnVsbC13aWR0aC1jb2x1bW5cIj48L2Rpdj5cblx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpbnNpZGUtZWRpdG9yLWRpdiBmdWxsLXdpZHRoLWNvbHVtblwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImF1dGhvcml6YXRpb24tZ3JpZC1kaXYgaW5zaWRlLWdyaWQgZnVsbC13aWR0aC1jb2x1bW5cIj5cblx0XHRcdFx0XHRcdFx0PGRpdiBjbGFzcz1cImdyaWQtdG9wLWJvcmRlclwiPjwvZGl2PlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZ3JpZC10aXRsZSBzZXBhcmF0ZWQtYm94XCI+PC9kaXY+XG5cdFx0XHRcdFx0XHRcdDx0YWJsZSBpZD1cImdyaWRcIj48L3RhYmxlPlxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiYm90dG9tLWRpdlwiPlxuXHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJncmlkLWJvdHRvbS1ib3JkZXJcIj48L2Rpdj5cblx0XHRcdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0PC9kaXY+YDtcblx0fVxufVxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///3434\n")}}]); |