{"id":24820,"date":"2026-09-04T08:02:42","date_gmt":"2026-09-04T08:02:42","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24820"},"modified":"2026-09-04T08:09:43","modified_gmt":"2026-09-04T08:09:43","slug":"minimum-bend-radius-calculator-by-material","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/minimum-bend-radius-calculator-by-material\/","title":{"rendered":"Minimum Bend Radius Calculator by Material"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Minimum Bend Radius Calculator by Material<\/strong> is a practical engineering tool designed to estimate the smallest recommended inside bend radius for sheet metal based on material type, thickness, strength, hardness, rolling direction, and forming method. It helps engineers and fabricators reduce the risk of cracking, excessive thinning, and bend failure while selecting suitable tooling and process settings. The Minimum Bend Radius Calculator by Material is useful for press brake bending, sheet metal design, material comparison, and manufacturing process planning.<\/p>\n\n\n\n<!-- WordPress: paste this entire block into a Custom HTML block -->\n<!-- Do NOT paste into Visual editor; use Code Editor \/ Custom HTML block -->\n<style>\n\/* Scoped styles for WordPress embed \u2014 all rules live under #mbr-calculator *\/\n\n#mbr-calculator {\n    --mbr-bg: #f0f2f5;\n    --mbr-surface: #ffffff;\n    --mbr-border: #dde3ea;\n    --mbr-text: #1a2332;\n    --mbr-text-muted: #5a6578;\n    --mbr-primary: #1e5a8a;\n    --mbr-primary-hover: #164a72;\n    --mbr-warning: #c47a0a;\n    --mbr-danger: #c0392b;\n    --mbr-success: #2d8a6e;\n    --mbr-radius: 10px;\n    --mbr-shadow: 0 2px 12px rgba(26, 35, 50, 0.08);\n    --mbr-font: \"Segoe UI\", system-ui, -apple-system, sans-serif;\n\n    box-sizing: border-box !important;\n    display: block !important;\n    width: 100% !important;\n    max-width: 1200px !important;\n    margin: 0 auto !important;\n    padding: 0 1.25rem 1.25rem !important;\n    font-family: var(--mbr-font) !important;\n    font-size: 15px !important;\n    line-height: 1.6 !important;\n    color: var(--mbr-text) !important;\n    background: transparent !important;\n    isolation: isolate;\n    text-align: left !important;\n    float: none !important;\n    clear: both !important;\n}\n\n#mbr-calculator *,\n#mbr-calculator *::before,\n#mbr-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n#mbr-calculator p,\n#mbr-calculator small {\n    margin: 0;\n    padding: 0;\n    font-family: inherit;\n    color: inherit;\n}\n\n#mbr-calculator sub {\n    font-size: 0.75em;\n    vertical-align: sub;\n}\n\n#mbr-calculator .mbr-layout {\n    display: flex;\n    flex-direction: column;\n    gap: 1.25rem;\n}\n\n#mbr-calculator .mbr-results:not(.mbr-hidden) {\n    animation: mbr-fade-in 0.3s ease;\n}\n\n@keyframes mbr-fade-in {\n    from { opacity: 0; transform: translateY(8px); }\n    to { opacity: 1; transform: translateY(0); }\n}\n\n#mbr-calculator .mbr-card {\n    background: var(--mbr-surface);\n    border: 1px solid var(--mbr-border);\n    border-radius: var(--mbr-radius);\n    padding: 1.25rem 1.5rem;\n    margin: 0 0 1.25rem;\n    box-shadow: var(--mbr-shadow);\n}\n\n#mbr-calculator .mbr-card h2 {\n    margin: 0 0 1rem;\n    padding: 0;\n    font-size: 1.15rem;\n    font-weight: 700;\n    line-height: 1.3;\n    color: var(--mbr-primary);\n    background: none;\n    border: none;\n}\n\n#mbr-calculator .mbr-card h3 {\n    margin: 1.25rem 0 0.5rem;\n    padding: 0;\n    font-size: 0.95rem;\n    font-weight: 700;\n    line-height: 1.3;\n    color: var(--mbr-text);\n    background: none;\n    border: none;\n}\n\n#mbr-calculator .mbr-inputs-card {\n    padding-bottom: 1.5rem;\n    margin-bottom: 0;\n}\n\n#mbr-calculator .mbr-section {\n    padding-top: 1.25rem;\n    margin-top: 1.25rem;\n    border-top: 1px solid var(--mbr-border);\n}\n\n#mbr-calculator .mbr-section:first-child {\n    padding-top: 0;\n    margin-top: 0;\n    border-top: none;\n}\n\n#mbr-calculator .mbr-section > h2 {\n    margin: 0 0 1rem;\n}\n\n#mbr-calculator .mbr-actions {\n    margin-top: 1.5rem;\n    padding-top: 1.25rem;\n    border-top: 1px solid var(--mbr-border);\n    text-align: center;\n}\n\n#mbr-calculator .mbr-actions .mbr-btn {\n    width: 33.333% !important;\n    min-width: 140px;\n    max-width: 240px;\n    font-size: 1.05rem !important;\n    padding: 0.75rem 1.5rem !important;\n}\n\n#mbr-calculator .mbr-form-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 1rem;\n}\n\n#mbr-calculator .mbr-field.mbr-full {\n    grid-column: 1 \/ -1;\n}\n\n@media (max-width: 600px) {\n    #mbr-calculator .mbr-form-grid {\n        grid-template-columns: 1fr;\n    }\n}\n\n#mbr-calculator .mbr-field label {\n    display: block;\n    font-weight: 600;\n    font-size: 0.875rem;\n    margin: 0 0 0.35rem;\n    color: var(--mbr-text);\n}\n\n#mbr-calculator .mbr-optional {\n    font-weight: 400;\n    color: var(--mbr-text-muted);\n    font-size: 0.8rem;\n}\n\n#mbr-calculator .mbr-hint {\n    display: block;\n    font-size: 0.78rem;\n    color: var(--mbr-text-muted);\n    margin-top: 0.25rem;\n}\n\n#mbr-calculator .mbr-field.mbr-full select {\n    margin-top: 0.5rem;\n}\n\n#mbr-calculator input[type=\"text\"],\n#mbr-calculator input[type=\"number\"],\n#mbr-calculator input[type=\"search\"],\n#mbr-calculator input[type=\"checkbox\"],\n#mbr-calculator select {\n    display: block;\n    width: 100%;\n    max-width: 100%;\n    height: auto;\n    min-height: 0;\n    margin: 0;\n    padding: 0.55rem 0.7rem;\n    border: 1px solid var(--mbr-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.9rem !important;\n    font-family: inherit !important;\n    line-height: 1.4 !important;\n    color: var(--mbr-text) !important;\n    background: #fafbfc !important;\n    box-shadow: none !important;\n    appearance: auto;\n    transition: border-color 0.15s;\n    float: none !important;\n}\n\n#mbr-calculator input[type=\"checkbox\"] {\n    display: inline-block !important;\n    width: auto !important;\n    min-width: 16px !important;\n    padding: 0 !important;\n    margin: 0 !important;\n    accent-color: var(--mbr-primary);\n}\n\n#mbr-calculator input:focus,\n#mbr-calculator select:focus {\n    outline: none;\n    border-color: var(--mbr-primary);\n    box-shadow: 0 0 0 3px rgba(30, 90, 138, 0.12);\n}\n\n#mbr-calculator .mbr-input-unit {\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n}\n\n#mbr-calculator .mbr-input-unit input {\n    flex: 1;\n}\n\n#mbr-calculator .mbr-input-unit span {\n    font-size: 0.85rem;\n    color: var(--mbr-text-muted);\n    white-space: nowrap;\n    min-width: 2.5rem;\n}\n\n#mbr-calculator .mbr-check label {\n    display: flex;\n    align-items: center;\n    gap: 0.5rem;\n    font-weight: 500;\n    cursor: pointer;\n}\n\n#mbr-calculator .mbr-check input {\n    width: auto;\n    margin: 0;\n}\n\n#mbr-calculator button.mbr-btn {\n    display: inline-flex !important;\n    align-items: center;\n    justify-content: center;\n    margin: 0 !important;\n    padding: 0.6rem 1.2rem !important;\n    border: none !important;\n    border-radius: 6px !important;\n    font-size: 0.9rem !important;\n    font-weight: 600 !important;\n    font-family: inherit !important;\n    line-height: 1.2 !important;\n    text-decoration: none !important;\n    text-transform: none !important;\n    letter-spacing: normal !important;\n    cursor: pointer !important;\n    box-shadow: none !important;\n    transition: background 0.15s, transform 0.1s;\n    float: none !important;\n    width: auto !important;\n    height: auto !important;\n    min-height: 0 !important;\n}\n\n#mbr-calculator button.mbr-btn:active {\n    transform: scale(0.98);\n}\n\n#mbr-calculator button.mbr-btn-primary {\n    background: var(--mbr-primary);\n    color: #fff;\n}\n\n#mbr-calculator button.mbr-btn-primary:hover {\n    background: var(--mbr-primary-hover);\n    color: #fff;\n}\n\n#mbr-calculator .mbr-tooltip {\n    display: inline-flex;\n    align-items: center;\n    justify-content: center;\n    width: 16px;\n    height: 16px;\n    border-radius: 50%;\n    background: #dde3ea;\n    color: var(--mbr-text-muted);\n    font-size: 0.7rem;\n    font-weight: 700;\n    cursor: help;\n    position: relative;\n    vertical-align: middle;\n}\n\n#mbr-calculator .mbr-tooltip::after {\n    content: attr(data-tip);\n    position: absolute;\n    bottom: calc(100% + 6px);\n    left: 50%;\n    transform: translateX(-50%);\n    background: var(--mbr-text);\n    color: #fff;\n    padding: 0.4rem 0.6rem;\n    border-radius: 4px;\n    font-size: 0.75rem;\n    font-weight: 400;\n    white-space: normal;\n    width: max-content;\n    max-width: 220px;\n    opacity: 0;\n    pointer-events: none;\n    transition: opacity 0.15s;\n    z-index: 100;\n}\n\n#mbr-calculator .mbr-tooltip:hover::after {\n    opacity: 1;\n}\n\n#mbr-calculator .mbr-results-grid {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    gap: 0.75rem;\n}\n\n#mbr-calculator .mbr-result.mbr-full {\n    grid-column: 1 \/ -1;\n}\n\n@media (max-width: 500px) {\n    #mbr-calculator .mbr-results-grid {\n        grid-template-columns: 1fr;\n    }\n}\n\n#mbr-calculator .mbr-result {\n    background: #f7f9fb;\n    border: 1px solid var(--mbr-border);\n    border-radius: 8px;\n    padding: 0.75rem;\n}\n\n#mbr-calculator .mbr-result-label {\n    display: block;\n    font-size: 0.78rem;\n    color: var(--mbr-text-muted);\n    margin-bottom: 0.25rem;\n}\n\n#mbr-calculator .mbr-result-val {\n    display: block;\n    font-size: 1.05rem;\n    font-weight: 700;\n    color: var(--mbr-text);\n}\n\n#mbr-calculator .mbr-result-val.mbr-highlight {\n    color: var(--mbr-primary);\n}\n\n#mbr-calculator .mbr-result-val.mbr-badge {\n    display: inline-block;\n    padding: 0.2rem 0.6rem;\n    border-radius: 4px;\n    font-size: 0.85rem;\n}\n\n#mbr-calculator .mbr-badge-excellent { background: #d4edda; color: #155724; }\n#mbr-calculator .mbr-badge-good { background: #d1ecf1; color: #0c5460; }\n#mbr-calculator .mbr-badge-moderate { background: #fff3cd; color: #856404; }\n#mbr-calculator .mbr-badge-difficult { background: #f8d7da; color: #721c24; }\n#mbr-calculator .mbr-badge-low { background: #d4edda; color: #155724; }\n#mbr-calculator .mbr-badge-moderate-risk { background: #fff3cd; color: #856404; }\n#mbr-calculator .mbr-badge-high { background: #f8d7da; color: #721c24; }\n\n#mbr-calculator .mbr-warnings:empty {\n    display: none;\n}\n\n#mbr-calculator .mbr-warning {\n    padding: 0.6rem 0.85rem;\n    border-radius: 6px;\n    margin-bottom: 0.5rem;\n    font-size: 0.85rem;\n}\n\n#mbr-calculator .mbr-warning.error {\n    background: #fdecea;\n    border-left: 3px solid var(--mbr-danger);\n    color: #922b21;\n}\n\n#mbr-calculator .mbr-warning.warn {\n    background: #fef9e7;\n    border-left: 3px solid var(--mbr-warning);\n    color: #7d6608;\n}\n\n#mbr-calculator .mbr-warning.info {\n    background: #ebf5fb;\n    border-left: 3px solid var(--mbr-primary);\n    color: #1a5276;\n}\n\n#mbr-calculator .mbr-table-wrap {\n    overflow-x: auto;\n    margin: 0.5rem 0;\n}\n\n#mbr-calculator table.mbr-table {\n    width: 100%;\n    border-collapse: collapse;\n    font-size: 0.85rem;\n    margin: 0;\n    background: transparent;\n}\n\n#mbr-calculator table.mbr-table th,\n#mbr-calculator table.mbr-table td {\n    padding: 0.5rem 0.65rem;\n    border: 1px solid var(--mbr-border);\n    text-align: left;\n    vertical-align: middle;\n}\n\n#mbr-calculator table.mbr-table th {\n    background: #eef2f6;\n    font-weight: 600;\n    color: var(--mbr-text);\n}\n\n#mbr-calculator table.mbr-table input[type=\"number\"] {\n    width: 70px;\n    padding: 0.3rem 0.4rem;\n}\n\n#mbr-calculator table.mbr-table tbody tr:nth-child(even) {\n    background: #fafbfc;\n}\n\n#mbr-calculator .mbr-compare-list {\n    display: grid;\n    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));\n    gap: 0.5rem;\n}\n\n#mbr-calculator .mbr-compare-list label {\n    display: flex;\n    align-items: center;\n    gap: 0.4rem;\n    font-size: 0.875rem;\n    cursor: pointer;\n    margin: 0;\n}\n\n#mbr-calculator .mbr-compare-list input {\n    width: auto;\n    margin: 0;\n}\n\n#mbr-calculator #mbr-comparisonResults {\n    margin-top: 1rem;\n}\n\n#mbr-calculator .mbr-rank-1 {\n    font-weight: 700;\n    color: var(--mbr-success);\n}\n\n#mbr-calculator .mbr-hidden {\n    display: none !important;\n}\n\n<\/style>\n<div id=\"mbr-calculator\" class=\"mbr-calculator\">\n        <div class=\"mbr-layout\">\n            <div class=\"mbr-inputs\">\n                <section class=\"mbr-card mbr-inputs-card\">\n                    <div class=\"mbr-section\">\n                        <h2>Calculator Settings<\/h2>\n                        <div class=\"mbr-form-grid\">\n                            <div class=\"mbr-field mbr-full\">\n                                <label for=\"mbr-calcMode\">Calculation Mode<\/label>\n                                <select id=\"mbr-calcMode\">\n                                    <option value=\"minRadius\">Minimum Bend Radius by Material<\/option>\n                                    <option value=\"thicknessRatio\">Bend Radius from Thickness Ratio<\/option>\n                                    <option value=\"safetyCheck\">Actual Radius Safety Check<\/option>\n                                    <option value=\"comparison\">Material Bendability Comparison<\/option>\n                                    <option value=\"punchRadius\">Recommended Punch Radius<\/option>\n                                    <option value=\"outsideRadius\">Outside Radius Calculation<\/option>\n                                <\/select>\n                            <\/div>\n\n                            <div class=\"mbr-field mbr-full\">\n                                <label for=\"mbr-unitSystem\">Unit System<\/label>\n                                <select id=\"mbr-unitSystem\">\n                                    <option value=\"metric\">Metric (mm, MPa)<\/option>\n                                    <option value=\"imperial\">Imperial (inch, ksi)<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"mbr-section\" id=\"mbr-sectionMaterial\">\n                        <h2>Material<\/h2>\n                        <div class=\"mbr-form-grid\">\n                            <div class=\"mbr-field mbr-full\">\n                                <label for=\"mbr-materialSearch\">Material Type<\/label>\n                                <input type=\"search\" id=\"mbr-materialSearch\" placeholder=\"Search materials...\" autocomplete=\"off\">\n                                <select id=\"mbr-materialType\" size=\"1\"><\/select>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-materialGrade\">Material Grade <span class=\"mbr-optional\">(optional)<\/span><\/label>\n                                <input type=\"text\" id=\"mbr-materialGrade\" placeholder=\"e.g. AISI 1018, 5052-H32\">\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-thickness\">\n                                    Material Thickness\n                                    <span class=\"mbr-tooltip\" data-tip=\"Sheet thickness at the bend. Affects minimum radius and outside radius.\">?<\/span>\n                                <\/label>\n                                <div class=\"mbr-input-unit\">\n                                    <input type=\"number\" id=\"mbr-thickness\" step=\"any\" min=\"0\" value=\"2.0\">\n                                    <span id=\"mbr-thicknessUnit\">mm<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-yieldStrength\">Yield Strength<\/label>\n                                <div class=\"mbr-input-unit\">\n                                    <input type=\"number\" id=\"mbr-yieldStrength\" step=\"any\" min=\"0\">\n                                    <span id=\"mbr-yieldUnit\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-tensileStrength\">Ultimate Tensile Strength <span class=\"mbr-optional\">(optional)<\/span><\/label>\n                                <div class=\"mbr-input-unit\">\n                                    <input type=\"number\" id=\"mbr-tensileStrength\" step=\"any\" min=\"0\">\n                                    <span id=\"mbr-tensileUnit\">MPa<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-elongation\">Elongation <span class=\"mbr-optional\">(optional)<\/span><\/label>\n                                <div class=\"mbr-input-unit\">\n                                    <input type=\"number\" id=\"mbr-elongation\" step=\"any\" min=\"0\" max=\"100\" placeholder=\"%\">\n                                    <span>%<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-temper\">Temper \/ Hardness<\/label>\n                                <select id=\"mbr-temper\">\n                                    <option value=\"annealed\">Annealed<\/option>\n                                    <option value=\"halfHard\">Half Hard<\/option>\n                                    <option value=\"fullHard\">Full Hard<\/option>\n                                    <option value=\"t4\">T4<\/option>\n                                    <option value=\"t6\">T6<\/option>\n                                    <option value=\"custom\">Custom<\/option>\n                                <\/select>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-baseK\">\n                                    Base Bend Radius Factor (K)\n                                    <span class=\"mbr-tooltip\" data-tip=\"Rmin = K \u00d7 t. Not the neutral-axis K-factor used in bend allowance.\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"mbr-baseK\" step=\"any\" min=\"0.01\" value=\"1.0\">\n                                <small class=\"mbr-hint\" id=\"mbr-kRangeHint\">Typical range: 0.5t \u2013 1.0t<\/small>\n                            <\/div>\n\n                            <div class=\"mbr-field mbr-check\">\n                                <label>\n                                    <input type=\"checkbox\" id=\"mbr-useStrengthAdjust\" checked>\n                                    Apply strength-based K adjustment\n                                <\/label>\n                            <\/div>\n\n                            <div class=\"mbr-field mbr-check\">\n                                <label>\n                                    <input type=\"checkbox\" id=\"mbr-useDuctilityAdjust\">\n                                    Apply ductility (elongation) adjustment\n                                <\/label>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"mbr-section\" id=\"mbr-sectionGeometry\">\n                        <h2>Geometry &amp; Forming<\/h2>\n                        <div class=\"mbr-form-grid\">\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-rollingDirection\">\n                                    Rolling Direction\n                                    <span class=\"mbr-tooltip\" data-tip=\"Bending parallel to grain may increase cracking risk in some sheet materials.\">?<\/span>\n                                <\/label>\n                                <select id=\"mbr-rollingDirection\">\n                                    <option value=\"perpendicular\">Perpendicular to Rolling Direction<\/option>\n                                    <option value=\"parallel\">Parallel to Rolling Direction<\/option>\n                                    <option value=\"unknown\">Unknown (conservative)<\/option>\n                                <\/select>\n                            <\/div>\n\n                            <div class=\"mbr-field\">\n                                <label for=\"mbr-formingMethod\">Forming Method<\/label>\n                                <select id=\"mbr-formingMethod\">\n                                    <option value=\"airBending\">Air Bending<\/option>\n                                    <option value=\"bottomBending\">Bottom Bending<\/option>\n                                    <option value=\"coining\">Coining<\/option>\n                                    <option value=\"rollForming\">Roll Forming<\/option>\n                                    <option value=\"customProcess\">Custom<\/option>\n                                <\/select>\n                            <\/div>\n\n                            <div class=\"mbr-field mbr-mode-field\" data-modes=\"safetyCheck,punchRadius,outsideRadius,minRadius,thicknessRatio\">\n                                <label for=\"mbr-actualRadius\">\n                                    Actual \/ Planned Inside Radius\n                                    <span class=\"mbr-tooltip\" data-tip=\"Inside radius of the formed bend - measured at the inner surface of the sheet.\">?<\/span>\n                                <\/label>\n                                <div class=\"mbr-input-unit\">\n                                    <input type=\"number\" id=\"mbr-actualRadius\" step=\"any\" min=\"0\" placeholder=\"Optional\">\n                                    <span id=\"mbr-radiusUnit\">mm<\/span>\n                                <\/div>\n                            <\/div>\n\n                            <div class=\"mbr-field mbr-mode-field\" data-modes=\"minRadius,punchRadius\">\n                                <label for=\"mbr-vDieOpening\">\n                                    V-Die Opening <span class=\"mbr-optional\">(optional)<\/span>\n                                    <span class=\"mbr-tooltip\" data-tip=\"For air bending: Rinside \u2248 Cv \u00d7 V. Actual radius also depends on tooling and setup.\">?<\/span>\n                                <\/label>\n                                <div class=\"mbr-input-unit\">\n                                    <input type=\"number\" id=\"mbr-vDieOpening\" step=\"any\" min=\"0\" placeholder=\"Optional\">\n                                    <span id=\"mbr-vDieUnit\">mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"mbr-section mbr-hidden\" id=\"mbr-sectionComparison\">\n                        <h2>Material Comparison<\/h2>\n                        <p class=\"mbr-hint\">Compare 2\u20136 materials at the same thickness. Select materials below.<\/p>\n                        <div id=\"mbr-comparisonMaterials\" class=\"mbr-compare-list\"><\/div>\n                    <\/div>\n\n                    <div class=\"mbr-section\">\n                        <h2>Advanced Correction Factors<\/h2>\n                        <div id=\"mbr-advancedPanel\">\n                            <div class=\"mbr-form-grid\">\n                                <div class=\"mbr-field\">\n                                    <label for=\"mbr-dirFactor\">Direction Factor (C<sub>direction<\/sub>)<\/label>\n                                    <input type=\"number\" id=\"mbr-dirFactor\" step=\"any\" min=\"0.01\" value=\"1.00\">\n                                <\/div>\n                                <div class=\"mbr-field\">\n                                    <label for=\"mbr-processFactor\">Process Factor (C<sub>process<\/sub>)<\/label>\n                                    <input type=\"number\" id=\"mbr-processFactor\" step=\"any\" min=\"0.01\" value=\"1.00\">\n                                <\/div>\n                                <div class=\"mbr-field\">\n                                    <label for=\"mbr-hardnessFactor\">Hardness Factor (C<sub>hardness<\/sub>)<\/label>\n                                    <input type=\"number\" id=\"mbr-hardnessFactor\" step=\"any\" min=\"0.01\" value=\"1.00\">\n                                <\/div>\n                                <div class=\"mbr-field\">\n                                    <label for=\"mbr-cvFactor\">V-Die Coefficient (C<sub>v<\/sub>)<\/label>\n                                    <input type=\"number\" id=\"mbr-cvFactor\" step=\"any\" min=\"0.01\" value=\"0.16\">\n                                <\/div>\n                            <\/div>\n\n                            <h3>Strength Correction Ranges<\/h3>\n                            <p class=\"mbr-hint\">K<sub>adjusted<\/sub> = K<sub>base<\/sub> \u00d7 C<sub>strength<\/sub>. Higher strength increases recommended radius.<\/p>\n                            <div class=\"mbr-table-wrap\">\n                                <table class=\"mbr-table\" id=\"mbr-strengthTable\">\n                                    <thead>\n                                        <tr>\n                                            <th>Yield Range (MPa)<\/th>\n                                            <th>Factor<\/th>\n                                        <\/tr>\n                                    <\/thead>\n                                    <tbody><\/tbody>\n                                <\/table>\n                            <\/div>\n\n                            <h3>Material Preset Factors<\/h3>\n                            <p class=\"mbr-hint\">Edit default K factors for each material preset. Changes apply when you select that material.<\/p>\n                            <div class=\"mbr-table-wrap\">\n                                <table class=\"mbr-table\" id=\"mbr-presetTable\">\n                                    <thead>\n                                        <tr>\n                                            <th>Material<\/th>\n                                            <th>K Min<\/th>\n                                            <th>K Default<\/th>\n                                            <th>K Max<\/th>\n                                            <th>Parallel Grain<\/th>\n                                        <\/tr>\n                                    <\/thead>\n                                    <tbody><\/tbody>\n                                <\/table>\n                            <\/div>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"mbr-actions\">\n                        <button type=\"button\" id=\"mbr-btnCalculate\" class=\"mbr-btn mbr-btn-primary\">Calculate<\/button>\n                    <\/div>\n                <\/section>\n            <\/div>\n\n            <div class=\"mbr-results mbr-hidden\" id=\"mbr-calculatorResults\">\n                <section class=\"mbr-card mbr-results-card\" id=\"mbr-resultsSection\">\n                    <div id=\"mbr-warnings\" class=\"mbr-warnings\" role=\"alert\"><\/div>\n\n                    <div id=\"mbr-resultsGrid\" class=\"mbr-results-grid\">\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Base Minimum Bend Radius<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resBaseRadius\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Adjusted Minimum Bend Radius<\/span>\n                            <span class=\"mbr-result-val mbr-highlight\" id=\"mbr-resAdjustedRadius\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Bend Radius Factor (R\/t)<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resRadiusFactor\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Recommended Inside Radius<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resInsideRadius\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Recommended Outside Radius<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resOutsideRadius\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Recommended Punch Radius<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resPunchRadius\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result mbr-mode-result\" data-modes=\"safetyCheck,minRadius\">\n                            <span class=\"mbr-result-label\">Actual Radius Ratio<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resRadiusRatio\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result mbr-mode-result\" data-modes=\"safetyCheck,minRadius\">\n                            <span class=\"mbr-result-label\">Bend Radius Utilization<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resUtilization\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Bendability Rating<\/span>\n                            <span class=\"mbr-result-val mbr-badge\" id=\"mbr-resBendability\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result\">\n                            <span class=\"mbr-result-label\">Cracking Risk<\/span>\n                            <span class=\"mbr-result-val mbr-badge\" id=\"mbr-resCrackingRisk\">&#8211;<\/span>\n                        <\/div>\n                        <div class=\"mbr-result mbr-full mbr-mode-result\" data-modes=\"minRadius,punchRadius\">\n                            <span class=\"mbr-result-label\">Estimated Radius from V-Die<\/span>\n                            <span class=\"mbr-result-val\" id=\"mbr-resVDieRadius\">&#8211;<\/span>\n                        <\/div>\n                    <\/div>\n\n                    <div class=\"mbr-table-wrap mbr-hidden\" id=\"mbr-comparisonResults\">\n                        <table class=\"mbr-table\" id=\"mbr-comparisonTable\">\n                            <thead>\n                                <tr>\n                                    <th>Rank<\/th>\n                                    <th>Material<\/th>\n                                    <th>Base K<\/th>\n                                    <th>Adj. K<\/th>\n                                    <th>Min Inside R<\/th>\n                                    <th>Punch R<\/th>\n                                    <th>Bendability<\/th>\n                                <\/tr>\n                            <\/thead>\n                            <tbody><\/tbody>\n                        <\/table>\n                    <\/div>\n                <\/section>\n            <\/div>\n        <\/div>\n    <\/div>\n<script src=\"data:application\/javascript;base64,LyoqDQogKiBNaW5pbXVtIEJlbmQgUmFkaXVzIENhbGN1bGF0b3IgYnkgTWF0ZXJpYWwNCiAqIFNjb3BlZCBmb3IgV29yZFByZXNzIGVtYmVkIC0gYWxsIERPTSBhY2Nlc3Mgc3RheXMgaW5zaWRlICNtYnItY2FsY3VsYXRvcg0KICovDQooZnVuY3Rpb24gKCkgew0KICAgICd1c2Ugc3RyaWN0JzsNCg0KICAgIGNvbnN0IHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWJyLWNhbGN1bGF0b3InKTsNCiAgICBpZiAoIXJvb3QpIHJldHVybjsNCg0KICAgIGNvbnN0IE1NX1BFUl9JTkNIID0gMjUuNDsNCiAgICBjb25zdCBNUEFfUEVSX0tTSSA9IDYuODk0NzY7DQogICAgY29uc3QgTVBBX1BFUl9QU0kgPSAwLjAwNjg5NDc2Ow0KDQogICAgY29uc3QgREVGQVVMVF9NQVRFUklBTFMgPSBbDQogICAgICAgIHsgaWQ6ICdsb3dDYXJib25TdGVlbCcsIG5hbWU6ICdMb3cgQ2FyYm9uIFN0ZWVsJywga01pbjogMC41LCBrRGVmYXVsdDogMS4wLCBrTWF4OiAxLjAsIHlpZWxkTVBhOiAyNTAsIHRlbnNpbGVNUGE6IDQwMCwgZWxvbmdhdGlvbjogMjUsIHBhcmFsbGVsR3JhaW46IDEuMjUsIGN2OiAwLjE2IH0sDQogICAgICAgIHsgaWQ6ICdoaWdoU3RyZW5ndGhTdGVlbCcsIG5hbWU6ICdIaWdoIFN0cmVuZ3RoIFN0ZWVsJywga01pbjogMS4wLCBrRGVmYXVsdDogMi4wLCBrTWF4OiAzLjAsIHlpZWxkTVBhOiA1NTAsIHRlbnNpbGVNUGE6IDY1MCwgZWxvbmdhdGlvbjogMTIsIHBhcmFsbGVsR3JhaW46IDEuNDAsIGN2OiAwLjE4IH0sDQogICAgICAgIHsgaWQ6ICdzdGFpbmxlc3NTdGVlbCcsIG5hbWU6ICdTdGFpbmxlc3MgU3RlZWwnLCBrTWluOiAxLjAsIGtEZWZhdWx0OiAxLjUsIGtNYXg6IDIuMCwgeWllbGRNUGE6IDMxMCwgdGVuc2lsZU1QYTogNTgwLCBlbG9uZ2F0aW9uOiA0MCwgcGFyYWxsZWxHcmFpbjogMS4zMCwgY3Y6IDAuMTcgfSwNCiAgICAgICAgeyBpZDogJ2FsdW1pbnVtNTA1MicsIG5hbWU6ICdBbHVtaW51bSA1MDUyJywga01pbjogMC41LCBrRGVmYXVsdDogMC43NSwga01heDogMS4wLCB5aWVsZE1QYTogMTkzLCB0ZW5zaWxlTVBhOiAyMjgsIGVsb25nYXRpb246IDEyLCBwYXJhbGxlbEdyYWluOiAxLjIwLCBjdjogMC4xNSB9LA0KICAgICAgICB7IGlkOiAnYWx1bWludW02MDYxJywgbmFtZTogJ0FsdW1pbnVtIDYwNjEtVDYnLCBrTWluOiAxLjUsIGtEZWZhdWx0OiAyLjI1LCBrTWF4OiAzLjAsIHlpZWxkTVBhOiAyNzYsIHRlbnNpbGVNUGE6IDMxMCwgZWxvbmdhdGlvbjogMTAsIHBhcmFsbGVsR3JhaW46IDEuMzUsIGN2OiAwLjE2IH0sDQogICAgICAgIHsgaWQ6ICdhbHVtaW51bScsIG5hbWU6ICdBbHVtaW51bSAoR2VuZXJhbCknLCBrTWluOiAwLjUsIGtEZWZhdWx0OiAxLjAsIGtNYXg6IDIuMCwgeWllbGRNUGE6IDIwMCwgdGVuc2lsZU1QYTogMjUwLCBlbG9uZ2F0aW9uOiAxNSwgcGFyYWxsZWxHcmFpbjogMS4yNSwgY3Y6IDAuMTUgfSwNCiAgICAgICAgeyBpZDogJ2NvcHBlcicsIG5hbWU6ICdDb3BwZXInLCBrTWluOiAwLjUsIGtEZWZhdWx0OiAwLjc1LCBrTWF4OiAxLjAsIHlpZWxkTVBhOiA3MCwgdGVuc2lsZU1QYTogMjIwLCBlbG9uZ2F0aW9uOiAzMCwgcGFyYWxsZWxHcmFpbjogMS4xNSwgY3Y6IDAuMTQgfSwNCiAgICAgICAgeyBpZDogJ2JyYXNzJywgbmFtZTogJ0JyYXNzJywga01pbjogMC41LCBrRGVmYXVsdDogMS4wLCBrTWF4OiAxLjUsIHlpZWxkTVBhOiAxMjUsIHRlbnNpbGVNUGE6IDM0MCwgZWxvbmdhdGlvbjogMzUsIHBhcmFsbGVsR3JhaW46IDEuMjAsIGN2OiAwLjE0IH0sDQogICAgICAgIHsgaWQ6ICd0aXRhbml1bScsIG5hbWU6ICdUaXRhbml1bSBBbGxveScsIGtNaW46IDIuMCwga0RlZmF1bHQ6IDMuMCwga01heDogNC4wLCB5aWVsZE1QYTogODgwLCB0ZW5zaWxlTVBhOiA5NTAsIGVsb25nYXRpb246IDEwLCBwYXJhbGxlbEdyYWluOiAxLjUwLCBjdjogMC4yMCB9LA0KICAgICAgICB7IGlkOiAnbWFnbmVzaXVtJywgbmFtZTogJ01hZ25lc2l1bSBBbGxveScsIGtNaW46IDIuMCwga0RlZmF1bHQ6IDMuNSwga01heDogNS4wLCB5aWVsZE1QYTogMjIwLCB0ZW5zaWxlTVBhOiAyOTAsIGVsb25nYXRpb246IDgsIHBhcmFsbGVsR3JhaW46IDEuNDUsIGN2OiAwLjE5IH0sDQogICAgICAgIHsgaWQ6ICdjdXN0b20nLCBuYW1lOiAnQ3VzdG9tIE1hdGVyaWFsJywga01pbjogMC41LCBrRGVmYXVsdDogMS4wLCBrTWF4OiA1LjAsIHlpZWxkTVBhOiAyNTAsIHRlbnNpbGVNUGE6IDQwMCwgZWxvbmdhdGlvbjogMjAsIHBhcmFsbGVsR3JhaW46IDEuMjUsIGN2OiAwLjE2IH0NCiAgICBdOw0KDQogICAgY29uc3QgRElSRUNUSU9OX0RFRkFVTFRTID0geyBwZXJwZW5kaWN1bGFyOiAxLjAwLCBwYXJhbGxlbDogbnVsbCwgdW5rbm93bjogMS4xMCB9Ow0KICAgIGNvbnN0IFBST0NFU1NfRkFDVE9SUyA9IHsgYWlyQmVuZGluZzogMS4wMCwgYm90dG9tQmVuZGluZzogMC45NSwgY29pbmluZzogMC44NSwgcm9sbEZvcm1pbmc6IDEuMTUsIGN1c3RvbVByb2Nlc3M6IDEuMDAgfTsNCiAgICBjb25zdCBIQVJETkVTU19GQUNUT1JTID0geyBhbm5lYWxlZDogMC44NSwgaGFsZkhhcmQ6IDEuMDAsIGZ1bGxIYXJkOiAxLjQwLCB0NDogMS4xMCwgdDY6IDEuNTAsIGN1c3RvbTogMS4wMCB9Ow0KICAgIGNvbnN0IFNUUkVOR1RIX1JBTkdFUyA9IFsNCiAgICAgICAgeyBtaW5NUGE6IDAsIG1heE1QYTogMjAwLCBmYWN0b3I6IDAuOTAgfSwNCiAgICAgICAgeyBtaW5NUGE6IDIwMCwgbWF4TVBhOiAzNTAsIGZhY3RvcjogMS4wMCB9LA0KICAgICAgICB7IG1pbk1QYTogMzUwLCBtYXhNUGE6IDUwMCwgZmFjdG9yOiAxLjE1IH0sDQogICAgICAgIHsgbWluTVBhOiA1MDAsIG1heE1QYTogNzAwLCBmYWN0b3I6IDEuMzUgfSwNCiAgICAgICAgeyBtaW5NUGE6IDcwMCwgbWF4TVBhOiBJbmZpbml0eSwgZmFjdG9yOiAxLjYwIH0NCiAgICBdOw0KDQogICAgbGV0IG1hdGVyaWFscyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoREVGQVVMVF9NQVRFUklBTFMpKTsNCg0KICAgIGNvbnN0ICQgPSAoaWQpID0+IHJvb3QucXVlcnlTZWxlY3RvcignIycgKyBpZCk7DQoNCiAgICBjb25zdCBlbHMgPSB7DQogICAgICAgIGNhbGNNb2RlOiAkKCdtYnItY2FsY01vZGUnKSwNCiAgICAgICAgdW5pdFN5c3RlbTogJCgnbWJyLXVuaXRTeXN0ZW0nKSwNCiAgICAgICAgbWF0ZXJpYWxTZWFyY2g6ICQoJ21ici1tYXRlcmlhbFNlYXJjaCcpLA0KICAgICAgICBtYXRlcmlhbFR5cGU6ICQoJ21ici1tYXRlcmlhbFR5cGUnKSwNCiAgICAgICAgbWF0ZXJpYWxHcmFkZTogJCgnbWJyLW1hdGVyaWFsR3JhZGUnKSwNCiAgICAgICAgdGhpY2tuZXNzOiAkKCdtYnItdGhpY2tuZXNzJyksDQogICAgICAgIHRoaWNrbmVzc1VuaXQ6ICQoJ21ici10aGlja25lc3NVbml0JyksDQogICAgICAgIHlpZWxkU3RyZW5ndGg6ICQoJ21ici15aWVsZFN0cmVuZ3RoJyksDQogICAgICAgIHlpZWxkVW5pdDogJCgnbWJyLXlpZWxkVW5pdCcpLA0KICAgICAgICB0ZW5zaWxlU3RyZW5ndGg6ICQoJ21ici10ZW5zaWxlU3RyZW5ndGgnKSwNCiAgICAgICAgdGVuc2lsZVVuaXQ6ICQoJ21ici10ZW5zaWxlVW5pdCcpLA0KICAgICAgICBlbG9uZ2F0aW9uOiAkKCdtYnItZWxvbmdhdGlvbicpLA0KICAgICAgICB0ZW1wZXI6ICQoJ21ici10ZW1wZXInKSwNCiAgICAgICAgYmFzZUs6ICQoJ21ici1iYXNlSycpLA0KICAgICAgICBrUmFuZ2VIaW50OiAkKCdtYnIta1JhbmdlSGludCcpLA0KICAgICAgICB1c2VTdHJlbmd0aEFkanVzdDogJCgnbWJyLXVzZVN0cmVuZ3RoQWRqdXN0JyksDQogICAgICAgIHVzZUR1Y3RpbGl0eUFkanVzdDogJCgnbWJyLXVzZUR1Y3RpbGl0eUFkanVzdCcpLA0KICAgICAgICByb2xsaW5nRGlyZWN0aW9uOiAkKCdtYnItcm9sbGluZ0RpcmVjdGlvbicpLA0KICAgICAgICBmb3JtaW5nTWV0aG9kOiAkKCdtYnItZm9ybWluZ01ldGhvZCcpLA0KICAgICAgICBhY3R1YWxSYWRpdXM6ICQoJ21ici1hY3R1YWxSYWRpdXMnKSwNCiAgICAgICAgcmFkaXVzVW5pdDogJCgnbWJyLXJhZGl1c1VuaXQnKSwNCiAgICAgICAgdkRpZU9wZW5pbmc6ICQoJ21ici12RGllT3BlbmluZycpLA0KICAgICAgICB2RGllVW5pdDogJCgnbWJyLXZEaWVVbml0JyksDQogICAgICAgIGRpckZhY3RvcjogJCgnbWJyLWRpckZhY3RvcicpLA0KICAgICAgICBwcm9jZXNzRmFjdG9yOiAkKCdtYnItcHJvY2Vzc0ZhY3RvcicpLA0KICAgICAgICBoYXJkbmVzc0ZhY3RvcjogJCgnbWJyLWhhcmRuZXNzRmFjdG9yJyksDQogICAgICAgIGN2RmFjdG9yOiAkKCdtYnItY3ZGYWN0b3InKSwNCiAgICAgICAgYnRuQ2FsY3VsYXRlOiAkKCdtYnItYnRuQ2FsY3VsYXRlJyksDQogICAgICAgIGNhbGN1bGF0b3JSZXN1bHRzOiAkKCdtYnItY2FsY3VsYXRvclJlc3VsdHMnKSwNCiAgICAgICAgcmVzdWx0c0dyaWQ6ICQoJ21ici1yZXN1bHRzR3JpZCcpLA0KICAgICAgICB3YXJuaW5nczogJCgnbWJyLXdhcm5pbmdzJyksDQogICAgICAgIHNlY3Rpb25Db21wYXJpc29uOiAkKCdtYnItc2VjdGlvbkNvbXBhcmlzb24nKSwNCiAgICAgICAgY29tcGFyaXNvbk1hdGVyaWFsczogJCgnbWJyLWNvbXBhcmlzb25NYXRlcmlhbHMnKSwNCiAgICAgICAgY29tcGFyaXNvblJlc3VsdHM6ICQoJ21ici1jb21wYXJpc29uUmVzdWx0cycpLA0KICAgICAgICBjb21wYXJpc29uVGFibGU6ICQoJ21ici1jb21wYXJpc29uVGFibGUnKSwNCiAgICAgICAgcHJlc2V0VGFibGU6ICQoJ21ici1wcmVzZXRUYWJsZScpLA0KICAgICAgICBzdHJlbmd0aFRhYmxlOiAkKCdtYnItc3RyZW5ndGhUYWJsZScpDQogICAgfTsNCg0KICAgIGNvbnN0IHJlc3VsdEVscyA9IHsNCiAgICAgICAgYmFzZVJhZGl1czogJCgnbWJyLXJlc0Jhc2VSYWRpdXMnKSwNCiAgICAgICAgYWRqdXN0ZWRSYWRpdXM6ICQoJ21ici1yZXNBZGp1c3RlZFJhZGl1cycpLA0KICAgICAgICByYWRpdXNGYWN0b3I6ICQoJ21ici1yZXNSYWRpdXNGYWN0b3InKSwNCiAgICAgICAgaW5zaWRlUmFkaXVzOiAkKCdtYnItcmVzSW5zaWRlUmFkaXVzJyksDQogICAgICAgIG91dHNpZGVSYWRpdXM6ICQoJ21ici1yZXNPdXRzaWRlUmFkaXVzJyksDQogICAgICAgIHB1bmNoUmFkaXVzOiAkKCdtYnItcmVzUHVuY2hSYWRpdXMnKSwNCiAgICAgICAgcmFkaXVzUmF0aW86ICQoJ21ici1yZXNSYWRpdXNSYXRpbycpLA0KICAgICAgICB1dGlsaXphdGlvbjogJCgnbWJyLXJlc1V0aWxpemF0aW9uJyksDQogICAgICAgIGJlbmRhYmlsaXR5OiAkKCdtYnItcmVzQmVuZGFiaWxpdHknKSwNCiAgICAgICAgY3JhY2tpbmdSaXNrOiAkKCdtYnItcmVzQ3JhY2tpbmdSaXNrJyksDQogICAgICAgIHZEaWVSYWRpdXM6ICQoJ21ici1yZXNWRGllUmFkaXVzJykNCiAgICB9Ow0KDQogICAgZnVuY3Rpb24gaXNNZXRyaWMoKSB7DQogICAgICAgIHJldHVybiBlbHMudW5pdFN5c3RlbS52YWx1ZSA9PT0gJ21ldHJpYyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdG9NTSh2YWx1ZSkgew0KICAgICAgICByZXR1cm4gaXNNZXRyaWMoKSA\/IHZhbHVlIDogdmFsdWUgKiBNTV9QRVJfSU5DSDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBmcm9tTU0obW0pIHsNCiAgICAgICAgcmV0dXJuIGlzTWV0cmljKCkgPyBtbSA6IG1tIC8gTU1fUEVSX0lOQ0g7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm9ybWF0TGVuZ3RoKG1tKSB7DQogICAgICAgIGNvbnN0IHZhbCA9IGZyb21NTShtbSk7DQogICAgICAgIGNvbnN0IHVuaXQgPSBpc01ldHJpYygpID8gJ21tJyA6ICdpbic7DQogICAgICAgIGNvbnN0IGRlY2ltYWxzID0gaXNNZXRyaWMoKSA\/IDIgOiA0Ow0KICAgICAgICByZXR1cm4gdmFsLnRvRml4ZWQoZGVjaW1hbHMpICsgJyAnICsgdW5pdDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB0b01QYSh2YWx1ZSkgew0KICAgICAgICBpZiAoIXZhbHVlICYmIHZhbHVlICE9PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgICAgaWYgKGlzTWV0cmljKCkpIHJldHVybiB2YWx1ZTsNCiAgICAgICAgY29uc3QgdW5pdCA9IGVscy55aWVsZFVuaXQudGV4dENvbnRlbnQ7DQogICAgICAgIGlmICh1bml0ID09PSAna3NpJykgcmV0dXJuIHZhbHVlICogTVBBX1BFUl9LU0k7DQogICAgICAgIHJldHVybiB2YWx1ZSAqIE1QQV9QRVJfUFNJOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGZyb21NUGEobXBhLCB0YXJnZXRVbml0KSB7DQogICAgICAgIGlmICh0YXJnZXRVbml0ID09PSAna3NpJykgcmV0dXJuIG1wYSAvIE1QQV9QRVJfS1NJOw0KICAgICAgICBpZiAodGFyZ2V0VW5pdCA9PT0gJ3BzaScpIHJldHVybiBtcGEgLyBNUEFfUEVSX1BTSTsNCiAgICAgICAgcmV0dXJuIG1wYTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRNYXRlcmlhbChpZCkgew0KICAgICAgICByZXR1cm4gbWF0ZXJpYWxzLmZpbmQoKG0pID0+IG0uaWQgPT09IGlkKSB8fCBtYXRlcmlhbHNbbWF0ZXJpYWxzLmxlbmd0aCAtIDFdOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlTWF0ZXJpYWxTZWxlY3QoZmlsdGVyKSB7DQogICAgICAgIGNvbnN0IHEgPSAoZmlsdGVyIHx8ICcnKS50b0xvd2VyQ2FzZSgpLnRyaW0oKTsNCiAgICAgICAgY29uc3QgZmlsdGVyZWQgPSBtYXRlcmlhbHMuZmlsdGVyKChtKSA9PiBtLm5hbWUudG9Mb3dlckNhc2UoKS5pbmNsdWRlcyhxKSk7DQogICAgICAgIGVscy5tYXRlcmlhbFR5cGUuaW5uZXJIVE1MID0gZmlsdGVyZWQubWFwKChtKSA9Pg0KICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9IiR7bS5pZH0iPiR7bS5uYW1lfTwvb3B0aW9uPmANCiAgICAgICAgKS5qb2luKCcnKTsNCiAgICAgICAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gMCkgew0KICAgICAgICAgICAgZWxzLm1hdGVyaWFsVHlwZS5pbm5lckhUTUwgPSAnPG9wdGlvbiB2YWx1ZT0iY3VzdG9tIj5DdXN0b20gTWF0ZXJpYWw8L29wdGlvbj4nOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcG9wdWxhdGVDb21wYXJpc29uQ2hlY2tib3hlcygpIHsNCiAgICAgICAgZWxzLmNvbXBhcmlzb25NYXRlcmlhbHMuaW5uZXJIVE1MID0gbWF0ZXJpYWxzDQogICAgICAgICAgICAuZmlsdGVyKChtKSA9PiBtLmlkICE9PSAnY3VzdG9tJykNCiAgICAgICAgICAgIC5tYXAoKG0sIGkpID0+IGANCiAgICAgICAgICAgICAgICA8bGFiZWw+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ibWJyLWNvbXBhcmVNYXQiIHZhbHVlPSIke20uaWR9IiAke2kgPCA0ID8gJ2NoZWNrZWQnIDogJyd9Pg0KICAgICAgICAgICAgICAgICAgICAke20ubmFtZX0NCiAgICAgICAgICAgICAgICA8L2xhYmVsPg0KICAgICAgICAgICAgYCkuam9pbignJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcG9wdWxhdGVQcmVzZXRUYWJsZSgpIHsNCiAgICAgICAgZWxzLnByZXNldFRhYmxlLnF1ZXJ5U2VsZWN0b3IoJ3Rib2R5JykuaW5uZXJIVE1MID0gbWF0ZXJpYWxzLm1hcCgobSkgPT4gYA0KICAgICAgICAgICAgPHRyIGRhdGEtaWQ9IiR7bS5pZH0iPg0KICAgICAgICAgICAgICAgIDx0ZD4ke20ubmFtZX08L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ibWJyLXByZXNldC1rbWluIiBzdGVwPSJhbnkiIG1pbj0iMC4wMSIgdmFsdWU9IiR7bS5rTWlufSI+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1ici1wcmVzZXQta2RlZiIgc3RlcD0iYW55IiBtaW49IjAuMDEiIHZhbHVlPSIke20ua0RlZmF1bHR9Ij48L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ibWJyLXByZXNldC1rbWF4IiBzdGVwPSJhbnkiIG1pbj0iMC4wMSIgdmFsdWU9IiR7bS5rTWF4fSI+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1ici1wcmVzZXQtcGFyYWxsZWwiIHN0ZXA9ImFueSIgbWluPSIwLjAxIiB2YWx1ZT0iJHttLnBhcmFsbGVsR3JhaW59Ij48L3RkPg0KICAgICAgICAgICAgPC90cj4NCiAgICAgICAgYCkuam9pbignJyk7DQoNCiAgICAgICAgZWxzLnByZXNldFRhYmxlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Rib2R5IHRyJykuZm9yRWFjaCgocm93KSA9PiB7DQogICAgICAgICAgICByb3cucXVlcnlTZWxlY3RvckFsbCgnaW5wdXQnKS5mb3JFYWNoKChpbnB1dCkgPT4gew0KICAgICAgICAgICAgICAgIGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHN5bmNQcmVzZXRGcm9tVGFibGUocm93KSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3luY1ByZXNldEZyb21UYWJsZShyb3cpIHsNCiAgICAgICAgY29uc3QgaWQgPSByb3cuZGF0YXNldC5pZDsNCiAgICAgICAgY29uc3QgbWF0ID0gZ2V0TWF0ZXJpYWwoaWQpOw0KICAgICAgICBpZiAoIW1hdCkgcmV0dXJuOw0KICAgICAgICBtYXQua01pbiA9IHBhcnNlRmxvYXQocm93LnF1ZXJ5U2VsZWN0b3IoJy5tYnItcHJlc2V0LWttaW4nKS52YWx1ZSkgfHwgbWF0LmtNaW47DQogICAgICAgIG1hdC5rRGVmYXVsdCA9IHBhcnNlRmxvYXQocm93LnF1ZXJ5U2VsZWN0b3IoJy5tYnItcHJlc2V0LWtkZWYnKS52YWx1ZSkgfHwgbWF0LmtEZWZhdWx0Ow0KICAgICAgICBtYXQua01heCA9IHBhcnNlRmxvYXQocm93LnF1ZXJ5U2VsZWN0b3IoJy5tYnItcHJlc2V0LWttYXgnKS52YWx1ZSkgfHwgbWF0LmtNYXg7DQogICAgICAgIG1hdC5wYXJhbGxlbEdyYWluID0gcGFyc2VGbG9hdChyb3cucXVlcnlTZWxlY3RvcignLm1ici1wcmVzZXQtcGFyYWxsZWwnKS52YWx1ZSkgfHwgbWF0LnBhcmFsbGVsR3JhaW47DQogICAgICAgIGlmIChlbHMubWF0ZXJpYWxUeXBlLnZhbHVlID09PSBpZCkgew0KICAgICAgICAgICAgZWxzLmJhc2VLLnZhbHVlID0gbWF0LmtEZWZhdWx0Ow0KICAgICAgICAgICAgdXBkYXRlS1JhbmdlSGludChtYXQpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcG9wdWxhdGVTdHJlbmd0aFRhYmxlKCkgew0KICAgICAgICBlbHMuc3RyZW5ndGhUYWJsZS5xdWVyeVNlbGVjdG9yKCd0Ym9keScpLmlubmVySFRNTCA9IFNUUkVOR1RIX1JBTkdFUy5tYXAoKHIsIGkpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IG1heExhYmVsID0gci5tYXhNUGEgPT09IEluZmluaXR5ID8gJ2luZicgOiByLm1heE1QYTsNCiAgICAgICAgICAgIHJldHVybiAoDQogICAgICAgICAgICAgICAgJzx0ciBkYXRhLWlkeD0iJyArIGkgKyAnIj4nICsNCiAgICAgICAgICAgICAgICAgICAgJzx0ZD4nICsgci5taW5NUGEgKyAnIC0gJyArIG1heExhYmVsICsgJzwvdGQ+JyArDQogICAgICAgICAgICAgICAgICAgICc8dGQ+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1ici1zdHJlbmd0aC1mYWN0b3IiIHN0ZXA9ImFueSIgbWluPSIwLjAxIiB2YWx1ZT0iJyArIHIuZmFjdG9yICsgJyI+PC90ZD4nICsNCiAgICAgICAgICAgICAgICAnPC90cj4nDQogICAgICAgICAgICApOw0KICAgICAgICB9KS5qb2luKCcnKTsNCg0KICAgICAgICBlbHMuc3RyZW5ndGhUYWJsZS5xdWVyeVNlbGVjdG9yQWxsKCcubWJyLXN0cmVuZ3RoLWZhY3RvcicpLmZvckVhY2goKGlucHV0LCBpKSA9PiB7DQogICAgICAgICAgICBpbnB1dC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICAgICAgU1RSRU5HVEhfUkFOR0VTW2ldLmZhY3RvciA9IHBhcnNlRmxvYXQoaW5wdXQudmFsdWUpIHx8IFNUUkVOR1RIX1JBTkdFU1tpXS5mYWN0b3I7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlVW5pdHMoKSB7DQogICAgICAgIGNvbnN0IG1ldHJpYyA9IGlzTWV0cmljKCk7DQogICAgICAgIGVscy50aGlja25lc3NVbml0LnRleHRDb250ZW50ID0gbWV0cmljID8gJ21tJyA6ICdpbic7DQogICAgICAgIGVscy5yYWRpdXNVbml0LnRleHRDb250ZW50ID0gbWV0cmljID8gJ21tJyA6ICdpbic7DQogICAgICAgIGVscy52RGllVW5pdC50ZXh0Q29udGVudCA9IG1ldHJpYyA\/ICdtbScgOiAnaW4nOw0KICAgICAgICBlbHMueWllbGRVbml0LnRleHRDb250ZW50ID0gbWV0cmljID8gJ01QYScgOiAna3NpJzsNCiAgICAgICAgZWxzLnRlbnNpbGVVbml0LnRleHRDb250ZW50ID0gbWV0cmljID8gJ01QYScgOiAna3NpJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVLUmFuZ2VIaW50KG1hdCkgew0KICAgICAgICBlbHMua1JhbmdlSGludC50ZXh0Q29udGVudCA9ICdUeXBpY2FsIHJhbmdlOiAnICsgbWF0LmtNaW4gKyAndCAtICcgKyBtYXQua01heCArICd0JzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcHBseU1hdGVyaWFsRGVmYXVsdHMoc2tpcEspIHsNCiAgICAgICAgY29uc3QgbWF0ID0gZ2V0TWF0ZXJpYWwoZWxzLm1hdGVyaWFsVHlwZS52YWx1ZSk7DQogICAgICAgIGlmICghc2tpcEspIHsNCiAgICAgICAgICAgIGVscy5iYXNlSy52YWx1ZSA9IG1hdC5rRGVmYXVsdDsNCiAgICAgICAgICAgIHVwZGF0ZUtSYW5nZUhpbnQobWF0KTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVscy55aWVsZFN0cmVuZ3RoLmRhdGFzZXQudXNlckVkaXRlZCkgew0KICAgICAgICAgICAgZWxzLnlpZWxkU3RyZW5ndGgudmFsdWUgPSBmcm9tTVBhKG1hdC55aWVsZE1QYSwgaXNNZXRyaWMoKSA\/ICdNUGEnIDogJ2tzaScpLnRvRml4ZWQoaXNNZXRyaWMoKSA\/IDAgOiAxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVscy50ZW5zaWxlU3RyZW5ndGguZGF0YXNldC51c2VyRWRpdGVkKSB7DQogICAgICAgICAgICBlbHMudGVuc2lsZVN0cmVuZ3RoLnZhbHVlID0gZnJvbU1QYShtYXQudGVuc2lsZU1QYSwgaXNNZXRyaWMoKSA\/ICdNUGEnIDogJ2tzaScpLnRvRml4ZWQoaXNNZXRyaWMoKSA\/IDAgOiAxKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoIWVscy5lbG9uZ2F0aW9uLmRhdGFzZXQudXNlckVkaXRlZCAmJiBtYXQuZWxvbmdhdGlvbikgew0KICAgICAgICAgICAgZWxzLmVsb25nYXRpb24udmFsdWUgPSBtYXQuZWxvbmdhdGlvbjsNCiAgICAgICAgfQ0KICAgICAgICBlbHMuY3ZGYWN0b3IudmFsdWUgPSBtYXQuY3Y7DQogICAgICAgIHVwZGF0ZURpcmVjdGlvbkZhY3RvcigpOw0KICAgICAgICB1cGRhdGVQcm9jZXNzRmFjdG9yKCk7DQogICAgICAgIHVwZGF0ZUhhcmRuZXNzRmFjdG9yKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlRGlyZWN0aW9uRmFjdG9yKCkgew0KICAgICAgICBpZiAoZWxzLmRpckZhY3Rvci5kYXRhc2V0LnVzZXJFZGl0ZWQgPT09ICd0cnVlJykgcmV0dXJuOw0KICAgICAgICBjb25zdCBkaXIgPSBlbHMucm9sbGluZ0RpcmVjdGlvbi52YWx1ZTsNCiAgICAgICAgY29uc3QgbWF0ID0gZ2V0TWF0ZXJpYWwoZWxzLm1hdGVyaWFsVHlwZS52YWx1ZSk7DQogICAgICAgIGlmIChkaXIgPT09ICdwZXJwZW5kaWN1bGFyJykgew0KICAgICAgICAgICAgZWxzLmRpckZhY3Rvci52YWx1ZSA9IERJUkVDVElPTl9ERUZBVUxUUy5wZXJwZW5kaWN1bGFyLnRvRml4ZWQoMik7DQogICAgICAgIH0gZWxzZSBpZiAoZGlyID09PSAncGFyYWxsZWwnKSB7DQogICAgICAgICAgICBlbHMuZGlyRmFjdG9yLnZhbHVlID0gbWF0LnBhcmFsbGVsR3JhaW4udG9GaXhlZCgyKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgIGVscy5kaXJGYWN0b3IudmFsdWUgPSBESVJFQ1RJT05fREVGQVVMVFMudW5rbm93bi50b0ZpeGVkKDIpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlUHJvY2Vzc0ZhY3RvcigpIHsNCiAgICAgICAgaWYgKGVscy5wcm9jZXNzRmFjdG9yLmRhdGFzZXQudXNlckVkaXRlZCA9PT0gJ3RydWUnKSByZXR1cm47DQogICAgICAgIGVscy5wcm9jZXNzRmFjdG9yLnZhbHVlID0gKFBST0NFU1NfRkFDVE9SU1tlbHMuZm9ybWluZ01ldGhvZC52YWx1ZV0gfHwgMSkudG9GaXhlZCgyKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVIYXJkbmVzc0ZhY3RvcigpIHsNCiAgICAgICAgaWYgKGVscy5oYXJkbmVzc0ZhY3Rvci5kYXRhc2V0LnVzZXJFZGl0ZWQgPT09ICd0cnVlJykgcmV0dXJuOw0KICAgICAgICBlbHMuaGFyZG5lc3NGYWN0b3IudmFsdWUgPSAoSEFSRE5FU1NfRkFDVE9SU1tlbHMudGVtcGVyLnZhbHVlXSB8fCAxKS50b0ZpeGVkKDIpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFN0cmVuZ3RoRmFjdG9yKHlpZWxkTVBhKSB7DQogICAgICAgIGZvciAoY29uc3QgcmFuZ2Ugb2YgU1RSRU5HVEhfUkFOR0VTKSB7DQogICAgICAgICAgICBpZiAoeWllbGRNUGEgPj0gcmFuZ2UubWluTVBhICYmIHlpZWxkTVBhIDwgcmFuZ2UubWF4TVBhKSB7DQogICAgICAgICAgICAgICAgcmV0dXJuIHJhbmdlLmZhY3RvcjsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gMS4wOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldER1Y3RpbGl0eUZhY3RvcihlbG9uZ2F0aW9uKSB7DQogICAgICAgIGlmIChlbG9uZ2F0aW9uID09IG51bGwgfHwgaXNOYU4oZWxvbmdhdGlvbikpIHJldHVybiAxLjA7DQogICAgICAgIGlmIChlbG9uZ2F0aW9uID49IDI1KSByZXR1cm4gMC45MDsNCiAgICAgICAgaWYgKGVsb25nYXRpb24gPj0gMTUpIHJldHVybiAxLjAwOw0KICAgICAgICBpZiAoZWxvbmdhdGlvbiA+PSA4KSByZXR1cm4gMS4xNTsNCiAgICAgICAgcmV0dXJuIDEuMzA7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gY29tcHV0ZUZvck1hdGVyaWFsKG1hdElkLCB0aGlja25lc3NNTSwgb3B0aW9ucykgew0KICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsNCiAgICAgICAgY29uc3QgbWF0ID0gZ2V0TWF0ZXJpYWwobWF0SWQpOw0KICAgICAgICBjb25zdCBrQmFzZSA9IChvcHRpb25zLmtPdmVycmlkZSAhPSBudWxsKQ0KICAgICAgICAgICAgPyBvcHRpb25zLmtPdmVycmlkZQ0KICAgICAgICAgICAgOiAocGFyc2VGbG9hdChlbHMuYmFzZUsudmFsdWUpIHx8IG1hdC5rRGVmYXVsdCk7DQoNCiAgICAgICAgbGV0IHlpZWxkTVBhID0gdG9NUGEocGFyc2VGbG9hdChlbHMueWllbGRTdHJlbmd0aC52YWx1ZSkpOw0KICAgICAgICBpZiAob3B0aW9ucy51c2VNYXREZWZhdWx0cyB8fCAheWllbGRNUGEpIHsNCiAgICAgICAgICAgIHlpZWxkTVBhID0gbWF0LnlpZWxkTVBhOw0KICAgICAgICB9DQoNCiAgICAgICAgbGV0IGVsb25nYXRpb24gPSBwYXJzZUZsb2F0KGVscy5lbG9uZ2F0aW9uLnZhbHVlKTsNCiAgICAgICAgaWYgKG9wdGlvbnMudXNlTWF0RGVmYXVsdHMgfHwgaXNOYU4oZWxvbmdhdGlvbikpIHsNCiAgICAgICAgICAgIGVsb25nYXRpb24gPSBtYXQuZWxvbmdhdGlvbjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGRpciA9IG9wdGlvbnMuZGlyZWN0aW9uICE9IG51bGwgPyBvcHRpb25zLmRpcmVjdGlvbiA6IGVscy5yb2xsaW5nRGlyZWN0aW9uLnZhbHVlOw0KICAgICAgICBsZXQgY0RpciA9IHBhcnNlRmxvYXQoZWxzLmRpckZhY3Rvci52YWx1ZSkgfHwgMTsNCiAgICAgICAgaWYgKG9wdGlvbnMudXNlTWF0RGVmYXVsdHMpIHsNCiAgICAgICAgICAgIGlmIChkaXIgPT09ICdwZXJwZW5kaWN1bGFyJykgY0RpciA9IDEuMDsNCiAgICAgICAgICAgIGVsc2UgaWYgKGRpciA9PT0gJ3BhcmFsbGVsJykgY0RpciA9IG1hdC5wYXJhbGxlbEdyYWluOw0KICAgICAgICAgICAgZWxzZSBjRGlyID0gMS4xMDsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGNQcm9jZXNzID0gKG9wdGlvbnMucHJvY2Vzc0ZhY3RvciAhPSBudWxsKQ0KICAgICAgICAgICAgPyBvcHRpb25zLnByb2Nlc3NGYWN0b3INCiAgICAgICAgICAgIDogKHBhcnNlRmxvYXQoZWxzLnByb2Nlc3NGYWN0b3IudmFsdWUpIHx8IDEpOw0KICAgICAgICBjb25zdCBjSGFyZG5lc3MgPSAob3B0aW9ucy5oYXJkbmVzc0ZhY3RvciAhPSBudWxsKQ0KICAgICAgICAgICAgPyBvcHRpb25zLmhhcmRuZXNzRmFjdG9yDQogICAgICAgICAgICA6IChwYXJzZUZsb2F0KGVscy5oYXJkbmVzc0ZhY3Rvci52YWx1ZSkgfHwgMSk7DQoNCiAgICAgICAgbGV0IGtBZGogPSBrQmFzZTsNCiAgICAgICAgaWYgKG9wdGlvbnMudXNlU3RyZW5ndGhBZGp1c3QgIT09IGZhbHNlICYmIGVscy51c2VTdHJlbmd0aEFkanVzdC5jaGVja2VkKSB7DQogICAgICAgICAgICBrQWRqICo9IGdldFN0cmVuZ3RoRmFjdG9yKHlpZWxkTVBhKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAob3B0aW9ucy51c2VEdWN0aWxpdHlBZGp1c3QgJiYgZWxzLnVzZUR1Y3RpbGl0eUFkanVzdC5jaGVja2VkKSB7DQogICAgICAgICAgICBrQWRqICo9IGdldER1Y3RpbGl0eUZhY3RvcihlbG9uZ2F0aW9uKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IGJhc2VSYWRpdXNNTSA9IGtCYXNlICogdGhpY2tuZXNzTU07DQogICAgICAgIGNvbnN0IGFkanVzdGVkSyA9IGtBZGogKiBjRGlyICogY1Byb2Nlc3MgKiBjSGFyZG5lc3M7DQogICAgICAgIGNvbnN0IGFkanVzdGVkUmFkaXVzTU0gPSBhZGp1c3RlZEsgKiB0aGlja25lc3NNTTsNCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbWF0ZXJpYWw6IG1hdCwNCiAgICAgICAgICAgIGtCYXNlLA0KICAgICAgICAgICAga0FkanVzdGVkOiBhZGp1c3RlZEssDQogICAgICAgICAgICBiYXNlUmFkaXVzTU0sDQogICAgICAgICAgICBhZGp1c3RlZFJhZGl1c01NLA0KICAgICAgICAgICAgcmVjb21tZW5kZWRJbnNpZGVNTTogYWRqdXN0ZWRSYWRpdXNNTSwNCiAgICAgICAgICAgIHJlY29tbWVuZGVkT3V0c2lkZU1NOiBhZGp1c3RlZFJhZGl1c01NICsgdGhpY2tuZXNzTU0sDQogICAgICAgICAgICBwdW5jaFJhZGl1c01NOiBhZGp1c3RlZFJhZGl1c01NLA0KICAgICAgICAgICAgY0RpciwNCiAgICAgICAgICAgIGNQcm9jZXNzLA0KICAgICAgICAgICAgY0hhcmRuZXNzDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dHMoKSB7DQogICAgICAgIGNvbnN0IHdhcm5pbmdzID0gW107DQogICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOw0KDQogICAgICAgIGNvbnN0IHRoaWNrbmVzcyA9IHBhcnNlRmxvYXQoZWxzLnRoaWNrbmVzcy52YWx1ZSk7DQogICAgICAgIGlmICghdGhpY2tuZXNzIHx8IHRoaWNrbmVzcyA8PSAwKSB7DQogICAgICAgICAgICBlcnJvcnMucHVzaCgnTWF0ZXJpYWwgdGhpY2tuZXNzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBrID0gcGFyc2VGbG9hdChlbHMuYmFzZUsudmFsdWUpOw0KICAgICAgICBpZiAoIWsgfHwgayA8PSAwKSB7DQogICAgICAgICAgICBlcnJvcnMucHVzaCgnQmVuZCByYWRpdXMgZmFjdG9yIChLKSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgW2Vscy5kaXJGYWN0b3IsIGVscy5wcm9jZXNzRmFjdG9yLCBlbHMuaGFyZG5lc3NGYWN0b3IsIGVscy5jdkZhY3Rvcl0uZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsNCiAgICAgICAgICAgIGlmIChpc05hTih2KSB8fCB2IDw9IDApIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnQ29ycmVjdGlvbiBmYWN0b3JzIG11c3QgYmUgZ3JlYXRlciB0aGFuIHplcm8uJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGNvbnN0IHlpZWxkVmFsID0gcGFyc2VGbG9hdChlbHMueWllbGRTdHJlbmd0aC52YWx1ZSk7DQogICAgICAgIGlmICh5aWVsZFZhbCAhPT0gdW5kZWZpbmVkICYmICFpc05hTih5aWVsZFZhbCkgJiYgeWllbGRWYWwgPD0gMCkgew0KICAgICAgICAgICAgZXJyb3JzLnB1c2goJ1lpZWxkIHN0cmVuZ3RoIG11c3QgYmUgcG9zaXRpdmUgd2hlbiBlbnRlcmVkLicpOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgdGVuc2lsZVZhbCA9IHBhcnNlRmxvYXQoZWxzLnRlbnNpbGVTdHJlbmd0aC52YWx1ZSk7DQogICAgICAgIGlmICh0ZW5zaWxlVmFsICE9PSB1bmRlZmluZWQgJiYgIWlzTmFOKHRlbnNpbGVWYWwpICYmIHRlbnNpbGVWYWwgPD0gMCkgew0KICAgICAgICAgICAgZXJyb3JzLnB1c2goJ1VsdGltYXRlIHRlbnNpbGUgc3RyZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSB3aGVuIGVudGVyZWQuJyk7DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBlbG9uZyA9IHBhcnNlRmxvYXQoZWxzLmVsb25nYXRpb24udmFsdWUpOw0KICAgICAgICBpZiAoIWlzTmFOKGVsb25nKSAmJiBlbHMuZWxvbmdhdGlvbi52YWx1ZSAhPT0gJycpIHsNCiAgICAgICAgICAgIGlmIChlbG9uZyA8IDAgfHwgZWxvbmcgPiAxMDApIHsNCiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaCgnRWxvbmdhdGlvbiBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUuJyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBhY3R1YWxSID0gcGFyc2VGbG9hdChlbHMuYWN0dWFsUmFkaXVzLnZhbHVlKTsNCiAgICAgICAgaWYgKCFpc05hTihhY3R1YWxSKSAmJiBhY3R1YWxSIDwgMCkgew0KICAgICAgICAgICAgZXJyb3JzLnB1c2goJ0FjdHVhbCBpbnNpZGUgcmFkaXVzIGNhbm5vdCBiZSBuZWdhdGl2ZS4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmICghZWxzLm1hdGVyaWFsR3JhZGUudmFsdWUudHJpbSgpKSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogJ2luZm8nLCBtc2c6ICdNYXRlcmlhbCBncmFkZSBpcyBub3Qgc3BlY2lmaWVkLiBSZXN1bHRzIGFyZSBiYXNlZCBvbiBnZW5lcmljIHByZXNldCBwcm9wZXJ0aWVzLicgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZWxzLnRlbXBlci52YWx1ZSA9PT0gJ2N1c3RvbScgfHwgZWxzLnRlbXBlci52YWx1ZSA9PT0gJ2Z1bGxIYXJkJyB8fCBlbHMudGVtcGVyLnZhbHVlID09PSAndDYnKSB7DQogICAgICAgICAgICB3YXJuaW5ncy5wdXNoKHsgdHlwZTogJ3dhcm4nLCBtc2c6ICdIYXJkZW5lZCBvciBoaWdoLXRlbXBlciBtYXRlcmlhbCBzZWxlY3RlZCAtIHRpZ2h0ZXIgYmVuZHMgaW5jcmVhc2UgY3JhY2tpbmcgcmlzay4gQ29uc2lkZXIgYW5uZWFsZWQgc3RvY2sgZm9yIHRpZ2h0LXJhZGl1cyBmb3JtaW5nLicgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoZWxzLnJvbGxpbmdEaXJlY3Rpb24udmFsdWUgPT09ICd1bmtub3duJykgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7IHR5cGU6ICdpbmZvJywgbXNnOiAnUm9sbGluZyBkaXJlY3Rpb24gdW5rbm93biAtIGEgY29uc2VydmF0aXZlIGRpcmVjdGlvbiBmYWN0b3IgaXMgYXBwbGllZC4nIH0pOw0KICAgICAgICB9DQoNCiAgICAgICAgcmV0dXJuIHsgZXJyb3JzLCB3YXJuaW5ncywgdGhpY2tuZXNzLCBhY3R1YWxSIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0QmVuZGFiaWxpdHlSYXRpbmcoa0Fkaikgew0KICAgICAgICBpZiAoa0FkaiA8PSAxLjApIHJldHVybiB7IGxhYmVsOiAnRXhjZWxsZW50JywgY2xzOiAnbWJyLWJhZGdlLWV4Y2VsbGVudCcgfTsNCiAgICAgICAgaWYgKGtBZGogPD0gMS41KSByZXR1cm4geyBsYWJlbDogJ0dvb2QnLCBjbHM6ICdtYnItYmFkZ2UtZ29vZCcgfTsNCiAgICAgICAgaWYgKGtBZGogPD0gMi41KSByZXR1cm4geyBsYWJlbDogJ01vZGVyYXRlJywgY2xzOiAnbWJyLWJhZGdlLW1vZGVyYXRlJyB9Ow0KICAgICAgICByZXR1cm4geyBsYWJlbDogJ0RpZmZpY3VsdCcsIGNsczogJ21ici1iYWRnZS1kaWZmaWN1bHQnIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0Q3JhY2tpbmdSaXNrKGFjdHVhbE1NLCByZWNvbW1lbmRlZE1NKSB7DQogICAgICAgIGlmICghYWN0dWFsTU0gfHwgYWN0dWFsTU0gPD0gMCB8fCAhcmVjb21tZW5kZWRNTSkgew0KICAgICAgICAgICAgcmV0dXJuIHsgbGFiZWw6ICctJywgY2xzOiAnJyB9Ow0KICAgICAgICB9DQogICAgICAgIGNvbnN0IHJhdGlvID0gYWN0dWFsTU0gLyByZWNvbW1lbmRlZE1NOw0KICAgICAgICBpZiAocmF0aW8gPj0gMS4wKSByZXR1cm4geyBsYWJlbDogJ0xvdycsIGNsczogJ21ici1iYWRnZS1sb3cnIH07DQogICAgICAgIGlmIChyYXRpbyA+PSAwLjg1KSByZXR1cm4geyBsYWJlbDogJ01vZGVyYXRlJywgY2xzOiAnbWJyLWJhZGdlLW1vZGVyYXRlLXJpc2snIH07DQogICAgICAgIHJldHVybiB7IGxhYmVsOiAnSGlnaCcsIGNsczogJ21ici1iYWRnZS1oaWdoJyB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNldEJhZGdlKGVsLCBsYWJlbCwgY2xzKSB7DQogICAgICAgIGVsLnRleHRDb250ZW50ID0gbGFiZWw7DQogICAgICAgIGVsLmNsYXNzTmFtZSA9ICdtYnItcmVzdWx0LXZhbCBtYnItYmFkZ2UnICsgKGNscyA\/ICcgJyArIGNscyA6ICcnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBkaXNwbGF5V2FybmluZ3MoZXJyb3JzLCB3YXJuaW5ncykgew0KICAgICAgICBlbHMud2FybmluZ3MuaW5uZXJIVE1MID0gWw0KICAgICAgICAgICAgLi4uZXJyb3JzLm1hcCgoZSkgPT4gYDxkaXYgY2xhc3M9Im1ici13YXJuaW5nIGVycm9yIj4ke2V9PC9kaXY+YCksDQogICAgICAgICAgICAuLi53YXJuaW5ncy5tYXAoKHcpID0+IGA8ZGl2IGNsYXNzPSJtYnItd2FybmluZyAke3cudHlwZX0iPiR7dy5tc2d9PC9kaXY+YCkNCiAgICAgICAgXS5qb2luKCcnKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93UmVzdWx0c1BhbmVsKCkgew0KICAgICAgICBlbHMuY2FsY3VsYXRvclJlc3VsdHMuY2xhc3NMaXN0LnJlbW92ZSgnbWJyLWhpZGRlbicpOw0KICAgICAgICBlbHMuY2FsY3VsYXRvclJlc3VsdHMuc2Nyb2xsSW50b1ZpZXcoeyBiZWhhdmlvcjogJ3Ntb290aCcsIGJsb2NrOiAnc3RhcnQnIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGhpZGVSZXN1bHRzUGFuZWwoKSB7DQogICAgICAgIGVscy5jYWxjdWxhdG9yUmVzdWx0cy5jbGFzc0xpc3QuYWRkKCdtYnItaGlkZGVuJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gdXBkYXRlTW9kZVZpc2liaWxpdHkoKSB7DQogICAgICAgIGNvbnN0IG1vZGUgPSBlbHMuY2FsY01vZGUudmFsdWU7DQogICAgICAgIGNvbnN0IGlzQ29tcGFyaXNvbiA9IG1vZGUgPT09ICdjb21wYXJpc29uJzsNCg0KICAgICAgICBlbHMuc2VjdGlvbkNvbXBhcmlzb24uY2xhc3NMaXN0LnRvZ2dsZSgnbWJyLWhpZGRlbicsICFpc0NvbXBhcmlzb24pOw0KICAgICAgICBlbHMuY29tcGFyaXNvblJlc3VsdHMuY2xhc3NMaXN0LnRvZ2dsZSgnbWJyLWhpZGRlbicsICFpc0NvbXBhcmlzb24pOw0KICAgICAgICBlbHMucmVzdWx0c0dyaWQuY2xhc3NMaXN0LnRvZ2dsZSgnbWJyLWhpZGRlbicsIGlzQ29tcGFyaXNvbik7DQoNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcubWJyLW1vZGUtZmllbGQnKS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgY29uc3QgbW9kZXMgPSBlbC5kYXRhc2V0Lm1vZGVzLnNwbGl0KCcsJyk7DQogICAgICAgICAgICBlbC5jbGFzc0xpc3QudG9nZ2xlKCdtYnItaGlkZGVuJywgIW1vZGVzLmluY2x1ZGVzKG1vZGUpKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcm9vdC5xdWVyeVNlbGVjdG9yQWxsKCcubWJyLW1vZGUtcmVzdWx0JykuZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IG1vZGVzID0gZWwuZGF0YXNldC5tb2Rlcy5zcGxpdCgnLCcpOw0KICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnRvZ2dsZSgnbWJyLWhpZGRlbicsICFtb2Rlcy5pbmNsdWRlcyhtb2RlKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNhbGN1bGF0ZSgpIHsNCiAgICAgICAgc2hvd1Jlc3VsdHNQYW5lbCgpOw0KICAgICAgICB1cGRhdGVNb2RlVmlzaWJpbGl0eSgpOw0KICAgICAgICBjb25zdCB7IGVycm9ycywgd2FybmluZ3MsIHRoaWNrbmVzcywgYWN0dWFsUiB9ID0gdmFsaWRhdGVJbnB1dHMoKTsNCiAgICAgICAgZGlzcGxheVdhcm5pbmdzKGVycm9ycywgd2FybmluZ3MpOw0KDQogICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkgcmV0dXJuOw0KDQogICAgICAgIGNvbnN0IG1vZGUgPSBlbHMuY2FsY01vZGUudmFsdWU7DQogICAgICAgIGNvbnN0IHRoaWNrbmVzc01NID0gdG9NTSh0aGlja25lc3MpOw0KDQogICAgICAgIGlmIChtb2RlID09PSAnY29tcGFyaXNvbicpIHsNCiAgICAgICAgICAgIHJ1bkNvbXBhcmlzb24odGhpY2tuZXNzTU0pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgbWF0SWQgPSBlbHMubWF0ZXJpYWxUeXBlLnZhbHVlOw0KICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wdXRlRm9yTWF0ZXJpYWwobWF0SWQsIHRoaWNrbmVzc01NKTsNCiAgICAgICAgbGV0IHJlY29tbWVuZGVkTU0gPSByZXN1bHQucmVjb21tZW5kZWRJbnNpZGVNTTsNCiAgICAgICAgbGV0IGRpc3BsYXlJbnNpZGVNTSA9IHJlY29tbWVuZGVkTU07DQoNCiAgICAgICAgY29uc3QgYWN0dWFsTU0gPSBhY3R1YWxSID4gMCA\/IHRvTU0oYWN0dWFsUikgOiBudWxsOw0KDQogICAgICAgIGlmIChtb2RlID09PSAnb3V0c2lkZVJhZGl1cycgJiYgYWN0dWFsTU0pIHsNCiAgICAgICAgICAgIGRpc3BsYXlJbnNpZGVNTSA9IGFjdHVhbE1NOw0KICAgICAgICAgICAgcmVjb21tZW5kZWRNTSA9IGFjdHVhbE1NOw0KICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT09ICdwdW5jaFJhZGl1cycpIHsNCiAgICAgICAgICAgIGRpc3BsYXlJbnNpZGVNTSA9IGFjdHVhbE1NIHx8IHJlY29tbWVuZGVkTU07DQogICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PT0gJ3NhZmV0eUNoZWNrJyAmJiBhY3R1YWxNTSkgew0KICAgICAgICAgICAgZGlzcGxheUluc2lkZU1NID0gYWN0dWFsTU07DQogICAgICAgIH0NCg0KICAgICAgICBjb25zdCBvdXRzaWRlTU0gPSBkaXNwbGF5SW5zaWRlTU0gKyB0aGlja25lc3NNTTsNCiAgICAgICAgY29uc3QgcHVuY2hNTSA9IG1vZGUgPT09ICdwdW5jaFJhZGl1cycgPyAoYWN0dWFsTU0gfHwgcmVjb21tZW5kZWRNTSkgOiByZWNvbW1lbmRlZE1NOw0KDQogICAgICAgIHJlc3VsdEVscy5iYXNlUmFkaXVzLnRleHRDb250ZW50ID0gZm9ybWF0TGVuZ3RoKHJlc3VsdC5iYXNlUmFkaXVzTU0pOw0KICAgICAgICByZXN1bHRFbHMuYWRqdXN0ZWRSYWRpdXMudGV4dENvbnRlbnQgPSBmb3JtYXRMZW5ndGgocmVzdWx0LmFkanVzdGVkUmFkaXVzTU0pOw0KICAgICAgICByZXN1bHRFbHMucmFkaXVzRmFjdG9yLnRleHRDb250ZW50ID0gcmVzdWx0LmtBZGp1c3RlZC50b0ZpeGVkKDIpICsgJyB0JzsNCiAgICAgICAgcmVzdWx0RWxzLmluc2lkZVJhZGl1cy50ZXh0Q29udGVudCA9IGZvcm1hdExlbmd0aChyZWNvbW1lbmRlZE1NKTsNCiAgICAgICAgcmVzdWx0RWxzLm91dHNpZGVSYWRpdXMudGV4dENvbnRlbnQgPSBmb3JtYXRMZW5ndGgob3V0c2lkZU1NKTsNCiAgICAgICAgcmVzdWx0RWxzLnB1bmNoUmFkaXVzLnRleHRDb250ZW50ID0gZm9ybWF0TGVuZ3RoKHB1bmNoTU0pOw0KDQogICAgICAgIGxldCByYWRpdXNSYXRpbyA9ICctJzsNCiAgICAgICAgbGV0IHV0aWxpemF0aW9uID0gJy0nOw0KICAgICAgICBsZXQgcmlzayA9IHsgbGFiZWw6ICctJywgY2xzOiAnJyB9Ow0KDQogICAgICAgIGlmIChhY3R1YWxNTSAmJiBhY3R1YWxNTSA+IDApIHsNCiAgICAgICAgICAgIHJhZGl1c1JhdGlvID0gKGFjdHVhbE1NIC8gcmVzdWx0LmFkanVzdGVkUmFkaXVzTU0pLnRvRml4ZWQoMyk7DQogICAgICAgICAgICB1dGlsaXphdGlvbiA9ICgocmVzdWx0LmFkanVzdGVkUmFkaXVzTU0gLyBhY3R1YWxNTSkgKiAxMDApLnRvRml4ZWQoMSkgKyAnJSc7DQogICAgICAgICAgICByaXNrID0gZ2V0Q3JhY2tpbmdSaXNrKGFjdHVhbE1NLCByZXN1bHQuYWRqdXN0ZWRSYWRpdXNNTSk7DQoNCiAgICAgICAgICAgIGlmIChhY3R1YWxNTSA8IHJlc3VsdC5hZGp1c3RlZFJhZGl1c01NKSB7DQogICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaCh7DQogICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YXJuJywNCiAgICAgICAgICAgICAgICAgICAgbXNnOiBgQWN0dWFsIGJlbmQgcmFkaXVzICgke2Zvcm1hdExlbmd0aChhY3R1YWxNTSl9KSBpcyBiZWxvdyB0aGUgcmVjb21tZW5kZWQgbWluaW11bSAoJHtmb3JtYXRMZW5ndGgocmVzdWx0LmFkanVzdGVkUmFkaXVzTU0pfSkuIEluY3JlYXNlZCBjcmFja2luZyByaXNrLmANCiAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICBkaXNwbGF5V2FybmluZ3MoZXJyb3JzLCB3YXJuaW5ncyk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICByZXN1bHRFbHMucmFkaXVzUmF0aW8udGV4dENvbnRlbnQgPSByYWRpdXNSYXRpbzsNCiAgICAgICAgcmVzdWx0RWxzLnV0aWxpemF0aW9uLnRleHRDb250ZW50ID0gdXRpbGl6YXRpb247DQoNCiAgICAgICAgY29uc3QgYmVuZFJhdGluZyA9IGdldEJlbmRhYmlsaXR5UmF0aW5nKHJlc3VsdC5rQWRqdXN0ZWQpOw0KICAgICAgICBzZXRCYWRnZShyZXN1bHRFbHMuYmVuZGFiaWxpdHksIGJlbmRSYXRpbmcubGFiZWwsIGJlbmRSYXRpbmcuY2xzKTsNCiAgICAgICAgc2V0QmFkZ2UocmVzdWx0RWxzLmNyYWNraW5nUmlzaywgcmlzay5sYWJlbCwgcmlzay5jbHMpOw0KDQogICAgICAgIGNvbnN0IHZEaWUgPSBwYXJzZUZsb2F0KGVscy52RGllT3BlbmluZy52YWx1ZSk7DQogICAgICAgIGlmICh2RGllID4gMCkgew0KICAgICAgICAgICAgY29uc3QgY3YgPSBwYXJzZUZsb2F0KGVscy5jdkZhY3Rvci52YWx1ZSkgfHwgMC4xNjsNCiAgICAgICAgICAgIGNvbnN0IGVzdE1NID0gY3YgKiB0b01NKHZEaWUpOw0KICAgICAgICAgICAgcmVzdWx0RWxzLnZEaWVSYWRpdXMudGV4dENvbnRlbnQgPSBmb3JtYXRMZW5ndGgoZXN0TU0pICsgJyAoQ3YgeCBWKSc7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICByZXN1bHRFbHMudkRpZVJhZGl1cy50ZXh0Q29udGVudCA9ICctJzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJ1bkNvbXBhcmlzb24odGhpY2tuZXNzTU0pIHsNCiAgICAgICAgY29uc3QgY2hlY2tlZCA9IFsuLi5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ2lucHV0W25hbWU9Im1ici1jb21wYXJlTWF0Il06Y2hlY2tlZCcpXTsNCiAgICAgICAgaWYgKGNoZWNrZWQubGVuZ3RoIDwgMikgew0KICAgICAgICAgICAgZGlzcGxheVdhcm5pbmdzKFsnU2VsZWN0IGF0IGxlYXN0IDIgbWF0ZXJpYWxzIGZvciBjb21wYXJpc29uLiddLCBbXSk7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgaWYgKGNoZWNrZWQubGVuZ3RoID4gNikgew0KICAgICAgICAgICAgZGlzcGxheVdhcm5pbmdzKFsnTWF4aW11bSA2IG1hdGVyaWFscyBjYW4gYmUgY29tcGFyZWQgYXQgb25jZS4nXSwgW10pOw0KICAgICAgICAgICAgcmV0dXJuOw0KICAgICAgICB9DQoNCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IGNoZWNrZWQubWFwKChjYikgPT4gew0KICAgICAgICAgICAgY29uc3QgbWF0ID0gZ2V0TWF0ZXJpYWwoY2IudmFsdWUpOw0KICAgICAgICAgICAgY29uc3QgciA9IGNvbXB1dGVGb3JNYXRlcmlhbChjYi52YWx1ZSwgdGhpY2tuZXNzTU0sIHsNCiAgICAgICAgICAgICAgICBrT3ZlcnJpZGU6IG1hdC5rRGVmYXVsdCwNCiAgICAgICAgICAgICAgICB1c2VNYXREZWZhdWx0czogdHJ1ZSwNCiAgICAgICAgICAgICAgICB1c2VTdHJlbmd0aEFkanVzdDogdHJ1ZSwNCiAgICAgICAgICAgICAgICB1c2VEdWN0aWxpdHlBZGp1c3Q6IGVscy51c2VEdWN0aWxpdHlBZGp1c3QuY2hlY2tlZA0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgICAgIG5hbWU6IG1hdC5uYW1lLA0KICAgICAgICAgICAgICAgIGtCYXNlOiBtYXQua0RlZmF1bHQsDQogICAgICAgICAgICAgICAga0Fkajogci5rQWRqdXN0ZWQsDQogICAgICAgICAgICAgICAgbWluSW5zaWRlOiByLmFkanVzdGVkUmFkaXVzTU0sDQogICAgICAgICAgICAgICAgcHVuY2g6IHIucHVuY2hSYWRpdXNNTSwNCiAgICAgICAgICAgICAgICBiZW5kSW5kZXg6IDEgLyByLmtBZGp1c3RlZA0KICAgICAgICAgICAgfTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgcmVzdWx0cy5zb3J0KChhLCBiKSA9PiBhLmtBZGogLSBiLmtBZGopOw0KICAgICAgICBjb25zdCBtYXhJbmRleCA9IE1hdGgubWF4KC4uLnJlc3VsdHMubWFwKChyKSA9PiByLmJlbmRJbmRleCkpOw0KDQogICAgICAgIGVscy5jb21wYXJpc29uVGFibGUucXVlcnlTZWxlY3RvcigndGJvZHknKS5pbm5lckhUTUwgPSByZXN1bHRzLm1hcCgociwgaSkgPT4gew0KICAgICAgICAgICAgY29uc3QgcGN0ID0gKChyLmJlbmRJbmRleCAvIG1heEluZGV4KSAqIDEwMCkudG9GaXhlZCgwKTsNCiAgICAgICAgICAgIHJldHVybiBgDQogICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiR7aSA9PT0gMCA\/ICdtYnItcmFuay0xJyA6ICcnfSI+JHtpICsgMX08L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQ+JHtyLm5hbWV9PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkPiR7ci5rQmFzZS50b0ZpeGVkKDIpfTwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZD4ke3Iua0Fkai50b0ZpeGVkKDIpfTwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZD4ke2Zvcm1hdExlbmd0aChyLm1pbkluc2lkZSl9PC90ZD4NCiAgICAgICAgICAgICAgICAgICAgPHRkPiR7Zm9ybWF0TGVuZ3RoKHIucHVuY2gpfTwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZD4ke3BjdH0lPC90ZD4NCiAgICAgICAgICAgICAgICA8L3RyPg0KICAgICAgICAgICAgYDsNCiAgICAgICAgfSkuam9pbignJyk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYmluZEV2ZW50cygpIHsNCiAgICAgICAgZWxzLmJ0bkNhbGN1bGF0ZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGNhbGN1bGF0ZSk7DQoNCiAgICAgICAgZWxzLmNhbGNNb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgIHVwZGF0ZU1vZGVWaXNpYmlsaXR5KCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy51bml0U3lzdGVtLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgIGNvbnN0IHdhc01ldHJpYyA9IGVscy50aGlja25lc3NVbml0LnRleHRDb250ZW50ID09PSAnbW0nOw0KICAgICAgICAgICAgY29uc3Qgbm93TWV0cmljID0gaXNNZXRyaWMoKTsNCg0KICAgICAgICAgICAgY29uc3QgY29udmVydExlbmd0aCA9ICh2YWwpID0+IHsNCiAgICAgICAgICAgICAgICBpZiAoIXZhbCB8fCBpc05hTih2YWwpKSByZXR1cm4gdmFsOw0KICAgICAgICAgICAgICAgIGlmICh3YXNNZXRyaWMgJiYgIW5vd01ldHJpYykgcmV0dXJuIHZhbCAvIE1NX1BFUl9JTkNIOw0KICAgICAgICAgICAgICAgIGlmICghd2FzTWV0cmljICYmIG5vd01ldHJpYykgcmV0dXJuIHZhbCAqIE1NX1BFUl9JTkNIOw0KICAgICAgICAgICAgICAgIHJldHVybiB2YWw7DQogICAgICAgICAgICB9Ow0KDQogICAgICAgICAgICBjb25zdCBjb252ZXJ0U3RyZW5ndGggPSAodmFsKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKCF2YWwgfHwgaXNOYU4odmFsKSkgcmV0dXJuIHZhbDsNCiAgICAgICAgICAgICAgICBpZiAod2FzTWV0cmljICYmICFub3dNZXRyaWMpIHJldHVybiB2YWwgLyBNUEFfUEVSX0tTSTsNCiAgICAgICAgICAgICAgICBpZiAoIXdhc01ldHJpYyAmJiBub3dNZXRyaWMpIHJldHVybiB2YWwgKiBNUEFfUEVSX0tTSTsNCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsOw0KICAgICAgICAgICAgfTsNCg0KICAgICAgICAgICAgW2Vscy50aGlja25lc3MsIGVscy5hY3R1YWxSYWRpdXMsIGVscy52RGllT3BlbmluZ10uZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICAgICAgaWYgKHYgPiAwKSBlbC52YWx1ZSA9IGNvbnZlcnRMZW5ndGgodikudG9GaXhlZChub3dNZXRyaWMgPyAyIDogNCk7DQogICAgICAgICAgICB9KTsNCg0KICAgICAgICAgICAgW2Vscy55aWVsZFN0cmVuZ3RoLCBlbHMudGVuc2lsZVN0cmVuZ3RoXS5mb3JFYWNoKChlbCkgPT4gew0KICAgICAgICAgICAgICAgIGlmIChlbC5kYXRhc2V0LnVzZXJFZGl0ZWQpIHsNCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdiA9IHBhcnNlRmxvYXQoZWwudmFsdWUpOw0KICAgICAgICAgICAgICAgICAgICBpZiAodiA+IDApIGVsLnZhbHVlID0gY29udmVydFN0cmVuZ3RoKHYpLnRvRml4ZWQobm93TWV0cmljID8gMCA6IDEpOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0pOw0KDQogICAgICAgICAgICB1cGRhdGVVbml0cygpOw0KICAgICAgICAgICAgaWYgKCFlbHMueWllbGRTdHJlbmd0aC5kYXRhc2V0LnVzZXJFZGl0ZWQpIGFwcGx5TWF0ZXJpYWxEZWZhdWx0cyh0cnVlKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZWxzLm1hdGVyaWFsU2VhcmNoLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgKCkgPT4gew0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IGVscy5tYXRlcmlhbFR5cGUudmFsdWU7DQogICAgICAgICAgICBwb3B1bGF0ZU1hdGVyaWFsU2VsZWN0KGVscy5tYXRlcmlhbFNlYXJjaC52YWx1ZSk7DQogICAgICAgICAgICBjb25zdCBzdGlsbFZpc2libGUgPSBbLi4uZWxzLm1hdGVyaWFsVHlwZS5vcHRpb25zXS5zb21lKChvKSA9PiBvLnZhbHVlID09PSBjdXJyZW50KTsNCiAgICAgICAgICAgIGVscy5tYXRlcmlhbFR5cGUudmFsdWUgPSBzdGlsbFZpc2libGUgPyBjdXJyZW50IDogKChlbHMubWF0ZXJpYWxUeXBlLm9wdGlvbnNbMF0gJiYgZWxzLm1hdGVyaWFsVHlwZS5vcHRpb25zWzBdLnZhbHVlKSB8fCAnY3VzdG9tJyk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5tYXRlcmlhbFR5cGUuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgYXBwbHlNYXRlcmlhbERlZmF1bHRzKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy5yb2xsaW5nRGlyZWN0aW9uLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHsNCiAgICAgICAgICAgIGhpZGVSZXN1bHRzUGFuZWwoKTsNCiAgICAgICAgICAgIGVscy5kaXJGYWN0b3IuZGF0YXNldC51c2VyRWRpdGVkID0gJyc7DQogICAgICAgICAgICB1cGRhdGVEaXJlY3Rpb25GYWN0b3IoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgZWxzLmZvcm1pbmdNZXRob2QuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgZWxzLnByb2Nlc3NGYWN0b3IuZGF0YXNldC51c2VyRWRpdGVkID0gJyc7DQogICAgICAgICAgICB1cGRhdGVQcm9jZXNzRmFjdG9yKCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGVscy50ZW1wZXIuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgZWxzLmhhcmRuZXNzRmFjdG9yLmRhdGFzZXQudXNlckVkaXRlZCA9ICcnOw0KICAgICAgICAgICAgdXBkYXRlSGFyZG5lc3NGYWN0b3IoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgW2Vscy5kaXJGYWN0b3IsIGVscy5wcm9jZXNzRmFjdG9yLCBlbHMuaGFyZG5lc3NGYWN0b3JdLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsNCiAgICAgICAgICAgICAgICBlbC5kYXRhc2V0LnVzZXJFZGl0ZWQgPSAndHJ1ZSc7DQogICAgICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIFtlbHMueWllbGRTdHJlbmd0aCwgZWxzLnRlbnNpbGVTdHJlbmd0aCwgZWxzLmVsb25nYXRpb25dLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBlbC5hZGRFdmVudExpc3RlbmVyKCdpbnB1dCcsICgpID0+IHsNCiAgICAgICAgICAgICAgICBlbC5kYXRhc2V0LnVzZXJFZGl0ZWQgPSAndHJ1ZSc7DQogICAgICAgICAgICAgICAgaGlkZVJlc3VsdHNQYW5lbCgpOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0pOw0KDQogICAgICAgIFsNCiAgICAgICAgICAgIGVscy50aGlja25lc3MsIGVscy5iYXNlSywgZWxzLmFjdHVhbFJhZGl1cywgZWxzLnZEaWVPcGVuaW5nLA0KICAgICAgICAgICAgZWxzLnVzZVN0cmVuZ3RoQWRqdXN0LCBlbHMudXNlRHVjdGlsaXR5QWRqdXN0LCBlbHMuY3ZGYWN0b3IsIGVscy5tYXRlcmlhbEdyYWRlDQogICAgICAgIF0uZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGlmIChlbCkgew0KICAgICAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgaGlkZVJlc3VsdHNQYW5lbCk7DQogICAgICAgICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGlkZVJlc3VsdHNQYW5lbCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChlbHMuY29tcGFyaXNvbk1hdGVyaWFscykgew0KICAgICAgICAgICAgZWxzLmNvbXBhcmlzb25NYXRlcmlhbHMuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgaGlkZVJlc3VsdHNQYW5lbCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbml0KCkgew0KICAgICAgICBpZiAoIWVscy5idG5DYWxjdWxhdGUpIHJldHVybjsNCiAgICAgICAgcG9wdWxhdGVNYXRlcmlhbFNlbGVjdCgpOw0KICAgICAgICBwb3B1bGF0ZUNvbXBhcmlzb25DaGVja2JveGVzKCk7DQogICAgICAgIHBvcHVsYXRlUHJlc2V0VGFibGUoKTsNCiAgICAgICAgcG9wdWxhdGVTdHJlbmd0aFRhYmxlKCk7DQogICAgICAgIGJpbmRFdmVudHMoKTsNCiAgICAgICAgdXBkYXRlVW5pdHMoKTsNCiAgICAgICAgZWxzLm1hdGVyaWFsVHlwZS52YWx1ZSA9ICdsb3dDYXJib25TdGVlbCc7DQogICAgICAgIGFwcGx5TWF0ZXJpYWxEZWZhdWx0cygpOw0KICAgICAgICB1cGRhdGVNb2RlVmlzaWJpbGl0eSgpOw0KICAgIH0NCg0KICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnbG9hZGluZycpIHsNCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsIGluaXQpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIGluaXQoKTsNCiAgICB9DQp9KSgpOw0K\"><\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Minimum Bend Radius Calculator by Material is a practical engineering tool designed to estimate the smallest recommended inside bend radius for sheet metal based&#8230;<\/p>","protected":false},"author":2,"featured_media":24821,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"pmpro_default_level":"","_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[8647],"tags":[8687,8688,287,2396],"class_list":["post-24820","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-bend-radius","tag-material-bending","tag-press-brake","tag-sheet-metal","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Minimum-Bend-Radius-Calculator-by-Material.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24820","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/comments?post=24820"}],"version-history":[{"count":0,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24820\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24821"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24820"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24820"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24820"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}