From 7882423336e394d0f6ea1ff2e1b9e0bca479ac09 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Wed, 12 Oct 2022 20:22:36 -0400 Subject: [PATCH 01/87] add deviation estimation to mania's perfcalc --- .../Difficulty/ManiaDifficultyAttributes.cs | 6 +++ .../Difficulty/ManiaPerformanceCalculator.cs | 51 +++++++++++++++---- .../osu.Game.Rulesets.Mania.csproj | 4 ++ 3 files changed, 51 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs index d259c2af8e26..9371452121b1 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs @@ -19,6 +19,12 @@ public class ManiaDifficultyAttributes : DifficultyAttributes [JsonProperty("great_hit_window")] public double GreatHitWindow { get; set; } + /// + /// The perceived overall difficulty of the map. + /// + [JsonProperty("overall_difficulty")] + public double OverallDifficulty { get; set; } + public override IEnumerable<(int attributeId, object value)> ToDatabaseAttributes() { foreach (var v in base.ToDatabaseAttributes()) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 440dec82af34..07c831ebcebb 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -10,6 +10,8 @@ using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; +using MathNet.Numerics; +using MathNet.Numerics.RootFinding; namespace osu.Game.Rulesets.Mania.Difficulty { @@ -21,7 +23,7 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private int countOk; private int countMeh; private int countMiss; - private double scoreAccuracy; + private double estimatedUR; public ManiaPerformanceCalculator() : base(new ManiaRuleset()) @@ -38,7 +40,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - scoreAccuracy = calculateCustomAccuracy(); + estimatedUR = computeEstimatedUR(maniaAttributes) * 10; // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. // The specific number has no intrinsic meaning and can be adjusted as needed. @@ -50,7 +52,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s multiplier *= 0.5; double difficultyValue = computeDifficultyValue(maniaAttributes); - double totalValue = difficultyValue * multiplier; + double totalValue = estimatedUR; return new ManiaPerformanceAttributes { @@ -61,24 +63,53 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { - double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2) // Star rating to pp curve - * Math.Max(0, 5 * scoreAccuracy - 4) // From 80% accuracy, 1/20th of total pp is awarded per additional 1% accuracy - * (1 + 0.1 * Math.Min(1, totalHits / 1500)); // Length bonus, capped at 1500 notes + double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve return difficultyValue; } private double totalHits => countPerfect + countOk + countGreat + countGood + countMeh + countMiss; + private double totalSuccessfulHits => countPerfect + countOk + countGreat + countGood + countMeh; /// /// Accuracy used to weight judgements independently from the score's actual accuracy. /// - private double calculateCustomAccuracy() + private double computeEstimatedUR(ManiaDifficultyAttributes attributes) { - if (totalHits == 0) - return 0; + if (totalSuccessfulHits == 0) + return Double.PositiveInfinity; - return (countPerfect * 320 + countGreat * 300 + countGood * 200 + countOk * 100 + countMeh * 50) / (totalHits * 320); + // We need the size of every hit window in order to calculate deviation accurately. + double hMax = 16.5; + double h300 = Math.Floor(64 - 3 * attributes.OverallDifficulty) + 0.5; + double h200 = Math.Floor(97 - 3 * attributes.OverallDifficulty) + 0.5; + double h100 = Math.Floor(127 - 3 * attributes.OverallDifficulty) + 0.5; + double h50 = Math.Floor(151 - 3 * attributes.OverallDifficulty) + 0.5; + + double root2 = Math.Sqrt(2); + + // Returns the likelihood of any deviation resulting in the play + double likelihoodGradient(double d) + { + double pMax = 1 - SpecialFunctions.Erfc(hMax / (d * root2)); + double p300 = SpecialFunctions.Erfc(hMax / (d * root2)) - SpecialFunctions.Erfc(h300 / (d * root2)); + double p200 = SpecialFunctions.Erfc(h300 / (d * root2)) - SpecialFunctions.Erfc(h200 / (d * root2)); + double p100 = SpecialFunctions.Erfc(h200 / (d * root2)) - SpecialFunctions.Erfc(h100 / (d * root2)); + double p50 = SpecialFunctions.Erfc(h100 / (d * root2)) - SpecialFunctions.Erfc(h50 / (d * root2)); + double p0 = SpecialFunctions.Erfc(h50 / (d * root2)); + + double gradient = Math.Pow(pMax, countPerfect / totalHits) + * Math.Pow(p300, (countGreat + 0.5) / totalHits) + * Math.Pow(p200, countGood / totalHits) + * Math.Pow(p100, countOk / totalHits) + * Math.Pow(p50, countMeh / totalHits) + * Math.Pow(p0, countMiss / totalHits); + + return -gradient; + } + + // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play + return FindMinimum.OfScalarFunction(likelihoodGradient, 5); } } } diff --git a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj index 4f6840f9ca33..f1a88ac15a98 100644 --- a/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj +++ b/osu.Game.Rulesets.Mania/osu.Game.Rulesets.Mania.csproj @@ -15,4 +15,8 @@ + + + + \ No newline at end of file From 4af6c2614d8fe1eaf196a6ac8e84cccc889b24da Mon Sep 17 00:00:00 2001 From: Natelytle Date: Wed, 12 Oct 2022 21:33:08 -0400 Subject: [PATCH 02/87] add UR attribute, change initial min to 300UR --- .../Difficulty/ManiaPerformanceAttributes.cs | 3 +++ .../Difficulty/ManiaPerformanceCalculator.cs | 7 ++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs index 01474e6e0002..ee19029bc1c2 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs @@ -14,6 +14,9 @@ public class ManiaPerformanceAttributes : PerformanceAttributes [JsonProperty("difficulty")] public double Difficulty { get; set; } + [JsonProperty("estimated_ur")] + public double EstimatedUR { get; set; } + public override IEnumerable GetAttributesForDisplay() { foreach (var attribute in base.GetAttributesForDisplay()) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 07c831ebcebb..2febd396b4a1 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -52,12 +52,13 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s multiplier *= 0.5; double difficultyValue = computeDifficultyValue(maniaAttributes); - double totalValue = estimatedUR; + double totalValue = difficultyValue * multiplier; return new ManiaPerformanceAttributes { Difficulty = difficultyValue, - Total = totalValue + Total = totalValue, + EstimatedUR = estimatedUR }; } @@ -109,7 +110,7 @@ double likelihoodGradient(double d) } // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play - return FindMinimum.OfScalarFunction(likelihoodGradient, 5); + return FindMinimum.OfScalarFunction(likelihoodGradient, 30); } } } From 6ea6ba24a9a7ea8382cad35e120c77ea8274535f Mon Sep 17 00:00:00 2001 From: Natelytle Date: Wed, 12 Oct 2022 22:03:50 -0400 Subject: [PATCH 03/87] bound deviation estimate to numbers greater than 0 --- .../Difficulty/ManiaPerformanceCalculator.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 2febd396b4a1..4cb53e5b85c3 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -92,6 +92,9 @@ private double computeEstimatedUR(ManiaDifficultyAttributes attributes) // Returns the likelihood of any deviation resulting in the play double likelihoodGradient(double d) { + if (d <= 0) + return double.PositiveInfinity; + double pMax = 1 - SpecialFunctions.Erfc(hMax / (d * root2)); double p300 = SpecialFunctions.Erfc(hMax / (d * root2)) - SpecialFunctions.Erfc(h300 / (d * root2)); double p200 = SpecialFunctions.Erfc(h300 / (d * root2)) - SpecialFunctions.Erfc(h200 / (d * root2)); From 3d8016821bde8706a118089b4282f29b43281d2d Mon Sep 17 00:00:00 2001 From: Natelytle Date: Thu, 13 Oct 2022 16:15:08 -0400 Subject: [PATCH 04/87] fix hitwindows --- .../Difficulty/ManiaDifficultyCalculator.cs | 3 ++- .../Difficulty/ManiaPerformanceCalculator.cs | 9 ++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs index 63e61f17e358..18e0b95323cd 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs @@ -55,7 +55,8 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat // In osu-stable mania, rate-adjustment mods don't affect the hit window. // This is done the way it is to introduce fractional differences in order to match osu-stable for the time being. GreatHitWindow = Math.Ceiling((int)(getHitWindow300(mods) * clockRate) / clockRate), - MaxCombo = beatmap.HitObjects.Sum(maxComboForObject) + MaxCombo = beatmap.HitObjects.Sum(maxComboForObject), + OverallDifficulty = beatmap.Difficulty.OverallDifficulty }; } diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 4cb53e5b85c3..db466903a285 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -11,7 +11,6 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using MathNet.Numerics; -using MathNet.Numerics.RootFinding; namespace osu.Game.Rulesets.Mania.Difficulty { @@ -82,10 +81,10 @@ private double computeEstimatedUR(ManiaDifficultyAttributes attributes) // We need the size of every hit window in order to calculate deviation accurately. double hMax = 16.5; - double h300 = Math.Floor(64 - 3 * attributes.OverallDifficulty) + 0.5; - double h200 = Math.Floor(97 - 3 * attributes.OverallDifficulty) + 0.5; - double h100 = Math.Floor(127 - 3 * attributes.OverallDifficulty) + 0.5; - double h50 = Math.Floor(151 - 3 * attributes.OverallDifficulty) + 0.5; + double h300 = Math.Floor(64 - 3 * attributes.OverallDifficulty); + double h200 = Math.Floor(97 - 3 * attributes.OverallDifficulty); + double h100 = Math.Floor(127 - 3 * attributes.OverallDifficulty); + double h50 = Math.Floor(151 - 3 * attributes.OverallDifficulty); double root2 = Math.Sqrt(2); From f4c7e9da3b44e083092a81441f1035e1e81d28ae Mon Sep 17 00:00:00 2001 From: Natelytle Date: Thu, 13 Oct 2022 17:23:56 -0400 Subject: [PATCH 05/87] account for converts, add note counts --- .../Difficulty/ManiaDifficultyAttributes.cs | 15 +++++++++++++++ .../Difficulty/ManiaDifficultyCalculator.cs | 9 ++++++++- .../Difficulty/ManiaPerformanceCalculator.cs | 5 +++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs index 9371452121b1..bb421eb87bb1 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs @@ -25,6 +25,21 @@ public class ManiaDifficultyAttributes : DifficultyAttributes [JsonProperty("overall_difficulty")] public double OverallDifficulty { get; set; } + /// + /// The number of notes in the beatmap. + /// + public int NoteCount { get; set; } + + /// + /// The number of hold notes in the beatmap. + /// + public int HoldNoteCount { get; set; } + + /// + /// Conversion status from standard. + /// + public bool Convert { get; set; } + public override IEnumerable<(int attributeId, object value)> ToDatabaseAttributes() { foreach (var v in base.ToDatabaseAttributes()) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs index 18e0b95323cd..017893ec4a78 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs @@ -48,6 +48,10 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat HitWindows hitWindows = new ManiaHitWindows(); hitWindows.SetDifficulty(beatmap.Difficulty.OverallDifficulty); + int noteCount = beatmap.HitObjects.Count(h => h is Note); + int holdNoteCount = beatmap.HitObjects.Count(h => h is HoldNote); + bool convert = beatmap.BeatmapInfo.Ruleset.Name != "osu!mania"; + return new ManiaDifficultyAttributes { StarRating = skills[0].DifficultyValue() * star_scaling_factor, @@ -56,7 +60,10 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat // This is done the way it is to introduce fractional differences in order to match osu-stable for the time being. GreatHitWindow = Math.Ceiling((int)(getHitWindow300(mods) * clockRate) / clockRate), MaxCombo = beatmap.HitObjects.Sum(maxComboForObject), - OverallDifficulty = beatmap.Difficulty.OverallDifficulty + OverallDifficulty = beatmap.Difficulty.OverallDifficulty, + NoteCount = noteCount, + HoldNoteCount = holdNoteCount, + Convert = convert }; } diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index db466903a285..0803539704b3 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -79,6 +79,11 @@ private double computeEstimatedUR(ManiaDifficultyAttributes attributes) if (totalSuccessfulHits == 0) return Double.PositiveInfinity; + double overallDifficulty = attributes.OverallDifficulty; + + if (attributes.Convert == true) + overallDifficulty = 10; + // We need the size of every hit window in order to calculate deviation accurately. double hMax = 16.5; double h300 = Math.Floor(64 - 3 * attributes.OverallDifficulty); From dfd386cab63ebc97e7186bf0339d8e96807d8dbc Mon Sep 17 00:00:00 2001 From: Natelytle Date: Thu, 13 Oct 2022 17:44:41 -0400 Subject: [PATCH 06/87] use onlineid for contingency --- osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs index 017893ec4a78..3970079919c4 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs @@ -50,7 +50,7 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat int noteCount = beatmap.HitObjects.Count(h => h is Note); int holdNoteCount = beatmap.HitObjects.Count(h => h is HoldNote); - bool convert = beatmap.BeatmapInfo.Ruleset.Name != "osu!mania"; + bool convert = beatmap.BeatmapInfo.Ruleset.OnlineID != 3; return new ManiaDifficultyAttributes { From 5296fb578c4021105ee1fec60ea9fff51be99ec0 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 15 Oct 2022 19:14:03 -0400 Subject: [PATCH 07/87] fix convert hit windows --- .../Difficulty/ManiaPerformanceCalculator.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 0803539704b3..e5947fc10a4f 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -81,15 +81,15 @@ private double computeEstimatedUR(ManiaDifficultyAttributes attributes) double overallDifficulty = attributes.OverallDifficulty; - if (attributes.Convert == true) + if (attributes.Convert) overallDifficulty = 10; // We need the size of every hit window in order to calculate deviation accurately. double hMax = 16.5; - double h300 = Math.Floor(64 - 3 * attributes.OverallDifficulty); - double h200 = Math.Floor(97 - 3 * attributes.OverallDifficulty); - double h100 = Math.Floor(127 - 3 * attributes.OverallDifficulty); - double h50 = Math.Floor(151 - 3 * attributes.OverallDifficulty); + double h300 = Math.Floor(64 - 3 * overallDifficulty); + double h200 = Math.Floor(97 - 3 * overallDifficulty); + double h100 = Math.Floor(127 - 3 * overallDifficulty); + double h50 = Math.Floor(151 - 3 * overallDifficulty); double root2 = Math.Sqrt(2); From 562954a71643ca11aa92693b296b8d500c835fba Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 15 Oct 2022 19:33:15 -0400 Subject: [PATCH 08/87] account for HR/EZ in deviation calculation --- .../Difficulty/ManiaPerformanceCalculator.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index e5947fc10a4f..689c939b2b02 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -39,7 +39,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - estimatedUR = computeEstimatedUR(maniaAttributes) * 10; + estimatedUR = computeEstimatedUR(score, maniaAttributes) * 10; // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. // The specific number has no intrinsic meaning and can be adjusted as needed. @@ -74,7 +74,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// /// Accuracy used to weight judgements independently from the score's actual accuracy. /// - private double computeEstimatedUR(ManiaDifficultyAttributes attributes) + private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes attributes) { if (totalSuccessfulHits == 0) return Double.PositiveInfinity; @@ -84,12 +84,19 @@ private double computeEstimatedUR(ManiaDifficultyAttributes attributes) if (attributes.Convert) overallDifficulty = 10; + double windowMultiplier = 1; + + if (score.Mods.Any(m => m is ModHardRock)) + windowMultiplier *= 1 / 1.4; + else if (score.Mods.Any(m => m is ModEasy)) + windowMultiplier *= 1.4; + // We need the size of every hit window in order to calculate deviation accurately. - double hMax = 16.5; - double h300 = Math.Floor(64 - 3 * overallDifficulty); - double h200 = Math.Floor(97 - 3 * overallDifficulty); - double h100 = Math.Floor(127 - 3 * overallDifficulty); - double h50 = Math.Floor(151 - 3 * overallDifficulty); + double hMax = Math.Floor(16 * windowMultiplier); + double h300 = Math.Floor((64 - 3 * overallDifficulty) * windowMultiplier); + double h200 = Math.Floor((97 - 3 * overallDifficulty) * windowMultiplier); + double h100 = Math.Floor((127 - 3 * overallDifficulty) * windowMultiplier); + double h50 = Math.Floor((151 - 3 * overallDifficulty) * windowMultiplier); double root2 = Math.Sqrt(2); From 49495dbd55c8a6ff54da0fb3ae4c70f35edb3dc4 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 24 Oct 2022 08:37:30 -0400 Subject: [PATCH 09/87] use erfc approximation --- .../Difficulty/ManiaPerformanceCalculator.cs | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 689c939b2b02..e3c79296225f 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -106,12 +106,12 @@ double likelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMax = 1 - SpecialFunctions.Erfc(hMax / (d * root2)); - double p300 = SpecialFunctions.Erfc(hMax / (d * root2)) - SpecialFunctions.Erfc(h300 / (d * root2)); - double p200 = SpecialFunctions.Erfc(h300 / (d * root2)) - SpecialFunctions.Erfc(h200 / (d * root2)); - double p100 = SpecialFunctions.Erfc(h200 / (d * root2)) - SpecialFunctions.Erfc(h100 / (d * root2)); - double p50 = SpecialFunctions.Erfc(h100 / (d * root2)) - SpecialFunctions.Erfc(h50 / (d * root2)); - double p0 = SpecialFunctions.Erfc(h50 / (d * root2)); + double pMax = 1 - erfcApprox(hMax / (d * root2)); + double p300 = erfcApprox(hMax / (d * root2)) - erfcApprox(h300 / (d * root2)); + double p200 = erfcApprox(h300 / (d * root2)) - erfcApprox(h200 / (d * root2)); + double p100 = erfcApprox(h200 / (d * root2)) - erfcApprox(h100 / (d * root2)); + double p50 = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); + double p0 = erfcApprox(h50 / (d * root2)); double gradient = Math.Pow(pMax, countPerfect / totalHits) * Math.Pow(p300, (countGreat + 0.5) / totalHits) @@ -126,5 +126,14 @@ double likelihoodGradient(double d) // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play return FindMinimum.OfScalarFunction(likelihoodGradient, 30); } + + double erfcApprox(double x) + { + if (x <= 5) + return SpecialFunctions.Erfc(x); + + // Approximation is most accurate with values over 5, and is much more performant than the Erfc function + return Math.Pow(Math.E, -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); + } } } From dd1754f2cb4bd6ae6e01f5275a8cbee93eda52ed Mon Sep 17 00:00:00 2001 From: Natelytle Date: Thu, 27 Oct 2022 16:49:40 -0400 Subject: [PATCH 10/87] Add rudimentary difficulty scaling curve --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index e3c79296225f..999ae662eedd 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -65,6 +65,8 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve + difficultyValue *= Math.Max(1.08 - Math.Pow(estimatedUR / 520, 1.8), 0); + return difficultyValue; } From 79b35412dd9f274d2effb60d17648694c112ef3f Mon Sep 17 00:00:00 2001 From: Natelytle Date: Thu, 27 Oct 2022 19:21:45 -0400 Subject: [PATCH 11/87] Change curve --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 999ae662eedd..964dae02745c 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -65,7 +65,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve - difficultyValue *= Math.Max(1.08 - Math.Pow(estimatedUR / 520, 1.8), 0); + difficultyValue *= Math.Pow(SpecialFunctions.Erf(300 / estimatedUR), 2); return difficultyValue; } From 3a51c53e89c7942a6e6d59ae490bba3fd1553493 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 29 Oct 2022 18:13:03 -0400 Subject: [PATCH 12/87] Don't give PP to jittered plays --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 964dae02745c..569f54c0c538 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -65,7 +65,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve - difficultyValue *= Math.Pow(SpecialFunctions.Erf(300 / estimatedUR), 2); + difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUR), 1.6) - 0.2, 0); return difficultyValue; } From c5233c72da5072970394f683874813261e1e5c39 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 23 Jan 2023 18:05:50 -0500 Subject: [PATCH 13/87] change hit window formulas --- .../Difficulty/ManiaPerformanceCalculator.cs | 89 +++++++++++++++---- 1 file changed, 73 insertions(+), 16 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 569f54c0c538..539b844e3136 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -11,6 +11,8 @@ using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; using MathNet.Numerics; +using osu.Framework.Audio.Track; +using osu.Framework.Extensions.IEnumerableExtensions; namespace osu.Game.Rulesets.Mania.Difficulty { @@ -56,7 +58,8 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s return new ManiaPerformanceAttributes { Difficulty = difficultyValue, - Total = totalValue, + // Total = totalValue, + Total = estimatedUR, EstimatedUR = estimatedUR }; } @@ -81,24 +84,21 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att if (totalSuccessfulHits == 0) return Double.PositiveInfinity; - double overallDifficulty = attributes.OverallDifficulty; + double[] judgements = new double[5]; - if (attributes.Convert) - overallDifficulty = 10; + // Legacy scores have the same number of judgements and total notes + bool isLegacyScore = totalHits == attributes.NoteCount + attributes.HoldNoteCount; - double windowMultiplier = 1; + if (isLegacyScore) + judgements = getLegacyJudgements(score, attributes); + else + judgements = getLazerJudgements(score, attributes); - if (score.Mods.Any(m => m is ModHardRock)) - windowMultiplier *= 1 / 1.4; - else if (score.Mods.Any(m => m is ModEasy)) - windowMultiplier *= 1.4; - - // We need the size of every hit window in order to calculate deviation accurately. - double hMax = Math.Floor(16 * windowMultiplier); - double h300 = Math.Floor((64 - 3 * overallDifficulty) * windowMultiplier); - double h200 = Math.Floor((97 - 3 * overallDifficulty) * windowMultiplier); - double h100 = Math.Floor((127 - 3 * overallDifficulty) * windowMultiplier); - double h50 = Math.Floor((151 - 3 * overallDifficulty) * windowMultiplier); + double hMax = judgements[0]; + double h300 = judgements[1]; + double h200 = judgements[2]; + double h100 = judgements[3]; + double h50 = judgements[4]; double root2 = Math.Sqrt(2); @@ -128,6 +128,63 @@ double likelihoodGradient(double d) // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play return FindMinimum.OfScalarFunction(likelihoodGradient, 30); } + + double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) + { + double[] judgements = new double[5]; + + double overallDifficulty = attributes.OverallDifficulty; + + if (attributes.Convert) + overallDifficulty = 10; + + double windowMultiplier = 1; + + if (score.Mods.Any(m => m is ModHardRock)) + windowMultiplier *= 1 / 1.4; + else if (score.Mods.Any(m => m is ModEasy)) + windowMultiplier *= 1.4; + + judgements[0] = Math.Floor(16 * windowMultiplier); + judgements[1] = Math.Floor((64 - 3 * overallDifficulty) * windowMultiplier); + judgements[2] = Math.Floor((97 - 3 * overallDifficulty) * windowMultiplier); + judgements[3] = Math.Floor((127 - 3 * overallDifficulty) * windowMultiplier); + judgements[4] = Math.Floor((151 - 3 * overallDifficulty) * windowMultiplier); + + return judgements; + } + + double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) + { + double[] judgements = new double[5]; + + var track = new TrackVirtual(10000); + score.Mods.OfType().ForEach(m => m.ApplyToTrack(track)); + double clockRate = track.Rate; + + double overallDifficulty = attributes.OverallDifficulty; + + if (attributes.Convert) + overallDifficulty = 10; + + double windowMultiplier = 1 / clockRate; + + if (score.Mods.Any(m => m is ModHardRock)) + windowMultiplier *= 1 / 1.4; + else if (score.Mods.Any(m => m is ModEasy)) + windowMultiplier *= 1.4; + + if (overallDifficulty < 5) + judgements[0] = (22.4 - 6 * overallDifficulty) * windowMultiplier; + else + judgements[0] = (24.9 - 1.1 * overallDifficulty) * windowMultiplier; + judgements[1] = (64 - 3 * overallDifficulty) * windowMultiplier; + judgements[2] = (97 - 3 * overallDifficulty) * windowMultiplier; + judgements[3] = (127 - 3 * overallDifficulty) * windowMultiplier; + judgements[4] = (151 - 3 * overallDifficulty) * windowMultiplier; + + return judgements; + } double erfcApprox(double x) { From 8e78adb946187ae1f7d0722cfbbef5dfe997a05c Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 23 Jan 2023 18:13:14 -0500 Subject: [PATCH 14/87] fix judgement --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 539b844e3136..86c10b36b5a1 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -175,7 +175,7 @@ double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes attribute windowMultiplier *= 1.4; if (overallDifficulty < 5) - judgements[0] = (22.4 - 6 * overallDifficulty) * windowMultiplier; + judgements[0] = (22.4 - 0.6 * overallDifficulty) * windowMultiplier; else judgements[0] = (24.9 - 1.1 * overallDifficulty) * windowMultiplier; judgements[1] = (64 - 3 * overallDifficulty) * windowMultiplier; From 4a5b14fffe51f96f2e089c5ba4fed107a0cf3d72 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 23 Jan 2023 19:18:59 -0500 Subject: [PATCH 15/87] lazer deviation is finally accurate woo --- .../Difficulty/ManiaPerformanceCalculator.cs | 48 +++++++++++++++++-- 1 file changed, 43 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 86c10b36b5a1..09bd01d880ed 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -102,8 +102,7 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double root2 = Math.Sqrt(2); - // Returns the likelihood of any deviation resulting in the play - double likelihoodGradient(double d) + double legacyLikelihoodGradient(double d) { if (d <= 0) return double.PositiveInfinity; @@ -125,11 +124,50 @@ double likelihoodGradient(double d) return -gradient; } + double lazerLikelihoodGradient(double d) + { + if (d <= 0) + return double.PositiveInfinity; + + double pMaxNote = 1 - erfcApprox(hMax / (d * root2)); + double p300Note = erfcApprox(hMax / (d * root2)) - erfcApprox(h300 / (d * root2)); + double p200Note = erfcApprox(h300 / (d * root2)) - erfcApprox(h200 / (d * root2)); + double p100Note = erfcApprox(h200 / (d * root2)) - erfcApprox(h100 / (d * root2)); + double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); + double p0Note = erfcApprox(h50 / (d * root2)); + + double pMaxTail = 1 - erfcApprox((hMax * 1.5) / (d * root2)); + double p300Tail = erfcApprox((hMax * 1.5) / (d * root2)) - erfcApprox((h300 * 1.5) / (d * root2)); + double p200Tail = erfcApprox((h300 * 1.5) / (d * root2)) - erfcApprox((h200 * 1.5) / (d * root2)); + double p100Tail = erfcApprox((h200 * 1.5) / (d * root2)) - erfcApprox((h100 * 1.5) / (d * root2)); + double p50Tail = erfcApprox((h100 * 1.5) / (d * root2)) - erfcApprox((h50 * 1.5) / (d * root2)); + double p0Tail = erfcApprox((h50 * 1.5) / (d * root2)); + + double pMax = ((pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount)) + (pMaxTail * attributes.HoldNoteCount)) / totalHits; + double p300 = ((p300Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p300Tail * attributes.HoldNoteCount)) / totalHits; + double p200 = ((p200Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p200Tail * attributes.HoldNoteCount)) / totalHits; + double p100 = ((p100Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p100Tail * attributes.HoldNoteCount)) / totalHits; + double p50 = ((p50Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p50Tail * attributes.HoldNoteCount)) / totalHits; + double p0 = ((p0Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p0Tail * attributes.HoldNoteCount)) / totalHits; + + double gradient = Math.Pow(pMax, countPerfect / totalHits) + * Math.Pow(p300, (countGreat + 0.5) / totalHits) + * Math.Pow(p200, countGood / totalHits) + * Math.Pow(p100, countOk / totalHits) + * Math.Pow(p50, countMeh / totalHits) + * Math.Pow(p0, countMiss / totalHits); + + return -gradient; + } + // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play - return FindMinimum.OfScalarFunction(likelihoodGradient, 30); + if (isLegacyScore) + return FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30); + else + return FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); } - double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) + private double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) { double[] judgements = new double[5]; @@ -154,7 +192,7 @@ double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attribut return judgements; } - double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) + private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) { double[] judgements = new double[5]; From 82bf3e770393d7c3838a7427439bb19bc6d4cf09 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 23 Jan 2023 22:57:02 -0500 Subject: [PATCH 16/87] increase totalhits by 1 --- .../Difficulty/ManiaPerformanceCalculator.cs | 29 ++++++++++--------- 1 file changed, 16 insertions(+), 13 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 09bd01d880ed..b115bc4ad89c 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -102,6 +102,9 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double root2 = Math.Sqrt(2); + // The deviation estimation cannot handle SS scores, so always assume there is one extra note to keep the perfect hit probability below 100%. + double totalHitsP1 = totalHits + 1; + double legacyLikelihoodGradient(double d) { if (d <= 0) @@ -114,12 +117,12 @@ double legacyLikelihoodGradient(double d) double p50 = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); double p0 = erfcApprox(h50 / (d * root2)); - double gradient = Math.Pow(pMax, countPerfect / totalHits) - * Math.Pow(p300, (countGreat + 0.5) / totalHits) - * Math.Pow(p200, countGood / totalHits) - * Math.Pow(p100, countOk / totalHits) - * Math.Pow(p50, countMeh / totalHits) - * Math.Pow(p0, countMiss / totalHits); + double gradient = Math.Pow(pMax, countPerfect / totalHitsP1) + * Math.Pow(p300, countGreat / totalHitsP1) + * Math.Pow(p200, countGood / totalHitsP1) + * Math.Pow(p100, countOk / totalHitsP1) + * Math.Pow(p50, countMeh / totalHitsP1) + * Math.Pow(p0, countMiss / totalHitsP1); return -gradient; } @@ -150,12 +153,12 @@ double lazerLikelihoodGradient(double d) double p50 = ((p50Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p50Tail * attributes.HoldNoteCount)) / totalHits; double p0 = ((p0Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p0Tail * attributes.HoldNoteCount)) / totalHits; - double gradient = Math.Pow(pMax, countPerfect / totalHits) - * Math.Pow(p300, (countGreat + 0.5) / totalHits) - * Math.Pow(p200, countGood / totalHits) - * Math.Pow(p100, countOk / totalHits) - * Math.Pow(p50, countMeh / totalHits) - * Math.Pow(p0, countMiss / totalHits); + double gradient = Math.Pow(pMax, countPerfect / totalHitsP1) + * Math.Pow(p300, countGreat / totalHitsP1) + * Math.Pow(p200, countGood / totalHitsP1) + * Math.Pow(p100, countOk / totalHitsP1) + * Math.Pow(p50, countMeh / totalHitsP1) + * Math.Pow(p0, countMiss / totalHitsP1); return -gradient; } @@ -229,7 +232,7 @@ double erfcApprox(double x) if (x <= 5) return SpecialFunctions.Erfc(x); - // Approximation is most accurate with values over 5, and is much more performant than the Erfc function + // This approximation is very accurate with values over 5, and is much more performant than the Erfc function return Math.Pow(Math.E, -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); } } From 522271bc34ec08c522e7c9628384b685e737314d Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 24 Jan 2023 16:35:38 -0500 Subject: [PATCH 17/87] quick legacy LN idea --- .../Difficulty/ManiaPerformanceCalculator.cs | 31 ++++++++++++++----- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index b115bc4ad89c..635d41fa8721 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -110,12 +110,29 @@ double legacyLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMax = 1 - erfcApprox(hMax / (d * root2)); - double p300 = erfcApprox(hMax / (d * root2)) - erfcApprox(h300 / (d * root2)); - double p200 = erfcApprox(h300 / (d * root2)) - erfcApprox(h200 / (d * root2)); - double p100 = erfcApprox(h200 / (d * root2)) - erfcApprox(h100 / (d * root2)); - double p50 = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); - double p0 = erfcApprox(h50 / (d * root2)); + double pMaxNote = 1 - erfcApprox(hMax / (d * root2)); + double p300Note = erfcApprox(hMax / (d * root2)) - erfcApprox(h300 / (d * root2)); + double p200Note = erfcApprox(h300 / (d * root2)) - erfcApprox(h200 / (d * root2)); + double p100Note = erfcApprox(h200 / (d * root2)) - erfcApprox(h100 / (d * root2)); + double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); + double p0Note = erfcApprox(h50 / (d * root2)); + + // Temporary arbitrary value for balancing purposes. + double f = 0.75; + + double pMaxLN = 1 - Math.Pow(erfcApprox((hMax * 1.2) / (d * root2)), f); + double p300LN = Math.Pow(erfcApprox((hMax * 1.2) / (d * root2)), f) - Math.Pow(erfcApprox((h300 * 1.1) / (d * root2)), f); + double p200LN = Math.Pow(erfcApprox((h300 * 1.1) / (d * root2)), f) - Math.Pow(erfcApprox(h200 / (d * root2)), f); + double p100LN = Math.Pow(erfcApprox(h200 / (d * root2)), f) - Math.Pow(erfcApprox(h100 / (d * root2)), f); + double p50LN = Math.Pow(erfcApprox(h100 / (d * root2)), f) - Math.Pow(erfcApprox(h50 / (d * root2)), f); + double p0LN = Math.Pow(erfcApprox(h50 / (d * root2)), f); + + double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; + double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; + double p200 = ((p200Note * attributes.NoteCount) + (p200LN * attributes.HoldNoteCount)) / totalHits; + double p100 = ((p100Note * attributes.NoteCount) + (p100LN * attributes.HoldNoteCount)) / totalHits; + double p50 = ((p50Note * attributes.NoteCount) + (p50LN * attributes.HoldNoteCount)) / totalHits; + double p0 = ((p0Note * attributes.NoteCount) + (p0LN * attributes.HoldNoteCount)) / totalHits; double gradient = Math.Pow(pMax, countPerfect / totalHitsP1) * Math.Pow(p300, countGreat / totalHitsP1) @@ -233,7 +250,7 @@ double erfcApprox(double x) return SpecialFunctions.Erfc(x); // This approximation is very accurate with values over 5, and is much more performant than the Erfc function - return Math.Pow(Math.E, -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); + return Math.Exp(-Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); } } } From 3a78b9e92a5d6d38681a3a07620cb0db6e5a6b00 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 27 Jan 2023 10:41:47 -0500 Subject: [PATCH 18/87] Fix formatting --- .../Beatmaps/ManiaBeatmapConverter.cs | 8 +-- .../Legacy/DistanceObjectPatternGenerator.cs | 6 +- .../Legacy/EndTimeObjectPatternGenerator.cs | 4 +- .../Legacy/HitObjectPatternGenerator.cs | 4 +- .../Difficulty/ManiaPerformanceCalculator.cs | 67 ++++++++++--------- .../Edit/DrawableManiaEditorRuleset.cs | 2 +- .../Edit/ManiaEditorPlayfield.cs | 2 +- .../MathUtils/LegacySortHelper.cs | 4 +- .../Mods/ManiaModHoldOff.cs | 8 +-- .../Mods/ManiaModMirror.cs | 6 +- .../Objects/Drawables/DrawableHoldNoteHead.cs | 2 +- .../Objects/Drawables/DrawableHoldNoteTail.cs | 2 +- .../Drawables/DrawableManiaHitObject.cs | 2 +- osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs | 4 +- 14 files changed, 63 insertions(+), 58 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs index 632b7cdcc715..0d06d8007a1b 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs @@ -3,17 +3,17 @@ #nullable disable -using osu.Game.Rulesets.Mania.Objects; using System; -using System.Linq; using System.Collections.Generic; +using System.Linq; using System.Threading; using osu.Game.Audio; using osu.Game.Beatmaps; -using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Objects.Types; using osu.Game.Rulesets.Mania.Beatmaps.Patterns; using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Objects.Types; using osu.Game.Utils; using osuTK; diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs index 2bdd0e16ad6e..e0339c7f5059 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs @@ -10,11 +10,11 @@ using osu.Framework.Extensions.EnumExtensions; using osu.Game.Audio; using osu.Game.Beatmaps; -using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Objects.Types; -using osu.Game.Rulesets.Mania.Objects; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Beatmaps.Formats; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Objects.Types; using osu.Game.Utils; namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs index 630fdf7ae2e2..e09061697f39 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs @@ -4,12 +4,12 @@ #nullable disable using System.Collections.Generic; -using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Objects.Types; using System.Linq; using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Objects.Types; using osu.Game.Utils; namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs index 912cac4fe411..d2123f49aa84 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs @@ -7,15 +7,15 @@ using System.Collections.Generic; using System.Linq; using osu.Framework.Extensions.EnumExtensions; -using osuTK; +using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; -using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Utils; +using osuTK; namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy { diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 635d41fa8721..f7edb266e376 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -6,13 +6,13 @@ using System; using System.Collections.Generic; using System.Linq; +using MathNet.Numerics; +using osu.Framework.Audio.Track; +using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; -using MathNet.Numerics; -using osu.Framework.Audio.Track; -using osu.Framework.Extensions.IEnumerableExtensions; namespace osu.Game.Rulesets.Mania.Difficulty { @@ -82,7 +82,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes attributes) { if (totalSuccessfulHits == 0) - return Double.PositiveInfinity; + return double.PositiveInfinity; double[] judgements = new double[5]; @@ -102,9 +102,6 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double root2 = Math.Sqrt(2); - // The deviation estimation cannot handle SS scores, so always assume there is one extra note to keep the perfect hit probability below 100%. - double totalHitsP1 = totalHits + 1; - double legacyLikelihoodGradient(double d) { if (d <= 0) @@ -117,15 +114,23 @@ double legacyLikelihoodGradient(double d) double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); double p0Note = erfcApprox(h50 / (d * root2)); - // Temporary arbitrary value for balancing purposes. - double f = 0.75; + double pMaxHead = 1 - erfcApprox((hMax * 1.2) / (d * root2)); + double p300Head = erfcApprox((hMax * 1.2) / (d * root2)) - erfcApprox(h300 * 1.1) / (d * root2); + double p200Head = erfcApprox((h300 * 1.1) / (d * root2)) - erfcApprox(h200 / (d * root2)); - double pMaxLN = 1 - Math.Pow(erfcApprox((hMax * 1.2) / (d * root2)), f); - double p300LN = Math.Pow(erfcApprox((hMax * 1.2) / (d * root2)), f) - Math.Pow(erfcApprox((h300 * 1.1) / (d * root2)), f); - double p200LN = Math.Pow(erfcApprox((h300 * 1.1) / (d * root2)), f) - Math.Pow(erfcApprox(h200 / (d * root2)), f); - double p100LN = Math.Pow(erfcApprox(h200 / (d * root2)), f) - Math.Pow(erfcApprox(h100 / (d * root2)), f); - double p50LN = Math.Pow(erfcApprox(h100 / (d * root2)), f) - Math.Pow(erfcApprox(h50 / (d * root2)), f); - double p0LN = Math.Pow(erfcApprox(h50 / (d * root2)), f); + double pMaxTail = 1 - erfcApprox((hMax * 1.5 * 1.2) / (d * root2)); + double p300Tail = erfcApprox((hMax * 1.5 * 1.2) / (d * root2)) - erfcApprox((h300 * 1.5 * 1.1) / (d * root2)); + double p200Tail = erfcApprox((h300 * 1.5 * 1.1) / (d * root2)) - erfcApprox((h200 * 1.5) / (d * root2)); + double p100Tail = erfcApprox((h200 * 1.5) / (d * root2)) - erfcApprox((h100 * 1.5) / (d * root2)); + double p50Tail = erfcApprox((h100 * 1.5) / (d * root2)) - erfcApprox((h50 * 1.5) / (d * root2)); + double p0Tail = erfcApprox((h50 * 1.5) / (d * root2)); + + double pMaxLN = pMaxHead * pMaxTail; + double p300LN = p300Head * p300Tail; + double p200LN = p200Head * p200Tail; + double p100LN = p100Note * p100Tail; + double p50LN = p50Note * p50Tail; + double p0LN = p0Note * p0Tail; double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; @@ -134,12 +139,12 @@ double legacyLikelihoodGradient(double d) double p50 = ((p50Note * attributes.NoteCount) + (p50LN * attributes.HoldNoteCount)) / totalHits; double p0 = ((p0Note * attributes.NoteCount) + (p0LN * attributes.HoldNoteCount)) / totalHits; - double gradient = Math.Pow(pMax, countPerfect / totalHitsP1) - * Math.Pow(p300, countGreat / totalHitsP1) - * Math.Pow(p200, countGood / totalHitsP1) - * Math.Pow(p100, countOk / totalHitsP1) - * Math.Pow(p50, countMeh / totalHitsP1) - * Math.Pow(p0, countMiss / totalHitsP1); + double gradient = Math.Pow(pMax, countPerfect / totalHits) + * Math.Pow(p300, (countGreat + 0.5) / totalHits) + * Math.Pow(p200, countGood / totalHits) + * Math.Pow(p100, countOk / totalHits) + * Math.Pow(p50, countMeh / totalHits) + * Math.Pow(p0, countMiss / totalHits); return -gradient; } @@ -170,18 +175,18 @@ double lazerLikelihoodGradient(double d) double p50 = ((p50Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p50Tail * attributes.HoldNoteCount)) / totalHits; double p0 = ((p0Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p0Tail * attributes.HoldNoteCount)) / totalHits; - double gradient = Math.Pow(pMax, countPerfect / totalHitsP1) - * Math.Pow(p300, countGreat / totalHitsP1) - * Math.Pow(p200, countGood / totalHitsP1) - * Math.Pow(p100, countOk / totalHitsP1) - * Math.Pow(p50, countMeh / totalHitsP1) - * Math.Pow(p0, countMiss / totalHitsP1); + double gradient = Math.Pow(pMax, countPerfect / totalHits) + * Math.Pow(p300, (countGreat + 0.5) / totalHits) + * Math.Pow(p200, countGood / totalHits) + * Math.Pow(p100, countOk / totalHits) + * Math.Pow(p50, countMeh / totalHits) + * Math.Pow(p0, countMiss / totalHits); return -gradient; } // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play - if (isLegacyScore) + if (isLegacyScore) return FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30); else return FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); @@ -243,14 +248,14 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a return judgements; } - - double erfcApprox(double x) + + private double erfcApprox(double x) { if (x <= 5) return SpecialFunctions.Erfc(x); // This approximation is very accurate with values over 5, and is much more performant than the Erfc function return Math.Exp(-Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); - } + } } } diff --git a/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs b/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs index 4a070e70b42f..9b7128d878ae 100644 --- a/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs +++ b/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs @@ -5,12 +5,12 @@ using System.Collections.Generic; using osu.Framework.Graphics; -using osuTK; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; using osu.Game.Rulesets.UI.Scrolling; +using osuTK; namespace osu.Game.Rulesets.Mania.Edit { diff --git a/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs b/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs index 0a697ca986f9..28c3426b4878 100644 --- a/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs +++ b/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs @@ -3,9 +3,9 @@ #nullable disable +using System.Collections.Generic; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.UI; -using System.Collections.Generic; namespace osu.Game.Rulesets.Mania.Edit { diff --git a/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs b/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs index 4d9382624097..428356928976 100644 --- a/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs +++ b/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs @@ -98,12 +98,12 @@ private static void heapsort(T[] keys, int lo, int hi, IComparer comparer) int n = hi - lo + 1; - for (int i = n / 2; i >= 1; i = i - 1) + for (int i = n / 2; i >= 1; i--) { downHeap(keys, i, n, lo, comparer); } - for (int i = n; i > 1; i = i - 1) + for (int i = n; i > 1; i--) { swap(keys, lo, lo + i - 1); downHeap(keys, 1, i - 1, lo, comparer); diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs index 2b0098744f12..8a2104ffbdcd 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs @@ -2,14 +2,14 @@ // See the LICENCE file in the repository root for full licence text. using System; +using System.Collections.Generic; using System.Linq; -using osu.Game.Beatmaps; -using osu.Game.Rulesets.Mania.Objects; -using osu.Game.Rulesets.Mods; using osu.Framework.Graphics.Sprites; -using System.Collections.Generic; using osu.Framework.Localisation; +using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Beatmaps; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Mods; namespace osu.Game.Rulesets.Mania.Mods { diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs index f9690b42985b..e7f432df5c53 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs @@ -1,13 +1,13 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.Extensions.IEnumerableExtensions; -using osu.Game.Rulesets.Mania.Objects; -using osu.Game.Rulesets.Mods; using System.Linq; +using osu.Framework.Extensions.IEnumerableExtensions; using osu.Framework.Localisation; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Beatmaps; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Mods; namespace osu.Game.Rulesets.Mania.Mods { diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs index 1aa6ee25074d..7011ad0fd6fd 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs @@ -28,7 +28,7 @@ public DrawableHoldNoteHead(HeadNote headNote) Origin = Anchor.TopCentre; } - public bool UpdateResult() => base.UpdateResult(true); + public bool UpdateResult() => UpdateResult(true); protected override void UpdateHitStateTransforms(ArmedState state) { diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs index bf477277c641..844a8b249afe 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs @@ -38,7 +38,7 @@ public DrawableHoldNoteTail(TailNote tailNote) Origin = Anchor.TopCentre; } - public void UpdateResult() => base.UpdateResult(true); + public void UpdateResult() => UpdateResult(true); public override double MaximumJudgementOffset => base.MaximumJudgementOffset * release_window_lenience; diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs index 8498fd36de3a..80a2dfd4dc02 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs @@ -8,9 +8,9 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; +using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.UI.Scrolling; -using osu.Game.Rulesets.Mania.UI; namespace osu.Game.Rulesets.Mania.Objects.Drawables { diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index e3ebadc836ad..934c9edb1e1e 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -3,12 +3,12 @@ #nullable disable -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects; From 6f5e03ca5941167eba7d8f91b643861bea844901 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 27 Jan 2023 14:41:06 -0500 Subject: [PATCH 19/87] change legacy LN calculation --- .../Difficulty/ManiaPerformanceCalculator.cs | 45 ++++++++++++------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f7edb266e376..e4ef3c2a2bba 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -114,23 +114,34 @@ double legacyLikelihoodGradient(double d) double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); double p0Note = erfcApprox(h50 / (d * root2)); - double pMaxHead = 1 - erfcApprox((hMax * 1.2) / (d * root2)); - double p300Head = erfcApprox((hMax * 1.2) / (d * root2)) - erfcApprox(h300 * 1.1) / (d * root2); - double p200Head = erfcApprox((h300 * 1.1) / (d * root2)) - erfcApprox(h200 / (d * root2)); - - double pMaxTail = 1 - erfcApprox((hMax * 1.5 * 1.2) / (d * root2)); - double p300Tail = erfcApprox((hMax * 1.5 * 1.2) / (d * root2)) - erfcApprox((h300 * 1.5 * 1.1) / (d * root2)); - double p200Tail = erfcApprox((h300 * 1.5 * 1.1) / (d * root2)) - erfcApprox((h200 * 1.5) / (d * root2)); - double p100Tail = erfcApprox((h200 * 1.5) / (d * root2)) - erfcApprox((h100 * 1.5) / (d * root2)); - double p50Tail = erfcApprox((h100 * 1.5) / (d * root2)) - erfcApprox((h50 * 1.5) / (d * root2)); - double p0Tail = erfcApprox((h50 * 1.5) / (d * root2)); - - double pMaxLN = pMaxHead * pMaxTail; - double p300LN = p300Head * p300Tail; - double p200LN = p200Head * p200Tail; - double p100LN = p100Note * p100Tail; - double p50LN = p50Note * p50Tail; - double p0LN = p0Note * p0Tail; + // Effective hit window for LN tails, takes a value between 1 and 2. Lower results in a lower estimated deviation. + double tailMultipler = 1.5; + + double pMaxLN = 1 - (erfcApprox((hMax * 1.2) / (d * root2)) + erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2)) + - erfcApprox((hMax * 1.2) / (d * root2)) * erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2))); + + double p300LN = (erfcApprox((hMax * 1.2) / (d * root2)) + erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2)) + - erfcApprox((hMax * 1.2) / (d * root2)) * erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2))) + - (erfcApprox((h300 * 1.1) / (d * root2)) + erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2)) + - erfcApprox((h300 * 1.1) / (d * root2)) * erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2))); + + double p200LN = (erfcApprox((h300 * 1.1) / (d * root2)) + erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2)) + - erfcApprox((h300 * 1.1) / (d * root2)) * erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2))) + - (erfcApprox(h200 / (d * root2)) + erfcApprox((h200 * tailMultipler) / (d * root2)) + - erfcApprox(h200 / (d * root2)) * erfcApprox((h200 * tailMultipler) / (d * root2))); + + double p100LN = (erfcApprox(h200 / (d * root2)) + erfcApprox((h200 * tailMultipler) / (d * root2)) + - erfcApprox(h200 / (d * root2)) * erfcApprox((h200 * tailMultipler) / (d * root2))) + - (erfcApprox(h100 / (d * root2)) + erfcApprox((h100 * tailMultipler) / (d * root2)) + - erfcApprox(h100 / (d * root2)) * erfcApprox((h100 * tailMultipler) / (d * root2))); + + double p50LN = (erfcApprox(h100 / (d * root2)) + erfcApprox((h100 * tailMultipler) / (d * root2)) + - erfcApprox(h100 / (d * root2)) * erfcApprox((h100 * tailMultipler) / (d * root2))) + - (erfcApprox(h50 / (d * root2)) + erfcApprox((h50 * tailMultipler) / (d * root2)) + - erfcApprox(h50 / (d * root2)) * erfcApprox((h50 * tailMultipler) / (d * root2))); + + double p0LN = erfcApprox(h50 / (d * root2)) + erfcApprox((h50 * tailMultipler) / (d * root2)) + - erfcApprox(h50 / (d * root2)) * erfcApprox((h50 * tailMultipler) / (d * root2)); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; From c331058b610aab85c04be87de03bc8a77b3f05e1 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 27 Jan 2023 15:23:03 -0500 Subject: [PATCH 20/87] switch to totalvalue --- .../Difficulty/ManiaPerformanceCalculator.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index e4ef3c2a2bba..b51e41592cbf 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -58,8 +58,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s return new ManiaPerformanceAttributes { Difficulty = difficultyValue, - // Total = totalValue, - Total = estimatedUR, + Total = totalValue, EstimatedUR = estimatedUR }; } @@ -114,7 +113,7 @@ double legacyLikelihoodGradient(double d) double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); double p0Note = erfcApprox(h50 / (d * root2)); - // Effective hit window for LN tails, takes a value between 1 and 2. Lower results in a lower estimated deviation. + // Effective hit window for LN tails, takes a value between 1 and 2. A lower value results in a lower estimated deviation. double tailMultipler = 1.5; double pMaxLN = 1 - (erfcApprox((hMax * 1.2) / (d * root2)) + erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2)) From bc7fd8d0cfe6c1fa44244737f11a04b522346912 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 27 Jan 2023 15:36:45 -0500 Subject: [PATCH 21/87] add comments --- .../Difficulty/ManiaPerformanceCalculator.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index b51e41592cbf..31fc1733c985 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -113,9 +113,13 @@ double legacyLikelihoodGradient(double d) double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); double p0Note = erfcApprox(h50 / (d * root2)); - // Effective hit window for LN tails, takes a value between 1 and 2. A lower value results in a lower estimated deviation. + // Effective hit window for LN tails, takes a value between 1 and 2. This is because the hit window for LN tails in stable + // arent static, and depend on the previous hit. A lower value results in a lower estimated deviation. double tailMultipler = 1.5; + // P(A) + P(B) - P(AB) is the probability of either event A or B happening or both events happening, + // and in this case it is the probability of either on an LN landing outside of the hit window. The formulas are formatted such that it is + // (P(A_1) + P(B_1) - P(A_1 * B_1)) - (P(A_2) + P(B_2) - P(A_2 * B_2)). double pMaxLN = 1 - (erfcApprox((hMax * 1.2) / (d * root2)) + erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2)) - erfcApprox((hMax * 1.2) / (d * root2)) * erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2))); @@ -171,6 +175,7 @@ double lazerLikelihoodGradient(double d) double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); double p0Note = erfcApprox(h50 / (d * root2)); + // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. double pMaxTail = 1 - erfcApprox((hMax * 1.5) / (d * root2)); double p300Tail = erfcApprox((hMax * 1.5) / (d * root2)) - erfcApprox((h300 * 1.5) / (d * root2)); double p200Tail = erfcApprox((h300 * 1.5) / (d * root2)) - erfcApprox((h200 * 1.5) / (d * root2)); From 80128d203f860e2b29cc346d75dfa5fe1725137c Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 31 Jan 2023 16:59:27 -0500 Subject: [PATCH 22/87] rewrite everything with erf for simplicity --- .../Difficulty/ManiaPerformanceCalculator.cs | 83 ++++++++----------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 31fc1733c985..b174217ff2c4 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -106,45 +106,34 @@ double legacyLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMaxNote = 1 - erfcApprox(hMax / (d * root2)); - double p300Note = erfcApprox(hMax / (d * root2)) - erfcApprox(h300 / (d * root2)); - double p200Note = erfcApprox(h300 / (d * root2)) - erfcApprox(h200 / (d * root2)); - double p100Note = erfcApprox(h200 / (d * root2)) - erfcApprox(h100 / (d * root2)); - double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); - double p0Note = erfcApprox(h50 / (d * root2)); + double pMaxNote = erfApprox(hMax / (d * root2)); + double p300Note = erfApprox(h300 / (d * root2)) - erfApprox(hMax / (d * root2)); + double p200Note = erfApprox(h200 / (d * root2)) - erfApprox(h300 / (d * root2)); + double p100Note = erfApprox(h100 / (d * root2)) - erfApprox(h200 / (d * root2)); + double p50Note = erfApprox(h50 / (d * root2)) - erfApprox(h100 / (d * root2)); + double p0Note = 1 - erfApprox(h50 / (d * root2)); // Effective hit window for LN tails, takes a value between 1 and 2. This is because the hit window for LN tails in stable - // arent static, and depend on the previous hit. A lower value results in a lower estimated deviation. + // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. double tailMultipler = 1.5; - // P(A) + P(B) - P(AB) is the probability of either event A or B happening or both events happening, - // and in this case it is the probability of either on an LN landing outside of the hit window. The formulas are formatted such that it is - // (P(A_1) + P(B_1) - P(A_1 * B_1)) - (P(A_2) + P(B_2) - P(A_2 * B_2)). - double pMaxLN = 1 - (erfcApprox((hMax * 1.2) / (d * root2)) + erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2)) - - erfcApprox((hMax * 1.2) / (d * root2)) * erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2))); + // Since long notes only give a specific judgement if both both hits end up within a certain hit window, + // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. + double pMaxLN = erfApprox((hMax * 1.2) / (d * root2)) * erfApprox((hMax * 1.2 * tailMultipler) / (d * root2)); - double p300LN = (erfcApprox((hMax * 1.2) / (d * root2)) + erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2)) - - erfcApprox((hMax * 1.2) / (d * root2)) * erfcApprox((hMax * 1.2 * tailMultipler) / (d * root2))) - - (erfcApprox((h300 * 1.1) / (d * root2)) + erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2)) - - erfcApprox((h300 * 1.1) / (d * root2)) * erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2))); + double p300LN = erfApprox((h300 * 1.1) / (d * root2)) * erfApprox((h300 * 1.1 * tailMultipler) / (d * root2)) + - erfApprox((hMax * 1.2) / (d * root2)) * erfApprox((hMax * 1.2 * tailMultipler) / (d * root2)); - double p200LN = (erfcApprox((h300 * 1.1) / (d * root2)) + erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2)) - - erfcApprox((h300 * 1.1) / (d * root2)) * erfcApprox((h300 * 1.1 * tailMultipler) / (d * root2))) - - (erfcApprox(h200 / (d * root2)) + erfcApprox((h200 * tailMultipler) / (d * root2)) - - erfcApprox(h200 / (d * root2)) * erfcApprox((h200 * tailMultipler) / (d * root2))); + double p200LN = erfApprox(h200 / (d * root2)) * erfApprox((h200 * tailMultipler) / (d * root2)) + - erfApprox((h300 * 1.1) / (d * root2)) * erfApprox((h300 * 1.1 * tailMultipler) / (d * root2)); - double p100LN = (erfcApprox(h200 / (d * root2)) + erfcApprox((h200 * tailMultipler) / (d * root2)) - - erfcApprox(h200 / (d * root2)) * erfcApprox((h200 * tailMultipler) / (d * root2))) - - (erfcApprox(h100 / (d * root2)) + erfcApprox((h100 * tailMultipler) / (d * root2)) - - erfcApprox(h100 / (d * root2)) * erfcApprox((h100 * tailMultipler) / (d * root2))); + double p100LN = erfApprox(h100 / (d * root2)) * erfApprox((h100 * tailMultipler) / (d * root2)) + - erfApprox(h200 / (d * root2)) * erfApprox((h200 * tailMultipler) / (d * root2)); - double p50LN = (erfcApprox(h100 / (d * root2)) + erfcApprox((h100 * tailMultipler) / (d * root2)) - - erfcApprox(h100 / (d * root2)) * erfcApprox((h100 * tailMultipler) / (d * root2))) - - (erfcApprox(h50 / (d * root2)) + erfcApprox((h50 * tailMultipler) / (d * root2)) - - erfcApprox(h50 / (d * root2)) * erfcApprox((h50 * tailMultipler) / (d * root2))); + double p50LN = erfApprox(h50 / (d * root2)) * erfApprox((h50 * tailMultipler) / (d * root2)) + - erfApprox(h100 / (d * root2)) * erfApprox((h100 * tailMultipler) / (d * root2)); - double p0LN = erfcApprox(h50 / (d * root2)) + erfcApprox((h50 * tailMultipler) / (d * root2)) - - erfcApprox(h50 / (d * root2)) * erfcApprox((h50 * tailMultipler) / (d * root2)); + double p0LN = 1 - erfApprox(h50 / (d * root2)) * erfApprox((h50 * tailMultipler) / (d * root2)); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; @@ -168,20 +157,20 @@ double lazerLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMaxNote = 1 - erfcApprox(hMax / (d * root2)); - double p300Note = erfcApprox(hMax / (d * root2)) - erfcApprox(h300 / (d * root2)); - double p200Note = erfcApprox(h300 / (d * root2)) - erfcApprox(h200 / (d * root2)); - double p100Note = erfcApprox(h200 / (d * root2)) - erfcApprox(h100 / (d * root2)); - double p50Note = erfcApprox(h100 / (d * root2)) - erfcApprox(h50 / (d * root2)); - double p0Note = erfcApprox(h50 / (d * root2)); + double pMaxNote = erfApprox(hMax / (d * root2)); + double p300Note = erfApprox(h300 / (d * root2)) - erfApprox(hMax / (d * root2)); + double p200Note = erfApprox(h200 / (d * root2)) - erfApprox(h300 / (d * root2)); + double p100Note = erfApprox(h100 / (d * root2)) - erfApprox(h200 / (d * root2)); + double p50Note = erfApprox(h50 / (d * root2)) - erfApprox(h100 / (d * root2)); + double p0Note = 1 - erfApprox(h50 / (d * root2)); // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. - double pMaxTail = 1 - erfcApprox((hMax * 1.5) / (d * root2)); - double p300Tail = erfcApprox((hMax * 1.5) / (d * root2)) - erfcApprox((h300 * 1.5) / (d * root2)); - double p200Tail = erfcApprox((h300 * 1.5) / (d * root2)) - erfcApprox((h200 * 1.5) / (d * root2)); - double p100Tail = erfcApprox((h200 * 1.5) / (d * root2)) - erfcApprox((h100 * 1.5) / (d * root2)); - double p50Tail = erfcApprox((h100 * 1.5) / (d * root2)) - erfcApprox((h50 * 1.5) / (d * root2)); - double p0Tail = erfcApprox((h50 * 1.5) / (d * root2)); + double pMaxTail = erfApprox((hMax * 1.5) / (d * root2)); + double p300Tail = erfApprox((h300 * 1.5) / (d * root2)) - erfApprox((hMax * 1.5) / (d * root2)); + double p200Tail = erfApprox((h200 * 1.5) / (d * root2)) - erfApprox((h300 * 1.5) / (d * root2)); + double p100Tail = erfApprox((h100 * 1.5) / (d * root2)) - erfApprox((h200 * 1.5) / (d * root2)); + double p50Tail = erfApprox((h50 * 1.5) / (d * root2)) - erfApprox((h100 * 1.5) / (d * root2)); + double p0Tail = 1 - erfApprox((h50 * 1.5) / (d * root2)); double pMax = ((pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount)) + (pMaxTail * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p300Tail * attributes.HoldNoteCount)) / totalHits; @@ -200,7 +189,7 @@ double lazerLikelihoodGradient(double d) return -gradient; } - // Finding the minimum of the inverse likelihood function returns the most likely deviation for a play + // Finding the minimum of the function returns the most likely deviation for the hit results. if (isLegacyScore) return FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30); else @@ -264,13 +253,13 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a return judgements; } - private double erfcApprox(double x) + private double erfApprox(double x) { if (x <= 5) - return SpecialFunctions.Erfc(x); + return SpecialFunctions.Erf(x); - // This approximation is very accurate with values over 5, and is much more performant than the Erfc function - return Math.Exp(-Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); + // This approximation is very accurate with values over 5, and is much more performant than the Erf function + return 1 - Math.Exp(-Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); } } } From 91fe6a5fd96f96478f9443d0af345a34432ba0a2 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 31 Jan 2023 18:17:15 -0500 Subject: [PATCH 23/87] change isLegacy toggle --- .../Difficulty/ManiaPerformanceCalculator.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index b174217ff2c4..517504dec9e0 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -86,7 +86,12 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double[] judgements = new double[5]; // Legacy scores have the same number of judgements and total notes - bool isLegacyScore = totalHits == attributes.NoteCount + attributes.HoldNoteCount; + bool isLegacyScore = false; + + // Temporary workaround for lazer not having classic mania behaviour implemented. + // Classic scores with only Notes will return incorrect values after the replay is watched. + if (score.Mods.Any(m => m is ModClassic) && totalHits == attributes.NoteCount + attributes.HoldNoteCount) + isLegacyScore = true; if (isLegacyScore) judgements = getLegacyJudgements(score, attributes); From 8fb84c22979f59f972d60959929488a351552222 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 31 Jan 2023 18:17:38 -0500 Subject: [PATCH 24/87] whop --- osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 517504dec9e0..030c0bb3a5b6 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -85,7 +85,6 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double[] judgements = new double[5]; - // Legacy scores have the same number of judgements and total notes bool isLegacyScore = false; // Temporary workaround for lazer not having classic mania behaviour implemented. From 68cea94c218c3fa32448bca294792614e1113db2 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 6 Feb 2023 17:43:22 -0500 Subject: [PATCH 25/87] readability bump --- .../Difficulty/ManiaPerformanceCalculator.cs | 65 ++++++++++--------- 1 file changed, 35 insertions(+), 30 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 030c0bb3a5b6..263b132b5509 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -110,34 +110,34 @@ double legacyLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMaxNote = erfApprox(hMax / (d * root2)); - double p300Note = erfApprox(h300 / (d * root2)) - erfApprox(hMax / (d * root2)); - double p200Note = erfApprox(h200 / (d * root2)) - erfApprox(h300 / (d * root2)); - double p100Note = erfApprox(h100 / (d * root2)) - erfApprox(h200 / (d * root2)); - double p50Note = erfApprox(h50 / (d * root2)) - erfApprox(h100 / (d * root2)); - double p0Note = 1 - erfApprox(h50 / (d * root2)); - - // Effective hit window for LN tails, takes a value between 1 and 2. This is because the hit window for LN tails in stable + double pMaxNote = normalCdf(hMax, d); + double p300Note = normalCdf(h300, d) - normalCdf(hMax, d); + double p200Note = normalCdf(h200, d) - normalCdf(h300, d); + double p100Note = normalCdf(h100, d) - normalCdf(h200, d); + double p50Note = normalCdf(h50, d) - normalCdf(h100, d); + double p0Note = 1 - normalCdf(h50, d); + + // Effective hit window for LN tails. Should be a value between 1 and 2. This is because the hit window for LN tails in stable // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. double tailMultipler = 1.5; // Since long notes only give a specific judgement if both both hits end up within a certain hit window, // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - double pMaxLN = erfApprox((hMax * 1.2) / (d * root2)) * erfApprox((hMax * 1.2 * tailMultipler) / (d * root2)); + double pMaxLN = normalCdf(hMax * 1.2, d) * normalCdf(hMax * 1.2 * tailMultipler, d); - double p300LN = erfApprox((h300 * 1.1) / (d * root2)) * erfApprox((h300 * 1.1 * tailMultipler) / (d * root2)) - - erfApprox((hMax * 1.2) / (d * root2)) * erfApprox((hMax * 1.2 * tailMultipler) / (d * root2)); + double p300LN = normalCdf(h300 * 1.1, d) * normalCdf(h300 * 1.1 * tailMultipler, d) + - normalCdf(hMax * 1.2, d) * normalCdf(hMax * 1.2 * tailMultipler, d); - double p200LN = erfApprox(h200 / (d * root2)) * erfApprox((h200 * tailMultipler) / (d * root2)) - - erfApprox((h300 * 1.1) / (d * root2)) * erfApprox((h300 * 1.1 * tailMultipler) / (d * root2)); + double p200LN = normalCdf(h200, d) * normalCdf(h200 * tailMultipler, d) + - normalCdf(h300 * 1.1, d) * normalCdf(h300 * 1.1 * tailMultipler, d); - double p100LN = erfApprox(h100 / (d * root2)) * erfApprox((h100 * tailMultipler) / (d * root2)) - - erfApprox(h200 / (d * root2)) * erfApprox((h200 * tailMultipler) / (d * root2)); + double p100LN = normalCdf(h100, d) * normalCdf(h100 * tailMultipler, d) + - normalCdf(h200, d) * normalCdf(h200 * tailMultipler, d); - double p50LN = erfApprox(h50 / (d * root2)) * erfApprox((h50 * tailMultipler) / (d * root2)) - - erfApprox(h100 / (d * root2)) * erfApprox((h100 * tailMultipler) / (d * root2)); + double p50LN = normalCdf(h50, d) * normalCdf(h50 * tailMultipler, d) + - normalCdf(h100, d) * normalCdf(h100 * tailMultipler, d); - double p0LN = 1 - erfApprox(h50 / (d * root2)) * erfApprox((h50 * tailMultipler) / (d * root2)); + double p0LN = 1 - normalCdf(h50, d) * normalCdf(h50 * tailMultipler, d); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; @@ -161,20 +161,20 @@ double lazerLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMaxNote = erfApprox(hMax / (d * root2)); - double p300Note = erfApprox(h300 / (d * root2)) - erfApprox(hMax / (d * root2)); - double p200Note = erfApprox(h200 / (d * root2)) - erfApprox(h300 / (d * root2)); - double p100Note = erfApprox(h100 / (d * root2)) - erfApprox(h200 / (d * root2)); - double p50Note = erfApprox(h50 / (d * root2)) - erfApprox(h100 / (d * root2)); - double p0Note = 1 - erfApprox(h50 / (d * root2)); + double pMaxNote = normalCdf(hMax, d); + double p300Note = normalCdf(h300, d) - normalCdf(hMax, d); + double p200Note = normalCdf(h200, d) - normalCdf(h300, d); + double p100Note = normalCdf(h100, d) - normalCdf(h200, d); + double p50Note = normalCdf(h50, d) - normalCdf(h100, d); + double p0Note = 1 - normalCdf(h50, d); // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. - double pMaxTail = erfApprox((hMax * 1.5) / (d * root2)); - double p300Tail = erfApprox((h300 * 1.5) / (d * root2)) - erfApprox((hMax * 1.5) / (d * root2)); - double p200Tail = erfApprox((h200 * 1.5) / (d * root2)) - erfApprox((h300 * 1.5) / (d * root2)); - double p100Tail = erfApprox((h100 * 1.5) / (d * root2)) - erfApprox((h200 * 1.5) / (d * root2)); - double p50Tail = erfApprox((h50 * 1.5) / (d * root2)) - erfApprox((h100 * 1.5) / (d * root2)); - double p0Tail = 1 - erfApprox((h50 * 1.5) / (d * root2)); + double pMaxTail = normalCdf(hMax * 1.5, d); + double p300Tail = normalCdf(h300 * 1.5, d) - normalCdf(hMax * 1.5, d); + double p200Tail = normalCdf(h200 * 1.5, d) - normalCdf(h300 * 1.5, d); + double p100Tail = normalCdf(h100 * 1.5, d) - normalCdf(h200 * 1.5, d); + double p50Tail = normalCdf(h50 * 1.5, d) - normalCdf(h100 * 1.5, d); + double p0Tail = 1 - normalCdf(h50 * 1.5, d); double pMax = ((pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount)) + (pMaxTail * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p300Tail * attributes.HoldNoteCount)) / totalHits; @@ -257,6 +257,11 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a return judgements; } + private double normalCdf(double x, double deviation) + { + return erfApprox(x / (deviation * Math.Sqrt(2))); + } + private double erfApprox(double x) { if (x <= 5) From 4535b297fb0bcdf2f740fef21b21bdac01fd5497 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 6 Feb 2023 17:48:18 -0500 Subject: [PATCH 26/87] rename method --- .../Difficulty/ManiaPerformanceCalculator.cs | 58 +++++++++---------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 263b132b5509..e46f163e50d7 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -110,12 +110,12 @@ double legacyLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMaxNote = normalCdf(hMax, d); - double p300Note = normalCdf(h300, d) - normalCdf(hMax, d); - double p200Note = normalCdf(h200, d) - normalCdf(h300, d); - double p100Note = normalCdf(h100, d) - normalCdf(h200, d); - double p50Note = normalCdf(h50, d) - normalCdf(h100, d); - double p0Note = 1 - normalCdf(h50, d); + double pMaxNote = hitProb(hMax, d); + double p300Note = hitProb(h300, d) - hitProb(hMax, d); + double p200Note = hitProb(h200, d) - hitProb(h300, d); + double p100Note = hitProb(h100, d) - hitProb(h200, d); + double p50Note = hitProb(h50, d) - hitProb(h100, d); + double p0Note = 1 - hitProb(h50, d); // Effective hit window for LN tails. Should be a value between 1 and 2. This is because the hit window for LN tails in stable // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. @@ -123,21 +123,21 @@ double legacyLikelihoodGradient(double d) // Since long notes only give a specific judgement if both both hits end up within a certain hit window, // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - double pMaxLN = normalCdf(hMax * 1.2, d) * normalCdf(hMax * 1.2 * tailMultipler, d); + double pMaxLN = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); - double p300LN = normalCdf(h300 * 1.1, d) * normalCdf(h300 * 1.1 * tailMultipler, d) - - normalCdf(hMax * 1.2, d) * normalCdf(hMax * 1.2 * tailMultipler, d); + double p300LN = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d) + - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); - double p200LN = normalCdf(h200, d) * normalCdf(h200 * tailMultipler, d) - - normalCdf(h300 * 1.1, d) * normalCdf(h300 * 1.1 * tailMultipler, d); + double p200LN = hitProb(h200, d) * hitProb(h200 * tailMultipler, d) + - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d); - double p100LN = normalCdf(h100, d) * normalCdf(h100 * tailMultipler, d) - - normalCdf(h200, d) * normalCdf(h200 * tailMultipler, d); + double p100LN = hitProb(h100, d) * hitProb(h100 * tailMultipler, d) + - hitProb(h200, d) * hitProb(h200 * tailMultipler, d); - double p50LN = normalCdf(h50, d) * normalCdf(h50 * tailMultipler, d) - - normalCdf(h100, d) * normalCdf(h100 * tailMultipler, d); + double p50LN = hitProb(h50, d) * hitProb(h50 * tailMultipler, d) + - hitProb(h100, d) * hitProb(h100 * tailMultipler, d); - double p0LN = 1 - normalCdf(h50, d) * normalCdf(h50 * tailMultipler, d); + double p0LN = 1 - hitProb(h50, d) * hitProb(h50 * tailMultipler, d); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; @@ -161,20 +161,20 @@ double lazerLikelihoodGradient(double d) if (d <= 0) return double.PositiveInfinity; - double pMaxNote = normalCdf(hMax, d); - double p300Note = normalCdf(h300, d) - normalCdf(hMax, d); - double p200Note = normalCdf(h200, d) - normalCdf(h300, d); - double p100Note = normalCdf(h100, d) - normalCdf(h200, d); - double p50Note = normalCdf(h50, d) - normalCdf(h100, d); - double p0Note = 1 - normalCdf(h50, d); + double pMaxNote = hitProb(hMax, d); + double p300Note = hitProb(h300, d) - hitProb(hMax, d); + double p200Note = hitProb(h200, d) - hitProb(h300, d); + double p100Note = hitProb(h100, d) - hitProb(h200, d); + double p50Note = hitProb(h50, d) - hitProb(h100, d); + double p0Note = 1 - hitProb(h50, d); // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. - double pMaxTail = normalCdf(hMax * 1.5, d); - double p300Tail = normalCdf(h300 * 1.5, d) - normalCdf(hMax * 1.5, d); - double p200Tail = normalCdf(h200 * 1.5, d) - normalCdf(h300 * 1.5, d); - double p100Tail = normalCdf(h100 * 1.5, d) - normalCdf(h200 * 1.5, d); - double p50Tail = normalCdf(h50 * 1.5, d) - normalCdf(h100 * 1.5, d); - double p0Tail = 1 - normalCdf(h50 * 1.5, d); + double pMaxTail = hitProb(hMax * 1.5, d); + double p300Tail = hitProb(h300 * 1.5, d) - hitProb(hMax * 1.5, d); + double p200Tail = hitProb(h200 * 1.5, d) - hitProb(h300 * 1.5, d); + double p100Tail = hitProb(h100 * 1.5, d) - hitProb(h200 * 1.5, d); + double p50Tail = hitProb(h50 * 1.5, d) - hitProb(h100 * 1.5, d); + double p0Tail = 1 - hitProb(h50 * 1.5, d); double pMax = ((pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount)) + (pMaxTail * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p300Tail * attributes.HoldNoteCount)) / totalHits; @@ -257,7 +257,7 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a return judgements; } - private double normalCdf(double x, double deviation) + private double hitProb(double x, double deviation) { return erfApprox(x / (deviation * Math.Sqrt(2))); } From b0cd729b886802a323ddd4eed810e6a272bbf4fb Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 11 Feb 2023 22:25:39 -0500 Subject: [PATCH 27/87] fix convert OD with lazer judgements --- .../Difficulty/ManiaPerformanceCalculator.cs | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index e46f163e50d7..767955710760 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -233,11 +233,6 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a score.Mods.OfType().ForEach(m => m.ApplyToTrack(track)); double clockRate = track.Rate; - double overallDifficulty = attributes.OverallDifficulty; - - if (attributes.Convert) - overallDifficulty = 10; - double windowMultiplier = 1 / clockRate; if (score.Mods.Any(m => m is ModHardRock)) @@ -245,14 +240,14 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a else if (score.Mods.Any(m => m is ModEasy)) windowMultiplier *= 1.4; - if (overallDifficulty < 5) - judgements[0] = (22.4 - 0.6 * overallDifficulty) * windowMultiplier; + if (attributes.OverallDifficulty < 5) + judgements[0] = (22.4 - 0.6 * attributes.OverallDifficulty) * windowMultiplier; else - judgements[0] = (24.9 - 1.1 * overallDifficulty) * windowMultiplier; - judgements[1] = (64 - 3 * overallDifficulty) * windowMultiplier; - judgements[2] = (97 - 3 * overallDifficulty) * windowMultiplier; - judgements[3] = (127 - 3 * overallDifficulty) * windowMultiplier; - judgements[4] = (151 - 3 * overallDifficulty) * windowMultiplier; + judgements[0] = (24.9 - 1.1 * attributes.OverallDifficulty) * windowMultiplier; + judgements[1] = (64 - 3 * attributes.OverallDifficulty) * windowMultiplier; + judgements[2] = (97 - 3 * attributes.OverallDifficulty) * windowMultiplier; + judgements[3] = (127 - 3 * attributes.OverallDifficulty) * windowMultiplier; + judgements[4] = (151 - 3 * attributes.OverallDifficulty) * windowMultiplier; return judgements; } From 2b5ab4169c039ae537efc5cde75f67a74cb8e1a7 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 11 Feb 2023 23:08:45 -0500 Subject: [PATCH 28/87] Revert unrelated files changed in formatting commit --- osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs | 8 ++++---- .../Patterns/Legacy/DistanceObjectPatternGenerator.cs | 6 +++--- .../Patterns/Legacy/EndTimeObjectPatternGenerator.cs | 4 ++-- .../Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs | 4 ++-- .../Edit/DrawableManiaEditorRuleset.cs | 2 +- osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs | 2 +- osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs | 4 ++-- osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs | 8 ++++---- osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs | 6 +++--- .../Objects/Drawables/DrawableHoldNoteHead.cs | 2 +- .../Objects/Drawables/DrawableHoldNoteTail.cs | 2 +- .../Objects/Drawables/DrawableManiaHitObject.cs | 2 +- osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs | 4 ++-- 13 files changed, 27 insertions(+), 27 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs index 0d06d8007a1b..632b7cdcc715 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/ManiaBeatmapConverter.cs @@ -3,17 +3,17 @@ #nullable disable +using osu.Game.Rulesets.Mania.Objects; using System; -using System.Collections.Generic; using System.Linq; +using System.Collections.Generic; using System.Threading; using osu.Game.Audio; using osu.Game.Beatmaps; -using osu.Game.Rulesets.Mania.Beatmaps.Patterns; -using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy; -using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; +using osu.Game.Rulesets.Mania.Beatmaps.Patterns; +using osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy; using osu.Game.Utils; using osuTK; diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs index e0339c7f5059..2bdd0e16ad6e 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/DistanceObjectPatternGenerator.cs @@ -10,11 +10,11 @@ using osu.Framework.Extensions.EnumExtensions; using osu.Game.Audio; using osu.Game.Beatmaps; -using osu.Game.Beatmaps.ControlPoints; -using osu.Game.Beatmaps.Formats; -using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Beatmaps.ControlPoints; +using osu.Game.Beatmaps.Formats; using osu.Game.Utils; namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs index e09061697f39..630fdf7ae2e2 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/EndTimeObjectPatternGenerator.cs @@ -4,12 +4,12 @@ #nullable disable using System.Collections.Generic; +using osu.Game.Rulesets.Objects; +using osu.Game.Rulesets.Objects.Types; using System.Linq; using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Objects; -using osu.Game.Rulesets.Objects; -using osu.Game.Rulesets.Objects.Types; using osu.Game.Utils; namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy diff --git a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs index d2123f49aa84..912cac4fe411 100644 --- a/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs +++ b/osu.Game.Rulesets.Mania/Beatmaps/Patterns/Legacy/HitObjectPatternGenerator.cs @@ -7,15 +7,15 @@ using System.Collections.Generic; using System.Linq; using osu.Framework.Extensions.EnumExtensions; -using osu.Framework.Extensions.IEnumerableExtensions; +using osuTK; using osu.Game.Audio; using osu.Game.Beatmaps; using osu.Game.Beatmaps.ControlPoints; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects; using osu.Game.Rulesets.Objects.Types; +using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Utils; -using osuTK; namespace osu.Game.Rulesets.Mania.Beatmaps.Patterns.Legacy { diff --git a/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs b/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs index 9b7128d878ae..4a070e70b42f 100644 --- a/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs +++ b/osu.Game.Rulesets.Mania/Edit/DrawableManiaEditorRuleset.cs @@ -5,12 +5,12 @@ using System.Collections.Generic; using osu.Framework.Graphics; +using osuTK; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.UI; using osu.Game.Rulesets.UI.Scrolling; -using osuTK; namespace osu.Game.Rulesets.Mania.Edit { diff --git a/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs b/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs index 28c3426b4878..0a697ca986f9 100644 --- a/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs +++ b/osu.Game.Rulesets.Mania/Edit/ManiaEditorPlayfield.cs @@ -3,9 +3,9 @@ #nullable disable -using System.Collections.Generic; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.UI; +using System.Collections.Generic; namespace osu.Game.Rulesets.Mania.Edit { diff --git a/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs b/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs index 428356928976..4d9382624097 100644 --- a/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs +++ b/osu.Game.Rulesets.Mania/MathUtils/LegacySortHelper.cs @@ -98,12 +98,12 @@ private static void heapsort(T[] keys, int lo, int hi, IComparer comparer) int n = hi - lo + 1; - for (int i = n / 2; i >= 1; i--) + for (int i = n / 2; i >= 1; i = i - 1) { downHeap(keys, i, n, lo, comparer); } - for (int i = n; i > 1; i--) + for (int i = n; i > 1; i = i - 1) { swap(keys, lo, lo + i - 1); downHeap(keys, 1, i - 1, lo, comparer); diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs index 8a2104ffbdcd..2b0098744f12 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModHoldOff.cs @@ -2,14 +2,14 @@ // See the LICENCE file in the repository root for full licence text. using System; -using System.Collections.Generic; using System.Linq; -using osu.Framework.Graphics.Sprites; -using osu.Framework.Localisation; using osu.Game.Beatmaps; -using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Mods; +using osu.Framework.Graphics.Sprites; +using System.Collections.Generic; +using osu.Framework.Localisation; +using osu.Game.Rulesets.Mania.Beatmaps; namespace osu.Game.Rulesets.Mania.Mods { diff --git a/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs b/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs index e7f432df5c53..f9690b42985b 100644 --- a/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs +++ b/osu.Game.Rulesets.Mania/Mods/ManiaModMirror.cs @@ -1,13 +1,13 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using System.Linq; using osu.Framework.Extensions.IEnumerableExtensions; +using osu.Game.Rulesets.Mania.Objects; +using osu.Game.Rulesets.Mods; +using System.Linq; using osu.Framework.Localisation; using osu.Game.Beatmaps; using osu.Game.Rulesets.Mania.Beatmaps; -using osu.Game.Rulesets.Mania.Objects; -using osu.Game.Rulesets.Mods; namespace osu.Game.Rulesets.Mania.Mods { diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs index 7011ad0fd6fd..1aa6ee25074d 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteHead.cs @@ -28,7 +28,7 @@ public DrawableHoldNoteHead(HeadNote headNote) Origin = Anchor.TopCentre; } - public bool UpdateResult() => UpdateResult(true); + public bool UpdateResult() => base.UpdateResult(true); protected override void UpdateHitStateTransforms(ArmedState state) { diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs index 844a8b249afe..bf477277c641 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableHoldNoteTail.cs @@ -38,7 +38,7 @@ public DrawableHoldNoteTail(TailNote tailNote) Origin = Anchor.TopCentre; } - public void UpdateResult() => UpdateResult(true); + public void UpdateResult() => base.UpdateResult(true); public override double MaximumJudgementOffset => base.MaximumJudgementOffset * release_window_lenience; diff --git a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs index 80a2dfd4dc02..8498fd36de3a 100644 --- a/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs +++ b/osu.Game.Rulesets.Mania/Objects/Drawables/DrawableManiaHitObject.cs @@ -8,9 +8,9 @@ using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; -using osu.Game.Rulesets.Mania.UI; using osu.Game.Rulesets.Objects.Drawables; using osu.Game.Rulesets.UI.Scrolling; +using osu.Game.Rulesets.Mania.UI; namespace osu.Game.Rulesets.Mania.Objects.Drawables { diff --git a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs index 934c9edb1e1e..e3ebadc836ad 100644 --- a/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs +++ b/osu.Game.Rulesets.Mania/UI/ManiaPlayfield.cs @@ -3,12 +3,12 @@ #nullable disable +using osu.Framework.Graphics; +using osu.Framework.Graphics.Containers; using System; using System.Collections.Generic; using System.Linq; using osu.Framework.Allocation; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; using osu.Game.Rulesets.Mania.Beatmaps; using osu.Game.Rulesets.Mania.Objects; using osu.Game.Rulesets.Objects; From fde20e12165f85f4a097a6d30d11e4c07799d828 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 12 Feb 2023 16:42:08 -0500 Subject: [PATCH 29/87] Add desmos links to likelihood functions --- .../Difficulty/ManiaPerformanceCalculator.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 767955710760..229f6249e171 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -67,7 +67,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve - difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUR), 1.6) - 0.2, 0); + difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUR), 1.6) - 0.2, 0); // UR to multiplier curve, see https://www.desmos.com/calculator/xt58vzt2y4 return difficultyValue; } @@ -87,7 +87,7 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att bool isLegacyScore = false; - // Temporary workaround for lazer not having classic mania behaviour implemented. + // Temporary workaround for lazer not having classic mania behaviour implemented. // Classic scores with only Notes will return incorrect values after the replay is watched. if (score.Mods.Any(m => m is ModClassic) && totalHits == attributes.NoteCount + attributes.HoldNoteCount) isLegacyScore = true; @@ -105,6 +105,7 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double root2 = Math.Sqrt(2); + // https://www.desmos.com/calculator/akinrfls4r double legacyLikelihoodGradient(double d) { if (d <= 0) @@ -156,6 +157,7 @@ double legacyLikelihoodGradient(double d) return -gradient; } + // https://www.desmos.com/calculator/piqxqmnuks double lazerLikelihoodGradient(double d) { if (d <= 0) From 5a0aa24ebccbdfa1426563d95cbf2c8b72a5209b Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 12 Feb 2023 19:05:52 -0500 Subject: [PATCH 30/87] Code quality overhaul --- .../Difficulty/ManiaPerformanceAttributes.cs | 2 +- .../Difficulty/ManiaPerformanceCalculator.cs | 59 ++++++++----------- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs index ee19029bc1c2..ed5165aad1a9 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs @@ -15,7 +15,7 @@ public class ManiaPerformanceAttributes : PerformanceAttributes public double Difficulty { get; set; } [JsonProperty("estimated_ur")] - public double EstimatedUR { get; set; } + public double? EstimatedUr { get; set; } public override IEnumerable GetAttributesForDisplay() { diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 229f6249e171..92c1f678d161 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -24,7 +24,7 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private int countOk; private int countMeh; private int countMiss; - private double estimatedUR; + private double? estimatedUr; public ManiaPerformanceCalculator() : base(new ManiaRuleset()) @@ -41,7 +41,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - estimatedUR = computeEstimatedUR(score, maniaAttributes) * 10; + estimatedUr = computeEstimatedUr(score, maniaAttributes) * 10; // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. // The specific number has no intrinsic meaning and can be adjusted as needed. @@ -59,7 +59,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s { Difficulty = difficultyValue, Total = totalValue, - EstimatedUR = estimatedUR + EstimatedUr = estimatedUr }; } @@ -67,7 +67,10 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve - difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUR), 1.6) - 0.2, 0); // UR to multiplier curve, see https://www.desmos.com/calculator/xt58vzt2y4 + if (estimatedUr == null) + return 0; + + difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUr.Value), 1.6) - 0.2, 0); // UR to multiplier curve, see https://www.desmos.com/calculator/xt58vzt2y4 return difficultyValue; } @@ -78,24 +81,14 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// /// Accuracy used to weight judgements independently from the score's actual accuracy. /// - private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes attributes) + private double? computeEstimatedUr(ScoreInfo score, ManiaDifficultyAttributes attributes) { if (totalSuccessfulHits == 0) - return double.PositiveInfinity; + return null; - double[] judgements = new double[5]; - - bool isLegacyScore = false; + bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalHits == attributes.NoteCount + attributes.HoldNoteCount; - // Temporary workaround for lazer not having classic mania behaviour implemented. - // Classic scores with only Notes will return incorrect values after the replay is watched. - if (score.Mods.Any(m => m is ModClassic) && totalHits == attributes.NoteCount + attributes.HoldNoteCount) - isLegacyScore = true; - - if (isLegacyScore) - judgements = getLegacyJudgements(score, attributes); - else - judgements = getLazerJudgements(score, attributes); + double[] judgements = isLegacyScore ? judgements = getLegacyJudgements(score, attributes) : judgements = getLazerJudgements(score, attributes); double hMax = judgements[0]; double h300 = judgements[1]; @@ -103,13 +96,11 @@ private double computeEstimatedUR(ScoreInfo score, ManiaDifficultyAttributes att double h100 = judgements[3]; double h50 = judgements[4]; - double root2 = Math.Sqrt(2); - // https://www.desmos.com/calculator/akinrfls4r double legacyLikelihoodGradient(double d) { if (d <= 0) - return double.PositiveInfinity; + return 0; double pMaxNote = hitProb(hMax, d); double p300Note = hitProb(h300, d) - hitProb(hMax, d); @@ -120,32 +111,32 @@ double legacyLikelihoodGradient(double d) // Effective hit window for LN tails. Should be a value between 1 and 2. This is because the hit window for LN tails in stable // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. - double tailMultipler = 1.5; + const double tailMultipler = 1.5; // Since long notes only give a specific judgement if both both hits end up within a certain hit window, // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - double pMaxLN = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); + double pMaxLn = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); - double p300LN = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d) + double p300Ln = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d) - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); - double p200LN = hitProb(h200, d) * hitProb(h200 * tailMultipler, d) + double p200Ln = hitProb(h200, d) * hitProb(h200 * tailMultipler, d) - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d); - double p100LN = hitProb(h100, d) * hitProb(h100 * tailMultipler, d) + double p100Ln = hitProb(h100, d) * hitProb(h100 * tailMultipler, d) - hitProb(h200, d) * hitProb(h200 * tailMultipler, d); - double p50LN = hitProb(h50, d) * hitProb(h50 * tailMultipler, d) + double p50Ln = hitProb(h50, d) * hitProb(h50 * tailMultipler, d) - hitProb(h100, d) * hitProb(h100 * tailMultipler, d); - double p0LN = 1 - hitProb(h50, d) * hitProb(h50 * tailMultipler, d); + double p0Ln = 1 - hitProb(h50, d) * hitProb(h50 * tailMultipler, d); - double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLN * attributes.HoldNoteCount)) / totalHits; - double p300 = ((p300Note * attributes.NoteCount) + (p300LN * attributes.HoldNoteCount)) / totalHits; - double p200 = ((p200Note * attributes.NoteCount) + (p200LN * attributes.HoldNoteCount)) / totalHits; - double p100 = ((p100Note * attributes.NoteCount) + (p100LN * attributes.HoldNoteCount)) / totalHits; - double p50 = ((p50Note * attributes.NoteCount) + (p50LN * attributes.HoldNoteCount)) / totalHits; - double p0 = ((p0Note * attributes.NoteCount) + (p0LN * attributes.HoldNoteCount)) / totalHits; + double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLn * attributes.HoldNoteCount)) / totalHits; + double p300 = ((p300Note * attributes.NoteCount) + (p300Ln * attributes.HoldNoteCount)) / totalHits; + double p200 = ((p200Note * attributes.NoteCount) + (p200Ln * attributes.HoldNoteCount)) / totalHits; + double p100 = ((p100Note * attributes.NoteCount) + (p100Ln * attributes.HoldNoteCount)) / totalHits; + double p50 = ((p50Note * attributes.NoteCount) + (p50Ln * attributes.HoldNoteCount)) / totalHits; + double p0 = ((p0Note * attributes.NoteCount) + (p0Ln * attributes.HoldNoteCount)) / totalHits; double gradient = Math.Pow(pMax, countPerfect / totalHits) * Math.Pow(p300, (countGreat + 0.5) / totalHits) From 9ff4c1b8ef7becf0abb07abe40506c7d66587e07 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 12 Feb 2023 19:44:11 -0500 Subject: [PATCH 31/87] fix const name --- .../Difficulty/ManiaPerformanceCalculator.cs | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 92c1f678d161..c0eb86efbf04 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -111,25 +111,25 @@ double legacyLikelihoodGradient(double d) // Effective hit window for LN tails. Should be a value between 1 and 2. This is because the hit window for LN tails in stable // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. - const double tailMultipler = 1.5; + const double tail_multipler = 1.5; // Since long notes only give a specific judgement if both both hits end up within a certain hit window, // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - double pMaxLn = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); + double pMaxLn = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multipler, d); - double p300Ln = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d) - - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tailMultipler, d); + double p300Ln = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multipler, d) + - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multipler, d); - double p200Ln = hitProb(h200, d) * hitProb(h200 * tailMultipler, d) - - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tailMultipler, d); + double p200Ln = hitProb(h200, d) * hitProb(h200 * tail_multipler, d) + - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multipler, d); - double p100Ln = hitProb(h100, d) * hitProb(h100 * tailMultipler, d) - - hitProb(h200, d) * hitProb(h200 * tailMultipler, d); + double p100Ln = hitProb(h100, d) * hitProb(h100 * tail_multipler, d) + - hitProb(h200, d) * hitProb(h200 * tail_multipler, d); - double p50Ln = hitProb(h50, d) * hitProb(h50 * tailMultipler, d) - - hitProb(h100, d) * hitProb(h100 * tailMultipler, d); + double p50Ln = hitProb(h50, d) * hitProb(h50 * tail_multipler, d) + - hitProb(h100, d) * hitProb(h100 * tail_multipler, d); - double p0Ln = 1 - hitProb(h50, d) * hitProb(h50 * tailMultipler, d); + double p0Ln = 1 - hitProb(h50, d) * hitProb(h50 * tail_multipler, d); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLn * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300Ln * attributes.HoldNoteCount)) / totalHits; From 01dbce6a31bbb26f7c9b24a6d8584ad3125b6f93 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 12 Feb 2023 20:00:19 -0500 Subject: [PATCH 32/87] More formatting --- .../Difficulty/ManiaPerformanceCalculator.cs | 51 +++++++++---------- 1 file changed, 24 insertions(+), 27 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index c0eb86efbf04..f087dc98f790 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -69,7 +69,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) if (estimatedUr == null) return 0; - + difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUr.Value), 1.6) - 0.2, 0); // UR to multiplier curve, see https://www.desmos.com/calculator/xt58vzt2y4 return difficultyValue; @@ -88,7 +88,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalHits == attributes.NoteCount + attributes.HoldNoteCount; - double[] judgements = isLegacyScore ? judgements = getLegacyJudgements(score, attributes) : judgements = getLazerJudgements(score, attributes); + double[] judgements = isLegacyScore ? getLegacyJudgements(score, attributes) : getLazerJudgements(score, attributes); double hMax = judgements[0]; double h300 = judgements[1]; @@ -111,25 +111,25 @@ double legacyLikelihoodGradient(double d) // Effective hit window for LN tails. Should be a value between 1 and 2. This is because the hit window for LN tails in stable // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. - const double tail_multipler = 1.5; + const double tail_multiplier = 1.5; // Since long notes only give a specific judgement if both both hits end up within a certain hit window, // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - double pMaxLn = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multipler, d); + double pMaxLn = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multiplier, d); - double p300Ln = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multipler, d) - - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multipler, d); + double p300Ln = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multiplier, d) + - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multiplier, d); - double p200Ln = hitProb(h200, d) * hitProb(h200 * tail_multipler, d) - - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multipler, d); + double p200Ln = hitProb(h200, d) * hitProb(h200 * tail_multiplier, d) + - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multiplier, d); - double p100Ln = hitProb(h100, d) * hitProb(h100 * tail_multipler, d) - - hitProb(h200, d) * hitProb(h200 * tail_multipler, d); + double p100Ln = hitProb(h100, d) * hitProb(h100 * tail_multiplier, d) + - hitProb(h200, d) * hitProb(h200 * tail_multiplier, d); - double p50Ln = hitProb(h50, d) * hitProb(h50 * tail_multipler, d) - - hitProb(h100, d) * hitProb(h100 * tail_multipler, d); + double p50Ln = hitProb(h50, d) * hitProb(h50 * tail_multiplier, d) + - hitProb(h100, d) * hitProb(h100 * tail_multiplier, d); - double p0Ln = 1 - hitProb(h50, d) * hitProb(h50 * tail_multipler, d); + double p0Ln = 1 - hitProb(h50, d) * hitProb(h50 * tail_multiplier, d); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLn * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300Ln * attributes.HoldNoteCount)) / totalHits; @@ -139,11 +139,11 @@ double legacyLikelihoodGradient(double d) double p0 = ((p0Note * attributes.NoteCount) + (p0Ln * attributes.HoldNoteCount)) / totalHits; double gradient = Math.Pow(pMax, countPerfect / totalHits) - * Math.Pow(p300, (countGreat + 0.5) / totalHits) - * Math.Pow(p200, countGood / totalHits) - * Math.Pow(p100, countOk / totalHits) - * Math.Pow(p50, countMeh / totalHits) - * Math.Pow(p0, countMiss / totalHits); + * Math.Pow(p300, (countGreat + 0.5) / totalHits) + * Math.Pow(p200, countGood / totalHits) + * Math.Pow(p100, countOk / totalHits) + * Math.Pow(p50, countMeh / totalHits) + * Math.Pow(p0, countMiss / totalHits); return -gradient; } @@ -177,20 +177,17 @@ double lazerLikelihoodGradient(double d) double p0 = ((p0Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p0Tail * attributes.HoldNoteCount)) / totalHits; double gradient = Math.Pow(pMax, countPerfect / totalHits) - * Math.Pow(p300, (countGreat + 0.5) / totalHits) - * Math.Pow(p200, countGood / totalHits) - * Math.Pow(p100, countOk / totalHits) - * Math.Pow(p50, countMeh / totalHits) - * Math.Pow(p0, countMiss / totalHits); + * Math.Pow(p300, (countGreat + 0.5) / totalHits) + * Math.Pow(p200, countGood / totalHits) + * Math.Pow(p100, countOk / totalHits) + * Math.Pow(p50, countMeh / totalHits) + * Math.Pow(p0, countMiss / totalHits); return -gradient; } // Finding the minimum of the function returns the most likely deviation for the hit results. - if (isLegacyScore) - return FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30); - else - return FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); + return isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); } private double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) From db0fda06387ba73a788398268aeb89c80beebbb4 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Wed, 15 Feb 2023 23:09:57 -0500 Subject: [PATCH 33/87] Remove pointless erf approximation, fix lazer return statement --- .../Difficulty/ManiaPerformanceCalculator.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f087dc98f790..1d5ab4a2c759 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -152,7 +152,7 @@ double legacyLikelihoodGradient(double d) double lazerLikelihoodGradient(double d) { if (d <= 0) - return double.PositiveInfinity; + return 0; double pMaxNote = hitProb(hMax, d); double p300Note = hitProb(h300, d) - hitProb(hMax, d); @@ -244,16 +244,7 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a private double hitProb(double x, double deviation) { - return erfApprox(x / (deviation * Math.Sqrt(2))); - } - - private double erfApprox(double x) - { - if (x <= 5) - return SpecialFunctions.Erf(x); - - // This approximation is very accurate with values over 5, and is much more performant than the Erf function - return 1 - Math.Exp(-Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI))); + return SpecialFunctions.Erf(x / (deviation * Math.Sqrt(2))); } } } From 2d7c99b6f3e10e25cb394b8adb01b811a0e306f7 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 17 Feb 2023 00:28:09 -0500 Subject: [PATCH 34/87] Massively improve estimation accuracy using a folded distribution --- .../Difficulty/ManiaPerformanceCalculator.cs | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 1d5ab4a2c759..566027b9f99f 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using MathNet.Numerics; +using MathNet.Numerics.Distributions; using osu.Framework.Audio.Track; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Rulesets.Difficulty; @@ -109,27 +110,24 @@ double legacyLikelihoodGradient(double d) double p50Note = hitProb(h50, d) - hitProb(h100, d); double p0Note = 1 - hitProb(h50, d); - // Effective hit window for LN tails. Should be a value between 1 and 2. This is because the hit window for LN tails in stable - // arent static, and depend on how far from 0ms offset the hit on the head was. A lower value results in a lower estimated deviation. - const double tail_multiplier = 1.5; - // Since long notes only give a specific judgement if both both hits end up within a certain hit window, // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - double pMaxLn = hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multiplier, d); + // Since legacy LN tails take the absolute error of both hit judgements on an LN, we need to use a folded normal distribution to calculate it. + double pMaxLn = hitProb(hMax * 1.2, d) * hitProbLn(hMax * 2.4, d); - double p300Ln = hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multiplier, d) - - hitProb(hMax * 1.2, d) * hitProb(hMax * 1.2 * tail_multiplier, d); + double p300Ln = hitProb(h300 * 1.1, d) * hitProbLn(h300 * 2.2, d) + - hitProb(hMax * 1.2, d) * hitProbLn(hMax * 2.4, d); - double p200Ln = hitProb(h200, d) * hitProb(h200 * tail_multiplier, d) - - hitProb(h300 * 1.1, d) * hitProb(h300 * 1.1 * tail_multiplier, d); + double p200Ln = hitProb(h200, d) * hitProbLn(h200 * 2, d) + - hitProb(h300 * 1.1, d) * hitProbLn(h300 * 2.2, d); - double p100Ln = hitProb(h100, d) * hitProb(h100 * tail_multiplier, d) - - hitProb(h200, d) * hitProb(h200 * tail_multiplier, d); + double p100Ln = hitProb(h100, d) * hitProbLn(h100 * 2, d) + - hitProb(h200, d) * hitProbLn(h200 * 2, d); - double p50Ln = hitProb(h50, d) * hitProb(h50 * tail_multiplier, d) - - hitProb(h100, d) * hitProb(h100 * tail_multiplier, d); + double p50Ln = hitProb(h50, d) * hitProbLn(h50 * 2, d) + - hitProb(h100, d) * hitProbLn(h100 * 2, d); - double p0Ln = 1 - hitProb(h50, d) * hitProb(h50 * tail_multiplier, d); + double p0Ln = 1 - hitProb(h50, d) * hitProbLn(h50 * 2, d); double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLn * attributes.HoldNoteCount)) / totalHits; double p300 = ((p300Note * attributes.NoteCount) + (p300Ln * attributes.HoldNoteCount)) / totalHits; @@ -246,5 +244,10 @@ private double hitProb(double x, double deviation) { return SpecialFunctions.Erf(x / (deviation * Math.Sqrt(2))); } + + private double hitProbLn(double x, double deviation) + { + return Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2); + } } } From 33a73e3818b7e16104835d20a32500813da081b4 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 17 Feb 2023 20:03:55 -0500 Subject: [PATCH 35/87] update desmos, remove redundant parenthesis --- .../Difficulty/ManiaPerformanceCalculator.cs | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 566027b9f99f..d4feb9d2a25c 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -97,7 +97,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) double h100 = judgements[3]; double h50 = judgements[4]; - // https://www.desmos.com/calculator/akinrfls4r + // https://www.desmos.com/calculator/tybjpjfjlz double legacyLikelihoodGradient(double d) { if (d <= 0) @@ -129,12 +129,12 @@ double legacyLikelihoodGradient(double d) double p0Ln = 1 - hitProb(h50, d) * hitProbLn(h50 * 2, d); - double pMax = ((pMaxNote * attributes.NoteCount) + (pMaxLn * attributes.HoldNoteCount)) / totalHits; - double p300 = ((p300Note * attributes.NoteCount) + (p300Ln * attributes.HoldNoteCount)) / totalHits; - double p200 = ((p200Note * attributes.NoteCount) + (p200Ln * attributes.HoldNoteCount)) / totalHits; - double p100 = ((p100Note * attributes.NoteCount) + (p100Ln * attributes.HoldNoteCount)) / totalHits; - double p50 = ((p50Note * attributes.NoteCount) + (p50Ln * attributes.HoldNoteCount)) / totalHits; - double p0 = ((p0Note * attributes.NoteCount) + (p0Ln * attributes.HoldNoteCount)) / totalHits; + double pMax = (pMaxNote * attributes.NoteCount + pMaxLn * attributes.HoldNoteCount) / totalHits; + double p300 = (p300Note * attributes.NoteCount + p300Ln * attributes.HoldNoteCount) / totalHits; + double p200 = (p200Note * attributes.NoteCount + p200Ln * attributes.HoldNoteCount) / totalHits; + double p100 = (p100Note * attributes.NoteCount + p100Ln * attributes.HoldNoteCount) / totalHits; + double p50 = (p50Note * attributes.NoteCount + p50Ln * attributes.HoldNoteCount) / totalHits; + double p0 = (p0Note * attributes.NoteCount + p0Ln * attributes.HoldNoteCount) / totalHits; double gradient = Math.Pow(pMax, countPerfect / totalHits) * Math.Pow(p300, (countGreat + 0.5) / totalHits) @@ -167,12 +167,12 @@ double lazerLikelihoodGradient(double d) double p50Tail = hitProb(h50 * 1.5, d) - hitProb(h100 * 1.5, d); double p0Tail = 1 - hitProb(h50 * 1.5, d); - double pMax = ((pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount)) + (pMaxTail * attributes.HoldNoteCount)) / totalHits; - double p300 = ((p300Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p300Tail * attributes.HoldNoteCount)) / totalHits; - double p200 = ((p200Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p200Tail * attributes.HoldNoteCount)) / totalHits; - double p100 = ((p100Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p100Tail * attributes.HoldNoteCount)) / totalHits; - double p50 = ((p50Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p50Tail * attributes.HoldNoteCount)) / totalHits; - double p0 = ((p0Note * (attributes.NoteCount + attributes.HoldNoteCount)) + (p0Tail * attributes.HoldNoteCount)) / totalHits; + double pMax = (pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount) + pMaxTail * attributes.HoldNoteCount) / totalHits; + double p300 = (p300Note * (attributes.NoteCount + attributes.HoldNoteCount) + p300Tail * attributes.HoldNoteCount) / totalHits; + double p200 = (p200Note * (attributes.NoteCount + attributes.HoldNoteCount) + p200Tail * attributes.HoldNoteCount) / totalHits; + double p100 = (p100Note * (attributes.NoteCount + attributes.HoldNoteCount) + p100Tail * attributes.HoldNoteCount) / totalHits; + double p50 = (p50Note * (attributes.NoteCount + attributes.HoldNoteCount) + p50Tail * attributes.HoldNoteCount) / totalHits; + double p0 = (p0Note * (attributes.NoteCount + attributes.HoldNoteCount) + p0Tail * attributes.HoldNoteCount) / totalHits; double gradient = Math.Pow(pMax, countPerfect / totalHits) * Math.Pow(p300, (countGreat + 0.5) / totalHits) From 97da8cc2ff813b4ea6eefa1c02466bfc7eab1134 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 19 Feb 2023 00:32:38 -0500 Subject: [PATCH 36/87] Reformatting, increase precision a lot by rewriting in terms of the log of the complement --- .../Difficulty/ManiaPerformanceCalculator.cs | 176 ++++++++++-------- 1 file changed, 100 insertions(+), 76 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index d4feb9d2a25c..81ec05cd0ec4 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -76,18 +76,18 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) return difficultyValue; } - private double totalHits => countPerfect + countOk + countGreat + countGood + countMeh + countMiss; - private double totalSuccessfulHits => countPerfect + countOk + countGreat + countGood + countMeh; + private double totalJudgements => countPerfect + countOk + countGreat + countGood + countMeh + countMiss; + private double totalSuccessfulJudgements => countPerfect + countOk + countGreat + countGood + countMeh; /// /// Accuracy used to weight judgements independently from the score's actual accuracy. /// private double? computeEstimatedUr(ScoreInfo score, ManiaDifficultyAttributes attributes) { - if (totalSuccessfulHits == 0) + if (totalSuccessfulJudgements == 0) return null; - bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalHits == attributes.NoteCount + attributes.HoldNoteCount; + bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalJudgements == attributes.NoteCount + attributes.HoldNoteCount; double[] judgements = isLegacyScore ? getLegacyJudgements(score, attributes) : getLazerJudgements(score, attributes); @@ -103,45 +103,54 @@ double legacyLikelihoodGradient(double d) if (d <= 0) return 0; - double pMaxNote = hitProb(hMax, d); - double p300Note = hitProb(h300, d) - hitProb(hMax, d); - double p200Note = hitProb(h200, d) - hitProb(h300, d); - double p100Note = hitProb(h100, d) - hitProb(h200, d); - double p50Note = hitProb(h50, d) - hitProb(h100, d); - double p0Note = 1 - hitProb(h50, d); - - // Since long notes only give a specific judgement if both both hits end up within a certain hit window, - // multiply the probability of hitting in the head hit window by the probability of hitting in the tail hit window. - // Since legacy LN tails take the absolute error of both hit judgements on an LN, we need to use a folded normal distribution to calculate it. - double pMaxLn = hitProb(hMax * 1.2, d) * hitProbLn(hMax * 2.4, d); - - double p300Ln = hitProb(h300 * 1.1, d) * hitProbLn(h300 * 2.2, d) - - hitProb(hMax * 1.2, d) * hitProbLn(hMax * 2.4, d); - - double p200Ln = hitProb(h200, d) * hitProbLn(h200 * 2, d) - - hitProb(h300 * 1.1, d) * hitProbLn(h300 * 2.2, d); - - double p100Ln = hitProb(h100, d) * hitProbLn(h100 * 2, d) - - hitProb(h200, d) * hitProbLn(h200 * 2, d); - - double p50Ln = hitProb(h50, d) * hitProbLn(h50 * 2, d) - - hitProb(h100, d) * hitProbLn(h100 * 2, d); - - double p0Ln = 1 - hitProb(h50, d) * hitProbLn(h50 * 2, d); - - double pMax = (pMaxNote * attributes.NoteCount + pMaxLn * attributes.HoldNoteCount) / totalHits; - double p300 = (p300Note * attributes.NoteCount + p300Ln * attributes.HoldNoteCount) / totalHits; - double p200 = (p200Note * attributes.NoteCount + p200Ln * attributes.HoldNoteCount) / totalHits; - double p100 = (p100Note * attributes.NoteCount + p100Ln * attributes.HoldNoteCount) / totalHits; - double p50 = (p50Note * attributes.NoteCount + p50Ln * attributes.HoldNoteCount) / totalHits; - double p0 = (p0Note * attributes.NoteCount + p0Ln * attributes.HoldNoteCount) / totalHits; - - double gradient = Math.Pow(pMax, countPerfect / totalHits) - * Math.Pow(p300, (countGreat + 0.5) / totalHits) - * Math.Pow(p200, countGood / totalHits) - * Math.Pow(p100, countOk / totalHits) - * Math.Pow(p50, countMeh / totalHits) - * Math.Pow(p0, countMiss / totalHits); + double pMaxNote = logDiff(0, logPcNote(hMax, d)); + double p300Note = logDiff(logPcNote(hMax, d), logPcNote(h300, d)); + double p200Note = logDiff(logPcNote(h300, d), logPcNote(h200, d)); + double p100Note = logDiff(logPcNote(h200, d), logPcNote(h100, d)); + double p50Note = logDiff(logPcNote(h100, d), logPcNote(h50, d)); + double p0Note = logPcNote(h50, d); + + // Since we're using complementary probabilities for precision, multiplying the head and tail probabilities takes the form P(A∩B)' = P(A'∪B') = P(A') + P(B') - P(A'∩B'). + double combinedProb(double p1, double p2) => logDiff(logSum(p1, p2), p1 + p2); + + // The variable name 'logPc' means 'log probability complementary'. + double logPcMaxHead = logPcNote(hMax * 1.2, d); + double logPcMaxTail = logPcHitHoldTail(hMax * 2.4, d); + double pMaxHold = logDiff(0, combinedProb(logPcMaxHead, logPcMaxTail)); + + double logPc300Head = logPcNote(h300 * 1.1, d); + double logPc300Tail = logPcHitHoldTail(h300 * 2.2, d); + double p300Hold = logDiff(combinedProb(logPcMaxHead, logPcMaxTail), combinedProb(logPc300Head, logPc300Tail)); + + double logPc200Head = logPcNote(h200, d); + double logPc200Tail = logPcHitHoldTail(h200 * 2, d); + double p200Hold = logDiff(combinedProb(logPc300Head, logPc300Tail), combinedProb(logPc200Head, logPc200Tail)); + + double logPc100Head = logPcNote(h100, d); + double logPc100Tail = logPcHitHoldTail(h100 * 2, d); + double p100Hold = logDiff(combinedProb(logPc200Head, logPc200Tail), combinedProb(logPc100Head, logPc100Tail)); + + double logPc50Head = logPcNote(h50, d); + double logPc50Tail = logPcHitHoldTail(h50 * 2, d); + double p50Hold = logDiff(combinedProb(logPc100Head, logPc100Tail), combinedProb(logPc50Head, logPc50Tail)); + + double p0Hold = combinedProb(logPc50Head, logPc50Tail); + + double pMax = logSum(pMaxNote + Math.Log(attributes.NoteCount), pMaxHold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p300 = logSum(p300Note + Math.Log(attributes.NoteCount), p300Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p200 = logSum(p200Note + Math.Log(attributes.NoteCount), p200Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p100 = logSum(p100Note + Math.Log(attributes.NoteCount), p100Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p50 = logSum(p50Note + Math.Log(attributes.NoteCount), p50Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p0 = logSum(p0Note + Math.Log(attributes.NoteCount), p0Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + + double gradient = Math.Exp( + (countPerfect * pMax + + (countGreat + 0.5) * p300 + + countGood * p200 + + countOk * p100 + + countMeh * p50 + + countMiss * p0) / totalJudgements + ); return -gradient; } @@ -152,40 +161,43 @@ double lazerLikelihoodGradient(double d) if (d <= 0) return 0; - double pMaxNote = hitProb(hMax, d); - double p300Note = hitProb(h300, d) - hitProb(hMax, d); - double p200Note = hitProb(h200, d) - hitProb(h300, d); - double p100Note = hitProb(h100, d) - hitProb(h200, d); - double p50Note = hitProb(h50, d) - hitProb(h100, d); - double p0Note = 1 - hitProb(h50, d); + double pMaxNote = logDiff(0, logPcNote(hMax, d)); + double p300Note = logDiff(logPcNote(hMax, d), logPcNote(h300, d)); + double p200Note = logDiff(logPcNote(h300, d), logPcNote(h200, d)); + double p100Note = logDiff(logPcNote(h200, d), logPcNote(h100, d)); + double p50Note = logDiff(logPcNote(h100, d), logPcNote(h50, d)); + double p0Note = logPcNote(h50, d); // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. - double pMaxTail = hitProb(hMax * 1.5, d); - double p300Tail = hitProb(h300 * 1.5, d) - hitProb(hMax * 1.5, d); - double p200Tail = hitProb(h200 * 1.5, d) - hitProb(h300 * 1.5, d); - double p100Tail = hitProb(h100 * 1.5, d) - hitProb(h200 * 1.5, d); - double p50Tail = hitProb(h50 * 1.5, d) - hitProb(h100 * 1.5, d); - double p0Tail = 1 - hitProb(h50 * 1.5, d); - - double pMax = (pMaxNote * (attributes.NoteCount + attributes.HoldNoteCount) + pMaxTail * attributes.HoldNoteCount) / totalHits; - double p300 = (p300Note * (attributes.NoteCount + attributes.HoldNoteCount) + p300Tail * attributes.HoldNoteCount) / totalHits; - double p200 = (p200Note * (attributes.NoteCount + attributes.HoldNoteCount) + p200Tail * attributes.HoldNoteCount) / totalHits; - double p100 = (p100Note * (attributes.NoteCount + attributes.HoldNoteCount) + p100Tail * attributes.HoldNoteCount) / totalHits; - double p50 = (p50Note * (attributes.NoteCount + attributes.HoldNoteCount) + p50Tail * attributes.HoldNoteCount) / totalHits; - double p0 = (p0Note * (attributes.NoteCount + attributes.HoldNoteCount) + p0Tail * attributes.HoldNoteCount) / totalHits; - - double gradient = Math.Pow(pMax, countPerfect / totalHits) - * Math.Pow(p300, (countGreat + 0.5) / totalHits) - * Math.Pow(p200, countGood / totalHits) - * Math.Pow(p100, countOk / totalHits) - * Math.Pow(p50, countMeh / totalHits) - * Math.Pow(p0, countMiss / totalHits); + // We don't use "logPcHitHoldTail` for these since they have the same hit mechanics as a regular note. + double pMaxTail = logDiff(0, logPcNote(hMax * 1.5, d)); + double p300Tail = logDiff(logPcNote(hMax * 1.5, d), logPcNote(h300 * 1.5, d)); + double p200Tail = logDiff(logPcNote(h300 * 1.5, d), logPcNote(h200 * 1.5, d)); + double p100Tail = logDiff(logPcNote(h200 * 1.5, d), logPcNote(h100 * 1.5, d)); + double p50Tail = logDiff(logPcNote(h100 * 1.5, d), logPcNote(h50 * 1.5, d)); + double p0Tail = logPcNote(h50 * 1.5, d); + + double pMax = logSum(pMaxNote + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), pMaxTail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p300 = logSum(p300Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p300Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p200 = logSum(p200Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p200Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p100 = logSum(p100Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p100Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p50 = logSum(p50Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p50Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double p0 = logSum(p0Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p0Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + + double gradient = Math.Exp( + (countPerfect * pMax + + (countGreat + 0.5) * p300 + + countGood * p200 + + countOk * p100 + + countMeh * p50 + + countMiss * p0) / totalJudgements + ); return -gradient; } // Finding the minimum of the function returns the most likely deviation for the hit results. - return isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); + return isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 10) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 10); } private double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) @@ -240,14 +252,26 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a return judgements; } - private double hitProb(double x, double deviation) - { - return SpecialFunctions.Erf(x / (deviation * Math.Sqrt(2))); - } + private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); + private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); + + // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. + private double logPcHitHoldTail(double x, double deviation) => Math.Log(1 - Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2)); + + // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. + private double logDiff(double l1, double l2) => l1 + SpecialFunctions.Log1p(-Math.Exp(-(l1 - l2))); - private double hitProbLn(double x, double deviation) + private double logSum(double l1, double l2) { - return Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2); + double maxVal = Math.Max(l1, l2); + double minVal = Math.Min(l1, l2); + + if (double.IsNegativeInfinity(maxVal)) + { + return maxVal; + } + + return maxVal + Math.Log(1 + Math.Exp(minVal - maxVal)); } } } From 08ceb0257669937f165abcc09e03bffadb6a8625 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 19 Feb 2023 00:37:53 -0500 Subject: [PATCH 37/87] Rename "Judgements" to "HitWindows" --- .../Difficulty/ManiaPerformanceCalculator.cs | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 81ec05cd0ec4..f3c256a955a3 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -89,13 +89,13 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalJudgements == attributes.NoteCount + attributes.HoldNoteCount; - double[] judgements = isLegacyScore ? getLegacyJudgements(score, attributes) : getLazerJudgements(score, attributes); + double[] hitWindows = isLegacyScore ? getLegacyHitWindows(score, attributes) : getLazerHitWindows(score, attributes); - double hMax = judgements[0]; - double h300 = judgements[1]; - double h200 = judgements[2]; - double h100 = judgements[3]; - double h50 = judgements[4]; + double hMax = hitWindows[0]; + double h300 = hitWindows[1]; + double h200 = hitWindows[2]; + double h100 = hitWindows[3]; + double h50 = hitWindows[4]; // https://www.desmos.com/calculator/tybjpjfjlz double legacyLikelihoodGradient(double d) @@ -200,7 +200,7 @@ double lazerLikelihoodGradient(double d) return isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 10) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 10); } - private double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) + private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) { double[] judgements = new double[5]; @@ -225,9 +225,9 @@ private double[] getLegacyJudgements(ScoreInfo score, ManiaDifficultyAttributes return judgements; } - private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes attributes) + private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) { - double[] judgements = new double[5]; + double[] hitWindows = new double[5]; var track = new TrackVirtual(10000); score.Mods.OfType().ForEach(m => m.ApplyToTrack(track)); @@ -241,15 +241,15 @@ private double[] getLazerJudgements(ScoreInfo score, ManiaDifficultyAttributes a windowMultiplier *= 1.4; if (attributes.OverallDifficulty < 5) - judgements[0] = (22.4 - 0.6 * attributes.OverallDifficulty) * windowMultiplier; + hitWindows[0] = (22.4 - 0.6 * attributes.OverallDifficulty) * windowMultiplier; else - judgements[0] = (24.9 - 1.1 * attributes.OverallDifficulty) * windowMultiplier; - judgements[1] = (64 - 3 * attributes.OverallDifficulty) * windowMultiplier; - judgements[2] = (97 - 3 * attributes.OverallDifficulty) * windowMultiplier; - judgements[3] = (127 - 3 * attributes.OverallDifficulty) * windowMultiplier; - judgements[4] = (151 - 3 * attributes.OverallDifficulty) * windowMultiplier; + hitWindows[0] = (24.9 - 1.1 * attributes.OverallDifficulty) * windowMultiplier; + hitWindows[1] = (64 - 3 * attributes.OverallDifficulty) * windowMultiplier; + hitWindows[2] = (97 - 3 * attributes.OverallDifficulty) * windowMultiplier; + hitWindows[3] = (127 - 3 * attributes.OverallDifficulty) * windowMultiplier; + hitWindows[4] = (151 - 3 * attributes.OverallDifficulty) * windowMultiplier; - return judgements; + return hitWindows; } private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); From 35119bc5fa19556a548659a97b84aa06765052c9 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 19 Feb 2023 16:33:32 -0500 Subject: [PATCH 38/87] Address reviews --- .../Difficulty/ManiaPerformanceCalculator.cs | 75 ++++++++++++------- 1 file changed, 50 insertions(+), 25 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f3c256a955a3..70dc1ecebadd 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -42,7 +42,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - estimatedUr = computeEstimatedUr(score, maniaAttributes) * 10; + estimatedUr = computeEstimatedUr(score, maniaAttributes); // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. // The specific number has no intrinsic meaning and can be adjusted as needed. @@ -97,12 +97,18 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) double h100 = hitWindows[3]; double h50 = hitWindows[4]; + double nJudgements = Math.Log(totalJudgements); + double nNoteCount = Math.Log(attributes.NoteCount); + double nHoldCount = Math.Log(attributes.HoldNoteCount); + double nNoteHoldCount = Math.Log(attributes.NoteCount + attributes.HoldNoteCount); + // https://www.desmos.com/calculator/tybjpjfjlz double legacyLikelihoodGradient(double d) { if (d <= 0) return 0; + // The variable name 'logPc' means 'log probability complementary'. double pMaxNote = logDiff(0, logPcNote(hMax, d)); double p300Note = logDiff(logPcNote(hMax, d), logPcNote(h300, d)); double p200Note = logDiff(logPcNote(h300, d), logPcNote(h200, d)); @@ -113,35 +119,34 @@ double legacyLikelihoodGradient(double d) // Since we're using complementary probabilities for precision, multiplying the head and tail probabilities takes the form P(A∩B)' = P(A'∪B') = P(A') + P(B') - P(A'∩B'). double combinedProb(double p1, double p2) => logDiff(logSum(p1, p2), p1 + p2); - // The variable name 'logPc' means 'log probability complementary'. double logPcMaxHead = logPcNote(hMax * 1.2, d); - double logPcMaxTail = logPcHitHoldTail(hMax * 2.4, d); + double logPcMaxTail = logPcHoldTail(hMax * 2.4, d); double pMaxHold = logDiff(0, combinedProb(logPcMaxHead, logPcMaxTail)); double logPc300Head = logPcNote(h300 * 1.1, d); - double logPc300Tail = logPcHitHoldTail(h300 * 2.2, d); + double logPc300Tail = logPcHoldTail(h300 * 2.2, d); double p300Hold = logDiff(combinedProb(logPcMaxHead, logPcMaxTail), combinedProb(logPc300Head, logPc300Tail)); double logPc200Head = logPcNote(h200, d); - double logPc200Tail = logPcHitHoldTail(h200 * 2, d); + double logPc200Tail = logPcHoldTail(h200 * 2, d); double p200Hold = logDiff(combinedProb(logPc300Head, logPc300Tail), combinedProb(logPc200Head, logPc200Tail)); double logPc100Head = logPcNote(h100, d); - double logPc100Tail = logPcHitHoldTail(h100 * 2, d); + double logPc100Tail = logPcHoldTail(h100 * 2, d); double p100Hold = logDiff(combinedProb(logPc200Head, logPc200Tail), combinedProb(logPc100Head, logPc100Tail)); double logPc50Head = logPcNote(h50, d); - double logPc50Tail = logPcHitHoldTail(h50 * 2, d); + double logPc50Tail = logPcHoldTail(h50 * 2, d); double p50Hold = logDiff(combinedProb(logPc100Head, logPc100Tail), combinedProb(logPc50Head, logPc50Tail)); double p0Hold = combinedProb(logPc50Head, logPc50Tail); - double pMax = logSum(pMaxNote + Math.Log(attributes.NoteCount), pMaxHold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p300 = logSum(p300Note + Math.Log(attributes.NoteCount), p300Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p200 = logSum(p200Note + Math.Log(attributes.NoteCount), p200Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p100 = logSum(p100Note + Math.Log(attributes.NoteCount), p100Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p50 = logSum(p50Note + Math.Log(attributes.NoteCount), p50Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p0 = logSum(p0Note + Math.Log(attributes.NoteCount), p0Hold + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double pMax = logSum(pMaxNote + nNoteCount, pMaxHold + nHoldCount) - nJudgements; + double p300 = logSum(p300Note + nNoteCount, p300Hold + nHoldCount) - nJudgements; + double p200 = logSum(p200Note + nNoteCount, p200Hold + nHoldCount) - nJudgements; + double p100 = logSum(p100Note + nNoteCount, p100Hold + nHoldCount) - nJudgements; + double p50 = logSum(p50Note + nNoteCount, p50Hold + nHoldCount) - nJudgements; + double p0 = logSum(p0Note + nNoteCount, p0Hold + nHoldCount) - nJudgements; double gradient = Math.Exp( (countPerfect * pMax @@ -169,7 +174,7 @@ double lazerLikelihoodGradient(double d) double p0Note = logPcNote(h50, d); // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. - // We don't use "logPcHitHoldTail` for these since they have the same hit mechanics as a regular note. + // We don't use "logPcHoldTail` for these since they have the same hit mechanics as a regular note. double pMaxTail = logDiff(0, logPcNote(hMax * 1.5, d)); double p300Tail = logDiff(logPcNote(hMax * 1.5, d), logPcNote(h300 * 1.5, d)); double p200Tail = logDiff(logPcNote(h300 * 1.5, d), logPcNote(h200 * 1.5, d)); @@ -177,12 +182,12 @@ double lazerLikelihoodGradient(double d) double p50Tail = logDiff(logPcNote(h100 * 1.5, d), logPcNote(h50 * 1.5, d)); double p0Tail = logPcNote(h50 * 1.5, d); - double pMax = logSum(pMaxNote + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), pMaxTail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p300 = logSum(p300Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p300Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p200 = logSum(p200Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p200Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p100 = logSum(p100Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p100Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p50 = logSum(p50Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p50Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); - double p0 = logSum(p0Note + Math.Log(attributes.NoteCount + attributes.HoldNoteCount), p0Tail + Math.Log(attributes.HoldNoteCount)) - Math.Log(totalJudgements); + double pMax = logSum(pMaxNote + nNoteHoldCount, pMaxTail + nHoldCount) - nJudgements; + double p300 = logSum(p300Note + nNoteHoldCount, p300Tail + nHoldCount) - nJudgements; + double p200 = logSum(p200Note + nNoteHoldCount, p200Tail + nHoldCount) - nJudgements; + double p100 = logSum(p100Note + nNoteHoldCount, p100Tail + nHoldCount) - nJudgements; + double p50 = logSum(p50Note + nNoteHoldCount, p50Tail + nHoldCount) - nJudgements; + double p0 = logSum(p0Note + nNoteHoldCount, p0Tail + nHoldCount) - nJudgements; double gradient = Math.Exp( (countPerfect * pMax @@ -196,8 +201,9 @@ double lazerLikelihoodGradient(double d) return -gradient; } - // Finding the minimum of the function returns the most likely deviation for the hit results. - return isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 10) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 10); + // Finding the minimum of the function returns the most likely deviation for the hit results. UR is deviation * 10. + double deviation = isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 10) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 10); + return deviation * 10; } private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) @@ -229,8 +235,11 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a { double[] hitWindows = new double[5]; + // Create a new track of arbitrary length var track = new TrackVirtual(10000); + // Apply the total rate change of every mod to the track (i.e. DT = 1.01-2x, HT = 0.5-0.99x) score.Mods.OfType().ForEach(m => m.ApplyToTrack(track)); + // The final clock rate is the rate of the track double clockRate = track.Rate; double windowMultiplier = 1 / clockRate; @@ -253,19 +262,21 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a } private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); + + // For values of x above 5, there is a very simple approximation to increase how far you can calculate x. private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. - private double logPcHitHoldTail(double x, double deviation) => Math.Log(1 - Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2)); + private double logPcHoldTail(double x, double deviation) => Math.Log(1 - Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2)); // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. - private double logDiff(double l1, double l2) => l1 + SpecialFunctions.Log1p(-Math.Exp(-(l1 - l2))); - private double logSum(double l1, double l2) { double maxVal = Math.Max(l1, l2); double minVal = Math.Min(l1, l2); + // 0 in log form becomes negative infinity, so return negative infinity if both numbers are negative infinity. + // We can assume negative infinity is 0 because you cannot write a negative in log form. if (double.IsNegativeInfinity(maxVal)) { return maxVal; @@ -273,5 +284,19 @@ private double logSum(double l1, double l2) return maxVal + Math.Log(1 + Math.Exp(minVal - maxVal)); } + + private double logDiff(double l1, double l2) + { + double maxVal = Math.Max(l1, l2); + double minVal = Math.Min(l1, l2); + + // Avoid negative infinity - negative infinity (NaN) by checking if the higher value is negative infinity. See comment in logSum. + if (double.IsNegativeInfinity(maxVal)) + { + return maxVal; + } + + return maxVal + SpecialFunctions.Log1p(-Math.Exp(-(maxVal - minVal))); + } } } From 06a2358c435a4944f733687bc878ad01816fc351 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 19 Feb 2023 17:52:15 -0500 Subject: [PATCH 39/87] account for mania tests --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 70dc1ecebadd..76f0a5403f48 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -84,7 +84,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// private double? computeEstimatedUr(ScoreInfo score, ManiaDifficultyAttributes attributes) { - if (totalSuccessfulJudgements == 0) + if (totalSuccessfulJudgements == 0 || attributes.NoteCount + attributes.HoldNoteCount == 0) return null; bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalJudgements == attributes.NoteCount + attributes.HoldNoteCount; From 11f6fd08acadef5b5ed899d7c6f81156fd33920d Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 19 Feb 2023 22:35:38 -0500 Subject: [PATCH 40/87] Fix issue with high misscount plays returning 115 UR --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 76f0a5403f48..222392f76dfb 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -202,7 +202,7 @@ double lazerLikelihoodGradient(double d) } // Finding the minimum of the function returns the most likely deviation for the hit results. UR is deviation * 10. - double deviation = isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 10) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 10); + double deviation = isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); return deviation * 10; } From 15ca5359a7bdfabae0408646b6c8067d3ec65d4a Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 20 Feb 2023 18:13:54 -0500 Subject: [PATCH 41/87] Fix incorrect logDiff function, make lazer tail multiplier a const --- .../Difficulty/ManiaPerformanceCalculator.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 222392f76dfb..f81881d16db6 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -19,6 +19,8 @@ namespace osu.Game.Rulesets.Mania.Difficulty { public class ManiaPerformanceCalculator : PerformanceCalculator { + private const double tail_multiplier = 1.5; // Lazer LN tails have 1.5x the hit window of a Note or an LN head. + private int countPerfect; private int countGreat; private int countGood; @@ -173,14 +175,14 @@ double lazerLikelihoodGradient(double d) double p50Note = logDiff(logPcNote(h100, d), logPcNote(h50, d)); double p0Note = logPcNote(h50, d); - // Lazer LN tails are 1.5x the hit window, so calculate the probability of hitting them separately. + // Lazer LN tails have a bigger hit window, so calculate the probability of hitting them separately. // We don't use "logPcHoldTail` for these since they have the same hit mechanics as a regular note. - double pMaxTail = logDiff(0, logPcNote(hMax * 1.5, d)); - double p300Tail = logDiff(logPcNote(hMax * 1.5, d), logPcNote(h300 * 1.5, d)); - double p200Tail = logDiff(logPcNote(h300 * 1.5, d), logPcNote(h200 * 1.5, d)); - double p100Tail = logDiff(logPcNote(h200 * 1.5, d), logPcNote(h100 * 1.5, d)); - double p50Tail = logDiff(logPcNote(h100 * 1.5, d), logPcNote(h50 * 1.5, d)); - double p0Tail = logPcNote(h50 * 1.5, d); + double pMaxTail = logDiff(0, logPcNote(hMax * tail_multiplier, d)); + double p300Tail = logDiff(logPcNote(hMax * tail_multiplier, d), logPcNote(h300 * tail_multiplier, d)); + double p200Tail = logDiff(logPcNote(h300 * tail_multiplier, d), logPcNote(h200 * tail_multiplier, d)); + double p100Tail = logDiff(logPcNote(h200 * tail_multiplier, d), logPcNote(h100 * tail_multiplier, d)); + double p50Tail = logDiff(logPcNote(h100 * tail_multiplier, d), logPcNote(h50 * tail_multiplier, d)); + double p0Tail = logPcNote(h50 * tail_multiplier, d); double pMax = logSum(pMaxNote + nNoteHoldCount, pMaxTail + nHoldCount) - nJudgements; double p300 = logSum(p300Note + nNoteHoldCount, p300Tail + nHoldCount) - nJudgements; @@ -288,7 +290,6 @@ private double logSum(double l1, double l2) private double logDiff(double l1, double l2) { double maxVal = Math.Max(l1, l2); - double minVal = Math.Min(l1, l2); // Avoid negative infinity - negative infinity (NaN) by checking if the higher value is negative infinity. See comment in logSum. if (double.IsNegativeInfinity(maxVal)) @@ -296,7 +297,7 @@ private double logDiff(double l1, double l2) return maxVal; } - return maxVal + SpecialFunctions.Log1p(-Math.Exp(-(maxVal - minVal))); + return l1 + SpecialFunctions.Log1p(-Math.Exp(-(l1 - l2))); } } } From 1e272f18d4c546d017d0b76b74aeacc9963a6803 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 21 Feb 2023 18:26:59 -0500 Subject: [PATCH 42/87] Address abraker's review, add approximation for legacy LN tails --- .../Difficulty/ManiaPerformanceCalculator.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f81881d16db6..b3b28bd613fa 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -265,20 +265,23 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); - // For values of x above 5, there is a very simple approximation to increase how far you can calculate x. + // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. + private double logPcHoldTail(double x, double deviation) => holdTailApprox(x / (deviation * Math.Sqrt(2))); + + // There are numerical approximations to increase how far you can calculate x. private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); - // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. - private double logPcHoldTail(double x, double deviation) => Math.Log(1 - Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2)); + // A handy approximation for the folded distribution is to subtract the natural log of the complementary CDF from log(2). + private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x), 2)) : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. - private double logSum(double l1, double l2) + private double logSum(double firstLog, double secondLog) { - double maxVal = Math.Max(l1, l2); - double minVal = Math.Min(l1, l2); + double maxVal = Math.Max(firstLog, secondLog); + double minVal = Math.Min(firstLog, secondLog); // 0 in log form becomes negative infinity, so return negative infinity if both numbers are negative infinity. - // We can assume negative infinity is 0 because you cannot write a negative in log form. + // Shouldn't happen on any UR>0, but good for redundancy purposes. if (double.IsNegativeInfinity(maxVal)) { return maxVal; @@ -287,9 +290,9 @@ private double logSum(double l1, double l2) return maxVal + Math.Log(1 + Math.Exp(minVal - maxVal)); } - private double logDiff(double l1, double l2) + private double logDiff(double firstLog, double secondLog) { - double maxVal = Math.Max(l1, l2); + double maxVal = Math.Max(firstLog, secondLog); // Avoid negative infinity - negative infinity (NaN) by checking if the higher value is negative infinity. See comment in logSum. if (double.IsNegativeInfinity(maxVal)) @@ -297,7 +300,7 @@ private double logDiff(double l1, double l2) return maxVal; } - return l1 + SpecialFunctions.Log1p(-Math.Exp(-(l1 - l2))); + return firstLog + SpecialFunctions.Log1p(-Math.Exp(-(firstLog - secondLog))); } } } From bafb8f6108a64f4e2b92527a026ae7dffd8a0296 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 21 Feb 2023 18:26:59 -0500 Subject: [PATCH 43/87] Address abraker's review, add approximation for legacy LN tails --- .../Difficulty/ManiaPerformanceCalculator.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f81881d16db6..b3b28bd613fa 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -265,20 +265,23 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); - // For values of x above 5, there is a very simple approximation to increase how far you can calculate x. + // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. + private double logPcHoldTail(double x, double deviation) => holdTailApprox(x / (deviation * Math.Sqrt(2))); + + // There are numerical approximations to increase how far you can calculate x. private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); - // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. - private double logPcHoldTail(double x, double deviation) => Math.Log(1 - Math.Pow(2 * Normal.CDF(0, deviation * Math.Sqrt(2), x) - 1, 2)); + // A handy approximation for the folded distribution is to subtract the natural log of the complementary CDF from log(2). + private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x), 2)) : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. - private double logSum(double l1, double l2) + private double logSum(double firstLog, double secondLog) { - double maxVal = Math.Max(l1, l2); - double minVal = Math.Min(l1, l2); + double maxVal = Math.Max(firstLog, secondLog); + double minVal = Math.Min(firstLog, secondLog); // 0 in log form becomes negative infinity, so return negative infinity if both numbers are negative infinity. - // We can assume negative infinity is 0 because you cannot write a negative in log form. + // Shouldn't happen on any UR>0, but good for redundancy purposes. if (double.IsNegativeInfinity(maxVal)) { return maxVal; @@ -287,9 +290,9 @@ private double logSum(double l1, double l2) return maxVal + Math.Log(1 + Math.Exp(minVal - maxVal)); } - private double logDiff(double l1, double l2) + private double logDiff(double firstLog, double secondLog) { - double maxVal = Math.Max(l1, l2); + double maxVal = Math.Max(firstLog, secondLog); // Avoid negative infinity - negative infinity (NaN) by checking if the higher value is negative infinity. See comment in logSum. if (double.IsNegativeInfinity(maxVal)) @@ -297,7 +300,7 @@ private double logDiff(double l1, double l2) return maxVal; } - return l1 + SpecialFunctions.Log1p(-Math.Exp(-(l1 - l2))); + return firstLog + SpecialFunctions.Log1p(-Math.Exp(-(firstLog - secondLog))); } } } From 4a8d67980c4401473059ec3d9099f7cc113046e9 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 21 Feb 2023 18:37:14 -0500 Subject: [PATCH 44/87] Fix NaNs (whoops) --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index b3b28bd613fa..df2600ee0d61 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -272,7 +272,7 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); // A handy approximation for the folded distribution is to subtract the natural log of the complementary CDF from log(2). - private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x), 2)) : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); + private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. private double logSum(double firstLog, double secondLog) From 3a1c47981d627b1a003c3d641c2b26cc848d02a4 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 24 Feb 2023 00:03:18 -0500 Subject: [PATCH 45/87] Avoid repeated code using structs and methods --- .../Difficulty/ManiaPerformanceCalculator.cs | 192 +++++++++--------- 1 file changed, 96 insertions(+), 96 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index df2600ee0d61..ed81cd62ad9e 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -93,114 +93,33 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) double[] hitWindows = isLegacyScore ? getLegacyHitWindows(score, attributes) : getLazerHitWindows(score, attributes); - double hMax = hitWindows[0]; - double h300 = hitWindows[1]; - double h200 = hitWindows[2]; - double h100 = hitWindows[3]; - double h50 = hitWindows[4]; - - double nJudgements = Math.Log(totalJudgements); double nNoteCount = Math.Log(attributes.NoteCount); double nHoldCount = Math.Log(attributes.HoldNoteCount); double nNoteHoldCount = Math.Log(attributes.NoteCount + attributes.HoldNoteCount); - // https://www.desmos.com/calculator/tybjpjfjlz double legacyLikelihoodGradient(double d) { if (d <= 0) return 0; - // The variable name 'logPc' means 'log probability complementary'. - double pMaxNote = logDiff(0, logPcNote(hMax, d)); - double p300Note = logDiff(logPcNote(hMax, d), logPcNote(h300, d)); - double p200Note = logDiff(logPcNote(h300, d), logPcNote(h200, d)); - double p100Note = logDiff(logPcNote(h200, d), logPcNote(h100, d)); - double p50Note = logDiff(logPcNote(h100, d), logPcNote(h50, d)); - double p0Note = logPcNote(h50, d); - - // Since we're using complementary probabilities for precision, multiplying the head and tail probabilities takes the form P(A∩B)' = P(A'∪B') = P(A') + P(B') - P(A'∩B'). - double combinedProb(double p1, double p2) => logDiff(logSum(p1, p2), p1 + p2); - - double logPcMaxHead = logPcNote(hMax * 1.2, d); - double logPcMaxTail = logPcHoldTail(hMax * 2.4, d); - double pMaxHold = logDiff(0, combinedProb(logPcMaxHead, logPcMaxTail)); - - double logPc300Head = logPcNote(h300 * 1.1, d); - double logPc300Tail = logPcHoldTail(h300 * 2.2, d); - double p300Hold = logDiff(combinedProb(logPcMaxHead, logPcMaxTail), combinedProb(logPc300Head, logPc300Tail)); - - double logPc200Head = logPcNote(h200, d); - double logPc200Tail = logPcHoldTail(h200 * 2, d); - double p200Hold = logDiff(combinedProb(logPc300Head, logPc300Tail), combinedProb(logPc200Head, logPc200Tail)); - - double logPc100Head = logPcNote(h100, d); - double logPc100Tail = logPcHoldTail(h100 * 2, d); - double p100Hold = logDiff(combinedProb(logPc200Head, logPc200Tail), combinedProb(logPc100Head, logPc100Tail)); - - double logPc50Head = logPcNote(h50, d); - double logPc50Tail = logPcHoldTail(h50 * 2, d); - double p50Hold = logDiff(combinedProb(logPc100Head, logPc100Tail), combinedProb(logPc50Head, logPc50Tail)); - - double p0Hold = combinedProb(logPc50Head, logPc50Tail); - - double pMax = logSum(pMaxNote + nNoteCount, pMaxHold + nHoldCount) - nJudgements; - double p300 = logSum(p300Note + nNoteCount, p300Hold + nHoldCount) - nJudgements; - double p200 = logSum(p200Note + nNoteCount, p200Hold + nHoldCount) - nJudgements; - double p100 = logSum(p100Note + nNoteCount, p100Hold + nHoldCount) - nJudgements; - double p50 = logSum(p50Note + nNoteCount, p50Hold + nHoldCount) - nJudgements; - double p0 = logSum(p0Note + nNoteCount, p0Hold + nHoldCount) - nJudgements; - - double gradient = Math.Exp( - (countPerfect * pMax - + (countGreat + 0.5) * p300 - + countGood * p200 - + countOk * p100 - + countMeh * p50 - + countMiss * p0) / totalJudgements - ); - - return -gradient; + JudgementProbs pNotes = pNote(hitWindows, d); + + JudgementProbs pHolds = pHold(hitWindows, d); + + return -totalProb(pNotes, pHolds, nNoteCount, nHoldCount); } - // https://www.desmos.com/calculator/piqxqmnuks double lazerLikelihoodGradient(double d) { if (d <= 0) return 0; - double pMaxNote = logDiff(0, logPcNote(hMax, d)); - double p300Note = logDiff(logPcNote(hMax, d), logPcNote(h300, d)); - double p200Note = logDiff(logPcNote(h300, d), logPcNote(h200, d)); - double p100Note = logDiff(logPcNote(h200, d), logPcNote(h100, d)); - double p50Note = logDiff(logPcNote(h100, d), logPcNote(h50, d)); - double p0Note = logPcNote(h50, d); - - // Lazer LN tails have a bigger hit window, so calculate the probability of hitting them separately. - // We don't use "logPcHoldTail` for these since they have the same hit mechanics as a regular note. - double pMaxTail = logDiff(0, logPcNote(hMax * tail_multiplier, d)); - double p300Tail = logDiff(logPcNote(hMax * tail_multiplier, d), logPcNote(h300 * tail_multiplier, d)); - double p200Tail = logDiff(logPcNote(h300 * tail_multiplier, d), logPcNote(h200 * tail_multiplier, d)); - double p100Tail = logDiff(logPcNote(h200 * tail_multiplier, d), logPcNote(h100 * tail_multiplier, d)); - double p50Tail = logDiff(logPcNote(h100 * tail_multiplier, d), logPcNote(h50 * tail_multiplier, d)); - double p0Tail = logPcNote(h50 * tail_multiplier, d); - - double pMax = logSum(pMaxNote + nNoteHoldCount, pMaxTail + nHoldCount) - nJudgements; - double p300 = logSum(p300Note + nNoteHoldCount, p300Tail + nHoldCount) - nJudgements; - double p200 = logSum(p200Note + nNoteHoldCount, p200Tail + nHoldCount) - nJudgements; - double p100 = logSum(p100Note + nNoteHoldCount, p100Tail + nHoldCount) - nJudgements; - double p50 = logSum(p50Note + nNoteHoldCount, p50Tail + nHoldCount) - nJudgements; - double p0 = logSum(p0Note + nNoteHoldCount, p0Tail + nHoldCount) - nJudgements; - - double gradient = Math.Exp( - (countPerfect * pMax - + (countGreat + 0.5) * p300 - + countGood * p200 - + countOk * p100 - + countMeh * p50 - + countMiss * p0) / totalJudgements - ); - - return -gradient; + JudgementProbs pNotes = pNote(hitWindows, d); + + // We use pNote instead of pHold because lazer tails behave the same as Notes. + JudgementProbs pTails = pNote(hitWindows, d, tail_multiplier); + + return -totalProb(pNotes, pTails, nNoteHoldCount, nHoldCount); } // Finding the minimum of the function returns the most likely deviation for the hit results. UR is deviation * 10. @@ -263,16 +182,97 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a return hitWindows; } + private struct JudgementProbs + { + public double PMax; + public double P300; + public double P200; + public double P100; + public double P50; + public double P0; + } + + private JudgementProbs pNote(double[] hitWindows, double d, double multiplier = 1) + { + JudgementProbs probabilities = new JudgementProbs + { + PMax = logDiff(0, logPcNote(hitWindows[0] * multiplier, d)), + P300 = logDiff(logPcNote(hitWindows[0] * multiplier, d), logPcNote(hitWindows[1] * multiplier, d)), + P200 = logDiff(logPcNote(hitWindows[1] * multiplier, d), logPcNote(hitWindows[2] * multiplier, d)), + P100 = logDiff(logPcNote(hitWindows[2] * multiplier, d), logPcNote(hitWindows[3] * multiplier, d)), + P50 = logDiff(logPcNote(hitWindows[3] * multiplier, d), logPcNote(hitWindows[4] * multiplier, d)), + P0 = logPcNote(hitWindows[4] * multiplier, d) + }; + + return probabilities; + } + + private JudgementProbs pHold(double[] hitWindows, double d) + { + JudgementProbs probabilities = new JudgementProbs(); + + // Since we're using complementary probabilities for precision, multiplying the head and tail probabilities takes the form P(A∩B)' = P(A'∪B') = P(A') + P(B') - P(A'∩B'). + double combinedProb(double p1, double p2) => logDiff(logSum(p1, p2), p1 + p2); + + double logPcMaxHead = logPcNote(hitWindows[0] * 1.2, d); + double logPcMaxTail = logPcHoldTail(hitWindows[0] * 2.4, d); + probabilities.PMax = logDiff(0, combinedProb(logPcMaxHead, logPcMaxTail)); + + double logPc300Head = logPcNote(hitWindows[1] * 1.1, d); + double logPc300Tail = logPcHoldTail(hitWindows[1] * 2.2, d); + probabilities.P300 = logDiff(combinedProb(logPcMaxHead, logPcMaxTail), combinedProb(logPc300Head, logPc300Tail)); + + double logPc200Head = logPcNote(hitWindows[2], d); + double logPc200Tail = logPcHoldTail(hitWindows[2] * 2, d); + probabilities.P200 = logDiff(combinedProb(logPc300Head, logPc300Tail), combinedProb(logPc200Head, logPc200Tail)); + + double logPc100Head = logPcNote(hitWindows[3], d); + double logPc100Tail = logPcHoldTail(hitWindows[3] * 2, d); + probabilities.P100 = logDiff(combinedProb(logPc200Head, logPc200Tail), combinedProb(logPc100Head, logPc100Tail)); + + double logPc50Head = logPcNote(hitWindows[4], d); + double logPc50Tail = logPcHoldTail(hitWindows[4] * 2, d); + probabilities.P50 = logDiff(combinedProb(logPc100Head, logPc100Tail), combinedProb(logPc50Head, logPc50Tail)); + + probabilities.P0 = combinedProb(logPc50Head, logPc50Tail); + + return probabilities; + } + + // First object count can be either notes or notes + holds as stable LNs give one judgement but lazer LNs give two. + private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, double firstObjectCount, double secondObjectCount) + { + double pMax = logSum(firstProbs.PMax + firstObjectCount, secondProbs.PMax + secondObjectCount) - Math.Log(totalJudgements); + double p300 = logSum(firstProbs.P300 + firstObjectCount, secondProbs.P300 + secondObjectCount) - Math.Log(totalJudgements); + double p200 = logSum(firstProbs.P200 + firstObjectCount, secondProbs.P200 + secondObjectCount) - Math.Log(totalJudgements); + double p100 = logSum(firstProbs.P100 + firstObjectCount, secondProbs.P100 + secondObjectCount) - Math.Log(totalJudgements); + double p50 = logSum(firstProbs.P50 + firstObjectCount, secondProbs.P50 + secondObjectCount) - Math.Log(totalJudgements); + double p0 = logSum(firstProbs.P0 + firstObjectCount, secondProbs.P0 + secondObjectCount) - Math.Log(totalJudgements); + + double totalProb = Math.Exp( + (countPerfect * pMax + + (countGreat + 0.5) * p300 + + countGood * p200 + + countOk * p100 + + countMeh * p50 + + countMiss * p0) / totalJudgements + ); + + return totalProb; + } + private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. private double logPcHoldTail(double x, double deviation) => holdTailApprox(x / (deviation * Math.Sqrt(2))); - // There are numerical approximations to increase how far you can calculate x. - private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); + private double logErfcApprox(double x) => x <= 5 + ? Math.Log(SpecialFunctions.Erfc(x)) + : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); - // A handy approximation for the folded distribution is to subtract the natural log of the complementary CDF from log(2). - private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); + private double holdTailApprox(double x) => x <= 7 + ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) + : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. private double logSum(double firstLog, double secondLog) From 66529f67b8ff37cce1bbfe45572f19ecb38a30c3 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 24 Feb 2023 00:41:34 -0500 Subject: [PATCH 46/87] Add comments --- .../Difficulty/ManiaPerformanceCalculator.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index ed81cd62ad9e..e4a2facb529b 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -97,6 +97,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) double nHoldCount = Math.Log(attributes.HoldNoteCount); double nNoteHoldCount = Math.Log(attributes.NoteCount + attributes.HoldNoteCount); + // Find the likelihood of a deviation resulting in the play's judgements. Higher is more likely, so we find the peak of the curve. double legacyLikelihoodGradient(double d) { if (d <= 0) @@ -182,6 +183,7 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a return hitWindows; } + // This struct allows us to return the probability of hitting every judgement with a single method. private struct JudgementProbs { public double PMax; @@ -192,6 +194,7 @@ private struct JudgementProbs public double P0; } + // This method finds the probability of hitting a certain judgement on Notes given a deviation. The multiplier is for lazer LN tails, which are 1.5x as lenient. private JudgementProbs pNote(double[] hitWindows, double d, double multiplier = 1) { JudgementProbs probabilities = new JudgementProbs @@ -207,6 +210,7 @@ private JudgementProbs pNote(double[] hitWindows, double d, double multiplier = return probabilities; } + // This method finds the probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. private JudgementProbs pHold(double[] hitWindows, double d) { JudgementProbs probabilities = new JudgementProbs(); @@ -239,9 +243,10 @@ private JudgementProbs pHold(double[] hitWindows, double d) return probabilities; } - // First object count can be either notes or notes + holds as stable LNs give one judgement but lazer LNs give two. + // Combines pNotes and pHolds/pTails into 1 probability value for each judgement, and compares it to the judgements of the play. A higher output means the deviation is more likely. private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, double firstObjectCount, double secondObjectCount) { + // firstObjectCount can be either Notes, or Notes + Holds, as stable LN heads don't behave like Notes but lazer LN heads do. double pMax = logSum(firstProbs.PMax + firstObjectCount, secondProbs.PMax + secondObjectCount) - Math.Log(totalJudgements); double p300 = logSum(firstProbs.P300 + firstObjectCount, secondProbs.P300 + secondObjectCount) - Math.Log(totalJudgements); double p200 = logSum(firstProbs.P200 + firstObjectCount, secondProbs.P200 + secondObjectCount) - Math.Log(totalJudgements); @@ -268,11 +273,11 @@ private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) - : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); + : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); // https://www.desmos.com/calculator/aaftj14euk private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) - : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); + : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // https://www.desmos.com/calculator/lgwyhx0fxo // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. private double logSum(double firstLog, double secondLog) From bfc642ee9b07c56fe5191bf17c5d7b85a914a765 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 24 Feb 2023 21:22:17 -0500 Subject: [PATCH 47/87] Change types, remove pointless duplicate likelihood function --- .../Difficulty/ManiaPerformanceCalculator.cs | 30 ++++++------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index e4a2facb529b..de74c5311dcd 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -93,38 +93,26 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) double[] hitWindows = isLegacyScore ? getLegacyHitWindows(score, attributes) : getLazerHitWindows(score, attributes); - double nNoteCount = Math.Log(attributes.NoteCount); + // Lazer LN heads are the same as Notes, so return NoteCount + HoldNoteCount for lazer scores. + double nNoteCount = isLegacyScore ? Math.Log(attributes.NoteCount) : Math.Log(attributes.NoteCount + attributes.HoldNoteCount); double nHoldCount = Math.Log(attributes.HoldNoteCount); - double nNoteHoldCount = Math.Log(attributes.NoteCount + attributes.HoldNoteCount); // Find the likelihood of a deviation resulting in the play's judgements. Higher is more likely, so we find the peak of the curve. - double legacyLikelihoodGradient(double d) + double likelihoodGradient(double d) { if (d <= 0) return 0; JudgementProbs pNotes = pNote(hitWindows, d); - - JudgementProbs pHolds = pHold(hitWindows, d); + // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. + JudgementProbs pHolds = isLegacyScore ? pHold(hitWindows, d) : pNote(hitWindows, d, tail_multiplier); return -totalProb(pNotes, pHolds, nNoteCount, nHoldCount); } - double lazerLikelihoodGradient(double d) - { - if (d <= 0) - return 0; - - JudgementProbs pNotes = pNote(hitWindows, d); - - // We use pNote instead of pHold because lazer tails behave the same as Notes. - JudgementProbs pTails = pNote(hitWindows, d, tail_multiplier); - - return -totalProb(pNotes, pTails, nNoteHoldCount, nHoldCount); - } - // Finding the minimum of the function returns the most likely deviation for the hit results. UR is deviation * 10. - double deviation = isLegacyScore ? FindMinimum.OfScalarFunction(legacyLikelihoodGradient, 30) : FindMinimum.OfScalarFunction(lazerLikelihoodGradient, 30); + double deviation = FindMinimum.OfScalarFunction(likelihoodGradient, 30); + return deviation * 10; } @@ -195,7 +183,7 @@ private struct JudgementProbs } // This method finds the probability of hitting a certain judgement on Notes given a deviation. The multiplier is for lazer LN tails, which are 1.5x as lenient. - private JudgementProbs pNote(double[] hitWindows, double d, double multiplier = 1) + private JudgementProbs pNote(IReadOnlyList hitWindows, double d, double multiplier = 1) { JudgementProbs probabilities = new JudgementProbs { @@ -211,7 +199,7 @@ private JudgementProbs pNote(double[] hitWindows, double d, double multiplier = } // This method finds the probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. - private JudgementProbs pHold(double[] hitWindows, double d) + private JudgementProbs pHold(IReadOnlyList hitWindows, double d) { JudgementProbs probabilities = new JudgementProbs(); From ab8d19e62729b8029db24b4f3178cfc1a5e47d75 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Fri, 24 Feb 2023 21:31:57 -0500 Subject: [PATCH 48/87] Fix erfc approximation --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index de74c5311dcd..a26b899d4a49 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -261,7 +261,7 @@ private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, private double logErfcApprox(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) - : -Math.Pow(x, 2) - Math.Log(x) - Math.Log(Math.Sqrt(Math.PI)); // https://www.desmos.com/calculator/aaftj14euk + : -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI)); // https://www.desmos.com/calculator/kdbxwxgf01 private double holdTailApprox(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) From 6399b9b5b159a93ac28ade2991f3223eeb4f2236 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 5 Mar 2023 21:35:36 -0500 Subject: [PATCH 49/87] expose hit windows publicly for testing purposes --- .../Difficulty/ManiaPerformanceAttributes.cs | 3 ++ .../Difficulty/ManiaPerformanceCalculator.cs | 54 ++++++++++--------- 2 files changed, 31 insertions(+), 26 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs index ed5165aad1a9..5055b18d34c6 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs @@ -17,6 +17,9 @@ public class ManiaPerformanceAttributes : PerformanceAttributes [JsonProperty("estimated_ur")] public double? EstimatedUr { get; set; } + [JsonProperty("hit_windows")] + public double[] HitWindows { get; set; } + public override IEnumerable GetAttributesForDisplay() { foreach (var attribute in base.GetAttributesForDisplay()) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index a26b899d4a49..fbaf3eb67703 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -11,6 +11,7 @@ using osu.Framework.Audio.Track; using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Rulesets.Difficulty; +using osu.Game.Rulesets.Mania.Mods; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; @@ -28,6 +29,8 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private int countMeh; private int countMiss; private double? estimatedUr; + private bool isLegacyScore; + private double[] hitWindows; public ManiaPerformanceCalculator() : base(new ManiaRuleset()) @@ -44,7 +47,9 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - estimatedUr = computeEstimatedUr(score, maniaAttributes); + isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && totalJudgements == maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount; + hitWindows = isLegacyScore ? getLegacyHitWindows(score, maniaAttributes) : getLazerHitWindows(score, maniaAttributes); + estimatedUr = computeEstimatedUr(maniaAttributes); // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. // The specific number has no intrinsic meaning and can be adjusted as needed. @@ -62,7 +67,8 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s { Difficulty = difficultyValue, Total = totalValue, - EstimatedUr = estimatedUr + EstimatedUr = estimatedUr, + HitWindows = hitWindows }; } @@ -84,15 +90,11 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// /// Accuracy used to weight judgements independently from the score's actual accuracy. /// - private double? computeEstimatedUr(ScoreInfo score, ManiaDifficultyAttributes attributes) + private double? computeEstimatedUr(ManiaDifficultyAttributes attributes) { if (totalSuccessfulJudgements == 0 || attributes.NoteCount + attributes.HoldNoteCount == 0) return null; - bool isLegacyScore = score.Mods.Any(m => m is ModClassic) && totalJudgements == attributes.NoteCount + attributes.HoldNoteCount; - - double[] hitWindows = isLegacyScore ? getLegacyHitWindows(score, attributes) : getLazerHitWindows(score, attributes); - // Lazer LN heads are the same as Notes, so return NoteCount + HoldNoteCount for lazer scores. double nNoteCount = isLegacyScore ? Math.Log(attributes.NoteCount) : Math.Log(attributes.NoteCount + attributes.HoldNoteCount); double nHoldCount = Math.Log(attributes.HoldNoteCount); @@ -103,9 +105,9 @@ double likelihoodGradient(double d) if (d <= 0) return 0; - JudgementProbs pNotes = pNote(hitWindows, d); + JudgementProbs pNotes = pNote(d); // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. - JudgementProbs pHolds = isLegacyScore ? pHold(hitWindows, d) : pNote(hitWindows, d, tail_multiplier); + JudgementProbs pHolds = isLegacyScore ? pHold(d) : pNote(d, tail_multiplier); return -totalProb(pNotes, pHolds, nNoteCount, nHoldCount); } @@ -118,7 +120,7 @@ double likelihoodGradient(double d) private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) { - double[] judgements = new double[5]; + double[] legacyHitWindows = new double[5]; double overallDifficulty = attributes.OverallDifficulty; @@ -132,18 +134,18 @@ private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes else if (score.Mods.Any(m => m is ModEasy)) windowMultiplier *= 1.4; - judgements[0] = Math.Floor(16 * windowMultiplier); - judgements[1] = Math.Floor((64 - 3 * overallDifficulty) * windowMultiplier); - judgements[2] = Math.Floor((97 - 3 * overallDifficulty) * windowMultiplier); - judgements[3] = Math.Floor((127 - 3 * overallDifficulty) * windowMultiplier); - judgements[4] = Math.Floor((151 - 3 * overallDifficulty) * windowMultiplier); + legacyHitWindows[0] = Math.Floor(16 * windowMultiplier); + legacyHitWindows[1] = Math.Floor((64 - 3 * overallDifficulty) * windowMultiplier); + legacyHitWindows[2] = Math.Floor((97 - 3 * overallDifficulty) * windowMultiplier); + legacyHitWindows[3] = Math.Floor((127 - 3 * overallDifficulty) * windowMultiplier); + legacyHitWindows[4] = Math.Floor((151 - 3 * overallDifficulty) * windowMultiplier); - return judgements; + return legacyHitWindows; } private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) { - double[] hitWindows = new double[5]; + double[] lazerHitWindows = new double[5]; // Create a new track of arbitrary length var track = new TrackVirtual(10000); @@ -160,15 +162,15 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a windowMultiplier *= 1.4; if (attributes.OverallDifficulty < 5) - hitWindows[0] = (22.4 - 0.6 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[0] = (22.4 - 0.6 * attributes.OverallDifficulty) * windowMultiplier; else - hitWindows[0] = (24.9 - 1.1 * attributes.OverallDifficulty) * windowMultiplier; - hitWindows[1] = (64 - 3 * attributes.OverallDifficulty) * windowMultiplier; - hitWindows[2] = (97 - 3 * attributes.OverallDifficulty) * windowMultiplier; - hitWindows[3] = (127 - 3 * attributes.OverallDifficulty) * windowMultiplier; - hitWindows[4] = (151 - 3 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[0] = (24.9 - 1.1 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[1] = (64 - 3 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[2] = (97 - 3 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[3] = (127 - 3 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[4] = (151 - 3 * attributes.OverallDifficulty) * windowMultiplier; - return hitWindows; + return lazerHitWindows; } // This struct allows us to return the probability of hitting every judgement with a single method. @@ -183,7 +185,7 @@ private struct JudgementProbs } // This method finds the probability of hitting a certain judgement on Notes given a deviation. The multiplier is for lazer LN tails, which are 1.5x as lenient. - private JudgementProbs pNote(IReadOnlyList hitWindows, double d, double multiplier = 1) + private JudgementProbs pNote(double d, double multiplier = 1) { JudgementProbs probabilities = new JudgementProbs { @@ -199,7 +201,7 @@ private JudgementProbs pNote(IReadOnlyList hitWindows, double d, double } // This method finds the probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. - private JudgementProbs pHold(IReadOnlyList hitWindows, double d) + private JudgementProbs pHold(double d) { JudgementProbs probabilities = new JudgementProbs(); From 32a3878e8fc75029064b4ff08972cf8195b7d6d3 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 15 Apr 2023 22:40:06 -0400 Subject: [PATCH 50/87] Add tests --- .../ManiaUnstableRateEstimationTest.cs | 114 + .../Difficulty/ManiaPerformanceCalculator.cs | 3 + .../Testing/Beatmaps/ur-estimation-test.osu | 8042 +++++++++++++++++ 3 files changed, 8159 insertions(+) create mode 100644 osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs create mode 100644 osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs new file mode 100644 index 000000000000..698e4c4b49b8 --- /dev/null +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -0,0 +1,114 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +#nullable disable + +using NUnit.Framework; +using osu.Game.Beatmaps; +using osu.Game.Rulesets.Difficulty; +using osu.Game.Rulesets.Mania.Difficulty; +using osu.Game.Rulesets.Mania.Mods; +using osu.Game.Scoring; +using osu.Game.Tests.Beatmaps; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using osu.Framework.Extensions.ObjectExtensions; +using osu.Game.Beatmaps.Formats; +using osu.Game.IO; +using osu.Game.Rulesets.Mania.Scoring; +using osu.Game.Rulesets.Mods; +using osu.Game.Rulesets.Scoring; + +namespace osu.Game.Rulesets.Mania.Tests +{ + public class ManiaUnstableRateEstimationTest + { + private const string resource_namespace = "Testing.Beatmaps"; + protected string ResourceAssembly => "osu.Game.Rulesets.Mania"; + + [TestCase(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 }, "ur-estimation-test")] + [TestCase(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 }, "ur-estimation-test")] + public void Test1(double expectedEstimatedUnstableRate, int[] judgements, string name) + => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name); + + [TestCase(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 }, "ur-estimation-test")] + public void Test1ClockRateAdjusted(double expectedEstimatedUnstableRate, int[] judgements, string name) + => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name, new ManiaModDoubleTime()); + + [TestCase(7.0d, "ur-estimation-test")] + public void Test2(double overallDifficulty, string name) + => TestHitWindows(overallDifficulty, name); + + protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, string name, params Mod[] mods) + { + DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(mods); + + var judgements = new Dictionary + { + { HitResult.Perfect, judgementCounts[0] }, + { HitResult.Great, judgementCounts[1] }, + { HitResult.Good, judgementCounts[2] }, + { HitResult.Ok, judgementCounts[3] }, + { HitResult.Meh, judgementCounts[4] }, + { HitResult.Miss, judgementCounts[5] } + }; + + ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo(getBeatmap(name).BeatmapInfo) + { + Mods = mods, + Statistics = judgements + }, attributes); + + // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. + Assert.That(perfAttributes.EstimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001)); + } + + protected void TestHitWindows(double overallDifficulty, string name) + { + DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(); + + var hitWindows = new ManiaHitWindows(); + hitWindows.SetDifficulty(overallDifficulty); + + double[] trueHitWindows = + { + hitWindows.WindowFor(HitResult.Perfect), + hitWindows.WindowFor(HitResult.Great), + hitWindows.WindowFor(HitResult.Good), + hitWindows.WindowFor(HitResult.Ok), + hitWindows.WindowFor(HitResult.Meh) + }; + + ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo(getBeatmap(name).BeatmapInfo), attributes); + + // Platform-dependent math functions (Pow, Cbrt, Exp, etc) may result in minute differences. + Assert.That(perfAttributes.HitWindows, Is.EqualTo(trueHitWindows).Within(0.000001)); + } + + private WorkingBeatmap getBeatmap(string name) + { + using (var resStream = openResource($"{resource_namespace}.{name}.osu")) + using (var stream = new LineBufferedReader(resStream)) + { + var decoder = Decoder.GetDecoder(stream); + + ((LegacyBeatmapDecoder)decoder).ApplyOffsets = false; + + return new TestWorkingBeatmap(decoder.Decode(stream)) + { + BeatmapInfo = + { + Ruleset = new ManiaRuleset().RulesetInfo + } + }; + } + } + + private Stream openResource(string name) + { + string localPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).AsNonNull(); + return Assembly.LoadFrom(Path.Combine(localPath, $"{ResourceAssembly}.dll")).GetManifestResourceStream($@"{ResourceAssembly}.Resources.{name}"); + } + } +} diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index fbaf3eb67703..96d160f480d2 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -37,6 +37,9 @@ public ManiaPerformanceCalculator() { } + public new ManiaPerformanceAttributes Calculate(ScoreInfo score, DifficultyAttributes attributes) + => (ManiaPerformanceAttributes)CreatePerformanceAttributes(score, attributes); + protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo score, DifficultyAttributes attributes) { var maniaAttributes = (ManiaDifficultyAttributes)attributes; diff --git a/osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu b/osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu new file mode 100644 index 000000000000..690de52c6d6b --- /dev/null +++ b/osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu @@ -0,0 +1,8042 @@ +osu file format v14 + +[General] +AudioFilename: audio.mp3 +AudioLeadIn: 0 +PreviewTime: 203197 +Countdown: 0 +SampleSet: Soft +StackLeniency: 0.7 +Mode: 3 +LetterboxInBreaks: 0 +SpecialStyle: 0 +WidescreenStoryboard: 0 + +[Editor] +Bookmarks: 10295,15506 +DistanceSpacing: 0.8 +BeatDivisor: 12 +GridSize: 16 +TimelineZoom: 3 + +[Metadata] +Title:Energy * Drin-ko * Fein-chan! (Camellia's "MONSTERISTIC" D. M. P. Remix) +TitleUnicode:エナジー*ドリン娘☆ふぇいんちゃん! (かめりあ's "MONSTERISTIC" Dempa Machinegun Psystyle Remix) +Artist:Camellia feat. Nanahira +ArtistUnicode:かめりあ feat. ななひら +Creator:Kim_GodSSI +Version:Energy Drink +Source: +Tags:kamelcamellia かめるかめりあ fa featured artist cametek かめてく 平田七海 Nanami Hirata 奥村りお Rio Okumura electronic denpa j-core jcore japanese j-pop jpop hardcore Voltage Ignition 2 MOTF-0002 Movement on the FLOOR c85 comiket85 comic market 85 コミケ85 コミックマーケット85 Camellia "Remixes" Summary & VIPs 02 c94 comiket94 comic market 94 コミケ94 コミックマーケット94 CTCD-0017 doujin indie marathon long notes Full LN Inverses kimgodssi drinkgirl drinking enajii dorinko feinchan +BeatmapID:2727115 +BeatmapSetID:1316055 + +[Difficulty] +HPDrainRate:8.5 +CircleSize:7 +OverallDifficulty:7 +ApproachRate:5 +SliderMultiplier:1.4 +SliderTickRate:1 + +[Events] +//Background and Video events +0,0,"bg.jpg",0,0 +//Break Periods +//Storyboard Layer 0 (Background) +//Storyboard Layer 1 (Fail) +//Storyboard Layer 2 (Pass) +//Storyboard Layer 3 (Foreground) +//Storyboard Layer 4 (Overlay) +//Storyboard Sound Samples + +[TimingPoints] +980,315.789473684211,4,2,1,35,1,0 +93190,-100,4,2,1,35,0,1 +120980,-100,4,2,1,35,0,0 +146243,320.855614973262,4,2,1,35,1,0 +146243,-98.0392156862745,4,2,1,35,0,0 +146563,342.857142857143,4,2,1,35,1,0 +146563,-91.743119266055,4,2,1,35,0,0 +146905,348.837209302326,4,2,1,35,1,0 +146905,-90.9090909090909,4,2,1,35,0,0 +147253,375,4,2,1,35,1,0 +147253,-84.0336134453782,4,2,1,35,0,0 +148003,379.746835443038,4,2,1,35,1,0 +148003,-83.3333333333333,4,2,1,35,0,0 +148382,400,4,2,1,35,1,0 +148382,-78.740157480315,4,2,1,35,0,0 +148782,387.096774193548,4,2,1,35,1,0 +148782,-81.3008130081301,4,2,1,35,0,0 +149169,392.156862745098,4,2,1,35,1,0 +149169,-80.6451612903226,4,2,1,35,0,0 +149561,405.405405405405,4,2,1,35,1,0 +149561,-78.125,4,2,1,35,0,0 +151586,387.096774193548,4,2,1,35,1,0 +151586,-81.3008130081301,4,2,1,35,0,0 +152360,400,4,2,1,35,1,0 +152360,-78.740157480315,4,2,1,35,0,0 +165560,385.852090032154,4,2,1,35,1,0 +165560,-81.9672131147541,4,2,1,35,0,0 +167103,368.098159509202,4,2,1,35,1,0 +167103,-85.4700854700855,4,2,1,35,0,0 +168575,348.837209302326,4,2,1,35,1,0 +168575,-90.9090909090909,4,2,1,35,0,0 +169970,333.333333333333,4,2,1,35,1,0 +169970,-94.3396226415094,4,2,1,35,0,0 +171303,315.789473684211,4,2,1,35,1,0 +171303,-100,4,2,1,35,0,0 +172250,315.789473684211,4,2,1,35,1,0 +205092,-100,4,2,1,35,0,1 +232881,-100,4,2,1,35,0,0 +260671,-100,4,2,1,35,0,1 +289723,-100,4,2,1,35,0,0 + + +[HitObjects] +329,192,980,5,0,0:0:0:0: +475,192,980,1,0,0:0:0:0: +36,192,980,1,0,0:0:0:0: +182,192,980,1,0,0:0:0:0: +256,192,980,1,0,0:0:0:0: +402,192,1137,1,0,0:0:0:0: +475,192,1137,1,0,0:0:0:0: +182,192,1137,1,0,0:0:0:0: +329,192,1216,1,0,0:0:0:0: +109,192,1216,1,0,0:0:0:0: +36,192,1216,1,0,0:0:0:0: +36,192,1374,1,0,0:0:0:0: +109,192,1374,1,0,0:0:0:0: +329,192,1374,1,0,0:0:0:0: +182,192,1453,1,0,0:0:0:0: +402,192,1453,1,0,0:0:0:0: +475,192,1453,1,0,0:0:0:0: +475,192,1611,1,0,0:0:0:0: +329,192,1611,1,0,0:0:0:0: +402,192,1611,1,0,0:0:0:0: +36,192,1690,1,0,0:0:0:0: +182,192,1690,1,0,0:0:0:0: +109,192,1690,1,0,0:0:0:0: +329,192,1769,1,0,0:0:0:0: +402,192,1769,1,0,0:0:0:0: +475,192,1769,1,0,0:0:0:0: +109,192,1848,1,0,0:0:0:0: +36,192,1848,1,0,0:0:0:0: +182,192,1848,1,0,0:0:0:0: +256,192,1927,1,0,0:0:0:0: +329,192,1927,1,0,0:0:0:0: +402,192,1927,1,0,0:0:0:0: +475,192,1927,1,0,0:0:0:0: +109,192,2085,1,0,0:0:0:0: +182,192,2085,1,0,0:0:0:0: +329,192,2085,1,0,0:0:0:0: +402,192,2085,1,0,0:0:0:0: +475,192,2243,128,0,2558:0:0:0:0: +109,192,2243,1,0,0:0:0:0: +329,192,2243,1,0,0:0:0:0: +402,192,2243,1,0,0:0:0:0: +36,192,2243,1,0,0:0:0:0: +256,192,2322,1,0,0:0:0:0: +182,192,2322,1,0,0:0:0:0: +402,192,2401,1,0,0:0:0:0: +36,192,2401,1,0,0:0:0:0: +329,192,2401,1,0,0:0:0:0: +182,192,2480,1,0,0:0:0:0: +256,192,2480,1,0,0:0:0:0: +109,192,2558,1,0,0:0:0:0: +36,192,2558,1,0,0:0:0:0: +402,192,2558,1,0,0:0:0:0: +256,192,2637,1,0,0:0:0:0: +182,192,2637,1,0,0:0:0:0: +109,192,2716,128,0,3032:0:0:0:0: +402,192,2716,1,0,0:0:0:0: +475,192,2716,1,0,0:0:0:0: +36,192,2716,1,0,0:0:0:0: +329,192,2716,1,0,0:0:0:0: +182,192,2795,1,0,0:0:0:0: +256,192,2795,1,0,0:0:0:0: +475,192,2874,1,0,0:0:0:0: +329,192,2874,1,0,0:0:0:0: +402,192,2874,1,0,0:0:0:0: +182,192,2953,1,0,0:0:0:0: +256,192,2953,1,0,0:0:0:0: +475,192,3032,1,0,0:0:0:0: +402,192,3032,1,0,0:0:0:0: +36,192,3032,1,0,0:0:0:0: +256,192,3111,1,0,0:0:0:0: +329,192,3111,1,0,0:0:0:0: +475,192,3190,128,0,4453:0:0:0:0: +182,192,3190,1,0,0:0:0:0: +402,192,3190,1,0,0:0:0:0: +36,192,3190,1,0,0:0:0:0: +329,192,3269,1,0,0:0:0:0: +109,192,3269,1,0,0:0:0:0: +256,192,3348,1,0,0:0:0:0: +36,192,3348,1,0,0:0:0:0: +402,192,3348,1,0,0:0:0:0: +329,192,3427,1,0,0:0:0:0: +182,192,3427,1,0,0:0:0:0: +256,192,3506,1,0,0:0:0:0: +109,192,3506,1,0,0:0:0:0: +36,192,3506,1,0,0:0:0:0: +182,192,3585,1,0,0:0:0:0: +329,192,3585,1,0,0:0:0:0: +256,192,3664,1,0,0:0:0:0: +402,192,3664,1,0,0:0:0:0: +36,192,3664,1,0,0:0:0:0: +109,192,3743,1,0,0:0:0:0: +329,192,3743,1,0,0:0:0:0: +182,192,3822,1,0,0:0:0:0: +36,192,3822,1,0,0:0:0:0: +402,192,3822,1,0,0:0:0:0: +329,192,3901,1,0,0:0:0:0: +109,192,3901,1,0,0:0:0:0: +402,192,3980,1,0,0:0:0:0: +256,192,3980,1,0,0:0:0:0: +182,192,4058,1,0,0:0:0:0: +36,192,4058,1,0,0:0:0:0: +402,192,4137,1,0,0:0:0:0: +256,192,4137,1,0,0:0:0:0: +329,192,4137,1,0,0:0:0:0: +109,192,4216,1,0,0:0:0:0: +182,192,4216,1,0,0:0:0:0: +36,192,4295,1,0,0:0:0:0: +329,192,4295,1,0,0:0:0:0: +402,192,4295,1,0,0:0:0:0: +182,192,4374,1,0,0:0:0:0: +256,192,4374,1,0,0:0:0:0: +402,192,4453,1,0,0:0:0:0: +36,192,4453,1,0,0:0:0:0: +329,192,4453,1,0,0:0:0:0: +109,192,4532,1,0,0:0:0:0: +256,192,4532,1,0,0:0:0:0: +182,192,4611,1,0,0:0:0:0: +329,192,4611,1,0,0:0:0:0: +256,192,4690,1,0,0:0:0:0: +402,192,4690,1,0,0:0:0:0: +182,192,4769,1,0,0:0:0:0: +475,192,4769,1,0,0:0:0:0: +109,192,4769,1,0,0:0:0:0: +36,192,4769,128,0,5085:0:0:0:0: +402,192,4848,1,0,0:0:0:0: +329,192,4848,1,0,0:0:0:0: +109,192,4927,1,0,0:0:0:0: +182,192,4927,1,0,0:0:0:0: +475,192,4927,1,0,0:0:0:0: +329,192,5006,1,0,0:0:0:0: +256,192,5006,1,0,0:0:0:0: +402,192,5085,1,0,0:0:0:0: +109,192,5085,1,0,0:0:0:0: +475,192,5085,1,0,0:0:0:0: +256,192,5164,1,0,0:0:0:0: +182,192,5164,1,0,0:0:0:0: +402,192,5243,128,0,5558:0:0:0:0: +475,192,5243,1,0,0:0:0:0: +109,192,5243,1,0,0:0:0:0: +36,192,5243,1,0,0:0:0:0: +329,192,5243,1,0,0:0:0:0: +182,192,5322,1,0,0:0:0:0: +256,192,5322,1,0,0:0:0:0: +36,192,5401,1,0,0:0:0:0: +329,192,5401,1,0,0:0:0:0: +475,192,5401,1,0,0:0:0:0: +182,192,5480,1,0,0:0:0:0: +109,192,5480,1,0,0:0:0:0: +329,192,5558,1,0,0:0:0:0: +36,192,5558,1,0,0:0:0:0: +475,192,5558,1,0,0:0:0:0: +256,192,5637,1,0,0:0:0:0: +182,192,5637,1,0,0:0:0:0: +36,192,5716,128,0,6980:0:0:0:0: +329,192,5716,1,0,0:0:0:0: +475,192,5716,1,0,0:0:0:0: +109,192,5716,1,0,0:0:0:0: +402,192,5795,1,0,0:0:0:0: +256,192,5795,1,0,0:0:0:0: +329,192,5874,1,0,0:0:0:0: +182,192,5874,1,0,0:0:0:0: +475,192,5874,1,0,0:0:0:0: +256,192,5953,1,0,0:0:0:0: +109,192,5953,1,0,0:0:0:0: +475,192,6032,1,0,0:0:0:0: +329,192,6032,1,0,0:0:0:0: +182,192,6032,1,0,0:0:0:0: +402,192,6111,1,0,0:0:0:0: +256,192,6111,1,0,0:0:0:0: +475,192,6190,1,0,0:0:0:0: +109,192,6190,1,0,0:0:0:0: +329,192,6190,1,0,0:0:0:0: +256,192,6269,1,0,0:0:0:0: +182,192,6269,1,0,0:0:0:0: +475,192,6348,1,0,0:0:0:0: +329,192,6348,1,0,0:0:0:0: +109,192,6348,1,0,0:0:0:0: +402,192,6427,1,0,0:0:0:0: +256,192,6427,1,0,0:0:0:0: +329,192,6506,1,0,0:0:0:0: +475,192,6506,1,0,0:0:0:0: +182,192,6506,1,0,0:0:0:0: +256,192,6585,1,0,0:0:0:0: +109,192,6585,1,0,0:0:0:0: +329,192,6664,1,0,0:0:0:0: +475,192,6664,1,0,0:0:0:0: +256,192,6743,1,0,0:0:0:0: +109,192,6743,1,0,0:0:0:0: +475,192,6822,1,0,0:0:0:0: +402,192,6822,1,0,0:0:0:0: +182,192,6822,1,0,0:0:0:0: +329,192,6901,1,0,0:0:0:0: +256,192,6980,1,0,0:0:0:0: +475,192,6980,1,0,0:0:0:0: +109,192,6980,1,0,0:0:0:0: +402,192,7058,1,0,0:0:0:0: +182,192,7058,1,0,0:0:0:0: +329,192,7137,1,0,0:0:0:0: +109,192,7137,1,0,0:0:0:0: +256,192,7216,1,0,0:0:0:0: +475,192,7295,128,0,7453:0:0:0:0: +36,192,7295,128,0,7611:0:0:0:0: +329,192,7295,128,0,7453:0:0:0:0: +109,192,7295,128,0,7374:0:0:0:0: +256,192,7374,128,0,7532:0:0:0:0: +182,192,7453,128,0,7611:0:0:0:0: +402,192,7453,128,0,7532:0:0:0:0: +329,192,7532,128,0,7611:0:0:0:0: +402,192,7611,1,0,0:0:0:0: +475,192,7611,1,0,0:0:0:0: +109,192,7611,128,0,7690:0:0:0:0: +256,192,7690,128,0,7769:0:0:0:0: +329,192,7690,1,0,0:0:0:0: +182,192,7769,128,0,7927:0:0:0:0: +36,192,7769,128,0,7927:0:0:0:0: +402,192,7769,128,0,7848:0:0:0:0: +475,192,7769,128,0,8085:0:0:0:0: +256,192,7848,128,0,8006:0:0:0:0: +109,192,7927,128,0,8006:0:0:0:0: +329,192,7927,128,0,8085:0:0:0:0: +182,192,8006,128,0,8085:0:0:0:0: +109,192,8085,1,0,0:0:0:0: +36,192,8085,1,0,0:0:0:0: +402,192,8085,128,0,8164:0:0:0:0: +329,192,8164,128,0,8243:0:0:0:0: +182,192,8164,1,0,0:0:0:0: +256,192,8243,128,0,9585:0:0:0:0: +36,192,8243,128,0,8322:0:0:0:0: +109,192,8243,128,0,8874:0:0:0:0: +475,192,8243,128,0,8401:0:0:0:0: +402,192,8322,128,0,8480:0:0:0:0: +182,192,8322,128,0,8401:0:0:0:0: +329,192,8401,128,0,8558:0:0:0:0: +36,192,8401,128,0,8480:0:0:0:0: +475,192,8480,128,0,8874:0:0:0:0: +182,192,8480,128,0,8558:0:0:0:0: +402,192,8558,128,0,8795:0:0:0:0: +36,192,8558,128,0,8874:0:0:0:0: +329,192,8637,128,0,8716:0:0:0:0: +182,192,8716,128,0,8874:0:0:0:0: +329,192,8795,128,0,9111:0:0:0:0: +402,192,8874,128,0,9032:0:0:0:0: +182,192,8953,128,0,9032:0:0:0:0: +36,192,8953,128,0,9190:0:0:0:0: +475,192,9032,128,0,9427:0:0:0:0: +109,192,9032,128,0,9111:0:0:0:0: +402,192,9111,128,0,9348:0:0:0:0: +182,192,9111,128,0,9269:0:0:0:0: +329,192,9190,128,0,9269:0:0:0:0: +109,192,9190,128,0,9427:0:0:0:0: +36,192,9269,128,0,9348:0:0:0:0: +329,192,9348,128,0,9664:0:0:0:0: +182,192,9348,128,0,9506:0:0:0:0: +402,192,9427,128,0,9743:0:0:0:0: +36,192,9427,1,0,0:0:0:0: +109,192,9506,1,0,0:0:0:0: +182,192,9585,1,0,0:0:0:0: +256,192,9664,1,0,0:0:0:0: +36,192,9664,1,0,0:0:0:0: +329,192,9743,1,0,0:0:0:0: +109,192,9743,1,0,0:0:0:0: +36,192,9822,128,0,9980:0:0:0:0: +182,192,9822,128,0,9980:0:0:0:0: +475,192,9822,128,0,10137:0:0:0:0: +402,192,9822,128,0,9901:0:0:0:0: +256,192,9901,128,0,10058:0:0:0:0: +329,192,9980,128,0,10137:0:0:0:0: +109,192,9980,128,0,10058:0:0:0:0: +182,192,10058,128,0,10137:0:0:0:0: +109,192,10137,1,0,0:0:0:0: +36,192,10137,1,0,0:0:0:0: +256,192,10137,128,0,10216:0:0:0:0: +402,192,10216,1,0,0:0:0:0: +182,192,10216,128,0,10295:0:0:0:0: +329,192,10295,128,0,10453:0:0:0:0: +475,192,10295,128,0,10453:0:0:0:0: +36,192,10295,128,0,10611:0:0:0:0: +109,192,10295,128,0,10374:0:0:0:0: +256,192,10374,128,0,10532:0:0:0:0: +182,192,10453,128,0,10611:0:0:0:0: +402,192,10453,128,0,10532:0:0:0:0: +329,192,10532,128,0,10611:0:0:0:0: +109,192,10611,1,0,0:0:0:0: +256,192,10611,128,0,10690:0:0:0:0: +475,192,10611,1,0,0:0:0:0: +182,192,10690,128,0,10769:0:0:0:0: +402,192,10690,1,0,0:0:0:0: +36,192,10769,128,0,11243:0:0:0:0: +475,192,10769,128,0,12190:0:0:0:0: +109,192,10769,128,0,10927:0:0:0:0: +329,192,10769,128,0,10848:0:0:0:0: +402,192,10848,128,0,12111:0:0:0:0: +256,192,10848,128,0,10927:0:0:0:0: +329,192,10927,128,0,12032:0:0:0:0: +182,192,10927,128,0,11006:0:0:0:0: +109,192,11006,128,0,11085:0:0:0:0: +182,192,11085,128,0,11164:0:0:0:0: +109,192,11164,128,0,11322:0:0:0:0: +256,192,11164,128,0,11243:0:0:0:0: +182,192,11243,128,0,11401:0:0:0:0: +36,192,11322,128,0,11401:0:0:0:0: +109,192,11401,128,0,11480:0:0:0:0: +256,192,11401,128,0,11480:0:0:0:0: +182,192,11480,128,0,11637:0:0:0:0: +109,192,11558,128,0,11716:0:0:0:0: +36,192,11637,128,0,11795:0:0:0:0: +256,192,11637,128,0,11716:0:0:0:0: +182,192,11716,128,0,11795:0:0:0:0: +109,192,11795,128,0,11874:0:0:0:0: +256,192,11874,128,0,11953:0:0:0:0: +36,192,11874,128,0,11953:0:0:0:0: +182,192,11953,128,0,12111:0:0:0:0: +109,192,12032,128,0,12190:0:0:0:0: +256,192,12032,1,0,0:0:0:0: +36,192,12111,128,0,12269:0:0:0:0: +329,192,12111,1,0,0:0:0:0: +402,192,12190,1,0,0:0:0:0: +182,192,12190,1,0,0:0:0:0: +475,192,12269,1,0,0:0:0:0: +256,192,12269,1,0,0:0:0:0: +329,192,12348,1,0,0:0:0:0: +36,192,12348,1,0,0:0:0:0: +182,192,12348,1,0,0:0:0:0: +402,192,12348,1,0,0:0:0:0: +475,192,12427,1,0,0:0:0:0: +36,192,12506,1,0,0:0:0:0: +182,192,12506,1,0,0:0:0:0: +329,192,12506,1,0,0:0:0:0: +402,192,12585,1,0,0:0:0:0: +36,192,12664,1,0,0:0:0:0: +109,192,12664,1,0,0:0:0:0: +256,192,12664,1,0,0:0:0:0: +329,192,12743,1,0,0:0:0:0: +182,192,12822,1,0,0:0:0:0: +36,192,12822,1,0,0:0:0:0: +475,192,12822,1,0,0:0:0:0: +402,192,12901,1,0,0:0:0:0: +109,192,12901,1,0,0:0:0:0: +329,192,12980,1,0,0:0:0:0: +36,192,12980,1,0,0:0:0:0: +256,192,13058,1,0,0:0:0:0: +475,192,13058,1,0,0:0:0:0: +182,192,13137,1,0,0:0:0:0: +402,192,13137,1,0,0:0:0:0: +109,192,13216,1,0,0:0:0:0: +329,192,13216,1,0,0:0:0:0: +182,192,13295,1,0,0:0:0:0: +475,192,13295,1,0,0:0:0:0: +36,192,13295,1,0,0:0:0:0: +256,192,13335,1,0,0:0:0:0: +329,192,13374,1,0,0:0:0:0: +402,192,13414,1,0,0:0:0:0: +109,192,13453,1,0,0:0:0:0: +182,192,13493,1,0,0:0:0:0: +256,192,13532,1,0,0:0:0:0: +329,192,13572,1,0,0:0:0:0: +36,192,13611,1,0,0:0:0:0: +182,192,13611,1,0,0:0:0:0: +475,192,13611,128,0,14085:0:0:0:0: +402,192,13611,1,0,0:0:0:0: +329,192,13690,1,0,0:0:0:0: +109,192,13769,1,0,0:0:0:0: +256,192,13769,1,0,0:0:0:0: +36,192,13769,1,0,0:0:0:0: +402,192,13848,1,0,0:0:0:0: +182,192,13927,1,0,0:0:0:0: +36,192,13927,1,0,0:0:0:0: +329,192,13927,1,0,0:0:0:0: +109,192,14006,1,0,0:0:0:0: +36,192,14085,1,0,0:0:0:0: +256,192,14085,1,0,0:0:0:0: +402,192,14085,1,0,0:0:0:0: +182,192,14164,1,0,0:0:0:0: +36,192,14243,128,0,14716:0:0:0:0: +109,192,14243,1,0,0:0:0:0: +329,192,14243,1,0,0:0:0:0: +475,192,14243,1,0,0:0:0:0: +256,192,14322,1,0,0:0:0:0: +109,192,14401,1,0,0:0:0:0: +182,192,14401,1,0,0:0:0:0: +475,192,14401,1,0,0:0:0:0: +329,192,14480,1,0,0:0:0:0: +256,192,14558,1,0,0:0:0:0: +475,192,14558,1,0,0:0:0:0: +109,192,14558,1,0,0:0:0:0: +402,192,14637,1,0,0:0:0:0: +109,192,14716,1,0,0:0:0:0: +256,192,14716,1,0,0:0:0:0: +475,192,14716,1,0,0:0:0:0: +329,192,14795,1,0,0:0:0:0: +475,192,14874,128,0,15348:0:0:0:0: +182,192,14874,1,0,0:0:0:0: +36,192,14874,1,0,0:0:0:0: +402,192,14874,1,0,0:0:0:0: +256,192,14953,1,0,0:0:0:0: +182,192,15032,1,0,0:0:0:0: +36,192,15032,1,0,0:0:0:0: +402,192,15032,1,0,0:0:0:0: +329,192,15111,1,0,0:0:0:0: +36,192,15190,1,0,0:0:0:0: +109,192,15190,1,0,0:0:0:0: +256,192,15190,1,0,0:0:0:0: +329,192,15269,1,0,0:0:0:0: +182,192,15348,1,0,0:0:0:0: +36,192,15348,1,0,0:0:0:0: +402,192,15348,1,0,0:0:0:0: +256,192,15427,1,0,0:0:0:0: +109,192,15506,1,0,0:0:0:0: +475,192,15506,1,0,0:0:0:0: +36,192,15506,128,0,15980:0:0:0:0: +329,192,15506,1,0,0:0:0:0: +402,192,15585,1,0,0:0:0:0: +256,192,15664,1,0,0:0:0:0: +475,192,15664,1,0,0:0:0:0: +109,192,15664,1,0,0:0:0:0: +329,192,15743,1,0,0:0:0:0: +402,192,15822,1,0,0:0:0:0: +109,192,15822,1,0,0:0:0:0: +475,192,15822,1,0,0:0:0:0: +182,192,15901,1,0,0:0:0:0: +475,192,15980,1,0,0:0:0:0: +402,192,15980,1,0,0:0:0:0: +256,192,15980,1,0,0:0:0:0: +182,192,16058,1,0,0:0:0:0: +36,192,16137,1,0,0:0:0:0: +475,192,16137,128,0,16611:0:0:0:0: +256,192,16137,128,0,16216:0:0:0:0: +109,192,16137,1,0,0:0:0:0: +402,192,16216,128,0,16295:0:0:0:0: +182,192,16295,128,0,16374:0:0:0:0: +109,192,16295,1,0,0:0:0:0: +36,192,16295,1,0,0:0:0:0: +329,192,16374,128,0,16453:0:0:0:0: +109,192,16453,128,0,16532:0:0:0:0: +36,192,16453,1,0,0:0:0:0: +402,192,16453,1,0,0:0:0:0: +256,192,16532,128,0,16611:0:0:0:0: +182,192,16611,1,0,0:0:0:0: +36,192,16611,1,0,0:0:0:0: +329,192,16690,1,0,0:0:0:0: +36,192,16769,128,0,17243:0:0:0:0: +256,192,16769,128,0,16848:0:0:0:0: +402,192,16769,1,0,0:0:0:0: +475,192,16769,1,0,0:0:0:0: +109,192,16848,128,0,16927:0:0:0:0: +329,192,16927,128,0,17006:0:0:0:0: +475,192,16927,1,0,0:0:0:0: +402,192,16927,1,0,0:0:0:0: +182,192,17006,128,0,17085:0:0:0:0: +402,192,17085,128,0,17164:0:0:0:0: +475,192,17085,1,0,0:0:0:0: +109,192,17085,1,0,0:0:0:0: +256,192,17164,128,0,17243:0:0:0:0: +475,192,17243,1,0,0:0:0:0: +329,192,17243,1,0,0:0:0:0: +256,192,17322,1,0,0:0:0:0: +475,192,17401,128,0,17874:0:0:0:0: +182,192,17401,128,0,17480:0:0:0:0: +36,192,17401,1,0,0:0:0:0: +402,192,17401,1,0,0:0:0:0: +329,192,17480,128,0,17558:0:0:0:0: +109,192,17558,128,0,17637:0:0:0:0: +402,192,17558,1,0,0:0:0:0: +36,192,17558,1,0,0:0:0:0: +256,192,17637,128,0,17716:0:0:0:0: +36,192,17716,128,0,17795:0:0:0:0: +109,192,17716,1,0,0:0:0:0: +402,192,17716,1,0,0:0:0:0: +182,192,17795,128,0,17874:0:0:0:0: +36,192,17874,1,0,0:0:0:0: +329,192,17874,1,0,0:0:0:0: +256,192,17953,1,0,0:0:0:0: +329,192,18032,128,0,18111:0:0:0:0: +109,192,18032,1,0,0:0:0:0: +475,192,18032,1,0,0:0:0:0: +36,192,18032,128,0,18506:0:0:0:0: +182,192,18111,128,0,18190:0:0:0:0: +402,192,18190,128,0,18269:0:0:0:0: +109,192,18190,1,0,0:0:0:0: +475,192,18190,1,0,0:0:0:0: +256,192,18269,128,0,18348:0:0:0:0: +475,192,18348,128,0,18427:0:0:0:0: +402,192,18348,1,0,0:0:0:0: +109,192,18348,1,0,0:0:0:0: +329,192,18427,128,0,18506:0:0:0:0: +182,192,18427,1,0,0:0:0:0: +109,192,18506,1,0,0:0:0:0: +475,192,18506,1,0,0:0:0:0: +182,192,18585,1,0,0:0:0:0: +256,192,18664,1,0,0:0:0:0: +475,192,18664,1,0,0:0:0:0: +36,192,18664,1,0,0:0:0:0: +402,192,18664,1,0,0:0:0:0: +109,192,18743,1,0,0:0:0:0: +329,192,18743,1,0,0:0:0:0: +182,192,18822,1,0,0:0:0:0: +402,192,18822,1,0,0:0:0:0: +475,192,18822,1,0,0:0:0:0: +36,192,18901,1,0,0:0:0:0: +256,192,18901,1,0,0:0:0:0: +329,192,18980,1,0,0:0:0:0: +109,192,18980,1,0,0:0:0:0: +475,192,18980,1,0,0:0:0:0: +182,192,19058,1,0,0:0:0:0: +402,192,19058,1,0,0:0:0:0: +36,192,19137,1,0,0:0:0:0: +329,192,19137,1,0,0:0:0:0: +475,192,19137,1,0,0:0:0:0: +109,192,19216,1,0,0:0:0:0: +256,192,19216,1,0,0:0:0:0: +182,192,19295,1,0,0:0:0:0: +36,192,19295,1,0,0:0:0:0: +475,192,19295,1,0,0:0:0:0: +402,192,19295,1,0,0:0:0:0: +329,192,19374,1,0,0:0:0:0: +256,192,19374,1,0,0:0:0:0: +109,192,19453,1,0,0:0:0:0: +36,192,19453,1,0,0:0:0:0: +475,192,19453,1,0,0:0:0:0: +182,192,19532,1,0,0:0:0:0: +256,192,19532,1,0,0:0:0:0: +109,192,19611,1,0,0:0:0:0: +475,192,19611,1,0,0:0:0:0: +36,192,19611,1,0,0:0:0:0: +402,192,19611,1,0,0:0:0:0: +329,192,19690,1,0,0:0:0:0: +182,192,19690,1,0,0:0:0:0: +402,192,19769,1,0,0:0:0:0: +475,192,19769,1,0,0:0:0:0: +36,192,19769,1,0,0:0:0:0: +182,192,19848,1,0,0:0:0:0: +109,192,19848,1,0,0:0:0:0: +475,192,19927,1,0,0:0:0:0: +329,192,19927,1,0,0:0:0:0: +402,192,19927,1,0,0:0:0:0: +256,192,19927,1,0,0:0:0:0: +109,192,20006,1,0,0:0:0:0: +182,192,20006,1,0,0:0:0:0: +36,192,20006,1,0,0:0:0:0: +402,192,20085,1,0,0:0:0:0: +475,192,20085,1,0,0:0:0:0: +329,192,20085,1,0,0:0:0:0: +182,192,20164,1,0,0:0:0:0: +109,192,20164,1,0,0:0:0:0: +36,192,20164,1,0,0:0:0:0: +475,192,20243,1,0,0:0:0:0: +402,192,20243,1,0,0:0:0:0: +329,192,20243,1,0,0:0:0:0: +109,192,20322,1,0,0:0:0:0: +256,192,20322,1,0,0:0:0:0: +36,192,20322,1,0,0:0:0:0: +402,192,20401,1,0,0:0:0:0: +182,192,20401,1,0,0:0:0:0: +475,192,20401,1,0,0:0:0:0: +36,192,20480,1,0,0:0:0:0: +256,192,20480,1,0,0:0:0:0: +109,192,20480,1,0,0:0:0:0: +182,192,20558,1,0,0:0:0:0: +475,192,20558,1,0,0:0:0:0: +329,192,20558,1,0,0:0:0:0: +402,192,20558,1,0,0:0:0:0: +256,192,20637,1,0,0:0:0:0: +36,192,20637,1,0,0:0:0:0: +109,192,20637,1,0,0:0:0:0: +475,192,20716,1,0,0:0:0:0: +402,192,20716,1,0,0:0:0:0: +182,192,20716,1,0,0:0:0:0: +329,192,20795,1,0,0:0:0:0: +109,192,20795,1,0,0:0:0:0: +256,192,20795,1,0,0:0:0:0: +36,192,20874,1,0,0:0:0:0: +402,192,20874,1,0,0:0:0:0: +475,192,20874,1,0,0:0:0:0: +182,192,20874,1,0,0:0:0:0: +109,192,20953,1,0,0:0:0:0: +329,192,20953,1,0,0:0:0:0: +475,192,21032,1,0,0:0:0:0: +256,192,21032,1,0,0:0:0:0: +36,192,21032,1,0,0:0:0:0: +329,192,21111,1,0,0:0:0:0: +109,192,21111,1,0,0:0:0:0: +475,192,21190,1,0,0:0:0:0: +182,192,21190,1,0,0:0:0:0: +36,192,21190,1,0,0:0:0:0: +256,192,21230,1,0,0:0:0:0: +329,192,21269,1,0,0:0:0:0: +402,192,21308,1,0,0:0:0:0: +475,192,21348,1,0,0:0:0:0: +109,192,21348,1,0,0:0:0:0: +182,192,21387,1,0,0:0:0:0: +256,192,21427,1,0,0:0:0:0: +329,192,21466,1,0,0:0:0:0: +36,192,21506,1,0,0:0:0:0: +475,192,21506,1,0,0:0:0:0: +402,192,21545,1,0,0:0:0:0: +329,192,21585,1,0,0:0:0:0: +256,192,21624,1,0,0:0:0:0: +109,192,21664,1,0,0:0:0:0: +475,192,21664,1,0,0:0:0:0: +182,192,21703,1,0,0:0:0:0: +256,192,21743,1,0,0:0:0:0: +329,192,21782,1,0,0:0:0:0: +36,192,21822,1,0,0:0:0:0: +109,192,21822,128,0,21980:0:0:0:0: +402,192,21822,1,0,0:0:0:0: +182,192,21861,128,0,22019:0:0:0:0: +256,192,21901,128,0,22058:0:0:0:0: +329,192,21940,128,0,22098:0:0:0:0: +402,192,21980,128,0,22137:0:0:0:0: +475,192,22019,128,0,22177:0:0:0:0: +36,192,22058,128,0,22177:0:0:0:0: +109,192,22098,128,0,22216:0:0:0:0: +182,192,22137,128,0,22256:0:0:0:0: +256,192,22177,128,0,22295:0:0:0:0: +329,192,22216,128,0,22335:0:0:0:0: +402,192,22256,128,0,22374:0:0:0:0: +36,192,22295,128,0,22394:0:0:0:0: +109,192,22335,128,0,22414:0:0:0:0: +182,192,22374,128,0,22433:0:0:0:0: +256,192,22414,128,0,22453:0:0:0:0: +329,192,22453,1,0,0:0:0:0: +475,192,22453,1,0,0:0:0:0: +256,192,22532,1,0,0:0:0:0: +402,192,22532,1,0,0:0:0:0: +182,192,22611,1,0,0:0:0:0: +329,192,22611,1,0,0:0:0:0: +182,192,22769,1,0,0:0:0:0: +36,192,22769,1,0,0:0:0:0: +256,192,22848,1,0,0:0:0:0: +109,192,22848,1,0,0:0:0:0: +329,192,22927,1,0,0:0:0:0: +182,192,22927,1,0,0:0:0:0: +256,192,23006,1,0,0:0:0:0: +182,192,23085,128,0,23243:0:0:0:0: +402,192,23085,128,0,23164:0:0:0:0: +36,192,23085,1,0,0:0:0:0: +475,192,23085,1,0,0:0:0:0: +329,192,23164,128,0,23243:0:0:0:0: +256,192,23164,1,0,0:0:0:0: +402,192,23243,128,0,23401:0:0:0:0: +109,192,23243,128,0,23322:0:0:0:0: +36,192,23243,1,0,0:0:0:0: +475,192,23243,1,0,0:0:0:0: +182,192,23322,128,0,23401:0:0:0:0: +256,192,23322,1,0,0:0:0:0: +329,192,23401,128,0,23558:0:0:0:0: +109,192,23401,128,0,23480:0:0:0:0: +475,192,23401,1,0,0:0:0:0: +256,192,23480,128,0,23637:0:0:0:0: +36,192,23480,128,0,23558:0:0:0:0: +402,192,23480,1,0,0:0:0:0: +182,192,23558,128,0,23716:0:0:0:0: +475,192,23558,1,0,0:0:0:0: +109,192,23637,1,0,0:0:0:0: +402,192,23637,1,0,0:0:0:0: +475,192,23716,128,0,23953:0:0:0:0: +329,192,23716,128,0,23795:0:0:0:0: +36,192,23716,1,0,0:0:0:0: +182,192,23795,128,0,23874:0:0:0:0: +402,192,23795,128,0,23874:0:0:0:0: +329,192,23874,128,0,24032:0:0:0:0: +36,192,23874,128,0,23953:0:0:0:0: +256,192,23874,1,0,0:0:0:0: +402,192,23953,128,0,24111:0:0:0:0: +109,192,23953,128,0,24032:0:0:0:0: +475,192,24032,128,0,24348:0:0:0:0: +36,192,24032,1,0,0:0:0:0: +182,192,24032,128,0,24111:0:0:0:0: +256,192,24111,128,0,24190:0:0:0:0: +329,192,24190,128,0,24269:0:0:0:0: +109,192,24190,1,0,0:0:0:0: +182,192,24269,128,0,24348:0:0:0:0: +36,192,24348,128,0,24585:0:0:0:0: +402,192,24348,1,0,0:0:0:0: +256,192,24348,128,0,24427:0:0:0:0: +109,192,24427,128,0,24506:0:0:0:0: +329,192,24427,128,0,24506:0:0:0:0: +182,192,24506,128,0,24664:0:0:0:0: +256,192,24506,1,0,0:0:0:0: +475,192,24506,128,0,24585:0:0:0:0: +109,192,24585,128,0,24743:0:0:0:0: +402,192,24585,128,0,24664:0:0:0:0: +36,192,24664,128,0,24980:0:0:0:0: +475,192,24664,1,0,0:0:0:0: +329,192,24664,128,0,24743:0:0:0:0: +256,192,24743,128,0,24822:0:0:0:0: +402,192,24822,1,0,0:0:0:0: +182,192,24822,128,0,24901:0:0:0:0: +329,192,24901,128,0,24980:0:0:0:0: +475,192,24980,128,0,25216:0:0:0:0: +256,192,24980,1,0,0:0:0:0: +109,192,24980,128,0,25058:0:0:0:0: +402,192,25058,128,0,25137:0:0:0:0: +182,192,25058,128,0,25137:0:0:0:0: +329,192,25137,128,0,25295:0:0:0:0: +36,192,25137,1,0,0:0:0:0: +256,192,25137,128,0,25216:0:0:0:0: +402,192,25216,128,0,25374:0:0:0:0: +109,192,25216,128,0,25295:0:0:0:0: +475,192,25295,128,0,25611:0:0:0:0: +36,192,25295,1,0,0:0:0:0: +182,192,25295,128,0,25374:0:0:0:0: +256,192,25374,128,0,25453:0:0:0:0: +109,192,25453,1,0,0:0:0:0: +329,192,25453,128,0,25532:0:0:0:0: +182,192,25532,128,0,25611:0:0:0:0: +36,192,25611,128,0,25848:0:0:0:0: +402,192,25611,1,0,0:0:0:0: +256,192,25611,128,0,25690:0:0:0:0: +109,192,25690,128,0,25769:0:0:0:0: +329,192,25690,128,0,25769:0:0:0:0: +182,192,25769,128,0,25927:0:0:0:0: +256,192,25769,1,0,0:0:0:0: +475,192,25769,128,0,25848:0:0:0:0: +109,192,25848,128,0,26006:0:0:0:0: +402,192,25848,128,0,25927:0:0:0:0: +36,192,25927,128,0,26243:0:0:0:0: +475,192,25927,1,0,0:0:0:0: +329,192,25927,128,0,26006:0:0:0:0: +256,192,26006,128,0,26085:0:0:0:0: +475,192,26085,1,0,0:0:0:0: +182,192,26085,128,0,26164:0:0:0:0: +402,192,26164,128,0,26243:0:0:0:0: +256,192,26243,1,0,0:0:0:0: +475,192,26243,128,0,26322:0:0:0:0: +109,192,26243,128,0,26322:0:0:0:0: +329,192,26322,128,0,26401:0:0:0:0: +182,192,26322,128,0,26401:0:0:0:0: +475,192,26401,128,0,26480:0:0:0:0: +36,192,26401,128,0,26480:0:0:0:0: +402,192,26401,1,0,0:0:0:0: +329,192,26480,128,0,26558:0:0:0:0: +182,192,26480,128,0,26558:0:0:0:0: +402,192,26558,128,0,26874:0:0:0:0: +475,192,26558,128,0,26874:0:0:0:0: +256,192,26558,1,0,0:0:0:0: +36,192,26558,128,0,26637:0:0:0:0: +109,192,26637,128,0,26716:0:0:0:0: +329,192,26716,1,0,0:0:0:0: +182,192,26716,128,0,26795:0:0:0:0: +256,192,26795,128,0,26874:0:0:0:0: +36,192,26874,128,0,26953:0:0:0:0: +109,192,26874,1,0,0:0:0:0: +329,192,26874,128,0,26953:0:0:0:0: +182,192,26953,128,0,27032:0:0:0:0: +402,192,26953,128,0,27032:0:0:0:0: +36,192,27032,128,0,27111:0:0:0:0: +256,192,27032,1,0,0:0:0:0: +475,192,27032,128,0,27111:0:0:0:0: +182,192,27111,128,0,27190:0:0:0:0: +329,192,27111,128,0,27190:0:0:0:0: +109,192,27190,128,0,27506:0:0:0:0: +36,192,27190,128,0,27506:0:0:0:0: +256,192,27190,1,0,0:0:0:0: +475,192,27190,128,0,27269:0:0:0:0: +402,192,27269,128,0,27348:0:0:0:0: +182,192,27348,1,0,0:0:0:0: +329,192,27348,128,0,27427:0:0:0:0: +256,192,27427,128,0,27506:0:0:0:0: +475,192,27506,128,0,27822:0:0:0:0: +329,192,27506,128,0,27822:0:0:0:0: +402,192,27506,1,0,0:0:0:0: +182,192,27506,128,0,27585:0:0:0:0: +256,192,27585,128,0,27664:0:0:0:0: +109,192,27664,128,0,27980:0:0:0:0: +402,192,27664,1,0,0:0:0:0: +36,192,27664,128,0,27743:0:0:0:0: +182,192,27743,128,0,27822:0:0:0:0: +402,192,27822,128,0,28137:0:0:0:0: +36,192,27822,1,0,0:0:0:0: +256,192,27822,128,0,27901:0:0:0:0: +329,192,27901,128,0,27980:0:0:0:0: +182,192,27980,128,0,28137:0:0:0:0: +36,192,27980,1,0,0:0:0:0: +475,192,27980,1,0,0:0:0:0: +256,192,28058,128,0,28137:0:0:0:0: +36,192,28137,128,0,28374:0:0:0:0: +475,192,28137,128,0,28374:0:0:0:0: +109,192,28137,1,0,0:0:0:0: +329,192,28137,1,0,0:0:0:0: +256,192,28216,1,0,0:0:0:0: +329,192,28295,128,0,28374:0:0:0:0: +182,192,28295,128,0,28374:0:0:0:0: +402,192,28295,1,0,0:0:0:0: +109,192,28295,1,0,0:0:0:0: +256,192,28374,1,0,0:0:0:0: +329,192,28453,128,0,28690:0:0:0:0: +182,192,28453,128,0,28690:0:0:0:0: +475,192,28453,1,0,0:0:0:0: +36,192,28453,1,0,0:0:0:0: +109,192,28532,1,0,0:0:0:0: +36,192,28611,128,0,28690:0:0:0:0: +475,192,28611,128,0,28690:0:0:0:0: +256,192,28611,1,0,0:0:0:0: +109,192,28690,1,0,0:0:0:0: +402,192,28690,1,0,0:0:0:0: +36,192,28769,128,0,29006:0:0:0:0: +475,192,28769,1,0,0:0:0:0: +182,192,28769,128,0,28848:0:0:0:0: +329,192,28769,1,0,0:0:0:0: +109,192,28848,128,0,28927:0:0:0:0: +256,192,28848,128,0,28927:0:0:0:0: +182,192,28927,128,0,29085:0:0:0:0: +329,192,28927,1,0,0:0:0:0: +475,192,28927,128,0,29006:0:0:0:0: +109,192,29006,128,0,29164:0:0:0:0: +402,192,29006,128,0,29085:0:0:0:0: +36,192,29085,128,0,29401:0:0:0:0: +475,192,29085,1,0,0:0:0:0: +329,192,29085,128,0,29164:0:0:0:0: +256,192,29164,128,0,29243:0:0:0:0: +182,192,29243,1,0,0:0:0:0: +402,192,29243,128,0,29322:0:0:0:0: +329,192,29322,128,0,29401:0:0:0:0: +256,192,29401,1,0,0:0:0:0: +475,192,29401,128,0,29637:0:0:0:0: +109,192,29401,128,0,29480:0:0:0:0: +402,192,29480,128,0,29558:0:0:0:0: +182,192,29480,128,0,29558:0:0:0:0: +329,192,29558,128,0,29716:0:0:0:0: +36,192,29558,1,0,0:0:0:0: +256,192,29558,128,0,29637:0:0:0:0: +402,192,29637,128,0,29795:0:0:0:0: +109,192,29637,128,0,29716:0:0:0:0: +36,192,29716,1,0,0:0:0:0: +475,192,29716,128,0,30032:0:0:0:0: +182,192,29716,128,0,29795:0:0:0:0: +256,192,29795,128,0,29874:0:0:0:0: +109,192,29874,1,0,0:0:0:0: +329,192,29874,128,0,29953:0:0:0:0: +182,192,29953,128,0,30032:0:0:0:0: +402,192,30032,1,0,0:0:0:0: +36,192,30032,128,0,30269:0:0:0:0: +256,192,30032,128,0,30111:0:0:0:0: +109,192,30111,128,0,30190:0:0:0:0: +329,192,30111,128,0,30190:0:0:0:0: +182,192,30190,128,0,30348:0:0:0:0: +256,192,30190,1,0,0:0:0:0: +475,192,30190,128,0,30269:0:0:0:0: +109,192,30269,128,0,30427:0:0:0:0: +402,192,30269,128,0,30348:0:0:0:0: +36,192,30348,128,0,30664:0:0:0:0: +475,192,30348,1,0,0:0:0:0: +329,192,30348,128,0,30427:0:0:0:0: +256,192,30427,128,0,30506:0:0:0:0: +402,192,30506,1,0,0:0:0:0: +182,192,30506,128,0,30585:0:0:0:0: +329,192,30585,128,0,30664:0:0:0:0: +256,192,30664,1,0,0:0:0:0: +475,192,30664,128,0,30901:0:0:0:0: +109,192,30664,128,0,30743:0:0:0:0: +402,192,30743,128,0,30822:0:0:0:0: +182,192,30743,128,0,30822:0:0:0:0: +329,192,30822,128,0,30980:0:0:0:0: +36,192,30822,1,0,0:0:0:0: +256,192,30822,128,0,30901:0:0:0:0: +402,192,30901,128,0,31058:0:0:0:0: +109,192,30901,128,0,30980:0:0:0:0: +36,192,30980,1,0,0:0:0:0: +475,192,30980,128,0,31295:0:0:0:0: +182,192,30980,128,0,31058:0:0:0:0: +256,192,31058,128,0,31137:0:0:0:0: +109,192,31137,1,0,0:0:0:0: +329,192,31137,128,0,31216:0:0:0:0: +182,192,31216,128,0,31295:0:0:0:0: +402,192,31295,1,0,0:0:0:0: +36,192,31295,128,0,31374:0:0:0:0: +256,192,31295,128,0,31374:0:0:0:0: +182,192,31374,128,0,31453:0:0:0:0: +329,192,31374,128,0,31453:0:0:0:0: +475,192,31453,1,0,0:0:0:0: +36,192,31453,128,0,31532:0:0:0:0: +402,192,31453,128,0,31532:0:0:0:0: +182,192,31532,128,0,31611:0:0:0:0: +329,192,31532,128,0,31611:0:0:0:0: +109,192,31611,128,0,31848:0:0:0:0: +36,192,31611,128,0,31848:0:0:0:0: +256,192,31611,1,0,0:0:0:0: +475,192,31611,128,0,31690:0:0:0:0: +402,192,31690,128,0,31769:0:0:0:0: +182,192,31769,1,0,0:0:0:0: +329,192,31769,128,0,31848:0:0:0:0: +256,192,31848,128,0,31927:0:0:0:0: +36,192,31927,128,0,32164:0:0:0:0: +475,192,31927,128,0,32164:0:0:0:0: +329,192,31927,128,0,32164:0:0:0:0: +182,192,31927,1,0,0:0:0:0: +109,192,32006,128,0,32164:0:0:0:0: +182,192,32085,128,0,32164:0:0:0:0: +402,192,32085,1,0,0:0:0:0: +256,192,32164,128,0,32243:0:0:0:0: +36,192,32243,128,0,32558:0:0:0:0: +475,192,32243,128,0,32480:0:0:0:0: +182,192,32243,128,0,32558:0:0:0:0: +329,192,32243,1,0,0:0:0:0: +402,192,32322,128,0,32480:0:0:0:0: +109,192,32401,1,0,0:0:0:0: +329,192,32401,128,0,32480:0:0:0:0: +256,192,32480,128,0,32558:0:0:0:0: +402,192,32558,1,0,0:0:0:0: +109,192,32558,128,0,32795:0:0:0:0: +475,192,32558,1,0,0:0:0:0: +182,192,32637,128,0,32874:0:0:0:0: +256,192,32716,128,0,32953:0:0:0:0: +329,192,32795,128,0,33032:0:0:0:0: +36,192,32874,128,0,33032:0:0:0:0: +475,192,32874,1,0,0:0:0:0: +402,192,32874,1,0,0:0:0:0: +109,192,32953,128,0,33111:0:0:0:0: +182,192,33032,128,0,33190:0:0:0:0: +256,192,33111,128,0,33269:0:0:0:0: +329,192,33190,128,0,33348:0:0:0:0: +36,192,33190,128,0,33506:0:0:0:0: +475,192,33190,128,0,33506:0:0:0:0: +109,192,33190,128,0,33269:0:0:0:0: +402,192,33190,1,0,0:0:0:0: +182,192,33269,128,0,33348:0:0:0:0: +256,192,33348,128,0,33427:0:0:0:0: +329,192,33427,128,0,33506:0:0:0:0: +109,192,33506,128,0,33743:0:0:0:0: +402,192,33506,128,0,33743:0:0:0:0: +256,192,33664,128,0,33743:0:0:0:0: +182,192,33664,1,0,0:0:0:0: +329,192,33743,1,0,0:0:0:0: +402,192,33822,1,0,0:0:0:0: +475,192,33822,128,0,34058:0:0:0:0: +256,192,33822,1,0,0:0:0:0: +109,192,33822,1,0,0:0:0:0: +36,192,33822,128,0,34058:0:0:0:0: +182,192,33822,1,0,0:0:0:0: +329,192,33980,128,0,34058:0:0:0:0: +402,192,33980,1,0,0:0:0:0: +256,192,33980,1,0,0:0:0:0: +109,192,33980,1,0,0:0:0:0: +475,192,34137,128,0,34216:0:0:0:0: +182,192,34137,128,0,34216:0:0:0:0: +36,192,34137,1,0,0:0:0:0: +256,192,34137,1,0,0:0:0:0: +402,192,34137,1,0,0:0:0:0: +329,192,34216,128,0,34295:0:0:0:0: +109,192,34216,128,0,34295:0:0:0:0: +402,192,34295,128,0,34374:0:0:0:0: +475,192,34295,1,0,0:0:0:0: +36,192,34295,128,0,34374:0:0:0:0: +256,192,34374,128,0,34453:0:0:0:0: +182,192,34374,1,0,0:0:0:0: +36,192,34453,128,0,34769:0:0:0:0: +475,192,34453,128,0,34532:0:0:0:0: +109,192,34453,1,0,0:0:0:0: +329,192,34532,128,0,34611:0:0:0:0: +182,192,34611,128,0,34769:0:0:0:0: +475,192,34611,1,0,0:0:0:0: +402,192,34611,128,0,34690:0:0:0:0: +256,192,34690,128,0,34769:0:0:0:0: +109,192,34769,128,0,34927:0:0:0:0: +475,192,34769,1,0,0:0:0:0: +329,192,34769,128,0,34848:0:0:0:0: +182,192,34848,128,0,35006:0:0:0:0: +402,192,34848,128,0,34927:0:0:0:0: +256,192,34927,128,0,35085:0:0:0:0: +36,192,34927,1,0,0:0:0:0: +475,192,34927,128,0,35006:0:0:0:0: +329,192,35006,128,0,35164:0:0:0:0: +109,192,35006,1,0,0:0:0:0: +475,192,35085,128,0,35401:0:0:0:0: +402,192,35085,1,0,0:0:0:0: +36,192,35085,128,0,35164:0:0:0:0: +182,192,35164,128,0,35243:0:0:0:0: +329,192,35243,128,0,35401:0:0:0:0: +256,192,35243,1,0,0:0:0:0: +36,192,35243,128,0,35322:0:0:0:0: +109,192,35322,128,0,35401:0:0:0:0: +402,192,35401,128,0,35558:0:0:0:0: +36,192,35401,1,0,0:0:0:0: +182,192,35401,128,0,35480:0:0:0:0: +329,192,35480,128,0,35637:0:0:0:0: +109,192,35480,128,0,35558:0:0:0:0: +256,192,35558,128,0,35716:0:0:0:0: +475,192,35558,1,0,0:0:0:0: +36,192,35558,128,0,35637:0:0:0:0: +182,192,35637,128,0,35795:0:0:0:0: +402,192,35637,1,0,0:0:0:0: +36,192,35716,128,0,36032:0:0:0:0: +109,192,35716,1,0,0:0:0:0: +475,192,35716,128,0,35795:0:0:0:0: +402,192,35795,128,0,35874:0:0:0:0: +182,192,35874,128,0,36032:0:0:0:0: +329,192,35874,1,0,0:0:0:0: +475,192,35874,128,0,35953:0:0:0:0: +256,192,35953,128,0,36032:0:0:0:0: +109,192,36032,128,0,36190:0:0:0:0: +475,192,36032,1,0,0:0:0:0: +329,192,36032,128,0,36111:0:0:0:0: +182,192,36111,128,0,36269:0:0:0:0: +402,192,36111,128,0,36190:0:0:0:0: +256,192,36190,128,0,36348:0:0:0:0: +36,192,36190,1,0,0:0:0:0: +475,192,36190,128,0,36269:0:0:0:0: +329,192,36269,128,0,36427:0:0:0:0: +109,192,36269,1,0,0:0:0:0: +475,192,36348,128,0,36664:0:0:0:0: +402,192,36348,1,0,0:0:0:0: +36,192,36348,128,0,36427:0:0:0:0: +182,192,36427,128,0,36506:0:0:0:0: +329,192,36506,128,0,36664:0:0:0:0: +256,192,36506,1,0,0:0:0:0: +109,192,36506,128,0,36585:0:0:0:0: +36,192,36585,128,0,36664:0:0:0:0: +402,192,36664,128,0,36822:0:0:0:0: +256,192,36664,1,0,0:0:0:0: +182,192,36664,128,0,36743:0:0:0:0: +329,192,36743,128,0,36901:0:0:0:0: +109,192,36743,128,0,36822:0:0:0:0: +256,192,36822,128,0,36980:0:0:0:0: +475,192,36822,1,0,0:0:0:0: +36,192,36822,128,0,36901:0:0:0:0: +182,192,36901,128,0,37058:0:0:0:0: +402,192,36901,1,0,0:0:0:0: +36,192,36980,128,0,37295:0:0:0:0: +109,192,36980,1,0,0:0:0:0: +329,192,36980,128,0,37058:0:0:0:0: +475,192,37058,128,0,37137:0:0:0:0: +182,192,37137,128,0,37295:0:0:0:0: +256,192,37137,128,0,37216:0:0:0:0: +402,192,37137,1,0,0:0:0:0: +475,192,37216,128,0,37295:0:0:0:0: +109,192,37295,128,0,37453:0:0:0:0: +329,192,37295,128,0,37374:0:0:0:0: +256,192,37295,1,0,0:0:0:0: +182,192,37374,128,0,37532:0:0:0:0: +402,192,37374,128,0,37453:0:0:0:0: +256,192,37453,128,0,37611:0:0:0:0: +36,192,37453,1,0,0:0:0:0: +475,192,37453,128,0,37532:0:0:0:0: +329,192,37532,128,0,37690:0:0:0:0: +109,192,37532,1,0,0:0:0:0: +475,192,37611,128,0,38243:0:0:0:0: +36,192,37611,128,0,37690:0:0:0:0: +182,192,37611,128,0,37690:0:0:0:0: +402,192,37611,128,0,37690:0:0:0:0: +109,192,37769,128,0,38164:0:0:0:0: +36,192,37769,128,0,37848:0:0:0:0: +256,192,37769,128,0,37848:0:0:0:0: +182,192,37769,128,0,37848:0:0:0:0: +402,192,37769,128,0,37848:0:0:0:0: +329,192,37927,128,0,38243:0:0:0:0: +256,192,37927,128,0,38006:0:0:0:0: +402,192,37927,128,0,38006:0:0:0:0: +36,192,38006,128,0,38164:0:0:0:0: +182,192,38006,128,0,38164:0:0:0:0: +402,192,38243,128,0,38558:0:0:0:0: +256,192,38243,128,0,38558:0:0:0:0: +36,192,38243,128,0,38322:0:0:0:0: +109,192,38243,128,0,38322:0:0:0:0: +182,192,38243,128,0,38322:0:0:0:0: +182,192,38401,128,0,38480:0:0:0:0: +36,192,38401,128,0,38480:0:0:0:0: +329,192,38401,128,0,38480:0:0:0:0: +475,192,38401,128,0,38480:0:0:0:0: +36,192,38558,128,0,38795:0:0:0:0: +109,192,38558,128,0,38716:0:0:0:0: +329,192,38558,128,0,38637:0:0:0:0: +475,192,38558,128,0,38795:0:0:0:0: +402,192,38637,128,0,38795:0:0:0:0: +256,192,38637,128,0,38716:0:0:0:0: +329,192,38716,128,0,38795:0:0:0:0: +182,192,38716,128,0,38795:0:0:0:0: +109,192,38795,128,0,38874:0:0:0:0: +256,192,38874,128,0,39032:0:0:0:0: +475,192,38874,128,0,39190:0:0:0:0: +329,192,38874,128,0,38953:0:0:0:0: +36,192,38874,128,0,39032:0:0:0:0: +182,192,38953,128,0,39190:0:0:0:0: +109,192,39032,128,0,39111:0:0:0:0: +402,192,39032,128,0,39190:0:0:0:0: +256,192,39111,128,0,39269:0:0:0:0: +329,192,39190,128,0,39427:0:0:0:0: +36,192,39190,128,0,39506:0:0:0:0: +109,192,39190,128,0,39348:0:0:0:0: +402,192,39269,128,0,39348:0:0:0:0: +256,192,39348,128,0,39506:0:0:0:0: +475,192,39348,128,0,39506:0:0:0:0: +182,192,39427,128,0,39585:0:0:0:0: +329,192,39506,128,0,39743:0:0:0:0: +109,192,39506,128,0,39664:0:0:0:0: +402,192,39585,128,0,39664:0:0:0:0: +256,192,39664,128,0,39822:0:0:0:0: +36,192,39664,128,0,39822:0:0:0:0: +475,192,39664,128,0,39980:0:0:0:0: +182,192,39743,128,0,39901:0:0:0:0: +109,192,39822,128,0,40137:0:0:0:0: +402,192,39822,128,0,40058:0:0:0:0: +329,192,39901,128,0,40137:0:0:0:0: +256,192,39980,128,0,40058:0:0:0:0: +36,192,39980,128,0,40058:0:0:0:0: +182,192,40058,128,0,40216:0:0:0:0: +256,192,40137,128,0,40295:0:0:0:0: +36,192,40137,128,0,40453:0:0:0:0: +475,192,40137,128,0,40295:0:0:0:0: +329,192,40216,128,0,40453:0:0:0:0: +402,192,40295,128,0,40374:0:0:0:0: +109,192,40295,128,0,40453:0:0:0:0: +256,192,40374,128,0,40532:0:0:0:0: +182,192,40453,128,0,40690:0:0:0:0: +475,192,40453,128,0,40769:0:0:0:0: +402,192,40453,128,0,40611:0:0:0:0: +109,192,40532,128,0,40611:0:0:0:0: +256,192,40611,128,0,40769:0:0:0:0: +36,192,40611,128,0,40769:0:0:0:0: +329,192,40690,128,0,40848:0:0:0:0: +182,192,40769,128,0,41006:0:0:0:0: +402,192,40769,128,0,40927:0:0:0:0: +109,192,40848,128,0,40927:0:0:0:0: +256,192,40927,128,0,41085:0:0:0:0: +36,192,40927,128,0,41164:0:0:0:0: +475,192,40927,128,0,41085:0:0:0:0: +329,192,41006,128,0,41164:0:0:0:0: +402,192,41085,128,0,41243:0:0:0:0: +109,192,41085,128,0,41243:0:0:0:0: +182,192,41164,128,0,41322:0:0:0:0: +256,192,41243,128,0,41401:0:0:0:0: +475,192,41243,128,0,41322:0:0:0:0: +329,192,41322,128,0,41401:0:0:0:0: +36,192,41401,128,0,41716:0:0:0:0: +109,192,41401,128,0,41716:0:0:0:0: +402,192,41401,1,0,0:0:0:0: +475,192,41401,1,0,0:0:0:0: +182,192,41401,1,0,0:0:0:0: +402,192,41558,1,0,0:0:0:0: +475,192,41558,1,0,0:0:0:0: +329,192,41716,128,0,41795:0:0:0:0: +256,192,41795,128,0,41874:0:0:0:0: +182,192,41874,128,0,41953:0:0:0:0: +329,192,41953,1,0,0:0:0:0: +109,192,42032,128,0,42111:0:0:0:0: +36,192,42032,1,0,0:0:0:0: +402,192,42032,1,0,0:0:0:0: +475,192,42032,1,0,0:0:0:0: +256,192,42032,1,0,0:0:0:0: +182,192,42111,128,0,42190:0:0:0:0: +256,192,42190,128,0,42269:0:0:0:0: +329,192,42269,128,0,42348:0:0:0:0: +36,192,42348,1,0,0:0:0:0: +109,192,42427,1,0,0:0:0:0: +182,192,42506,128,0,42585:0:0:0:0: +109,192,42585,128,0,42664:0:0:0:0: +36,192,42664,128,0,42822:0:0:0:0: +256,192,42664,128,0,42822:0:0:0:0: +475,192,42664,128,0,42822:0:0:0:0: +329,192,42664,128,0,42822:0:0:0:0: +402,192,42664,128,0,42822:0:0:0:0: +36,192,42980,128,0,43137:0:0:0:0: +109,192,42980,128,0,43137:0:0:0:0: +329,192,42980,128,0,43137:0:0:0:0: +475,192,42980,128,0,43137:0:0:0:0: +182,192,42980,128,0,43137:0:0:0:0: +182,192,43295,128,0,43453:0:0:0:0: +36,192,43295,128,0,43453:0:0:0:0: +329,192,43295,128,0,43453:0:0:0:0: +256,192,43295,128,0,43453:0:0:0:0: +475,192,43295,128,0,43453:0:0:0:0: +36,192,43611,128,0,43848:0:0:0:0: +182,192,43611,128,0,43848:0:0:0:0: +329,192,43611,128,0,43848:0:0:0:0: +475,192,43611,128,0,43848:0:0:0:0: +402,192,43611,128,0,43848:0:0:0:0: +109,192,43611,128,0,43848:0:0:0:0: +475,192,43927,128,0,44164:0:0:0:0: +36,192,43927,1,0,0:0:0:0: +256,192,43927,1,0,0:0:0:0: +402,192,43927,1,0,0:0:0:0: +109,192,44006,1,0,0:0:0:0: +182,192,44085,1,0,0:0:0:0: +329,192,44085,1,0,0:0:0:0: +109,192,44164,1,0,0:0:0:0: +475,192,44243,128,0,44558:0:0:0:0: +36,192,44243,1,0,0:0:0:0: +256,192,44243,1,0,0:0:0:0: +109,192,44322,1,0,0:0:0:0: +182,192,44401,1,0,0:0:0:0: +329,192,44401,1,0,0:0:0:0: +109,192,44480,1,0,0:0:0:0: +329,192,44558,128,0,44716:0:0:0:0: +36,192,44558,1,0,0:0:0:0: +256,192,44558,1,0,0:0:0:0: +109,192,44637,1,0,0:0:0:0: +475,192,44716,128,0,45032:0:0:0:0: +182,192,44716,1,0,0:0:0:0: +402,192,44716,1,0,0:0:0:0: +256,192,44795,1,0,0:0:0:0: +182,192,44874,1,0,0:0:0:0: +36,192,44874,1,0,0:0:0:0: +109,192,44953,1,0,0:0:0:0: +329,192,45032,128,0,45190:0:0:0:0: +36,192,45032,1,0,0:0:0:0: +256,192,45032,1,0,0:0:0:0: +109,192,45111,1,0,0:0:0:0: +475,192,45190,128,0,45506:0:0:0:0: +182,192,45190,1,0,0:0:0:0: +36,192,45190,1,0,0:0:0:0: +256,192,45269,1,0,0:0:0:0: +329,192,45348,1,0,0:0:0:0: +109,192,45348,1,0,0:0:0:0: +182,192,45427,1,0,0:0:0:0: +402,192,45506,128,0,45664:0:0:0:0: +256,192,45506,1,0,0:0:0:0: +36,192,45506,1,0,0:0:0:0: +109,192,45585,1,0,0:0:0:0: +475,192,45664,128,0,46137:0:0:0:0: +182,192,45664,1,0,0:0:0:0: +329,192,45664,1,0,0:0:0:0: +109,192,45743,1,0,0:0:0:0: +36,192,45822,1,0,0:0:0:0: +256,192,45822,1,0,0:0:0:0: +182,192,45901,1,0,0:0:0:0: +109,192,45980,1,0,0:0:0:0: +329,192,45980,1,0,0:0:0:0: +256,192,46058,1,0,0:0:0:0: +182,192,46137,1,0,0:0:0:0: +402,192,46137,1,0,0:0:0:0: +329,192,46216,1,0,0:0:0:0: +256,192,46295,1,0,0:0:0:0: +109,192,46295,1,0,0:0:0:0: +329,192,46374,1,0,0:0:0:0: +36,192,46453,128,0,46690:0:0:0:0: +402,192,46453,1,0,0:0:0:0: +182,192,46453,1,0,0:0:0:0: +256,192,46532,1,0,0:0:0:0: +329,192,46611,1,0,0:0:0:0: +475,192,46611,1,0,0:0:0:0: +256,192,46690,1,0,0:0:0:0: +36,192,46769,128,0,47085:0:0:0:0: +182,192,46769,1,0,0:0:0:0: +402,192,46769,1,0,0:0:0:0: +329,192,46848,1,0,0:0:0:0: +256,192,46927,1,0,0:0:0:0: +475,192,46927,1,0,0:0:0:0: +402,192,47006,1,0,0:0:0:0: +182,192,47085,128,0,47243:0:0:0:0: +329,192,47085,1,0,0:0:0:0: +475,192,47085,1,0,0:0:0:0: +256,192,47164,1,0,0:0:0:0: +36,192,47243,128,0,47558:0:0:0:0: +402,192,47243,1,0,0:0:0:0: +475,192,47243,1,0,0:0:0:0: +329,192,47322,1,0,0:0:0:0: +256,192,47401,1,0,0:0:0:0: +475,192,47401,1,0,0:0:0:0: +402,192,47480,1,0,0:0:0:0: +182,192,47558,128,0,47716:0:0:0:0: +329,192,47558,1,0,0:0:0:0: +109,192,47558,1,0,0:0:0:0: +402,192,47637,1,0,0:0:0:0: +36,192,47716,128,0,48032:0:0:0:0: +475,192,47716,1,0,0:0:0:0: +256,192,47716,1,0,0:0:0:0: +329,192,47795,1,0,0:0:0:0: +109,192,47874,128,0,48032:0:0:0:0: +475,192,47874,1,0,0:0:0:0: +256,192,47874,1,0,0:0:0:0: +402,192,47953,1,0,0:0:0:0: +182,192,48032,128,0,48190:0:0:0:0: +329,192,48032,1,0,0:0:0:0: +475,192,48032,1,0,0:0:0:0: +402,192,48111,1,0,0:0:0:0: +36,192,48190,128,0,48664:0:0:0:0: +475,192,48190,1,0,0:0:0:0: +256,192,48190,1,0,0:0:0:0: +329,192,48269,1,0,0:0:0:0: +402,192,48348,1,0,0:0:0:0: +182,192,48348,1,0,0:0:0:0: +256,192,48427,1,0,0:0:0:0: +329,192,48506,1,0,0:0:0:0: +109,192,48506,1,0,0:0:0:0: +182,192,48585,1,0,0:0:0:0: +256,192,48664,1,0,0:0:0:0: +475,192,48664,1,0,0:0:0:0: +329,192,48743,1,0,0:0:0:0: +402,192,48822,1,0,0:0:0:0: +109,192,48822,1,0,0:0:0:0: +182,192,48901,1,0,0:0:0:0: +475,192,48980,128,0,49216:0:0:0:0: +256,192,48980,1,0,0:0:0:0: +36,192,48980,1,0,0:0:0:0: +402,192,48980,1,0,0:0:0:0: +182,192,49058,1,0,0:0:0:0: +36,192,49137,1,0,0:0:0:0: +329,192,49137,1,0,0:0:0:0: +402,192,49137,1,0,0:0:0:0: +256,192,49216,1,0,0:0:0:0: +182,192,49216,1,0,0:0:0:0: +475,192,49295,128,0,49611:0:0:0:0: +36,192,49295,1,0,0:0:0:0: +109,192,49295,1,0,0:0:0:0: +402,192,49295,1,0,0:0:0:0: +182,192,49374,1,0,0:0:0:0: +256,192,49453,1,0,0:0:0:0: +36,192,49453,1,0,0:0:0:0: +109,192,49532,1,0,0:0:0:0: +329,192,49611,128,0,49769:0:0:0:0: +182,192,49611,1,0,0:0:0:0: +36,192,49611,1,0,0:0:0:0: +402,192,49611,1,0,0:0:0:0: +109,192,49690,1,0,0:0:0:0: +475,192,49769,128,0,50085:0:0:0:0: +36,192,49769,1,0,0:0:0:0: +256,192,49769,1,0,0:0:0:0: +182,192,49848,1,0,0:0:0:0: +109,192,49927,1,0,0:0:0:0: +329,192,49927,1,0,0:0:0:0: +256,192,50006,1,0,0:0:0:0: +329,192,50085,128,0,50243:0:0:0:0: +182,192,50085,1,0,0:0:0:0: +36,192,50085,1,0,0:0:0:0: +109,192,50164,1,0,0:0:0:0: +475,192,50243,128,0,50558:0:0:0:0: +36,192,50243,1,0,0:0:0:0: +256,192,50243,1,0,0:0:0:0: +109,192,50322,1,0,0:0:0:0: +182,192,50401,1,0,0:0:0:0: +36,192,50401,1,0,0:0:0:0: +256,192,50480,1,0,0:0:0:0: +402,192,50558,128,0,50716:0:0:0:0: +109,192,50558,1,0,0:0:0:0: +329,192,50558,1,0,0:0:0:0: +182,192,50637,1,0,0:0:0:0: +475,192,50716,128,0,51348:0:0:0:0: +256,192,50716,1,0,0:0:0:0: +36,192,50716,1,0,0:0:0:0: +109,192,50795,1,0,0:0:0:0: +182,192,50874,1,0,0:0:0:0: +329,192,50874,1,0,0:0:0:0: +402,192,50953,1,0,0:0:0:0: +36,192,51032,1,0,0:0:0:0: +182,192,51032,1,0,0:0:0:0: +256,192,51111,1,0,0:0:0:0: +329,192,51190,1,0,0:0:0:0: +109,192,51190,1,0,0:0:0:0: +182,192,51269,1,0,0:0:0:0: +256,192,51348,1,0,0:0:0:0: +36,192,51348,1,0,0:0:0:0: +329,192,51427,1,0,0:0:0:0: +182,192,51506,128,0,51822:0:0:0:0: +402,192,51506,1,0,0:0:0:0: +36,192,51506,1,0,0:0:0:0: +475,192,51506,1,0,0:0:0:0: +329,192,51585,1,0,0:0:0:0: +256,192,51664,1,0,0:0:0:0: +475,192,51664,1,0,0:0:0:0: +402,192,51743,1,0,0:0:0:0: +36,192,51822,128,0,52137:0:0:0:0: +329,192,51822,1,0,0:0:0:0: +109,192,51822,1,0,0:0:0:0: +256,192,51901,1,0,0:0:0:0: +182,192,51980,1,0,0:0:0:0: +402,192,51980,1,0,0:0:0:0: +256,192,52058,1,0,0:0:0:0: +109,192,52137,128,0,52453:0:0:0:0: +329,192,52137,1,0,0:0:0:0: +475,192,52137,1,0,0:0:0:0: +256,192,52216,1,0,0:0:0:0: +475,192,52295,1,0,0:0:0:0: +182,192,52295,1,0,0:0:0:0: +402,192,52374,1,0,0:0:0:0: +182,192,52453,128,0,52769:0:0:0:0: +329,192,52453,1,0,0:0:0:0: +36,192,52453,1,0,0:0:0:0: +402,192,52532,1,0,0:0:0:0: +256,192,52611,1,0,0:0:0:0: +475,192,52611,1,0,0:0:0:0: +329,192,52690,1,0,0:0:0:0: +36,192,52769,128,0,53006:0:0:0:0: +402,192,52769,1,0,0:0:0:0: +475,192,52769,1,0,0:0:0:0: +256,192,52769,1,0,0:0:0:0: +109,192,52769,1,0,0:0:0:0: +182,192,52927,128,0,53006:0:0:0:0: +329,192,52927,1,0,0:0:0:0: +475,192,52927,1,0,0:0:0:0: +182,192,53085,128,0,53322:0:0:0:0: +329,192,53085,1,0,0:0:0:0: +402,192,53085,1,0,0:0:0:0: +475,192,53085,1,0,0:0:0:0: +36,192,53085,1,0,0:0:0:0: +36,192,53243,128,0,53322:0:0:0:0: +256,192,53243,1,0,0:0:0:0: +402,192,53243,1,0,0:0:0:0: +36,192,53401,128,0,53716:0:0:0:0: +182,192,53401,128,0,53716:0:0:0:0: +329,192,53401,1,0,0:0:0:0: +402,192,53401,1,0,0:0:0:0: +475,192,53401,1,0,0:0:0:0: +256,192,53558,128,0,53716:0:0:0:0: +402,192,53558,128,0,53716:0:0:0:0: +329,192,53558,1,0,0:0:0:0: +475,192,53558,1,0,0:0:0:0: +329,192,53874,128,0,54190:0:0:0:0: +475,192,53874,128,0,54190:0:0:0:0: +182,192,53874,1,0,0:0:0:0: +36,192,53874,1,0,0:0:0:0: +109,192,53874,1,0,0:0:0:0: +182,192,54190,1,0,0:0:0:0: +36,192,54190,1,0,0:0:0:0: +109,192,54190,1,0,0:0:0:0: +402,192,54348,128,0,54506:0:0:0:0: +182,192,54348,1,0,0:0:0:0: +36,192,54348,1,0,0:0:0:0: +475,192,54348,1,0,0:0:0:0: +256,192,54427,1,0,0:0:0:0: +329,192,54506,1,0,0:0:0:0: +109,192,54506,1,0,0:0:0:0: +256,192,54585,1,0,0:0:0:0: +109,192,54664,128,0,54822:0:0:0:0: +182,192,54664,1,0,0:0:0:0: +36,192,54664,1,0,0:0:0:0: +475,192,54664,1,0,0:0:0:0: +329,192,54743,1,0,0:0:0:0: +402,192,54822,128,0,55137:0:0:0:0: +256,192,54822,1,0,0:0:0:0: +36,192,54822,1,0,0:0:0:0: +182,192,54901,1,0,0:0:0:0: +109,192,54980,1,0,0:0:0:0: +36,192,54980,1,0,0:0:0:0: +329,192,54980,1,0,0:0:0:0: +256,192,55058,1,0,0:0:0:0: +109,192,55137,128,0,55295:0:0:0:0: +182,192,55137,1,0,0:0:0:0: +475,192,55137,1,0,0:0:0:0: +402,192,55216,1,0,0:0:0:0: +329,192,55295,128,0,55453:0:0:0:0: +256,192,55295,1,0,0:0:0:0: +36,192,55295,1,0,0:0:0:0: +475,192,55295,1,0,0:0:0:0: +182,192,55374,1,0,0:0:0:0: +109,192,55453,1,0,0:0:0:0: +402,192,55453,1,0,0:0:0:0: +329,192,55532,1,0,0:0:0:0: +182,192,55611,128,0,55769:0:0:0:0: +256,192,55611,1,0,0:0:0:0: +36,192,55611,1,0,0:0:0:0: +475,192,55611,1,0,0:0:0:0: +109,192,55690,1,0,0:0:0:0: +329,192,55769,128,0,56243:0:0:0:0: +475,192,55769,1,0,0:0:0:0: +36,192,55769,1,0,0:0:0:0: +256,192,55848,1,0,0:0:0:0: +36,192,55927,1,0,0:0:0:0: +182,192,55927,1,0,0:0:0:0: +475,192,55927,1,0,0:0:0:0: +256,192,56006,1,0,0:0:0:0: +402,192,56085,1,0,0:0:0:0: +109,192,56085,1,0,0:0:0:0: +182,192,56164,1,0,0:0:0:0: +256,192,56243,1,0,0:0:0:0: +36,192,56243,1,0,0:0:0:0: +475,192,56243,1,0,0:0:0:0: +402,192,56322,1,0,0:0:0:0: +329,192,56401,1,0,0:0:0:0: +109,192,56401,1,0,0:0:0:0: +256,192,56480,1,0,0:0:0:0: +182,192,56558,128,0,56716:0:0:0:0: +36,192,56558,1,0,0:0:0:0: +475,192,56558,1,0,0:0:0:0: +402,192,56558,1,0,0:0:0:0: +329,192,56637,1,0,0:0:0:0: +256,192,56716,1,0,0:0:0:0: +109,192,56716,1,0,0:0:0:0: +402,192,56795,1,0,0:0:0:0: +329,192,56874,128,0,57032:0:0:0:0: +182,192,56874,1,0,0:0:0:0: +36,192,56874,1,0,0:0:0:0: +475,192,56874,1,0,0:0:0:0: +256,192,56953,1,0,0:0:0:0: +109,192,57032,1,0,0:0:0:0: +402,192,57032,1,0,0:0:0:0: +256,192,57111,1,0,0:0:0:0: +182,192,57190,128,0,57348:0:0:0:0: +329,192,57190,1,0,0:0:0:0: +36,192,57190,1,0,0:0:0:0: +475,192,57190,1,0,0:0:0:0: +402,192,57269,1,0,0:0:0:0: +329,192,57348,128,0,57506:0:0:0:0: +256,192,57348,1,0,0:0:0:0: +36,192,57348,1,0,0:0:0:0: +109,192,57427,1,0,0:0:0:0: +182,192,57506,1,0,0:0:0:0: +36,192,57506,1,0,0:0:0:0: +475,192,57506,1,0,0:0:0:0: +402,192,57585,1,0,0:0:0:0: +182,192,57664,128,0,57822:0:0:0:0: +329,192,57664,1,0,0:0:0:0: +109,192,57664,1,0,0:0:0:0: +256,192,57743,1,0,0:0:0:0: +402,192,57822,128,0,57980:0:0:0:0: +329,192,57822,1,0,0:0:0:0: +36,192,57822,1,0,0:0:0:0: +475,192,57822,1,0,0:0:0:0: +182,192,57901,1,0,0:0:0:0: +109,192,57980,128,0,58137:0:0:0:0: +329,192,57980,1,0,0:0:0:0: +256,192,57980,1,0,0:0:0:0: +182,192,58058,1,0,0:0:0:0: +402,192,58137,128,0,58295:0:0:0:0: +256,192,58137,1,0,0:0:0:0: +36,192,58137,1,0,0:0:0:0: +475,192,58137,1,0,0:0:0:0: +329,192,58216,1,0,0:0:0:0: +109,192,58295,128,0,58769:0:0:0:0: +182,192,58295,1,0,0:0:0:0: +36,192,58295,1,0,0:0:0:0: +256,192,58374,1,0,0:0:0:0: +329,192,58453,1,0,0:0:0:0: +475,192,58453,1,0,0:0:0:0: +36,192,58453,1,0,0:0:0:0: +182,192,58532,1,0,0:0:0:0: +329,192,58611,1,0,0:0:0:0: +475,192,58611,1,0,0:0:0:0: +256,192,58690,1,0,0:0:0:0: +182,192,58769,1,0,0:0:0:0: +36,192,58769,1,0,0:0:0:0: +402,192,58769,1,0,0:0:0:0: +329,192,58848,1,0,0:0:0:0: +256,192,58927,1,0,0:0:0:0: +109,192,58927,1,0,0:0:0:0: +329,192,59006,1,0,0:0:0:0: +475,192,59085,128,0,59637:0:0:0:0: +256,192,59085,128,0,59243:0:0:0:0: +36,192,59085,1,0,0:0:0:0: +182,192,59085,1,0,0:0:0:0: +402,192,59085,1,0,0:0:0:0: +329,192,59164,128,0,59322:0:0:0:0: +402,192,59243,128,0,59401:0:0:0:0: +36,192,59243,1,0,0:0:0:0: +109,192,59243,1,0,0:0:0:0: +182,192,59322,128,0,59480:0:0:0:0: +256,192,59401,128,0,59558:0:0:0:0: +36,192,59401,128,0,59637:0:0:0:0: +329,192,59480,128,0,59637:0:0:0:0: +109,192,59558,128,0,59716:0:0:0:0: +182,192,59637,128,0,59795:0:0:0:0: +475,192,59716,128,0,60032:0:0:0:0: +256,192,59716,128,0,59874:0:0:0:0: +36,192,59716,128,0,60111:0:0:0:0: +329,192,59716,1,0,0:0:0:0: +402,192,59716,1,0,0:0:0:0: +109,192,59795,128,0,60032:0:0:0:0: +182,192,59874,128,0,59953:0:0:0:0: +329,192,59953,128,0,60032:0:0:0:0: +402,192,60032,128,0,60111:0:0:0:0: +256,192,60032,1,0,0:0:0:0: +329,192,60111,128,0,60190:0:0:0:0: +182,192,60111,1,0,0:0:0:0: +256,192,60190,128,0,60269:0:0:0:0: +109,192,60190,1,0,0:0:0:0: +182,192,60269,128,0,60348:0:0:0:0: +36,192,60269,1,0,0:0:0:0: +329,192,60348,128,0,60980:0:0:0:0: +475,192,60348,128,0,60980:0:0:0:0: +402,192,60348,1,0,0:0:0:0: +36,192,60664,128,0,61532:0:0:0:0: +182,192,60664,128,0,61532:0:0:0:0: +256,192,60980,128,0,61295:0:0:0:0: +402,192,60980,128,0,61295:0:0:0:0: +329,192,61295,128,0,61532:0:0:0:0: +475,192,61295,128,0,61532:0:0:0:0: +329,192,61611,128,0,61848:0:0:0:0: +475,192,61611,128,0,61848:0:0:0:0: +109,192,61611,128,0,61769:0:0:0:0: +256,192,61611,128,0,61769:0:0:0:0: +36,192,61611,1,0,0:0:0:0: +36,192,61769,128,0,61927:0:0:0:0: +182,192,61769,128,0,61927:0:0:0:0: +475,192,61927,128,0,62164:0:0:0:0: +329,192,61927,128,0,62164:0:0:0:0: +402,192,61927,1,0,0:0:0:0: +256,192,61927,1,0,0:0:0:0: +109,192,62006,128,0,62243:0:0:0:0: +182,192,62085,128,0,62243:0:0:0:0: +256,192,62164,128,0,62243:0:0:0:0: +329,192,62243,128,0,62322:0:0:0:0: +475,192,62243,128,0,62480:0:0:0:0: +36,192,62243,128,0,62401:0:0:0:0: +402,192,62243,1,0,0:0:0:0: +402,192,62401,128,0,62480:0:0:0:0: +109,192,62401,128,0,62558:0:0:0:0: +256,192,62401,128,0,62480:0:0:0:0: +36,192,62558,128,0,62795:0:0:0:0: +182,192,62558,128,0,62637:0:0:0:0: +402,192,62558,128,0,62795:0:0:0:0: +475,192,62558,1,0,0:0:0:0: +329,192,62637,128,0,62795:0:0:0:0: +256,192,62716,128,0,62795:0:0:0:0: +109,192,62716,128,0,62795:0:0:0:0: +182,192,62874,128,0,63111:0:0:0:0: +36,192,62874,128,0,63111:0:0:0:0: +256,192,62874,128,0,62953:0:0:0:0: +475,192,62874,128,0,62953:0:0:0:0: +109,192,62874,1,0,0:0:0:0: +475,192,63032,128,0,63111:0:0:0:0: +329,192,63032,128,0,63111:0:0:0:0: +402,192,63032,1,0,0:0:0:0: +256,192,63190,128,0,63348:0:0:0:0: +402,192,63190,128,0,63348:0:0:0:0: +36,192,63190,128,0,63269:0:0:0:0: +182,192,63190,128,0,63269:0:0:0:0: +475,192,63190,1,0,0:0:0:0: +329,192,63348,128,0,63506:0:0:0:0: +475,192,63348,128,0,63506:0:0:0:0: +109,192,63348,128,0,63427:0:0:0:0: +36,192,63506,128,0,63664:0:0:0:0: +402,192,63506,128,0,63822:0:0:0:0: +182,192,63506,1,0,0:0:0:0: +109,192,63585,128,0,63743:0:0:0:0: +256,192,63585,1,0,0:0:0:0: +182,192,63664,128,0,63822:0:0:0:0: +329,192,63664,1,0,0:0:0:0: +256,192,63743,128,0,63901:0:0:0:0: +475,192,63822,128,0,64058:0:0:0:0: +36,192,63822,128,0,63980:0:0:0:0: +329,192,63822,128,0,64058:0:0:0:0: +109,192,63901,128,0,63980:0:0:0:0: +182,192,63980,128,0,64058:0:0:0:0: +109,192,64058,128,0,64137:0:0:0:0: +182,192,64137,128,0,64374:0:0:0:0: +36,192,64137,128,0,64374:0:0:0:0: +402,192,64137,128,0,64295:0:0:0:0: +256,192,64137,128,0,64295:0:0:0:0: +475,192,64137,1,0,0:0:0:0: +475,192,64295,128,0,64453:0:0:0:0: +329,192,64295,128,0,64453:0:0:0:0: +36,192,64453,128,0,64690:0:0:0:0: +182,192,64453,128,0,64690:0:0:0:0: +109,192,64453,1,0,0:0:0:0: +256,192,64453,1,0,0:0:0:0: +402,192,64532,128,0,64769:0:0:0:0: +329,192,64611,128,0,64769:0:0:0:0: +256,192,64690,128,0,64769:0:0:0:0: +182,192,64769,128,0,64848:0:0:0:0: +36,192,64769,128,0,65006:0:0:0:0: +475,192,64769,128,0,64927:0:0:0:0: +109,192,64769,1,0,0:0:0:0: +109,192,64927,128,0,65006:0:0:0:0: +402,192,64927,128,0,65085:0:0:0:0: +256,192,64927,128,0,65006:0:0:0:0: +475,192,65085,128,0,65322:0:0:0:0: +329,192,65085,128,0,65164:0:0:0:0: +109,192,65085,128,0,65322:0:0:0:0: +36,192,65085,1,0,0:0:0:0: +182,192,65164,128,0,65322:0:0:0:0: +256,192,65243,128,0,65322:0:0:0:0: +402,192,65243,128,0,65322:0:0:0:0: +329,192,65401,128,0,65637:0:0:0:0: +475,192,65401,128,0,65637:0:0:0:0: +256,192,65401,128,0,65480:0:0:0:0: +36,192,65401,128,0,65480:0:0:0:0: +402,192,65401,1,0,0:0:0:0: +36,192,65558,128,0,65637:0:0:0:0: +182,192,65558,128,0,65637:0:0:0:0: +109,192,65558,1,0,0:0:0:0: +256,192,65716,128,0,65874:0:0:0:0: +402,192,65716,128,0,65874:0:0:0:0: +475,192,65716,1,0,0:0:0:0: +109,192,65716,128,0,65795:0:0:0:0: +36,192,65795,128,0,65953:0:0:0:0: +182,192,65795,128,0,65953:0:0:0:0: +329,192,65874,128,0,66032:0:0:0:0: +475,192,65874,128,0,66032:0:0:0:0: +109,192,65953,128,0,66111:0:0:0:0: +256,192,65953,128,0,66111:0:0:0:0: +182,192,66032,128,0,66190:0:0:0:0: +36,192,66032,128,0,66190:0:0:0:0: +475,192,66111,128,0,66190:0:0:0:0: +402,192,66111,128,0,66190:0:0:0:0: +329,192,66190,128,0,66269:0:0:0:0: +256,192,66190,128,0,66269:0:0:0:0: +182,192,66269,128,0,66348:0:0:0:0: +109,192,66269,128,0,66348:0:0:0:0: +36,192,66348,128,0,66585:0:0:0:0: +475,192,66348,128,0,66506:0:0:0:0: +329,192,66348,128,0,66427:0:0:0:0: +402,192,66348,1,0,0:0:0:0: +256,192,66427,128,0,66506:0:0:0:0: +182,192,66506,128,0,66585:0:0:0:0: +402,192,66506,1,0,0:0:0:0: +329,192,66585,1,0,0:0:0:0: +109,192,66585,128,0,66664:0:0:0:0: +182,192,66664,128,0,66901:0:0:0:0: +36,192,66664,128,0,66901:0:0:0:0: +402,192,66664,128,0,66822:0:0:0:0: +256,192,66664,128,0,66822:0:0:0:0: +475,192,66664,1,0,0:0:0:0: +475,192,66822,128,0,66980:0:0:0:0: +329,192,66822,128,0,66980:0:0:0:0: +36,192,66980,128,0,67216:0:0:0:0: +182,192,66980,128,0,67216:0:0:0:0: +109,192,66980,1,0,0:0:0:0: +256,192,66980,1,0,0:0:0:0: +402,192,67058,128,0,67295:0:0:0:0: +329,192,67137,128,0,67295:0:0:0:0: +256,192,67216,128,0,67295:0:0:0:0: +182,192,67295,128,0,67453:0:0:0:0: +36,192,67295,128,0,67532:0:0:0:0: +475,192,67295,128,0,67453:0:0:0:0: +109,192,67295,1,0,0:0:0:0: +109,192,67453,128,0,67532:0:0:0:0: +402,192,67453,128,0,67611:0:0:0:0: +256,192,67453,128,0,67611:0:0:0:0: +475,192,67611,128,0,67848:0:0:0:0: +329,192,67611,128,0,67690:0:0:0:0: +109,192,67611,128,0,67690:0:0:0:0: +36,192,67611,1,0,0:0:0:0: +182,192,67690,128,0,67769:0:0:0:0: +256,192,67769,128,0,67848:0:0:0:0: +402,192,67769,128,0,67848:0:0:0:0: +36,192,67769,128,0,68006:0:0:0:0: +109,192,67848,128,0,68006:0:0:0:0: +329,192,67927,128,0,68164:0:0:0:0: +475,192,67927,128,0,68164:0:0:0:0: +256,192,67927,128,0,68006:0:0:0:0: +402,192,67927,1,0,0:0:0:0: +36,192,68085,128,0,68164:0:0:0:0: +182,192,68085,128,0,68164:0:0:0:0: +109,192,68085,1,0,0:0:0:0: +256,192,68243,128,0,68480:0:0:0:0: +109,192,68243,128,0,68480:0:0:0:0: +475,192,68243,128,0,68322:0:0:0:0: +329,192,68243,128,0,68322:0:0:0:0: +36,192,68243,1,0,0:0:0:0: +182,192,68401,128,0,68637:0:0:0:0: +36,192,68401,128,0,68637:0:0:0:0: +402,192,68401,128,0,68480:0:0:0:0: +475,192,68558,128,0,68716:0:0:0:0: +109,192,68558,128,0,68874:0:0:0:0: +329,192,68558,1,0,0:0:0:0: +402,192,68637,128,0,68795:0:0:0:0: +256,192,68637,1,0,0:0:0:0: +329,192,68716,128,0,68874:0:0:0:0: +182,192,68716,1,0,0:0:0:0: +256,192,68795,128,0,68953:0:0:0:0: +36,192,68874,128,0,69111:0:0:0:0: +475,192,68874,128,0,69032:0:0:0:0: +182,192,68874,128,0,69111:0:0:0:0: +402,192,68953,128,0,69032:0:0:0:0: +329,192,69032,128,0,69111:0:0:0:0: +402,192,69111,128,0,69190:0:0:0:0: +329,192,69190,128,0,69427:0:0:0:0: +475,192,69190,128,0,69427:0:0:0:0: +109,192,69190,128,0,69348:0:0:0:0: +256,192,69190,128,0,69348:0:0:0:0: +36,192,69190,1,0,0:0:0:0: +36,192,69348,128,0,69506:0:0:0:0: +182,192,69348,128,0,69506:0:0:0:0: +475,192,69506,128,0,69743:0:0:0:0: +329,192,69506,128,0,69743:0:0:0:0: +402,192,69506,1,0,0:0:0:0: +256,192,69506,1,0,0:0:0:0: +109,192,69585,128,0,69822:0:0:0:0: +182,192,69664,128,0,69822:0:0:0:0: +256,192,69743,128,0,69822:0:0:0:0: +329,192,69822,128,0,69901:0:0:0:0: +475,192,69822,128,0,70058:0:0:0:0: +36,192,69822,128,0,70137:0:0:0:0: +402,192,69822,1,0,0:0:0:0: +402,192,69980,128,0,70058:0:0:0:0: +182,192,69980,128,0,70137:0:0:0:0: +256,192,69980,128,0,70058:0:0:0:0: +475,192,70137,128,0,70374:0:0:0:0: +329,192,70137,128,0,70216:0:0:0:0: +109,192,70137,128,0,70216:0:0:0:0: +182,192,70216,128,0,70295:0:0:0:0: +256,192,70295,128,0,70374:0:0:0:0: +402,192,70295,128,0,70374:0:0:0:0: +36,192,70295,128,0,70532:0:0:0:0: +109,192,70374,128,0,70532:0:0:0:0: +256,192,70453,128,0,70532:0:0:0:0: +329,192,70453,128,0,70690:0:0:0:0: +402,192,70453,1,0,0:0:0:0: +475,192,70453,128,0,70690:0:0:0:0: +36,192,70611,128,0,70690:0:0:0:0: +109,192,70611,1,0,0:0:0:0: +182,192,70611,128,0,70690:0:0:0:0: +329,192,70769,128,0,71006:0:0:0:0: +475,192,70769,128,0,71006:0:0:0:0: +109,192,70769,128,0,70848:0:0:0:0: +256,192,70769,128,0,70848:0:0:0:0: +36,192,70769,128,0,71085:0:0:0:0: +182,192,70848,128,0,70927:0:0:0:0: +402,192,70927,128,0,71006:0:0:0:0: +256,192,70927,128,0,71085:0:0:0:0: +182,192,71006,128,0,71164:0:0:0:0: +475,192,71085,128,0,71322:0:0:0:0: +109,192,71085,128,0,71243:0:0:0:0: +329,192,71085,128,0,71322:0:0:0:0: +402,192,71085,1,0,0:0:0:0: +256,192,71164,128,0,71243:0:0:0:0: +36,192,71243,128,0,71401:0:0:0:0: +182,192,71243,128,0,71401:0:0:0:0: +402,192,71322,128,0,71480:0:0:0:0: +256,192,71322,128,0,71401:0:0:0:0: +109,192,71401,128,0,71558:0:0:0:0: +329,192,71401,128,0,71558:0:0:0:0: +475,192,71401,128,0,71637:0:0:0:0: +36,192,71480,128,0,71637:0:0:0:0: +256,192,71480,128,0,71637:0:0:0:0: +402,192,71558,128,0,71637:0:0:0:0: +182,192,71558,128,0,71716:0:0:0:0: +329,192,71637,128,0,71716:0:0:0:0: +36,192,71716,1,0,0:0:0:0: +402,192,71716,1,0,0:0:0:0: +475,192,71716,1,0,0:0:0:0: +109,192,71716,128,0,72032:0:0:0:0: +182,192,72032,128,0,72348:0:0:0:0: +256,192,72348,128,0,72664:0:0:0:0: +329,192,72664,128,0,72980:0:0:0:0: +36,192,72980,128,0,73453:0:0:0:0: +109,192,72980,128,0,73453:0:0:0:0: +475,192,72980,1,0,0:0:0:0: +256,192,72980,1,0,0:0:0:0: +329,192,73197,128,0,73690:0:0:0:0: +402,192,73197,1,0,0:0:0:0: +182,192,73197,1,0,0:0:0:0: +36,192,73611,128,0,73927:0:0:0:0: +182,192,73611,128,0,73927:0:0:0:0: +109,192,73611,1,0,0:0:0:0: +256,192,73611,1,0,0:0:0:0: +329,192,73769,128,0,73927:0:0:0:0: +475,192,73769,128,0,73927:0:0:0:0: +109,192,73927,128,0,74137:0:0:0:0: +256,192,73927,128,0,74137:0:0:0:0: +329,192,74137,1,0,0:0:0:0: +475,192,74137,1,0,0:0:0:0: +182,192,74137,128,0,74558:0:0:0:0: +36,192,74137,128,0,74558:0:0:0:0: +475,192,74401,128,0,74769:0:0:0:0: +329,192,74558,1,0,0:0:0:0: +109,192,74558,1,0,0:0:0:0: +109,192,74699,128,0,75085:0:0:0:0: +256,192,74769,128,0,75085:0:0:0:0: +402,192,74874,128,0,75085:0:0:0:0: +36,192,75085,128,0,75427:0:0:0:0: +475,192,75085,1,0,0:0:0:0: +329,192,75085,1,0,0:0:0:0: +182,192,75190,128,0,75427:0:0:0:0: +329,192,75269,128,0,75427:0:0:0:0: +475,192,75348,128,0,75980:0:0:0:0: +256,192,75427,1,0,0:0:0:0: +402,192,75427,1,0,0:0:0:0: +182,192,75506,128,0,75822:0:0:0:0: +109,192,75506,128,0,75822:0:0:0:0: +36,192,75506,1,0,0:0:0:0: +329,192,75506,1,0,0:0:0:0: +329,192,75822,1,0,0:0:0:0: +36,192,75822,1,0,0:0:0:0: +329,192,75980,128,0,76769:0:0:0:0: +36,192,75980,1,0,0:0:0:0: +402,192,75980,1,0,0:0:0:0: +182,192,75980,128,0,76769:0:0:0:0: +475,192,76348,1,0,0:0:0:0: +109,192,76348,1,0,0:0:0:0: +36,192,76348,1,0,0:0:0:0: +402,192,76453,1,0,0:0:0:0: +256,192,76558,1,0,0:0:0:0: +109,192,76664,1,0,0:0:0:0: +36,192,76769,1,0,0:0:0:0: +402,192,76769,1,0,0:0:0:0: +475,192,76769,1,0,0:0:0:0: +256,192,76769,1,0,0:0:0:0: +109,192,76927,1,0,0:0:0:0: +182,192,76927,1,0,0:0:0:0: +329,192,76927,1,0,0:0:0:0: +402,192,76927,1,0,0:0:0:0: +182,192,77243,1,0,0:0:0:0: +109,192,77243,1,0,0:0:0:0: +402,192,77243,1,0,0:0:0:0: +329,192,77243,1,0,0:0:0:0: +182,192,77558,1,0,0:0:0:0: +36,192,77558,1,0,0:0:0:0: +475,192,77558,1,0,0:0:0:0: +329,192,77558,1,0,0:0:0:0: +256,192,77558,1,0,0:0:0:0: +36,192,77874,1,0,0:0:0:0: +329,192,77874,1,0,0:0:0:0: +475,192,77874,1,0,0:0:0:0: +109,192,77927,1,0,0:0:0:0: +182,192,77980,1,0,0:0:0:0: +36,192,78032,128,0,79137:0:0:0:0: +256,192,78032,1,0,0:0:0:0: +402,192,78032,1,0,0:0:0:0: +475,192,78032,1,0,0:0:0:0: +329,192,78032,1,0,0:0:0:0: +402,192,78190,128,0,78348:0:0:0:0: +329,192,78190,1,0,0:0:0:0: +475,192,78190,1,0,0:0:0:0: +256,192,78348,128,0,78506:0:0:0:0: +182,192,78348,1,0,0:0:0:0: +109,192,78348,1,0,0:0:0:0: +329,192,78348,1,0,0:0:0:0: +109,192,78506,128,0,78664:0:0:0:0: +402,192,78506,1,0,0:0:0:0: +475,192,78506,1,0,0:0:0:0: +475,192,78664,128,0,78822:0:0:0:0: +182,192,78664,1,0,0:0:0:0: +329,192,78664,1,0,0:0:0:0: +256,192,78664,1,0,0:0:0:0: +329,192,78822,128,0,78980:0:0:0:0: +109,192,78822,1,0,0:0:0:0: +256,192,78822,1,0,0:0:0:0: +182,192,78980,128,0,79137:0:0:0:0: +109,192,78980,1,0,0:0:0:0: +256,192,78980,1,0,0:0:0:0: +475,192,78980,1,0,0:0:0:0: +256,192,79137,128,0,79295:0:0:0:0: +402,192,79137,128,0,79295:0:0:0:0: +329,192,79137,1,0,0:0:0:0: +475,192,79137,1,0,0:0:0:0: +182,192,79295,1,0,0:0:0:0: +36,192,79295,1,0,0:0:0:0: +329,192,79295,1,0,0:0:0:0: +475,192,79295,1,0,0:0:0:0: +36,192,79453,128,0,79611:0:0:0:0: +182,192,79453,128,0,79611:0:0:0:0: +329,192,79453,1,0,0:0:0:0: +475,192,79453,1,0,0:0:0:0: +256,192,79611,1,0,0:0:0:0: +402,192,79611,1,0,0:0:0:0: +109,192,79611,1,0,0:0:0:0: +475,192,79611,1,0,0:0:0:0: +329,192,79769,128,0,79927:0:0:0:0: +475,192,79769,128,0,79927:0:0:0:0: +182,192,79769,1,0,0:0:0:0: +36,192,79769,1,0,0:0:0:0: +109,192,79927,1,0,0:0:0:0: +256,192,79927,1,0,0:0:0:0: +402,192,79927,1,0,0:0:0:0: +36,192,79927,1,0,0:0:0:0: +109,192,80085,128,0,80243:0:0:0:0: +256,192,80085,128,0,80243:0:0:0:0: +329,192,80085,1,0,0:0:0:0: +475,192,80085,1,0,0:0:0:0: +402,192,80243,1,0,0:0:0:0: +182,192,80243,1,0,0:0:0:0: +36,192,80243,1,0,0:0:0:0: +475,192,80243,1,0,0:0:0:0: +329,192,80322,1,0,0:0:0:0: +256,192,80322,1,0,0:0:0:0: +182,192,80401,1,0,0:0:0:0: +36,192,80401,1,0,0:0:0:0: +475,192,80401,1,0,0:0:0:0: +329,192,80480,1,0,0:0:0:0: +402,192,80480,1,0,0:0:0:0: +256,192,80558,1,0,0:0:0:0: +109,192,80558,1,0,0:0:0:0: +36,192,80558,1,0,0:0:0:0: +475,192,80558,128,0,81822:0:0:0:0: +182,192,80558,1,0,0:0:0:0: +329,192,80716,128,0,80874:0:0:0:0: +36,192,80716,1,0,0:0:0:0: +182,192,80716,1,0,0:0:0:0: +182,192,80874,128,0,81032:0:0:0:0: +36,192,80874,1,0,0:0:0:0: +256,192,80874,1,0,0:0:0:0: +402,192,80874,1,0,0:0:0:0: +36,192,81032,128,0,81190:0:0:0:0: +109,192,81032,1,0,0:0:0:0: +329,192,81032,1,0,0:0:0:0: +402,192,81190,128,0,81348:0:0:0:0: +256,192,81190,1,0,0:0:0:0: +109,192,81190,1,0,0:0:0:0: +329,192,81190,1,0,0:0:0:0: +109,192,81348,128,0,81506:0:0:0:0: +182,192,81348,1,0,0:0:0:0: +36,192,81348,1,0,0:0:0:0: +256,192,81506,128,0,81664:0:0:0:0: +36,192,81506,1,0,0:0:0:0: +329,192,81506,1,0,0:0:0:0: +402,192,81506,1,0,0:0:0:0: +402,192,81664,128,0,81822:0:0:0:0: +182,192,81664,1,0,0:0:0:0: +36,192,81664,1,0,0:0:0:0: +36,192,81822,128,0,83006:0:0:0:0: +109,192,81822,1,0,0:0:0:0: +256,192,81822,1,0,0:0:0:0: +329,192,81822,1,0,0:0:0:0: +182,192,81980,128,0,82137:0:0:0:0: +329,192,81980,1,0,0:0:0:0: +475,192,81980,1,0,0:0:0:0: +329,192,82137,128,0,82295:0:0:0:0: +475,192,82137,1,0,0:0:0:0: +256,192,82137,1,0,0:0:0:0: +109,192,82137,1,0,0:0:0:0: +475,192,82295,128,0,82453:0:0:0:0: +109,192,82295,1,0,0:0:0:0: +256,192,82295,1,0,0:0:0:0: +402,192,82453,128,0,82611:0:0:0:0: +182,192,82453,128,0,83006:0:0:0:0: +329,192,82453,1,0,0:0:0:0: +109,192,82453,1,0,0:0:0:0: +329,192,82611,128,0,82769:0:0:0:0: +475,192,82611,1,0,0:0:0:0: +256,192,82611,1,0,0:0:0:0: +109,192,82769,128,0,83006:0:0:0:0: +256,192,82769,128,0,83006:0:0:0:0: +402,192,82769,1,0,0:0:0:0: +475,192,82769,1,0,0:0:0:0: +402,192,82927,128,0,83006:0:0:0:0: +475,192,82927,128,0,83006:0:0:0:0: +36,192,83085,128,0,83322:0:0:0:0: +329,192,83085,1,0,0:0:0:0: +475,192,83085,1,0,0:0:0:0: +109,192,83085,1,0,0:0:0:0: +182,192,83085,1,0,0:0:0:0: +182,192,83243,128,0,83558:0:0:0:0: +402,192,83243,1,0,0:0:0:0: +256,192,83243,1,0,0:0:0:0: +36,192,83401,128,0,83558:0:0:0:0: +329,192,83401,1,0,0:0:0:0: +475,192,83401,1,0,0:0:0:0: +475,192,83558,128,0,83795:0:0:0:0: +402,192,83558,1,0,0:0:0:0: +109,192,83558,1,0,0:0:0:0: +256,192,83558,1,0,0:0:0:0: +329,192,83558,1,0,0:0:0:0: +329,192,83716,128,0,84032:0:0:0:0: +182,192,83716,1,0,0:0:0:0: +36,192,83716,1,0,0:0:0:0: +475,192,83874,128,0,84032:0:0:0:0: +256,192,83874,1,0,0:0:0:0: +109,192,83874,1,0,0:0:0:0: +109,192,84032,128,0,84269:0:0:0:0: +182,192,84032,1,0,0:0:0:0: +36,192,84032,1,0,0:0:0:0: +402,192,84032,1,0,0:0:0:0: +256,192,84032,1,0,0:0:0:0: +256,192,84190,128,0,84506:0:0:0:0: +329,192,84190,1,0,0:0:0:0: +475,192,84190,1,0,0:0:0:0: +109,192,84348,128,0,84506:0:0:0:0: +182,192,84348,1,0,0:0:0:0: +402,192,84348,1,0,0:0:0:0: +329,192,84506,128,0,84822:0:0:0:0: +475,192,84506,128,0,84822:0:0:0:0: +182,192,84506,1,0,0:0:0:0: +36,192,84506,1,0,0:0:0:0: +402,192,84506,1,0,0:0:0:0: +36,192,84664,128,0,85137:0:0:0:0: +109,192,84664,1,0,0:0:0:0: +256,192,84664,1,0,0:0:0:0: +182,192,84822,128,0,85137:0:0:0:0: +256,192,84822,1,0,0:0:0:0: +402,192,84822,1,0,0:0:0:0: +475,192,84980,128,0,85137:0:0:0:0: +329,192,84980,1,0,0:0:0:0: +109,192,84980,1,0,0:0:0:0: +329,192,85137,128,0,85295:0:0:0:0: +256,192,85137,1,0,0:0:0:0: +402,192,85137,1,0,0:0:0:0: +182,192,85295,128,0,85453:0:0:0:0: +109,192,85295,1,0,0:0:0:0: +475,192,85295,1,0,0:0:0:0: +36,192,85453,128,0,85611:0:0:0:0: +402,192,85453,1,0,0:0:0:0: +256,192,85453,1,0,0:0:0:0: +475,192,85611,128,0,85848:0:0:0:0: +402,192,85611,1,0,0:0:0:0: +329,192,85611,1,0,0:0:0:0: +182,192,85611,1,0,0:0:0:0: +109,192,85611,1,0,0:0:0:0: +329,192,85769,128,0,86085:0:0:0:0: +36,192,85769,128,0,85848:0:0:0:0: +182,192,85769,1,0,0:0:0:0: +402,192,85769,1,0,0:0:0:0: +475,192,85927,128,0,86085:0:0:0:0: +256,192,85927,1,0,0:0:0:0: +109,192,85927,128,0,86006:0:0:0:0: +402,192,85927,1,0,0:0:0:0: +36,192,86085,128,0,86322:0:0:0:0: +109,192,86085,1,0,0:0:0:0: +402,192,86085,1,0,0:0:0:0: +182,192,86085,1,0,0:0:0:0: +256,192,86085,1,0,0:0:0:0: +182,192,86243,128,0,86558:0:0:0:0: +329,192,86243,1,0,0:0:0:0: +475,192,86243,128,0,86322:0:0:0:0: +109,192,86243,1,0,0:0:0:0: +36,192,86401,128,0,86558:0:0:0:0: +256,192,86401,1,0,0:0:0:0: +402,192,86401,128,0,86480:0:0:0:0: +109,192,86401,1,0,0:0:0:0: +402,192,86558,128,0,86795:0:0:0:0: +329,192,86558,1,0,0:0:0:0: +475,192,86558,1,0,0:0:0:0: +256,192,86558,1,0,0:0:0:0: +109,192,86558,1,0,0:0:0:0: +256,192,86716,128,0,87032:0:0:0:0: +182,192,86716,1,0,0:0:0:0: +36,192,86716,128,0,86795:0:0:0:0: +475,192,86716,1,0,0:0:0:0: +402,192,86874,128,0,87032:0:0:0:0: +329,192,86874,1,0,0:0:0:0: +475,192,86874,1,0,0:0:0:0: +109,192,86874,128,0,86953:0:0:0:0: +182,192,87032,128,0,87348:0:0:0:0: +36,192,87032,128,0,87348:0:0:0:0: +475,192,87032,1,0,0:0:0:0: +109,192,87032,1,0,0:0:0:0: +329,192,87032,1,0,0:0:0:0: +475,192,87190,128,0,87664:0:0:0:0: +256,192,87190,1,0,0:0:0:0: +402,192,87190,128,0,87269:0:0:0:0: +109,192,87190,1,0,0:0:0:0: +329,192,87348,128,0,87664:0:0:0:0: +109,192,87348,1,0,0:0:0:0: +256,192,87348,128,0,87427:0:0:0:0: +36,192,87506,128,0,88058:0:0:0:0: +109,192,87506,128,0,88058:0:0:0:0: +182,192,87506,1,0,0:0:0:0: +256,192,87664,128,0,88058:0:0:0:0: +402,192,87664,128,0,88058:0:0:0:0: +182,192,87822,128,0,88058:0:0:0:0: +329,192,87980,128,0,88058:0:0:0:0: +475,192,87980,128,0,88058:0:0:0:0: +182,192,88137,1,0,0:0:0:0: +36,192,88137,1,0,0:0:0:0: +329,192,88137,1,0,0:0:0:0: +475,192,88137,1,0,0:0:0:0: +329,192,88295,1,0,0:0:0:0: +182,192,88453,1,0,0:0:0:0: +329,192,88611,1,0,0:0:0:0: +182,192,88769,1,0,0:0:0:0: +36,192,88769,1,0,0:0:0:0: +329,192,88769,1,0,0:0:0:0: +475,192,88769,1,0,0:0:0:0: +329,192,88927,1,0,0:0:0:0: +182,192,89085,1,0,0:0:0:0: +36,192,89085,1,0,0:0:0:0: +256,192,89085,128,0,89637:0:0:0:0: +475,192,89085,1,0,0:0:0:0: +329,192,89243,1,0,0:0:0:0: +182,192,89401,1,0,0:0:0:0: +329,192,89558,1,0,0:0:0:0: +256,192,89716,128,0,90664:0:0:0:0: +36,192,89716,1,0,0:0:0:0: +329,192,89716,1,0,0:0:0:0: +475,192,89716,1,0,0:0:0:0: +182,192,89874,1,0,0:0:0:0: +329,192,90032,1,0,0:0:0:0: +182,192,90032,1,0,0:0:0:0: +36,192,90032,1,0,0:0:0:0: +475,192,90032,1,0,0:0:0:0: +182,192,90190,1,0,0:0:0:0: +402,192,90348,1,0,0:0:0:0: +329,192,90427,1,0,0:0:0:0: +182,192,90506,1,0,0:0:0:0: +109,192,90585,1,0,0:0:0:0: +182,192,90664,1,0,0:0:0:0: +36,192,90664,1,0,0:0:0:0: +329,192,90664,1,0,0:0:0:0: +475,192,90664,128,0,90822:0:0:0:0: +402,192,90664,1,0,0:0:0:0: +109,192,90743,1,0,0:0:0:0: +182,192,90822,1,0,0:0:0:0: +36,192,90822,1,0,0:0:0:0: +329,192,90822,128,0,90980:0:0:0:0: +256,192,90901,1,0,0:0:0:0: +182,192,90980,128,0,91137:0:0:0:0: +36,192,90980,1,0,0:0:0:0: +475,192,90980,1,0,0:0:0:0: +402,192,90980,1,0,0:0:0:0: +256,192,91058,1,0,0:0:0:0: +329,192,91137,128,0,91295:0:0:0:0: +109,192,91137,1,0,0:0:0:0: +36,192,91137,1,0,0:0:0:0: +182,192,91216,1,0,0:0:0:0: +36,192,91295,128,0,91927:0:0:0:0: +475,192,91295,128,0,91453:0:0:0:0: +109,192,91295,1,0,0:0:0:0: +256,192,91295,1,0,0:0:0:0: +402,192,91295,1,0,0:0:0:0: +182,192,91374,1,0,0:0:0:0: +256,192,91453,128,0,91611:0:0:0:0: +329,192,91453,1,0,0:0:0:0: +402,192,91453,1,0,0:0:0:0: +182,192,91532,1,0,0:0:0:0: +109,192,91611,1,0,0:0:0:0: +329,192,91611,1,0,0:0:0:0: +475,192,91611,1,0,0:0:0:0: +402,192,91611,128,0,91769:0:0:0:0: +256,192,91690,1,0,0:0:0:0: +182,192,91769,128,0,91927:0:0:0:0: +109,192,91769,1,0,0:0:0:0: +475,192,91769,1,0,0:0:0:0: +329,192,91848,1,0,0:0:0:0: +475,192,91927,128,0,92795:0:0:0:0: +256,192,91927,128,0,92045:0:0:0:0: +109,192,91927,1,0,0:0:0:0: +402,192,91927,1,0,0:0:0:0: +329,192,92006,128,0,92124:0:0:0:0: +402,192,92085,128,0,92203:0:0:0:0: +182,192,92085,128,0,92203:0:0:0:0: +36,192,92085,1,0,0:0:0:0: +256,192,92164,128,0,92282:0:0:0:0: +329,192,92243,128,0,92361:0:0:0:0: +109,192,92243,128,0,92361:0:0:0:0: +36,192,92243,1,0,0:0:0:0: +182,192,92322,128,0,92440:0:0:0:0: +36,192,92401,128,0,92480:0:0:0:0: +256,192,92401,128,0,92519:0:0:0:0: +402,192,92401,1,0,0:0:0:0: +109,192,92480,128,0,92558:0:0:0:0: +36,192,92558,128,0,92795:0:0:0:0: +402,192,92558,128,0,92795:0:0:0:0: +182,192,92558,128,0,92637:0:0:0:0: +329,192,92637,128,0,92795:0:0:0:0: +109,192,92637,128,0,92716:0:0:0:0: +256,192,92716,128,0,92795:0:0:0:0: +182,192,92795,1,0,0:0:0:0: +475,192,92874,1,0,0:0:0:0: +109,192,92874,1,0,0:0:0:0: +256,192,92874,1,0,0:0:0:0: +402,192,92927,1,0,0:0:0:0: +329,192,92980,1,0,0:0:0:0: +256,192,93032,1,0,0:0:0:0: +182,192,93085,1,0,0:0:0:0: +109,192,93137,1,0,0:0:0:0: +329,192,93190,128,0,93664:0:0:0:0: +36,192,93190,128,0,93269:0:0:0:0: +256,192,93190,1,0,0:0:0:0: +475,192,93190,1,0,0:0:0:0: +182,192,93269,128,0,93427:0:0:0:0: +402,192,93269,1,0,0:0:0:0: +36,192,93348,128,0,93585:0:0:0:0: +109,192,93348,1,0,0:0:0:0: +475,192,93348,1,0,0:0:0:0: +256,192,93427,128,0,93506:0:0:0:0: +402,192,93427,1,0,0:0:0:0: +109,192,93506,128,0,93585:0:0:0:0: +475,192,93506,1,0,0:0:0:0: +256,192,93585,128,0,93664:0:0:0:0: +182,192,93585,1,0,0:0:0:0: +402,192,93664,128,0,93980:0:0:0:0: +36,192,93664,128,0,93822:0:0:0:0: +475,192,93664,1,0,0:0:0:0: +182,192,93743,128,0,93822:0:0:0:0: +256,192,93743,1,0,0:0:0:0: +329,192,93822,128,0,93980:0:0:0:0: +475,192,93822,1,0,0:0:0:0: +109,192,93901,128,0,93980:0:0:0:0: +256,192,93901,1,0,0:0:0:0: +475,192,93980,128,0,94295:0:0:0:0: +36,192,93980,128,0,94216:0:0:0:0: +182,192,93980,1,0,0:0:0:0: +109,192,94058,128,0,94137:0:0:0:0: +256,192,94058,1,0,0:0:0:0: +182,192,94137,128,0,94295:0:0:0:0: +402,192,94137,1,0,0:0:0:0: +329,192,94137,1,0,0:0:0:0: +256,192,94216,128,0,94295:0:0:0:0: +402,192,94295,128,0,94769:0:0:0:0: +36,192,94295,128,0,94374:0:0:0:0: +329,192,94295,1,0,0:0:0:0: +182,192,94374,128,0,94453:0:0:0:0: +256,192,94374,1,0,0:0:0:0: +475,192,94453,1,0,0:0:0:0: +109,192,94453,1,0,0:0:0:0: +36,192,94453,128,0,94690:0:0:0:0: +329,192,94532,1,0,0:0:0:0: +182,192,94532,128,0,94690:0:0:0:0: +256,192,94611,1,0,0:0:0:0: +475,192,94611,128,0,94690:0:0:0:0: +109,192,94611,1,0,0:0:0:0: +329,192,94690,128,0,94769:0:0:0:0: +36,192,94769,128,0,95085:0:0:0:0: +182,192,94769,128,0,94927:0:0:0:0: +256,192,94769,128,0,94848:0:0:0:0: +475,192,94769,1,0,0:0:0:0: +402,192,94848,128,0,94927:0:0:0:0: +109,192,94927,128,0,95006:0:0:0:0: +329,192,94927,128,0,95006:0:0:0:0: +256,192,94927,1,0,0:0:0:0: +402,192,95006,128,0,95085:0:0:0:0: +475,192,95085,128,0,95243:0:0:0:0: +256,192,95085,128,0,95164:0:0:0:0: +109,192,95085,1,0,0:0:0:0: +182,192,95085,1,0,0:0:0:0: +329,192,95164,128,0,95243:0:0:0:0: +402,192,95164,1,0,0:0:0:0: +36,192,95243,128,0,95558:0:0:0:0: +109,192,95243,128,0,95322:0:0:0:0: +182,192,95243,1,0,0:0:0:0: +402,192,95322,128,0,95401:0:0:0:0: +329,192,95401,128,0,95480:0:0:0:0: +256,192,95401,1,0,0:0:0:0: +475,192,95401,1,0,0:0:0:0: +109,192,95401,1,0,0:0:0:0: +402,192,95480,128,0,95558:0:0:0:0: +182,192,95480,1,0,0:0:0:0: +475,192,95558,128,0,96032:0:0:0:0: +256,192,95558,128,0,95637:0:0:0:0: +109,192,95558,1,0,0:0:0:0: +329,192,95637,128,0,95716:0:0:0:0: +182,192,95716,1,0,0:0:0:0: +109,192,95716,128,0,95795:0:0:0:0: +402,192,95716,1,0,0:0:0:0: +36,192,95716,128,0,95874:0:0:0:0: +256,192,95795,1,0,0:0:0:0: +182,192,95874,128,0,95953:0:0:0:0: +329,192,95874,1,0,0:0:0:0: +402,192,95874,1,0,0:0:0:0: +109,192,95953,128,0,96032:0:0:0:0: +256,192,95953,1,0,0:0:0:0: +329,192,96032,128,0,96190:0:0:0:0: +36,192,96032,1,0,0:0:0:0: +182,192,96032,1,0,0:0:0:0: +402,192,96111,128,0,96269:0:0:0:0: +256,192,96111,1,0,0:0:0:0: +475,192,96190,128,0,96506:0:0:0:0: +36,192,96190,128,0,96269:0:0:0:0: +182,192,96190,1,0,0:0:0:0: +109,192,96269,128,0,96348:0:0:0:0: +329,192,96269,1,0,0:0:0:0: +256,192,96348,128,0,96506:0:0:0:0: +402,192,96348,1,0,0:0:0:0: +36,192,96348,1,0,0:0:0:0: +182,192,96427,128,0,96506:0:0:0:0: +329,192,96506,128,0,96822:0:0:0:0: +36,192,96506,128,0,96664:0:0:0:0: +109,192,96506,128,0,96585:0:0:0:0: +402,192,96506,1,0,0:0:0:0: +256,192,96585,1,0,0:0:0:0: +182,192,96664,128,0,96822:0:0:0:0: +402,192,96664,1,0,0:0:0:0: +475,192,96664,1,0,0:0:0:0: +109,192,96743,128,0,96822:0:0:0:0: +256,192,96743,1,0,0:0:0:0: +475,192,96822,128,0,97295:0:0:0:0: +36,192,96822,128,0,96901:0:0:0:0: +402,192,96822,1,0,0:0:0:0: +256,192,96901,128,0,96980:0:0:0:0: +182,192,96901,1,0,0:0:0:0: +36,192,96980,128,0,97137:0:0:0:0: +109,192,96980,1,0,0:0:0:0: +402,192,96980,1,0,0:0:0:0: +329,192,97058,128,0,97137:0:0:0:0: +256,192,97058,1,0,0:0:0:0: +402,192,97137,1,0,0:0:0:0: +182,192,97137,128,0,97216:0:0:0:0: +36,192,97216,128,0,97295:0:0:0:0: +329,192,97216,1,0,0:0:0:0: +256,192,97295,128,0,97374:0:0:0:0: +182,192,97295,1,0,0:0:0:0: +402,192,97295,128,0,97611:0:0:0:0: +109,192,97374,128,0,97453:0:0:0:0: +329,192,97374,1,0,0:0:0:0: +256,192,97453,128,0,97532:0:0:0:0: +36,192,97453,1,0,0:0:0:0: +182,192,97532,128,0,97611:0:0:0:0: +36,192,97611,128,0,97769:0:0:0:0: +329,192,97611,128,0,97690:0:0:0:0: +475,192,97611,128,0,97769:0:0:0:0: +109,192,97611,1,0,0:0:0:0: +182,192,97690,1,0,0:0:0:0: +109,192,97769,128,0,97927:0:0:0:0: +329,192,97769,1,0,0:0:0:0: +256,192,97769,128,0,97927:0:0:0:0: +402,192,97848,128,0,97927:0:0:0:0: +475,192,97927,128,0,98006:0:0:0:0: +182,192,97927,1,0,0:0:0:0: +36,192,97927,128,0,98006:0:0:0:0: +329,192,98006,128,0,98085:0:0:0:0: +109,192,98006,128,0,98085:0:0:0:0: +256,192,98085,128,0,98164:0:0:0:0: +36,192,98085,128,0,98243:0:0:0:0: +182,192,98085,128,0,98243:0:0:0:0: +475,192,98085,1,0,0:0:0:0: +402,192,98164,128,0,98243:0:0:0:0: +109,192,98243,128,0,98558:0:0:0:0: +475,192,98243,128,0,98480:0:0:0:0: +256,192,98243,1,0,0:0:0:0: +329,192,98322,128,0,98401:0:0:0:0: +182,192,98322,1,0,0:0:0:0: +402,192,98401,128,0,98558:0:0:0:0: +36,192,98401,1,0,0:0:0:0: +256,192,98480,128,0,98558:0:0:0:0: +329,192,98480,1,0,0:0:0:0: +182,192,98558,128,0,98716:0:0:0:0: +475,192,98558,128,0,98874:0:0:0:0: +36,192,98558,128,0,98637:0:0:0:0: +329,192,98637,128,0,98716:0:0:0:0: +109,192,98716,128,0,98795:0:0:0:0: +256,192,98716,1,0,0:0:0:0: +402,192,98716,1,0,0:0:0:0: +36,192,98795,128,0,98874:0:0:0:0: +329,192,98795,1,0,0:0:0:0: +402,192,98874,128,0,99190:0:0:0:0: +256,192,98874,128,0,99111:0:0:0:0: +182,192,98874,128,0,98953:0:0:0:0: +109,192,98874,1,0,0:0:0:0: +329,192,98953,1,0,0:0:0:0: +36,192,99032,128,0,99190:0:0:0:0: +109,192,99032,1,0,0:0:0:0: +475,192,99032,1,0,0:0:0:0: +182,192,99111,128,0,99190:0:0:0:0: +329,192,99190,128,0,99348:0:0:0:0: +109,192,99190,128,0,99269:0:0:0:0: +256,192,99190,1,0,0:0:0:0: +475,192,99269,128,0,99348:0:0:0:0: +402,192,99269,1,0,0:0:0:0: +36,192,99348,128,0,99506:0:0:0:0: +182,192,99348,128,0,99427:0:0:0:0: +109,192,99348,1,0,0:0:0:0: +329,192,99427,128,0,99506:0:0:0:0: +256,192,99427,1,0,0:0:0:0: +402,192,99506,128,0,99980:0:0:0:0: +182,192,99506,128,0,99585:0:0:0:0: +109,192,99506,1,0,0:0:0:0: +475,192,99506,1,0,0:0:0:0: +329,192,99585,1,0,0:0:0:0: +256,192,99664,128,0,99980:0:0:0:0: +109,192,99664,128,0,99743:0:0:0:0: +36,192,99664,1,0,0:0:0:0: +475,192,99664,1,0,0:0:0:0: +182,192,99743,1,0,0:0:0:0: +36,192,99822,128,0,99901:0:0:0:0: +475,192,99822,1,0,0:0:0:0: +329,192,99822,1,0,0:0:0:0: +182,192,99901,1,0,0:0:0:0: +109,192,99980,128,0,100453:0:0:0:0: +475,192,99980,128,0,100058:0:0:0:0: +36,192,99980,1,0,0:0:0:0: +329,192,99980,1,0,0:0:0:0: +182,192,100058,1,0,0:0:0:0: +329,192,100137,128,0,100216:0:0:0:0: +256,192,100137,1,0,0:0:0:0: +475,192,100137,1,0,0:0:0:0: +36,192,100137,1,0,0:0:0:0: +182,192,100216,1,0,0:0:0:0: +475,192,100295,128,0,100374:0:0:0:0: +402,192,100295,1,0,0:0:0:0: +256,192,100295,1,0,0:0:0:0: +182,192,100374,1,0,0:0:0:0: +256,192,100453,128,0,100611:0:0:0:0: +36,192,100453,1,0,0:0:0:0: +475,192,100453,1,0,0:0:0:0: +402,192,100453,1,0,0:0:0:0: +329,192,100532,128,0,100690:0:0:0:0: +109,192,100532,1,0,0:0:0:0: +36,192,100611,128,0,100690:0:0:0:0: +402,192,100611,128,0,100769:0:0:0:0: +182,192,100611,1,0,0:0:0:0: +475,192,100611,1,0,0:0:0:0: +256,192,100690,1,0,0:0:0:0: +109,192,100769,128,0,101006:0:0:0:0: +329,192,100769,128,0,100848:0:0:0:0: +475,192,100769,128,0,100848:0:0:0:0: +182,192,100769,128,0,100848:0:0:0:0: +36,192,100769,128,0,100848:0:0:0:0: +182,192,100927,128,0,101006:0:0:0:0: +36,192,100927,128,0,101006:0:0:0:0: +329,192,100927,128,0,101006:0:0:0:0: +475,192,100927,128,0,101006:0:0:0:0: +402,192,100927,128,0,101006:0:0:0:0: +329,192,101085,128,0,101243:0:0:0:0: +36,192,101085,128,0,101164:0:0:0:0: +475,192,101085,128,0,101164:0:0:0:0: +256,192,101164,128,0,101401:0:0:0:0: +109,192,101164,128,0,101243:0:0:0:0: +402,192,101164,128,0,101243:0:0:0:0: +182,192,101243,128,0,101322:0:0:0:0: +36,192,101243,128,0,101322:0:0:0:0: +475,192,101243,128,0,101322:0:0:0:0: +329,192,101322,128,0,101480:0:0:0:0: +109,192,101322,128,0,101401:0:0:0:0: +475,192,101401,128,0,101480:0:0:0:0: +36,192,101401,128,0,101480:0:0:0:0: +182,192,101401,128,0,101480:0:0:0:0: +402,192,101401,128,0,101637:0:0:0:0: +36,192,101558,128,0,101637:0:0:0:0: +182,192,101558,128,0,101637:0:0:0:0: +329,192,101558,128,0,101637:0:0:0:0: +475,192,101558,128,0,101637:0:0:0:0: +109,192,101558,128,0,101637:0:0:0:0: +182,192,101716,128,0,101874:0:0:0:0: +36,192,101716,128,0,101953:0:0:0:0: +475,192,101716,128,0,101953:0:0:0:0: +329,192,101716,128,0,101795:0:0:0:0: +256,192,101795,128,0,102032:0:0:0:0: +329,192,101874,128,0,102032:0:0:0:0: +182,192,101953,128,0,102032:0:0:0:0: +109,192,102032,128,0,102190:0:0:0:0: +475,192,102032,128,0,102190:0:0:0:0: +36,192,102032,1,0,0:0:0:0: +402,192,102032,1,0,0:0:0:0: +329,192,102111,128,0,102348:0:0:0:0: +182,192,102190,128,0,102348:0:0:0:0: +36,192,102190,128,0,102348:0:0:0:0: +402,192,102269,128,0,102506:0:0:0:0: +475,192,102269,1,0,0:0:0:0: +109,192,102348,128,0,102506:0:0:0:0: +256,192,102348,128,0,102506:0:0:0:0: +182,192,102427,1,0,0:0:0:0: +36,192,102506,128,0,102901:0:0:0:0: +475,192,102506,128,0,102901:0:0:0:0: +329,192,102506,128,0,102585:0:0:0:0: +256,192,102585,128,0,102664:0:0:0:0: +182,192,102664,128,0,102743:0:0:0:0: +402,192,102664,1,0,0:0:0:0: +109,192,102743,128,0,102822:0:0:0:0: +329,192,102743,1,0,0:0:0:0: +402,192,102822,128,0,102980:0:0:0:0: +256,192,102822,1,0,0:0:0:0: +329,192,102901,128,0,103058:0:0:0:0: +182,192,102901,1,0,0:0:0:0: +256,192,102980,128,0,103137:0:0:0:0: +109,192,102980,1,0,0:0:0:0: +36,192,103058,1,0,0:0:0:0: +182,192,103058,128,0,103216:0:0:0:0: +475,192,103137,1,0,0:0:0:0: +109,192,103137,128,0,103295:0:0:0:0: +329,192,103216,128,0,103295:0:0:0:0: +256,192,103295,1,0,0:0:0:0: +475,192,103295,128,0,103769:0:0:0:0: +182,192,103295,1,0,0:0:0:0: +36,192,103295,128,0,103374:0:0:0:0: +402,192,103374,128,0,103532:0:0:0:0: +329,192,103374,1,0,0:0:0:0: +182,192,103453,128,0,103611:0:0:0:0: +36,192,103453,1,0,0:0:0:0: +109,192,103453,1,0,0:0:0:0: +329,192,103532,128,0,103769:0:0:0:0: +256,192,103532,1,0,0:0:0:0: +109,192,103611,128,0,103769:0:0:0:0: +36,192,103611,1,0,0:0:0:0: +402,192,103611,1,0,0:0:0:0: +182,192,103690,128,0,103769:0:0:0:0: +36,192,103769,128,0,104085:0:0:0:0: +256,192,103769,128,0,103848:0:0:0:0: +402,192,103769,1,0,0:0:0:0: +182,192,103848,128,0,104006:0:0:0:0: +329,192,103848,1,0,0:0:0:0: +402,192,103927,1,0,0:0:0:0: +256,192,103927,1,0,0:0:0:0: +475,192,103927,128,0,104085:0:0:0:0: +329,192,104006,128,0,104085:0:0:0:0: +109,192,104006,128,0,104085:0:0:0:0: +402,192,104085,128,0,104401:0:0:0:0: +182,192,104085,128,0,104164:0:0:0:0: +256,192,104164,128,0,104243:0:0:0:0: +109,192,104164,1,0,0:0:0:0: +36,192,104243,128,0,104322:0:0:0:0: +475,192,104243,1,0,0:0:0:0: +329,192,104243,1,0,0:0:0:0: +109,192,104322,128,0,104401:0:0:0:0: +256,192,104322,1,0,0:0:0:0: +182,192,104401,128,0,104874:0:0:0:0: +329,192,104401,128,0,104480:0:0:0:0: +475,192,104401,128,0,104558:0:0:0:0: +36,192,104401,128,0,104716:0:0:0:0: +256,192,104480,128,0,104558:0:0:0:0: +402,192,104558,128,0,104637:0:0:0:0: +109,192,104558,1,0,0:0:0:0: +329,192,104637,128,0,104716:0:0:0:0: +256,192,104637,1,0,0:0:0:0: +475,192,104716,128,0,104874:0:0:0:0: +109,192,104716,1,0,0:0:0:0: +402,192,104716,1,0,0:0:0:0: +256,192,104795,128,0,104874:0:0:0:0: +36,192,104874,128,0,105190:0:0:0:0: +402,192,104874,128,0,105111:0:0:0:0: +109,192,104874,128,0,104953:0:0:0:0: +329,192,104874,1,0,0:0:0:0: +256,192,104953,128,0,105032:0:0:0:0: +182,192,104953,1,0,0:0:0:0: +109,192,105032,128,0,105111:0:0:0:0: +329,192,105032,1,0,0:0:0:0: +475,192,105032,1,0,0:0:0:0: +182,192,105111,128,0,105190:0:0:0:0: +256,192,105111,1,0,0:0:0:0: +329,192,105190,128,0,105269:0:0:0:0: +475,192,105190,128,0,105427:0:0:0:0: +109,192,105190,1,0,0:0:0:0: +402,192,105269,128,0,105348:0:0:0:0: +256,192,105269,1,0,0:0:0:0: +182,192,105348,128,0,105427:0:0:0:0: +36,192,105348,128,0,105585:0:0:0:0: +329,192,105348,1,0,0:0:0:0: +109,192,105427,128,0,105506:0:0:0:0: +256,192,105427,1,0,0:0:0:0: +475,192,105506,128,0,105664:0:0:0:0: +329,192,105506,1,0,0:0:0:0: +402,192,105585,128,0,105743:0:0:0:0: +182,192,105585,1,0,0:0:0:0: +36,192,105664,128,0,106137:0:0:0:0: +329,192,105664,128,0,105822:0:0:0:0: +109,192,105664,1,0,0:0:0:0: +182,192,105743,128,0,105822:0:0:0:0: +256,192,105743,1,0,0:0:0:0: +475,192,105822,128,0,106058:0:0:0:0: +402,192,105822,1,0,0:0:0:0: +109,192,105822,1,0,0:0:0:0: +256,192,105901,128,0,105980:0:0:0:0: +182,192,105901,1,0,0:0:0:0: +402,192,105980,128,0,106137:0:0:0:0: +109,192,105980,1,0,0:0:0:0: +329,192,106058,128,0,106137:0:0:0:0: +256,192,106058,1,0,0:0:0:0: +109,192,106137,128,0,106216:0:0:0:0: +475,192,106137,1,0,0:0:0:0: +182,192,106137,1,0,0:0:0:0: +402,192,106216,128,0,106295:0:0:0:0: +256,192,106216,1,0,0:0:0:0: +109,192,106295,128,0,106611:0:0:0:0: +329,192,106295,128,0,106374:0:0:0:0: +36,192,106295,1,0,0:0:0:0: +182,192,106295,1,0,0:0:0:0: +475,192,106374,128,0,106453:0:0:0:0: +256,192,106374,1,0,0:0:0:0: +402,192,106453,128,0,106532:0:0:0:0: +36,192,106453,1,0,0:0:0:0: +329,192,106453,1,0,0:0:0:0: +182,192,106532,128,0,106611:0:0:0:0: +402,192,106611,128,0,106927:0:0:0:0: +256,192,106611,128,0,106690:0:0:0:0: +36,192,106611,1,0,0:0:0:0: +475,192,106611,1,0,0:0:0:0: +329,192,106690,128,0,106769:0:0:0:0: +182,192,106690,1,0,0:0:0:0: +109,192,106769,128,0,106848:0:0:0:0: +36,192,106769,1,0,0:0:0:0: +475,192,106769,1,0,0:0:0:0: +256,192,106848,128,0,106927:0:0:0:0: +182,192,106848,1,0,0:0:0:0: +475,192,106927,128,0,107243:0:0:0:0: +36,192,106927,128,0,107085:0:0:0:0: +329,192,106927,1,0,0:0:0:0: +109,192,106927,1,0,0:0:0:0: +182,192,107006,128,0,107085:0:0:0:0: +256,192,107006,1,0,0:0:0:0: +329,192,107085,128,0,107243:0:0:0:0: +109,192,107085,128,0,107164:0:0:0:0: +402,192,107085,1,0,0:0:0:0: +182,192,107164,128,0,107243:0:0:0:0: +256,192,107164,1,0,0:0:0:0: +36,192,107243,128,0,107401:0:0:0:0: +402,192,107243,1,0,0:0:0:0: +109,192,107322,128,0,107401:0:0:0:0: +182,192,107322,1,0,0:0:0:0: +402,192,107401,128,0,107716:0:0:0:0: +256,192,107401,128,0,107480:0:0:0:0: +475,192,107401,128,0,107480:0:0:0:0: +329,192,107401,1,0,0:0:0:0: +182,192,107480,128,0,107558:0:0:0:0: +109,192,107480,1,0,0:0:0:0: +329,192,107558,128,0,107716:0:0:0:0: +36,192,107558,128,0,107716:0:0:0:0: +109,192,107637,128,0,107716:0:0:0:0: +256,192,107637,1,0,0:0:0:0: +182,192,107716,128,0,107795:0:0:0:0: +475,192,107716,128,0,107953:0:0:0:0: +329,192,107795,128,0,107874:0:0:0:0: +36,192,107874,128,0,108190:0:0:0:0: +256,192,107874,1,0,0:0:0:0: +109,192,107874,1,0,0:0:0:0: +182,192,107874,128,0,107953:0:0:0:0: +329,192,107953,128,0,108032:0:0:0:0: +475,192,108032,128,0,108190:0:0:0:0: +402,192,108032,1,0,0:0:0:0: +256,192,108032,1,0,0:0:0:0: +182,192,108032,128,0,108190:0:0:0:0: +109,192,108190,128,0,108348:0:0:0:0: +256,192,108190,128,0,108348:0:0:0:0: +402,192,108190,1,0,0:0:0:0: +329,192,108190,1,0,0:0:0:0: +182,192,108348,128,0,108664:0:0:0:0: +402,192,108348,128,0,108427:0:0:0:0: +36,192,108348,1,0,0:0:0:0: +475,192,108348,1,0,0:0:0:0: +329,192,108348,1,0,0:0:0:0: +256,192,108427,128,0,108506:0:0:0:0: +109,192,108427,1,0,0:0:0:0: +475,192,108506,128,0,108664:0:0:0:0: +36,192,108506,1,0,0:0:0:0: +402,192,108506,1,0,0:0:0:0: +329,192,108585,128,0,108664:0:0:0:0: +109,192,108585,1,0,0:0:0:0: +256,192,108664,128,0,108980:0:0:0:0: +36,192,108664,128,0,108743:0:0:0:0: +402,192,108664,1,0,0:0:0:0: +182,192,108743,128,0,108822:0:0:0:0: +329,192,108743,1,0,0:0:0:0: +36,192,108822,128,0,108980:0:0:0:0: +402,192,108822,128,0,108901:0:0:0:0: +475,192,108822,128,0,108901:0:0:0:0: +109,192,108901,128,0,108980:0:0:0:0: +182,192,108901,1,0,0:0:0:0: +402,192,108980,128,0,109216:0:0:0:0: +329,192,108980,128,0,109058:0:0:0:0: +475,192,108980,1,0,0:0:0:0: +182,192,109058,128,0,109137:0:0:0:0: +109,192,109058,1,0,0:0:0:0: +256,192,109137,128,0,109216:0:0:0:0: +36,192,109137,1,0,0:0:0:0: +475,192,109137,1,0,0:0:0:0: +109,192,109216,128,0,109295:0:0:0:0: +256,192,109295,128,0,109532:0:0:0:0: +475,192,109295,128,0,109374:0:0:0:0: +36,192,109295,128,0,109374:0:0:0:0: +182,192,109295,1,0,0:0:0:0: +329,192,109295,1,0,0:0:0:0: +109,192,109374,128,0,109453:0:0:0:0: +402,192,109374,128,0,109453:0:0:0:0: +182,192,109453,128,0,109532:0:0:0:0: +329,192,109453,128,0,109532:0:0:0:0: +36,192,109532,128,0,109611:0:0:0:0: +475,192,109532,128,0,109611:0:0:0:0: +329,192,109611,128,0,109769:0:0:0:0: +182,192,109611,128,0,109769:0:0:0:0: +109,192,109611,128,0,109690:0:0:0:0: +256,192,109611,1,0,0:0:0:0: +402,192,109611,1,0,0:0:0:0: +36,192,109690,128,0,109769:0:0:0:0: +256,192,109769,128,0,110085:0:0:0:0: +402,192,109769,128,0,110085:0:0:0:0: +109,192,109769,128,0,109848:0:0:0:0: +475,192,109769,1,0,0:0:0:0: +182,192,109848,128,0,109927:0:0:0:0: +36,192,109927,128,0,110085:0:0:0:0: +329,192,109927,1,0,0:0:0:0: +475,192,109927,1,0,0:0:0:0: +109,192,110006,128,0,110085:0:0:0:0: +475,192,110085,128,0,110401:0:0:0:0: +329,192,110085,128,0,110401:0:0:0:0: +182,192,110085,128,0,110243:0:0:0:0: +109,192,110164,128,0,110322:0:0:0:0: +36,192,110243,128,0,110401:0:0:0:0: +402,192,110243,1,0,0:0:0:0: +256,192,110322,128,0,110401:0:0:0:0: +182,192,110401,128,0,110480:0:0:0:0: +109,192,110480,128,0,110558:0:0:0:0: +475,192,110480,128,0,110558:0:0:0:0: +329,192,110480,128,0,110558:0:0:0:0: +36,192,110558,128,0,110874:0:0:0:0: +182,192,110558,128,0,110874:0:0:0:0: +402,192,110558,128,0,110637:0:0:0:0: +256,192,110558,128,0,110637:0:0:0:0: +329,192,110637,128,0,110716:0:0:0:0: +475,192,110716,128,0,110795:0:0:0:0: +402,192,110716,128,0,110795:0:0:0:0: +109,192,110716,128,0,110795:0:0:0:0: +256,192,110795,128,0,110874:0:0:0:0: +475,192,110874,128,0,111506:0:0:0:0: +109,192,110874,128,0,111032:0:0:0:0: +329,192,110874,1,0,0:0:0:0: +402,192,110874,128,0,110953:0:0:0:0: +182,192,110953,128,0,111111:0:0:0:0: +256,192,111032,128,0,111190:0:0:0:0: +402,192,111032,1,0,0:0:0:0: +36,192,111111,128,0,111506:0:0:0:0: +329,192,111111,128,0,111269:0:0:0:0: +109,192,111190,128,0,111427:0:0:0:0: +402,192,111190,128,0,111348:0:0:0:0: +182,192,111269,128,0,111348:0:0:0:0: +329,192,111348,128,0,111427:0:0:0:0: +256,192,111427,128,0,111506:0:0:0:0: +182,192,111506,128,0,111585:0:0:0:0: +402,192,111506,128,0,111585:0:0:0:0: +109,192,111585,128,0,111664:0:0:0:0: +329,192,111585,128,0,111743:0:0:0:0: +36,192,111664,128,0,111743:0:0:0:0: +256,192,111664,128,0,111822:0:0:0:0: +475,192,111664,128,0,111743:0:0:0:0: +182,192,111743,128,0,111901:0:0:0:0: +36,192,111822,128,0,112137:0:0:0:0: +109,192,111822,128,0,111980:0:0:0:0: +402,192,111822,128,0,111901:0:0:0:0: +475,192,111822,1,0,0:0:0:0: +329,192,111901,128,0,111980:0:0:0:0: +256,192,111980,128,0,112058:0:0:0:0: +475,192,111980,1,0,0:0:0:0: +182,192,112058,128,0,112137:0:0:0:0: +402,192,112058,1,0,0:0:0:0: +475,192,112137,128,0,112453:0:0:0:0: +329,192,112137,128,0,112374:0:0:0:0: +109,192,112137,128,0,112216:0:0:0:0: +36,192,112216,1,0,0:0:0:0: +182,192,112216,128,0,112295:0:0:0:0: +256,192,112295,128,0,112453:0:0:0:0: +402,192,112295,1,0,0:0:0:0: +36,192,112374,1,0,0:0:0:0: +109,192,112374,128,0,112453:0:0:0:0: +402,192,112453,128,0,112769:0:0:0:0: +182,192,112453,128,0,112690:0:0:0:0: +329,192,112453,128,0,112532:0:0:0:0: +475,192,112532,1,0,0:0:0:0: +36,192,112532,128,0,112611:0:0:0:0: +109,192,112611,128,0,112769:0:0:0:0: +329,192,112611,1,0,0:0:0:0: +256,192,112690,128,0,112769:0:0:0:0: +475,192,112769,128,0,112848:0:0:0:0: +182,192,112769,128,0,113085:0:0:0:0: +36,192,112769,128,0,112848:0:0:0:0: +329,192,112769,1,0,0:0:0:0: +256,192,112848,1,0,0:0:0:0: +329,192,112927,128,0,113085:0:0:0:0: +36,192,112927,1,0,0:0:0:0: +109,192,112927,1,0,0:0:0:0: +475,192,112927,128,0,113006:0:0:0:0: +256,192,113006,128,0,113085:0:0:0:0: +109,192,113085,128,0,113401:0:0:0:0: +475,192,113085,128,0,113164:0:0:0:0: +36,192,113085,1,0,0:0:0:0: +402,192,113164,128,0,113243:0:0:0:0: +256,192,113164,1,0,0:0:0:0: +329,192,113243,128,0,113322:0:0:0:0: +182,192,113243,1,0,0:0:0:0: +36,192,113243,1,0,0:0:0:0: +256,192,113322,128,0,113401:0:0:0:0: +475,192,113401,128,0,114111:0:0:0:0: +36,192,113401,128,0,114111:0:0:0:0: +402,192,113401,1,0,0:0:0:0: +329,192,113401,1,0,0:0:0:0: +182,192,113401,1,0,0:0:0:0: +182,192,113558,1,0,0:0:0:0: +402,192,113558,1,0,0:0:0:0: +256,192,113558,1,0,0:0:0:0: +182,192,113874,1,0,0:0:0:0: +256,192,113874,1,0,0:0:0:0: +402,192,113874,1,0,0:0:0:0: +109,192,114032,1,0,0:0:0:0: +182,192,114032,1,0,0:0:0:0: +329,192,114032,1,0,0:0:0:0: +36,192,114190,1,0,0:0:0:0: +475,192,114190,1,0,0:0:0:0: +402,192,114190,1,0,0:0:0:0: +109,192,114190,1,0,0:0:0:0: +256,192,114190,1,0,0:0:0:0: +36,192,114348,128,0,114585:0:0:0:0: +475,192,114348,128,0,114585:0:0:0:0: +182,192,114348,1,0,0:0:0:0: +329,192,114348,1,0,0:0:0:0: +402,192,114348,1,0,0:0:0:0: +109,192,114506,1,0,0:0:0:0: +256,192,114506,1,0,0:0:0:0: +329,192,114506,1,0,0:0:0:0: +36,192,114664,128,0,115295:0:0:0:0: +475,192,114664,128,0,115295:0:0:0:0: +109,192,114822,1,0,0:0:0:0: +256,192,114822,1,0,0:0:0:0: +402,192,114822,1,0,0:0:0:0: +109,192,114980,1,0,0:0:0:0: +256,192,114980,1,0,0:0:0:0: +402,192,114980,1,0,0:0:0:0: +109,192,115295,1,0,0:0:0:0: +329,192,115295,1,0,0:0:0:0: +182,192,115295,1,0,0:0:0:0: +402,192,115374,1,0,0:0:0:0: +256,192,115374,1,0,0:0:0:0: +329,192,115453,1,0,0:0:0:0: +475,192,115453,1,0,0:0:0:0: +182,192,115532,1,0,0:0:0:0: +109,192,115532,1,0,0:0:0:0: +36,192,115532,1,0,0:0:0:0: +402,192,115611,1,0,0:0:0:0: +329,192,115611,1,0,0:0:0:0: +475,192,115611,1,0,0:0:0:0: +256,192,115690,1,0,0:0:0:0: +182,192,115769,1,0,0:0:0:0: +402,192,115769,1,0,0:0:0:0: +475,192,115769,1,0,0:0:0:0: +109,192,115848,1,0,0:0:0:0: +329,192,115848,1,0,0:0:0:0: +256,192,115927,1,0,0:0:0:0: +182,192,115927,1,0,0:0:0:0: +36,192,115927,1,0,0:0:0:0: +475,192,115927,128,0,116243:0:0:0:0: +329,192,116243,1,0,0:0:0:0: +36,192,116243,128,0,116480:0:0:0:0: +402,192,116243,1,0,0:0:0:0: +256,192,116243,1,0,0:0:0:0: +109,192,116282,128,0,116480:0:0:0:0: +182,192,116322,128,0,116480:0:0:0:0: +36,192,116558,128,0,116874:0:0:0:0: +475,192,116874,128,0,117111:0:0:0:0: +109,192,116874,1,0,0:0:0:0: +182,192,116874,1,0,0:0:0:0: +256,192,116874,1,0,0:0:0:0: +402,192,116914,128,0,117111:0:0:0:0: +329,192,116953,128,0,117111:0:0:0:0: +109,192,117190,128,0,117506:0:0:0:0: +402,192,117506,128,0,117743:0:0:0:0: +182,192,117506,1,0,0:0:0:0: +36,192,117506,1,0,0:0:0:0: +475,192,117506,1,0,0:0:0:0: +329,192,117545,128,0,117743:0:0:0:0: +256,192,117585,128,0,117743:0:0:0:0: +402,192,117822,128,0,118137:0:0:0:0: +109,192,117980,128,0,118295:0:0:0:0: +182,192,118019,128,0,118295:0:0:0:0: +256,192,118058,128,0,118295:0:0:0:0: +329,192,118295,128,0,118611:0:0:0:0: +475,192,118295,128,0,118611:0:0:0:0: +36,192,118295,1,0,0:0:0:0: +402,192,118295,1,0,0:0:0:0: +109,192,118611,128,0,118690:0:0:0:0: +36,192,118611,1,0,0:0:0:0: +256,192,118611,1,0,0:0:0:0: +402,192,118611,1,0,0:0:0:0: +182,192,118769,128,0,118848:0:0:0:0: +329,192,118769,1,0,0:0:0:0: +475,192,118769,1,0,0:0:0:0: +36,192,118769,1,0,0:0:0:0: +256,192,118927,128,0,119006:0:0:0:0: +109,192,118927,1,0,0:0:0:0: +402,192,118927,1,0,0:0:0:0: +475,192,118927,1,0,0:0:0:0: +36,192,119085,128,0,119164:0:0:0:0: +182,192,119085,128,0,119164:0:0:0:0: +329,192,119085,1,0,0:0:0:0: +475,192,119085,1,0,0:0:0:0: +109,192,119243,128,0,119322:0:0:0:0: +256,192,119243,128,0,119322:0:0:0:0: +402,192,119243,1,0,0:0:0:0: +475,192,119243,1,0,0:0:0:0: +182,192,119401,128,0,119480:0:0:0:0: +329,192,119401,128,0,119480:0:0:0:0: +36,192,119401,1,0,0:0:0:0: +475,192,119401,1,0,0:0:0:0: +109,192,119480,1,0,0:0:0:0: +256,192,119558,128,0,119637:0:0:0:0: +402,192,119558,128,0,119637:0:0:0:0: +182,192,119558,1,0,0:0:0:0: +36,192,119558,1,0,0:0:0:0: +475,192,119558,1,0,0:0:0:0: +109,192,119637,1,0,0:0:0:0: +329,192,119716,128,0,120032:0:0:0:0: +475,192,119716,128,0,120032:0:0:0:0: +182,192,119716,1,0,0:0:0:0: +36,192,119716,1,0,0:0:0:0: +402,192,119716,1,0,0:0:0:0: +256,192,119716,1,0,0:0:0:0: +109,192,120032,128,0,120348:0:0:0:0: +402,192,120348,128,0,120664:0:0:0:0: +109,192,120664,128,0,120980:0:0:0:0: +329,192,120980,128,0,121058:0:0:0:0: +36,192,120980,1,0,0:0:0:0: +109,192,121058,1,0,0:0:0:0: +475,192,121137,128,0,121216:0:0:0:0: +182,192,121137,1,0,0:0:0:0: +256,192,121216,1,0,0:0:0:0: +402,192,121295,128,0,121374:0:0:0:0: +182,192,121295,1,0,0:0:0:0: +329,192,121374,128,0,121453:0:0:0:0: +109,192,121374,1,0,0:0:0:0: +256,192,121453,128,0,121532:0:0:0:0: +36,192,121453,1,0,0:0:0:0: +109,192,121532,1,0,0:0:0:0: +475,192,121611,128,0,121690:0:0:0:0: +182,192,121611,1,0,0:0:0:0: +256,192,121690,1,0,0:0:0:0: +402,192,121769,128,0,121848:0:0:0:0: +182,192,121769,1,0,0:0:0:0: +329,192,121848,128,0,121927:0:0:0:0: +109,192,121848,1,0,0:0:0:0: +256,192,121927,128,0,122006:0:0:0:0: +36,192,121927,1,0,0:0:0:0: +475,192,122006,1,0,0:0:0:0: +109,192,122085,128,0,122164:0:0:0:0: +402,192,122085,1,0,0:0:0:0: +182,192,122164,128,0,122243:0:0:0:0: +329,192,122164,1,0,0:0:0:0: +256,192,122243,128,0,122322:0:0:0:0: +402,192,122243,1,0,0:0:0:0: +475,192,122322,1,0,0:0:0:0: +109,192,122401,128,0,122480:0:0:0:0: +329,192,122401,1,0,0:0:0:0: +182,192,122480,128,0,122558:0:0:0:0: +402,192,122480,1,0,0:0:0:0: +475,192,122558,1,0,0:0:0:0: +256,192,122558,1,0,0:0:0:0: +36,192,122637,128,0,122716:0:0:0:0: +402,192,122637,1,0,0:0:0:0: +329,192,122716,128,0,122795:0:0:0:0: +182,192,122716,1,0,0:0:0:0: +256,192,122795,128,0,122874:0:0:0:0: +109,192,122795,1,0,0:0:0:0: +182,192,122874,128,0,122953:0:0:0:0: +36,192,122874,1,0,0:0:0:0: +475,192,122874,1,0,0:0:0:0: +402,192,122953,1,0,0:0:0:0: +109,192,123032,128,0,123111:0:0:0:0: +329,192,123032,1,0,0:0:0:0: +182,192,123111,128,0,123190:0:0:0:0: +402,192,123111,1,0,0:0:0:0: +256,192,123190,128,0,123269:0:0:0:0: +475,192,123190,1,0,0:0:0:0: +182,192,123269,128,0,123348:0:0:0:0: +402,192,123269,1,0,0:0:0:0: +109,192,123348,128,0,123427:0:0:0:0: +329,192,123348,1,0,0:0:0:0: +36,192,123427,128,0,123506:0:0:0:0: +256,192,123427,1,0,0:0:0:0: +329,192,123506,128,0,123585:0:0:0:0: +182,192,123506,1,0,0:0:0:0: +475,192,123506,1,0,0:0:0:0: +109,192,123585,1,0,0:0:0:0: +475,192,123664,128,0,123743:0:0:0:0: +182,192,123664,1,0,0:0:0:0: +256,192,123743,1,0,0:0:0:0: +402,192,123822,128,0,123901:0:0:0:0: +182,192,123822,1,0,0:0:0:0: +329,192,123901,128,0,123980:0:0:0:0: +109,192,123901,1,0,0:0:0:0: +256,192,123980,128,0,124058:0:0:0:0: +36,192,123980,1,0,0:0:0:0: +109,192,124058,1,0,0:0:0:0: +475,192,124137,128,0,124216:0:0:0:0: +182,192,124137,1,0,0:0:0:0: +36,192,124137,1,0,0:0:0:0: +256,192,124216,1,0,0:0:0:0: +402,192,124295,128,0,124374:0:0:0:0: +109,192,124295,1,0,0:0:0:0: +36,192,124295,1,0,0:0:0:0: +329,192,124374,128,0,124453:0:0:0:0: +182,192,124374,1,0,0:0:0:0: +256,192,124453,128,0,124532:0:0:0:0: +36,192,124453,1,0,0:0:0:0: +475,192,124453,1,0,0:0:0:0: +402,192,124532,1,0,0:0:0:0: +109,192,124611,128,0,124690:0:0:0:0: +256,192,124611,1,0,0:0:0:0: +475,192,124611,1,0,0:0:0:0: +182,192,124690,128,0,124769:0:0:0:0: +329,192,124690,1,0,0:0:0:0: +256,192,124769,1,0,0:0:0:0: +36,192,124769,1,0,0:0:0:0: +475,192,124769,128,0,125085:0:0:0:0: +402,192,124769,1,0,0:0:0:0: +109,192,124848,1,0,0:0:0:0: +329,192,124848,1,0,0:0:0:0: +402,192,124927,1,0,0:0:0:0: +182,192,124927,1,0,0:0:0:0: +36,192,124927,1,0,0:0:0:0: +36,192,125085,128,0,125401:0:0:0:0: +402,192,125085,1,0,0:0:0:0: +109,192,125085,1,0,0:0:0:0: +256,192,125085,1,0,0:0:0:0: +329,192,125164,1,0,0:0:0:0: +182,192,125164,1,0,0:0:0:0: +256,192,125243,1,0,0:0:0:0: +402,192,125243,1,0,0:0:0:0: +109,192,125243,1,0,0:0:0:0: +475,192,125401,128,0,125716:0:0:0:0: +329,192,125401,1,0,0:0:0:0: +182,192,125401,1,0,0:0:0:0: +402,192,125401,1,0,0:0:0:0: +109,192,125480,1,0,0:0:0:0: +256,192,125480,1,0,0:0:0:0: +182,192,125558,1,0,0:0:0:0: +36,192,125558,1,0,0:0:0:0: +329,192,125558,1,0,0:0:0:0: +256,192,125716,128,0,125953:0:0:0:0: +109,192,125716,128,0,125953:0:0:0:0: +36,192,125716,128,0,125953:0:0:0:0: +402,192,125716,1,0,0:0:0:0: +329,192,125716,1,0,0:0:0:0: +329,192,126032,128,0,126111:0:0:0:0: +36,192,126032,128,0,126348:0:0:0:0: +475,192,126032,1,0,0:0:0:0: +182,192,126032,1,0,0:0:0:0: +109,192,126032,1,0,0:0:0:0: +256,192,126111,1,0,0:0:0:0: +475,192,126190,128,0,126269:0:0:0:0: +182,192,126190,1,0,0:0:0:0: +402,192,126190,1,0,0:0:0:0: +329,192,126269,1,0,0:0:0:0: +182,192,126348,128,0,126427:0:0:0:0: +475,192,126348,128,0,126664:0:0:0:0: +256,192,126348,1,0,0:0:0:0: +109,192,126348,1,0,0:0:0:0: +402,192,126348,1,0,0:0:0:0: +329,192,126427,128,0,126506:0:0:0:0: +36,192,126427,1,0,0:0:0:0: +256,192,126506,128,0,126585:0:0:0:0: +402,192,126506,1,0,0:0:0:0: +182,192,126506,1,0,0:0:0:0: +109,192,126585,1,0,0:0:0:0: +182,192,126664,128,0,126743:0:0:0:0: +36,192,126664,128,0,126980:0:0:0:0: +256,192,126664,1,0,0:0:0:0: +402,192,126664,1,0,0:0:0:0: +329,192,126743,1,0,0:0:0:0: +402,192,126822,128,0,126901:0:0:0:0: +256,192,126822,1,0,0:0:0:0: +109,192,126822,1,0,0:0:0:0: +329,192,126901,128,0,126980:0:0:0:0: +182,192,126901,1,0,0:0:0:0: +256,192,126980,128,0,127058:0:0:0:0: +475,192,126980,128,0,127295:0:0:0:0: +109,192,126980,1,0,0:0:0:0: +402,192,126980,1,0,0:0:0:0: +182,192,127058,1,0,0:0:0:0: +109,192,127137,128,0,127216:0:0:0:0: +256,192,127137,1,0,0:0:0:0: +36,192,127137,1,0,0:0:0:0: +182,192,127216,128,0,127295:0:0:0:0: +329,192,127216,1,0,0:0:0:0: +256,192,127295,128,0,127374:0:0:0:0: +36,192,127295,128,0,127611:0:0:0:0: +402,192,127295,1,0,0:0:0:0: +109,192,127295,1,0,0:0:0:0: +329,192,127374,1,0,0:0:0:0: +109,192,127453,128,0,127532:0:0:0:0: +256,192,127453,1,0,0:0:0:0: +475,192,127453,1,0,0:0:0:0: +182,192,127532,128,0,127611:0:0:0:0: +402,192,127532,1,0,0:0:0:0: +256,192,127611,128,0,127690:0:0:0:0: +475,192,127611,128,0,127927:0:0:0:0: +329,192,127611,1,0,0:0:0:0: +109,192,127611,1,0,0:0:0:0: +36,192,127690,128,0,127769:0:0:0:0: +182,192,127690,1,0,0:0:0:0: +329,192,127769,128,0,127927:0:0:0:0: +109,192,127769,1,0,0:0:0:0: +402,192,127769,1,0,0:0:0:0: +256,192,127848,128,0,127927:0:0:0:0: +182,192,127927,128,0,128006:0:0:0:0: +36,192,127927,128,0,128243:0:0:0:0: +402,192,127927,1,0,0:0:0:0: +109,192,127927,1,0,0:0:0:0: +329,192,128006,1,0,0:0:0:0: +109,192,128085,128,0,128164:0:0:0:0: +256,192,128085,1,0,0:0:0:0: +475,192,128085,1,0,0:0:0:0: +182,192,128164,128,0,128243:0:0:0:0: +402,192,128164,1,0,0:0:0:0: +329,192,128243,128,0,128401:0:0:0:0: +475,192,128243,128,0,128558:0:0:0:0: +109,192,128243,1,0,0:0:0:0: +256,192,128322,128,0,128480:0:0:0:0: +402,192,128322,1,0,0:0:0:0: +36,192,128401,1,0,0:0:0:0: +182,192,128401,128,0,128558:0:0:0:0: +329,192,128480,128,0,128558:0:0:0:0: +109,192,128558,1,0,0:0:0:0: +402,192,128558,1,0,0:0:0:0: +256,192,128558,128,0,128637:0:0:0:0: +36,192,128558,128,0,128874:0:0:0:0: +329,192,128637,1,0,0:0:0:0: +402,192,128716,128,0,128795:0:0:0:0: +475,192,128716,1,0,0:0:0:0: +182,192,128716,1,0,0:0:0:0: +329,192,128795,1,0,0:0:0:0: +182,192,128874,128,0,128953:0:0:0:0: +475,192,128874,128,0,129190:0:0:0:0: +109,192,128874,1,0,0:0:0:0: +402,192,128874,1,0,0:0:0:0: +256,192,128874,1,0,0:0:0:0: +329,192,128953,128,0,129032:0:0:0:0: +36,192,128953,1,0,0:0:0:0: +256,192,129032,128,0,129111:0:0:0:0: +109,192,129032,1,0,0:0:0:0: +402,192,129032,1,0,0:0:0:0: +329,192,129111,1,0,0:0:0:0: +182,192,129190,128,0,129269:0:0:0:0: +36,192,129190,128,0,129506:0:0:0:0: +256,192,129190,1,0,0:0:0:0: +402,192,129190,1,0,0:0:0:0: +109,192,129190,1,0,0:0:0:0: +329,192,129269,1,0,0:0:0:0: +402,192,129348,128,0,129427:0:0:0:0: +256,192,129348,1,0,0:0:0:0: +109,192,129348,1,0,0:0:0:0: +329,192,129427,128,0,129506:0:0:0:0: +182,192,129427,1,0,0:0:0:0: +256,192,129506,128,0,129585:0:0:0:0: +475,192,129506,128,0,129822:0:0:0:0: +109,192,129506,1,0,0:0:0:0: +402,192,129506,1,0,0:0:0:0: +182,192,129585,1,0,0:0:0:0: +109,192,129664,128,0,129743:0:0:0:0: +256,192,129664,1,0,0:0:0:0: +36,192,129664,1,0,0:0:0:0: +402,192,129664,1,0,0:0:0:0: +182,192,129743,128,0,129822:0:0:0:0: +329,192,129743,1,0,0:0:0:0: +36,192,129822,128,0,129980:0:0:0:0: +256,192,129822,1,0,0:0:0:0: +402,192,129822,1,0,0:0:0:0: +329,192,129901,1,0,0:0:0:0: +475,192,129980,128,0,130058:0:0:0:0: +402,192,129980,1,0,0:0:0:0: +182,192,129980,1,0,0:0:0:0: +256,192,130058,1,0,0:0:0:0: +329,192,130137,128,0,130216:0:0:0:0: +109,192,130137,1,0,0:0:0:0: +36,192,130137,1,0,0:0:0:0: +475,192,130137,1,0,0:0:0:0: +402,192,130216,128,0,130374:0:0:0:0: +182,192,130216,1,0,0:0:0:0: +256,192,130295,128,0,130374:0:0:0:0: +36,192,130295,1,0,0:0:0:0: +475,192,130295,1,0,0:0:0:0: +182,192,130374,128,0,130453:0:0:0:0: +109,192,130374,1,0,0:0:0:0: +329,192,130453,128,0,130611:0:0:0:0: +475,192,130453,1,0,0:0:0:0: +36,192,130453,1,0,0:0:0:0: +402,192,130453,1,0,0:0:0:0: +182,192,130532,128,0,130611:0:0:0:0: +109,192,130532,1,0,0:0:0:0: +256,192,130611,128,0,130690:0:0:0:0: +36,192,130611,1,0,0:0:0:0: +475,192,130611,1,0,0:0:0:0: +329,192,130690,128,0,130769:0:0:0:0: +402,192,130690,1,0,0:0:0:0: +109,192,130769,128,0,131006:0:0:0:0: +256,192,130769,1,0,0:0:0:0: +36,192,130769,1,0,0:0:0:0: +475,192,130769,1,0,0:0:0:0: +182,192,130848,128,0,130927:0:0:0:0: +402,192,130848,1,0,0:0:0:0: +329,192,130927,128,0,131006:0:0:0:0: +475,192,130927,1,0,0:0:0:0: +36,192,130927,1,0,0:0:0:0: +256,192,131006,128,0,131085:0:0:0:0: +402,192,131006,1,0,0:0:0:0: +182,192,131085,128,0,131164:0:0:0:0: +475,192,131085,128,0,131401:0:0:0:0: +36,192,131085,1,0,0:0:0:0: +329,192,131085,1,0,0:0:0:0: +256,192,131164,1,0,0:0:0:0: +109,192,131243,128,0,131322:0:0:0:0: +329,192,131243,1,0,0:0:0:0: +36,192,131243,1,0,0:0:0:0: +182,192,131322,1,0,0:0:0:0: +329,192,131401,128,0,131480:0:0:0:0: +36,192,131401,128,0,131716:0:0:0:0: +256,192,131401,1,0,0:0:0:0: +402,192,131401,1,0,0:0:0:0: +109,192,131401,1,0,0:0:0:0: +182,192,131480,128,0,131558:0:0:0:0: +475,192,131480,1,0,0:0:0:0: +256,192,131558,128,0,131637:0:0:0:0: +109,192,131558,1,0,0:0:0:0: +329,192,131558,1,0,0:0:0:0: +402,192,131637,1,0,0:0:0:0: +329,192,131716,128,0,131795:0:0:0:0: +475,192,131716,128,0,132032:0:0:0:0: +256,192,131716,1,0,0:0:0:0: +109,192,131716,1,0,0:0:0:0: +182,192,131795,1,0,0:0:0:0: +109,192,131874,128,0,131953:0:0:0:0: +256,192,131874,1,0,0:0:0:0: +402,192,131874,1,0,0:0:0:0: +182,192,131953,128,0,132032:0:0:0:0: +329,192,131953,1,0,0:0:0:0: +256,192,132032,128,0,132111:0:0:0:0: +36,192,132032,128,0,132348:0:0:0:0: +402,192,132032,1,0,0:0:0:0: +109,192,132032,1,0,0:0:0:0: +329,192,132111,1,0,0:0:0:0: +402,192,132190,128,0,132269:0:0:0:0: +109,192,132190,1,0,0:0:0:0: +475,192,132190,1,0,0:0:0:0: +329,192,132269,128,0,132348:0:0:0:0: +182,192,132269,1,0,0:0:0:0: +256,192,132348,128,0,132427:0:0:0:0: +475,192,132348,128,0,132664:0:0:0:0: +109,192,132348,1,0,0:0:0:0: +402,192,132348,1,0,0:0:0:0: +182,192,132427,1,0,0:0:0:0: +402,192,132506,128,0,132585:0:0:0:0: +256,192,132506,1,0,0:0:0:0: +36,192,132506,1,0,0:0:0:0: +329,192,132585,128,0,132664:0:0:0:0: +109,192,132585,1,0,0:0:0:0: +256,192,132664,128,0,132743:0:0:0:0: +36,192,132664,128,0,132980:0:0:0:0: +182,192,132664,1,0,0:0:0:0: +402,192,132664,1,0,0:0:0:0: +475,192,132743,128,0,132822:0:0:0:0: +329,192,132743,1,0,0:0:0:0: +182,192,132822,128,0,132980:0:0:0:0: +402,192,132822,1,0,0:0:0:0: +109,192,132822,1,0,0:0:0:0: +256,192,132901,128,0,132980:0:0:0:0: +329,192,132980,128,0,133058:0:0:0:0: +475,192,132980,128,0,133295:0:0:0:0: +109,192,132980,1,0,0:0:0:0: +402,192,132980,1,0,0:0:0:0: +182,192,133058,1,0,0:0:0:0: +402,192,133137,128,0,133216:0:0:0:0: +256,192,133137,1,0,0:0:0:0: +36,192,133137,1,0,0:0:0:0: +329,192,133216,128,0,133295:0:0:0:0: +109,192,133216,1,0,0:0:0:0: +182,192,133295,128,0,133532:0:0:0:0: +36,192,133295,128,0,133532:0:0:0:0: +256,192,133295,1,0,0:0:0:0: +402,192,133374,1,0,0:0:0:0: +475,192,133374,128,0,133611:0:0:0:0: +329,192,133453,128,0,133611:0:0:0:0: +109,192,133453,1,0,0:0:0:0: +256,192,133532,1,0,0:0:0:0: +36,192,133611,128,0,134243:0:0:0:0: +182,192,133611,128,0,134243:0:0:0:0: +402,192,133611,128,0,133769:0:0:0:0: +109,192,133611,128,0,133690:0:0:0:0: +475,192,133690,128,0,133848:0:0:0:0: +256,192,133690,128,0,133769:0:0:0:0: +329,192,133769,128,0,133927:0:0:0:0: +109,192,133769,128,0,133848:0:0:0:0: +402,192,133848,128,0,134006:0:0:0:0: +256,192,133927,128,0,134085:0:0:0:0: +475,192,133927,128,0,134006:0:0:0:0: +329,192,134006,128,0,134164:0:0:0:0: +109,192,134006,128,0,134085:0:0:0:0: +475,192,134085,128,0,134164:0:0:0:0: +256,192,134164,128,0,134243:0:0:0:0: +402,192,134164,128,0,134322:0:0:0:0: +109,192,134243,128,0,134401:0:0:0:0: +475,192,134243,128,0,134874:0:0:0:0: +329,192,134243,128,0,134874:0:0:0:0: +256,192,134322,128,0,134401:0:0:0:0: +36,192,134322,128,0,134480:0:0:0:0: +402,192,134401,128,0,134480:0:0:0:0: +182,192,134401,128,0,134558:0:0:0:0: +109,192,134480,128,0,134637:0:0:0:0: +256,192,134558,128,0,134716:0:0:0:0: +36,192,134558,128,0,134637:0:0:0:0: +182,192,134637,128,0,134795:0:0:0:0: +402,192,134637,128,0,134716:0:0:0:0: +36,192,134716,128,0,134795:0:0:0:0: +256,192,134795,128,0,134874:0:0:0:0: +109,192,134795,128,0,134874:0:0:0:0: +36,192,134874,128,0,135032:0:0:0:0: +182,192,134874,128,0,134953:0:0:0:0: +402,192,134874,128,0,135032:0:0:0:0: +256,192,134953,128,0,135032:0:0:0:0: +475,192,135032,128,0,135190:0:0:0:0: +329,192,135032,128,0,135111:0:0:0:0: +109,192,135032,128,0,135190:0:0:0:0: +256,192,135111,128,0,135190:0:0:0:0: +182,192,135190,128,0,135348:0:0:0:0: +36,192,135190,128,0,135269:0:0:0:0: +402,192,135190,128,0,135269:0:0:0:0: +256,192,135269,128,0,135348:0:0:0:0: +329,192,135348,128,0,135506:0:0:0:0: +36,192,135348,128,0,135427:0:0:0:0: +475,192,135348,128,0,135427:0:0:0:0: +182,192,135427,128,0,135506:0:0:0:0: +36,192,135506,1,0,0:0:0:0: +475,192,135506,1,0,0:0:0:0: +402,192,135506,128,0,135585:0:0:0:0: +109,192,135506,128,0,135585:0:0:0:0: +256,192,135585,128,0,135664:0:0:0:0: +182,192,135664,128,0,135743:0:0:0:0: +329,192,135664,128,0,135743:0:0:0:0: +402,192,135743,128,0,135822:0:0:0:0: +109,192,135743,128,0,135822:0:0:0:0: +36,192,135822,128,0,135901:0:0:0:0: +182,192,135822,128,0,135901:0:0:0:0: +329,192,135822,128,0,135901:0:0:0:0: +475,192,135822,128,0,135901:0:0:0:0: +475,192,135980,128,0,136058:0:0:0:0: +329,192,135980,128,0,136058:0:0:0:0: +182,192,135980,128,0,136058:0:0:0:0: +36,192,135980,128,0,136058:0:0:0:0: +475,192,136137,128,0,136453:0:0:0:0: +402,192,136137,1,0,0:0:0:0: +109,192,136137,128,0,136216:0:0:0:0: +36,192,136137,1,0,0:0:0:0: +256,192,136137,128,0,136216:0:0:0:0: +182,192,136216,128,0,136295:0:0:0:0: +329,192,136216,128,0,136295:0:0:0:0: +182,192,136374,128,0,136453:0:0:0:0: +329,192,136374,128,0,136453:0:0:0:0: +109,192,136453,1,0,0:0:0:0: +402,192,136453,128,0,136532:0:0:0:0: +36,192,136453,128,0,136769:0:0:0:0: +256,192,136453,128,0,136532:0:0:0:0: +182,192,136532,128,0,136611:0:0:0:0: +329,192,136611,128,0,136690:0:0:0:0: +109,192,136611,1,0,0:0:0:0: +475,192,136611,1,0,0:0:0:0: +182,192,136690,1,0,0:0:0:0: +402,192,136769,128,0,136848:0:0:0:0: +475,192,136769,128,0,137085:0:0:0:0: +256,192,136769,1,0,0:0:0:0: +109,192,136769,1,0,0:0:0:0: +182,192,136848,1,0,0:0:0:0: +109,192,136927,128,0,137006:0:0:0:0: +256,192,136927,1,0,0:0:0:0: +402,192,136927,1,0,0:0:0:0: +182,192,137006,128,0,137085:0:0:0:0: +329,192,137006,1,0,0:0:0:0: +256,192,137085,128,0,137164:0:0:0:0: +36,192,137085,128,0,137401:0:0:0:0: +402,192,137085,1,0,0:0:0:0: +109,192,137085,1,0,0:0:0:0: +329,192,137164,1,0,0:0:0:0: +402,192,137243,128,0,137322:0:0:0:0: +109,192,137243,1,0,0:0:0:0: +475,192,137243,1,0,0:0:0:0: +329,192,137322,128,0,137401:0:0:0:0: +182,192,137322,1,0,0:0:0:0: +256,192,137401,128,0,137480:0:0:0:0: +475,192,137401,128,0,137716:0:0:0:0: +109,192,137401,1,0,0:0:0:0: +402,192,137401,1,0,0:0:0:0: +182,192,137480,1,0,0:0:0:0: +402,192,137558,128,0,137637:0:0:0:0: +256,192,137558,1,0,0:0:0:0: +36,192,137558,1,0,0:0:0:0: +329,192,137637,128,0,137716:0:0:0:0: +109,192,137637,1,0,0:0:0:0: +256,192,137716,128,0,137874:0:0:0:0: +36,192,137716,128,0,138032:0:0:0:0: +182,192,137716,1,0,0:0:0:0: +402,192,137716,1,0,0:0:0:0: +475,192,137795,128,0,137874:0:0:0:0: +329,192,137795,1,0,0:0:0:0: +182,192,137874,128,0,138032:0:0:0:0: +109,192,137874,1,0,0:0:0:0: +402,192,137874,1,0,0:0:0:0: +329,192,137953,128,0,138032:0:0:0:0: +402,192,138032,128,0,138111:0:0:0:0: +475,192,138032,128,0,138348:0:0:0:0: +256,192,138032,1,0,0:0:0:0: +109,192,138032,1,0,0:0:0:0: +182,192,138111,1,0,0:0:0:0: +36,192,138190,128,0,138269:0:0:0:0: +256,192,138190,1,0,0:0:0:0: +402,192,138190,1,0,0:0:0:0: +109,192,138269,128,0,138348:0:0:0:0: +329,192,138269,1,0,0:0:0:0: +256,192,138348,128,0,138664:0:0:0:0: +36,192,138348,128,0,138664:0:0:0:0: +182,192,138348,1,0,0:0:0:0: +402,192,138348,128,0,138427:0:0:0:0: +329,192,138427,128,0,138585:0:0:0:0: +109,192,138506,1,0,0:0:0:0: +402,192,138506,128,0,138664:0:0:0:0: +182,192,138585,128,0,138664:0:0:0:0: +109,192,138664,128,0,138743:0:0:0:0: +475,192,138664,128,0,138980:0:0:0:0: +329,192,138664,1,0,0:0:0:0: +256,192,138743,1,0,0:0:0:0: +182,192,138822,128,0,138901:0:0:0:0: +402,192,138822,1,0,0:0:0:0: +36,192,138822,1,0,0:0:0:0: +256,192,138901,1,0,0:0:0:0: +402,192,138980,128,0,139058:0:0:0:0: +36,192,138980,128,0,139295:0:0:0:0: +329,192,138980,1,0,0:0:0:0: +109,192,138980,1,0,0:0:0:0: +182,192,139058,128,0,139137:0:0:0:0: +256,192,139058,1,0,0:0:0:0: +475,192,139137,1,0,0:0:0:0: +329,192,139137,128,0,139216:0:0:0:0: +402,192,139137,1,0,0:0:0:0: +182,192,139216,1,0,0:0:0:0: +402,192,139295,128,0,139374:0:0:0:0: +475,192,139295,128,0,139611:0:0:0:0: +109,192,139295,1,0,0:0:0:0: +329,192,139295,1,0,0:0:0:0: +256,192,139374,1,0,0:0:0:0: +109,192,139453,128,0,139532:0:0:0:0: +36,192,139453,1,0,0:0:0:0: +402,192,139453,1,0,0:0:0:0: +182,192,139532,128,0,139611:0:0:0:0: +329,192,139532,1,0,0:0:0:0: +256,192,139611,128,0,139690:0:0:0:0: +36,192,139611,128,0,139927:0:0:0:0: +402,192,139611,1,0,0:0:0:0: +109,192,139611,1,0,0:0:0:0: +329,192,139690,1,0,0:0:0:0: +402,192,139769,128,0,139848:0:0:0:0: +256,192,139769,1,0,0:0:0:0: +475,192,139769,1,0,0:0:0:0: +109,192,139769,1,0,0:0:0:0: +329,192,139848,128,0,139927:0:0:0:0: +182,192,139848,1,0,0:0:0:0: +475,192,139927,128,0,140085:0:0:0:0: +402,192,139927,1,0,0:0:0:0: +109,192,139927,1,0,0:0:0:0: +256,192,139927,1,0,0:0:0:0: +329,192,140006,1,0,0:0:0:0: +182,192,140085,128,0,140164:0:0:0:0: +36,192,140085,1,0,0:0:0:0: +402,192,140085,1,0,0:0:0:0: +109,192,140085,1,0,0:0:0:0: +256,192,140164,128,0,140243:0:0:0:0: +329,192,140243,128,0,140322:0:0:0:0: +402,192,140243,1,0,0:0:0:0: +475,192,140243,1,0,0:0:0:0: +109,192,140322,1,0,0:0:0:0: +182,192,140322,128,0,140480:0:0:0:0: +36,192,140322,1,0,0:0:0:0: +329,192,140401,128,0,140480:0:0:0:0: +402,192,140401,1,0,0:0:0:0: +475,192,140401,1,0,0:0:0:0: +256,192,140480,128,0,140558:0:0:0:0: +402,192,140558,128,0,140716:0:0:0:0: +36,192,140558,1,0,0:0:0:0: +475,192,140558,1,0,0:0:0:0: +182,192,140558,1,0,0:0:0:0: +109,192,140637,128,0,140874:0:0:0:0: +182,192,140716,128,0,140795:0:0:0:0: +475,192,140716,1,0,0:0:0:0: +36,192,140716,1,0,0:0:0:0: +329,192,140716,1,0,0:0:0:0: +256,192,140795,128,0,140874:0:0:0:0: +402,192,140874,128,0,141190:0:0:0:0: +329,192,140874,1,0,0:0:0:0: +475,192,140874,1,0,0:0:0:0: +36,192,140874,1,0,0:0:0:0: +182,192,140953,128,0,141032:0:0:0:0: +256,192,140953,1,0,0:0:0:0: +329,192,141032,128,0,141111:0:0:0:0: +36,192,141032,1,0,0:0:0:0: +475,192,141032,1,0,0:0:0:0: +256,192,141111,128,0,141190:0:0:0:0: +109,192,141111,1,0,0:0:0:0: +475,192,141190,128,0,141269:0:0:0:0: +36,192,141190,128,0,141506:0:0:0:0: +329,192,141190,1,0,0:0:0:0: +182,192,141190,1,0,0:0:0:0: +256,192,141269,1,0,0:0:0:0: +329,192,141348,128,0,141427:0:0:0:0: +109,192,141348,1,0,0:0:0:0: +475,192,141348,1,0,0:0:0:0: +256,192,141427,1,0,0:0:0:0: +182,192,141506,128,0,141585:0:0:0:0: +475,192,141506,128,0,141822:0:0:0:0: +109,192,141506,1,0,0:0:0:0: +402,192,141506,1,0,0:0:0:0: +329,192,141585,128,0,141664:0:0:0:0: +36,192,141585,1,0,0:0:0:0: +256,192,141664,128,0,141743:0:0:0:0: +402,192,141664,1,0,0:0:0:0: +182,192,141664,1,0,0:0:0:0: +109,192,141743,1,0,0:0:0:0: +182,192,141822,128,0,141901:0:0:0:0: +36,192,141822,128,0,142137:0:0:0:0: +256,192,141822,1,0,0:0:0:0: +402,192,141822,1,0,0:0:0:0: +329,192,141901,1,0,0:0:0:0: +402,192,141980,128,0,142058:0:0:0:0: +475,192,141980,1,0,0:0:0:0: +109,192,141980,1,0,0:0:0:0: +329,192,142058,128,0,142137:0:0:0:0: +182,192,142058,1,0,0:0:0:0: +256,192,142137,128,0,142216:0:0:0:0: +475,192,142137,128,0,142453:0:0:0:0: +109,192,142137,1,0,0:0:0:0: +402,192,142137,1,0,0:0:0:0: +182,192,142216,1,0,0:0:0:0: +109,192,142295,128,0,142374:0:0:0:0: +402,192,142295,1,0,0:0:0:0: +36,192,142295,1,0,0:0:0:0: +182,192,142374,128,0,142453:0:0:0:0: +329,192,142374,1,0,0:0:0:0: +36,192,142453,128,0,142769:0:0:0:0: +402,192,142453,1,0,0:0:0:0: +256,192,142453,1,0,0:0:0:0: +182,192,142532,1,0,0:0:0:0: +109,192,142611,128,0,142690:0:0:0:0: +475,192,142611,1,0,0:0:0:0: +256,192,142611,1,0,0:0:0:0: +182,192,142690,128,0,142769:0:0:0:0: +329,192,142690,1,0,0:0:0:0: +256,192,142769,128,0,142848:0:0:0:0: +475,192,142769,128,0,143085:0:0:0:0: +402,192,142769,1,0,0:0:0:0: +109,192,142769,1,0,0:0:0:0: +182,192,142848,128,0,142927:0:0:0:0: +329,192,142848,1,0,0:0:0:0: +109,192,142927,128,0,143006:0:0:0:0: +402,192,142927,1,0,0:0:0:0: +36,192,142927,1,0,0:0:0:0: +256,192,143006,128,0,143085:0:0:0:0: +329,192,143006,1,0,0:0:0:0: +36,192,143085,1,0,0:0:0:0: +402,192,143085,1,0,0:0:0:0: +182,192,143085,128,0,143164:0:0:0:0: +256,192,143164,1,0,0:0:0:0: +475,192,143164,1,0,0:0:0:0: +329,192,143243,128,0,143322:0:0:0:0: +36,192,143243,1,0,0:0:0:0: +182,192,143243,1,0,0:0:0:0: +475,192,143322,128,0,143637:0:0:0:0: +256,192,143322,1,0,0:0:0:0: +329,192,143401,1,0,0:0:0:0: +36,192,143401,128,0,143637:0:0:0:0: +182,192,143401,1,0,0:0:0:0: +109,192,143401,1,0,0:0:0:0: +402,192,143480,128,0,143637:0:0:0:0: +256,192,143480,1,0,0:0:0:0: +329,192,143558,128,0,143637:0:0:0:0: +182,192,143558,1,0,0:0:0:0: +109,192,143637,1,0,0:0:0:0: +256,192,143716,1,0,0:0:0:0: +402,192,143716,1,0,0:0:0:0: +475,192,143716,1,0,0:0:0:0: +182,192,143716,1,0,0:0:0:0: +36,192,143716,1,0,0:0:0:0: +329,192,143874,1,0,0:0:0:0: +182,192,143874,1,0,0:0:0:0: +475,192,143874,1,0,0:0:0:0: +402,192,144032,128,0,144111:0:0:0:0: +329,192,144111,128,0,144190:0:0:0:0: +256,192,144190,128,0,144269:0:0:0:0: +182,192,144269,128,0,144348:0:0:0:0: +36,192,144348,1,0,0:0:0:0: +109,192,144348,1,0,0:0:0:0: +475,192,144348,1,0,0:0:0:0: +329,192,144348,1,0,0:0:0:0: +402,192,144348,1,0,0:0:0:0: +182,192,144506,128,0,144585:0:0:0:0: +256,192,144585,128,0,144664:0:0:0:0: +329,192,144664,128,0,144743:0:0:0:0: +402,192,144743,1,0,0:0:0:0: +182,192,144822,128,0,144901:0:0:0:0: +256,192,144901,128,0,144980:0:0:0:0: +109,192,144980,1,0,0:0:0:0: +36,192,144980,1,0,0:0:0:0: +329,192,144980,1,0,0:0:0:0: +475,192,144980,1,0,0:0:0:0: +402,192,144980,1,0,0:0:0:0: +109,192,145137,1,0,0:0:0:0: +256,192,145137,1,0,0:0:0:0: +402,192,145137,1,0,0:0:0:0: +182,192,145295,1,0,0:0:0:0: +36,192,145295,1,0,0:0:0:0: +256,192,145295,1,0,0:0:0:0: +329,192,145295,1,0,0:0:0:0: +475,192,145295,1,0,0:0:0:0: +109,192,145453,1,0,0:0:0:0: +256,192,145453,1,0,0:0:0:0: +402,192,145453,1,0,0:0:0:0: +109,192,145611,1,0,0:0:0:0: +36,192,145611,1,0,0:0:0:0: +256,192,145611,1,0,0:0:0:0: +402,192,145611,1,0,0:0:0:0: +475,192,145611,1,0,0:0:0:0: +109,192,145769,1,0,0:0:0:0: +256,192,145769,1,0,0:0:0:0: +402,192,145769,1,0,0:0:0:0: +182,192,145927,1,0,0:0:0:0: +109,192,145927,1,0,0:0:0:0: +36,192,145927,1,0,0:0:0:0: +329,192,145927,1,0,0:0:0:0: +402,192,145927,1,0,0:0:0:0: +475,192,145927,1,0,0:0:0:0: +109,192,146243,1,0,0:0:0:0: +36,192,146243,1,0,0:0:0:0: +402,192,146243,1,0,0:0:0:0: +475,192,146243,1,0,0:0:0:0: +329,192,146323,1,0,0:0:0:0: +182,192,146323,1,0,0:0:0:0: +402,192,146403,1,0,0:0:0:0: +256,192,146403,1,0,0:0:0:0: +475,192,146483,1,0,0:0:0:0: +329,192,146483,1,0,0:0:0:0: +109,192,146563,1,0,0:0:0:0: +256,192,146563,1,0,0:0:0:0: +182,192,146648,1,0,0:0:0:0: +329,192,146648,1,0,0:0:0:0: +256,192,146734,1,0,0:0:0:0: +402,192,146734,1,0,0:0:0:0: +329,192,146820,1,0,0:0:0:0: +475,192,146820,1,0,0:0:0:0: +36,192,146905,1,0,0:0:0:0: +182,192,146905,1,0,0:0:0:0: +109,192,146992,1,0,0:0:0:0: +256,192,146992,1,0,0:0:0:0: +182,192,147079,1,0,0:0:0:0: +329,192,147079,1,0,0:0:0:0: +256,192,147166,1,0,0:0:0:0: +402,192,147166,1,0,0:0:0:0: +329,192,147253,1,0,0:0:0:0: +36,192,147253,1,0,0:0:0:0: +475,192,147253,1,0,0:0:0:0: +182,192,147253,1,0,0:0:0:0: +109,192,147346,1,0,0:0:0:0: +256,192,147346,1,0,0:0:0:0: +182,192,147440,1,0,0:0:0:0: +329,192,147440,1,0,0:0:0:0: +256,192,147534,1,0,0:0:0:0: +402,192,147534,1,0,0:0:0:0: +329,192,147628,1,0,0:0:0:0: +475,192,147628,1,0,0:0:0:0: +402,192,147721,1,0,0:0:0:0: +475,192,147815,1,0,0:0:0:0: +329,192,147815,1,0,0:0:0:0: +402,192,147909,1,0,0:0:0:0: +256,192,147909,1,0,0:0:0:0: +329,192,148003,1,0,0:0:0:0: +182,192,148003,1,0,0:0:0:0: +256,192,148097,1,0,0:0:0:0: +109,192,148097,1,0,0:0:0:0: +182,192,148192,1,0,0:0:0:0: +36,192,148192,1,0,0:0:0:0: +109,192,148287,1,0,0:0:0:0: +36,192,148382,1,0,0:0:0:0: +329,192,148382,1,0,0:0:0:0: +256,192,148482,1,0,0:0:0:0: +182,192,148582,1,0,0:0:0:0: +109,192,148682,1,0,0:0:0:0: +36,192,148782,1,0,0:0:0:0: +402,192,148782,1,0,0:0:0:0: +329,192,148878,1,0,0:0:0:0: +256,192,148975,1,0,0:0:0:0: +182,192,149072,1,0,0:0:0:0: +109,192,149169,1,0,0:0:0:0: +329,192,149169,1,0,0:0:0:0: +256,192,149218,1,0,0:0:0:0: +182,192,149267,1,0,0:0:0:0: +109,192,149316,1,0,0:0:0:0: +36,192,149365,1,0,0:0:0:0: +402,192,149365,1,0,0:0:0:0: +329,192,149414,1,0,0:0:0:0: +256,192,149463,1,0,0:0:0:0: +182,192,149512,1,0,0:0:0:0: +109,192,149561,1,0,0:0:0:0: +475,192,149561,1,0,0:0:0:0: +402,192,149611,1,0,0:0:0:0: +329,192,149662,1,0,0:0:0:0: +256,192,149713,1,0,0:0:0:0: +182,192,149763,1,0,0:0:0:0: +256,192,149814,1,0,0:0:0:0: +329,192,149865,1,0,0:0:0:0: +402,192,149915,1,0,0:0:0:0: +475,192,149966,1,0,0:0:0:0: +109,192,149966,1,0,0:0:0:0: +182,192,150017,1,0,0:0:0:0: +256,192,150067,1,0,0:0:0:0: +329,192,150118,1,0,0:0:0:0: +402,192,150169,1,0,0:0:0:0: +36,192,150169,1,0,0:0:0:0: +109,192,150219,1,0,0:0:0:0: +182,192,150270,1,0,0:0:0:0: +256,192,150321,1,0,0:0:0:0: +329,192,150371,1,0,0:0:0:0: +402,192,150422,1,0,0:0:0:0: +475,192,150473,1,0,0:0:0:0: +402,192,150523,1,0,0:0:0:0: +329,192,150574,1,0,0:0:0:0: +256,192,150625,1,0,0:0:0:0: +182,192,150675,1,0,0:0:0:0: +109,192,150726,1,0,0:0:0:0: +36,192,150777,1,0,0:0:0:0: +475,192,150777,1,0,0:0:0:0: +402,192,150811,1,0,0:0:0:0: +329,192,150844,1,0,0:0:0:0: +256,192,150878,1,0,0:0:0:0: +182,192,150912,1,0,0:0:0:0: +109,192,150946,1,0,0:0:0:0: +36,192,150979,1,0,0:0:0:0: +109,192,151013,1,0,0:0:0:0: +182,192,151047,1,0,0:0:0:0: +256,192,151081,1,0,0:0:0:0: +329,192,151115,1,0,0:0:0:0: +402,192,151148,1,0,0:0:0:0: +109,192,151182,1,0,0:0:0:0: +475,192,151182,1,0,0:0:0:0: +182,192,151216,1,0,0:0:0:0: +256,192,151250,1,0,0:0:0:0: +329,192,151283,1,0,0:0:0:0: +402,192,151317,1,0,0:0:0:0: +475,192,151351,1,0,0:0:0:0: +36,192,151385,1,0,0:0:0:0: +109,192,151419,1,0,0:0:0:0: +182,192,151452,1,0,0:0:0:0: +256,192,151486,1,0,0:0:0:0: +329,192,151520,1,0,0:0:0:0: +402,192,151554,1,0,0:0:0:0: +109,192,151586,1,0,0:0:0:0: +182,192,151586,1,0,0:0:0:0: +475,192,151586,1,0,0:0:0:0: +36,192,151586,1,0,0:0:0:0: +109,192,151779,1,0,0:0:0:0: +182,192,151779,1,0,0:0:0:0: +329,192,151779,1,0,0:0:0:0: +402,192,151779,1,0,0:0:0:0: +182,192,151973,1,0,0:0:0:0: +36,192,151973,1,0,0:0:0:0: +329,192,151973,1,0,0:0:0:0: +475,192,151973,1,0,0:0:0:0: +256,192,151973,1,0,0:0:0:0: +475,192,152360,128,0,152660:0:0:0:0: +36,192,152360,1,0,0:0:0:0: +109,192,152360,1,0,0:0:0:0: +256,192,152360,1,0,0:0:0:0: +329,192,152460,1,0,0:0:0:0: +402,192,152460,1,0,0:0:0:0: +182,192,152560,1,0,0:0:0:0: +36,192,152560,1,0,0:0:0:0: +256,192,152660,1,0,0:0:0:0: +329,192,152660,1,0,0:0:0:0: +475,192,152760,128,0,153160:0:0:0:0: +109,192,152760,1,0,0:0:0:0: +36,192,152760,1,0,0:0:0:0: +402,192,152760,1,0,0:0:0:0: +329,192,152860,1,0,0:0:0:0: +256,192,152860,1,0,0:0:0:0: +109,192,152960,1,0,0:0:0:0: +36,192,152960,1,0,0:0:0:0: +182,192,153060,1,0,0:0:0:0: +256,192,153060,1,0,0:0:0:0: +329,192,153160,128,0,153360:0:0:0:0: +402,192,153160,1,0,0:0:0:0: +109,192,153160,1,0,0:0:0:0: +36,192,153160,1,0,0:0:0:0: +256,192,153260,1,0,0:0:0:0: +182,192,153260,1,0,0:0:0:0: +475,192,153360,128,0,153760:0:0:0:0: +109,192,153360,1,0,0:0:0:0: +36,192,153360,1,0,0:0:0:0: +256,192,153460,1,0,0:0:0:0: +329,192,153460,1,0,0:0:0:0: +182,192,153560,1,0,0:0:0:0: +109,192,153560,1,0,0:0:0:0: +36,192,153560,1,0,0:0:0:0: +256,192,153660,1,0,0:0:0:0: +402,192,153660,1,0,0:0:0:0: +329,192,153760,128,0,153960:0:0:0:0: +36,192,153760,1,0,0:0:0:0: +109,192,153760,1,0,0:0:0:0: +182,192,153860,1,0,0:0:0:0: +256,192,153860,1,0,0:0:0:0: +475,192,153960,128,0,154360:0:0:0:0: +109,192,153960,1,0,0:0:0:0: +36,192,153960,1,0,0:0:0:0: +402,192,153960,1,0,0:0:0:0: +329,192,154060,1,0,0:0:0:0: +256,192,154060,1,0,0:0:0:0: +109,192,154160,1,0,0:0:0:0: +36,192,154160,1,0,0:0:0:0: +256,192,154260,1,0,0:0:0:0: +182,192,154260,1,0,0:0:0:0: +329,192,154360,128,0,154560:0:0:0:0: +109,192,154360,1,0,0:0:0:0: +36,192,154360,1,0,0:0:0:0: +402,192,154360,1,0,0:0:0:0: +256,192,154460,1,0,0:0:0:0: +182,192,154460,1,0,0:0:0:0: +475,192,154560,128,0,154960:0:0:0:0: +109,192,154560,1,0,0:0:0:0: +36,192,154560,1,0,0:0:0:0: +256,192,154660,1,0,0:0:0:0: +329,192,154660,1,0,0:0:0:0: +36,192,154760,1,0,0:0:0:0: +402,192,154760,1,0,0:0:0:0: +109,192,154760,1,0,0:0:0:0: +182,192,154860,1,0,0:0:0:0: +256,192,154860,1,0,0:0:0:0: +329,192,154960,1,0,0:0:0:0: +402,192,154960,1,0,0:0:0:0: +109,192,155060,1,0,0:0:0:0: +182,192,155060,1,0,0:0:0:0: +36,192,155160,1,0,0:0:0:0: +475,192,155160,1,0,0:0:0:0: +329,192,155160,1,0,0:0:0:0: +256,192,155260,1,0,0:0:0:0: +182,192,155260,1,0,0:0:0:0: +329,192,155360,1,0,0:0:0:0: +402,192,155360,1,0,0:0:0:0: +182,192,155460,1,0,0:0:0:0: +109,192,155460,1,0,0:0:0:0: +36,192,155560,128,0,155860:0:0:0:0: +256,192,155560,1,0,0:0:0:0: +402,192,155560,1,0,0:0:0:0: +475,192,155560,1,0,0:0:0:0: +182,192,155660,1,0,0:0:0:0: +109,192,155660,1,0,0:0:0:0: +329,192,155760,1,0,0:0:0:0: +402,192,155760,1,0,0:0:0:0: +256,192,155860,1,0,0:0:0:0: +182,192,155860,1,0,0:0:0:0: +36,192,155960,128,0,156360:0:0:0:0: +109,192,155960,1,0,0:0:0:0: +475,192,155960,1,0,0:0:0:0: +402,192,155960,1,0,0:0:0:0: +329,192,156060,1,0,0:0:0:0: +256,192,156060,1,0,0:0:0:0: +182,192,156160,1,0,0:0:0:0: +109,192,156160,1,0,0:0:0:0: +329,192,156260,1,0,0:0:0:0: +256,192,156260,1,0,0:0:0:0: +182,192,156360,128,0,156560:0:0:0:0: +402,192,156360,1,0,0:0:0:0: +109,192,156360,1,0,0:0:0:0: +475,192,156360,1,0,0:0:0:0: +256,192,156460,1,0,0:0:0:0: +329,192,156460,1,0,0:0:0:0: +36,192,156560,128,0,156960:0:0:0:0: +402,192,156560,1,0,0:0:0:0: +475,192,156560,1,0,0:0:0:0: +329,192,156660,1,0,0:0:0:0: +256,192,156660,1,0,0:0:0:0: +182,192,156760,1,0,0:0:0:0: +109,192,156760,1,0,0:0:0:0: +475,192,156760,1,0,0:0:0:0: +402,192,156860,1,0,0:0:0:0: +329,192,156860,1,0,0:0:0:0: +182,192,156960,128,0,157160:0:0:0:0: +256,192,156960,1,0,0:0:0:0: +109,192,156960,1,0,0:0:0:0: +329,192,157060,1,0,0:0:0:0: +402,192,157060,1,0,0:0:0:0: +36,192,157160,128,0,157360:0:0:0:0: +256,192,157160,1,0,0:0:0:0: +475,192,157160,1,0,0:0:0:0: +109,192,157160,1,0,0:0:0:0: +329,192,157260,1,0,0:0:0:0: +402,192,157260,1,0,0:0:0:0: +475,192,157360,1,0,0:0:0:0: +109,192,157360,1,0,0:0:0:0: +182,192,157360,128,0,157560:0:0:0:0: +256,192,157460,1,0,0:0:0:0: +329,192,157460,1,0,0:0:0:0: +36,192,157560,128,0,157760:0:0:0:0: +475,192,157560,1,0,0:0:0:0: +402,192,157560,1,0,0:0:0:0: +109,192,157560,1,0,0:0:0:0: +329,192,157660,1,0,0:0:0:0: +256,192,157660,1,0,0:0:0:0: +182,192,157760,128,0,158360:0:0:0:0: +109,192,157760,1,0,0:0:0:0: +475,192,157760,1,0,0:0:0:0: +329,192,157860,1,0,0:0:0:0: +402,192,157860,1,0,0:0:0:0: +256,192,157960,1,0,0:0:0:0: +36,192,157960,1,0,0:0:0:0: +475,192,157960,1,0,0:0:0:0: +329,192,158060,1,0,0:0:0:0: +402,192,158060,1,0,0:0:0:0: +109,192,158160,1,0,0:0:0:0: +36,192,158160,1,0,0:0:0:0: +329,192,158260,1,0,0:0:0:0: +256,192,158260,1,0,0:0:0:0: +402,192,158360,1,0,0:0:0:0: +475,192,158360,1,0,0:0:0:0: +36,192,158360,1,0,0:0:0:0: +109,192,158460,1,0,0:0:0:0: +182,192,158460,1,0,0:0:0:0: +329,192,158560,1,0,0:0:0:0: +402,192,158560,1,0,0:0:0:0: +256,192,158660,1,0,0:0:0:0: +182,192,158660,1,0,0:0:0:0: +475,192,158760,128,0,159060:0:0:0:0: +36,192,158760,1,0,0:0:0:0: +109,192,158760,1,0,0:0:0:0: +402,192,158760,1,0,0:0:0:0: +329,192,158860,1,0,0:0:0:0: +256,192,158860,1,0,0:0:0:0: +109,192,158960,1,0,0:0:0:0: +36,192,158960,1,0,0:0:0:0: +182,192,158960,1,0,0:0:0:0: +329,192,159060,1,0,0:0:0:0: +256,192,159060,1,0,0:0:0:0: +402,192,159060,1,0,0:0:0:0: +475,192,159160,128,0,159560:0:0:0:0: +182,192,159160,1,0,0:0:0:0: +36,192,159160,1,0,0:0:0:0: +109,192,159160,1,0,0:0:0:0: +402,192,159260,1,0,0:0:0:0: +329,192,159260,1,0,0:0:0:0: +109,192,159360,1,0,0:0:0:0: +36,192,159360,1,0,0:0:0:0: +182,192,159460,1,0,0:0:0:0: +256,192,159460,1,0,0:0:0:0: +329,192,159560,128,0,159760:0:0:0:0: +36,192,159560,1,0,0:0:0:0: +402,192,159560,1,0,0:0:0:0: +109,192,159560,1,0,0:0:0:0: +256,192,159660,1,0,0:0:0:0: +182,192,159660,1,0,0:0:0:0: +475,192,159760,128,0,160160:0:0:0:0: +109,192,159760,1,0,0:0:0:0: +36,192,159760,1,0,0:0:0:0: +256,192,159860,1,0,0:0:0:0: +329,192,159860,1,0,0:0:0:0: +182,192,159960,1,0,0:0:0:0: +36,192,159960,1,0,0:0:0:0: +109,192,159960,1,0,0:0:0:0: +256,192,160060,1,0,0:0:0:0: +402,192,160060,1,0,0:0:0:0: +329,192,160160,128,0,160360:0:0:0:0: +36,192,160160,1,0,0:0:0:0: +109,192,160160,1,0,0:0:0:0: +182,192,160260,1,0,0:0:0:0: +256,192,160260,1,0,0:0:0:0: +475,192,160360,128,0,160760:0:0:0:0: +109,192,160360,1,0,0:0:0:0: +36,192,160360,1,0,0:0:0:0: +402,192,160360,1,0,0:0:0:0: +329,192,160460,1,0,0:0:0:0: +256,192,160460,1,0,0:0:0:0: +36,192,160560,1,0,0:0:0:0: +109,192,160560,1,0,0:0:0:0: +256,192,160660,1,0,0:0:0:0: +182,192,160660,1,0,0:0:0:0: +329,192,160760,128,0,160960:0:0:0:0: +109,192,160760,1,0,0:0:0:0: +36,192,160760,1,0,0:0:0:0: +402,192,160760,1,0,0:0:0:0: +256,192,160860,1,0,0:0:0:0: +182,192,160860,1,0,0:0:0:0: +475,192,160960,128,0,161360:0:0:0:0: +36,192,160960,1,0,0:0:0:0: +402,192,160960,1,0,0:0:0:0: +109,192,161060,1,0,0:0:0:0: +182,192,161060,1,0,0:0:0:0: +402,192,161160,1,0,0:0:0:0: +36,192,161160,1,0,0:0:0:0: +329,192,161160,1,0,0:0:0:0: +256,192,161260,1,0,0:0:0:0: +182,192,161260,1,0,0:0:0:0: +109,192,161360,1,0,0:0:0:0: +36,192,161360,1,0,0:0:0:0: +182,192,161460,1,0,0:0:0:0: +256,192,161460,1,0,0:0:0:0: +329,192,161560,1,0,0:0:0:0: +402,192,161560,1,0,0:0:0:0: +475,192,161560,1,0,0:0:0:0: +109,192,161660,1,0,0:0:0:0: +182,192,161660,1,0,0:0:0:0: +329,192,161760,1,0,0:0:0:0: +402,192,161760,1,0,0:0:0:0: +256,192,161860,1,0,0:0:0:0: +182,192,161860,1,0,0:0:0:0: +36,192,161960,128,0,162260:0:0:0:0: +109,192,161960,1,0,0:0:0:0: +402,192,161960,1,0,0:0:0:0: +475,192,161960,1,0,0:0:0:0: +329,192,162060,1,0,0:0:0:0: +256,192,162060,1,0,0:0:0:0: +182,192,162160,1,0,0:0:0:0: +109,192,162160,1,0,0:0:0:0: +329,192,162260,1,0,0:0:0:0: +402,192,162260,1,0,0:0:0:0: +256,192,162360,1,0,0:0:0:0: +182,192,162360,1,0,0:0:0:0: +109,192,162360,1,0,0:0:0:0: +36,192,162360,128,0,162760:0:0:0:0: +402,192,162460,1,0,0:0:0:0: +475,192,162460,1,0,0:0:0:0: +329,192,162560,1,0,0:0:0:0: +256,192,162560,1,0,0:0:0:0: +402,192,162660,1,0,0:0:0:0: +475,192,162660,1,0,0:0:0:0: +182,192,162760,128,0,163160:0:0:0:0: +329,192,162760,1,0,0:0:0:0: +256,192,162760,1,0,0:0:0:0: +109,192,162760,1,0,0:0:0:0: +402,192,162860,1,0,0:0:0:0: +475,192,162860,1,0,0:0:0:0: +109,192,162960,1,0,0:0:0:0: +36,192,162960,1,0,0:0:0:0: +256,192,163060,1,0,0:0:0:0: +329,192,163060,1,0,0:0:0:0: +36,192,163160,128,0,163560:0:0:0:0: +402,192,163160,1,0,0:0:0:0: +475,192,163160,1,0,0:0:0:0: +109,192,163160,1,0,0:0:0:0: +329,192,163260,1,0,0:0:0:0: +256,192,163260,1,0,0:0:0:0: +182,192,163360,1,0,0:0:0:0: +109,192,163360,1,0,0:0:0:0: +329,192,163460,1,0,0:0:0:0: +402,192,163460,1,0,0:0:0:0: +182,192,163560,128,0,163760:0:0:0:0: +256,192,163560,1,0,0:0:0:0: +109,192,163560,1,0,0:0:0:0: +475,192,163560,1,0,0:0:0:0: +36,192,163760,128,0,163960:0:0:0:0: +475,192,163760,1,0,0:0:0:0: +109,192,163760,1,0,0:0:0:0: +402,192,163810,1,0,0:0:0:0: +329,192,163860,1,0,0:0:0:0: +256,192,163910,1,0,0:0:0:0: +109,192,163960,128,0,164160:0:0:0:0: +402,192,163960,1,0,0:0:0:0: +475,192,163960,1,0,0:0:0:0: +182,192,163960,1,0,0:0:0:0: +36,192,164160,128,0,164360:0:0:0:0: +182,192,164160,1,0,0:0:0:0: +475,192,164160,1,0,0:0:0:0: +256,192,164210,1,0,0:0:0:0: +329,192,164260,1,0,0:0:0:0: +402,192,164310,1,0,0:0:0:0: +182,192,164360,128,0,164460:0:0:0:0: +329,192,164360,128,0,164460:0:0:0:0: +256,192,164360,1,0,0:0:0:0: +109,192,164360,1,0,0:0:0:0: +475,192,164360,1,0,0:0:0:0: +256,192,164560,128,0,164760:0:0:0:0: +402,192,164560,128,0,164760:0:0:0:0: +182,192,164560,1,0,0:0:0:0: +36,192,164560,1,0,0:0:0:0: +475,192,164560,1,0,0:0:0:0: +182,192,164960,1,0,0:0:0:0: +36,192,164960,1,0,0:0:0:0: +329,192,164960,1,0,0:0:0:0: +475,192,164960,1,0,0:0:0:0: +109,192,165360,1,0,0:0:0:0: +256,192,165360,1,0,0:0:0:0: +402,192,165360,1,0,0:0:0:0: +475,192,165560,128,0,165945:0:0:0:0: +36,192,165560,1,0,0:0:0:0: +109,192,165560,1,0,0:0:0:0: +182,192,165560,1,0,0:0:0:0: +256,192,165656,1,0,0:0:0:0: +329,192,165656,1,0,0:0:0:0: +109,192,165752,1,0,0:0:0:0: +182,192,165752,1,0,0:0:0:0: +329,192,165849,1,0,0:0:0:0: +402,192,165849,1,0,0:0:0:0: +36,192,165945,128,0,166138:0:0:0:0: +256,192,165945,1,0,0:0:0:0: +182,192,165945,1,0,0:0:0:0: +109,192,165945,1,0,0:0:0:0: +329,192,166042,1,0,0:0:0:0: +402,192,166042,1,0,0:0:0:0: +475,192,166138,128,0,166524:0:0:0:0: +109,192,166138,1,0,0:0:0:0: +182,192,166138,1,0,0:0:0:0: +256,192,166235,1,0,0:0:0:0: +329,192,166235,1,0,0:0:0:0: +182,192,166331,1,0,0:0:0:0: +109,192,166331,1,0,0:0:0:0: +36,192,166331,1,0,0:0:0:0: +329,192,166428,1,0,0:0:0:0: +402,192,166428,1,0,0:0:0:0: +36,192,166524,128,0,166717:0:0:0:0: +109,192,166524,1,0,0:0:0:0: +182,192,166524,1,0,0:0:0:0: +329,192,166621,1,0,0:0:0:0: +402,192,166621,1,0,0:0:0:0: +475,192,166717,128,0,167103:0:0:0:0: +256,192,166717,1,0,0:0:0:0: +182,192,166717,1,0,0:0:0:0: +109,192,166717,1,0,0:0:0:0: +329,192,166814,1,0,0:0:0:0: +402,192,166814,1,0,0:0:0:0: +36,192,166910,1,0,0:0:0:0: +109,192,166910,1,0,0:0:0:0: +329,192,167006,1,0,0:0:0:0: +402,192,167006,1,0,0:0:0:0: +36,192,167103,128,0,167287:0:0:0:0: +182,192,167103,1,0,0:0:0:0: +109,192,167103,1,0,0:0:0:0: +256,192,167103,1,0,0:0:0:0: +402,192,167195,1,0,0:0:0:0: +329,192,167195,1,0,0:0:0:0: +475,192,167287,128,0,167839:0:0:0:0: +109,192,167287,1,0,0:0:0:0: +182,192,167287,1,0,0:0:0:0: +256,192,167379,1,0,0:0:0:0: +329,192,167379,1,0,0:0:0:0: +402,192,167471,1,0,0:0:0:0: +36,192,167471,1,0,0:0:0:0: +109,192,167471,1,0,0:0:0:0: +182,192,167563,1,0,0:0:0:0: +256,192,167563,1,0,0:0:0:0: +402,192,167655,1,0,0:0:0:0: +329,192,167655,1,0,0:0:0:0: +109,192,167747,1,0,0:0:0:0: +182,192,167747,1,0,0:0:0:0: +256,192,167839,1,0,0:0:0:0: +402,192,167839,1,0,0:0:0:0: +329,192,167839,1,0,0:0:0:0: +109,192,167931,1,0,0:0:0:0: +36,192,167931,1,0,0:0:0:0: +329,192,168023,1,0,0:0:0:0: +402,192,168023,1,0,0:0:0:0: +182,192,168115,1,0,0:0:0:0: +109,192,168115,1,0,0:0:0:0: +475,192,168207,128,0,168575:0:0:0:0: +256,192,168207,1,0,0:0:0:0: +329,192,168207,1,0,0:0:0:0: +402,192,168207,1,0,0:0:0:0: +36,192,168299,1,0,0:0:0:0: +109,192,168299,1,0,0:0:0:0: +329,192,168391,1,0,0:0:0:0: +402,192,168391,1,0,0:0:0:0: +182,192,168483,1,0,0:0:0:0: +109,192,168483,1,0,0:0:0:0: +36,192,168575,128,0,168923:0:0:0:0: +329,192,168575,1,0,0:0:0:0: +256,192,168575,1,0,0:0:0:0: +402,192,168575,1,0,0:0:0:0: +182,192,168662,1,0,0:0:0:0: +109,192,168662,1,0,0:0:0:0: +329,192,168749,1,0,0:0:0:0: +402,192,168749,1,0,0:0:0:0: +182,192,168836,1,0,0:0:0:0: +109,192,168836,1,0,0:0:0:0: +475,192,168923,128,0,169098:0:0:0:0: +256,192,168923,1,0,0:0:0:0: +329,192,168923,1,0,0:0:0:0: +402,192,168923,1,0,0:0:0:0: +109,192,169011,1,0,0:0:0:0: +182,192,169011,1,0,0:0:0:0: +36,192,169098,128,0,169447:0:0:0:0: +329,192,169098,1,0,0:0:0:0: +402,192,169098,1,0,0:0:0:0: +256,192,169185,1,0,0:0:0:0: +182,192,169185,1,0,0:0:0:0: +329,192,169272,1,0,0:0:0:0: +402,192,169272,1,0,0:0:0:0: +475,192,169272,1,0,0:0:0:0: +182,192,169359,1,0,0:0:0:0: +109,192,169359,1,0,0:0:0:0: +475,192,169447,128,0,169621:0:0:0:0: +256,192,169447,1,0,0:0:0:0: +329,192,169447,1,0,0:0:0:0: +182,192,169534,1,0,0:0:0:0: +109,192,169534,1,0,0:0:0:0: +36,192,169621,128,0,169795:0:0:0:0: +256,192,169621,1,0,0:0:0:0: +329,192,169621,1,0,0:0:0:0: +402,192,169621,1,0,0:0:0:0: +182,192,169708,1,0,0:0:0:0: +109,192,169708,1,0,0:0:0:0: +475,192,169795,128,0,169970:0:0:0:0: +329,192,169795,1,0,0:0:0:0: +402,192,169795,1,0,0:0:0:0: +109,192,169883,1,0,0:0:0:0: +182,192,169883,1,0,0:0:0:0: +36,192,169970,128,0,170136:0:0:0:0: +329,192,169970,1,0,0:0:0:0: +402,192,169970,1,0,0:0:0:0: +256,192,169970,1,0,0:0:0:0: +109,192,170053,1,0,0:0:0:0: +182,192,170053,1,0,0:0:0:0: +475,192,170136,128,0,170636:0:0:0:0: +402,192,170136,1,0,0:0:0:0: +329,192,170136,1,0,0:0:0:0: +36,192,170220,1,0,0:0:0:0: +109,192,170220,1,0,0:0:0:0: +402,192,170303,1,0,0:0:0:0: +256,192,170303,1,0,0:0:0:0: +329,192,170303,1,0,0:0:0:0: +109,192,170386,1,0,0:0:0:0: +36,192,170386,1,0,0:0:0:0: +182,192,170470,1,0,0:0:0:0: +256,192,170470,1,0,0:0:0:0: +329,192,170553,1,0,0:0:0:0: +402,192,170553,1,0,0:0:0:0: +182,192,170636,1,0,0:0:0:0: +109,192,170636,1,0,0:0:0:0: +36,192,170636,1,0,0:0:0:0: +256,192,170720,1,0,0:0:0:0: +329,192,170720,1,0,0:0:0:0: +402,192,170803,1,0,0:0:0:0: +475,192,170803,1,0,0:0:0:0: +329,192,170886,1,0,0:0:0:0: +256,192,170886,1,0,0:0:0:0: +109,192,170970,128,0,171303:0:0:0:0: +182,192,170970,1,0,0:0:0:0: +36,192,170970,1,0,0:0:0:0: +402,192,170970,1,0,0:0:0:0: +475,192,170970,1,0,0:0:0:0: +329,192,171136,1,0,0:0:0:0: +475,192,171136,1,0,0:0:0:0: +36,192,171136,1,0,0:0:0:0: +182,192,171303,128,0,171618:0:0:0:0: +36,192,171303,1,0,0:0:0:0: +256,192,171303,1,0,0:0:0:0: +402,192,171303,1,0,0:0:0:0: +475,192,171303,1,0,0:0:0:0: +256,192,171460,1,0,0:0:0:0: +402,192,171460,1,0,0:0:0:0: +36,192,171460,1,0,0:0:0:0: +329,192,171618,128,0,171934:0:0:0:0: +36,192,171618,1,0,0:0:0:0: +256,192,171618,1,0,0:0:0:0: +475,192,171618,1,0,0:0:0:0: +109,192,171618,1,0,0:0:0:0: +109,192,171776,1,0,0:0:0:0: +256,192,171776,1,0,0:0:0:0: +475,192,171776,1,0,0:0:0:0: +402,192,171934,128,0,172250:0:0:0:0: +109,192,171934,1,0,0:0:0:0: +182,192,171934,1,0,0:0:0:0: +475,192,171934,1,0,0:0:0:0: +36,192,171934,1,0,0:0:0:0: +182,192,172092,1,0,0:0:0:0: +329,192,172092,1,0,0:0:0:0: +36,192,172092,1,0,0:0:0:0: +475,192,172250,128,0,172565:0:0:0:0: +36,192,172250,1,0,0:0:0:0: +256,192,172250,1,0,0:0:0:0: +329,192,172565,128,0,172881:0:0:0:0: +36,192,172565,1,0,0:0:0:0: +182,192,172565,1,0,0:0:0:0: +36,192,172881,128,0,173197:0:0:0:0: +182,192,172881,1,0,0:0:0:0: +402,192,172881,1,0,0:0:0:0: +182,192,173197,128,0,173513:0:0:0:0: +329,192,173197,1,0,0:0:0:0: +475,192,173197,1,0,0:0:0:0: +109,192,173513,128,0,173671:0:0:0:0: +256,192,173513,128,0,173671:0:0:0:0: +36,192,173513,1,0,0:0:0:0: +329,192,173513,1,0,0:0:0:0: +475,192,173513,1,0,0:0:0:0: +36,192,173671,128,0,173828:0:0:0:0: +182,192,173671,128,0,173828:0:0:0:0: +402,192,173671,1,0,0:0:0:0: +475,192,173671,1,0,0:0:0:0: +475,192,173828,128,0,174065:0:0:0:0: +329,192,173828,128,0,174065:0:0:0:0: +402,192,173828,1,0,0:0:0:0: +256,192,173828,1,0,0:0:0:0: +182,192,173986,1,0,0:0:0:0: +36,192,173986,1,0,0:0:0:0: +36,192,174144,128,0,174302:0:0:0:0: +402,192,174144,1,0,0:0:0:0: +182,192,174144,128,0,174302:0:0:0:0: +329,192,174144,1,0,0:0:0:0: +475,192,174144,1,0,0:0:0:0: +109,192,174302,128,0,174460:0:0:0:0: +402,192,174302,1,0,0:0:0:0: +256,192,174302,128,0,174460:0:0:0:0: +475,192,174302,1,0,0:0:0:0: +36,192,174460,128,0,174697:0:0:0:0: +182,192,174460,128,0,174697:0:0:0:0: +475,192,174460,1,0,0:0:0:0: +329,192,174460,1,0,0:0:0:0: +329,192,174618,1,0,0:0:0:0: +256,192,174697,1,0,0:0:0:0: +329,192,174776,128,0,175013:0:0:0:0: +475,192,174776,128,0,175013:0:0:0:0: +402,192,174776,1,0,0:0:0:0: +36,192,174776,1,0,0:0:0:0: +182,192,174776,1,0,0:0:0:0: +36,192,174934,1,0,0:0:0:0: +109,192,174934,1,0,0:0:0:0: +256,192,175092,128,0,175250:0:0:0:0: +402,192,175092,128,0,175250:0:0:0:0: +475,192,175092,1,0,0:0:0:0: +36,192,175092,128,0,175250:0:0:0:0: +109,192,175092,1,0,0:0:0:0: +329,192,175250,128,0,175407:0:0:0:0: +475,192,175250,128,0,175407:0:0:0:0: +182,192,175250,1,0,0:0:0:0: +109,192,175328,1,0,0:0:0:0: +36,192,175407,128,0,175644:0:0:0:0: +402,192,175407,128,0,175644:0:0:0:0: +256,192,175407,1,0,0:0:0:0: +182,192,175486,128,0,175644:0:0:0:0: +109,192,175486,1,0,0:0:0:0: +329,192,175565,1,0,0:0:0:0: +256,192,175644,1,0,0:0:0:0: +475,192,175723,128,0,175960:0:0:0:0: +36,192,175723,128,0,175960:0:0:0:0: +109,192,175723,128,0,175802:0:0:0:0: +402,192,175723,128,0,175960:0:0:0:0: +182,192,175802,128,0,175881:0:0:0:0: +256,192,175881,128,0,175960:0:0:0:0: +109,192,175960,128,0,176039:0:0:0:0: +329,192,175960,128,0,176039:0:0:0:0: +182,192,176039,128,0,176276:0:0:0:0: +36,192,176039,128,0,176276:0:0:0:0: +402,192,176039,128,0,176197:0:0:0:0: +256,192,176039,128,0,176197:0:0:0:0: +475,192,176039,1,0,0:0:0:0: +475,192,176197,128,0,176355:0:0:0:0: +329,192,176197,128,0,176355:0:0:0:0: +36,192,176355,128,0,176592:0:0:0:0: +182,192,176355,128,0,176592:0:0:0:0: +109,192,176355,1,0,0:0:0:0: +256,192,176355,1,0,0:0:0:0: +402,192,176434,128,0,176671:0:0:0:0: +329,192,176513,128,0,176671:0:0:0:0: +256,192,176592,128,0,176671:0:0:0:0: +182,192,176671,128,0,176750:0:0:0:0: +36,192,176671,128,0,176907:0:0:0:0: +475,192,176671,128,0,176828:0:0:0:0: +109,192,176671,1,0,0:0:0:0: +109,192,176828,128,0,176907:0:0:0:0: +402,192,176828,128,0,176986:0:0:0:0: +256,192,176828,128,0,176907:0:0:0:0: +475,192,176986,128,0,177223:0:0:0:0: +329,192,176986,128,0,177065:0:0:0:0: +109,192,176986,128,0,177223:0:0:0:0: +36,192,176986,1,0,0:0:0:0: +182,192,177065,128,0,177223:0:0:0:0: +256,192,177144,128,0,177223:0:0:0:0: +402,192,177144,128,0,177223:0:0:0:0: +329,192,177302,128,0,177539:0:0:0:0: +475,192,177302,128,0,177539:0:0:0:0: +256,192,177302,128,0,177381:0:0:0:0: +36,192,177302,128,0,177381:0:0:0:0: +402,192,177302,1,0,0:0:0:0: +36,192,177460,128,0,177539:0:0:0:0: +182,192,177460,128,0,177539:0:0:0:0: +109,192,177460,1,0,0:0:0:0: +256,192,177618,128,0,177776:0:0:0:0: +402,192,177618,128,0,177776:0:0:0:0: +475,192,177618,1,0,0:0:0:0: +109,192,177618,128,0,177697:0:0:0:0: +36,192,177697,128,0,177855:0:0:0:0: +182,192,177697,128,0,177855:0:0:0:0: +329,192,177776,128,0,177934:0:0:0:0: +475,192,177776,128,0,177934:0:0:0:0: +109,192,177855,128,0,178013:0:0:0:0: +256,192,177855,128,0,178013:0:0:0:0: +182,192,177934,128,0,178092:0:0:0:0: +36,192,177934,128,0,178092:0:0:0:0: +475,192,178013,128,0,178092:0:0:0:0: +329,192,178013,128,0,178092:0:0:0:0: +402,192,178092,128,0,178171:0:0:0:0: +256,192,178092,128,0,178171:0:0:0:0: +329,192,178171,128,0,178250:0:0:0:0: +182,192,178171,128,0,178250:0:0:0:0: +36,192,178250,128,0,178486:0:0:0:0: +475,192,178250,128,0,178407:0:0:0:0: +109,192,178250,128,0,178407:0:0:0:0: +329,192,178328,1,0,0:0:0:0: +256,192,178328,128,0,178407:0:0:0:0: +182,192,178407,128,0,178486:0:0:0:0: +402,192,178407,128,0,178486:0:0:0:0: +109,192,178486,128,0,178565:0:0:0:0: +329,192,178486,128,0,178565:0:0:0:0: +182,192,178565,128,0,178802:0:0:0:0: +36,192,178565,128,0,178802:0:0:0:0: +402,192,178565,128,0,178723:0:0:0:0: +256,192,178565,128,0,178723:0:0:0:0: +475,192,178565,1,0,0:0:0:0: +475,192,178723,128,0,178881:0:0:0:0: +329,192,178723,128,0,178881:0:0:0:0: +36,192,178881,128,0,179118:0:0:0:0: +182,192,178881,128,0,179118:0:0:0:0: +109,192,178881,1,0,0:0:0:0: +256,192,178881,1,0,0:0:0:0: +402,192,178960,128,0,179197:0:0:0:0: +329,192,179039,128,0,179197:0:0:0:0: +256,192,179118,128,0,179197:0:0:0:0: +182,192,179197,128,0,179355:0:0:0:0: +36,192,179197,128,0,179434:0:0:0:0: +475,192,179197,128,0,179355:0:0:0:0: +109,192,179197,1,0,0:0:0:0: +109,192,179355,128,0,179434:0:0:0:0: +402,192,179355,128,0,179513:0:0:0:0: +256,192,179355,128,0,179513:0:0:0:0: +475,192,179513,128,0,179750:0:0:0:0: +329,192,179513,128,0,179592:0:0:0:0: +109,192,179513,128,0,179592:0:0:0:0: +36,192,179513,1,0,0:0:0:0: +182,192,179592,128,0,179671:0:0:0:0: +256,192,179671,128,0,179750:0:0:0:0: +402,192,179671,128,0,179750:0:0:0:0: +36,192,179671,128,0,179907:0:0:0:0: +109,192,179750,128,0,179907:0:0:0:0: +329,192,179828,128,0,180065:0:0:0:0: +475,192,179828,128,0,180065:0:0:0:0: +256,192,179828,128,0,179907:0:0:0:0: +402,192,179828,1,0,0:0:0:0: +36,192,179986,128,0,180065:0:0:0:0: +182,192,179986,128,0,180065:0:0:0:0: +109,192,179986,1,0,0:0:0:0: +256,192,180144,128,0,180381:0:0:0:0: +109,192,180144,128,0,180381:0:0:0:0: +475,192,180144,128,0,180223:0:0:0:0: +329,192,180144,128,0,180223:0:0:0:0: +36,192,180144,1,0,0:0:0:0: +182,192,180302,128,0,180539:0:0:0:0: +36,192,180302,128,0,180539:0:0:0:0: +402,192,180302,128,0,180381:0:0:0:0: +475,192,180460,128,0,180618:0:0:0:0: +109,192,180460,128,0,180776:0:0:0:0: +329,192,180460,1,0,0:0:0:0: +402,192,180539,128,0,180697:0:0:0:0: +256,192,180539,1,0,0:0:0:0: +329,192,180618,128,0,180776:0:0:0:0: +182,192,180618,1,0,0:0:0:0: +256,192,180697,128,0,180934:0:0:0:0: +36,192,180776,128,0,181013:0:0:0:0: +475,192,180776,128,0,181013:0:0:0:0: +182,192,180776,128,0,181013:0:0:0:0: +402,192,180855,128,0,180934:0:0:0:0: +329,192,180934,128,0,181013:0:0:0:0: +402,192,181013,128,0,181092:0:0:0:0: +329,192,181092,128,0,181328:0:0:0:0: +475,192,181092,128,0,181328:0:0:0:0: +109,192,181092,128,0,181250:0:0:0:0: +256,192,181092,128,0,181250:0:0:0:0: +36,192,181092,1,0,0:0:0:0: +36,192,181250,128,0,181407:0:0:0:0: +182,192,181250,128,0,181407:0:0:0:0: +475,192,181407,128,0,181644:0:0:0:0: +329,192,181407,128,0,181644:0:0:0:0: +402,192,181407,1,0,0:0:0:0: +256,192,181407,1,0,0:0:0:0: +109,192,181486,128,0,181723:0:0:0:0: +182,192,181565,128,0,181723:0:0:0:0: +256,192,181644,128,0,181723:0:0:0:0: +329,192,181723,128,0,181802:0:0:0:0: +475,192,181723,128,0,181960:0:0:0:0: +36,192,181723,128,0,182039:0:0:0:0: +402,192,181723,1,0,0:0:0:0: +402,192,181881,128,0,181960:0:0:0:0: +182,192,181881,128,0,182039:0:0:0:0: +256,192,181881,128,0,181960:0:0:0:0: +475,192,182039,128,0,182276:0:0:0:0: +329,192,182039,128,0,182118:0:0:0:0: +109,192,182039,128,0,182197:0:0:0:0: +182,192,182118,128,0,182276:0:0:0:0: +256,192,182197,128,0,182276:0:0:0:0: +402,192,182197,128,0,182276:0:0:0:0: +36,192,182197,128,0,182434:0:0:0:0: +109,192,182276,128,0,182434:0:0:0:0: +256,192,182355,128,0,182434:0:0:0:0: +329,192,182355,128,0,182592:0:0:0:0: +402,192,182355,1,0,0:0:0:0: +475,192,182355,128,0,182592:0:0:0:0: +36,192,182513,128,0,182592:0:0:0:0: +109,192,182513,1,0,0:0:0:0: +182,192,182513,128,0,182592:0:0:0:0: +329,192,182671,128,0,182907:0:0:0:0: +475,192,182671,128,0,182907:0:0:0:0: +109,192,182671,128,0,182750:0:0:0:0: +256,192,182671,128,0,182750:0:0:0:0: +36,192,182671,128,0,182907:0:0:0:0: +182,192,182750,128,0,182986:0:0:0:0: +402,192,182750,128,0,182828:0:0:0:0: +109,192,182828,128,0,182907:0:0:0:0: +256,192,182907,128,0,182986:0:0:0:0: +402,192,182907,128,0,182986:0:0:0:0: +109,192,182986,128,0,183065:0:0:0:0: +329,192,182986,128,0,183223:0:0:0:0: +475,192,182986,128,0,183460:0:0:0:0: +36,192,182986,128,0,183065:0:0:0:0: +182,192,183065,128,0,183144:0:0:0:0: +402,192,183144,128,0,183223:0:0:0:0: +36,192,183144,128,0,183302:0:0:0:0: +256,192,183144,128,0,183223:0:0:0:0: +182,192,183223,128,0,183381:0:0:0:0: +109,192,183302,128,0,183460:0:0:0:0: +329,192,183302,128,0,183460:0:0:0:0: +256,192,183381,128,0,183539:0:0:0:0: +36,192,183381,128,0,183539:0:0:0:0: +402,192,183460,128,0,183539:0:0:0:0: +182,192,183460,128,0,183618:0:0:0:0: +329,192,183539,128,0,183618:0:0:0:0: +36,192,183618,1,0,0:0:0:0: +402,192,183618,1,0,0:0:0:0: +475,192,183618,1,0,0:0:0:0: +109,192,183618,128,0,183934:0:0:0:0: +182,192,183934,128,0,184250:0:0:0:0: +256,192,184250,128,0,184565:0:0:0:0: +329,192,184565,128,0,184881:0:0:0:0: +36,192,184881,128,0,185355:0:0:0:0: +109,192,184881,128,0,185355:0:0:0:0: +475,192,184881,1,0,0:0:0:0: +256,192,184881,1,0,0:0:0:0: +475,192,185098,128,0,185592:0:0:0:0: +182,192,185098,1,0,0:0:0:0: +329,192,185098,128,0,185592:0:0:0:0: +36,192,185513,128,0,185750:0:0:0:0: +182,192,185513,128,0,185750:0:0:0:0: +109,192,185513,1,0,0:0:0:0: +329,192,185671,128,0,185828:0:0:0:0: +475,192,185671,128,0,185828:0:0:0:0: +402,192,185671,1,0,0:0:0:0: +36,192,185828,128,0,186039:0:0:0:0: +109,192,185828,128,0,186039:0:0:0:0: +182,192,185828,1,0,0:0:0:0: +475,192,186039,128,0,186302:0:0:0:0: +402,192,186039,128,0,186302:0:0:0:0: +256,192,186039,1,0,0:0:0:0: +329,192,186039,1,0,0:0:0:0: +182,192,186302,128,0,186618:0:0:0:0: +36,192,186302,128,0,186618:0:0:0:0: +256,192,186302,1,0,0:0:0:0: +402,192,186618,128,0,186934:0:0:0:0: +475,192,186618,1,0,0:0:0:0: +109,192,186657,128,0,186736:0:0:0:0: +182,192,186677,128,0,186756:0:0:0:0: +256,192,186697,128,0,186776:0:0:0:0: +36,192,186776,128,0,186934:0:0:0:0: +329,192,186934,128,0,187250:0:0:0:0: +475,192,186934,128,0,187250:0:0:0:0: +256,192,186934,1,0,0:0:0:0: +182,192,186986,1,0,0:0:0:0: +109,192,186986,1,0,0:0:0:0: +109,192,187250,128,0,187723:0:0:0:0: +36,192,187250,128,0,187723:0:0:0:0: +256,192,187250,1,0,0:0:0:0: +329,192,187407,1,0,0:0:0:0: +475,192,187407,1,0,0:0:0:0: +329,192,187625,128,0,187881:0:0:0:0: +475,192,187644,128,0,187881:0:0:0:0: +36,192,187881,128,0,188434:0:0:0:0: +109,192,187881,1,0,0:0:0:0: +256,192,187881,1,0,0:0:0:0: +402,192,188000,128,0,188157:0:0:0:0: +475,192,188039,128,0,188256:0:0:0:0: +329,192,188157,128,0,188355:0:0:0:0: +402,192,188256,128,0,188473:0:0:0:0: +256,192,188355,128,0,188513:0:0:0:0: +329,192,188473,128,0,188592:0:0:0:0: +182,192,188513,128,0,188671:0:0:0:0: +36,192,188513,128,0,188671:0:0:0:0: +256,192,188592,128,0,188671:0:0:0:0: +109,192,188671,1,0,0:0:0:0: +329,192,188671,1,0,0:0:0:0: +402,192,188671,1,0,0:0:0:0: +475,192,188671,1,0,0:0:0:0: +182,192,188828,1,0,0:0:0:0: +109,192,188828,1,0,0:0:0:0: +329,192,188828,1,0,0:0:0:0: +402,192,188828,1,0,0:0:0:0: +36,192,189144,1,0,0:0:0:0: +475,192,189144,1,0,0:0:0:0: +329,192,189144,1,0,0:0:0:0: +182,192,189144,1,0,0:0:0:0: +36,192,189460,1,0,0:0:0:0: +329,192,189460,1,0,0:0:0:0: +475,192,189460,1,0,0:0:0:0: +182,192,189460,1,0,0:0:0:0: +256,192,189460,1,0,0:0:0:0: +475,192,189776,1,0,0:0:0:0: +36,192,189776,1,0,0:0:0:0: +182,192,189776,1,0,0:0:0:0: +402,192,189828,1,0,0:0:0:0: +329,192,189881,1,0,0:0:0:0: +475,192,189934,128,0,191039:0:0:0:0: +256,192,189934,1,0,0:0:0:0: +109,192,189934,1,0,0:0:0:0: +36,192,189934,1,0,0:0:0:0: +182,192,189934,1,0,0:0:0:0: +109,192,190092,128,0,190250:0:0:0:0: +256,192,190092,1,0,0:0:0:0: +329,192,190092,1,0,0:0:0:0: +256,192,190250,128,0,190407:0:0:0:0: +182,192,190250,1,0,0:0:0:0: +402,192,190250,1,0,0:0:0:0: +36,192,190250,1,0,0:0:0:0: +402,192,190407,128,0,190565:0:0:0:0: +109,192,190407,1,0,0:0:0:0: +36,192,190407,1,0,0:0:0:0: +36,192,190565,128,0,190723:0:0:0:0: +329,192,190565,1,0,0:0:0:0: +182,192,190565,1,0,0:0:0:0: +256,192,190565,1,0,0:0:0:0: +182,192,190723,128,0,190881:0:0:0:0: +402,192,190723,1,0,0:0:0:0: +109,192,190723,1,0,0:0:0:0: +329,192,190881,128,0,191039:0:0:0:0: +402,192,190881,1,0,0:0:0:0: +256,192,190881,1,0,0:0:0:0: +36,192,190881,1,0,0:0:0:0: +256,192,191039,128,0,191197:0:0:0:0: +109,192,191039,128,0,191197:0:0:0:0: +182,192,191039,1,0,0:0:0:0: +36,192,191039,1,0,0:0:0:0: +329,192,191197,1,0,0:0:0:0: +475,192,191197,1,0,0:0:0:0: +182,192,191197,1,0,0:0:0:0: +36,192,191197,1,0,0:0:0:0: +475,192,191355,128,0,191513:0:0:0:0: +329,192,191355,128,0,191513:0:0:0:0: +182,192,191355,1,0,0:0:0:0: +36,192,191355,1,0,0:0:0:0: +256,192,191513,1,0,0:0:0:0: +109,192,191513,1,0,0:0:0:0: +402,192,191513,1,0,0:0:0:0: +36,192,191513,1,0,0:0:0:0: +182,192,191671,128,0,191828:0:0:0:0: +36,192,191671,128,0,191828:0:0:0:0: +329,192,191671,1,0,0:0:0:0: +475,192,191671,1,0,0:0:0:0: +402,192,191828,1,0,0:0:0:0: +256,192,191828,1,0,0:0:0:0: +109,192,191828,1,0,0:0:0:0: +475,192,191828,1,0,0:0:0:0: +402,192,191986,128,0,192144:0:0:0:0: +256,192,191986,128,0,192144:0:0:0:0: +182,192,191986,1,0,0:0:0:0: +36,192,191986,1,0,0:0:0:0: +109,192,192144,1,0,0:0:0:0: +329,192,192144,1,0,0:0:0:0: +475,192,192144,1,0,0:0:0:0: +36,192,192144,1,0,0:0:0:0: +182,192,192223,1,0,0:0:0:0: +256,192,192223,1,0,0:0:0:0: +329,192,192302,1,0,0:0:0:0: +475,192,192302,1,0,0:0:0:0: +36,192,192302,1,0,0:0:0:0: +182,192,192381,1,0,0:0:0:0: +109,192,192381,1,0,0:0:0:0: +256,192,192460,1,0,0:0:0:0: +402,192,192460,1,0,0:0:0:0: +475,192,192460,1,0,0:0:0:0: +36,192,192460,128,0,193723:0:0:0:0: +329,192,192460,1,0,0:0:0:0: +182,192,192618,128,0,192776:0:0:0:0: +475,192,192618,1,0,0:0:0:0: +329,192,192618,1,0,0:0:0:0: +329,192,192776,128,0,192934:0:0:0:0: +475,192,192776,1,0,0:0:0:0: +256,192,192776,1,0,0:0:0:0: +109,192,192776,1,0,0:0:0:0: +475,192,192934,128,0,193092:0:0:0:0: +402,192,192934,1,0,0:0:0:0: +182,192,192934,1,0,0:0:0:0: +109,192,193092,128,0,193250:0:0:0:0: +182,192,193092,1,0,0:0:0:0: +402,192,193092,1,0,0:0:0:0: +256,192,193092,1,0,0:0:0:0: +402,192,193250,128,0,193407:0:0:0:0: +329,192,193250,1,0,0:0:0:0: +475,192,193250,1,0,0:0:0:0: +256,192,193407,128,0,193565:0:0:0:0: +475,192,193407,1,0,0:0:0:0: +182,192,193407,1,0,0:0:0:0: +109,192,193407,1,0,0:0:0:0: +109,192,193565,128,0,193723:0:0:0:0: +329,192,193565,1,0,0:0:0:0: +475,192,193565,1,0,0:0:0:0: +475,192,193723,128,0,194907:0:0:0:0: +402,192,193723,1,0,0:0:0:0: +256,192,193723,1,0,0:0:0:0: +182,192,193723,1,0,0:0:0:0: +329,192,193881,128,0,194039:0:0:0:0: +182,192,193881,1,0,0:0:0:0: +36,192,193881,1,0,0:0:0:0: +182,192,194039,128,0,194197:0:0:0:0: +36,192,194039,1,0,0:0:0:0: +256,192,194039,1,0,0:0:0:0: +402,192,194039,1,0,0:0:0:0: +36,192,194197,128,0,194355:0:0:0:0: +402,192,194197,1,0,0:0:0:0: +256,192,194197,1,0,0:0:0:0: +109,192,194355,128,0,194513:0:0:0:0: +329,192,194355,128,0,194907:0:0:0:0: +182,192,194355,1,0,0:0:0:0: +402,192,194355,1,0,0:0:0:0: +182,192,194513,128,0,194671:0:0:0:0: +36,192,194513,1,0,0:0:0:0: +256,192,194513,1,0,0:0:0:0: +402,192,194671,128,0,194907:0:0:0:0: +256,192,194671,128,0,194907:0:0:0:0: +109,192,194671,1,0,0:0:0:0: +36,192,194671,1,0,0:0:0:0: +109,192,194828,128,0,194907:0:0:0:0: +36,192,194828,128,0,194907:0:0:0:0: +475,192,194986,128,0,195223:0:0:0:0: +36,192,194986,1,0,0:0:0:0: +182,192,194986,128,0,195144:0:0:0:0: +329,192,194986,1,0,0:0:0:0: +109,192,194986,1,0,0:0:0:0: +329,192,195144,128,0,195460:0:0:0:0: +36,192,195144,1,0,0:0:0:0: +256,192,195144,1,0,0:0:0:0: +475,192,195302,128,0,195460:0:0:0:0: +182,192,195302,1,0,0:0:0:0: +109,192,195302,1,0,0:0:0:0: +36,192,195460,128,0,195697:0:0:0:0: +109,192,195460,1,0,0:0:0:0: +402,192,195460,1,0,0:0:0:0: +256,192,195460,128,0,195618:0:0:0:0: +182,192,195460,1,0,0:0:0:0: +182,192,195618,128,0,195934:0:0:0:0: +329,192,195618,1,0,0:0:0:0: +475,192,195618,1,0,0:0:0:0: +36,192,195776,128,0,195934:0:0:0:0: +329,192,195776,1,0,0:0:0:0: +402,192,195776,1,0,0:0:0:0: +402,192,195934,128,0,196171:0:0:0:0: +329,192,195934,1,0,0:0:0:0: +475,192,195934,1,0,0:0:0:0: +109,192,195934,128,0,196092:0:0:0:0: +256,192,195934,1,0,0:0:0:0: +256,192,196092,128,0,196407:0:0:0:0: +182,192,196092,1,0,0:0:0:0: +36,192,196092,1,0,0:0:0:0: +402,192,196250,128,0,196407:0:0:0:0: +109,192,196250,1,0,0:0:0:0: +475,192,196250,1,0,0:0:0:0: +182,192,196407,128,0,196723:0:0:0:0: +36,192,196407,128,0,196723:0:0:0:0: +329,192,196407,128,0,196565:0:0:0:0: +475,192,196407,1,0,0:0:0:0: +109,192,196407,1,0,0:0:0:0: +475,192,196565,128,0,197039:0:0:0:0: +256,192,196565,1,0,0:0:0:0: +109,192,196565,1,0,0:0:0:0: +329,192,196723,128,0,197039:0:0:0:0: +256,192,196723,1,0,0:0:0:0: +402,192,196723,1,0,0:0:0:0: +36,192,196881,128,0,197355:0:0:0:0: +182,192,196881,1,0,0:0:0:0: +109,192,196881,1,0,0:0:0:0: +182,192,197039,128,0,197355:0:0:0:0: +256,192,197039,1,0,0:0:0:0: +402,192,197039,1,0,0:0:0:0: +329,192,197197,128,0,197513:0:0:0:0: +475,192,197197,1,0,0:0:0:0: +402,192,197197,1,0,0:0:0:0: +475,192,197355,128,0,197513:0:0:0:0: +109,192,197355,1,0,0:0:0:0: +256,192,197355,1,0,0:0:0:0: +36,192,197513,128,0,197750:0:0:0:0: +402,192,197513,128,0,197671:0:0:0:0: +256,192,197513,128,0,197671:0:0:0:0: +182,192,197513,1,0,0:0:0:0: +109,192,197513,1,0,0:0:0:0: +182,192,197671,128,0,197986:0:0:0:0: +329,192,197671,1,0,0:0:0:0: +475,192,197671,128,0,197750:0:0:0:0: +109,192,197671,1,0,0:0:0:0: +36,192,197828,128,0,197986:0:0:0:0: +256,192,197828,1,0,0:0:0:0: +402,192,197828,128,0,197907:0:0:0:0: +329,192,197828,1,0,0:0:0:0: +475,192,197986,128,0,198223:0:0:0:0: +256,192,197986,128,0,198144:0:0:0:0: +109,192,197986,128,0,198144:0:0:0:0: +329,192,197986,1,0,0:0:0:0: +402,192,197986,1,0,0:0:0:0: +329,192,198144,128,0,198460:0:0:0:0: +36,192,198144,128,0,198223:0:0:0:0: +182,192,198144,1,0,0:0:0:0: +402,192,198144,1,0,0:0:0:0: +475,192,198302,128,0,198460:0:0:0:0: +109,192,198302,128,0,198381:0:0:0:0: +256,192,198302,1,0,0:0:0:0: +182,192,198302,1,0,0:0:0:0: +109,192,198460,128,0,198697:0:0:0:0: +182,192,198460,1,0,0:0:0:0: +36,192,198460,1,0,0:0:0:0: +402,192,198460,128,0,198618:0:0:0:0: +256,192,198460,1,0,0:0:0:0: +256,192,198618,128,0,198934:0:0:0:0: +329,192,198618,1,0,0:0:0:0: +475,192,198618,128,0,198697:0:0:0:0: +182,192,198618,1,0,0:0:0:0: +109,192,198776,128,0,198934:0:0:0:0: +36,192,198776,1,0,0:0:0:0: +402,192,198776,128,0,198855:0:0:0:0: +182,192,198776,1,0,0:0:0:0: +329,192,198934,128,0,199250:0:0:0:0: +475,192,198934,128,0,199250:0:0:0:0: +36,192,198934,1,0,0:0:0:0: +182,192,198934,128,0,199092:0:0:0:0: +402,192,198934,1,0,0:0:0:0: +36,192,199092,128,0,199565:0:0:0:0: +109,192,199092,1,0,0:0:0:0: +256,192,199092,128,0,199171:0:0:0:0: +182,192,199250,128,0,199565:0:0:0:0: +402,192,199250,128,0,199407:0:0:0:0: +109,192,199250,128,0,199328:0:0:0:0: +475,192,199407,128,0,199960:0:0:0:0: +329,192,199407,128,0,199960:0:0:0:0: +256,192,199407,1,0,0:0:0:0: +256,192,199565,128,0,199960:0:0:0:0: +109,192,199565,128,0,199960:0:0:0:0: +36,192,199723,128,0,199960:0:0:0:0: +182,192,199881,128,0,199960:0:0:0:0: +402,192,199881,128,0,199960:0:0:0:0: +182,192,200039,1,0,0:0:0:0: +36,192,200039,1,0,0:0:0:0: +329,192,200039,1,0,0:0:0:0: +475,192,200039,1,0,0:0:0:0: +329,192,200197,1,0,0:0:0:0: +182,192,200355,1,0,0:0:0:0: +329,192,200513,1,0,0:0:0:0: +182,192,200671,1,0,0:0:0:0: +36,192,200671,1,0,0:0:0:0: +329,192,200671,1,0,0:0:0:0: +475,192,200671,1,0,0:0:0:0: +329,192,200828,1,0,0:0:0:0: +182,192,200986,1,0,0:0:0:0: +36,192,200986,1,0,0:0:0:0: +256,192,200986,128,0,201539:0:0:0:0: +475,192,200986,1,0,0:0:0:0: +329,192,201144,1,0,0:0:0:0: +182,192,201302,1,0,0:0:0:0: +329,192,201460,1,0,0:0:0:0: +256,192,201618,128,0,202565:0:0:0:0: +36,192,201618,1,0,0:0:0:0: +329,192,201618,1,0,0:0:0:0: +475,192,201618,1,0,0:0:0:0: +182,192,201776,1,0,0:0:0:0: +329,192,201934,1,0,0:0:0:0: +182,192,201934,1,0,0:0:0:0: +36,192,201934,1,0,0:0:0:0: +475,192,201934,1,0,0:0:0:0: +182,192,202092,1,0,0:0:0:0: +402,192,202250,1,0,0:0:0:0: +329,192,202328,1,0,0:0:0:0: +182,192,202407,1,0,0:0:0:0: +109,192,202486,1,0,0:0:0:0: +36,192,202565,1,0,0:0:0:0: +475,192,202565,128,0,202644:0:0:0:0: +329,192,202565,1,0,0:0:0:0: +402,192,202644,128,0,202723:0:0:0:0: +256,192,202644,1,0,0:0:0:0: +329,192,202723,128,0,202802:0:0:0:0: +36,192,202723,1,0,0:0:0:0: +109,192,202723,1,0,0:0:0:0: +256,192,202802,128,0,202960:0:0:0:0: +182,192,202802,1,0,0:0:0:0: +329,192,202881,128,0,203039:0:0:0:0: +36,192,202881,1,0,0:0:0:0: +109,192,202881,1,0,0:0:0:0: +402,192,202960,128,0,203118:0:0:0:0: +182,192,202960,1,0,0:0:0:0: +475,192,203039,128,0,203197:0:0:0:0: +36,192,203039,1,0,0:0:0:0: +109,192,203039,1,0,0:0:0:0: +256,192,203118,1,0,0:0:0:0: +36,192,203197,128,0,203828:0:0:0:0: +182,192,203197,128,0,203355:0:0:0:0: +109,192,203197,1,0,0:0:0:0: +329,192,203197,1,0,0:0:0:0: +402,192,203276,1,0,0:0:0:0: +256,192,203276,128,0,203434:0:0:0:0: +475,192,203355,1,0,0:0:0:0: +329,192,203355,128,0,203513:0:0:0:0: +109,192,203434,128,0,203592:0:0:0:0: +402,192,203434,1,0,0:0:0:0: +182,192,203513,128,0,203671:0:0:0:0: +475,192,203513,1,0,0:0:0:0: +256,192,203592,128,0,203750:0:0:0:0: +402,192,203592,1,0,0:0:0:0: +109,192,203671,128,0,203828:0:0:0:0: +475,192,203671,1,0,0:0:0:0: +182,192,203750,128,0,203828:0:0:0:0: +329,192,203750,1,0,0:0:0:0: +475,192,203828,128,0,204776:0:0:0:0: +256,192,203828,128,0,203947:0:0:0:0: +402,192,203828,1,0,0:0:0:0: +329,192,203907,128,0,204026:0:0:0:0: +402,192,203986,128,0,204105:0:0:0:0: +182,192,203986,128,0,204105:0:0:0:0: +36,192,203986,1,0,0:0:0:0: +256,192,204065,128,0,204184:0:0:0:0: +329,192,204144,128,0,204263:0:0:0:0: +109,192,204144,128,0,204263:0:0:0:0: +36,192,204144,1,0,0:0:0:0: +182,192,204223,128,0,204342:0:0:0:0: +256,192,204302,128,0,204421:0:0:0:0: +36,192,204302,128,0,204381:0:0:0:0: +402,192,204302,1,0,0:0:0:0: +109,192,204381,128,0,204460:0:0:0:0: +36,192,204460,128,0,204776:0:0:0:0: +182,192,204460,128,0,204539:0:0:0:0: +329,192,204460,1,0,0:0:0:0: +256,192,204539,128,0,204618:0:0:0:0: +402,192,204539,1,0,0:0:0:0: +329,192,204618,128,0,204697:0:0:0:0: +109,192,204618,1,0,0:0:0:0: +402,192,204697,128,0,204776:0:0:0:0: +182,192,204697,1,0,0:0:0:0: +256,192,204776,1,0,0:0:0:0: +109,192,204776,1,0,0:0:0:0: +329,192,204828,1,0,0:0:0:0: +402,192,204881,1,0,0:0:0:0: +182,192,204934,1,0,0:0:0:0: +256,192,204986,1,0,0:0:0:0: +329,192,205039,1,0,0:0:0:0: +109,192,205092,1,0,0:0:0:0: +36,192,205092,128,0,205565:0:0:0:0: +182,192,205092,128,0,205171:0:0:0:0: +475,192,205092,128,0,205407:0:0:0:0: +402,192,205092,128,0,205171:0:0:0:0: +329,192,205171,128,0,205250:0:0:0:0: +109,192,205250,1,0,0:0:0:0: +256,192,205250,128,0,205328:0:0:0:0: +402,192,205250,1,0,0:0:0:0: +329,192,205328,128,0,205407:0:0:0:0: +109,192,205407,1,0,0:0:0:0: +182,192,205407,128,0,205486:0:0:0:0: +402,192,205407,1,0,0:0:0:0: +256,192,205486,128,0,205565:0:0:0:0: +329,192,205486,1,0,0:0:0:0: +109,192,205565,128,0,205881:0:0:0:0: +475,192,205565,128,0,205723:0:0:0:0: +402,192,205565,1,0,0:0:0:0: +329,192,205644,128,0,205723:0:0:0:0: +182,192,205644,1,0,0:0:0:0: +256,192,205723,128,0,205881:0:0:0:0: +36,192,205723,1,0,0:0:0:0: +402,192,205802,128,0,205881:0:0:0:0: +182,192,205802,1,0,0:0:0:0: +36,192,205881,128,0,206039:0:0:0:0: +475,192,205881,128,0,206118:0:0:0:0: +329,192,205881,1,0,0:0:0:0: +402,192,205960,128,0,206039:0:0:0:0: +256,192,205960,1,0,0:0:0:0: +329,192,206039,128,0,206197:0:0:0:0: +109,192,206039,1,0,0:0:0:0: +182,192,206039,1,0,0:0:0:0: +256,192,206118,128,0,206197:0:0:0:0: +36,192,206197,128,0,206671:0:0:0:0: +475,192,206197,128,0,206276:0:0:0:0: +402,192,206197,1,0,0:0:0:0: +109,192,206197,1,0,0:0:0:0: +329,192,206276,128,0,206355:0:0:0:0: +182,192,206276,1,0,0:0:0:0: +256,192,206355,1,0,0:0:0:0: +402,192,206355,1,0,0:0:0:0: +475,192,206355,128,0,206592:0:0:0:0: +109,192,206355,128,0,206434:0:0:0:0: +182,192,206434,1,0,0:0:0:0: +329,192,206434,128,0,206592:0:0:0:0: +256,192,206513,1,0,0:0:0:0: +109,192,206513,128,0,206592:0:0:0:0: +402,192,206513,1,0,0:0:0:0: +182,192,206592,128,0,206671:0:0:0:0: +402,192,206671,128,0,206986:0:0:0:0: +475,192,206671,128,0,206828:0:0:0:0: +256,192,206671,128,0,206750:0:0:0:0: +109,192,206671,1,0,0:0:0:0: +36,192,206750,128,0,206828:0:0:0:0: +329,192,206828,128,0,206907:0:0:0:0: +182,192,206828,128,0,206907:0:0:0:0: +256,192,206828,1,0,0:0:0:0: +36,192,206907,128,0,206986:0:0:0:0: +109,192,206907,1,0,0:0:0:0: +475,192,206986,128,0,207223:0:0:0:0: +256,192,206986,128,0,207065:0:0:0:0: +329,192,206986,1,0,0:0:0:0: +182,192,206986,1,0,0:0:0:0: +109,192,207065,128,0,207144:0:0:0:0: +36,192,207065,1,0,0:0:0:0: +402,192,207144,128,0,207460:0:0:0:0: +329,192,207144,128,0,207223:0:0:0:0: +256,192,207144,1,0,0:0:0:0: +182,192,207223,1,0,0:0:0:0: +36,192,207223,128,0,207302:0:0:0:0: +329,192,207302,1,0,0:0:0:0: +475,192,207302,1,0,0:0:0:0: +109,192,207302,128,0,207381:0:0:0:0: +256,192,207302,1,0,0:0:0:0: +36,192,207381,128,0,207460:0:0:0:0: +182,192,207381,1,0,0:0:0:0: +109,192,207460,128,0,207934:0:0:0:0: +256,192,207460,128,0,207618:0:0:0:0: +475,192,207460,1,0,0:0:0:0: +402,192,207539,128,0,207618:0:0:0:0: +182,192,207618,1,0,0:0:0:0: +475,192,207618,128,0,207697:0:0:0:0: +36,192,207618,1,0,0:0:0:0: +329,192,207697,128,0,207855:0:0:0:0: +256,192,207697,1,0,0:0:0:0: +475,192,207776,128,0,207855:0:0:0:0: +182,192,207776,1,0,0:0:0:0: +36,192,207776,1,0,0:0:0:0: +402,192,207855,128,0,207934:0:0:0:0: +256,192,207855,1,0,0:0:0:0: +329,192,207934,128,0,208407:0:0:0:0: +182,192,207934,128,0,208092:0:0:0:0: +475,192,207934,1,0,0:0:0:0: +36,192,207934,128,0,208013:0:0:0:0: +109,192,208013,128,0,208171:0:0:0:0: +402,192,208013,1,0,0:0:0:0: +475,192,208092,128,0,208171:0:0:0:0: +36,192,208092,1,0,0:0:0:0: +256,192,208092,1,0,0:0:0:0: +402,192,208171,128,0,208250:0:0:0:0: +182,192,208171,1,0,0:0:0:0: +36,192,208250,128,0,208407:0:0:0:0: +109,192,208250,1,0,0:0:0:0: +475,192,208250,128,0,208328:0:0:0:0: +256,192,208328,128,0,208407:0:0:0:0: +182,192,208407,128,0,208723:0:0:0:0: +475,192,208407,128,0,208565:0:0:0:0: +402,192,208407,128,0,208486:0:0:0:0: +109,192,208407,1,0,0:0:0:0: +256,192,208486,1,0,0:0:0:0: +329,192,208565,128,0,208723:0:0:0:0: +109,192,208565,1,0,0:0:0:0: +36,192,208565,1,0,0:0:0:0: +402,192,208644,128,0,208723:0:0:0:0: +256,192,208644,1,0,0:0:0:0: +36,192,208723,128,0,209197:0:0:0:0: +475,192,208723,128,0,208802:0:0:0:0: +109,192,208723,1,0,0:0:0:0: +256,192,208802,128,0,208881:0:0:0:0: +329,192,208802,1,0,0:0:0:0: +475,192,208881,128,0,209039:0:0:0:0: +109,192,208881,1,0,0:0:0:0: +402,192,208881,128,0,209039:0:0:0:0: +182,192,208960,128,0,209039:0:0:0:0: +256,192,208960,1,0,0:0:0:0: +329,192,209039,128,0,209118:0:0:0:0: +109,192,209039,1,0,0:0:0:0: +402,192,209118,128,0,209276:0:0:0:0: +182,192,209118,1,0,0:0:0:0: +109,192,209197,128,0,209513:0:0:0:0: +256,192,209197,128,0,209276:0:0:0:0: +329,192,209197,1,0,0:0:0:0: +475,192,209276,128,0,209434:0:0:0:0: +182,192,209276,1,0,0:0:0:0: +329,192,209355,128,0,209434:0:0:0:0: +36,192,209355,1,0,0:0:0:0: +402,192,209434,128,0,209513:0:0:0:0: +256,192,209434,1,0,0:0:0:0: +329,192,209513,128,0,209671:0:0:0:0: +182,192,209513,128,0,209592:0:0:0:0: +36,192,209513,128,0,209671:0:0:0:0: +475,192,209513,1,0,0:0:0:0: +256,192,209592,128,0,209671:0:0:0:0: +475,192,209671,128,0,209828:0:0:0:0: +402,192,209671,128,0,209828:0:0:0:0: +109,192,209671,128,0,209750:0:0:0:0: +329,192,209750,128,0,209828:0:0:0:0: +182,192,209750,128,0,209828:0:0:0:0: +36,192,209828,128,0,209986:0:0:0:0: +256,192,209828,128,0,209907:0:0:0:0: +109,192,209828,1,0,0:0:0:0: +182,192,209907,128,0,209986:0:0:0:0: +256,192,209986,128,0,210065:0:0:0:0: +475,192,209986,128,0,210144:0:0:0:0: +329,192,209986,128,0,210144:0:0:0:0: +402,192,209986,1,0,0:0:0:0: +109,192,210065,128,0,210144:0:0:0:0: +402,192,210144,128,0,210460:0:0:0:0: +36,192,210144,128,0,210381:0:0:0:0: +256,192,210144,1,0,0:0:0:0: +182,192,210223,128,0,210302:0:0:0:0: +329,192,210223,1,0,0:0:0:0: +109,192,210302,128,0,210460:0:0:0:0: +475,192,210302,1,0,0:0:0:0: +256,192,210381,128,0,210460:0:0:0:0: +329,192,210460,128,0,210539:0:0:0:0: +36,192,210460,128,0,210776:0:0:0:0: +475,192,210460,128,0,210776:0:0:0:0: +182,192,210460,128,0,210539:0:0:0:0: +402,192,210539,128,0,210618:0:0:0:0: +256,192,210618,128,0,210697:0:0:0:0: +109,192,210618,1,0,0:0:0:0: +329,192,210697,128,0,210776:0:0:0:0: +182,192,210697,1,0,0:0:0:0: +109,192,210776,128,0,211092:0:0:0:0: +256,192,210776,128,0,211013:0:0:0:0: +402,192,210776,128,0,210855:0:0:0:0: +182,192,210855,1,0,0:0:0:0: +475,192,210934,128,0,211092:0:0:0:0: +402,192,210934,1,0,0:0:0:0: +36,192,210934,1,0,0:0:0:0: +329,192,211013,128,0,211092:0:0:0:0: +182,192,211092,128,0,211250:0:0:0:0: +402,192,211092,128,0,211171:0:0:0:0: +256,192,211092,1,0,0:0:0:0: +36,192,211092,128,0,211328:0:0:0:0: +109,192,211171,1,0,0:0:0:0: +329,192,211250,128,0,211328:0:0:0:0: +475,192,211250,128,0,211328:0:0:0:0: +402,192,211250,1,0,0:0:0:0: +182,192,211328,128,0,211407:0:0:0:0: +256,192,211328,1,0,0:0:0:0: +109,192,211407,128,0,211881:0:0:0:0: +475,192,211407,128,0,211486:0:0:0:0: +402,192,211407,1,0,0:0:0:0: +36,192,211407,128,0,211486:0:0:0:0: +329,192,211407,128,0,211565:0:0:0:0: +182,192,211486,128,0,211565:0:0:0:0: +256,192,211565,128,0,211881:0:0:0:0: +402,192,211565,128,0,211644:0:0:0:0: +36,192,211565,1,0,0:0:0:0: +475,192,211565,128,0,211644:0:0:0:0: +329,192,211644,128,0,211723:0:0:0:0: +182,192,211723,128,0,211802:0:0:0:0: +475,192,211723,1,0,0:0:0:0: +36,192,211723,128,0,211802:0:0:0:0: +329,192,211802,128,0,211881:0:0:0:0: +402,192,211881,128,0,212355:0:0:0:0: +36,192,211881,128,0,211960:0:0:0:0: +475,192,211881,128,0,211960:0:0:0:0: +329,192,211960,128,0,212039:0:0:0:0: +182,192,212039,128,0,212355:0:0:0:0: +256,192,212039,1,0,0:0:0:0: +36,192,212039,128,0,212118:0:0:0:0: +109,192,212039,1,0,0:0:0:0: +475,192,212118,128,0,212197:0:0:0:0: +36,192,212197,128,0,212276:0:0:0:0: +256,192,212197,1,0,0:0:0:0: +109,192,212197,128,0,212276:0:0:0:0: +329,192,212276,128,0,212355:0:0:0:0: +256,192,212355,128,0,212592:0:0:0:0: +109,192,212355,1,0,0:0:0:0: +36,192,212355,128,0,212434:0:0:0:0: +475,192,212355,128,0,212434:0:0:0:0: +182,192,212434,128,0,212592:0:0:0:0: +402,192,212434,1,0,0:0:0:0: +475,192,212513,128,0,212592:0:0:0:0: +36,192,212513,128,0,212592:0:0:0:0: +329,192,212513,128,0,212592:0:0:0:0: +109,192,212592,1,0,0:0:0:0: +402,192,212671,128,0,212907:0:0:0:0: +182,192,212671,128,0,212750:0:0:0:0: +36,192,212671,128,0,212750:0:0:0:0: +329,192,212671,128,0,212750:0:0:0:0: +475,192,212671,128,0,212750:0:0:0:0: +256,192,212671,128,0,212907:0:0:0:0: +329,192,212828,128,0,212907:0:0:0:0: +475,192,212828,128,0,212907:0:0:0:0: +36,192,212828,128,0,212907:0:0:0:0: +182,192,212828,128,0,212907:0:0:0:0: +182,192,212986,128,0,213144:0:0:0:0: +475,192,212986,128,0,213065:0:0:0:0: +36,192,212986,128,0,213065:0:0:0:0: +256,192,213065,128,0,213302:0:0:0:0: +402,192,213065,128,0,213144:0:0:0:0: +109,192,213065,128,0,213144:0:0:0:0: +329,192,213144,128,0,213223:0:0:0:0: +475,192,213144,128,0,213223:0:0:0:0: +36,192,213144,128,0,213223:0:0:0:0: +182,192,213223,128,0,213381:0:0:0:0: +402,192,213223,128,0,213302:0:0:0:0: +36,192,213302,128,0,213381:0:0:0:0: +475,192,213302,128,0,213381:0:0:0:0: +329,192,213302,128,0,213539:0:0:0:0: +109,192,213302,128,0,213539:0:0:0:0: +475,192,213460,128,0,213539:0:0:0:0: +182,192,213460,128,0,213539:0:0:0:0: +36,192,213460,128,0,213539:0:0:0:0: +402,192,213460,128,0,213539:0:0:0:0: +36,192,213618,128,0,213776:0:0:0:0: +475,192,213618,128,0,213776:0:0:0:0: +256,192,213618,128,0,213697:0:0:0:0: +182,192,213697,128,0,213776:0:0:0:0: +329,192,213697,128,0,213776:0:0:0:0: +256,192,213776,128,0,213855:0:0:0:0: +109,192,213776,128,0,213855:0:0:0:0: +402,192,213776,128,0,213855:0:0:0:0: +182,192,213855,128,0,213934:0:0:0:0: +36,192,213855,128,0,214092:0:0:0:0: +329,192,213934,128,0,214092:0:0:0:0: +475,192,213934,128,0,214092:0:0:0:0: +256,192,213934,1,0,0:0:0:0: +402,192,213934,1,0,0:0:0:0: +109,192,214013,128,0,214250:0:0:0:0: +402,192,214092,128,0,214250:0:0:0:0: +256,192,214092,128,0,214250:0:0:0:0: +36,192,214171,1,0,0:0:0:0: +182,192,214171,128,0,214407:0:0:0:0: +329,192,214250,128,0,214407:0:0:0:0: +475,192,214250,128,0,214407:0:0:0:0: +36,192,214328,128,0,214486:0:0:0:0: +256,192,214407,1,0,0:0:0:0: +109,192,214407,128,0,214486:0:0:0:0: +402,192,214407,1,0,0:0:0:0: +182,192,214486,128,0,214565:0:0:0:0: +329,192,214486,1,0,0:0:0:0: +256,192,214565,128,0,214644:0:0:0:0: +475,192,214565,1,0,0:0:0:0: +182,192,214644,128,0,214723:0:0:0:0: +402,192,214644,1,0,0:0:0:0: +109,192,214723,128,0,214802:0:0:0:0: +329,192,214723,1,0,0:0:0:0: +475,192,214723,128,0,214881:0:0:0:0: +36,192,214802,128,0,214881:0:0:0:0: +256,192,214802,1,0,0:0:0:0: +402,192,214802,128,0,214960:0:0:0:0: +182,192,214881,1,0,0:0:0:0: +329,192,214881,128,0,215039:0:0:0:0: +256,192,214960,128,0,215118:0:0:0:0: +109,192,214960,1,0,0:0:0:0: +182,192,215039,128,0,215197:0:0:0:0: +36,192,215039,1,0,0:0:0:0: +475,192,215039,1,0,0:0:0:0: +109,192,215118,128,0,215197:0:0:0:0: +402,192,215118,1,0,0:0:0:0: +36,192,215197,128,0,215671:0:0:0:0: +329,192,215197,128,0,215355:0:0:0:0: +475,192,215197,128,0,215434:0:0:0:0: +256,192,215197,128,0,215276:0:0:0:0: +109,192,215276,128,0,215434:0:0:0:0: +256,192,215355,128,0,215513:0:0:0:0: +402,192,215355,128,0,215434:0:0:0:0: +182,192,215434,128,0,215513:0:0:0:0: +402,192,215513,128,0,215592:0:0:0:0: +329,192,215513,1,0,0:0:0:0: +109,192,215513,128,0,215592:0:0:0:0: +475,192,215513,128,0,215592:0:0:0:0: +256,192,215592,128,0,215671:0:0:0:0: +402,192,215671,128,0,215750:0:0:0:0: +109,192,215671,128,0,215828:0:0:0:0: +475,192,215671,128,0,215986:0:0:0:0: +182,192,215750,1,0,0:0:0:0: +329,192,215750,128,0,215828:0:0:0:0: +402,192,215828,128,0,215907:0:0:0:0: +36,192,215828,128,0,215986:0:0:0:0: +256,192,215828,128,0,215907:0:0:0:0: +182,192,215907,128,0,215986:0:0:0:0: +329,192,215986,128,0,216065:0:0:0:0: +109,192,215986,128,0,216302:0:0:0:0: +402,192,215986,128,0,216065:0:0:0:0: +182,192,216065,128,0,216144:0:0:0:0: +256,192,216065,1,0,0:0:0:0: +329,192,216144,128,0,216223:0:0:0:0: +36,192,216144,1,0,0:0:0:0: +475,192,216144,1,0,0:0:0:0: +256,192,216223,1,0,0:0:0:0: +402,192,216223,128,0,216302:0:0:0:0: +329,192,216302,128,0,216776:0:0:0:0: +182,192,216302,128,0,216381:0:0:0:0: +36,192,216302,128,0,216539:0:0:0:0: +475,192,216302,128,0,216618:0:0:0:0: +256,192,216381,128,0,216460:0:0:0:0: +109,192,216460,128,0,216539:0:0:0:0: +402,192,216460,1,0,0:0:0:0: +182,192,216539,128,0,216618:0:0:0:0: +256,192,216539,1,0,0:0:0:0: +36,192,216618,128,0,216776:0:0:0:0: +402,192,216618,1,0,0:0:0:0: +109,192,216618,128,0,216697:0:0:0:0: +256,192,216697,128,0,216776:0:0:0:0: +475,192,216776,128,0,217092:0:0:0:0: +109,192,216776,128,0,217013:0:0:0:0: +402,192,216776,128,0,216855:0:0:0:0: +182,192,216776,1,0,0:0:0:0: +256,192,216855,128,0,216934:0:0:0:0: +329,192,216855,1,0,0:0:0:0: +402,192,216934,128,0,217013:0:0:0:0: +182,192,216934,1,0,0:0:0:0: +36,192,216934,1,0,0:0:0:0: +329,192,217013,128,0,217092:0:0:0:0: +256,192,217013,1,0,0:0:0:0: +182,192,217092,128,0,217250:0:0:0:0: +36,192,217092,128,0,217171:0:0:0:0: +402,192,217092,128,0,217171:0:0:0:0: +109,192,217171,128,0,217407:0:0:0:0: +329,192,217171,128,0,217328:0:0:0:0: +256,192,217250,128,0,217407:0:0:0:0: +475,192,217250,128,0,217328:0:0:0:0: +36,192,217250,1,0,0:0:0:0: +402,192,217328,128,0,217486:0:0:0:0: +36,192,217407,128,0,217565:0:0:0:0: +475,192,217407,1,0,0:0:0:0: +182,192,217407,128,0,217486:0:0:0:0: +109,192,217486,128,0,217644:0:0:0:0: +329,192,217486,128,0,217565:0:0:0:0: +475,192,217565,128,0,218039:0:0:0:0: +182,192,217565,128,0,217723:0:0:0:0: +256,192,217565,1,0,0:0:0:0: +402,192,217565,1,0,0:0:0:0: +329,192,217644,128,0,217723:0:0:0:0: +36,192,217723,128,0,217960:0:0:0:0: +109,192,217723,1,0,0:0:0:0: +402,192,217723,128,0,217802:0:0:0:0: +256,192,217802,128,0,217881:0:0:0:0: +329,192,217802,1,0,0:0:0:0: +109,192,217881,128,0,218039:0:0:0:0: +402,192,217881,128,0,217960:0:0:0:0: +182,192,217960,128,0,218039:0:0:0:0: +256,192,217960,1,0,0:0:0:0: +402,192,218039,128,0,218118:0:0:0:0: +329,192,218039,1,0,0:0:0:0: +36,192,218039,128,0,218118:0:0:0:0: +182,192,218118,128,0,218197:0:0:0:0: +256,192,218118,1,0,0:0:0:0: +329,192,218197,128,0,218355:0:0:0:0: +109,192,218197,128,0,218276:0:0:0:0: +402,192,218197,1,0,0:0:0:0: +475,192,218197,128,0,218276:0:0:0:0: +36,192,218276,128,0,218355:0:0:0:0: +256,192,218276,1,0,0:0:0:0: +182,192,218355,128,0,218434:0:0:0:0: +109,192,218355,1,0,0:0:0:0: +475,192,218355,128,0,218513:0:0:0:0: +402,192,218434,128,0,218513:0:0:0:0: +256,192,218434,1,0,0:0:0:0: +109,192,218513,128,0,218828:0:0:0:0: +182,192,218513,128,0,218592:0:0:0:0: +36,192,218513,1,0,0:0:0:0: +329,192,218513,1,0,0:0:0:0: +256,192,218592,128,0,218671:0:0:0:0: +402,192,218592,1,0,0:0:0:0: +475,192,218671,128,0,218750:0:0:0:0: +36,192,218671,1,0,0:0:0:0: +329,192,218671,128,0,218750:0:0:0:0: +256,192,218750,128,0,218828:0:0:0:0: +36,192,218828,128,0,219223:0:0:0:0: +475,192,218828,128,0,218986:0:0:0:0: +182,192,218828,1,0,0:0:0:0: +402,192,218828,1,0,0:0:0:0: +329,192,218907,128,0,218986:0:0:0:0: +256,192,218907,1,0,0:0:0:0: +182,192,218986,128,0,219144:0:0:0:0: +402,192,218986,128,0,219065:0:0:0:0: +109,192,218986,1,0,0:0:0:0: +329,192,219065,128,0,219144:0:0:0:0: +256,192,219065,1,0,0:0:0:0: +475,192,219144,128,0,219302:0:0:0:0: +109,192,219144,128,0,219223:0:0:0:0: +402,192,219223,128,0,219302:0:0:0:0: +329,192,219223,1,0,0:0:0:0: +109,192,219302,128,0,219618:0:0:0:0: +256,192,219302,128,0,219381:0:0:0:0: +36,192,219302,128,0,219381:0:0:0:0: +182,192,219302,1,0,0:0:0:0: +329,192,219381,128,0,219460:0:0:0:0: +402,192,219381,1,0,0:0:0:0: +182,192,219460,128,0,219539:0:0:0:0: +475,192,219460,128,0,219618:0:0:0:0: +402,192,219539,128,0,219618:0:0:0:0: +256,192,219539,128,0,219618:0:0:0:0: +36,192,219618,128,0,219855:0:0:0:0: +182,192,219618,128,0,219697:0:0:0:0: +329,192,219697,128,0,219776:0:0:0:0: +475,192,219776,128,0,220092:0:0:0:0: +182,192,219776,128,0,219855:0:0:0:0: +256,192,219776,1,0,0:0:0:0: +402,192,219776,1,0,0:0:0:0: +329,192,219855,128,0,219934:0:0:0:0: +36,192,219934,128,0,220250:0:0:0:0: +256,192,219934,1,0,0:0:0:0: +109,192,219934,1,0,0:0:0:0: +182,192,219934,128,0,220092:0:0:0:0: +402,192,220092,128,0,220250:0:0:0:0: +256,192,220092,128,0,220250:0:0:0:0: +329,192,220092,1,0,0:0:0:0: +109,192,220092,1,0,0:0:0:0: +475,192,220250,128,0,220565:0:0:0:0: +109,192,220250,128,0,220328:0:0:0:0: +329,192,220250,128,0,220328:0:0:0:0: +182,192,220250,1,0,0:0:0:0: +256,192,220328,128,0,220407:0:0:0:0: +402,192,220328,1,0,0:0:0:0: +36,192,220407,128,0,220565:0:0:0:0: +109,192,220407,1,0,0:0:0:0: +329,192,220407,128,0,220486:0:0:0:0: +182,192,220486,128,0,220565:0:0:0:0: +402,192,220486,128,0,220565:0:0:0:0: +256,192,220565,128,0,220881:0:0:0:0: +329,192,220565,128,0,220644:0:0:0:0: +109,192,220565,1,0,0:0:0:0: +402,192,220644,128,0,220723:0:0:0:0: +182,192,220644,1,0,0:0:0:0: +475,192,220723,128,0,220881:0:0:0:0: +109,192,220723,128,0,220802:0:0:0:0: +36,192,220723,128,0,220802:0:0:0:0: +402,192,220802,128,0,220881:0:0:0:0: +329,192,220802,1,0,0:0:0:0: +36,192,220881,128,0,221118:0:0:0:0: +182,192,220881,128,0,220960:0:0:0:0: +109,192,220881,1,0,0:0:0:0: +329,192,220960,128,0,221039:0:0:0:0: +402,192,220960,1,0,0:0:0:0: +256,192,221039,128,0,221118:0:0:0:0: +475,192,221039,1,0,0:0:0:0: +109,192,221039,128,0,221118:0:0:0:0: +402,192,221118,128,0,221197:0:0:0:0: +256,192,221197,128,0,221513:0:0:0:0: +36,192,221197,128,0,221513:0:0:0:0: +475,192,221197,128,0,221355:0:0:0:0: +329,192,221197,1,0,0:0:0:0: +182,192,221197,128,0,221276:0:0:0:0: +402,192,221276,128,0,221434:0:0:0:0: +109,192,221276,128,0,221355:0:0:0:0: +329,192,221355,128,0,221434:0:0:0:0: +182,192,221355,128,0,221434:0:0:0:0: +475,192,221434,128,0,221513:0:0:0:0: +182,192,221513,128,0,221671:0:0:0:0: +329,192,221513,128,0,221671:0:0:0:0: +402,192,221513,128,0,221592:0:0:0:0: +109,192,221513,1,0,0:0:0:0: +475,192,221592,128,0,221671:0:0:0:0: +256,192,221671,128,0,221986:0:0:0:0: +109,192,221671,128,0,221986:0:0:0:0: +402,192,221671,128,0,221750:0:0:0:0: +36,192,221671,1,0,0:0:0:0: +329,192,221750,128,0,221828:0:0:0:0: +475,192,221828,128,0,221986:0:0:0:0: +182,192,221828,1,0,0:0:0:0: +36,192,221828,1,0,0:0:0:0: +402,192,221907,128,0,221986:0:0:0:0: +36,192,221986,128,0,222302:0:0:0:0: +182,192,221986,128,0,222302:0:0:0:0: +329,192,221986,128,0,222144:0:0:0:0: +402,192,222065,128,0,222223:0:0:0:0: +475,192,222144,128,0,222302:0:0:0:0: +109,192,222144,1,0,0:0:0:0: +256,192,222223,128,0,222302:0:0:0:0: +329,192,222302,128,0,222381:0:0:0:0: +402,192,222381,128,0,222460:0:0:0:0: +182,192,222381,128,0,222460:0:0:0:0: +36,192,222381,128,0,222460:0:0:0:0: +475,192,222460,128,0,222776:0:0:0:0: +329,192,222460,128,0,222776:0:0:0:0: +109,192,222460,128,0,222539:0:0:0:0: +256,192,222460,128,0,222539:0:0:0:0: +182,192,222539,128,0,222618:0:0:0:0: +36,192,222618,128,0,222697:0:0:0:0: +109,192,222618,128,0,222697:0:0:0:0: +402,192,222618,128,0,222697:0:0:0:0: +256,192,222697,128,0,222776:0:0:0:0: +36,192,222776,128,0,223486:0:0:0:0: +402,192,222776,128,0,222934:0:0:0:0: +109,192,222776,128,0,222934:0:0:0:0: +182,192,222776,128,0,222855:0:0:0:0: +329,192,222855,128,0,223013:0:0:0:0: +256,192,222934,128,0,223092:0:0:0:0: +182,192,223013,128,0,223171:0:0:0:0: +475,192,223013,128,0,223407:0:0:0:0: +402,192,223092,128,0,223328:0:0:0:0: +109,192,223092,128,0,223250:0:0:0:0: +329,192,223171,128,0,223250:0:0:0:0: +182,192,223250,128,0,223328:0:0:0:0: +256,192,223328,128,0,223407:0:0:0:0: +329,192,223407,128,0,223486:0:0:0:0: +109,192,223407,128,0,223565:0:0:0:0: +402,192,223486,128,0,223565:0:0:0:0: +182,192,223486,128,0,223644:0:0:0:0: +475,192,223565,128,0,223644:0:0:0:0: +256,192,223565,128,0,223723:0:0:0:0: +36,192,223565,128,0,223644:0:0:0:0: +329,192,223644,128,0,223802:0:0:0:0: +475,192,223723,128,0,224039:0:0:0:0: +402,192,223723,128,0,223881:0:0:0:0: +109,192,223723,128,0,223881:0:0:0:0: +36,192,223723,1,0,0:0:0:0: +182,192,223802,128,0,223960:0:0:0:0: +256,192,223881,128,0,224039:0:0:0:0: +36,192,223881,128,0,223960:0:0:0:0: +329,192,223960,128,0,224039:0:0:0:0: +109,192,223960,128,0,224039:0:0:0:0: +36,192,224039,128,0,224355:0:0:0:0: +182,192,224039,128,0,224118:0:0:0:0: +402,192,224039,128,0,224118:0:0:0:0: +329,192,224118,128,0,224197:0:0:0:0: +475,192,224118,128,0,224197:0:0:0:0: +256,192,224197,128,0,224355:0:0:0:0: +109,192,224197,128,0,224276:0:0:0:0: +402,192,224276,128,0,224355:0:0:0:0: +475,192,224276,1,0,0:0:0:0: +109,192,224355,128,0,224513:0:0:0:0: +329,192,224355,128,0,224592:0:0:0:0: +182,192,224355,128,0,224434:0:0:0:0: +475,192,224434,128,0,224513:0:0:0:0: +36,192,224434,128,0,224592:0:0:0:0: +402,192,224513,128,0,224671:0:0:0:0: +182,192,224513,128,0,224592:0:0:0:0: +256,192,224592,128,0,224671:0:0:0:0: +109,192,224592,1,0,0:0:0:0: +475,192,224671,128,0,224750:0:0:0:0: +182,192,224671,128,0,224907:0:0:0:0: +329,192,224671,128,0,224750:0:0:0:0: +36,192,224671,128,0,224750:0:0:0:0: +256,192,224750,128,0,224828:0:0:0:0: +329,192,224828,128,0,224986:0:0:0:0: +36,192,224828,1,0,0:0:0:0: +109,192,224828,1,0,0:0:0:0: +475,192,224828,128,0,224907:0:0:0:0: +256,192,224907,128,0,224986:0:0:0:0: +402,192,224907,1,0,0:0:0:0: +109,192,224986,128,0,225223:0:0:0:0: +475,192,224986,128,0,225065:0:0:0:0: +36,192,224986,128,0,225223:0:0:0:0: +182,192,224986,1,0,0:0:0:0: +402,192,225065,128,0,225144:0:0:0:0: +256,192,225065,1,0,0:0:0:0: +329,192,225144,128,0,225223:0:0:0:0: +182,192,225144,1,0,0:0:0:0: +256,192,225223,128,0,225302:0:0:0:0: +36,192,225302,128,0,226013:0:0:0:0: +475,192,225302,128,0,226013:0:0:0:0: +402,192,225302,1,0,0:0:0:0: +329,192,225302,1,0,0:0:0:0: +182,192,225302,1,0,0:0:0:0: +109,192,225302,1,0,0:0:0:0: +329,192,225460,1,0,0:0:0:0: +109,192,225460,1,0,0:0:0:0: +256,192,225460,1,0,0:0:0:0: +329,192,225776,1,0,0:0:0:0: +256,192,225776,1,0,0:0:0:0: +109,192,225776,1,0,0:0:0:0: +402,192,225934,1,0,0:0:0:0: +329,192,225934,1,0,0:0:0:0: +182,192,225934,1,0,0:0:0:0: +475,192,226092,1,0,0:0:0:0: +36,192,226092,1,0,0:0:0:0: +109,192,226092,1,0,0:0:0:0: +402,192,226092,1,0,0:0:0:0: +256,192,226092,1,0,0:0:0:0: +475,192,226250,128,0,226486:0:0:0:0: +36,192,226250,128,0,226486:0:0:0:0: +329,192,226250,1,0,0:0:0:0: +182,192,226250,1,0,0:0:0:0: +109,192,226250,1,0,0:0:0:0: +402,192,226407,1,0,0:0:0:0: +256,192,226407,1,0,0:0:0:0: +182,192,226407,1,0,0:0:0:0: +475,192,226565,128,0,227197:0:0:0:0: +36,192,226565,128,0,227197:0:0:0:0: +402,192,226723,1,0,0:0:0:0: +256,192,226723,1,0,0:0:0:0: +109,192,226723,1,0,0:0:0:0: +402,192,226881,1,0,0:0:0:0: +256,192,226881,1,0,0:0:0:0: +109,192,226881,1,0,0:0:0:0: +402,192,227197,1,0,0:0:0:0: +329,192,227197,1,0,0:0:0:0: +182,192,227197,1,0,0:0:0:0: +256,192,227276,1,0,0:0:0:0: +109,192,227276,1,0,0:0:0:0: +182,192,227355,1,0,0:0:0:0: +36,192,227355,1,0,0:0:0:0: +402,192,227434,1,0,0:0:0:0: +475,192,227434,1,0,0:0:0:0: +329,192,227434,1,0,0:0:0:0: +109,192,227513,1,0,0:0:0:0: +182,192,227513,1,0,0:0:0:0: +36,192,227513,1,0,0:0:0:0: +256,192,227592,1,0,0:0:0:0: +109,192,227671,1,0,0:0:0:0: +329,192,227671,1,0,0:0:0:0: +36,192,227671,1,0,0:0:0:0: +402,192,227750,1,0,0:0:0:0: +182,192,227750,1,0,0:0:0:0: +256,192,227828,1,0,0:0:0:0: +329,192,227828,1,0,0:0:0:0: +475,192,227828,1,0,0:0:0:0: +36,192,227828,128,0,228144:0:0:0:0: +182,192,228144,1,0,0:0:0:0: +475,192,228144,128,0,228381:0:0:0:0: +109,192,228144,1,0,0:0:0:0: +256,192,228144,1,0,0:0:0:0: +402,192,228184,128,0,228381:0:0:0:0: +329,192,228223,128,0,228381:0:0:0:0: +475,192,228460,128,0,228776:0:0:0:0: +36,192,228776,128,0,229013:0:0:0:0: +402,192,228776,1,0,0:0:0:0: +329,192,228776,1,0,0:0:0:0: +256,192,228776,1,0,0:0:0:0: +109,192,228815,128,0,229013:0:0:0:0: +182,192,228855,128,0,229013:0:0:0:0: +402,192,229092,128,0,229407:0:0:0:0: +109,192,229407,128,0,229644:0:0:0:0: +329,192,229407,1,0,0:0:0:0: +475,192,229407,1,0,0:0:0:0: +36,192,229407,1,0,0:0:0:0: +182,192,229447,128,0,229644:0:0:0:0: +256,192,229486,128,0,229644:0:0:0:0: +109,192,229723,128,0,230039:0:0:0:0: +402,192,229881,128,0,230197:0:0:0:0: +329,192,229921,128,0,230197:0:0:0:0: +256,192,229960,128,0,230197:0:0:0:0: +182,192,230197,128,0,230513:0:0:0:0: +36,192,230197,128,0,230513:0:0:0:0: +475,192,230197,1,0,0:0:0:0: +109,192,230197,1,0,0:0:0:0: +402,192,230513,128,0,230750:0:0:0:0: +475,192,230513,1,0,0:0:0:0: +329,192,230513,1,0,0:0:0:0: +256,192,230513,128,0,230592:0:0:0:0: +329,192,230671,128,0,230907:0:0:0:0: +36,192,230671,1,0,0:0:0:0: +475,192,230671,1,0,0:0:0:0: +182,192,230671,128,0,230750:0:0:0:0: +256,192,230828,128,0,231065:0:0:0:0: +402,192,230828,1,0,0:0:0:0: +36,192,230828,1,0,0:0:0:0: +109,192,230828,128,0,230907:0:0:0:0: +475,192,230986,128,0,231065:0:0:0:0: +329,192,230986,128,0,231223:0:0:0:0: +36,192,230986,1,0,0:0:0:0: +182,192,230986,128,0,231065:0:0:0:0: +402,192,231144,128,0,231223:0:0:0:0: +256,192,231144,128,0,231381:0:0:0:0: +36,192,231144,1,0,0:0:0:0: +109,192,231144,128,0,231223:0:0:0:0: +329,192,231302,128,0,231381:0:0:0:0: +182,192,231302,128,0,231539:0:0:0:0: +475,192,231302,1,0,0:0:0:0: +36,192,231302,128,0,231381:0:0:0:0: +402,192,231381,1,0,0:0:0:0: +256,192,231460,128,0,231539:0:0:0:0: +109,192,231460,128,0,231539:0:0:0:0: +329,192,231460,1,0,0:0:0:0: +36,192,231460,1,0,0:0:0:0: +475,192,231460,128,0,231539:0:0:0:0: +402,192,231539,1,0,0:0:0:0: +329,192,231618,128,0,231934:0:0:0:0: +475,192,231618,128,0,231934:0:0:0:0: +182,192,231618,1,0,0:0:0:0: +36,192,231618,1,0,0:0:0:0: +109,192,231618,1,0,0:0:0:0: +256,192,231618,1,0,0:0:0:0: +109,192,231934,128,0,232250:0:0:0:0: +402,192,232250,128,0,232565:0:0:0:0: +109,192,232565,128,0,232881:0:0:0:0: +475,192,232881,128,0,233513:0:0:0:0: +36,192,232881,1,0,0:0:0:0: +256,192,232881,1,0,0:0:0:0: +402,192,232881,1,0,0:0:0:0: +109,192,233513,128,0,233828:0:0:0:0: +256,192,233513,1,0,0:0:0:0: +36,192,233513,1,0,0:0:0:0: +402,192,233828,128,0,234144:0:0:0:0: +256,192,233828,1,0,0:0:0:0: +475,192,233828,1,0,0:0:0:0: +182,192,234144,128,0,234776:0:0:0:0: +36,192,234144,1,0,0:0:0:0: +475,192,234144,1,0,0:0:0:0: +329,192,234776,128,0,235407:0:0:0:0: +36,192,234776,1,0,0:0:0:0: +475,192,234776,1,0,0:0:0:0: +475,192,235407,128,0,236039:0:0:0:0: +182,192,235407,1,0,0:0:0:0: +36,192,235407,1,0,0:0:0:0: +182,192,236039,128,0,236355:0:0:0:0: +36,192,236039,1,0,0:0:0:0: +329,192,236039,1,0,0:0:0:0: +329,192,236355,128,0,236671:0:0:0:0: +475,192,236355,1,0,0:0:0:0: +36,192,236355,1,0,0:0:0:0: +109,192,236671,128,0,237302:0:0:0:0: +256,192,236671,1,0,0:0:0:0: +475,192,236671,1,0,0:0:0:0: +36,192,236671,1,0,0:0:0:0: +402,192,237302,128,0,237934:0:0:0:0: +256,192,237302,1,0,0:0:0:0: +36,192,237302,1,0,0:0:0:0: +475,192,237302,1,0,0:0:0:0: +329,192,237934,128,0,238565:0:0:0:0: +109,192,237934,128,0,238250:0:0:0:0: +256,192,237934,1,0,0:0:0:0: +36,192,237934,1,0,0:0:0:0: +475,192,237934,1,0,0:0:0:0: +182,192,238250,128,0,238565:0:0:0:0: +36,192,238250,1,0,0:0:0:0: +109,192,238565,128,0,239197:0:0:0:0: +402,192,238565,128,0,238881:0:0:0:0: +36,192,238565,1,0,0:0:0:0: +475,192,238565,1,0,0:0:0:0: +475,192,238881,128,0,239197:0:0:0:0: +256,192,238881,1,0,0:0:0:0: +36,192,239197,128,0,239671:0:0:0:0: +402,192,239197,1,0,0:0:0:0: +256,192,239197,1,0,0:0:0:0: +256,192,239671,128,0,240460:0:0:0:0: +402,192,239671,128,0,240460:0:0:0:0: +109,192,239671,1,0,0:0:0:0: +475,192,240460,128,0,241723:0:0:0:0: +182,192,240460,1,0,0:0:0:0: +36,192,240460,1,0,0:0:0:0: +329,192,240460,1,0,0:0:0:0: +36,192,240776,128,0,241407:0:0:0:0: +256,192,240776,1,0,0:0:0:0: +402,192,240776,1,0,0:0:0:0: +182,192,241092,128,0,241407:0:0:0:0: +329,192,241092,1,0,0:0:0:0: +329,192,241407,128,0,241723:0:0:0:0: +109,192,241407,1,0,0:0:0:0: +256,192,241723,1,0,0:0:0:0: +36,192,241723,128,0,242355:0:0:0:0: +402,192,241723,1,0,0:0:0:0: +182,192,241723,128,0,242355:0:0:0:0: +329,192,242039,1,0,0:0:0:0: +475,192,242039,1,0,0:0:0:0: +402,192,242355,128,0,242986:0:0:0:0: +475,192,242355,1,0,0:0:0:0: +109,192,242355,1,0,0:0:0:0: +256,192,242355,128,0,242986:0:0:0:0: +109,192,242671,1,0,0:0:0:0: +329,192,242986,128,0,243618:0:0:0:0: +475,192,242986,128,0,243618:0:0:0:0: +36,192,242986,128,0,243302:0:0:0:0: +182,192,242986,1,0,0:0:0:0: +109,192,242986,1,0,0:0:0:0: +182,192,243302,128,0,243618:0:0:0:0: +109,192,243302,1,0,0:0:0:0: +36,192,243618,128,0,244250:0:0:0:0: +256,192,243618,128,0,244250:0:0:0:0: +402,192,243618,128,0,243934:0:0:0:0: +109,192,243618,1,0,0:0:0:0: +475,192,243934,128,0,244250:0:0:0:0: +329,192,243934,1,0,0:0:0:0: +402,192,244250,128,0,244881:0:0:0:0: +329,192,244250,128,0,244881:0:0:0:0: +109,192,244250,128,0,245513:0:0:0:0: +182,192,244250,1,0,0:0:0:0: +256,192,244565,1,0,0:0:0:0: +36,192,244565,1,0,0:0:0:0: +182,192,244565,1,0,0:0:0:0: +475,192,244881,128,0,245197:0:0:0:0: +36,192,244881,1,0,0:0:0:0: +256,192,244881,1,0,0:0:0:0: +329,192,245197,128,0,245513:0:0:0:0: +182,192,245197,1,0,0:0:0:0: +36,192,245513,128,0,246144:0:0:0:0: +475,192,245513,128,0,245828:0:0:0:0: +402,192,245513,1,0,0:0:0:0: +256,192,245513,1,0,0:0:0:0: +182,192,245513,128,0,246144:0:0:0:0: +329,192,245828,128,0,246144:0:0:0:0: +256,192,245828,1,0,0:0:0:0: +475,192,246144,128,0,246302:0:0:0:0: +109,192,246144,1,0,0:0:0:0: +256,192,246144,1,0,0:0:0:0: +402,192,246223,128,0,246381:0:0:0:0: +182,192,246223,1,0,0:0:0:0: +329,192,246302,128,0,246539:0:0:0:0: +109,192,246302,1,0,0:0:0:0: +256,192,246381,128,0,246460:0:0:0:0: +36,192,246381,1,0,0:0:0:0: +402,192,246460,128,0,246618:0:0:0:0: +109,192,246460,1,0,0:0:0:0: +475,192,246539,128,0,246697:0:0:0:0: +182,192,246539,1,0,0:0:0:0: +256,192,246618,128,0,246855:0:0:0:0: +329,192,246697,128,0,246934:0:0:0:0: +402,192,246776,128,0,247013:0:0:0:0: +475,192,246855,128,0,247092:0:0:0:0: +182,192,246934,128,0,247131:0:0:0:0: +256,192,247013,128,0,247210:0:0:0:0: +329,192,247092,128,0,247289:0:0:0:0: +402,192,247171,128,0,247368:0:0:0:0: +109,192,247250,128,0,247407:0:0:0:0: +182,192,247328,128,0,247486:0:0:0:0: +256,192,247407,128,0,247565:0:0:0:0: +36,192,247486,128,0,247605:0:0:0:0: +329,192,247486,128,0,247644:0:0:0:0: +109,192,247565,128,0,247684:0:0:0:0: +182,192,247644,128,0,247763:0:0:0:0: +256,192,247723,128,0,247842:0:0:0:0: +36,192,247802,128,0,247907:0:0:0:0: +109,192,247881,128,0,247986:0:0:0:0: +182,192,248039,1,0,0:0:0:0: +475,192,248039,1,0,0:0:0:0: +329,192,248039,128,0,248276:0:0:0:0: +36,192,248039,128,0,248276:0:0:0:0: +182,192,248197,128,0,248513:0:0:0:0: +475,192,248197,128,0,248355:0:0:0:0: +329,192,248355,128,0,248513:0:0:0:0: +36,192,248355,128,0,248513:0:0:0:0: +109,192,248513,128,0,248750:0:0:0:0: +256,192,248513,128,0,248750:0:0:0:0: +402,192,248513,1,0,0:0:0:0: +475,192,248513,1,0,0:0:0:0: +475,192,248671,128,0,248986:0:0:0:0: +329,192,248671,128,0,248828:0:0:0:0: +402,192,248671,128,0,248828:0:0:0:0: +109,192,248828,128,0,248986:0:0:0:0: +256,192,248828,128,0,248986:0:0:0:0: +329,192,248986,128,0,249223:0:0:0:0: +36,192,248986,128,0,249223:0:0:0:0: +182,192,248986,1,0,0:0:0:0: +402,192,248986,1,0,0:0:0:0: +182,192,249144,128,0,249460:0:0:0:0: +475,192,249144,128,0,249381:0:0:0:0: +329,192,249302,128,0,249460:0:0:0:0: +36,192,249302,128,0,249460:0:0:0:0: +109,192,249460,128,0,249697:0:0:0:0: +256,192,249460,128,0,249697:0:0:0:0: +402,192,249460,1,0,0:0:0:0: +475,192,249460,1,0,0:0:0:0: +475,192,249618,128,0,249934:0:0:0:0: +329,192,249618,128,0,249776:0:0:0:0: +402,192,249618,128,0,249776:0:0:0:0: +109,192,249776,128,0,249934:0:0:0:0: +256,192,249776,128,0,249934:0:0:0:0: +182,192,249934,1,0,0:0:0:0: +402,192,249934,1,0,0:0:0:0: +36,192,249934,128,0,250250:0:0:0:0: +329,192,250092,128,0,250486:0:0:0:0: +475,192,250092,128,0,250486:0:0:0:0: +109,192,250092,1,0,0:0:0:0: +402,192,250092,1,0,0:0:0:0: +256,192,250171,128,0,250486:0:0:0:0: +182,192,250250,128,0,250486:0:0:0:0: +109,192,250328,128,0,250486:0:0:0:0: +36,192,250407,128,0,250486:0:0:0:0: +109,192,250565,1,0,0:0:0:0: +329,192,250565,128,0,250723:0:0:0:0: +36,192,250565,128,0,250802:0:0:0:0: +475,192,250565,128,0,250723:0:0:0:0: +182,192,250565,1,0,0:0:0:0: +256,192,250723,1,0,0:0:0:0: +402,192,250723,1,0,0:0:0:0: +182,192,250723,128,0,251039:0:0:0:0: +402,192,250881,1,0,0:0:0:0: +36,192,250881,128,0,251039:0:0:0:0: +475,192,250881,1,0,0:0:0:0: +256,192,251039,128,0,251197:0:0:0:0: +475,192,251039,128,0,251276:0:0:0:0: +402,192,251039,1,0,0:0:0:0: +109,192,251039,128,0,251197:0:0:0:0: +329,192,251039,1,0,0:0:0:0: +329,192,251197,128,0,251513:0:0:0:0: +182,192,251197,1,0,0:0:0:0: +36,192,251197,1,0,0:0:0:0: +36,192,251355,1,0,0:0:0:0: +475,192,251355,128,0,251513:0:0:0:0: +109,192,251355,1,0,0:0:0:0: +109,192,251513,1,0,0:0:0:0: +402,192,251513,128,0,251671:0:0:0:0: +36,192,251513,128,0,251750:0:0:0:0: +256,192,251513,128,0,251671:0:0:0:0: +182,192,251513,1,0,0:0:0:0: +182,192,251671,128,0,251986:0:0:0:0: +475,192,251671,1,0,0:0:0:0: +329,192,251671,1,0,0:0:0:0: +402,192,251828,1,0,0:0:0:0: +36,192,251828,128,0,251986:0:0:0:0: +475,192,251828,1,0,0:0:0:0: +109,192,251986,128,0,252144:0:0:0:0: +475,192,251986,128,0,252302:0:0:0:0: +329,192,251986,128,0,252302:0:0:0:0: +402,192,251986,1,0,0:0:0:0: +256,192,251986,1,0,0:0:0:0: +182,192,252144,1,0,0:0:0:0: +36,192,252144,128,0,252618:0:0:0:0: +256,192,252144,1,0,0:0:0:0: +402,192,252302,1,0,0:0:0:0: +182,192,252302,128,0,252460:0:0:0:0: +109,192,252302,128,0,252460:0:0:0:0: +256,192,252460,128,0,252618:0:0:0:0: +475,192,252460,128,0,252934:0:0:0:0: +329,192,252460,128,0,252618:0:0:0:0: +182,192,252618,128,0,252776:0:0:0:0: +109,192,252618,128,0,252776:0:0:0:0: +36,192,252776,128,0,253092:0:0:0:0: +402,192,252776,128,0,252934:0:0:0:0: +256,192,252776,128,0,252934:0:0:0:0: +182,192,252934,128,0,253092:0:0:0:0: +329,192,252934,128,0,253092:0:0:0:0: +109,192,253092,128,0,253250:0:0:0:0: +256,192,253092,128,0,253250:0:0:0:0: +475,192,253092,128,0,253328:0:0:0:0: +402,192,253092,1,0,0:0:0:0: +329,192,253250,128,0,253565:0:0:0:0: +182,192,253250,128,0,253407:0:0:0:0: +36,192,253250,128,0,253407:0:0:0:0: +402,192,253407,1,0,0:0:0:0: +475,192,253407,128,0,253565:0:0:0:0: +109,192,253407,128,0,253565:0:0:0:0: +256,192,253407,1,0,0:0:0:0: +256,192,253565,128,0,253723:0:0:0:0: +402,192,253565,128,0,253723:0:0:0:0: +36,192,253565,128,0,253802:0:0:0:0: +182,192,253565,1,0,0:0:0:0: +182,192,253723,128,0,254039:0:0:0:0: +329,192,253723,128,0,253881:0:0:0:0: +475,192,253723,128,0,253881:0:0:0:0: +109,192,253723,1,0,0:0:0:0: +109,192,253881,1,0,0:0:0:0: +36,192,253881,128,0,254039:0:0:0:0: +402,192,253881,128,0,254039:0:0:0:0: +256,192,253881,1,0,0:0:0:0: +109,192,254039,128,0,254197:0:0:0:0: +475,192,254039,128,0,254276:0:0:0:0: +329,192,254039,128,0,254276:0:0:0:0: +256,192,254039,128,0,254513:0:0:0:0: +36,192,254197,128,0,254355:0:0:0:0: +182,192,254197,128,0,254355:0:0:0:0: +402,192,254197,1,0,0:0:0:0: +402,192,254355,1,0,0:0:0:0: +475,192,254355,128,0,254513:0:0:0:0: +329,192,254355,1,0,0:0:0:0: +109,192,254355,128,0,254513:0:0:0:0: +402,192,254513,1,0,0:0:0:0: +329,192,254513,128,0,254671:0:0:0:0: +182,192,254513,128,0,254828:0:0:0:0: +36,192,254513,128,0,254828:0:0:0:0: +109,192,254671,1,0,0:0:0:0: +475,192,254671,128,0,255144:0:0:0:0: +402,192,254671,1,0,0:0:0:0: +109,192,254828,128,0,254986:0:0:0:0: +329,192,254828,128,0,255144:0:0:0:0: +256,192,254828,1,0,0:0:0:0: +402,192,254828,1,0,0:0:0:0: +402,192,254986,1,0,0:0:0:0: +182,192,254986,128,0,255539:0:0:0:0: +36,192,254986,128,0,255539:0:0:0:0: +256,192,255144,128,0,255539:0:0:0:0: +109,192,255144,128,0,255539:0:0:0:0: +329,192,255302,128,0,255539:0:0:0:0: +475,192,255460,128,0,255539:0:0:0:0: +402,192,255460,128,0,255539:0:0:0:0: +182,192,255618,1,0,0:0:0:0: +36,192,255618,1,0,0:0:0:0: +329,192,255618,1,0,0:0:0:0: +475,192,255618,1,0,0:0:0:0: +182,192,255776,1,0,0:0:0:0: +329,192,255934,1,0,0:0:0:0: +182,192,256092,1,0,0:0:0:0: +182,192,256250,1,0,0:0:0:0: +36,192,256250,1,0,0:0:0:0: +329,192,256250,1,0,0:0:0:0: +475,192,256250,1,0,0:0:0:0: +182,192,256407,1,0,0:0:0:0: +256,192,256565,128,0,257118:0:0:0:0: +36,192,256565,1,0,0:0:0:0: +329,192,256565,1,0,0:0:0:0: +475,192,256565,1,0,0:0:0:0: +182,192,256723,1,0,0:0:0:0: +329,192,256881,1,0,0:0:0:0: +475,192,256881,1,0,0:0:0:0: +182,192,257039,1,0,0:0:0:0: +475,192,257039,1,0,0:0:0:0: +182,192,257197,1,0,0:0:0:0: +36,192,257197,1,0,0:0:0:0: +256,192,257197,128,0,258144:0:0:0:0: +475,192,257197,1,0,0:0:0:0: +329,192,257355,1,0,0:0:0:0: +475,192,257355,1,0,0:0:0:0: +475,192,257513,1,0,0:0:0:0: +36,192,257513,1,0,0:0:0:0: +182,192,257513,1,0,0:0:0:0: +329,192,257513,1,0,0:0:0:0: +329,192,257671,1,0,0:0:0:0: +475,192,257671,1,0,0:0:0:0: +109,192,257828,1,0,0:0:0:0: +475,192,257828,1,0,0:0:0:0: +182,192,257907,1,0,0:0:0:0: +329,192,257986,1,0,0:0:0:0: +475,192,257986,1,0,0:0:0:0: +402,192,258065,1,0,0:0:0:0: +36,192,258144,128,0,258223:0:0:0:0: +475,192,258144,1,0,0:0:0:0: +182,192,258144,1,0,0:0:0:0: +109,192,258223,128,0,258302:0:0:0:0: +256,192,258223,1,0,0:0:0:0: +402,192,258302,1,0,0:0:0:0: +475,192,258302,1,0,0:0:0:0: +182,192,258302,128,0,258381:0:0:0:0: +329,192,258381,1,0,0:0:0:0: +256,192,258381,128,0,258539:0:0:0:0: +402,192,258460,1,0,0:0:0:0: +475,192,258460,1,0,0:0:0:0: +182,192,258460,128,0,258618:0:0:0:0: +329,192,258539,1,0,0:0:0:0: +109,192,258539,128,0,258697:0:0:0:0: +402,192,258618,1,0,0:0:0:0: +475,192,258618,1,0,0:0:0:0: +36,192,258618,128,0,258776:0:0:0:0: +256,192,258697,1,0,0:0:0:0: +402,192,258776,1,0,0:0:0:0: +182,192,258776,1,0,0:0:0:0: +475,192,258776,128,0,259407:0:0:0:0: +329,192,258776,128,0,258934:0:0:0:0: +256,192,258855,128,0,259013:0:0:0:0: +109,192,258855,1,0,0:0:0:0: +182,192,258934,128,0,259092:0:0:0:0: +36,192,258934,1,0,0:0:0:0: +109,192,259013,1,0,0:0:0:0: +402,192,259013,128,0,259171:0:0:0:0: +36,192,259092,1,0,0:0:0:0: +329,192,259092,128,0,259250:0:0:0:0: +109,192,259171,1,0,0:0:0:0: +256,192,259171,128,0,259328:0:0:0:0: +36,192,259250,1,0,0:0:0:0: +402,192,259250,128,0,259407:0:0:0:0: +182,192,259328,1,0,0:0:0:0: +329,192,259328,128,0,259407:0:0:0:0: +109,192,259407,1,0,0:0:0:0: +256,192,259407,128,0,259526:0:0:0:0: +36,192,259407,128,0,260276:0:0:0:0: +182,192,259486,128,0,259605:0:0:0:0: +329,192,259565,128,0,259684:0:0:0:0: +109,192,259565,128,0,259684:0:0:0:0: +475,192,259565,128,0,259644:0:0:0:0: +256,192,259644,128,0,259763:0:0:0:0: +475,192,259723,1,0,0:0:0:0: +402,192,259723,128,0,259842:0:0:0:0: +182,192,259723,128,0,259842:0:0:0:0: +329,192,259802,128,0,259921:0:0:0:0: +475,192,259881,128,0,259960:0:0:0:0: +256,192,259881,128,0,260000:0:0:0:0: +109,192,259881,128,0,259960:0:0:0:0: +402,192,259960,128,0,260039:0:0:0:0: +329,192,260039,128,0,260197:0:0:0:0: +475,192,260039,128,0,260355:0:0:0:0: +182,192,260039,128,0,260118:0:0:0:0: +256,192,260118,128,0,260276:0:0:0:0: +109,192,260118,128,0,260197:0:0:0:0: +182,192,260197,128,0,260355:0:0:0:0: +402,192,260197,128,0,260276:0:0:0:0: +109,192,260276,128,0,260355:0:0:0:0: +329,192,260276,128,0,260355:0:0:0:0: +402,192,260355,1,0,0:0:0:0: +256,192,260355,1,0,0:0:0:0: +36,192,260355,1,0,0:0:0:0: +109,192,260407,1,0,0:0:0:0: +182,192,260460,1,0,0:0:0:0: +256,192,260513,1,0,0:0:0:0: +329,192,260565,1,0,0:0:0:0: +402,192,260618,1,0,0:0:0:0: +109,192,260671,1,0,0:0:0:0: +475,192,260671,1,0,0:0:0:0: +256,192,260671,1,0,0:0:0:0: +36,192,260671,128,0,260986:0:0:0:0: +329,192,260750,1,0,0:0:0:0: +402,192,260750,1,0,0:0:0:0: +182,192,260750,1,0,0:0:0:0: +256,192,260828,1,0,0:0:0:0: +109,192,260828,1,0,0:0:0:0: +475,192,260828,1,0,0:0:0:0: +402,192,260907,1,0,0:0:0:0: +182,192,260907,1,0,0:0:0:0: +475,192,260986,128,0,261302:0:0:0:0: +329,192,260986,128,0,261144:0:0:0:0: +109,192,260986,128,0,261065:0:0:0:0: +256,192,260986,128,0,261065:0:0:0:0: +402,192,261065,128,0,261223:0:0:0:0: +182,192,261065,128,0,261144:0:0:0:0: +256,192,261144,128,0,261223:0:0:0:0: +36,192,261144,128,0,261223:0:0:0:0: +329,192,261223,128,0,261302:0:0:0:0: +109,192,261223,128,0,261381:0:0:0:0: +256,192,261302,128,0,261460:0:0:0:0: +36,192,261302,128,0,261539:0:0:0:0: +402,192,261302,128,0,261460:0:0:0:0: +182,192,261381,128,0,261539:0:0:0:0: +109,192,261460,128,0,261618:0:0:0:0: +475,192,261460,128,0,261697:0:0:0:0: +329,192,261460,128,0,261539:0:0:0:0: +256,192,261539,128,0,261618:0:0:0:0: +329,192,261618,128,0,261697:0:0:0:0: +182,192,261618,128,0,261776:0:0:0:0: +36,192,261618,128,0,261855:0:0:0:0: +402,192,261697,128,0,261776:0:0:0:0: +256,192,261697,128,0,261776:0:0:0:0: +109,192,261776,128,0,261934:0:0:0:0: +475,192,261776,128,0,261855:0:0:0:0: +329,192,261776,128,0,261855:0:0:0:0: +256,192,261855,128,0,262013:0:0:0:0: +402,192,261934,128,0,262171:0:0:0:0: +36,192,261934,128,0,262092:0:0:0:0: +182,192,261934,128,0,262092:0:0:0:0: +475,192,261934,128,0,262013:0:0:0:0: +329,192,262013,128,0,262092:0:0:0:0: +109,192,262013,128,0,262171:0:0:0:0: +256,192,262092,128,0,262171:0:0:0:0: +475,192,262092,128,0,262171:0:0:0:0: +36,192,262171,128,0,262250:0:0:0:0: +182,192,262171,128,0,262250:0:0:0:0: +329,192,262250,128,0,262565:0:0:0:0: +109,192,262250,128,0,262328:0:0:0:0: +402,192,262250,128,0,262328:0:0:0:0: +475,192,262250,128,0,262407:0:0:0:0: +256,192,262328,128,0,262407:0:0:0:0: +36,192,262328,128,0,262486:0:0:0:0: +182,192,262407,128,0,262565:0:0:0:0: +402,192,262407,128,0,262486:0:0:0:0: +109,192,262407,128,0,262486:0:0:0:0: +475,192,262486,128,0,262565:0:0:0:0: +109,192,262565,128,0,262644:0:0:0:0: +36,192,262565,128,0,262802:0:0:0:0: +256,192,262565,128,0,262644:0:0:0:0: +402,192,262565,128,0,262644:0:0:0:0: +182,192,262644,128,0,262723:0:0:0:0: +475,192,262644,128,0,262802:0:0:0:0: +256,192,262723,128,0,262802:0:0:0:0: +109,192,262723,128,0,262881:0:0:0:0: +329,192,262802,128,0,262881:0:0:0:0: +402,192,262802,128,0,262881:0:0:0:0: +182,192,262881,128,0,263039:0:0:0:0: +36,192,262881,128,0,262960:0:0:0:0: +475,192,262881,128,0,263118:0:0:0:0: +256,192,262881,128,0,262960:0:0:0:0: +329,192,262960,128,0,263039:0:0:0:0: +109,192,262960,128,0,263118:0:0:0:0: +36,192,263039,128,0,263118:0:0:0:0: +402,192,263039,128,0,263276:0:0:0:0: +256,192,263039,128,0,263118:0:0:0:0: +329,192,263118,128,0,263197:0:0:0:0: +182,192,263118,128,0,263197:0:0:0:0: +109,192,263197,128,0,263513:0:0:0:0: +256,192,263197,128,0,263276:0:0:0:0: +475,192,263197,128,0,263355:0:0:0:0: +36,192,263197,128,0,263355:0:0:0:0: +329,192,263276,128,0,263355:0:0:0:0: +182,192,263276,128,0,263355:0:0:0:0: +256,192,263355,128,0,263513:0:0:0:0: +402,192,263355,128,0,263434:0:0:0:0: +329,192,263434,128,0,263513:0:0:0:0: +475,192,263434,128,0,263513:0:0:0:0: +402,192,263513,128,0,263671:0:0:0:0: +36,192,263513,128,0,263750:0:0:0:0: +182,192,263513,128,0,263592:0:0:0:0: +329,192,263592,128,0,263750:0:0:0:0: +109,192,263592,128,0,263750:0:0:0:0: +256,192,263671,128,0,263828:0:0:0:0: +475,192,263671,128,0,263750:0:0:0:0: +182,192,263750,128,0,263907:0:0:0:0: +402,192,263750,128,0,263828:0:0:0:0: +329,192,263828,128,0,263907:0:0:0:0: +36,192,263828,128,0,263907:0:0:0:0: +475,192,263828,128,0,264065:0:0:0:0: +109,192,263907,128,0,263986:0:0:0:0: +256,192,263907,128,0,263986:0:0:0:0: +329,192,263986,128,0,264065:0:0:0:0: +402,192,263986,128,0,264223:0:0:0:0: +36,192,263986,128,0,264223:0:0:0:0: +182,192,264065,128,0,264144:0:0:0:0: +475,192,264144,128,0,264381:0:0:0:0: +109,192,264144,128,0,264302:0:0:0:0: +256,192,264144,128,0,264223:0:0:0:0: +329,192,264223,128,0,264302:0:0:0:0: +182,192,264223,128,0,264381:0:0:0:0: +402,192,264302,128,0,264381:0:0:0:0: +256,192,264302,128,0,264460:0:0:0:0: +36,192,264302,128,0,264381:0:0:0:0: +329,192,264381,128,0,264539:0:0:0:0: +109,192,264381,128,0,264460:0:0:0:0: +36,192,264460,128,0,264618:0:0:0:0: +475,192,264460,128,0,264539:0:0:0:0: +182,192,264460,128,0,264539:0:0:0:0: +402,192,264539,128,0,264697:0:0:0:0: +256,192,264539,128,0,264618:0:0:0:0: +329,192,264618,128,0,264776:0:0:0:0: +109,192,264618,128,0,264697:0:0:0:0: +475,192,264618,128,0,264776:0:0:0:0: +182,192,264697,128,0,264776:0:0:0:0: +36,192,264697,128,0,264776:0:0:0:0: +256,192,264776,128,0,264934:0:0:0:0: +402,192,264776,128,0,264934:0:0:0:0: +109,192,264776,128,0,264855:0:0:0:0: +182,192,264855,128,0,264934:0:0:0:0: +36,192,264934,128,0,265092:0:0:0:0: +109,192,264934,128,0,265013:0:0:0:0: +329,192,264934,128,0,265013:0:0:0:0: +475,192,264934,128,0,265013:0:0:0:0: +402,192,265013,128,0,265092:0:0:0:0: +256,192,265013,128,0,265092:0:0:0:0: +475,192,265092,128,0,265250:0:0:0:0: +182,192,265092,128,0,265328:0:0:0:0: +109,192,265092,128,0,265171:0:0:0:0: +329,192,265092,128,0,265328:0:0:0:0: +402,192,265171,128,0,265250:0:0:0:0: +256,192,265171,128,0,265250:0:0:0:0: +109,192,265250,128,0,265328:0:0:0:0: +36,192,265250,128,0,265328:0:0:0:0: +475,192,265328,128,0,265407:0:0:0:0: +402,192,265328,128,0,265407:0:0:0:0: +182,192,265407,128,0,265644:0:0:0:0: +36,192,265407,128,0,265644:0:0:0:0: +256,192,265407,128,0,265486:0:0:0:0: +109,192,265407,128,0,265486:0:0:0:0: +402,192,265486,128,0,265565:0:0:0:0: +475,192,265486,128,0,265565:0:0:0:0: +329,192,265565,128,0,265644:0:0:0:0: +256,192,265565,128,0,265644:0:0:0:0: +402,192,265644,128,0,265723:0:0:0:0: +475,192,265644,128,0,265723:0:0:0:0: +36,192,265723,128,0,265881:0:0:0:0: +182,192,265723,128,0,265802:0:0:0:0: +329,192,265723,128,0,265881:0:0:0:0: +402,192,265802,128,0,265960:0:0:0:0: +256,192,265802,128,0,265881:0:0:0:0: +109,192,265802,128,0,266039:0:0:0:0: +475,192,265881,128,0,266039:0:0:0:0: +182,192,265881,128,0,265960:0:0:0:0: +329,192,265960,128,0,266039:0:0:0:0: +36,192,265960,128,0,266118:0:0:0:0: +182,192,266039,1,0,0:0:0:0: +402,192,266039,128,0,266197:0:0:0:0: +256,192,266039,128,0,266197:0:0:0:0: +109,192,266118,1,0,0:0:0:0: +182,192,266197,128,0,266276:0:0:0:0: +475,192,266197,128,0,266276:0:0:0:0: +36,192,266197,1,0,0:0:0:0: +109,192,266276,128,0,266355:0:0:0:0: +329,192,266276,128,0,266355:0:0:0:0: +256,192,266355,128,0,266434:0:0:0:0: +36,192,266355,128,0,266592:0:0:0:0: +475,192,266355,128,0,266671:0:0:0:0: +182,192,266434,128,0,266513:0:0:0:0: +402,192,266434,128,0,266513:0:0:0:0: +109,192,266513,128,0,266671:0:0:0:0: +329,192,266513,128,0,266671:0:0:0:0: +256,192,266592,128,0,266750:0:0:0:0: +36,192,266671,128,0,266828:0:0:0:0: +182,192,266671,128,0,266828:0:0:0:0: +402,192,266671,1,0,0:0:0:0: +329,192,266750,1,0,0:0:0:0: +475,192,266750,128,0,266907:0:0:0:0: +109,192,266828,128,0,266907:0:0:0:0: +402,192,266828,128,0,266907:0:0:0:0: +256,192,266828,1,0,0:0:0:0: +329,192,266907,128,0,266986:0:0:0:0: +36,192,266907,128,0,266986:0:0:0:0: +256,192,266986,128,0,267144:0:0:0:0: +402,192,266986,128,0,267065:0:0:0:0: +475,192,266986,128,0,267302:0:0:0:0: +182,192,266986,128,0,267065:0:0:0:0: +329,192,267065,128,0,267223:0:0:0:0: +36,192,267065,128,0,267223:0:0:0:0: +109,192,267144,128,0,267381:0:0:0:0: +402,192,267144,128,0,267302:0:0:0:0: +182,192,267223,128,0,267302:0:0:0:0: +36,192,267302,128,0,267460:0:0:0:0: +329,192,267302,128,0,267381:0:0:0:0: +475,192,267381,128,0,267539:0:0:0:0: +256,192,267381,128,0,267460:0:0:0:0: +182,192,267460,128,0,267539:0:0:0:0: +402,192,267460,128,0,267539:0:0:0:0: +329,192,267539,128,0,267618:0:0:0:0: +109,192,267539,128,0,267618:0:0:0:0: +256,192,267618,128,0,267697:0:0:0:0: +36,192,267618,128,0,267697:0:0:0:0: +475,192,267618,128,0,267855:0:0:0:0: +402,192,267618,128,0,267776:0:0:0:0: +329,192,267697,128,0,267855:0:0:0:0: +182,192,267697,128,0,267776:0:0:0:0: +256,192,267776,128,0,267934:0:0:0:0: +36,192,267776,128,0,267855:0:0:0:0: +109,192,267776,128,0,267855:0:0:0:0: +402,192,267855,128,0,267934:0:0:0:0: +182,192,267855,128,0,267934:0:0:0:0: +36,192,267934,128,0,268171:0:0:0:0: +109,192,267934,128,0,268013:0:0:0:0: +329,192,267934,128,0,268013:0:0:0:0: +475,192,267934,128,0,268013:0:0:0:0: +256,192,268013,128,0,268092:0:0:0:0: +402,192,268013,128,0,268092:0:0:0:0: +182,192,268092,128,0,268171:0:0:0:0: +329,192,268092,128,0,268171:0:0:0:0: +475,192,268092,128,0,268250:0:0:0:0: +109,192,268171,128,0,268250:0:0:0:0: +256,192,268171,128,0,268250:0:0:0:0: +36,192,268250,128,0,268328:0:0:0:0: +182,192,268250,128,0,268328:0:0:0:0: +329,192,268250,128,0,268328:0:0:0:0: +402,192,268250,128,0,268328:0:0:0:0: +36,192,268407,128,0,268565:0:0:0:0: +182,192,268407,128,0,268565:0:0:0:0: +329,192,268407,128,0,268565:0:0:0:0: +402,192,268407,128,0,268565:0:0:0:0: +475,192,268565,128,0,268881:0:0:0:0: +109,192,268565,1,0,0:0:0:0: +256,192,268565,1,0,0:0:0:0: +36,192,268723,128,0,268881:0:0:0:0: +402,192,268881,128,0,268960:0:0:0:0: +256,192,268881,128,0,268960:0:0:0:0: +109,192,268881,128,0,268960:0:0:0:0: +329,192,268881,128,0,268960:0:0:0:0: +109,192,269039,128,0,269197:0:0:0:0: +256,192,269039,128,0,269197:0:0:0:0: +329,192,269039,128,0,269197:0:0:0:0: +402,192,269039,128,0,269197:0:0:0:0: +36,192,269197,128,0,269513:0:0:0:0: +475,192,269197,1,0,0:0:0:0: +182,192,269197,128,0,269513:0:0:0:0: +475,192,269355,128,0,269513:0:0:0:0: +329,192,269355,128,0,269513:0:0:0:0: +256,192,269513,128,0,269671:0:0:0:0: +402,192,269513,128,0,269671:0:0:0:0: +109,192,269513,128,0,269671:0:0:0:0: +182,192,269671,128,0,269828:0:0:0:0: +329,192,269671,128,0,269828:0:0:0:0: +109,192,269828,128,0,269986:0:0:0:0: +256,192,269828,128,0,269986:0:0:0:0: +402,192,269828,128,0,269986:0:0:0:0: +36,192,269986,128,0,270460:0:0:0:0: +182,192,269986,128,0,270381:0:0:0:0: +329,192,269986,128,0,270302:0:0:0:0: +475,192,269986,128,0,270223:0:0:0:0: +402,192,270302,128,0,270697:0:0:0:0: +475,192,270302,1,0,0:0:0:0: +256,192,270381,128,0,270618:0:0:0:0: +329,192,270381,1,0,0:0:0:0: +109,192,270460,128,0,270539:0:0:0:0: +182,192,270460,1,0,0:0:0:0: +36,192,270539,128,0,270618:0:0:0:0: +182,192,270618,128,0,270697:0:0:0:0: +329,192,270697,128,0,270776:0:0:0:0: +475,192,270776,128,0,271013:0:0:0:0: +402,192,270776,128,0,270855:0:0:0:0: +256,192,270776,128,0,270855:0:0:0:0: +36,192,270776,128,0,270855:0:0:0:0: +182,192,270776,128,0,271013:0:0:0:0: +109,192,270855,128,0,270934:0:0:0:0: +329,192,270855,128,0,271013:0:0:0:0: +402,192,270934,128,0,271171:0:0:0:0: +256,192,270934,128,0,271092:0:0:0:0: +36,192,270934,128,0,271013:0:0:0:0: +109,192,271013,128,0,271171:0:0:0:0: +36,192,271092,128,0,271250:0:0:0:0: +475,192,271092,128,0,271328:0:0:0:0: +329,192,271092,128,0,271250:0:0:0:0: +182,192,271092,128,0,271250:0:0:0:0: +256,192,271171,128,0,271328:0:0:0:0: +109,192,271250,128,0,271328:0:0:0:0: +402,192,271328,128,0,271565:0:0:0:0: +36,192,271328,128,0,271565:0:0:0:0: +182,192,271328,128,0,271407:0:0:0:0: +329,192,271407,128,0,271486:0:0:0:0: +109,192,271407,128,0,271486:0:0:0:0: +475,192,271407,128,0,271486:0:0:0:0: +256,192,271486,128,0,271644:0:0:0:0: +182,192,271565,128,0,271802:0:0:0:0: +329,192,271565,128,0,271644:0:0:0:0: +475,192,271565,128,0,271644:0:0:0:0: +402,192,271644,128,0,271802:0:0:0:0: +109,192,271644,128,0,271723:0:0:0:0: +329,192,271723,128,0,271802:0:0:0:0: +475,192,271723,128,0,271960:0:0:0:0: +36,192,271723,128,0,271881:0:0:0:0: +256,192,271723,128,0,271881:0:0:0:0: +109,192,271802,128,0,271960:0:0:0:0: +182,192,271881,128,0,272118:0:0:0:0: +329,192,271881,128,0,271960:0:0:0:0: +402,192,271881,128,0,271960:0:0:0:0: +36,192,271960,128,0,272039:0:0:0:0: +256,192,271960,128,0,272039:0:0:0:0: +402,192,272039,128,0,272197:0:0:0:0: +109,192,272039,128,0,272276:0:0:0:0: +475,192,272039,128,0,272276:0:0:0:0: +329,192,272039,128,0,272118:0:0:0:0: +36,192,272118,128,0,272276:0:0:0:0: +256,192,272118,128,0,272355:0:0:0:0: +329,192,272197,128,0,272276:0:0:0:0: +182,192,272197,128,0,272276:0:0:0:0: +402,192,272276,128,0,272355:0:0:0:0: +329,192,272355,128,0,272434:0:0:0:0: +36,192,272355,128,0,272592:0:0:0:0: +475,192,272355,128,0,272592:0:0:0:0: +109,192,272355,128,0,272513:0:0:0:0: +182,192,272355,128,0,272434:0:0:0:0: +256,192,272434,128,0,272513:0:0:0:0: +402,192,272434,128,0,272592:0:0:0:0: +329,192,272513,128,0,272592:0:0:0:0: +182,192,272513,128,0,272592:0:0:0:0: +109,192,272592,128,0,272750:0:0:0:0: +256,192,272592,128,0,272671:0:0:0:0: +329,192,272671,128,0,272828:0:0:0:0: +182,192,272671,128,0,272828:0:0:0:0: +36,192,272671,128,0,272828:0:0:0:0: +475,192,272671,128,0,272750:0:0:0:0: +402,192,272750,128,0,272907:0:0:0:0: +256,192,272750,128,0,272907:0:0:0:0: +109,192,272828,128,0,272907:0:0:0:0: +475,192,272828,128,0,272907:0:0:0:0: +182,192,272907,128,0,272986:0:0:0:0: +329,192,272907,128,0,272986:0:0:0:0: +475,192,272986,128,0,273065:0:0:0:0: +256,192,272986,128,0,273065:0:0:0:0: +36,192,272986,128,0,273223:0:0:0:0: +402,192,272986,128,0,273065:0:0:0:0: +329,192,273065,128,0,273144:0:0:0:0: +109,192,273065,128,0,273223:0:0:0:0: +475,192,273144,128,0,273223:0:0:0:0: +182,192,273144,128,0,273302:0:0:0:0: +402,192,273144,128,0,273223:0:0:0:0: +256,192,273223,128,0,273302:0:0:0:0: +329,192,273302,128,0,273381:0:0:0:0: +109,192,273302,128,0,273381:0:0:0:0: +36,192,273302,128,0,273618:0:0:0:0: +475,192,273302,128,0,273460:0:0:0:0: +402,192,273302,128,0,273381:0:0:0:0: +182,192,273381,128,0,273539:0:0:0:0: +256,192,273381,128,0,273460:0:0:0:0: +109,192,273460,128,0,273539:0:0:0:0: +329,192,273460,128,0,273539:0:0:0:0: +402,192,273460,128,0,273539:0:0:0:0: +475,192,273539,128,0,273776:0:0:0:0: +256,192,273539,128,0,273618:0:0:0:0: +329,192,273618,128,0,273776:0:0:0:0: +402,192,273618,128,0,273697:0:0:0:0: +182,192,273618,128,0,273697:0:0:0:0: +109,192,273618,128,0,273697:0:0:0:0: +256,192,273697,128,0,273855:0:0:0:0: +36,192,273697,128,0,273855:0:0:0:0: +182,192,273776,128,0,273934:0:0:0:0: +109,192,273776,128,0,273855:0:0:0:0: +402,192,273776,128,0,273855:0:0:0:0: +475,192,273855,128,0,274092:0:0:0:0: +329,192,273855,128,0,273934:0:0:0:0: +36,192,273934,128,0,274171:0:0:0:0: +109,192,273934,128,0,274013:0:0:0:0: +256,192,273934,128,0,274171:0:0:0:0: +402,192,273934,128,0,274013:0:0:0:0: +182,192,274013,128,0,274092:0:0:0:0: +329,192,274013,128,0,274092:0:0:0:0: +402,192,274092,128,0,274328:0:0:0:0: +109,192,274171,128,0,274250:0:0:0:0: +329,192,274171,128,0,274250:0:0:0:0: +475,192,274171,128,0,274407:0:0:0:0: +182,192,274250,128,0,274328:0:0:0:0: +36,192,274250,128,0,274328:0:0:0:0: +256,192,274328,128,0,274407:0:0:0:0: +109,192,274328,128,0,274486:0:0:0:0: +36,192,274407,128,0,274802:0:0:0:0: +329,192,274407,128,0,274565:0:0:0:0: +182,192,274407,128,0,274486:0:0:0:0: +256,192,274486,128,0,274565:0:0:0:0: +402,192,274486,128,0,274644:0:0:0:0: +182,192,274565,128,0,274644:0:0:0:0: +109,192,274565,128,0,274644:0:0:0:0: +475,192,274565,128,0,274802:0:0:0:0: +256,192,274644,128,0,274723:0:0:0:0: +329,192,274644,128,0,274723:0:0:0:0: +109,192,274723,128,0,274802:0:0:0:0: +182,192,274723,128,0,274881:0:0:0:0: +402,192,274723,128,0,274802:0:0:0:0: +256,192,274802,128,0,274881:0:0:0:0: +329,192,274802,128,0,274960:0:0:0:0: +402,192,274881,128,0,274960:0:0:0:0: +475,192,274881,128,0,275118:0:0:0:0: +36,192,274881,128,0,275118:0:0:0:0: +109,192,274881,128,0,274960:0:0:0:0: +182,192,274960,128,0,275118:0:0:0:0: +256,192,274960,128,0,275039:0:0:0:0: +329,192,275039,128,0,275118:0:0:0:0: +402,192,275039,128,0,275276:0:0:0:0: +109,192,275039,128,0,275118:0:0:0:0: +256,192,275118,128,0,275197:0:0:0:0: +475,192,275197,128,0,275355:0:0:0:0: +329,192,275197,128,0,275355:0:0:0:0: +36,192,275197,128,0,275276:0:0:0:0: +182,192,275197,128,0,275276:0:0:0:0: +256,192,275276,128,0,275434:0:0:0:0: +109,192,275276,128,0,275355:0:0:0:0: +36,192,275355,128,0,275434:0:0:0:0: +182,192,275355,128,0,275513:0:0:0:0: +402,192,275355,128,0,275434:0:0:0:0: +109,192,275434,128,0,275592:0:0:0:0: +329,192,275434,128,0,275513:0:0:0:0: +36,192,275513,128,0,275592:0:0:0:0: +256,192,275513,128,0,275592:0:0:0:0: +475,192,275513,128,0,275750:0:0:0:0: +182,192,275592,128,0,275671:0:0:0:0: +402,192,275592,128,0,275750:0:0:0:0: +109,192,275671,128,0,275750:0:0:0:0: +36,192,275671,128,0,275750:0:0:0:0: +329,192,275671,128,0,275828:0:0:0:0: +256,192,275750,128,0,275828:0:0:0:0: +182,192,275828,128,0,275986:0:0:0:0: +475,192,275828,128,0,276065:0:0:0:0: +402,192,275828,128,0,275907:0:0:0:0: +36,192,275828,128,0,276065:0:0:0:0: +109,192,275828,128,0,275907:0:0:0:0: +256,192,275907,128,0,276065:0:0:0:0: +329,192,275907,128,0,275986:0:0:0:0: +402,192,275986,128,0,276065:0:0:0:0: +109,192,275986,128,0,276144:0:0:0:0: +329,192,276065,128,0,276144:0:0:0:0: +182,192,276065,128,0,276223:0:0:0:0: +256,192,276144,128,0,276302:0:0:0:0: +402,192,276144,128,0,276223:0:0:0:0: +475,192,276144,128,0,276302:0:0:0:0: +36,192,276144,1,0,0:0:0:0: +329,192,276223,128,0,276381:0:0:0:0: +109,192,276223,1,0,0:0:0:0: +402,192,276302,128,0,276539:0:0:0:0: +182,192,276302,1,0,0:0:0:0: +36,192,276302,128,0,276381:0:0:0:0: +475,192,276381,128,0,276460:0:0:0:0: +109,192,276381,128,0,276460:0:0:0:0: +256,192,276381,1,0,0:0:0:0: +329,192,276460,128,0,276618:0:0:0:0: +182,192,276460,128,0,276539:0:0:0:0: +36,192,276460,128,0,276697:0:0:0:0: +256,192,276539,128,0,276697:0:0:0:0: +109,192,276539,128,0,276618:0:0:0:0: +475,192,276539,1,0,0:0:0:0: +182,192,276618,128,0,276776:0:0:0:0: +402,192,276618,1,0,0:0:0:0: +109,192,276697,128,0,276855:0:0:0:0: +329,192,276697,1,0,0:0:0:0: +475,192,276697,128,0,276855:0:0:0:0: +36,192,276776,128,0,276934:0:0:0:0: +256,192,276776,1,0,0:0:0:0: +402,192,276776,128,0,276934:0:0:0:0: +182,192,276855,1,0,0:0:0:0: +329,192,276855,128,0,277013:0:0:0:0: +109,192,276934,1,0,0:0:0:0: +256,192,276934,128,0,277092:0:0:0:0: +182,192,277013,128,0,277171:0:0:0:0: +36,192,277013,1,0,0:0:0:0: +402,192,277092,128,0,277171:0:0:0:0: +475,192,277092,128,0,277328:0:0:0:0: +329,192,277092,128,0,277171:0:0:0:0: +109,192,277092,128,0,277328:0:0:0:0: +256,192,277171,128,0,277250:0:0:0:0: +36,192,277171,128,0,277250:0:0:0:0: +329,192,277250,128,0,277486:0:0:0:0: +182,192,277250,128,0,277407:0:0:0:0: +402,192,277328,128,0,277407:0:0:0:0: +36,192,277407,128,0,277486:0:0:0:0: +256,192,277407,128,0,277565:0:0:0:0: +475,192,277407,128,0,277644:0:0:0:0: +109,192,277407,128,0,277486:0:0:0:0: +182,192,277486,128,0,277565:0:0:0:0: +402,192,277486,128,0,277644:0:0:0:0: +36,192,277565,128,0,277644:0:0:0:0: +109,192,277565,128,0,277723:0:0:0:0: +329,192,277565,128,0,277723:0:0:0:0: +182,192,277644,128,0,277802:0:0:0:0: +36,192,277723,128,0,277881:0:0:0:0: +256,192,277723,128,0,277802:0:0:0:0: +402,192,277723,128,0,277802:0:0:0:0: +475,192,277723,128,0,277960:0:0:0:0: +329,192,277802,128,0,277881:0:0:0:0: +109,192,277802,128,0,277881:0:0:0:0: +182,192,277881,128,0,278039:0:0:0:0: +402,192,277881,128,0,277960:0:0:0:0: +256,192,277881,128,0,277960:0:0:0:0: +329,192,277960,128,0,278039:0:0:0:0: +36,192,278039,128,0,278118:0:0:0:0: +109,192,278039,128,0,278118:0:0:0:0: +256,192,278039,128,0,278118:0:0:0:0: +475,192,278039,128,0,278118:0:0:0:0: +402,192,278039,128,0,278118:0:0:0:0: +36,192,278197,1,0,0:0:0:0: +109,192,278197,1,0,0:0:0:0: +256,192,278197,1,0,0:0:0:0: +402,192,278197,1,0,0:0:0:0: +475,192,278197,1,0,0:0:0:0: +36,192,278355,128,0,278986:0:0:0:0: +475,192,278355,128,0,278986:0:0:0:0: +182,192,278355,128,0,278513:0:0:0:0: +329,192,278355,128,0,278434:0:0:0:0: +402,192,278355,128,0,278750:0:0:0:0: +256,192,278434,128,0,278592:0:0:0:0: +329,192,278513,128,0,278671:0:0:0:0: +109,192,278513,128,0,278592:0:0:0:0: +182,192,278592,128,0,278671:0:0:0:0: +109,192,278671,128,0,278828:0:0:0:0: +256,192,278671,128,0,278750:0:0:0:0: +182,192,278750,128,0,278907:0:0:0:0: +329,192,278750,128,0,278828:0:0:0:0: +256,192,278828,128,0,278986:0:0:0:0: +402,192,278828,128,0,278907:0:0:0:0: +329,192,278907,128,0,278986:0:0:0:0: +109,192,278986,128,0,279223:0:0:0:0: +402,192,278986,128,0,279065:0:0:0:0: +182,192,278986,128,0,279065:0:0:0:0: +475,192,279065,128,0,279144:0:0:0:0: +329,192,279065,128,0,279144:0:0:0:0: +256,192,279144,128,0,279223:0:0:0:0: +402,192,279144,128,0,279223:0:0:0:0: +36,192,279144,128,0,279302:0:0:0:0: +329,192,279223,128,0,279302:0:0:0:0: +182,192,279223,128,0,279302:0:0:0:0: +402,192,279302,128,0,279460:0:0:0:0: +475,192,279302,128,0,279539:0:0:0:0: +109,192,279302,128,0,279539:0:0:0:0: +256,192,279302,128,0,279381:0:0:0:0: +182,192,279381,128,0,279460:0:0:0:0: +36,192,279460,128,0,279618:0:0:0:0: +329,192,279460,128,0,279539:0:0:0:0: +256,192,279539,128,0,279618:0:0:0:0: +402,192,279539,128,0,279618:0:0:0:0: +182,192,279618,128,0,279697:0:0:0:0: +329,192,279618,128,0,279855:0:0:0:0: +475,192,279618,128,0,279855:0:0:0:0: +109,192,279618,128,0,279697:0:0:0:0: +182,192,279776,128,0,279855:0:0:0:0: +36,192,279776,128,0,279855:0:0:0:0: +256,192,279776,128,0,279855:0:0:0:0: +402,192,279776,128,0,279855:0:0:0:0: +402,192,279934,128,0,280171:0:0:0:0: +256,192,279934,128,0,280171:0:0:0:0: +36,192,279934,128,0,280013:0:0:0:0: +109,192,279934,128,0,280013:0:0:0:0: +475,192,279934,128,0,280013:0:0:0:0: +182,192,280092,128,0,280171:0:0:0:0: +36,192,280092,128,0,280171:0:0:0:0: +329,192,280092,128,0,280171:0:0:0:0: +475,192,280092,128,0,280171:0:0:0:0: +109,192,280250,128,0,280486:0:0:0:0: +329,192,280250,128,0,280328:0:0:0:0: +475,192,280250,128,0,280328:0:0:0:0: +256,192,280250,128,0,280486:0:0:0:0: +36,192,280250,128,0,280328:0:0:0:0: +329,192,280407,128,0,280486:0:0:0:0: +182,192,280407,128,0,280486:0:0:0:0: +36,192,280407,128,0,280486:0:0:0:0: +475,192,280407,128,0,280486:0:0:0:0: +36,192,280565,128,0,280802:0:0:0:0: +182,192,280565,128,0,280802:0:0:0:0: +256,192,280565,128,0,280644:0:0:0:0: +475,192,280565,128,0,280644:0:0:0:0: +329,192,280565,128,0,280644:0:0:0:0: +109,192,280723,128,0,280802:0:0:0:0: +329,192,280723,128,0,280802:0:0:0:0: +402,192,280723,128,0,280802:0:0:0:0: +475,192,280723,128,0,280802:0:0:0:0: +256,192,280881,1,0,0:0:0:0: +109,192,280881,1,0,0:0:0:0: +36,192,280881,1,0,0:0:0:0: +402,192,280881,1,0,0:0:0:0: +475,192,280881,1,0,0:0:0:0: +182,192,281039,1,0,0:0:0:0: +36,192,281039,1,0,0:0:0:0: +329,192,281039,1,0,0:0:0:0: +475,192,281039,1,0,0:0:0:0: +256,192,281039,1,0,0:0:0:0: +182,192,281355,1,0,0:0:0:0: +36,192,281355,1,0,0:0:0:0: +256,192,281355,1,0,0:0:0:0: +329,192,281355,1,0,0:0:0:0: +475,192,281355,1,0,0:0:0:0: +109,192,281513,1,0,0:0:0:0: +36,192,281513,1,0,0:0:0:0: +256,192,281513,1,0,0:0:0:0: +402,192,281513,1,0,0:0:0:0: +475,192,281513,1,0,0:0:0:0: +402,192,281671,128,0,281828:0:0:0:0: +475,192,281671,128,0,281828:0:0:0:0: +36,192,281828,1,0,0:0:0:0: +109,192,281828,1,0,0:0:0:0: +256,192,281828,1,0,0:0:0:0: +329,192,281828,1,0,0:0:0:0: +109,192,281986,1,0,0:0:0:0: +182,192,281986,1,0,0:0:0:0: +329,192,281986,1,0,0:0:0:0: +402,192,281986,1,0,0:0:0:0: +36,192,282302,1,0,0:0:0:0: +256,192,282302,1,0,0:0:0:0: +475,192,282302,1,0,0:0:0:0: +109,192,282302,1,0,0:0:0:0: +402,192,282302,1,0,0:0:0:0: +182,192,282460,1,0,0:0:0:0: +36,192,282460,1,0,0:0:0:0: +256,192,282460,1,0,0:0:0:0: +475,192,282460,1,0,0:0:0:0: +329,192,282460,1,0,0:0:0:0: +36,192,282618,128,0,282776:0:0:0:0: +109,192,282618,128,0,282776:0:0:0:0: +475,192,282776,128,0,283407:0:0:0:0: +182,192,282776,1,0,0:0:0:0: +402,192,282776,1,0,0:0:0:0: +256,192,282776,128,0,282934:0:0:0:0: +329,192,282855,128,0,283013:0:0:0:0: +402,192,282934,128,0,283092:0:0:0:0: +182,192,282934,128,0,283013:0:0:0:0: +256,192,283013,128,0,283092:0:0:0:0: +109,192,283013,128,0,283171:0:0:0:0: +329,192,283092,128,0,283171:0:0:0:0: +182,192,283092,128,0,283250:0:0:0:0: +256,192,283171,128,0,283328:0:0:0:0: +36,192,283171,128,0,283407:0:0:0:0: +109,192,283250,128,0,283407:0:0:0:0: +182,192,283328,128,0,283407:0:0:0:0: +256,192,283407,1,0,0:0:0:0: +329,192,283407,1,0,0:0:0:0: +402,192,283407,1,0,0:0:0:0: +329,192,283723,128,0,284039:0:0:0:0: +182,192,283723,128,0,284039:0:0:0:0: +36,192,283723,128,0,284039:0:0:0:0: +256,192,284039,1,0,0:0:0:0: +402,192,284039,1,0,0:0:0:0: +475,192,284039,1,0,0:0:0:0: +109,192,284355,128,0,284671:0:0:0:0: +256,192,284355,128,0,284671:0:0:0:0: +402,192,284355,128,0,284671:0:0:0:0: +182,192,284671,1,0,0:0:0:0: +36,192,284671,1,0,0:0:0:0: +475,192,284671,1,0,0:0:0:0: +182,192,284986,128,0,285302:0:0:0:0: +329,192,284986,128,0,285302:0:0:0:0: +475,192,284986,128,0,285302:0:0:0:0: +36,192,285302,1,0,0:0:0:0: +109,192,285302,1,0,0:0:0:0: +256,192,285302,1,0,0:0:0:0: +256,192,285460,128,0,285776:0:0:0:0: +402,192,285460,128,0,285776:0:0:0:0: +36,192,285776,128,0,287118:0:0:0:0: +182,192,285776,128,0,286250:0:0:0:0: +329,192,285776,1,0,0:0:0:0: +475,192,285776,1,0,0:0:0:0: +329,192,286092,128,0,286171:0:0:0:0: +475,192,286092,128,0,286328:0:0:0:0: +256,192,286092,128,0,286250:0:0:0:0: +402,192,286250,128,0,286328:0:0:0:0: +109,192,286250,128,0,286407:0:0:0:0: +329,192,286250,128,0,286407:0:0:0:0: +402,192,286407,128,0,286565:0:0:0:0: +475,192,286407,128,0,286486:0:0:0:0: +182,192,286407,128,0,286565:0:0:0:0: +256,192,286565,128,0,286723:0:0:0:0: +475,192,286565,128,0,286881:0:0:0:0: +109,192,286565,128,0,286960:0:0:0:0: +329,192,286565,128,0,286644:0:0:0:0: +329,192,286723,128,0,286881:0:0:0:0: +182,192,286723,128,0,286881:0:0:0:0: +402,192,286723,128,0,286802:0:0:0:0: +402,192,286881,128,0,286960:0:0:0:0: +256,192,286881,128,0,287118:0:0:0:0: +475,192,286960,128,0,287039:0:0:0:0: +182,192,286960,128,0,287039:0:0:0:0: +329,192,287039,128,0,287118:0:0:0:0: +109,192,287039,128,0,287118:0:0:0:0: +402,192,287118,128,0,287197:0:0:0:0: +182,192,287118,128,0,287197:0:0:0:0: +256,192,287197,1,0,0:0:0:0: +109,192,287197,1,0,0:0:0:0: +475,192,287197,1,0,0:0:0:0: +329,192,287197,1,0,0:0:0:0: +36,192,287197,1,0,0:0:0:0: +475,192,287513,128,0,287828:0:0:0:0: +329,192,287828,128,0,288460:0:0:0:0: +109,192,288460,128,0,288539:0:0:0:0: +182,192,288500,128,0,288578:0:0:0:0: +256,192,288539,128,0,288618:0:0:0:0: +329,192,288578,128,0,288657:0:0:0:0: +182,192,288618,128,0,288697:0:0:0:0: +256,192,288657,128,0,288736:0:0:0:0: +329,192,288697,128,0,288776:0:0:0:0: +402,192,288736,128,0,288815:0:0:0:0: +475,192,288776,128,0,289250:0:0:0:0: +36,192,288776,1,0,0:0:0:0: +109,192,288776,1,0,0:0:0:0: +36,192,289092,128,0,289644:0:0:0:0: +256,192,289092,1,0,0:0:0:0: +402,192,289092,1,0,0:0:0:0: +475,192,289407,128,0,289644:0:0:0:0: +109,192,289407,1,0,0:0:0:0: +256,192,289407,1,0,0:0:0:0: +182,192,289407,1,0,0:0:0:0: +182,192,289723,1,0,0:0:0:0: +36,192,289723,1,0,0:0:0:0: +329,192,289723,1,0,0:0:0:0: +475,192,289723,128,0,289802:0:0:0:0: +256,192,289802,1,0,0:0:0:0: +329,192,289881,1,0,0:0:0:0: +109,192,289881,1,0,0:0:0:0: +475,192,289881,1,0,0:0:0:0: +182,192,289960,1,0,0:0:0:0: +256,192,290039,1,0,0:0:0:0: +36,192,290039,1,0,0:0:0:0: +475,192,290039,128,0,290118:0:0:0:0: +329,192,290118,1,0,0:0:0:0: +36,192,290197,1,0,0:0:0:0: +182,192,290197,1,0,0:0:0:0: +402,192,290197,128,0,290276:0:0:0:0: +329,192,290276,1,0,0:0:0:0: +256,192,290355,1,0,0:0:0:0: +475,192,290355,1,0,0:0:0:0: +36,192,290355,128,0,290434:0:0:0:0: +182,192,290434,1,0,0:0:0:0: +329,192,290513,1,0,0:0:0:0: +109,192,290513,1,0,0:0:0:0: +475,192,290513,1,0,0:0:0:0: +256,192,290592,1,0,0:0:0:0: +402,192,290671,1,0,0:0:0:0: +182,192,290671,1,0,0:0:0:0: +36,192,290671,128,0,290750:0:0:0:0: +256,192,290750,1,0,0:0:0:0: +475,192,290828,1,0,0:0:0:0: +329,192,290828,1,0,0:0:0:0: +109,192,290828,128,0,290907:0:0:0:0: +182,192,290907,1,0,0:0:0:0: +36,192,290986,1,0,0:0:0:0: +256,192,290986,1,0,0:0:0:0: +109,192,290986,1,0,0:0:0:0: +475,192,290986,128,0,291065:0:0:0:0: +329,192,291065,1,0,0:0:0:0: +402,192,291144,1,0,0:0:0:0: +36,192,291144,1,0,0:0:0:0: +182,192,291144,1,0,0:0:0:0: +256,192,291223,1,0,0:0:0:0: +329,192,291302,1,0,0:0:0:0: +109,192,291302,1,0,0:0:0:0: +475,192,291302,128,0,291381:0:0:0:0: +256,192,291381,1,0,0:0:0:0: +36,192,291460,1,0,0:0:0:0: +182,192,291460,1,0,0:0:0:0: +402,192,291460,128,0,291539:0:0:0:0: +329,192,291539,1,0,0:0:0:0: +182,192,291618,1,0,0:0:0:0: +475,192,291618,1,0,0:0:0:0: +36,192,291618,128,0,291697:0:0:0:0: +256,192,291697,1,0,0:0:0:0: +329,192,291776,1,0,0:0:0:0: +109,192,291776,1,0,0:0:0:0: +475,192,291776,1,0,0:0:0:0: +182,192,291855,1,0,0:0:0:0: +329,192,291934,1,0,0:0:0:0: +475,192,291934,1,0,0:0:0:0: +36,192,291934,128,0,292013:0:0:0:0: +256,192,292013,1,0,0:0:0:0: +182,192,292092,1,0,0:0:0:0: +402,192,292092,1,0,0:0:0:0: +109,192,292092,128,0,292171:0:0:0:0: +329,192,292171,1,0,0:0:0:0: +256,192,292250,1,0,0:0:0:0: +36,192,292250,1,0,0:0:0:0: +109,192,292250,1,0,0:0:0:0: +475,192,292250,128,0,292328:0:0:0:0: +402,192,292328,1,0,0:0:0:0: +182,192,292407,1,0,0:0:0:0: +36,192,292407,1,0,0:0:0:0: +329,192,292407,1,0,0:0:0:0: +402,192,292486,1,0,0:0:0:0: +256,192,292565,1,0,0:0:0:0: +36,192,292565,1,0,0:0:0:0: +475,192,292565,128,0,292644:0:0:0:0: +109,192,292644,1,0,0:0:0:0: +182,192,292723,1,0,0:0:0:0: +475,192,292723,1,0,0:0:0:0: +329,192,292723,128,0,292802:0:0:0:0: +109,192,292802,1,0,0:0:0:0: +256,192,292881,1,0,0:0:0:0: +475,192,292881,1,0,0:0:0:0: +36,192,292881,128,0,292960:0:0:0:0: +402,192,292960,1,0,0:0:0:0: +329,192,293039,1,0,0:0:0:0: +182,192,293039,1,0,0:0:0:0: +36,192,293039,1,0,0:0:0:0: +256,192,293118,1,0,0:0:0:0: +475,192,293197,1,0,0:0:0:0: +182,192,293197,1,0,0:0:0:0: +36,192,293197,128,0,293276:0:0:0:0: +402,192,293276,1,0,0:0:0:0: +329,192,293355,1,0,0:0:0:0: +475,192,293355,1,0,0:0:0:0: +182,192,293355,128,0,293434:0:0:0:0: +109,192,293434,1,0,0:0:0:0: +182,192,293513,1,0,0:0:0:0: +36,192,293513,1,0,0:0:0:0: +329,192,293513,1,0,0:0:0:0: +475,192,293513,128,0,293592:0:0:0:0: +256,192,293592,1,0,0:0:0:0: +36,192,293671,1,0,0:0:0:0: +475,192,293671,1,0,0:0:0:0: +329,192,293671,1,0,0:0:0:0: +182,192,293750,1,0,0:0:0:0: +36,192,293828,1,0,0:0:0:0: +256,192,293828,1,0,0:0:0:0: +402,192,293828,128,0,293907:0:0:0:0: +109,192,293907,1,0,0:0:0:0: +36,192,293986,1,0,0:0:0:0: +475,192,293986,1,0,0:0:0:0: +329,192,293986,128,0,294065:0:0:0:0: +182,192,294065,1,0,0:0:0:0: +256,192,294144,1,0,0:0:0:0: +475,192,294144,1,0,0:0:0:0: +36,192,294144,128,0,294223:0:0:0:0: +402,192,294223,1,0,0:0:0:0: +182,192,294302,1,0,0:0:0:0: +36,192,294302,1,0,0:0:0:0: +475,192,294302,1,0,0:0:0:0: +329,192,294381,1,0,0:0:0:0: +256,192,294460,1,0,0:0:0:0: +475,192,294460,1,0,0:0:0:0: +109,192,294460,128,0,294539:0:0:0:0: +402,192,294539,1,0,0:0:0:0: +475,192,294618,1,0,0:0:0:0: +36,192,294618,1,0,0:0:0:0: +182,192,294618,128,0,294697:0:0:0:0: +329,192,294697,1,0,0:0:0:0: +256,192,294776,1,0,0:0:0:0: +109,192,294776,1,0,0:0:0:0: +36,192,294776,1,0,0:0:0:0: +475,192,294776,1,0,0:0:0:0: +329,192,294855,1,0,0:0:0:0: +402,192,294855,1,0,0:0:0:0: +109,192,294934,1,0,0:0:0:0: +36,192,294934,1,0,0:0:0:0: +256,192,294934,1,0,0:0:0:0: +402,192,295013,1,0,0:0:0:0: +475,192,295013,1,0,0:0:0:0: +329,192,295092,1,0,0:0:0:0: +109,192,295092,1,0,0:0:0:0: +36,192,295092,1,0,0:0:0:0: +182,192,295092,1,0,0:0:0:0: +475,192,295171,1,0,0:0:0:0: +402,192,295171,1,0,0:0:0:0: +36,192,295250,1,0,0:0:0:0: +256,192,295250,1,0,0:0:0:0: +182,192,295250,1,0,0:0:0:0: +329,192,295328,1,0,0:0:0:0: +402,192,295328,1,0,0:0:0:0: +109,192,295407,1,0,0:0:0:0: +36,192,295407,1,0,0:0:0:0: +475,192,295407,1,0,0:0:0:0: +182,192,295407,1,0,0:0:0:0: +256,192,295486,1,0,0:0:0:0: +329,192,295486,1,0,0:0:0:0: +182,192,295565,1,0,0:0:0:0: +109,192,295565,1,0,0:0:0:0: +475,192,295565,1,0,0:0:0:0: +402,192,295644,1,0,0:0:0:0: +329,192,295644,1,0,0:0:0:0: +36,192,295723,1,0,0:0:0:0: +475,192,295723,1,0,0:0:0:0: +109,192,295723,1,0,0:0:0:0: +182,192,295723,1,0,0:0:0:0: +256,192,295802,1,0,0:0:0:0: +329,192,295802,1,0,0:0:0:0: +36,192,295881,1,0,0:0:0:0: +109,192,295881,1,0,0:0:0:0: +402,192,295881,1,0,0:0:0:0: +182,192,295960,1,0,0:0:0:0: +256,192,295960,1,0,0:0:0:0: +329,192,296039,1,0,0:0:0:0: +402,192,296039,1,0,0:0:0:0: +475,192,296039,1,0,0:0:0:0: +36,192,296039,1,0,0:0:0:0: +182,192,296118,1,0,0:0:0:0: +109,192,296118,1,0,0:0:0:0: +36,192,296197,1,0,0:0:0:0: +475,192,296197,1,0,0:0:0:0: +329,192,296197,1,0,0:0:0:0: +402,192,296197,1,0,0:0:0:0: +256,192,296276,1,0,0:0:0:0: +182,192,296276,1,0,0:0:0:0: +402,192,296355,1,0,0:0:0:0: +36,192,296355,1,0,0:0:0:0: +475,192,296355,1,0,0:0:0:0: +109,192,296355,1,0,0:0:0:0: +256,192,296434,1,0,0:0:0:0: +329,192,296434,1,0,0:0:0:0: +402,192,296513,1,0,0:0:0:0: +475,192,296513,1,0,0:0:0:0: +109,192,296513,1,0,0:0:0:0: +36,192,296513,1,0,0:0:0:0: +256,192,296592,1,0,0:0:0:0: +329,192,296592,1,0,0:0:0:0: +402,192,296671,1,0,0:0:0:0: +475,192,296671,1,0,0:0:0:0: +109,192,296671,1,0,0:0:0:0: +36,192,296671,1,0,0:0:0:0: +256,192,296750,1,0,0:0:0:0: +182,192,296750,1,0,0:0:0:0: +402,192,296828,1,0,0:0:0:0: +475,192,296828,1,0,0:0:0:0: +109,192,296828,1,0,0:0:0:0: +36,192,296828,1,0,0:0:0:0: +329,192,296907,1,0,0:0:0:0: +256,192,296907,1,0,0:0:0:0: +182,192,296986,1,0,0:0:0:0: +109,192,296986,1,0,0:0:0:0: +36,192,296986,1,0,0:0:0:0: +475,192,296986,1,0,0:0:0:0: +329,192,297065,1,0,0:0:0:0: +402,192,297065,1,0,0:0:0:0: +182,192,297144,1,0,0:0:0:0: +36,192,297144,1,0,0:0:0:0: +256,192,297144,1,0,0:0:0:0: +109,192,297144,1,0,0:0:0:0: +475,192,297223,1,0,0:0:0:0: +402,192,297223,1,0,0:0:0:0: +256,192,297302,1,0,0:0:0:0: +109,192,297302,1,0,0:0:0:0: +36,192,297302,1,0,0:0:0:0: +329,192,297342,1,0,0:0:0:0: +402,192,297381,1,0,0:0:0:0: +475,192,297421,1,0,0:0:0:0: +182,192,297460,1,0,0:0:0:0: +36,192,297460,1,0,0:0:0:0: +256,192,297500,1,0,0:0:0:0: +329,192,297539,1,0,0:0:0:0: +402,192,297578,1,0,0:0:0:0: +109,192,297618,1,0,0:0:0:0: +475,192,297618,1,0,0:0:0:0: +182,192,297657,1,0,0:0:0:0: +256,192,297697,1,0,0:0:0:0: +329,192,297736,1,0,0:0:0:0: +36,192,297776,1,0,0:0:0:0: +402,192,297776,1,0,0:0:0:0: +109,192,297815,1,0,0:0:0:0: +182,192,297855,1,0,0:0:0:0: +256,192,297894,1,0,0:0:0:0: +402,192,297934,1,0,0:0:0:0: +36,192,297934,1,0,0:0:0:0: +329,192,297973,1,0,0:0:0:0: +256,192,298013,1,0,0:0:0:0: +182,192,298052,1,0,0:0:0:0: +109,192,298092,1,0,0:0:0:0: +475,192,298092,1,0,0:0:0:0: +402,192,298131,1,0,0:0:0:0: +329,192,298171,1,0,0:0:0:0: +256,192,298210,1,0,0:0:0:0: +36,192,298250,1,0,0:0:0:0: +475,192,298250,1,0,0:0:0:0: +109,192,298289,1,0,0:0:0:0: +182,192,298328,1,0,0:0:0:0: +256,192,298368,1,0,0:0:0:0: +402,192,298407,1,0,0:0:0:0: +36,192,298407,1,0,0:0:0:0: +329,192,298447,1,0,0:0:0:0: +256,192,298486,1,0,0:0:0:0: +182,192,298526,1,0,0:0:0:0: +329,192,298565,1,0,0:0:0:0: +475,192,298565,1,0,0:0:0:0: +36,192,298565,1,0,0:0:0:0: +109,192,298644,1,0,0:0:0:0: +402,192,298644,1,0,0:0:0:0: +182,192,298723,1,0,0:0:0:0: +36,192,298723,1,0,0:0:0:0: +475,192,298723,1,0,0:0:0:0: +475,192,298881,1,0,0:0:0:0: +329,192,298881,1,0,0:0:0:0: +182,192,298881,1,0,0:0:0:0: +256,192,298960,1,0,0:0:0:0: +402,192,298960,1,0,0:0:0:0: +329,192,299039,1,0,0:0:0:0: +475,192,299039,1,0,0:0:0:0: +182,192,299039,1,0,0:0:0:0: +109,192,299118,1,0,0:0:0:0: +256,192,299118,1,0,0:0:0:0: +36,192,299197,1,0,0:0:0:0: +182,192,299197,1,0,0:0:0:0: +475,192,299197,1,0,0:0:0:0: +402,192,299197,1,0,0:0:0:0: +329,192,299276,1,0,0:0:0:0: +109,192,299276,1,0,0:0:0:0: +256,192,299355,1,0,0:0:0:0: +475,192,299355,1,0,0:0:0:0: +36,192,299355,1,0,0:0:0:0: +329,192,299434,1,0,0:0:0:0: +182,192,299434,1,0,0:0:0:0: +109,192,299513,1,0,0:0:0:0: +36,192,299513,1,0,0:0:0:0: +402,192,299513,1,0,0:0:0:0: +475,192,299513,1,0,0:0:0:0: +329,192,299592,1,0,0:0:0:0: +182,192,299592,1,0,0:0:0:0: +256,192,299671,1,0,0:0:0:0: +109,192,299671,1,0,0:0:0:0: +182,192,299750,1,0,0:0:0:0: +36,192,299750,1,0,0:0:0:0: +256,192,299828,128,0,299907:0:0:0:0: +475,192,299828,128,0,300144:0:0:0:0: +402,192,299828,1,0,0:0:0:0: +109,192,299828,128,0,299907:0:0:0:0: +329,192,299907,1,0,0:0:0:0: +182,192,299986,128,0,300065:0:0:0:0: +402,192,299986,1,0,0:0:0:0: +36,192,299986,128,0,300065:0:0:0:0: +256,192,300065,1,0,0:0:0:0: +329,192,300144,128,0,300223:0:0:0:0: +36,192,300144,128,0,300460:0:0:0:0: +109,192,300144,1,0,0:0:0:0: +402,192,300144,128,0,300223:0:0:0:0: +182,192,300223,128,0,300302:0:0:0:0: +475,192,300223,1,0,0:0:0:0: +256,192,300302,128,0,300381:0:0:0:0: +109,192,300302,1,0,0:0:0:0: +329,192,300302,128,0,300381:0:0:0:0: +402,192,300381,1,0,0:0:0:0: +329,192,300460,128,0,300539:0:0:0:0: +475,192,300460,128,0,300776:0:0:0:0: +256,192,300460,1,0,0:0:0:0: +109,192,300460,128,0,300539:0:0:0:0: +182,192,300539,1,0,0:0:0:0: +109,192,300618,128,0,300697:0:0:0:0: +402,192,300618,1,0,0:0:0:0: +256,192,300618,128,0,300697:0:0:0:0: +182,192,300697,128,0,300776:0:0:0:0: +329,192,300697,1,0,0:0:0:0: +256,192,300776,128,0,300855:0:0:0:0: +36,192,300776,128,0,301092:0:0:0:0: +109,192,300776,1,0,0:0:0:0: +402,192,300776,128,0,300855:0:0:0:0: +182,192,300855,1,0,0:0:0:0: +402,192,300934,128,0,301013:0:0:0:0: +109,192,300934,1,0,0:0:0:0: +256,192,300934,128,0,301013:0:0:0:0: +329,192,301013,128,0,301092:0:0:0:0: +182,192,301013,1,0,0:0:0:0: +256,192,301092,128,0,301171:0:0:0:0: +475,192,301092,128,0,301407:0:0:0:0: +402,192,301092,1,0,0:0:0:0: +109,192,301092,128,0,301171:0:0:0:0: +329,192,301171,1,0,0:0:0:0: +402,192,301250,128,0,301328:0:0:0:0: +36,192,301250,1,0,0:0:0:0: +109,192,301250,128,0,301407:0:0:0:0: +182,192,301328,128,0,301407:0:0:0:0: +329,192,301328,1,0,0:0:0:0: +402,192,301407,128,0,301486:0:0:0:0: +36,192,301407,128,0,301723:0:0:0:0: +256,192,301407,128,0,301486:0:0:0:0: +329,192,301486,128,0,301565:0:0:0:0: +475,192,301486,1,0,0:0:0:0: +182,192,301565,128,0,301723:0:0:0:0: +109,192,301565,1,0,0:0:0:0: +402,192,301565,128,0,301644:0:0:0:0: +256,192,301644,128,0,301723:0:0:0:0: +109,192,301723,128,0,301802:0:0:0:0: +475,192,301723,128,0,302039:0:0:0:0: +402,192,301723,1,0,0:0:0:0: +329,192,301723,128,0,301802:0:0:0:0: +182,192,301802,1,0,0:0:0:0: +402,192,301881,128,0,301960:0:0:0:0: +256,192,301881,1,0,0:0:0:0: +36,192,301881,128,0,301960:0:0:0:0: +329,192,301960,128,0,302039:0:0:0:0: +109,192,301960,1,0,0:0:0:0: +182,192,302039,128,0,302197:0:0:0:0: +36,192,302039,128,0,302355:0:0:0:0: +256,192,302039,1,0,0:0:0:0: +402,192,302039,1,0,0:0:0:0: +329,192,302118,128,0,302276:0:0:0:0: +475,192,302118,1,0,0:0:0:0: +402,192,302197,128,0,302355:0:0:0:0: +109,192,302197,1,0,0:0:0:0: +256,192,302276,128,0,302355:0:0:0:0: +109,192,302355,128,0,302434:0:0:0:0: +475,192,302355,128,0,302671:0:0:0:0: +182,192,302355,1,0,0:0:0:0: +329,192,302355,128,0,302434:0:0:0:0: +256,192,302434,1,0,0:0:0:0: +182,192,302513,128,0,302592:0:0:0:0: +36,192,302513,1,0,0:0:0:0: +402,192,302513,128,0,302592:0:0:0:0: +256,192,302592,1,0,0:0:0:0: +182,192,302671,128,0,302750:0:0:0:0: +36,192,302671,128,0,302986:0:0:0:0: +329,192,302671,1,0,0:0:0:0: +109,192,302671,128,0,302750:0:0:0:0: +475,192,302750,128,0,302828:0:0:0:0: +256,192,302750,1,0,0:0:0:0: +329,192,302828,128,0,302907:0:0:0:0: +109,192,302828,1,0,0:0:0:0: +402,192,302828,128,0,302907:0:0:0:0: +182,192,302907,1,0,0:0:0:0: +256,192,302986,128,0,303065:0:0:0:0: +475,192,302986,128,0,303302:0:0:0:0: +329,192,302986,1,0,0:0:0:0: +402,192,302986,1,0,0:0:0:0: +109,192,302986,128,0,303065:0:0:0:0: +182,192,303065,1,0,0:0:0:0: +256,192,303144,128,0,303223:0:0:0:0: +36,192,303144,1,0,0:0:0:0: +402,192,303144,128,0,303223:0:0:0:0: +182,192,303223,128,0,303302:0:0:0:0: +329,192,303223,1,0,0:0:0:0: +256,192,303302,128,0,303381:0:0:0:0: +36,192,303302,128,0,303618:0:0:0:0: +402,192,303302,1,0,0:0:0:0: +109,192,303302,128,0,303381:0:0:0:0: +329,192,303381,1,0,0:0:0:0: +402,192,303460,128,0,303618:0:0:0:0: +475,192,303460,1,0,0:0:0:0: +109,192,303460,1,0,0:0:0:0: +256,192,303460,128,0,303539:0:0:0:0: +329,192,303539,128,0,303618:0:0:0:0: +182,192,303539,1,0,0:0:0:0: +475,192,303618,128,0,303776:0:0:0:0: +109,192,303618,1,0,0:0:0:0: +256,192,303618,128,0,303697:0:0:0:0: +182,192,303697,1,0,0:0:0:0: +36,192,303776,128,0,303855:0:0:0:0: +329,192,303776,1,0,0:0:0:0: +109,192,303776,128,0,303855:0:0:0:0: +256,192,303855,1,0,0:0:0:0: +182,192,303934,128,0,304013:0:0:0:0: +475,192,303934,1,0,0:0:0:0: +36,192,303934,1,0,0:0:0:0: +402,192,303934,128,0,304013:0:0:0:0: +109,192,304013,128,0,304171:0:0:0:0: +329,192,304013,128,0,304092:0:0:0:0: +256,192,304092,128,0,304171:0:0:0:0: +475,192,304092,128,0,304171:0:0:0:0: +329,192,304171,128,0,304250:0:0:0:0: +402,192,304171,128,0,304250:0:0:0:0: +36,192,304250,128,0,304486:0:0:0:0: +256,192,304250,1,0,0:0:0:0: +182,192,304250,128,0,304328:0:0:0:0: +109,192,304250,1,0,0:0:0:0: +475,192,304328,128,0,304407:0:0:0:0: +329,192,304328,128,0,304407:0:0:0:0: +256,192,304407,128,0,304486:0:0:0:0: +402,192,304407,128,0,304486:0:0:0:0: +109,192,304407,1,0,0:0:0:0: +182,192,304486,128,0,304565:0:0:0:0: +329,192,304486,1,0,0:0:0:0: +475,192,304565,128,0,304802:0:0:0:0: +256,192,304565,1,0,0:0:0:0: +402,192,304565,1,0,0:0:0:0: +36,192,304565,1,0,0:0:0:0: +329,192,304644,128,0,304723:0:0:0:0: +109,192,304644,1,0,0:0:0:0: +182,192,304723,128,0,304802:0:0:0:0: +36,192,304723,1,0,0:0:0:0: +402,192,304723,1,0,0:0:0:0: +256,192,304802,128,0,304881:0:0:0:0: +109,192,304802,1,0,0:0:0:0: +329,192,304881,128,0,304960:0:0:0:0: +36,192,304881,128,0,305197:0:0:0:0: +182,192,304881,1,0,0:0:0:0: +475,192,304881,128,0,304960:0:0:0:0: +109,192,304960,1,0,0:0:0:0: +402,192,305039,128,0,305118:0:0:0:0: +475,192,305039,1,0,0:0:0:0: +256,192,305039,128,0,305118:0:0:0:0: +182,192,305118,1,0,0:0:0:0: +256,192,305197,128,0,305276:0:0:0:0: +475,192,305197,128,0,305513:0:0:0:0: +402,192,305197,1,0,0:0:0:0: +109,192,305197,128,0,305276:0:0:0:0: +329,192,305276,128,0,305355:0:0:0:0: +182,192,305355,128,0,305434:0:0:0:0: +402,192,305355,1,0,0:0:0:0: +36,192,305355,128,0,305434:0:0:0:0: +256,192,305434,1,0,0:0:0:0: +109,192,305513,128,0,305592:0:0:0:0: +36,192,305513,128,0,305828:0:0:0:0: +182,192,305513,1,0,0:0:0:0: +402,192,305513,128,0,305592:0:0:0:0: +256,192,305592,1,0,0:0:0:0: +182,192,305671,128,0,305750:0:0:0:0: +329,192,305671,1,0,0:0:0:0: +475,192,305671,128,0,305750:0:0:0:0: +256,192,305750,128,0,305828:0:0:0:0: +329,192,305828,128,0,305907:0:0:0:0: +475,192,305828,128,0,306144:0:0:0:0: +109,192,305828,1,0,0:0:0:0: +402,192,305828,128,0,305907:0:0:0:0: +182,192,305907,1,0,0:0:0:0: +109,192,305986,128,0,306144:0:0:0:0: +36,192,305986,1,0,0:0:0:0: +256,192,305986,128,0,306065:0:0:0:0: +182,192,306065,128,0,306144:0:0:0:0: +329,192,306065,1,0,0:0:0:0: +256,192,306144,128,0,306223:0:0:0:0: +36,192,306144,128,0,306460:0:0:0:0: +402,192,306144,128,0,306223:0:0:0:0: +329,192,306223,1,0,0:0:0:0: +475,192,306302,128,0,306381:0:0:0:0: +256,192,306302,1,0,0:0:0:0: +109,192,306302,128,0,306381:0:0:0:0: +182,192,306381,128,0,306460:0:0:0:0: +329,192,306381,1,0,0:0:0:0: +256,192,306460,128,0,306539:0:0:0:0: +475,192,306460,128,0,306776:0:0:0:0: +109,192,306460,1,0,0:0:0:0: +402,192,306460,128,0,306539:0:0:0:0: +36,192,306539,128,0,306618:0:0:0:0: +182,192,306539,1,0,0:0:0:0: +329,192,306618,128,0,306776:0:0:0:0: +402,192,306618,1,0,0:0:0:0: +109,192,306618,128,0,306697:0:0:0:0: +256,192,306697,128,0,306776:0:0:0:0: +182,192,306776,128,0,306855:0:0:0:0: +36,192,306776,128,0,307092:0:0:0:0: +109,192,306776,1,0,0:0:0:0: +402,192,306776,128,0,306855:0:0:0:0: +329,192,306855,1,0,0:0:0:0: +402,192,306934,128,0,307092:0:0:0:0: +475,192,306934,1,0,0:0:0:0: +256,192,306934,128,0,307013:0:0:0:0: +182,192,307013,128,0,307092:0:0:0:0: +109,192,307013,1,0,0:0:0:0: +329,192,307092,128,0,307328:0:0:0:0: +475,192,307092,128,0,307328:0:0:0:0: +256,192,307092,128,0,307171:0:0:0:0: +36,192,307171,128,0,307407:0:0:0:0: +109,192,307171,128,0,307250:0:0:0:0: +182,192,307250,128,0,307407:0:0:0:0: +402,192,307250,128,0,307328:0:0:0:0: +256,192,307328,128,0,307407:0:0:0:0: +475,192,307407,128,0,308039:0:0:0:0: +329,192,307407,128,0,308039:0:0:0:0: +109,192,307407,128,0,307565:0:0:0:0: +402,192,307407,128,0,307486:0:0:0:0: +36,192,307486,128,0,307644:0:0:0:0: +256,192,307486,128,0,307565:0:0:0:0: +182,192,307565,128,0,307723:0:0:0:0: +402,192,307565,128,0,307644:0:0:0:0: +109,192,307644,128,0,307802:0:0:0:0: +256,192,307723,128,0,307881:0:0:0:0: +36,192,307723,128,0,307802:0:0:0:0: +182,192,307802,128,0,307960:0:0:0:0: +402,192,307802,128,0,307881:0:0:0:0: +36,192,307881,128,0,307960:0:0:0:0: +256,192,307960,128,0,308039:0:0:0:0: +109,192,307960,128,0,308118:0:0:0:0: +402,192,308039,128,0,308197:0:0:0:0: +36,192,308039,128,0,308671:0:0:0:0: +182,192,308039,128,0,308671:0:0:0:0: +256,192,308118,128,0,308197:0:0:0:0: +475,192,308118,128,0,308276:0:0:0:0: +109,192,308197,128,0,308276:0:0:0:0: +329,192,308197,128,0,308355:0:0:0:0: +402,192,308276,128,0,308434:0:0:0:0: +256,192,308355,128,0,308513:0:0:0:0: +475,192,308355,128,0,308434:0:0:0:0: +329,192,308434,128,0,308592:0:0:0:0: +109,192,308434,128,0,308513:0:0:0:0: +475,192,308513,128,0,308592:0:0:0:0: +256,192,308592,128,0,308671:0:0:0:0: +402,192,308592,128,0,308671:0:0:0:0: +475,192,308671,128,0,308828:0:0:0:0: +329,192,308671,128,0,308750:0:0:0:0: +109,192,308671,128,0,308828:0:0:0:0: +256,192,308750,128,0,308828:0:0:0:0: +36,192,308828,128,0,308986:0:0:0:0: +182,192,308828,128,0,308907:0:0:0:0: +402,192,308828,128,0,308986:0:0:0:0: +256,192,308907,128,0,308986:0:0:0:0: +329,192,308986,128,0,309144:0:0:0:0: +475,192,308986,128,0,309065:0:0:0:0: +109,192,308986,128,0,309065:0:0:0:0: +256,192,309065,128,0,309144:0:0:0:0: +182,192,309144,128,0,309302:0:0:0:0: +475,192,309144,128,0,309223:0:0:0:0: +36,192,309144,128,0,309223:0:0:0:0: +329,192,309223,128,0,309302:0:0:0:0: +109,192,309302,128,0,309381:0:0:0:0: +402,192,309302,128,0,309381:0:0:0:0: +36,192,309302,128,0,309539:0:0:0:0: +475,192,309302,128,0,309539:0:0:0:0: +256,192,309381,128,0,309460:0:0:0:0: +329,192,309460,128,0,309539:0:0:0:0: +182,192,309460,128,0,309539:0:0:0:0: +109,192,309539,128,0,309618:0:0:0:0: +402,192,309539,128,0,309618:0:0:0:0: +475,192,309618,128,0,309697:0:0:0:0: +329,192,309618,128,0,309697:0:0:0:0: +182,192,309618,128,0,309697:0:0:0:0: +36,192,309618,128,0,309697:0:0:0:0: +36,192,309776,128,0,309855:0:0:0:0: +182,192,309776,128,0,309855:0:0:0:0: +329,192,309776,128,0,309855:0:0:0:0: +475,192,309776,128,0,309855:0:0:0:0: +329,192,309934,128,0,310013:0:0:0:0: +36,192,309934,128,0,310250:0:0:0:0: +182,192,309934,128,0,310013:0:0:0:0: +475,192,309934,128,0,310013:0:0:0:0: +256,192,310013,128,0,310092:0:0:0:0: +109,192,310013,128,0,310092:0:0:0:0: +402,192,310013,128,0,310092:0:0:0:0: +109,192,310171,128,0,310250:0:0:0:0: +329,192,310171,128,0,310250:0:0:0:0: +256,192,310171,128,0,310250:0:0:0:0: +182,192,310250,128,0,310328:0:0:0:0: +475,192,310250,128,0,310565:0:0:0:0: +402,192,310250,128,0,310328:0:0:0:0: +329,192,310328,128,0,310407:0:0:0:0: +109,192,310328,1,0,0:0:0:0: +36,192,310407,128,0,310486:0:0:0:0: +182,192,310407,1,0,0:0:0:0: +256,192,310407,128,0,310486:0:0:0:0: +109,192,310486,1,0,0:0:0:0: +36,192,310565,128,0,310881:0:0:0:0: +182,192,310565,128,0,310644:0:0:0:0: +402,192,310565,1,0,0:0:0:0: +329,192,310565,128,0,310644:0:0:0:0: +109,192,310644,1,0,0:0:0:0: +256,192,310723,128,0,310802:0:0:0:0: +329,192,310723,1,0,0:0:0:0: +475,192,310723,128,0,310802:0:0:0:0: +182,192,310802,1,0,0:0:0:0: +402,192,310802,128,0,310881:0:0:0:0: +256,192,310881,128,0,310960:0:0:0:0: +475,192,310881,128,0,311197:0:0:0:0: +109,192,310881,1,0,0:0:0:0: +329,192,310881,128,0,310960:0:0:0:0: +182,192,310960,1,0,0:0:0:0: +109,192,311039,128,0,311118:0:0:0:0: +402,192,311039,1,0,0:0:0:0: +36,192,311039,128,0,311118:0:0:0:0: +256,192,311039,1,0,0:0:0:0: +182,192,311118,128,0,311197:0:0:0:0: +329,192,311118,1,0,0:0:0:0: +256,192,311197,128,0,311276:0:0:0:0: +36,192,311197,128,0,311513:0:0:0:0: +109,192,311197,1,0,0:0:0:0: +402,192,311197,128,0,311276:0:0:0:0: +329,192,311276,1,0,0:0:0:0: +109,192,311355,128,0,311434:0:0:0:0: +475,192,311355,1,0,0:0:0:0: +256,192,311355,128,0,311434:0:0:0:0: +182,192,311434,128,0,311513:0:0:0:0: +402,192,311434,1,0,0:0:0:0: +256,192,311513,128,0,311671:0:0:0:0: +475,192,311513,128,0,311828:0:0:0:0: +329,192,311513,1,0,0:0:0:0: +109,192,311513,1,0,0:0:0:0: +36,192,311592,128,0,311671:0:0:0:0: +182,192,311592,1,0,0:0:0:0: +329,192,311671,128,0,311828:0:0:0:0: +109,192,311671,1,0,0:0:0:0: +402,192,311671,1,0,0:0:0:0: +182,192,311750,128,0,311828:0:0:0:0: +109,192,311828,128,0,311907:0:0:0:0: +36,192,311828,128,0,312144:0:0:0:0: +256,192,311828,1,0,0:0:0:0: +402,192,311828,128,0,311907:0:0:0:0: +329,192,311907,128,0,311986:0:0:0:0: +475,192,311986,128,0,312065:0:0:0:0: +109,192,311986,1,0,0:0:0:0: +256,192,311986,128,0,312065:0:0:0:0: +402,192,312065,128,0,312144:0:0:0:0: +182,192,312065,1,0,0:0:0:0: +256,192,312144,128,0,312460:0:0:0:0: +475,192,312144,128,0,312460:0:0:0:0: +329,192,312144,1,0,0:0:0:0: +109,192,312144,128,0,312223:0:0:0:0: +182,192,312223,128,0,312381:0:0:0:0: +402,192,312302,1,0,0:0:0:0: +109,192,312302,128,0,312460:0:0:0:0: +36,192,312302,1,0,0:0:0:0: +329,192,312381,128,0,312460:0:0:0:0: +402,192,312460,128,0,312539:0:0:0:0: +36,192,312460,128,0,312776:0:0:0:0: +182,192,312460,128,0,312539:0:0:0:0: +329,192,312539,1,0,0:0:0:0: +475,192,312618,128,0,312697:0:0:0:0: +109,192,312618,1,0,0:0:0:0: +256,192,312618,128,0,312697:0:0:0:0: +329,192,312697,1,0,0:0:0:0: +109,192,312776,128,0,312855:0:0:0:0: +475,192,312776,128,0,313092:0:0:0:0: +182,192,312776,1,0,0:0:0:0: +256,192,312776,128,0,312855:0:0:0:0: +329,192,312855,1,0,0:0:0:0: +402,192,312855,128,0,312934:0:0:0:0: +182,192,312934,128,0,313013:0:0:0:0: +256,192,312934,1,0,0:0:0:0: +36,192,312934,128,0,313013:0:0:0:0: +329,192,313013,1,0,0:0:0:0: +256,192,313092,128,0,313171:0:0:0:0: +36,192,313092,128,0,313407:0:0:0:0: +109,192,313092,1,0,0:0:0:0: +402,192,313092,128,0,313171:0:0:0:0: +182,192,313171,1,0,0:0:0:0: +329,192,313250,128,0,313328:0:0:0:0: +109,192,313250,1,0,0:0:0:0: +475,192,313250,128,0,313328:0:0:0:0: +256,192,313328,128,0,313407:0:0:0:0: +182,192,313328,1,0,0:0:0:0: +329,192,313407,128,0,313486:0:0:0:0: +475,192,313407,128,0,313723:0:0:0:0: +109,192,313407,1,0,0:0:0:0: +402,192,313407,128,0,313486:0:0:0:0: +182,192,313486,1,0,0:0:0:0: +109,192,313565,128,0,313723:0:0:0:0: +36,192,313565,1,0,0:0:0:0: +402,192,313565,1,0,0:0:0:0: +256,192,313565,128,0,313644:0:0:0:0: +182,192,313644,128,0,313723:0:0:0:0: +329,192,313644,1,0,0:0:0:0: +36,192,313723,128,0,313881:0:0:0:0: +402,192,313723,128,0,313802:0:0:0:0: +256,192,313723,128,0,313802:0:0:0:0: +182,192,313802,1,0,0:0:0:0: +329,192,313881,128,0,313960:0:0:0:0: +402,192,313881,1,0,0:0:0:0: +475,192,313881,128,0,313960:0:0:0:0: +109,192,313881,128,0,313960:0:0:0:0: +256,192,313960,128,0,314039:0:0:0:0: +182,192,314039,128,0,314118:0:0:0:0: +475,192,314039,1,0,0:0:0:0: +36,192,314039,128,0,314118:0:0:0:0: +402,192,314039,128,0,314118:0:0:0:0: +329,192,314118,128,0,314276:0:0:0:0: +182,192,314197,128,0,314276:0:0:0:0: +109,192,314197,1,0,0:0:0:0: +36,192,314197,128,0,314276:0:0:0:0: +475,192,314197,128,0,314276:0:0:0:0: +256,192,314276,128,0,314355:0:0:0:0: +109,192,314355,128,0,314513:0:0:0:0: +475,192,314355,128,0,314434:0:0:0:0: +36,192,314355,128,0,314434:0:0:0:0: +329,192,314355,128,0,314434:0:0:0:0: +402,192,314434,128,0,314671:0:0:0:0: +329,192,314513,128,0,314592:0:0:0:0: +36,192,314513,1,0,0:0:0:0: +475,192,314513,1,0,0:0:0:0: +182,192,314513,128,0,314592:0:0:0:0: +256,192,314592,128,0,314671:0:0:0:0: +109,192,314671,128,0,314986:0:0:0:0: +182,192,314671,1,0,0:0:0:0: +475,192,314671,128,0,314750:0:0:0:0: +36,192,314671,128,0,314750:0:0:0:0: +329,192,314750,128,0,314907:0:0:0:0: +256,192,314750,1,0,0:0:0:0: +182,192,314828,128,0,314907:0:0:0:0: +36,192,314828,1,0,0:0:0:0: +475,192,314828,1,0,0:0:0:0: +256,192,314907,128,0,314986:0:0:0:0: +402,192,314907,128,0,314986:0:0:0:0: +182,192,314986,128,0,315065:0:0:0:0: +475,192,314986,128,0,315302:0:0:0:0: +36,192,314986,128,0,315065:0:0:0:0: +329,192,314986,1,0,0:0:0:0: +402,192,315065,1,0,0:0:0:0: +109,192,315144,128,0,315223:0:0:0:0: +256,192,315144,128,0,315223:0:0:0:0: +36,192,315144,1,0,0:0:0:0: +329,192,315223,1,0,0:0:0:0: +402,192,315302,128,0,315381:0:0:0:0: +36,192,315302,128,0,315618:0:0:0:0: +109,192,315302,128,0,315381:0:0:0:0: +256,192,315302,1,0,0:0:0:0: +182,192,315381,128,0,315460:0:0:0:0: +329,192,315381,1,0,0:0:0:0: +256,192,315460,128,0,315539:0:0:0:0: +475,192,315460,128,0,315539:0:0:0:0: +402,192,315460,1,0,0:0:0:0: +109,192,315539,1,0,0:0:0:0: +402,192,315618,128,0,315697:0:0:0:0: +475,192,315618,128,0,315934:0:0:0:0: +182,192,315618,1,0,0:0:0:0: +329,192,315618,128,0,315697:0:0:0:0: +109,192,315697,1,0,0:0:0:0: +402,192,315776,128,0,315855:0:0:0:0: +36,192,315776,1,0,0:0:0:0: +256,192,315776,128,0,315855:0:0:0:0: +182,192,315855,128,0,315934:0:0:0:0: +109,192,315934,128,0,316013:0:0:0:0: +36,192,315934,128,0,316250:0:0:0:0: +402,192,315934,1,0,0:0:0:0: +329,192,315934,128,0,316013:0:0:0:0: +256,192,316013,1,0,0:0:0:0: +402,192,316092,128,0,316250:0:0:0:0: +475,192,316092,1,0,0:0:0:0: +182,192,316092,128,0,316171:0:0:0:0: +329,192,316171,128,0,316250:0:0:0:0: +475,192,316250,128,0,316565:0:0:0:0: +256,192,316250,128,0,316328:0:0:0:0: +109,192,316250,128,0,316328:0:0:0:0: +329,192,316328,1,0,0:0:0:0: +402,192,316407,128,0,316486:0:0:0:0: +36,192,316407,1,0,0:0:0:0: +182,192,316407,128,0,316486:0:0:0:0: +329,192,316486,128,0,316565:0:0:0:0: +256,192,316565,128,0,316644:0:0:0:0: +36,192,316565,128,0,316881:0:0:0:0: +402,192,316565,1,0,0:0:0:0: +109,192,316565,128,0,316644:0:0:0:0: +329,192,316644,128,0,316723:0:0:0:0: +475,192,316644,1,0,0:0:0:0: +402,192,316723,128,0,316802:0:0:0:0: +109,192,316723,1,0,0:0:0:0: +182,192,316723,128,0,316802:0:0:0:0: +256,192,316802,128,0,316881:0:0:0:0: +475,192,316881,128,0,316960:0:0:0:0: +329,192,316881,1,0,0:0:0:0: +182,192,316881,1,0,0:0:0:0: +256,192,316960,1,0,0:0:0:0: +109,192,316960,1,0,0:0:0:0: +329,192,317039,128,0,317118:0:0:0:0: +182,192,317039,1,0,0:0:0:0: +36,192,317039,1,0,0:0:0:0: +475,192,317118,128,0,317434:0:0:0:0: +256,192,317118,1,0,0:0:0:0: +109,192,317118,1,0,0:0:0:0: +329,192,317197,1,0,0:0:0:0: +36,192,317197,128,0,317434:0:0:0:0: +402,192,317197,128,0,317276:0:0:0:0: +182,192,317197,1,0,0:0:0:0: +256,192,317276,128,0,317355:0:0:0:0: +109,192,317276,128,0,317355:0:0:0:0: +402,192,317355,1,0,0:0:0:0: +182,192,317355,128,0,317434:0:0:0:0: +329,192,317355,128,0,317434:0:0:0:0: +256,192,317434,1,0,0:0:0:0: +182,192,317513,1,0,0:0:0:0: +36,192,317513,1,0,0:0:0:0: +329,192,317513,1,0,0:0:0:0: +475,192,317513,1,0,0:0:0:0: +402,192,317513,1,0,0:0:0:0: +182,192,317671,1,0,0:0:0:0: +329,192,317671,1,0,0:0:0:0: +36,192,317671,1,0,0:0:0:0: +182,192,317828,128,0,317907:0:0:0:0: +329,192,317828,128,0,317907:0:0:0:0: +256,192,317907,128,0,317986:0:0:0:0: +402,192,317907,128,0,317986:0:0:0:0: +329,192,317986,128,0,318065:0:0:0:0: +475,192,317986,128,0,318065:0:0:0:0: +475,192,318144,1,0,0:0:0:0: +402,192,318144,1,0,0:0:0:0: +36,192,318144,1,0,0:0:0:0: +182,192,318144,1,0,0:0:0:0: +109,192,318144,1,0,0:0:0:0: +329,192,318302,128,0,318381:0:0:0:0: +182,192,318302,128,0,318381:0:0:0:0: +256,192,318381,128,0,318460:0:0:0:0: +109,192,318381,128,0,318460:0:0:0:0: +182,192,318460,128,0,318539:0:0:0:0: +36,192,318460,128,0,318539:0:0:0:0: +329,192,318618,128,0,318697:0:0:0:0: +475,192,318618,128,0,318697:0:0:0:0: +256,192,318697,128,0,318776:0:0:0:0: +402,192,318697,128,0,318776:0:0:0:0: +182,192,318776,128,0,318855:0:0:0:0: +109,192,318776,128,0,318855:0:0:0:0: +36,192,318776,128,0,318855:0:0:0:0: +475,192,318776,128,0,318855:0:0:0:0: +329,192,318776,128,0,318855:0:0:0:0: +402,192,318934,1,0,0:0:0:0: +256,192,318934,1,0,0:0:0:0: +109,192,318934,1,0,0:0:0:0: +36,192,319092,128,0,319171:0:0:0:0: +182,192,319092,128,0,319171:0:0:0:0: +256,192,319092,128,0,319171:0:0:0:0: +329,192,319092,128,0,319171:0:0:0:0: +475,192,319092,128,0,319171:0:0:0:0: +402,192,319250,1,0,0:0:0:0: +256,192,319250,1,0,0:0:0:0: +109,192,319250,1,0,0:0:0:0: +36,192,319407,128,0,319486:0:0:0:0: +109,192,319407,128,0,319486:0:0:0:0: +256,192,319407,128,0,319486:0:0:0:0: +402,192,319407,128,0,319486:0:0:0:0: +475,192,319407,128,0,319486:0:0:0:0: +402,192,319565,1,0,0:0:0:0: +256,192,319565,1,0,0:0:0:0: +109,192,319565,1,0,0:0:0:0: +36,192,319723,128,0,319960:0:0:0:0: +109,192,319723,128,0,319960:0:0:0:0: +182,192,319723,128,0,319960:0:0:0:0: +329,192,319723,128,0,319960:0:0:0:0: +402,192,319723,128,0,319960:0:0:0:0: +475,192,319723,128,0,319960:0:0:0:0: +329,192,320039,128,0,320434:0:0:0:0: +475,192,320039,128,0,320434:0:0:0:0: +36,192,320039,128,0,320197:0:0:0:0: +109,192,320039,1,0,0:0:0:0: +256,192,320039,1,0,0:0:0:0: +402,192,320039,1,0,0:0:0:0: +182,192,320197,128,0,320434:0:0:0:0: +36,192,320355,128,0,320434:0:0:0:0: +109,192,320513,128,0,320907:0:0:0:0: +256,192,320513,128,0,320907:0:0:0:0: +475,192,320513,128,0,320671:0:0:0:0: +182,192,320513,1,0,0:0:0:0: +36,192,320513,1,0,0:0:0:0: +329,192,320513,1,0,0:0:0:0: +402,192,320671,128,0,320907:0:0:0:0: +475,192,320828,128,0,320907:0:0:0:0: +36,192,320986,128,0,322486:0:0:0:0: +475,192,320986,1,0,0:0:0:0: +182,192,320986,128,0,322486:0:0:0:0: +329,192,320986,128,0,322486:0:0:0:0: +109,192,320986,1,0,0:0:0:0: +256,192,320986,1,0,0:0:0:0: +402,192,321065,1,0,0:0:0:0: +256,192,321144,1,0,0:0:0:0: +402,192,321223,1,0,0:0:0:0: +475,192,321302,1,0,0:0:0:0: +402,192,321381,1,0,0:0:0:0: +256,192,321460,1,0,0:0:0:0: +109,192,321539,1,0,0:0:0:0: +256,192,321618,1,0,0:0:0:0: +402,192,321697,1,0,0:0:0:0: +475,192,321776,1,0,0:0:0:0: +402,192,321855,1,0,0:0:0:0: +256,192,321934,1,0,0:0:0:0: +109,192,322013,1,0,0:0:0:0: +256,192,322092,1,0,0:0:0:0: +402,192,322171,1,0,0:0:0:0: +475,192,322250,1,0,0:0:0:0: +402,192,322328,1,0,0:0:0:0: +256,192,322407,1,0,0:0:0:0: +109,192,322486,1,0,0:0:0:0: +182,192,322565,128,0,322960:0:0:0:0: +329,192,322565,128,0,322723:0:0:0:0: +36,192,322565,128,0,322960:0:0:0:0: +256,192,322565,1,0,0:0:0:0: +475,192,322565,1,0,0:0:0:0: +402,192,322565,1,0,0:0:0:0: +475,192,322723,128,0,322960:0:0:0:0: +329,192,322881,128,0,322960:0:0:0:0: +256,192,323039,128,0,323434:0:0:0:0: +402,192,323039,128,0,323434:0:0:0:0: +36,192,323039,128,0,323197:0:0:0:0: +182,192,323039,1,0,0:0:0:0: +329,192,323039,1,0,0:0:0:0: +475,192,323039,1,0,0:0:0:0: +109,192,323197,128,0,323434:0:0:0:0: +36,192,323355,128,0,323434:0:0:0:0: +475,192,323513,128,0,325013:0:0:0:0: +329,192,323513,128,0,325171:0:0:0:0: +182,192,323513,128,0,325328:0:0:0:0: +36,192,323513,1,0,0:0:0:0: +256,192,323513,1,0,0:0:0:0: +402,192,323513,1,0,0:0:0:0: +109,192,323592,1,0,0:0:0:0: +256,192,323671,1,0,0:0:0:0: +109,192,323750,1,0,0:0:0:0: +36,192,323828,1,0,0:0:0:0: +109,192,323907,1,0,0:0:0:0: +256,192,323986,1,0,0:0:0:0: +402,192,324065,1,0,0:0:0:0: +256,192,324144,1,0,0:0:0:0: +109,192,324223,1,0,0:0:0:0: +36,192,324302,1,0,0:0:0:0: +109,192,324381,1,0,0:0:0:0: +256,192,324460,1,0,0:0:0:0: +402,192,324539,1,0,0:0:0:0: +256,192,324618,1,0,0:0:0:0: +109,192,324697,1,0,0:0:0:0: +36,192,324776,1,0,0:0:0:0: +109,192,324855,1,0,0:0:0:0: +256,192,324934,1,0,0:0:0:0: +402,192,325013,1,0,0:0:0:0: +475,192,325092,1,0,0:0:0:0: +36,192,325092,1,0,0:0:0:0: +109,192,325092,1,0,0:0:0:0: +402,192,325171,1,0,0:0:0:0: +329,192,325250,1,0,0:0:0:0: +36,192,325250,1,0,0:0:0:0: +475,192,325250,1,0,0:0:0:0: +256,192,325328,1,0,0:0:0:0: +182,192,325407,1,0,0:0:0:0: +402,192,325407,1,0,0:0:0:0: +475,192,325407,1,0,0:0:0:0: +109,192,325486,1,0,0:0:0:0: +256,192,325565,1,0,0:0:0:0: +36,192,325565,1,0,0:0:0:0: +475,192,325565,1,0,0:0:0:0: +402,192,325644,1,0,0:0:0:0: +329,192,325723,1,0,0:0:0:0: +182,192,325723,1,0,0:0:0:0: +36,192,325723,128,0,326355:0:0:0:0: +402,192,325802,1,0,0:0:0:0: +475,192,325881,1,0,0:0:0:0: +256,192,325881,1,0,0:0:0:0: +329,192,325960,1,0,0:0:0:0: +402,192,326039,1,0,0:0:0:0: +182,192,326039,1,0,0:0:0:0: +256,192,326092,1,0,0:0:0:0: +329,192,326144,1,0,0:0:0:0: +109,192,326197,1,0,0:0:0:0: +182,192,326236,1,0,0:0:0:0: +256,192,326276,1,0,0:0:0:0: +329,192,326315,1,0,0:0:0:0: +402,192,326355,1,0,0:0:0:0: +109,192,326355,1,0,0:0:0:0: +182,192,326355,1,0,0:0:0:0: +475,192,326355,1,0,0:0:0:0: +256,192,326513,1,0,0:0:0:0: +109,192,326513,1,0,0:0:0:0: +36,192,326513,1,0,0:0:0:0: +182,192,326592,1,0,0:0:0:0: +329,192,326592,1,0,0:0:0:0: +402,192,326592,1,0,0:0:0:0: +475,192,326592,1,0,0:0:0:0: +402,192,326750,1,0,0:0:0:0: +256,192,326750,1,0,0:0:0:0: +475,192,326750,1,0,0:0:0:0: +36,192,326828,1,0,0:0:0:0: +182,192,326828,1,0,0:0:0:0: +109,192,326828,1,0,0:0:0:0: +329,192,326828,1,0,0:0:0:0: +256,192,326986,1,0,0:0:0:0: +36,192,326986,1,0,0:0:0:0: +475,192,326986,1,0,0:0:0:0: +329,192,327065,1,0,0:0:0:0: +402,192,327065,1,0,0:0:0:0: +109,192,327144,1,0,0:0:0:0: +182,192,327144,1,0,0:0:0:0: +329,192,327223,1,0,0:0:0:0: +402,192,327223,1,0,0:0:0:0: +256,192,327302,1,0,0:0:0:0: +36,192,327302,1,0,0:0:0:0: +475,192,327302,1,0,0:0:0:0: +182,192,327302,1,0,0:0:0:0: +109,192,327460,1,0,0:0:0:0: +182,192,327460,1,0,0:0:0:0: +402,192,327460,1,0,0:0:0:0: +329,192,327460,1,0,0:0:0:0: +329,192,327618,128,0,328013:0:0:0:0: +475,192,327618,128,0,328013:0:0:0:0: +182,192,327618,128,0,327776:0:0:0:0: +36,192,327618,1,0,0:0:0:0: +402,192,327618,1,0,0:0:0:0: +109,192,327618,1,0,0:0:0:0: +36,192,327776,128,0,328013:0:0:0:0: +182,192,327934,128,0,328013:0:0:0:0: +109,192,328092,128,0,328486:0:0:0:0: +256,192,328092,128,0,328486:0:0:0:0: +402,192,328092,128,0,328250:0:0:0:0: +182,192,328092,1,0,0:0:0:0: +36,192,328092,1,0,0:0:0:0: +475,192,328092,1,0,0:0:0:0: +475,192,328250,128,0,328486:0:0:0:0: +402,192,328407,128,0,328486:0:0:0:0: +182,192,328565,128,0,328960:0:0:0:0: +36,192,328565,128,0,328960:0:0:0:0: +329,192,328565,128,0,328723:0:0:0:0: +475,192,328565,1,0,0:0:0:0: +109,192,328565,1,0,0:0:0:0: +402,192,328565,1,0,0:0:0:0: +475,192,328723,128,0,328960:0:0:0:0: +329,192,328881,128,0,328960:0:0:0:0: +402,192,329039,128,0,329197:0:0:0:0: +256,192,329039,128,0,329434:0:0:0:0: +109,192,329039,128,0,329434:0:0:0:0: +329,192,329039,1,0,0:0:0:0: +475,192,329039,1,0,0:0:0:0: +36,192,329039,1,0,0:0:0:0: +329,192,329197,128,0,329434:0:0:0:0: +402,192,329355,128,0,329434:0:0:0:0: +182,192,329513,128,0,329907:0:0:0:0: +36,192,329513,128,0,329907:0:0:0:0: +475,192,329513,128,0,329907:0:0:0:0: +329,192,329513,128,0,329671:0:0:0:0: +109,192,329513,1,0,0:0:0:0: +256,192,329513,1,0,0:0:0:0: +402,192,329671,128,0,329907:0:0:0:0: +329,192,329828,128,0,329907:0:0:0:0: +109,192,329986,128,0,330381:0:0:0:0: +256,192,329986,128,0,330144:0:0:0:0: +402,192,329986,128,0,330381:0:0:0:0: +36,192,329986,1,0,0:0:0:0: +329,192,329986,1,0,0:0:0:0: +475,192,329986,1,0,0:0:0:0: +182,192,330144,128,0,330381:0:0:0:0: +256,192,330302,128,0,330381:0:0:0:0: +36,192,330460,128,0,330855:0:0:0:0: +109,192,330460,128,0,330855:0:0:0:0: +402,192,330460,128,0,330618:0:0:0:0: +182,192,330460,1,0,0:0:0:0: +329,192,330460,1,0,0:0:0:0: +475,192,330460,1,0,0:0:0:0: +256,192,330618,128,0,330855:0:0:0:0: +402,192,330776,128,0,330855:0:0:0:0: +329,192,330934,128,0,331328:0:0:0:0: +402,192,330934,128,0,331328:0:0:0:0: +109,192,330934,128,0,331092:0:0:0:0: +36,192,330934,1,0,0:0:0:0: +256,192,330934,1,0,0:0:0:0: +475,192,330934,1,0,0:0:0:0: +182,192,331092,128,0,331328:0:0:0:0: +109,192,331250,128,0,331328:0:0:0:0: +36,192,331407,128,0,331802:0:0:0:0: +182,192,331407,128,0,331565:0:0:0:0: +402,192,331407,128,0,331802:0:0:0:0: +109,192,331407,1,0,0:0:0:0: +256,192,331407,1,0,0:0:0:0: +475,192,331407,1,0,0:0:0:0: +329,192,331565,128,0,331802:0:0:0:0: +182,192,331723,128,0,331802:0:0:0:0: +256,192,331881,128,0,332039:0:0:0:0: +475,192,331881,128,0,332355:0:0:0:0: +36,192,331881,1,0,0:0:0:0: +402,192,331881,1,0,0:0:0:0: +109,192,331881,128,0,332355:0:0:0:0: +329,192,332039,128,0,332355:0:0:0:0: +256,192,332197,128,0,332355:0:0:0:0: +36,192,332355,128,0,333934:0:0:0:0: +182,192,332355,128,0,332513:0:0:0:0: +402,192,332355,128,0,332513:0:0:0:0: +329,192,332513,128,0,333697:0:0:0:0: +475,192,332513,128,0,333618:0:0:0:0: +109,192,332513,128,0,333855:0:0:0:0: +256,192,332513,128,0,333776:0:0:0:0: From d0d0aae81af6695145bb352fd09805026c594415 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sat, 15 Apr 2023 23:23:30 -0400 Subject: [PATCH 51/87] Edit comments --- .../Difficulty/ManiaPerformanceCalculator.cs | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 96d160f480d2..f80ec58da0bb 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -15,6 +15,7 @@ using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; using osu.Game.Scoring; +using Precision = osu.Framework.Utils.Precision; namespace osu.Game.Rulesets.Mania.Difficulty { @@ -50,7 +51,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && totalJudgements == maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount; + isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && !Precision.DefinitelyBigger(totalJudgements, maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount); hitWindows = isLegacyScore ? getLegacyHitWindows(score, maniaAttributes) : getLazerHitWindows(score, maniaAttributes); estimatedUr = computeEstimatedUr(maniaAttributes); @@ -91,7 +92,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) private double totalSuccessfulJudgements => countPerfect + countOk + countGreat + countGood + countMeh; /// - /// Accuracy used to weight judgements independently from the score's actual accuracy. + /// Returns the estimated tapping deviation of the score, assuming the average hit location is in the center of the hit window. /// private double? computeEstimatedUr(ManiaDifficultyAttributes attributes) { @@ -99,10 +100,9 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) return null; // Lazer LN heads are the same as Notes, so return NoteCount + HoldNoteCount for lazer scores. - double nNoteCount = isLegacyScore ? Math.Log(attributes.NoteCount) : Math.Log(attributes.NoteCount + attributes.HoldNoteCount); - double nHoldCount = Math.Log(attributes.HoldNoteCount); + double logNoteCount = isLegacyScore ? Math.Log(attributes.NoteCount) : Math.Log(attributes.NoteCount + attributes.HoldNoteCount); + double logHoldCount = Math.Log(attributes.HoldNoteCount); - // Find the likelihood of a deviation resulting in the play's judgements. Higher is more likely, so we find the peak of the curve. double likelihoodGradient(double d) { if (d <= 0) @@ -112,7 +112,7 @@ double likelihoodGradient(double d) // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. JudgementProbs pHolds = isLegacyScore ? pHold(d) : pNote(d, tail_multiplier); - return -totalProb(pNotes, pHolds, nNoteCount, nHoldCount); + return -totalProb(pNotes, pHolds, logNoteCount, logHoldCount); } // Finding the minimum of the function returns the most likely deviation for the hit results. UR is deviation * 10. @@ -150,11 +150,9 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a { double[] lazerHitWindows = new double[5]; - // Create a new track of arbitrary length + // Create a new track of arbitrary length, and apply the total rate change of every mod to the track (i.e. DT = 1.01-2x, HT = 0.5-0.99x) var track = new TrackVirtual(10000); - // Apply the total rate change of every mod to the track (i.e. DT = 1.01-2x, HT = 0.5-0.99x) score.Mods.OfType().ForEach(m => m.ApplyToTrack(track)); - // The final clock rate is the rate of the track double clockRate = track.Rate; double windowMultiplier = 1 / clockRate; @@ -176,7 +174,6 @@ private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes a return lazerHitWindows; } - // This struct allows us to return the probability of hitting every judgement with a single method. private struct JudgementProbs { public double PMax; @@ -187,7 +184,7 @@ private struct JudgementProbs public double P0; } - // This method finds the probability of hitting a certain judgement on Notes given a deviation. The multiplier is for lazer LN tails, which are 1.5x as lenient. + // Probability of hitting a certain judgement on Notes given a deviation. The multiplier is for lazer LN tails, which are 1.5x as lenient. private JudgementProbs pNote(double d, double multiplier = 1) { JudgementProbs probabilities = new JudgementProbs @@ -203,7 +200,7 @@ private JudgementProbs pNote(double d, double multiplier = 1) return probabilities; } - // This method finds the probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. + // Probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. private JudgementProbs pHold(double d) { JudgementProbs probabilities = new JudgementProbs(); @@ -236,7 +233,9 @@ private JudgementProbs pHold(double d) return probabilities; } - // Combines pNotes and pHolds/pTails into 1 probability value for each judgement, and compares it to the judgements of the play. A higher output means the deviation is more likely. + /// + /// Combines pNotes and pHolds/pTails into a single probability value for each judgement, and compares them to the judgements of the play. + /// private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, double firstObjectCount, double secondObjectCount) { // firstObjectCount can be either Notes, or Notes + Holds, as stable LN heads don't behave like Notes but lazer LN heads do. @@ -259,27 +258,37 @@ private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, return totalProb; } - private double logPcNote(double x, double deviation) => logErfcApprox(x / (deviation * Math.Sqrt(2))); + /// + /// The log complementary probability of hitting within a hit window with a certain deviation. + /// + /// + /// A value from 0 (log of 1, 0% chance) to negative infinity (log of 0, 100% chance). + /// + private double logPcNote(double x, double deviation) => logErfc(x / (deviation * Math.Sqrt(2))); - // Legacy LN tails take the absolute error of both hit judgements on an LN, so we use a folded normal distribution to calculate it. - private double logPcHoldTail(double x, double deviation) => holdTailApprox(x / (deviation * Math.Sqrt(2))); + /// + /// The log complementary probability of hitting within a hit window with a certain deviation. + /// Exclusively for stable LN tails, as they give a result from 2 error values (total error on the head + the tail). + /// + /// + /// A value from 0 (log of 1, 0% chance) to negative infinity (log of 0, 100% chance). + /// + private double logPcHoldTail(double x, double deviation) => logProbTail(x / (deviation * Math.Sqrt(2))); - private double logErfcApprox(double x) => x <= 5 + private double logErfc(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) - : -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI)); // https://www.desmos.com/calculator/kdbxwxgf01 + : -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/kdbxwxgf01 - private double holdTailApprox(double x) => x <= 7 + private double logProbTail(double x) => x <= 7 ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) - : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // https://www.desmos.com/calculator/lgwyhx0fxo + : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/lgwyhx0fxo - // Log rules make addition and subtraction of the non-log value non-trivial, these methods simply add and subtract the base value of logs. private double logSum(double firstLog, double secondLog) { double maxVal = Math.Max(firstLog, secondLog); double minVal = Math.Min(firstLog, secondLog); // 0 in log form becomes negative infinity, so return negative infinity if both numbers are negative infinity. - // Shouldn't happen on any UR>0, but good for redundancy purposes. if (double.IsNegativeInfinity(maxVal)) { return maxVal; From 34c2cc08bdd4dfafc604775811275c340b1d0e99 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 00:11:51 -0400 Subject: [PATCH 52/87] Add comments and fail messages to UR estimation tests --- .../ManiaUnstableRateEstimationTest.cs | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 698e4c4b49b8..0c9850e0ea97 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -27,15 +27,18 @@ public class ManiaUnstableRateEstimationTest private const string resource_namespace = "Testing.Beatmaps"; protected string ResourceAssembly => "osu.Game.Rulesets.Mania"; + // Test that both SS scores and near 0% scores are handled properly, within a margin of +-0.001 UR [TestCase(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 }, "ur-estimation-test")] [TestCase(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 }, "ur-estimation-test")] public void Test1(double expectedEstimatedUnstableRate, int[] judgements, string name) => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name); + // General test to make sure UR estimation isn't changed by anything, within a margin of +-0.001 UR. Tests rate changes as well. [TestCase(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 }, "ur-estimation-test")] public void Test1ClockRateAdjusted(double expectedEstimatedUnstableRate, int[] judgements, string name) => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name, new ManiaModDoubleTime()); + // Compares the true hit windows to the hit windows computed manually in perfcalc, within a margin of error of +-0.000001ms. [TestCase(7.0d, "ur-estimation-test")] public void Test2(double overallDifficulty, string name) => TestHitWindows(overallDifficulty, name); @@ -61,7 +64,7 @@ protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judg }, attributes); // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(perfAttributes.EstimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001)); + Assert.That(perfAttributes.EstimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); } protected void TestHitWindows(double overallDifficulty, string name) @@ -83,7 +86,7 @@ protected void TestHitWindows(double overallDifficulty, string name) ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo(getBeatmap(name).BeatmapInfo), attributes); // Platform-dependent math functions (Pow, Cbrt, Exp, etc) may result in minute differences. - Assert.That(perfAttributes.HitWindows, Is.EqualTo(trueHitWindows).Within(0.000001)); + Assert.That(perfAttributes.HitWindows, Is.EqualTo(trueHitWindows).Within(0.000001), "The true mania hit windows are different to the ones calculated in ManiaPerformanceCalculator."); } private WorkingBeatmap getBeatmap(string name) From 4affdc62340f7875762b78a7f7335608f6ec9f95 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 02:36:57 -0400 Subject: [PATCH 53/87] Change UR scaling curve --- .../Difficulty/ManiaPerformanceCalculator.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f80ec58da0bb..fc5d30d6faad 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -78,12 +78,13 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { - double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2); // Star rating to pp curve + double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2) + * (1 + 0.1 * Math.Min(1, (attributes.NoteCount + attributes.HoldNoteCount) / 1500)); // Star rating to pp curve if (estimatedUr == null) return 0; - difficultyValue *= Math.Max(1.2 * Math.Pow(SpecialFunctions.Erf(300 / estimatedUr.Value), 1.6) - 0.2, 0); // UR to multiplier curve, see https://www.desmos.com/calculator/xt58vzt2y4 + difficultyValue *= Math.Max(SpecialFunctions.Erf(200 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 1000, 1.3)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/2hqbzcfh79 return difficultyValue; } From a10dccfcfb61f9c22a1239856ee10f01adac296c Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 03:17:57 -0400 Subject: [PATCH 54/87] Revert to live scaling --- .../Difficulty/ManiaPerformanceCalculator.cs | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index fc5d30d6faad..d44358760d06 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -29,6 +29,7 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private int countOk; private int countMeh; private int countMiss; + private double scoreAccuracy; private double? estimatedUr; private bool isLegacyScore; private double[] hitWindows; @@ -51,6 +52,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); + scoreAccuracy = calculateCustomAccuracy(); isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && !Precision.DefinitelyBigger(totalJudgements, maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount); hitWindows = isLegacyScore ? getLegacyHitWindows(score, maniaAttributes) : getLazerHitWindows(score, maniaAttributes); estimatedUr = computeEstimatedUr(maniaAttributes); @@ -78,13 +80,9 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { - double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2) - * (1 + 0.1 * Math.Min(1, (attributes.NoteCount + attributes.HoldNoteCount) / 1500)); // Star rating to pp curve - - if (estimatedUr == null) - return 0; - - difficultyValue *= Math.Max(SpecialFunctions.Erf(200 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 1000, 1.3)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/2hqbzcfh79 + double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2) // Star rating to pp curve + * Math.Max(0, 5 * scoreAccuracy - 4) // From 80% accuracy, 1/20th of total pp is awarded per additional 1% accuracy + * (1 + 0.1 * Math.Min(1, (attributes.NoteCount + attributes.HoldNoteCount) / 1500.0)); // Length bonus, capped at 1500 notes return difficultyValue; } @@ -92,6 +90,14 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) private double totalJudgements => countPerfect + countOk + countGreat + countGood + countMeh + countMiss; private double totalSuccessfulJudgements => countPerfect + countOk + countGreat + countGood + countMeh; + private double calculateCustomAccuracy() + { + if (totalJudgements == 0) + return 0; + + return (countPerfect * 320 + countGreat * 300 + countGood * 200 + countOk * 100 + countMeh * 50) / (totalJudgements * 320); + } + /// /// Returns the estimated tapping deviation of the score, assuming the average hit location is in the center of the hit window. /// From d44d8938a4a25f1d11662d020df7a27e3476a026 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 15:47:32 -0400 Subject: [PATCH 55/87] Rename to IsConvert, add handling for converts below od4 --- .../Difficulty/ManiaDifficultyAttributes.cs | 2 +- .../Difficulty/ManiaDifficultyCalculator.cs | 4 ++-- .../Difficulty/ManiaPerformanceCalculator.cs | 17 ++++++++++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs index bb421eb87bb1..b6265a4b9ac7 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs @@ -38,7 +38,7 @@ public class ManiaDifficultyAttributes : DifficultyAttributes /// /// Conversion status from standard. /// - public bool Convert { get; set; } + public bool IsConvert { get; set; } public override IEnumerable<(int attributeId, object value)> ToDatabaseAttributes() { diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs index 3970079919c4..46fe21a3a6e3 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs @@ -50,7 +50,7 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat int noteCount = beatmap.HitObjects.Count(h => h is Note); int holdNoteCount = beatmap.HitObjects.Count(h => h is HoldNote); - bool convert = beatmap.BeatmapInfo.Ruleset.OnlineID != 3; + bool isConvert = beatmap.BeatmapInfo.Ruleset.OnlineID != 3; return new ManiaDifficultyAttributes { @@ -63,7 +63,7 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat OverallDifficulty = beatmap.Difficulty.OverallDifficulty, NoteCount = noteCount, HoldNoteCount = holdNoteCount, - Convert = convert + IsConvert = isConvert }; } diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index d44358760d06..fbe6d6ff8e75 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -133,10 +133,21 @@ private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes double[] legacyHitWindows = new double[5]; double overallDifficulty = attributes.OverallDifficulty; + double greatWindowLeniency = 0; + double goodWindowLeniency = 0; - if (attributes.Convert) + if (attributes.IsConvert) + { + // When converting beatmaps to osu!mania in stable, the resulting hit window sizes are dependent on whether the beatmap's OD is above or below 4. overallDifficulty = 10; + if (attributes.OverallDifficulty <= 4) + { + greatWindowLeniency = 13; + goodWindowLeniency = 10; + } + } + double windowMultiplier = 1; if (score.Mods.Any(m => m is ModHardRock)) @@ -145,8 +156,8 @@ private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes windowMultiplier *= 1.4; legacyHitWindows[0] = Math.Floor(16 * windowMultiplier); - legacyHitWindows[1] = Math.Floor((64 - 3 * overallDifficulty) * windowMultiplier); - legacyHitWindows[2] = Math.Floor((97 - 3 * overallDifficulty) * windowMultiplier); + legacyHitWindows[1] = Math.Floor((64 - 3 * overallDifficulty + greatWindowLeniency) * windowMultiplier); + legacyHitWindows[2] = Math.Floor((97 - 3 * overallDifficulty + goodWindowLeniency) * windowMultiplier); legacyHitWindows[3] = Math.Floor((127 - 3 * overallDifficulty) * windowMultiplier); legacyHitWindows[4] = Math.Floor((151 - 3 * overallDifficulty) * windowMultiplier); From 9de2585852d1713f555c783b931cbeb1f0c61d5b Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 15:53:11 -0400 Subject: [PATCH 56/87] Move comment --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index fbe6d6ff8e75..7c3005884502 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -136,9 +136,9 @@ private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes double greatWindowLeniency = 0; double goodWindowLeniency = 0; + // When converting beatmaps to osu!mania in stable, the resulting hit window sizes are dependent on whether the beatmap's OD is above or below 4. if (attributes.IsConvert) { - // When converting beatmaps to osu!mania in stable, the resulting hit window sizes are dependent on whether the beatmap's OD is above or below 4. overallDifficulty = 10; if (attributes.OverallDifficulty <= 4) From 6ace77ad06a96901c8dabc49e132af40882cf602 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 22:02:33 -0400 Subject: [PATCH 57/87] Revert back to previous curve, add more tests --- .../ManiaUnstableRateEstimationTest.cs | 64 ++++++++++++++++++- .../Difficulty/ManiaPerformanceCalculator.cs | 20 ++---- 2 files changed, 69 insertions(+), 15 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 0c9850e0ea97..25d7c7d35406 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -33,14 +33,26 @@ public class ManiaUnstableRateEstimationTest public void Test1(double expectedEstimatedUnstableRate, int[] judgements, string name) => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name); - // General test to make sure UR estimation isn't changed by anything, within a margin of +-0.001 UR. Tests rate changes as well. + // General test to make sure UR estimation isn't changed by anything, inclusive of rate changing, within a margin of +-0.001 UR. [TestCase(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 }, "ur-estimation-test")] public void Test1ClockRateAdjusted(double expectedEstimatedUnstableRate, int[] judgements, string name) => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name, new ManiaModDoubleTime()); + // Ensure the UR estimation only returns null when it is supposed to. + [TestCase(false, new[] { 1, 0, 0, 0, 0, 0 })] + [TestCase(true, new[] { 0, 0, 0, 0, 0, 1 })] + [TestCase(true, new[] { 0, 0, 0, 0, 0, 0 })] + public void Test2(bool returnsNull, int[] judgements) + => TestNullUnstableRate(returnsNull, judgements); + + // Ensure the estimated deviation doesn't reach too high of a value in a single note situation, as a sanity check. + [TestCase(new[] { 0, 0, 0, 0, 1, 0 })] + public void Test3(int[] judgements) + => TestSingleNoteBound(judgements); + // Compares the true hit windows to the hit windows computed manually in perfcalc, within a margin of error of +-0.000001ms. [TestCase(7.0d, "ur-estimation-test")] - public void Test2(double overallDifficulty, string name) + public void Test4(double overallDifficulty, string name) => TestHitWindows(overallDifficulty, name); protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, string name, params Mod[] mods) @@ -67,6 +79,54 @@ protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judg Assert.That(perfAttributes.EstimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); } + protected void TestNullUnstableRate(bool expectedNullStatus, int[] judgementCounts) + { + DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 10 }; + + var judgements = new Dictionary + { + { HitResult.Perfect, judgementCounts[0] }, + { HitResult.Great, judgementCounts[1] }, + { HitResult.Good, judgementCounts[2] }, + { HitResult.Ok, judgementCounts[3] }, + { HitResult.Meh, judgementCounts[4] }, + { HitResult.Miss, judgementCounts[5] } + }; + + ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo + { + Statistics = judgements + }, attributes); + + bool isNull = perfAttributes.EstimatedUr == null; + + // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. + Assert.That(isNull, Is.EqualTo(expectedNullStatus), "The estimated mania UR was/wasn't null."); + } + + protected void TestSingleNoteBound(int[] judgementCounts) + { + DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 0 }; + + var judgements = new Dictionary + { + { HitResult.Perfect, judgementCounts[0] }, + { HitResult.Great, judgementCounts[1] }, + { HitResult.Good, judgementCounts[2] }, + { HitResult.Ok, judgementCounts[3] }, + { HitResult.Meh, judgementCounts[4] }, + { HitResult.Miss, judgementCounts[5] } + }; + + ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo + { + Statistics = judgements + }, attributes); + + // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. + Assert.That(perfAttributes.EstimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); + } + protected void TestHitWindows(double overallDifficulty, string name) { DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(); diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 7c3005884502..67048e1f9d75 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -29,7 +29,6 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private int countOk; private int countMeh; private int countMiss; - private double scoreAccuracy; private double? estimatedUr; private bool isLegacyScore; private double[] hitWindows; @@ -52,7 +51,6 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countOk = score.Statistics.GetValueOrDefault(HitResult.Ok); countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); - scoreAccuracy = calculateCustomAccuracy(); isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && !Precision.DefinitelyBigger(totalJudgements, maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount); hitWindows = isLegacyScore ? getLegacyHitWindows(score, maniaAttributes) : getLazerHitWindows(score, maniaAttributes); estimatedUr = computeEstimatedUr(maniaAttributes); @@ -80,9 +78,13 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s private double computeDifficultyValue(ManiaDifficultyAttributes attributes) { - double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2) // Star rating to pp curve - * Math.Max(0, 5 * scoreAccuracy - 4) // From 80% accuracy, 1/20th of total pp is awarded per additional 1% accuracy - * (1 + 0.1 * Math.Min(1, (attributes.NoteCount + attributes.HoldNoteCount) / 1500.0)); // Length bonus, capped at 1500 notes + double difficultyValue = Math.Pow(Math.Max(attributes.StarRating - 0.15, 0.05), 2.2) + * (1 + 0.1 * Math.Min(1, (attributes.NoteCount + attributes.HoldNoteCount) / 1500.0)); // Star rating to pp curve + + if (estimatedUr == null) + return 0; + + difficultyValue *= Math.Max(SpecialFunctions.Erf(260 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 1000, 1.3)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/2hqbzcfh79 return difficultyValue; } @@ -90,14 +92,6 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) private double totalJudgements => countPerfect + countOk + countGreat + countGood + countMeh + countMiss; private double totalSuccessfulJudgements => countPerfect + countOk + countGreat + countGood + countMeh; - private double calculateCustomAccuracy() - { - if (totalJudgements == 0) - return 0; - - return (countPerfect * 320 + countGreat * 300 + countGood * 200 + countOk * 100 + countMeh * 50) / (totalJudgements * 320); - } - /// /// Returns the estimated tapping deviation of the score, assuming the average hit location is in the center of the hit window. /// From ec19983726e400a74cb97e87591f62fe8b421d8a Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 16 Apr 2023 22:09:37 -0400 Subject: [PATCH 58/87] Update desmos --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 67048e1f9d75..ae95055a73ea 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -84,7 +84,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) if (estimatedUr == null) return 0; - difficultyValue *= Math.Max(SpecialFunctions.Erf(260 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 1000, 1.3)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/2hqbzcfh79 + difficultyValue *= Math.Max(SpecialFunctions.Erf(260 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 1000, 1.3)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/m0t9pqjjja return difficultyValue; } From d8d4cc777551729717b9b12df6c55267b8772ccc Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 17 Apr 2023 17:47:41 -0400 Subject: [PATCH 59/87] Change curve to clamp PP to <700ur --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index ae95055a73ea..8ef7deafdbee 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -84,7 +84,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) if (estimatedUr == null) return 0; - difficultyValue *= Math.Max(SpecialFunctions.Erf(260 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 1000, 1.3)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/m0t9pqjjja + difficultyValue *= Math.Max(SpecialFunctions.Erf(260 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 700, 1.7)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/fx1anl8ftd return difficultyValue; } From 18cef8b4d75f29cf92cbb71c4d1f56f447b1f330 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 18 Apr 2023 15:59:49 -0400 Subject: [PATCH 60/87] Change hit window test to not require a beatmap, test multiple ODs --- .../ManiaUnstableRateEstimationTest.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 25d7c7d35406..fe0e9d2888c5 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -51,9 +51,13 @@ public void Test3(int[] judgements) => TestSingleNoteBound(judgements); // Compares the true hit windows to the hit windows computed manually in perfcalc, within a margin of error of +-0.000001ms. - [TestCase(7.0d, "ur-estimation-test")] - public void Test4(double overallDifficulty, string name) - => TestHitWindows(overallDifficulty, name); + [TestCase(0.0d)] + [TestCase(2.5d)] + [TestCase(5.0d)] + [TestCase(7.5d)] + [TestCase(10.0d)] + public void Test4(double overallDifficulty) + => TestHitWindows(overallDifficulty); protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, string name, params Mod[] mods) { @@ -127,9 +131,9 @@ protected void TestSingleNoteBound(int[] judgementCounts) Assert.That(perfAttributes.EstimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); } - protected void TestHitWindows(double overallDifficulty, string name) + protected void TestHitWindows(double overallDifficulty) { - DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(); + DifficultyAttributes attributes = new ManiaDifficultyAttributes { OverallDifficulty = overallDifficulty }; var hitWindows = new ManiaHitWindows(); hitWindows.SetDifficulty(overallDifficulty); @@ -143,7 +147,7 @@ protected void TestHitWindows(double overallDifficulty, string name) hitWindows.WindowFor(HitResult.Meh) }; - ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo(getBeatmap(name).BeatmapInfo), attributes); + ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo(), attributes); // Platform-dependent math functions (Pow, Cbrt, Exp, etc) may result in minute differences. Assert.That(perfAttributes.HitWindows, Is.EqualTo(trueHitWindows).Within(0.000001), "The true mania hit windows are different to the ones calculated in ManiaPerformanceCalculator."); From 69b99f6e71ca8e76e54596f69fdf0bb45bdc9da2 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Tue, 18 Apr 2023 16:33:04 -0400 Subject: [PATCH 61/87] Change curve (again) to fix jittering edge cases --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 8ef7deafdbee..86002e18738d 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -84,7 +84,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) if (estimatedUr == null) return 0; - difficultyValue *= Math.Max(SpecialFunctions.Erf(260 / estimatedUr.Value) * (1 - Math.Pow(estimatedUr.Value / 700, 1.7)), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/fx1anl8ftd + difficultyValue *= Math.Max(1 - Math.Pow(estimatedUr.Value / 500, 1.9), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/w3zgyzqalm return difficultyValue; } From 0a72493395f0d2a414a74f466a2d6bd678b92bd5 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 30 Jul 2023 00:44:57 -0400 Subject: [PATCH 62/87] Band-aid math error on stable LNs, add tail deviation multiplier --- .../Difficulty/ManiaPerformanceCalculator.cs | 38 +++++++++++-------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 86002e18738d..0ca88e5ca19f 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -22,6 +22,7 @@ namespace osu.Game.Rulesets.Mania.Difficulty public class ManiaPerformanceCalculator : PerformanceCalculator { private const double tail_multiplier = 1.5; // Lazer LN tails have 1.5x the hit window of a Note or an LN head. + private const double tail_deviation_multiplier = 1.8; // Empirical testing shows that players get ~1.8x the deviation on tails. private int countPerfect; private int countGreat; @@ -104,14 +105,21 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) double logNoteCount = isLegacyScore ? Math.Log(attributes.NoteCount) : Math.Log(attributes.NoteCount + attributes.HoldNoteCount); double logHoldCount = Math.Log(attributes.HoldNoteCount); + double noteHeadPortion = (double)(attributes.NoteCount + attributes.HoldNoteCount) / (attributes.NoteCount + attributes.HoldNoteCount * 2); + double tailPortion = (double)attributes.HoldNoteCount / (attributes.NoteCount + attributes.HoldNoteCount * 2); + double likelihoodGradient(double d) { if (d <= 0) return 0; - JudgementProbs pNotes = pNote(d); + // Since tails have a higher deviation, find the deviation values for notes/heads and tails that average out to the final deviation value. + double dNote = d / Math.Sqrt(noteHeadPortion + tailPortion * Math.Pow(tail_deviation_multiplier, 2)); + double dTail = dNote * tail_deviation_multiplier; + + JudgementProbs pNotes = pNote(dNote); // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. - JudgementProbs pHolds = isLegacyScore ? pHold(d) : pNote(d, tail_multiplier); + JudgementProbs pHolds = isLegacyScore ? pHold(dNote, dTail) : pNote(dTail, tail_multiplier); return -totalProb(pNotes, pHolds, logNoteCount, logHoldCount); } @@ -213,31 +221,31 @@ private JudgementProbs pNote(double d, double multiplier = 1) } // Probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. - private JudgementProbs pHold(double d) + private JudgementProbs pHold(double dHead, double dTail) { JudgementProbs probabilities = new JudgementProbs(); // Since we're using complementary probabilities for precision, multiplying the head and tail probabilities takes the form P(A∩B)' = P(A'∪B') = P(A') + P(B') - P(A'∩B'). double combinedProb(double p1, double p2) => logDiff(logSum(p1, p2), p1 + p2); - double logPcMaxHead = logPcNote(hitWindows[0] * 1.2, d); - double logPcMaxTail = logPcHoldTail(hitWindows[0] * 2.4, d); + double logPcMaxHead = logPcNote(hitWindows[0] * 1.2, dHead); + double logPcMaxTail = logPcHoldTail(hitWindows[0] * 2.4, dTail); probabilities.PMax = logDiff(0, combinedProb(logPcMaxHead, logPcMaxTail)); - double logPc300Head = logPcNote(hitWindows[1] * 1.1, d); - double logPc300Tail = logPcHoldTail(hitWindows[1] * 2.2, d); + double logPc300Head = logPcNote(hitWindows[1] * 1.1, dHead); + double logPc300Tail = logPcHoldTail(hitWindows[1] * 2.2, dTail); probabilities.P300 = logDiff(combinedProb(logPcMaxHead, logPcMaxTail), combinedProb(logPc300Head, logPc300Tail)); - double logPc200Head = logPcNote(hitWindows[2], d); - double logPc200Tail = logPcHoldTail(hitWindows[2] * 2, d); + double logPc200Head = logPcNote(hitWindows[2], dHead); + double logPc200Tail = logPcHoldTail(hitWindows[2] * 2, dTail); probabilities.P200 = logDiff(combinedProb(logPc300Head, logPc300Tail), combinedProb(logPc200Head, logPc200Tail)); - double logPc100Head = logPcNote(hitWindows[3], d); - double logPc100Tail = logPcHoldTail(hitWindows[3] * 2, d); + double logPc100Head = logPcNote(hitWindows[3], dHead); + double logPc100Tail = logPcHoldTail(hitWindows[3] * 2, dTail); probabilities.P100 = logDiff(combinedProb(logPc200Head, logPc200Tail), combinedProb(logPc100Head, logPc100Tail)); - double logPc50Head = logPcNote(hitWindows[4], d); - double logPc50Tail = logPcHoldTail(hitWindows[4] * 2, d); + double logPc50Head = logPcNote(hitWindows[4], dHead); + double logPc50Tail = logPcHoldTail(hitWindows[4] * 2, dTail); probabilities.P50 = logDiff(combinedProb(logPc100Head, logPc100Tail), combinedProb(logPc50Head, logPc50Tail)); probabilities.P0 = combinedProb(logPc50Head, logPc50Tail); @@ -292,8 +300,8 @@ private double logErfc(double x) => x <= 5 : -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/kdbxwxgf01 private double logProbTail(double x) => x <= 7 - ? Math.Log(1 - Math.Pow(2 * Normal.CDF(0, 1, x) - 1, 2)) - : Math.Log(2) - Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/lgwyhx0fxo + ? Math.Log(1 - (2 * Normal.CDF(0, 1, x) - 1)) + : -Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/lgwyhx0fxo private double logSum(double firstLog, double secondLog) { From a58470d00cf102549f504b3141ae779499c04103 Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 31 Jul 2023 01:08:19 -0400 Subject: [PATCH 63/87] Fix stable LN logic --- .../Difficulty/ManiaPerformanceCalculator.cs | 64 +++++++++---------- 1 file changed, 29 insertions(+), 35 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 0ca88e5ca19f..f48120e18d27 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -223,32 +223,15 @@ private JudgementProbs pNote(double d, double multiplier = 1) // Probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. private JudgementProbs pHold(double dHead, double dTail) { - JudgementProbs probabilities = new JudgementProbs(); - - // Since we're using complementary probabilities for precision, multiplying the head and tail probabilities takes the form P(A∩B)' = P(A'∪B') = P(A') + P(B') - P(A'∩B'). - double combinedProb(double p1, double p2) => logDiff(logSum(p1, p2), p1 + p2); - - double logPcMaxHead = logPcNote(hitWindows[0] * 1.2, dHead); - double logPcMaxTail = logPcHoldTail(hitWindows[0] * 2.4, dTail); - probabilities.PMax = logDiff(0, combinedProb(logPcMaxHead, logPcMaxTail)); - - double logPc300Head = logPcNote(hitWindows[1] * 1.1, dHead); - double logPc300Tail = logPcHoldTail(hitWindows[1] * 2.2, dTail); - probabilities.P300 = logDiff(combinedProb(logPcMaxHead, logPcMaxTail), combinedProb(logPc300Head, logPc300Tail)); - - double logPc200Head = logPcNote(hitWindows[2], dHead); - double logPc200Tail = logPcHoldTail(hitWindows[2] * 2, dTail); - probabilities.P200 = logDiff(combinedProb(logPc300Head, logPc300Tail), combinedProb(logPc200Head, logPc200Tail)); - - double logPc100Head = logPcNote(hitWindows[3], dHead); - double logPc100Tail = logPcHoldTail(hitWindows[3] * 2, dTail); - probabilities.P100 = logDiff(combinedProb(logPc200Head, logPc200Tail), combinedProb(logPc100Head, logPc100Tail)); - - double logPc50Head = logPcNote(hitWindows[4], dHead); - double logPc50Tail = logPcHoldTail(hitWindows[4] * 2, dTail); - probabilities.P50 = logDiff(combinedProb(logPc100Head, logPc100Tail), combinedProb(logPc50Head, logPc50Tail)); - - probabilities.P0 = combinedProb(logPc50Head, logPc50Tail); + JudgementProbs probabilities = new JudgementProbs + { + PMax = logDiff(0, logPcHold(hitWindows[0] * 1.2, dHead, dTail)), + P300 = logDiff(logPcHold(hitWindows[0] * 1.2, dHead, dTail), logPcHold(hitWindows[1] * 1.1, dHead, dTail)), + P200 = logDiff(logPcHold(hitWindows[1] * 1.1, dHead, dTail), logPcHold(hitWindows[2], dHead, dTail)), + P100 = logDiff(logPcHold(hitWindows[2], dHead, dTail), logPcHold(hitWindows[3], dHead, dTail)), + P50 = logDiff(logPcHold(hitWindows[3], dHead, dTail), logPcHold(hitWindows[4], dHead, dTail)), + P0 = logPcHold(hitWindows[4], dHead, dTail) + }; return probabilities; } @@ -279,30 +262,41 @@ private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, } /// - /// The log complementary probability of hitting within a hit window with a certain deviation. + /// The log complementary probability of getting a certain judgement with a certain deviation. /// /// /// A value from 0 (log of 1, 0% chance) to negative infinity (log of 0, 100% chance). /// - private double logPcNote(double x, double deviation) => logErfc(x / (deviation * Math.Sqrt(2))); + private double logPcNote(double window, double deviation) => logErfc(window / (deviation * Math.Sqrt(2))); /// - /// The log complementary probability of hitting within a hit window with a certain deviation. - /// Exclusively for stable LN tails, as they give a result from 2 error values (total error on the head + the tail). + /// The log complementary probability of getting a certain judgement with a certain deviation. + /// Exclusively for stable LNs, as they give a result from 2 error values (total error on the head + the tail). /// /// /// A value from 0 (log of 1, 0% chance) to negative infinity (log of 0, 100% chance). /// - private double logPcHoldTail(double x, double deviation) => logProbTail(x / (deviation * Math.Sqrt(2))); + private double logPcHold(double window, double headDeviation, double tailDeviation) + { + double root2 = Math.Sqrt(2); + + double logPcHead = logErfc(window / (headDeviation * root2)); + + // Calculate the expected value of the distance from 0 of the head hit, given it lands within the current window. + // We'll subtract this from the tail window to approximate the difficulty of landing both hits within 2x the current window. + double beta = window / headDeviation; + double z = Normal.CDF(0, 1, beta) - 0.5; + double expectedValue = headDeviation * (Normal.PDF(0, 1, 0) - Normal.PDF(0, 1, beta)) / z; + + double logPcTail = logErfc((2 * window - expectedValue) / (tailDeviation * root2)); + + return logDiff(logSum(logPcHead, logPcTail), logPcHead + logPcTail); + } private double logErfc(double x) => x <= 5 ? Math.Log(SpecialFunctions.Erfc(x)) : -Math.Pow(x, 2) - Math.Log(x * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/kdbxwxgf01 - private double logProbTail(double x) => x <= 7 - ? Math.Log(1 - (2 * Normal.CDF(0, 1, x) - 1)) - : -Math.Pow(x, 2) / 2 - Math.Log(x / Math.Sqrt(2) * Math.Sqrt(Math.PI)); // This is an approximation, https://www.desmos.com/calculator/lgwyhx0fxo - private double logSum(double firstLog, double secondLog) { double maxVal = Math.Max(firstLog, secondLog); From f60317c482d0fdfe3872fad8d1534fd03f26cb09 Mon Sep 17 00:00:00 2001 From: Evening Date: Mon, 31 Jul 2023 19:19:39 +0800 Subject: [PATCH 64/87] Nest Ternary into Math.Log This removes the need to call Math.Log twice, improving readability. I did consider doing NoteCount + (isLeg ? 0 : HoldNoteCount), but I think it deproves readability --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f48120e18d27..62f760e4eab0 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -102,7 +102,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) return null; // Lazer LN heads are the same as Notes, so return NoteCount + HoldNoteCount for lazer scores. - double logNoteCount = isLegacyScore ? Math.Log(attributes.NoteCount) : Math.Log(attributes.NoteCount + attributes.HoldNoteCount); + double logNoteCount = Math.Log(isLegacyScore ? attributes.NoteCount : attributes.NoteCount + attributes.HoldNoteCount); double logHoldCount = Math.Log(attributes.HoldNoteCount); double noteHeadPortion = (double)(attributes.NoteCount + attributes.HoldNoteCount) / (attributes.NoteCount + attributes.HoldNoteCount * 2); From 951861acf59f87f4b8de545d695beaf539d3a4ba Mon Sep 17 00:00:00 2001 From: Evening Date: Mon, 31 Jul 2023 19:27:18 +0800 Subject: [PATCH 65/87] Shorten property fetching code --- .../Difficulty/ManiaPerformanceCalculator.cs | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 62f760e4eab0..459a1fdc5662 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -98,15 +98,17 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// private double? computeEstimatedUr(ManiaDifficultyAttributes attributes) { - if (totalSuccessfulJudgements == 0 || attributes.NoteCount + attributes.HoldNoteCount == 0) + int noteCount = attributes.NoteCount; + int holdNoteCount = attributes.HoldNoteCount; + if (totalSuccessfulJudgements == 0 || noteCount + holdNoteCount == 0) return null; // Lazer LN heads are the same as Notes, so return NoteCount + HoldNoteCount for lazer scores. - double logNoteCount = Math.Log(isLegacyScore ? attributes.NoteCount : attributes.NoteCount + attributes.HoldNoteCount); - double logHoldCount = Math.Log(attributes.HoldNoteCount); + double logNoteCount = Math.Log(isLegacyScore ? noteCount : noteCount + holdNoteCount); + double logHoldCount = Math.Log(holdNoteCount); - double noteHeadPortion = (double)(attributes.NoteCount + attributes.HoldNoteCount) / (attributes.NoteCount + attributes.HoldNoteCount * 2); - double tailPortion = (double)attributes.HoldNoteCount / (attributes.NoteCount + attributes.HoldNoteCount * 2); + double noteHeadPortion = (double)(noteCount + holdNoteCount) / (noteCount + holdNoteCount * 2); + double tailPortion = (double)holdNoteCount / (noteCount + holdNoteCount * 2); double likelihoodGradient(double d) { From 20de476fbb67f3a58673c3fc7446952d6f964d60 Mon Sep 17 00:00:00 2001 From: Evening Date: Mon, 31 Jul 2023 19:55:28 +0800 Subject: [PATCH 66/87] Fix incorrect function name logPNote The function actually returns the natural log of the probability of each note. --- .../Difficulty/ManiaPerformanceCalculator.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 459a1fdc5662..435071efd1d0 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -119,9 +119,9 @@ double likelihoodGradient(double d) double dNote = d / Math.Sqrt(noteHeadPortion + tailPortion * Math.Pow(tail_deviation_multiplier, 2)); double dTail = dNote * tail_deviation_multiplier; - JudgementProbs pNotes = pNote(dNote); + JudgementProbs pNotes = logPNote(dNote); // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. - JudgementProbs pHolds = isLegacyScore ? pHold(dNote, dTail) : pNote(dTail, tail_multiplier); + JudgementProbs pHolds = isLegacyScore ? pHold(dNote, dTail) : logPNote(dTail, tail_multiplier); return -totalProb(pNotes, pHolds, logNoteCount, logHoldCount); } @@ -206,8 +206,9 @@ private struct JudgementProbs public double P0; } - // Probability of hitting a certain judgement on Notes given a deviation. The multiplier is for lazer LN tails, which are 1.5x as lenient. - private JudgementProbs pNote(double d, double multiplier = 1) + // Log Judgement Probabilities given a deviation. + // The multiplier is for lazer LN tails, which are 1.5x as lenient. + private JudgementProbs logPNote(double d, double multiplier = 1) { JudgementProbs probabilities = new JudgementProbs { From 7ed9141d09edb14f12d15fa040785298e275f69f Mon Sep 17 00:00:00 2001 From: Evening Date: Mon, 31 Jul 2023 19:57:46 +0800 Subject: [PATCH 67/87] Fix incorrect legacyLogPHold function name Also append that this is only used for legacy holds --- .../Difficulty/ManiaPerformanceCalculator.cs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 435071efd1d0..326060e9f518 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -121,7 +121,7 @@ double likelihoodGradient(double d) JudgementProbs pNotes = logPNote(dNote); // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. - JudgementProbs pHolds = isLegacyScore ? pHold(dNote, dTail) : logPNote(dTail, tail_multiplier); + JudgementProbs pHolds = isLegacyScore ? legacyLogPHold(dNote, dTail) : logPNote(dTail, tail_multiplier); return -totalProb(pNotes, pHolds, logNoteCount, logHoldCount); } @@ -206,7 +206,7 @@ private struct JudgementProbs public double P0; } - // Log Judgement Probabilities given a deviation. + // Log Judgement Probabilities of a Note given a deviation. // The multiplier is for lazer LN tails, which are 1.5x as lenient. private JudgementProbs logPNote(double d, double multiplier = 1) { @@ -223,8 +223,9 @@ private JudgementProbs logPNote(double d, double multiplier = 1) return probabilities; } - // Probability of hitting a certain judgement on legacy LNs, which have different hit behaviour to Notes and lazer LNs. - private JudgementProbs pHold(double dHead, double dTail) + // Log Judgement Probabilities of a Legacy Hold given a deviation. + // This is only used for Legacy Holds, which has a different hit behaviour from Notes and lazer LNs. + private JudgementProbs legacyLogPHold(double dHead, double dTail) { JudgementProbs probabilities = new JudgementProbs { From 0ed09151d57becb3ae34aa682d3685422fa70149 Mon Sep 17 00:00:00 2001 From: Evening Date: Tue, 1 Aug 2023 15:13:11 +0800 Subject: [PATCH 68/87] Collapse boilerplate code to parse judgements --- .../ManiaUnstableRateEstimationTest.cs | 76 ++++++------------- 1 file changed, 25 insertions(+), 51 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index fe0e9d2888c5..eb88e31eafc5 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -13,6 +13,7 @@ using System.Collections.Generic; using System.IO; using System.Reflection; +using JetBrains.Annotations; using osu.Framework.Extensions.ObjectExtensions; using osu.Game.Beatmaps.Formats; using osu.Game.IO; @@ -50,19 +51,10 @@ public void Test2(bool returnsNull, int[] judgements) public void Test3(int[] judgements) => TestSingleNoteBound(judgements); - // Compares the true hit windows to the hit windows computed manually in perfcalc, within a margin of error of +-0.000001ms. - [TestCase(0.0d)] - [TestCase(2.5d)] - [TestCase(5.0d)] - [TestCase(7.5d)] - [TestCase(10.0d)] - public void Test4(double overallDifficulty) - => TestHitWindows(overallDifficulty); - - protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, string name, params Mod[] mods) + // Evaluates the Unstable Rate estimation of a beatmap with the given judgements. + private double? computeUnstableRate(DifficultyAttributes attr, int[] judgementCounts, + [CanBeNull] string resourceName = null, params Mod[] mods) { - DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(mods); - var judgements = new Dictionary { { HitResult.Perfect, judgementCounts[0] }, @@ -73,36 +65,33 @@ protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judg { HitResult.Miss, judgementCounts[5] } }; - ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo(getBeatmap(name).BeatmapInfo) - { - Mods = mods, - Statistics = judgements - }, attributes); + var beatmapInfo = resourceName == null ? null : getBeatmap(resourceName).BeatmapInfo; + ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate( + new ScoreInfo(beatmapInfo) + { + Mods = mods, + Statistics = judgements + }, attr + ); + + return perfAttributes.EstimatedUr; + } + protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, string name, params Mod[] mods) + { + DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(mods); + + double? estimatedUr = computeUnstableRate(attributes, judgementCounts, name, mods); // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(perfAttributes.EstimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); + Assert.That(estimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); } protected void TestNullUnstableRate(bool expectedNullStatus, int[] judgementCounts) { DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 10 }; - var judgements = new Dictionary - { - { HitResult.Perfect, judgementCounts[0] }, - { HitResult.Great, judgementCounts[1] }, - { HitResult.Good, judgementCounts[2] }, - { HitResult.Ok, judgementCounts[3] }, - { HitResult.Meh, judgementCounts[4] }, - { HitResult.Miss, judgementCounts[5] } - }; - - ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo - { - Statistics = judgements - }, attributes); - - bool isNull = perfAttributes.EstimatedUr == null; + double? estimatedUr = computeUnstableRate(attributes, judgementCounts); + bool isNull = estimatedUr == null; // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. Assert.That(isNull, Is.EqualTo(expectedNullStatus), "The estimated mania UR was/wasn't null."); @@ -112,23 +101,8 @@ protected void TestSingleNoteBound(int[] judgementCounts) { DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 0 }; - var judgements = new Dictionary - { - { HitResult.Perfect, judgementCounts[0] }, - { HitResult.Great, judgementCounts[1] }, - { HitResult.Good, judgementCounts[2] }, - { HitResult.Ok, judgementCounts[3] }, - { HitResult.Meh, judgementCounts[4] }, - { HitResult.Miss, judgementCounts[5] } - }; - - ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate(new ScoreInfo - { - Statistics = judgements - }, attributes); - - // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(perfAttributes.EstimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); + double? estimatedUr = computeUnstableRate(attributes, judgementCounts); + Assert.That(estimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); } protected void TestHitWindows(double overallDifficulty) From e9b02c28760c587ea8e6fbfe433f49a73689d445 Mon Sep 17 00:00:00 2001 From: Evening Date: Tue, 1 Aug 2023 15:44:30 +0800 Subject: [PATCH 69/87] Remove resource dependency on test --- .../ManiaUnstableRateEstimationTest.cs | 61 +++++-------------- 1 file changed, 14 insertions(+), 47 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index eb88e31eafc5..a2a17ac4df7c 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -4,19 +4,12 @@ #nullable disable using NUnit.Framework; -using osu.Game.Beatmaps; using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Mania.Difficulty; using osu.Game.Rulesets.Mania.Mods; using osu.Game.Scoring; -using osu.Game.Tests.Beatmaps; using System.Collections.Generic; -using System.IO; -using System.Reflection; -using JetBrains.Annotations; -using osu.Framework.Extensions.ObjectExtensions; -using osu.Game.Beatmaps.Formats; -using osu.Game.IO; +using System.Linq; using osu.Game.Rulesets.Mania.Scoring; using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Scoring; @@ -29,15 +22,15 @@ public class ManiaUnstableRateEstimationTest protected string ResourceAssembly => "osu.Game.Rulesets.Mania"; // Test that both SS scores and near 0% scores are handled properly, within a margin of +-0.001 UR - [TestCase(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 }, "ur-estimation-test")] - [TestCase(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 }, "ur-estimation-test")] - public void Test1(double expectedEstimatedUnstableRate, int[] judgements, string name) - => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name); + [TestCase(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 })] + [TestCase(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 })] + public void Test1(double expectedEstimatedUnstableRate, int[] judgements) + => TestUnstableRate(expectedEstimatedUnstableRate, judgements); // General test to make sure UR estimation isn't changed by anything, inclusive of rate changing, within a margin of +-0.001 UR. - [TestCase(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 }, "ur-estimation-test")] - public void Test1ClockRateAdjusted(double expectedEstimatedUnstableRate, int[] judgements, string name) - => TestUnstableRate(expectedEstimatedUnstableRate, judgements, name, new ManiaModDoubleTime()); + [TestCase(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 })] + public void Test1ClockRateAdjusted(double expectedEstimatedUnstableRate, int[] judgements) + => TestUnstableRate(expectedEstimatedUnstableRate, judgements, new ManiaModDoubleTime()); // Ensure the UR estimation only returns null when it is supposed to. [TestCase(false, new[] { 1, 0, 0, 0, 0, 0 })] @@ -52,8 +45,7 @@ public void Test3(int[] judgements) => TestSingleNoteBound(judgements); // Evaluates the Unstable Rate estimation of a beatmap with the given judgements. - private double? computeUnstableRate(DifficultyAttributes attr, int[] judgementCounts, - [CanBeNull] string resourceName = null, params Mod[] mods) + private double? computeUnstableRate(DifficultyAttributes attr, int[] judgementCounts, params Mod[] mods) { var judgements = new Dictionary { @@ -65,9 +57,8 @@ public void Test3(int[] judgements) { HitResult.Miss, judgementCounts[5] } }; - var beatmapInfo = resourceName == null ? null : getBeatmap(resourceName).BeatmapInfo; ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate( - new ScoreInfo(beatmapInfo) + new ScoreInfo { Mods = mods, Statistics = judgements @@ -77,11 +68,11 @@ public void Test3(int[] judgements) return perfAttributes.EstimatedUr; } - protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, string name, params Mod[] mods) + protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, params Mod[] mods) { - DifficultyAttributes attributes = new ManiaDifficultyCalculator(new ManiaRuleset().RulesetInfo, getBeatmap(name)).Calculate(mods); + DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = judgementCounts.Sum(), OverallDifficulty = 7 }; - double? estimatedUr = computeUnstableRate(attributes, judgementCounts, name, mods); + double? estimatedUr = computeUnstableRate(attributes, judgementCounts, mods); // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. Assert.That(estimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); } @@ -105,6 +96,7 @@ protected void TestSingleNoteBound(int[] judgementCounts) Assert.That(estimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); } + // TODO: @Natelytle Is this used for anything? protected void TestHitWindows(double overallDifficulty) { DifficultyAttributes attributes = new ManiaDifficultyAttributes { OverallDifficulty = overallDifficulty }; @@ -126,30 +118,5 @@ protected void TestHitWindows(double overallDifficulty) // Platform-dependent math functions (Pow, Cbrt, Exp, etc) may result in minute differences. Assert.That(perfAttributes.HitWindows, Is.EqualTo(trueHitWindows).Within(0.000001), "The true mania hit windows are different to the ones calculated in ManiaPerformanceCalculator."); } - - private WorkingBeatmap getBeatmap(string name) - { - using (var resStream = openResource($"{resource_namespace}.{name}.osu")) - using (var stream = new LineBufferedReader(resStream)) - { - var decoder = Decoder.GetDecoder(stream); - - ((LegacyBeatmapDecoder)decoder).ApplyOffsets = false; - - return new TestWorkingBeatmap(decoder.Decode(stream)) - { - BeatmapInfo = - { - Ruleset = new ManiaRuleset().RulesetInfo - } - }; - } - } - - private Stream openResource(string name) - { - string localPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location).AsNonNull(); - return Assembly.LoadFrom(Path.Combine(localPath, $"{ResourceAssembly}.dll")).GetManifestResourceStream($@"{ResourceAssembly}.Resources.{name}"); - } } } From b131ac80c8fd0fd8f7c665e9fc94554994ae5d1e Mon Sep 17 00:00:00 2001 From: Evening Date: Tue, 1 Aug 2023 16:07:36 +0800 Subject: [PATCH 70/87] Move test case code closer to test callables --- .../ManiaUnstableRateEstimationTest.cs | 78 ++++++++----------- 1 file changed, 34 insertions(+), 44 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index a2a17ac4df7c..c3b8d8791acf 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -18,34 +18,52 @@ namespace osu.Game.Rulesets.Mania.Tests { public class ManiaUnstableRateEstimationTest { - private const string resource_namespace = "Testing.Beatmaps"; - protected string ResourceAssembly => "osu.Game.Rulesets.Mania"; - - // Test that both SS scores and near 0% scores are handled properly, within a margin of +-0.001 UR - [TestCase(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 })] - [TestCase(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 })] - public void Test1(double expectedEstimatedUnstableRate, int[] judgements) - => TestUnstableRate(expectedEstimatedUnstableRate, judgements); + public static IEnumerable TestCaseSourceData() + { + yield return new TestCaseData(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 }, new[] { new ManiaModDoubleTime() }); + // Test that both SS scores and near 0% scores are handled properly, within a margin of +-0.001 UR + yield return new TestCaseData(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 }, null); + yield return new TestCaseData(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 }, null); + } // General test to make sure UR estimation isn't changed by anything, inclusive of rate changing, within a margin of +-0.001 UR. - [TestCase(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 })] - public void Test1ClockRateAdjusted(double expectedEstimatedUnstableRate, int[] judgements) - => TestUnstableRate(expectedEstimatedUnstableRate, judgements, new ManiaModDoubleTime()); + [TestCaseSource(nameof(TestCaseSourceData))] + public void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, params Mod[] mods) + { + DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = judgementCounts.Sum(), OverallDifficulty = 7 }; + + double? estimatedUr = computeUnstableRate(attributes, judgementCounts, mods); + // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. + Assert.That(estimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); + } // Ensure the UR estimation only returns null when it is supposed to. [TestCase(false, new[] { 1, 0, 0, 0, 0, 0 })] [TestCase(true, new[] { 0, 0, 0, 0, 0, 1 })] [TestCase(true, new[] { 0, 0, 0, 0, 0, 0 })] - public void Test2(bool returnsNull, int[] judgements) - => TestNullUnstableRate(returnsNull, judgements); + public void TestNullUnstableRate(bool expectedNullStatus, int[] judgementCounts) + { + DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 10 }; + + double? estimatedUr = computeUnstableRate(attributes, judgementCounts); + bool isNull = estimatedUr == null; + + // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. + Assert.That(isNull, Is.EqualTo(expectedNullStatus), "The estimated mania UR was/wasn't null."); + } // Ensure the estimated deviation doesn't reach too high of a value in a single note situation, as a sanity check. [TestCase(new[] { 0, 0, 0, 0, 1, 0 })] - public void Test3(int[] judgements) - => TestSingleNoteBound(judgements); + public void TestSingleNoteBound(int[] judgementCounts) + { + DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 0 }; + + double? estimatedUr = computeUnstableRate(attributes, judgementCounts); + Assert.That(estimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); + } // Evaluates the Unstable Rate estimation of a beatmap with the given judgements. - private double? computeUnstableRate(DifficultyAttributes attr, int[] judgementCounts, params Mod[] mods) + private double? computeUnstableRate(DifficultyAttributes attr, IReadOnlyList judgementCounts, params Mod[] mods) { var judgements = new Dictionary { @@ -68,34 +86,6 @@ public void Test3(int[] judgements) return perfAttributes.EstimatedUr; } - protected void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, params Mod[] mods) - { - DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = judgementCounts.Sum(), OverallDifficulty = 7 }; - - double? estimatedUr = computeUnstableRate(attributes, judgementCounts, mods); - // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(estimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); - } - - protected void TestNullUnstableRate(bool expectedNullStatus, int[] judgementCounts) - { - DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 10 }; - - double? estimatedUr = computeUnstableRate(attributes, judgementCounts); - bool isNull = estimatedUr == null; - - // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(isNull, Is.EqualTo(expectedNullStatus), "The estimated mania UR was/wasn't null."); - } - - protected void TestSingleNoteBound(int[] judgementCounts) - { - DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 0 }; - - double? estimatedUr = computeUnstableRate(attributes, judgementCounts); - Assert.That(estimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); - } - // TODO: @Natelytle Is this used for anything? protected void TestHitWindows(double overallDifficulty) { From 1d7dd8ba9918f0c1fdf227cbde9b39f7b3755f7d Mon Sep 17 00:00:00 2001 From: Evening Date: Tue, 1 Aug 2023 18:37:24 +0800 Subject: [PATCH 71/87] Expose getHitWindows for tests --- .../Difficulty/ManiaPerformanceCalculator.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 326060e9f518..f0f02e7215bb 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -53,7 +53,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && !Precision.DefinitelyBigger(totalJudgements, maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount); - hitWindows = isLegacyScore ? getLegacyHitWindows(score, maniaAttributes) : getLazerHitWindows(score, maniaAttributes); + hitWindows = isLegacyScore ? GetLegacyHitWindows(score, maniaAttributes) : GetLazerHitWindows(score, maniaAttributes); estimatedUr = computeEstimatedUr(maniaAttributes); // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. @@ -132,7 +132,7 @@ double likelihoodGradient(double d) return deviation * 10; } - private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) + public static double[] GetLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) { double[] legacyHitWindows = new double[5]; @@ -168,7 +168,7 @@ private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes return legacyHitWindows; } - private double[] getLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) + public static double[] GetLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) { double[] lazerHitWindows = new double[5]; From 515ff5571ffc7b76f0d1ee9f3f339fcb4da2dd60 Mon Sep 17 00:00:00 2001 From: Evening Date: Tue, 1 Aug 2023 18:41:16 +0800 Subject: [PATCH 72/87] Narrow scope of hitWindows fns --- .../Difficulty/ManiaPerformanceCalculator.cs | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index f0f02e7215bb..31f862abd071 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -53,7 +53,11 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s countMeh = score.Statistics.GetValueOrDefault(HitResult.Meh); countMiss = score.Statistics.GetValueOrDefault(HitResult.Miss); isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && !Precision.DefinitelyBigger(totalJudgements, maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount); - hitWindows = isLegacyScore ? GetLegacyHitWindows(score, maniaAttributes) : GetLazerHitWindows(score, maniaAttributes); + + hitWindows = isLegacyScore + ? GetLegacyHitWindows(score.Mods, maniaAttributes.IsConvert, maniaAttributes.OverallDifficulty) + : GetLazerHitWindows(score.Mods, maniaAttributes.OverallDifficulty); + estimatedUr = computeEstimatedUr(maniaAttributes); // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. @@ -132,20 +136,19 @@ double likelihoodGradient(double d) return deviation * 10; } - public static double[] GetLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) + public static double[] GetLegacyHitWindows(Mod[] mods, bool isConvert, double overallDifficulty) { double[] legacyHitWindows = new double[5]; - double overallDifficulty = attributes.OverallDifficulty; double greatWindowLeniency = 0; double goodWindowLeniency = 0; // When converting beatmaps to osu!mania in stable, the resulting hit window sizes are dependent on whether the beatmap's OD is above or below 4. - if (attributes.IsConvert) + if (isConvert) { overallDifficulty = 10; - if (attributes.OverallDifficulty <= 4) + if (overallDifficulty <= 4) { greatWindowLeniency = 13; goodWindowLeniency = 10; @@ -154,9 +157,9 @@ public static double[] GetLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttri double windowMultiplier = 1; - if (score.Mods.Any(m => m is ModHardRock)) + if (mods.Any(m => m is ModHardRock)) windowMultiplier *= 1 / 1.4; - else if (score.Mods.Any(m => m is ModEasy)) + else if (mods.Any(m => m is ModEasy)) windowMultiplier *= 1.4; legacyHitWindows[0] = Math.Floor(16 * windowMultiplier); @@ -168,30 +171,30 @@ public static double[] GetLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttri return legacyHitWindows; } - public static double[] GetLazerHitWindows(ScoreInfo score, ManiaDifficultyAttributes attributes) + public static double[] GetLazerHitWindows(Mod[] mods, double overallDifficulty) { double[] lazerHitWindows = new double[5]; // Create a new track of arbitrary length, and apply the total rate change of every mod to the track (i.e. DT = 1.01-2x, HT = 0.5-0.99x) var track = new TrackVirtual(10000); - score.Mods.OfType().ForEach(m => m.ApplyToTrack(track)); + mods.OfType().ForEach(m => m.ApplyToTrack(track)); double clockRate = track.Rate; double windowMultiplier = 1 / clockRate; - if (score.Mods.Any(m => m is ModHardRock)) + if (mods.Any(m => m is ModHardRock)) windowMultiplier *= 1 / 1.4; - else if (score.Mods.Any(m => m is ModEasy)) + else if (mods.Any(m => m is ModEasy)) windowMultiplier *= 1.4; - if (attributes.OverallDifficulty < 5) - lazerHitWindows[0] = (22.4 - 0.6 * attributes.OverallDifficulty) * windowMultiplier; + if (overallDifficulty < 5) + lazerHitWindows[0] = (22.4 - 0.6 * overallDifficulty) * windowMultiplier; else - lazerHitWindows[0] = (24.9 - 1.1 * attributes.OverallDifficulty) * windowMultiplier; - lazerHitWindows[1] = (64 - 3 * attributes.OverallDifficulty) * windowMultiplier; - lazerHitWindows[2] = (97 - 3 * attributes.OverallDifficulty) * windowMultiplier; - lazerHitWindows[3] = (127 - 3 * attributes.OverallDifficulty) * windowMultiplier; - lazerHitWindows[4] = (151 - 3 * attributes.OverallDifficulty) * windowMultiplier; + lazerHitWindows[0] = (24.9 - 1.1 * overallDifficulty) * windowMultiplier; + lazerHitWindows[1] = (64 - 3 * overallDifficulty) * windowMultiplier; + lazerHitWindows[2] = (97 - 3 * overallDifficulty) * windowMultiplier; + lazerHitWindows[3] = (127 - 3 * overallDifficulty) * windowMultiplier; + lazerHitWindows[4] = (151 - 3 * overallDifficulty) * windowMultiplier; return lazerHitWindows; } From d00d7fd7a51d0cad7d88f75fafae09d7852f0d71 Mon Sep 17 00:00:00 2001 From: Evening Date: Tue, 1 Aug 2023 19:10:08 +0800 Subject: [PATCH 73/87] Narrow scope of computeEstimatedUr We narrow it because maniaAttributes is a large dictionary. If we can narrow down to the primitives that drives computeEstimatedUr, it makes it easier end-users to supply minimal parameters necessary for it to operate. --- .../Difficulty/ManiaPerformanceCalculator.cs | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 31f862abd071..071d016963b4 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -58,7 +58,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s ? GetLegacyHitWindows(score.Mods, maniaAttributes.IsConvert, maniaAttributes.OverallDifficulty) : GetLazerHitWindows(score.Mods, maniaAttributes.OverallDifficulty); - estimatedUr = computeEstimatedUr(maniaAttributes); + estimatedUr = computeEstimatedUr(maniaAttributes.NoteCount, maniaAttributes.HoldNoteCount); // Arbitrary initial value for scaling pp in order to standardize distributions across game modes. // The specific number has no intrinsic meaning and can be adjusted as needed. @@ -100,10 +100,8 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// /// Returns the estimated tapping deviation of the score, assuming the average hit location is in the center of the hit window. /// - private double? computeEstimatedUr(ManiaDifficultyAttributes attributes) + private double? computeEstimatedUr(int noteCount, int holdNoteCount) { - int noteCount = attributes.NoteCount; - int holdNoteCount = attributes.HoldNoteCount; if (totalSuccessfulJudgements == 0 || noteCount + holdNoteCount == 0) return null; From 3dea2731e656fab744cc2459cf0ee90670ca4c5a Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 10:47:38 +0800 Subject: [PATCH 74/87] Update changed values --- .../ManiaUnstableRateEstimationTest.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index c3b8d8791acf..21cbc1c74808 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -20,10 +20,10 @@ public class ManiaUnstableRateEstimationTest { public static IEnumerable TestCaseSourceData() { - yield return new TestCaseData(309.990234375d, new[] { 5336, 3886, 1661, 445, 226, 293 }, new[] { new ManiaModDoubleTime() }); + yield return new TestCaseData(286.7138671875d, new[] { 5336, 3886, 1661, 445, 226, 293 }, new[] { new ManiaModDoubleTime() }); // Test that both SS scores and near 0% scores are handled properly, within a margin of +-0.001 UR - yield return new TestCaseData(42.978515625d, new[] { 11847, 0, 0, 0, 0, 0 }, null); - yield return new TestCaseData(9523485.0d, new[] { 0, 0, 0, 0, 1, 11846 }, null); + yield return new TestCaseData(42.01171875d, new[] { 11847, 0, 0, 0, 0, 0 }, null); + yield return new TestCaseData(8171805.0d, new[] { 0, 0, 0, 0, 1, 11846 }, null); } // General test to make sure UR estimation isn't changed by anything, inclusive of rate changing, within a margin of +-0.001 UR. From b2ad8ad9b465c8942b7cb71ca19cc85082a45d84 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 12:07:26 +0800 Subject: [PATCH 75/87] Add remark on null & exception throwable --- .../Difficulty/ManiaPerformanceCalculator.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 071d016963b4..5fd1fa1ea868 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -98,7 +98,14 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) private double totalSuccessfulJudgements => countPerfect + countOk + countGreat + countGood + countMeh; /// - /// Returns the estimated tapping deviation of the score, assuming the average hit location is in the center of the hit window. + /// Returns the estimated unstable rate of the score, assuming the average hit location is in the center of the hit window. + /// + /// Thrown when the optimization algorithm fails to converge. + /// This happens only on extreme cases. We tested up to 100 Million misses, the algorithm converges with default settings. + /// + /// + /// Returns Estimated UR, or null if the score is a miss-only score. + /// /// private double? computeEstimatedUr(int noteCount, int holdNoteCount) { From 35f6ffec59a3f1ba2571ba2d829bfdc4fa5a1c57 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 12:09:02 +0800 Subject: [PATCH 76/87] Improve testing This huge change includes 1) Adding summaries on the purpose of each change 2) Improving the test surface by include more parameters 3) Reducing "Magic Constant" usages --- .../ManiaUnstableRateEstimationTest.cs | 144 ++++++++++++++---- 1 file changed, 115 insertions(+), 29 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 21cbc1c74808..8aca0859bada 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -16,54 +16,111 @@ namespace osu.Game.Rulesets.Mania.Tests { + /// + /// This test suite tests . + /// + /// This suite focuses on the objective aspects of the calculation, not the accuracy of the calculation. + /// + /// public class ManiaUnstableRateEstimationTest { + public enum SpeedMod + { + DoubleTime, + NormalTime, + HalfTime + } + public static IEnumerable TestCaseSourceData() { - yield return new TestCaseData(286.7138671875d, new[] { 5336, 3886, 1661, 445, 226, 293 }, new[] { new ManiaModDoubleTime() }); - // Test that both SS scores and near 0% scores are handled properly, within a margin of +-0.001 UR - yield return new TestCaseData(42.01171875d, new[] { 11847, 0, 0, 0, 0, 0 }, null); - yield return new TestCaseData(8171805.0d, new[] { 0, 0, 0, 0, 1, 11846 }, null); + yield return new TestCaseData(691.640625d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.DoubleTime); + yield return new TestCaseData(1037.4609375d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.NormalTime); + yield return new TestCaseData(1383.28125d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.HalfTime); } - // General test to make sure UR estimation isn't changed by anything, inclusive of rate changing, within a margin of +-0.001 UR. + /// + /// A catch-all hardcoded regression test, inclusive of rate changing. + /// [TestCaseSource(nameof(TestCaseSourceData))] - public void TestUnstableRate(double expectedEstimatedUnstableRate, int[] judgementCounts, params Mod[] mods) + public void RegressionTest(double expectedUr, int[] judgementCounts, SpeedMod speedMod) { - DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = judgementCounts.Sum(), OverallDifficulty = 7 }; - - double? estimatedUr = computeUnstableRate(attributes, judgementCounts, mods); + double? estimatedUr = computeUnstableRate(judgementCounts, speedMod: speedMod); // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(estimatedUr, Is.EqualTo(expectedEstimatedUnstableRate).Within(0.001), "The estimated mania UR differed from the expected value."); + Assert.That( + estimatedUr, Is.EqualTo(expectedUr).Within(0.001), + $"The estimated mania UR {estimatedUr} differed from the expected value {expectedUr}." + ); } - // Ensure the UR estimation only returns null when it is supposed to. + /// + /// Test anomalous judgement counts where NULLs can occur. + /// [TestCase(false, new[] { 1, 0, 0, 0, 0, 0 })] [TestCase(true, new[] { 0, 0, 0, 0, 0, 1 })] [TestCase(true, new[] { 0, 0, 0, 0, 0, 0 })] - public void TestNullUnstableRate(bool expectedNullStatus, int[] judgementCounts) + public void TestNull(bool expectedIsNull, int[] judgementCounts) { - DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 10 }; - - double? estimatedUr = computeUnstableRate(attributes, judgementCounts); + double? estimatedUr = computeUnstableRate(judgementCounts); bool isNull = estimatedUr == null; - // Platform-dependent math functions (Pow, Cbrt, Exp, etc) and advanced math functions (Erf, FindMinimum) may result in slight differences. - Assert.That(isNull, Is.EqualTo(expectedNullStatus), "The estimated mania UR was/wasn't null."); + Assert.That(isNull, Is.EqualTo(expectedIsNull), $"Estimated mania UR {estimatedUr} was/wasn't null."); } - // Ensure the estimated deviation doesn't reach too high of a value in a single note situation, as a sanity check. - [TestCase(new[] { 0, 0, 0, 0, 1, 0 })] - public void TestSingleNoteBound(int[] judgementCounts) + /// + /// Ensure that the worst case scenarios don't result in unbounded URs. + /// Given Int.MaxValue judgements, it can result in + /// . + /// However, we'll only test realistic scenarios. + /// + [Test, Combinatorial] + public void TestEdge( + [Values(100_000, 1, 0)] int judgeMax, + [Values(100_000, 1, 0)] int judge50, + [Values(100_000, 1, 0)] int judge0, + [Values(SpeedMod.DoubleTime, SpeedMod.HalfTime, SpeedMod.NormalTime)] + SpeedMod speedMod, + [Values(true, false)] bool isHoldsLegacy, + [Values(true, false)] bool isAllHolds, + [Values(10, 5, 0)] double od + ) { - DifficultyAttributes attributes = new ManiaDifficultyAttributes { NoteCount = 1, OverallDifficulty = 0 }; - - double? estimatedUr = computeUnstableRate(attributes, judgementCounts); - Assert.That(estimatedUr, Is.AtMost(10000.0), "The estimated mania UR returned too high for a single note."); + // This is tested in TestNull. + if (judgeMax + judge50 == 0) Assert.Ignore(); + + int noteCount = isAllHolds ? 0 : judgeMax + judge50 + judge0; + int holdCount = isAllHolds ? judgeMax + judge50 + judge0 : 0; + + double? estimatedUr = computeUnstableRate( + new[] { judgeMax, 0, 0, 0, judge50, judge0 }, + noteCount, + holdCount, + od, + speedMod, + isHoldsLegacy + ); + Assert.That( + estimatedUr, Is.AtMost(1_000_000_000), + $"The estimated mania UR {estimatedUr} returned too high for a single note." + ); } - // Evaluates the Unstable Rate estimation of a beatmap with the given judgements. - private double? computeUnstableRate(DifficultyAttributes attr, IReadOnlyList judgementCounts, params Mod[] mods) + /// + /// Evaluates the Unstable Rate + /// + /// Size-6 Int List of Judgements, starting from MAX + /// Number of notes + /// Number of holds + /// Overall Difficulty + /// Speed Mod, + /// Whether to append ClassicMod to simulate Legacy Holds + /// + private double? computeUnstableRate( + IReadOnlyList judgementCounts, + int? noteCount = null, + int holdCount = 0, + double od = 5, + SpeedMod speedMod = SpeedMod.NormalTime, + bool isHoldsLegacy = false) { var judgements = new Dictionary { @@ -74,20 +131,49 @@ public void TestSingleNoteBound(int[] judgementCounts) { HitResult.Meh, judgementCounts[4] }, { HitResult.Miss, judgementCounts[5] } }; + noteCount ??= judgements.Sum(kvp => kvp.Value); + + var mods = new Mod[] { }; + + if (isHoldsLegacy) mods = mods.Append(new ManiaModClassic()).ToArray(); + + switch (speedMod) + { + case SpeedMod.DoubleTime: + mods = mods.Append(new ManiaModDoubleTime()).ToArray(); + break; + + case SpeedMod.HalfTime: + mods = mods.Append(new ManiaModHalfTime()).ToArray(); + break; + } ManiaPerformanceAttributes perfAttributes = new ManiaPerformanceCalculator().Calculate( new ScoreInfo { Mods = mods, Statistics = judgements - }, attr + }, + new ManiaDifficultyAttributes + { + NoteCount = (int)noteCount, + HoldNoteCount = holdCount, + OverallDifficulty = od, + Mods = mods + } ); return perfAttributes.EstimatedUr; } - // TODO: @Natelytle Is this used for anything? - protected void TestHitWindows(double overallDifficulty) + /// + /// This ensures that external changes of hitwindows don't break the ur calculator. + /// This includes all ODs. + /// + [Test] + public void RegressionTestHitWindows( + [Range(0, 10, 0.5)] double overallDifficulty + ) { DifficultyAttributes attributes = new ManiaDifficultyAttributes { OverallDifficulty = overallDifficulty }; From 5864d87a5d67e1db11ce2422ab49741fbd7adbd0 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 12:11:48 +0800 Subject: [PATCH 77/87] Add comment justifying args on TestEdge --- .../ManiaUnstableRateEstimationTest.cs | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 8aca0859bada..2a4896f44864 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -74,13 +74,13 @@ public void TestNull(bool expectedIsNull, int[] judgementCounts) /// [Test, Combinatorial] public void TestEdge( - [Values(100_000, 1, 0)] int judgeMax, + [Values(100_000, 1, 0)] int judgeMax, // We're only interested in the edge judgements. [Values(100_000, 1, 0)] int judge50, [Values(100_000, 1, 0)] int judge0, [Values(SpeedMod.DoubleTime, SpeedMod.HalfTime, SpeedMod.NormalTime)] SpeedMod speedMod, [Values(true, false)] bool isHoldsLegacy, - [Values(true, false)] bool isAllHolds, + [Values(true, false)] bool isAllHolds, // This will determine if we use all holds or all notes. [Values(10, 5, 0)] double od ) { @@ -113,7 +113,6 @@ public void TestEdge( /// Overall Difficulty /// Speed Mod, /// Whether to append ClassicMod to simulate Legacy Holds - /// private double? computeUnstableRate( IReadOnlyList judgementCounts, int? noteCount = null, @@ -167,7 +166,7 @@ public void TestEdge( } /// - /// This ensures that external changes of hitwindows don't break the ur calculator. + /// This ensures that external changes of hit windows don't break the ur calculator. /// This includes all ODs. /// [Test] From 104eea3cfc749aeb7bedc52846ef7f4b7e044337 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 12:12:03 +0800 Subject: [PATCH 78/87] Delete ur-estimation-test.osu --- .../Testing/Beatmaps/ur-estimation-test.osu | 8042 ----------------- 1 file changed, 8042 deletions(-) delete mode 100644 osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu diff --git a/osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu b/osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu deleted file mode 100644 index 690de52c6d6b..000000000000 --- a/osu.Game.Rulesets.Mania/Resources/Testing/Beatmaps/ur-estimation-test.osu +++ /dev/null @@ -1,8042 +0,0 @@ -osu file format v14 - -[General] -AudioFilename: audio.mp3 -AudioLeadIn: 0 -PreviewTime: 203197 -Countdown: 0 -SampleSet: Soft -StackLeniency: 0.7 -Mode: 3 -LetterboxInBreaks: 0 -SpecialStyle: 0 -WidescreenStoryboard: 0 - -[Editor] -Bookmarks: 10295,15506 -DistanceSpacing: 0.8 -BeatDivisor: 12 -GridSize: 16 -TimelineZoom: 3 - -[Metadata] -Title:Energy * Drin-ko * Fein-chan! (Camellia's "MONSTERISTIC" D. M. P. Remix) -TitleUnicode:エナジー*ドリン娘☆ふぇいんちゃん! (かめりあ's "MONSTERISTIC" Dempa Machinegun Psystyle Remix) -Artist:Camellia feat. Nanahira -ArtistUnicode:かめりあ feat. ななひら -Creator:Kim_GodSSI -Version:Energy Drink -Source: -Tags:kamelcamellia かめるかめりあ fa featured artist cametek かめてく 平田七海 Nanami Hirata 奥村りお Rio Okumura electronic denpa j-core jcore japanese j-pop jpop hardcore Voltage Ignition 2 MOTF-0002 Movement on the FLOOR c85 comiket85 comic market 85 コミケ85 コミックマーケット85 Camellia "Remixes" Summary & VIPs 02 c94 comiket94 comic market 94 コミケ94 コミックマーケット94 CTCD-0017 doujin indie marathon long notes Full LN Inverses kimgodssi drinkgirl drinking enajii dorinko feinchan -BeatmapID:2727115 -BeatmapSetID:1316055 - -[Difficulty] -HPDrainRate:8.5 -CircleSize:7 -OverallDifficulty:7 -ApproachRate:5 -SliderMultiplier:1.4 -SliderTickRate:1 - -[Events] -//Background and Video events -0,0,"bg.jpg",0,0 -//Break Periods -//Storyboard Layer 0 (Background) -//Storyboard Layer 1 (Fail) -//Storyboard Layer 2 (Pass) -//Storyboard Layer 3 (Foreground) -//Storyboard Layer 4 (Overlay) -//Storyboard Sound Samples - -[TimingPoints] -980,315.789473684211,4,2,1,35,1,0 -93190,-100,4,2,1,35,0,1 -120980,-100,4,2,1,35,0,0 -146243,320.855614973262,4,2,1,35,1,0 -146243,-98.0392156862745,4,2,1,35,0,0 -146563,342.857142857143,4,2,1,35,1,0 -146563,-91.743119266055,4,2,1,35,0,0 -146905,348.837209302326,4,2,1,35,1,0 -146905,-90.9090909090909,4,2,1,35,0,0 -147253,375,4,2,1,35,1,0 -147253,-84.0336134453782,4,2,1,35,0,0 -148003,379.746835443038,4,2,1,35,1,0 -148003,-83.3333333333333,4,2,1,35,0,0 -148382,400,4,2,1,35,1,0 -148382,-78.740157480315,4,2,1,35,0,0 -148782,387.096774193548,4,2,1,35,1,0 -148782,-81.3008130081301,4,2,1,35,0,0 -149169,392.156862745098,4,2,1,35,1,0 -149169,-80.6451612903226,4,2,1,35,0,0 -149561,405.405405405405,4,2,1,35,1,0 -149561,-78.125,4,2,1,35,0,0 -151586,387.096774193548,4,2,1,35,1,0 -151586,-81.3008130081301,4,2,1,35,0,0 -152360,400,4,2,1,35,1,0 -152360,-78.740157480315,4,2,1,35,0,0 -165560,385.852090032154,4,2,1,35,1,0 -165560,-81.9672131147541,4,2,1,35,0,0 -167103,368.098159509202,4,2,1,35,1,0 -167103,-85.4700854700855,4,2,1,35,0,0 -168575,348.837209302326,4,2,1,35,1,0 -168575,-90.9090909090909,4,2,1,35,0,0 -169970,333.333333333333,4,2,1,35,1,0 -169970,-94.3396226415094,4,2,1,35,0,0 -171303,315.789473684211,4,2,1,35,1,0 -171303,-100,4,2,1,35,0,0 -172250,315.789473684211,4,2,1,35,1,0 -205092,-100,4,2,1,35,0,1 -232881,-100,4,2,1,35,0,0 -260671,-100,4,2,1,35,0,1 -289723,-100,4,2,1,35,0,0 - - -[HitObjects] -329,192,980,5,0,0:0:0:0: -475,192,980,1,0,0:0:0:0: -36,192,980,1,0,0:0:0:0: -182,192,980,1,0,0:0:0:0: -256,192,980,1,0,0:0:0:0: -402,192,1137,1,0,0:0:0:0: -475,192,1137,1,0,0:0:0:0: -182,192,1137,1,0,0:0:0:0: -329,192,1216,1,0,0:0:0:0: -109,192,1216,1,0,0:0:0:0: -36,192,1216,1,0,0:0:0:0: -36,192,1374,1,0,0:0:0:0: -109,192,1374,1,0,0:0:0:0: -329,192,1374,1,0,0:0:0:0: -182,192,1453,1,0,0:0:0:0: -402,192,1453,1,0,0:0:0:0: -475,192,1453,1,0,0:0:0:0: -475,192,1611,1,0,0:0:0:0: -329,192,1611,1,0,0:0:0:0: -402,192,1611,1,0,0:0:0:0: -36,192,1690,1,0,0:0:0:0: -182,192,1690,1,0,0:0:0:0: -109,192,1690,1,0,0:0:0:0: -329,192,1769,1,0,0:0:0:0: -402,192,1769,1,0,0:0:0:0: -475,192,1769,1,0,0:0:0:0: -109,192,1848,1,0,0:0:0:0: -36,192,1848,1,0,0:0:0:0: -182,192,1848,1,0,0:0:0:0: -256,192,1927,1,0,0:0:0:0: -329,192,1927,1,0,0:0:0:0: -402,192,1927,1,0,0:0:0:0: -475,192,1927,1,0,0:0:0:0: -109,192,2085,1,0,0:0:0:0: -182,192,2085,1,0,0:0:0:0: -329,192,2085,1,0,0:0:0:0: -402,192,2085,1,0,0:0:0:0: -475,192,2243,128,0,2558:0:0:0:0: -109,192,2243,1,0,0:0:0:0: -329,192,2243,1,0,0:0:0:0: -402,192,2243,1,0,0:0:0:0: -36,192,2243,1,0,0:0:0:0: -256,192,2322,1,0,0:0:0:0: -182,192,2322,1,0,0:0:0:0: -402,192,2401,1,0,0:0:0:0: -36,192,2401,1,0,0:0:0:0: -329,192,2401,1,0,0:0:0:0: -182,192,2480,1,0,0:0:0:0: -256,192,2480,1,0,0:0:0:0: -109,192,2558,1,0,0:0:0:0: -36,192,2558,1,0,0:0:0:0: -402,192,2558,1,0,0:0:0:0: -256,192,2637,1,0,0:0:0:0: -182,192,2637,1,0,0:0:0:0: -109,192,2716,128,0,3032:0:0:0:0: -402,192,2716,1,0,0:0:0:0: -475,192,2716,1,0,0:0:0:0: -36,192,2716,1,0,0:0:0:0: -329,192,2716,1,0,0:0:0:0: -182,192,2795,1,0,0:0:0:0: -256,192,2795,1,0,0:0:0:0: -475,192,2874,1,0,0:0:0:0: -329,192,2874,1,0,0:0:0:0: -402,192,2874,1,0,0:0:0:0: -182,192,2953,1,0,0:0:0:0: -256,192,2953,1,0,0:0:0:0: -475,192,3032,1,0,0:0:0:0: -402,192,3032,1,0,0:0:0:0: -36,192,3032,1,0,0:0:0:0: -256,192,3111,1,0,0:0:0:0: -329,192,3111,1,0,0:0:0:0: -475,192,3190,128,0,4453:0:0:0:0: -182,192,3190,1,0,0:0:0:0: -402,192,3190,1,0,0:0:0:0: -36,192,3190,1,0,0:0:0:0: -329,192,3269,1,0,0:0:0:0: -109,192,3269,1,0,0:0:0:0: -256,192,3348,1,0,0:0:0:0: -36,192,3348,1,0,0:0:0:0: -402,192,3348,1,0,0:0:0:0: -329,192,3427,1,0,0:0:0:0: -182,192,3427,1,0,0:0:0:0: -256,192,3506,1,0,0:0:0:0: -109,192,3506,1,0,0:0:0:0: -36,192,3506,1,0,0:0:0:0: -182,192,3585,1,0,0:0:0:0: -329,192,3585,1,0,0:0:0:0: -256,192,3664,1,0,0:0:0:0: -402,192,3664,1,0,0:0:0:0: -36,192,3664,1,0,0:0:0:0: -109,192,3743,1,0,0:0:0:0: -329,192,3743,1,0,0:0:0:0: -182,192,3822,1,0,0:0:0:0: -36,192,3822,1,0,0:0:0:0: -402,192,3822,1,0,0:0:0:0: -329,192,3901,1,0,0:0:0:0: -109,192,3901,1,0,0:0:0:0: -402,192,3980,1,0,0:0:0:0: -256,192,3980,1,0,0:0:0:0: -182,192,4058,1,0,0:0:0:0: -36,192,4058,1,0,0:0:0:0: -402,192,4137,1,0,0:0:0:0: -256,192,4137,1,0,0:0:0:0: -329,192,4137,1,0,0:0:0:0: -109,192,4216,1,0,0:0:0:0: -182,192,4216,1,0,0:0:0:0: -36,192,4295,1,0,0:0:0:0: -329,192,4295,1,0,0:0:0:0: -402,192,4295,1,0,0:0:0:0: -182,192,4374,1,0,0:0:0:0: -256,192,4374,1,0,0:0:0:0: -402,192,4453,1,0,0:0:0:0: -36,192,4453,1,0,0:0:0:0: -329,192,4453,1,0,0:0:0:0: -109,192,4532,1,0,0:0:0:0: -256,192,4532,1,0,0:0:0:0: -182,192,4611,1,0,0:0:0:0: -329,192,4611,1,0,0:0:0:0: -256,192,4690,1,0,0:0:0:0: -402,192,4690,1,0,0:0:0:0: -182,192,4769,1,0,0:0:0:0: -475,192,4769,1,0,0:0:0:0: -109,192,4769,1,0,0:0:0:0: -36,192,4769,128,0,5085:0:0:0:0: -402,192,4848,1,0,0:0:0:0: -329,192,4848,1,0,0:0:0:0: -109,192,4927,1,0,0:0:0:0: -182,192,4927,1,0,0:0:0:0: -475,192,4927,1,0,0:0:0:0: -329,192,5006,1,0,0:0:0:0: -256,192,5006,1,0,0:0:0:0: -402,192,5085,1,0,0:0:0:0: -109,192,5085,1,0,0:0:0:0: -475,192,5085,1,0,0:0:0:0: -256,192,5164,1,0,0:0:0:0: -182,192,5164,1,0,0:0:0:0: -402,192,5243,128,0,5558:0:0:0:0: -475,192,5243,1,0,0:0:0:0: -109,192,5243,1,0,0:0:0:0: -36,192,5243,1,0,0:0:0:0: -329,192,5243,1,0,0:0:0:0: -182,192,5322,1,0,0:0:0:0: -256,192,5322,1,0,0:0:0:0: -36,192,5401,1,0,0:0:0:0: -329,192,5401,1,0,0:0:0:0: -475,192,5401,1,0,0:0:0:0: -182,192,5480,1,0,0:0:0:0: -109,192,5480,1,0,0:0:0:0: -329,192,5558,1,0,0:0:0:0: -36,192,5558,1,0,0:0:0:0: -475,192,5558,1,0,0:0:0:0: -256,192,5637,1,0,0:0:0:0: -182,192,5637,1,0,0:0:0:0: -36,192,5716,128,0,6980:0:0:0:0: -329,192,5716,1,0,0:0:0:0: -475,192,5716,1,0,0:0:0:0: -109,192,5716,1,0,0:0:0:0: -402,192,5795,1,0,0:0:0:0: -256,192,5795,1,0,0:0:0:0: -329,192,5874,1,0,0:0:0:0: -182,192,5874,1,0,0:0:0:0: -475,192,5874,1,0,0:0:0:0: -256,192,5953,1,0,0:0:0:0: -109,192,5953,1,0,0:0:0:0: -475,192,6032,1,0,0:0:0:0: -329,192,6032,1,0,0:0:0:0: -182,192,6032,1,0,0:0:0:0: -402,192,6111,1,0,0:0:0:0: -256,192,6111,1,0,0:0:0:0: -475,192,6190,1,0,0:0:0:0: -109,192,6190,1,0,0:0:0:0: -329,192,6190,1,0,0:0:0:0: -256,192,6269,1,0,0:0:0:0: -182,192,6269,1,0,0:0:0:0: -475,192,6348,1,0,0:0:0:0: -329,192,6348,1,0,0:0:0:0: -109,192,6348,1,0,0:0:0:0: -402,192,6427,1,0,0:0:0:0: -256,192,6427,1,0,0:0:0:0: -329,192,6506,1,0,0:0:0:0: -475,192,6506,1,0,0:0:0:0: -182,192,6506,1,0,0:0:0:0: -256,192,6585,1,0,0:0:0:0: -109,192,6585,1,0,0:0:0:0: -329,192,6664,1,0,0:0:0:0: -475,192,6664,1,0,0:0:0:0: -256,192,6743,1,0,0:0:0:0: -109,192,6743,1,0,0:0:0:0: -475,192,6822,1,0,0:0:0:0: -402,192,6822,1,0,0:0:0:0: -182,192,6822,1,0,0:0:0:0: -329,192,6901,1,0,0:0:0:0: -256,192,6980,1,0,0:0:0:0: -475,192,6980,1,0,0:0:0:0: -109,192,6980,1,0,0:0:0:0: -402,192,7058,1,0,0:0:0:0: -182,192,7058,1,0,0:0:0:0: -329,192,7137,1,0,0:0:0:0: -109,192,7137,1,0,0:0:0:0: -256,192,7216,1,0,0:0:0:0: -475,192,7295,128,0,7453:0:0:0:0: -36,192,7295,128,0,7611:0:0:0:0: -329,192,7295,128,0,7453:0:0:0:0: -109,192,7295,128,0,7374:0:0:0:0: -256,192,7374,128,0,7532:0:0:0:0: -182,192,7453,128,0,7611:0:0:0:0: -402,192,7453,128,0,7532:0:0:0:0: -329,192,7532,128,0,7611:0:0:0:0: -402,192,7611,1,0,0:0:0:0: -475,192,7611,1,0,0:0:0:0: -109,192,7611,128,0,7690:0:0:0:0: -256,192,7690,128,0,7769:0:0:0:0: -329,192,7690,1,0,0:0:0:0: -182,192,7769,128,0,7927:0:0:0:0: -36,192,7769,128,0,7927:0:0:0:0: -402,192,7769,128,0,7848:0:0:0:0: -475,192,7769,128,0,8085:0:0:0:0: -256,192,7848,128,0,8006:0:0:0:0: -109,192,7927,128,0,8006:0:0:0:0: -329,192,7927,128,0,8085:0:0:0:0: -182,192,8006,128,0,8085:0:0:0:0: -109,192,8085,1,0,0:0:0:0: -36,192,8085,1,0,0:0:0:0: -402,192,8085,128,0,8164:0:0:0:0: -329,192,8164,128,0,8243:0:0:0:0: -182,192,8164,1,0,0:0:0:0: -256,192,8243,128,0,9585:0:0:0:0: -36,192,8243,128,0,8322:0:0:0:0: -109,192,8243,128,0,8874:0:0:0:0: -475,192,8243,128,0,8401:0:0:0:0: -402,192,8322,128,0,8480:0:0:0:0: -182,192,8322,128,0,8401:0:0:0:0: -329,192,8401,128,0,8558:0:0:0:0: -36,192,8401,128,0,8480:0:0:0:0: -475,192,8480,128,0,8874:0:0:0:0: -182,192,8480,128,0,8558:0:0:0:0: -402,192,8558,128,0,8795:0:0:0:0: -36,192,8558,128,0,8874:0:0:0:0: -329,192,8637,128,0,8716:0:0:0:0: -182,192,8716,128,0,8874:0:0:0:0: -329,192,8795,128,0,9111:0:0:0:0: -402,192,8874,128,0,9032:0:0:0:0: -182,192,8953,128,0,9032:0:0:0:0: -36,192,8953,128,0,9190:0:0:0:0: -475,192,9032,128,0,9427:0:0:0:0: -109,192,9032,128,0,9111:0:0:0:0: -402,192,9111,128,0,9348:0:0:0:0: -182,192,9111,128,0,9269:0:0:0:0: -329,192,9190,128,0,9269:0:0:0:0: -109,192,9190,128,0,9427:0:0:0:0: -36,192,9269,128,0,9348:0:0:0:0: -329,192,9348,128,0,9664:0:0:0:0: -182,192,9348,128,0,9506:0:0:0:0: -402,192,9427,128,0,9743:0:0:0:0: -36,192,9427,1,0,0:0:0:0: -109,192,9506,1,0,0:0:0:0: -182,192,9585,1,0,0:0:0:0: -256,192,9664,1,0,0:0:0:0: -36,192,9664,1,0,0:0:0:0: -329,192,9743,1,0,0:0:0:0: -109,192,9743,1,0,0:0:0:0: -36,192,9822,128,0,9980:0:0:0:0: -182,192,9822,128,0,9980:0:0:0:0: -475,192,9822,128,0,10137:0:0:0:0: -402,192,9822,128,0,9901:0:0:0:0: -256,192,9901,128,0,10058:0:0:0:0: -329,192,9980,128,0,10137:0:0:0:0: -109,192,9980,128,0,10058:0:0:0:0: -182,192,10058,128,0,10137:0:0:0:0: -109,192,10137,1,0,0:0:0:0: -36,192,10137,1,0,0:0:0:0: -256,192,10137,128,0,10216:0:0:0:0: -402,192,10216,1,0,0:0:0:0: -182,192,10216,128,0,10295:0:0:0:0: -329,192,10295,128,0,10453:0:0:0:0: -475,192,10295,128,0,10453:0:0:0:0: -36,192,10295,128,0,10611:0:0:0:0: -109,192,10295,128,0,10374:0:0:0:0: -256,192,10374,128,0,10532:0:0:0:0: -182,192,10453,128,0,10611:0:0:0:0: -402,192,10453,128,0,10532:0:0:0:0: -329,192,10532,128,0,10611:0:0:0:0: -109,192,10611,1,0,0:0:0:0: -256,192,10611,128,0,10690:0:0:0:0: -475,192,10611,1,0,0:0:0:0: -182,192,10690,128,0,10769:0:0:0:0: -402,192,10690,1,0,0:0:0:0: -36,192,10769,128,0,11243:0:0:0:0: -475,192,10769,128,0,12190:0:0:0:0: -109,192,10769,128,0,10927:0:0:0:0: -329,192,10769,128,0,10848:0:0:0:0: -402,192,10848,128,0,12111:0:0:0:0: -256,192,10848,128,0,10927:0:0:0:0: -329,192,10927,128,0,12032:0:0:0:0: -182,192,10927,128,0,11006:0:0:0:0: -109,192,11006,128,0,11085:0:0:0:0: -182,192,11085,128,0,11164:0:0:0:0: -109,192,11164,128,0,11322:0:0:0:0: -256,192,11164,128,0,11243:0:0:0:0: -182,192,11243,128,0,11401:0:0:0:0: -36,192,11322,128,0,11401:0:0:0:0: -109,192,11401,128,0,11480:0:0:0:0: -256,192,11401,128,0,11480:0:0:0:0: -182,192,11480,128,0,11637:0:0:0:0: -109,192,11558,128,0,11716:0:0:0:0: -36,192,11637,128,0,11795:0:0:0:0: -256,192,11637,128,0,11716:0:0:0:0: -182,192,11716,128,0,11795:0:0:0:0: -109,192,11795,128,0,11874:0:0:0:0: -256,192,11874,128,0,11953:0:0:0:0: -36,192,11874,128,0,11953:0:0:0:0: -182,192,11953,128,0,12111:0:0:0:0: -109,192,12032,128,0,12190:0:0:0:0: -256,192,12032,1,0,0:0:0:0: -36,192,12111,128,0,12269:0:0:0:0: -329,192,12111,1,0,0:0:0:0: -402,192,12190,1,0,0:0:0:0: -182,192,12190,1,0,0:0:0:0: -475,192,12269,1,0,0:0:0:0: -256,192,12269,1,0,0:0:0:0: -329,192,12348,1,0,0:0:0:0: -36,192,12348,1,0,0:0:0:0: -182,192,12348,1,0,0:0:0:0: -402,192,12348,1,0,0:0:0:0: -475,192,12427,1,0,0:0:0:0: -36,192,12506,1,0,0:0:0:0: -182,192,12506,1,0,0:0:0:0: -329,192,12506,1,0,0:0:0:0: -402,192,12585,1,0,0:0:0:0: -36,192,12664,1,0,0:0:0:0: -109,192,12664,1,0,0:0:0:0: -256,192,12664,1,0,0:0:0:0: -329,192,12743,1,0,0:0:0:0: -182,192,12822,1,0,0:0:0:0: -36,192,12822,1,0,0:0:0:0: -475,192,12822,1,0,0:0:0:0: -402,192,12901,1,0,0:0:0:0: -109,192,12901,1,0,0:0:0:0: -329,192,12980,1,0,0:0:0:0: -36,192,12980,1,0,0:0:0:0: -256,192,13058,1,0,0:0:0:0: -475,192,13058,1,0,0:0:0:0: -182,192,13137,1,0,0:0:0:0: -402,192,13137,1,0,0:0:0:0: -109,192,13216,1,0,0:0:0:0: -329,192,13216,1,0,0:0:0:0: -182,192,13295,1,0,0:0:0:0: -475,192,13295,1,0,0:0:0:0: -36,192,13295,1,0,0:0:0:0: -256,192,13335,1,0,0:0:0:0: -329,192,13374,1,0,0:0:0:0: -402,192,13414,1,0,0:0:0:0: -109,192,13453,1,0,0:0:0:0: -182,192,13493,1,0,0:0:0:0: -256,192,13532,1,0,0:0:0:0: -329,192,13572,1,0,0:0:0:0: -36,192,13611,1,0,0:0:0:0: -182,192,13611,1,0,0:0:0:0: -475,192,13611,128,0,14085:0:0:0:0: -402,192,13611,1,0,0:0:0:0: -329,192,13690,1,0,0:0:0:0: -109,192,13769,1,0,0:0:0:0: -256,192,13769,1,0,0:0:0:0: -36,192,13769,1,0,0:0:0:0: -402,192,13848,1,0,0:0:0:0: -182,192,13927,1,0,0:0:0:0: -36,192,13927,1,0,0:0:0:0: -329,192,13927,1,0,0:0:0:0: -109,192,14006,1,0,0:0:0:0: -36,192,14085,1,0,0:0:0:0: -256,192,14085,1,0,0:0:0:0: -402,192,14085,1,0,0:0:0:0: -182,192,14164,1,0,0:0:0:0: -36,192,14243,128,0,14716:0:0:0:0: -109,192,14243,1,0,0:0:0:0: -329,192,14243,1,0,0:0:0:0: -475,192,14243,1,0,0:0:0:0: -256,192,14322,1,0,0:0:0:0: -109,192,14401,1,0,0:0:0:0: -182,192,14401,1,0,0:0:0:0: -475,192,14401,1,0,0:0:0:0: -329,192,14480,1,0,0:0:0:0: -256,192,14558,1,0,0:0:0:0: -475,192,14558,1,0,0:0:0:0: -109,192,14558,1,0,0:0:0:0: -402,192,14637,1,0,0:0:0:0: -109,192,14716,1,0,0:0:0:0: -256,192,14716,1,0,0:0:0:0: -475,192,14716,1,0,0:0:0:0: -329,192,14795,1,0,0:0:0:0: -475,192,14874,128,0,15348:0:0:0:0: -182,192,14874,1,0,0:0:0:0: -36,192,14874,1,0,0:0:0:0: -402,192,14874,1,0,0:0:0:0: -256,192,14953,1,0,0:0:0:0: -182,192,15032,1,0,0:0:0:0: -36,192,15032,1,0,0:0:0:0: -402,192,15032,1,0,0:0:0:0: -329,192,15111,1,0,0:0:0:0: -36,192,15190,1,0,0:0:0:0: -109,192,15190,1,0,0:0:0:0: -256,192,15190,1,0,0:0:0:0: -329,192,15269,1,0,0:0:0:0: -182,192,15348,1,0,0:0:0:0: -36,192,15348,1,0,0:0:0:0: -402,192,15348,1,0,0:0:0:0: -256,192,15427,1,0,0:0:0:0: -109,192,15506,1,0,0:0:0:0: -475,192,15506,1,0,0:0:0:0: -36,192,15506,128,0,15980:0:0:0:0: -329,192,15506,1,0,0:0:0:0: -402,192,15585,1,0,0:0:0:0: -256,192,15664,1,0,0:0:0:0: -475,192,15664,1,0,0:0:0:0: -109,192,15664,1,0,0:0:0:0: -329,192,15743,1,0,0:0:0:0: -402,192,15822,1,0,0:0:0:0: -109,192,15822,1,0,0:0:0:0: -475,192,15822,1,0,0:0:0:0: -182,192,15901,1,0,0:0:0:0: -475,192,15980,1,0,0:0:0:0: -402,192,15980,1,0,0:0:0:0: -256,192,15980,1,0,0:0:0:0: -182,192,16058,1,0,0:0:0:0: -36,192,16137,1,0,0:0:0:0: -475,192,16137,128,0,16611:0:0:0:0: -256,192,16137,128,0,16216:0:0:0:0: -109,192,16137,1,0,0:0:0:0: -402,192,16216,128,0,16295:0:0:0:0: -182,192,16295,128,0,16374:0:0:0:0: -109,192,16295,1,0,0:0:0:0: -36,192,16295,1,0,0:0:0:0: -329,192,16374,128,0,16453:0:0:0:0: -109,192,16453,128,0,16532:0:0:0:0: -36,192,16453,1,0,0:0:0:0: -402,192,16453,1,0,0:0:0:0: -256,192,16532,128,0,16611:0:0:0:0: -182,192,16611,1,0,0:0:0:0: -36,192,16611,1,0,0:0:0:0: -329,192,16690,1,0,0:0:0:0: -36,192,16769,128,0,17243:0:0:0:0: -256,192,16769,128,0,16848:0:0:0:0: -402,192,16769,1,0,0:0:0:0: -475,192,16769,1,0,0:0:0:0: -109,192,16848,128,0,16927:0:0:0:0: -329,192,16927,128,0,17006:0:0:0:0: -475,192,16927,1,0,0:0:0:0: -402,192,16927,1,0,0:0:0:0: -182,192,17006,128,0,17085:0:0:0:0: -402,192,17085,128,0,17164:0:0:0:0: -475,192,17085,1,0,0:0:0:0: -109,192,17085,1,0,0:0:0:0: -256,192,17164,128,0,17243:0:0:0:0: -475,192,17243,1,0,0:0:0:0: -329,192,17243,1,0,0:0:0:0: -256,192,17322,1,0,0:0:0:0: -475,192,17401,128,0,17874:0:0:0:0: -182,192,17401,128,0,17480:0:0:0:0: -36,192,17401,1,0,0:0:0:0: -402,192,17401,1,0,0:0:0:0: -329,192,17480,128,0,17558:0:0:0:0: -109,192,17558,128,0,17637:0:0:0:0: -402,192,17558,1,0,0:0:0:0: -36,192,17558,1,0,0:0:0:0: -256,192,17637,128,0,17716:0:0:0:0: -36,192,17716,128,0,17795:0:0:0:0: -109,192,17716,1,0,0:0:0:0: -402,192,17716,1,0,0:0:0:0: -182,192,17795,128,0,17874:0:0:0:0: -36,192,17874,1,0,0:0:0:0: -329,192,17874,1,0,0:0:0:0: -256,192,17953,1,0,0:0:0:0: -329,192,18032,128,0,18111:0:0:0:0: -109,192,18032,1,0,0:0:0:0: -475,192,18032,1,0,0:0:0:0: -36,192,18032,128,0,18506:0:0:0:0: -182,192,18111,128,0,18190:0:0:0:0: -402,192,18190,128,0,18269:0:0:0:0: -109,192,18190,1,0,0:0:0:0: -475,192,18190,1,0,0:0:0:0: -256,192,18269,128,0,18348:0:0:0:0: -475,192,18348,128,0,18427:0:0:0:0: -402,192,18348,1,0,0:0:0:0: -109,192,18348,1,0,0:0:0:0: -329,192,18427,128,0,18506:0:0:0:0: -182,192,18427,1,0,0:0:0:0: -109,192,18506,1,0,0:0:0:0: -475,192,18506,1,0,0:0:0:0: -182,192,18585,1,0,0:0:0:0: -256,192,18664,1,0,0:0:0:0: -475,192,18664,1,0,0:0:0:0: -36,192,18664,1,0,0:0:0:0: -402,192,18664,1,0,0:0:0:0: -109,192,18743,1,0,0:0:0:0: -329,192,18743,1,0,0:0:0:0: -182,192,18822,1,0,0:0:0:0: -402,192,18822,1,0,0:0:0:0: -475,192,18822,1,0,0:0:0:0: -36,192,18901,1,0,0:0:0:0: -256,192,18901,1,0,0:0:0:0: -329,192,18980,1,0,0:0:0:0: -109,192,18980,1,0,0:0:0:0: -475,192,18980,1,0,0:0:0:0: -182,192,19058,1,0,0:0:0:0: -402,192,19058,1,0,0:0:0:0: -36,192,19137,1,0,0:0:0:0: -329,192,19137,1,0,0:0:0:0: -475,192,19137,1,0,0:0:0:0: -109,192,19216,1,0,0:0:0:0: -256,192,19216,1,0,0:0:0:0: -182,192,19295,1,0,0:0:0:0: -36,192,19295,1,0,0:0:0:0: -475,192,19295,1,0,0:0:0:0: -402,192,19295,1,0,0:0:0:0: -329,192,19374,1,0,0:0:0:0: -256,192,19374,1,0,0:0:0:0: -109,192,19453,1,0,0:0:0:0: -36,192,19453,1,0,0:0:0:0: -475,192,19453,1,0,0:0:0:0: -182,192,19532,1,0,0:0:0:0: -256,192,19532,1,0,0:0:0:0: -109,192,19611,1,0,0:0:0:0: -475,192,19611,1,0,0:0:0:0: -36,192,19611,1,0,0:0:0:0: -402,192,19611,1,0,0:0:0:0: -329,192,19690,1,0,0:0:0:0: -182,192,19690,1,0,0:0:0:0: -402,192,19769,1,0,0:0:0:0: -475,192,19769,1,0,0:0:0:0: -36,192,19769,1,0,0:0:0:0: -182,192,19848,1,0,0:0:0:0: -109,192,19848,1,0,0:0:0:0: -475,192,19927,1,0,0:0:0:0: -329,192,19927,1,0,0:0:0:0: -402,192,19927,1,0,0:0:0:0: -256,192,19927,1,0,0:0:0:0: -109,192,20006,1,0,0:0:0:0: -182,192,20006,1,0,0:0:0:0: -36,192,20006,1,0,0:0:0:0: -402,192,20085,1,0,0:0:0:0: -475,192,20085,1,0,0:0:0:0: -329,192,20085,1,0,0:0:0:0: -182,192,20164,1,0,0:0:0:0: -109,192,20164,1,0,0:0:0:0: -36,192,20164,1,0,0:0:0:0: -475,192,20243,1,0,0:0:0:0: -402,192,20243,1,0,0:0:0:0: -329,192,20243,1,0,0:0:0:0: -109,192,20322,1,0,0:0:0:0: -256,192,20322,1,0,0:0:0:0: -36,192,20322,1,0,0:0:0:0: -402,192,20401,1,0,0:0:0:0: -182,192,20401,1,0,0:0:0:0: -475,192,20401,1,0,0:0:0:0: -36,192,20480,1,0,0:0:0:0: -256,192,20480,1,0,0:0:0:0: -109,192,20480,1,0,0:0:0:0: -182,192,20558,1,0,0:0:0:0: -475,192,20558,1,0,0:0:0:0: -329,192,20558,1,0,0:0:0:0: -402,192,20558,1,0,0:0:0:0: -256,192,20637,1,0,0:0:0:0: -36,192,20637,1,0,0:0:0:0: -109,192,20637,1,0,0:0:0:0: -475,192,20716,1,0,0:0:0:0: -402,192,20716,1,0,0:0:0:0: -182,192,20716,1,0,0:0:0:0: -329,192,20795,1,0,0:0:0:0: -109,192,20795,1,0,0:0:0:0: -256,192,20795,1,0,0:0:0:0: -36,192,20874,1,0,0:0:0:0: -402,192,20874,1,0,0:0:0:0: -475,192,20874,1,0,0:0:0:0: -182,192,20874,1,0,0:0:0:0: -109,192,20953,1,0,0:0:0:0: -329,192,20953,1,0,0:0:0:0: -475,192,21032,1,0,0:0:0:0: -256,192,21032,1,0,0:0:0:0: -36,192,21032,1,0,0:0:0:0: -329,192,21111,1,0,0:0:0:0: -109,192,21111,1,0,0:0:0:0: -475,192,21190,1,0,0:0:0:0: -182,192,21190,1,0,0:0:0:0: -36,192,21190,1,0,0:0:0:0: -256,192,21230,1,0,0:0:0:0: -329,192,21269,1,0,0:0:0:0: -402,192,21308,1,0,0:0:0:0: -475,192,21348,1,0,0:0:0:0: -109,192,21348,1,0,0:0:0:0: -182,192,21387,1,0,0:0:0:0: -256,192,21427,1,0,0:0:0:0: -329,192,21466,1,0,0:0:0:0: -36,192,21506,1,0,0:0:0:0: -475,192,21506,1,0,0:0:0:0: -402,192,21545,1,0,0:0:0:0: -329,192,21585,1,0,0:0:0:0: -256,192,21624,1,0,0:0:0:0: -109,192,21664,1,0,0:0:0:0: -475,192,21664,1,0,0:0:0:0: -182,192,21703,1,0,0:0:0:0: -256,192,21743,1,0,0:0:0:0: -329,192,21782,1,0,0:0:0:0: -36,192,21822,1,0,0:0:0:0: -109,192,21822,128,0,21980:0:0:0:0: -402,192,21822,1,0,0:0:0:0: -182,192,21861,128,0,22019:0:0:0:0: -256,192,21901,128,0,22058:0:0:0:0: -329,192,21940,128,0,22098:0:0:0:0: -402,192,21980,128,0,22137:0:0:0:0: -475,192,22019,128,0,22177:0:0:0:0: -36,192,22058,128,0,22177:0:0:0:0: -109,192,22098,128,0,22216:0:0:0:0: -182,192,22137,128,0,22256:0:0:0:0: -256,192,22177,128,0,22295:0:0:0:0: -329,192,22216,128,0,22335:0:0:0:0: -402,192,22256,128,0,22374:0:0:0:0: -36,192,22295,128,0,22394:0:0:0:0: -109,192,22335,128,0,22414:0:0:0:0: -182,192,22374,128,0,22433:0:0:0:0: -256,192,22414,128,0,22453:0:0:0:0: -329,192,22453,1,0,0:0:0:0: -475,192,22453,1,0,0:0:0:0: -256,192,22532,1,0,0:0:0:0: -402,192,22532,1,0,0:0:0:0: -182,192,22611,1,0,0:0:0:0: -329,192,22611,1,0,0:0:0:0: -182,192,22769,1,0,0:0:0:0: -36,192,22769,1,0,0:0:0:0: -256,192,22848,1,0,0:0:0:0: -109,192,22848,1,0,0:0:0:0: -329,192,22927,1,0,0:0:0:0: -182,192,22927,1,0,0:0:0:0: -256,192,23006,1,0,0:0:0:0: -182,192,23085,128,0,23243:0:0:0:0: -402,192,23085,128,0,23164:0:0:0:0: -36,192,23085,1,0,0:0:0:0: -475,192,23085,1,0,0:0:0:0: -329,192,23164,128,0,23243:0:0:0:0: -256,192,23164,1,0,0:0:0:0: -402,192,23243,128,0,23401:0:0:0:0: -109,192,23243,128,0,23322:0:0:0:0: -36,192,23243,1,0,0:0:0:0: -475,192,23243,1,0,0:0:0:0: -182,192,23322,128,0,23401:0:0:0:0: -256,192,23322,1,0,0:0:0:0: -329,192,23401,128,0,23558:0:0:0:0: -109,192,23401,128,0,23480:0:0:0:0: -475,192,23401,1,0,0:0:0:0: -256,192,23480,128,0,23637:0:0:0:0: -36,192,23480,128,0,23558:0:0:0:0: -402,192,23480,1,0,0:0:0:0: -182,192,23558,128,0,23716:0:0:0:0: -475,192,23558,1,0,0:0:0:0: -109,192,23637,1,0,0:0:0:0: -402,192,23637,1,0,0:0:0:0: -475,192,23716,128,0,23953:0:0:0:0: -329,192,23716,128,0,23795:0:0:0:0: -36,192,23716,1,0,0:0:0:0: -182,192,23795,128,0,23874:0:0:0:0: -402,192,23795,128,0,23874:0:0:0:0: -329,192,23874,128,0,24032:0:0:0:0: -36,192,23874,128,0,23953:0:0:0:0: -256,192,23874,1,0,0:0:0:0: -402,192,23953,128,0,24111:0:0:0:0: -109,192,23953,128,0,24032:0:0:0:0: -475,192,24032,128,0,24348:0:0:0:0: -36,192,24032,1,0,0:0:0:0: -182,192,24032,128,0,24111:0:0:0:0: -256,192,24111,128,0,24190:0:0:0:0: -329,192,24190,128,0,24269:0:0:0:0: -109,192,24190,1,0,0:0:0:0: -182,192,24269,128,0,24348:0:0:0:0: -36,192,24348,128,0,24585:0:0:0:0: -402,192,24348,1,0,0:0:0:0: -256,192,24348,128,0,24427:0:0:0:0: -109,192,24427,128,0,24506:0:0:0:0: -329,192,24427,128,0,24506:0:0:0:0: -182,192,24506,128,0,24664:0:0:0:0: -256,192,24506,1,0,0:0:0:0: -475,192,24506,128,0,24585:0:0:0:0: -109,192,24585,128,0,24743:0:0:0:0: -402,192,24585,128,0,24664:0:0:0:0: -36,192,24664,128,0,24980:0:0:0:0: -475,192,24664,1,0,0:0:0:0: -329,192,24664,128,0,24743:0:0:0:0: -256,192,24743,128,0,24822:0:0:0:0: -402,192,24822,1,0,0:0:0:0: -182,192,24822,128,0,24901:0:0:0:0: -329,192,24901,128,0,24980:0:0:0:0: -475,192,24980,128,0,25216:0:0:0:0: -256,192,24980,1,0,0:0:0:0: -109,192,24980,128,0,25058:0:0:0:0: -402,192,25058,128,0,25137:0:0:0:0: -182,192,25058,128,0,25137:0:0:0:0: -329,192,25137,128,0,25295:0:0:0:0: -36,192,25137,1,0,0:0:0:0: -256,192,25137,128,0,25216:0:0:0:0: -402,192,25216,128,0,25374:0:0:0:0: -109,192,25216,128,0,25295:0:0:0:0: -475,192,25295,128,0,25611:0:0:0:0: -36,192,25295,1,0,0:0:0:0: -182,192,25295,128,0,25374:0:0:0:0: -256,192,25374,128,0,25453:0:0:0:0: -109,192,25453,1,0,0:0:0:0: -329,192,25453,128,0,25532:0:0:0:0: -182,192,25532,128,0,25611:0:0:0:0: -36,192,25611,128,0,25848:0:0:0:0: -402,192,25611,1,0,0:0:0:0: -256,192,25611,128,0,25690:0:0:0:0: -109,192,25690,128,0,25769:0:0:0:0: -329,192,25690,128,0,25769:0:0:0:0: -182,192,25769,128,0,25927:0:0:0:0: -256,192,25769,1,0,0:0:0:0: -475,192,25769,128,0,25848:0:0:0:0: -109,192,25848,128,0,26006:0:0:0:0: -402,192,25848,128,0,25927:0:0:0:0: -36,192,25927,128,0,26243:0:0:0:0: -475,192,25927,1,0,0:0:0:0: -329,192,25927,128,0,26006:0:0:0:0: -256,192,26006,128,0,26085:0:0:0:0: -475,192,26085,1,0,0:0:0:0: -182,192,26085,128,0,26164:0:0:0:0: -402,192,26164,128,0,26243:0:0:0:0: -256,192,26243,1,0,0:0:0:0: -475,192,26243,128,0,26322:0:0:0:0: -109,192,26243,128,0,26322:0:0:0:0: -329,192,26322,128,0,26401:0:0:0:0: -182,192,26322,128,0,26401:0:0:0:0: -475,192,26401,128,0,26480:0:0:0:0: -36,192,26401,128,0,26480:0:0:0:0: -402,192,26401,1,0,0:0:0:0: -329,192,26480,128,0,26558:0:0:0:0: -182,192,26480,128,0,26558:0:0:0:0: -402,192,26558,128,0,26874:0:0:0:0: -475,192,26558,128,0,26874:0:0:0:0: -256,192,26558,1,0,0:0:0:0: -36,192,26558,128,0,26637:0:0:0:0: -109,192,26637,128,0,26716:0:0:0:0: -329,192,26716,1,0,0:0:0:0: -182,192,26716,128,0,26795:0:0:0:0: -256,192,26795,128,0,26874:0:0:0:0: -36,192,26874,128,0,26953:0:0:0:0: -109,192,26874,1,0,0:0:0:0: -329,192,26874,128,0,26953:0:0:0:0: -182,192,26953,128,0,27032:0:0:0:0: -402,192,26953,128,0,27032:0:0:0:0: -36,192,27032,128,0,27111:0:0:0:0: -256,192,27032,1,0,0:0:0:0: -475,192,27032,128,0,27111:0:0:0:0: -182,192,27111,128,0,27190:0:0:0:0: -329,192,27111,128,0,27190:0:0:0:0: -109,192,27190,128,0,27506:0:0:0:0: -36,192,27190,128,0,27506:0:0:0:0: -256,192,27190,1,0,0:0:0:0: -475,192,27190,128,0,27269:0:0:0:0: -402,192,27269,128,0,27348:0:0:0:0: -182,192,27348,1,0,0:0:0:0: -329,192,27348,128,0,27427:0:0:0:0: -256,192,27427,128,0,27506:0:0:0:0: -475,192,27506,128,0,27822:0:0:0:0: -329,192,27506,128,0,27822:0:0:0:0: -402,192,27506,1,0,0:0:0:0: -182,192,27506,128,0,27585:0:0:0:0: -256,192,27585,128,0,27664:0:0:0:0: -109,192,27664,128,0,27980:0:0:0:0: -402,192,27664,1,0,0:0:0:0: -36,192,27664,128,0,27743:0:0:0:0: -182,192,27743,128,0,27822:0:0:0:0: -402,192,27822,128,0,28137:0:0:0:0: -36,192,27822,1,0,0:0:0:0: -256,192,27822,128,0,27901:0:0:0:0: -329,192,27901,128,0,27980:0:0:0:0: -182,192,27980,128,0,28137:0:0:0:0: -36,192,27980,1,0,0:0:0:0: -475,192,27980,1,0,0:0:0:0: -256,192,28058,128,0,28137:0:0:0:0: -36,192,28137,128,0,28374:0:0:0:0: -475,192,28137,128,0,28374:0:0:0:0: -109,192,28137,1,0,0:0:0:0: -329,192,28137,1,0,0:0:0:0: -256,192,28216,1,0,0:0:0:0: -329,192,28295,128,0,28374:0:0:0:0: -182,192,28295,128,0,28374:0:0:0:0: -402,192,28295,1,0,0:0:0:0: -109,192,28295,1,0,0:0:0:0: -256,192,28374,1,0,0:0:0:0: -329,192,28453,128,0,28690:0:0:0:0: -182,192,28453,128,0,28690:0:0:0:0: -475,192,28453,1,0,0:0:0:0: -36,192,28453,1,0,0:0:0:0: -109,192,28532,1,0,0:0:0:0: -36,192,28611,128,0,28690:0:0:0:0: -475,192,28611,128,0,28690:0:0:0:0: -256,192,28611,1,0,0:0:0:0: -109,192,28690,1,0,0:0:0:0: -402,192,28690,1,0,0:0:0:0: -36,192,28769,128,0,29006:0:0:0:0: -475,192,28769,1,0,0:0:0:0: -182,192,28769,128,0,28848:0:0:0:0: -329,192,28769,1,0,0:0:0:0: -109,192,28848,128,0,28927:0:0:0:0: -256,192,28848,128,0,28927:0:0:0:0: -182,192,28927,128,0,29085:0:0:0:0: -329,192,28927,1,0,0:0:0:0: -475,192,28927,128,0,29006:0:0:0:0: -109,192,29006,128,0,29164:0:0:0:0: -402,192,29006,128,0,29085:0:0:0:0: -36,192,29085,128,0,29401:0:0:0:0: -475,192,29085,1,0,0:0:0:0: -329,192,29085,128,0,29164:0:0:0:0: -256,192,29164,128,0,29243:0:0:0:0: -182,192,29243,1,0,0:0:0:0: -402,192,29243,128,0,29322:0:0:0:0: -329,192,29322,128,0,29401:0:0:0:0: -256,192,29401,1,0,0:0:0:0: -475,192,29401,128,0,29637:0:0:0:0: -109,192,29401,128,0,29480:0:0:0:0: -402,192,29480,128,0,29558:0:0:0:0: -182,192,29480,128,0,29558:0:0:0:0: -329,192,29558,128,0,29716:0:0:0:0: -36,192,29558,1,0,0:0:0:0: -256,192,29558,128,0,29637:0:0:0:0: -402,192,29637,128,0,29795:0:0:0:0: -109,192,29637,128,0,29716:0:0:0:0: -36,192,29716,1,0,0:0:0:0: -475,192,29716,128,0,30032:0:0:0:0: -182,192,29716,128,0,29795:0:0:0:0: -256,192,29795,128,0,29874:0:0:0:0: -109,192,29874,1,0,0:0:0:0: -329,192,29874,128,0,29953:0:0:0:0: -182,192,29953,128,0,30032:0:0:0:0: -402,192,30032,1,0,0:0:0:0: -36,192,30032,128,0,30269:0:0:0:0: -256,192,30032,128,0,30111:0:0:0:0: -109,192,30111,128,0,30190:0:0:0:0: -329,192,30111,128,0,30190:0:0:0:0: -182,192,30190,128,0,30348:0:0:0:0: -256,192,30190,1,0,0:0:0:0: -475,192,30190,128,0,30269:0:0:0:0: -109,192,30269,128,0,30427:0:0:0:0: -402,192,30269,128,0,30348:0:0:0:0: -36,192,30348,128,0,30664:0:0:0:0: -475,192,30348,1,0,0:0:0:0: -329,192,30348,128,0,30427:0:0:0:0: -256,192,30427,128,0,30506:0:0:0:0: -402,192,30506,1,0,0:0:0:0: -182,192,30506,128,0,30585:0:0:0:0: -329,192,30585,128,0,30664:0:0:0:0: -256,192,30664,1,0,0:0:0:0: -475,192,30664,128,0,30901:0:0:0:0: -109,192,30664,128,0,30743:0:0:0:0: -402,192,30743,128,0,30822:0:0:0:0: -182,192,30743,128,0,30822:0:0:0:0: -329,192,30822,128,0,30980:0:0:0:0: -36,192,30822,1,0,0:0:0:0: -256,192,30822,128,0,30901:0:0:0:0: -402,192,30901,128,0,31058:0:0:0:0: -109,192,30901,128,0,30980:0:0:0:0: -36,192,30980,1,0,0:0:0:0: -475,192,30980,128,0,31295:0:0:0:0: -182,192,30980,128,0,31058:0:0:0:0: -256,192,31058,128,0,31137:0:0:0:0: -109,192,31137,1,0,0:0:0:0: -329,192,31137,128,0,31216:0:0:0:0: -182,192,31216,128,0,31295:0:0:0:0: -402,192,31295,1,0,0:0:0:0: -36,192,31295,128,0,31374:0:0:0:0: -256,192,31295,128,0,31374:0:0:0:0: -182,192,31374,128,0,31453:0:0:0:0: -329,192,31374,128,0,31453:0:0:0:0: -475,192,31453,1,0,0:0:0:0: -36,192,31453,128,0,31532:0:0:0:0: -402,192,31453,128,0,31532:0:0:0:0: -182,192,31532,128,0,31611:0:0:0:0: -329,192,31532,128,0,31611:0:0:0:0: -109,192,31611,128,0,31848:0:0:0:0: -36,192,31611,128,0,31848:0:0:0:0: -256,192,31611,1,0,0:0:0:0: -475,192,31611,128,0,31690:0:0:0:0: -402,192,31690,128,0,31769:0:0:0:0: -182,192,31769,1,0,0:0:0:0: -329,192,31769,128,0,31848:0:0:0:0: -256,192,31848,128,0,31927:0:0:0:0: -36,192,31927,128,0,32164:0:0:0:0: -475,192,31927,128,0,32164:0:0:0:0: -329,192,31927,128,0,32164:0:0:0:0: -182,192,31927,1,0,0:0:0:0: -109,192,32006,128,0,32164:0:0:0:0: -182,192,32085,128,0,32164:0:0:0:0: -402,192,32085,1,0,0:0:0:0: -256,192,32164,128,0,32243:0:0:0:0: -36,192,32243,128,0,32558:0:0:0:0: -475,192,32243,128,0,32480:0:0:0:0: -182,192,32243,128,0,32558:0:0:0:0: -329,192,32243,1,0,0:0:0:0: -402,192,32322,128,0,32480:0:0:0:0: -109,192,32401,1,0,0:0:0:0: -329,192,32401,128,0,32480:0:0:0:0: -256,192,32480,128,0,32558:0:0:0:0: -402,192,32558,1,0,0:0:0:0: -109,192,32558,128,0,32795:0:0:0:0: -475,192,32558,1,0,0:0:0:0: -182,192,32637,128,0,32874:0:0:0:0: -256,192,32716,128,0,32953:0:0:0:0: -329,192,32795,128,0,33032:0:0:0:0: -36,192,32874,128,0,33032:0:0:0:0: -475,192,32874,1,0,0:0:0:0: -402,192,32874,1,0,0:0:0:0: -109,192,32953,128,0,33111:0:0:0:0: -182,192,33032,128,0,33190:0:0:0:0: -256,192,33111,128,0,33269:0:0:0:0: -329,192,33190,128,0,33348:0:0:0:0: -36,192,33190,128,0,33506:0:0:0:0: -475,192,33190,128,0,33506:0:0:0:0: -109,192,33190,128,0,33269:0:0:0:0: -402,192,33190,1,0,0:0:0:0: -182,192,33269,128,0,33348:0:0:0:0: -256,192,33348,128,0,33427:0:0:0:0: -329,192,33427,128,0,33506:0:0:0:0: -109,192,33506,128,0,33743:0:0:0:0: -402,192,33506,128,0,33743:0:0:0:0: -256,192,33664,128,0,33743:0:0:0:0: -182,192,33664,1,0,0:0:0:0: -329,192,33743,1,0,0:0:0:0: -402,192,33822,1,0,0:0:0:0: -475,192,33822,128,0,34058:0:0:0:0: -256,192,33822,1,0,0:0:0:0: -109,192,33822,1,0,0:0:0:0: -36,192,33822,128,0,34058:0:0:0:0: -182,192,33822,1,0,0:0:0:0: -329,192,33980,128,0,34058:0:0:0:0: -402,192,33980,1,0,0:0:0:0: -256,192,33980,1,0,0:0:0:0: -109,192,33980,1,0,0:0:0:0: -475,192,34137,128,0,34216:0:0:0:0: -182,192,34137,128,0,34216:0:0:0:0: -36,192,34137,1,0,0:0:0:0: -256,192,34137,1,0,0:0:0:0: -402,192,34137,1,0,0:0:0:0: -329,192,34216,128,0,34295:0:0:0:0: -109,192,34216,128,0,34295:0:0:0:0: -402,192,34295,128,0,34374:0:0:0:0: -475,192,34295,1,0,0:0:0:0: -36,192,34295,128,0,34374:0:0:0:0: -256,192,34374,128,0,34453:0:0:0:0: -182,192,34374,1,0,0:0:0:0: -36,192,34453,128,0,34769:0:0:0:0: -475,192,34453,128,0,34532:0:0:0:0: -109,192,34453,1,0,0:0:0:0: -329,192,34532,128,0,34611:0:0:0:0: -182,192,34611,128,0,34769:0:0:0:0: -475,192,34611,1,0,0:0:0:0: -402,192,34611,128,0,34690:0:0:0:0: -256,192,34690,128,0,34769:0:0:0:0: -109,192,34769,128,0,34927:0:0:0:0: -475,192,34769,1,0,0:0:0:0: -329,192,34769,128,0,34848:0:0:0:0: -182,192,34848,128,0,35006:0:0:0:0: -402,192,34848,128,0,34927:0:0:0:0: -256,192,34927,128,0,35085:0:0:0:0: -36,192,34927,1,0,0:0:0:0: -475,192,34927,128,0,35006:0:0:0:0: -329,192,35006,128,0,35164:0:0:0:0: -109,192,35006,1,0,0:0:0:0: -475,192,35085,128,0,35401:0:0:0:0: -402,192,35085,1,0,0:0:0:0: -36,192,35085,128,0,35164:0:0:0:0: -182,192,35164,128,0,35243:0:0:0:0: -329,192,35243,128,0,35401:0:0:0:0: -256,192,35243,1,0,0:0:0:0: -36,192,35243,128,0,35322:0:0:0:0: -109,192,35322,128,0,35401:0:0:0:0: -402,192,35401,128,0,35558:0:0:0:0: -36,192,35401,1,0,0:0:0:0: -182,192,35401,128,0,35480:0:0:0:0: -329,192,35480,128,0,35637:0:0:0:0: -109,192,35480,128,0,35558:0:0:0:0: -256,192,35558,128,0,35716:0:0:0:0: -475,192,35558,1,0,0:0:0:0: -36,192,35558,128,0,35637:0:0:0:0: -182,192,35637,128,0,35795:0:0:0:0: -402,192,35637,1,0,0:0:0:0: -36,192,35716,128,0,36032:0:0:0:0: -109,192,35716,1,0,0:0:0:0: -475,192,35716,128,0,35795:0:0:0:0: -402,192,35795,128,0,35874:0:0:0:0: -182,192,35874,128,0,36032:0:0:0:0: -329,192,35874,1,0,0:0:0:0: -475,192,35874,128,0,35953:0:0:0:0: -256,192,35953,128,0,36032:0:0:0:0: -109,192,36032,128,0,36190:0:0:0:0: -475,192,36032,1,0,0:0:0:0: -329,192,36032,128,0,36111:0:0:0:0: -182,192,36111,128,0,36269:0:0:0:0: -402,192,36111,128,0,36190:0:0:0:0: -256,192,36190,128,0,36348:0:0:0:0: -36,192,36190,1,0,0:0:0:0: -475,192,36190,128,0,36269:0:0:0:0: -329,192,36269,128,0,36427:0:0:0:0: -109,192,36269,1,0,0:0:0:0: -475,192,36348,128,0,36664:0:0:0:0: -402,192,36348,1,0,0:0:0:0: -36,192,36348,128,0,36427:0:0:0:0: -182,192,36427,128,0,36506:0:0:0:0: -329,192,36506,128,0,36664:0:0:0:0: -256,192,36506,1,0,0:0:0:0: -109,192,36506,128,0,36585:0:0:0:0: -36,192,36585,128,0,36664:0:0:0:0: -402,192,36664,128,0,36822:0:0:0:0: -256,192,36664,1,0,0:0:0:0: -182,192,36664,128,0,36743:0:0:0:0: -329,192,36743,128,0,36901:0:0:0:0: -109,192,36743,128,0,36822:0:0:0:0: -256,192,36822,128,0,36980:0:0:0:0: -475,192,36822,1,0,0:0:0:0: -36,192,36822,128,0,36901:0:0:0:0: -182,192,36901,128,0,37058:0:0:0:0: -402,192,36901,1,0,0:0:0:0: -36,192,36980,128,0,37295:0:0:0:0: -109,192,36980,1,0,0:0:0:0: -329,192,36980,128,0,37058:0:0:0:0: -475,192,37058,128,0,37137:0:0:0:0: -182,192,37137,128,0,37295:0:0:0:0: -256,192,37137,128,0,37216:0:0:0:0: -402,192,37137,1,0,0:0:0:0: -475,192,37216,128,0,37295:0:0:0:0: -109,192,37295,128,0,37453:0:0:0:0: -329,192,37295,128,0,37374:0:0:0:0: -256,192,37295,1,0,0:0:0:0: -182,192,37374,128,0,37532:0:0:0:0: -402,192,37374,128,0,37453:0:0:0:0: -256,192,37453,128,0,37611:0:0:0:0: -36,192,37453,1,0,0:0:0:0: -475,192,37453,128,0,37532:0:0:0:0: -329,192,37532,128,0,37690:0:0:0:0: -109,192,37532,1,0,0:0:0:0: -475,192,37611,128,0,38243:0:0:0:0: -36,192,37611,128,0,37690:0:0:0:0: -182,192,37611,128,0,37690:0:0:0:0: -402,192,37611,128,0,37690:0:0:0:0: -109,192,37769,128,0,38164:0:0:0:0: -36,192,37769,128,0,37848:0:0:0:0: -256,192,37769,128,0,37848:0:0:0:0: -182,192,37769,128,0,37848:0:0:0:0: -402,192,37769,128,0,37848:0:0:0:0: -329,192,37927,128,0,38243:0:0:0:0: -256,192,37927,128,0,38006:0:0:0:0: -402,192,37927,128,0,38006:0:0:0:0: -36,192,38006,128,0,38164:0:0:0:0: -182,192,38006,128,0,38164:0:0:0:0: -402,192,38243,128,0,38558:0:0:0:0: -256,192,38243,128,0,38558:0:0:0:0: -36,192,38243,128,0,38322:0:0:0:0: -109,192,38243,128,0,38322:0:0:0:0: -182,192,38243,128,0,38322:0:0:0:0: -182,192,38401,128,0,38480:0:0:0:0: -36,192,38401,128,0,38480:0:0:0:0: -329,192,38401,128,0,38480:0:0:0:0: -475,192,38401,128,0,38480:0:0:0:0: -36,192,38558,128,0,38795:0:0:0:0: -109,192,38558,128,0,38716:0:0:0:0: -329,192,38558,128,0,38637:0:0:0:0: -475,192,38558,128,0,38795:0:0:0:0: -402,192,38637,128,0,38795:0:0:0:0: -256,192,38637,128,0,38716:0:0:0:0: -329,192,38716,128,0,38795:0:0:0:0: -182,192,38716,128,0,38795:0:0:0:0: -109,192,38795,128,0,38874:0:0:0:0: -256,192,38874,128,0,39032:0:0:0:0: -475,192,38874,128,0,39190:0:0:0:0: -329,192,38874,128,0,38953:0:0:0:0: -36,192,38874,128,0,39032:0:0:0:0: -182,192,38953,128,0,39190:0:0:0:0: -109,192,39032,128,0,39111:0:0:0:0: -402,192,39032,128,0,39190:0:0:0:0: -256,192,39111,128,0,39269:0:0:0:0: -329,192,39190,128,0,39427:0:0:0:0: -36,192,39190,128,0,39506:0:0:0:0: -109,192,39190,128,0,39348:0:0:0:0: -402,192,39269,128,0,39348:0:0:0:0: -256,192,39348,128,0,39506:0:0:0:0: -475,192,39348,128,0,39506:0:0:0:0: -182,192,39427,128,0,39585:0:0:0:0: -329,192,39506,128,0,39743:0:0:0:0: -109,192,39506,128,0,39664:0:0:0:0: -402,192,39585,128,0,39664:0:0:0:0: -256,192,39664,128,0,39822:0:0:0:0: -36,192,39664,128,0,39822:0:0:0:0: -475,192,39664,128,0,39980:0:0:0:0: -182,192,39743,128,0,39901:0:0:0:0: -109,192,39822,128,0,40137:0:0:0:0: -402,192,39822,128,0,40058:0:0:0:0: -329,192,39901,128,0,40137:0:0:0:0: -256,192,39980,128,0,40058:0:0:0:0: -36,192,39980,128,0,40058:0:0:0:0: -182,192,40058,128,0,40216:0:0:0:0: -256,192,40137,128,0,40295:0:0:0:0: -36,192,40137,128,0,40453:0:0:0:0: -475,192,40137,128,0,40295:0:0:0:0: -329,192,40216,128,0,40453:0:0:0:0: -402,192,40295,128,0,40374:0:0:0:0: -109,192,40295,128,0,40453:0:0:0:0: -256,192,40374,128,0,40532:0:0:0:0: -182,192,40453,128,0,40690:0:0:0:0: -475,192,40453,128,0,40769:0:0:0:0: -402,192,40453,128,0,40611:0:0:0:0: -109,192,40532,128,0,40611:0:0:0:0: -256,192,40611,128,0,40769:0:0:0:0: -36,192,40611,128,0,40769:0:0:0:0: -329,192,40690,128,0,40848:0:0:0:0: -182,192,40769,128,0,41006:0:0:0:0: -402,192,40769,128,0,40927:0:0:0:0: -109,192,40848,128,0,40927:0:0:0:0: -256,192,40927,128,0,41085:0:0:0:0: -36,192,40927,128,0,41164:0:0:0:0: -475,192,40927,128,0,41085:0:0:0:0: -329,192,41006,128,0,41164:0:0:0:0: -402,192,41085,128,0,41243:0:0:0:0: -109,192,41085,128,0,41243:0:0:0:0: -182,192,41164,128,0,41322:0:0:0:0: -256,192,41243,128,0,41401:0:0:0:0: -475,192,41243,128,0,41322:0:0:0:0: -329,192,41322,128,0,41401:0:0:0:0: -36,192,41401,128,0,41716:0:0:0:0: -109,192,41401,128,0,41716:0:0:0:0: -402,192,41401,1,0,0:0:0:0: -475,192,41401,1,0,0:0:0:0: -182,192,41401,1,0,0:0:0:0: -402,192,41558,1,0,0:0:0:0: -475,192,41558,1,0,0:0:0:0: -329,192,41716,128,0,41795:0:0:0:0: -256,192,41795,128,0,41874:0:0:0:0: -182,192,41874,128,0,41953:0:0:0:0: -329,192,41953,1,0,0:0:0:0: -109,192,42032,128,0,42111:0:0:0:0: -36,192,42032,1,0,0:0:0:0: -402,192,42032,1,0,0:0:0:0: -475,192,42032,1,0,0:0:0:0: -256,192,42032,1,0,0:0:0:0: -182,192,42111,128,0,42190:0:0:0:0: -256,192,42190,128,0,42269:0:0:0:0: -329,192,42269,128,0,42348:0:0:0:0: -36,192,42348,1,0,0:0:0:0: -109,192,42427,1,0,0:0:0:0: -182,192,42506,128,0,42585:0:0:0:0: -109,192,42585,128,0,42664:0:0:0:0: -36,192,42664,128,0,42822:0:0:0:0: -256,192,42664,128,0,42822:0:0:0:0: -475,192,42664,128,0,42822:0:0:0:0: -329,192,42664,128,0,42822:0:0:0:0: -402,192,42664,128,0,42822:0:0:0:0: -36,192,42980,128,0,43137:0:0:0:0: -109,192,42980,128,0,43137:0:0:0:0: -329,192,42980,128,0,43137:0:0:0:0: -475,192,42980,128,0,43137:0:0:0:0: -182,192,42980,128,0,43137:0:0:0:0: -182,192,43295,128,0,43453:0:0:0:0: -36,192,43295,128,0,43453:0:0:0:0: -329,192,43295,128,0,43453:0:0:0:0: -256,192,43295,128,0,43453:0:0:0:0: -475,192,43295,128,0,43453:0:0:0:0: -36,192,43611,128,0,43848:0:0:0:0: -182,192,43611,128,0,43848:0:0:0:0: -329,192,43611,128,0,43848:0:0:0:0: -475,192,43611,128,0,43848:0:0:0:0: -402,192,43611,128,0,43848:0:0:0:0: -109,192,43611,128,0,43848:0:0:0:0: -475,192,43927,128,0,44164:0:0:0:0: -36,192,43927,1,0,0:0:0:0: -256,192,43927,1,0,0:0:0:0: -402,192,43927,1,0,0:0:0:0: -109,192,44006,1,0,0:0:0:0: -182,192,44085,1,0,0:0:0:0: -329,192,44085,1,0,0:0:0:0: -109,192,44164,1,0,0:0:0:0: -475,192,44243,128,0,44558:0:0:0:0: -36,192,44243,1,0,0:0:0:0: -256,192,44243,1,0,0:0:0:0: -109,192,44322,1,0,0:0:0:0: -182,192,44401,1,0,0:0:0:0: -329,192,44401,1,0,0:0:0:0: -109,192,44480,1,0,0:0:0:0: -329,192,44558,128,0,44716:0:0:0:0: -36,192,44558,1,0,0:0:0:0: -256,192,44558,1,0,0:0:0:0: -109,192,44637,1,0,0:0:0:0: -475,192,44716,128,0,45032:0:0:0:0: -182,192,44716,1,0,0:0:0:0: -402,192,44716,1,0,0:0:0:0: -256,192,44795,1,0,0:0:0:0: -182,192,44874,1,0,0:0:0:0: -36,192,44874,1,0,0:0:0:0: -109,192,44953,1,0,0:0:0:0: -329,192,45032,128,0,45190:0:0:0:0: -36,192,45032,1,0,0:0:0:0: -256,192,45032,1,0,0:0:0:0: -109,192,45111,1,0,0:0:0:0: -475,192,45190,128,0,45506:0:0:0:0: -182,192,45190,1,0,0:0:0:0: -36,192,45190,1,0,0:0:0:0: -256,192,45269,1,0,0:0:0:0: -329,192,45348,1,0,0:0:0:0: -109,192,45348,1,0,0:0:0:0: -182,192,45427,1,0,0:0:0:0: -402,192,45506,128,0,45664:0:0:0:0: -256,192,45506,1,0,0:0:0:0: -36,192,45506,1,0,0:0:0:0: -109,192,45585,1,0,0:0:0:0: -475,192,45664,128,0,46137:0:0:0:0: -182,192,45664,1,0,0:0:0:0: -329,192,45664,1,0,0:0:0:0: -109,192,45743,1,0,0:0:0:0: -36,192,45822,1,0,0:0:0:0: -256,192,45822,1,0,0:0:0:0: -182,192,45901,1,0,0:0:0:0: -109,192,45980,1,0,0:0:0:0: -329,192,45980,1,0,0:0:0:0: -256,192,46058,1,0,0:0:0:0: -182,192,46137,1,0,0:0:0:0: -402,192,46137,1,0,0:0:0:0: -329,192,46216,1,0,0:0:0:0: -256,192,46295,1,0,0:0:0:0: -109,192,46295,1,0,0:0:0:0: -329,192,46374,1,0,0:0:0:0: -36,192,46453,128,0,46690:0:0:0:0: -402,192,46453,1,0,0:0:0:0: -182,192,46453,1,0,0:0:0:0: -256,192,46532,1,0,0:0:0:0: -329,192,46611,1,0,0:0:0:0: -475,192,46611,1,0,0:0:0:0: -256,192,46690,1,0,0:0:0:0: -36,192,46769,128,0,47085:0:0:0:0: -182,192,46769,1,0,0:0:0:0: -402,192,46769,1,0,0:0:0:0: -329,192,46848,1,0,0:0:0:0: -256,192,46927,1,0,0:0:0:0: -475,192,46927,1,0,0:0:0:0: -402,192,47006,1,0,0:0:0:0: -182,192,47085,128,0,47243:0:0:0:0: -329,192,47085,1,0,0:0:0:0: -475,192,47085,1,0,0:0:0:0: -256,192,47164,1,0,0:0:0:0: -36,192,47243,128,0,47558:0:0:0:0: -402,192,47243,1,0,0:0:0:0: -475,192,47243,1,0,0:0:0:0: -329,192,47322,1,0,0:0:0:0: -256,192,47401,1,0,0:0:0:0: -475,192,47401,1,0,0:0:0:0: -402,192,47480,1,0,0:0:0:0: -182,192,47558,128,0,47716:0:0:0:0: -329,192,47558,1,0,0:0:0:0: -109,192,47558,1,0,0:0:0:0: -402,192,47637,1,0,0:0:0:0: -36,192,47716,128,0,48032:0:0:0:0: -475,192,47716,1,0,0:0:0:0: -256,192,47716,1,0,0:0:0:0: -329,192,47795,1,0,0:0:0:0: -109,192,47874,128,0,48032:0:0:0:0: -475,192,47874,1,0,0:0:0:0: -256,192,47874,1,0,0:0:0:0: -402,192,47953,1,0,0:0:0:0: -182,192,48032,128,0,48190:0:0:0:0: -329,192,48032,1,0,0:0:0:0: -475,192,48032,1,0,0:0:0:0: -402,192,48111,1,0,0:0:0:0: -36,192,48190,128,0,48664:0:0:0:0: -475,192,48190,1,0,0:0:0:0: -256,192,48190,1,0,0:0:0:0: -329,192,48269,1,0,0:0:0:0: -402,192,48348,1,0,0:0:0:0: -182,192,48348,1,0,0:0:0:0: -256,192,48427,1,0,0:0:0:0: -329,192,48506,1,0,0:0:0:0: -109,192,48506,1,0,0:0:0:0: -182,192,48585,1,0,0:0:0:0: -256,192,48664,1,0,0:0:0:0: -475,192,48664,1,0,0:0:0:0: -329,192,48743,1,0,0:0:0:0: -402,192,48822,1,0,0:0:0:0: -109,192,48822,1,0,0:0:0:0: -182,192,48901,1,0,0:0:0:0: -475,192,48980,128,0,49216:0:0:0:0: -256,192,48980,1,0,0:0:0:0: -36,192,48980,1,0,0:0:0:0: -402,192,48980,1,0,0:0:0:0: -182,192,49058,1,0,0:0:0:0: -36,192,49137,1,0,0:0:0:0: -329,192,49137,1,0,0:0:0:0: -402,192,49137,1,0,0:0:0:0: -256,192,49216,1,0,0:0:0:0: -182,192,49216,1,0,0:0:0:0: -475,192,49295,128,0,49611:0:0:0:0: -36,192,49295,1,0,0:0:0:0: -109,192,49295,1,0,0:0:0:0: -402,192,49295,1,0,0:0:0:0: -182,192,49374,1,0,0:0:0:0: -256,192,49453,1,0,0:0:0:0: -36,192,49453,1,0,0:0:0:0: -109,192,49532,1,0,0:0:0:0: -329,192,49611,128,0,49769:0:0:0:0: -182,192,49611,1,0,0:0:0:0: -36,192,49611,1,0,0:0:0:0: -402,192,49611,1,0,0:0:0:0: -109,192,49690,1,0,0:0:0:0: -475,192,49769,128,0,50085:0:0:0:0: -36,192,49769,1,0,0:0:0:0: -256,192,49769,1,0,0:0:0:0: -182,192,49848,1,0,0:0:0:0: -109,192,49927,1,0,0:0:0:0: -329,192,49927,1,0,0:0:0:0: -256,192,50006,1,0,0:0:0:0: -329,192,50085,128,0,50243:0:0:0:0: -182,192,50085,1,0,0:0:0:0: -36,192,50085,1,0,0:0:0:0: -109,192,50164,1,0,0:0:0:0: -475,192,50243,128,0,50558:0:0:0:0: -36,192,50243,1,0,0:0:0:0: -256,192,50243,1,0,0:0:0:0: -109,192,50322,1,0,0:0:0:0: -182,192,50401,1,0,0:0:0:0: -36,192,50401,1,0,0:0:0:0: -256,192,50480,1,0,0:0:0:0: -402,192,50558,128,0,50716:0:0:0:0: -109,192,50558,1,0,0:0:0:0: -329,192,50558,1,0,0:0:0:0: -182,192,50637,1,0,0:0:0:0: -475,192,50716,128,0,51348:0:0:0:0: -256,192,50716,1,0,0:0:0:0: -36,192,50716,1,0,0:0:0:0: -109,192,50795,1,0,0:0:0:0: -182,192,50874,1,0,0:0:0:0: -329,192,50874,1,0,0:0:0:0: -402,192,50953,1,0,0:0:0:0: -36,192,51032,1,0,0:0:0:0: -182,192,51032,1,0,0:0:0:0: -256,192,51111,1,0,0:0:0:0: -329,192,51190,1,0,0:0:0:0: -109,192,51190,1,0,0:0:0:0: -182,192,51269,1,0,0:0:0:0: -256,192,51348,1,0,0:0:0:0: -36,192,51348,1,0,0:0:0:0: -329,192,51427,1,0,0:0:0:0: -182,192,51506,128,0,51822:0:0:0:0: -402,192,51506,1,0,0:0:0:0: -36,192,51506,1,0,0:0:0:0: -475,192,51506,1,0,0:0:0:0: -329,192,51585,1,0,0:0:0:0: -256,192,51664,1,0,0:0:0:0: -475,192,51664,1,0,0:0:0:0: -402,192,51743,1,0,0:0:0:0: -36,192,51822,128,0,52137:0:0:0:0: -329,192,51822,1,0,0:0:0:0: -109,192,51822,1,0,0:0:0:0: -256,192,51901,1,0,0:0:0:0: -182,192,51980,1,0,0:0:0:0: -402,192,51980,1,0,0:0:0:0: -256,192,52058,1,0,0:0:0:0: -109,192,52137,128,0,52453:0:0:0:0: -329,192,52137,1,0,0:0:0:0: -475,192,52137,1,0,0:0:0:0: -256,192,52216,1,0,0:0:0:0: -475,192,52295,1,0,0:0:0:0: -182,192,52295,1,0,0:0:0:0: -402,192,52374,1,0,0:0:0:0: -182,192,52453,128,0,52769:0:0:0:0: -329,192,52453,1,0,0:0:0:0: -36,192,52453,1,0,0:0:0:0: -402,192,52532,1,0,0:0:0:0: -256,192,52611,1,0,0:0:0:0: -475,192,52611,1,0,0:0:0:0: -329,192,52690,1,0,0:0:0:0: -36,192,52769,128,0,53006:0:0:0:0: -402,192,52769,1,0,0:0:0:0: -475,192,52769,1,0,0:0:0:0: -256,192,52769,1,0,0:0:0:0: -109,192,52769,1,0,0:0:0:0: -182,192,52927,128,0,53006:0:0:0:0: -329,192,52927,1,0,0:0:0:0: -475,192,52927,1,0,0:0:0:0: -182,192,53085,128,0,53322:0:0:0:0: -329,192,53085,1,0,0:0:0:0: -402,192,53085,1,0,0:0:0:0: -475,192,53085,1,0,0:0:0:0: -36,192,53085,1,0,0:0:0:0: -36,192,53243,128,0,53322:0:0:0:0: -256,192,53243,1,0,0:0:0:0: -402,192,53243,1,0,0:0:0:0: -36,192,53401,128,0,53716:0:0:0:0: -182,192,53401,128,0,53716:0:0:0:0: -329,192,53401,1,0,0:0:0:0: -402,192,53401,1,0,0:0:0:0: -475,192,53401,1,0,0:0:0:0: -256,192,53558,128,0,53716:0:0:0:0: -402,192,53558,128,0,53716:0:0:0:0: -329,192,53558,1,0,0:0:0:0: -475,192,53558,1,0,0:0:0:0: -329,192,53874,128,0,54190:0:0:0:0: -475,192,53874,128,0,54190:0:0:0:0: -182,192,53874,1,0,0:0:0:0: -36,192,53874,1,0,0:0:0:0: -109,192,53874,1,0,0:0:0:0: -182,192,54190,1,0,0:0:0:0: -36,192,54190,1,0,0:0:0:0: -109,192,54190,1,0,0:0:0:0: -402,192,54348,128,0,54506:0:0:0:0: -182,192,54348,1,0,0:0:0:0: -36,192,54348,1,0,0:0:0:0: -475,192,54348,1,0,0:0:0:0: -256,192,54427,1,0,0:0:0:0: -329,192,54506,1,0,0:0:0:0: -109,192,54506,1,0,0:0:0:0: -256,192,54585,1,0,0:0:0:0: -109,192,54664,128,0,54822:0:0:0:0: -182,192,54664,1,0,0:0:0:0: -36,192,54664,1,0,0:0:0:0: -475,192,54664,1,0,0:0:0:0: -329,192,54743,1,0,0:0:0:0: -402,192,54822,128,0,55137:0:0:0:0: -256,192,54822,1,0,0:0:0:0: -36,192,54822,1,0,0:0:0:0: -182,192,54901,1,0,0:0:0:0: -109,192,54980,1,0,0:0:0:0: -36,192,54980,1,0,0:0:0:0: -329,192,54980,1,0,0:0:0:0: -256,192,55058,1,0,0:0:0:0: -109,192,55137,128,0,55295:0:0:0:0: -182,192,55137,1,0,0:0:0:0: -475,192,55137,1,0,0:0:0:0: -402,192,55216,1,0,0:0:0:0: -329,192,55295,128,0,55453:0:0:0:0: -256,192,55295,1,0,0:0:0:0: -36,192,55295,1,0,0:0:0:0: -475,192,55295,1,0,0:0:0:0: -182,192,55374,1,0,0:0:0:0: -109,192,55453,1,0,0:0:0:0: -402,192,55453,1,0,0:0:0:0: -329,192,55532,1,0,0:0:0:0: -182,192,55611,128,0,55769:0:0:0:0: -256,192,55611,1,0,0:0:0:0: -36,192,55611,1,0,0:0:0:0: -475,192,55611,1,0,0:0:0:0: -109,192,55690,1,0,0:0:0:0: -329,192,55769,128,0,56243:0:0:0:0: -475,192,55769,1,0,0:0:0:0: -36,192,55769,1,0,0:0:0:0: -256,192,55848,1,0,0:0:0:0: -36,192,55927,1,0,0:0:0:0: -182,192,55927,1,0,0:0:0:0: -475,192,55927,1,0,0:0:0:0: -256,192,56006,1,0,0:0:0:0: -402,192,56085,1,0,0:0:0:0: -109,192,56085,1,0,0:0:0:0: -182,192,56164,1,0,0:0:0:0: -256,192,56243,1,0,0:0:0:0: -36,192,56243,1,0,0:0:0:0: -475,192,56243,1,0,0:0:0:0: -402,192,56322,1,0,0:0:0:0: -329,192,56401,1,0,0:0:0:0: -109,192,56401,1,0,0:0:0:0: -256,192,56480,1,0,0:0:0:0: -182,192,56558,128,0,56716:0:0:0:0: -36,192,56558,1,0,0:0:0:0: -475,192,56558,1,0,0:0:0:0: -402,192,56558,1,0,0:0:0:0: -329,192,56637,1,0,0:0:0:0: -256,192,56716,1,0,0:0:0:0: -109,192,56716,1,0,0:0:0:0: -402,192,56795,1,0,0:0:0:0: -329,192,56874,128,0,57032:0:0:0:0: -182,192,56874,1,0,0:0:0:0: -36,192,56874,1,0,0:0:0:0: -475,192,56874,1,0,0:0:0:0: -256,192,56953,1,0,0:0:0:0: -109,192,57032,1,0,0:0:0:0: -402,192,57032,1,0,0:0:0:0: -256,192,57111,1,0,0:0:0:0: -182,192,57190,128,0,57348:0:0:0:0: -329,192,57190,1,0,0:0:0:0: -36,192,57190,1,0,0:0:0:0: -475,192,57190,1,0,0:0:0:0: -402,192,57269,1,0,0:0:0:0: -329,192,57348,128,0,57506:0:0:0:0: -256,192,57348,1,0,0:0:0:0: -36,192,57348,1,0,0:0:0:0: -109,192,57427,1,0,0:0:0:0: -182,192,57506,1,0,0:0:0:0: -36,192,57506,1,0,0:0:0:0: -475,192,57506,1,0,0:0:0:0: -402,192,57585,1,0,0:0:0:0: -182,192,57664,128,0,57822:0:0:0:0: -329,192,57664,1,0,0:0:0:0: -109,192,57664,1,0,0:0:0:0: -256,192,57743,1,0,0:0:0:0: -402,192,57822,128,0,57980:0:0:0:0: -329,192,57822,1,0,0:0:0:0: -36,192,57822,1,0,0:0:0:0: -475,192,57822,1,0,0:0:0:0: -182,192,57901,1,0,0:0:0:0: -109,192,57980,128,0,58137:0:0:0:0: -329,192,57980,1,0,0:0:0:0: -256,192,57980,1,0,0:0:0:0: -182,192,58058,1,0,0:0:0:0: -402,192,58137,128,0,58295:0:0:0:0: -256,192,58137,1,0,0:0:0:0: -36,192,58137,1,0,0:0:0:0: -475,192,58137,1,0,0:0:0:0: -329,192,58216,1,0,0:0:0:0: -109,192,58295,128,0,58769:0:0:0:0: -182,192,58295,1,0,0:0:0:0: -36,192,58295,1,0,0:0:0:0: -256,192,58374,1,0,0:0:0:0: -329,192,58453,1,0,0:0:0:0: -475,192,58453,1,0,0:0:0:0: -36,192,58453,1,0,0:0:0:0: -182,192,58532,1,0,0:0:0:0: -329,192,58611,1,0,0:0:0:0: -475,192,58611,1,0,0:0:0:0: -256,192,58690,1,0,0:0:0:0: -182,192,58769,1,0,0:0:0:0: -36,192,58769,1,0,0:0:0:0: -402,192,58769,1,0,0:0:0:0: -329,192,58848,1,0,0:0:0:0: -256,192,58927,1,0,0:0:0:0: -109,192,58927,1,0,0:0:0:0: -329,192,59006,1,0,0:0:0:0: -475,192,59085,128,0,59637:0:0:0:0: -256,192,59085,128,0,59243:0:0:0:0: -36,192,59085,1,0,0:0:0:0: -182,192,59085,1,0,0:0:0:0: -402,192,59085,1,0,0:0:0:0: -329,192,59164,128,0,59322:0:0:0:0: -402,192,59243,128,0,59401:0:0:0:0: -36,192,59243,1,0,0:0:0:0: -109,192,59243,1,0,0:0:0:0: -182,192,59322,128,0,59480:0:0:0:0: -256,192,59401,128,0,59558:0:0:0:0: -36,192,59401,128,0,59637:0:0:0:0: -329,192,59480,128,0,59637:0:0:0:0: -109,192,59558,128,0,59716:0:0:0:0: -182,192,59637,128,0,59795:0:0:0:0: -475,192,59716,128,0,60032:0:0:0:0: -256,192,59716,128,0,59874:0:0:0:0: -36,192,59716,128,0,60111:0:0:0:0: -329,192,59716,1,0,0:0:0:0: -402,192,59716,1,0,0:0:0:0: -109,192,59795,128,0,60032:0:0:0:0: -182,192,59874,128,0,59953:0:0:0:0: -329,192,59953,128,0,60032:0:0:0:0: -402,192,60032,128,0,60111:0:0:0:0: -256,192,60032,1,0,0:0:0:0: -329,192,60111,128,0,60190:0:0:0:0: -182,192,60111,1,0,0:0:0:0: -256,192,60190,128,0,60269:0:0:0:0: -109,192,60190,1,0,0:0:0:0: -182,192,60269,128,0,60348:0:0:0:0: -36,192,60269,1,0,0:0:0:0: -329,192,60348,128,0,60980:0:0:0:0: -475,192,60348,128,0,60980:0:0:0:0: -402,192,60348,1,0,0:0:0:0: -36,192,60664,128,0,61532:0:0:0:0: -182,192,60664,128,0,61532:0:0:0:0: -256,192,60980,128,0,61295:0:0:0:0: -402,192,60980,128,0,61295:0:0:0:0: -329,192,61295,128,0,61532:0:0:0:0: -475,192,61295,128,0,61532:0:0:0:0: -329,192,61611,128,0,61848:0:0:0:0: -475,192,61611,128,0,61848:0:0:0:0: -109,192,61611,128,0,61769:0:0:0:0: -256,192,61611,128,0,61769:0:0:0:0: -36,192,61611,1,0,0:0:0:0: -36,192,61769,128,0,61927:0:0:0:0: -182,192,61769,128,0,61927:0:0:0:0: -475,192,61927,128,0,62164:0:0:0:0: -329,192,61927,128,0,62164:0:0:0:0: -402,192,61927,1,0,0:0:0:0: -256,192,61927,1,0,0:0:0:0: -109,192,62006,128,0,62243:0:0:0:0: -182,192,62085,128,0,62243:0:0:0:0: -256,192,62164,128,0,62243:0:0:0:0: -329,192,62243,128,0,62322:0:0:0:0: -475,192,62243,128,0,62480:0:0:0:0: -36,192,62243,128,0,62401:0:0:0:0: -402,192,62243,1,0,0:0:0:0: -402,192,62401,128,0,62480:0:0:0:0: -109,192,62401,128,0,62558:0:0:0:0: -256,192,62401,128,0,62480:0:0:0:0: -36,192,62558,128,0,62795:0:0:0:0: -182,192,62558,128,0,62637:0:0:0:0: -402,192,62558,128,0,62795:0:0:0:0: -475,192,62558,1,0,0:0:0:0: -329,192,62637,128,0,62795:0:0:0:0: -256,192,62716,128,0,62795:0:0:0:0: -109,192,62716,128,0,62795:0:0:0:0: -182,192,62874,128,0,63111:0:0:0:0: -36,192,62874,128,0,63111:0:0:0:0: -256,192,62874,128,0,62953:0:0:0:0: -475,192,62874,128,0,62953:0:0:0:0: -109,192,62874,1,0,0:0:0:0: -475,192,63032,128,0,63111:0:0:0:0: -329,192,63032,128,0,63111:0:0:0:0: -402,192,63032,1,0,0:0:0:0: -256,192,63190,128,0,63348:0:0:0:0: -402,192,63190,128,0,63348:0:0:0:0: -36,192,63190,128,0,63269:0:0:0:0: -182,192,63190,128,0,63269:0:0:0:0: -475,192,63190,1,0,0:0:0:0: -329,192,63348,128,0,63506:0:0:0:0: -475,192,63348,128,0,63506:0:0:0:0: -109,192,63348,128,0,63427:0:0:0:0: -36,192,63506,128,0,63664:0:0:0:0: -402,192,63506,128,0,63822:0:0:0:0: -182,192,63506,1,0,0:0:0:0: -109,192,63585,128,0,63743:0:0:0:0: -256,192,63585,1,0,0:0:0:0: -182,192,63664,128,0,63822:0:0:0:0: -329,192,63664,1,0,0:0:0:0: -256,192,63743,128,0,63901:0:0:0:0: -475,192,63822,128,0,64058:0:0:0:0: -36,192,63822,128,0,63980:0:0:0:0: -329,192,63822,128,0,64058:0:0:0:0: -109,192,63901,128,0,63980:0:0:0:0: -182,192,63980,128,0,64058:0:0:0:0: -109,192,64058,128,0,64137:0:0:0:0: -182,192,64137,128,0,64374:0:0:0:0: -36,192,64137,128,0,64374:0:0:0:0: -402,192,64137,128,0,64295:0:0:0:0: -256,192,64137,128,0,64295:0:0:0:0: -475,192,64137,1,0,0:0:0:0: -475,192,64295,128,0,64453:0:0:0:0: -329,192,64295,128,0,64453:0:0:0:0: -36,192,64453,128,0,64690:0:0:0:0: -182,192,64453,128,0,64690:0:0:0:0: -109,192,64453,1,0,0:0:0:0: -256,192,64453,1,0,0:0:0:0: -402,192,64532,128,0,64769:0:0:0:0: -329,192,64611,128,0,64769:0:0:0:0: -256,192,64690,128,0,64769:0:0:0:0: -182,192,64769,128,0,64848:0:0:0:0: -36,192,64769,128,0,65006:0:0:0:0: -475,192,64769,128,0,64927:0:0:0:0: -109,192,64769,1,0,0:0:0:0: -109,192,64927,128,0,65006:0:0:0:0: -402,192,64927,128,0,65085:0:0:0:0: -256,192,64927,128,0,65006:0:0:0:0: -475,192,65085,128,0,65322:0:0:0:0: -329,192,65085,128,0,65164:0:0:0:0: -109,192,65085,128,0,65322:0:0:0:0: -36,192,65085,1,0,0:0:0:0: -182,192,65164,128,0,65322:0:0:0:0: -256,192,65243,128,0,65322:0:0:0:0: -402,192,65243,128,0,65322:0:0:0:0: -329,192,65401,128,0,65637:0:0:0:0: -475,192,65401,128,0,65637:0:0:0:0: -256,192,65401,128,0,65480:0:0:0:0: -36,192,65401,128,0,65480:0:0:0:0: -402,192,65401,1,0,0:0:0:0: -36,192,65558,128,0,65637:0:0:0:0: -182,192,65558,128,0,65637:0:0:0:0: -109,192,65558,1,0,0:0:0:0: -256,192,65716,128,0,65874:0:0:0:0: -402,192,65716,128,0,65874:0:0:0:0: -475,192,65716,1,0,0:0:0:0: -109,192,65716,128,0,65795:0:0:0:0: -36,192,65795,128,0,65953:0:0:0:0: -182,192,65795,128,0,65953:0:0:0:0: -329,192,65874,128,0,66032:0:0:0:0: -475,192,65874,128,0,66032:0:0:0:0: -109,192,65953,128,0,66111:0:0:0:0: -256,192,65953,128,0,66111:0:0:0:0: -182,192,66032,128,0,66190:0:0:0:0: -36,192,66032,128,0,66190:0:0:0:0: -475,192,66111,128,0,66190:0:0:0:0: -402,192,66111,128,0,66190:0:0:0:0: -329,192,66190,128,0,66269:0:0:0:0: -256,192,66190,128,0,66269:0:0:0:0: -182,192,66269,128,0,66348:0:0:0:0: -109,192,66269,128,0,66348:0:0:0:0: -36,192,66348,128,0,66585:0:0:0:0: -475,192,66348,128,0,66506:0:0:0:0: -329,192,66348,128,0,66427:0:0:0:0: -402,192,66348,1,0,0:0:0:0: -256,192,66427,128,0,66506:0:0:0:0: -182,192,66506,128,0,66585:0:0:0:0: -402,192,66506,1,0,0:0:0:0: -329,192,66585,1,0,0:0:0:0: -109,192,66585,128,0,66664:0:0:0:0: -182,192,66664,128,0,66901:0:0:0:0: -36,192,66664,128,0,66901:0:0:0:0: -402,192,66664,128,0,66822:0:0:0:0: -256,192,66664,128,0,66822:0:0:0:0: -475,192,66664,1,0,0:0:0:0: -475,192,66822,128,0,66980:0:0:0:0: -329,192,66822,128,0,66980:0:0:0:0: -36,192,66980,128,0,67216:0:0:0:0: -182,192,66980,128,0,67216:0:0:0:0: -109,192,66980,1,0,0:0:0:0: -256,192,66980,1,0,0:0:0:0: -402,192,67058,128,0,67295:0:0:0:0: -329,192,67137,128,0,67295:0:0:0:0: -256,192,67216,128,0,67295:0:0:0:0: -182,192,67295,128,0,67453:0:0:0:0: -36,192,67295,128,0,67532:0:0:0:0: -475,192,67295,128,0,67453:0:0:0:0: -109,192,67295,1,0,0:0:0:0: -109,192,67453,128,0,67532:0:0:0:0: -402,192,67453,128,0,67611:0:0:0:0: -256,192,67453,128,0,67611:0:0:0:0: -475,192,67611,128,0,67848:0:0:0:0: -329,192,67611,128,0,67690:0:0:0:0: -109,192,67611,128,0,67690:0:0:0:0: -36,192,67611,1,0,0:0:0:0: -182,192,67690,128,0,67769:0:0:0:0: -256,192,67769,128,0,67848:0:0:0:0: -402,192,67769,128,0,67848:0:0:0:0: -36,192,67769,128,0,68006:0:0:0:0: -109,192,67848,128,0,68006:0:0:0:0: -329,192,67927,128,0,68164:0:0:0:0: -475,192,67927,128,0,68164:0:0:0:0: -256,192,67927,128,0,68006:0:0:0:0: -402,192,67927,1,0,0:0:0:0: -36,192,68085,128,0,68164:0:0:0:0: -182,192,68085,128,0,68164:0:0:0:0: -109,192,68085,1,0,0:0:0:0: -256,192,68243,128,0,68480:0:0:0:0: -109,192,68243,128,0,68480:0:0:0:0: -475,192,68243,128,0,68322:0:0:0:0: -329,192,68243,128,0,68322:0:0:0:0: -36,192,68243,1,0,0:0:0:0: -182,192,68401,128,0,68637:0:0:0:0: -36,192,68401,128,0,68637:0:0:0:0: -402,192,68401,128,0,68480:0:0:0:0: -475,192,68558,128,0,68716:0:0:0:0: -109,192,68558,128,0,68874:0:0:0:0: -329,192,68558,1,0,0:0:0:0: -402,192,68637,128,0,68795:0:0:0:0: -256,192,68637,1,0,0:0:0:0: -329,192,68716,128,0,68874:0:0:0:0: -182,192,68716,1,0,0:0:0:0: -256,192,68795,128,0,68953:0:0:0:0: -36,192,68874,128,0,69111:0:0:0:0: -475,192,68874,128,0,69032:0:0:0:0: -182,192,68874,128,0,69111:0:0:0:0: -402,192,68953,128,0,69032:0:0:0:0: -329,192,69032,128,0,69111:0:0:0:0: -402,192,69111,128,0,69190:0:0:0:0: -329,192,69190,128,0,69427:0:0:0:0: -475,192,69190,128,0,69427:0:0:0:0: -109,192,69190,128,0,69348:0:0:0:0: -256,192,69190,128,0,69348:0:0:0:0: -36,192,69190,1,0,0:0:0:0: -36,192,69348,128,0,69506:0:0:0:0: -182,192,69348,128,0,69506:0:0:0:0: -475,192,69506,128,0,69743:0:0:0:0: -329,192,69506,128,0,69743:0:0:0:0: -402,192,69506,1,0,0:0:0:0: -256,192,69506,1,0,0:0:0:0: -109,192,69585,128,0,69822:0:0:0:0: -182,192,69664,128,0,69822:0:0:0:0: -256,192,69743,128,0,69822:0:0:0:0: -329,192,69822,128,0,69901:0:0:0:0: -475,192,69822,128,0,70058:0:0:0:0: -36,192,69822,128,0,70137:0:0:0:0: -402,192,69822,1,0,0:0:0:0: -402,192,69980,128,0,70058:0:0:0:0: -182,192,69980,128,0,70137:0:0:0:0: -256,192,69980,128,0,70058:0:0:0:0: -475,192,70137,128,0,70374:0:0:0:0: -329,192,70137,128,0,70216:0:0:0:0: -109,192,70137,128,0,70216:0:0:0:0: -182,192,70216,128,0,70295:0:0:0:0: -256,192,70295,128,0,70374:0:0:0:0: -402,192,70295,128,0,70374:0:0:0:0: -36,192,70295,128,0,70532:0:0:0:0: -109,192,70374,128,0,70532:0:0:0:0: -256,192,70453,128,0,70532:0:0:0:0: -329,192,70453,128,0,70690:0:0:0:0: -402,192,70453,1,0,0:0:0:0: -475,192,70453,128,0,70690:0:0:0:0: -36,192,70611,128,0,70690:0:0:0:0: -109,192,70611,1,0,0:0:0:0: -182,192,70611,128,0,70690:0:0:0:0: -329,192,70769,128,0,71006:0:0:0:0: -475,192,70769,128,0,71006:0:0:0:0: -109,192,70769,128,0,70848:0:0:0:0: -256,192,70769,128,0,70848:0:0:0:0: -36,192,70769,128,0,71085:0:0:0:0: -182,192,70848,128,0,70927:0:0:0:0: -402,192,70927,128,0,71006:0:0:0:0: -256,192,70927,128,0,71085:0:0:0:0: -182,192,71006,128,0,71164:0:0:0:0: -475,192,71085,128,0,71322:0:0:0:0: -109,192,71085,128,0,71243:0:0:0:0: -329,192,71085,128,0,71322:0:0:0:0: -402,192,71085,1,0,0:0:0:0: -256,192,71164,128,0,71243:0:0:0:0: -36,192,71243,128,0,71401:0:0:0:0: -182,192,71243,128,0,71401:0:0:0:0: -402,192,71322,128,0,71480:0:0:0:0: -256,192,71322,128,0,71401:0:0:0:0: -109,192,71401,128,0,71558:0:0:0:0: -329,192,71401,128,0,71558:0:0:0:0: -475,192,71401,128,0,71637:0:0:0:0: -36,192,71480,128,0,71637:0:0:0:0: -256,192,71480,128,0,71637:0:0:0:0: -402,192,71558,128,0,71637:0:0:0:0: -182,192,71558,128,0,71716:0:0:0:0: -329,192,71637,128,0,71716:0:0:0:0: -36,192,71716,1,0,0:0:0:0: -402,192,71716,1,0,0:0:0:0: -475,192,71716,1,0,0:0:0:0: -109,192,71716,128,0,72032:0:0:0:0: -182,192,72032,128,0,72348:0:0:0:0: -256,192,72348,128,0,72664:0:0:0:0: -329,192,72664,128,0,72980:0:0:0:0: -36,192,72980,128,0,73453:0:0:0:0: -109,192,72980,128,0,73453:0:0:0:0: -475,192,72980,1,0,0:0:0:0: -256,192,72980,1,0,0:0:0:0: -329,192,73197,128,0,73690:0:0:0:0: -402,192,73197,1,0,0:0:0:0: -182,192,73197,1,0,0:0:0:0: -36,192,73611,128,0,73927:0:0:0:0: -182,192,73611,128,0,73927:0:0:0:0: -109,192,73611,1,0,0:0:0:0: -256,192,73611,1,0,0:0:0:0: -329,192,73769,128,0,73927:0:0:0:0: -475,192,73769,128,0,73927:0:0:0:0: -109,192,73927,128,0,74137:0:0:0:0: -256,192,73927,128,0,74137:0:0:0:0: -329,192,74137,1,0,0:0:0:0: -475,192,74137,1,0,0:0:0:0: -182,192,74137,128,0,74558:0:0:0:0: -36,192,74137,128,0,74558:0:0:0:0: -475,192,74401,128,0,74769:0:0:0:0: -329,192,74558,1,0,0:0:0:0: -109,192,74558,1,0,0:0:0:0: -109,192,74699,128,0,75085:0:0:0:0: -256,192,74769,128,0,75085:0:0:0:0: -402,192,74874,128,0,75085:0:0:0:0: -36,192,75085,128,0,75427:0:0:0:0: -475,192,75085,1,0,0:0:0:0: -329,192,75085,1,0,0:0:0:0: -182,192,75190,128,0,75427:0:0:0:0: -329,192,75269,128,0,75427:0:0:0:0: -475,192,75348,128,0,75980:0:0:0:0: -256,192,75427,1,0,0:0:0:0: -402,192,75427,1,0,0:0:0:0: -182,192,75506,128,0,75822:0:0:0:0: -109,192,75506,128,0,75822:0:0:0:0: -36,192,75506,1,0,0:0:0:0: -329,192,75506,1,0,0:0:0:0: -329,192,75822,1,0,0:0:0:0: -36,192,75822,1,0,0:0:0:0: -329,192,75980,128,0,76769:0:0:0:0: -36,192,75980,1,0,0:0:0:0: -402,192,75980,1,0,0:0:0:0: -182,192,75980,128,0,76769:0:0:0:0: -475,192,76348,1,0,0:0:0:0: -109,192,76348,1,0,0:0:0:0: -36,192,76348,1,0,0:0:0:0: -402,192,76453,1,0,0:0:0:0: -256,192,76558,1,0,0:0:0:0: -109,192,76664,1,0,0:0:0:0: -36,192,76769,1,0,0:0:0:0: -402,192,76769,1,0,0:0:0:0: -475,192,76769,1,0,0:0:0:0: -256,192,76769,1,0,0:0:0:0: -109,192,76927,1,0,0:0:0:0: -182,192,76927,1,0,0:0:0:0: -329,192,76927,1,0,0:0:0:0: -402,192,76927,1,0,0:0:0:0: -182,192,77243,1,0,0:0:0:0: -109,192,77243,1,0,0:0:0:0: -402,192,77243,1,0,0:0:0:0: -329,192,77243,1,0,0:0:0:0: -182,192,77558,1,0,0:0:0:0: -36,192,77558,1,0,0:0:0:0: -475,192,77558,1,0,0:0:0:0: -329,192,77558,1,0,0:0:0:0: -256,192,77558,1,0,0:0:0:0: -36,192,77874,1,0,0:0:0:0: -329,192,77874,1,0,0:0:0:0: -475,192,77874,1,0,0:0:0:0: -109,192,77927,1,0,0:0:0:0: -182,192,77980,1,0,0:0:0:0: -36,192,78032,128,0,79137:0:0:0:0: -256,192,78032,1,0,0:0:0:0: -402,192,78032,1,0,0:0:0:0: -475,192,78032,1,0,0:0:0:0: -329,192,78032,1,0,0:0:0:0: -402,192,78190,128,0,78348:0:0:0:0: -329,192,78190,1,0,0:0:0:0: -475,192,78190,1,0,0:0:0:0: -256,192,78348,128,0,78506:0:0:0:0: -182,192,78348,1,0,0:0:0:0: -109,192,78348,1,0,0:0:0:0: -329,192,78348,1,0,0:0:0:0: -109,192,78506,128,0,78664:0:0:0:0: -402,192,78506,1,0,0:0:0:0: -475,192,78506,1,0,0:0:0:0: -475,192,78664,128,0,78822:0:0:0:0: -182,192,78664,1,0,0:0:0:0: -329,192,78664,1,0,0:0:0:0: -256,192,78664,1,0,0:0:0:0: -329,192,78822,128,0,78980:0:0:0:0: -109,192,78822,1,0,0:0:0:0: -256,192,78822,1,0,0:0:0:0: -182,192,78980,128,0,79137:0:0:0:0: -109,192,78980,1,0,0:0:0:0: -256,192,78980,1,0,0:0:0:0: -475,192,78980,1,0,0:0:0:0: -256,192,79137,128,0,79295:0:0:0:0: -402,192,79137,128,0,79295:0:0:0:0: -329,192,79137,1,0,0:0:0:0: -475,192,79137,1,0,0:0:0:0: -182,192,79295,1,0,0:0:0:0: -36,192,79295,1,0,0:0:0:0: -329,192,79295,1,0,0:0:0:0: -475,192,79295,1,0,0:0:0:0: -36,192,79453,128,0,79611:0:0:0:0: -182,192,79453,128,0,79611:0:0:0:0: -329,192,79453,1,0,0:0:0:0: -475,192,79453,1,0,0:0:0:0: -256,192,79611,1,0,0:0:0:0: -402,192,79611,1,0,0:0:0:0: -109,192,79611,1,0,0:0:0:0: -475,192,79611,1,0,0:0:0:0: -329,192,79769,128,0,79927:0:0:0:0: -475,192,79769,128,0,79927:0:0:0:0: -182,192,79769,1,0,0:0:0:0: -36,192,79769,1,0,0:0:0:0: -109,192,79927,1,0,0:0:0:0: -256,192,79927,1,0,0:0:0:0: -402,192,79927,1,0,0:0:0:0: -36,192,79927,1,0,0:0:0:0: -109,192,80085,128,0,80243:0:0:0:0: -256,192,80085,128,0,80243:0:0:0:0: -329,192,80085,1,0,0:0:0:0: -475,192,80085,1,0,0:0:0:0: -402,192,80243,1,0,0:0:0:0: -182,192,80243,1,0,0:0:0:0: -36,192,80243,1,0,0:0:0:0: -475,192,80243,1,0,0:0:0:0: -329,192,80322,1,0,0:0:0:0: -256,192,80322,1,0,0:0:0:0: -182,192,80401,1,0,0:0:0:0: -36,192,80401,1,0,0:0:0:0: -475,192,80401,1,0,0:0:0:0: -329,192,80480,1,0,0:0:0:0: -402,192,80480,1,0,0:0:0:0: -256,192,80558,1,0,0:0:0:0: -109,192,80558,1,0,0:0:0:0: -36,192,80558,1,0,0:0:0:0: -475,192,80558,128,0,81822:0:0:0:0: -182,192,80558,1,0,0:0:0:0: -329,192,80716,128,0,80874:0:0:0:0: -36,192,80716,1,0,0:0:0:0: -182,192,80716,1,0,0:0:0:0: -182,192,80874,128,0,81032:0:0:0:0: -36,192,80874,1,0,0:0:0:0: -256,192,80874,1,0,0:0:0:0: -402,192,80874,1,0,0:0:0:0: -36,192,81032,128,0,81190:0:0:0:0: -109,192,81032,1,0,0:0:0:0: -329,192,81032,1,0,0:0:0:0: -402,192,81190,128,0,81348:0:0:0:0: -256,192,81190,1,0,0:0:0:0: -109,192,81190,1,0,0:0:0:0: -329,192,81190,1,0,0:0:0:0: -109,192,81348,128,0,81506:0:0:0:0: -182,192,81348,1,0,0:0:0:0: -36,192,81348,1,0,0:0:0:0: -256,192,81506,128,0,81664:0:0:0:0: -36,192,81506,1,0,0:0:0:0: -329,192,81506,1,0,0:0:0:0: -402,192,81506,1,0,0:0:0:0: -402,192,81664,128,0,81822:0:0:0:0: -182,192,81664,1,0,0:0:0:0: -36,192,81664,1,0,0:0:0:0: -36,192,81822,128,0,83006:0:0:0:0: -109,192,81822,1,0,0:0:0:0: -256,192,81822,1,0,0:0:0:0: -329,192,81822,1,0,0:0:0:0: -182,192,81980,128,0,82137:0:0:0:0: -329,192,81980,1,0,0:0:0:0: -475,192,81980,1,0,0:0:0:0: -329,192,82137,128,0,82295:0:0:0:0: -475,192,82137,1,0,0:0:0:0: -256,192,82137,1,0,0:0:0:0: -109,192,82137,1,0,0:0:0:0: -475,192,82295,128,0,82453:0:0:0:0: -109,192,82295,1,0,0:0:0:0: -256,192,82295,1,0,0:0:0:0: -402,192,82453,128,0,82611:0:0:0:0: -182,192,82453,128,0,83006:0:0:0:0: -329,192,82453,1,0,0:0:0:0: -109,192,82453,1,0,0:0:0:0: -329,192,82611,128,0,82769:0:0:0:0: -475,192,82611,1,0,0:0:0:0: -256,192,82611,1,0,0:0:0:0: -109,192,82769,128,0,83006:0:0:0:0: -256,192,82769,128,0,83006:0:0:0:0: -402,192,82769,1,0,0:0:0:0: -475,192,82769,1,0,0:0:0:0: -402,192,82927,128,0,83006:0:0:0:0: -475,192,82927,128,0,83006:0:0:0:0: -36,192,83085,128,0,83322:0:0:0:0: -329,192,83085,1,0,0:0:0:0: -475,192,83085,1,0,0:0:0:0: -109,192,83085,1,0,0:0:0:0: -182,192,83085,1,0,0:0:0:0: -182,192,83243,128,0,83558:0:0:0:0: -402,192,83243,1,0,0:0:0:0: -256,192,83243,1,0,0:0:0:0: -36,192,83401,128,0,83558:0:0:0:0: -329,192,83401,1,0,0:0:0:0: -475,192,83401,1,0,0:0:0:0: -475,192,83558,128,0,83795:0:0:0:0: -402,192,83558,1,0,0:0:0:0: -109,192,83558,1,0,0:0:0:0: -256,192,83558,1,0,0:0:0:0: -329,192,83558,1,0,0:0:0:0: -329,192,83716,128,0,84032:0:0:0:0: -182,192,83716,1,0,0:0:0:0: -36,192,83716,1,0,0:0:0:0: -475,192,83874,128,0,84032:0:0:0:0: -256,192,83874,1,0,0:0:0:0: -109,192,83874,1,0,0:0:0:0: -109,192,84032,128,0,84269:0:0:0:0: -182,192,84032,1,0,0:0:0:0: -36,192,84032,1,0,0:0:0:0: -402,192,84032,1,0,0:0:0:0: -256,192,84032,1,0,0:0:0:0: -256,192,84190,128,0,84506:0:0:0:0: -329,192,84190,1,0,0:0:0:0: -475,192,84190,1,0,0:0:0:0: -109,192,84348,128,0,84506:0:0:0:0: -182,192,84348,1,0,0:0:0:0: -402,192,84348,1,0,0:0:0:0: -329,192,84506,128,0,84822:0:0:0:0: -475,192,84506,128,0,84822:0:0:0:0: -182,192,84506,1,0,0:0:0:0: -36,192,84506,1,0,0:0:0:0: -402,192,84506,1,0,0:0:0:0: -36,192,84664,128,0,85137:0:0:0:0: -109,192,84664,1,0,0:0:0:0: -256,192,84664,1,0,0:0:0:0: -182,192,84822,128,0,85137:0:0:0:0: -256,192,84822,1,0,0:0:0:0: -402,192,84822,1,0,0:0:0:0: -475,192,84980,128,0,85137:0:0:0:0: -329,192,84980,1,0,0:0:0:0: -109,192,84980,1,0,0:0:0:0: -329,192,85137,128,0,85295:0:0:0:0: -256,192,85137,1,0,0:0:0:0: -402,192,85137,1,0,0:0:0:0: -182,192,85295,128,0,85453:0:0:0:0: -109,192,85295,1,0,0:0:0:0: -475,192,85295,1,0,0:0:0:0: -36,192,85453,128,0,85611:0:0:0:0: -402,192,85453,1,0,0:0:0:0: -256,192,85453,1,0,0:0:0:0: -475,192,85611,128,0,85848:0:0:0:0: -402,192,85611,1,0,0:0:0:0: -329,192,85611,1,0,0:0:0:0: -182,192,85611,1,0,0:0:0:0: -109,192,85611,1,0,0:0:0:0: -329,192,85769,128,0,86085:0:0:0:0: -36,192,85769,128,0,85848:0:0:0:0: -182,192,85769,1,0,0:0:0:0: -402,192,85769,1,0,0:0:0:0: -475,192,85927,128,0,86085:0:0:0:0: -256,192,85927,1,0,0:0:0:0: -109,192,85927,128,0,86006:0:0:0:0: -402,192,85927,1,0,0:0:0:0: -36,192,86085,128,0,86322:0:0:0:0: -109,192,86085,1,0,0:0:0:0: -402,192,86085,1,0,0:0:0:0: -182,192,86085,1,0,0:0:0:0: -256,192,86085,1,0,0:0:0:0: -182,192,86243,128,0,86558:0:0:0:0: -329,192,86243,1,0,0:0:0:0: -475,192,86243,128,0,86322:0:0:0:0: -109,192,86243,1,0,0:0:0:0: -36,192,86401,128,0,86558:0:0:0:0: -256,192,86401,1,0,0:0:0:0: -402,192,86401,128,0,86480:0:0:0:0: -109,192,86401,1,0,0:0:0:0: -402,192,86558,128,0,86795:0:0:0:0: -329,192,86558,1,0,0:0:0:0: -475,192,86558,1,0,0:0:0:0: -256,192,86558,1,0,0:0:0:0: -109,192,86558,1,0,0:0:0:0: -256,192,86716,128,0,87032:0:0:0:0: -182,192,86716,1,0,0:0:0:0: -36,192,86716,128,0,86795:0:0:0:0: -475,192,86716,1,0,0:0:0:0: -402,192,86874,128,0,87032:0:0:0:0: -329,192,86874,1,0,0:0:0:0: -475,192,86874,1,0,0:0:0:0: -109,192,86874,128,0,86953:0:0:0:0: -182,192,87032,128,0,87348:0:0:0:0: -36,192,87032,128,0,87348:0:0:0:0: -475,192,87032,1,0,0:0:0:0: -109,192,87032,1,0,0:0:0:0: -329,192,87032,1,0,0:0:0:0: -475,192,87190,128,0,87664:0:0:0:0: -256,192,87190,1,0,0:0:0:0: -402,192,87190,128,0,87269:0:0:0:0: -109,192,87190,1,0,0:0:0:0: -329,192,87348,128,0,87664:0:0:0:0: -109,192,87348,1,0,0:0:0:0: -256,192,87348,128,0,87427:0:0:0:0: -36,192,87506,128,0,88058:0:0:0:0: -109,192,87506,128,0,88058:0:0:0:0: -182,192,87506,1,0,0:0:0:0: -256,192,87664,128,0,88058:0:0:0:0: -402,192,87664,128,0,88058:0:0:0:0: -182,192,87822,128,0,88058:0:0:0:0: -329,192,87980,128,0,88058:0:0:0:0: -475,192,87980,128,0,88058:0:0:0:0: -182,192,88137,1,0,0:0:0:0: -36,192,88137,1,0,0:0:0:0: -329,192,88137,1,0,0:0:0:0: -475,192,88137,1,0,0:0:0:0: -329,192,88295,1,0,0:0:0:0: -182,192,88453,1,0,0:0:0:0: -329,192,88611,1,0,0:0:0:0: -182,192,88769,1,0,0:0:0:0: -36,192,88769,1,0,0:0:0:0: -329,192,88769,1,0,0:0:0:0: -475,192,88769,1,0,0:0:0:0: -329,192,88927,1,0,0:0:0:0: -182,192,89085,1,0,0:0:0:0: -36,192,89085,1,0,0:0:0:0: -256,192,89085,128,0,89637:0:0:0:0: -475,192,89085,1,0,0:0:0:0: -329,192,89243,1,0,0:0:0:0: -182,192,89401,1,0,0:0:0:0: -329,192,89558,1,0,0:0:0:0: -256,192,89716,128,0,90664:0:0:0:0: -36,192,89716,1,0,0:0:0:0: -329,192,89716,1,0,0:0:0:0: -475,192,89716,1,0,0:0:0:0: -182,192,89874,1,0,0:0:0:0: -329,192,90032,1,0,0:0:0:0: -182,192,90032,1,0,0:0:0:0: -36,192,90032,1,0,0:0:0:0: -475,192,90032,1,0,0:0:0:0: -182,192,90190,1,0,0:0:0:0: -402,192,90348,1,0,0:0:0:0: -329,192,90427,1,0,0:0:0:0: -182,192,90506,1,0,0:0:0:0: -109,192,90585,1,0,0:0:0:0: -182,192,90664,1,0,0:0:0:0: -36,192,90664,1,0,0:0:0:0: -329,192,90664,1,0,0:0:0:0: -475,192,90664,128,0,90822:0:0:0:0: -402,192,90664,1,0,0:0:0:0: -109,192,90743,1,0,0:0:0:0: -182,192,90822,1,0,0:0:0:0: -36,192,90822,1,0,0:0:0:0: -329,192,90822,128,0,90980:0:0:0:0: -256,192,90901,1,0,0:0:0:0: -182,192,90980,128,0,91137:0:0:0:0: -36,192,90980,1,0,0:0:0:0: -475,192,90980,1,0,0:0:0:0: -402,192,90980,1,0,0:0:0:0: -256,192,91058,1,0,0:0:0:0: -329,192,91137,128,0,91295:0:0:0:0: -109,192,91137,1,0,0:0:0:0: -36,192,91137,1,0,0:0:0:0: -182,192,91216,1,0,0:0:0:0: -36,192,91295,128,0,91927:0:0:0:0: -475,192,91295,128,0,91453:0:0:0:0: -109,192,91295,1,0,0:0:0:0: -256,192,91295,1,0,0:0:0:0: -402,192,91295,1,0,0:0:0:0: -182,192,91374,1,0,0:0:0:0: -256,192,91453,128,0,91611:0:0:0:0: -329,192,91453,1,0,0:0:0:0: -402,192,91453,1,0,0:0:0:0: -182,192,91532,1,0,0:0:0:0: -109,192,91611,1,0,0:0:0:0: -329,192,91611,1,0,0:0:0:0: -475,192,91611,1,0,0:0:0:0: -402,192,91611,128,0,91769:0:0:0:0: -256,192,91690,1,0,0:0:0:0: -182,192,91769,128,0,91927:0:0:0:0: -109,192,91769,1,0,0:0:0:0: -475,192,91769,1,0,0:0:0:0: -329,192,91848,1,0,0:0:0:0: -475,192,91927,128,0,92795:0:0:0:0: -256,192,91927,128,0,92045:0:0:0:0: -109,192,91927,1,0,0:0:0:0: -402,192,91927,1,0,0:0:0:0: -329,192,92006,128,0,92124:0:0:0:0: -402,192,92085,128,0,92203:0:0:0:0: -182,192,92085,128,0,92203:0:0:0:0: -36,192,92085,1,0,0:0:0:0: -256,192,92164,128,0,92282:0:0:0:0: -329,192,92243,128,0,92361:0:0:0:0: -109,192,92243,128,0,92361:0:0:0:0: -36,192,92243,1,0,0:0:0:0: -182,192,92322,128,0,92440:0:0:0:0: -36,192,92401,128,0,92480:0:0:0:0: -256,192,92401,128,0,92519:0:0:0:0: -402,192,92401,1,0,0:0:0:0: -109,192,92480,128,0,92558:0:0:0:0: -36,192,92558,128,0,92795:0:0:0:0: -402,192,92558,128,0,92795:0:0:0:0: -182,192,92558,128,0,92637:0:0:0:0: -329,192,92637,128,0,92795:0:0:0:0: -109,192,92637,128,0,92716:0:0:0:0: -256,192,92716,128,0,92795:0:0:0:0: -182,192,92795,1,0,0:0:0:0: -475,192,92874,1,0,0:0:0:0: -109,192,92874,1,0,0:0:0:0: -256,192,92874,1,0,0:0:0:0: -402,192,92927,1,0,0:0:0:0: -329,192,92980,1,0,0:0:0:0: -256,192,93032,1,0,0:0:0:0: -182,192,93085,1,0,0:0:0:0: -109,192,93137,1,0,0:0:0:0: -329,192,93190,128,0,93664:0:0:0:0: -36,192,93190,128,0,93269:0:0:0:0: -256,192,93190,1,0,0:0:0:0: -475,192,93190,1,0,0:0:0:0: -182,192,93269,128,0,93427:0:0:0:0: -402,192,93269,1,0,0:0:0:0: -36,192,93348,128,0,93585:0:0:0:0: -109,192,93348,1,0,0:0:0:0: -475,192,93348,1,0,0:0:0:0: -256,192,93427,128,0,93506:0:0:0:0: -402,192,93427,1,0,0:0:0:0: -109,192,93506,128,0,93585:0:0:0:0: -475,192,93506,1,0,0:0:0:0: -256,192,93585,128,0,93664:0:0:0:0: -182,192,93585,1,0,0:0:0:0: -402,192,93664,128,0,93980:0:0:0:0: -36,192,93664,128,0,93822:0:0:0:0: -475,192,93664,1,0,0:0:0:0: -182,192,93743,128,0,93822:0:0:0:0: -256,192,93743,1,0,0:0:0:0: -329,192,93822,128,0,93980:0:0:0:0: -475,192,93822,1,0,0:0:0:0: -109,192,93901,128,0,93980:0:0:0:0: -256,192,93901,1,0,0:0:0:0: -475,192,93980,128,0,94295:0:0:0:0: -36,192,93980,128,0,94216:0:0:0:0: -182,192,93980,1,0,0:0:0:0: -109,192,94058,128,0,94137:0:0:0:0: -256,192,94058,1,0,0:0:0:0: -182,192,94137,128,0,94295:0:0:0:0: -402,192,94137,1,0,0:0:0:0: -329,192,94137,1,0,0:0:0:0: -256,192,94216,128,0,94295:0:0:0:0: -402,192,94295,128,0,94769:0:0:0:0: -36,192,94295,128,0,94374:0:0:0:0: -329,192,94295,1,0,0:0:0:0: -182,192,94374,128,0,94453:0:0:0:0: -256,192,94374,1,0,0:0:0:0: -475,192,94453,1,0,0:0:0:0: -109,192,94453,1,0,0:0:0:0: -36,192,94453,128,0,94690:0:0:0:0: -329,192,94532,1,0,0:0:0:0: -182,192,94532,128,0,94690:0:0:0:0: -256,192,94611,1,0,0:0:0:0: -475,192,94611,128,0,94690:0:0:0:0: -109,192,94611,1,0,0:0:0:0: -329,192,94690,128,0,94769:0:0:0:0: -36,192,94769,128,0,95085:0:0:0:0: -182,192,94769,128,0,94927:0:0:0:0: -256,192,94769,128,0,94848:0:0:0:0: -475,192,94769,1,0,0:0:0:0: -402,192,94848,128,0,94927:0:0:0:0: -109,192,94927,128,0,95006:0:0:0:0: -329,192,94927,128,0,95006:0:0:0:0: -256,192,94927,1,0,0:0:0:0: -402,192,95006,128,0,95085:0:0:0:0: -475,192,95085,128,0,95243:0:0:0:0: -256,192,95085,128,0,95164:0:0:0:0: -109,192,95085,1,0,0:0:0:0: -182,192,95085,1,0,0:0:0:0: -329,192,95164,128,0,95243:0:0:0:0: -402,192,95164,1,0,0:0:0:0: -36,192,95243,128,0,95558:0:0:0:0: -109,192,95243,128,0,95322:0:0:0:0: -182,192,95243,1,0,0:0:0:0: -402,192,95322,128,0,95401:0:0:0:0: -329,192,95401,128,0,95480:0:0:0:0: -256,192,95401,1,0,0:0:0:0: -475,192,95401,1,0,0:0:0:0: -109,192,95401,1,0,0:0:0:0: -402,192,95480,128,0,95558:0:0:0:0: -182,192,95480,1,0,0:0:0:0: -475,192,95558,128,0,96032:0:0:0:0: -256,192,95558,128,0,95637:0:0:0:0: -109,192,95558,1,0,0:0:0:0: -329,192,95637,128,0,95716:0:0:0:0: -182,192,95716,1,0,0:0:0:0: -109,192,95716,128,0,95795:0:0:0:0: -402,192,95716,1,0,0:0:0:0: -36,192,95716,128,0,95874:0:0:0:0: -256,192,95795,1,0,0:0:0:0: -182,192,95874,128,0,95953:0:0:0:0: -329,192,95874,1,0,0:0:0:0: -402,192,95874,1,0,0:0:0:0: -109,192,95953,128,0,96032:0:0:0:0: -256,192,95953,1,0,0:0:0:0: -329,192,96032,128,0,96190:0:0:0:0: -36,192,96032,1,0,0:0:0:0: -182,192,96032,1,0,0:0:0:0: -402,192,96111,128,0,96269:0:0:0:0: -256,192,96111,1,0,0:0:0:0: -475,192,96190,128,0,96506:0:0:0:0: -36,192,96190,128,0,96269:0:0:0:0: -182,192,96190,1,0,0:0:0:0: -109,192,96269,128,0,96348:0:0:0:0: -329,192,96269,1,0,0:0:0:0: -256,192,96348,128,0,96506:0:0:0:0: -402,192,96348,1,0,0:0:0:0: -36,192,96348,1,0,0:0:0:0: -182,192,96427,128,0,96506:0:0:0:0: -329,192,96506,128,0,96822:0:0:0:0: -36,192,96506,128,0,96664:0:0:0:0: -109,192,96506,128,0,96585:0:0:0:0: -402,192,96506,1,0,0:0:0:0: -256,192,96585,1,0,0:0:0:0: -182,192,96664,128,0,96822:0:0:0:0: -402,192,96664,1,0,0:0:0:0: -475,192,96664,1,0,0:0:0:0: -109,192,96743,128,0,96822:0:0:0:0: -256,192,96743,1,0,0:0:0:0: -475,192,96822,128,0,97295:0:0:0:0: -36,192,96822,128,0,96901:0:0:0:0: -402,192,96822,1,0,0:0:0:0: -256,192,96901,128,0,96980:0:0:0:0: -182,192,96901,1,0,0:0:0:0: -36,192,96980,128,0,97137:0:0:0:0: -109,192,96980,1,0,0:0:0:0: -402,192,96980,1,0,0:0:0:0: -329,192,97058,128,0,97137:0:0:0:0: -256,192,97058,1,0,0:0:0:0: -402,192,97137,1,0,0:0:0:0: -182,192,97137,128,0,97216:0:0:0:0: -36,192,97216,128,0,97295:0:0:0:0: -329,192,97216,1,0,0:0:0:0: -256,192,97295,128,0,97374:0:0:0:0: -182,192,97295,1,0,0:0:0:0: -402,192,97295,128,0,97611:0:0:0:0: -109,192,97374,128,0,97453:0:0:0:0: -329,192,97374,1,0,0:0:0:0: -256,192,97453,128,0,97532:0:0:0:0: -36,192,97453,1,0,0:0:0:0: -182,192,97532,128,0,97611:0:0:0:0: -36,192,97611,128,0,97769:0:0:0:0: -329,192,97611,128,0,97690:0:0:0:0: -475,192,97611,128,0,97769:0:0:0:0: -109,192,97611,1,0,0:0:0:0: -182,192,97690,1,0,0:0:0:0: -109,192,97769,128,0,97927:0:0:0:0: -329,192,97769,1,0,0:0:0:0: -256,192,97769,128,0,97927:0:0:0:0: -402,192,97848,128,0,97927:0:0:0:0: -475,192,97927,128,0,98006:0:0:0:0: -182,192,97927,1,0,0:0:0:0: -36,192,97927,128,0,98006:0:0:0:0: -329,192,98006,128,0,98085:0:0:0:0: -109,192,98006,128,0,98085:0:0:0:0: -256,192,98085,128,0,98164:0:0:0:0: -36,192,98085,128,0,98243:0:0:0:0: -182,192,98085,128,0,98243:0:0:0:0: -475,192,98085,1,0,0:0:0:0: -402,192,98164,128,0,98243:0:0:0:0: -109,192,98243,128,0,98558:0:0:0:0: -475,192,98243,128,0,98480:0:0:0:0: -256,192,98243,1,0,0:0:0:0: -329,192,98322,128,0,98401:0:0:0:0: -182,192,98322,1,0,0:0:0:0: -402,192,98401,128,0,98558:0:0:0:0: -36,192,98401,1,0,0:0:0:0: -256,192,98480,128,0,98558:0:0:0:0: -329,192,98480,1,0,0:0:0:0: -182,192,98558,128,0,98716:0:0:0:0: -475,192,98558,128,0,98874:0:0:0:0: -36,192,98558,128,0,98637:0:0:0:0: -329,192,98637,128,0,98716:0:0:0:0: -109,192,98716,128,0,98795:0:0:0:0: -256,192,98716,1,0,0:0:0:0: -402,192,98716,1,0,0:0:0:0: -36,192,98795,128,0,98874:0:0:0:0: -329,192,98795,1,0,0:0:0:0: -402,192,98874,128,0,99190:0:0:0:0: -256,192,98874,128,0,99111:0:0:0:0: -182,192,98874,128,0,98953:0:0:0:0: -109,192,98874,1,0,0:0:0:0: -329,192,98953,1,0,0:0:0:0: -36,192,99032,128,0,99190:0:0:0:0: -109,192,99032,1,0,0:0:0:0: -475,192,99032,1,0,0:0:0:0: -182,192,99111,128,0,99190:0:0:0:0: -329,192,99190,128,0,99348:0:0:0:0: -109,192,99190,128,0,99269:0:0:0:0: -256,192,99190,1,0,0:0:0:0: -475,192,99269,128,0,99348:0:0:0:0: -402,192,99269,1,0,0:0:0:0: -36,192,99348,128,0,99506:0:0:0:0: -182,192,99348,128,0,99427:0:0:0:0: -109,192,99348,1,0,0:0:0:0: -329,192,99427,128,0,99506:0:0:0:0: -256,192,99427,1,0,0:0:0:0: -402,192,99506,128,0,99980:0:0:0:0: -182,192,99506,128,0,99585:0:0:0:0: -109,192,99506,1,0,0:0:0:0: -475,192,99506,1,0,0:0:0:0: -329,192,99585,1,0,0:0:0:0: -256,192,99664,128,0,99980:0:0:0:0: -109,192,99664,128,0,99743:0:0:0:0: -36,192,99664,1,0,0:0:0:0: -475,192,99664,1,0,0:0:0:0: -182,192,99743,1,0,0:0:0:0: -36,192,99822,128,0,99901:0:0:0:0: -475,192,99822,1,0,0:0:0:0: -329,192,99822,1,0,0:0:0:0: -182,192,99901,1,0,0:0:0:0: -109,192,99980,128,0,100453:0:0:0:0: -475,192,99980,128,0,100058:0:0:0:0: -36,192,99980,1,0,0:0:0:0: -329,192,99980,1,0,0:0:0:0: -182,192,100058,1,0,0:0:0:0: -329,192,100137,128,0,100216:0:0:0:0: -256,192,100137,1,0,0:0:0:0: -475,192,100137,1,0,0:0:0:0: -36,192,100137,1,0,0:0:0:0: -182,192,100216,1,0,0:0:0:0: -475,192,100295,128,0,100374:0:0:0:0: -402,192,100295,1,0,0:0:0:0: -256,192,100295,1,0,0:0:0:0: -182,192,100374,1,0,0:0:0:0: -256,192,100453,128,0,100611:0:0:0:0: -36,192,100453,1,0,0:0:0:0: -475,192,100453,1,0,0:0:0:0: -402,192,100453,1,0,0:0:0:0: -329,192,100532,128,0,100690:0:0:0:0: -109,192,100532,1,0,0:0:0:0: -36,192,100611,128,0,100690:0:0:0:0: -402,192,100611,128,0,100769:0:0:0:0: -182,192,100611,1,0,0:0:0:0: -475,192,100611,1,0,0:0:0:0: -256,192,100690,1,0,0:0:0:0: -109,192,100769,128,0,101006:0:0:0:0: -329,192,100769,128,0,100848:0:0:0:0: -475,192,100769,128,0,100848:0:0:0:0: -182,192,100769,128,0,100848:0:0:0:0: -36,192,100769,128,0,100848:0:0:0:0: -182,192,100927,128,0,101006:0:0:0:0: -36,192,100927,128,0,101006:0:0:0:0: -329,192,100927,128,0,101006:0:0:0:0: -475,192,100927,128,0,101006:0:0:0:0: -402,192,100927,128,0,101006:0:0:0:0: -329,192,101085,128,0,101243:0:0:0:0: -36,192,101085,128,0,101164:0:0:0:0: -475,192,101085,128,0,101164:0:0:0:0: -256,192,101164,128,0,101401:0:0:0:0: -109,192,101164,128,0,101243:0:0:0:0: -402,192,101164,128,0,101243:0:0:0:0: -182,192,101243,128,0,101322:0:0:0:0: -36,192,101243,128,0,101322:0:0:0:0: -475,192,101243,128,0,101322:0:0:0:0: -329,192,101322,128,0,101480:0:0:0:0: -109,192,101322,128,0,101401:0:0:0:0: -475,192,101401,128,0,101480:0:0:0:0: -36,192,101401,128,0,101480:0:0:0:0: -182,192,101401,128,0,101480:0:0:0:0: -402,192,101401,128,0,101637:0:0:0:0: -36,192,101558,128,0,101637:0:0:0:0: -182,192,101558,128,0,101637:0:0:0:0: -329,192,101558,128,0,101637:0:0:0:0: -475,192,101558,128,0,101637:0:0:0:0: -109,192,101558,128,0,101637:0:0:0:0: -182,192,101716,128,0,101874:0:0:0:0: -36,192,101716,128,0,101953:0:0:0:0: -475,192,101716,128,0,101953:0:0:0:0: -329,192,101716,128,0,101795:0:0:0:0: -256,192,101795,128,0,102032:0:0:0:0: -329,192,101874,128,0,102032:0:0:0:0: -182,192,101953,128,0,102032:0:0:0:0: -109,192,102032,128,0,102190:0:0:0:0: -475,192,102032,128,0,102190:0:0:0:0: -36,192,102032,1,0,0:0:0:0: -402,192,102032,1,0,0:0:0:0: -329,192,102111,128,0,102348:0:0:0:0: -182,192,102190,128,0,102348:0:0:0:0: -36,192,102190,128,0,102348:0:0:0:0: -402,192,102269,128,0,102506:0:0:0:0: -475,192,102269,1,0,0:0:0:0: -109,192,102348,128,0,102506:0:0:0:0: -256,192,102348,128,0,102506:0:0:0:0: -182,192,102427,1,0,0:0:0:0: -36,192,102506,128,0,102901:0:0:0:0: -475,192,102506,128,0,102901:0:0:0:0: -329,192,102506,128,0,102585:0:0:0:0: -256,192,102585,128,0,102664:0:0:0:0: -182,192,102664,128,0,102743:0:0:0:0: -402,192,102664,1,0,0:0:0:0: -109,192,102743,128,0,102822:0:0:0:0: -329,192,102743,1,0,0:0:0:0: -402,192,102822,128,0,102980:0:0:0:0: -256,192,102822,1,0,0:0:0:0: -329,192,102901,128,0,103058:0:0:0:0: -182,192,102901,1,0,0:0:0:0: -256,192,102980,128,0,103137:0:0:0:0: -109,192,102980,1,0,0:0:0:0: -36,192,103058,1,0,0:0:0:0: -182,192,103058,128,0,103216:0:0:0:0: -475,192,103137,1,0,0:0:0:0: -109,192,103137,128,0,103295:0:0:0:0: -329,192,103216,128,0,103295:0:0:0:0: -256,192,103295,1,0,0:0:0:0: -475,192,103295,128,0,103769:0:0:0:0: -182,192,103295,1,0,0:0:0:0: -36,192,103295,128,0,103374:0:0:0:0: -402,192,103374,128,0,103532:0:0:0:0: -329,192,103374,1,0,0:0:0:0: -182,192,103453,128,0,103611:0:0:0:0: -36,192,103453,1,0,0:0:0:0: -109,192,103453,1,0,0:0:0:0: -329,192,103532,128,0,103769:0:0:0:0: -256,192,103532,1,0,0:0:0:0: -109,192,103611,128,0,103769:0:0:0:0: -36,192,103611,1,0,0:0:0:0: -402,192,103611,1,0,0:0:0:0: -182,192,103690,128,0,103769:0:0:0:0: -36,192,103769,128,0,104085:0:0:0:0: -256,192,103769,128,0,103848:0:0:0:0: -402,192,103769,1,0,0:0:0:0: -182,192,103848,128,0,104006:0:0:0:0: -329,192,103848,1,0,0:0:0:0: -402,192,103927,1,0,0:0:0:0: -256,192,103927,1,0,0:0:0:0: -475,192,103927,128,0,104085:0:0:0:0: -329,192,104006,128,0,104085:0:0:0:0: -109,192,104006,128,0,104085:0:0:0:0: -402,192,104085,128,0,104401:0:0:0:0: -182,192,104085,128,0,104164:0:0:0:0: -256,192,104164,128,0,104243:0:0:0:0: -109,192,104164,1,0,0:0:0:0: -36,192,104243,128,0,104322:0:0:0:0: -475,192,104243,1,0,0:0:0:0: -329,192,104243,1,0,0:0:0:0: -109,192,104322,128,0,104401:0:0:0:0: -256,192,104322,1,0,0:0:0:0: -182,192,104401,128,0,104874:0:0:0:0: -329,192,104401,128,0,104480:0:0:0:0: -475,192,104401,128,0,104558:0:0:0:0: -36,192,104401,128,0,104716:0:0:0:0: -256,192,104480,128,0,104558:0:0:0:0: -402,192,104558,128,0,104637:0:0:0:0: -109,192,104558,1,0,0:0:0:0: -329,192,104637,128,0,104716:0:0:0:0: -256,192,104637,1,0,0:0:0:0: -475,192,104716,128,0,104874:0:0:0:0: -109,192,104716,1,0,0:0:0:0: -402,192,104716,1,0,0:0:0:0: -256,192,104795,128,0,104874:0:0:0:0: -36,192,104874,128,0,105190:0:0:0:0: -402,192,104874,128,0,105111:0:0:0:0: -109,192,104874,128,0,104953:0:0:0:0: -329,192,104874,1,0,0:0:0:0: -256,192,104953,128,0,105032:0:0:0:0: -182,192,104953,1,0,0:0:0:0: -109,192,105032,128,0,105111:0:0:0:0: -329,192,105032,1,0,0:0:0:0: -475,192,105032,1,0,0:0:0:0: -182,192,105111,128,0,105190:0:0:0:0: -256,192,105111,1,0,0:0:0:0: -329,192,105190,128,0,105269:0:0:0:0: -475,192,105190,128,0,105427:0:0:0:0: -109,192,105190,1,0,0:0:0:0: -402,192,105269,128,0,105348:0:0:0:0: -256,192,105269,1,0,0:0:0:0: -182,192,105348,128,0,105427:0:0:0:0: -36,192,105348,128,0,105585:0:0:0:0: -329,192,105348,1,0,0:0:0:0: -109,192,105427,128,0,105506:0:0:0:0: -256,192,105427,1,0,0:0:0:0: -475,192,105506,128,0,105664:0:0:0:0: -329,192,105506,1,0,0:0:0:0: -402,192,105585,128,0,105743:0:0:0:0: -182,192,105585,1,0,0:0:0:0: -36,192,105664,128,0,106137:0:0:0:0: -329,192,105664,128,0,105822:0:0:0:0: -109,192,105664,1,0,0:0:0:0: -182,192,105743,128,0,105822:0:0:0:0: -256,192,105743,1,0,0:0:0:0: -475,192,105822,128,0,106058:0:0:0:0: -402,192,105822,1,0,0:0:0:0: -109,192,105822,1,0,0:0:0:0: -256,192,105901,128,0,105980:0:0:0:0: -182,192,105901,1,0,0:0:0:0: -402,192,105980,128,0,106137:0:0:0:0: -109,192,105980,1,0,0:0:0:0: -329,192,106058,128,0,106137:0:0:0:0: -256,192,106058,1,0,0:0:0:0: -109,192,106137,128,0,106216:0:0:0:0: -475,192,106137,1,0,0:0:0:0: -182,192,106137,1,0,0:0:0:0: -402,192,106216,128,0,106295:0:0:0:0: -256,192,106216,1,0,0:0:0:0: -109,192,106295,128,0,106611:0:0:0:0: -329,192,106295,128,0,106374:0:0:0:0: -36,192,106295,1,0,0:0:0:0: -182,192,106295,1,0,0:0:0:0: -475,192,106374,128,0,106453:0:0:0:0: -256,192,106374,1,0,0:0:0:0: -402,192,106453,128,0,106532:0:0:0:0: -36,192,106453,1,0,0:0:0:0: -329,192,106453,1,0,0:0:0:0: -182,192,106532,128,0,106611:0:0:0:0: -402,192,106611,128,0,106927:0:0:0:0: -256,192,106611,128,0,106690:0:0:0:0: -36,192,106611,1,0,0:0:0:0: -475,192,106611,1,0,0:0:0:0: -329,192,106690,128,0,106769:0:0:0:0: -182,192,106690,1,0,0:0:0:0: -109,192,106769,128,0,106848:0:0:0:0: -36,192,106769,1,0,0:0:0:0: -475,192,106769,1,0,0:0:0:0: -256,192,106848,128,0,106927:0:0:0:0: -182,192,106848,1,0,0:0:0:0: -475,192,106927,128,0,107243:0:0:0:0: -36,192,106927,128,0,107085:0:0:0:0: -329,192,106927,1,0,0:0:0:0: -109,192,106927,1,0,0:0:0:0: -182,192,107006,128,0,107085:0:0:0:0: -256,192,107006,1,0,0:0:0:0: -329,192,107085,128,0,107243:0:0:0:0: -109,192,107085,128,0,107164:0:0:0:0: -402,192,107085,1,0,0:0:0:0: -182,192,107164,128,0,107243:0:0:0:0: -256,192,107164,1,0,0:0:0:0: -36,192,107243,128,0,107401:0:0:0:0: -402,192,107243,1,0,0:0:0:0: -109,192,107322,128,0,107401:0:0:0:0: -182,192,107322,1,0,0:0:0:0: -402,192,107401,128,0,107716:0:0:0:0: -256,192,107401,128,0,107480:0:0:0:0: -475,192,107401,128,0,107480:0:0:0:0: -329,192,107401,1,0,0:0:0:0: -182,192,107480,128,0,107558:0:0:0:0: -109,192,107480,1,0,0:0:0:0: -329,192,107558,128,0,107716:0:0:0:0: -36,192,107558,128,0,107716:0:0:0:0: -109,192,107637,128,0,107716:0:0:0:0: -256,192,107637,1,0,0:0:0:0: -182,192,107716,128,0,107795:0:0:0:0: -475,192,107716,128,0,107953:0:0:0:0: -329,192,107795,128,0,107874:0:0:0:0: -36,192,107874,128,0,108190:0:0:0:0: -256,192,107874,1,0,0:0:0:0: -109,192,107874,1,0,0:0:0:0: -182,192,107874,128,0,107953:0:0:0:0: -329,192,107953,128,0,108032:0:0:0:0: -475,192,108032,128,0,108190:0:0:0:0: -402,192,108032,1,0,0:0:0:0: -256,192,108032,1,0,0:0:0:0: -182,192,108032,128,0,108190:0:0:0:0: -109,192,108190,128,0,108348:0:0:0:0: -256,192,108190,128,0,108348:0:0:0:0: -402,192,108190,1,0,0:0:0:0: -329,192,108190,1,0,0:0:0:0: -182,192,108348,128,0,108664:0:0:0:0: -402,192,108348,128,0,108427:0:0:0:0: -36,192,108348,1,0,0:0:0:0: -475,192,108348,1,0,0:0:0:0: -329,192,108348,1,0,0:0:0:0: -256,192,108427,128,0,108506:0:0:0:0: -109,192,108427,1,0,0:0:0:0: -475,192,108506,128,0,108664:0:0:0:0: -36,192,108506,1,0,0:0:0:0: -402,192,108506,1,0,0:0:0:0: -329,192,108585,128,0,108664:0:0:0:0: -109,192,108585,1,0,0:0:0:0: -256,192,108664,128,0,108980:0:0:0:0: -36,192,108664,128,0,108743:0:0:0:0: -402,192,108664,1,0,0:0:0:0: -182,192,108743,128,0,108822:0:0:0:0: -329,192,108743,1,0,0:0:0:0: -36,192,108822,128,0,108980:0:0:0:0: -402,192,108822,128,0,108901:0:0:0:0: -475,192,108822,128,0,108901:0:0:0:0: -109,192,108901,128,0,108980:0:0:0:0: -182,192,108901,1,0,0:0:0:0: -402,192,108980,128,0,109216:0:0:0:0: -329,192,108980,128,0,109058:0:0:0:0: -475,192,108980,1,0,0:0:0:0: -182,192,109058,128,0,109137:0:0:0:0: -109,192,109058,1,0,0:0:0:0: -256,192,109137,128,0,109216:0:0:0:0: -36,192,109137,1,0,0:0:0:0: -475,192,109137,1,0,0:0:0:0: -109,192,109216,128,0,109295:0:0:0:0: -256,192,109295,128,0,109532:0:0:0:0: -475,192,109295,128,0,109374:0:0:0:0: -36,192,109295,128,0,109374:0:0:0:0: -182,192,109295,1,0,0:0:0:0: -329,192,109295,1,0,0:0:0:0: -109,192,109374,128,0,109453:0:0:0:0: -402,192,109374,128,0,109453:0:0:0:0: -182,192,109453,128,0,109532:0:0:0:0: -329,192,109453,128,0,109532:0:0:0:0: -36,192,109532,128,0,109611:0:0:0:0: -475,192,109532,128,0,109611:0:0:0:0: -329,192,109611,128,0,109769:0:0:0:0: -182,192,109611,128,0,109769:0:0:0:0: -109,192,109611,128,0,109690:0:0:0:0: -256,192,109611,1,0,0:0:0:0: -402,192,109611,1,0,0:0:0:0: -36,192,109690,128,0,109769:0:0:0:0: -256,192,109769,128,0,110085:0:0:0:0: -402,192,109769,128,0,110085:0:0:0:0: -109,192,109769,128,0,109848:0:0:0:0: -475,192,109769,1,0,0:0:0:0: -182,192,109848,128,0,109927:0:0:0:0: -36,192,109927,128,0,110085:0:0:0:0: -329,192,109927,1,0,0:0:0:0: -475,192,109927,1,0,0:0:0:0: -109,192,110006,128,0,110085:0:0:0:0: -475,192,110085,128,0,110401:0:0:0:0: -329,192,110085,128,0,110401:0:0:0:0: -182,192,110085,128,0,110243:0:0:0:0: -109,192,110164,128,0,110322:0:0:0:0: -36,192,110243,128,0,110401:0:0:0:0: -402,192,110243,1,0,0:0:0:0: -256,192,110322,128,0,110401:0:0:0:0: -182,192,110401,128,0,110480:0:0:0:0: -109,192,110480,128,0,110558:0:0:0:0: -475,192,110480,128,0,110558:0:0:0:0: -329,192,110480,128,0,110558:0:0:0:0: -36,192,110558,128,0,110874:0:0:0:0: -182,192,110558,128,0,110874:0:0:0:0: -402,192,110558,128,0,110637:0:0:0:0: -256,192,110558,128,0,110637:0:0:0:0: -329,192,110637,128,0,110716:0:0:0:0: -475,192,110716,128,0,110795:0:0:0:0: -402,192,110716,128,0,110795:0:0:0:0: -109,192,110716,128,0,110795:0:0:0:0: -256,192,110795,128,0,110874:0:0:0:0: -475,192,110874,128,0,111506:0:0:0:0: -109,192,110874,128,0,111032:0:0:0:0: -329,192,110874,1,0,0:0:0:0: -402,192,110874,128,0,110953:0:0:0:0: -182,192,110953,128,0,111111:0:0:0:0: -256,192,111032,128,0,111190:0:0:0:0: -402,192,111032,1,0,0:0:0:0: -36,192,111111,128,0,111506:0:0:0:0: -329,192,111111,128,0,111269:0:0:0:0: -109,192,111190,128,0,111427:0:0:0:0: -402,192,111190,128,0,111348:0:0:0:0: -182,192,111269,128,0,111348:0:0:0:0: -329,192,111348,128,0,111427:0:0:0:0: -256,192,111427,128,0,111506:0:0:0:0: -182,192,111506,128,0,111585:0:0:0:0: -402,192,111506,128,0,111585:0:0:0:0: -109,192,111585,128,0,111664:0:0:0:0: -329,192,111585,128,0,111743:0:0:0:0: -36,192,111664,128,0,111743:0:0:0:0: -256,192,111664,128,0,111822:0:0:0:0: -475,192,111664,128,0,111743:0:0:0:0: -182,192,111743,128,0,111901:0:0:0:0: -36,192,111822,128,0,112137:0:0:0:0: -109,192,111822,128,0,111980:0:0:0:0: -402,192,111822,128,0,111901:0:0:0:0: -475,192,111822,1,0,0:0:0:0: -329,192,111901,128,0,111980:0:0:0:0: -256,192,111980,128,0,112058:0:0:0:0: -475,192,111980,1,0,0:0:0:0: -182,192,112058,128,0,112137:0:0:0:0: -402,192,112058,1,0,0:0:0:0: -475,192,112137,128,0,112453:0:0:0:0: -329,192,112137,128,0,112374:0:0:0:0: -109,192,112137,128,0,112216:0:0:0:0: -36,192,112216,1,0,0:0:0:0: -182,192,112216,128,0,112295:0:0:0:0: -256,192,112295,128,0,112453:0:0:0:0: -402,192,112295,1,0,0:0:0:0: -36,192,112374,1,0,0:0:0:0: -109,192,112374,128,0,112453:0:0:0:0: -402,192,112453,128,0,112769:0:0:0:0: -182,192,112453,128,0,112690:0:0:0:0: -329,192,112453,128,0,112532:0:0:0:0: -475,192,112532,1,0,0:0:0:0: -36,192,112532,128,0,112611:0:0:0:0: -109,192,112611,128,0,112769:0:0:0:0: -329,192,112611,1,0,0:0:0:0: -256,192,112690,128,0,112769:0:0:0:0: -475,192,112769,128,0,112848:0:0:0:0: -182,192,112769,128,0,113085:0:0:0:0: -36,192,112769,128,0,112848:0:0:0:0: -329,192,112769,1,0,0:0:0:0: -256,192,112848,1,0,0:0:0:0: -329,192,112927,128,0,113085:0:0:0:0: -36,192,112927,1,0,0:0:0:0: -109,192,112927,1,0,0:0:0:0: -475,192,112927,128,0,113006:0:0:0:0: -256,192,113006,128,0,113085:0:0:0:0: -109,192,113085,128,0,113401:0:0:0:0: -475,192,113085,128,0,113164:0:0:0:0: -36,192,113085,1,0,0:0:0:0: -402,192,113164,128,0,113243:0:0:0:0: -256,192,113164,1,0,0:0:0:0: -329,192,113243,128,0,113322:0:0:0:0: -182,192,113243,1,0,0:0:0:0: -36,192,113243,1,0,0:0:0:0: -256,192,113322,128,0,113401:0:0:0:0: -475,192,113401,128,0,114111:0:0:0:0: -36,192,113401,128,0,114111:0:0:0:0: -402,192,113401,1,0,0:0:0:0: -329,192,113401,1,0,0:0:0:0: -182,192,113401,1,0,0:0:0:0: -182,192,113558,1,0,0:0:0:0: -402,192,113558,1,0,0:0:0:0: -256,192,113558,1,0,0:0:0:0: -182,192,113874,1,0,0:0:0:0: -256,192,113874,1,0,0:0:0:0: -402,192,113874,1,0,0:0:0:0: -109,192,114032,1,0,0:0:0:0: -182,192,114032,1,0,0:0:0:0: -329,192,114032,1,0,0:0:0:0: -36,192,114190,1,0,0:0:0:0: -475,192,114190,1,0,0:0:0:0: -402,192,114190,1,0,0:0:0:0: -109,192,114190,1,0,0:0:0:0: -256,192,114190,1,0,0:0:0:0: -36,192,114348,128,0,114585:0:0:0:0: -475,192,114348,128,0,114585:0:0:0:0: -182,192,114348,1,0,0:0:0:0: -329,192,114348,1,0,0:0:0:0: -402,192,114348,1,0,0:0:0:0: -109,192,114506,1,0,0:0:0:0: -256,192,114506,1,0,0:0:0:0: -329,192,114506,1,0,0:0:0:0: -36,192,114664,128,0,115295:0:0:0:0: -475,192,114664,128,0,115295:0:0:0:0: -109,192,114822,1,0,0:0:0:0: -256,192,114822,1,0,0:0:0:0: -402,192,114822,1,0,0:0:0:0: -109,192,114980,1,0,0:0:0:0: -256,192,114980,1,0,0:0:0:0: -402,192,114980,1,0,0:0:0:0: -109,192,115295,1,0,0:0:0:0: -329,192,115295,1,0,0:0:0:0: -182,192,115295,1,0,0:0:0:0: -402,192,115374,1,0,0:0:0:0: -256,192,115374,1,0,0:0:0:0: -329,192,115453,1,0,0:0:0:0: -475,192,115453,1,0,0:0:0:0: -182,192,115532,1,0,0:0:0:0: -109,192,115532,1,0,0:0:0:0: -36,192,115532,1,0,0:0:0:0: -402,192,115611,1,0,0:0:0:0: -329,192,115611,1,0,0:0:0:0: -475,192,115611,1,0,0:0:0:0: -256,192,115690,1,0,0:0:0:0: -182,192,115769,1,0,0:0:0:0: -402,192,115769,1,0,0:0:0:0: -475,192,115769,1,0,0:0:0:0: -109,192,115848,1,0,0:0:0:0: -329,192,115848,1,0,0:0:0:0: -256,192,115927,1,0,0:0:0:0: -182,192,115927,1,0,0:0:0:0: -36,192,115927,1,0,0:0:0:0: -475,192,115927,128,0,116243:0:0:0:0: -329,192,116243,1,0,0:0:0:0: -36,192,116243,128,0,116480:0:0:0:0: -402,192,116243,1,0,0:0:0:0: -256,192,116243,1,0,0:0:0:0: -109,192,116282,128,0,116480:0:0:0:0: -182,192,116322,128,0,116480:0:0:0:0: -36,192,116558,128,0,116874:0:0:0:0: -475,192,116874,128,0,117111:0:0:0:0: -109,192,116874,1,0,0:0:0:0: -182,192,116874,1,0,0:0:0:0: -256,192,116874,1,0,0:0:0:0: -402,192,116914,128,0,117111:0:0:0:0: -329,192,116953,128,0,117111:0:0:0:0: -109,192,117190,128,0,117506:0:0:0:0: -402,192,117506,128,0,117743:0:0:0:0: -182,192,117506,1,0,0:0:0:0: -36,192,117506,1,0,0:0:0:0: -475,192,117506,1,0,0:0:0:0: -329,192,117545,128,0,117743:0:0:0:0: -256,192,117585,128,0,117743:0:0:0:0: -402,192,117822,128,0,118137:0:0:0:0: -109,192,117980,128,0,118295:0:0:0:0: -182,192,118019,128,0,118295:0:0:0:0: -256,192,118058,128,0,118295:0:0:0:0: -329,192,118295,128,0,118611:0:0:0:0: -475,192,118295,128,0,118611:0:0:0:0: -36,192,118295,1,0,0:0:0:0: -402,192,118295,1,0,0:0:0:0: -109,192,118611,128,0,118690:0:0:0:0: -36,192,118611,1,0,0:0:0:0: -256,192,118611,1,0,0:0:0:0: -402,192,118611,1,0,0:0:0:0: -182,192,118769,128,0,118848:0:0:0:0: -329,192,118769,1,0,0:0:0:0: -475,192,118769,1,0,0:0:0:0: -36,192,118769,1,0,0:0:0:0: -256,192,118927,128,0,119006:0:0:0:0: -109,192,118927,1,0,0:0:0:0: -402,192,118927,1,0,0:0:0:0: -475,192,118927,1,0,0:0:0:0: -36,192,119085,128,0,119164:0:0:0:0: -182,192,119085,128,0,119164:0:0:0:0: -329,192,119085,1,0,0:0:0:0: -475,192,119085,1,0,0:0:0:0: -109,192,119243,128,0,119322:0:0:0:0: -256,192,119243,128,0,119322:0:0:0:0: -402,192,119243,1,0,0:0:0:0: -475,192,119243,1,0,0:0:0:0: -182,192,119401,128,0,119480:0:0:0:0: -329,192,119401,128,0,119480:0:0:0:0: -36,192,119401,1,0,0:0:0:0: -475,192,119401,1,0,0:0:0:0: -109,192,119480,1,0,0:0:0:0: -256,192,119558,128,0,119637:0:0:0:0: -402,192,119558,128,0,119637:0:0:0:0: -182,192,119558,1,0,0:0:0:0: -36,192,119558,1,0,0:0:0:0: -475,192,119558,1,0,0:0:0:0: -109,192,119637,1,0,0:0:0:0: -329,192,119716,128,0,120032:0:0:0:0: -475,192,119716,128,0,120032:0:0:0:0: -182,192,119716,1,0,0:0:0:0: -36,192,119716,1,0,0:0:0:0: -402,192,119716,1,0,0:0:0:0: -256,192,119716,1,0,0:0:0:0: -109,192,120032,128,0,120348:0:0:0:0: -402,192,120348,128,0,120664:0:0:0:0: -109,192,120664,128,0,120980:0:0:0:0: -329,192,120980,128,0,121058:0:0:0:0: -36,192,120980,1,0,0:0:0:0: -109,192,121058,1,0,0:0:0:0: -475,192,121137,128,0,121216:0:0:0:0: -182,192,121137,1,0,0:0:0:0: -256,192,121216,1,0,0:0:0:0: -402,192,121295,128,0,121374:0:0:0:0: -182,192,121295,1,0,0:0:0:0: -329,192,121374,128,0,121453:0:0:0:0: -109,192,121374,1,0,0:0:0:0: -256,192,121453,128,0,121532:0:0:0:0: -36,192,121453,1,0,0:0:0:0: -109,192,121532,1,0,0:0:0:0: -475,192,121611,128,0,121690:0:0:0:0: -182,192,121611,1,0,0:0:0:0: -256,192,121690,1,0,0:0:0:0: -402,192,121769,128,0,121848:0:0:0:0: -182,192,121769,1,0,0:0:0:0: -329,192,121848,128,0,121927:0:0:0:0: -109,192,121848,1,0,0:0:0:0: -256,192,121927,128,0,122006:0:0:0:0: -36,192,121927,1,0,0:0:0:0: -475,192,122006,1,0,0:0:0:0: -109,192,122085,128,0,122164:0:0:0:0: -402,192,122085,1,0,0:0:0:0: -182,192,122164,128,0,122243:0:0:0:0: -329,192,122164,1,0,0:0:0:0: -256,192,122243,128,0,122322:0:0:0:0: -402,192,122243,1,0,0:0:0:0: -475,192,122322,1,0,0:0:0:0: -109,192,122401,128,0,122480:0:0:0:0: -329,192,122401,1,0,0:0:0:0: -182,192,122480,128,0,122558:0:0:0:0: -402,192,122480,1,0,0:0:0:0: -475,192,122558,1,0,0:0:0:0: -256,192,122558,1,0,0:0:0:0: -36,192,122637,128,0,122716:0:0:0:0: -402,192,122637,1,0,0:0:0:0: -329,192,122716,128,0,122795:0:0:0:0: -182,192,122716,1,0,0:0:0:0: -256,192,122795,128,0,122874:0:0:0:0: -109,192,122795,1,0,0:0:0:0: -182,192,122874,128,0,122953:0:0:0:0: -36,192,122874,1,0,0:0:0:0: -475,192,122874,1,0,0:0:0:0: -402,192,122953,1,0,0:0:0:0: -109,192,123032,128,0,123111:0:0:0:0: -329,192,123032,1,0,0:0:0:0: -182,192,123111,128,0,123190:0:0:0:0: -402,192,123111,1,0,0:0:0:0: -256,192,123190,128,0,123269:0:0:0:0: -475,192,123190,1,0,0:0:0:0: -182,192,123269,128,0,123348:0:0:0:0: -402,192,123269,1,0,0:0:0:0: -109,192,123348,128,0,123427:0:0:0:0: -329,192,123348,1,0,0:0:0:0: -36,192,123427,128,0,123506:0:0:0:0: -256,192,123427,1,0,0:0:0:0: -329,192,123506,128,0,123585:0:0:0:0: -182,192,123506,1,0,0:0:0:0: -475,192,123506,1,0,0:0:0:0: -109,192,123585,1,0,0:0:0:0: -475,192,123664,128,0,123743:0:0:0:0: -182,192,123664,1,0,0:0:0:0: -256,192,123743,1,0,0:0:0:0: -402,192,123822,128,0,123901:0:0:0:0: -182,192,123822,1,0,0:0:0:0: -329,192,123901,128,0,123980:0:0:0:0: -109,192,123901,1,0,0:0:0:0: -256,192,123980,128,0,124058:0:0:0:0: -36,192,123980,1,0,0:0:0:0: -109,192,124058,1,0,0:0:0:0: -475,192,124137,128,0,124216:0:0:0:0: -182,192,124137,1,0,0:0:0:0: -36,192,124137,1,0,0:0:0:0: -256,192,124216,1,0,0:0:0:0: -402,192,124295,128,0,124374:0:0:0:0: -109,192,124295,1,0,0:0:0:0: -36,192,124295,1,0,0:0:0:0: -329,192,124374,128,0,124453:0:0:0:0: -182,192,124374,1,0,0:0:0:0: -256,192,124453,128,0,124532:0:0:0:0: -36,192,124453,1,0,0:0:0:0: -475,192,124453,1,0,0:0:0:0: -402,192,124532,1,0,0:0:0:0: -109,192,124611,128,0,124690:0:0:0:0: -256,192,124611,1,0,0:0:0:0: -475,192,124611,1,0,0:0:0:0: -182,192,124690,128,0,124769:0:0:0:0: -329,192,124690,1,0,0:0:0:0: -256,192,124769,1,0,0:0:0:0: -36,192,124769,1,0,0:0:0:0: -475,192,124769,128,0,125085:0:0:0:0: -402,192,124769,1,0,0:0:0:0: -109,192,124848,1,0,0:0:0:0: -329,192,124848,1,0,0:0:0:0: -402,192,124927,1,0,0:0:0:0: -182,192,124927,1,0,0:0:0:0: -36,192,124927,1,0,0:0:0:0: -36,192,125085,128,0,125401:0:0:0:0: -402,192,125085,1,0,0:0:0:0: -109,192,125085,1,0,0:0:0:0: -256,192,125085,1,0,0:0:0:0: -329,192,125164,1,0,0:0:0:0: -182,192,125164,1,0,0:0:0:0: -256,192,125243,1,0,0:0:0:0: -402,192,125243,1,0,0:0:0:0: -109,192,125243,1,0,0:0:0:0: -475,192,125401,128,0,125716:0:0:0:0: -329,192,125401,1,0,0:0:0:0: -182,192,125401,1,0,0:0:0:0: -402,192,125401,1,0,0:0:0:0: -109,192,125480,1,0,0:0:0:0: -256,192,125480,1,0,0:0:0:0: -182,192,125558,1,0,0:0:0:0: -36,192,125558,1,0,0:0:0:0: -329,192,125558,1,0,0:0:0:0: -256,192,125716,128,0,125953:0:0:0:0: -109,192,125716,128,0,125953:0:0:0:0: -36,192,125716,128,0,125953:0:0:0:0: -402,192,125716,1,0,0:0:0:0: -329,192,125716,1,0,0:0:0:0: -329,192,126032,128,0,126111:0:0:0:0: -36,192,126032,128,0,126348:0:0:0:0: -475,192,126032,1,0,0:0:0:0: -182,192,126032,1,0,0:0:0:0: -109,192,126032,1,0,0:0:0:0: -256,192,126111,1,0,0:0:0:0: -475,192,126190,128,0,126269:0:0:0:0: -182,192,126190,1,0,0:0:0:0: -402,192,126190,1,0,0:0:0:0: -329,192,126269,1,0,0:0:0:0: -182,192,126348,128,0,126427:0:0:0:0: -475,192,126348,128,0,126664:0:0:0:0: -256,192,126348,1,0,0:0:0:0: -109,192,126348,1,0,0:0:0:0: -402,192,126348,1,0,0:0:0:0: -329,192,126427,128,0,126506:0:0:0:0: -36,192,126427,1,0,0:0:0:0: -256,192,126506,128,0,126585:0:0:0:0: -402,192,126506,1,0,0:0:0:0: -182,192,126506,1,0,0:0:0:0: -109,192,126585,1,0,0:0:0:0: -182,192,126664,128,0,126743:0:0:0:0: -36,192,126664,128,0,126980:0:0:0:0: -256,192,126664,1,0,0:0:0:0: -402,192,126664,1,0,0:0:0:0: -329,192,126743,1,0,0:0:0:0: -402,192,126822,128,0,126901:0:0:0:0: -256,192,126822,1,0,0:0:0:0: -109,192,126822,1,0,0:0:0:0: -329,192,126901,128,0,126980:0:0:0:0: -182,192,126901,1,0,0:0:0:0: -256,192,126980,128,0,127058:0:0:0:0: -475,192,126980,128,0,127295:0:0:0:0: -109,192,126980,1,0,0:0:0:0: -402,192,126980,1,0,0:0:0:0: -182,192,127058,1,0,0:0:0:0: -109,192,127137,128,0,127216:0:0:0:0: -256,192,127137,1,0,0:0:0:0: -36,192,127137,1,0,0:0:0:0: -182,192,127216,128,0,127295:0:0:0:0: -329,192,127216,1,0,0:0:0:0: -256,192,127295,128,0,127374:0:0:0:0: -36,192,127295,128,0,127611:0:0:0:0: -402,192,127295,1,0,0:0:0:0: -109,192,127295,1,0,0:0:0:0: -329,192,127374,1,0,0:0:0:0: -109,192,127453,128,0,127532:0:0:0:0: -256,192,127453,1,0,0:0:0:0: -475,192,127453,1,0,0:0:0:0: -182,192,127532,128,0,127611:0:0:0:0: -402,192,127532,1,0,0:0:0:0: -256,192,127611,128,0,127690:0:0:0:0: -475,192,127611,128,0,127927:0:0:0:0: -329,192,127611,1,0,0:0:0:0: -109,192,127611,1,0,0:0:0:0: -36,192,127690,128,0,127769:0:0:0:0: -182,192,127690,1,0,0:0:0:0: -329,192,127769,128,0,127927:0:0:0:0: -109,192,127769,1,0,0:0:0:0: -402,192,127769,1,0,0:0:0:0: -256,192,127848,128,0,127927:0:0:0:0: -182,192,127927,128,0,128006:0:0:0:0: -36,192,127927,128,0,128243:0:0:0:0: -402,192,127927,1,0,0:0:0:0: -109,192,127927,1,0,0:0:0:0: -329,192,128006,1,0,0:0:0:0: -109,192,128085,128,0,128164:0:0:0:0: -256,192,128085,1,0,0:0:0:0: -475,192,128085,1,0,0:0:0:0: -182,192,128164,128,0,128243:0:0:0:0: -402,192,128164,1,0,0:0:0:0: -329,192,128243,128,0,128401:0:0:0:0: -475,192,128243,128,0,128558:0:0:0:0: -109,192,128243,1,0,0:0:0:0: -256,192,128322,128,0,128480:0:0:0:0: -402,192,128322,1,0,0:0:0:0: -36,192,128401,1,0,0:0:0:0: -182,192,128401,128,0,128558:0:0:0:0: -329,192,128480,128,0,128558:0:0:0:0: -109,192,128558,1,0,0:0:0:0: -402,192,128558,1,0,0:0:0:0: -256,192,128558,128,0,128637:0:0:0:0: -36,192,128558,128,0,128874:0:0:0:0: -329,192,128637,1,0,0:0:0:0: -402,192,128716,128,0,128795:0:0:0:0: -475,192,128716,1,0,0:0:0:0: -182,192,128716,1,0,0:0:0:0: -329,192,128795,1,0,0:0:0:0: -182,192,128874,128,0,128953:0:0:0:0: -475,192,128874,128,0,129190:0:0:0:0: -109,192,128874,1,0,0:0:0:0: -402,192,128874,1,0,0:0:0:0: -256,192,128874,1,0,0:0:0:0: -329,192,128953,128,0,129032:0:0:0:0: -36,192,128953,1,0,0:0:0:0: -256,192,129032,128,0,129111:0:0:0:0: -109,192,129032,1,0,0:0:0:0: -402,192,129032,1,0,0:0:0:0: -329,192,129111,1,0,0:0:0:0: -182,192,129190,128,0,129269:0:0:0:0: -36,192,129190,128,0,129506:0:0:0:0: -256,192,129190,1,0,0:0:0:0: -402,192,129190,1,0,0:0:0:0: -109,192,129190,1,0,0:0:0:0: -329,192,129269,1,0,0:0:0:0: -402,192,129348,128,0,129427:0:0:0:0: -256,192,129348,1,0,0:0:0:0: -109,192,129348,1,0,0:0:0:0: -329,192,129427,128,0,129506:0:0:0:0: -182,192,129427,1,0,0:0:0:0: -256,192,129506,128,0,129585:0:0:0:0: -475,192,129506,128,0,129822:0:0:0:0: -109,192,129506,1,0,0:0:0:0: -402,192,129506,1,0,0:0:0:0: -182,192,129585,1,0,0:0:0:0: -109,192,129664,128,0,129743:0:0:0:0: -256,192,129664,1,0,0:0:0:0: -36,192,129664,1,0,0:0:0:0: -402,192,129664,1,0,0:0:0:0: -182,192,129743,128,0,129822:0:0:0:0: -329,192,129743,1,0,0:0:0:0: -36,192,129822,128,0,129980:0:0:0:0: -256,192,129822,1,0,0:0:0:0: -402,192,129822,1,0,0:0:0:0: -329,192,129901,1,0,0:0:0:0: -475,192,129980,128,0,130058:0:0:0:0: -402,192,129980,1,0,0:0:0:0: -182,192,129980,1,0,0:0:0:0: -256,192,130058,1,0,0:0:0:0: -329,192,130137,128,0,130216:0:0:0:0: -109,192,130137,1,0,0:0:0:0: -36,192,130137,1,0,0:0:0:0: -475,192,130137,1,0,0:0:0:0: -402,192,130216,128,0,130374:0:0:0:0: -182,192,130216,1,0,0:0:0:0: -256,192,130295,128,0,130374:0:0:0:0: -36,192,130295,1,0,0:0:0:0: -475,192,130295,1,0,0:0:0:0: -182,192,130374,128,0,130453:0:0:0:0: -109,192,130374,1,0,0:0:0:0: -329,192,130453,128,0,130611:0:0:0:0: -475,192,130453,1,0,0:0:0:0: -36,192,130453,1,0,0:0:0:0: -402,192,130453,1,0,0:0:0:0: -182,192,130532,128,0,130611:0:0:0:0: -109,192,130532,1,0,0:0:0:0: -256,192,130611,128,0,130690:0:0:0:0: -36,192,130611,1,0,0:0:0:0: -475,192,130611,1,0,0:0:0:0: -329,192,130690,128,0,130769:0:0:0:0: -402,192,130690,1,0,0:0:0:0: -109,192,130769,128,0,131006:0:0:0:0: -256,192,130769,1,0,0:0:0:0: -36,192,130769,1,0,0:0:0:0: -475,192,130769,1,0,0:0:0:0: -182,192,130848,128,0,130927:0:0:0:0: -402,192,130848,1,0,0:0:0:0: -329,192,130927,128,0,131006:0:0:0:0: -475,192,130927,1,0,0:0:0:0: -36,192,130927,1,0,0:0:0:0: -256,192,131006,128,0,131085:0:0:0:0: -402,192,131006,1,0,0:0:0:0: -182,192,131085,128,0,131164:0:0:0:0: -475,192,131085,128,0,131401:0:0:0:0: -36,192,131085,1,0,0:0:0:0: -329,192,131085,1,0,0:0:0:0: -256,192,131164,1,0,0:0:0:0: -109,192,131243,128,0,131322:0:0:0:0: -329,192,131243,1,0,0:0:0:0: -36,192,131243,1,0,0:0:0:0: -182,192,131322,1,0,0:0:0:0: -329,192,131401,128,0,131480:0:0:0:0: -36,192,131401,128,0,131716:0:0:0:0: -256,192,131401,1,0,0:0:0:0: -402,192,131401,1,0,0:0:0:0: -109,192,131401,1,0,0:0:0:0: -182,192,131480,128,0,131558:0:0:0:0: -475,192,131480,1,0,0:0:0:0: -256,192,131558,128,0,131637:0:0:0:0: -109,192,131558,1,0,0:0:0:0: -329,192,131558,1,0,0:0:0:0: -402,192,131637,1,0,0:0:0:0: -329,192,131716,128,0,131795:0:0:0:0: -475,192,131716,128,0,132032:0:0:0:0: -256,192,131716,1,0,0:0:0:0: -109,192,131716,1,0,0:0:0:0: -182,192,131795,1,0,0:0:0:0: -109,192,131874,128,0,131953:0:0:0:0: -256,192,131874,1,0,0:0:0:0: -402,192,131874,1,0,0:0:0:0: -182,192,131953,128,0,132032:0:0:0:0: -329,192,131953,1,0,0:0:0:0: -256,192,132032,128,0,132111:0:0:0:0: -36,192,132032,128,0,132348:0:0:0:0: -402,192,132032,1,0,0:0:0:0: -109,192,132032,1,0,0:0:0:0: -329,192,132111,1,0,0:0:0:0: -402,192,132190,128,0,132269:0:0:0:0: -109,192,132190,1,0,0:0:0:0: -475,192,132190,1,0,0:0:0:0: -329,192,132269,128,0,132348:0:0:0:0: -182,192,132269,1,0,0:0:0:0: -256,192,132348,128,0,132427:0:0:0:0: -475,192,132348,128,0,132664:0:0:0:0: -109,192,132348,1,0,0:0:0:0: -402,192,132348,1,0,0:0:0:0: -182,192,132427,1,0,0:0:0:0: -402,192,132506,128,0,132585:0:0:0:0: -256,192,132506,1,0,0:0:0:0: -36,192,132506,1,0,0:0:0:0: -329,192,132585,128,0,132664:0:0:0:0: -109,192,132585,1,0,0:0:0:0: -256,192,132664,128,0,132743:0:0:0:0: -36,192,132664,128,0,132980:0:0:0:0: -182,192,132664,1,0,0:0:0:0: -402,192,132664,1,0,0:0:0:0: -475,192,132743,128,0,132822:0:0:0:0: -329,192,132743,1,0,0:0:0:0: -182,192,132822,128,0,132980:0:0:0:0: -402,192,132822,1,0,0:0:0:0: -109,192,132822,1,0,0:0:0:0: -256,192,132901,128,0,132980:0:0:0:0: -329,192,132980,128,0,133058:0:0:0:0: -475,192,132980,128,0,133295:0:0:0:0: -109,192,132980,1,0,0:0:0:0: -402,192,132980,1,0,0:0:0:0: -182,192,133058,1,0,0:0:0:0: -402,192,133137,128,0,133216:0:0:0:0: -256,192,133137,1,0,0:0:0:0: -36,192,133137,1,0,0:0:0:0: -329,192,133216,128,0,133295:0:0:0:0: -109,192,133216,1,0,0:0:0:0: -182,192,133295,128,0,133532:0:0:0:0: -36,192,133295,128,0,133532:0:0:0:0: -256,192,133295,1,0,0:0:0:0: -402,192,133374,1,0,0:0:0:0: -475,192,133374,128,0,133611:0:0:0:0: -329,192,133453,128,0,133611:0:0:0:0: -109,192,133453,1,0,0:0:0:0: -256,192,133532,1,0,0:0:0:0: -36,192,133611,128,0,134243:0:0:0:0: -182,192,133611,128,0,134243:0:0:0:0: -402,192,133611,128,0,133769:0:0:0:0: -109,192,133611,128,0,133690:0:0:0:0: -475,192,133690,128,0,133848:0:0:0:0: -256,192,133690,128,0,133769:0:0:0:0: -329,192,133769,128,0,133927:0:0:0:0: -109,192,133769,128,0,133848:0:0:0:0: -402,192,133848,128,0,134006:0:0:0:0: -256,192,133927,128,0,134085:0:0:0:0: -475,192,133927,128,0,134006:0:0:0:0: -329,192,134006,128,0,134164:0:0:0:0: -109,192,134006,128,0,134085:0:0:0:0: -475,192,134085,128,0,134164:0:0:0:0: -256,192,134164,128,0,134243:0:0:0:0: -402,192,134164,128,0,134322:0:0:0:0: -109,192,134243,128,0,134401:0:0:0:0: -475,192,134243,128,0,134874:0:0:0:0: -329,192,134243,128,0,134874:0:0:0:0: -256,192,134322,128,0,134401:0:0:0:0: -36,192,134322,128,0,134480:0:0:0:0: -402,192,134401,128,0,134480:0:0:0:0: -182,192,134401,128,0,134558:0:0:0:0: -109,192,134480,128,0,134637:0:0:0:0: -256,192,134558,128,0,134716:0:0:0:0: -36,192,134558,128,0,134637:0:0:0:0: -182,192,134637,128,0,134795:0:0:0:0: -402,192,134637,128,0,134716:0:0:0:0: -36,192,134716,128,0,134795:0:0:0:0: -256,192,134795,128,0,134874:0:0:0:0: -109,192,134795,128,0,134874:0:0:0:0: -36,192,134874,128,0,135032:0:0:0:0: -182,192,134874,128,0,134953:0:0:0:0: -402,192,134874,128,0,135032:0:0:0:0: -256,192,134953,128,0,135032:0:0:0:0: -475,192,135032,128,0,135190:0:0:0:0: -329,192,135032,128,0,135111:0:0:0:0: -109,192,135032,128,0,135190:0:0:0:0: -256,192,135111,128,0,135190:0:0:0:0: -182,192,135190,128,0,135348:0:0:0:0: -36,192,135190,128,0,135269:0:0:0:0: -402,192,135190,128,0,135269:0:0:0:0: -256,192,135269,128,0,135348:0:0:0:0: -329,192,135348,128,0,135506:0:0:0:0: -36,192,135348,128,0,135427:0:0:0:0: -475,192,135348,128,0,135427:0:0:0:0: -182,192,135427,128,0,135506:0:0:0:0: -36,192,135506,1,0,0:0:0:0: -475,192,135506,1,0,0:0:0:0: -402,192,135506,128,0,135585:0:0:0:0: -109,192,135506,128,0,135585:0:0:0:0: -256,192,135585,128,0,135664:0:0:0:0: -182,192,135664,128,0,135743:0:0:0:0: -329,192,135664,128,0,135743:0:0:0:0: -402,192,135743,128,0,135822:0:0:0:0: -109,192,135743,128,0,135822:0:0:0:0: -36,192,135822,128,0,135901:0:0:0:0: -182,192,135822,128,0,135901:0:0:0:0: -329,192,135822,128,0,135901:0:0:0:0: -475,192,135822,128,0,135901:0:0:0:0: -475,192,135980,128,0,136058:0:0:0:0: -329,192,135980,128,0,136058:0:0:0:0: -182,192,135980,128,0,136058:0:0:0:0: -36,192,135980,128,0,136058:0:0:0:0: -475,192,136137,128,0,136453:0:0:0:0: -402,192,136137,1,0,0:0:0:0: -109,192,136137,128,0,136216:0:0:0:0: -36,192,136137,1,0,0:0:0:0: -256,192,136137,128,0,136216:0:0:0:0: -182,192,136216,128,0,136295:0:0:0:0: -329,192,136216,128,0,136295:0:0:0:0: -182,192,136374,128,0,136453:0:0:0:0: -329,192,136374,128,0,136453:0:0:0:0: -109,192,136453,1,0,0:0:0:0: -402,192,136453,128,0,136532:0:0:0:0: -36,192,136453,128,0,136769:0:0:0:0: -256,192,136453,128,0,136532:0:0:0:0: -182,192,136532,128,0,136611:0:0:0:0: -329,192,136611,128,0,136690:0:0:0:0: -109,192,136611,1,0,0:0:0:0: -475,192,136611,1,0,0:0:0:0: -182,192,136690,1,0,0:0:0:0: -402,192,136769,128,0,136848:0:0:0:0: -475,192,136769,128,0,137085:0:0:0:0: -256,192,136769,1,0,0:0:0:0: -109,192,136769,1,0,0:0:0:0: -182,192,136848,1,0,0:0:0:0: -109,192,136927,128,0,137006:0:0:0:0: -256,192,136927,1,0,0:0:0:0: -402,192,136927,1,0,0:0:0:0: -182,192,137006,128,0,137085:0:0:0:0: -329,192,137006,1,0,0:0:0:0: -256,192,137085,128,0,137164:0:0:0:0: -36,192,137085,128,0,137401:0:0:0:0: -402,192,137085,1,0,0:0:0:0: -109,192,137085,1,0,0:0:0:0: -329,192,137164,1,0,0:0:0:0: -402,192,137243,128,0,137322:0:0:0:0: -109,192,137243,1,0,0:0:0:0: -475,192,137243,1,0,0:0:0:0: -329,192,137322,128,0,137401:0:0:0:0: -182,192,137322,1,0,0:0:0:0: -256,192,137401,128,0,137480:0:0:0:0: -475,192,137401,128,0,137716:0:0:0:0: -109,192,137401,1,0,0:0:0:0: -402,192,137401,1,0,0:0:0:0: -182,192,137480,1,0,0:0:0:0: -402,192,137558,128,0,137637:0:0:0:0: -256,192,137558,1,0,0:0:0:0: -36,192,137558,1,0,0:0:0:0: -329,192,137637,128,0,137716:0:0:0:0: -109,192,137637,1,0,0:0:0:0: -256,192,137716,128,0,137874:0:0:0:0: -36,192,137716,128,0,138032:0:0:0:0: -182,192,137716,1,0,0:0:0:0: -402,192,137716,1,0,0:0:0:0: -475,192,137795,128,0,137874:0:0:0:0: -329,192,137795,1,0,0:0:0:0: -182,192,137874,128,0,138032:0:0:0:0: -109,192,137874,1,0,0:0:0:0: -402,192,137874,1,0,0:0:0:0: -329,192,137953,128,0,138032:0:0:0:0: -402,192,138032,128,0,138111:0:0:0:0: -475,192,138032,128,0,138348:0:0:0:0: -256,192,138032,1,0,0:0:0:0: -109,192,138032,1,0,0:0:0:0: -182,192,138111,1,0,0:0:0:0: -36,192,138190,128,0,138269:0:0:0:0: -256,192,138190,1,0,0:0:0:0: -402,192,138190,1,0,0:0:0:0: -109,192,138269,128,0,138348:0:0:0:0: -329,192,138269,1,0,0:0:0:0: -256,192,138348,128,0,138664:0:0:0:0: -36,192,138348,128,0,138664:0:0:0:0: -182,192,138348,1,0,0:0:0:0: -402,192,138348,128,0,138427:0:0:0:0: -329,192,138427,128,0,138585:0:0:0:0: -109,192,138506,1,0,0:0:0:0: -402,192,138506,128,0,138664:0:0:0:0: -182,192,138585,128,0,138664:0:0:0:0: -109,192,138664,128,0,138743:0:0:0:0: -475,192,138664,128,0,138980:0:0:0:0: -329,192,138664,1,0,0:0:0:0: -256,192,138743,1,0,0:0:0:0: -182,192,138822,128,0,138901:0:0:0:0: -402,192,138822,1,0,0:0:0:0: -36,192,138822,1,0,0:0:0:0: -256,192,138901,1,0,0:0:0:0: -402,192,138980,128,0,139058:0:0:0:0: -36,192,138980,128,0,139295:0:0:0:0: -329,192,138980,1,0,0:0:0:0: -109,192,138980,1,0,0:0:0:0: -182,192,139058,128,0,139137:0:0:0:0: -256,192,139058,1,0,0:0:0:0: -475,192,139137,1,0,0:0:0:0: -329,192,139137,128,0,139216:0:0:0:0: -402,192,139137,1,0,0:0:0:0: -182,192,139216,1,0,0:0:0:0: -402,192,139295,128,0,139374:0:0:0:0: -475,192,139295,128,0,139611:0:0:0:0: -109,192,139295,1,0,0:0:0:0: -329,192,139295,1,0,0:0:0:0: -256,192,139374,1,0,0:0:0:0: -109,192,139453,128,0,139532:0:0:0:0: -36,192,139453,1,0,0:0:0:0: -402,192,139453,1,0,0:0:0:0: -182,192,139532,128,0,139611:0:0:0:0: -329,192,139532,1,0,0:0:0:0: -256,192,139611,128,0,139690:0:0:0:0: -36,192,139611,128,0,139927:0:0:0:0: -402,192,139611,1,0,0:0:0:0: -109,192,139611,1,0,0:0:0:0: -329,192,139690,1,0,0:0:0:0: -402,192,139769,128,0,139848:0:0:0:0: -256,192,139769,1,0,0:0:0:0: -475,192,139769,1,0,0:0:0:0: -109,192,139769,1,0,0:0:0:0: -329,192,139848,128,0,139927:0:0:0:0: -182,192,139848,1,0,0:0:0:0: -475,192,139927,128,0,140085:0:0:0:0: -402,192,139927,1,0,0:0:0:0: -109,192,139927,1,0,0:0:0:0: -256,192,139927,1,0,0:0:0:0: -329,192,140006,1,0,0:0:0:0: -182,192,140085,128,0,140164:0:0:0:0: -36,192,140085,1,0,0:0:0:0: -402,192,140085,1,0,0:0:0:0: -109,192,140085,1,0,0:0:0:0: -256,192,140164,128,0,140243:0:0:0:0: -329,192,140243,128,0,140322:0:0:0:0: -402,192,140243,1,0,0:0:0:0: -475,192,140243,1,0,0:0:0:0: -109,192,140322,1,0,0:0:0:0: -182,192,140322,128,0,140480:0:0:0:0: -36,192,140322,1,0,0:0:0:0: -329,192,140401,128,0,140480:0:0:0:0: -402,192,140401,1,0,0:0:0:0: -475,192,140401,1,0,0:0:0:0: -256,192,140480,128,0,140558:0:0:0:0: -402,192,140558,128,0,140716:0:0:0:0: -36,192,140558,1,0,0:0:0:0: -475,192,140558,1,0,0:0:0:0: -182,192,140558,1,0,0:0:0:0: -109,192,140637,128,0,140874:0:0:0:0: -182,192,140716,128,0,140795:0:0:0:0: -475,192,140716,1,0,0:0:0:0: -36,192,140716,1,0,0:0:0:0: -329,192,140716,1,0,0:0:0:0: -256,192,140795,128,0,140874:0:0:0:0: -402,192,140874,128,0,141190:0:0:0:0: -329,192,140874,1,0,0:0:0:0: -475,192,140874,1,0,0:0:0:0: -36,192,140874,1,0,0:0:0:0: -182,192,140953,128,0,141032:0:0:0:0: -256,192,140953,1,0,0:0:0:0: -329,192,141032,128,0,141111:0:0:0:0: -36,192,141032,1,0,0:0:0:0: -475,192,141032,1,0,0:0:0:0: -256,192,141111,128,0,141190:0:0:0:0: -109,192,141111,1,0,0:0:0:0: -475,192,141190,128,0,141269:0:0:0:0: -36,192,141190,128,0,141506:0:0:0:0: -329,192,141190,1,0,0:0:0:0: -182,192,141190,1,0,0:0:0:0: -256,192,141269,1,0,0:0:0:0: -329,192,141348,128,0,141427:0:0:0:0: -109,192,141348,1,0,0:0:0:0: -475,192,141348,1,0,0:0:0:0: -256,192,141427,1,0,0:0:0:0: -182,192,141506,128,0,141585:0:0:0:0: -475,192,141506,128,0,141822:0:0:0:0: -109,192,141506,1,0,0:0:0:0: -402,192,141506,1,0,0:0:0:0: -329,192,141585,128,0,141664:0:0:0:0: -36,192,141585,1,0,0:0:0:0: -256,192,141664,128,0,141743:0:0:0:0: -402,192,141664,1,0,0:0:0:0: -182,192,141664,1,0,0:0:0:0: -109,192,141743,1,0,0:0:0:0: -182,192,141822,128,0,141901:0:0:0:0: -36,192,141822,128,0,142137:0:0:0:0: -256,192,141822,1,0,0:0:0:0: -402,192,141822,1,0,0:0:0:0: -329,192,141901,1,0,0:0:0:0: -402,192,141980,128,0,142058:0:0:0:0: -475,192,141980,1,0,0:0:0:0: -109,192,141980,1,0,0:0:0:0: -329,192,142058,128,0,142137:0:0:0:0: -182,192,142058,1,0,0:0:0:0: -256,192,142137,128,0,142216:0:0:0:0: -475,192,142137,128,0,142453:0:0:0:0: -109,192,142137,1,0,0:0:0:0: -402,192,142137,1,0,0:0:0:0: -182,192,142216,1,0,0:0:0:0: -109,192,142295,128,0,142374:0:0:0:0: -402,192,142295,1,0,0:0:0:0: -36,192,142295,1,0,0:0:0:0: -182,192,142374,128,0,142453:0:0:0:0: -329,192,142374,1,0,0:0:0:0: -36,192,142453,128,0,142769:0:0:0:0: -402,192,142453,1,0,0:0:0:0: -256,192,142453,1,0,0:0:0:0: -182,192,142532,1,0,0:0:0:0: -109,192,142611,128,0,142690:0:0:0:0: -475,192,142611,1,0,0:0:0:0: -256,192,142611,1,0,0:0:0:0: -182,192,142690,128,0,142769:0:0:0:0: -329,192,142690,1,0,0:0:0:0: -256,192,142769,128,0,142848:0:0:0:0: -475,192,142769,128,0,143085:0:0:0:0: -402,192,142769,1,0,0:0:0:0: -109,192,142769,1,0,0:0:0:0: -182,192,142848,128,0,142927:0:0:0:0: -329,192,142848,1,0,0:0:0:0: -109,192,142927,128,0,143006:0:0:0:0: -402,192,142927,1,0,0:0:0:0: -36,192,142927,1,0,0:0:0:0: -256,192,143006,128,0,143085:0:0:0:0: -329,192,143006,1,0,0:0:0:0: -36,192,143085,1,0,0:0:0:0: -402,192,143085,1,0,0:0:0:0: -182,192,143085,128,0,143164:0:0:0:0: -256,192,143164,1,0,0:0:0:0: -475,192,143164,1,0,0:0:0:0: -329,192,143243,128,0,143322:0:0:0:0: -36,192,143243,1,0,0:0:0:0: -182,192,143243,1,0,0:0:0:0: -475,192,143322,128,0,143637:0:0:0:0: -256,192,143322,1,0,0:0:0:0: -329,192,143401,1,0,0:0:0:0: -36,192,143401,128,0,143637:0:0:0:0: -182,192,143401,1,0,0:0:0:0: -109,192,143401,1,0,0:0:0:0: -402,192,143480,128,0,143637:0:0:0:0: -256,192,143480,1,0,0:0:0:0: -329,192,143558,128,0,143637:0:0:0:0: -182,192,143558,1,0,0:0:0:0: -109,192,143637,1,0,0:0:0:0: -256,192,143716,1,0,0:0:0:0: -402,192,143716,1,0,0:0:0:0: -475,192,143716,1,0,0:0:0:0: -182,192,143716,1,0,0:0:0:0: -36,192,143716,1,0,0:0:0:0: -329,192,143874,1,0,0:0:0:0: -182,192,143874,1,0,0:0:0:0: -475,192,143874,1,0,0:0:0:0: -402,192,144032,128,0,144111:0:0:0:0: -329,192,144111,128,0,144190:0:0:0:0: -256,192,144190,128,0,144269:0:0:0:0: -182,192,144269,128,0,144348:0:0:0:0: -36,192,144348,1,0,0:0:0:0: -109,192,144348,1,0,0:0:0:0: -475,192,144348,1,0,0:0:0:0: -329,192,144348,1,0,0:0:0:0: -402,192,144348,1,0,0:0:0:0: -182,192,144506,128,0,144585:0:0:0:0: -256,192,144585,128,0,144664:0:0:0:0: -329,192,144664,128,0,144743:0:0:0:0: -402,192,144743,1,0,0:0:0:0: -182,192,144822,128,0,144901:0:0:0:0: -256,192,144901,128,0,144980:0:0:0:0: -109,192,144980,1,0,0:0:0:0: -36,192,144980,1,0,0:0:0:0: -329,192,144980,1,0,0:0:0:0: -475,192,144980,1,0,0:0:0:0: -402,192,144980,1,0,0:0:0:0: -109,192,145137,1,0,0:0:0:0: -256,192,145137,1,0,0:0:0:0: -402,192,145137,1,0,0:0:0:0: -182,192,145295,1,0,0:0:0:0: -36,192,145295,1,0,0:0:0:0: -256,192,145295,1,0,0:0:0:0: -329,192,145295,1,0,0:0:0:0: -475,192,145295,1,0,0:0:0:0: -109,192,145453,1,0,0:0:0:0: -256,192,145453,1,0,0:0:0:0: -402,192,145453,1,0,0:0:0:0: -109,192,145611,1,0,0:0:0:0: -36,192,145611,1,0,0:0:0:0: -256,192,145611,1,0,0:0:0:0: -402,192,145611,1,0,0:0:0:0: -475,192,145611,1,0,0:0:0:0: -109,192,145769,1,0,0:0:0:0: -256,192,145769,1,0,0:0:0:0: -402,192,145769,1,0,0:0:0:0: -182,192,145927,1,0,0:0:0:0: -109,192,145927,1,0,0:0:0:0: -36,192,145927,1,0,0:0:0:0: -329,192,145927,1,0,0:0:0:0: -402,192,145927,1,0,0:0:0:0: -475,192,145927,1,0,0:0:0:0: -109,192,146243,1,0,0:0:0:0: -36,192,146243,1,0,0:0:0:0: -402,192,146243,1,0,0:0:0:0: -475,192,146243,1,0,0:0:0:0: -329,192,146323,1,0,0:0:0:0: -182,192,146323,1,0,0:0:0:0: -402,192,146403,1,0,0:0:0:0: -256,192,146403,1,0,0:0:0:0: -475,192,146483,1,0,0:0:0:0: -329,192,146483,1,0,0:0:0:0: -109,192,146563,1,0,0:0:0:0: -256,192,146563,1,0,0:0:0:0: -182,192,146648,1,0,0:0:0:0: -329,192,146648,1,0,0:0:0:0: -256,192,146734,1,0,0:0:0:0: -402,192,146734,1,0,0:0:0:0: -329,192,146820,1,0,0:0:0:0: -475,192,146820,1,0,0:0:0:0: -36,192,146905,1,0,0:0:0:0: -182,192,146905,1,0,0:0:0:0: -109,192,146992,1,0,0:0:0:0: -256,192,146992,1,0,0:0:0:0: -182,192,147079,1,0,0:0:0:0: -329,192,147079,1,0,0:0:0:0: -256,192,147166,1,0,0:0:0:0: -402,192,147166,1,0,0:0:0:0: -329,192,147253,1,0,0:0:0:0: -36,192,147253,1,0,0:0:0:0: -475,192,147253,1,0,0:0:0:0: -182,192,147253,1,0,0:0:0:0: -109,192,147346,1,0,0:0:0:0: -256,192,147346,1,0,0:0:0:0: -182,192,147440,1,0,0:0:0:0: -329,192,147440,1,0,0:0:0:0: -256,192,147534,1,0,0:0:0:0: -402,192,147534,1,0,0:0:0:0: -329,192,147628,1,0,0:0:0:0: -475,192,147628,1,0,0:0:0:0: -402,192,147721,1,0,0:0:0:0: -475,192,147815,1,0,0:0:0:0: -329,192,147815,1,0,0:0:0:0: -402,192,147909,1,0,0:0:0:0: -256,192,147909,1,0,0:0:0:0: -329,192,148003,1,0,0:0:0:0: -182,192,148003,1,0,0:0:0:0: -256,192,148097,1,0,0:0:0:0: -109,192,148097,1,0,0:0:0:0: -182,192,148192,1,0,0:0:0:0: -36,192,148192,1,0,0:0:0:0: -109,192,148287,1,0,0:0:0:0: -36,192,148382,1,0,0:0:0:0: -329,192,148382,1,0,0:0:0:0: -256,192,148482,1,0,0:0:0:0: -182,192,148582,1,0,0:0:0:0: -109,192,148682,1,0,0:0:0:0: -36,192,148782,1,0,0:0:0:0: -402,192,148782,1,0,0:0:0:0: -329,192,148878,1,0,0:0:0:0: -256,192,148975,1,0,0:0:0:0: -182,192,149072,1,0,0:0:0:0: -109,192,149169,1,0,0:0:0:0: -329,192,149169,1,0,0:0:0:0: -256,192,149218,1,0,0:0:0:0: -182,192,149267,1,0,0:0:0:0: -109,192,149316,1,0,0:0:0:0: -36,192,149365,1,0,0:0:0:0: -402,192,149365,1,0,0:0:0:0: -329,192,149414,1,0,0:0:0:0: -256,192,149463,1,0,0:0:0:0: -182,192,149512,1,0,0:0:0:0: -109,192,149561,1,0,0:0:0:0: -475,192,149561,1,0,0:0:0:0: -402,192,149611,1,0,0:0:0:0: -329,192,149662,1,0,0:0:0:0: -256,192,149713,1,0,0:0:0:0: -182,192,149763,1,0,0:0:0:0: -256,192,149814,1,0,0:0:0:0: -329,192,149865,1,0,0:0:0:0: -402,192,149915,1,0,0:0:0:0: -475,192,149966,1,0,0:0:0:0: -109,192,149966,1,0,0:0:0:0: -182,192,150017,1,0,0:0:0:0: -256,192,150067,1,0,0:0:0:0: -329,192,150118,1,0,0:0:0:0: -402,192,150169,1,0,0:0:0:0: -36,192,150169,1,0,0:0:0:0: -109,192,150219,1,0,0:0:0:0: -182,192,150270,1,0,0:0:0:0: -256,192,150321,1,0,0:0:0:0: -329,192,150371,1,0,0:0:0:0: -402,192,150422,1,0,0:0:0:0: -475,192,150473,1,0,0:0:0:0: -402,192,150523,1,0,0:0:0:0: -329,192,150574,1,0,0:0:0:0: -256,192,150625,1,0,0:0:0:0: -182,192,150675,1,0,0:0:0:0: -109,192,150726,1,0,0:0:0:0: -36,192,150777,1,0,0:0:0:0: -475,192,150777,1,0,0:0:0:0: -402,192,150811,1,0,0:0:0:0: -329,192,150844,1,0,0:0:0:0: -256,192,150878,1,0,0:0:0:0: -182,192,150912,1,0,0:0:0:0: -109,192,150946,1,0,0:0:0:0: -36,192,150979,1,0,0:0:0:0: -109,192,151013,1,0,0:0:0:0: -182,192,151047,1,0,0:0:0:0: -256,192,151081,1,0,0:0:0:0: -329,192,151115,1,0,0:0:0:0: -402,192,151148,1,0,0:0:0:0: -109,192,151182,1,0,0:0:0:0: -475,192,151182,1,0,0:0:0:0: -182,192,151216,1,0,0:0:0:0: -256,192,151250,1,0,0:0:0:0: -329,192,151283,1,0,0:0:0:0: -402,192,151317,1,0,0:0:0:0: -475,192,151351,1,0,0:0:0:0: -36,192,151385,1,0,0:0:0:0: -109,192,151419,1,0,0:0:0:0: -182,192,151452,1,0,0:0:0:0: -256,192,151486,1,0,0:0:0:0: -329,192,151520,1,0,0:0:0:0: -402,192,151554,1,0,0:0:0:0: -109,192,151586,1,0,0:0:0:0: -182,192,151586,1,0,0:0:0:0: -475,192,151586,1,0,0:0:0:0: -36,192,151586,1,0,0:0:0:0: -109,192,151779,1,0,0:0:0:0: -182,192,151779,1,0,0:0:0:0: -329,192,151779,1,0,0:0:0:0: -402,192,151779,1,0,0:0:0:0: -182,192,151973,1,0,0:0:0:0: -36,192,151973,1,0,0:0:0:0: -329,192,151973,1,0,0:0:0:0: -475,192,151973,1,0,0:0:0:0: -256,192,151973,1,0,0:0:0:0: -475,192,152360,128,0,152660:0:0:0:0: -36,192,152360,1,0,0:0:0:0: -109,192,152360,1,0,0:0:0:0: -256,192,152360,1,0,0:0:0:0: -329,192,152460,1,0,0:0:0:0: -402,192,152460,1,0,0:0:0:0: -182,192,152560,1,0,0:0:0:0: -36,192,152560,1,0,0:0:0:0: -256,192,152660,1,0,0:0:0:0: -329,192,152660,1,0,0:0:0:0: -475,192,152760,128,0,153160:0:0:0:0: -109,192,152760,1,0,0:0:0:0: -36,192,152760,1,0,0:0:0:0: -402,192,152760,1,0,0:0:0:0: -329,192,152860,1,0,0:0:0:0: -256,192,152860,1,0,0:0:0:0: -109,192,152960,1,0,0:0:0:0: -36,192,152960,1,0,0:0:0:0: -182,192,153060,1,0,0:0:0:0: -256,192,153060,1,0,0:0:0:0: -329,192,153160,128,0,153360:0:0:0:0: -402,192,153160,1,0,0:0:0:0: -109,192,153160,1,0,0:0:0:0: -36,192,153160,1,0,0:0:0:0: -256,192,153260,1,0,0:0:0:0: -182,192,153260,1,0,0:0:0:0: -475,192,153360,128,0,153760:0:0:0:0: -109,192,153360,1,0,0:0:0:0: -36,192,153360,1,0,0:0:0:0: -256,192,153460,1,0,0:0:0:0: -329,192,153460,1,0,0:0:0:0: -182,192,153560,1,0,0:0:0:0: -109,192,153560,1,0,0:0:0:0: -36,192,153560,1,0,0:0:0:0: -256,192,153660,1,0,0:0:0:0: -402,192,153660,1,0,0:0:0:0: -329,192,153760,128,0,153960:0:0:0:0: -36,192,153760,1,0,0:0:0:0: -109,192,153760,1,0,0:0:0:0: -182,192,153860,1,0,0:0:0:0: -256,192,153860,1,0,0:0:0:0: -475,192,153960,128,0,154360:0:0:0:0: -109,192,153960,1,0,0:0:0:0: -36,192,153960,1,0,0:0:0:0: -402,192,153960,1,0,0:0:0:0: -329,192,154060,1,0,0:0:0:0: -256,192,154060,1,0,0:0:0:0: -109,192,154160,1,0,0:0:0:0: -36,192,154160,1,0,0:0:0:0: -256,192,154260,1,0,0:0:0:0: -182,192,154260,1,0,0:0:0:0: -329,192,154360,128,0,154560:0:0:0:0: -109,192,154360,1,0,0:0:0:0: -36,192,154360,1,0,0:0:0:0: -402,192,154360,1,0,0:0:0:0: -256,192,154460,1,0,0:0:0:0: -182,192,154460,1,0,0:0:0:0: -475,192,154560,128,0,154960:0:0:0:0: -109,192,154560,1,0,0:0:0:0: -36,192,154560,1,0,0:0:0:0: -256,192,154660,1,0,0:0:0:0: -329,192,154660,1,0,0:0:0:0: -36,192,154760,1,0,0:0:0:0: -402,192,154760,1,0,0:0:0:0: -109,192,154760,1,0,0:0:0:0: -182,192,154860,1,0,0:0:0:0: -256,192,154860,1,0,0:0:0:0: -329,192,154960,1,0,0:0:0:0: -402,192,154960,1,0,0:0:0:0: -109,192,155060,1,0,0:0:0:0: -182,192,155060,1,0,0:0:0:0: -36,192,155160,1,0,0:0:0:0: -475,192,155160,1,0,0:0:0:0: -329,192,155160,1,0,0:0:0:0: -256,192,155260,1,0,0:0:0:0: -182,192,155260,1,0,0:0:0:0: -329,192,155360,1,0,0:0:0:0: -402,192,155360,1,0,0:0:0:0: -182,192,155460,1,0,0:0:0:0: -109,192,155460,1,0,0:0:0:0: -36,192,155560,128,0,155860:0:0:0:0: -256,192,155560,1,0,0:0:0:0: -402,192,155560,1,0,0:0:0:0: -475,192,155560,1,0,0:0:0:0: -182,192,155660,1,0,0:0:0:0: -109,192,155660,1,0,0:0:0:0: -329,192,155760,1,0,0:0:0:0: -402,192,155760,1,0,0:0:0:0: -256,192,155860,1,0,0:0:0:0: -182,192,155860,1,0,0:0:0:0: -36,192,155960,128,0,156360:0:0:0:0: -109,192,155960,1,0,0:0:0:0: -475,192,155960,1,0,0:0:0:0: -402,192,155960,1,0,0:0:0:0: -329,192,156060,1,0,0:0:0:0: -256,192,156060,1,0,0:0:0:0: -182,192,156160,1,0,0:0:0:0: -109,192,156160,1,0,0:0:0:0: -329,192,156260,1,0,0:0:0:0: -256,192,156260,1,0,0:0:0:0: -182,192,156360,128,0,156560:0:0:0:0: -402,192,156360,1,0,0:0:0:0: -109,192,156360,1,0,0:0:0:0: -475,192,156360,1,0,0:0:0:0: -256,192,156460,1,0,0:0:0:0: -329,192,156460,1,0,0:0:0:0: -36,192,156560,128,0,156960:0:0:0:0: -402,192,156560,1,0,0:0:0:0: -475,192,156560,1,0,0:0:0:0: -329,192,156660,1,0,0:0:0:0: -256,192,156660,1,0,0:0:0:0: -182,192,156760,1,0,0:0:0:0: -109,192,156760,1,0,0:0:0:0: -475,192,156760,1,0,0:0:0:0: -402,192,156860,1,0,0:0:0:0: -329,192,156860,1,0,0:0:0:0: -182,192,156960,128,0,157160:0:0:0:0: -256,192,156960,1,0,0:0:0:0: -109,192,156960,1,0,0:0:0:0: -329,192,157060,1,0,0:0:0:0: -402,192,157060,1,0,0:0:0:0: -36,192,157160,128,0,157360:0:0:0:0: -256,192,157160,1,0,0:0:0:0: -475,192,157160,1,0,0:0:0:0: -109,192,157160,1,0,0:0:0:0: -329,192,157260,1,0,0:0:0:0: -402,192,157260,1,0,0:0:0:0: -475,192,157360,1,0,0:0:0:0: -109,192,157360,1,0,0:0:0:0: -182,192,157360,128,0,157560:0:0:0:0: -256,192,157460,1,0,0:0:0:0: -329,192,157460,1,0,0:0:0:0: -36,192,157560,128,0,157760:0:0:0:0: -475,192,157560,1,0,0:0:0:0: -402,192,157560,1,0,0:0:0:0: -109,192,157560,1,0,0:0:0:0: -329,192,157660,1,0,0:0:0:0: -256,192,157660,1,0,0:0:0:0: -182,192,157760,128,0,158360:0:0:0:0: -109,192,157760,1,0,0:0:0:0: -475,192,157760,1,0,0:0:0:0: -329,192,157860,1,0,0:0:0:0: -402,192,157860,1,0,0:0:0:0: -256,192,157960,1,0,0:0:0:0: -36,192,157960,1,0,0:0:0:0: -475,192,157960,1,0,0:0:0:0: -329,192,158060,1,0,0:0:0:0: -402,192,158060,1,0,0:0:0:0: -109,192,158160,1,0,0:0:0:0: -36,192,158160,1,0,0:0:0:0: -329,192,158260,1,0,0:0:0:0: -256,192,158260,1,0,0:0:0:0: -402,192,158360,1,0,0:0:0:0: -475,192,158360,1,0,0:0:0:0: -36,192,158360,1,0,0:0:0:0: -109,192,158460,1,0,0:0:0:0: -182,192,158460,1,0,0:0:0:0: -329,192,158560,1,0,0:0:0:0: -402,192,158560,1,0,0:0:0:0: -256,192,158660,1,0,0:0:0:0: -182,192,158660,1,0,0:0:0:0: -475,192,158760,128,0,159060:0:0:0:0: -36,192,158760,1,0,0:0:0:0: -109,192,158760,1,0,0:0:0:0: -402,192,158760,1,0,0:0:0:0: -329,192,158860,1,0,0:0:0:0: -256,192,158860,1,0,0:0:0:0: -109,192,158960,1,0,0:0:0:0: -36,192,158960,1,0,0:0:0:0: -182,192,158960,1,0,0:0:0:0: -329,192,159060,1,0,0:0:0:0: -256,192,159060,1,0,0:0:0:0: -402,192,159060,1,0,0:0:0:0: -475,192,159160,128,0,159560:0:0:0:0: -182,192,159160,1,0,0:0:0:0: -36,192,159160,1,0,0:0:0:0: -109,192,159160,1,0,0:0:0:0: -402,192,159260,1,0,0:0:0:0: -329,192,159260,1,0,0:0:0:0: -109,192,159360,1,0,0:0:0:0: -36,192,159360,1,0,0:0:0:0: -182,192,159460,1,0,0:0:0:0: -256,192,159460,1,0,0:0:0:0: -329,192,159560,128,0,159760:0:0:0:0: -36,192,159560,1,0,0:0:0:0: -402,192,159560,1,0,0:0:0:0: -109,192,159560,1,0,0:0:0:0: -256,192,159660,1,0,0:0:0:0: -182,192,159660,1,0,0:0:0:0: -475,192,159760,128,0,160160:0:0:0:0: -109,192,159760,1,0,0:0:0:0: -36,192,159760,1,0,0:0:0:0: -256,192,159860,1,0,0:0:0:0: -329,192,159860,1,0,0:0:0:0: -182,192,159960,1,0,0:0:0:0: -36,192,159960,1,0,0:0:0:0: -109,192,159960,1,0,0:0:0:0: -256,192,160060,1,0,0:0:0:0: -402,192,160060,1,0,0:0:0:0: -329,192,160160,128,0,160360:0:0:0:0: -36,192,160160,1,0,0:0:0:0: -109,192,160160,1,0,0:0:0:0: -182,192,160260,1,0,0:0:0:0: -256,192,160260,1,0,0:0:0:0: -475,192,160360,128,0,160760:0:0:0:0: -109,192,160360,1,0,0:0:0:0: -36,192,160360,1,0,0:0:0:0: -402,192,160360,1,0,0:0:0:0: -329,192,160460,1,0,0:0:0:0: -256,192,160460,1,0,0:0:0:0: -36,192,160560,1,0,0:0:0:0: -109,192,160560,1,0,0:0:0:0: -256,192,160660,1,0,0:0:0:0: -182,192,160660,1,0,0:0:0:0: -329,192,160760,128,0,160960:0:0:0:0: -109,192,160760,1,0,0:0:0:0: -36,192,160760,1,0,0:0:0:0: -402,192,160760,1,0,0:0:0:0: -256,192,160860,1,0,0:0:0:0: -182,192,160860,1,0,0:0:0:0: -475,192,160960,128,0,161360:0:0:0:0: -36,192,160960,1,0,0:0:0:0: -402,192,160960,1,0,0:0:0:0: -109,192,161060,1,0,0:0:0:0: -182,192,161060,1,0,0:0:0:0: -402,192,161160,1,0,0:0:0:0: -36,192,161160,1,0,0:0:0:0: -329,192,161160,1,0,0:0:0:0: -256,192,161260,1,0,0:0:0:0: -182,192,161260,1,0,0:0:0:0: -109,192,161360,1,0,0:0:0:0: -36,192,161360,1,0,0:0:0:0: -182,192,161460,1,0,0:0:0:0: -256,192,161460,1,0,0:0:0:0: -329,192,161560,1,0,0:0:0:0: -402,192,161560,1,0,0:0:0:0: -475,192,161560,1,0,0:0:0:0: -109,192,161660,1,0,0:0:0:0: -182,192,161660,1,0,0:0:0:0: -329,192,161760,1,0,0:0:0:0: -402,192,161760,1,0,0:0:0:0: -256,192,161860,1,0,0:0:0:0: -182,192,161860,1,0,0:0:0:0: -36,192,161960,128,0,162260:0:0:0:0: -109,192,161960,1,0,0:0:0:0: -402,192,161960,1,0,0:0:0:0: -475,192,161960,1,0,0:0:0:0: -329,192,162060,1,0,0:0:0:0: -256,192,162060,1,0,0:0:0:0: -182,192,162160,1,0,0:0:0:0: -109,192,162160,1,0,0:0:0:0: -329,192,162260,1,0,0:0:0:0: -402,192,162260,1,0,0:0:0:0: -256,192,162360,1,0,0:0:0:0: -182,192,162360,1,0,0:0:0:0: -109,192,162360,1,0,0:0:0:0: -36,192,162360,128,0,162760:0:0:0:0: -402,192,162460,1,0,0:0:0:0: -475,192,162460,1,0,0:0:0:0: -329,192,162560,1,0,0:0:0:0: -256,192,162560,1,0,0:0:0:0: -402,192,162660,1,0,0:0:0:0: -475,192,162660,1,0,0:0:0:0: -182,192,162760,128,0,163160:0:0:0:0: -329,192,162760,1,0,0:0:0:0: -256,192,162760,1,0,0:0:0:0: -109,192,162760,1,0,0:0:0:0: -402,192,162860,1,0,0:0:0:0: -475,192,162860,1,0,0:0:0:0: -109,192,162960,1,0,0:0:0:0: -36,192,162960,1,0,0:0:0:0: -256,192,163060,1,0,0:0:0:0: -329,192,163060,1,0,0:0:0:0: -36,192,163160,128,0,163560:0:0:0:0: -402,192,163160,1,0,0:0:0:0: -475,192,163160,1,0,0:0:0:0: -109,192,163160,1,0,0:0:0:0: -329,192,163260,1,0,0:0:0:0: -256,192,163260,1,0,0:0:0:0: -182,192,163360,1,0,0:0:0:0: -109,192,163360,1,0,0:0:0:0: -329,192,163460,1,0,0:0:0:0: -402,192,163460,1,0,0:0:0:0: -182,192,163560,128,0,163760:0:0:0:0: -256,192,163560,1,0,0:0:0:0: -109,192,163560,1,0,0:0:0:0: -475,192,163560,1,0,0:0:0:0: -36,192,163760,128,0,163960:0:0:0:0: -475,192,163760,1,0,0:0:0:0: -109,192,163760,1,0,0:0:0:0: -402,192,163810,1,0,0:0:0:0: -329,192,163860,1,0,0:0:0:0: -256,192,163910,1,0,0:0:0:0: -109,192,163960,128,0,164160:0:0:0:0: -402,192,163960,1,0,0:0:0:0: -475,192,163960,1,0,0:0:0:0: -182,192,163960,1,0,0:0:0:0: -36,192,164160,128,0,164360:0:0:0:0: -182,192,164160,1,0,0:0:0:0: -475,192,164160,1,0,0:0:0:0: -256,192,164210,1,0,0:0:0:0: -329,192,164260,1,0,0:0:0:0: -402,192,164310,1,0,0:0:0:0: -182,192,164360,128,0,164460:0:0:0:0: -329,192,164360,128,0,164460:0:0:0:0: -256,192,164360,1,0,0:0:0:0: -109,192,164360,1,0,0:0:0:0: -475,192,164360,1,0,0:0:0:0: -256,192,164560,128,0,164760:0:0:0:0: -402,192,164560,128,0,164760:0:0:0:0: -182,192,164560,1,0,0:0:0:0: -36,192,164560,1,0,0:0:0:0: -475,192,164560,1,0,0:0:0:0: -182,192,164960,1,0,0:0:0:0: -36,192,164960,1,0,0:0:0:0: -329,192,164960,1,0,0:0:0:0: -475,192,164960,1,0,0:0:0:0: -109,192,165360,1,0,0:0:0:0: -256,192,165360,1,0,0:0:0:0: -402,192,165360,1,0,0:0:0:0: -475,192,165560,128,0,165945:0:0:0:0: -36,192,165560,1,0,0:0:0:0: -109,192,165560,1,0,0:0:0:0: -182,192,165560,1,0,0:0:0:0: -256,192,165656,1,0,0:0:0:0: -329,192,165656,1,0,0:0:0:0: -109,192,165752,1,0,0:0:0:0: -182,192,165752,1,0,0:0:0:0: -329,192,165849,1,0,0:0:0:0: -402,192,165849,1,0,0:0:0:0: -36,192,165945,128,0,166138:0:0:0:0: -256,192,165945,1,0,0:0:0:0: -182,192,165945,1,0,0:0:0:0: -109,192,165945,1,0,0:0:0:0: -329,192,166042,1,0,0:0:0:0: -402,192,166042,1,0,0:0:0:0: -475,192,166138,128,0,166524:0:0:0:0: -109,192,166138,1,0,0:0:0:0: -182,192,166138,1,0,0:0:0:0: -256,192,166235,1,0,0:0:0:0: -329,192,166235,1,0,0:0:0:0: -182,192,166331,1,0,0:0:0:0: -109,192,166331,1,0,0:0:0:0: -36,192,166331,1,0,0:0:0:0: -329,192,166428,1,0,0:0:0:0: -402,192,166428,1,0,0:0:0:0: -36,192,166524,128,0,166717:0:0:0:0: -109,192,166524,1,0,0:0:0:0: -182,192,166524,1,0,0:0:0:0: -329,192,166621,1,0,0:0:0:0: -402,192,166621,1,0,0:0:0:0: -475,192,166717,128,0,167103:0:0:0:0: -256,192,166717,1,0,0:0:0:0: -182,192,166717,1,0,0:0:0:0: -109,192,166717,1,0,0:0:0:0: -329,192,166814,1,0,0:0:0:0: -402,192,166814,1,0,0:0:0:0: -36,192,166910,1,0,0:0:0:0: -109,192,166910,1,0,0:0:0:0: -329,192,167006,1,0,0:0:0:0: -402,192,167006,1,0,0:0:0:0: -36,192,167103,128,0,167287:0:0:0:0: -182,192,167103,1,0,0:0:0:0: -109,192,167103,1,0,0:0:0:0: -256,192,167103,1,0,0:0:0:0: -402,192,167195,1,0,0:0:0:0: -329,192,167195,1,0,0:0:0:0: -475,192,167287,128,0,167839:0:0:0:0: -109,192,167287,1,0,0:0:0:0: -182,192,167287,1,0,0:0:0:0: -256,192,167379,1,0,0:0:0:0: -329,192,167379,1,0,0:0:0:0: -402,192,167471,1,0,0:0:0:0: -36,192,167471,1,0,0:0:0:0: -109,192,167471,1,0,0:0:0:0: -182,192,167563,1,0,0:0:0:0: -256,192,167563,1,0,0:0:0:0: -402,192,167655,1,0,0:0:0:0: -329,192,167655,1,0,0:0:0:0: -109,192,167747,1,0,0:0:0:0: -182,192,167747,1,0,0:0:0:0: -256,192,167839,1,0,0:0:0:0: -402,192,167839,1,0,0:0:0:0: -329,192,167839,1,0,0:0:0:0: -109,192,167931,1,0,0:0:0:0: -36,192,167931,1,0,0:0:0:0: -329,192,168023,1,0,0:0:0:0: -402,192,168023,1,0,0:0:0:0: -182,192,168115,1,0,0:0:0:0: -109,192,168115,1,0,0:0:0:0: -475,192,168207,128,0,168575:0:0:0:0: -256,192,168207,1,0,0:0:0:0: -329,192,168207,1,0,0:0:0:0: -402,192,168207,1,0,0:0:0:0: -36,192,168299,1,0,0:0:0:0: -109,192,168299,1,0,0:0:0:0: -329,192,168391,1,0,0:0:0:0: -402,192,168391,1,0,0:0:0:0: -182,192,168483,1,0,0:0:0:0: -109,192,168483,1,0,0:0:0:0: -36,192,168575,128,0,168923:0:0:0:0: -329,192,168575,1,0,0:0:0:0: -256,192,168575,1,0,0:0:0:0: -402,192,168575,1,0,0:0:0:0: -182,192,168662,1,0,0:0:0:0: -109,192,168662,1,0,0:0:0:0: -329,192,168749,1,0,0:0:0:0: -402,192,168749,1,0,0:0:0:0: -182,192,168836,1,0,0:0:0:0: -109,192,168836,1,0,0:0:0:0: -475,192,168923,128,0,169098:0:0:0:0: -256,192,168923,1,0,0:0:0:0: -329,192,168923,1,0,0:0:0:0: -402,192,168923,1,0,0:0:0:0: -109,192,169011,1,0,0:0:0:0: -182,192,169011,1,0,0:0:0:0: -36,192,169098,128,0,169447:0:0:0:0: -329,192,169098,1,0,0:0:0:0: -402,192,169098,1,0,0:0:0:0: -256,192,169185,1,0,0:0:0:0: -182,192,169185,1,0,0:0:0:0: -329,192,169272,1,0,0:0:0:0: -402,192,169272,1,0,0:0:0:0: -475,192,169272,1,0,0:0:0:0: -182,192,169359,1,0,0:0:0:0: -109,192,169359,1,0,0:0:0:0: -475,192,169447,128,0,169621:0:0:0:0: -256,192,169447,1,0,0:0:0:0: -329,192,169447,1,0,0:0:0:0: -182,192,169534,1,0,0:0:0:0: -109,192,169534,1,0,0:0:0:0: -36,192,169621,128,0,169795:0:0:0:0: -256,192,169621,1,0,0:0:0:0: -329,192,169621,1,0,0:0:0:0: -402,192,169621,1,0,0:0:0:0: -182,192,169708,1,0,0:0:0:0: -109,192,169708,1,0,0:0:0:0: -475,192,169795,128,0,169970:0:0:0:0: -329,192,169795,1,0,0:0:0:0: -402,192,169795,1,0,0:0:0:0: -109,192,169883,1,0,0:0:0:0: -182,192,169883,1,0,0:0:0:0: -36,192,169970,128,0,170136:0:0:0:0: -329,192,169970,1,0,0:0:0:0: -402,192,169970,1,0,0:0:0:0: -256,192,169970,1,0,0:0:0:0: -109,192,170053,1,0,0:0:0:0: -182,192,170053,1,0,0:0:0:0: -475,192,170136,128,0,170636:0:0:0:0: -402,192,170136,1,0,0:0:0:0: -329,192,170136,1,0,0:0:0:0: -36,192,170220,1,0,0:0:0:0: -109,192,170220,1,0,0:0:0:0: -402,192,170303,1,0,0:0:0:0: -256,192,170303,1,0,0:0:0:0: -329,192,170303,1,0,0:0:0:0: -109,192,170386,1,0,0:0:0:0: -36,192,170386,1,0,0:0:0:0: -182,192,170470,1,0,0:0:0:0: -256,192,170470,1,0,0:0:0:0: -329,192,170553,1,0,0:0:0:0: -402,192,170553,1,0,0:0:0:0: -182,192,170636,1,0,0:0:0:0: -109,192,170636,1,0,0:0:0:0: -36,192,170636,1,0,0:0:0:0: -256,192,170720,1,0,0:0:0:0: -329,192,170720,1,0,0:0:0:0: -402,192,170803,1,0,0:0:0:0: -475,192,170803,1,0,0:0:0:0: -329,192,170886,1,0,0:0:0:0: -256,192,170886,1,0,0:0:0:0: -109,192,170970,128,0,171303:0:0:0:0: -182,192,170970,1,0,0:0:0:0: -36,192,170970,1,0,0:0:0:0: -402,192,170970,1,0,0:0:0:0: -475,192,170970,1,0,0:0:0:0: -329,192,171136,1,0,0:0:0:0: -475,192,171136,1,0,0:0:0:0: -36,192,171136,1,0,0:0:0:0: -182,192,171303,128,0,171618:0:0:0:0: -36,192,171303,1,0,0:0:0:0: -256,192,171303,1,0,0:0:0:0: -402,192,171303,1,0,0:0:0:0: -475,192,171303,1,0,0:0:0:0: -256,192,171460,1,0,0:0:0:0: -402,192,171460,1,0,0:0:0:0: -36,192,171460,1,0,0:0:0:0: -329,192,171618,128,0,171934:0:0:0:0: -36,192,171618,1,0,0:0:0:0: -256,192,171618,1,0,0:0:0:0: -475,192,171618,1,0,0:0:0:0: -109,192,171618,1,0,0:0:0:0: -109,192,171776,1,0,0:0:0:0: -256,192,171776,1,0,0:0:0:0: -475,192,171776,1,0,0:0:0:0: -402,192,171934,128,0,172250:0:0:0:0: -109,192,171934,1,0,0:0:0:0: -182,192,171934,1,0,0:0:0:0: -475,192,171934,1,0,0:0:0:0: -36,192,171934,1,0,0:0:0:0: -182,192,172092,1,0,0:0:0:0: -329,192,172092,1,0,0:0:0:0: -36,192,172092,1,0,0:0:0:0: -475,192,172250,128,0,172565:0:0:0:0: -36,192,172250,1,0,0:0:0:0: -256,192,172250,1,0,0:0:0:0: -329,192,172565,128,0,172881:0:0:0:0: -36,192,172565,1,0,0:0:0:0: -182,192,172565,1,0,0:0:0:0: -36,192,172881,128,0,173197:0:0:0:0: -182,192,172881,1,0,0:0:0:0: -402,192,172881,1,0,0:0:0:0: -182,192,173197,128,0,173513:0:0:0:0: -329,192,173197,1,0,0:0:0:0: -475,192,173197,1,0,0:0:0:0: -109,192,173513,128,0,173671:0:0:0:0: -256,192,173513,128,0,173671:0:0:0:0: -36,192,173513,1,0,0:0:0:0: -329,192,173513,1,0,0:0:0:0: -475,192,173513,1,0,0:0:0:0: -36,192,173671,128,0,173828:0:0:0:0: -182,192,173671,128,0,173828:0:0:0:0: -402,192,173671,1,0,0:0:0:0: -475,192,173671,1,0,0:0:0:0: -475,192,173828,128,0,174065:0:0:0:0: -329,192,173828,128,0,174065:0:0:0:0: -402,192,173828,1,0,0:0:0:0: -256,192,173828,1,0,0:0:0:0: -182,192,173986,1,0,0:0:0:0: -36,192,173986,1,0,0:0:0:0: -36,192,174144,128,0,174302:0:0:0:0: -402,192,174144,1,0,0:0:0:0: -182,192,174144,128,0,174302:0:0:0:0: -329,192,174144,1,0,0:0:0:0: -475,192,174144,1,0,0:0:0:0: -109,192,174302,128,0,174460:0:0:0:0: -402,192,174302,1,0,0:0:0:0: -256,192,174302,128,0,174460:0:0:0:0: -475,192,174302,1,0,0:0:0:0: -36,192,174460,128,0,174697:0:0:0:0: -182,192,174460,128,0,174697:0:0:0:0: -475,192,174460,1,0,0:0:0:0: -329,192,174460,1,0,0:0:0:0: -329,192,174618,1,0,0:0:0:0: -256,192,174697,1,0,0:0:0:0: -329,192,174776,128,0,175013:0:0:0:0: -475,192,174776,128,0,175013:0:0:0:0: -402,192,174776,1,0,0:0:0:0: -36,192,174776,1,0,0:0:0:0: -182,192,174776,1,0,0:0:0:0: -36,192,174934,1,0,0:0:0:0: -109,192,174934,1,0,0:0:0:0: -256,192,175092,128,0,175250:0:0:0:0: -402,192,175092,128,0,175250:0:0:0:0: -475,192,175092,1,0,0:0:0:0: -36,192,175092,128,0,175250:0:0:0:0: -109,192,175092,1,0,0:0:0:0: -329,192,175250,128,0,175407:0:0:0:0: -475,192,175250,128,0,175407:0:0:0:0: -182,192,175250,1,0,0:0:0:0: -109,192,175328,1,0,0:0:0:0: -36,192,175407,128,0,175644:0:0:0:0: -402,192,175407,128,0,175644:0:0:0:0: -256,192,175407,1,0,0:0:0:0: -182,192,175486,128,0,175644:0:0:0:0: -109,192,175486,1,0,0:0:0:0: -329,192,175565,1,0,0:0:0:0: -256,192,175644,1,0,0:0:0:0: -475,192,175723,128,0,175960:0:0:0:0: -36,192,175723,128,0,175960:0:0:0:0: -109,192,175723,128,0,175802:0:0:0:0: -402,192,175723,128,0,175960:0:0:0:0: -182,192,175802,128,0,175881:0:0:0:0: -256,192,175881,128,0,175960:0:0:0:0: -109,192,175960,128,0,176039:0:0:0:0: -329,192,175960,128,0,176039:0:0:0:0: -182,192,176039,128,0,176276:0:0:0:0: -36,192,176039,128,0,176276:0:0:0:0: -402,192,176039,128,0,176197:0:0:0:0: -256,192,176039,128,0,176197:0:0:0:0: -475,192,176039,1,0,0:0:0:0: -475,192,176197,128,0,176355:0:0:0:0: -329,192,176197,128,0,176355:0:0:0:0: -36,192,176355,128,0,176592:0:0:0:0: -182,192,176355,128,0,176592:0:0:0:0: -109,192,176355,1,0,0:0:0:0: -256,192,176355,1,0,0:0:0:0: -402,192,176434,128,0,176671:0:0:0:0: -329,192,176513,128,0,176671:0:0:0:0: -256,192,176592,128,0,176671:0:0:0:0: -182,192,176671,128,0,176750:0:0:0:0: -36,192,176671,128,0,176907:0:0:0:0: -475,192,176671,128,0,176828:0:0:0:0: -109,192,176671,1,0,0:0:0:0: -109,192,176828,128,0,176907:0:0:0:0: -402,192,176828,128,0,176986:0:0:0:0: -256,192,176828,128,0,176907:0:0:0:0: -475,192,176986,128,0,177223:0:0:0:0: -329,192,176986,128,0,177065:0:0:0:0: -109,192,176986,128,0,177223:0:0:0:0: -36,192,176986,1,0,0:0:0:0: -182,192,177065,128,0,177223:0:0:0:0: -256,192,177144,128,0,177223:0:0:0:0: -402,192,177144,128,0,177223:0:0:0:0: -329,192,177302,128,0,177539:0:0:0:0: -475,192,177302,128,0,177539:0:0:0:0: -256,192,177302,128,0,177381:0:0:0:0: -36,192,177302,128,0,177381:0:0:0:0: -402,192,177302,1,0,0:0:0:0: -36,192,177460,128,0,177539:0:0:0:0: -182,192,177460,128,0,177539:0:0:0:0: -109,192,177460,1,0,0:0:0:0: -256,192,177618,128,0,177776:0:0:0:0: -402,192,177618,128,0,177776:0:0:0:0: -475,192,177618,1,0,0:0:0:0: -109,192,177618,128,0,177697:0:0:0:0: -36,192,177697,128,0,177855:0:0:0:0: -182,192,177697,128,0,177855:0:0:0:0: -329,192,177776,128,0,177934:0:0:0:0: -475,192,177776,128,0,177934:0:0:0:0: -109,192,177855,128,0,178013:0:0:0:0: -256,192,177855,128,0,178013:0:0:0:0: -182,192,177934,128,0,178092:0:0:0:0: -36,192,177934,128,0,178092:0:0:0:0: -475,192,178013,128,0,178092:0:0:0:0: -329,192,178013,128,0,178092:0:0:0:0: -402,192,178092,128,0,178171:0:0:0:0: -256,192,178092,128,0,178171:0:0:0:0: -329,192,178171,128,0,178250:0:0:0:0: -182,192,178171,128,0,178250:0:0:0:0: -36,192,178250,128,0,178486:0:0:0:0: -475,192,178250,128,0,178407:0:0:0:0: -109,192,178250,128,0,178407:0:0:0:0: -329,192,178328,1,0,0:0:0:0: -256,192,178328,128,0,178407:0:0:0:0: -182,192,178407,128,0,178486:0:0:0:0: -402,192,178407,128,0,178486:0:0:0:0: -109,192,178486,128,0,178565:0:0:0:0: -329,192,178486,128,0,178565:0:0:0:0: -182,192,178565,128,0,178802:0:0:0:0: -36,192,178565,128,0,178802:0:0:0:0: -402,192,178565,128,0,178723:0:0:0:0: -256,192,178565,128,0,178723:0:0:0:0: -475,192,178565,1,0,0:0:0:0: -475,192,178723,128,0,178881:0:0:0:0: -329,192,178723,128,0,178881:0:0:0:0: -36,192,178881,128,0,179118:0:0:0:0: -182,192,178881,128,0,179118:0:0:0:0: -109,192,178881,1,0,0:0:0:0: -256,192,178881,1,0,0:0:0:0: -402,192,178960,128,0,179197:0:0:0:0: -329,192,179039,128,0,179197:0:0:0:0: -256,192,179118,128,0,179197:0:0:0:0: -182,192,179197,128,0,179355:0:0:0:0: -36,192,179197,128,0,179434:0:0:0:0: -475,192,179197,128,0,179355:0:0:0:0: -109,192,179197,1,0,0:0:0:0: -109,192,179355,128,0,179434:0:0:0:0: -402,192,179355,128,0,179513:0:0:0:0: -256,192,179355,128,0,179513:0:0:0:0: -475,192,179513,128,0,179750:0:0:0:0: -329,192,179513,128,0,179592:0:0:0:0: -109,192,179513,128,0,179592:0:0:0:0: -36,192,179513,1,0,0:0:0:0: -182,192,179592,128,0,179671:0:0:0:0: -256,192,179671,128,0,179750:0:0:0:0: -402,192,179671,128,0,179750:0:0:0:0: -36,192,179671,128,0,179907:0:0:0:0: -109,192,179750,128,0,179907:0:0:0:0: -329,192,179828,128,0,180065:0:0:0:0: -475,192,179828,128,0,180065:0:0:0:0: -256,192,179828,128,0,179907:0:0:0:0: -402,192,179828,1,0,0:0:0:0: -36,192,179986,128,0,180065:0:0:0:0: -182,192,179986,128,0,180065:0:0:0:0: -109,192,179986,1,0,0:0:0:0: -256,192,180144,128,0,180381:0:0:0:0: -109,192,180144,128,0,180381:0:0:0:0: -475,192,180144,128,0,180223:0:0:0:0: -329,192,180144,128,0,180223:0:0:0:0: -36,192,180144,1,0,0:0:0:0: -182,192,180302,128,0,180539:0:0:0:0: -36,192,180302,128,0,180539:0:0:0:0: -402,192,180302,128,0,180381:0:0:0:0: -475,192,180460,128,0,180618:0:0:0:0: -109,192,180460,128,0,180776:0:0:0:0: -329,192,180460,1,0,0:0:0:0: -402,192,180539,128,0,180697:0:0:0:0: -256,192,180539,1,0,0:0:0:0: -329,192,180618,128,0,180776:0:0:0:0: -182,192,180618,1,0,0:0:0:0: -256,192,180697,128,0,180934:0:0:0:0: -36,192,180776,128,0,181013:0:0:0:0: -475,192,180776,128,0,181013:0:0:0:0: -182,192,180776,128,0,181013:0:0:0:0: -402,192,180855,128,0,180934:0:0:0:0: -329,192,180934,128,0,181013:0:0:0:0: -402,192,181013,128,0,181092:0:0:0:0: -329,192,181092,128,0,181328:0:0:0:0: -475,192,181092,128,0,181328:0:0:0:0: -109,192,181092,128,0,181250:0:0:0:0: -256,192,181092,128,0,181250:0:0:0:0: -36,192,181092,1,0,0:0:0:0: -36,192,181250,128,0,181407:0:0:0:0: -182,192,181250,128,0,181407:0:0:0:0: -475,192,181407,128,0,181644:0:0:0:0: -329,192,181407,128,0,181644:0:0:0:0: -402,192,181407,1,0,0:0:0:0: -256,192,181407,1,0,0:0:0:0: -109,192,181486,128,0,181723:0:0:0:0: -182,192,181565,128,0,181723:0:0:0:0: -256,192,181644,128,0,181723:0:0:0:0: -329,192,181723,128,0,181802:0:0:0:0: -475,192,181723,128,0,181960:0:0:0:0: -36,192,181723,128,0,182039:0:0:0:0: -402,192,181723,1,0,0:0:0:0: -402,192,181881,128,0,181960:0:0:0:0: -182,192,181881,128,0,182039:0:0:0:0: -256,192,181881,128,0,181960:0:0:0:0: -475,192,182039,128,0,182276:0:0:0:0: -329,192,182039,128,0,182118:0:0:0:0: -109,192,182039,128,0,182197:0:0:0:0: -182,192,182118,128,0,182276:0:0:0:0: -256,192,182197,128,0,182276:0:0:0:0: -402,192,182197,128,0,182276:0:0:0:0: -36,192,182197,128,0,182434:0:0:0:0: -109,192,182276,128,0,182434:0:0:0:0: -256,192,182355,128,0,182434:0:0:0:0: -329,192,182355,128,0,182592:0:0:0:0: -402,192,182355,1,0,0:0:0:0: -475,192,182355,128,0,182592:0:0:0:0: -36,192,182513,128,0,182592:0:0:0:0: -109,192,182513,1,0,0:0:0:0: -182,192,182513,128,0,182592:0:0:0:0: -329,192,182671,128,0,182907:0:0:0:0: -475,192,182671,128,0,182907:0:0:0:0: -109,192,182671,128,0,182750:0:0:0:0: -256,192,182671,128,0,182750:0:0:0:0: -36,192,182671,128,0,182907:0:0:0:0: -182,192,182750,128,0,182986:0:0:0:0: -402,192,182750,128,0,182828:0:0:0:0: -109,192,182828,128,0,182907:0:0:0:0: -256,192,182907,128,0,182986:0:0:0:0: -402,192,182907,128,0,182986:0:0:0:0: -109,192,182986,128,0,183065:0:0:0:0: -329,192,182986,128,0,183223:0:0:0:0: -475,192,182986,128,0,183460:0:0:0:0: -36,192,182986,128,0,183065:0:0:0:0: -182,192,183065,128,0,183144:0:0:0:0: -402,192,183144,128,0,183223:0:0:0:0: -36,192,183144,128,0,183302:0:0:0:0: -256,192,183144,128,0,183223:0:0:0:0: -182,192,183223,128,0,183381:0:0:0:0: -109,192,183302,128,0,183460:0:0:0:0: -329,192,183302,128,0,183460:0:0:0:0: -256,192,183381,128,0,183539:0:0:0:0: -36,192,183381,128,0,183539:0:0:0:0: -402,192,183460,128,0,183539:0:0:0:0: -182,192,183460,128,0,183618:0:0:0:0: -329,192,183539,128,0,183618:0:0:0:0: -36,192,183618,1,0,0:0:0:0: -402,192,183618,1,0,0:0:0:0: -475,192,183618,1,0,0:0:0:0: -109,192,183618,128,0,183934:0:0:0:0: -182,192,183934,128,0,184250:0:0:0:0: -256,192,184250,128,0,184565:0:0:0:0: -329,192,184565,128,0,184881:0:0:0:0: -36,192,184881,128,0,185355:0:0:0:0: -109,192,184881,128,0,185355:0:0:0:0: -475,192,184881,1,0,0:0:0:0: -256,192,184881,1,0,0:0:0:0: -475,192,185098,128,0,185592:0:0:0:0: -182,192,185098,1,0,0:0:0:0: -329,192,185098,128,0,185592:0:0:0:0: -36,192,185513,128,0,185750:0:0:0:0: -182,192,185513,128,0,185750:0:0:0:0: -109,192,185513,1,0,0:0:0:0: -329,192,185671,128,0,185828:0:0:0:0: -475,192,185671,128,0,185828:0:0:0:0: -402,192,185671,1,0,0:0:0:0: -36,192,185828,128,0,186039:0:0:0:0: -109,192,185828,128,0,186039:0:0:0:0: -182,192,185828,1,0,0:0:0:0: -475,192,186039,128,0,186302:0:0:0:0: -402,192,186039,128,0,186302:0:0:0:0: -256,192,186039,1,0,0:0:0:0: -329,192,186039,1,0,0:0:0:0: -182,192,186302,128,0,186618:0:0:0:0: -36,192,186302,128,0,186618:0:0:0:0: -256,192,186302,1,0,0:0:0:0: -402,192,186618,128,0,186934:0:0:0:0: -475,192,186618,1,0,0:0:0:0: -109,192,186657,128,0,186736:0:0:0:0: -182,192,186677,128,0,186756:0:0:0:0: -256,192,186697,128,0,186776:0:0:0:0: -36,192,186776,128,0,186934:0:0:0:0: -329,192,186934,128,0,187250:0:0:0:0: -475,192,186934,128,0,187250:0:0:0:0: -256,192,186934,1,0,0:0:0:0: -182,192,186986,1,0,0:0:0:0: -109,192,186986,1,0,0:0:0:0: -109,192,187250,128,0,187723:0:0:0:0: -36,192,187250,128,0,187723:0:0:0:0: -256,192,187250,1,0,0:0:0:0: -329,192,187407,1,0,0:0:0:0: -475,192,187407,1,0,0:0:0:0: -329,192,187625,128,0,187881:0:0:0:0: -475,192,187644,128,0,187881:0:0:0:0: -36,192,187881,128,0,188434:0:0:0:0: -109,192,187881,1,0,0:0:0:0: -256,192,187881,1,0,0:0:0:0: -402,192,188000,128,0,188157:0:0:0:0: -475,192,188039,128,0,188256:0:0:0:0: -329,192,188157,128,0,188355:0:0:0:0: -402,192,188256,128,0,188473:0:0:0:0: -256,192,188355,128,0,188513:0:0:0:0: -329,192,188473,128,0,188592:0:0:0:0: -182,192,188513,128,0,188671:0:0:0:0: -36,192,188513,128,0,188671:0:0:0:0: -256,192,188592,128,0,188671:0:0:0:0: -109,192,188671,1,0,0:0:0:0: -329,192,188671,1,0,0:0:0:0: -402,192,188671,1,0,0:0:0:0: -475,192,188671,1,0,0:0:0:0: -182,192,188828,1,0,0:0:0:0: -109,192,188828,1,0,0:0:0:0: -329,192,188828,1,0,0:0:0:0: -402,192,188828,1,0,0:0:0:0: -36,192,189144,1,0,0:0:0:0: -475,192,189144,1,0,0:0:0:0: -329,192,189144,1,0,0:0:0:0: -182,192,189144,1,0,0:0:0:0: -36,192,189460,1,0,0:0:0:0: -329,192,189460,1,0,0:0:0:0: -475,192,189460,1,0,0:0:0:0: -182,192,189460,1,0,0:0:0:0: -256,192,189460,1,0,0:0:0:0: -475,192,189776,1,0,0:0:0:0: -36,192,189776,1,0,0:0:0:0: -182,192,189776,1,0,0:0:0:0: -402,192,189828,1,0,0:0:0:0: -329,192,189881,1,0,0:0:0:0: -475,192,189934,128,0,191039:0:0:0:0: -256,192,189934,1,0,0:0:0:0: -109,192,189934,1,0,0:0:0:0: -36,192,189934,1,0,0:0:0:0: -182,192,189934,1,0,0:0:0:0: -109,192,190092,128,0,190250:0:0:0:0: -256,192,190092,1,0,0:0:0:0: -329,192,190092,1,0,0:0:0:0: -256,192,190250,128,0,190407:0:0:0:0: -182,192,190250,1,0,0:0:0:0: -402,192,190250,1,0,0:0:0:0: -36,192,190250,1,0,0:0:0:0: -402,192,190407,128,0,190565:0:0:0:0: -109,192,190407,1,0,0:0:0:0: -36,192,190407,1,0,0:0:0:0: -36,192,190565,128,0,190723:0:0:0:0: -329,192,190565,1,0,0:0:0:0: -182,192,190565,1,0,0:0:0:0: -256,192,190565,1,0,0:0:0:0: -182,192,190723,128,0,190881:0:0:0:0: -402,192,190723,1,0,0:0:0:0: -109,192,190723,1,0,0:0:0:0: -329,192,190881,128,0,191039:0:0:0:0: -402,192,190881,1,0,0:0:0:0: -256,192,190881,1,0,0:0:0:0: -36,192,190881,1,0,0:0:0:0: -256,192,191039,128,0,191197:0:0:0:0: -109,192,191039,128,0,191197:0:0:0:0: -182,192,191039,1,0,0:0:0:0: -36,192,191039,1,0,0:0:0:0: -329,192,191197,1,0,0:0:0:0: -475,192,191197,1,0,0:0:0:0: -182,192,191197,1,0,0:0:0:0: -36,192,191197,1,0,0:0:0:0: -475,192,191355,128,0,191513:0:0:0:0: -329,192,191355,128,0,191513:0:0:0:0: -182,192,191355,1,0,0:0:0:0: -36,192,191355,1,0,0:0:0:0: -256,192,191513,1,0,0:0:0:0: -109,192,191513,1,0,0:0:0:0: -402,192,191513,1,0,0:0:0:0: -36,192,191513,1,0,0:0:0:0: -182,192,191671,128,0,191828:0:0:0:0: -36,192,191671,128,0,191828:0:0:0:0: -329,192,191671,1,0,0:0:0:0: -475,192,191671,1,0,0:0:0:0: -402,192,191828,1,0,0:0:0:0: -256,192,191828,1,0,0:0:0:0: -109,192,191828,1,0,0:0:0:0: -475,192,191828,1,0,0:0:0:0: -402,192,191986,128,0,192144:0:0:0:0: -256,192,191986,128,0,192144:0:0:0:0: -182,192,191986,1,0,0:0:0:0: -36,192,191986,1,0,0:0:0:0: -109,192,192144,1,0,0:0:0:0: -329,192,192144,1,0,0:0:0:0: -475,192,192144,1,0,0:0:0:0: -36,192,192144,1,0,0:0:0:0: -182,192,192223,1,0,0:0:0:0: -256,192,192223,1,0,0:0:0:0: -329,192,192302,1,0,0:0:0:0: -475,192,192302,1,0,0:0:0:0: -36,192,192302,1,0,0:0:0:0: -182,192,192381,1,0,0:0:0:0: -109,192,192381,1,0,0:0:0:0: -256,192,192460,1,0,0:0:0:0: -402,192,192460,1,0,0:0:0:0: -475,192,192460,1,0,0:0:0:0: -36,192,192460,128,0,193723:0:0:0:0: -329,192,192460,1,0,0:0:0:0: -182,192,192618,128,0,192776:0:0:0:0: -475,192,192618,1,0,0:0:0:0: -329,192,192618,1,0,0:0:0:0: -329,192,192776,128,0,192934:0:0:0:0: -475,192,192776,1,0,0:0:0:0: -256,192,192776,1,0,0:0:0:0: -109,192,192776,1,0,0:0:0:0: -475,192,192934,128,0,193092:0:0:0:0: -402,192,192934,1,0,0:0:0:0: -182,192,192934,1,0,0:0:0:0: -109,192,193092,128,0,193250:0:0:0:0: -182,192,193092,1,0,0:0:0:0: -402,192,193092,1,0,0:0:0:0: -256,192,193092,1,0,0:0:0:0: -402,192,193250,128,0,193407:0:0:0:0: -329,192,193250,1,0,0:0:0:0: -475,192,193250,1,0,0:0:0:0: -256,192,193407,128,0,193565:0:0:0:0: -475,192,193407,1,0,0:0:0:0: -182,192,193407,1,0,0:0:0:0: -109,192,193407,1,0,0:0:0:0: -109,192,193565,128,0,193723:0:0:0:0: -329,192,193565,1,0,0:0:0:0: -475,192,193565,1,0,0:0:0:0: -475,192,193723,128,0,194907:0:0:0:0: -402,192,193723,1,0,0:0:0:0: -256,192,193723,1,0,0:0:0:0: -182,192,193723,1,0,0:0:0:0: -329,192,193881,128,0,194039:0:0:0:0: -182,192,193881,1,0,0:0:0:0: -36,192,193881,1,0,0:0:0:0: -182,192,194039,128,0,194197:0:0:0:0: -36,192,194039,1,0,0:0:0:0: -256,192,194039,1,0,0:0:0:0: -402,192,194039,1,0,0:0:0:0: -36,192,194197,128,0,194355:0:0:0:0: -402,192,194197,1,0,0:0:0:0: -256,192,194197,1,0,0:0:0:0: -109,192,194355,128,0,194513:0:0:0:0: -329,192,194355,128,0,194907:0:0:0:0: -182,192,194355,1,0,0:0:0:0: -402,192,194355,1,0,0:0:0:0: -182,192,194513,128,0,194671:0:0:0:0: -36,192,194513,1,0,0:0:0:0: -256,192,194513,1,0,0:0:0:0: -402,192,194671,128,0,194907:0:0:0:0: -256,192,194671,128,0,194907:0:0:0:0: -109,192,194671,1,0,0:0:0:0: -36,192,194671,1,0,0:0:0:0: -109,192,194828,128,0,194907:0:0:0:0: -36,192,194828,128,0,194907:0:0:0:0: -475,192,194986,128,0,195223:0:0:0:0: -36,192,194986,1,0,0:0:0:0: -182,192,194986,128,0,195144:0:0:0:0: -329,192,194986,1,0,0:0:0:0: -109,192,194986,1,0,0:0:0:0: -329,192,195144,128,0,195460:0:0:0:0: -36,192,195144,1,0,0:0:0:0: -256,192,195144,1,0,0:0:0:0: -475,192,195302,128,0,195460:0:0:0:0: -182,192,195302,1,0,0:0:0:0: -109,192,195302,1,0,0:0:0:0: -36,192,195460,128,0,195697:0:0:0:0: -109,192,195460,1,0,0:0:0:0: -402,192,195460,1,0,0:0:0:0: -256,192,195460,128,0,195618:0:0:0:0: -182,192,195460,1,0,0:0:0:0: -182,192,195618,128,0,195934:0:0:0:0: -329,192,195618,1,0,0:0:0:0: -475,192,195618,1,0,0:0:0:0: -36,192,195776,128,0,195934:0:0:0:0: -329,192,195776,1,0,0:0:0:0: -402,192,195776,1,0,0:0:0:0: -402,192,195934,128,0,196171:0:0:0:0: -329,192,195934,1,0,0:0:0:0: -475,192,195934,1,0,0:0:0:0: -109,192,195934,128,0,196092:0:0:0:0: -256,192,195934,1,0,0:0:0:0: -256,192,196092,128,0,196407:0:0:0:0: -182,192,196092,1,0,0:0:0:0: -36,192,196092,1,0,0:0:0:0: -402,192,196250,128,0,196407:0:0:0:0: -109,192,196250,1,0,0:0:0:0: -475,192,196250,1,0,0:0:0:0: -182,192,196407,128,0,196723:0:0:0:0: -36,192,196407,128,0,196723:0:0:0:0: -329,192,196407,128,0,196565:0:0:0:0: -475,192,196407,1,0,0:0:0:0: -109,192,196407,1,0,0:0:0:0: -475,192,196565,128,0,197039:0:0:0:0: -256,192,196565,1,0,0:0:0:0: -109,192,196565,1,0,0:0:0:0: -329,192,196723,128,0,197039:0:0:0:0: -256,192,196723,1,0,0:0:0:0: -402,192,196723,1,0,0:0:0:0: -36,192,196881,128,0,197355:0:0:0:0: -182,192,196881,1,0,0:0:0:0: -109,192,196881,1,0,0:0:0:0: -182,192,197039,128,0,197355:0:0:0:0: -256,192,197039,1,0,0:0:0:0: -402,192,197039,1,0,0:0:0:0: -329,192,197197,128,0,197513:0:0:0:0: -475,192,197197,1,0,0:0:0:0: -402,192,197197,1,0,0:0:0:0: -475,192,197355,128,0,197513:0:0:0:0: -109,192,197355,1,0,0:0:0:0: -256,192,197355,1,0,0:0:0:0: -36,192,197513,128,0,197750:0:0:0:0: -402,192,197513,128,0,197671:0:0:0:0: -256,192,197513,128,0,197671:0:0:0:0: -182,192,197513,1,0,0:0:0:0: -109,192,197513,1,0,0:0:0:0: -182,192,197671,128,0,197986:0:0:0:0: -329,192,197671,1,0,0:0:0:0: -475,192,197671,128,0,197750:0:0:0:0: -109,192,197671,1,0,0:0:0:0: -36,192,197828,128,0,197986:0:0:0:0: -256,192,197828,1,0,0:0:0:0: -402,192,197828,128,0,197907:0:0:0:0: -329,192,197828,1,0,0:0:0:0: -475,192,197986,128,0,198223:0:0:0:0: -256,192,197986,128,0,198144:0:0:0:0: -109,192,197986,128,0,198144:0:0:0:0: -329,192,197986,1,0,0:0:0:0: -402,192,197986,1,0,0:0:0:0: -329,192,198144,128,0,198460:0:0:0:0: -36,192,198144,128,0,198223:0:0:0:0: -182,192,198144,1,0,0:0:0:0: -402,192,198144,1,0,0:0:0:0: -475,192,198302,128,0,198460:0:0:0:0: -109,192,198302,128,0,198381:0:0:0:0: -256,192,198302,1,0,0:0:0:0: -182,192,198302,1,0,0:0:0:0: -109,192,198460,128,0,198697:0:0:0:0: -182,192,198460,1,0,0:0:0:0: -36,192,198460,1,0,0:0:0:0: -402,192,198460,128,0,198618:0:0:0:0: -256,192,198460,1,0,0:0:0:0: -256,192,198618,128,0,198934:0:0:0:0: -329,192,198618,1,0,0:0:0:0: -475,192,198618,128,0,198697:0:0:0:0: -182,192,198618,1,0,0:0:0:0: -109,192,198776,128,0,198934:0:0:0:0: -36,192,198776,1,0,0:0:0:0: -402,192,198776,128,0,198855:0:0:0:0: -182,192,198776,1,0,0:0:0:0: -329,192,198934,128,0,199250:0:0:0:0: -475,192,198934,128,0,199250:0:0:0:0: -36,192,198934,1,0,0:0:0:0: -182,192,198934,128,0,199092:0:0:0:0: -402,192,198934,1,0,0:0:0:0: -36,192,199092,128,0,199565:0:0:0:0: -109,192,199092,1,0,0:0:0:0: -256,192,199092,128,0,199171:0:0:0:0: -182,192,199250,128,0,199565:0:0:0:0: -402,192,199250,128,0,199407:0:0:0:0: -109,192,199250,128,0,199328:0:0:0:0: -475,192,199407,128,0,199960:0:0:0:0: -329,192,199407,128,0,199960:0:0:0:0: -256,192,199407,1,0,0:0:0:0: -256,192,199565,128,0,199960:0:0:0:0: -109,192,199565,128,0,199960:0:0:0:0: -36,192,199723,128,0,199960:0:0:0:0: -182,192,199881,128,0,199960:0:0:0:0: -402,192,199881,128,0,199960:0:0:0:0: -182,192,200039,1,0,0:0:0:0: -36,192,200039,1,0,0:0:0:0: -329,192,200039,1,0,0:0:0:0: -475,192,200039,1,0,0:0:0:0: -329,192,200197,1,0,0:0:0:0: -182,192,200355,1,0,0:0:0:0: -329,192,200513,1,0,0:0:0:0: -182,192,200671,1,0,0:0:0:0: -36,192,200671,1,0,0:0:0:0: -329,192,200671,1,0,0:0:0:0: -475,192,200671,1,0,0:0:0:0: -329,192,200828,1,0,0:0:0:0: -182,192,200986,1,0,0:0:0:0: -36,192,200986,1,0,0:0:0:0: -256,192,200986,128,0,201539:0:0:0:0: -475,192,200986,1,0,0:0:0:0: -329,192,201144,1,0,0:0:0:0: -182,192,201302,1,0,0:0:0:0: -329,192,201460,1,0,0:0:0:0: -256,192,201618,128,0,202565:0:0:0:0: -36,192,201618,1,0,0:0:0:0: -329,192,201618,1,0,0:0:0:0: -475,192,201618,1,0,0:0:0:0: -182,192,201776,1,0,0:0:0:0: -329,192,201934,1,0,0:0:0:0: -182,192,201934,1,0,0:0:0:0: -36,192,201934,1,0,0:0:0:0: -475,192,201934,1,0,0:0:0:0: -182,192,202092,1,0,0:0:0:0: -402,192,202250,1,0,0:0:0:0: -329,192,202328,1,0,0:0:0:0: -182,192,202407,1,0,0:0:0:0: -109,192,202486,1,0,0:0:0:0: -36,192,202565,1,0,0:0:0:0: -475,192,202565,128,0,202644:0:0:0:0: -329,192,202565,1,0,0:0:0:0: -402,192,202644,128,0,202723:0:0:0:0: -256,192,202644,1,0,0:0:0:0: -329,192,202723,128,0,202802:0:0:0:0: -36,192,202723,1,0,0:0:0:0: -109,192,202723,1,0,0:0:0:0: -256,192,202802,128,0,202960:0:0:0:0: -182,192,202802,1,0,0:0:0:0: -329,192,202881,128,0,203039:0:0:0:0: -36,192,202881,1,0,0:0:0:0: -109,192,202881,1,0,0:0:0:0: -402,192,202960,128,0,203118:0:0:0:0: -182,192,202960,1,0,0:0:0:0: -475,192,203039,128,0,203197:0:0:0:0: -36,192,203039,1,0,0:0:0:0: -109,192,203039,1,0,0:0:0:0: -256,192,203118,1,0,0:0:0:0: -36,192,203197,128,0,203828:0:0:0:0: -182,192,203197,128,0,203355:0:0:0:0: -109,192,203197,1,0,0:0:0:0: -329,192,203197,1,0,0:0:0:0: -402,192,203276,1,0,0:0:0:0: -256,192,203276,128,0,203434:0:0:0:0: -475,192,203355,1,0,0:0:0:0: -329,192,203355,128,0,203513:0:0:0:0: -109,192,203434,128,0,203592:0:0:0:0: -402,192,203434,1,0,0:0:0:0: -182,192,203513,128,0,203671:0:0:0:0: -475,192,203513,1,0,0:0:0:0: -256,192,203592,128,0,203750:0:0:0:0: -402,192,203592,1,0,0:0:0:0: -109,192,203671,128,0,203828:0:0:0:0: -475,192,203671,1,0,0:0:0:0: -182,192,203750,128,0,203828:0:0:0:0: -329,192,203750,1,0,0:0:0:0: -475,192,203828,128,0,204776:0:0:0:0: -256,192,203828,128,0,203947:0:0:0:0: -402,192,203828,1,0,0:0:0:0: -329,192,203907,128,0,204026:0:0:0:0: -402,192,203986,128,0,204105:0:0:0:0: -182,192,203986,128,0,204105:0:0:0:0: -36,192,203986,1,0,0:0:0:0: -256,192,204065,128,0,204184:0:0:0:0: -329,192,204144,128,0,204263:0:0:0:0: -109,192,204144,128,0,204263:0:0:0:0: -36,192,204144,1,0,0:0:0:0: -182,192,204223,128,0,204342:0:0:0:0: -256,192,204302,128,0,204421:0:0:0:0: -36,192,204302,128,0,204381:0:0:0:0: -402,192,204302,1,0,0:0:0:0: -109,192,204381,128,0,204460:0:0:0:0: -36,192,204460,128,0,204776:0:0:0:0: -182,192,204460,128,0,204539:0:0:0:0: -329,192,204460,1,0,0:0:0:0: -256,192,204539,128,0,204618:0:0:0:0: -402,192,204539,1,0,0:0:0:0: -329,192,204618,128,0,204697:0:0:0:0: -109,192,204618,1,0,0:0:0:0: -402,192,204697,128,0,204776:0:0:0:0: -182,192,204697,1,0,0:0:0:0: -256,192,204776,1,0,0:0:0:0: -109,192,204776,1,0,0:0:0:0: -329,192,204828,1,0,0:0:0:0: -402,192,204881,1,0,0:0:0:0: -182,192,204934,1,0,0:0:0:0: -256,192,204986,1,0,0:0:0:0: -329,192,205039,1,0,0:0:0:0: -109,192,205092,1,0,0:0:0:0: -36,192,205092,128,0,205565:0:0:0:0: -182,192,205092,128,0,205171:0:0:0:0: -475,192,205092,128,0,205407:0:0:0:0: -402,192,205092,128,0,205171:0:0:0:0: -329,192,205171,128,0,205250:0:0:0:0: -109,192,205250,1,0,0:0:0:0: -256,192,205250,128,0,205328:0:0:0:0: -402,192,205250,1,0,0:0:0:0: -329,192,205328,128,0,205407:0:0:0:0: -109,192,205407,1,0,0:0:0:0: -182,192,205407,128,0,205486:0:0:0:0: -402,192,205407,1,0,0:0:0:0: -256,192,205486,128,0,205565:0:0:0:0: -329,192,205486,1,0,0:0:0:0: -109,192,205565,128,0,205881:0:0:0:0: -475,192,205565,128,0,205723:0:0:0:0: -402,192,205565,1,0,0:0:0:0: -329,192,205644,128,0,205723:0:0:0:0: -182,192,205644,1,0,0:0:0:0: -256,192,205723,128,0,205881:0:0:0:0: -36,192,205723,1,0,0:0:0:0: -402,192,205802,128,0,205881:0:0:0:0: -182,192,205802,1,0,0:0:0:0: -36,192,205881,128,0,206039:0:0:0:0: -475,192,205881,128,0,206118:0:0:0:0: -329,192,205881,1,0,0:0:0:0: -402,192,205960,128,0,206039:0:0:0:0: -256,192,205960,1,0,0:0:0:0: -329,192,206039,128,0,206197:0:0:0:0: -109,192,206039,1,0,0:0:0:0: -182,192,206039,1,0,0:0:0:0: -256,192,206118,128,0,206197:0:0:0:0: -36,192,206197,128,0,206671:0:0:0:0: -475,192,206197,128,0,206276:0:0:0:0: -402,192,206197,1,0,0:0:0:0: -109,192,206197,1,0,0:0:0:0: -329,192,206276,128,0,206355:0:0:0:0: -182,192,206276,1,0,0:0:0:0: -256,192,206355,1,0,0:0:0:0: -402,192,206355,1,0,0:0:0:0: -475,192,206355,128,0,206592:0:0:0:0: -109,192,206355,128,0,206434:0:0:0:0: -182,192,206434,1,0,0:0:0:0: -329,192,206434,128,0,206592:0:0:0:0: -256,192,206513,1,0,0:0:0:0: -109,192,206513,128,0,206592:0:0:0:0: -402,192,206513,1,0,0:0:0:0: -182,192,206592,128,0,206671:0:0:0:0: -402,192,206671,128,0,206986:0:0:0:0: -475,192,206671,128,0,206828:0:0:0:0: -256,192,206671,128,0,206750:0:0:0:0: -109,192,206671,1,0,0:0:0:0: -36,192,206750,128,0,206828:0:0:0:0: -329,192,206828,128,0,206907:0:0:0:0: -182,192,206828,128,0,206907:0:0:0:0: -256,192,206828,1,0,0:0:0:0: -36,192,206907,128,0,206986:0:0:0:0: -109,192,206907,1,0,0:0:0:0: -475,192,206986,128,0,207223:0:0:0:0: -256,192,206986,128,0,207065:0:0:0:0: -329,192,206986,1,0,0:0:0:0: -182,192,206986,1,0,0:0:0:0: -109,192,207065,128,0,207144:0:0:0:0: -36,192,207065,1,0,0:0:0:0: -402,192,207144,128,0,207460:0:0:0:0: -329,192,207144,128,0,207223:0:0:0:0: -256,192,207144,1,0,0:0:0:0: -182,192,207223,1,0,0:0:0:0: -36,192,207223,128,0,207302:0:0:0:0: -329,192,207302,1,0,0:0:0:0: -475,192,207302,1,0,0:0:0:0: -109,192,207302,128,0,207381:0:0:0:0: -256,192,207302,1,0,0:0:0:0: -36,192,207381,128,0,207460:0:0:0:0: -182,192,207381,1,0,0:0:0:0: -109,192,207460,128,0,207934:0:0:0:0: -256,192,207460,128,0,207618:0:0:0:0: -475,192,207460,1,0,0:0:0:0: -402,192,207539,128,0,207618:0:0:0:0: -182,192,207618,1,0,0:0:0:0: -475,192,207618,128,0,207697:0:0:0:0: -36,192,207618,1,0,0:0:0:0: -329,192,207697,128,0,207855:0:0:0:0: -256,192,207697,1,0,0:0:0:0: -475,192,207776,128,0,207855:0:0:0:0: -182,192,207776,1,0,0:0:0:0: -36,192,207776,1,0,0:0:0:0: -402,192,207855,128,0,207934:0:0:0:0: -256,192,207855,1,0,0:0:0:0: -329,192,207934,128,0,208407:0:0:0:0: -182,192,207934,128,0,208092:0:0:0:0: -475,192,207934,1,0,0:0:0:0: -36,192,207934,128,0,208013:0:0:0:0: -109,192,208013,128,0,208171:0:0:0:0: -402,192,208013,1,0,0:0:0:0: -475,192,208092,128,0,208171:0:0:0:0: -36,192,208092,1,0,0:0:0:0: -256,192,208092,1,0,0:0:0:0: -402,192,208171,128,0,208250:0:0:0:0: -182,192,208171,1,0,0:0:0:0: -36,192,208250,128,0,208407:0:0:0:0: -109,192,208250,1,0,0:0:0:0: -475,192,208250,128,0,208328:0:0:0:0: -256,192,208328,128,0,208407:0:0:0:0: -182,192,208407,128,0,208723:0:0:0:0: -475,192,208407,128,0,208565:0:0:0:0: -402,192,208407,128,0,208486:0:0:0:0: -109,192,208407,1,0,0:0:0:0: -256,192,208486,1,0,0:0:0:0: -329,192,208565,128,0,208723:0:0:0:0: -109,192,208565,1,0,0:0:0:0: -36,192,208565,1,0,0:0:0:0: -402,192,208644,128,0,208723:0:0:0:0: -256,192,208644,1,0,0:0:0:0: -36,192,208723,128,0,209197:0:0:0:0: -475,192,208723,128,0,208802:0:0:0:0: -109,192,208723,1,0,0:0:0:0: -256,192,208802,128,0,208881:0:0:0:0: -329,192,208802,1,0,0:0:0:0: -475,192,208881,128,0,209039:0:0:0:0: -109,192,208881,1,0,0:0:0:0: -402,192,208881,128,0,209039:0:0:0:0: -182,192,208960,128,0,209039:0:0:0:0: -256,192,208960,1,0,0:0:0:0: -329,192,209039,128,0,209118:0:0:0:0: -109,192,209039,1,0,0:0:0:0: -402,192,209118,128,0,209276:0:0:0:0: -182,192,209118,1,0,0:0:0:0: -109,192,209197,128,0,209513:0:0:0:0: -256,192,209197,128,0,209276:0:0:0:0: -329,192,209197,1,0,0:0:0:0: -475,192,209276,128,0,209434:0:0:0:0: -182,192,209276,1,0,0:0:0:0: -329,192,209355,128,0,209434:0:0:0:0: -36,192,209355,1,0,0:0:0:0: -402,192,209434,128,0,209513:0:0:0:0: -256,192,209434,1,0,0:0:0:0: -329,192,209513,128,0,209671:0:0:0:0: -182,192,209513,128,0,209592:0:0:0:0: -36,192,209513,128,0,209671:0:0:0:0: -475,192,209513,1,0,0:0:0:0: -256,192,209592,128,0,209671:0:0:0:0: -475,192,209671,128,0,209828:0:0:0:0: -402,192,209671,128,0,209828:0:0:0:0: -109,192,209671,128,0,209750:0:0:0:0: -329,192,209750,128,0,209828:0:0:0:0: -182,192,209750,128,0,209828:0:0:0:0: -36,192,209828,128,0,209986:0:0:0:0: -256,192,209828,128,0,209907:0:0:0:0: -109,192,209828,1,0,0:0:0:0: -182,192,209907,128,0,209986:0:0:0:0: -256,192,209986,128,0,210065:0:0:0:0: -475,192,209986,128,0,210144:0:0:0:0: -329,192,209986,128,0,210144:0:0:0:0: -402,192,209986,1,0,0:0:0:0: -109,192,210065,128,0,210144:0:0:0:0: -402,192,210144,128,0,210460:0:0:0:0: -36,192,210144,128,0,210381:0:0:0:0: -256,192,210144,1,0,0:0:0:0: -182,192,210223,128,0,210302:0:0:0:0: -329,192,210223,1,0,0:0:0:0: -109,192,210302,128,0,210460:0:0:0:0: -475,192,210302,1,0,0:0:0:0: -256,192,210381,128,0,210460:0:0:0:0: -329,192,210460,128,0,210539:0:0:0:0: -36,192,210460,128,0,210776:0:0:0:0: -475,192,210460,128,0,210776:0:0:0:0: -182,192,210460,128,0,210539:0:0:0:0: -402,192,210539,128,0,210618:0:0:0:0: -256,192,210618,128,0,210697:0:0:0:0: -109,192,210618,1,0,0:0:0:0: -329,192,210697,128,0,210776:0:0:0:0: -182,192,210697,1,0,0:0:0:0: -109,192,210776,128,0,211092:0:0:0:0: -256,192,210776,128,0,211013:0:0:0:0: -402,192,210776,128,0,210855:0:0:0:0: -182,192,210855,1,0,0:0:0:0: -475,192,210934,128,0,211092:0:0:0:0: -402,192,210934,1,0,0:0:0:0: -36,192,210934,1,0,0:0:0:0: -329,192,211013,128,0,211092:0:0:0:0: -182,192,211092,128,0,211250:0:0:0:0: -402,192,211092,128,0,211171:0:0:0:0: -256,192,211092,1,0,0:0:0:0: -36,192,211092,128,0,211328:0:0:0:0: -109,192,211171,1,0,0:0:0:0: -329,192,211250,128,0,211328:0:0:0:0: -475,192,211250,128,0,211328:0:0:0:0: -402,192,211250,1,0,0:0:0:0: -182,192,211328,128,0,211407:0:0:0:0: -256,192,211328,1,0,0:0:0:0: -109,192,211407,128,0,211881:0:0:0:0: -475,192,211407,128,0,211486:0:0:0:0: -402,192,211407,1,0,0:0:0:0: -36,192,211407,128,0,211486:0:0:0:0: -329,192,211407,128,0,211565:0:0:0:0: -182,192,211486,128,0,211565:0:0:0:0: -256,192,211565,128,0,211881:0:0:0:0: -402,192,211565,128,0,211644:0:0:0:0: -36,192,211565,1,0,0:0:0:0: -475,192,211565,128,0,211644:0:0:0:0: -329,192,211644,128,0,211723:0:0:0:0: -182,192,211723,128,0,211802:0:0:0:0: -475,192,211723,1,0,0:0:0:0: -36,192,211723,128,0,211802:0:0:0:0: -329,192,211802,128,0,211881:0:0:0:0: -402,192,211881,128,0,212355:0:0:0:0: -36,192,211881,128,0,211960:0:0:0:0: -475,192,211881,128,0,211960:0:0:0:0: -329,192,211960,128,0,212039:0:0:0:0: -182,192,212039,128,0,212355:0:0:0:0: -256,192,212039,1,0,0:0:0:0: -36,192,212039,128,0,212118:0:0:0:0: -109,192,212039,1,0,0:0:0:0: -475,192,212118,128,0,212197:0:0:0:0: -36,192,212197,128,0,212276:0:0:0:0: -256,192,212197,1,0,0:0:0:0: -109,192,212197,128,0,212276:0:0:0:0: -329,192,212276,128,0,212355:0:0:0:0: -256,192,212355,128,0,212592:0:0:0:0: -109,192,212355,1,0,0:0:0:0: -36,192,212355,128,0,212434:0:0:0:0: -475,192,212355,128,0,212434:0:0:0:0: -182,192,212434,128,0,212592:0:0:0:0: -402,192,212434,1,0,0:0:0:0: -475,192,212513,128,0,212592:0:0:0:0: -36,192,212513,128,0,212592:0:0:0:0: -329,192,212513,128,0,212592:0:0:0:0: -109,192,212592,1,0,0:0:0:0: -402,192,212671,128,0,212907:0:0:0:0: -182,192,212671,128,0,212750:0:0:0:0: -36,192,212671,128,0,212750:0:0:0:0: -329,192,212671,128,0,212750:0:0:0:0: -475,192,212671,128,0,212750:0:0:0:0: -256,192,212671,128,0,212907:0:0:0:0: -329,192,212828,128,0,212907:0:0:0:0: -475,192,212828,128,0,212907:0:0:0:0: -36,192,212828,128,0,212907:0:0:0:0: -182,192,212828,128,0,212907:0:0:0:0: -182,192,212986,128,0,213144:0:0:0:0: -475,192,212986,128,0,213065:0:0:0:0: -36,192,212986,128,0,213065:0:0:0:0: -256,192,213065,128,0,213302:0:0:0:0: -402,192,213065,128,0,213144:0:0:0:0: -109,192,213065,128,0,213144:0:0:0:0: -329,192,213144,128,0,213223:0:0:0:0: -475,192,213144,128,0,213223:0:0:0:0: -36,192,213144,128,0,213223:0:0:0:0: -182,192,213223,128,0,213381:0:0:0:0: -402,192,213223,128,0,213302:0:0:0:0: -36,192,213302,128,0,213381:0:0:0:0: -475,192,213302,128,0,213381:0:0:0:0: -329,192,213302,128,0,213539:0:0:0:0: -109,192,213302,128,0,213539:0:0:0:0: -475,192,213460,128,0,213539:0:0:0:0: -182,192,213460,128,0,213539:0:0:0:0: -36,192,213460,128,0,213539:0:0:0:0: -402,192,213460,128,0,213539:0:0:0:0: -36,192,213618,128,0,213776:0:0:0:0: -475,192,213618,128,0,213776:0:0:0:0: -256,192,213618,128,0,213697:0:0:0:0: -182,192,213697,128,0,213776:0:0:0:0: -329,192,213697,128,0,213776:0:0:0:0: -256,192,213776,128,0,213855:0:0:0:0: -109,192,213776,128,0,213855:0:0:0:0: -402,192,213776,128,0,213855:0:0:0:0: -182,192,213855,128,0,213934:0:0:0:0: -36,192,213855,128,0,214092:0:0:0:0: -329,192,213934,128,0,214092:0:0:0:0: -475,192,213934,128,0,214092:0:0:0:0: -256,192,213934,1,0,0:0:0:0: -402,192,213934,1,0,0:0:0:0: -109,192,214013,128,0,214250:0:0:0:0: -402,192,214092,128,0,214250:0:0:0:0: -256,192,214092,128,0,214250:0:0:0:0: -36,192,214171,1,0,0:0:0:0: -182,192,214171,128,0,214407:0:0:0:0: -329,192,214250,128,0,214407:0:0:0:0: -475,192,214250,128,0,214407:0:0:0:0: -36,192,214328,128,0,214486:0:0:0:0: -256,192,214407,1,0,0:0:0:0: -109,192,214407,128,0,214486:0:0:0:0: -402,192,214407,1,0,0:0:0:0: -182,192,214486,128,0,214565:0:0:0:0: -329,192,214486,1,0,0:0:0:0: -256,192,214565,128,0,214644:0:0:0:0: -475,192,214565,1,0,0:0:0:0: -182,192,214644,128,0,214723:0:0:0:0: -402,192,214644,1,0,0:0:0:0: -109,192,214723,128,0,214802:0:0:0:0: -329,192,214723,1,0,0:0:0:0: -475,192,214723,128,0,214881:0:0:0:0: -36,192,214802,128,0,214881:0:0:0:0: -256,192,214802,1,0,0:0:0:0: -402,192,214802,128,0,214960:0:0:0:0: -182,192,214881,1,0,0:0:0:0: -329,192,214881,128,0,215039:0:0:0:0: -256,192,214960,128,0,215118:0:0:0:0: -109,192,214960,1,0,0:0:0:0: -182,192,215039,128,0,215197:0:0:0:0: -36,192,215039,1,0,0:0:0:0: -475,192,215039,1,0,0:0:0:0: -109,192,215118,128,0,215197:0:0:0:0: -402,192,215118,1,0,0:0:0:0: -36,192,215197,128,0,215671:0:0:0:0: -329,192,215197,128,0,215355:0:0:0:0: -475,192,215197,128,0,215434:0:0:0:0: -256,192,215197,128,0,215276:0:0:0:0: -109,192,215276,128,0,215434:0:0:0:0: -256,192,215355,128,0,215513:0:0:0:0: -402,192,215355,128,0,215434:0:0:0:0: -182,192,215434,128,0,215513:0:0:0:0: -402,192,215513,128,0,215592:0:0:0:0: -329,192,215513,1,0,0:0:0:0: -109,192,215513,128,0,215592:0:0:0:0: -475,192,215513,128,0,215592:0:0:0:0: -256,192,215592,128,0,215671:0:0:0:0: -402,192,215671,128,0,215750:0:0:0:0: -109,192,215671,128,0,215828:0:0:0:0: -475,192,215671,128,0,215986:0:0:0:0: -182,192,215750,1,0,0:0:0:0: -329,192,215750,128,0,215828:0:0:0:0: -402,192,215828,128,0,215907:0:0:0:0: -36,192,215828,128,0,215986:0:0:0:0: -256,192,215828,128,0,215907:0:0:0:0: -182,192,215907,128,0,215986:0:0:0:0: -329,192,215986,128,0,216065:0:0:0:0: -109,192,215986,128,0,216302:0:0:0:0: -402,192,215986,128,0,216065:0:0:0:0: -182,192,216065,128,0,216144:0:0:0:0: -256,192,216065,1,0,0:0:0:0: -329,192,216144,128,0,216223:0:0:0:0: -36,192,216144,1,0,0:0:0:0: -475,192,216144,1,0,0:0:0:0: -256,192,216223,1,0,0:0:0:0: -402,192,216223,128,0,216302:0:0:0:0: -329,192,216302,128,0,216776:0:0:0:0: -182,192,216302,128,0,216381:0:0:0:0: -36,192,216302,128,0,216539:0:0:0:0: -475,192,216302,128,0,216618:0:0:0:0: -256,192,216381,128,0,216460:0:0:0:0: -109,192,216460,128,0,216539:0:0:0:0: -402,192,216460,1,0,0:0:0:0: -182,192,216539,128,0,216618:0:0:0:0: -256,192,216539,1,0,0:0:0:0: -36,192,216618,128,0,216776:0:0:0:0: -402,192,216618,1,0,0:0:0:0: -109,192,216618,128,0,216697:0:0:0:0: -256,192,216697,128,0,216776:0:0:0:0: -475,192,216776,128,0,217092:0:0:0:0: -109,192,216776,128,0,217013:0:0:0:0: -402,192,216776,128,0,216855:0:0:0:0: -182,192,216776,1,0,0:0:0:0: -256,192,216855,128,0,216934:0:0:0:0: -329,192,216855,1,0,0:0:0:0: -402,192,216934,128,0,217013:0:0:0:0: -182,192,216934,1,0,0:0:0:0: -36,192,216934,1,0,0:0:0:0: -329,192,217013,128,0,217092:0:0:0:0: -256,192,217013,1,0,0:0:0:0: -182,192,217092,128,0,217250:0:0:0:0: -36,192,217092,128,0,217171:0:0:0:0: -402,192,217092,128,0,217171:0:0:0:0: -109,192,217171,128,0,217407:0:0:0:0: -329,192,217171,128,0,217328:0:0:0:0: -256,192,217250,128,0,217407:0:0:0:0: -475,192,217250,128,0,217328:0:0:0:0: -36,192,217250,1,0,0:0:0:0: -402,192,217328,128,0,217486:0:0:0:0: -36,192,217407,128,0,217565:0:0:0:0: -475,192,217407,1,0,0:0:0:0: -182,192,217407,128,0,217486:0:0:0:0: -109,192,217486,128,0,217644:0:0:0:0: -329,192,217486,128,0,217565:0:0:0:0: -475,192,217565,128,0,218039:0:0:0:0: -182,192,217565,128,0,217723:0:0:0:0: -256,192,217565,1,0,0:0:0:0: -402,192,217565,1,0,0:0:0:0: -329,192,217644,128,0,217723:0:0:0:0: -36,192,217723,128,0,217960:0:0:0:0: -109,192,217723,1,0,0:0:0:0: -402,192,217723,128,0,217802:0:0:0:0: -256,192,217802,128,0,217881:0:0:0:0: -329,192,217802,1,0,0:0:0:0: -109,192,217881,128,0,218039:0:0:0:0: -402,192,217881,128,0,217960:0:0:0:0: -182,192,217960,128,0,218039:0:0:0:0: -256,192,217960,1,0,0:0:0:0: -402,192,218039,128,0,218118:0:0:0:0: -329,192,218039,1,0,0:0:0:0: -36,192,218039,128,0,218118:0:0:0:0: -182,192,218118,128,0,218197:0:0:0:0: -256,192,218118,1,0,0:0:0:0: -329,192,218197,128,0,218355:0:0:0:0: -109,192,218197,128,0,218276:0:0:0:0: -402,192,218197,1,0,0:0:0:0: -475,192,218197,128,0,218276:0:0:0:0: -36,192,218276,128,0,218355:0:0:0:0: -256,192,218276,1,0,0:0:0:0: -182,192,218355,128,0,218434:0:0:0:0: -109,192,218355,1,0,0:0:0:0: -475,192,218355,128,0,218513:0:0:0:0: -402,192,218434,128,0,218513:0:0:0:0: -256,192,218434,1,0,0:0:0:0: -109,192,218513,128,0,218828:0:0:0:0: -182,192,218513,128,0,218592:0:0:0:0: -36,192,218513,1,0,0:0:0:0: -329,192,218513,1,0,0:0:0:0: -256,192,218592,128,0,218671:0:0:0:0: -402,192,218592,1,0,0:0:0:0: -475,192,218671,128,0,218750:0:0:0:0: -36,192,218671,1,0,0:0:0:0: -329,192,218671,128,0,218750:0:0:0:0: -256,192,218750,128,0,218828:0:0:0:0: -36,192,218828,128,0,219223:0:0:0:0: -475,192,218828,128,0,218986:0:0:0:0: -182,192,218828,1,0,0:0:0:0: -402,192,218828,1,0,0:0:0:0: -329,192,218907,128,0,218986:0:0:0:0: -256,192,218907,1,0,0:0:0:0: -182,192,218986,128,0,219144:0:0:0:0: -402,192,218986,128,0,219065:0:0:0:0: -109,192,218986,1,0,0:0:0:0: -329,192,219065,128,0,219144:0:0:0:0: -256,192,219065,1,0,0:0:0:0: -475,192,219144,128,0,219302:0:0:0:0: -109,192,219144,128,0,219223:0:0:0:0: -402,192,219223,128,0,219302:0:0:0:0: -329,192,219223,1,0,0:0:0:0: -109,192,219302,128,0,219618:0:0:0:0: -256,192,219302,128,0,219381:0:0:0:0: -36,192,219302,128,0,219381:0:0:0:0: -182,192,219302,1,0,0:0:0:0: -329,192,219381,128,0,219460:0:0:0:0: -402,192,219381,1,0,0:0:0:0: -182,192,219460,128,0,219539:0:0:0:0: -475,192,219460,128,0,219618:0:0:0:0: -402,192,219539,128,0,219618:0:0:0:0: -256,192,219539,128,0,219618:0:0:0:0: -36,192,219618,128,0,219855:0:0:0:0: -182,192,219618,128,0,219697:0:0:0:0: -329,192,219697,128,0,219776:0:0:0:0: -475,192,219776,128,0,220092:0:0:0:0: -182,192,219776,128,0,219855:0:0:0:0: -256,192,219776,1,0,0:0:0:0: -402,192,219776,1,0,0:0:0:0: -329,192,219855,128,0,219934:0:0:0:0: -36,192,219934,128,0,220250:0:0:0:0: -256,192,219934,1,0,0:0:0:0: -109,192,219934,1,0,0:0:0:0: -182,192,219934,128,0,220092:0:0:0:0: -402,192,220092,128,0,220250:0:0:0:0: -256,192,220092,128,0,220250:0:0:0:0: -329,192,220092,1,0,0:0:0:0: -109,192,220092,1,0,0:0:0:0: -475,192,220250,128,0,220565:0:0:0:0: -109,192,220250,128,0,220328:0:0:0:0: -329,192,220250,128,0,220328:0:0:0:0: -182,192,220250,1,0,0:0:0:0: -256,192,220328,128,0,220407:0:0:0:0: -402,192,220328,1,0,0:0:0:0: -36,192,220407,128,0,220565:0:0:0:0: -109,192,220407,1,0,0:0:0:0: -329,192,220407,128,0,220486:0:0:0:0: -182,192,220486,128,0,220565:0:0:0:0: -402,192,220486,128,0,220565:0:0:0:0: -256,192,220565,128,0,220881:0:0:0:0: -329,192,220565,128,0,220644:0:0:0:0: -109,192,220565,1,0,0:0:0:0: -402,192,220644,128,0,220723:0:0:0:0: -182,192,220644,1,0,0:0:0:0: -475,192,220723,128,0,220881:0:0:0:0: -109,192,220723,128,0,220802:0:0:0:0: -36,192,220723,128,0,220802:0:0:0:0: -402,192,220802,128,0,220881:0:0:0:0: -329,192,220802,1,0,0:0:0:0: -36,192,220881,128,0,221118:0:0:0:0: -182,192,220881,128,0,220960:0:0:0:0: -109,192,220881,1,0,0:0:0:0: -329,192,220960,128,0,221039:0:0:0:0: -402,192,220960,1,0,0:0:0:0: -256,192,221039,128,0,221118:0:0:0:0: -475,192,221039,1,0,0:0:0:0: -109,192,221039,128,0,221118:0:0:0:0: -402,192,221118,128,0,221197:0:0:0:0: -256,192,221197,128,0,221513:0:0:0:0: -36,192,221197,128,0,221513:0:0:0:0: -475,192,221197,128,0,221355:0:0:0:0: -329,192,221197,1,0,0:0:0:0: -182,192,221197,128,0,221276:0:0:0:0: -402,192,221276,128,0,221434:0:0:0:0: -109,192,221276,128,0,221355:0:0:0:0: -329,192,221355,128,0,221434:0:0:0:0: -182,192,221355,128,0,221434:0:0:0:0: -475,192,221434,128,0,221513:0:0:0:0: -182,192,221513,128,0,221671:0:0:0:0: -329,192,221513,128,0,221671:0:0:0:0: -402,192,221513,128,0,221592:0:0:0:0: -109,192,221513,1,0,0:0:0:0: -475,192,221592,128,0,221671:0:0:0:0: -256,192,221671,128,0,221986:0:0:0:0: -109,192,221671,128,0,221986:0:0:0:0: -402,192,221671,128,0,221750:0:0:0:0: -36,192,221671,1,0,0:0:0:0: -329,192,221750,128,0,221828:0:0:0:0: -475,192,221828,128,0,221986:0:0:0:0: -182,192,221828,1,0,0:0:0:0: -36,192,221828,1,0,0:0:0:0: -402,192,221907,128,0,221986:0:0:0:0: -36,192,221986,128,0,222302:0:0:0:0: -182,192,221986,128,0,222302:0:0:0:0: -329,192,221986,128,0,222144:0:0:0:0: -402,192,222065,128,0,222223:0:0:0:0: -475,192,222144,128,0,222302:0:0:0:0: -109,192,222144,1,0,0:0:0:0: -256,192,222223,128,0,222302:0:0:0:0: -329,192,222302,128,0,222381:0:0:0:0: -402,192,222381,128,0,222460:0:0:0:0: -182,192,222381,128,0,222460:0:0:0:0: -36,192,222381,128,0,222460:0:0:0:0: -475,192,222460,128,0,222776:0:0:0:0: -329,192,222460,128,0,222776:0:0:0:0: -109,192,222460,128,0,222539:0:0:0:0: -256,192,222460,128,0,222539:0:0:0:0: -182,192,222539,128,0,222618:0:0:0:0: -36,192,222618,128,0,222697:0:0:0:0: -109,192,222618,128,0,222697:0:0:0:0: -402,192,222618,128,0,222697:0:0:0:0: -256,192,222697,128,0,222776:0:0:0:0: -36,192,222776,128,0,223486:0:0:0:0: -402,192,222776,128,0,222934:0:0:0:0: -109,192,222776,128,0,222934:0:0:0:0: -182,192,222776,128,0,222855:0:0:0:0: -329,192,222855,128,0,223013:0:0:0:0: -256,192,222934,128,0,223092:0:0:0:0: -182,192,223013,128,0,223171:0:0:0:0: -475,192,223013,128,0,223407:0:0:0:0: -402,192,223092,128,0,223328:0:0:0:0: -109,192,223092,128,0,223250:0:0:0:0: -329,192,223171,128,0,223250:0:0:0:0: -182,192,223250,128,0,223328:0:0:0:0: -256,192,223328,128,0,223407:0:0:0:0: -329,192,223407,128,0,223486:0:0:0:0: -109,192,223407,128,0,223565:0:0:0:0: -402,192,223486,128,0,223565:0:0:0:0: -182,192,223486,128,0,223644:0:0:0:0: -475,192,223565,128,0,223644:0:0:0:0: -256,192,223565,128,0,223723:0:0:0:0: -36,192,223565,128,0,223644:0:0:0:0: -329,192,223644,128,0,223802:0:0:0:0: -475,192,223723,128,0,224039:0:0:0:0: -402,192,223723,128,0,223881:0:0:0:0: -109,192,223723,128,0,223881:0:0:0:0: -36,192,223723,1,0,0:0:0:0: -182,192,223802,128,0,223960:0:0:0:0: -256,192,223881,128,0,224039:0:0:0:0: -36,192,223881,128,0,223960:0:0:0:0: -329,192,223960,128,0,224039:0:0:0:0: -109,192,223960,128,0,224039:0:0:0:0: -36,192,224039,128,0,224355:0:0:0:0: -182,192,224039,128,0,224118:0:0:0:0: -402,192,224039,128,0,224118:0:0:0:0: -329,192,224118,128,0,224197:0:0:0:0: -475,192,224118,128,0,224197:0:0:0:0: -256,192,224197,128,0,224355:0:0:0:0: -109,192,224197,128,0,224276:0:0:0:0: -402,192,224276,128,0,224355:0:0:0:0: -475,192,224276,1,0,0:0:0:0: -109,192,224355,128,0,224513:0:0:0:0: -329,192,224355,128,0,224592:0:0:0:0: -182,192,224355,128,0,224434:0:0:0:0: -475,192,224434,128,0,224513:0:0:0:0: -36,192,224434,128,0,224592:0:0:0:0: -402,192,224513,128,0,224671:0:0:0:0: -182,192,224513,128,0,224592:0:0:0:0: -256,192,224592,128,0,224671:0:0:0:0: -109,192,224592,1,0,0:0:0:0: -475,192,224671,128,0,224750:0:0:0:0: -182,192,224671,128,0,224907:0:0:0:0: -329,192,224671,128,0,224750:0:0:0:0: -36,192,224671,128,0,224750:0:0:0:0: -256,192,224750,128,0,224828:0:0:0:0: -329,192,224828,128,0,224986:0:0:0:0: -36,192,224828,1,0,0:0:0:0: -109,192,224828,1,0,0:0:0:0: -475,192,224828,128,0,224907:0:0:0:0: -256,192,224907,128,0,224986:0:0:0:0: -402,192,224907,1,0,0:0:0:0: -109,192,224986,128,0,225223:0:0:0:0: -475,192,224986,128,0,225065:0:0:0:0: -36,192,224986,128,0,225223:0:0:0:0: -182,192,224986,1,0,0:0:0:0: -402,192,225065,128,0,225144:0:0:0:0: -256,192,225065,1,0,0:0:0:0: -329,192,225144,128,0,225223:0:0:0:0: -182,192,225144,1,0,0:0:0:0: -256,192,225223,128,0,225302:0:0:0:0: -36,192,225302,128,0,226013:0:0:0:0: -475,192,225302,128,0,226013:0:0:0:0: -402,192,225302,1,0,0:0:0:0: -329,192,225302,1,0,0:0:0:0: -182,192,225302,1,0,0:0:0:0: -109,192,225302,1,0,0:0:0:0: -329,192,225460,1,0,0:0:0:0: -109,192,225460,1,0,0:0:0:0: -256,192,225460,1,0,0:0:0:0: -329,192,225776,1,0,0:0:0:0: -256,192,225776,1,0,0:0:0:0: -109,192,225776,1,0,0:0:0:0: -402,192,225934,1,0,0:0:0:0: -329,192,225934,1,0,0:0:0:0: -182,192,225934,1,0,0:0:0:0: -475,192,226092,1,0,0:0:0:0: -36,192,226092,1,0,0:0:0:0: -109,192,226092,1,0,0:0:0:0: -402,192,226092,1,0,0:0:0:0: -256,192,226092,1,0,0:0:0:0: -475,192,226250,128,0,226486:0:0:0:0: -36,192,226250,128,0,226486:0:0:0:0: -329,192,226250,1,0,0:0:0:0: -182,192,226250,1,0,0:0:0:0: -109,192,226250,1,0,0:0:0:0: -402,192,226407,1,0,0:0:0:0: -256,192,226407,1,0,0:0:0:0: -182,192,226407,1,0,0:0:0:0: -475,192,226565,128,0,227197:0:0:0:0: -36,192,226565,128,0,227197:0:0:0:0: -402,192,226723,1,0,0:0:0:0: -256,192,226723,1,0,0:0:0:0: -109,192,226723,1,0,0:0:0:0: -402,192,226881,1,0,0:0:0:0: -256,192,226881,1,0,0:0:0:0: -109,192,226881,1,0,0:0:0:0: -402,192,227197,1,0,0:0:0:0: -329,192,227197,1,0,0:0:0:0: -182,192,227197,1,0,0:0:0:0: -256,192,227276,1,0,0:0:0:0: -109,192,227276,1,0,0:0:0:0: -182,192,227355,1,0,0:0:0:0: -36,192,227355,1,0,0:0:0:0: -402,192,227434,1,0,0:0:0:0: -475,192,227434,1,0,0:0:0:0: -329,192,227434,1,0,0:0:0:0: -109,192,227513,1,0,0:0:0:0: -182,192,227513,1,0,0:0:0:0: -36,192,227513,1,0,0:0:0:0: -256,192,227592,1,0,0:0:0:0: -109,192,227671,1,0,0:0:0:0: -329,192,227671,1,0,0:0:0:0: -36,192,227671,1,0,0:0:0:0: -402,192,227750,1,0,0:0:0:0: -182,192,227750,1,0,0:0:0:0: -256,192,227828,1,0,0:0:0:0: -329,192,227828,1,0,0:0:0:0: -475,192,227828,1,0,0:0:0:0: -36,192,227828,128,0,228144:0:0:0:0: -182,192,228144,1,0,0:0:0:0: -475,192,228144,128,0,228381:0:0:0:0: -109,192,228144,1,0,0:0:0:0: -256,192,228144,1,0,0:0:0:0: -402,192,228184,128,0,228381:0:0:0:0: -329,192,228223,128,0,228381:0:0:0:0: -475,192,228460,128,0,228776:0:0:0:0: -36,192,228776,128,0,229013:0:0:0:0: -402,192,228776,1,0,0:0:0:0: -329,192,228776,1,0,0:0:0:0: -256,192,228776,1,0,0:0:0:0: -109,192,228815,128,0,229013:0:0:0:0: -182,192,228855,128,0,229013:0:0:0:0: -402,192,229092,128,0,229407:0:0:0:0: -109,192,229407,128,0,229644:0:0:0:0: -329,192,229407,1,0,0:0:0:0: -475,192,229407,1,0,0:0:0:0: -36,192,229407,1,0,0:0:0:0: -182,192,229447,128,0,229644:0:0:0:0: -256,192,229486,128,0,229644:0:0:0:0: -109,192,229723,128,0,230039:0:0:0:0: -402,192,229881,128,0,230197:0:0:0:0: -329,192,229921,128,0,230197:0:0:0:0: -256,192,229960,128,0,230197:0:0:0:0: -182,192,230197,128,0,230513:0:0:0:0: -36,192,230197,128,0,230513:0:0:0:0: -475,192,230197,1,0,0:0:0:0: -109,192,230197,1,0,0:0:0:0: -402,192,230513,128,0,230750:0:0:0:0: -475,192,230513,1,0,0:0:0:0: -329,192,230513,1,0,0:0:0:0: -256,192,230513,128,0,230592:0:0:0:0: -329,192,230671,128,0,230907:0:0:0:0: -36,192,230671,1,0,0:0:0:0: -475,192,230671,1,0,0:0:0:0: -182,192,230671,128,0,230750:0:0:0:0: -256,192,230828,128,0,231065:0:0:0:0: -402,192,230828,1,0,0:0:0:0: -36,192,230828,1,0,0:0:0:0: -109,192,230828,128,0,230907:0:0:0:0: -475,192,230986,128,0,231065:0:0:0:0: -329,192,230986,128,0,231223:0:0:0:0: -36,192,230986,1,0,0:0:0:0: -182,192,230986,128,0,231065:0:0:0:0: -402,192,231144,128,0,231223:0:0:0:0: -256,192,231144,128,0,231381:0:0:0:0: -36,192,231144,1,0,0:0:0:0: -109,192,231144,128,0,231223:0:0:0:0: -329,192,231302,128,0,231381:0:0:0:0: -182,192,231302,128,0,231539:0:0:0:0: -475,192,231302,1,0,0:0:0:0: -36,192,231302,128,0,231381:0:0:0:0: -402,192,231381,1,0,0:0:0:0: -256,192,231460,128,0,231539:0:0:0:0: -109,192,231460,128,0,231539:0:0:0:0: -329,192,231460,1,0,0:0:0:0: -36,192,231460,1,0,0:0:0:0: -475,192,231460,128,0,231539:0:0:0:0: -402,192,231539,1,0,0:0:0:0: -329,192,231618,128,0,231934:0:0:0:0: -475,192,231618,128,0,231934:0:0:0:0: -182,192,231618,1,0,0:0:0:0: -36,192,231618,1,0,0:0:0:0: -109,192,231618,1,0,0:0:0:0: -256,192,231618,1,0,0:0:0:0: -109,192,231934,128,0,232250:0:0:0:0: -402,192,232250,128,0,232565:0:0:0:0: -109,192,232565,128,0,232881:0:0:0:0: -475,192,232881,128,0,233513:0:0:0:0: -36,192,232881,1,0,0:0:0:0: -256,192,232881,1,0,0:0:0:0: -402,192,232881,1,0,0:0:0:0: -109,192,233513,128,0,233828:0:0:0:0: -256,192,233513,1,0,0:0:0:0: -36,192,233513,1,0,0:0:0:0: -402,192,233828,128,0,234144:0:0:0:0: -256,192,233828,1,0,0:0:0:0: -475,192,233828,1,0,0:0:0:0: -182,192,234144,128,0,234776:0:0:0:0: -36,192,234144,1,0,0:0:0:0: -475,192,234144,1,0,0:0:0:0: -329,192,234776,128,0,235407:0:0:0:0: -36,192,234776,1,0,0:0:0:0: -475,192,234776,1,0,0:0:0:0: -475,192,235407,128,0,236039:0:0:0:0: -182,192,235407,1,0,0:0:0:0: -36,192,235407,1,0,0:0:0:0: -182,192,236039,128,0,236355:0:0:0:0: -36,192,236039,1,0,0:0:0:0: -329,192,236039,1,0,0:0:0:0: -329,192,236355,128,0,236671:0:0:0:0: -475,192,236355,1,0,0:0:0:0: -36,192,236355,1,0,0:0:0:0: -109,192,236671,128,0,237302:0:0:0:0: -256,192,236671,1,0,0:0:0:0: -475,192,236671,1,0,0:0:0:0: -36,192,236671,1,0,0:0:0:0: -402,192,237302,128,0,237934:0:0:0:0: -256,192,237302,1,0,0:0:0:0: -36,192,237302,1,0,0:0:0:0: -475,192,237302,1,0,0:0:0:0: -329,192,237934,128,0,238565:0:0:0:0: -109,192,237934,128,0,238250:0:0:0:0: -256,192,237934,1,0,0:0:0:0: -36,192,237934,1,0,0:0:0:0: -475,192,237934,1,0,0:0:0:0: -182,192,238250,128,0,238565:0:0:0:0: -36,192,238250,1,0,0:0:0:0: -109,192,238565,128,0,239197:0:0:0:0: -402,192,238565,128,0,238881:0:0:0:0: -36,192,238565,1,0,0:0:0:0: -475,192,238565,1,0,0:0:0:0: -475,192,238881,128,0,239197:0:0:0:0: -256,192,238881,1,0,0:0:0:0: -36,192,239197,128,0,239671:0:0:0:0: -402,192,239197,1,0,0:0:0:0: -256,192,239197,1,0,0:0:0:0: -256,192,239671,128,0,240460:0:0:0:0: -402,192,239671,128,0,240460:0:0:0:0: -109,192,239671,1,0,0:0:0:0: -475,192,240460,128,0,241723:0:0:0:0: -182,192,240460,1,0,0:0:0:0: -36,192,240460,1,0,0:0:0:0: -329,192,240460,1,0,0:0:0:0: -36,192,240776,128,0,241407:0:0:0:0: -256,192,240776,1,0,0:0:0:0: -402,192,240776,1,0,0:0:0:0: -182,192,241092,128,0,241407:0:0:0:0: -329,192,241092,1,0,0:0:0:0: -329,192,241407,128,0,241723:0:0:0:0: -109,192,241407,1,0,0:0:0:0: -256,192,241723,1,0,0:0:0:0: -36,192,241723,128,0,242355:0:0:0:0: -402,192,241723,1,0,0:0:0:0: -182,192,241723,128,0,242355:0:0:0:0: -329,192,242039,1,0,0:0:0:0: -475,192,242039,1,0,0:0:0:0: -402,192,242355,128,0,242986:0:0:0:0: -475,192,242355,1,0,0:0:0:0: -109,192,242355,1,0,0:0:0:0: -256,192,242355,128,0,242986:0:0:0:0: -109,192,242671,1,0,0:0:0:0: -329,192,242986,128,0,243618:0:0:0:0: -475,192,242986,128,0,243618:0:0:0:0: -36,192,242986,128,0,243302:0:0:0:0: -182,192,242986,1,0,0:0:0:0: -109,192,242986,1,0,0:0:0:0: -182,192,243302,128,0,243618:0:0:0:0: -109,192,243302,1,0,0:0:0:0: -36,192,243618,128,0,244250:0:0:0:0: -256,192,243618,128,0,244250:0:0:0:0: -402,192,243618,128,0,243934:0:0:0:0: -109,192,243618,1,0,0:0:0:0: -475,192,243934,128,0,244250:0:0:0:0: -329,192,243934,1,0,0:0:0:0: -402,192,244250,128,0,244881:0:0:0:0: -329,192,244250,128,0,244881:0:0:0:0: -109,192,244250,128,0,245513:0:0:0:0: -182,192,244250,1,0,0:0:0:0: -256,192,244565,1,0,0:0:0:0: -36,192,244565,1,0,0:0:0:0: -182,192,244565,1,0,0:0:0:0: -475,192,244881,128,0,245197:0:0:0:0: -36,192,244881,1,0,0:0:0:0: -256,192,244881,1,0,0:0:0:0: -329,192,245197,128,0,245513:0:0:0:0: -182,192,245197,1,0,0:0:0:0: -36,192,245513,128,0,246144:0:0:0:0: -475,192,245513,128,0,245828:0:0:0:0: -402,192,245513,1,0,0:0:0:0: -256,192,245513,1,0,0:0:0:0: -182,192,245513,128,0,246144:0:0:0:0: -329,192,245828,128,0,246144:0:0:0:0: -256,192,245828,1,0,0:0:0:0: -475,192,246144,128,0,246302:0:0:0:0: -109,192,246144,1,0,0:0:0:0: -256,192,246144,1,0,0:0:0:0: -402,192,246223,128,0,246381:0:0:0:0: -182,192,246223,1,0,0:0:0:0: -329,192,246302,128,0,246539:0:0:0:0: -109,192,246302,1,0,0:0:0:0: -256,192,246381,128,0,246460:0:0:0:0: -36,192,246381,1,0,0:0:0:0: -402,192,246460,128,0,246618:0:0:0:0: -109,192,246460,1,0,0:0:0:0: -475,192,246539,128,0,246697:0:0:0:0: -182,192,246539,1,0,0:0:0:0: -256,192,246618,128,0,246855:0:0:0:0: -329,192,246697,128,0,246934:0:0:0:0: -402,192,246776,128,0,247013:0:0:0:0: -475,192,246855,128,0,247092:0:0:0:0: -182,192,246934,128,0,247131:0:0:0:0: -256,192,247013,128,0,247210:0:0:0:0: -329,192,247092,128,0,247289:0:0:0:0: -402,192,247171,128,0,247368:0:0:0:0: -109,192,247250,128,0,247407:0:0:0:0: -182,192,247328,128,0,247486:0:0:0:0: -256,192,247407,128,0,247565:0:0:0:0: -36,192,247486,128,0,247605:0:0:0:0: -329,192,247486,128,0,247644:0:0:0:0: -109,192,247565,128,0,247684:0:0:0:0: -182,192,247644,128,0,247763:0:0:0:0: -256,192,247723,128,0,247842:0:0:0:0: -36,192,247802,128,0,247907:0:0:0:0: -109,192,247881,128,0,247986:0:0:0:0: -182,192,248039,1,0,0:0:0:0: -475,192,248039,1,0,0:0:0:0: -329,192,248039,128,0,248276:0:0:0:0: -36,192,248039,128,0,248276:0:0:0:0: -182,192,248197,128,0,248513:0:0:0:0: -475,192,248197,128,0,248355:0:0:0:0: -329,192,248355,128,0,248513:0:0:0:0: -36,192,248355,128,0,248513:0:0:0:0: -109,192,248513,128,0,248750:0:0:0:0: -256,192,248513,128,0,248750:0:0:0:0: -402,192,248513,1,0,0:0:0:0: -475,192,248513,1,0,0:0:0:0: -475,192,248671,128,0,248986:0:0:0:0: -329,192,248671,128,0,248828:0:0:0:0: -402,192,248671,128,0,248828:0:0:0:0: -109,192,248828,128,0,248986:0:0:0:0: -256,192,248828,128,0,248986:0:0:0:0: -329,192,248986,128,0,249223:0:0:0:0: -36,192,248986,128,0,249223:0:0:0:0: -182,192,248986,1,0,0:0:0:0: -402,192,248986,1,0,0:0:0:0: -182,192,249144,128,0,249460:0:0:0:0: -475,192,249144,128,0,249381:0:0:0:0: -329,192,249302,128,0,249460:0:0:0:0: -36,192,249302,128,0,249460:0:0:0:0: -109,192,249460,128,0,249697:0:0:0:0: -256,192,249460,128,0,249697:0:0:0:0: -402,192,249460,1,0,0:0:0:0: -475,192,249460,1,0,0:0:0:0: -475,192,249618,128,0,249934:0:0:0:0: -329,192,249618,128,0,249776:0:0:0:0: -402,192,249618,128,0,249776:0:0:0:0: -109,192,249776,128,0,249934:0:0:0:0: -256,192,249776,128,0,249934:0:0:0:0: -182,192,249934,1,0,0:0:0:0: -402,192,249934,1,0,0:0:0:0: -36,192,249934,128,0,250250:0:0:0:0: -329,192,250092,128,0,250486:0:0:0:0: -475,192,250092,128,0,250486:0:0:0:0: -109,192,250092,1,0,0:0:0:0: -402,192,250092,1,0,0:0:0:0: -256,192,250171,128,0,250486:0:0:0:0: -182,192,250250,128,0,250486:0:0:0:0: -109,192,250328,128,0,250486:0:0:0:0: -36,192,250407,128,0,250486:0:0:0:0: -109,192,250565,1,0,0:0:0:0: -329,192,250565,128,0,250723:0:0:0:0: -36,192,250565,128,0,250802:0:0:0:0: -475,192,250565,128,0,250723:0:0:0:0: -182,192,250565,1,0,0:0:0:0: -256,192,250723,1,0,0:0:0:0: -402,192,250723,1,0,0:0:0:0: -182,192,250723,128,0,251039:0:0:0:0: -402,192,250881,1,0,0:0:0:0: -36,192,250881,128,0,251039:0:0:0:0: -475,192,250881,1,0,0:0:0:0: -256,192,251039,128,0,251197:0:0:0:0: -475,192,251039,128,0,251276:0:0:0:0: -402,192,251039,1,0,0:0:0:0: -109,192,251039,128,0,251197:0:0:0:0: -329,192,251039,1,0,0:0:0:0: -329,192,251197,128,0,251513:0:0:0:0: -182,192,251197,1,0,0:0:0:0: -36,192,251197,1,0,0:0:0:0: -36,192,251355,1,0,0:0:0:0: -475,192,251355,128,0,251513:0:0:0:0: -109,192,251355,1,0,0:0:0:0: -109,192,251513,1,0,0:0:0:0: -402,192,251513,128,0,251671:0:0:0:0: -36,192,251513,128,0,251750:0:0:0:0: -256,192,251513,128,0,251671:0:0:0:0: -182,192,251513,1,0,0:0:0:0: -182,192,251671,128,0,251986:0:0:0:0: -475,192,251671,1,0,0:0:0:0: -329,192,251671,1,0,0:0:0:0: -402,192,251828,1,0,0:0:0:0: -36,192,251828,128,0,251986:0:0:0:0: -475,192,251828,1,0,0:0:0:0: -109,192,251986,128,0,252144:0:0:0:0: -475,192,251986,128,0,252302:0:0:0:0: -329,192,251986,128,0,252302:0:0:0:0: -402,192,251986,1,0,0:0:0:0: -256,192,251986,1,0,0:0:0:0: -182,192,252144,1,0,0:0:0:0: -36,192,252144,128,0,252618:0:0:0:0: -256,192,252144,1,0,0:0:0:0: -402,192,252302,1,0,0:0:0:0: -182,192,252302,128,0,252460:0:0:0:0: -109,192,252302,128,0,252460:0:0:0:0: -256,192,252460,128,0,252618:0:0:0:0: -475,192,252460,128,0,252934:0:0:0:0: -329,192,252460,128,0,252618:0:0:0:0: -182,192,252618,128,0,252776:0:0:0:0: -109,192,252618,128,0,252776:0:0:0:0: -36,192,252776,128,0,253092:0:0:0:0: -402,192,252776,128,0,252934:0:0:0:0: -256,192,252776,128,0,252934:0:0:0:0: -182,192,252934,128,0,253092:0:0:0:0: -329,192,252934,128,0,253092:0:0:0:0: -109,192,253092,128,0,253250:0:0:0:0: -256,192,253092,128,0,253250:0:0:0:0: -475,192,253092,128,0,253328:0:0:0:0: -402,192,253092,1,0,0:0:0:0: -329,192,253250,128,0,253565:0:0:0:0: -182,192,253250,128,0,253407:0:0:0:0: -36,192,253250,128,0,253407:0:0:0:0: -402,192,253407,1,0,0:0:0:0: -475,192,253407,128,0,253565:0:0:0:0: -109,192,253407,128,0,253565:0:0:0:0: -256,192,253407,1,0,0:0:0:0: -256,192,253565,128,0,253723:0:0:0:0: -402,192,253565,128,0,253723:0:0:0:0: -36,192,253565,128,0,253802:0:0:0:0: -182,192,253565,1,0,0:0:0:0: -182,192,253723,128,0,254039:0:0:0:0: -329,192,253723,128,0,253881:0:0:0:0: -475,192,253723,128,0,253881:0:0:0:0: -109,192,253723,1,0,0:0:0:0: -109,192,253881,1,0,0:0:0:0: -36,192,253881,128,0,254039:0:0:0:0: -402,192,253881,128,0,254039:0:0:0:0: -256,192,253881,1,0,0:0:0:0: -109,192,254039,128,0,254197:0:0:0:0: -475,192,254039,128,0,254276:0:0:0:0: -329,192,254039,128,0,254276:0:0:0:0: -256,192,254039,128,0,254513:0:0:0:0: -36,192,254197,128,0,254355:0:0:0:0: -182,192,254197,128,0,254355:0:0:0:0: -402,192,254197,1,0,0:0:0:0: -402,192,254355,1,0,0:0:0:0: -475,192,254355,128,0,254513:0:0:0:0: -329,192,254355,1,0,0:0:0:0: -109,192,254355,128,0,254513:0:0:0:0: -402,192,254513,1,0,0:0:0:0: -329,192,254513,128,0,254671:0:0:0:0: -182,192,254513,128,0,254828:0:0:0:0: -36,192,254513,128,0,254828:0:0:0:0: -109,192,254671,1,0,0:0:0:0: -475,192,254671,128,0,255144:0:0:0:0: -402,192,254671,1,0,0:0:0:0: -109,192,254828,128,0,254986:0:0:0:0: -329,192,254828,128,0,255144:0:0:0:0: -256,192,254828,1,0,0:0:0:0: -402,192,254828,1,0,0:0:0:0: -402,192,254986,1,0,0:0:0:0: -182,192,254986,128,0,255539:0:0:0:0: -36,192,254986,128,0,255539:0:0:0:0: -256,192,255144,128,0,255539:0:0:0:0: -109,192,255144,128,0,255539:0:0:0:0: -329,192,255302,128,0,255539:0:0:0:0: -475,192,255460,128,0,255539:0:0:0:0: -402,192,255460,128,0,255539:0:0:0:0: -182,192,255618,1,0,0:0:0:0: -36,192,255618,1,0,0:0:0:0: -329,192,255618,1,0,0:0:0:0: -475,192,255618,1,0,0:0:0:0: -182,192,255776,1,0,0:0:0:0: -329,192,255934,1,0,0:0:0:0: -182,192,256092,1,0,0:0:0:0: -182,192,256250,1,0,0:0:0:0: -36,192,256250,1,0,0:0:0:0: -329,192,256250,1,0,0:0:0:0: -475,192,256250,1,0,0:0:0:0: -182,192,256407,1,0,0:0:0:0: -256,192,256565,128,0,257118:0:0:0:0: -36,192,256565,1,0,0:0:0:0: -329,192,256565,1,0,0:0:0:0: -475,192,256565,1,0,0:0:0:0: -182,192,256723,1,0,0:0:0:0: -329,192,256881,1,0,0:0:0:0: -475,192,256881,1,0,0:0:0:0: -182,192,257039,1,0,0:0:0:0: -475,192,257039,1,0,0:0:0:0: -182,192,257197,1,0,0:0:0:0: -36,192,257197,1,0,0:0:0:0: -256,192,257197,128,0,258144:0:0:0:0: -475,192,257197,1,0,0:0:0:0: -329,192,257355,1,0,0:0:0:0: -475,192,257355,1,0,0:0:0:0: -475,192,257513,1,0,0:0:0:0: -36,192,257513,1,0,0:0:0:0: -182,192,257513,1,0,0:0:0:0: -329,192,257513,1,0,0:0:0:0: -329,192,257671,1,0,0:0:0:0: -475,192,257671,1,0,0:0:0:0: -109,192,257828,1,0,0:0:0:0: -475,192,257828,1,0,0:0:0:0: -182,192,257907,1,0,0:0:0:0: -329,192,257986,1,0,0:0:0:0: -475,192,257986,1,0,0:0:0:0: -402,192,258065,1,0,0:0:0:0: -36,192,258144,128,0,258223:0:0:0:0: -475,192,258144,1,0,0:0:0:0: -182,192,258144,1,0,0:0:0:0: -109,192,258223,128,0,258302:0:0:0:0: -256,192,258223,1,0,0:0:0:0: -402,192,258302,1,0,0:0:0:0: -475,192,258302,1,0,0:0:0:0: -182,192,258302,128,0,258381:0:0:0:0: -329,192,258381,1,0,0:0:0:0: -256,192,258381,128,0,258539:0:0:0:0: -402,192,258460,1,0,0:0:0:0: -475,192,258460,1,0,0:0:0:0: -182,192,258460,128,0,258618:0:0:0:0: -329,192,258539,1,0,0:0:0:0: -109,192,258539,128,0,258697:0:0:0:0: -402,192,258618,1,0,0:0:0:0: -475,192,258618,1,0,0:0:0:0: -36,192,258618,128,0,258776:0:0:0:0: -256,192,258697,1,0,0:0:0:0: -402,192,258776,1,0,0:0:0:0: -182,192,258776,1,0,0:0:0:0: -475,192,258776,128,0,259407:0:0:0:0: -329,192,258776,128,0,258934:0:0:0:0: -256,192,258855,128,0,259013:0:0:0:0: -109,192,258855,1,0,0:0:0:0: -182,192,258934,128,0,259092:0:0:0:0: -36,192,258934,1,0,0:0:0:0: -109,192,259013,1,0,0:0:0:0: -402,192,259013,128,0,259171:0:0:0:0: -36,192,259092,1,0,0:0:0:0: -329,192,259092,128,0,259250:0:0:0:0: -109,192,259171,1,0,0:0:0:0: -256,192,259171,128,0,259328:0:0:0:0: -36,192,259250,1,0,0:0:0:0: -402,192,259250,128,0,259407:0:0:0:0: -182,192,259328,1,0,0:0:0:0: -329,192,259328,128,0,259407:0:0:0:0: -109,192,259407,1,0,0:0:0:0: -256,192,259407,128,0,259526:0:0:0:0: -36,192,259407,128,0,260276:0:0:0:0: -182,192,259486,128,0,259605:0:0:0:0: -329,192,259565,128,0,259684:0:0:0:0: -109,192,259565,128,0,259684:0:0:0:0: -475,192,259565,128,0,259644:0:0:0:0: -256,192,259644,128,0,259763:0:0:0:0: -475,192,259723,1,0,0:0:0:0: -402,192,259723,128,0,259842:0:0:0:0: -182,192,259723,128,0,259842:0:0:0:0: -329,192,259802,128,0,259921:0:0:0:0: -475,192,259881,128,0,259960:0:0:0:0: -256,192,259881,128,0,260000:0:0:0:0: -109,192,259881,128,0,259960:0:0:0:0: -402,192,259960,128,0,260039:0:0:0:0: -329,192,260039,128,0,260197:0:0:0:0: -475,192,260039,128,0,260355:0:0:0:0: -182,192,260039,128,0,260118:0:0:0:0: -256,192,260118,128,0,260276:0:0:0:0: -109,192,260118,128,0,260197:0:0:0:0: -182,192,260197,128,0,260355:0:0:0:0: -402,192,260197,128,0,260276:0:0:0:0: -109,192,260276,128,0,260355:0:0:0:0: -329,192,260276,128,0,260355:0:0:0:0: -402,192,260355,1,0,0:0:0:0: -256,192,260355,1,0,0:0:0:0: -36,192,260355,1,0,0:0:0:0: -109,192,260407,1,0,0:0:0:0: -182,192,260460,1,0,0:0:0:0: -256,192,260513,1,0,0:0:0:0: -329,192,260565,1,0,0:0:0:0: -402,192,260618,1,0,0:0:0:0: -109,192,260671,1,0,0:0:0:0: -475,192,260671,1,0,0:0:0:0: -256,192,260671,1,0,0:0:0:0: -36,192,260671,128,0,260986:0:0:0:0: -329,192,260750,1,0,0:0:0:0: -402,192,260750,1,0,0:0:0:0: -182,192,260750,1,0,0:0:0:0: -256,192,260828,1,0,0:0:0:0: -109,192,260828,1,0,0:0:0:0: -475,192,260828,1,0,0:0:0:0: -402,192,260907,1,0,0:0:0:0: -182,192,260907,1,0,0:0:0:0: -475,192,260986,128,0,261302:0:0:0:0: -329,192,260986,128,0,261144:0:0:0:0: -109,192,260986,128,0,261065:0:0:0:0: -256,192,260986,128,0,261065:0:0:0:0: -402,192,261065,128,0,261223:0:0:0:0: -182,192,261065,128,0,261144:0:0:0:0: -256,192,261144,128,0,261223:0:0:0:0: -36,192,261144,128,0,261223:0:0:0:0: -329,192,261223,128,0,261302:0:0:0:0: -109,192,261223,128,0,261381:0:0:0:0: -256,192,261302,128,0,261460:0:0:0:0: -36,192,261302,128,0,261539:0:0:0:0: -402,192,261302,128,0,261460:0:0:0:0: -182,192,261381,128,0,261539:0:0:0:0: -109,192,261460,128,0,261618:0:0:0:0: -475,192,261460,128,0,261697:0:0:0:0: -329,192,261460,128,0,261539:0:0:0:0: -256,192,261539,128,0,261618:0:0:0:0: -329,192,261618,128,0,261697:0:0:0:0: -182,192,261618,128,0,261776:0:0:0:0: -36,192,261618,128,0,261855:0:0:0:0: -402,192,261697,128,0,261776:0:0:0:0: -256,192,261697,128,0,261776:0:0:0:0: -109,192,261776,128,0,261934:0:0:0:0: -475,192,261776,128,0,261855:0:0:0:0: -329,192,261776,128,0,261855:0:0:0:0: -256,192,261855,128,0,262013:0:0:0:0: -402,192,261934,128,0,262171:0:0:0:0: -36,192,261934,128,0,262092:0:0:0:0: -182,192,261934,128,0,262092:0:0:0:0: -475,192,261934,128,0,262013:0:0:0:0: -329,192,262013,128,0,262092:0:0:0:0: -109,192,262013,128,0,262171:0:0:0:0: -256,192,262092,128,0,262171:0:0:0:0: -475,192,262092,128,0,262171:0:0:0:0: -36,192,262171,128,0,262250:0:0:0:0: -182,192,262171,128,0,262250:0:0:0:0: -329,192,262250,128,0,262565:0:0:0:0: -109,192,262250,128,0,262328:0:0:0:0: -402,192,262250,128,0,262328:0:0:0:0: -475,192,262250,128,0,262407:0:0:0:0: -256,192,262328,128,0,262407:0:0:0:0: -36,192,262328,128,0,262486:0:0:0:0: -182,192,262407,128,0,262565:0:0:0:0: -402,192,262407,128,0,262486:0:0:0:0: -109,192,262407,128,0,262486:0:0:0:0: -475,192,262486,128,0,262565:0:0:0:0: -109,192,262565,128,0,262644:0:0:0:0: -36,192,262565,128,0,262802:0:0:0:0: -256,192,262565,128,0,262644:0:0:0:0: -402,192,262565,128,0,262644:0:0:0:0: -182,192,262644,128,0,262723:0:0:0:0: -475,192,262644,128,0,262802:0:0:0:0: -256,192,262723,128,0,262802:0:0:0:0: -109,192,262723,128,0,262881:0:0:0:0: -329,192,262802,128,0,262881:0:0:0:0: -402,192,262802,128,0,262881:0:0:0:0: -182,192,262881,128,0,263039:0:0:0:0: -36,192,262881,128,0,262960:0:0:0:0: -475,192,262881,128,0,263118:0:0:0:0: -256,192,262881,128,0,262960:0:0:0:0: -329,192,262960,128,0,263039:0:0:0:0: -109,192,262960,128,0,263118:0:0:0:0: -36,192,263039,128,0,263118:0:0:0:0: -402,192,263039,128,0,263276:0:0:0:0: -256,192,263039,128,0,263118:0:0:0:0: -329,192,263118,128,0,263197:0:0:0:0: -182,192,263118,128,0,263197:0:0:0:0: -109,192,263197,128,0,263513:0:0:0:0: -256,192,263197,128,0,263276:0:0:0:0: -475,192,263197,128,0,263355:0:0:0:0: -36,192,263197,128,0,263355:0:0:0:0: -329,192,263276,128,0,263355:0:0:0:0: -182,192,263276,128,0,263355:0:0:0:0: -256,192,263355,128,0,263513:0:0:0:0: -402,192,263355,128,0,263434:0:0:0:0: -329,192,263434,128,0,263513:0:0:0:0: -475,192,263434,128,0,263513:0:0:0:0: -402,192,263513,128,0,263671:0:0:0:0: -36,192,263513,128,0,263750:0:0:0:0: -182,192,263513,128,0,263592:0:0:0:0: -329,192,263592,128,0,263750:0:0:0:0: -109,192,263592,128,0,263750:0:0:0:0: -256,192,263671,128,0,263828:0:0:0:0: -475,192,263671,128,0,263750:0:0:0:0: -182,192,263750,128,0,263907:0:0:0:0: -402,192,263750,128,0,263828:0:0:0:0: -329,192,263828,128,0,263907:0:0:0:0: -36,192,263828,128,0,263907:0:0:0:0: -475,192,263828,128,0,264065:0:0:0:0: -109,192,263907,128,0,263986:0:0:0:0: -256,192,263907,128,0,263986:0:0:0:0: -329,192,263986,128,0,264065:0:0:0:0: -402,192,263986,128,0,264223:0:0:0:0: -36,192,263986,128,0,264223:0:0:0:0: -182,192,264065,128,0,264144:0:0:0:0: -475,192,264144,128,0,264381:0:0:0:0: -109,192,264144,128,0,264302:0:0:0:0: -256,192,264144,128,0,264223:0:0:0:0: -329,192,264223,128,0,264302:0:0:0:0: -182,192,264223,128,0,264381:0:0:0:0: -402,192,264302,128,0,264381:0:0:0:0: -256,192,264302,128,0,264460:0:0:0:0: -36,192,264302,128,0,264381:0:0:0:0: -329,192,264381,128,0,264539:0:0:0:0: -109,192,264381,128,0,264460:0:0:0:0: -36,192,264460,128,0,264618:0:0:0:0: -475,192,264460,128,0,264539:0:0:0:0: -182,192,264460,128,0,264539:0:0:0:0: -402,192,264539,128,0,264697:0:0:0:0: -256,192,264539,128,0,264618:0:0:0:0: -329,192,264618,128,0,264776:0:0:0:0: -109,192,264618,128,0,264697:0:0:0:0: -475,192,264618,128,0,264776:0:0:0:0: -182,192,264697,128,0,264776:0:0:0:0: -36,192,264697,128,0,264776:0:0:0:0: -256,192,264776,128,0,264934:0:0:0:0: -402,192,264776,128,0,264934:0:0:0:0: -109,192,264776,128,0,264855:0:0:0:0: -182,192,264855,128,0,264934:0:0:0:0: -36,192,264934,128,0,265092:0:0:0:0: -109,192,264934,128,0,265013:0:0:0:0: -329,192,264934,128,0,265013:0:0:0:0: -475,192,264934,128,0,265013:0:0:0:0: -402,192,265013,128,0,265092:0:0:0:0: -256,192,265013,128,0,265092:0:0:0:0: -475,192,265092,128,0,265250:0:0:0:0: -182,192,265092,128,0,265328:0:0:0:0: -109,192,265092,128,0,265171:0:0:0:0: -329,192,265092,128,0,265328:0:0:0:0: -402,192,265171,128,0,265250:0:0:0:0: -256,192,265171,128,0,265250:0:0:0:0: -109,192,265250,128,0,265328:0:0:0:0: -36,192,265250,128,0,265328:0:0:0:0: -475,192,265328,128,0,265407:0:0:0:0: -402,192,265328,128,0,265407:0:0:0:0: -182,192,265407,128,0,265644:0:0:0:0: -36,192,265407,128,0,265644:0:0:0:0: -256,192,265407,128,0,265486:0:0:0:0: -109,192,265407,128,0,265486:0:0:0:0: -402,192,265486,128,0,265565:0:0:0:0: -475,192,265486,128,0,265565:0:0:0:0: -329,192,265565,128,0,265644:0:0:0:0: -256,192,265565,128,0,265644:0:0:0:0: -402,192,265644,128,0,265723:0:0:0:0: -475,192,265644,128,0,265723:0:0:0:0: -36,192,265723,128,0,265881:0:0:0:0: -182,192,265723,128,0,265802:0:0:0:0: -329,192,265723,128,0,265881:0:0:0:0: -402,192,265802,128,0,265960:0:0:0:0: -256,192,265802,128,0,265881:0:0:0:0: -109,192,265802,128,0,266039:0:0:0:0: -475,192,265881,128,0,266039:0:0:0:0: -182,192,265881,128,0,265960:0:0:0:0: -329,192,265960,128,0,266039:0:0:0:0: -36,192,265960,128,0,266118:0:0:0:0: -182,192,266039,1,0,0:0:0:0: -402,192,266039,128,0,266197:0:0:0:0: -256,192,266039,128,0,266197:0:0:0:0: -109,192,266118,1,0,0:0:0:0: -182,192,266197,128,0,266276:0:0:0:0: -475,192,266197,128,0,266276:0:0:0:0: -36,192,266197,1,0,0:0:0:0: -109,192,266276,128,0,266355:0:0:0:0: -329,192,266276,128,0,266355:0:0:0:0: -256,192,266355,128,0,266434:0:0:0:0: -36,192,266355,128,0,266592:0:0:0:0: -475,192,266355,128,0,266671:0:0:0:0: -182,192,266434,128,0,266513:0:0:0:0: -402,192,266434,128,0,266513:0:0:0:0: -109,192,266513,128,0,266671:0:0:0:0: -329,192,266513,128,0,266671:0:0:0:0: -256,192,266592,128,0,266750:0:0:0:0: -36,192,266671,128,0,266828:0:0:0:0: -182,192,266671,128,0,266828:0:0:0:0: -402,192,266671,1,0,0:0:0:0: -329,192,266750,1,0,0:0:0:0: -475,192,266750,128,0,266907:0:0:0:0: -109,192,266828,128,0,266907:0:0:0:0: -402,192,266828,128,0,266907:0:0:0:0: -256,192,266828,1,0,0:0:0:0: -329,192,266907,128,0,266986:0:0:0:0: -36,192,266907,128,0,266986:0:0:0:0: -256,192,266986,128,0,267144:0:0:0:0: -402,192,266986,128,0,267065:0:0:0:0: -475,192,266986,128,0,267302:0:0:0:0: -182,192,266986,128,0,267065:0:0:0:0: -329,192,267065,128,0,267223:0:0:0:0: -36,192,267065,128,0,267223:0:0:0:0: -109,192,267144,128,0,267381:0:0:0:0: -402,192,267144,128,0,267302:0:0:0:0: -182,192,267223,128,0,267302:0:0:0:0: -36,192,267302,128,0,267460:0:0:0:0: -329,192,267302,128,0,267381:0:0:0:0: -475,192,267381,128,0,267539:0:0:0:0: -256,192,267381,128,0,267460:0:0:0:0: -182,192,267460,128,0,267539:0:0:0:0: -402,192,267460,128,0,267539:0:0:0:0: -329,192,267539,128,0,267618:0:0:0:0: -109,192,267539,128,0,267618:0:0:0:0: -256,192,267618,128,0,267697:0:0:0:0: -36,192,267618,128,0,267697:0:0:0:0: -475,192,267618,128,0,267855:0:0:0:0: -402,192,267618,128,0,267776:0:0:0:0: -329,192,267697,128,0,267855:0:0:0:0: -182,192,267697,128,0,267776:0:0:0:0: -256,192,267776,128,0,267934:0:0:0:0: -36,192,267776,128,0,267855:0:0:0:0: -109,192,267776,128,0,267855:0:0:0:0: -402,192,267855,128,0,267934:0:0:0:0: -182,192,267855,128,0,267934:0:0:0:0: -36,192,267934,128,0,268171:0:0:0:0: -109,192,267934,128,0,268013:0:0:0:0: -329,192,267934,128,0,268013:0:0:0:0: -475,192,267934,128,0,268013:0:0:0:0: -256,192,268013,128,0,268092:0:0:0:0: -402,192,268013,128,0,268092:0:0:0:0: -182,192,268092,128,0,268171:0:0:0:0: -329,192,268092,128,0,268171:0:0:0:0: -475,192,268092,128,0,268250:0:0:0:0: -109,192,268171,128,0,268250:0:0:0:0: -256,192,268171,128,0,268250:0:0:0:0: -36,192,268250,128,0,268328:0:0:0:0: -182,192,268250,128,0,268328:0:0:0:0: -329,192,268250,128,0,268328:0:0:0:0: -402,192,268250,128,0,268328:0:0:0:0: -36,192,268407,128,0,268565:0:0:0:0: -182,192,268407,128,0,268565:0:0:0:0: -329,192,268407,128,0,268565:0:0:0:0: -402,192,268407,128,0,268565:0:0:0:0: -475,192,268565,128,0,268881:0:0:0:0: -109,192,268565,1,0,0:0:0:0: -256,192,268565,1,0,0:0:0:0: -36,192,268723,128,0,268881:0:0:0:0: -402,192,268881,128,0,268960:0:0:0:0: -256,192,268881,128,0,268960:0:0:0:0: -109,192,268881,128,0,268960:0:0:0:0: -329,192,268881,128,0,268960:0:0:0:0: -109,192,269039,128,0,269197:0:0:0:0: -256,192,269039,128,0,269197:0:0:0:0: -329,192,269039,128,0,269197:0:0:0:0: -402,192,269039,128,0,269197:0:0:0:0: -36,192,269197,128,0,269513:0:0:0:0: -475,192,269197,1,0,0:0:0:0: -182,192,269197,128,0,269513:0:0:0:0: -475,192,269355,128,0,269513:0:0:0:0: -329,192,269355,128,0,269513:0:0:0:0: -256,192,269513,128,0,269671:0:0:0:0: -402,192,269513,128,0,269671:0:0:0:0: -109,192,269513,128,0,269671:0:0:0:0: -182,192,269671,128,0,269828:0:0:0:0: -329,192,269671,128,0,269828:0:0:0:0: -109,192,269828,128,0,269986:0:0:0:0: -256,192,269828,128,0,269986:0:0:0:0: -402,192,269828,128,0,269986:0:0:0:0: -36,192,269986,128,0,270460:0:0:0:0: -182,192,269986,128,0,270381:0:0:0:0: -329,192,269986,128,0,270302:0:0:0:0: -475,192,269986,128,0,270223:0:0:0:0: -402,192,270302,128,0,270697:0:0:0:0: -475,192,270302,1,0,0:0:0:0: -256,192,270381,128,0,270618:0:0:0:0: -329,192,270381,1,0,0:0:0:0: -109,192,270460,128,0,270539:0:0:0:0: -182,192,270460,1,0,0:0:0:0: -36,192,270539,128,0,270618:0:0:0:0: -182,192,270618,128,0,270697:0:0:0:0: -329,192,270697,128,0,270776:0:0:0:0: -475,192,270776,128,0,271013:0:0:0:0: -402,192,270776,128,0,270855:0:0:0:0: -256,192,270776,128,0,270855:0:0:0:0: -36,192,270776,128,0,270855:0:0:0:0: -182,192,270776,128,0,271013:0:0:0:0: -109,192,270855,128,0,270934:0:0:0:0: -329,192,270855,128,0,271013:0:0:0:0: -402,192,270934,128,0,271171:0:0:0:0: -256,192,270934,128,0,271092:0:0:0:0: -36,192,270934,128,0,271013:0:0:0:0: -109,192,271013,128,0,271171:0:0:0:0: -36,192,271092,128,0,271250:0:0:0:0: -475,192,271092,128,0,271328:0:0:0:0: -329,192,271092,128,0,271250:0:0:0:0: -182,192,271092,128,0,271250:0:0:0:0: -256,192,271171,128,0,271328:0:0:0:0: -109,192,271250,128,0,271328:0:0:0:0: -402,192,271328,128,0,271565:0:0:0:0: -36,192,271328,128,0,271565:0:0:0:0: -182,192,271328,128,0,271407:0:0:0:0: -329,192,271407,128,0,271486:0:0:0:0: -109,192,271407,128,0,271486:0:0:0:0: -475,192,271407,128,0,271486:0:0:0:0: -256,192,271486,128,0,271644:0:0:0:0: -182,192,271565,128,0,271802:0:0:0:0: -329,192,271565,128,0,271644:0:0:0:0: -475,192,271565,128,0,271644:0:0:0:0: -402,192,271644,128,0,271802:0:0:0:0: -109,192,271644,128,0,271723:0:0:0:0: -329,192,271723,128,0,271802:0:0:0:0: -475,192,271723,128,0,271960:0:0:0:0: -36,192,271723,128,0,271881:0:0:0:0: -256,192,271723,128,0,271881:0:0:0:0: -109,192,271802,128,0,271960:0:0:0:0: -182,192,271881,128,0,272118:0:0:0:0: -329,192,271881,128,0,271960:0:0:0:0: -402,192,271881,128,0,271960:0:0:0:0: -36,192,271960,128,0,272039:0:0:0:0: -256,192,271960,128,0,272039:0:0:0:0: -402,192,272039,128,0,272197:0:0:0:0: -109,192,272039,128,0,272276:0:0:0:0: -475,192,272039,128,0,272276:0:0:0:0: -329,192,272039,128,0,272118:0:0:0:0: -36,192,272118,128,0,272276:0:0:0:0: -256,192,272118,128,0,272355:0:0:0:0: -329,192,272197,128,0,272276:0:0:0:0: -182,192,272197,128,0,272276:0:0:0:0: -402,192,272276,128,0,272355:0:0:0:0: -329,192,272355,128,0,272434:0:0:0:0: -36,192,272355,128,0,272592:0:0:0:0: -475,192,272355,128,0,272592:0:0:0:0: -109,192,272355,128,0,272513:0:0:0:0: -182,192,272355,128,0,272434:0:0:0:0: -256,192,272434,128,0,272513:0:0:0:0: -402,192,272434,128,0,272592:0:0:0:0: -329,192,272513,128,0,272592:0:0:0:0: -182,192,272513,128,0,272592:0:0:0:0: -109,192,272592,128,0,272750:0:0:0:0: -256,192,272592,128,0,272671:0:0:0:0: -329,192,272671,128,0,272828:0:0:0:0: -182,192,272671,128,0,272828:0:0:0:0: -36,192,272671,128,0,272828:0:0:0:0: -475,192,272671,128,0,272750:0:0:0:0: -402,192,272750,128,0,272907:0:0:0:0: -256,192,272750,128,0,272907:0:0:0:0: -109,192,272828,128,0,272907:0:0:0:0: -475,192,272828,128,0,272907:0:0:0:0: -182,192,272907,128,0,272986:0:0:0:0: -329,192,272907,128,0,272986:0:0:0:0: -475,192,272986,128,0,273065:0:0:0:0: -256,192,272986,128,0,273065:0:0:0:0: -36,192,272986,128,0,273223:0:0:0:0: -402,192,272986,128,0,273065:0:0:0:0: -329,192,273065,128,0,273144:0:0:0:0: -109,192,273065,128,0,273223:0:0:0:0: -475,192,273144,128,0,273223:0:0:0:0: -182,192,273144,128,0,273302:0:0:0:0: -402,192,273144,128,0,273223:0:0:0:0: -256,192,273223,128,0,273302:0:0:0:0: -329,192,273302,128,0,273381:0:0:0:0: -109,192,273302,128,0,273381:0:0:0:0: -36,192,273302,128,0,273618:0:0:0:0: -475,192,273302,128,0,273460:0:0:0:0: -402,192,273302,128,0,273381:0:0:0:0: -182,192,273381,128,0,273539:0:0:0:0: -256,192,273381,128,0,273460:0:0:0:0: -109,192,273460,128,0,273539:0:0:0:0: -329,192,273460,128,0,273539:0:0:0:0: -402,192,273460,128,0,273539:0:0:0:0: -475,192,273539,128,0,273776:0:0:0:0: -256,192,273539,128,0,273618:0:0:0:0: -329,192,273618,128,0,273776:0:0:0:0: -402,192,273618,128,0,273697:0:0:0:0: -182,192,273618,128,0,273697:0:0:0:0: -109,192,273618,128,0,273697:0:0:0:0: -256,192,273697,128,0,273855:0:0:0:0: -36,192,273697,128,0,273855:0:0:0:0: -182,192,273776,128,0,273934:0:0:0:0: -109,192,273776,128,0,273855:0:0:0:0: -402,192,273776,128,0,273855:0:0:0:0: -475,192,273855,128,0,274092:0:0:0:0: -329,192,273855,128,0,273934:0:0:0:0: -36,192,273934,128,0,274171:0:0:0:0: -109,192,273934,128,0,274013:0:0:0:0: -256,192,273934,128,0,274171:0:0:0:0: -402,192,273934,128,0,274013:0:0:0:0: -182,192,274013,128,0,274092:0:0:0:0: -329,192,274013,128,0,274092:0:0:0:0: -402,192,274092,128,0,274328:0:0:0:0: -109,192,274171,128,0,274250:0:0:0:0: -329,192,274171,128,0,274250:0:0:0:0: -475,192,274171,128,0,274407:0:0:0:0: -182,192,274250,128,0,274328:0:0:0:0: -36,192,274250,128,0,274328:0:0:0:0: -256,192,274328,128,0,274407:0:0:0:0: -109,192,274328,128,0,274486:0:0:0:0: -36,192,274407,128,0,274802:0:0:0:0: -329,192,274407,128,0,274565:0:0:0:0: -182,192,274407,128,0,274486:0:0:0:0: -256,192,274486,128,0,274565:0:0:0:0: -402,192,274486,128,0,274644:0:0:0:0: -182,192,274565,128,0,274644:0:0:0:0: -109,192,274565,128,0,274644:0:0:0:0: -475,192,274565,128,0,274802:0:0:0:0: -256,192,274644,128,0,274723:0:0:0:0: -329,192,274644,128,0,274723:0:0:0:0: -109,192,274723,128,0,274802:0:0:0:0: -182,192,274723,128,0,274881:0:0:0:0: -402,192,274723,128,0,274802:0:0:0:0: -256,192,274802,128,0,274881:0:0:0:0: -329,192,274802,128,0,274960:0:0:0:0: -402,192,274881,128,0,274960:0:0:0:0: -475,192,274881,128,0,275118:0:0:0:0: -36,192,274881,128,0,275118:0:0:0:0: -109,192,274881,128,0,274960:0:0:0:0: -182,192,274960,128,0,275118:0:0:0:0: -256,192,274960,128,0,275039:0:0:0:0: -329,192,275039,128,0,275118:0:0:0:0: -402,192,275039,128,0,275276:0:0:0:0: -109,192,275039,128,0,275118:0:0:0:0: -256,192,275118,128,0,275197:0:0:0:0: -475,192,275197,128,0,275355:0:0:0:0: -329,192,275197,128,0,275355:0:0:0:0: -36,192,275197,128,0,275276:0:0:0:0: -182,192,275197,128,0,275276:0:0:0:0: -256,192,275276,128,0,275434:0:0:0:0: -109,192,275276,128,0,275355:0:0:0:0: -36,192,275355,128,0,275434:0:0:0:0: -182,192,275355,128,0,275513:0:0:0:0: -402,192,275355,128,0,275434:0:0:0:0: -109,192,275434,128,0,275592:0:0:0:0: -329,192,275434,128,0,275513:0:0:0:0: -36,192,275513,128,0,275592:0:0:0:0: -256,192,275513,128,0,275592:0:0:0:0: -475,192,275513,128,0,275750:0:0:0:0: -182,192,275592,128,0,275671:0:0:0:0: -402,192,275592,128,0,275750:0:0:0:0: -109,192,275671,128,0,275750:0:0:0:0: -36,192,275671,128,0,275750:0:0:0:0: -329,192,275671,128,0,275828:0:0:0:0: -256,192,275750,128,0,275828:0:0:0:0: -182,192,275828,128,0,275986:0:0:0:0: -475,192,275828,128,0,276065:0:0:0:0: -402,192,275828,128,0,275907:0:0:0:0: -36,192,275828,128,0,276065:0:0:0:0: -109,192,275828,128,0,275907:0:0:0:0: -256,192,275907,128,0,276065:0:0:0:0: -329,192,275907,128,0,275986:0:0:0:0: -402,192,275986,128,0,276065:0:0:0:0: -109,192,275986,128,0,276144:0:0:0:0: -329,192,276065,128,0,276144:0:0:0:0: -182,192,276065,128,0,276223:0:0:0:0: -256,192,276144,128,0,276302:0:0:0:0: -402,192,276144,128,0,276223:0:0:0:0: -475,192,276144,128,0,276302:0:0:0:0: -36,192,276144,1,0,0:0:0:0: -329,192,276223,128,0,276381:0:0:0:0: -109,192,276223,1,0,0:0:0:0: -402,192,276302,128,0,276539:0:0:0:0: -182,192,276302,1,0,0:0:0:0: -36,192,276302,128,0,276381:0:0:0:0: -475,192,276381,128,0,276460:0:0:0:0: -109,192,276381,128,0,276460:0:0:0:0: -256,192,276381,1,0,0:0:0:0: -329,192,276460,128,0,276618:0:0:0:0: -182,192,276460,128,0,276539:0:0:0:0: -36,192,276460,128,0,276697:0:0:0:0: -256,192,276539,128,0,276697:0:0:0:0: -109,192,276539,128,0,276618:0:0:0:0: -475,192,276539,1,0,0:0:0:0: -182,192,276618,128,0,276776:0:0:0:0: -402,192,276618,1,0,0:0:0:0: -109,192,276697,128,0,276855:0:0:0:0: -329,192,276697,1,0,0:0:0:0: -475,192,276697,128,0,276855:0:0:0:0: -36,192,276776,128,0,276934:0:0:0:0: -256,192,276776,1,0,0:0:0:0: -402,192,276776,128,0,276934:0:0:0:0: -182,192,276855,1,0,0:0:0:0: -329,192,276855,128,0,277013:0:0:0:0: -109,192,276934,1,0,0:0:0:0: -256,192,276934,128,0,277092:0:0:0:0: -182,192,277013,128,0,277171:0:0:0:0: -36,192,277013,1,0,0:0:0:0: -402,192,277092,128,0,277171:0:0:0:0: -475,192,277092,128,0,277328:0:0:0:0: -329,192,277092,128,0,277171:0:0:0:0: -109,192,277092,128,0,277328:0:0:0:0: -256,192,277171,128,0,277250:0:0:0:0: -36,192,277171,128,0,277250:0:0:0:0: -329,192,277250,128,0,277486:0:0:0:0: -182,192,277250,128,0,277407:0:0:0:0: -402,192,277328,128,0,277407:0:0:0:0: -36,192,277407,128,0,277486:0:0:0:0: -256,192,277407,128,0,277565:0:0:0:0: -475,192,277407,128,0,277644:0:0:0:0: -109,192,277407,128,0,277486:0:0:0:0: -182,192,277486,128,0,277565:0:0:0:0: -402,192,277486,128,0,277644:0:0:0:0: -36,192,277565,128,0,277644:0:0:0:0: -109,192,277565,128,0,277723:0:0:0:0: -329,192,277565,128,0,277723:0:0:0:0: -182,192,277644,128,0,277802:0:0:0:0: -36,192,277723,128,0,277881:0:0:0:0: -256,192,277723,128,0,277802:0:0:0:0: -402,192,277723,128,0,277802:0:0:0:0: -475,192,277723,128,0,277960:0:0:0:0: -329,192,277802,128,0,277881:0:0:0:0: -109,192,277802,128,0,277881:0:0:0:0: -182,192,277881,128,0,278039:0:0:0:0: -402,192,277881,128,0,277960:0:0:0:0: -256,192,277881,128,0,277960:0:0:0:0: -329,192,277960,128,0,278039:0:0:0:0: -36,192,278039,128,0,278118:0:0:0:0: -109,192,278039,128,0,278118:0:0:0:0: -256,192,278039,128,0,278118:0:0:0:0: -475,192,278039,128,0,278118:0:0:0:0: -402,192,278039,128,0,278118:0:0:0:0: -36,192,278197,1,0,0:0:0:0: -109,192,278197,1,0,0:0:0:0: -256,192,278197,1,0,0:0:0:0: -402,192,278197,1,0,0:0:0:0: -475,192,278197,1,0,0:0:0:0: -36,192,278355,128,0,278986:0:0:0:0: -475,192,278355,128,0,278986:0:0:0:0: -182,192,278355,128,0,278513:0:0:0:0: -329,192,278355,128,0,278434:0:0:0:0: -402,192,278355,128,0,278750:0:0:0:0: -256,192,278434,128,0,278592:0:0:0:0: -329,192,278513,128,0,278671:0:0:0:0: -109,192,278513,128,0,278592:0:0:0:0: -182,192,278592,128,0,278671:0:0:0:0: -109,192,278671,128,0,278828:0:0:0:0: -256,192,278671,128,0,278750:0:0:0:0: -182,192,278750,128,0,278907:0:0:0:0: -329,192,278750,128,0,278828:0:0:0:0: -256,192,278828,128,0,278986:0:0:0:0: -402,192,278828,128,0,278907:0:0:0:0: -329,192,278907,128,0,278986:0:0:0:0: -109,192,278986,128,0,279223:0:0:0:0: -402,192,278986,128,0,279065:0:0:0:0: -182,192,278986,128,0,279065:0:0:0:0: -475,192,279065,128,0,279144:0:0:0:0: -329,192,279065,128,0,279144:0:0:0:0: -256,192,279144,128,0,279223:0:0:0:0: -402,192,279144,128,0,279223:0:0:0:0: -36,192,279144,128,0,279302:0:0:0:0: -329,192,279223,128,0,279302:0:0:0:0: -182,192,279223,128,0,279302:0:0:0:0: -402,192,279302,128,0,279460:0:0:0:0: -475,192,279302,128,0,279539:0:0:0:0: -109,192,279302,128,0,279539:0:0:0:0: -256,192,279302,128,0,279381:0:0:0:0: -182,192,279381,128,0,279460:0:0:0:0: -36,192,279460,128,0,279618:0:0:0:0: -329,192,279460,128,0,279539:0:0:0:0: -256,192,279539,128,0,279618:0:0:0:0: -402,192,279539,128,0,279618:0:0:0:0: -182,192,279618,128,0,279697:0:0:0:0: -329,192,279618,128,0,279855:0:0:0:0: -475,192,279618,128,0,279855:0:0:0:0: -109,192,279618,128,0,279697:0:0:0:0: -182,192,279776,128,0,279855:0:0:0:0: -36,192,279776,128,0,279855:0:0:0:0: -256,192,279776,128,0,279855:0:0:0:0: -402,192,279776,128,0,279855:0:0:0:0: -402,192,279934,128,0,280171:0:0:0:0: -256,192,279934,128,0,280171:0:0:0:0: -36,192,279934,128,0,280013:0:0:0:0: -109,192,279934,128,0,280013:0:0:0:0: -475,192,279934,128,0,280013:0:0:0:0: -182,192,280092,128,0,280171:0:0:0:0: -36,192,280092,128,0,280171:0:0:0:0: -329,192,280092,128,0,280171:0:0:0:0: -475,192,280092,128,0,280171:0:0:0:0: -109,192,280250,128,0,280486:0:0:0:0: -329,192,280250,128,0,280328:0:0:0:0: -475,192,280250,128,0,280328:0:0:0:0: -256,192,280250,128,0,280486:0:0:0:0: -36,192,280250,128,0,280328:0:0:0:0: -329,192,280407,128,0,280486:0:0:0:0: -182,192,280407,128,0,280486:0:0:0:0: -36,192,280407,128,0,280486:0:0:0:0: -475,192,280407,128,0,280486:0:0:0:0: -36,192,280565,128,0,280802:0:0:0:0: -182,192,280565,128,0,280802:0:0:0:0: -256,192,280565,128,0,280644:0:0:0:0: -475,192,280565,128,0,280644:0:0:0:0: -329,192,280565,128,0,280644:0:0:0:0: -109,192,280723,128,0,280802:0:0:0:0: -329,192,280723,128,0,280802:0:0:0:0: -402,192,280723,128,0,280802:0:0:0:0: -475,192,280723,128,0,280802:0:0:0:0: -256,192,280881,1,0,0:0:0:0: -109,192,280881,1,0,0:0:0:0: -36,192,280881,1,0,0:0:0:0: -402,192,280881,1,0,0:0:0:0: -475,192,280881,1,0,0:0:0:0: -182,192,281039,1,0,0:0:0:0: -36,192,281039,1,0,0:0:0:0: -329,192,281039,1,0,0:0:0:0: -475,192,281039,1,0,0:0:0:0: -256,192,281039,1,0,0:0:0:0: -182,192,281355,1,0,0:0:0:0: -36,192,281355,1,0,0:0:0:0: -256,192,281355,1,0,0:0:0:0: -329,192,281355,1,0,0:0:0:0: -475,192,281355,1,0,0:0:0:0: -109,192,281513,1,0,0:0:0:0: -36,192,281513,1,0,0:0:0:0: -256,192,281513,1,0,0:0:0:0: -402,192,281513,1,0,0:0:0:0: -475,192,281513,1,0,0:0:0:0: -402,192,281671,128,0,281828:0:0:0:0: -475,192,281671,128,0,281828:0:0:0:0: -36,192,281828,1,0,0:0:0:0: -109,192,281828,1,0,0:0:0:0: -256,192,281828,1,0,0:0:0:0: -329,192,281828,1,0,0:0:0:0: -109,192,281986,1,0,0:0:0:0: -182,192,281986,1,0,0:0:0:0: -329,192,281986,1,0,0:0:0:0: -402,192,281986,1,0,0:0:0:0: -36,192,282302,1,0,0:0:0:0: -256,192,282302,1,0,0:0:0:0: -475,192,282302,1,0,0:0:0:0: -109,192,282302,1,0,0:0:0:0: -402,192,282302,1,0,0:0:0:0: -182,192,282460,1,0,0:0:0:0: -36,192,282460,1,0,0:0:0:0: -256,192,282460,1,0,0:0:0:0: -475,192,282460,1,0,0:0:0:0: -329,192,282460,1,0,0:0:0:0: -36,192,282618,128,0,282776:0:0:0:0: -109,192,282618,128,0,282776:0:0:0:0: -475,192,282776,128,0,283407:0:0:0:0: -182,192,282776,1,0,0:0:0:0: -402,192,282776,1,0,0:0:0:0: -256,192,282776,128,0,282934:0:0:0:0: -329,192,282855,128,0,283013:0:0:0:0: -402,192,282934,128,0,283092:0:0:0:0: -182,192,282934,128,0,283013:0:0:0:0: -256,192,283013,128,0,283092:0:0:0:0: -109,192,283013,128,0,283171:0:0:0:0: -329,192,283092,128,0,283171:0:0:0:0: -182,192,283092,128,0,283250:0:0:0:0: -256,192,283171,128,0,283328:0:0:0:0: -36,192,283171,128,0,283407:0:0:0:0: -109,192,283250,128,0,283407:0:0:0:0: -182,192,283328,128,0,283407:0:0:0:0: -256,192,283407,1,0,0:0:0:0: -329,192,283407,1,0,0:0:0:0: -402,192,283407,1,0,0:0:0:0: -329,192,283723,128,0,284039:0:0:0:0: -182,192,283723,128,0,284039:0:0:0:0: -36,192,283723,128,0,284039:0:0:0:0: -256,192,284039,1,0,0:0:0:0: -402,192,284039,1,0,0:0:0:0: -475,192,284039,1,0,0:0:0:0: -109,192,284355,128,0,284671:0:0:0:0: -256,192,284355,128,0,284671:0:0:0:0: -402,192,284355,128,0,284671:0:0:0:0: -182,192,284671,1,0,0:0:0:0: -36,192,284671,1,0,0:0:0:0: -475,192,284671,1,0,0:0:0:0: -182,192,284986,128,0,285302:0:0:0:0: -329,192,284986,128,0,285302:0:0:0:0: -475,192,284986,128,0,285302:0:0:0:0: -36,192,285302,1,0,0:0:0:0: -109,192,285302,1,0,0:0:0:0: -256,192,285302,1,0,0:0:0:0: -256,192,285460,128,0,285776:0:0:0:0: -402,192,285460,128,0,285776:0:0:0:0: -36,192,285776,128,0,287118:0:0:0:0: -182,192,285776,128,0,286250:0:0:0:0: -329,192,285776,1,0,0:0:0:0: -475,192,285776,1,0,0:0:0:0: -329,192,286092,128,0,286171:0:0:0:0: -475,192,286092,128,0,286328:0:0:0:0: -256,192,286092,128,0,286250:0:0:0:0: -402,192,286250,128,0,286328:0:0:0:0: -109,192,286250,128,0,286407:0:0:0:0: -329,192,286250,128,0,286407:0:0:0:0: -402,192,286407,128,0,286565:0:0:0:0: -475,192,286407,128,0,286486:0:0:0:0: -182,192,286407,128,0,286565:0:0:0:0: -256,192,286565,128,0,286723:0:0:0:0: -475,192,286565,128,0,286881:0:0:0:0: -109,192,286565,128,0,286960:0:0:0:0: -329,192,286565,128,0,286644:0:0:0:0: -329,192,286723,128,0,286881:0:0:0:0: -182,192,286723,128,0,286881:0:0:0:0: -402,192,286723,128,0,286802:0:0:0:0: -402,192,286881,128,0,286960:0:0:0:0: -256,192,286881,128,0,287118:0:0:0:0: -475,192,286960,128,0,287039:0:0:0:0: -182,192,286960,128,0,287039:0:0:0:0: -329,192,287039,128,0,287118:0:0:0:0: -109,192,287039,128,0,287118:0:0:0:0: -402,192,287118,128,0,287197:0:0:0:0: -182,192,287118,128,0,287197:0:0:0:0: -256,192,287197,1,0,0:0:0:0: -109,192,287197,1,0,0:0:0:0: -475,192,287197,1,0,0:0:0:0: -329,192,287197,1,0,0:0:0:0: -36,192,287197,1,0,0:0:0:0: -475,192,287513,128,0,287828:0:0:0:0: -329,192,287828,128,0,288460:0:0:0:0: -109,192,288460,128,0,288539:0:0:0:0: -182,192,288500,128,0,288578:0:0:0:0: -256,192,288539,128,0,288618:0:0:0:0: -329,192,288578,128,0,288657:0:0:0:0: -182,192,288618,128,0,288697:0:0:0:0: -256,192,288657,128,0,288736:0:0:0:0: -329,192,288697,128,0,288776:0:0:0:0: -402,192,288736,128,0,288815:0:0:0:0: -475,192,288776,128,0,289250:0:0:0:0: -36,192,288776,1,0,0:0:0:0: -109,192,288776,1,0,0:0:0:0: -36,192,289092,128,0,289644:0:0:0:0: -256,192,289092,1,0,0:0:0:0: -402,192,289092,1,0,0:0:0:0: -475,192,289407,128,0,289644:0:0:0:0: -109,192,289407,1,0,0:0:0:0: -256,192,289407,1,0,0:0:0:0: -182,192,289407,1,0,0:0:0:0: -182,192,289723,1,0,0:0:0:0: -36,192,289723,1,0,0:0:0:0: -329,192,289723,1,0,0:0:0:0: -475,192,289723,128,0,289802:0:0:0:0: -256,192,289802,1,0,0:0:0:0: -329,192,289881,1,0,0:0:0:0: -109,192,289881,1,0,0:0:0:0: -475,192,289881,1,0,0:0:0:0: -182,192,289960,1,0,0:0:0:0: -256,192,290039,1,0,0:0:0:0: -36,192,290039,1,0,0:0:0:0: -475,192,290039,128,0,290118:0:0:0:0: -329,192,290118,1,0,0:0:0:0: -36,192,290197,1,0,0:0:0:0: -182,192,290197,1,0,0:0:0:0: -402,192,290197,128,0,290276:0:0:0:0: -329,192,290276,1,0,0:0:0:0: -256,192,290355,1,0,0:0:0:0: -475,192,290355,1,0,0:0:0:0: -36,192,290355,128,0,290434:0:0:0:0: -182,192,290434,1,0,0:0:0:0: -329,192,290513,1,0,0:0:0:0: -109,192,290513,1,0,0:0:0:0: -475,192,290513,1,0,0:0:0:0: -256,192,290592,1,0,0:0:0:0: -402,192,290671,1,0,0:0:0:0: -182,192,290671,1,0,0:0:0:0: -36,192,290671,128,0,290750:0:0:0:0: -256,192,290750,1,0,0:0:0:0: -475,192,290828,1,0,0:0:0:0: -329,192,290828,1,0,0:0:0:0: -109,192,290828,128,0,290907:0:0:0:0: -182,192,290907,1,0,0:0:0:0: -36,192,290986,1,0,0:0:0:0: -256,192,290986,1,0,0:0:0:0: -109,192,290986,1,0,0:0:0:0: -475,192,290986,128,0,291065:0:0:0:0: -329,192,291065,1,0,0:0:0:0: -402,192,291144,1,0,0:0:0:0: -36,192,291144,1,0,0:0:0:0: -182,192,291144,1,0,0:0:0:0: -256,192,291223,1,0,0:0:0:0: -329,192,291302,1,0,0:0:0:0: -109,192,291302,1,0,0:0:0:0: -475,192,291302,128,0,291381:0:0:0:0: -256,192,291381,1,0,0:0:0:0: -36,192,291460,1,0,0:0:0:0: -182,192,291460,1,0,0:0:0:0: -402,192,291460,128,0,291539:0:0:0:0: -329,192,291539,1,0,0:0:0:0: -182,192,291618,1,0,0:0:0:0: -475,192,291618,1,0,0:0:0:0: -36,192,291618,128,0,291697:0:0:0:0: -256,192,291697,1,0,0:0:0:0: -329,192,291776,1,0,0:0:0:0: -109,192,291776,1,0,0:0:0:0: -475,192,291776,1,0,0:0:0:0: -182,192,291855,1,0,0:0:0:0: -329,192,291934,1,0,0:0:0:0: -475,192,291934,1,0,0:0:0:0: -36,192,291934,128,0,292013:0:0:0:0: -256,192,292013,1,0,0:0:0:0: -182,192,292092,1,0,0:0:0:0: -402,192,292092,1,0,0:0:0:0: -109,192,292092,128,0,292171:0:0:0:0: -329,192,292171,1,0,0:0:0:0: -256,192,292250,1,0,0:0:0:0: -36,192,292250,1,0,0:0:0:0: -109,192,292250,1,0,0:0:0:0: -475,192,292250,128,0,292328:0:0:0:0: -402,192,292328,1,0,0:0:0:0: -182,192,292407,1,0,0:0:0:0: -36,192,292407,1,0,0:0:0:0: -329,192,292407,1,0,0:0:0:0: -402,192,292486,1,0,0:0:0:0: -256,192,292565,1,0,0:0:0:0: -36,192,292565,1,0,0:0:0:0: -475,192,292565,128,0,292644:0:0:0:0: -109,192,292644,1,0,0:0:0:0: -182,192,292723,1,0,0:0:0:0: -475,192,292723,1,0,0:0:0:0: -329,192,292723,128,0,292802:0:0:0:0: -109,192,292802,1,0,0:0:0:0: -256,192,292881,1,0,0:0:0:0: -475,192,292881,1,0,0:0:0:0: -36,192,292881,128,0,292960:0:0:0:0: -402,192,292960,1,0,0:0:0:0: -329,192,293039,1,0,0:0:0:0: -182,192,293039,1,0,0:0:0:0: -36,192,293039,1,0,0:0:0:0: -256,192,293118,1,0,0:0:0:0: -475,192,293197,1,0,0:0:0:0: -182,192,293197,1,0,0:0:0:0: -36,192,293197,128,0,293276:0:0:0:0: -402,192,293276,1,0,0:0:0:0: -329,192,293355,1,0,0:0:0:0: -475,192,293355,1,0,0:0:0:0: -182,192,293355,128,0,293434:0:0:0:0: -109,192,293434,1,0,0:0:0:0: -182,192,293513,1,0,0:0:0:0: -36,192,293513,1,0,0:0:0:0: -329,192,293513,1,0,0:0:0:0: -475,192,293513,128,0,293592:0:0:0:0: -256,192,293592,1,0,0:0:0:0: -36,192,293671,1,0,0:0:0:0: -475,192,293671,1,0,0:0:0:0: -329,192,293671,1,0,0:0:0:0: -182,192,293750,1,0,0:0:0:0: -36,192,293828,1,0,0:0:0:0: -256,192,293828,1,0,0:0:0:0: -402,192,293828,128,0,293907:0:0:0:0: -109,192,293907,1,0,0:0:0:0: -36,192,293986,1,0,0:0:0:0: -475,192,293986,1,0,0:0:0:0: -329,192,293986,128,0,294065:0:0:0:0: -182,192,294065,1,0,0:0:0:0: -256,192,294144,1,0,0:0:0:0: -475,192,294144,1,0,0:0:0:0: -36,192,294144,128,0,294223:0:0:0:0: -402,192,294223,1,0,0:0:0:0: -182,192,294302,1,0,0:0:0:0: -36,192,294302,1,0,0:0:0:0: -475,192,294302,1,0,0:0:0:0: -329,192,294381,1,0,0:0:0:0: -256,192,294460,1,0,0:0:0:0: -475,192,294460,1,0,0:0:0:0: -109,192,294460,128,0,294539:0:0:0:0: -402,192,294539,1,0,0:0:0:0: -475,192,294618,1,0,0:0:0:0: -36,192,294618,1,0,0:0:0:0: -182,192,294618,128,0,294697:0:0:0:0: -329,192,294697,1,0,0:0:0:0: -256,192,294776,1,0,0:0:0:0: -109,192,294776,1,0,0:0:0:0: -36,192,294776,1,0,0:0:0:0: -475,192,294776,1,0,0:0:0:0: -329,192,294855,1,0,0:0:0:0: -402,192,294855,1,0,0:0:0:0: -109,192,294934,1,0,0:0:0:0: -36,192,294934,1,0,0:0:0:0: -256,192,294934,1,0,0:0:0:0: -402,192,295013,1,0,0:0:0:0: -475,192,295013,1,0,0:0:0:0: -329,192,295092,1,0,0:0:0:0: -109,192,295092,1,0,0:0:0:0: -36,192,295092,1,0,0:0:0:0: -182,192,295092,1,0,0:0:0:0: -475,192,295171,1,0,0:0:0:0: -402,192,295171,1,0,0:0:0:0: -36,192,295250,1,0,0:0:0:0: -256,192,295250,1,0,0:0:0:0: -182,192,295250,1,0,0:0:0:0: -329,192,295328,1,0,0:0:0:0: -402,192,295328,1,0,0:0:0:0: -109,192,295407,1,0,0:0:0:0: -36,192,295407,1,0,0:0:0:0: -475,192,295407,1,0,0:0:0:0: -182,192,295407,1,0,0:0:0:0: -256,192,295486,1,0,0:0:0:0: -329,192,295486,1,0,0:0:0:0: -182,192,295565,1,0,0:0:0:0: -109,192,295565,1,0,0:0:0:0: -475,192,295565,1,0,0:0:0:0: -402,192,295644,1,0,0:0:0:0: -329,192,295644,1,0,0:0:0:0: -36,192,295723,1,0,0:0:0:0: -475,192,295723,1,0,0:0:0:0: -109,192,295723,1,0,0:0:0:0: -182,192,295723,1,0,0:0:0:0: -256,192,295802,1,0,0:0:0:0: -329,192,295802,1,0,0:0:0:0: -36,192,295881,1,0,0:0:0:0: -109,192,295881,1,0,0:0:0:0: -402,192,295881,1,0,0:0:0:0: -182,192,295960,1,0,0:0:0:0: -256,192,295960,1,0,0:0:0:0: -329,192,296039,1,0,0:0:0:0: -402,192,296039,1,0,0:0:0:0: -475,192,296039,1,0,0:0:0:0: -36,192,296039,1,0,0:0:0:0: -182,192,296118,1,0,0:0:0:0: -109,192,296118,1,0,0:0:0:0: -36,192,296197,1,0,0:0:0:0: -475,192,296197,1,0,0:0:0:0: -329,192,296197,1,0,0:0:0:0: -402,192,296197,1,0,0:0:0:0: -256,192,296276,1,0,0:0:0:0: -182,192,296276,1,0,0:0:0:0: -402,192,296355,1,0,0:0:0:0: -36,192,296355,1,0,0:0:0:0: -475,192,296355,1,0,0:0:0:0: -109,192,296355,1,0,0:0:0:0: -256,192,296434,1,0,0:0:0:0: -329,192,296434,1,0,0:0:0:0: -402,192,296513,1,0,0:0:0:0: -475,192,296513,1,0,0:0:0:0: -109,192,296513,1,0,0:0:0:0: -36,192,296513,1,0,0:0:0:0: -256,192,296592,1,0,0:0:0:0: -329,192,296592,1,0,0:0:0:0: -402,192,296671,1,0,0:0:0:0: -475,192,296671,1,0,0:0:0:0: -109,192,296671,1,0,0:0:0:0: -36,192,296671,1,0,0:0:0:0: -256,192,296750,1,0,0:0:0:0: -182,192,296750,1,0,0:0:0:0: -402,192,296828,1,0,0:0:0:0: -475,192,296828,1,0,0:0:0:0: -109,192,296828,1,0,0:0:0:0: -36,192,296828,1,0,0:0:0:0: -329,192,296907,1,0,0:0:0:0: -256,192,296907,1,0,0:0:0:0: -182,192,296986,1,0,0:0:0:0: -109,192,296986,1,0,0:0:0:0: -36,192,296986,1,0,0:0:0:0: -475,192,296986,1,0,0:0:0:0: -329,192,297065,1,0,0:0:0:0: -402,192,297065,1,0,0:0:0:0: -182,192,297144,1,0,0:0:0:0: -36,192,297144,1,0,0:0:0:0: -256,192,297144,1,0,0:0:0:0: -109,192,297144,1,0,0:0:0:0: -475,192,297223,1,0,0:0:0:0: -402,192,297223,1,0,0:0:0:0: -256,192,297302,1,0,0:0:0:0: -109,192,297302,1,0,0:0:0:0: -36,192,297302,1,0,0:0:0:0: -329,192,297342,1,0,0:0:0:0: -402,192,297381,1,0,0:0:0:0: -475,192,297421,1,0,0:0:0:0: -182,192,297460,1,0,0:0:0:0: -36,192,297460,1,0,0:0:0:0: -256,192,297500,1,0,0:0:0:0: -329,192,297539,1,0,0:0:0:0: -402,192,297578,1,0,0:0:0:0: -109,192,297618,1,0,0:0:0:0: -475,192,297618,1,0,0:0:0:0: -182,192,297657,1,0,0:0:0:0: -256,192,297697,1,0,0:0:0:0: -329,192,297736,1,0,0:0:0:0: -36,192,297776,1,0,0:0:0:0: -402,192,297776,1,0,0:0:0:0: -109,192,297815,1,0,0:0:0:0: -182,192,297855,1,0,0:0:0:0: -256,192,297894,1,0,0:0:0:0: -402,192,297934,1,0,0:0:0:0: -36,192,297934,1,0,0:0:0:0: -329,192,297973,1,0,0:0:0:0: -256,192,298013,1,0,0:0:0:0: -182,192,298052,1,0,0:0:0:0: -109,192,298092,1,0,0:0:0:0: -475,192,298092,1,0,0:0:0:0: -402,192,298131,1,0,0:0:0:0: -329,192,298171,1,0,0:0:0:0: -256,192,298210,1,0,0:0:0:0: -36,192,298250,1,0,0:0:0:0: -475,192,298250,1,0,0:0:0:0: -109,192,298289,1,0,0:0:0:0: -182,192,298328,1,0,0:0:0:0: -256,192,298368,1,0,0:0:0:0: -402,192,298407,1,0,0:0:0:0: -36,192,298407,1,0,0:0:0:0: -329,192,298447,1,0,0:0:0:0: -256,192,298486,1,0,0:0:0:0: -182,192,298526,1,0,0:0:0:0: -329,192,298565,1,0,0:0:0:0: -475,192,298565,1,0,0:0:0:0: -36,192,298565,1,0,0:0:0:0: -109,192,298644,1,0,0:0:0:0: -402,192,298644,1,0,0:0:0:0: -182,192,298723,1,0,0:0:0:0: -36,192,298723,1,0,0:0:0:0: -475,192,298723,1,0,0:0:0:0: -475,192,298881,1,0,0:0:0:0: -329,192,298881,1,0,0:0:0:0: -182,192,298881,1,0,0:0:0:0: -256,192,298960,1,0,0:0:0:0: -402,192,298960,1,0,0:0:0:0: -329,192,299039,1,0,0:0:0:0: -475,192,299039,1,0,0:0:0:0: -182,192,299039,1,0,0:0:0:0: -109,192,299118,1,0,0:0:0:0: -256,192,299118,1,0,0:0:0:0: -36,192,299197,1,0,0:0:0:0: -182,192,299197,1,0,0:0:0:0: -475,192,299197,1,0,0:0:0:0: -402,192,299197,1,0,0:0:0:0: -329,192,299276,1,0,0:0:0:0: -109,192,299276,1,0,0:0:0:0: -256,192,299355,1,0,0:0:0:0: -475,192,299355,1,0,0:0:0:0: -36,192,299355,1,0,0:0:0:0: -329,192,299434,1,0,0:0:0:0: -182,192,299434,1,0,0:0:0:0: -109,192,299513,1,0,0:0:0:0: -36,192,299513,1,0,0:0:0:0: -402,192,299513,1,0,0:0:0:0: -475,192,299513,1,0,0:0:0:0: -329,192,299592,1,0,0:0:0:0: -182,192,299592,1,0,0:0:0:0: -256,192,299671,1,0,0:0:0:0: -109,192,299671,1,0,0:0:0:0: -182,192,299750,1,0,0:0:0:0: -36,192,299750,1,0,0:0:0:0: -256,192,299828,128,0,299907:0:0:0:0: -475,192,299828,128,0,300144:0:0:0:0: -402,192,299828,1,0,0:0:0:0: -109,192,299828,128,0,299907:0:0:0:0: -329,192,299907,1,0,0:0:0:0: -182,192,299986,128,0,300065:0:0:0:0: -402,192,299986,1,0,0:0:0:0: -36,192,299986,128,0,300065:0:0:0:0: -256,192,300065,1,0,0:0:0:0: -329,192,300144,128,0,300223:0:0:0:0: -36,192,300144,128,0,300460:0:0:0:0: -109,192,300144,1,0,0:0:0:0: -402,192,300144,128,0,300223:0:0:0:0: -182,192,300223,128,0,300302:0:0:0:0: -475,192,300223,1,0,0:0:0:0: -256,192,300302,128,0,300381:0:0:0:0: -109,192,300302,1,0,0:0:0:0: -329,192,300302,128,0,300381:0:0:0:0: -402,192,300381,1,0,0:0:0:0: -329,192,300460,128,0,300539:0:0:0:0: -475,192,300460,128,0,300776:0:0:0:0: -256,192,300460,1,0,0:0:0:0: -109,192,300460,128,0,300539:0:0:0:0: -182,192,300539,1,0,0:0:0:0: -109,192,300618,128,0,300697:0:0:0:0: -402,192,300618,1,0,0:0:0:0: -256,192,300618,128,0,300697:0:0:0:0: -182,192,300697,128,0,300776:0:0:0:0: -329,192,300697,1,0,0:0:0:0: -256,192,300776,128,0,300855:0:0:0:0: -36,192,300776,128,0,301092:0:0:0:0: -109,192,300776,1,0,0:0:0:0: -402,192,300776,128,0,300855:0:0:0:0: -182,192,300855,1,0,0:0:0:0: -402,192,300934,128,0,301013:0:0:0:0: -109,192,300934,1,0,0:0:0:0: -256,192,300934,128,0,301013:0:0:0:0: -329,192,301013,128,0,301092:0:0:0:0: -182,192,301013,1,0,0:0:0:0: -256,192,301092,128,0,301171:0:0:0:0: -475,192,301092,128,0,301407:0:0:0:0: -402,192,301092,1,0,0:0:0:0: -109,192,301092,128,0,301171:0:0:0:0: -329,192,301171,1,0,0:0:0:0: -402,192,301250,128,0,301328:0:0:0:0: -36,192,301250,1,0,0:0:0:0: -109,192,301250,128,0,301407:0:0:0:0: -182,192,301328,128,0,301407:0:0:0:0: -329,192,301328,1,0,0:0:0:0: -402,192,301407,128,0,301486:0:0:0:0: -36,192,301407,128,0,301723:0:0:0:0: -256,192,301407,128,0,301486:0:0:0:0: -329,192,301486,128,0,301565:0:0:0:0: -475,192,301486,1,0,0:0:0:0: -182,192,301565,128,0,301723:0:0:0:0: -109,192,301565,1,0,0:0:0:0: -402,192,301565,128,0,301644:0:0:0:0: -256,192,301644,128,0,301723:0:0:0:0: -109,192,301723,128,0,301802:0:0:0:0: -475,192,301723,128,0,302039:0:0:0:0: -402,192,301723,1,0,0:0:0:0: -329,192,301723,128,0,301802:0:0:0:0: -182,192,301802,1,0,0:0:0:0: -402,192,301881,128,0,301960:0:0:0:0: -256,192,301881,1,0,0:0:0:0: -36,192,301881,128,0,301960:0:0:0:0: -329,192,301960,128,0,302039:0:0:0:0: -109,192,301960,1,0,0:0:0:0: -182,192,302039,128,0,302197:0:0:0:0: -36,192,302039,128,0,302355:0:0:0:0: -256,192,302039,1,0,0:0:0:0: -402,192,302039,1,0,0:0:0:0: -329,192,302118,128,0,302276:0:0:0:0: -475,192,302118,1,0,0:0:0:0: -402,192,302197,128,0,302355:0:0:0:0: -109,192,302197,1,0,0:0:0:0: -256,192,302276,128,0,302355:0:0:0:0: -109,192,302355,128,0,302434:0:0:0:0: -475,192,302355,128,0,302671:0:0:0:0: -182,192,302355,1,0,0:0:0:0: -329,192,302355,128,0,302434:0:0:0:0: -256,192,302434,1,0,0:0:0:0: -182,192,302513,128,0,302592:0:0:0:0: -36,192,302513,1,0,0:0:0:0: -402,192,302513,128,0,302592:0:0:0:0: -256,192,302592,1,0,0:0:0:0: -182,192,302671,128,0,302750:0:0:0:0: -36,192,302671,128,0,302986:0:0:0:0: -329,192,302671,1,0,0:0:0:0: -109,192,302671,128,0,302750:0:0:0:0: -475,192,302750,128,0,302828:0:0:0:0: -256,192,302750,1,0,0:0:0:0: -329,192,302828,128,0,302907:0:0:0:0: -109,192,302828,1,0,0:0:0:0: -402,192,302828,128,0,302907:0:0:0:0: -182,192,302907,1,0,0:0:0:0: -256,192,302986,128,0,303065:0:0:0:0: -475,192,302986,128,0,303302:0:0:0:0: -329,192,302986,1,0,0:0:0:0: -402,192,302986,1,0,0:0:0:0: -109,192,302986,128,0,303065:0:0:0:0: -182,192,303065,1,0,0:0:0:0: -256,192,303144,128,0,303223:0:0:0:0: -36,192,303144,1,0,0:0:0:0: -402,192,303144,128,0,303223:0:0:0:0: -182,192,303223,128,0,303302:0:0:0:0: -329,192,303223,1,0,0:0:0:0: -256,192,303302,128,0,303381:0:0:0:0: -36,192,303302,128,0,303618:0:0:0:0: -402,192,303302,1,0,0:0:0:0: -109,192,303302,128,0,303381:0:0:0:0: -329,192,303381,1,0,0:0:0:0: -402,192,303460,128,0,303618:0:0:0:0: -475,192,303460,1,0,0:0:0:0: -109,192,303460,1,0,0:0:0:0: -256,192,303460,128,0,303539:0:0:0:0: -329,192,303539,128,0,303618:0:0:0:0: -182,192,303539,1,0,0:0:0:0: -475,192,303618,128,0,303776:0:0:0:0: -109,192,303618,1,0,0:0:0:0: -256,192,303618,128,0,303697:0:0:0:0: -182,192,303697,1,0,0:0:0:0: -36,192,303776,128,0,303855:0:0:0:0: -329,192,303776,1,0,0:0:0:0: -109,192,303776,128,0,303855:0:0:0:0: -256,192,303855,1,0,0:0:0:0: -182,192,303934,128,0,304013:0:0:0:0: -475,192,303934,1,0,0:0:0:0: -36,192,303934,1,0,0:0:0:0: -402,192,303934,128,0,304013:0:0:0:0: -109,192,304013,128,0,304171:0:0:0:0: -329,192,304013,128,0,304092:0:0:0:0: -256,192,304092,128,0,304171:0:0:0:0: -475,192,304092,128,0,304171:0:0:0:0: -329,192,304171,128,0,304250:0:0:0:0: -402,192,304171,128,0,304250:0:0:0:0: -36,192,304250,128,0,304486:0:0:0:0: -256,192,304250,1,0,0:0:0:0: -182,192,304250,128,0,304328:0:0:0:0: -109,192,304250,1,0,0:0:0:0: -475,192,304328,128,0,304407:0:0:0:0: -329,192,304328,128,0,304407:0:0:0:0: -256,192,304407,128,0,304486:0:0:0:0: -402,192,304407,128,0,304486:0:0:0:0: -109,192,304407,1,0,0:0:0:0: -182,192,304486,128,0,304565:0:0:0:0: -329,192,304486,1,0,0:0:0:0: -475,192,304565,128,0,304802:0:0:0:0: -256,192,304565,1,0,0:0:0:0: -402,192,304565,1,0,0:0:0:0: -36,192,304565,1,0,0:0:0:0: -329,192,304644,128,0,304723:0:0:0:0: -109,192,304644,1,0,0:0:0:0: -182,192,304723,128,0,304802:0:0:0:0: -36,192,304723,1,0,0:0:0:0: -402,192,304723,1,0,0:0:0:0: -256,192,304802,128,0,304881:0:0:0:0: -109,192,304802,1,0,0:0:0:0: -329,192,304881,128,0,304960:0:0:0:0: -36,192,304881,128,0,305197:0:0:0:0: -182,192,304881,1,0,0:0:0:0: -475,192,304881,128,0,304960:0:0:0:0: -109,192,304960,1,0,0:0:0:0: -402,192,305039,128,0,305118:0:0:0:0: -475,192,305039,1,0,0:0:0:0: -256,192,305039,128,0,305118:0:0:0:0: -182,192,305118,1,0,0:0:0:0: -256,192,305197,128,0,305276:0:0:0:0: -475,192,305197,128,0,305513:0:0:0:0: -402,192,305197,1,0,0:0:0:0: -109,192,305197,128,0,305276:0:0:0:0: -329,192,305276,128,0,305355:0:0:0:0: -182,192,305355,128,0,305434:0:0:0:0: -402,192,305355,1,0,0:0:0:0: -36,192,305355,128,0,305434:0:0:0:0: -256,192,305434,1,0,0:0:0:0: -109,192,305513,128,0,305592:0:0:0:0: -36,192,305513,128,0,305828:0:0:0:0: -182,192,305513,1,0,0:0:0:0: -402,192,305513,128,0,305592:0:0:0:0: -256,192,305592,1,0,0:0:0:0: -182,192,305671,128,0,305750:0:0:0:0: -329,192,305671,1,0,0:0:0:0: -475,192,305671,128,0,305750:0:0:0:0: -256,192,305750,128,0,305828:0:0:0:0: -329,192,305828,128,0,305907:0:0:0:0: -475,192,305828,128,0,306144:0:0:0:0: -109,192,305828,1,0,0:0:0:0: -402,192,305828,128,0,305907:0:0:0:0: -182,192,305907,1,0,0:0:0:0: -109,192,305986,128,0,306144:0:0:0:0: -36,192,305986,1,0,0:0:0:0: -256,192,305986,128,0,306065:0:0:0:0: -182,192,306065,128,0,306144:0:0:0:0: -329,192,306065,1,0,0:0:0:0: -256,192,306144,128,0,306223:0:0:0:0: -36,192,306144,128,0,306460:0:0:0:0: -402,192,306144,128,0,306223:0:0:0:0: -329,192,306223,1,0,0:0:0:0: -475,192,306302,128,0,306381:0:0:0:0: -256,192,306302,1,0,0:0:0:0: -109,192,306302,128,0,306381:0:0:0:0: -182,192,306381,128,0,306460:0:0:0:0: -329,192,306381,1,0,0:0:0:0: -256,192,306460,128,0,306539:0:0:0:0: -475,192,306460,128,0,306776:0:0:0:0: -109,192,306460,1,0,0:0:0:0: -402,192,306460,128,0,306539:0:0:0:0: -36,192,306539,128,0,306618:0:0:0:0: -182,192,306539,1,0,0:0:0:0: -329,192,306618,128,0,306776:0:0:0:0: -402,192,306618,1,0,0:0:0:0: -109,192,306618,128,0,306697:0:0:0:0: -256,192,306697,128,0,306776:0:0:0:0: -182,192,306776,128,0,306855:0:0:0:0: -36,192,306776,128,0,307092:0:0:0:0: -109,192,306776,1,0,0:0:0:0: -402,192,306776,128,0,306855:0:0:0:0: -329,192,306855,1,0,0:0:0:0: -402,192,306934,128,0,307092:0:0:0:0: -475,192,306934,1,0,0:0:0:0: -256,192,306934,128,0,307013:0:0:0:0: -182,192,307013,128,0,307092:0:0:0:0: -109,192,307013,1,0,0:0:0:0: -329,192,307092,128,0,307328:0:0:0:0: -475,192,307092,128,0,307328:0:0:0:0: -256,192,307092,128,0,307171:0:0:0:0: -36,192,307171,128,0,307407:0:0:0:0: -109,192,307171,128,0,307250:0:0:0:0: -182,192,307250,128,0,307407:0:0:0:0: -402,192,307250,128,0,307328:0:0:0:0: -256,192,307328,128,0,307407:0:0:0:0: -475,192,307407,128,0,308039:0:0:0:0: -329,192,307407,128,0,308039:0:0:0:0: -109,192,307407,128,0,307565:0:0:0:0: -402,192,307407,128,0,307486:0:0:0:0: -36,192,307486,128,0,307644:0:0:0:0: -256,192,307486,128,0,307565:0:0:0:0: -182,192,307565,128,0,307723:0:0:0:0: -402,192,307565,128,0,307644:0:0:0:0: -109,192,307644,128,0,307802:0:0:0:0: -256,192,307723,128,0,307881:0:0:0:0: -36,192,307723,128,0,307802:0:0:0:0: -182,192,307802,128,0,307960:0:0:0:0: -402,192,307802,128,0,307881:0:0:0:0: -36,192,307881,128,0,307960:0:0:0:0: -256,192,307960,128,0,308039:0:0:0:0: -109,192,307960,128,0,308118:0:0:0:0: -402,192,308039,128,0,308197:0:0:0:0: -36,192,308039,128,0,308671:0:0:0:0: -182,192,308039,128,0,308671:0:0:0:0: -256,192,308118,128,0,308197:0:0:0:0: -475,192,308118,128,0,308276:0:0:0:0: -109,192,308197,128,0,308276:0:0:0:0: -329,192,308197,128,0,308355:0:0:0:0: -402,192,308276,128,0,308434:0:0:0:0: -256,192,308355,128,0,308513:0:0:0:0: -475,192,308355,128,0,308434:0:0:0:0: -329,192,308434,128,0,308592:0:0:0:0: -109,192,308434,128,0,308513:0:0:0:0: -475,192,308513,128,0,308592:0:0:0:0: -256,192,308592,128,0,308671:0:0:0:0: -402,192,308592,128,0,308671:0:0:0:0: -475,192,308671,128,0,308828:0:0:0:0: -329,192,308671,128,0,308750:0:0:0:0: -109,192,308671,128,0,308828:0:0:0:0: -256,192,308750,128,0,308828:0:0:0:0: -36,192,308828,128,0,308986:0:0:0:0: -182,192,308828,128,0,308907:0:0:0:0: -402,192,308828,128,0,308986:0:0:0:0: -256,192,308907,128,0,308986:0:0:0:0: -329,192,308986,128,0,309144:0:0:0:0: -475,192,308986,128,0,309065:0:0:0:0: -109,192,308986,128,0,309065:0:0:0:0: -256,192,309065,128,0,309144:0:0:0:0: -182,192,309144,128,0,309302:0:0:0:0: -475,192,309144,128,0,309223:0:0:0:0: -36,192,309144,128,0,309223:0:0:0:0: -329,192,309223,128,0,309302:0:0:0:0: -109,192,309302,128,0,309381:0:0:0:0: -402,192,309302,128,0,309381:0:0:0:0: -36,192,309302,128,0,309539:0:0:0:0: -475,192,309302,128,0,309539:0:0:0:0: -256,192,309381,128,0,309460:0:0:0:0: -329,192,309460,128,0,309539:0:0:0:0: -182,192,309460,128,0,309539:0:0:0:0: -109,192,309539,128,0,309618:0:0:0:0: -402,192,309539,128,0,309618:0:0:0:0: -475,192,309618,128,0,309697:0:0:0:0: -329,192,309618,128,0,309697:0:0:0:0: -182,192,309618,128,0,309697:0:0:0:0: -36,192,309618,128,0,309697:0:0:0:0: -36,192,309776,128,0,309855:0:0:0:0: -182,192,309776,128,0,309855:0:0:0:0: -329,192,309776,128,0,309855:0:0:0:0: -475,192,309776,128,0,309855:0:0:0:0: -329,192,309934,128,0,310013:0:0:0:0: -36,192,309934,128,0,310250:0:0:0:0: -182,192,309934,128,0,310013:0:0:0:0: -475,192,309934,128,0,310013:0:0:0:0: -256,192,310013,128,0,310092:0:0:0:0: -109,192,310013,128,0,310092:0:0:0:0: -402,192,310013,128,0,310092:0:0:0:0: -109,192,310171,128,0,310250:0:0:0:0: -329,192,310171,128,0,310250:0:0:0:0: -256,192,310171,128,0,310250:0:0:0:0: -182,192,310250,128,0,310328:0:0:0:0: -475,192,310250,128,0,310565:0:0:0:0: -402,192,310250,128,0,310328:0:0:0:0: -329,192,310328,128,0,310407:0:0:0:0: -109,192,310328,1,0,0:0:0:0: -36,192,310407,128,0,310486:0:0:0:0: -182,192,310407,1,0,0:0:0:0: -256,192,310407,128,0,310486:0:0:0:0: -109,192,310486,1,0,0:0:0:0: -36,192,310565,128,0,310881:0:0:0:0: -182,192,310565,128,0,310644:0:0:0:0: -402,192,310565,1,0,0:0:0:0: -329,192,310565,128,0,310644:0:0:0:0: -109,192,310644,1,0,0:0:0:0: -256,192,310723,128,0,310802:0:0:0:0: -329,192,310723,1,0,0:0:0:0: -475,192,310723,128,0,310802:0:0:0:0: -182,192,310802,1,0,0:0:0:0: -402,192,310802,128,0,310881:0:0:0:0: -256,192,310881,128,0,310960:0:0:0:0: -475,192,310881,128,0,311197:0:0:0:0: -109,192,310881,1,0,0:0:0:0: -329,192,310881,128,0,310960:0:0:0:0: -182,192,310960,1,0,0:0:0:0: -109,192,311039,128,0,311118:0:0:0:0: -402,192,311039,1,0,0:0:0:0: -36,192,311039,128,0,311118:0:0:0:0: -256,192,311039,1,0,0:0:0:0: -182,192,311118,128,0,311197:0:0:0:0: -329,192,311118,1,0,0:0:0:0: -256,192,311197,128,0,311276:0:0:0:0: -36,192,311197,128,0,311513:0:0:0:0: -109,192,311197,1,0,0:0:0:0: -402,192,311197,128,0,311276:0:0:0:0: -329,192,311276,1,0,0:0:0:0: -109,192,311355,128,0,311434:0:0:0:0: -475,192,311355,1,0,0:0:0:0: -256,192,311355,128,0,311434:0:0:0:0: -182,192,311434,128,0,311513:0:0:0:0: -402,192,311434,1,0,0:0:0:0: -256,192,311513,128,0,311671:0:0:0:0: -475,192,311513,128,0,311828:0:0:0:0: -329,192,311513,1,0,0:0:0:0: -109,192,311513,1,0,0:0:0:0: -36,192,311592,128,0,311671:0:0:0:0: -182,192,311592,1,0,0:0:0:0: -329,192,311671,128,0,311828:0:0:0:0: -109,192,311671,1,0,0:0:0:0: -402,192,311671,1,0,0:0:0:0: -182,192,311750,128,0,311828:0:0:0:0: -109,192,311828,128,0,311907:0:0:0:0: -36,192,311828,128,0,312144:0:0:0:0: -256,192,311828,1,0,0:0:0:0: -402,192,311828,128,0,311907:0:0:0:0: -329,192,311907,128,0,311986:0:0:0:0: -475,192,311986,128,0,312065:0:0:0:0: -109,192,311986,1,0,0:0:0:0: -256,192,311986,128,0,312065:0:0:0:0: -402,192,312065,128,0,312144:0:0:0:0: -182,192,312065,1,0,0:0:0:0: -256,192,312144,128,0,312460:0:0:0:0: -475,192,312144,128,0,312460:0:0:0:0: -329,192,312144,1,0,0:0:0:0: -109,192,312144,128,0,312223:0:0:0:0: -182,192,312223,128,0,312381:0:0:0:0: -402,192,312302,1,0,0:0:0:0: -109,192,312302,128,0,312460:0:0:0:0: -36,192,312302,1,0,0:0:0:0: -329,192,312381,128,0,312460:0:0:0:0: -402,192,312460,128,0,312539:0:0:0:0: -36,192,312460,128,0,312776:0:0:0:0: -182,192,312460,128,0,312539:0:0:0:0: -329,192,312539,1,0,0:0:0:0: -475,192,312618,128,0,312697:0:0:0:0: -109,192,312618,1,0,0:0:0:0: -256,192,312618,128,0,312697:0:0:0:0: -329,192,312697,1,0,0:0:0:0: -109,192,312776,128,0,312855:0:0:0:0: -475,192,312776,128,0,313092:0:0:0:0: -182,192,312776,1,0,0:0:0:0: -256,192,312776,128,0,312855:0:0:0:0: -329,192,312855,1,0,0:0:0:0: -402,192,312855,128,0,312934:0:0:0:0: -182,192,312934,128,0,313013:0:0:0:0: -256,192,312934,1,0,0:0:0:0: -36,192,312934,128,0,313013:0:0:0:0: -329,192,313013,1,0,0:0:0:0: -256,192,313092,128,0,313171:0:0:0:0: -36,192,313092,128,0,313407:0:0:0:0: -109,192,313092,1,0,0:0:0:0: -402,192,313092,128,0,313171:0:0:0:0: -182,192,313171,1,0,0:0:0:0: -329,192,313250,128,0,313328:0:0:0:0: -109,192,313250,1,0,0:0:0:0: -475,192,313250,128,0,313328:0:0:0:0: -256,192,313328,128,0,313407:0:0:0:0: -182,192,313328,1,0,0:0:0:0: -329,192,313407,128,0,313486:0:0:0:0: -475,192,313407,128,0,313723:0:0:0:0: -109,192,313407,1,0,0:0:0:0: -402,192,313407,128,0,313486:0:0:0:0: -182,192,313486,1,0,0:0:0:0: -109,192,313565,128,0,313723:0:0:0:0: -36,192,313565,1,0,0:0:0:0: -402,192,313565,1,0,0:0:0:0: -256,192,313565,128,0,313644:0:0:0:0: -182,192,313644,128,0,313723:0:0:0:0: -329,192,313644,1,0,0:0:0:0: -36,192,313723,128,0,313881:0:0:0:0: -402,192,313723,128,0,313802:0:0:0:0: -256,192,313723,128,0,313802:0:0:0:0: -182,192,313802,1,0,0:0:0:0: -329,192,313881,128,0,313960:0:0:0:0: -402,192,313881,1,0,0:0:0:0: -475,192,313881,128,0,313960:0:0:0:0: -109,192,313881,128,0,313960:0:0:0:0: -256,192,313960,128,0,314039:0:0:0:0: -182,192,314039,128,0,314118:0:0:0:0: -475,192,314039,1,0,0:0:0:0: -36,192,314039,128,0,314118:0:0:0:0: -402,192,314039,128,0,314118:0:0:0:0: -329,192,314118,128,0,314276:0:0:0:0: -182,192,314197,128,0,314276:0:0:0:0: -109,192,314197,1,0,0:0:0:0: -36,192,314197,128,0,314276:0:0:0:0: -475,192,314197,128,0,314276:0:0:0:0: -256,192,314276,128,0,314355:0:0:0:0: -109,192,314355,128,0,314513:0:0:0:0: -475,192,314355,128,0,314434:0:0:0:0: -36,192,314355,128,0,314434:0:0:0:0: -329,192,314355,128,0,314434:0:0:0:0: -402,192,314434,128,0,314671:0:0:0:0: -329,192,314513,128,0,314592:0:0:0:0: -36,192,314513,1,0,0:0:0:0: -475,192,314513,1,0,0:0:0:0: -182,192,314513,128,0,314592:0:0:0:0: -256,192,314592,128,0,314671:0:0:0:0: -109,192,314671,128,0,314986:0:0:0:0: -182,192,314671,1,0,0:0:0:0: -475,192,314671,128,0,314750:0:0:0:0: -36,192,314671,128,0,314750:0:0:0:0: -329,192,314750,128,0,314907:0:0:0:0: -256,192,314750,1,0,0:0:0:0: -182,192,314828,128,0,314907:0:0:0:0: -36,192,314828,1,0,0:0:0:0: -475,192,314828,1,0,0:0:0:0: -256,192,314907,128,0,314986:0:0:0:0: -402,192,314907,128,0,314986:0:0:0:0: -182,192,314986,128,0,315065:0:0:0:0: -475,192,314986,128,0,315302:0:0:0:0: -36,192,314986,128,0,315065:0:0:0:0: -329,192,314986,1,0,0:0:0:0: -402,192,315065,1,0,0:0:0:0: -109,192,315144,128,0,315223:0:0:0:0: -256,192,315144,128,0,315223:0:0:0:0: -36,192,315144,1,0,0:0:0:0: -329,192,315223,1,0,0:0:0:0: -402,192,315302,128,0,315381:0:0:0:0: -36,192,315302,128,0,315618:0:0:0:0: -109,192,315302,128,0,315381:0:0:0:0: -256,192,315302,1,0,0:0:0:0: -182,192,315381,128,0,315460:0:0:0:0: -329,192,315381,1,0,0:0:0:0: -256,192,315460,128,0,315539:0:0:0:0: -475,192,315460,128,0,315539:0:0:0:0: -402,192,315460,1,0,0:0:0:0: -109,192,315539,1,0,0:0:0:0: -402,192,315618,128,0,315697:0:0:0:0: -475,192,315618,128,0,315934:0:0:0:0: -182,192,315618,1,0,0:0:0:0: -329,192,315618,128,0,315697:0:0:0:0: -109,192,315697,1,0,0:0:0:0: -402,192,315776,128,0,315855:0:0:0:0: -36,192,315776,1,0,0:0:0:0: -256,192,315776,128,0,315855:0:0:0:0: -182,192,315855,128,0,315934:0:0:0:0: -109,192,315934,128,0,316013:0:0:0:0: -36,192,315934,128,0,316250:0:0:0:0: -402,192,315934,1,0,0:0:0:0: -329,192,315934,128,0,316013:0:0:0:0: -256,192,316013,1,0,0:0:0:0: -402,192,316092,128,0,316250:0:0:0:0: -475,192,316092,1,0,0:0:0:0: -182,192,316092,128,0,316171:0:0:0:0: -329,192,316171,128,0,316250:0:0:0:0: -475,192,316250,128,0,316565:0:0:0:0: -256,192,316250,128,0,316328:0:0:0:0: -109,192,316250,128,0,316328:0:0:0:0: -329,192,316328,1,0,0:0:0:0: -402,192,316407,128,0,316486:0:0:0:0: -36,192,316407,1,0,0:0:0:0: -182,192,316407,128,0,316486:0:0:0:0: -329,192,316486,128,0,316565:0:0:0:0: -256,192,316565,128,0,316644:0:0:0:0: -36,192,316565,128,0,316881:0:0:0:0: -402,192,316565,1,0,0:0:0:0: -109,192,316565,128,0,316644:0:0:0:0: -329,192,316644,128,0,316723:0:0:0:0: -475,192,316644,1,0,0:0:0:0: -402,192,316723,128,0,316802:0:0:0:0: -109,192,316723,1,0,0:0:0:0: -182,192,316723,128,0,316802:0:0:0:0: -256,192,316802,128,0,316881:0:0:0:0: -475,192,316881,128,0,316960:0:0:0:0: -329,192,316881,1,0,0:0:0:0: -182,192,316881,1,0,0:0:0:0: -256,192,316960,1,0,0:0:0:0: -109,192,316960,1,0,0:0:0:0: -329,192,317039,128,0,317118:0:0:0:0: -182,192,317039,1,0,0:0:0:0: -36,192,317039,1,0,0:0:0:0: -475,192,317118,128,0,317434:0:0:0:0: -256,192,317118,1,0,0:0:0:0: -109,192,317118,1,0,0:0:0:0: -329,192,317197,1,0,0:0:0:0: -36,192,317197,128,0,317434:0:0:0:0: -402,192,317197,128,0,317276:0:0:0:0: -182,192,317197,1,0,0:0:0:0: -256,192,317276,128,0,317355:0:0:0:0: -109,192,317276,128,0,317355:0:0:0:0: -402,192,317355,1,0,0:0:0:0: -182,192,317355,128,0,317434:0:0:0:0: -329,192,317355,128,0,317434:0:0:0:0: -256,192,317434,1,0,0:0:0:0: -182,192,317513,1,0,0:0:0:0: -36,192,317513,1,0,0:0:0:0: -329,192,317513,1,0,0:0:0:0: -475,192,317513,1,0,0:0:0:0: -402,192,317513,1,0,0:0:0:0: -182,192,317671,1,0,0:0:0:0: -329,192,317671,1,0,0:0:0:0: -36,192,317671,1,0,0:0:0:0: -182,192,317828,128,0,317907:0:0:0:0: -329,192,317828,128,0,317907:0:0:0:0: -256,192,317907,128,0,317986:0:0:0:0: -402,192,317907,128,0,317986:0:0:0:0: -329,192,317986,128,0,318065:0:0:0:0: -475,192,317986,128,0,318065:0:0:0:0: -475,192,318144,1,0,0:0:0:0: -402,192,318144,1,0,0:0:0:0: -36,192,318144,1,0,0:0:0:0: -182,192,318144,1,0,0:0:0:0: -109,192,318144,1,0,0:0:0:0: -329,192,318302,128,0,318381:0:0:0:0: -182,192,318302,128,0,318381:0:0:0:0: -256,192,318381,128,0,318460:0:0:0:0: -109,192,318381,128,0,318460:0:0:0:0: -182,192,318460,128,0,318539:0:0:0:0: -36,192,318460,128,0,318539:0:0:0:0: -329,192,318618,128,0,318697:0:0:0:0: -475,192,318618,128,0,318697:0:0:0:0: -256,192,318697,128,0,318776:0:0:0:0: -402,192,318697,128,0,318776:0:0:0:0: -182,192,318776,128,0,318855:0:0:0:0: -109,192,318776,128,0,318855:0:0:0:0: -36,192,318776,128,0,318855:0:0:0:0: -475,192,318776,128,0,318855:0:0:0:0: -329,192,318776,128,0,318855:0:0:0:0: -402,192,318934,1,0,0:0:0:0: -256,192,318934,1,0,0:0:0:0: -109,192,318934,1,0,0:0:0:0: -36,192,319092,128,0,319171:0:0:0:0: -182,192,319092,128,0,319171:0:0:0:0: -256,192,319092,128,0,319171:0:0:0:0: -329,192,319092,128,0,319171:0:0:0:0: -475,192,319092,128,0,319171:0:0:0:0: -402,192,319250,1,0,0:0:0:0: -256,192,319250,1,0,0:0:0:0: -109,192,319250,1,0,0:0:0:0: -36,192,319407,128,0,319486:0:0:0:0: -109,192,319407,128,0,319486:0:0:0:0: -256,192,319407,128,0,319486:0:0:0:0: -402,192,319407,128,0,319486:0:0:0:0: -475,192,319407,128,0,319486:0:0:0:0: -402,192,319565,1,0,0:0:0:0: -256,192,319565,1,0,0:0:0:0: -109,192,319565,1,0,0:0:0:0: -36,192,319723,128,0,319960:0:0:0:0: -109,192,319723,128,0,319960:0:0:0:0: -182,192,319723,128,0,319960:0:0:0:0: -329,192,319723,128,0,319960:0:0:0:0: -402,192,319723,128,0,319960:0:0:0:0: -475,192,319723,128,0,319960:0:0:0:0: -329,192,320039,128,0,320434:0:0:0:0: -475,192,320039,128,0,320434:0:0:0:0: -36,192,320039,128,0,320197:0:0:0:0: -109,192,320039,1,0,0:0:0:0: -256,192,320039,1,0,0:0:0:0: -402,192,320039,1,0,0:0:0:0: -182,192,320197,128,0,320434:0:0:0:0: -36,192,320355,128,0,320434:0:0:0:0: -109,192,320513,128,0,320907:0:0:0:0: -256,192,320513,128,0,320907:0:0:0:0: -475,192,320513,128,0,320671:0:0:0:0: -182,192,320513,1,0,0:0:0:0: -36,192,320513,1,0,0:0:0:0: -329,192,320513,1,0,0:0:0:0: -402,192,320671,128,0,320907:0:0:0:0: -475,192,320828,128,0,320907:0:0:0:0: -36,192,320986,128,0,322486:0:0:0:0: -475,192,320986,1,0,0:0:0:0: -182,192,320986,128,0,322486:0:0:0:0: -329,192,320986,128,0,322486:0:0:0:0: -109,192,320986,1,0,0:0:0:0: -256,192,320986,1,0,0:0:0:0: -402,192,321065,1,0,0:0:0:0: -256,192,321144,1,0,0:0:0:0: -402,192,321223,1,0,0:0:0:0: -475,192,321302,1,0,0:0:0:0: -402,192,321381,1,0,0:0:0:0: -256,192,321460,1,0,0:0:0:0: -109,192,321539,1,0,0:0:0:0: -256,192,321618,1,0,0:0:0:0: -402,192,321697,1,0,0:0:0:0: -475,192,321776,1,0,0:0:0:0: -402,192,321855,1,0,0:0:0:0: -256,192,321934,1,0,0:0:0:0: -109,192,322013,1,0,0:0:0:0: -256,192,322092,1,0,0:0:0:0: -402,192,322171,1,0,0:0:0:0: -475,192,322250,1,0,0:0:0:0: -402,192,322328,1,0,0:0:0:0: -256,192,322407,1,0,0:0:0:0: -109,192,322486,1,0,0:0:0:0: -182,192,322565,128,0,322960:0:0:0:0: -329,192,322565,128,0,322723:0:0:0:0: -36,192,322565,128,0,322960:0:0:0:0: -256,192,322565,1,0,0:0:0:0: -475,192,322565,1,0,0:0:0:0: -402,192,322565,1,0,0:0:0:0: -475,192,322723,128,0,322960:0:0:0:0: -329,192,322881,128,0,322960:0:0:0:0: -256,192,323039,128,0,323434:0:0:0:0: -402,192,323039,128,0,323434:0:0:0:0: -36,192,323039,128,0,323197:0:0:0:0: -182,192,323039,1,0,0:0:0:0: -329,192,323039,1,0,0:0:0:0: -475,192,323039,1,0,0:0:0:0: -109,192,323197,128,0,323434:0:0:0:0: -36,192,323355,128,0,323434:0:0:0:0: -475,192,323513,128,0,325013:0:0:0:0: -329,192,323513,128,0,325171:0:0:0:0: -182,192,323513,128,0,325328:0:0:0:0: -36,192,323513,1,0,0:0:0:0: -256,192,323513,1,0,0:0:0:0: -402,192,323513,1,0,0:0:0:0: -109,192,323592,1,0,0:0:0:0: -256,192,323671,1,0,0:0:0:0: -109,192,323750,1,0,0:0:0:0: -36,192,323828,1,0,0:0:0:0: -109,192,323907,1,0,0:0:0:0: -256,192,323986,1,0,0:0:0:0: -402,192,324065,1,0,0:0:0:0: -256,192,324144,1,0,0:0:0:0: -109,192,324223,1,0,0:0:0:0: -36,192,324302,1,0,0:0:0:0: -109,192,324381,1,0,0:0:0:0: -256,192,324460,1,0,0:0:0:0: -402,192,324539,1,0,0:0:0:0: -256,192,324618,1,0,0:0:0:0: -109,192,324697,1,0,0:0:0:0: -36,192,324776,1,0,0:0:0:0: -109,192,324855,1,0,0:0:0:0: -256,192,324934,1,0,0:0:0:0: -402,192,325013,1,0,0:0:0:0: -475,192,325092,1,0,0:0:0:0: -36,192,325092,1,0,0:0:0:0: -109,192,325092,1,0,0:0:0:0: -402,192,325171,1,0,0:0:0:0: -329,192,325250,1,0,0:0:0:0: -36,192,325250,1,0,0:0:0:0: -475,192,325250,1,0,0:0:0:0: -256,192,325328,1,0,0:0:0:0: -182,192,325407,1,0,0:0:0:0: -402,192,325407,1,0,0:0:0:0: -475,192,325407,1,0,0:0:0:0: -109,192,325486,1,0,0:0:0:0: -256,192,325565,1,0,0:0:0:0: -36,192,325565,1,0,0:0:0:0: -475,192,325565,1,0,0:0:0:0: -402,192,325644,1,0,0:0:0:0: -329,192,325723,1,0,0:0:0:0: -182,192,325723,1,0,0:0:0:0: -36,192,325723,128,0,326355:0:0:0:0: -402,192,325802,1,0,0:0:0:0: -475,192,325881,1,0,0:0:0:0: -256,192,325881,1,0,0:0:0:0: -329,192,325960,1,0,0:0:0:0: -402,192,326039,1,0,0:0:0:0: -182,192,326039,1,0,0:0:0:0: -256,192,326092,1,0,0:0:0:0: -329,192,326144,1,0,0:0:0:0: -109,192,326197,1,0,0:0:0:0: -182,192,326236,1,0,0:0:0:0: -256,192,326276,1,0,0:0:0:0: -329,192,326315,1,0,0:0:0:0: -402,192,326355,1,0,0:0:0:0: -109,192,326355,1,0,0:0:0:0: -182,192,326355,1,0,0:0:0:0: -475,192,326355,1,0,0:0:0:0: -256,192,326513,1,0,0:0:0:0: -109,192,326513,1,0,0:0:0:0: -36,192,326513,1,0,0:0:0:0: -182,192,326592,1,0,0:0:0:0: -329,192,326592,1,0,0:0:0:0: -402,192,326592,1,0,0:0:0:0: -475,192,326592,1,0,0:0:0:0: -402,192,326750,1,0,0:0:0:0: -256,192,326750,1,0,0:0:0:0: -475,192,326750,1,0,0:0:0:0: -36,192,326828,1,0,0:0:0:0: -182,192,326828,1,0,0:0:0:0: -109,192,326828,1,0,0:0:0:0: -329,192,326828,1,0,0:0:0:0: -256,192,326986,1,0,0:0:0:0: -36,192,326986,1,0,0:0:0:0: -475,192,326986,1,0,0:0:0:0: -329,192,327065,1,0,0:0:0:0: -402,192,327065,1,0,0:0:0:0: -109,192,327144,1,0,0:0:0:0: -182,192,327144,1,0,0:0:0:0: -329,192,327223,1,0,0:0:0:0: -402,192,327223,1,0,0:0:0:0: -256,192,327302,1,0,0:0:0:0: -36,192,327302,1,0,0:0:0:0: -475,192,327302,1,0,0:0:0:0: -182,192,327302,1,0,0:0:0:0: -109,192,327460,1,0,0:0:0:0: -182,192,327460,1,0,0:0:0:0: -402,192,327460,1,0,0:0:0:0: -329,192,327460,1,0,0:0:0:0: -329,192,327618,128,0,328013:0:0:0:0: -475,192,327618,128,0,328013:0:0:0:0: -182,192,327618,128,0,327776:0:0:0:0: -36,192,327618,1,0,0:0:0:0: -402,192,327618,1,0,0:0:0:0: -109,192,327618,1,0,0:0:0:0: -36,192,327776,128,0,328013:0:0:0:0: -182,192,327934,128,0,328013:0:0:0:0: -109,192,328092,128,0,328486:0:0:0:0: -256,192,328092,128,0,328486:0:0:0:0: -402,192,328092,128,0,328250:0:0:0:0: -182,192,328092,1,0,0:0:0:0: -36,192,328092,1,0,0:0:0:0: -475,192,328092,1,0,0:0:0:0: -475,192,328250,128,0,328486:0:0:0:0: -402,192,328407,128,0,328486:0:0:0:0: -182,192,328565,128,0,328960:0:0:0:0: -36,192,328565,128,0,328960:0:0:0:0: -329,192,328565,128,0,328723:0:0:0:0: -475,192,328565,1,0,0:0:0:0: -109,192,328565,1,0,0:0:0:0: -402,192,328565,1,0,0:0:0:0: -475,192,328723,128,0,328960:0:0:0:0: -329,192,328881,128,0,328960:0:0:0:0: -402,192,329039,128,0,329197:0:0:0:0: -256,192,329039,128,0,329434:0:0:0:0: -109,192,329039,128,0,329434:0:0:0:0: -329,192,329039,1,0,0:0:0:0: -475,192,329039,1,0,0:0:0:0: -36,192,329039,1,0,0:0:0:0: -329,192,329197,128,0,329434:0:0:0:0: -402,192,329355,128,0,329434:0:0:0:0: -182,192,329513,128,0,329907:0:0:0:0: -36,192,329513,128,0,329907:0:0:0:0: -475,192,329513,128,0,329907:0:0:0:0: -329,192,329513,128,0,329671:0:0:0:0: -109,192,329513,1,0,0:0:0:0: -256,192,329513,1,0,0:0:0:0: -402,192,329671,128,0,329907:0:0:0:0: -329,192,329828,128,0,329907:0:0:0:0: -109,192,329986,128,0,330381:0:0:0:0: -256,192,329986,128,0,330144:0:0:0:0: -402,192,329986,128,0,330381:0:0:0:0: -36,192,329986,1,0,0:0:0:0: -329,192,329986,1,0,0:0:0:0: -475,192,329986,1,0,0:0:0:0: -182,192,330144,128,0,330381:0:0:0:0: -256,192,330302,128,0,330381:0:0:0:0: -36,192,330460,128,0,330855:0:0:0:0: -109,192,330460,128,0,330855:0:0:0:0: -402,192,330460,128,0,330618:0:0:0:0: -182,192,330460,1,0,0:0:0:0: -329,192,330460,1,0,0:0:0:0: -475,192,330460,1,0,0:0:0:0: -256,192,330618,128,0,330855:0:0:0:0: -402,192,330776,128,0,330855:0:0:0:0: -329,192,330934,128,0,331328:0:0:0:0: -402,192,330934,128,0,331328:0:0:0:0: -109,192,330934,128,0,331092:0:0:0:0: -36,192,330934,1,0,0:0:0:0: -256,192,330934,1,0,0:0:0:0: -475,192,330934,1,0,0:0:0:0: -182,192,331092,128,0,331328:0:0:0:0: -109,192,331250,128,0,331328:0:0:0:0: -36,192,331407,128,0,331802:0:0:0:0: -182,192,331407,128,0,331565:0:0:0:0: -402,192,331407,128,0,331802:0:0:0:0: -109,192,331407,1,0,0:0:0:0: -256,192,331407,1,0,0:0:0:0: -475,192,331407,1,0,0:0:0:0: -329,192,331565,128,0,331802:0:0:0:0: -182,192,331723,128,0,331802:0:0:0:0: -256,192,331881,128,0,332039:0:0:0:0: -475,192,331881,128,0,332355:0:0:0:0: -36,192,331881,1,0,0:0:0:0: -402,192,331881,1,0,0:0:0:0: -109,192,331881,128,0,332355:0:0:0:0: -329,192,332039,128,0,332355:0:0:0:0: -256,192,332197,128,0,332355:0:0:0:0: -36,192,332355,128,0,333934:0:0:0:0: -182,192,332355,128,0,332513:0:0:0:0: -402,192,332355,128,0,332513:0:0:0:0: -329,192,332513,128,0,333697:0:0:0:0: -475,192,332513,128,0,333618:0:0:0:0: -109,192,332513,128,0,333855:0:0:0:0: -256,192,332513,128,0,333776:0:0:0:0: From da36c2a3f9c0cfc905acd184537d4f75149fd329 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 12:17:34 +0800 Subject: [PATCH 79/87] Remove unresolvable cref --- .../ManiaUnstableRateEstimationTest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 2a4896f44864..6788de693ee2 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -17,7 +17,7 @@ namespace osu.Game.Rulesets.Mania.Tests { /// - /// This test suite tests . + /// This test suite tests ManiaPerformanceCalculator.computeEstimatedUr /// /// This suite focuses on the objective aspects of the calculation, not the accuracy of the calculation. /// From dd4a3ec724bbccbf8586232901e097318ca58ce5 Mon Sep 17 00:00:00 2001 From: Evening Date: Wed, 2 Aug 2023 12:49:12 +0800 Subject: [PATCH 80/87] Add test for More Max Less UR --- .../ManiaUnstableRateEstimationTest.cs | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 6788de693ee2..1105691a75b7 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -104,6 +104,33 @@ public void TestEdge( ); } + /// + /// This tests if the UR gets smaller, given more judgements on MAX. + /// This follows the logic that: + /// - More MAX judgements implies stronger evidence of smaller UR, as the probability of hitting more MAX is lower. + /// + /// It's not necessary, nor logical to test other behaviors. + /// + /// + [Test] + public void TestMoreMaxJudgementsSmallerUr( + [Values(1, 10, 1000)] int count, + [Values(1, 10, 1000)] int step + ) + { + int[] judgementCountsLess = { count, 0, 0, 0, 0, 0 }; + int[] judgementCountsMore = { count + step, 0, 0, 0, 0, 0 }; + double? estimatedUrLessJudgements = computeUnstableRate(judgementCountsLess); + double? estimatedUrMoreJudgements = computeUnstableRate(judgementCountsMore); + + // Assert that More Judgements results in a smaller UR. + Assert.That( + estimatedUrMoreJudgements, Is.LessThan(estimatedUrLessJudgements), + $"UR {estimatedUrMoreJudgements} with More Judgements {string.Join(",", judgementCountsMore)} >= " + + $"UR {estimatedUrLessJudgements} than Less Judgements {string.Join(",", judgementCountsLess)} " + ); + } + /// /// Evaluates the Unstable Rate /// From 9cc6a3a4c0c8d4fa93fab315b31c1504cc32099a Mon Sep 17 00:00:00 2001 From: Natelytle Date: Wed, 2 Aug 2023 00:51:28 -0400 Subject: [PATCH 81/87] Switch to using deviation on notes and heads for multiplier scaling --- .../Difficulty/ManiaPerformanceAttributes.cs | 2 +- .../Difficulty/ManiaPerformanceCalculator.cs | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs index 5a03336a4d12..fb14100f04dc 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceAttributes.cs @@ -16,7 +16,7 @@ public class ManiaPerformanceAttributes : PerformanceAttributes public double? EstimatedUr { get; set; } [JsonProperty("hit_windows")] - public double[] HitWindows { get; set; } + public double[] HitWindows { get; set; } = null!; public override IEnumerable GetAttributesForDisplay() { diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index cf2aeed66c2b..d7b7ad7b03fb 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -30,7 +30,7 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private int countMiss; private double? estimatedUr; private bool isLegacyScore; - private double[] hitWindows; + private double[] hitWindows = null!; public ManiaPerformanceCalculator() : base(new ManiaRuleset()) @@ -83,7 +83,15 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) if (estimatedUr == null) return 0; - difficultyValue *= Math.Max(1 - Math.Pow(estimatedUr.Value / 500, 1.9), 0); // UR to multiplier curve, see https://www.desmos.com/calculator/w3zgyzqalm + double noteHeadPortion = (double)(attributes.NoteCount + attributes.HoldNoteCount) / (attributes.NoteCount + attributes.HoldNoteCount * 2); + double tailPortion = (double)attributes.HoldNoteCount / (attributes.NoteCount + attributes.HoldNoteCount * 2); + + // We increased the deviation of tails for estimation accuracy, but for difficulty scaling we actually + // only care about the deviation on notes and heads, as that's the "accuracy skill" of the player. + // Increasing the tail multiplier will decrease this value. + double noteHeadUr = estimatedUr.Value / Math.Sqrt(noteHeadPortion + tailPortion * Math.Pow(tail_deviation_multiplier, 2)); + + difficultyValue *= Math.Max(1 - Math.Pow(noteHeadUr / 500, 1.9), 0); return difficultyValue; } From 95c72374cd4afcc189b007430eeaf02e3edf276d Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 7 Aug 2023 21:35:28 +0900 Subject: [PATCH 82/87] Remove IsConvert difficulty attribute --- .../Difficulty/ManiaDifficultyAttributes.cs | 5 ----- .../Difficulty/ManiaDifficultyCalculator.cs | 2 -- .../Difficulty/ManiaPerformanceCalculator.cs | 5 ++++- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs index ac4495bc8647..975083ae9565 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs @@ -35,11 +35,6 @@ public class ManiaDifficultyAttributes : DifficultyAttributes /// public int HoldNoteCount { get; set; } - /// - /// Conversion status from standard. - /// - public bool IsConvert { get; set; } - public override IEnumerable<(int attributeId, object value)> ToDatabaseAttributes() { foreach (var v in base.ToDatabaseAttributes()) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs index 4efc16c3279c..e252b67779ad 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyCalculator.cs @@ -52,7 +52,6 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat int noteCount = beatmap.HitObjects.Count(h => h is Note); int holdNoteCount = beatmap.HitObjects.Count(h => h is HoldNote); - bool isConvert = beatmap.BeatmapInfo.Ruleset.OnlineID != 3; ManiaDifficultyAttributes attributes = new ManiaDifficultyAttributes { @@ -65,7 +64,6 @@ protected override DifficultyAttributes CreateDifficultyAttributes(IBeatmap beat OverallDifficulty = beatmap.Difficulty.OverallDifficulty, NoteCount = noteCount, HoldNoteCount = holdNoteCount, - IsConvert = isConvert }; if (ComputeLegacyScoringValues) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index d7b7ad7b03fb..a176b576a255 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -31,6 +31,7 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private double? estimatedUr; private bool isLegacyScore; private double[] hitWindows = null!; + private bool isConvert; public ManiaPerformanceCalculator() : base(new ManiaRuleset()) @@ -44,6 +45,8 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s { var maniaAttributes = (ManiaDifficultyAttributes)attributes; + isConvert = score.BeatmapInfo!.Ruleset.OnlineID != 3; + countPerfect = score.Statistics.GetValueOrDefault(HitResult.Perfect); countGreat = score.Statistics.GetValueOrDefault(HitResult.Great); countGood = score.Statistics.GetValueOrDefault(HitResult.Good); @@ -145,7 +148,7 @@ private double[] getLegacyHitWindows(ScoreInfo score, ManiaDifficultyAttributes double goodWindowLeniency = 0; // When converting beatmaps to osu!mania in stable, the resulting hit window sizes are dependent on whether the beatmap's OD is above or below 4. - if (attributes.IsConvert) + if (isConvert) { overallDifficulty = 10; From a2197e28af831013b75efc18abb5302fb90fe8b7 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Mon, 7 Aug 2023 21:37:23 +0900 Subject: [PATCH 83/87] Store difficulty attribute values --- .../Difficulty/ManiaDifficultyAttributes.cs | 6 ++++++ osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs | 2 ++ 2 files changed, 8 insertions(+) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs index 975083ae9565..df2a22e91965 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaDifficultyAttributes.cs @@ -42,6 +42,9 @@ public class ManiaDifficultyAttributes : DifficultyAttributes yield return (ATTRIB_ID_DIFFICULTY, StarRating); yield return (ATTRIB_ID_GREAT_HIT_WINDOW, GreatHitWindow); + yield return (ATTRIB_ID_OVERALL_DIFFICULTY, OverallDifficulty); + yield return (ATTRIB_ID_NOTE_COUNT, NoteCount); + yield return (ATTRIB_ID_HOLD_NOTE_COUNT, HoldNoteCount); } public override void FromDatabaseAttributes(IReadOnlyDictionary values, IBeatmapOnlineInfo onlineInfo) @@ -50,6 +53,9 @@ public override void FromDatabaseAttributes(IReadOnlyDictionary val StarRating = values[ATTRIB_ID_DIFFICULTY]; GreatHitWindow = values[ATTRIB_ID_GREAT_HIT_WINDOW]; + OverallDifficulty = values[ATTRIB_ID_OVERALL_DIFFICULTY]; + NoteCount = (int)values[ATTRIB_ID_NOTE_COUNT]; + HoldNoteCount = (int)values[ATTRIB_ID_HOLD_NOTE_COUNT]; } } } diff --git a/osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs b/osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs index 5a01faa4170e..1fe666fe57fb 100644 --- a/osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs +++ b/osu.Game/Rulesets/Difficulty/DifficultyAttributes.cs @@ -30,6 +30,8 @@ public class DifficultyAttributes protected const int ATTRIB_ID_LEGACY_ACCURACY_SCORE = 23; protected const int ATTRIB_ID_LEGACY_COMBO_SCORE = 25; protected const int ATTRIB_ID_LEGACY_BONUS_SCORE_RATIO = 27; + protected const int ATTRIB_ID_NOTE_COUNT = 33; + protected const int ATTRIB_ID_HOLD_NOTE_COUNT = 35; /// /// The mods which were applied to the beatmap. From a05c3b872ce90e5d0b731796763d58e8a4ce9bcc Mon Sep 17 00:00:00 2001 From: Evening Date: Mon, 14 Aug 2023 10:46:13 +0800 Subject: [PATCH 84/87] Update ManiaUnstableRateEstimationTest.cs --- .../ManiaUnstableRateEstimationTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index 1105691a75b7..b50e6234597e 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -105,9 +105,9 @@ public void TestEdge( } /// - /// This tests if the UR gets smaller, given more judgements on MAX. + /// This tests if the UR gets smaller, given more MAX judgements. /// This follows the logic that: - /// - More MAX judgements implies stronger evidence of smaller UR, as the probability of hitting more MAX is lower. + /// - More MAX judgements implies stronger evidence of smaller UR, as the probability of hitting a MAX judgement is higher. /// /// It's not necessary, nor logical to test other behaviors. /// From 1e80f799b4e164bb8db2673698d4477c08e6061f Mon Sep 17 00:00:00 2001 From: Natelytle Date: Sun, 13 Aug 2023 22:55:56 -0400 Subject: [PATCH 85/87] Fix non-existent attribute call --- .../Difficulty/ManiaPerformanceCalculator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 83ca0bc948f0..2767284d294c 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -56,7 +56,7 @@ protected override PerformanceAttributes CreatePerformanceAttributes(ScoreInfo s isLegacyScore = score.Mods.Any(m => m is ManiaModClassic) && !Precision.DefinitelyBigger(totalJudgements, maniaAttributes.NoteCount + maniaAttributes.HoldNoteCount); hitWindows = isLegacyScore - ? GetLegacyHitWindows(score.Mods, maniaAttributes.IsConvert, maniaAttributes.OverallDifficulty) + ? GetLegacyHitWindows(score.Mods, isConvert, maniaAttributes.OverallDifficulty) : GetLazerHitWindows(score.Mods, maniaAttributes.OverallDifficulty); estimatedUr = computeEstimatedUr(maniaAttributes.NoteCount, maniaAttributes.HoldNoteCount); From 75c295c22836a3c409683e94723201014487a5ab Mon Sep 17 00:00:00 2001 From: Natelytle Date: Mon, 4 Sep 2023 07:44:44 -0400 Subject: [PATCH 86/87] Remove hit windows scaling by rate, adjust tests --- .../ManiaUnstableRateEstimationTest.cs | 4 ++-- .../Difficulty/ManiaPerformanceCalculator.cs | 9 +-------- 2 files changed, 3 insertions(+), 10 deletions(-) diff --git a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs index b50e6234597e..6780a1a5c455 100644 --- a/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs +++ b/osu.Game.Rulesets.Mania.Tests/ManiaUnstableRateEstimationTest.cs @@ -33,9 +33,9 @@ public enum SpeedMod public static IEnumerable TestCaseSourceData() { - yield return new TestCaseData(691.640625d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.DoubleTime); + yield return new TestCaseData(1037.4609375d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.DoubleTime); yield return new TestCaseData(1037.4609375d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.NormalTime); - yield return new TestCaseData(1383.28125d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.HalfTime); + yield return new TestCaseData(1037.4609375d, new[] { 3, 3, 3, 3, 3, 3 }, SpeedMod.HalfTime); } /// diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 2767284d294c..4c3beada944c 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -6,8 +6,6 @@ using System.Linq; using MathNet.Numerics; using MathNet.Numerics.Distributions; -using osu.Framework.Audio.Track; -using osu.Framework.Extensions.IEnumerableExtensions; using osu.Game.Rulesets.Difficulty; using osu.Game.Rulesets.Mania.Mods; using osu.Game.Rulesets.Mods; @@ -189,12 +187,7 @@ public static double[] GetLazerHitWindows(Mod[] mods, double overallDifficulty) { double[] lazerHitWindows = new double[5]; - // Create a new track of arbitrary length, and apply the total rate change of every mod to the track (i.e. DT = 1.01-2x, HT = 0.5-0.99x) - var track = new TrackVirtual(10000); - mods.OfType().ForEach(m => m.ApplyToTrack(track)); - double clockRate = track.Rate; - - double windowMultiplier = 1 / clockRate; + double windowMultiplier = 1; if (mods.Any(m => m is ModHardRock)) windowMultiplier *= 1 / 1.4; From ad818a492c52985d55e5001802ac0b16eb96eaba Mon Sep 17 00:00:00 2001 From: nathen Date: Sun, 14 Jan 2024 20:20:28 -0500 Subject: [PATCH 87/87] Increase readability --- .../Difficulty/ManiaPerformanceCalculator.cs | 77 ++++++++++--------- 1 file changed, 40 insertions(+), 37 deletions(-) diff --git a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs index 4c3beada944c..1fa32e0dec25 100644 --- a/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs +++ b/osu.Game.Rulesets.Mania/Difficulty/ManiaPerformanceCalculator.cs @@ -20,6 +20,10 @@ public class ManiaPerformanceCalculator : PerformanceCalculator private const double tail_multiplier = 1.5; // Lazer LN tails have 1.5x the hit window of a Note or an LN head. private const double tail_deviation_multiplier = 1.8; // Empirical testing shows that players get ~1.8x the deviation on tails. + // Multipliers for legacy LN hit windows. These are made slightly more lenient for some reason. + private const double legacy_max_multiplier = 1.2; + private const double legacy_300_multiplier = 1.1; + private int countPerfect; private int countGreat; private int countGood; @@ -93,10 +97,10 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) // We increased the deviation of tails for estimation accuracy, but for difficulty scaling we actually // only care about the deviation on notes and heads, as that's the "accuracy skill" of the player. - // Increasing the tail multiplier will decrease this value. - double noteHeadUr = estimatedUr.Value / Math.Sqrt(noteHeadPortion + tailPortion * Math.Pow(tail_deviation_multiplier, 2)); + // Increasing the tail multiplier will decrease this value, buffing plays with more LNs. + double noteUnstableRate = estimatedUr.Value / Math.Sqrt(noteHeadPortion + tailPortion * Math.Pow(tail_deviation_multiplier, 2)); - difficultyValue *= Math.Max(1 - Math.Pow(noteHeadUr / 500, 1.9), 0); + difficultyValue *= Math.Max(1 - Math.Pow(noteUnstableRate / 500, 1.9), 0); return difficultyValue; } @@ -108,7 +112,7 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) /// Returns the estimated unstable rate of the score, assuming the average hit location is in the center of the hit window. /// /// Thrown when the optimization algorithm fails to converge. - /// This happens only on extreme cases. We tested up to 100 Million misses, the algorithm converges with default settings. + /// This will never happen in any sane (humanly achievable) case. When tested up to 100 Million misses, the algorithm converges with default settings. /// /// /// Returns Estimated UR, or null if the score is a miss-only score. @@ -119,10 +123,6 @@ private double computeDifficultyValue(ManiaDifficultyAttributes attributes) if (totalSuccessfulJudgements == 0 || noteCount + holdNoteCount == 0) return null; - // Lazer LN heads are the same as Notes, so return NoteCount + HoldNoteCount for lazer scores. - double logNoteCount = Math.Log(isLegacyScore ? noteCount : noteCount + holdNoteCount); - double logHoldCount = Math.Log(holdNoteCount); - double noteHeadPortion = (double)(noteCount + holdNoteCount) / (noteCount + holdNoteCount * 2); double tailPortion = (double)holdNoteCount / (noteCount + holdNoteCount * 2); @@ -135,11 +135,11 @@ double likelihoodGradient(double d) double dNote = d / Math.Sqrt(noteHeadPortion + tailPortion * Math.Pow(tail_deviation_multiplier, 2)); double dTail = dNote * tail_deviation_multiplier; - JudgementProbs pNotes = logPNote(dNote); + JudgementProbs pNotes = logJudgementProbsNote(dNote); // Since lazer tails have the same hit behaviour as Notes, return pNote instead of pHold for them. - JudgementProbs pHolds = isLegacyScore ? legacyLogPHold(dNote, dTail) : logPNote(dTail, tail_multiplier); + JudgementProbs pHolds = isLegacyScore ? logJudgementProbsLegacyHold(dNote, dTail) : logJudgementProbsNote(dTail, tail_multiplier); - return -totalProb(pNotes, pHolds, logNoteCount, logHoldCount); + return -calculateLikelihoodOfDeviation(pNotes, pHolds, noteCount, holdNoteCount); } // Finding the minimum of the function returns the most likely deviation for the hit results. UR is deviation * 10. @@ -218,16 +218,16 @@ private struct JudgementProbs // Log Judgement Probabilities of a Note given a deviation. // The multiplier is for lazer LN tails, which are 1.5x as lenient. - private JudgementProbs logPNote(double d, double multiplier = 1) + private JudgementProbs logJudgementProbsNote(double d, double multiplier = 1) { JudgementProbs probabilities = new JudgementProbs { - PMax = logDiff(0, logPcNote(hitWindows[0] * multiplier, d)), - P300 = logDiff(logPcNote(hitWindows[0] * multiplier, d), logPcNote(hitWindows[1] * multiplier, d)), - P200 = logDiff(logPcNote(hitWindows[1] * multiplier, d), logPcNote(hitWindows[2] * multiplier, d)), - P100 = logDiff(logPcNote(hitWindows[2] * multiplier, d), logPcNote(hitWindows[3] * multiplier, d)), - P50 = logDiff(logPcNote(hitWindows[3] * multiplier, d), logPcNote(hitWindows[4] * multiplier, d)), - P0 = logPcNote(hitWindows[4] * multiplier, d) + PMax = logDiff(0, logCompProbHitNote(hitWindows[0] * multiplier, d)), + P300 = logDiff(logCompProbHitNote(hitWindows[0] * multiplier, d), logCompProbHitNote(hitWindows[1] * multiplier, d)), + P200 = logDiff(logCompProbHitNote(hitWindows[1] * multiplier, d), logCompProbHitNote(hitWindows[2] * multiplier, d)), + P100 = logDiff(logCompProbHitNote(hitWindows[2] * multiplier, d), logCompProbHitNote(hitWindows[3] * multiplier, d)), + P50 = logDiff(logCompProbHitNote(hitWindows[3] * multiplier, d), logCompProbHitNote(hitWindows[4] * multiplier, d)), + P0 = logCompProbHitNote(hitWindows[4] * multiplier, d) }; return probabilities; @@ -235,33 +235,36 @@ private JudgementProbs logPNote(double d, double multiplier = 1) // Log Judgement Probabilities of a Legacy Hold given a deviation. // This is only used for Legacy Holds, which has a different hit behaviour from Notes and lazer LNs. - private JudgementProbs legacyLogPHold(double dHead, double dTail) + private JudgementProbs logJudgementProbsLegacyHold(double dHead, double dTail) { JudgementProbs probabilities = new JudgementProbs { - PMax = logDiff(0, logPcHold(hitWindows[0] * 1.2, dHead, dTail)), - P300 = logDiff(logPcHold(hitWindows[0] * 1.2, dHead, dTail), logPcHold(hitWindows[1] * 1.1, dHead, dTail)), - P200 = logDiff(logPcHold(hitWindows[1] * 1.1, dHead, dTail), logPcHold(hitWindows[2], dHead, dTail)), - P100 = logDiff(logPcHold(hitWindows[2], dHead, dTail), logPcHold(hitWindows[3], dHead, dTail)), - P50 = logDiff(logPcHold(hitWindows[3], dHead, dTail), logPcHold(hitWindows[4], dHead, dTail)), - P0 = logPcHold(hitWindows[4], dHead, dTail) + PMax = logDiff(0, logCompProbHitLegacyHold(hitWindows[0] * legacy_max_multiplier, dHead, dTail)), + P300 = logDiff(logCompProbHitLegacyHold(hitWindows[0] * legacy_max_multiplier, dHead, dTail), logCompProbHitLegacyHold(hitWindows[1] * legacy_300_multiplier, dHead, dTail)), + P200 = logDiff(logCompProbHitLegacyHold(hitWindows[1] * legacy_300_multiplier, dHead, dTail), logCompProbHitLegacyHold(hitWindows[2], dHead, dTail)), + P100 = logDiff(logCompProbHitLegacyHold(hitWindows[2], dHead, dTail), logCompProbHitLegacyHold(hitWindows[3], dHead, dTail)), + P50 = logDiff(logCompProbHitLegacyHold(hitWindows[3], dHead, dTail), logCompProbHitLegacyHold(hitWindows[4], dHead, dTail)), + P0 = logCompProbHitLegacyHold(hitWindows[4], dHead, dTail) }; return probabilities; } /// - /// Combines pNotes and pHolds/pTails into a single probability value for each judgement, and compares them to the judgements of the play. + /// Combines the probability of getting each judgement on both note types into a single probability value for each judgement, + /// and compares them to the judgements of the play using a binomial likelihood formula. /// - private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, double firstObjectCount, double secondObjectCount) + private double calculateLikelihoodOfDeviation(JudgementProbs noteProbabilities, JudgementProbs lnProbabilities, double noteCount, double lnCount) { - // firstObjectCount can be either Notes, or Notes + Holds, as stable LN heads don't behave like Notes but lazer LN heads do. - double pMax = logSum(firstProbs.PMax + firstObjectCount, secondProbs.PMax + secondObjectCount) - Math.Log(totalJudgements); - double p300 = logSum(firstProbs.P300 + firstObjectCount, secondProbs.P300 + secondObjectCount) - Math.Log(totalJudgements); - double p200 = logSum(firstProbs.P200 + firstObjectCount, secondProbs.P200 + secondObjectCount) - Math.Log(totalJudgements); - double p100 = logSum(firstProbs.P100 + firstObjectCount, secondProbs.P100 + secondObjectCount) - Math.Log(totalJudgements); - double p50 = logSum(firstProbs.P50 + firstObjectCount, secondProbs.P50 + secondObjectCount) - Math.Log(totalJudgements); - double p0 = logSum(firstProbs.P0 + firstObjectCount, secondProbs.P0 + secondObjectCount) - Math.Log(totalJudgements); + // Lazer mechanics treat the heads of LNs like notes. + double noteProbCount = isLegacyScore ? noteCount : noteCount + lnCount; + + double pMax = logSum(noteProbabilities.PMax + Math.Log(noteProbCount), lnProbabilities.PMax + Math.Log(lnCount)) - Math.Log(totalJudgements); + double p300 = logSum(noteProbabilities.P300 + Math.Log(noteProbCount), lnProbabilities.P300 + Math.Log(lnCount)) - Math.Log(totalJudgements); + double p200 = logSum(noteProbabilities.P200 + Math.Log(noteProbCount), lnProbabilities.P200 + Math.Log(lnCount)) - Math.Log(totalJudgements); + double p100 = logSum(noteProbabilities.P100 + Math.Log(noteProbCount), lnProbabilities.P100 + Math.Log(lnCount)) - Math.Log(totalJudgements); + double p50 = logSum(noteProbabilities.P50 + Math.Log(noteProbCount), lnProbabilities.P50 + Math.Log(lnCount)) - Math.Log(totalJudgements); + double p0 = logSum(noteProbabilities.P0 + Math.Log(noteProbCount), lnProbabilities.P0 + Math.Log(lnCount)) - Math.Log(totalJudgements); double totalProb = Math.Exp( (countPerfect * pMax @@ -281,7 +284,7 @@ private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, /// /// A value from 0 (log of 1, 0% chance) to negative infinity (log of 0, 100% chance). /// - private double logPcNote(double window, double deviation) => logErfc(window / (deviation * Math.Sqrt(2))); + private double logCompProbHitNote(double window, double deviation) => logErfc(window / (deviation * Math.Sqrt(2))); /// /// The log complementary probability of getting a certain judgement with a certain deviation. @@ -290,7 +293,7 @@ private double totalProb(JudgementProbs firstProbs, JudgementProbs secondProbs, /// /// A value from 0 (log of 1, 0% chance) to negative infinity (log of 0, 100% chance). /// - private double logPcHold(double window, double headDeviation, double tailDeviation) + private double logCompProbHitLegacyHold(double window, double headDeviation, double tailDeviation) { double root2 = Math.Sqrt(2); @@ -329,7 +332,7 @@ private double logDiff(double firstLog, double secondLog) { double maxVal = Math.Max(firstLog, secondLog); - // Avoid negative infinity - negative infinity (NaN) by checking if the higher value is negative infinity. See comment in logSum. + // Avoid negative infinity - negative infinity (NaN) by checking if the higher value is negative infinity. if (double.IsNegativeInfinity(maxVal)) { return maxVal;