         }
     }
     
-    func addFixedGapsInRange(nameFormat: String, row: Int, startIndex: Int, endIndex: Int, vertical: Bool, width: Double) {
+    func addGapsInRange(nameFormat: String, row: Int, startIndex: Int, endIndex: Int, vertical: Bool, width: Double?) {
         var allConstraints: Array<String> = []
         
         var firstGapName = String(format: nameFormat, startIndex, row)
-        allConstraints += "[\(firstGapName)(\(width))]"
+        
+        if width {
+            allConstraints += "[\(firstGapName)(\(width))]"
+        }
         
         for i in startIndex...endIndex {
             var gapName = String(format: nameFormat, i, row)

                        keyView.enabled = true
                        keyView.setTranslatesAutoresizingMaskIntoConstraints(false)
                        keyView.text = key.keyCap
                        
                        self.view.addSubview(keyView)
                        

            else {
                if !canonicalRowGap {
                    allConstraints += "V:[key\(0)x\(i-1)][\(rowGapName)]"
                    allConstraints += "V:[\(rowGapName)(>=5)]" // QQQ:
                    canonicalRowGap = rowGapName
                }
                else {
