{"version":3,"file":"dialog.min.js","sources":["../../../apps/frappe/frappe/public/js/frappe/dom.js","../../../apps/frappe/frappe/public/js/frappe/form/formatters.js","../../../apps/frappe/frappe/public/js/frappe/class.js","../../../apps/frappe/frappe/public/js/frappe/form/layout.js","../../../apps/frappe/frappe/public/js/frappe/ui/field_group.js","../../../apps/frappe/frappe/public/js/frappe/form/link_selector.js","../../../apps/frappe/frappe/public/js/frappe/form/multi_select_dialog.js","../../../apps/frappe/frappe/public/js/frappe/ui/dialog.js"],"sourcesContent":["// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors\n// MIT License. See license.txt\n\n// add a new dom element\nfrappe.provide('frappe.dom');\n\nfrappe.dom = {\n\tid_count: 0,\n\tfreeze_count: 0,\n\tby_id: function(id) {\n\t\treturn document.getElementById(id);\n\t},\n\tget_unique_id: function() {\n\t\tconst id = 'unique-' + frappe.dom.id_count;\n\t\tfrappe.dom.id_count++;\n\t\treturn id;\n\t},\n\tset_unique_id: function(ele) {\n\t\tvar $ele = $(ele);\n\t\tif($ele.attr('id')) {\n\t\t\treturn $ele.attr('id');\n\t\t}\n\t\tvar id = 'unique-' + frappe.dom.id_count;\n\t\t$ele.attr('id', id);\n\t\tfrappe.dom.id_count++;\n\t\treturn id;\n\t},\n\teval: function(txt) {\n\t\tif(!txt) return;\n\t\tvar el = document.createElement('script');\n\t\tel.appendChild(document.createTextNode(txt));\n\t\t// execute the script globally\n\t\tdocument.getElementsByTagName('head')[0].appendChild(el);\n\t},\n\tremove_script_and_style: function(txt) {\n\t\tconst evil_tags = [\"script\", \"style\", \"noscript\", \"title\", \"meta\", \"base\", \"head\"];\n\t\tconst regex = new RegExp(evil_tags.map(tag => `<${tag}>.*<\\\\/${tag}>`).join('|'), 's');\n\t\tif (!regex.test(txt)) {\n\t\t\t// no evil tags found, skip the DOM method entirely!\n\t\t\treturn txt;\n\t\t}\n\n\t\tvar div = document.createElement('div');\n\t\tdiv.innerHTML = txt;\n\t\tvar found = false;\n\t\tevil_tags.forEach(function(e) {\n\t\t\tvar elements = div.getElementsByTagName(e);\n\t\t\ti = elements.length;\n\t\t\twhile (i--) {\n\t\t\t\tfound = true;\n\t\t\t\telements[i].parentNode.removeChild(elements[i]);\n\t\t\t}\n\t\t});\n\n\t\t// remove links with rel=\"stylesheet\"\n\t\tvar elements = div.getElementsByTagName('link');\n\t\tvar i = elements.length;\n\t\twhile (i--) {\n\t\t\tif (elements[i].getAttribute(\"rel\")==\"stylesheet\"){\n\t\t\t\tfound = true;\n\t\t\t\telements[i].parentNode.removeChild(elements[i]);\n\t\t\t}\n\t\t}\n\t\tif(found) {\n\t\t\treturn div.innerHTML;\n\t\t} else {\n\t\t\t// don't disturb\n\t\t\treturn txt;\n\t\t}\n\t},\n\tis_element_in_viewport: function (el, tolerance=0) {\n\n\t\t//special bonus for those using jQuery\n\t\tif (typeof jQuery === \"function\" && el instanceof jQuery) {\n\t\t\tel = el[0];\n\t\t}\n\n\t\tvar rect = el.getBoundingClientRect();\n\n\t\treturn (\n\t\t\trect.top + tolerance >= 0\n\t\t\t&& rect.left + tolerance >= 0\n\t\t\t&& rect.bottom - tolerance <= $(window).height()\n\t\t\t&& rect.right - tolerance <= $(window).width()\n\t\t);\n\t},\n\n\tis_element_in_modal(element) {\n\t\treturn Boolean($(element).parents('.modal').length);\n\t},\n\n\tset_style: function(txt, id) {\n\t\tif(!txt) return;\n\n\t\tvar se = document.createElement('style');\n\t\tse.type = \"text/css\";\n\n\t\tif (id) {\n\t\t\tvar element = document.getElementById(id);\n\t\t\tif (element) {\n\t\t\t\telement.parentNode.removeChild(element);\n\t\t\t}\n\t\t\tse.id = id;\n\t\t}\n\n\t\tif (se.styleSheet) {\n\t\t\tse.styleSheet.cssText = txt;\n\t\t} else {\n\t\t\tse.appendChild(document.createTextNode(txt));\n\t\t}\n\t\tdocument.getElementsByTagName('head')[0].appendChild(se);\n\t\treturn se;\n\t},\n\tadd: function(parent, newtag, className, cs, innerHTML, onclick) {\n\t\tif(parent && parent.substr)parent = frappe.dom.by_id(parent);\n\t\tvar c = document.createElement(newtag);\n\t\tif(parent)\n\t\t\tparent.appendChild(c);\n\n\t\t// if image, 3rd parameter is source\n\t\tif(className) {\n\t\t\tif(newtag.toLowerCase()=='img')\n\t\t\t\tc.src = className\n\t\t\telse\n\t\t\t\tc.className = className;\n\t\t}\n\t\tif(cs) frappe.dom.css(c,cs);\n\t\tif(innerHTML) c.innerHTML = innerHTML;\n\t\tif(onclick) c.onclick = onclick;\n\t\treturn c;\n\t},\n\tcss: function(ele, s) {\n\t\tif(ele && s) {\n\t\t\t$.extend(ele.style, s);\n\t\t}\n\t\treturn ele;\n\t},\n\tactivate: function($parent, $child, common_class, active_class='active') {\n\t\t$parent.find(`.${common_class}.${active_class}`)\n\t\t\t.removeClass(active_class);\n\t\t$child.addClass(active_class);\n\t},\n\tfreeze: function(msg, css_class) {\n\t\t// blur\n\t\tif (!$('#freeze').length) {\n\t\t\tvar freeze = $('
')\n\t\t\t\t.on(\"click\", function() {\n\t\t\t\t\tif (cur_frm && cur_frm.cur_grid) {\n\t\t\t\t\t\tcur_frm.cur_grid.toggle_view();\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.appendTo(\"#body\");\n\n\t\t\tfreeze.html(repl('

%(msg)s

',\n\t\t\t\t{msg: msg || \"\"}));\n\n\t\t\tsetTimeout(function() { freeze.addClass(\"in\") }, 1);\n\n\t\t} else {\n\t\t\t$(\"#freeze\").addClass(\"in\");\n\t\t}\n\n\t\tif (css_class) {\n\t\t\t$(\"#freeze\").addClass(css_class);\n\t\t}\n\n\t\tfrappe.dom.freeze_count++;\n\t},\n\tunfreeze: function() {\n\t\tif(!frappe.dom.freeze_count) return; // anything open?\n\t\tfrappe.dom.freeze_count--;\n\t\tif(!frappe.dom.freeze_count) {\n\t\t\tvar freeze = $('#freeze').removeClass(\"in\").remove();\n\t\t}\n\t},\n\tsave_selection: function() {\n\t\t// via http://stackoverflow.com/questions/5605401/insert-link-in-contenteditable-element\n\t\tif (window.getSelection) {\n\t\t\tvar sel = window.getSelection();\n\t\t\tif (sel.getRangeAt && sel.rangeCount) {\n\t\t\t\tvar ranges = [];\n\t\t\t\tfor (var i = 0, len = sel.rangeCount; i < len; ++i) {\n\t\t\t\t\tranges.push(sel.getRangeAt(i));\n\t\t\t\t}\n\t\t\t\treturn ranges;\n\t\t\t}\n\t\t} else if (document.selection && document.selection.createRange) {\n\t\t\treturn document.selection.createRange();\n\t\t}\n\t\treturn null;\n\t},\n\trestore_selection: function(savedSel) {\n\t\tif (savedSel) {\n\t\t\tif (window.getSelection) {\n\t\t\t\tvar sel = window.getSelection();\n\t\t\t\tsel.removeAllRanges();\n\t\t\t\tfor (var i = 0, len = savedSel.length; i < len; ++i) {\n\t\t\t\t\tsel.addRange(savedSel[i]);\n\t\t\t\t}\n\t\t\t} else if (document.selection && savedSel.select) {\n\t\t\t\tsavedSel.select();\n\t\t\t}\n\t\t}\n\t},\n\tis_touchscreen: function() {\n\t\treturn ('ontouchstart' in window)\n\t},\n\thandle_broken_images(container) {\n\t\t$(container).find('img').on('error', (e) => {\n\t\t\tconst $img = $(e.currentTarget);\n\t\t\t$img.addClass('no-image');\n\t\t});\n\t},\n\tscroll_to_bottom(container) {\n\t\tconst $container = $(container);\n\t\t$container.scrollTop($container[0].scrollHeight);\n\t},\n\tfile_to_base64(file_obj) {\n\t\treturn new Promise(resolve => {\n\t\t\tconst reader = new FileReader();\n\t\t\treader.onload = function() {\n\t\t\t\tresolve(reader.result);\n\t\t\t};\n\t\t\treader.readAsDataURL(file_obj);\n\t\t});\n\t},\n\tscroll_to_section(section_name) {\n\t\tsetTimeout(() => {\n\t\t\tconst section = $(`a:contains(\"${section_name}\")`);\n\t\t\tif (section.length) {\n\t\t\t\tif(section.parent().hasClass('collapsed')) {\n\t\t\t\t\t// opens the section\n\t\t\t\t\tsection.click();\n\t\t\t\t}\n\t\t\t\tfrappe.ui.scroll(section.parent().parent());\n\t\t\t}\n\t\t}, 200);\n\t},\n\tpixel_to_inches(pixels) {\n\t\tconst div = $('
');\n\t\tdiv.appendTo(document.body);\n\n\t\tconst dpi_x = document.getElementById('dpi').offsetWidth;\n\t\tconst inches = pixels / dpi_x;\n\t\tdiv.remove();\n\n\t\treturn inches;\n\t}\n};\n\nfrappe.ellipsis = function(text, max) {\n\tif(!max) max = 20;\n\ttext = cstr(text);\n\tif(text.length > max) {\n\t\ttext = text.substr(0, max) + '...';\n\t}\n\treturn text;\n};\n\nfrappe.run_serially = function(tasks) {\n\tvar result = Promise.resolve();\n\ttasks.forEach(task => {\n\t\tif(task) {\n\t\t\tresult = result.then ? result.then(task) : Promise.resolve();\n\t\t}\n\t});\n\treturn result;\n};\n\nfrappe.load_image = (src, onload, onerror, preprocess = () => {}) => {\n\tvar tester = new Image();\n\ttester.onload = function() {\n\t\tonload(this);\n\t};\n\ttester.onerror = onerror;\n\n\tpreprocess(tester);\n\ttester.src = src;\n}\n\nfrappe.timeout = seconds => {\n\treturn new Promise((resolve) => {\n\t\tsetTimeout(() => resolve(), seconds * 1000);\n\t});\n};\n\nfrappe.scrub = function(text, spacer='_') {\n\treturn text.replace(/ /g, spacer).toLowerCase();\n};\n\nfrappe.unscrub = function(txt) {\n\treturn frappe.model.unscrub(txt);\n};\n\nfrappe.get_data_pill = (label, target_id=null, remove_action=null, image=null) => {\n\tlet data_pill_wrapper = $(`\n\t\t\n\t`);\n\n\tif (remove_action) {\n\t\tlet remove_btn = $(`\n\t\t\t\n\t\t\t\t${frappe.utils.icon('close', 'sm')}\n\t\t\t\n\t\t`).click(() => {\n\t\t\tremove_action(target_id || label, data_pill_wrapper);\n\t\t});\n\t\tdata_pill_wrapper.append(remove_btn);\n\t}\n\n\treturn data_pill_wrapper;\n};\n\nfrappe.get_modal = function(title, content) {\n\treturn $(`
\n\t\t
\n\t\t\t
\n\t\t\t\t
\n\t\t\t\t\t
\n\t\t\t\t\t\t\n\t\t\t\t\t\t

${title}

\n\t\t\t\t\t
\n\t\t\t\t\t
\n\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\t
${content}
\n\t\t\t\t\n\t\t\t
\n\t\t
\n\t
`);\n};\n\nfrappe.is_online = function() {\n\tif (frappe.boot.developer_mode == 1) {\n\t\t// always online in developer_mode\n\t\treturn true;\n\t}\n\tif ('onLine' in navigator) {\n\t\treturn navigator.onLine;\n\t}\n\treturn true;\n};\n\n// bind online/offline events\n$(window).on('online', function() {\n\tfrappe.show_alert({\n\t\tindicator: 'green',\n\t\tmessage: __('You are connected to internet.')\n\t});\n});\n\n$(window).on('offline', function() {\n\tfrappe.show_alert({\n\t\tindicator: 'orange',\n\t\tmessage: __('Connection lost. Some features might not work.')\n\t});\n});\n","// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors\n// MIT License. See license.txt\n\n// for license information please see license.txt\n\nfrappe.provide(\"frappe.form.formatters\");\n\nfrappe.form.link_formatters = {};\n\nfrappe.form.formatters = {\n\t_right: function(value, options) {\n\t\tif(options && (options.inline || options.only_value)) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn \"
\" + value + \"
\";\n\t\t}\n\t},\n\tData: function(value, df) {\n\t\tif (df && df.options == \"URL\") {\n\t\t\treturn `${value}`;\n\t\t}\n\t\treturn value==null ? \"\" : value;\n\t},\n\tSelect: function(value) {\n\t\treturn __(frappe.form.formatters[\"Data\"](value));\n\t},\n\tFloat: function(value, docfield, options, doc) {\n\t\t// don't allow 0 precision for Floats, hence or'ing with null\n\t\tvar precision = docfield.precision\n\t\t\t|| cint(frappe.boot.sysdefaults && frappe.boot.sysdefaults.float_precision)\n\t\t\t|| null;\n\t\tif (docfield.options && docfield.options.trim()) {\n\t\t\t// options points to a currency field, but expects precision of float!\n\t\t\tdocfield.precision = precision;\n\t\t\treturn frappe.form.formatters.Currency(value, docfield, options, doc);\n\n\t\t} else {\n\t\t\t// show 1.000000 as 1\n\t\t\tif (!(options || {}).always_show_decimals && !is_null(value)) {\n\t\t\t\tvar temp = cstr(value).split(\".\");\n\t\t\t\tif (temp[1]==undefined || cint(temp[1])===0) {\n\t\t\t\t\tprecision = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn frappe.form.formatters._right(\n\t\t\t\t((value==null || value===\"\")\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: format_number(value, null, precision)), options);\n\t\t}\n\t},\n\tInt: function(value, docfield, options) {\n\t\treturn frappe.form.formatters._right(value==null ? \"\" : cint(value), options)\n\t},\n\tPercent: function(value, docfield, options) {\n\t\tconst precision = (\n\t\t\tdocfield.precision\n\t\t\t|| cint(\n\t\t\t\tfrappe.boot.sysdefaults\n\t\t\t\t&& frappe.boot.sysdefaults.float_precision\n\t\t\t)\n\t\t\t|| 2\n\t\t);\n\t\treturn frappe.form.formatters._right(flt(value, precision) + \"%\", options);\n\t},\n\tRating: function(value) {\n\t\tconst rating_html =\t`${[1, 2, 3, 4, 5].map(i =>\n\t\t\t`\n\t\t\t\t\n\t\t\t`\n\t\t).join('')}`;\n\t\treturn `
\n\t\t\t${rating_html}\n\t\t
`;\n\t},\n\tCurrency: function (value, docfield, options, doc) {\n\t\tvar currency = frappe.meta.get_field_currency(docfield, doc);\n\t\tvar precision = docfield.precision || cint(frappe.boot.sysdefaults.currency_precision) || 2;\n\n\t\t// If you change anything below, it's going to hurt a company in UAE, a bit.\n\t\tif (precision > 2) {\n\t\t\tvar parts\t = cstr(value).split(\".\"); // should be minimum 2, comes from the DB\n\t\t\tvar decimals = parts.length > 1 ? parts[1] : \"\"; // parts.length == 2 ???\n\n\t\t\tif ( decimals.length < 3 || decimals.length < precision ) {\n\t\t\t\tconst fraction = frappe.model.get_value(\":Currency\", currency, \"fraction_units\") || 100; // if not set, minimum 2.\n\n\t\t\t\tif (decimals.length < cstr(fraction).length) {\n\t\t\t\t\tprecision = cstr(fraction).length - 1;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvalue = (value == null || value === \"\") ? \"\" : format_currency(value, currency, precision);\n\n\t\tif ( options && options.only_value ) {\n\t\t\treturn value;\n\t\t} else {\n\t\t\treturn frappe.form.formatters._right(value, options);\n\t\t}\n\t},\n\tCheck: function(value) {\n\t\treturn ``;\n\t},\n\tLink: function(value, docfield, options, doc) {\n\t\tvar doctype = docfield._options || docfield.options;\n\t\tvar original_value = value;\n\t\tif(value && value.match && value.match(/^['\"].*['\"]$/)) {\n\t\t\tvalue.replace(/^.(.*).$/, \"$1\");\n\t\t}\n\n\t\tif(options && (options.for_print || options.only_value)) {\n\t\t\treturn value;\n\t\t}\n\n\t\tif(frappe.form.link_formatters[doctype]) {\n\t\t\t// don't apply formatters in case of composite (parent field of same type)\n\t\t\tif (doc && doctype !== doc.doctype) {\n\t\t\t\tvalue = frappe.form.link_formatters[doctype](value, doc, docfield);\n\t\t\t}\n\t\t}\n\n\t\tif(!value) {\n\t\t\treturn \"\";\n\t\t}\n\t\tif(value[0] == \"'\" && value[value.length -1] == \"'\") {\n\t\t\treturn value.substring(1, value.length - 1);\n\t\t}\n\t\tif(docfield && docfield.link_onclick) {\n\t\t\treturn repl('%(value)s',\n\t\t\t\t{onclick: docfield.link_onclick.replace(/\"/g, '"'), value:value});\n\t\t} else if(docfield && doctype) {\n\t\t\tif (frappe.model.can_read(doctype)) {\n\t\t\t\treturn `\n\t\t\t\t\t${__(options && options.label || value)}`;\n\t\t\t} else {\n\t\t\t\treturn value;\n\t\t\t}\n\t\t} else {\n\t\t\treturn value;\n\t\t}\n\t},\n\tDate: function(value) {\n\t\tif (!frappe.datetime.str_to_user) {\n\t\t\treturn value;\n\t\t}\n\t\tif (value) {\n\t\t\tvalue = frappe.datetime.str_to_user(value);\n\t\t\t// handle invalid date\n\t\t\tif (value===\"Invalid date\") {\n\t\t\t\tvalue = null;\n\t\t\t}\n\t\t}\n\n\t\treturn value || \"\";\n\t},\n\tDateRange: function(value) {\n\t\tif (Array.isArray(value)) {\n\t\t\treturn __(\"{0} to {1}\", [frappe.datetime.str_to_user(value[0]), frappe.datetime.str_to_user(value[1])]);\n\t\t} else {\n\t\t\treturn value || \"\";\n\t\t}\n\t},\n\tDatetime: function(value) {\n\t\tif(value) {\n\t\t\tvar m = moment(frappe.datetime.convert_to_user_tz(value));\n\t\t\tif(frappe.boot.sysdefaults.time_zone) {\n\t\t\t\tm = m.tz(frappe.boot.sysdefaults.time_zone);\n\t\t\t}\n\t\t\treturn m.format(frappe.boot.sysdefaults.date_format.toUpperCase()\n\t\t\t\t+ ' ' + (frappe.boot.sysdefaults.time_format || 'HH:mm:ss'));\n\t\t} else {\n\t\t\treturn \"\";\n\t\t}\n\t},\n\tText: function(value) {\n\t\tif(value) {\n\t\t\tvar tags = [\"\n\t\t\t\t\t${v}\n\t\t\t\t`;\n\t\t});\n\t\treturn html;\n\t},\n\tComment: function(value) {\n\t\treturn value;\n\t},\n\tAssign: function(value) {\n\t\tvar html = \"\";\n\t\t$.each(JSON.parse(value || \"[]\"), function(i, v) {\n\t\t\tif(v) html+= ''+v+'';\n\t\t});\n\t\treturn html;\n\t},\n\tSmallText: function(value) {\n\t\treturn frappe.form.formatters.Text(value);\n\t},\n\tTextEditor: function(value) {\n\t\tlet formatted_value = frappe.form.formatters.Text(value);\n\t\t// to use ql-editor styles\n\t\ttry {\n\t\t\tif (!$(formatted_value).find('.ql-editor').length) {\n\t\t\t\tformatted_value = `
${formatted_value}
`;\n\t\t\t}\n\t\t} catch(e) {\n\t\t\tformatted_value = `
${formatted_value}
`;\n\t\t}\n\n\t\treturn formatted_value;\n\t},\n\tCode: function(value) {\n\t\treturn \"
\" + (value==null ? \"\" : $(\"
\").text(value).html()) + \"
\"\n\t},\n\tWorkflowState: function(value) {\n\t\tvar workflow_state = frappe.get_doc(\"Workflow State\", value);\n\t\tif(workflow_state) {\n\t\t\treturn repl(\"\\\n\t\t\t\t %(value)s\", {\n\t\t\t\t\tvalue: value,\n\t\t\t\t\tstyle: workflow_state.style.toLowerCase(),\n\t\t\t\t\ticon: workflow_state.icon\n\t\t\t\t});\n\t\t} else {\n\t\t\treturn \"\" + value + \"\";\n\t\t}\n\t},\n\tEmail: function(value) {\n\t\treturn $(\"
\").text(value).html();\n\t},\n\tFileSize: function(value) {\n\t\tif(value > 1048576) {\n\t\t\tvalue = flt(flt(value) / 1048576, 1) + \"M\";\n\t\t} else if (value > 1024) {\n\t\t\tvalue = flt(flt(value) / 1024, 1) + \"K\";\n\t\t}\n\t\treturn value;\n\t},\n\tTableMultiSelect: function(rows, df, options) {\n\t\trows = rows || [];\n\t\tconst meta = frappe.get_meta(df.options);\n\t\tconst link_field = meta.fields.find(df => df.fieldtype === 'Link');\n\t\tconst formatted_values = rows.map(row => {\n\t\t\tconst value = row[link_field.fieldname];\n\t\t\treturn frappe.format(value, link_field, options, row);\n\t\t});\n\t\treturn formatted_values.join(', ');\n\t},\n\tColor: (value) => {\n\t\treturn value ? `
\n\t\t\t
\n\t\t\t${value}\n\t\t
` : '';\n\t},\n\tIcon: (value) => {\n\t\treturn value ? `
\n\t\t\t
${frappe.utils.icon(value, \"md\")}
\n\t\t\t${value}\n\t\t
` : '';\n\t}\n};\n\nfrappe.form.get_formatter = function(fieldtype) {\n\tif(!fieldtype)\n\t\tfieldtype = \"Data\";\n\treturn frappe.form.formatters[fieldtype.replace(/ /g, \"\")] || frappe.form.formatters.Data;\n}\n\nfrappe.format = function(value, df, options, doc) {\n\tif(!df) df = {\"fieldtype\":\"Data\"};\n\tif (df.fieldname == '_user_tags') df.fieldtype = 'Tag';\n\tvar fieldtype = df.fieldtype || \"Data\";\n\n\t// format Dynamic Link as a Link\n\tif(fieldtype===\"Dynamic Link\") {\n\t\tfieldtype = \"Link\";\n\t\tdf._options = doc ? doc[df.options] : null;\n\t}\n\n\tvar formatter = df.formatter || frappe.form.get_formatter(fieldtype);\n\n\tvar formatted = formatter(value, df, options, doc);\n\n\tif (typeof formatted == \"string\")\n\t\tformatted = frappe.dom.remove_script_and_style(formatted);\n\n\treturn formatted;\n};\n\nfrappe.get_format_helper = function(doc) {\n\tvar helper = {\n\t\tget_formatted: function(fieldname) {\n\t\t\tvar df = frappe.meta.get_docfield(doc.doctype, fieldname);\n\t\t\tif(!df) { console.log(\"fieldname not found: \" + fieldname); }\n\t\t\treturn frappe.format(doc[fieldname], df, {inline:1}, doc);\n\t\t}\n\t};\n\t$.extend(helper, doc);\n\treturn helper;\n};\n\nfrappe.form.link_formatters['User'] = function(value, doc, docfield) {\n\tlet full_name = doc && (doc.full_name || (docfield && doc[`${docfield.fieldname}_full_name`]));\n\treturn full_name || value;\n};\n","// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors\n// MIT License. See license.txt\n\n/*\n\nInheritence \"Class\"\n-------------------\nsee: http://ejohn.org/blog/simple-javascript-inheritance/\nTo subclass, use:\n\n\tvar MyClass = Class.extend({\n\t\tinit: function\n\t})\n\n*/\n// https://stackoverflow.com/a/15052240/5353542\n\n/* Simple JavaScript Inheritance for ES 5.1\n * based on http://ejohn.org/blog/simple-javascript-inheritance/\n * (inspired by base2 and Prototype)\n * MIT Licensed.\n */\n(function(global) {\n\t\"use strict\";\n\tvar fnTest = /xyz/.test(function(){xyz;}) ? /\\b_super\\b/ : /.*/;\n\n\t// The base Class implementation (does nothing)\n\tfunction Class(){}\n\n\t// Create a new Class that inherits from this class\n\tClass.extend = function(props) {\n\t var _super = this.prototype;\n\n\t // Set up the prototype to inherit from the base class\n\t // (but without running the init constructor)\n\t var proto = Object.create(_super);\n\n\t // Copy the properties over onto the new prototype\n\t for (var name in props) {\n\t\t// Check if we're overwriting an existing function\n\t\tproto[name] = typeof props[name] === \"function\" &&\n\t\t typeof _super[name] == \"function\" && fnTest.test(props[name])\n\t\t ? (function(name, fn){\n\t\t\t return function() {\n\t\t\t\tvar tmp = this._super;\n\n\t\t\t\t// Add a new ._super() method that is the same method\n\t\t\t\t// but on the super-class\n\t\t\t\tthis._super = _super[name];\n\n\t\t\t\t// The method only need to be bound temporarily, so we\n\t\t\t\t// remove it when we're done executing\n\t\t\t\tvar ret = fn.apply(this, arguments);\n\t\t\t\tthis._super = tmp;\n\n\t\t\t\treturn ret;\n\t\t\t };\n\t\t\t})(name, props[name])\n\t\t : props[name];\n\t }\n\n\t // The new constructor\n\t var newClass = typeof proto.init === \"function\"\n\t\t? proto.hasOwnProperty(\"init\")\n\t\t ? proto.init // All construction is actually done in the init method\n\t\t : function SubClass(){ _super.init.apply(this, arguments); }\n\t\t: function EmptyClass(){};\n\n\t // Populate our constructed prototype object\n\t newClass.prototype = proto;\n\n\t // Enforce the constructor to be what we expect\n\t proto.constructor = newClass;\n\n\t // And make this class extendable\n\t newClass.extend = Class.extend;\n\n\t return newClass;\n\t};\n\n\t// export\n\tglobal.Class = Class;\n })(this);","import '../class';\n\nfrappe.ui.form.Layout = Class.extend({\n\tinit: function (opts) {\n\t\tthis.views = {};\n\t\tthis.pages = [];\n\t\tthis.sections = [];\n\t\tthis.fields_list = [];\n\t\tthis.fields_dict = {};\n\n\t\t$.extend(this, opts);\n\t},\n\tmake: function() {\n\t\tif (!this.parent && this.body) {\n\t\t\tthis.parent = this.body;\n\t\t}\n\t\tthis.wrapper = $('
').appendTo(this.parent);\n\t\tthis.message = $('
').appendTo(this.wrapper);\n\t\tif (!this.fields) {\n\t\t\tthis.fields = this.get_doctype_fields();\n\t\t}\n\t\tthis.setup_tabbing();\n\t\tthis.render();\n\t},\n\tshow_empty_form_message: function() {\n\t\tif (!(this.wrapper.find(\".frappe-control:visible\").length || this.wrapper.find(\".section-head.collapsed\").length)) {\n\t\t\tthis.show_message(__(\"This form does not have any input\"));\n\t\t}\n\t},\n\n\tget_doctype_fields: function() {\n\t\tlet fields = [\n\t\t\tthis.get_new_name_field()\n\t\t];\n\t\tif (this.doctype_layout) {\n\t\t\tfields = fields.concat(this.get_fields_from_layout());\n\t\t} else {\n\t\t\tfields = fields.concat(frappe.meta.sort_docfields(frappe.meta.docfield_map[this.doctype]));\n\t\t}\n\n\t\treturn fields;\n\t},\n\n\tget_new_name_field() {\n\t\treturn {\n\t\t\tparent: this.frm.doctype,\n\t\t\tfieldtype: 'Data',\n\t\t\tfieldname: '__newname',\n\t\t\treqd: 1,\n\t\t\thidden: 1,\n\t\t\tlabel: __('Name'),\n\t\t\tget_status: function(field) {\n\t\t\t\tif (field.frm && field.frm.is_new()\n\t\t\t\t\t&& field.frm.meta.autoname\n\t\t\t\t\t&& ['prompt', 'name'].includes(field.frm.meta.autoname.toLowerCase())) {\n\t\t\t\t\treturn 'Write';\n\t\t\t\t}\n\t\t\t\treturn 'None';\n\t\t\t}\n\t\t};\n\t},\n\n\tget_fields_from_layout() {\n\t\tconst fields = [];\n\t\tfor (let f of this.doctype_layout.fields) {\n\t\t\tconst docfield = copy_dict(frappe.meta.docfield_map[this.doctype][f.fieldname]);\n\t\t\tdocfield.label = f.label;\n\t\t\tfields.push(docfield);\n\t\t}\n\t\treturn fields;\n\t},\n\n\tshow_message: function(html, color) {\n\t\tif (this.message_color) {\n\t\t\t// remove previous color\n\t\t\tthis.message.removeClass(this.message_color);\n\t\t}\n\t\tthis.message_color = (color && ['yellow', 'blue', 'red', 'green', 'orange'].includes(color)) ? color : 'blue';\n\t\tif (html) {\n\t\t\tif (html.substr(0, 1)!=='<') {\n\t\t\t\t// wrap in a block\n\t\t\t\thtml = '
' + html + '
';\n\t\t\t}\n\t\t\tthis.message.removeClass('hidden').addClass(this.message_color);\n\t\t\t$(html).appendTo(this.message);\n\t\t} else {\n\t\t\tthis.message.empty().addClass('hidden');\n\t\t}\n\t},\n\trender: function (new_fields) {\n\t\tvar me = this;\n\t\tvar fields = new_fields || this.fields;\n\n\t\tthis.section = null;\n\t\tthis.column = null;\n\n\t\tif (this.with_dashboard) {\n\t\t\tthis.setup_dashboard_section();\n\t\t}\n\n\t\tif (this.no_opening_section()) {\n\t\t\tthis.make_section();\n\t\t}\n\t\t$.each(fields, function (i, df) {\n\t\t\tswitch (df.fieldtype) {\n\t\t\t\tcase \"Fold\":\n\t\t\t\t\tme.make_page(df);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Section Break\":\n\t\t\t\t\tme.make_section(df);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"Column Break\":\n\t\t\t\t\tme.make_column(df);\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tme.make_field(df);\n\t\t\t}\n\t\t});\n\n\t},\n\n\tno_opening_section: function () {\n\t\treturn (this.fields[0] && this.fields[0].fieldtype != \"Section Break\") || !this.fields.length;\n\t},\n\n\tsetup_dashboard_section: function () {\n\t\tif (this.no_opening_section()) {\n\t\t\tthis.fields.unshift({fieldtype: 'Section Break'});\n\t\t}\n\t},\n\n\treplace_field: function (fieldname, df, render) {\n\t\tdf.fieldname = fieldname; // change of fieldname is avoided\n\t\tif (this.fields_dict[fieldname] && this.fields_dict[fieldname].df) {\n\t\t\tconst fieldobj = this.init_field(df, render);\n\t\t\tthis.fields_dict[fieldname].$wrapper.remove();\n\t\t\tthis.fields_list.splice(this.fields_dict[fieldname], 1, fieldobj);\n\t\t\tthis.fields_dict[fieldname] = fieldobj;\n\t\t\tif (this.frm) {\n\t\t\t\tfieldobj.perm = this.frm.perm;\n\t\t\t}\n\t\t\tthis.section.fields_list.splice(this.section.fields_dict[fieldname], 1, fieldobj);\n\t\t\tthis.section.fields_dict[fieldname] = fieldobj;\n\t\t\tthis.refresh_fields([df]);\n\t\t}\n\t},\n\n\tmake_field: function (df, colspan, render) {\n\t\t!this.section && this.make_section();\n\t\t!this.column && this.make_column();\n\n\t\tconst fieldobj = this.init_field(df, render);\n\t\tthis.fields_list.push(fieldobj);\n\t\tthis.fields_dict[df.fieldname] = fieldobj;\n\t\tif (this.frm) {\n\t\t\tfieldobj.perm = this.frm.perm;\n\t\t}\n\n\t\tthis.section.fields_list.push(fieldobj);\n\t\tthis.section.fields_dict[df.fieldname] = fieldobj;\n\t\tfieldobj.section = this.section;\n\t},\n\n\tinit_field: function (df, render = false) {\n\t\tconst fieldobj = frappe.ui.form.make_control({\n\t\t\tdf: df,\n\t\t\tdoctype: this.doctype,\n\t\t\tparent: this.column.wrapper.get(0),\n\t\t\tfrm: this.frm,\n\t\t\trender_input: render,\n\t\t\tdoc: this.doc,\n\t\t\tlayout: this\n\t\t});\n\n\t\tfieldobj.layout = this;\n\t\treturn fieldobj;\n\t},\n\n\tmake_page: function (df) { // eslint-disable-line no-unused-vars\n\t\tvar me = this,\n\t\t\thead = $('
\\\n\t\t\t\t' + __(\"Show more details\") + '\\\n\t\t\t
').appendTo(this.wrapper);\n\n\t\tthis.page = $('
').appendTo(this.wrapper);\n\n\t\tthis.fold_btn = head.find(\".btn-fold\").on(\"click\", function () {\n\t\t\tvar page = $(this).parent().next();\n\t\t\tif (page.hasClass(\"hide\")) {\n\t\t\t\t$(this).removeClass(\"btn-fold\").html(__(\"Hide details\"));\n\t\t\t\tpage.removeClass(\"hide\");\n\t\t\t\tfrappe.utils.scroll_to($(this), true, 30);\n\t\t\t\tme.folded = false;\n\t\t\t} else {\n\t\t\t\t$(this).addClass(\"btn-fold\").html(__(\"Show more details\"));\n\t\t\t\tpage.addClass(\"hide\");\n\t\t\t\tme.folded = true;\n\t\t\t}\n\t\t});\n\n\t\tthis.section = null;\n\t\tthis.folded = true;\n\t},\n\n\tunfold: function () {\n\t\tthis.fold_btn.trigger('click');\n\t},\n\n\tmake_section: function (df) {\n\t\tthis.section = new frappe.ui.form.Section(this, df);\n\n\t\t// append to layout fields\n\t\tif (df) {\n\t\t\tthis.fields_dict[df.fieldname] = this.section;\n\t\t\tthis.fields_list.push(this.section);\n\t\t}\n\n\t\tthis.column = null;\n\t},\n\n\tmake_column: function (df) {\n\t\tthis.column = new frappe.ui.form.Column(this.section, df);\n\t\tif (df && df.fieldname) {\n\t\t\tthis.fields_list.push(this.column);\n\t\t}\n\t},\n\n\trefresh: function (doc) {\n\t\tvar me = this;\n\t\tif (doc) this.doc = doc;\n\n\t\tif (this.frm) {\n\t\t\tthis.wrapper.find(\".empty-form-alert\").remove();\n\t\t}\n\n\t\t// NOTE this might seem redundant at first, but it needs to be executed when frm.refresh_fields is called\n\t\tme.attach_doc_and_docfields(true);\n\n\t\tif (this.frm && this.frm.wrapper) {\n\t\t\t$(this.frm.wrapper).trigger(\"refresh-fields\");\n\t\t}\n\n\t\t// dependent fields\n\t\tthis.refresh_dependency();\n\n\t\t// refresh sections\n\t\tthis.refresh_sections();\n\n\t\tif (this.frm) {\n\t\t\t// collapse sections\n\t\t\tthis.refresh_section_collapse();\n\t\t}\n\n\t\tif (document.activeElement) {\n\t\t\tif (document.activeElement.tagName == 'INPUT' && this.is_numeric_field_active()) {\n\t\t\t\tdocument.activeElement.select();\n\t\t\t}\n\t\t}\n\t},\n\n\tis_numeric_field_active() {\n\t\tconst control = $(document.activeElement).closest(\".frappe-control\");\n\t\tconst fieldtype = (control.data() || {}).fieldtype;\n\t\treturn frappe.model.numeric_fieldtypes.includes(fieldtype);\n\t},\n\n\trefresh_sections: function() {\n\t\t// hide invisible sections\n\t\tthis.wrapper.find(\".form-section:not(.hide-control)\").each(function() {\n\t\t\tconst section = $(this).removeClass(\"empty-section visible-section\");\n\t\t\tif (section.find(\".frappe-control:not(.hide-control)\").length) {\n\t\t\t\tsection.addClass(\"visible-section\");\n\t\t\t} else {\n\t\t\t\t// nothing visible, hide the section\n\t\t\t\tsection.addClass(\"empty-section\");\n\t\t\t}\n\t\t});\n\t},\n\n\trefresh_fields: function (fields) {\n\t\tlet fieldnames = fields.map((field) => {\n\t\t\tif (field.fieldname) return field.fieldname;\n\t\t});\n\n\t\tthis.fields_list.map(fieldobj => {\n\t\t\tif (fieldnames.includes(fieldobj.df.fieldname)) {\n\t\t\t\tfieldobj.refresh();\n\t\t\t\tif (fieldobj.df[\"default\"]) {\n\t\t\t\t\tfieldobj.set_input(fieldobj.df[\"default\"]);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\tadd_fields: function (fields) {\n\t\tthis.render(fields);\n\t\tthis.refresh_fields(fields);\n\t},\n\n\trefresh_section_collapse: function () {\n\t\tif (!(this.sections && this.sections.length)) return;\n\n\t\tfor (var i = 0; i < this.sections.length; i++) {\n\t\t\tvar section = this.sections[i];\n\t\t\tvar df = section.df;\n\t\t\tif (df && df.collapsible) {\n\t\t\t\tvar collapse = true;\n\n\t\t\t\tif (df.collapsible_depends_on) {\n\t\t\t\t\tcollapse = !this.evaluate_depends_on_value(df.collapsible_depends_on);\n\t\t\t\t}\n\n\t\t\t\tif (collapse && section.has_missing_mandatory()) {\n\t\t\t\t\tcollapse = false;\n\t\t\t\t}\n\n\t\t\t\tsection.collapse(collapse);\n\t\t\t}\n\t\t}\n\t},\n\n\tattach_doc_and_docfields: function (refresh) {\n\t\tvar me = this;\n\t\tfor (var i = 0, l = this.fields_list.length; i < l; i++) {\n\t\t\tvar fieldobj = this.fields_list[i];\n\t\t\tif (me.doc) {\n\t\t\t\tfieldobj.doc = me.doc;\n\t\t\t\tfieldobj.doctype = me.doc.doctype;\n\t\t\t\tfieldobj.docname = me.doc.name;\n\t\t\t\tfieldobj.df = frappe.meta.get_docfield(me.doc.doctype,\n\t\t\t\t\tfieldobj.df.fieldname, me.doc.name) || fieldobj.df;\n\n\t\t\t\t// on form change, permissions can change\n\t\t\t\tif (me.frm) {\n\t\t\t\t\tfieldobj.perm = me.frm.perm;\n\t\t\t\t}\n\t\t\t}\n\t\t\trefresh && fieldobj.df && fieldobj.refresh && fieldobj.refresh();\n\t\t}\n\t},\n\n\trefresh_section_count: function () {\n\t\tthis.wrapper.find(\".section-count-label:visible\").each(function (i) {\n\t\t\t$(this).html(i + 1);\n\t\t});\n\t},\n\tsetup_tabbing: function () {\n\t\tvar me = this;\n\t\tthis.wrapper.on(\"keydown\", function (ev) {\n\t\t\tif (ev.which == 9) {\n\t\t\t\tvar current = $(ev.target),\n\t\t\t\t\tdoctype = current.attr(\"data-doctype\"),\n\t\t\t\t\tfieldname = current.attr(\"data-fieldname\");\n\t\t\t\tif (doctype)\n\t\t\t\t\treturn me.handle_tab(doctype, fieldname, ev.shiftKey);\n\t\t\t}\n\t\t});\n\t},\n\thandle_tab: function (doctype, fieldname, shift) {\n\t\tvar me = this,\n\t\t\tgrid_row = null,\n\t\t\tprev = null,\n\t\t\tfields = me.fields_list,\n\t\t\tin_grid = false,\n\t\t\tfocused = false;\n\n\t\t// in grid\n\t\tif (doctype != me.doctype) {\n\t\t\tgrid_row = me.get_open_grid_row();\n\t\t\tif (!grid_row || !grid_row.layout) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfields = grid_row.layout.fields_list;\n\t\t}\n\n\t\tfor (var i = 0, len = fields.length; i < len; i++) {\n\t\t\tif (fields[i].df.fieldname == fieldname) {\n\t\t\t\tif (shift) {\n\t\t\t\t\tif (prev) {\n\t\t\t\t\t\tthis.set_focus(prev);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t$(this.primary_button).focus();\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif (i < len - 1) {\n\t\t\t\t\tfocused = me.focus_on_next_field(i, fields);\n\t\t\t\t}\n\n\t\t\t\tif (focused) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this.is_visible(fields[i]))\n\t\t\t\tprev = fields[i];\n\t\t}\n\n\t\tif (!focused) {\n\t\t\t// last field in this group\n\t\t\tif (grid_row) {\n\t\t\t\t// in grid\n\t\t\t\tif (grid_row.doc.idx == grid_row.grid.grid_rows.length) {\n\t\t\t\t\t// last row, close it and find next field\n\t\t\t\t\tgrid_row.toggle_view(false, function () {\n\t\t\t\t\t\tgrid_row.grid.frm.layout.handle_tab(grid_row.grid.df.parent, grid_row.grid.df.fieldname);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\t// next row\n\t\t\t\t\tgrid_row.grid.grid_rows[grid_row.doc.idx].toggle_view(true);\n\t\t\t\t}\n\t\t\t} else if (!shift) {\n\t\t\t\t// End of tab navigation\n\t\t\t\t$(this.primary_button).focus();\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t},\n\tfocus_on_next_field: function (start_idx, fields) {\n\t\t// loop to find next eligible fields\n\t\tfor (var i = start_idx + 1, len = fields.length; i < len; i++) {\n\t\t\tvar field = fields[i];\n\t\t\tif (this.is_visible(field)) {\n\t\t\t\tif (field.df.fieldtype === \"Table\") {\n\t\t\t\t\t// open table grid\n\t\t\t\t\tif (!(field.grid.grid_rows && field.grid.grid_rows.length)) {\n\t\t\t\t\t\t// empty grid, add a new row\n\t\t\t\t\t\tfield.grid.add_new_row();\n\t\t\t\t\t}\n\t\t\t\t\t// show grid row (if exists)\n\t\t\t\t\tfield.grid.grid_rows[0].show_form();\n\t\t\t\t\treturn true;\n\n\t\t\t\t} else if (!in_list(frappe.model.no_value_type, field.df.fieldtype)) {\n\t\t\t\t\tthis.set_focus(field);\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t},\n\tis_visible: function (field) {\n\t\treturn field.disp_status === \"Write\" && (field.$wrapper && field.$wrapper.is(\":visible\"));\n\t},\n\tset_focus: function (field) {\n\t\t// next is table, show the table\n\t\tif (field.df.fieldtype==\"Table\") {\n\t\t\tif (!field.grid.grid_rows.length) {\n\t\t\t\tfield.grid.add_new_row(1);\n\t\t\t} else {\n\t\t\t\tfield.grid.grid_rows[0].toggle_view(true);\n\t\t\t}\n\t\t} else if (field.editor) {\n\t\t\tfield.editor.set_focus();\n\t\t} else if (field.$input) {\n\t\t\tfield.$input.focus();\n\t\t}\n\t},\n\tget_open_grid_row: function () {\n\t\treturn $(\".grid-row-open\").data(\"grid_row\");\n\t},\n\trefresh_dependency: function () {\n\t\t// Resolve \"depends_on\" and show / hide accordingly\n\t\tvar me = this;\n\n\t\t// build dependants' dictionary\n\t\tvar has_dep = false;\n\n\t\tfor (var fkey in this.fields_list) {\n\t\t\tvar f = this.fields_list[fkey];\n\t\t\tf.dependencies_clear = true;\n\t\t\tif (f.df.depends_on || f.df.mandatory_depends_on || f.df.read_only_depends_on) {\n\t\t\t\thas_dep = true;\n\t\t\t}\n\t\t}\n\n\t\tif (!has_dep) return;\n\n\t\t// show / hide based on values\n\t\tfor (var i = me.fields_list.length - 1; i >= 0; i--) {\n\t\t\tvar f = me.fields_list[i];\n\t\t\tf.guardian_has_value = true;\n\t\t\tif (f.df.depends_on) {\n\t\t\t\t// evaluate guardian\n\n\t\t\t\tf.guardian_has_value = this.evaluate_depends_on_value(f.df.depends_on);\n\n\t\t\t\t// show / hide\n\t\t\t\tif (f.guardian_has_value) {\n\t\t\t\t\tif (f.df.hidden_due_to_dependency) {\n\t\t\t\t\t\tf.df.hidden_due_to_dependency = false;\n\t\t\t\t\t\tf.refresh();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!f.df.hidden_due_to_dependency) {\n\t\t\t\t\t\tf.df.hidden_due_to_dependency = true;\n\t\t\t\t\t\tf.refresh();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (f.df.mandatory_depends_on) {\n\t\t\t\tthis.set_dependant_property(f.df.mandatory_depends_on, f.df.fieldname, 'reqd');\n\t\t\t}\n\n\t\t\tif (f.df.read_only_depends_on) {\n\t\t\t\tthis.set_dependant_property(f.df.read_only_depends_on, f.df.fieldname, 'read_only');\n\t\t\t}\n\t\t}\n\n\t\tthis.refresh_section_count();\n\t},\n\tset_dependant_property: function (condition, fieldname, property) {\n\t\tlet set_property = this.evaluate_depends_on_value(condition);\n\t\tlet value = set_property ? 1 : 0;\n\t\tlet form_obj;\n\n\t\tif (this.frm) {\n\t\t\tform_obj = this.frm;\n\t\t} else if (this.is_dialog || this.doctype === 'Web Form') {\n\t\t\tform_obj = this;\n\t\t}\n\t\tif (form_obj) {\n\t\t\tif (this.doc && this.doc.parent && this.doc.parentfield) {\n\t\t\t\tform_obj.setting_dependency = true;\n\t\t\t\tform_obj.set_df_property(this.doc.parentfield, property, value, this.doc.parent, fieldname, this.doc.name);\n\t\t\t\tform_obj.setting_dependency = false;\n\t\t\t\t// refresh child fields\n\t\t\t\tthis.fields_dict[fieldname] && this.fields_dict[fieldname].refresh();\n\t\t\t} else {\n\t\t\t\tform_obj.set_df_property(fieldname, property, value);\n\t\t\t}\n\t\t}\n\t},\n\tevaluate_depends_on_value: function (expression) {\n\t\tvar out = null;\n\t\tvar doc = this.doc;\n\n\t\tif (!doc && this.get_values) {\n\t\t\tvar doc = this.get_values(true);\n\t\t}\n\n\t\tif (!doc) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar parent = this.frm ? this.frm.doc : this.doc || null;\n\n\t\tif (typeof (expression) === 'boolean') {\n\t\t\tout = expression;\n\n\t\t} else if (typeof (expression) === 'function') {\n\t\t\tout = expression(doc);\n\n\t\t} else if (expression.substr(0, 5)=='eval:') {\n\t\t\ttry {\n\t\t\t\tout = frappe.utils.eval(expression.substr(5), { doc, parent });\n\t\t\t\tif (parent && parent.istable && expression.includes('is_submittable')) {\n\t\t\t\t\tout = true;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tfrappe.throw(__('Invalid \"depends_on\" expression'));\n\t\t\t}\n\n\t\t} else if (expression.substr(0, 3)=='fn:' && this.frm) {\n\t\t\tout = this.frm.script_manager.trigger(expression.substr(3), this.doctype, this.docname);\n\t\t} else {\n\t\t\tvar value = doc[expression];\n\t\t\tif ($.isArray(value)) {\n\t\t\t\tout = !!value.length;\n\t\t\t} else {\n\t\t\t\tout = !!value;\n\t\t\t}\n\t\t}\n\n\t\treturn out;\n\t}\n});\n\nfrappe.ui.form.Section = Class.extend({\n\tinit: function(layout, df) {\n\t\tthis.layout = layout;\n\t\tthis.df = df || {};\n\t\tthis.fields_list = [];\n\t\tthis.fields_dict = {};\n\n\t\tthis.make();\n\t\t// if (this.frm)\n\t\t// \tthis.section.body.css({\"padding\":\"0px 3%\"})\n\t\tthis.row = {\n\t\t\twrapper: this.wrapper\n\t\t};\n\n\t\tthis.refresh();\n\t},\n\tmake: function() {\n\t\tif (!this.layout.page) {\n\t\t\tthis.layout.page = $('
').appendTo(this.layout.wrapper);\n\t\t}\n\t\tlet make_card = this.layout.card_layout;\n\t\tthis.wrapper = $(`
`)\n\t\t\t.appendTo(this.layout.page);\n\t\tthis.layout.sections.push(this);\n\n\t\tif (this.df) {\n\t\t\tif (this.df.label) {\n\t\t\t\tthis.make_head();\n\t\t\t}\n\t\t\tif (this.df.description) {\n\t\t\t\t$('
' + __(this.df.description) + '
')\n\t\t\t\t\t.appendTo(this.wrapper);\n\t\t\t}\n\t\t\tif (this.df.cssClass) {\n\t\t\t\tthis.wrapper.addClass(this.df.cssClass);\n\t\t\t}\n\t\t\tif (this.df.hide_border) {\n\t\t\t\tthis.wrapper.toggleClass(\"hide-border\", true);\n\t\t\t}\n\t\t}\n\n\t\t// for bc\n\t\tthis.body = $('
').appendTo(this.wrapper);\n\t},\n\n\tmake_head: function () {\n\t\tthis.head = $(`
\n\t\t\t${__(this.df.label)}\n\t\t\t\n\t\t\t\n\t\t
`);\n\t\tthis.head.appendTo(this.wrapper);\n\t\tthis.indicator = this.head.find('.collapse-indicator');\n\t\tthis.indicator.hide();\n\t\tif (this.df.collapsible) {\n\t\t\t// show / hide based on status\n\t\t\tthis.collapse_link = this.head.on(\"click\", () => {\n\t\t\t\tthis.collapse();\n\t\t\t});\n\n\t\t\tthis.indicator.show();\n\t\t}\n\t},\n\trefresh: function() {\n\t\tif (!this.df)\n\t\t\treturn;\n\n\t\t// hide if explictly hidden\n\t\tvar hide = this.df.hidden || this.df.hidden_due_to_dependency;\n\n\t\t// hide if no perm\n\t\tif (!hide && this.layout && this.layout.frm && !this.layout.frm.get_perm(this.df.permlevel || 0, \"read\")) {\n\t\t\thide = true;\n\t\t}\n\n\t\tthis.wrapper.toggleClass(\"hide-control\", !!hide);\n\t},\n\tcollapse: function (hide) {\n\t\t// unknown edge case\n\t\tif (!(this.head && this.body)) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (hide===undefined) {\n\t\t\thide = !this.body.hasClass(\"hide\");\n\t\t}\n\n\t\tthis.body.toggleClass(\"hide\", hide);\n\t\tthis.head.toggleClass(\"collapsed\", hide);\n\n\t\tlet indicator_icon = hide ? 'down' : 'up-line';\n\n\t\tthis.indicator & this.indicator.html(frappe.utils.icon(indicator_icon, 'sm', 'mb-1'));\n\n\t\t// refresh signature fields\n\t\tthis.fields_list.forEach((f) => {\n\t\t\tif (f.df.fieldtype == 'Signature') {\n\t\t\t\tf.refresh();\n\t\t\t}\n\t\t});\n\t},\n\n\tis_collapsed() {\n\t\treturn this.body.hasClass('hide');\n\t},\n\n\thas_missing_mandatory: function () {\n\t\tvar missing_mandatory = false;\n\t\tfor (var j = 0, l = this.fields_list.length; j < l; j++) {\n\t\t\tvar section_df = this.fields_list[j].df;\n\t\t\tif (section_df.reqd && this.layout.doc[section_df.fieldname] == null) {\n\t\t\t\tmissing_mandatory = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\treturn missing_mandatory;\n\t}\n});\n\nfrappe.ui.form.Column = Class.extend({\n\tinit: function(section, df) {\n\t\tif (!df) df = {};\n\n\t\tthis.df = df;\n\t\tthis.section = section;\n\t\tthis.make();\n\t\tthis.resize_all_columns();\n\t},\n\tmake: function () {\n\t\tthis.wrapper = $('
\\\n\t\t\t
\\\n\t\t\t
\\\n\t\t
').appendTo(this.section.body)\n\t\t\t.find(\"form\")\n\t\t\t.on(\"submit\", function () {\n\t\t\t\treturn false;\n\t\t\t});\n\n\t\tif (this.df.label) {\n\t\t\t$('').appendTo(this.wrapper);\n\t\t}\n\t},\n\tresize_all_columns: function () {\n\t\t// distribute all columns equally\n\t\tvar colspan = cint(12 / this.section.wrapper.find(\".form-column\").length);\n\n\t\tthis.section.wrapper.find(\".form-column\").removeClass()\n\t\t\t.addClass(\"form-column\")\n\t\t\t.addClass(\"col-sm-\" + colspan);\n\n\t},\n\trefresh: function () {\n\t\tthis.section.refresh();\n\t}\n});\n","import '../form/layout';\n\nfrappe.provide('frappe.ui');\n\nfrappe.ui.FieldGroup = frappe.ui.form.Layout.extend({\n\tinit: function(opts) {\n\t\t$.extend(this, opts);\n\t\tthis.dirty = false;\n\t\tthis._super();\n\t\t$.each(this.fields || [], function(i, f) {\n\t\t\tif(!f.fieldname && f.label) {\n\t\t\t\tf.fieldname = f.label.replace(/ /g, \"_\").toLowerCase();\n\t\t\t}\n\t\t})\n\t\tif(this.values) {\n\t\t\tthis.set_values(this.values);\n\t\t}\n\t},\n\tmake: function() {\n\t\tvar me = this;\n\t\tif(this.fields) {\n\t\t\tthis._super();\n\t\t\tthis.refresh();\n\t\t\t// set default\n\t\t\t$.each(this.fields_list, function(i, field) {\n\t\t\t\tif (field.df[\"default\"]) {\n\t\t\t\t\tlet def_value = field.df[\"default\"];\n\n\t\t\t\t\tif (def_value == 'Today' && field.df[\"fieldtype\"] == 'Date') {\n\t\t\t\t\t\tdef_value = frappe.datetime.get_today();\n\t\t\t\t\t}\n\n\t\t\t\t\tfield.set_input(def_value);\n\t\t\t\t\t// if default and has depends_on, render its fields.\n\t\t\t\t\tme.refresh_dependency();\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tif(!this.no_submit_on_enter) {\n\t\t\t\tthis.catch_enter_as_submit();\n\t\t\t}\n\n\t\t\t$(this.wrapper).find('input, select').on(\n\t\t\t\t'change awesomplete-selectcomplete',\n\t\t\t\t() => {\n\t\t\t\t\tthis.dirty = true;\n\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t() => frappe.timeout(0.1),\n\t\t\t\t\t\t() => me.refresh_dependency()\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t);\n\n\t\t}\n\t},\n\tfirst_button: false,\n\tfocus_on_first_input: function() {\n\t\tif(this.no_focus) return;\n\t\t$.each(this.fields_list, function(i, f) {\n\t\t\tif(!in_list(['Date', 'Datetime', 'Time', 'Check'], f.df.fieldtype) && f.set_focus) {\n\t\t\t\tf.set_focus();\n\t\t\t\treturn false;\n\t\t\t}\n\t\t});\n\t},\n\tcatch_enter_as_submit: function() {\n\t\tvar me = this;\n\t\t$(this.body).find('input[type=\"text\"], input[type=\"password\"], select').keypress(function(e) {\n\t\t\tif(e.which==13) {\n\t\t\t\tif(me.has_primary_action) {\n\t\t\t\t\te.preventDefault();\n\t\t\t\t\tme.get_primary_btn().trigger(\"click\");\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\tget_input: function(fieldname) {\n\t\tvar field = this.fields_dict[fieldname];\n\t\treturn $(field.txt ? field.txt : field.input);\n\t},\n\tget_field: function(fieldname) {\n\t\treturn this.fields_dict[fieldname];\n\t},\n\tget_values: function(ignore_errors) {\n\t\tvar ret = {};\n\t\tvar errors = [];\n\t\tfor (var key in this.fields_dict) {\n\t\t\tvar f = this.fields_dict[key];\n\t\t\tif (f.get_value) {\n\t\t\t\tvar v = f.get_value();\n\t\t\t\tif (\n\t\t\t\t\tf.df.reqd &&\n\t\t\t\t\tis_null(typeof v === 'string' ? strip_html(v) : v)\n\t\t\t\t)\n\t\t\t\t\terrors.push(__(f.df.label));\n\n\t\t\t\tif (f.df.reqd\n\t\t\t\t\t&& f.df.fieldtype === 'Text Editor'\n\t\t\t\t\t&& is_null(strip_html(cstr(v))))\n\t\t\t\t\terrors.push(__(f.df.label));\n\n\t\t\t\tif (!is_null(v)) ret[f.df.fieldname] = v;\n\t\t\t}\n\t\t}\n\t\tif (errors.length && !ignore_errors) {\n\t\t\tfrappe.msgprint({\n\t\t\t\ttitle: __('Missing Values Required'),\n\t\t\t\tmessage: __('Following fields have missing values:') +\n\t\t\t\t\t'

  • ' + errors.join('
  • ') + '
',\n\t\t\t\tindicator: 'orange'\n\t\t\t});\n\t\t\treturn null;\n\t\t}\n\t\treturn ret;\n\t},\n\tget_value: function(key) {\n\t\tvar f = this.fields_dict[key];\n\t\treturn f && (f.get_value ? f.get_value() : null);\n\t},\n\tset_value: function(key, val){\n\t\treturn new Promise(resolve => {\n\t\t\tvar f = this.fields_dict[key];\n\t\t\tif(f) {\n\t\t\t\tf.set_value(val).then(() => {\n\t\t\t\t\tf.set_input(val);\n\t\t\t\t\tthis.refresh_dependency();\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tresolve();\n\t\t\t}\n\t\t});\n\t},\n\thas_field: function(fieldname) {\n\t\treturn !!this.fields_dict[fieldname];\n\t},\n\tset_input: function(key, val) {\n\t\treturn this.set_value(key, val);\n\t},\n\tset_values: function(dict) {\n\t\tlet promises = [];\n\t\tfor(var key in dict) {\n\t\t\tif(this.fields_dict[key]) {\n\t\t\t\tpromises.push(this.set_value(key, dict[key]));\n\t\t\t}\n\t\t}\n\n\t\treturn Promise.all(promises);\n\t},\n\tclear: function() {\n\t\tfor(var key in this.fields_dict) {\n\t\t\tvar f = this.fields_dict[key];\n\t\t\tif(f && f.set_input) {\n\t\t\t\tf.set_input(f.df['default'] || '');\n\t\t\t}\n\t\t}\n\t},\n\tset_df_property: function (fieldname, prop, value) {\n\t\tconst field = this.get_field(fieldname);\n\t\tfield.df[prop] = value;\n\t\tfield.refresh();\n\t}\n});\n","// Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors\n// MIT License. See license.txt\n\nfrappe.ui.form.LinkSelector = Class.extend({\n\tinit: function (opts) {\n\t\t/* help: Options: doctype, get_query, target */\n\t\t$.extend(this, opts);\n\n\t\tvar me = this;\n\t\tif (this.doctype != \"[Select]\") {\n\t\t\tfrappe.model.with_doctype(this.doctype, function (r) {\n\t\t\t\tme.make();\n\t\t\t});\n\t\t} else {\n\t\t\tthis.make();\n\t\t}\n\t},\n\tmake: function () {\n\t\tvar me = this;\n\n\t\tthis.start = 0;\n\t\tthis.dialog = new frappe.ui.Dialog({\n\t\t\ttitle: __(\"Select {0}\", [(this.doctype == '[Select]') ? __(\"value\") : __(this.doctype)]),\n\t\t\tfields: [\n\t\t\t\t{\n\t\t\t\t\tfieldtype: \"Data\", fieldname: \"txt\", label: __(\"Beginning with\"),\n\t\t\t\t\tdescription: __(\"You can use wildcard %\"),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfieldtype: \"HTML\", fieldname: \"results\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tfieldtype: \"Button\", fieldname: \"more\", label: __(\"More\"), click: () => {\n\t\t\t\t\t\tme.start += 20;\n\t\t\t\t\t\tme.search();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t],\n\t\t\tprimary_action_label: __(\"Search\"),\n\t\t\tprimary_action: function () {\n\t\t\t\tme.start = 0;\n\t\t\t\tme.search();\n\t\t\t}\n\t\t});\n\n\t\tif (this.txt)\n\t\t\tthis.dialog.fields_dict.txt.set_input(this.txt);\n\n\t\tthis.dialog.get_input(\"txt\").on(\"keypress\", function (e) {\n\t\t\tif (e.which === 13) {\n\t\t\t\tme.start = 0;\n\t\t\t\tme.search();\n\t\t\t}\n\t\t});\n\t\tthis.dialog.show();\n\t\tthis.search();\n\t},\n\tsearch: function () {\n\t\tvar args = {\n\t\t\ttxt: this.dialog.fields_dict.txt.get_value(),\n\t\t\tsearchfield: \"name\",\n\t\t\tstart: this.start\n\t\t};\n\t\tvar me = this;\n\n\t\tif (this.target.set_custom_query) {\n\t\t\tthis.target.set_custom_query(args);\n\t\t}\n\n\t\t// load custom query from grid\n\t\tif (this.target.is_grid && this.target.fieldinfo[this.fieldname]\n\t\t\t&& this.target.fieldinfo[this.fieldname].get_query) {\n\t\t\t$.extend(args,\n\t\t\t\tthis.target.fieldinfo[this.fieldname].get_query(cur_frm.doc));\n\t\t}\n\n\t\tfrappe.link_search(this.doctype, args, function (r) {\n\t\t\tvar parent = me.dialog.fields_dict.results.$wrapper;\n\t\t\tif (args.start === 0) {\n\t\t\t\tparent.empty();\n\t\t\t}\n\n\t\t\tif (r.values.length) {\n\t\t\t\t$.each(r.values, function (i, v) {\n\t\t\t\t\tvar row = $(repl('
\\\n\t\t\t\t\t\t
\\\n\t\t\t\t\t\t\t%(name)s
\\\n\t\t\t\t\t\t
\\\n\t\t\t\t\t\t\t%(values)s
\\\n\t\t\t\t\t\t
', {\n\t\t\t\t\t\t\tname: v[0],\n\t\t\t\t\t\t\tvalues: v.splice(1).join(\", \")\n\t\t\t\t\t\t})).appendTo(parent);\n\n\t\t\t\t\trow.find(\"a\")\n\t\t\t\t\t\t.attr('data-value', v[0])\n\t\t\t\t\t\t.click(function () {\n\t\t\t\t\t\t\tvar value = $(this).attr(\"data-value\");\n\t\t\t\t\t\t\tvar $link = this;\n\t\t\t\t\t\t\tif (me.target.is_grid) {\n\t\t\t\t\t\t\t\t// set in grid\n\t\t\t\t\t\t\t\tme.set_in_grid(value);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (me.target.doctype)\n\t\t\t\t\t\t\t\t\tme.target.parse_validate_and_set_in_model(value);\n\t\t\t\t\t\t\t\telse {\n\t\t\t\t\t\t\t\t\tme.target.set_input(value);\n\t\t\t\t\t\t\t\t\tme.target.$input.trigger(\"change\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tme.dialog.hide();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t})\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\t$('


' + __(\"No Results\") + ''\n\t\t\t\t\t+ (frappe.model.can_create(me.doctype) ?\n\t\t\t\t\t\t('

'\n\t\t\t\t\t\t\t+ __('Create a new {0}', [__(me.doctype)]) + \"\") : '')\n\t\t\t\t\t+ '

').appendTo(parent).find(\".new-doc\").click(function () {\n\t\t\t\t\t\tfrappe.new_doc(me.doctype);\n\t\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (r.values.length < 20) {\n\t\t\t\tvar more_btn = me.dialog.fields_dict.more.$wrapper;\n\t\t\t\tmore_btn.hide();\n\t\t\t}\n\n\t\t}, this.dialog.get_primary_btn());\n\n\t},\n\tset_in_grid: function (value) {\n\t\tvar me = this, updated = false;\n\t\tvar d = null;\n\t\tif (this.qty_fieldname) {\n\t\t\tfrappe.prompt({\n\t\t\t\tfieldname: \"qty\", fieldtype: \"Float\", label: \"Qty\",\n\t\t\t\t\"default\": 1, reqd: 1\n\t\t\t}, function (data) {\n\t\t\t\t$.each(me.target.frm.doc[me.target.df.fieldname] || [], function (i, d) {\n\t\t\t\t\tif (d[me.fieldname] === value) {\n\t\t\t\t\t\tfrappe.model.set_value(d.doctype, d.name, me.qty_fieldname, data.qty);\n\t\t\t\t\t\tfrappe.show_alert(__(\"Added {0} ({1})\", [value, d[me.qty_fieldname]]));\n\t\t\t\t\t\tupdated = true;\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (!updated) {\n\t\t\t\t\tfrappe.run_serially([\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\td = me.target.add_new_row();\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => frappe.timeout(0.1),\n\t\t\t\t\t\t() => {\n\t\t\t\t\t\t\tlet args = {};\n\t\t\t\t\t\t\targs[me.fieldname] = value;\n\t\t\t\t\t\t\targs[me.qty_fieldname] = data.qty;\n\n\t\t\t\t\t\t\treturn frappe.model.set_value(d.doctype, d.name, args);\n\t\t\t\t\t\t},\n\t\t\t\t\t\t() => frappe.show_alert(__(\"Added {0} ({1})\", [value, data.qty]))\n\t\t\t\t\t]);\n\t\t\t\t}\n\t\t\t}, __(\"Set Quantity\"), __(\"Set\"));\n\t\t} else if (me.dynamic_link_field) {\n\t\t\tvar d = me.target.add_new_row();\n\t\t\tfrappe.model.set_value(d.doctype, d.name, me.dynamic_link_field, me.dynamic_link_reference);\n\t\t\tfrappe.model.set_value(d.doctype, d.name, me.fieldname, value);\n\t\t\tfrappe.show_alert(__(\"{0} {1} added\", [me.dynamic_link_reference, value]));\n\t\t} else {\n\t\t\tvar d = me.target.add_new_row();\n\t\t\tfrappe.model.set_value(d.doctype, d.name, me.fieldname, value);\n\t\t\tfrappe.show_alert(__(\"{0} added\", [value]));\n\t\t}\n\t}\n});\n\nfrappe.link_search = function (doctype, args, callback, btn) {\n\tif (!args) {\n\t\targs = {\n\t\t\ttxt: ''\n\t\t}\n\t}\n\targs.doctype = doctype;\n\tif (!args.searchfield) {\n\t\targs.searchfield = 'name';\n\t}\n\n\tfrappe.call({\n\t\tmethod: \"frappe.desk.search.search_widget\",\n\t\ttype: \"GET\",\n\t\targs: args,\n\t\tcallback: function (r) {\n\t\t\tcallback && callback(r);\n\t\t},\n\t\tbtn: btn\n\t});\n}\n\n","frappe.ui.form.MultiSelectDialog = class MultiSelectDialog {\n\tconstructor(opts) {\n\t\t/* Options: doctype, target, setters, get_query, action, add_filters_group, data_fields, primary_action_label */\n\t\tObject.assign(this, opts);\n\t\tthis.for_select = this.doctype == \"[Select]\";\n\t\tif (!this.for_select) {\n\t\t\tfrappe.model.with_doctype(this.doctype, () => this.init());\n\t\t} else {\n\t\t\tthis.init();\n\t\t}\n\t}\n\n\tinit() {\n\t\tthis.page_length = 20;\n\t\tthis.child_page_length = 20;\n\t\tthis.fields = this.get_fields();\n\n\t\tthis.make();\n\t}\n\n\tget_fields() {\n\t\tconst primary_fields = this.get_primary_filters();\n\t\tconst result_fields = this.get_result_fields();\n\t\tconst data_fields = this.get_data_fields();\n\t\tconst child_selection_fields = this.get_child_selection_fields();\n\n\t\treturn [...primary_fields, ...result_fields, ...data_fields, ...child_selection_fields];\n\t}\n\n\tget_result_fields() {\n\t\tconst show_next_page = () => {\n\t\t\tthis.page_length += 20;\n\t\t\tthis.get_results();\n\t\t};\n\t\treturn [\n\t\t\t{\n\t\t\t\tfieldtype: \"HTML\", fieldname: \"results_area\"\n\t\t\t},\n\t\t\t{\n\t\t\t\tfieldtype: \"Button\", fieldname: \"more_btn\",\n\t\t\t\tlabel: __(\"More\"), click: show_next_page.bind(this)\n\t\t\t}\n\t\t];\n\t}\n\n\tget_data_fields() {\n\t\tif (this.data_fields && this.data_fields.length) {\n\t\t\t// Custom Data Fields\n\t\t\treturn [\n\t\t\t\t{ fieldtype: \"Section Break\" },\n\t\t\t\t...this.data_fields\n\t\t\t];\n\t\t} else {\n\t\t\treturn [];\n\t\t}\n\t}\n\n\tget_child_selection_fields() {\n\t\tconst fields = [];\n\t\tif (this.allow_child_item_selection && this.child_fieldname) {\n\t\t\tconst show_more_child_results = () => {\n\t\t\t\tthis.child_page_length += 20;\n\t\t\t\tthis.show_child_results();\n\t\t\t};\n\t\t\tfields.push({ fieldtype: \"HTML\", fieldname: \"child_selection_area\" });\n\t\t\tfields.push({\n\t\t\t\tfieldtype: \"Button\", fieldname: \"more_child_btn\", hidden: 1,\n\t\t\t\tlabel: __(\"More\"), click: show_more_child_results.bind(this)\n\t\t\t});\n\t\t}\n\t\treturn fields;\n\t}\n\n\tmake() {\n\t\tlet doctype_plural = this.doctype.plural();\n\t\tlet title = __(\"Select {0}\", [this.for_select ? __(\"value\") : __(doctype_plural)]);\n\n\t\tthis.dialog = new frappe.ui.Dialog({\n\t\t\ttitle: title,\n\t\t\tfields: this.fields,\n\t\t\tsize: this.size,\n\t\t\tprimary_action_label: this.primary_action_label || __(\"Get Items\"),\n\t\t\tsecondary_action_label: __(\"Make {0}\", [__(this.doctype)]),\n\t\t\tprimary_action: () => {\n\t\t\t\tlet filters_data = this.get_custom_filters();\n\t\t\t\tconst data_values = cur_dialog.get_values(); // to pass values of data fields\n\t\t\t\tconst filtered_children = this.get_selected_child_names();\n\t\t\t\tconst selected_documents = [...this.get_checked_values(), ...this.get_parent_name_of_selected_children()];\n\t\t\t\tthis.action(selected_documents, {\n\t\t\t\t\t...this.args,\n\t\t\t\t\t...data_values,\n\t\t\t\t\t...filters_data,\n\t\t\t\t\tfiltered_children\n\t\t\t\t});\n\t\t\t},\n\t\t\tsecondary_action: this.make_new_document.bind(this)\n\t\t});\n\n\t\tif (this.add_filters_group) {\n\t\t\tthis.make_filter_area();\n\t\t}\n\n\t\tthis.args = {};\n\n\t\tthis.setup_results();\n\t\tthis.bind_events();\n\t\tthis.get_results();\n\t\tthis.dialog.show();\n\t}\n\n\tmake_new_document(e) {\n\t\t// If user wants to close the modal\n\t\tif (e) {\n\t\t\tthis.set_route_options();\n\t\t\tfrappe.new_doc(this.doctype, true);\n\t\t}\n\t}\n\n\tset_route_options() {\n\t\t// set route options to get pre-filled form fields\n\t\tfrappe.route_options = {};\n\t\tif (Array.isArray(this.setters)) {\n\t\t\tfor (let df of this.setters) {\n\t\t\t\tfrappe.route_options[df.fieldname] = this.dialog.fields_dict[df.fieldname].get_value() || undefined;\n\t\t\t}\n\t\t} else {\n\t\t\tObject.keys(this.setters).forEach(setter => {\n\t\t\t\tfrappe.route_options[setter] = this.dialog.fields_dict[setter].get_value() || undefined;\n\t\t\t});\n\t\t}\n\t}\n\n\tsetup_results() {\n\t\tthis.$parent = $(this.dialog.body);\n\t\tthis.$wrapper = this.dialog.fields_dict.results_area.$wrapper.append(`
`);\n\n\t\tthis.$results = this.$wrapper.find('.results');\n\t\tthis.$results.append(this.make_list_row());\n\t}\n\n\tshow_child_results() {\n\t\tthis.get_child_result().then(r => {\n\t\t\tthis.child_results = r.message || [];\n\t\t\tthis.render_child_datatable();\n\n\t\t\tthis.$wrapper.addClass('hidden');\n\t\t\tthis.$child_wrapper.removeClass('hidden');\n\t\t\tthis.dialog.fields_dict.more_btn.$wrapper.hide();\n\t\t});\n\t}\n\n\ttoggle_child_selection() {\n\t\tif (this.dialog.fields_dict['allow_child_item_selection'].get_value()) {\n\t\t\tthis.show_child_results();\n\t\t} else {\n\t\t\tthis.child_results = [];\n\t\t\tthis.get_results();\n\t\t\tthis.$wrapper.removeClass('hidden');\n\t\t\tthis.$child_wrapper.addClass('hidden');\n\t\t}\n\t}\n\n\trender_child_datatable() {\n\t\tif (!this.child_datatable) {\n\t\t\tthis.setup_child_datatable();\n\t\t} else {\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis.child_datatable.rowmanager.checkMap = [];\n\t\t\t\tthis.child_datatable.refresh(this.get_child_datatable_rows());\n\t\t\t\tthis.$child_wrapper.find('.dt-scrollable').css('height', '300px');\n\t\t\t\tthis.$child_wrapper.find('.dt-scrollable').css('overflow-y', 'scroll');\n\t\t\t}, 500);\n\t\t}\n\t}\n\n\tget_child_datatable_columns() {\n\t\tconst parent = this.doctype;\n\t\treturn [parent, ...this.child_columns].map(d => ({ name: frappe.unscrub(d), editable: false }));\n\t}\n\n\tget_child_datatable_rows() {\n\t\tif (this.child_results.length > this.child_page_length) {\n\t\t\tthis.dialog.fields_dict.more_child_btn.toggle(true);\n\t\t} else {\n\t\t\tthis.dialog.fields_dict.more_child_btn.toggle(false);\n\t\t}\n\t\treturn this.child_results\n\t\t\t.slice(0, this.child_page_length)\n\t\t\t.map(d => Object.values(d).slice(1)); // slice name field\n\t}\n\n\tsetup_child_datatable() {\n\t\tconst header_columns = this.get_child_datatable_columns();\n\t\tconst rows = this.get_child_datatable_rows();\n\t\tthis.$child_wrapper = this.dialog.fields_dict.child_selection_area.$wrapper;\n\t\tthis.$child_wrapper.addClass('my-3');\n\n\t\tthis.child_datatable = new frappe.DataTable(this.$child_wrapper.get(0), {\n\t\t\tcolumns: header_columns,\n\t\t\tdata: rows,\n\t\t\tlayout: 'fluid',\n\t\t\tinlineFilters: true,\n\t\t\tserialNoColumn: false,\n\t\t\tcheckboxColumn: true,\n\t\t\tcellHeight: 35,\n\t\t\tnoDataMessage: __('No Data'),\n\t\t\tdisableReorderColumn: true\n\t\t});\n\t\tthis.$child_wrapper.find('.dt-scrollable').css('height', '300px');\n\t}\n\n\tget_primary_filters() {\n\t\tlet fields = [];\n\n\t\tlet columns = new Array(3);\n\n\t\t// Hack for three column layout\n\t\t// To add column break\n\t\tcolumns[0] = [\n\t\t\t{\n\t\t\t\tfieldtype: \"Data\",\n\t\t\t\tlabel: __(\"Name\"),\n\t\t\t\tfieldname: \"search_term\"\n\t\t\t}\n\t\t];\n\t\tcolumns[1] = [];\n\t\tcolumns[2] = [];\n\n\t\tif ($.isArray(this.setters)) {\n\t\t\tthis.setters.forEach((setter, index) => {\n\t\t\t\tcolumns[(index + 1) % 3].push(setter);\n\t\t\t});\n\t\t} else {\n\t\t\tObject.keys(this.setters).forEach((setter, index) => {\n\t\t\t\tlet df_prop = frappe.meta.docfield_map[this.doctype][setter];\n\n\t\t\t\t// Index + 1 to start filling from index 1\n\t\t\t\t// Since Search is a standrd field already pushed\n\t\t\t\tcolumns[(index + 1) % 3].push({\n\t\t\t\t\tfieldtype: df_prop.fieldtype,\n\t\t\t\t\tlabel: df_prop.label,\n\t\t\t\t\tfieldname: setter,\n\t\t\t\t\toptions: df_prop.options,\n\t\t\t\t\tdefault: this.setters[setter]\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal\n\t\tif (Object.seal) {\n\t\t\tObject.seal(columns);\n\t\t\t// now a is a fixed-size array with mutable entries\n\t\t}\n\n\t\tif (this.allow_child_item_selection) {\n\t\t\tthis.child_doctype = frappe.meta.get_docfield(this.doctype, this.child_fieldname).options;\n\t\t\tcolumns[0].push({\n\t\t\t\tfieldtype: \"Check\",\n\t\t\t\tlabel: __(\"Select {0}\", [this.child_doctype]),\n\t\t\t\tfieldname: \"allow_child_item_selection\",\n\t\t\t\tonchange: this.toggle_child_selection.bind(this)\n\t\t\t});\n\t\t}\n\n\t\tfields = [\n\t\t\t...columns[0],\n\t\t\t{ fieldtype: \"Column Break\" },\n\t\t\t...columns[1],\n\t\t\t{ fieldtype: \"Column Break\" },\n\t\t\t...columns[2],\n\t\t\t{ fieldtype: \"Section Break\", fieldname: \"primary_filters_sb\" }\n\t\t];\n\n\t\tif (this.add_filters_group) {\n\t\t\tfields.push(\n\t\t\t\t{\n\t\t\t\t\tfieldtype: 'HTML',\n\t\t\t\t\tfieldname: 'filter_area',\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\treturn fields;\n\t}\n\n\tmake_filter_area() {\n\t\tthis.filter_group = new frappe.ui.FilterGroup({\n\t\t\tparent: this.dialog.get_field('filter_area').$wrapper,\n\t\t\tdoctype: this.doctype,\n\t\t\ton_change: () => {\n\t\t\t\tthis.get_results();\n\t\t\t}\n\t\t});\n\t\t// 'Apply Filter' breaks since the filers are not in a popover\n\t\t// Hence keeping it hidden\n\t\tthis.filter_group.wrapper.find('.apply-filters').hide();\n\t}\n\n\tget_custom_filters() {\n\t\tif (this.add_filters_group && this.filter_group) {\n\t\t\treturn this.filter_group.get_filters().reduce((acc, filter) => {\n\t\t\t\treturn Object.assign(acc, {\n\t\t\t\t\t[filter[1]]: [filter[2], filter[3]]\n\t\t\t\t});\n\t\t\t}, {});\n\t\t} else {\n\t\t\treturn {};\n\t\t}\n\t}\n\n\tbind_events() {\n\t\tlet me = this;\n\n\t\tthis.$results.on('click', '.list-item-container', function (e) {\n\t\t\tif (!$(e.target).is(':checkbox') && !$(e.target).is('a')) {\n\t\t\t\t$(this).find(':checkbox').trigger('click');\n\t\t\t}\n\t\t});\n\n\t\tthis.$results.on('click', '.list-item--head :checkbox', (e) => {\n\t\t\tthis.$results.find('.list-item-container .list-row-check')\n\t\t\t\t.prop(\"checked\", ($(e.target).is(':checked')));\n\t\t});\n\n\t\tthis.$parent.find('.input-with-feedback').on('change', () => {\n\t\t\tfrappe.flags.auto_scroll = false;\n\t\t\tthis.get_results();\n\t\t});\n\n\t\tthis.$parent.find('[data-fieldtype=\"Data\"]').on('input', () => {\n\t\t\tvar $this = $(this);\n\t\t\tclearTimeout($this.data('timeout'));\n\t\t\t$this.data('timeout', setTimeout(function () {\n\t\t\t\tfrappe.flags.auto_scroll = false;\n\t\t\t\tme.empty_list();\n\t\t\t\tme.get_results();\n\t\t\t}, 300));\n\t\t});\n\t}\n\n\tget_parent_name_of_selected_children() {\n\t\tif (!this.child_datatable || !this.child_datatable.datamanager.rows.length) return [];\n\n\t\tlet parent_names = this.child_datatable.rowmanager.checkMap.reduce((parent_names, checked, index) => {\n\t\t\tif (checked == 1) {\n\t\t\t\tconst parent_name = this.child_results[index].parent;\n\t\t\t\tif (!parent_names.includes(parent_name)) {\n\t\t\t\t\tparent_names.push(parent_name);\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn parent_names;\n\t\t}, []);\n\n\t\treturn parent_names;\n\t}\n\n\tget_selected_child_names() {\n\t\tif (!this.child_datatable || !this.child_datatable.datamanager.rows.length) return [];\n\n\t\tlet checked_names = this.child_datatable.rowmanager.checkMap.reduce((checked_names, checked, index) => {\n\t\t\tif (checked == 1) {\n\t\t\t\tconst child_row_name = this.child_results[index].name;\n\t\t\t\tchecked_names.push(child_row_name);\n\t\t\t}\n\t\t\treturn checked_names;\n\t\t}, []);\n\n\t\treturn checked_names;\n\t}\n\n\tget_checked_values() {\n\t\t// Return name of checked value.\n\t\treturn this.$results.find('.list-item-container').map(function () {\n\t\t\tif ($(this).find('.list-row-check:checkbox:checked').length > 0) {\n\t\t\t\treturn $(this).attr('data-item-name');\n\t\t\t}\n\t\t}).get();\n\t}\n\n\tget_checked_items() {\n\t\t// Return checked items with all the column values.\n\t\tlet checked_values = this.get_checked_values();\n\t\treturn this.results.filter(res => checked_values.includes(res.name));\n\t}\n\n\tmake_list_row(result = {}) {\n\t\tvar me = this;\n\t\t// Make a head row by default (if result not passed)\n\t\tlet head = Object.keys(result).length === 0;\n\n\t\tlet contents = ``;\n\t\tlet columns = [\"name\"];\n\n\t\tif ($.isArray(this.setters)) {\n\t\t\tfor (let df of this.setters) {\n\t\t\t\tcolumns.push(df.fieldname);\n\t\t\t}\n\t\t} else {\n\t\t\tcolumns = columns.concat(Object.keys(this.setters));\n\t\t}\n\n\t\tcolumns.forEach(function (column) {\n\t\t\tcontents += `
\n\t\t\t\t${\n\thead ? `${__(frappe.model.unscrub(column))}`\n\t\t: (column !== \"name\" ? `${__(result[column] || '')}`\n\t\t\t: `\n\t\t\t\t\t\t\t${__(result[column] || '')}`)}\n\t\t\t
`;\n\t\t});\n\n\t\tlet $row = $(`
\n\t\t\t
\n\t\t\t\t\n\t\t\t
\n\t\t\t${contents}\n\t\t
`);\n\n\t\thead ? $row.addClass('list-item--head')\n\t\t\t: $row = $(`
`).append($row);\n\n\t\treturn $row;\n\t}\n\n\trender_result_list(results, more = 0, empty = true) {\n\t\tvar me = this;\n\t\tvar more_btn = me.dialog.fields_dict.more_btn.$wrapper;\n\n\t\t// Make empty result set if filter is set\n\t\tif (!frappe.flags.auto_scroll && empty) {\n\t\t\tthis.empty_list();\n\t\t}\n\t\tmore_btn.hide();\n\t\t$(\".modal-dialog .list-item--head\").css(\"z-index\", 1);\n\n\t\tif (results.length === 0) return;\n\t\tif (more) more_btn.show();\n\n\t\tlet checked = this.get_checked_values();\n\n\t\tresults\n\t\t\t.filter(result => !checked.includes(result.name))\n\t\t\t.forEach(result => {\n\t\t\t\tme.$results.append(me.make_list_row(result));\n\t\t\t});\n\n\t\tthis.$results.find(\".list-item--head\").css(\"z-index\", 1);\n\n\t\tif (frappe.flags.auto_scroll) {\n\t\t\tthis.$results.animate({ scrollTop: me.$results.prop('scrollHeight') }, 500);\n\t\t}\n\t}\n\n\tempty_list() {\n\t\t// Store all checked items\n\t\tlet checked = this.get_checked_items().map(item => {\n\t\t\treturn {\n\t\t\t\t...item,\n\t\t\t\tchecked: true\n\t\t\t};\n\t\t});\n\n\t\t// Remove **all** items\n\t\tthis.$results.find('.list-item-container').remove();\n\n\t\t// Rerender checked items\n\t\tthis.render_result_list(checked, 0, false);\n\t}\n\n\tget_filters_from_setters() {\n\t\tlet me = this;\n\t\tlet filters = this.get_query ? this.get_query().filters : {} || {};\n\t\tlet filter_fields = [];\n\n\t\tif ($.isArray(this.setters)) {\n\t\t\tfor (let df of this.setters) {\n\t\t\t\tfilters[df.fieldname] = me.dialog.fields_dict[df.fieldname].get_value() || undefined;\n\t\t\t\tme.args[df.fieldname] = filters[df.fieldname];\n\t\t\t\tfilter_fields.push(df.fieldname);\n\t\t\t}\n\t\t} else {\n\t\t\tObject.keys(this.setters).forEach(function (setter) {\n\t\t\t\tvar value = me.dialog.fields_dict[setter].get_value();\n\t\t\t\tif (me.dialog.fields_dict[setter].df.fieldtype == \"Data\" && value) {\n\t\t\t\t\tfilters[setter] = [\"like\", \"%\" + value + \"%\"];\n\t\t\t\t} else {\n\t\t\t\t\tfilters[setter] = value || undefined;\n\t\t\t\t\tme.args[setter] = filters[setter];\n\t\t\t\t\tfilter_fields.push(setter);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn [filters, filter_fields];\n\t}\n\n\tget_args_for_search() {\n\t\tlet [filters, filter_fields] = this.get_filters_from_setters();\n\n\t\tlet custom_filters = this.get_custom_filters();\n\t\tObject.assign(filters, custom_filters);\n\n\t\treturn {\n\t\t\tdoctype: this.doctype,\n\t\t\ttxt: this.dialog.fields_dict[\"search_term\"].get_value(),\n\t\t\tfilters: filters,\n\t\t\tfilter_fields: filter_fields,\n\t\t\tpage_length: this.page_length + 5,\n\t\t\tquery: this.get_query ? this.get_query().query : '',\n\t\t\tas_dict: 1\n\t\t};\n\t}\n\n\tasync perform_search(args) {\n\t\tconst res = await frappe.call({\n\t\t\ttype: \"GET\",\n\t\t\tmethod: 'frappe.desk.search.search_widget',\n\t\t\tno_spinner: true,\n\t\t\targs: args,\n\t\t});\n\t\tconst more = res.values.length && res.values.length > this.page_length ? 1 : 0;\n\n\t\treturn [res, more];\n\t}\n\n\tasync get_results() {\n\t\tconst args = this.get_args_for_search();\n\t\tconst [res, more] = await this.perform_search(args);\n\n\t\tif (more) {\n\t\t\tres.values = res.values.splice(0, this.page_length);\n\t\t}\n\n\t\tthis.results = [];\n\t\tif (res.values.length) {\n\t\t\tres.values.forEach(result => {\n\t\t\t\tresult.checked = 0;\n\t\t\t\tthis.results.push(result);\n\t\t\t});\n\t\t}\n\t\tthis.render_result_list(this.results, more);\n\t}\n\n\tasync get_filtered_parents_for_child_search() {\n\t\tconst parent_search_args = this.get_args_for_search();\n\t\tparent_search_args.filter_fields = ['name'];\n\t\t// eslint-disable-next-line no-unused-vars\n\t\tconst [response, _] = await this.perform_search(parent_search_args);\n\n\t\tlet parent_names = [];\n\t\tif (response.values.length) {\n\t\t\tparent_names = response.values.map(v => v.name);\n\t\t}\n\t\treturn parent_names;\n\t}\n\n\tasync add_parent_filters(filters) {\n\t\tconst parent_names = await this.get_filtered_parents_for_child_search();\n\t\tif (parent_names.length) {\n\t\t\tfilters.push([ \"parent\", \"in\", parent_names ]);\n\t\t}\n\t}\n\n\tadd_custom_child_filters(filters) {\n\t\tif (this.add_filters_group && this.filter_group) {\n\t\t\tthis.filter_group.get_filters().forEach(filter => {\n\t\t\t\tif (filter[0] == this.child_doctype) {\n\t\t\t\t\tfilters.push([filter[1], filter[2], filter[3]]);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tasync get_child_result() {\n\t\tlet filters = [[\"parentfield\", \"=\", this.child_fieldname]];\n\n\t\tawait this.add_parent_filters(filters);\n\t\tthis.add_custom_child_filters(filters);\n\n\t\treturn frappe.call({\n\t\t\tmethod: \"frappe.client.get_list\",\n\t\t\targs: {\n\t\t\t\tdoctype: this.child_doctype,\n\t\t\t\tfilters: filters,\n\t\t\t\tfields: ['name', 'parent', ...this.child_columns],\n\t\t\t\tparent: this.doctype,\n\t\t\t\tlimit_page_length: this.child_page_length + 5,\n\t\t\t\torder_by: 'parent'\n\t\t\t}\n\t\t});\n\t}\n};\n","\nimport './field_group';\nimport '../dom';\n\nfrappe.provide('frappe.ui');\n\nwindow.cur_dialog = null;\n\nfrappe.ui.open_dialogs = [];\n\nfrappe.ui.Dialog = class Dialog extends frappe.ui.FieldGroup {\n\tconstructor(opts) {\n\t\tsuper();\n\t\tthis.display = false;\n\t\tthis.is_dialog = true;\n\n\t\t$.extend(this, { animate: true, size: null }, opts);\n\t\tthis.make();\n\t}\n\n\tmake() {\n\t\tthis.$wrapper = frappe.get_modal(\"\", \"\");\n\n\t\tif(this.static) {\n\t\t\tthis.$wrapper.modal({\n\t\t\t\tbackdrop: 'static',\n\t\t\t\tkeyboard: false\n\t\t\t});\n\t\t\tthis.get_close_btn().hide();\n\t\t}\n\n\t\tthis.wrapper = this.$wrapper.find('.modal-dialog')\n\t\t\t.get(0);\n\t\tif (this.size == \"small\" )\n\t\t\t$(this.wrapper).addClass(\"modal-sm\");\n\t\telse if (this.size == \"large\" )\n\t\t\t$(this.wrapper).addClass(\"modal-lg\");\n\t\telse if (this.size == \"extra-large\" )\n\t\t\t$(this.wrapper).addClass(\"modal-xl\");\n\n\t\tthis.make_head();\n\t\tthis.modal_body = this.$wrapper.find(\".modal-body\");\n\t\tthis.$body = $('
').appendTo(this.modal_body);\n\t\tthis.body = this.$body.get(0);\n\t\tthis.$message = $('
').appendTo(this.modal_body);\n\t\tthis.header = this.$wrapper.find(\".modal-header\");\n\t\tthis.footer = this.$wrapper.find(\".modal-footer\");\n\t\tthis.standard_actions = this.footer.find('.standard-actions');\n\t\tthis.custom_actions = this.footer.find('.custom-actions');\n\t\tthis.set_indicator();\n\n\t\t// make fields (if any)\n\t\tsuper.make();\n\n\t\tthis.refresh_section_collapse();\n\n\t\t// show footer\n\t\tthis.action = this.action || { primary: { }, secondary: { } };\n\t\tif (this.primary_action || (this.action.primary && this.action.primary.onsubmit)) {\n\t\t\tthis.set_primary_action(\n\t\t\t\tthis.primary_action_label || this.action.primary.label || __(\"Submit\", null, \"Primary action in dialog\"),\n\t\t\t\tthis.primary_action || this.action.primary.onsubmit\n\t\t\t);\n\t\t}\n\n\t\tif (this.secondary_action) {\n\t\t\tthis.set_secondary_action(this.secondary_action);\n\t\t}\n\n\t\tif (this.secondary_action_label || (this.action.secondary && this.action.secondary.label)) {\n\t\t\tthis.set_secondary_action_label(this.secondary_action_label || this.action.secondary.label);\n\t\t}\n\n\t\tif (this.minimizable) {\n\t\t\tthis.header.find('.title-section').click(() => this.is_minimized && this.toggle_minimize());\n\t\t\tthis.get_minimize_btn().removeClass('hide').on('click', () => this.toggle_minimize());\n\t\t}\n\n\t\tvar me = this;\n\t\tthis.$wrapper\n\t\t\t.on(\"hide.bs.modal\", function() {\n\t\t\t\tme.display = false;\n\t\t\t\tme.is_minimized = false;\n\t\t\t\tme.hide_scrollbar(false);\n\n\t\t\t\tif(frappe.ui.open_dialogs[frappe.ui.open_dialogs.length-1]===me) {\n\t\t\t\t\tfrappe.ui.open_dialogs.pop();\n\t\t\t\t\tif(frappe.ui.open_dialogs.length) {\n\t\t\t\t\t\twindow.cur_dialog = frappe.ui.open_dialogs[frappe.ui.open_dialogs.length-1];\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.cur_dialog = null;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tme.onhide && me.onhide();\n\t\t\t\tme.on_hide && me.on_hide();\n\t\t\t})\n\t\t\t.on(\"shown.bs.modal\", function() {\n\t\t\t\t// focus on first input\n\t\t\t\tme.display = true;\n\t\t\t\twindow.cur_dialog = me;\n\t\t\t\tfrappe.ui.open_dialogs.push(me);\n\t\t\t\tme.focus_on_first_input();\n\t\t\t\tme.hide_scrollbar(true);\n\t\t\t\tme.on_page_show && me.on_page_show();\n\t\t\t\t$(document).trigger('frappe.ui.Dialog:shown');\n\t\t\t\t$(document).off('focusin.modal');\n\t\t\t})\n\t\t\t.on('scroll', function() {\n\t\t\t\tvar $input = $('input:focus');\n\t\t\t\tif ($input.length && ['Date', 'Datetime', 'Time'].includes($input.attr('data-fieldtype'))) {\n\t\t\t\t\t$input.blur();\n\t\t\t\t}\n\t\t\t});\n\n\t}\n\n\tget_primary_btn() {\n\t\treturn this.standard_actions.find(\".btn-primary\");\n\t}\n\n\tget_minimize_btn() {\n\t\treturn this.$wrapper.find(\".modal-header .btn-modal-minimize\");\n\t}\n\n\tset_message(text) {\n\t\tthis.$message.removeClass('hide');\n\t\tthis.$body.addClass('hide');\n\t\tthis.$message.text(text);\n\t}\n\n\tclear_message() {\n\t\tthis.$message.addClass('hide');\n\t\tthis.$body.removeClass('hide');\n\t}\n\n\tclear() {\n\t\tsuper.clear();\n\t\tthis.clear_message();\n\t}\n\n\tset_primary_action(label, click) {\n\t\tthis.footer.removeClass('hide');\n\t\tthis.has_primary_action = true;\n\t\tvar me = this;\n\t\treturn this.get_primary_btn()\n\t\t\t.removeClass(\"hide\")\n\t\t\t.html(label)\n\t\t\t.click(function() {\n\t\t\t\tme.primary_action_fulfilled = true;\n\t\t\t\t// get values and send it\n\t\t\t\t// as first parameter to click callback\n\t\t\t\t// if no values then return\n\t\t\t\tvar values = me.get_values();\n\t\t\t\tif(!values) return;\n\t\t\t\tclick && click.apply(me, [values]);\n\t\t\t});\n\t}\n\n\tset_secondary_action(click) {\n\t\tthis.footer.removeClass('hide');\n\t\tthis.get_secondary_btn().removeClass('hide').off('click').on('click', click);\n\t}\n\n\tset_secondary_action_label(label) {\n\t\tthis.get_secondary_btn()\n\t\t\t.removeClass(\"hide\")\n\t\t\t.html(label);\n\t}\n\n\tdisable_primary_action() {\n\t\tthis.get_primary_btn().addClass('disabled');\n\t}\n\n\tenable_primary_action() {\n\t\tthis.get_primary_btn().removeClass('disabled');\n\t}\n\n\tmake_head() {\n\t\tthis.set_title(this.title);\n\t}\n\n\tset_title(t) {\n\t\tthis.$wrapper.find(\".modal-title\").html(t);\n\t}\n\n\tset_indicator() {\n\t\tif (this.indicator) {\n\t\t\tthis.header.find('.indicator').removeClass().addClass('indicator ' + this.indicator);\n\t\t}\n\t}\n\n\tshow() {\n\t\t// show it\n\t\tif (this.animate) {\n\t\t\tthis.$wrapper.addClass('fade');\n\t\t} else {\n\t\t\tthis.$wrapper.removeClass('fade');\n\t\t}\n\t\tthis.$wrapper.modal(\"show\");\n\n\t\tthis.$wrapper.removeClass('modal-minimize');\n\n\t\tif (this.minimizable && this.is_minimized) {\n\t\t\t$(\".modal-backdrop\").toggle();\n\t\t\tthis.is_minimized = false;\n\t\t}\n\n\t\t// clear any message\n\t\tthis.clear_message();\n\n\t\tthis.primary_action_fulfilled = false;\n\t\tthis.is_visible = true;\n\t\treturn this;\n\t}\n\n\thide() {\n\t\tthis.$wrapper.modal(\"hide\");\n\t\tthis.is_visible = false;\n\t}\n\n\tget_close_btn() {\n\t\treturn this.$wrapper.find(\".btn-modal-close\");\n\t}\n\n\tget_secondary_btn() {\n\t\treturn this.standard_actions.find(\".btn-modal-secondary\");\n\t}\n\n\tno_cancel() {\n\t\tthis.get_close_btn().toggle(false);\n\t}\n\n\tcancel() {\n\t\tthis.get_close_btn().trigger(\"click\");\n\t}\n\n\ttoggle_minimize() {\n\t\t$('.modal-backdrop').toggle();\n\t\tlet modal = this.$wrapper.closest('.modal').toggleClass('modal-minimize');\n\t\tmodal.attr('tabindex') ? modal.removeAttr('tabindex') : modal.attr('tabindex', -1);\n\t\tthis.is_minimized = !this.is_minimized;\n\t\tconst icon = this.is_minimized ? 'expand' : 'collapse';\n\t\tthis.get_minimize_btn().html(frappe.utils.icon(icon));\n\t\tthis.on_minimize_toggle && this.on_minimize_toggle(this.is_minimized);\n\t\tthis.header.find('.modal-title').toggleClass('cursor-pointer');\n\t\tthis.hide_scrollbar(!this.is_minimized);\n\t}\n\n\thide_scrollbar(bool) {\n\t\t$(\"body\").css(\"overflow\", bool ? \"hidden\" : \"auto\");\n\t}\n\n\tadd_custom_action(label, action, css_class=null) {\n\t\tthis.footer.removeClass('hide');\n\t\tlet action_button = $(`\n\t\t\t\n\t\t`);\n\t\tthis.custom_actions.append(action_button);\n\n\t\taction && action_button.click(action);\n\t}\n};\n\nfrappe.ui.hide_open_dialog = () => {\n\t// hide open dialog\n\tif (window.cur_dialog) {\n\t\tif (!cur_dialog.minimizable) {\n\t\t\tcur_dialog.hide();\n\t\t} else if (!cur_dialog.is_minimized) {\n\t\t\tcur_dialog.toggle_minimize();\n\t\t}\n\t}\n};\n"],"names":["frappe","provide","dom","id_count","freeze_count","by_id","id","document","getElementById","get_unique_id","const","set_unique_id","ele","$ele","$","attr","eval","txt","el","createElement","appendChild","createTextNode","getElementsByTagName","remove_script_and_style","evil_tags","RegExp","map","tag","join","test","div","innerHTML","found","forEach","e","elements","i","length","parentNode","removeChild","getAttribute","is_element_in_viewport","tolerance","jQuery","rect","getBoundingClientRect","top","left","bottom","window","height","right","width","is_element_in_modal","element","Boolean","parents","set_style","se","type","styleSheet","cssText","add","parent","newtag","className","cs","onclick","substr","c","toLowerCase","src","css","s","extend","style","activate","$parent","$child","common_class","active_class","find","removeClass","addClass","freeze","msg","css_class","on","cur_frm","cur_grid","toggle_view","appendTo","html","repl","setTimeout","unfreeze","remove","save_selection","getSelection","sel","getRangeAt","rangeCount","ranges","len","push","selection","createRange","restore_selection","savedSel","removeAllRanges","addRange","select","is_touchscreen","handle_broken_images","container","currentTarget","scroll_to_bottom","$container","scrollTop","scrollHeight","file_to_base64","file_obj","Promise","resolve","reader","FileReader","onload","result","readAsDataURL","scroll_to_section","section_name","section","hasClass","click","ui","scroll","pixel_to_inches","pixels","body","inches","offsetWidth","ellipsis","text","max","cstr","run_serially","tasks","task","then","load_image","onerror","preprocess","tester","Image","this","timeout","seconds","scrub","spacer","replace","unscrub","model","get_data_pill","label","target_id","remove_action","image","let","data_pill_wrapper","remove_btn","utils","icon","append","get_modal","title","content","__","is_online","boot","developer_mode","navigator","onLine","show_alert","indicator","message","form","link_formatters","formatters","_right","value","options","inline","only_value","Data","df","Select","Float","docfield","doc","precision","cint","sysdefaults","float_precision","trim","Currency","always_show_decimals","is_null","temp","split","undefined","format_number","Int","Percent","flt","Rating","currency","meta","get_field_currency","currency_precision","parts","decimals","fraction","get_value","format_currency","Check","Link","doctype","_options","original_value","match","for_print","substring","link_onclick","can_read","encodeURIComponent","router","slug","Date","datetime","str_to_user","DateRange","Array","isArray","Datetime","m","moment","convert_to_user_tz","time_zone","tz","format","date_format","toUpperCase","time_format","Text","tags","replace_newlines","Time","Duration","duration_options","get_duration_options","get_formatted_duration","LikedBy","each","JSON","parse","v","avatar","Tag","Comment","Assign","SmallText","TextEditor","formatted_value","Code","WorkflowState","workflow_state","get_doc","Email","FileSize","TableMultiSelect","rows","link_field","get_meta","fields","fieldtype","row","fieldname","Color","Icon","get_formatter","formatted","formatter","get_format_helper","helper","get_formatted","get_docfield","console","log","full_name","global","fnTest","Class","props","_super","prototype","proto","Object","create","name","fn","tmp","ret","apply","arguments","newClass","init","hasOwnProperty","constructor","Layout","opts","views","pages","sections","fields_list","fields_dict","make","wrapper","get_doctype_fields","setup_tabbing","render","show_empty_form_message","show_message","get_new_name_field","doctype_layout","concat","get_fields_from_layout","sort_docfields","docfield_map","frm","reqd","hidden","get_status","field","is_new","autoname","includes","f","copy_dict","color","message_color","empty","new_fields","me","column","with_dashboard","setup_dashboard_section","no_opening_section","make_section","make_page","make_column","make_field","unshift","replace_field","fieldobj","init_field","$wrapper","splice","perm","refresh_fields","colspan","make_control","get","render_input","layout","head","page","fold_btn","next","scroll_to","folded","unfold","trigger","Section","Column","refresh","attach_doc_and_docfields","refresh_dependency","refresh_sections","refresh_section_collapse","activeElement","tagName","is_numeric_field_active","closest","data","numeric_fieldtypes","fieldnames","set_input","add_fields","collapsible","collapse","collapsible_depends_on","evaluate_depends_on_value","has_missing_mandatory","l","docname","refresh_section_count","ev","which","current","target","handle_tab","shiftKey","shift","grid_row","prev","focused","get_open_grid_row","set_focus","primary_button","focus","focus_on_next_field","is_visible","idx","grid","grid_rows","start_idx","add_new_row","show_form","in_list","no_value_type","disp_status","is","editor","$input","has_dep","fkey","dependencies_clear","depends_on","mandatory_depends_on","read_only_depends_on","guardian_has_value","hidden_due_to_dependency","set_dependant_property","condition","property","form_obj","is_dialog","parentfield","setting_dependency","set_df_property","expression","out","get_values","istable","throw","script_manager","make_card","card_layout","make_head","description","cssClass","hide_border","toggleClass","hide","collapse_link","show","get_perm","permlevel","indicator_icon","is_collapsed","missing_mandatory","j","section_df","resize_all_columns","FieldGroup","dirty","values","set_values","def_value","get_today","no_submit_on_enter","catch_enter_as_submit","first_button","focus_on_first_input","no_focus","keypress","has_primary_action","preventDefault","get_primary_btn","get_input","input","get_field","ignore_errors","errors","key","strip_html","msgprint","set_value","val","has_field","dict","promises","all","clear","prop","LinkSelector","with_doctype","r","start","dialog","Dialog","search","primary_action_label","primary_action","args","searchfield","set_custom_query","is_grid","fieldinfo","get_query","link_search","results","set_in_grid","parse_validate_and_set_in_model","can_create","new_doc","more","updated","d","qty_fieldname","prompt","default","qty","dynamic_link_field","dynamic_link_reference","callback","btn","call","method","MultiSelectDialog","[object Object]","assign","for_select","page_length","child_page_length","get_fields","primary_fields","get_primary_filters","result_fields","get_result_fields","data_fields","get_data_fields","child_selection_fields","get_child_selection_fields","get_results","bind","allow_child_item_selection","child_fieldname","show_child_results","doctype_plural","plural","size","secondary_action_label","filters_data","get_custom_filters","data_values","cur_dialog","filtered_children","get_selected_child_names","selected_documents","get_checked_values","get_parent_name_of_selected_children","action","secondary_action","make_new_document","add_filters_group","make_filter_area","setup_results","bind_events","set_route_options","route_options","setters","keys","setter","results_area","$results","make_list_row","get_child_result","child_results","render_child_datatable","$child_wrapper","more_btn","child_datatable","rowmanager","checkMap","get_child_datatable_rows","setup_child_datatable","child_columns","editable","more_child_btn","toggle","slice","header_columns","get_child_datatable_columns","child_selection_area","DataTable","columns","inlineFilters","serialNoColumn","checkboxColumn","cellHeight","noDataMessage","disableReorderColumn","index","df_prop","seal","child_doctype","onchange","toggle_child_selection","filter_group","FilterGroup","on_change","get_filters","reduce","acc","filter","flags","auto_scroll","$this","clearTimeout","empty_list","datamanager","parent_names","checked","parent_name","checked_names","child_row_name","checked_values","res","contents","$row","animate","get_checked_items","item","render_result_list","filters","filter_fields","get_filters_from_setters","custom_filters","query","as_dict","no_spinner","get_args_for_search","perform_search","parent_search_args","response","get_filtered_parents_for_child_search","add_parent_filters","add_custom_child_filters","limit_page_length","order_by","open_dialogs","super","display","static","modal","backdrop","keyboard","get_close_btn","modal_body","$body","$message","header","footer","standard_actions","custom_actions","set_indicator","primary","secondary","onsubmit","set_primary_action","set_secondary_action","set_secondary_action_label","minimizable","is_minimized","toggle_minimize","get_minimize_btn","hide_scrollbar","pop","onhide","on_hide","on_page_show","off","blur","clear_message","primary_action_fulfilled","get_secondary_btn","set_title","t","removeAttr","on_minimize_toggle","bool","action_button","hide_open_dialog"],"mappings":"yBAIAA,OAAOC,QAAQ,cAEfD,OAAOE,IAAM,CACZC,SAAU,EACVC,aAAc,EACdC,MAAO,SAASC,GACf,OAAOC,SAASC,eAAeF,IAEhCG,cAAe,WACdC,IAAMJ,EAAK,UAAYN,OAAOE,IAAIC,SAElC,OADAH,OAAOE,IAAIC,WACJG,GAERK,cAAe,SAASC,GACvB,IAAIC,EAAOC,EAAEF,GACb,GAAGC,EAAKE,KAAK,MACZ,OAAOF,EAAKE,KAAK,MAElB,IAAIT,EAAK,UAAYN,OAAOE,IAAIC,SAGhC,OAFAU,EAAKE,KAAK,KAAMT,GAChBN,OAAOE,IAAIC,WACJG,GAERU,KAAM,SAASC,GACd,GAAIA,EAAJ,CACA,IAAIC,EAAKX,SAASY,cAAc,UAChCD,EAAGE,YAAYb,SAASc,eAAeJ,IAEvCV,SAASe,qBAAqB,QAAQ,GAAGF,YAAYF,KAEtDK,wBAAyB,SAASN,GACjCP,IAAMc,EAAY,CAAC,SAAU,QAAS,WAAY,QAAS,OAAQ,OAAQ,QAE3E,IADc,IAAIC,OAAOD,EAAUE,aAAIC,aAAWA,YAAaA,QAAQC,KAAK,KAAM,KACvEC,KAAKZ,GAEf,OAAOA,EAGR,IAAIa,EAAMvB,SAASY,cAAc,OACjCW,EAAIC,UAAYd,EAChB,IAAIe,GAAQ,EACZR,EAAUS,QAAQ,SAASC,GAC1B,IAAIC,EAAWL,EAAIR,qBAAqBY,GAExC,IADAE,EAAID,EAASE,OACND,KACNJ,GAAQ,EACRG,EAASC,GAAGE,WAAWC,YAAYJ,EAASC,MAO9C,IAFA,IAAID,EAAWL,EAAIR,qBAAqB,QACpCc,EAAID,EAASE,OACVD,KAC+B,cAAjCD,EAASC,GAAGI,aAAa,SAC5BR,GAAQ,EACRG,EAASC,GAAGE,WAAWC,YAAYJ,EAASC,KAG9C,OAAGJ,EACKF,EAAIC,UAGJd,GAGTwB,uBAAwB,SAAUvB,EAAIwB,kBAAU,GAGzB,mBAAXC,QAAyBzB,aAAcyB,SACjDzB,EAAKA,EAAG,IAGT,IAAI0B,EAAO1B,EAAG2B,wBAEd,OACCD,EAAKE,IAAMJ,GAAa,GACrBE,EAAKG,KAAOL,GAAa,GACzBE,EAAKI,OAASN,GAAa5B,EAAEmC,QAAQC,UACrCN,EAAKO,MAAQT,GAAa5B,EAAEmC,QAAQG,SAIzCC,6BAAoBC,GACnB,OAAOC,QAAQzC,EAAEwC,GAASE,QAAQ,UAAUnB,SAG7CoB,UAAW,SAASxC,EAAKX,GACxB,GAAIW,EAAJ,CAEA,IAAIyC,EAAKnD,SAASY,cAAc,SAGhC,GAFAuC,EAAGC,KAAO,WAENrD,EAAI,CACP,IAAIgD,EAAU/C,SAASC,eAAeF,GAClCgD,GACHA,EAAQhB,WAAWC,YAAYe,GAEhCI,EAAGpD,GAAKA,EAST,OANIoD,EAAGE,WACNF,EAAGE,WAAWC,QAAU5C,EAExByC,EAAGtC,YAAYb,SAASc,eAAeJ,IAExCV,SAASe,qBAAqB,QAAQ,GAAGF,YAAYsC,GAC9CA,IAERI,IAAK,SAASC,EAAQC,EAAQC,EAAWC,EAAInC,EAAWoC,GACpDJ,GAAUA,EAAOK,SAAOL,EAAS/D,OAAOE,IAAIG,MAAM0D,IACrD,IAAIM,EAAI9D,SAASY,cAAc6C,GAc/B,OAbGD,GACFA,EAAO3C,YAAYiD,GAGjBJ,IACuB,OAAtBD,EAAOM,cACTD,EAAEE,IAAMN,EAERI,EAAEJ,UAAYA,GAEbC,GAAIlE,OAAOE,IAAIsE,IAAIH,EAAEH,GACrBnC,IAAWsC,EAAEtC,UAAYA,GACzBoC,IAASE,EAAEF,QAAUA,GACjBE,GAERG,IAAK,SAAS5D,EAAK6D,GAIlB,OAHG7D,GAAO6D,GACT3D,EAAE4D,OAAO9D,EAAI+D,MAAOF,GAEd7D,GAERgE,SAAU,SAASC,EAASC,EAAQC,EAAcC,kBAAa,UAC9DH,EAAQI,SAASF,MAAgBC,GAC/BE,YAAYF,GACdF,EAAOK,SAASH,IAEjBI,OAAQ,SAASC,EAAKC,GAErB,GAAKxE,EAAE,WAAWuB,OAgBjBvB,EAAE,WAAWqE,SAAS,UAhBG,CACzB,IAAIC,EAAStE,EAAE,uDACbyE,GAAG,QAAS,WACZ,GAAIC,SAAWA,QAAQC,SAEtB,OADAD,QAAQC,SAASC,eACV,IAGRC,SAAS,SAEXP,EAAOQ,KAAKC,KAAK,4GAChB,CAACR,IAAKA,GAAO,MAEdS,WAAW,WAAaV,EAAOD,SAAS,OAAS,GAM9CG,GACHxE,EAAE,WAAWqE,SAASG,GAGvBtF,OAAOE,IAAIE,gBAEZ2F,SAAU,WACT,GAAI/F,OAAOE,IAAIE,eACfJ,OAAOE,IAAIE,gBACPJ,OAAOE,IAAIE,cACDU,EAAE,WAAWoE,YAAY,MAAMc,UAG9CC,eAAgB,WAEf,GAAIhD,OAAOiD,aAAc,CACxB,IAAIC,EAAMlD,OAAOiD,eACjB,GAAIC,EAAIC,YAAcD,EAAIE,WAAY,CAErC,IADA,IAAIC,EAAS,GACJlE,EAAI,EAAGmE,EAAMJ,EAAIE,WAAYjE,EAAImE,IAAOnE,EAChDkE,EAAOE,KAAKL,EAAIC,WAAWhE,IAE5B,OAAOkE,QAEF,GAAI/F,SAASkG,WAAalG,SAASkG,UAAUC,YACnD,OAAOnG,SAASkG,UAAUC,cAE3B,OAAO,MAERC,kBAAmB,SAASC,GAC3B,GAAIA,EACH,GAAI3D,OAAOiD,aAAc,CACxB,IAAIC,EAAMlD,OAAOiD,eACjBC,EAAIU,kBACJ,IAAK,IAAIzE,EAAI,EAAGmE,EAAMK,EAASvE,OAAQD,EAAImE,IAAOnE,EACjD+D,EAAIW,SAASF,EAASxE,SAEb7B,SAASkG,WAAaG,EAASG,QACzCH,EAASG,UAIZC,eAAgB,WACf,MAAQ,iBAAkB/D,QAE3BgE,8BAAqBC,GACpBpG,EAAEoG,GAAWjC,KAAK,OAAOM,GAAG,iBAAUrD,GACxBpB,EAAEoB,EAAEiF,eACZhC,SAAS,eAGhBiC,0BAAiBF,GAChBxG,IAAM2G,EAAavG,EAAEoG,GACrBG,EAAWC,UAAUD,EAAW,GAAGE,eAEpCC,wBAAeC,GACd,OAAO,IAAIC,iBAAQC,GAClBjH,IAAMkH,EAAS,IAAIC,WACnBD,EAAOE,OAAS,WACfH,EAAQC,EAAOG,SAEhBH,EAAOI,cAAcP,MAGvBQ,2BAAkBC,GACjBpC,sBACCpF,IAAMyH,EAAUrH,iBAAiBoH,QAC7BC,EAAQ9F,SACR8F,EAAQpE,SAASqE,SAAS,cAE5BD,EAAQE,QAETrI,OAAOsI,GAAGC,OAAOJ,EAAQpE,SAASA,YAEjC,MAEJyE,yBAAgBC,GACf/H,IAAMoB,EAAMhB,EAAE,iGACdgB,EAAI6D,SAASpF,SAASmI,MAEtBhI,IACMiI,EAASF,EADDlI,SAASC,eAAe,OAAOoI,YAI7C,OAFA9G,EAAIkE,SAEG2C,IAIT3I,OAAO6I,SAAW,SAASC,EAAMC,GAMhC,OALIA,IAAKA,EAAM,KACfD,EAAOE,KAAKF,IACJzG,OAAS0G,IAChBD,EAAOA,EAAK1E,OAAO,EAAG2E,GAAO,OAEvBD,GAGR9I,OAAOiJ,aAAe,SAASC,GAC9B,IAAInB,EAASL,QAAQC,UAMrB,OALAuB,EAAMjH,iBAAQkH,GACVA,IACFpB,EAASA,EAAOqB,KAAOrB,EAAOqB,KAAKD,GAAQzB,QAAQC,aAG9CI,GAGR/H,OAAOqJ,oBAAc9E,EAAKuD,EAAQwB,EAASC,gCAC1C,IAAIC,EAAS,IAAIC,MACjBD,EAAO1B,OAAS,WACfA,EAAO4B,OAERF,EAAOF,QAAUA,EAEjBC,EAAWC,GACXA,EAAOjF,IAAMA,GAGdvE,OAAO2J,iBAAUC,GAChB,OAAO,IAAIlC,iBAASC,GACnB7B,6BAAiB6B,KAAqB,IAAViC,MAI9B5J,OAAO6J,MAAQ,SAASf,EAAMgB,GAC7B,sBADoC,KAC7BhB,EAAKiB,QAAQ,KAAMD,GAAQxF,eAGnCtE,OAAOgK,QAAU,SAAS/I,GACzB,OAAOjB,OAAOiK,MAAMD,QAAQ/I,IAG7BjB,OAAOkK,uBAAiBC,EAAOC,EAAgBC,EAAoBC,kBAA1B,qBAAoB,qBAAY,MACxEC,IAAIC,EAAoB1J,oGAGnBwJ,GAAgB,0CACQA,EAAQ,OAAS,SAAOH,8CAKrD,GAAIE,EAAe,CAClBE,IAAIE,EAAa3J,+DAEbd,OAAO0K,MAAMC,KAAK,QAAS,+BAE5BtC,iBACFgC,EAAcD,GAAaD,EAAOK,KAEnCA,EAAkBI,OAAOH,GAG1B,OAAOD,GAGRxK,OAAO6K,UAAY,SAASC,EAAOC,GAClC,OAAOjK,2TAMwBgK,sJAIvB9K,OAAO0K,MAAMC,KAAK,sIAGlB3K,OAAO0K,MAAMC,KAAK,YAAa,KAAM,oHAIPI,2WAO9BC,GAAG,6GASZhL,OAAOiL,UAAY,WAClB,OAAkC,GAA9BjL,OAAOkL,KAAKC,mBAIZ,WAAYC,YACRA,UAAUC,SAMnBvK,EAAEmC,QAAQsC,GAAG,SAAU,WACtBvF,OAAOsL,WAAW,CACjBC,UAAW,QACXC,QAASR,GAAG,sCAIdlK,EAAEmC,QAAQsC,GAAG,UAAW,WACvBvF,OAAOsL,WAAW,CACjBC,UAAW,SACXC,QAASR,GAAG,sDClXdhL,OAAOC,QAAQ,0BAEfD,OAAOyL,KAAKC,gBAAkB,GAE9B1L,OAAOyL,KAAKE,WAAa,CACxBC,OAAQ,SAASC,EAAOC,GACvB,OAAGA,IAAYA,EAAQC,QAAUD,EAAQE,YACjCH,EAEA,kCAAoCA,EAAQ,UAGrDI,KAAM,SAASJ,EAAOK,GACrB,OAAIA,GAAoB,OAAdA,EAAGJ,oBACOD,yCAA4CA,SAElD,MAAPA,EAAc,GAAKA,GAE3BM,OAAQ,SAASN,GAChB,OAAOb,GAAGhL,OAAOyL,KAAKE,WAAiB,KAAEE,KAE1CO,MAAO,SAASP,EAAOQ,EAAUP,EAASQ,GAEzC,IAAIC,EAAYF,EAASE,WACrBC,KAAKxM,OAAOkL,KAAKuB,aAAezM,OAAOkL,KAAKuB,YAAYC,kBACxD,KACJ,GAAIL,EAASP,SAAWO,EAASP,QAAQa,OAGxC,OADAN,EAASE,UAAYA,EACdvM,OAAOyL,KAAKE,WAAWiB,SAASf,EAAOQ,EAAUP,EAASQ,GAIjE,KAAMR,GAAW,IAAIe,uBAAyBC,QAAQjB,GAAQ,CAC7D,IAAIkB,EAAO/D,KAAK6C,GAAOmB,MAAM,KAChBC,MAATF,EAAK,IAAiC,IAAhBP,KAAKO,EAAK,MACnCR,EAAY,GAId,OAAOvM,OAAOyL,KAAKE,WAAWC,OACpB,MAAPC,GAAuB,KAARA,EACd,GACAqB,cAAcrB,EAAO,KAAMU,GAAaT,IAG9CqB,IAAK,SAAStB,EAAOQ,EAAUP,GAC9B,OAAO9L,OAAOyL,KAAKE,WAAWC,OAAc,MAAPC,EAAc,GAAKW,KAAKX,GAAQC,IAEtEsB,QAAS,SAASvB,EAAOQ,EAAUP,GAClCpL,IAAM6L,EACLF,EAASE,WACNC,KACFxM,OAAOkL,KAAKuB,aACTzM,OAAOkL,KAAKuB,YAAYC,kBAEzB,EAEJ,OAAO1M,OAAOyL,KAAKE,WAAWC,OAAOyB,IAAIxB,EAAOU,GAAa,IAAKT,IAEnEwB,OAAQ,SAASzB,GAMhB,sCALoB,GAAG,CAAC,EAAG,EAAG,EAAG,EAAG,GAAGnK,aAAIU,sCACdA,IAAMyJ,GAAS,GAAK,aAAc,mBAAkBzJ,8DAG/ER,KAAK,qBAKRgL,SAAU,SAAUf,EAAOQ,EAAUP,EAASQ,GAC7C,IAAIiB,EAAYvN,OAAOwN,KAAKC,mBAAmBpB,EAAUC,GACrDC,EAAYF,EAASE,WAAaC,KAAKxM,OAAOkL,KAAKuB,YAAYiB,qBAAuB,EAG1F,GAAInB,EAAY,EAAG,CAClB,IAAIoB,EAAS3E,KAAK6C,GAAOmB,MAAM,KAC3BY,EAAWD,EAAMtL,OAAS,EAAIsL,EAAM,GAAK,GAE7C,GAAKC,EAASvL,OAAS,GAAKuL,EAASvL,OAASkK,EAAY,CACzD7L,IAAMmN,EAAW7N,OAAOiK,MAAM6D,UAAU,YAAaP,EAAU,mBAAqB,IAEhFK,EAASvL,OAAS2G,KAAK6E,GAAUxL,SACpCkK,EAAYvD,KAAK6E,GAAUxL,OAAS,IAOvC,OAFAwJ,EAAkB,MAATA,GAA2B,KAAVA,EAAgB,GAAKkC,gBAAgBlC,EAAO0B,EAAUhB,GAE3ET,GAAWA,EAAQE,WAChBH,EAEA7L,OAAOyL,KAAKE,WAAWC,OAAOC,EAAOC,IAG9CkC,MAAO,SAASnC,GACf,iEACmBA,EAAQ,WAAa,oBAEzCoC,KAAM,SAASpC,EAAOQ,EAAUP,EAASQ,GACxC,IAAI4B,EAAU7B,EAAS8B,UAAY9B,EAASP,QACxCsC,EAAiBvC,EAKrB,OAJGA,GAASA,EAAMwC,OAASxC,EAAMwC,MAAM,iBACtCxC,EAAM9B,QAAQ,WAAY,MAGxB+B,IAAYA,EAAQwC,WAAaxC,EAAQE,YACpCH,GAGL7L,OAAOyL,KAAKC,gBAAgBwC,IAE1B5B,GAAO4B,IAAY5B,EAAI4B,UAC1BrC,EAAQ7L,OAAOyL,KAAKC,gBAAgBwC,GAASrC,EAAOS,EAAKD,IAIvDR,EAGW,KAAZA,EAAM,IAAuC,KAA1BA,EAAMA,EAAMxJ,OAAQ,GAClCwJ,EAAM0C,UAAU,EAAG1C,EAAMxJ,OAAS,GAEvCgK,GAAYA,EAASmC,aAChB3I,KAAK,yCACX,CAAC1B,QAASkI,EAASmC,aAAazE,QAAQ,KAAM,UAAW8B,MAAMA,IACvDQ,GAAY6B,GACjBlO,OAAOiK,MAAMwE,SAASP,+BAEXQ,mBAAmB1O,OAAO2O,OAAOC,KAAKV,QAAaQ,mBAAmBN,iCACnEF,6BACHE,mBACXpD,GAAGc,GAAWA,EAAQ3B,OAAS0B,UAK5BA,EAnBA,KAsBTgD,KAAM,SAAShD,GACd,OAAK7L,OAAO8O,SAASC,aAGjBlD,GAGS,kBAFZA,EAAQ7L,OAAO8O,SAASC,YAAYlD,MAGnCA,EAAQ,MAIHA,GAAS,IAVRA,GAYTmD,UAAW,SAASnD,GACnB,OAAIoD,MAAMC,QAAQrD,GACVb,GAAG,aAAc,CAAChL,OAAO8O,SAASC,YAAYlD,EAAM,IAAK7L,OAAO8O,SAASC,YAAYlD,EAAM,MAE3FA,GAAS,IAGlBsD,SAAU,SAAStD,GAClB,GAAGA,EAAO,CACT,IAAIuD,EAAIC,OAAOrP,OAAO8O,SAASQ,mBAAmBzD,IAIlD,OAHG7L,OAAOkL,KAAKuB,YAAY8C,YAC1BH,EAAIA,EAAEI,GAAGxP,OAAOkL,KAAKuB,YAAY8C,YAE3BH,EAAEK,OAAOzP,OAAOkL,KAAKuB,YAAYiD,YAAYC,cAChD,KAAO3P,OAAOkL,KAAKuB,YAAYmD,aAAe,aAElD,MAAO,IAGTC,KAAM,SAAShE,GACd,GAAGA,EAAO,CAIT,IAHA,IAAIiE,EAAO,CAAC,KAAM,OAAQ,MAAO,UAC7BzB,GAAQ,EAEJjM,EAAE,EAAGA,EAAE0N,EAAKzN,OAAQD,IAC3B,GAAGyJ,EAAMwC,MAAMyB,EAAK1N,IAAK,CACxBiM,GAAQ,EACR,MAIEA,IACHxC,EAAQ7L,OAAO0K,MAAMqF,iBAAiBlE,IAIxC,OAAO7L,OAAOyL,KAAKE,WAAWM,KAAKJ,IAEpCmE,KAAM,SAASnE,GAKd,OAJIA,IACHA,EAAQ7L,OAAO8O,SAASC,YAAYlD,GAAO,IAGrCA,GAAS,IAEjBoE,SAAU,SAASpE,EAAOQ,GACzB,GAAIR,EAAO,CACVtB,IAAI2F,EAAmBlQ,OAAO0K,MAAMyF,qBAAqB9D,GACzDR,EAAQ7L,OAAO0K,MAAM0F,uBAAuBvE,EAAOqE,GAGpD,OAAOrE,GAAS,IAEjBwE,QAAS,SAASxE,GACjB,IAAIjG,EAAO,GAIX,OAHA9E,EAAEwP,KAAKC,KAAKC,MAAM3E,GAAS,MAAO,SAASzJ,EAAGqO,GAC1CA,IAAG7K,GAAO5F,OAAO0Q,OAAOD,MAErB7K,GAER+K,IAAK,SAAS9E,GACb,IAAIjG,EAAO,GAUX,OATA9E,EAAEwP,MAAMzE,GAAS,IAAImB,MAAM,KAAM,SAAS5K,EAAGqO,GACxCA,IAAG7K,GAAQ,yNAIyB6K,qBACpCA,yBAGE7K,GAERgL,QAAS,SAAS/E,GACjB,OAAOA,GAERgF,OAAQ,SAAShF,GAChB,IAAIjG,EAAO,GAMX,OALA9E,EAAEwP,KAAKC,KAAKC,MAAM3E,GAAS,MAAO,SAASzJ,EAAGqO,GAC1CA,IAAG7K,GAAO,oGAEW6K,EAAE,aAEpB7K,GAERkL,UAAW,SAASjF,GACnB,OAAO7L,OAAOyL,KAAKE,WAAWkE,KAAKhE,IAEpCkF,WAAY,SAASlF,GACpBtB,IAAIyG,EAAkBhR,OAAOyL,KAAKE,WAAWkE,KAAKhE,GAElD,IACM/K,EAAEkQ,GAAiB/L,KAAK,cAAc5C,SAC1C2O,EAAkB,oCAAoCA,YAEtD,MAAM9O,GACP8O,EAAkB,oCAAoCA,WAGvD,OAAOA,GAERC,KAAM,SAASpF,GACd,MAAO,SAAkB,MAAPA,EAAc,GAAK/K,EAAE,SAASgI,KAAK+C,GAAOjG,QAAU,UAEvEsL,cAAe,SAASrF,GACvB,IAAIsF,EAAiBnR,OAAOoR,QAAQ,iBAAkBvF,GACtD,OAAGsF,EACKtL,KAAK,6MAGyD,CACnEgG,MAAOA,EACPlH,MAAOwM,EAAexM,MAAML,cAC5BqG,KAAMwG,EAAexG,OAGhB,uBAAyBkB,EAAQ,WAG1CwF,MAAO,SAASxF,GACf,OAAO/K,EAAE,eAAegI,KAAK+C,GAAOjG,QAErC0L,SAAU,SAASzF,GAMlB,OALGA,EAAQ,QACVA,EAAQwB,IAAIA,IAAIxB,GAAS,QAAS,GAAK,IAC7BA,EAAQ,OAClBA,EAAQwB,IAAIA,IAAIxB,GAAS,KAAM,GAAK,KAE9BA,GAER0F,iBAAkB,SAASC,EAAMtF,EAAIJ,GACpC0F,EAAOA,GAAQ,GACf9Q,IACM+Q,EADOzR,OAAO0R,SAASxF,EAAGJ,SACR6F,OAAO1M,cAAKiH,SAAuB,SAAjBA,EAAG0F,YAK7C,OAJyBJ,EAAK9P,aAAImQ,GACjCnR,IAAMmL,EAAQgG,EAAIJ,EAAWK,WAC7B,OAAO9R,OAAOyP,OAAO5D,EAAO4F,EAAY3F,EAAS+F,KAE1BjQ,KAAK,OAE9BmQ,eAAQlG,GACP,OAAOA,uEACiDA,+CAC3BA,wBACnB,IAEXmG,cAAOnG,GACN,OAAOA,6CACuB7L,OAAO0K,MAAMC,KAAKkB,EAAO,gDAC3BA,wBAClB,KAIZ7L,OAAOyL,KAAKwG,cAAgB,SAASL,GAGpC,OAFIA,IACHA,EAAY,QACN5R,OAAOyL,KAAKE,WAAWiG,EAAU7H,QAAQ,KAAM,MAAQ/J,OAAOyL,KAAKE,WAAWM,MAGtFjM,OAAOyP,OAAS,SAAS5D,EAAOK,EAAIJ,EAASQ,GACxCJ,IAAIA,EAAK,CAAC0F,UAAY,SACN,cAAhB1F,EAAG4F,YAA2B5F,EAAG0F,UAAY,OACjD,IAAIA,EAAY1F,EAAG0F,WAAa,OAGjB,iBAAZA,IACFA,EAAY,OACZ1F,EAAGiC,SAAW7B,EAAMA,EAAIJ,EAAGJ,SAAW,MAGvC,IAEIoG,GAFYhG,EAAGiG,WAAanS,OAAOyL,KAAKwG,cAAcL,IAEhC/F,EAAOK,EAAIJ,EAASQ,GAK9C,MAHwB,iBAAb4F,IACVA,EAAYlS,OAAOE,IAAIqB,wBAAwB2Q,IAEzCA,GAGRlS,OAAOoS,kBAAoB,SAAS9F,GACnC,IAAI+F,EAAS,CACZC,cAAe,SAASR,GACvB,IAAI5F,EAAKlM,OAAOwN,KAAK+E,aAAajG,EAAI4B,QAAS4D,GAE/C,OADI5F,GAAMsG,QAAQC,IAAI,wBAA0BX,GACzC9R,OAAOyP,OAAOnD,EAAIwF,GAAY5F,EAAI,CAACH,OAAO,GAAIO,KAIvD,OADAxL,EAAE4D,OAAO2N,EAAQ/F,GACV+F,GAGRrS,OAAOyL,KAAKC,gBAAsB,KAAI,SAASG,EAAOS,EAAKD,GAE1D,OADgBC,IAAQA,EAAIoG,WAAcrG,GAAYC,EAAOD,4BACzCR,GC7UrB,SAAU8G,GAET,IAAIC,EAAS,MAAM/Q,KAAK,cAAoB,aAAe,KAG3D,SAASgR,KAGTA,EAAMnO,OAAS,SAASoO,GACtB,IAAIC,EAASrJ,KAAKsJ,UAIdC,EAAQC,OAAOC,OAAOJ,GAG1B,IAAK,IAAIK,KAAQN,EAElBG,EAAMG,GAA+B,mBAAhBN,EAAMM,IACF,mBAAhBL,EAAOK,IAAuBR,EAAO/Q,KAAKiR,EAAMM,IACrD,SAAUA,EAAMC,GACjB,OAAO,WACR,IAAIC,EAAM5J,KAAKqJ,OAIfrJ,KAAKqJ,OAASA,EAAOK,GAIrB,IAAIG,EAAMF,EAAGG,MAAM9J,KAAM+J,WAGzB,OAFA/J,KAAKqJ,OAASO,EAEPC,GAbL,CAeAH,EAAMN,EAAMM,IACZN,EAAMM,GAIT,IAAIM,EAAiC,mBAAfT,EAAMU,KAC3BV,EAAMW,eAAe,QACnBX,EAAMU,KACN,WAAqBZ,EAAOY,KAAKH,MAAM9J,KAAM+J,YAC/C,aAWD,OARAC,EAASV,UAAYC,EAGrBA,EAAMY,YAAcH,EAGpBA,EAAShP,OAASmO,EAAMnO,OAEjBgP,GAITf,EAAOE,MAAQA,EA3DhB,uGCpBA7S,OAAOsI,GAAGmD,KAAKqI,OAASjB,MAAMnO,OAAO,CACpCiP,KAAM,SAAUI,GACfrK,KAAKsK,MAAQ,GACbtK,KAAKuK,MAAQ,GACbvK,KAAKwK,SAAW,GAChBxK,KAAKyK,YAAc,GACnBzK,KAAK0K,YAAc,GAEnBtT,EAAE4D,OAAOgF,KAAMqK,IAEhBM,KAAM,YACA3K,KAAK3F,QAAU2F,KAAKhB,OACxBgB,KAAK3F,OAAS2F,KAAKhB,MAEpBgB,KAAK4K,QAAUxT,EAAE,6BAA6B6E,SAAS+D,KAAK3F,QAC5D2F,KAAK8B,QAAU1K,EAAE,2CAA2C6E,SAAS+D,KAAK4K,SACrE5K,KAAKiI,SACTjI,KAAKiI,OAASjI,KAAK6K,sBAEpB7K,KAAK8K,gBACL9K,KAAK+K,UAENC,wBAAyB,WAClBhL,KAAK4K,QAAQrP,KAAK,2BAA2B5C,QAAUqH,KAAK4K,QAAQrP,KAAK,2BAA2B5C,QACzGqH,KAAKiL,aAAa3J,GAAG,uCAIvBuJ,mBAAoB,WACnBhK,IAAIoH,EAAS,CACZjI,KAAKkL,sBAQN,OALCjD,EADGjI,KAAKmL,eACClD,EAAOmD,OAAOpL,KAAKqL,0BAEnBpD,EAAOmD,OAAO9U,OAAOwN,KAAKwH,eAAehV,OAAOwN,KAAKyH,aAAavL,KAAKwE,YAMlF0G,8BACC,MAAO,CACN7Q,OAAQ2F,KAAKwL,IAAIhH,QACjB0D,UAAW,OACXE,UAAW,YACXqD,KAAM,EACNC,OAAQ,EACRjL,MAAOa,GAAG,QACVqK,WAAY,SAASC,GACpB,OAAIA,EAAMJ,KAAOI,EAAMJ,IAAIK,UACvBD,EAAMJ,IAAI1H,KAAKgI,UACf,CAAC,SAAU,QAAQC,SAASH,EAAMJ,IAAI1H,KAAKgI,SAASlR,eAChD,QAED,UAKVyQ,kCAEC,IADArU,IAAMiR,EAAS,SACDjI,KAAKmL,eAAelD,uBAAQ,CAArCpH,IAAImL,OACFrJ,EAAWsJ,UAAU3V,OAAOwN,KAAKyH,aAAavL,KAAKwE,SAASwH,EAAE5D,YACpEzF,EAASlC,MAAQuL,EAAEvL,MACnBwH,EAAOnL,KAAK6F,GAEb,OAAOsF,GAGRgD,aAAc,SAAS/O,EAAMgQ,GACxBlM,KAAKmM,eAERnM,KAAK8B,QAAQtG,YAAYwE,KAAKmM,eAE/BnM,KAAKmM,cAAiBD,GAAS,CAAC,SAAU,OAAQ,MAAO,QAAS,UAAUH,SAASG,GAAUA,EAAQ,OACnGhQ,GACqB,MAApBA,EAAKxB,OAAO,EAAG,KAElBwB,EAAO,QAAUA,EAAO,UAEzB8D,KAAK8B,QAAQtG,YAAY,UAAUC,SAASuE,KAAKmM,eACjD/U,EAAE8E,GAAMD,SAAS+D,KAAK8B,UAEtB9B,KAAK8B,QAAQsK,QAAQ3Q,SAAS,WAGhCsP,OAAQ,SAAUsB,GACjB,IAAIC,EAAKtM,KACLiI,EAASoE,GAAcrM,KAAKiI,OAEhCjI,KAAKvB,QAAU,KACfuB,KAAKuM,OAAS,KAEVvM,KAAKwM,gBACRxM,KAAKyM,0BAGFzM,KAAK0M,sBACR1M,KAAK2M,eAENvV,EAAEwP,KAAKqB,EAAQ,SAAUvP,EAAG8J,GAC3B,OAAQA,EAAG0F,WACV,IAAK,OACJoE,EAAGM,UAAUpK,GACb,MACD,IAAK,gBACJ8J,EAAGK,aAAanK,GAChB,MACD,IAAK,eACJ8J,EAAGO,YAAYrK,GACf,MACD,QACC8J,EAAGQ,WAAWtK,OAMlBkK,mBAAoB,WACnB,OAAQ1M,KAAKiI,OAAO,IAAkC,iBAA5BjI,KAAKiI,OAAO,GAAGC,YAAkClI,KAAKiI,OAAOtP,QAGxF8T,wBAAyB,WACpBzM,KAAK0M,sBACR1M,KAAKiI,OAAO8E,QAAQ,CAAC7E,UAAW,mBAIlC8E,cAAe,SAAU5E,EAAW5F,EAAIuI,GAEvC,GADAvI,EAAG4F,UAAYA,EACXpI,KAAK0K,YAAYtC,IAAcpI,KAAK0K,YAAYtC,GAAW5F,GAAI,CAClExL,IAAMiW,EAAWjN,KAAKkN,WAAW1K,EAAIuI,GACrC/K,KAAK0K,YAAYtC,GAAW+E,SAAS7Q,SACrC0D,KAAKyK,YAAY2C,OAAOpN,KAAK0K,YAAYtC,GAAY,EAAG6E,GACxDjN,KAAK0K,YAAYtC,GAAa6E,EAC1BjN,KAAKwL,MACRyB,EAASI,KAAOrN,KAAKwL,IAAI6B,MAE1BrN,KAAKvB,QAAQgM,YAAY2C,OAAOpN,KAAKvB,QAAQiM,YAAYtC,GAAY,EAAG6E,GACxEjN,KAAKvB,QAAQiM,YAAYtC,GAAa6E,EACtCjN,KAAKsN,eAAe,CAAC9K,MAIvBsK,WAAY,SAAUtK,EAAI+K,EAASxC,IACjC/K,KAAKvB,SAAWuB,KAAK2M,gBACrB3M,KAAKuM,QAAUvM,KAAK6M,cAErB7V,IAAMiW,EAAWjN,KAAKkN,WAAW1K,EAAIuI,GACrC/K,KAAKyK,YAAY3N,KAAKmQ,GACtBjN,KAAK0K,YAAYlI,EAAG4F,WAAa6E,EAC7BjN,KAAKwL,MACRyB,EAASI,KAAOrN,KAAKwL,IAAI6B,MAG1BrN,KAAKvB,QAAQgM,YAAY3N,KAAKmQ,GAC9BjN,KAAKvB,QAAQiM,YAAYlI,EAAG4F,WAAa6E,EACzCA,EAASxO,QAAUuB,KAAKvB,SAGzByO,WAAY,SAAU1K,EAAIuI,mBAAS,GAClC/T,IAAMiW,EAAW3W,OAAOsI,GAAGmD,KAAKyL,aAAa,CAC5ChL,GAAIA,EACJgC,QAASxE,KAAKwE,QACdnK,OAAQ2F,KAAKuM,OAAO3B,QAAQ6C,IAAI,GAChCjC,IAAKxL,KAAKwL,IACVkC,aAAc3C,EACdnI,IAAK5C,KAAK4C,IACV+K,OAAQ3N,OAIT,OADAiN,EAASU,OAAS3N,KACXiN,GAGRL,UAAW,SAAUpK,GACpB,IAAI8J,EAAKtM,KACR4N,EAAOxW,EAAE,6FAC8BkK,GAAG,qBAAuB,oBACxDrF,SAAS+D,KAAK4K,SAExB5K,KAAK6N,KAAOzW,EAAE,kDAAkD6E,SAAS+D,KAAK4K,SAE9E5K,KAAK8N,SAAWF,EAAKrS,KAAK,aAAaM,GAAG,QAAS,WAClD,IAAIgS,EAAOzW,EAAE4I,MAAM3F,SAAS0T,OACxBF,EAAKnP,SAAS,SACjBtH,EAAE4I,MAAMxE,YAAY,YAAYU,KAAKoF,GAAG,iBACxCuM,EAAKrS,YAAY,QACjBlF,OAAO0K,MAAMgN,UAAU5W,EAAE4I,OAAO,EAAM,IACtCsM,EAAG2B,QAAS,IAEZ7W,EAAE4I,MAAMvE,SAAS,YAAYS,KAAKoF,GAAG,sBACrCuM,EAAKpS,SAAS,QACd6Q,EAAG2B,QAAS,KAIdjO,KAAKvB,QAAU,KACfuB,KAAKiO,QAAS,GAGfC,OAAQ,WACPlO,KAAK8N,SAASK,QAAQ,UAGvBxB,aAAc,SAAUnK,GACvBxC,KAAKvB,QAAU,IAAInI,OAAOsI,GAAGmD,KAAKqM,QAAQpO,KAAMwC,GAG5CA,IACHxC,KAAK0K,YAAYlI,EAAG4F,WAAapI,KAAKvB,QACtCuB,KAAKyK,YAAY3N,KAAKkD,KAAKvB,UAG5BuB,KAAKuM,OAAS,MAGfM,YAAa,SAAUrK,GACtBxC,KAAKuM,OAAS,IAAIjW,OAAOsI,GAAGmD,KAAKsM,OAAOrO,KAAKvB,QAAS+D,GAClDA,GAAMA,EAAG4F,WACZpI,KAAKyK,YAAY3N,KAAKkD,KAAKuM,SAI7B+B,QAAS,SAAU1L,GAEdA,IAAK5C,KAAK4C,IAAMA,GAEhB5C,KAAKwL,KACRxL,KAAK4K,QAAQrP,KAAK,qBAAqBe,SAJ/B0D,KAQNuO,0BAAyB,GAExBvO,KAAKwL,KAAOxL,KAAKwL,IAAIZ,SACxBxT,EAAE4I,KAAKwL,IAAIZ,SAASuD,QAAQ,kBAI7BnO,KAAKwO,qBAGLxO,KAAKyO,mBAEDzO,KAAKwL,KAERxL,KAAK0O,2BAGF7X,SAAS8X,eAC0B,SAAlC9X,SAAS8X,cAAcC,SAAsB5O,KAAK6O,2BACrDhY,SAAS8X,cAActR,UAK1BwR,mCACC7X,IACMkR,GADU9Q,EAAEP,SAAS8X,eAAeG,QAAQ,mBACvBC,QAAU,IAAI7G,UACzC,OAAO5R,OAAOiK,MAAMyO,mBAAmBjD,SAAS7D,IAGjDuG,iBAAkB,WAEjBzO,KAAK4K,QAAQrP,KAAK,oCAAoCqL,KAAK,WAC1D5P,IAAMyH,EAAUrH,EAAE4I,MAAMxE,YAAY,iCAChCiD,EAAQlD,KAAK,sCAAsC5C,OACtD8F,EAAQhD,SAAS,mBAGjBgD,EAAQhD,SAAS,oBAKpB6R,eAAgB,SAAUrF,GACzBpH,IAAIoO,EAAahH,EAAOjQ,aAAK4T,GAC5B,GAAIA,EAAMxD,UAAW,OAAOwD,EAAMxD,YAGnCpI,KAAKyK,YAAYzS,aAAIiV,GAChBgC,EAAWlD,SAASkB,EAASzK,GAAG4F,aACnC6E,EAASqB,UACLrB,EAASzK,GAAY,SACxByK,EAASiC,UAAUjC,EAASzK,GAAY,aAM5C2M,WAAY,SAAUlH,GACrBjI,KAAK+K,OAAO9C,GACZjI,KAAKsN,eAAerF,IAGrByG,yBAA0B,WACzB,GAAM1O,KAAKwK,UAAYxK,KAAKwK,SAAS7R,OAErC,IAAK,IAAID,EAAI,EAAGA,EAAIsH,KAAKwK,SAAS7R,OAAQD,IAAK,CAC9C,IAAI+F,EAAUuB,KAAKwK,SAAS9R,GACxB8J,EAAK/D,EAAQ+D,GACjB,GAAIA,GAAMA,EAAG4M,YAAa,CACzB,IAAIC,GAAW,EAEX7M,EAAG8M,yBACND,GAAYrP,KAAKuP,0BAA0B/M,EAAG8M,yBAG3CD,GAAY5Q,EAAQ+Q,0BACvBH,GAAW,GAGZ5Q,EAAQ4Q,SAASA,MAKpBd,yBAA0B,SAAUD,GAEnC,IADA,IAAIhC,EAAKtM,KACAtH,EAAI,EAAG+W,EAAIzP,KAAKyK,YAAY9R,OAAQD,EAAI+W,EAAG/W,IAAK,CACxD,IAAIuU,EAAWjN,KAAKyK,YAAY/R,GAC5B4T,EAAG1J,MACNqK,EAASrK,IAAM0J,EAAG1J,IAClBqK,EAASzI,QAAU8H,EAAG1J,IAAI4B,QAC1ByI,EAASyC,QAAUpD,EAAG1J,IAAI8G,KAC1BuD,EAASzK,GAAKlM,OAAOwN,KAAK+E,aAAayD,EAAG1J,IAAI4B,QAC7CyI,EAASzK,GAAG4F,UAAWkE,EAAG1J,IAAI8G,OAASuD,EAASzK,GAG7C8J,EAAGd,MACNyB,EAASI,KAAOf,EAAGd,IAAI6B,OAGzBiB,GAAWrB,EAASzK,IAAMyK,EAASqB,SAAWrB,EAASqB,YAIzDqB,sBAAuB,WACtB3P,KAAK4K,QAAQrP,KAAK,gCAAgCqL,KAAK,SAAUlO,GAChEtB,EAAE4I,MAAM9D,KAAKxD,EAAI,MAGnBoS,cAAe,WACd,IAAIwB,EAAKtM,KACTA,KAAK4K,QAAQ/O,GAAG,UAAW,SAAU+T,GACpC,GAAgB,GAAZA,EAAGC,MAAY,CAClB,IAAIC,EAAU1Y,EAAEwY,EAAGG,QAClBvL,EAAUsL,EAAQzY,KAAK,gBACvB+Q,EAAY0H,EAAQzY,KAAK,kBAC1B,GAAImN,EACH,OAAO8H,EAAG0D,WAAWxL,EAAS4D,EAAWwH,EAAGK,cAIhDD,WAAY,SAAUxL,EAAS4D,EAAW8H,GACzC,IACCC,EAAW,KACXC,EAAO,KACPnI,EAHQjI,KAGIyK,YACZ4F,GACU,EAGX,GAAI7L,GARKxE,KAQSwE,QAAS,CAE1B,KADA2L,EATQnQ,KASMsQ,uBACIH,EAASxC,OAC1B,OAED1F,EAASkI,EAASxC,OAAOlD,YAG1B,IAAK,IAAI/R,EAAI,EAAGmE,EAAMoL,EAAOtP,OAAQD,EAAImE,EAAKnE,IAAK,CAClD,GAAIuP,EAAOvP,GAAG8J,GAAG4F,WAAaA,EAAW,CACxC,GAAI8H,EAAO,CACNE,EACHpQ,KAAKuQ,UAAUH,GAEfhZ,EAAE4I,KAAKwQ,gBAAgBC,QAExB,MAMD,GAJI/X,EAAImE,EAAM,IACbwT,EA3BMrQ,KA2BO0Q,oBAAoBhY,EAAGuP,IAGjCoI,EACH,MAGErQ,KAAK2Q,WAAW1I,EAAOvP,MAC1B0X,EAAOnI,EAAOvP,IAsBhB,OAnBK2X,IAEAF,EAECA,EAASvN,IAAIgO,KAAOT,EAASU,KAAKC,UAAUnY,OAE/CwX,EAASnU,aAAY,EAAO,WAC3BmU,EAASU,KAAKrF,IAAImC,OAAOqC,WAAWG,EAASU,KAAKrO,GAAGnI,OAAQ8V,EAASU,KAAKrO,GAAG4F,aAI/E+H,EAASU,KAAKC,UAAUX,EAASvN,IAAIgO,KAAK5U,aAAY,GAE5CkU,GAEX9Y,EAAE4I,KAAKwQ,gBAAgBC,UAIlB,GAERC,oBAAqB,SAAUK,EAAW9I,GAEzC,IAAK,IAAIvP,EAAIqY,EAAY,EAAGlU,EAAMoL,EAAOtP,OAAQD,EAAImE,EAAKnE,IAAK,CAC9D,IAAIkT,EAAQ3D,EAAOvP,GACnB,GAAIsH,KAAK2Q,WAAW/E,GAAQ,CAC3B,GAA2B,UAAvBA,EAAMpJ,GAAG0F,UAQZ,OANM0D,EAAMiF,KAAKC,WAAalF,EAAMiF,KAAKC,UAAUnY,QAElDiT,EAAMiF,KAAKG,cAGZpF,EAAMiF,KAAKC,UAAU,GAAGG,aACjB,EAED,IAAKC,QAAQ5a,OAAOiK,MAAM4Q,cAAevF,EAAMpJ,GAAG0F,WAExD,OADAlI,KAAKuQ,UAAU3E,IACR,KAKX+E,WAAY,SAAU/E,GACrB,MAA6B,UAAtBA,EAAMwF,aAA4BxF,EAAMuB,UAAYvB,EAAMuB,SAASkE,GAAG,aAE9Ed,UAAW,SAAU3E,GAEI,SAApBA,EAAMpJ,GAAG0F,UACP0D,EAAMiF,KAAKC,UAAUnY,OAGzBiT,EAAMiF,KAAKC,UAAU,GAAG9U,aAAY,GAFpC4P,EAAMiF,KAAKG,YAAY,GAIdpF,EAAM0F,OAChB1F,EAAM0F,OAAOf,YACH3E,EAAM2F,QAChB3F,EAAM2F,OAAOd,SAGfH,kBAAmB,WAClB,OAAOlZ,EAAE,kBAAkB2X,KAAK,aAEjCP,mBAAoB,WAEnB,IAGIgD,GAAU,EAEd,IAAK,IAAIC,KAAQzR,KAAKyK,YAAa,EAC9BuB,EAAIhM,KAAKyK,YAAYgH,IACvBC,oBAAqB,GACnB1F,EAAExJ,GAAGmP,YAAc3F,EAAExJ,GAAGoP,sBAAwB5F,EAAExJ,GAAGqP,wBACxDL,GAAU,GAIZ,GAAKA,EAAL,CAGA,IAAK,IAAI9Y,EAhBAsH,KAgBOyK,YAAY9R,OAAS,EAAGD,GAAK,EAAGA,IAAK,CACpD,IAAIsT,GAAAA,EAjBIhM,KAiBGyK,YAAY/R,IACrBoZ,oBAAqB,EACnB9F,EAAExJ,GAAGmP,aAGR3F,EAAE8F,mBAAqB9R,KAAKuP,0BAA0BvD,EAAExJ,GAAGmP,YAGvD3F,EAAE8F,mBACD9F,EAAExJ,GAAGuP,2BACR/F,EAAExJ,GAAGuP,0BAA2B,EAChC/F,EAAEsC,WAGEtC,EAAExJ,GAAGuP,2BACT/F,EAAExJ,GAAGuP,0BAA2B,EAChC/F,EAAEsC,YAKDtC,EAAExJ,GAAGoP,sBACR5R,KAAKgS,uBAAuBhG,EAAExJ,GAAGoP,qBAAsB5F,EAAExJ,GAAG4F,UAAW,QAGpE4D,EAAExJ,GAAGqP,sBACR7R,KAAKgS,uBAAuBhG,EAAExJ,GAAGqP,qBAAsB7F,EAAExJ,GAAG4F,UAAW,aAIzEpI,KAAK2P,0BAENqC,uBAAwB,SAAUC,EAAW7J,EAAW8J,GACvDrR,IAEIsR,EADAhQ,EADenC,KAAKuP,0BAA0B0C,GACvB,EAAI,EAG3BjS,KAAKwL,IACR2G,EAAWnS,KAAKwL,KACNxL,KAAKoS,WAA8B,aAAjBpS,KAAKwE,WACjC2N,EAAWnS,MAERmS,IACCnS,KAAK4C,KAAO5C,KAAK4C,IAAIvI,QAAU2F,KAAK4C,IAAIyP,aAC3CF,EAASG,oBAAqB,EAC9BH,EAASI,gBAAgBvS,KAAK4C,IAAIyP,YAAaH,EAAU/P,EAAOnC,KAAK4C,IAAIvI,OAAQ+N,EAAWpI,KAAK4C,IAAI8G,MACrGyI,EAASG,oBAAqB,EAE9BtS,KAAK0K,YAAYtC,IAAcpI,KAAK0K,YAAYtC,GAAWkG,WAE3D6D,EAASI,gBAAgBnK,EAAW8J,EAAU/P,KAIjDoN,0BAA2B,SAAUiD,GACpC,IAAIC,EAAM,KAGV,KAFI7P,EAAM5C,KAAK4C,MAEH5C,KAAK0S,WAChB,IAAI9P,EAAM5C,KAAK0S,YAAW,GAG3B,GAAK9P,EAAL,CAIA,IAAIvI,EAAS2F,KAAKwL,IAAMxL,KAAKwL,IAAI5I,IAAM5C,KAAK4C,KAAO,KAEnD,GAA4B,oBAC3B6P,EAAMD,OAEA,GAA4B,qBAClCC,EAAMD,EAAW5P,QAEX,GAA6B,SAAzB4P,EAAW9X,OAAO,EAAG,GAC/B,IACC+X,EAAMnc,OAAO0K,MAAM1J,KAAKkb,EAAW9X,OAAO,GAAI,KAAEkI,SAAKvI,IACjDA,GAAUA,EAAOsY,SAAWH,EAAWzG,SAAS,oBACnD0G,GAAM,GAEN,MAAOja,GACRlC,OAAOsc,MAAMtR,GAAG,yCAGX,GAA6B,OAAzBkR,EAAW9X,OAAO,EAAG,IAAasF,KAAKwL,IACjDiH,EAAMzS,KAAKwL,IAAIqH,eAAe1E,QAAQqE,EAAW9X,OAAO,GAAIsF,KAAKwE,QAASxE,KAAK0P,aACzE,CACN,IAAIvN,EAAQS,EAAI4P,GAEfC,EADGrb,EAAEoO,QAAQrD,KACLA,EAAMxJ,SAENwJ,EAIV,OAAOsQ,MAITnc,OAAOsI,GAAGmD,KAAKqM,QAAUjF,MAAMnO,OAAO,CACrCiP,KAAM,SAAS0D,EAAQnL,GACtBxC,KAAK2N,OAASA,EACd3N,KAAKwC,GAAKA,GAAM,GAChBxC,KAAKyK,YAAc,GACnBzK,KAAK0K,YAAc,GAEnB1K,KAAK2K,OAGL3K,KAAKmI,IAAM,CACVyC,QAAS5K,KAAK4K,SAGf5K,KAAKsO,WAEN3D,KAAM,WACA3K,KAAK2N,OAAOE,OAChB7N,KAAK2N,OAAOE,KAAOzW,EAAE,iCAAiC6E,SAAS+D,KAAK2N,OAAO/C,UAE5E/J,IAAIiS,EAAY9S,KAAK2N,OAAOoF,YAC5B/S,KAAK4K,QAAUxT,mCAAmC0b,EAAY,eAAiB,UAC7E7W,SAAS+D,KAAK2N,OAAOE,MACvB7N,KAAK2N,OAAOnD,SAAS1N,KAAKkD,MAEtBA,KAAKwC,KACJxC,KAAKwC,GAAG/B,OACXT,KAAKgT,YAEFhT,KAAKwC,GAAGyQ,aACX7b,EAAE,oEAAsEkK,GAAGtB,KAAKwC,GAAGyQ,aAAe,UAChGhX,SAAS+D,KAAK4K,SAEb5K,KAAKwC,GAAG0Q,UACXlT,KAAK4K,QAAQnP,SAASuE,KAAKwC,GAAG0Q,UAE3BlT,KAAKwC,GAAG2Q,aACXnT,KAAK4K,QAAQwI,YAAY,eAAe,IAK1CpT,KAAKhB,KAAO5H,EAAE,8BAA8B6E,SAAS+D,KAAK4K,UAG3DoI,UAAW,sBACVhT,KAAK4N,KAAOxW,uCACTkK,GAAGtB,KAAKwC,GAAG/B,yFAIdT,KAAK4N,KAAK3R,SAAS+D,KAAK4K,SACxB5K,KAAK6B,UAAY7B,KAAK4N,KAAKrS,KAAK,uBAChCyE,KAAK6B,UAAUwR,OACXrT,KAAKwC,GAAG4M,cAEXpP,KAAKsT,cAAgBtT,KAAK4N,KAAK/R,GAAG,mBACjCmE,EAAKqP,aAGNrP,KAAK6B,UAAU0R,SAGjBjF,QAAS,WACR,GAAKtO,KAAKwC,GAAV,CAIA,IAAI6Q,EAAOrT,KAAKwC,GAAGkJ,QAAU1L,KAAKwC,GAAGuP,0BAGhCsB,GAAQrT,KAAK2N,QAAU3N,KAAK2N,OAAOnC,MAAQxL,KAAK2N,OAAOnC,IAAIgI,SAASxT,KAAKwC,GAAGiR,WAAa,EAAG,UAChGJ,GAAO,GAGRrT,KAAK4K,QAAQwI,YAAY,iBAAkBC,KAE5ChE,SAAU,SAAUgE,GAEnB,GAAMrT,KAAK4N,MAAQ5N,KAAKhB,KAAxB,MAIWuE,IAAP8P,IACHA,GAAQrT,KAAKhB,KAAKN,SAAS,SAG5BsB,KAAKhB,KAAKoU,YAAY,OAAQC,GAC9BrT,KAAK4N,KAAKwF,YAAY,YAAaC,GAEnCxS,IAAI6S,EAAiBL,EAAO,OAAS,UAErCrT,KAAK6B,UAAY7B,KAAK6B,UAAU3F,KAAK5F,OAAO0K,MAAMC,KAAKyS,EAAgB,KAAM,SAG7E1T,KAAKyK,YAAYlS,iBAASyT,GACH,aAAlBA,EAAExJ,GAAG0F,WACR8D,EAAEsC,cAKLqF,wBACC,OAAO3T,KAAKhB,KAAKN,SAAS,SAG3B8Q,sBAAuB,WAEtB,IADA,IAAIoE,GAAoB,EACfC,EAAI,EAAGpE,EAAIzP,KAAKyK,YAAY9R,OAAQkb,EAAIpE,EAAGoE,IAAK,CACxD,IAAIC,EAAa9T,KAAKyK,YAAYoJ,GAAGrR,GACrC,GAAIsR,EAAWrI,MAAiD,MAAzCzL,KAAK2N,OAAO/K,IAAIkR,EAAW1L,WAAoB,CACrEwL,GAAoB,EACpB,OAGF,OAAOA,KAITtd,OAAOsI,GAAGmD,KAAKsM,OAASlF,MAAMnO,OAAO,CACpCiP,KAAM,SAASxL,EAAS+D,GAClBA,IAAIA,EAAK,IAEdxC,KAAKwC,GAAKA,EACVxC,KAAKvB,QAAUA,EACfuB,KAAK2K,OACL3K,KAAK+T,sBAENpJ,KAAM,WACL3K,KAAK4K,QAAUxT,EAAE,gEAGR6E,SAAS+D,KAAKvB,QAAQO,MAC7BzD,KAAK,QACLM,GAAG,SAAU,WACb,OAAO,IAGLmE,KAAKwC,GAAG/B,OACXrJ,EAAE,gCAAkCkK,GAAGtB,KAAKwC,GAAG/B,OAC5C,YAAYxE,SAAS+D,KAAK4K,UAG/BmJ,mBAAoB,WAEnB,IAAIxG,EAAUzK,KAAK,GAAK9C,KAAKvB,QAAQmM,QAAQrP,KAAK,gBAAgB5C,QAElEqH,KAAKvB,QAAQmM,QAAQrP,KAAK,gBAAgBC,cACxCC,SAAS,eACTA,SAAS,UAAY8R,IAGxBe,QAAS,WACRtO,KAAKvB,QAAQ6P,aCztBfhY,OAAOC,QAAQ,aAEfD,OAAOsI,GAAGoV,WAAa1d,OAAOsI,GAAGmD,KAAKqI,OAAOpP,OAAO,CACnDiP,KAAM,SAASI,GACdjT,EAAE4D,OAAOgF,KAAMqK,GACfrK,KAAKiU,OAAQ,EACbjU,KAAKqJ,SACLjS,EAAEwP,KAAK5G,KAAKiI,QAAU,GAAI,SAASvP,EAAGsT,IACjCA,EAAE5D,WAAa4D,EAAEvL,QACpBuL,EAAE5D,UAAY4D,EAAEvL,MAAMJ,QAAQ,KAAM,KAAKzF,iBAGxCoF,KAAKkU,QACPlU,KAAKmU,WAAWnU,KAAKkU,SAGvBvJ,KAAM,sBACD2B,EAAKtM,KACNA,KAAKiI,SACPjI,KAAKqJ,SACLrJ,KAAKsO,UAELlX,EAAEwP,KAAK5G,KAAKyK,YAAa,SAAS/R,EAAGkT,GACpC,GAAIA,EAAMpJ,GAAY,QAAG,CACxB3B,IAAIuT,EAAYxI,EAAMpJ,GAAY,QAEjB,SAAb4R,GAAiD,QAAzBxI,EAAMpJ,GAAc,YAC/C4R,EAAY9d,OAAO8O,SAASiP,aAG7BzI,EAAMsD,UAAUkF,GAEhB9H,EAAGkC,wBAIDxO,KAAKsU,oBACRtU,KAAKuU,wBAGNnd,EAAE4I,KAAK4K,SAASrP,KAAK,iBAAiBM,GACrC,+CAECmE,EAAKiU,OAAQ,EACb3d,OAAOiJ,aAAa,mBACbjJ,OAAO2J,QAAQ,uBACfqM,EAAGkC,4BAOdgG,cAAc,EACdC,qBAAsB,WAClBzU,KAAK0U,UACRtd,EAAEwP,KAAK5G,KAAKyK,YAAa,SAAS/R,EAAGsT,GACpC,IAAIkF,QAAQ,CAAC,OAAQ,WAAY,OAAQ,SAAUlF,EAAExJ,GAAG0F,YAAc8D,EAAEuE,UAEvE,OADAvE,EAAEuE,aACK,KAIVgE,sBAAuB,WACtB,IAAIjI,EAAKtM,KACT5I,EAAE4I,KAAKhB,MAAMzD,KAAK,sDAAsDoZ,SAAS,SAASnc,GAC7E,IAATA,EAAEqX,OACDvD,EAAGsI,qBACLpc,EAAEqc,iBACFvI,EAAGwI,kBAAkB3G,QAAQ,aAKjC4G,UAAW,SAAS3M,GACnB,IAAIwD,EAAQ5L,KAAK0K,YAAYtC,GAC7B,OAAOhR,EAAEwU,EAAMrU,IAAMqU,EAAMrU,IAAMqU,EAAMoJ,QAExCC,UAAW,SAAS7M,GACnB,OAAOpI,KAAK0K,YAAYtC,IAEzBsK,WAAY,SAASwC,GACpB,IAAIrL,EAAM,GACNsL,EAAS,GACb,IAAK,IAAIC,KAAOpV,KAAK0K,YAAa,CACjC,IAAIsB,EAAIhM,KAAK0K,YAAY0K,GACzB,GAAIpJ,EAAE5H,UAAW,CAChB,IAAI2C,EAAIiF,EAAE5H,YAET4H,EAAExJ,GAAGiJ,MACLrI,QAAqB,iBAAN2D,EAAiBsO,WAAWtO,GAAKA,IAEhDoO,EAAOrY,KAAKwE,GAAG0K,EAAExJ,GAAG/B,QAEjBuL,EAAExJ,GAAGiJ,MACc,gBAAnBO,EAAExJ,GAAG0F,WACL9E,QAAQiS,WAAW/V,KAAKyH,MAC3BoO,EAAOrY,KAAKwE,GAAG0K,EAAExJ,GAAG/B,QAEhB2C,QAAQ2D,KAAI8C,EAAImC,EAAExJ,GAAG4F,WAAarB,IAGzC,OAAIoO,EAAOxc,SAAWuc,GACrB5e,OAAOgf,SAAS,CACflU,MAAOE,GAAG,2BACVQ,QAASR,GAAG,yCACX,mBAAqB6T,EAAOjd,KAAK,QAAU,QAC5C2J,UAAW,WAEL,MAEDgI,GAERzF,UAAW,SAASgR,GACnB,IAAIpJ,EAAIhM,KAAK0K,YAAY0K,GACzB,OAAOpJ,IAAMA,EAAE5H,UAAY4H,EAAE5H,YAAc,OAE5CmR,UAAW,SAASH,EAAKI,cACxB,OAAO,IAAIxX,iBAAQC,GAClB,IAAI+N,EAAIhM,EAAK0K,YAAY0K,GACtBpJ,EACFA,EAAEuJ,UAAUC,GAAK9V,gBAChBsM,EAAEkD,UAAUsG,GACZxV,EAAKwO,qBACLvQ,MAGDA,OAIHwX,UAAW,SAASrN,GACnB,QAASpI,KAAK0K,YAAYtC,IAE3B8G,UAAW,SAASkG,EAAKI,GACxB,OAAOxV,KAAKuV,UAAUH,EAAKI,IAE5BrB,WAAY,SAASuB,GACpB7U,IAAI8U,EAAW,GACf,IAAI,IAAIP,KAAOM,EACX1V,KAAK0K,YAAY0K,IACnBO,EAAS7Y,KAAKkD,KAAKuV,UAAUH,EAAKM,EAAKN,KAIzC,OAAOpX,QAAQ4X,IAAID,IAEpBE,MAAO,WACN,IAAI,IAAIT,KAAOpV,KAAK0K,YAAa,CAChC,IAAIsB,EAAIhM,KAAK0K,YAAY0K,GACtBpJ,GAAKA,EAAEkD,WACTlD,EAAEkD,UAAUlD,EAAExJ,GAAY,SAAK,MAIlC+P,gBAAiB,SAAUnK,EAAW0N,EAAM3T,GAC3CnL,IAAM4U,EAAW5L,KAAKiV,UAAU7M,GAChCwD,EAAMpJ,GAAGsT,GAAQ3T,EACjByJ,EAAM0C,aC7JRhY,OAAOsI,GAAGmD,KAAKgU,aAAe5M,MAAMnO,OAAO,CAC1CiP,KAAM,SAAUI,GAEfjT,EAAE4D,OAAOgF,KAAMqK,GAEf,IAAIiC,EAAKtM,KACW,YAAhBA,KAAKwE,QACRlO,OAAOiK,MAAMyV,aAAahW,KAAKwE,QAAS,SAAUyR,GACjD3J,EAAG3B,SAGJ3K,KAAK2K,QAGPA,KAAM,WACL,IAAI2B,EAAKtM,KAETA,KAAKkW,MAAQ,EACblW,KAAKmW,OAAS,IAAI7f,OAAOsI,GAAGwX,OAAO,CAClChV,MAAOE,GAAG,aAAc,CAAkB,YAAhBtB,KAAKwE,QAAyBlD,GAAG,SAAWA,GAAGtB,KAAKwE,WAC9EyD,OAAQ,CACP,CACCC,UAAW,OAAQE,UAAW,MAAO3H,MAAOa,GAAG,kBAC/C2R,YAAa3R,GAAG,2BAEjB,CACC4G,UAAW,OAAQE,UAAW,WAE/B,CACCF,UAAW,SAAUE,UAAW,OAAQ3H,MAAOa,GAAG,QAAS3C,iBAC1D2N,EAAG4J,OAAS,GACZ5J,EAAG+J,YAINC,qBAAsBhV,GAAG,UACzBiV,eAAgB,WACfjK,EAAG4J,MAAQ,EACX5J,EAAG+J,YAIDrW,KAAKzI,KACRyI,KAAKmW,OAAOzL,YAAYnT,IAAI2X,UAAUlP,KAAKzI,KAE5CyI,KAAKmW,OAAOpB,UAAU,OAAOlZ,GAAG,WAAY,SAAUrD,GACrC,KAAZA,EAAEqX,QACLvD,EAAG4J,MAAQ,EACX5J,EAAG+J,YAGLrW,KAAKmW,OAAO5C,OACZvT,KAAKqW,UAENA,OAAQ,WACP,IAAIG,EAAO,CACVjf,IAAKyI,KAAKmW,OAAOzL,YAAYnT,IAAI6M,YACjCqS,YAAa,OACbP,MAAOlW,KAAKkW,OAET5J,EAAKtM,KAELA,KAAK+P,OAAO2G,kBACf1W,KAAK+P,OAAO2G,iBAAiBF,GAI1BxW,KAAK+P,OAAO4G,SAAW3W,KAAK+P,OAAO6G,UAAU5W,KAAKoI,YAClDpI,KAAK+P,OAAO6G,UAAU5W,KAAKoI,WAAWyO,WACzCzf,EAAE4D,OAAOwb,EACRxW,KAAK+P,OAAO6G,UAAU5W,KAAKoI,WAAWyO,UAAU/a,QAAQ8G,MAG1DtM,OAAOwgB,YAAY9W,KAAKwE,QAASgS,EAAM,SAAUP,GAChD,IAAI5b,EAASiS,EAAG6J,OAAOzL,YAAYqM,QAAQ5J,UACxB,IAAfqJ,EAAKN,OACR7b,EAAO+R,QAGJ6J,EAAE/B,OAAOvb,OACZvB,EAAEwP,KAAKqP,EAAE/B,OAAQ,SAAUxb,EAAGqO,GACnB3P,EAAE+E,KAAK,2OAKP,CACRuN,KAAM3C,EAAE,GACRmN,OAAQnN,EAAEqG,OAAO,GAAGlV,KAAK,SACtB+D,SAAS5B,GAEVkB,KAAK,KACPlE,KAAK,aAAc0P,EAAE,IACrBpI,MAAM,WACN,IAAIwD,EAAQ/K,EAAE4I,MAAM3I,KAAK,cAczB,OAZIiV,EAAGyD,OAAO4G,QAEbrK,EAAG0K,YAAY7U,IAEXmK,EAAGyD,OAAOvL,QACb8H,EAAGyD,OAAOkH,gCAAgC9U,IAE1CmK,EAAGyD,OAAOb,UAAU/M,GACpBmK,EAAGyD,OAAOwB,OAAOpD,QAAQ,WAE1B7B,EAAG6J,OAAO9C,SAEJ,MAIVjc,EAAE,mCAAqCkK,GAAG,cAAgB,WACtDhL,OAAOiK,MAAM2W,WAAW5K,EAAG9H,SAC5B,qDACElD,GAAG,mBAAoB,CAACA,GAAGgL,EAAG9H,WAAa,OAAU,IACvD,QAAQvI,SAAS5B,GAAQkB,KAAK,YAAYoD,MAAM,WACjDrI,OAAO6gB,QAAQ7K,EAAG9H,WAIjByR,EAAE/B,OAAOvb,OAAS,KACN2T,EAAG6J,OAAOzL,YAAY0M,KAAKjK,SACjCkG,QAGRrT,KAAKmW,OAAOrB,oBAGhBkC,YAAa,SAAU7U,GACtB,IAAImK,EAAKtM,KAAMqX,GAAU,EACrBC,EAAI,KACR,GAAItX,KAAKuX,cACRjhB,OAAOkhB,OAAO,CACbpP,UAAW,MAAOF,UAAW,QAASzH,MAAO,MAC7CgX,QAAW,EAAGhM,KAAM,GAClB,SAAUsD,GACZ3X,EAAEwP,KAAK0F,EAAGyD,OAAOvE,IAAI5I,IAAI0J,EAAGyD,OAAOvN,GAAG4F,YAAc,GAAI,SAAU1P,EAAG4e,GACpE,GAAIA,EAAEhL,EAAGlE,aAAejG,EAIvB,OAHA7L,OAAOiK,MAAMgV,UAAU+B,EAAE9S,QAAS8S,EAAE5N,KAAM4C,EAAGiL,cAAexI,EAAK2I,KACjEphB,OAAOsL,WAAWN,GAAG,kBAAmB,CAACa,EAAOmV,EAAEhL,EAAGiL,kBACrDF,GAAU,GACH,IAGJA,GACJ/gB,OAAOiJ,aAAa,YAElB+X,EAAIhL,EAAGyD,OAAOiB,iCAET1a,OAAO2J,QAAQ,gBAEpBY,IAAI2V,EAAO,GAIX,OAHAA,EAAKlK,EAAGlE,WAAajG,EACrBqU,EAAKlK,EAAGiL,eAAiBxI,EAAK2I,IAEvBphB,OAAOiK,MAAMgV,UAAU+B,EAAE9S,QAAS8S,EAAE5N,KAAM8M,sBAE5ClgB,OAAOsL,WAAWN,GAAG,kBAAmB,CAACa,EAAO4M,EAAK2I,WAG3DpW,GAAG,gBAAiBA,GAAG,aACpB,GAAIgL,EAAGqL,mBAAoB,CAC7BL,EAAIhL,EAAGyD,OAAOiB,cAClB1a,OAAOiK,MAAMgV,UAAU+B,EAAE9S,QAAS8S,EAAE5N,KAAM4C,EAAGqL,mBAAoBrL,EAAGsL,wBACpEthB,OAAOiK,MAAMgV,UAAU+B,EAAE9S,QAAS8S,EAAE5N,KAAM4C,EAAGlE,UAAWjG,GACxD7L,OAAOsL,WAAWN,GAAG,gBAAiB,CAACgL,EAAGsL,uBAAwBzV,SAC5D,CACFmV,EAAIhL,EAAGyD,OAAOiB,cAClB1a,OAAOiK,MAAMgV,UAAU+B,EAAE9S,QAAS8S,EAAE5N,KAAM4C,EAAGlE,UAAWjG,GACxD7L,OAAOsL,WAAWN,GAAG,YAAa,CAACa,SAKtC7L,OAAOwgB,YAAc,SAAUtS,EAASgS,EAAMqB,EAAUC,GAClDtB,IACJA,EAAO,CACNjf,IAAK,KAGPif,EAAKhS,QAAUA,EACVgS,EAAKC,cACTD,EAAKC,YAAc,QAGpBngB,OAAOyhB,KAAK,CACXC,OAAQ,mCACR/d,KAAM,MACNuc,KAAMA,EACNqB,SAAU,SAAU5B,GACnB4B,GAAYA,EAAS5B,IAEtB6B,IAAKA,KCpMPxhB,OAAOsI,GAAGmD,KAAKkW,kBAAoB,MAClCC,YAAY7N,cAEXb,OAAO2O,OAAOnY,KAAMqK,GACpBrK,KAAKoY,WAA6B,YAAhBpY,KAAKwE,QAClBxE,KAAKoY,WAGTpY,KAAKiK,OAFL3T,OAAOiK,MAAMyV,aAAahW,KAAKwE,0BAAexE,EAAKiK,SAMrDiO,OACClY,KAAKqY,YAAc,GACnBrY,KAAKsY,kBAAoB,GACzBtY,KAAKiI,OAASjI,KAAKuY,aAEnBvY,KAAK2K,OAGNuN,aACClhB,IAAMwhB,EAAiBxY,KAAKyY,sBACtBC,EAAgB1Y,KAAK2Y,oBACrBC,EAAc5Y,KAAK6Y,kBACnBC,EAAyB9Y,KAAK+Y,6BAEpC,OAAWP,SAAmBE,EAAeE,EAAmBE,GAGjEZ,+BAKC,MAAO,CACN,CACChQ,UAAW,OAAQE,UAAW,gBAE/B,CACCF,UAAW,SAAUE,UAAW,WAChC3H,MAAOa,GAAG,QAAS3C,iBATpBqB,EAAKqY,aAAe,GACpBrY,EAAKgZ,eAQqCC,KAAKjZ,QAKjDkY,kBACC,OAAIlY,KAAK4Y,aAAe5Y,KAAK4Y,YAAYjgB,OAEjC,CACN,CAAEuP,UAAW,yBACVlI,KAAK4Y,aAGF,GAITV,wCACOjQ,EAAS,GACf,GAAIjI,KAAKkZ,4BAA8BlZ,KAAKmZ,gBAAiB,CAK5DlR,EAAOnL,KAAK,CAAEoL,UAAW,OAAQE,UAAW,yBAC5CH,EAAOnL,KAAK,CACXoL,UAAW,SAAUE,UAAW,iBAAkBsD,OAAQ,EAC1DjL,MAAOa,GAAG,QAAS3C,iBANnBqB,EAAKsY,mBAAqB,GAC1BtY,EAAKoZ,sBAK6CH,KAAKjZ,QAGzD,OAAOiI,EAGRiQ,kBACKmB,EAAiBrZ,KAAKwE,QAAQ8U,SAC9BlY,EAAQE,GAAG,aAAc,CAACtB,KAAKoY,WAAa9W,GAAG,SAAWA,GAAG+X,KAEjErZ,KAAKmW,OAAS,IAAI7f,OAAOsI,GAAGwX,OAAO,CAClChV,MAAOA,EACP6G,OAAQjI,KAAKiI,OACbsR,KAAMvZ,KAAKuZ,KACXjD,qBAAsBtW,KAAKsW,sBAAwBhV,GAAG,aACtDkY,uBAAwBlY,GAAG,WAAY,CAACA,GAAGtB,KAAKwE,WAChD+R,0BACC1V,IAAI4Y,EAAezZ,EAAK0Z,qBAClBC,EAAcC,WAAWlH,aACzBmH,EAAoB7Z,EAAK8Z,2BACzBC,EAAyB/Z,EAAKga,4BAAyBha,EAAKia,wCAClEja,EAAKka,OAAOH,EAAoBvQ,iBAC5BxJ,EAAKwW,KACLmD,EACAF,qBACHI,MAGFM,iBAAkBna,KAAKoa,kBAAkBnB,KAAKjZ,QAG3CA,KAAKqa,mBACRra,KAAKsa,mBAGNta,KAAKwW,KAAO,GAEZxW,KAAKua,gBACLva,KAAKwa,cACLxa,KAAKgZ,cACLhZ,KAAKmW,OAAO5C,OAGb2E,kBAAkB1f,GAEbA,IACHwH,KAAKya,oBACLnkB,OAAO6gB,QAAQnX,KAAKwE,SAAS,IAI/B0T,+BAGC,GADA5hB,OAAOokB,cAAgB,GACnBnV,MAAMC,QAAQxF,KAAK2a,SACtB,IAAK,UAAU3a,KAAK2a,wBAAS,CAAxB9Z,IAAI2B,OACRlM,OAAOokB,cAAclY,EAAG4F,WAAapI,KAAKmW,OAAOzL,YAAYlI,EAAG4F,WAAWhE,kBAAeb,OAG3FiG,OAAOoR,KAAK5a,KAAK2a,SAASpiB,iBAAQsiB,GACjCvkB,OAAOokB,cAAcG,GAAU7a,EAAKmW,OAAOzL,YAAYmQ,GAAQzW,kBAAeb,IAKjF2U,gBACClY,KAAK7E,QAAU/D,EAAE4I,KAAKmW,OAAOnX,MAC7BgB,KAAKmN,SAAWnN,KAAKmW,OAAOzL,YAAYoQ,aAAa3N,SAASjM,OAAO,iIAGrElB,KAAK+a,SAAW/a,KAAKmN,SAAS5R,KAAK,YACnCyE,KAAK+a,SAAS7Z,OAAOlB,KAAKgb,iBAG3B9C,gCACClY,KAAKib,mBAAmBvb,cAAKuW,GAC5BjW,EAAKkb,cAAgBjF,EAAEnU,SAAW,GAClC9B,EAAKmb,yBAELnb,EAAKmN,SAAS1R,SAAS,UACvBuE,EAAKob,eAAe5f,YAAY,UAChCwE,EAAKmW,OAAOzL,YAAY2Q,SAASlO,SAASkG,SAI5C6E,yBACKlY,KAAKmW,OAAOzL,YAAwC,2BAAEtG,YACzDpE,KAAKoZ,sBAELpZ,KAAKkb,cAAgB,GACrBlb,KAAKgZ,cACLhZ,KAAKmN,SAAS3R,YAAY,UAC1BwE,KAAKob,eAAe3f,SAAS,WAI/Byc,oCACMlY,KAAKsb,gBAGTlf,sBACC4D,EAAKsb,gBAAgBC,WAAWC,SAAW,GAC3Cxb,EAAKsb,gBAAgBhN,QAAQtO,EAAKyb,4BAClCzb,EAAKob,eAAe7f,KAAK,kBAAkBT,IAAI,SAAU,SACzDkF,EAAKob,eAAe7f,KAAK,kBAAkBT,IAAI,aAAc,WAC3D,KAPHkF,KAAK0b,wBAWPxD,8BAEC,MAAO,CADQlY,KAAKwE,gBACDxE,KAAK2b,eAAe3jB,aAAIsf,UAAQ5N,KAAMpT,OAAOgK,QAAQgX,GAAIsE,UAAU,KAGvF1D,2BAMC,OALIlY,KAAKkb,cAAcviB,OAASqH,KAAKsY,kBACpCtY,KAAKmW,OAAOzL,YAAYmR,eAAeC,QAAO,GAE9C9b,KAAKmW,OAAOzL,YAAYmR,eAAeC,QAAO,GAExC9b,KAAKkb,cACVa,MAAM,EAAG/b,KAAKsY,mBACdtgB,aAAIsf,UAAK9N,OAAO0K,OAAOoD,GAAGyE,MAAM,KAGnC7D,wBACClhB,IAAMglB,EAAiBhc,KAAKic,8BACtBnU,EAAO9H,KAAKyb,2BAClBzb,KAAKob,eAAiBpb,KAAKmW,OAAOzL,YAAYwR,qBAAqB/O,SACnEnN,KAAKob,eAAe3f,SAAS,QAE7BuE,KAAKsb,gBAAkB,IAAIhlB,OAAO6lB,UAAUnc,KAAKob,eAAe3N,IAAI,GAAI,CACvE2O,QAASJ,EACTjN,KAAMjH,EACN6F,OAAQ,QACR0O,eAAe,EACfC,gBAAgB,EAChBC,gBAAgB,EAChBC,WAAY,GACZC,cAAenb,GAAG,WAClBob,sBAAsB,IAEvB1c,KAAKob,eAAe7f,KAAK,kBAAkBT,IAAI,SAAU,SAG1Dod,iCACKjQ,EAAS,GAETmU,EAAU,IAAI7W,MAAM,GAoExB,OAhEA6W,EAAQ,GAAK,CACZ,CACClU,UAAW,OACXzH,MAAOa,GAAG,QACV8G,UAAW,gBAGbgU,EAAQ,GAAK,GACbA,EAAQ,GAAK,GAEThlB,EAAEoO,QAAQxF,KAAK2a,SAClB3a,KAAK2a,QAAQpiB,iBAASsiB,EAAQ8B,GAC7BP,GAASO,EAAQ,GAAK,GAAG7f,KAAK+d,KAG/BrR,OAAOoR,KAAK5a,KAAK2a,SAASpiB,iBAASsiB,EAAQ8B,GAC1C9b,IAAI+b,EAAUtmB,OAAOwN,KAAKyH,aAAavL,EAAKwE,SAASqW,GAIrDuB,GAASO,EAAQ,GAAK,GAAG7f,KAAK,CAC7BoL,UAAW0U,EAAQ1U,UACnBzH,MAAOmc,EAAQnc,MACf2H,UAAWyS,EACXzY,QAASwa,EAAQxa,QACjBqV,QAASzX,EAAK2a,QAAQE,OAMrBrR,OAAOqT,MACVrT,OAAOqT,KAAKT,GAITpc,KAAKkZ,6BACRlZ,KAAK8c,cAAgBxmB,OAAOwN,KAAK+E,aAAa7I,KAAKwE,QAASxE,KAAKmZ,iBAAiB/W,QAClFga,EAAQ,GAAGtf,KAAK,CACfoL,UAAW,QACXzH,MAAOa,GAAG,aAAc,CAACtB,KAAK8c,gBAC9B1U,UAAW,6BACX2U,SAAU/c,KAAKgd,uBAAuB/D,KAAKjZ,SAI7CiI,EAASmU,EACG,WACX,CAAElU,UAAW,iBACbkU,EAAW,IACX,CAAElU,UAAW,iBACbkU,EAAW,IACX,CAAElU,UAAW,gBAAiBE,UAAW,wBAGtCpI,KAAKqa,mBACRpS,EAAOnL,KACN,CACCoL,UAAW,OACXE,UAAW,gBAKPH,EAGRiQ,8BACClY,KAAKid,aAAe,IAAI3mB,OAAOsI,GAAGse,YAAY,CAC7C7iB,OAAQ2F,KAAKmW,OAAOlB,UAAU,eAAe9H,SAC7C3I,QAASxE,KAAKwE,QACd2Y,qBACCnd,EAAKgZ,iBAKPhZ,KAAKid,aAAarS,QAAQrP,KAAK,kBAAkB8X,OAGlD6E,qBACC,OAAIlY,KAAKqa,mBAAqBra,KAAKid,aAC3Bjd,KAAKid,aAAaG,cAAcC,gBAAQC,EAAKC,SACnD,OAAO/T,OAAO2O,OAAOmF,MAAK,IACxBC,EAAO,IAAK,CAACA,EAAO,GAAIA,EAAO,SAE/B,IAEI,GAITrF,yBACK5L,EAAKtM,KAETA,KAAK+a,SAASlf,GAAG,QAAS,uBAAwB,SAAUrD,GACtDpB,EAAEoB,EAAEuX,QAAQsB,GAAG,cAAiBja,EAAEoB,EAAEuX,QAAQsB,GAAG,MACnDja,EAAE4I,MAAMzE,KAAK,aAAa4S,QAAQ,WAIpCnO,KAAK+a,SAASlf,GAAG,QAAS,sCAA+BrD,GACxDwH,EAAK+a,SAASxf,KAAK,wCACjBua,KAAK,UAAY1e,EAAEoB,EAAEuX,QAAQsB,GAAG,eAGnCrR,KAAK7E,QAAQI,KAAK,wBAAwBM,GAAG,oBAC5CvF,OAAOknB,MAAMC,aAAc,EAC3Bzd,EAAKgZ,gBAGNhZ,KAAK7E,QAAQI,KAAK,2BAA2BM,GAAG,mBAC/C,IAAI6hB,EAAQtmB,EAAE4I,GACd2d,aAAaD,EAAM3O,KAAK,YACxB2O,EAAM3O,KAAK,UAAW3S,WAAW,WAChC9F,OAAOknB,MAAMC,aAAc,EAC3BnR,EAAGsR,aACHtR,EAAG0M,eACD,QAILd,kDACC,OAAKlY,KAAKsb,iBAAoBtb,KAAKsb,gBAAgBuC,YAAY/V,KAAKnP,OAEjDqH,KAAKsb,gBAAgBC,WAAWC,SAAS6B,gBAAQS,EAAcC,EAASpB,GAC1F,GAAe,GAAXoB,EAAc,CACjB/mB,IAAMgnB,EAAche,EAAKkb,cAAcyB,GAAOtiB,OACzCyjB,EAAa/R,SAASiS,IAC1BF,EAAahhB,KAAKkhB,GAGpB,OAAOF,GACL,IAVgF,GAepF5F,sCACC,OAAKlY,KAAKsb,iBAAoBtb,KAAKsb,gBAAgBuC,YAAY/V,KAAKnP,OAEhDqH,KAAKsb,gBAAgBC,WAAWC,SAAS6B,gBAAQY,EAAeF,EAASpB,GAC5F,GAAe,GAAXoB,EAAc,CACjB/mB,IAAMknB,EAAiBle,EAAKkb,cAAcyB,GAAOjT,KACjDuU,EAAcnhB,KAAKohB,GAEpB,OAAOD,GACL,IARgF,GAapF/F,qBAEC,OAAOlY,KAAK+a,SAASxf,KAAK,wBAAwBvD,IAAI,WACrD,GAAIZ,EAAE4I,MAAMzE,KAAK,oCAAoC5C,OAAS,EAC7D,OAAOvB,EAAE4I,MAAM3I,KAAK,oBAEnBoW,MAGJyK,oBAECrX,IAAIsd,EAAiBne,KAAKga,qBAC1B,OAAOha,KAAK+W,QAAQwG,gBAAOa,UAAOD,EAAepS,SAASqS,EAAI1U,QAG/DwO,cAAc7Z,kBAAS,IACtB,IAAIiO,EAAKtM,KAEL4N,EAAsC,IAA/BpE,OAAOoR,KAAKvc,GAAQ1F,OAE3B0lB,EAAW,GACXjC,EAAU,CAAC,QAEf,GAAIhlB,EAAEoO,QAAQxF,KAAK2a,SAClB,IAAK,UAAU3a,KAAK2a,wBAAS,CAAxB9Z,IAAI2B,OACR4Z,EAAQtf,KAAK0F,EAAG4F,gBAGjBgU,EAAUA,EAAQhR,OAAO5B,OAAOoR,KAAK5a,KAAK2a,UAG3CyB,EAAQ7jB,QAAQ,SAAUgU,GACzB8R,GAAY,uDAEdzQ,8CAAmDtM,GAAGhL,OAAOiK,MAAMD,QAAQiM,SAAajL,GAAGhL,OAAOiK,MAAMD,QAAQiM,cACjG,SAAXA,8CAAgEjL,GAAGjD,EAAOkO,IAAW,SAAQjL,GAAGjD,EAAOkO,IAAW,2BACtG,QAAUjW,OAAO2O,OAAOC,KAAKoH,EAAG9H,SAAW,IAAMnG,EAAOkO,IAAW,yCAAuCjL,GAAGjD,EAAOkO,IAAW,yBACvIjL,GAAGjD,EAAOkO,IAAW,+BAI5B1L,IAAIyd,EAAOlnB,oKAEuDiH,aAAgBA,EAAO0f,QAAU,UAAY,8BAE5GM,kBAMH,OAHAzQ,EAAO0Q,EAAK7iB,SAAS,mBAClB6iB,EAAOlnB,sDAAsDiH,mBAAuB6C,OAAOod,GAEvFA,EAGRpG,mBAAmBnB,EAASK,EAAUhL,kBAAH,mBAAW,GAC7C,IAAIE,EAAKtM,KACLqb,EAAW/O,EAAG6J,OAAOzL,YAAY2Q,SAASlO,SAS9C,IANK7W,OAAOknB,MAAMC,aAAerR,GAChCpM,KAAK4d,aAENvC,EAAShI,OACTjc,EAAE,kCAAkC0D,IAAI,UAAW,GAE5B,IAAnBic,EAAQpe,OAAZ,CACIye,GAAMiE,EAAS9H,OAEnB1S,IAAIkd,EAAU/d,KAAKga,qBAEnBjD,EACEwG,gBAAOlf,UAAW0f,EAAQhS,SAAS1N,EAAOqL,QAC1CnR,iBAAQ8F,GACRiO,EAAGyO,SAAS7Z,OAAOoL,EAAG0O,cAAc3c,MAGtC2B,KAAK+a,SAASxf,KAAK,oBAAoBT,IAAI,UAAW,GAElDxE,OAAOknB,MAAMC,aAChBzd,KAAK+a,SAASwD,QAAQ,CAAE3gB,UAAW0O,EAAGyO,SAASjF,KAAK,iBAAmB,MAIzEoC,aAECrX,IAAIkd,EAAU/d,KAAKwe,oBAAoBxmB,aAAIymB,GAC1C,OAAOjV,iBACHiV,GACHV,SAAS,MAKX/d,KAAK+a,SAASxf,KAAK,wBAAwBe,SAG3C0D,KAAK0e,mBAAmBX,EAAS,GAAG,GAGrC7F,2BACCrX,IAAIyL,EAAKtM,KACL2e,EAAU3e,KAAK6W,UAAY7W,KAAK6W,YAAY8H,QAAU,IAAM,GAC5DC,EAAgB,GAEpB,GAAIxnB,EAAEoO,QAAQxF,KAAK2a,SAClB,IAAK,UAAU3a,KAAK2a,wBAAS,CAAxB9Z,IAAI2B,OACRmc,EAAQnc,EAAG4F,WAAakE,EAAG6J,OAAOzL,YAAYlI,EAAG4F,WAAWhE,kBAAeb,EAC3E+I,EAAGkK,KAAKhU,EAAG4F,WAAauW,EAAQnc,EAAG4F,WACnCwW,EAAc9hB,KAAK0F,EAAG4F,gBAGvBoB,OAAOoR,KAAK5a,KAAK2a,SAASpiB,QAAQ,SAAUsiB,GAC3C,IAAI1Y,EAAQmK,EAAG6J,OAAOzL,YAAYmQ,GAAQzW,YACQ,QAA9CkI,EAAG6J,OAAOzL,YAAYmQ,GAAQrY,GAAG0F,WAAuB/F,EAC3Dwc,EAAQ9D,GAAU,CAAC,OAAQ,IAAM1Y,EAAQ,MAEzCwc,EAAQ9D,GAAU1Y,QAASoB,EAC3B+I,EAAGkK,KAAKqE,GAAU8D,EAAQ9D,GAC1B+D,EAAc9hB,KAAK+d,MAKtB,MAAO,CAAC8D,EAASC,GAGlB1G,sBACC,MAA+BlY,KAAK6e,yCAEhCC,EAAiB9e,KAAK0Z,qBAG1B,OAFAlQ,OAAO2O,OAAOwG,EAASG,GAEhB,CACNta,QAASxE,KAAKwE,QACdjN,IAAKyI,KAAKmW,OAAOzL,YAAyB,YAAEtG,YAC5Cua,QAASA,EACTC,cAAeA,EACfvG,YAAarY,KAAKqY,YAAc,EAChC0G,MAAO/e,KAAK6W,UAAY7W,KAAK6W,YAAYkI,MAAQ,GACjDC,QAAS,GAIX9G,qBAAqB1B,GACpBxf,IAAMonB,QAAY9nB,OAAOyhB,KAAK,CAC7B9d,KAAM,MACN+d,OAAQ,mCACRiH,YAAY,EACZzI,KAAMA,IAIP,MAAO,CAAC4H,EAFKA,EAAIlK,OAAOvb,QAAUylB,EAAIlK,OAAOvb,OAASqH,KAAKqY,YAAc,EAAI,GAK9EH,+BACO1B,EAAOxW,KAAKkf,8BACQlf,KAAKmf,eAAe3I,iBAE1CY,IACHgH,EAAIlK,OAASkK,EAAIlK,OAAO9G,OAAO,EAAGpN,KAAKqY,cAGxCrY,KAAK+W,QAAU,GACXqH,EAAIlK,OAAOvb,QACdylB,EAAIlK,OAAO3b,iBAAQ8F,GAClBA,EAAO0f,QAAU,EACjB/d,EAAK+W,QAAQja,KAAKuB,KAGpB2B,KAAK0e,mBAAmB1e,KAAK+W,QAASK,GAGvCc,8CACClhB,IAAMooB,EAAqBpf,KAAKkf,sBAChCE,EAAmBR,cAAgB,CAAC,QAEpC,YAA4B5e,KAAKmf,eAAeC,UAE5CtB,QAAe,IAInB,OAHIuB,EAASnL,OAAOvb,SACnBmlB,EAAeuB,EAASnL,OAAOlc,aAAI+O,UAAKA,EAAE2C,QAEpCoU,EAGR5F,yBAAyByG,GACxB3nB,IAAM8mB,QAAqB9d,KAAKsf,wCAC5BxB,EAAanlB,QAChBgmB,EAAQ7hB,KAAK,CAAE,SAAU,KAAMghB,IAIjC5F,yBAAyByG,cACpB3e,KAAKqa,mBAAqBra,KAAKid,cAClCjd,KAAKid,aAAaG,cAAc7kB,iBAAQglB,GACnCA,EAAO,IAAMvd,EAAK8c,eACrB6B,EAAQ7hB,KAAK,CAACygB,EAAO,GAAIA,EAAO,GAAIA,EAAO,OAM/CrF,yBACCrX,IAAI8d,EAAU,CAAC,CAAC,cAAe,IAAK3e,KAAKmZ,kBAKzC,aAHMnZ,KAAKuf,mBAAmBZ,GAC9B3e,KAAKwf,yBAAyBb,GAEvBroB,OAAOyhB,KAAK,CAClBC,OAAQ,yBACRxB,KAAM,CACLhS,QAASxE,KAAK8c,cACd6B,QAASA,EACT1W,OAAQ,CAAC,OAAQ,iBAAajI,KAAK2b,eACnCthB,OAAQ2F,KAAKwE,QACbib,kBAAmBzf,KAAKsY,kBAAoB,EAC5CoH,SAAU,cCxkBdppB,OAAOC,QAAQ,aAEfgD,OAAOqgB,WAAa,KAEpBtjB,OAAOsI,GAAG+gB,aAAe,GAEzBrpB,OAAOsI,GAAGwX,OAAS,cAAqB9f,OAAOsI,GAAGoV,WACjDkE,YAAY7N,GACXuV,QACA5f,KAAK6f,SAAU,EACf7f,KAAKoS,WAAY,EAEjBhb,EAAE4D,OAAOgF,KAAM,CAAEue,SAAS,EAAMhF,KAAM,MAAQlP,GAC9CrK,KAAK2K,OAGNuN,kBACClY,KAAKmN,SAAW7W,OAAO6K,UAAU,GAAI,IAElCnB,KAAK8f,SACP9f,KAAKmN,SAAS4S,MAAM,CACnBC,SAAU,SACVC,UAAU,IAEXjgB,KAAKkgB,gBAAgB7M,QAGtBrT,KAAK4K,QAAU5K,KAAKmN,SAAS5R,KAAK,iBAChCkS,IAAI,GACW,SAAbzN,KAAKuZ,KACRniB,EAAE4I,KAAK4K,SAASnP,SAAS,YACJ,SAAbuE,KAAKuZ,KACbniB,EAAE4I,KAAK4K,SAASnP,SAAS,YACJ,eAAbuE,KAAKuZ,MACbniB,EAAE4I,KAAK4K,SAASnP,SAAS,YAE1BuE,KAAKgT,YACLhT,KAAKmgB,WAAangB,KAAKmN,SAAS5R,KAAK,eACrCyE,KAAKogB,MAAQhpB,EAAE,eAAe6E,SAAS+D,KAAKmgB,YAC5CngB,KAAKhB,KAAOgB,KAAKogB,MAAM3S,IAAI,GAC3BzN,KAAKqgB,SAAWjpB,EAAE,0CAA0C6E,SAAS+D,KAAKmgB,YAC1EngB,KAAKsgB,OAAStgB,KAAKmN,SAAS5R,KAAK,iBACjCyE,KAAKugB,OAASvgB,KAAKmN,SAAS5R,KAAK,iBACjCyE,KAAKwgB,iBAAmBxgB,KAAKugB,OAAOhlB,KAAK,qBACzCyE,KAAKygB,eAAiBzgB,KAAKugB,OAAOhlB,KAAK,mBACvCyE,KAAK0gB,gBAGLd,MAAMjV,OAEN3K,KAAK0O,2BAGL1O,KAAKka,OAASla,KAAKka,QAAU,CAAEyG,QAAS,GAAKC,UAAW,KACpD5gB,KAAKuW,gBAAmBvW,KAAKka,OAAOyG,SAAW3gB,KAAKka,OAAOyG,QAAQE,WACtE7gB,KAAK8gB,mBACJ9gB,KAAKsW,sBAAwBtW,KAAKka,OAAOyG,QAAQlgB,OAASa,GAAG,SAAU,KAAM,4BAC7EtB,KAAKuW,gBAAkBvW,KAAKka,OAAOyG,QAAQE,UAIzC7gB,KAAKma,kBACRna,KAAK+gB,qBAAqB/gB,KAAKma,mBAG5Bna,KAAKwZ,wBAA2BxZ,KAAKka,OAAO0G,WAAa5gB,KAAKka,OAAO0G,UAAUngB,QAClFT,KAAKghB,2BAA2BhhB,KAAKwZ,wBAA0BxZ,KAAKka,OAAO0G,UAAUngB,OAGlFT,KAAKihB,cACRjhB,KAAKsgB,OAAO/kB,KAAK,kBAAkBoD,wBAAYqB,EAAKkhB,cAAgBlhB,EAAKmhB,oBACzEnhB,KAAKohB,mBAAmB5lB,YAAY,QAAQK,GAAG,0BAAemE,EAAKmhB,qBAGpE,IAAI7U,EAAKtM,KACTA,KAAKmN,SACHtR,GAAG,gBAAiB,WACpByQ,EAAGuT,SAAU,EACbvT,EAAG4U,cAAe,EAClB5U,EAAG+U,gBAAe,GAEf/qB,OAAOsI,GAAG+gB,aAAarpB,OAAOsI,GAAG+gB,aAAahnB,OAAO,KAAK2T,IAC5DhW,OAAOsI,GAAG+gB,aAAa2B,MACpBhrB,OAAOsI,GAAG+gB,aAAahnB,OACzBY,OAAOqgB,WAAatjB,OAAOsI,GAAG+gB,aAAarpB,OAAOsI,GAAG+gB,aAAahnB,OAAO,GAEzEY,OAAOqgB,WAAa,MAGtBtN,EAAGiV,QAAUjV,EAAGiV,SAChBjV,EAAGkV,SAAWlV,EAAGkV,YAEjB3lB,GAAG,iBAAkB,WAErByQ,EAAGuT,SAAU,EACbtmB,OAAOqgB,WAAatN,EACpBhW,OAAOsI,GAAG+gB,aAAa7iB,KAAKwP,GAC5BA,EAAGmI,uBACHnI,EAAG+U,gBAAe,GAClB/U,EAAGmV,cAAgBnV,EAAGmV,eACtBrqB,EAAEP,UAAUsX,QAAQ,0BACpB/W,EAAEP,UAAU6qB,IAAI,mBAEhB7lB,GAAG,SAAU,WACb,IAAI0V,EAASna,EAAE,eACXma,EAAO5Y,QAAU,CAAC,OAAQ,WAAY,QAAQoT,SAASwF,EAAOla,KAAK,oBACtEka,EAAOoQ,SAMXzJ,kBACC,OAAOlY,KAAKwgB,iBAAiBjlB,KAAK,gBAGnC2c,mBACC,OAAOlY,KAAKmN,SAAS5R,KAAK,qCAG3B2c,YAAY9Y,GACXY,KAAKqgB,SAAS7kB,YAAY,QAC1BwE,KAAKogB,MAAM3kB,SAAS,QACpBuE,KAAKqgB,SAASjhB,KAAKA,GAGpB8Y,gBACClY,KAAKqgB,SAAS5kB,SAAS,QACvBuE,KAAKogB,MAAM5kB,YAAY,QAGxB0c,QACC0H,MAAM/J,QACN7V,KAAK4hB,gBAGN1J,mBAAmBzX,EAAO9B,GACzBqB,KAAKugB,OAAO/kB,YAAY,QACxBwE,KAAK4U,oBAAqB,EAC1B,IAAItI,EAAKtM,KACT,OAAOA,KAAK8U,kBACVtZ,YAAY,QACZU,KAAKuE,GACL9B,MAAM,WACN2N,EAAGuV,0BAA2B,EAI9B,IAAI3N,EAAS5H,EAAGoG,aACZwB,GACJvV,GAASA,EAAMmL,MAAMwC,EAAI,CAAC4H,MAI7BgE,qBAAqBvZ,GACpBqB,KAAKugB,OAAO/kB,YAAY,QACxBwE,KAAK8hB,oBAAoBtmB,YAAY,QAAQkmB,IAAI,SAAS7lB,GAAG,QAAS8C,GAGvEuZ,2BAA2BzX,GAC1BT,KAAK8hB,oBACHtmB,YAAY,QACZU,KAAKuE,GAGRyX,yBACClY,KAAK8U,kBAAkBrZ,SAAS,YAGjCyc,wBACClY,KAAK8U,kBAAkBtZ,YAAY,YAGpC0c,YACClY,KAAK+hB,UAAU/hB,KAAKoB,OAGrB8W,UAAU8J,GACThiB,KAAKmN,SAAS5R,KAAK,gBAAgBW,KAAK8lB,GAGzC9J,gBACKlY,KAAK6B,WACR7B,KAAKsgB,OAAO/kB,KAAK,cAAcC,cAAcC,SAAS,aAAeuE,KAAK6B,WAI5EqW,OAqBC,OAnBIlY,KAAKue,QACRve,KAAKmN,SAAS1R,SAAS,QAEvBuE,KAAKmN,SAAS3R,YAAY,QAE3BwE,KAAKmN,SAAS4S,MAAM,QAEpB/f,KAAKmN,SAAS3R,YAAY,kBAEtBwE,KAAKihB,aAAejhB,KAAKkhB,eAC5B9pB,EAAE,mBAAmB0kB,SACrB9b,KAAKkhB,cAAe,GAIrBlhB,KAAK4hB,gBAEL5hB,KAAK6hB,0BAA2B,EAChC7hB,KAAK2Q,YAAa,EACX3Q,KAGRkY,OACClY,KAAKmN,SAAS4S,MAAM,QACpB/f,KAAK2Q,YAAa,EAGnBuH,gBACC,OAAOlY,KAAKmN,SAAS5R,KAAK,oBAG3B2c,oBACC,OAAOlY,KAAKwgB,iBAAiBjlB,KAAK,wBAGnC2c,YACClY,KAAKkgB,gBAAgBpE,QAAO,GAG7B5D,SACClY,KAAKkgB,gBAAgB/R,QAAQ,SAG9B+J,kBACC9gB,EAAE,mBAAmB0kB,SACrBjb,IAAIkf,EAAQ/f,KAAKmN,SAAS2B,QAAQ,UAAUsE,YAAY,kBACxD2M,EAAM1oB,KAAK,YAAc0oB,EAAMkC,WAAW,YAAclC,EAAM1oB,KAAK,YAAa,GAChF2I,KAAKkhB,cAAgBlhB,KAAKkhB,aAC1BlqB,IAAMiK,EAAOjB,KAAKkhB,aAAe,SAAW,WAC5ClhB,KAAKohB,mBAAmBllB,KAAK5F,OAAO0K,MAAMC,KAAKA,IAC/CjB,KAAKkiB,oBAAsBliB,KAAKkiB,mBAAmBliB,KAAKkhB,cACxDlhB,KAAKsgB,OAAO/kB,KAAK,gBAAgB6X,YAAY,kBAC7CpT,KAAKqhB,gBAAgBrhB,KAAKkhB,cAG3BhJ,eAAeiK,GACd/qB,EAAE,QAAQ0D,IAAI,WAAYqnB,EAAQ,SAAW,QAG9CjK,kBAAkBzX,EAAOyZ,EAAQte,kBAAU,MAC1CoE,KAAKugB,OAAO/kB,YAAY,QACxBqF,IAAIuhB,EAAgBhrB,sDACuBwE,GAAa,mBACpD6E,6BAGJT,KAAKygB,eAAevf,OAAOkhB,GAE3BlI,GAAUkI,EAAczjB,MAAMub,KAIhC5jB,OAAOsI,GAAGyjB,4BAEL9oB,OAAOqgB,aACLA,WAAWqH,YAEJrH,WAAWsH,cACtBtH,WAAWuH,kBAFXvH,WAAWvG"}