From a90a7c0a25338a18d672338195aa0bab97ed2585 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Mon, 22 Sep 2025 10:20:13 -0500 Subject: [PATCH 01/15] draft: Grunt transformer --- .../composed/ComposedGruntTransformer.java | 4 +- .../impl/grunt/GruntStringTransformer.java | 108 ++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) create mode 100644 deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java index da4c1d21..72603d5e 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java @@ -2,6 +2,7 @@ import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer; import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; +import uwu.narumi.deobfuscator.core.other.impl.grunt.GruntStringTransformer; import uwu.narumi.deobfuscator.core.other.impl.pool.InlineStaticFieldTransformer; import uwu.narumi.deobfuscator.core.other.impl.universal.AccessRepairTransformer; import uwu.narumi.deobfuscator.core.other.impl.universal.InlinePureFunctionsTransformer; @@ -21,7 +22,8 @@ public ComposedGruntTransformer() { InlineStaticFieldTransformer::new, // Inline pure functions InlinePureFunctionsTransformer::new - ) + ), + GruntStringTransformer::new ); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java new file mode 100644 index 00000000..fc541f31 --- /dev/null +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -0,0 +1,108 @@ +package uwu.narumi.deobfuscator.core.other.impl.grunt; + +import org.jetbrains.annotations.Contract; +import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.tree.MethodInsnNode; +import uwu.narumi.deobfuscator.api.asm.ClassWrapper; +import uwu.narumi.deobfuscator.api.asm.MethodContext; +import uwu.narumi.deobfuscator.api.asm.matcher.Match; +import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; +import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; +import uwu.narumi.deobfuscator.api.transformer.Transformer; + +// TODO: string array support +public class GruntStringTransformer extends Transformer { + + /** + getstatic Main.GDIaAJBllbXLY5N9 [Ljava/lang/String; + iconst_0 + ldc "⥋脞\uECB2옧蔃氆" + invokevirtual java/lang/String.toCharArray ()[C + ldc 46256L + ldc 468949809 + invokestatic Main.gL3Vqtvj62G5xf3H ([CJI)Ljava/lang/String; + aastore + */ + + private static final Match stringPoolAdditionMatch = SequenceMatch.of( + FieldMatch.getStatic().capture("stringPool"), + NumberMatch.of().capture("index"), // index + StringMatch.of().capture("enc"), + MethodMatch.invokeVirtual().owner("java/lang/String").name("toCharArray").desc("()[C"), + NumberMatch.numLong().capture("seed"), + NumberMatch.numInteger().capture("key"), + MethodMatch.invokeStatic().desc("([CJI)Ljava/lang/String;").capture("decryptMethod"), + OpcodeMatch.of(AASTORE) + ); + + private static final SequenceMatch stringDecryptorMethodMatch = SequenceMatch.of( + NumberMatch.of().capture("key"), + VarLoadMatch.of(), + OpcodeMatch.of(IXOR), + OpcodeMatch.of(ISTORE), + NumberMatch.of(0), + OpcodeMatch.of(ISTORE) + ); + + @Contract("_, _, _, _ -> new") + private static @NotNull String decrypt(int classKey, char @NotNull [] encrypted, long seed, int key) { + int cat = classKey ^ key; + for (int i = 0; i < encrypted.length; ++i) { + cat = cat ^ (int)seed ^ ~i; + cat ^= key - i * encrypted.length; + cat = -cat * key | i; + encrypted[i] = (char)(encrypted[i] ^ cat); + int i2 = i & 0xFF; + key = key << i2 | key >>> -i2; + seed ^= i2; + } + return new String(encrypted); + } + + private static Integer getClassKey(MethodContext ctx) { + var m = stringDecryptorMethodMatch.findFirstMatch(ctx); + if (m == null) { + return null; + } + return m.captures().get("key").insn().asInteger(); + } + + private static void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrapper c) { + final var initOpt = c.findClInit(); + if (initOpt.isEmpty()) return; + final var init = initOpt.get(); + for (final var insn : init.instructions) { + if (insn instanceof MethodInsnNode min) { + final var resolved = c.findMethod(min); + if (resolved.isEmpty()) return; + var r = resolved.get(); + var ms = stringPoolAdditionMatch.findAllMatches(MethodContext.of(c, r)); + if (ms.isEmpty()) { + LOGGER.warn("couldn't find any strings in {}#{}{}", min.owner, min.name, min.desc); + return; + } + Integer classKey = null; + for (var m : ms) { + var cap = m.captures(); +// var i = cap.get("index").insn().asNumber(); + var enc = cap.get("enc").insn().asString(); + var seed = cap.get("seed").insn().asNumber().longValue(); + var key = cap.get("key").insn().asNumber().intValue(); + var dm = cap.get("decryptMethod").insn().asMethodInsn(); +// var sp = cap.get("stringPool").insn().asFieldInsn(); + final var resolved2 = c.findMethod(dm); + if (resolved2.isEmpty()) return; + var r2 = resolved2.get(); + if (classKey == null) classKey = getClassKey(MethodContext.of(c, r2)); + if (classKey == null) return; + LOGGER.info("decrypted: {}", decrypt(classKey, enc.toCharArray(), seed, key)); + } + } + } + } + + @Override + protected void transform() throws Exception { + scopedClasses().forEach(GruntStringTransformer::imobfuscatingdogclientrnmightratittrust); + } +} From 4c0acd5e4f1de73d6799a3019e771eb2eac80a09 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Wed, 1 Oct 2025 13:55:15 -0500 Subject: [PATCH 02/15] a2 --- .../narumi/deobfuscator/api/asm/FieldRef.java | 16 +++- .../src/test/java/Bootstrap.java | 9 +- .../impl/grunt/GruntStringTransformer.java | 85 +++++++++++++++---- 3 files changed, 87 insertions(+), 23 deletions(-) diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/FieldRef.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/FieldRef.java index a5e5b7fa..446e576b 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/FieldRef.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/asm/FieldRef.java @@ -1,9 +1,12 @@ package uwu.narumi.deobfuscator.api.asm; +import org.jetbrains.annotations.NotNull; import org.objectweb.asm.tree.ClassNode; import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.FieldNode; +import java.util.Objects; + /** * @param owner Class that owns this field * @param name Field's name @@ -19,7 +22,18 @@ public static FieldRef of(FieldInsnNode fieldInsn) { } @Override - public String toString() { + public @NotNull String toString() { return owner + "." + name + desc; } + + @Override + public boolean equals(Object o) { + if (!(o instanceof FieldRef fieldRef)) return false; + return Objects.equals(name, fieldRef.name) && Objects.equals(desc, fieldRef.desc) && Objects.equals(owner, fieldRef.owner); + } + + @Override + public int hashCode() { + return Objects.hash(owner, name, desc); + } } diff --git a/deobfuscator-impl/src/test/java/Bootstrap.java b/deobfuscator-impl/src/test/java/Bootstrap.java index 0984b8f8..0638517e 100644 --- a/deobfuscator-impl/src/test/java/Bootstrap.java +++ b/deobfuscator-impl/src/test/java/Bootstrap.java @@ -2,22 +2,21 @@ import org.objectweb.asm.ClassWriter; import uwu.narumi.deobfuscator.Deobfuscator; import uwu.narumi.deobfuscator.api.context.DeobfuscatorOptions; -import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; +import uwu.narumi.deobfuscator.core.other.composed.ComposedGruntTransformer; public class Bootstrap { public static void main(String[] args) { Deobfuscator.from( DeobfuscatorOptions.builder() - .inputJar(Path.of("work", "obf-test.jar")) // Specify your input jar here + .inputJar(Path.of("work", "grunt.jar")) // Specify your input jar here //.libraries(Path.of("work", "libs")) // Specify your libraries here if needed .transformers( - // Pick your transformers here - () -> new ComposedGeneralFlowTransformer() + ComposedGruntTransformer::new ) .continueOnError() .classWriterFlags(ClassWriter.COMPUTE_FRAMES) .build() - ).start(); + ).start(); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index fc541f31..ddbf4a93 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -2,26 +2,35 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.tree.FieldInsnNode; +import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; +import uwu.narumi.deobfuscator.api.asm.FieldRef; import uwu.narumi.deobfuscator.api.asm.MethodContext; +import uwu.narumi.deobfuscator.api.asm.MethodlessInsnContext; import uwu.narumi.deobfuscator.api.asm.matcher.Match; import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; import uwu.narumi.deobfuscator.api.transformer.Transformer; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + // TODO: string array support public class GruntStringTransformer extends Transformer { /** - getstatic Main.GDIaAJBllbXLY5N9 [Ljava/lang/String; - iconst_0 - ldc "⥋脞\uECB2옧蔃氆" - invokevirtual java/lang/String.toCharArray ()[C - ldc 46256L - ldc 468949809 - invokestatic Main.gL3Vqtvj62G5xf3H ([CJI)Ljava/lang/String; - aastore + * getstatic Main.GDIaAJBllbXLY5N9 [Ljava/lang/String; + * iconst_0 + * ldc "⥋脞\uECB2옧蔃氆" + * invokevirtual java/lang/String.toCharArray ()[C + * ldc 46256L + * ldc 468949809 + * invokestatic Main.gL3Vqtvj62G5xf3H ([CJI)Ljava/lang/String; + * aastore */ private static final Match stringPoolAdditionMatch = SequenceMatch.of( @@ -44,14 +53,19 @@ public class GruntStringTransformer extends Transformer { OpcodeMatch.of(ISTORE) ); + /** + * class name to string pool map + **/ + private final Map classNameToStringPool = new HashMap<>(); + @Contract("_, _, _, _ -> new") private static @NotNull String decrypt(int classKey, char @NotNull [] encrypted, long seed, int key) { int cat = classKey ^ key; for (int i = 0; i < encrypted.length; ++i) { - cat = cat ^ (int)seed ^ ~i; + cat = cat ^ (int) seed ^ ~i; cat ^= key - i * encrypted.length; cat = -cat * key | i; - encrypted[i] = (char)(encrypted[i] ^ cat); + encrypted[i] = (char) (encrypted[i] ^ cat); int i2 = i & 0xFF; key = key << i2 | key >>> -i2; seed ^= i2; @@ -67,10 +81,11 @@ private static Integer getClassKey(MethodContext ctx) { return m.captures().get("key").insn().asInteger(); } - private static void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrapper c) { + private void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrapper c) { final var initOpt = c.findClInit(); if (initOpt.isEmpty()) return; final var init = initOpt.get(); + FieldRef stringPoolRef = null; for (final var insn : init.instructions) { if (insn instanceof MethodInsnNode min) { final var resolved = c.findMethod(min); @@ -82,27 +97,63 @@ private static void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrappe return; } Integer classKey = null; + var pool = new String[ms.size()]; for (var m : ms) { var cap = m.captures(); -// var i = cap.get("index").insn().asNumber(); + var i = cap.get("index").insn().asInteger(); var enc = cap.get("enc").insn().asString(); - var seed = cap.get("seed").insn().asNumber().longValue(); - var key = cap.get("key").insn().asNumber().intValue(); + var seed = cap.get("seed").insn().asLong(); + var key = cap.get("key").insn().asInteger(); var dm = cap.get("decryptMethod").insn().asMethodInsn(); -// var sp = cap.get("stringPool").insn().asFieldInsn(); + var sp = cap.get("stringPool").insn().asFieldInsn(); + stringPoolRef = FieldRef.of(sp); final var resolved2 = c.findMethod(dm); if (resolved2.isEmpty()) return; var r2 = resolved2.get(); if (classKey == null) classKey = getClassKey(MethodContext.of(c, r2)); if (classKey == null) return; - LOGGER.info("decrypted: {}", decrypt(classKey, enc.toCharArray(), seed, key)); + var str = decrypt(classKey, enc.toCharArray(), seed, key); + pool[i] = str; + } + this.classNameToStringPool.put(c.name(), pool); + Match lol = SequenceMatch.of( + NumberMatch.numInteger(), + OpcodeMatch.of(ANEWARRAY), + FieldMatch.putStatic().fieldRef(stringPoolRef), + MethodMatch.invokeStatic().owner(min.owner).name(min.name).desc(min.desc) + ); + lol.findFirstMatch(MethodContext.of(c, init)) + .removeAll(); + } + } + FieldRef spr = stringPoolRef; + c.methods().forEach(method -> { + if (method.instructions.size() <= 0) { + return; + } + for (final var insn : method.instructions) { + if (spr != null + && insn instanceof FieldInsnNode fin + && spr.equals(FieldRef.of(fin))) { + var idxInsn = fin.next(1); + var aaload = fin.next(2); + if (aaload.getOpcode() != AALOAD) return; + var idx = idxInsn.asInteger(); + init.instructions.insertBefore(insn, new LdcInsnNode(this.classNameToStringPool.get(c.name())[idx])); + init.instructions.remove(insn); + init.instructions.remove(idxInsn); + init.instructions.remove(aaload); + markChange(); } } + }); + if (init.instructions.size() <= 0) { + c.methods().remove(init); } } @Override protected void transform() throws Exception { - scopedClasses().forEach(GruntStringTransformer::imobfuscatingdogclientrnmightratittrust); + scopedClasses().forEach(this::imobfuscatingdogclientrnmightratittrust); } } From 2d30dba3bf92658b785b4815ed28fb660fe30b24 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Wed, 19 Nov 2025 13:58:43 -0600 Subject: [PATCH 03/15] not work --- .../impl/grunt/GruntStringTransformer.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index ddbf4a93..6d6f2d8e 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -8,16 +8,13 @@ import uwu.narumi.deobfuscator.api.asm.ClassWrapper; import uwu.narumi.deobfuscator.api.asm.FieldRef; import uwu.narumi.deobfuscator.api.asm.MethodContext; -import uwu.narumi.deobfuscator.api.asm.MethodlessInsnContext; import uwu.narumi.deobfuscator.api.asm.matcher.Match; import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; import uwu.narumi.deobfuscator.api.transformer.Transformer; -import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.Objects; // TODO: string array support public class GruntStringTransformer extends Transformer { @@ -35,7 +32,7 @@ public class GruntStringTransformer extends Transformer { private static final Match stringPoolAdditionMatch = SequenceMatch.of( FieldMatch.getStatic().capture("stringPool"), - NumberMatch.of().capture("index"), // index + NumberMatch.of().capture("index"), StringMatch.of().capture("enc"), MethodMatch.invokeVirtual().owner("java/lang/String").name("toCharArray").desc("()[C"), NumberMatch.numLong().capture("seed"), @@ -81,7 +78,7 @@ private static Integer getClassKey(MethodContext ctx) { return m.captures().get("key").insn().asInteger(); } - private void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrapper c) { + private void deobfClass(@NotNull ClassWrapper c) { final var initOpt = c.findClInit(); if (initOpt.isEmpty()) return; final var init = initOpt.get(); @@ -129,17 +126,22 @@ private void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrapper c) { FieldRef spr = stringPoolRef; c.methods().forEach(method -> { if (method.instructions.size() <= 0) { +// LOGGER.info("awesome library"); return; } for (final var insn : method.instructions) { if (spr != null - && insn instanceof FieldInsnNode fin - && spr.equals(FieldRef.of(fin))) { + && insn instanceof FieldInsnNode fin) { var idxInsn = fin.next(1); var aaload = fin.next(2); - if (aaload.getOpcode() != AALOAD) return; var idx = idxInsn.asInteger(); - init.instructions.insertBefore(insn, new LdcInsnNode(this.classNameToStringPool.get(c.name())[idx])); + var dec = this.classNameToStringPool.get(c.name())[idx]; + if (aaload.getOpcode() != AALOAD) { +// LOGGER.info("not an aaload for {} -> {}", idx, dec); + return; + } +// LOGGER.info("{} -> {}", idx, dec); + init.instructions.insertBefore(insn, new LdcInsnNode(dec)); init.instructions.remove(insn); init.instructions.remove(idxInsn); init.instructions.remove(aaload); @@ -154,6 +156,6 @@ private void imobfuscatingdogclientrnmightratittrust(@NotNull ClassWrapper c) { @Override protected void transform() throws Exception { - scopedClasses().forEach(this::imobfuscatingdogclientrnmightratittrust); + scopedClasses().forEach(this::deobfClass); } } From afa1c6ad053db9aee5cf96ef1f20420e7dd34191 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 09:51:49 -0600 Subject: [PATCH 04/15] fix: why did I commit the bootstrap changes lol --- deobfuscator-impl/src/test/java/Bootstrap.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/deobfuscator-impl/src/test/java/Bootstrap.java b/deobfuscator-impl/src/test/java/Bootstrap.java index 0638517e..0984b8f8 100644 --- a/deobfuscator-impl/src/test/java/Bootstrap.java +++ b/deobfuscator-impl/src/test/java/Bootstrap.java @@ -2,21 +2,22 @@ import org.objectweb.asm.ClassWriter; import uwu.narumi.deobfuscator.Deobfuscator; import uwu.narumi.deobfuscator.api.context.DeobfuscatorOptions; -import uwu.narumi.deobfuscator.core.other.composed.ComposedGruntTransformer; +import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; public class Bootstrap { public static void main(String[] args) { Deobfuscator.from( DeobfuscatorOptions.builder() - .inputJar(Path.of("work", "grunt.jar")) // Specify your input jar here + .inputJar(Path.of("work", "obf-test.jar")) // Specify your input jar here //.libraries(Path.of("work", "libs")) // Specify your libraries here if needed .transformers( - ComposedGruntTransformer::new + // Pick your transformers here + () -> new ComposedGeneralFlowTransformer() ) .continueOnError() .classWriterFlags(ClassWriter.COMPUTE_FRAMES) .build() - ).start(); + ).start(); } } From 1282404bf3ea02cd1a12ae9d3b8ddb181263b4b4 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:11:48 -0600 Subject: [PATCH 05/15] fix: removing an instruction from another method using the clinit method... I'm blind --- .../src/test/java/Bootstrap.java | 9 ++-- .../impl/grunt/GruntStringTransformer.java | 42 ++++++++----------- 2 files changed, 22 insertions(+), 29 deletions(-) diff --git a/deobfuscator-impl/src/test/java/Bootstrap.java b/deobfuscator-impl/src/test/java/Bootstrap.java index 0984b8f8..0638517e 100644 --- a/deobfuscator-impl/src/test/java/Bootstrap.java +++ b/deobfuscator-impl/src/test/java/Bootstrap.java @@ -2,22 +2,21 @@ import org.objectweb.asm.ClassWriter; import uwu.narumi.deobfuscator.Deobfuscator; import uwu.narumi.deobfuscator.api.context.DeobfuscatorOptions; -import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; +import uwu.narumi.deobfuscator.core.other.composed.ComposedGruntTransformer; public class Bootstrap { public static void main(String[] args) { Deobfuscator.from( DeobfuscatorOptions.builder() - .inputJar(Path.of("work", "obf-test.jar")) // Specify your input jar here + .inputJar(Path.of("work", "grunt.jar")) // Specify your input jar here //.libraries(Path.of("work", "libs")) // Specify your libraries here if needed .transformers( - // Pick your transformers here - () -> new ComposedGeneralFlowTransformer() + ComposedGruntTransformer::new ) .continueOnError() .classWriterFlags(ClassWriter.COMPUTE_FRAMES) .build() - ).start(); + ).start(); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index 6d6f2d8e..c361de38 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -2,7 +2,6 @@ import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; -import org.objectweb.asm.tree.FieldInsnNode; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; @@ -113,7 +112,7 @@ private void deobfClass(@NotNull ClassWrapper c) { pool[i] = str; } this.classNameToStringPool.put(c.name(), pool); - Match lol = SequenceMatch.of( + var lol = SequenceMatch.of( NumberMatch.numInteger(), OpcodeMatch.of(ANEWARRAY), FieldMatch.putStatic().fieldRef(stringPoolRef), @@ -123,30 +122,25 @@ private void deobfClass(@NotNull ClassWrapper c) { .removeAll(); } } - FieldRef spr = stringPoolRef; + var spr = stringPoolRef; + var stringPoolUse = SequenceMatch.of( + FieldMatch.getStatic().fieldRef(spr), + NumberMatch.numInteger().capture("index"), + OpcodeMatch.of(AALOAD) + ); + final var pool = this.classNameToStringPool.get(c.name()); c.methods().forEach(method -> { - if (method.instructions.size() <= 0) { -// LOGGER.info("awesome library"); - return; - } - for (final var insn : method.instructions) { - if (spr != null - && insn instanceof FieldInsnNode fin) { - var idxInsn = fin.next(1); - var aaload = fin.next(2); - var idx = idxInsn.asInteger(); - var dec = this.classNameToStringPool.get(c.name())[idx]; - if (aaload.getOpcode() != AALOAD) { -// LOGGER.info("not an aaload for {} -> {}", idx, dec); - return; - } -// LOGGER.info("{} -> {}", idx, dec); - init.instructions.insertBefore(insn, new LdcInsnNode(dec)); - init.instructions.remove(insn); - init.instructions.remove(idxInsn); - init.instructions.remove(aaload); - markChange(); + var ms = stringPoolUse.findAllMatches(MethodContext.of(c, method)); + for (final var m : ms) { + final var i = m.captures().get("index").insn().asInteger(); + final var dec = pool[i]; + if (dec == null) { + LOGGER.warn("Couldn't find a string in the string pool for encrypted string at {}", i); + continue; } + method.instructions.insertBefore(m.insn(), new LdcInsnNode(dec)); + m.removeAll(); + markChange(); } }); if (init.instructions.size() <= 0) { From 450028b1390edcc3d44a8b2926c4318c7cea631a Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:12:26 -0600 Subject: [PATCH 06/15] fix(GruntStringTransformer): ok IntelliJ... --- .../core/other/impl/grunt/GruntStringTransformer.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index c361de38..cf4bfe5b 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -118,8 +118,9 @@ private void deobfClass(@NotNull ClassWrapper c) { FieldMatch.putStatic().fieldRef(stringPoolRef), MethodMatch.invokeStatic().owner(min.owner).name(min.name).desc(min.desc) ); - lol.findFirstMatch(MethodContext.of(c, init)) - .removeAll(); + final var ffm = lol.findFirstMatch(MethodContext.of(c, init)); + if (ffm != null) + ffm.removeAll(); } } var spr = stringPoolRef; From d402ca7065e3bdd5ac8dfa6eec01049d102ada7f Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:21:17 -0600 Subject: [PATCH 07/15] refactor(GruntStringTransformer): remove the string pool variable and string pool init method --- .../core/other/impl/grunt/GruntStringTransformer.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index cf4bfe5b..9abbc324 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -8,6 +8,7 @@ import uwu.narumi.deobfuscator.api.asm.FieldRef; import uwu.narumi.deobfuscator.api.asm.MethodContext; import uwu.narumi.deobfuscator.api.asm.matcher.Match; +import uwu.narumi.deobfuscator.api.asm.matcher.MatchContext; import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; import uwu.narumi.deobfuscator.api.transformer.Transformer; @@ -110,6 +111,7 @@ private void deobfClass(@NotNull ClassWrapper c) { if (classKey == null) return; var str = decrypt(classKey, enc.toCharArray(), seed, key); pool[i] = str; + // TODO: remove decrypt method } this.classNameToStringPool.put(c.name(), pool); var lol = SequenceMatch.of( @@ -121,6 +123,8 @@ private void deobfClass(@NotNull ClassWrapper c) { final var ffm = lol.findFirstMatch(MethodContext.of(c, init)); if (ffm != null) ffm.removeAll(); + ms.forEach(MatchContext::removeAll); + c.methods().remove(r); } } var spr = stringPoolRef; @@ -144,6 +148,8 @@ private void deobfClass(@NotNull ClassWrapper c) { markChange(); } }); + // owner check is useless I think + c.fields().removeIf(f -> f.name.equals(spr.name()) && f.desc.equals(spr.desc())); if (init.instructions.size() <= 0) { c.methods().remove(init); } From 5379a0ca21884d6b22d5b8fbe472d256ba166b81 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:24:23 -0600 Subject: [PATCH 08/15] fix: you saw nothing... I didn't commit my bootstrap changes AGAIN --- deobfuscator-impl/src/test/java/Bootstrap.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/deobfuscator-impl/src/test/java/Bootstrap.java b/deobfuscator-impl/src/test/java/Bootstrap.java index 0638517e..0984b8f8 100644 --- a/deobfuscator-impl/src/test/java/Bootstrap.java +++ b/deobfuscator-impl/src/test/java/Bootstrap.java @@ -2,21 +2,22 @@ import org.objectweb.asm.ClassWriter; import uwu.narumi.deobfuscator.Deobfuscator; import uwu.narumi.deobfuscator.api.context.DeobfuscatorOptions; -import uwu.narumi.deobfuscator.core.other.composed.ComposedGruntTransformer; +import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; public class Bootstrap { public static void main(String[] args) { Deobfuscator.from( DeobfuscatorOptions.builder() - .inputJar(Path.of("work", "grunt.jar")) // Specify your input jar here + .inputJar(Path.of("work", "obf-test.jar")) // Specify your input jar here //.libraries(Path.of("work", "libs")) // Specify your libraries here if needed .transformers( - ComposedGruntTransformer::new + // Pick your transformers here + () -> new ComposedGeneralFlowTransformer() ) .continueOnError() .classWriterFlags(ClassWriter.COMPUTE_FRAMES) .build() - ).start(); + ).start(); } } From 1426c664c36b3c2406d01cba17dc0181f953d803 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:38:27 -0600 Subject: [PATCH 09/15] refactor(GruntStringTransformer): now it removes the decrypt method --- .../impl/grunt/GruntStringTransformer.java | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index 9abbc324..f074cb62 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -4,9 +4,11 @@ import org.jetbrains.annotations.NotNull; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; +import org.objectweb.asm.tree.MethodNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; import uwu.narumi.deobfuscator.api.asm.FieldRef; import uwu.narumi.deobfuscator.api.asm.MethodContext; +import uwu.narumi.deobfuscator.api.asm.MethodRef; import uwu.narumi.deobfuscator.api.asm.matcher.Match; import uwu.narumi.deobfuscator.api.asm.matcher.MatchContext; import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; @@ -15,6 +17,7 @@ import java.util.HashMap; import java.util.Map; +import java.util.Optional; // TODO: string array support public class GruntStringTransformer extends Transformer { @@ -78,6 +81,19 @@ private static Integer getClassKey(MethodContext ctx) { return m.captures().get("key").insn().asInteger(); } + // removes everything matched AND the decrypt metho + private void removeAll(MatchContext ctx) { + ctx.removeAll(); + final var m = ctx.captures().get("decryptMethod").insn().asMethodInsn(); + context().removeMethod(MethodRef.of(m)); + } + + private Optional resolve(MethodInsnNode m) { + ClassWrapper classWrapper = context().getClassesMap().get(m.owner); + return classWrapper.findMethod(m); + } + + private void deobfClass(@NotNull ClassWrapper c) { final var initOpt = c.findClInit(); if (initOpt.isEmpty()) return; @@ -85,7 +101,7 @@ private void deobfClass(@NotNull ClassWrapper c) { FieldRef stringPoolRef = null; for (final var insn : init.instructions) { if (insn instanceof MethodInsnNode min) { - final var resolved = c.findMethod(min); + final var resolved = resolve(min); if (resolved.isEmpty()) return; var r = resolved.get(); var ms = stringPoolAdditionMatch.findAllMatches(MethodContext.of(c, r)); @@ -111,7 +127,6 @@ private void deobfClass(@NotNull ClassWrapper c) { if (classKey == null) return; var str = decrypt(classKey, enc.toCharArray(), seed, key); pool[i] = str; - // TODO: remove decrypt method } this.classNameToStringPool.put(c.name(), pool); var lol = SequenceMatch.of( @@ -123,7 +138,7 @@ private void deobfClass(@NotNull ClassWrapper c) { final var ffm = lol.findFirstMatch(MethodContext.of(c, init)); if (ffm != null) ffm.removeAll(); - ms.forEach(MatchContext::removeAll); + ms.forEach(this::removeAll); c.methods().remove(r); } } From fd9353037694f8455074a7954e5e2a5dce111c64 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sat, 22 Nov 2025 10:56:04 -0600 Subject: [PATCH 10/15] refactor(GruntStringTransformer, ComposedGruntTransformer): note that these were only tested / work for 2.x --- .../core/other/composed/ComposedGruntTransformer.java | 5 +++-- .../core/other/impl/grunt/GruntStringTransformer.java | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java index 72603d5e..377d8ca5 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java @@ -8,9 +8,9 @@ import uwu.narumi.deobfuscator.core.other.impl.universal.InlinePureFunctionsTransformer; /** - * https://github.com/SpartanB312/Grunt + * https://github.com/SpartanB312/Grunt + * This was tested for Grunt 2.x (Gruntpocalypse), it may not work on newer versions. */ -// TODO: String encryption public class ComposedGruntTransformer extends ComposedTransformer { public ComposedGruntTransformer() { super( @@ -23,6 +23,7 @@ public ComposedGruntTransformer() { // Inline pure functions InlinePureFunctionsTransformer::new ), + // Decrypt strings GruntStringTransformer::new ); } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index f074cb62..4b642861 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -20,6 +20,10 @@ import java.util.Optional; // TODO: string array support + +/** + * A string transformer for Gruntpocalypse (2.x / the main branch in their repo) + */ public class GruntStringTransformer extends Transformer { /** From 1e63be8a4befd5cdaeaea59c1382813782b11c9f Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Sun, 23 Nov 2025 22:16:15 -0600 Subject: [PATCH 11/15] docs(GruntStringTransformer): fix typo --- .../core/other/impl/grunt/GruntStringTransformer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index 4b642861..f2a26adf 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -85,7 +85,7 @@ private static Integer getClassKey(MethodContext ctx) { return m.captures().get("key").insn().asInteger(); } - // removes everything matched AND the decrypt metho + // removes everything matched AND the decrypt method private void removeAll(MatchContext ctx) { ctx.removeAll(); final var m = ctx.captures().get("decryptMethod").insn().asMethodInsn(); From a47cb29dd0d2105b228fc36bf2c646525ca9a476 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Tue, 25 Nov 2025 21:37:42 -0600 Subject: [PATCH 12/15] chore: I'm lazy and haven't really done anything over the past few days for this lol so I'm just going to leave it here until I return lol --- .../deobfuscator/api/context/Context.java | 18 ++ .../src/test/java/Bootstrap.java | 9 +- .../composed/ComposedGruntTransformer.java | 5 +- .../grunt/GruntConstantPoolTransformer.java | 190 ++++++++++++++++++ .../impl/grunt/GruntStringTransformer.java | 10 +- 5 files changed, 218 insertions(+), 14 deletions(-) create mode 100644 deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java index 1c0d611c..ad23db74 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java @@ -9,6 +9,8 @@ import org.jetbrains.annotations.UnmodifiableView; import org.objectweb.asm.ClassReader; import org.objectweb.asm.tree.ClassNode; +import org.objectweb.asm.tree.FieldNode; +import org.objectweb.asm.tree.MethodInsnNode; import org.objectweb.asm.tree.MethodNode; import software.coley.cafedude.InvalidClassException; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; @@ -83,6 +85,22 @@ public Collection classes() { return classesMap.values(); } + + public Optional resolveMethod(MethodInsnNode m) { + ClassWrapper classWrapper = this.getClassesMap().get(m.owner); + return classWrapper.findMethod(m); + } + + public Optional resolveMethod(MethodRef m) { + ClassWrapper classWrapper = this.getClassesMap().get(m.owner()); + return classWrapper.findMethod(m); + } + + public Optional resolveField(FieldRef m) { + ClassWrapper classWrapper = this.getClassesMap().get(m.owner()); + return classWrapper.findField(m.name(), m.desc()); + } + public void removeMethod(MethodRef methodRef) { ClassWrapper classWrapper = this.getClassesMap().get(methodRef.owner()); classWrapper.methods().removeIf(methodNode -> methodNode.name.equals(methodRef.name()) && methodNode.desc.equals(methodRef.desc())); diff --git a/deobfuscator-impl/src/test/java/Bootstrap.java b/deobfuscator-impl/src/test/java/Bootstrap.java index 0984b8f8..c6a30e8c 100644 --- a/deobfuscator-impl/src/test/java/Bootstrap.java +++ b/deobfuscator-impl/src/test/java/Bootstrap.java @@ -2,22 +2,21 @@ import org.objectweb.asm.ClassWriter; import uwu.narumi.deobfuscator.Deobfuscator; import uwu.narumi.deobfuscator.api.context.DeobfuscatorOptions; -import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; +import uwu.narumi.deobfuscator.core.other.composed.ComposedGruntTransformer; public class Bootstrap { public static void main(String[] args) { Deobfuscator.from( DeobfuscatorOptions.builder() - .inputJar(Path.of("work", "obf-test.jar")) // Specify your input jar here + .inputJar(Path.of("work", "grunt-more.jar")) // Specify your input jar here //.libraries(Path.of("work", "libs")) // Specify your libraries here if needed .transformers( - // Pick your transformers here - () -> new ComposedGeneralFlowTransformer() + ComposedGruntTransformer::new ) .continueOnError() .classWriterFlags(ClassWriter.COMPUTE_FRAMES) .build() - ).start(); + ).start(); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java index 377d8ca5..71d7e9f9 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java @@ -2,6 +2,7 @@ import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer; import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; +import uwu.narumi.deobfuscator.core.other.impl.grunt.GruntConstantPoolTransformer; import uwu.narumi.deobfuscator.core.other.impl.grunt.GruntStringTransformer; import uwu.narumi.deobfuscator.core.other.impl.pool.InlineStaticFieldTransformer; import uwu.narumi.deobfuscator.core.other.impl.universal.AccessRepairTransformer; @@ -24,7 +25,9 @@ public ComposedGruntTransformer() { InlinePureFunctionsTransformer::new ), // Decrypt strings - GruntStringTransformer::new + GruntStringTransformer::new, + // Decrypt constant pool + GruntConstantPoolTransformer::new ); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java new file mode 100644 index 00000000..a57e94e1 --- /dev/null +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java @@ -0,0 +1,190 @@ +package uwu.narumi.deobfuscator.core.other.impl.grunt; + +import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.tree.MethodInsnNode; +import uwu.narumi.deobfuscator.api.asm.ClassWrapper; +import uwu.narumi.deobfuscator.api.asm.FieldRef; +import uwu.narumi.deobfuscator.api.asm.MethodContext; +import uwu.narumi.deobfuscator.api.asm.matcher.Match; +import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; +import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; +import uwu.narumi.deobfuscator.api.transformer.Transformer; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +// TODO: implement more than just string decryption + +public class GruntConstantPoolTransformer extends Transformer { + + /* + getstatic Main.trFSDGUqx5BioGDr [Ljava/lang/String; + iconst_0 + getstatic Main$ConstantPool.const_z9Fqaiy9srSMb26 Ljava/lang/String; + invokevirtual java/lang/String.toCharArray ()[C + ldc 68656L + ldc -1107645088 + invokestatic Main.EOvwGuirQI7GaLbN ([CJI)Ljava/lang/String; + aastore + */ + private static final Match constantPoolCacheAdditionMatch = SequenceMatch.of( + FieldMatch.getStatic().desc("[Ljava/lang/String;").capture("pool"), + NumberMatch.numInteger().capture("index"), + FieldMatch.getStatic().capture("constantVar"), + MethodMatch.invokeVirtual().owner("java/lang/String").name("toCharArray").desc("()[C"), + NumberMatch.numLong().capture("k1"), + NumberMatch.numInteger().capture("k2"), + MethodMatch.invokeStatic().desc("([CJI)Ljava/lang/String;").capture("decryptMethod"), + OpcodeMatch.of(AASTORE) + ); + + /* + ldc "䡯쫦釛봂谬푀㼑왅욨移嚣牤叞᜾犸뎹議㌉젦" + invokestatic Main$ConstantPool.oWK5cSQDnT (Ljava/lang/String;)Ljava/lang/String; + putstatic Main$ConstantPool.const_z9Fqaiy9srSMb26 Ljava/lang/String; + */ + private static final Match lol = SequenceMatch.of( + StringMatch.of().capture("enc"), + MethodMatch.invokeStatic().desc("(Ljava/lang/String;)Ljava/lang/String;").capture("decryptMethod"), + FieldMatch.putStatic().desc("Ljava/lang/String;").capture("field") + ); + + private static final Match initDecMatch = SequenceMatch.of( + NumberMatch.numInteger().capture("k"), + VarLoadMatch.of(), + OpcodeMatch.of(IXOR), + OpcodeMatch.of(ISTORE), + NumberMatch.of(0), + OpcodeMatch.of(ISTORE) + ); + + /* + + A: + new java/lang/StringBuilder + dup + invokespecial java/lang/StringBuilder. ()V + astore v1 + iconst_0 + istore i2 + goto C + B: + aload v1 + aload v0 + iload i2 + invokevirtual java/lang/String.charAt (I)C + sipush 1668 + ixor + i2c + invokevirtual java/lang/StringBuilder.append (C)Ljava/lang/StringBuilder; + pop + iinc i2 1 + */ + private static final Match finalDecMatch = SequenceMatch.of( + OpcodeMatch.of(NEW), + OpcodeMatch.of(DUP), + MethodMatch.invokeSpecial().owner("java/lang/StringBuilder").name("").desc("()V"), + OpcodeMatch.of(ASTORE), + NumberMatch.of(0), + OpcodeMatch.of(ISTORE), + JumpMatch.of(), + VarLoadMatch.of(), + VarLoadMatch.of(), + VarLoadMatch.of(), + MethodMatch.invokeVirtual().owner("java/lang/String").name("charAt").desc("(I)C"), + NumberMatch.numInteger().capture("key"), + OpcodeMatch.of(IXOR), + OpcodeMatch.of(I2C), + MethodMatch.invokeVirtual().owner("java/lang/StringBuilder").name("append").desc("(C)Ljava/lang/StringBuilder;"), + OpcodeMatch.of(POP), + OpcodeMatch.of(IINC) + ); + + private static @NotNull String strDecInit(char[] e, int classKey, long k1, long k2) { + int n2 = Math.toIntExact(classKey ^ k2); + for (int i = 0; i < e.length; ++i) { + n2 = n2 ^ (int)k1 ^ ~i; + n2 = Math.toIntExact(-(n2 ^ k2 - (long) i * e.length) * k2 | i); + e[i] = (char)(e[i] ^ n2); + int n3 = i & 0xFF; + k2 = k2 << n3 | k2 >>> -n3; + k1 ^= n3; + } + return new String(e); + } + + private static @NotNull String stringDecryptFinal(@NotNull String e, int key) { + StringBuilder b = new StringBuilder(); + int n = 0; + while (n < e.length()) { + b.append((char)(e.charAt(n) ^ key)); + ++n; + } + return b.toString(); + } + + private static @NotNull Map getConstantPoolFromConstantPoolClass(ClassWrapper constantPool) { + final var a = constantPool.findClInit(); + if (a.isEmpty()) return Collections.emptyMap(); + final var clInit = a.get(); + final var map = new HashMap(); + for (final var insn : clInit.instructions) { + if (!(insn instanceof MethodInsnNode min)) continue; + // TODO: lazy lol + } + return map; + } + + @Override + protected void transform() throws Exception { + scopedClasses().forEach(c -> { + final var cliOpt = c.findClInit(); + if (cliOpt.isEmpty()) return; + final var clInit = cliOpt.get(); + for (final var insn : clInit.instructions) { + if (!(insn instanceof MethodInsnNode min)) continue; + final var methodOpt = context().resolveMethod(min); + if (methodOpt.isEmpty()) return; + final var method = methodOpt.get(); + var ms = constantPoolCacheAdditionMatch.findAllMatches(MethodContext.of(c, method)); + if (ms.isEmpty()) { + LOGGER.warn("couldn't find any encrypted constants in {}#{}{}", min.owner, min.name, min.desc); + continue; + } + for (final var m : ms) { + final var caps = m.captures(); + final var cv = caps.get("constantVar").insn().asFieldInsn(); + final var idx = caps.get("index").insn().asInteger(); + final var k1 = caps.get("k1").insn().asLong(); + final var k2 = caps.get("k2").insn().asInteger(); + final var dmI = caps.get("decryptMethod").insn().asMethodInsn(); + + final var f = context().resolveField(FieldRef.of(cv)).orElseThrow(); + final var decMethodCls = context().getClassesMap().get(dmI.owner); + final var decMethod = decMethodCls.findMethod(dmI).orElseThrow(); + final var decMethodMatch = initDecMatch.findFirstMatch(MethodContext.of(decMethodCls, decMethod)); + if (decMethodMatch == null) { + LOGGER.warn("Failed to find the initial decryption method on {}#{}{}.", dmI.owner, dmI.name, dmI.desc); + continue; + } + + final var constantPoolClass = context().getClassesMap().get(cv.owner); + final var cli = constantPoolClass.findClInit(); + if (cli.isEmpty()) { + LOGGER.warn("Found encrypted constant pool class without a ."); + continue; + } + final var cl = cli.get(); + + final var a = lol.findAllMatches(MethodContext.of(constantPoolClass, cl)); + + final var classKey = decMethodMatch.captures().get("k").insn().asInteger(); + + final var sdi = strDecInit(((String)f.value).toCharArray(), classKey, k1, k2); + LOGGER.info("Initial decryption: {}", sdi); + } + } + }); + } +} diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java index f2a26adf..dcf4337c 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntStringTransformer.java @@ -4,7 +4,6 @@ import org.jetbrains.annotations.NotNull; import org.objectweb.asm.tree.LdcInsnNode; import org.objectweb.asm.tree.MethodInsnNode; -import org.objectweb.asm.tree.MethodNode; import uwu.narumi.deobfuscator.api.asm.ClassWrapper; import uwu.narumi.deobfuscator.api.asm.FieldRef; import uwu.narumi.deobfuscator.api.asm.MethodContext; @@ -17,7 +16,6 @@ import java.util.HashMap; import java.util.Map; -import java.util.Optional; // TODO: string array support @@ -92,11 +90,6 @@ private void removeAll(MatchContext ctx) { context().removeMethod(MethodRef.of(m)); } - private Optional resolve(MethodInsnNode m) { - ClassWrapper classWrapper = context().getClassesMap().get(m.owner); - return classWrapper.findMethod(m); - } - private void deobfClass(@NotNull ClassWrapper c) { final var initOpt = c.findClInit(); @@ -105,7 +98,7 @@ private void deobfClass(@NotNull ClassWrapper c) { FieldRef stringPoolRef = null; for (final var insn : init.instructions) { if (insn instanceof MethodInsnNode min) { - final var resolved = resolve(min); + final var resolved = context().resolveMethod(min); if (resolved.isEmpty()) return; var r = resolved.get(); var ms = stringPoolAdditionMatch.findAllMatches(MethodContext.of(c, r)); @@ -144,6 +137,7 @@ private void deobfClass(@NotNull ClassWrapper c) { ffm.removeAll(); ms.forEach(this::removeAll); c.methods().remove(r); + break; } } var spr = stringPoolRef; From e09a2780cc90a7fe9a5acdac4230cce52449df36 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Wed, 26 Nov 2025 07:48:26 -0600 Subject: [PATCH 13/15] fix: I commited my bootstrap changes AGAIN, reverted. --- deobfuscator-impl/src/test/java/Bootstrap.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/deobfuscator-impl/src/test/java/Bootstrap.java b/deobfuscator-impl/src/test/java/Bootstrap.java index c6a30e8c..0984b8f8 100644 --- a/deobfuscator-impl/src/test/java/Bootstrap.java +++ b/deobfuscator-impl/src/test/java/Bootstrap.java @@ -2,21 +2,22 @@ import org.objectweb.asm.ClassWriter; import uwu.narumi.deobfuscator.Deobfuscator; import uwu.narumi.deobfuscator.api.context.DeobfuscatorOptions; -import uwu.narumi.deobfuscator.core.other.composed.ComposedGruntTransformer; +import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; public class Bootstrap { public static void main(String[] args) { Deobfuscator.from( DeobfuscatorOptions.builder() - .inputJar(Path.of("work", "grunt-more.jar")) // Specify your input jar here + .inputJar(Path.of("work", "obf-test.jar")) // Specify your input jar here //.libraries(Path.of("work", "libs")) // Specify your libraries here if needed .transformers( - ComposedGruntTransformer::new + // Pick your transformers here + () -> new ComposedGeneralFlowTransformer() ) .continueOnError() .classWriterFlags(ClassWriter.COMPUTE_FRAMES) .build() - ).start(); + ).start(); } } From 2464a784151086c47b69811945a02dab7b339ed6 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Wed, 26 Nov 2025 09:08:11 -0600 Subject: [PATCH 14/15] chore: I'm bored aaaa --- .../deobfuscator/api/context/Context.java | 9 ++ .../grunt/GruntConstantPoolTransformer.java | 114 ++++++++++-------- 2 files changed, 75 insertions(+), 48 deletions(-) diff --git a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java index ad23db74..54951ec0 100644 --- a/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java +++ b/deobfuscator-api/src/main/java/uwu/narumi/deobfuscator/api/context/Context.java @@ -95,6 +95,15 @@ public Optional resolveMethod(MethodRef m) { ClassWrapper classWrapper = this.getClassesMap().get(m.owner()); return classWrapper.findMethod(m); } + public Optional resolveMethodCtx(MethodInsnNode m) { + ClassWrapper cw = this.getClassesMap().get(m.owner); + return cw.findMethod(m).map(a -> MethodContext.of(cw, a)); + } + + public Optional resolveMethodCtx(MethodRef m) { + ClassWrapper classWrapper = this.getClassesMap().get(m.owner()); + return classWrapper.findMethod(m).map(a -> MethodContext.of(classWrapper, a)); + } public Optional resolveField(FieldRef m) { ClassWrapper classWrapper = this.getClassesMap().get(m.owner()); diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java index a57e94e1..b382b7b6 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntConstantPoolTransformer.java @@ -15,6 +15,7 @@ import java.util.Map; // TODO: implement more than just string decryption +// FIXME: integer overflow thing lol public class GruntConstantPoolTransformer extends Transformer { @@ -44,7 +45,7 @@ public class GruntConstantPoolTransformer extends Transformer { invokestatic Main$ConstantPool.oWK5cSQDnT (Ljava/lang/String;)Ljava/lang/String; putstatic Main$ConstantPool.const_z9Fqaiy9srSMb26 Ljava/lang/String; */ - private static final Match lol = SequenceMatch.of( + private static final Match strConstantInitializer = SequenceMatch.of( StringMatch.of().capture("enc"), MethodMatch.invokeStatic().desc("(Ljava/lang/String;)Ljava/lang/String;").capture("decryptMethod"), FieldMatch.putStatic().desc("Ljava/lang/String;").capture("field") @@ -102,7 +103,7 @@ public class GruntConstantPoolTransformer extends Transformer { ); private static @NotNull String strDecInit(char[] e, int classKey, long k1, long k2) { - int n2 = Math.toIntExact(classKey ^ k2); + int n2 = classKey ^ (int)k2; for (int i = 0; i < e.length; ++i) { n2 = n2 ^ (int)k1 ^ ~i; n2 = Math.toIntExact(-(n2 ^ k2 - (long) i * e.length) * k2 | i); @@ -124,67 +125,84 @@ public class GruntConstantPoolTransformer extends Transformer { return b.toString(); } - private static @NotNull Map getConstantPoolFromConstantPoolClass(ClassWrapper constantPool) { + private @NotNull Map getConstantPoolFromConstantPoolClass(ClassWrapper constantPool) { final var a = constantPool.findClInit(); if (a.isEmpty()) return Collections.emptyMap(); final var clInit = a.get(); final var map = new HashMap(); - for (final var insn : clInit.instructions) { - if (!(insn instanceof MethodInsnNode min)) continue; - // TODO: lazy lol + final var matches = strConstantInitializer.findAllMatches(MethodContext.of(constantPool, clInit)); + for (final var m : matches) { + final var c = m.captures(); + final var enc = c.get("enc").insn().asString(); + final var decryptMethod = c.get("decryptMethod").insn().asMethodInsn(); + final var field = c.get("field").insn().asFieldInsn(); + final var ctxO = context().resolveMethodCtx(decryptMethod); + if (ctxO.isEmpty()) { + LOGGER.warn("Couldn't find decrypt method when iterating through constants"); + continue; + } + final var ctx = ctxO.orElseThrow(); + final var ffm = finalDecMatch.findFirstMatch(ctx); + if (ffm == null) { + LOGGER.error("Couldn't match the final decrypt method when iterating through constants"); + continue; + } + final var k = ffm.captures().get("key").insn().asInteger(); + final var dec = stringDecryptFinal(enc, k); + LOGGER.info("Decrypt {} -> {}", enc, dec); + map.put(field.name, dec); } return map; } @Override protected void transform() throws Exception { - scopedClasses().forEach(c -> { - final var cliOpt = c.findClInit(); - if (cliOpt.isEmpty()) return; - final var clInit = cliOpt.get(); - for (final var insn : clInit.instructions) { - if (!(insn instanceof MethodInsnNode min)) continue; - final var methodOpt = context().resolveMethod(min); - if (methodOpt.isEmpty()) return; - final var method = methodOpt.get(); - var ms = constantPoolCacheAdditionMatch.findAllMatches(MethodContext.of(c, method)); - if (ms.isEmpty()) { - LOGGER.warn("couldn't find any encrypted constants in {}#{}{}", min.owner, min.name, min.desc); + scopedClasses().forEach(this::decryptClass); + } + + private void decryptClass(ClassWrapper c) { + final var cliOpt = c.findClInit(); + if (cliOpt.isEmpty()) return; + final var clInit = cliOpt.get(); + for (final var insn : clInit.instructions) { + if (!(insn instanceof MethodInsnNode min)) continue; + final var methodOpt = context().resolveMethod(min); + if (methodOpt.isEmpty()) return; + final var method = methodOpt.get(); + var ms = constantPoolCacheAdditionMatch.findAllMatches(MethodContext.of(c, method)); + if (ms.isEmpty()) { + LOGGER.warn("couldn't find any encrypted constants in {}#{}{}", min.owner, min.name, min.desc); + continue; + } + Map classPool = null; + for (final var m : ms) { + final var caps = m.captures(); + final var cv = caps.get("constantVar").insn().asFieldInsn(); + final var idx = caps.get("index").insn().asInteger(); + final var k1 = caps.get("k1").insn().asLong(); + final var k2 = caps.get("k2").insn().asInteger(); + final var dmI = caps.get("decryptMethod").insn().asMethodInsn(); + + final var f = context().resolveField(FieldRef.of(cv)).orElseThrow(); + final var decMethodCls = context().getClassesMap().get(dmI.owner); + final var decMethod = decMethodCls.findMethod(dmI).orElseThrow(); + final var decMethodMatch = initDecMatch.findFirstMatch(MethodContext.of(decMethodCls, decMethod)); + + if (decMethodMatch == null) { + LOGGER.warn("Failed to find the initial decryption method on {}#{}{}.", dmI.owner, dmI.name, dmI.desc); continue; } - for (final var m : ms) { - final var caps = m.captures(); - final var cv = caps.get("constantVar").insn().asFieldInsn(); - final var idx = caps.get("index").insn().asInteger(); - final var k1 = caps.get("k1").insn().asLong(); - final var k2 = caps.get("k2").insn().asInteger(); - final var dmI = caps.get("decryptMethod").insn().asMethodInsn(); - - final var f = context().resolveField(FieldRef.of(cv)).orElseThrow(); - final var decMethodCls = context().getClassesMap().get(dmI.owner); - final var decMethod = decMethodCls.findMethod(dmI).orElseThrow(); - final var decMethodMatch = initDecMatch.findFirstMatch(MethodContext.of(decMethodCls, decMethod)); - if (decMethodMatch == null) { - LOGGER.warn("Failed to find the initial decryption method on {}#{}{}.", dmI.owner, dmI.name, dmI.desc); - continue; - } - - final var constantPoolClass = context().getClassesMap().get(cv.owner); - final var cli = constantPoolClass.findClInit(); - if (cli.isEmpty()) { - LOGGER.warn("Found encrypted constant pool class without a ."); - continue; - } - final var cl = cli.get(); - - final var a = lol.findAllMatches(MethodContext.of(constantPoolClass, cl)); - final var classKey = decMethodMatch.captures().get("k").insn().asInteger(); + final var classKey = decMethodMatch.captures().get("k").insn().asInteger(); - final var sdi = strDecInit(((String)f.value).toCharArray(), classKey, k1, k2); - LOGGER.info("Initial decryption: {}", sdi); + if (classPool == null) { + final var constantPoolClass = context().getClassesMap().get(cv.owner); + classPool = getConstantPoolFromConstantPoolClass(constantPoolClass); } + + final var sdi = strDecInit(classPool.get(cv.name).toCharArray(), classKey, k1, k2); + LOGGER.info("Initial decryption: {}", sdi); } - }); + } } } From 37a4489774381a085031a2b320a2f39b4606eff3 Mon Sep 17 00:00:00 2001 From: DataM0del <183248792+DataM0del@users.noreply.github.com> Date: Wed, 26 Nov 2025 12:56:52 -0600 Subject: [PATCH 15/15] feat: invoke dynamic transformer that doesn't replace properly or something LOL --- .../composed/ComposedGruntTransformer.java | 7 +- .../grunt/GruntInvokeDynamicTransformer.java | 163 ++++++++++++++++++ .../main/java/grunt/InvokeDynamicSample.java | 50 ++++++ 3 files changed, 218 insertions(+), 2 deletions(-) create mode 100644 deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntInvokeDynamicTransformer.java create mode 100644 reverse-engineering/src/main/java/grunt/InvokeDynamicSample.java diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java index 71d7e9f9..17d03b96 100644 --- a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/composed/ComposedGruntTransformer.java @@ -3,6 +3,7 @@ import uwu.narumi.deobfuscator.api.transformer.ComposedTransformer; import uwu.narumi.deobfuscator.core.other.composed.general.ComposedGeneralFlowTransformer; import uwu.narumi.deobfuscator.core.other.impl.grunt.GruntConstantPoolTransformer; +import uwu.narumi.deobfuscator.core.other.impl.grunt.GruntInvokeDynamicTransformer; import uwu.narumi.deobfuscator.core.other.impl.grunt.GruntStringTransformer; import uwu.narumi.deobfuscator.core.other.impl.pool.InlineStaticFieldTransformer; import uwu.narumi.deobfuscator.core.other.impl.universal.AccessRepairTransformer; @@ -24,10 +25,12 @@ public ComposedGruntTransformer() { // Inline pure functions InlinePureFunctionsTransformer::new ), + // Fix invoke dynamics (BEFORE decrypting strings) + GruntInvokeDynamicTransformer::new, // Decrypt strings - GruntStringTransformer::new, + GruntStringTransformer::new // Decrypt constant pool - GruntConstantPoolTransformer::new +// GruntConstantPoolTransformer::new ); } } diff --git a/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntInvokeDynamicTransformer.java b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntInvokeDynamicTransformer.java new file mode 100644 index 00000000..a3bd2fc0 --- /dev/null +++ b/deobfuscator-transformers/src/main/java/uwu/narumi/deobfuscator/core/other/impl/grunt/GruntInvokeDynamicTransformer.java @@ -0,0 +1,163 @@ +package uwu.narumi.deobfuscator.core.other.impl.grunt; + +import org.jetbrains.annotations.NotNull; +import org.objectweb.asm.tree.MethodInsnNode; +import uwu.narumi.deobfuscator.api.asm.ClassWrapper; +import uwu.narumi.deobfuscator.api.asm.MethodContext; +import uwu.narumi.deobfuscator.api.asm.MethodRef; +import uwu.narumi.deobfuscator.api.asm.matcher.Match; +import uwu.narumi.deobfuscator.api.asm.matcher.group.SequenceMatch; +import uwu.narumi.deobfuscator.api.asm.matcher.impl.*; +import uwu.narumi.deobfuscator.api.transformer.Transformer; + +// TODO: heavy protection support idk +public class GruntInvokeDynamicTransformer extends Transformer { + + // same decryption used in the constant pool encryption thing :wilted_rose: + + private static final Match decryptionMethodMatch = SequenceMatch.of( + OpcodeMatch.of(NEW), + OpcodeMatch.of(DUP), + MethodMatch.invokeSpecial().owner("java/lang/StringBuilder").name("").desc("()V"), + OpcodeMatch.of(ASTORE), + NumberMatch.of(0), + OpcodeMatch.of(ISTORE), + JumpMatch.of(), + VarLoadMatch.of(), + VarLoadMatch.of(), + VarLoadMatch.of(), + MethodMatch.invokeVirtual().owner("java/lang/String").name("charAt").desc("(I)C"), + NumberMatch.numInteger().capture("key"), + OpcodeMatch.of(IXOR), + OpcodeMatch.of(I2C), + MethodMatch.invokeVirtual().owner("java/lang/StringBuilder").name("append").desc("(C)Ljava/lang/StringBuilder;"), + OpcodeMatch.of(POP), + OpcodeMatch.of(IINC) + ); + /* + aload v3 + checkcast java/lang/String + astore v7 + aload v4 + checkcast java/lang/String + astore v8 + aload v5 + checkcast java/lang/String + astore v9 + aload v6 + checkcast java/lang/Integer + invokevirtual java/lang/Integer.intValue ()I + istore i10 + aload v9 + invokestatic Main.decryptStr (Ljava/lang/String;)Ljava/lang/String; + ldc LMain; + invokevirtual java/lang/Class.getClassLoader ()Ljava/lang/ClassLoader; + invokestatic java/lang/invoke/MethodType.fromMethodDescriptorString (Ljava/lang/String;Ljava/lang/ClassLoader;)Ljava/lang/invoke/MethodType; + astore v11 + */ + private static final Match invokeDynamicHandlerMatch = SequenceMatch.of( + // a bunch of aliases LOL + VarLoadMatch.of(), + OpcodeMatch.of(CHECKCAST), + OpcodeMatch.of(ASTORE), + VarLoadMatch.of(), + OpcodeMatch.of(CHECKCAST), + OpcodeMatch.of(ASTORE), + VarLoadMatch.of(), + OpcodeMatch.of(CHECKCAST), + MethodMatch.invokeVirtual().owner("java/lang/Integer").name("intValue").desc("()I"), // unbox + OpcodeMatch.of(ISTORE), + VarLoadMatch.of(), + MethodMatch.invokeStatic().desc("(Ljava/lang/String;)Ljava/lang/String;").capture("decryptMethod") + ); + private static final Match asd = InvokeDynamicMatch.create() + .bsmTag(H_INVOKESTATIC); + + private static @NotNull String decrypt(@NotNull String e, int key) { + StringBuilder b = new StringBuilder(); + int n = 0; + while (n < e.length()) { + b.append((char)(e.charAt(n) ^ key)); + ++n; + } + return b.toString(); + } + + @Override + protected void transform() throws Exception { + scopedClasses().forEach(this::handleClass); + } + + private void handleClass(ClassWrapper cw) { + cw.methods().forEach(melod -> { + if (isAccess(melod.access, ACC_NATIVE) || isAccess(melod.access, ACC_ABSTRACT)) + return; + final var mt = asd.findAllMatches(MethodContext.of(cw, melod)); + mt.forEach(ctx -> { + final var indy = ctx.insn().asInvokeDynamicInsn(); + final var m = context().resolveMethodCtx(MethodRef.of(indy.bsm)); + if (m.isEmpty()) { + LOGGER.warn("Failed to resolve invoke dynamic bsm handler!"); + return; + } + final var handler = m.orElseThrow(); + final var match = invokeDynamicHandlerMatch.findFirstMatch(handler); + if (match == null) { + LOGGER.warn( + "Failed to match invokedynamic handler in {}.{} {}", + handler.classWrapper().name(), handler.methodNode().name, + handler.methodNode().desc + ); + return; + } +// LOGGER.info("match {}", match); + final var decryptMethod = match.captures().get("decryptMethod").insn().asMethodInsn(); + final var mCtx = context().resolveMethodCtx(decryptMethod); + if (mCtx.isEmpty()) { + LOGGER.warn( + "Failed to resolve decrypt method ({}.{} {})", + decryptMethod.owner, + decryptMethod.name, + decryptMethod.desc + ); + return; + } + final var methodCtx = mCtx.orElseThrow(); + final var ffm = decryptionMethodMatch.findFirstMatch(methodCtx); + if (ffm == null) { + LOGGER.warn( + "Failed to match decrypt method ({}.{} {})", + decryptMethod.owner, + decryptMethod.name, + decryptMethod.desc + ); + return; + } + final var decKey = ffm.captures().get("key").insn().asInteger(); + + // [0] JVM provided + // [1] JVM provided + // [2] JVM provided + //MethodHandles.Lookup lookup, String string, MethodType methodType, String string2, String string3, String string4, Integer n + //String string2, String string3, String string4, Integer n + final var eOwner = (String) indy.bsmArgs[0]; + final var eName = (String) indy.bsmArgs[1]; + final var eDesc = (String) indy.bsmArgs[2]; + // 1 = virtual, otherwise (e.g. 0) static. + final var eType = (int) indy.bsmArgs[3]; + final var owner = decrypt(eOwner, decKey); + final var name = decrypt(eName, decKey); + final var desc = decrypt(eDesc, decKey); + + melod.instructions.insertBefore(indy, new MethodInsnNode( + eType == 1 ? INVOKEVIRTUAL : INVOKESTATIC, + owner, + name, + desc + )); + melod.instructions.remove(indy); + markChange(); + }); + }); + } +} diff --git a/reverse-engineering/src/main/java/grunt/InvokeDynamicSample.java b/reverse-engineering/src/main/java/grunt/InvokeDynamicSample.java new file mode 100644 index 00000000..13f85618 --- /dev/null +++ b/reverse-engineering/src/main/java/grunt/InvokeDynamicSample.java @@ -0,0 +1,50 @@ +package grunt; + +import java.lang.invoke.CallSite; +import java.lang.invoke.ConstantCallSite; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; + +public class InvokeDynamicSample { + public static void main(String[] args) { + invoke(MethodHandles.lookup(), "\u200e\u200d\u205f\u2006\u200c \u2007\u2002\u202f\u2009\u2004\u1680\u2004\u200d\u2008\u200b\u205f\u00a0\u2000\u2005\u2007\u2007\u2006\u200a\u2007\u2003\u2001\u2000\u202f\u200d\u2007\u2006\u2006\u2005\u2008 \u3000\u200f\u2009\u200c\u2003\u2009\u2000\u00a0\u1680\u2003\u200f\u180e\u200e\u2005\u2003\u2009\u2005\u2005\u205f\u2009\u2003\u180e\u200e\u2004\u2005\u2008\u200a\u205f\u180e\ufeff\u200b\u200c\u2006\u200c\u180e\u200a\u200f\u2000\u2002\u3000\u205f\u202f\u200b\u2009\u200f\u200c\u3000 \u2004\u200d\u2003\u200e\u200f\u2002\u180e\u2003\u180e\ufeff\u200b\u2006\u2001\u180e\u1680\u00a0 \u2005\u2009\u180e\u202f\u2002\u2009\u2001\ufeff\ufeff\u00a0\u2009\u2005\u180e\u200e\u202f\u1680 \u200b\u200f\u2003\u2004\ufeff\u2006\u200d\u3000\ufeff\u180e\u2007\u2006\u2003\u2004\u205f\u200d \u2001\u00a0\u180e\u00a0\u2008\u2007\u200f\u200d\u2002\u2002\u2008\u2000\u2009\u2001\u2002\u2007\u200a\u200e\u2004\u3000\u205f\u2005\u2003\u2006\u200e\u2004\u2000\u200c\u3000\u2009\u202f\ufeff\u1680\u200b\u2001\u00a0\u2008\u200b\u2009\u2008\u180e\u2004\u200c\u200e\u202f\u200c\u2001\u2007\u200c\u2009\u200a\u2008\u202f\u00a0\u200d\u205f\u180e\u200f\u2007\u00a0\u2009\u2003 \u2001\u200a\u2008\u205f\u200a\u205f\u205f\u200e\u2000\u2005\u2009\u200a\u2002\u00a0\u2007\u205f\u2005\u1680\u200b\u200d\u2008\u2009\u2000\u202f\u200d\u00a0\u2001\u2002\u205f\u2006\u2005\u2007\u2004\u2001\u2000\u2003\u1680\u2000\u200f\u2008\u180e\u200f\u2008\u202f\u2002\u2003\u2004\u2008\u00a0\u00a0\u2004\u2003\u3000\u3000\u2007\u200a\ufeff\u205f\u200b\u2007\u180e\u2003\u2000\u200e\u3000\u2004\u202f\u2008\u200f\ufeff\u2004\u3000\u200e\u200a\ufeff\u2003\u202f\u3000\u2002\u205f\u205f\u2001\u2006\u200d\ufeff \u2001\u2005\u205f\ufeff\ufeff\u200b\u2004\u200b\u200a\u200f\u202f \u205f\u202f\u2000\u200b\u00a0\u3000\u180e\u3000 \u2008\u2006 \u2006\u2005\u200e\u2001\u1680 \u2002 \u200f\u2002\u2004\u2004\u202f\u200b\u2003\u1680\u2002\u2001\u200c\u2003\u2002\u180e\u205f\u3000\u2006\u200c\u00a0\u2006\u200b \u2002\u3000\u2009\u2009\ufeff \u2006\u2000\u200b\u200e\u2004\u180e\u200a\u3000\u2006\u2009\u2006\u00a0 \u200c\u200c\u2006\u2000\u2001\u2001\u2003 \u200c\u2007 \u200b\u3000\u180e\u2009\u200e\u2007\u3000\u180e\u200c\u2004\u200f\u205f\ufeff\u200e\u200b\u205f\ufeff\u2009\u200c\u202f\u200f\u200f\u2001\u2004\u205f\u00a0\u205f\u200c\u2003\u200a\u1680\u2000\u200a\u1680\u2000\u202f\u00a0\u2000\u2005\u205f\u2003\u2003\u2001\u205f\u200a\u2007\u200f\u202f\u2003\u200c \u2007\u200f\u2007\u3000\u200e\u200e\u200f\u200f\u202f\u200d\u2008\u00a0\u200a\ufeff\u200a\u200c\u2008\u200c \u2004\u200c\u2008\u2004\u2008\u205f\u200a\u200e\u202f\u1680\u2000\u2008\u205f\u00a0\u2006\u2007\u200a\u2006\u2004\u2005\u2002\u3000\u180e\u1680\u200a\u205f\u2001\u2002\u200f\u200c\u202f\u2008\u2009 \u2007\u2000\u2005\u2004\u2007\u00a0\u2008\u2002\ufeff\u202f\u200d\u200b\u200e\u2001\u2003\u180e\u2002\u2002\u180e\u2005\u2005\u2009\u2000\u2003\u2004\u2009\u3000\u2004\u2009\u200d\u2009\u200d\u200d\u200e\u202f\u205f\u2008\u2009\u205f\u2008\u2009\u1680\u2007\u202f\u200e\u200d\u205f\u200c\u2007\u2002 \u2008\u180e\u180e\u200e\u200f\u202f\u200d\u2006\u200c\u200e\u200a\u200f\u2007\u2002\u2006\u180e\u2002\u200f\u1680\u2009\u200b\u00a0\u180e\u2002\u2007\u200b\u2003\u2006\u00a0\u00a0\u2002\u2000\u200c\u3000\u200c\u200e\ufeff\u200f\u200d\u2002\u2008\u200d\u200e\u3000\ufeff\u2004\u2009\u1680\u200e\u200c \u2005\u2009\u2005\u202f\u2003\u2006\u2006 \u2003\u2001\u2005\u180e\u180e\u00a0\u00a0\u2009\u200d\u2007\u2003\u202f\u2004\u2005 \u200b\u2009\u2009 \u00a0\u00a0\u2000\u2006 \u2005\u200c\u2003\u3000\u202f\u2000\u180e\u180e\u2009\u200d\u2000 \u2006\u1680\u2003\u2006\u3000\u200c\u2005\u2006\u00a0\u2006\u200f\u200c\ufeff\u2007\u00a0\u205f\u205f\u2009\u200f\u2009\u2009\u00a0\u200f\u200d\u2001\u2007\u200c\u1680\u2007\u180e\u2009\u180e\u200e\ufeff\u2008\u2007\u2007\u2007\u205f\u2006\u200f\u200c\u2005\u180e\u00a0\u2000\u2002\u2008\u2004\u2001\u2008\u2006\u2008\u2009\u2005 \u2001\ufeff\u200d\ufeff\u200c\u2000\u200e\u2006\u3000\u2003\u00a0\u2000\u2000\u180e\u200a\u2007\u2001\u2001\u200d\u200f\u1680\u2001\u205f\ufeff\u200a\u1680\u200f\u2007\u200e\u2008\u200e\u3000\u2009\u200d\u2005\u200e\u3000\u1680\u2009\u200c\u205f\ufeff\u2008\u2000\u2006\u180e\u200f\u2001\u1680\u202f\u200b \u200f\u2007\u2004\u00a0\u200f\u00a0\u202f\u200a\u205f\u200c\u2000\u2000\u2005\u200e\u2009\u2004\u200b\u200d\u2006\u2002\u2001\u200b\u205f\u00a0\u2006\u2008 \u2000\u1680\u200b\u200c\u205f\u1680\u2009\u2009\u00a0\u200d\u200f\u200f\u3000\ufeff\u180e\u200c \u2008\u200a\u2003\ufeff \u200c\u200e\u200f\u180e\u200b\u2006\u200d\u2000\u00a0\u2008 \u2007\u2008\u2000\u2007\u200b\u2006\u200b\u2007\u2002\u2001\u2004\u1680\u200f\u180e\u2002\u2004\u200b\u2002\u2009\u2003\u2000\u205f\u200e\u202f\u2008\u180e\u3000\u200d\u1680\ufeff\u2001 \u00a0\u3000\u200f\u202f\u200f\u200c\u200b\u2003\u205f\u2005\u00a0\u180e\u202f\u2000\u200e\u2003\u205f\u2007 \u200a\u180e\u200f\u2005\u2000\u202f\u1680\u3000\u1680\u00a0\u2007\u200c\u180e\u3000\u2002\u2009\u200e\u202f\u2009\u2007\u200b\u2003\u2003\u200e\u2000\u200a\u200f\ufeff\u2000\u200e\u2000\u200e\u202f\u202f\u200c\u2004\u200c\ufeff\u2001\u2006\u205f\u202f\u2006\u200d\u00a0\u200b\u1680\u2005\u180e\u200b\u200b \u180e\u200e\u3000\u1680\u1680\u2004\ufeff\ufeff\u200e\u2003\u2007\u200a \u2001\u2005\u1680\u2004\u200c\u2007\u180e\u1680\u202f\u1680\u2008\u180e\u00a0\u2003\u200c\u2000\u2002\ufeff\u2002\u3000\u180e\u2005\u180e\u2009\u2005\ufeff\u200a\ufeff\u2007\u00a0 \u205f\u00a0 \ufeff\ufeff\ufeff\u2005\u200a\u200b\u2008\u205f\u200b\u2007 \u2002\u200d\u2003\u200a\u205f\u2005\u2001\u200a\u2006\u202f\u2007\u2000 \u2003\u2009\u1680\u2005\u2001\u2009\u2007\u2005\u3000\u2005\u2001\u2005\u2008\u2001\u180e\u2000\u2005\u2008\u200a\u180e\u1680\u200b\u2007\u2001\u00a0\u2002\u2008\ufeff\u2000\u2000\u00a0\u200d\u3000\u200a\u2001\u200a\u2001\ufeff\u2005\u00a0\u3000\u2009 \u180e\u202f\u1680\u1680\ufeff\u2008\u2000\u200d\u200d\u200b\u2000\u2004\u200b\u2006\u00a0\u2004\u2009 \u3000\u200a\u2009\u202f\u2000\u2003\u2003\u200a\u200f\u200d\u200f\u2001\u1680\u2001\u1680\u200d\u2004\u2003\u205f\u2005\u180e\u2002\u200e\u2000\u2006\u2007\u200d \u2006\u2002\u2008\u2003\u2001\u00a0\u2009\u1680\u202f\ufeff\u200b\u1680\u200e\u2003\u2001 \u2007\u200c\u2000\u2009\u2002\u2003\u2006\u2006\u200a \u200a\u3000\u200f\u205f\u2002\u2006\u2007\u00a0\u2004\u2002\u2006\u200a\u2002\u205f\u200c\u1680\u205f\u200f\u2007\u200c\u2005\u200d\u2002\u1680\u205f\u2005\u200d\u200b\u200d\u2008\u200b\u200d\u202f\u200d\u180e\u200b\u2008\u2000\u2000\u2001\ufeff\u3000\u200b\u2002 \u202f\u200e\u00a0\u202f \u202f\u205f\u2008\u2006\u2001\u202f\u200b\u2005\u202f\u2002\u2007\u00a0\u2006\u2000\u2009\u2003\u2002\u2004\u200d \u00a0\u202f\u200a \u200c\u200a\u00a0\u200f\u2005\u2006\u200e\u2001\u3000\u2003\u2003\u2001\u2008\u200d\u180e\u2005\ufeff\u200b\ufeff\u2009\u200e\u200e\u00a0\u2002\u200b\u2009\u200d\u200b\u2000\u2000\u2006\u2007\u2004\u2005\u00a0\u205f\u2007\u2002\u2004\u2006\u2000\u2007\u200b\u200e\u202f\u2003\u2001\u2002\u1680\u00a0\u2000\u200b\u00a0\u2001\u2001\u2002\u2001\u2007\u2002\u00a0\u2009\u202f\u1680\u200b\u205f\u00a0\u2002\u205f\u2001\ufeff\u180e\u180e\u1680 \u2009\u2007\u00a0\u00a0\u2008\u2009\u200b\u202f\ufeff\u180e\u2002\u200c \u2003\u3000\u2001 \u200a\u200a\u3000\u00a0\ufeff \u200f\u200b\u200f\u2003\u200a\u1680\u2009\u2009\u2003\u200c\u2005\u200b\u2004\u180e\u200a\u2004\ufeff\u2003\u3000\u2004\u200b\u200c\u1680\u2009\u200b\u00a0 \u200c\u2006\u00a0\u200b\u2001\u2000\u200d\u200b\u2008\u1680\u2008\u2000\u2006\u180e\u200c\u2005\u3000\u2004\u205f\u202f\u200e\ufeff\u2005\u180e\u200e\u3000\u205f\u205f\u1680\u2001\u2001\ufeff\u00a0\u2008\u202f\u3000\u180e\u200e\u2009\u1680\u180e\u2009\u202f\u205f\u2009\u200e\u2009\u200f\u2006\u200e\u00a0\ufeff \u2007\u205f\u2003\u200b\u200b\u2007\u200b\u202f\u2004 \u2008\u2008\u2002\u200a\u2007\u3000\u200b\u2006\u2007\u202f\u3000\u2005\u2001\u2008\u2005\u3000\u2002\u2004\u200d\u200a\u1680\u205f\u00a0\u202f\u2000\u200e\u2002\u2009\u2006\u2003\u2008\u205f\u200c\u2000\u1680\u2005\u2006 \u200f\u180e\u2009\u205f\ufeff\u200b\u00a0\u180e\u200b\u200e\u2000\u2002\u2001\u2001\u2008\u2002\u3000\u2001\u2005\u2003\u3000\u2006\u2005\u200c\u200f\u200a\u200f\u2003\u2003\u200e\u2000\u180e\u2002\u2000\u2008\u202f\u200e\u200e\u2001\u200b\u00a0\u2003\u200f\u2004\u2002\u2009\u180e\ufeff\u2002\u2009\ufeff\u2003\u2005\u200b\u200d\u2003\u2000\u200c\u2000\u200d\u200e\u2002\u2002\u200a\u180e\u2001\u2001 \u205f \u180e\u3000\u205f\ufeff\u200a\u200d\u200a\u1680\u200e\u00a0\u205f\u202f\u00a0\u2003\u202f\u2000\u1680\u2000\u202f\u2002\u202f\u200d\u2009\u2002\u2006\u2006\u2005\u2000\u2009\u2007\u2000\u2008\u200d\u200e\u1680\u200c\u2002\u2007\u2008\u2006\u2003\u3000\u2007 \u2008\u200b \u2000\u205f\u2005\u1680\u2003\u00a0\u1680\u2000\u200c\u2009\u2008\u2003\u200b\u2007\u200d\u205f \u205f\u1680\u2009\u2000\ufeff\u2003\u2005\u200f\u200f\u200d\u2002\u2006\ufeff\u200e\u2000\u202f\u200b\u1680\u200a\u2004\u1680\u200a\u200e\u180e\u200e\u200e\u205f\u2002\u2004\u2001\u2005\u2007\u2007\u2006 \u200f\u2007\u200c\u2002\u200f\u205f\u2002\u1680\u200e\u2009\u205f\u200e\u200a\u2008\ufeff\u2007\u2007\u2008\u2006\u2007\u205f\u2000\ufeff\u2000\ufeff\u200c\u200a\u180e\u2000\u2008\u2004\u2007 \u2003\u2006\u2008\u3000\u180e\u2003\u200e\u180e\u180e\u3000\u2002\u2003\u200b\u200b \u2002\u2004\u200d\u200c\u2007\u2004\u200e\u200f\u1680\u3000 \u202f\u00a0\u200f\u200d\u2006\u2000\u202f\u2008\u180e\u200d\u2006\u2004\u2005\u200f\u2006\u00a0\u2009\u2002\u200b\u00a0\u2007 \u2009\u200f\u200b\u2007\u2007\u200d\u2001\u200a\u205f\u200e\u2009\u200e\u2008\u200b\u2003\u200d\u2005\u2008\u00a0\ufeff\u00a0\ufeff\u2000\u2002\u00a0\u205f\u200b\u2008\u2000\u200c\u2009\u2005\u2003\u205f\u200c\ufeff\u200f\u205f\u200b\u2003\u2000\u200c\u200e\u200c\u2006\u2003\u2001\u200a\u2002\u200e\u2005\u3000\u2006\u2002\u2007\u2009\u205f\u3000\u2004\u2006\u200d\u200b\u2002\ufeff\u2000\u1680\u205f\u200b\u202f\u1680\u2001\u205f \u2009\u180e\u2002\u200b\u2000\u2004\u2001\u2004\u2000 \u200c\u200f\u00a0\u205f\u202f\u00a0\u2006\u180e\u200f\u200a\u2006\u180e\u2000\u200d \u2006\u202f\u200c\u2003\u200c\u1680\u2007\u2003\u2000\u2002\u2004\u2009\u200b\u2005\u200c\u2008\u2009\u2006\u200f\u2007\u2003\u200c\u200c\u2004\u2001\u2003\u205f \u2007\u200c\ufeff\u2003\u2001 \u2007\ufeff \u3000\u2003\u205f\u2007\u205f\u205f\u2007\u2002\u2006\u2009 \u00a0\u200b\u2002 \u200f\ufeff\u180e\u200a\u1680\u2002\u2002\u2009\u2003\u2007\u00a0\u2001\u2001\u2003\u200e\u2006\u2006\u00a0\u205f\u2005\u2006\u2008\u200b\u205f\u200b\u200d\u202f\u2005\u202f\u200b\u200c\u2007\u2001\u2001\u2003\u200a\u202f\u2001\u200e\u205f\u200a\u2005\u2006\u2006\u202f\u202f\u200f\u1680\u2008\u205f\u2004\u2004\u3000\u205f\u2008\u2006\u3000\u200f\u200f\u2000\u3000\u2004\u2006\ufeff\u2001\u205f\ufeff\u2006\u2003\u200a\u2003\u2005\u202f\u202f\u2006\u00a0\u3000 \u200f\u180e\u2003\ufeff\u2006\u200d\u3000\u2005\u00a0\u200d\u3000\u2001\u2007\u200d\u200b \u2006\u2009\u2002\u2008\u1680\u200b\u2001\u200e\ufeff\u205f\u2004\u200c\u200c\u2007\ufeff\u180e\u200f\u200d\u200a\u200c\u2001\u2006\u200c\u00a0\ufeff\u2005\u2005\u2003\u2004\u200f\u2009\ufeff\u200f\u2004\u2007\u2006\u180e\ufeff \u202f\u3000\u200a\u202f\u2002 \u3000\u2007\u2000 \u1680\u202f\u2003\u1680\u2007\u2006\u202f\u2004\u2003\u2008\u205f\u1680\u200e\u180e\u200d\u205f\u2007\u2008\ufeff\u200e\u2005\u200a\u200c\u2000\u2002\u200e\u2006\u2003\u200e\u205f\u200d\u205f\u2003\u200d\u2007\u2006\u2005\u2004\u2001\u202f\u3000\u2004\u2005\ufeff\u200e\u200f\u1680\u2007\u2009\u2004\u2009\u2008\u180e\u2005\u00a0\u200b\ufeff\u3000\u2007\u200c\u2004\u2002\u3000\u200b\u2005\u2004\u200e\ufeff\u00a0\u2006\u3000\u2002\u2005\ufeff\u200f\u2005\u202f\u200f\u200a\u200c\u180e\ufeff\u2006\u2003\u2009\u2000\u200f\u2001\u200e\ufeff\u2005\u202f\u200b\u2001\u1680\u200e\u2009\u2005\u2006\u202f\u2007\u2008\ufeff\u2001\u2000\u2001\u200e\u3000\u2001\u200b\u200d\u180e\u200b\u200e\u202f\u2003\u205f\u200b\u2000\u205f\u2001\u2002\u200c\u200d\u200d\u200c\u2001\u3000\u2007\u00a0\u200a\u205f\u180e\u200b\u2001\u00a0\u205f\u200c\u2008\u200a\u2000\u180e\u200c\u2002\u200a\u2009\u200e\u200e\u2007\u1680\u2009\u205f\ufeff\u2007\u2009\u2008\u2002\u2004\u3000\u200c\u1680\u2001\u200b\u202f\u1680\u2002\u2007\u1680\u2009\u202f\u2005\u3000\u2002\u2001\u202f\u2003\u2000\u200e\u2002\ufeff\u202f \u2002\u2000\u2007\u00a0\u1680\u2000 \u2000\ufeff\u202f\u2002\u180e\ufeff\u2005\u3000\u2009\u200c\u2001\u00a0\u2006\u1680\u200f\u200c\u205f\u200c\u200b\u200c\ufeff\u2005\u2000\u00a0\u200e\u205f\u200d\ufeff\u2002\u2002\u2007\u2001\u2008\u2005\u00a0 \u2005\u180e\u200b\u2005\u1680\u3000\u2000 \ufeff\u1680\u2004\u200d\u200b\u2004\u1680\u2000\u200a\u00a0\u1680 \u2004\u2008 \u2006\u180e\u200e\u1680\ufeff\u2000\u2000\u200b\u3000\u180e\ufeff\u2008\u2005\u200d\u2005\u2007\u200e\u2000\u180e\u200c\u205f\u2004\u3000\u1680\u200d\u205f\u180e\u200e\u200a\u200e \u200c\u200a\u2002\u200a\u200f\u1680\u2002\u2007\u202f\u2007\u2007\u2005\u200c\u200d\u180e\u200d\u202f\u200f\u1680\u2004\u200e\u200e\ufeff\u2007\u202f\ufeff\u200e\u180e\u2005\u200c\u200e\u2007\u2009\u00a0 \u2001\ufeff\u2003\u200a\u2005\u205f\u00a0 \u180e\u3000\u200b\u2006\u200d\u1680\u2004\u200b\u2001\u200a\u2001\u200a\u2006\u200c\u202f\u200f\u2007\u1680\u2006\u3000\u200d\u2000\ufeff\u3000 \ufeff\u180e\u2001\u180e\u200b\u200d\u200a\u2005\u1680\u2002\u2008\u1680\u200f\u2000\u2003\u200a\u3000\u00a0\u200a\u200a \u200a\u2005\ufeff\u180e\ufeff\u00a0\u205f\u2007\u2009\u2007\u2000\u200d\u2001\u200e\u200c\u200f\u1680\u2003\u200e\u200d\u180e\u2000\u2007\u200e\u2001\u2002\u200f\u202f\u2003\u2006\u2006\u2001\u2000\u1680\u2002\u180e\u2006\u2003\u00a0\u2001\u00a0\u3000\u2009\u3000\u00a0\u2003\ufeff\u2001\u2003\u200b\ufeff\u00a0 \u200c\u2001\u200d\u200d\u1680\u200c\u180e\u2003\u2009\u2003\u205f\u2008\u180e\u2007\u00a0\u205f\u200d\ufeff\u2006\u2006\u200e\u2007\u200e\u2001\u180e\u200b\u2005\u200e\u2007\ufeff\u200c\u205f\u2006\u1680\u200e\u205f\u200a\u2001\ufeff\u00a0\u200e\u200d\u200e\u2000\u2004\u2008 \u2004\u2005\u2004\u200f\u205f \u3000\u200f\u2003\u200e\u200c \u200a\u205f\u200f\u1680\u2001\u00a0\u205f\u2001\u200b\u202f\u2005\u2002\u2005\u202f\u205f\u200d\u2004\u00a0\u200e\u00a0\u3000\u200c\u2009\u200e\u2001\u2000\u200b\u2001\u200b\u2006\u200d\u2008\u202f\u2000\u2008\u2003\u2000\u200d\u2008\u00a0\u200a\u200a\u2004\u2000\u200c\u2005\u202f\u200c\u2006\u200a\u3000\u200a\u200d\u2002\u2001\u2004\u3000\u2002\u205f\u200d\u2001\u2004\u3000\u180e\u202f\u2003\u1680\ufeff\u2007\u2004\u2008 \u2008\u2005\u3000\u2005\u200f\u1680\u2004\u2008\u2007\u2006\u202f\u202f\u00a0\u2006\u2006 \u2003\u2009\u205f\u2003\u180e\u200d\u200b\u2003\u200f\u2006\u180e\u200a\u205f\u200d\u200e\u2005\u180e\u200d\u2009\u2000\u202f\u2006\u202f\u205f \u00a0\u2008\u2004\u200d \u2006\u3000\u202f\u2009\u200c\ufeff\u2007\u205f\u00a0\u200c \u2008\u2008\u2009\u200c\u2000\u202f\u200f \u200e \u2006\u200d\u2000\u2008\u00a0\u200f\ufeff\u2006\u2004\ufeff\u00a0\u180e\u200a\u2004\ufeff\u180e\u2000\u205f\u2004\u3000\u2007\u200d\ufeff\u2000\u2006\u200e\u2005\u2009\u200d\ufeff\u2008\u202f\u200a\u200f\u2006\u200e\u202f\u00a0\u200e\ufeff\u2005\u00a0\ufeff\u200d\ufeff\u200a\u2003\u2002\u2006\u2002 \u2006\u3000\u2004\u200e\u205f\u1680\u180e\u2006\u200e\u200e\u1680\u200b \u200d\u200c\u2004\u2001\u200f\u2009\u00a0\u200a\u2007\u2006\u2009\u2007\u2002\u2005\u00a0\u2003\u2008\u1680\u2005\u200e \u2007\u00a0\u2005\u200a \u2007\u200f\u2001\u2002\u2001\u3000\u2003 \u2005\u2001\u2007\u2007 \u3000\u200d\u2004\u200e\u00a0\u2008\u2008\u200e\u2006\u1680\u200c \u2004\u2007\u200a\u202f\u2000\u200f\u2001\u200c\u200f\u2003\u200f\u200b\u2008\u2002\u2007\u200d\ufeff\u2005\u2003\u200a\u2009\u2000\u200a\u2003\ufeff\u2007\u200d\u202f\u200a\u3000\u200e\u2007\ufeff\u200b \u2004\u200b \u202f\u200a\u200c\u00a0\u2004\u2000\u200c\u3000\u3000\u2006\u200e\u200e\u200b\u00a0\u2007\u202f\u1680 \u2007\u2005\u2009\u2004\u2007\u3000\u2006\u2005\u200b\u3000\u202f\u2003\u205f\u2003\u205f\u2004\u200f\u200f\u00a0\u00a0\u2004\u1680\u200c\u3000\u2008\u2009\u200f\u200e\u2002\u2000\u2001\u2005\u2007\u200b\u2008\u200d\u3000\u2002\u3000\u200c\u2008\u200d\u00a0\u2006\u200e\u180e\u2004\u200f\u2007\u2000\u200a\u2007\u202f\u200f\u2004\u200c\u205f\u3000\u180e\u200b\u3000\u200f\u2009\u2006\u200f \u2008\u200e \u2001\u2007\u2003\u2003 \u2009\u200d\u2006\ufeff\u200e\u200e\u200d\u2001\u2003\u00a0\u2009\u2004\ufeff\u1680\u2001\u200e\u202f\u2001\u200d\u2005\u2003\u202f\u2004\u2000\u200a\u2003\u3000\u200b\u2005\u2009\u2003\u2006\u2000 \u2000\u180e\u2009\u205f\u2001\u2001\u2008\u200d\u3000\ufeff\u2001\u200e\u2005\u200a\u2007\u200c\u2003\u3000\u180e\u2000\u3000\u200d\u200e\u2007\ufeff\u200a\u200f\u1680\u2004\u200c\u2007\u1680\u2004\u2009\u200a\u2001\u2005\u2000\u2008\u2004\u2007\u2002\u3000 \u2008\u2002\u2002\u3000\u2007\u2006\u2000\u200e\u2009\u2002\u2005\u200e\u2007\ufeff\u180e\ufeff\u2001\u200b\u2002 \u2006\u2000\u205f\u2004 \u200b\u180e\u00a0\u2009\ufeff\u2002\u1680\u2008\u2007\u200f\u200d\u2001\u2005\u200a\u2008\u205f\u2008\u1680 \u200d\u205f\u2003\u205f\u200a\u2001\u2009\u2006\u2009\u200b\u205f\u200b\u2002\u180e\u2003\u205f\u205f\u2003\u205f\u2001\u2008\u200d\u2008\u200b\u2006\u200e\u2002\u2006\u200b\u2001\u2002\u205f\u2001\u202f\u2003\u2006\u2001\u200c\u205f\u202f\u2000\u2007\u2002\u2001\u2000\u200b\u180e\u2004\u2003\u202f\u2008\u205f\u202f\u2007\u200a\u2002\u200b\u2005\u200d\u2004\u202f\u2004\u205f\u200d\u200e\u202f\u2000\u200e\u200a\u2009\u2006\u1680\u200e\u2004\u2002\u200e\u200d\u202f\u202f\u200f \u2005\u2005\u2006\u3000\u2001\u2006\u00a0\u200a\u180e\u205f\u00a0\u202f\u2007\u2002\u3000\u2005\u00a0\u2006\u180e\u205f\u2003\u2004\u2005\u2003\u1680\u180e\u200b\u2005 \u200a\u200a\u2001\u200c\u205f\u2005\u200a\u2002\u2002\u2005\u2009\u2000\u200e\u200b\u200b\u200c\u2009\u200e\u2008\u00a0\u00a0\u180e\u2004\u180e\u2006\u2009\u200e\u2001\u1680\u3000\u2008\u200e\u2006\u2007\u3000 \u2000\ufeff\u180e\u200c\u200e\u2006\u200f\u200b\u200a\u2002\u200c\u2003\u200f\u2009 \u2006\u200c\ufeff\u00a0\u205f\u200f\u2001\u2003\ufeff\u2004\u200f\u2003\u2005\ufeff\u2009\u00a0\u200d\u3000\u2001\u3000\u200f\u00a0\ufeff\u180e\u2006\u200d\u200d\u1680\u2007\u200d\u2000\u2003\u2001\u200d\u2006\u2003\u205f\u2005\ufeff\u2001\u2001\u200f\u180e\u3000\u2005\u2004\u2008\u2003\u180e\u2004\ufeff\u200d\u200a\u2001\u200c\u2005\u180e\u2002\u200a\u2004\u2000\u3000\u2009\u200b\u2001\u2002\u200f\u2000 \u205f\u2009\u2009\u2007\u00a0\u00a0\u2003\u3000\u2006\u2009\u1680\u3000\u205f\u200c\u200c\u3000\ufeff\ufeff\u2005\u2003\u00a0\u2002\u2006\u200f\u2003\u2008\u2008\u2003\u205f\u200a\u200e\u202f\u200b\u200a\u200c\u2006\ufeff\u00a0\u200e\u2001\u202f\u200e\u200a\u200d\u2004\u202f\u1680\u2003\u2001\u3000\ufeff\u2004\u2007\u2008 \u205f\u200d\u2004\u00a0\u180e\u1680\u200b\u2009\u200b\u200a\u200a\u2007\u205f\u2009\u00a0\u1680\u2009\u180e\ufeff\u2009\u202f \u200b\u2001\u2004\ufeff\u1680\u200f\u2002\ufeff\u200c\u2005\u2001 \u200e\u200f\u200c\u200c\u3000\u200f\u2007\u2003\u205f\u2008\u2009\u180e\u2005\u2005\u200d\u1680\u2006\u2004\u180e\u2006\u202f\u180e\u2002\u2001\u00a0\u200b\u2001\u2002\u2007\u200e \ufeff\u200a\u2002\u2005\u1680\u2009\u2009\u2009\u2005\u200d\u2004\u205f\u2003\ufeff\u1680\u3000\u2008\u2001\u180e\u2009\u180e\u2005\u2005\u3000\u2005\u200d\u200c\u2008\u2005\u2003\u2000\u180e\u2008\ufeff\u3000\ufeff\u2002\u200a\u2003\u200e\u205f\u200c\u200c\u200c\ufeff\u3000\u2003\u2006\u00a0\u2009\u3000\u200b\u2007\u2007\u202f\u200c\u2005\u3000\u200b \u2005\u200d\u205f\u200f\ufeff\u205f\u2007\u2004\u200f\u2006\u2003\u180e\u2005\u2008\u2007\u2007\u2005\u2008\u2009\u200e\u200b\u2002\u00a0\u1680\u200c\u2007\u2008\u2002\u200b\u180e\u1680\u200f\u2000\u180e\u200d \u200e\u2001\u2007\u202f\u2001\u2000\u200c\u200f\u200e\u00a0\u200c\u2008\u200a\u2003\u2001 \u205f\u200d\u3000\u202f\u200c\u2005\u2005\u3000\u200a\u200e\u1680\u205f\u2009\u2000\ufeff\u2008\u200e\u2007\u2000\u2007\u3000\u2009\u200e\u2005\u205f\u200d\u2006\u2003\u200e\u205f\u2003\u202f\u200a\u2004\u180e\u2005\u2007\u200f\u200f\u200f\u2003\u200b \u200a\u2004\u2001\u205f\ufeff\u2004\u00a0\u2002\u2003\u200e\u2003\u200e\u3000\u200d\u200e\u2001\u200d\u00a0\u2001\u2006\u200e\u2003\u200d\u2006\u2003\u2008\u2006\u2003\u200d\u200e\u200e \u3000\u1680\u1680\u200f\u2001\u200d\u200d\u2009\u200a\u2004\u1680\u200a\u2003\u200c\ufeff\u2002\u1680\u3000\u2005\ufeff\u2000\u205f\u2001\u2008\ufeff\u2007\u200d\ufeff\u2002\u00a0\u2002\u2002\u1680\u202f\u2000\u2001\u2001\u2003\u2001\u2003\u1680\u1680\u180e\ufeff\ufeff\u200f\u2002\u2001\u200b\u3000\u200d\u200d\u3000\u200e\u200d\u2008 \u200f\u2003\u205f\u00a0\u3000\u2004\u1680\u200c\u202f\u2007\u2006\u200e\u2004\u2009\u205f\u202f\u2008\u2003\u2006\u2003\u180e\u2003\u3000\u2003\u200e\u2000\u2005\u3000\u180e\u2000\u2004\u200b\u2003\u2002\u200d\ufeff\u200a\u2001\u180e\u180e\u2003\u2008\u2009\u2003\u3000\u200d\u3000\u200d\u2009\u2000\ufeff\u202f\u2009\u200d\u1680\u200d\u2006\u2008\u205f\u200a\u2000\u3000\u2008\u00a0\ufeff\u2008\ufeff\u2004\u2001\u2003\u2000\u200a\u200a\u200a\u2000\u205f\u2003\u2006\u00a0\u2006\u2003\u2001\u200c\u2002 \u2000\u2000\u200e\u3000\u2008\u2004\u180e\u200b\u200d\u205f\u200c\u2004\u202f\u2003\u200c\u2001\u2007\u1680\u200a\u2009\u1680\u2005\u2003\u2005\u180e\u200d\u2003\u205f\u202f\u2007\u200c\u200b\u2006\u2002\u200d\u2008\u2000\u200d\u2004\u2007\u1680\u2007\u200f\u205f\u200b\u200e\u2009\u2005\u3000\u2008\u2002\u1680\u2000\u200a\u2000\u2008\u2001\u2004\u180e\u200d\u2000\u2007\u200c\u180e\u180e\u200a\u202f\u180e\u2005\u00a0\u2006\u1680\u180e\u2001\u2009\u200c\u2001\u2007\u2007\u205f\u2002\u200d\u2008\u202f\u00a0\u2002 \u3000\u2004\u2005\u200e\u2003\u2002\u2002\u2009\ufeff\u200e\u180e\u180e\ufeff\u202f\u200c\u2006\u205f \u200b\u2004\u205f\u2001\u205f\u2001\u1680\u00a0\u2003\u3000\u180e\u2003 \u2002\u2008 \u202f\u200c\ufeff\u200c\u205f\u200c\u180e\u2005\u180e\u200d\u2005\u2006\u200b\u200e\u2002\u2000\u200c\u2007\u200f\u2009\u200c\u202f\u2004\u180e\u200a\u180e\u200d\u2005\u180e\u2002\u200d\u00a0\u2000\u200f\u2004\u2001\u2002\u2006\u2008\u2000\u2001\u200d\u2006\u1680\u200b\u200b\u200c\u200a\u3000\u200f\u200f\ufeff\u200f\u2003\u180e\u2000\ufeff\u200a\u2000\u2005\u205f\u180e \u200b\u200f\u202f\u2003\u200b\u2006 \u200e\u2003\u200b\u2005\ufeff\u180e\u202f\u200f\u200b\u2006\u2006\u2001\u200c\u2003\u200b\u180e\u2006\u2008\ufeff\u2001\u200b\u205f\u2004\u2002\u200e\u1680 \u200f\u2007\u2007\u2008\u00a0\u2009\u200f\u200a \u1680\u205f\u202f\u2005\u180e\u202f\u200f \u2005\u2007\u202f\u00a0\u2007\u2009\u2006 \u180e\u200d\u2000\u200e\u180e\u200c\u2005\u3000\u2004\u2006\u205f\u202f\u202f\u2007\u200a\u202f\u1680\u2009\u2009 \u200b\u2006\u2002\u202f\u2004\u2000\u2002\u3000\u205f\u2004\u2006\u2003\u2003\u2006\u2008\u2007\u200e\u2000\u200e\u200c\u2007\u200d\u2004\u200c\u202f\u200f\u180e\u2002\u2003\u2000\u3000\u205f\u205f\u180e \u200b\u2009 \u00a0\u2006\u2005\u2000\u2008\u200f\u180e\u2004\u200b\u00a0\u205f \u2001\u200b\u2002\u200e\u1680\ufeff\u200f\u2007\u205f\u3000\u2009\u2002\u2009\u200e\u2003\u2005\u1680\u2003\u2000\u2004\u2005\u2002\u00a0 \u00a0\u2008\u1680\u2008\u2004\u2005\ufeff\u200b\u200c\u2008\u180e\u2000\u2001\u00a0\u2009\u2002\u200c\u2007\u2007\u2003\u2000\ufeff\u200c\u200f\u200f\u2007\ufeff\u2004\u200c\u2003\u2000\u200d\u2008\u202f\u200d\u2009\u200e\u2008\u00a0 \u202f\u2001\u1680\u200e\ufeff\u2006\u2004\u180e\u200c\u2001\u200a\u3000\u2004\u2003\u3000\u2004\u00a0\u180e \u200d\u2007\u2004\u2000\u2005\u2003\u200a \u2004\u180e\u202f\u2008\u180e\u1680\u2006\u2003\u200a\u2005\u180e\u3000\u2005\u2008\u2001 \u2005\u2008\u1680\u00a0\u2009\u202f\u2003\u3000 \u2005\u200c\u2008\u2008\u2003\u2001\u2000\u180e\u2007\u205f\u202f\u200c\u202f\u200e\u2001\u200f\u200c\u180e\u2003\u1680\u200e\u00a0\u1680\u200a\u200c\u2002\ufeff\u2009\u2004\u200f\u200a\u2003\u200b\u2008\u2006\u1680\u00a0\ufeff\u2001\u2006\u2000\u200d\u2009\u200a\u200a\u2001\u2008\u180e\ufeff\u205f\u200d\u1680\u200c\u2001\u202f\u205f\u2006\u2002\u200d \u2004\u2001\u3000\u2001\u2006\u2002\u2001\u2003\u200b\u200f\ufeff\u200a\u200a\u180e\u200e\u2000\u200f\u2002\u200a\u2000\u2003\u2001\u2009\u1680\u200e\u2005\u2001\u202f\u2001\u2004\u2005\u2003\u180e\u00a0\u205f\u202f\u2003\u2001\u2005\u180e\u200e\u2004\u200f\u2002\u200a\u2007\ufeff\u200a\ufeff\u200d\u205f\ufeff\u2002\u180e\u00a0\u2009\u202f\u180e\u200d\u2000\u200b\u200a\u180e\u200d\u200b\u2009\u205f\u200c\u3000\u2009\ufeff\ufeff\u200c\u200e \u3000\u2008\u205f\u2000\u200d\u2001\u2001\u202f\u2000\u200e\u2005\u200d\u2000 \ufeff\u205f\u180e\u200c\u2005\u2000\u200f\u200c\u202f\u202f\u200f\u2008\u180e\u2008\u2009\u3000\u180e\u200f\u200b\u200f\u00a0\u2005\u202f\u200d\u2000\u2002 \u2004\u2001\u200e\u2006\u2006\u200a\u2006\u200f\u200d\u200c\u2004\u200f\u205f\u3000\ufeff\u3000\u200a\u200c\u2008\u2001\u205f\u2004\u2008\u200f\u200f\u2000\u2003\u200a\u200e\u2000\u00a0\u200c\u2009\u205f\u2008\u200a \u200e\u3000\u2005\u2002\u2008\u1680\u2009\u200a\u3000\u2004\u2002 \u200e\u2009\u200f\ufeff\u1680\u2006\u2009\u2001\u2004\u00a0\u2004\u00a0\u200b\ufeff\u200c\u2002\u200d\u2006\u1680\u200a\u2003\ufeff\u200f\u1680\u200c \u200b\ufeff\u2007\u2004\u200b\u2000\u2008\ufeff\u2008\u200b\u2003\u00a0\u205f\u2007\u200b\ufeff\u00a0\u205f\u200b\u2002\u2001\u2006\u2001\u2006\u2003\u2006\u00a0\u2008\u2002\u200a \u2003\u2000\u2005 \u2007\u2001\u2007\u3000\u2009\u2001\u2000\u2001\u2003\u2003\u3000\u2007\ufeff\u205f\u00a0\u2009\u2008\u2004\u202f\u200f\u180e\u2006\ufeff\u3000\u200c\u1680\u200a\u200e\u180e\u200c\u180e\u00a0\u2005 \ufeff\u200c\u2006\u2006\u2003\u1680\u2004\u200f\u2002\u2001\u3000\u202f\u2000\ufeff\u200d\u2001\u180e\u3000\u2004\u200e\u202f\ufeff\u00a0\u200e\u200c\u2000\u1680\u2003\u2008\u180e\u2008\u200b\u205f\u2001\u205f\u2008\u2001\u2004\u1680\u2003\u2007\u2001\u202f\u2008 \u200a\u2004\u2008\u2002\u200a \u2006\u180e\u2009\u2007\u2009\u200f\u1680\u202f\u2009\u202f\u2002\u2007\u200d\u2007\u200d\ufeff\u2000\u200c\u1680\u2003\u2006\u2002\u180e\u200d\u2001\u200f\u2008\u00a0\u202f \u200b\u2005\u200b\u180e\u1680\u200f \u200d\u200c\u00a0\u2001\u200c\u2006\u3000\u200e\u3000\ufeff\u200f\u00a0\u2005\u200c\u2004\u202f\u200d\u2009 \u1680\u2006\u200b\u3000\u2009\u200e\u200e\u200b\u2008\u180e\u2002\u180e\u200b\u200b\u200c\u200d\u202f\u2004\u200a\u2005\u2004\u00a0\ufeff\u2004\u2004\u2001\u1680\u2003\u2002\u202f \u2009\u2002\ufeff\u2003\u2006\u2006\u200c\u205f\u1680\u2002\u200a\ufeff\u00a0\u2009\u200b\u180e\u2001\u202f\u180e\ufeff\u2001\u3000\u1680\u2006\u00a0\u2003\u200e\u3000\u2009\u2007\u2007\u202f\u2007\u2009\u2007\u2005\u2000\u200d\u200d\u2006\u200c \u2005\u200d\u2002\u2003\u205f\u2007 \u00a0\u3000\u200e\u200e\u2008\u2009\u200a\u3000\u200d\u200d\u2006\u205f\u200f\u2001\u2006\u180e\u180e\u200a\u1680\u180e\u200e\u200f\u2003\u200d\u200e\u200c\u200a\u2000\ufeff\u2009\u2007\u200c\u180e\u2004\u200d\u200e \u200e\u2007\u2008\u200d\u2002\u2000\u2005\u1680\u202f\u3000\u200d\u180e\u200e\u200e\u202f\u2001\ufeff\u202f\u2000\u2000\u2009\ufeff\u200a\ufeff\u200b\u2006\u2003\u2009\u2006\u205f\u2003 \u200d\u200e\u2003\u200e\u200e\u2003\u200c\u2004\u2000\u2003\u2001\u3000\u200f\u200b\u2005\u2007\u2003\u2001\ufeff\u00a0\u200a\u200d\u2007\u200f\u202f\u2004\u202f\u200c\u200c\u200d\u2002\u2003\u2009\u205f\u200e\u200d\u2007\u200c\u2006\u00a0\u200a\u180e\u2009\u200d\u2004\u200f\u2000\u2001\u2009\u205f\u200b\u180e\u2002\u2009\ufeff\u2001\u2007\u3000\u200c\u2000\u200e \ufeff\u200a\u200e\u2000\u2000\u2006\u200c\u180e\u00a0 \u200e\u202f\u2003\u3000\u202f\u00a0\u2000\u1680\u205f\u2003\u2003\u2000 \u2003\u180e\u2000\u3000\u1680\u2003\u200d\u2005\u2004\u1680\u00a0\u200e\u2006\u2008\u2001\u200a\u2002\u2007\u2005\u202f\u3000\u2002\u2004 \u2000\u200f\u00a0\u180e\u2000\u200a \u2005\u2005\u200a\u200b\u2001\u2006\u2006\u2003\u180e\u200f\u200e\u2002\u200c\u2003\u205f\u200d\u200b\u1680\u180e \u200d\ufeff\u2003\u200e\u200b\u200f\u2007\ufeff \u205f\u202f\u200d\u200b\u202f\u2005\u2004\u2004\u180e\u3000\ufeff \u202f\u2003\u2008\u2002 \u180e\u200f\u200d\u200e\u2001 \u2001\u2008\u2000\u2006\u200f\u2006\u200c\u2000\u200c \u3000\u3000\u200b\u2005\u00a0\u205f\u2003\u00a0\u2001\u2000\u2001\u2008\u2004\u205f\u180e\u2002\u200b\u2003\u2007 \u205f\u180e\u00a0\u2009\u00a0\u2006\u2001\u200e\u205f\u200d\u2006\u180e\u1680\u2001\u2008 \u2004\u2007\u3000\u200c\u180e\u200c\u00a0\u2009\u200c\u200e\u2003\u202f\u2005\u200b\u1680\u2001\u180e\u202f \u200a\u200a\u3000\u2007\u200f\u202f\u2007\u3000\u200d\u2004\u2006\u2007\u3000\u1680\u2002\u2003\u3000\u200e\u2007\u180e \u2007\u1680 \u200a\u2004\u200b\u200c\u2004\u2008\u2008\ufeff\u00a0\u2009\u00a0\u200e\u3000\u2006\u180e\u2004\u2006\u2004\u00a0\u3000\u2001 \u200a\u180e\u2007\u2003\ufeff\u200c\u200b\u180e\u205f\u202f\u202f\u2002\u200a\u205f\u2008\u2001\u2008\u2001\u2006\u200f\u205f\u2000 \u2000\u00a0\u202f\u2005\u2005\u2003\u2000\u2000\u2005\u2002\u2000\u200b\u2000\u205f \u2001\u205f\u205f\u200c\u2005\u2002\u200e\u2003\u200b\u200e\u2007\u200c\u2000\u2006\u200d\u2007\u2002\u00a0\u200e\u2002\u2006\u200e\u2008\u2003\u2004\u3000\u205f\u2003\u2001\u205f \u200d\u2003\u3000\u2008\u180e\u200b\u200a\u2006\u200e\u2008\u202f\u1680\u2004\u2004\u2002\u00a0\u2002\u2001\u200a\u1680\u2001\u00a0\u2000\u2002 \u00a0\u200d\ufeff\u200a\u200a\u200d\u2008\u2009\u1680\u3000\u2007\ufeff\u200a\u2005\u200a\u180e\u2005\u2001\u2002\u200b\u200f\u180e\u2009\u2003\u2001\u00a0\u200b\u202f\u200d\u180e\u200a \u2003\u2007\ufeff\u205f\u200a\u200a\u00a0\u202f\u200c\ufeff\u3000 \u200b\u200c\u2006\u2008\u1680\u200f\u200b\u2003\u200a\u2004\u2008\u200e\u3000\u1680\u200d\u200b\ufeff\u2008\u200b\u2000\u2009\u205f\u3000\u200c\u2000\u2009\u2008\u2003\u200d\u2008\u2005\u205f\u200b\u2003\u2005\u3000\u200b\u2008\u2004\u1680\u2008\u2006\u200a\u2009\u2007\u180e\u200c\u2006\u2001\u2004\u00a0\u2000\u205f\u2004\u00a0\u200c\u00a0\u180e\u00a0\u1680\u200f\u2000\u2007\u200b\u2008\u200f\u2001\u180e\u00a0\u200d\u2005\u200d\u180e\u2003\u205f\u2006\u200a\u200d\u200a\u00a0\u1680\u2001\u1680\u2006\u2005\u2006\u3000\ufeff\u202f\u200d\u1680\u2004 \u3000\u2008\u2004\u200f\u2003\u200a\u2003\u205f\u3000\u2008\u2000\u2008\u2007\u00a0\u200b\u200c\u00a0\u2008\u2006\u2009\u2008\u2008\u2001\u202f\ufeff\u2009\u2009\u2000\u205f\u205f\u200f\u2007\u2004\u200e\u2000\u200a\u2009\u2001\u2006\u200c\u200e\u2007\u200b\u2005\u200c\u2006\u2006\u2009\u200a\u2007\u1680\u2005\u2004\ufeff\u205f\u1680\u2001\u180e\u200c\u00a0\u2006\u200e\u2007 \u2007\u2006\u2004\u2007\u2006\u2001\u200c\ufeff\u205f\u205f\u2007\u2000\u200c\u2003 \u2007 \u3000\u202f\u2002\u200a\ufeff\u2001\u1680\u2000\u3000\u2004\u200d\u2003\u2000\u2003\u00a0\u200b\u200c\u2004\u2001\u2003\u200b\u200b\u200d\u180e\u2008\u2003 \u200b\u2005\u2009\u205f\u200b\u200c\u200a\u205f\u200d\u2006\u2009\u200a\u180e\u2000\u2005\u2000\u2001 \u2003\u2008\u202f\u2002\u202f\u2008\u2009\u180e\u2006 \u180e\u2000\u2004\u2001\u2003\u200b\u200b\u2005\u2002\u3000\u3000\u2008\u2002\u205f\u3000\u2007\u205f\u200c\u1680\u205f\u2003\u3000\u2003\u200c\u2003\u2009\u2001\ufeff\u2005\u202f\u2003\u2002\u200d\u2003\u200c\u2005\u180e\u180e\u2004\u2003\u200b\u2003\u202f\u2002\u2009\u2006\u3000\u205f\u2001\u202f\u200f\u2003\u2005\u2003\u2003\u180e\u2000\u2005\u2003\u200e\u2000\u2002\u00a0\ufeff\u2009\u1680\u200a\u2004\u3000\u2001\u200c\u180e\u2000\u200b\u200a\u2005\u3000\u202f\u2009\u200b\u202f\ufeff\u2008\u1680\ufeff\u200f \u2005\u200f\u2009\u2009\u2002\u200f\ufeff\u2005\u2005\u205f\u200b\ufeff\ufeff\u2005\u2001\u2003\u2001\u1680\u2006\u200b\u202f\u2003\u2007\u2003\u2008\u2004\u180e\u2002\u2004\u200a\u2006\u200e\u2001\u00a0\u200b\u1680\u202f\u2006 \u00a0\u2008 \u2000\u2002 \u1680\u2007\u2005\u200e\u2001\u2004\u200e\u2008\ufeff\u2004\u200d\u180e\u2006\u2005\u2006\u2001\u2003 \u200e\u200e\u200f \u00a0\u200b\u2009\u200a \u200a\u3000\u2006\u2005\u2007\u2001\u202f\u200d\u200a\u3000\u200e\u200f\u2007\u00a0\u180e\u180e\u200c\u00a0\u200d\ufeff\u200b\u200a\u2004\u2004\u2002\u00a0\u2001\u200c\u2003\u180e\u2006\u200b\u180e\u200b\u200d\u205f\u2001\u2001\u2005\u200b\u200a\u00a0\u2007\u2002\u180e\u200f\u200c\ufeff\u205f\u2000 \u00a0\u2001\u2005\u200f\u200d\u180e\u2002\u2007\u3000\u2001\u2002\u2003\ufeff\u200d\u00a0\ufeff\u3000\u200e\u2004\u200b\u200d\u2007\u2007 \u180e\u2000\u2007\u2006\u200d\u2007\u2004 \u1680\u2007\u200e\u200b\u200c\u205f\u2007\u2008\u2007\u200e\u205f\u2007\u205f\u3000\u3000\u202f \u2003\u202f\u2009 \u00a0\u200c\u2009\u200b\u200d\u2008\u00a0\u2003\ufeff\u3000\u2002\u2003\u200f\u200a\u2009\u2002\u200f\u200e\u2000\u2001\u00a0\u2006\u200c\u2009\ufeff\u1680\u180e\u2007\u202f\u202f\u200b\u2006\u200a\u2003\u2006\u200b\u2005\u2005\u2007\ufeff \ufeff\u2007\u2001\u2005\u200a\u200b\ufeff\ufeff\u2004\u200f\u205f\u2004\u3000\u2002\u00a0\u200a\u200b\u200d\u2001\u2004\u200f\u2004\u200d\u200b\u2005\u2007\ufeff\u2009\u2003\u200a\u200f\u200f\u200d\u205f\u00a0\u205f\u205f\u3000\u2003\u3000\u2003\u200d\u202f\u200b\u2005\u2004\u200b\u2007\u2007\u202f\u200d\u2009\u2005\ufeff\u2008\u2009 \u202f\u202f\u3000 \u2001\u200a\u200e\u2009\u202f \u2003\u2001\u2006\u2007\u180e\u2006\u200b\u200b\u2001\u00a0\u2008\u2000\u2001\u2006\u200d\u00a0\u2006\u2004\u200e\u200f\u3000\u2009\u180e\u2002\u200d\u1680\u2001\u200d\u2003\u200d\u2005\u205f\u1680\u2004\u00a0\u2002\u2006\u2008\u2003\u2007\u200f \u205f\u00a0\u2009\u2001\u2001\u2009\u200b\u200d\u2003\u200c\u180e\ufeff\u200c\u3000\u200f\u200f\u2006\u200f\u200d\u205f\u2009\u2006 \u2005\ufeff\u3000\u2001\u2001 \u2009\u200e\u2008\u2007\u2002\u2002\u200b\u2003\u2001\u200c\u200d\u2008\u180e\u200c\u180e\u1680\u2001\u2008\u2008\u1680\u2002\u205f\u2003\u205f\u200d\u200e\u205f\u2002\u200a\u2006\u2008\u1680 \u00a0\u2006\u202f\u200b\u200d \u00a0\u2008\u3000\u200b\u200b\u2002 \u2002\u180e\u2000\u205f\u200b\u00a0\u2006\u2000\u3000\u200c\u202f\u205f\u200f\u2008\u202f \u200a\u200a\u200d\u2003\u00a0\u2009\u200a\u2008\u2009\ufeff\u2007\u1680\u2005\u3000\u200e\u200f\u2003\u2009\u200d\u202f\u2000\u200d\u2008\u2001\u2005\u2005\u200e\u1680\u200d\u200b\u200d\u202f\u2000\u2001\u2007\u3000\u00a0\u2004\u2005\u2000 \u200c\u1680\u2009\u200c\u200c\u200a\u200a\u2000\u2009\u200e\u200a\u180e\u200e\u00a0\u1680\ufeff \u3000\u00a0\u2002\ufeff\u2003\u180e\u00a0\u2005\u205f\u2006\u180e\u200c \u2000\u2006\u202f\u3000\u2003\u2009\u200d\u1680\u1680\u3000\u2008\u200a\u2008\u205f\u2007\u2007\u3000\u00a0\u200a\u2007\u2001\u200a\u2006\u2005\ufeff\u200a \u2002\u205f\u200d \u200c\u2008\u2007\u200a \u2003\u2009\u2004\u2001\u202f\u2008\u2008\u205f\u200e\u200f\u200c\u205f\u3000\u2004\u205f\u200d\u180e \u200f\u180e\u200c\u2005\u2003\u2005\u2002\u00a0\u200a\u2009\u00a0\ufeff\u202f\u2007\u3000\u200a\u00a0\u2002\u2001\u200a\u200b\u2009\u2004\u200d\u2009\u2000\u2008\u2000\u205f\u1680\u2000\u200a\u202f \u205f\u200c\u2003\u180e\ufeff\u200c\u200d\u180e\u205f\u2003\u200c\u200b\u202f\u2001\u2008\u200b\u00a0\u2004\u2000\u2008\u2000\u200c\u2002\u2000\u200f\u3000 \u00a0\u200a\u200b\u2008\u2000\u2004\u2004\u2000\u200c\u200a\u200a\u3000\u2001\u2002\ufeff\u2006\u2001\u2005\u2009\u202f\u200d\u2008\u2001\u202f\u200e\u180e\u1680\u200a\u2006\ufeff\u00a0\u200d \u202f\u3000\u2006\u2007\ufeff\u2001\u2008\ufeff\u2003\u00a0\u2006\u1680\u2004\u2008\u200b\u205f\u2007\ufeff\u2009\u00a0\u200b\u205f\u2000\u2001\u2004\u2009\u202f\u205f\u3000\u00a0\u3000\u200c\u200b\u2002\u180e\u205f\u200f \u1680\u200f\u180e\u200c\u2001\u200c\u2001\u2006\u2008\u180e\u2009\u00a0\u2007\u00a0\u2008\u2006\u205f\u200c\u180e\u3000\u2006\u3000\u2006\u2004\u2009\u2007\u2002\u2006\u2002\u3000\u2001\u2005\u200a\u200a\u2005\u2000\u202f\u2009\u200e\u1680\u2001\u3000 \u2000\u200a\u2007\u200b\u2008\u2000\u2008\u2007\u180e\u200e\u3000\ufeff\u200a\u202f\u2003\u1680\u1680\u200f\u180e\ufeff\u2000\u1680\u3000\u205f\u00a0\ufeff\u2008\u200d\u2002\u200f\u2007\u2006\u2005\u2002\u00a0\u205f\u200c\u200c\u200c\u2006\u200b\u2005\u2008\u3000\u200d\u200b\u2006\u00a0\u2007\ufeff\u2009\u2008\u2009\u200b\u200a\u202f\u200a\u2004\u2000\u200f\u2009\u202f\u1680\u2005\u200e\u00a0\u1680\ufeff \u00a0\u200e\u2008\u180e\u202f\u00a0\u200a\u180e\u1680\u200b\u2000\u180e\u2007\u2009\u200b\u202f\u200b\u2001\u3000\u2007\u2000\u00a0\u2006\u2006\u2004\u2000\u200e\u200e\u2003\u205f \u200d\u3000\u2002\u1680\u200f\u200f\u2008\u2003\u205f\u2006\u2001\u200e\u2004\u200a\u3000\u200f\u200c\u202f\u200a\u205f\u3000\u2008\u202f\u2000\u202f\ufeff\u2008\u2004\u00a0\u205f\u2001\u00a0\u180e\u180e\u205f\u3000\u2001\u2008\u1680\u2008\ufeff\u2001\u00a0\u200a\u200f\u3000\u200a\u2005\u2008\u2002\u205f\u200f\u205f\u2008\u2005\u2008\u2009\u2005\u2000\u200f\u200c\u200a\u200c\u1680\u2007\u205f\u3000\u180e\u200c\u2008\u202f\u200e\u180e\u1680\u180e\u205f\u2002\u200a\u2006\u2007\u200e\u2001\u200a\u3000\u2009 \u1680\u200d\ufeff\u200e\u1680\u200d\u200e\u200e \u200b\u2005\u205f\u2004\u2002\u2005\u205f\u2007\u205f\u2001\u200a\u202f\u2002\u200b\u3000\u2003\u202f\u2007\u200a\u200e\u2003\u3000\u180e\u2004\u3000\u2001\u200f\u2004\u00a0\u200d\u180e\u2002\u200d\u200e\u2006\u200f\u2001\u200c\u200b\u200c\u2007\u200f\u00a0 \u205f\u205f\u1680\u202f\u2007\u2003\u2006\u2003\u2002\u2008\u3000\u2002\u200c\ufeff\u2006\u2002 \u00a0\u202f\u2003\u200b\u00a0\u200b\u1680\u200f\u200a\u2005\u2003\u205f\u00a0\u3000\u2005\u200a\u2007\u3000\u202f\u2007\u2007\u2000\u200b\u00a0\u2007\u200b\u2007\u2003\u2009\u2009\u2003\u2005\u200f\u200f\u200d\u2009\u2002\u200b\ufeff\u2009\u202f\u2003\u200f\u2008\u3000\u2002\u200e\u3000\u2003\u200a\u2009\u200e\u2005\u200c \u00a0\u2005\u200a\u2000\u2006\u2003\u2004\u205f\u200e\u2002\u180e\u2000\u200b\u2001\u180e\u2007\u200c\u1680\u2008\u200f\u2007\u200d\u2008\u2009 \u3000\u3000\u2006\u180e\ufeff\u2007\u200c\u1680\u2007\u1680\u202f\u2007\ufeff\u2000\u180e\u2009\u205f\ufeff\u3000\u200c\u00a0\u00a0\u202f\u180e\u200f\u2005\u2000\u200e\u2006\u1680\u200a\u200b\u200a\u3000\u2008\u200c\u2005\u2005\u2009 \u00a0\u2008\u2008\u2000\u2008\u200f\u2008\u2007\u200a\u200b\u205f\u200e\u205f\u2006\u2008\u200c\u2009\u202f\u1680\u202f\u2004\u202f\u1680\u2009\u2006\u00a0\u200e\u2001\u2006\u200a \ufeff\u2005\u00a0\u200b\u3000\u2003\u2002\u200f\u2002\u202f\u202f\u2004\u2002\u2003\u202f\u200d\u200e\u1680\u2001\u200c\u2005\u2007\u3000\u180e\u200b\u2003\ufeff \u2000\u1680\u200b\u2005\u2005\u2009\u205f\u200f\u200c \u200e\u200a\u2003\u2003 \u2006\u2006\u2008\u2005\u200d\u2005\u00a0\u2004\u00a0\u2009\u200e\u200f\u200d\u2008\ufeff \u200b\u200e\u200d\u2005\u200c\u202f\u200b\u2009\u2000\u200c\u2009\u2009\ufeff\u200e\u2005\u205f\u180e\u205f\u2005 \u205f\u2000\u2005\u2009\u2000\u2001\u2009\u200e\u2008\u180e\u200b\u2006\u200a\u200d\u1680\u200b\u2000\u2002\u2002\u3000\u2001\u200d\u00a0\u3000\u2005\u200f\u205f\u2001\u202f\u2007\u2003\u2003\u200b\u2004\u2008\u2001\u2002\u200d\u205f\u200e\u2002\u2008\u200e\u180e\u2007\u2001 \u202f\u2005\u205f\u205f\u202f\u3000 \u2006\u3000\u200c\u2005\u2007\u2004\u202f\u2008\u2004 \u205f\u2006\u200d\u2009\u2008\u1680\u2000\u200b\u2001\u3000\u200e\u200b\u200a\u2003\u200e\u1680\u2005\u1680\u200c \u2008\u205f\u2000\u200e\u2006\u3000\u2000\u200c\u200e\u1680\u2002\u200b\u2003\u1680\u200e\u2001\u200d\u2003\u2004\u2007\u00a0\u2007\u2005 \u2001\u2007\u2002\u202f\u2000\u2008\u200a\u2006\u200a\u2009\u2009\u2003\u2003\u2003\u00a0\u2007\u1680\u3000\u2007\u180e\u200f\u202f\u1680\u2007\u200f\u2007\u2001\u2007\u2006\u180e\u2006\u200b\u205f\u3000 \u3000\u2009\u2007\u2000\u200b\u202f\u2009\u3000\u2003\u200b\u205f\u2000\u2003\u200e\u2005\u3000\u3000\u3000\u2003\u2008\u2003\u180e\u00a0\u200c\u2001\u2006\u205f\u2007\u2008\u1680\u200d\u200d\u205f\u2007\u2007\ufeff\u2006\u200e\u2005\u180e\u2009\u1680\ufeff\u2003\u2008\u2000\u2005\u200d\u200b\u200d\u205f\u2005\ufeff \u2002\u180e\u2003\u200b\u180e\u3000\u00a0\u200a\u200c\u200f \u2002\u2003\u1680\u2002\u200f\u200c\u2009\u180e\u200e\u3000\u2003\u3000\u2008\u200a\u200a\u202f\u2003\u2004\u2009\u200b\u2000\u2003\u2008\u200c\u2004\u00a0\u2008\u180e\u1680\u205f\u2006\u2000\u202f\u2005\u2009\u2003\u2003\u2006\u2004\u2006\u2002\u2004\ufeff\u200c\u00a0\u205f\u200c\ufeff\u200d\u2002\u2001\u180e\u200e\u2004\u2003\u200f\u00a0\u2001\u202f\u200f\u202f\u2007\u2000\u200a\u2002\u2006\u200e\u2006\u2009\u2006\u1680\u00a0\ufeff\u2002\u200d\u2005\u2009\u200d\u200a \u180e\u200a\u2000\u3000\ufeff\u202f\u202f\u2004\u2003\u2008\u202f\u2003\u2002\u202f\u2007\u2009\u2008\u2001\u200d\u200c \u200c\u200e\u2003\u205f\u2003\u2007\u2002 \u202f\u1680\u2004\u205f\u200b\u2005\u2000 \ufeff\u200c\u2009\u200b\u3000\u00a0\u1680\u2007\u205f\u200c\u2000\u200e\u200c\u202f\u2000\u2009\u200a\u205f\u3000\u202f\u200f\ufeff \u200c\u2008\u200e\u200b \u205f\u200b\u200e\u2006\u2006\u200a\u1680\u2002\u2004\u1680\u205f\u180e\u2006\u2003\u2005\u200f\u00a0\u200c\u200a\u2004\u202f\u3000\u200e\u200f\u2003\ufeff\u2005\u200a\u200a\u2005\ufeff\u180e\u2009\u2001\u200a\u200e\u1680\u180e\u200f\u200d\u200e\u200d\u205f\u2009\u2007\u2006\u180e\u200d\u2001\u2006\u2009\u200d\u200c\u2006\u2008\u200b\u202f\u2007\u2009\u2001\u180e\u2006\u200d\u202f\u200a\u2003\u2006\u2005\u2005\u2005\u2008\u1680 \u2008\u200c\u200d\u2005\u200d\u2003\u2002\u200c\u200f\u2005\u2004\u202f\u1680\u2001\u200e\u205f\u3000\u2002\u2007\u200c\u200e\u200a\u2008\u202f\u2006\u2004\u200a\u200e\u200f\u200c\u00a0\ufeff\u2003\u200d\u2009\u3000\ufeff\u200d\u2003\u2004\u2004\u2009\u2000\u2005\u2009\u205f\u180e\u205f \u200a\u00a0\u2006 \u202f\u200f\u200a\u180e\u2007\u2000\u2005\u1680\u200a \u200f\u2005\u2006\u00a0\u180e\u200c\ufeff\u200a\u200c\u2002\u2000\u2002\u2003\ufeff\u200d\u2005\u2000\u200f \u180e\u2001 \u00a0\u180e\u202f\ufeff\u200b\u202f\u180e\u2002\u00a0\u2006\u2007\u200e\u200b\u200f\u1680\u200a\u205f\u200a\u1680\u1680\u1680\u200c\u2000\u2000\u2007\u180e\u2008\u200d\u200a\u205f\u2006\u180e\u2006\u2008\u200d\u200f\ufeff\u2001\u202f\u2008\u2007\u2005\u205f\u200a\u2000\u200d\u00a0\u2007\u205f\u200d\u180e\u2003\u200d\u2000\u200b\u205f\u2009\u205f\u200d\u200c \u2004\u2001\u2001\u200e\u205f\u2000\u200c \u200c\u00a0\u200b\u1680\u200f\u2004\u2000\u2009\u2007\u205f\u2000\u200c\u3000\u2000\u2002\u180e\u1680\u205f\u2003\u200c\u2009\u00a0\u3000\u2001\u2002\u202f\u180e\u3000\u2000\u2006\u1680 \u2006\u2009\u200e\u2002\u200f\u2004\u2002 \u200a\u2002\u2002\u205f\u2006\u202f\u3000\u3000\ufeff\ufeff\u205f\u3000\u00a0\u2004\u1680\u200a\u2001\u205f\u2004\u205f\u2009\u200a\u2003\u2001\u2009\u202f \u2006\u2008\u1680\u2003\u2005\u200a\u00a0\u2004\u200c\u200f\u2008\u2003\u180e\u200d\u2000\u2003\u2007\u202f\u205f\u3000\u2003\u180e\u00a0\u200d\u200b\u3000\u1680\u3000\u2009\u2003\u2001\u2009\u2000\u180e\u180e\u200a\u200b\u2008 \u2007\u2003\u180e\u2005\u2001\u2007\u00a0 \u2003\u200e\u2000\u2000\u00a0\u200f \u180e\u2005\u202f\u2000\u200e\u2001\ufeff\u200a\u202f\u205f\u202f\u180e\u200c\u2003\u200e\u200b\u200f\u200c\u200c\ufeff\u3000\u200f\u200e\u2008\u2006\ufeff\u200b\u1680 \u200b\u2007\u200d\u2008\u1680\u205f\u2002\u200e\u2002\ufeff \u3000\u200a\u200b\u2004\u3000\u200f\u200b\u2007\u200c\u2000\u200a\u2002\u2001\u2003\u3000\u200c\u2002 \u2002\u180e\u2000\u2003\u2004\u2003\u2003\u205f\u2000\u200d\u200c\u2000\u1680\u2000\u200f\ufeff \u200c\u200d\u205f\u3000\u2003\u202f\u1680\u1680\u202f\u205f\u2009\u205f\u1680\u2009\u200c\u200f\u2006\u200f\ufeff\u2007\u2006\u200f\ufeff\u2005\u2009\u2004\u180e\u2007\u2004\u2005\u2008\u2002\u2001\u200c\u200b\u200e\u2008\u2000\u1680\u2008\u1680\u180e\u2006\u1680\u2005\u2007\u200c\u2003\u2001\u2007\u2003\u200f\u2008\u200b\u2009\u2003\u205f\u200e\u2005\u200e\u2008\ufeff\u3000\u2009\u200b\u2007 \u3000\u202f\u2006\u2002\u2006\u2005\u3000\u2003 \u200b\u205f\u2009\u2009\u3000\u200f\u205f\u205f\u200e\u200d\u200e\u3000\u2009\u180e\u2000\u2002\u2001\u00a0\u205f\u2008\u00a0\u200f\u2004\u180e\u205f\u200c\u2003\u200a\u3000\u2000\u200e\ufeff\u200e\u200b\u2003\u200d\u202f\u3000 \u200c \u200d\u202f\u202f\u00a0\u205f\u200a\u205f\u2005\u3000\u1680\u2006\u3000\u00a0\u200c\u2008\u2002\u2008\u1680\u205f\u1680\u3000\u180e\u2007\u2004\u3000\u2009\u180e\u202f\u3000\u2000\u200b\ufeff \ufeff\u2006\u2003\u2005\u2001\u2008 \u3000\u00a0\u3000\u200a\u2005\u200c\u200a\u200b\u202f\u200e\u2006\u2003\u200f\u200c\u200c\u00a0\u200b\u3000\u2001\u3000\u1680\u2000\u200c \u2002\u2006\u1680\u00a0\ufeff\u205f\u202f\u200f\u2001\u200a\u1680 \u200a\u00a0\u200b \u200c\u200f\u2001\u200d\u2005\u200f\u00a0\u2001\u2002\u2002\ufeff\u2005\u200d \ufeff\u2009\u205f\u202f\u2002\u200b\u200d\u200e\u200e\u2006 \u200c\u2009 \u2004\u2005\u200c\u200f\u202f\u1680\u2000\u1680\u205f\u200b\u2000\u202f\u200f\u2003\u200d\u2002\u200d\u2008\u2000\u3000\u200d\u200d\u2001\u2000\u3000\u2007\ufeff\u200c\u2000\u200b\u3000 \u1680\u00a0\u200b\u200c\u200b\u00a0\u2003\u2009\u3000\u200b\u2003\u202f\u00a0\u2007\u2005\u200a\u202f\u2002\u2005\u2004\u2008\u2000\u2005\u2003\u180e\u202f\u200e\ufeff \u2006\u2005\u2004\u2005\u180e\u2000\u00a0\u3000\u00a0\u2001\u2007\u2003\u2002\u2005\u3000\u1680\u2005\u200f\u2002\u00a0\u2002\u200f\u00a0\u1680\ufeff\u200e\u180e\u2003\u1680\u200b\u2003\u200f\u2004\u2007\u200a\u2008 \u205f\u200a\u200d\u180e\u2004\u200f\u00a0\u202f\u200a\u200f\u2005\u2006\u2007\u202f\u00a0\u200d\u200a\u202f\u2007\u200c\ufeff\u180e\u2009\u2004\u2005\u200e\u200e\u2008\u2003\u2003\u205f\u1680\u2004\u2009\u200e\u2001\u2006\u2005\u180e\u200b\u2005\u202f\u2006\u180e\u2007\u200d\u3000\u2000\u2001\u200e\u202f\u2009\ufeff \u205f \u00a0\u200b\u00a0\u200e\u2000\u200b\u180e\u2002\u200c \u200d\u200e\u2005\u2004\u200b\u2001\u2000\u200d\u2002\u200a\u2009\ufeff\u200c\u3000 \u2008\u2001\u200a\u3000\ufeff\u202f\u200d \u2005\u2003\u2001\u2007\u2007\u3000\u2007\u200d\u00a0\u200c\u2001\u2006\u200f\u2003\u2006\u2007\u2009\u205f\u200b\u2005 \u2009\u00a0\u2000\u2009\u2009\u2003 \u200b\u2005\u2004\u1680\u200c\u200d\u200e\u200e \u2003\u2007\u2004\u2003\u2000\u2005\u200b\u200a\u200c\u200b\u200a \u2009\u205f\u2007\u180e\u200f\ufeff\u2006\u202f\u205f\u2001\ufeff\u2000\u2000\u1680\u2003\u2004\u2003\u2003\u200b\u2002\u1680\u2006\u2008\u2003\u2002\u202f \u2005\u200f\u2004\u2001\u2004\u2000\u200a\u1680\u2005\ufeff\u200d\u205f\u2000\u2008\u200d\u200f\u2008\u2003\u2001\u2006\u2009\u180e\u2006\u200d\u1680\u205f \u2004\u180e\u200d\u2007\u200e\u2003\u2004\u200b\u2005\u200f\u202f\u2009\u202f\ufeff\ufeff\u2002\u200d\u2008\u200b\u2007\u2004\u2007\u180e\u2009\u200b\u2009\u00a0\u3000\u2003 \u200b\u2009\u180e\u205f\ufeff \u2008\u1680\u200a\u200b\u2003\ufeff\u2008\u2001\u200b\u2002\u2003 \u2000\u200b\u200b \u2007\u3000\u205f\u2000\u2005\u200a \u3000\u200f\u2009\u2009\u2004\u2000\u200c\u2009\u200a\u2004\u2001\u2002\u200d\u2000\u2009\u200c\u2005\u200e\u2006\u2002\u2009\u3000\u200d\u200c\u2001\u2006\u3000\ufeff\u2001\u200a \u3000\u205f \u00a0\u2008\u2009\u200b\u3000\u2009\u2003\u00a0\u2008\u2003\u2007\u200d\u2009\u00a0\u2006\u3000\u2006\u200c\u2001\u2001\u180e\u2004\u200c\u00a0\u200d\u2005\u2002\u2004\u3000\ufeff\u2003\u202f\u200f\u3000\u200f\u1680\u3000\u2008\u2006\u2006\u2008\u200d\u00a0\u2001\u2002\u200e\u200b\u2004\u2003\u202f\u202f\ufeff\u202f\u2001\u00a0\u2000\u3000\u200c\ufeff\u200c\u00a0\u200b\u200b\u3000\u200c\u200e\u200d\u2007\u2008\u1680\u2003\u2009\u2004\u200f\u2006 \u2008\u202f\u2008\u200c \u2007\u205f\u2002\u200c\u205f\u200b\u2007\u2006\u200b\u2008\u2009\u2002\u2001\u205f\u00a0\u2001\u2005\u200c\u2004 \u200d\u3000\u2003\u2004\u2008 \u3000\u2001\u202f\u3000\u200a\u200a\u180e\ufeff \u2006\u202f\u200c\u3000 \u200e\u200f\u3000\u200f\u205f \u00a0\u3000\u1680\u2000\u200f\u2001\u2002\u202f\u205f\u2004\u00a0\u200d\u200f\u200d\u2009\u2003\u1680\u2000\u200a\u00a0\u2009\u1680\u2003\u200a\u2002\u00a0\u200c \u200f\u180e\u1680\u200c\u2005\u1680\u2006\u00a0\u00a0\u202f\u00a0\u2008\u200c\u2004\u2006\u2006\u200a\u200c\u2001\u00a0\u2002\u2002\u200c\u2005\u205f\u2009 \u200f \u2002 \u1680\u200a\u2003\u200f\u2008\u180e\u2008\u180e\u2000\ufeff\u200c\u2002\u2001\u2003\u2004\u2006\u180e\u200d\u202f\u200a\u2004\u2006\u200d\u200b\u2009\u2007\u180e\u2008\u2005\u2004\u2007\ufeff\u205f\u2000\u1680\u2009\u2008\u200e\u2006\u2008\u3000\u200c\u200a\u3000\u2001\u2002\u2005\u202f\ufeff\u180e\u200a\u2007\u200d\u2003\u1680\u00a0\u2009\u3000 \u200d\u00a0\u200b\u1680\ufeff\u2008\u2006 \u2006\ufeff\u200b\u200b\u200e\u2009\u2007\u205f\u2000\u2008\u1680\u2008 \u200c\u2005\u00a0\u2001\u2006\u2008\u1680\u200f\u3000\u2007\u180e\u202f\u200b \u202f\u2006\u2007\u200e\u3000\u2002\u200c\u2001\u3000\u00a0\u2006\u200a\u200f\u2003\u200e\u2006\ufeff\u200f\u2005\u2004\u180e\u1680\u200e\u200f\u2003\u2007\u3000\u2003\u2008\u2003\u200a\u2001\u2005\u200b\u202f \u2002\u200d\u202f\ufeff\u3000\u200e\ufeff\u2005\u2006 \u3000\u200d\u200a\u2006\ufeff\ufeff\u2004\u2006\u2000\u202f\u200b\u2007\u00a0\u200b\u200b\u2007\u2007\u2000\u2002\u200e\u200c\u2001\u205f\u2004\u200a\u2000\u180e\u2002 \u2009\u2001\u00a0\u2007\u2008\u2002\u200c \u1680\u2007\u200f\u2007\u2002\u1680\u200c\u202f\u2000 \u200d\u1680\u1680\u200c \ufeff\u2001\u2000\u200b\u2003\u2003\u200e\u200b\u2000\u205f\u2006\u200a\u2000 \u202f\u205f\u2007\u2000\u2006\u205f \u200e\u200d\u00a0 \u2007\u00a0\u2004\u2006\u2001\u2004\u200d\u200f\u2004\ufeff\u200b\u200a\u205f\ufeff\u200c\u200c\u2008\u00a0\u2005\u2004\u180e \u00a0 \u200e\u205f\u2000\u200e\u2000\u2008\u2008\u1680\u200e\ufeff\u180e\u2001\u2009\u200d\u00a0\ufeff\u2004\ufeff\u200f\u2001\u202f\u200e\u3000\u2005\u200f\u200b\u00a0\u200f\u2007\u2008\u180e\u200d\u2002\u3000\u200e\u180e\u200b\u00a0\u2001\u2002\u2003\u200f \u205f\u2005\u202f\u00a0\u2006\u180e\u2005\u205f\u200d \u2000\u2001\u1680\u2005\u2006\u3000\u200e\u2009\u202f\u2008\u00a0\u2004\u200b\u3000\u200f\u200b\u200a\u2008\u2006\u2003\u2002\u2001\u1680 \u2002\u200f\u202f\u1680\u2001\u2000\u200d\u3000\u2008\u3000\u180e\u200b\u200a\u2002\u2006\u2009\u2007\u200b\u2001\u2007\u2000\u2009\u205f\u2007\u3000\u2004\u2002\u200c\u00a0\u200a\u2005\u1680\u200b\u200c\u00a0\u2005\u200b\ufeff\u2001\u2003\u00a0\u2001\u3000\u2000\u2004\u2006\u200a\u2009\u2001\u2004\u200e\u200a\u00a0\u00a0\u2003\u00a0\u2009\u3000\u2000\u2000\u200c\u2002\u200e\u2003 \u200a\u2005\u1680\u180e\u200d\u200b\u2005\u2003\u200b\u2000\u200f\u2002\u2008\u180e\u200c\u200f\u2003\u180e\u200e\u200e\u2001\u2007\u2004\u200a\u00a0\u2003\u205f\u2003 \u2001\u2003\u00a0\u200a\u200c\u2004\u200b\ufeff\u200e\u3000\u200e\u202f\u2008\u2006\u2007\u2004\u2004\u200a \u2007\u200c\u180e\u00a0\u00a0\u2000\u200f\u200b\u200f\u2005\u200b\u3000\u200e\u202f\u2003\u2006 \u200a\u00a0\u200f\u200a\u200f\u180e\u180e\u00a0\u205f\u1680\u2001\u2002\u2004\u2003\u200f\u200e\u200c\u2006\u200f\u2008\u2000\u2009\u3000\ufeff\u2003\ufeff\u2004\u2004\u200c\u2006\u2003\u202f\u2007\u2007\u2003\u2009\u180e\u200e\u2006\u1680\u2004\u200d\u202f\u200c\u2006\u2006\u200e\u2007\u00a0\u00a0\u2004\u2002\ufeff\u200e\u200d\u00a0\u200b\u200a\u205f\u2008\u2008\u2009\u200b\u200f\u2009\u2000\u200c\u2007\u200f\u2002\u200f\u2004\u2002\u200c\u2009\u202f\u200f\u200d\u200b\u00a0\u200b\u2004\u2002\u00a0 \u1680\u180e\u200f\u00a0\u1680\u200e\u2000\u200b\u180e\u200a\u2007\u2000\u2008\u180e\u2009\u205f\u2008\u202f\u200e\u2008\u2005\u2001\u200e\u2006\u200f\u3000\u2002\u2008\u3000\u2004\u200c\u200a\u2006\u200c\u2000\u200b\u2000\u2002\u200a\u200c\ufeff\u200f\u2007\u2006\u2008\u1680\u1680\u00a0\u1680\u200b\u180e\u205f\u2002\u205f\u2000\u200b\u2000\u202f\u2007\u2008\u2004\u2009\u2005\u2008\u3000\ufeff\u200f\u2002\u2001\u2005\u200f\u200c\u00a0\u1680\u2005\u2004\u2007\u200b\u2002\u200b\u180e\u2008\u2006\u202f\u200f\u2009\u2001\u2005\u2006\u3000\u2008\u200c\u200a\u200d \u202f\u200a\u200d\u200c\u2001\u200e\u3000\u2009\u205f\u2000\u2003\u200e\u2004\u200c\u2009\u180e\u2002\u2008\u200e\u2005\u200f\u2006 \u180e \u200d\u2004\u2003\u200a\u2005\ufeff\u2002 \u2004\u2006\u2001\u180e\ufeff\u200f\u00a0\u2003\u3000\u2002\u00a0\u2005\u2002\u2003\u2003\u2002\u2001\u00a0\u200a\ufeff\u200c\u205f\u2008\u200a\u205f\u200f\u200d\u200f\u200b\u2008\ufeff\u200a\u1680\u2000\u202f\u200a\u200b\u200d\u200d\u180e\u205f\u2005\u200a\u2009\u2007\u2006\u200b\u2002\u2007\u200c\u2005\u200b\u200f \u200f\u3000\u200b\u200d\u200b\u2003\u2006\u2003\u2001\u202f\u2001\u2006\u202f\u200b\u2001\u2006\u200b\u2001\u200a\u205f\u00a0\u202f\u202f\u200b\u00a0\u00a0\u2000\u2003\u2009\u2009\u1680\u2004\u2009\u2000\u200e\u200d\u2001\u200f \u2000\u2000\u200a\u1680\u2009\u200d\u205f\u200f\u202f\ufeff\u2007\u200d\u2001\u2000\u2003\u00a0\u2008\u2000 \u200e\u200b \u200b\u2003\u2006\u00a0\u1680\u2002\u2000\u2005\u2001\u1680\u205f\u200c\u2004\u200d\u2009\u2007\u205f\u00a0 \u00a0\u1680\u2001\u2004\u200d\u2008\u2005\u200f\u2001\u1680\u2008\u2009\u2000\ufeff\u2006\u200f\u200c\u3000\u202f\u1680\u200f\u3000\u200b\u200e\u2004\u00a0\u200d\u2006\u2006\u180e\u2005\u205f\u200a\u2006\u205f\u200b\u2007\u2002\u2005\u2009\u2000\u2000\u2003\u2009\u200f\u200d\u200e\u3000\u200e\u2003\u200d\u200e\u2006\u2002\u200a\u2001\u2002\u200b\u200a\u205f\u2009\u2000\u200a\u202f\u200a\u200b\u2000\u200b\u2005\u200f\u200d\u2003\u00a0\u3000\u2009 \u200a\u2008\u202f\u200e\u2004\u200f\u2000\u200f\u200f\u205f\ufeff\u200a\u2005\u200f\u2008\u200a\u2000\u200d\u180e\ufeff\u200d \u200e\u00a0\u202f\u2007\u2002\u3000\u2001 \u205f\u202f\u200f\u200e\u200d\u2003\u200d\u2002\u2005\u180e\u200f\u205f\ufeff\u180e\u200e\u2004\u200b\u2001\u2005\u00a0\u2003\u180e\u200e\u2000\u1680\u2003\u2008\u200f\u2001\u200c\u200c\u180e\u2008\u200b\u2002\u200b\u3000\u2004\u2001\u200b\u3000\u205f\u2009\u200f\u200a\ufeff\u2009\u2002\u2007\u2002\u2002\u2001\u2006\u00a0\u200b\u200a\u2007\u2005\u00a0\u2007\u1680\u2002\u200d\u2009\u200c\u1680\u2006\u00a0\u2008\u2003\u200f\u200f\u2004\u200e\u2009\u200e \u3000\u2001\u2001\u2000\u2007\u1680\u180e\u200f\u200e\u200f\u2003\u200e\u205f\u00a0\u2007\u3000\u200f\u205f\u2007\u200b\u2007\u00a0\u2006\u1680\u2008\u200a\u200d\u200c\u2009\u2008\u2001\u200c\ufeff\u2004\u2007\u2005\u2003\u2009\u2006\u205f\u2006\u2009\u2000\u202f\u2001 \u205f\u2008\u200e\u2009\u1680\u2003\u2006\u200f\u2002\u2007\u2001\u202f\u2001\u2002\u202f\u200c\u200f\u180e\u205f\u3000\ufeff\u200a\u2007\u2009\u2006\u180e\u2002\u200c\u205f\u2008\u2004\u200e\u00a0\u3000\u1680\u00a0\ufeff\u200c\u00a0\u200e\u200a\u202f\u2003\u2001\u200e\u205f\u200e\u200e\u200a \u2003\u2009\u200b \u200a\u200e\u2006\u205f \u200a\u200d\u200e\u2007\u202f\u200c\u2002\u200e\u200f\ufeff \u200f\u200c\u2006\u2001\u200c\u00a0\u200b\u2008\u2006\u2007\u2009\u202f\u2005\u200d\u2006\u200f\u200c\u2006\u200b\u180e \u200f\u2000\u2006\u205f\u2008\u2005\u00a0\u2009\u1680\u2007\u2001\u2001\u2000\u200f\u200c\u202f\u205f\u205f\u205f\ufeff\u2001\u205f\u2007 \u1680\u200d\u180e\u200b\u3000\u2003\u00a0\u2006\u2006\u00a0\u2008\u202f\u180e\u200c\u2002\u2008\u202f\u00a0\u2007\u200c\u2002\u2001\u1680\u2009\u2002\u00a0\u200e\u2002\u200a\u202f\u1680\u2006\u00a0\u2009\u2006\u202f\u2005\ufeff\u200e\u2002\u205f\u3000\u2006\u2002\u205f\u202f \u205f\u2009\u202f\u2007\u200c\u2000\u200a\u200c\u00a0\u2009\u2000\u180e \u200c\ufeff\u2007\u2007\u2003\u2001\u1680 \u2007\u2003\u2008\u200d\u2000\u2005\u1680 \u202f\u200e\u180e\u2009\u200a\u205f\u200d\u200e\u200e\u2000\u2005\u200d\u2005\u2008\u2007\u200f \u200e\u200a\u2008\u00a0\u200e\u2006\u2008\u2008\u2004\u200d\u205f\u2009\u2002\u200f\u2003\ufeff\u200f\u2007\u200c\u2002\u00a0\u200f\u2002\u2005 \u200a\u200b\u2007\u2005 \u2004\u200c\ufeff\u200a\u180e\u2003\u2009\u2000\u00a0\u2007 \u2007\u2000\u2008\u200d\u200e\u1680\u2008\u2009\u2005\u2002\ufeff\u2008\u2007\u2000\u200c\u200e\u180e\u200d\u200a\u2006\u2009\u2009\u200e\u2009\u205f\u200d\u2004\u2006\u200a\u180e\u200a\u2002\u202f\u200e\u00a0\u180e\u2008\u202f\u200b\u2004\u3000\u200e\u3000\u1680\u2009\u2006\u200b\u2000\u2008\u00a0\u2009\u00a0\u2000\u202f\u3000\u2008\u2003\u2009\u202f\u2009\u2003\u202f\u2008\u200e\u2004 \u2004\u200b\u200e\u205f\u200f\u2003\u2003\ufeff\u2007\u2008\u2005\u202f\u200d \u200f\u200a\u200b\u00a0\u2009\u2007\u200c\u205f\u1680\u2007\u3000\u2002\u2008\u2006\u2006\u2008\u00a0\u3000 \u200a\u2006\u00a0\u2009\ufeff\u2004\u00a0\u2006\u200d\u200c\u202f\u2003\u2009\u00a0\u200e\u200d\u200b\u2000\u2004\u2004\u1680\u200f\u1680\u200d\u205f \u200a\u2002\u3000\u2009\u2008\ufeff\u2002\u2009\u00a0\u200e\u200a\u2001\u2001\u202f\ufeff\u2006\u3000\u202f\u180e\u2007\u00a0\u2001\u2002\u205f\u2008\u2008\u200e\u2005\u2003\u2000\u200f\u200f \u2002\u200d \u00a0\u200f\u2000\u200d\u180e\u2000\u00a0\u2008\u180e\u200b\u2009\u200f\u200b\u2003\u202f\ufeff\u200a\u2009\u2002\u3000\u2007 \u200a\u2008\u205f\u180e\u2009\u2008\u2007\u2001\u180e\u2005\u2004\u2009\u200a\u202f\u2005\u00a0\u2003\u202f\u200b\u1680\u200a\u2003\u2001\u180e\u2004\u1680\u200e\u200f\u2001\u200b\u200c\u200d\u2002\u200d\u205f\u2007\u2002\u202f\u2005\u2000\u200f\u202f\u2000\u180e\u200b\u200e \u200a\u205f\u202f\u2001 \u2009\u200d\u200b\u2000\u202f\u2006\u00a0\u200b\u200a\u2005 \u200e\u2004\u2006\u2002\u2003\u2000\u200b\u180e\u2005\u2007\u180e\u200f\u200e\u1680\u2002\u200e\u200f\u200f\u2003\u202f\u00a0\u200e\u2004\u00a0\ufeff\u200c\ufeff\u200f\u2005\u200d\u200a\u2003\u205f\u2002\u2001\u1680\u1680\u2009\u1680\u2009\u205f\u2004\u2006\u205f\u205f\u200d\u3000\u205f\u200c\u180e\u200f\u2001\u00a0\u200f\u2000\u200d\u200f\u2002\u2002\u2007\u200f\u200c\u2003\u2000\u200c\u00a0\u2008\u2006\u3000\u200c\u2008\u00a0\u2002\u200e\u3000\u200a\u3000\u2007\u200e\u200e\u200b\u200a\u205f\u2003\u200d\u200f\u180e\u200c\u00a0\u200b\u2009\u200e\ufeff\u00a0\u200b\u200b\u200b\u200d\u200b\u200c\u2007\u1680\u3000\u00a0\u200b\u200e\u3000\u205f\u200f \u2004\u3000\u2008\u205f \u200d\u2004\u00a0\u2009\u3000\u180e\u200c\u180e\u2000\u202f\u2003\u202f\u2005\u2008\u2004\u2007\ufeff\u2007\u3000\u2002\u205f\u200e\ufeff\u2008\ufeff\u00a0\u2002\u2003\u2009\u2003\u200c\u202f\u205f\u00a0\u2006\u200e\u2009\u2004\u200b\u2002\u2008\u200b\u2008\u200e\u2009\u2000\u200b \u200c \u2003\u2004\u205f\u2009\u2007\u2001\u2002\u2003\u200d\u3000\u2007\u205f\u2006\u2002\u205f \u202f\u202f\u200d\ufeff\u180e\u2009\u2003\u2000\u2004\u2001\u2002 \u2003\u2001 \u2003\u2008\u2008\u2002\u2001\u2002\u2007\u200e\u205f \u2000 \u200a\u2002\u2004\u200d\u205f\u00a0\u2002\u00a0\u2008\u200f\u202f\u200f\u2007\u200e\u2001\u2002\u200a\u202f\u200c\u2004\u2000\u2003\u2006\u200d\u205f\u205f\u2005\u2003\u2006\u00a0\u200c\u200f\u205f\u2000\u2003\u200b\u200d\u2000\ufeff\u200d \u2009\u200f\u1680\u2007\u2003\ufeff\u200c\u2001\u2005\u2005\u200e\u202f\u2005\u2002\u200f\u200f\u2006\u2007\u205f\u200c\u200e\u1680\u00a0\u200a\u2004\u202f\u200d\u00a0\u200c\u3000\u2003\ufeff\u200b\u00a0\u2007\u202f\u200b\u202f\u200c\u200d\u2009\u200b\u200c\u2004\u2004\u200f\u2003\u202f\u200e\u2000\u200a\u2004\u2007\u200b\u2000\u2008\u200c\u1680\u3000\u1680\u2000\u2004 \u2007\u200f \u180e\u2004\u180e\ufeff\u00a0\u2006\u200a\u2000\u200f\u2004\u2002\u200b\u200b\u200a\u2000\u3000\u205f\u3000\u2005\u200a\u2007\u2003\u2002\u200a\u200a\u202f\ufeff\u200a\u2008\u1680\u2007 \u200c\u2003\u200c\u2005\u2004\u205f\u2009\u2007\u2002\u2009\u2003\u2000\u2004\u2009\u2001\u1680\u2009\u200d\u2009 \u200e\u2008\ufeff\u2009\u2000\u200e\u2002\u200d\u2008\u2000\u200a\u200a\u2003\u2002\u3000\u202f\u2006\u1680 \u200d\u205f\u202f\u3000 \u3000\u3000\u205f\u200d\u2001\u2003\u2009\u202f \u2000\u200e \u2000\u200a\u00a0\u2008 \u3000\u2007\u2005\u2008\u205f \u200c\u200a\u200c\u3000\u2005\u200c\u205f\u200d\u205f\u2004\u200d \u2006\u00a0\u200b\u180e\u2006\u2001\u200e\u200d\u202f\u1680\u2007\u200d\u205f\u202f\u00a0\u200d\u202f\u200f\u200f\u200b\u202f\u00a0\u205f\u180e\u200b\u1680\u200e\u200f\u2009\u202f\u2008\u200f\u180e\u2009\u2009\u205f\u200c\u2000\u200e\u2007\u00a0\u200d\u200b\u2001\u3000\u2002\u1680\u205f\u2005 \u180e\u200a\u200b\u2007\u200a\u1680\u2001\u200e\u200f\u2003\u2007\u200f\u3000 \u3000\u00a0\u00a0\u3000\u2002\u1680\u202f\u2000\u200e\u200e \u200a\u2003\u3000\u200b\u2007\u2002 \u200e\u200b\u2004\u200e\u202f\u2008\u202f\u200a\u2006\u200f\u2009\u2007\u200c\u2000\u3000\u180e\u180e\u2001\u200a\u2003\u200a\u2007\u200e\u205f\u2004\u200d\u200d\u00a0\u205f\u2003\u2007\u2009\u205f\u200c\u200d\u2000\u2001\u200a\u3000\u200a\ufeff\u2001\u2007\u2001\u205f\u200f\u2008\u00a0\u3000\u200a\u200f\u2003\u180e\u200f\u1680\u2007\u202f\u2003\u200d\u202f\u3000\u200f\u200f\u202f\u2009\u200a\u180e\u3000\u2006\u2001\u2005\u1680\u2006\u1680\u2007\u2004\u2008\u200f\u00a0\u2008\u200e\u2004\u2001\u200e\u2008\ufeff\u2000\u2007\u2006\u200b\u00a0\u2000\u205f\ufeff\u2003\u200f\u200c\ufeff\u180e\u205f\u200c\u180e\u2008\u2003 \u205f\u200e\u180e\u2006\u200b\u200e\u200a \u2008\u2005\u2006\u200e\u200f\u200e\u2001\u1680\u202f\u180e\u2008\u180e\u205f\u2001\u180e\u200e\u2004\u2005\u2005\u200f\u200e\u2008\u3000\u2007\u200b\u200f\u3000\u1680\u200f\u3000\u200b\u2007 \u1680\u2006\u2000\u2003\u202f\u180e \u00a0\ufeff\u2004\u202f\u200e\u2003\u2003\u200b\u2009\u200a\u2004 \u1680\u2005\u2008\u180e \u1680\u200b\u2005\u200e\u2003\u200e\u2002\u200a\u2001\u2002\u2005\u2006\u200d\u2001\u2004\u00a0\u2001\u2001\u205f\u2005\u2008\u00a0\u180e\u2009\u2001\u2006\u2005\u2006\u2004\u3000\u2009 \u2009\u2009\u2003\u2005\u200d\u202f\u3000\u2001\u200c \u3000\u2007\u2009\ufeff\u202f\u200a\u3000\u2004\u00a0\u2009\u202f\u200b\u2001\u200e\u200c\u2003\u200f\u00a0\u2007\u2008\u200f\u2006\u2004\u2004\u205f\u3000\u200f\u200a\u00a0\u2005\u00a0\u2002\ufeff \u200a\u1680\u200b\u2000\u200a \u2009\u2004\u2002\u2006\u2006\u2001\u2008\u2008\u2004\u200b\u200f\u2007\u2004\u3000\ufeff\u2008\u180e\u2002\u200d\u2002\u2009\u2002\u2007 \u2001\u2005\u00a0\u2000\u200b\u200f \u200a\u200d\u2000\u2005\u200f\u180e\u202f\u200d\u200e\u2001\u00a0\u2005\u2003\u2001\u2005\u2002\u1680\u200c\u200d\u205f\u200e\ufeff\u2003\u2006 \u2001\u202f\u200e\u200c\u200f\u2004\u2008\u205f\u200f\u205f\u200a\u2001\u2001\u00a0\u3000\u200e\u2002\u200b\u2007\u1680\u2005\u2006\u2000\u00a0\u2007\u200a\u2000\u200f\u2002\u00a0\u2004\u200e\ufeff\u2003\u180e\u200c\ufeff\ufeff\u205f\u200f\u2007\u205f\ufeff\ufeff\u200a\u2007\u2009\u2004\u2009\u2009\u180e\u2007\u2009\u2000\u2001\u205f\u00a0\u200a\u2006\u200a\u2009\u2002\u2003\u200e\u2002\u202f\u2005\u2006\u2000\u3000\u2001\u3000\u200e\u200f\u2004\u2003\u00a0\u3000\u1680\u2008\u2001\u2009\u2002\u3000\u205f\u1680\u2008\u2004\u200a\u2007\u2004\u3000\u2003\u200f\u200a\u200b\u200d\u205f\u2006\u180e\u2007\u2008\u2007\u200b\u2009\u200f\u200a\u1680\u205f\u00a0\u2002\u3000\u2007\u205f\u2003\u2003\u2000\u2006\u2008 \u2002\u2006\ufeff\u2002\u2008\u2005\u00a0\u2001\u200f\u2003\u2003\u200c\u200b\u202f\u200f\u2002\u2008\u180e\u200a\u200e\u200c\u200f\u2008\u2004\u1680\u2004\u2003\u2008\u1680\u205f\u2003\u2006\u202f\u2004\u205f\u2000\u2001\u3000\u2007\u200a\u200d\u180e\u202f \u1680\u2006\u00a0\u200c\u3000\u200a\u2003\u180e\u2009\u2009\u3000\u2002\u200c\u2001\ufeff\u2000\u200c\ufeff\u2008\u2004\u200f\u2000\u2008\u205f\u202f\u00a0\u1680\ufeff\u1680\u200e\u2009\u2007\u2009\u200b\u3000\u200a\u202f\u200c \u200e \u2007\u2009\u2003\u200a\u2006\u180e\u00a0\u2008\u2008\u2007\u2003\u2008 \u2009\u00a0\u2002\u2001\u200b\u202f\u2001\u2000\u2000\u2005\u2001\u2007\u2000\u3000\u1680\u200d\u200c\u202f\u3000\ufeff\u2004\u200a\u205f\u2006\u2009\u2004\u00a0\u2009\u2009\u2001\u1680\u2003\u200a\u2002\u2008\u1680\u200a\u200d\u2004\u3000\u2001\u2001\u205f\u202f\u200f\u3000\u2007\u1680\u200a \u2000\u2006\u202f\u2001\u3000 \u2001\ufeff\u2006\u2009\u205f\u1680\u2005\u3000\u202f\u2007\u200d\u2004\u3000\u2001\u2005\u2002\u00a0\u2002\u2008\u180e\u200c\u205f\u200e\u2000\u2000\u1680\u2008\u2007\ufeff \u2004\u1680\u2008\u2003\u2005\u2001\u2004\u2002\u2009\u180e\u2000\u200f\u200a\u200c \u200e\u205f\ufeff\u180e\u2005\u2008\u2003 \u2003\u180e\ufeff\u200a\u200f\u2005\u200f\u2004\u200b\u2005\u200b\u200d\u3000\u2002\u202f\u2002\u2000\u1680\u200a\u205f \u202f\u3000\u2009\u2009\u200a\u200e\u2006\u202f\u2001\u3000\ufeff\u2005\u2001\u00a0\u2002\u200b\ufeff\u180e\u2003\u2009\u2007 \u200e\u2003\u205f\u205f\u2002\u200d\u2003\u2003\u200a\u200c\u2005\u2007\u2003\u1680\u2001\u202f\u2004\u2003\u2007\u2005\u202f\u200b\u3000\u200c\u200b\u2006\u2001\u2007\u2005\u00a0\u205f\u2000\u200a\u200b\u202f\u00a0\u1680\u1680\u200c\u2001\u205f\u2000\u2002\u2000\ufeff\u200c\u2007\u205f\ufeff\u2008\u2003\u200d\u2006\u205f\u200d\u205f\u2000\u2006\ufeff\u3000\u202f\u1680\u2002\u2003\u200d\u200e\u2005\u200c\u200b\u2008\u202f\u00a0\u180e\u2002\u2002 \u2001\u2006\u2007\u2003\u1680\u2007\u205f \u2009\u2005\u00a0\u1680\u00a0\u2003\u2003\u2005\u2001\u200f\u200e\u200d\u2003\u180e\u2002\u205f\u2008\u2009\u200f\u00a0\u200f\u2005\u202f\u202f\u200d\u3000\u200a\u2007\u2007\u180e\u2003\u2001\u2003\u200a\u200e\u2009\u1680\u1680\u2007\u2006\u2005\u205f\u3000\u200f\u00a0\u2008\u3000\u200b\u3000\u200d\u2003\u200b\u200e \u200a \u2006\u2004\u200d\u200a\u2006\u2006\u2007\u2008\u2009\u200d\u2007\u2004\u200b\u2003\u200c\u200e\u200d\u200c\u2000\u2006\u205f\u200b\u2005\u200f\u200d\u2008\u2000\u200b\u2001\u3000 \u200c\u200a\u2001\u2008\u1680\u3000\u2001\u205f\u00a0\u2005 \u200a\u200a\u2000\u2000\u2001\u2002\u2005\u200d\u2001\u200a\u200e\ufeff\ufeff\u00a0\u2000\u200d\u2000\u202f\u200c\u200e\u2007\u2009\u2007\u2005\u200f\u2004\u200e\u200b\u00a0\u2009\u3000\u200e\u202f\u2004\u180e\u200c \u2008\u2005\u2008\u2004\u2005\u200e\u202f\u200e\u200a\u202f\u2005\u180e\u2005\u2004\u200d\ufeff\u200a\u1680\u2000\u200e\u200c\u00a0\u2001 \u2006\u202f\u200f\u200a\u180e\u180e\u2005\u2001\u2002\u2003\u2005\u2003\u3000\u200e\u2000\u2008\u1680\u200c\u200b\u205f\u200f\u200c\u2006\u2002\u2009\u2000\u180e\u2001\u00a0\u200f\u00a0\u2004\u200e\u180e\u2009\u200f\u2004\u2006 \u200d\u3000\u200a\u3000\u00a0\u202f \u2004\u00a0\u2006\u200d\u2007\u2005\u180e \u202f\u2003\u2005\u200a\u202f\u200a \u205f\u200b\u2005\u200e\u3000\u2003\u2001\ufeff\u00a0\u200a\u2004\u2003\u200c\u2005\u200b\u200b\u180e\u205f\u2006\u200b\u202f\u2002\u00a0\u200a\u200a\u2003\u2009 \u2001\u200b\u200c\u2003\u2008\u200c\u2008\u00a0\u2000\u3000\u200f\u202f\u00a0\u2003\u2007\u202f\u3000\u2000\u2002\u200e\u2003\u200f\u3000\u200c\u200f\u2004\u200d\u202f \u1680\u200d\u200f\u2001\u2001\u00a0\u2008\u202f\u202f\u1680\u200b\u200a\u200a\u2003\u1680\u200d\u2005\u200c\u205f\u2000\u180e\u2003\u200c\u2006\u2001\u2000\u2006\u2005\u3000\ufeff\u200a\u180e\u200f\u200a\u2001\u2006\u2003\u200e\u2006\u2004\u2004\u2003\u2006\u2005 \u2001\u205f\u200d\u00a0 \u180e\u205f\u2006\ufeff\u2001\u2006\u2009\u2005\u205f\ufeff\u200d\u00a0\u200f\u200d\u200a\u200a\u205f\u200f\u200d\u2002\u2004\u180e\u2009\u200b\u200c\u2007 \ufeff \u200f\u2001\u200a\u200e\u2006\u2001\u200e\u200e\u2007\u2007\u2008\u2008\u202f\u200a\u200f\u2009\u2007\u200e\u205f\u2006\u200a\u200f\u200e\u00a0\u2005\u2005\u2004\u2006\u2003\u00a0\u202f\u2002\u2004\u2008\u200d\u2001\u200d\u202f\u2003\u200d\u200a\ufeff\ufeff\u2003\u2005\u2005\u2007\u2008\u2006\u200f\u2006\u200e\u2004\u202f\u2004\u2000\u205f\u2002\u00a0\u205f\u2007\u2002\u2008\u202f\u200d\u2001\u2002\u1680\u200d\u200d\u2007\u200e\u200e\u2001\u2008\u180e\u200e\u200b\u200b\u2006\u200f\u2008\u2003 \u2003 \u2001\u2007\u2005\u2003\u2001\u2001\u2003\u2009\u3000 \ufeff\u2007\u200d\u180e\u2003\u200e\u200f\u2006 \u2006\u2008\u2005\u2004\u180e\u205f\u00a0\ufeff\u3000\u3000\u2000\u2002\u200a\u205f\u2002\u200d\u200b\u2000\u2002\u2005\u200a\u2005\u3000\u2005\u200d\u2001\u1680\u2009\u3000\u2006\u3000\u2002\u2002\u00a0\u2000\u200b\u2004\u205f\u3000\u2009\u2008\u2001\u200b\u205f\u205f\u180e\u200d\u3000\u200d\u3000\u202f\ufeff\u2005\u2005\u2003\u200e\u2003\u200a\u200b\u202f \u205f\u200e\u2008\u202f\u200f\u1680\u2003\u200f\u200d\u2003\u200c\u2003\u200b\u2004\u200a\u200c\u2002\u200a\u200a\u202f\u202f\u2001\u3000\ufeff\u2007\u3000\ufeff\u2009\u2009\u1680\ufeff\u2003\u202f\u2001\u2000\u200c\u200d\u205f\u2009\u200c\u2009\u200a\u200f\u200d\u00a0\u200e\u200f\u1680\u202f\u200a\u200b\u205f\u2004\ufeff\u200f\u3000\u200b\u2000 \u00a0\u2005\u2007\u2008\u205f\u200b\u200a\u200b\u200b\u2006\u2009\u200b\u200f\u200c\u180e \u3000\u205f\ufeff\u00a0\ufeff\u2007\u2009\u200a\u2006\u2005\u205f\u00a0\u2008\u2006\u200d\u2006\u180e\u2002\u200f\u200e\u202f\u205f\u2004\u180e\u2003\u200f\u2008\u3000\u00a0\u2000\u2003\ufeff\u200d\u2002\u2009\u2009\u200c\u200c\u180e\u2005\u3000\u200d\u2003\u200f\u2004\u00a0\u1680\u2004\u200a\u205f\u180e\u2001\u2000\u200b\u2009\u2009\u1680\u200c\u2008\u2007\u2008\u2008\u200c\u180e\u2004\u202f\ufeff\u200b\u200e \u2004\u2008\u2001\u2005\u200b\u202f\u2001\u200a\u2001\u200c\u200d\u2009\u200e\u1680\u2001\u2002\u1680\u202f\u180e\ufeff\u200d\u2006\u2002\u180e\u2001\u2008\u2004\u205f\u2005\u200d\u205f\u2000\u1680\u2006 \u200f\u200b\u200d\u200c\u3000\u2005\u180e\u200f\u200d\u180e\u205f\u00a0\u200b\u202f\u2007\ufeff\u2007\u2008\u200b\u2007\u2008\u2008\u205f\u1680\u2008\u3000\u2001\u2005\u2007\u180e\u00a0\u2006\u2008\u2009\u2000\u200a\u200f\u205f\u202f\ufeff\u200f \u2000\u2005\u200b\u200c\u3000\u200d\u2003\u1680\u200c\u2006\u2000\u2004\u1680\u200a\u2007\u200c\u200c\u205f\u2006\u00a0\u205f\u2006\u2008\u2004\u200b\u2002\u200c\u200d\u200c\u200b\u200b\u200c\u2009\u2009\u202f\u2009\u2008\u2004\u180e\u2007\ufeff\u202f\u2004\u200d\u2004\u2006 \u180e\u1680\u202f\u2006\u1680\u200f\u1680\u1680\u2008\u202f\u200d\u2006\u3000\u202f\u2009\u00a0\u2005\u3000\u2005\u3000 \u2002\u2009\u2000\u200c\u202f\u2003\u2003\u3000\u2008\u200e\u202f\u2008\u3000\u3000\u2002\u200d\u2007\u202f\u2009\u2004\u200b\u2006\u2001\u2000\u2005\u200a\u2008 \u3000 \u2005\u2004\ufeff\ufeff\u200c\u2006\u2005\u2002\u200c\u205f\u2008\u2001\u2008\u2007\u2004\u202f\u2003\u3000\u2000\u2001\u2002\u180e\u2007\u2005\u1680\u1680\u2002\u2006\u2001\u202f\u200a\u2002\u200a\u2003\u200b\u200a \u200c\ufeff\u2001\u2001\u200c\u200b\ufeff\u200c\u2007\u2007\u200d\u2003\u2002\u200e\u200d \u2002\u2003\u2002\u2006\u1680\u2003\u00a0\u180e\u200c\u2002\u205f\u2004\u200c\u180e\u2007\u200f\u205f\u2009\u200f\u2003\u200a\u2009\u2000\u2002\u205f\u2008\u00a0\u200f\u2000\u200f\u2006\u200a\u200c\u2000\u205f\u200c\u180e\u2005\ufeff\u200f\u200e\u202f\u200b\u200a\u2001\u2009\u200d\u2007\u00a0\u200f\u200d\u2006\u2003\u200d\u2003\u202f\u180e\u200d\u200a\u3000\u200e\u200b\u2002\ufeff\u2006\u200f\ufeff\u2005\u2005\u205f\u2002\u205f\u00a0\u1680\u00a0\ufeff\u200f\u200a\u2009\u2001\u3000\u180e\u2004\u2002\u202f\u2001 \u2004\u200e\u200f\u1680\u2005\u180e\ufeff\u200f\u180e\u180e\u200e\u200f\u2006\u200c\u200e\u202f\u00a0\u200a\u200c\u200c\u3000\u2004\u1680\u180e\u1680\u202f\u200c\u200d\u200e\u200d\u202f\u2002\u2001\u2006\u200a\u180e \u2003\u00a0\u200c\u200a \u2008\u2001\u200a\u2002\u200a\u200f\u180e\u1680\u2000\u200d\u2005\u200d\u200b \u2003 \u2008\u200f\u2008\u1680\u2008\u2009\ufeff\u2003\ufeff\u202f\u2001\u2007\u3000\u200f\u1680\u180e\u200f\u205f\u3000\u202f\u200d\u202f\u2007\ufeff\u2009\u1680\u200c\u200f\u202f\u180e\u2008\u2007\u205f\u200d\u2009 \u3000\u202f\u200a\u2007\u2001\u2008\ufeff\u2003\u180e\u180e\u2008\u2002\u2003\u2000\u2005\u2004\u2001\u2007\u2004\u2007 \u2003\u200b\u200f\u2001\u3000\ufeff\u200e\u2007\u205f\ufeff\u200c\u200c\u2005\u200b\u2003\u202f\u180e\u2006\u202f\u200e\u2005\u202f\u2008\u202f\u2004\u200a\u200b\u2009\u2007\u200d\u2003\u200c\u2004\u2009\u200f\u200a\u2000\u180e\u200c\u200f\u200b\u2002\u2000\u2008\u1680\u1680\u2006\u200b\u3000\u2007 \u205f\u200c\u202f\u200e\u2002\u180e\u200c\u200a\u200b\ufeff\u180e\u200e\u00a0\u200a\u2003\u180e\u2006\u2008\u180e\u2009\u2004\u2003 \u2001 \u2004\u200b\u202f\u205f\u2009 \u2000\u200f\ufeff\u200d\u2003\u200b\u202f \u2006\u2006\ufeff\u200e\u2005\ufeff\u2002\u2008\u2006\ufeff\u200f\u1680 \u00a0\u200b\u2004\u2004\u180e\u1680\u2002\ufeff\u180e\u2008\u1680\u2006\u2006\u2004\ufeff\u2007\ufeff\u200a\u2003\u202f\u1680\u2001\u200d\u2003\u2003\u200c\u2004\u2007\u2001\u00a0\ufeff\u202f\u3000\u202f\u00a0\u3000\u200b\u2002\u2007\u2007\u3000\u200e\u200b\u2001\u2005 \u2009\u200e\u1680\u2005\u200d \ufeff\u2002\u2004\u200e\u2003\u200c\u2006\u2009\u202f\u2008\u2000\u200d\u2007\u2008\u2005\u3000\u2006\u2009\u00a0\u2005\u2000\u2008\u2008\u200f\u2006\u00a0\u180e\u200f\u2006\u2009\u202f\u2002\u00a0\u180e\u180e\u2005\u200d\u202f\u202f\u2007\u200e\u2008\u200e\u202f\u200c\u200f\u2001\ufeff\u00a0\u2008\u200d\u2004\u205f\u2001\u2000\u202f\u200c\u200c\u2007\u2005 \u00a0\u200c\u180e\u205f\u200f\u2007\u2004\u3000\u2001\u200f\u202f\u2000\u205f \u2003\u2003\u200e\u1680\u200f\u2008\u200d\u2002\u2008\u00a0\u200e\u2007\u2006\u2004\u200f\u2006\u180e\u2007\u2008\u2005\u200d\u2004\u2002\u180e\u200c\u202f\u180e\u2002 \u2009\u205f\u2000 \u2009\u2002\u2004\u1680\u200e\u200b\u00a0\u00a0\u2007\u2006\u2008\u180e\u2000\ufeff\u1680\u3000\u00a0\u2003\u2001\u200b\u180e\u200a\u205f\u2004\ufeff\u2003 \u3000\u2003\u2005\u00a0\u200c\u200e\u202f\u200b\ufeff\u2008\u205f\u200c\u205f\u200b\u3000\u2002\u00a0\u2008\u2009\u2005\u200b\u1680\u2001\u200c\u200b\u2000 \u2006\u2002\u2001\u2000\u2001 \u200f\u2003\u2005\u200e\u2004\u180e\u200a\u2002\ufeff\u2000\u2009\u00a0\u202f\u200f\u200c\u00a0\u2009\u1680\u200a \u200f\u180e\u2002\u2008\u200a\u2007\u2002 \u202f\u200c\u2001\u200d\u2009\ufeff\u2006\ufeff\u2003\u200d\u2002\u2001\u200d\u202f \u200d\u200c\u00a0\u200b\u2008 \u200b\u1680\u2001\u3000\u200c \u2000\u3000\ufeff\u180e\u2003\u200c\u2002\u2006\u200f\u2008\u2001\u200a\u2001\u180e\u2006\u205f\u200f\u202f\u2005\u2009\u2000\u2008\u2000\u2009\u2002\u200e\ufeff\u2004\u1680\u2004\u2000\u2003 \u200a\u3000\u00a0\u202f\u2007\u205f\u180e\u200e\u00a0\u2005\u3000\u200f\u200c\u3000\u200d\u2004\u2004\u2008\u2009\u200e\u200e\u200f\u2007\u3000\u2005\u200b\u2004\u2007 \u180e\u2001\u2001\u180e\u2001\u200c\u2001\u2009\u200a\u2005\ufeff\u1680\u200e\u180e\u2001\u2004\u200b\u2004\u2006\u200f\u2003\u205f \u2004\u3000\u2004\u200b\u3000\u200e\u2002\u2003\u202f\u200d\u200d\u200a\u2003\u200e\u2002\u2003\ufeff\u2009\u2009\u2006\u205f\u2004\u205f\u2009\u200a\u205f\u2007\u2007\u2006\u2008\u205f \u2009\u3000\u2009\u00a0\u2005\u2004\u200d\u3000\u2003\u2006\u2005\u2008\u200b\u200f\u2009\u180e\u2005\u2002\u2003\u200c\u2005\u3000\u2008\u1680\u2006\u205f\u2008\ufeff\u200a\u200c\u200d\u200f\u3000\u2002\u202f\u205f\u202f\u00a0\u2002\u200a\u2002\u2004\u200d \u200b\u200a\u200e\u2001\u180e\u180e\u2004\u2000\u2003\u1680\u200f\ufeff\u2001\u200a\u2005\u205f\u2004\u2000\ufeff\u2005\u200d\u2004\u200a\u2009\ufeff \u202f\u2007\u2008\u1680\u200a\u00a0\u2000\u2008\u200b\u205f\u200a\ufeff\ufeff\u205f\u200b\u2000\u200f\u2001\u202f\u200c\u200c\u2008\u2006\u180e\u3000\u2002\u180e\u205f\u2008\u205f\u180e\ufeff\u00a0\u2004\u3000\u200a\u2004\u1680\u1680 \u200c\u2004\u200d\u200b\u180e\u1680\u200b\u200b\u180e\u2001\u205f\u200a\u2003\u200a \u2009\u200c\u2007\u205f\u3000\u2007\u2006\u2001\ufeff\u200b\u00a0\u3000\u1680 \u2009\u2004\u2009\u2000\u200d\u200f\u200c\u2004\u2009\u2006\u200c\u2003\u2009\u00a0\u2009\u200f\u00a0\u2001\u2006\u180e \u2000\u200c\u1680\u1680\u2002\u2001\u2003\u1680\u2004\u3000\u200c\u3000\u2002\u2002\u2000\u200c\u2002\u00a0\ufeff\u00a0\u2005\u2006\u2004\u2006\u2007\u2000\u200c\u202f\u200e\u200c\u200a\u2006\u205f\u00a0\u200a\u205f\u202f\u2009\u202f\u2009\u2006\u200e\u2001\u2007\u2003\u2009\u205f\u2001\u180e\u2005\u202f\u200a\u200c\u3000\u205f\ufeff\u202f\u200c\ufeff\u2009 \u2002\u200e\u200a\u2002\u200d\ufeff\u205f\u2008\u2006\u200c \u200f\u2006\u200b\u2002\u200f\u2008\u3000\u200e\u2005\u200e\u200e\u2001\u2005\u200d\u180e\u180e \u2003\u200d\u200b\u2000\u3000\u00a0\u2003 \u205f\u2000\u1680\u200d\u2004\u2000 \u200a\u2006\u00a0\u205f\u2001\u2007\u2003\u2000\u202f\u180e\u200e\u2003\u200d\u1680\u200a\u2000\u2000\ufeff\u2004\u200f\u202f\u2000\u2002\u200d\u202f\u2002\u2006\u200b\u2002\u205f\u200f\u2000\u200a\u200c\u2008\u200f\u2002\u2006\u2004\u2001\ufeff\u1680\u2000 \u2005\u2007\ufeff\u180e\u2000\u2009\u00a0\u200a\u202f\u2002\u00a0\u2001\u2009\ufeff\u3000\u2007\u2002\u2006\u2002\u180e\u200a\u2002\u200f\u2004\u200b\u205f\u200c\u2002\u00a0\u2008\u2008\u200d\u2001\u2001\u205f\u2007 \u180e\u200c\u200b\u2008\u200b\u200d\u2003\u200c\u2009\u2004\u200f\u2001\u2004\u200e\u00a0\u200f\u2003\u2007\u2003\ufeff\u00a0 \u200f\u2001\u2003\u2008\u200f\u2004\u00a0\u2001\u180e \u2004\u180e\u2005\u2000\u200f\ufeff\u2002\u3000\u200c\u205f\u200d\u2003 \u200a\u180e\u200c\u180e\u200c\u2009\u2004\u200c\u200d\u2009\u2006\u1680\u200e\u200b\u2003\u202f\u2001\u2008\u2003\u2001\u3000\u2003\u2003\u2003\u200b\u00a0\u200e\u205f\u1680\u200d\u2004\u200f\u200e\u2009\u2009\u2007\u200a\u202f\u1680\u3000\u200d\u200d\u2002\ufeff\u2001\u00a0\u205f\u3000\u2003\u2001\u200c\u2005\u2004\u200c\u200a\u200a\u2006\u205f\u202f\u3000\u200f\u200f\u2007\u200b\u200d\ufeff\u00a0\u2007\u2002\u2005\u2003\u2005\ufeff\u200f\u2005 \u200f\u2003\u2007\u2002\u2009\u2000\u2003\u205f \u200f\u2003\u200c\u2007\u200f\u00a0\u205f\u2008\u2000 \u2003\u1680\u00a0\u2009\u202f\u2006\u2001\u200a\u1680\u2009\ufeff\u2007 \u2008\u205f\u205f\u2007\u200b\u200d\u2008\u2007\u2009\ufeff\u2002\u200e\u2004\u2005\u2003\u200f\u2003\u2003\u200a\u2000\u2004\u2004\u200b\u205f\u2006\u202f\u200a\u200b\u2004\u180e\u2003\u3000\u2006\u202f\u2005 \u2004\u200b\u3000\u2001\u200b\u2008\u200f\u3000\u2008\u2006\u2005\u202f\u2004\u2001\u2007 \u00a0\u2002\u200f \u2005\u2000\u00a0\u2004\u2005\u2004\u202f\u2005\u2003\u1680\u200f\u2008\u2004\u2002\u200e\u200f\u200a\u2000\u202f\u2002\u2003\u2002\u2007\u00a0\u2007\u200a\u2006 \u2004\u205f\u202f\u202f\u2007\u2001\u2000\u2001\u200c\u2001\u2002\u3000\u1680\u200a\u2005\u2000\u200e\u180e\u2009\u202f\u200d\u200c\u2009\u2005\u2007\u2004\u00a0\u200d\u180e\u2005\u2009\u2001\u2001\u2001 \u2008\u205f\u2007 \u2004\u3000\u2007\u2003\ufeff\u2009\u200f\u2004\u200b\u2009\ufeff\u200f\u2003 \u3000 \u2000\u200e\u200e\u00a0\u2007\u2004\ufeff\u200e\u00a0\u202f\u200c\u200f\u1680\u200c\u2001\u2009\u2008\u205f\u2008\u200d\u205f\u202f\u2008\u2008\u3000\u1680\u200b\u1680\u2001\u200d\u2007\ufeff\u202f\u200f\u1680\ufeff\u2003\u00a0\u2007\u2003\u2007\u200f\u202f\u200d\u200d\u2008\u200d\u2003\u200f\u202f\u200f\u200b\u2005\u3000\u200e\u2001\u200d\u2008\u2009\u200b\u200c\u2008\u2006\u1680\u1680\u200d\u200a\u200a\u200d\u200e\u2004\u200c \u200b\u202f\u2002 \u200f\u2000\u2007\u2000\u200c\u2008\u00a0\u2005\u200e\u2000\u205f\u2005\u200f\u180e\u205f\u180e \u2006\u2002 \u2000\u2008\u2009\u200e\u2003\u2008\u1680\u180e \u200e \u2004\u200a\u2002\u2000\u2006\u200d\u200e\u180e\u200c\u200e\u1680\u1680\u200a\u2003\u00a0\u200b\u202f\u200e\ufeff\u180e\u2009\u2008\u2008\u200e\u2008\u2000\u200f\u2006\u2008\u00a0\u200e\u2005\u2007\u00a0\ufeff\u2005\u180e\u1680\u205f\u2004 \u2007\u2000\u200f\u2003\u2001\u200e\u3000\u200a\u200b \u2006\u1680\u2001\u200a\u00a0\u200a\u2005\u2007\u202f\u2006 \u200b\u200b\u2002\u2008\u200d\u2000\u205f\u200e\u2009\u205f\u2007\u2004\u2002\u3000\u200d\u200e\u200a\ufeff\u202f\u200a\u2009\u200e\u2003\u200a \u2006\u202f\u202f\u2005\u00a0\u2006\u200e\u2005\u2008\u2001 \u3000\u202f\u200a\u180e\u200a\u2009\u200b\u2001\u2003\u202f\u200e\u205f\u3000\u200a\u200d\u200b\u2003\u2000\u202f\u202f\u2004\ufeff\u2007\u2000\u2001\u202f\u200b\u2004\u2009\u2007\u200f\u180e\u2002\u200f\u200b\u200e\u205f\u2002\u2004\u200d\u180e\u200d\u200b \u1680\u200a\u180e\u2007\u202f\u2003\u00a0\u200f\u2000\u00a0\u2006\u180e\u200d\u2002\u2006\u2008\u2006\u2005\u1680\u2008\u200c\ufeff\u202f\u200e\u2005\u200f\u200f \u200b\u2008\u200b\u200d\u200a\u200d\u180e\ufeff \u3000\u2001\u200c\u200e\ufeff\u200f\u3000\u2005\u2004\u2000\u200b\u2005\u2000\u2001\u2003\u2004\u2007\u200e\u2001\ufeff\u200a\u2000\u2003\u200b\u2008\u205f\u2007\u2002\u202f\u205f\u2004\u200b\u2004\u180e \u2008\u200d\u180e\u2008\u2001\ufeff\u200d\u2008\u2004\u1680\u2005\u205f\u2004\u2005\u205f\u200e\u2001\u200e\u200d\u200f\u205f\u2002\u00a0\u1680 \u2000\u2003\u2005\u3000\u2006\u2005\u2008\u2008\u2002\u2001\u2002\u200d\u200c\u2008\u3000\u2004\u200f\u2000\u2009\u200c\ufeff\u200e\u200c\u205f\u180e\u1680\u200b\u200e\u180e\u2009\u1680\ufeff\u200a\u2000\u202f\u2005\u3000\u2006\u2008\u200a\u1680\u2000\u200d\u3000\u200e\u00a0\u200b\u2008\u2007\u200f\u2003\u1680\u2005\u3000\u200f\u200e\u200d\u180e\u200e\u00a0\u2000\u200e\u3000\u2007\u200f\u200c\u2006\u200e\u200f\u2004\u2004\u2009\u2003\ufeff\u2002\u2007\u2003\u2006\ufeff\u2000\ufeff\u3000\u2002\u2000\ufeff\u202f\u2001\u3000\u200c\u200b\u2006\u2005\u2005\u00a0\u2007\u200d \u2006\u2009\u2004\u2008\u200b\u200f \u2009\u200d\u200b\u200c\u2006\u200e\u200a\u3000\u2001 \ufeff \u2000\u00a0\u2000\u2002\u200c\u2005\u3000\u2002\u2009\u200d\u2009\u2003\u200f\u00a0\u205f\u200a\u3000\u2005\u200a\u2001\u1680\ufeff\u200e\u202f\u1680\u2002\u2002\u200e\u200c\u200c\u3000\u2006\u200a\u200a\u200c\u2000\u1680\u2002\ufeff\u2004\u2005 \u2009\u180e\ufeff\u2006\u00a0\u00a0\u200d\u2005\u1680\u2008\u3000\u2008\u202f\u200c\u202f\u2003\u200d\u202f \u202f\ufeff\u2001\u200e\u3000\u2005\u2002\u2000\u3000\ufeff\u2004\u2005\u200f\u2006\u180e\u2003\u205f\u180e\u200b\u2003\u2007\u2009\u200d\u00a0\u200e\u3000\u2006\u200a \u1680\ufeff\u1680\u2008\u2005\u2000\u2008\u2001\u200d\u200a\ufeff\u2006\u200e\ufeff \u2008\ufeff\u2007\u00a0\u180e\u200e\u180e\u200a\u200f\u2009\u200e\u202f\u180e\u3000\u00a0\u200a\u200c\u202f\u2000\u200b\u2003\u2009\u200f\u200a\u2008\u2008\u2002\u2006\u200b\u2008\u200f\u180e\u205f\u200a\u200e \u2006\u200b\u202f\u205f\u2006 \u200f\u2000\u200e\u2002\u2001\u1680\u2008\u205f\u2004 \u2000\u2001\u202f\u2008\u205f\u200b\u180e\u2000\u180e\u200e\u200b \u2005\u00a0\u200b\u200e\u200b\u200a\u202f\u2000\u202f\u200a\u2004\ufeff\u2009\u2005\u200d\u2004\u202f\u2006\u200e\u3000\u2005 \u205f\u1680\u00a0\u2006\u00a0\u2007\u205f\u202f\u00a0\u180e\u2007\ufeff\u2009\u200f\u200d\u3000\u2003\u2000\u200d\ufeff\u2000\u2009\u2006\u2007\u2001\u200a\u2002\u200f\u2001\u2006\u200d\u00a0\u2003\u2001\u2001\u2001\u2005\u1680 \u2001\u2006\u3000\u205f\u2004\u200e\u200e\u2003\u200f\u3000\u2002\u200b\u205f\u2009\u2002 \u2002\u202f\u00a0\u1680\u205f\u2001\u2009\u2001\u200a\u3000\u180e\u2004\u200e \u2001\u200b\u00a0\u200b\u2007\u1680\u200f\u202f\u2006\u200a\u2002\u202f\u2002\u200f\u2003\u2003\u200d\u2009\u200b\u200d\u00a0\u2001\u2003\u200a\u1680\u2002 \u200e\u2001\u3000\u2000\u205f\u200f\u2001\u200c\ufeff\u3000\u1680\u2003\ufeff\u2002\ufeff\u200d\u1680\u2006\u200f\u2004\ufeff\u1680\u2003\ufeff\u202f\u2003 \u200c\u180e\u2003\u2007\u205f\u00a0\u2003\u205f\u2006\u2009\u180e\u00a0\u2007\u2008\u180e\u3000\u2009\u2009\ufeff\u200a\u200d\u200d\u200f\u180e\u200a\u2003 \ufeff\u200b\u2001 \u2006\u2008\u200a\u2002\u202f\u2007\u2007\u3000\u2005\u1680\u202f\u3000\u2007 \u3000\u2004\u2008\u200b\u180e\u200f\u2001\u200b\u200a\u200c\u200a\u1680\u200d \u2001\u2006\u200f\ufeff\u200c \ufeff\u200b\u2001\u180e\u2000\u200d\u200c\u2009\u200e \u202f\u200c\u2008\u00a0\u2005\u200e\u2005\u2002\u2003\u2001\u200d\u2005\u180e\u2007\u200f\u2003\u202f\u2004\u2002\u2004\u200c \u2006\u2009\u200e\u2005\u2000\ufeff\u1680 \u2007\u2004\u1680\u00a0\u200f\u200e\u200c\u200f\u2002\u2009\u3000\u200c\u200b\u2006\u200e\u200d \u180e\u2002\u2001\u2004\u2003\u00a0\u2000\u1680 \u2007\u200c\u200c\u202f\u200e\u202f\u3000\u200f\u2000\u200f\u2002\u2003\u2003\u2009\u2008\u200f\u1680\u200c\u200d\u2005\u2002\u00a0\u3000\ufeff\u2004\u2000\u00a0\u200f\u2001\u3000\u200f \u2003\u2006\u180e\u2008\ufeff\u200d\u180e\u200a\u2003\u2005\u2007\u2007\u1680\u1680\u2000\u200b\u2005\u200e\u2004\u3000\u180e\u2002 \u200a\u1680\u2002\u200c\u2008\u2005\u200d\u200f\u200f\u200e\u2001\u200f\u3000\u200a\u202f\u2001\u3000\u2004\u200f\u2002\u200d\u200a\u2002\u1680\u1680\u2004\u202f\u2009\u2002\u2009\u180e\u2005\u2003\u205f\u2002\u2006\u200d\u200f\u00a0\u2005\u3000\ufeff\u2005\u3000\u2008\u200e\u2002\u2007\u200f\u1680\u2003\u200e\u202f\u2004\u2000\u2003\u202f\u200b\u2003\u202f\u200a\u1680\u200c\u200e\u1680\u2009\u200c\u2005\u2009\u2009\u2009\ufeff\u200d\u2004\u3000\u2008\u2007\u2000\u200b\u00a0\u200b\u2000\u2000\u200e\u2008\u200b\u3000\u200b\u202f\u00a0\u1680\u2005\u00a0\u200d\u200f\u2009\u2008\u200b\u2000\u1680\u2009\u200b\u205f\u3000\u2008\u200b\u2003\u200b\u2002\u2003\u202f\u205f\u2004 \u1680\u2002\u00a0\u3000\u2007\ufeff\u205f\u202f\ufeff\u2009\u200d\u200e\u1680\u200b\u202f\u200a\u2006\u2005\u2008\u2006\u200d\u2003 \u2001\u2009\u200f\u202f \u200a\u1680\u2000\ufeff\u200d\u2005\u2003\u2009\u200e\u2004\u1680\u200c\u200b\u3000\u200c\u2001\u2005\u2005\u2003\u2002\u2000\u2000\u200b\u2001\u2006\u2006\u200b\u2009\u2008\u2002\u2005\u200d\u00a0\u200e\u200f\u202f\u2002\u205f\u200c\u202f\u2000\u200b\u3000\u2004\u200f\u202f\u200a\u2001\ufeff\u2008\u200f\u2005\u00a0\u00a0\u202f\u2008\u200f\u2003\u2003\ufeff\u200d\u3000\u202f\u200f\u1680\u2000\u2002\u2002\ufeff\u202f\u2002\u2001\u2000\u200c\u2007\u180e\u2005\u1680\u200a \u2002 \u2001\u205f\u2003\u2009\u2000\u202f\u200d\u202f\u2009\u200e\u2009\u2000\u1680\u200b\u180e\u200a \ufeff\u2001\u2008\u202f\u202f\u200f\u200f\u200a\u200f\u2003\u1680\u00a0\u2006\u180e\u200f\u200f\u200e\u2007\u2004\u200c\u200f\u2008\ufeff\u200a\ufeff\u2006\u1680\u200e\u3000\u180e\u2001\u2009\u2002\u2005\u2004\ufeff\u2000\u2003 \u200a\u1680\u2008\u202f \u200c\u2008\u00a0\u200b\u2006\u200f\u200d\u2008\u180e\u3000\u2001\u2005\u3000\ufeff\u2000\u200a\u2003\u2009\u200e\u2009\u2008\u2007\u2001\u180e\u2002\u2002\u2004\u2002\u200b\u2007\u3000\u2007\u2005\u200e\u2006\u200c\u200a\u200a\u2001\u200f\u2004\ufeff\u2005\u200f\u202f \u2004\u180e\ufeff\u2009\u202f\u200a\u200d\u00a0\u2006\u200c\u2008\u202f\u1680\u2003\u1680\u2004\u2008 \u200c\u2002\u2001\u202f\u200e\u2009\u202f\u2005\u2004\u2001\u202f\u2004\u00a0\u1680\u2000\u200d\u2004\u202f\u200e\u2000\u2005\u202f\u180e\u2002\u2007\u205f\u00a0\u2000\u200b\u2002\u2001\u200d\u200b\u2004\u3000\u2005\u2006\u202f\u00a0 \u2009\u2007\u200b\u200b\u2008\ufeff\u2001\u180e\u200b\u2005\u180e\u1680\u202f\u200d\u2004\u1680\u2001\u3000\u2000\u2004\u200d\u200d\u2002\u2001\u2001\u202f\u00a0\u200a\u180e\u2001\u2007\u2003\ufeff\u2004\u2006\u2004\u200a\u2000\u00a0\u180e\u2009\u2007\ufeff\u2005\ufeff\u2006\u200b\u3000\u200a\u2007\u2006\u2000\u00a0 \u200e\u2002\u200c\u2006\u3000\u202f\u200d\u2002\u200f\u2000\u200c\u2006\u2007\u200b\u180e\u202f\u200f\u200b\u2005\u205f\u3000\u202f\u00a0\u2007\u2005\u200d\u2008\u2006\u200e\u2009\u2002\u200f\u180e\u200a\u200a\u2005\u2008\u200c \u200b\u200f\u200f\u1680\u180e\u200d\u2004 \u2009\u200a\u2005\u2003\u2003\u3000\u3000\u2005\u200e\u2003\u1680\u200a\u3000\u00a0\ufeff\u2008\u200e\u200f\u200d\u205f\u2004\u2001\u200f\u205f\u2007\ufeff\u3000\u200c\u200b\u200a\u00a0\u2003\u200f\u200a\u2000\u200c\u200f\u200e\u180e\u205f\u200d\u205f\u3000\u2004\u1680\u3000\u200c\ufeff\u3000\u2009\u200f\u2003\u2008\u2006\u200a \u200f\u202f \u00a0\u2008\u202f\u2008\u2002\u200a\u2000\u200b\u2004\u2004\u200e\u200e\u1680\u2006\u202f\u2008\u202f\u200e\u00a0\u2009\u205f\u200a\u2002\u200b\u2005\u2000\u202f\u2009\u2004\u2000\u200d\u2009\u2008\u180e\u2000\u2000\u180e\u2004\u2005\u2005\u2002\u3000\u2002\u2001\u205f\u2006\u2008\u200a\u00a0\u2003\u200b\u205f\u2003\u202f\u2008\u180e\u2007\u2001\u2009\u200b\u2000\u2007\u2001\u3000\u2005\u1680\u2000\u2008\u200d\u2002\u202f\u00a0\u2005\u2005\u2002\u200b\ufeff\u200b\u2001\u2003\u202f\u200e\u200b\u205f\u202f\u2009\u2006\u1680\u2009 \u200f\u200c\u205f\u180e\u2000\u3000\u180e\u00a0\u2001\u2000\u3000\u200f\u2006\u2007\u200a\u2006\u200f\u200c\u200d\u200c\u2003\u2007\u2003\u200e\u2005\u2001\u200c\u3000\u180e\u2008\u2004\u2004\u2009\u200d\u00a0\u200f\u1680 \u2009\u200f\u180e\u2007\u2000 \u2000\u2000\u3000\u2008 \u2002\u200b\u200b\u2009\u2005\u2007\u2003\u3000\u1680\u2001\u1680\u205f\u200f\u2006\u2001\u2001\u200f\u00a0\u2006\u2008\u200b\u2001 \u2000\u2006\u180e\u202f\u200d\u2006\u205f\u2007\u3000\u1680\u2004\u2007\u1680\u200d\u180e\u2006\u2007\u202f\u00a0\u2006\u2003\u2009\u00a0\u200c\u200e\u200c\u200e\u00a0\u200e \ufeff\u2001\u00a0\u2003\u1680\u205f\u2005\u200c\u2004\u2007\u180e\u2006\u200c\u180e\u2002\u202f\u00a0\u180e \u2003\u3000\u200c\u2003\u2007\u2000\u2002\u00a0\u200c\u200a \u200c\ufeff\u2009\u180e\u2001\u2005\u200b\u2009\u2008\u200c\u202f\u200f\u2006\u200f\u205f\u200d\u2006\u2004 \u200f\u2006\u205f\u200e\u200c\u2008\u180e\u200e\u2005\u200f\u2001\u200b\u2001\u2001\ufeff\u200b\u2001\u200f\u2008\u200d\u205f\u2000\u2006\u2006\u2004\u200c\u2006\ufeff\u200a\u2008\u200f \u2004\u200c\u2003\u200f\ufeff\u200e\u2007\u200a\u200f\u2004\u2000\u200d\u2004\u200b\u200d\u200f\u200f\u200d\u1680\u200f\u2006\u202f\u2009\u1680\u200a\u2009\u200c\u2009\u2007\u2006\u2009\u1680\u00a0\u2002\u180e\u2005\u180e\u1680\u200d\u00a0\u200a\u3000\u3000 \u180e\u2004\u205f\u200c\u200d\ufeff\u00a0\u180e\u2003\u200c\u2004\u2004\ufeff\u2004\u3000\u202f\u3000\ufeff\u3000\u200f\u00a0\u205f\u2008\u200e\u180e\u1680\u205f\u1680\u2004\u2003\u200e\u200c\u2002\u2000\u2005\u2009\u200e\u2009\u2008\u202f\u200a\u205f\u2003\u2000\u3000\u2005\u2007\u200a\u3000\u200c\u1680\u2008\u2007\u2009\u2009\u2009\u2007\u3000\u200c\u200a\u2000\u200b\u200a\u2008\u2000\u00a0\u2000\u200f\u00a0\u2002\u2007\u200b\u2008\u2003\u00a0\u202f\u200d\u2003\u205f\u2009\u2008\u200f\u200b\u2004\u00a0\u180e\u3000\u202f\u2008\u205f\u2008\u2003\u2007\u2002\u2009\u200e\u2008\u2004\ufeff\u200f\u2002\u2007\u180e\u2004\u2002\u200b\u200b\u200d\u205f\u180e\u2004\u202f\u2008\u2009\u00a0\u2004\u2009\u2001\u205f\u3000\u2008\u200f\u200a\u2006\u200b\u202f\u00a0\u1680\u200e\u2002\ufeff\u200f\u2000\u200c\u3000\u2007\u200c\u200d\u200f\u200b\u2008\u200b \u200f\u200e\u2006\u2008\u2008\u2008\u2003\u205f\u1680\u2009\u2004\u202f\u2003\u00a0\u1680\u2008\u205f\u00a0\u2003\u2000\u2007\u2008\u200f \u00a0\u2003\u2009\u2007\u2006\u2003\u2007\u1680\u2007\u2001\u2002\u2000\u00a0\u180e\u2002\u200f \u2009\u2002\u200b\u2005\u200a\u1680\u2001\u2006\u2007\ufeff\u2006\u2003 \u200d\u00a0\ufeff\u2004\u1680\u2004\u202f\u200d\u2008\u205f\u2001\u2006\u3000\u200a\u2008\ufeff\u00a0\ufeff\u2008\u2006\u00a0\u2002\ufeff\u3000\u2008\u205f\u2001 \ufeff\u200f\u2007\u2008\u2009\u200a\u200a\u2002\u1680\u180e\u200e\u200f\u2002\u2003\u202f\u2008\u180e\u2006\u2003\u2007\u2003\u2005\u200f\u00a0 \u2009\u200d \u2004\u1680\u2002\u2007\u200b\u2005\u00a0\u2007\u1680\u200e\u202f\u3000\u2009\u2002\u202f\u2003\u2002\u00a0\u2005\u2005\u202f\u2003\u2005\ufeff\u2008\u202f\u2004\u2008\u2006\u200d\ufeff\u2002\ufeff\u2006\u180e\u3000\u3000\u200d\u2002\u2007\u2001\u2001\ufeff\u2008\u200a\u2005\u202f\u200a\u200f\u2006\u2005\u2004\u2009\u200b\u200a\u200e\u2003\u180e\u200d\u200f\u200b\u202f\u200a\u2008\u200a\u200d\u200e\u180e\u2001\u2007\u200f \u200b\u2008\u2005\u2001\u2004\u200c\u2005\u202f\u200f\u200e\u2000\u200f\u1680 \u2004\ufeff\u180e\u200a\u200b\u2003\u2000\u200b\u2002 \u205f\u205f\u2005\u2000\ufeff\u180e\u00a0\u2009\ufeff\u200a\u200b\u2009\ufeff\u00a0\u200b\u200b\u200a\u202f\u2000\u200a\u2003\u205f\u200e\ufeff\u3000\u202f \u2009\u2003\ufeff\u200c\u202f\u200a\u200f\u200c \u180e\u2001\ufeff\u2001\u200a\u2003\u2002\u200f\u2005\u00a0\u2007\u200c\u180e\u2008\u200c\u2004\u1680\u200f\u200a\u200f\u200e\ufeff\ufeff\u2008\u2002\u2007\u2007\u3000\u200f\u200b\u2002\u2005\u2009\u1680 \u180e\u200f\ufeff\u200b\ufeff\u2009\u200f\u2003\u2005\u2004 \u200c\u2008\u1680\u200e\u200d\u200d\u2006\u00a0\u2003\u200d\u205f\ufeff \u2002\u200d\u200b\ufeff\u200a\u2001\u2007\u2003\u180e\u2008\u2001\u1680\u205f\u2005\u2006\ufeff\u2009\u200d\u200d\u180e\u2006\ufeff\u200c\u205f\u2008\ufeff\u2009\u2003\u3000\u2000\u2005\u2009\u1680\u2009\u2007\u2004\u200c\u200b\u2005\u200a\ufeff\u2001\u200e\u200c\u2007\u200a\u2006\u2000\u1680\u2005\u2002\u2009\u2008\u1680\u200a\u00a0\u202f\u2002\u2004\u1680\ufeff\u2001 \u2001\u2007\u2007\u2001\u2007\u2003\u2005\u200a\u2008\u1680\u2006\u2009\u200b\u2002\u1680\u2008\u2001\u2008\u200e \u2007\u2003\u1680\u202f\u180e\u202f\u2009\u2001\u205f\u2004\u200f\u200a\u180e\u2001\u200f\u2009\u2006\u200e\u180e\ufeff\u2005\u2009\u202f\u200c\u2009\u200a\u200f\u2000\u2009 \u2008\u2007\u205f\u3000\u2002\ufeff\u2001\u2002\u200c\u2001\u2001\u2002\u2000 \u2000\u2005\u200b\u2001\u2006\u180e\u180e\u202f\u200e\u2004\u202f\u2004\u2008\u2009 \u2003\u2000\u00a0\u2005\u3000\u202f\u1680\u2001\u2005\u2005\u2006\u2003\u2003\u200c\u2003\u200b\u2009\u200e\u200d\u2002\u00a0\u202f\u202f\ufeff\u2003\u2002\u2000\u200e \u200b\u2007\u200c\u2005\u2007\u2001\u2008\u3000\u2000\u2001\u200c\u2004\u205f\u2002\u200d\u3000\u200f\u2007\u200b\u2009\u200c\u2007\u3000\u2008\u3000\u2002\u200f\u200c\u200e\u202f\u200d\ufeff\u2006\u2009\u1680\u202f\u200d\ufeff\u2002\u200a\u205f\u205f\u202f\u2008\u200e\u2001\u2002\u2005\u200e\u2008\u2003\u2003\u1680\u200d\u2002\u200c \ufeff\u200d\u2000\u200a\u200b\u2002\u2005\u200d\u180e\u2008\u2006\u2001\u2008\u2008\u2001\u2000\u2005\ufeff\u2005\u2002\u205f\u2001\u202f\u2008\u00a0\u2004\u202f\u2006\u2009\u200d\u00a0\u2003\u2001\u200a\u2001\u2002\u200f\u2002\u2005\u2007\u1680\u2000\u2007\u2002\u3000\u200d\u205f\u200d\u202f\u2009\u2004\u200e\u3000\ufeff\u200f\u200c\u180e\u2006\u2002\u2002\u2008\u180e\u2001\u200d\u200f\u2004\u1680\ufeff\u2000\u200e\u180e\u2001\u1680 \u2005\u200c\u2003\u3000\u2002\u2004\u200a\u200e\u2004\u2005\u3000\u2006\u2007\u180e\u2008\u3000\u2009\u1680\u205f\u200d\u200c\u2002\ufeff\u2004\u2004\u2007\u00a0\u200b\u3000\u3000\u202f\u2004\u2009\u200e\u2001\u200a\u2003\u200c\u200a\u2001\u2001\u200e\ufeff\u2008\u200c\u2009\u200e\u180e\u205f\u2006\u2007\u180e\u1680\u1680\u200f\u200a\u200b\u2006 \u180e\u2003\u200a\u2001\u200f\u200a\u2006\u2001\u2009\u200f\u205f\u2008\u2004\u200a\u2004\u2009\u200e\u00a0 \u202f\u2007\u2003\u2000\u200f\u200e\u2003\u1680\u200d \u2005\u2005\u2003\u2005\u200e\u00a0 \u2006\u1680\u202f\u3000\u3000\u200c\u200e\u3000\u200c\u2008\u2000\u202f\u200b\u200f\u205f\u1680\u3000\u2005\u2001\u200f\u2004\u2005\u200b\u2006\u2002\u2005\ufeff\u2006\u2002\u200b\u2005\u2007\u200d\u200a\u2007\u2006\u3000\u2005\u200f\u2005\u200a\u205f\u00a0\u200d\u202f\u2007\u200e\u200b\u1680\u2003\u2002\u205f\u1680\u1680\u2004\u200a\u2001\u2006\u200c\u200b\u200a\u200b\u2008\u200d\u2006\u2008\u2003\u205f\u2007\u200b\u2000\u1680\u2006\u200c\u200a\ufeff\u180e\u2004\ufeff\u202f\u205f\u2008 \u200e\u2003\u3000\u205f\u200b\u2001\u200e\u2001\u200a\u2009\u2008\u2000\u200f\ufeff\ufeff\u2006\u202f\u202f\u202f\u180e\u202f\u2007\u2004\u00a0\u2006\u2003\u202f\u200b\u2005\u3000\u200f\u00a0\u2002\u3000\u2008\u200b\u205f\u2004\u205f\u2006\u2007\u200b\u200a\u2002\u200b\u2009\u180e\u200e\u180e\ufeff\u205f\u200b \u2003\u2008\u2003\u180e\u180e\u205f\u2007\u2001\u200a \u2003\u180e\u180e\u2006\u205f\u200d\u200f\u2001\u200c \u200a\u205f\u2002\u2000\u2004\u200c\u1680\u200a\u2004\u200f\u200d\u200e\u2004\u202f\u00a0\u200a\u3000\u200d\u00a0\u2000\u205f\u205f\u2008\u200f\u2000\u2006\u200d\u2005 \u202f\u200c\u2008\u200d\u2009\u2001\u2003\u2005\u3000\u200c\u2000\u180e\u200e\u180e\u200d\u202f\u2004\u180e\u200b\u2004\u200e\u200b\u200c\u2007\u200b\u202f\u2002\u200c \u200a\u200a\u2009\u200d\u200d\u3000\u2003\u1680\u200f\u200f\u2008\u200b\u2003\u180e\u200b\u2002\ufeff\u00a0\u200a\u2009\u2006\u00a0\u2000\u200d\u180e \u2004\u2007\u2008\u3000\u2000\u2009\u202f\u2006 \u2003\u00a0\u200c\u3000\u200d\u3000\u1680\u2007\u180e\u2000\u2004\u2000\u180e\u205f\u205f\u2003\u200e\u2003\u2007\u2004\u3000\u200f\u200f\u180e\u1680\u200d\u200c \u2006\u00a0\u2003\u205f\u3000\u2007\u2002 \u180e\u2003\u200c\u00a0\u2002 \u200b\u2006\u2002\u2003\u3000\u3000\u200f\u2007\u2008\u2005\u180e\u2007\u200c\u180e\u200b\u205f\u2002\u2005\u180e\u1680\u2005\u205f\u3000\u205f\u2001\u2007\u2001\u205f\u2008\u200d\u2008\u200a\u1680\u200e\u2002\u2000\u2001\u2008\u00a0\ufeff\u2006\u205f\u2005\u2006\u200e\u2006\u3000\u2003\u2006\u200a\u2003\u200b\u2003 \u2006\u1680\u200d\u202f\u205f\ufeff\u200b\u200b\u1680\u200b\u200d\u205f\u200c\u200e\u2002\u2009\u2009\u2007\u2009\u3000\u2001\u2009\u00a0 \u2009\u200a\u1680\u205f\u2004\u2003\u1680\u2004\u202f\u200a\u2008\u2003\u2001\ufeff\u2008\u2005\u2005\u2001\u2006\u200b\u200c\u2008\u2001\u2003\u3000\u00a0 \u202f\u2004\u2000\u200f\u2001\ufeff\u200b\u2001\u202f\u200d\ufeff\u180e\u205f\u202f\u2007\u2000\u200b \u200a\u2000\u200f\u2006\u1680\u2004\ufeff\u200f\u200d\u180e\u2005\u3000\u2008\u180e\u2000\u2009\u00a0\u200a\u2004\u200d\u2005\u00a0\u2000\u200f\u202f\u2001\u2008\u2003\u2008\u2005\u2005\u200a\u00a0\u200b\u2008\u1680\u00a0\u2000\u202f\u200b\u2001\u2000\u200a\u2000\u200e\u2006 \u2009\u2007\u200a\u2006\u200d\ufeff\u200d\u205f\u200e\u1680\u180e\u2005\u00a0\u1680\u180e\u200a\u2001\u200b\u205f\u2000\u1680\u2003\u180e\u2005\ufeff \u2007\u2005\u2004\u2008\u2003\u3000\u2009\u200c\u00a0\u2007\u2003\u00a0\u2002\u180e\u1680\u205f\ufeff\u200d\u202f\u200f \u2008\u2007\u2007\u1680\u2007\ufeff\u00a0\u2004\u00a0\u2001\u2003\u200b\u200c\ufeff\u2001\u205f\u200c\u200a\u200a\u1680 \u200c\u2008\u200b\u00a0\u2003\u2005\u3000\u200e \u200d\u2004\u2009\u2004\u205f\u2008\u2002\u2009\u200f\u200b\u200f\u2007\u200c\u2008\u3000\u200b\u200b\u200b\u200e\u180e\u2004\u3000", MethodType.genericMethodType(1),"\u0670\u0671\u0662\u063a\u0670\u0675\u0660\u0675\u0679\u067b\u0670\u0671\u0678\u063a\u0659\u0675\u067d\u067a", "\u0670\u0672\u064d\u0653\u0657\u0671\u0663\u0672\u065e\u0645\u0645\u062c\u066c\u065a\u0671\u067a", "\u063c\u064f\u0657\u065e\u065d\u063d\u0658\u067e\u0675\u0662\u0675\u063b\u0678\u0675\u067a\u0673\u063b\u0647\u0660\u0666\u067d\u067a\u0673\u062f", 0); + } + + private static String decrypt(String string) { + StringBuilder stringBuilder = new StringBuilder(); + int n = 0; + while (n < string.length()) { + stringBuilder.append((char)(string.charAt(n) ^ 0x614)); // Dynamic - key + ++n; + } + return stringBuilder.toString(); + } + public static CallSite invoke( + MethodHandles.Lookup l, String __, + MethodType methodType, String cn, + String mn, String mdsE, Integer n + ) { +// String cn_ = cn; // alias 1 + String mn_ = mn; // alias 2 +// String mdsE_ = mdsE; // alias 3 + int n2 = n; // unbox + + System.out.println("Method descriptor string => " + InvokeDynamicSample.decrypt(mdsE)); + System.out.println("Class name => " + InvokeDynamicSample.decrypt(cn)); + System.out.println("Method name => " + InvokeDynamicSample.decrypt(mn)); + + MethodType mds = MethodType.fromMethodDescriptorString(InvokeDynamicSample.decrypt(mdsE), InvokeDynamicSample.class.getClassLoader()); + + try { + // TODO: there's probably more + if (n2 == 1) { + return new ConstantCallSite(l.findVirtual(Class.forName(InvokeDynamicSample.decrypt(cn)), InvokeDynamicSample.decrypt(mn), mds).asType(methodType)); + } + return new ConstantCallSite(l.findStatic(Class.forName(InvokeDynamicSample.decrypt(cn)), InvokeDynamicSample.decrypt(mn), mds).asType(methodType)); + } + catch (Exception exception) { + return null; + } + } + +}