{"id":13185,"date":"2026-05-20T22:17:17","date_gmt":"2026-05-20T20:17:17","guid":{"rendered":"https:\/\/geopard.tech\/?page_id=13185"},"modified":"2026-09-30T12:26:03","modified_gmt":"2026-09-30T10:26:03","slug":"%d0%ba%d0%b0%d0%bb%d0%ba%d1%83%d0%bb%d0%b0%d1%82%d0%be%d1%80-%d0%bf%d0%be%d0%b2%d1%80%d0%b0%d1%9b%d0%b0%d1%98%d0%b0-%d1%83%d0%bb%d0%b0%d0%b3%d0%b0%d1%9a%d0%b0-%d1%81%d0%b0-%d0%bf%d1%80%d0%be%d0%bc","status":"publish","type":"page","link":"https:\/\/geopard.tech\/srb\/variable-rate-roi-calculator\/","title":{"rendered":"\u041a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430 \u0443\u043b\u0430\u0433\u0430\u045a\u0430 \u0441\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0459\u0438\u0432\u043e\u043c \u0441\u0442\u043e\u043f\u043e\u043c"},"content":{"rendered":"\n<!--\n  Inline hero for \/variable-rate-roi-calculator\/, the FIRST block of the page.\n  Not shared block 13098: that block's copy is Field Data Explorer specific\n  despite the generic name, and it shipped on this page until 2026-09-29.\n\n  Written to root CLAUDE.md rule 24 (Roboto 400\/700, radii on the 2\/4\/6\/8\n  scale, measured surfaces, no decorative gradient or shadow), rule 14\n  (centred) and rule 7 (hides the theme's bare page-title h1).\n-->\n<div class=\"gp-lead\">\n<style>\n\/* Rule 7: the geopard child theme renders the page title as a bare h1 inside\n   #simple_page > .container, so .entry-title \/ .page-title \/ .wp-block-post-title\n   never reach it. The page opens with this hero, so the duplicate goes. *\/\n#simple_page > .container > h1{display:none !important}\n.gp-lead .zrh{--f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;font-family:var(--f);text-align:center;background:#eef4e8;border:1px solid #e3e7da;border-radius:8px;padding:28px 28px 24px;margin:6px 0 20px}\n.gp-lead .zrh-eyebrow{display:inline-block;font-family:var(--f);font-size:.76rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:#15701e;background:#ffffff;border:1px solid #e3e7da;border-radius:4px;padding:5px 11px;margin:0 0 14px}\n.gp-lead .zrh-title{font-family:var(--f);font-size:1.95rem;font-weight:700;line-height:1.18;letter-spacing:-.01em;color:#145328;margin:0 auto 12px;max-width:820px}\n.gp-lead .zrh .lede{font-family:var(--f);font-size:1.04rem;font-weight:400;line-height:1.55;color:#4c6066;margin:0 auto;max-width:820px}\n.gp-lead .zrh-features{display:flex;flex-wrap:wrap;gap:8px;margin:18px 0 0;justify-content:center}\n\/* Rule 22: the marker is the first inline run of the chip's own text, with a\n   hanging indent, so it can never wrap onto a line of its own. Never a flex\n   sibling. *\/\n.gp-lead .zrh-feat{display:inline-block;font-family:var(--f);font-size:.86rem;font-weight:400;color:#212121;background:#ffffff;border:1px solid #e3e7da;border-radius:4px;padding:6px 12px;padding-left:2em;text-indent:-1.4em;text-align:left;max-width:100%}\n.gp-lead .zrh-feat .mk{color:#15701e;font-weight:700;margin-right:.45em}\n.gp-lead .zrh-feat.is-trust{background:transparent;border-color:transparent;color:#4c6066;padding-left:1.6em}\n.gp-lead .zrh-feat.is-trust .mk{color:#4c6066;font-weight:400}\n@media (max-width:820px){\n  .gp-lead .zrh{padding:22px 18px 20px}\n  .gp-lead .zrh-title{font-size:1.5rem}\n  .gp-lead .zrh .lede{font-size:.98rem}\n}\n@media (max-width:480px){\n  .gp-lead .zrh{padding:18px 14px 16px}\n  .gp-lead .zrh-title{font-size:1.3rem}\n}\n<\/style>\n  <div class=\"zrh\">\n    <div class=\"zrh-eyebrow\">Variable rate ROI calculator<\/div>\n    <h1 class=\"zrh-title\">Variable rate pays on the ground that answers. Find out what that is worth on your farm.<\/h1>\n    <p class=\"lede\">Set your crop, your yield, your price and how variable the ground is. Read the net benefit per hectare and per year, held to what published variable-rate trials actually measured, with the whole calculation open to inspect.<\/p>\n    <div class=\"zrh-features\">\n      <span class=\"zrh-feat\"><span class=\"mk\">&#10003;<\/span>Money per hectare, and for the whole farm<\/span>\n      <span class=\"zrh-feat\"><span class=\"mk\">&#10003;<\/span>Counted only on ground that responds<\/span>\n      <span class=\"zrh-feat\"><span class=\"mk\">&#10003;<\/span>The arithmetic, line by line<\/span>\n      <span class=\"zrh-feat is-trust\"><span class=\"mk\">&#128274;<\/span>Nothing leaves your browser<\/span>\n    <\/div>\n  <\/div>\n<\/div>\n\n\n\n<div class=\"gp-roi\" id=\"gp-roi\" data-theme=\"light\">\n<style>\n@font-face{font-family:\"Roboto\";font-style:normal;font-weight:100 900;font-display:swap;src:url(https:\/\/fonts.wp.com\/s\/roboto\/v51\/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3KUBHMdazTgWw.woff2) format(\"woff2\");unicode-range:U+0100-02BA, U+02BD-02C5, U+02C7-02CC, U+02CE-02D7, U+02DD-02FF, U+0304, U+0308, U+0329, U+1D00-1DBF, U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF}\n@font-face{font-family:\"Roboto\";font-style:normal;font-weight:100 900;font-display:swap;src:url(https:\/\/fonts.wp.com\/s\/roboto\/v51\/KFO7CnqEu92Fr1ME7kSn66aGLdTylUAMa3yUBHMdazQ.woff2) format(\"woff2\");unicode-range:U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD}\n.gp-roi{\n  --f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;\n  --ink:#212121; --ink2:#2c3a30; --dim:#4c6066; --faint:#8a9a8e;\n  --accent:#145328; --accent-mid:#15701e; --accent-soft:#1b7a2a; --orange:#f76a0c; --amber:#b0741f;\n  --panel:#ffffff; --paper:#fcfdf9; --paper2:#f6f9f0; --wash:#eef4e8; --wash2:#e4eedd;\n  --hair:#eef2e8; --line:#e3e7da; --mute:#c3cdbf;\n  --r-panel:8px; --r-card:6px; --r-ctl:4px; --r-bar:2px;\n  color:var(--ink2);background:var(--paper);font-family:var(--f);font-size:16px;line-height:1.55;\n  font-variant-numeric:tabular-nums;position:relative\n}\n.gp-roi *{box-sizing:border-box}\n.gp-roi [hidden]{display:none !important}\n.gp-roi p{margin:0}\n.gp-roi .roi-wrap{max-width:1180px;margin:0 auto;padding:18px 16px;display:flex;flex-direction:column;gap:12px}\n\n\/* \u2500\u2500 the region and units strip \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.gp-roi .roi-card{background:var(--panel);border:1px solid var(--line);border-radius:8px;padding:14px 16px}\n.gp-roi .roi-h{font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--accent-mid);margin:0 0 10px}\n.gp-roi .roi-loc{display:flex;flex-wrap:wrap;align-items:center;gap:10px;font-size:.92rem;color:var(--dim)}\n.gp-roi .roi-loc-country{font-weight:700;color:var(--ink)}\n.gp-roi .roi-loc-zone{color:var(--ink2)}\n.gp-roi .roi-loc-stats{display:block;width:100%;color:var(--faint);font-size:.82rem;margin-top:2px}\n.gp-roi .roi-btn2{font-family:var(--f);min-height:44px;padding:0 14px;background:var(--panel);border:1px solid var(--accent);border-radius:4px;color:var(--accent);font-weight:700;font-size:.88rem;cursor:pointer}\n.gp-roi .roi-btn2:hover{background:var(--paper2)}\n.gp-roi .roi-seg{display:inline-flex;border:1px solid var(--line);border-radius:4px;overflow:hidden}\n.gp-roi .roi-seg button{font-family:var(--f);font-size:.88rem;font-weight:400;min-height:44px;padding:0 14px;background:var(--panel);border:0;color:var(--dim);cursor:pointer}\n.gp-roi .roi-seg button + button{border-left:1px solid var(--line)}\n.gp-roi .roi-seg button.on{background:var(--accent);color:#ffffff;font-weight:700}\n\n\/* \u2500\u2500 the region picker \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.gp-roi .roi-picker{display:none;flex-direction:column;gap:10px;margin-top:12px;padding:12px;background:var(--paper2);border:1px solid var(--hair);border-radius:6px}\n.gp-roi .roi-picker.show{display:flex}\n.gp-roi .roi-picker-tabs{display:inline-flex;border:1px solid var(--line);border-radius:4px;overflow:hidden;align-self:flex-start;background:var(--panel)}\n.gp-roi .roi-picker-tab{font-family:var(--f);font-size:.86rem;font-weight:400;min-height:44px;padding:0 16px;background:var(--panel);border:0;color:var(--dim);cursor:pointer}\n.gp-roi .roi-picker-tab + .roi-picker-tab{border-left:1px solid var(--line)}\n.gp-roi .roi-picker-tab.on{background:var(--accent);color:#ffffff;font-weight:700}\n.gp-roi .roi-picker-list{display:flex;flex-direction:column;gap:8px}\n.gp-roi .roi-picker-grp{display:flex;align-items:flex-start;gap:12px;padding:8px 0;border-top:1px solid var(--line);flex-wrap:wrap}\n.gp-roi .roi-picker-grp:first-child{border-top:0;padding-top:0}\n.gp-roi .roi-picker-grp-h{flex:none;min-width:120px;font-size:.72rem;text-transform:uppercase;letter-spacing:.04em;color:var(--accent-mid);font-weight:700;padding-top:12px}\n.gp-roi .roi-picker-grp-row{display:flex;flex-wrap:wrap;gap:6px;flex:1;min-width:0}\n.gp-roi .roi-picker-list button{font-family:var(--f);background:var(--panel);border:1px solid var(--line);color:var(--ink2);min-height:44px;padding:0 12px;border-radius:4px;font-size:.88rem;cursor:pointer}\n.gp-roi .roi-picker-list button:hover{border-color:var(--accent-soft);color:var(--accent)}\n.gp-roi .roi-picker-list button.on{background:var(--accent);color:#ffffff;border-color:var(--accent);font-weight:700}\n.gp-roi .roi-map{width:100%;max-width:840px;aspect-ratio:2.216;margin:0 auto;display:block;background:var(--panel);border:1px solid var(--line);border-radius:6px}\n.gp-roi .roi-map path.sea{fill:var(--paper2);stroke:var(--line);stroke-width:.7;vector-effect:non-scaling-stroke}\n.gp-roi .roi-map path.grat{fill:none;stroke:var(--mute);stroke-opacity:.45;stroke-width:.5;vector-effect:non-scaling-stroke}\n.gp-roi .roi-map path.c{fill:var(--wash2);stroke:var(--panel);stroke-width:.5;vector-effect:non-scaling-stroke}\n.gp-roi .roi-map path.near{fill:var(--accent-soft);fill-opacity:.34}\n.gp-roi .roi-map path.own{fill:var(--accent-soft)}\n.gp-roi .roi-map path.hit{cursor:pointer}\n.gp-roi .roi-map path.hit:hover{fill:var(--accent);fill-opacity:1}\n.gp-roi .roi-map path.on{fill:var(--orange);fill-opacity:1}\n.gp-roi .roi-map path.hit:focus{outline:none;stroke:var(--ink);stroke-width:1.4}\n.gp-roi .roi-map-key{display:flex;flex-wrap:wrap;gap:12px;justify-content:center;margin-top:8px;font-size:.82rem;color:var(--faint)}\n.gp-roi .roi-map-key span{display:inline-flex;align-items:center;gap:6px}\n.gp-roi .roi-map-key i{width:12px;height:12px;border-radius:2px;display:inline-block}\n.gp-roi .roi-map-key i.own{background:var(--accent-soft)}\n\/* --accent-soft at the map's own .34 fill-opacity over white *\/\n.gp-roi .roi-map-key i.near{background:#c0d7c4}\n.gp-roi .roi-map-key i.off{background:var(--wash2)}\n\n\/* \u2500\u2500 inputs \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.gp-roi .roi-grid{display:grid;grid-template-columns:1fr;gap:12px;align-items:start}\n.gp-roi .roi-col{display:flex;flex-direction:column;gap:12px}\n.gp-roi .roi-row{display:flex;align-items:center;gap:10px;margin-bottom:10px}\n.gp-roi .roi-row:last-child{margin-bottom:0}\n.gp-roi .roi-row > .roi-lab{flex:none;width:72px;color:var(--faint);font-size:.82rem}\n.gp-roi .roi-grp{display:flex;align-items:center;gap:6px;flex:1;min-width:0}\n.gp-roi .roi-in,.gp-roi .roi-sel{font-family:var(--f);font-size:.95rem;font-weight:400;color:var(--ink);background:var(--panel);border:1px solid var(--line);border-radius:4px;min-height:44px;padding:6px 10px;width:100%;-moz-appearance:textfield}\n.gp-roi .roi-in::-webkit-outer-spin-button,.gp-roi .roi-in::-webkit-inner-spin-button{-webkit-appearance:none;margin:0}\n.gp-roi .roi-in:focus,.gp-roi .roi-sel:focus{outline:2px solid var(--accent-soft);outline-offset:-1px}\n.gp-roi .roi-unit{color:var(--faint);font-size:.86rem;flex:none}\n.gp-roi .roi-hint{color:var(--faint);font-size:.84rem;margin-top:10px;line-height:1.5}\n.gp-roi .roi-varseg{display:flex;border:1px solid var(--line);border-radius:4px;overflow:hidden}\n.gp-roi .roi-varseg button{flex:1;font-family:var(--f);font-size:.9rem;font-weight:400;min-height:44px;background:var(--panel);border:0;color:var(--dim);cursor:pointer}\n.gp-roi .roi-varseg button + button{border-left:1px solid var(--line)}\n.gp-roi .roi-varseg button.on{background:var(--accent);color:#ffffff;font-weight:700}\n.gp-roi .roi-tog{display:flex;align-items:center;gap:10px;min-height:44px;cursor:pointer;font-size:.95rem;color:var(--ink2)}\n.gp-roi .roi-tog input{width:20px;height:20px;flex:0 0 20px;accent-color:#145328;margin:0;cursor:pointer}\n.gp-roi .roi-tog-w{margin-left:auto;font-size:.8rem;color:var(--faint)}\n\n\/* \u2500\u2500 the answer \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\n.gp-roi .roi-res{background:var(--wash);border:1px solid var(--line);border-radius:8px;padding:20px}\n.gp-roi .roi-res-l{font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--accent-mid);margin:0 0 8px}\n.gp-roi .roi-res-main{font-size:clamp(1.7rem,4.4vw,2.5rem);font-weight:700;color:var(--ink);letter-spacing:-.03em;line-height:1.05}\n.gp-roi .roi-res-u{font-size:.86rem;color:var(--dim);margin-top:4px}\n.gp-roi .roi-res-hr{height:1px;background:var(--hair);margin:16px 0;border:0}\n.gp-roi .roi-res-tot{font-size:clamp(1.25rem,3vw,1.7rem);font-weight:700;color:var(--ink);letter-spacing:-.02em;line-height:1.1}\n.gp-roi .roi-respbar{margin-top:16px}\n.gp-roi .roi-respbar-t{font-size:.82rem;color:var(--dim);margin-bottom:6px}\n.gp-roi .roi-respbar-t b{color:var(--ink)}\n.gp-roi .roi-bar{display:flex;height:12px;border-radius:2px;overflow:hidden;border:1px solid var(--mute);background:var(--panel)}\n.gp-roi .roi-bar-on{background:var(--accent-mid);border-radius:0}\n.gp-roi .roi-bar-off{background:var(--wash2);border-radius:0}\n.gp-roi .roi-src{font-size:.82rem;color:var(--faint);margin-top:14px;line-height:1.5}\n.gp-roi .roi-link{font-family:var(--f);background:transparent;border:0;padding:10px 0;min-height:44px;color:var(--accent-mid);text-decoration:underline;text-underline-offset:2px;font-size:.9rem;cursor:pointer}\n.gp-roi .roi-math{margin-top:4px;padding:12px;background:var(--panel);border:1px solid var(--hair);border-radius:6px}\n.gp-roi .roi-math table{width:100%;border-collapse:collapse;font-size:.86rem}\n.gp-roi .roi-math td{padding:6px 0;border-top:1px solid var(--hair);vertical-align:top;color:var(--ink2)}\n.gp-roi .roi-math tr:first-child td{border-top:0}\n.gp-roi .roi-math td:last-child{text-align:right;white-space:nowrap;padding-left:10px;font-weight:700;color:var(--ink)}\n.gp-roi .roi-math tr.tot td{border-top:1px solid var(--mute)}\n.gp-roi .roi-cta{display:flex;align-items:center;justify-content:center;gap:8px;background:var(--accent);color:#ffffff;border:0;min-height:48px;padding:12px 16px;border-radius:4px;font-family:var(--f);font-weight:700;font-size:1rem;cursor:pointer;text-decoration:none;width:100%;margin-top:14px}\n.gp-roi .roi-cta:hover{background:var(--accent-mid);color:#ffffff}\n.gp-roi .roi-xlink{display:flex;align-items:center;gap:10px;background:var(--panel);border:1px solid var(--line);border-radius:6px;padding:12px 14px;margin-top:8px;color:var(--ink2);text-decoration:none;min-height:44px}\n.gp-roi .roi-xlink:hover{border-color:var(--accent-soft);color:var(--accent)}\n.gp-roi .roi-xlink-t{flex:1;min-width:0;line-height:1.35;font-size:.9rem}\n.gp-roi .roi-xlink-t b{display:block;color:var(--ink);font-size:.95rem}\n.gp-roi .roi-arr{flex:none;color:var(--accent-mid);font-weight:700}\n\n\/* Floating value tooltip. The one place a shadow is earned: it sits above the\n   page rather than in it. Declared in the design gate's allowShadow list. *\/\n.gp-roi .roi-tip{position:fixed;z-index:40;max-width:280px;padding:8px 10px;background:var(--panel);border:1px solid var(--mute);border-radius:4px;font-size:.84rem;line-height:1.4;color:var(--ink2);box-shadow:0 2px 10px rgba(20,83,40,.14);pointer-events:none}\n\n@media (min-width:1000px){\n  .gp-roi .roi-grid{grid-template-columns:1.7fr 1fr;gap:16px}\n  .gp-roi .roi-col:nth-child(2){position:sticky;top:18px}\n}\n@media (min-width:1200px){\n  .gp-roi .roi-wrap{padding:22px 18px}\n  .gp-roi .roi-grid{grid-template-columns:1.9fr 1.05fr;gap:18px}\n  .gp-roi .roi-col:first-child{display:grid;grid-template-columns:1fr 1fr;grid-template-areas:\"field var\" \"field prac\";gap:12px;align-content:start}\n  .gp-roi .roi-col:first-child > .roi-card:nth-child(1){grid-area:field;align-self:start}\n  .gp-roi .roi-col:first-child > .roi-card:nth-child(2){grid-area:var}\n  .gp-roi .roi-col:first-child > .roi-card:nth-child(3){grid-area:prac}\n  .gp-roi .roi-res{padding:24px}\n}\n@media (max-width:820px){\n  .gp-roi .roi-wrap{padding:14px 12px;gap:10px}\n  .gp-roi .roi-row{flex-wrap:wrap;gap:6px}\n  .gp-roi .roi-row > .roi-lab{width:100%}\n  .gp-roi .roi-picker-grp-h{min-width:100%;padding-top:0}\n}\n@media (max-width:480px){\n  .gp-roi .roi-card,.gp-roi .roi-res{padding:14px 12px}\n  .gp-roi .roi-tip{max-width:220px}\n}\n<\/style>\n\n<div class=\"roi-wrap\">\n\n  <div class=\"roi-card\">\n    <div class=\"roi-h\">Where you farm<\/div>\n    <div class=\"roi-loc\" id=\"roi-locale\">\n      <span class=\"roi-loc-country\" id=\"roi-loc-country\">Detecting your region<\/span>\n      <span id=\"roi-loc-sep\" hidden>\u00b7<\/span>\n      <span class=\"roi-loc-zone\" id=\"roi-loc-zone\"><\/span>\n      <button class=\"roi-btn2\" id=\"roi-loc-edit\" type=\"button\" aria-controls=\"roi-locale-picker\" aria-expanded=\"false\">Change region<\/button>\n      <span class=\"roi-seg\" id=\"roi-units\"><button type=\"button\" data-u=\"metric\">Hectares<\/button><button type=\"button\" data-u=\"imperial\">Acres<\/button><\/span>\n      <span class=\"roi-loc-stats\" id=\"roi-loc-stats\"><\/span>\n    <\/div>\n    <div class=\"roi-picker\" id=\"roi-locale-picker\" role=\"region\" aria-label=\"Pick a different region\">\n      <div class=\"roi-picker-tabs\" role=\"tablist\" aria-label=\"Region picker mode\">\n        <button type=\"button\" class=\"roi-picker-tab on\" data-view=\"map\" role=\"tab\" aria-selected=\"true\">Map<\/button>\n        <button type=\"button\" class=\"roi-picker-tab\" data-view=\"list\" role=\"tab\" aria-selected=\"false\">List<\/button>\n      <\/div>\n      <div class=\"roi-picker-map\" id=\"roi-picker-map\" role=\"tabpanel\">\n        <svg class=\"roi-map\" id=\"roi-map\" role=\"img\" aria-label=\"World map. Pick a country to load its defaults.\"><\/svg>\n        <div class=\"roi-map-key\"><span><i class=\"own\"><\/i>Its own yields and prices<\/span><span><i class=\"near\"><\/i>Uses the nearest covered country<\/span><span><i class=\"off\"><\/i>Not covered yet<\/span><\/div>\n      <\/div>\n      <div class=\"roi-picker-list\" id=\"roi-picker-list\" role=\"tabpanel\" hidden><\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"roi-grid\">\n    <div class=\"roi-col\">\n\n      <div class=\"roi-card\">\n        <div class=\"roi-h\">The field<\/div>\n        <div class=\"roi-row\">\n          <span class=\"roi-lab\">Area<\/span>\n          <span class=\"roi-grp\">\n            <input class=\"roi-in\" type=\"number\" id=\"roi-area\" value=\"100\" min=\"0.1\" step=\"1\">\n            <select class=\"roi-sel\" id=\"roi-area-u\" style=\"width:auto\"><option value=\"ha\">ha<\/option><option value=\"ac\">ac<\/option><\/select>\n          <\/span>\n        <\/div>\n        <div class=\"roi-row\">\n          <span class=\"roi-lab\">Crop<\/span>\n          <span class=\"roi-grp\">\n            <select class=\"roi-sel\" id=\"roi-crop\">\n              <option value=\"corn\">Corn<\/option>\n              <option value=\"soybean\">Soybean<\/option>\n              <option value=\"wheat\">Wheat<\/option>\n              <option value=\"sunflower\">Sunflower<\/option>\n              <option value=\"rapeseed\">Rapeseed \/ canola<\/option>\n              <option value=\"cotton\">Cotton<\/option>\n              <option value=\"potato\">Potato<\/option>\n              <option value=\"other\">Other<\/option>\n            <\/select>\n          <\/span>\n        <\/div>\n        <div class=\"roi-row\">\n          <span class=\"roi-lab\">Yield<\/span>\n          <span class=\"roi-grp\">\n            <input class=\"roi-in\" type=\"number\" id=\"roi-yield\" value=\"10\" min=\"0.1\" step=\"0.5\">\n            <span class=\"roi-unit\" id=\"roi-yield-u\">t\/ha<\/span>\n          <\/span>\n        <\/div>\n        <div class=\"roi-row\">\n          <span class=\"roi-lab\">Price<\/span>\n          <span class=\"roi-grp\">\n            <span class=\"roi-unit\" id=\"roi-price-sym\">$<\/span>\n            <input class=\"roi-in\" type=\"number\" id=\"roi-price\" value=\"200\" min=\"0\" step=\"10\">\n            <span class=\"roi-unit\" id=\"roi-price-u\">\/t<\/span>\n          <\/span>\n        <\/div>\n      <\/div>\n\n      <div class=\"roi-card\">\n        <div class=\"roi-h\">How variable the ground is<\/div>\n        <div class=\"roi-varseg\" id=\"roi-var\">\n          <button type=\"button\" data-v=\"low\">Low<\/button>\n          <button type=\"button\" data-v=\"medium\" class=\"on\">Medium<\/button>\n          <button type=\"button\" data-v=\"high\">High<\/button>\n        <\/div>\n        <p class=\"roi-hint\" id=\"roi-var-hint\">Yield swings 10 to 25 percent across the field. Half the ground responds to a changed rate.<\/p>\n      <\/div>\n\n      <div class=\"roi-card\">\n        <div class=\"roi-h\">What you would vary<\/div>\n        <label class=\"roi-tog\"><input type=\"checkbox\" data-pr=\"n\" checked><span>Nitrogen<\/span><span class=\"roi-tog-w\">best evidenced<\/span><\/label>\n        <label class=\"roi-tog\"><input type=\"checkbox\" data-pr=\"seed\" checked><span>Seeding rate<\/span><span class=\"roi-tog-w\"><\/span><\/label>\n        <label class=\"roi-tog\"><input type=\"checkbox\" data-pr=\"pk\"><span>P and K fertilizer<\/span><span class=\"roi-tog-w\"><\/span><\/label>\n        <label class=\"roi-tog\"><input type=\"checkbox\" data-pr=\"lime\"><span>Lime and pH correction<\/span><span class=\"roi-tog-w\"><\/span><\/label>\n        <label class=\"roi-tog\"><input type=\"checkbox\" data-pr=\"crop\"><span>Crop protection<\/span><span class=\"roi-tog-w\">thinnest evidence<\/span><\/label>\n        <p class=\"roi-hint\">Adding a second operation is worth less than the first, and a fifth less again. The page prices them that way.<\/p>\n      <\/div>\n\n    <\/div>\n\n    <div class=\"roi-col\">\n      <div class=\"roi-res\">\n        <p class=\"roi-res-l\">Net benefit, a normal year<\/p>\n        <div class=\"roi-res-main\"><span id=\"roi-per-low\">0<\/span> to <span id=\"roi-per-high\">0<\/span><\/div>\n        <div class=\"roi-res-u\" id=\"roi-per-unit\">per hectare of the whole farm<\/div>\n        <hr class=\"roi-res-hr\">\n        <div class=\"roi-res-tot\"><span id=\"roi-tot-low\">0<\/span> to <span id=\"roi-tot-high\">0<\/span><\/div>\n        <div class=\"roi-res-u\">across <span id=\"roi-tot-area\">100 ha<\/span>, every year<\/div>\n\n        <div class=\"roi-respbar\">\n          <div class=\"roi-respbar-t\">Paid on the <b id=\"roi-resp-pct\">50%<\/b> of your ground that answers a changed rate<\/div>\n          <div class=\"roi-bar\" id=\"roi-bar\" tabindex=\"0\" role=\"img\">\n            <span class=\"roi-bar-on\" id=\"roi-bar-on\" style=\"width:50%\"><\/span>\n            <span class=\"roi-bar-off\" id=\"roi-bar-off\" style=\"width:50%\"><\/span>\n          <\/div>\n        <\/div>\n\n        <p class=\"roi-src\" id=\"roi-src\"><\/p>\n        <button class=\"roi-link\" type=\"button\" id=\"roi-math-toggle\" aria-expanded=\"false\" aria-controls=\"roi-math\">Show the math<\/button>\n        <div class=\"roi-math\" id=\"roi-math\" hidden><\/div>\n\n        <a class=\"roi-cta\" href=\"https:\/\/app.geopard.tech\/signup?utm_source=vra-roi-calc&amp;utm_medium=wp-embed&amp;utm_campaign=roi-calc\" target=\"_blank\" rel=\"noopener\">Find your responsive ground<span class=\"roi-arr\">&rarr;<\/span><\/a>\n        <a class=\"roi-xlink\" href=\"\/guidance-lines\/\">\n          <span class=\"roi-xlink-t\"><b>More to save before the rate changes<\/b>Test pass direction and overlap on the Guidance Lines Simulator<\/span>\n          <span class=\"roi-arr\">&rarr;<\/span>\n        <\/a>\n      <\/div>\n    <\/div>\n  <\/div>\n\n  <div class=\"roi-tip\" id=\"roi-tip\" hidden><\/div>\n<\/div>\n\n<!-- GPV-GEO BEGIN -->\n<script type=\"application\/json\" id=\"gpv-geo\" nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">{\"q\":20,\"c\":[{\"i\":\"242\",\"n\":\"Fiji\",\"r\":[\"0-G7VKGOLFTtBADSOMSD\"],\"a\":\"FJ\"},{\"i\":\"834\",\"n\":\"Tanzania\",\"r\":[\"sqBlB4E1CCX6BnBRvBCXaNJhCe_BOHfX3DfvBKdBJ2BVenBGvCkBVyBXYJwCQCoBsBLmBMECYPWsEI\"],\"a\":\"TZ\"},{\"i\":\"732\",\"n\":\"W. Sahara\",\"r\":[\"5KyiBBlChECAnDlBBHVG3B7EAHNCQ6CEWgBM4B4BqBS0BOCMgBiCBmBKGW\"]},{\"i\":\"124\",\"n\":\"Canada\",\"r\":[\"x5Eo9BvD4BnCSViBGazBQFgBvBeBUWUAYjCahCqCzC4BvCjB_BsBtCMA4L0Ff0Ce6BF-DccPeIIUcDkCjB0BaGdyBGOMyBB6Ef-CD2BT3BToCHuEMqBXsBUnBQaOwCGoCfuBEmCR4DGDYkBI-BNBlBagBgBBSoB3CqBCsBwBc0BFoBR4BrBjBTqCHApB2BgBwBZLdmBZqBcckBEsB0DJ0BTETdTcVFTtCb3BFnBM9BnCvBZ3BBfRBZvBDvBhBrBrBPfBtB8BFkBjC4BIqCRmChB8CbuDFHhBMnBetB8BlBeOWoBTgCdUgCUuBcWcBabiBvBeuBqBdiDcKuDNgBK2CjBOPmCDMzCmBFcX6BWgCgCgEnEPX6CtB4CVQhBgBFQPCrB5BdhCNxBfhCF7FGhBdxBRnD5CiBIgC0B0CiB8BEkBTlBbanC0BTiCGoBsBCbaPxBZ_DnBrBbdCBiBmCiBtDFZWA2BRMZFNKddZxBdHDJlEAtC1BrCBRFIXrEvBbOoB-BPoCpBSGIREJQRBLSrE4BhBL_BKfDrDULIFWNAAPziBA\",\"_oDiuCeS2BAAHtBVbCJK\",\"1jDg7CtBWCOwDBkCVEJrEB\",\"rkD0tCOMcJPTRCHQ\",\"_0D49CVPpDOUS6BKyBZ\",\"p1D8gD7CCLMyCBcFFF\",\"94DuiDwBNLN5BHfKRODQsCD\",\"luDg9CpFSTqBnBQxCGtBMOQuGNiBNHPmCRwDDyGIsBNIRzCR3HB\",\"hrE2hD4BFNLpCL7BOgBM8BE\",\"1qEwiD0BHzDHqBSWB\",\"vlCkgCvB7BaOcHNNiBLUKmBLLdcIStBPjBtBGKiBLEtBhBXAcUlBK3DBFMYORKiBaqB-BYYkBOSBHL\",\"7oDsxC6CZEReCcLjBN9BKVS_CpBNY1BDiBUSkCeDGRWGWJ\",\"tiDu6CmBQuEnBGPqCIqBZgDPkBPmBjBpCT-EhB6BjB-BDLblCtBxBS9BmBzBFFVyDzBanBNd3EsBiD5BINtDQzCWxBUOM1DoBCLzDFhBMae-EGNOOU0BoBZetEiBYKpBYhCQVLnCDnJafOqBS5BALqBekBqBQmDKbZgBXkBgBmDQkCpBFZwCM\",\"j2D28CgFL7BjBvBHpBdtBCZkBCUUQoBM\",\"x5Ek_C2E4B0DGFddNvFZ1BI\",\"7lFyjCmBCLrBiBfPA5BwBFeUD\",\"7jEkjD8FTuBjBjES5CCoBMvBIDQ\",\"r6E08BTFhCU3BmBnBIPWEIoDRiBfoBRQV\",\"93Ei9CgFJyCdzElBxBbAPpDTTS9CUwCqClBYmEG\",\"3mE6-CsCEIRXTnEFjDR9BADMyCSzFD3BG2BoBmBMwDNoCXmCD5BoBkBOqBDehB\",\"jlEs7CsBRmBhCqElBDRhCDaPNNrESlJZVS1BMjBFxBgBmGQtCKtEBVO-CQjEK-BuBqDYqBHTR4CM4BTuBUkBLgBnBUQbqBkBGoBF\",\"x9D86CrBawBUwBHmCEMLlBR8BRFjBhCPlBE_DuBAOyCF\",\"nlEg8C2BCeJjBZ9BcOG\",\"j7D8_CeRCTRdhCDrBGCYhCDBgBiFO\",\"_3D4kDkCQRI-CCyBVmEPgBZwBLhEpB5ECpBQAOgBMnCBtBOXScS\",\"vyDsmD6FQ6BO8CNgBW8DMiIE4IHgFPBLlHhB2CA9EjBlCfjHT2BDZHgBRtF1BGHkCAAHpDXnDK1DFnEGDUqCKTciEN1Ba_BGgBQmCKMO3BQRUuEF-BOlHClCOvCcJO\",\"_9Cq0CZLtBBJUSWkBGgBLDV\",\"p4D82CYPXN1BMhBD1BSgCeuCZ\",\"zwCq-BiCFqBXnCMjBS\",\"_vC66BOTiCDhBTzBSJOQM\"],\"a\":\"CA\"},{\"i\":\"840\",\"n\":\"United States of America\",\"r\":[\"x5Eo9B0iBAAQOAGVMHsDTgBEgCJiBMsE3BMRSCKPSDFHqBRQnClB5BQR2EwBHYSGsCCuC2BmEAEKeIayBeeOJaGSLA1BiBjB9DrBbhBBTOVQADOMJBJ1Eb6BGMF3BLXELLMAJdbdZWUrBjBvBKeVODiBHRIXZGcNClBMBI1BXdpBLZVnBRFNrBZpBpBFbIbyB9DNjCdAHSNItByCIapB4BPGnBRzBe_DJQhBHFPGrBFdWhBFbK7BLhDhCJtBKhBPA5BUTwB5BqCbQhBBXfhBMTMXsB5BsBlCAAPtDA3EuBEIhDFFUrBcDMzCWFWlBoBfiCxBuBDgBVWIkCNeQmBKoCH2BX2BGI6BNUlBKKTiC\",\"niGkZYXjBXJGDaIWSF\",\"hwGwrCeDEPXFxBSoBI\",\"x_FuoCcBQLpChBTKFS4BU\",\"nwFk3CA3LuCLgCrBwCkB0C3BiCpCkCZAXVT3BcLiBzBiBVkBlDEtBMxCqBrDW3BD9DkBtBJKZzEhBFYSoBqBMJKnEtCcTlBbxCdJP9BVNRtBRbEtDlBlCLFG-D2ByBEqCoBoBWGgBUWtBLLIVPZWLPNU_BPEoBZOzBH9BcAWdSOYwBqB8BDgBUcDgBMHSVIcQtCRfI3BD5BKjCmByEmBgBAFT0CAfavBOjCmB1BMWWmCA0BSIUqBUyDWmBD8BW-BHcRSIkCBBJ8BFqBEgGV0BGoDR\",\"12G4vC6DThBLrBQjBDJECQ\"],\"a\":\"US\"},{\"i\":\"398\",\"n\":\"Kazakhstan\",\"r\":[\"mtDw9BdZhBDBnBVRtCOdnCjDZkBjCZLCVrBUrEC5BQVHFXhCOZFJRrChBPdPAJUzBAHiBTAEoBvBezDJlBkBlDwBlDXAzETBbgBZKtBHRLIaHOtBORkBVKBMoBDAeiBGkBFGoBFYnBBhBKzCZTGEWZadBhBcYeLIgBsBqBVEcyCsBgCAmErBsBS-BA0BTMM4BBKShCcoBUHKmBMbaSO2EO2DYkBSoCJOnBqBKyBNDVoBCkDmBPL0Bf6ClDUW4BX6BK2C1B0BGUZ\"],\"a\":\"KZ\"},{\"i\":\"860\",\"n\":\"Uzbekistan\",\"r\":[\"-lC0zBA0EmDYmDvBmBjB0DKwBdDnBUAIhB0BAKTQAQesCiBMDhBZeNcKwBVxBbvBCFMISzBHfvBhBCJReJIdVnB1BICY_CmBlCuBTqB5BENKFezBWjCjBGVtBA\"],\"a\":\"UZ\"},{\"i\":\"598\",\"n\":\"Papua New Guinea\",\"r\":[\"owFnDwExByBpBGViCZKTlBDKbkBZapBWCBRgBHLFqBRDLZBJKrCK1BwBTkBzBQ5BXEddN_BKBkI\",\"6-FxEONGTLJRmBlCqBMKkCtB\",\"k9FpHpBRVA3BWEM6BBMUEVWEiBcDYYAIFBVLZVBFL\",\"uhG1GyBvBDJLDROZ4BGEEL\"],\"a\":\"PG\"},{\"i\":\"360\",\"n\":\"Indonesia\",\"r\":[\"owFnDCjIjBgBnBIJLzBASgBYMbsCtCiBhBE7BkBLRNDJgBdUqBOeBDM5BAPYjBGRU2BKWOgCRQtCqBXiBqBuBYkBAgCbqBH\",\"m8EjLGTZdnBDWmBmBQ\",\"4nFzIDeQcKdVb\",\"szEmFXjBelBHRuBlBvBDLbAjBlBbPjDFOtBRPYbCTOvBPNU7BCF2BTMRiBFiBEmBYaIZaX0BGYUSEmBLgBKyByDyCF\",\"2hFvDsBLQdhBQzCCKWwBC\",\"y-E3EZIHQoBCKLPN\",\"-_E2CCTYDEPBjBVEFXSVLDPaLyBWuB\",\"25EkBuBAmBeIJflBdHnBIjDHFdkBjBUSsCODTRGPVjBPmBzBHNkBtBAZTLPOSiBlBPJMEObYCmBZLGnDZDRKMmBFmBPANcSaa8CqBuByCP\",\"s2E5M1BcmBIkBXDLPA\",\"23E1K-BSFV7BL1BGAOgBIaL\",\"6zEtKaCKP_CNOYWAKOOJ\",\"0nE_HEPuCDISqCTQZ8BHwBVtBPrBQtCCvDaPDpCQFQlBEcmBwBByBR\",\"uiErBWxBcDUXLvDrBAzCiCvB4BxB2CjBiBZgCjBaTiBnCiCDW4CJ-D9DoBAiBbYhBeRPfkBP\"],\"a\":\"ID\"},{\"i\":\"032\",\"n\":\"Argentina\",\"r\":[\"51C5hCkBvB0BX4BJRTlBBTOjCCA4C\",\"_nC3lBjBpF0BhBFbYPBTlBzB7BT7DFKVJdIVXNnBDnBONJEnBcLWMMTlBLfZN9BlBAfTLdoBdmBHNjBtBVZtBlBPPTOnBaX1EORWCeZBPOBsBeQMaDUWiBO2BDYSGFQRIOQRQJuBQIFwBUuCYOLsCeaBiBYmBAmBJGTmCaoBDoBOkB2B-BLQIMAkCqBSOqBDKiBkB0BJWbQgBuBBwCpCgBF6CrBGRlB7B0CRgBGkBgBGiBUIUVAf7BnBhD7C\"],\"a\":\"AR\"},{\"i\":\"152\",\"n\":\"Chile\",\"r\":[\"51C5hCA3CkCBNPhBLxDW7CsB1BsBuEvBiBsBkBScF\",\"_2C_VUZGdUPLlBkBjDeEEJNpBpBRAjCHLMP1B9BNjBEnBZnBUlCKFAlBXlBChBdZMrCXNTtCGvBPHKtBSPNPSHGPRFEXN1BVhBETLZdPCrBQNaCBdSVmELjBA3BXFlBRArBM_C0BLYKYTaDmCQmBqBe7BMmBkBOiCsBNWyCbMLxBZEakEUcP0CSCkC8FH8BMgBFyBYwBgB6HJ6DUKKU\"],\"a\":\"CL\"},{\"i\":\"180\",\"n\":\"Dem. Rep. Congo\",\"r\":[\"2kBzFKvCYXWxBvCHLXIRL3CoBVKGEpBdAfoBdEJWXNfGNSrBEBMzCFCwBLQCwBHoBxBAEOTAbHPhBVGnBHXiBT0B1DCrBJDMKEIcYEOQWASR4B4BBiBSmByB2BK2CUuBG0BkBiB8Bd6BJSaSDsBUeFUMkCAahBSDyBMuBrBDtBQFbXXnBJtCLJJxBKRCvB\"]},{\"i\":\"706\",\"n\":\"Somalia\",\"r\":[\"g0BjCXiBAyEuB6BYAkBc0BCgFyFAuC2CYB1BT5BtC5ExCjDnElD9BvC\"]},{\"i\":\"404\",\"n\":\"Kenya\",\"r\":[\"gxB7F5BoBBY3E2CAqBuBoCViCTc0ByBUFAVONcAyBhB6BHMSkBQQNcAhBrBAxEYhB1BhBZnCPN\"],\"a\":\"KE\"},{\"i\":\"729\",\"n\":\"Sudan\",\"r\":[\"2eqKrBcEuBVYbuCNBOeDSMMHKc2BkBDBwFuBAAwC6OAanEkBXTVdHLLV1CBxB7BpDTJJtCLiCTOA8BRCBJZBOhBpBzBTDhBYpBjBpCKNHlBmBdFT1BZLaN\"],\"a\":\"SD\"},{\"i\":\"148\",\"n\":\"Chad\",\"r\":[\"6dwYC_EjBEb1BIJLLERNdOCW7BtBXbpBlBTxBAENlBdxBPPKHJfDGMRsBpBeIS0BAVkBA0BPaEUZAAaPOQ2B0BmBC0BYiDfkBJ-BoBWgK3E\"]},{\"i\":\"332\",\"n\":\"Haiti\",\"r\":[\"z5C0YAjBJHKVlCGRFVMEMiCHOIRSAQXGIK8BH\"],\"a\":\"HT\"},{\"i\":\"214\",\"n\":\"Dominican Rep.\",\"r\":[\"z5CyWJWKIEsBiCJINWABLmBPPPxBKVJFKNFPbLS\"],\"a\":\"DO\"},{\"i\":\"643\",\"n\":\"Russia\",\"r\":[\"o1DqlD2CIuCT8ClBJjB3CFxFcdc1BIoDc\",\"ygEkjDkDXJPhHPoC2BgCC\",\"ytFm_CoDByEVfdzEChCJtCaUc2BI\",\"o5Fm-CmDJtBPrESKOqCF\",\"6uF27CmBQyBE6BPEJ1EG\",\"i4B4kDqEIIL-BQ6BH7EbrBKWM3CC\",\"uc-jC7DEKQ2BO8BNAT\",\"8iCm8CgDkBJS8GuB4IccPZLnInB7DlB7DtCIfuChB5ECLSnCKFWqBKBWwCiBlBE\",\"0yFkjCOlBAnB4BtD5BMZ5BoBnBBbdYZfH0DM0CXoBE2BkBSPUSEKZ\",\"ghHoxCzBRzBCkBTqBrBGRJJrCIxEhB3DzBNR5BanDdROlBP1BENZvBlBCPuBJF5BjBBRfQRlCTNtB5BJLnB5BlB1BwFS2BiBYCU-BIsE8CoCgBgB4BvBDXflDrBfwBnDLjDjCiBX3ENEc9BGxBT5DIjEL5IrF-BFUXmBJaUsBB6BrBChBfnBVvD7B5BNblEzDzBXZAXU1BdFNFcUCGuBJiBiBOwBFamBOsBkB0BhCLhBP7BAPmBvBclCMNoB1ByCjBO7BMlDHfTWJAVVLjBpBAR3BZvBQvBDtBS5Bb5CP3CG9BmBnBG3CL5BQHe_DgBnBpBQXnBZhDKZUpBAhBMpE1B5BJTazBF1C2B5BJ3BYTV5CmDzBgBQMjDlBnBBEWxBOpBJNoBnCKjBR1DX1ENRNcZlBLIJnBTiCbJR3BCLLzBU9BArBRlEsB_BAxCrBDbpBWfrBMHXdiBbeCaZDVUFRXlBFnBpBkBlBDZsBvBfZvCmBNQjBIXF9BahDKhEoCcGiBiBXQ8BQBIjBFCSUMoBCGOJWQgBxCMXUfFxBONYfCBMKIZYtCJTmB4BMlBSCGpBiBIMBSnBKVFDKpBKRsBRIQOLkBeYFIsBWpBS8DqCOU5BcQajBeaiBtBuBmBe9BaGcuEiBgCXuDJ4ErBeTEZtBV_BJzFebDgCdG7ByCVGUXQaQgDZiBKbe-CoBqCRYchBYUYdYwDLWVxBFAVgBN-BKKY-G2BeBlBXyBDcOqCA8BSuBXuBapBWUO2DLoG5BcUpBWAIvBEMUVsBqCkBakBeIqDJIXlBfYLObJ3BsBXPZtC5BsBFQQsBKMUiBSXYUarBCJYgBoBzBgBoCaJeUAWVPlBqBHRckCQyCCqCVjBiBDqB8HMfUuBauBCuCUqDEOMoDEiBJ4CWqCAMQmBS-CQkCN1BH6CHMRkBI2DA6DhBJTzFtBsDPkBIWZQKgCGiEFIToFFCgB2EHgCTSZXPyBfgCPmBqBgCRkCKuCLeMgCFbkB0BSqLZiBXoDdiFIwCHiBPFdyBJ2BI-GBmCjBwBMfaSSyGHsFlB\",\"_gHm2CqGlCBXaJHcsDFuCjBnBRhCDAnBPHlBCzCYHS1CCVOIOvBJSRVP\",\"_gHs5CgDJrBNzBB\",\"ghHy4CrBBFMyBQ\"],\"a\":\"RU\"},{\"i\":\"044\",\"n\":\"Bahamas\",\"r\":[\"3iDwhBuBCCJrBHDQ\",\"nhD6hBgBRFbHaRU\",\"3hDwfMBO3BJBXiBIa\"]},{\"i\":\"238\",\"n\":\"Falkland Is.\",\"r\":[\"vsC5gCwBYiBJYQgBRLN1BLROhBRTS\"]},{\"i\":\"578\",\"n\":\"Norway\",\"r\":[\"-SyjDOO8BC2FrBjDPXbhBHThBvBB1CakBO7BKtCiBdgBsDOWN6BA\",\"8mB-2CjDTQcxBQ9BLTdlBRrBKzBBrBUvBLFZrCGJVnBA_D_DONNPlBAZjBC1BaTNvBxBxBbYtCtB1BH3BUZmEkBaqDiBwCqBoFkEyFwC4CSgCB-BiBwEG-DdzBJsBZ\",\"oiBikD5BV1DDzDGHM5BArBS8DM6BJoBM0FX\",\"8eqhD3CPlCKaKXM0CIQN4BJ\"],\"a\":\"NO\"},{\"i\":\"304\",\"n\":\"Greenland\",\"r\":[\"t6BqnDmEYsEB0BOsOB6HdpCPvLFUHuEG4DNuCMiBNrBXoJe4DHWP5FlB_DF8CBtC3BCrBwBZhENqCVKhBpBD0BhB5CDuBPLNvDFyBZARvCQTJ2BJ0BZQfnCHvCoBObtBTgFD3GjChFNnBN3BpB1CbpEVhBXBbTZ_BfQfnBnC3BB5BgBvCAnBWZoBlCyBTaFkB1BkBOeZOmBuB8BQQQKgBnDZxBMBcQU2DJnDoBnBFhBKuBmBpD0CxBQAQpDYhJBzDmB6FQrFK5CQGQqJmBQOrDOiBQkGgBPS6GS6DAsBLqDWsHf_CWGS\"]},{\"i\":\"260\",\"n\":\"Fr. S. Antarctic Lands\",\"r\":[\"m2C38BgCRAHJR9BBIuB\"]},{\"i\":\"626\",\"n\":\"Timor-Leste\",\"r\":[\"m8EjLGKiBI4BC5CnBFU\"]},{\"i\":\"710\",\"n\":\"South Africa\",\"r\":[\"uU3jBSUYbqBJ6BYA0EiBrBDZKNcEkC8BkBPiBBYIMgBWEYoB-C8BmCFezCD7BfENnBYVWEISgBAZvChBZzBlCpC_BdT9BPDLhEEjDlBRAvBaR-BMGBgBpC6D\"],\"a\":\"ZA\"},{\"i\":\"426\",\"n\":\"Lesotho\",\"r\":[\"okBlkBMLRfVHHLNDdeqBqBUISL\"]},{\"i\":\"484\",\"n\":\"Mexico\",\"r\":[\"tyE2oBiDGDH4EtBuDAAQmCA6BrBYrBULiBLYgBiBCcP6BpCUvBqCTV_BFnCanC0BnCqBLQP6DeaQSkCmCU8BCKHBTdvBGHPvBJKPANX1CDAVRAoBhBANzBATfAbhC4BfKpCVrF8BpBe_BQ7BoBTaJUOEGiBf2B9CgDhBSHKGYrBcJcVEpBoBjBqCAOhCaFPMxB6DrEmB9CUBejBRVrBwBxBeDyB1CuBXWUCOOCS1BoBhC4D\"],\"a\":\"MX\"},{\"i\":\"858\",\"n\":\"Uruguay\",\"r\":[\"_nC3lBYEgEtCYbRRMVRZtBVxBElBQZAZWiB0E\"],\"a\":\"UY\"},{\"i\":\"076\",\"n\":\"Brazil\",\"r\":[\"1iClqBLWSSXc_DuCXDiD8C8BoBAgBTWTHOmCNGdDPgCZKRHpBIE2BLWMKDWSyBJYVMCmBrCCPuBMAJ0BXMXA7BiBrBIrBkBCoCzBH_BpB7CAC8BfXjBCNWbCKQnB-BMGASYKDWMgB0CqBkBBUgEHWPOAeeCCQXEAYuCAMOUjBGEWVgBEIMuBQEQeMBIhBED0BRKkCL2CgBOOFMWCIJDPWZPvBMlBYTUBwBc2BFCciBAoBPMMQNSC0ByCOCgB7CWFAbdhBMLoCFAnBgBa0DlBUXHVwBMuCT6BC8BhB0BrBgCNOLUrCPhCrCxC1BvCJALdCpCN3CNPF1BpBzBFpBfPJXrBA9BPnCdvBfhBnBFbGXP5BbVrBnC9BxBRlBZV\"],\"a\":\"BR\"},{\"i\":\"068\",\"n\":\"Bolivia\",\"r\":[\"92C1N0BBgCqB0BIBnCsBjBsBH8BhBYAYLKzBLAQtBsCBBlBWLKXRxBEVLJBOjBUrDLRhBRlCFItBCPfVczBKhBjBdDjBkDMmBTQFeTaasBRiBKOHOQUC-BKOjBgC\"],\"a\":\"BO\"},{\"i\":\"604\",\"n\":\"Peru\",\"r\":[\"r3CrFjBCzCpBLfEVXJARLFoB9BJPcBOVkBBgBYB7BoBCkB_BJNB9BPTINJNShBjB_BTJpBYBQvCoBlDkCPiBGKrE-H7BqBMSRmBMcgBaEPJJAPiBAQTWQgB-BwBQsBqBMaDeKE6BvBYpB6CCeRZpBMAUV\"],\"a\":\"PE\"},{\"i\":\"170\",\"n\":\"Colombia\",\"r\":[\"zzCyBFDTkBLNtCAAXYDBPdBAdQNIVT_DTWLAaqBdS5CBXqB5BwBJDlBWLFfGJSvBWFMQCBUIQUCgBuBNKIWJmBKKHiBPUGUMBIMHWYGwBgBGuBYUYAEIgBBiCwBOBKLHLXHlBtBPzBUBObAnBUPqCBchBkCGOFR_BUvBTTYVMnB\"],\"a\":\"CO\"},{\"i\":\"591\",\"n\":\"Panama\",\"r\":[\"1gD6KEbHLLCFTViBKKjBcRBHNZLDHUVjBNFYRDHQrBIBJGkBJWQCOVUCKJsCgBWBmBLcX\"],\"a\":\"PA\"},{\"i\":\"188\",\"n\":\"Costa Rica\",\"r\":[\"lnD-LPBKVJdVKHICQnBWNUDVVQAgBLGQMiCRKIsB3B\"],\"a\":\"CR\"},{\"i\":\"558\",\"n\":\"Nicaragua\",\"r\":[\"xoD2NJHdOpBAtCoCkBOAUSAIMMHkBmBSH0BQN5BCtBPpBIP\"]},{\"i\":\"340\",\"n\":\"Honduras\",\"r\":[\"9nD4SzBPRIjBlBLIHLRAATVJTQBUZBhBWIayBgBoBDsCKaFwBhB\"]},{\"i\":\"222\",\"n\":\"El Salvador\",\"r\":[\"1vDgSiBVSEOFHZ3CYea\"]},{\"i\":\"320\",\"n\":\"Guatemala\",\"r\":[\"pzDmSAcUgB0BAAOnBiBSAAWqCADrCqBFlBbHZdZtBInBY\"],\"a\":\"GT\"},{\"i\":\"084\",\"n\":\"Belize\",\"r\":[\"tvDoWEIIDOYQFJnCXZLAEsC\"]},{\"i\":\"862\",\"n\":\"Venezuela\",\"r\":[\"9rCwGGLNN1CfjCMSJEzBiBDCHdLDPtBPHLfDVWLoBXWUUTwBSgCNGjCFbiBpCCTQAoBNcTCQ0BmBuBYIAJXFORBTPXOfSEIcLOBeyBSFSOMObcAaVCNuCEYReDWMCKgDChBLORgBDeRIfkBJfVDPONhBNARJLad\"],\"a\":\"VE\"},{\"i\":\"328\",\"n\":\"Guyana\",\"r\":[\"1mCsCfCvBbTCXULmBQwBVaEQHKVBZeKMASiBONOEQgBWyBnBCTOBmBhBFjBXJFdSbMAe5B\"],\"a\":\"GY\"},{\"i\":\"740\",\"n\":\"Suriname\",\"r\":[\"jkC8C5BIBbVEd6BLARcGeYKGkBwBHkBMsBLVhBEbQXTzB\"],\"a\":\"SR\"},{\"i\":\"250\",\"n\":\"France\",\"r\":[\"4H69BsCRTZFdbBAJbVBTUIORKZNLKfWDDRjBVvCK5BNDXtBDtBSNHpCSPOUYIwClC-B9BQDe0BIkCJNuBmBR-CgBMgBiBIGNSAwBjBUE4BV\",\"-Kq1BaOGhBLdRIJaIQ\"],\"a\":\"FR\"},{\"i\":\"218\",\"n\":\"Ecuador\",\"r\":[\"l-CFEdLZrBpBvBPf9BVPPUhBAAQKKDQWeJSNTXSIMHkBOGYyBDQyBawBVKRgBFMGmBV\"],\"a\":\"EC\"},{\"i\":\"630\",\"n\":\"Puerto Rico\",\"r\":[\"7yCkXcJJJ1BBEWgBA\"],\"a\":\"PR\"},{\"i\":\"388\",\"n\":\"Jamaica\",\"r\":[\"9gDkXaDcTnBHtBWGIaC\"],\"a\":\"JM\"},{\"i\":\"192\",\"n\":\"Cuba\",\"r\":[\"5mDgdiCD0BbmBEqCzBkBHBJcBePDJZFvDBaWpBOViBXBxDiBOKnBCxBfjBAuBkB-BQ\"],\"a\":\"CU\"},{\"i\":\"716\",\"n\":\"Zimbabwe\",\"r\":[\"gnB5blCGZSfGJoBREtBsBjB-BoCH4B8BQCEOWQeGEPgBCkChBHvEPfpBtB\"],\"a\":\"ZW\"},{\"i\":\"072\",\"n\":\"Botswana\",\"r\":[\"6kBzb9C7BXnBVDLfXHhBCjBQjC7BbDJOEahBsBA0DoBCAuE8CQQRYQqBGkB9BuBrBSDKnBgBFaR\"],\"a\":\"BW\"},{\"i\":\"516\",\"n\":\"Namibia\",\"r\":[\"8Y9eAzE5BXpBKXcRTtB8BfiEFmCjByBdoCfoBBeqBOaAYRoFEcTiDFqDaqBL7BbPS7CPAtEnBBAzD\"],\"a\":\"NA\"},{\"i\":\"686\",\"n\":\"Senegal\",\"r\":[\"7UgRReRQQGsB-B8BGuBV0B5BIvBQJCbnBDbK9CCtBJFekBAgBOiBHSIHMZFPKVLpBA\"]},{\"i\":\"466\",\"n\":\"Mali\",\"r\":[\"rOyPBcPKHwBMIIYoBJmBEGKgFAKcHGlB4K-BAsItFKRsBRAZsBEA7CVZBZ5CJPNxCAlBPrBnBPHTERjBdhBH1BZJFQRBHLvBCLMCMLAIYdkBnBRjBOPDBO\"]},{\"i\":\"478\",\"n\":\"Mauritania\",\"r\":[\"pVoaIO8EAF4BIWmBCAoDiEBA8B4EhD9BAmB3KIFJb_EAFJlBDnBKHXLHzB6BtBW7BFNLDUQ6BFwCdkB\"]},{\"i\":\"204\",\"n\":\"Benin\",\"r\":[\"sD6HhBDJcC8CJcZYGWOEISUEWYOAeXIjBDbfjBHZA5C\"]},{\"i\":\"562\",\"n\":\"Niger\",\"r\":[\"ySycK9BgBjBXhDBzBzBlBP1BQNAZaAPhBrBsBfVzBOvCVvBUnBJNQnBO1BLPnBDjBdYbLCcvBIAUVaBmBYAQO6CKCaWaA8C6BSyDuCqEsCgCPWVcO\"]},{\"i\":\"566\",\"n\":\"Nigeria\",\"r\":[\"sD6HA6CIagBkBAkDawBsBEoBNOPoBKwBTwCW0BNgBWIBcrBYNHVhBdfzCVPRzBbNVQPAXXJAdjCnCTfAhB2BbahCA\"],\"a\":\"NG\"},{\"i\":\"120\",\"n\":\"Cameroon\",\"r\":[\"kSiQQZAzBWjBzBAHRqBdSrBjB5BB7BkB3BSNExB_BU7FCGePcRGRYKoBUmBKAYYQAWPcOS0BWQgB0CiBeIWPQAMMC\"]},{\"i\":\"768\",\"n\":\"Togo\",\"r\":[\"kB4NFVaXKbB7CKbfHTmBG4BJQD8BPUCMkBA\"]},{\"i\":\"288\",\"n\":\"Ghana\",\"r\":[\"A4NBLQTE7BKPF3BUlB3DxBjBMCQRiBcuCPuD2DC\"],\"a\":\"GH\"},{\"i\":\"384\",\"n\":\"C\u00f4te d'Ivoire\",\"r\":[\"hK4MwBBIMSCGPaKqBdiBMaJM5BbtCShBBPnCG5DfG2BpBeMqCSMRwBKQ\"]},{\"i\":\"324\",\"n\":\"Guinea\",\"r\":[\"jR4PwBJoBECNQEkBNoBSejBHXMABLMLJPSvBRLAXPAJPJAVyBdHDkBTgB1BHflBrC2CSUmBKCgB\"]},{\"i\":\"624\",\"n\":\"Guinea-Bissau\",\"r\":[\"7UwPuBKqCBBflBJRTlBUXiB\"]},{\"i\":\"430\",\"n\":\"Liberia\",\"r\":[\"xK0JCfHRqBdF1BzBUhDuCwBgCUGWxBeQ\"]},{\"i\":\"694\",\"n\":\"Sierra Leone\",\"r\":[\"xQkLgBmB2BIUfEjBKCvB_BnBSTWLsB\"]},{\"i\":\"854\",\"n\":\"Burkina Faso\",\"r\":[\"3G-MI2BeiBGcMIUDQIsBoBmBQWGkBFClBWZATwBHJnBTDHRND5EBEzBZKhBLpBe\"]},{\"i\":\"140\",\"n\":\"Central African Rep.\",\"r\":[\"miByGjCAhBNPIrBTRERZ5BK7BejBhBDbzBKXVVlBFeROjB4BBcEgBeuBgBEIKQJyBQmBeDOyBAmBUcqBuBYcpBDtBiCrBANsBlBKXePGL\"]},{\"i\":\"178\",\"n\":\"Congo\",\"r\":[\"iXsEVlCJ1CxB1BRlBChB3B3BRSVANPZSbXfqBeWNcoBOESUTkBASsBFgBRYSuBJIdDLWEQyBAgCTY6BYW0BJ\"]},{\"i\":\"266\",\"n\":\"Gabon\",\"r\":[\"kO6CiCCOnBeEKHRtBSXGfRrBjBATUDRnBNObdVjCqCXqBc0CoCCAwB\"]},{\"i\":\"226\",\"n\":\"Eq. Guinea\",\"r\":[\"iM8CiCBAvBnCBHGOuB\"]},{\"i\":\"894\",\"n\":\"Zambia\",\"r\":[\"umBtKwCjBURKhBPpBIhBXxBUJ3DhBCbdFVPDNPB3B7BnCIVQ7BFzB4BCgEyCADuCOACLsBDORgBFYOKVeDgBnBeADqBJFnBWM4CHSWemCC\"],\"a\":\"ZM\"},{\"i\":\"454\",\"n\":\"Malawi\",\"r\":[\"-oBxLoBFWdK1BJfKzBOCONSbCzBPHLbZYCgCPKJDrBeYyBHiBQqBJiBTS\"]},{\"i\":\"508\",\"n\":\"Mozambique\",\"r\":[\"mrBrOeCwBJmBGQMiCOgBYUvFb3BZXxCjBnD3CDbchCGCDvChDxBRPEPKBBVfALyBIuBd0CqBuBQgBIwEjCiBfBFsB4DiBYTKEQJB_BaXMcQIB0BRcNONBJ0BKgB\"],\"a\":\"MZ\"},{\"i\":\"748\",\"n\":\"eSwatini\",\"r\":[\"ioBthBHRVDXWOoBgBDIjB\"]},{\"i\":\"024\",\"n\":\"Angola\",\"r\":[\"oQ_FNHHbJDLecYQN\",\"sPzHsBK2DBUzBYhBoBIWFQiBcIUADNyBAInBBvBMPBvB0BKSDELAhCxCAB_D0B3BnCRhDGbUnFDXSZApBNDaW4CW0BkBsBEeBWfgCOYTgCTaCI\"]},{\"i\":\"108\",\"n\":\"Burundi\",\"r\":[\"imB_CMlBnBrBPBBwBJSYBMWUB\"]},{\"i\":\"376\",\"n\":\"Israel\",\"r\":[\"0sB8oBFLNGHbIDJPSGAPT_BZkCiBsCcIDX\"]},{\"i\":\"422\",\"n\":\"Lebanon\",\"r\":[\"4sB0pBZHiB-BSBGPVPJT\"]},{\"i\":\"450\",\"n\":\"Madagascar\",\"r\":[\"-9BxPUrBSjCDRHLNYHLGtBLJBhB9C3IjCZ1BYb4CE6BSIWkCTyCUwBqCQ4BwBMUFSSFWcAYOSOP\"]},{\"i\":\"275\",\"n\":\"Palestine\",\"r\":[\"osBsnBRFKQHEIcOFFjB\"]},{\"i\":\"270\",\"n\":\"Gambia\",\"r\":[\"7UgRqBAWMQJaGILRHhBIfNjBAGS\"]},{\"i\":\"788\",\"n\":\"Tunisia\",\"r\":[\"8L8lBRoC5ByBBeYWK8CsBQcDAViBQCHTTAROJFhBZTIVUBKRQFBf7BlBAhBRJ\"],\"a\":\"TN\"},{\"i\":\"012\",\"n\":\"Algeria\",\"r\":[\"7KoiBC6BgCeoCQQUuBQCeYCSQ0BGGQJId8CmBWqBIgCcmEKUFmBQ2CFJ7CXVCd6BxBerDDzDPPoBjCSGgBRSZpErCxDtClDVAarBSJSjNwI\"],\"a\":\"DZ\"},{\"i\":\"400\",\"n\":\"Jordan\",\"r\":[\"usBwoBGMuBPuCsBQxB3CZoBnBTTdFbZtBMUgCG0B\"]},{\"i\":\"784\",\"n\":\"United Arab Emirates\",\"r\":[\"wgCqeGCCL4CEyCuCINGdTBDZIDRHV5B3DUPyB\"]},{\"i\":\"634\",\"n\":\"Qatar\",\"r\":[\"w_B-eBeWYMLAXHVXE\"]},{\"i\":\"414\",\"n\":\"Kuwait\",\"r\":[\"g8BwlBQ5BbAJSjBEemBcB\"]},{\"i\":\"368\",\"n\":\"Iraq\",\"r\":[\"gxBmoBPyB4CoBQyBDc8BqBuBFOJSGatBcLCXTNJfclByBVUdFbMAAVWTxBEdlBpCEvDwC7BcvBK\"]},{\"i\":\"512\",\"n\":\"Oman\",\"r\":[\"glCscOyBSIHEEaUCSbWN2BNqBxBzBpCRCHJFzBRAZPLZZAPJAPRLVEtBPrB-C4DoBawCRc\"]},{\"i\":\"548\",\"n\":\"Vanuatu\",\"r\":[\"wwGxTFoBSLGfRE\"],\"a\":\"VU\"},{\"i\":\"116\",\"n\":\"Cambodia\",\"r\":[\"ogEoPJwBaiB0BGmCTSakBNIZDvBjCfSXpBBhBPhBGjB-B\"],\"a\":\"KH\"},{\"i\":\"764\",\"n\":\"Thailand\",\"r\":[\"wjE6RjBGzBFZhBKvBjBShBAGejBADrBhB9CCbaBYlCkCxBNPZDBUhBSFH_BuCFXHWQgCqBuCPkBDqBjByBOIOkB7B6CQISqBcCuBaSLCXcBJtCqBYkBFIOeBefEnBgBjBBhBNR\"],\"a\":\"TH\"},{\"i\":\"418\",\"n\":\"Laos\",\"r\":[\"omE4RjBORZhBOOSCiBfkBDoBdgBdCHNjBGpBXKuCbCBYRMsBqBCJWBFuBUGqBjCyBAOhBjBZwBX6BxCebKbFnB\"],\"a\":\"LA\"},{\"i\":\"104\",\"n\":\"Myanmar\",\"r\":[\"k9DwZtBZbBRpBPH8B5CNjBNHkBxBEpBQjBpBtCDeMeLYCqBPWTiDRiBnCxBtBOOyBHkBfuBEQVEdgBBiBOHAeUKIoCeJqB2CAWyBceFDYOIBOWEOXSJB_BlBfDvBqBGKjBaHLhBuBVeMCPrBpB\"],\"a\":\"MM\"},{\"i\":\"704\",\"n\":\"Vietnam\",\"r\":[\"uiEkNiBQqBCRYkCgBEwBHaGoBJcdc5ByCvBYkBaNiBxBApBkCWKoCEiBWSNkBHFXUPoBJ1BhBflBJbkC9CkBXafSpCFnCvCzBxClCNaMadY\"],\"a\":\"VN\"},{\"i\":\"408\",\"n\":\"North Korea\",\"r\":[\"qjFg1BGHPEdbCb1CtBFVmBXFJtBDNRnBGPLXSUWIetBWiBYsBWacULiBBFW-BQQYaX\"]},{\"i\":\"410\",\"n\":\"South Korea\",\"r\":[\"49EmvBUCOSuBEGKsBnCAtBNVnDbC0BRqBeGZiB\"],\"a\":\"KR\"},{\"i\":\"496\",\"n\":\"Mongolia\",\"r\":[\"2tD09BqBGqE2BiBLqBAaTiDJoBaPYoBqBgEfId6BP4CMoBF-BlB4CF6CQ6BcuBRwBEvBlCKP-BBeOkCnBDN5CB3BjB9BPnBV_BMTZUb5BjBpFbvBVRMvBAhDe1BF9DKpB8BnCelDMNQOwBZgB5BOhBWJc\"],\"a\":\"MN\"},{\"i\":\"356\",\"n\":\"India\",\"r\":[\"25DqjBCNNHEXdGxBbAVVhBBTRfdKHnCTJTgCLBFXVUMWSEUiBjDKBczBUNbeThBdYJFXU_BFNrCHCdVX5BZrBvBlCzBARpCZNdM1CRlBAjCTBRdMNjBJdnBlBmBhBgDjB6BPqCjB4BdgEF2C7BXbGzBwBUOLQtBiBaa4CAHiBVUFgBZSsBqBwBDoD8DAciBWfUb-BUS8BJsBGoBiBqBvBDfQTATdEMrB-CzBXRPlBgE5B2BDYTwDNC8BaIEnBkBP8CGCYPMgBGyC4BiBJcQUXNRsBF\"],\"a\":\"IN\"},{\"i\":\"050\",\"n\":\"Bangladesh\",\"r\":[\"6zDybAdNIChBlB0CjBCEPNVvBITgCGYXKiBedUOc0BTCbkDJThBRDLVWTGYMCU_B\"],\"a\":\"BD\"},{\"i\":\"064\",\"n\":\"Bhutan\",\"r\":[\"0yD2iBQLBX7CFjBQamBUKkCV\"],\"a\":\"BT\"},{\"i\":\"524\",\"n\":\"Nepal\",\"r\":[\"kuD8iBB7BfAvCOXU1BE_D6BQmBoBagDrBOR-BZ8CL\"],\"a\":\"NP\"},{\"i\":\"586\",\"n\":\"Pakistan\",\"r\":[\"qhDssBnBhBrBF7BKTRc9BgBThBVAbnD7DvBErBpBaRGfWTIhB3CAZZdKLcfehGLQuB4BUBSTIAiBnBSjBuBkCVkDG0BSCiBWWeAEMuBAOMBYSYYKNamBAKOBQUQNkBYSkEaeTMdiCP\"],\"a\":\"PK\"},{\"i\":\"004\",\"n\":\"Afghanistan\",\"r\":[\"kzC2uBiCNcOOHMSYAckBWJDLMBDhBQL4BemCDGJjEZXROjBTPCPJNlBAOZXJRXCXNLtBADLdAVVBhBzBRjDFjCWmBkBDadGP6BQWPGauCqBPeGIS2BSIgBiBIGOeL\"],\"a\":\"AF\"},{\"i\":\"762\",\"n\":\"Tajikistan\",\"r\":[\"60CuuBWoBHedKKSiBBgBwB0BIHRGLQCNLrBGDVsBCyBLsCGKlBkBDGnBlCE3BdPMEiBLCEMVKbjBXALRNIbNLG\"],\"a\":\"TJ\"},{\"i\":\"417\",\"n\":\"Kyrgyzstan\",\"r\":[\"24C60BKSaGiCNGYWI6BPsEBsBTjCdNPzBFNXrBEZHnBRGJJHrCFxBMrBBEWsBFOMgBDyBcvBWbJdOiBaLE\"],\"a\":\"KG\"},{\"i\":\"795\",\"n\":\"Turkmenistan\",\"r\":[\"0hCo0BSMuBIaJcfiCCFWkCkB0BVGdOJ6BDUpBmCtBgDlBBXdMFNhBHHf1BRHRdFpBQDiBbCtBiBrCapCDbVjBHFcGqBfOKcZCIiBmBJkBMdYLWfJDbLa\"],\"a\":\"TM\"},{\"i\":\"364\",\"n\":\"Iran\",\"r\":[\"28BulBVUAWLAGcTexBWbmBKgBUOBYbMvBuCIOLuBcKahBcDsCiBMLNTaVKCMbmBJcT4BFgCKCKkBIcWsBGqDbuBhBcBEhBZtCQFPVQ5BeFEZlBjBkBtBoBRAhBUHCR3BTPtBjFaRwBRInCZvBMnBgBnBK3B8CTFZMPN\"]},{\"i\":\"760\",\"n\":\"Syria\",\"r\":[\"0sB8oBOsBWQFQRCDegBiBCWMHsBM2BHwBQiCGTZVJEbPxBlFzCtBQ\"]},{\"i\":\"051\",\"n\":\"Armenia\",\"r\":[\"k6BuwBNAPcRAhCgBBiB2BGYRHJWNLLkBRAb\"],\"a\":\"AM\"},{\"i\":\"752\",\"n\":\"Sweden\",\"r\":[\"6NypCyByBOwBZUB2BakBmBAOQNOgEgEoBAKWsCFGaYC0DtBA9BOPjCLnBZGZrEhCd3BkCxBlBtBnBJPhCVlBxBEVftBBNmB9BmD\"],\"a\":\"SE\"},{\"i\":\"112\",\"n\":\"Belarus\",\"r\":[\"ojBmmCqBJEJWGoBJCRHLqBhBBFmBR3BLUlBhBBNJBTvGYnCLNkBYILwBmBAsBQIWiBMDSkCW\"],\"a\":\"BY\"},{\"i\":\"804\",\"n\":\"Ukraine\",\"r\":[\"4nBkhCuCKaXJHCLgBBOXyBNgBGYTyCLPfKVFNnBBTLBRhEhBCTzBSJJjCQDOjBDtBzBRGRFRIceDIwBBZmBNGCORKtBOpDbjCORHBKVKScKBLSmBgBSGGKTkBoCMwGXCUOKiBC\",\"6pBu5BKKqBJeVqBCHNrBF1BXVIIUrBMuBUFE\"],\"a\":\"UA\"},{\"i\":\"616\",\"n\":\"Poland\",\"r\":[\"sdsjCMvBXHiBnCFJRFlBfMRvBQnCJTOPDTWdCDMbEFJTICMdETMPaFkBPOMKJUsEsBoBFEJiFDUFKL\"],\"a\":\"PL\"},{\"i\":\"040\",\"n\":\"Austria\",\"r\":[\"oVk8BDPVAIHVf1BJ5CMJOrBN9BOEQMEULGKgCGgBJBiBcYeNkBUyBJSHCT\"],\"a\":\"AT\"},{\"i\":\"348\",\"n\":\"Hungary\",\"r\":[\"0bw8BWJCJXJrB1B3BFtBPfI5BkBOaHIWAEQiBN2DiB0BH\"],\"a\":\"HU\"},{\"i\":\"498\",\"n\":\"Moldova\",\"r\":[\"ohBo8BkBKuBNSJBNOFalBvBCEHbdD0B9B4B\"],\"a\":\"MD\"},{\"i\":\"642\",\"n\":\"Romania\",\"r\":[\"qjB84B2BHCJfFLvBzBUjCTnDETYKIJELHXKBSZIZegBGsB2BqBSkCNmCS-B3BEzB\"],\"a\":\"RO\"},{\"i\":\"440\",\"n\":\"Lithuania\",\"r\":[\"khBwlCERhBLHVrBPlBAJMTGAU7BOHiBuBMqDAiCd\"],\"a\":\"LT\"},{\"i\":\"428\",\"n\":\"Latvia\",\"r\":[\"kiB6nCSHSrBjCVhCepDAtBLCeUYkBOgBdgBCIeiBG0BRiBB\"],\"a\":\"LV\"},{\"i\":\"233\",\"n\":\"Estonia\",\"r\":[\"gjBsqCGHdXMjBPNhBCzBShBFGYPFXODYkDQ2CD\"],\"a\":\"EE\"},{\"i\":\"276\",\"n\":\"Germany\",\"r\":[\"0RmjCKTLJQNGjBQZbAxChBKbsBZbXChBfK_BFFJrCWHJhBAGeUa5BIRKFcBkCYAKQKkBHOIIiBCGHcSJmB2BCCPoBJAN-BSgCb\"],\"a\":\"DE\"},{\"i\":\"100\",\"n\":\"Bulgaria\",\"r\":[\"qcq3BMRoDDkCU0BTTPNbMXhBGpBLATjBDbO9BJBaTMYkBTSDOKK\"],\"a\":\"BG\"},{\"i\":\"300\",\"n\":\"Greece\",\"r\":[\"8gBksBFL5BDCIxBIIQWNyCB\",\"2c2zB-BKcNkBEAUULVdtBGvBJcXpBFVWFJIXURPJqBdCVlBKMTXDOjBZAhBSV6BlB2BiBwBuCU\"],\"a\":\"GR\"},{\"i\":\"792\",\"n\":\"Turkey\",\"r\":[\"-3BuuBRFNKtBGjEb1BIrBLLIBVVRNUOO5BGZX9BDfWrBCHRbDlBWrBBXoBdWUgBZSuBmB8BCSesCDwBauBKiCCgErBwCCwBWqBCoBTChBuBVbJMtBHNWf\",\"0gBq0BqBMiBFEPkBLHJvBBxBhBLaWeTM\"]},{\"i\":\"008\",\"n\":\"Albania\",\"r\":[\"oaizBhBvBdYG6BJUSUeTErBQJ\"],\"a\":\"AL\"},{\"i\":\"191\",\"n\":\"Croatia\",\"r\":[\"2Uk6BsBVgBHQGWZPPvCQbJNKHRsClCkBPDFhDoBfeICTSAOZGLRLOCOkBGeHQgBgBK\"],\"a\":\"HR\"},{\"i\":\"756\",\"n\":\"Switzerland\",\"r\":[\"gMs7BDPmBHDPRHbGJPZEpBNdaTHCUcWAK-BCIKsBN\"],\"a\":\"CH\"},{\"i\":\"056\",\"n\":\"Belgium\",\"r\":[\"2Hw_BRxBjBSTDvBkBRAFOiDMwBZ\"],\"a\":\"BE\"},{\"i\":\"528\",\"n\":\"Netherlands\",\"r\":[\"0I8iCINJjBJPXAGpBvBahCDWKiB8B4BQgBA\"],\"a\":\"NL\"},{\"i\":\"620\",\"n\":\"Portugal\",\"r\":[\"pLs0BgBQKT2BEKTRLH3BRBQXJbMJTZENPJpBAC4BREJQEaQOMoBLuB\"],\"a\":\"PT\"},{\"i\":\"724\",\"n\":\"Spain\",\"r\":[\"pJsuBDOUaLKKcPYSCI4BSMJU1BDJUfPCcPS4BcyENiDAQNqCROIuBRuBECVlBZzBJrBjCQVVRJZdHbf3CCpBdREZkBlBG\"],\"a\":\"ES\"},{\"i\":\"372\",\"n\":\"Ireland\",\"r\":[\"3HqjCGbdjBlCX5BGiBqBVqB2CyBIVHV2BH\"],\"a\":\"IE\"},{\"i\":\"540\",\"n\":\"New Caledonia\",\"r\":[\"ovGra0BpBNJzBc3BgCQA2BnB\"],\"a\":\"NC\"},{\"i\":\"090\",\"n\":\"Solomon Is.\",\"r\":[\"0qGjNMNbCPYgBL\",\"kqG_LFHdkBHYMAgBzB\",\"ipGpMnBCHGCQaFUR\",\"ynG_JKVjCuBGE0Bb\",\"ukG3IQNZGNYYP\"],\"a\":\"SB\"},{\"i\":\"554\",\"n\":\"New Zealand\",\"r\":[\"k9GhyBjBxBdPXQYiBNWrBQCOcOG4BPiBhCwCOEWVgBJKjBepBAaSJGd8BPWOUDV5BdAJLBX\",\"i0Gt2B8BqBgBoBGWcSShBcQMPAP9B_BQTfAhBPhBhCxBdpDSHOWeyBoB2BW\"],\"a\":\"NZ\"},{\"i\":\"036\",\"n\":\"Australia\",\"r\":[\"04F_yBYBCvBNNDfNKbbfE1BgDCSgCR2BO\",\"29EnoBtCdVlB1EDXTLClBX5BA9BiBAYaOEqBf2CCYRmBRQDebyBSRNmBgBbBUf4BS2BDYQcCdSayCuBeBoCgBgCK4B8BCmBciBShBQINSMUSJGgBeiBUICKSDAKkBM0BpByBDHWUgBSKFKQWYO4BEBUdOWEwBZmCRwBQSTZlBNAGPZnBCLwDnCgBJGLmBNaOQmBS2BH2BOmBFOS2BOQOtBKDQlBCjBOfaQgBhBGzBQXKhBDVOZiD5BFJYXQrBQKQRKGGpBuCnCMfBvBShBZtERjBdTbxBjBzCDpBXLrBBvCxB3BaGU5BjB1DgBZYPyBTQnBGOSJeTbhBFqBgCDe5BvBNffQCWtBsBGKzDsBnCDhDblBE\"],\"a\":\"AU\"},{\"i\":\"144\",\"n\":\"Sri Lanka\",\"r\":[\"omDsJFnBzBVTgBF6BSgCcVmBlC\"],\"a\":\"LK\"},{\"i\":\"156\",\"n\":\"China\",\"r\":[\"8oE4WhBMAiBSSkCMIPZnBhBT\",\"qkD-0BBWaMjBkCkDaeoCuCNWSCoBiBEuBeKbiBV6BNafNvBOPmDLoCdqB7B-DJ2BGiDdwBASLwBW8DOuBO6BkBTcUagCLoBW-BQ4BkB6CCEOjCoBdN9BCJQwBmCwBP4BaASkBqBWMAWVKgBUyBI0BAgDZ2BxCOnBmCLwBbQlB8BAiBQiCMjBzBNrBZlBvBGhBNKhBFtBTBATZYPX9BPGVhBCTMZbtCtB3BLbTrBJWSHQeaTWvCpBZZlBBTRUbiBFARgBLsBc-BPGT3BLRVnBTTbsBVOlB0BjCAdZJKVYLP_BVDjDvEtDlCtBFXRNOVThDZNpBVBJcIQvDQTQGYjBIROhBVnCDpBPGtBVCDadLtBWMiBZIJkBpBFEwBmBgBCgCRKNYhCCOSTYbPhBKxC3BfFjCWvBnBBgBZH7CM9BaNS9BgBhBMPH9C0BLsBeDAUPUEgBpBwBhCQLejBeFoBjBEJmBKIFKoBSaIsBDOY0BGOQkCe\"],\"a\":\"CN\"},{\"i\":\"158\",\"n\":\"Taiwan\",\"r\":[\"o4EwepBhDViBDeYoBgBeSLFX\"],\"a\":\"TW\"},{\"i\":\"380\",\"n\":\"Italy\",\"r\":[\"iN06BYFsBOKN4BJDTKPfGfNDfOTmBTUhBsBfeAKHJHkDvBDVVUjBGPZcNDVPBVhBPDQqBbsBlCuBdCjCsBbYLmBzBS5BZESVEJgBOMJaQHqBOaDKQcFSIEQ\",\"uS2vBeEPhCpDoBEW4CA\",\"8KkzBUMYbFzBRCPNNKLoCWB\"],\"a\":\"IT\"},{\"i\":\"208\",\"n\":\"Denmark\",\"r\":[\"sM4kC1BBRWAqBSWiBCwBYBVLLELWFxBnBKR\",\"uPkmCOTXfpBWFS6BM\"],\"a\":\"DK\"},{\"i\":\"826\",\"n\":\"United Kingdom\",\"r\":[\"3HqjC1BIIWHWgBAsBXVb\",\"7D4iCGYbYvBIJKQSNMVTBmBTWOoBgBiBwCApBrB0CGJhBjBjBoBBoBzBaFkB7ByBHFZTLQTjBV5DJRIZRlBEbPVI8BqBkBK_BGJQqBMVWGa8BD\"],\"a\":\"GB\"},{\"i\":\"352\",\"n\":\"Iceland\",\"r\":[\"jSizCJZuBZzBf1EhBjFSmBS1CUmCIBMzCIca8BG-BZ-BWyBLiCWiCD\"],\"a\":\"IS\"},{\"i\":\"031\",\"n\":\"Azerbaijan\",\"r\":[\"g6Bq0B4BbgBaoBxBgBLhBBNtBNJCTJBZWOULM9BhBAcjBSMMVOIKXSKG0BNGGTUKG\",\"25BuwBbEZiBmBJQb\"],\"a\":\"AZ\"},{\"i\":\"268\",\"n\":\"Georgia\",\"r\":[\"-xBq2BiDJ-BZYGkBHOPYJJFUTbDdM_BLnBUpBBGQJc7BgB\"],\"a\":\"GE\"},{\"i\":\"608\",\"n\":\"Philippines\",\"r\":[\"i3E8PVekBAOPLhBPU\",\"o5EwMOkBWCFbeoBDlBnBzBXcIM\",\"g-EwKGvBNlBNqBTTOdLRvBWJeMSZULRTCbVHMQiBwBaOReKGScCBegBRIjB\",\"k0E0LzBlBoCyCUmBIfvBxB\",\"-4E4WHPObJhBXLFfKfmBAyBVDVOJDRtBoBLNXYjBFTICQMMLIFNZoBAmBQLE-BMkByBLMMEL\",\"y4EoOFUYLYAARrBbCmB\",\"88EmPMrBfKMlBTHBcLCFYYDAQZeoBAKP\"],\"a\":\"PH\"},{\"i\":\"458\",\"n\":\"Malaysia\",\"r\":[\"k9DiIGIiBRCTaEOQgBZSbExCOLQvBdBzC8BvBmDEeHQ\",\"szEmFxCGxBxDfJlBMRDXTzBFZYHaeNeIIiBiCQwB6BSVIOUBEuB0B6BQCUVCP8BXDPZBGRbN\"],\"a\":\"MY\"},{\"i\":\"096\",\"n\":\"Brunei\",\"r\":[\"qwE6GDtBTCHNRWyBkB\"]},{\"i\":\"705\",\"n\":\"Slovenia\",\"r\":[\"oRk6BiBB-BQONfJPfdIjBFKEJQEU\"],\"a\":\"SI\"},{\"i\":\"246\",\"n\":\"Finland\",\"r\":[\"4jBq2CFb-BZlBduBtBZhBkBdPZ6BbNT7DpCvGZVWnBMKoBTkBUYkBY2D0BDS3BSNQA-BzDuBYKsBT0BCsBJmBSUe-BMyBPPb\"],\"a\":\"FI\"},{\"i\":\"703\",\"n\":\"Slovakia\",\"r\":[\"mcs9BbfpBM1DhBhBODOIOgBEaYeCUNoCKmBN\"],\"a\":\"SK\"},{\"i\":\"203\",\"n\":\"Czechia\",\"r\":[\"4S8_BULeDBLUHGKcDELeBSTrCjBjCSjBTpCoBJcyCiBcA\"],\"a\":\"CZ\"},{\"i\":\"232\",\"n\":\"Eritrea\",\"r\":[\"ytBgSFQW2CMMeIUWiBzC6E_DLJRE5B-BhBQlBKXJXSLdtBI\"]},{\"i\":\"392\",\"n\":\"Japan\",\"r\":[\"sxFgxBlBpBCnBPfGTTbzBTlCB3BtBbQAelCHvBTtBAoBdZjCZPTOKkBZMPcmBMWakCwBwCMsBHoBmCcRyC2BYyBFsBQaqBIW3BAf\",\"40F-2BcSKtB7BJhBnB_BcVrBrBBFoBUgBsBCW2CwBpB6BV\",\"ulF6pBYYWDQQeHENVXPMTHLXZMAS\"],\"a\":\"JP\"},{\"i\":\"600\",\"n\":\"Paraguay\",\"r\":[\"1oCnZMVD1BqBHSIaJQ_BeEOFTnDjBffFzCSmB8BFS5CsBfGpCiCSmCSiBsDMkBTCN\"],\"a\":\"PY\"},{\"i\":\"887\",\"n\":\"Yemen\",\"r\":[\"ghC4XsB9CbJJfnDjBhBbdAXPjCLZX7BBjBmDICAsBQMDSMUQL2DAKNSGeqBkBS0DQ\"]},{\"i\":\"682\",\"n\":\"Saudi Arabia\",\"r\":[\"2rB2kBsBFcaeGUUnBoB4CawBJ8BbwDvCuDHKRcAQhB2BnBErBWhBYDYhC4DTIISbZvC3DnBzDPjBRdpBRFJO1DAPMLTERPLVsBTQVgBJiBtBiBZmBD0BVsBnBYV0BnCiDTAM0B\"]},{\"n\":\"N. Cyprus\",\"r\":[\"-oB-rBIKiCKbPEHxBE\"]},{\"i\":\"196\",\"n\":\"Cyprus\",\"r\":[\"-oB-rByBFnBRTGJQUC\"],\"a\":\"CY\"},{\"i\":\"504\",\"n\":\"Morocco\",\"r\":[\"1C-rBe7CKHFPzBFRPXBBdtBPPTnCP_BdFlClBJhCCLfNBRzB3BpBL3BVf5CDCUcgBDMOckBgBamCaOaqBWQkBE2CoCJyBU2BacmCiBmBiCeAYPiDH\"],\"a\":\"MA\"},{\"i\":\"818\",\"n\":\"Egypt\",\"r\":[\"iuBwb5OAAiJLgBKYFSOS2BCgDdwBYkBEcDKTKM-BLUKajCdjCJFdehB2BoCvEgC3CHHCZ0BrB\"],\"a\":\"EG\"},{\"i\":\"434\",\"n\":\"Libya\",\"r\":[\"ofwbAvCtBAAP_J4EjCjBVW_BQRafSRFnBkCQQGiDN2BSKAiB8BmBCgB2EjBShBoEtBmBeJeqBmBcG2BHORiCLKNNRGRJXMfAhJ\"]},{\"i\":\"231\",\"n\":\"Ethiopia\",\"r\":[\"47BgKxD3DzBBjBbXALNbAPOjBPLR5BIxBiBbANOAWTGXsBRKbiBXEOWUCS6CUKUwBYUYoCuBHMeYRYKmBJiBPcZejBbjBEXgBCKFJPuB1BiEvBiBA\"],\"a\":\"ET\"},{\"i\":\"262\",\"n\":\"Djibouti\",\"r\":[\"-0B2PSDMKILAPXJSLNTJGfBDYckB\"]},{\"n\":\"Somaliland\",\"r\":[\"m9BoOAtCtB5BhBAhEwBtB2BYkBmBnBiGmB\"]},{\"i\":\"800\",\"n\":\"Uganda\",\"r\":[\"sqBlB9DBlBRHEKuCYoBcYPGEuBQMaJ8BKYSUbWhCtBnCApB\"],\"a\":\"UG\"},{\"i\":\"646\",\"n\":\"Rwanda\",\"r\":[\"gmBtBQVBXfBLVXCKyBsBS\"],\"a\":\"RW\"},{\"i\":\"070\",\"n\":\"Bosnia and Herz.\",\"r\":[\"mXq1BjBQvBoBbeISOJcK-CPJRUNFTdNFV\"],\"a\":\"BA\"},{\"i\":\"807\",\"n\":\"Macedonia\",\"r\":[\"gc80BULCZtCTPKFQMWiCK\"],\"a\":\"MK\"},{\"i\":\"688\",\"n\":\"Serbia\",\"r\":[\"yXs5B2BKadaHCRYJMIKDLXYfPLBRlBHGSlBWVRpBcKCGUTOKSNAQQVa\"],\"a\":\"RS\"},{\"i\":\"499\",\"n\":\"Montenegro\",\"r\":[\"iZo1BJDBIRTCLjBYKcUMuBXLL\"],\"a\":\"ME\"},{\"n\":\"Kosovo\",\"r\":[\"4Zq0BDORQYYsBTFRnBP\"],\"a\":\"XK\"},{\"i\":\"780\",\"n\":\"Trinidad and Tobago\",\"r\":[\"jtCuNgBEBdnBAMKBQ\"]},{\"i\":\"728\",\"n\":\"S. Sudan\",\"r\":[\"ymBsEtBsBxBLREfuBdQJYrBmBAOvBeaMU2BeGmBlBOIqCJqBkBiBXUEqB0BNiBaCCKSBA7BUNMhCHLTBNVYDWRwBlCrCjC7BJZKPL\"]}]}<\/script>\n<!-- GPV-GEO END -->\n\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function(){\n  var root = document.getElementById('gp-roi');\n  if(!root ? true : root.dataset.roiInit) return;\n  root.dataset.roiInit = '1';\n  var $ = function(s){ return root.querySelector(s); };\n  \/* \u2500\u2500 GPV-ROI-CORE BEGIN \u2014 GENERATED, DO NOT EDIT HERE \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n   GPROI \u2014 the benefit model behind the Variable Rate ROI Calculator.\n   SOURCE OF TRUTH. rebuild.sh re-injects this file verbatim into source.html\n   between the GPZ-ROI-CORE markers, so edit it HERE and never inside the\n   generated section. tests.js requires this file directly, so the maths it\n   pins is the maths that ships.\n   The model is the one locked for the 2026 pricing page, so the two pages\n   cannot quote different numbers for the same farm:\n     benefit per hectare of WHOLE farm\n       = evidence midpoint for the region and crop      (net USD per acre of\n                                                         RESPONSIVE area, full\n                                                         variable-rate program)\n       x program coverage                               (sub-additive stacking\n                                                         of the practices the\n                                                         user actually varies)\n       x bounded crop-value nudge                       (0.75 to 1.25)\n       clamped into EUR 10-45 per hectare of responsive area\n       x the share of the farm that responds            (0.25 \/ 0.5 \/ 0.75 by\n                                                         variability)\n   and the figure is shown as that midpoint plus or minus 40 percent.\n   Two properties matter and both are deliberate. It is a NET benefit in\n   currency per area, never a percentage of gross revenue, so it cannot balloon\n   when a user types a high yield or a high price. And stacking practices is\n   sub-additive, so ticking all five boxes does not multiply the answer by five.\n   Rule 1: no ampersand character anywhere in this file. It is injected into a\n   script body and WordPress would encode it into a syntax error.\n   \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 *\/\nvar GPROI = (function () {\n  var AC_PER_HA = 2.4710538;\n  var USD_PER_EUR = 1.08;            \/\/ indicative, same figure as the price list\n  \/\/ Share of the farm that responds to variable rate, by how variable it is.\n  var RESP = { low: 0.25, medium: 0.5, high: 0.75 };\n  \/\/ What each practice contributes to a full variable-rate program, relative to\n  \/\/ variable-rate nitrogen, which is the best evidenced of them.\n  var OP_SHARE = { n: 1.0, seed: 0.7, pk: 0.6, lime: 0.5, crop: 0.35 };\n  \/\/ Sub-additive stacking: contributions sorted strongest first and weighted\n  \/\/ down the list, then normalised so the full program equals 1. Two practices\n  \/\/ are worth more than one and less than two.\n  var STACK_W = [1.0, 0.5, 0.25, 0.25, 0.25];\n  \/\/ Published net benefits cluster in this band per hectare of responsive area.\n  \/\/ Any combination of inputs is clamped into it.\n  var CAP_EUR_HA = { lo: 10, hi: 45 };\n  \/\/ The figure is a midpoint. This is the half-width shown either side of it.\n  var RANGE = 0.4;\n  \/\/ How far a user's own yield and price may move the answer. A field worth\n  \/\/ twice the regional average does not return twice the benefit.\n  var GROSS_MIN = 0.75, GROSS_MAX = 1.25;\n  \/* Net benefit in USD per acre of RESPONSIVE area for a FULL variable-rate\n     program, by agroclimatic zone and crop, from published precision-ag\n     research. Zone names match the region table in source.html. *\/\n  var EVIDENCE = {\n    'Continental Cornbelt': { _src: 'published variable-rate studies (Cola\u00e7o and Bramley 2018, Field Crops Research; Lowenberg-DeBoer and Erickson 2019, Agronomy Journal)',\n      corn: { lo: 10, hi: 24 }, soybean: { lo: 5, hi: 13 }, wheat: { lo: 4, hi: 11 } },\n    'Northern Plains \/ Prairies': { _src: 'Canadian Prairie and Northern Plains variable-rate trials',\n      wheat: { lo: 4, hi: 12 }, rapeseed: { lo: 5, hi: 14 }, corn: { lo: 7, hi: 17 }, soybean: { lo: 4, hi: 11 } },\n    'Subtropical Cerrado': { _src: 'Embrapa precision-agriculture studies (Brazil)',\n      soybean: { lo: 6, hi: 16 }, corn: { lo: 6, hi: 15 }, cotton: { lo: 8, hi: 20 } },\n    'Pampas': { _src: 'INTA precision-agriculture studies (Argentina)',\n      soybean: { lo: 5, hi: 14 }, corn: { lo: 6, hi: 16 }, wheat: { lo: 4, hi: 11 }, sunflower: { lo: 4, hi: 12 } },\n    'Atlantic Maritime': { _src: 'AHDB variable-rate nitrogen trials (UK)',\n      wheat: { lo: 8, hi: 20 }, rapeseed: { lo: 6, hi: 16 } },\n    'Atlantic Temperate': { _src: 'European precision-agriculture field trials',\n      wheat: { lo: 6, hi: 16 }, corn: { lo: 8, hi: 18 }, rapeseed: { lo: 6, hi: 15 } },\n    'Atlantic \/ Continental': { _src: 'European precision-agriculture field trials',\n      wheat: { lo: 7, hi: 17 }, rapeseed: { lo: 6, hi: 15 }, corn: { lo: 8, hi: 18 } },\n    'Mediterranean': { _src: 'Mediterranean dryland variable-rate studies',\n      wheat: { lo: 3, hi: 10 }, sunflower: { lo: 3, hi: 10 }, rapeseed: { lo: 3, hi: 10 } },\n    'Mediterranean \/ Semi-arid': { _src: 'GRDC precision-agriculture research (Australia)',\n      wheat: { lo: 4, hi: 12 }, rapeseed: { lo: 3, hi: 10 }, cotton: { lo: 8, hi: 18 } },\n    'Continental Eastern Europe': { _src: 'Central and Eastern European precision-ag trials',\n      wheat: { lo: 4, hi: 12 }, corn: { lo: 6, hi: 14 }, sunflower: { lo: 3, hi: 10 }, rapeseed: { lo: 4, hi: 12 }, soybean: { lo: 3, hi: 9 } },\n    'Continental Steppe': { _src: 'Black Sea and Kazakh steppe variable-rate field trials',\n      wheat: { lo: 3, hi: 11 }, sunflower: { lo: 3, hi: 10 }, corn: { lo: 5, hi: 13 }, rapeseed: { lo: 4, hi: 11 } },\n    'Subtropical Highveld': { _src: 'South African precision-agriculture studies',\n      corn: { lo: 5, hi: 13 }, soybean: { lo: 3, hi: 10 }, wheat: { lo: 3, hi: 9 } },\n    'Temperate Oceanic': { _src: 'New Zealand precision-agriculture studies',\n      wheat: { lo: 6, hi: 16 }, corn: { lo: 8, hi: 18 } },\n    'Continental \/ Monsoon': { _src: 'regional precision-agriculture trials',\n      corn: { lo: 5, hi: 13 }, wheat: { lo: 4, hi: 11 }, cotton: { lo: 6, hi: 16 } },\n    'Monsoon Tropical': { _src: 'regional precision-agriculture trials',\n      wheat: { lo: 3, hi: 10 }, cotton: { lo: 6, hi: 16 } }\n  };\n  \/* Crop-level fallback when the region's table has no entry for the crop. *\/\n  var CROP_FALLBACK = {\n    corn: { lo: 8, hi: 18, src: 'independent multi-year corn variable-rate trials' },\n    soybean: { lo: 4, hi: 12, src: 'independent soybean variable-rate trials' },\n    wheat: { lo: 4, hi: 12, src: 'independent wheat variable-rate nitrogen trials' },\n    sunflower: { lo: 3, hi: 10, src: 'independent sunflower variable-rate trials' },\n    rapeseed: { lo: 5, hi: 13, src: 'independent oilseed-rape variable-rate trials' },\n    cotton: { lo: 7, hi: 18, src: 'independent cotton variable-rate trials' },\n    potato: { lo: 12, hi: 30, src: 'independent potato variable-rate trials' },\n    other: { lo: 5, hi: 13, src: 'independent multi-year variable-rate trials' }\n  };\n  var GLOBAL = { lo: 5, hi: 13, src: 'independent multi-year variable-rate trials' };\n  \/* The full program, for normalising the stack. *\/\n  var STACK_FULL = (function () {\n    var all = [], k;\n    for (k in OP_SHARE) { if (Object.prototype.hasOwnProperty.call(OP_SHARE, k)) { all.push(OP_SHARE[k]); } }\n    all.sort(function (a, b) { return b - a; });\n    var s = 0, i;\n    for (i = 0; i < all.length; i++) { s += all[i] * (STACK_W[i] === undefined ? 0.25 : STACK_W[i]); }\n    return s;\n  })();\n  \/* practices: array of ids from OP_SHARE. Returns 0 when nothing is ticked and\n     1 when everything is. *\/\n  function stackFactor(practices) {\n    var shares = [], i;\n    practices = practices ? practices : [];\n    for (i = 0; i < practices.length; i++) {\n      var sh = OP_SHARE[practices[i]];\n      if (sh !== undefined) { shares.push(sh); }\n    }\n    shares.sort(function (a, b) { return b - a; });\n    var s = 0;\n    for (i = 0; i < shares.length; i++) { s += shares[i] * (STACK_W[i] === undefined ? 0.25 : STACK_W[i]); }\n    return STACK_FULL > 0 ? s \/ STACK_FULL : 0;\n  }\n  \/* How far this field's own gross revenue sits from the regional reference,\n     bounded so a typo cannot run away with the answer. Both figures must be in\n     the same currency and the same area unit; the ratio cancels both. *\/\n  function grossFactor(userGross, refGross) {\n    if (!(refGross > 0)) { return 1; }\n    var f = userGross \/ refGross;\n    if (!isFinite(f)) { return 1; }\n    return f < GROSS_MIN ? GROSS_MIN : (f > GROSS_MAX ? GROSS_MAX : f);\n  }\n  \/* Region and crop to an evidence band, falling back crop-wide then global. *\/\n  function evidence(zone, crop) {\n    var z = EVIDENCE[zone];\n    if (z ? z[crop] : false) { return { lo: z[crop].lo, hi: z[crop].hi, src: z._src }; }\n    var c = CROP_FALLBACK[crop];\n    if (c) { return { lo: c.lo, hi: c.hi, src: c.src }; }\n    return { lo: GLOBAL.lo, hi: GLOBAL.hi, src: GLOBAL.src };\n  }\n  var capLoUsdAc = CAP_EUR_HA.lo * USD_PER_EUR \/ AC_PER_HA;\n  var capHiUsdAc = CAP_EUR_HA.hi * USD_PER_EUR \/ AC_PER_HA;\n  \/* The whole model.\n       o.zone         agroclimatic zone name, or anything unknown for the fallback\n       o.crop         one of the CROP_FALLBACK keys\n       o.variability  'low' | 'medium' | 'high'\n       o.practices    array of practice ids being varied\n       o.userGross    this field's yield x price, user's currency and area unit\n       o.refGross     the regional default yield x price, SAME currency and unit\n     Returns net benefit per acre and per hectare of the WHOLE farm, in USD,\n     plus every intermediate figure so the page can show its working. *\/\n  function benefit(o) {\n    o = o ? o : {};\n    var ev = evidence(o.zone, o.crop);\n    var stack = stackFactor(o.practices);\n    var resp = RESP[o.variability] === undefined ? RESP.medium : RESP[o.variability];\n    var gross = grossFactor(o.userGross, o.refGross);\n    var evMid = (ev.lo + ev.hi) \/ 2;\n    if (stack <= 0) {\n      return { midUsdAc: 0, loUsdAc: 0, hiUsdAc: 0, midUsdHa: 0, loUsdHa: 0, hiUsdHa: 0,\n               evLo: ev.lo, evHi: ev.hi, evMid: evMid, src: ev.src,\n               stack: 0, resp: resp, gross: gross, perRespUsdAc: 0, perRespEurHa: 0, capped: '' };\n    }\n    var perResp = evMid * stack * gross;\n    var capped = '';\n    if (perResp < capLoUsdAc) { perResp = capLoUsdAc; capped = 'low'; }\n    else if (perResp > capHiUsdAc) { perResp = capHiUsdAc; capped = 'high'; }\n    var mid = perResp * resp;\n    return {\n      midUsdAc: mid, loUsdAc: mid * (1 - RANGE), hiUsdAc: mid * (1 + RANGE),\n      midUsdHa: mid * AC_PER_HA, loUsdHa: mid * (1 - RANGE) * AC_PER_HA, hiUsdHa: mid * (1 + RANGE) * AC_PER_HA,\n      evLo: ev.lo, evHi: ev.hi, evMid: evMid, src: ev.src,\n      stack: stack, resp: resp, gross: gross,\n      perRespUsdAc: perResp, perRespEurHa: perResp * AC_PER_HA \/ USD_PER_EUR,\n      capped: capped\n    };\n  }\n  return {\n    AC_PER_HA: AC_PER_HA, USD_PER_EUR: USD_PER_EUR, RANGE: RANGE,\n    RESP: RESP, OP_SHARE: OP_SHARE, STACK_W: STACK_W, STACK_FULL: STACK_FULL,\n    CAP_EUR_HA: CAP_EUR_HA, GROSS_MIN: GROSS_MIN, GROSS_MAX: GROSS_MAX,\n    EVIDENCE: EVIDENCE, CROP_FALLBACK: CROP_FALLBACK, GLOBAL: GLOBAL,\n    stackFactor: stackFactor, grossFactor: grossFactor, evidence: evidence, benefit: benefit\n  };\n})();\nif (typeof module !== 'undefined' ? module.exports : false) { module.exports = GPROI; }\n  \/* GPV-ROI-CORE END *\/\n  \/\/ Per-crop defaults in both unit systems, as conservative midpoints from FAO,\n  \/\/ USDA and AHDB market data. Imperial uses the US ag unit for each crop.\n  var CROPS = {\n    metric: {\n      corn:      { yld: 10,   price: 200,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      soybean:   { yld: 3,    price: 400,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      wheat:     { yld: 6,    price: 250,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      sunflower: { yld: 3,    price: 450,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      rapeseed:  { yld: 3.5,  price: 500,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      cotton:    { yld: 1.5,  price: 1500, yldUnit: 't\/ha', priceUnit: '\/t' },\n      potato:    { yld: 30,   price: 250,  yldUnit: 't\/ha', priceUnit: '\/t' },\n      other:     { yld: 5,    price: 300,  yldUnit: 't\/ha', priceUnit: '\/t' }\n    },\n    imperial: {\n      corn:      { yld: 180,  price: 4.50, yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      soybean:   { yld: 50,   price: 11,   yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      wheat:     { yld: 60,   price: 6,    yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      sunflower: { yld: 1500, price: 0.20, yldUnit: 'lb\/ac',  priceUnit: '\/lb' },\n      rapeseed:  { yld: 40,   price: 12,   yldUnit: 'bu\/ac',  priceUnit: '\/bu' },\n      cotton:    { yld: 800,  price: 0.75, yldUnit: 'lb\/ac',  priceUnit: '\/lb' },\n      potato:    { yld: 400,  price: 10,   yldUnit: 'cwt\/ac', priceUnit: '\/cwt' },\n      other:     { yld: 80,   price: 5,    yldUnit: 'bu\/ac',  priceUnit: '\/bu' }\n    }\n  };\n  var VAR_HINTS = {\n    low:    'Yield swings under 10 percent across the field. Even soils, flat ground. A quarter of it answers a changed rate.',\n    medium: 'Yield swings 10 to 25 percent across the field. Half the ground answers a changed rate.',\n    high:   'Yield swings over 25 percent. Mixed soils, rolling ground, eroded or compacted patches. Three quarters of it answers a changed rate.'\n  };\n  var PRACTICE_LABELS = { n:'Nitrogen', seed:'Seeding rate', pk:'P and K', lime:'Lime and pH', crop:'Crop protection' };\n  \/\/ \u2500\u2500\u2500 REGIONAL DEFAULTS \u2014 agroclimatic zones \u00d7 crops \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ Country code \u2192 { name, zone, continent, units, areaDefault }\n  \/\/ Zone names use farmer-recognisable language, not K\u00f6ppen codes.\n  \/\/ `continent` groups the country in the List-view picker.\n  var COUNTRIES = {\n    US: { name:'United States',  zone:'Continental Cornbelt',          continent:'North America', units:'imperial', areaDefault:200 },\n    CA: { name:'Canada',          zone:'Northern Plains \/ Prairies',    continent:'North America', units:'imperial', areaDefault:300 },\n    BR: { name:'Brazil',          zone:'Subtropical Cerrado',           continent:'South America', units:'metric',   areaDefault:250 },\n    AR: { name:'Argentina',       zone:'Pampas',                        continent:'South America', units:'metric',   areaDefault:250 },\n    GB: { name:'United Kingdom',  zone:'Atlantic Maritime',             continent:'Europe',        units:'metric',   areaDefault:80  },\n    FR: { name:'France',          zone:'Atlantic Temperate',            continent:'Europe',        units:'metric',   areaDefault:120 },\n    DE: { name:'Germany',         zone:'Atlantic \/ Continental',        continent:'Europe',        units:'metric',   areaDefault:80  },\n    ES: { name:'Spain',           zone:'Mediterranean',                 continent:'Europe',        units:'metric',   areaDefault:60  },\n    IT: { name:'Italy',           zone:'Mediterranean',                 continent:'Europe',        units:'metric',   areaDefault:40  },\n    PL: { name:'Poland',          zone:'Continental Eastern Europe',    continent:'Europe',        units:'metric',   areaDefault:60  },\n    UA: { name:'Ukraine',         zone:'Continental Steppe',            continent:'Europe',        units:'metric',   areaDefault:500 },\n    RO: { name:'Romania',         zone:'Continental Eastern Europe',    continent:'Europe',        units:'metric',   areaDefault:200 },\n    HU: { name:'Hungary',         zone:'Continental Eastern Europe',    continent:'Europe',        units:'metric',   areaDefault:120 },\n    KZ: { name:'Kazakhstan',      zone:'Continental Steppe',            continent:'Asia',          units:'metric',   areaDefault:1000 },\n    IN: { name:'India',           zone:'Monsoon Tropical',              continent:'Asia',          units:'metric',   areaDefault:20  },\n    CN: { name:'China',           zone:'Continental \/ Monsoon',         continent:'Asia',          units:'metric',   areaDefault:50  },\n    ZA: { name:'South Africa',    zone:'Subtropical Highveld',          continent:'Africa',        units:'metric',   areaDefault:150 },\n    AU: { name:'Australia',       zone:'Mediterranean \/ Semi-arid',     continent:'Oceania',       units:'metric',   areaDefault:500 },\n    NZ: { name:'New Zealand',     zone:'Temperate Oceanic',             continent:'Oceania',       units:'metric',   areaDefault:100 }\n  };\n  \/\/ Display order for the List-view groupings (also drives the picker layout).\n  var CONTINENT_ORDER = ['North America','South America','Europe','Asia','Africa','Oceania'];\n  \/\/ Zone \u00d7 crop \u2192 { yld, price, yldUnit, priceUnit } \u2014 metric base. Imperial\n  \/\/ conversion happens at display time via CROPS[unitSystem]. Calibrated from\n  \/\/ FAO \/ USDA NASS \/ AHDB \/ university-extension yield midpoints (3-year averages\n  \/\/ 2021-2024 where available). Missing combinations fall back to global CROPS.\n  var REGIONAL_YIELDS = {\n    'Continental Cornbelt': {\n      corn:      { yld:12,   price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:3.5,  price:400, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:6.5,  price:250, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Northern Plains \/ Prairies': {\n      wheat:     { yld:4,    price:250, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:9,    price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:2.5,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:3,    price:400, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Subtropical Cerrado': {\n      soybean:   { yld:3.5,  price:380, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:6.5,  price:180, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.7,  price:1500,yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Pampas': {\n      soybean:   { yld:3.2,  price:380, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:8.5,  price:180, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:3.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.5,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Mediterranean \/ Semi-arid': {\n      wheat:     { yld:2.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:1.8,  price:520, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.5,  price:1500,yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Temperate Oceanic': {\n      wheat:     { yld:8,    price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:11,   price:220, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Atlantic Maritime': {\n      wheat:     { yld:8.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3.5,  price:480, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Atlantic Temperate': {\n      wheat:     { yld:7,    price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:10,   price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3.5,  price:480, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Atlantic \/ Continental': {\n      wheat:     { yld:7.5,  price:240, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3.5,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:10,   price:210, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Mediterranean': {\n      wheat:     { yld:3.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.5,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:2.5,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Continental Eastern Europe': {\n      wheat:     { yld:5.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:7.5,  price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.8,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:3,    price:500, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:2.7,  price:400, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Continental Steppe': {\n      wheat:     { yld:3.5,  price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      sunflower: { yld:2.5,  price:450, yldUnit:'t\/ha', priceUnit:'\/t' },\n      corn:      { yld:6.5,  price:200, yldUnit:'t\/ha', priceUnit:'\/t' },\n      rapeseed:  { yld:2.8,  price:500, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Subtropical Highveld': {\n      corn:      { yld:5.5,  price:220, yldUnit:'t\/ha', priceUnit:'\/t' },\n      soybean:   { yld:2.5,  price:400, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:3.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Monsoon Tropical': {\n      wheat:     { yld:3.5,  price:300, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.5,  price:1700,yldUnit:'t\/ha', priceUnit:'\/t' }\n    },\n    'Continental \/ Monsoon': {\n      corn:      { yld:7,    price:230, yldUnit:'t\/ha', priceUnit:'\/t' },\n      wheat:     { yld:5.5,  price:280, yldUnit:'t\/ha', priceUnit:'\/t' },\n      cotton:    { yld:1.8,  price:1600,yldUnit:'t\/ha', priceUnit:'\/t' }\n    }\n  };\n  \/\/ Country centroid (lng, lat) for the globe-view markers. Approximations\n  \/\/ of major-ag-region centres, not strict geographic centroids.\n  \/\/ Country detection: layered fallbacks, browser signals first, then one anonymous IP lookup.\n  \/\/ Order: (1) localStorage saved \u2192 (2) Intl.Locale.region from each\n  \/\/ navigator.languages entry \u2192 (3) `xx-CC` suffix regex on languages \u2192\n  \/\/ (4) Intl timezone \u2192 mapped country. TZ map covers the 20 supported\n  \/\/ COUNTRIES directly, plus neighbouring TZs that route to the closest\n  \/\/ supported country (Europe\/Vienna\u2192DE, Europe\/Stockholm\u2192PL, etc.) so VPN\n  \/\/ \/ satellite-office \/ nearby-country users still land on a sensible default.\n  var TZ_COUNTRY = {\n    \/\/ United States\n    'America\/Chicago':'US','America\/Los_Angeles':'US','America\/New_York':'US','America\/Denver':'US',\n    'America\/Indiana\/Indianapolis':'US','America\/Detroit':'US','America\/St_Louis':'US','America\/Phoenix':'US',\n    'America\/Anchorage':'US','America\/Boise':'US','America\/Kentucky\/Louisville':'US','America\/Indianapolis':'US',\n    \/\/ Canada\n    'America\/Toronto':'CA','America\/Edmonton':'CA','America\/Winnipeg':'CA','America\/Vancouver':'CA',\n    'America\/Halifax':'CA','America\/Regina':'CA','America\/St_Johns':'CA','America\/Montreal':'CA',\n    \/\/ South America\n    'America\/Sao_Paulo':'BR','America\/Recife':'BR','America\/Bahia':'BR','America\/Fortaleza':'BR',\n    'America\/Argentina\/Buenos_Aires':'AR','America\/Argentina\/Cordoba':'AR','America\/Argentina\/Mendoza':'AR',\n    'America\/Montevideo':'AR','America\/Asuncion':'AR',\n    \/\/ Western Europe\n    'Europe\/London':'GB','Europe\/Belfast':'GB','Europe\/Dublin':'GB',\n    'Europe\/Paris':'FR','Europe\/Brussels':'FR','Europe\/Luxembourg':'FR','Europe\/Amsterdam':'DE',\n    'Europe\/Berlin':'DE','Europe\/Vienna':'DE','Europe\/Zurich':'DE','Europe\/Copenhagen':'DE',\n    'Europe\/Madrid':'ES','Europe\/Lisbon':'ES','Europe\/Andorra':'ES','Atlantic\/Canary':'ES',\n    'Europe\/Rome':'IT','Europe\/Vatican':'IT','Europe\/Malta':'IT','Europe\/San_Marino':'IT',\n    \/\/ Central \/ Eastern Europe\n    'Europe\/Warsaw':'PL','Europe\/Prague':'PL','Europe\/Bratislava':'PL','Europe\/Stockholm':'PL',\n    'Europe\/Oslo':'PL','Europe\/Helsinki':'PL',\n    'Europe\/Kiev':'UA','Europe\/Kyiv':'UA','Europe\/Uzhgorod':'UA','Europe\/Zaporozhye':'UA','Europe\/Simferopol':'UA',\n    'Europe\/Bucharest':'RO','Europe\/Sofia':'RO','Europe\/Chisinau':'RO',\n    'Europe\/Budapest':'HU','Europe\/Belgrade':'HU','Europe\/Zagreb':'HU','Europe\/Ljubljana':'HU','Europe\/Sarajevo':'HU','Europe\/Skopje':'HU','Europe\/Tirane':'HU','Europe\/Podgorica':'HU',\n    \/\/ Central Asia (incl. neighbours of the steppe belt)\n    'Asia\/Almaty':'KZ','Asia\/Aqtobe':'KZ','Asia\/Aqtau':'KZ','Asia\/Atyrau':'KZ','Asia\/Oral':'KZ',\n    'Asia\/Tashkent':'KZ','Asia\/Bishkek':'KZ','Asia\/Dushanbe':'KZ','Asia\/Ashgabat':'KZ',\n    'Asia\/Yekaterinburg':'KZ','Asia\/Omsk':'KZ','Asia\/Novosibirsk':'KZ','Asia\/Krasnoyarsk':'KZ',\n    \/\/ Africa\n    'Africa\/Johannesburg':'ZA','Africa\/Cairo':'ZA','Africa\/Casablanca':'ZA','Africa\/Nairobi':'ZA',\n    'Africa\/Lagos':'ZA','Africa\/Algiers':'ZA','Africa\/Tunis':'ZA',\n    \/\/ Oceania\n    'Australia\/Sydney':'AU','Australia\/Melbourne':'AU','Australia\/Brisbane':'AU',\n    'Australia\/Perth':'AU','Australia\/Adelaide':'AU','Australia\/Darwin':'AU','Australia\/Hobart':'AU',\n    'Pacific\/Auckland':'NZ','Pacific\/Chatham':'NZ',\n    \/\/ South + East Asia\n    'Asia\/Kolkata':'IN','Asia\/Calcutta':'IN','Asia\/Karachi':'IN','Asia\/Dhaka':'IN','Asia\/Colombo':'IN','Asia\/Kathmandu':'IN',\n    'Asia\/Shanghai':'CN','Asia\/Beijing':'CN','Asia\/Urumqi':'CN','Asia\/Harbin':'CN','Asia\/Hong_Kong':'CN',\n    'Asia\/Macau':'CN','Asia\/Taipei':'CN','Asia\/Seoul':'CN','Asia\/Tokyo':'CN'\n  };\n  \/\/ Stash how detection landed (for the locale banner debug line \u2014 user asked\n  \/\/ to surface this so they can see why the default is what it is).\n  var detectSource = '';\n  \/\/ Map any ISO country code (incl. unsupported ones) to the closest country\n  \/\/ we DO have in COUNTRIES. Used after IP geolocation when the visitor's\n  \/\/ actual country isn't in our supported set \u2014 instead of falling back to US\n  \/\/ we land them on the geographically nearest agroclimatic match.\n  var CC_FALLBACK = {\n    \/\/ North America\n    MX:'US',GT:'US',CR:'US',PA:'US',CU:'US',DO:'US',HT:'US',JM:'US',PR:'US',\n    \/\/ South America\n    UY:'AR',PY:'AR',CL:'AR',BO:'AR',PE:'AR',EC:'AR',CO:'AR',VE:'AR',GY:'BR',SR:'BR',\n    \/\/ Western \/ Central Europe\n    AT:'DE',CH:'DE',BE:'FR',NL:'DE',LU:'FR',DK:'DE',IS:'GB',\n    SE:'PL',NO:'PL',FI:'PL',\n    IE:'GB',PT:'ES',GR:'IT',MT:'IT',CY:'IT',\n    \/\/ Eastern Europe \/ Balkans\n    CZ:'PL',SK:'PL',SI:'HU',HR:'HU',BA:'HU',RS:'HU',ME:'HU',MK:'HU',AL:'HU',XK:'HU',\n    BG:'RO',MD:'RO',\n    LT:'PL',LV:'PL',EE:'PL',\n    \/\/ Russia + Belarus \u2192 KZ (steppe-belt match)\n    RU:'KZ',BY:'PL',\n    \/\/ Africa\n    KE:'ZA',ZM:'ZA',ZW:'ZA',BW:'ZA',MZ:'ZA',TZ:'ZA',UG:'ZA',RW:'ZA',NG:'ZA',GH:'ZA',\n    EG:'ZA',MA:'ZA',TN:'ZA',DZ:'ZA',ET:'ZA',SD:'ZA',NA:'ZA',\n    \/\/ Central Asia + Caucasus\n    UZ:'KZ',KG:'KZ',TJ:'KZ',TM:'KZ',AZ:'KZ',GE:'KZ',AM:'KZ',MN:'KZ',\n    \/\/ South Asia\n    PK:'IN',BD:'IN',NP:'IN',LK:'IN',BT:'IN',MM:'IN',AF:'IN',\n    \/\/ East \/ SE Asia\n    JP:'CN',KR:'CN',TW:'CN',HK:'CN',MY:'CN',SG:'CN',TH:'CN',VN:'CN',PH:'CN',ID:'CN',\n    LA:'CN',KH:'CN',\n    \/\/ Oceania (other islands)\n    FJ:'AU',PG:'AU',NC:'AU',VU:'AU',SB:'AU'\n  };\n  function resolveCC(cc){\n    if(!cc) return null;\n    cc = String(cc).toUpperCase();\n    if(COUNTRIES[cc]) return cc;\n    if(CC_FALLBACK[cc] ? COUNTRIES[CC_FALLBACK[cc]] : false) return CC_FALLBACK[cc];\n    return null;\n  }\n  function detectCountry(){\n    try {\n      var saved = localStorage.getItem('gpy-roi-country');\n      if(saved ? COUNTRIES[saved] : false){ detectSource = 'saved'; return saved; }\n    } catch(_){}\n    \/\/ WP server-side hook: if the WordPress theme \/ plugin injected\n    \/\/   window.__GP_GEO = { country: 'XX' }\n    \/\/ (e.g., from a server-side GeoIP plugin reading the visitor's IP), trust\n    \/\/ that signal first. Lets the site upgrade detection later without touching\n    \/\/ the tool's JS.\n    try {\n      var gp = window.__GP_GEO;\n      if(gp ? gp.country : false){\n        var fromWP = resolveCC(gp.country);\n        if(fromWP){ detectSource = 'WordPress geo'; return fromWP; }\n      }\n    } catch(_){}\n    \/\/ Walk every navigator.languages entry (most browsers list 2-5).\n    var langs = [];\n    try { if(navigator.languages ? navigator.languages.length : false) langs = Array.prototype.slice.call(navigator.languages); } catch(_){}\n    try { if(navigator.language) langs.push(navigator.language); } catch(_){}\n    for(var li=0; li<langs.length; li++){\n      var lng = (langs[li] || '').trim();\n      if(!lng) continue;\n      \/\/ First try Intl.Locale \u2014 most reliable for tags like \"uk-UA\" or \"kk-Cyrl-KZ\".\n      try {\n        var loc = new Intl.Locale(lng);\n        if(loc.region ? COUNTRIES[loc.region] : false){\n          detectSource = 'language ' + lng;\n          return loc.region;\n        }\n      } catch(_){}\n      \/\/ Fallback regex for older browsers \/ non-standard tags.\n      var m = lng.match(\/[a-z]{2,3}[_-]([A-Z]{2})(?:[_-]|$)\/);\n      if(m ? COUNTRIES[m[1]] : false){\n        detectSource = 'language ' + lng;\n        return m[1];\n      }\n    }\n    \/\/ Timezone fallback \u2014 usually accurate for non-VPN users.\n    try {\n      var tz = Intl.DateTimeFormat().resolvedOptions().timeZone || '';\n      if(TZ_COUNTRY[tz] ? COUNTRIES[TZ_COUNTRY[tz]] : false){\n        detectSource = 'timezone ' + tz;\n        return TZ_COUNTRY[tz];\n      }\n    } catch(_){}\n    detectSource = 'fallback';\n    return 'US';\n  }\n  \/\/ Refine the detected country via a single IP-geolocation request.\n  \/\/ Runs AFTER first paint so the page renders fast even on slow connections.\n  \/\/ Exception to rule 4 (no external runtime fetches) \u2014 surfaced in the locale\n  \/\/ banner as \"via IP geolocation\" so the privacy trade-off is visible.\n  \/\/ Endpoint: api.country.is \u2014 anonymous, returns just { country: \"XX\" }, no\n  \/\/ tracking pixels, no PII beyond the IP it already received.\n  function refineWithIP(){\n    try {\n      \/\/ Only refine if the user hasn't explicitly chosen a country before.\n      if(localStorage.getItem('gpy-roi-country')) return;\n    } catch(_){}\n    if(!window.fetch) return;\n    var done = false;\n    var t = setTimeout(function(){ done = true; }, 2500);\n    fetch('https:\/\/api.country.is\/', { credentials:'omit' })\n      .then(function(r){ return r.ok ? r.json() : null; })\n      .then(function(d){\n        if(done ? true : !d) return;\n        clearTimeout(t);\n        var cc = resolveCC(d.country);\n        if(!cc ? true : cc === state.country) return;\n        state.country = cc;\n        detectSource = 'IP geolocation';\n        \/\/ Refresh defaults that depend on country (unit system + area + crop).\n        try {\n          if(!localStorage.getItem('gpy-units')){\n            unitSystem = COUNTRIES[cc].units;\n            syncUnitButtons();\n            applyUnitSystem();\n          }\n        } catch(_){}\n        var areaInputEl = $('#roi-area');\n        if(areaInputEl ? !areaInputEl.dataset.userEdited : false){\n          var defaultArea = COUNTRIES[cc].areaDefault;\n          areaInputEl.value = unitSystem === 'imperial' ? Math.round(defaultArea * 2.47105) : defaultArea;\n        }\n        applyCropDefaults();\n        updateLocaleBanner();\n        syncPickerSelection();\n        update();\n      })\n      .catch(function(){ clearTimeout(t); });\n  }\n  var detectedCountry = detectCountry();\n  \/\/ Persist unit system but seed it from detected country if user hasn't chosen.\n  var unitSystem = (COUNTRIES[detectedCountry] ? COUNTRIES[detectedCountry].units : 'metric');\n  try {\n    var saved = localStorage.getItem('gpy-units');\n    if(saved === 'metric' ? true : saved === 'imperial') unitSystem = saved;\n  } catch(e){}\n  \/\/ Country \u2192 local currency. FX rates are midpoint approximations (Jan 2026)\n  \/\/ for display-only conversion; precise live FX isn't worth the runtime fetch\n  \/\/ for what's already an approximate ROI tool. Commodity-pegged regions\n  \/\/ (AR, UA, KZ) keep USD because that's how local grain markets actually quote.\n  var CURRENCY = {\n    US: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'en-US' },\n    CA: { symbol:'CA$', code:'CAD', toUSD:1.36, locale:'en-CA' },\n    BR: { symbol:'R$',  code:'BRL', toUSD:5.0,  locale:'pt-BR' },\n    AR: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'es-AR' },\n    GB: { symbol:'\u00a3',   code:'GBP', toUSD:0.79, locale:'en-GB' },\n    FR: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'fr-FR' },\n    DE: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'de-DE' },\n    ES: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'es-ES' },\n    IT: { symbol:'\u20ac',   code:'EUR', toUSD:0.92, locale:'it-IT' },\n    PL: { symbol:'z\u0142',  code:'PLN', toUSD:4.0,  locale:'pl-PL' },\n    UA: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'uk-UA' },\n    RO: { symbol:'lei', code:'RON', toUSD:4.6,  locale:'ro-RO' },\n    HU: { symbol:'Ft',  code:'HUF', toUSD:360,  locale:'hu-HU' },\n    KZ: { symbol:'$',   code:'USD', toUSD:1.0,  locale:'kk-KZ' },\n    AU: { symbol:'A$',  code:'AUD', toUSD:1.5,  locale:'en-AU' },\n    NZ: { symbol:'NZ$', code:'NZD', toUSD:1.65, locale:'en-NZ' },\n    ZA: { symbol:'R',   code:'ZAR', toUSD:18,   locale:'en-ZA' },\n    IN: { symbol:'\u20b9',   code:'INR', toUSD:83,   locale:'en-IN' },\n    CN: { symbol:'\u00a5',   code:'CNY', toUSD:7.2,  locale:'zh-CN' }\n  };\n  function currencyOf(cc){\n    return CURRENCY[cc] ? CURRENCY[cc] : CURRENCY.US;\n  }\n  var state = { variability: 'medium', country: detectedCountry };\n  \/\/ Format a money amount in the active country's currency. Math is already\n  \/\/ in local currency (defaults are pre-converted in applyCropDefaults), so\n  \/\/ this only applies the symbol + locale-appropriate thousands separator.\n  function fmtMoney(n){\n    var ccy = currencyOf(state.country);\n    if(!isFinite(n) ? true : n < 0) n = 0;\n    var d = n >= 100 ? 0 : (n >= 10 ? 1 : 2);\n    return ccy.symbol + n.toLocaleString(ccy.locale, { minimumFractionDigits:d, maximumFractionDigits:d });\n  }\n  \/\/ Backward-compat alias \u2014 the old name is still referenced in older builds.\n  var fmtUSD = fmtMoney;\n  \/\/ Convert a metric regional entry (t\/ha + $\/t) to imperial for the relevant\n  \/\/ crop. Same per-crop ratios used by the global CROPS table.\n  function metricToImperial(crop, metricEntry){\n    \/\/ crop-specific bu\/lb\/cwt conversion factors (1 metric tonne -> imperial)\n    var bushelTo = {\n      corn:39.368, wheat:36.744, soybean:36.744, rapeseed:44.092\n    };\n    if(bushelTo[crop]){\n      var perBu = metricEntry.price \/ bushelTo[crop];\n      return { yld: Math.round(metricEntry.yld * bushelTo[crop] \/ 2.47105),\n               price: Math.round(perBu * 100) \/ 100,\n               yldUnit: 'bu\/ac', priceUnit: '\/bu' };\n    }\n    if(crop === 'cotton' ? true : crop === 'sunflower'){\n      \/\/ 1 t = 2204.62 lb; convert per-acre\n      var ldYldMet = metricEntry.yld * 2204.62 \/ 2.47105;\n      var pricePerLb = metricEntry.price \/ 2204.62;\n      return { yld: Math.round(ldYldMet),\n               price: Math.round(pricePerLb * 100) \/ 100,\n               yldUnit: 'lb\/ac', priceUnit: '\/lb' };\n    }\n    if(crop === 'potato'){\n      \/\/ 1 t \u2248 22.046 cwt\n      return { yld: Math.round(metricEntry.yld * 22.046 \/ 2.47105),\n               price: Math.round(metricEntry.price \/ 22.046 * 10) \/ 10,\n               yldUnit: 'cwt\/ac', priceUnit: '\/cwt' };\n    }\n    return null;\n  }\n  \/\/ The regional default yield and price for the crop now selected, in the\n  \/\/ active unit system and the active currency. The model compares what the\n  \/\/ user typed against this, so a field worth more than its region returns a\n  \/\/ little more, within bounds.\n  function cropDefaults(){\n    var crop = $('#roi-crop').value;\n    var zone = COUNTRIES[state.country] ? COUNTRIES[state.country].zone : null;\n    var regional = (zone ? REGIONAL_YIELDS[zone] : null);\n    var entry = regional ? regional[crop] : null;\n    var c;\n    if(entry){\n      c = (unitSystem === 'imperial') ? (metricToImperial(crop, entry) ? metricToImperial(crop, entry) : CROPS.imperial[crop]) : entry;\n    } else {\n      c = CROPS[unitSystem][crop];\n    }\n    if(!c) return null;\n    \/\/ Defaults are held in USD, so convert into the country's own currency.\n    var fx = currencyOf(state.country).toUSD;\n    var localPrice = c.price * fx;\n    if(localPrice >= 1000) localPrice = Math.round(localPrice \/ 10) * 10;\n    else if(localPrice >= 100) localPrice = Math.round(localPrice);\n    else if(localPrice >= 10) localPrice = Math.round(localPrice * 10) \/ 10;\n    else localPrice = Math.round(localPrice * 100) \/ 100;\n    return { yld: c.yld, price: localPrice, yldUnit: c.yldUnit, priceUnit: c.priceUnit };\n  }\n  function applyCropDefaults(){\n    var c = cropDefaults();\n    if(!c) return;\n    $('#roi-yield').value = c.yld;\n    $('#roi-price').value = c.price;\n    $('#roi-yield-u').textContent = c.yldUnit;\n    $('#roi-price-u').textContent = c.priceUnit;\n    var symEl = $('#roi-price-sym');\n    if(symEl) symEl.textContent = currencyOf(state.country).symbol;\n  }\n  \/\/ Refresh the locale banner with the active country \/ zone \/ regional stats\n  \/\/ summary. Called on first paint and whenever the user picks a new country\n  \/\/ via the \"Change\" picker.\n  function updateLocaleBanner(){\n    var country = state.country;\n    var info = COUNTRIES[country];\n    if(!info) return;\n    var banner = $('#roi-locale');\n    if(!banner) return;\n    banner.removeAttribute('hidden');\n    $('#roi-loc-country').textContent = info.name;\n    $('#roi-loc-zone').textContent = info.zone;\n    var sep = $('#roi-loc-sep'); if(sep) sep.removeAttribute('hidden');\n    \/\/ Regional summary stats: top 3 crops in this zone with their typical yields\n    var regional = REGIONAL_YIELDS[info.zone];\n    var statsEl = $('#roi-loc-stats');\n    if(statsEl){\n      var line;\n      if(regional){\n        var crops = Object.keys(regional).slice(0, 3);\n        var bits = [];\n        for(var i=0; i<crops.length; i++){\n          var cr = crops[i];\n          var e = regional[cr];\n          var display;\n          if(unitSystem === 'imperial'){\n            var imp = metricToImperial(cr, e);\n            display = imp ? (imp.yld + ' ' + imp.yldUnit) : (e.yld + ' ' + e.yldUnit);\n          } else {\n            display = e.yld + ' ' + e.yldUnit;\n          }\n          bits.push(cr + ' ' + display);\n        }\n        line = 'Typical: ' + bits.join(' \u00b7 ');\n      } else {\n        line = 'Using global midpoints (no regional table for ' + info.zone + ').';\n      }\n      \/\/ Append a tiny \"via X\" hint so the user can see which signal we used.\n      if(detectSource ? state.country === detectedCountry : false){\n        line += ' \u00b7 ' + sourceLabel();\n      }\n      statsEl.textContent = line;\n    }\n  }\n  \/\/ \u2500\u2500 the basemap \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  \/\/ Outlines, projection and decoder are the ones the Global Crop Calendar and\n  \/\/ the El Nino simulator already draw, so the three tools cannot disagree on a\n  \/\/ border. Geometry is pasted in at build time by build-map.js; nothing is\n  \/\/ fetched. Equal area, because inflating Canada and Russia against Brazil and\n  \/\/ India would misrepresent where the farming is.\n  var GEO = null;\n  try {\n    var geoEl = document.getElementById('gpv-geo');\n    if(geoEl) GEO = JSON.parse(geoEl.textContent);\n  } catch(_){}\n  var ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_';\n  var CODE = {}; (function(){ var i; for(i = 0; i < 64; i++){ CODE[ALPHA.charAt(i)] = i; } })();\n  function decodeRing(str, q){\n    var pts = [], i = 0, px = 0, py = 0, u, sh, k;\n    while(i < str.length){\n      u = 0; sh = 1;\n      for(;;){ k = CODE[str.charAt(i++)]; if(k >= 32){ u += (k - 32) * sh; sh *= 32; } else { u += k * sh; break; } }\n      px += (u % 2) ? -((u + 1) \/ 2) : u \/ 2;\n      u = 0; sh = 1;\n      for(;;){ k = CODE[str.charAt(i++)]; if(k >= 32){ u += (k - 32) * sh; sh *= 32; } else { u += k * sh; break; } }\n      py += (u % 2) ? -((u + 1) \/ 2) : u \/ 2;\n      pts.push([px \/ q, py \/ q]);\n    }\n    return pts;\n  }\n  var EE = [1.340264, -0.081106, 0.000893, 0.003796], EM = 0.8660254037844386, RAD = Math.PI \/ 180;\n  function project(lon, lat){\n    var th = Math.asin(EM * Math.sin(lat * RAD)), t2 = th * th, t6 = t2 * t2 * t2;\n    var x = (lon * RAD) * Math.cos(th) \/ (EM * (EE[0] + 3 * EE[1] * t2 + t6 * (7 * EE[2] + 9 * EE[3] * t2)));\n    var y = th * (EE[0] + EE[1] * t2 + t6 * (EE[2] + EE[3] * t2));\n    return [x * 100, -y * 100];\n  }\n  \/\/ Names come from our own build-time blob, never from a visitor, so stripping\n  \/\/ the two characters that could close an attribute is enough. Rule 1 keeps an\n  \/\/ ampersand out of this file, so entity escaping is not an option here.\n  function attr(v){ return String(v).split('\"').join('').split('<').join(''); }\n  \/\/ Rule 17: hovering any shape on the map says what picking it would do.\n  function mapTip(name, target, own){\n    if(!target) return name + '. No regional figures yet, so it would keep the global midpoints.';\n    var info = COUNTRIES[target];\n    if(!info) return name;\n    if(own) return name + '. ' + info.zone + '. Typical ' + zoneHeadline(info.zone) + '.';\n    return name + '. Picks up the ' + info.name + ' figures, ' + info.zone + '.';\n  }\n  \/\/ The first crop in the region table, as a one-line \"what you would get\".\n  function zoneHeadline(zone){\n    var t = REGIONAL_YIELDS[zone];\n    if(!t) return 'global midpoints';\n    var k = Object.keys(t)[0];\n    return k + ' ' + t[k].yld + ' ' + t[k].yldUnit;\n  }\n  \/\/ Marks the active country across BOTH the globe SVG (orange dot) and the\n  \/\/ List view button (filled accent button). Called from any click handler.\n  function syncPickerSelection(){\n    var pmap = $('#roi-picker-map');\n    if(pmap){\n      var lands = pmap.querySelectorAll('path.hit');\n      for(var i=0; i<lands.length; i++) lands[i].classList.toggle('on', lands[i].dataset.self === state.country);\n    }\n    var plist = $('#roi-picker-list');\n    if(plist){\n      var btns = plist.querySelectorAll('button');\n      for(var j=0; j<btns.length; j++) btns[j].classList.toggle('on', btns[j].dataset.cc === state.country);\n    }\n  }\n  \/\/ Called from globe-dot click or list-button click. Applies new country,\n  \/\/ refreshes unit system \/ area \/ crop defaults \/ banner \/ result.\n  function selectCountry(cc){\n    if(!COUNTRIES[cc]) return;\n    state.country = cc;\n    try { localStorage.setItem('gpy-roi-country', cc); } catch(_){}\n    try {\n      if(!localStorage.getItem('gpy-units')){\n        unitSystem = COUNTRIES[cc].units;\n        syncUnitButtons();\n        applyUnitSystem();\n      }\n    } catch(_){}\n    var areaInput = $('#roi-area');\n    if(areaInput ? !areaInput.dataset.userEdited : false){\n      var defaultArea = COUNTRIES[cc].areaDefault;\n      areaInput.value = unitSystem === 'imperial' ? Math.round(defaultArea * 2.47105) : defaultArea;\n    }\n    applyCropDefaults();\n    updateLocaleBanner();\n    syncPickerSelection();\n    update();\n  }\n  \/\/ Build the country picker: globe SVG (Map view) + button list (List view)\n  \/\/ with tab toggle. Globe view is the default \u2014 more impressive on first\n  \/\/ open. Lazy-built on first \"Change\" click.\n  function buildLocalePicker(){\n    var picker = $('#roi-locale-picker');\n    if(!picker ? true : picker.dataset.built === '1') return;\n    \/\/ ---- World map (Map view) ----\n    var MAPEL = $('#roi-map');\n    if(MAPEL ? GEO : false){\n      var LAT0 = -58, LAT1 = 85;\n      var minX = 1e9, maxX = -1e9, minY = 1e9, maxY = -1e9;\n      function note(pt){\n        if(pt[0] < minX) minX = pt[0]; if(pt[0] > maxX) maxX = pt[0];\n        if(pt[1] < minY) minY = pt[1]; if(pt[1] > maxY) maxY = pt[1];\n      }\n      function toPath(pts, close){\n        var d = 'M', n, pt;\n        for(n = 0; n < pts.length; n++){\n          pt = project(pts[n][0], pts[n][1]);\n          note(pt);\n          d += (n ? 'L' : '') + pt[0].toFixed(2) + ' ' + pt[1].toFixed(2);\n        }\n        return close ? d + 'Z' : d;\n      }\n      \/\/ The frame is the projected outline of the mapped latitude band. Its\n      \/\/ curved sides are what make an equal-area world read as one.\n      var frame = [], lon, lat;\n      for(lon = -180; lon <= 180; lon += 3){ frame.push([lon, LAT0]); }\n      for(lat = LAT0; lat <= LAT1; lat += 3){ frame.push([180, lat]); }\n      for(lon = 180; lon >= -180; lon -= 3){ frame.push([lon, LAT1]); }\n      for(lat = LAT1; lat >= LAT0; lat -= 3){ frame.push([-180, lat]); }\n      var out = '<path class=\"sea\" d=\"' + toPath(frame, true) + '\"\/>';\n      for(lon = -150; lon <= 150; lon += 30){\n        var mer = [];\n        for(lat = LAT0; lat <= LAT1; lat += 3){ mer.push([lon, lat]); }\n        out += '<path class=\"grat\" d=\"' + toPath(mer, false) + '\"\/>';\n      }\n      for(lat = -30; lat <= 60; lat += 30){\n        var par = [];\n        for(lon = -180; lon <= 180; lon += 3){ par.push([lon, lat]); }\n        out += '<path class=\"grat\" d=\"' + toPath(par, false) + '\"\/>';\n      }\n      var gi, gj;\n      for(gi = 0; gi < GEO.c.length; gi++){\n        var ctry = GEO.c[gi], d = '';\n        for(gj = 0; gj < ctry.r.length; gj++){ d += toPath(decodeRing(ctry.r[gj], GEO.q), true); }\n        \/\/ Three states: its own regional numbers, resolves to a neighbour's, or\n        \/\/ not covered. The first two are clickable.\n        var target = ctry.a ? resolveCC(ctry.a) : null;\n        var own = target ? target === ctry.a : false;\n        var cls = 'c' + (target ? (own ? ' own hit' : ' near hit') : '')\n          + (ctry.a === state.country ? ' on' : '');\n        out += '<path class=\"' + cls + '\" d=\"' + d + '\"'\n          + (target ? ' data-cc=\"' + target + '\" data-self=\"' + ctry.a + '\" tabindex=\"0\" role=\"button\"' : '')\n          + ' data-name=\"' + attr(ctry.n) + '\"'\n          + ' data-tip=\"' + attr(mapTip(ctry.n, target, own)) + '\"\/>';\n      }\n      var pad = (maxX - minX) * 0.012;\n      MAPEL.setAttribute('viewBox', (minX - pad).toFixed(1) + ' ' + (minY - pad).toFixed(1) + ' '\n        + (maxX - minX + pad * 2).toFixed(1) + ' ' + (maxY - minY + pad * 2).toFixed(1));\n      MAPEL.innerHTML = out;\n    }\n    \/\/ ---- List view (grouped by continent) ----\n    var groups = {};\n    var allKeys = Object.keys(COUNTRIES);\n    for(var lgi=0; lgi<allKeys.length; lgi++){\n      var lgk = allKeys[lgi];\n      var cont = COUNTRIES[lgk].continent || 'Other';\n      if(!groups[cont]) groups[cont] = [];\n      groups[cont].push(lgk);\n    }\n    var listHtml = '';\n    for(var ci=0; ci<CONTINENT_ORDER.length; ci++){\n      var cont2 = CONTINENT_ORDER[ci];\n      var members = groups[cont2];\n      if(!members ? true : !members.length) continue;\n      members.sort(function(a, b){ return COUNTRIES[a].name.localeCompare(COUNTRIES[b].name); });\n      listHtml += '<div class=\"roi-picker-grp\"><div class=\"roi-picker-grp-h\">' + cont2 + '<\/div><div class=\"roi-picker-grp-row\">';\n      for(var li=0; li<members.length; li++){\n        var lk = members[li];\n        var lon = lk === state.country ? ' on' : '';\n        listHtml += '<button type=\"button\" data-cc=\"' + lk + '\" class=\"' + (lon ? 'on' : '') + '\">' + COUNTRIES[lk].name + '<\/button>';\n      }\n      listHtml += '<\/div><\/div>';\n    }\n    var listEl = $('#roi-picker-list');\n    if(listEl) listEl.innerHTML = listHtml;\n    \/\/ Click handlers (delegated)\n    var mapEl = $('#roi-picker-map');\n    if(mapEl){\n      mapEl.addEventListener('click', function(ev){\n        var g = ev.target.closest ? ev.target.closest('path.hit') : null;\n        if(g ? g.dataset.cc : false) selectCountry(g.dataset.cc);\n      });\n      mapEl.addEventListener('mousemove', function(ev){\n        var t = ev.target.closest ? ev.target.closest('[data-tip]') : null;\n        if(t){ showTip(ev.clientX, ev.clientY, t.getAttribute('data-tip')); } else { hideTip(); }\n      });\n      mapEl.addEventListener('mouseleave', hideTip);\n      mapEl.addEventListener('focusin', function(ev){\n        var t = ev.target.closest ? ev.target.closest('[data-tip]') : null;\n        if(!t) return;\n        var r = t.getBoundingClientRect();\n        showTip(r.left + r.width \/ 2, r.top, t.getAttribute('data-tip'));\n      });\n      mapEl.addEventListener('focusout', hideTip);\n      mapEl.addEventListener('keydown', function(ev){\n        if(ev.key !== 'Enter' ? ev.key !== ' ' : false) return;\n        var g = ev.target.closest ? ev.target.closest('path.hit') : null;\n        if(g ? g.dataset.cc : false){ ev.preventDefault(); selectCountry(g.dataset.cc); }\n      });\n    }\n    if(listEl){\n      listEl.addEventListener('click', function(ev){\n        if(ev.target.tagName !== 'BUTTON') return;\n        var cc = ev.target.dataset.cc;\n        if(cc) selectCountry(cc);\n      });\n    }\n    \/\/ Tab switching (Map <-> List)\n    var tabs = picker.querySelectorAll('.roi-picker-tab');\n    function setPickerView(view){\n      for(var t=0; t<tabs.length; t++){\n        var on2 = tabs[t].dataset.view === view;\n        tabs[t].classList.toggle('on', on2);\n        tabs[t].setAttribute('aria-selected', on2 ? 'true' : 'false');\n      }\n      if(mapEl) mapEl.hidden = (view !== 'map');\n      if(listEl) listEl.hidden = (view !== 'list');\n    }\n    for(var ti=0; ti<tabs.length; ti++){\n      tabs[ti].addEventListener('click', function(){ setPickerView(this.dataset.view); });\n    }\n    \/\/ On a phone a world map is the wrong picker: a country is a few pixels\n    \/\/ across, well under the 44 px a thumb needs. The list opens instead, and\n    \/\/ the map is one tap away for anyone who wants it.\n    var narrow = false;\n    try { narrow = window.matchMedia('(max-width: 820px)').matches; } catch(_){}\n    setPickerView(narrow ? 'list' : 'map');\n    picker.dataset.built = '1';\n  }\n  \/\/ How the region was worked out, in words a visitor can act on. The raw\n  \/\/ detectSource string carries the signal name and is for the console only.\n  function sourceLabel(){\n    var d = detectSource || '';\n    if(d === 'saved') return 'your last choice';\n    if(d === 'WordPress geo') return 'detected from your connection';\n    if(d.indexOf('language') === 0) return 'from your browser language';\n    if(d.indexOf('timezone') === 0) return 'from your time zone';\n    if(d === 'IP geolocation') return 'via IP geolocation';\n    return 'pick your region if this is wrong';\n  }\n  function getPractices(){\n    var cbs = root.querySelectorAll('input[data-pr]'), out = [], i;\n    for(i=0;i<cbs.length;i++){ if(cbs[i].checked) out.push(cbs[i].dataset.pr); }\n    return out;\n  }\n  function practiceNames(ids){\n    var out = [], i;\n    for(i=0;i<ids.length;i++){ out.push(PRACTICE_LABELS[ids[i]] ? PRACTICE_LABELS[ids[i]] : ids[i]); }\n    return out.join(', ');\n  }\n  function areaUnitLabel(){ return unitSystem === 'imperial' ? 'ac' : 'ha'; }\n  \/\/ One precision across a range, taken from its upper end, so a range never\n  \/\/ reads \"6.99 to 16.3\".\n  function fmtRange(lo, hi){\n    var ccy = currencyOf(state.country);\n    var d = hi >= 100 ? 0 : (hi >= 10 ? 1 : 2);\n    function one(n){\n      if(!isFinite(n) ? true : n < 0) n = 0;\n      return ccy.symbol + n.toLocaleString(ccy.locale, { minimumFractionDigits:d, maximumFractionDigits:d });\n    }\n    return [one(lo), one(hi)];\n  }\n  function fmtArea(n){\n    if(!isFinite(n)) return '0';\n    return (n >= 100 ? Math.round(n) : Math.round(n * 10) \/ 10).toLocaleString(currencyOf(state.country).locale);\n  }\n  function pct(x){ return Math.round(x * 100) + '%'; }\n  function applyUnitSystem(){\n    $('#roi-area-u').value = unitSystem === 'imperial' ? 'ac' : 'ha';\n    $('#roi-per-unit').textContent = unitSystem === 'imperial'\n      ? 'per acre of the whole farm' : 'per hectare of the whole farm';\n    applyCropDefaults();\n    update();\n  }\n  \/\/ Only a click on Hectares or Acres counts as the visitor choosing. Writing\n  \/\/ this on first paint would make the region lookup unable to switch units.\n  function persistUnits(){\n    try { localStorage.setItem('gpy-units', unitSystem); } catch(e){}\n  }\n  \/\/ The last computed model result, so the math panel and the tooltip can read\n  \/\/ it without recomputing.\n  var last = null;\n  function update(){\n    var area = +$('#roi-area').value || 0;\n    var areaUnit = $('#roi-area-u').value;\n    var yld = +$('#roi-yield').value || 0;\n    var price = +$('#roi-price').value || 0;\n    var crop = $('#roi-crop').value;\n    var practices = getPractices();\n    var zone = COUNTRIES[state.country] ? COUNTRIES[state.country].zone : null;\n    var ref = cropDefaults();\n    var b = GPROI.benefit({\n      zone: zone, crop: crop, variability: state.variability, practices: practices,\n      userGross: yld * price, refGross: ref ? ref.yld * ref.price : 0\n    });\n    \/\/ The model works in USD. Show it in the country's own currency, and per\n    \/\/ the area unit the visitor is reading in.\n    var fx = currencyOf(state.country).toUSD;\n    var imperial = unitSystem === 'imperial';\n    var perLo = (imperial ? b.loUsdAc : b.loUsdHa) * fx;\n    var perHi = (imperial ? b.hiUsdAc : b.hiUsdHa) * fx;\n    var perMid = (imperial ? b.midUsdAc : b.midUsdHa) * fx;\n    var perResp = b.perRespUsdAc * fx * (imperial ? 1 : GPROI.AC_PER_HA);\n    var evLo = b.evLo * fx * (imperial ? 1 : GPROI.AC_PER_HA);\n    var evHi = b.evHi * fx * (imperial ? 1 : GPROI.AC_PER_HA);\n    \/\/ The area box and the reading unit can disagree, so bring the area over.\n    var areaDisp = imperial\n      ? (areaUnit === 'ha' ? area * GPROI.AC_PER_HA : area)\n      : (areaUnit === 'ac' ? area \/ GPROI.AC_PER_HA : area);\n    var perTxt = fmtRange(perLo, perHi);\n    var totTxt = fmtRange(perLo * areaDisp, perHi * areaDisp);\n    $('#roi-per-low').textContent = perTxt[0];\n    $('#roi-per-high').textContent = perTxt[1];\n    $('#roi-tot-low').textContent = totTxt[0];\n    $('#roi-tot-high').textContent = totTxt[1];\n    $('#roi-tot-area').textContent = fmtArea(areaDisp) + ' ' + areaUnitLabel();\n    $('#roi-resp-pct').textContent = pct(b.resp);\n    $('#roi-bar-on').style.width = pct(b.resp);\n    $('#roi-bar-off').style.width = pct(1 - b.resp);\n    var cropName = $('#roi-crop').options[$('#roi-crop').selectedIndex].text;\n    var srcEl = $('#roi-src');\n    if(practices.length === 0){\n      srcEl.textContent = 'Tick at least one operation to vary.';\n    } else {\n      srcEl.textContent = cropName + (zone ? ', ' + zone + ' region' : '') + '. Band from ' + b.src + '.';\n    }\n    last = { b: b, perLo: perLo, perHi: perHi, perMid: perMid, perResp: perResp,\n             evLo: evLo, evHi: evHi, areaDisp: areaDisp, practices: practices,\n             cropName: cropName, zone: zone, imperial: imperial };\n    renderMath();\n    renderBarTip();\n  }\n  \/\/ The working, in the order the model applies it. Every figure on screen can\n  \/\/ be traced from the published band to the number in the headline.\n  function renderMath(){\n    var box = $('#roi-math');\n    if(!box ? true : box.hidden) return;\n    if(!last) return;\n    var u = areaUnitLabel();\n    var b = last.b;\n    var rows = [];\n    var ev = fmtRange(last.evLo, last.evHi);\n    rows.push(['Published net benefit, full variable-rate program, on ground that responds',\n               ev[0] + ' to ' + ev[1] + ' \/ ' + u]);\n    rows.push(['What you would vary (' + (last.practices.length ? practiceNames(last.practices) : 'nothing yet') + ')',\n               pct(b.stack) + ' of a full program']);\n    rows.push(['Your yield and price against the regional average', b.gross.toFixed(2) + ' x']);\n    if(b.capped === 'high'){\n      rows.push(['Held at the top of the published band', fmtMoney(last.perResp) + ' \/ ' + u]);\n    } else if(b.capped === 'low'){\n      rows.push(['Held at the floor of the published band', fmtMoney(last.perResp) + ' \/ ' + u]);\n    } else {\n      rows.push(['Benefit on ground that responds', fmtMoney(last.perResp) + ' \/ ' + u]);\n    }\n    rows.push(['Share of the farm that responds (' + state.variability + ' variability)', pct(b.resp)]);\n    rows.push(['Across every ' + u + ' you farm', fmtMoney(last.perMid) + ' \/ ' + u]);\n    var band = fmtRange(last.perLo, last.perHi);\n    rows.push(['Shown either side of that midpoint', band[0] + ' to ' + band[1] + ' \/ ' + u]);\n    var html = '<table>';\n    for(var i=0;i<rows.length;i++){\n      var cls = i === rows.length - 1 ? ' class=\"tot\"' : '';\n      html += '<tr' + cls + '><td>' + rows[i][0] + '<\/td><td>' + rows[i][1] + '<\/td><\/tr>';\n    }\n    html += '<\/table>';\n    box.innerHTML = html;\n  }\n  \/\/ \u2500\u2500 the one hoverable figure on the panel \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  var tip = $('#roi-tip');\n  var barTipText = '';\n  function renderBarTip(){\n    if(!last) return;\n    barTipText = 'Benefit is paid on the ' + pct(last.b.resp) + ' of the farm that answers a changed rate, at '\n      + state.variability + ' variability. The rest is already at its best rate. Across the whole farm that works out at '\n      + fmtMoney(last.perMid) + ' per ' + areaUnitLabel() + '.';\n    var bar = $('#roi-bar');\n    if(bar) bar.setAttribute('aria-label', barTipText);\n  }\n  function showTip(x, y, text){\n    if(!tip ? true : !text) return;\n    tip.textContent = text;\n    tip.hidden = false;\n    var w = tip.offsetWidth, h = tip.offsetHeight;\n    var left = x + 14, top = y - h - 10;\n    if(left + w > window.innerWidth - 8) left = window.innerWidth - w - 8;\n    if(left < 8) left = 8;\n    if(top < 8) top = y + 18;\n    tip.style.left = left + 'px';\n    tip.style.top = top + 'px';\n  }\n  function hideTip(){ if(tip) tip.hidden = true; }\n  var barEl = $('#roi-bar');\n  if(barEl){\n    barEl.addEventListener('mousemove', function(ev){ showTip(ev.clientX, ev.clientY, barTipText); });\n    barEl.addEventListener('mouseleave', hideTip);\n    barEl.addEventListener('click', function(ev){ showTip(ev.clientX, ev.clientY, barTipText); });\n    barEl.addEventListener('focus', function(){\n      var r = barEl.getBoundingClientRect();\n      showTip(r.left + r.width \/ 2, r.top, barTipText);\n    });\n    barEl.addEventListener('blur', hideTip);\n  }\n  root.addEventListener('touchstart', function(ev){\n    if(!tip ? true : tip.hidden) return;\n    if(ev.target.closest ? ev.target.closest('#roi-bar') : false) return;\n    hideTip();\n  }, { passive: true });\n  \/\/ \u2500\u2500 wiring \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n  ['#roi-area', '#roi-yield', '#roi-price'].forEach(function(sel){\n    $(sel).addEventListener('input', update);\n  });\n  $('#roi-area-u').addEventListener('change', update);\n  $('#roi-crop').addEventListener('change', function(){ applyCropDefaults(); update(); });\n  var varBtns = root.querySelectorAll('#roi-var button');\n  for(var vi=0; vi<varBtns.length; vi++){\n    varBtns[vi].addEventListener('click', function(){\n      for(var j=0;j<varBtns.length;j++) varBtns[j].classList.remove('on');\n      this.classList.add('on');\n      state.variability = this.dataset.v;\n      $('#roi-var-hint').textContent = VAR_HINTS[state.variability];\n      update();\n    });\n  }\n  var prCbs = root.querySelectorAll('input[data-pr]');\n  for(var pi=0; pi<prCbs.length; pi++){ prCbs[pi].addEventListener('change', update); }\n  function syncUnitButtons(){\n    var btns = root.querySelectorAll('#roi-units button');\n    for(var i=0;i<btns.length;i++){ btns[i].classList.toggle('on', btns[i].dataset.u === unitSystem); }\n  }\n  var unitBtns = root.querySelectorAll('#roi-units button');\n  for(var ui=0; ui<unitBtns.length; ui++){\n    unitBtns[ui].addEventListener('click', function(){\n      unitSystem = this.dataset.u;\n      syncUnitButtons();\n      applyUnitSystem();\n      persistUnits();\n      updateLocaleBanner();\n    });\n  }\n  var mathBtn = $('#roi-math-toggle');\n  if(mathBtn){\n    mathBtn.addEventListener('click', function(){\n      var box = $('#roi-math');\n      var open = box.hidden;\n      box.hidden = !open;\n      mathBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\n      mathBtn.textContent = open ? 'Hide the math' : 'Show the math';\n      if(open) renderMath();\n    });\n  }\n  \/\/ Keep the picker from overwriting an area the visitor typed themselves.\n  var areaInputEl = $('#roi-area');\n  if(areaInputEl){\n    areaInputEl.addEventListener('input', function(){ this.dataset.userEdited = '1'; });\n    if(!areaInputEl.dataset.userEdited){\n      var startInfo = COUNTRIES[state.country];\n      if(startInfo){\n        areaInputEl.value = unitSystem === 'imperial'\n          ? Math.round(startInfo.areaDefault * GPROI.AC_PER_HA)\n          : startInfo.areaDefault;\n      }\n    }\n  }\n  var locEditBtn = $('#roi-loc-edit');\n  var locPicker = $('#roi-locale-picker');\n  if(locEditBtn ? locPicker : false){\n    locEditBtn.addEventListener('click', function(){\n      buildLocalePicker();\n      var open = locPicker.classList.toggle('show');\n      locEditBtn.setAttribute('aria-expanded', open ? 'true' : 'false');\n    });\n  }\n  syncUnitButtons();\n  applyUnitSystem();\n  updateLocaleBanner();\n  \/\/ One anonymous lookup, after first paint, to sharpen the region when the\n  \/\/ browser signals were vague. Surfaced in the banner.\n  refineWithIP();\n})();\n<\/script>\n<\/div>\n\n\n\n<div class=\"gp-lead\">\n<style>\n.gp-lead .zrcx{--f:\"Roboto\",-apple-system,\"Segoe UI\",Helvetica,Arial,sans-serif;font-family:var(--f);color:#212121;max-width:820px;margin:28px auto 8px;padding:0 4px;line-height:1.6}\n.gp-lead .zrcx h2{font-family:var(--f);font-size:1.35rem;font-weight:700;color:#145328;margin:26px 0 8px}\n.gp-lead .zrcx p{margin:0 0 12px;font-size:1.02rem;color:#212121}\n.gp-lead .zrcx-fig{margin:18px 0 0;padding:14px;background:#eef4e8;border:1px solid #e3e7da;border-radius:8px}\n.gp-lead .zrcx-fig svg{display:block;width:100%;height:auto;max-width:100%;border-radius:6px}\n.gp-lead .zrcx-fig figcaption{margin-top:8px;font-size:.88rem;color:#4c6066;text-align:center}\n.gp-lead .zrcx .bx{fill:#ffffff;stroke:#e3e7da;stroke-width:1}\n.gp-lead .zrcx .th{font-family:var(--f);font-size:11px;font-weight:700;fill:#145328}\n.gp-lead .zrcx .tn{font-family:var(--f);font-size:15px;font-weight:700;fill:#145328}\n.gp-lead .zrcx .ts{font-family:var(--f);font-size:10px;fill:#8a9a8e}\n.gp-lead .zrcx .ar{stroke:#8a9a8e;stroke-width:1.6;fill:none}\n.gp-lead .zrcx .resp{fill:#15701e}\n.gp-lead .zrcx .rest{fill:#e4eedd;stroke:#e3e7da;stroke-width:1}\n<\/style>\n<div class=\"zrcx\">\n  <h2>Where the money in variable rate actually comes from<\/h2>\n  <p>Variable rate does not add yield everywhere. It moves inputs off ground that cannot use them and onto ground that can, and it only pays where those two kinds of ground sit in the same field. On a farm that is uniform end to end there is nothing to move, and the honest answer is close to zero.<\/p>\n  <p>So the arithmetic has three steps, and skipping any one of them is how a calculator ends up quoting a number nobody ever collects. Start with what a full variable-rate program returns on ground that responds. Published trials across corn, cereals and oilseeds put that between roughly 10 and 45 euro per hectare, with corn on the Cornbelt at the upper end and dryland cereals at the lower. Then cut it to the operations you are actually going to vary, remembering that nitrogen and seeding rate are chasing the same productivity difference, so the second one is worth less than the first. Then, and this is the step that gets left out, apply it only to the share of the farm that responds.<\/p>\n  <p>That share is the variability setting. A field with under 10 percent yield swing has perhaps a quarter of its area worth a different rate. At 10 to 25 percent, where most fields sit, call it half. Above 25 percent, three quarters. The rest of the farm is already close to its right rate and a prescription changes nothing there except your diesel.<\/p>\n  <figure class=\"zrcx-fig\">\n    <svg viewBox=\"0 0 760 170\" role=\"img\" aria-labelledby=\"zrcx-t\">\n      <title id=\"zrcx-t\">A published benefit on responsive ground, cut by the operations varied, then applied only to the share of the farm that responds<\/title>\n      <rect class=\"bx\" x=\"8\" y=\"22\" width=\"176\" height=\"92\" rx=\"6\"\/>\n      <text class=\"th\" x=\"22\" y=\"44\">On responsive ground<\/text>\n      <text class=\"tn\" x=\"22\" y=\"74\">10 to 45<\/text><text class=\"ts\" x=\"96\" y=\"74\">EUR \/ ha<\/text>\n      <text class=\"ts\" x=\"22\" y=\"96\">a full program, from trials<\/text>\n      <path class=\"ar\" d=\"M192 68 L226 68 M220 62 L226 68 L220 74\"\/>\n      <rect class=\"bx\" x=\"234\" y=\"22\" width=\"176\" height=\"92\" rx=\"6\"\/>\n      <text class=\"th\" x=\"248\" y=\"44\">Operations you vary<\/text>\n      <text class=\"tn\" x=\"248\" y=\"74\">79%<\/text><text class=\"ts\" x=\"292\" y=\"74\">of a full program<\/text>\n      <text class=\"ts\" x=\"248\" y=\"96\">nitrogen plus seeding rate<\/text>\n      <path class=\"ar\" d=\"M418 68 L452 68 M446 62 L452 68 L446 74\"\/>\n      <rect class=\"bx\" x=\"460\" y=\"22\" width=\"292\" height=\"92\" rx=\"6\"\/>\n      <text class=\"th\" x=\"474\" y=\"44\">Share of the farm that responds<\/text>\n      <rect class=\"resp\" x=\"474\" y=\"56\" width=\"132\" height=\"16\" rx=\"2\"\/>\n      <rect class=\"rest\" x=\"606\" y=\"56\" width=\"132\" height=\"16\" rx=\"2\"\/>\n      <text class=\"ts\" x=\"474\" y=\"88\">50% responds<\/text>\n      <text class=\"ts\" x=\"620\" y=\"88\">50% already right<\/text>\n      <text class=\"tn\" x=\"474\" y=\"108\">11 EUR \/ ha<\/text><text class=\"ts\" x=\"560\" y=\"108\">across every hectare farmed<\/text>\n    <\/svg>\n    <figcaption>A mid-band case with nitrogen and seeding rate varied. Skip the last step, and the same band applied to every acre instead of the half that responds reads 22 euro per hectare, which no grower ever collects.<\/figcaption>\n  <\/figure>\n  <h2>What to do with the figure<\/h2>\n  <p>Treat the total on the right as the ceiling for what you can spend finding and working your responsive acres. Soil sampling is usually the largest item and it lasts several seasons, so year one is the tight one and years two and three are where the program looks obvious. If your drill or spreader cannot vary rate yet, that controller comes out of the same budget.<\/p>\n  <p>Then go and find the acres. Several seasons of satellite growth, elevation with slope and curvature, harvest maps and soil tests will tell you where the field is genuinely different rather than where it looked bad in one wet June. That map is what turns a per hectare figure on a web page into a prescription your terminal can read, and next harvest is what tells you whether the split was right.<\/p>\n<\/div>\n<\/div>\n\n\n\n<!-- GENERATED by scripts\/make_faq.py from tools\/variable-rate-roi-calculator\/faq.json. Do not hand-edit. -->\n<div class=\"gp-lead\">\n<style>\n.gp-lead .gpx-faq{margin:36px 0 8px}\n.gp-lead .gpx-faq h2{text-align:center;margin:0 0 20px;font-size:1.6rem}\n.gp-lead .gpx-tabs{border:1px solid #e8ebe2;border-radius:16px;overflow:hidden;background:#fff}\n.gp-lead .gpx-tablist{display:flex;gap:0;background:#f6f7f1;border-bottom:1px solid #e8ebe2;overflow-x:auto;scrollbar-width:none}\n.gp-lead .gpx-tablist::-webkit-scrollbar{display:none}\n.gp-lead .gpx-tab{flex:1 1 auto;min-width:max-content;background:transparent;border:0;padding:16px 22px;font-family:inherit;font-size:.95rem;font-weight:700;color:#4c6066;cursor:pointer;border-bottom:3px solid transparent;white-space:nowrap}\n.gp-lead .gpx-tab:hover{color:#145328;background:#f0f4ea}\n.gp-lead .gpx-tab[aria-selected=\"true\"]{color:#145328;border-bottom-color:#15701e;background:#fff}\n.gp-lead .gpx-tab:focus{outline:2px solid #15701e;outline-offset:-2px}\n.gp-lead .gpx-panel{padding:28px 32px;display:none}\n.gp-lead .gpx-panel.is-active{display:block}\n.gp-lead .gpx-panel h3{margin:0 0 10px;font-size:1.12rem;color:#212121}\n.gp-lead .gpx-panel p{margin:0;line-height:1.7;color:#243024;font-size:1rem}\n.gp-lead .gpx-panel p+p{margin-top:10px}\n@media (max-width:760px){\n  .gp-lead .gpx-panel{padding:22px 20px}\n  .gp-lead .gpx-tab{padding:14px 16px;font-size:.9rem}\n}\n<\/style>\n<section class=\"gpx-faq\" aria-labelledby=\"gpx-faq-h\">\n  <h2 id=\"gpx-faq-h\">Frequently asked questions<\/h2>\n  <div class=\"gpx-tabs\">\n    <div class=\"gpx-tablist\" role=\"tablist\" aria-label=\"Variable Rate ROI Calculator FAQ\">\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-1\" aria-controls=\"gpx-panel-1\" aria-selected=\"true\" tabindex=\"0\">The number looks small<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-2\" aria-controls=\"gpx-panel-2\" aria-selected=\"false\" tabindex=\"-1\">Picking a variability<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-3\" aria-controls=\"gpx-panel-3\" aria-selected=\"false\" tabindex=\"-1\">Stacking operations<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-4\" aria-controls=\"gpx-panel-4\" aria-selected=\"false\" tabindex=\"-1\">What it leaves out<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-5\" aria-controls=\"gpx-panel-5\" aria-selected=\"false\" tabindex=\"-1\">My field beats the region<\/button>\n      <button class=\"gpx-tab\" role=\"tab\" id=\"gpx-tab-6\" aria-controls=\"gpx-panel-6\" aria-selected=\"false\" tabindex=\"-1\">Finding the acres<\/button>\n    <\/div>\n    <div class=\"gpx-panel is-active\" role=\"tabpanel\" id=\"gpx-panel-1\" aria-labelledby=\"gpx-tab-1\">\n      <h3>I have seen variable rate quoted at far more per acre than this. Why is this lower?<\/h3>\n      <p>Two reasons, and both are the reason to trust it. The figure here is net, after the inputs you move around, not a slice of gross revenue. And it is spread across every acre you farm, not only the acres that react.<\/p>\n      <p>A quote of 30 dollars an acre is usually the benefit measured on responsive ground in a trial block. Spread that same benefit over a farm where half the ground is already at its right rate and you land near 15. The bar under the headline shows which half you are being paid on. Open the math and you can walk from the published band down to the headline in five lines.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-2\" aria-labelledby=\"gpx-tab-2\">\n      <h3>Low, medium or high. How do I tell which one my field is?<\/h3>\n      <p>Pull up a harvest map, or several years of satellite growth if you have no harvest data, and look at the spread rather than the average. Under about 10 percent swing between the good and the poor ground is low. Ten to 25 percent is medium, which is where most fields sit. Over 25 percent is high, and you usually already know it: the knolls burn off early, the draws lodge, one end of the field is a different soil.<\/p>\n      <p>If you are between two, take the lower one. The whole point of the figure is that it survives contact with a real season.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-3\" aria-labelledby=\"gpx-tab-3\">\n      <h3>I ticked all five operations and the answer barely moved. Is that a bug?<\/h3>\n      <p>No. Varying nitrogen and varying seed are largely chasing the same thing, which is the productivity difference between one part of the field and another. Once nitrogen is matched to that difference, seeding rate is correcting a smaller remainder, and crop protection a smaller one again.<\/p>\n      <p>So the first operation you add carries most of the benefit, the second about half as much again, and the rest taper. Adding the fifth box does not multiply the answer by five, and any calculator that behaves that way is adding up the same acre several times.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-4\" aria-labelledby=\"gpx-tab-4\">\n      <h3>Does this already subtract what the program costs me to run?<\/h3>\n      <p>It subtracts the inputs you move around, so the figure is net on the agronomy. It does not subtract what it costs to get there: soil sampling, the software, the extra logistics of splitting a load, and a controller if your drill or spreader cannot vary rate yet.<\/p>\n      <p>Take the total on the right, subtract your sampling round and your platform cost for the year, and what is left is the decision. On most farms the sampling is the larger of the two and it is not an annual cost, so the second and third years look better than the first.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-5\" aria-labelledby=\"gpx-tab-5\">\n      <h3>My yields are well above the regional average, so why does the answer barely change?<\/h3>\n      <p>A field worth twice the regional average does not return twice the benefit, because the benefit comes from the difference between the strong and the weak parts of that field, not from its overall level. A uniformly excellent field has very little to reallocate.<\/p>\n      <p>Your yield and price still move the answer, within a quarter either way, so a high-value crop on good ground reads higher than a low-value one on the same ground. What moves it much more is the variability setting, which is the honest lever.<\/p>\n    <\/div>\n    <div class=\"gpx-panel\" role=\"tabpanel\" id=\"gpx-panel-6\" aria-labelledby=\"gpx-tab-6\">\n      <h3>How do I find out which acres on my farm actually respond?<\/h3>\n      <p>From layers you already have. Several seasons of satellite growth show the ground that carries consistently more. Elevation with slope and curvature finds the knolls that dry out and the draws that hold water. Harvest maps and soil tests confirm it, and old as-applied files show where the rate was already wrong.<\/p>\n      <p>In GeoPard those stack into management zones for the field, and the zones tell you the share of it that is worth a changed rate. From there the rate per zone becomes a prescription you export to the terminal, and next harvest tells you whether the split was right.<\/p>\n    <\/div>\n  <\/div>\n<\/section>\n<script type=\"application\/ld+json\" data-no-optimize=\"1\" data-no-minify=\"1\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"I have seen variable rate quoted at far more per acre than this. Why is this lower?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Two reasons, and both are the reason to trust it. The figure here is net, after the inputs you move around, not a slice of gross revenue. And it is spread across every acre you farm, not only the acres that react. A quote of 30 dollars an acre is usually the benefit measured on responsive ground in a trial block. Spread that same benefit over a farm where half the ground is already at its right rate and you land near 15. The bar under the headline shows which half you are being paid on. Open the math and you can walk from the published band down to the headline in five lines.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Low, medium or high. How do I tell which one my field is?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Pull up a harvest map, or several years of satellite growth if you have no harvest data, and look at the spread rather than the average. Under about 10 percent swing between the good and the poor ground is low. Ten to 25 percent is medium, which is where most fields sit. Over 25 percent is high, and you usually already know it: the knolls burn off early, the draws lodge, one end of the field is a different soil. If you are between two, take the lower one. The whole point of the figure is that it survives contact with a real season.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"I ticked all five operations and the answer barely moved. Is that a bug?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"No. Varying nitrogen and varying seed are largely chasing the same thing, which is the productivity difference between one part of the field and another. Once nitrogen is matched to that difference, seeding rate is correcting a smaller remainder, and crop protection a smaller one again. So the first operation you add carries most of the benefit, the second about half as much again, and the rest taper. Adding the fifth box does not multiply the answer by five, and any calculator that behaves that way is adding up the same acre several times.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does this already subtract what the program costs me to run?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It subtracts the inputs you move around, so the figure is net on the agronomy. It does not subtract what it costs to get there: soil sampling, the software, the extra logistics of splitting a load, and a controller if your drill or spreader cannot vary rate yet. Take the total on the right, subtract your sampling round and your platform cost for the year, and what is left is the decision. On most farms the sampling is the larger of the two and it is not an annual cost, so the second and third years look better than the first.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"My yields are well above the regional average, so why does the answer barely change?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A field worth twice the regional average does not return twice the benefit, because the benefit comes from the difference between the strong and the weak parts of that field, not from its overall level. A uniformly excellent field has very little to reallocate. Your yield and price still move the answer, within a quarter either way, so a high-value crop on good ground reads higher than a low-value one on the same ground. What moves it much more is the variability setting, which is the honest lever.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I find out which acres on my farm actually respond?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"From layers you already have. Several seasons of satellite growth show the ground that carries consistently more. Elevation with slope and curvature finds the knolls that dry out and the draws that hold water. Harvest maps and soil tests confirm it, and old as-applied files show where the rate was already wrong. In GeoPard those stack into management zones for the field, and the zones tell you the share of it that is worth a changed rate. From there the rate per zone becomes a prescription you export to the terminal, and next harvest tells you whether the split was right.\"\n      }\n    }\n  ]\n}\n<\/script>\n<\/div>\n<script nowprocket data-no-optimize=\"1\" data-no-defer=\"1\" data-no-minify=\"1\">\n(function(){\n  var root = document.querySelector('.gp-lead .gpx-faq');\n  if (!root) { return; }\n  var tabs = root.querySelectorAll('.gpx-tab');\n  var panels = root.querySelectorAll('.gpx-panel');\n  function activate(idx){\n    for (var i = 0; i < tabs.length; i++) {\n      var on = i === idx;\n      tabs[i].setAttribute('aria-selected', on ? 'true' : 'false');\n      tabs[i].setAttribute('tabindex', on ? '0' : '-1');\n      if (on) { panels[i].classList.add('is-active'); } else { panels[i].classList.remove('is-active'); }\n    }\n  }\n  for (var i = 0; i < tabs.length; i++) {\n    (function(n){\n      tabs[n].addEventListener('click', function(){ activate(n); });\n      tabs[n].addEventListener('keydown', function(ev){\n        var d = ev.key === 'ArrowRight' ? 1 : (ev.key === 'ArrowLeft' ? -1 : 0);\n        if (d === 0) { return; }\n        var t = (n + d + tabs.length) % tabs.length;\n        activate(t); tabs[t].focus(); ev.preventDefault();\n      });\n    })(i);\n  }\n})();\n<\/script>\n\n\n\n<!-- GeoPard Tool Wrapper - CTA only (CTA band + AI Assistant band, NO FAQ).\n     Pages pair this with their OWN faq.html, because the FAQ in block 13099 is\n     Field Data Explorer specific and answers questions nobody asked on another\n     tool's page. Block 13099 stays as it is for the legacy pages. -->\n<div class=\"gp-lead\">\n<style>\n\/* Shared CTA, integration chips and FAQ tab styling. These classes are USED by\n   this block but were only DEFINED in wrapper-top block 13098, so any page that\n   uses this block without 13098 (a tool page with an inline hero) rendered the\n   CTA and FAQ completely unstyled. Copied verbatim from 13098, so pages that\n   carry both blocks are byte-identical in effect. *\/\n.gp-lead{font-family:var(--wp--preset--font-family--nunito,\"Nunito\",system-ui,-apple-system,Segoe UI,sans-serif);color:#212121;max-width:1600px;margin:0 auto;padding:0 16px}\n.gp-lead .gpx-cta{background:linear-gradient(135deg,#145328 0%,#1b7a2a 65%,#1a7951 100%);border-radius:18px;padding:38px 40px;margin:36px 0 24px;color:#fafbf4;text-align:center;position:relative;overflow:hidden}\n.gp-lead .gpx-cta::before{content:\"\";position:absolute;inset:auto -40px -60px auto;width:200px;height:200px;background:radial-gradient(circle,rgba(178,6,15,0.26),transparent 70%);pointer-events:none}\n.gp-lead .gpx-cta h2{color:#fff;margin:0 0 12px;font-size:1.6rem}\n.gp-lead .gpx-cta p{color:rgba(255,255,255,0.95);font-size:1.05rem;max-width:740px;margin:0 auto 22px}\n.gp-lead .gpx-btn{display:inline-block;background:#b2060f;color:#fff;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-weight:600;font-size:1rem;padding:14px 30px;border-radius:999px;text-decoration:none;transition:transform .15s,box-shadow .15s,background .15s;box-shadow:none}\n.gp-lead .gpx-btn:hover{transform:translateY(-1px);background:#fd4d48;color:#fff;box-shadow:none}\n.gp-lead .gpx-faq{margin:36px 0 8px}\n.gp-lead .gpx-faq h2{text-align:center;margin:0 0 20px;font-size:1.6rem}\n.gp-lead .gpx-tabs{border:1px solid #e8ebe2;border-radius:16px;overflow:hidden;background:#fff;box-shadow:0 2px 14px rgba(20,83,40,0.06)}\n.gp-lead .gpx-tablist{display:flex;gap:0;background:#f6f7f1;border-bottom:1px solid #e8ebe2;overflow-x:auto;scrollbar-width:none}\n.gp-lead .gpx-tablist::-webkit-scrollbar{display:none}\n.gp-lead .gpx-tab{flex:1 1 auto;min-width:max-content;background:transparent;border:0;padding:16px 22px;font-family:var(--wp--preset--font-family--poppins,\"Poppins\",sans-serif);font-size:.95rem;font-weight:600;color:#4c6066;cursor:pointer;border-bottom:3px solid transparent;transition:color .15s,border-color .15s,background .15s;white-space:nowrap;letter-spacing:.01em}\n.gp-lead .gpx-tab:hover{color:#145328;background:rgba(123,220,181,0.14)}\n.gp-lead .gpx-tab[aria-selected=\"true\"]{color:#145328;border-bottom-color:#15701e;background:#fff}\n.gp-lead .gpx-tab:focus{outline:2px solid #15701e;outline-offset:-2px}\n.gp-lead .gpx-panel{padding:28px 32px;display:none;animation:gpxfade .25s ease}\n.gp-lead .gpx-panel.is-active{display:block}\n.gp-lead .gpx-panel p{margin:0;line-height:1.7;color:#243024;font-size:1rem}\n.gp-lead .gpx-panel p+p{margin-top:10px}\n.gp-lead .gpx-panel kbd,.gp-lead .gpx-panel code{background:#f0f3ec;padding:2px 6px;border-radius:4px;font-family:var(--wp--preset--font-family--dm-mono,\"DM Mono\",ui-monospace,monospace);font-size:.88em;color:#145328}\n.gp-lead .gpx-integ{display:flex;flex-wrap:wrap;gap:8px;justify-content:center;margin:10px 0 20px}\n.gp-lead .gpx-integ-label{font-size:.86rem;color:rgba(255,255,255,0.86);margin:0 0 8px;font-weight:500;letter-spacing:.01em}\n.gp-lead .gpx-integ-chip{background:rgba(255,255,255,0.16);border:1px solid rgba(255,255,255,0.32);color:#fff;padding:6px 14px;border-radius:999px;font-size:.85rem;font-weight:600;letter-spacing:.02em}\n@media (max-width:760px){\n  .gp-lead .gpx-cta{padding:24px 22px}\n  .gp-lead .gpx-panel{padding:22px 20px}\n  .gp-lead .gpx-tab{padding:14px 16px;font-size:.9rem}\n}\n@keyframes gpxfade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}\n<\/style>\n\n<section class=\"gpx-cta\">\n  <h2>Bigger picture? GeoPard turns the data into prescriptions.<\/h2>\n  <p>This page reads one file at a time. The full GeoPard platform combines multi-year yield, NDVI, soil, and topography into management zones, generates variable rate prescriptions, and pushes them to your machine.<\/p>\n  <div class=\"gpx-integ-label\">Push prescriptions and pull as-applied data with:<\/div>\n  <div class=\"gpx-integ\">\n    <span class=\"gpx-integ-chip\">John Deere Operations Center<\/span>\n    <span class=\"gpx-integ-chip\">CNH FieldOps<\/span>\n    <span class=\"gpx-integ-chip\">AGCO \/ PTx FarmEngage<\/span>\n  <\/div>\n  <a class=\"gpx-btn\" href=\"https:\/\/app.geopard.tech\/signup?utm_source=geopard.tech&amp;utm_medium=lead-magnet&amp;utm_campaign=field-data-explorer&amp;utm_content=below-tool-cta\">Register free in GeoPard &rarr;<\/a>\n  <p style=\"margin:16px auto 0;max-width:740px;font-size:.95rem;color:rgba(255,255,255,.92)\">Already harvested? <a style=\"color:#ffffff;text-decoration:underline;text-underline-offset:3px\" href=\"https:\/\/geopard.tech\/yield-report\/\">See whether the variable rate paid off in the Automated Yield Report<\/a>.<\/p>\n<\/section>\n\n<section class=\"gpx-aiband\">\n  <style>\n    .gp-lead .gpx-aiband{display:flex;align-items:center;gap:24px;flex-wrap:wrap;background:#f2f7ee;border:1px solid #d6e2c5;border-radius:14px;padding:22px 26px;margin:26px 0}\n    .gp-lead .gpx-aiband-txt{flex:1 1 380px}\n    .gp-lead .gpx-aiband-new{display:inline-block;font-size:11px;font-weight:700;letter-spacing:.05em;color:#ffffff;background:#b2060f;border-radius:999px;padding:3px 9px;vertical-align:3px;margin-left:10px}\n    .gp-lead .gpx-aiband h2{margin:0;font-size:1.3rem}\n    .gp-lead .gpx-aiband p{margin:8px 0 0;color:#4c6066;font-size:.98rem;line-height:1.55}\n    .gp-lead .gpx-aiband-btn{flex:0 0 auto;display:inline-flex;align-items:center;min-height:46px;background:#15701e;color:#ffffff;font-weight:600;padding:0 22px;border-radius:999px;text-decoration:none}\n    .gp-lead .gpx-aiband-btn:hover{background:#145328;color:#ffffff}\n    @media (max-width:640px){ .gp-lead .gpx-aiband{padding:18px} .gp-lead .gpx-aiband-btn{width:100%;justify-content:center} }\n  <\/style>\n  <div class=\"gpx-aiband-txt\">\n    <h2>Meet the GeoPard AI Assistant<span class=\"gpx-aiband-new\">NEW<\/span><\/h2>\n    <p>Reasoning AI for precision agriculture: it asks the right agronomic questions, shows its math, and builds dry-run validated prescriptions from your data. You approve every step.<\/p>\n  <\/div>\n  <a class=\"gpx-aiband-btn\" href=\"https:\/\/geopard.tech\/ai\/\">Watch how the AI thinks &rarr;<\/a>\n<\/section>\n<\/div>\n\n","protected":false},"excerpt":{"rendered":"<p>\u041f\u0440\u043e\u0446\u0435\u043d\u0438\u0442\u0435 \u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0445 \u043b\u0435\u043a\u043e\u0432\u0430 \u043f\u043e \u0437\u043e\u043d\u0430\u043c\u0430 \u0437\u0430 \u043f\u0440\u043e\u0444\u0438\u043b \u0442\u0435\u0440\u0435\u043d\u0430 \u043a\u0430\u043e \u0448\u0442\u043e \u0458\u0435 \u0432\u0430\u0448, \u043a\u043e\u0440\u0438\u0441\u0442\u0435\u045b\u0438 \u0441\u0440\u0435\u0434\u045a\u0435 \u0432\u0440\u0435\u0434\u043d\u043e\u0441\u0442\u0438 \u0438\u0437 \u043e\u0431\u0458\u0430\u0432\u0459\u0435\u043d\u0438\u0445 \u0438\u0441\u043f\u0438\u0442\u0438\u0432\u0430\u045a\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0459\u0438\u0432\u0438\u0445 \u0441\u0442\u043e\u043f\u0430.<\/p>","protected":false},"author":210157960,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_eb_attr":"","content-type":"","_wpcom_ai_launchpad_about_page":false,"_wpcom_ai_launchpad_gallery_page":false,"_wpcom_ai_launchpad_contact_page":false,"_wpcom_ai_launchpad_events_page":false,"_wpcom_ai_launchpad_video_page":false,"_wpcom_ai_launchpad_portfolio_piece":false,"footnotes":"","big_sky_generated":false},"class_list":["post-13185","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Variable Rate ROI Calculator: What VRA Is Worth - GeoPard<\/title>\n<meta name=\"description\" content=\"Net benefit per hectare and per year from variable rate, on your crop, your yields and your field variability. Held to published trial results.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/geopard.tech\/srb\/\u043a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440-\u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430-\u0443\u043b\u0430\u0433\u0430\u045a\u0430-\u0441\u0430-\u043f\u0440\u043e\u043c\/\" \/>\n<meta property=\"og:locale\" content=\"sr_RS\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Variable Rate ROI Calculator: What VRA Is Worth - GeoPard\" \/>\n<meta property=\"og:description\" content=\"Net benefit per hectare and per year from variable rate, on your crop, your yields and your field variability. Held to published trial results.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/geopard.tech\/srb\/\u043a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440-\u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430-\u0443\u043b\u0430\u0433\u0430\u045a\u0430-\u0441\u0430-\u043f\u0440\u043e\u043c\/\" \/>\n<meta property=\"og:site_name\" content=\"GeoPard - Precision agriculture Mapping software\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/geopardAgriculture\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-30T10:26:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/03\/GeoPard-Background-Precision-Ag-software-Do-more-with-your-data.png?fit=3116%2C1754&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"3116\" \/>\n\t<meta property=\"og:image:height\" content=\"1754\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@geopardagri\" \/>\n<meta name=\"twitter:label1\" content=\"\u041f\u0440\u043e\u0446\u0435\u045a\u0435\u043d\u043e \u0432\u0440\u0435\u043c\u0435 \u0447\u0438\u0442\u0430\u045a\u0430\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 \u043c\u0438\u043d\u0443\u0442\u0430\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/variable-rate-roi-calculator\\\/\",\"url\":\"https:\\\/\\\/geopard.tech\\\/variable-rate-roi-calculator\\\/\",\"name\":\"Variable Rate ROI Calculator: What VRA Is Worth - GeoPard\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\"},\"datePublished\":\"2026-05-20T20:17:17+00:00\",\"dateModified\":\"2026-09-30T10:26:03+00:00\",\"description\":\"Net benefit per hectare and per year from variable rate, on your crop, your yields and your field variability. Held to published trial results.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/variable-rate-roi-calculator\\\/#breadcrumb\"},\"inLanguage\":\"sr-RS\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/geopard.tech\\\/variable-rate-roi-calculator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/variable-rate-roi-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/geopard.tech\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Variable Rate ROI Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#website\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"name\":\"GeoPard - Precision agriculture software\",\"description\":\"Precision agriculture Mapping software\",\"publisher\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\"},\"alternateName\":\"GeoPard\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/geopard.tech\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"sr-RS\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#organization\",\"name\":\"GeoPard Agriculture\",\"alternateName\":\"GeoPard\",\"url\":\"https:\\\/\\\/geopard.tech\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"sr-RS\",\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/geopard.tech\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1\",\"width\":512,\"height\":68,\"caption\":\"GeoPard Agriculture\"},\"image\":{\"@id\":\"https:\\\/\\\/geopard.tech\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/geopardAgriculture\\\/\",\"https:\\\/\\\/x.com\\\/geopardagri\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/geopard-agriculture\\\/\",\"https:\\\/\\\/www.instagram.com\\\/geopardagriculture\\\/\",\"https:\\\/\\\/www.youtube.com\\\/channel\\\/UCiaPGLAhRPNh-s85dXdC-Sw\",\"https:\\\/\\\/www.g2.com\\\/products\\\/geopard-agriculture-precision-farming-software\\\/reviews\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u041a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0458\u0435 \u0441\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0459\u0438\u0432\u043e\u043c \u0441\u0442\u043e\u043f\u043e\u043c: \u041a\u043e\u043b\u0438\u043a\u043e \u0432\u0440\u0435\u0434\u0438 VRA - GeoPard","description":"\u041d\u0435\u0442\u043e \u043a\u043e\u0440\u0438\u0441\u0442 \u043f\u043e \u0445\u0435\u043a\u0442\u0430\u0440\u0443 \u0438 \u0433\u043e\u0434\u0438\u0448\u045a\u0435 \u043e\u0434 \u0432\u0430\u0440\u0438\u0458\u0430\u0431\u0438\u043b\u043d\u0435 \u0441\u0442\u043e\u043f\u0435, \u043d\u0430 \u0432\u0430\u0448 \u0443\u0441\u0435\u0432, \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0435 \u0438 \u0432\u0430\u0440\u0438\u0458\u0430\u0431\u0438\u043b\u043d\u043e\u0441\u0442 \u0432\u0430\u0448\u0435\u0433 \u043f\u043e\u0459\u0430. \u0417\u0430\u0434\u0440\u0436\u0430\u0432\u0430 \u0441\u0435 \u043d\u0430 \u043e\u0431\u0458\u0430\u0432\u0459\u0435\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438\u043c\u0430 \u0438\u0441\u043f\u0438\u0442\u0438\u0432\u0430\u045a\u0430.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/geopard.tech\/srb\/\u043a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440-\u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430-\u0443\u043b\u0430\u0433\u0430\u045a\u0430-\u0441\u0430-\u043f\u0440\u043e\u043c\/","og_locale":"sr_RS","og_type":"article","og_title":"Variable Rate ROI Calculator: What VRA Is Worth - GeoPard","og_description":"Net benefit per hectare and per year from variable rate, on your crop, your yields and your field variability. Held to published trial results.","og_url":"https:\/\/geopard.tech\/srb\/\u043a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440-\u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430-\u0443\u043b\u0430\u0433\u0430\u045a\u0430-\u0441\u0430-\u043f\u0440\u043e\u043c\/","og_site_name":"GeoPard - Precision agriculture Mapping software","article_publisher":"https:\/\/www.facebook.com\/geopardAgriculture\/","article_modified_time":"2026-09-30T10:26:03+00:00","og_image":[{"width":3116,"height":1754,"url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/03\/GeoPard-Background-Precision-Ag-software-Do-more-with-your-data.png?fit=3116%2C1754&ssl=1","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_site":"@geopardagri","twitter_misc":{"\u041f\u0440\u043e\u0446\u0435\u045a\u0435\u043d\u043e \u0432\u0440\u0435\u043c\u0435 \u0447\u0438\u0442\u0430\u045a\u0430":"4 \u043c\u0438\u043d\u0443\u0442\u0430"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/geopard.tech\/variable-rate-roi-calculator\/","url":"https:\/\/geopard.tech\/variable-rate-roi-calculator\/","name":"\u041a\u0430\u043b\u043a\u0443\u043b\u0430\u0442\u043e\u0440 \u043f\u043e\u0432\u0440\u0430\u045b\u0430\u0458\u0430 \u0438\u043d\u0432\u0435\u0441\u0442\u0438\u0446\u0438\u0458\u0435 \u0441\u0430 \u043f\u0440\u043e\u043c\u0435\u043d\u0459\u0438\u0432\u043e\u043c \u0441\u0442\u043e\u043f\u043e\u043c: \u041a\u043e\u043b\u0438\u043a\u043e \u0432\u0440\u0435\u0434\u0438 VRA - GeoPard","isPartOf":{"@id":"https:\/\/geopard.tech\/#website"},"datePublished":"2026-05-20T20:17:17+00:00","dateModified":"2026-09-30T10:26:03+00:00","description":"\u041d\u0435\u0442\u043e \u043a\u043e\u0440\u0438\u0441\u0442 \u043f\u043e \u0445\u0435\u043a\u0442\u0430\u0440\u0443 \u0438 \u0433\u043e\u0434\u0438\u0448\u045a\u0435 \u043e\u0434 \u0432\u0430\u0440\u0438\u0458\u0430\u0431\u0438\u043b\u043d\u0435 \u0441\u0442\u043e\u043f\u0435, \u043d\u0430 \u0432\u0430\u0448 \u0443\u0441\u0435\u0432, \u0432\u0430\u0448\u0435 \u043f\u0440\u0438\u043d\u043e\u0441\u0435 \u0438 \u0432\u0430\u0440\u0438\u0458\u0430\u0431\u0438\u043b\u043d\u043e\u0441\u0442 \u0432\u0430\u0448\u0435\u0433 \u043f\u043e\u0459\u0430. \u0417\u0430\u0434\u0440\u0436\u0430\u0432\u0430 \u0441\u0435 \u043d\u0430 \u043e\u0431\u0458\u0430\u0432\u0459\u0435\u043d\u0438\u043c \u0440\u0435\u0437\u0443\u043b\u0442\u0430\u0442\u0438\u043c\u0430 \u0438\u0441\u043f\u0438\u0442\u0438\u0432\u0430\u045a\u0430.","breadcrumb":{"@id":"https:\/\/geopard.tech\/variable-rate-roi-calculator\/#breadcrumb"},"inLanguage":"sr-RS","potentialAction":[{"@type":"ReadAction","target":["https:\/\/geopard.tech\/variable-rate-roi-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/geopard.tech\/variable-rate-roi-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/geopard.tech\/"},{"@type":"ListItem","position":2,"name":"Variable Rate ROI Calculator"}]},{"@type":"WebSite","@id":"https:\/\/geopard.tech\/#website","url":"https:\/\/geopard.tech\/","name":"\u0413\u0435\u043e\u041f\u0430\u0440\u0434 - \u0421\u043e\u0444\u0442\u0432\u0435\u0440 \u0437\u0430 \u043f\u0440\u0435\u0446\u0438\u0437\u043d\u0443 \u043f\u043e\u0459\u043e\u043f\u0440\u0438\u0432\u0440\u0435\u0434\u0443","description":"\u041f\u0440\u0435\u0446\u0438\u0437\u043d\u0430 \u043f\u043e\u0459\u043e\u043f\u0440\u0438\u0432\u0440\u0435\u0434\u0430 \u0421\u043e\u0444\u0442\u0432\u0435\u0440 \u0437\u0430 \u043c\u0430\u043f\u0438\u0440\u0430\u045a\u0435","publisher":{"@id":"https:\/\/geopard.tech\/#organization"},"alternateName":"GeoPard","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/geopard.tech\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"sr-RS"},{"@type":"Organization","@id":"https:\/\/geopard.tech\/#organization","name":"\u0413\u0435\u043e\u041f\u0430\u0440\u0434 \u0410\u0433\u0440\u0438\u0446\u0443\u043b\u0442\u0443\u0440\u0435","alternateName":"GeoPard","url":"https:\/\/geopard.tech\/","logo":{"@type":"ImageObject","inLanguage":"sr-RS","@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/","url":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/07\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1","contentUrl":"https:\/\/i0.wp.com\/geopard.tech\/wp-content\/uploads\/2026\/07\/geopard_logo_transparentbackground.png?fit=512%2C68&ssl=1","width":512,"height":68,"caption":"GeoPard Agriculture"},"image":{"@id":"https:\/\/geopard.tech\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/geopardAgriculture\/","https:\/\/x.com\/geopardagri","https:\/\/www.linkedin.com\/company\/geopard-agriculture\/","https:\/\/www.instagram.com\/geopardagriculture\/","https:\/\/www.youtube.com\/channel\/UCiaPGLAhRPNh-s85dXdC-Sw","https:\/\/www.g2.com\/products\/geopard-agriculture-precision-farming-software\/reviews"]}]}},"jetpack_likes_enabled":true,"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/PdiCPa-3qF","_links":{"self":[{"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/pages\/13185","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/users\/210157960"}],"replies":[{"embeddable":true,"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/comments?post=13185"}],"version-history":[{"count":0,"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/pages\/13185\/revisions"}],"wp:attachment":[{"href":"https:\/\/geopard.tech\/srb\/wp-json\/wp\/v2\/media?parent=13185"}],"curies":[{"name":"\u0412\u041f","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}