{"id":13467,"date":"2025-02-16T07:35:26","date_gmt":"2025-02-15T23:35:26","guid":{"rendered":"https:\/\/stooper.co\/?page_id=13467"},"modified":"2026-05-07T18:56:49","modified_gmt":"2026-05-07T10:56:49","slug":"incoterms-tools-3","status":"publish","type":"page","link":"https:\/\/stooper.co\/ms\/free-image-compressor\/","title":{"rendered":"Pemampat Imej Percuma \u2013 Kecilkan Saiz Fail Imej Secara Online"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"13467\" class=\"elementor elementor-13467\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ae32bce e-con-full e-flex e-con e-parent\" data-id=\"ae32bce\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-2addd96 e-flex e-con-boxed e-con e-parent\" data-id=\"2addd96\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-73eeb6c e-flex e-con-boxed e-con e-child\" data-id=\"73eeb6c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf9df1e elementor-widget elementor-widget-heading\" data-id=\"bf9df1e\" data-element_type=\"widget\" data-e-type=\"widget\" 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\">Free Image Compressor - Reduce Image File Size Online<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-d4be337 elementor-widget elementor-widget-text-editor\" data-id=\"d4be337\" data-element_type=\"widget\" data-e-type=\"widget\" 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 free image compressor to reduce image file size before uploading photos to your website, blog or WordPress page. You can compress JPG, PNG and WebP images online and download a smaller file in seconds.<\/p><p>This tool helps make images smaller while keeping good visual quality. It is useful for website speed, product photos, blog images, article images and photos that are too large to upload.<\/p><p>Your images are processed inside your browser. They are not uploaded to our server, so you can compress your images privately and safely.<\/p>\t\t\t\t\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\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-f49427a e-flex e-con-boxed e-con e-parent\" data-id=\"f49427a\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-8386ce4 e-flex e-con-boxed e-con e-child\" data-id=\"8386ce4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-e7ac3eb elementor-widget elementor-widget-html\" data-id=\"e7ac3eb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!-- Stooper Free File & Image Compressor - WordPress Custom HTML Version -->\r\n<div id=\"stooper-file-compressor\" class=\"sfc46\">\r\n  <script src=\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/jszip\/3.10.1\/jszip.min.js\"><\/script>\r\n\r\n  <div class=\"sfc46-header\">\r\n    <div>\r\n      <div class=\"sfc46-kicker\">STOOPER WEBSITE TOOL<\/div>\r\n      <h2>Free File & Image Compressor<\/h2>\r\n      <p>Reduce image file size and package PDF, Word, Excel, PowerPoint, CSV and TXT files into ZIP.<\/p>\r\n    <\/div>\r\n\r\n    <div class=\"sfc46-top-buttons\">\r\n      <button type=\"button\" id=\"sfc46-clear-top\">Clear<\/button>\r\n      <button type=\"button\" id=\"sfc46-download-top\" disabled>Download ZIP<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"sfc46-main\">\r\n    <div class=\"sfc46-left\">\r\n      <div class=\"sfc46-drop\" id=\"sfc46-drop\">\r\n        <div>\r\n          <div class=\"sfc46-drop-icon\">\u21e9<\/div>\r\n          <h3>Drop images or files here<\/h3>\r\n          <p>Compress JPG, PNG and WebP images. Package PDF, Word, Excel and other files into ZIP. Files stay on your device.<\/p>\r\n\r\n          <label class=\"sfc46-file-btn\">\r\n            Choose Files\r\n            <input\r\n              type=\"file\"\r\n              id=\"sfc46-file-input\"\r\n              multiple\r\n              accept=\"image\/*,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.csv,.txt,.zip,.rar\">\r\n          <\/label>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"sfc46-toolbar\">\r\n        <button type=\"button\" id=\"sfc46-process\" disabled>Process Files<\/button>\r\n        <button type=\"button\" id=\"sfc46-download\" disabled>Download ZIP<\/button>\r\n        <button type=\"button\" id=\"sfc46-clear\">Clear<\/button>\r\n      <\/div>\r\n\r\n      <div class=\"sfc46-progress\" id=\"sfc46-progress\">\r\n        <span id=\"sfc46-progress-bar\"><\/span>\r\n      <\/div>\r\n\r\n      <div class=\"sfc46-message\" id=\"sfc46-message\">No files selected yet.<\/div>\r\n\r\n      <div class=\"sfc46-table-wrap\">\r\n        <table class=\"sfc46-table\">\r\n          <thead>\r\n            <tr>\r\n              <th>File<\/th>\r\n              <th>Type<\/th>\r\n              <th>Action<\/th>\r\n              <th>Before<\/th>\r\n              <th>After<\/th>\r\n              <th>Saved<\/th>\r\n              <th>Status<\/th>\r\n              <th>Download<\/th>\r\n            <\/tr>\r\n          <\/thead>\r\n          <tbody id=\"sfc46-result-body\">\r\n            <tr>\r\n              <td colspan=\"8\" class=\"sfc46-empty\">No processed files yet.<\/td>\r\n            <\/tr>\r\n          <\/tbody>\r\n        <\/table>\r\n      <\/div>\r\n    <\/div>\r\n\r\n    <div class=\"sfc46-right\">\r\n      <div class=\"sfc46-card\">\r\n        <h3>Settings<\/h3>\r\n\r\n        <label>\r\n          Processing Mode\r\n          <select id=\"sfc46-mode\">\r\n            <option value=\"smart\" selected>Smart Mode - images optimize, files ZIP<\/option>\r\n            <option value=\"image\">Image Optimizer Only<\/option>\r\n            <option value=\"zip\">ZIP Files Only<\/option>\r\n          <\/select>\r\n        <\/label>\r\n\r\n        <label>\r\n          Image Preset\r\n          <select id=\"sfc46-preset\">\r\n            <option value=\"speed\" selected>Website Speed 113KB<\/option>\r\n            <option value=\"balanced\">Website Balanced 180KB<\/option>\r\n            <option value=\"small\">Maximum Small Size 80KB<\/option>\r\n            <option value=\"high\">High Quality 300KB<\/option>\r\n            <option value=\"resize\">Resize Fast Website<\/option>\r\n          <\/select>\r\n        <\/label>\r\n\r\n        <label>\r\n          Image Output Format\r\n          <select id=\"sfc46-format\">\r\n            <option value=\"image\/webp\" selected>WebP - best for website<\/option>\r\n            <option value=\"image\/jpeg\">JPEG - compatible<\/option>\r\n            <option value=\"image\/png\">PNG - transparent graphics<\/option>\r\n          <\/select>\r\n        <\/label>\r\n\r\n        <label>\r\n          Target Max Image Size KB\r\n          <input type=\"number\" id=\"sfc46-target-kb\" min=\"20\" max=\"5000\" value=\"113\">\r\n        <\/label>\r\n\r\n        <label>\r\n          Image Quality: <span id=\"sfc46-quality-text\">76%<\/span>\r\n          <input type=\"range\" id=\"sfc46-quality\" min=\"35\" max=\"95\" value=\"76\">\r\n        <\/label>\r\n\r\n        <label>\r\n          Minimum Image Quality\r\n          <input type=\"number\" id=\"sfc46-min-quality\" min=\"5\" max=\"95\" value=\"28\">\r\n        <\/label>\r\n\r\n        <label class=\"sfc46-check\">\r\n          <input type=\"checkbox\" id=\"sfc46-keep-resolution\" checked>\r\n          <span>Keep original image resolution<\/span>\r\n        <\/label>\r\n\r\n        <label id=\"sfc46-max-width-box\" class=\"sfc46-hide\">\r\n          Resize Max Width px\r\n          <input type=\"number\" id=\"sfc46-max-width\" min=\"320\" max=\"6000\" value=\"1600\">\r\n        <\/label>\r\n\r\n        <label class=\"sfc46-check\">\r\n          <input type=\"checkbox\" id=\"sfc46-skip-bigger\" checked>\r\n          <span>Keep original image if compressed image becomes bigger<\/span>\r\n        <\/label>\r\n\r\n        <label>\r\n          ZIP File Name\r\n          <input type=\"text\" id=\"sfc46-zip-name\" value=\"compressed-files\">\r\n        <\/label>\r\n\r\n        <div class=\"sfc46-note\">\r\n          <b>Note:<\/b> Images can be truly optimized. PDF, Word, Excel and PowerPoint are usually already compressed, so ZIP may reduce only a little.\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"sfc46-summary\">\r\n        <div>\r\n          <small>Files<\/small>\r\n          <b id=\"sfc46-sum-files\">0<\/b>\r\n        <\/div>\r\n        <div>\r\n          <small>Original Size<\/small>\r\n          <b id=\"sfc46-sum-before\">0 KB<\/b>\r\n        <\/div>\r\n        <div>\r\n          <small>Output Size<\/small>\r\n          <b id=\"sfc46-sum-after\">0 KB<\/b>\r\n        <\/div>\r\n        <div class=\"sfc46-gold\">\r\n          <small>Saved<\/small>\r\n          <b id=\"sfc46-sum-saved\">0%<\/b>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"sfc46-privacy\">\r\n        \ud83d\udd12 Private browser processing. Files are not uploaded to server.\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"sfc46-footer\">\r\n    Image compression: best for JPG \/ PNG \/ WebP. Document compression: ZIP packaging for PDF \/ Word \/ Excel \/ PowerPoint \/ CSV \/ TXT.\r\n  <\/div>\r\n<\/div>\r\n\r\n<style>\r\n  .sfc46 {\r\n    width: 100%;\r\n    max-width: 1240px;\r\n    margin: 32px auto;\r\n    padding: 30px;\r\n    border-radius: 32px;\r\n    background:\r\n      radial-gradient(circle at top left, rgba(37,99,235,.28), transparent 34%),\r\n      radial-gradient(circle at bottom right, rgba(168,85,247,.18), transparent 30%),\r\n      linear-gradient(135deg, #020617, #0f172a 52%, #111827);\r\n    color: #fff;\r\n    font-family: Arial, sans-serif;\r\n    box-shadow: 0 36px 95px rgba(2,6,23,.5);\r\n    overflow: hidden;\r\n    clear: both;\r\n  }\r\n\r\n  .sfc46,\r\n  .sfc46 * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .sfc46-header {\r\n    display: flex;\r\n    justify-content: space-between;\r\n    align-items: flex-start;\r\n    gap: 18px;\r\n    margin-bottom: 22px;\r\n  }\r\n\r\n  .sfc46-kicker {\r\n    color: #60a5fa;\r\n    font-size: 12px;\r\n    font-weight: 900;\r\n    letter-spacing: .1em;\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  .sfc46 h2 {\r\n    margin: 0;\r\n    font-size: 34px;\r\n    line-height: 1.12;\r\n    color: #fff;\r\n  }\r\n\r\n  .sfc46-header p {\r\n    margin: 10px 0 0;\r\n    color: #cbd5e1;\r\n    line-height: 1.55;\r\n  }\r\n\r\n  .sfc46-top-buttons,\r\n  .sfc46-toolbar {\r\n    display: flex;\r\n    gap: 10px;\r\n    flex-wrap: wrap;\r\n  }\r\n\r\n  .sfc46 button {\r\n    border: 0;\r\n    border-radius: 14px;\r\n    padding: 12px 17px;\r\n    cursor: pointer;\r\n    font-weight: 900;\r\n    background: #1e293b;\r\n    color: #e5e7eb;\r\n    transition: .2s ease;\r\n    font-family: Arial, sans-serif;\r\n  }\r\n\r\n  .sfc46 button:hover:not(:disabled) {\r\n    background: #60a5fa;\r\n    color: #020617;\r\n  }\r\n\r\n  .sfc46 button:disabled {\r\n    opacity: .45;\r\n    cursor: not-allowed;\r\n  }\r\n\r\n  .sfc46-main {\r\n    display: grid;\r\n    grid-template-columns: minmax(0, 1.35fr) minmax(300px, .85fr);\r\n    gap: 22px;\r\n    align-items: start;\r\n  }\r\n\r\n  .sfc46-left,\r\n  .sfc46-right {\r\n    min-width: 0;\r\n  }\r\n\r\n  .sfc46-drop {\r\n    min-height: 330px;\r\n    border-radius: 24px;\r\n    background: linear-gradient(180deg, rgba(15,23,42,.88), rgba(2,6,23,.96));\r\n    border: 2px dashed rgba(148,163,184,.34);\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    text-align: center;\r\n    padding: 26px;\r\n    transition: .18s ease;\r\n  }\r\n\r\n  .sfc46-drop.sfc46-dragover {\r\n    border-color: #60a5fa;\r\n    background: rgba(37,99,235,.15);\r\n    box-shadow: 0 0 0 4px rgba(96,165,250,.12);\r\n  }\r\n\r\n  .sfc46-drop-icon {\r\n    width: 82px;\r\n    height: 82px;\r\n    margin: 0 auto 16px;\r\n    border-radius: 28px;\r\n    display: flex;\r\n    align-items: center;\r\n    justify-content: center;\r\n    background: rgba(96,165,250,.12);\r\n    border: 1px solid rgba(96,165,250,.3);\r\n    color: #93c5fd;\r\n    font-size: 40px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .sfc46-drop h3 {\r\n    margin: 0 0 8px;\r\n    font-size: 26px;\r\n    color: #fff;\r\n  }\r\n\r\n  .sfc46-drop p {\r\n    margin: 0 0 18px;\r\n    color: #cbd5e1;\r\n    line-height: 1.55;\r\n    max-width: 560px;\r\n  }\r\n\r\n  .sfc46-file-btn {\r\n    display: inline-flex;\r\n    padding: 13px 18px;\r\n    border-radius: 15px;\r\n    background: linear-gradient(135deg, #2563eb, #7c3aed);\r\n    color: #fff;\r\n    font-weight: 900;\r\n    cursor: pointer;\r\n    box-shadow: 0 14px 30px rgba(37,99,235,.25);\r\n  }\r\n\r\n  .sfc46-file-btn input {\r\n    display: none;\r\n  }\r\n\r\n  .sfc46-toolbar {\r\n    margin: 16px 0;\r\n  }\r\n\r\n  .sfc46-progress {\r\n    display: none;\r\n    height: 10px;\r\n    border-radius: 999px;\r\n    overflow: hidden;\r\n    background: rgba(148,163,184,.18);\r\n    margin-bottom: 14px;\r\n  }\r\n\r\n  .sfc46-progress span {\r\n    display: block;\r\n    width: 0%;\r\n    height: 100%;\r\n    background: linear-gradient(90deg, #60a5fa, #a78bfa);\r\n    transition: .2s ease;\r\n  }\r\n\r\n  .sfc46-message {\r\n    margin-bottom: 14px;\r\n    color: #cbd5e1;\r\n    font-size: 14px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .sfc46-table-wrap {\r\n    width: 100%;\r\n    max-width: 100%;\r\n    overflow-x: auto;\r\n    border-radius: 20px;\r\n    background: linear-gradient(180deg, rgba(15,23,42,.88), rgba(2,6,23,.96));\r\n    border: 1px solid rgba(255,255,255,.12);\r\n  }\r\n\r\n  .sfc46-table {\r\n    width: 100%;\r\n    min-width: 920px;\r\n    border-collapse: collapse;\r\n    margin: 0;\r\n    color: #fff;\r\n  }\r\n\r\n  .sfc46-table th,\r\n  .sfc46-table td {\r\n    padding: 13px 11px;\r\n    border-bottom: 1px solid rgba(255,255,255,.1);\r\n    text-align: left;\r\n    font-size: 13px;\r\n    color: #e5e7eb;\r\n    vertical-align: middle;\r\n  }\r\n\r\n  .sfc46-table th {\r\n    background: rgba(2,6,23,.42);\r\n    color: #cbd5e1;\r\n    font-size: 12px;\r\n    text-transform: uppercase;\r\n    letter-spacing: .04em;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .sfc46-empty {\r\n    text-align: center !important;\r\n    color: #94a3b8 !important;\r\n    padding: 34px !important;\r\n  }\r\n\r\n  .sfc46-file-name {\r\n    max-width: 260px;\r\n    overflow: hidden;\r\n    text-overflow: ellipsis;\r\n    white-space: nowrap;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .sfc46-badge {\r\n    display: inline-flex;\r\n    padding: 5px 9px;\r\n    border-radius: 999px;\r\n    font-size: 12px;\r\n    font-weight: 900;\r\n    white-space: nowrap;\r\n  }\r\n\r\n  .sfc46-good {\r\n    color: #bbf7d0;\r\n    background: rgba(34,197,94,.15);\r\n  }\r\n\r\n  .sfc46-warn {\r\n    color: #fde68a;\r\n    background: rgba(245,158,11,.16);\r\n  }\r\n\r\n  .sfc46-bad {\r\n    color: #fecaca;\r\n    background: rgba(239,68,68,.16);\r\n  }\r\n\r\n  .sfc46-info {\r\n    color: #bfdbfe;\r\n    background: rgba(96,165,250,.15);\r\n  }\r\n\r\n  .sfc46-download {\r\n    color: #93c5fd;\r\n    font-weight: 900;\r\n    text-decoration: none;\r\n  }\r\n\r\n  .sfc46-download:hover {\r\n    text-decoration: underline;\r\n  }\r\n\r\n  .sfc46-card {\r\n    border-radius: 24px;\r\n    background: linear-gradient(180deg, rgba(15,23,42,.88), rgba(2,6,23,.96));\r\n    border: 1px solid rgba(255,255,255,.12);\r\n    padding: 20px;\r\n    overflow: hidden;\r\n  }\r\n\r\n  .sfc46-card h3 {\r\n    margin: 0 0 16px;\r\n    font-size: 20px;\r\n    color: #fff;\r\n  }\r\n\r\n  .sfc46-card label {\r\n    display: block;\r\n    color: #cbd5e1;\r\n    font-size: 12px;\r\n    font-weight: 800;\r\n    margin-bottom: 13px;\r\n  }\r\n\r\n  .sfc46-card input,\r\n  .sfc46-card select {\r\n    width: 100%;\r\n    margin-top: 6px;\r\n    padding: 11px 10px;\r\n    border-radius: 13px;\r\n    background: #020617;\r\n    border: 1px solid rgba(148,163,184,.35);\r\n    color: #fff;\r\n    outline: none;\r\n  }\r\n\r\n  .sfc46-card input:focus,\r\n  .sfc46-card select:focus {\r\n    border-color: #60a5fa;\r\n    box-shadow: 0 0 0 3px rgba(96,165,250,.13);\r\n  }\r\n\r\n  .sfc46-card input[type=\"range\"] {\r\n    padding: 0;\r\n    border: 0;\r\n    accent-color: #60a5fa;\r\n    background: transparent;\r\n  }\r\n\r\n  .sfc46-check {\r\n    display: flex !important;\r\n    align-items: flex-start;\r\n    gap: 10px;\r\n    padding: 11px;\r\n    border-radius: 15px;\r\n    background: rgba(255,255,255,.055);\r\n    border: 1px dashed rgba(255,255,255,.12);\r\n  }\r\n\r\n  .sfc46-check input {\r\n    width: auto !important;\r\n    margin-top: 2px !important;\r\n  }\r\n\r\n  .sfc46-note {\r\n    margin-top: 4px;\r\n    padding: 12px;\r\n    border-radius: 16px;\r\n    background: rgba(255,255,255,.06);\r\n    border: 1px solid rgba(255,255,255,.1);\r\n    color: #94a3b8;\r\n    font-size: 13px;\r\n    line-height: 1.55;\r\n  }\r\n\r\n  .sfc46-note b {\r\n    color: #e5e7eb;\r\n  }\r\n\r\n  .sfc46-hide {\r\n    display: none !important;\r\n  }\r\n\r\n  .sfc46-summary {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 12px;\r\n    margin-top: 14px;\r\n  }\r\n\r\n  .sfc46-summary div {\r\n    padding: 16px;\r\n    border-radius: 20px;\r\n    background: rgba(255,255,255,.08);\r\n    border: 1px solid rgba(255,255,255,.12);\r\n  }\r\n\r\n  .sfc46-summary small {\r\n    display: block;\r\n    color: #cbd5e1;\r\n    margin-bottom: 8px;\r\n  }\r\n\r\n  .sfc46-summary b {\r\n    display: block;\r\n    font-size: 22px;\r\n    color: #fff;\r\n  }\r\n\r\n  .sfc46-summary .sfc46-gold {\r\n    background: linear-gradient(135deg, rgba(250,204,21,.22), rgba(251,146,60,.13));\r\n    border-color: rgba(250,204,21,.42);\r\n  }\r\n\r\n  .sfc46-gold b {\r\n    color: #fde68a;\r\n  }\r\n\r\n  .sfc46-privacy {\r\n    margin-top: 14px;\r\n    padding: 13px;\r\n    border-radius: 16px;\r\n    background: rgba(34,197,94,.10);\r\n    border: 1px solid rgba(34,197,94,.25);\r\n    color: #bbf7d0;\r\n    font-weight: 800;\r\n    font-size: 13px;\r\n  }\r\n\r\n  .sfc46-footer {\r\n    margin-top: 16px;\r\n    text-align: center;\r\n    color: #94a3b8;\r\n    font-size: 13px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  @media (max-width: 980px) {\r\n    .sfc46-main {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .sfc46-summary {\r\n      grid-template-columns: repeat(4, 1fr);\r\n    }\r\n  }\r\n\r\n  @media (max-width: 680px) {\r\n    .sfc46 {\r\n      padding: 20px;\r\n      border-radius: 22px;\r\n      margin: 22px auto;\r\n    }\r\n\r\n    .sfc46-header {\r\n      flex-direction: column;\r\n    }\r\n\r\n    .sfc46 h2 {\r\n      font-size: 27px;\r\n    }\r\n\r\n    .sfc46-summary {\r\n      grid-template-columns: 1fr 1fr;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 480px) {\r\n    .sfc46-summary {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .sfc46-top-buttons button,\r\n    .sfc46-toolbar button {\r\n      width: 100%;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n(function () {\r\n  const root = document.getElementById(\"stooper-file-compressor\");\r\n  if (!root) return;\r\n\r\n  const modeEl = root.querySelector(\"#sfc46-mode\");\r\n  const presetEl = root.querySelector(\"#sfc46-preset\");\r\n  const formatEl = root.querySelector(\"#sfc46-format\");\r\n  const targetKbEl = root.querySelector(\"#sfc46-target-kb\");\r\n  const qualityEl = root.querySelector(\"#sfc46-quality\");\r\n  const qualityText = root.querySelector(\"#sfc46-quality-text\");\r\n  const minQualityEl = root.querySelector(\"#sfc46-min-quality\");\r\n  const keepResolutionEl = root.querySelector(\"#sfc46-keep-resolution\");\r\n  const maxWidthBox = root.querySelector(\"#sfc46-max-width-box\");\r\n  const maxWidthEl = root.querySelector(\"#sfc46-max-width\");\r\n  const skipBiggerEl = root.querySelector(\"#sfc46-skip-bigger\");\r\n  const zipNameEl = root.querySelector(\"#sfc46-zip-name\");\r\n\r\n  const drop = root.querySelector(\"#sfc46-drop\");\r\n  const fileInput = root.querySelector(\"#sfc46-file-input\");\r\n  const processBtn = root.querySelector(\"#sfc46-process\");\r\n  const downloadBtn = root.querySelector(\"#sfc46-download\");\r\n  const downloadTopBtn = root.querySelector(\"#sfc46-download-top\");\r\n  const clearBtn = root.querySelector(\"#sfc46-clear\");\r\n  const clearTopBtn = root.querySelector(\"#sfc46-clear-top\");\r\n  const progress = root.querySelector(\"#sfc46-progress\");\r\n  const progressBar = root.querySelector(\"#sfc46-progress-bar\");\r\n  const message = root.querySelector(\"#sfc46-message\");\r\n  const resultBody = root.querySelector(\"#sfc46-result-body\");\r\n\r\n  const sumFiles = root.querySelector(\"#sfc46-sum-files\");\r\n  const sumBefore = root.querySelector(\"#sfc46-sum-before\");\r\n  const sumAfter = root.querySelector(\"#sfc46-sum-after\");\r\n  const sumSaved = root.querySelector(\"#sfc46-sum-saved\");\r\n\r\n  let selectedFiles = [];\r\n  let outputItems = [];\r\n  let currentZipBlob = null;\r\n  let currentZipUrl = null;\r\n\r\n  const presets = {\r\n    speed: {\r\n      format: \"image\/webp\",\r\n      targetKb: 113,\r\n      quality: 76,\r\n      minQuality: 28,\r\n      keepResolution: true,\r\n      maxWidth: 1600\r\n    },\r\n    balanced: {\r\n      format: \"image\/webp\",\r\n      targetKb: 180,\r\n      quality: 78,\r\n      minQuality: 35,\r\n      keepResolution: true,\r\n      maxWidth: 1600\r\n    },\r\n    small: {\r\n      format: \"image\/webp\",\r\n      targetKb: 80,\r\n      quality: 66,\r\n      minQuality: 18,\r\n      keepResolution: true,\r\n      maxWidth: 1400\r\n    },\r\n    high: {\r\n      format: \"image\/webp\",\r\n      targetKb: 300,\r\n      quality: 86,\r\n      minQuality: 55,\r\n      keepResolution: true,\r\n      maxWidth: 1920\r\n    },\r\n    resize: {\r\n      format: \"image\/webp\",\r\n      targetKb: 140,\r\n      quality: 78,\r\n      minQuality: 35,\r\n      keepResolution: false,\r\n      maxWidth: 1600\r\n    }\r\n  };\r\n\r\n  presetEl.addEventListener(\"change\", function () {\r\n    applyPreset(presetEl.value);\r\n  });\r\n\r\n  qualityEl.addEventListener(\"input\", function () {\r\n    qualityText.textContent = qualityEl.value + \"%\";\r\n  });\r\n\r\n  keepResolutionEl.addEventListener(\"change\", updateResizeBox);\r\n\r\n  fileInput.addEventListener(\"change\", function (event) {\r\n    addFiles(event.target.files);\r\n  });\r\n\r\n  processBtn.addEventListener(\"click\", processFiles);\r\n  downloadBtn.addEventListener(\"click\", downloadZip);\r\n  downloadTopBtn.addEventListener(\"click\", downloadZip);\r\n  clearBtn.addEventListener(\"click\", clearAll);\r\n  clearTopBtn.addEventListener(\"click\", clearAll);\r\n\r\n  [\"dragenter\", \"dragover\"].forEach(function (eventName) {\r\n    drop.addEventListener(eventName, function (event) {\r\n      event.preventDefault();\r\n      drop.classList.add(\"sfc46-dragover\");\r\n    });\r\n  });\r\n\r\n  [\"dragleave\", \"drop\"].forEach(function (eventName) {\r\n    drop.addEventListener(eventName, function (event) {\r\n      event.preventDefault();\r\n      drop.classList.remove(\"sfc46-dragover\");\r\n    });\r\n  });\r\n\r\n  drop.addEventListener(\"drop\", function (event) {\r\n    addFiles(event.dataTransfer.files);\r\n  });\r\n\r\n  function applyPreset(name) {\r\n    const p = presets[name] || presets.speed;\r\n\r\n    formatEl.value = p.format;\r\n    targetKbEl.value = p.targetKb;\r\n    qualityEl.value = p.quality;\r\n    qualityText.textContent = p.quality + \"%\";\r\n    minQualityEl.value = p.minQuality;\r\n    keepResolutionEl.checked = p.keepResolution;\r\n    maxWidthEl.value = p.maxWidth;\r\n\r\n    updateResizeBox();\r\n  }\r\n\r\n  function updateResizeBox() {\r\n    if (keepResolutionEl.checked) {\r\n      maxWidthBox.classList.add(\"sfc46-hide\");\r\n    } else {\r\n      maxWidthBox.classList.remove(\"sfc46-hide\");\r\n    }\r\n  }\r\n\r\n  function addFiles(files) {\r\n    const list = Array.from(files || []);\r\n    if (!list.length) return;\r\n\r\n    selectedFiles = selectedFiles.concat(list);\r\n    outputItems = [];\r\n    clearZipUrl();\r\n\r\n    processBtn.disabled = false;\r\n    downloadBtn.disabled = true;\r\n    downloadTopBtn.disabled = true;\r\n    message.textContent = selectedFiles.length + \" file(s) selected. Click Process Files.\";\r\n\r\n    renderSelected();\r\n    updateSummarySelected();\r\n  }\r\n\r\n  function renderSelected() {\r\n    if (!selectedFiles.length) {\r\n      resultBody.innerHTML = '<tr><td colspan=\"8\" class=\"sfc46-empty\">No processed files yet.<\/td><\/tr>';\r\n      return;\r\n    }\r\n\r\n    resultBody.innerHTML = selectedFiles.map(function (file) {\r\n      return `\r\n        <tr>\r\n          <td><div class=\"sfc46-file-name\" title=\"${escapeHtml(file.name)}\">${escapeHtml(file.name)}<\/div><\/td>\r\n          <td>${escapeHtml(getFileKind(file))}<\/td>\r\n          <td>-<\/td>\r\n          <td>${formatBytes(file.size)}<\/td>\r\n          <td>-<\/td>\r\n          <td>-<\/td>\r\n          <td><span class=\"sfc46-badge sfc46-warn\">Waiting<\/span><\/td>\r\n          <td>-<\/td>\r\n        <\/tr>\r\n      `;\r\n    }).join(\"\");\r\n  }\r\n\r\n  function updateSummarySelected() {\r\n    const before = selectedFiles.reduce(function (sum, file) {\r\n      return sum + file.size;\r\n    }, 0);\r\n\r\n    sumFiles.textContent = selectedFiles.length;\r\n    sumBefore.textContent = formatBytes(before);\r\n    sumAfter.textContent = \"0 KB\";\r\n    sumSaved.textContent = \"0%\";\r\n  }\r\n\r\n  async function processFiles() {\r\n    if (!selectedFiles.length) return;\r\n\r\n    if (typeof JSZip === \"undefined\") {\r\n      message.textContent = \"ZIP library failed to load. Please check if JSZip CDN is blocked.\";\r\n      return;\r\n    }\r\n\r\n    outputItems.forEach(function (item) {\r\n      if (item.url) URL.revokeObjectURL(item.url);\r\n    });\r\n\r\n    outputItems = [];\r\n    clearZipUrl();\r\n\r\n    processBtn.disabled = true;\r\n    downloadBtn.disabled = true;\r\n    downloadTopBtn.disabled = true;\r\n    progress.style.display = \"block\";\r\n    progressBar.style.width = \"0%\";\r\n    message.textContent = \"Processing files...\";\r\n\r\n    const zip = new JSZip();\r\n    const mode = modeEl.value;\r\n\r\n    for (let i = 0; i < selectedFiles.length; i++) {\r\n      const file = selectedFiles[i];\r\n\r\n      try {\r\n        let item;\r\n\r\n        if (isImage(file) && mode !== \"zip\") {\r\n          item = await compressImage(file);\r\n          zip.file(item.outputName, item.blob);\r\n        } else {\r\n          item = await zipOnlyItem(file);\r\n          zip.file(item.outputName, file, {\r\n            compression: \"DEFLATE\",\r\n            compressionOptions: { level: 9 }\r\n          });\r\n        }\r\n\r\n        outputItems.push(item);\r\n      } catch (error) {\r\n        outputItems.push({\r\n          name: file.name,\r\n          outputName: \"-\",\r\n          type: getFileKind(file),\r\n          action: \"Failed\",\r\n          originalSize: file.size,\r\n          outputSize: 0,\r\n          savedPercent: 0,\r\n          status: \"Error\",\r\n          badge: \"sfc46-bad\",\r\n          url: \"\",\r\n          blob: null\r\n        });\r\n      }\r\n\r\n      progressBar.style.width = Math.round(((i + 1) \/ selectedFiles.length) * 100) + \"%\";\r\n      renderOutput();\r\n    }\r\n\r\n    message.textContent = \"Creating ZIP package...\";\r\n\r\n    currentZipBlob = await zip.generateAsync({\r\n      type: \"blob\",\r\n      compression: \"DEFLATE\",\r\n      compressionOptions: { level: 9 }\r\n    });\r\n\r\n    currentZipUrl = URL.createObjectURL(currentZipBlob);\r\n\r\n    progress.style.display = \"none\";\r\n    progressBar.style.width = \"0%\";\r\n    processBtn.disabled = false;\r\n    downloadBtn.disabled = false;\r\n    downloadTopBtn.disabled = false;\r\n\r\n    const before = selectedFiles.reduce(function (sum, file) {\r\n      return sum + file.size;\r\n    }, 0);\r\n\r\n    const zipSaved = before ? Math.round((1 - currentZipBlob.size \/ before) * 100) : 0;\r\n\r\n    message.textContent = \"Done. ZIP size: \" + formatBytes(currentZipBlob.size) + \" | ZIP saved vs original total: \" + zipSaved + \"%\";\r\n  }\r\n\r\n  async function compressImage(file) {\r\n    const img = await loadImage(file);\r\n    const canvas = document.createElement(\"canvas\");\r\n    const ctx = canvas.getContext(\"2d\", { alpha: true });\r\n\r\n    let width = img.naturalWidth || img.width;\r\n    let height = img.naturalHeight || img.height;\r\n\r\n    if (!keepResolutionEl.checked) {\r\n      const maxW = Number(maxWidthEl.value) || 1600;\r\n\r\n      if (width > maxW) {\r\n        const ratio = maxW \/ width;\r\n        width = Math.round(width * ratio);\r\n        height = Math.round(height * ratio);\r\n      }\r\n    }\r\n\r\n    canvas.width = width;\r\n    canvas.height = height;\r\n    ctx.drawImage(img, 0, 0, width, height);\r\n\r\n    const outputType = formatEl.value;\r\n    const targetBytes = Math.max(20, Number(targetKbEl.value) || 113) * 1024;\r\n    const startQ = clamp(Number(qualityEl.value) \/ 100, .05, .95);\r\n    const minQ = clamp(Number(minQualityEl.value) \/ 100, .05, startQ);\r\n\r\n    let blob;\r\n    let originalKept = false;\r\n\r\n    if (outputType === \"image\/png\") {\r\n      blob = await canvasToBlob(canvas, outputType);\r\n    } else {\r\n      blob = await canvasToBlob(canvas, outputType, startQ);\r\n\r\n      if (blob.size > targetBytes) {\r\n        let low = minQ;\r\n        let high = startQ;\r\n        let bestBlob = null;\r\n\r\n        for (let step = 0; step < 9; step++) {\r\n          const mid = (low + high) \/ 2;\r\n          const testBlob = await canvasToBlob(canvas, outputType, mid);\r\n\r\n          if (testBlob.size <= targetBytes) {\r\n            bestBlob = testBlob;\r\n            low = mid;\r\n          } else {\r\n            high = mid;\r\n          }\r\n        }\r\n\r\n        blob = bestBlob || await canvasToBlob(canvas, outputType, minQ);\r\n      }\r\n    }\r\n\r\n    if (skipBiggerEl.checked && keepResolutionEl.checked && blob.size >= file.size) {\r\n      blob = file;\r\n      originalKept = true;\r\n    }\r\n\r\n    const ext = originalKept ? getOriginalExt(file.name).replace(\".\", \"\") : getExt(outputType);\r\n    const cleanName = slugify(file.name.replace(\/\\.[^.]+$\/, \"\"));\r\n    const outputName = originalKept ? cleanName + \"-original-kept.\" + ext : cleanName + \"-compressed.\" + ext;\r\n    const url = URL.createObjectURL(blob);\r\n    const savedPercent = Math.round((1 - blob.size \/ file.size) * 100);\r\n\r\n    let status = \"Optimized\";\r\n    let badge = \"sfc46-good\";\r\n\r\n    if (originalKept) {\r\n      status = \"Original kept\";\r\n      badge = \"sfc46-warn\";\r\n    } else if (savedPercent < 0) {\r\n      status = \"Bigger\";\r\n      badge = \"sfc46-bad\";\r\n    } else if (savedPercent < 20) {\r\n      status = \"Small saving\";\r\n      badge = \"sfc46-warn\";\r\n    }\r\n\r\n    return {\r\n      name: file.name,\r\n      outputName: outputName,\r\n      type: \"Image\",\r\n      action: \"Image optimized\",\r\n      originalSize: file.size,\r\n      outputSize: blob.size,\r\n      savedPercent: savedPercent,\r\n      status: status,\r\n      badge: badge,\r\n      url: url,\r\n      blob: blob\r\n    };\r\n  }\r\n\r\n  async function zipOnlyItem(file) {\r\n    const kind = getFileKind(file);\r\n    let action = \"Added to ZIP\";\r\n\r\n    if ([\"PDF\", \"Word\", \"Excel\", \"PowerPoint\", \"ZIP\/RAR\"].includes(kind)) {\r\n      action = \"ZIP package only\";\r\n    }\r\n\r\n    return {\r\n      name: file.name,\r\n      outputName: safeZipName(file.name),\r\n      type: kind,\r\n      action: action,\r\n      originalSize: file.size,\r\n      outputSize: file.size,\r\n      savedPercent: 0,\r\n      status: \"Ready for ZIP\",\r\n      badge: \"sfc46-info\",\r\n      url: \"\",\r\n      blob: null\r\n    };\r\n  }\r\n\r\n  function renderOutput() {\r\n    if (!outputItems.length) {\r\n      resultBody.innerHTML = '<tr><td colspan=\"8\" class=\"sfc46-empty\">No processed files yet.<\/td><\/tr>';\r\n      return;\r\n    }\r\n\r\n    resultBody.innerHTML = outputItems.map(function (item) {\r\n      return `\r\n        <tr>\r\n          <td><div class=\"sfc46-file-name\" title=\"${escapeHtml(item.name)}\">${escapeHtml(item.name)}<\/div><\/td>\r\n          <td>${escapeHtml(item.type)}<\/td>\r\n          <td>${escapeHtml(item.action)}<\/td>\r\n          <td>${formatBytes(item.originalSize)}<\/td>\r\n          <td>${formatBytes(item.outputSize)}<\/td>\r\n          <td>${item.savedPercent}%<\/td>\r\n          <td><span class=\"sfc46-badge ${item.badge}\">${escapeHtml(item.status)}<\/span><\/td>\r\n          <td>${item.url ? `<a class=\"sfc46-download\" href=\"${item.url}\" download=\"${escapeHtml(item.outputName)}\">Download<\/a>` : \"ZIP only\"}<\/td>\r\n        <\/tr>\r\n      `;\r\n    }).join(\"\");\r\n\r\n    const before = selectedFiles.reduce(function (sum, file) {\r\n      return sum + file.size;\r\n    }, 0);\r\n\r\n    const after = outputItems.reduce(function (sum, item) {\r\n      return sum + item.outputSize;\r\n    }, 0);\r\n\r\n    const saved = before ? Math.round((1 - after \/ before) * 100) : 0;\r\n\r\n    sumFiles.textContent = outputItems.length;\r\n    sumBefore.textContent = formatBytes(before);\r\n    sumAfter.textContent = formatBytes(after);\r\n    sumSaved.textContent = saved + \"%\";\r\n  }\r\n\r\n  function downloadZip() {\r\n    if (!currentZipUrl) return;\r\n\r\n    const a = document.createElement(\"a\");\r\n    a.href = currentZipUrl;\r\n    a.download = slugify(zipNameEl.value || \"compressed-files\") + \".zip\";\r\n    document.body.appendChild(a);\r\n    a.click();\r\n    a.remove();\r\n  }\r\n\r\n  function clearAll() {\r\n    selectedFiles = [];\r\n\r\n    outputItems.forEach(function (item) {\r\n      if (item.url) URL.revokeObjectURL(item.url);\r\n    });\r\n\r\n    outputItems = [];\r\n    clearZipUrl();\r\n\r\n    fileInput.value = \"\";\r\n    processBtn.disabled = true;\r\n    downloadBtn.disabled = true;\r\n    downloadTopBtn.disabled = true;\r\n    message.textContent = \"No files selected yet.\";\r\n\r\n    sumFiles.textContent = \"0\";\r\n    sumBefore.textContent = \"0 KB\";\r\n    sumAfter.textContent = \"0 KB\";\r\n    sumSaved.textContent = \"0%\";\r\n\r\n    resultBody.innerHTML = '<tr><td colspan=\"8\" class=\"sfc46-empty\">No processed files yet.<\/td><\/tr>';\r\n  }\r\n\r\n  function clearZipUrl() {\r\n    if (currentZipUrl) URL.revokeObjectURL(currentZipUrl);\r\n    currentZipUrl = null;\r\n    currentZipBlob = null;\r\n  }\r\n\r\n  function loadImage(file) {\r\n    return new Promise(function (resolve, reject) {\r\n      const url = URL.createObjectURL(file);\r\n      const img = new Image();\r\n\r\n      img.onload = function () {\r\n        URL.revokeObjectURL(url);\r\n        resolve(img);\r\n      };\r\n\r\n      img.onerror = function () {\r\n        URL.revokeObjectURL(url);\r\n        reject(new Error(\"Cannot read image.\"));\r\n      };\r\n\r\n      img.src = url;\r\n    });\r\n  }\r\n\r\n  function canvasToBlob(canvas, type, quality) {\r\n    return new Promise(function (resolve, reject) {\r\n      canvas.toBlob(function (blob) {\r\n        if (blob) resolve(blob);\r\n        else reject(new Error(\"Browser cannot export this image.\"));\r\n      }, type, quality);\r\n    });\r\n  }\r\n\r\n  function isImage(file) {\r\n    return \/^image\\\/(jpeg|png|webp)$\/.test(file.type);\r\n  }\r\n\r\n  function getFileKind(file) {\r\n    const name = file.name.toLowerCase();\r\n\r\n    if (isImage(file)) return \"Image\";\r\n    if (name.endsWith(\".pdf\")) return \"PDF\";\r\n    if (name.endsWith(\".doc\") || name.endsWith(\".docx\")) return \"Word\";\r\n    if (name.endsWith(\".xls\") || name.endsWith(\".xlsx\")) return \"Excel\";\r\n    if (name.endsWith(\".ppt\") || name.endsWith(\".pptx\")) return \"PowerPoint\";\r\n    if (name.endsWith(\".csv\")) return \"CSV\";\r\n    if (name.endsWith(\".txt\")) return \"TXT\";\r\n    if (name.endsWith(\".zip\") || name.endsWith(\".rar\") || name.endsWith(\".7z\")) return \"ZIP\/RAR\";\r\n\r\n    return \"File\";\r\n  }\r\n\r\n  function safeZipName(name) {\r\n    const parts = String(name || \"file\").split(\".\");\r\n    const ext = parts.length > 1 ? \".\" + parts.pop().toLowerCase().replace(\/[^a-z0-9]\/g, \"\") : \"\";\r\n    const stem = slugify(parts.join(\".\") || \"file\");\r\n    return stem + ext;\r\n  }\r\n\r\n  function formatBytes(bytes) {\r\n    if (!bytes) return \"0 KB\";\r\n\r\n    const kb = bytes \/ 1024;\r\n\r\n    if (kb < 1024) {\r\n      return kb < 100 ? kb.toFixed(1) + \" KB\" : Math.round(kb) + \" KB\";\r\n    }\r\n\r\n    return (kb \/ 1024).toFixed(2) + \" MB\";\r\n  }\r\n\r\n  function getExt(type) {\r\n    if (type === \"image\/jpeg\") return \"jpg\";\r\n    if (type === \"image\/png\") return \"png\";\r\n    return \"webp\";\r\n  }\r\n\r\n  function getOriginalExt(name) {\r\n    const match = name.match(\/(\\.[a-z0-9]+)$\/i);\r\n    return match ? match[1].toLowerCase() : \".jpg\";\r\n  }\r\n\r\n  function slugify(text) {\r\n    return String(text || \"file\")\r\n      .toLowerCase()\r\n      .replace(\/[^a-z0-9]+\/g, \"-\")\r\n      .replace(\/^-+|-+$\/g, \"\") || \"file\";\r\n  }\r\n\r\n  function escapeHtml(value) {\r\n    return String(value).replace(\/[&<>'\"]\/g, function (char) {\r\n      return {\r\n        \"&\": \"&amp;\",\r\n        \"<\": \"&lt;\",\r\n        \">\": \"&gt;\",\r\n        \"'\": \"&#039;\",\r\n        '\"': \"&quot;\"\r\n      }[char];\r\n    });\r\n  }\r\n\r\n  function clamp(value, min, max) {\r\n    return Math.max(min, Math.min(max, value));\r\n  }\r\n\r\n  applyPreset(\"speed\");\r\n})();\r\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\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Free Image Compressor &#8211; Reduce Image File Size Online Use this free image compressor to reduce image file size before uploading photos to your website, blog or WordPress page. You can compress JPG, PNG and WebP images online and download a smaller file in seconds. This tool helps make images smaller while keeping good visual [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"cybocfi_hide_featured_image":"","footnotes":""},"class_list":["post-13467","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages\/13467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/comments?post=13467"}],"version-history":[{"count":13,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages\/13467\/revisions"}],"predecessor-version":[{"id":13496,"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/pages\/13467\/revisions\/13496"}],"wp:attachment":[{"href":"https:\/\/stooper.co\/ms\/wp-json\/wp\/v2\/media?parent=13467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}