Example #1
0
        public override bool Equals(object other)
        {
            if (object.ReferenceEquals(this, other))
            {
                return(true);
            }
            if (!(other is KlubUcesnik))
            {
                return(false);
            }

            KlubUcesnik that   = (KlubUcesnik)other;
            bool        result = this.Naziv.ToUpper() == that.Naziv.ToUpper() &&
                                 this.Kod.ToUpper() == that.Kod.ToUpper();

            return(result);
        }
        private IList<GimnasticarUcesnik> findGimnasticariUcesnici(string ime,
            string prezime, Nullable<int> godRodj, Nullable<Gimnastika> gimnastika,
            DrzavaUcesnik drzava, TakmicarskaKategorija kategorija, KlubUcesnik klub,
            int takmicenjeId)
        {
            Query q = new Query();
            if (!String.IsNullOrEmpty(ime))
                q.Criteria.Add(new Criterion("Ime", CriteriaOperator.Like, ime, StringMatchMode.Start, true));
            if (!String.IsNullOrEmpty(prezime))
                q.Criteria.Add(new Criterion("Prezime", CriteriaOperator.Like, prezime, StringMatchMode.Start, true));
            if (godRodj != null)
            {
                q.Criteria.Add(new Criterion("DatumRodjenja.Godina",
                    CriteriaOperator.Equal, (short)godRodj.Value));
            }
            if (gimnastika != null)
                q.Criteria.Add(new Criterion("Gimnastika", CriteriaOperator.Equal, (byte)gimnastika.Value));
            if (drzava != null)
                q.Criteria.Add(new Criterion("DrzavaUcesnik", CriteriaOperator.Equal, drzava));
            if (kategorija != null)
                q.Criteria.Add(new Criterion("TakmicarskaKategorija", CriteriaOperator.Equal, kategorija));
            if (klub != null)
                q.Criteria.Add(new Criterion("KlubUcesnik", CriteriaOperator.Equal, klub));
            q.Criteria.Add(new Criterion("Takmicenje.Id", CriteriaOperator.Equal, takmicenjeId));

            q.Operator = QueryOperator.And;
            q.OrderClauses.Add(new OrderClause("Prezime", OrderClause.OrderClauseCriteria.Ascending));
            q.OrderClauses.Add(new OrderClause("Ime", OrderClause.OrderClauseCriteria.Ascending));
            foreach (AssociationFetch f in this.FetchModes)
            {
                q.FetchModes.Add(f);
            }
            return dataContext.GetByCriteria<GimnasticarUcesnik>(q);
        }
Example #3
0
        private bool kreirajZbirViseKola(Takmicenje takmicenje)
        {
            dataContext.Attach(takmicenje, false);
            List<List<TakmicarskaKategorija>> listaKategorija = new List<List<TakmicarskaKategorija>>();
            if (takmicenje.PrvoKolo != null)
            {
                dataContext.Attach(takmicenje.PrvoKolo, false);
                listaKategorija.Add(new List<TakmicarskaKategorija>(takmicenje.PrvoKolo.Kategorije));
            }
            if (takmicenje.DrugoKolo != null)
            {
                dataContext.Attach(takmicenje.DrugoKolo, false);
                listaKategorija.Add(new List<TakmicarskaKategorija>(takmicenje.DrugoKolo.Kategorije));
            }
            if (takmicenje.TreceKolo != null)
            {
                dataContext.Attach(takmicenje.TreceKolo, false);
                listaKategorija.Add(new List<TakmicarskaKategorija>(takmicenje.TreceKolo.Kategorije));
            }
            if (takmicenje.CetvrtoKolo != null)
            {
                dataContext.Attach(takmicenje.CetvrtoKolo, false);
                listaKategorija.Add(new List<TakmicarskaKategorija>(takmicenje.CetvrtoKolo.Kategorije));
            }

            PropertyDescriptor propDesc =
                TypeDescriptor.GetProperties(typeof(TakmicarskaKategorija))["RedBroj"];
            for (int i = 0; i < listaKategorija.Count; ++i)
            {
                listaKategorija[i].Sort(new SortComparer<TakmicarskaKategorija>(
                    propDesc, ListSortDirection.Ascending));
            }

            for (int i = 0; i < listaKategorija[0].Count; ++i)
            {
                TakmicarskaKategorija kat1 = listaKategorija[0][i];
                for (int j = 0; j < listaKategorija.Count; ++j)
                {
                    TakmicarskaKategorija kat2 = listaKategorija[j][i];
                    if (!kat1.Equals(kat2))
                    {
                        // TODO3: Ovde bi ustvari trebalo proveravati da li se rezultatska takmicenja iz
                        // prethodna cetiri kola poklapaju, i ako se ne poklapaju da se otvori prozor
                        // gde ce korisnik moci da upari odgovarajuca rezultatska takmicenja (i da izabere
                        // koja rez. takmicenja zeli da ukljuci u novo takmicenje). Slicno i za finale kupa.
                        MessageBox.Show("Kategorije iz prethodnih kola se ne poklapaju", "Bilten");
                        return false;
                    }
                }
            }
            foreach (TakmicarskaKategorija k in listaKategorija[0])
            {
                takmicenje.addKategorija(new TakmicarskaKategorija(k.Naziv, takmicenje.Gimnastika));
            }

            // prvi description je uvek kao naziv takmicenja.
            RezultatskoTakmicenjeDescription desc = new RezultatskoTakmicenjeDescription();
            desc.Naziv = takmicenje.Naziv;
            desc.Propozicije = new Propozicije();
            takmicenje.addTakmicenjeDescription(desc);

            IList<RezultatskoTakmicenje> rezTakmicenja = new List<RezultatskoTakmicenje>();
            foreach (RezultatskoTakmicenjeDescription d in takmicenje.TakmicenjeDescriptions)
            {
                foreach (TakmicarskaKategorija k in takmicenje.Kategorije)
                {
                    RezultatskoTakmicenje rt = new RezultatskoTakmicenje(takmicenje,
                        k, d, new Propozicije());
                    rt.Propozicije.PostojiTak2 = true;  // hack
                    rt.Propozicije.PostojiTak4 = true;  // hack
                    rt.ImaEkipnoTakmicenje = true;  // hack
                    rt.KombinovanoEkipnoTak = false;  // hack
                    rezTakmicenja.Add(rt);
                }
            }

            IDictionary<GimnasticarUcesnik, GimnasticarUcesnik> gimnasticariMap =
                new Dictionary<GimnasticarUcesnik, GimnasticarUcesnik>();
            List<Takmicenje> prethodnaKola = new List<Takmicenje>();
            if (takmicenje.PrvoKolo != null)
                prethodnaKola.Add(takmicenje.PrvoKolo);
            if (takmicenje.DrugoKolo != null)
                prethodnaKola.Add(takmicenje.DrugoKolo);
            if (takmicenje.TreceKolo != null)
                prethodnaKola.Add(takmicenje.TreceKolo);
            if (takmicenje.CetvrtoKolo != null)
                prethodnaKola.Add(takmicenje.CetvrtoKolo);
            foreach (TakmicarskaKategorija kat in takmicenje.Kategorije)
            {
                foreach (Takmicenje prethKolo in prethodnaKola)
                {
                    foreach (GimnasticarUcesnik g in loadGimnasticari(prethKolo, kat.Naziv))
                    {
                        if (!gimnasticariMap.ContainsKey(g))
                        {
                            GimnasticarUcesnik g2 = createGimnasticarUcesnik(g, kat);
                            gimnasticariMap.Add(g2, g2);
                        }
                    }
                }
            }

            List<List<RezultatskoTakmicenje>> rezTakmicenjaPrethodnaKola = new List<List<RezultatskoTakmicenje>>();
            foreach (Takmicenje prethKolo in prethodnaKola)
            {
                rezTakmicenjaPrethodnaKola.Add(new List<RezultatskoTakmicenje>(loadRezTakmicenja(prethKolo.Id)));
            }

            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                foreach (List<RezultatskoTakmicenje> rezTakmicenjaPrethKolo in rezTakmicenjaPrethodnaKola)
                {
                    RezultatskoTakmicenje rtFrom = findRezTakmicenje(rezTakmicenjaPrethKolo,
                        rt.TakmicenjeDescription.Naziv, rt.Kategorija);
                    foreach (GimnasticarUcesnik g in rtFrom.Takmicenje1.Gimnasticari)
                    {
                        GimnasticarUcesnik g2 = gimnasticariMap[g];
                        rt.Takmicenje1.addGimnasticar(g2);
                    }
                }
            }

            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                foreach (List<RezultatskoTakmicenje> rezTakmicenjaPrethKolo in rezTakmicenjaPrethodnaKola)
                {
                    RezultatskoTakmicenje rtFrom = findRezTakmicenje(rezTakmicenjaPrethKolo,
                        rt.TakmicenjeDescription.Naziv, rt.Kategorija);
                    foreach (Ekipa e in rtFrom.Takmicenje1.Ekipe)
                    {
                        if (rt.Takmicenje1.Ekipe.Contains(e))
                            continue;

                        Ekipa ekipa = new Ekipa();
                        ekipa.Naziv = e.Naziv;
                        ekipa.Kod = e.Kod;
                        if (e.DrzavaUcesnik == null)
                            ekipa.DrzavaUcesnik = null;
                        else
                        {
                            DrzavaUcesnik drzavaUcesnik = findDrzavaUcesnik(takmicenje, e.DrzavaUcesnik.Naziv);
                            if (drzavaUcesnik == null)
                            {
                                drzavaUcesnik = new DrzavaUcesnik();
                                drzavaUcesnik.Naziv = e.DrzavaUcesnik.Naziv;
                                drzavaUcesnik.Kod = e.DrzavaUcesnik.Kod;
                                drzavaUcesnik.Takmicenje = takmicenje;
                                dataContext.Add(drzavaUcesnik);
                            }
                            ekipa.DrzavaUcesnik = drzavaUcesnik;
                        }
                        if (e.KlubUcesnik == null)
                            ekipa.KlubUcesnik = null;
                        else
                        {
                            KlubUcesnik klubUcesnik = findKlubUcesnik(takmicenje, e.KlubUcesnik.Naziv);
                            if (klubUcesnik == null)
                            {
                                klubUcesnik = new KlubUcesnik();
                                klubUcesnik.Naziv = e.KlubUcesnik.Naziv;
                                klubUcesnik.Kod = e.KlubUcesnik.Kod;
                                klubUcesnik.Takmicenje = takmicenje;
                                dataContext.Add(klubUcesnik);
                            }
                            ekipa.KlubUcesnik = klubUcesnik;
                        }

                        rt.Takmicenje1.addEkipa(ekipa);
                    }
                }
            }

            dataContext.Add(takmicenje);
            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                dataContext.Add(rt);
                foreach (Ekipa e in rt.Takmicenje1.Ekipe)
                    dataContext.Add(e);
            }
            foreach (GimnasticarUcesnik g in gimnasticariMap.Values)
            {
                dataContext.Add(g);
            }

            return true;
        }
 private GimnasticarUcesnik createGimnasticarUcesnik(GimnasticarUcesnik g,
     TakmicarskaKategorija kategorija)
 {
     GimnasticarUcesnik result = new GimnasticarUcesnik();
     result.Ime = g.Ime;
     result.SrednjeIme = g.SrednjeIme;
     result.Prezime = g.Prezime;
     result.Gimnastika = g.Gimnastika;
     result.DatumRodjenja = g.DatumRodjenja;
     result.RegistarskiBroj = g.RegistarskiBroj;
     result.TakmicarskaKategorija = kategorija;
     result.Takmicenje = kategorija.Takmicenje;
     if (g.DrzavaUcesnik == null)
         result.DrzavaUcesnik = null;
     else
     {
         DrzavaUcesnik drzavaUcesnik = findDrzavaUcesnik(kategorija.Takmicenje.Id,
             g.DrzavaUcesnik.Naziv);
         if (drzavaUcesnik == null)
         {
             drzavaUcesnik = new DrzavaUcesnik();
             drzavaUcesnik.Naziv = g.DrzavaUcesnik.Naziv;
             drzavaUcesnik.Kod = g.DrzavaUcesnik.Kod;
             drzavaUcesnik.Takmicenje = kategorija.Takmicenje;
             dataContext.Add(drzavaUcesnik);
         }
         result.DrzavaUcesnik = drzavaUcesnik;
     }
     if (g.KlubUcesnik == null)
         result.KlubUcesnik = null;
     else
     {
         KlubUcesnik klubUcesnik = findKlubUcesnik(kategorija.Takmicenje.Id,
             g.KlubUcesnik.Naziv);
         if (klubUcesnik == null)
         {
             klubUcesnik = new KlubUcesnik();
             klubUcesnik.Naziv = g.KlubUcesnik.Naziv;
             klubUcesnik.Kod = g.KlubUcesnik.Kod;
             klubUcesnik.Takmicenje = kategorija.Takmicenje;
             dataContext.Add(klubUcesnik);
         }
         result.KlubUcesnik = klubUcesnik;
     }
     return result;
 }
Example #5
0
        void cloneTakmicenje(Takmicenje takmicenje, Takmicenje from, List<RezultatskoTakmicenjeDescription> descriptionsFrom,
            List<TakmicarskaKategorija> kategorijeFrom)
        {
            dataContext.Attach(takmicenje, false);
            dataContext.Attach(from, false);
            foreach (RezultatskoTakmicenjeDescription d in descriptionsFrom)
            {
                dataContext.Attach(d, false);
            }

            // TODO3: Ovaj metod bi trebalo updateovati svaki put kada se promene neka svojstva koja se kloniraju.

            takmicenje.BrojEOcena = from.BrojEOcena;
            takmicenje.BrojDecimalaD = from.BrojDecimalaD;
            takmicenje.BrojDecimalaE1 = from.BrojDecimalaE1;
            takmicenje.BrojDecimalaE = from.BrojDecimalaE;
            takmicenje.BrojDecimalaPen = from.BrojDecimalaPen;
            takmicenje.BrojDecimalaTotal = from.BrojDecimalaTotal;
            takmicenje.ZavrsenoTak1 = false;

            // TODO: Kreiraj metod u klasi TakmicarskaKategorija koji vraca kategorije sortirane po rednom broju.
            // Pronadji sva mesta na kojima sortiram kategorije po rednom broju, i zameni ih pozivom novog metoda.
            // Uradi isto i za klasu RezultatskoTakmicenjeDescription, a i za druge ako postoje.
            PropertyDescriptor propDesc =
                TypeDescriptor.GetProperties(typeof(TakmicarskaKategorija))["RedBroj"];
            kategorijeFrom.Sort(new SortComparer<TakmicarskaKategorija>(
                propDesc, ListSortDirection.Ascending));
            foreach (TakmicarskaKategorija k in kategorijeFrom)
            {
                takmicenje.addKategorija(new TakmicarskaKategorija(k.Naziv, takmicenje.Gimnastika));
            }

            PropertyDescriptor propDesc2 =
                TypeDescriptor.GetProperties(typeof(RezultatskoTakmicenjeDescription))["RedBroj"];
            descriptionsFrom.Sort(new SortComparer<RezultatskoTakmicenjeDescription>(
                propDesc2, ListSortDirection.Ascending));

            // prvi description je uvek kao naziv takmicenja.
            RezultatskoTakmicenjeDescription desc = new RezultatskoTakmicenjeDescription();
            desc.Naziv = takmicenje.Naziv;
            desc.Propozicije = new Propozicije();
            takmicenje.addTakmicenjeDescription(desc);
            for (int i = 1; i < descriptionsFrom.Count; i++)
            {
                desc = new RezultatskoTakmicenjeDescription();
                desc.Naziv = descriptionsFrom[i].Naziv;
                desc.Propozicije = new Propozicije();
                takmicenje.addTakmicenjeDescription(desc);
            }

            IList<RezultatskoTakmicenje> rezTakmicenja = new List<RezultatskoTakmicenje>();
            foreach (RezultatskoTakmicenjeDescription d in takmicenje.TakmicenjeDescriptions)
            {
                foreach (TakmicarskaKategorija k in takmicenje.Kategorije)
                {
                    RezultatskoTakmicenje rt = new RezultatskoTakmicenje(takmicenje,
                        k, d, new Propozicije());
                    rezTakmicenja.Add(rt);
                }
            }

            List<RezultatskoTakmicenjeDescription> descriptions =
                new List<RezultatskoTakmicenjeDescription>(takmicenje.TakmicenjeDescriptions);
            propDesc = TypeDescriptor.GetProperties(typeof(RezultatskoTakmicenjeDescription))["RedBroj"];
            descriptions.Sort(new SortComparer<RezultatskoTakmicenjeDescription>(
                propDesc, ListSortDirection.Ascending));
            for (int i = 0; i < descriptions.Count; i++)
            {
                clonePropozicije(descriptions[i].Propozicije, descriptionsFrom[i].Propozicije);
            }

            IList<RezultatskoTakmicenje> rezTakmicenjaFrom = new List<RezultatskoTakmicenje>();
            foreach (RezultatskoTakmicenje rt in loadRezTakmicenja(from.Id))
            {
                // filtriraj rez. takmicenja.
                ISet<TakmicarskaKategorija> katFromSet = new HashSet<TakmicarskaKategorija>(kategorijeFrom);
                ISet<RezultatskoTakmicenjeDescription> descFromSet
                    = new HashSet<RezultatskoTakmicenjeDescription>(descriptionsFrom);
                if (katFromSet.Contains(rt.Kategorija) && descFromSet.Contains(rt.TakmicenjeDescription))
                {
                    rezTakmicenjaFrom.Add(rt);
                }

            }
            foreach (RezultatskoTakmicenje rezTak in rezTakmicenja)
            {
                RezultatskoTakmicenje rezTak2 = findRezTakmicenje(rezTakmicenjaFrom, rezTak.TakmicenjeDescription.Naziv,
                    rezTak.Kategorija);
                clonePropozicije(rezTak.Propozicije, rezTak2.Propozicije);
            }

            bool kombAdded = false;
            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                if (!rt.TakmicenjeDescription.Propozicije.JednoTak4ZaSveKategorije)
                {
                    rt.ImaEkipnoTakmicenje = true;
                    rt.KombinovanoEkipnoTak = false;
                }
                else
                {
                    if (!kombAdded)
                    {
                        rt.ImaEkipnoTakmicenje = true;
                        rt.KombinovanoEkipnoTak = true;
                        kombAdded = true;
                    }
                    else
                    {
                        rt.ImaEkipnoTakmicenje = false;
                        rt.KombinovanoEkipnoTak = false;
                    }
                }
            }
            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                bool deletedTak2, deletedTak3, deletedTak4;

                rt.updateTakmicenjaFromChangedPropozicije(
                    out deletedTak2, out deletedTak3, out deletedTak4);

                /*if (deletedTak2)
                    dataContext.Delete(rt.Takmicenje2);
                if (deletedTak3)
                    dataContext.Delete(rt.Takmicenje3);
                if (deletedTak4)
                    dataContext.Delete(rt.Takmicenje4);*/
            }

            IDictionary<GimnasticarUcesnik, GimnasticarUcesnik> gimnasticariMap =
                new Dictionary<GimnasticarUcesnik, GimnasticarUcesnik>();
            List<GimnasticarUcesnik> dupliGimnasticari = new List<GimnasticarUcesnik>();
            foreach (TakmicarskaKategorija kat in takmicenje.Kategorije)
            {
                foreach (GimnasticarUcesnik g in loadGimnasticari(from, kat.Naziv))
                {
                    if (!gimnasticariMap.ContainsKey(g))
                    {
                        // Ovo proveravam zato sto se vec desilo da isti gimnasticar bude prijavljen u dve razlicite
                        // kategorije (program to ne proverava). Npr. na takmicenju I KOLO PGL SRBIJE MSG od 21.05.2011.
                        // Sinisa Jurkovic je bio prijavljen u dve kategorije. U novoj verziji programa nije moguce da
                        // isti gimnsticar bude prijavljen u dve razlicite kategorije.

                        GimnasticarUcesnik g2 = createGimnasticarUcesnik(g, kat);
                        gimnasticariMap.Add(g2, g2);
                    }
                    else
                        dupliGimnasticari.Add(g);
                }
            }
            // Proveravanje gimnasticara koji su prijavljeni u vise kategorija je samo za legacy baze. Program je vec
            // promenjen da ne dozvoljava da isti gimnasticar bude prijavljen u vise kategorija.
            foreach (GimnasticarUcesnik g in dupliGimnasticari)
            {
                if (gimnasticariMap.ContainsKey(g))
                    gimnasticariMap.Remove(g);
            }

            // TODO2: Izgleda da prikazuje rezultate za sprave u takmicenju I cak i kada se u propozicijama selektuje da
            // ne postoji takmicenje III. U stvari tako i treba zato sto ipak treba da postoji pregled nastupa po spravama
            // cak i kada se selektuje da ne postoji takmicenje III. Tako da ovo treba da ostane.

            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                RezultatskoTakmicenje rtFrom = findRezTakmicenje(rezTakmicenjaFrom, rt.TakmicenjeDescription.Naziv,
                    rt.Kategorija);
                foreach (GimnasticarUcesnik g in rtFrom.Takmicenje1.Gimnasticari)
                {
                    if (gimnasticariMap.ContainsKey(g))
                    {
                        GimnasticarUcesnik g2 = gimnasticariMap[g];
                        rt.Takmicenje1.addGimnasticar(g2);
                        rt.Takmicenje1.gimnasticarAdded(g2, new List<Ocena>(), rt);

                    }
                }
            }

            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                RezultatskoTakmicenje rtFrom = findRezTakmicenje(rezTakmicenjaFrom, rt.TakmicenjeDescription.Naziv,
                    rt.Kategorija);
                foreach (Ekipa e in rtFrom.Takmicenje1.Ekipe)
                {
                    Ekipa ekipa = new Ekipa();
                    ekipa.Naziv = e.Naziv;
                    ekipa.Kod = e.Kod;
                    if (e.DrzavaUcesnik == null)
                        ekipa.DrzavaUcesnik = null;
                    else
                    {
                        DrzavaUcesnik drzavaUcesnik = findDrzavaUcesnik(takmicenje, e.DrzavaUcesnik.Naziv);
                        if (drzavaUcesnik == null)
                        {
                            drzavaUcesnik = new DrzavaUcesnik();
                            drzavaUcesnik.Naziv = e.DrzavaUcesnik.Naziv;
                            drzavaUcesnik.Kod = e.DrzavaUcesnik.Kod;
                            drzavaUcesnik.Takmicenje = takmicenje;
                            dataContext.Add(drzavaUcesnik);
                        }
                        ekipa.DrzavaUcesnik = drzavaUcesnik;
                    }
                    if (e.KlubUcesnik == null)
                        ekipa.KlubUcesnik = null;
                    else
                    {
                        KlubUcesnik klubUcesnik = findKlubUcesnik(takmicenje, e.KlubUcesnik.Naziv);
                        if (klubUcesnik == null)
                        {
                            klubUcesnik = new KlubUcesnik();
                            klubUcesnik.Naziv = e.KlubUcesnik.Naziv;
                            klubUcesnik.Kod = e.KlubUcesnik.Kod;
                            klubUcesnik.Takmicenje = takmicenje;
                            dataContext.Add(klubUcesnik);
                        }
                        ekipa.KlubUcesnik = klubUcesnik;
                    }

                    foreach (GimnasticarUcesnik g in e.Gimnasticari)
                    {
                        if (gimnasticariMap.ContainsKey(g))
                        {
                            GimnasticarUcesnik g2 = gimnasticariMap[g];
                            ekipa.addGimnasticar(g2);
                        }
                    }

                    rt.Takmicenje1.addEkipa(ekipa);
                }
            }

            dataContext.Add(takmicenje);
            foreach (RezultatskoTakmicenje rt in rezTakmicenja)
            {
                dataContext.Add(rt);
                foreach (Ekipa e in rt.Takmicenje1.Ekipe)
                    dataContext.Add(e);
            }
            foreach (GimnasticarUcesnik g in gimnasticariMap.Values)
            {
                dataContext.Add(g);
            }

            if (dupliGimnasticari.Count > 0)
            {
                string msg = "Sledeci gimnasticari nisu dodati zato sto su prijavljeni u vise " +
                    "kategorija.  Ove gimnasticare morate da unesete rucno: \n\n";
                msg += StringUtil.getListString(dupliGimnasticari.ToArray());
                MessageDialogs.showMessage(msg, this.Text);
            }
        }