diff --git a/ia04/comsoc/tieBreak.go b/ia04/comsoc/tieBreak.go
index 49b6b61abe3a392ecf2c22f6d860b10d7d1a1529..6933c04cbd74f6f650893c1d857316cc07ec9ade 100644
--- a/ia04/comsoc/tieBreak.go
+++ b/ia04/comsoc/tieBreak.go
@@ -22,19 +22,56 @@ func TieBreakFactory(tieBreakAlts []Alternative) func([]Alternative) (Alternativ
 	}
 }
 
-//func SWFFactory(swf1 func (Profile) (Count, error), tieBreak func ([]Alternative) (Alternative, error)) (swf2 func(Profile) (alts []Alternative, err error)) {
-//  return func(p Profile) (alts Alternative, err error) {
-//    alts, _ := maxCount(swf1(p))
-//    alt, _ := tieBreak(alts)
-//    return alt, nil
-//    il faut trifouiller le count
-//  }
-//}
+func SWFFactory(swf1 func (Profile) (Count, error), tieBreak func ([]Alternative) (Alternative, error)) (swf2 func(Profile) (alts []Alternative, err error)) {
+ return func(p Profile) (alts []Alternative, err error) {
+
+   count, _ := swf1(p)
+	// winner := -1
+	 for count != nil {			// on cherche les maxcount
+			bestAlts := maxCount(count)
+
+			for len(bestAlts) > 1 {		// tant qu'on a pas départagé les exaequos
+				winner,_ := tieBreak(bestAlts)
+				for i, alt := range bestAlts {		// départage de tous les exaequos
+					if alt == winner {
+						delete(count, winner)
+						alts = append(alts, winner)
+						bestAlts = append(bestAlts[:i], bestAlts[i+1:]...)
+						break
+					}
+				}
+			}
+			alts = append(alts, bestAlts[0])
+			delete(count,bestAlts[0])
+
+			// au cas où, une autre ébauche
+			// 						# on prend la ou les BestAlts du count
+			// for i,bestAlt := range(bestAlts) {		#
+			// 	winner, _ := tieBreak(bestAlts)
+			// 	for j,bestAltToDelete := range(bestAlts)
+			// 	if besAltToDelete == winner {
+			// 		keys[i] = -1			# on exclue le winner de la slice pour le prochain tie break
+			// 		alts = append(alts, winner)
+			// 		break
+			// 	}
+			// }
+	 }
+
+	 return alts, nil
+  }
+}
 
 func SCFFactory(scf1 func(Profile) ([]Alternative, error), tieBreak func([]Alternative) (Alternative, error)) (scf2 func(Profile) (alt Alternative, err error)) {
 	return func(p Profile) (Alternative, error) {
-		alts, _ := scf1(p)
-		alt, _ := tieBreak(alts)
+		alts, errSCF1 := scf1(p)
+		if errSCF1 != nil {
+			return -1, errSCF1
+		}
+		alt, errTB := tieBreak(alts)
+		if errTB != nil {
+			return -1, errTB
+		}
+
 		return alt, nil
 	}
 }