     (declare-result "UP01"
                     (empty? matches)
                     (if (empty? matches) "The technology does not extend the Explorer UI." message))))
+
+(defn- up03-repo-min-max
+  [source content-index]
+  (let [repo-mins (distinct (map #(second (first (:re-seq %))) (filter #(= :up03-min (:regex-id %)) content-index)))
+        repo-maxs (distinct (map #(second (first (:re-seq %))) (filter #(= :up03-max (:regex-id %)) content-index)))]
+    (declare-result "UP03"
+                    (or (not (empty? repo-mins)) (not (empty? repo-maxs)))
+                    (s/join "\n"
+                      (filter identity
+                              (vector
+                                (if (not-empty repo-mins)                       (str "module.repo.version.min(s): " (s/join "," repo-mins)))
+                                (if (not-empty repo-maxs)                       (str "module.repo.version.max(s): " (s/join "," repo-maxs)))
+                                (if (and (empty? repo-mins) (empty? repo-maxs)) "The technology does not specify module.editions in its module.properties file(s).")))))))
+
+(defn- up04-module-editions
+  [source content-index]
+  (let [matches  (distinct (map #(second (first (:re-seq %))) (filter #(= :up04 (:regex-id %)) content-index)))
+        editions (s/join "," matches)]
+    (declare-result "UP04"
+                    (not (empty? matches))
+                    (if (empty? matches)
+                      "The technology does not specify module.editions in its module.properties file(s)."
+                      (str "module.editions:" editions)))))
 
 (defn validate
   "Runs all source-based validations."

                       "PERF02"
                       "Indexed content model properties"
                       true
                       "The technology does not index any content model properties."))

(defn- perf03-dont-store-property-values
  [source content-index]

                         "STB08"
                         "Uses of synchronized"
                         true
                         "The technology does not synchronize.")
    (standard-validation source
                         content-index
                         :stb08-stb09
                         "STB09"
                         "Uses of synchronized"
                         true
                         "The technology does not synchronize.")))

(defn- stb19-stb20-web-script-transaction-setting
  [source content-index]
