From 93c7f7fb11054d3e497dc4370e046dbe18263d56 Mon Sep 17 00:00:00 2001 From: Alex Earl Date: Thu, 17 Nov 2022 05:43:29 -0800 Subject: [PATCH] feat: Add charSet parameter to FILE macro (#144) * feat: Add ability to set the character set for reading the file. Defaults to the default charset for the running JVM * Fix spotbugs --- .../tokenmacro/impl/WorkspaceFileMacro.java | 35 ++++---- .../impl/WorkspaceFileMacroTest.java | 77 ++++++++++++++++++ .../tokenmacro/impl/Chinese-Simplified.txt | 1 + .../plugins/tokenmacro/impl/utf16.txt | Bin 0 -> 174 bytes .../plugins/tokenmacro/impl/utf8.txt | 4 + 5 files changed, 96 insertions(+), 21 deletions(-) create mode 100644 src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/Chinese-Simplified.txt create mode 100644 src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/utf16.txt create mode 100644 src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/utf8.txt diff --git a/src/main/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacro.java b/src/main/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacro.java index ef64690..85cbd4e 100644 --- a/src/main/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacro.java +++ b/src/main/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacro.java @@ -31,12 +31,18 @@ import hudson.model.TaskListener; import java.io.BufferedReader; +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; +import java.io.StringWriter; import java.nio.charset.Charset; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.ObjectUtils; import org.jenkinsci.plugins.tokenmacro.DataBoundTokenMacro; import org.jenkinsci.plugins.tokenmacro.MacroEvaluationException; @@ -48,6 +54,8 @@ public class WorkspaceFileMacro extends DataBoundTokenMacro { public String fileNotFoundMessage = "ERROR: File '%s' does not exist"; @Parameter public int maxLines = -1; + @Parameter + public String charSet = Charset.defaultCharset().name(); public static final String MACRO_NAME = "FILE"; @@ -83,28 +91,13 @@ public String evaluate(Run run, FilePath workspace, TaskListener listener, } try { - if(maxLines > 0) { - int lines = 0; - - StringBuilder result = new StringBuilder(); - BufferedReader reader = null; - try { - String line; - reader = new BufferedReader(new InputStreamReader(workspace.child(path).read(), Charset.defaultCharset())); - while (lines < maxLines && (line = reader.readLine()) != null) { - result.append(line); - result.append('\n'); - lines++; - } - } finally { - if(reader != null) { - reader.close(); - } + Charset charset = Charset.forName(charSet); + try (BufferedReader reader = new BufferedReader(new InputStreamReader(workspace.child(path).read(), charset))) { + if (maxLines > 0) { + return reader.lines().limit(maxLines).collect(Collectors.joining("\n")); + } else { + return reader.lines().collect(Collectors.joining("\n")); } - - return result.toString(); - } else { - return workspace.child(path).readToString(); } } catch (IOException e) { return "ERROR: File '" + path + "' could not be read"; diff --git a/src/test/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacroTest.java b/src/test/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacroTest.java index f4d47b0..eb49c40 100644 --- a/src/test/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacroTest.java +++ b/src/test/java/org/jenkinsci/plugins/tokenmacro/impl/WorkspaceFileMacroTest.java @@ -8,17 +8,23 @@ import hudson.model.FreeStyleProject; import hudson.model.TaskListener; import hudson.util.StreamTaskListener; +import org.apache.commons.io.IOUtils; import org.jvnet.hudson.test.TestBuilder; +import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; +import java.io.InputStreamReader; import java.io.OutputStreamWriter; +import java.util.HashMap; +import java.util.Map; import org.junit.Rule; import org.junit.Test; import org.jvnet.hudson.test.JenkinsRule; import static org.junit.Assert.*; +import static org.mockito.Mockito.when; /** * @author Kohsuke Kawaguchi @@ -77,4 +83,75 @@ public boolean perform(AbstractBuild build, Launcher launcher, BuildListen assertEquals("Hello, world! " + i, lines[i]); } } + + @Test + public void testUtfEncodings() throws Exception { + String[] expected = { "première is first", + "première is slightly different", + "Кириллица is Cyrillic", + "\uD801\uDC00 am Deseret" }; + + String[] encodings = { "utf8", "utf16" }; + + for(String encoding : encodings) { + FreeStyleProject project = j.createFreeStyleProject(); + TaskListener listener = StreamTaskListener.fromStdout(); + project.getBuildersList().add(new TestBuilder() { + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + FilePath file = build.getWorkspace().child(encoding + ".txt"); + try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(file.write(), encoding))) { + try(BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream(encoding + ".txt"), encoding))) { + IOUtils.copy(reader, writer); + } + } + return true; + } + }); + FreeStyleBuild build = project.scheduleBuild2(0).get(); + + WorkspaceFileMacro content = new WorkspaceFileMacro(); + content.path = encoding + ".txt"; + content.charSet = encoding; + + String output = content.evaluate(build, listener, WorkspaceFileMacro.MACRO_NAME); + String[] lines = output.split("\n"); + assertEquals(4, lines.length); + + for (int i = 0; i < 4; i++) { + assertEquals(expected[i], lines[i]); + } + } + } + + @Test + public void testSimpleChinese() throws Exception { + FreeStyleProject project = j.createFreeStyleProject(); + TaskListener listener = StreamTaskListener.fromStdout(); + + String expected; + try(BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("Chinese-Simplified.txt"), "utf16"))) { + expected = IOUtils.toString(reader); + } + project.getBuildersList().add(new TestBuilder() { + @Override + public boolean perform(AbstractBuild build, Launcher launcher, BuildListener listener) throws InterruptedException, IOException { + FilePath file = build.getWorkspace().child("Chinese-Simplified.txt"); + try(BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(file.write(), "utf16"))) { + try(BufferedReader reader = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream("Chinese-Simplified.txt"), "utf16"))) { + IOUtils.copy(reader, writer); + } + } + return true; + } + }); + FreeStyleBuild build = project.scheduleBuild2(0).get(); + + WorkspaceFileMacro content = new WorkspaceFileMacro(); + content.path = "Chinese-Simplified.txt"; + content.charSet = "utf16"; + + String output = content.evaluate(build, listener, WorkspaceFileMacro.MACRO_NAME); + assertEquals(expected, output); + } } diff --git a/src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/Chinese-Simplified.txt b/src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/Chinese-Simplified.txt new file mode 100644 index 0000000..71d8b40 --- /dev/null +++ b/src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/Chinese-Simplified.txt @@ -0,0 +1 @@ +㧟㩳㭎㳠䁖䄍䌷䓖䘯䜣䜩䝼䞍䥇䥺䦂䦃䦆䦛䦟䦶䲟䲠䲡䲣䴓䴔䴕䴖䴗䴘䴙䶮一丁七万丈三上下不与丐丑专且丕世丘丙业丛东丝丞丢两严丧丨个丫中丰串临丶丸丹为主丽举丿乃久乇么义之乌乍乎乏乐乒乓乔乖乘乙乜九乞也习乡书乩买乱乳乾亅了予争事二于亏云互亓五井亘亚些亟亠亡亢交亥亦产亨亩享京亭亮亲亳亵人亿什仁仂仃仄仅仆仇仉今介仍从仑仓仔仕他仗付仙仝仞仟仡代令以仨仪仫们仰仲仳仵件价任份仿企伉伊伍伎伏伐休众优伙会伛伞伟传伢伤伥伦伧伪伫伯估伲伴伶伸伺似伽佃但位低住佐佑体何佗佘余佚佛作佝佞佟你佣佤佥佧佩佬佯佰佳佴佶佻佼佾使侃侄侈侉例侍侏侑侔侗供依侠侣侥侦侧侨侩侪侬侮侯侵便促俄俅俊俎俏俐俑俗俘俚俜保俞俟信俣俦俨俩俪俭修俯俱俳俸俺俾倌倍倏倒倔倘候倚倜借倡倥倦倨倩倪倬倭倮倳债值倾偃假偈偌偎偏偕做停健偬偶偷偻偾偿傀傅傈傍傣傥傧储傩催傲傺傻像僖僚僦僧僬僭僮僳僵僻儆儇儋儒儡儿兀允元兄充兆先光克免兑兔兕兖党兜兢入全八公六兮兰共关兴兵其具典兹养兼兽冀冁冂内冈冉册再冒冕冖冗写军农冠冢冤冥冫冬冯冰冱冲决况冶冷冻冼冽净凄准凇凉凋凌减凑凛凝几凡凤凫凭凯凰凳凵凶凸凹出击凼函凿刀刁刃分切刈刊刍刎刑划刖列刘则刚创初删判刨利别刭刮到刳制刷券刹刺刻刽刿剀剁剂剃削剌前剐剑剔剖剜剞剡剥剧剩剪副割剽剿劁劂劈劐劓力劝办功加务劢劣动助努劫劬劭励劲劳劾势勃勇勉勋勐勒勖勘募勤勰勹勺勾勿匀包匆匈匍匏匐匕化北匙匚匝匠匡匣匦匪匮匸匹区医匾匿十千卅升午卉半华协卑卒卓单卖南博卜卞卟占卡卢卣卤卦卧卩卫卮卯印危即却卵卷卸卺卿厂厄厅历厉压厌厍厕厘厚厝原厢厣厥厦厨厩厮厶去县叁参又叉及友双反发叔取受变叙叛叟叠口古句另叨叩只叫召叭叮可台叱史右叵叶号司叹叻叼叽吁吃各吆合吉吊同名后吏吐向吒吓吕吖吗君吝吞吟吠吡吣否吧吨吩含听吭吮启吱吲吴吵吸吹吻吼吾呀呃呆呈告呋呐呒呓呔呕呖呗员呙呛呜呢呤呦周呱呲味呵呶呷呸呻呼命咀咂咄咆咋和咎咏咐咒咔咕咖咙咚咛咝咣咤咦咧咨咩咪咫咬咭咯咱咳咴咸咻咽咿哀品哂哄哆哇哈哉哌响哎哏哐哑哒哓哔哕哗哙哚哜哝哞哟哥哦哧哨哩哪哭哮哲哳哺哼哽哿唁唆唇唉唏唐唑唔唛唠唢唣唤唧唪唬售唯唰唱唳唷唼唾唿啁啃啄商啉啊啐啕啖啜啡啤啥啦啧啪啬啭啮啵啶啷啸啻啼啾喀喁喂喃善喇喈喉喊喋喏喑喔喘喙喜喝喟喧喱喳喵喷喹喻喽喾嗄嗅嗉嗌嗍嗑嗒嗓嗔嗖嗜嗝嗟嗡嗣嗤嗥嗦嗨嗪嗫嗬嗯嗲嗳嗵嗷嗽嗾嘀嘁嘈嘉嘌嘎嘏嘘嘛嘞嘟嘣嘤嘧嘬嘭嘱嘲嘴嘶嘹嘻嘿噌噍噎噔噗噘噙噜噢噤器噩噪噫噬噱噶噻噼嚅嚆嚎嚏嚓嚣嚯嚷嚼囊囔囗囚四囝回囟因囡团囤囫园困囱围囵囹固国图囿圃圄圆圈圉圊圜土圣在圩圪圬圭圮圯地圳圹场圻圾址坂均坊坌坍坎坏坐坑块坚坛坜坝坞坟坠坡坤坦坨坩坪坫坭坯坳坶坷坻坼垂垃垄垅垆型垌垒垓垛垠垡垢垣垤垦垧垩垫垭垮垲垴垸埂埃埋城埏埒埔埕埘埙埚埝域埠埤埭埯埴埸培基埽堀堂堆堇堊堋堍堑堕堙堞堠堡堤堪堰堵塄塌塍塑塔塘塞塥塩填塬塾墀墁境墅墉墒墓墙墚增墟墨墩墼壁壅壑壕壤士壬壮声壳壶壹夂处备夊复夏夔夕外夙多夜够夤夥大天太夫夭央夯失头夷夸夹夺夼奁奂奄奇奈奉奋奎奏契奔奕奖套奘奚奠奢奥女奴奶奸她好妁如妃妄妆妇妈妊妍妒妓妖妗妙妞妣妤妥妨妩妪妫妮妯妲妹妻妾姆姊始姐姑姒姓委姗姘姚姜姝姣姥姨姬姹姻姿威娃娄娅娆娇娈娉娌娑娓娘娜娟娠娣娥娩娱娲娴娶娼婀婆婉婊婕婚婢婧婪婴婵婶婷婺婿媒媚媛媪媲媳媵媸媾嫁嫂嫉嫌嫒嫔嫖嫘嫜嫠嫡嫣嫦嫩嫫嫱嬉嬖嬗嬲嬴嬷孀子孑孓孔孕字存孙孚孛孜孝孟孢季孤孥学孩孪孬孰孱孳孵孺孽宀宁它宄宅宇守安宋完宏宓宕宗官宙定宛宜宝实宠审客宣室宥宦宪宫宰害宴宵家宸容宽宾宿寂寄寅密寇富寐寒寓寝寞察寡寤寥寨寮寰寸对寺寻导寿封射将尉尊小少尔尕尖尘尚尜尝尢尤尥尧尬就尴尸尹尺尻尼尽尾尿局屁层居屈屉届屋屎屏屐屑展屙属屠屡屣履屦屮屯山屹屺屿岁岂岈岌岍岐岑岔岖岗岘岙岚岛岜岢岣岩岫岬岭岱岳岵岷岸岽岿峁峄峋峒峙峡峤峥峦峨峪峭峰峻崂崃崆崇崎崔崖崛崞崤崦崧崩崭崮崴崽崾嵇嵊嵋嵌嵘嵛嵝嵩嵫嵬嵯嵴嶂嶙嶝嶷嶼巅巍巛川州巡巢工左巧巨巩巫差巯己已巳巴巷巽巾币市布帅帆师希帏帐帑帔帕帖帘帙帚帛帜帝带帧席帮帱帷常帻帼帽幂幄幅幌幔幕幛幞幡幢干平年并幸幺幻幼幽广庀庄庆庇床庋序庐庑库应底庖店庙庚府庞废庠庥度座庭庳庵庶康庸庹庾廉廊廑廒廓廖廛廨廪廴延廷建廾廿开弁异弃弄弈弊弋式弑弓引弗弘弛弟张弥弦弧弩弭弯弱弹强弼彀彐归当录彖彗彘彝彡形彤彦彩彪彬彭彰影彳彷役彻彼往征徂径待徇很徉徊律後徐徒徕得徘徙徜御徨循徭微徵德徼徽心必忆忉忌忍忏忐忑忒忖志忘忙忝忠忡忤忧忪快忭忮忱念忸忻忽忾忿怀态怂怃怄怅怆怊怍怎怏怒怔怕怖怙怛怜思怠怡急怦性怨怩怪怫怯怵总怼怿恁恂恃恋恍恐恒恕恙恚恝恢恣恤恧恨恩恪恫恬恭息恰恳恶恸恹恺恻恼恽恿悃悄悉悌悍悒悔悖悚悛悝悟悠患悦您悫悬悭悯悱悲悴悸悻悼情惆惊惋惑惕惘惚惜惝惟惠惦惧惨惩惫惬惭惮惯惰想惴惶惹惺愀愁愆愈愉愍愎意愕愚感愠愣愤愦愧愫愿慈慊慌慎慑慕慝慢慧慨慰慵慷憋憎憔憝憧憨憩憬憷憾懂懈懊懋懑懒懔懦懵懿戆戈戊戋戌戍戎戏成我戒戕或戗战戚戛戟戡戢戤戥截戬戮戳戴戶户戽戾房所扁扃扇扈扉手才扎扑扒打扔托扛扣扦执扩扪扫扬扭扮扯扰扳扶批扼找承技抄抉把抑抒抓投抖抗折抚抛抟抠抡抢护报抨披抬抱抵抹抻押抽抿拂拄担拆拇拈拉拊拌拍拎拐拒拓拔拖拗拘拙拚招拜拟拢拣拥拦拧拨择括拭拮拯拱拳拴拶拷拼拽拾拿持挂指挈按挎挑挖挚挛挝挞挟挠挡挢挣挤挥挨挪挫振挲挹挺挽捂捃捅捆捉捋捌捍捎捏捐捕捞损捡换捣捧捩捭据捱捶捷捺捻掀掂掇授掉掊掌掎掏掐排掖掘掠探掣接控推掩措掬掭掮掰掳掴掷掸掺掼掾揄揆揉揍揎描提插揖揞揠握揣揩揪揭揲援揶揸揽揿搀搁搂搅搋搌搏搐搓搔搛搜搞搠搡搦搪搬搭搴携搽搿摁摄摅摆摇摈摊摒摔摘摞摧摩摭摸摹摺撂撄撅撇撑撒撕撙撞撤撩撬播撮撰撵撷撸撺撼擀擂擅操擎擐擒擓擗擘擞擢擤擦攀攉攒攘攥攫攮支攴攵收攸改攻放政故效敉敌敏救敕敖教敛敝敞敢散敦敫敬数敲整敷文斋斌斐斑斓斗料斛斜斟斡斤斥斧斩斫断斯新方於施旁旃旄旅旆旋旌旎族旒旖旗无既日旦旧旨早旬旭旮旯旰旱时旷旺昀昂昃昆昊昌明昏易昔昕昙昝星映春昧昨昭是昱昴昵昶昼显晁晃晋晌晏晒晓晔晕晖晗晚晟晡晤晦晨普景晰晴晶晷智晾暂暄暇暌暑暖暗暝暧暨暮暴暹暾曙曛曜曝曦曩曰曲曳更曷曹曼曾替最月有朊朋服朐朔朕朗望朝期朦木未末本札术朱朴朵机朽杀杂权杆杈杉杌李杏材村杓杖杜杞束杠条来杨杩杪杭杯杰杲杳杵杷杼松板极构枇枉枋析枕林枘枚果枝枞枢枣枥枧枨枪枫枭枯枰枳枵架枷枸柁柃柄柏某柑柒染柔柘柙柚柜柝柞柠柢查柩柬柯柰柱柳柴柽柿栀栅标栈栉栊栋栌栎栏树栓栖栗栝校栩株栲栳样核根格栽栾桀桁桂桃桄桅框案桉桌桎桐桑桓桔桕桠桡桢档桤桥桦桧桨桩桫桴桶桷梁梃梅梆梏梓梗梢梦梧梨梭梯械梳梵检棂棉棋棍棒棕棘棚棠棡棣森棰棱棵棹棺棼椁椅椋植椎椐椒椟椠椤椭椰椴椹椽椿楂楔楗楚楝楞楠楣楦楫楮楱楷楸楹楼榀概榄榆榇榈榉榍榔榕榘榛榜榧榨榫榭榱榴榷榻槁槊槌槎槐槔槛槟槠槭槲槽槿樊樗樘樟模樨横樯樱樵樽樾橄橇橐橘橙橛橡橥橱橹橼檀檄檎檐檑檗檠檩檫檬欠次欢欣欤欧欲欷欹欺款歃歆歇歉歌歙止正此步武歧歪歹死歼殁殂殃殄殆殇殉殊残殍殒殓殖殚殛殡殪殳殴段殷殿毁毂毅毋母每毒毓比毕毖毗毙毛毡毫毯毳毵毹毽氅氆氇氍氏氐民氓气氕氖氘氙氚氛氟氡氢氤氦氧氨氩氪氮氯氰氲水永氽汀汁求汆汇汉汊汐汔汕汗汛汜汝汞江池污汤汨汩汪汰汲汴汶汹汽汾沁沂沃沅沆沈沉沌沏沐沓沔沙沛沟没沣沤沥沦沧沩沪沫沭沮沱沲河沸油治沼沽沾沿泄泅泉泊泌泐泓泔法泖泗泛泞泠泡波泣泥注泪泫泮泯泰泱泳泵泶泷泸泺泻泼泽泾洁洄洇洋洌洎洒洗洙洚洛洞津洧洪洫洮洱洲洳洵洹活洼洽派流浃浅浆浇浊测浍济浏浑浒浓浔浙浚浜浞浠浣浦浩浪浮浯浴海浸浼涂涅消涉涌涎涑涓涔涕涛涝涞涟涠涡涣涤润涧涨涩涪涫涮涯液涵涸涿淀淄淅淆淇淋淌淑淖淘淙淝淞淠淡淤淦淫淬淮深淳混淹添淼清渊渌渍渎渐渑渔渖渗渚渝渠渡渣渤渥温渫渭港渲渴游渺湃湄湍湎湓湔湖湘湛湟湫湮湾湿溃溅溆溉溏源溘溜溟溢溥溧溪溯溱溲溴溶溷溺溻溽滁滂滇滋滏滑滓滔滕滗滚滞滟滠满滢滤滥滦滨滩滴滹漂漆漉漏漓演漕漠漤漩漪漫漭漯漱漳漶漾潆潇潋潍潘潜潞潢潦潭潮潲潴潸潺潼澄澈澉澌澍澎澜澡澧澳澶澹澾激濂濉濑濒濞濠濡濮濯瀑瀚瀛瀣瀹灌灏灞火灭灯灰灵灶灸灼灾灿炀炅炉炊炎炒炔炕炖炙炜炝炫炬炭炮炯炱炳炷炸点炻炼炽烀烁烂烃烈烊烘烙烛烟烤烦烧烨烩烫烬热烯烷烹烽焉焊焐焓焕焖焘焙焚焦焯焰焱然煅煊煌煎煙煜煞煤煦照煨煮煲煳煸煺煽熄熊熏熔熘熙熟熠熨熬熳熵熹燃燎燔燕燠燥燧燮燹爆爝爨爪爬爰爱爵父爷爸爹爻爽爿片版牌牍牒牖牙牛牝牟牡牢牦牧物牯牲牵特牺牾牿犀犁犄犊犋犍犏犒犟犬犯犰犴状犷犸犹狁狂狃狄狈狍狎狐狒狗狙狞狠狡狨狩独狭狮狯狰狱狲狳狴狷狸狺狻狼猁猃猊猎猓猕猖猗猛猜猝猞猡猢猥猩猪猫猬献猱猴猷猸猹猾猿獍獐獒獗獠獬獭獯獾玄率玉王玎玑玖玛玟玢玩玫玮环现玲玳玷玺玻珀珂珈珉珊珍珏珐珑珙珞珠珥珧珩班珲球琅理琉琊琏琐琚琛琢琥琦琨琪琬琮琰琳琴琵琶琼瑁瑕瑗瑙瑚瑛瑜瑞瑟瑭瑰瑶瑷瑾璀璁璃璇璋璎璐璜璞璧璨璩璺瓒瓜瓞瓠瓢瓣瓤瓦瓮瓯瓴瓶瓷瓿甄甍甏甑甓甘甙甚甜生甥用甩甫甬甭甯田由甲申电男甸町画甾畀畅畈畋界畎畏畔留畚畛畜畝略畦番畲畴畸畹畿疃疆疋疏疑疒疔疖疗疙疚疝疟疠疡疣疤疥疫疬疮疯疰疱疲疳疴疵疸疹疼疽疾痂痃痄病症痈痉痊痍痒痔痕痖痘痛痞痢痣痤痦痧痨痪痫痰痱痴痹痼痿瘀瘁瘅瘊瘌瘐瘕瘗瘘瘙瘛瘟瘠瘢瘤瘥瘦瘩瘪瘫瘰瘳瘴瘵瘸瘼瘾瘿癀癃癌癍癔癖癜癞癣癫癯癶癸登白百皂的皆皇皈皋皎皑皓皖皙皤皮皱皲皴皿盂盅盆盇盈盉益盌盍盎盏盐监盒盓盔盕盖盗盘盛盜盝盞盟盠盡盢監盤盥盦盨盩盪盫盬目盯盱盲盳直相盹盻盼盽盾盿眀省眃眄眅眆眇眈眉眊看県眍眎眏眕眖眘眙眚眜眞真眠眢眣眥眦眨眩眫眬眭眮眯眰眲眳眵眶眷眸眹眺眼眾着睁睃睄睅睆睇睉睊睋睍睎睏睐睑睒睕睖睘睙睚睛睞睠睡睢督睥睦睧睨睩睪睫睬睱睴睹睺睻睽睾睿瞀瞂瞄瞅瞆瞇瞋瞌瞍瞎瞏瞐瞑瞒瞓瞕瞜瞞瞟瞠瞡瞢瞣瞥瞧瞩瞪瞫瞬瞭瞰瞳瞵瞷瞻瞼瞽瞿矀矂矃矄矅矇矊矍矎矒矔矗矘矙矚矛矜矝矞矟矡矢矣知矧矩矫矬短矮矯矰石矵矶矸矺矻矽矾矿砀码砂砉砌砍砏砑砒研砖砗砘砚砛砜砝砟砢砣砤砥砦砧砩砪砫砬砭砮砰砲破砷砸砹砺砻砼砾础硁硂硃硄硅硇硈硊硌硎硏硐硒硕硖硗硙硚硝硟硣硪硫硬硭确硱硷硼硽碀碁碃碅碇碉碌碍碎碑碒碓碔碕碗碘碚碛碜碟碠碡碣碥碦碧碩碭碰碱碲碳碴碵碶碸確碻碼碽碾磁磃磄磅磈磉磊磋磐磑磔磕磙磚磜磞磠磡磣磥磦磨磩磪磫磬磭磯磲磳磴磷磸磹磺磻磽磾磿礀礁礂礄礅礇礈礉礊礋礌礎礐礑礒礓礘礙礜礞礡礤礦礨礮礱礴示礼礽社礿祀祁祂祃祅祆祇祈祉祋祎祏祐祓祔祕祖祗祘祙祚祛祜祝神祟祠祢祤祥祦祧票祩祪祫祭祮祯祰祲祳祶祷祸祹祺祻祼祾祿禀禁禃禄禅禆禇禊禋禌禍禎福禐禑禔禖禗禘禛禜禞禠禡禢禣禤禥禦禧禨禩禪禫禬禭禮禰禱禳禵禸禹禺离禽禾禿秀私秃秅秆秉秋秌种科秒秔秕秘秙租秠秢秣秤秦秧秩秫秬秭积称秱秲秳秵秶秸秹秺移秼秽秾稀稂稃稄稅稆稇稈程稌稍税稑稓稔稖稗稘稙稚稛稜稞稟稠稡稣稧稬稭種稱稲稳稴稷稸稹稻稼稽稿穀穃穄穆穈穉穊積穐穑穗穙穛穜穟穢穩穪穫穯穰穱穴穵究穷穸穹空穻穽穿窀突窃窄窅窆窇窈窊窋窌窍窎窑窒窔窕窖窗窘窜窝窟窠窣窤窥窦窨窩窪窫窬窭窮窯窳窸窼窾窿竂竄竅竇竈立竌竏竑竒竖站竚竝竞竟章竢竣竤童竦竭端競竷竸竹竺竽竾竿笀笃笄笆笇笈笉笊笋笍笎笏笐笑笔笕笖笗笙笛笜笞笟笠笣笤笥符笧笨笪笫第笭笮笰笱笲笳笸笹笺笼笾笿筂筅筆筇筈等筊筋筌筍筏筐筑筒答策筘筚筛筝筠筢筣筥筦筩筭筮筰筱筲筴筵筶筷筸筹筻筼筽签简箅箇箋箍箏箐箒箓箔箕箖算箘箛箜箝箞箠管箢箣箤箥箦箧箨箩箪箫箬箭箯箱箴箷箸箹箽箾箿節篁篂篃範篆篇築篌篑篓篙篚篛篜篝篟篠篡篤篥篦篨篩篪篬篭篮篯篰篱篲篳篴篷篸篺篼篾簃簇簋簌簍簏簑簕簘簜簞簟簠簡簢簤簥簦簧簨簪簫簬簯簰簳簴簷簸簹簺簻簼簽簾簿籀籁籂籄籆籇籋籌籍籐籒籓籔籙籜籞籠籣籤籥籬籲米籴籶类籼籽粃粉粊粋粌粍粎粏粐粑粒粓粔粕粖粗粘粚粛粜粝粞粟粡粢粣粤粥粦粧粩粪粫粭粮粯粱粲粳粴粵粶粷粸粹粺粻粼粽精粿糀糁糂糅糇糈糉糊糌糍糓糕糖糗糙糜糞糟糠糢糦糧糨糮糯糰糱糴糵糷糸糺系紀紂紃約紅紇紊紋納紏紐紓純紖紗紘紙級紛紝素索紣紤紧紩紫紬紭紮累細紳紵紹紺紻紾絁終絃組絅絆絍絏結絒絓絕絙絛絜絞絟絡絣給絨絪絫絭絮統絲絳絶絷絹絺絼絽絾絿綀綂綄綅綈綊綍綎綏綑綒經綔綖綗綜綝綟綠綡綦維綮綱網綴綵綶綹綼綿緄緅緊緋緌緍緐緒緗線緛緜緝緞締緡緣緤緦編緩緯緰緱緲練緵緶緷緹緺緻緼縀縁縂縆縈縋縕縚縛縜縞縠縡縢縣縧縩縪縫縮縯縱縷縹縻縼總績縿繀繁繂繃繆繇繉繋繌繐繑繒織繕繖繙繚繜繝繞繟繣繤繧繨繩繫繬繯繳繴繸繺繻繼繿纀纁纂纃纄纉續纍纏纑纒纔纕纖纗纘纛纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纽纾线绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统绠绡绢绣绤绥绦继绨绩绪绫续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缑缒缓缔缕编缗缘缙缚缛缜缝缞缟缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵缶缷缸缺缻缽缾罁罂罃罄罅罆罇罈罋罍罐网罔罕罗罘罙罚罝罟罡罢罣罥罨罩罪置罯罰罱署罴罵罶罷罹罼罽罾羀羁羅羇羈羉羊羌美羑羔羕羗羙羚羜羝羞羟羠羡羣群羧義羭羮羯羰羲羴羵羶羷羸羹羺羼羽羿翀翁翂翃翅翆翈翉翊翌翎翐翑習翔翕翖翘翙翚翛翜翟翠翡翢翣翥翦翧翩翫翬翭翮翯翰翱翳翸翹翻翼耀老考耄者耆耇耈耊耋而耍耎耐耑耒耕耖耗耘耙耜耡耢耥耦耧耨耩耪耮耰耱耳耴耵耶耷耸耻耽耿聂聃聆聊聋职聍聒联聖聘聚聛聜聝聞聟聠聡聣聦聧聩聪聫聬聭聯聰聱聲聴聵聶職聸聹聺聻聽聾聿肀肃肄肅肆肇肉肊肋肌肍肏肓肖肘肙肚肛肜肝肞肟肠股肢肣肤肥肧肩肪肫肭肮肯肰肱育肴肷肸肺肻肼肽肾肿胀胁胂胃胄胆胊背胍胎胑胔胖胗胙胚胛胜胝胞胠胡胤胥胧胨胩胪胫胬胭胯胰胱胲胳胴胵胶胸胹胺胼能胾脂脅脆脈脉脊脍脎脏脐脑脒脓脔脕脖脗脘脙脚脛脜脝脞脟脣脦脧脨脩脫脬脭脮脯脰脱脲脳脵脶脷脸脹脺脻脼脽脾脿腀腂腃腄腆腈腊腋腌腎腐腑腓腔腕腗腘腙腚腠腣腥腦腧腨腩腪腫腬腭腮腰腱腳腴腵腸腹腺腻腼腽腾腿膀膂膄膆膈膊膋膏膑膕膗膘膚膛膜膝膟膠膥膦膨膩膪膫膬膭膮膯膰膱膲膳膴膵膶膹膺膻膼膽膿臀臁臂臃臄臅臆臇臈臉臊臋臌臍臎臏臐臑臒臓臕臖臗臘臚臛臜臞臟臢臣臥臧臨自臬臭臮臯至致臶臺臻臼臾臿舀舁舂舃舄舅舆與興舉舊舋舌舍舐舒舔舖舛舜舞舟舡舢舣舦舨航舫般舭舯舰舱舲舳舴舵舶舷舸船舻舾艁艂艄艆艇艈艉艊艋艍艎艏艐艑艒艕艖艘艙艚艜艞艟艢艣艤艦艧艨艩艫艭艮良艰色艳艴艶艷艸艺艼艽艾艿节芃芄芈芊芋芍芎芏芑芒芖芗芘芙芜芝芟芡芤芥芦芨芩芪芫芬芭芮芯芰花芳芴芵芷芸芹芻芼芽芾苁苃苄苅苇苈苊苋苌苍苎苏苑苒苓苔苕苗苘苙苛苜苞苟苠苡苣苤若苦苧苫苯英苲苴苶苷苹苻苼苽苾苿茀茁茂范茄茅茆茇茈茉茊茌茍茎茏茐茑茔茕茖茗茚茛茜茝茞茢茣茧茨茫茬茭茯茱茲茴茵茶茷茸茹茺茻茼茽茿荀荃荄荅荆荇荈草荊荏荐荑荒荔荖荘荙荚荛荜荞荟荠荡荢荣荤荥荦荧荨荩荪荫荬荭荮药荳荷荸荻荼荽莁莂莅莆莉莊莎莒莓莕莖莘莙莚莛莜莞莠莢莤莨莩莪莫莱莲莳莴莵莶获莸莹莺莻莼莽莾莿菀菁菂菃菄菅菆菇菉菊菌菍菏菐菑菒菓菔菕菖菘菙菚菜菝菞菟菠菡菢菣菥菦菧菨菩菪菫菬菭華菰菱菲菳菴菵菸菹菽萁萃萄萆萈萊萋萌萍萎萏萑萗萘萚萜萝萢萤营萦萧萨萩萬萱萵萸萼落葆葇葉葋葌葍葎葏葑葔葖著葘葙葚葛葜葞葟葠葡葢董葦葨葩葫葬葭葮葯葰葱葲葳葴葵葶葷葸葹葺葻葾蒁蒂蒃蒄蒇蒈蒉蒋蒌蒐蒑蒕蒗蒘蒙蒜蒞蒟蒡蒧蒨蒪蒭蒯蒲蒴蒷蒸蒹蒺蒻蒼蒽蒾蒿蓁蓂蓃蓄蓆蓇蓉蓊蓋蓍蓏蓐蓑蓓蓔蓕蓖蓗蓙蓚蓛蓝蓞蓟蓠蓡蓣蓥蓦蓧蓨蓬蓮蓯蓰蓱蓳蓴蓵蓷蓸蓺蓼蓾蓿蔀蔁蔂蔄蔊蔌蔎蔑蔓蔔蔗蔘蔙蔚蔞蔟蔡蔣蔥蔦蔫蔬蔯蔱蔲蔴蔷蔸蔺蔻蔼蔽蔿蕁蕂蕃蕅蕈蕉蕊蕋蕌蕒蕖蕗蕘蕙蕚蕛蕜蕝蕞蕟蕡蕣蕤蕦蕧蕨蕰蕲蕳蕴蕵蕷蕹蕺蕻蕼蕾蕿薀薂薃薄薅薆薇薋薏薐薑薔薖薗薙薛薜薝薠薢薤薦薨薪薭薮薯薰薳薷薹薾薿藀藁藇藉藍藏藐藑藓藕藖藗藘藙藚藛藜藝藞藠藢藣藤藥藦藧藨藩藫藬藭藮藯藰藳藴藵藶藷藺藻藿蘁蘂蘅蘆蘇蘋蘌蘑蘓蘔蘖蘘蘧蘩蘪蘭蘸蘼蘿虀虃虈虋虍虎虏虐虑虒虔處虖虗虘虙虚虛虜虝虞號虡虢虧虫虬虮虯虰虱虲虵虹虺虻虼虽虾虿蚀蚁蚂蚈蚊蚋蚌蚍蚑蚒蚓蚕蚖蚘蚜蚝蚡蚢蚣蚤蚧蚨蚩蚪蚬蚯蚰蚱蚴蚵蚶蚺蚾蚿蛀蛄蛆蛇蛉蛊蛋蛎蛏蛐蛑蛔蛖蛘蛙蛚蛛蛜蛞蛟蛡蛢蛣蛤蛥蛩蛬蛭蛮蛯蛰蛱蛲蛳蛴蛶蛷蛸蛹蛻蛾蜀蜁蜂蜃蜆蜇蜈蜉蜊蜌蜍蜎蜏蜐蜑蜒蜓蜔蜕蜗蜘蜚蜜蜞蜠蜡蜢蜣蜥蜨蜩蜪蜫蜮蜱蜴蜷蜸蜺蜻蜼蜽蜾蜿蝀蝄蝇蝈蝉蝌蝍蝎蝑蝓蝕蝗蝘蝙蝝蝟蝠蝣蝤蝥蝦蝨蝮蝰蝴蝶蝸蝹蝺蝻蝼蝽蝾蝿螀螁螂螃螅螈螋融螐螑螓螕螖螗螘螚螝螞螟螠螡螢螣螤螥螦螧螨螫螬螭螯螳螵螺螽蟀蟂蟅蟆蟊蟋蟑蟒蟓蟛蟜蟝蟠蟢蟥蟧蟨蟪蟫蟬蟭蟮蟯蟲蟳蟹蟻蟼蟾蟿蠃蠄蠅蠆蠈蠊蠋蠌蠍蠎蠏蠒蠓蠔蠕蠖蠗蠙蠚蠛蠜蠝蠟蠡蠢蠣蠥蠩蠪蠭蠲蠶蠷蠹蠻蠼蠾血衂衄衅衋行衍衒術衔衕衖街衘衙衛衝衟衡衢衣补表衩衫衬衮衰衲衷衸衹衼衽衾衿袀袁袂袃袄袅袆袇袈袉袊袋袌袍袐袑袒袓袔袕袖袗袘袚袛袜袝袞袟袠袢袣袤袥袦袧袨袩袪被袬袭袱袴袵袷袼袽袿裀裁裂装裆裈裉裋裎裏裒裓裔裕裘裙裛補裝裟裡裢裣裤裥裨裩裯裰裱裲裳裴裶裸裹裺裼製裾褂複褊褋褌褎褏褐褑褒褓褔褙褚褛褜褠褡褣褥褦褧褨褪褫褯褰褱褲褴褵褶褸褹襁襄襆襌襍襕襖襘襛襞襟襢襤襦襪襫襬襱襲襶襻襽襾西要覂覃覅覆覇覈覊見覍規覐覓視覗覙覚覛覟覠覥覩親覯覵覺觀见观规觅视觇览觉觊觋觌觍觎觏觐觑角觓觔觖觚觜觝觞解觥触觫觭觯觱觳觸觼觽觿言訂訃訄訅訆訇計訉訊訋訌討訏訐訑訒訓訔訕託記訙訚訛訜訝訞訟訡訢訣訪設訮許訴訹診註証訽訾詀詄詅詇詈詐詒評詖詗詛詝詞詟詠詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詵詷詸詹詺詻詼詾詿誇誉誊誌認誓誕誖誘語誠誡誤誥說説誰課誳誴誻誽誾調諂諄諆談諈諉請諏諑諒諓論諘諛諝諠諡諥諦諧諮諱諸諹諺謀謂謄謇謏謚講謝謟謠謡謥謦謧謨謩謪謬謱謴謸謹謺謽謿譁譃譄譅證譌譓譔譗識譜譞譟譢警譫譬譯議護譸譻譽讀讈讉變讌讍讏讓讕讙讚讛讜讝讞讟计订讣认讥讦讧讨让讪讫讬训议讯记讱讲讳讴讵讶讷许讹论讼讽设访诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿谀谁谂调谄谅谆谇谈谉谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷谻谼谽谿豀豁豂豆豇豈豉豊豌豎豐豕豗豚豠象豢豧豨豪豫豬豭豰豳豵豷豸豹豺貂貅貉貊貋貌貍貎貏貐貑貒貓貔貗貘貙貛貝貞負財貢貣貤貦貧貨販貪貫責貮貯貲貴買貸費貼貽貿賀賁賂賄賅資賈賊賓賚賜賞賡賢賣賦賨質賮賯賰賱賲賳賴賷賸賹賺購贀贁贂贄贅贆贇贈贉贊贋贌贏贝贞负贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟赠赡赢赣赤赦赧赪赫赭走赲赳赴赵赶起赹赽趁趄超越趋趌趑趔趕趙趝趟趡趣趤趥趦趧趨趩趪趬趮趯趰趱足趴趵趶趷趸趹趺趼趽趾趿跁跂跃跄跅跆跈跉跊跋跌跍跎跏跐跑跒跓跔跖跗跘跚跛距跞跟跡跣跤跨跪跫跬路跰跱跳践跶跷跸跹跺跻跼跽跾踀踃踄踅踆踉踊踌踏踐踔踖踘踝踞踟踡踢踣踥踦踧踨踩踪踫踬踮踯踰踱踴踵踸踹踺踽蹀蹁蹂蹄蹅蹆蹇蹈蹉蹊蹋蹌蹎蹐蹑蹒蹓蹔蹖蹙蹚蹞蹟蹠蹡蹣蹤蹦蹧蹨蹩蹬蹭蹯蹰蹱蹲蹳蹴蹶蹷蹹蹻蹼蹽蹾蹿躁躄躅躇躉躍躏躐躒躔躘躛躜躞躦躩身躬躭躯躱躲躶躺躻躼躿軀軃軅軆軇軈軉車軌軍軎軏軐軒軓軔軘軙軛軟軠軡転軣軧軬軷軸軻軿輀輂較輈載輋輐輒輓輔輕輖輗輘輝輥輦輧輨輩輪輰輳輴輵輶輸輻輽輾輿轂轇轉轋轎轓轕轗轘轝轟轥车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辛辜辞辟辢辣辦辨辩辫辭辯辰辱農辵边辻込辽达迁迂迄迅迆过迈迋迍迎迏运近迒迓返迕还这进远违连迟迢迤迥迦迨迩迪迫迭迮迯述迳迴迷迸迹迺迻追退送适逃逄逅逆逇选逊逋逌逍透逐逑递逓途逕逖逗這通逛逝逞速造逡逢連逤逦逭逮逯週進逵逶逷逸逻逼逾逿遁遂遄遆遇遈遊運遍過遏遐遑遒道達違遗遘遙遛遜遝遞遠遡遢遣遥遨適遭遮遯遲遴遵遶遷選遹遺遽避邀邁邂邃還邅邆邇邈邉邊邋邌邏邑邓邔邕邗邘邙邛邝邠邡邢那邥邦邨邪邫邬邮邯邰邱邲邳邴邵邶邸邹邺邻邼邽邾邿郀郁郃郄郅郇郈郊郋郎郏郐郑郓郕郗郘郙郛郜郝郞郟郡郢郤郦郧部郪郫郭郯郴郵郸都郾郿鄂鄄鄉鄍鄑鄗鄘鄙鄚鄛鄜鄞鄟鄠鄡鄢鄣鄤鄦鄧鄩鄫鄬鄮鄯鄰鄱鄳鄶鄷鄹鄺鄽鄿酀酁酂酃酆酇酉酊酋酌配酎酐酒酖酗酚酝酞酡酢酣酤酥酦酨酩酪酬酮酯酰酱酲酳酴酵酶酷酸酹酺酼酽酾酿醁醃醄醅醆醇醉醊醋醌醍醎醐醑醒醕醖醚醛醜醞醡醢醣醥醨醪醫醭醮醯醰醱醲醴醵醺醻醼醽醾醿釀釆采釉释釋里重野量釐金釔釘釙釛釜針釟釠釡釢釣釤釥釦釪釭釱釾釿鈂鈆鈇鈉鈍鈕鈖鈙鈡鈣鈤鈦鈧鈨鈩鈪鈰鈱鈴鈵鈶鈸鈺鈽鈾鈿鉀鉁鉂鉃鉄鉅鉍鉏鉐鉔鉛鉤鉴鉼鉽銀銅銊銌銎銑銒銓銘銙銜銝銦銧銫銮銲銳銶銷鋂鋅鋆鋇鋈鋊鋋鋎鋐鋒鋕鋣鋤鋪鋫鋬鋭鋰鋱鋵鋷鋸鋹鋺鋻鋼鋾錃錄錆錈錋錏錐錗錞錠錢錣錥錦錧錨錫錯録錾鍀鍊鍋鍍鍎鍏鍐鍑鍓鍔鍚鍛鍟鍤鍥鍦鍧鍩鍪鍬鍮鍱鍳鍵鍸鍼鎄鎇鎋鎌鎍鎏鎔鎖鎗鎘鎚鎝鎪鎭鎮鎯鎰鎲鎴鎸鏁鏂鏆鏈鏉鏊鏍鏏鏐鏕鏖鏘鏟鏡鏢鏤鏦鏭鏰鏱鏸鏻鏽鏿鐄鐇鐍鐎鐏鐐鐑鐓鐖鐘鐣鐤鐧鐨鐩鐬鐮鐰鐲鐳鐴鐵鐷鐻鐾鐿鑀鑄鑊鑑鑕鑘鑛鑟鑢鑣鑨鑪鑫鑮鑰鑱鑲鑴鑵鑷鑽鑾鑿钁钃钅钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钜钝钞钟钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿铀铁铂铃铄铅铆铈铉铊铋铌铍铎铏铐铑铒铓铔铕铖铗铙铚铛铜铝铞铟铠铡铢铣铤铥铦铧铨铩铪铫铬铭铮铯铰铱铲铳铵银铷铸铹铺铻铼铽链铿销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗锘错锚锛锜锝锞锟锡锢锣锤锥锦锧锨锩锪锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿镀镁镂镃镄镅镆镇镈镉镊镌镍镎镏镐镑镒镓镔镕镖镗镘镙镚镛镜镝镞镟镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镵镶長镻长門閃閉開閏閑閒間閔閗閛閟関閣閤閧閬閭閮閯閰閱閳閴閶閷閹閺閻閽閾閿闀闃闄闅闆闇闉闊闌闍闒闕闚闛關闟闡闢门闩闪闫闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛阜队阡阢阤阨阪阮阯阱防阳阴阵阶阸阻阼阽阿陀陁陂附际陆陇陈陉陋陌降限陔陕陗陙陛陜陝陞陟陠陡院陣除陧陨险陪陬陮陰陲陳陴陵陶陷陸陻陼陽隂隃隄隅隆隈隊隋隍階随隐隔隗隘隙際障隝隣隤隥隦隧隨隩險隰隱隲隳隶隸隹隺隻隼隽难雀雁雄雅集雇雉雊雋雌雍雎雏雑雒雔雕雖雘雙雚雜雞雟雠離難雨雩雪雮雯雰雱雲雳零雷雹電雾需霁霂霄霅霆震霈霉霍霎霏霑霓霖霘霚霜霝霞霠霣霤霧霨霩霪霫霭霮霰露霳霸霹霾靃靄靈靉青靓靖静靛靜非靠靡面靣靥靦革靭靮靰靱靳靴靵靶靷靸靹靺靼靿鞄鞅鞊鞋鞍鞎鞏鞑鞒鞓鞔鞖鞗鞘鞚鞛鞝鞟鞠鞡鞣鞦鞧鞨鞪鞫鞬鞭鞮鞯鞲鞴鞺鞻鞿韂韆韈韋韌韍韓韗韟韥韦韧韨韩韪韫韬韭韮韰韱韲音韴韵韶韷韺韻韼韽響頁頂頃項順須頉頊頋頌頍頎預頒頓頗領頜頞頠頤頦頨頫頭頰頳頵頷頸頹頺頻顀顆題額顎顏顐顑顒顓顔顕顗願顛顝類顟顣顧顨顩顪顫顬顯顱顳顴页顶顷顸项顺须顼顽顾顿颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颓颔颖颗题颙颚颛颜额颞颟颠颡颢颤颥颦颧風颩颱颵颺颻颼飀飆风飏飐飑飒飓飔飕飖飗飘飙飚飛飞食飢飥飦飧飨飩飪飭飮飯飰飲飳飷飸飺飼飽飾餀餁餂餃餅餆餇餈餉養餌餍餐餒餓餔餖餗餘餚餟餦館餫餬餮餱餵餼餽饅饆饈饋饌饏饐饑饒饔饕饘饜饝饟饡饤饥饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿馀馁馂馃馄馅馆馇馈馉馊馋馍馏馐馑馒馓馔馕首馗馘香馥馧馨馬馮馳馴馻馿駃駉駋駐駕駚駛駜駝駞駡駣駥駨駮駰駳駵駶駷駸駹騁騃騄騇騊騍騎騔騙騛騠騣騧騫騰騷騺騻騼騽騾騿驀驁驂驄驅驆驇驈驊驌驎驑驕驖驗驘驙驚驛驟驡驢驥驦驩马驭驮驯驰驱驳驴驵驶驷驸驹驺驻驼驽驾驿骀骁骂骃骄骅骆骇骈骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟骠骡骢骣骤骥骧骨骩骫骯骰骱骳骶骷骸骹骺骻骼骾骿髀髁髂髅髆髉髋髌髏髑髒髓體髕高髞髟髠髡髣髤髥髦髧髪髫髭髮髯髲髳髴髹髻髼髽髿鬀鬂鬃鬄鬅鬆鬈鬉鬋鬏鬐鬑鬓鬖鬘鬙鬚鬛鬟鬠鬢鬣鬥鬧鬯鬱鬲鬳鬶鬸鬻鬼鬽鬿魁魂魃魄魅魆魇魈魉魋魍魏魑魒魔魖魚魛魜魟魣魫魰魱魳魵魸魺魽魾魿鮀鮁鮄鮅鮇鮈鮊鮋鮌鮍鮎鮘鮟鮠鮡鮣鮨鮪鮭鮮鮰鮻鮼鮾鯀鯁鯂鯅鯆鯈鯊鯋鯏鯐鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛鯝鯡鯨鯩鯬鯮鯵鯶鯽鰁鰆鰉鰌鰍鰕鰜鰞鰟鰠鰡鰤鰧鰨鰪鰫鰬鰰鰲鰵鰷鰸鰹鰻鰽鰿鱀鱂鱄鱇鱉鱌鱓鱖鱗鱣鱤鱥鱧鱮鱯鱲鱵鱺鱻鱼鱽鱾鱿鲀鲁鲂鲃鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲙鲚鲛鲜鲝鲞鲟鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲻鲼鲽鲾鲿鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳚鳛鳜鳝鳞鳟鳠鳡鳢鳣鳤鳥鳩鳪鳰鳳鳴鳶鳷鳾鳿鴂鴃鴉鴐鴒鴓鴙鴜鴞鴟鴢鴣鴥鴦鴧鴨鴪鴫鴭鴮鴰鴱鴲鴳鴴鴵鴷鴹鴺鴻鴼鴽鴾鴿鵀鵁鵂鵄鵋鵏鵝鵟鵣鵨鵪鵬鵰鵲鵳鵼鶃鶄鶆鶇鶈鶊鶍鶎鶐鶒鶓鶕鶗鶚鶜鶝鶟鶠鶡鶢鶩鶫鶲鶳鶴鶸鶺鷁鷃鷇鷉鷖鷘鷟鷣鷥鷦鷧鷩鷫鷭鷱鷲鷳鷴鷵鷷鷹鷺鷼鷽鷿鸀鸁鸂鸇鸊鸍鸓鸖鸘鸟鸠鸡鸢鸣鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹕鹖鹗鹘鹙鹚鹛鹜鹞鹟鹠鹡鹣鹤鹦鹧鹨鹩鹪鹫鹬鹭鹮鹯鹰鹱鹳鹵鹹鹼鹽鹾鹿麀麂麃麄麅麆麇麈麉麊麋麎麏麐麑麒麓麕麖麗麚麜麝麞麟麡麣麤麥麦麧麨麩麯麰麴麵麸麹麻麼麽麾麿黃黄黇黉黋黍黎黏黑黒黔默黛黜黝點黟黠黡黢黥黧黨黩黪黮黯黴黶黹黺黻黼黽黾黿鼂鼄鼅鼇鼈鼉鼊鼋鼍鼎鼏鼐鼑鼓鼖鼗鼘鼙鼜鼞鼠鼢鼤鼥鼩鼪鼫鼬鼮鼯鼰鼱鼶鼷鼹鼻鼾齁齄齆齊齋齏齐齑齒齗齛齜齡齢齣齦齧齮齯齰齲齸齺齻齼齽齾齿龀龁龂龃龄龅龆龇龈龉龊龋龌龍龎龑龒龓龔龙龚龛龜龝龟龠龢龤𢶯秊裏 diff --git a/src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/utf16.txt b/src/test/resources/org/jenkinsci/plugins/tokenmacro/impl/utf16.txt new file mode 100644 index 0000000000000000000000000000000000000000..4d8e1f2c3a95507bd92b938caeb7c1e8cf7de1f3 GIT binary patch literal 174 zcmezWuYjS5A(bJQA(P<+n56(@6*DL>qygz7AghFdivgh~m4Sg7q#mZKm>~zKE}bC* zs4j=05-6Sm