Exemplo n.º 1
0
        public VaccinationSimulation(MonteCarloSettings monteCarloSettings, EventSimulationSettings eventSimulationSettings, VaccinationSettings vaccinationSettings)
            : base(monteCarloSettings, eventSimulationSettings)
        {
            VaccinSettings = vaccinationSettings;

            _afterEventObservables       = new SimulationObservable <AfterEventValues>();
            _afterReplicationObservables = new SimulationObservable <AfterReplicationValues>();
            _experimentObservables       = new SimulationObservable <DoctorsExperimentValues>();

            ExaminationGen  = new ExponentialGenerator(1d / 260);
            VaccinationGen  = new TriangularGenerator(20, 100, 75);
            RegistrationGen = new UniformGenerator(140, 220);

            WaitingGen  = new Random();
            PatientsGen = new Random();
            ArrivalGen  = new Random();

            if (VaccinSettings.DoctorsExperimentEnabled)
            {
                MCSettings.Replications = (VaccinSettings.DoctorsMax - VaccinSettings.DoctorsMin + 1) * VaccinSettings.ExperimentReplications;
                _currentDoctorsCount    = VaccinSettings.DoctorsMin;
            }

            Init();
        }
        [TestMethod] public void uniform_value_should_be_between_0_and_1()
        {
            UniformGenerator uniform = new UniformGenerator();
            double           value   = uniform.Generate();

            Assert.IsTrue(value >= 0 && value <= 1);
        }
        public void TestRandomNumbers()
        {
            UniformGenerator generator = new UniformGenerator(new Range(0.0001f, 0.011f), DateTime.Now.Millisecond);

            for (int i = 0; i < 100; i++)
            {
                Console.WriteLine(generator.Next() + " ");
            }
        }
Exemplo n.º 4
0
        public void AdditiveRecurrenceDouble()
        {
            IUniformSource source = new AdditiveRecurrence(1, 1, 5, 2);
            var            g      = new UniformGenerator(source);

            Assert.AreEqual(0.61803398874989468, g.Double());
            Assert.AreEqual(0.23606797749978958, g.Double());
            Assert.AreEqual(0.85410196624968449, g.Double());
        }
Exemplo n.º 5
0
        public static Bitmap AddNoiseToImage(Bitmap input)
        {
            // create random generator
            IRandomNumberGenerator generator = new UniformGenerator(new Range(-50, 50));
            // create filter
            AdditiveNoise filter = new AdditiveNoise(generator);

            // apply the filter
            return(filter.Apply(input));
        }
Exemplo n.º 6
0
        /// <summary>
        /// 增加噪点
        /// </summary>
        /// <param name="bmp">原位图</param>
        public static void AddictiveNoise(Bitmap bmp)
        {
            // create random generator
            IRandomNumberGenerator generator = new UniformGenerator(new Range(-50, 50));
            // create filter
            AdditiveNoise filter = new AdditiveNoise(generator);

            // apply the filter
            filter.ApplyInPlace(bmp);
        }
Exemplo n.º 7
0
 public Simulator(GeneratorType generatorType)
 {
     this.GeneratorType                = generatorType;
     UniformGeneratorLoad              = new UniformGenerator();
     UniformGeneratorLoad.a            = 10;
     UniformGeneratorLoad.b            = 12;
     ExponentialGeneratorTravel        = new ExponentialGenerator();
     ExponentialGeneratorTravel.lambda = ((double)1 / (double)15);
     Congruential = new Generator();
     Random       = new Random();
 }
        public void GenerateBernoulliTrialsTest()
        {
            //Arrange
            UniformGenerator uniformGenerator = new UniformGenerator(4, 80);

            //Act
            int trials = uniformGenerator.GenerateBernoulliTrials();

            //Assert
            Assert.IsTrue(trials < 80);
        }
        [TestMethod] public void uniform_variance_should_be_1_12()
        {
            UniformGenerator uniform  = new UniformGenerator();
            double           sum      = 0.0;
            double           nbValues = 10e6;

            for (int i = 0; i < nbValues; i++)
            {
                sum += Math.Pow(uniform.Generate() - 0.5, 2);
            }
            double variance = sum / nbValues;

            Assert.AreEqual(1.0 / 12, variance, 0.01);
        }
        [TestMethod] public void uniform_average_should_be_0_5()
        {
            UniformGenerator uniform  = new UniformGenerator();
            double           nbValues = 10e5;
            double           sum      = 0.0;

            for (int i = 0; i < nbValues; i++)
            {
                sum = sum + uniform.Generate();
            }
            double avg = sum / nbValues;

            Assert.AreEqual(0.5, avg, 0.001);
        }
Exemplo n.º 11
0
 public Simulator()
 {
     uniformGeneratorAterrizaje       = new UniformGenerator();
     uniformGeneratorAterrizaje.a     = 3;
     uniformGeneratorAterrizaje.b     = 5;
     uniformGeneratorDespegue         = new UniformGenerator();
     uniformGeneratorDespegue.a       = 2;
     uniformGeneratorDespegue.b       = 4;
     convolutionGenerator             = new ConvolutionGenerator();
     exponentialGenerator             = new ExponentialGenerator();
     exponentialGenerator.lambda      = (double)0.1;
     convolutionGenerator.mean        = 80;
     convolutionGenerator.stDeviation = 30;
     generator = new Generator();
 }
        [TestMethod] public void uniform_instances_should_be_independants()
        {
            UniformGenerator uniform1           = new UniformGenerator();
            UniformGenerator uniform2           = new UniformGenerator();
            double           nbValues           = 10e4;
            List <double>    listValuesUniform1 = new List <double>();
            List <double>    listValuesUniform2 = new List <double>();

            for (int i = 0; i < nbValues; i++)
            {
                listValuesUniform1.Add(uniform1.Generate());
                listValuesUniform2.Add(uniform2.Generate());
            }
            CollectionAssert.AreNotEqual(listValuesUniform1, listValuesUniform2);
        }
Exemplo n.º 13
0
 /// <summary>
 /// Initialize random generators
 /// </summary>
 public void InitializeGenerators()
 {
     _uniformGenerators = new UniformGenerator[_length];
     for (int i = 0; i < _length; i++)
     {
         //if (_ranges[i].Min < 1 && _ranges[i].Max > 1)
         //{
         //    _uniformGenerators[i] = new UniformGenerator(new Range(0, 1), DateTime.Now.Millisecond);
         //}
         //else
         //{
         //    _uniformGenerators[i] = new UniformGenerator(_ranges[i], DateTime.Now.Millisecond);
         //}
         _uniformGenerators[i] = new UniformGenerator(_ranges[i], DateTime.Now.Millisecond);
     }
 }
Exemplo n.º 14
0
        public void SobolRational()
        {
            IUniformSource source = new Sobol(new[] { 0, 1, 3 }, 1, 3, 7);
            var            g      = new UniformGenerator(source);

            Assert.AreEqual((Rational)0 / 1, g.Rational());
            Assert.AreEqual((Rational)1 / 2, g.Rational());
            Assert.AreEqual((Rational)1 / 4, g.Rational());
            Assert.AreEqual((Rational)3 / 4, g.Rational());
            Assert.AreEqual((Rational)1 / 8, g.Rational());
            Assert.AreEqual((Rational)5 / 8, g.Rational());
            Assert.AreEqual((Rational)3 / 8, g.Rational());
            Assert.AreEqual((Rational)7 / 8, g.Rational());
            Assert.AreEqual((Rational)11 / 16, g.Rational());
            Assert.AreEqual((Rational)3 / 16, g.Rational());
            Assert.AreEqual((Rational)15 / 16, g.Rational());
        }
Exemplo n.º 15
0
        public void SobolDouble()
        {
            IUniformSource source = new Sobol(new[] { 0, 1, 3 }, 1, 3, 7);
            var            g      = new UniformGenerator(source);

            Assert.AreEqual(0.0, g.Double());
            Assert.AreEqual(0.5, g.Double());
            Assert.AreEqual(0.25, g.Double());
            Assert.AreEqual(0.75, g.Double());
            Assert.AreEqual(0.125, g.Double());
            Assert.AreEqual(0.625, g.Double());
            Assert.AreEqual(0.375, g.Double());
            Assert.AreEqual(0.875, g.Double());
            Assert.AreEqual(0.6875, g.Double());
            Assert.AreEqual(0.1875, g.Double());
            Assert.AreEqual(0.9375, g.Double());
        }
        public static Bitmap Additive(Bitmap image, Rectangle region, int amount)
        {
            int startX = region.Left;
            int startY = region.Top;
            int stopX  = image.Width - 1;
            int stopY  = image.Height - 1;

            if (startX + region.Width < image.Width)
            {
                stopX = startX + region.Width;
            }
            if (startY + region.Height < image.Height)
            {
                stopY = startX + region.Height;
            }

            Bitmap     b       = new Bitmap(image);
            BitmapData bmpData = b.LockBits(new Rectangle(0, 0, b.Width, b.Height), ImageLockMode.ReadWrite, b.PixelFormat);
            IntPtr     ptr     = bmpData.Scan0;
            int        stride  = bmpData.Stride;

            int bytes = Math.Abs(bmpData.Stride) * b.Height;

            byte[] rgbValues = new byte[bytes];

            System.Runtime.InteropServices.Marshal.Copy(ptr, rgbValues, 0, bytes);

            IRandomNumberGenerator generator = new UniformGenerator(new Range(-amount, amount));

            Parallel.For(startY, stopY, y =>
            {
                for (int x = startX; x < stopX; x++)
                {
                    int i            = y * stride + x * 4;
                    rgbValues[i]     = (byte)Math.Max(0, Math.Min(255, rgbValues[i] + generator.Next()));
                    rgbValues[i + 1] = (byte)Math.Max(0, Math.Min(255, rgbValues[i + 1] + generator.Next()));
                    rgbValues[i + 2] = (byte)Math.Max(0, Math.Min(255, rgbValues[i + 2] + generator.Next()));
                }
            });
            System.Runtime.InteropServices.Marshal.Copy(rgbValues, 0, ptr, bytes);
            b.UnlockBits(bmpData);

            return(b);
        }
Exemplo n.º 17
0
        public static byte[] ApplyFilter(byte[] imageBytes, ImageProcessingFilters filter, ImageFormat format = null)
        {
            IFilter baseFilter = null;

            switch (filter)
            {
            case ImageProcessingFilters.Default:
                return(imageBytes);

            case ImageProcessingFilters.GrayscaleBT709:
                baseFilter = new GrayscaleBT709();
                break;

            case ImageProcessingFilters.GrayscaleRMY:
                baseFilter = new GrayscaleRMY();
                break;

            case ImageProcessingFilters.GrayscaleY:
                baseFilter = new GrayscaleY();
                break;

            case ImageProcessingFilters.BayerFilter:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new ExtractChannel(RGB.B));
                ((FiltersSequence)baseFilter).Add(new BayerFilter());
                break;

            /*
             * case ImageProcessingFilters.ImageWarp:
             * baseFilter = new ImageWarp(
             * break;
             * */
            case ImageProcessingFilters.Channel_Red:
                baseFilter = new ExtractChannel(RGB.R);
                break;

            case ImageProcessingFilters.Channel_Green:
                baseFilter = new ExtractChannel(RGB.G);
                break;

            case ImageProcessingFilters.Channel_Blue:
                baseFilter = new ExtractChannel(RGB.B);
                break;

            case ImageProcessingFilters.WaterWave:
                baseFilter = new WaterWave();
                ((WaterWave)baseFilter).HorizontalWavesCount     = 10;
                ((WaterWave)baseFilter).HorizontalWavesAmplitude = 5;
                ((WaterWave)baseFilter).VerticalWavesCount       = 3;
                ((WaterWave)baseFilter).VerticalWavesAmplitude   = 15;
                break;

            case ImageProcessingFilters.Sepia:
                baseFilter = new Sepia();
                break;

            case ImageProcessingFilters.BrightnessCorrection:
                baseFilter = new BrightnessCorrection(-50);
                break;

            case ImageProcessingFilters.ContrastCorrection:
                baseFilter = new ContrastCorrection(15);
                break;

            case ImageProcessingFilters.SaturationCorrection1:
                baseFilter = new SaturationCorrection(-0.5f);
                break;

            case ImageProcessingFilters.SaturationCorrection2:
                baseFilter = new SaturationCorrection(-.25f);
                break;

            case ImageProcessingFilters.SaturationCorrection3:
                baseFilter = new SaturationCorrection(+0.5f);
                break;

            case ImageProcessingFilters.Invert:
                baseFilter = new Invert();
                break;

            case ImageProcessingFilters.Blur:
                baseFilter = new Blur();
                break;

            case ImageProcessingFilters.RotateChannels:
                baseFilter = new RotateChannels();
                break;

            case ImageProcessingFilters.RotateChannels2:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new RotateChannels());
                ((FiltersSequence)baseFilter).Add(new RotateChannels());
                break;

            case ImageProcessingFilters.AdditiveNoise:
                IRandomNumberGenerator generator = new UniformGenerator(new Range(-50, 50));
                baseFilter = new AdditiveNoise(generator);
                break;

            case ImageProcessingFilters.GammaCorrection:
                baseFilter = new GammaCorrection(0.5);
                break;

            case ImageProcessingFilters.HistogramEqualization:
                baseFilter = new HistogramEqualization();
                break;

            case ImageProcessingFilters.OrderedDithering:
                byte[,] matrix = new byte[4, 4]
                {
                    { 95, 233, 127, 255 },
                    { 159, 31, 191, 63 },
                    { 111, 239, 79, 207 },
                    { 175, 47, 143, 15 }
                };
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new GrayscaleBT709());
                ((FiltersSequence)baseFilter).Add(new OrderedDithering(matrix));
                break;

            case ImageProcessingFilters.Pixallete:
                baseFilter = new Pixellate();
                break;

            case ImageProcessingFilters.SimplePosterization:
                baseFilter = new SimplePosterization();
                break;

            case ImageProcessingFilters.Texturer_Textile:
                baseFilter = new Texturer(new AForge.Imaging.Textures.TextileTexture(), 0.3, 0.7);
                break;

            case ImageProcessingFilters.Texturer_Cloud:
                baseFilter = new Texturer(new AForge.Imaging.Textures.CloudsTexture(), 0.3, 0.7);
                break;

            case ImageProcessingFilters.Texturer_Marble:
                baseFilter = new Texturer(new AForge.Imaging.Textures.MarbleTexture(), 0.3, 0.7);
                break;

            case ImageProcessingFilters.Texturer_Wood:
                baseFilter = new Texturer(new AForge.Imaging.Textures.WoodTexture(), 0.3, 0.7);
                break;

            case ImageProcessingFilters.Texturer_Labyrinth:
                baseFilter = new Texturer(new AForge.Imaging.Textures.LabyrinthTexture(), 0.3, 0.7);
                break;

            case ImageProcessingFilters.SobelEdgeDetector:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new ExtractChannel(RGB.R));
                ((FiltersSequence)baseFilter).Add(new SobelEdgeDetector());
                break;

            case ImageProcessingFilters.SobelEdgeDetectorInvert:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new ExtractChannel(RGB.R));
                ((FiltersSequence)baseFilter).Add(new SobelEdgeDetector());
                ((FiltersSequence)baseFilter).Add(new Invert());
                break;

            case ImageProcessingFilters.SobelEdgeDetectorSepia:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new ExtractChannel(RGB.R));
                ((FiltersSequence)baseFilter).Add(new SobelEdgeDetector());
                ((FiltersSequence)baseFilter).Add(new GrayscaleToRGB());
                ((FiltersSequence)baseFilter).Add(new Sepia());
                break;

            case ImageProcessingFilters.SobelEdgeDetectorSepiaCanvas:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new ExtractChannel(RGB.R));
                ((FiltersSequence)baseFilter).Add(new SobelEdgeDetector());
                ((FiltersSequence)baseFilter).Add(new GrayscaleToRGB());
                ((FiltersSequence)baseFilter).Add(new Sepia());
                ((FiltersSequence)baseFilter).Add(new SimplePosterization());
                ((FiltersSequence)baseFilter).Add(new Texturer(new AForge.Imaging.Textures.TextileTexture(), 0.3, 0.7));
                break;

            case ImageProcessingFilters.Drawing:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new GrayscaleBT709());
                ((FiltersSequence)baseFilter).Add(new SobelEdgeDetector());
                ((FiltersSequence)baseFilter).Add(new Invert());
                ((FiltersSequence)baseFilter).Add(new SimplePosterization());
                break;

            case ImageProcessingFilters.DrawingSepia:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new GrayscaleBT709());
                ((FiltersSequence)baseFilter).Add(new SobelEdgeDetector());
                ((FiltersSequence)baseFilter).Add(new Invert());
                ((FiltersSequence)baseFilter).Add(new SimplePosterization());
                ((FiltersSequence)baseFilter).Add(new GrayscaleToRGB());
                ((FiltersSequence)baseFilter).Add(new Sepia());
                break;

            case ImageProcessingFilters.OilCanvas:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new SimplePosterization());
                ((FiltersSequence)baseFilter).Add(new Texturer(new AForge.Imaging.Textures.TextileTexture(), 0.3, 0.7));
                break;

            case ImageProcessingFilters.OilCanvasGray:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new SimplePosterization());
                ((FiltersSequence)baseFilter).Add(new Texturer(new AForge.Imaging.Textures.TextileTexture(), 0.3, 0.7));
                ((FiltersSequence)baseFilter).Add(new GrayscaleBT709());
                break;

            case ImageProcessingFilters.OilCanvasSepia:
                baseFilter = new FiltersSequence();
                ((FiltersSequence)baseFilter).Add(new SimplePosterization());
                ((FiltersSequence)baseFilter).Add(new Texturer(new AForge.Imaging.Textures.TextileTexture(), 0.3, 0.7));
                ((FiltersSequence)baseFilter).Add(new Sepia());
                break;
            }

            if (baseFilter == null)
            {
                return(null);
            }

            return(ApplyFilter(imageBytes, baseFilter, format));
        }
Exemplo n.º 18
0
 public PosionGenerator(int tries, int lambda)
 {
     _tries     = tries;
     _lambda    = lambda * 100;
     _generator = new UniformGenerator(0, 100);
 }
Exemplo n.º 19
0
        private async void GenerateButton_Click(object sender, EventArgs e)
        {
            string distribution = DistributionComboBox.SelectedItem.ToString();

            int  count          = (int)CountInput.Value;
            int  seed           = (int)SeedInput.Value;
            int  multiplier     = (int)MultiplierInput.Value;
            int  range          = (int)RangeInput.Value;
            bool showAllNumbers = !DisplayedNumbersLimiter.Checked;

            IGenerator generator;
            MLCG       generatorMLCG = new MLCG(seed, multiplier, range);

            ClearComponents();
            GeneratingProgress.Maximum = count;

            switch (distribution)
            {
            case "Uniform":
                generator = new UniformGenerator(Input1.Value, Input2.Value, generatorMLCG);
                break;

            case "Gauss":
                generator = new GaussGenerator(Input1.Value, Input2.Value, Input3.Value, count, generatorMLCG);
                break;

            case "Exponential":
                generator = new ExponentialGenerator(Input1.Value, generatorMLCG);
                break;

            case "Gamma":
                generator = new GammaGenerator(Input1.Value, Input2.Value, count, generatorMLCG);
                break;

            case "Triangular":
                generator = new TriangularGenerator(Input1.Value, Input2.Value, TriangularMinCheckBox.Checked, count, generatorMLCG);
                break;

            case "Simpson":
                generator = new SimpsonGenerator(Input1.Value, Input2.Value, count, generatorMLCG);
                break;

            default:
                generator = generatorMLCG;
                break;
            }

            await Task.Factory.StartNew(() =>
            {
                ProgressStage("Generating numbers...");

                for (int i = 0; i < count; i++)
                {
                    if (showAllNumbers || i < 100)
                    {
                        string row = $"{i + 1}. {generator.NextNumber()}";
                        ExecuteInUIThread(() => NumbersList.Items.Add(row));
                    }
                    else
                    {
                        generator.NextNumber();
                    }

                    ExecuteInUIThread(() => GeneratingProgress.Value++);
                }

                ProgressStage("Calculating statistics...");

                Calculations calculations = new Calculations(generator);
                AddToOutputBox($"M = {calculations.ExpectedValue:F5}");
                AddToOutputBox($"D = {calculations.Variance:F5}");
                AddToOutputBox($"σ = {calculations.StandardDeviation:F5}");

                ProgressStage("Building plot...");
                calculations.BuildHistogram(Plot.plt);
                Plot.Render();

                ProgressStage("Complete.");
            });
        }
Exemplo n.º 20
0
        private void button1_Click(object sender, EventArgs e)
        {
            UniformGenerator UnifGen           = new UniformGenerator(Convert.ToDouble(tbLeft.Text), Convert.ToDouble(tbRight.Text));
            GammaGenerator   GammaGen          = new GammaGenerator(Convert.ToDouble(tbKParam.Text), Convert.ToDouble(tbθParam.Text));
            int             RequestCount       = (int)udRequestCount.Value;
            double          Time               = Convert.ToDouble(tbTime.Text);
            double          TotalTime          = 0;
            double          dT                 = Convert.ToDouble(tbTimeStep.Text);
            int             i                  = 0;
            Queue <Request> Queue              = new Queue <Request>();
            double          GenTime            = UnifGen.Next();
            double          ServiceMachineTime = GammaGen.Next();
            List <double>   RequesTimes        = new List <double>();
            int             MaxQueueLength     = 0;
            int             MiddleQueueLength  = 0;
            int             QueueCount         = 0;

            do
            {
                if (GenTime <= 0)
                {
                    GenTime = UnifGen.Next();
                    Queue.Enqueue(new Request(i, TotalTime));

                    if (Queue.Count > MaxQueueLength)
                    {
                        MaxQueueLength = Queue.Count;
                    }

                    MiddleQueueLength += Queue.Count;
                    QueueCount++;
                }

                if ((ServiceMachineTime <= 0) && (Queue.Count > 0))
                {
                    ServiceMachineTime = GammaGen.Next();

                    Request Req = Queue.Dequeue();

                    i++;

                    if (cbInverseLink.Checked)
                    {
                        Queue.Enqueue(new Request(i, TotalTime));

                        if (Queue.Count > MaxQueueLength)
                        {
                            MaxQueueLength = Queue.Count;
                        }

                        MiddleQueueLength += Queue.Count;
                        QueueCount++;
                    }

                    RequesTimes.Add(TotalTime - Req.EntranceTime);
                }

                TotalTime          += dT;
                GenTime            -= dT;
                ServiceMachineTime -= dT;
            }while (rbCount.Checked ? i < RequestCount : TotalTime < Time);



            double TimeSum = 0;

            foreach (double T in RequesTimes)
            {
                TimeSum += T;
            }
            double AverageTime = TimeSum / RequesTimes.Count;

            tbMaxQueueLength.Text  = MaxQueueLength.ToString();
            tbAverageStayTime.Text = AverageTime.ToString("00.0000");
            //tbAverageQueueLength.Text = (MiddleQueueLength / QueueCount).ToString("00.0000");

            if (rbCount.Checked)
            {
                textBox1.Text = TotalTime.ToString("0.0000");
            }
            else
            {
                textBox1.Text = i.ToString();
            }
        }
Exemplo n.º 21
0
 /// <summary>
 /// Static generator initialization.
 /// </summary>
 static Util()
 {
     Gaussian = new GaussianGenerator(0, 1);
     Uniform  = new UniformGenerator(new Range(0, 1));
 }
Exemplo n.º 22
0
 private void init(bool force)
 {
     if (xug == null || force)
     {
         xug = new UniformGenerator(new DoubleRange(Constants.XUG_START, Constants.XUG_END), rg.Next());
         yug = new UniformGenerator(new DoubleRange(Constants.YUG_START, Constants.YUG_END), rg.Next());
         wug = new UniformGenerator(new DoubleRange(Constants.WUG_START, Constants.WUG_END), rg.Next());    // radius
     }
 }