?ejz}q+c1iS_H6=C2EgX*MNPzFH)50Bx}fcOd61=gykdg@S0
z4HVFWcA>9K$$|(;=zC2R$CP{()1_R3xU>W+|4P!Rr37U<%>b{hE!*r8f^o1l$1k=a{=n6bIDd$;HTsUV`a+;UI*eym_b0pUfvw
zik}KFG%+qh5&EVK1JWyDG(Z?Gn9o!>hN;6vXhT2MVt^MO_)N}?2Ri-q_LNbBTC@Tp
z1PBH|xf6x}3_rkdfhj!DMO51kw_O1qA`tXI2^>_5*v0^l
zpJ1<}w+$Si40``NhBilly)L_p0@~2IBQ%-ZgH487Mo0l#LQqu=3lIS}VF1ek3RIogB8_gJY{Hsbz-oMEtoKj5-T=4U`PTo
zd(40cCD_)}Y}mZ0ofaw3O#-^-WId%R0TzzGX^D`6GF#qL83hnRiV7rvVi*8cG6W7F
zdmj7Gj${R;ogsWGlYp*Bp8_1=87Q6SUxFJmf<&o6TXnC$EHSE)
zsDW4%8{&^<0h=If4q%!J?0}C!rwjw2Kn=EL0`in00{|2wd>1IA1qb#jH9`Xli^Tw@
z1Z)Iw5(l;+dLjv?0ow`e2O5MR&_Dwk?L5NhEhS@90}V%DQ%cc-8KghP(D49RRrDS&
z8Aaoyp=cZE)(e1)4q**tD@0*B0A7sEgt2}@2dZ6tg`wBz5OPq}A`Ce98k-TL<3$f9
z@emlG17|K|88+3Q%{ItFvCA;Z%#2{`#_@s;!ovX4iREW#PX>epRO`(driTH%pOmUk
z88s+zEe2d?L?}UR8Zbb!8H{zp1bRMX1fA|SVQ66{ggkV<83Sfou?c}MZD6g@jZw)2
zD!y+!mEi)LOyFJQ+k;`uKVq|DvJYei6<_vY=mKVhCX{*r1Hi{3TmWYn>`8D=OhB7}x?wiXkUL8>Wx*AEE^^
znZUmO%88(d$&vlx*SQeHfG`(A8YWF~mP+A5NWt_d|D)7lE>!;^V!)Ogp#VeB{SSq}
zwBs5#7~>u%4p7F2BMm6?AVgs^+-RhT*?zb3fC^Q7Xi69$o^o&Du)9^DB_4<#?=an+Eo6d%6krs|3UQ+s=a_ijxj7e2Wm~K|Ka;J{{|uw
z0Qn`2KfJC0SeF(pG-3ma1rWk8DZ@XA?-C9XKrD#hhs~IQm9@a(0q9X%NPj`lgNY5A
zq6Cy2acBTTI~;t}tV9Y7qJ$Q9{|T8;N%O<5x&B8H13p3s71(pP|0p70SO`Imeu02~
zed6YggXQDz^1rV~0EY7j256i&AblReh}K5GOsMt-?1T}NK+Jh?kS(JDID-fy2!O%!
z;50zuhZ3V1C8$pb3h03=!&MX)c>{+OGjT5ngJU-QCSW82&R%pP;PQ?C3
zxa{}m;Sd5A6ksL4fDrn&8YKny^KWqolT$&KOB7@eYXB8dgcfwA7L!tzC^(b!*PQ|!
zptj+!8*(ww;87DsrYZ(bVVu1fa9<1zpYjm{!Un;905?mdz%P`+wE+xmJ&XefgvAm3
zka>Vi98APl9Q0r^hLI9WAaDW2Nzk$nRDph-I;G`dc;Ksp=MCTpyD9;k+5#f3zL-0l1gb#TD9fLK_z5L<{$I2KlJE%+V|>;D0-*?yw{
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXWindow.java b/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXWindow.java
index 5989812..1cef591 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXWindow.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/annotation/FXWindow.java
@@ -1,5 +1,7 @@
package cn.edu.scau.biubiusuisui.annotation;
+import javafx.stage.StageStyle;
+
import java.lang.annotation.*;
/**
@@ -12,5 +14,11 @@ import java.lang.annotation.*;
public @interface FXWindow {
double preWidth() default 0.0;
double preHeight()default 0.0;
+ double minWidth() default 0.0;
+ double minHeight() default 0.0;
+ boolean fix() default false;
+ boolean dragable() default false;
+
+ StageStyle style() default StageStyle.DECORATED;
String title () ;
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java b/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java
index 221a2e8..64c3f37 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/entity/FXBaseController.java
@@ -5,6 +5,7 @@ import cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus;
import javafx.fxml.Initializable;
import javafx.scene.layout.Pane;
import cn.edu.scau.biubiusuisui.utils.StringUtils;
+import javafx.stage.Stage;
import java.io.IOException;
import java.lang.annotation.Annotation;
@@ -29,6 +30,9 @@ public class FXBaseController extends Pane {
protected String name = "";
+
+ private Stage stage;
+
private boolean isController = false;
private boolean isWindows = false;
@@ -94,4 +98,12 @@ public class FXBaseController extends Pane {
public void setWindows(boolean windows) {
isWindows = windows;
}
+
+ public Stage getStage() {
+ return stage;
+ }
+
+ public void setStage(Stage stage) {
+ this.stage = stage;
+ }
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXFieldViewFieldMapping.java b/src/main/java/cn/edu/scau/biubiusuisui/entity/FXFieldViewFieldMapping.java
deleted file mode 100644
index 886dd3f..0000000
--- a/src/main/java/cn/edu/scau/biubiusuisui/entity/FXFieldViewFieldMapping.java
+++ /dev/null
@@ -1,33 +0,0 @@
-package cn.edu.scau.biubiusuisui.entity;
-
-import javafx.beans.property.Property;
-import javafx.beans.value.ObservableValue;
-
-import java.lang.reflect.Method;
-
-/**
- * @Author jack
- * @Date:2019/6/28 10:03
- */
-public class FXFieldViewFieldMapping {
-
- private boolean readOnly;
- private Class type;
-
-
- public boolean isReadOnly() {
- return readOnly;
- }
-
- public void setReadOnly(boolean readOnly) {
- this.readOnly = readOnly;
- }
-
- public Class getType() {
- return type;
- }
-
- public void setType(Class type) {
- this.type = type;
- }
-}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java b/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java
index bd52d44..eda6a19 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/Demo.java
@@ -10,6 +10,7 @@ import javafx.stage.Stage;
* @Date:2019/6/25 7:05
*/
@FXScan(base = {"cn.edu.scau.biubiusuisui.example"})
+//项目目录中带有中文字符会导致无法启动
public class Demo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java b/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java
index bb05cc2..47e18ad 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/example/MainController.java
@@ -10,6 +10,7 @@ import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ListView;
+import javafx.stage.StageStyle;
import java.net.URL;
import java.util.ResourceBundle;
@@ -19,7 +20,7 @@ import java.util.ResourceBundle;
* @Date:2019/6/25 1:47
*/
@FXController(path = "Main.fxml")
-@FXWindow(title = "demo1")
+@FXWindow(title = "demo1",dragable = true,fix = true,style = StageStyle.UNDECORATED)
public class MainController extends FXBaseController{
@FXML
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java
index a24ca06..a1f05ea 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXEntityFactory.java
@@ -1,7 +1,7 @@
package cn.edu.scau.biubiusuisui.factory;
import cn.edu.scau.biubiusuisui.annotation.FXField;
-import cn.edu.scau.biubiusuisui.entity.FXFieldViewFieldMapping;
+import cn.edu.scau.biubiusuisui.entity.FXFieldPropertyMapping;
import cn.edu.scau.biubiusuisui.entity.FXPlusContext;
import cn.edu.scau.biubiusuisui.proxy.classProxy.FXEntityProxy;
import cn.edu.scau.biubiusuisui.utils.ClassUtils;
@@ -50,7 +50,7 @@ public class FXEntityFactory {
public static void processFXEntityProxy(Object entity, Object proxy,FXEntityProxy fxEntityProxy) throws IllegalAccessException {
Map stringPropertyMap = new HashMap<>();
- Map stringFXFieldMethodMappingMap = new HashMap<>();
+ Map fxFieldPropertyMappingHashMap = new HashMap<>();
Field []fields = entity.getClass().getDeclaredFields();
for(Field field:fields){
Annotation annotation = ClassUtils.getAnnotationInList( FXField.class,field.getDeclaredAnnotations());
@@ -59,10 +59,11 @@ public class FXEntityFactory {
field.setAccessible(true);
FXField fxField = (FXField)annotation;
- FXFieldViewFieldMapping fieldMethodMapping = new FXFieldViewFieldMapping();
- fieldMethodMapping.setReadOnly(fxField.readOnly());
- fieldMethodMapping.setType(field.getType());
- stringFXFieldMethodMappingMap.put(field.getName(), fieldMethodMapping);
+ FXFieldPropertyMapping fieldPropertyMapping = new FXFieldPropertyMapping();
+ fieldPropertyMapping.setReadOnly(fxField.readOnly());
+ fieldPropertyMapping.setType(field.getType());
+
+ fxFieldPropertyMappingHashMap.put(field.getName(), fieldPropertyMapping);
if(field.get(entity) == null){
property = getFieldDefalutProperty(field);
@@ -88,7 +89,7 @@ public class FXEntityFactory {
}
}
fxEntityProxy.setStringPropertyMap(stringPropertyMap);
- fxEntityProxy.setStringFXFieldMethodMappingMap(stringFXFieldMethodMappingMap);
+ fxEntityProxy.setFxFieldPropertyMappingMap(fxFieldPropertyMappingHashMap);
}
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java
index b6986f6..2b684b6 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/factory/FXFactory.java
@@ -5,6 +5,9 @@ import cn.edu.scau.biubiusuisui.annotation.FXWindow;
import cn.edu.scau.biubiusuisui.config.FXMLLoaderPlus;
import cn.edu.scau.biubiusuisui.entity.FXBaseController;
import cn.edu.scau.biubiusuisui.entity.FXPlusContext;
+import cn.edu.scau.biubiusuisui.function.DragWindowHandlerImpl;
+import cn.edu.scau.biubiusuisui.parser.WindowAnnotationParser;
+import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
@@ -21,10 +24,10 @@ import java.net.URL;
*/
public class FXFactory {
-
+ private static WindowAnnotationParser windowAnnotationParser = new WindowAnnotationParser();;
private FXFactory() {
- }
+ }
public static void loadFXController(Class clazz) {
getFXController(clazz, "");
@@ -105,11 +108,13 @@ public class FXFactory {
register(fxBaseController, fxControllerProxy);
if (isWindow) {
Stage stage = new Stage();
- double preWidth = fxWindow.preWidth() == 0 ? parent.getPrefWidth() : fxWindow.preWidth();
- double preHeight = fxWindow.preHeight() == 0 ? parent.getPrefWidth() : fxWindow.preHeight();
+ fxControllerProxy.setStage(stage);
+ fxBaseController.setStage(stage);
+ double preWidth = fxWindow.preWidth() == 0 ? fxControllerProxy.getPrefWidth() : fxWindow.preWidth();
+ double preHeight = fxWindow.preHeight() == 0 ? fxControllerProxy.getPrefWidth() : fxWindow.preHeight();
Scene scene = new Scene(fxControllerProxy, preWidth, preHeight);
stage.setScene(scene);
- stage.setTitle(fxWindow.title());
+ windowAnnotationParser.parse(stage, fxControllerProxy, fxWindow);
stage.show();
}
return fxControllerProxy;
diff --git a/src/main/java/cn/edu/scau/biubiusuisui/proxy/classProxy/FXEntityProxy.java b/src/main/java/cn/edu/scau/biubiusuisui/proxy/classProxy/FXEntityProxy.java
index 840d200..3c6b87e 100644
--- a/src/main/java/cn/edu/scau/biubiusuisui/proxy/classProxy/FXEntityProxy.java
+++ b/src/main/java/cn/edu/scau/biubiusuisui/proxy/classProxy/FXEntityProxy.java
@@ -1,6 +1,6 @@
package cn.edu.scau.biubiusuisui.proxy.classProxy;
-import cn.edu.scau.biubiusuisui.entity.FXFieldViewFieldMapping;
+import cn.edu.scau.biubiusuisui.entity.FXFieldPropertyMapping;
import cn.edu.scau.biubiusuisui.utils.StringUtils;
import javafx.beans.property.*;
import net.sf.cglib.proxy.Enhancer;
@@ -19,7 +19,7 @@ public class FXEntityProxy implements MethodInterceptor {
Object target;
private Map stringPropertyMap;
- private Map stringFXFieldMethodMappingMap;
+ private Map fxFieldPropertyMappingMap;
public Object getInstance(Object target) {
this.target = target;
@@ -50,13 +50,13 @@ public class FXEntityProxy implements MethodInterceptor {
} else {
return o1;
}
- FXFieldViewFieldMapping fieldMethodMapping = stringFXFieldMethodMappingMap.get(fieldName);
+ FXFieldPropertyMapping fxFieldPropertyMapping = fxFieldPropertyMappingMap.get(fieldName);
Property property = stringPropertyMap.get(fieldName);
- if(fieldMethodMapping == null || property == null){
+ if(fxFieldPropertyMapping == null || property == null){
return o1;
}
- Class type = fieldMethodMapping.getType();
+ Class type = fxFieldPropertyMapping.getType();
if (methodName.startsWith("set")) {
if(Boolean.class.equals(type)){
((SimpleBooleanProperty)property).set((Boolean)objects[0]);
@@ -75,6 +75,8 @@ public class FXEntityProxy implements MethodInterceptor {
((SimpleListProperty)(property)).add(objects[0]);
}else if(methodName.startsWith("del")){
((SimpleListProperty)(property)).remove(objects[0]);
+ }else if(methodName.startsWith("cls")){
+ ((SimpleListProperty)(property)).clear();
}
//修改
@@ -101,11 +103,11 @@ public class FXEntityProxy implements MethodInterceptor {
this.stringPropertyMap = stringPropertyMap;
}
- public Map getStringFXFieldMethodMappingMap() {
- return stringFXFieldMethodMappingMap;
+ public Map getFxFieldPropertyMappingMap() {
+ return fxFieldPropertyMappingMap;
}
- public void setStringFXFieldMethodMappingMap(Map stringFXFieldMethodMappingMap) {
- this.stringFXFieldMethodMappingMap = stringFXFieldMethodMappingMap;
+ public void setFxFieldPropertyMappingMap(Map fxFieldPropertyMappingMap) {
+ this.fxFieldPropertyMappingMap = fxFieldPropertyMappingMap;
}
}
diff --git a/target/classes/Main.fxml b/target/classes/Main.fxml
index e71a680..d11c5e3 100644
--- a/target/classes/Main.fxml
+++ b/target/classes/Main.fxml
@@ -6,8 +6,8 @@
-
-
-
+
+
+
diff --git a/target/classes/cn/edu/scau/biubiusuisui/annotation/FXWindow.class b/target/classes/cn/edu/scau/biubiusuisui/annotation/FXWindow.class
index aea4606629d9b106aaa8713340a9df84c638d651..9a7b31feecd383b4a3bb83500942f65440d5b9f7 100644
GIT binary patch
delta 304
zcmdnXGL=pE)W2Q(7#J8#7*yC96xkV+*cp^33ft6kIZ|!
zV34FWBZDL!IZhW>Xa69_5LcItzS9^PIVL}0RIg_R+QJ63i`j*NorRHsn*mLLhk+NS
zB8q_zsDd9|K!8CIs)99@L5M*Zs78cA6lf$9gBX|;XOIBW@(j!jl0b!0sSMH#G7PdH
RW;6pAV=99jP)>n?0RR^HG=u;E
delta 88
zcmbQrwwFct)W2Q(7#J8#7^K)4#Mv1n*cl`z3fpYFFoltkd2%X~x)C=}mWhD}O!6}D
k0cm*#W(Ix+Mh1aY20;cP24N60nt?HuL4-k+L5zU`0NJn$%m4rY
diff --git a/target/classes/cn/edu/scau/biubiusuisui/entity/FXBaseController.class b/target/classes/cn/edu/scau/biubiusuisui/entity/FXBaseController.class
index b288fb8f2ee86d6cafb9463fcd4163ebf72f41d9..c5f6c7790666146b31bd7386fa0118868f1e0a15 100644
GIT binary patch
delta 1456
zcmaiz-B*-V6o;QP!_0w~Q(j0jVv3at3@AfFg`iVtL>LJPenJ@`B50xw8hzN5-yc!9
z=5MHrYPE6|H(hkwTKz?>F3R6IgEF#UwPw~n?>T4h{d@M_?|UtMv$pWpzrX(hv~xdV
z3xk!sQ$-zzyczOlIN~rzB93ybn&X_XjQEpL%e(&Yy=tmB8Sy@25!HO)&A2zGyqU0^
zj#$rR#2H4t|5U^@XD#OA7s!XNUahgCGAiPswq_(jgMb6brHIy_J&_v*F&5YRs$>*JY^8KlVvCuI7?CQZ(^~
z)&^P(IG*Eq$2PV*>e+6|J7&3Lx$O9uIm;)GPq}1hEiS}si_gT;3CCxAUYw7&4P4<1
zM}cn3myWNv>S*Aa<2pASJ>J~pmSMdwFFQ4p?HlNs8=tr^J2i9Oahn#)9micCe$VkW
z^Tl-)n`*w{TZ7r^SfJbS0$U$R=S=$7>5A`SZFQO>ROlykJ;l6NSXD(>RftxH5l^FR
zrr2qldzy5%k)&*+Vz&^f>UAo*h77ed(X5-4vU#r^?9}R?yoP|3sU>9k!G2%xnGPuq
z`8}Cwr!ur?%&mIiUSvPJ=%bB;+7I&zBXp2wH*<7yg*{y5Rc^4CTjWzCe%@VY_s*
zib?7wp**{!k{4r}ZsMrp^Gkp!&FCdw7FZoK66g^AZeg{P_)o-1OQ)sFvPXYop#E=v
z(Mm(-sY35%D!2WeWKpNvx_8F);lheQ)`g)Es-41Xf(1FB%6O(K{B~2
gNxx=V3hpaw{UV!JlAIOExiv`qck6p{Fh~wO1i-eezyJUM
delta 1220
zcmaiyT~m~07{`D2vb#4t+~rJ=fQ2Ei%96Vk7)WiY385G$s2D1&WdsQlm{~zvDN-|a
z^n8S7I;sOEJaHV)nr1xdJM<-TJShM7^Q=gYjx)R0{dWCduIqZP*IlhC-ud_DZJ?7M
z0=6?y&Y=qGIqbur4@UytV<=#lqm>+E#4_q{j$2On%afH!_u;e;XM8wo
znFy$2GN8b5pMNgk13t8z52$4zpre+L%9-+~k1f-d8AEceFniwc+~7>%av^)6FgKMQ
zxwJ4nH?{WHpXM3mj9R*+FY@r`#Ie>#(?7`8XP-lbTrXu`NVO7S<9T`BJ-9{
z9Sh7Fa$!RvSMFHkl3}+Fb>Tne`BukgTy}g;-g3q91z$Rv`O2}xvSYswUsDW^CTpv{
zA!GU0@tx1T>bS;AxRiWx%XL-_rpfU=`B`Gip|1o*Lwq7lv%BuI$GJOm#t#)S-WW0>UW-7`od%)rsncrik|71
za0v5%rd?ua7k7u||1t;I%>Y?Vw}Vk$V_dh3ba90}EYq!0ds(4}Rrc~D`N%avK3f3k2dt|GV)PJ;*w!CiXw)E&{G|tw$
z{vk(l)5BhjrT3o13~$6miXo%F0GKs}gt&+jP)$3x>EPnmk`Ke1vhN%Hcg0}To@c#L
z`jppCjhf(_8)JG)81J(TQzO`0PnR9s#9%g5-;T#Cro2r0(WTon;cr1jioIounRhGX7X62REFA>y_1AerU1sgp?x-mMMsqZjF1RJ&5=E
zM#qfTT-MxERuF8I3&nh;nyVKJk_jdyV~ji9YtypsBqfd{WsU?hc2J4hkIG1_B01(n
zr7EdWmqduFG$f}qRn8>mv;=WifBjOvJtAU1`*PlS0xa0SzNR001`$@WSJTNr4DyiYNL8=h};$=x@tCdsYk>3Py@C6GeusV5*q$BA6={yc(3keUpv+n8vaG
vi?yS9;uQ2sGX^OJa|ROz3kC-U
pO9od4D+Uh+YX(0C8-`E@JBBz0dxk6qhspQE>T4riaif?L3Mt+KKVnIP>UOFR#<>dK{Qj`5z_&CEdQ_I~zDki70
zOqVJyDFVv7MSw+6^h_3G?P83XypYusp=I+YR#j$3^T`VsB~i`V?9SQFF0N3VS`v(D
z;O2({xh#@e3<3<=3}OsA4AKnx3~~&*4Dt+m49W}!o6|*I8Fft=I2gk{1|K*LK*BC;((%A433j;ipeutZ2l>x%nATmfkS=(
diff --git a/target/classes/cn/edu/scau/biubiusuisui/factory/FXFactory.class b/target/classes/cn/edu/scau/biubiusuisui/factory/FXFactory.class
index e0afa458864024fcf4845dd9cf78719c64715ac9..8413b9d2582ee1358330af4f491dba33d4975e3b 100644
GIT binary patch
delta 2076
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
delta 1836
zcmaiz=X+FD5XOIZH`%j$xCU4rQb?90fCLB_0w^UALkv-xpphbdA)62kDI@|Gj2%S{
z;I)7S!9uX0U|>-c1RDsb*em~mkACp+oANm4-jJ*ax@FGHIq%H8GiT1Rye)YxC(a%`
z42(xVSS)b12PTJR*TmMifc8JEzP{9O)xW?NW1XXc
zL0w2^VbZdQWDzDCq-w<;3q5J=vRFfNO?_RHVsHDIq#f3Poa$I}#eZ{HC>E268T1+~$->Vnex`r25u&gLYioK3;u!B6?jrj^f~#rZ=ImKNsB60e*
zu{)fdc$(v$X2;2m)31$<;r@xI1KiX8aW0KBu#HCNboWSBML53$Gugx+>SFTa3~OVI
z6Y7yUI4dI%E{xNAD`5jDke^`UjF^*=yhn=jW6EDm#EJE2Y?;Y*ZpjT^3Fk_-Dwrxa
zW0|s;#&jvwXxB2sv_>@Jmqf^#!u5hnrn^-}1vkhggsq9p5=}AQN@F&22r|u5%;iQx
zEa7+NF<)+Ufv_0Zf_;|3iiL_r^7H*=jKzv2zCXE45sk>FPi8tx1)L;wmdU@8n8*^@
z=^BK6_)Kj+w>EDOW?gU)s;KU8E*7-UOh;fy{(gL2bEHkNLN-~5mWr0@+JSSekrK_&
znh{)1jS1%DhO-MzQ@z9s6TDJ7y;4{qO)*|KQ7aKkoW^i!OP5#l0(8CSuu^>Ls5d^6
zW2UTzpUb+ZVeMV0$2umgs}k}jvi6=>gLrtaBfyyX6iIL|O`~Y5JZb_-Y;DT~VFXz0ziw`aEVUg<0K2n0b#qk=b}AbP~H+wAB*F$C|$Zta?YS