{"id":24861,"date":"2026-09-08T09:08:53","date_gmt":"2026-09-08T09:08:53","guid":{"rendered":"https:\/\/www.mechstream.com\/?p=24861"},"modified":"2026-09-08T09:08:56","modified_gmt":"2026-09-08T09:08:56","slug":"material-formability-grade-assessment-calculator","status":"publish","type":"post","link":"https:\/\/www.mechstream.com\/ru\/material-formability-grade-assessment-calculator\/","title":{"rendered":"Material Formability Grade Assessment Calculator"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">The <strong>Material Formability Grade Assessment Calculator<\/strong> is a practical engineering tool designed to evaluate how suitable a material is for bending, stamping, deep drawing, and stretch forming. It analyzes key properties such as elongation, strain hardening exponent, plastic strain ratio, strength, bendability, and optional forming limit data to generate a formability score and grade. The Material Formability Grade Assessment Calculator helps engineers compare materials, identify forming limitations, and improve material selection and manufacturing process planning.<\/p>\n\n\n\n<!-- WordPress Custom HTML Block: copy ALL content below -->\n<!-- Do NOT wrap in DOCTYPE\/html\/head\/body. Use Code Editor mode. -->\n<!-- All CSS\/JS scoped to #mfga-calculator only. Will NOT affect theme header, footer, menus, sidebar, or other page content. -->\n<style>\n\/* Material Formability Grade Assessment Calculator - WordPress-safe scoped styles *\/\n\/*\n * WordPress-safe: every rule is scoped under #mfga-calculator.\n * Will NOT affect theme header, footer, sidebar, menus, or other page content.\n * No html, body, :root, or unscoped universal selectors.\n *\/\n\n.entry-content #mfga-calculator.mfga-calculator,\n.wp-block-html #mfga-calculator.mfga-calculator,\n.wp-block-group #mfga-calculator.mfga-calculator,\n.post-content #mfga-calculator.mfga-calculator,\n.page-content #mfga-calculator.mfga-calculator,\n.site-content #mfga-calculator.mfga-calculator,\n.elementor-widget-container #mfga-calculator.mfga-calculator,\n.elementor-element #mfga-calculator.mfga-calculator,\n#mfga-calculator.mfga-calculator,\n.entry-content #mfga-calculator.mfga-calculator *,\n.wp-block-html #mfga-calculator.mfga-calculator *,\n.wp-block-group #mfga-calculator.mfga-calculator *,\n.post-content #mfga-calculator.mfga-calculator *,\n.page-content #mfga-calculator.mfga-calculator *,\n.site-content #mfga-calculator.mfga-calculator *,\n.elementor-widget-container #mfga-calculator.mfga-calculator *,\n.elementor-element #mfga-calculator.mfga-calculator *,\n#mfga-calculator.mfga-calculator *,\n.entry-content #mfga-calculator.mfga-calculator *::before,\n.wp-block-html #mfga-calculator.mfga-calculator *::before,\n.wp-block-group #mfga-calculator.mfga-calculator *::before,\n.post-content #mfga-calculator.mfga-calculator *::before,\n.page-content #mfga-calculator.mfga-calculator *::before,\n.site-content #mfga-calculator.mfga-calculator *::before,\n.elementor-widget-container #mfga-calculator.mfga-calculator *::before,\n.elementor-element #mfga-calculator.mfga-calculator *::before,\n#mfga-calculator.mfga-calculator *::before,\n.entry-content #mfga-calculator.mfga-calculator *::after,\n.wp-block-html #mfga-calculator.mfga-calculator *::after,\n.wp-block-group #mfga-calculator.mfga-calculator *::after,\n.post-content #mfga-calculator.mfga-calculator *::after,\n.page-content #mfga-calculator.mfga-calculator *::after,\n.site-content #mfga-calculator.mfga-calculator *::after,\n.elementor-widget-container #mfga-calculator.mfga-calculator *::after,\n.elementor-element #mfga-calculator.mfga-calculator *::after,\n#mfga-calculator.mfga-calculator *::after {\n    box-sizing: border-box !important;\n}\n\n.entry-content #mfga-calculator.mfga-calculator,\n.wp-block-html #mfga-calculator.mfga-calculator,\n.wp-block-group #mfga-calculator.mfga-calculator,\n.post-content #mfga-calculator.mfga-calculator,\n.page-content #mfga-calculator.mfga-calculator,\n.site-content #mfga-calculator.mfga-calculator,\n.elementor-widget-container #mfga-calculator.mfga-calculator,\n.elementor-element #mfga-calculator.mfga-calculator,\n#mfga-calculator.mfga-calculator {    all: revert;\n    --mfga-primary: #1e4d6b;\n    --mfga-primary-light: #2a6f9e;\n    --mfga-primary-dark: #123347;\n    --mfga-accent: #d35400;\n    --mfga-safe: #1e8449;\n    --mfga-caution: #d68910;\n    --mfga-danger: #c0392b;\n    --mfga-excellent: #1e8449;\n    --mfga-verygood: #27ae60;\n    --mfga-good: #2980b9;\n    --mfga-moderate: #d68910;\n    --mfga-limited: #e67e22;\n    --mfga-poor: #c0392b;\n    --mfga-bg: #eef2f5;\n    --mfga-card-bg: #ffffff;\n    --mfga-border: #cfd8dc;\n    --mfga-text: #263238;\n    --mfga-text-muted: #546e7a;\n    --mfga-shadow: 0 2px 14px rgba(30, 77, 107, 0.09);\n    --mfga-radius: 10px;\n    --mfga-font: 'Segoe UI', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;\n    --mfga-mono: 'Consolas', 'Courier New', monospace;\n\n    box-sizing: border-box !important;\n    display: block !important;\n    max-width: 1100px !important;\n    width: 100% !important;\n    margin: 0 auto !important;\n    padding: 1.5rem 1rem !important;\n    font-family: var(--mfga-font) !important;\n    color: var(--mfga-text) !important;\n    line-height: 1.6 !important;\n    font-size: 16px !important;\n    text-align: left !important;\n    background: transparent !important;\n    border: none !important;\n    float: none !important;\n    clear: both !important;\n    position: relative !important;\n    isolation: isolate !important;\n    contain: layout style paint !important;\n    z-index: auto;\n    letter-spacing: normal !important;\n    text-transform: none !important;\n    box-shadow: none !important;\n}\n\n#mfga-calculator.mfga-calculator form,\n#mfga-calculator.mfga-calculator fieldset,\n#mfga-calculator.mfga-calculator table,\n#mfga-calculator.mfga-calculator thead,\n#mfga-calculator.mfga-calculator tbody,\n#mfga-calculator.mfga-calculator tr,\n#mfga-calculator.mfga-calculator th,\n#mfga-calculator.mfga-calculator td,\n#mfga-calculator.mfga-calculator details,\n#mfga-calculator.mfga-calculator summary {\n    all: revert !important;\n    box-sizing: border-box !important;\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    float: none !important;\n    width: auto !important;\n    max-width: none !important;\n    font-family: inherit !important;\n    color: inherit !important;\n}\n\n#mfga-calculator.mfga-calculator svg {\n    display: block !important;\n    max-width: 100% !important;\n    height: auto !important;\n    overflow: visible !important;\n}\n\n#mfga-calculator.mfga-calculator [hidden] {\n    display: none !important;\n}\n\n#mfga-calculator.mfga-calculator h1,\n#mfga-calculator.mfga-calculator h2,\n#mfga-calculator.mfga-calculator h3,\n#mfga-calculator.mfga-calculator h4,\n#mfga-calculator.mfga-calculator p,\n#mfga-calculator.mfga-calculator ul,\n#mfga-calculator.mfga-calculator ol,\n#mfga-calculator.mfga-calculator li,\n#mfga-calculator.mfga-calculator section,\n#mfga-calculator.mfga-calculator div,\n#mfga-calculator.mfga-calculator span,\n#mfga-calculator.mfga-calculator strong,\n#mfga-calculator.mfga-calculator em,\n#mfga-calculator.mfga-calculator sub,\n#mfga-calculator.mfga-calculator sup {\n    margin: 0 !important;\n    padding: 0 !important;\n    border: none !important;\n    background: none !important;\n    box-shadow: none !important;\n    font-family: inherit !important;\n    line-height: inherit !important;\n    color: inherit !important;\n    letter-spacing: inherit !important;\n    text-transform: none !important;\n    text-decoration: none !important;\n    float: none !important;\n}\n\n#mfga-calculator.mfga-calculator h1 {\n    font-size: 1.55rem !important;\n    font-weight: 700 !important;\n    color: var(--mfga-primary-dark) !important;\n    margin-bottom: 0.75rem !important;\n}\n\n#mfga-calculator.mfga-calculator h2 {\n    font-size: 1.25rem !important;\n    font-weight: 700 !important;\n    color: var(--mfga-primary) !important;\n    margin-bottom: 0.75rem !important;\n}\n\n#mfga-calculator.mfga-calculator h3 {\n    font-size: 1rem !important;\n    font-weight: 600 !important;\n    color: var(--mfga-primary) !important;\n    margin-bottom: 0.6rem !important;\n}\n\n#mfga-calculator.mfga-calculator button,\n#mfga-calculator.mfga-calculator input,\n#mfga-calculator.mfga-calculator select,\n#mfga-calculator.mfga-calculator label,\n#mfga-calculator.mfga-calculator legend,\n#mfga-calculator.mfga-calculator summary {\n    font: inherit !important;\n    font-family: var(--mfga-font) !important;\n    color: inherit !important;\n    margin: 0 !important;\n    max-width: none !important;\n    min-width: 0 !important;\n    float: none !important;\n    text-transform: none !important;\n}\n\n#mfga-calculator.mfga-calculator ul,\n#mfga-calculator.mfga-calculator ol {\n    list-style: none !important;\n    padding: 0 !important;\n    margin: 0 !important;\n}\n\n#mfga-calculator.mfga-calculator button {\n    cursor: pointer !important;\n    background: transparent !important;\n    border: none !important;\n    padding: 0 !important;\n    box-shadow: none !important;\n    text-decoration: none !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n    -moz-appearance: none !important;\n    text-transform: none !important;\n    min-height: unset !important;\n    height: auto !important;\n    width: auto !important;\n}\n\n#mfga-calculator.mfga-calculator input[type=\"number\"],\n#mfga-calculator.mfga-calculator input[type=\"text\"],\n#mfga-calculator.mfga-calculator select {\n    display: block !important;\n    width: 100% !important;\n    max-width: 100% !important;\n    padding: 0.55rem 0.75rem !important;\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 6px !important;\n    font-size: 0.95rem !important;\n    font-family: var(--mfga-font) !important;\n    background: #ffffff !important;\n    color: var(--mfga-text) !important;\n    min-height: 38px !important;\n    outline: none !important;\n    box-shadow: none !important;\n    margin: 0 !important;\n    appearance: none !important;\n    -webkit-appearance: none !important;\n    -moz-appearance: none !important;\n}\n\n#mfga-calculator.mfga-calculator input[type=\"number\"]:focus,\n#mfga-calculator.mfga-calculator input[type=\"text\"]:focus,\n#mfga-calculator.mfga-calculator select:focus {\n    border-color: var(--mfga-primary-light) !important;\n    box-shadow: 0 0 0 2px rgba(42, 111, 158, 0.15) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-layout {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 1.25rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-card {\n    background: var(--mfga-card-bg) !important;\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: var(--mfga-radius) !important;\n    padding: 1.25rem !important;\n    box-shadow: var(--mfga-shadow) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-panel-header {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    align-items: center !important;\n    justify-content: flex-end !important;\n    gap: 0.75rem !important;\n    margin-bottom: 1rem !important;\n    padding-bottom: 0.75rem !important;\n    border-bottom: 2px solid var(--mfga-bg) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-unit-toggle {\n    display: inline-flex !important;\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 6px !important;\n    overflow: hidden !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-unit-btn {\n    padding: 0.45rem 0.9rem !important;\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    background: #fff !important;\n    color: var(--mfga-text-muted) !important;\n    border-right: 1px solid var(--mfga-border) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-unit-btn:last-child {\n    border-right: none !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-unit-btn.mfga-active {\n    background: var(--mfga-primary) !important;\n    color: #fff !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-input-section {\n    margin-bottom: 1rem !important;\n    padding: 0.85rem !important;\n    border: 1px solid var(--mfga-bg) !important;\n    border-radius: 8px !important;\n    background: #fafbfc !important;\n}\n\n#mfga-calculator.mfga-calculator legend {\n    font-weight: 600 !important;\n    font-size: 0.9rem !important;\n    color: var(--mfga-primary) !important;\n    padding: 0 0.35rem !important;\n    margin-bottom: 0.65rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-form-row {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)) !important;\n    gap: 0.85rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-form-group {\n    display: flex !important;\n    flex-direction: column !important;\n    gap: 0.35rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-span-full {\n    grid-column: 1 \/ -1 !important;\n}\n\n#mfga-calculator.mfga-calculator label {\n    font-size: 0.85rem !important;\n    font-weight: 600 !important;\n    color: var(--mfga-text) !important;\n    display: flex !important;\n    align-items: center !important;\n    gap: 0.3rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-input-with-unit {\n    display: flex !important;\n    align-items: stretch !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-input-with-unit input {\n    flex: 1 !important;\n    border-top-right-radius: 0 !important;\n    border-bottom-right-radius: 0 !important;\n    border-right: none !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-unit-label {\n    display: flex !important;\n    align-items: center !important;\n    padding: 0 0.65rem !important;\n    font-size: 0.8rem !important;\n    font-weight: 600 !important;\n    color: var(--mfga-text-muted) !important;\n    background: var(--mfga-bg) !important;\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 0 6px 6px 0 !important;\n    white-space: nowrap !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-tooltip {\n    display: inline-flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n    width: 16px !important;\n    height: 16px !important;\n    border-radius: 50% !important;\n    background: var(--mfga-primary-light) !important;\n    color: #fff !important;\n    font-size: 0.65rem !important;\n    font-weight: 700 !important;\n    cursor: help !important;\n    position: relative !important;\n    flex-shrink: 0 !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-tooltip::after {\n    content: attr(data-tip) !important;\n    position: absolute !important;\n    bottom: calc(100% + 6px) !important;\n    left: 50% !important;\n    transform: translateX(-50%) !important;\n    width: max-content !important;\n    max-width: 240px !important;\n    padding: 0.45rem 0.6rem !important;\n    background: var(--mfga-primary-dark) !important;\n    color: #fff !important;\n    font-size: 0.75rem !important;\n    font-weight: 400 !important;\n    border-radius: 4px !important;\n    opacity: 0 !important;\n    pointer-events: none !important;\n    transition: opacity 0.15s !important;\n    z-index: 100 !important;\n    white-space: normal !important;\n    line-height: 1.4 !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-tooltip:hover::after,\n#mfga-calculator.mfga-calculator .mfga-tooltip:focus::after {\n    opacity: 1 !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-actions {\n    display: flex !important;\n    flex-wrap: wrap !important;\n    justify-content: center !important;\n    gap: 0.75rem !important;\n    margin-top: 1rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-btn-primary {\n    padding: 0.7rem 2.5rem !important;\n    min-width: 200px !important;\n    background: var(--mfga-primary) !important;\n    color: #fff !important;\n    font-weight: 600 !important;\n    font-size: 0.95rem !important;\n    border-radius: 6px !important;\n    border: 2px solid var(--mfga-primary) !important;\n    transition: background 0.15s !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-btn-primary:hover {\n    background: var(--mfga-primary-light) !important;\n    border-color: var(--mfga-primary-light) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-btn-secondary {\n    padding: 0.7rem 1.25rem !important;\n    background: #fff !important;\n    color: var(--mfga-primary) !important;\n    font-weight: 600 !important;\n    font-size: 0.9rem !important;\n    border-radius: 6px !important;\n    border: 1px solid var(--mfga-border) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-btn-secondary:hover {\n    border-color: var(--mfga-primary-light) !important;\n    color: var(--mfga-primary-light) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-advanced-section {\n    margin: 1rem 0 !important;\n    border: 1px dashed var(--mfga-border) !important;\n    border-radius: 8px !important;\n    padding: 0.75rem !important;\n    background: #fff !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-advanced-section summary {\n    cursor: pointer !important;\n    font-weight: 600 !important;\n    color: var(--mfga-primary) !important;\n    padding: 0.25rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-comparison-block {\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 8px !important;\n    padding: 0.85rem !important;\n    margin-bottom: 0.75rem !important;\n    background: #fff !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-comparison-block h4 {\n    font-size: 0.9rem !important;\n    font-weight: 700 !important;\n    color: var(--mfga-primary) !important;\n    margin-bottom: 0.6rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-error-box {\n    background: #fdecea !important;\n    border: 1px solid #f5c6cb !important;\n    color: var(--mfga-danger) !important;\n    padding: 0.75rem 1rem !important;\n    border-radius: 6px !important;\n    margin-bottom: 1rem !important;\n    font-size: 0.9rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-warning-box {\n    background: #fef9e7 !important;\n    border: 1px solid #f9e79f !important;\n    color: #7d6608 !important;\n    padding: 0.75rem 1rem !important;\n    border-radius: 6px !important;\n    margin-bottom: 1rem !important;\n    font-size: 0.9rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-results-grid {\n    display: grid !important;\n    grid-template-columns: minmax(220px, 280px) 1fr !important;\n    gap: 1.25rem !important;\n    margin-bottom: 1.25rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-score-card {\n    display: flex !important;\n    flex-direction: column !important;\n    align-items: center !important;\n    padding: 1rem !important;\n    background: var(--mfga-bg) !important;\n    border-radius: var(--mfga-radius) !important;\n    text-align: center !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-gauge-wrap {\n    width: 180px !important;\n    height: 110px !important;\n    margin-bottom: 0.5rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-overall-score {\n    font-size: 2rem !important;\n    font-weight: 700 !important;\n    color: var(--mfga-primary-dark) !important;\n    line-height: 1.2 !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-overall-score small {\n    font-size: 1rem !important;\n    color: var(--mfga-text-muted) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-grade-badge {\n    display: inline-block !important;\n    padding: 0.35rem 0.85rem !important;\n    border-radius: 20px !important;\n    font-weight: 700 !important;\n    font-size: 0.95rem !important;\n    margin: 0.35rem 0 !important;\n    color: #fff !important;\n    background: var(--mfga-good) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-grade-excellent { background: var(--mfga-excellent) !important; }\n#mfga-calculator.mfga-calculator .mfga-grade-verygood { background: var(--mfga-verygood) !important; }\n#mfga-calculator.mfga-calculator .mfga-grade-good { background: var(--mfga-good) !important; }\n#mfga-calculator.mfga-calculator .mfga-grade-moderate { background: var(--mfga-moderate) !important; }\n#mfga-calculator.mfga-calculator .mfga-grade-limited { background: var(--mfga-limited) !important; }\n#mfga-calculator.mfga-calculator .mfga-grade-poor { background: var(--mfga-poor) !important; }\n\n#mfga-calculator.mfga-calculator .mfga-confidence {\n    font-size: 0.85rem !important;\n    color: var(--mfga-text-muted) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-subscores {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)) !important;\n    gap: 0.65rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-subscore-item {\n    background: #fff !important;\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 8px !important;\n    padding: 0.65rem !important;\n    text-align: center !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-subscore-item .mfga-sub-label {\n    font-size: 0.75rem !important;\n    color: var(--mfga-text-muted) !important;\n    margin-bottom: 0.25rem !important;\n    display: block !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-subscore-item .mfga-sub-value {\n    font-size: 1.25rem !important;\n    font-weight: 700 !important;\n    color: var(--mfga-primary) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-subscore-item.mfga-low {\n    border-color: #f5b7b1 !important;\n    background: #fdf2f0 !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-process-scores {\n    display: grid !important;\n    grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)) !important;\n    gap: 0.65rem !important;\n    margin-bottom: 1.25rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-process-item {\n    padding: 0.75rem !important;\n    background: linear-gradient(135deg, #f8fbfd 0%, #eef4f8 100%) !important;\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 8px !important;\n    text-align: center !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-process-item .mfga-process-name {\n    font-size: 0.8rem !important;\n    color: var(--mfga-text-muted) !important;\n    margin-bottom: 0.2rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-process-item .mfga-process-value {\n    font-size: 1.35rem !important;\n    font-weight: 700 !important;\n    color: var(--mfga-primary-dark) !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-charts-grid {\n    display: grid !important;\n    grid-template-columns: repeat(2, 1fr) !important;\n    gap: 1rem !important;\n    margin-bottom: 1.25rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-chart-card {\n    border: 1px solid var(--mfga-border) !important;\n    border-radius: 8px !important;\n    padding: 0.85rem !important;\n    background: #fff !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-chart-area {\n    min-height: 220px !important;\n    display: flex !important;\n    align-items: center !important;\n    justify-content: center !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-table-scroll {\n    overflow-x: auto !important;\n    margin-top: 0.5rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-data-table {\n    width: 100% !important;\n    border-collapse: collapse !important;\n    font-size: 0.85rem !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-data-table th,\n#mfga-calculator.mfga-calculator .mfga-data-table td {\n    padding: 0.55rem 0.65rem !important;\n    border: 1px solid var(--mfga-border) !important;\n    text-align: left !important;\n    background: #fff !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-data-table th {\n    background: var(--mfga-primary) !important;\n    color: #fff !important;\n    font-weight: 600 !important;\n}\n\n#mfga-calculator.mfga-calculator .mfga-data-table tr:nth-child(even) td {\n    background: #f8fafb !important;\n}\n\n@media (max-width: 768px) {\n    #mfga-calculator.mfga-calculator .mfga-results-grid,\n    #mfga-calculator.mfga-calculator .mfga-charts-grid {\n        grid-template-columns: 1fr !important;\n    }\n\n    #mfga-calculator.mfga-calculator .mfga-form-row {\n        grid-template-columns: 1fr !important;\n    }\n\n    #mfga-calculator.mfga-calculator .mfga-panel-header {\n        flex-direction: column !important;\n        align-items: flex-start !important;\n    }\n}\n\n<\/style>\n<div id=\"mfga-calculator\" class=\"mfga-calculator\">\n        <div class=\"mfga-layout\">\n\n            <section class=\"mfga-input-panel mfga-card\" aria-label=\"Calculator inputs\">\n                <div class=\"mfga-panel-header\">\n                    <div class=\"mfga-unit-toggle\" role=\"group\" aria-label=\"Unit system\">\n                        <button type=\"button\" class=\"mfga-unit-btn mfga-active\" data-unit=\"metric\">Metric<\/button>\n                        <button type=\"button\" class=\"mfga-unit-btn\" data-unit=\"imperial\">Imperial<\/button>\n                    <\/div>\n                <\/div>\n\n                <form id=\"mfga-calcForm\" novalidate>\n                    <fieldset class=\"mfga-input-section\">\n                        <legend>Assessment Mode<\/legend>\n                        <div class=\"mfga-form-row\">\n                            <div class=\"mfga-form-group mfga-span-full\">\n                                <label for=\"mfga-assessmentMode\">Calculation Mode<\/label>\n                                <select id=\"mfga-assessmentMode\" name=\"assessmentMode\">\n                                    <option value=\"general\" selected>General Stamping Formability<\/option>\n                                    <option value=\"bending\">Bending Formability Assessment<\/option>\n                                    <option value=\"drawing\">Deep Drawing Formability Assessment<\/option>\n                                    <option value=\"stretch\">Stretch Formability Assessment<\/option>\n                                    <option value=\"fld\">FLD-Based Assessment<\/option>\n                                    <option value=\"comparison\">Material Comparison<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mfga-input-section mfga-single-mode\" data-hide-mode=\"comparison\">\n                        <legend>Material Identification<\/legend>\n                        <div class=\"mfga-form-row\">\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-materialPreset\">Material Preset<\/label>\n                                <select id=\"mfga-materialPreset\" name=\"materialPreset\"><\/select>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-materialType\">Material Type<\/label>\n                                <select id=\"mfga-materialType\" name=\"materialType\">\n                                    <option value=\"deepDrawingSteel\">Deep Drawing Steel<\/option>\n                                    <option value=\"mildSteel\">Mild Steel<\/option>\n                                    <option value=\"hsla\">HSLA<\/option>\n                                    <option value=\"ahss\">AHSS \/ Dual Phase<\/option>\n                                    <option value=\"stainless\">Stainless Steel<\/option>\n                                    <option value=\"al5xxx\">Aluminum 5xxx<\/option>\n                                    <option value=\"al6xxx\">Aluminum 6xxx<\/option>\n                                    <option value=\"copper\">Copper Alloy<\/option>\n                                    <option value=\"titanium\">Titanium<\/option>\n                                    <option value=\"custom\">Custom<\/option>\n                                <\/select>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-materialGrade\">Material Grade<\/label>\n                                <input type=\"text\" id=\"mfga-materialGrade\" name=\"materialGrade\" value=\"DD11 \/ DC04 Class\">\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mfga-input-section mfga-single-mode\" data-hide-mode=\"comparison\">\n                        <legend>Mechanical Properties<\/legend>\n                        <div class=\"mfga-form-row\">\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-thickness\">\n                                    Sheet Thickness\n                                    <span class=\"mfga-tooltip\" data-tip=\"Nominal sheet thickness \u2014 affects bendability and local formability\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-thickness\" name=\"thickness\" value=\"1.0\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mfga-unit-label\" data-thickness-unit>mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-yieldStrength\">\n                                    Yield Strength (Sy)\n                                    <span class=\"mfga-tooltip\" data-tip=\"0.2% offset yield strength from tensile test\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-yieldStrength\" name=\"yieldStrength\" value=\"180\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mfga-unit-label\" data-stress-unit>MPa<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-tensileStrength\">\n                                    Ultimate Tensile Strength (Sut)\n                                    <span class=\"mfga-tooltip\" data-tip=\"Maximum engineering stress from tensile test\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-tensileStrength\" name=\"tensileStrength\" value=\"320\" min=\"0.001\" step=\"any\">\n                                    <span class=\"mfga-unit-label\" data-stress-unit>MPa<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-elongation\">\n                                    Total Elongation (A)\n                                    <span class=\"mfga-tooltip\" data-tip=\"Elongation at fracture \u2014 primary ductility indicator (%)\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-elongation\" name=\"elongation\" value=\"38\" min=\"0\" max=\"100\" step=\"any\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group mfga-mode-field\" data-mode=\"stretch general bending drawing\">\n                                <label for=\"mfga-uniformElongation\">\n                                    Uniform Elongation\n                                    <span class=\"mfga-tooltip\" data-tip=\"Elongation at maximum load \u2014 preferred for stretch formability when available\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-uniformElongation\" name=\"uniformElongation\" value=\"22\" min=\"0\" max=\"100\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-nValue\">\n                                    Strain Hardening Exponent (n)\n                                    <span class=\"mfga-tooltip\" data-tip=\"Hollomon n-value \u2014 higher n improves strain distribution during stretching\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"mfga-nValue\" name=\"nValue\" value=\"0.22\" min=\"0.001\" step=\"any\">\n                            <\/div>\n                            <div class=\"mfga-form-group mfga-mode-field\" data-mode=\"general drawing stretch comparison\">\n                                <label for=\"mfga-r0\">r\u2080<\/label>\n                                <input type=\"number\" id=\"mfga-r0\" name=\"r0\" value=\"1.8\" min=\"0.001\" step=\"any\" placeholder=\"Optional\">\n                            <\/div>\n                            <div class=\"mfga-form-group mfga-mode-field\" data-mode=\"general drawing stretch comparison\">\n                                <label for=\"mfga-r45\">r\u2084\u2085<\/label>\n                                <input type=\"number\" id=\"mfga-r45\" name=\"r45\" value=\"1.5\" min=\"0.001\" step=\"any\" placeholder=\"Optional\">\n                            <\/div>\n                            <div class=\"mfga-form-group mfga-mode-field\" data-mode=\"general drawing stretch comparison\">\n                                <label for=\"mfga-r90\">r\u2089\u2080<\/label>\n                                <input type=\"number\" id=\"mfga-r90\" name=\"r90\" value=\"2.0\" min=\"0.001\" step=\"any\" placeholder=\"Optional\">\n                            <\/div>\n                            <div class=\"mfga-form-group mfga-mode-field\" data-mode=\"general drawing stretch comparison\">\n                                <label for=\"mfga-rBarDirect\">\n                                    Average r\u0304 (direct)\n                                    <span class=\"mfga-tooltip\" data-tip=\"Optional direct input \u2014 overrides r\u2080\/r\u2084\u2085\/r\u2089\u2080 if provided\">?<\/span>\n                                <\/label>\n                                <input type=\"number\" id=\"mfga-rBarDirect\" name=\"rBarDirect\" min=\"0.001\" step=\"any\" placeholder=\"Optional\">\n                            <\/div>\n                            <div class=\"mfga-form-group mfga-mode-field\" data-mode=\"general bending\">\n                                <label for=\"mfga-reductionArea\">Reduction of Area (RA)<\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-reductionArea\" name=\"reductionArea\" value=\"55\" min=\"0\" max=\"100\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mfga-input-section mfga-single-mode mfga-mode-field\" data-mode=\"general bending drawing stretch\">\n                        <legend>Bendability<\/legend>\n                        <div class=\"mfga-form-row\">\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-minBendRadius\">\n                                    Minimum Inside Bend Radius\n                                    <span class=\"mfga-tooltip\" data-tip=\"Supplier or test minimum inside bend radius \u2014 R\/t ratio indicates bendability\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-minBendRadius\" name=\"minBendRadius\" value=\"0.8\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\" data-length-unit>mm<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-actualBendRadius\">\n                                    Actual Bend Radius (design)\n                                    <span class=\"mfga-tooltip\" data-tip=\"Planned inside bend radius for safety margin check\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-actualBendRadius\" name=\"actualBendRadius\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\" data-length-unit>mm<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mfga-input-section mfga-single-mode mfga-mode-field\" data-mode=\"general stretch fld\">\n                        <legend>Forming Limit Data (Optional)<\/legend>\n                        <div class=\"mfga-form-row\">\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-fld0\">\n                                    FLD\u2080\n                                    <span class=\"mfga-tooltip\" data-tip=\"Major strain at plane strain (minor strain = 0) on forming limit curve\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-fld0\" name=\"fld0\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-majorStrainActual\">Actual Major Strain (\u03b5\u2081)<\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-majorStrainActual\" name=\"majorStrainActual\" min=\"0\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-minorStrainActual\">Actual Minor Strain (\u03b5\u2082)<\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-minorStrainActual\" name=\"minorStrainActual\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-majorStrainLimit\">\n                                    Major Strain Limit at Current \u03b5\u2082\n                                    <span class=\"mfga-tooltip\" data-tip=\"FLC major strain limit at the actual minor strain state\">?<\/span>\n                                <\/label>\n                                <div class=\"mfga-input-with-unit\">\n                                    <input type=\"number\" id=\"mfga-majorStrainLimit\" name=\"majorStrainLimit\" min=\"0.001\" step=\"any\" placeholder=\"Optional\">\n                                    <span class=\"mfga-unit-label\">%<\/span>\n                                <\/div>\n                            <\/div>\n                        <\/div>\n                    <\/fieldset>\n\n                    <fieldset class=\"mfga-input-section mfga-comparison-mode\" hidden>\n                        <legend>Material Comparison (2\u20136 Materials)<\/legend>\n                        <div class=\"mfga-form-row\">\n                            <div class=\"mfga-form-group\">\n                                <label for=\"mfga-comparisonCount\">Number of Materials<\/label>\n                                <select id=\"mfga-comparisonCount\">\n                                    <option value=\"2\">2<\/option>\n                                    <option value=\"3\" selected>3<\/option>\n                                    <option value=\"4\">4<\/option>\n                                    <option value=\"5\">5<\/option>\n                                    <option value=\"6\">6<\/option>\n                                <\/select>\n                            <\/div>\n                        <\/div>\n                        <div id=\"mfga-comparisonContainer\" class=\"mfga-comparison-container\"><\/div>\n                    <\/fieldset>\n\n                    <details class=\"mfga-advanced-section\">\n                        <summary>Scoring References &amp; Weighting Factors<\/summary>\n                        <fieldset class=\"mfga-input-section\">\n                            <legend>Reference Values<\/legend>\n                            <div class=\"mfga-form-row mfga-ref-row\">\n                                <div class=\"mfga-form-group\"><label for=\"mfga-aref\">Aref (Elongation %)<\/label><input type=\"number\" id=\"mfga-aref\" value=\"40\" min=\"0.001\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-nref\">nref<\/label><input type=\"number\" id=\"mfga-nref\" value=\"0.25\" min=\"0.001\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-rref\">rref<\/label><input type=\"number\" id=\"mfga-rref\" value=\"1.8\" min=\"0.001\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-raref\">RAref (%)<\/label><input type=\"number\" id=\"mfga-raref\" value=\"60\" min=\"0.001\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-cb\">Cb (Bend coeff.)<\/label><input type=\"number\" id=\"mfga-cb\" value=\"0.5\" min=\"0.001\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-cr\">Cr (\u0394r penalty)<\/label><input type=\"number\" id=\"mfga-cr\" value=\"5\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-ytMin\">Y\/T Min (best)<\/label><input type=\"number\" id=\"mfga-ytMin\" value=\"0.45\" min=\"0.01\" max=\"0.99\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-ytMax\">Y\/T Max (worst)<\/label><input type=\"number\" id=\"mfga-ytMax\" value=\"0.85\" min=\"0.01\" max=\"0.99\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-ct\">Ct (Thickness factor)<\/label><input type=\"number\" id=\"mfga-ct\" value=\"1.0\" min=\"0.1\" max=\"2\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-cStrength\">Cstrength (penalty)<\/label><input type=\"number\" id=\"mfga-cStrength\" value=\"0.15\" min=\"0\" max=\"1\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-syHigh\">Sy High Threshold (MPa)<\/label><input type=\"number\" id=\"mfga-syHigh\" value=\"550\" min=\"0\" step=\"any\"><\/div>\n                            <\/div>\n                        <\/fieldset>\n                        <fieldset class=\"mfga-input-section\">\n                            <legend>Weighting Factors (\u03a3W = 1.0, auto-normalized)<\/legend>\n                            <div class=\"mfga-form-row mfga-weight-row\">\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wElong\">W\u2081 Elongation<\/label><input type=\"number\" id=\"mfga-wElong\" value=\"0.20\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wN\">W\u2082 n-Value<\/label><input type=\"number\" id=\"mfga-wN\" value=\"0.15\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wR\">W\u2083 r-Value<\/label><input type=\"number\" id=\"mfga-wR\" value=\"0.15\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wYT\">W\u2084 Y\/T Ratio<\/label><input type=\"number\" id=\"mfga-wYT\" value=\"0.10\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wBend\">W\u2085 Bendability<\/label><input type=\"number\" id=\"mfga-wBend\" value=\"0.15\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wFLD\">W\u2086 FLD<\/label><input type=\"number\" id=\"mfga-wFLD\" value=\"0.10\" min=\"0\" step=\"any\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-wArea\">W\u2087 Reduction Area<\/label><input type=\"number\" id=\"mfga-wArea\" value=\"0.15\" min=\"0\" step=\"any\"><\/div>\n                            <\/div>\n                            <button type=\"button\" id=\"mfga-resetWeights\" class=\"mfga-btn-secondary\">Reset Weights to Mode Default<\/button>\n                        <\/fieldset>\n                        <fieldset class=\"mfga-input-section\">\n                            <legend>Grade Thresholds<\/legend>\n                            <div class=\"mfga-form-row mfga-grade-row\">\n                                <div class=\"mfga-form-group\"><label for=\"mfga-gradeExcellent\">Excellent \u2265<\/label><input type=\"number\" id=\"mfga-gradeExcellent\" value=\"90\" min=\"0\" max=\"100\" step=\"1\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-gradeVeryGood\">Very Good \u2265<\/label><input type=\"number\" id=\"mfga-gradeVeryGood\" value=\"80\" min=\"0\" max=\"100\" step=\"1\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-gradeGood\">Good \u2265<\/label><input type=\"number\" id=\"mfga-gradeGood\" value=\"70\" min=\"0\" max=\"100\" step=\"1\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-gradeModerate\">Moderate \u2265<\/label><input type=\"number\" id=\"mfga-gradeModerate\" value=\"60\" min=\"0\" max=\"100\" step=\"1\"><\/div>\n                                <div class=\"mfga-form-group\"><label for=\"mfga-gradeLimited\">Limited \u2265<\/label><input type=\"number\" id=\"mfga-gradeLimited\" value=\"45\" min=\"0\" max=\"100\" step=\"1\"><\/div>\n                            <\/div>\n                        <\/fieldset>\n                    <\/details>\n\n                    <div class=\"mfga-actions\">\n                        <button type=\"submit\" class=\"mfga-btn-primary\">Calculate<\/button>\n                    <\/div>\n                <\/form>\n            <\/section>\n\n            <section id=\"mfga-resultsPanel\" class=\"mfga-results-panel mfga-card\" hidden aria-live=\"polite\">\n                <h2>Formability Assessment Results<\/h2>\n                <div id=\"mfga-errorBox\" class=\"mfga-error-box\" hidden role=\"alert\"><\/div>\n                <div id=\"mfga-warningBox\" class=\"mfga-warning-box\" hidden role=\"status\"><\/div>\n\n                <div class=\"mfga-results-grid\">\n                    <div class=\"mfga-score-card\">\n                        <div class=\"mfga-gauge-wrap\" id=\"mfga-gaugeWrap\"><\/div>\n                        <div class=\"mfga-score-meta\">\n                            <p class=\"mfga-overall-score\"><span id=\"mfga-overallScore\">\u2014<\/span><small>\/ 100<\/small><\/p>\n                            <p id=\"mfga-formabilityGrade\" class=\"mfga-grade-badge\">\u2014<\/p>\n                            <p id=\"mfga-confidence\" class=\"mfga-confidence\">\u2014<\/p>\n                        <\/div>\n                    <\/div>\n                    <div class=\"mfga-subscores\" id=\"mfga-subscores\"><\/div>\n                <\/div>\n\n                <div class=\"mfga-process-scores\" id=\"mfga-processScores\"><\/div>\n\n                <div class=\"mfga-charts-grid\" id=\"mfga-chartsGrid\" hidden>\n                    <div class=\"mfga-chart-card mfga-comparison-chart\" hidden>\n                        <h3>Material Comparison<\/h3>\n                        <div id=\"mfga-comparisonChart\" class=\"mfga-chart-area\"><\/div>\n                    <\/div>\n                <\/div>\n\n                <div id=\"mfga-comparisonTableWrap\" class=\"mfga-comparison-table-wrap\" hidden>\n                    <h3>Comparison Ranking<\/h3>\n                    <div class=\"mfga-table-scroll\">\n                        <table id=\"mfga-comparisonTable\" class=\"mfga-data-table\">\n                            <thead>\n                                <tr>\n                                    <th>Rank<\/th>\n                                    <th>Material<\/th>\n                                    <th>Score<\/th>\n                                    <th>Grade<\/th>\n                                    <th>Elong.<\/th>\n                                    <th>n<\/th>\n                                    <th>r<\/th>\n                                    <th>Bend<\/th>\n                                    <th>FLD<\/th>\n                                    <th>Confidence<\/th>\n                                    <th>Main Limitation<\/th>\n                                <\/tr>\n                            <\/thead>\n                            <tbody><\/tbody>\n                        <\/table>\n                    <\/div>\n                <\/div>\n            <\/section>\n\n        <\/div>\n    <\/div>\n<script>\n(function(){\n  var r=document.getElementById('mfga-calculator');\n  if(!r||r.dataset.mfgaLoaderDone==='1'){return;}\n  r.dataset.mfgaLoaderDone='1';\n  try{\n    var p=[\"LyoqDQogKiBNYXRlcmlhbCBGb3JtYWJpbGl0eSBHcmFkZSBBc3Nlc3NtZW50IENhbGN1bGF0b3INCiAqIFNjb3BlZCBmb3IgV29yZFByZXNzIGVtYmVkIOKAlCBkb2VzIG5vdCBhZmZlY3QgZWxlbWVudHMgb3V0c2lkZSAjbWZnYS1jYWxjdWxhdG9yDQogKi8NCg0KKGZ1bmN0aW9uICgpIHsNCiAgICAndXNlIHN0cmljdCc7DQoNCiAgICBjb25zdCByb290ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21mZ2EtY2FsY3VsYXRvcicpOw0KICAgIGlmICghcm9vdCB8fCByb290LmRhdGFzZXQubWZnYVJlYWR5ID09PSAnMScpIHJldHVybjsNCiAgICByb290LmRhdGFzZXQubWZnYVJlYWR5ID0gJzEnOw0KDQogICAgZnVuY3Rpb24gJChpZCkgew0KICAgICAgICByZXR1cm4gcm9vdC5xdWVyeVNlbGVjdG9yKCcjbWZnYS0nICsgaWQpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uICRhbGwoc2VsKSB7DQogICAgICAgIHJldHVybiByb290LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsKTsNCiAgICB9DQoNCiAgICBjb25zdCBNT0RFX1dFSUdIVFMgPSB7DQogICAgICAgIGdlbmVyYWw6ICB7IGVsb25nOiAwLjIwLCBuOiAwLjE1LCByOiAwLjE1LCB5dDogMC4xMCwgYmVuZDogMC4xNSwgZmxkOiAwLjEwLCBhcmVhOiAwLjE1IH0sDQogICAgICAgIGJlbmRpbmc6ICB7IGVsb25nOiAwLjI1LCBuOiAwLjEwLCByOiAwLjA1LCB5dDogMC4xNSwgYmVuZDogMC4zMCwgZmxkOiAwLjAwLCBhcmVhOiAwLjE1IH0sDQogICAgICAgIGRyYXdpbmc6ICB7IGVsb25nOiAwLjIwLCBuOiAwLjIwLCByOiAwLjMwLCB5dDogMC4xMCwgYmVuZDogMC4xMCwgZmxkOiAwLjAwLCBhcmVhOiAwLjEwIH0sDQogICAgICAgIHN0cmV0Y2g6ICB7IGVsb25nOiAwLjI1LCBuOiAwLjMwLCByOiAwLjA1LCB5dDogMC4wNSwgYmVuZDogMC4wNSwgZmxkOiAwLjIwLCBhcmVhOiAwLjEwIH0sDQogICAgICAgIGZsZDogICAgICB7IGVsb25nOiAwLjEwLCBuOiAwLjE1LCByOiAwLjA1LCB5dDogMC4wNSwgYmVuZDogMC4wNSwgZmxkOiAwLjUwLCBhcmVhOiAwLjEwIH0sDQogICAgICAgIGNvbXBhcmlzb246IHsgZWxvbmc6IDAuMjAsIG46IDAuMTUsIHI6IDAuMTUsIHl0OiAwLjEwLCBiZW5kOiAwLjE1LCBmbGQ6IDAuMTAsIGFyZWE6IDAuMTUgfQ0KICAgIH07DQoNCiAgICBjb25zdCBQUkVTRVRTID0gew0KICAgICAgICBkZWVwRHJhd2luZ1N0ZWVsOiB7DQogICAgICAgICAgICBuYW1lOiAnRGVlcCBEcmF3aW5nIFN0ZWVsJywNCiAgICAgICAgICAgIHR5cGU6ICdkZWVwRHJhd2luZ1N0ZWVsJywNCiAgICAgICAgICAgIGdyYWRlOiAnREQxMSAvIERDMDQgQ2xhc3MnLA0KICAgICAgICAgICAgU3k6IDE4MCwgU3V0OiAzMjAsIGVsb25nOiAzOCwgdW5pZm9ybUVsb25nOiAyMiwgbjogMC4yMiwNCiAgICAgICAgICAgIHIwOiAxLjgsIHI0NTogMS41LCByOTA6IDIuMCwgcmE6IDU1LCBtaW5CZW5kOiAwLjgsIHRoaWNrbmVzczogMS4wDQogICAgICAgIH0sDQogICAgICAgIGxvd0NhcmJvblN0ZWVsOiB7DQogICAgICAgICAgICBuYW1lOiAnTG93IENhcmJvbiBTdGVlbCcsDQogICAgICAgICAgICB0eXBlOiAnbWlsZFN0ZWVsJywNCiAgICAgICAgICAgIGdyYWRlOiAnUzIzNSAvIEEzNiBDbGFzcycsDQogICAgICAgICAgICBTeTogMjM1LCBTdXQ6IDQwMCwgZWxvbmc6IDI2LCB1bmlmb3JtRWxvbmc6IDE0LCBuOiAwLjE4LA0KICAgICAgICAgICAgcjA6IDEuMiwgcjQ1OiAxLjAsIHI5MDogMS4zLCByYTogNDgsIG1pbkJlbmQ6IDEuMiwgdGhpY2tuZXNzOiAxLjANCiAgICAgICAgfSwNCiAgICAgICAgaHNsYVN0ZWVsOiB7DQogICAgICAgICAgICBuYW1lOiAnSFNMQSBTdGVlbCcsDQogICAgICAgICAgICB0eXBlOiAnaHNsYScsDQogICAgICAgICAgICBncmFkZTogJ1MzNTVNQyBDbGFzcycsDQogICAgICAgICAgICBTeTogMzU1LCBTdXQ6IDQzMCwgZWxvbmc6IDIyLCB1bmlmb3JtRWxvbmc6IDEyLCBuOiAwLjE0LA0KICAgICAgICAgICAgcjA6IDEuMCwgcjQ1OiAwLjksIHI5MDogMS4xLCByYTogNDIsIG1pbkJlbmQ6IDIuMCwgdGhpY2tuZXNzOiAxLjUNCiAgICAgICAgfSwNCiAgICAgICAgZHVhbFBoYXNlOiB7DQogICAgICAgICAgICBuYW1lOiAnRHVhbCBQaGFzZSBTdGVlbCcsDQogICAgICAgICAgICB0eXBlOiAnYWhzcycsDQogICAgICAgICAgICBncmFkZTogJ0RQNjAwIENsYXNzJywNCiAgICAgICAgICAgIFN5OiA0MjAsIFN1dDogNjgwLCBlbG9uZzogMTgsIHVuaWZvcm1FbG9uZzogOCwgbjogMC4xMiwNCiAgICAgICAgICAgIHIwOiAwLjksIHI0NTogMC44NSwgcjkwOiAwLjk1LCByYTogMzgsIG1pbkJlbmQ6IDIuNSwgdGhpY2tuZXNzOiAxLjINCiAgICAgICAgfSwNCiAgICAgICAgc3RhaW5sZXNzU3RlZWw6IHsNCiAgICAgICAgICAgIG5hbWU6ICdTdGFpbmxlc3MgU3RlZWwnLA0KICAgICAgICAgICAgdHlwZTogJ3N0YWlubGVzcycsDQogICAgICAgICAgICBncmFkZTogJzMwNCAyQicsDQogICAgICAgICAgICBTeTogMjEwLCBTdXQ6IDUyMCwgZWxvbmc6IDQ1LCB1bmlmb3JtRWxvbmc6IDI4LCBuOiAwLjI4LA0KICAgICAgICAgICAgcjA6IDEuMSwgcjQ1OiAxLjAsIHI5MDogMS4yLCByYTogNTgsIG1pbkJlbmQ6IDEuMCwgdGhpY2tuZXNzOiAxLjANCiAgICAgICAgfSwNCiAgICAgICAgYWx1bWludW01eHh4OiB7DQogICAgICAgICAgICBuYW1lOiAnQWx1bWludW0gNXh4eCcsDQogICAgICAgICAgICB0eXBlOiAnYWw1eHh4JywNCiAgICAgICAgICAgIGdyYWRlOiAnNTE4Mi1PJywNCiAgICAgICAgICAgIFN5OiAxMjUsIFN1dDogMjY1LCBlbG9uZzogMjYsIHVuaWZvcm1FbG9uZzogMTgsIG46IDAuMjQsDQogICAgICAgICAgICByMDogMC43LCByNDU6IDAuNjUsIHI5MDogMC43NSwgcmE6IDUwLCBtaW5CZW5kOiAwLjUsIHRoaWNrbmVzczogMS4wDQogICAgICAgIH0sDQogICAgICAgIGFsdW1pbnVtNnh4eDogew0KICAgICAgICAgICAgbmFtZTogJ0FsdW1pbnVtIDZ4eHgnLA0KICAgICAgICAgICAgdHlwZTogJ2FsNnh4eCcsDQogICAgICAgICAgICBncmFkZTogJzYwNjEtVDQnLA0KICAgICAgICAgICAgU3k6IDE0NSwgU3V0OiAyNDAsIGVsb25nOiAyMiwgdW5pZm9ybUVsb25nOiAxNCwgbjogMC4yMCwNCiAgICAgICAgICAgIHIwOiAwLjYsIHI0NTogMC41NSwgcjkwOiAwLjY1LCByYTogNDUsIG1pbkJlbmQ6IDEuMCwgdGhpY2tuZXNzOiAxLjANCiAgICAgICAgfSwNCiAgICAgICAgY29wcGVyQWxsb3k6IHsNCiAgICAgICAgICAgIG5hbWU6ICdDb3BwZXIgQWxsb3knLA0KICAgICAgICAgICAgdHlwZTogJ2NvcHBlcicsDQogICAgICAgICAgICBncmFkZTogJ0MxMTAwMCcsDQogICAgICAgICAgICBTeTogMTIwLCBTdXQ6IDIyMCwgZWxvbmc6IDM1LCB1bmlmb3JtRWxvbmc6IDIwLCBuOiAwLjMwLA0KICAgICAgICAgICAgcjA6IDAuOCwgcjQ1OiAwLjc1LCByOTA6IDAuODUsIHJhOiA1MiwgbWluQmVuZDogMC40LCB0aGlja25lc3M6IDAuOA0KICAgICAgICB9LA0KICAgICAgICBjdXN0b206IHsNCiAgICAgICAgICAgIG5hbWU6ICdDdXN0b20gTWF0ZXJpYWwnLA0KICAgICAgICAgICAgdHlwZTogJ2N1c3RvbScsDQogICAgICAgICAgICBncmFkZTogJ1VzZXIgRGVmaW5lZCcsDQogICAgICAgICAgICBTeTogMjAwLCBTdXQ6IDM1MCwgZWxvbmc6IDMwLCB1bmlmb3JtRWxvbmc6IDE2LCBuOiAwLjIwLA0KICAgICAgICAgICAgcjA6IDEuNSwgcjQ1OiAxLjMsIHI5MDogMS42LCByYTogNTAsIG1pbkJlbmQ6IDEuMCwgdGhpY2tuZXNzOiAxLjANCiAgICAgICAgfQ0KICAgIH07DQoNCiAgICBjb25zdCBNRVRSSUNfTEFCRUxTID0geyB0aGlja25lc3M6ICdtbScsIGxlbmd0aDogJ21tJywgc3RyZXNzOiAnTVBhJyB9Ow0KICAgIGNvbnN0IElNUEVSSUFMX0xBQkVMUyA9IHsgdGhpY2tuZXNzOiAnaW4nLCBsZW5ndGg6ICdpbicsIHN0cmVzczogJ2tzaScgfTsNCg0KICAgIGxldCB1bml0U3lzdGVtID0gJ21ldHJpYyc7DQogICAgbGV0IGNvbXBhcmlzb25Db3VudCA9IDM7DQoNCiAgICBjb25zdCBmb3JtID0gJCgnY2FsY0Zvcm0nKTsNCiAgICBjb25zdCBhc3Nlc3NtZW50TW9kZSA9ICQoJ2Fzc2Vzc21lbnRNb2RlJyk7DQogICAgY29uc3QgbWF0ZXJpYWxQcmVzZXQgPSAkKCdtYXRlcmlhbFByZXNldCcpOw0KICAgIGNvbnN0IHJlc3VsdHNQYW5lbCA9ICQoJ3Jlc3VsdHNQYW5lbCcpOw0KDQogICAgZnVuY3Rpb24gY2xhbXAodiwgbG8sIGhpKSB7DQogICAgICAgIHJldHVybiBNYXRoLm1heChsbywgTWF0aC5taW4oaGksIHYpKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBudW1WYWwoaWQpIHsNCiAgICAgICAgY29uc3QgZWwgPSAkKGlkKTsNCiAgICAgICAgaWYgKCFlbCkgcmV0dXJuIG51bGw7DQogICAgICAgIGNvbnN0IHYgPSBwYXJzZUZsb2F0KGVsLnZhbHVlKTsNCiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZSh2KSA\/IHYgOiBudWxsOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN0clZhbChpZCkgew0KICAgICAgICBjb25zdCBlbCA9ICQoaWQpOw0KICAgICAgICByZXR1\",\n    \"cm4gZWwgPyBlbC52YWx1ZS50cmltKCkgOiAnJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoYXNWYWwoaWQpIHsNCiAgICAgICAgY29uc3QgZWwgPSAkKGlkKTsNCiAgICAgICAgcmV0dXJuIGVsICYmIGVsLnZhbHVlLnRyaW0oKSAhPT0gJyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3RyZXNzVG9JbnRlcm5hbCh2KSB7DQogICAgICAgIGlmICh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnKSByZXR1cm4gdiAqIDYuODk0NzY7DQogICAgICAgIHJldHVybiB2Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN0cmVzc0Zyb21JbnRlcm5hbCh2KSB7DQogICAgICAgIGlmICh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnKSByZXR1cm4gdiAvIDYuODk0NzY7DQogICAgICAgIHJldHVybiB2Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGxlbmd0aFRvSW50ZXJuYWwodikgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJykgcmV0dXJuIHYgKiAyNS40Ow0KICAgICAgICByZXR1cm4gdjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBsZW5ndGhGcm9tSW50ZXJuYWwodikgew0KICAgICAgICBpZiAodW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJykgcmV0dXJuIHYgLyAyNS40Ow0KICAgICAgICByZXR1cm4gdjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBpbml0KCkgew0KICAgICAgICBwb3B1bGF0ZVByZXNldHMoKTsNCiAgICAgICAgYnVpbGRDb21wYXJpc29uTWF0ZXJpYWxzKCk7DQogICAgICAgIGJpbmRFdmVudHMoKTsNCiAgICAgICAgdXBkYXRlTW9kZVZpc2liaWxpdHkoKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgICAgICBhcHBseVByZXNldCgnZGVlcERyYXdpbmdTdGVlbCcpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHBvcHVsYXRlUHJlc2V0cygpIHsNCiAgICAgICAgbWF0ZXJpYWxQcmVzZXQuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIE9iamVjdC5rZXlzKFBSRVNFVFMpLmZvckVhY2goKGtleSkgPT4gew0KICAgICAgICAgICAgY29uc3Qgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnb3B0aW9uJyk7DQogICAgICAgICAgICBvcHQudmFsdWUgPSBrZXk7DQogICAgICAgICAgICBvcHQudGV4dENvbnRlbnQgPSBQUkVTRVRTW2tleV0ubmFtZTsNCiAgICAgICAgICAgIG1hdGVyaWFsUHJlc2V0LmFwcGVuZENoaWxkKG9wdCk7DQogICAgICAgIH0pOw0KICAgICAgICBtYXRlcmlhbFByZXNldC52YWx1ZSA9ICdkZWVwRHJhd2luZ1N0ZWVsJzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhcHBseVByZXNldChrZXkpIHsNCiAgICAgICAgY29uc3QgcCA9IFBSRVNFVFNba2V5XTsNCiAgICAgICAgaWYgKCFwKSByZXR1cm47DQogICAgICAgICQoJ21hdGVyaWFsVHlwZScpLnZhbHVlID0gcC50eXBlOw0KICAgICAgICAkKCdtYXRlcmlhbEdyYWRlJykudmFsdWUgPSBwLmdyYWRlOw0KICAgICAgICAkKCd0aGlja25lc3MnKS52YWx1ZSA9IGxlbmd0aEZyb21JbnRlcm5hbChwLnRoaWNrbmVzcykudG9GaXhlZCh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gNCA6IDIpOw0KICAgICAgICAkKCd5aWVsZFN0cmVuZ3RoJykudmFsdWUgPSBzdHJlc3NGcm9tSW50ZXJuYWwocC5TeSkudG9GaXhlZCh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gMSA6IDApOw0KICAgICAgICAkKCd0ZW5zaWxlU3RyZW5ndGgnKS52YWx1ZSA9IHN0cmVzc0Zyb21JbnRlcm5hbChwLlN1dCkudG9GaXhlZCh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gMSA6IDApOw0KICAgICAgICAkKCdlbG9uZ2F0aW9uJykudmFsdWUgPSBwLmVsb25nOw0KICAgICAgICAkKCd1bmlmb3JtRWxvbmdhdGlvbicpLnZhbHVlID0gcC51bmlmb3JtRWxvbmc7DQogICAgICAgICQoJ25WYWx1ZScpLnZhbHVlID0gcC5uOw0KICAgICAgICAkKCdyMCcpLnZhbHVlID0gcC5yMDsNCiAgICAgICAgJCgncjQ1JykudmFsdWUgPSBwLnI0NTsNCiAgICAgICAgJCgncjkwJykudmFsdWUgPSBwLnI5MDsNCiAgICAgICAgJCgnckJhckRpcmVjdCcpLnZhbHVlID0gJyc7DQogICAgICAgICQoJ3JlZHVjdGlvbkFyZWEnKS52YWx1ZSA9IHAucmE7DQogICAgICAgICQoJ21pbkJlbmRSYWRpdXMnKS52YWx1ZSA9IGxlbmd0aEZyb21JbnRlcm5hbChwLm1pbkJlbmQpLnRvRml4ZWQodW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/IDQgOiAyKTsNCiAgICAgICAgJCgnYWN0dWFsQmVuZFJhZGl1cycpLnZhbHVlID0gJyc7DQogICAgICAgICQoJ2ZsZDAnKS52YWx1ZSA9ICcnOw0KICAgICAgICAkKCdtYWpvclN0cmFpbkFjdHVhbCcpLnZhbHVlID0gJyc7DQogICAgICAgICQoJ21pbm9yU3RyYWluQWN0dWFsJykudmFsdWUgPSAnJzsNCiAgICAgICAgJCgnbWFqb3JTdHJhaW5MaW1pdCcpLnZhbHVlID0gJyc7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYnVpbGRDb21wYXJpc29uTWF0ZXJpYWxzKCkgew0KICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCdjb21wYXJpc29uQ29udGFpbmVyJyk7DQogICAgICAgIGNvbnRhaW5lci5pbm5lckhUTUwgPSAnJzsNCiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gNjsgaSsrKSB7DQogICAgICAgICAgICBjb25zdCBibG9jayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOw0KICAgICAgICAgICAgYmxvY2suY2xhc3NOYW1lID0gJ21mZ2EtY29tcGFyaXNvbi1ibG9jayc7DQogICAgICAgICAgICBibG9jay5kYXRhc2V0LmluZGV4ID0gaTsNCiAgICAgICAgICAgIGJsb2NrLmhpZGRlbiA9IGkgPiBjb21wYXJpc29uQ291bnQ7DQogICAgICAgICAgICBibG9jay5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICAgICAgPGg0Pk1hdGVyaWFsICR7aX08L2g0Pg0KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1mZ2EtZm9ybS1yb3ciPg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZmdhLWZvcm0tZ3JvdXAiPjxsYWJlbD5OYW1lPC9sYWJlbD48aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9Im1mZ2EtY21wLW5hbWUiIHZhbHVlPSJNYXRlcmlhbCAke2l9Ij48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWZnYS1mb3JtLWdyb3VwIj48bGFiZWw+UHJlc2V0PC9sYWJlbD48c2VsZWN0IGNsYXNzPSJtZmdhLWNtcC1wcmVzZXQiPiR7T2JqZWN0LmtleXMoUFJFU0VUUykubWFwKChrKSA9PiBgPG9wdGlvbiB2YWx1ZT0iJHtrfSI+JHtQUkVTRVRTW2tdLm5hbWV9PC9vcHRpb24+YCkuam9pbignJyl9PC9zZWxlY3Q+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1mZ2EtZm9ybS1ncm91cCI+PGxhYmVsPlN5PC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ibWZnYS1jbXAtc3kiIHZhbHVlPSIxODAiIG1pbj0iMC4wMDEiIHN0ZXA9ImFueSI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1mZ2EtZm9ybS1ncm91cCI+PGxhYmVsPlN1dDwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1mZ2EtY21wLXN1dCIgdmFsdWU9IjMyMCIgbWluPSIwLjAwMSIgc3RlcD0iYW55Ij48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWZnYS1mb3JtLWdyb3VwIj48bGFiZWw+RWxvbmdhdGlvbiAlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ibWZnYS1jbXAtZWxvbmciIHZhbHVlPSIzOCIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iYW55Ij48L2Rpdj4NCiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWZnYS1mb3JtLWdyb3VwIj48bGFiZWw+bi12YWx1ZTwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1mZ2EtY21wLW4iIHZhbHVlPSIwLjIyIiBtaW49IjAuMDAxIiBzdGVwPSJhbnkiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZmdhLWZvcm0tZ3JvdXAiPjxsYWJlbD5yzIQ8L2xhYmVsPjxpbnB1dCB0eXBlPSJudW1iZXIiIGNsYXNzPSJtZmdhLWNtcC1yYmFyIiB2YWx1ZT0iMS42NzUiIG1pbj0iMC4wMDEiIHN0ZXA9ImFueSI+PC9kaXY+DQogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1mZ2EtZm9ybS1ncm91cCI+PGxhYmVsPlRoaWNrbmVzczwvbGFiZWw+PGlucHV0IHR5cGU9Im51bWJlciIgY2xhc3M9Im1mZ2EtY21wLXRoaWNrIiB2YWx1ZT0iMS4wIiBtaW49IjAuMDAxIiBzdGVwPSJhbnkiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZmdhLWZvcm0tZ3JvdXAiPjxsYWJlbD5NaW4gQmVuZCBSPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ibWZnYS1jbXAtYmVuZCIgdmFsdWU9IjAuOCIgbWluPSIwIiBzdGVwPSJhbnkiPjwvZGl2Pg0KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtZmdhLWZvcm0tZ3JvdXAiPjxsYWJlbD5SQSAlPC9sYWJlbD48aW5wdXQgdHlwZT0ibnVtYmVyIiBjbGFzcz0ibWZnYS1jbXAtcmEiIHZhbHVlPSI1NSIgbWluPSIwIiBtYXg9IjEwMCIgc3RlcD0iYW55Ij48L2Rpdj4NCiAgICAgICAgICAgICAgICA8L2Rpdj5g\",\n    \"Ow0KICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGJsb2NrKTsNCiAgICAgICAgfQ0KICAgICAgICBhcHBseUNvbXBhcmlzb25QcmVzZXRzKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gYXBwbHlDb21wYXJpc29uUHJlc2V0cygpIHsNCiAgICAgICAgY29uc3QgcHJlc2V0cyA9IFsnZGVlcERyYXdpbmdTdGVlbCcsICdoc2xhU3RlZWwnLCAnYWx1bWludW01eHh4JywgJ3N0YWlubGVzc1N0ZWVsJywgJ2R1YWxQaGFzZScsICdjb3BwZXJBbGxveSddOw0KICAgICAgICAkYWxsKCcubWZnYS1jb21wYXJpc29uLWJsb2NrJykuZm9yRWFjaCgoYmxvY2ssIGlkeCkgPT4gew0KICAgICAgICAgICAgY29uc3QgcHJlc2V0S2V5ID0gcHJlc2V0c1tpZHhdIHx8ICdjdXN0b20nOw0KICAgICAgICAgICAgY29uc3Qgc2VsID0gYmxvY2sucXVlcnlTZWxlY3RvcignLm1mZ2EtY21wLXByZXNldCcpOw0KICAgICAgICAgICAgaWYgKHNlbCkgc2VsLnZhbHVlID0gcHJlc2V0S2V5Ow0KICAgICAgICAgICAgZmlsbENvbXBhcmlzb25CbG9jayhibG9jaywgcHJlc2V0S2V5KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZmlsbENvbXBhcmlzb25CbG9jayhibG9jaywga2V5KSB7DQogICAgICAgIGNvbnN0IHAgPSBQUkVTRVRTW2tleV07DQogICAgICAgIGlmICghcCkgcmV0dXJuOw0KICAgICAgICBibG9jay5xdWVyeVNlbGVjdG9yKCcubWZnYS1jbXAtbmFtZScpLnZhbHVlID0gcC5uYW1lOw0KICAgICAgICBibG9jay5xdWVyeVNlbGVjdG9yKCcubWZnYS1jbXAtc3knKS52YWx1ZSA9IHN0cmVzc0Zyb21JbnRlcm5hbChwLlN5KS50b0ZpeGVkKHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyAxIDogMCk7DQogICAgICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1zdXQnKS52YWx1ZSA9IHN0cmVzc0Zyb21JbnRlcm5hbChwLlN1dCkudG9GaXhlZCh1bml0U3lzdGVtID09PSAnaW1wZXJpYWwnID8gMSA6IDApOw0KICAgICAgICBibG9jay5xdWVyeVNlbGVjdG9yKCcubWZnYS1jbXAtZWxvbmcnKS52YWx1ZSA9IHAuZWxvbmc7DQogICAgICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1uJykudmFsdWUgPSBwLm47DQogICAgICAgIGNvbnN0IHJCYXIgPSAocC5yMCArIDIgKiBwLnI0NSArIHAucjkwKSAvIDQ7DQogICAgICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1yYmFyJykudmFsdWUgPSByQmFyLnRvRml4ZWQoMyk7DQogICAgICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC10aGljaycpLnZhbHVlID0gbGVuZ3RoRnJvbUludGVybmFsKHAudGhpY2tuZXNzKS50b0ZpeGVkKHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyA0IDogMik7DQogICAgICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1iZW5kJykudmFsdWUgPSBsZW5ndGhGcm9tSW50ZXJuYWwocC5taW5CZW5kKS50b0ZpeGVkKHVuaXRTeXN0ZW0gPT09ICdpbXBlcmlhbCcgPyA0IDogMik7DQogICAgICAgIGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1yYScpLnZhbHVlID0gcC5yYTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBiaW5kRXZlbnRzKCkgew0KICAgICAgICBmb3JtLmFkZEV2ZW50TGlzdGVuZXIoJ3N1Ym1pdCcsIChlKSA9PiB7DQogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7DQogICAgICAgICAgICBjYWxjdWxhdGUoKTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJGFsbCgnLm1mZ2EtdW5pdC1idG4nKS5mb3JFYWNoKChidG4pID0+IHsNCiAgICAgICAgICAgIGJ0bi5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHN3aXRjaFVuaXRTeXN0ZW0oYnRuLmRhdGFzZXQudW5pdCkpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBhc3Nlc3NtZW50TW9kZS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiB7DQogICAgICAgICAgICB1cGRhdGVNb2RlVmlzaWJpbGl0eSgpOw0KICAgICAgICAgICAgYXBwbHlNb2RlV2VpZ2h0cygpOw0KICAgICAgICB9KTsNCg0KICAgICAgICBtYXRlcmlhbFByZXNldC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCAoKSA9PiBhcHBseVByZXNldChtYXRlcmlhbFByZXNldC52YWx1ZSkpOw0KDQogICAgICAgICQoJ3Jlc2V0V2VpZ2h0cycpLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgYXBwbHlNb2RlV2VpZ2h0cyk7DQoNCiAgICAgICAgJCgnY29tcGFyaXNvbkNvdW50JykuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywgKCkgPT4gew0KICAgICAgICAgICAgY29tcGFyaXNvbkNvdW50ID0gcGFyc2VJbnQoJCgnY29tcGFyaXNvbkNvdW50JykudmFsdWUsIDEwKTsNCiAgICAgICAgICAgICRhbGwoJy5tZmdhLWNvbXBhcmlzb24tYmxvY2snKS5mb3JFYWNoKChibG9jaykgPT4gew0KICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHBhcnNlSW50KGJsb2NrLmRhdGFzZXQuaW5kZXgsIDEwKTsNCiAgICAgICAgICAgICAgICBibG9jay5oaWRkZW4gPSBpZHggPiBjb21wYXJpc29uQ291bnQ7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgJCgnY29tcGFyaXNvbkNvbnRhaW5lcicpLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7DQogICAgICAgICAgICBpZiAoZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKCdtZmdhLWNtcC1wcmVzZXQnKSkgew0KICAgICAgICAgICAgICAgIGZpbGxDb21wYXJpc29uQmxvY2soZS50YXJnZXQuY2xvc2VzdCgnLm1mZ2EtY29tcGFyaXNvbi1ibG9jaycpLCBlLnRhcmdldC52YWx1ZSk7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHN3aXRjaFVuaXRTeXN0ZW0oc3lzdGVtKSB7DQogICAgICAgIGlmIChzeXN0ZW0gPT09IHVuaXRTeXN0ZW0pIHJldHVybjsNCiAgICAgICAgY29uc3QgZmllbGRzID0gWw0KICAgICAgICAgICAgWyd0aGlja25lc3MnLCBsZW5ndGhUb0ludGVybmFsLCBsZW5ndGhGcm9tSW50ZXJuYWxdLA0KICAgICAgICAgICAgWydtaW5CZW5kUmFkaXVzJywgbGVuZ3RoVG9JbnRlcm5hbCwgbGVuZ3RoRnJvbUludGVybmFsXSwNCiAgICAgICAgICAgIFsnYWN0dWFsQmVuZFJhZGl1cycsIGxlbmd0aFRvSW50ZXJuYWwsIGxlbmd0aEZyb21JbnRlcm5hbF0sDQogICAgICAgICAgICBbJ3lpZWxkU3RyZW5ndGgnLCBzdHJlc3NUb0ludGVybmFsLCBzdHJlc3NGcm9tSW50ZXJuYWxdLA0KICAgICAgICAgICAgWyd0ZW5zaWxlU3RyZW5ndGgnLCBzdHJlc3NUb0ludGVybmFsLCBzdHJlc3NGcm9tSW50ZXJuYWxdDQogICAgICAgIF07DQogICAgICAgIGZpZWxkcy5mb3JFYWNoKChbaWQsIHRvSW50LCBmcm9tSW50XSkgPT4gew0KICAgICAgICAgICAgY29uc3QgdiA9IG51bVZhbChpZCk7DQogICAgICAgICAgICBpZiAodiAhPT0gbnVsbCAmJiBoYXNWYWwoaWQpKSAkKGlkKS52YWx1ZSA9IGZyb21JbnQodG9JbnQodikpLnRvRml4ZWQoc3lzdGVtID09PSAnaW1wZXJpYWwnID8gKGlkLmluY2x1ZGVzKCdTdHJlbmd0aCcpID8gMSA6IDQpIDogKGlkLmluY2x1ZGVzKCdTdHJlbmd0aCcpID8gMCA6IDIpKTsNCiAgICAgICAgfSk7DQogICAgICAgICRhbGwoJy5tZmdhLWNtcC10aGljaywgLm1mZ2EtY21wLWJlbmQsIC5tZmdhLWNtcC1zeSwgLm1mZ2EtY21wLXN1dCcpLmZvckVhY2goKGVsKSA9PiB7DQogICAgICAgICAgICBjb25zdCB2ID0gcGFyc2VGbG9hdChlbC52YWx1ZSk7DQogICAgICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZSh2KSkgcmV0dXJuOw0KICAgICAgICAgICAgaWYgKGVsLmNsYXNzTGlzdC5jb250YWlucygnbWZnYS1jbXAtdGhpY2snKSB8fCBlbC5jbGFzc0xpc3QuY29udGFpbnMoJ21mZ2EtY21wLWJlbmQnKSkgew0KICAgICAgICAgICAgICAgIGVsLnZhbHVlID0gbGVuZ3RoRnJvbUludGVybmFsKGxlbmd0aFRvSW50ZXJuYWwodikpLnRvRml4ZWQoc3lzdGVtID09PSAnaW1wZXJpYWwnID8gNCA6IDIpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBlbC52YWx1ZSA9IHN0cmVzc0Zyb21JbnRlcm5hbChzdHJlc3NUb0ludGVybmFsKHYpKS50b0ZpeGVkKHN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/IDEgOiAwKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgICAgIHVuaXRTeXN0ZW0gPSBzeXN0ZW07DQogICAgICAgICRhbGwoJy5tZmdhLXVuaXQtYnRuJykuZm9yRWFjaCgoYnRuKSA9PiBidG4uY2xhc3NMaXN0LnRvZ2dsZSgnbWZnYS1hY3RpdmUnLCBidG4uZGF0YXNldC51bml0ID09PSBzeXN0ZW0pKTsNCiAgICAgICAgdXBkYXRlVW5pdExhYmVscygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHVwZGF0ZVVuaXRMYWJlbHMoKSB7DQogICAgICAgIGNvbnN0IGxhYmVscyA9IHVuaXRTeXN0ZW0gPT09ICdtZXRyaWMnID8gTUVUUklDX0xBQkVMUyA6IElNUEVSSUFMX0xBQkVMUzsNCiAgICAgICAgJGFsbCgnW2RhdGEtdGhpY2tuZXNzLXVuaXRdJykuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBsYWJlbHMudGhp\",\n    \"Y2tuZXNzOyB9KTsNCiAgICAgICAgJGFsbCgnW2RhdGEtbGVuZ3RoLXVuaXRdJykuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBsYWJlbHMubGVuZ3RoOyB9KTsNCiAgICAgICAgJGFsbCgnW2RhdGEtc3RyZXNzLXVuaXRdJykuZm9yRWFjaCgoZWwpID0+IHsgZWwudGV4dENvbnRlbnQgPSBsYWJlbHMuc3RyZXNzOyB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB1cGRhdGVNb2RlVmlzaWJpbGl0eSgpIHsNCiAgICAgICAgY29uc3QgbW9kZSA9IGFzc2Vzc21lbnRNb2RlLnZhbHVlOw0KICAgICAgICBjb25zdCBpc0NvbXBhcmlzb24gPSBtb2RlID09PSAnY29tcGFyaXNvbic7DQoNCiAgICAgICAgJGFsbCgnLm1mZ2Etc2luZ2xlLW1vZGUnKS5mb3JFYWNoKChlbCkgPT4geyBlbC5oaWRkZW4gPSBpc0NvbXBhcmlzb247IH0pOw0KICAgICAgICAkYWxsKCcubWZnYS1jb21wYXJpc29uLW1vZGUnKS5mb3JFYWNoKChlbCkgPT4geyBlbC5oaWRkZW4gPSAhaXNDb21wYXJpc29uOyB9KTsNCg0KICAgICAgICAkYWxsKCcubWZnYS1tb2RlLWZpZWxkJykuZm9yRWFjaCgoZWwpID0+IHsNCiAgICAgICAgICAgIGNvbnN0IG1vZGVzID0gKGVsLmRhdGFzZXQubW9kZSB8fCAnJykuc3BsaXQoJyAnKTsNCiAgICAgICAgICAgIGVsLmhpZGRlbiA9ICFtb2Rlcy5pbmNsdWRlcyhtb2RlKSAmJiAhbW9kZXMuaW5jbHVkZXMoJ2dlbmVyYWwnKSAmJiBtb2RlICE9PSAnY29tcGFyaXNvbic7DQogICAgICAgICAgICBpZiAobW9kZSA9PT0gJ2dlbmVyYWwnKSBlbC5oaWRkZW4gPSBmYWxzZTsNCiAgICAgICAgfSk7DQoNCiAgICAgICAgYXBwbHlNb2RlV2VpZ2h0cygpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGFwcGx5TW9kZVdlaWdodHMoKSB7DQogICAgICAgIGNvbnN0IG1vZGUgPSBhc3Nlc3NtZW50TW9kZS52YWx1ZTsNCiAgICAgICAgY29uc3QgdyA9IE1PREVfV0VJR0hUU1ttb2RlXSB8fCBNT0RFX1dFSUdIVFMuZ2VuZXJhbDsNCiAgICAgICAgJCgnd0Vsb25nJykudmFsdWUgPSB3LmVsb25nOw0KICAgICAgICAkKCd3TicpLnZhbHVlID0gdy5uOw0KICAgICAgICAkKCd3UicpLnZhbHVlID0gdy5yOw0KICAgICAgICAkKCd3WVQnKS52YWx1ZSA9IHcueXQ7DQogICAgICAgICQoJ3dCZW5kJykudmFsdWUgPSB3LmJlbmQ7DQogICAgICAgICQoJ3dGTEQnKS52YWx1ZSA9IHcuZmxkOw0KICAgICAgICAkKCd3QXJlYScpLnZhbHVlID0gdy5hcmVhOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFJlZnMoKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBhcmVmOiBudW1WYWwoJ2FyZWYnKSB8fCA0MCwNCiAgICAgICAgICAgIG5yZWY6IG51bVZhbCgnbnJlZicpIHx8IDAuMjUsDQogICAgICAgICAgICBycmVmOiBudW1WYWwoJ3JyZWYnKSB8fCAxLjgsDQogICAgICAgICAgICByYXJlZjogbnVtVmFsKCdyYXJlZicpIHx8IDYwLA0KICAgICAgICAgICAgY2I6IG51bVZhbCgnY2InKSB8fCAwLjUsDQogICAgICAgICAgICBjcjogbnVtVmFsKCdjcicpIHx8IDUsDQogICAgICAgICAgICB5dE1pbjogbnVtVmFsKCd5dE1pbicpIHx8IDAuNDUsDQogICAgICAgICAgICB5dE1heDogbnVtVmFsKCd5dE1heCcpIHx8IDAuODUsDQogICAgICAgICAgICBjdDogbnVtVmFsKCdjdCcpIHx8IDEuMCwNCiAgICAgICAgICAgIGNTdHJlbmd0aDogbnVtVmFsKCdjU3RyZW5ndGgnKSB8fCAwLjE1LA0KICAgICAgICAgICAgc3lIaWdoOiBudW1WYWwoJ3N5SGlnaCcpIHx8IDU1MA0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGdldFdlaWdodHMoKSB7DQogICAgICAgIGNvbnN0IHJhdyA9IHsNCiAgICAgICAgICAgIGVsb25nOiBudW1WYWwoJ3dFbG9uZycpIHx8IDAsDQogICAgICAgICAgICBuOiBudW1WYWwoJ3dOJykgfHwgMCwNCiAgICAgICAgICAgIHI6IG51bVZhbCgnd1InKSB8fCAwLA0KICAgICAgICAgICAgeXQ6IG51bVZhbCgnd1lUJykgfHwgMCwNCiAgICAgICAgICAgIGJlbmQ6IG51bVZhbCgnd0JlbmQnKSB8fCAwLA0KICAgICAgICAgICAgZmxkOiBudW1WYWwoJ3dGTEQnKSB8fCAwLA0KICAgICAgICAgICAgYXJlYTogbnVtVmFsKCd3QXJlYScpIHx8IDANCiAgICAgICAgfTsNCiAgICAgICAgY29uc3Qgc3VtID0gT2JqZWN0LnZhbHVlcyhyYXcpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApOw0KICAgICAgICBpZiAoc3VtIDw9IDApIHJldHVybiB7IC4uLk1PREVfV0VJR0hUUy5nZW5lcmFsIH07DQogICAgICAgIE9iamVjdC5rZXlzKHJhdykuZm9yRWFjaCgoaykgPT4geyByYXdba10gLz0gc3VtOyB9KTsNCiAgICAgICAgcmV0dXJuIHJhdzsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBnZXRHcmFkZVRocmVzaG9sZHMoKSB7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBleGNlbGxlbnQ6IG51bVZhbCgnZ3JhZGVFeGNlbGxlbnQnKSA\/PyA5MCwNCiAgICAgICAgICAgIHZlcnlHb29kOiBudW1WYWwoJ2dyYWRlVmVyeUdvb2QnKSA\/PyA4MCwNCiAgICAgICAgICAgIGdvb2Q6IG51bVZhbCgnZ3JhZGVHb29kJykgPz8gNzAsDQogICAgICAgICAgICBtb2RlcmF0ZTogbnVtVmFsKCdncmFkZU1vZGVyYXRlJykgPz8gNjAsDQogICAgICAgICAgICBsaW1pdGVkOiBudW1WYWwoJ2dyYWRlTGltaXRlZCcpID8\/IDQ1DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVhZE1hdGVyaWFsSW5wdXRzKCkgew0KICAgICAgICBjb25zdCBTeSA9IHN0cmVzc1RvSW50ZXJuYWwobnVtVmFsKCd5aWVsZFN0cmVuZ3RoJykpOw0KICAgICAgICBjb25zdCBTdXQgPSBzdHJlc3NUb0ludGVybmFsKG51bVZhbCgndGVuc2lsZVN0cmVuZ3RoJykpOw0KICAgICAgICBjb25zdCB0aGlja25lc3MgPSBsZW5ndGhUb0ludGVybmFsKG51bVZhbCgndGhpY2tuZXNzJykpOw0KICAgICAgICBjb25zdCBtaW5CZW5kID0gaGFzVmFsKCdtaW5CZW5kUmFkaXVzJykgPyBsZW5ndGhUb0ludGVybmFsKG51bVZhbCgnbWluQmVuZFJhZGl1cycpKSA6IG51bGw7DQogICAgICAgIGNvbnN0IGFjdHVhbEJlbmQgPSBoYXNWYWwoJ2FjdHVhbEJlbmRSYWRpdXMnKSA\/IGxlbmd0aFRvSW50ZXJuYWwobnVtVmFsKCdhY3R1YWxCZW5kUmFkaXVzJykpIDogbnVsbDsNCg0KICAgICAgICBsZXQgckJhciA9IG51bGw7DQogICAgICAgIGlmIChoYXNWYWwoJ3JCYXJEaXJlY3QnKSkgew0KICAgICAgICAgICAgckJhciA9IG51bVZhbCgnckJhckRpcmVjdCcpOw0KICAgICAgICB9IGVsc2UgaWYgKGhhc1ZhbCgncjAnKSAmJiBoYXNWYWwoJ3I0NScpICYmIGhhc1ZhbCgncjkwJykpIHsNCiAgICAgICAgICAgIHJCYXIgPSAobnVtVmFsKCdyMCcpICsgMiAqIG51bVZhbCgncjQ1JykgKyBudW1WYWwoJ3I5MCcpKSAvIDQ7DQogICAgICAgIH0NCg0KICAgICAgICBsZXQgZGVsdGFSID0gbnVsbDsNCiAgICAgICAgaWYgKGhhc1ZhbCgncjAnKSAmJiBoYXNWYWwoJ3I0NScpICYmIGhhc1ZhbCgncjkwJykpIHsNCiAgICAgICAgICAgIGRlbHRhUiA9IChudW1WYWwoJ3IwJykgLSAyICogbnVtVmFsKCdyNDUnKSArIG51bVZhbCgncjkwJykpIC8gMjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IG1vZGUgPSBhc3Nlc3NtZW50TW9kZS52YWx1ZTsNCiAgICAgICAgbGV0IGVsb25nRm9yU2NvcmUgPSBudW1WYWwoJ2Vsb25nYXRpb24nKTsNCiAgICAgICAgaWYgKG1vZGUgPT09ICdzdHJldGNoJyAmJiBoYXNWYWwoJ3VuaWZvcm1FbG9uZ2F0aW9uJykpIHsNCiAgICAgICAgICAgIGVsb25nRm9yU2NvcmUgPSBudW1WYWwoJ3VuaWZvcm1FbG9uZ2F0aW9uJyk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgbmFtZTogc3RyVmFsKCdtYXRlcmlhbEdyYWRlJykgfHwgc3RyVmFsKCdtYXRlcmlhbFR5cGUnKSwNCiAgICAgICAgICAgIG1hdGVyaWFsVHlwZTogJCgnbWF0ZXJpYWxUeXBlJykuc2VsZWN0ZWRPcHRpb25zWzBdLnRleHRDb250ZW50LA0KICAgICAgICAgICAgU3ksIFN1dCwgdGhpY2tuZXNzLA0KICAgICAgICAgICAgZWxvbmdhdGlvbjogbnVtVmFsKCdlbG9uZ2F0aW9uJyksDQogICAgICAgICAgICBlbG9uZ0ZvclNjb3JlLA0KICAgICAgICAgICAgdW5pZm9ybUVsb25nYXRpb246IGhhc1ZhbCgndW5pZm9ybUVsb25nYXRpb24nKSA\/IG51bVZhbCgndW5pZm9ybUVsb25nYXRpb24nKSA6IG51bGwsDQogICAgICAgICAgICBuOiBoYXNWYWwoJ25WYWx1ZScpID8gbnVtVmFsKCduVmFsdWUnKSA6IG51bGwsDQogICAgICAgICAgICByQmFyLCBkZWx0YVIsDQogICAgICAgICAgICByMDogaGFzVmFsKCdyMCcpID8gbnVtVmFsKCdyMCcpIDogbnVsbCwNCiAgICAgICAgICAgIHI0NTogaGFzVmFsKCdyNDUnKSA\/IG51bVZhbCgncjQ1JykgOiBudWxsLA0KICAgICAgICAgICAgcjkwOiBoYXNWYWwoJ3I5MCcpID8gbnVtVmFsKCdyOTAnKSA6IG51bGwsDQogICAgICAgICAgICByYTogaGFzVmFsKCdyZWR1Y3Rpb25BcmVhJykgPyBudW1WYWwoJ3JlZHVjdGlvbkFyZWEnKSA6IG51bGwsDQogICAgICAgICAgICBtaW5CZW5kLCBhY3R1YWxC\",\n    \"ZW5kLA0KICAgICAgICAgICAgZmxkMDogaGFzVmFsKCdmbGQwJykgPyBudW1WYWwoJ2ZsZDAnKSA6IG51bGwsDQogICAgICAgICAgICBtYWpvckFjdHVhbDogaGFzVmFsKCdtYWpvclN0cmFpbkFjdHVhbCcpID8gbnVtVmFsKCdtYWpvclN0cmFpbkFjdHVhbCcpIDogbnVsbCwNCiAgICAgICAgICAgIG1pbm9yQWN0dWFsOiBoYXNWYWwoJ21pbm9yU3RyYWluQWN0dWFsJykgPyBudW1WYWwoJ21pbm9yU3RyYWluQWN0dWFsJykgOiBudWxsLA0KICAgICAgICAgICAgbWFqb3JMaW1pdDogaGFzVmFsKCdtYWpvclN0cmFpbkxpbWl0JykgPyBudW1WYWwoJ21ham9yU3RyYWluTGltaXQnKSA6IG51bGwNCiAgICAgICAgfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiB2YWxpZGF0ZU1hdGVyaWFsKG1hdCwgZXJyb3JzLCB3YXJuaW5ncykgew0KICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtYXQuU3kpIHx8IG1hdC5TeSA8PSAwKSBlcnJvcnMucHVzaCgnWWllbGQgc3RyZW5ndGggbXVzdCBiZSBwb3NpdGl2ZS4nKTsNCiAgICAgICAgaWYgKCFOdW1iZXIuaXNGaW5pdGUobWF0LlN1dCkgfHwgbWF0LlN1dCA8PSAwKSBlcnJvcnMucHVzaCgnVGVuc2lsZSBzdHJlbmd0aCBtdXN0IGJlIHBvc2l0aXZlLicpOw0KICAgICAgICBpZiAobWF0LlN5ID4gbWF0LlN1dCkgd2FybmluZ3MucHVzaCgnWWllbGQgc3RyZW5ndGggZXhjZWVkcyB0ZW5zaWxlIHN0cmVuZ3RoIOKAlCB2ZXJpZnkgdGVzdCBkYXRhLicpOw0KICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShtYXQudGhpY2tuZXNzKSB8fCBtYXQudGhpY2tuZXNzIDw9IDApIGVycm9ycy5wdXNoKCdTaGVldCB0aGlja25lc3MgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVyby4nKTsNCiAgICAgICAgaWYgKG1hdC5lbG9uZ2F0aW9uICE9PSBudWxsICYmIChtYXQuZWxvbmdhdGlvbiA8IDAgfHwgbWF0LmVsb25nYXRpb24gPiAxMDApKSBlcnJvcnMucHVzaCgnRWxvbmdhdGlvbiBtdXN0IGJlIGJldHdlZW4gMCUgYW5kIDEwMCUuJyk7DQogICAgICAgIGlmIChtYXQubiAhPT0gbnVsbCAmJiBtYXQubiA8PSAwKSBlcnJvcnMucHVzaCgnbi12YWx1ZSBtdXN0IGJlIHBvc2l0aXZlIHdoZW4gZW50ZXJlZC4nKTsNCiAgICAgICAgaWYgKG1hdC5yMCAhPT0gbnVsbCAmJiBtYXQucjAgPD0gMCkgZXJyb3JzLnB1c2goJ3LigoAgbXVzdCBiZSBwb3NpdGl2ZSB3aGVuIGVudGVyZWQuJyk7DQogICAgICAgIGlmIChtYXQucjQ1ICE9PSBudWxsICYmIG1hdC5yNDUgPD0gMCkgZXJyb3JzLnB1c2goJ3LigoTigoUgbXVzdCBiZSBwb3NpdGl2ZSB3aGVuIGVudGVyZWQuJyk7DQogICAgICAgIGlmIChtYXQucjkwICE9PSBudWxsICYmIG1hdC5yOTAgPD0gMCkgZXJyb3JzLnB1c2goJ3LigonigoAgbXVzdCBiZSBwb3NpdGl2ZSB3aGVuIGVudGVyZWQuJyk7DQogICAgICAgIGlmIChtYXQubWluQmVuZCAhPT0gbnVsbCAmJiBtYXQubWluQmVuZCA8IDApIGVycm9ycy5wdXNoKCdNaW5pbXVtIGJlbmQgcmFkaXVzIGNhbm5vdCBiZSBuZWdhdGl2ZS4nKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzY29yZUVsb25nYXRpb24oQSwgYXJlZikgew0KICAgICAgICBpZiAoQSA9PT0gbnVsbCB8fCAhTnVtYmVyLmlzRmluaXRlKEEpKSByZXR1cm4gbnVsbDsNCiAgICAgICAgcmV0dXJuIGNsYW1wKChBIC8gYXJlZikgKiAxMDAsIDAsIDEwMCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2NvcmVOKG4sIG5yZWYpIHsNCiAgICAgICAgaWYgKG4gPT09IG51bGwgfHwgIU51bWJlci5pc0Zpbml0ZShuKSkgcmV0dXJuIG51bGw7DQogICAgICAgIHJldHVybiBjbGFtcCgobiAvIG5yZWYpICogMTAwLCAwLCAxMDApOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNjb3JlUihyQmFyLCBycmVmKSB7DQogICAgICAgIGlmIChyQmFyID09PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUockJhcikpIHJldHVybiBudWxsOw0KICAgICAgICByZXR1cm4gY2xhbXAoKHJCYXIgLyBycmVmKSAqIDEwMCwgMCwgMTAwKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzY29yZVlUKFN5LCBTdXQsIHl0TWluLCB5dE1heCkgew0KICAgICAgICBpZiAoIU51bWJlci5pc0Zpbml0ZShTeSkgfHwgIU51bWJlci5pc0Zpbml0ZShTdXQpIHx8IFN1dCA8PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgICAgY29uc3QgeXQgPSBTeSAvIFN1dDsNCiAgICAgICAgY29uc3QgcmFuZ2UgPSB5dE1heCAtIHl0TWluOw0KICAgICAgICBpZiAocmFuZ2UgPD0gMCkgcmV0dXJuIDUwOw0KICAgICAgICByZXR1cm4gY2xhbXAoMTAwICogKHl0TWF4IC0geXQpIC8gcmFuZ2UsIDAsIDEwMCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc2NvcmVBcmVhKHJhLCByYXJlZikgew0KICAgICAgICBpZiAocmEgPT09IG51bGwgfHwgIU51bWJlci5pc0Zpbml0ZShyYSkpIHJldHVybiBudWxsOw0KICAgICAgICByZXR1cm4gY2xhbXAoKHJhIC8gcmFyZWYpICogMTAwLCAwLCAxMDApOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHNjb3JlQmVuZChtaW5CZW5kLCB0aGlja25lc3MsIGNiKSB7DQogICAgICAgIGlmIChtaW5CZW5kID09PSBudWxsIHx8ICFOdW1iZXIuaXNGaW5pdGUobWluQmVuZCkgfHwgIU51bWJlci5pc0Zpbml0ZSh0aGlja25lc3MpIHx8IHRoaWNrbmVzcyA8PSAwKSByZXR1cm4gbnVsbDsNCiAgICAgICAgY29uc3QgcnQgPSBtaW5CZW5kIC8gdGhpY2tuZXNzOw0KICAgICAgICByZXR1cm4gY2xhbXAoMTAwIC8gKDEgKyBjYiAqIHJ0KSwgMCwgMTAwKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzY29yZUZMRChtYWpvckFjdHVhbCwgbWFqb3JMaW1pdCwgZmxkMCkgew0KICAgICAgICBpZiAobWFqb3JBY3R1YWwgIT09IG51bGwgJiYgbWFqb3JMaW1pdCAhPT0gbnVsbCAmJiBtYWpvckxpbWl0ID4gMCkgew0KICAgICAgICAgICAgY29uc3QgdXRpbCA9IChtYWpvckFjdHVhbCAvIG1ham9yTGltaXQpICogMTAwOw0KICAgICAgICAgICAgcmV0dXJuIGNsYW1wKDEwMCAtIHV0aWwsIDAsIDEwMCk7DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZsZDAgIT09IG51bGwgJiYgTnVtYmVyLmlzRmluaXRlKGZsZDApICYmIGZsZDAgPiAwKSB7DQogICAgICAgICAgICBjb25zdCBmbGRSZWYgPSAzNTsNCiAgICAgICAgICAgIHJldHVybiBjbGFtcCgoZmxkMCAvIGZsZFJlZikgKiAxMDAsIDAsIDEwMCk7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gc3RyZW5ndGhQZW5hbHR5KG1hdCwgcmVmcykgew0KICAgICAgICBjb25zdCBzeUludCA9IG1hdC5TeTsNCiAgICAgICAgY29uc3Qgc3lIaWdoSW50ID0gdW5pdFN5c3RlbSA9PT0gJ2ltcGVyaWFsJyA\/IHJlZnMuc3lIaWdoICogNi44OTQ3NiA6IHJlZnMuc3lIaWdoOw0KICAgICAgICBpZiAoc3lJbnQgPD0gc3lIaWdoSW50KSByZXR1cm4gMTsNCiAgICAgICAgY29uc3QgZWxvbmdMb3cgPSAobWF0LmVsb25nYXRpb24gfHwgMCkgPCAxNTsNCiAgICAgICAgY29uc3QgbkxvdyA9IChtYXQubiB8fCAwKSA8IDAuMTI7DQogICAgICAgIGlmIChlbG9uZ0xvdyB8fCBuTG93KSB7DQogICAgICAgICAgICBjb25zdCBleGNlc3MgPSAoc3lJbnQgLSBzeUhpZ2hJbnQpIC8gc3lIaWdoSW50Ow0KICAgICAgICAgICAgcmV0dXJuIGNsYW1wKDEgLSByZWZzLmNTdHJlbmd0aCAqIGV4Y2VzcywgMC43LCAxKTsNCiAgICAgICAgfQ0KICAgICAgICByZXR1cm4gMTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBhc3Nlc3NNYXRlcmlhbChtYXQsIG1vZGUsIHJlZnMsIHdlaWdodHMpIHsNCiAgICAgICAgY29uc3Qgc2NvcmVzID0gew0KICAgICAgICAgICAgZWxvbmc6IHNjb3JlRWxvbmdhdGlvbihtYXQuZWxvbmdGb3JTY29yZSA\/PyBtYXQuZWxvbmdhdGlvbiwgcmVmcy5hcmVmKSwNCiAgICAgICAgICAgIG46IHNjb3JlTihtYXQubiwgcmVmcy5ucmVmKSwNCiAgICAgICAgICAgIHI6IHNjb3JlUihtYXQuckJhciwgcmVmcy5ycmVmKSwNCiAgICAgICAgICAgIHl0OiBzY29yZVlUKG1hdC5TeSwgbWF0LlN1dCwgcmVmcy55dE1pbiwgcmVmcy55dE1heCksDQogICAgICAgICAgICBiZW5kOiBzY29yZUJlbmQobWF0Lm1pbkJlbmQsIG1hdC50aGlja25lc3MsIHJlZnMuY2IpLA0KICAgICAgICAgICAgZmxkOiBzY29yZUZMRChtYXQubWFqb3JBY3R1YWwsIG1hdC5tYWpvckxpbWl0LCBtYXQuZmxkMCksDQogICAgICAgICAgICBhcmVhOiBzY29yZUFyZWEobWF0LnJhLCByZWZzLnJhcmVmKQ0KICAgICAgICB9Ow0KDQogICAgICAgIGNvbnN0IGF2YWlsYWJsZSA9IHt9Ow0KICAgICAgICBsZXQgdG90YWxXZWlnaHQgPSAwOw0KICAgICAgICBsZXQgdXNlZFdlaWdodCA9IDA7DQoNCiAgICAgICAgT2JqZWN0LmtleXMod2VpZ2h0cykuZm9yRWFjaCgoaykgPT4gew0KICAgICAgICAgICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0c1trXTsNCiAgICAgICAgICAgIGlmIChzY29yZXNba10gIT09IG51bGwpIHsNCiAgICAgICAgICAgICAgICBhdmFpbGFibGVba10gPSBzY29yZXNba107DQogICAgICAgICAgICAgICAgdXNlZFdlaWdodCAr\",\n    \"PSB3ZWlnaHRzW2tdOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9KTsNCg0KICAgICAgICBsZXQgb3ZlcmFsbCA9IDA7DQogICAgICAgIGlmICh1c2VkV2VpZ2h0ID4gMCkgew0KICAgICAgICAgICAgT2JqZWN0LmtleXMoYXZhaWxhYmxlKS5mb3JFYWNoKChrKSA9PiB7DQogICAgICAgICAgICAgICAgb3ZlcmFsbCArPSAod2VpZ2h0c1trXSAvIHVzZWRXZWlnaHQpICogYXZhaWxhYmxlW2tdOw0KICAgICAgICAgICAgfSk7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAobW9kZSA9PT0gJ2RyYXdpbmcnICYmIG1hdC5kZWx0YVIgIT09IG51bGwpIHsNCiAgICAgICAgICAgIGNvbnN0IHBlbmFsdHkgPSByZWZzLmNyICogTWF0aC5hYnMobWF0LmRlbHRhUik7DQogICAgICAgICAgICBvdmVyYWxsID0gY2xhbXAob3ZlcmFsbCAtIHBlbmFsdHksIDAsIDEwMCk7DQogICAgICAgIH0NCg0KICAgICAgICBvdmVyYWxsICo9IHJlZnMuY3Q7DQogICAgICAgIG92ZXJhbGwgKj0gc3RyZW5ndGhQZW5hbHR5KG1hdCwgcmVmcyk7DQogICAgICAgIG92ZXJhbGwgPSBjbGFtcChvdmVyYWxsLCAwLCAxMDApOw0KDQogICAgICAgIGNvbnN0IGNvbmZpZGVuY2UgPSB0b3RhbFdlaWdodCA+IDAgPyAodXNlZFdlaWdodCAvIHRvdGFsV2VpZ2h0KSAqIDEwMCA6IDA7DQoNCiAgICAgICAgY29uc3QgcHJvY2Vzc1Njb3JlcyA9IGNvbXB1dGVQcm9jZXNzU2NvcmVzKG1hdCwgcmVmcyk7DQoNCiAgICAgICAgcmV0dXJuIHsNCiAgICAgICAgICAgIHNjb3JlcywNCiAgICAgICAgICAgIG92ZXJhbGwsDQogICAgICAgICAgICBjb25maWRlbmNlLA0KICAgICAgICAgICAgcHJvY2Vzc1Njb3JlcywNCiAgICAgICAgICAgIHl0UmF0aW86IG1hdC5TdXQgPiAwID8gbWF0LlN5IC8gbWF0LlN1dCA6IG51bGwsDQogICAgICAgICAgICBydFJhdGlvOiBtYXQubWluQmVuZCAhPT0gbnVsbCAmJiBtYXQudGhpY2tuZXNzID4gMCA\/IG1hdC5taW5CZW5kIC8gbWF0LnRoaWNrbmVzcyA6IG51bGwsDQogICAgICAgICAgICBiZW5kTWFyZ2luOiBtYXQuYWN0dWFsQmVuZCAhPT0gbnVsbCAmJiBtYXQubWluQmVuZCA+IDAgPyBtYXQuYWN0dWFsQmVuZCAvIG1hdC5taW5CZW5kIDogbnVsbCwNCiAgICAgICAgICAgIGRlbHRhUjogbWF0LmRlbHRhUiwNCiAgICAgICAgICAgIGF2YWlsYWJsZUNvdW50OiBPYmplY3Qua2V5cyhhdmFpbGFibGUpLmxlbmd0aA0KICAgICAgICB9Ow0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIGNvbXB1dGVQcm9jZXNzU2NvcmVzKG1hdCwgcmVmcykgew0KICAgICAgICBjb25zdCB3QmVuZCA9IE1PREVfV0VJR0hUUy5iZW5kaW5nOw0KICAgICAgICBjb25zdCB3RHJhdyA9IE1PREVfV0VJR0hUUy5kcmF3aW5nOw0KICAgICAgICBjb25zdCB3U3RyZXRjaCA9IE1PREVfV0VJR0hUUy5zdHJldGNoOw0KDQogICAgICAgIGZ1bmN0aW9uIHdlaWdodGVkU2NvcmUodykgew0KICAgICAgICAgICAgY29uc3QgcyA9IHsNCiAgICAgICAgICAgICAgICBlbG9uZzogc2NvcmVFbG9uZ2F0aW9uKG1hdC5lbG9uZ2F0aW9uLCByZWZzLmFyZWYpLA0KICAgICAgICAgICAgICAgIG46IHNjb3JlTihtYXQubiwgcmVmcy5ucmVmKSwNCiAgICAgICAgICAgICAgICByOiBzY29yZVIobWF0LnJCYXIsIHJlZnMucnJlZiksDQogICAgICAgICAgICAgICAgeXQ6IHNjb3JlWVQobWF0LlN5LCBtYXQuU3V0LCByZWZzLnl0TWluLCByZWZzLnl0TWF4KSwNCiAgICAgICAgICAgICAgICBiZW5kOiBzY29yZUJlbmQobWF0Lm1pbkJlbmQsIG1hdC50aGlja25lc3MsIHJlZnMuY2IpLA0KICAgICAgICAgICAgICAgIGZsZDogc2NvcmVGTEQobWF0Lm1ham9yQWN0dWFsLCBtYXQubWFqb3JMaW1pdCwgbWF0LmZsZDApLA0KICAgICAgICAgICAgICAgIGFyZWE6IHNjb3JlQXJlYShtYXQucmEsIHJlZnMucmFyZWYpDQogICAgICAgICAgICB9Ow0KICAgICAgICAgICAgbGV0IHVzZWQgPSAwOw0KICAgICAgICAgICAgT2JqZWN0LmtleXModykuZm9yRWFjaCgoaykgPT4gew0KICAgICAgICAgICAgICAgIGlmIChzW2tdICE9PSBudWxsKSB1c2VkICs9IHdba107DQogICAgICAgICAgICB9KTsNCiAgICAgICAgICAgIGxldCBzY29yZSA9IDA7DQogICAgICAgICAgICBPYmplY3Qua2V5cyh3KS5mb3JFYWNoKChrKSA9PiB7DQogICAgICAgICAgICAgICAgaWYgKHNba10gIT09IG51bGwgJiYgdXNlZCA+IDApIHNjb3JlICs9ICh3W2tdIC8gdXNlZCkgKiBzW2tdOw0KICAgICAgICAgICAgfSk7DQogICAgICAgICAgICBpZiAobWF0LmRlbHRhUiAhPT0gbnVsbCkgc2NvcmUgPSBjbGFtcChzY29yZSAtIHJlZnMuY3IgKiBNYXRoLmFicyhtYXQuZGVsdGFSKSAqIDAuNSwgMCwgMTAwKTsNCiAgICAgICAgICAgIHJldHVybiBjbGFtcChzY29yZSAqIHJlZnMuY3QsIDAsIDEwMCk7DQogICAgICAgIH0NCg0KICAgICAgICByZXR1cm4gew0KICAgICAgICAgICAgYmVuZGluZzogd2VpZ2h0ZWRTY29yZSh3QmVuZCksDQogICAgICAgICAgICBkcmF3aW5nOiB3ZWlnaHRlZFNjb3JlKHdEcmF3KSwNCiAgICAgICAgICAgIHN0cmV0Y2g6IHdlaWdodGVkU2NvcmUod1N0cmV0Y2gpLA0KICAgICAgICAgICAgc3RhbXBpbmc6IHdlaWdodGVkU2NvcmUoTU9ERV9XRUlHSFRTLmdlbmVyYWwpDQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0R3JhZGUoc2NvcmUsIHRocmVzaG9sZHMpIHsNCiAgICAgICAgaWYgKHNjb3JlID49IHRocmVzaG9sZHMuZXhjZWxsZW50KSByZXR1cm4geyBsYWJlbDogJ0V4Y2VsbGVudCcsIGNsczogJ21mZ2EtZ3JhZGUtZXhjZWxsZW50JyB9Ow0KICAgICAgICBpZiAoc2NvcmUgPj0gdGhyZXNob2xkcy52ZXJ5R29vZCkgcmV0dXJuIHsgbGFiZWw6ICdWZXJ5IEdvb2QnLCBjbHM6ICdtZmdhLWdyYWRlLXZlcnlnb29kJyB9Ow0KICAgICAgICBpZiAoc2NvcmUgPj0gdGhyZXNob2xkcy5nb29kKSByZXR1cm4geyBsYWJlbDogJ0dvb2QnLCBjbHM6ICdtZmdhLWdyYWRlLWdvb2QnIH07DQogICAgICAgIGlmIChzY29yZSA+PSB0aHJlc2hvbGRzLm1vZGVyYXRlKSByZXR1cm4geyBsYWJlbDogJ01vZGVyYXRlJywgY2xzOiAnbWZnYS1ncmFkZS1tb2RlcmF0ZScgfTsNCiAgICAgICAgaWYgKHNjb3JlID49IHRocmVzaG9sZHMubGltaXRlZCkgcmV0dXJuIHsgbGFiZWw6ICdMaW1pdGVkJywgY2xzOiAnbWZnYS1ncmFkZS1saW1pdGVkJyB9Ow0KICAgICAgICByZXR1cm4geyBsYWJlbDogJ1Bvb3InLCBjbHM6ICdtZmdhLWdyYWRlLXBvb3InIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZ2V0Q29uZmlkZW5jZUxhYmVsKHBjdCkgew0KICAgICAgICBpZiAocGN0ID49IDkwKSByZXR1cm4gYCR7cGN0LnRvRml4ZWQoMCl9JSDigJQgSGlnaCBDb25maWRlbmNlYDsNCiAgICAgICAgaWYgKHBjdCA+PSA3MCkgcmV0dXJuIGAke3BjdC50b0ZpeGVkKDApfSUg4oCUIE1vZGVyYXRlIENvbmZpZGVuY2VgOw0KICAgICAgICByZXR1cm4gYCR7cGN0LnRvRml4ZWQoMCl9JSDigJQgTGltaXRlZCBDb25maWRlbmNlYDsNCiAgICB9DQoNCiAgICBjb25zdCBMSU1JVEFUSU9OX01BUCA9IHsNCiAgICAgICAgZWxvbmc6ICdMb3cgdGVuc2lsZSBlbG9uZ2F0aW9uJywNCiAgICAgICAgbjogJ0xvdyBzdHJhaW4gaGFyZGVuaW5nIGV4cG9uZW50IChuLXZhbHVlKScsDQogICAgICAgIHI6ICdMb3cgYXZlcmFnZSByLXZhbHVlIChkcmF3aW5nIHJlc2lzdGFuY2UpJywNCiAgICAgICAgeXQ6ICdIaWdoIHlpZWxkLXRvLXRlbnNpbGUgcmF0aW8nLA0KICAgICAgICBiZW5kOiAnTGFyZ2UgbWluaW11bSBiZW5kIHJhZGl1cyAoUi90KScsDQogICAgICAgIGZsZDogJ0xvdyBGTEQgbWFyZ2luIC8gaGlnaCBGTEQgdXRpbGl6YXRpb24nLA0KICAgICAgICBhcmVhOiAnTG93IHJlZHVjdGlvbiBvZiBhcmVhJw0KICAgIH07DQoNCiAgICBmdW5jdGlvbiBmaW5kTGltaXRhdGlvbnMoc2NvcmVzLCBkZWx0YVIpIHsNCiAgICAgICAgY29uc3QgZW50cmllcyA9IE9iamVjdC5lbnRyaWVzKHNjb3JlcykuZmlsdGVyKChbLCB2XSkgPT4gdiAhPT0gbnVsbCkuc29ydCgoYSwgYikgPT4gYVsxXSAtIGJbMV0pOw0KICAgICAgICBjb25zdCBwcmltYXJ5ID0gZW50cmllcy5sZW5ndGggPyBMSU1JVEFUSU9OX01BUFtlbnRyaWVzWzBdWzBdXSB8fCBlbnRyaWVzWzBdWzBdIDogJ0luc3VmZmljaWVudCBkYXRhJzsNCiAgICAgICAgY29uc3QgZXh0cmFzID0gW107DQogICAgICAgIGlmIChkZWx0YVIgIT09IG51bGwgJiYgTWF0aC5hYnMoZGVsdGFSKSA+IDAuMykgZXh0cmFzLnB1c2goJ0hpZ2ggcGxhbmFyIGFuaXNvdHJvcHkgKM6UciknKTsNCiAgICAgICAgZW50cmllcy5zbGljZSgwLCAzKS5mb3JFYWNoKChbaywgdl0pID0+IHsNCiAgICAgICAgICAgIGlmICh2IDwgNTApIGV4dHJhcy5wdXNoKExJTUlUQVRJT05fTUFQW2tdKTsNCiAgICAgICAgfSk7DQogICAgICAgIHJldHVybiB7IHByaW1hcnksIGV4dHJhczogWy4uLm5ldyBTZXQoZXh0cmFzKV0gfTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBjYWxjdWxhdGUoKSB7DQogICAgICAgIGhpZGVN\",\n    \"ZXNzYWdlcygpOw0KICAgICAgICBjb25zdCBtb2RlID0gYXNzZXNzbWVudE1vZGUudmFsdWU7DQogICAgICAgIGNvbnN0IHJlZnMgPSBnZXRSZWZzKCk7DQogICAgICAgIGNvbnN0IHdlaWdodHMgPSBnZXRXZWlnaHRzKCk7DQogICAgICAgIGNvbnN0IHRocmVzaG9sZHMgPSBnZXRHcmFkZVRocmVzaG9sZHMoKTsNCiAgICAgICAgY29uc3QgZXJyb3JzID0gW107DQogICAgICAgIGNvbnN0IHdhcm5pbmdzID0gW107DQoNCiAgICAgICAgaWYgKG1vZGUgPT09ICdjb21wYXJpc29uJykgew0KICAgICAgICAgICAgcnVuQ29tcGFyaXNvbihyZWZzLCB3ZWlnaHRzLCB0aHJlc2hvbGRzLCBlcnJvcnMsIHdhcm5pbmdzKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IG1hdCA9IHJlYWRNYXRlcmlhbElucHV0cygpOw0KICAgICAgICB2YWxpZGF0ZU1hdGVyaWFsKG1hdCwgZXJyb3JzLCB3YXJuaW5ncyk7DQoNCiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsNCiAgICAgICAgICAgIHNob3dFcnJvcihlcnJvcnMuam9pbignICcpKTsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KDQogICAgICAgIGlmIChtYXQuZWxvbmdhdGlvbiA9PT0gbnVsbCAmJiBtYXQubiA9PT0gbnVsbCkgew0KICAgICAgICAgICAgd2FybmluZ3MucHVzaCgnVmVyeSBmZXcgbWV0cmljcyBhdmFpbGFibGUg4oCUIGFzc2Vzc21lbnQgcmVsaWFiaWxpdHkgaXMgbGltaXRlZC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIGNvbnN0IHJlc3VsdCA9IGFzc2Vzc01hdGVyaWFsKG1hdCwgbW9kZSwgcmVmcywgd2VpZ2h0cyk7DQogICAgICAgIGlmIChyZXN1bHQuY29uZmlkZW5jZSA8IDcwKSB3YXJuaW5ncy5wdXNoKCdEYXRhIGNvbmZpZGVuY2UgYmVsb3cgNzAlIOKAlCBlbnRlciBtb3JlIHByb3BlcnRpZXMgZm9yIGEgcmVsaWFibGUgYXNzZXNzbWVudC4nKTsNCg0KICAgICAgICBjb25zdCBncmFkZSA9IGdldEdyYWRlKHJlc3VsdC5vdmVyYWxsLCB0aHJlc2hvbGRzKTsNCiAgICAgICAgY29uc3QgbGltID0gZmluZExpbWl0YXRpb25zKHJlc3VsdC5zY29yZXMsIG1hdC5kZWx0YVIpOw0KDQogICAgICAgIGRpc3BsYXlTaW5nbGVSZXN1bHQobWF0LCByZXN1bHQsIGdyYWRlLCBsaW0sIHJlZnMsIHdlaWdodHMsIHdhcm5pbmdzLCBtb2RlKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBydW5Db21wYXJpc29uKHJlZnMsIHdlaWdodHMsIHRocmVzaG9sZHMsIGVycm9ycywgd2FybmluZ3MpIHsNCiAgICAgICAgY29uc3QgbWF0ZXJpYWxzID0gW107DQogICAgICAgICRhbGwoJy5tZmdhLWNvbXBhcmlzb24tYmxvY2snKS5mb3JFYWNoKChibG9jaykgPT4gew0KICAgICAgICAgICAgaWYgKGJsb2NrLmhpZGRlbikgcmV0dXJuOw0KICAgICAgICAgICAgY29uc3QgbWF0ID0gew0KICAgICAgICAgICAgICAgIG5hbWU6IGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1uYW1lJykudmFsdWUudHJpbSgpIHx8ICdNYXRlcmlhbCcsDQogICAgICAgICAgICAgICAgU3k6IHN0cmVzc1RvSW50ZXJuYWwocGFyc2VGbG9hdChibG9jay5xdWVyeVNlbGVjdG9yKCcubWZnYS1jbXAtc3knKS52YWx1ZSkpLA0KICAgICAgICAgICAgICAgIFN1dDogc3RyZXNzVG9JbnRlcm5hbChwYXJzZUZsb2F0KGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1zdXQnKS52YWx1ZSkpLA0KICAgICAgICAgICAgICAgIGVsb25nYXRpb246IHBhcnNlRmxvYXQoYmxvY2sucXVlcnlTZWxlY3RvcignLm1mZ2EtY21wLWVsb25nJykudmFsdWUpLA0KICAgICAgICAgICAgICAgIGVsb25nRm9yU2NvcmU6IHBhcnNlRmxvYXQoYmxvY2sucXVlcnlTZWxlY3RvcignLm1mZ2EtY21wLWVsb25nJykudmFsdWUpLA0KICAgICAgICAgICAgICAgIG46IHBhcnNlRmxvYXQoYmxvY2sucXVlcnlTZWxlY3RvcignLm1mZ2EtY21wLW4nKS52YWx1ZSksDQogICAgICAgICAgICAgICAgckJhcjogcGFyc2VGbG9hdChibG9jay5xdWVyeVNlbGVjdG9yKCcubWZnYS1jbXAtcmJhcicpLnZhbHVlKSwNCiAgICAgICAgICAgICAgICBkZWx0YVI6IG51bGwsDQogICAgICAgICAgICAgICAgdGhpY2tuZXNzOiBsZW5ndGhUb0ludGVybmFsKHBhcnNlRmxvYXQoYmxvY2sucXVlcnlTZWxlY3RvcignLm1mZ2EtY21wLXRoaWNrJykudmFsdWUpKSwNCiAgICAgICAgICAgICAgICBtaW5CZW5kOiBsZW5ndGhUb0ludGVybmFsKHBhcnNlRmxvYXQoYmxvY2sucXVlcnlTZWxlY3RvcignLm1mZ2EtY21wLWJlbmQnKS52YWx1ZSkpLA0KICAgICAgICAgICAgICAgIHJhOiBwYXJzZUZsb2F0KGJsb2NrLnF1ZXJ5U2VsZWN0b3IoJy5tZmdhLWNtcC1yYScpLnZhbHVlKSwNCiAgICAgICAgICAgICAgICBhY3R1YWxCZW5kOiBudWxsLCBmbGQwOiBudWxsLCBtYWpvckFjdHVhbDogbnVsbCwgbWFqb3JMaW1pdDogbnVsbA0KICAgICAgICAgICAgfTsNCiAgICAgICAgICAgIHZhbGlkYXRlTWF0ZXJpYWwobWF0LCBlcnJvcnMsIHdhcm5pbmdzKTsNCiAgICAgICAgICAgIG1hdGVyaWFscy5wdXNoKG1hdCk7DQogICAgICAgIH0pOw0KDQogICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7IHNob3dFcnJvcihlcnJvcnMuam9pbignICcpKTsgcmV0dXJuOyB9DQoNCiAgICAgICAgY29uc3QgcmVzdWx0cyA9IG1hdGVyaWFscy5tYXAoKG1hdCkgPT4gew0KICAgICAgICAgICAgY29uc3QgciA9IGFzc2Vzc01hdGVyaWFsKG1hdCwgJ2NvbXBhcmlzb24nLCByZWZzLCB3ZWlnaHRzKTsNCiAgICAgICAgICAgIGNvbnN0IGdyYWRlID0gZ2V0R3JhZGUoci5vdmVyYWxsLCB0aHJlc2hvbGRzKTsNCiAgICAgICAgICAgIGNvbnN0IGxpbSA9IGZpbmRMaW1pdGF0aW9ucyhyLnNjb3JlcywgbWF0LmRlbHRhUik7DQogICAgICAgICAgICByZXR1cm4geyBtYXQsIHJlc3VsdDogciwgZ3JhZGUsIGxpbSB9Ow0KICAgICAgICB9KS5zb3J0KChhLCBiKSA9PiBiLnJlc3VsdC5vdmVyYWxsIC0gYS5yZXN1bHQub3ZlcmFsbCk7DQoNCiAgICAgICAgZGlzcGxheUNvbXBhcmlzb25SZXN1bHRzKHJlc3VsdHMsIHJlZnMsIHdlaWdodHMsIHdhcm5pbmdzKTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBoaWRlTWVzc2FnZXMoKSB7DQogICAgICAgICQoJ2Vycm9yQm94JykuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgJCgnd2FybmluZ0JveCcpLmhpZGRlbiA9IHRydWU7DQogICAgICAgIHJlc3VsdHNQYW5lbC5oaWRkZW4gPSBmYWxzZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93RXJyb3IobXNnKSB7DQogICAgICAgICQoJ2Vycm9yQm94JykudGV4dENvbnRlbnQgPSBtc2c7DQogICAgICAgICQoJ2Vycm9yQm94JykuaGlkZGVuID0gZmFsc2U7DQogICAgICAgIHJlc3VsdHNQYW5lbC5oaWRkZW4gPSBmYWxzZTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBzaG93V2FybmluZ3Mod2FybmluZ3MpIHsNCiAgICAgICAgaWYgKCF3YXJuaW5ncy5sZW5ndGgpIHJldHVybjsNCiAgICAgICAgJCgnd2FybmluZ0JveCcpLnRleHRDb250ZW50ID0gd2FybmluZ3Muam9pbignICcpOw0KICAgICAgICAkKCd3YXJuaW5nQm94JykuaGlkZGVuID0gZmFsc2U7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheVNpbmdsZVJlc3VsdChtYXQsIHJlc3VsdCwgZ3JhZGUsIGxpbSwgcmVmcywgd2VpZ2h0cywgd2FybmluZ3MsIG1vZGUpIHsNCiAgICAgICAgc2hvd1dhcm5pbmdzKHdhcm5pbmdzKTsNCg0KICAgICAgICAkKCdvdmVyYWxsU2NvcmUnKS50ZXh0Q29udGVudCA9IHJlc3VsdC5vdmVyYWxsLnRvRml4ZWQoMSk7DQogICAgICAgIGNvbnN0IGdyYWRlRWwgPSAkKCdmb3JtYWJpbGl0eUdyYWRlJyk7DQogICAgICAgIGdyYWRlRWwudGV4dENvbnRlbnQgPSBncmFkZS5sYWJlbDsNCiAgICAgICAgZ3JhZGVFbC5jbGFzc05hbWUgPSAnbWZnYS1ncmFkZS1iYWRnZSAnICsgZ3JhZGUuY2xzOw0KICAgICAgICAkKCdjb25maWRlbmNlJykudGV4dENvbnRlbnQgPSBnZXRDb25maWRlbmNlTGFiZWwocmVzdWx0LmNvbmZpZGVuY2UpOw0KDQogICAgICAgIHJlbmRlclN1YnNjb3JlcyhyZXN1bHQuc2NvcmVzKTsNCiAgICAgICAgcmVuZGVyUHJvY2Vzc1Njb3JlcyhyZXN1bHQucHJvY2Vzc1Njb3Jlcyk7DQogICAgICAgIHJlbmRlckdhdWdlKHJlc3VsdC5vdmVyYWxsLCBncmFkZSk7DQoNCiAgICAgICAgJGFsbCgnLm1mZ2EtY29tcGFyaXNvbi1jaGFydCcpLmZvckVhY2goKGVsKSA9PiB7IGVsLmhpZGRlbiA9IHRydWU7IH0pOw0KICAgICAgICAkKCdjaGFydHNHcmlkJykuaGlkZGVuID0gdHJ1ZTsNCiAgICAgICAgJCgnY29tcGFyaXNvblRhYmxlV3JhcCcpLmhpZGRlbiA9IHRydWU7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZGlzcGxheUNvbXBhcmlzb25SZXN1bHRzKHJlc3VsdHMsIHJlZnMsIHdlaWdodHMsIHdhcm5pbmdzKSB7DQogICAgICAgIHNob3dXYXJuaW5ncyh3YXJuaW5ncyk7DQoNCiAgICAgICAgY29uc3QgYmVzdCA9IHJlc3VsdHNbMF07DQogICAgICAgICQoJ292ZXJhbGxTY29yZScpLnRleHRDb250ZW50ID0gYmVzdC5yZXN1bHQub3ZlcmFs\",\n    \"bC50b0ZpeGVkKDEpOw0KICAgICAgICBjb25zdCBncmFkZUVsID0gJCgnZm9ybWFiaWxpdHlHcmFkZScpOw0KICAgICAgICBncmFkZUVsLnRleHRDb250ZW50ID0gJ0Jlc3Q6ICcgKyBiZXN0LmdyYWRlLmxhYmVsOw0KICAgICAgICBncmFkZUVsLmNsYXNzTmFtZSA9ICdtZmdhLWdyYWRlLWJhZGdlICcgKyBiZXN0LmdyYWRlLmNsczsNCiAgICAgICAgJCgnY29uZmlkZW5jZScpLnRleHRDb250ZW50ID0gYENvbXBhcmluZyAke3Jlc3VsdHMubGVuZ3RofSBtYXRlcmlhbHNgOw0KDQogICAgICAgIHJlbmRlclN1YnNjb3JlcyhiZXN0LnJlc3VsdC5zY29yZXMpOw0KICAgICAgICByZW5kZXJQcm9jZXNzU2NvcmVzKGJlc3QucmVzdWx0LnByb2Nlc3NTY29yZXMpOw0KICAgICAgICByZW5kZXJHYXVnZShiZXN0LnJlc3VsdC5vdmVyYWxsLCBiZXN0LmdyYWRlKTsNCiAgICAgICAgcmVuZGVyQ29tcGFyaXNvbkNoYXJ0KHJlc3VsdHMpOw0KDQogICAgICAgICRhbGwoJy5tZmdhLWNvbXBhcmlzb24tY2hhcnQnKS5mb3JFYWNoKChlbCkgPT4geyBlbC5oaWRkZW4gPSBmYWxzZTsgfSk7DQogICAgICAgICQoJ2NoYXJ0c0dyaWQnKS5oaWRkZW4gPSBmYWxzZTsNCiAgICAgICAgJCgnY29tcGFyaXNvblRhYmxlV3JhcCcpLmhpZGRlbiA9IGZhbHNlOw0KDQogICAgICAgIGNvbnN0IHRib2R5ID0gJCgnY29tcGFyaXNvblRhYmxlJykucXVlcnlTZWxlY3RvcigndGJvZHknKTsNCiAgICAgICAgdGJvZHkuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIHJlc3VsdHMuZm9yRWFjaCgociwgaWR4KSA9PiB7DQogICAgICAgICAgICBjb25zdCB0ciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7DQogICAgICAgICAgICBjb25zdCBzID0gci5yZXN1bHQuc2NvcmVzOw0KICAgICAgICAgICAgdHIuaW5uZXJIVE1MID0gYA0KICAgICAgICAgICAgICAgIDx0ZD4ke2lkeCArIDF9PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+JHtlc2NhcGVIdG1sKHIubWF0Lm5hbWUpfTwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPjxzdHJvbmc+JHtyLnJlc3VsdC5vdmVyYWxsLnRvRml4ZWQoMSl9PC9zdHJvbmc+PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+JHtyLmdyYWRlLmxhYmVsfTwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPiR7Zm10KHMuZWxvbmcpfTwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPiR7Zm10KHMubil9PC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+JHtmbXQocy5yKX08L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD4ke2ZtdChzLmJlbmQpfTwvdGQ+DQogICAgICAgICAgICAgICAgPHRkPiR7Zm10KHMuZmxkKX08L3RkPg0KICAgICAgICAgICAgICAgIDx0ZD4ke3IucmVzdWx0LmNvbmZpZGVuY2UudG9GaXhlZCgwKX0lPC90ZD4NCiAgICAgICAgICAgICAgICA8dGQ+JHtlc2NhcGVIdG1sKHIubGltLnByaW1hcnkpfTwvdGQ+YDsNCiAgICAgICAgICAgIHRib2R5LmFwcGVuZENoaWxkKHRyKTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gZm10KHYpIHsgcmV0dXJuIHYgIT09IG51bGwgPyB2LnRvRml4ZWQoMCkgOiAn4oCUJzsgfQ0KDQogICAgZnVuY3Rpb24gZXNjYXBlSHRtbChzKSB7DQogICAgICAgIHJldHVybiBTdHJpbmcocykucmVwbGFjZSgvJi9nLCAnJmFtcDsnKS5yZXBsYWNlKC88L2csICcmbHQ7JykucmVwbGFjZSgvPi9nLCAnJmd0OycpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIHJlbmRlclN1YnNjb3JlcyhzY29yZXMpIHsNCiAgICAgICAgY29uc3QgbGFiZWxzID0geyBlbG9uZzogJ0Vsb25nYXRpb24nLCBuOiAnbi1WYWx1ZScsIHI6ICdyLVZhbHVlJywgeXQ6ICdZL1QgUmF0aW8nLCBiZW5kOiAnQmVuZGFiaWxpdHknLCBmbGQ6ICdGTEQnLCBhcmVhOiAnUmVkLiBBcmVhJyB9Ow0KICAgICAgICBjb25zdCBjb250YWluZXIgPSAkKCdzdWJzY29yZXMnKTsNCiAgICAgICAgY29udGFpbmVyLmlubmVySFRNTCA9ICcnOw0KICAgICAgICBPYmplY3QuZW50cmllcyhsYWJlbHMpLmZvckVhY2goKFtrLCBsYWJlbF0pID0+IHsNCiAgICAgICAgICAgIGNvbnN0IHYgPSBzY29yZXNba107DQogICAgICAgICAgICBjb25zdCBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgICAgIGRpdi5jbGFzc05hbWUgPSAnbWZnYS1zdWJzY29yZS1pdGVtJyArICh2ICE9PSBudWxsICYmIHYgPCA0NSA\/ICcgbWZnYS1sb3cnIDogJycpOw0KICAgICAgICAgICAgZGl2LmlubmVySFRNTCA9IGA8c3BhbiBjbGFzcz0ibWZnYS1zdWItbGFiZWwiPiR7bGFiZWx9PC9zcGFuPjxzcGFuIGNsYXNzPSJtZmdhLXN1Yi12YWx1ZSI+JHt2ICE9PSBudWxsID8gdi50b0ZpeGVkKDApIDogJ+KAlCd9PC9zcGFuPmA7DQogICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGl2KTsNCiAgICAgICAgfSk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gcmVuZGVyUHJvY2Vzc1Njb3Jlcyhwcykgew0KICAgICAgICBjb25zdCBsYWJlbHMgPSB7IGJlbmRpbmc6ICdCZW5kaW5nJywgZHJhd2luZzogJ0RlZXAgRHJhd2luZycsIHN0cmV0Y2g6ICdTdHJldGNoJywgc3RhbXBpbmc6ICdTdGFtcGluZycgfTsNCiAgICAgICAgY29uc3QgY29udGFpbmVyID0gJCgncHJvY2Vzc1Njb3JlcycpOw0KICAgICAgICBjb250YWluZXIuaW5uZXJIVE1MID0gJyc7DQogICAgICAgIE9iamVjdC5lbnRyaWVzKGxhYmVscykuZm9yRWFjaCgoW2ssIGxhYmVsXSkgPT4gew0KICAgICAgICAgICAgY29uc3QgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgICAgICBkaXYuY2xhc3NOYW1lID0gJ21mZ2EtcHJvY2Vzcy1pdGVtJzsNCiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBgPGRpdiBjbGFzcz0ibWZnYS1wcm9jZXNzLW5hbWUiPiR7bGFiZWx9PC9kaXY+PGRpdiBjbGFzcz0ibWZnYS1wcm9jZXNzLXZhbHVlIj4ke3BzW2tdLnRvRml4ZWQoMCl9PC9kaXY+YDsNCiAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChkaXYpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJHYXVnZShzY29yZSwgZ3JhZGUpIHsNCiAgICAgICAgY29uc3QgcGN0ID0gc2NvcmUgLyAxMDA7DQogICAgICAgIGNvbnN0IGFuZ2xlID0gLTE4MCArIHBjdCAqIDE4MDsNCiAgICAgICAgY29uc3QgcmFkID0gKGFuZ2xlICogTWF0aC5QSSkgLyAxODA7DQogICAgICAgIGNvbnN0IGN4ID0gOTAsIGN5ID0gOTAsIHIgPSA3MDsNCiAgICAgICAgY29uc3QgeCA9IGN4ICsgciAqIE1hdGguY29zKHJhZCk7DQogICAgICAgIGNvbnN0IHkgPSBjeSArIHIgKiBNYXRoLnNpbihyYWQpOw0KICAgICAgICBjb25zdCBsYXJnZSA9IHBjdCA+IDAuNSA\/IDEgOiAwOw0KICAgICAgICBjb25zdCBjb2xvciA9IGdyYWRlLmNscy5pbmNsdWRlcygnZXhjZWxsZW50JykgPyAnIzFlODQ0OScgOg0KICAgICAgICAgICAgZ3JhZGUuY2xzLmluY2x1ZGVzKCd2ZXJ5Z29vZCcpID8gJyMyN2FlNjAnIDoNCiAgICAgICAgICAgIGdyYWRlLmNscy5pbmNsdWRlcygnZ29vZCcpID8gJyMyOTgwYjknIDoNCiAgICAgICAgICAgIGdyYWRlLmNscy5pbmNsdWRlcygnbW9kZXJhdGUnKSA\/ICcjZDY4OTEwJyA6DQogICAgICAgICAgICBncmFkZS5jbHMuaW5jbHVkZXMoJ2xpbWl0ZWQnKSA\/ICcjZTY3ZTIyJyA6ICcjYzAzOTJiJzsNCg0KICAgICAgICAkKCdnYXVnZVdyYXAnKS5pbm5lckhUTUwgPSBgDQogICAgICAgICAgICA8c3ZnIHZpZXdCb3g9IjAgMCAxODAgMTEwIiB3aWR0aD0iMTgwIiBoZWlnaHQ9IjExMCIgYXJpYS1oaWRkZW49InRydWUiPg0KICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMjAgOTAgQSA3MCA3MCAwIDAgMSAxNjAgOTAiIGZpbGw9Im5vbmUiIHN0cm9rZT0iI2VlZjJmNSIgc3Ryb2tlLXdpZHRoPSIxNCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIi8+DQogICAgICAgICAgICAgICAgPHBhdGggZD0iTSAyMCA5MCBBIDcwIDcwIDAgJHtsYXJnZX0gMSAke3gudG9GaXhlZCgxKX0gJHt5LnRvRml4ZWQoMSl9IiBmaWxsPSJub25lIiBzdHJva2U9IiR7Y29sb3J9IiBzdHJva2Utd2lkdGg9IjE0IiBzdHJva2UtbGluZWNhcD0icm91bmQiLz4NCiAgICAgICAgICAgICAgICA8dGV4dCB4PSI5MCIgeT0iODUiIHRleHQtYW5jaG9yPSJtaWRkbGUiIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiM1NDZlN2EiPkZvcm1hYmlsaXR5PC90ZXh0Pg0KICAgICAgICAgICAgPC9zdmc+YDsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiByZW5kZXJDb21wYXJpc29uQ2hhcnQocmVzdWx0cykgew0KICAgICAgICBjb25zdCBtYXhTY29yZSA9IDEwMDsNCiAgICAgICAgY29uc3QgYmFySCA9IDI4Ow0KICAgICAgICBjb25zdCBnYXAgPSA4Ow0KICAgICAgICBjb25zdCB3ID0gNDAwOw0KICAgICAgICBjb25zdCBoID0gcmVzdWx0cy5sZW5ndGggKiAoYmFySCArIGdhcCkgKyAyMDsNCiAgICAgICAgY29uc3QgY29sb3JzID0gWycjMWU4NDQ5JywgJyMyOTgwYjknLCAnI2Q2ODkxMCcsICcjOGU0NGFkJywgJyMxNmEwODUnLCAnI2MwMzkyYiddOw0K\",\n    \"DQogICAgICAgIGNvbnN0IGJhcnMgPSByZXN1bHRzLm1hcCgociwgaSkgPT4gew0KICAgICAgICAgICAgY29uc3QgYncgPSAoci5yZXN1bHQub3ZlcmFsbCAvIG1heFNjb3JlKSAqICh3IC0gMTIwKTsNCiAgICAgICAgICAgIGNvbnN0IHkgPSAxMCArIGkgKiAoYmFySCArIGdhcCk7DQogICAgICAgICAgICByZXR1cm4gYA0KICAgICAgICAgICAgICAgIDx0ZXh0IHg9IjAiIHk9IiR7eSArIGJhckggLyAyICsgNH0iIGZvbnQtc2l6ZT0iMTEiIGZpbGw9IiMyNjMyMzgiPiR7ZXNjYXBlSHRtbChyLm1hdC5uYW1lLnN1YnN0cmluZygwLCAxNCkpfTwvdGV4dD4NCiAgICAgICAgICAgICAgICA8cmVjdCB4PSIxMTAiIHk9IiR7eX0iIHdpZHRoPSIke2J3LnRvRml4ZWQoMSl9IiBoZWlnaHQ9IiR7YmFySH0iIGZpbGw9IiR7Y29sb3JzW2kgJSBjb2xvcnMubGVuZ3RoXX0iIHJ4PSI0Ii8+DQogICAgICAgICAgICAgICAgPHRleHQgeD0iJHsoMTE1ICsgYncpLnRvRml4ZWQoMCl9IiB5PSIke3kgKyBiYXJIIC8gMiArIDR9IiBmb250LXNpemU9IjExIiBmaWxsPSIjMjYzMjM4Ij4ke3IucmVzdWx0Lm92ZXJhbGwudG9GaXhlZCgwKX08L3RleHQ+YDsNCiAgICAgICAgfSkuam9pbignJyk7DQoNCiAgICAgICAgJCgnY29tcGFyaXNvbkNoYXJ0JykuaW5uZXJIVE1MID0gYDxzdmcgdmlld0JveD0iMCAwICR7d30gJHtofSIgd2lkdGg9IjEwMCUiIGhlaWdodD0iJHtofSIgYXJpYS1sYWJlbD0iTWF0ZXJpYWwgY29tcGFyaXNvbiI+JHtiYXJzfTwvc3ZnPmA7DQogICAgfQ0KDQogICAgaW5pdCgpOw0KfSkoKTsNCg==\"];\n    var bin=atob(p.join(''));\n    var bytes=new Uint8Array(bin.length);\n    for(var i=0;i<bin.length;i++){bytes[i]=bin.charCodeAt(i);}\n    var src=new TextDecoder('utf-8').decode(bytes);\n    (new Function(src))();\n  }catch(e){\n    console.error('Material Formability Grade Assessment Calculator load error:',e);\n  }\n})();\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>The Material Formability Grade Assessment Calculator is a practical engineering tool designed to evaluate how suitable a material is for bending, stamping, deep drawing, and&#8230;<\/p>","protected":false},"author":2,"featured_media":24862,"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":[8709,8710,8697,2408,2396],"class_list":["post-24861","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-materials-science-and-properties","tag-formability-grade","tag-material-assessment","tag-material-formability","tag-metal-forming","tag-sheet-metal","pmpro-has-access"],"acf":[],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/www.mechstream.com\/wp-content\/uploads\/2026\/09\/Material-Formability-Grade-Assessment-Calculator.png","_links":{"self":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24861","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=24861"}],"version-history":[{"count":1,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24861\/revisions"}],"predecessor-version":[{"id":24863,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/posts\/24861\/revisions\/24863"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media\/24862"}],"wp:attachment":[{"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/media?parent=24861"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/categories?post=24861"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.mechstream.com\/ru\/wp-json\/wp\/v2\/tags?post=24861"}],"curies":[{"name":"WP","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}