committed by
GitHub
21 changed files with 586 additions and 401 deletions
Binary file not shown.
Binary file not shown.
@ -0,0 +1,178 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Avalonia.Media.TextFormatting.Unicode |
||||
|
{ |
||||
|
internal static class PropertyValueAliasHelper |
||||
|
{ |
||||
|
private static readonly Dictionary<Script, string> s_scriptToTag = |
||||
|
new Dictionary<Script, string>{ |
||||
|
{ Script.Unknown, "Zzzz"}, |
||||
|
{ Script.Common, "Zyyy"}, |
||||
|
{ Script.Inherited, "Zinh"}, |
||||
|
{ Script.Adlam, "Adlm"}, |
||||
|
{ Script.CaucasianAlbanian, "Aghb"}, |
||||
|
{ Script.Ahom, "Ahom"}, |
||||
|
{ Script.Arabic, "Arab"}, |
||||
|
{ Script.ImperialAramaic, "Armi"}, |
||||
|
{ Script.Armenian, "Armn"}, |
||||
|
{ Script.Avestan, "Avst"}, |
||||
|
{ Script.Balinese, "Bali"}, |
||||
|
{ Script.Bamum, "Bamu"}, |
||||
|
{ Script.BassaVah, "Bass"}, |
||||
|
{ Script.Batak, "Batk"}, |
||||
|
{ Script.Bengali, "Beng"}, |
||||
|
{ Script.Bhaiksuki, "Bhks"}, |
||||
|
{ Script.Bopomofo, "Bopo"}, |
||||
|
{ Script.Brahmi, "Brah"}, |
||||
|
{ Script.Braille, "Brai"}, |
||||
|
{ Script.Buginese, "Bugi"}, |
||||
|
{ Script.Buhid, "Buhd"}, |
||||
|
{ Script.Chakma, "Cakm"}, |
||||
|
{ Script.CanadianAboriginal, "Cans"}, |
||||
|
{ Script.Carian, "Cari"}, |
||||
|
{ Script.Cham, "Cham"}, |
||||
|
{ Script.Cherokee, "Cher"}, |
||||
|
{ Script.Chorasmian, "Chrs"}, |
||||
|
{ Script.Coptic, "Copt"}, |
||||
|
{ Script.Cypriot, "Cprt"}, |
||||
|
{ Script.Cyrillic, "Cyrl"}, |
||||
|
{ Script.Devanagari, "Deva"}, |
||||
|
{ Script.DivesAkuru, "Diak"}, |
||||
|
{ Script.Dogra, "Dogr"}, |
||||
|
{ Script.Deseret, "Dsrt"}, |
||||
|
{ Script.Duployan, "Dupl"}, |
||||
|
{ Script.EgyptianHieroglyphs, "Egyp"}, |
||||
|
{ Script.Elbasan, "Elba"}, |
||||
|
{ Script.Elymaic, "Elym"}, |
||||
|
{ Script.Ethiopic, "Ethi"}, |
||||
|
{ Script.Georgian, "Geor"}, |
||||
|
{ Script.Glagolitic, "Glag"}, |
||||
|
{ Script.GunjalaGondi, "Gong"}, |
||||
|
{ Script.MasaramGondi, "Gonm"}, |
||||
|
{ Script.Gothic, "Goth"}, |
||||
|
{ Script.Grantha, "Gran"}, |
||||
|
{ Script.Greek, "Grek"}, |
||||
|
{ Script.Gujarati, "Gujr"}, |
||||
|
{ Script.Gurmukhi, "Guru"}, |
||||
|
{ Script.Hangul, "Hang"}, |
||||
|
{ Script.Han, "Hani"}, |
||||
|
{ Script.Hanunoo, "Hano"}, |
||||
|
{ Script.Hatran, "Hatr"}, |
||||
|
{ Script.Hebrew, "Hebr"}, |
||||
|
{ Script.Hiragana, "Hira"}, |
||||
|
{ Script.AnatolianHieroglyphs, "Hluw"}, |
||||
|
{ Script.PahawhHmong, "Hmng"}, |
||||
|
{ Script.NyiakengPuachueHmong, "Hmnp"}, |
||||
|
{ Script.KatakanaOrHiragana, "Hrkt"}, |
||||
|
{ Script.OldHungarian, "Hung"}, |
||||
|
{ Script.OldItalic, "Ital"}, |
||||
|
{ Script.Javanese, "Java"}, |
||||
|
{ Script.KayahLi, "Kali"}, |
||||
|
{ Script.Katakana, "Kana"}, |
||||
|
{ Script.Kharoshthi, "Khar"}, |
||||
|
{ Script.Khmer, "Khmr"}, |
||||
|
{ Script.Khojki, "Khoj"}, |
||||
|
{ Script.KhitanSmallScript, "Kits"}, |
||||
|
{ Script.Kannada, "Knda"}, |
||||
|
{ Script.Kaithi, "Kthi"}, |
||||
|
{ Script.TaiTham, "Lana"}, |
||||
|
{ Script.Lao, "Laoo"}, |
||||
|
{ Script.Latin, "Latn"}, |
||||
|
{ Script.Lepcha, "Lepc"}, |
||||
|
{ Script.Limbu, "Limb"}, |
||||
|
{ Script.LinearA, "Lina"}, |
||||
|
{ Script.LinearB, "Linb"}, |
||||
|
{ Script.Lisu, "Lisu"}, |
||||
|
{ Script.Lycian, "Lyci"}, |
||||
|
{ Script.Lydian, "Lydi"}, |
||||
|
{ Script.Mahajani, "Mahj"}, |
||||
|
{ Script.Makasar, "Maka"}, |
||||
|
{ Script.Mandaic, "Mand"}, |
||||
|
{ Script.Manichaean, "Mani"}, |
||||
|
{ Script.Marchen, "Marc"}, |
||||
|
{ Script.Medefaidrin, "Medf"}, |
||||
|
{ Script.MendeKikakui, "Mend"}, |
||||
|
{ Script.MeroiticCursive, "Merc"}, |
||||
|
{ Script.MeroiticHieroglyphs, "Mero"}, |
||||
|
{ Script.Malayalam, "Mlym"}, |
||||
|
{ Script.Modi, "Modi"}, |
||||
|
{ Script.Mongolian, "Mong"}, |
||||
|
{ Script.Mro, "Mroo"}, |
||||
|
{ Script.MeeteiMayek, "Mtei"}, |
||||
|
{ Script.Multani, "Mult"}, |
||||
|
{ Script.Myanmar, "Mymr"}, |
||||
|
{ Script.Nandinagari, "Nand"}, |
||||
|
{ Script.OldNorthArabian, "Narb"}, |
||||
|
{ Script.Nabataean, "Nbat"}, |
||||
|
{ Script.Newa, "Newa"}, |
||||
|
{ Script.Nko, "Nkoo"}, |
||||
|
{ Script.Nushu, "Nshu"}, |
||||
|
{ Script.Ogham, "Ogam"}, |
||||
|
{ Script.OlChiki, "Olck"}, |
||||
|
{ Script.OldTurkic, "Orkh"}, |
||||
|
{ Script.Oriya, "Orya"}, |
||||
|
{ Script.Osage, "Osge"}, |
||||
|
{ Script.Osmanya, "Osma"}, |
||||
|
{ Script.Palmyrene, "Palm"}, |
||||
|
{ Script.PauCinHau, "Pauc"}, |
||||
|
{ Script.OldPermic, "Perm"}, |
||||
|
{ Script.PhagsPa, "Phag"}, |
||||
|
{ Script.InscriptionalPahlavi, "Phli"}, |
||||
|
{ Script.PsalterPahlavi, "Phlp"}, |
||||
|
{ Script.Phoenician, "Phnx"}, |
||||
|
{ Script.Miao, "Plrd"}, |
||||
|
{ Script.InscriptionalParthian, "Prti"}, |
||||
|
{ Script.Rejang, "Rjng"}, |
||||
|
{ Script.HanifiRohingya, "Rohg"}, |
||||
|
{ Script.Runic, "Runr"}, |
||||
|
{ Script.Samaritan, "Samr"}, |
||||
|
{ Script.OldSouthArabian, "Sarb"}, |
||||
|
{ Script.Saurashtra, "Saur"}, |
||||
|
{ Script.SignWriting, "Sgnw"}, |
||||
|
{ Script.Shavian, "Shaw"}, |
||||
|
{ Script.Sharada, "Shrd"}, |
||||
|
{ Script.Siddham, "Sidd"}, |
||||
|
{ Script.Khudawadi, "Sind"}, |
||||
|
{ Script.Sinhala, "Sinh"}, |
||||
|
{ Script.Sogdian, "Sogd"}, |
||||
|
{ Script.OldSogdian, "Sogo"}, |
||||
|
{ Script.SoraSompeng, "Sora"}, |
||||
|
{ Script.Soyombo, "Soyo"}, |
||||
|
{ Script.Sundanese, "Sund"}, |
||||
|
{ Script.SylotiNagri, "Sylo"}, |
||||
|
{ Script.Syriac, "Syrc"}, |
||||
|
{ Script.Tagbanwa, "Tagb"}, |
||||
|
{ Script.Takri, "Takr"}, |
||||
|
{ Script.TaiLe, "Tale"}, |
||||
|
{ Script.NewTaiLue, "Talu"}, |
||||
|
{ Script.Tamil, "Taml"}, |
||||
|
{ Script.Tangut, "Tang"}, |
||||
|
{ Script.TaiViet, "Tavt"}, |
||||
|
{ Script.Telugu, "Telu"}, |
||||
|
{ Script.Tifinagh, "Tfng"}, |
||||
|
{ Script.Tagalog, "Tglg"}, |
||||
|
{ Script.Thaana, "Thaa"}, |
||||
|
{ Script.Thai, "Thai"}, |
||||
|
{ Script.Tibetan, "Tibt"}, |
||||
|
{ Script.Tirhuta, "Tirh"}, |
||||
|
{ Script.Ugaritic, "Ugar"}, |
||||
|
{ Script.Vai, "Vaii"}, |
||||
|
{ Script.WarangCiti, "Wara"}, |
||||
|
{ Script.Wancho, "Wcho"}, |
||||
|
{ Script.OldPersian, "Xpeo"}, |
||||
|
{ Script.Cuneiform, "Xsux"}, |
||||
|
{ Script.Yezidi, "Yezi"}, |
||||
|
{ Script.Yi, "Yiii"}, |
||||
|
{ Script.ZanabazarSquare, "Zanb"}, |
||||
|
}; |
||||
|
|
||||
|
public static string GetTag(Script script) |
||||
|
{ |
||||
|
if(!s_scriptToTag.ContainsKey(script)) |
||||
|
{ |
||||
|
return "Zzzz"; |
||||
|
} |
||||
|
return s_scriptToTag[script]; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,33 +1,34 @@ |
|||||
OP CL CP QU GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI EB EM ZWJ |
OP CL CP QU GL NS EX SY IS PR PO NU AL HL ID IN HY BA BB B2 ZW CM WJ H2 H3 JL JV JT RI EB EM ZWJ CB |
||||
OP ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ @ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ |
OP ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ @ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ |
||||
CL _ ^ ^ % % ^ ^ ^ ^ % % _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
CL _ ^ ^ % % ^ ^ ^ ^ % % _ _ _ _ ^ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
CP _ ^ ^ % % ^ ^ ^ ^ % % % % % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
CP _ ^ ^ % % ^ ^ ^ ^ % % % % % _ ^ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
QU ^ ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % |
QU ^ ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % % |
||||
GL % ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % |
GL % ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % % |
||||
NS _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
NS _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
EX _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
EX _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
SY _ ^ ^ % % % ^ ^ ^ _ _ % _ % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
SY _ ^ ^ % % % ^ ^ ^ _ _ % _ % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
IS _ ^ ^ % % % ^ ^ ^ _ _ % % % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
IS _ ^ ^ % % % ^ ^ ^ _ _ % % % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
PR % ^ ^ % % % ^ ^ ^ _ _ % % % % _ % % _ _ ^ # ^ % % % % % _ % % % |
PR % ^ ^ % % % ^ ^ ^ _ _ % % % % _ % % _ _ ^ # ^ % % % % % _ % % % _ |
||||
PO % ^ ^ % % % ^ ^ ^ _ _ % % % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
PO % ^ ^ % % % ^ ^ ^ _ _ % % % _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
NU % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
NU % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
AL % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
AL % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
HL % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
HL % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
ID _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
ID _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
IN _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
IN _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
HY _ ^ ^ % _ % ^ ^ ^ _ _ % _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
HY _ ^ ^ % _ % ^ ^ ^ _ _ % _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
BA _ ^ ^ % _ % ^ ^ ^ _ _ _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
BA _ ^ ^ % _ % ^ ^ ^ _ _ _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
BB % ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % |
BB % ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % _ |
||||
B2 _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ _ % % _ ^ ^ # ^ _ _ _ _ _ _ _ _ % |
B2 _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ _ % % _ ^ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
ZW _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ^ _ _ _ _ _ _ _ _ _ _ _ |
ZW _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ ^ _ _ _ _ _ _ _ _ _ _ _ _ |
||||
CM % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
CM % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
WJ % ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % |
WJ % ^ ^ % % % ^ ^ ^ % % % % % % % % % % % ^ # ^ % % % % % % % % % % |
||||
H2 _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ % % _ _ _ % |
H2 _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ % % _ _ _ % _ |
||||
H3 _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ % _ _ _ % |
H3 _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ % _ _ _ % _ |
||||
JL _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ % % % % _ _ _ _ % |
JL _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ % % % % _ _ _ _ % _ |
||||
JV _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ % % _ _ _ % |
JV _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ % % _ _ _ % _ |
||||
JT _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ % _ _ _ % |
JT _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ % _ _ _ % _ |
||||
RI _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ % _ _ % |
RI _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ _ _ % % _ _ ^ # ^ _ _ _ _ _ % _ _ % _ |
||||
EB _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ % % |
EB _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ % % _ |
||||
EM _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % |
EM _ ^ ^ % % % ^ ^ ^ _ % _ _ _ _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
ZWJ _ ^ ^ % % % ^ ^ ^ _ _ _ _ _ % _ % % _ _ ^ # ^ _ _ _ _ _ _ % % % |
ZWJ % ^ ^ % % % ^ ^ ^ % % % % % _ % % % _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
|
CB _ ^ ^ % % _ ^ ^ ^ _ _ _ _ _ _ _ _ _ _ _ ^ # ^ _ _ _ _ _ _ _ _ % _ |
||||
|
|||||
@ -0,0 +1,85 @@ |
|||||
|
using System; |
||||
|
using System.Collections; |
||||
|
using System.Collections.Generic; |
||||
|
using System.IO; |
||||
|
using System.Linq; |
||||
|
using System.Net.Http; |
||||
|
|
||||
|
namespace Avalonia.Visuals.UnitTests.Media.TextFormatting |
||||
|
{ |
||||
|
public abstract class TestDataGenerator : IEnumerable<object[]> |
||||
|
{ |
||||
|
private readonly string _fileName; |
||||
|
private readonly List<object[]> _testData; |
||||
|
|
||||
|
protected TestDataGenerator(string fileName) |
||||
|
{ |
||||
|
_fileName = fileName; |
||||
|
_testData = ReadTestData(); |
||||
|
} |
||||
|
|
||||
|
public IEnumerator<object[]> GetEnumerator() |
||||
|
{ |
||||
|
return _testData.GetEnumerator(); |
||||
|
} |
||||
|
|
||||
|
IEnumerator IEnumerable.GetEnumerator() |
||||
|
{ |
||||
|
return GetEnumerator(); |
||||
|
} |
||||
|
|
||||
|
private List<object[]> ReadTestData() |
||||
|
{ |
||||
|
var testData = new List<object[]>(); |
||||
|
|
||||
|
using (var client = new HttpClient()) |
||||
|
{ |
||||
|
var url = Path.Combine(UnicodeDataGenerator.Ucd, _fileName); |
||||
|
|
||||
|
using (var result = client.GetAsync(url).GetAwaiter().GetResult()) |
||||
|
{ |
||||
|
if (!result.IsSuccessStatusCode) |
||||
|
return testData; |
||||
|
|
||||
|
using (var stream = result.Content.ReadAsStreamAsync().GetAwaiter().GetResult()) |
||||
|
using (var reader = new StreamReader(stream)) |
||||
|
{ |
||||
|
while (!reader.EndOfStream) |
||||
|
{ |
||||
|
var line = reader.ReadLine(); |
||||
|
|
||||
|
if (line == null) |
||||
|
{ |
||||
|
break; |
||||
|
} |
||||
|
|
||||
|
if (line.StartsWith("#") || string.IsNullOrEmpty(line)) |
||||
|
{ |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
var elements = line.Split('#'); |
||||
|
|
||||
|
elements = elements[0].Replace("÷\t", "÷").Trim('÷').Split('÷'); |
||||
|
|
||||
|
var chars = elements[0].Replace(" × ", " ").Split(' '); |
||||
|
|
||||
|
var codepoints = chars.Where(x => x != "" && x != "×") |
||||
|
.Select(x => Convert.ToInt32(x, 16)).ToArray(); |
||||
|
|
||||
|
var text = string.Join(null, codepoints.Select(char.ConvertFromUtf32)); |
||||
|
|
||||
|
var length = codepoints.Select(x => x > ushort.MaxValue ? 2 : 1).Sum(); |
||||
|
|
||||
|
var data = new object[] { text, length }; |
||||
|
|
||||
|
testData.Add(data); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return testData; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue