{"id":4800,"date":"2026-07-30T12:33:19","date_gmt":"2026-07-30T12:33:19","guid":{"rendered":"https:\/\/sugimotovisa.com\/en\/?page_id=4800"},"modified":"2026-07-30T16:40:04","modified_gmt":"2026-07-30T16:40:04","slug":"canada-express-entry-crs-calculator","status":"publish","type":"page","link":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/","title":{"rendered":"Canada CRS Score Calculator"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"4800\" class=\"elementor elementor-4800\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-29bb0f3 e-flex e-con-boxed e-con e-parent\" data-id=\"29bb0f3\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;ekit_has_onepagescroll_dot&quot;:&quot;yes&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8dfc8fe elementor-widget elementor-widget-heading\" data-id=\"8dfc8fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">CRS Score Calculator<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-caa6e46 elementor-widget elementor-widget-text-editor\" data-id=\"caa6e46\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use this calculator to estimate your Comprehensive Ranking System (CRS) score for Express Entry. Your score is based on factors such as age, education, language ability, work experience, and other details that may affect your ranking in the Express Entry pool.<\/p><p>The result is intended to give you a general idea of where your profile may stand. It is not an official score and does not guarantee that you will receive an invitation to apply. Final eligibility and ranking are determined by Immigration, Refugees and Citizenship Canada based on the information submitted in your Express Entry profile.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e09fde7 elementor-widget elementor-widget-html\" data-id=\"e09fde7\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div id=\"svc-crs\" lang=\"en\" dir=\"ltr\">\n    <div class=\"masthead\">\n  <div class=\"in\">\n    <span class=\"kicker\">\n      <span data-i18n=\"kicker\"><\/span>\n    <\/span>\n    <h2 data-i18n=\"title\"><\/h2>\n  <\/div>\n<\/div>\n\n<div class=\"wrap\">\n  <main>\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">1<\/span><p data-i18n=\"c1_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_marital\"><\/label>\n        <select id=\"married\">\n          <option value=\"\" data-i18n=\"select_opt\"><\/option>\n          <option value=\"annulled\" data-i18n=\"m_annulled\"><\/option>\n          <option value=\"commonlaw\" data-i18n=\"m_commonlaw\"><\/option>\n          <option value=\"divorced\" data-i18n=\"m_divorced\"><\/option>\n          <option value=\"legallysep\" data-i18n=\"m_legallysep\"><\/option>\n          <option value=\"married\" data-i18n=\"m_married\"><\/option>\n          <option value=\"single\" data-i18n=\"m_single\"><\/option>\n          <option value=\"widowed\" data-i18n=\"m_widowed\"><\/option>\n        <\/select>\n      <\/div>\n      <div class=\"q hidden\" id=\"spousePRq\">\n        <label class=\"qlabel\" data-i18n=\"q_spousePR\"><\/label>\n        <select id=\"spousePR\"><option value=\"no\" data-i18n=\"no\"><\/option><option value=\"yes\" data-i18n=\"yes\"><\/option><\/select>\n      <\/div>\n      <div class=\"q hidden\" id=\"spouseComingq\">\n        <label class=\"qlabel\" data-i18n=\"q_spouseComing\"><\/label>\n        <select id=\"spouseComing\"><option value=\"yes\" data-i18n=\"yes\"><\/option><option value=\"no\" data-i18n=\"no\"><\/option><\/select>\n      <\/div>\n      <p class=\"hint\" id=\"spouseStatusMsg\"><\/p>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">2<\/span><p data-i18n=\"c2_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\"><span data-i18n=\"q_age\"><\/span> <span class=\"soft\" data-i18n=\"age_soft\"><\/span><\/label>\n        <input type=\"number\" id=\"age\" min=\"0\" max=\"120\" data-i18n-ph=\"age_ph\">\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">3<\/span><p data-i18n=\"c3_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_edu\"><\/label>\n        <select id=\"edu\">\n          <option value=\"\" data-i18n=\"select_opt\"><\/option>\n          <option value=\"none\" data-i18n=\"e_none\"><\/option>\n          <option value=\"secondary\" data-i18n=\"e_secondary\"><\/option>\n          <option value=\"oneyear\" data-i18n=\"e_oneyear\"><\/option>\n          <option value=\"twoyear\" data-i18n=\"e_twoyear\"><\/option>\n          <option value=\"bachelor\" data-i18n=\"e_bachelor\"><\/option>\n          <option value=\"twoormore\" data-i18n=\"e_twoormore\"><\/option>\n          <option value=\"masters\" data-i18n=\"e_masters\"><\/option>\n          <option value=\"doctoral\" data-i18n=\"e_doctoral\"><\/option>\n        <\/select>\n      <\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\"><span data-i18n=\"q_canEdu\"><\/span> <span class=\"soft\" data-i18n=\"canEdu_soft\"><\/span><\/label>\n        <select id=\"canEdu\">\n          <option value=\"none\" data-i18n=\"ce_none\"><\/option>\n          <option value=\"short\" data-i18n=\"ce_short\"><\/option>\n          <option value=\"long\" data-i18n=\"ce_long\"><\/option>\n        <\/select>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">4<\/span><p data-i18n=\"c4_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_test1\"><\/label>\n        <select id=\"test1\" class=\"testsel\">\n          <option value=\"\" data-i18n=\"select_opt\"><\/option>\n          <option value=\"IELTS\" data-i18n=\"test_ielts\"><\/option>\n          <option value=\"CELPIP\" data-i18n=\"test_celpip\"><\/option>\n          <option value=\"PTE\" data-i18n=\"test_pte\"><\/option>\n          <option value=\"TEF\" data-i18n=\"test_tef\"><\/option>\n          <option value=\"TCF\" data-i18n=\"test_tcf\"><\/option>\n        <\/select>\n        <div class=\"abilities\" id=\"abil1\"><\/div>\n      <\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\"><span data-i18n=\"q_test2\"><\/span> <span class=\"soft\" data-i18n=\"optional\"><\/span><\/label>\n        <p class=\"hint\" data-i18n=\"hint_test2\"><\/p>\n        <select id=\"test2\" class=\"testsel\">\n          <option value=\"\" data-i18n=\"not_applicable\"><\/option>\n          <option value=\"IELTS\" data-i18n=\"test_ielts\"><\/option>\n          <option value=\"CELPIP\" data-i18n=\"test_celpip\"><\/option>\n          <option value=\"PTE\" data-i18n=\"test_pte\"><\/option>\n          <option value=\"TEF\" data-i18n=\"test_tef\"><\/option>\n          <option value=\"TCF\" data-i18n=\"test_tcf\"><\/option>\n        <\/select>\n        <div class=\"abilities\" id=\"abil2\"><\/div>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">5<\/span><p data-i18n=\"c5_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_canWork\"><\/label>\n        <p class=\"hint\" data-i18n=\"hint_canWork\"><\/p>\n        <select id=\"canWork\">\n          <option value=\"0\" data-i18n=\"y_none\"><\/option>\n          <option value=\"1\" data-i18n=\"y_1\"><\/option><option value=\"2\" data-i18n=\"y_2\"><\/option>\n          <option value=\"3\" data-i18n=\"y_3\"><\/option><option value=\"4\" data-i18n=\"y_4\"><\/option>\n          <option value=\"5\" data-i18n=\"y_5plus\"><\/option>\n        <\/select>\n      <\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_forWork\"><\/label>\n        <p class=\"hint\" data-i18n=\"hint_forWork\"><\/p>\n        <select id=\"forWork\">\n          <option value=\"0\" data-i18n=\"y_none\"><\/option>\n          <option value=\"1\" data-i18n=\"y_1\"><\/option><option value=\"2\" data-i18n=\"y_2\"><\/option>\n          <option value=\"3\" data-i18n=\"y_3plus\"><\/option>\n        <\/select>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">6<\/span><p data-i18n=\"c6_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_cert\"><\/label>\n        <p class=\"hint\" data-i18n-html=\"hint_cert\"><\/p>\n        <select id=\"cert\"><option value=\"no\" data-i18n=\"no\"><\/option><option value=\"yes\" data-i18n=\"yes\"><\/option><\/select>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">7<\/span><p data-i18n=\"c7_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_job\"><\/label>\n        <p class=\"hint\" data-i18n=\"hint_job\"><\/p>\n        <select id=\"job\"><option value=\"no\" data-i18n=\"no\"><\/option><option value=\"yes\" data-i18n=\"yes\"><\/option><\/select>\n      <\/div>\n    <\/section>\n\n    <section class=\"card\">\n      <div class=\"cardhead\"><span class=\"cardnum\">8<\/span><p data-i18n=\"c8_head\"><\/p><\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_pnp\"><\/label>\n        <select id=\"pnp\"><option value=\"no\" data-i18n=\"no\"><\/option><option value=\"yes\" data-i18n=\"yes\"><\/option><\/select>\n      <\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_sibling\"><\/label>\n        <p class=\"hint\" data-i18n=\"hint_sibling\"><\/p>\n        <select id=\"sibling\"><option value=\"no\" data-i18n=\"no\"><\/option><option value=\"yes\" data-i18n=\"yes\"><\/option><\/select>\n      <\/div>\n    <\/section>\n\n    <section class=\"card hidden\" id=\"spouseCard\">\n      <div class=\"cardhead\"><span class=\"cardnum\">9<\/span><p data-i18n=\"c9_head\"><\/p><\/div>\n      <p class=\"hint\" data-i18n=\"hint_spouse\"><\/p>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_spEdu\"><\/label>\n        <select id=\"spEdu\">\n          <option value=\"none\" data-i18n=\"se_none\"><\/option>\n          <option value=\"secondary\" data-i18n=\"se_secondary\"><\/option>\n          <option value=\"oneyear\" data-i18n=\"se_oneyear\"><\/option>\n          <option value=\"twoyear\" data-i18n=\"se_twoyear\"><\/option>\n          <option value=\"bachelor\" data-i18n=\"se_bachelor\"><\/option>\n          <option value=\"twoormore\" data-i18n=\"se_twoormore\"><\/option>\n          <option value=\"masters\" data-i18n=\"se_masters\"><\/option>\n          <option value=\"doctoral\" data-i18n=\"se_doctoral\"><\/option>\n        <\/select>\n      <\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_spTest\"><\/label>\n        <select id=\"spTest\" class=\"testsel\">\n          <option value=\"\" data-i18n=\"not_applicable\"><\/option>\n          <option value=\"IELTS\" data-i18n=\"test_ielts\"><\/option>\n          <option value=\"CELPIP\" data-i18n=\"test_celpip\"><\/option>\n          <option value=\"PTE\" data-i18n=\"test_pte\"><\/option>\n          <option value=\"TEF\" data-i18n=\"test_tef\"><\/option>\n          <option value=\"TCF\" data-i18n=\"test_tcf\"><\/option>\n        <\/select>\n        <div class=\"abilities\" id=\"abilSp\"><\/div>\n      <\/div>\n      <div class=\"q\">\n        <label class=\"qlabel\" data-i18n=\"q_spWork\"><\/label>\n        <select id=\"spWork\">\n          <option value=\"0\" data-i18n=\"y_none\"><\/option>\n          <option value=\"1\" data-i18n=\"y_1\"><\/option><option value=\"2\" data-i18n=\"y_2\"><\/option>\n          <option value=\"3\" data-i18n=\"y_3\"><\/option><option value=\"4\" data-i18n=\"y_4\"><\/option>\n          <option value=\"5\" data-i18n=\"y_5plus\"><\/option>\n        <\/select>\n      <\/div>\n    <\/section>\n\n    <button class=\"calcbtn\" id=\"calc\" data-i18n=\"calc_btn\"><\/button>\n  <\/main>\n\n  <aside>\n    <div class=\"results\">\n      <div class=\"scorepanel\">\n        <div class=\"cap\" data-i18n=\"res_cap\"><\/div>\n        <div class=\"num\" id=\"grand\">0<\/div>\n        <div class=\"outof\" data-i18n=\"res_outof\"><\/div>\n        <div class=\"meter\"><i id=\"meterbar\" style=\"width:0%\"><\/i><\/div>\n      <\/div>\n      <div class=\"body\" id=\"breakdown\"><\/div>\n      <div class=\"foot\" data-i18n=\"res_foot\"><\/div>\n    <\/div>\n  <\/aside>\n<\/div>\n<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4365a1a elementor-widget elementor-widget-html\" data-id=\"4365a1a\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;ekit_we_effect_on&quot;:&quot;none&quot;}\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<script>\n    \/* ============ i18n ============ *\/\n\/* ============ English content ============ *\/\n\nconst I18N = {\n  kicker: \"Comprehensive Ranking System\",\n  title: \"Express Entry CRS Score Calculator\",\n\n  callout: `\n    <b>Good to know:<\/b>\n    <br><br>\n    Having children does not affect your CRS score. A married applicant\n    with children receives the same CRS points as a married applicant\n    without children, so this calculator does not ask for information\n    about dependent children.\n    <br><br>\n    IRCC no longer awards CRS points for arranged employment or a valid\n    job offer. The job-offer question is included for informational\n    purposes only and does not add points to your total score.\n  `,\n\n  select_opt: \"Select an option\u2026\",\n  not_applicable: \"Not applicable\",\n  no: \"No\",\n  yes: \"Yes\",\n  optional: \"(optional)\",\n\n  c1_head: \"Marital Status\",\n  q_marital: \"What is your marital status?\",\n  m_annulled: \"Annulled marriage\",\n  m_commonlaw: \"Common-law\",\n  m_divorced: \"Divorced or separated\",\n  m_legallysep: \"Legally separated\",\n  m_married: \"Married\",\n  m_single: \"Never married or single\",\n  m_widowed: \"Widowed\",\n  q_spousePR:\n    \"Is your spouse or common-law partner a Canadian citizen or permanent resident?\",\n  q_spouseComing:\n    \"Will your spouse or common-law partner accompany you to Canada?\",\n\n  c2_head: \"Age\",\n  q_age: \"How old are you?\",\n  age_soft: \"(your current age or age when invited to apply)\",\n  age_ph: \"For example, 29\",\n\n  c3_head: \"Education\",\n  q_edu: \"What is your highest level of education?\",\n  e_none: \"Less than secondary school\",\n  e_secondary: \"Secondary school diploma\",\n  e_oneyear: \"One-year post-secondary program\",\n  e_twoyear: \"Two-year post-secondary program\",\n  e_bachelor:\n    \"Bachelor\u2019s degree or a post-secondary program of three years or longer\",\n  e_twoormore:\n    \"Two or more certificates or diplomas, including one of three years or longer\",\n  e_masters: \"Master\u2019s degree or professional degree\",\n  e_doctoral: \"Doctoral degree (PhD)\",\n\n  q_canEdu: \"Do you have a Canadian degree, diploma or certificate?\",\n  canEdu_soft: \"(may provide additional CRS points)\",\n  ce_none:\n    \"No, or less than one year of full-time study in Canada\",\n  ce_short: \"Yes \u2014 a one- or two-year Canadian credential\",\n  ce_long:\n    \"Yes \u2014 a credential of three years or longer, or a master\u2019s, professional or doctoral degree\",\n\n  c4_head: \"Official Languages\",\n  q_test1: \"Which test did you take for your first official language?\",\n  q_test2: \"Second official language\",\n  hint_test2:\n    \"Select a test only if you have valid results for your second official language. Language results must be less than two years old.\",\n  test_ielts: \"IELTS General Training\",\n  test_celpip: \"CELPIP-General\",\n  test_pte: \"PTE Core\",\n  test_tef: \"TEF Canada \u2014 French\",\n  test_tcf: \"TCF Canada \u2014 French\",\n\n  c5_head: \"Work Experience\",\n  q_canWork:\n    \"Skilled work experience in Canada during the last 10 years\",\n  hint_canWork:\n    \"Paid full-time work, or an equivalent amount of part-time work, in a NOC TEER 0, 1, 2 or 3 occupation.\",\n  q_forWork:\n    \"Skilled work experience outside Canada during the last 10 years\",\n  hint_forWork:\n    \"Paid full-time work, or an equivalent amount of part-time work, in one NOC TEER 0, 1, 2 or 3 occupation.\",\n\n  y_none: \"None or less than one year\",\n  y_1: \"1 year\",\n  y_2: \"2 years\",\n  y_3: \"3 years\",\n  y_4: \"4 years\",\n  y_5plus: \"5 years or more\",\n  y_3plus: \"3 years or more\",\n\n  c6_head: \"Certificate of Qualification\",\n  q_cert:\n    \"Do you have a certificate of qualification issued by a Canadian province, territory or federal authority?\",\n  hint_cert:\n    \"This applies to eligible skilled trades and is <b>not<\/b> the same as a provincial nomination.\",\n\n  c7_head: \"Job Offer\",\n  q_job:\n    \"Do you have a valid job offer supported by an LMIA, if required?\",\n  hint_job:\n    \"A job offer does not currently add CRS points. This question is included for informational purposes only.\",\n\n  c8_head: \"Additional Points\",\n  q_pnp:\n    \"Do you have a nomination certificate from a Canadian province or territory?\",\n  q_sibling:\n    \"Do you or your accompanying spouse have a sibling in Canada who is a citizen or permanent resident?\",\n  hint_sibling:\n    \"The sibling must be at least 18 years old and share a parent with you or your spouse through birth, marriage, a step-relationship or adoption.\",\n\n  c9_head: \"Accompanying Spouse or Common-Law Partner\",\n  hint_spouse:\n    \"These factors apply only when your spouse or partner is accompanying you and is not already a Canadian citizen or permanent resident.\",\n  q_spEdu: \"What is your spouse\u2019s highest level of education?\",\n  se_none: \"Less than secondary school\",\n  se_secondary: \"Secondary school diploma\",\n  se_oneyear: \"One-year post-secondary program\",\n  se_twoyear: \"Two-year post-secondary program\",\n  se_bachelor: \"Bachelor\u2019s degree or a program of three years or longer\",\n  se_twoormore:\n    \"Two or more credentials, including one of three years or longer\",\n  se_masters: \"Master\u2019s degree or professional degree\",\n  se_doctoral: \"Doctoral degree (PhD)\",\n  q_spTest: \"Spouse\u2019s official-language test\",\n  q_spWork:\n    \"Spouse\u2019s Canadian work experience during the last 10 years\",\n\n  calc_btn: \"Calculate My CRS Score\",\n  res_cap: \"Estimated CRS Score\",\n  res_outof: \"out of 1,200\",\n  res_foot:\n    \"This result is an estimate based on the information entered and is not an official assessment. Language-test equivalencies and current CRS rules should be checked against the latest IRCC requirements.\",\n\n  ab_speaking: \"Speaking\",\n  ab_listening: \"Listening\",\n  ab_reading: \"Reading\",\n  ab_writing: \"Writing\",\n\n  grpA: \"A \u00b7 Core and Human Capital Factors\",\n  grpB: \"B \u00b7 Spouse Factors\",\n  grpC: \"C \u00b7 Skill Transferability Factors\",\n  grpD: \"D \u00b7 Additional Points\",\n\n  r_age: \"Age\",\n  r_edu: \"Education\",\n  r_langs: \"Official languages\",\n  r_first: \"First official language\",\n  r_second: \"Second official language\",\n  r_canwork: \"Canadian work experience\",\n\n  sub_core: \"Core subtotal\",\n\n  r_eduTrans: \"Education factors \u2014 maximum 50\",\n  r_withLang: \"Combined with language ability\",\n  r_withCanWork: \"Combined with Canadian work experience\",\n  r_forTrans: \"Foreign work experience \u2014 maximum 50\",\n  r_cert: \"Certificate of qualification\",\n\n  sub_skill: \"Skill transferability subtotal\",\n\n  r_pnp: \"Provincial nomination\",\n  r_job: \"Job offer\",\n  r_study: \"Canadian education\",\n  r_french: \"French-language proficiency\",\n  r_sibling: \"Sibling in Canada\",\n\n  sub_add: \"Additional-points subtotal\",\n  sub_spouse: \"Spouse-factors subtotal\",\n\n  msg_single:\n    \"Your score will be calculated as an applicant without an accompanying spouse.\",\n  msg_pr:\n    \"Because your spouse is a Canadian citizen or permanent resident, your score will be calculated using the without-spouse criteria.\",\n  msg_notcoming:\n    \"Because your spouse is not accompanying you, your score will be calculated using the without-spouse criteria.\",\n  msg_accompany:\n    \"Your spouse is accompanying you, so the spouse factors and with-spouse scoring criteria will apply.\"\n};\n\nfunction t(key) {\n  return I18N[key] ?? key;\n}\n\nfunction applyLanguage() {\n  const app = document.getElementById(\"svc-crs\");\n\n  if (!app) {\n    return;\n  }\n\n  app.lang = \"en\";\n  app.dir = \"ltr\";\n\n  app.querySelectorAll(\"[data-i18n]\").forEach((element) => {\n    element.textContent = t(element.getAttribute(\"data-i18n\"));\n  });\n\n  app.querySelectorAll(\"[data-i18n-html]\").forEach((element) => {\n    element.innerHTML = t(element.getAttribute(\"data-i18n-html\"));\n  });\n\n  app.querySelectorAll(\"[data-i18n-ph]\").forEach((element) => {\n    element.setAttribute(\n      \"placeholder\",\n      t(element.getAttribute(\"data-i18n-ph\"))\n    );\n  });\n\n  buildAbilities(document.getElementById(\"test1\").value, \"abil1\");\n  buildAbilities(document.getElementById(\"test2\").value, \"abil2\");\n  buildAbilities(document.getElementById(\"spTest\").value, \"abilSp\");\n\n  updateMaritalUI();\n  calculate();\n}\n\n\/* ============ scoring tables ============ *\/\n\nconst T = {\n  IELTS: {\n    order: [\"speaking\", \"listening\", \"reading\", \"writing\"],\n    ab: {\n      speaking: [\n        [\"7.5 \u2013 9.0\", 10],\n        [\"7.0\", 9],\n        [\"6.5\", 8],\n        [\"6.0\", 7],\n        [\"5.5\", 6],\n        [\"5.0\", 5],\n        [\"4.0 \u2013 4.5\", 4],\n        [\"0 \u2013 3.5\", 0]\n      ],\n      listening: [\n        [\"8.5 \u2013 9.0\", 10],\n        [\"8.0\", 9],\n        [\"7.5\", 8],\n        [\"6.0 \u2013 7.0\", 7],\n        [\"5.5\", 6],\n        [\"5.0\", 5],\n        [\"4.5\", 4],\n        [\"0 \u2013 4.0\", 0]\n      ],\n      reading: [\n        [\"8.0 \u2013 9.0\", 10],\n        [\"7.0 \u2013 7.5\", 9],\n        [\"6.5\", 8],\n        [\"6.0\", 7],\n        [\"5.0 \u2013 5.5\", 6],\n        [\"4.0 \u2013 4.5\", 5],\n        [\"3.5\", 4],\n        [\"0 \u2013 3.0\", 0]\n      ],\n      writing: [\n        [\"7.5 \u2013 9.0\", 10],\n        [\"7.0\", 9],\n        [\"6.5\", 8],\n        [\"6.0\", 7],\n        [\"5.5\", 6],\n        [\"5.0\", 5],\n        [\"4.0 \u2013 4.5\", 4],\n        [\"0 \u2013 3.5\", 0]\n      ]\n    }\n  },\n\n  CELPIP: {\n    order: [\"speaking\", \"listening\", \"reading\", \"writing\"],\n    ab: (() => {\n      const grades = [\n        [\"10\", 10],\n        [\"9\", 9],\n        [\"8\", 8],\n        [\"7\", 7],\n        [\"6\", 6],\n        [\"5\", 5],\n        [\"4\", 4],\n        [\"3 or less\", 0]\n      ];\n\n      return {\n        speaking: grades,\n        listening: grades,\n        reading: grades,\n        writing: grades\n      };\n    })()\n  },\n\n  PTE: {\n    order: [\"speaking\", \"listening\", \"reading\", \"writing\"],\n    ab: {\n      speaking: [\n        [\"89 \u2013 90\", 10],\n        [\"84 \u2013 88\", 9],\n        [\"76 \u2013 83\", 8],\n        [\"68 \u2013 75\", 7],\n        [\"59 \u2013 67\", 6],\n        [\"51 \u2013 58\", 5],\n        [\"42 \u2013 50\", 4],\n        [\"0 \u2013 41\", 0]\n      ],\n      listening: [\n        [\"89 \u2013 90\", 10],\n        [\"82 \u2013 88\", 9],\n        [\"71 \u2013 81\", 8],\n        [\"60 \u2013 70\", 7],\n        [\"50 \u2013 59\", 6],\n        [\"39 \u2013 49\", 5],\n        [\"28 \u2013 38\", 4],\n        [\"0 \u2013 27\", 0]\n      ],\n      reading: [\n        [\"88 \u2013 90\", 10],\n        [\"78 \u2013 87\", 9],\n        [\"69 \u2013 77\", 8],\n        [\"60 \u2013 68\", 7],\n        [\"51 \u2013 59\", 6],\n        [\"42 \u2013 50\", 5],\n        [\"33 \u2013 41\", 4],\n        [\"0 \u2013 32\", 0]\n      ],\n      writing: [\n        [\"90\", 10],\n        [\"88 \u2013 89\", 9],\n        [\"79 \u2013 87\", 8],\n        [\"69 \u2013 78\", 7],\n        [\"60 \u2013 68\", 6],\n        [\"51 \u2013 59\", 5],\n        [\"41 \u2013 50\", 4],\n        [\"0 \u2013 40\", 0]\n      ]\n    }\n  },\n\n  TEF: {\n    order: [\"speaking\", \"listening\", \"reading\", \"writing\"],\n    ab: {\n      speaking: [\n        [\"393 \u2013 450\", 10],\n        [\"371 \u2013 392\", 9],\n        [\"349 \u2013 370\", 8],\n        [\"310 \u2013 348\", 7],\n        [\"271 \u2013 309\", 6],\n        [\"226 \u2013 270\", 5],\n        [\"181 \u2013 225\", 4],\n        [\"0 \u2013 180\", 0]\n      ],\n      listening: [\n        [\"316 \u2013 360\", 10],\n        [\"298 \u2013 315\", 9],\n        [\"280 \u2013 297\", 8],\n        [\"249 \u2013 279\", 7],\n        [\"217 \u2013 248\", 6],\n        [\"181 \u2013 216\", 5],\n        [\"145 \u2013 180\", 4],\n        [\"0 \u2013 144\", 0]\n      ],\n      reading: [\n        [\"263 \u2013 300\", 10],\n        [\"248 \u2013 262\", 9],\n        [\"233 \u2013 247\", 8],\n        [\"207 \u2013 232\", 7],\n        [\"181 \u2013 206\", 6],\n        [\"151 \u2013 180\", 5],\n        [\"121 \u2013 150\", 4],\n        [\"0 \u2013 120\", 0]\n      ],\n      writing: [\n        [\"393 \u2013 450\", 10],\n        [\"371 \u2013 392\", 9],\n        [\"349 \u2013 370\", 8],\n        [\"310 \u2013 348\", 7],\n        [\"271 \u2013 309\", 6],\n        [\"226 \u2013 270\", 5],\n        [\"181 \u2013 225\", 4],\n        [\"0 \u2013 180\", 0]\n      ]\n    }\n  },\n\n  TCF: {\n    order: [\"speaking\", \"listening\", \"reading\", \"writing\"],\n    ab: {\n      speaking: [\n        [\"16 \u2013 20\", 10],\n        [\"14 \u2013 15\", 9],\n        [\"12 \u2013 13\", 8],\n        [\"10 \u2013 11\", 7],\n        [\"7 \u2013 9\", 6],\n        [\"6\", 5],\n        [\"4 \u2013 5\", 4],\n        [\"0 \u2013 3\", 0]\n      ],\n      listening: [\n        [\"549 \u2013 699\", 10],\n        [\"523 \u2013 548\", 9],\n        [\"503 \u2013 522\", 8],\n        [\"458 \u2013 502\", 7],\n        [\"398 \u2013 457\", 6],\n        [\"369 \u2013 397\", 5],\n        [\"331 \u2013 368\", 4],\n        [\"0 \u2013 330\", 0]\n      ],\n      reading: [\n        [\"549 \u2013 699\", 10],\n        [\"524 \u2013 548\", 9],\n        [\"499 \u2013 523\", 8],\n        [\"453 \u2013 498\", 7],\n        [\"406 \u2013 452\", 6],\n        [\"375 \u2013 405\", 5],\n        [\"342 \u2013 374\", 4],\n        [\"0 \u2013 341\", 0]\n      ],\n      writing: [\n        [\"16 \u2013 20\", 10],\n        [\"14 \u2013 15\", 9],\n        [\"12 \u2013 13\", 8],\n        [\"10 \u2013 11\", 7],\n        [\"7 \u2013 9\", 6],\n        [\"6\", 5],\n        [\"4 \u2013 5\", 4],\n        [\"0 \u2013 3\", 0]\n      ]\n    }\n  }\n};\n\nconst ABIL_KEY = {\n  speaking:\"ab_speaking\",\n  listening:\"ab_listening\",\n  reading:\"ab_reading\",\n  writing:\"ab_writing\"\n};\n\nconst FRENCH = new Set([\"TEF\", \"TCF\"]);\n\nfunction buildAbilities(testKey, containerId) {\n  const container = document.getElementById(containerId);\n  const previousValues = {};\n\n  container.querySelectorAll(\"select.abilitysel\").forEach((select) => {\n    previousValues[select.dataset.ability] = select.value;\n  });\n\n  container.innerHTML = \"\";\n\n  if (!testKey || !T[testKey]) {\n    return;\n  }\n\n  const test = T[testKey];\n\n  test.order.forEach((ability) => {\n    const wrapper = document.createElement(\"div\");\n    wrapper.className = \"a\";\n\n    const label = document.createElement(\"label\");\n    label.textContent = `${t(ABIL_KEY[ability])}:`;\n\n    const select = document.createElement(\"select\");\n    select.dataset.ability = ability;\n    select.className = \"abilitysel\";\n\n    const placeholder = document.createElement(\"option\");\n    placeholder.value = \"\";\n    placeholder.textContent = t(\"select_opt\");\n    select.appendChild(placeholder);\n\n    test.ab[ability].forEach(([optionLabel, clb]) => {\n      const option = document.createElement(\"option\");\n      option.value = clb;\n      option.textContent = optionLabel;\n      select.appendChild(option);\n    });\n\n    if (previousValues[ability] !== undefined) {\n      select.value = previousValues[ability];\n    }\n\n    wrapper.appendChild(label);\n    wrapper.appendChild(select);\n    container.appendChild(wrapper);\n\n    select.addEventListener(\"change\", calculate);\n  });\n}\n\nfunction readCLBs(containerId) {\n  const selects = document.querySelectorAll(\n    `#${containerId} select.abilitysel`\n  );\n\n  if (selects.length !== 4) {\n    return null;\n  }\n\n  const values = [];\n\n  for (const select of selects) {\n    if (select.value === \"\") {\n      return null;\n    }\n\n    values.push(parseInt(select.value, 10));\n  }\n\n  return values;\n}\n\nfunction agePoints(age, spouse) {\n  if (Number.isNaN(age) || age <= 17 || age >= 45) {\n    return 0;\n  }\n\n  const scores = {\n    18:[90, 99],\n    19:[95, 105],\n    30:[95, 105],\n    31:[90, 99],\n    32:[85, 94],\n    33:[80, 88],\n    34:[75, 83],\n    35:[70, 77],\n    36:[65, 72],\n    37:[60, 66],\n    38:[55, 61],\n    39:[50, 55],\n    40:[45, 50],\n    41:[35, 39],\n    42:[25, 28],\n    43:[15, 17],\n    44:[5, 6]\n  };\n\n  let pair;\n\n  if (age >= 20 && age <= 29) {\n    pair = [100, 110];\n  } else {\n    pair = scores[age] || [0, 0];\n  }\n\n  return spouse ? pair[0] : pair[1];\n}\n\nconst EDU = {\n  none:[0, 0],\n  secondary:[28, 30],\n  oneyear:[84, 90],\n  twoyear:[91, 98],\n  bachelor:[112, 120],\n  twoormore:[119, 128],\n  masters:[126, 135],\n  doctoral:[140, 150]\n};\n\nfunction firstLang(clb, spouse) {\n  if (clb < 4) {\n    return 0;\n  }\n\n  const withSpouse = {\n    10:32,\n    9:29,\n    8:22,\n    7:16,\n    6:8,\n    5:6,\n    4:6\n  };\n\n  const withoutSpouse = {\n    10:34,\n    9:31,\n    8:23,\n    7:17,\n    6:9,\n    5:6,\n    4:6\n  };\n\n  return (spouse ? withSpouse : withoutSpouse)[Math.min(clb, 10)] || 0;\n}\n\nfunction secondLang(clb) {\n  if (clb >= 9) return 6;\n  if (clb >= 7) return 3;\n  if (clb >= 5) return 1;\n  return 0;\n}\n\nconst CANWORK = {\n  0:[0, 0],\n  1:[35, 40],\n  2:[46, 53],\n  3:[56, 64],\n  4:[63, 72],\n  5:[70, 80]\n};\n\nconst SP_EDU = {\n  none:0,\n  secondary:2,\n  oneyear:6,\n  twoyear:7,\n  bachelor:8,\n  twoormore:9,\n  masters:10,\n  doctoral:10\n};\n\nfunction spLang(clb) {\n  if (clb >= 9) return 5;\n  if (clb >= 7) return 3;\n  if (clb >= 5) return 1;\n  return 0;\n}\n\nconst SP_WORK = {\n  0:0,\n  1:5,\n  2:7,\n  3:8,\n  4:9,\n  5:10\n};\n\nfunction eduTier(education) {\n  if (\n    education === \"none\" ||\n    education === \"secondary\" ||\n    !education\n  ) {\n    return 0;\n  }\n\n  if (\n    education === \"twoormore\" ||\n    education === \"masters\" ||\n    education === \"doctoral\"\n  ) {\n    return 2;\n  }\n\n  return 1;\n}\n\nfunction langBand(clbs) {\n  if (!clbs) {\n    return 0;\n  }\n\n  const minimum = Math.min(...clbs);\n\n  if (minimum >= 9) return 9;\n  if (minimum >= 7) return 7;\n\n  return 0;\n}\n\nfunction calculate() {\n  const maritalStatus = document.getElementById(\"married\").value;\n\n  const married =\n    maritalStatus === \"married\" ||\n    maritalStatus === \"commonlaw\";\n\n  const spousePR =\n    document.getElementById(\"spousePR\").value === \"yes\";\n\n  const spouseComing =\n    document.getElementById(\"spouseComing\").value === \"yes\";\n\n  const spouseAccompanying =\n    married &&\n    !spousePR &&\n    spouseComing;\n\n  const age = parseInt(\n    document.getElementById(\"age\").value,\n    10\n  );\n\n  const education =\n    document.getElementById(\"edu\").value;\n\n  const canadianEducation =\n    document.getElementById(\"canEdu\").value;\n\n  const test1 =\n    document.getElementById(\"test1\").value;\n\n  const test2 =\n    document.getElementById(\"test2\").value;\n\n  const clb1 = readCLBs(\"abil1\");\n  const clb2 = readCLBs(\"abil2\");\n\n  const canadianWork = parseInt(\n    document.getElementById(\"canWork\").value,\n    10\n  );\n\n  const foreignWork = parseInt(\n    document.getElementById(\"forWork\").value,\n    10\n  );\n\n  const certificate =\n    document.getElementById(\"cert\").value === \"yes\";\n\n  const provincialNomination =\n    document.getElementById(\"pnp\").value === \"yes\";\n\n  const sibling =\n    document.getElementById(\"sibling\").value === \"yes\";\n\n  const spouseEducation =\n    document.getElementById(\"spEdu\").value;\n\n  const spouseClb =\n    readCLBs(\"abilSp\");\n\n  const spouseWork = parseInt(\n    document.getElementById(\"spWork\").value,\n    10\n  );\n\n  const S = spouseAccompanying;\n\n  const pAge = agePoints(age, S);\n\n  const pEdu =\n    (EDU[education] || [0, 0])[S ? 0 : 1];\n\n  const first1 = clb1\n    ? clb1.reduce(\n        (sum, clb) => sum + firstLang(clb, S),\n        0\n      )\n    : 0;\n\n  let secondLanguage = clb2\n    ? clb2.reduce(\n        (sum, clb) => sum + secondLang(clb),\n        0\n      )\n    : 0;\n\n  secondLanguage = Math.min(\n    secondLanguage,\n    S ? 22 : 24\n  );\n\n  const pCanWork =\n    (CANWORK[canadianWork] || [0, 0])[S ? 0 : 1];\n\n  const coreSub =\n    pAge +\n    pEdu +\n    first1 +\n    secondLanguage +\n    pCanWork;\n\n  let spouseEducationPoints = 0;\n  let spouseLanguagePoints = 0;\n  let spouseWorkPoints = 0;\n  let spouseSubtotal = 0;\n\n  if (S) {\n    spouseEducationPoints =\n      SP_EDU[spouseEducation] || 0;\n\n    spouseLanguagePoints = spouseClb\n      ? Math.min(\n          spouseClb.reduce(\n            (sum, clb) => sum + spLang(clb),\n            0\n          ),\n          20\n        )\n      : 0;\n\n    spouseWorkPoints =\n      SP_WORK[spouseWork] || 0;\n\n    spouseSubtotal =\n      spouseEducationPoints +\n      spouseLanguagePoints +\n      spouseWorkPoints;\n  }\n\n  const tier = eduTier(education);\n  const band = langBand(clb1);\n\n  const firstMinimum = clb1\n    ? Math.min(...clb1)\n    : 0;\n\n  let educationLanguage = 0;\n\n  if (tier && band) {\n    educationLanguage =\n      tier === 1\n        ? band >= 9\n          ? 25\n          : 13\n        : band >= 9\n          ? 50\n          : 25;\n  }\n\n  let educationCanadianWork = 0;\n\n  if (tier && canadianWork >= 1) {\n    const twoYearsCanadian =\n      canadianWork >= 2;\n\n    educationCanadianWork =\n      tier === 1\n        ? twoYearsCanadian\n          ? 25\n          : 13\n        : twoYearsCanadian\n          ? 50\n          : 25;\n  }\n\n  const educationTransferability =\n    Math.min(\n      50,\n      educationLanguage +\n      educationCanadianWork\n    );\n\n  let foreignLanguage = 0;\n\n  if (foreignWork >= 1 && band) {\n    const threeYearsForeign =\n      foreignWork >= 3;\n\n    foreignLanguage =\n      band >= 9\n        ? threeYearsForeign\n          ? 50\n          : 25\n        : threeYearsForeign\n          ? 25\n          : 13;\n  }\n\n  let foreignCanadianWork = 0;\n\n  if (\n    foreignWork >= 1 &&\n    canadianWork >= 1\n  ) {\n    const threeYearsForeign =\n      foreignWork >= 3;\n\n    const twoYearsCanadian =\n      canadianWork >= 2;\n\n    foreignCanadianWork =\n      twoYearsCanadian\n        ? threeYearsForeign\n          ? 50\n          : 25\n        : threeYearsForeign\n          ? 25\n          : 13;\n  }\n\n  const foreignTransferability =\n    Math.min(\n      50,\n      foreignLanguage +\n      foreignCanadianWork\n    );\n\n  let certificatePoints = 0;\n\n  if (certificate) {\n    certificatePoints =\n      firstMinimum >= 7\n        ? 50\n        : firstMinimum >= 5\n          ? 25\n          : 0;\n  }\n\n  const skillSubtotal =\n    Math.min(\n      100,\n      educationTransferability +\n      foreignTransferability +\n      certificatePoints\n    );\n\n  const provincialNominationPoints =\n    provincialNomination ? 600 : 0;\n\n  const jobOfferPoints = 0;\n\n  const canadianEducationPoints =\n    canadianEducation === \"long\"\n      ? 30\n      : canadianEducation === \"short\"\n        ? 15\n        : 0;\n\n  let frenchCLBs = null;\n  let englishCLBs = null;\n\n  [\n    [test1, clb1],\n    [test2, clb2]\n  ].forEach(([testKey, clbs]) => {\n    if (!testKey || !clbs) {\n      return;\n    }\n\n    if (FRENCH.has(testKey)) {\n      frenchCLBs = clbs;\n    } else {\n      englishCLBs = clbs;\n    }\n  });\n\n  let frenchPoints = 0;\n\n  if (\n    frenchCLBs &&\n    Math.min(...frenchCLBs) >= 7\n  ) {\n    frenchPoints =\n      englishCLBs &&\n      Math.min(...englishCLBs) >= 5\n        ? 50\n        : 25;\n  }\n\n  const siblingPoints =\n    sibling ? 15 : 0;\n\n  const additionalSubtotal =\n    Math.min(\n      600,\n      provincialNominationPoints +\n      jobOfferPoints +\n      canadianEducationPoints +\n      frenchPoints +\n      siblingPoints\n    );\n\n  const grand =\n    Math.min(\n      1200,\n      coreSub +\n      spouseSubtotal +\n      skillSubtotal +\n      additionalSubtotal\n    );\n\n  render({\n    S,\n    pAge,\n    pEdu,\n    first1,\n    sec:secondLanguage,\n    pCanWork,\n    coreSub,\n    spEduP:spouseEducationPoints,\n    spLangP:spouseLanguagePoints,\n    spWorkP:spouseWorkPoints,\n    spouseSub:spouseSubtotal,\n    eduLang:educationLanguage,\n    eduCan:educationCanadianWork,\n    eduTrans:educationTransferability,\n    forLang:foreignLanguage,\n    forCan:foreignCanadianWork,\n    forTrans:foreignTransferability,\n    certP:certificatePoints,\n    skillSub:skillSubtotal,\n    pPnp:provincialNominationPoints,\n    pJob:jobOfferPoints,\n    pCanEdu:canadianEducationPoints,\n    pFrench:frenchPoints,\n    pSibling:siblingPoints,\n    addSub:additionalSubtotal,\n    grand\n  });\n}\n\nfunction render(result) {\n  document.getElementById(\"grand\").textContent =\n    result.grand;\n\n  document.getElementById(\"meterbar\").style.width =\n    `${Math.min(result.grand, 1200) \/ 1200 * 100}%`;\n\n  const row = (label, value, indent) => `\n    <div class=\"row\">\n      <span class=\"${indent ? \"ind\" : \"\"}\">${label}<\/span>\n      <span>${value}<\/span>\n    <\/div>\n  `;\n\n  const subtotal = (label, value) => `\n    <div class=\"row sub\">\n      <span>${label}<\/span>\n      <span>${value}<\/span>\n    <\/div>\n  `;\n\n  let html = \"\";\n\n  html += `\n    <div class=\"grp\">\n      <h3>${t(\"grpA\")}<\/h3>\n  `;\n\n  html += row(t(\"r_age\"), result.pAge);\n  html += row(t(\"r_edu\"), result.pEdu);\n  html += row(\n    t(\"r_langs\"),\n    result.first1 + result.sec\n  );\n  html += row(\n    t(\"r_first\"),\n    result.first1,\n    true\n  );\n  html += row(\n    t(\"r_second\"),\n    result.sec,\n    true\n  );\n  html += row(\n    t(\"r_canwork\"),\n    result.pCanWork\n  );\n  html += subtotal(\n    t(\"sub_core\"),\n    result.coreSub\n  );\n\n  html += \"<\/div>\";\n\n  if (result.S) {\n    html += `\n      <div class=\"grp\">\n        <h3>${t(\"grpB\")}<\/h3>\n    `;\n\n    html += row(\n      t(\"r_edu\"),\n      result.spEduP\n    );\n\n    html += row(\n      t(\"r_first\"),\n      result.spLangP\n    );\n\n    html += row(\n      t(\"r_canwork\"),\n      result.spWorkP\n    );\n\n    html += subtotal(\n      t(\"sub_spouse\"),\n      result.spouseSub\n    );\n\n    html += \"<\/div>\";\n  }\n\n  html += `\n    <div class=\"grp\">\n      <h3>${t(\"grpC\")}<\/h3>\n  `;\n\n  html += row(\n    t(\"r_eduTrans\"),\n    result.eduTrans\n  );\n\n  html += row(\n    t(\"r_withLang\"),\n    result.eduLang,\n    true\n  );\n\n  html += row(\n    t(\"r_withCanWork\"),\n    result.eduCan,\n    true\n  );\n\n  html += row(\n    t(\"r_forTrans\"),\n    result.forTrans\n  );\n\n  html += row(\n    t(\"r_withLang\"),\n    result.forLang,\n    true\n  );\n\n  html += row(\n    t(\"r_withCanWork\"),\n    result.forCan,\n    true\n  );\n\n  html += row(\n    t(\"r_cert\"),\n    result.certP\n  );\n\n  html += subtotal(\n    t(\"sub_skill\"),\n    result.skillSub\n  );\n\n  html += \"<\/div>\";\n\n  html += `\n    <div class=\"grp\">\n      <h3>${t(\"grpD\")}<\/h3>\n  `;\n\n  html += row(\n    t(\"r_pnp\"),\n    result.pPnp\n  );\n\n  html += row(\n    t(\"r_job\"),\n    result.pJob\n  );\n\n  html += row(\n    t(\"r_study\"),\n    result.pCanEdu\n  );\n\n  html += row(\n    t(\"r_french\"),\n    result.pFrench\n  );\n\n  html += row(\n    t(\"r_sibling\"),\n    result.pSibling\n  );\n\n  html += subtotal(\n    t(\"sub_add\"),\n    result.addSub\n  );\n\n  html += \"<\/div>\";\n\n  document.getElementById(\"breakdown\").innerHTML =\n    html;\n}\n\nfunction updateMaritalUI() {\n  const maritalStatus =\n    document.getElementById(\"married\").value;\n\n  const married =\n    maritalStatus === \"married\" ||\n    maritalStatus === \"commonlaw\";\n\n  document\n    .getElementById(\"spousePRq\")\n    .classList.toggle(\n      \"hidden\",\n      !married\n    );\n\n  const spousePR =\n    document.getElementById(\"spousePR\").value === \"yes\";\n\n  document\n    .getElementById(\"spouseComingq\")\n    .classList.toggle(\n      \"hidden\",\n      !(married && !spousePR)\n    );\n\n  const spouseComing =\n    document.getElementById(\"spouseComing\").value === \"yes\";\n\n  const accompanying =\n    married &&\n    !spousePR &&\n    spouseComing;\n\n  document\n    .getElementById(\"spouseCard\")\n    .classList.toggle(\n      \"hidden\",\n      !accompanying\n    );\n\n  const message =\n    document.getElementById(\"spouseStatusMsg\");\n\n  if (!maritalStatus) {\n    message.textContent = \"\";\n  } else if (!married) {\n    message.textContent = t(\"msg_single\");\n  } else if (spousePR) {\n    message.textContent = t(\"msg_pr\");\n  } else if (!spouseComing) {\n    message.textContent = t(\"msg_notcoming\");\n  } else {\n    message.textContent = t(\"msg_accompany\");\n  }\n}\n\n[\n  \"married\",\n  \"spousePR\",\n  \"spouseComing\"\n].forEach((id) => {\n  document\n    .getElementById(id)\n    .addEventListener(\"change\", () => {\n      updateMaritalUI();\n      calculate();\n    });\n});\n\ndocument\n  .getElementById(\"test1\")\n  .addEventListener(\"change\", (event) => {\n    buildAbilities(\n      event.target.value,\n      \"abil1\"\n    );\n\n    calculate();\n  });\n\ndocument\n  .getElementById(\"test2\")\n  .addEventListener(\"change\", (event) => {\n    buildAbilities(\n      event.target.value,\n      \"abil2\"\n    );\n\n    calculate();\n  });\n\ndocument\n  .getElementById(\"spTest\")\n  .addEventListener(\"change\", (event) => {\n    buildAbilities(\n      event.target.value,\n      \"abilSp\"\n    );\n\n    calculate();\n  });\n\n[\n  \"age\",\n  \"edu\",\n  \"canEdu\",\n  \"canWork\",\n  \"forWork\",\n  \"cert\",\n  \"job\",\n  \"pnp\",\n  \"sibling\",\n  \"spEdu\",\n  \"spWork\"\n].forEach((id) => {\n  document\n    .getElementById(id)\n    .addEventListener(\n      \"input\",\n      calculate\n    );\n});\n\ndocument\n  .getElementById(\"calc\")\n  .addEventListener(\n    \"click\",\n    calculate\n  );\n\n\nfunction postHeight() {\n  if (window.parent) {\n    window.parent.postMessage(\n      {\n        type:\"sugimoto-tool-height\",\n        height:document.documentElement.scrollHeight\n      },\n      \"*\"\n    );\n  }\n}\n\nnew ResizeObserver(postHeight)\n  .observe(document.body);\n\nwindow.addEventListener(\n  \"load\",\n  postHeight\n);\n\napplyLanguage();\n\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>CRS Score Calculator Use this calculator to estimate your Comprehensive Ranking System (CRS) score for Express Entry. Your score is based on factors such as age, education, language ability, work experience, and other details that may affect your ranking in the Express Entry pool. The result is intended to give you a general idea of [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":4746,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"footnotes":""},"class_list":["post-4800","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v28.2) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Canada CRS Score Calculator | Sugimoto Visa<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Canada CRS Score Calculator\" \/>\n<meta property=\"og:description\" content=\"CRS Score Calculator Use this calculator to estimate your Comprehensive Ranking System (CRS) score for Express Entry. Your score is based on factors such as age, education, language ability, work experience, and other details that may affect your ranking in the Express Entry pool. The result is intended to give you a general idea of [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/\" \/>\n<meta property=\"og:site_name\" content=\"Sugimoto Visa\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/sugimotovisa\/\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-30T16:40:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/sugimotovisa-video-cover-en.webp\" \/>\n\t<meta property=\"og:image:width\" content=\"582\" \/>\n\t<meta property=\"og:image:height\" content=\"873\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/webp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@HamedSugimoto\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/\"},\"author\":{\"name\":\"sugimotovisa\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/person\\\/2823f69a63c2a02316b23d4d16c47cd7\"},\"headline\":\"Canada CRS Score Calculator\",\"datePublished\":\"2026-07-30T12:33:19+00:00\",\"dateModified\":\"2026-07-30T16:40:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/\"},\"wordCount\":104,\"publisher\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#organization\"},\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/\",\"name\":\"Canada CRS Score Calculator | Sugimoto Visa\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#website\"},\"datePublished\":\"2026-07-30T12:33:19+00:00\",\"dateModified\":\"2026-07-30T16:40:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/canada-express-entry-crs-calculator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Free Immigration Tools\",\"item\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/immigration-tools\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Canada CRS Score Calculator\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\",\"name\":\"Sugimoto Visa\",\"description\":\"Your Immigration Solution\",\"publisher\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#organization\"},\"alternateName\":\"Sugimoto Visa\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#organization\",\"name\":\"Sugimoto Visa\",\"alternateName\":\"Sugimoto Visa\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Sugimoto-logo-en.webp\",\"contentUrl\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Sugimoto-logo-en.webp\",\"width\":400,\"height\":68,\"caption\":\"Sugimoto Visa\"},\"image\":{\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/sugimotovisa\\\/\",\"https:\\\/\\\/x.com\\\/HamedSugimoto\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/sugimoto-immigration\\\/\",\"https:\\\/\\\/www.instagram.com\\\/sugimotovisa\\\/\",\"https:\\\/\\\/www.youtube.com\\\/@Sugimotovisa\"],\"description\":\"Sugimoto Visa: Your Immigration Solution. Providing expert guidance and support for your immigration journey.\",\"email\":\"info@sugimotovisa.com\",\"telephone\":\"00989105555487\",\"legalName\":\"Sugimoto Visa Inc\",\"foundingDate\":\"2021-04-16\",\"numberOfEmployees\":{\"@type\":\"QuantitativeValue\",\"minValue\":\"51\",\"maxValue\":\"200\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/#\\\/schema\\\/person\\\/2823f69a63c2a02316b23d4d16c47cd7\",\"name\":\"sugimotovisa\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g\",\"caption\":\"sugimotovisa\"},\"sameAs\":[\"https:\\\/\\\/sugimotovisa.com\\\/en\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Canada CRS Score Calculator | Sugimoto Visa","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:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/","og_locale":"en_US","og_type":"article","og_title":"Canada CRS Score Calculator","og_description":"CRS Score Calculator Use this calculator to estimate your Comprehensive Ranking System (CRS) score for Express Entry. Your score is based on factors such as age, education, language ability, work experience, and other details that may affect your ranking in the Express Entry pool. The result is intended to give you a general idea of [&hellip;]","og_url":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/","og_site_name":"Sugimoto Visa","article_publisher":"https:\/\/www.facebook.com\/sugimotovisa\/","article_modified_time":"2026-07-30T16:40:04+00:00","og_image":[{"width":582,"height":873,"url":"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/sugimotovisa-video-cover-en.webp","type":"image\/webp"}],"twitter_card":"summary_large_image","twitter_site":"@HamedSugimoto","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/#article","isPartOf":{"@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/"},"author":{"name":"sugimotovisa","@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/person\/2823f69a63c2a02316b23d4d16c47cd7"},"headline":"Canada CRS Score Calculator","datePublished":"2026-07-30T12:33:19+00:00","dateModified":"2026-07-30T16:40:04+00:00","mainEntityOfPage":{"@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/"},"wordCount":104,"publisher":{"@id":"https:\/\/sugimotovisa.com\/en\/#organization"},"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/","url":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/","name":"Canada CRS Score Calculator | Sugimoto Visa","isPartOf":{"@id":"https:\/\/sugimotovisa.com\/en\/#website"},"datePublished":"2026-07-30T12:33:19+00:00","dateModified":"2026-07-30T16:40:04+00:00","breadcrumb":{"@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/canada-express-entry-crs-calculator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/sugimotovisa.com\/en\/"},{"@type":"ListItem","position":2,"name":"Free Immigration Tools","item":"https:\/\/sugimotovisa.com\/en\/immigration-tools\/"},{"@type":"ListItem","position":3,"name":"Canada CRS Score Calculator"}]},{"@type":"WebSite","@id":"https:\/\/sugimotovisa.com\/en\/#website","url":"https:\/\/sugimotovisa.com\/en\/","name":"Sugimoto Visa","description":"Your Immigration Solution","publisher":{"@id":"https:\/\/sugimotovisa.com\/en\/#organization"},"alternateName":"Sugimoto Visa","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/sugimotovisa.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/sugimotovisa.com\/en\/#organization","name":"Sugimoto Visa","alternateName":"Sugimoto Visa","url":"https:\/\/sugimotovisa.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/Sugimoto-logo-en.webp","contentUrl":"https:\/\/sugimotovisa.com\/en\/wp-content\/uploads\/2025\/01\/Sugimoto-logo-en.webp","width":400,"height":68,"caption":"Sugimoto Visa"},"image":{"@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/sugimotovisa\/","https:\/\/x.com\/HamedSugimoto","https:\/\/www.linkedin.com\/company\/sugimoto-immigration\/","https:\/\/www.instagram.com\/sugimotovisa\/","https:\/\/www.youtube.com\/@Sugimotovisa"],"description":"Sugimoto Visa: Your Immigration Solution. Providing expert guidance and support for your immigration journey.","email":"info@sugimotovisa.com","telephone":"00989105555487","legalName":"Sugimoto Visa Inc","foundingDate":"2021-04-16","numberOfEmployees":{"@type":"QuantitativeValue","minValue":"51","maxValue":"200"}},{"@type":"Person","@id":"https:\/\/sugimotovisa.com\/en\/#\/schema\/person\/2823f69a63c2a02316b23d4d16c47cd7","name":"sugimotovisa","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f5e5a09db2ae67e63724fee712b81e961c902bc7bb4a421a63af4a74f9199731?s=96&d=mm&r=g","caption":"sugimotovisa"},"sameAs":["https:\/\/sugimotovisa.com\/en\/"]}]}},"_links":{"self":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4800","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/comments?post=4800"}],"version-history":[{"count":34,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4800\/revisions"}],"predecessor-version":[{"id":4924,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4800\/revisions\/4924"}],"up":[{"embeddable":true,"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/pages\/4746"}],"wp:attachment":[{"href":"https:\/\/sugimotovisa.com\/en\/wp-json\/wp\/v2\/media?parent=4800"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}